Server : LiteSpeed
System : Linux server51.dnsbootclub.com 4.18.0-553.62.1.lve.el8.x86_64 #1 SMP Mon Jul 21 17:50:35 UTC 2025 x86_64
User : nandedex ( 1060)
PHP Version : 8.1.33
Disable Function : NONE
Directory :  /home/nandedex/www/s.nandedexpress.com/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]


Current File : /home/nandedex/www/s.nandedexpress.com/lib.tar
htmlpurifier/VERSION000064400000000006151214231100010310 0ustar004.13.1htmlpurifier/library/HTMLPurifier/EntityParser.php000064400000023374151214231100016335 0ustar00<?php

// if want to implement error collecting here, we'll need to use some sort
// of global data (probably trigger_error) because it's impossible to pass
// $config or $context to the callback functions.

/**
 * Handles referencing and derefencing character entities
 */
class HTMLPurifier_EntityParser
{

    /**
     * Reference to entity lookup table.
     * @type HTMLPurifier_EntityLookup
     */
    protected $_entity_lookup;

    /**
     * Callback regex string for entities in text.
     * @type string
     */
    protected $_textEntitiesRegex;

    /**
     * Callback regex string for entities in attributes.
     * @type string
     */
    protected $_attrEntitiesRegex;

    /**
     * Tests if the beginning of a string is a semi-optional regex
     */
    protected $_semiOptionalPrefixRegex;

    public function __construct() {
        // From
        // http://stackoverflow.com/questions/15532252/why-is-reg-being-rendered-as-without-the-bounding-semicolon
        $semi_optional = "quot|QUOT|lt|LT|gt|GT|amp|AMP|AElig|Aacute|Acirc|Agrave|Aring|Atilde|Auml|COPY|Ccedil|ETH|Eacute|Ecirc|Egrave|Euml|Iacute|Icirc|Igrave|Iuml|Ntilde|Oacute|Ocirc|Ograve|Oslash|Otilde|Ouml|REG|THORN|Uacute|Ucirc|Ugrave|Uuml|Yacute|aacute|acirc|acute|aelig|agrave|aring|atilde|auml|brvbar|ccedil|cedil|cent|copy|curren|deg|divide|eacute|ecirc|egrave|eth|euml|frac12|frac14|frac34|iacute|icirc|iexcl|igrave|iquest|iuml|laquo|macr|micro|middot|nbsp|not|ntilde|oacute|ocirc|ograve|ordf|ordm|oslash|otilde|ouml|para|plusmn|pound|raquo|reg|sect|shy|sup1|sup2|sup3|szlig|thorn|times|uacute|ucirc|ugrave|uml|uuml|yacute|yen|yuml";

        // NB: three empty captures to put the fourth match in the right
        // place
        $this->_semiOptionalPrefixRegex = "/&()()()($semi_optional)/";

        $this->_textEntitiesRegex =
            '/&(?:'.
            // hex
            '[#]x([a-fA-F0-9]+);?|'.
            // dec
            '[#]0*(\d+);?|'.
            // string (mandatory semicolon)
            // NB: order matters: match semicolon preferentially
            '([A-Za-z_:][A-Za-z0-9.\-_:]*);|'.
            // string (optional semicolon)
            "($semi_optional)".
            ')/';

        $this->_attrEntitiesRegex =
            '/&(?:'.
            // hex
            '[#]x([a-fA-F0-9]+);?|'.
            // dec
            '[#]0*(\d+);?|'.
            // string (mandatory semicolon)
            // NB: order matters: match semicolon preferentially
            '([A-Za-z_:][A-Za-z0-9.\-_:]*);|'.
            // string (optional semicolon)
            // don't match if trailing is equals or alphanumeric (URL
            // like)
            "($semi_optional)(?![=;A-Za-z0-9])".
            ')/';

    }

    /**
     * Substitute entities with the parsed equivalents.  Use this on
     * textual data in an HTML document (as opposed to attributes.)
     *
     * @param string $string String to have entities parsed.
     * @return string Parsed string.
     */
    public function substituteTextEntities($string)
    {
        return preg_replace_callback(
            $this->_textEntitiesRegex,
            array($this, 'entityCallback'),
            $string
        );
    }

    /**
     * Substitute entities with the parsed equivalents.  Use this on
     * attribute contents in documents.
     *
     * @param string $string String to have entities parsed.
     * @return string Parsed string.
     */
    public function substituteAttrEntities($string)
    {
        return preg_replace_callback(
            $this->_attrEntitiesRegex,
            array($this, 'entityCallback'),
            $string
        );
    }

    /**
     * Callback function for substituteNonSpecialEntities() that does the work.
     *
     * @param array $matches  PCRE matches array, with 0 the entire match, and
     *                  either index 1, 2 or 3 set with a hex value, dec value,
     *                  or string (respectively).
     * @return string Replacement string.
     */

    protected function entityCallback($matches)
    {
        $entity = $matches[0];
        $hex_part = @$matches[1];
        $dec_part = @$matches[2];
        $named_part = empty($matches[3]) ? (empty($matches[4]) ? "" : $matches[4]) : $matches[3];
        if ($hex_part !== NULL && $hex_part !== "") {
            return HTMLPurifier_Encoder::unichr(hexdec($hex_part));
        } elseif ($dec_part !== NULL && $dec_part !== "") {
            return HTMLPurifier_Encoder::unichr((int) $dec_part);
        } else {
            if (!$this->_entity_lookup) {
                $this->_entity_lookup = HTMLPurifier_EntityLookup::instance();
            }
            if (isset($this->_entity_lookup->table[$named_part])) {
                return $this->_entity_lookup->table[$named_part];
            } else {
                // exact match didn't match anything, so test if
                // any of the semicolon optional match the prefix.
                // Test that this is an EXACT match is important to
                // prevent infinite loop
                if (!empty($matches[3])) {
                    return preg_replace_callback(
                        $this->_semiOptionalPrefixRegex,
                        array($this, 'entityCallback'),
                        $entity
                    );
                }
                return $entity;
            }
        }
    }

    // LEGACY CODE BELOW

    /**
     * Callback regex string for parsing entities.
     * @type string
     */
    protected $_substituteEntitiesRegex =
        '/&(?:[#]x([a-fA-F0-9]+)|[#]0*(\d+)|([A-Za-z_:][A-Za-z0-9.\-_:]*));?/';
        //     1. hex             2. dec      3. string (XML style)

    /**
     * Decimal to parsed string conversion table for special entities.
     * @type array
     */
    protected $_special_dec2str =
            array(
                    34 => '"',
                    38 => '&',
                    39 => "'",
                    60 => '<',
                    62 => '>'
            );

    /**
     * Stripped entity names to decimal conversion table for special entities.
     * @type array
     */
    protected $_special_ent2dec =
            array(
                    'quot' => 34,
                    'amp'  => 38,
                    'lt'   => 60,
                    'gt'   => 62
            );

    /**
     * Substitutes non-special entities with their parsed equivalents. Since
     * running this whenever you have parsed character is t3h 5uck, we run
     * it before everything else.
     *
     * @param string $string String to have non-special entities parsed.
     * @return string Parsed string.
     */
    public function substituteNonSpecialEntities($string)
    {
        // it will try to detect missing semicolons, but don't rely on it
        return preg_replace_callback(
            $this->_substituteEntitiesRegex,
            array($this, 'nonSpecialEntityCallback'),
            $string
        );
    }

    /**
     * Callback function for substituteNonSpecialEntities() that does the work.
     *
     * @param array $matches  PCRE matches array, with 0 the entire match, and
     *                  either index 1, 2 or 3 set with a hex value, dec value,
     *                  or string (respectively).
     * @return string Replacement string.
     */

    protected function nonSpecialEntityCallback($matches)
    {
        // replaces all but big five
        $entity = $matches[0];
        $is_num = (@$matches[0][1] === '#');
        if ($is_num) {
            $is_hex = (@$entity[2] === 'x');
            $code = $is_hex ? hexdec($matches[1]) : (int) $matches[2];
            // abort for special characters
            if (isset($this->_special_dec2str[$code])) {
                return $entity;
            }
            return HTMLPurifier_Encoder::unichr($code);
        } else {
            if (isset($this->_special_ent2dec[$matches[3]])) {
                return $entity;
            }
            if (!$this->_entity_lookup) {
                $this->_entity_lookup = HTMLPurifier_EntityLookup::instance();
            }
            if (isset($this->_entity_lookup->table[$matches[3]])) {
                return $this->_entity_lookup->table[$matches[3]];
            } else {
                return $entity;
            }
        }
    }

    /**
     * Substitutes only special entities with their parsed equivalents.
     *
     * @notice We try to avoid calling this function because otherwise, it
     * would have to be called a lot (for every parsed section).
     *
     * @param string $string String to have non-special entities parsed.
     * @return string Parsed string.
     */
    public function substituteSpecialEntities($string)
    {
        return preg_replace_callback(
            $this->_substituteEntitiesRegex,
            array($this, 'specialEntityCallback'),
            $string
        );
    }

    /**
     * Callback function for substituteSpecialEntities() that does the work.
     *
     * This callback has same syntax as nonSpecialEntityCallback().
     *
     * @param array $matches  PCRE-style matches array, with 0 the entire match, and
     *                  either index 1, 2 or 3 set with a hex value, dec value,
     *                  or string (respectively).
     * @return string Replacement string.
     */
    protected function specialEntityCallback($matches)
    {
        $entity = $matches[0];
        $is_num = (@$matches[0][1] === '#');
        if ($is_num) {
            $is_hex = (@$entity[2] === 'x');
            $int = $is_hex ? hexdec($matches[1]) : (int) $matches[2];
            return isset($this->_special_dec2str[$int]) ?
                $this->_special_dec2str[$int] :
                $entity;
        } else {
            return isset($this->_special_ent2dec[$matches[3]]) ?
                $this->_special_dec2str[$this->_special_ent2dec[$matches[3]]] :
                $entity;
        }
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ErrorStruct.php000064400000003545151214231100016200 0ustar00<?php

/**
 * Records errors for particular segments of an HTML document such as tokens,
 * attributes or CSS properties. They can contain error structs (which apply
 * to components of what they represent), but their main purpose is to hold
 * errors applying to whatever struct is being used.
 */
class HTMLPurifier_ErrorStruct
{

    /**
     * Possible values for $children first-key. Note that top-level structures
     * are automatically token-level.
     */
    const TOKEN     = 0;
    const ATTR      = 1;
    const CSSPROP   = 2;

    /**
     * Type of this struct.
     * @type string
     */
    public $type;

    /**
     * Value of the struct we are recording errors for. There are various
     * values for this:
     *  - TOKEN: Instance of HTMLPurifier_Token
     *  - ATTR: array('attr-name', 'value')
     *  - CSSPROP: array('prop-name', 'value')
     * @type mixed
     */
    public $value;

    /**
     * Errors registered for this structure.
     * @type array
     */
    public $errors = array();

    /**
     * Child ErrorStructs that are from this structure. For example, a TOKEN
     * ErrorStruct would contain ATTR ErrorStructs. This is a multi-dimensional
     * array in structure: [TYPE]['identifier']
     * @type array
     */
    public $children = array();

    /**
     * @param string $type
     * @param string $id
     * @return mixed
     */
    public function getChild($type, $id)
    {
        if (!isset($this->children[$type][$id])) {
            $this->children[$type][$id] = new HTMLPurifier_ErrorStruct();
            $this->children[$type][$id]->type = $type;
        }
        return $this->children[$type][$id];
    }

    /**
     * @param int $severity
     * @param string $message
     */
    public function addError($severity, $message)
    {
        $this->errors[] = array($severity, $message);
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/CSSDefinition.php000064400000045175151214231100016350 0ustar00<?php

/**
 * Defines allowed CSS attributes and what their values are.
 * @see HTMLPurifier_HTMLDefinition
 */
class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
{

    public $type = 'CSS';

    /**
     * Assoc array of attribute name to definition object.
     * @type HTMLPurifier_AttrDef[]
     */
    public $info = array();

    /**
     * Constructs the info array.  The meat of this class.
     * @param HTMLPurifier_Config $config
     */
    protected function doSetup($config)
    {
        $this->info['text-align'] = new HTMLPurifier_AttrDef_Enum(
            array('left', 'right', 'center', 'justify'),
            false
        );

        $border_style =
            $this->info['border-bottom-style'] =
            $this->info['border-right-style'] =
            $this->info['border-left-style'] =
            $this->info['border-top-style'] = new HTMLPurifier_AttrDef_Enum(
                array(
                    'none',
                    'hidden',
                    'dotted',
                    'dashed',
                    'solid',
                    'double',
                    'groove',
                    'ridge',
                    'inset',
                    'outset'
                ),
                false
            );

        $this->info['border-style'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_style);

        $this->info['clear'] = new HTMLPurifier_AttrDef_Enum(
            array('none', 'left', 'right', 'both'),
            false
        );
        $this->info['float'] = new HTMLPurifier_AttrDef_Enum(
            array('none', 'left', 'right'),
            false
        );
        $this->info['font-style'] = new HTMLPurifier_AttrDef_Enum(
            array('normal', 'italic', 'oblique'),
            false
        );
        $this->info['font-variant'] = new HTMLPurifier_AttrDef_Enum(
            array('normal', 'small-caps'),
            false
        );

        $uri_or_none = new HTMLPurifier_AttrDef_CSS_Composite(
            array(
                new HTMLPurifier_AttrDef_Enum(array('none')),
                new HTMLPurifier_AttrDef_CSS_URI()
            )
        );

        $this->info['list-style-position'] = new HTMLPurifier_AttrDef_Enum(
            array('inside', 'outside'),
            false
        );
        $this->info['list-style-type'] = new HTMLPurifier_AttrDef_Enum(
            array(
                'disc',
                'circle',
                'square',
                'decimal',
                'lower-roman',
                'upper-roman',
                'lower-alpha',
                'upper-alpha',
                'none'
            ),
            false
        );
        $this->info['list-style-image'] = $uri_or_none;

        $this->info['list-style'] = new HTMLPurifier_AttrDef_CSS_ListStyle($config);

        $this->info['text-transform'] = new HTMLPurifier_AttrDef_Enum(
            array('capitalize', 'uppercase', 'lowercase', 'none'),
            false
        );
        $this->info['color'] = new HTMLPurifier_AttrDef_CSS_Color();

        $this->info['background-image'] = $uri_or_none;
        $this->info['background-repeat'] = new HTMLPurifier_AttrDef_Enum(
            array('repeat', 'repeat-x', 'repeat-y', 'no-repeat')
        );
        $this->info['background-attachment'] = new HTMLPurifier_AttrDef_Enum(
            array('scroll', 'fixed')
        );
        $this->info['background-position'] = new HTMLPurifier_AttrDef_CSS_BackgroundPosition();

        $border_color =
            $this->info['border-top-color'] =
            $this->info['border-bottom-color'] =
            $this->info['border-left-color'] =
            $this->info['border-right-color'] =
            $this->info['background-color'] = new HTMLPurifier_AttrDef_CSS_Composite(
                array(
                    new HTMLPurifier_AttrDef_Enum(array('transparent')),
                    new HTMLPurifier_AttrDef_CSS_Color()
                )
            );

        $this->info['background'] = new HTMLPurifier_AttrDef_CSS_Background($config);

        $this->info['border-color'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_color);

        $border_width =
            $this->info['border-top-width'] =
            $this->info['border-bottom-width'] =
            $this->info['border-left-width'] =
            $this->info['border-right-width'] = new HTMLPurifier_AttrDef_CSS_Composite(
                array(
                    new HTMLPurifier_AttrDef_Enum(array('thin', 'medium', 'thick')),
                    new HTMLPurifier_AttrDef_CSS_Length('0') //disallow negative
                )
            );

        $this->info['border-width'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_width);

        $this->info['letter-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite(
            array(
                new HTMLPurifier_AttrDef_Enum(array('normal')),
                new HTMLPurifier_AttrDef_CSS_Length()
            )
        );

        $this->info['word-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite(
            array(
                new HTMLPurifier_AttrDef_Enum(array('normal')),
                new HTMLPurifier_AttrDef_CSS_Length()
            )
        );

        $this->info['font-size'] = new HTMLPurifier_AttrDef_CSS_Composite(
            array(
                new HTMLPurifier_AttrDef_Enum(
                    array(
                        'xx-small',
                        'x-small',
                        'small',
                        'medium',
                        'large',
                        'x-large',
                        'xx-large',
                        'larger',
                        'smaller'
                    )
                ),
                new HTMLPurifier_AttrDef_CSS_Percentage(),
                new HTMLPurifier_AttrDef_CSS_Length()
            )
        );

        $this->info['line-height'] = new HTMLPurifier_AttrDef_CSS_Composite(
            array(
                new HTMLPurifier_AttrDef_Enum(array('normal')),
                new HTMLPurifier_AttrDef_CSS_Number(true), // no negatives
                new HTMLPurifier_AttrDef_CSS_Length('0'),
                new HTMLPurifier_AttrDef_CSS_Percentage(true)
            )
        );

        $margin =
            $this->info['margin-top'] =
            $this->info['margin-bottom'] =
            $this->info['margin-left'] =
            $this->info['margin-right'] = new HTMLPurifier_AttrDef_CSS_Composite(
                array(
                    new HTMLPurifier_AttrDef_CSS_Length(),
                    new HTMLPurifier_AttrDef_CSS_Percentage(),
                    new HTMLPurifier_AttrDef_Enum(array('auto'))
                )
            );

        $this->info['margin'] = new HTMLPurifier_AttrDef_CSS_Multiple($margin);

        // non-negative
        $padding =
            $this->info['padding-top'] =
            $this->info['padding-bottom'] =
            $this->info['padding-left'] =
            $this->info['padding-right'] = new HTMLPurifier_AttrDef_CSS_Composite(
                array(
                    new HTMLPurifier_AttrDef_CSS_Length('0'),
                    new HTMLPurifier_AttrDef_CSS_Percentage(true)
                )
            );

        $this->info['padding'] = new HTMLPurifier_AttrDef_CSS_Multiple($padding);

        $this->info['text-indent'] = new HTMLPurifier_AttrDef_CSS_Composite(
            array(
                new HTMLPurifier_AttrDef_CSS_Length(),
                new HTMLPurifier_AttrDef_CSS_Percentage()
            )
        );

        $trusted_wh = new HTMLPurifier_AttrDef_CSS_Composite(
            array(
                new HTMLPurifier_AttrDef_CSS_Length('0'),
                new HTMLPurifier_AttrDef_CSS_Percentage(true),
                new HTMLPurifier_AttrDef_Enum(array('auto', 'initial', 'inherit'))
            )
        );
        $trusted_min_wh = new HTMLPurifier_AttrDef_CSS_Composite(
            array(
                new HTMLPurifier_AttrDef_CSS_Length('0'),
                new HTMLPurifier_AttrDef_CSS_Percentage(true),
                new HTMLPurifier_AttrDef_Enum(array('initial', 'inherit'))
            )
        );
        $trusted_max_wh = new HTMLPurifier_AttrDef_CSS_Composite(
            array(
                new HTMLPurifier_AttrDef_CSS_Length('0'),
                new HTMLPurifier_AttrDef_CSS_Percentage(true),
                new HTMLPurifier_AttrDef_Enum(array('none', 'initial', 'inherit'))
            )
        );
        $max = $config->get('CSS.MaxImgLength');

        $this->info['width'] =
        $this->info['height'] =
            $max === null ?
                $trusted_wh :
                new HTMLPurifier_AttrDef_Switch(
                    'img',
                    // For img tags:
                    new HTMLPurifier_AttrDef_CSS_Composite(
                        array(
                            new HTMLPurifier_AttrDef_CSS_Length('0', $max),
                            new HTMLPurifier_AttrDef_Enum(array('auto'))
                        )
                    ),
                    // For everyone else:
                    $trusted_wh
                );
        $this->info['min-width'] =
        $this->info['min-height'] =
            $max === null ?
                $trusted_min_wh :
                new HTMLPurifier_AttrDef_Switch(
                    'img',
                    // For img tags:
                    new HTMLPurifier_AttrDef_CSS_Composite(
                        array(
                            new HTMLPurifier_AttrDef_CSS_Length('0', $max),
                            new HTMLPurifier_AttrDef_Enum(array('initial', 'inherit'))
                        )
                    ),
                    // For everyone else:
                    $trusted_min_wh
                );
        $this->info['max-width'] =
        $this->info['max-height'] =
            $max === null ?
                $trusted_max_wh :
                new HTMLPurifier_AttrDef_Switch(
                    'img',
                    // For img tags:
                    new HTMLPurifier_AttrDef_CSS_Composite(
                        array(
                            new HTMLPurifier_AttrDef_CSS_Length('0', $max),
                            new HTMLPurifier_AttrDef_Enum(array('none', 'initial', 'inherit'))
                        )
                    ),
                    // For everyone else:
                    $trusted_max_wh
                );

        $this->info['text-decoration'] = new HTMLPurifier_AttrDef_CSS_TextDecoration();

        $this->info['font-family'] = new HTMLPurifier_AttrDef_CSS_FontFamily();

        // this could use specialized code
        $this->info['font-weight'] = new HTMLPurifier_AttrDef_Enum(
            array(
                'normal',
                'bold',
                'bolder',
                'lighter',
                '100',
                '200',
                '300',
                '400',
                '500',
                '600',
                '700',
                '800',
                '900'
            ),
            false
        );

        // MUST be called after other font properties, as it references
        // a CSSDefinition object
        $this->info['font'] = new HTMLPurifier_AttrDef_CSS_Font($config);

        // same here
        $this->info['border'] =
        $this->info['border-bottom'] =
        $this->info['border-top'] =
        $this->info['border-left'] =
        $this->info['border-right'] = new HTMLPurifier_AttrDef_CSS_Border($config);

        $this->info['border-collapse'] = new HTMLPurifier_AttrDef_Enum(
            array('collapse', 'separate')
        );

        $this->info['caption-side'] = new HTMLPurifier_AttrDef_Enum(
            array('top', 'bottom')
        );

        $this->info['table-layout'] = new HTMLPurifier_AttrDef_Enum(
            array('auto', 'fixed')
        );

        $this->info['vertical-align'] = new HTMLPurifier_AttrDef_CSS_Composite(
            array(
                new HTMLPurifier_AttrDef_Enum(
                    array(
                        'baseline',
                        'sub',
                        'super',
                        'top',
                        'text-top',
                        'middle',
                        'bottom',
                        'text-bottom'
                    )
                ),
                new HTMLPurifier_AttrDef_CSS_Length(),
                new HTMLPurifier_AttrDef_CSS_Percentage()
            )
        );

        $this->info['border-spacing'] = new HTMLPurifier_AttrDef_CSS_Multiple(new HTMLPurifier_AttrDef_CSS_Length(), 2);

        // These CSS properties don't work on many browsers, but we live
        // in THE FUTURE!
        $this->info['white-space'] = new HTMLPurifier_AttrDef_Enum(
            array('nowrap', 'normal', 'pre', 'pre-wrap', 'pre-line')
        );

        if ($config->get('CSS.Proprietary')) {
            $this->doSetupProprietary($config);
        }

        if ($config->get('CSS.AllowTricky')) {
            $this->doSetupTricky($config);
        }

        if ($config->get('CSS.Trusted')) {
            $this->doSetupTrusted($config);
        }

        $allow_important = $config->get('CSS.AllowImportant');
        // wrap all attr-defs with decorator that handles !important
        foreach ($this->info as $k => $v) {
            $this->info[$k] = new HTMLPurifier_AttrDef_CSS_ImportantDecorator($v, $allow_important);
        }

        $this->setupConfigStuff($config);
    }

    /**
     * @param HTMLPurifier_Config $config
     */
    protected function doSetupProprietary($config)
    {
        // Internet Explorer only scrollbar colors
        $this->info['scrollbar-arrow-color'] = new HTMLPurifier_AttrDef_CSS_Color();
        $this->info['scrollbar-base-color'] = new HTMLPurifier_AttrDef_CSS_Color();
        $this->info['scrollbar-darkshadow-color'] = new HTMLPurifier_AttrDef_CSS_Color();
        $this->info['scrollbar-face-color'] = new HTMLPurifier_AttrDef_CSS_Color();
        $this->info['scrollbar-highlight-color'] = new HTMLPurifier_AttrDef_CSS_Color();
        $this->info['scrollbar-shadow-color'] = new HTMLPurifier_AttrDef_CSS_Color();

        // vendor specific prefixes of opacity
        $this->info['-moz-opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue();
        $this->info['-khtml-opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue();

        // only opacity, for now
        $this->info['filter'] = new HTMLPurifier_AttrDef_CSS_Filter();

        // more CSS3
        $this->info['page-break-after'] =
        $this->info['page-break-before'] = new HTMLPurifier_AttrDef_Enum(
            array(
                'auto',
                'always',
                'avoid',
                'left',
                'right'
            )
        );
        $this->info['page-break-inside'] = new HTMLPurifier_AttrDef_Enum(array('auto', 'avoid'));

        $border_radius = new HTMLPurifier_AttrDef_CSS_Composite(
            array(
                new HTMLPurifier_AttrDef_CSS_Percentage(true), // disallow negative
                new HTMLPurifier_AttrDef_CSS_Length('0') // disallow negative
            ));

        $this->info['border-top-left-radius'] =
        $this->info['border-top-right-radius'] =
        $this->info['border-bottom-right-radius'] =
        $this->info['border-bottom-left-radius'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_radius, 2);
        // TODO: support SLASH syntax
        $this->info['border-radius'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_radius, 4);

    }

    /**
     * @param HTMLPurifier_Config $config
     */
    protected function doSetupTricky($config)
    {
        $this->info['display'] = new HTMLPurifier_AttrDef_Enum(
            array(
                'inline',
                'block',
                'list-item',
                'run-in',
                'compact',
                'marker',
                'table',
                'inline-block',
                'inline-table',
                'table-row-group',
                'table-header-group',
                'table-footer-group',
                'table-row',
                'table-column-group',
                'table-column',
                'table-cell',
                'table-caption',
                'none'
            )
        );
        $this->info['visibility'] = new HTMLPurifier_AttrDef_Enum(
            array('visible', 'hidden', 'collapse')
        );
        $this->info['overflow'] = new HTMLPurifier_AttrDef_Enum(array('visible', 'hidden', 'auto', 'scroll'));
        $this->info['opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue();
    }

    /**
     * @param HTMLPurifier_Config $config
     */
    protected function doSetupTrusted($config)
    {
        $this->info['position'] = new HTMLPurifier_AttrDef_Enum(
            array('static', 'relative', 'absolute', 'fixed')
        );
        $this->info['top'] =
        $this->info['left'] =
        $this->info['right'] =
        $this->info['bottom'] = new HTMLPurifier_AttrDef_CSS_Composite(
            array(
                new HTMLPurifier_AttrDef_CSS_Length(),
                new HTMLPurifier_AttrDef_CSS_Percentage(),
                new HTMLPurifier_AttrDef_Enum(array('auto')),
            )
        );
        $this->info['z-index'] = new HTMLPurifier_AttrDef_CSS_Composite(
            array(
                new HTMLPurifier_AttrDef_Integer(),
                new HTMLPurifier_AttrDef_Enum(array('auto')),
            )
        );
    }

    /**
     * Performs extra config-based processing. Based off of
     * HTMLPurifier_HTMLDefinition.
     * @param HTMLPurifier_Config $config
     * @todo Refactor duplicate elements into common class (probably using
     *       composition, not inheritance).
     */
    protected function setupConfigStuff($config)
    {
        // setup allowed elements
        $support = "(for information on implementing this, see the " .
            "support forums) ";
        $allowed_properties = $config->get('CSS.AllowedProperties');
        if ($allowed_properties !== null) {
            foreach ($this->info as $name => $d) {
                if (!isset($allowed_properties[$name])) {
                    unset($this->info[$name]);
                }
                unset($allowed_properties[$name]);
            }
            // emit errors
            foreach ($allowed_properties as $name => $d) {
                // :TODO: Is this htmlspecialchars() call really necessary?
                $name = htmlspecialchars($name);
                trigger_error("Style attribute '$name' is not supported $support", E_USER_WARNING);
            }
        }

        $forbidden_properties = $config->get('CSS.ForbiddenProperties');
        if ($forbidden_properties !== null) {
            foreach ($this->info as $name => $d) {
                if (isset($forbidden_properties[$name])) {
                    unset($this->info[$name]);
                }
            }
        }
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ChildDef.php000064400000003027151214231100015337 0ustar00<?php

/**
 * Defines allowed child nodes and validates nodes against it.
 */
abstract class HTMLPurifier_ChildDef
{
    /**
     * Type of child definition, usually right-most part of class name lowercase.
     * Used occasionally in terms of context.
     * @type string
     */
    public $type;

    /**
     * Indicates whether or not an empty array of children is okay.
     *
     * This is necessary for redundant checking when changes affecting
     * a child node may cause a parent node to now be disallowed.
     * @type bool
     */
    public $allow_empty;

    /**
     * Lookup array of all elements that this definition could possibly allow.
     * @type array
     */
    public $elements = array();

    /**
     * Get lookup of tag names that should not close this element automatically.
     * All other elements will do so.
     * @param HTMLPurifier_Config $config HTMLPurifier_Config object
     * @return array
     */
    public function getAllowedElements($config)
    {
        return $this->elements;
    }

    /**
     * Validates nodes according to definition and returns modification.
     *
     * @param HTMLPurifier_Node[] $children Array of HTMLPurifier_Node
     * @param HTMLPurifier_Config $config HTMLPurifier_Config object
     * @param HTMLPurifier_Context $context HTMLPurifier_Context object
     * @return bool|array true to leave nodes as is, false to remove parent node, array of replacement children
     */
    abstract public function validateChildren($children, $config, $context);
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/HTMLModuleManager.php000064400000037112151214231100017104 0ustar00<?php

class HTMLPurifier_HTMLModuleManager
{

    /**
     * @type HTMLPurifier_DoctypeRegistry
     */
    public $doctypes;

    /**
     * Instance of current doctype.
     * @type string
     */
    public $doctype;

    /**
     * @type HTMLPurifier_AttrTypes
     */
    public $attrTypes;

    /**
     * Active instances of modules for the specified doctype are
     * indexed, by name, in this array.
     * @type HTMLPurifier_HTMLModule[]
     */
    public $modules = array();

    /**
     * Array of recognized HTMLPurifier_HTMLModule instances,
     * indexed by module's class name. This array is usually lazy loaded, but a
     * user can overload a module by pre-emptively registering it.
     * @type HTMLPurifier_HTMLModule[]
     */
    public $registeredModules = array();

    /**
     * List of extra modules that were added by the user
     * using addModule(). These get unconditionally merged into the current doctype, whatever
     * it may be.
     * @type HTMLPurifier_HTMLModule[]
     */
    public $userModules = array();

    /**
     * Associative array of element name to list of modules that have
     * definitions for the element; this array is dynamically filled.
     * @type array
     */
    public $elementLookup = array();

    /**
     * List of prefixes we should use for registering small names.
     * @type array
     */
    public $prefixes = array('HTMLPurifier_HTMLModule_');

    /**
     * @type HTMLPurifier_ContentSets
     */
    public $contentSets;

    /**
     * @type HTMLPurifier_AttrCollections
     */
    public $attrCollections;

    /**
     * If set to true, unsafe elements and attributes will be allowed.
     * @type bool
     */
    public $trusted = false;

    public function __construct()
    {
        // editable internal objects
        $this->attrTypes = new HTMLPurifier_AttrTypes();
        $this->doctypes  = new HTMLPurifier_DoctypeRegistry();

        // setup basic modules
        $common = array(
            'CommonAttributes', 'Text', 'Hypertext', 'List',
            'Presentation', 'Edit', 'Bdo', 'Tables', 'Image',
            'StyleAttribute',
            // Unsafe:
            'Scripting', 'Object', 'Forms',
            // Sorta legacy, but present in strict:
            'Name',
        );
        $transitional = array('Legacy', 'Target', 'Iframe');
        $xml = array('XMLCommonAttributes');
        $non_xml = array('NonXMLCommonAttributes');

        // setup basic doctypes
        $this->doctypes->register(
            'HTML 4.01 Transitional',
            false,
            array_merge($common, $transitional, $non_xml),
            array('Tidy_Transitional', 'Tidy_Proprietary'),
            array(),
            '-//W3C//DTD HTML 4.01 Transitional//EN',
            'http://www.w3.org/TR/html4/loose.dtd'
        );

        $this->doctypes->register(
            'HTML 4.01 Strict',
            false,
            array_merge($common, $non_xml),
            array('Tidy_Strict', 'Tidy_Proprietary', 'Tidy_Name'),
            array(),
            '-//W3C//DTD HTML 4.01//EN',
            'http://www.w3.org/TR/html4/strict.dtd'
        );

        $this->doctypes->register(
            'XHTML 1.0 Transitional',
            true,
            array_merge($common, $transitional, $xml, $non_xml),
            array('Tidy_Transitional', 'Tidy_XHTML', 'Tidy_Proprietary', 'Tidy_Name'),
            array(),
            '-//W3C//DTD XHTML 1.0 Transitional//EN',
            'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'
        );

        $this->doctypes->register(
            'XHTML 1.0 Strict',
            true,
            array_merge($common, $xml, $non_xml),
            array('Tidy_Strict', 'Tidy_XHTML', 'Tidy_Strict', 'Tidy_Proprietary', 'Tidy_Name'),
            array(),
            '-//W3C//DTD XHTML 1.0 Strict//EN',
            'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'
        );

        $this->doctypes->register(
            'XHTML 1.1',
            true,
            // Iframe is a real XHTML 1.1 module, despite being
            // "transitional"!
            array_merge($common, $xml, array('Ruby', 'Iframe')),
            array('Tidy_Strict', 'Tidy_XHTML', 'Tidy_Proprietary', 'Tidy_Strict', 'Tidy_Name'), // Tidy_XHTML1_1
            array(),
            '-//W3C//DTD XHTML 1.1//EN',
            'http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd'
        );

    }

    /**
     * Registers a module to the recognized module list, useful for
     * overloading pre-existing modules.
     * @param $module Mixed: string module name, with or without
     *                HTMLPurifier_HTMLModule prefix, or instance of
     *                subclass of HTMLPurifier_HTMLModule.
     * @param $overload Boolean whether or not to overload previous modules.
     *                  If this is not set, and you do overload a module,
     *                  HTML Purifier will complain with a warning.
     * @note This function will not call autoload, you must instantiate
     *       (and thus invoke) autoload outside the method.
     * @note If a string is passed as a module name, different variants
     *       will be tested in this order:
     *          - Check for HTMLPurifier_HTMLModule_$name
     *          - Check all prefixes with $name in order they were added
     *          - Check for literal object name
     *          - Throw fatal error
     *       If your object name collides with an internal class, specify
     *       your module manually. All modules must have been included
     *       externally: registerModule will not perform inclusions for you!
     */
    public function registerModule($module, $overload = false)
    {
        if (is_string($module)) {
            // attempt to load the module
            $original_module = $module;
            $ok = false;
            foreach ($this->prefixes as $prefix) {
                $module = $prefix . $original_module;
                if (class_exists($module)) {
                    $ok = true;
                    break;
                }
            }
            if (!$ok) {
                $module = $original_module;
                if (!class_exists($module)) {
                    trigger_error(
                        $original_module . ' module does not exist',
                        E_USER_ERROR
                    );
                    return;
                }
            }
            $module = new $module();
        }
        if (empty($module->name)) {
            trigger_error('Module instance of ' . get_class($module) . ' must have name');
            return;
        }
        if (!$overload && isset($this->registeredModules[$module->name])) {
            trigger_error('Overloading ' . $module->name . ' without explicit overload parameter', E_USER_WARNING);
        }
        $this->registeredModules[$module->name] = $module;
    }

    /**
     * Adds a module to the current doctype by first registering it,
     * and then tacking it on to the active doctype
     */
    public function addModule($module)
    {
        $this->registerModule($module);
        if (is_object($module)) {
            $module = $module->name;
        }
        $this->userModules[] = $module;
    }

    /**
     * Adds a class prefix that registerModule() will use to resolve a
     * string name to a concrete class
     */
    public function addPrefix($prefix)
    {
        $this->prefixes[] = $prefix;
    }

    /**
     * Performs processing on modules, after being called you may
     * use getElement() and getElements()
     * @param HTMLPurifier_Config $config
     */
    public function setup($config)
    {
        $this->trusted = $config->get('HTML.Trusted');

        // generate
        $this->doctype = $this->doctypes->make($config);
        $modules = $this->doctype->modules;

        // take out the default modules that aren't allowed
        $lookup = $config->get('HTML.AllowedModules');
        $special_cases = $config->get('HTML.CoreModules');

        if (is_array($lookup)) {
            foreach ($modules as $k => $m) {
                if (isset($special_cases[$m])) {
                    continue;
                }
                if (!isset($lookup[$m])) {
                    unset($modules[$k]);
                }
            }
        }

        // custom modules
        if ($config->get('HTML.Proprietary')) {
            $modules[] = 'Proprietary';
        }
        if ($config->get('HTML.SafeObject')) {
            $modules[] = 'SafeObject';
        }
        if ($config->get('HTML.SafeEmbed')) {
            $modules[] = 'SafeEmbed';
        }
        if ($config->get('HTML.SafeScripting') !== array()) {
            $modules[] = 'SafeScripting';
        }
        if ($config->get('HTML.Nofollow')) {
            $modules[] = 'Nofollow';
        }
        if ($config->get('HTML.TargetBlank')) {
            $modules[] = 'TargetBlank';
        }
        // NB: HTML.TargetNoreferrer and HTML.TargetNoopener must be AFTER HTML.TargetBlank
        // so that its post-attr-transform gets run afterwards.
        if ($config->get('HTML.TargetNoreferrer')) {
            $modules[] = 'TargetNoreferrer';
        }
        if ($config->get('HTML.TargetNoopener')) {
            $modules[] = 'TargetNoopener';
        }

        // merge in custom modules
        $modules = array_merge($modules, $this->userModules);

        foreach ($modules as $module) {
            $this->processModule($module);
            $this->modules[$module]->setup($config);
        }

        foreach ($this->doctype->tidyModules as $module) {
            $this->processModule($module);
            $this->modules[$module]->setup($config);
        }

        // prepare any injectors
        foreach ($this->modules as $module) {
            $n = array();
            foreach ($module->info_injector as $injector) {
                if (!is_object($injector)) {
                    $class = "HTMLPurifier_Injector_$injector";
                    $injector = new $class;
                }
                $n[$injector->name] = $injector;
            }
            $module->info_injector = $n;
        }

        // setup lookup table based on all valid modules
        foreach ($this->modules as $module) {
            foreach ($module->info as $name => $def) {
                if (!isset($this->elementLookup[$name])) {
                    $this->elementLookup[$name] = array();
                }
                $this->elementLookup[$name][] = $module->name;
            }
        }

        // note the different choice
        $this->contentSets = new HTMLPurifier_ContentSets(
            // content set assembly deals with all possible modules,
            // not just ones deemed to be "safe"
            $this->modules
        );
        $this->attrCollections = new HTMLPurifier_AttrCollections(
            $this->attrTypes,
            // there is no way to directly disable a global attribute,
            // but using AllowedAttributes or simply not including
            // the module in your custom doctype should be sufficient
            $this->modules
        );
    }

    /**
     * Takes a module and adds it to the active module collection,
     * registering it if necessary.
     */
    public function processModule($module)
    {
        if (!isset($this->registeredModules[$module]) || is_object($module)) {
            $this->registerModule($module);
        }
        $this->modules[$module] = $this->registeredModules[$module];
    }

    /**
     * Retrieves merged element definitions.
     * @return Array of HTMLPurifier_ElementDef
     */
    public function getElements()
    {
        $elements = array();
        foreach ($this->modules as $module) {
            if (!$this->trusted && !$module->safe) {
                continue;
            }
            foreach ($module->info as $name => $v) {
                if (isset($elements[$name])) {
                    continue;
                }
                $elements[$name] = $this->getElement($name);
            }
        }

        // remove dud elements, this happens when an element that
        // appeared to be safe actually wasn't
        foreach ($elements as $n => $v) {
            if ($v === false) {
                unset($elements[$n]);
            }
        }

        return $elements;

    }

    /**
     * Retrieves a single merged element definition
     * @param string $name Name of element
     * @param bool $trusted Boolean trusted overriding parameter: set to true
     *                 if you want the full version of an element
     * @return HTMLPurifier_ElementDef Merged HTMLPurifier_ElementDef
     * @note You may notice that modules are getting iterated over twice (once
     *       in getElements() and once here). This
     *       is because
     */
    public function getElement($name, $trusted = null)
    {
        if (!isset($this->elementLookup[$name])) {
            return false;
        }

        // setup global state variables
        $def = false;
        if ($trusted === null) {
            $trusted = $this->trusted;
        }

        // iterate through each module that has registered itself to this
        // element
        foreach ($this->elementLookup[$name] as $module_name) {
            $module = $this->modules[$module_name];

            // refuse to create/merge from a module that is deemed unsafe--
            // pretend the module doesn't exist--when trusted mode is not on.
            if (!$trusted && !$module->safe) {
                continue;
            }

            // clone is used because, ideally speaking, the original
            // definition should not be modified. Usually, this will
            // make no difference, but for consistency's sake
            $new_def = clone $module->info[$name];

            if (!$def && $new_def->standalone) {
                $def = $new_def;
            } elseif ($def) {
                // This will occur even if $new_def is standalone. In practice,
                // this will usually result in a full replacement.
                $def->mergeIn($new_def);
            } else {
                // :TODO:
                // non-standalone definitions that don't have a standalone
                // to merge into could be deferred to the end
                // HOWEVER, it is perfectly valid for a non-standalone
                // definition to lack a standalone definition, even
                // after all processing: this allows us to safely
                // specify extra attributes for elements that may not be
                // enabled all in one place.  In particular, this might
                // be the case for trusted elements.  WARNING: care must
                // be taken that the /extra/ definitions are all safe.
                continue;
            }

            // attribute value expansions
            $this->attrCollections->performInclusions($def->attr);
            $this->attrCollections->expandIdentifiers($def->attr, $this->attrTypes);

            // descendants_are_inline, for ChildDef_Chameleon
            if (is_string($def->content_model) &&
                strpos($def->content_model, 'Inline') !== false) {
                if ($name != 'del' && $name != 'ins') {
                    // this is for you, ins/del
                    $def->descendants_are_inline = true;
                }
            }

            $this->contentSets->generateChildDef($def, $module);
        }

        // This can occur if there is a blank definition, but no base to
        // mix it in with
        if (!$def) {
            return false;
        }

        // add information on required attributes
        foreach ($def->attr as $attr_name => $attr_def) {
            if ($attr_def->required) {
                $def->required_attr[] = $attr_name;
            }
        }
        return $def;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/UnitConverter.php000064400000023622151214231100016507 0ustar00<?php

/**
 * Class for converting between different unit-lengths as specified by
 * CSS.
 */
class HTMLPurifier_UnitConverter
{

    const ENGLISH = 1;
    const METRIC = 2;
    const DIGITAL = 3;

    /**
     * Units information array. Units are grouped into measuring systems
     * (English, Metric), and are assigned an integer representing
     * the conversion factor between that unit and the smallest unit in
     * the system. Numeric indexes are actually magical constants that
     * encode conversion data from one system to the next, with a O(n^2)
     * constraint on memory (this is generally not a problem, since
     * the number of measuring systems is small.)
     */
    protected static $units = array(
        self::ENGLISH => array(
            'px' => 3, // This is as per CSS 2.1 and Firefox. Your mileage may vary
            'pt' => 4,
            'pc' => 48,
            'in' => 288,
            self::METRIC => array('pt', '0.352777778', 'mm'),
        ),
        self::METRIC => array(
            'mm' => 1,
            'cm' => 10,
            self::ENGLISH => array('mm', '2.83464567', 'pt'),
        ),
    );

    /**
     * Minimum bcmath precision for output.
     * @type int
     */
    protected $outputPrecision;

    /**
     * Bcmath precision for internal calculations.
     * @type int
     */
    protected $internalPrecision;

    /**
     * Whether or not BCMath is available.
     * @type bool
     */
    private $bcmath;

    public function __construct($output_precision = 4, $internal_precision = 10, $force_no_bcmath = false)
    {
        $this->outputPrecision = $output_precision;
        $this->internalPrecision = $internal_precision;
        $this->bcmath = !$force_no_bcmath && function_exists('bcmul');
    }

    /**
     * Converts a length object of one unit into another unit.
     * @param HTMLPurifier_Length $length
     *      Instance of HTMLPurifier_Length to convert. You must validate()
     *      it before passing it here!
     * @param string $to_unit
     *      Unit to convert to.
     * @return HTMLPurifier_Length|bool
     * @note
     *      About precision: This conversion function pays very special
     *      attention to the incoming precision of values and attempts
     *      to maintain a number of significant figure. Results are
     *      fairly accurate up to nine digits. Some caveats:
     *          - If a number is zero-padded as a result of this significant
     *            figure tracking, the zeroes will be eliminated.
     *          - If a number contains less than four sigfigs ($outputPrecision)
     *            and this causes some decimals to be excluded, those
     *            decimals will be added on.
     */
    public function convert($length, $to_unit)
    {
        if (!$length->isValid()) {
            return false;
        }

        $n = $length->getN();
        $unit = $length->getUnit();

        if ($n === '0' || $unit === false) {
            return new HTMLPurifier_Length('0', false);
        }

        $state = $dest_state = false;
        foreach (self::$units as $k => $x) {
            if (isset($x[$unit])) {
                $state = $k;
            }
            if (isset($x[$to_unit])) {
                $dest_state = $k;
            }
        }
        if (!$state || !$dest_state) {
            return false;
        }

        // Some calculations about the initial precision of the number;
        // this will be useful when we need to do final rounding.
        $sigfigs = $this->getSigFigs($n);
        if ($sigfigs < $this->outputPrecision) {
            $sigfigs = $this->outputPrecision;
        }

        // BCMath's internal precision deals only with decimals. Use
        // our default if the initial number has no decimals, or increase
        // it by how ever many decimals, thus, the number of guard digits
        // will always be greater than or equal to internalPrecision.
        $log = (int)floor(log(abs($n), 10));
        $cp = ($log < 0) ? $this->internalPrecision - $log : $this->internalPrecision; // internal precision

        for ($i = 0; $i < 2; $i++) {

            // Determine what unit IN THIS SYSTEM we need to convert to
            if ($dest_state === $state) {
                // Simple conversion
                $dest_unit = $to_unit;
            } else {
                // Convert to the smallest unit, pending a system shift
                $dest_unit = self::$units[$state][$dest_state][0];
            }

            // Do the conversion if necessary
            if ($dest_unit !== $unit) {
                $factor = $this->div(self::$units[$state][$unit], self::$units[$state][$dest_unit], $cp);
                $n = $this->mul($n, $factor, $cp);
                $unit = $dest_unit;
            }

            // Output was zero, so bail out early. Shouldn't ever happen.
            if ($n === '') {
                $n = '0';
                $unit = $to_unit;
                break;
            }

            // It was a simple conversion, so bail out
            if ($dest_state === $state) {
                break;
            }

            if ($i !== 0) {
                // Conversion failed! Apparently, the system we forwarded
                // to didn't have this unit. This should never happen!
                return false;
            }

            // Pre-condition: $i == 0

            // Perform conversion to next system of units
            $n = $this->mul($n, self::$units[$state][$dest_state][1], $cp);
            $unit = self::$units[$state][$dest_state][2];
            $state = $dest_state;

            // One more loop around to convert the unit in the new system.

        }

        // Post-condition: $unit == $to_unit
        if ($unit !== $to_unit) {
            return false;
        }

        // Useful for debugging:
        //echo "<pre>n";
        //echo "$n\nsigfigs = $sigfigs\nnew_log = $new_log\nlog = $log\nrp = $rp\n</pre>\n";

        $n = $this->round($n, $sigfigs);
        if (strpos($n, '.') !== false) {
            $n = rtrim($n, '0');
        }
        $n = rtrim($n, '.');

        return new HTMLPurifier_Length($n, $unit);
    }

    /**
     * Returns the number of significant figures in a string number.
     * @param string $n Decimal number
     * @return int number of sigfigs
     */
    public function getSigFigs($n)
    {
        $n = ltrim($n, '0+-');
        $dp = strpos($n, '.'); // decimal position
        if ($dp === false) {
            $sigfigs = strlen(rtrim($n, '0'));
        } else {
            $sigfigs = strlen(ltrim($n, '0.')); // eliminate extra decimal character
            if ($dp !== 0) {
                $sigfigs--;
            }
        }
        return $sigfigs;
    }

    /**
     * Adds two numbers, using arbitrary precision when available.
     * @param string $s1
     * @param string $s2
     * @param int $scale
     * @return string
     */
    private function add($s1, $s2, $scale)
    {
        if ($this->bcmath) {
            return bcadd($s1, $s2, $scale);
        } else {
            return $this->scale((float)$s1 + (float)$s2, $scale);
        }
    }

    /**
     * Multiples two numbers, using arbitrary precision when available.
     * @param string $s1
     * @param string $s2
     * @param int $scale
     * @return string
     */
    private function mul($s1, $s2, $scale)
    {
        if ($this->bcmath) {
            return bcmul($s1, $s2, $scale);
        } else {
            return $this->scale((float)$s1 * (float)$s2, $scale);
        }
    }

    /**
     * Divides two numbers, using arbitrary precision when available.
     * @param string $s1
     * @param string $s2
     * @param int $scale
     * @return string
     */
    private function div($s1, $s2, $scale)
    {
        if ($this->bcmath) {
            return bcdiv($s1, $s2, $scale);
        } else {
            return $this->scale((float)$s1 / (float)$s2, $scale);
        }
    }

    /**
     * Rounds a number according to the number of sigfigs it should have,
     * using arbitrary precision when available.
     * @param float $n
     * @param int $sigfigs
     * @return string
     */
    private function round($n, $sigfigs)
    {
        $new_log = (int)floor(log(abs($n), 10)); // Number of digits left of decimal - 1
        $rp = $sigfigs - $new_log - 1; // Number of decimal places needed
        $neg = $n < 0 ? '-' : ''; // Negative sign
        if ($this->bcmath) {
            if ($rp >= 0) {
                $n = bcadd($n, $neg . '0.' . str_repeat('0', $rp) . '5', $rp + 1);
                $n = bcdiv($n, '1', $rp);
            } else {
                // This algorithm partially depends on the standardized
                // form of numbers that comes out of bcmath.
                $n = bcadd($n, $neg . '5' . str_repeat('0', $new_log - $sigfigs), 0);
                $n = substr($n, 0, $sigfigs + strlen($neg)) . str_repeat('0', $new_log - $sigfigs + 1);
            }
            return $n;
        } else {
            return $this->scale(round($n, $sigfigs - $new_log - 1), $rp + 1);
        }
    }

    /**
     * Scales a float to $scale digits right of decimal point, like BCMath.
     * @param float $r
     * @param int $scale
     * @return string
     */
    private function scale($r, $scale)
    {
        if ($scale < 0) {
            // The f sprintf type doesn't support negative numbers, so we
            // need to cludge things manually. First get the string.
            $r = sprintf('%.0f', (float)$r);
            // Due to floating point precision loss, $r will more than likely
            // look something like 4652999999999.9234. We grab one more digit
            // than we need to precise from $r and then use that to round
            // appropriately.
            $precise = (string)round(substr($r, 0, strlen($r) + $scale), -1);
            // Now we return it, truncating the zero that was rounded off.
            return substr($precise, 0, -1) . str_repeat('0', -$scale + 1);
        }
        return sprintf('%.' . $scale . 'f', (float)$r);
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Lexer.php000064400000032363151214231100014761 0ustar00<?php

/**
 * Forgivingly lexes HTML (SGML-style) markup into tokens.
 *
 * A lexer parses a string of SGML-style markup and converts them into
 * corresponding tokens.  It doesn't check for well-formedness, although its
 * internal mechanism may make this automatic (such as the case of
 * HTMLPurifier_Lexer_DOMLex).  There are several implementations to choose
 * from.
 *
 * A lexer is HTML-oriented: it might work with XML, but it's not
 * recommended, as we adhere to a subset of the specification for optimization
 * reasons. This might change in the future. Also, most tokenizers are not
 * expected to handle DTDs or PIs.
 *
 * This class should not be directly instantiated, but you may use create() to
 * retrieve a default copy of the lexer.  Being a supertype, this class
 * does not actually define any implementation, but offers commonly used
 * convenience functions for subclasses.
 *
 * @note The unit tests will instantiate this class for testing purposes, as
 *       many of the utility functions require a class to be instantiated.
 *       This means that, even though this class is not runnable, it will
 *       not be declared abstract.
 *
 * @par
 *
 * @note
 * We use tokens rather than create a DOM representation because DOM would:
 *
 * @par
 *  -# Require more processing and memory to create,
 *  -# Is not streamable, and
 *  -# Has the entire document structure (html and body not needed).
 *
 * @par
 * However, DOM is helpful in that it makes it easy to move around nodes
 * without a lot of lookaheads to see when a tag is closed. This is a
 * limitation of the token system and some workarounds would be nice.
 */
class HTMLPurifier_Lexer
{

    /**
     * Whether or not this lexer implements line-number/column-number tracking.
     * If it does, set to true.
     */
    public $tracksLineNumbers = false;

    /**
     * @since 4.13.1 - https://github.com/MetaSlider/metaslider/issues/494
     */
    private $_entity_parser;

    // -- STATIC ----------------------------------------------------------

    /**
     * Retrieves or sets the default Lexer as a Prototype Factory.
     *
     * By default HTMLPurifier_Lexer_DOMLex will be returned. There are
     * a few exceptions involving special features that only DirectLex
     * implements.
     *
     * @note The behavior of this class has changed, rather than accepting
     *       a prototype object, it now accepts a configuration object.
     *       To specify your own prototype, set %Core.LexerImpl to it.
     *       This change in behavior de-singletonizes the lexer object.
     *
     * @param HTMLPurifier_Config $config
     * @return HTMLPurifier_Lexer
     * @throws HTMLPurifier_Exception
     */
    public static function create($config)
    {
        if (!($config instanceof HTMLPurifier_Config)) {
            $lexer = $config;
            trigger_error(
                "Passing a prototype to
                HTMLPurifier_Lexer::create() is deprecated, please instead
                use %Core.LexerImpl",
                E_USER_WARNING
            );
        } else {
            $lexer = $config->get('Core.LexerImpl');
        }

        $needs_tracking =
            $config->get('Core.MaintainLineNumbers') ||
            $config->get('Core.CollectErrors');

        $inst = null;
        if (is_object($lexer)) {
            $inst = $lexer;
        } else {
            if (is_null($lexer)) {
                do {
                    // auto-detection algorithm
                    if ($needs_tracking) {
                        $lexer = 'DirectLex';
                        break;
                    }

                    if (class_exists('DOMDocument', false) &&
                        method_exists('DOMDocument', 'loadHTML') &&
                        !extension_loaded('domxml')
                    ) {
                        // check for DOM support, because while it's part of the
                        // core, it can be disabled compile time. Also, the PECL
                        // domxml extension overrides the default DOM, and is evil
                        // and nasty and we shan't bother to support it
                        $lexer = 'DOMLex';
                    } else {
                        $lexer = 'DirectLex';
                    }
                } while (0);
            } // do..while so we can break

            // instantiate recognized string names
            switch ($lexer) {
                case 'DOMLex':
                    $inst = new HTMLPurifier_Lexer_DOMLex();
                    break;
                case 'DirectLex':
                    $inst = new HTMLPurifier_Lexer_DirectLex();
                    break;
                case 'PH5P':
                    $inst = new HTMLPurifier_Lexer_PH5P();
                    break;
                default:
                    throw new HTMLPurifier_Exception(
                        "Cannot instantiate unrecognized Lexer type " .
                        htmlspecialchars($lexer)
                    );
            }
        }

        if (!$inst) {
            throw new HTMLPurifier_Exception('No lexer was instantiated');
        }

        // once PHP DOM implements native line numbers, or we
        // hack out something using XSLT, remove this stipulation
        if ($needs_tracking && !$inst->tracksLineNumbers) {
            throw new HTMLPurifier_Exception(
                'Cannot use lexer that does not support line numbers with ' .
                'Core.MaintainLineNumbers or Core.CollectErrors (use DirectLex instead)'
            );
        }

        return $inst;

    }

    // -- CONVENIENCE MEMBERS ---------------------------------------------

    public function __construct()
    {
        $this->_entity_parser = new HTMLPurifier_EntityParser();
    }

    /**
     * Most common entity to raw value conversion table for special entities.
     * @type array
     */
    protected $_special_entity2str =
        array(
            '&quot;' => '"',
            '&amp;' => '&',
            '&lt;' => '<',
            '&gt;' => '>',
            '&#39;' => "'",
            '&#039;' => "'",
            '&#x27;' => "'"
        );

    public function parseText($string, $config) {
        return $this->parseData($string, false, $config);
    }

    public function parseAttr($string, $config) {
        return $this->parseData($string, true, $config);
    }

    /**
     * Parses special entities into the proper characters.
     *
     * This string will translate escaped versions of the special characters
     * into the correct ones.
     *
     * @param string $string String character data to be parsed.
     * @return string Parsed character data.
     */
    public function parseData($string, $is_attr, $config)
    {
        // following functions require at least one character
        if ($string === '') {
            return '';
        }

        // subtracts amps that cannot possibly be escaped
        $num_amp = substr_count($string, '&') - substr_count($string, '& ') -
            ($string[strlen($string) - 1] === '&' ? 1 : 0);

        if (!$num_amp) {
            return $string;
        } // abort if no entities
        $num_esc_amp = substr_count($string, '&amp;');
        $string = strtr($string, $this->_special_entity2str);

        // code duplication for sake of optimization, see above
        $num_amp_2 = substr_count($string, '&') - substr_count($string, '& ') -
            ($string[strlen($string) - 1] === '&' ? 1 : 0);

        if ($num_amp_2 <= $num_esc_amp) {
            return $string;
        }

        // hmm... now we have some uncommon entities. Use the callback.
        if ($config->get('Core.LegacyEntityDecoder')) {
            $string = $this->_entity_parser->substituteSpecialEntities($string);
        } else {
            if ($is_attr) {
                $string = $this->_entity_parser->substituteAttrEntities($string);
            } else {
                $string = $this->_entity_parser->substituteTextEntities($string);
            }
        }
        return $string;
    }

    /**
     * Lexes an HTML string into tokens.
     * @param $string String HTML.
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return HTMLPurifier_Token[] array representation of HTML.
     */
    public function tokenizeHTML($string, $config, $context)
    {
        trigger_error('Call to abstract class', E_USER_ERROR);
    }

    /**
     * Translates CDATA sections into regular sections (through escaping).
     * @param string $string HTML string to process.
     * @return string HTML with CDATA sections escaped.
     */
    protected static function escapeCDATA($string)
    {
        return preg_replace_callback(
            '/<!\[CDATA\[(.+?)\]\]>/s',
            array('HTMLPurifier_Lexer', 'CDATACallback'),
            $string
        );
    }

    /**
     * Special CDATA case that is especially convoluted for <script>
     * @param string $string HTML string to process.
     * @return string HTML with CDATA sections escaped.
     */
    protected static function escapeCommentedCDATA($string)
    {
        return preg_replace_callback(
            '#<!--//--><!\[CDATA\[//><!--(.+?)//--><!\]\]>#s',
            array('HTMLPurifier_Lexer', 'CDATACallback'),
            $string
        );
    }

    /**
     * Special Internet Explorer conditional comments should be removed.
     * @param string $string HTML string to process.
     * @return string HTML with conditional comments removed.
     */
    protected static function removeIEConditional($string)
    {
        return preg_replace(
            '#<!--\[if [^>]+\]>.*?<!\[endif\]-->#si', // probably should generalize for all strings
            '',
            $string
        );
    }

    /**
     * Callback function for escapeCDATA() that does the work.
     *
     * @warning Though this is public in order to let the callback happen,
     *          calling it directly is not recommended.
     * @param array $matches PCRE matches array, with index 0 the entire match
     *                  and 1 the inside of the CDATA section.
     * @return string Escaped internals of the CDATA section.
     */
    protected static function CDATACallback($matches)
    {
        // not exactly sure why the character set is needed, but whatever
        return htmlspecialchars($matches[1], ENT_COMPAT, 'UTF-8');
    }

    /**
     * Takes a piece of HTML and normalizes it by converting entities, fixing
     * encoding, extracting bits, and other good stuff.
     * @param string $html HTML.
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return string
     * @todo Consider making protected
     */
    public function normalize($html, $config, $context)
    {
        // normalize newlines to \n
        if ($config->get('Core.NormalizeNewlines')) {
            $html = str_replace("\r\n", "\n", $html);
            $html = str_replace("\r", "\n", $html);
        }

        if ($config->get('HTML.Trusted')) {
            // escape convoluted CDATA
            $html = $this->escapeCommentedCDATA($html);
        }

        // escape CDATA
        $html = $this->escapeCDATA($html);

        $html = $this->removeIEConditional($html);

        // extract body from document if applicable
        if ($config->get('Core.ConvertDocumentToFragment')) {
            $e = false;
            if ($config->get('Core.CollectErrors')) {
                $e =& $context->get('ErrorCollector');
            }
            $new_html = $this->extractBody($html);
            if ($e && $new_html != $html) {
                $e->send(E_WARNING, 'Lexer: Extracted body');
            }
            $html = $new_html;
        }

        // expand entities that aren't the big five
        if ($config->get('Core.LegacyEntityDecoder')) {
            $html = $this->_entity_parser->substituteNonSpecialEntities($html);
        }

        // clean into wellformed UTF-8 string for an SGML context: this has
        // to be done after entity expansion because the entities sometimes
        // represent non-SGML characters (horror, horror!)
        $html = HTMLPurifier_Encoder::cleanUTF8($html);

        // if processing instructions are to removed, remove them now
        if ($config->get('Core.RemoveProcessingInstructions')) {
            $html = preg_replace('#<\?.+?\?>#s', '', $html);
        }

        $hidden_elements = $config->get('Core.HiddenElements');
        if ($config->get('Core.AggressivelyRemoveScript') &&
            !($config->get('HTML.Trusted') || !$config->get('Core.RemoveScriptContents')
            || empty($hidden_elements["script"]))) {
            $html = preg_replace('#<script[^>]*>.*?</script>#i', '', $html);
        }

        return $html;
    }

    /**
     * Takes a string of HTML (fragment or document) and returns the content
     * @todo Consider making protected
     */
    public function extractBody($html)
    {
        $matches = array();
        $result = preg_match('|(.*?)<body[^>]*>(.*)</body>|is', $html, $matches);
        if ($result) {
            // Make sure it's not in a comment
            $comment_start = strrpos($matches[1], '<!--');
            $comment_end   = strrpos($matches[1], '-->');
            if ($comment_start === false ||
                ($comment_end !== false && $comment_end > $comment_start)) {
                return $matches[2];
            }
        }
        return $html;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/URI.php000064400000024544151214231100014343 0ustar00<?php

/**
 * HTML Purifier's internal representation of a URI.
 * @note
 *      Internal data-structures are completely escaped. If the data needs
 *      to be used in a non-URI context (which is very unlikely), be sure
 *      to decode it first. The URI may not necessarily be well-formed until
 *      validate() is called.
 */
class HTMLPurifier_URI
{
    /**
     * @type string
     */
    public $scheme;

    /**
     * @type string
     */
    public $userinfo;

    /**
     * @type string
     */
    public $host;

    /**
     * @type int
     */
    public $port;

    /**
     * @type string
     */
    public $path;

    /**
     * @type string
     */
    public $query;

    /**
     * @type string
     */
    public $fragment;

    /**
     * @param string $scheme
     * @param string $userinfo
     * @param string $host
     * @param int $port
     * @param string $path
     * @param string $query
     * @param string $fragment
     * @note Automatically normalizes scheme and port
     */
    public function __construct($scheme, $userinfo, $host, $port, $path, $query, $fragment)
    {
        $this->scheme = is_null($scheme) || ctype_lower($scheme) ? $scheme : strtolower($scheme);
        $this->userinfo = $userinfo;
        $this->host = $host;
        $this->port = is_null($port) ? $port : (int)$port;
        $this->path = $path;
        $this->query = $query;
        $this->fragment = $fragment;
    }

    /**
     * Retrieves a scheme object corresponding to the URI's scheme/default
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return HTMLPurifier_URIScheme Scheme object appropriate for validating this URI
     */
    public function getSchemeObj($config, $context)
    {
        $registry = HTMLPurifier_URISchemeRegistry::instance();
        if ($this->scheme !== null) {
            $scheme_obj = $registry->getScheme($this->scheme, $config, $context);
            if (!$scheme_obj) {
                return false;
            } // invalid scheme, clean it out
        } else {
            // no scheme: retrieve the default one
            $def = $config->getDefinition('URI');
            $scheme_obj = $def->getDefaultScheme($config, $context);
            if (!$scheme_obj) {
                if ($def->defaultScheme !== null) {
                    // something funky happened to the default scheme object
                    trigger_error(
                        'Default scheme object "' . $def->defaultScheme . '" was not readable',
                        E_USER_WARNING
                    );
                } // suppress error if it's null
                return false;
            }
        }
        return $scheme_obj;
    }

    /**
     * Generic validation method applicable for all schemes. May modify
     * this URI in order to get it into a compliant form.
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool True if validation/filtering succeeds, false if failure
     */
    public function validate($config, $context)
    {
        // ABNF definitions from RFC 3986
        $chars_sub_delims = '!$&\'()*+,;=';
        $chars_gen_delims = ':/?#[]@';
        $chars_pchar = $chars_sub_delims . ':@';

        // validate host
        if (!is_null($this->host)) {
            $host_def = new HTMLPurifier_AttrDef_URI_Host();
            $this->host = $host_def->validate($this->host, $config, $context);
            if ($this->host === false) {
                $this->host = null;
            }
        }

        // validate scheme
        // NOTE: It's not appropriate to check whether or not this
        // scheme is in our registry, since a URIFilter may convert a
        // URI that we don't allow into one we do.  So instead, we just
        // check if the scheme can be dropped because there is no host
        // and it is our default scheme.
        if (!is_null($this->scheme) && is_null($this->host) || $this->host === '') {
            // support for relative paths is pretty abysmal when the
            // scheme is present, so axe it when possible
            $def = $config->getDefinition('URI');
            if ($def->defaultScheme === $this->scheme) {
                $this->scheme = null;
            }
        }

        // validate username
        if (!is_null($this->userinfo)) {
            $encoder = new HTMLPurifier_PercentEncoder($chars_sub_delims . ':');
            $this->userinfo = $encoder->encode($this->userinfo);
        }

        // validate port
        if (!is_null($this->port)) {
            if ($this->port < 1 || $this->port > 65535) {
                $this->port = null;
            }
        }

        // validate path
        $segments_encoder = new HTMLPurifier_PercentEncoder($chars_pchar . '/');
        if (!is_null($this->host)) { // this catches $this->host === ''
            // path-abempty (hier and relative)
            // http://www.example.com/my/path
            // //www.example.com/my/path (looks odd, but works, and
            //                            recognized by most browsers)
            // (this set is valid or invalid on a scheme by scheme
            // basis, so we'll deal with it later)
            // file:///my/path
            // ///my/path
            $this->path = $segments_encoder->encode($this->path);
        } elseif ($this->path !== '') {
            if ($this->path[0] === '/') {
                // path-absolute (hier and relative)
                // http:/my/path
                // /my/path
                if (strlen($this->path) >= 2 && $this->path[1] === '/') {
                    // This could happen if both the host gets stripped
                    // out
                    // http://my/path
                    // //my/path
                    $this->path = '';
                } else {
                    $this->path = $segments_encoder->encode($this->path);
                }
            } elseif (!is_null($this->scheme)) {
                // path-rootless (hier)
                // http:my/path
                // Short circuit evaluation means we don't need to check nz
                $this->path = $segments_encoder->encode($this->path);
            } else {
                // path-noscheme (relative)
                // my/path
                // (once again, not checking nz)
                $segment_nc_encoder = new HTMLPurifier_PercentEncoder($chars_sub_delims . '@');
                $c = strpos($this->path, '/');
                if ($c !== false) {
                    $this->path =
                        $segment_nc_encoder->encode(substr($this->path, 0, $c)) .
                        $segments_encoder->encode(substr($this->path, $c));
                } else {
                    $this->path = $segment_nc_encoder->encode($this->path);
                }
            }
        } else {
            // path-empty (hier and relative)
            $this->path = ''; // just to be safe
        }

        // qf = query and fragment
        $qf_encoder = new HTMLPurifier_PercentEncoder($chars_pchar . '/?');

        if (!is_null($this->query)) {
            $this->query = $qf_encoder->encode($this->query);
        }

        if (!is_null($this->fragment)) {
            $this->fragment = $qf_encoder->encode($this->fragment);
        }
        return true;
    }

    /**
     * Convert URI back to string
     * @return string URI appropriate for output
     */
    public function toString()
    {
        // reconstruct authority
        $authority = null;
        // there is a rendering difference between a null authority
        // (http:foo-bar) and an empty string authority
        // (http:///foo-bar).
        if (!is_null($this->host)) {
            $authority = '';
            if (!is_null($this->userinfo)) {
                $authority .= $this->userinfo . '@';
            }
            $authority .= $this->host;
            if (!is_null($this->port)) {
                $authority .= ':' . $this->port;
            }
        }

        // Reconstruct the result
        // One might wonder about parsing quirks from browsers after
        // this reconstruction.  Unfortunately, parsing behavior depends
        // on what *scheme* was employed (file:///foo is handled *very*
        // differently than http:///foo), so unfortunately we have to
        // defer to the schemes to do the right thing.
        $result = '';
        if (!is_null($this->scheme)) {
            $result .= $this->scheme . ':';
        }
        if (!is_null($authority)) {
            $result .= '//' . $authority;
        }
        $result .= $this->path;
        if (!is_null($this->query)) {
            $result .= '?' . $this->query;
        }
        if (!is_null($this->fragment)) {
            $result .= '#' . $this->fragment;
        }

        return $result;
    }

    /**
     * Returns true if this URL might be considered a 'local' URL given
     * the current context.  This is true when the host is null, or
     * when it matches the host supplied to the configuration.
     *
     * Note that this does not do any scheme checking, so it is mostly
     * only appropriate for metadata that doesn't care about protocol
     * security.  isBenign is probably what you actually want.
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool
     */
    public function isLocal($config, $context)
    {
        if ($this->host === null) {
            return true;
        }
        $uri_def = $config->getDefinition('URI');
        if ($uri_def->host === $this->host) {
            return true;
        }
        return false;
    }

    /**
     * Returns true if this URL should be considered a 'benign' URL,
     * that is:
     *
     *      - It is a local URL (isLocal), and
     *      - It has a equal or better level of security
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool
     */
    public function isBenign($config, $context)
    {
        if (!$this->isLocal($config, $context)) {
            return false;
        }

        $scheme_obj = $this->getSchemeObj($config, $context);
        if (!$scheme_obj) {
            return false;
        } // conservative approach

        $current_scheme_obj = $config->getDefinition('URI')->getDefaultScheme($config, $context);
        if ($current_scheme_obj->secure) {
            if (!$scheme_obj->secure) {
                return false;
            }
        }
        return true;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/VarParserException.php000064400000000235151214231100017457 0ustar00<?php

/**
 * Exception type for HTMLPurifier_VarParser
 */
class HTMLPurifier_VarParserException extends HTMLPurifier_Exception
{

}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Context.php000064400000005112151214231100015316 0ustar00<?php

/**
 * Registry object that contains information about the current context.
 * @warning Is a bit buggy when variables are set to null: it thinks
 *          they don't exist! So use false instead, please.
 * @note Since the variables Context deals with may not be objects,
 *       references are very important here! Do not remove!
 */
class HTMLPurifier_Context
{

    /**
     * Private array that stores the references.
     * @type array
     */
    private $_storage = array();

    /**
     * Registers a variable into the context.
     * @param string $name String name
     * @param mixed $ref Reference to variable to be registered
     */
    public function register($name, &$ref)
    {
        if (array_key_exists($name, $this->_storage)) {
            trigger_error(
                "Name $name produces collision, cannot re-register",
                E_USER_ERROR
            );
            return;
        }
        $this->_storage[$name] =& $ref;
    }

    /**
     * Retrieves a variable reference from the context.
     * @param string $name String name
     * @param bool $ignore_error Boolean whether or not to ignore error
     * @return mixed
     */
    public function &get($name, $ignore_error = false)
    {
        if (!array_key_exists($name, $this->_storage)) {
            if (!$ignore_error) {
                trigger_error(
                    "Attempted to retrieve non-existent variable $name",
                    E_USER_ERROR
                );
            }
            $var = null; // so we can return by reference
            return $var;
        }
        return $this->_storage[$name];
    }

    /**
     * Destroys a variable in the context.
     * @param string $name String name
     */
    public function destroy($name)
    {
        if (!array_key_exists($name, $this->_storage)) {
            trigger_error(
                "Attempted to destroy non-existent variable $name",
                E_USER_ERROR
            );
            return;
        }
        unset($this->_storage[$name]);
    }

    /**
     * Checks whether or not the variable exists.
     * @param string $name String name
     * @return bool
     */
    public function exists($name)
    {
        return array_key_exists($name, $this->_storage);
    }

    /**
     * Loads a series of variables from an associative array
     * @param array $context_array Assoc array of variables to load
     */
    public function loadArray($context_array)
    {
        foreach ($context_array as $key => $discard) {
            $this->register($key, $context_array[$key]);
        }
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Node.php000064400000002400151214231100014554 0ustar00<?php

/**
 * Abstract base node class that all others inherit from.
 *
 * Why do we not use the DOM extension?  (1) It is not always available,
 * (2) it has funny constraints on the data it can represent,
 * whereas we want a maximally flexible representation, and (3) its
 * interface is a bit cumbersome.
 */
abstract class HTMLPurifier_Node
{
    /**
     * Line number of the start token in the source document
     * @type int
     */
    public $line;

    /**
     * Column number of the start token in the source document. Null if unknown.
     * @type int
     */
    public $col;

    /**
     * Lookup array of processing that this token is exempt from.
     * Currently, valid values are "ValidateAttributes".
     * @type array
     */
    public $armor = array();

    /**
     * When true, this node should be ignored as non-existent.
     *
     * Who is responsible for ignoring dead nodes?  FixNesting is
     * responsible for removing them before passing on to child
     * validators.
     */
    public $dead = false;

    /**
     * Returns a pair of start and end tokens, where the end token
     * is null if it is not necessary. Does not include children.
     * @type array
     */
    abstract public function toTokenPair();
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/URIFilter.php000064400000004475151214231100015512 0ustar00<?php

/**
 * Chainable filters for custom URI processing.
 *
 * These filters can perform custom actions on a URI filter object,
 * including transformation or blacklisting.  A filter named Foo
 * must have a corresponding configuration directive %URI.Foo,
 * unless always_load is specified to be true.
 *
 * The following contexts may be available while URIFilters are being
 * processed:
 *
 *      - EmbeddedURI: true if URI is an embedded resource that will
 *        be loaded automatically on page load
 *      - CurrentToken: a reference to the token that is currently
 *        being processed
 *      - CurrentAttr: the name of the attribute that is currently being
 *        processed
 *      - CurrentCSSProperty: the name of the CSS property that is
 *        currently being processed (if applicable)
 *
 * @warning This filter is called before scheme object validation occurs.
 *          Make sure, if you require a specific scheme object, you
 *          you check that it exists. This allows filters to convert
 *          proprietary URI schemes into regular ones.
 */
abstract class HTMLPurifier_URIFilter
{

    /**
     * Unique identifier of filter.
     * @type string
     */
    public $name;

    /**
     * True if this filter should be run after scheme validation.
     * @type bool
     */
    public $post = false;

    /**
     * True if this filter should always be loaded.
     * This permits a filter to be named Foo without the corresponding
     * %URI.Foo directive existing.
     * @type bool
     */
    public $always_load = false;

    /**
     * Performs initialization for the filter.  If the filter returns
     * false, this means that it shouldn't be considered active.
     * @param HTMLPurifier_Config $config
     * @return bool
     */
    public function prepare($config)
    {
        return true;
    }

    /**
     * Filter a URI object
     * @param HTMLPurifier_URI $uri Reference to URI object variable
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool Whether or not to continue processing: false indicates
     *         URL is no good, true indicates continue processing. Note that
     *         all changes are committed directly on the URI object
     */
    abstract public function filter(&$uri, $config, $context);
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/IDAccumulator.php000064400000003157151214231100016375 0ustar00<?php

/**
 * Component of HTMLPurifier_AttrContext that accumulates IDs to prevent dupes
 * @note In Slashdot-speak, dupe means duplicate.
 * @note The default constructor does not accept $config or $context objects:
 *       use must use the static build() factory method to perform initialization.
 */
class HTMLPurifier_IDAccumulator
{

    /**
     * Lookup table of IDs we've accumulated.
     * @public
     */
    public $ids = array();

    /**
     * Builds an IDAccumulator, also initializing the default blacklist
     * @param HTMLPurifier_Config $config Instance of HTMLPurifier_Config
     * @param HTMLPurifier_Context $context Instance of HTMLPurifier_Context
     * @return HTMLPurifier_IDAccumulator Fully initialized HTMLPurifier_IDAccumulator
     */
    public static function build($config, $context)
    {
        $id_accumulator = new HTMLPurifier_IDAccumulator();
        $id_accumulator->load($config->get('Attr.IDBlacklist'));
        return $id_accumulator;
    }

    /**
     * Add an ID to the lookup table.
     * @param string $id ID to be added.
     * @return bool status, true if success, false if there's a dupe
     */
    public function add($id)
    {
        if (isset($this->ids[$id])) {
            return false;
        }
        return $this->ids[$id] = true;
    }

    /**
     * Load a list of IDs into the lookup table
     * @param $array_of_ids Array of IDs to load
     * @note This function doesn't care about duplicates
     */
    public function load($array_of_ids)
    {
        foreach ($array_of_ids as $id) {
            $this->ids[$id] = true;
        }
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternal.php000064400000002404151214231100020546 0ustar00<?php

class HTMLPurifier_URIFilter_DisableExternal extends HTMLPurifier_URIFilter
{
    /**
     * @type string
     */
    public $name = 'DisableExternal';

    /**
     * @type array
     */
    protected $ourHostParts = false;

    /**
     * @param HTMLPurifier_Config $config
     * @return void
     */
    public function prepare($config)
    {
        $our_host = $config->getDefinition('URI')->host;
        if ($our_host !== null) {
            $this->ourHostParts = array_reverse(explode('.', $our_host));
        }
    }

    /**
     * @param HTMLPurifier_URI $uri Reference
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool
     */
    public function filter(&$uri, $config, $context)
    {
        if (is_null($uri->host)) {
            return true;
        }
        if ($this->ourHostParts === false) {
            return false;
        }
        $host_parts = array_reverse(explode('.', $uri->host));
        foreach ($this->ourHostParts as $i => $x) {
            if (!isset($host_parts[$i])) {
                return false;
            }
            if ($host_parts[$i] != $this->ourHostParts[$i]) {
                return false;
            }
        }
        return true;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/URIFilter/SafeIframe.php000064400000003262151214231100017505 0ustar00<?php

/**
 * Implements safety checks for safe iframes.
 *
 * @warning This filter is *critical* for ensuring that %HTML.SafeIframe
 * works safely.
 */
class HTMLPurifier_URIFilter_SafeIframe extends HTMLPurifier_URIFilter
{
    /**
     * @type string
     */
    public $name = 'SafeIframe';

    /**
     * @type bool
     */
    public $always_load = true;

    /**
     * @type string
     */
    protected $regexp = null;

    // XXX: The not so good bit about how this is all set up now is we
    // can't check HTML.SafeIframe in the 'prepare' step: we have to
    // defer till the actual filtering.
    /**
     * @param HTMLPurifier_Config $config
     * @return bool
     */
    public function prepare($config)
    {
        $this->regexp = $config->get('URI.SafeIframeRegexp');
        return true;
    }

    /**
     * @param HTMLPurifier_URI $uri
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool
     */
    public function filter(&$uri, $config, $context)
    {
        // check if filter not applicable
        if (!$config->get('HTML.SafeIframe')) {
            return true;
        }
        // check if the filter should actually trigger
        if (!$context->get('EmbeddedURI', true)) {
            return true;
        }
        $token = $context->get('CurrentToken', true);
        if (!($token && $token->name == 'iframe')) {
            return true;
        }
        // check if we actually have some whitelists enabled
        if ($this->regexp === null) {
            return false;
        }
        // actually check the whitelists
        return preg_match($this->regexp, $uri->toString());
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/URIFilter/Munge.php000064400000006103151214231100016553 0ustar00<?php

class HTMLPurifier_URIFilter_Munge extends HTMLPurifier_URIFilter
{
    /**
     * @type string
     */
    public $name = 'Munge';

    /**
     * @type bool
     */
    public $post = true;

    /**
     * @type string
     */
    private $target;

    /**
     * @type HTMLPurifier_URIParser
     */
    private $parser;

    /**
     * @type bool
     */
    private $doEmbed;

    /**
     * @type string
     */
    private $secretKey;

    /**
     * @type array
     */
    protected $replace = array();

    /**
     * @param HTMLPurifier_Config $config
     * @return bool
     */
    public function prepare($config)
    {
        $this->target = $config->get('URI.' . $this->name);
        $this->parser = new HTMLPurifier_URIParser();
        $this->doEmbed = $config->get('URI.MungeResources');
        $this->secretKey = $config->get('URI.MungeSecretKey');
        if ($this->secretKey && !function_exists('hash_hmac')) {
            throw new Exception("Cannot use %URI.MungeSecretKey without hash_hmac support.");
        }
        return true;
    }

    /**
     * @param HTMLPurifier_URI $uri
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool
     */
    public function filter(&$uri, $config, $context)
    {
        if ($context->get('EmbeddedURI', true) && !$this->doEmbed) {
            return true;
        }

        $scheme_obj = $uri->getSchemeObj($config, $context);
        if (!$scheme_obj) {
            return true;
        } // ignore unknown schemes, maybe another postfilter did it
        if (!$scheme_obj->browsable) {
            return true;
        } // ignore non-browseable schemes, since we can't munge those in a reasonable way
        if ($uri->isBenign($config, $context)) {
            return true;
        } // don't redirect if a benign URL

        $this->makeReplace($uri, $config, $context);
        $this->replace = array_map('rawurlencode', $this->replace);

        $new_uri = strtr($this->target, $this->replace);
        $new_uri = $this->parser->parse($new_uri);
        // don't redirect if the target host is the same as the
        // starting host
        if ($uri->host === $new_uri->host) {
            return true;
        }
        $uri = $new_uri; // overwrite
        return true;
    }

    /**
     * @param HTMLPurifier_URI $uri
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     */
    protected function makeReplace($uri, $config, $context)
    {
        $string = $uri->toString();
        // always available
        $this->replace['%s'] = $string;
        $this->replace['%r'] = $context->get('EmbeddedURI', true);
        $token = $context->get('CurrentToken', true);
        $this->replace['%n'] = $token ? $token->name : null;
        $this->replace['%m'] = $context->get('CurrentAttr', true);
        $this->replace['%p'] = $context->get('CurrentCSSProperty', true);
        // not always available
        if ($this->secretKey) {
            $this->replace['%t'] = hash_hmac("sha256", $string, $this->secretKey);
        }
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/URIFilter/MakeAbsolute.php000064400000011541151214231100020056 0ustar00<?php

// does not support network paths

class HTMLPurifier_URIFilter_MakeAbsolute extends HTMLPurifier_URIFilter
{
    /**
     * @type string
     */
    public $name = 'MakeAbsolute';

    /**
     * @type
     */
    protected $base;

    /**
     * @type array
     */
    protected $basePathStack = array();

    /**
     * @param HTMLPurifier_Config $config
     * @return bool
     */
    public function prepare($config)
    {
        $def = $config->getDefinition('URI');
        $this->base = $def->base;
        if (is_null($this->base)) {
            trigger_error(
                'URI.MakeAbsolute is being ignored due to lack of ' .
                'value for URI.Base configuration',
                E_USER_WARNING
            );
            return false;
        }
        $this->base->fragment = null; // fragment is invalid for base URI
        $stack = explode('/', $this->base->path);
        array_pop($stack); // discard last segment
        $stack = $this->_collapseStack($stack); // do pre-parsing
        $this->basePathStack = $stack;
        return true;
    }

    /**
     * @param HTMLPurifier_URI $uri
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool
     */
    public function filter(&$uri, $config, $context)
    {
        if (is_null($this->base)) {
            return true;
        } // abort early
        if ($uri->path === '' && is_null($uri->scheme) &&
            is_null($uri->host) && is_null($uri->query) && is_null($uri->fragment)) {
            // reference to current document
            $uri = clone $this->base;
            return true;
        }
        if (!is_null($uri->scheme)) {
            // absolute URI already: don't change
            if (!is_null($uri->host)) {
                return true;
            }
            $scheme_obj = $uri->getSchemeObj($config, $context);
            if (!$scheme_obj) {
                // scheme not recognized
                return false;
            }
            if (!$scheme_obj->hierarchical) {
                // non-hierarchal URI with explicit scheme, don't change
                return true;
            }
            // special case: had a scheme but always is hierarchical and had no authority
        }
        if (!is_null($uri->host)) {
            // network path, don't bother
            return true;
        }
        if ($uri->path === '') {
            $uri->path = $this->base->path;
        } elseif ($uri->path[0] !== '/') {
            // relative path, needs more complicated processing
            $stack = explode('/', $uri->path);
            $new_stack = array_merge($this->basePathStack, $stack);
            if ($new_stack[0] !== '' && !is_null($this->base->host)) {
                array_unshift($new_stack, '');
            }
            $new_stack = $this->_collapseStack($new_stack);
            $uri->path = implode('/', $new_stack);
        } else {
            // absolute path, but still we should collapse
            $uri->path = implode('/', $this->_collapseStack(explode('/', $uri->path)));
        }
        // re-combine
        $uri->scheme = $this->base->scheme;
        if (is_null($uri->userinfo)) {
            $uri->userinfo = $this->base->userinfo;
        }
        if (is_null($uri->host)) {
            $uri->host = $this->base->host;
        }
        if (is_null($uri->port)) {
            $uri->port = $this->base->port;
        }
        return true;
    }

    /**
     * Resolve dots and double-dots in a path stack
     * @param array $stack
     * @return array
     */
    private function _collapseStack($stack)
    {
        $result = array();
        $is_folder = false;
        for ($i = 0; isset($stack[$i]); $i++) {
            $is_folder = false;
            // absorb an internally duplicated slash
            if ($stack[$i] == '' && $i && isset($stack[$i + 1])) {
                continue;
            }
            if ($stack[$i] == '..') {
                if (!empty($result)) {
                    $segment = array_pop($result);
                    if ($segment === '' && empty($result)) {
                        // error case: attempted to back out too far:
                        // restore the leading slash
                        $result[] = '';
                    } elseif ($segment === '..') {
                        $result[] = '..'; // cannot remove .. with ..
                    }
                } else {
                    // relative path, preserve the double-dots
                    $result[] = '..';
                }
                $is_folder = true;
                continue;
            }
            if ($stack[$i] == '.') {
                // silently absorb
                $is_folder = true;
                continue;
            }
            $result[] = $stack[$i];
        }
        if ($is_folder) {
            $result[] = '';
        }
        return $result;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/URIFilter/DisableResources.php000064400000000716151214231100020742 0ustar00<?php

class HTMLPurifier_URIFilter_DisableResources extends HTMLPurifier_URIFilter
{
    /**
     * @type string
     */
    public $name = 'DisableResources';

    /**
     * @param HTMLPurifier_URI $uri
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool
     */
    public function filter(&$uri, $config, $context)
    {
        return !$context->get('EmbeddedURI', true);
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternalResources.php000064400000001110151214231100022432 0ustar00<?php

class HTMLPurifier_URIFilter_DisableExternalResources extends HTMLPurifier_URIFilter_DisableExternal
{
    /**
     * @type string
     */
    public $name = 'DisableExternalResources';

    /**
     * @param HTMLPurifier_URI $uri
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool
     */
    public function filter(&$uri, $config, $context)
    {
        if (!$context->get('EmbeddedURI', true)) {
            return true;
        }
        return parent::filter($uri, $config, $context);
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/URIFilter/HostBlacklist.php000064400000002200151214231100020240 0ustar00<?php

// It's not clear to me whether or not Punycode means that hostnames
// do not have canonical forms anymore. As far as I can tell, it's
// not a problem (punycoding should be identity when no Unicode
// points are involved), but I'm not 100% sure
class HTMLPurifier_URIFilter_HostBlacklist extends HTMLPurifier_URIFilter
{
    /**
     * @type string
     */
    public $name = 'HostBlacklist';

    /**
     * @type array
     */
    protected $blacklist = array();

    /**
     * @param HTMLPurifier_Config $config
     * @return bool
     */
    public function prepare($config)
    {
        $this->blacklist = $config->get('URI.HostBlacklist');
        return true;
    }

    /**
     * @param HTMLPurifier_URI $uri
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool
     */
    public function filter(&$uri, $config, $context)
    {
        foreach ($this->blacklist as $blacklisted_host_fragment) {
            if (strpos($uri->host, $blacklisted_host_fragment) !== false) {
                return false;
            }
        }
        return true;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/TagTransform.php000064400000002112151214231100016276 0ustar00<?php

/**
 * Defines a mutation of an obsolete tag into a valid tag.
 */
abstract class HTMLPurifier_TagTransform
{

    /**
     * Tag name to transform the tag to.
     * @type string
     */
    public $transform_to;

    /**
     * Transforms the obsolete tag into the valid tag.
     * @param HTMLPurifier_Token_Tag $tag Tag to be transformed.
     * @param HTMLPurifier_Config $config Mandatory HTMLPurifier_Config object
     * @param HTMLPurifier_Context $context Mandatory HTMLPurifier_Context object
     */
    abstract public function transform($tag, $config, $context);

    /**
     * Prepends CSS properties to the style attribute, creating the
     * attribute if it doesn't exist.
     * @warning Copied over from AttrTransform, be sure to keep in sync
     * @param array $attr Attribute array to process (passed by reference)
     * @param string $css CSS to prepend
     */
    protected function prependCSS(&$attr, $css)
    {
        $attr['style'] = isset($attr['style']) ? $attr['style'] : '';
        $attr['style'] = $css . $attr['style'];
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef.php000064400000012113151214231100015222 0ustar00<?php

/**
 * Base class for all validating attribute definitions.
 *
 * This family of classes forms the core for not only HTML attribute validation,
 * but also any sort of string that needs to be validated or cleaned (which
 * means CSS properties and composite definitions are defined here too).
 * Besides defining (through code) what precisely makes the string valid,
 * subclasses are also responsible for cleaning the code if possible.
 */

abstract class HTMLPurifier_AttrDef
{

    /**
     * Tells us whether or not an HTML attribute is minimized.
     * Has no meaning in other contexts.
     * @type bool
     */
    public $minimized = false;

    /**
     * Tells us whether or not an HTML attribute is required.
     * Has no meaning in other contexts
     * @type bool
     */
    public $required = false;

    /**
     * Validates and cleans passed string according to a definition.
     *
     * @param string $string String to be validated and cleaned.
     * @param HTMLPurifier_Config $config Mandatory HTMLPurifier_Config object.
     * @param HTMLPurifier_Context $context Mandatory HTMLPurifier_Context object.
     */
    abstract public function validate($string, $config, $context);

    /**
     * Convenience method that parses a string as if it were CDATA.
     *
     * This method process a string in the manner specified at
     * <http://www.w3.org/TR/html4/types.html#h-6.2> by removing
     * leading and trailing whitespace, ignoring line feeds, and replacing
     * carriage returns and tabs with spaces.  While most useful for HTML
     * attributes specified as CDATA, it can also be applied to most CSS
     * values.
     *
     * @note This method is not entirely standards compliant, as trim() removes
     *       more types of whitespace than specified in the spec. In practice,
     *       this is rarely a problem, as those extra characters usually have
     *       already been removed by HTMLPurifier_Encoder.
     *
     * @warning This processing is inconsistent with XML's whitespace handling
     *          as specified by section 3.3.3 and referenced XHTML 1.0 section
     *          4.7.  However, note that we are NOT necessarily
     *          parsing XML, thus, this behavior may still be correct. We
     *          assume that newlines have been normalized.
     */
    public function parseCDATA($string)
    {
        $string = trim($string);
        $string = str_replace(array("\n", "\t", "\r"), ' ', $string);
        return $string;
    }

    /**
     * Factory method for creating this class from a string.
     * @param string $string String construction info
     * @return HTMLPurifier_AttrDef Created AttrDef object corresponding to $string
     */
    public function make($string)
    {
        // default implementation, return a flyweight of this object.
        // If $string has an effect on the returned object (i.e. you
        // need to overload this method), it is best
        // to clone or instantiate new copies. (Instantiation is safer.)
        return $this;
    }

    /**
     * Removes spaces from rgb(0, 0, 0) so that shorthand CSS properties work
     * properly. THIS IS A HACK!
     * @param string $string a CSS colour definition
     * @return string
     */
    protected function mungeRgb($string)
    {
        $p = '\s*(\d+(\.\d+)?([%]?))\s*';

        if (preg_match('/(rgba|hsla)\(/', $string)) {
            return preg_replace('/(rgba|hsla)\('.$p.','.$p.','.$p.','.$p.'\)/', '\1(\2,\5,\8,\11)', $string);
        }

        return preg_replace('/(rgb|hsl)\('.$p.','.$p.','.$p.'\)/', '\1(\2,\5,\8)', $string);
    }

    /**
     * Parses a possibly escaped CSS string and returns the "pure"
     * version of it.
     */
    protected function expandCSSEscape($string)
    {
        // flexibly parse it
        $ret = '';
        for ($i = 0, $c = strlen($string); $i < $c; $i++) {
            if ($string[$i] === '\\') {
                $i++;
                if ($i >= $c) {
                    $ret .= '\\';
                    break;
                }
                if (ctype_xdigit($string[$i])) {
                    $code = $string[$i];
                    for ($a = 1, $i++; $i < $c && $a < 6; $i++, $a++) {
                        if (!ctype_xdigit($string[$i])) {
                            break;
                        }
                        $code .= $string[$i];
                    }
                    // We have to be extremely careful when adding
                    // new characters, to make sure we're not breaking
                    // the encoding.
                    $char = HTMLPurifier_Encoder::unichr(hexdec($code));
                    if (HTMLPurifier_Encoder::cleanUTF8($char) === '') {
                        continue;
                    }
                    $ret .= $char;
                    if ($i < $c && trim($string[$i]) !== '') {
                        $i--;
                    }
                    continue;
                }
                if ($string[$i] === "\n") {
                    continue;
                }
            }
            $ret .= $string[$i];
        }
        return $ret;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Injector/Linkify.php000064400000003753151214231100017065 0ustar00<?php

/**
 * Injector that converts http, https and ftp text URLs to actual links.
 */
class HTMLPurifier_Injector_Linkify extends HTMLPurifier_Injector
{
    /**
     * @type string
     */
    public $name = 'Linkify';

    /**
     * @type array
     */
    public $needed = array('a' => array('href'));

    /**
     * @param HTMLPurifier_Token $token
     */
    public function handleText(&$token)
    {
        if (!$this->allowsElement('a')) {
            return;
        }

        if (strpos($token->data, '://') === false) {
            // our really quick heuristic failed, abort
            // this may not work so well if we want to match things like
            // "google.com", but then again, most people don't
            return;
        }

        // there is/are URL(s). Let's split the string.
        // We use this regex:
        // https://gist.github.com/gruber/249502
        // but with @cscott's backtracking fix and also
        // the Unicode characters un-Unicodified.
        $bits = preg_split(
            '/\\b((?:[a-z][\\w\\-]+:(?:\\/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}\\/)(?:[^\\s()<>]|\\((?:[^\\s()<>]|(?:\\([^\\s()<>]+\\)))*\\))+(?:\\((?:[^\\s()<>]|(?:\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:\'".,<>?\x{00ab}\x{00bb}\x{201c}\x{201d}\x{2018}\x{2019}]))/iu',
            $token->data, -1, PREG_SPLIT_DELIM_CAPTURE);


        $token = array();

        // $i = index
        // $c = count
        // $l = is link
        for ($i = 0, $c = count($bits), $l = false; $i < $c; $i++, $l = !$l) {
            if (!$l) {
                if ($bits[$i] === '') {
                    continue;
                }
                $token[] = new HTMLPurifier_Token_Text($bits[$i]);
            } else {
                $token[] = new HTMLPurifier_Token_Start('a', array('href' => $bits[$i]));
                $token[] = new HTMLPurifier_Token_Text($bits[$i]);
                $token[] = new HTMLPurifier_Token_End('a');
            }
        }
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Injector/AutoParagraph.php000064400000032744151214231100020220 0ustar00<?php

/**
 * Injector that auto paragraphs text in the root node based on
 * double-spacing.
 * @todo Ensure all states are unit tested, including variations as well.
 * @todo Make a graph of the flow control for this Injector.
 */
class HTMLPurifier_Injector_AutoParagraph extends HTMLPurifier_Injector
{
    /**
     * @type string
     */
    public $name = 'AutoParagraph';

    /**
     * @type array
     */
    public $needed = array('p');

    /**
     * @return HTMLPurifier_Token_Start
     */
    private function _pStart()
    {
        $par = new HTMLPurifier_Token_Start('p');
        $par->armor['MakeWellFormed_TagClosedError'] = true;
        return $par;
    }

    /**
     * @param HTMLPurifier_Token_Text $token
     */
    public function handleText(&$token)
    {
        $text = $token->data;
        // Does the current parent allow <p> tags?
        if ($this->allowsElement('p')) {
            if (empty($this->currentNesting) || strpos($text, "\n\n") !== false) {
                // Note that we have differing behavior when dealing with text
                // in the anonymous root node, or a node inside the document.
                // If the text as a double-newline, the treatment is the same;
                // if it doesn't, see the next if-block if you're in the document.

                $i = $nesting = null;
                if (!$this->forwardUntilEndToken($i, $current, $nesting) && $token->is_whitespace) {
                    // State 1.1: ...    ^ (whitespace, then document end)
                    //               ----
                    // This is a degenerate case
                } else {
                    if (!$token->is_whitespace || $this->_isInline($current)) {
                        // State 1.2: PAR1
                        //            ----

                        // State 1.3: PAR1\n\nPAR2
                        //            ------------

                        // State 1.4: <div>PAR1\n\nPAR2 (see State 2)
                        //                 ------------
                        $token = array($this->_pStart());
                        $this->_splitText($text, $token);
                    } else {
                        // State 1.5: \n<hr />
                        //            --
                    }
                }
            } else {
                // State 2:   <div>PAR1... (similar to 1.4)
                //                 ----

                // We're in an element that allows paragraph tags, but we're not
                // sure if we're going to need them.
                if ($this->_pLookAhead()) {
                    // State 2.1: <div>PAR1<b>PAR1\n\nPAR2
                    //                 ----
                    // Note: This will always be the first child, since any
                    // previous inline element would have triggered this very
                    // same routine, and found the double newline. One possible
                    // exception would be a comment.
                    $token = array($this->_pStart(), $token);
                } else {
                    // State 2.2.1: <div>PAR1<div>
                    //                   ----

                    // State 2.2.2: <div>PAR1<b>PAR1</b></div>
                    //                   ----
                }
            }
            // Is the current parent a <p> tag?
        } elseif (!empty($this->currentNesting) &&
            $this->currentNesting[count($this->currentNesting) - 1]->name == 'p') {
            // State 3.1: ...<p>PAR1
            //                  ----

            // State 3.2: ...<p>PAR1\n\nPAR2
            //                  ------------
            $token = array();
            $this->_splitText($text, $token);
            // Abort!
        } else {
            // State 4.1: ...<b>PAR1
            //                  ----

            // State 4.2: ...<b>PAR1\n\nPAR2
            //                  ------------
        }
    }

    /**
     * @param HTMLPurifier_Token $token
     */
    public function handleElement(&$token)
    {
        // We don't have to check if we're already in a <p> tag for block
        // tokens, because the tag would have been autoclosed by MakeWellFormed.
        if ($this->allowsElement('p')) {
            if (!empty($this->currentNesting)) {
                if ($this->_isInline($token)) {
                    // State 1: <div>...<b>
                    //                  ---
                    // Check if this token is adjacent to the parent token
                    // (seek backwards until token isn't whitespace)
                    $i = null;
                    $this->backward($i, $prev);

                    if (!$prev instanceof HTMLPurifier_Token_Start) {
                        // Token wasn't adjacent
                        if ($prev instanceof HTMLPurifier_Token_Text &&
                            substr($prev->data, -2) === "\n\n"
                        ) {
                            // State 1.1.4: <div><p>PAR1</p>\n\n<b>
                            //                                  ---
                            // Quite frankly, this should be handled by splitText
                            $token = array($this->_pStart(), $token);
                        } else {
                            // State 1.1.1: <div><p>PAR1</p><b>
                            //                              ---
                            // State 1.1.2: <div><br /><b>
                            //                         ---
                            // State 1.1.3: <div>PAR<b>
                            //                      ---
                        }
                    } else {
                        // State 1.2.1: <div><b>
                        //                   ---
                        // Lookahead to see if <p> is needed.
                        if ($this->_pLookAhead()) {
                            // State 1.3.1: <div><b>PAR1\n\nPAR2
                            //                   ---
                            $token = array($this->_pStart(), $token);
                        } else {
                            // State 1.3.2: <div><b>PAR1</b></div>
                            //                   ---

                            // State 1.3.3: <div><b>PAR1</b><div></div>\n\n</div>
                            //                   ---
                        }
                    }
                } else {
                    // State 2.3: ...<div>
                    //               -----
                }
            } else {
                if ($this->_isInline($token)) {
                    // State 3.1: <b>
                    //            ---
                    // This is where the {p} tag is inserted, not reflected in
                    // inputTokens yet, however.
                    $token = array($this->_pStart(), $token);
                } else {
                    // State 3.2: <div>
                    //            -----
                }

                $i = null;
                if ($this->backward($i, $prev)) {
                    if (!$prev instanceof HTMLPurifier_Token_Text) {
                        // State 3.1.1: ...</p>{p}<b>
                        //                        ---
                        // State 3.2.1: ...</p><div>
                        //                     -----
                        if (!is_array($token)) {
                            $token = array($token);
                        }
                        array_unshift($token, new HTMLPurifier_Token_Text("\n\n"));
                    } else {
                        // State 3.1.2: ...</p>\n\n{p}<b>
                        //                            ---
                        // State 3.2.2: ...</p>\n\n<div>
                        //                         -----
                        // Note: PAR<ELEM> cannot occur because PAR would have been
                        // wrapped in <p> tags.
                    }
                }
            }
        } else {
            // State 2.2: <ul><li>
            //                ----
            // State 2.4: <p><b>
            //               ---
        }
    }

    /**
     * Splits up a text in paragraph tokens and appends them
     * to the result stream that will replace the original
     * @param string $data String text data that will be processed
     *    into paragraphs
     * @param HTMLPurifier_Token[] $result Reference to array of tokens that the
     *    tags will be appended onto
     */
    private function _splitText($data, &$result)
    {
        $raw_paragraphs = explode("\n\n", $data);
        $paragraphs = array(); // without empty paragraphs
        $needs_start = false;
        $needs_end = false;

        $c = count($raw_paragraphs);
        if ($c == 1) {
            // There were no double-newlines, abort quickly. In theory this
            // should never happen.
            $result[] = new HTMLPurifier_Token_Text($data);
            return;
        }
        for ($i = 0; $i < $c; $i++) {
            $par = $raw_paragraphs[$i];
            if (trim($par) !== '') {
                $paragraphs[] = $par;
            } else {
                if ($i == 0) {
                    // Double newline at the front
                    if (empty($result)) {
                        // The empty result indicates that the AutoParagraph
                        // injector did not add any start paragraph tokens.
                        // This means that we have been in a paragraph for
                        // a while, and the newline means we should start a new one.
                        $result[] = new HTMLPurifier_Token_End('p');
                        $result[] = new HTMLPurifier_Token_Text("\n\n");
                        // However, the start token should only be added if
                        // there is more processing to be done (i.e. there are
                        // real paragraphs in here). If there are none, the
                        // next start paragraph tag will be handled by the
                        // next call to the injector
                        $needs_start = true;
                    } else {
                        // We just started a new paragraph!
                        // Reinstate a double-newline for presentation's sake, since
                        // it was in the source code.
                        array_unshift($result, new HTMLPurifier_Token_Text("\n\n"));
                    }
                } elseif ($i + 1 == $c) {
                    // Double newline at the end
                    // There should be a trailing </p> when we're finally done.
                    $needs_end = true;
                }
            }
        }

        // Check if this was just a giant blob of whitespace. Move this earlier,
        // perhaps?
        if (empty($paragraphs)) {
            return;
        }

        // Add the start tag indicated by \n\n at the beginning of $data
        if ($needs_start) {
            $result[] = $this->_pStart();
        }

        // Append the paragraphs onto the result
        foreach ($paragraphs as $par) {
            $result[] = new HTMLPurifier_Token_Text($par);
            $result[] = new HTMLPurifier_Token_End('p');
            $result[] = new HTMLPurifier_Token_Text("\n\n");
            $result[] = $this->_pStart();
        }

        // Remove trailing start token; Injector will handle this later if
        // it was indeed needed. This prevents from needing to do a lookahead,
        // at the cost of a lookbehind later.
        array_pop($result);

        // If there is no need for an end tag, remove all of it and let
        // MakeWellFormed close it later.
        if (!$needs_end) {
            array_pop($result); // removes \n\n
            array_pop($result); // removes </p>
        }
    }

    /**
     * Returns true if passed token is inline (and, ergo, allowed in
     * paragraph tags)
     * @param HTMLPurifier_Token $token
     * @return bool
     */
    private function _isInline($token)
    {
        return isset($this->htmlDefinition->info['p']->child->elements[$token->name]);
    }

    /**
     * Looks ahead in the token list and determines whether or not we need
     * to insert a <p> tag.
     * @return bool
     */
    private function _pLookAhead()
    {
        if ($this->currentToken instanceof HTMLPurifier_Token_Start) {
            $nesting = 1;
        } else {
            $nesting = 0;
        }
        $ok = false;
        $i = null;
        while ($this->forwardUntilEndToken($i, $current, $nesting)) {
            $result = $this->_checkNeedsP($current);
            if ($result !== null) {
                $ok = $result;
                break;
            }
        }
        return $ok;
    }

    /**
     * Determines if a particular token requires an earlier inline token
     * to get a paragraph. This should be used with _forwardUntilEndToken
     * @param HTMLPurifier_Token $current
     * @return bool
     */
    private function _checkNeedsP($current)
    {
        if ($current instanceof HTMLPurifier_Token_Start) {
            if (!$this->_isInline($current)) {
                // <div>PAR1<div>
                //      ----
                // Terminate early, since we hit a block element
                return false;
            }
        } elseif ($current instanceof HTMLPurifier_Token_Text) {
            if (strpos($current->data, "\n\n") !== false) {
                // <div>PAR1<b>PAR1\n\nPAR2
                //      ----
                return true;
            } else {
                // <div>PAR1<b>PAR1...
                //      ----
            }
        }
        return null;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Injector/PurifierLinkify.php000064400000003423151214231100020565 0ustar00<?php

/**
 * Injector that converts configuration directive syntax %Namespace.Directive
 * to links
 */
class HTMLPurifier_Injector_PurifierLinkify extends HTMLPurifier_Injector
{
    /**
     * @type string
     */
    public $name = 'PurifierLinkify';

    /**
     * @type string
     */
    public $docURL;

    /**
     * @type array
     */
    public $needed = array('a' => array('href'));

    /**
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return string
     */
    public function prepare($config, $context)
    {
        $this->docURL = $config->get('AutoFormat.PurifierLinkify.DocURL');
        return parent::prepare($config, $context);
    }

    /**
     * @param HTMLPurifier_Token $token
     */
    public function handleText(&$token)
    {
        if (!$this->allowsElement('a')) {
            return;
        }
        if (strpos($token->data, '%') === false) {
            return;
        }

        $bits = preg_split('#%([a-z0-9]+\.[a-z0-9]+)#Si', $token->data, -1, PREG_SPLIT_DELIM_CAPTURE);
        $token = array();

        // $i = index
        // $c = count
        // $l = is link
        for ($i = 0, $c = count($bits), $l = false; $i < $c; $i++, $l = !$l) {
            if (!$l) {
                if ($bits[$i] === '') {
                    continue;
                }
                $token[] = new HTMLPurifier_Token_Text($bits[$i]);
            } else {
                $token[] = new HTMLPurifier_Token_Start(
                    'a',
                    array('href' => str_replace('%s', $bits[$i], $this->docURL))
                );
                $token[] = new HTMLPurifier_Token_Text('%' . $bits[$i]);
                $token[] = new HTMLPurifier_Token_End('a');
            }
        }
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Injector/DisplayLinkURI.php000064400000001533151214231100020255 0ustar00<?php

/**
 * Injector that displays the URL of an anchor instead of linking to it, in addition to showing the text of the link.
 */
class HTMLPurifier_Injector_DisplayLinkURI extends HTMLPurifier_Injector
{
    /**
     * @type string
     */
    public $name = 'DisplayLinkURI';

    /**
     * @type array
     */
    public $needed = array('a');

    /**
     * @param $token
     */
    public function handleElement(&$token)
    {
    }

    /**
     * @param HTMLPurifier_Token $token
     */
    public function handleEnd(&$token)
    {
        if (isset($token->start->attr['href'])) {
            $url = $token->start->attr['href'];
            unset($token->start->attr['href']);
            $token = array($token, new HTMLPurifier_Token_Text(" ($url)"));
        } else {
            // nothing to display
        }
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Injector/SafeObject.php000064400000007557151214231100017473 0ustar00<?php

/**
 * Adds important param elements to inside of object in order to make
 * things safe.
 */
class HTMLPurifier_Injector_SafeObject extends HTMLPurifier_Injector
{
    /**
     * @type string
     */
    public $name = 'SafeObject';

    /**
     * @type array
     */
    public $needed = array('object', 'param');

    /**
     * @type array
     */
    protected $objectStack = array();

    /**
     * @type array
     */
    protected $paramStack = array();

    /**
     * Keep this synchronized with AttrTransform/SafeParam.php.
     * @type array
     */
    protected $addParam = array(
        'allowScriptAccess' => 'never',
        'allowNetworking' => 'internal',
    );

    /**
     * These are all lower-case keys.
     * @type array
     */
    protected $allowedParam = array(
        'wmode' => true,
        'movie' => true,
        'flashvars' => true,
        'src' => true,
        'allowfullscreen' => true, // if omitted, assume to be 'false'
    );

    /**
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return void
     */
    public function prepare($config, $context)
    {
        parent::prepare($config, $context);
    }

    /**
     * @param HTMLPurifier_Token $token
     */
    public function handleElement(&$token)
    {
        if ($token->name == 'object') {
            $this->objectStack[] = $token;
            $this->paramStack[] = array();
            $new = array($token);
            foreach ($this->addParam as $name => $value) {
                $new[] = new HTMLPurifier_Token_Empty('param', array('name' => $name, 'value' => $value));
            }
            $token = $new;
        } elseif ($token->name == 'param') {
            $nest = count($this->currentNesting) - 1;
            if ($nest >= 0 && $this->currentNesting[$nest]->name === 'object') {
                $i = count($this->objectStack) - 1;
                if (!isset($token->attr['name'])) {
                    $token = false;
                    return;
                }
                $n = $token->attr['name'];
                // We need this fix because YouTube doesn't supply a data
                // attribute, which we need if a type is specified. This is
                // *very* Flash specific.
                if (!isset($this->objectStack[$i]->attr['data']) &&
                    ($token->attr['name'] == 'movie' || $token->attr['name'] == 'src')
                ) {
                    $this->objectStack[$i]->attr['data'] = $token->attr['value'];
                }
                // Check if the parameter is the correct value but has not
                // already been added
                if (!isset($this->paramStack[$i][$n]) &&
                    isset($this->addParam[$n]) &&
                    $token->attr['name'] === $this->addParam[$n]) {
                    // keep token, and add to param stack
                    $this->paramStack[$i][$n] = true;
                } elseif (isset($this->allowedParam[strtolower($n)])) {
                    // keep token, don't do anything to it
                    // (could possibly check for duplicates here)
                    // Note: In principle, parameters should be case sensitive.
                    // But it seems they are not really; so accept any case.
                } else {
                    $token = false;
                }
            } else {
                // not directly inside an object, DENY!
                $token = false;
            }
        }
    }

    public function handleEnd(&$token)
    {
        // This is the WRONG way of handling the object and param stacks;
        // we should be inserting them directly on the relevant object tokens
        // so that the global stack handling handles it.
        if ($token->name == 'object') {
            array_pop($this->objectStack);
            array_pop($this->paramStack);
        }
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php000064400000003746151214231100023357 0ustar00<?php

/**
 * Injector that removes spans with no attributes
 */
class HTMLPurifier_Injector_RemoveSpansWithoutAttributes extends HTMLPurifier_Injector
{
    /**
     * @type string
     */
    public $name = 'RemoveSpansWithoutAttributes';

    /**
     * @type array
     */
    public $needed = array('span');

    /**
     * @type HTMLPurifier_AttrValidator
     */
    private $attrValidator;

    /**
     * Used by AttrValidator.
     * @type HTMLPurifier_Config
     */
    private $config;

    /**
     * @type HTMLPurifier_Context
     */
    private $context;

    public function prepare($config, $context)
    {
        $this->attrValidator = new HTMLPurifier_AttrValidator();
        $this->config = $config;
        $this->context = $context;
        return parent::prepare($config, $context);
    }

    /**
     * @param HTMLPurifier_Token $token
     */
    public function handleElement(&$token)
    {
        if ($token->name !== 'span' || !$token instanceof HTMLPurifier_Token_Start) {
            return;
        }

        // We need to validate the attributes now since this doesn't normally
        // happen until after MakeWellFormed. If all the attributes are removed
        // the span needs to be removed too.
        $this->attrValidator->validateToken($token, $this->config, $this->context);
        $token->armor['ValidateAttributes'] = true;

        if (!empty($token->attr)) {
            return;
        }

        $nesting = 0;
        while ($this->forwardUntilEndToken($i, $current, $nesting)) {
        }

        if ($current instanceof HTMLPurifier_Token_End && $current->name === 'span') {
            // Mark closing span tag for deletion
            $current->markForDeletion = true;
            // Delete open span tag
            $token = false;
        }
    }

    /**
     * @param HTMLPurifier_Token $token
     */
    public function handleEnd(&$token)
    {
        if ($token->markForDeletion) {
            $token = false;
        }
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Injector/RemoveEmpty.php000064400000006664151214231100017740 0ustar00<?php

class HTMLPurifier_Injector_RemoveEmpty extends HTMLPurifier_Injector
{
    /**
     * @type HTMLPurifier_Context
     */
    private $context;

    /**
     * @type HTMLPurifier_Config
     */
    private $config;

    /**
     * @type HTMLPurifier_AttrValidator
     */
    private $attrValidator;

    /**
     * @type bool
     */
    private $removeNbsp;

    /**
     * @type bool
     */
    private $removeNbspExceptions;

    /**
     * Cached contents of %AutoFormat.RemoveEmpty.Predicate
     * @type array
     */
    private $exclude;

    /**
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return void
     */
    public function prepare($config, $context)
    {
        parent::prepare($config, $context);
        $this->config = $config;
        $this->context = $context;
        $this->removeNbsp = $config->get('AutoFormat.RemoveEmpty.RemoveNbsp');
        $this->removeNbspExceptions = $config->get('AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions');
        $this->exclude = $config->get('AutoFormat.RemoveEmpty.Predicate');
        foreach ($this->exclude as $key => $attrs) {
            if (!is_array($attrs)) {
                // HACK, see HTMLPurifier/Printer/ConfigForm.php
                $this->exclude[$key] = explode(';', $attrs);
            }
        }
        $this->attrValidator = new HTMLPurifier_AttrValidator();
    }

    /**
     * @param HTMLPurifier_Token $token
     */
    public function handleElement(&$token)
    {
        if (!$token instanceof HTMLPurifier_Token_Start) {
            return;
        }
        $next = false;
        $deleted = 1; // the current tag
        for ($i = count($this->inputZipper->back) - 1; $i >= 0; $i--, $deleted++) {
            $next = $this->inputZipper->back[$i];
            if ($next instanceof HTMLPurifier_Token_Text) {
                if ($next->is_whitespace) {
                    continue;
                }
                if ($this->removeNbsp && !isset($this->removeNbspExceptions[$token->name])) {
                    $plain = str_replace("\xC2\xA0", "", $next->data);
                    $isWsOrNbsp = $plain === '' || ctype_space($plain);
                    if ($isWsOrNbsp) {
                        continue;
                    }
                }
            }
            break;
        }
        if (!$next || ($next instanceof HTMLPurifier_Token_End && $next->name == $token->name)) {
            $this->attrValidator->validateToken($token, $this->config, $this->context);
            $token->armor['ValidateAttributes'] = true;
            if (isset($this->exclude[$token->name])) {
                $r = true;
                foreach ($this->exclude[$token->name] as $elem) {
                    if (!isset($token->attr[$elem])) $r = false;
                }
                if ($r) return;
            }
            if (isset($token->attr['id']) || isset($token->attr['name'])) {
                return;
            }
            $token = $deleted + 1;
            for ($b = 0, $c = count($this->inputZipper->front); $b < $c; $b++) {
                $prev = $this->inputZipper->front[$b];
                if ($prev instanceof HTMLPurifier_Token_Text && $prev->is_whitespace) {
                    continue;
                }
                break;
            }
            // This is safe because we removed the token that triggered this.
            $this->rewindOffset($b+$deleted);
            return;
        }
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Node/Element.php000064400000003275151214231100016160 0ustar00<?php

/**
 * Concrete element node class.
 */
class HTMLPurifier_Node_Element extends HTMLPurifier_Node
{
    /**
     * The lower-case name of the tag, like 'a', 'b' or 'blockquote'.
     *
     * @note Strictly speaking, XML tags are case sensitive, so we shouldn't
     * be lower-casing them, but these tokens cater to HTML tags, which are
     * insensitive.
     * @type string
     */
    public $name;

    /**
     * Associative array of the node's attributes.
     * @type array
     */
    public $attr = array();

    /**
     * List of child elements.
     * @type array
     */
    public $children = array();

    /**
     * Does this use the <a></a> form or the </a> form, i.e.
     * is it a pair of start/end tokens or an empty token.
     * @bool
     */
    public $empty = false;

    public $endCol = null, $endLine = null, $endArmor = array();

    public function __construct($name, $attr = array(), $line = null, $col = null, $armor = array()) {
        $this->name = $name;
        $this->attr = $attr;
        $this->line = $line;
        $this->col = $col;
        $this->armor = $armor;
    }

    public function toTokenPair() {
        // XXX inefficiency here, normalization is not necessary
        if ($this->empty) {
            return array(new HTMLPurifier_Token_Empty($this->name, $this->attr, $this->line, $this->col, $this->armor), null);
        } else {
            $start = new HTMLPurifier_Token_Start($this->name, $this->attr, $this->line, $this->col, $this->armor);
            $end = new HTMLPurifier_Token_End($this->name, array(), $this->endLine, $this->endCol, $this->endArmor);
            //$end->start = $start;
            return array($start, $end);
        }
    }
}

htmlpurifier/library/HTMLPurifier/Node/Text.php000064400000002544151214231100015511 0ustar00<?php

/**
 * Concrete text token class.
 *
 * Text tokens comprise of regular parsed character data (PCDATA) and raw
 * character data (from the CDATA sections). Internally, their
 * data is parsed with all entities expanded. Surprisingly, the text token
 * does have a "tag name" called #PCDATA, which is how the DTD represents it
 * in permissible child nodes.
 */
class HTMLPurifier_Node_Text extends HTMLPurifier_Node
{

    /**
     * PCDATA tag name compatible with DTD, see
     * HTMLPurifier_ChildDef_Custom for details.
     * @type string
     */
    public $name = '#PCDATA';

    /**
     * @type string
     */
    public $data;
    /**< Parsed character data of text. */

    /**
     * @type bool
     */
    public $is_whitespace;

    /**< Bool indicating if node is whitespace. */

    /**
     * Constructor, accepts data and determines if it is whitespace.
     * @param string $data String parsed character data.
     * @param int $line
     * @param int $col
     */
    public function __construct($data, $is_whitespace, $line = null, $col = null)
    {
        $this->data = $data;
        $this->is_whitespace = $is_whitespace;
        $this->line = $line;
        $this->col = $col;
    }

    public function toTokenPair() {
        return array(new HTMLPurifier_Token_Text($this->data, $this->line, $this->col), null);
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Node/Comment.php000064400000001325151214231100016163 0ustar00<?php

/**
 * Concrete comment node class.
 */
class HTMLPurifier_Node_Comment extends HTMLPurifier_Node
{
    /**
     * Character data within comment.
     * @type string
     */
    public $data;

    /**
     * @type bool
     */
    public $is_whitespace = true;

    /**
     * Transparent constructor.
     *
     * @param string $data String comment data.
     * @param int $line
     * @param int $col
     */
    public function __construct($data, $line = null, $col = null)
    {
        $this->data = $data;
        $this->line = $line;
        $this->col = $col;
    }

    public function toTokenPair() {
        return array(new HTMLPurifier_Token_Comment($this->data, $this->line, $this->col), null);
    }
}
htmlpurifier/library/HTMLPurifier/Injector.php000064400000021456151214231100015460 0ustar00<?php

/**
 * Injects tokens into the document while parsing for well-formedness.
 * This enables "formatter-like" functionality such as auto-paragraphing,
 * smiley-ification and linkification to take place.
 *
 * A note on how handlers create changes; this is done by assigning a new
 * value to the $token reference. These values can take a variety of forms and
 * are best described HTMLPurifier_Strategy_MakeWellFormed->processToken()
 * documentation.
 *
 * @todo Allow injectors to request a re-run on their output. This
 *       would help if an operation is recursive.
 */
abstract class HTMLPurifier_Injector
{

    /**
     * Advisory name of injector, this is for friendly error messages.
     * @type string
     */
    public $name;

    /**
     * @type HTMLPurifier_HTMLDefinition
     */
    protected $htmlDefinition;

    /**
     * Reference to CurrentNesting variable in Context. This is an array
     * list of tokens that we are currently "inside"
     * @type array
     */
    protected $currentNesting;

    /**
     * Reference to current token.
     * @type HTMLPurifier_Token
     */
    protected $currentToken;

    /**
     * Reference to InputZipper variable in Context.
     * @type HTMLPurifier_Zipper
     */
    protected $inputZipper;

    /**
     * Array of elements and attributes this injector creates and therefore
     * need to be allowed by the definition. Takes form of
     * array('element' => array('attr', 'attr2'), 'element2')
     * @type array
     */
    public $needed = array();

    /**
     * Number of elements to rewind backwards (relative).
     * @type bool|int
     */
    protected $rewindOffset = false;

    /**
     * Rewind to a spot to re-perform processing. This is useful if you
     * deleted a node, and now need to see if this change affected any
     * earlier nodes. Rewinding does not affect other injectors, and can
     * result in infinite loops if not used carefully.
     * @param bool|int $offset
     * @warning HTML Purifier will prevent you from fast-forwarding with this
     *          function.
     */
    public function rewindOffset($offset)
    {
        $this->rewindOffset = $offset;
    }

    /**
     * Retrieves rewind offset, and then unsets it.
     * @return bool|int
     */
    public function getRewindOffset()
    {
        $r = $this->rewindOffset;
        $this->rewindOffset = false;
        return $r;
    }

    /**
     * Prepares the injector by giving it the config and context objects:
     * this allows references to important variables to be made within
     * the injector. This function also checks if the HTML environment
     * will work with the Injector (see checkNeeded()).
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string Boolean false if success, string of missing needed element/attribute if failure
     */
    public function prepare($config, $context)
    {
        $this->htmlDefinition = $config->getHTMLDefinition();
        // Even though this might fail, some unit tests ignore this and
        // still test checkNeeded, so be careful. Maybe get rid of that
        // dependency.
        $result = $this->checkNeeded($config);
        if ($result !== false) {
            return $result;
        }
        $this->currentNesting =& $context->get('CurrentNesting');
        $this->currentToken   =& $context->get('CurrentToken');
        $this->inputZipper    =& $context->get('InputZipper');
        return false;
    }

    /**
     * This function checks if the HTML environment
     * will work with the Injector: if p tags are not allowed, the
     * Auto-Paragraphing injector should not be enabled.
     * @param HTMLPurifier_Config $config
     * @return bool|string Boolean false if success, string of missing needed element/attribute if failure
     */
    public function checkNeeded($config)
    {
        $def = $config->getHTMLDefinition();
        foreach ($this->needed as $element => $attributes) {
            if (is_int($element)) {
                $element = $attributes;
            }
            if (!isset($def->info[$element])) {
                return $element;
            }
            if (!is_array($attributes)) {
                continue;
            }
            foreach ($attributes as $name) {
                if (!isset($def->info[$element]->attr[$name])) {
                    return "$element.$name";
                }
            }
        }
        return false;
    }

    /**
     * Tests if the context node allows a certain element
     * @param string $name Name of element to test for
     * @return bool True if element is allowed, false if it is not
     */
    public function allowsElement($name)
    {
        if (!empty($this->currentNesting)) {
            $parent_token = array_pop($this->currentNesting);
            $this->currentNesting[] = $parent_token;
            $parent = $this->htmlDefinition->info[$parent_token->name];
        } else {
            $parent = $this->htmlDefinition->info_parent_def;
        }
        if (!isset($parent->child->elements[$name]) || isset($parent->excludes[$name])) {
            return false;
        }
        // check for exclusion
        if (!empty($this->currentNesting)) {
            for ($i = count($this->currentNesting) - 2; $i >= 0; $i--) {
                $node = $this->currentNesting[$i];
                $def  = $this->htmlDefinition->info[$node->name];
                if (isset($def->excludes[$name])) {
                    return false;
                }
            }
        }
        return true;
    }

    /**
     * Iterator function, which starts with the next token and continues until
     * you reach the end of the input tokens.
     * @warning Please prevent previous references from interfering with this
     *          functions by setting $i = null beforehand!
     * @param int $i Current integer index variable for inputTokens
     * @param HTMLPurifier_Token $current Current token variable.
     *          Do NOT use $token, as that variable is also a reference
     * @return bool
     */
    protected function forward(&$i, &$current)
    {
        if ($i === null) {
            $i = count($this->inputZipper->back) - 1;
        } else {
            $i--;
        }
        if ($i < 0) {
            return false;
        }
        $current = $this->inputZipper->back[$i];
        return true;
    }

    /**
     * Similar to _forward, but accepts a third parameter $nesting (which
     * should be initialized at 0) and stops when we hit the end tag
     * for the node $this->inputIndex starts in.
     * @param int $i Current integer index variable for inputTokens
     * @param HTMLPurifier_Token $current Current token variable.
     *          Do NOT use $token, as that variable is also a reference
     * @param int $nesting
     * @return bool
     */
    protected function forwardUntilEndToken(&$i, &$current, &$nesting)
    {
        $result = $this->forward($i, $current);
        if (!$result) {
            return false;
        }
        if ($nesting === null) {
            $nesting = 0;
        }
        if ($current instanceof HTMLPurifier_Token_Start) {
            $nesting++;
        } elseif ($current instanceof HTMLPurifier_Token_End) {
            if ($nesting <= 0) {
                return false;
            }
            $nesting--;
        }
        return true;
    }

    /**
     * Iterator function, starts with the previous token and continues until
     * you reach the beginning of input tokens.
     * @warning Please prevent previous references from interfering with this
     *          functions by setting $i = null beforehand!
     * @param int $i Current integer index variable for inputTokens
     * @param HTMLPurifier_Token $current Current token variable.
     *          Do NOT use $token, as that variable is also a reference
     * @return bool
     */
    protected function backward(&$i, &$current)
    {
        if ($i === null) {
            $i = count($this->inputZipper->front) - 1;
        } else {
            $i--;
        }
        if ($i < 0) {
            return false;
        }
        $current = $this->inputZipper->front[$i];
        return true;
    }

    /**
     * Handler that is called when a text token is processed
     */
    public function handleText(&$token)
    {
    }

    /**
     * Handler that is called when a start or empty token is processed
     */
    public function handleElement(&$token)
    {
    }

    /**
     * Handler that is called when an end token is processed
     */
    public function handleEnd(&$token)
    {
        $this->notifyEnd($token);
    }

    /**
     * Notifier that is called when an end token is processed
     * @param HTMLPurifier_Token $token Current token variable.
     * @note This differs from handlers in that the token is read-only
     * @deprecated
     */
    public function notifyEnd($token)
    {
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Doctype.php000064400000003056151214231100015306 0ustar00<?php

/**
 * Represents a document type, contains information on which modules
 * need to be loaded.
 * @note This class is inspected by Printer_HTMLDefinition->renderDoctype.
 *       If structure changes, please update that function.
 */
class HTMLPurifier_Doctype
{
    /**
     * Full name of doctype
     * @type string
     */
    public $name;

    /**
     * List of standard modules (string identifiers or literal objects)
     * that this doctype uses
     * @type array
     */
    public $modules = array();

    /**
     * List of modules to use for tidying up code
     * @type array
     */
    public $tidyModules = array();

    /**
     * Is the language derived from XML (i.e. XHTML)?
     * @type bool
     */
    public $xml = true;

    /**
     * List of aliases for this doctype
     * @type array
     */
    public $aliases = array();

    /**
     * Public DTD identifier
     * @type string
     */
    public $dtdPublic;

    /**
     * System DTD identifier
     * @type string
     */
    public $dtdSystem;

    public function __construct(
        $name = null,
        $xml = true,
        $modules = array(),
        $tidyModules = array(),
        $aliases = array(),
        $dtd_public = null,
        $dtd_system = null
    ) {
        $this->name         = $name;
        $this->xml          = $xml;
        $this->modules      = $modules;
        $this->tidyModules  = $tidyModules;
        $this->aliases      = $aliases;
        $this->dtdPublic    = $dtd_public;
        $this->dtdSystem    = $dtd_system;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/TokenFactory.php000064400000006033151214231100016305 0ustar00<?php

/**
 * Factory for token generation.
 *
 * @note Doing some benchmarking indicates that the new operator is much
 *       slower than the clone operator (even discounting the cost of the
 *       constructor).  This class is for that optimization.
 *       Other then that, there's not much point as we don't
 *       maintain parallel HTMLPurifier_Token hierarchies (the main reason why
 *       you'd want to use an abstract factory).
 * @todo Port DirectLex to use this
 */
class HTMLPurifier_TokenFactory
{
    // p stands for prototype

    /**
     * @type HTMLPurifier_Token_Start
     */
    private $p_start;

    /**
     * @type HTMLPurifier_Token_End
     */
    private $p_end;

    /**
     * @type HTMLPurifier_Token_Empty
     */
    private $p_empty;

    /**
     * @type HTMLPurifier_Token_Text
     */
    private $p_text;

    /**
     * @type HTMLPurifier_Token_Comment
     */
    private $p_comment;

    /**
     * Generates blank prototypes for cloning.
     */
    public function __construct()
    {
        $this->p_start = new HTMLPurifier_Token_Start('', array());
        $this->p_end = new HTMLPurifier_Token_End('');
        $this->p_empty = new HTMLPurifier_Token_Empty('', array());
        $this->p_text = new HTMLPurifier_Token_Text('');
        $this->p_comment = new HTMLPurifier_Token_Comment('');
    }

    /**
     * Creates a HTMLPurifier_Token_Start.
     * @param string $name Tag name
     * @param array $attr Associative array of attributes
     * @return HTMLPurifier_Token_Start Generated HTMLPurifier_Token_Start
     */
    public function createStart($name, $attr = array())
    {
        $p = clone $this->p_start;
        $p->__construct($name, $attr);
        return $p;
    }

    /**
     * Creates a HTMLPurifier_Token_End.
     * @param string $name Tag name
     * @return HTMLPurifier_Token_End Generated HTMLPurifier_Token_End
     */
    public function createEnd($name)
    {
        $p = clone $this->p_end;
        $p->__construct($name);
        return $p;
    }

    /**
     * Creates a HTMLPurifier_Token_Empty.
     * @param string $name Tag name
     * @param array $attr Associative array of attributes
     * @return HTMLPurifier_Token_Empty Generated HTMLPurifier_Token_Empty
     */
    public function createEmpty($name, $attr = array())
    {
        $p = clone $this->p_empty;
        $p->__construct($name, $attr);
        return $p;
    }

    /**
     * Creates a HTMLPurifier_Token_Text.
     * @param string $data Data of text token
     * @return HTMLPurifier_Token_Text Generated HTMLPurifier_Token_Text
     */
    public function createText($data)
    {
        $p = clone $this->p_text;
        $p->__construct($data);
        return $p;
    }

    /**
     * Creates a HTMLPurifier_Token_Comment.
     * @param string $data Data of comment token
     * @return HTMLPurifier_Token_Comment Generated HTMLPurifier_Token_Comment
     */
    public function createComment($data)
    {
        $p = clone $this->p_comment;
        $p->__construct($data);
        return $p;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/CSS.php000064400000010363151214231100015657 0ustar00<?php

/**
 * Validates the HTML attribute style, otherwise known as CSS.
 * @note We don't implement the whole CSS specification, so it might be
 *       difficult to reuse this component in the context of validating
 *       actual stylesheet declarations.
 * @note If we were really serious about validating the CSS, we would
 *       tokenize the styles and then parse the tokens. Obviously, we
 *       are not doing that. Doing that could seriously harm performance,
 *       but would make these components a lot more viable for a CSS
 *       filtering solution.
 */
class HTMLPurifier_AttrDef_CSS extends HTMLPurifier_AttrDef
{

    /**
     * @param string $css
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string
     */
    public function validate($css, $config, $context)
    {
        $css = $this->parseCDATA($css);

        $definition = $config->getCSSDefinition();
        $allow_duplicates = $config->get("CSS.AllowDuplicates");


        // According to the CSS2.1 spec, the places where a
        // non-delimiting semicolon can appear are in strings
        // escape sequences.   So here is some dumb hack to
        // handle quotes.
        $len = strlen($css);
        $accum = "";
        $declarations = array();
        $quoted = false;
        for ($i = 0; $i < $len; $i++) {
            $c = strcspn($css, ";'\"", $i);
            $accum .= substr($css, $i, $c);
            $i += $c;
            if ($i == $len) break;
            $d = $css[$i];
            if ($quoted) {
                $accum .= $d;
                if ($d == $quoted) {
                    $quoted = false;
                }
            } else {
                if ($d == ";") {
                    $declarations[] = $accum;
                    $accum = "";
                } else {
                    $accum .= $d;
                    $quoted = $d;
                }
            }
        }
        if ($accum != "") $declarations[] = $accum;

        $propvalues = array();
        $new_declarations = '';

        /**
         * Name of the current CSS property being validated.
         */
        $property = false;
        $context->register('CurrentCSSProperty', $property);

        foreach ($declarations as $declaration) {
            if (!$declaration) {
                continue;
            }
            if (!strpos($declaration, ':')) {
                continue;
            }
            list($property, $value) = explode(':', $declaration, 2);
            $property = trim($property);
            $value = trim($value);
            $ok = false;
            do {
                if (isset($definition->info[$property])) {
                    $ok = true;
                    break;
                }
                if (ctype_lower($property)) {
                    break;
                }
                $property = strtolower($property);
                if (isset($definition->info[$property])) {
                    $ok = true;
                    break;
                }
            } while (0);
            if (!$ok) {
                continue;
            }
            // inefficient call, since the validator will do this again
            if (strtolower(trim($value)) !== 'inherit') {
                // inherit works for everything (but only on the base property)
                $result = $definition->info[$property]->validate(
                    $value,
                    $config,
                    $context
                );
            } else {
                $result = 'inherit';
            }
            if ($result === false) {
                continue;
            }
            if ($allow_duplicates) {
                $new_declarations .= "$property:$result;";
            } else {
                $propvalues[$property] = $result;
            }
        }

        $context->destroy('CurrentCSSProperty');

        // procedure does not write the new CSS simultaneously, so it's
        // slightly inefficient, but it's the only way of getting rid of
        // duplicates. Perhaps config to optimize it, but not now.

        foreach ($propvalues as $prop => $value) {
            $new_declarations .= "$prop:$value;";
        }

        return $new_declarations ? $new_declarations : false;

    }

}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/Switch.php000064400000002411151214231100016463 0ustar00<?php

/**
 * Decorator that, depending on a token, switches between two definitions.
 */
class HTMLPurifier_AttrDef_Switch
{

    /**
     * @type string
     */
    protected $tag;

    /**
     * @type HTMLPurifier_AttrDef
     */
    protected $withTag;

    /**
     * @type HTMLPurifier_AttrDef
     */
    protected $withoutTag;

    /**
     * @param string $tag Tag name to switch upon
     * @param HTMLPurifier_AttrDef $with_tag Call if token matches tag
     * @param HTMLPurifier_AttrDef $without_tag Call if token doesn't match, or there is no token
     */
    public function __construct($tag, $with_tag, $without_tag)
    {
        $this->tag = $tag;
        $this->withTag = $with_tag;
        $this->withoutTag = $without_tag;
    }

    /**
     * @param string $string
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string
     */
    public function validate($string, $config, $context)
    {
        $token = $context->get('CurrentToken', true);
        if (!$token || $token->name !== $this->tag) {
            return $this->withoutTag->validate($string, $config, $context);
        } else {
            return $this->withTag->validate($string, $config, $context);
        }
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/Integer.php000064400000004763151214231100016633 0ustar00<?php

/**
 * Validates an integer.
 * @note While this class was modeled off the CSS definition, no currently
 *       allowed CSS uses this type.  The properties that do are: widows,
 *       orphans, z-index, counter-increment, counter-reset.  Some of the
 *       HTML attributes, however, find use for a non-negative version of this.
 */
class HTMLPurifier_AttrDef_Integer extends HTMLPurifier_AttrDef
{

    /**
     * Whether or not negative values are allowed.
     * @type bool
     */
    protected $negative = true;

    /**
     * Whether or not zero is allowed.
     * @type bool
     */
    protected $zero = true;

    /**
     * Whether or not positive values are allowed.
     * @type bool
     */
    protected $positive = true;

    /**
     * @param $negative Bool indicating whether or not negative values are allowed
     * @param $zero Bool indicating whether or not zero is allowed
     * @param $positive Bool indicating whether or not positive values are allowed
     */
    public function __construct($negative = true, $zero = true, $positive = true)
    {
        $this->negative = $negative;
        $this->zero = $zero;
        $this->positive = $positive;
    }

    /**
     * @param string $integer
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string
     */
    public function validate($integer, $config, $context)
    {
        $integer = $this->parseCDATA($integer);
        if ($integer === '') {
            return false;
        }

        // we could possibly simply typecast it to integer, but there are
        // certain fringe cases that must not return an integer.

        // clip leading sign
        if ($this->negative && $integer[0] === '-') {
            $digits = substr($integer, 1);
            if ($digits === '0') {
                $integer = '0';
            } // rm minus sign for zero
        } elseif ($this->positive && $integer[0] === '+') {
            $digits = $integer = substr($integer, 1); // rm unnecessary plus
        } else {
            $digits = $integer;
        }

        // test if it's numeric
        if (!ctype_digit($digits)) {
            return false;
        }

        // perform scope tests
        if (!$this->zero && $integer == 0) {
            return false;
        }
        if (!$this->positive && $integer > 0) {
            return false;
        }
        if (!$this->negative && $integer < 0) {
            return false;
        }

        return $integer;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/URI.php000064400000005230151214231100015663 0ustar00<?php

/**
 * Validates a URI as defined by RFC 3986.
 * @note Scheme-specific mechanics deferred to HTMLPurifier_URIScheme
 */
class HTMLPurifier_AttrDef_URI extends HTMLPurifier_AttrDef
{

    /**
     * @type HTMLPurifier_URIParser
     */
    protected $parser;

    /**
     * @type bool
     */
    protected $embedsResource;

    /**
     * @param bool $embeds_resource Does the URI here result in an extra HTTP request?
     */
    public function __construct($embeds_resource = false)
    {
        $this->parser = new HTMLPurifier_URIParser();
        $this->embedsResource = (bool)$embeds_resource;
    }

    /**
     * @param string $string
     * @return HTMLPurifier_AttrDef_URI
     */
    public function make($string)
    {
        $embeds = ($string === 'embedded');
        return new HTMLPurifier_AttrDef_URI($embeds);
    }

    /**
     * @param string $uri
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string
     */
    public function validate($uri, $config, $context)
    {
        if ($config->get('URI.Disable')) {
            return false;
        }

        $uri = $this->parseCDATA($uri);

        // parse the URI
        $uri = $this->parser->parse($uri);
        if ($uri === false) {
            return false;
        }

        // add embedded flag to context for validators
        $context->register('EmbeddedURI', $this->embedsResource);

        $ok = false;
        do {

            // generic validation
            $result = $uri->validate($config, $context);
            if (!$result) {
                break;
            }

            // chained filtering
            $uri_def = $config->getDefinition('URI');
            $result = $uri_def->filter($uri, $config, $context);
            if (!$result) {
                break;
            }

            // scheme-specific validation
            $scheme_obj = $uri->getSchemeObj($config, $context);
            if (!$scheme_obj) {
                break;
            }
            if ($this->embedsResource && !$scheme_obj->browsable) {
                break;
            }
            $result = $scheme_obj->validate($uri, $config, $context);
            if (!$result) {
                break;
            }

            // Post chained filtering
            $result = $uri_def->postFilter($uri, $config, $context);
            if (!$result) {
                break;
            }

            // survived gauntlet
            $ok = true;

        } while (false);

        $context->destroy('EmbeddedURI');
        if (!$ok) {
            return false;
        }
        // back to string
        return $uri->toString();
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/Clone.php000064400000001550151214231100016265 0ustar00<?php

/**
 * Dummy AttrDef that mimics another AttrDef, BUT it generates clones
 * with make.
 */
class HTMLPurifier_AttrDef_Clone extends HTMLPurifier_AttrDef
{
    /**
     * What we're cloning.
     * @type HTMLPurifier_AttrDef
     */
    protected $clone;

    /**
     * @param HTMLPurifier_AttrDef $clone
     */
    public function __construct($clone)
    {
        $this->clone = $clone;
    }

    /**
     * @param string $v
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string
     */
    public function validate($v, $config, $context)
    {
        return $this->clone->validate($v, $config, $context);
    }

    /**
     * @param string $string
     * @return HTMLPurifier_AttrDef
     */
    public function make($string)
    {
        return clone $this->clone;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/Enum.php000064400000004243151214231100016133 0ustar00<?php

// Enum = Enumerated
/**
 * Validates a keyword against a list of valid values.
 * @warning The case-insensitive compare of this function uses PHP's
 *          built-in strtolower and ctype_lower functions, which may
 *          cause problems with international comparisons
 */
class HTMLPurifier_AttrDef_Enum extends HTMLPurifier_AttrDef
{

    /**
     * Lookup table of valid values.
     * @type array
     * @todo Make protected
     */
    public $valid_values = array();

    /**
     * Bool indicating whether or not enumeration is case sensitive.
     * @note In general this is always case insensitive.
     */
    protected $case_sensitive = false; // values according to W3C spec

    /**
     * @param array $valid_values List of valid values
     * @param bool $case_sensitive Whether or not case sensitive
     */
    public function __construct($valid_values = array(), $case_sensitive = false)
    {
        $this->valid_values = array_flip($valid_values);
        $this->case_sensitive = $case_sensitive;
    }

    /**
     * @param string $string
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string
     */
    public function validate($string, $config, $context)
    {
        $string = trim($string);
        if (!$this->case_sensitive) {
            // we may want to do full case-insensitive libraries
            $string = ctype_lower($string) ? $string : strtolower($string);
        }
        $result = isset($this->valid_values[$string]);

        return $result ? $string : false;
    }

    /**
     * @param string $string In form of comma-delimited list of case-insensitive
     *      valid values. Example: "foo,bar,baz". Prepend "s:" to make
     *      case sensitive
     * @return HTMLPurifier_AttrDef_Enum
     */
    public function make($string)
    {
        if (strlen($string) > 2 && $string[0] == 's' && $string[1] == ':') {
            $string = substr($string, 2);
            $sensitive = true;
        } else {
            $sensitive = false;
        }
        $values = explode(',', $string);
        return new HTMLPurifier_AttrDef_Enum($values, $sensitive);
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Color.php000064400000002253151214231100017050 0ustar00<?php

/**
 * Validates a color according to the HTML spec.
 */
class HTMLPurifier_AttrDef_HTML_Color extends HTMLPurifier_AttrDef
{

    /**
     * @param string $string
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string
     */
    public function validate($string, $config, $context)
    {
        static $colors = null;
        if ($colors === null) {
            $colors = $config->get('Core.ColorKeywords');
        }

        $string = trim($string);

        if (empty($string)) {
            return false;
        }
        $lower = strtolower($string);
        if (isset($colors[$lower])) {
            return $colors[$lower];
        }
        if ($string[0] === '#') {
            $hex = substr($string, 1);
        } else {
            $hex = $string;
        }

        $length = strlen($hex);
        if ($length !== 3 && $length !== 6) {
            return false;
        }
        if (!ctype_xdigit($hex)) {
            return false;
        }
        if ($length === 3) {
            $hex = $hex[0] . $hex[0] . $hex[1] . $hex[1] . $hex[2] . $hex[2];
        }
        return "#$hex";
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/HTML/MultiLength.php000064400000002464151214231100020232 0ustar00<?php

/**
 * Validates a MultiLength as defined by the HTML spec.
 *
 * A multilength is either a integer (pixel count), a percentage, or
 * a relative number.
 */
class HTMLPurifier_AttrDef_HTML_MultiLength extends HTMLPurifier_AttrDef_HTML_Length
{

    /**
     * @param string $string
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string
     */
    public function validate($string, $config, $context)
    {
        $string = trim($string);
        if ($string === '') {
            return false;
        }

        $parent_result = parent::validate($string, $config, $context);
        if ($parent_result !== false) {
            return $parent_result;
        }

        $length = strlen($string);
        $last_char = $string[$length - 1];

        if ($last_char !== '*') {
            return false;
        }

        $int = substr($string, 0, $length - 1);

        if ($int == '') {
            return '*';
        }
        if (!is_numeric($int)) {
            return false;
        }

        $int = (int)$int;
        if ($int < 0) {
            return false;
        }
        if ($int == 0) {
            return '0';
        }
        if ($int == 1) {
            return '*';
        }
        return ((string)$int) . '*';
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Class.php000064400000002715151214231100017042 0ustar00<?php

/**
 * Implements special behavior for class attribute (normally NMTOKENS)
 */
class HTMLPurifier_AttrDef_HTML_Class extends HTMLPurifier_AttrDef_HTML_Nmtokens
{
    /**
     * @param string $string
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string
     */
    protected function split($string, $config, $context)
    {
        // really, this twiddle should be lazy loaded
        $name = $config->getDefinition('HTML')->doctype->name;
        if ($name == "XHTML 1.1" || $name == "XHTML 2.0") {
            return parent::split($string, $config, $context);
        } else {
            return preg_split('/\s+/', $string);
        }
    }

    /**
     * @param array $tokens
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return array
     */
    protected function filter($tokens, $config, $context)
    {
        $allowed = $config->get('Attr.AllowedClasses');
        $forbidden = $config->get('Attr.ForbiddenClasses');
        $ret = array();
        foreach ($tokens as $token) {
            if (($allowed === null || isset($allowed[$token])) &&
                !isset($forbidden[$token]) &&
                // We need this O(n) check because of PHP's array
                // implementation that casts -0 to 0.
                !in_array($token, $ret, true)
            ) {
                $ret[] = $token;
            }
        }
        return $ret;
    }
}
htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Nmtokens.php000064400000004141151214231100017566 0ustar00<?php

/**
 * Validates contents based on NMTOKENS attribute type.
 */
class HTMLPurifier_AttrDef_HTML_Nmtokens extends HTMLPurifier_AttrDef
{

    /**
     * @param string $string
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string
     */
    public function validate($string, $config, $context)
    {
        $string = trim($string);

        // early abort: '' and '0' (strings that convert to false) are invalid
        if (!$string) {
            return false;
        }

        $tokens = $this->split($string, $config, $context);
        $tokens = $this->filter($tokens, $config, $context);
        if (empty($tokens)) {
            return false;
        }
        return implode(' ', $tokens);
    }

    /**
     * Splits a space separated list of tokens into its constituent parts.
     * @param string $string
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return array
     */
    protected function split($string, $config, $context)
    {
        // OPTIMIZABLE!
        // do the preg_match, capture all subpatterns for reformulation

        // we don't support U+00A1 and up codepoints or
        // escaping because I don't know how to do that with regexps
        // and plus it would complicate optimization efforts (you never
        // see that anyway).
        $pattern = '/(?:(?<=\s)|\A)' . // look behind for space or string start
            '((?:--|-?[A-Za-z_])[A-Za-z_\-0-9]*)' .
            '(?:(?=\s)|\z)/'; // look ahead for space or string end
        preg_match_all($pattern, $string, $matches);
        return $matches[1];
    }

    /**
     * Template method for removing certain tokens based on arbitrary criteria.
     * @note If we wanted to be really functional, we'd do an array_filter
     *       with a callback. But... we're not.
     * @param array $tokens
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return array
     */
    protected function filter($tokens, $config, $context)
    {
        return $tokens;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Bool.php000064400000001551151214231100016665 0ustar00<?php

/**
 * Validates a boolean attribute
 */
class HTMLPurifier_AttrDef_HTML_Bool extends HTMLPurifier_AttrDef
{

    /**
     * @type string
     */
    protected $name;

    /**
     * @type bool
     */
    public $minimized = true;

    /**
     * @param bool|string $name
     */
    public function __construct($name = false)
    {
        $this->name = $name;
    }

    /**
     * @param string $string
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string
     */
    public function validate($string, $config, $context)
    {
        return $this->name;
    }

    /**
     * @param string $string Name of attribute
     * @return HTMLPurifier_AttrDef_HTML_Bool
     */
    public function make($string)
    {
        return new HTMLPurifier_AttrDef_HTML_Bool($string);
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php000064400000003350151214231100017713 0ustar00<?php

/**
 * Validates a rel/rev link attribute against a directive of allowed values
 * @note We cannot use Enum because link types allow multiple
 *       values.
 * @note Assumes link types are ASCII text
 */
class HTMLPurifier_AttrDef_HTML_LinkTypes extends HTMLPurifier_AttrDef
{

    /**
     * Name config attribute to pull.
     * @type string
     */
    protected $name;

    /**
     * @param string $name
     */
    public function __construct($name)
    {
        $configLookup = array(
            'rel' => 'AllowedRel',
            'rev' => 'AllowedRev'
        );
        if (!isset($configLookup[$name])) {
            trigger_error(
                'Unrecognized attribute name for link ' .
                'relationship.',
                E_USER_ERROR
            );
            return;
        }
        $this->name = $configLookup[$name];
    }

    /**
     * @param string $string
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string
     */
    public function validate($string, $config, $context)
    {
        $allowed = $config->get('Attr.' . $this->name);
        if (empty($allowed)) {
            return false;
        }

        $string = $this->parseCDATA($string);
        $parts = explode(' ', $string);

        // lookup to prevent duplicates
        $ret_lookup = array();
        foreach ($parts as $part) {
            $part = strtolower(trim($part));
            if (!isset($allowed[$part])) {
                continue;
            }
            $ret_lookup[$part] = true;
        }

        if (empty($ret_lookup)) {
            return false;
        }
        $string = implode(' ', array_keys($ret_lookup));
        return $string;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php000064400000001502151214231100020167 0ustar00<?php

/**
 * Special-case enum attribute definition that lazy loads allowed frame targets
 */
class HTMLPurifier_AttrDef_HTML_FrameTarget extends HTMLPurifier_AttrDef_Enum
{

    /**
     * @type array
     */
    public $valid_values = false; // uninitialized value

    /**
     * @type bool
     */
    protected $case_sensitive = false;

    public function __construct()
    {
    }

    /**
     * @param string $string
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string
     */
    public function validate($string, $config, $context)
    {
        if ($this->valid_values === false) {
            $this->valid_values = $config->get('Attr.AllowedFrameTargets');
        }
        return parent::validate($string, $config, $context);
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/HTML/ID.php000064400000006204151214231100016266 0ustar00<?php

/**
 * Validates the HTML attribute ID.
 * @warning Even though this is the id processor, it
 *          will ignore the directive Attr:IDBlacklist, since it will only
 *          go according to the ID accumulator. Since the accumulator is
 *          automatically generated, it will have already absorbed the
 *          blacklist. If you're hacking around, make sure you use load()!
 */

class HTMLPurifier_AttrDef_HTML_ID extends HTMLPurifier_AttrDef
{

    // selector is NOT a valid thing to use for IDREFs, because IDREFs
    // *must* target IDs that exist, whereas selector #ids do not.

    /**
     * Determines whether or not we're validating an ID in a CSS
     * selector context.
     * @type bool
     */
    protected $selector;

    /**
     * @param bool $selector
     */
    public function __construct($selector = false)
    {
        $this->selector = $selector;
    }

    /**
     * @param string $id
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string
     */
    public function validate($id, $config, $context)
    {
        if (!$this->selector && !$config->get('Attr.EnableID')) {
            return false;
        }

        $id = trim($id); // trim it first

        if ($id === '') {
            return false;
        }

        $prefix = $config->get('Attr.IDPrefix');
        if ($prefix !== '') {
            $prefix .= $config->get('Attr.IDPrefixLocal');
            // prevent re-appending the prefix
            if (strpos($id, $prefix) !== 0) {
                $id = $prefix . $id;
            }
        } elseif ($config->get('Attr.IDPrefixLocal') !== '') {
            trigger_error(
                '%Attr.IDPrefixLocal cannot be used unless ' .
                '%Attr.IDPrefix is set',
                E_USER_WARNING
            );
        }

        if (!$this->selector) {
            $id_accumulator =& $context->get('IDAccumulator');
            if (isset($id_accumulator->ids[$id])) {
                return false;
            }
        }

        // we purposely avoid using regex, hopefully this is faster

        if ($config->get('Attr.ID.HTML5') === true) {
            if (preg_match('/[\t\n\x0b\x0c ]/', $id)) {
                return false;
            }
        } else {
            if (ctype_alpha($id)) {
                // OK
            } else {
                if (!ctype_alpha(@$id[0])) {
                    return false;
                }
                // primitive style of regexps, I suppose
                $trim = trim(
                    $id,
                    'A..Za..z0..9:-._'
                );
                if ($trim !== '') {
                    return false;
                }
            }
        }

        $regexp = $config->get('Attr.IDBlacklistRegexp');
        if ($regexp && preg_match($regexp, $id)) {
            return false;
        }

        if (!$this->selector) {
            $id_accumulator->add($id);
        }

        // if no change was made to the ID, return the result
        // else, return the new id if stripping whitespace made it
        //     valid, or return false.
        return $id;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Length.php000064400000002342151214231100017212 0ustar00<?php

/**
 * Validates the HTML type length (not to be confused with CSS's length).
 *
 * This accepts integer pixels or percentages as lengths for certain
 * HTML attributes.
 */

class HTMLPurifier_AttrDef_HTML_Length extends HTMLPurifier_AttrDef_HTML_Pixels
{

    /**
     * @param string $string
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string
     */
    public function validate($string, $config, $context)
    {
        $string = trim($string);
        if ($string === '') {
            return false;
        }

        $parent_result = parent::validate($string, $config, $context);
        if ($parent_result !== false) {
            return $parent_result;
        }

        $length = strlen($string);
        $last_char = $string[$length - 1];

        if ($last_char !== '%') {
            return false;
        }

        $points = substr($string, 0, $length - 1);

        if (!is_numeric($points)) {
            return false;
        }

        $points = (int)$points;

        if ($points < 0) {
            return '0%';
        }
        if ($points > 100) {
            return '100%';
        }
        return ((string)$points) . '%';
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Pixels.php000064400000003274151214231100017242 0ustar00<?php

/**
 * Validates an integer representation of pixels according to the HTML spec.
 */
class HTMLPurifier_AttrDef_HTML_Pixels extends HTMLPurifier_AttrDef
{

    /**
     * @type int
     */
    protected $max;

    /**
     * @param int $max
     */
    public function __construct($max = null)
    {
        $this->max = $max;
    }

    /**
     * @param string $string
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string
     */
    public function validate($string, $config, $context)
    {
        $string = trim($string);
        if ($string === '0') {
            return $string;
        }
        if ($string === '') {
            return false;
        }
        $length = strlen($string);
        if (substr($string, $length - 2) == 'px') {
            $string = substr($string, 0, $length - 2);
        }
        if (!is_numeric($string)) {
            return false;
        }
        $int = (int)$string;

        if ($int < 0) {
            return '0';
        }

        // upper-bound value, extremely high values can
        // crash operating systems, see <http://ha.ckers.org/imagecrash.html>
        // WARNING, above link WILL crash you if you're using Windows

        if ($this->max !== null && $int > $this->max) {
            return (string)$this->max;
        }
        return (string)$int;
    }

    /**
     * @param string $string
     * @return HTMLPurifier_AttrDef
     */
    public function make($string)
    {
        if ($string === '') {
            $max = null;
        } else {
            $max = (int)$string;
        }
        $class = get_class($this);
        return new $class($max);
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email.php000064400000000527151214231100016716 0ustar00<?php

abstract class HTMLPurifier_AttrDef_URI_Email extends HTMLPurifier_AttrDef
{

    /**
     * Unpacks a mailbox into its display-name and address
     * @param string $string
     * @return mixed
     */
    public function unpack($string)
    {
        // needs to be implemented
    }

}

// sub-implementations

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/URI/Host.php000064400000012432151214231100016602 0ustar00<?php

/**
 * Validates a host according to the IPv4, IPv6 and DNS (future) specifications.
 */
class HTMLPurifier_AttrDef_URI_Host extends HTMLPurifier_AttrDef
{

    /**
     * IPv4 sub-validator.
     * @type HTMLPurifier_AttrDef_URI_IPv4
     */
    protected $ipv4;

    /**
     * IPv6 sub-validator.
     * @type HTMLPurifier_AttrDef_URI_IPv6
     */
    protected $ipv6;

    public function __construct()
    {
        $this->ipv4 = new HTMLPurifier_AttrDef_URI_IPv4();
        $this->ipv6 = new HTMLPurifier_AttrDef_URI_IPv6();
    }

    /**
     * @param string $string
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string
     */
    public function validate($string, $config, $context)
    {
        $length = strlen($string);
        // empty hostname is OK; it's usually semantically equivalent:
        // the default host as defined by a URI scheme is used:
        //
        //      If the URI scheme defines a default for host, then that
        //      default applies when the host subcomponent is undefined
        //      or when the registered name is empty (zero length).
        if ($string === '') {
            return '';
        }
        if ($length > 1 && $string[0] === '[' && $string[$length - 1] === ']') {
            //IPv6
            $ip = substr($string, 1, $length - 2);
            $valid = $this->ipv6->validate($ip, $config, $context);
            if ($valid === false) {
                return false;
            }
            return '[' . $valid . ']';
        }

        // need to do checks on unusual encodings too
        $ipv4 = $this->ipv4->validate($string, $config, $context);
        if ($ipv4 !== false) {
            return $ipv4;
        }

        // A regular domain name.

        // This doesn't match I18N domain names, but we don't have proper IRI support,
        // so force users to insert Punycode.

        // There is not a good sense in which underscores should be
        // allowed, since it's technically not! (And if you go as
        // far to allow everything as specified by the DNS spec...
        // well, that's literally everything, modulo some space limits
        // for the components and the overall name (which, by the way,
        // we are NOT checking!).  So we (arbitrarily) decide this:
        // let's allow underscores wherever we would have allowed
        // hyphens, if they are enabled.  This is a pretty good match
        // for browser behavior, for example, a large number of browsers
        // cannot handle foo_.example.com, but foo_bar.example.com is
        // fairly well supported.
        $underscore = $config->get('Core.AllowHostnameUnderscore') ? '_' : '';

        // Based off of RFC 1738, but amended so that
        // as per RFC 3696, the top label need only not be all numeric.
        // The productions describing this are:
        $a   = '[a-z]';     // alpha
        $an  = '[a-z0-9]';  // alphanum
        $and = "[a-z0-9-$underscore]"; // alphanum | "-"
        // domainlabel = alphanum | alphanum *( alphanum | "-" ) alphanum
        $domainlabel = "$an(?:$and*$an)?";
        // AMENDED as per RFC 3696
        // toplabel    = alphanum | alphanum *( alphanum | "-" ) alphanum
        //      side condition: not all numeric
        $toplabel = "$an(?:$and*$an)?";
        // hostname    = *( domainlabel "." ) toplabel [ "." ]
        if (preg_match("/^(?:$domainlabel\.)*($toplabel)\.?$/i", $string, $matches)) {
            if (!ctype_digit($matches[1])) {
                return $string;
            }
        }

        // PHP 5.3 and later support this functionality natively
        if (function_exists('idn_to_ascii')) {
            if (defined('IDNA_NONTRANSITIONAL_TO_ASCII') && defined('INTL_IDNA_VARIANT_UTS46')) {
                $string = idn_to_ascii($string, IDNA_NONTRANSITIONAL_TO_ASCII, INTL_IDNA_VARIANT_UTS46);
            } else {
                $string = idn_to_ascii($string);
            }

        // If we have Net_IDNA2 support, we can support IRIs by
        // punycoding them. (This is the most portable thing to do,
        // since otherwise we have to assume browsers support
        } elseif ($config->get('Core.EnableIDNA')) {
            $idna = new Net_IDNA2(array('encoding' => 'utf8', 'overlong' => false, 'strict' => true));
            // we need to encode each period separately
            $parts = explode('.', $string);
            try {
                $new_parts = array();
                foreach ($parts as $part) {
                    $encodable = false;
                    for ($i = 0, $c = strlen($part); $i < $c; $i++) {
                        if (ord($part[$i]) > 0x7a) {
                            $encodable = true;
                            break;
                        }
                    }
                    if (!$encodable) {
                        $new_parts[] = $part;
                    } else {
                        $new_parts[] = $idna->encode($part);
                    }
                }
                $string = implode('.', $new_parts);
            } catch (Exception $e) {
                // XXX error reporting
            }
        }
        // Try again
        if (preg_match("/^($domainlabel\.)*$toplabel\.?$/i", $string)) {
            return $string;
        }
        return false;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv6.php000064400000004655151214231100016461 0ustar00<?php

/**
 * Validates an IPv6 address.
 * @author Feyd @ forums.devnetwork.net (public domain)
 * @note This function requires brackets to have been removed from address
 *       in URI.
 */
class HTMLPurifier_AttrDef_URI_IPv6 extends HTMLPurifier_AttrDef_URI_IPv4
{

    /**
     * @param string $aIP
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string
     */
    public function validate($aIP, $config, $context)
    {
        if (!$this->ip4) {
            $this->_loadRegex();
        }

        $original = $aIP;

        $hex = '[0-9a-fA-F]';
        $blk = '(?:' . $hex . '{1,4})';
        $pre = '(?:/(?:12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9]))'; // /0 - /128

        //      prefix check
        if (strpos($aIP, '/') !== false) {
            if (preg_match('#' . $pre . '$#s', $aIP, $find)) {
                $aIP = substr($aIP, 0, 0 - strlen($find[0]));
                unset($find);
            } else {
                return false;
            }
        }

        //      IPv4-compatiblity check
        if (preg_match('#(?<=:' . ')' . $this->ip4 . '$#s', $aIP, $find)) {
            $aIP = substr($aIP, 0, 0 - strlen($find[0]));
            $ip = explode('.', $find[0]);
            $ip = array_map('dechex', $ip);
            $aIP .= $ip[0] . $ip[1] . ':' . $ip[2] . $ip[3];
            unset($find, $ip);
        }

        //      compression check
        $aIP = explode('::', $aIP);
        $c = count($aIP);
        if ($c > 2) {
            return false;
        } elseif ($c == 2) {
            list($first, $second) = $aIP;
            $first = explode(':', $first);
            $second = explode(':', $second);

            if (count($first) + count($second) > 8) {
                return false;
            }

            while (count($first) < 8) {
                array_push($first, '0');
            }

            array_splice($first, 8 - count($second), 8, $second);
            $aIP = $first;
            unset($first, $second);
        } else {
            $aIP = explode(':', $aIP[0]);
        }
        $c = count($aIP);

        if ($c != 8) {
            return false;
        }

        //      All the pieces should be 16-bit hex strings. Are they?
        foreach ($aIP as $piece) {
            if (!preg_match('#^[0-9a-fA-F]{4}$#s', sprintf('%04s', $piece))) {
                return false;
            }
        }
        return $original;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php000064400000001470151214231100021103 0ustar00<?php

/**
 * Primitive email validation class based on the regexp found at
 * http://www.regular-expressions.info/email.html
 */
class HTMLPurifier_AttrDef_URI_Email_SimpleCheck extends HTMLPurifier_AttrDef_URI_Email
{

    /**
     * @param string $string
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string
     */
    public function validate($string, $config, $context)
    {
        // no support for named mailboxes i.e. "Bob <bob@example.com>"
        // that needs more percent encoding to be done
        if ($string == '') {
            return false;
        }
        $string = trim($string);
        $result = preg_match('/^[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i', $string);
        return $result ? $string : false;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv4.php000064400000001746151214231100016455 0ustar00<?php

/**
 * Validates an IPv4 address
 * @author Feyd @ forums.devnetwork.net (public domain)
 */
class HTMLPurifier_AttrDef_URI_IPv4 extends HTMLPurifier_AttrDef
{

    /**
     * IPv4 regex, protected so that IPv6 can reuse it.
     * @type string
     */
    protected $ip4;

    /**
     * @param string $aIP
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string
     */
    public function validate($aIP, $config, $context)
    {
        if (!$this->ip4) {
            $this->_loadRegex();
        }

        if (preg_match('#^' . $this->ip4 . '$#s', $aIP)) {
            return $aIP;
        }
        return false;
    }

    /**
     * Lazy load function to prevent regex from being stuffed in
     * cache.
     */
    protected function _loadRegex()
    {
        $oct = '(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])'; // 0-255
        $this->ip4 = "(?:{$oct}\\.{$oct}\\.{$oct}\\.{$oct})";
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Color.php000064400000011110151214231100016724 0ustar00<?php

/**
 * Validates Color as defined by CSS.
 */
class HTMLPurifier_AttrDef_CSS_Color extends HTMLPurifier_AttrDef
{

    /**
     * @type HTMLPurifier_AttrDef_CSS_AlphaValue
     */
    protected $alpha;

    public function __construct()
    {
        $this->alpha = new HTMLPurifier_AttrDef_CSS_AlphaValue();
    }

    /**
     * @param string $color
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string
     */
    public function validate($color, $config, $context)
    {
        static $colors = null;
        if ($colors === null) {
            $colors = $config->get('Core.ColorKeywords');
        }

        $color = trim($color);
        if ($color === '') {
            return false;
        }

        $lower = strtolower($color);
        if (isset($colors[$lower])) {
            return $colors[$lower];
        }

        if (preg_match('#(rgb|rgba|hsl|hsla)\(#', $color, $matches) === 1) {
            $length = strlen($color);
            if (strpos($color, ')') !== $length - 1) {
                return false;
            }

            // get used function : rgb, rgba, hsl or hsla
            $function = $matches[1];

            $parameters_size = 3;
            $alpha_channel = false;
            if (substr($function, -1) === 'a') {
                $parameters_size = 4;
                $alpha_channel = true;
            }

            /*
             * Allowed types for values :
             * parameter_position => [type => max_value]
             */
            $allowed_types = array(
                1 => array('percentage' => 100, 'integer' => 255),
                2 => array('percentage' => 100, 'integer' => 255),
                3 => array('percentage' => 100, 'integer' => 255),
            );
            $allow_different_types = false;

            if (strpos($function, 'hsl') !== false) {
                $allowed_types = array(
                    1 => array('integer' => 360),
                    2 => array('percentage' => 100),
                    3 => array('percentage' => 100),
                );
                $allow_different_types = true;
            }

            $values = trim(str_replace($function, '', $color), ' ()');

            $parts = explode(',', $values);
            if (count($parts) !== $parameters_size) {
                return false;
            }

            $type = false;
            $new_parts = array();
            $i = 0;

            foreach ($parts as $part) {
                $i++;
                $part = trim($part);

                if ($part === '') {
                    return false;
                }

                // different check for alpha channel
                if ($alpha_channel === true && $i === count($parts)) {
                    $result = $this->alpha->validate($part, $config, $context);

                    if ($result === false) {
                        return false;
                    }

                    $new_parts[] = (string)$result;
                    continue;
                }

                if (substr($part, -1) === '%') {
                    $current_type = 'percentage';
                } else {
                    $current_type = 'integer';
                }

                if (!array_key_exists($current_type, $allowed_types[$i])) {
                    return false;
                }

                if (!$type) {
                    $type = $current_type;
                }

                if ($allow_different_types === false && $type != $current_type) {
                    return false;
                }

                $max_value = $allowed_types[$i][$current_type];

                if ($current_type == 'integer') {
                    // Return value between range 0 -> $max_value
                    $new_parts[] = (int)max(min($part, $max_value), 0);
                } elseif ($current_type == 'percentage') {
                    $new_parts[] = (float)max(min(rtrim($part, '%'), $max_value), 0) . '%';
                }
            }

            $new_values = implode(',', $new_parts);

            $color = $function . '(' . $new_values . ')';
        } else {
            // hexadecimal handling
            if ($color[0] === '#') {
                $hex = substr($color, 1);
            } else {
                $hex = $color;
                $color = '#' . $color;
            }
            $length = strlen($hex);
            if ($length !== 3 && $length !== 6) {
                return false;
            }
            if (!ctype_xdigit($hex)) {
                return false;
            }
        }
        return $color;
    }

}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/CSS/URI.php000064400000005010151214231100016307 0ustar00<?php

/**
 * Validates a URI in CSS syntax, which uses url('http://example.com')
 * @note While theoretically speaking a URI in a CSS document could
 *       be non-embedded, as of CSS2 there is no such usage so we're
 *       generalizing it. This may need to be changed in the future.
 * @warning Since HTMLPurifier_AttrDef_CSS blindly uses semicolons as
 *          the separator, you cannot put a literal semicolon in
 *          in the URI. Try percent encoding it, in that case.
 */
class HTMLPurifier_AttrDef_CSS_URI extends HTMLPurifier_AttrDef_URI
{

    public function __construct()
    {
        parent::__construct(true); // always embedded
    }

    /**
     * @param string $uri_string
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string
     */
    public function validate($uri_string, $config, $context)
    {
        // parse the URI out of the string and then pass it onto
        // the parent object

        $uri_string = $this->parseCDATA($uri_string);
        if (strpos($uri_string, 'url(') !== 0) {
            return false;
        }
        $uri_string = substr($uri_string, 4);
        if (strlen($uri_string) == 0) {
            return false;
        }
        $new_length = strlen($uri_string) - 1;
        if ($uri_string[$new_length] != ')') {
            return false;
        }
        $uri = trim(substr($uri_string, 0, $new_length));

        if (!empty($uri) && ($uri[0] == "'" || $uri[0] == '"')) {
            $quote = $uri[0];
            $new_length = strlen($uri) - 1;
            if ($uri[$new_length] !== $quote) {
                return false;
            }
            $uri = substr($uri, 1, $new_length - 1);
        }

        $uri = $this->expandCSSEscape($uri);

        $result = parent::validate($uri, $config, $context);

        if ($result === false) {
            return false;
        }

        // extra sanity check; should have been done by URI
        $result = str_replace(array('"', "\\", "\n", "\x0c", "\r"), "", $result);

        // suspicious characters are ()'; we're going to percent encode
        // them for safety.
        $result = str_replace(array('(', ')', "'"), array('%28', '%29', '%27'), $result);

        // there's an extra bug where ampersands lose their escaping on
        // an innerHTML cycle, so a very unlucky query parameter could
        // then change the meaning of the URL.  Unfortunately, there's
        // not much we can do about that...
        return "url(\"$result\")";
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ListStyle.php000064400000005537151214231100017622 0ustar00<?php

/**
 * Validates shorthand CSS property list-style.
 * @warning Does not support url tokens that have internal spaces.
 */
class HTMLPurifier_AttrDef_CSS_ListStyle extends HTMLPurifier_AttrDef
{

    /**
     * Local copy of validators.
     * @type HTMLPurifier_AttrDef[]
     * @note See HTMLPurifier_AttrDef_CSS_Font::$info for a similar impl.
     */
    protected $info;

    /**
     * @param HTMLPurifier_Config $config
     */
    public function __construct($config)
    {
        $def = $config->getCSSDefinition();
        $this->info['list-style-type'] = $def->info['list-style-type'];
        $this->info['list-style-position'] = $def->info['list-style-position'];
        $this->info['list-style-image'] = $def->info['list-style-image'];
    }

    /**
     * @param string $string
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string
     */
    public function validate($string, $config, $context)
    {
        // regular pre-processing
        $string = $this->parseCDATA($string);
        if ($string === '') {
            return false;
        }

        // assumes URI doesn't have spaces in it
        $bits = explode(' ', strtolower($string)); // bits to process

        $caught = array();
        $caught['type'] = false;
        $caught['position'] = false;
        $caught['image'] = false;

        $i = 0; // number of catches
        $none = false;

        foreach ($bits as $bit) {
            if ($i >= 3) {
                return;
            } // optimization bit
            if ($bit === '') {
                continue;
            }
            foreach ($caught as $key => $status) {
                if ($status !== false) {
                    continue;
                }
                $r = $this->info['list-style-' . $key]->validate($bit, $config, $context);
                if ($r === false) {
                    continue;
                }
                if ($r === 'none') {
                    if ($none) {
                        continue;
                    } else {
                        $none = true;
                    }
                    if ($key == 'image') {
                        continue;
                    }
                }
                $caught[$key] = $r;
                $i++;
                break;
            }
        }

        if (!$i) {
            return false;
        }

        $ret = array();

        // construct type
        if ($caught['type']) {
            $ret[] = $caught['type'];
        }

        // construct image
        if ($caught['image']) {
            $ret[] = $caught['image'];
        }

        // construct position
        if ($caught['position']) {
            $ret[] = $caught['position'];
        }

        if (empty($ret)) {
            return false;
        }
        return implode(' ', $ret);
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php000064400000003075151214231100021501 0ustar00<?php

/**
 * Decorator which enables !important to be used in CSS values.
 */
class HTMLPurifier_AttrDef_CSS_ImportantDecorator extends HTMLPurifier_AttrDef
{
    /**
     * @type HTMLPurifier_AttrDef
     */
    public $def;
    /**
     * @type bool
     */
    public $allow;

    /**
     * @param HTMLPurifier_AttrDef $def Definition to wrap
     * @param bool $allow Whether or not to allow !important
     */
    public function __construct($def, $allow = false)
    {
        $this->def = $def;
        $this->allow = $allow;
    }

    /**
     * Intercepts and removes !important if necessary
     * @param string $string
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string
     */
    public function validate($string, $config, $context)
    {
        // test for ! and important tokens
        $string = trim($string);
        $is_important = false;
        // :TODO: optimization: test directly for !important and ! important
        if (strlen($string) >= 9 && substr($string, -9) === 'important') {
            $temp = rtrim(substr($string, 0, -9));
            // use a temp, because we might want to restore important
            if (strlen($temp) >= 1 && substr($temp, -1) === '!') {
                $string = rtrim(substr($temp, 0, -1));
                $is_important = true;
            }
        }
        $string = $this->def->validate($string, $config, $context);
        if ($this->allow && $is_important) {
            $string .= ' !important';
        }
        return $string;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Font.php000064400000014721151214231100016567 0ustar00<?php

/**
 * Validates shorthand CSS property font.
 */
class HTMLPurifier_AttrDef_CSS_Font extends HTMLPurifier_AttrDef
{

    /**
     * Local copy of validators
     * @type HTMLPurifier_AttrDef[]
     * @note If we moved specific CSS property definitions to their own
     *       classes instead of having them be assembled at run time by
     *       CSSDefinition, this wouldn't be necessary.  We'd instantiate
     *       our own copies.
     */
    protected $info = array();

    /**
     * @param HTMLPurifier_Config $config
     */
    public function __construct($config)
    {
        $def = $config->getCSSDefinition();
        $this->info['font-style'] = $def->info['font-style'];
        $this->info['font-variant'] = $def->info['font-variant'];
        $this->info['font-weight'] = $def->info['font-weight'];
        $this->info['font-size'] = $def->info['font-size'];
        $this->info['line-height'] = $def->info['line-height'];
        $this->info['font-family'] = $def->info['font-family'];
    }

    /**
     * @param string $string
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string
     */
    public function validate($string, $config, $context)
    {
        static $system_fonts = array(
            'caption' => true,
            'icon' => true,
            'menu' => true,
            'message-box' => true,
            'small-caption' => true,
            'status-bar' => true
        );

        // regular pre-processing
        $string = $this->parseCDATA($string);
        if ($string === '') {
            return false;
        }

        // check if it's one of the keywords
        $lowercase_string = strtolower($string);
        if (isset($system_fonts[$lowercase_string])) {
            return $lowercase_string;
        }

        $bits = explode(' ', $string); // bits to process
        $stage = 0; // this indicates what we're looking for
        $caught = array(); // which stage 0 properties have we caught?
        $stage_1 = array('font-style', 'font-variant', 'font-weight');
        $final = ''; // output

        for ($i = 0, $size = count($bits); $i < $size; $i++) {
            if ($bits[$i] === '') {
                continue;
            }
            switch ($stage) {
                case 0: // attempting to catch font-style, font-variant or font-weight
                    foreach ($stage_1 as $validator_name) {
                        if (isset($caught[$validator_name])) {
                            continue;
                        }
                        $r = $this->info[$validator_name]->validate(
                            $bits[$i],
                            $config,
                            $context
                        );
                        if ($r !== false) {
                            $final .= $r . ' ';
                            $caught[$validator_name] = true;
                            break;
                        }
                    }
                    // all three caught, continue on
                    if (count($caught) >= 3) {
                        $stage = 1;
                    }
                    if ($r !== false) {
                        break;
                    }
                case 1: // attempting to catch font-size and perhaps line-height
                    $found_slash = false;
                    if (strpos($bits[$i], '/') !== false) {
                        list($font_size, $line_height) =
                            explode('/', $bits[$i]);
                        if ($line_height === '') {
                            // ooh, there's a space after the slash!
                            $line_height = false;
                            $found_slash = true;
                        }
                    } else {
                        $font_size = $bits[$i];
                        $line_height = false;
                    }
                    $r = $this->info['font-size']->validate(
                        $font_size,
                        $config,
                        $context
                    );
                    if ($r !== false) {
                        $final .= $r;
                        // attempt to catch line-height
                        if ($line_height === false) {
                            // we need to scroll forward
                            for ($j = $i + 1; $j < $size; $j++) {
                                if ($bits[$j] === '') {
                                    continue;
                                }
                                if ($bits[$j] === '/') {
                                    if ($found_slash) {
                                        return false;
                                    } else {
                                        $found_slash = true;
                                        continue;
                                    }
                                }
                                $line_height = $bits[$j];
                                break;
                            }
                        } else {
                            // slash already found
                            $found_slash = true;
                            $j = $i;
                        }
                        if ($found_slash) {
                            $i = $j;
                            $r = $this->info['line-height']->validate(
                                $line_height,
                                $config,
                                $context
                            );
                            if ($r !== false) {
                                $final .= '/' . $r;
                            }
                        }
                        $final .= ' ';
                        $stage = 2;
                        break;
                    }
                    return false;
                case 2: // attempting to catch font-family
                    $font_family =
                        implode(' ', array_slice($bits, $i, $size - $i));
                    $r = $this->info['font-family']->validate(
                        $font_family,
                        $config,
                        $context
                    );
                    if ($r !== false) {
                        $final .= $r . ' ';
                        // processing completed successfully
                        return rtrim($final);
                    }
                    return false;
            }
        }
        return false;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Percentage.php000064400000002377151214231100017742 0ustar00<?php

/**
 * Validates a Percentage as defined by the CSS spec.
 */
class HTMLPurifier_AttrDef_CSS_Percentage extends HTMLPurifier_AttrDef
{

    /**
     * Instance to defer number validation to.
     * @type HTMLPurifier_AttrDef_CSS_Number
     */
    protected $number_def;

    /**
     * @param bool $non_negative Whether to forbid negative values
     */
    public function __construct($non_negative = false)
    {
        $this->number_def = new HTMLPurifier_AttrDef_CSS_Number($non_negative);
    }

    /**
     * @param string $string
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string
     */
    public function validate($string, $config, $context)
    {
        $string = $this->parseCDATA($string);

        if ($string === '') {
            return false;
        }
        $length = strlen($string);
        if ($length === 1) {
            return false;
        }
        if ($string[$length - 1] !== '%') {
            return false;
        }

        $number = substr($string, 0, $length - 1);
        $number = $this->number_def->validate($number, $config, $context);

        if ($number === false) {
            return false;
        }
        return "$number%";
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Ident.php000064400000001324151214231100016717 0ustar00<?php

/**
 * Validates based on {ident} CSS grammar production
 */
class HTMLPurifier_AttrDef_CSS_Ident extends HTMLPurifier_AttrDef
{

    /**
     * @param string $string
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string
     */
    public function validate($string, $config, $context)
    {
        $string = trim($string);

        // early abort: '' and '0' (strings that convert to false) are invalid
        if (!$string) {
            return false;
        }

        $pattern = '/^(-?[A-Za-z_][A-Za-z_\-0-9]*)$/';
        if (!preg_match($pattern, $string)) {
            return false;
        }
        return $string;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Composite.php000064400000002464151214231100017624 0ustar00<?php

/**
 * Allows multiple validators to attempt to validate attribute.
 *
 * Composite is just what it sounds like: a composite of many validators.
 * This means that multiple HTMLPurifier_AttrDef objects will have a whack
 * at the string.  If one of them passes, that's what is returned.  This is
 * especially useful for CSS values, which often are a choice between
 * an enumerated set of predefined values or a flexible data type.
 */
class HTMLPurifier_AttrDef_CSS_Composite extends HTMLPurifier_AttrDef
{

    /**
     * List of objects that may process strings.
     * @type HTMLPurifier_AttrDef[]
     * @todo Make protected
     */
    public $defs;

    /**
     * @param HTMLPurifier_AttrDef[] $defs List of HTMLPurifier_AttrDef objects
     */
    public function __construct($defs)
    {
        $this->defs = $defs;
    }

    /**
     * @param string $string
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string
     */
    public function validate($string, $config, $context)
    {
        foreach ($this->defs as $i => $def) {
            $result = $this->defs[$i]->validate($string, $config, $context);
            if ($result !== false) {
                return $result;
            }
        }
        return false;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Border.php000064400000003067151214231100017077 0ustar00<?php

/**
 * Validates the border property as defined by CSS.
 */
class HTMLPurifier_AttrDef_CSS_Border extends HTMLPurifier_AttrDef
{

    /**
     * Local copy of properties this property is shorthand for.
     * @type HTMLPurifier_AttrDef[]
     */
    protected $info = array();

    /**
     * @param HTMLPurifier_Config $config
     */
    public function __construct($config)
    {
        $def = $config->getCSSDefinition();
        $this->info['border-width'] = $def->info['border-width'];
        $this->info['border-style'] = $def->info['border-style'];
        $this->info['border-top-color'] = $def->info['border-top-color'];
    }

    /**
     * @param string $string
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string
     */
    public function validate($string, $config, $context)
    {
        $string = $this->parseCDATA($string);
        $string = $this->mungeRgb($string);
        $bits = explode(' ', $string);
        $done = array(); // segments we've finished
        $ret = ''; // return value
        foreach ($bits as $bit) {
            foreach ($this->info as $propname => $validator) {
                if (isset($done[$propname])) {
                    continue;
                }
                $r = $validator->validate($bit, $config, $context);
                if ($r !== false) {
                    $ret .= $r . ' ';
                    $done[$propname] = true;
                    break;
                }
            }
        }
        return rtrim($ret);
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Number.php000064400000004357151214231100017115 0ustar00<?php

/**
 * Validates a number as defined by the CSS spec.
 */
class HTMLPurifier_AttrDef_CSS_Number extends HTMLPurifier_AttrDef
{

    /**
     * Indicates whether or not only positive values are allowed.
     * @type bool
     */
    protected $non_negative = false;

    /**
     * @param bool $non_negative indicates whether negatives are forbidden
     */
    public function __construct($non_negative = false)
    {
        $this->non_negative = $non_negative;
    }

    /**
     * @param string $number
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return string|bool
     * @warning Some contexts do not pass $config, $context. These
     *          variables should not be used without checking HTMLPurifier_Length
     */
    public function validate($number, $config, $context)
    {
        $number = $this->parseCDATA($number);

        if ($number === '') {
            return false;
        }
        if ($number === '0') {
            return '0';
        }

        $sign = '';
        switch ($number[0]) {
            case '-':
                if ($this->non_negative) {
                    return false;
                }
                $sign = '-';
            case '+':
                $number = substr($number, 1);
        }

        if (ctype_digit($number)) {
            $number = ltrim($number, '0');
            return $number ? $sign . $number : '0';
        }

        // Period is the only non-numeric character allowed
        if (strpos($number, '.') === false) {
            return false;
        }

        list($left, $right) = explode('.', $number, 2);

        if ($left === '' && $right === '') {
            return false;
        }
        if ($left !== '' && !ctype_digit($left)) {
            return false;
        }

        // Remove leading zeros until positive number or a zero stays left
        if (ltrim($left, '0') != '') {
            $left = ltrim($left, '0');
        } else {
            $left = '0';
        }

        $right = rtrim($right, '0');

        if ($right === '') {
            return $left ? $sign . $left : '0';
        } elseif (!ctype_digit($right)) {
            return false;
        }
        return $sign . $left . '.' . $right;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php000064400000001431151214231100017675 0ustar00<?php

class HTMLPurifier_AttrDef_CSS_AlphaValue extends HTMLPurifier_AttrDef_CSS_Number
{

    public function __construct()
    {
        parent::__construct(false); // opacity is non-negative, but we will clamp it
    }

    /**
     * @param string $number
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return string
     */
    public function validate($number, $config, $context)
    {
        $result = parent::validate($number, $config, $context);
        if ($result === false) {
            return $result;
        }
        $float = (float)$result;
        if ($float < 0.0) {
            $result = '0';
        }
        if ($float > 1.0) {
            $result = '1';
        }
        return $result;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Filter.php000064400000004426151214231100017107 0ustar00<?php

/**
 * Microsoft's proprietary filter: CSS property
 * @note Currently supports the alpha filter. In the future, this will
 *       probably need an extensible framework
 */
class HTMLPurifier_AttrDef_CSS_Filter extends HTMLPurifier_AttrDef
{
    /**
     * @type HTMLPurifier_AttrDef_Integer
     */
    protected $intValidator;

    public function __construct()
    {
        $this->intValidator = new HTMLPurifier_AttrDef_Integer();
    }

    /**
     * @param string $value
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string
     */
    public function validate($value, $config, $context)
    {
        $value = $this->parseCDATA($value);
        if ($value === 'none') {
            return $value;
        }
        // if we looped this we could support multiple filters
        $function_length = strcspn($value, '(');
        $function = trim(substr($value, 0, $function_length));
        if ($function !== 'alpha' &&
            $function !== 'Alpha' &&
            $function !== 'progid:DXImageTransform.Microsoft.Alpha'
        ) {
            return false;
        }
        $cursor = $function_length + 1;
        $parameters_length = strcspn($value, ')', $cursor);
        $parameters = substr($value, $cursor, $parameters_length);
        $params = explode(',', $parameters);
        $ret_params = array();
        $lookup = array();
        foreach ($params as $param) {
            list($key, $value) = explode('=', $param);
            $key = trim($key);
            $value = trim($value);
            if (isset($lookup[$key])) {
                continue;
            }
            if ($key !== 'opacity') {
                continue;
            }
            $value = $this->intValidator->validate($value, $config, $context);
            if ($value === false) {
                continue;
            }
            $int = (int)$value;
            if ($int > 100) {
                $value = '100';
            }
            if ($int < 0) {
                $value = '0';
            }
            $ret_params[] = "$key=$value";
            $lookup[$key] = true;
        }
        $ret_parameters = implode(',', $ret_params);
        $ret_function = "$function($ret_parameters)";
        return $ret_function;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php000064400000010106151214231100021456 0ustar00<?php

/* W3C says:
    [ // adjective and number must be in correct order, even if
      // you could switch them without introducing ambiguity.
      // some browsers support that syntax
        [
            <percentage> | <length> | left | center | right
        ]
        [
            <percentage> | <length> | top | center | bottom
        ]?
    ] |
    [ // this signifies that the vertical and horizontal adjectives
      // can be arbitrarily ordered, however, there can only be two,
      // one of each, or none at all
        [
            left | center | right
        ] ||
        [
            top | center | bottom
        ]
    ]
    top, left = 0%
    center, (none) = 50%
    bottom, right = 100%
*/

/* QuirksMode says:
    keyword + length/percentage must be ordered correctly, as per W3C

    Internet Explorer and Opera, however, support arbitrary ordering. We
    should fix it up.

    Minor issue though, not strictly necessary.
*/

// control freaks may appreciate the ability to convert these to
// percentages or something, but it's not necessary

/**
 * Validates the value of background-position.
 */
class HTMLPurifier_AttrDef_CSS_BackgroundPosition extends HTMLPurifier_AttrDef
{

    /**
     * @type HTMLPurifier_AttrDef_CSS_Length
     */
    protected $length;

    /**
     * @type HTMLPurifier_AttrDef_CSS_Percentage
     */
    protected $percentage;

    public function __construct()
    {
        $this->length = new HTMLPurifier_AttrDef_CSS_Length();
        $this->percentage = new HTMLPurifier_AttrDef_CSS_Percentage();
    }

    /**
     * @param string $string
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string
     */
    public function validate($string, $config, $context)
    {
        $string = $this->parseCDATA($string);
        $bits = explode(' ', $string);

        $keywords = array();
        $keywords['h'] = false; // left, right
        $keywords['v'] = false; // top, bottom
        $keywords['ch'] = false; // center (first word)
        $keywords['cv'] = false; // center (second word)
        $measures = array();

        $i = 0;

        $lookup = array(
            'top' => 'v',
            'bottom' => 'v',
            'left' => 'h',
            'right' => 'h',
            'center' => 'c'
        );

        foreach ($bits as $bit) {
            if ($bit === '') {
                continue;
            }

            // test for keyword
            $lbit = ctype_lower($bit) ? $bit : strtolower($bit);
            if (isset($lookup[$lbit])) {
                $status = $lookup[$lbit];
                if ($status == 'c') {
                    if ($i == 0) {
                        $status = 'ch';
                    } else {
                        $status = 'cv';
                    }
                }
                $keywords[$status] = $lbit;
                $i++;
            }

            // test for length
            $r = $this->length->validate($bit, $config, $context);
            if ($r !== false) {
                $measures[] = $r;
                $i++;
            }

            // test for percentage
            $r = $this->percentage->validate($bit, $config, $context);
            if ($r !== false) {
                $measures[] = $r;
                $i++;
            }
        }

        if (!$i) {
            return false;
        } // no valid values were caught

        $ret = array();

        // first keyword
        if ($keywords['h']) {
            $ret[] = $keywords['h'];
        } elseif ($keywords['ch']) {
            $ret[] = $keywords['ch'];
            $keywords['cv'] = false; // prevent re-use: center = center center
        } elseif (count($measures)) {
            $ret[] = array_shift($measures);
        }

        if ($keywords['v']) {
            $ret[] = $keywords['v'];
        } elseif ($keywords['cv']) {
            $ret[] = $keywords['cv'];
        } elseif (count($measures)) {
            $ret[] = array_shift($measures);
        }

        if (empty($ret)) {
            return false;
        }
        return implode(' ', $ret);
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Background.php000064400000006210151214231100017732 0ustar00<?php

/**
 * Validates shorthand CSS property background.
 * @warning Does not support url tokens that have internal spaces.
 */
class HTMLPurifier_AttrDef_CSS_Background extends HTMLPurifier_AttrDef
{

    /**
     * Local copy of component validators.
     * @type HTMLPurifier_AttrDef[]
     * @note See HTMLPurifier_AttrDef_Font::$info for a similar impl.
     */
    protected $info;

    /**
     * @param HTMLPurifier_Config $config
     */
    public function __construct($config)
    {
        $def = $config->getCSSDefinition();
        $this->info['background-color'] = $def->info['background-color'];
        $this->info['background-image'] = $def->info['background-image'];
        $this->info['background-repeat'] = $def->info['background-repeat'];
        $this->info['background-attachment'] = $def->info['background-attachment'];
        $this->info['background-position'] = $def->info['background-position'];
    }

    /**
     * @param string $string
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string
     */
    public function validate($string, $config, $context)
    {
        // regular pre-processing
        $string = $this->parseCDATA($string);
        if ($string === '') {
            return false;
        }

        // munge rgb() decl if necessary
        $string = $this->mungeRgb($string);

        // assumes URI doesn't have spaces in it
        $bits = explode(' ', $string); // bits to process

        $caught = array();
        $caught['color'] = false;
        $caught['image'] = false;
        $caught['repeat'] = false;
        $caught['attachment'] = false;
        $caught['position'] = false;

        $i = 0; // number of catches

        foreach ($bits as $bit) {
            if ($bit === '') {
                continue;
            }
            foreach ($caught as $key => $status) {
                if ($key != 'position') {
                    if ($status !== false) {
                        continue;
                    }
                    $r = $this->info['background-' . $key]->validate($bit, $config, $context);
                } else {
                    $r = $bit;
                }
                if ($r === false) {
                    continue;
                }
                if ($key == 'position') {
                    if ($caught[$key] === false) {
                        $caught[$key] = '';
                    }
                    $caught[$key] .= $r . ' ';
                } else {
                    $caught[$key] = $r;
                }
                $i++;
                break;
            }
        }

        if (!$i) {
            return false;
        }
        if ($caught['position'] !== false) {
            $caught['position'] = $this->info['background-position']->
                validate($caught['position'], $config, $context);
        }

        $ret = array();
        foreach ($caught as $value) {
            if ($value === false) {
                continue;
            }
            $ret[] = $value;
        }

        if (empty($ret)) {
            return false;
        }
        return implode(' ', $ret);
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/CSS/FontFamily.php000064400000022301151214231100017722 0ustar00<?php

/**
 * Validates a font family list according to CSS spec
 */
class HTMLPurifier_AttrDef_CSS_FontFamily extends HTMLPurifier_AttrDef
{

    protected $mask = null;

    public function __construct()
    {
        $this->mask = '_- ';
        for ($c = 'a'; $c <= 'z'; $c++) {
            $this->mask .= $c;
        }
        for ($c = 'A'; $c <= 'Z'; $c++) {
            $this->mask .= $c;
        }
        for ($c = '0'; $c <= '9'; $c++) {
            $this->mask .= $c;
        } // cast-y, but should be fine
        // special bytes used by UTF-8
        for ($i = 0x80; $i <= 0xFF; $i++) {
            // We don't bother excluding invalid bytes in this range,
            // because the our restriction of well-formed UTF-8 will
            // prevent these from ever occurring.
            $this->mask .= chr($i);
        }

        /*
            PHP's internal strcspn implementation is
            O(length of string * length of mask), making it inefficient
            for large masks.  However, it's still faster than
            preg_match 8)
          for (p = s1;;) {
            spanp = s2;
            do {
              if (*spanp == c || p == s1_end) {
                return p - s1;
              }
            } while (spanp++ < (s2_end - 1));
            c = *++p;
          }
         */
        // possible optimization: invert the mask.
    }

    /**
     * @param string $string
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string
     */
    public function validate($string, $config, $context)
    {
        static $generic_names = array(
            'serif' => true,
            'sans-serif' => true,
            'monospace' => true,
            'fantasy' => true,
            'cursive' => true
        );
        $allowed_fonts = $config->get('CSS.AllowedFonts');

        // assume that no font names contain commas in them
        $fonts = explode(',', $string);
        $final = '';
        foreach ($fonts as $font) {
            $font = trim($font);
            if ($font === '') {
                continue;
            }
            // match a generic name
            if (isset($generic_names[$font])) {
                if ($allowed_fonts === null || isset($allowed_fonts[$font])) {
                    $final .= $font . ', ';
                }
                continue;
            }
            // match a quoted name
            if ($font[0] === '"' || $font[0] === "'") {
                $length = strlen($font);
                if ($length <= 2) {
                    continue;
                }
                $quote = $font[0];
                if ($font[$length - 1] !== $quote) {
                    continue;
                }
                $font = substr($font, 1, $length - 2);
            }

            $font = $this->expandCSSEscape($font);

            // $font is a pure representation of the font name

            if ($allowed_fonts !== null && !isset($allowed_fonts[$font])) {
                continue;
            }

            if (ctype_alnum($font) && $font !== '') {
                // very simple font, allow it in unharmed
                $final .= $font . ', ';
                continue;
            }

            // bugger out on whitespace.  form feed (0C) really
            // shouldn't show up regardless
            $font = str_replace(array("\n", "\t", "\r", "\x0C"), ' ', $font);

            // Here, there are various classes of characters which need
            // to be treated differently:
            //  - Alphanumeric characters are essentially safe.  We
            //    handled these above.
            //  - Spaces require quoting, though most parsers will do
            //    the right thing if there aren't any characters that
            //    can be misinterpreted
            //  - Dashes rarely occur, but they fairly unproblematic
            //    for parsing/rendering purposes.
            //  The above characters cover the majority of Western font
            //  names.
            //  - Arbitrary Unicode characters not in ASCII.  Because
            //    most parsers give little thought to Unicode, treatment
            //    of these codepoints is basically uniform, even for
            //    punctuation-like codepoints.  These characters can
            //    show up in non-Western pages and are supported by most
            //    major browsers, for example: "MS 明朝" is a
            //    legitimate font-name
            //    <http://ja.wikipedia.org/wiki/MS_明朝>.  See
            //    the CSS3 spec for more examples:
            //    <http://www.w3.org/TR/2011/WD-css3-fonts-20110324/localizedfamilynames.png>
            //    You can see live samples of these on the Internet:
            //    <http://www.google.co.jp/search?q=font-family+MS+明朝|ゴシック>
            //    However, most of these fonts have ASCII equivalents:
            //    for example, 'MS Mincho', and it's considered
            //    professional to use ASCII font names instead of
            //    Unicode font names.  Thanks Takeshi Terada for
            //    providing this information.
            //  The following characters, to my knowledge, have not been
            //  used to name font names.
            //  - Single quote.  While theoretically you might find a
            //    font name that has a single quote in its name (serving
            //    as an apostrophe, e.g. Dave's Scribble), I haven't
            //    been able to find any actual examples of this.
            //    Internet Explorer's cssText translation (which I
            //    believe is invoked by innerHTML) normalizes any
            //    quoting to single quotes, and fails to escape single
            //    quotes.  (Note that this is not IE's behavior for all
            //    CSS properties, just some sort of special casing for
            //    font-family).  So a single quote *cannot* be used
            //    safely in the font-family context if there will be an
            //    innerHTML/cssText translation.  Note that Firefox 3.x
            //    does this too.
            //  - Double quote.  In IE, these get normalized to
            //    single-quotes, no matter what the encoding.  (Fun
            //    fact, in IE8, the 'content' CSS property gained
            //    support, where they special cased to preserve encoded
            //    double quotes, but still translate unadorned double
            //    quotes into single quotes.)  So, because their
            //    fixpoint behavior is identical to single quotes, they
            //    cannot be allowed either.  Firefox 3.x displays
            //    single-quote style behavior.
            //  - Backslashes are reduced by one (so \\ -> \) every
            //    iteration, so they cannot be used safely.  This shows
            //    up in IE7, IE8 and FF3
            //  - Semicolons, commas and backticks are handled properly.
            //  - The rest of the ASCII punctuation is handled properly.
            // We haven't checked what browsers do to unadorned
            // versions, but this is not important as long as the
            // browser doesn't /remove/ surrounding quotes (as IE does
            // for HTML).
            //
            // With these results in hand, we conclude that there are
            // various levels of safety:
            //  - Paranoid: alphanumeric, spaces and dashes(?)
            //  - International: Paranoid + non-ASCII Unicode
            //  - Edgy: Everything except quotes, backslashes
            //  - NoJS: Standards compliance, e.g. sod IE. Note that
            //    with some judicious character escaping (since certain
            //    types of escaping doesn't work) this is theoretically
            //    OK as long as innerHTML/cssText is not called.
            // We believe that international is a reasonable default
            // (that we will implement now), and once we do more
            // extensive research, we may feel comfortable with dropping
            // it down to edgy.

            // Edgy: alphanumeric, spaces, dashes, underscores and Unicode.  Use of
            // str(c)spn assumes that the string was already well formed
            // Unicode (which of course it is).
            if (strspn($font, $this->mask) !== strlen($font)) {
                continue;
            }

            // Historical:
            // In the absence of innerHTML/cssText, these ugly
            // transforms don't pose a security risk (as \\ and \"
            // might--these escapes are not supported by most browsers).
            // We could try to be clever and use single-quote wrapping
            // when there is a double quote present, but I have choosen
            // not to implement that.  (NOTE: you can reduce the amount
            // of escapes by one depending on what quoting style you use)
            // $font = str_replace('\\', '\\5C ', $font);
            // $font = str_replace('"',  '\\22 ', $font);
            // $font = str_replace("'",  '\\27 ', $font);

            // font possibly with spaces, requires quoting
            $final .= "'$font', ";
        }
        $final = rtrim($final, ', ');
        if ($final === '') {
            return false;
        }
        return $final;
    }

}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Length.php000064400000003551151214231100017101 0ustar00<?php

/**
 * Represents a Length as defined by CSS.
 */
class HTMLPurifier_AttrDef_CSS_Length extends HTMLPurifier_AttrDef
{

    /**
     * @type HTMLPurifier_Length|string
     */
    protected $min;

    /**
     * @type HTMLPurifier_Length|string
     */
    protected $max;

    /**
     * @param HTMLPurifier_Length|string $min Minimum length, or null for no bound. String is also acceptable.
     * @param HTMLPurifier_Length|string $max Maximum length, or null for no bound. String is also acceptable.
     */
    public function __construct($min = null, $max = null)
    {
        $this->min = $min !== null ? HTMLPurifier_Length::make($min) : null;
        $this->max = $max !== null ? HTMLPurifier_Length::make($max) : null;
    }

    /**
     * @param string $string
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string
     */
    public function validate($string, $config, $context)
    {
        $string = $this->parseCDATA($string);

        // Optimizations
        if ($string === '') {
            return false;
        }
        if ($string === '0') {
            return '0';
        }
        if (strlen($string) === 1) {
            return false;
        }

        $length = HTMLPurifier_Length::make($string);
        if (!$length->isValid()) {
            return false;
        }

        if ($this->min) {
            $c = $length->compareTo($this->min);
            if ($c === false) {
                return false;
            }
            if ($c < 0) {
                return false;
            }
        }
        if ($this->max) {
            $c = $length->compareTo($this->max);
            if ($c === false) {
                return false;
            }
            if ($c > 0) {
                return false;
            }
        }
        return $length->toString();
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php000064400000002063151214231100021731 0ustar00<?php

/**
 * Decorator which enables CSS properties to be disabled for specific elements.
 */
class HTMLPurifier_AttrDef_CSS_DenyElementDecorator extends HTMLPurifier_AttrDef
{
    /**
     * @type HTMLPurifier_AttrDef
     */
    public $def;
    /**
     * @type string
     */
    public $element;

    /**
     * @param HTMLPurifier_AttrDef $def Definition to wrap
     * @param string $element Element to deny
     */
    public function __construct($def, $element)
    {
        $this->def = $def;
        $this->element = $element;
    }

    /**
     * Checks if CurrentToken is set and equal to $this->element
     * @param string $string
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string
     */
    public function validate($string, $config, $context)
    {
        $token = $context->get('CurrentToken', true);
        if ($token && $token->name == $this->element) {
            return false;
        }
        return $this->def->validate($string, $config, $context);
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php000064400000002204151214231100020606 0ustar00<?php

/**
 * Validates the value for the CSS property text-decoration
 * @note This class could be generalized into a version that acts sort of
 *       like Enum except you can compound the allowed values.
 */
class HTMLPurifier_AttrDef_CSS_TextDecoration extends HTMLPurifier_AttrDef
{

    /**
     * @param string $string
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string
     */
    public function validate($string, $config, $context)
    {
        static $allowed_values = array(
            'line-through' => true,
            'overline' => true,
            'underline' => true,
        );

        $string = strtolower($this->parseCDATA($string));

        if ($string === 'none') {
            return $string;
        }

        $parts = explode(' ', $string);
        $final = '';
        foreach ($parts as $part) {
            if (isset($allowed_values[$part])) {
                $final .= $part . ' ';
            }
        }
        $final = rtrim($final);
        if ($final === '') {
            return false;
        }
        return $final;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Multiple.php000064400000004054151214231100017452 0ustar00<?php

/**
 * Framework class for strings that involve multiple values.
 *
 * Certain CSS properties such as border-width and margin allow multiple
 * lengths to be specified.  This class can take a vanilla border-width
 * definition and multiply it, usually into a max of four.
 *
 * @note Even though the CSS specification isn't clear about it, inherit
 *       can only be used alone: it will never manifest as part of a multi
 *       shorthand declaration.  Thus, this class does not allow inherit.
 */
class HTMLPurifier_AttrDef_CSS_Multiple extends HTMLPurifier_AttrDef
{
    /**
     * Instance of component definition to defer validation to.
     * @type HTMLPurifier_AttrDef
     * @todo Make protected
     */
    public $single;

    /**
     * Max number of values allowed.
     * @todo Make protected
     */
    public $max;

    /**
     * @param HTMLPurifier_AttrDef $single HTMLPurifier_AttrDef to multiply
     * @param int $max Max number of values allowed (usually four)
     */
    public function __construct($single, $max = 4)
    {
        $this->single = $single;
        $this->max = $max;
    }

    /**
     * @param string $string
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string
     */
    public function validate($string, $config, $context)
    {
        $string = $this->mungeRgb($this->parseCDATA($string));
        if ($string === '') {
            return false;
        }
        $parts = explode(' ', $string); // parseCDATA replaced \r, \t and \n
        $length = count($parts);
        $final = '';
        for ($i = 0, $num = 0; $i < $length && $num < $this->max; $i++) {
            if (ctype_space($parts[$i])) {
                continue;
            }
            $result = $this->single->validate($parts[$i], $config, $context);
            if ($result !== false) {
                $final .= $result . ' ';
                $num++;
            }
        }
        if ($final === '') {
            return false;
        }
        return rtrim($final);
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/Lang.php000064400000004604151214231100016111 0ustar00<?php

/**
 * Validates the HTML attribute lang, effectively a language code.
 * @note Built according to RFC 3066, which obsoleted RFC 1766
 */
class HTMLPurifier_AttrDef_Lang extends HTMLPurifier_AttrDef
{

    /**
     * @param string $string
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string
     */
    public function validate($string, $config, $context)
    {
        $string = trim($string);
        if (!$string) {
            return false;
        }

        $subtags = explode('-', $string);
        $num_subtags = count($subtags);

        if ($num_subtags == 0) { // sanity check
            return false;
        }

        // process primary subtag : $subtags[0]
        $length = strlen($subtags[0]);
        switch ($length) {
            case 0:
                return false;
            case 1:
                if (!($subtags[0] == 'x' || $subtags[0] == 'i')) {
                    return false;
                }
                break;
            case 2:
            case 3:
                if (!ctype_alpha($subtags[0])) {
                    return false;
                } elseif (!ctype_lower($subtags[0])) {
                    $subtags[0] = strtolower($subtags[0]);
                }
                break;
            default:
                return false;
        }

        $new_string = $subtags[0];
        if ($num_subtags == 1) {
            return $new_string;
        }

        // process second subtag : $subtags[1]
        $length = strlen($subtags[1]);
        if ($length == 0 || ($length == 1 && $subtags[1] != 'x') || $length > 8 || !ctype_alnum($subtags[1])) {
            return $new_string;
        }
        if (!ctype_lower($subtags[1])) {
            $subtags[1] = strtolower($subtags[1]);
        }

        $new_string .= '-' . $subtags[1];
        if ($num_subtags == 2) {
            return $new_string;
        }

        // process all other subtags, index 2 and up
        for ($i = 2; $i < $num_subtags; $i++) {
            $length = strlen($subtags[$i]);
            if ($length == 0 || $length > 8 || !ctype_alnum($subtags[$i])) {
                return $new_string;
            }
            if (!ctype_lower($subtags[$i])) {
                $subtags[$i] = strtolower($subtags[$i]);
            }
            $new_string .= '-' . $subtags[$i];
        }
        return $new_string;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrDef/Text.php000064400000000656151214231100016157 0ustar00<?php

/**
 * Validates arbitrary text according to the HTML spec.
 */
class HTMLPurifier_AttrDef_Text extends HTMLPurifier_AttrDef
{

    /**
     * @param string $string
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool|string
     */
    public function validate($string, $config, $context)
    {
        return $this->parseCDATA($string);
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Directive.php000064400000003661151214231100022374 0ustar00<?php

/**
 * Interchange component class describing configuration directives.
 */
class HTMLPurifier_ConfigSchema_Interchange_Directive
{

    /**
     * ID of directive.
     * @type HTMLPurifier_ConfigSchema_Interchange_Id
     */
    public $id;

    /**
     * Type, e.g. 'integer' or 'istring'.
     * @type string
     */
    public $type;

    /**
     * Default value, e.g. 3 or 'DefaultVal'.
     * @type mixed
     */
    public $default;

    /**
     * HTML description.
     * @type string
     */
    public $description;

    /**
     * Whether or not null is allowed as a value.
     * @type bool
     */
    public $typeAllowsNull = false;

    /**
     * Lookup table of allowed scalar values.
     * e.g. array('allowed' => true).
     * Null if all values are allowed.
     * @type array
     */
    public $allowed;

    /**
     * List of aliases for the directive.
     * e.g. array(new HTMLPurifier_ConfigSchema_Interchange_Id('Ns', 'Dir'))).
     * @type HTMLPurifier_ConfigSchema_Interchange_Id[]
     */
    public $aliases = array();

    /**
     * Hash of value aliases, e.g. array('alt' => 'real'). Null if value
     * aliasing is disabled (necessary for non-scalar types).
     * @type array
     */
    public $valueAliases;

    /**
     * Version of HTML Purifier the directive was introduced, e.g. '1.3.1'.
     * Null if the directive has always existed.
     * @type string
     */
    public $version;

    /**
     * ID of directive that supercedes this old directive.
     * Null if not deprecated.
     * @type HTMLPurifier_ConfigSchema_Interchange_Id
     */
    public $deprecatedUse;

    /**
     * Version of HTML Purifier this directive was deprecated. Null if not
     * deprecated.
     * @type string
     */
    public $deprecatedVersion;

    /**
     * List of external projects this directive depends on, e.g. array('CSSTidy').
     * @type array
     */
    public $external = array();
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Id.php000064400000002061151214231100021003 0ustar00<?php

/**
 * Represents a directive ID in the interchange format.
 */
class HTMLPurifier_ConfigSchema_Interchange_Id
{

    /**
     * @type string
     */
    public $key;

    /**
     * @param string $key
     */
    public function __construct($key)
    {
        $this->key = $key;
    }

    /**
     * @return string
     * @warning This is NOT magic, to ensure that people don't abuse SPL and
     *          cause problems for PHP 5.0 support.
     */
    public function toString()
    {
        return $this->key;
    }

    /**
     * @return string
     */
    public function getRootNamespace()
    {
        return substr($this->key, 0, strpos($this->key, "."));
    }

    /**
     * @return string
     */
    public function getDirective()
    {
        return substr($this->key, strpos($this->key, ".") + 1);
    }

    /**
     * @param string $id
     * @return HTMLPurifier_ConfigSchema_Interchange_Id
     */
    public static function make($id)
    {
        return new HTMLPurifier_ConfigSchema_Interchange_Id($id);
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange.php000064400000002402151214231100020446 0ustar00<?php

/**
 * Generic schema interchange format that can be converted to a runtime
 * representation (HTMLPurifier_ConfigSchema) or HTML documentation. Members
 * are completely validated.
 */
class HTMLPurifier_ConfigSchema_Interchange
{

    /**
     * Name of the application this schema is describing.
     * @type string
     */
    public $name;

    /**
     * Array of Directive ID => array(directive info)
     * @type HTMLPurifier_ConfigSchema_Interchange_Directive[]
     */
    public $directives = array();

    /**
     * Adds a directive array to $directives
     * @param HTMLPurifier_ConfigSchema_Interchange_Directive $directive
     * @throws HTMLPurifier_ConfigSchema_Exception
     */
    public function addDirective($directive)
    {
        if (isset($this->directives[$i = $directive->id->toString()])) {
            throw new HTMLPurifier_ConfigSchema_Exception("Cannot redefine directive '$i'");
        }
        $this->directives[$i] = $directive;
    }

    /**
     * Convenience function to perform standard validation. Throws exception
     * on failed validation.
     */
    public function validate()
    {
        $validator = new HTMLPurifier_ConfigSchema_Validator();
        return $validator->validate($this);
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/Xml.php000064400000010424151214231100020350 0ustar00<?php

/**
 * Converts HTMLPurifier_ConfigSchema_Interchange to an XML format,
 * which can be further processed to generate documentation.
 */
class HTMLPurifier_ConfigSchema_Builder_Xml extends XMLWriter
{

    /**
     * @type HTMLPurifier_ConfigSchema_Interchange
     */
    protected $interchange;

    /**
     * @type string
     */
    private $namespace;

    /**
     * @param string $html
     */
    protected function writeHTMLDiv($html)
    {
        $this->startElement('div');

        $purifier = HTMLPurifier::getInstance();
        $html = $purifier->purify($html);
        $this->writeAttribute('xmlns', 'http://www.w3.org/1999/xhtml');
        $this->writeRaw($html);

        $this->endElement(); // div
    }

    /**
     * @param mixed $var
     * @return string
     */
    protected function export($var)
    {
        if ($var === array()) {
            return 'array()';
        }
        return var_export($var, true);
    }

    /**
     * @param HTMLPurifier_ConfigSchema_Interchange $interchange
     */
    public function build($interchange)
    {
        // global access, only use as last resort
        $this->interchange = $interchange;

        $this->setIndent(true);
        $this->startDocument('1.0', 'UTF-8');
        $this->startElement('configdoc');
        $this->writeElement('title', $interchange->name);

        foreach ($interchange->directives as $directive) {
            $this->buildDirective($directive);
        }

        if ($this->namespace) {
            $this->endElement();
        } // namespace

        $this->endElement(); // configdoc
        $this->flush();
    }

    /**
     * @param HTMLPurifier_ConfigSchema_Interchange_Directive $directive
     */
    public function buildDirective($directive)
    {
        // Kludge, although I suppose having a notion of a "root namespace"
        // certainly makes things look nicer when documentation is built.
        // Depends on things being sorted.
        if (!$this->namespace || $this->namespace !== $directive->id->getRootNamespace()) {
            if ($this->namespace) {
                $this->endElement();
            } // namespace
            $this->namespace = $directive->id->getRootNamespace();
            $this->startElement('namespace');
            $this->writeAttribute('id', $this->namespace);
            $this->writeElement('name', $this->namespace);
        }

        $this->startElement('directive');
        $this->writeAttribute('id', $directive->id->toString());

        $this->writeElement('name', $directive->id->getDirective());

        $this->startElement('aliases');
        foreach ($directive->aliases as $alias) {
            $this->writeElement('alias', $alias->toString());
        }
        $this->endElement(); // aliases

        $this->startElement('constraints');
        if ($directive->version) {
            $this->writeElement('version', $directive->version);
        }
        $this->startElement('type');
        if ($directive->typeAllowsNull) {
            $this->writeAttribute('allow-null', 'yes');
        }
        $this->text($directive->type);
        $this->endElement(); // type
        if ($directive->allowed) {
            $this->startElement('allowed');
            foreach ($directive->allowed as $value => $x) {
                $this->writeElement('value', $value);
            }
            $this->endElement(); // allowed
        }
        $this->writeElement('default', $this->export($directive->default));
        $this->writeAttribute('xml:space', 'preserve');
        if ($directive->external) {
            $this->startElement('external');
            foreach ($directive->external as $project) {
                $this->writeElement('project', $project);
            }
            $this->endElement();
        }
        $this->endElement(); // constraints

        if ($directive->deprecatedVersion) {
            $this->startElement('deprecated');
            $this->writeElement('version', $directive->deprecatedVersion);
            $this->writeElement('use', $directive->deprecatedUse->toString());
            $this->endElement(); // deprecated
        }

        $this->startElement('description');
        $this->writeHTMLDiv($directive->description);
        $this->endElement(); // description

        $this->endElement(); // directive
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php000064400000002375151214231100022144 0ustar00<?php

/**
 * Converts HTMLPurifier_ConfigSchema_Interchange to our runtime
 * representation used to perform checks on user configuration.
 */
class HTMLPurifier_ConfigSchema_Builder_ConfigSchema
{

    /**
     * @param HTMLPurifier_ConfigSchema_Interchange $interchange
     * @return HTMLPurifier_ConfigSchema
     */
    public function build($interchange)
    {
        $schema = new HTMLPurifier_ConfigSchema();
        foreach ($interchange->directives as $d) {
            $schema->add(
                $d->id->key,
                $d->default,
                $d->type,
                $d->typeAllowsNull
            );
            if ($d->allowed !== null) {
                $schema->addAllowedValues(
                    $d->id->key,
                    $d->allowed
                );
            }
            foreach ($d->aliases as $alias) {
                $schema->addAlias(
                    $alias->key,
                    $d->id->key
                );
            }
            if ($d->valueAliases !== null) {
                $schema->addValueAliases(
                    $d->id->key,
                    $d->valueAliases
                );
            }
        }
        $schema->postProcess();
        return $schema;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema.ser000064400000057176151214231100017503 0ustar00O:25:"HTMLPurifier_ConfigSchema":3:{s:8:"defaults";a:127:{s:19:"Attr.AllowedClasses";N;s:24:"Attr.AllowedFrameTargets";a:0:{}s:15:"Attr.AllowedRel";a:0:{}s:15:"Attr.AllowedRev";a:0:{}s:18:"Attr.ClassUseCDATA";N;s:20:"Attr.DefaultImageAlt";N;s:24:"Attr.DefaultInvalidImage";s:0:"";s:27:"Attr.DefaultInvalidImageAlt";s:13:"Invalid image";s:19:"Attr.DefaultTextDir";s:3:"ltr";s:13:"Attr.EnableID";b:0;s:21:"Attr.ForbiddenClasses";a:0:{}s:13:"Attr.ID.HTML5";N;s:16:"Attr.IDBlacklist";a:0:{}s:22:"Attr.IDBlacklistRegexp";N;s:13:"Attr.IDPrefix";s:0:"";s:18:"Attr.IDPrefixLocal";s:0:"";s:24:"AutoFormat.AutoParagraph";b:0;s:17:"AutoFormat.Custom";a:0:{}s:25:"AutoFormat.DisplayLinkURI";b:0;s:18:"AutoFormat.Linkify";b:0;s:33:"AutoFormat.PurifierLinkify.DocURL";s:3:"#%s";s:26:"AutoFormat.PurifierLinkify";b:0;s:32:"AutoFormat.RemoveEmpty.Predicate";a:4:{s:8:"colgroup";a:0:{}s:2:"th";a:0:{}s:2:"td";a:0:{}s:6:"iframe";a:1:{i:0;s:3:"src";}}s:44:"AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions";a:2:{s:2:"td";b:1;s:2:"th";b:1;}s:33:"AutoFormat.RemoveEmpty.RemoveNbsp";b:0;s:22:"AutoFormat.RemoveEmpty";b:0;s:39:"AutoFormat.RemoveSpansWithoutAttributes";b:0;s:19:"CSS.AllowDuplicates";b:0;s:18:"CSS.AllowImportant";b:0;s:15:"CSS.AllowTricky";b:0;s:16:"CSS.AllowedFonts";N;s:21:"CSS.AllowedProperties";N;s:17:"CSS.DefinitionRev";i:1;s:23:"CSS.ForbiddenProperties";a:0:{}s:16:"CSS.MaxImgLength";s:6:"1200px";s:15:"CSS.Proprietary";b:0;s:11:"CSS.Trusted";b:0;s:20:"Cache.DefinitionImpl";s:10:"Serializer";s:20:"Cache.SerializerPath";N;s:27:"Cache.SerializerPermissions";i:493;s:22:"Core.AggressivelyFixLt";b:1;s:29:"Core.AggressivelyRemoveScript";b:1;s:28:"Core.AllowHostnameUnderscore";b:0;s:23:"Core.AllowParseManyTags";b:0;s:18:"Core.CollectErrors";b:0;s:18:"Core.ColorKeywords";a:148:{s:9:"aliceblue";s:7:"#F0F8FF";s:12:"antiquewhite";s:7:"#FAEBD7";s:4:"aqua";s:7:"#00FFFF";s:10:"aquamarine";s:7:"#7FFFD4";s:5:"azure";s:7:"#F0FFFF";s:5:"beige";s:7:"#F5F5DC";s:6:"bisque";s:7:"#FFE4C4";s:5:"black";s:7:"#000000";s:14:"blanchedalmond";s:7:"#FFEBCD";s:4:"blue";s:7:"#0000FF";s:10:"blueviolet";s:7:"#8A2BE2";s:5:"brown";s:7:"#A52A2A";s:9:"burlywood";s:7:"#DEB887";s:9:"cadetblue";s:7:"#5F9EA0";s:10:"chartreuse";s:7:"#7FFF00";s:9:"chocolate";s:7:"#D2691E";s:5:"coral";s:7:"#FF7F50";s:14:"cornflowerblue";s:7:"#6495ED";s:8:"cornsilk";s:7:"#FFF8DC";s:7:"crimson";s:7:"#DC143C";s:4:"cyan";s:7:"#00FFFF";s:8:"darkblue";s:7:"#00008B";s:8:"darkcyan";s:7:"#008B8B";s:13:"darkgoldenrod";s:7:"#B8860B";s:8:"darkgray";s:7:"#A9A9A9";s:8:"darkgrey";s:7:"#A9A9A9";s:9:"darkgreen";s:7:"#006400";s:9:"darkkhaki";s:7:"#BDB76B";s:11:"darkmagenta";s:7:"#8B008B";s:14:"darkolivegreen";s:7:"#556B2F";s:10:"darkorange";s:7:"#FF8C00";s:10:"darkorchid";s:7:"#9932CC";s:7:"darkred";s:7:"#8B0000";s:10:"darksalmon";s:7:"#E9967A";s:12:"darkseagreen";s:7:"#8FBC8F";s:13:"darkslateblue";s:7:"#483D8B";s:13:"darkslategray";s:7:"#2F4F4F";s:13:"darkslategrey";s:7:"#2F4F4F";s:13:"darkturquoise";s:7:"#00CED1";s:10:"darkviolet";s:7:"#9400D3";s:8:"deeppink";s:7:"#FF1493";s:11:"deepskyblue";s:7:"#00BFFF";s:7:"dimgray";s:7:"#696969";s:7:"dimgrey";s:7:"#696969";s:10:"dodgerblue";s:7:"#1E90FF";s:9:"firebrick";s:7:"#B22222";s:11:"floralwhite";s:7:"#FFFAF0";s:11:"forestgreen";s:7:"#228B22";s:7:"fuchsia";s:7:"#FF00FF";s:9:"gainsboro";s:7:"#DCDCDC";s:10:"ghostwhite";s:7:"#F8F8FF";s:4:"gold";s:7:"#FFD700";s:9:"goldenrod";s:7:"#DAA520";s:4:"gray";s:7:"#808080";s:4:"grey";s:7:"#808080";s:5:"green";s:7:"#008000";s:11:"greenyellow";s:7:"#ADFF2F";s:8:"honeydew";s:7:"#F0FFF0";s:7:"hotpink";s:7:"#FF69B4";s:9:"indianred";s:7:"#CD5C5C";s:6:"indigo";s:7:"#4B0082";s:5:"ivory";s:7:"#FFFFF0";s:5:"khaki";s:7:"#F0E68C";s:8:"lavender";s:7:"#E6E6FA";s:13:"lavenderblush";s:7:"#FFF0F5";s:9:"lawngreen";s:7:"#7CFC00";s:12:"lemonchiffon";s:7:"#FFFACD";s:9:"lightblue";s:7:"#ADD8E6";s:10:"lightcoral";s:7:"#F08080";s:9:"lightcyan";s:7:"#E0FFFF";s:20:"lightgoldenrodyellow";s:7:"#FAFAD2";s:9:"lightgray";s:7:"#D3D3D3";s:9:"lightgrey";s:7:"#D3D3D3";s:10:"lightgreen";s:7:"#90EE90";s:9:"lightpink";s:7:"#FFB6C1";s:11:"lightsalmon";s:7:"#FFA07A";s:13:"lightseagreen";s:7:"#20B2AA";s:12:"lightskyblue";s:7:"#87CEFA";s:14:"lightslategray";s:7:"#778899";s:14:"lightslategrey";s:7:"#778899";s:14:"lightsteelblue";s:7:"#B0C4DE";s:11:"lightyellow";s:7:"#FFFFE0";s:4:"lime";s:7:"#00FF00";s:9:"limegreen";s:7:"#32CD32";s:5:"linen";s:7:"#FAF0E6";s:7:"magenta";s:7:"#FF00FF";s:6:"maroon";s:7:"#800000";s:16:"mediumaquamarine";s:7:"#66CDAA";s:10:"mediumblue";s:7:"#0000CD";s:12:"mediumorchid";s:7:"#BA55D3";s:12:"mediumpurple";s:7:"#9370DB";s:14:"mediumseagreen";s:7:"#3CB371";s:15:"mediumslateblue";s:7:"#7B68EE";s:17:"mediumspringgreen";s:7:"#00FA9A";s:15:"mediumturquoise";s:7:"#48D1CC";s:15:"mediumvioletred";s:7:"#C71585";s:12:"midnightblue";s:7:"#191970";s:9:"mintcream";s:7:"#F5FFFA";s:9:"mistyrose";s:7:"#FFE4E1";s:8:"moccasin";s:7:"#FFE4B5";s:11:"navajowhite";s:7:"#FFDEAD";s:4:"navy";s:7:"#000080";s:7:"oldlace";s:7:"#FDF5E6";s:5:"olive";s:7:"#808000";s:9:"olivedrab";s:7:"#6B8E23";s:6:"orange";s:7:"#FFA500";s:9:"orangered";s:7:"#FF4500";s:6:"orchid";s:7:"#DA70D6";s:13:"palegoldenrod";s:7:"#EEE8AA";s:9:"palegreen";s:7:"#98FB98";s:13:"paleturquoise";s:7:"#AFEEEE";s:13:"palevioletred";s:7:"#DB7093";s:10:"papayawhip";s:7:"#FFEFD5";s:9:"peachpuff";s:7:"#FFDAB9";s:4:"peru";s:7:"#CD853F";s:4:"pink";s:7:"#FFC0CB";s:4:"plum";s:7:"#DDA0DD";s:10:"powderblue";s:7:"#B0E0E6";s:6:"purple";s:7:"#800080";s:13:"rebeccapurple";s:7:"#663399";s:3:"red";s:7:"#FF0000";s:9:"rosybrown";s:7:"#BC8F8F";s:9:"royalblue";s:7:"#4169E1";s:11:"saddlebrown";s:7:"#8B4513";s:6:"salmon";s:7:"#FA8072";s:10:"sandybrown";s:7:"#F4A460";s:8:"seagreen";s:7:"#2E8B57";s:8:"seashell";s:7:"#FFF5EE";s:6:"sienna";s:7:"#A0522D";s:6:"silver";s:7:"#C0C0C0";s:7:"skyblue";s:7:"#87CEEB";s:9:"slateblue";s:7:"#6A5ACD";s:9:"slategray";s:7:"#708090";s:9:"slategrey";s:7:"#708090";s:4:"snow";s:7:"#FFFAFA";s:11:"springgreen";s:7:"#00FF7F";s:9:"steelblue";s:7:"#4682B4";s:3:"tan";s:7:"#D2B48C";s:4:"teal";s:7:"#008080";s:7:"thistle";s:7:"#D8BFD8";s:6:"tomato";s:7:"#FF6347";s:9:"turquoise";s:7:"#40E0D0";s:6:"violet";s:7:"#EE82EE";s:5:"wheat";s:7:"#F5DEB3";s:5:"white";s:7:"#FFFFFF";s:10:"whitesmoke";s:7:"#F5F5F5";s:6:"yellow";s:7:"#FFFF00";s:11:"yellowgreen";s:7:"#9ACD32";}s:30:"Core.ConvertDocumentToFragment";b:1;s:36:"Core.DirectLexLineNumberSyncInterval";i:0;s:20:"Core.DisableExcludes";b:0;s:15:"Core.EnableIDNA";b:0;s:13:"Core.Encoding";s:5:"utf-8";s:26:"Core.EscapeInvalidChildren";b:0;s:22:"Core.EscapeInvalidTags";b:0;s:29:"Core.EscapeNonASCIICharacters";b:0;s:19:"Core.HiddenElements";a:2:{s:6:"script";b:1;s:5:"style";b:1;}s:13:"Core.Language";s:2:"en";s:24:"Core.LegacyEntityDecoder";b:0;s:14:"Core.LexerImpl";N;s:24:"Core.MaintainLineNumbers";N;s:22:"Core.NormalizeNewlines";b:1;s:21:"Core.RemoveInvalidImg";b:1;s:33:"Core.RemoveProcessingInstructions";b:0;s:25:"Core.RemoveScriptContents";N;s:13:"Filter.Custom";a:0:{}s:34:"Filter.ExtractStyleBlocks.Escaping";b:1;s:31:"Filter.ExtractStyleBlocks.Scope";N;s:34:"Filter.ExtractStyleBlocks.TidyImpl";N;s:25:"Filter.ExtractStyleBlocks";b:0;s:14:"Filter.YouTube";b:0;s:12:"HTML.Allowed";N;s:22:"HTML.AllowedAttributes";N;s:20:"HTML.AllowedComments";a:0:{}s:26:"HTML.AllowedCommentsRegexp";N;s:20:"HTML.AllowedElements";N;s:19:"HTML.AllowedModules";N;s:23:"HTML.Attr.Name.UseCDATA";b:0;s:17:"HTML.BlockWrapper";s:1:"p";s:16:"HTML.CoreModules";a:7:{s:9:"Structure";b:1;s:4:"Text";b:1;s:9:"Hypertext";b:1;s:4:"List";b:1;s:22:"NonXMLCommonAttributes";b:1;s:19:"XMLCommonAttributes";b:1;s:16:"CommonAttributes";b:1;}s:18:"HTML.CustomDoctype";N;s:17:"HTML.DefinitionID";N;s:18:"HTML.DefinitionRev";i:1;s:12:"HTML.Doctype";N;s:25:"HTML.FlashAllowFullScreen";b:0;s:24:"HTML.ForbiddenAttributes";a:0:{}s:22:"HTML.ForbiddenElements";a:0:{}s:10:"HTML.Forms";b:0;s:17:"HTML.MaxImgLength";i:1200;s:13:"HTML.Nofollow";b:0;s:11:"HTML.Parent";s:3:"div";s:16:"HTML.Proprietary";b:0;s:14:"HTML.SafeEmbed";b:0;s:15:"HTML.SafeIframe";b:0;s:15:"HTML.SafeObject";b:0;s:18:"HTML.SafeScripting";a:0:{}s:11:"HTML.Strict";b:0;s:16:"HTML.TargetBlank";b:0;s:19:"HTML.TargetNoopener";b:1;s:21:"HTML.TargetNoreferrer";b:1;s:12:"HTML.TidyAdd";a:0:{}s:14:"HTML.TidyLevel";s:6:"medium";s:15:"HTML.TidyRemove";a:0:{}s:12:"HTML.Trusted";b:0;s:10:"HTML.XHTML";b:1;s:28:"Output.CommentScriptContents";b:1;s:19:"Output.FixInnerHTML";b:1;s:18:"Output.FlashCompat";b:0;s:14:"Output.Newline";N;s:15:"Output.SortAttr";b:0;s:17:"Output.TidyFormat";b:0;s:17:"Test.ForceNoIconv";b:0;s:18:"URI.AllowedSchemes";a:7:{s:4:"http";b:1;s:5:"https";b:1;s:6:"mailto";b:1;s:3:"ftp";b:1;s:4:"nntp";b:1;s:4:"news";b:1;s:3:"tel";b:1;}s:8:"URI.Base";N;s:17:"URI.DefaultScheme";s:4:"http";s:16:"URI.DefinitionID";N;s:17:"URI.DefinitionRev";i:1;s:11:"URI.Disable";b:0;s:19:"URI.DisableExternal";b:0;s:28:"URI.DisableExternalResources";b:0;s:20:"URI.DisableResources";b:0;s:8:"URI.Host";N;s:17:"URI.HostBlacklist";a:0:{}s:16:"URI.MakeAbsolute";b:0;s:9:"URI.Munge";N;s:18:"URI.MungeResources";b:0;s:18:"URI.MungeSecretKey";N;s:26:"URI.OverrideAllowedSchemes";b:1;s:20:"URI.SafeIframeRegexp";N;}s:12:"defaultPlist";O:25:"HTMLPurifier_PropertyList":3:{s:7:"*data";a:127:{s:19:"Attr.AllowedClasses";N;s:24:"Attr.AllowedFrameTargets";a:0:{}s:15:"Attr.AllowedRel";a:0:{}s:15:"Attr.AllowedRev";a:0:{}s:18:"Attr.ClassUseCDATA";N;s:20:"Attr.DefaultImageAlt";N;s:24:"Attr.DefaultInvalidImage";s:0:"";s:27:"Attr.DefaultInvalidImageAlt";s:13:"Invalid image";s:19:"Attr.DefaultTextDir";s:3:"ltr";s:13:"Attr.EnableID";b:0;s:21:"Attr.ForbiddenClasses";a:0:{}s:13:"Attr.ID.HTML5";N;s:16:"Attr.IDBlacklist";a:0:{}s:22:"Attr.IDBlacklistRegexp";N;s:13:"Attr.IDPrefix";s:0:"";s:18:"Attr.IDPrefixLocal";s:0:"";s:24:"AutoFormat.AutoParagraph";b:0;s:17:"AutoFormat.Custom";a:0:{}s:25:"AutoFormat.DisplayLinkURI";b:0;s:18:"AutoFormat.Linkify";b:0;s:33:"AutoFormat.PurifierLinkify.DocURL";s:3:"#%s";s:26:"AutoFormat.PurifierLinkify";b:0;s:32:"AutoFormat.RemoveEmpty.Predicate";a:4:{s:8:"colgroup";a:0:{}s:2:"th";a:0:{}s:2:"td";a:0:{}s:6:"iframe";a:1:{i:0;s:3:"src";}}s:44:"AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions";a:2:{s:2:"td";b:1;s:2:"th";b:1;}s:33:"AutoFormat.RemoveEmpty.RemoveNbsp";b:0;s:22:"AutoFormat.RemoveEmpty";b:0;s:39:"AutoFormat.RemoveSpansWithoutAttributes";b:0;s:19:"CSS.AllowDuplicates";b:0;s:18:"CSS.AllowImportant";b:0;s:15:"CSS.AllowTricky";b:0;s:16:"CSS.AllowedFonts";N;s:21:"CSS.AllowedProperties";N;s:17:"CSS.DefinitionRev";i:1;s:23:"CSS.ForbiddenProperties";a:0:{}s:16:"CSS.MaxImgLength";s:6:"1200px";s:15:"CSS.Proprietary";b:0;s:11:"CSS.Trusted";b:0;s:20:"Cache.DefinitionImpl";s:10:"Serializer";s:20:"Cache.SerializerPath";N;s:27:"Cache.SerializerPermissions";i:493;s:22:"Core.AggressivelyFixLt";b:1;s:29:"Core.AggressivelyRemoveScript";b:1;s:28:"Core.AllowHostnameUnderscore";b:0;s:23:"Core.AllowParseManyTags";b:0;s:18:"Core.CollectErrors";b:0;s:18:"Core.ColorKeywords";a:148:{s:9:"aliceblue";s:7:"#F0F8FF";s:12:"antiquewhite";s:7:"#FAEBD7";s:4:"aqua";s:7:"#00FFFF";s:10:"aquamarine";s:7:"#7FFFD4";s:5:"azure";s:7:"#F0FFFF";s:5:"beige";s:7:"#F5F5DC";s:6:"bisque";s:7:"#FFE4C4";s:5:"black";s:7:"#000000";s:14:"blanchedalmond";s:7:"#FFEBCD";s:4:"blue";s:7:"#0000FF";s:10:"blueviolet";s:7:"#8A2BE2";s:5:"brown";s:7:"#A52A2A";s:9:"burlywood";s:7:"#DEB887";s:9:"cadetblue";s:7:"#5F9EA0";s:10:"chartreuse";s:7:"#7FFF00";s:9:"chocolate";s:7:"#D2691E";s:5:"coral";s:7:"#FF7F50";s:14:"cornflowerblue";s:7:"#6495ED";s:8:"cornsilk";s:7:"#FFF8DC";s:7:"crimson";s:7:"#DC143C";s:4:"cyan";s:7:"#00FFFF";s:8:"darkblue";s:7:"#00008B";s:8:"darkcyan";s:7:"#008B8B";s:13:"darkgoldenrod";s:7:"#B8860B";s:8:"darkgray";s:7:"#A9A9A9";s:8:"darkgrey";s:7:"#A9A9A9";s:9:"darkgreen";s:7:"#006400";s:9:"darkkhaki";s:7:"#BDB76B";s:11:"darkmagenta";s:7:"#8B008B";s:14:"darkolivegreen";s:7:"#556B2F";s:10:"darkorange";s:7:"#FF8C00";s:10:"darkorchid";s:7:"#9932CC";s:7:"darkred";s:7:"#8B0000";s:10:"darksalmon";s:7:"#E9967A";s:12:"darkseagreen";s:7:"#8FBC8F";s:13:"darkslateblue";s:7:"#483D8B";s:13:"darkslategray";s:7:"#2F4F4F";s:13:"darkslategrey";s:7:"#2F4F4F";s:13:"darkturquoise";s:7:"#00CED1";s:10:"darkviolet";s:7:"#9400D3";s:8:"deeppink";s:7:"#FF1493";s:11:"deepskyblue";s:7:"#00BFFF";s:7:"dimgray";s:7:"#696969";s:7:"dimgrey";s:7:"#696969";s:10:"dodgerblue";s:7:"#1E90FF";s:9:"firebrick";s:7:"#B22222";s:11:"floralwhite";s:7:"#FFFAF0";s:11:"forestgreen";s:7:"#228B22";s:7:"fuchsia";s:7:"#FF00FF";s:9:"gainsboro";s:7:"#DCDCDC";s:10:"ghostwhite";s:7:"#F8F8FF";s:4:"gold";s:7:"#FFD700";s:9:"goldenrod";s:7:"#DAA520";s:4:"gray";s:7:"#808080";s:4:"grey";s:7:"#808080";s:5:"green";s:7:"#008000";s:11:"greenyellow";s:7:"#ADFF2F";s:8:"honeydew";s:7:"#F0FFF0";s:7:"hotpink";s:7:"#FF69B4";s:9:"indianred";s:7:"#CD5C5C";s:6:"indigo";s:7:"#4B0082";s:5:"ivory";s:7:"#FFFFF0";s:5:"khaki";s:7:"#F0E68C";s:8:"lavender";s:7:"#E6E6FA";s:13:"lavenderblush";s:7:"#FFF0F5";s:9:"lawngreen";s:7:"#7CFC00";s:12:"lemonchiffon";s:7:"#FFFACD";s:9:"lightblue";s:7:"#ADD8E6";s:10:"lightcoral";s:7:"#F08080";s:9:"lightcyan";s:7:"#E0FFFF";s:20:"lightgoldenrodyellow";s:7:"#FAFAD2";s:9:"lightgray";s:7:"#D3D3D3";s:9:"lightgrey";s:7:"#D3D3D3";s:10:"lightgreen";s:7:"#90EE90";s:9:"lightpink";s:7:"#FFB6C1";s:11:"lightsalmon";s:7:"#FFA07A";s:13:"lightseagreen";s:7:"#20B2AA";s:12:"lightskyblue";s:7:"#87CEFA";s:14:"lightslategray";s:7:"#778899";s:14:"lightslategrey";s:7:"#778899";s:14:"lightsteelblue";s:7:"#B0C4DE";s:11:"lightyellow";s:7:"#FFFFE0";s:4:"lime";s:7:"#00FF00";s:9:"limegreen";s:7:"#32CD32";s:5:"linen";s:7:"#FAF0E6";s:7:"magenta";s:7:"#FF00FF";s:6:"maroon";s:7:"#800000";s:16:"mediumaquamarine";s:7:"#66CDAA";s:10:"mediumblue";s:7:"#0000CD";s:12:"mediumorchid";s:7:"#BA55D3";s:12:"mediumpurple";s:7:"#9370DB";s:14:"mediumseagreen";s:7:"#3CB371";s:15:"mediumslateblue";s:7:"#7B68EE";s:17:"mediumspringgreen";s:7:"#00FA9A";s:15:"mediumturquoise";s:7:"#48D1CC";s:15:"mediumvioletred";s:7:"#C71585";s:12:"midnightblue";s:7:"#191970";s:9:"mintcream";s:7:"#F5FFFA";s:9:"mistyrose";s:7:"#FFE4E1";s:8:"moccasin";s:7:"#FFE4B5";s:11:"navajowhite";s:7:"#FFDEAD";s:4:"navy";s:7:"#000080";s:7:"oldlace";s:7:"#FDF5E6";s:5:"olive";s:7:"#808000";s:9:"olivedrab";s:7:"#6B8E23";s:6:"orange";s:7:"#FFA500";s:9:"orangered";s:7:"#FF4500";s:6:"orchid";s:7:"#DA70D6";s:13:"palegoldenrod";s:7:"#EEE8AA";s:9:"palegreen";s:7:"#98FB98";s:13:"paleturquoise";s:7:"#AFEEEE";s:13:"palevioletred";s:7:"#DB7093";s:10:"papayawhip";s:7:"#FFEFD5";s:9:"peachpuff";s:7:"#FFDAB9";s:4:"peru";s:7:"#CD853F";s:4:"pink";s:7:"#FFC0CB";s:4:"plum";s:7:"#DDA0DD";s:10:"powderblue";s:7:"#B0E0E6";s:6:"purple";s:7:"#800080";s:13:"rebeccapurple";s:7:"#663399";s:3:"red";s:7:"#FF0000";s:9:"rosybrown";s:7:"#BC8F8F";s:9:"royalblue";s:7:"#4169E1";s:11:"saddlebrown";s:7:"#8B4513";s:6:"salmon";s:7:"#FA8072";s:10:"sandybrown";s:7:"#F4A460";s:8:"seagreen";s:7:"#2E8B57";s:8:"seashell";s:7:"#FFF5EE";s:6:"sienna";s:7:"#A0522D";s:6:"silver";s:7:"#C0C0C0";s:7:"skyblue";s:7:"#87CEEB";s:9:"slateblue";s:7:"#6A5ACD";s:9:"slategray";s:7:"#708090";s:9:"slategrey";s:7:"#708090";s:4:"snow";s:7:"#FFFAFA";s:11:"springgreen";s:7:"#00FF7F";s:9:"steelblue";s:7:"#4682B4";s:3:"tan";s:7:"#D2B48C";s:4:"teal";s:7:"#008080";s:7:"thistle";s:7:"#D8BFD8";s:6:"tomato";s:7:"#FF6347";s:9:"turquoise";s:7:"#40E0D0";s:6:"violet";s:7:"#EE82EE";s:5:"wheat";s:7:"#F5DEB3";s:5:"white";s:7:"#FFFFFF";s:10:"whitesmoke";s:7:"#F5F5F5";s:6:"yellow";s:7:"#FFFF00";s:11:"yellowgreen";s:7:"#9ACD32";}s:30:"Core.ConvertDocumentToFragment";b:1;s:36:"Core.DirectLexLineNumberSyncInterval";i:0;s:20:"Core.DisableExcludes";b:0;s:15:"Core.EnableIDNA";b:0;s:13:"Core.Encoding";s:5:"utf-8";s:26:"Core.EscapeInvalidChildren";b:0;s:22:"Core.EscapeInvalidTags";b:0;s:29:"Core.EscapeNonASCIICharacters";b:0;s:19:"Core.HiddenElements";a:2:{s:6:"script";b:1;s:5:"style";b:1;}s:13:"Core.Language";s:2:"en";s:24:"Core.LegacyEntityDecoder";b:0;s:14:"Core.LexerImpl";N;s:24:"Core.MaintainLineNumbers";N;s:22:"Core.NormalizeNewlines";b:1;s:21:"Core.RemoveInvalidImg";b:1;s:33:"Core.RemoveProcessingInstructions";b:0;s:25:"Core.RemoveScriptContents";N;s:13:"Filter.Custom";a:0:{}s:34:"Filter.ExtractStyleBlocks.Escaping";b:1;s:31:"Filter.ExtractStyleBlocks.Scope";N;s:34:"Filter.ExtractStyleBlocks.TidyImpl";N;s:25:"Filter.ExtractStyleBlocks";b:0;s:14:"Filter.YouTube";b:0;s:12:"HTML.Allowed";N;s:22:"HTML.AllowedAttributes";N;s:20:"HTML.AllowedComments";a:0:{}s:26:"HTML.AllowedCommentsRegexp";N;s:20:"HTML.AllowedElements";N;s:19:"HTML.AllowedModules";N;s:23:"HTML.Attr.Name.UseCDATA";b:0;s:17:"HTML.BlockWrapper";s:1:"p";s:16:"HTML.CoreModules";a:7:{s:9:"Structure";b:1;s:4:"Text";b:1;s:9:"Hypertext";b:1;s:4:"List";b:1;s:22:"NonXMLCommonAttributes";b:1;s:19:"XMLCommonAttributes";b:1;s:16:"CommonAttributes";b:1;}s:18:"HTML.CustomDoctype";N;s:17:"HTML.DefinitionID";N;s:18:"HTML.DefinitionRev";i:1;s:12:"HTML.Doctype";N;s:25:"HTML.FlashAllowFullScreen";b:0;s:24:"HTML.ForbiddenAttributes";a:0:{}s:22:"HTML.ForbiddenElements";a:0:{}s:10:"HTML.Forms";b:0;s:17:"HTML.MaxImgLength";i:1200;s:13:"HTML.Nofollow";b:0;s:11:"HTML.Parent";s:3:"div";s:16:"HTML.Proprietary";b:0;s:14:"HTML.SafeEmbed";b:0;s:15:"HTML.SafeIframe";b:0;s:15:"HTML.SafeObject";b:0;s:18:"HTML.SafeScripting";a:0:{}s:11:"HTML.Strict";b:0;s:16:"HTML.TargetBlank";b:0;s:19:"HTML.TargetNoopener";b:1;s:21:"HTML.TargetNoreferrer";b:1;s:12:"HTML.TidyAdd";a:0:{}s:14:"HTML.TidyLevel";s:6:"medium";s:15:"HTML.TidyRemove";a:0:{}s:12:"HTML.Trusted";b:0;s:10:"HTML.XHTML";b:1;s:28:"Output.CommentScriptContents";b:1;s:19:"Output.FixInnerHTML";b:1;s:18:"Output.FlashCompat";b:0;s:14:"Output.Newline";N;s:15:"Output.SortAttr";b:0;s:17:"Output.TidyFormat";b:0;s:17:"Test.ForceNoIconv";b:0;s:18:"URI.AllowedSchemes";a:7:{s:4:"http";b:1;s:5:"https";b:1;s:6:"mailto";b:1;s:3:"ftp";b:1;s:4:"nntp";b:1;s:4:"news";b:1;s:3:"tel";b:1;}s:8:"URI.Base";N;s:17:"URI.DefaultScheme";s:4:"http";s:16:"URI.DefinitionID";N;s:17:"URI.DefinitionRev";i:1;s:11:"URI.Disable";b:0;s:19:"URI.DisableExternal";b:0;s:28:"URI.DisableExternalResources";b:0;s:20:"URI.DisableResources";b:0;s:8:"URI.Host";N;s:17:"URI.HostBlacklist";a:0:{}s:16:"URI.MakeAbsolute";b:0;s:9:"URI.Munge";N;s:18:"URI.MungeResources";b:0;s:18:"URI.MungeSecretKey";N;s:26:"URI.OverrideAllowedSchemes";b:1;s:20:"URI.SafeIframeRegexp";N;}s:9:"*parent";N;s:8:"*cache";N;}s:4:"info";a:140:{s:19:"Attr.AllowedClasses";i:-8;s:24:"Attr.AllowedFrameTargets";i:8;s:15:"Attr.AllowedRel";i:8;s:15:"Attr.AllowedRev";i:8;s:18:"Attr.ClassUseCDATA";i:-7;s:20:"Attr.DefaultImageAlt";i:-1;s:24:"Attr.DefaultInvalidImage";i:1;s:27:"Attr.DefaultInvalidImageAlt";i:1;s:19:"Attr.DefaultTextDir";O:8:"stdClass":2:{s:4:"type";i:1;s:7:"allowed";a:2:{s:3:"ltr";b:1;s:3:"rtl";b:1;}}s:13:"Attr.EnableID";i:7;s:17:"HTML.EnableAttrID";O:8:"stdClass":2:{s:3:"key";s:13:"Attr.EnableID";s:7:"isAlias";b:1;}s:21:"Attr.ForbiddenClasses";i:8;s:13:"Attr.ID.HTML5";i:-7;s:16:"Attr.IDBlacklist";i:9;s:22:"Attr.IDBlacklistRegexp";i:-1;s:13:"Attr.IDPrefix";i:1;s:18:"Attr.IDPrefixLocal";i:1;s:24:"AutoFormat.AutoParagraph";i:7;s:17:"AutoFormat.Custom";i:9;s:25:"AutoFormat.DisplayLinkURI";i:7;s:18:"AutoFormat.Linkify";i:7;s:33:"AutoFormat.PurifierLinkify.DocURL";i:1;s:37:"AutoFormatParam.PurifierLinkifyDocURL";O:8:"stdClass":2:{s:3:"key";s:33:"AutoFormat.PurifierLinkify.DocURL";s:7:"isAlias";b:1;}s:26:"AutoFormat.PurifierLinkify";i:7;s:32:"AutoFormat.RemoveEmpty.Predicate";i:10;s:44:"AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions";i:8;s:33:"AutoFormat.RemoveEmpty.RemoveNbsp";i:7;s:22:"AutoFormat.RemoveEmpty";i:7;s:39:"AutoFormat.RemoveSpansWithoutAttributes";i:7;s:19:"CSS.AllowDuplicates";i:7;s:18:"CSS.AllowImportant";i:7;s:15:"CSS.AllowTricky";i:7;s:16:"CSS.AllowedFonts";i:-8;s:21:"CSS.AllowedProperties";i:-8;s:17:"CSS.DefinitionRev";i:5;s:23:"CSS.ForbiddenProperties";i:8;s:16:"CSS.MaxImgLength";i:-1;s:15:"CSS.Proprietary";i:7;s:11:"CSS.Trusted";i:7;s:20:"Cache.DefinitionImpl";i:-1;s:20:"Core.DefinitionCache";O:8:"stdClass":2:{s:3:"key";s:20:"Cache.DefinitionImpl";s:7:"isAlias";b:1;}s:20:"Cache.SerializerPath";i:-1;s:27:"Cache.SerializerPermissions";i:-5;s:22:"Core.AggressivelyFixLt";i:7;s:29:"Core.AggressivelyRemoveScript";i:7;s:28:"Core.AllowHostnameUnderscore";i:7;s:23:"Core.AllowParseManyTags";i:7;s:18:"Core.CollectErrors";i:7;s:18:"Core.ColorKeywords";i:10;s:30:"Core.ConvertDocumentToFragment";i:7;s:24:"Core.AcceptFullDocuments";O:8:"stdClass":2:{s:3:"key";s:30:"Core.ConvertDocumentToFragment";s:7:"isAlias";b:1;}s:36:"Core.DirectLexLineNumberSyncInterval";i:5;s:20:"Core.DisableExcludes";i:7;s:15:"Core.EnableIDNA";i:7;s:13:"Core.Encoding";i:2;s:26:"Core.EscapeInvalidChildren";i:7;s:22:"Core.EscapeInvalidTags";i:7;s:29:"Core.EscapeNonASCIICharacters";i:7;s:19:"Core.HiddenElements";i:8;s:13:"Core.Language";i:1;s:24:"Core.LegacyEntityDecoder";i:7;s:14:"Core.LexerImpl";i:-11;s:24:"Core.MaintainLineNumbers";i:-7;s:22:"Core.NormalizeNewlines";i:7;s:21:"Core.RemoveInvalidImg";i:7;s:33:"Core.RemoveProcessingInstructions";i:7;s:25:"Core.RemoveScriptContents";i:-7;s:13:"Filter.Custom";i:9;s:34:"Filter.ExtractStyleBlocks.Escaping";i:7;s:33:"Filter.ExtractStyleBlocksEscaping";O:8:"stdClass":2:{s:3:"key";s:34:"Filter.ExtractStyleBlocks.Escaping";s:7:"isAlias";b:1;}s:38:"FilterParam.ExtractStyleBlocksEscaping";O:8:"stdClass":2:{s:3:"key";s:34:"Filter.ExtractStyleBlocks.Escaping";s:7:"isAlias";b:1;}s:31:"Filter.ExtractStyleBlocks.Scope";i:-1;s:30:"Filter.ExtractStyleBlocksScope";O:8:"stdClass":2:{s:3:"key";s:31:"Filter.ExtractStyleBlocks.Scope";s:7:"isAlias";b:1;}s:35:"FilterParam.ExtractStyleBlocksScope";O:8:"stdClass":2:{s:3:"key";s:31:"Filter.ExtractStyleBlocks.Scope";s:7:"isAlias";b:1;}s:34:"Filter.ExtractStyleBlocks.TidyImpl";i:-11;s:38:"FilterParam.ExtractStyleBlocksTidyImpl";O:8:"stdClass":2:{s:3:"key";s:34:"Filter.ExtractStyleBlocks.TidyImpl";s:7:"isAlias";b:1;}s:25:"Filter.ExtractStyleBlocks";i:7;s:14:"Filter.YouTube";i:7;s:12:"HTML.Allowed";i:-4;s:22:"HTML.AllowedAttributes";i:-8;s:20:"HTML.AllowedComments";i:8;s:26:"HTML.AllowedCommentsRegexp";i:-1;s:20:"HTML.AllowedElements";i:-8;s:19:"HTML.AllowedModules";i:-8;s:23:"HTML.Attr.Name.UseCDATA";i:7;s:17:"HTML.BlockWrapper";i:1;s:16:"HTML.CoreModules";i:8;s:18:"HTML.CustomDoctype";i:-1;s:17:"HTML.DefinitionID";i:-1;s:18:"HTML.DefinitionRev";i:5;s:12:"HTML.Doctype";O:8:"stdClass":3:{s:4:"type";i:1;s:10:"allow_null";b:1;s:7:"allowed";a:5:{s:22:"HTML 4.01 Transitional";b:1;s:16:"HTML 4.01 Strict";b:1;s:22:"XHTML 1.0 Transitional";b:1;s:16:"XHTML 1.0 Strict";b:1;s:9:"XHTML 1.1";b:1;}}s:25:"HTML.FlashAllowFullScreen";i:7;s:24:"HTML.ForbiddenAttributes";i:8;s:22:"HTML.ForbiddenElements";i:8;s:10:"HTML.Forms";i:7;s:17:"HTML.MaxImgLength";i:-5;s:13:"HTML.Nofollow";i:7;s:11:"HTML.Parent";i:1;s:16:"HTML.Proprietary";i:7;s:14:"HTML.SafeEmbed";i:7;s:15:"HTML.SafeIframe";i:7;s:15:"HTML.SafeObject";i:7;s:18:"HTML.SafeScripting";i:8;s:11:"HTML.Strict";i:7;s:16:"HTML.TargetBlank";i:7;s:19:"HTML.TargetNoopener";i:7;s:21:"HTML.TargetNoreferrer";i:7;s:12:"HTML.TidyAdd";i:8;s:14:"HTML.TidyLevel";O:8:"stdClass":2:{s:4:"type";i:1;s:7:"allowed";a:4:{s:4:"none";b:1;s:5:"light";b:1;s:6:"medium";b:1;s:5:"heavy";b:1;}}s:15:"HTML.TidyRemove";i:8;s:12:"HTML.Trusted";i:7;s:10:"HTML.XHTML";i:7;s:10:"Core.XHTML";O:8:"stdClass":2:{s:3:"key";s:10:"HTML.XHTML";s:7:"isAlias";b:1;}s:28:"Output.CommentScriptContents";i:7;s:26:"Core.CommentScriptContents";O:8:"stdClass":2:{s:3:"key";s:28:"Output.CommentScriptContents";s:7:"isAlias";b:1;}s:19:"Output.FixInnerHTML";i:7;s:18:"Output.FlashCompat";i:7;s:14:"Output.Newline";i:-1;s:15:"Output.SortAttr";i:7;s:17:"Output.TidyFormat";i:7;s:15:"Core.TidyFormat";O:8:"stdClass":2:{s:3:"key";s:17:"Output.TidyFormat";s:7:"isAlias";b:1;}s:17:"Test.ForceNoIconv";i:7;s:18:"URI.AllowedSchemes";i:8;s:8:"URI.Base";i:-1;s:17:"URI.DefaultScheme";i:-1;s:16:"URI.DefinitionID";i:-1;s:17:"URI.DefinitionRev";i:5;s:11:"URI.Disable";i:7;s:15:"Attr.DisableURI";O:8:"stdClass":2:{s:3:"key";s:11:"URI.Disable";s:7:"isAlias";b:1;}s:19:"URI.DisableExternal";i:7;s:28:"URI.DisableExternalResources";i:7;s:20:"URI.DisableResources";i:7;s:8:"URI.Host";i:-1;s:17:"URI.HostBlacklist";i:9;s:16:"URI.MakeAbsolute";i:7;s:9:"URI.Munge";i:-1;s:18:"URI.MungeResources";i:7;s:18:"URI.MungeSecretKey";i:-1;s:26:"URI.OverrideAllowedSchemes";i:7;s:20:"URI.SafeIframeRegexp";i:-1;}}htmlpurifier/library/HTMLPurifier/ConfigSchema/Validator.php000064400000020257151214231100020154 0ustar00<?php

/**
 * Performs validations on HTMLPurifier_ConfigSchema_Interchange
 *
 * @note If you see '// handled by InterchangeBuilder', that means a
 *       design decision in that class would prevent this validation from
 *       ever being necessary. We have them anyway, however, for
 *       redundancy.
 */
class HTMLPurifier_ConfigSchema_Validator
{

    /**
     * @type HTMLPurifier_ConfigSchema_Interchange
     */
    protected $interchange;

    /**
     * @type array
     */
    protected $aliases;

    /**
     * Context-stack to provide easy to read error messages.
     * @type array
     */
    protected $context = array();

    /**
     * to test default's type.
     * @type HTMLPurifier_VarParser
     */
    protected $parser;

    public function __construct()
    {
        $this->parser = new HTMLPurifier_VarParser();
    }

    /**
     * Validates a fully-formed interchange object.
     * @param HTMLPurifier_ConfigSchema_Interchange $interchange
     * @return bool
     */
    public function validate($interchange)
    {
        $this->interchange = $interchange;
        $this->aliases = array();
        // PHP is a bit lax with integer <=> string conversions in
        // arrays, so we don't use the identical !== comparison
        foreach ($interchange->directives as $i => $directive) {
            $id = $directive->id->toString();
            if ($i != $id) {
                $this->error(false, "Integrity violation: key '$i' does not match internal id '$id'");
            }
            $this->validateDirective($directive);
        }
        return true;
    }

    /**
     * Validates a HTMLPurifier_ConfigSchema_Interchange_Id object.
     * @param HTMLPurifier_ConfigSchema_Interchange_Id $id
     */
    public function validateId($id)
    {
        $id_string = $id->toString();
        $this->context[] = "id '$id_string'";
        if (!$id instanceof HTMLPurifier_ConfigSchema_Interchange_Id) {
            // handled by InterchangeBuilder
            $this->error(false, 'is not an instance of HTMLPurifier_ConfigSchema_Interchange_Id');
        }
        // keys are now unconstrained (we might want to narrow down to A-Za-z0-9.)
        // we probably should check that it has at least one namespace
        $this->with($id, 'key')
            ->assertNotEmpty()
            ->assertIsString(); // implicit assertIsString handled by InterchangeBuilder
        array_pop($this->context);
    }

    /**
     * Validates a HTMLPurifier_ConfigSchema_Interchange_Directive object.
     * @param HTMLPurifier_ConfigSchema_Interchange_Directive $d
     */
    public function validateDirective($d)
    {
        $id = $d->id->toString();
        $this->context[] = "directive '$id'";
        $this->validateId($d->id);

        $this->with($d, 'description')
            ->assertNotEmpty();

        // BEGIN - handled by InterchangeBuilder
        $this->with($d, 'type')
            ->assertNotEmpty();
        $this->with($d, 'typeAllowsNull')
            ->assertIsBool();
        try {
            // This also tests validity of $d->type
            $this->parser->parse($d->default, $d->type, $d->typeAllowsNull);
        } catch (HTMLPurifier_VarParserException $e) {
            $this->error('default', 'had error: ' . $e->getMessage());
        }
        // END - handled by InterchangeBuilder

        if (!is_null($d->allowed) || !empty($d->valueAliases)) {
            // allowed and valueAliases require that we be dealing with
            // strings, so check for that early.
            $d_int = HTMLPurifier_VarParser::$types[$d->type];
            if (!isset(HTMLPurifier_VarParser::$stringTypes[$d_int])) {
                $this->error('type', 'must be a string type when used with allowed or value aliases');
            }
        }

        $this->validateDirectiveAllowed($d);
        $this->validateDirectiveValueAliases($d);
        $this->validateDirectiveAliases($d);

        array_pop($this->context);
    }

    /**
     * Extra validation if $allowed member variable of
     * HTMLPurifier_ConfigSchema_Interchange_Directive is defined.
     * @param HTMLPurifier_ConfigSchema_Interchange_Directive $d
     */
    public function validateDirectiveAllowed($d)
    {
        if (is_null($d->allowed)) {
            return;
        }
        $this->with($d, 'allowed')
            ->assertNotEmpty()
            ->assertIsLookup(); // handled by InterchangeBuilder
        if (is_string($d->default) && !isset($d->allowed[$d->default])) {
            $this->error('default', 'must be an allowed value');
        }
        $this->context[] = 'allowed';
        foreach ($d->allowed as $val => $x) {
            if (!is_string($val)) {
                $this->error("value $val", 'must be a string');
            }
        }
        array_pop($this->context);
    }

    /**
     * Extra validation if $valueAliases member variable of
     * HTMLPurifier_ConfigSchema_Interchange_Directive is defined.
     * @param HTMLPurifier_ConfigSchema_Interchange_Directive $d
     */
    public function validateDirectiveValueAliases($d)
    {
        if (is_null($d->valueAliases)) {
            return;
        }
        $this->with($d, 'valueAliases')
            ->assertIsArray(); // handled by InterchangeBuilder
        $this->context[] = 'valueAliases';
        foreach ($d->valueAliases as $alias => $real) {
            if (!is_string($alias)) {
                $this->error("alias $alias", 'must be a string');
            }
            if (!is_string($real)) {
                $this->error("alias target $real from alias '$alias'", 'must be a string');
            }
            if ($alias === $real) {
                $this->error("alias '$alias'", "must not be an alias to itself");
            }
        }
        if (!is_null($d->allowed)) {
            foreach ($d->valueAliases as $alias => $real) {
                if (isset($d->allowed[$alias])) {
                    $this->error("alias '$alias'", 'must not be an allowed value');
                } elseif (!isset($d->allowed[$real])) {
                    $this->error("alias '$alias'", 'must be an alias to an allowed value');
                }
            }
        }
        array_pop($this->context);
    }

    /**
     * Extra validation if $aliases member variable of
     * HTMLPurifier_ConfigSchema_Interchange_Directive is defined.
     * @param HTMLPurifier_ConfigSchema_Interchange_Directive $d
     */
    public function validateDirectiveAliases($d)
    {
        $this->with($d, 'aliases')
            ->assertIsArray(); // handled by InterchangeBuilder
        $this->context[] = 'aliases';
        foreach ($d->aliases as $alias) {
            $this->validateId($alias);
            $s = $alias->toString();
            if (isset($this->interchange->directives[$s])) {
                $this->error("alias '$s'", 'collides with another directive');
            }
            if (isset($this->aliases[$s])) {
                $other_directive = $this->aliases[$s];
                $this->error("alias '$s'", "collides with alias for directive '$other_directive'");
            }
            $this->aliases[$s] = $d->id->toString();
        }
        array_pop($this->context);
    }

    // protected helper functions

    /**
     * Convenience function for generating HTMLPurifier_ConfigSchema_ValidatorAtom
     * for validating simple member variables of objects.
     * @param $obj
     * @param $member
     * @return HTMLPurifier_ConfigSchema_ValidatorAtom
     */
    protected function with($obj, $member)
    {
        return new HTMLPurifier_ConfigSchema_ValidatorAtom($this->getFormattedContext(), $obj, $member);
    }

    /**
     * Emits an error, providing helpful context.
     * @throws HTMLPurifier_ConfigSchema_Exception
     */
    protected function error($target, $msg)
    {
        if ($target !== false) {
            $prefix = ucfirst($target) . ' in ' . $this->getFormattedContext();
        } else {
            $prefix = ucfirst($this->getFormattedContext());
        }
        throw new HTMLPurifier_ConfigSchema_Exception(trim($prefix . ' ' . $msg));
    }

    /**
     * Returns a formatted context string.
     * @return string
     */
    protected function getFormattedContext()
    {
        return implode(' in ', array_reverse($this->context));
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt000064400000000516151214231100023603 0ustar00Core.RemoveInvalidImg
TYPE: bool
DEFAULT: true
VERSION: 1.3.0
--DESCRIPTION--

<p>
  This directive enables pre-emptive URI checking in <code>img</code>
  tags, as the attribute validation strategy is not authorized to
  remove elements from the document. Revert to pre-1.3.0 behavior by setting to false.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt000064400000000430151214231100024535 0ustar00Core.RemoveScriptContents
TYPE: bool/null
DEFAULT: NULL
VERSION: 2.0.0
DEPRECATED-VERSION: 2.1.0
DEPRECATED-USE: Core.HiddenElements
--DESCRIPTION--
<p>
  This directive enables HTML Purifier to remove not only script tags
  but all of their contents.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt000064400000000377151214231100022475 0ustar00Attr.AllowedRev
TYPE: lookup
VERSION: 1.6.0
DEFAULT: array()
--DESCRIPTION--
List of allowed reverse document relationships in the rev attribute. This
attribute is a bit of an edge-case; if you don't know what it is for, stay
away.
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.FlashCompat.txt000064400000000415151214231100023211 0ustar00Output.FlashCompat
TYPE: bool
VERSION: 4.1.0
DEFAULT: false
--DESCRIPTION--
<p>
  If true, HTML Purifier will generate Internet Explorer compatibility
  code for all object code.  This is highly recommended if you enable
  %HTML.SafeObject.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt000064400000000506151214231100024547 0ustar00URI.OverrideAllowedSchemes
TYPE: bool
DEFAULT: true
--DESCRIPTION--
If this is set to true (which it is by default), you can override
%URI.AllowedSchemes by simply registering a HTMLPurifier_URIScheme to the
registry.  If false, you will also have to update that directive in order
to add more schemes.
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt000064400000000244151214231100022460 0ustar00CSS.Proprietary
TYPE: bool
VERSION: 3.0.0
DEFAULT: false
--DESCRIPTION--

<p>
    Whether or not to allow safe, proprietary CSS values.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt000064400000000362151214231100022455 0ustar00URI.DefinitionID
TYPE: string/null
VERSION: 2.1.0
DEFAULT: NULL
--DESCRIPTION--

<p>
    Unique identifier for a custom-built URI definition. If you  want
    to add custom URIFilters, you must specify this value.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt000064400000003356151214231100024054 0ustar00AutoFormat.RemoveEmpty
TYPE: bool
VERSION: 3.2.0
DEFAULT: false
--DESCRIPTION--
<p>
  When enabled, HTML Purifier will attempt to remove empty elements that
  contribute no semantic information to the document. The following types
  of nodes will be removed:
</p>
<ul><li>
    Tags with no attributes and no content, and that are not empty
    elements (remove <code>&lt;a&gt;&lt;/a&gt;</code> but not
    <code>&lt;br /&gt;</code>), and
  </li>
  <li>
    Tags with no content, except for:<ul>
      <li>The <code>colgroup</code> element, or</li>
      <li>
        Elements with the <code>id</code> or <code>name</code> attribute,
        when those attributes are permitted on those elements.
      </li>
    </ul></li>
</ul>
<p>
  Please be very careful when using this functionality; while it may not
  seem that empty elements contain useful information, they can alter the
  layout of a document given appropriate styling. This directive is most
  useful when you are processing machine-generated HTML, please avoid using
  it on regular user HTML.
</p>
<p>
  Elements that contain only whitespace will be treated as empty. Non-breaking
  spaces, however, do not count as whitespace. See
  %AutoFormat.RemoveEmpty.RemoveNbsp for alternate behavior.
</p>
<p>
  This algorithm is not perfect; you may still notice some empty tags,
  particularly if a node had elements, but those elements were later removed
  because they were not permitted in that context, or tags that, after
  being auto-closed by another tag, where empty. This is for safety reasons
  to prevent clever code from breaking validation. The general rule of thumb:
  if a tag looked empty on the way in, it will get removed; if HTML Purifier
  made it empty, it will stay.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt000064400000000455151214231100024725 0ustar00Attr.DefaultInvalidImageAlt
TYPE: string
DEFAULT: 'Invalid image'
--DESCRIPTION--
This is the content of the alt tag of an invalid image if the user had not
previously specified an alt attribute.  It has no effect when the image is
valid but there was no alt attribute present.
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt000064400000001205151214231100022023 0ustar00Attr.EnableID
TYPE: bool
DEFAULT: false
VERSION: 1.2.0
--DESCRIPTION--
Allows the ID attribute in HTML.  This is disabled by default due to the
fact that without proper configuration user input can easily break the
validation of a webpage by specifying an ID that is already on the
surrounding HTML.  If you don't mind throwing caution to the wind, enable
this directive, but I strongly recommend you also consider blacklisting IDs
you use (%Attr.IDBlacklist) or prefixing all user supplied IDs
(%Attr.IDPrefix).  When set to true HTML Purifier reverts to the behavior of
pre-1.2.0 versions.
--ALIASES--
HTML.EnableAttrID
--# vim: et sw=4 sts=4
library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt000064400000000554151214231100030171 0ustar00htmlpurifierAutoFormat.RemoveEmpty.RemoveNbsp.Exceptions
TYPE: lookup
VERSION: 4.0.0
DEFAULT: array('td' => true, 'th' => true)
--DESCRIPTION--
<p>
  When %AutoFormat.RemoveEmpty and %AutoFormat.RemoveEmpty.RemoveNbsp
  are enabled, this directive defines what HTML elements should not be
  removede if they have only a non-breaking space in them.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt000064400000000727151214231100023343 0ustar00HTML.Attr.Name.UseCDATA
TYPE: bool
DEFAULT: false
VERSION: 4.0.0
--DESCRIPTION--
The W3C specification DTD defines the name attribute to be CDATA, not ID, due
to limitations of DTD.  In certain documents, this relaxed behavior is desired,
whether it is to specify duplicate names, or to specify names that would be
illegal IDs (for example, names that begin with a digit.) Set this configuration
directive to true to use the relaxed parsing rules.
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt000064400000000752151214231100022604 0ustar00HTML.MaxImgLength
TYPE: int/null
DEFAULT: 1200
VERSION: 3.1.1
--DESCRIPTION--
<p>
 This directive controls the maximum number of pixels in the width and
 height attributes in <code>img</code> tags. This is
 in place to prevent imagecrash attacks, disable with null at your own risk.
 This directive is similar to %CSS.MaxImgLength, and both should be
 concurrently edited, although there are
 subtle differences in the input format (the HTML max is an integer).
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt000064400000001025151214231100023017 0ustar00HTML.DefinitionRev
TYPE: int
VERSION: 2.0.0
DEFAULT: 1
--DESCRIPTION--

<p>
    Revision identifier for your custom definition specified in
    %HTML.DefinitionID.  This serves the same purpose: uniquely identifying
    your custom definition, but this one does so in a chronological
    context: revision 3 is more up-to-date then revision 2.  Thus, when
    this gets incremented, the cache handling is smart enough to clean
    up any older revisions of your definition as well as flush the
    cache.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedFonts.txt000064400000000537151214231100022546 0ustar00CSS.AllowedFonts
TYPE: lookup/null
VERSION: 4.3.0
DEFAULT: NULL
--DESCRIPTION--
<p>
    Allows you to manually specify a set of allowed fonts.  If
    <code>NULL</code>, all fonts are allowed.  This directive
    affects generic names (serif, sans-serif, monospace, cursive,
    fantasy) as well as specific font families.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt000064400000001140151214231100023600 0ustar00CSS.AllowedProperties
TYPE: lookup/null
VERSION: 3.1.0
DEFAULT: NULL
--DESCRIPTION--

<p>
    If HTML Purifier's style attributes set is unsatisfactory for your needs,
    you can overload it with your own list of tags to allow.  Note that this
    method is subtractive: it does its job by taking away from HTML Purifier
    usual feature set, so you cannot add an attribute that HTML Purifier never
    supported in the first place.
</p>
<p>
    <strong>Warning:</strong> If another directive conflicts with the
    elements here, <em>that</em> directive will win and override.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt000064400000000353151214231100021151 0ustar00HTML.XHTML
TYPE: bool
DEFAULT: true
VERSION: 1.1.0
DEPRECATED-VERSION: 1.7.0
DEPRECATED-USE: HTML.Doctype
--DESCRIPTION--
Determines whether or not output is XHTML 1.0 or HTML 4.01 flavor.
--ALIASES--
Core.XHTML
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt000064400000000420151214231100021506 0ustar00URI.Disable
TYPE: bool
VERSION: 1.3.0
DEFAULT: false
--DESCRIPTION--

<p>
    Disables all URIs in all forms. Not sure why you'd want to do that
    (after all, the Internet's founded on the notion of a hyperlink).
</p>

--ALIASES--
Attr.DisableURI
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt000064400000000673151214231100023223 0ustar00URI.DisableExternal
TYPE: bool
VERSION: 1.2.0
DEFAULT: false
--DESCRIPTION--
Disables links to external websites.  This is a highly effective anti-spam
and anti-pagerank-leech measure, but comes at a hefty price: nolinks or
images outside of your domain will be allowed.  Non-linkified URIs will
still be preserved.  If you want to be able to link to subdomains or use
absolute URIs, specify %URI.Host for your website.
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.LegacyEntityDecoder.txt000064400000002557151214231100024300 0ustar00Core.LegacyEntityDecoder
TYPE: bool
VERSION: 4.9.0
DEFAULT: false
--DESCRIPTION--
<p>
    Prior to HTML Purifier 4.9.0, entities were decoded by performing
    a global search replace for all entities whose decoded versions
    did not have special meanings under HTML, and replaced them with
    their decoded versions.  We would match all entities, even if they did
    not have a trailing semicolon, but only if there weren't any trailing
    alphanumeric characters.
</p>
<table>
<tr><th>Original</th><th>Text</th><th>Attribute</th></tr>
<tr><td>&amp;yen;</td><td>&yen;</td><td>&yen;</td></tr>
<tr><td>&amp;yen</td><td>&yen;</td><td>&yen;</td></tr>
<tr><td>&amp;yena</td><td>&amp;yena</td><td>&amp;yena</td></tr>
<tr><td>&amp;yen=</td><td>&yen;=</td><td>&yen;=</td></tr>
</table>
<p>
    In HTML Purifier 4.9.0, we changed the behavior of entity parsing
    to match entities that had missing trailing semicolons in less
    cases, to more closely match HTML5 parsing behavior:
</p>
<table>
<tr><th>Original</th><th>Text</th><th>Attribute</th></tr>
<tr><td>&amp;yen;</td><td>&yen;</td><td>&yen;</td></tr>
<tr><td>&amp;yen</td><td>&yen;</td><td>&yen;</td></tr>
<tr><td>&amp;yena</td><td>&yen;a</td><td>&amp;yena</td></tr>
<tr><td>&amp;yen=</td><td>&yen;=</td><td>&amp;yen=</td></tr>
</table>
<p>
    This flag reverts back to pre-HTML Purifier 4.9.0 behavior.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EnableIDNA.txt000064400000000457151214231100022230 0ustar00Core.EnableIDNA
TYPE: bool
DEFAULT: false
VERSION: 4.4.0
--DESCRIPTION--
Allows international domain names in URLs.  This configuration option
requires the PEAR Net_IDNA2 module to be installed.  It operates by
punycoding any internationalized host names for maximum portability.
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt000064400000001102151214231100024310 0ustar00Attr.AllowedFrameTargets
TYPE: lookup
DEFAULT: array()
--DESCRIPTION--
Lookup table of all allowed link frame targets.  Some commonly used link
targets include _blank, _self, _parent and _top. Values should be
lowercase, as validation will be done in a case-sensitive manner despite
W3C's recommendation. XHTML 1.0 Strict does not permit the target attribute
so this directive will have no effect in that doctype. XHTML 1.1 does not
enable the Target module by default, you will have to manually enable it
(see the module documentation for more details.)
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt000064400000001045151214231100025110 0ustar00URI.DisableExternalResources
TYPE: bool
VERSION: 1.3.0
DEFAULT: false
--DESCRIPTION--
Disables the embedding of external resources, preventing users from
embedding things like images from other hosts. This prevents access
tracking (good for email viewers), bandwidth leeching, cross-site request
forging, goatse.cx posting, and other nasties, but also results in a loss
of end-user functionality (they can't directly post a pic they posted from
Flickr anymore). Use it if you don't have a robust user-content moderation
team.
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt000064400000000757151214231100022342 0ustar00Filter.YouTube
TYPE: bool
VERSION: 3.1.0
DEFAULT: false
--DESCRIPTION--
<p>
  <strong>Warning:</strong> Deprecated in favor of %HTML.SafeObject and
  %Output.FlashCompat (turn both on to allow YouTube videos and other
  Flash content).
</p>
<p>
  This directive enables YouTube video embedding in HTML Purifier. Check
  <a href="http://htmlpurifier.org/docs/enduser-youtube.html">this document
  on embedding videos</a> for more information on what this filter does.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.FixInnerHTML.txt000064400000001037151214231100023220 0ustar00Output.FixInnerHTML
TYPE: bool
VERSION: 4.3.0
DEFAULT: true
--DESCRIPTION--
<p>
  If true, HTML Purifier will protect against Internet Explorer's
  mishandling of the <code>innerHTML</code> attribute by appending
  a space to any attribute that does not contain angled brackets, spaces
  or quotes, but contains a backtick.  This slightly changes the
  semantics of any given attribute, so if this is unacceptable and
  you do not use <code>innerHTML</code> on any of your pages, you can
  turn this directive off.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt000064400000000737151214231100023421 0ustar00Attr.DefaultImageAlt
TYPE: string/null
DEFAULT: null
VERSION: 3.2.0
--DESCRIPTION--
This is the content of the alt tag of an image if the user had not
previously specified an alt attribute.  This applies to all images without
a valid alt attribute, as opposed to %Attr.DefaultInvalidImageAlt, which
only applies to invalid images, and overrides in the case of an invalid image.
Default behavior with null is to use the basename of the src tag for the alt.
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.NormalizeNewlines.txt000064400000000427151214231100024050 0ustar00Core.NormalizeNewlines
TYPE: bool
VERSION: 4.2.0
DEFAULT: true
--DESCRIPTION--
<p>
    Whether or not to normalize newlines to the operating
    system default.  When <code>false</code>, HTML Purifier
    will attempt to preserve mixed newline files.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt000064400000000624151214231100022662 0ustar00URI.DefaultScheme
TYPE: string/null
DEFAULT: 'http'
--DESCRIPTION--

<p>
    Defines through what scheme the output will be served, in order to
    select the proper object validator when no scheme information is present.
</p>

<p>
    Starting with HTML Purifier 4.9.0, the default scheme can be null, in
    which case we reject all URIs which do not have explicit schemes.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt000064400000001100151214231100026250 0ustar00Filter.ExtractStyleBlocks.TidyImpl
TYPE: mixed/null
VERSION: 3.1.0
DEFAULT: NULL
ALIASES: FilterParam.ExtractStyleBlocksTidyImpl
--DESCRIPTION--
<p>
  If left NULL, HTML Purifier will attempt to instantiate a <code>csstidy</code>
  class to use for internal cleaning. This will usually be good enough.
</p>
<p>
  However, for trusted user input, you can set this to <code>false</code> to
  disable cleaning. In addition, you can supply your own concrete implementation
  of Tidy's interface to use, although I don't know why you'd want to do that.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowDuplicates.txt000064400000000423151214231100023233 0ustar00CSS.AllowDuplicates
TYPE: bool
DEFAULT: false
VERSION: 4.8.0
--DESCRIPTION--
<p>
  By default, HTML Purifier removes duplicate CSS properties,
  like <code>color:red; color:blue</code>.  If this is set to
  true, duplicate properties are allowed.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetNoopener.txt000064400000000461151214231100023211 0ustar00--# vim: et sw=4 sts=4
HTML.TargetNoopener
TYPE: bool
VERSION: 4.8.0
DEFAULT: TRUE
--DESCRIPTION--
If enabled, noopener rel attributes are added to links which have
a target attribute associated with them.  This prevents malicious
destinations from overwriting the original window.
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt000064400000000351151214231100023055 0ustar00HTML.CustomDoctype
TYPE: string/null
VERSION: 2.0.1
DEFAULT: NULL
--DESCRIPTION--

A custom doctype for power-users who defined their own document
type. This directive only applies when %HTML.Doctype is blank.
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedComments.txt000064400000000557151214231100023360 0ustar00HTML.AllowedComments
TYPE: lookup
VERSION: 4.4.0
DEFAULT: array()
--DESCRIPTION--
A whitelist which indicates what explicit comment bodies should be
allowed, modulo leading and trailing whitespace.  See also %HTML.AllowedCommentsRegexp
(these directives are union'ed together, so a comment is considered
valid if any directive deems it valid.)
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt000064400000000731151214231100021664 0ustar00HTML.Doctype
TYPE: string/null
DEFAULT: NULL
--DESCRIPTION--
Doctype to use during filtering. Technically speaking this is not actually
a doctype (as it does not identify a corresponding DTD), but we are using
this name for sake of simplicity. When non-blank, this will override any
older directives like %HTML.XHTML or %HTML.Strict.
--ALLOWED--
'HTML 4.01 Transitional', 'HTML 4.01 Strict', 'XHTML 1.0 Transitional', 'XHTML 1.0 Strict', 'XHTML 1.1'
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt000064400000000440151214231100022452 0ustar00Attr.AllowedRel
TYPE: lookup
VERSION: 1.6.0
DEFAULT: array()
--DESCRIPTION--
List of allowed forward document relationships in the rel attribute. Common
values may be nofollow or print. By default, this is empty, meaning that no
document relationships are allowed.
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt000064400000001170151214231100026605 0ustar00Core.DirectLexLineNumberSyncInterval
TYPE: int
VERSION: 2.0.0
DEFAULT: 0
--DESCRIPTION--

<p>
  Specifies the number of tokens the DirectLex line number tracking
  implementations should process before attempting to resyncronize the
  current line count by manually counting all previous new-lines. When
  at 0, this functionality is disabled. Lower values will decrease
  performance, and this is only strictly necessary if the counting
  algorithm is buggy (in which case you should report it as a bug).
  This has no effect when %Core.MaintainLineNumbers is disabled or DirectLex is
  not being used.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt000064400000000463151214231100022212 0ustar00Filter.Custom
TYPE: list
VERSION: 3.1.0
DEFAULT: array()
--DESCRIPTION--
<p>
  This directive can be used to add custom filters; it is nearly the
  equivalent of the now deprecated <code>HTMLPurifier-&gt;addFilter()</code>
  method. Specify an array of concrete implementations.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.Trusted.txt000064400000000373151214231100021575 0ustar00CSS.Trusted
TYPE: bool
VERSION: 4.2.1
DEFAULT: false
--DESCRIPTION--
Indicates whether or not the user's CSS input is trusted or not. If the
input is trusted, a more expansive set of allowed properties.  See
also %HTML.Trusted.
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt000064400000001067151214231100025030 0ustar00Core.EscapeNonASCIICharacters
TYPE: bool
VERSION: 1.4.0
DEFAULT: false
--DESCRIPTION--
This directive overcomes a deficiency in %Core.Encoding by blindly
converting all non-ASCII characters into decimal numeric entities before
converting it to its native encoding. This means that even characters that
can be expressed in the non-UTF-8 encoding will be entity-ized, which can
be a real downer for encodings like Big5. It also assumes that the ASCII
repetoire is available, although this is the case for almost all encodings.
Anyway, use UTF-8!
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt000064400000000354151214231100023116 0ustar00CSS.AllowImportant
TYPE: bool
DEFAULT: false
VERSION: 3.1.0
--DESCRIPTION--
This parameter determines whether or not !important cascade modifiers should
be allowed in user CSS. If false, !important will stripped.
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.Predicate.txt000064400000001170151214231100025743 0ustar00AutoFormat.RemoveEmpty.Predicate
TYPE: hash
VERSION: 4.7.0
DEFAULT: array('colgroup' => array(), 'th' => array(), 'td' => array(), 'iframe' => array('src'))
--DESCRIPTION--
<p>
  Given that an element has no contents, it will be removed by default, unless
  this predicate dictates otherwise.  The predicate can either be an associative
  map from tag name to list of attributes that must be present for the element
  to be considered preserved: thus, the default always preserves <code>colgroup</code>,
  <code>th</code> and <code>td</code>, and also <code>iframe</code> if it
  has a <code>src</code>.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt000064400000000173151214231100022550 0ustar00Attr.IDBlacklist
TYPE: list
DEFAULT: array()
DESCRIPTION: Array of IDs not allowed in the document.
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.DisableExcludes.txt000064400000000712151214231100023440 0ustar00Core.DisableExcludes
TYPE: bool
DEFAULT: false
VERSION: 4.5.0
--DESCRIPTION--
<p>
  This directive disables SGML-style exclusions, e.g. the exclusion of
  <code>&lt;object&gt;</code> in any descendant of a
  <code>&lt;pre&gt;</code> tag.  Disabling excludes will allow some
  invalid documents to pass through HTML Purifier, but HTML Purifier
  will also be less likely to accidentally remove large documents during
  processing.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt000064400000000653151214231100023411 0ustar00URI.DisableResources
TYPE: bool
VERSION: 4.2.0
DEFAULT: false
--DESCRIPTION--
<p>
    Disables embedding resources, essentially meaning no pictures. You can
    still link to them though. See %URI.DisableExternalResources for why
    this might be a good idea.
</p>
<p>
    <em>Note:</em> While this directive has been available since 1.3.0,
    it didn't actually start doing anything until 4.2.0.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt000064400000010512151214231100023205 0ustar00Core.ColorKeywords
TYPE: hash
VERSION: 2.0.0
--DEFAULT--
array (
  'aliceblue' => '#F0F8FF',
  'antiquewhite' => '#FAEBD7',
  'aqua' => '#00FFFF',
  'aquamarine' => '#7FFFD4',
  'azure' => '#F0FFFF',
  'beige' => '#F5F5DC',
  'bisque' => '#FFE4C4',
  'black' => '#000000',
  'blanchedalmond' => '#FFEBCD',
  'blue' => '#0000FF',
  'blueviolet' => '#8A2BE2',
  'brown' => '#A52A2A',
  'burlywood' => '#DEB887',
  'cadetblue' => '#5F9EA0',
  'chartreuse' => '#7FFF00',
  'chocolate' => '#D2691E',
  'coral' => '#FF7F50',
  'cornflowerblue' => '#6495ED',
  'cornsilk' => '#FFF8DC',
  'crimson' => '#DC143C',
  'cyan' => '#00FFFF',
  'darkblue' => '#00008B',
  'darkcyan' => '#008B8B',
  'darkgoldenrod' => '#B8860B',
  'darkgray' => '#A9A9A9',
  'darkgrey' => '#A9A9A9',
  'darkgreen' => '#006400',
  'darkkhaki' => '#BDB76B',
  'darkmagenta' => '#8B008B',
  'darkolivegreen' => '#556B2F',
  'darkorange' => '#FF8C00',
  'darkorchid' => '#9932CC',
  'darkred' => '#8B0000',
  'darksalmon' => '#E9967A',
  'darkseagreen' => '#8FBC8F',
  'darkslateblue' => '#483D8B',
  'darkslategray' => '#2F4F4F',
  'darkslategrey' => '#2F4F4F',
  'darkturquoise' => '#00CED1',
  'darkviolet' => '#9400D3',
  'deeppink' => '#FF1493',
  'deepskyblue' => '#00BFFF',
  'dimgray' => '#696969',
  'dimgrey' => '#696969',
  'dodgerblue' => '#1E90FF',
  'firebrick' => '#B22222',
  'floralwhite' => '#FFFAF0',
  'forestgreen' => '#228B22',
  'fuchsia' => '#FF00FF',
  'gainsboro' => '#DCDCDC',
  'ghostwhite' => '#F8F8FF',
  'gold' => '#FFD700',
  'goldenrod' => '#DAA520',
  'gray' => '#808080',
  'grey' => '#808080',
  'green' => '#008000',
  'greenyellow' => '#ADFF2F',
  'honeydew' => '#F0FFF0',
  'hotpink' => '#FF69B4',
  'indianred' => '#CD5C5C',
  'indigo' => '#4B0082',
  'ivory' => '#FFFFF0',
  'khaki' => '#F0E68C',
  'lavender' => '#E6E6FA',
  'lavenderblush' => '#FFF0F5',
  'lawngreen' => '#7CFC00',
  'lemonchiffon' => '#FFFACD',
  'lightblue' => '#ADD8E6',
  'lightcoral' => '#F08080',
  'lightcyan' => '#E0FFFF',
  'lightgoldenrodyellow' => '#FAFAD2',
  'lightgray' => '#D3D3D3',
  'lightgrey' => '#D3D3D3',
  'lightgreen' => '#90EE90',
  'lightpink' => '#FFB6C1',
  'lightsalmon' => '#FFA07A',
  'lightseagreen' => '#20B2AA',
  'lightskyblue' => '#87CEFA',
  'lightslategray' => '#778899',
  'lightslategrey' => '#778899',
  'lightsteelblue' => '#B0C4DE',
  'lightyellow' => '#FFFFE0',
  'lime' => '#00FF00',
  'limegreen' => '#32CD32',
  'linen' => '#FAF0E6',
  'magenta' => '#FF00FF',
  'maroon' => '#800000',
  'mediumaquamarine' => '#66CDAA',
  'mediumblue' => '#0000CD',
  'mediumorchid' => '#BA55D3',
  'mediumpurple' => '#9370DB',
  'mediumseagreen' => '#3CB371',
  'mediumslateblue' => '#7B68EE',
  'mediumspringgreen' => '#00FA9A',
  'mediumturquoise' => '#48D1CC',
  'mediumvioletred' => '#C71585',
  'midnightblue' => '#191970',
  'mintcream' => '#F5FFFA',
  'mistyrose' => '#FFE4E1',
  'moccasin' => '#FFE4B5',
  'navajowhite' => '#FFDEAD',
  'navy' => '#000080',
  'oldlace' => '#FDF5E6',
  'olive' => '#808000',
  'olivedrab' => '#6B8E23',
  'orange' => '#FFA500',
  'orangered' => '#FF4500',
  'orchid' => '#DA70D6',
  'palegoldenrod' => '#EEE8AA',
  'palegreen' => '#98FB98',
  'paleturquoise' => '#AFEEEE',
  'palevioletred' => '#DB7093',
  'papayawhip' => '#FFEFD5',
  'peachpuff' => '#FFDAB9',
  'peru' => '#CD853F',
  'pink' => '#FFC0CB',
  'plum' => '#DDA0DD',
  'powderblue' => '#B0E0E6',
  'purple' => '#800080',
  'rebeccapurple' => '#663399',
  'red' => '#FF0000',
  'rosybrown' => '#BC8F8F',
  'royalblue' => '#4169E1',
  'saddlebrown' => '#8B4513',
  'salmon' => '#FA8072',
  'sandybrown' => '#F4A460',
  'seagreen' => '#2E8B57',
  'seashell' => '#FFF5EE',
  'sienna' => '#A0522D',
  'silver' => '#C0C0C0',
  'skyblue' => '#87CEEB',
  'slateblue' => '#6A5ACD',
  'slategray' => '#708090',
  'slategrey' => '#708090',
  'snow' => '#FFFAFA',
  'springgreen' => '#00FF7F',
  'steelblue' => '#4682B4',
  'tan' => '#D2B48C',
  'teal' => '#008080',
  'thistle' => '#D8BFD8',
  'tomato' => '#FF6347',
  'turquoise' => '#40E0D0',
  'violet' => '#EE82EE',
  'wheat' => '#F5DEB3',
  'white' => '#FFFFFF',
  'whitesmoke' => '#F5F5F5',
  'yellow' => '#FFFF00',
  'yellowgreen' => '#9ACD32'
)
--DESCRIPTION--

Lookup array of color names to six digit hexadecimal number corresponding
to color, with preceding hash mark. Used when parsing colors.  The lookup
is done in a case-insensitive manner.
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt000064400000000466151214231100022723 0ustar00URI.HostBlacklist
TYPE: list
VERSION: 1.3.0
DEFAULT: array()
--DESCRIPTION--
List of strings that are forbidden in the host of any URI. Use it to kill
domain names of spam, etc. Note that it will catch anything in the domain,
so <tt>moo.com</tt> will catch <tt>moo.com.example.com</tt>.
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.FlashAllowFullScreen.txt000064400000000437151214231100024277 0ustar00HTML.FlashAllowFullScreen
TYPE: bool
VERSION: 4.2.0
DEFAULT: false
--DESCRIPTION--
<p>
    Whether or not to permit embedded Flash content from
    %HTML.SafeObject to expand to the full screen.  Corresponds to
    the <code>allowFullScreen</code> parameter.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt000064400000000661151214231100023165 0ustar00Core.CollectErrors
TYPE: bool
VERSION: 2.0.0
DEFAULT: false
--DESCRIPTION--

Whether or not to collect errors found while filtering the document. This
is a useful way to give feedback to your users. <strong>Warning:</strong>
Currently this feature is very patchy and experimental, with lots of
possible error messages not yet implemented. It will not cause any
problems, but it may not help your users either.
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt000064400000001077151214231100023275 0ustar00Core.HiddenElements
TYPE: lookup
--DEFAULT--
array (
  'script' => true,
  'style' => true,
)
--DESCRIPTION--

<p>
  This directive is a lookup array of elements which should have their
  contents removed when they are not allowed by the HTML definition.
  For example, the contents of a <code>script</code> tag are not
  normally shown in a document, so if script tags are to be removed,
  their contents should be removed to. This is opposed to a <code>b</code>
  tag, which defines some presentational changes but does not hide its
  contents.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt000064400000000516151214231100022576 0ustar00HTML.Proprietary
TYPE: bool
VERSION: 3.1.0
DEFAULT: false
--DESCRIPTION--
<p>
    Whether or not to allow proprietary elements and attributes in your
    documents, as per <code>HTMLPurifier_HTMLModule_Proprietary</code>.
    <strong>Warning:</strong> This can cause your documents to stop
    validating!
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt000064400000001524151214231100024221 0ustar00HTML.ForbiddenAttributes
TYPE: lookup
VERSION: 3.1.0
DEFAULT: array()
--DESCRIPTION--
<p>
    While this directive is similar to %HTML.AllowedAttributes, for
    forwards-compatibility with XML, this attribute has a different syntax. Instead of
    <code>tag.attr</code>, use <code>tag@attr</code>. To disallow <code>href</code>
    attributes in <code>a</code> tags, set this directive to
    <code>a@href</code>. You can also disallow an attribute globally with
    <code>attr</code> or <code>*@attr</code> (either syntax is fine; the latter
    is provided for consistency with %HTML.AllowedAttributes).
</p>
<p>
    <strong>Warning:</strong> This directive complements %HTML.ForbiddenElements,
    accordingly, check
    out that directive for a discussion of why you
    should think twice before using this directive.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt000064400000000423151214231100025314 0ustar00Output.CommentScriptContents
TYPE: bool
VERSION: 2.0.0
DEFAULT: true
--DESCRIPTION--
Determines whether or not HTML Purifier should attempt to fix up the
contents of script tags for legacy browsers with comments.
--ALIASES--
Core.CommentScriptContents
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt000064400000001224151214231100023046 0ustar00Attr.IDPrefixLocal
TYPE: string
VERSION: 1.2.0
DEFAULT: ''
--DESCRIPTION--
Temporary prefix for IDs used in conjunction with %Attr.IDPrefix.  If you
need to allow multiple sets of user content on web page, you may need to
have a seperate prefix that changes with each iteration.  This way,
seperately submitted user content displayed on the same page doesn't
clobber each other. Ideal values are unique identifiers for the content it
represents (i.e. the id of the row in the database). Be sure to add a
seperator (like an underscore) at the end.  Warning: this directive will
not work unless %Attr.IDPrefix is set to a non-empty value!
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt000064400000001143151214231100023114 0ustar00URI.MungeResources
TYPE: bool
VERSION: 3.1.1
DEFAULT: false
--DESCRIPTION--
<p>
    If true, any URI munging directives like %URI.Munge
    will also apply to embedded resources, such as <code>&lt;img src=""&gt;</code>.
    Be careful enabling this directive if you have a redirector script
    that does not use the <code>Location</code> HTTP header; all of your images
    and other embedded resources will break.
</p>
<p>
    <strong>Warning:</strong> It is strongly advised you use this in conjunction
    %URI.MungeSecretKey to mitigate the security risk of an open redirector.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt000064400000001073151214231100022650 0ustar00HTML.BlockWrapper
TYPE: string
VERSION: 1.3.0
DEFAULT: 'p'
--DESCRIPTION--

<p>
    String name of element to wrap inline elements that are inside a block
    context.  This only occurs in the children of blockquote in strict mode.
</p>
<p>
    Example: by default value,
    <code>&lt;blockquote&gt;Foo&lt;/blockquote&gt;</code> would become
    <code>&lt;blockquote&gt;&lt;p&gt;Foo&lt;/p&gt;&lt;/blockquote&gt;</code>.
    The <code>&lt;p&gt;</code> tags can be replaced with whatever you desire,
    as long as it is a block level element.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt000064400000000412151214231100021703 0ustar00HTML.Trusted
TYPE: bool
VERSION: 2.0.0
DEFAULT: false
--DESCRIPTION--
Indicates whether or not the user input is trusted or not. If the input is
trusted, a more expansive set of allowed tags and attributes will be used.
See also %CSS.Trusted.
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeIframe.txt000064400000000616151214231100022261 0ustar00HTML.SafeIframe
TYPE: bool
VERSION: 4.4.0
DEFAULT: false
--DESCRIPTION--
<p>
    Whether or not to permit iframe tags in untrusted documents.  This
    directive must be accompanied by a whitelist of permitted iframes,
    such as %URI.SafeIframeRegexp, otherwise it will fatally error.
    This directive has no effect on strict doctypes, as iframes are not
    valid.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Nofollow.txt000064400000000243151214231100022052 0ustar00HTML.Nofollow
TYPE: bool
VERSION: 4.3.0
DEFAULT: FALSE
--DESCRIPTION--
If enabled, nofollow rel attributes are added to all outgoing links.
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt000064400000000733151214231100022077 0ustar00Attr.IDPrefix
TYPE: string
VERSION: 1.2.0
DEFAULT: ''
--DESCRIPTION--
String to prefix to IDs.  If you have no idea what IDs your pages may use,
you may opt to simply add a prefix to all user-submitted ID attributes so
that they are still usable, but will not conflict with core page IDs.
Example: setting the directive to 'user_' will result in a user submitted
'foo' to become 'user_foo'  Be sure to set %HTML.EnableAttrID to true
before using this.
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedCommentsRegexp.txt000064400000001307151214231100024525 0ustar00HTML.AllowedCommentsRegexp
TYPE: string/null
VERSION: 4.4.0
DEFAULT: NULL
--DESCRIPTION--
A regexp, which if it matches the body of a comment, indicates that
it should be allowed. Trailing and leading spaces are removed prior
to running this regular expression.
<strong>Warning:</strong> Make sure you specify
correct anchor metacharacters <code>^regex$</code>, otherwise you may accept
comments that you did not mean to! In particular, the regex <code>/foo|bar/</code>
is probably not sufficiently strict, since it also allows <code>foobar</code>.
See also %HTML.AllowedComments (these directives are union'ed together,
so a comment is considered valid if any directive deems it valid.)
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt000064400000001326151214231100023176 0ustar00HTML.AllowedModules
TYPE: lookup/null
VERSION: 2.0.0
DEFAULT: NULL
--DESCRIPTION--

<p>
    A doctype comes with a set of usual modules to use. Without having
    to mucking about with the doctypes, you can quickly activate or
    disable these modules by specifying which modules you wish to allow
    with this directive. This is most useful for unit testing specific
    modules, although end users may find it useful for their own ends.
</p>
<p>
    If you specify a module that does not exist, the manager will silently
    fail to use it, so be careful! User-defined modules are not affected
    by this directive. Modules defined in %HTML.CoreModules are not
    affected by this directive.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt000064400000001054151214231100024304 0ustar00Core.MaintainLineNumbers
TYPE: bool/null
VERSION: 2.0.0
DEFAULT: NULL
--DESCRIPTION--

<p>
  If true, HTML Purifier will add line number information to all tokens.
  This is useful when error reporting is turned on, but can result in
  significant performance degradation and should not be used when
  unnecessary. This directive must be used with the DirectLex lexer,
  as the DOMLex lexer does not (yet) support this functionality.
  If the value is null, an appropriate value will be selected based
  on other configuration.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt000064400000000336151214231100023331 0ustar00Attr.AllowedClasses
TYPE: lookup/null
VERSION: 4.0.0
DEFAULT: null
--DESCRIPTION--
List of allowed class values in the class attribute. By default, this is null,
which means all classes are allowed.
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt000064400000000253151214231100022343 0ustar00HTML.TidyRemove
TYPE: lookup
VERSION: 2.0.0
DEFAULT: array()
--DESCRIPTION--

Fixes to remove from the default set of Tidy fixes as per your level.
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeScripting.txt000064400000000421151214231100023012 0ustar00HTML.SafeScripting
TYPE: lookup
VERSION: 4.5.0
DEFAULT: array()
--DESCRIPTION--
<p>
    Whether or not to permit script tags to external scripts in documents.
    Inline scripting is not allowed, and the script must match an explicit whitelist.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt000064400000000500151214231100024253 0ustar00Attr.DefaultInvalidImage
TYPE: string
DEFAULT: ''
--DESCRIPTION--
This is the default image an img tag will be pointed to if it does not have
a valid src attribute.  In future versions, we may allow the image tag to
be removed completely, but due to design issues, this is not possible right
now.
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt000064400000000745151214231100023054 0ustar00URI.AllowedSchemes
TYPE: lookup
--DEFAULT--
array (
  'http' => true,
  'https' => true,
  'mailto' => true,
  'ftp' => true,
  'nntp' => true,
  'news' => true,
  'tel' => true,
)
--DESCRIPTION--
Whitelist that defines the schemes that a URI is allowed to have.  This
prevents XSS attacks from using pseudo-schemes like javascript or mocha.
There is also support for the <code>data</code> and <code>file</code>
URI schemes, but they are not enabled by default.
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/info.ini000064400000000055151214231100020404 0ustar00name = "HTML Purifier"

; vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt000064400000000775151214231100022603 0ustar00Output.SortAttr
TYPE: bool
VERSION: 3.2.0
DEFAULT: false
--DESCRIPTION--
<p>
  If true, HTML Purifier will sort attributes by name before writing them back
  to the document, converting a tag like: <code>&lt;el b="" a="" c="" /&gt;</code>
  to <code>&lt;el a="" b="" c="" /&gt;</code>. This is a workaround for
  a bug in FCKeditor which causes it to swap attributes order, adding noise
  to text diffs. If you're not seeing this bug, chances are, you don't need
  this directive.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt000064400000000661151214231100025511 0ustar00Core.ConvertDocumentToFragment
TYPE: bool
DEFAULT: true
--DESCRIPTION--

This parameter determines whether or not the filter should convert
input that is a full document with html and body tags to a fragment
of just the contents of a body tag. This parameter is simply something
HTML Purifier can do during an edge-case: for most inputs, this
processing is not necessary.

--ALIASES--
Core.AcceptFullDocuments
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt000064400000005307151214231100021227 0ustar00URI.Munge
TYPE: string/null
VERSION: 1.3.0
DEFAULT: NULL
--DESCRIPTION--

<p>
    Munges all browsable (usually http, https and ftp)
    absolute URIs into another URI, usually a URI redirection service.
    This directive accepts a URI, formatted with a <code>%s</code> where
    the url-encoded original URI should be inserted (sample:
    <code>http://www.google.com/url?q=%s</code>).
</p>
<p>
    Uses for this directive:
</p>
<ul>
    <li>
        Prevent PageRank leaks, while being fairly transparent
        to users (you may also want to add some client side JavaScript to
        override the text in the statusbar). <strong>Notice</strong>:
        Many security experts believe that this form of protection does not deter spam-bots.
    </li>
    <li>
        Redirect users to a splash page telling them they are leaving your
        website. While this is poor usability practice, it is often mandated
        in corporate environments.
    </li>
</ul>
<p>
    Prior to HTML Purifier 3.1.1, this directive also enabled the munging
    of browsable external resources, which could break things if your redirection
    script was a splash page or used <code>meta</code> tags. To revert to
    previous behavior, please use %URI.MungeResources.
</p>
<p>
    You may want to also use %URI.MungeSecretKey along with this directive
    in order to enforce what URIs your redirector script allows. Open
    redirector scripts can be a security risk and negatively affect the
    reputation of your domain name.
</p>
<p>
    Starting with HTML Purifier 3.1.1, there is also these substitutions:
</p>
<table>
    <thead>
        <tr>
            <th>Key</th>
            <th>Description</th>
            <th>Example <code>&lt;a href=""&gt;</code></th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>%r</td>
            <td>1 - The URI embeds a resource<br />(blank) - The URI is merely a link</td>
            <td></td>
        </tr>
        <tr>
            <td>%n</td>
            <td>The name of the tag this URI came from</td>
            <td>a</td>
        </tr>
        <tr>
            <td>%m</td>
            <td>The name of the attribute this URI came from</td>
            <td>href</td>
        </tr>
        <tr>
            <td>%p</td>
            <td>The name of the CSS property this URI came from, or blank if irrelevant</td>
            <td></td>
        </tr>
    </tbody>
</table>
<p>
    Admittedly, these letters are somewhat arbitrary; the only stipulation
    was that they couldn't be a through f. r is for resource (I would have preferred
    e, but you take what you can get), n is for name, m
    was picked because it came after n (and I couldn't use a), p is for
    property.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt000064400000000606151214231100022525 0ustar00URI.MakeAbsolute
TYPE: bool
VERSION: 2.1.0
DEFAULT: false
--DESCRIPTION--

<p>
    Converts all URIs into absolute forms. This is useful when the HTML
    being filtered assumes a specific base path, but will actually be
    viewed in a different context (and setting an alternate base URI is
    not possible). %URI.Base must be set for this directive to work.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt000064400000001156151214231100022500 0ustar00HTML.CoreModules
TYPE: lookup
VERSION: 2.0.0
--DEFAULT--
array (
  'Structure' => true,
  'Text' => true,
  'Hypertext' => true,
  'List' => true,
  'NonXMLCommonAttributes' => true,
  'XMLCommonAttributes' => true,
  'CommonAttributes' => true,
)
--DESCRIPTION--

<p>
    Certain modularized doctypes (XHTML, namely), have certain modules
    that must be included for the doctype to be an conforming document
    type: put those modules here. By default, XHTML's core modules
    are used. You can set this to a blank array to disable core module
    protection, but this is not recommended.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt000064400000000305151214231100022757 0ustar00Test.ForceNoIconv
TYPE: bool
DEFAULT: false
--DESCRIPTION--
When set to true, HTMLPurifier_Encoder will act as if iconv does not exist
and use only pure PHP implementations.
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt000064400000000304151214231100022702 0ustar00CSS.DefinitionRev
TYPE: int
VERSION: 2.0.0
DEFAULT: 1
--DESCRIPTION--

<p>
    Revision identifier for your custom definition. See
    %HTML.DefinitionRev for details.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ID.HTML5.txt000064400000000615151214231100021550 0ustar00Attr.ID.HTML5
TYPE: bool/null
DEFAULT: null
VERSION: 4.8.0
--DESCRIPTION--
In HTML5, restrictions on the format of the id attribute have been significantly
relaxed, such that any string is valid so long as it contains no spaces and
is at least one character.  In lieu of a general HTML5 compatibility flag,
set this configuration directive to true to use the relaxed rules.
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt000064400000001362151214231100023647 0ustar00HTML.ForbiddenElements
TYPE: lookup
VERSION: 3.1.0
DEFAULT: array()
--DESCRIPTION--
<p>
    This was, perhaps, the most requested feature ever in HTML
    Purifier. Please don't abuse it! This is the logical inverse of
    %HTML.AllowedElements, and it will override that directive, or any
    other directive.
</p>
<p>
    If possible, %HTML.Allowed is recommended over this directive, because it
    can sometimes be difficult to tell whether or not you've forbidden all of
    the behavior you would like to disallow. If you forbid <code>img</code>
    with the expectation of preventing images on your site, you'll be in for
    a nasty surprise when people start using the <code>background-image</code>
    CSS property.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt000064400000000406151214231100023634 0ustar00Attr.ForbiddenClasses
TYPE: lookup
VERSION: 4.0.0
DEFAULT: array()
--DESCRIPTION--
List of forbidden class values in the class attribute. By default, this is
empty, which means that no classes are forbidden. See also %Attr.AllowedClasses.
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt000064400000000335151214231100021525 0ustar00HTML.Strict
TYPE: bool
VERSION: 1.3.0
DEFAULT: false
DEPRECATED-VERSION: 1.7.0
DEPRECATED-USE: HTML.Doctype
--DESCRIPTION--
Determines whether or not to use Transitional (loose) or Strict rulesets.
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.ForbiddenProperties.txt000064400000000717151214231100024116 0ustar00CSS.ForbiddenProperties
TYPE: lookup
VERSION: 4.2.0
DEFAULT: array()
--DESCRIPTION--
<p>
    This is the logical inverse of %CSS.AllowedProperties, and it will
    override that directive or any other directive.  If possible,
    %CSS.AllowedProperties is recommended over this directive,
    because it can sometimes be difficult to tell whether or not you've
    forbidden all of the CSS properties you truly would like to disallow.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt000064400000000767151214231100024572 0ustar00Core.EscapeInvalidChildren
TYPE: bool
DEFAULT: false
--DESCRIPTION--
<p><strong>Warning:</strong> this configuration option is no longer does anything as of 4.6.0.</p>

<p>When true, a child is found that is not allowed in the context of the
parent element will be transformed into text as if it were ASCII. When
false, that element and all internal tags will be dropped, though text will
be preserved.  There is no option for dropping the element but preserving
child nodes.</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt000064400000000506151214231100025774 0ustar00AutoFormat.PurifierLinkify.DocURL
TYPE: string
VERSION: 2.0.1
DEFAULT: '#%s'
ALIASES: AutoFormatParam.PurifierLinkifyDocURL
--DESCRIPTION--
<p>
  Location of configuration documentation to link to, let %s substitute
  into the configuration's namespace and directive names sans the percent
  sign.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.Language.txt000064400000000444151214231100022125 0ustar00Core.Language
TYPE: string
VERSION: 2.0.0
DEFAULT: 'en'
--DESCRIPTION--

ISO 639 language code for localizable things in HTML Purifier to use,
which is mainly error reporting. There is currently only an English (en)
translation, so this directive is currently useless.
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt000064400000000627151214231100025065 0ustar00Cache.SerializerPermissions
TYPE: int/null
VERSION: 4.3.0
DEFAULT: 0755
--DESCRIPTION--

<p>
    Directory permissions of the files and directories created inside
    the DefinitionCache/Serializer or other custom serializer path.
</p>
<p>
    In HTML Purifier 4.8.0, this also supports <code>NULL</code>,
    which means that no chmod'ing or directory creation shall
    occur.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt000064400000002272151214231100022564 0ustar00HTML.DefinitionID
TYPE: string/null
DEFAULT: NULL
VERSION: 2.0.0
--DESCRIPTION--

<p>
    Unique identifier for a custom-built HTML definition. If you edit
    the raw version of the HTMLDefinition, introducing changes that the
    configuration object does not reflect, you must specify this variable.
    If you change your custom edits, you should change this directive, or
    clear your cache. Example:
</p>
<pre>
$config = HTMLPurifier_Config::createDefault();
$config->set('HTML', 'DefinitionID', '1');
$def = $config->getHTMLDefinition();
$def->addAttribute('a', 'tabindex', 'Number');
</pre>
<p>
    In the above example, the configuration is still at the defaults, but
    using the advanced API, an extra attribute has been added. The
    configuration object normally has no way of knowing that this change
    has taken place, so it needs an extra directive: %HTML.DefinitionID.
    If someone else attempts to use the default configuration, these two
    pieces of code will not clobber each other in the cache, since one has
    an extra directive attached to it.
</p>
<p>
    You <em>must</em> specify a value to this directive to use the
    advanced API features.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt000064400000001562151214231100023344 0ustar00HTML.AllowedElements
TYPE: lookup/null
VERSION: 1.3.0
DEFAULT: NULL
--DESCRIPTION--
<p>
    If HTML Purifier's tag set is unsatisfactory for your needs, you can
    overload it with your own list of tags to allow.  If you change
    this, you probably also want to change %HTML.AllowedAttributes; see
    also %HTML.Allowed which lets you set allowed elements and
    attributes at the same time.
</p>
<p>
    If you attempt to allow an element that HTML Purifier does not know
    about, HTML Purifier will raise an error.  You will need to manually
    tell HTML Purifier about this element by using the
    <a href="http://htmlpurifier.org/docs/enduser-customize.html">advanced customization features.</a>
</p>
<p>
    <strong>Warning:</strong> If another directive conflicts with the
    elements here, <em>that</em> directive will win and override.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveSpansWithoutAttributes.txt000064400000000447151214231100027473 0ustar00AutoFormat.RemoveSpansWithoutAttributes
TYPE: bool
VERSION: 4.0.1
DEFAULT: false
--DESCRIPTION--
<p>
  This directive causes <code>span</code> tags without any attributes
  to be removed. It will also remove spans that had all attributes
  removed during processing.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt000064400000000512151214231100023437 0ustar00Cache.SerializerPath
TYPE: string/null
VERSION: 2.0.0
DEFAULT: NULL
--DESCRIPTION--

<p>
    Absolute path with no trailing slash to store serialized definitions in.
    Default is within the
    HTML Purifier library inside DefinitionCache/Serializer. This
    path must be writable by the webserver.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt000064400000000312151214231100023722 0ustar00Core.EscapeInvalidTags
TYPE: bool
DEFAULT: false
--DESCRIPTION--
When true, invalid tags will be written back to the document as plain text.
Otherwise, they are silently dropped.
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AllowHostnameUnderscore.txt000064400000001077151214231100025214 0ustar00Core.AllowHostnameUnderscore
TYPE: bool
VERSION: 4.6.0
DEFAULT: false
--DESCRIPTION--
<p>
    By RFC 1123, underscores are not permitted in host names.
    (This is in contrast to the specification for DNS, RFC
    2181, which allows underscores.)
    However, most browsers do the right thing when faced with
    an underscore in the host name, and so some poorly written
    websites are written with the expectation this should work.
    Setting this parameter to true relaxes our allowed character
    check so that underscores are permitted.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AllowParseManyTags.txt000064400000000501151214231100024111 0ustar00Core.AllowParseManyTags
TYPE: bool
DEFAULT: false
VERSION: 4.10.1
--DESCRIPTION--
<p>
    This directive allows parsing of many nested tags.
    If you set true, relaxes any hardcoded limit from the parser.
    However, in that case it may cause a Dos attack.
    Be careful when enabling it.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt000064400000000455151214231100023047 0ustar00AutoFormat.Custom
TYPE: list
VERSION: 2.0.1
DEFAULT: array()
--DESCRIPTION--

<p>
  This directive can be used to add custom auto-format injectors.
  Specify an array of injector names (class name minus the prefix)
  or concrete implementations. Injector class must exist.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt000064400000000243151214231100021575 0ustar00HTML.TidyAdd
TYPE: lookup
VERSION: 2.0.0
DEFAULT: array()
--DESCRIPTION--

Fixes to add to the default set of Tidy fixes as per your level.
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt000064400000000566151214231100023434 0ustar00Cache.DefinitionImpl
TYPE: string/null
VERSION: 2.0.0
DEFAULT: 'Serializer'
--DESCRIPTION--

This directive defines which method to use when caching definitions,
the complex data-type that makes HTML Purifier tick. Set to null
to disable caching (not recommended, as you will see a definite
performance degradation).

--ALIASES--
Core.DefinitionCache
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt000064400000002260151214231100025576 0ustar00Filter.ExtractStyleBlocks.Scope
TYPE: string/null
VERSION: 3.0.0
DEFAULT: NULL
ALIASES: Filter.ExtractStyleBlocksScope, FilterParam.ExtractStyleBlocksScope
--DESCRIPTION--

<p>
  If you would like users to be able to define external stylesheets, but
  only allow them to specify CSS declarations for a specific node and
  prevent them from fiddling with other elements, use this directive.
  It accepts any valid CSS selector, and will prepend this to any
  CSS declaration extracted from the document. For example, if this
  directive is set to <code>#user-content</code> and a user uses the
  selector <code>a:hover</code>, the final selector will be
  <code>#user-content a:hover</code>.
</p>
<p>
  The comma shorthand may be used; consider the above example, with
  <code>#user-content, #user-content2</code>, the final selector will
  be <code>#user-content a:hover, #user-content2 a:hover</code>.
</p>
<p>
  <strong>Warning:</strong> It is possible for users to bypass this measure
  using a naughty + selector. This is a bug in CSS Tidy 1.3, not HTML
  Purifier, and I am working to get it fixed. Until then, HTML Purifier
  performs a basic check to prevent this.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt000064400000005306151214231100024532 0ustar00Filter.ExtractStyleBlocks
TYPE: bool
VERSION: 3.1.0
DEFAULT: false
EXTERNAL: CSSTidy
--DESCRIPTION--
<p>
  This directive turns on the style block extraction filter, which removes
  <code>style</code> blocks from input HTML, cleans them up with CSSTidy,
  and places them in the <code>StyleBlocks</code> context variable, for further
  use by you, usually to be placed in an external stylesheet, or a
  <code>style</code> block in the <code>head</code> of your document.
</p>
<p>
  Sample usage:
</p>
<pre><![CDATA[
<?php
    header('Content-type: text/html; charset=utf-8');
    echo '<?xml version="1.0" encoding="UTF-8"?>';
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
  <title>Filter.ExtractStyleBlocks</title>
<?php
    require_once '/path/to/library/HTMLPurifier.auto.php';
    require_once '/path/to/csstidy.class.php';

    $dirty = '<style>body {color:#F00;}</style> Some text';

    $config = HTMLPurifier_Config::createDefault();
    $config->set('Filter', 'ExtractStyleBlocks', true);
    $purifier = new HTMLPurifier($config);

    $html = $purifier->purify($dirty);

    // This implementation writes the stylesheets to the styles/ directory.
    // You can also echo the styles inside the document, but it's a bit
    // more difficult to make sure they get interpreted properly by
    // browsers; try the usual CSS armoring techniques.
    $styles = $purifier->context->get('StyleBlocks');
    $dir = 'styles/';
    if (!is_dir($dir)) mkdir($dir);
    $hash = sha1($_GET['html']);
    foreach ($styles as $i => $style) {
        file_put_contents($name = $dir . $hash . "_$i");
        echo '<link rel="stylesheet" type="text/css" href="'.$name.'" />';
    }
?>
</head>
<body>
  <div>
    <?php echo $html; ?>
  </div>
</b]]><![CDATA[ody>
</html>
]]></pre>
<p>
  <strong>Warning:</strong> It is possible for a user to mount an
  imagecrash attack using this CSS. Counter-measures are difficult;
  it is not simply enough to limit the range of CSS lengths (using
  relative lengths with many nesting levels allows for large values
  to be attained without actually specifying them in the stylesheet),
  and the flexible nature of selectors makes it difficult to selectively
  disable lengths on image tags (HTML Purifier, however, does disable
  CSS width and height in inline styling). There are probably two effective
  counter measures: an explicit width and height set to auto in all
  images in your document (unlikely) or the disabling of width and
  height (somewhat reasonable). Whether or not these measures should be
  used is left to the reader.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt000064400000000475151214231100024402 0ustar00AutoFormat.DisplayLinkURI
TYPE: bool
VERSION: 3.2.0
DEFAULT: false
--DESCRIPTION--
<p>
  This directive turns on the in-text display of URIs in &lt;a&gt; tags, and disables
  those links. For example, <a href="http://example.com">example</a> becomes
  example (<a>http://example.com</a>).
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Forms.txt000064400000000515151214231100021343 0ustar00HTML.Forms
TYPE: bool
VERSION: 4.13.0
DEFAULT: false
--DESCRIPTION--
<p>
    Whether or not to permit form elements in the user input, regardless of
    %HTML.Trusted value. Please be very careful when using this functionality, as
    enabling forms in untrusted documents may allow for phishing attacks.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt000064400000000715151214231100022407 0ustar00CSS.AllowTricky
TYPE: bool
DEFAULT: false
VERSION: 3.1.0
--DESCRIPTION--
This parameter determines whether or not to allow "tricky" CSS properties and
values. Tricky CSS properties/values can drastically modify page layout or
be used for deceptive practices but do not directly constitute a security risk.
For example, <code>display:none;</code> is considered a tricky property that
will only be allowed if this directive is set to true.
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt000064400000002162151214231100024330 0ustar00AutoFormat.AutoParagraph
TYPE: bool
VERSION: 2.0.1
DEFAULT: false
--DESCRIPTION--

<p>
  This directive turns on auto-paragraphing, where double newlines are
  converted in to paragraphs whenever possible. Auto-paragraphing:
</p>
<ul>
  <li>Always applies to inline elements or text in the root node,</li>
  <li>Applies to inline elements or text with double newlines in nodes
      that allow paragraph tags,</li>
  <li>Applies to double newlines in paragraph tags</li>
</ul>
<p>
  <code>p</code> tags must be allowed for this directive to take effect.
  We do not use <code>br</code> tags for paragraphing, as that is
  semantically incorrect.
</p>
<p>
  To prevent auto-paragraphing as a content-producer, refrain from using
  double-newlines except to specify a new paragraph or in contexts where
  it has special meaning (whitespace usually has no meaning except in
  tags like <code>pre</code>, so this should not be difficult.) To prevent
  the paragraphing of inline text adjacent to block elements, wrap them
  in <code>div</code> tags (the behavior is slightly different outside of
  the root node.)
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetNoreferrer.txt000064400000000436151214231100023537 0ustar00HTML.TargetNoreferrer
TYPE: bool
VERSION: 4.8.0
DEFAULT: TRUE
--DESCRIPTION--
If enabled, noreferrer rel attributes are added to links which have
a target attribute associated with them.  This prevents malicious
destinations from overwriting the original window.
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt000064400000001636151214231100022707 0ustar00Attr.ClassUseCDATA
TYPE: bool/null
DEFAULT: null
VERSION: 4.0.0
--DESCRIPTION--
If null, class will auto-detect the doctype and, if matching XHTML 1.1 or
XHTML 2.0, will use the restrictive NMTOKENS specification of class. Otherwise,
it will use a relaxed CDATA definition.  If true, the relaxed CDATA definition
is forced; if false, the NMTOKENS definition is forced.  To get behavior
of HTML Purifier prior to 4.0.0, set this directive to false.

Some rational behind the auto-detection:
in previous versions of HTML Purifier, it was assumed that the form of
class was NMTOKENS, as specified by the XHTML Modularization (representing
XHTML 1.1 and XHTML 2.0).  The DTDs for HTML 4.01 and XHTML 1.0, however
specify class as CDATA.  HTML 5 effectively defines it as CDATA, but
with the additional constraint that each name should be unique (this is not
explicitly outlined in previous specifications).
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt000064400000001722151214231100023043 0ustar00URI.MungeSecretKey
TYPE: string/null
VERSION: 3.1.1
DEFAULT: NULL
--DESCRIPTION--
<p>
    This directive enables secure checksum generation along with %URI.Munge.
    It should be set to a secure key that is not shared with anyone else.
    The checksum can be placed in the URI using %t. Use of this checksum
    affords an additional level of protection by allowing a redirector
    to check if a URI has passed through HTML Purifier with this line:
</p>

<pre>$checksum === hash_hmac("sha256", $url, $secret_key)</pre>

<p>
    If the output is TRUE, the redirector script should accept the URI.
</p>

<p>
    Please note that it would still be possible for an attacker to procure
    secure hashes en-mass by abusing your website's Preview feature or the
    like, but this service affords an additional level of protection
    that should be combined with website blacklisting.
</p>

<p>
    Remember this has no effect if %URI.Munge is not on.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt000064400000000304151214231100022711 0ustar00URI.DefinitionRev
TYPE: int
VERSION: 2.1.0
DEFAULT: 1
--DESCRIPTION--

<p>
    Revision identifier for your custom definition. See
    %HTML.DefinitionRev for details.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt000064400000000546151214231100022416 0ustar00Output.Newline
TYPE: string/null
VERSION: 2.0.1
DEFAULT: NULL
--DESCRIPTION--

<p>
    Newline string to format final output with. If left null, HTML Purifier
    will auto-detect the default newline type of the system and use that;
    you can manually override it here. Remember, \r\n is Windows, \r
    is Mac, and \n is Unix.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt000064400000002024151214231100022277 0ustar00Core.LexerImpl
TYPE: mixed/null
VERSION: 2.0.0
DEFAULT: NULL
--DESCRIPTION--

<p>
  This parameter determines what lexer implementation can be used. The
  valid values are:
</p>
<dl>
  <dt><em>null</em></dt>
  <dd>
    Recommended, the lexer implementation will be auto-detected based on
    your PHP-version and configuration.
  </dd>
  <dt><em>string</em> lexer identifier</dt>
  <dd>
    This is a slim way of manually overridding the implementation.
    Currently recognized values are: DOMLex (the default PHP5
implementation)
    and DirectLex (the default PHP4 implementation). Only use this if
    you know what you are doing: usually, the auto-detection will
    manage things for cases you aren't even aware of.
  </dd>
  <dt><em>object</em> lexer instance</dt>
  <dd>
    Super-advanced: you can specify your own, custom, implementation that
    implements the interface defined by <code>HTMLPurifier_Lexer</code>.
    I may remove this option simply because I don't expect anyone
    to use it.
  </dd>
</dl>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeRegexp.txt000064400000001601151214231100023322 0ustar00URI.SafeIframeRegexp
TYPE: string/null
VERSION: 4.4.0
DEFAULT: NULL
--DESCRIPTION--
<p>
    A PCRE regular expression that will be matched against an iframe URI.  This is
    a relatively inflexible scheme, but works well enough for the most common
    use-case of iframes: embedded video.  This directive only has an effect if
    %HTML.SafeIframe is enabled.  Here are some example values:
</p>
<ul>
    <li><code>%^http://www.youtube.com/embed/%</code> - Allow YouTube videos</li>
    <li><code>%^http://player.vimeo.com/video/%</code> - Allow Vimeo videos</li>
    <li><code>%^http://(www.youtube.com/embed/|player.vimeo.com/video/)%</code> - Allow both</li>
</ul>
<p>
    Note that this directive does not give you enough granularity to, say, disable
    all <code>autoplay</code> videos.  Pipe up on the HTML Purifier forums if this
    is a capability you want.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Base.txt000064400000001216151214231100021021 0ustar00URI.Base
TYPE: string/null
VERSION: 2.1.0
DEFAULT: NULL
--DESCRIPTION--

<p>
    The base URI is the URI of the document this purified HTML will be
    inserted into.  This information is important if HTML Purifier needs
    to calculate absolute URIs from relative URIs, such as when %URI.MakeAbsolute
    is on.  You may use a non-absolute URI for this value, but behavior
    may vary (%URI.MakeAbsolute deals nicely with both absolute and
    relative paths, but forwards-compatibility is not guaranteed).
    <strong>Warning:</strong> If set, the scheme on this URI
    overrides the one specified by %URI.DefaultScheme.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt000064400000001154151214231100022156 0ustar00HTML.TidyLevel
TYPE: string
VERSION: 2.0.0
DEFAULT: 'medium'
--DESCRIPTION--

<p>General level of cleanliness the Tidy module should enforce.
There are four allowed values:</p>
<dl>
    <dt>none</dt>
    <dd>No extra tidying should be done</dd>
    <dt>light</dt>
    <dd>Only fix elements that would be discarded otherwise due to
    lack of support in doctype</dd>
    <dt>medium</dt>
    <dd>Enforce best practices</dd>
    <dt>heavy</dt>
    <dd>Transform all deprecated elements and attributes to standards
    compliant equivalents</dd>
</dl>

--ALLOWED--
'none', 'light', 'medium', 'heavy'
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt000064400000000472151214231100021510 0ustar00HTML.Parent
TYPE: string
VERSION: 1.3.0
DEFAULT: 'div'
--DESCRIPTION--

<p>
    String name of element that HTML fragment passed to library will be
    inserted in.  An interesting variation would be using span as the
    parent element, meaning that only inline tags would be allowed.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt000064400000001226151214231100024014 0ustar00Core.AggressivelyFixLt
TYPE: bool
VERSION: 2.1.0
DEFAULT: true
--DESCRIPTION--
<p>
    This directive enables aggressive pre-filter fixes HTML Purifier can
    perform in order to ensure that open angled-brackets do not get killed
    during parsing stage. Enabling this will result in two preg_replace_callback
    calls and at least two preg_replace calls for every HTML document parsed;
    if your users make very well-formed HTML, you can set this directive false.
    This has no effect when DirectLex is used.
</p>
<p>
    <strong>Notice:</strong> This directive's default turned from false to true
    in HTML Purifier 3.2.0.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt000064400000000701151214231100026122 0ustar00AutoFormat.RemoveEmpty.RemoveNbsp
TYPE: bool
VERSION: 4.0.0
DEFAULT: false
--DESCRIPTION--
<p>
  When enabled, HTML Purifier will treat any elements that contain only
  non-breaking spaces as well as regular whitespace as empty, and remove
  them when %AutoFormat.RemoveEmpty is enabled.
</p>
<p>
  See %AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions for a list of elements
  that don't have this behavior applied to them.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveProcessingInstructions.txt000064400000000616151214231100026322 0ustar00Core.RemoveProcessingInstructions
TYPE: bool
VERSION: 4.2.0
DEFAULT: false
--DESCRIPTION--
Instead of escaping processing instructions in the form <code>&lt;? ...
?&gt;</code>, remove it out-right.  This may be useful if the HTML
you are validating contains XML processing instruction gunk, however,
it can also be user-unfriendly for people attempting to post PHP
snippets.
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyRemoveScript.txt000064400000001075151214231100025412 0ustar00Core.AggressivelyRemoveScript
TYPE: bool
VERSION: 4.9.0
DEFAULT: true
--DESCRIPTION--
<p>
    This directive enables aggressive pre-filter removal of
    script tags.  This is not necessary for security,
    but it can help work around a bug in libxml where embedded
    HTML elements inside script sections cause the parser to
    choke.  To revert to pre-4.9.0 behavior, set this to false.
    This directive has no effect if %Core.Trusted is true,
    %Core.RemoveScriptContents is false, or %Core.HiddenElements
    does not contain script.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt000064400000000446151214231100023316 0ustar00Attr.DefaultTextDir
TYPE: string
DEFAULT: 'ltr'
--DESCRIPTION--
Defines the default text direction (ltr or rtl) of the document being
parsed.  This generally is the same as the value of the dir attribute in
HTML, or ltr if that is not specified.
--ALLOWED--
'ltr', 'rtl'
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt000064400000001377151214231100022136 0ustar00Core.Encoding
TYPE: istring
DEFAULT: 'utf-8'
--DESCRIPTION--
If for some reason you are unable to convert all webpages to UTF-8, you can
use this directive as a stop-gap compatibility change to let HTML Purifier
deal with non UTF-8 input.  This technique has notable deficiencies:
absolutely no characters outside of the selected character encoding will be
preserved, not even the ones that have been ampersand escaped (this is due
to a UTF-8 specific <em>feature</em> that automatically resolves all
entities), making it pretty useless for anything except the most I18N-blind
applications, although %Core.EscapeNonASCIICharacters offers fixes this
trouble with another tradeoff. This directive only accepts ISO-8859-1 if
iconv is not enabled.
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetBlank.txt000064400000000375151214231100022457 0ustar00HTML.TargetBlank
TYPE: bool
VERSION: 4.4.0
DEFAULT: FALSE
--DESCRIPTION--
If enabled, <code>target=blank</code> attributes are added to all outgoing links.
(This includes links from an HTTPS version of a page to an HTTP version.)
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt000064400000000743151214231100022073 0ustar00HTML.SafeEmbed
TYPE: bool
VERSION: 3.1.1
DEFAULT: false
--DESCRIPTION--
<p>
    Whether or not to permit embed tags in documents, with a number of extra
    security features added to prevent script execution. This is similar to
    what websites like MySpace do to embed tags. Embed is a proprietary
    element and will cause your website to stop validating; you should
    see if you can use %Output.FlashCompat with %HTML.SafeObject instead
    first.</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt000064400000001473151214231100023077 0ustar00Output.TidyFormat
TYPE: bool
VERSION: 1.1.1
DEFAULT: false
--DESCRIPTION--
<p>
    Determines whether or not to run Tidy on the final output for pretty
    formatting reasons, such as indentation and wrap.
</p>
<p>
    This can greatly improve readability for editors who are hand-editing
    the HTML, but is by no means necessary as HTML Purifier has already
    fixed all major errors the HTML may have had. Tidy is a non-default
    extension, and this directive will silently fail if Tidy is not
    available.
</p>
<p>
    If you are looking to make the overall look of your page's source
    better, I recommend running Tidy on the entire page rather than just
    user-content (after all, the indentation relative to the containing
    blocks will be incorrect).
</p>
--ALIASES--
Core.TidyFormat
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt000064400000001137151214231100023714 0ustar00HTML.AllowedAttributes
TYPE: lookup/null
VERSION: 1.3.0
DEFAULT: NULL
--DESCRIPTION--

<p>
    If HTML Purifier's attribute set is unsatisfactory, overload it!
    The syntax is "tag.attr" or "*.attr" for the global attributes
    (style, id, class, dir, lang, xml:lang).
</p>
<p>
    <strong>Warning:</strong> If another directive conflicts with the
    elements here, <em>that</em> directive will win and override. For
    example, %HTML.EnableAttrID will take precedence over *.id in this
    directive.  You must set that directive to true before you can use
    IDs at all.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt000064400000000475151214231100023730 0ustar00Attr.IDBlacklistRegexp
TYPE: string/null
VERSION: 1.6.0
DEFAULT: NULL
--DESCRIPTION--
PCRE regular expression to be matched against all IDs. If the expression is
matches, the ID is rejected. Use this with care: may cause significant
degradation. ID matching is done after all other validation.
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt000064400000001157151214231100022470 0ustar00CSS.MaxImgLength
TYPE: string/null
DEFAULT: '1200px'
VERSION: 3.1.1
--DESCRIPTION--
<p>
 This parameter sets the maximum allowed length on <code>img</code> tags,
 effectively the <code>width</code> and <code>height</code> properties.
 Only absolute units of measurement (in, pt, pc, mm, cm) and pixels (px) are allowed. This is
 in place to prevent imagecrash attacks, disable with null at your own risk.
 This directive is similar to %HTML.MaxImgLength, and both should be
 concurrently edited, although there are
 subtle differences in the input format (the CSS max is a number with
 a unit).
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt000064400000000745151214231100026264 0ustar00Filter.ExtractStyleBlocks.Escaping
TYPE: bool
VERSION: 3.0.0
DEFAULT: true
ALIASES: Filter.ExtractStyleBlocksEscaping, FilterParam.ExtractStyleBlocksEscaping
--DESCRIPTION--

<p>
  Whether or not to escape the dangerous characters &lt;, &gt; and &amp;
  as \3C, \3E and \26, respectively. This is can be safely set to false
  if the contents of StyleBlocks will be placed in an external stylesheet,
  where there is no risk of it being interpreted as HTML.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt000064400000000413151214231100023174 0ustar00AutoFormat.Linkify
TYPE: bool
VERSION: 2.0.1
DEFAULT: false
--DESCRIPTION--

<p>
  This directive turns on linkification, auto-linking http, ftp and
  https URLs. <code>a</code> tags with the <code>href</code> attribute
  must be allowed.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt000064400000000464151214231100024710 0ustar00AutoFormat.PurifierLinkify
TYPE: bool
VERSION: 2.0.1
DEFAULT: false
--DESCRIPTION--

<p>
  Internal auto-formatter that converts configuration directives in
  syntax <a>%Namespace.Directive</a> to links. <code>a</code> tags
  with the <code>href</code> attribute must be allowed.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt000064400000001744151214231100021651 0ustar00HTML.Allowed
TYPE: itext/null
VERSION: 2.0.0
DEFAULT: NULL
--DESCRIPTION--

<p>
    This is a preferred convenience directive that combines
    %HTML.AllowedElements and %HTML.AllowedAttributes.
    Specify elements and attributes that are allowed using:
    <code>element1[attr1|attr2],element2...</code>.  For example,
    if you would like to only allow paragraphs and links, specify
    <code>a[href],p</code>.  You can specify attributes that apply
    to all elements using an asterisk, e.g. <code>*[lang]</code>.
    You can also use newlines instead of commas to separate elements.
</p>
<p>
    <strong>Warning</strong>:
    All of the constraints on the component directives are still enforced.
    The syntax is a <em>subset</em> of TinyMCE's <code>valid_elements</code>
    whitelist: directly copy-pasting it here will probably result in
    broken whitelists. If %HTML.AllowedElements or %HTML.AllowedAttributes
    are set, this directive has no effect.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt000064400000000671151214231100022265 0ustar00HTML.SafeObject
TYPE: bool
VERSION: 3.1.1
DEFAULT: false
--DESCRIPTION--
<p>
    Whether or not to permit object tags in documents, with a number of extra
    security features added to prevent script execution. This is similar to
    what websites like MySpace do to object tags.  You should also enable
    %Output.FlashCompat in order to generate Internet Explorer
    compatibility code for your object tags.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Host.txt000064400000001462151214231100021067 0ustar00URI.Host
TYPE: string/null
VERSION: 1.2.0
DEFAULT: NULL
--DESCRIPTION--

<p>
    Defines the domain name of the server, so we can determine whether or
    an absolute URI is from your website or not.  Not strictly necessary,
    as users should be using relative URIs to reference resources on your
    website.  It will, however, let you use absolute URIs to link to
    subdomains of the domain you post here: i.e. example.com will allow
    sub.example.com.  However, higher up domains will still be excluded:
    if you set %URI.Host to sub.example.com, example.com will be blocked.
    <strong>Note:</strong> This directive overrides %URI.Base because
    a given page may be on a sub-domain, but you wish HTML Purifier to be
    more relaxed and allow some of the parent domains too.
</p>
--# vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php000064400000015713151214231100021766 0ustar00<?php

class HTMLPurifier_ConfigSchema_InterchangeBuilder
{

    /**
     * Used for processing DEFAULT, nothing else.
     * @type HTMLPurifier_VarParser
     */
    protected $varParser;

    /**
     * @param HTMLPurifier_VarParser $varParser
     */
    public function __construct($varParser = null)
    {
        $this->varParser = $varParser ? $varParser : new HTMLPurifier_VarParser_Native();
    }

    /**
     * @param string $dir
     * @return HTMLPurifier_ConfigSchema_Interchange
     */
    public static function buildFromDirectory($dir = null)
    {
        $builder = new HTMLPurifier_ConfigSchema_InterchangeBuilder();
        $interchange = new HTMLPurifier_ConfigSchema_Interchange();
        return $builder->buildDir($interchange, $dir);
    }

    /**
     * @param HTMLPurifier_ConfigSchema_Interchange $interchange
     * @param string $dir
     * @return HTMLPurifier_ConfigSchema_Interchange
     */
    public function buildDir($interchange, $dir = null)
    {
        if (!$dir) {
            $dir = HTMLPURIFIER_PREFIX . '/HTMLPurifier/ConfigSchema/schema';
        }
        if (file_exists($dir . '/info.ini')) {
            $info = parse_ini_file($dir . '/info.ini');
            $interchange->name = $info['name'];
        }

        $files = array();
        $dh = opendir($dir);
        while (false !== ($file = readdir($dh))) {
            if (!$file || $file[0] == '.' || strrchr($file, '.') !== '.txt') {
                continue;
            }
            $files[] = $file;
        }
        closedir($dh);

        sort($files);
        foreach ($files as $file) {
            $this->buildFile($interchange, $dir . '/' . $file);
        }
        return $interchange;
    }

    /**
     * @param HTMLPurifier_ConfigSchema_Interchange $interchange
     * @param string $file
     */
    public function buildFile($interchange, $file)
    {
        $parser = new HTMLPurifier_StringHashParser();
        $this->build(
            $interchange,
            new HTMLPurifier_StringHash($parser->parseFile($file))
        );
    }

    /**
     * Builds an interchange object based on a hash.
     * @param HTMLPurifier_ConfigSchema_Interchange $interchange HTMLPurifier_ConfigSchema_Interchange object to build
     * @param HTMLPurifier_StringHash $hash source data
     * @throws HTMLPurifier_ConfigSchema_Exception
     */
    public function build($interchange, $hash)
    {
        if (!$hash instanceof HTMLPurifier_StringHash) {
            $hash = new HTMLPurifier_StringHash($hash);
        }
        if (!isset($hash['ID'])) {
            throw new HTMLPurifier_ConfigSchema_Exception('Hash does not have any ID');
        }
        if (strpos($hash['ID'], '.') === false) {
            if (count($hash) == 2 && isset($hash['DESCRIPTION'])) {
                $hash->offsetGet('DESCRIPTION'); // prevent complaining
            } else {
                throw new HTMLPurifier_ConfigSchema_Exception('All directives must have a namespace');
            }
        } else {
            $this->buildDirective($interchange, $hash);
        }
        $this->_findUnused($hash);
    }

    /**
     * @param HTMLPurifier_ConfigSchema_Interchange $interchange
     * @param HTMLPurifier_StringHash $hash
     * @throws HTMLPurifier_ConfigSchema_Exception
     */
    public function buildDirective($interchange, $hash)
    {
        $directive = new HTMLPurifier_ConfigSchema_Interchange_Directive();

        // These are required elements:
        $directive->id = $this->id($hash->offsetGet('ID'));
        $id = $directive->id->toString(); // convenience

        if (isset($hash['TYPE'])) {
            $type = explode('/', $hash->offsetGet('TYPE'));
            if (isset($type[1])) {
                $directive->typeAllowsNull = true;
            }
            $directive->type = $type[0];
        } else {
            throw new HTMLPurifier_ConfigSchema_Exception("TYPE in directive hash '$id' not defined");
        }

        if (isset($hash['DEFAULT'])) {
            try {
                $directive->default = $this->varParser->parse(
                    $hash->offsetGet('DEFAULT'),
                    $directive->type,
                    $directive->typeAllowsNull
                );
            } catch (HTMLPurifier_VarParserException $e) {
                throw new HTMLPurifier_ConfigSchema_Exception($e->getMessage() . " in DEFAULT in directive hash '$id'");
            }
        }

        if (isset($hash['DESCRIPTION'])) {
            $directive->description = $hash->offsetGet('DESCRIPTION');
        }

        if (isset($hash['ALLOWED'])) {
            $directive->allowed = $this->lookup($this->evalArray($hash->offsetGet('ALLOWED')));
        }

        if (isset($hash['VALUE-ALIASES'])) {
            $directive->valueAliases = $this->evalArray($hash->offsetGet('VALUE-ALIASES'));
        }

        if (isset($hash['ALIASES'])) {
            $raw_aliases = trim($hash->offsetGet('ALIASES'));
            $aliases = preg_split('/\s*,\s*/', $raw_aliases);
            foreach ($aliases as $alias) {
                $directive->aliases[] = $this->id($alias);
            }
        }

        if (isset($hash['VERSION'])) {
            $directive->version = $hash->offsetGet('VERSION');
        }

        if (isset($hash['DEPRECATED-USE'])) {
            $directive->deprecatedUse = $this->id($hash->offsetGet('DEPRECATED-USE'));
        }

        if (isset($hash['DEPRECATED-VERSION'])) {
            $directive->deprecatedVersion = $hash->offsetGet('DEPRECATED-VERSION');
        }

        if (isset($hash['EXTERNAL'])) {
            $directive->external = preg_split('/\s*,\s*/', trim($hash->offsetGet('EXTERNAL')));
        }

        $interchange->addDirective($directive);
    }

    /**
     * Evaluates an array PHP code string without array() wrapper
     * @param string $contents
     */
    protected function evalArray($contents)
    {
        return eval('return array(' . $contents . ');');
    }

    /**
     * Converts an array list into a lookup array.
     * @param array $array
     * @return array
     */
    protected function lookup($array)
    {
        $ret = array();
        foreach ($array as $val) {
            $ret[$val] = true;
        }
        return $ret;
    }

    /**
     * Convenience function that creates an HTMLPurifier_ConfigSchema_Interchange_Id
     * object based on a string Id.
     * @param string $id
     * @return HTMLPurifier_ConfigSchema_Interchange_Id
     */
    protected function id($id)
    {
        return HTMLPurifier_ConfigSchema_Interchange_Id::make($id);
    }

    /**
     * Triggers errors for any unused keys passed in the hash; such keys
     * may indicate typos, missing values, etc.
     * @param HTMLPurifier_StringHash $hash Hash to check.
     */
    protected function _findUnused($hash)
    {
        $accessed = $hash->getAccessed();
        foreach ($hash as $k => $v) {
            if (!isset($accessed[$k])) {
                trigger_error("String hash key '$k' not used by builder", E_USER_NOTICE);
            }
        }
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php000064400000005444151214231100020776 0ustar00<?php

/**
 * Fluent interface for validating the contents of member variables.
 * This should be immutable. See HTMLPurifier_ConfigSchema_Validator for
 * use-cases. We name this an 'atom' because it's ONLY for validations that
 * are independent and usually scalar.
 */
class HTMLPurifier_ConfigSchema_ValidatorAtom
{
    /**
     * @type string
     */
    protected $context;

    /**
     * @type object
     */
    protected $obj;

    /**
     * @type string
     */
    protected $member;

    /**
     * @type mixed
     */
    protected $contents;

    public function __construct($context, $obj, $member)
    {
        $this->context = $context;
        $this->obj = $obj;
        $this->member = $member;
        $this->contents =& $obj->$member;
    }

    /**
     * @return HTMLPurifier_ConfigSchema_ValidatorAtom
     */
    public function assertIsString()
    {
        if (!is_string($this->contents)) {
            $this->error('must be a string');
        }
        return $this;
    }

    /**
     * @return HTMLPurifier_ConfigSchema_ValidatorAtom
     */
    public function assertIsBool()
    {
        if (!is_bool($this->contents)) {
            $this->error('must be a boolean');
        }
        return $this;
    }

    /**
     * @return HTMLPurifier_ConfigSchema_ValidatorAtom
     */
    public function assertIsArray()
    {
        if (!is_array($this->contents)) {
            $this->error('must be an array');
        }
        return $this;
    }

    /**
     * @return HTMLPurifier_ConfigSchema_ValidatorAtom
     */
    public function assertNotNull()
    {
        if ($this->contents === null) {
            $this->error('must not be null');
        }
        return $this;
    }

    /**
     * @return HTMLPurifier_ConfigSchema_ValidatorAtom
     */
    public function assertAlnum()
    {
        $this->assertIsString();
        if (!ctype_alnum($this->contents)) {
            $this->error('must be alphanumeric');
        }
        return $this;
    }

    /**
     * @return HTMLPurifier_ConfigSchema_ValidatorAtom
     */
    public function assertNotEmpty()
    {
        if (empty($this->contents)) {
            $this->error('must not be empty');
        }
        return $this;
    }

    /**
     * @return HTMLPurifier_ConfigSchema_ValidatorAtom
     */
    public function assertIsLookup()
    {
        $this->assertIsArray();
        foreach ($this->contents as $v) {
            if ($v !== true) {
                $this->error('must be a lookup array');
            }
        }
        return $this;
    }

    /**
     * @param string $msg
     * @throws HTMLPurifier_ConfigSchema_Exception
     */
    protected function error($msg)
    {
        throw new HTMLPurifier_ConfigSchema_Exception(ucfirst($this->member) . ' in ' . $this->context . ' ' . $msg);
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema/Exception.php000064400000000242151214231100020155 0ustar00<?php

/**
 * Exceptions related to configuration schema
 */
class HTMLPurifier_ConfigSchema_Exception extends HTMLPurifier_Exception
{

}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/URIParser.php000064400000004366151214231100015520 0ustar00<?php

/**
 * Parses a URI into the components and fragment identifier as specified
 * by RFC 3986.
 */
class HTMLPurifier_URIParser
{

    /**
     * Instance of HTMLPurifier_PercentEncoder to do normalization with.
     */
    protected $percentEncoder;

    public function __construct()
    {
        $this->percentEncoder = new HTMLPurifier_PercentEncoder();
    }

    /**
     * Parses a URI.
     * @param $uri string URI to parse
     * @return HTMLPurifier_URI representation of URI. This representation has
     *         not been validated yet and may not conform to RFC.
     */
    public function parse($uri)
    {
        $uri = $this->percentEncoder->normalize($uri);

        // Regexp is as per Appendix B.
        // Note that ["<>] are an addition to the RFC's recommended
        // characters, because they represent external delimeters.
        $r_URI = '!'.
            '(([a-zA-Z0-9\.\+\-]+):)?'. // 2. Scheme
            '(//([^/?#"<>]*))?'. // 4. Authority
            '([^?#"<>]*)'.       // 5. Path
            '(\?([^#"<>]*))?'.   // 7. Query
            '(#([^"<>]*))?'.     // 8. Fragment
            '!';

        $matches = array();
        $result = preg_match($r_URI, $uri, $matches);

        if (!$result) return false; // *really* invalid URI

        // seperate out parts
        $scheme     = !empty($matches[1]) ? $matches[2] : null;
        $authority  = !empty($matches[3]) ? $matches[4] : null;
        $path       = $matches[5]; // always present, can be empty
        $query      = !empty($matches[6]) ? $matches[7] : null;
        $fragment   = !empty($matches[8]) ? $matches[9] : null;

        // further parse authority
        if ($authority !== null) {
            $r_authority = "/^((.+?)@)?(\[[^\]]+\]|[^:]*)(:(\d*))?/";
            $matches = array();
            preg_match($r_authority, $authority, $matches);
            $userinfo   = !empty($matches[1]) ? $matches[2] : null;
            $host       = !empty($matches[3]) ? $matches[3] : '';
            $port       = !empty($matches[4]) ? (int) $matches[5] : null;
        } else {
            $port = $host = $userinfo = null;
        }

        return new HTMLPurifier_URI(
            $scheme, $userinfo, $host, $port, $path, $query, $fragment);
    }

}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/VarParser/Native.php000064400000001616151214231100017032 0ustar00<?php

/**
 * This variable parser uses PHP's internal code engine. Because it does
 * this, it can represent all inputs; however, it is dangerous and cannot
 * be used by users.
 */
class HTMLPurifier_VarParser_Native extends HTMLPurifier_VarParser
{

    /**
     * @param mixed $var
     * @param int $type
     * @param bool $allow_null
     * @return null|string
     */
    protected function parseImplementation($var, $type, $allow_null)
    {
        return $this->evalExpression($var);
    }

    /**
     * @param string $expr
     * @return mixed
     * @throws HTMLPurifier_VarParserException
     */
    protected function evalExpression($expr)
    {
        $var = null;
        $result = eval("\$var = $expr;");
        if ($result === false) {
            throw new HTMLPurifier_VarParserException("Fatal error in evaluated code");
        }
        return $var;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/VarParser/Flexible.php000064400000011706151214231100017337 0ustar00<?php

/**
 * Performs safe variable parsing based on types which can be used by
 * users. This may not be able to represent all possible data inputs,
 * however.
 */
class HTMLPurifier_VarParser_Flexible extends HTMLPurifier_VarParser
{
    /**
     * @param mixed $var
     * @param int $type
     * @param bool $allow_null
     * @return array|bool|float|int|mixed|null|string
     * @throws HTMLPurifier_VarParserException
     */
    protected function parseImplementation($var, $type, $allow_null)
    {
        if ($allow_null && $var === null) {
            return null;
        }
        switch ($type) {
            // Note: if code "breaks" from the switch, it triggers a generic
            // exception to be thrown. Specific errors can be specifically
            // done here.
            case self::C_MIXED:
            case self::ISTRING:
            case self::C_STRING:
            case self::TEXT:
            case self::ITEXT:
                return $var;
            case self::C_INT:
                if (is_string($var) && ctype_digit($var)) {
                    $var = (int)$var;
                }
                return $var;
            case self::C_FLOAT:
                if ((is_string($var) && is_numeric($var)) || is_int($var)) {
                    $var = (float)$var;
                }
                return $var;
            case self::C_BOOL:
                if (is_int($var) && ($var === 0 || $var === 1)) {
                    $var = (bool)$var;
                } elseif (is_string($var)) {
                    if ($var == 'on' || $var == 'true' || $var == '1') {
                        $var = true;
                    } elseif ($var == 'off' || $var == 'false' || $var == '0') {
                        $var = false;
                    } else {
                        throw new HTMLPurifier_VarParserException("Unrecognized value '$var' for $type");
                    }
                }
                return $var;
            case self::ALIST:
            case self::HASH:
            case self::LOOKUP:
                if (is_string($var)) {
                    // special case: technically, this is an array with
                    // a single empty string item, but having an empty
                    // array is more intuitive
                    if ($var == '') {
                        return array();
                    }
                    if (strpos($var, "\n") === false && strpos($var, "\r") === false) {
                        // simplistic string to array method that only works
                        // for simple lists of tag names or alphanumeric characters
                        $var = explode(',', $var);
                    } else {
                        $var = preg_split('/(,|[\n\r]+)/', $var);
                    }
                    // remove spaces
                    foreach ($var as $i => $j) {
                        $var[$i] = trim($j);
                    }
                    if ($type === self::HASH) {
                        // key:value,key2:value2
                        $nvar = array();
                        foreach ($var as $keypair) {
                            $c = explode(':', $keypair, 2);
                            if (!isset($c[1])) {
                                continue;
                            }
                            $nvar[trim($c[0])] = trim($c[1]);
                        }
                        $var = $nvar;
                    }
                }
                if (!is_array($var)) {
                    break;
                }
                $keys = array_keys($var);
                if ($keys === array_keys($keys)) {
                    if ($type == self::ALIST) {
                        return $var;
                    } elseif ($type == self::LOOKUP) {
                        $new = array();
                        foreach ($var as $key) {
                            $new[$key] = true;
                        }
                        return $new;
                    } else {
                        break;
                    }
                }
                if ($type === self::ALIST) {
                    trigger_error("Array list did not have consecutive integer indexes", E_USER_WARNING);
                    return array_values($var);
                }
                if ($type === self::LOOKUP) {
                    foreach ($var as $key => $value) {
                        if ($value !== true) {
                            trigger_error(
                                "Lookup array has non-true value at key '$key'; " .
                                "maybe your input array was not indexed numerically",
                                E_USER_WARNING
                            );
                        }
                        $var[$key] = true;
                    }
                }
                return $var;
            default:
                $this->errorInconsistent(__CLASS__, $type);
        }
        $this->errorGeneric($var, $type);
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Definition.php000064400000002521151214231100015763 0ustar00<?php

/**
 * Super-class for definition datatype objects, implements serialization
 * functions for the class.
 */
abstract class HTMLPurifier_Definition
{

    /**
     * Has setup() been called yet?
     * @type bool
     */
    public $setup = false;

    /**
     * If true, write out the final definition object to the cache after
     * setup.  This will be true only if all invocations to get a raw
     * definition object are also optimized.  This does not cause file
     * system thrashing because on subsequent calls the cached object
     * is used and any writes to the raw definition object are short
     * circuited.  See enduser-customize.html for the high-level
     * picture.
     * @type bool
     */
    public $optimized = null;

    /**
     * What type of definition is it?
     * @type string
     */
    public $type;

    /**
     * Sets up the definition object into the final form, something
     * not done by the constructor
     * @param HTMLPurifier_Config $config
     */
    abstract protected function doSetup($config);

    /**
     * Setup function that aborts if already setup
     * @param HTMLPurifier_Config $config
     */
    public function setup($config)
    {
        if ($this->setup) {
            return;
        }
        $this->setup = true;
        $this->doSetup($config);
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ElementDef.php000064400000016543151214231100015714 0ustar00<?php

/**
 * Structure that stores an HTML element definition. Used by
 * HTMLPurifier_HTMLDefinition and HTMLPurifier_HTMLModule.
 * @note This class is inspected by HTMLPurifier_Printer_HTMLDefinition.
 *       Please update that class too.
 * @warning If you add new properties to this class, you MUST update
 *          the mergeIn() method.
 */
class HTMLPurifier_ElementDef
{
    /**
     * Does the definition work by itself, or is it created solely
     * for the purpose of merging into another definition?
     * @type bool
     */
    public $standalone = true;

    /**
     * Associative array of attribute name to HTMLPurifier_AttrDef.
     * @type array
     * @note Before being processed by HTMLPurifier_AttrCollections
     *       when modules are finalized during
     *       HTMLPurifier_HTMLDefinition->setup(), this array may also
     *       contain an array at index 0 that indicates which attribute
     *       collections to load into the full array. It may also
     *       contain string indentifiers in lieu of HTMLPurifier_AttrDef,
     *       see HTMLPurifier_AttrTypes on how they are expanded during
     *       HTMLPurifier_HTMLDefinition->setup() processing.
     */
    public $attr = array();

    // XXX: Design note: currently, it's not possible to override
    // previously defined AttrTransforms without messing around with
    // the final generated config. This is by design; a previous version
    // used an associated list of attr_transform, but it was extremely
    // easy to accidentally override other attribute transforms by
    // forgetting to specify an index (and just using 0.)  While we
    // could check this by checking the index number and complaining,
    // there is a second problem which is that it is not at all easy to
    // tell when something is getting overridden. Combine this with a
    // codebase where this isn't really being used, and it's perfect for
    // nuking.

    /**
     * List of tags HTMLPurifier_AttrTransform to be done before validation.
     * @type array
     */
    public $attr_transform_pre = array();

    /**
     * List of tags HTMLPurifier_AttrTransform to be done after validation.
     * @type array
     */
    public $attr_transform_post = array();

    /**
     * HTMLPurifier_ChildDef of this tag.
     * @type HTMLPurifier_ChildDef
     */
    public $child;

    /**
     * Abstract string representation of internal ChildDef rules.
     * @see HTMLPurifier_ContentSets for how this is parsed and then transformed
     * into an HTMLPurifier_ChildDef.
     * @warning This is a temporary variable that is not available after
     *      being processed by HTMLDefinition
     * @type string
     */
    public $content_model;

    /**
     * Value of $child->type, used to determine which ChildDef to use,
     * used in combination with $content_model.
     * @warning This must be lowercase
     * @warning This is a temporary variable that is not available after
     *      being processed by HTMLDefinition
     * @type string
     */
    public $content_model_type;

    /**
     * Does the element have a content model (#PCDATA | Inline)*? This
     * is important for chameleon ins and del processing in
     * HTMLPurifier_ChildDef_Chameleon. Dynamically set: modules don't
     * have to worry about this one.
     * @type bool
     */
    public $descendants_are_inline = false;

    /**
     * List of the names of required attributes this element has.
     * Dynamically populated by HTMLPurifier_HTMLDefinition::getElement()
     * @type array
     */
    public $required_attr = array();

    /**
     * Lookup table of tags excluded from all descendants of this tag.
     * @type array
     * @note SGML permits exclusions for all descendants, but this is
     *       not possible with DTDs or XML Schemas. W3C has elected to
     *       use complicated compositions of content_models to simulate
     *       exclusion for children, but we go the simpler, SGML-style
     *       route of flat-out exclusions, which correctly apply to
     *       all descendants and not just children. Note that the XHTML
     *       Modularization Abstract Modules are blithely unaware of such
     *       distinctions.
     */
    public $excludes = array();

    /**
     * This tag is explicitly auto-closed by the following tags.
     * @type array
     */
    public $autoclose = array();

    /**
     * If a foreign element is found in this element, test if it is
     * allowed by this sub-element; if it is, instead of closing the
     * current element, place it inside this element.
     * @type string
     */
    public $wrap;

    /**
     * Whether or not this is a formatting element affected by the
     * "Active Formatting Elements" algorithm.
     * @type bool
     */
    public $formatting;

    /**
     * Low-level factory constructor for creating new standalone element defs
     */
    public static function create($content_model, $content_model_type, $attr)
    {
        $def = new HTMLPurifier_ElementDef();
        $def->content_model = $content_model;
        $def->content_model_type = $content_model_type;
        $def->attr = $attr;
        return $def;
    }

    /**
     * Merges the values of another element definition into this one.
     * Values from the new element def take precedence if a value is
     * not mergeable.
     * @param HTMLPurifier_ElementDef $def
     */
    public function mergeIn($def)
    {
        // later keys takes precedence
        foreach ($def->attr as $k => $v) {
            if ($k === 0) {
                // merge in the includes
                // sorry, no way to override an include
                foreach ($v as $v2) {
                    $this->attr[0][] = $v2;
                }
                continue;
            }
            if ($v === false) {
                if (isset($this->attr[$k])) {
                    unset($this->attr[$k]);
                }
                continue;
            }
            $this->attr[$k] = $v;
        }
        $this->_mergeAssocArray($this->excludes, $def->excludes);
        $this->attr_transform_pre = array_merge($this->attr_transform_pre, $def->attr_transform_pre);
        $this->attr_transform_post = array_merge($this->attr_transform_post, $def->attr_transform_post);

        if (!empty($def->content_model)) {
            $this->content_model =
                str_replace("#SUPER", $this->content_model, $def->content_model);
            $this->child = false;
        }
        if (!empty($def->content_model_type)) {
            $this->content_model_type = $def->content_model_type;
            $this->child = false;
        }
        if (!is_null($def->child)) {
            $this->child = $def->child;
        }
        if (!is_null($def->formatting)) {
            $this->formatting = $def->formatting;
        }
        if ($def->descendants_are_inline) {
            $this->descendants_are_inline = $def->descendants_are_inline;
        }
    }

    /**
     * Merges one array into another, removes values which equal false
     * @param $a1 Array by reference that is merged into
     * @param $a2 Array that merges into $a1
     */
    private function _mergeAssocArray(&$a1, $a2)
    {
        foreach ($a2 as $k => $v) {
            if ($v === false) {
                if (isset($a1[$k])) {
                    unset($a1[$k]);
                }
                continue;
            }
            $a1[$k] = $v;
        }
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Strategy.php000064400000001372151214231100015500 0ustar00<?php

/**
 * Supertype for classes that define a strategy for modifying/purifying tokens.
 *
 * While HTMLPurifier's core purpose is fixing HTML into something proper,
 * strategies provide plug points for extra configuration or even extra
 * features, such as custom tags, custom parsing of text, etc.
 */


abstract class HTMLPurifier_Strategy
{

    /**
     * Executes the strategy on the tokens.
     *
     * @param HTMLPurifier_Token[] $tokens Array of HTMLPurifier_Token objects to be operated on.
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return HTMLPurifier_Token[] Processed array of token objects.
     */
    abstract public function execute($tokens, $config, $context);
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Zipper.php000064400000010532151214231100015145 0ustar00<?php

/**
 * A zipper is a purely-functional data structure which contains
 * a focus that can be efficiently manipulated.  It is known as
 * a "one-hole context".  This mutable variant implements a zipper
 * for a list as a pair of two arrays, laid out as follows:
 *
 *      Base list: 1 2 3 4 [ ] 6 7 8 9
 *      Front list: 1 2 3 4
 *      Back list: 9 8 7 6
 *
 * User is expected to keep track of the "current element" and properly
 * fill it back in as necessary.  (ToDo: Maybe it's more user friendly
 * to implicitly track the current element?)
 *
 * Nota bene: the current class gets confused if you try to store NULLs
 * in the list.
 */

class HTMLPurifier_Zipper
{
    public $front, $back;

    public function __construct($front, $back) {
        $this->front = $front;
        $this->back = $back;
    }

    /**
     * Creates a zipper from an array, with a hole in the
     * 0-index position.
     * @param Array to zipper-ify.
     * @return Tuple of zipper and element of first position.
     */
    static public function fromArray($array) {
        $z = new self(array(), array_reverse($array));
        $t = $z->delete(); // delete the "dummy hole"
        return array($z, $t);
    }

    /**
     * Convert zipper back into a normal array, optionally filling in
     * the hole with a value. (Usually you should supply a $t, unless you
     * are at the end of the array.)
     */
    public function toArray($t = NULL) {
        $a = $this->front;
        if ($t !== NULL) $a[] = $t;
        for ($i = count($this->back)-1; $i >= 0; $i--) {
            $a[] = $this->back[$i];
        }
        return $a;
    }

    /**
     * Move hole to the next element.
     * @param $t Element to fill hole with
     * @return Original contents of new hole.
     */
    public function next($t) {
        if ($t !== NULL) array_push($this->front, $t);
        return empty($this->back) ? NULL : array_pop($this->back);
    }

    /**
     * Iterated hole advancement.
     * @param $t Element to fill hole with
     * @param $i How many forward to advance hole
     * @return Original contents of new hole, i away
     */
    public function advance($t, $n) {
        for ($i = 0; $i < $n; $i++) {
            $t = $this->next($t);
        }
        return $t;
    }

    /**
     * Move hole to the previous element
     * @param $t Element to fill hole with
     * @return Original contents of new hole.
     */
    public function prev($t) {
        if ($t !== NULL) array_push($this->back, $t);
        return empty($this->front) ? NULL : array_pop($this->front);
    }

    /**
     * Delete contents of current hole, shifting hole to
     * next element.
     * @return Original contents of new hole.
     */
    public function delete() {
        return empty($this->back) ? NULL : array_pop($this->back);
    }

    /**
     * Returns true if we are at the end of the list.
     * @return bool
     */
    public function done() {
        return empty($this->back);
    }

    /**
     * Insert element before hole.
     * @param Element to insert
     */
    public function insertBefore($t) {
        if ($t !== NULL) array_push($this->front, $t);
    }

    /**
     * Insert element after hole.
     * @param Element to insert
     */
    public function insertAfter($t) {
        if ($t !== NULL) array_push($this->back, $t);
    }

    /**
     * Splice in multiple elements at hole.  Functional specification
     * in terms of array_splice:
     *
     *      $arr1 = $arr;
     *      $old1 = array_splice($arr1, $i, $delete, $replacement);
     *
     *      list($z, $t) = HTMLPurifier_Zipper::fromArray($arr);
     *      $t = $z->advance($t, $i);
     *      list($old2, $t) = $z->splice($t, $delete, $replacement);
     *      $arr2 = $z->toArray($t);
     *
     *      assert($old1 === $old2);
     *      assert($arr1 === $arr2);
     *
     * NB: the absolute index location after this operation is
     * *unchanged!*
     *
     * @param Current contents of hole.
     */
    public function splice($t, $delete, $replacement) {
        // delete
        $old = array();
        $r = $t;
        for ($i = $delete; $i > 0; $i--) {
            $old[] = $r;
            $r = $this->delete();
        }
        // insert
        for ($i = count($replacement)-1; $i >= 0; $i--) {
            $this->insertAfter($r);
            $r = $replacement[$i];
        }
        return array($old, $r);
    }
}
htmlpurifier/library/HTMLPurifier/URIScheme.php000064400000006631151214231100015465 0ustar00<?php

/**
 * Validator for the components of a URI for a specific scheme
 */
abstract class HTMLPurifier_URIScheme
{

    /**
     * Scheme's default port (integer). If an explicit port number is
     * specified that coincides with the default port, it will be
     * elided.
     * @type int
     */
    public $default_port = null;

    /**
     * Whether or not URIs of this scheme are locatable by a browser
     * http and ftp are accessible, while mailto and news are not.
     * @type bool
     */
    public $browsable = false;

    /**
     * Whether or not data transmitted over this scheme is encrypted.
     * https is secure, http is not.
     * @type bool
     */
    public $secure = false;

    /**
     * Whether or not the URI always uses <hier_part>, resolves edge cases
     * with making relative URIs absolute
     * @type bool
     */
    public $hierarchical = false;

    /**
     * Whether or not the URI may omit a hostname when the scheme is
     * explicitly specified, ala file:///path/to/file. As of writing,
     * 'file' is the only scheme that browsers support his properly.
     * @type bool
     */
    public $may_omit_host = false;

    /**
     * Validates the components of a URI for a specific scheme.
     * @param HTMLPurifier_URI $uri Reference to a HTMLPurifier_URI object
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool success or failure
     */
    abstract public function doValidate(&$uri, $config, $context);

    /**
     * Public interface for validating components of a URI.  Performs a
     * bunch of default actions. Don't overload this method.
     * @param HTMLPurifier_URI $uri Reference to a HTMLPurifier_URI object
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool success or failure
     */
    public function validate(&$uri, $config, $context)
    {
        if ($this->default_port == $uri->port) {
            $uri->port = null;
        }
        // kludge: browsers do funny things when the scheme but not the
        // authority is set
        if (!$this->may_omit_host &&
            // if the scheme is present, a missing host is always in error
            (!is_null($uri->scheme) && ($uri->host === '' || is_null($uri->host))) ||
            // if the scheme is not present, a *blank* host is in error,
            // since this translates into '///path' which most browsers
            // interpret as being 'http://path'.
            (is_null($uri->scheme) && $uri->host === '')
        ) {
            do {
                if (is_null($uri->scheme)) {
                    if (substr($uri->path, 0, 2) != '//') {
                        $uri->host = null;
                        break;
                    }
                    // URI is '////path', so we cannot nullify the
                    // host to preserve semantics.  Try expanding the
                    // hostname instead (fall through)
                }
                // first see if we can manually insert a hostname
                $host = $config->get('URI.Host');
                if (!is_null($host)) {
                    $uri->host = $host;
                } else {
                    // we can't do anything sensible, reject the URL.
                    return false;
                }
            } while (false);
        }
        return $this->doValidate($uri, $config, $context);
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrValidator.php000064400000014654151214231100016465 0ustar00<?php

/**
 * Validates the attributes of a token. Doesn't manage required attributes
 * very well. The only reason we factored this out was because RemoveForeignElements
 * also needed it besides ValidateAttributes.
 */
class HTMLPurifier_AttrValidator
{

    /**
     * Validates the attributes of a token, mutating it as necessary.
     * that has valid tokens
     * @param HTMLPurifier_Token $token Token to validate.
     * @param HTMLPurifier_Config $config Instance of HTMLPurifier_Config
     * @param HTMLPurifier_Context $context Instance of HTMLPurifier_Context
     */
    public function validateToken($token, $config, $context)
    {
        $definition = $config->getHTMLDefinition();
        $e =& $context->get('ErrorCollector', true);

        // initialize IDAccumulator if necessary
        $ok =& $context->get('IDAccumulator', true);
        if (!$ok) {
            $id_accumulator = HTMLPurifier_IDAccumulator::build($config, $context);
            $context->register('IDAccumulator', $id_accumulator);
        }

        // initialize CurrentToken if necessary
        $current_token =& $context->get('CurrentToken', true);
        if (!$current_token) {
            $context->register('CurrentToken', $token);
        }

        if (!$token instanceof HTMLPurifier_Token_Start &&
            !$token instanceof HTMLPurifier_Token_Empty
        ) {
            return;
        }

        // create alias to global definition array, see also $defs
        // DEFINITION CALL
        $d_defs = $definition->info_global_attr;

        // don't update token until the very end, to ensure an atomic update
        $attr = $token->attr;

        // do global transformations (pre)
        // nothing currently utilizes this
        foreach ($definition->info_attr_transform_pre as $transform) {
            $attr = $transform->transform($o = $attr, $config, $context);
            if ($e) {
                if ($attr != $o) {
                    $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr);
                }
            }
        }

        // do local transformations only applicable to this element (pre)
        // ex. <p align="right"> to <p style="text-align:right;">
        foreach ($definition->info[$token->name]->attr_transform_pre as $transform) {
            $attr = $transform->transform($o = $attr, $config, $context);
            if ($e) {
                if ($attr != $o) {
                    $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr);
                }
            }
        }

        // create alias to this element's attribute definition array, see
        // also $d_defs (global attribute definition array)
        // DEFINITION CALL
        $defs = $definition->info[$token->name]->attr;

        $attr_key = false;
        $context->register('CurrentAttr', $attr_key);

        // iterate through all the attribute keypairs
        // Watch out for name collisions: $key has previously been used
        foreach ($attr as $attr_key => $value) {

            // call the definition
            if (isset($defs[$attr_key])) {
                // there is a local definition defined
                if ($defs[$attr_key] === false) {
                    // We've explicitly been told not to allow this element.
                    // This is usually when there's a global definition
                    // that must be overridden.
                    // Theoretically speaking, we could have a
                    // AttrDef_DenyAll, but this is faster!
                    $result = false;
                } else {
                    // validate according to the element's definition
                    $result = $defs[$attr_key]->validate(
                        $value,
                        $config,
                        $context
                    );
                }
            } elseif (isset($d_defs[$attr_key])) {
                // there is a global definition defined, validate according
                // to the global definition
                $result = $d_defs[$attr_key]->validate(
                    $value,
                    $config,
                    $context
                );
            } else {
                // system never heard of the attribute? DELETE!
                $result = false;
            }

            // put the results into effect
            if ($result === false || $result === null) {
                // this is a generic error message that should replaced
                // with more specific ones when possible
                if ($e) {
                    $e->send(E_ERROR, 'AttrValidator: Attribute removed');
                }

                // remove the attribute
                unset($attr[$attr_key]);
            } elseif (is_string($result)) {
                // generally, if a substitution is happening, there
                // was some sort of implicit correction going on. We'll
                // delegate it to the attribute classes to say exactly what.

                // simple substitution
                $attr[$attr_key] = $result;
            } else {
                // nothing happens
            }

            // we'd also want slightly more complicated substitution
            // involving an array as the return value,
            // although we're not sure how colliding attributes would
            // resolve (certain ones would be completely overriden,
            // others would prepend themselves).
        }

        $context->destroy('CurrentAttr');

        // post transforms

        // global (error reporting untested)
        foreach ($definition->info_attr_transform_post as $transform) {
            $attr = $transform->transform($o = $attr, $config, $context);
            if ($e) {
                if ($attr != $o) {
                    $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr);
                }
            }
        }

        // local (error reporting untested)
        foreach ($definition->info[$token->name]->attr_transform_post as $transform) {
            $attr = $transform->transform($o = $attr, $config, $context);
            if ($e) {
                if ($attr != $o) {
                    $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr);
                }
            }
        }

        $token->attr = $attr;

        // destroy CurrentToken if we made it ourselves
        if (!$current_token) {
            $context->destroy('CurrentToken');
        }

    }


}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Token.php000064400000004261151214231100014756 0ustar00<?php

/**
 * Abstract base token class that all others inherit from.
 */
abstract class HTMLPurifier_Token
{
    /**
     * Line number node was on in source document. Null if unknown.
     * @type int
     */
    public $line;

    /**
     * Column of line node was on in source document. Null if unknown.
     * @type int
     */
    public $col;

    /**
     * Lookup array of processing that this token is exempt from.
     * Currently, valid values are "ValidateAttributes" and
     * "MakeWellFormed_TagClosedError"
     * @type array
     */
    public $armor = array();

    /**
     * Used during MakeWellFormed.  See Note [Injector skips]
     * @type
     */
    public $skip;

    /**
     * @type
     */
    public $rewind;

    /**
     * @type
     */
    public $carryover;

    /**
     * @param string $n
     * @return null|string
     */
    public function __get($n)
    {
        if ($n === 'type') {
            trigger_error('Deprecated type property called; use instanceof', E_USER_NOTICE);
            switch (get_class($this)) {
                case 'HTMLPurifier_Token_Start':
                    return 'start';
                case 'HTMLPurifier_Token_Empty':
                    return 'empty';
                case 'HTMLPurifier_Token_End':
                    return 'end';
                case 'HTMLPurifier_Token_Text':
                    return 'text';
                case 'HTMLPurifier_Token_Comment':
                    return 'comment';
                default:
                    return null;
            }
        }
    }

    /**
     * Sets the position of the token in the source document.
     * @param int $l
     * @param int $c
     */
    public function position($l = null, $c = null)
    {
        $this->line = $l;
        $this->col = $c;
    }

    /**
     * Convenience function for DirectLex settings line/col position.
     * @param int $l
     * @param int $c
     */
    public function rawPosition($l, $c)
    {
        if ($c === -1) {
            $l++;
        }
        $this->line = $l;
        $this->col = $c;
    }

    /**
     * Converts a token into its corresponding node.
     */
    abstract public function toNode();
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/HTMLModule/Target.php000064400000001127151214231100017034 0ustar00<?php

/**
 * XHTML 1.1 Target Module, defines target attribute in link elements.
 */
class HTMLPurifier_HTMLModule_Target extends HTMLPurifier_HTMLModule
{
    /**
     * @type string
     */
    public $name = 'Target';

    /**
     * @param HTMLPurifier_Config $config
     */
    public function setup($config)
    {
        $elements = array('a');
        foreach ($elements as $name) {
            $e = $this->addBlankElement($name);
            $e->attr = array(
                'target' => new HTMLPurifier_AttrDef_HTML_FrameTarget()
            );
        }
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/HTMLModule/Ruby.php000064400000002036151214231100016527 0ustar00<?php

/**
 * XHTML 1.1 Ruby Annotation Module, defines elements that indicate
 * short runs of text alongside base text for annotation or pronounciation.
 */
class HTMLPurifier_HTMLModule_Ruby extends HTMLPurifier_HTMLModule
{

    /**
     * @type string
     */
    public $name = 'Ruby';

    /**
     * @param HTMLPurifier_Config $config
     */
    public function setup($config)
    {
        $this->addElement(
            'ruby',
            'Inline',
            'Custom: ((rb, (rt | (rp, rt, rp))) | (rbc, rtc, rtc?))',
            'Common'
        );
        $this->addElement('rbc', false, 'Required: rb', 'Common');
        $this->addElement('rtc', false, 'Required: rt', 'Common');
        $rb = $this->addElement('rb', false, 'Inline', 'Common');
        $rb->excludes = array('ruby' => true);
        $rt = $this->addElement('rt', false, 'Inline', 'Common', array('rbspan' => 'Number'));
        $rt->excludes = array('ruby' => true);
        $this->addElement('rp', false, 'Optional: #PCDATA', 'Common');
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/HTMLModule/StyleAttribute.php000064400000001414151214231100020571 0ustar00<?php

/**
 * XHTML 1.1 Edit Module, defines editing-related elements. Text Extension
 * Module.
 */
class HTMLPurifier_HTMLModule_StyleAttribute extends HTMLPurifier_HTMLModule
{
    /**
     * @type string
     */
    public $name = 'StyleAttribute';

    /**
     * @type array
     */
    public $attr_collections = array(
        // The inclusion routine differs from the Abstract Modules but
        // is in line with the DTD and XML Schemas.
        'Style' => array('style' => false), // see constructor
        'Core' => array(0 => array('Style'))
    );

    /**
     * @param HTMLPurifier_Config $config
     */
    public function setup($config)
    {
        $this->attr_collections['Style']['style'] = new HTMLPurifier_AttrDef_CSS();
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/HTMLModule/XMLCommonAttributes.php000064400000000540151214231100021464 0ustar00<?php

class HTMLPurifier_HTMLModule_XMLCommonAttributes extends HTMLPurifier_HTMLModule
{
    /**
     * @type string
     */
    public $name = 'XMLCommonAttributes';

    /**
     * @type array
     */
    public $attr_collections = array(
        'Lang' => array(
            'xml:lang' => 'LanguageCode',
        )
    );
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/HTMLModule/Name.php000064400000001235151214231100016466 0ustar00<?php

class HTMLPurifier_HTMLModule_Name extends HTMLPurifier_HTMLModule
{
    /**
     * @type string
     */
    public $name = 'Name';

    /**
     * @param HTMLPurifier_Config $config
     */
    public function setup($config)
    {
        $elements = array('a', 'applet', 'form', 'frame', 'iframe', 'img', 'map');
        foreach ($elements as $name) {
            $element = $this->addBlankElement($name);
            $element->attr['name'] = 'CDATA';
            if (!$config->get('HTML.Attr.Name.UseCDATA')) {
                $element->attr_transform_post[] = new HTMLPurifier_AttrTransform_NameSync();
            }
        }
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/HTMLModule/Iframe.php000064400000002231151214231100017006 0ustar00<?php

/**
 * XHTML 1.1 Iframe Module provides inline frames.
 *
 * @note This module is not considered safe unless an Iframe
 * whitelisting mechanism is specified.  Currently, the only
 * such mechanism is %URL.SafeIframeRegexp
 */
class HTMLPurifier_HTMLModule_Iframe extends HTMLPurifier_HTMLModule
{

    /**
     * @type string
     */
    public $name = 'Iframe';

    /**
     * @type bool
     */
    public $safe = false;

    /**
     * @param HTMLPurifier_Config $config
     */
    public function setup($config)
    {
        if ($config->get('HTML.SafeIframe')) {
            $this->safe = true;
        }
        $this->addElement(
            'iframe',
            'Inline',
            'Flow',
            'Common',
            array(
                'src' => 'URI#embedded',
                'width' => 'Length',
                'height' => 'Length',
                'name' => 'ID',
                'scrolling' => 'Enum#yes,no,auto',
                'frameborder' => 'Enum#0,1',
                'longdesc' => 'URI',
                'marginheight' => 'Pixels',
                'marginwidth' => 'Pixels',
            )
        );
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/HTMLModule/Bdo.php000064400000002004151214231100016305 0ustar00<?php

/**
 * XHTML 1.1 Bi-directional Text Module, defines elements that
 * declare directionality of content. Text Extension Module.
 */
class HTMLPurifier_HTMLModule_Bdo extends HTMLPurifier_HTMLModule
{

    /**
     * @type string
     */
    public $name = 'Bdo';

    /**
     * @type array
     */
    public $attr_collections = array(
        'I18N' => array('dir' => false)
    );

    /**
     * @param HTMLPurifier_Config $config
     */
    public function setup($config)
    {
        $bdo = $this->addElement(
            'bdo',
            'Inline',
            'Inline',
            array('Core', 'Lang'),
            array(
                'dir' => 'Enum#ltr,rtl', // required
                // The Abstract Module specification has the attribute
                // inclusions wrong for bdo: bdo allows Lang
            )
        );
        $bdo->attr_transform_post[] = new HTMLPurifier_AttrTransform_BdoDir();

        $this->attr_collections['I18N']['dir'] = 'Enum#ltr,rtl';
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/HTMLModule/Presentation.php000064400000002607151214231100020265 0ustar00<?php

/**
 * XHTML 1.1 Presentation Module, defines simple presentation-related
 * markup. Text Extension Module.
 * @note The official XML Schema and DTD specs further divide this into
 *       two modules:
 *          - Block Presentation (hr)
 *          - Inline Presentation (b, big, i, small, sub, sup, tt)
 *       We have chosen not to heed this distinction, as content_sets
 *       provides satisfactory disambiguation.
 */
class HTMLPurifier_HTMLModule_Presentation extends HTMLPurifier_HTMLModule
{

    /**
     * @type string
     */
    public $name = 'Presentation';

    /**
     * @param HTMLPurifier_Config $config
     */
    public function setup($config)
    {
        $this->addElement('hr', 'Block', 'Empty', 'Common');
        $this->addElement('sub', 'Inline', 'Inline', 'Common');
        $this->addElement('sup', 'Inline', 'Inline', 'Common');
        $b = $this->addElement('b', 'Inline', 'Inline', 'Common');
        $b->formatting = true;
        $big = $this->addElement('big', 'Inline', 'Inline', 'Common');
        $big->formatting = true;
        $i = $this->addElement('i', 'Inline', 'Inline', 'Common');
        $i->formatting = true;
        $small = $this->addElement('small', 'Inline', 'Inline', 'Common');
        $small->formatting = true;
        $tt = $this->addElement('tt', 'Inline', 'Inline', 'Common');
        $tt->formatting = true;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/HTMLModule/List.php000064400000003565151214231100016531 0ustar00<?php

/**
 * XHTML 1.1 List Module, defines list-oriented elements. Core Module.
 */
class HTMLPurifier_HTMLModule_List extends HTMLPurifier_HTMLModule
{
    /**
     * @type string
     */
    public $name = 'List';

    // According to the abstract schema, the List content set is a fully formed
    // one or more expr, but it invariably occurs in an optional declaration
    // so we're not going to do that subtlety. It might cause trouble
    // if a user defines "List" and expects that multiple lists are
    // allowed to be specified, but then again, that's not very intuitive.
    // Furthermore, the actual XML Schema may disagree. Regardless,
    // we don't have support for such nested expressions without using
    // the incredibly inefficient and draconic Custom ChildDef.

    /**
     * @type array
     */
    public $content_sets = array('Flow' => 'List');

    /**
     * @param HTMLPurifier_Config $config
     */
    public function setup($config)
    {
        $ol = $this->addElement('ol', 'List', new HTMLPurifier_ChildDef_List(), 'Common');
        $ul = $this->addElement('ul', 'List', new HTMLPurifier_ChildDef_List(), 'Common');
        // XXX The wrap attribute is handled by MakeWellFormed.  This is all
        // quite unsatisfactory, because we generated this
        // *specifically* for lists, and now a big chunk of the handling
        // is done properly by the List ChildDef.  So actually, we just
        // want enough information to make autoclosing work properly,
        // and then hand off the tricky stuff to the ChildDef.
        $ol->wrap = 'li';
        $ul->wrap = 'li';
        $this->addElement('dl', 'List', 'Required: dt | dd', 'Common');

        $this->addElement('li', false, 'Flow', 'Common');

        $this->addElement('dd', false, 'Flow', 'Common');
        $this->addElement('dt', false, 'Inline', 'Common');
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/HTMLModule/SafeScripting.php000064400000002357151214231100020355 0ustar00<?php

/**
 * A "safe" script module. No inline JS is allowed, and pointed to JS
 * files must match whitelist.
 */
class HTMLPurifier_HTMLModule_SafeScripting extends HTMLPurifier_HTMLModule
{
    /**
     * @type string
     */
    public $name = 'SafeScripting';

    /**
     * @param HTMLPurifier_Config $config
     */
    public function setup($config)
    {
        // These definitions are not intrinsically safe: the attribute transforms
        // are a vital part of ensuring safety.

        $allowed = $config->get('HTML.SafeScripting');
        $script = $this->addElement(
            'script',
            'Inline',
            'Optional:', // Not `Empty` to not allow to autoclose the <script /> tag @see https://www.w3.org/TR/html4/interact/scripts.html
            null,
            array(
                // While technically not required by the spec, we're forcing
                // it to this value.
                'type' => 'Enum#text/javascript',
                'src*' => new HTMLPurifier_AttrDef_Enum(array_keys($allowed), /*case sensitive*/ true)
            )
        );
        $script->attr_transform_pre[] =
        $script->attr_transform_post[] = new HTMLPurifier_AttrTransform_ScriptRequired();
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/HTMLModule/Legacy.php000064400000013337151214231100017020 0ustar00<?php

/**
 * XHTML 1.1 Legacy module defines elements that were previously
 * deprecated.
 *
 * @note Not all legacy elements have been implemented yet, which
 *       is a bit of a reverse problem as compared to browsers! In
 *       addition, this legacy module may implement a bit more than
 *       mandated by XHTML 1.1.
 *
 * This module can be used in combination with TransformToStrict in order
 * to transform as many deprecated elements as possible, but retain
 * questionably deprecated elements that do not have good alternatives
 * as well as transform elements that don't have an implementation.
 * See docs/ref-strictness.txt for more details.
 */

class HTMLPurifier_HTMLModule_Legacy extends HTMLPurifier_HTMLModule
{
    /**
     * @type string
     */
    public $name = 'Legacy';

    /**
     * @param HTMLPurifier_Config $config
     */
    public function setup($config)
    {
        $this->addElement(
            'basefont',
            'Inline',
            'Empty',
            null,
            array(
                'color' => 'Color',
                'face' => 'Text', // extremely broad, we should
                'size' => 'Text', // tighten it
                'id' => 'ID'
            )
        );
        $this->addElement('center', 'Block', 'Flow', 'Common');
        $this->addElement(
            'dir',
            'Block',
            'Required: li',
            'Common',
            array(
                'compact' => 'Bool#compact'
            )
        );
        $this->addElement(
            'font',
            'Inline',
            'Inline',
            array('Core', 'I18N'),
            array(
                'color' => 'Color',
                'face' => 'Text', // extremely broad, we should
                'size' => 'Text', // tighten it
            )
        );
        $this->addElement(
            'menu',
            'Block',
            'Required: li',
            'Common',
            array(
                'compact' => 'Bool#compact'
            )
        );

        $s = $this->addElement('s', 'Inline', 'Inline', 'Common');
        $s->formatting = true;

        $strike = $this->addElement('strike', 'Inline', 'Inline', 'Common');
        $strike->formatting = true;

        $u = $this->addElement('u', 'Inline', 'Inline', 'Common');
        $u->formatting = true;

        // setup modifications to old elements

        $align = 'Enum#left,right,center,justify';

        $address = $this->addBlankElement('address');
        $address->content_model = 'Inline | #PCDATA | p';
        $address->content_model_type = 'optional';
        $address->child = false;

        $blockquote = $this->addBlankElement('blockquote');
        $blockquote->content_model = 'Flow | #PCDATA';
        $blockquote->content_model_type = 'optional';
        $blockquote->child = false;

        $br = $this->addBlankElement('br');
        $br->attr['clear'] = 'Enum#left,all,right,none';

        $caption = $this->addBlankElement('caption');
        $caption->attr['align'] = 'Enum#top,bottom,left,right';

        $div = $this->addBlankElement('div');
        $div->attr['align'] = $align;

        $dl = $this->addBlankElement('dl');
        $dl->attr['compact'] = 'Bool#compact';

        for ($i = 1; $i <= 6; $i++) {
            $h = $this->addBlankElement("h$i");
            $h->attr['align'] = $align;
        }

        $hr = $this->addBlankElement('hr');
        $hr->attr['align'] = $align;
        $hr->attr['noshade'] = 'Bool#noshade';
        $hr->attr['size'] = 'Pixels';
        $hr->attr['width'] = 'Length';

        $img = $this->addBlankElement('img');
        $img->attr['align'] = 'IAlign';
        $img->attr['border'] = 'Pixels';
        $img->attr['hspace'] = 'Pixels';
        $img->attr['vspace'] = 'Pixels';

        // figure out this integer business

        $li = $this->addBlankElement('li');
        $li->attr['value'] = new HTMLPurifier_AttrDef_Integer();
        $li->attr['type'] = 'Enum#s:1,i,I,a,A,disc,square,circle';

        $ol = $this->addBlankElement('ol');
        $ol->attr['compact'] = 'Bool#compact';
        $ol->attr['start'] = new HTMLPurifier_AttrDef_Integer();
        $ol->attr['type'] = 'Enum#s:1,i,I,a,A';

        $p = $this->addBlankElement('p');
        $p->attr['align'] = $align;

        $pre = $this->addBlankElement('pre');
        $pre->attr['width'] = 'Number';

        // script omitted

        $table = $this->addBlankElement('table');
        $table->attr['align'] = 'Enum#left,center,right';
        $table->attr['bgcolor'] = 'Color';

        $tr = $this->addBlankElement('tr');
        $tr->attr['bgcolor'] = 'Color';

        $th = $this->addBlankElement('th');
        $th->attr['bgcolor'] = 'Color';
        $th->attr['height'] = 'Length';
        $th->attr['nowrap'] = 'Bool#nowrap';
        $th->attr['width'] = 'Length';

        $td = $this->addBlankElement('td');
        $td->attr['bgcolor'] = 'Color';
        $td->attr['height'] = 'Length';
        $td->attr['nowrap'] = 'Bool#nowrap';
        $td->attr['width'] = 'Length';

        $ul = $this->addBlankElement('ul');
        $ul->attr['compact'] = 'Bool#compact';
        $ul->attr['type'] = 'Enum#square,disc,circle';

        // "safe" modifications to "unsafe" elements
        // WARNING: If you want to add support for an unsafe, legacy
        // attribute, make a new TrustedLegacy module with the trusted
        // bit set appropriately

        $form = $this->addBlankElement('form');
        $form->content_model = 'Flow | #PCDATA';
        $form->content_model_type = 'optional';
        $form->attr['target'] = 'FrameTarget';

        $input = $this->addBlankElement('input');
        $input->attr['align'] = 'IAlign';

        $legend = $this->addBlankElement('legend');
        $legend->attr['align'] = 'LAlign';
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/HTMLModule/Tables.php000064400000004460151214231100017023 0ustar00<?php

/**
 * XHTML 1.1 Tables Module, fully defines accessible table elements.
 */
class HTMLPurifier_HTMLModule_Tables extends HTMLPurifier_HTMLModule
{
    /**
     * @type string
     */
    public $name = 'Tables';

    /**
     * @param HTMLPurifier_Config $config
     */
    public function setup($config)
    {
        $this->addElement('caption', false, 'Inline', 'Common');

        $this->addElement(
            'table',
            'Block',
            new HTMLPurifier_ChildDef_Table(),
            'Common',
            array(
                'border' => 'Pixels',
                'cellpadding' => 'Length',
                'cellspacing' => 'Length',
                'frame' => 'Enum#void,above,below,hsides,lhs,rhs,vsides,box,border',
                'rules' => 'Enum#none,groups,rows,cols,all',
                'summary' => 'Text',
                'width' => 'Length'
            )
        );

        // common attributes
        $cell_align = array(
            'align' => 'Enum#left,center,right,justify,char',
            'charoff' => 'Length',
            'valign' => 'Enum#top,middle,bottom,baseline',
        );

        $cell_t = array_merge(
            array(
                'abbr' => 'Text',
                'colspan' => 'Number',
                'rowspan' => 'Number',
                // Apparently, as of HTML5 this attribute only applies
                // to 'th' elements.
                'scope' => 'Enum#row,col,rowgroup,colgroup',
            ),
            $cell_align
        );
        $this->addElement('td', false, 'Flow', 'Common', $cell_t);
        $this->addElement('th', false, 'Flow', 'Common', $cell_t);

        $this->addElement('tr', false, 'Required: td | th', 'Common', $cell_align);

        $cell_col = array_merge(
            array(
                'span' => 'Number',
                'width' => 'MultiLength',
            ),
            $cell_align
        );
        $this->addElement('col', false, 'Empty', 'Common', $cell_col);
        $this->addElement('colgroup', false, 'Optional: col', 'Common', $cell_col);

        $this->addElement('tbody', false, 'Required: tr', 'Common', $cell_align);
        $this->addElement('thead', false, 'Required: tr', 'Common', $cell_align);
        $this->addElement('tfoot', false, 'Required: tr', 'Common', $cell_align);
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php000064400000000542151214231100022141 0ustar00<?php

class HTMLPurifier_HTMLModule_NonXMLCommonAttributes extends HTMLPurifier_HTMLModule
{
    /**
     * @type string
     */
    public $name = 'NonXMLCommonAttributes';

    /**
     * @type array
     */
    public $attr_collections = array(
        'Lang' => array(
            'lang' => 'LanguageCode',
        )
    );
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/HTMLModule/Edit.php000064400000002632151214231100016475 0ustar00<?php

/**
 * XHTML 1.1 Edit Module, defines editing-related elements. Text Extension
 * Module.
 */
class HTMLPurifier_HTMLModule_Edit extends HTMLPurifier_HTMLModule
{

    /**
     * @type string
     */
    public $name = 'Edit';

    /**
     * @param HTMLPurifier_Config $config
     */
    public function setup($config)
    {
        $contents = 'Chameleon: #PCDATA | Inline ! #PCDATA | Flow';
        $attr = array(
            'cite' => 'URI',
            // 'datetime' => 'Datetime', // not implemented
        );
        $this->addElement('del', 'Inline', $contents, 'Common', $attr);
        $this->addElement('ins', 'Inline', $contents, 'Common', $attr);
    }

    // HTML 4.01 specifies that ins/del must not contain block
    // elements when used in an inline context, chameleon is
    // a complicated workaround to acheive this effect

    // Inline context ! Block context (exclamation mark is
    // separator, see getChildDef for parsing)

    /**
     * @type bool
     */
    public $defines_child_def = true;

    /**
     * @param HTMLPurifier_ElementDef $def
     * @return HTMLPurifier_ChildDef_Chameleon
     */
    public function getChildDef($def)
    {
        if ($def->content_model_type != 'chameleon') {
            return false;
        }
        $value = explode('!', $def->content_model);
        return new HTMLPurifier_ChildDef_Chameleon($value[0], $value[1]);
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/HTMLModule/SafeEmbed.php000064400000002111151214231100017413 0ustar00<?php

/**
 * A "safe" embed module. See SafeObject. This is a proprietary element.
 */
class HTMLPurifier_HTMLModule_SafeEmbed extends HTMLPurifier_HTMLModule
{
    /**
     * @type string
     */
    public $name = 'SafeEmbed';

    /**
     * @param HTMLPurifier_Config $config
     */
    public function setup($config)
    {
        $max = $config->get('HTML.MaxImgLength');
        $embed = $this->addElement(
            'embed',
            'Inline',
            'Empty',
            'Common',
            array(
                'src*' => 'URI#embedded',
                'type' => 'Enum#application/x-shockwave-flash',
                'width' => 'Pixels#' . $max,
                'height' => 'Pixels#' . $max,
                'allowscriptaccess' => 'Enum#never',
                'allownetworking' => 'Enum#internal',
                'flashvars' => 'Text',
                'wmode' => 'Enum#window,transparent,opaque',
                'name' => 'ID',
            )
        );
        $embed->attr_transform_post[] = new HTMLPurifier_AttrTransform_SafeEmbed();
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Transitional.php000064400000000432151214231100021164 0ustar00<?php

class HTMLPurifier_HTMLModule_Tidy_Transitional extends HTMLPurifier_HTMLModule_Tidy_XHTMLAndHTML4
{
    /**
     * @type string
     */
    public $name = 'Tidy_Transitional';

    /**
     * @type string
     */
    public $defaultLevel = 'heavy';
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Strict.php000064400000001612151214231100017766 0ustar00<?php

class HTMLPurifier_HTMLModule_Tidy_Strict extends HTMLPurifier_HTMLModule_Tidy_XHTMLAndHTML4
{
    /**
     * @type string
     */
    public $name = 'Tidy_Strict';

    /**
     * @type string
     */
    public $defaultLevel = 'light';

    /**
     * @return array
     */
    public function makeFixes()
    {
        $r = parent::makeFixes();
        $r['blockquote#content_model_type'] = 'strictblockquote';
        return $r;
    }

    /**
     * @type bool
     */
    public $defines_child_def = true;

    /**
     * @param HTMLPurifier_ElementDef $def
     * @return HTMLPurifier_ChildDef_StrictBlockquote
     */
    public function getChildDef($def)
    {
        if ($def->content_model_type != 'strictblockquote') {
            return parent::getChildDef($def);
        }
        return new HTMLPurifier_ChildDef_StrictBlockquote($def->content_model);
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Name.php000064400000001365151214231100017403 0ustar00<?php

/**
 * Name is deprecated, but allowed in strict doctypes, so onl
 */
class HTMLPurifier_HTMLModule_Tidy_Name extends HTMLPurifier_HTMLModule_Tidy
{
    /**
     * @type string
     */
    public $name = 'Tidy_Name';

    /**
     * @type string
     */
    public $defaultLevel = 'heavy';

    /**
     * @return array
     */
    public function makeFixes()
    {
        $r = array();
        // @name for img, a -----------------------------------------------
        // Technically, it's allowed even on strict, so we allow authors to use
        // it. However, it's deprecated in future versions of XHTML.
        $r['img@name'] =
        $r['a@name'] = new HTMLPurifier_AttrTransform_Name();
        return $r;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php000064400000015667151214231100020625 0ustar00<?php

class HTMLPurifier_HTMLModule_Tidy_XHTMLAndHTML4 extends HTMLPurifier_HTMLModule_Tidy
{

    /**
     * @return array
     */
    public function makeFixes()
    {
        $r = array();

        // == deprecated tag transforms ===================================

        $r['font'] = new HTMLPurifier_TagTransform_Font();
        $r['menu'] = new HTMLPurifier_TagTransform_Simple('ul');
        $r['dir'] = new HTMLPurifier_TagTransform_Simple('ul');
        $r['center'] = new HTMLPurifier_TagTransform_Simple('div', 'text-align:center;');
        $r['u'] = new HTMLPurifier_TagTransform_Simple('span', 'text-decoration:underline;');
        $r['s'] = new HTMLPurifier_TagTransform_Simple('span', 'text-decoration:line-through;');
        $r['strike'] = new HTMLPurifier_TagTransform_Simple('span', 'text-decoration:line-through;');

        // == deprecated attribute transforms =============================

        $r['caption@align'] =
            new HTMLPurifier_AttrTransform_EnumToCSS(
                'align',
                array(
                    // we're following IE's behavior, not Firefox's, due
                    // to the fact that no one supports caption-side:right,
                    // W3C included (with CSS 2.1). This is a slightly
                    // unreasonable attribute!
                    'left' => 'text-align:left;',
                    'right' => 'text-align:right;',
                    'top' => 'caption-side:top;',
                    'bottom' => 'caption-side:bottom;' // not supported by IE
                )
            );

        // @align for img -------------------------------------------------
        $r['img@align'] =
            new HTMLPurifier_AttrTransform_EnumToCSS(
                'align',
                array(
                    'left' => 'float:left;',
                    'right' => 'float:right;',
                    'top' => 'vertical-align:top;',
                    'middle' => 'vertical-align:middle;',
                    'bottom' => 'vertical-align:baseline;',
                )
            );

        // @align for table -----------------------------------------------
        $r['table@align'] =
            new HTMLPurifier_AttrTransform_EnumToCSS(
                'align',
                array(
                    'left' => 'float:left;',
                    'center' => 'margin-left:auto;margin-right:auto;',
                    'right' => 'float:right;'
                )
            );

        // @align for hr -----------------------------------------------
        $r['hr@align'] =
            new HTMLPurifier_AttrTransform_EnumToCSS(
                'align',
                array(
                    // we use both text-align and margin because these work
                    // for different browsers (IE and Firefox, respectively)
                    // and the melange makes for a pretty cross-compatible
                    // solution
                    'left' => 'margin-left:0;margin-right:auto;text-align:left;',
                    'center' => 'margin-left:auto;margin-right:auto;text-align:center;',
                    'right' => 'margin-left:auto;margin-right:0;text-align:right;'
                )
            );

        // @align for h1, h2, h3, h4, h5, h6, p, div ----------------------
        // {{{
        $align_lookup = array();
        $align_values = array('left', 'right', 'center', 'justify');
        foreach ($align_values as $v) {
            $align_lookup[$v] = "text-align:$v;";
        }
        // }}}
        $r['h1@align'] =
        $r['h2@align'] =
        $r['h3@align'] =
        $r['h4@align'] =
        $r['h5@align'] =
        $r['h6@align'] =
        $r['p@align'] =
        $r['div@align'] =
            new HTMLPurifier_AttrTransform_EnumToCSS('align', $align_lookup);

        // @bgcolor for table, tr, td, th ---------------------------------
        $r['table@bgcolor'] =
        $r['tr@bgcolor'] =
        $r['td@bgcolor'] =
        $r['th@bgcolor'] =
            new HTMLPurifier_AttrTransform_BgColor();

        // @border for img ------------------------------------------------
        $r['img@border'] = new HTMLPurifier_AttrTransform_Border();

        // @clear for br --------------------------------------------------
        $r['br@clear'] =
            new HTMLPurifier_AttrTransform_EnumToCSS(
                'clear',
                array(
                    'left' => 'clear:left;',
                    'right' => 'clear:right;',
                    'all' => 'clear:both;',
                    'none' => 'clear:none;',
                )
            );

        // @height for td, th ---------------------------------------------
        $r['td@height'] =
        $r['th@height'] =
            new HTMLPurifier_AttrTransform_Length('height');

        // @hspace for img ------------------------------------------------
        $r['img@hspace'] = new HTMLPurifier_AttrTransform_ImgSpace('hspace');

        // @noshade for hr ------------------------------------------------
        // this transformation is not precise but often good enough.
        // different browsers use different styles to designate noshade
        $r['hr@noshade'] =
            new HTMLPurifier_AttrTransform_BoolToCSS(
                'noshade',
                'color:#808080;background-color:#808080;border:0;'
            );

        // @nowrap for td, th ---------------------------------------------
        $r['td@nowrap'] =
        $r['th@nowrap'] =
            new HTMLPurifier_AttrTransform_BoolToCSS(
                'nowrap',
                'white-space:nowrap;'
            );

        // @size for hr  --------------------------------------------------
        $r['hr@size'] = new HTMLPurifier_AttrTransform_Length('size', 'height');

        // @type for li, ol, ul -------------------------------------------
        // {{{
        $ul_types = array(
            'disc' => 'list-style-type:disc;',
            'square' => 'list-style-type:square;',
            'circle' => 'list-style-type:circle;'
        );
        $ol_types = array(
            '1' => 'list-style-type:decimal;',
            'i' => 'list-style-type:lower-roman;',
            'I' => 'list-style-type:upper-roman;',
            'a' => 'list-style-type:lower-alpha;',
            'A' => 'list-style-type:upper-alpha;'
        );
        $li_types = $ul_types + $ol_types;
        // }}}

        $r['ul@type'] = new HTMLPurifier_AttrTransform_EnumToCSS('type', $ul_types);
        $r['ol@type'] = new HTMLPurifier_AttrTransform_EnumToCSS('type', $ol_types, true);
        $r['li@type'] = new HTMLPurifier_AttrTransform_EnumToCSS('type', $li_types, true);

        // @vspace for img ------------------------------------------------
        $r['img@vspace'] = new HTMLPurifier_AttrTransform_ImgSpace('vspace');

        // @width for hr, td, th ------------------------------------------
        $r['td@width'] =
        $r['th@width'] =
        $r['hr@width'] = new HTMLPurifier_AttrTransform_Length('width');

        return $r;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTML.php000064400000000667151214231100017423 0ustar00<?php

class HTMLPurifier_HTMLModule_Tidy_XHTML extends HTMLPurifier_HTMLModule_Tidy
{
    /**
     * @type string
     */
    public $name = 'Tidy_XHTML';

    /**
     * @type string
     */
    public $defaultLevel = 'medium';

    /**
     * @return array
     */
    public function makeFixes()
    {
        $r = array();
        $r['@lang'] = new HTMLPurifier_AttrTransform_Lang();
        return $r;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Proprietary.php000064400000001772151214231100021045 0ustar00<?php

class HTMLPurifier_HTMLModule_Tidy_Proprietary extends HTMLPurifier_HTMLModule_Tidy
{

    /**
     * @type string
     */
    public $name = 'Tidy_Proprietary';

    /**
     * @type string
     */
    public $defaultLevel = 'light';

    /**
     * @return array
     */
    public function makeFixes()
    {
        $r = array();
        $r['table@background'] = new HTMLPurifier_AttrTransform_Background();
        $r['td@background']    = new HTMLPurifier_AttrTransform_Background();
        $r['th@background']    = new HTMLPurifier_AttrTransform_Background();
        $r['tr@background']    = new HTMLPurifier_AttrTransform_Background();
        $r['thead@background'] = new HTMLPurifier_AttrTransform_Background();
        $r['tfoot@background'] = new HTMLPurifier_AttrTransform_Background();
        $r['tbody@background'] = new HTMLPurifier_AttrTransform_Background();
        $r['table@height']     = new HTMLPurifier_AttrTransform_Length('height');
        return $r;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/HTMLModule/Image.php000064400000002554151214231100016635 0ustar00<?php

/**
 * XHTML 1.1 Image Module provides basic image embedding.
 * @note There is specialized code for removing empty images in
 *       HTMLPurifier_Strategy_RemoveForeignElements
 */
class HTMLPurifier_HTMLModule_Image extends HTMLPurifier_HTMLModule
{

    /**
     * @type string
     */
    public $name = 'Image';

    /**
     * @param HTMLPurifier_Config $config
     */
    public function setup($config)
    {
        $max = $config->get('HTML.MaxImgLength');
        $img = $this->addElement(
            'img',
            'Inline',
            'Empty',
            'Common',
            array(
                'alt*' => 'Text',
                // According to the spec, it's Length, but percents can
                // be abused, so we allow only Pixels.
                'height' => 'Pixels#' . $max,
                'width' => 'Pixels#' . $max,
                'longdesc' => 'URI',
                'src*' => new HTMLPurifier_AttrDef_URI(true), // embedded
            )
        );
        if ($max === null || $config->get('HTML.Trusted')) {
            $img->attr['height'] =
            $img->attr['width'] = 'Length';
        }

        // kind of strange, but splitting things up would be inefficient
        $img->attr_transform_pre[] =
        $img->attr_transform_post[] =
            new HTMLPurifier_AttrTransform_ImgRequired();
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/HTMLModule/Hypertext.php000064400000001744151214231100017607 0ustar00<?php

/**
 * XHTML 1.1 Hypertext Module, defines hypertext links. Core Module.
 */
class HTMLPurifier_HTMLModule_Hypertext extends HTMLPurifier_HTMLModule
{

    /**
     * @type string
     */
    public $name = 'Hypertext';

    /**
     * @param HTMLPurifier_Config $config
     */
    public function setup($config)
    {
        $a = $this->addElement(
            'a',
            'Inline',
            'Inline',
            'Common',
            array(
                // 'accesskey' => 'Character',
                // 'charset' => 'Charset',
                'href' => 'URI',
                // 'hreflang' => 'LanguageCode',
                'rel' => new HTMLPurifier_AttrDef_HTML_LinkTypes('rel'),
                'rev' => new HTMLPurifier_AttrDef_HTML_LinkTypes('rev'),
                // 'tabindex' => 'Number',
                // 'type' => 'ContentType',
            )
        );
        $a->formatting = true;
        $a->excludes = array('a' => true);
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy.php000064400000016324151214231100016524 0ustar00<?php

/**
 * Abstract class for a set of proprietary modules that clean up (tidy)
 * poorly written HTML.
 * @todo Figure out how to protect some of these methods/properties
 */
class HTMLPurifier_HTMLModule_Tidy extends HTMLPurifier_HTMLModule
{
    /**
     * List of supported levels.
     * Index zero is a special case "no fixes" level.
     * @type array
     */
    public $levels = array(0 => 'none', 'light', 'medium', 'heavy');

    /**
     * Default level to place all fixes in.
     * Disabled by default.
     * @type string
     */
    public $defaultLevel = null;

    /**
     * Lists of fixes used by getFixesForLevel().
     * Format is:
     *      HTMLModule_Tidy->fixesForLevel[$level] = array('fix-1', 'fix-2');
     * @type array
     */
    public $fixesForLevel = array(
        'light' => array(),
        'medium' => array(),
        'heavy' => array()
    );

    /**
     * Lazy load constructs the module by determining the necessary
     * fixes to create and then delegating to the populate() function.
     * @param HTMLPurifier_Config $config
     * @todo Wildcard matching and error reporting when an added or
     *       subtracted fix has no effect.
     */
    public function setup($config)
    {
        // create fixes, initialize fixesForLevel
        $fixes = $this->makeFixes();
        $this->makeFixesForLevel($fixes);

        // figure out which fixes to use
        $level = $config->get('HTML.TidyLevel');
        $fixes_lookup = $this->getFixesForLevel($level);

        // get custom fix declarations: these need namespace processing
        $add_fixes = $config->get('HTML.TidyAdd');
        $remove_fixes = $config->get('HTML.TidyRemove');

        foreach ($fixes as $name => $fix) {
            // needs to be refactored a little to implement globbing
            if (isset($remove_fixes[$name]) ||
                (!isset($add_fixes[$name]) && !isset($fixes_lookup[$name]))) {
                unset($fixes[$name]);
            }
        }

        // populate this module with necessary fixes
        $this->populate($fixes);
    }

    /**
     * Retrieves all fixes per a level, returning fixes for that specific
     * level as well as all levels below it.
     * @param string $level level identifier, see $levels for valid values
     * @return array Lookup up table of fixes
     */
    public function getFixesForLevel($level)
    {
        if ($level == $this->levels[0]) {
            return array();
        }
        $activated_levels = array();
        for ($i = 1, $c = count($this->levels); $i < $c; $i++) {
            $activated_levels[] = $this->levels[$i];
            if ($this->levels[$i] == $level) {
                break;
            }
        }
        if ($i == $c) {
            trigger_error(
                'Tidy level ' . htmlspecialchars($level) . ' not recognized',
                E_USER_WARNING
            );
            return array();
        }
        $ret = array();
        foreach ($activated_levels as $level) {
            foreach ($this->fixesForLevel[$level] as $fix) {
                $ret[$fix] = true;
            }
        }
        return $ret;
    }

    /**
     * Dynamically populates the $fixesForLevel member variable using
     * the fixes array. It may be custom overloaded, used in conjunction
     * with $defaultLevel, or not used at all.
     * @param array $fixes
     */
    public function makeFixesForLevel($fixes)
    {
        if (!isset($this->defaultLevel)) {
            return;
        }
        if (!isset($this->fixesForLevel[$this->defaultLevel])) {
            trigger_error(
                'Default level ' . $this->defaultLevel . ' does not exist',
                E_USER_ERROR
            );
            return;
        }
        $this->fixesForLevel[$this->defaultLevel] = array_keys($fixes);
    }

    /**
     * Populates the module with transforms and other special-case code
     * based on a list of fixes passed to it
     * @param array $fixes Lookup table of fixes to activate
     */
    public function populate($fixes)
    {
        foreach ($fixes as $name => $fix) {
            // determine what the fix is for
            list($type, $params) = $this->getFixType($name);
            switch ($type) {
                case 'attr_transform_pre':
                case 'attr_transform_post':
                    $attr = $params['attr'];
                    if (isset($params['element'])) {
                        $element = $params['element'];
                        if (empty($this->info[$element])) {
                            $e = $this->addBlankElement($element);
                        } else {
                            $e = $this->info[$element];
                        }
                    } else {
                        $type = "info_$type";
                        $e = $this;
                    }
                    // PHP does some weird parsing when I do
                    // $e->$type[$attr], so I have to assign a ref.
                    $f =& $e->$type;
                    $f[$attr] = $fix;
                    break;
                case 'tag_transform':
                    $this->info_tag_transform[$params['element']] = $fix;
                    break;
                case 'child':
                case 'content_model_type':
                    $element = $params['element'];
                    if (empty($this->info[$element])) {
                        $e = $this->addBlankElement($element);
                    } else {
                        $e = $this->info[$element];
                    }
                    $e->$type = $fix;
                    break;
                default:
                    trigger_error("Fix type $type not supported", E_USER_ERROR);
                    break;
            }
        }
    }

    /**
     * Parses a fix name and determines what kind of fix it is, as well
     * as other information defined by the fix
     * @param $name String name of fix
     * @return array(string $fix_type, array $fix_parameters)
     * @note $fix_parameters is type dependant, see populate() for usage
     *       of these parameters
     */
    public function getFixType($name)
    {
        // parse it
        $property = $attr = null;
        if (strpos($name, '#') !== false) {
            list($name, $property) = explode('#', $name);
        }
        if (strpos($name, '@') !== false) {
            list($name, $attr) = explode('@', $name);
        }

        // figure out the parameters
        $params = array();
        if ($name !== '') {
            $params['element'] = $name;
        }
        if (!is_null($attr)) {
            $params['attr'] = $attr;
        }

        // special case: attribute transform
        if (!is_null($attr)) {
            if (is_null($property)) {
                $property = 'pre';
            }
            $type = 'attr_transform_' . $property;
            return array($type, $params);
        }

        // special case: tag transform
        if (is_null($property)) {
            return array('tag_transform', $params);
        }

        return array($property, $params);

    }

    /**
     * Defines all fixes the module will perform in a compact
     * associative array of fix name to fix implementation.
     * @return array
     */
    public function makeFixes()
    {
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/HTMLModule/TargetNoreferrer.php000064400000001016151214231100021063 0ustar00<?php

/**
 * Module adds the target-based noreferrer attribute transformation to a tags.  It
 * is enabled by HTML.TargetNoreferrer
 */
class HTMLPurifier_HTMLModule_TargetNoreferrer extends HTMLPurifier_HTMLModule
{
    /**
     * @type string
     */
    public $name = 'TargetNoreferrer';

    /**
     * @param HTMLPurifier_Config $config
     */
    public function setup($config) {
        $a = $this->addBlankElement('a');
        $a->attr_transform_post[] = new HTMLPurifier_AttrTransform_TargetNoreferrer();
    }
}
htmlpurifier/library/HTMLPurifier/HTMLModule/TargetNoopener.php000064400000001004151214231100020534 0ustar00<?php

/**
 * Module adds the target-based noopener attribute transformation to a tags.  It
 * is enabled by HTML.TargetNoopener
 */
class HTMLPurifier_HTMLModule_TargetNoopener extends HTMLPurifier_HTMLModule
{
    /**
     * @type string
     */
    public $name = 'TargetNoopener';

    /**
     * @param HTMLPurifier_Config $config
     */
    public function setup($config) {
        $a = $this->addBlankElement('a');
        $a->attr_transform_post[] = new HTMLPurifier_AttrTransform_TargetNoopener();
    }
}
htmlpurifier/library/HTMLPurifier/HTMLModule/CommonAttributes.php000064400000001236151214231100021106 0ustar00<?php

class HTMLPurifier_HTMLModule_CommonAttributes extends HTMLPurifier_HTMLModule
{
    /**
     * @type string
     */
    public $name = 'CommonAttributes';

    /**
     * @type array
     */
    public $attr_collections = array(
        'Core' => array(
            0 => array('Style'),
            // 'xml:space' => false,
            'class' => 'Class',
            'id' => 'ID',
            'title' => 'CDATA',
        ),
        'Lang' => array(),
        'I18N' => array(
            0 => array('Lang'), // proprietary, for xml:lang/lang
        ),
        'Common' => array(
            0 => array('Core', 'I18N')
        )
    );
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/HTMLModule/SafeObject.php000064400000003633151214231100017617 0ustar00<?php

/**
 * A "safe" object module. In theory, objects permitted by this module will
 * be safe, and untrusted users can be allowed to embed arbitrary flash objects
 * (maybe other types too, but only Flash is supported as of right now).
 * Highly experimental.
 */
class HTMLPurifier_HTMLModule_SafeObject extends HTMLPurifier_HTMLModule
{
    /**
     * @type string
     */
    public $name = 'SafeObject';

    /**
     * @param HTMLPurifier_Config $config
     */
    public function setup($config)
    {
        // These definitions are not intrinsically safe: the attribute transforms
        // are a vital part of ensuring safety.

        $max = $config->get('HTML.MaxImgLength');
        $object = $this->addElement(
            'object',
            'Inline',
            'Optional: param | Flow | #PCDATA',
            'Common',
            array(
                // While technically not required by the spec, we're forcing
                // it to this value.
                'type' => 'Enum#application/x-shockwave-flash',
                'width' => 'Pixels#' . $max,
                'height' => 'Pixels#' . $max,
                'data' => 'URI#embedded',
                'codebase' => new HTMLPurifier_AttrDef_Enum(
                    array(
                        'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0'
                    )
                ),
            )
        );
        $object->attr_transform_post[] = new HTMLPurifier_AttrTransform_SafeObject();

        $param = $this->addElement(
            'param',
            false,
            'Empty',
            false,
            array(
                'id' => 'ID',
                'name*' => 'Text',
                'value' => 'Text'
            )
        );
        $param->attr_transform_post[] = new HTMLPurifier_AttrTransform_SafeParam();
        $this->info_injector[] = 'SafeObject';
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/HTMLModule/Scripting.php000064400000004441151214231100017552 0ustar00<?php

/*

WARNING: THIS MODULE IS EXTREMELY DANGEROUS AS IT ENABLES INLINE SCRIPTING
INSIDE HTML PURIFIER DOCUMENTS. USE ONLY WITH TRUSTED USER INPUT!!!

*/

/**
 * XHTML 1.1 Scripting module, defines elements that are used to contain
 * information pertaining to executable scripts or the lack of support
 * for executable scripts.
 * @note This module does not contain inline scripting elements
 */
class HTMLPurifier_HTMLModule_Scripting extends HTMLPurifier_HTMLModule
{
    /**
     * @type string
     */
    public $name = 'Scripting';

    /**
     * @type array
     */
    public $elements = array('script', 'noscript');

    /**
     * @type array
     */
    public $content_sets = array('Block' => 'script | noscript', 'Inline' => 'script | noscript');

    /**
     * @type bool
     */
    public $safe = false;

    /**
     * @param HTMLPurifier_Config $config
     */
    public function setup($config)
    {
        // TODO: create custom child-definition for noscript that
        // auto-wraps stray #PCDATA in a similar manner to
        // blockquote's custom definition (we would use it but
        // blockquote's contents are optional while noscript's contents
        // are required)

        // TODO: convert this to new syntax, main problem is getting
        // both content sets working

        // In theory, this could be safe, but I don't see any reason to
        // allow it.
        $this->info['noscript'] = new HTMLPurifier_ElementDef();
        $this->info['noscript']->attr = array(0 => array('Common'));
        $this->info['noscript']->content_model = 'Heading | List | Block';
        $this->info['noscript']->content_model_type = 'required';

        $this->info['script'] = new HTMLPurifier_ElementDef();
        $this->info['script']->attr = array(
            'defer' => new HTMLPurifier_AttrDef_Enum(array('defer')),
            'src' => new HTMLPurifier_AttrDef_URI(true),
            'type' => new HTMLPurifier_AttrDef_Enum(array('text/javascript'))
        );
        $this->info['script']->content_model = '#PCDATA';
        $this->info['script']->content_model_type = 'optional';
        $this->info['script']->attr_transform_pre[] =
        $this->info['script']->attr_transform_post[] =
            new HTMLPurifier_AttrTransform_ScriptRequired();
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/HTMLModule/Proprietary.php000064400000001743151214231100020132 0ustar00<?php

/**
 * Module defines proprietary tags and attributes in HTML.
 * @warning If this module is enabled, standards-compliance is off!
 */
class HTMLPurifier_HTMLModule_Proprietary extends HTMLPurifier_HTMLModule
{
    /**
     * @type string
     */
    public $name = 'Proprietary';

    /**
     * @param HTMLPurifier_Config $config
     */
    public function setup($config)
    {
        $this->addElement(
            'marquee',
            'Inline',
            'Flow',
            'Common',
            array(
                'direction' => 'Enum#left,right,up,down',
                'behavior' => 'Enum#alternate',
                'width' => 'Length',
                'height' => 'Length',
                'scrolldelay' => 'Number',
                'scrollamount' => 'Number',
                'loop' => 'Number',
                'bgcolor' => 'Color',
                'hspace' => 'Pixels',
                'vspace' => 'Pixels',
            )
        );
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/HTMLModule/Text.php000064400000006553151214231100016542 0ustar00<?php

/**
 * XHTML 1.1 Text Module, defines basic text containers. Core Module.
 * @note In the normative XML Schema specification, this module
 *       is further abstracted into the following modules:
 *          - Block Phrasal (address, blockquote, pre, h1, h2, h3, h4, h5, h6)
 *          - Block Structural (div, p)
 *          - Inline Phrasal (abbr, acronym, cite, code, dfn, em, kbd, q, samp, strong, var)
 *          - Inline Structural (br, span)
 *       This module, functionally, does not distinguish between these
 *       sub-modules, but the code is internally structured to reflect
 *       these distinctions.
 */
class HTMLPurifier_HTMLModule_Text extends HTMLPurifier_HTMLModule
{
    /**
     * @type string
     */
    public $name = 'Text';

    /**
     * @type array
     */
    public $content_sets = array(
        'Flow' => 'Heading | Block | Inline'
    );

    /**
     * @param HTMLPurifier_Config $config
     */
    public function setup($config)
    {
        // Inline Phrasal -------------------------------------------------
        $this->addElement('abbr', 'Inline', 'Inline', 'Common');
        $this->addElement('acronym', 'Inline', 'Inline', 'Common');
        $this->addElement('cite', 'Inline', 'Inline', 'Common');
        $this->addElement('dfn', 'Inline', 'Inline', 'Common');
        $this->addElement('kbd', 'Inline', 'Inline', 'Common');
        $this->addElement('q', 'Inline', 'Inline', 'Common', array('cite' => 'URI'));
        $this->addElement('samp', 'Inline', 'Inline', 'Common');
        $this->addElement('var', 'Inline', 'Inline', 'Common');

        $em = $this->addElement('em', 'Inline', 'Inline', 'Common');
        $em->formatting = true;

        $strong = $this->addElement('strong', 'Inline', 'Inline', 'Common');
        $strong->formatting = true;

        $code = $this->addElement('code', 'Inline', 'Inline', 'Common');
        $code->formatting = true;

        // Inline Structural ----------------------------------------------
        $this->addElement('span', 'Inline', 'Inline', 'Common');
        $this->addElement('br', 'Inline', 'Empty', 'Core');

        // Block Phrasal --------------------------------------------------
        $this->addElement('address', 'Block', 'Inline', 'Common');
        $this->addElement('blockquote', 'Block', 'Optional: Heading | Block | List', 'Common', array('cite' => 'URI'));
        $pre = $this->addElement('pre', 'Block', 'Inline', 'Common');
        $pre->excludes = $this->makeLookup(
            'img',
            'big',
            'small',
            'object',
            'applet',
            'font',
            'basefont'
        );
        $this->addElement('h1', 'Heading', 'Inline', 'Common');
        $this->addElement('h2', 'Heading', 'Inline', 'Common');
        $this->addElement('h3', 'Heading', 'Inline', 'Common');
        $this->addElement('h4', 'Heading', 'Inline', 'Common');
        $this->addElement('h5', 'Heading', 'Inline', 'Common');
        $this->addElement('h6', 'Heading', 'Inline', 'Common');

        // Block Structural -----------------------------------------------
        $p = $this->addElement('p', 'Block', 'Inline', 'Common');
        $p->autoclose = array_flip(
            array("address", "blockquote", "center", "dir", "div", "dl", "fieldset", "ol", "p", "ul")
        );

        $this->addElement('div', 'Block', 'Flow', 'Common');
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/HTMLModule/Object.php000064400000002763151214231100017023 0ustar00<?php

/**
 * XHTML 1.1 Object Module, defines elements for generic object inclusion
 * @warning Users will commonly use <embed> to cater to legacy browsers: this
 *      module does not allow this sort of behavior
 */
class HTMLPurifier_HTMLModule_Object extends HTMLPurifier_HTMLModule
{
    /**
     * @type string
     */
    public $name = 'Object';

    /**
     * @type bool
     */
    public $safe = false;

    /**
     * @param HTMLPurifier_Config $config
     */
    public function setup($config)
    {
        $this->addElement(
            'object',
            'Inline',
            'Optional: #PCDATA | Flow | param',
            'Common',
            array(
                'archive' => 'URI',
                'classid' => 'URI',
                'codebase' => 'URI',
                'codetype' => 'Text',
                'data' => 'URI',
                'declare' => 'Bool#declare',
                'height' => 'Length',
                'name' => 'CDATA',
                'standby' => 'Text',
                'tabindex' => 'Number',
                'type' => 'ContentType',
                'width' => 'Length'
            )
        );

        $this->addElement(
            'param',
            false,
            'Empty',
            null,
            array(
                'id' => 'ID',
                'name*' => 'Text',
                'type' => 'Text',
                'value' => 'Text',
                'valuetype' => 'Enum#data,ref,object'
            )
        );
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/HTMLModule/Forms.php000064400000013314151214231100016675 0ustar00<?php

/**
 * XHTML 1.1 Forms module, defines all form-related elements found in HTML 4.
 */
class HTMLPurifier_HTMLModule_Forms extends HTMLPurifier_HTMLModule
{
    /**
     * @type string
     */
    public $name = 'Forms';

    /**
     * @type bool
     */
    public $safe = false;

    /**
     * @type array
     */
    public $content_sets = array(
        'Block' => 'Form',
        'Inline' => 'Formctrl',
    );

    /**
     * @param HTMLPurifier_Config $config
     */
    public function setup($config)
    {
        if ($config->get('HTML.Forms')) {
            $this->safe = true;
        }

        $form = $this->addElement(
            'form',
            'Form',
            'Required: Heading | List | Block | fieldset',
            'Common',
            array(
                'accept' => 'ContentTypes',
                'accept-charset' => 'Charsets',
                'action*' => 'URI',
                'method' => 'Enum#get,post',
                // really ContentType, but these two are the only ones used today
                'enctype' => 'Enum#application/x-www-form-urlencoded,multipart/form-data',
            )
        );
        $form->excludes = array('form' => true);

        $input = $this->addElement(
            'input',
            'Formctrl',
            'Empty',
            'Common',
            array(
                'accept' => 'ContentTypes',
                'accesskey' => 'Character',
                'alt' => 'Text',
                'checked' => 'Bool#checked',
                'disabled' => 'Bool#disabled',
                'maxlength' => 'Number',
                'name' => 'CDATA',
                'readonly' => 'Bool#readonly',
                'size' => 'Number',
                'src' => 'URI#embedded',
                'tabindex' => 'Number',
                'type' => 'Enum#text,password,checkbox,button,radio,submit,reset,file,hidden,image',
                'value' => 'CDATA',
            )
        );
        $input->attr_transform_post[] = new HTMLPurifier_AttrTransform_Input();

        $this->addElement(
            'select',
            'Formctrl',
            'Required: optgroup | option',
            'Common',
            array(
                'disabled' => 'Bool#disabled',
                'multiple' => 'Bool#multiple',
                'name' => 'CDATA',
                'size' => 'Number',
                'tabindex' => 'Number',
            )
        );

        $this->addElement(
            'option',
            false,
            'Optional: #PCDATA',
            'Common',
            array(
                'disabled' => 'Bool#disabled',
                'label' => 'Text',
                'selected' => 'Bool#selected',
                'value' => 'CDATA',
            )
        );
        // It's illegal for there to be more than one selected, but not
        // be multiple. Also, no selected means undefined behavior. This might
        // be difficult to implement; perhaps an injector, or a context variable.

        $textarea = $this->addElement(
            'textarea',
            'Formctrl',
            'Optional: #PCDATA',
            'Common',
            array(
                'accesskey' => 'Character',
                'cols*' => 'Number',
                'disabled' => 'Bool#disabled',
                'name' => 'CDATA',
                'readonly' => 'Bool#readonly',
                'rows*' => 'Number',
                'tabindex' => 'Number',
            )
        );
        $textarea->attr_transform_pre[] = new HTMLPurifier_AttrTransform_Textarea();

        $button = $this->addElement(
            'button',
            'Formctrl',
            'Optional: #PCDATA | Heading | List | Block | Inline',
            'Common',
            array(
                'accesskey' => 'Character',
                'disabled' => 'Bool#disabled',
                'name' => 'CDATA',
                'tabindex' => 'Number',
                'type' => 'Enum#button,submit,reset',
                'value' => 'CDATA',
            )
        );

        // For exclusions, ideally we'd specify content sets, not literal elements
        $button->excludes = $this->makeLookup(
            'form',
            'fieldset', // Form
            'input',
            'select',
            'textarea',
            'label',
            'button', // Formctrl
            'a', // as per HTML 4.01 spec, this is omitted by modularization
            'isindex',
            'iframe' // legacy items
        );

        // Extra exclusion: img usemap="" is not permitted within this element.
        // We'll omit this for now, since we don't have any good way of
        // indicating it yet.

        // This is HIGHLY user-unfriendly; we need a custom child-def for this
        $this->addElement('fieldset', 'Form', 'Custom: (#WS?,legend,(Flow|#PCDATA)*)', 'Common');

        $label = $this->addElement(
            'label',
            'Formctrl',
            'Optional: #PCDATA | Inline',
            'Common',
            array(
                'accesskey' => 'Character',
                // 'for' => 'IDREF', // IDREF not implemented, cannot allow
            )
        );
        $label->excludes = array('label' => true);

        $this->addElement(
            'legend',
            false,
            'Optional: #PCDATA | Inline',
            'Common',
            array(
                'accesskey' => 'Character',
            )
        );

        $this->addElement(
            'optgroup',
            false,
            'Required: option',
            'Common',
            array(
                'disabled' => 'Bool#disabled',
                'label*' => 'Text',
            )
        );
        // Don't forget an injector for <isindex>. This one's a little complex
        // because it maps to multiple elements.
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/HTMLModule/Nofollow.php000064400000000773151214231100017413 0ustar00<?php

/**
 * Module adds the nofollow attribute transformation to a tags.  It
 * is enabled by HTML.Nofollow
 */
class HTMLPurifier_HTMLModule_Nofollow extends HTMLPurifier_HTMLModule
{

    /**
     * @type string
     */
    public $name = 'Nofollow';

    /**
     * @param HTMLPurifier_Config $config
     */
    public function setup($config)
    {
        $a = $this->addBlankElement('a');
        $a->attr_transform_post[] = new HTMLPurifier_AttrTransform_Nofollow();
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/HTMLModule/TargetBlank.php000064400000001012151214231100017775 0ustar00<?php

/**
 * Module adds the target=blank attribute transformation to a tags.  It
 * is enabled by HTML.TargetBlank
 */
class HTMLPurifier_HTMLModule_TargetBlank extends HTMLPurifier_HTMLModule
{
    /**
     * @type string
     */
    public $name = 'TargetBlank';

    /**
     * @param HTMLPurifier_Config $config
     */
    public function setup($config)
    {
        $a = $this->addBlankElement('a');
        $a->attr_transform_post[] = new HTMLPurifier_AttrTransform_TargetBlank();
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Language.php000064400000013656151214231100015431 0ustar00<?php

/**
 * Represents a language and defines localizable string formatting and
 * other functions, as well as the localized messages for HTML Purifier.
 */
class HTMLPurifier_Language
{

    /**
     * ISO 639 language code of language. Prefers shortest possible version.
     * @type string
     */
    public $code = 'en';

    /**
     * Fallback language code.
     * @type bool|string
     */
    public $fallback = false;

    /**
     * Array of localizable messages.
     * @type array
     */
    public $messages = array();

    /**
     * Array of localizable error codes.
     * @type array
     */
    public $errorNames = array();

    /**
     * True if no message file was found for this language, so English
     * is being used instead. Check this if you'd like to notify the
     * user that they've used a non-supported language.
     * @type bool
     */
    public $error = false;

    /**
     * Has the language object been loaded yet?
     * @type bool
     * @todo Make it private, fix usage in HTMLPurifier_LanguageTest
     */
    public $_loaded = false;

    /**
     * @type HTMLPurifier_Config
     */
    protected $config;

    /**
     * @type HTMLPurifier_Context
     */
    protected $context;

    /**
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     */
    public function __construct($config, $context)
    {
        $this->config  = $config;
        $this->context = $context;
    }

    /**
     * Loads language object with necessary info from factory cache
     * @note This is a lazy loader
     */
    public function load()
    {
        if ($this->_loaded) {
            return;
        }
        $factory = HTMLPurifier_LanguageFactory::instance();
        $factory->loadLanguage($this->code);
        foreach ($factory->keys as $key) {
            $this->$key = $factory->cache[$this->code][$key];
        }
        $this->_loaded = true;
    }

    /**
     * Retrieves a localised message.
     * @param string $key string identifier of message
     * @return string localised message
     */
    public function getMessage($key)
    {
        if (!$this->_loaded) {
            $this->load();
        }
        if (!isset($this->messages[$key])) {
            return "[$key]";
        }
        return $this->messages[$key];
    }

    /**
     * Retrieves a localised error name.
     * @param int $int error number, corresponding to PHP's error reporting
     * @return string localised message
     */
    public function getErrorName($int)
    {
        if (!$this->_loaded) {
            $this->load();
        }
        if (!isset($this->errorNames[$int])) {
            return "[Error: $int]";
        }
        return $this->errorNames[$int];
    }

    /**
     * Converts an array list into a string readable representation
     * @param array $array
     * @return string
     */
    public function listify($array)
    {
        $sep      = $this->getMessage('Item separator');
        $sep_last = $this->getMessage('Item separator last');
        $ret = '';
        for ($i = 0, $c = count($array); $i < $c; $i++) {
            if ($i == 0) {
            } elseif ($i + 1 < $c) {
                $ret .= $sep;
            } else {
                $ret .= $sep_last;
            }
            $ret .= $array[$i];
        }
        return $ret;
    }

    /**
     * Formats a localised message with passed parameters
     * @param string $key string identifier of message
     * @param array $args Parameters to substitute in
     * @return string localised message
     * @todo Implement conditionals? Right now, some messages make
     *     reference to line numbers, but those aren't always available
     */
    public function formatMessage($key, $args = array())
    {
        if (!$this->_loaded) {
            $this->load();
        }
        if (!isset($this->messages[$key])) {
            return "[$key]";
        }
        $raw = $this->messages[$key];
        $subst = array();
        $generator = false;
        foreach ($args as $i => $value) {
            if (is_object($value)) {
                if ($value instanceof HTMLPurifier_Token) {
                    // factor this out some time
                    if (!$generator) {
                        $generator = $this->context->get('Generator');
                    }
                    if (isset($value->name)) {
                        $subst['$'.$i.'.Name'] = $value->name;
                    }
                    if (isset($value->data)) {
                        $subst['$'.$i.'.Data'] = $value->data;
                    }
                    $subst['$'.$i.'.Compact'] =
                    $subst['$'.$i.'.Serialized'] = $generator->generateFromToken($value);
                    // a more complex algorithm for compact representation
                    // could be introduced for all types of tokens. This
                    // may need to be factored out into a dedicated class
                    if (!empty($value->attr)) {
                        $stripped_token = clone $value;
                        $stripped_token->attr = array();
                        $subst['$'.$i.'.Compact'] = $generator->generateFromToken($stripped_token);
                    }
                    $subst['$'.$i.'.Line'] = $value->line ? $value->line : 'unknown';
                }
                continue;
            } elseif (is_array($value)) {
                $keys = array_keys($value);
                if (array_keys($keys) === $keys) {
                    // list
                    $subst['$'.$i] = $this->listify($value);
                } else {
                    // associative array
                    // no $i implementation yet, sorry
                    $subst['$'.$i.'.Keys'] = $this->listify($keys);
                    $subst['$'.$i.'.Values'] = $this->listify(array_values($value));
                }
                continue;
            }
            $subst['$' . $i] = $value;
        }
        return strtr($raw, $subst);
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/DoctypeRegistry.php000064400000010200151214231100017024 0ustar00<?php

class HTMLPurifier_DoctypeRegistry
{

    /**
     * Hash of doctype names to doctype objects.
     * @type array
     */
    protected $doctypes;

    /**
     * Lookup table of aliases to real doctype names.
     * @type array
     */
    protected $aliases;

    /**
     * Registers a doctype to the registry
     * @note Accepts a fully-formed doctype object, or the
     *       parameters for constructing a doctype object
     * @param string $doctype Name of doctype or literal doctype object
     * @param bool $xml
     * @param array $modules Modules doctype will load
     * @param array $tidy_modules Modules doctype will load for certain modes
     * @param array $aliases Alias names for doctype
     * @param string $dtd_public
     * @param string $dtd_system
     * @return HTMLPurifier_Doctype Editable registered doctype
     */
    public function register(
        $doctype,
        $xml = true,
        $modules = array(),
        $tidy_modules = array(),
        $aliases = array(),
        $dtd_public = null,
        $dtd_system = null
    ) {
        if (!is_array($modules)) {
            $modules = array($modules);
        }
        if (!is_array($tidy_modules)) {
            $tidy_modules = array($tidy_modules);
        }
        if (!is_array($aliases)) {
            $aliases = array($aliases);
        }
        if (!is_object($doctype)) {
            $doctype = new HTMLPurifier_Doctype(
                $doctype,
                $xml,
                $modules,
                $tidy_modules,
                $aliases,
                $dtd_public,
                $dtd_system
            );
        }
        $this->doctypes[$doctype->name] = $doctype;
        $name = $doctype->name;
        // hookup aliases
        foreach ($doctype->aliases as $alias) {
            if (isset($this->doctypes[$alias])) {
                continue;
            }
            $this->aliases[$alias] = $name;
        }
        // remove old aliases
        if (isset($this->aliases[$name])) {
            unset($this->aliases[$name]);
        }
        return $doctype;
    }

    /**
     * Retrieves reference to a doctype of a certain name
     * @note This function resolves aliases
     * @note When possible, use the more fully-featured make()
     * @param string $doctype Name of doctype
     * @return HTMLPurifier_Doctype Editable doctype object
     */
    public function get($doctype)
    {
        if (isset($this->aliases[$doctype])) {
            $doctype = $this->aliases[$doctype];
        }
        if (!isset($this->doctypes[$doctype])) {
            trigger_error('Doctype ' . htmlspecialchars($doctype) . ' does not exist', E_USER_ERROR);
            $anon = new HTMLPurifier_Doctype($doctype);
            return $anon;
        }
        return $this->doctypes[$doctype];
    }

    /**
     * Creates a doctype based on a configuration object,
     * will perform initialization on the doctype
     * @note Use this function to get a copy of doctype that config
     *       can hold on to (this is necessary in order to tell
     *       Generator whether or not the current document is XML
     *       based or not).
     * @param HTMLPurifier_Config $config
     * @return HTMLPurifier_Doctype
     */
    public function make($config)
    {
        return clone $this->get($this->getDoctypeFromConfig($config));
    }

    /**
     * Retrieves the doctype from the configuration object
     * @param HTMLPurifier_Config $config
     * @return string
     */
    public function getDoctypeFromConfig($config)
    {
        // recommended test
        $doctype = $config->get('HTML.Doctype');
        if (!empty($doctype)) {
            return $doctype;
        }
        $doctype = $config->get('HTML.CustomDoctype');
        if (!empty($doctype)) {
            return $doctype;
        }
        // backwards-compatibility
        if ($config->get('HTML.XHTML')) {
            $doctype = 'XHTML 1.0';
        } else {
            $doctype = 'HTML 4.01';
        }
        if ($config->get('HTML.Strict')) {
            $doctype .= ' Strict';
        } else {
            $doctype .= ' Transitional';
        }
        return $doctype;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrTransform/Textarea.php000064400000001127151214231100020257 0ustar00<?php

/**
 * Sets height/width defaults for <textarea>
 */
class HTMLPurifier_AttrTransform_Textarea extends HTMLPurifier_AttrTransform
{
    /**
     * @param array $attr
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return array
     */
    public function transform($attr, $config, $context)
    {
        // Calculated from Firefox
        if (!isset($attr['cols'])) {
            $attr['cols'] = '22';
        }
        if (!isset($attr['rows'])) {
            $attr['rows'] = '3';
        }
        return $attr;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrTransform/ImgRequired.php000064400000002463151214231100020723 0ustar00<?php

// must be called POST validation

/**
 * Transform that supplies default values for the src and alt attributes
 * in img tags, as well as prevents the img tag from being removed
 * because of a missing alt tag. This needs to be registered as both
 * a pre and post attribute transform.
 */
class HTMLPurifier_AttrTransform_ImgRequired extends HTMLPurifier_AttrTransform
{

    /**
     * @param array $attr
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return array
     */
    public function transform($attr, $config, $context)
    {
        $src = true;
        if (!isset($attr['src'])) {
            if ($config->get('Core.RemoveInvalidImg')) {
                return $attr;
            }
            $attr['src'] = $config->get('Attr.DefaultInvalidImage');
            $src = false;
        }

        if (!isset($attr['alt'])) {
            if ($src) {
                $alt = $config->get('Attr.DefaultImageAlt');
                if ($alt === null) {
                    $attr['alt'] = basename($attr['src']);
                } else {
                    $attr['alt'] = $alt;
                }
            } else {
                $attr['alt'] = $config->get('Attr.DefaultInvalidImageAlt');
            }
        }
        return $attr;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrTransform/Name.php000064400000001450151214231100017361 0ustar00<?php

/**
 * Pre-transform that changes deprecated name attribute to ID if necessary
 */
class HTMLPurifier_AttrTransform_Name extends HTMLPurifier_AttrTransform
{

    /**
     * @param array $attr
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return array
     */
    public function transform($attr, $config, $context)
    {
        // Abort early if we're using relaxed definition of name
        if ($config->get('HTML.Attr.Name.UseCDATA')) {
            return $attr;
        }
        if (!isset($attr['name'])) {
            return $attr;
        }
        $id = $this->confiscateAttr($attr, 'name');
        if (isset($attr['id'])) {
            return $attr;
        }
        $attr['id'] = $id;
        return $attr;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrTransform/ScriptRequired.php000064400000001004151214231100021441 0ustar00<?php

/**
 * Implements required attribute stipulation for <script>
 */
class HTMLPurifier_AttrTransform_ScriptRequired extends HTMLPurifier_AttrTransform
{
    /**
     * @param array $attr
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return array
     */
    public function transform($attr, $config, $context)
    {
        if (!isset($attr['type'])) {
            $attr['type'] = 'text/javascript';
        }
        return $attr;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrTransform/BdoDir.php000064400000001177151214231100017652 0ustar00<?php

// this MUST be placed in post, as it assumes that any value in dir is valid

/**
 * Post-trasnform that ensures that bdo tags have the dir attribute set.
 */
class HTMLPurifier_AttrTransform_BdoDir extends HTMLPurifier_AttrTransform
{

    /**
     * @param array $attr
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return array
     */
    public function transform($attr, $config, $context)
    {
        if (isset($attr['dir'])) {
            return $attr;
        }
        $attr['dir'] = $config->get('Attr.DefaultTextDir');
        return $attr;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrTransform/BgColor.php000064400000001240151214231100020025 0ustar00<?php

/**
 * Pre-transform that changes deprecated bgcolor attribute to CSS.
 */
class HTMLPurifier_AttrTransform_BgColor extends HTMLPurifier_AttrTransform
{
    /**
     * @param array $attr
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return array
     */
    public function transform($attr, $config, $context)
    {
        if (!isset($attr['bgcolor'])) {
            return $attr;
        }

        $bgcolor = $this->confiscateAttr($attr, 'bgcolor');
        // some validation should happen here

        $this->prependCSS($attr, "background-color:$bgcolor;");
        return $attr;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrTransform/ImgSpace.php000064400000002566151214231100020202 0ustar00<?php

/**
 * Pre-transform that changes deprecated hspace and vspace attributes to CSS
 */
class HTMLPurifier_AttrTransform_ImgSpace extends HTMLPurifier_AttrTransform
{
    /**
     * @type string
     */
    protected $attr;

    /**
     * @type array
     */
    protected $css = array(
        'hspace' => array('left', 'right'),
        'vspace' => array('top', 'bottom')
    );

    /**
     * @param string $attr
     */
    public function __construct($attr)
    {
        $this->attr = $attr;
        if (!isset($this->css[$attr])) {
            trigger_error(htmlspecialchars($attr) . ' is not valid space attribute');
        }
    }

    /**
     * @param array $attr
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return array
     */
    public function transform($attr, $config, $context)
    {
        if (!isset($attr[$this->attr])) {
            return $attr;
        }

        $width = $this->confiscateAttr($attr, $this->attr);
        // some validation could happen here

        if (!isset($this->css[$this->attr])) {
            return $attr;
        }

        $style = '';
        foreach ($this->css[$this->attr] as $suffix) {
            $property = "margin-$suffix";
            $style .= "$property:{$width}px;";
        }
        $this->prependCSS($attr, $style);
        return $attr;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrTransform/SafeEmbed.php000064400000001072151214231100020314 0ustar00<?php

class HTMLPurifier_AttrTransform_SafeEmbed extends HTMLPurifier_AttrTransform
{
    /**
     * @type string
     */
    public $name = "SafeEmbed";

    /**
     * @param array $attr
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return array
     */
    public function transform($attr, $config, $context)
    {
        $attr['allowscriptaccess'] = 'never';
        $attr['allownetworking'] = 'internal';
        $attr['type'] = 'application/x-shockwave-flash';
        return $attr;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrTransform/BoolToCSS.php000064400000002077151214231100020256 0ustar00<?php

/**
 * Pre-transform that changes converts a boolean attribute to fixed CSS
 */
class HTMLPurifier_AttrTransform_BoolToCSS extends HTMLPurifier_AttrTransform
{
    /**
     * Name of boolean attribute that is trigger.
     * @type string
     */
    protected $attr;

    /**
     * CSS declarations to add to style, needs trailing semicolon.
     * @type string
     */
    protected $css;

    /**
     * @param string $attr attribute name to convert from
     * @param string $css CSS declarations to add to style (needs semicolon)
     */
    public function __construct($attr, $css)
    {
        $this->attr = $attr;
        $this->css = $css;
    }

    /**
     * @param array $attr
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return array
     */
    public function transform($attr, $config, $context)
    {
        if (!isset($attr[$this->attr])) {
            return $attr;
        }
        unset($attr[$this->attr]);
        $this->prependCSS($attr, $this->css);
        return $attr;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrTransform/TargetNoreferrer.php000064400000002010151214231100021752 0ustar00<?php

// must be called POST validation

/**
 * Adds rel="noreferrer" to any links which target a different window
 * than the current one.  This is used to prevent malicious websites
 * from silently replacing the original window, which could be used
 * to do phishing.
 * This transform is controlled by %HTML.TargetNoreferrer.
 */
class HTMLPurifier_AttrTransform_TargetNoreferrer extends HTMLPurifier_AttrTransform
{
    /**
     * @param array $attr
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return array
     */
    public function transform($attr, $config, $context)
    {
        if (isset($attr['rel'])) {
            $rels = explode(' ', $attr['rel']);
        } else {
            $rels = array();
        }
        if (isset($attr['target']) && !in_array('noreferrer', $rels)) {
            $rels[] = 'noreferrer';
        }
        if (!empty($rels) || isset($attr['rel'])) {
            $attr['rel'] = implode(' ', $rels);
        }

        return $attr;
    }
}

htmlpurifier/library/HTMLPurifier/AttrTransform/TargetNoopener.php000064400000001776151214231100021450 0ustar00<?php

// must be called POST validation

/**
 * Adds rel="noopener" to any links which target a different window
 * than the current one.  This is used to prevent malicious websites
 * from silently replacing the original window, which could be used
 * to do phishing.
 * This transform is controlled by %HTML.TargetNoopener.
 */
class HTMLPurifier_AttrTransform_TargetNoopener extends HTMLPurifier_AttrTransform
{
    /**
     * @param array $attr
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return array
     */
    public function transform($attr, $config, $context)
    {
        if (isset($attr['rel'])) {
            $rels = explode(' ', $attr['rel']);
        } else {
            $rels = array();
        }
        if (isset($attr['target']) && !in_array('noopener', $rels)) {
            $rels[] = 'noopener';
        }
        if (!empty($rels) || isset($attr['rel'])) {
            $attr['rel'] = implode(' ', $rels);
        }

        return $attr;
    }
}

htmlpurifier/library/HTMLPurifier/AttrTransform/Input.php000064400000003100151214231100017572 0ustar00<?php

/**
 * Performs miscellaneous cross attribute validation and filtering for
 * input elements. This is meant to be a post-transform.
 */
class HTMLPurifier_AttrTransform_Input extends HTMLPurifier_AttrTransform
{
    /**
     * @type HTMLPurifier_AttrDef_HTML_Pixels
     */
    protected $pixels;

    public function __construct()
    {
        $this->pixels = new HTMLPurifier_AttrDef_HTML_Pixels();
    }

    /**
     * @param array $attr
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return array
     */
    public function transform($attr, $config, $context)
    {
        if (!isset($attr['type'])) {
            $t = 'text';
        } else {
            $t = strtolower($attr['type']);
        }
        if (isset($attr['checked']) && $t !== 'radio' && $t !== 'checkbox') {
            unset($attr['checked']);
        }
        if (isset($attr['maxlength']) && $t !== 'text' && $t !== 'password') {
            unset($attr['maxlength']);
        }
        if (isset($attr['size']) && $t !== 'text' && $t !== 'password') {
            $result = $this->pixels->validate($attr['size'], $config, $context);
            if ($result === false) {
                unset($attr['size']);
            } else {
                $attr['size'] = $result;
            }
        }
        if (isset($attr['src']) && $t !== 'image') {
            unset($attr['src']);
        }
        if (!isset($attr['value']) && ($t === 'radio' || $t === 'checkbox')) {
            $attr['value'] = '';
        }
        return $attr;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrTransform/Border.php000064400000001244151214231100017717 0ustar00<?php

/**
 * Pre-transform that changes deprecated border attribute to CSS.
 */
class HTMLPurifier_AttrTransform_Border extends HTMLPurifier_AttrTransform
{
    /**
     * @param array $attr
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return array
     */
    public function transform($attr, $config, $context)
    {
        if (!isset($attr['border'])) {
            return $attr;
        }
        $border_width = $this->confiscateAttr($attr, 'border');
        // some validation should happen here
        $this->prependCSS($attr, "border:{$border_width}px solid;");
        return $attr;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrTransform/SafeObject.php000064400000001141151214231100020503 0ustar00<?php

/**
 * Writes default type for all objects. Currently only supports flash.
 */
class HTMLPurifier_AttrTransform_SafeObject extends HTMLPurifier_AttrTransform
{
    /**
     * @type string
     */
    public $name = "SafeObject";

    /**
     * @param array $attr
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return array
     */
    public function transform($attr, $config, $context)
    {
        if (!isset($attr['type'])) {
            $attr['type'] = 'application/x-shockwave-flash';
        }
        return $attr;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrTransform/Lang.php000064400000001530151214231100017361 0ustar00<?php

/**
 * Post-transform that copies lang's value to xml:lang (and vice-versa)
 * @note Theoretically speaking, this could be a pre-transform, but putting
 *       post is more efficient.
 */
class HTMLPurifier_AttrTransform_Lang extends HTMLPurifier_AttrTransform
{

    /**
     * @param array $attr
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return array
     */
    public function transform($attr, $config, $context)
    {
        $lang = isset($attr['lang']) ? $attr['lang'] : false;
        $xml_lang = isset($attr['xml:lang']) ? $attr['xml:lang'] : false;

        if ($lang !== false && $xml_lang === false) {
            $attr['xml:lang'] = $lang;
        } elseif ($xml_lang !== false) {
            $attr['lang'] = $xml_lang;
        }
        return $attr;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrTransform/Background.php000064400000001270151214231100020560 0ustar00<?php

/**
 * Pre-transform that changes proprietary background attribute to CSS.
 */
class HTMLPurifier_AttrTransform_Background extends HTMLPurifier_AttrTransform
{
    /**
     * @param array $attr
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return array
     */
    public function transform($attr, $config, $context)
    {
        if (!isset($attr['background'])) {
            return $attr;
        }

        $background = $this->confiscateAttr($attr, 'background');
        // some validation should happen here

        $this->prependCSS($attr, "background-image:url($background);");
        return $attr;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrTransform/Length.php000064400000001730151214231100017723 0ustar00<?php

/**
 * Class for handling width/height length attribute transformations to CSS
 */
class HTMLPurifier_AttrTransform_Length extends HTMLPurifier_AttrTransform
{

    /**
     * @type string
     */
    protected $name;

    /**
     * @type string
     */
    protected $cssName;

    public function __construct($name, $css_name = null)
    {
        $this->name = $name;
        $this->cssName = $css_name ? $css_name : $name;
    }

    /**
     * @param array $attr
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return array
     */
    public function transform($attr, $config, $context)
    {
        if (!isset($attr[$this->name])) {
            return $attr;
        }
        $length = $this->confiscateAttr($attr, $this->name);
        if (ctype_digit($length)) {
            $length .= 'px';
        }
        $this->prependCSS($attr, $this->cssName . ":$length;");
        return $attr;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrTransform/NameSync.php000064400000002201151214231100020211 0ustar00<?php

/**
 * Post-transform that performs validation to the name attribute; if
 * it is present with an equivalent id attribute, it is passed through;
 * otherwise validation is performed.
 */
class HTMLPurifier_AttrTransform_NameSync extends HTMLPurifier_AttrTransform
{

    /**
     * @since 4.13.1 - https://github.com/MetaSlider/metaslider/issues/494
     */
    public $idDef;

    public function __construct()
    {
        $this->idDef = new HTMLPurifier_AttrDef_HTML_ID();
    }

    /**
     * @param array $attr
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return array
     */
    public function transform($attr, $config, $context)
    {
        if (!isset($attr['name'])) {
            return $attr;
        }
        $name = $attr['name'];
        if (isset($attr['id']) && $attr['id'] === $name) {
            return $attr;
        }
        $result = $this->idDef->validate($name, $config, $context);
        if ($result === false) {
            unset($attr['name']);
        } else {
            $attr['name'] = $result;
        }
        return $attr;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrTransform/SafeParam.php000064400000004751151214231100020347 0ustar00<?php

/**
 * Validates name/value pairs in param tags to be used in safe objects. This
 * will only allow name values it recognizes, and pre-fill certain attributes
 * with required values.
 *
 * @note
 *      This class only supports Flash. In the future, Quicktime support
 *      may be added.
 *
 * @warning
 *      This class expects an injector to add the necessary parameters tags.
 */
class HTMLPurifier_AttrTransform_SafeParam extends HTMLPurifier_AttrTransform
{
    /**
     * @type string
     */
    public $name = "SafeParam";

    /**
     * @type HTMLPurifier_AttrDef_URI
     */
    private $uri;

    public function __construct()
    {
        $this->uri = new HTMLPurifier_AttrDef_URI(true); // embedded
        $this->wmode = new HTMLPurifier_AttrDef_Enum(array('window', 'opaque', 'transparent'));
    }

    /**
     * @param array $attr
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return array
     */
    public function transform($attr, $config, $context)
    {
        // If we add support for other objects, we'll need to alter the
        // transforms.
        switch ($attr['name']) {
            // application/x-shockwave-flash
            // Keep this synchronized with Injector/SafeObject.php
            case 'allowScriptAccess':
                $attr['value'] = 'never';
                break;
            case 'allowNetworking':
                $attr['value'] = 'internal';
                break;
            case 'allowFullScreen':
                if ($config->get('HTML.FlashAllowFullScreen')) {
                    $attr['value'] = ($attr['value'] == 'true') ? 'true' : 'false';
                } else {
                    $attr['value'] = 'false';
                }
                break;
            case 'wmode':
                $attr['value'] = $this->wmode->validate($attr['value'], $config, $context);
                break;
            case 'movie':
            case 'src':
                $attr['name'] = "movie";
                $attr['value'] = $this->uri->validate($attr['value'], $config, $context);
                break;
            case 'flashvars':
                // we're going to allow arbitrary inputs to the SWF, on
                // the reasoning that it could only hack the SWF, not us.
                break;
            // add other cases to support other param name/value pairs
            default:
                $attr['name'] = $attr['value'] = null;
        }
        return $attr;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrTransform/EnumToCSS.php000064400000003275151214231100020270 0ustar00<?php

/**
 * Generic pre-transform that converts an attribute with a fixed number of
 * values (enumerated) to CSS.
 */
class HTMLPurifier_AttrTransform_EnumToCSS extends HTMLPurifier_AttrTransform
{
    /**
     * Name of attribute to transform from.
     * @type string
     */
    protected $attr;

    /**
     * Lookup array of attribute values to CSS.
     * @type array
     */
    protected $enumToCSS = array();

    /**
     * Case sensitivity of the matching.
     * @type bool
     * @warning Currently can only be guaranteed to work with ASCII
     *          values.
     */
    protected $caseSensitive = false;

    /**
     * @param string $attr Attribute name to transform from
     * @param array $enum_to_css Lookup array of attribute values to CSS
     * @param bool $case_sensitive Case sensitivity indicator, default false
     */
    public function __construct($attr, $enum_to_css, $case_sensitive = false)
    {
        $this->attr = $attr;
        $this->enumToCSS = $enum_to_css;
        $this->caseSensitive = (bool)$case_sensitive;
    }

    /**
     * @param array $attr
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return array
     */
    public function transform($attr, $config, $context)
    {
        if (!isset($attr[$this->attr])) {
            return $attr;
        }

        $value = trim($attr[$this->attr]);
        unset($attr[$this->attr]);

        if (!$this->caseSensitive) {
            $value = strtolower($value);
        }

        if (!isset($this->enumToCSS[$value])) {
            return $attr;
        }
        $this->prependCSS($attr, $this->enumToCSS[$value]);
        return $attr;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrTransform/Nofollow.php000064400000002435151214231100020304 0ustar00<?php

// must be called POST validation

/**
 * Adds rel="nofollow" to all outbound links.  This transform is
 * only attached if Attr.Nofollow is TRUE.
 */
class HTMLPurifier_AttrTransform_Nofollow extends HTMLPurifier_AttrTransform
{
    /**
     * @type HTMLPurifier_URIParser
     */
    private $parser;

    public function __construct()
    {
        $this->parser = new HTMLPurifier_URIParser();
    }

    /**
     * @param array $attr
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return array
     */
    public function transform($attr, $config, $context)
    {
        if (!isset($attr['href'])) {
            return $attr;
        }

        // XXX Kind of inefficient
        $url = $this->parser->parse($attr['href']);
        $scheme = $url->getSchemeObj($config, $context);

        if ($scheme->browsable && !$url->isLocal($config, $context)) {
            if (isset($attr['rel'])) {
                $rels = explode(' ', $attr['rel']);
                if (!in_array('nofollow', $rels)) {
                    $rels[] = 'nofollow';
                }
                $attr['rel'] = implode(' ', $rels);
            } else {
                $attr['rel'] = 'nofollow';
            }
        }
        return $attr;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrTransform/TargetBlank.php000064400000002104151214231100020674 0ustar00<?php

// must be called POST validation

/**
 * Adds target="blank" to all outbound links.  This transform is
 * only attached if Attr.TargetBlank is TRUE.  This works regardless
 * of whether or not Attr.AllowedFrameTargets
 */
class HTMLPurifier_AttrTransform_TargetBlank extends HTMLPurifier_AttrTransform
{
    /**
     * @type HTMLPurifier_URIParser
     */
    private $parser;

    public function __construct()
    {
        $this->parser = new HTMLPurifier_URIParser();
    }

    /**
     * @param array $attr
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return array
     */
    public function transform($attr, $config, $context)
    {
        if (!isset($attr['href'])) {
            return $attr;
        }

        // XXX Kind of inefficient
        $url = $this->parser->parse($attr['href']);
        $scheme = $url->getSchemeObj($config, $context);

        if ($scheme->browsable && !$url->isBenign($config, $context)) {
            $attr['target'] = '_blank';
        }
        return $attr;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Printer/CSSDefinition.php000064400000002252151214231100017760 0ustar00<?php

class HTMLPurifier_Printer_CSSDefinition extends HTMLPurifier_Printer
{
    /**
     * @type HTMLPurifier_CSSDefinition
     */
    protected $def;

    /**
     * @param HTMLPurifier_Config $config
     * @return string
     */
    public function render($config)
    {
        $this->def = $config->getCSSDefinition();
        $ret = '';

        $ret .= $this->start('div', array('class' => 'HTMLPurifier_Printer'));
        $ret .= $this->start('table');

        $ret .= $this->element('caption', 'Properties ($info)');

        $ret .= $this->start('thead');
        $ret .= $this->start('tr');
        $ret .= $this->element('th', 'Property', array('class' => 'heavy'));
        $ret .= $this->element('th', 'Definition', array('class' => 'heavy', 'style' => 'width:auto;'));
        $ret .= $this->end('tr');
        $ret .= $this->end('thead');

        ksort($this->def->info);
        foreach ($this->def->info as $property => $obj) {
            $name = $this->getClass($obj, 'AttrDef_');
            $ret .= $this->row($property, $name);
        }

        $ret .= $this->end('table');
        $ret .= $this->end('div');

        return $ret;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.css000064400000000455151214231100017354 0ustar00
.hp-config {}

.hp-config tbody th {text-align:right; padding-right:0.5em;}
.hp-config thead, .hp-config .namespace {background:#3C578C; color:#FFF;}
.hp-config .namespace th {text-align:center;}
.hp-config .verbose {display:none;}
.hp-config .controls {text-align:center;}

/* vim: et sw=4 sts=4 */
htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.js000064400000000216151214231100017173 0ustar00function toggleWriteability(id_of_patient, checked) {
    document.getElementById(id_of_patient).disabled = checked;
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php000064400000034743151214231100017362 0ustar00<?php

/**
 * @todo Rewrite to use Interchange objects
 */
class HTMLPurifier_Printer_ConfigForm extends HTMLPurifier_Printer
{

    /**
     * Printers for specific fields.
     * @type HTMLPurifier_Printer[]
     */
    protected $fields = array();

    /**
     * Documentation URL, can have fragment tagged on end.
     * @type string
     */
    protected $docURL;

    /**
     * Name of form element to stuff config in.
     * @type string
     */
    protected $name;

    /**
     * Whether or not to compress directive names, clipping them off
     * after a certain amount of letters. False to disable or integer letters
     * before clipping.
     * @type bool
     */
    protected $compress = false;

    /**
     * @param string $name Form element name for directives to be stuffed into
     * @param string $doc_url String documentation URL, will have fragment tagged on
     * @param bool $compress Integer max length before compressing a directive name, set to false to turn off
     */
    public function __construct(
        $name,
        $doc_url = null,
        $compress = false
    ) {
        parent::__construct();
        $this->docURL = $doc_url;
        $this->name = $name;
        $this->compress = $compress;
        // initialize sub-printers
        $this->fields[0] = new HTMLPurifier_Printer_ConfigForm_default();
        $this->fields[HTMLPurifier_VarParser::C_BOOL] = new HTMLPurifier_Printer_ConfigForm_bool();
    }

    /**
     * Sets default column and row size for textareas in sub-printers
     * @param $cols Integer columns of textarea, null to use default
     * @param $rows Integer rows of textarea, null to use default
     */
    public function setTextareaDimensions($cols = null, $rows = null)
    {
        if ($cols) {
            $this->fields['default']->cols = $cols;
        }
        if ($rows) {
            $this->fields['default']->rows = $rows;
        }
    }

    /**
     * Retrieves styling, in case it is not accessible by webserver
     */
    public static function getCSS()
    {
        return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.css');
    }

    /**
     * Retrieves JavaScript, in case it is not accessible by webserver
     */
    public static function getJavaScript()
    {
        return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.js');
    }

    /**
     * Returns HTML output for a configuration form
     * @param HTMLPurifier_Config|array $config Configuration object of current form state, or an array
     *        where [0] has an HTML namespace and [1] is being rendered.
     * @param array|bool $allowed Optional namespace(s) and directives to restrict form to.
     * @param bool $render_controls
     * @return string
     */
    public function render($config, $allowed = true, $render_controls = true)
    {
        if (is_array($config) && isset($config[0])) {
            $gen_config = $config[0];
            $config = $config[1];
        } else {
            $gen_config = $config;
        }

        $this->config = $config;
        $this->genConfig = $gen_config;
        $this->prepareGenerator($gen_config);

        $allowed = HTMLPurifier_Config::getAllowedDirectivesForForm($allowed, $config->def);
        $all = array();
        foreach ($allowed as $key) {
            list($ns, $directive) = $key;
            $all[$ns][$directive] = $config->get($ns . '.' . $directive);
        }

        $ret = '';
        $ret .= $this->start('table', array('class' => 'hp-config'));
        $ret .= $this->start('thead');
        $ret .= $this->start('tr');
        $ret .= $this->element('th', 'Directive', array('class' => 'hp-directive'));
        $ret .= $this->element('th', 'Value', array('class' => 'hp-value'));
        $ret .= $this->end('tr');
        $ret .= $this->end('thead');
        foreach ($all as $ns => $directives) {
            $ret .= $this->renderNamespace($ns, $directives);
        }
        if ($render_controls) {
            $ret .= $this->start('tbody');
            $ret .= $this->start('tr');
            $ret .= $this->start('td', array('colspan' => 2, 'class' => 'controls'));
            $ret .= $this->elementEmpty('input', array('type' => 'submit', 'value' => 'Submit'));
            $ret .= '[<a href="?">Reset</a>]';
            $ret .= $this->end('td');
            $ret .= $this->end('tr');
            $ret .= $this->end('tbody');
        }
        $ret .= $this->end('table');
        return $ret;
    }

    /**
     * Renders a single namespace
     * @param $ns String namespace name
     * @param array $directives array of directives to values
     * @return string
     */
    protected function renderNamespace($ns, $directives)
    {
        $ret = '';
        $ret .= $this->start('tbody', array('class' => 'namespace'));
        $ret .= $this->start('tr');
        $ret .= $this->element('th', $ns, array('colspan' => 2));
        $ret .= $this->end('tr');
        $ret .= $this->end('tbody');
        $ret .= $this->start('tbody');
        foreach ($directives as $directive => $value) {
            $ret .= $this->start('tr');
            $ret .= $this->start('th');
            if ($this->docURL) {
                $url = str_replace('%s', urlencode("$ns.$directive"), $this->docURL);
                $ret .= $this->start('a', array('href' => $url));
            }
            $attr = array('for' => "{$this->name}:$ns.$directive");

            // crop directive name if it's too long
            if (!$this->compress || (strlen($directive) < $this->compress)) {
                $directive_disp = $directive;
            } else {
                $directive_disp = substr($directive, 0, $this->compress - 2) . '...';
                $attr['title'] = $directive;
            }

            $ret .= $this->element(
                'label',
                $directive_disp,
                // component printers must create an element with this id
                $attr
            );
            if ($this->docURL) {
                $ret .= $this->end('a');
            }
            $ret .= $this->end('th');

            $ret .= $this->start('td');
            $def = $this->config->def->info["$ns.$directive"];
            if (is_int($def)) {
                $allow_null = $def < 0;
                $type = abs($def);
            } else {
                $type = $def->type;
                $allow_null = isset($def->allow_null);
            }
            if (!isset($this->fields[$type])) {
                $type = 0;
            } // default
            $type_obj = $this->fields[$type];
            if ($allow_null) {
                $type_obj = new HTMLPurifier_Printer_ConfigForm_NullDecorator($type_obj);
            }
            $ret .= $type_obj->render($ns, $directive, $value, $this->name, array($this->genConfig, $this->config));
            $ret .= $this->end('td');
            $ret .= $this->end('tr');
        }
        $ret .= $this->end('tbody');
        return $ret;
    }

}

/**
 * Printer decorator for directives that accept null
 */
class HTMLPurifier_Printer_ConfigForm_NullDecorator extends HTMLPurifier_Printer
{
    /**
     * Printer being decorated
     * @type HTMLPurifier_Printer
     */
    protected $obj;

    /**
     * @param HTMLPurifier_Printer $obj Printer to decorate
     */
    public function __construct($obj)
    {
        parent::__construct();
        $this->obj = $obj;
    }

    /**
     * @param string $ns
     * @param string $directive
     * @param string $value
     * @param string $name
     * @param HTMLPurifier_Config|array $config
     * @return string
     */
    public function render($ns, $directive, $value, $name, $config)
    {
        if (is_array($config) && isset($config[0])) {
            $gen_config = $config[0];
            $config = $config[1];
        } else {
            $gen_config = $config;
        }
        $this->prepareGenerator($gen_config);

        $ret = '';
        $ret .= $this->start('label', array('for' => "$name:Null_$ns.$directive"));
        $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose'));
        $ret .= $this->text(' Null/Disabled');
        $ret .= $this->end('label');
        $attr = array(
            'type' => 'checkbox',
            'value' => '1',
            'class' => 'null-toggle',
            'name' => "$name" . "[Null_$ns.$directive]",
            'id' => "$name:Null_$ns.$directive",
            'onclick' => "toggleWriteability('$name:$ns.$directive',checked)" // INLINE JAVASCRIPT!!!!
        );
        if ($this->obj instanceof HTMLPurifier_Printer_ConfigForm_bool) {
            // modify inline javascript slightly
            $attr['onclick'] =
                "toggleWriteability('$name:Yes_$ns.$directive',checked);" .
                "toggleWriteability('$name:No_$ns.$directive',checked)";
        }
        if ($value === null) {
            $attr['checked'] = 'checked';
        }
        $ret .= $this->elementEmpty('input', $attr);
        $ret .= $this->text(' or ');
        $ret .= $this->elementEmpty('br');
        $ret .= $this->obj->render($ns, $directive, $value, $name, array($gen_config, $config));
        return $ret;
    }
}

/**
 * Swiss-army knife configuration form field printer
 */
class HTMLPurifier_Printer_ConfigForm_default extends HTMLPurifier_Printer
{
    /**
     * @type int
     */
    public $cols = 18;

    /**
     * @type int
     */
    public $rows = 5;

    /**
     * @param string $ns
     * @param string $directive
     * @param string $value
     * @param string $name
     * @param HTMLPurifier_Config|array $config
     * @return string
     */
    public function render($ns, $directive, $value, $name, $config)
    {
        if (is_array($config) && isset($config[0])) {
            $gen_config = $config[0];
            $config = $config[1];
        } else {
            $gen_config = $config;
        }
        $this->prepareGenerator($gen_config);
        // this should probably be split up a little
        $ret = '';
        $def = $config->def->info["$ns.$directive"];
        if (is_int($def)) {
            $type = abs($def);
        } else {
            $type = $def->type;
        }
        if (is_array($value)) {
            switch ($type) {
                case HTMLPurifier_VarParser::LOOKUP:
                    $array = $value;
                    $value = array();
                    foreach ($array as $val => $b) {
                        $value[] = $val;
                    }
                    //TODO does this need a break?
                case HTMLPurifier_VarParser::ALIST:
                    $value = implode(PHP_EOL, $value);
                    break;
                case HTMLPurifier_VarParser::HASH:
                    $nvalue = '';
                    foreach ($value as $i => $v) {
                        if (is_array($v)) {
                            // HACK
                            $v = implode(";", $v);
                        }
                        $nvalue .= "$i:$v" . PHP_EOL;
                    }
                    $value = $nvalue;
                    break;
                default:
                    $value = '';
            }
        }
        if ($type === HTMLPurifier_VarParser::C_MIXED) {
            return 'Not supported';
            $value = serialize($value);
        }
        $attr = array(
            'name' => "$name" . "[$ns.$directive]",
            'id' => "$name:$ns.$directive"
        );
        if ($value === null) {
            $attr['disabled'] = 'disabled';
        }
        if (isset($def->allowed)) {
            $ret .= $this->start('select', $attr);
            foreach ($def->allowed as $val => $b) {
                $attr = array();
                if ($value == $val) {
                    $attr['selected'] = 'selected';
                }
                $ret .= $this->element('option', $val, $attr);
            }
            $ret .= $this->end('select');
        } elseif ($type === HTMLPurifier_VarParser::TEXT ||
                $type === HTMLPurifier_VarParser::ITEXT ||
                $type === HTMLPurifier_VarParser::ALIST ||
                $type === HTMLPurifier_VarParser::HASH ||
                $type === HTMLPurifier_VarParser::LOOKUP) {
            $attr['cols'] = $this->cols;
            $attr['rows'] = $this->rows;
            $ret .= $this->start('textarea', $attr);
            $ret .= $this->text($value);
            $ret .= $this->end('textarea');
        } else {
            $attr['value'] = $value;
            $attr['type'] = 'text';
            $ret .= $this->elementEmpty('input', $attr);
        }
        return $ret;
    }
}

/**
 * Bool form field printer
 */
class HTMLPurifier_Printer_ConfigForm_bool extends HTMLPurifier_Printer
{
    /**
     * @param string $ns
     * @param string $directive
     * @param string $value
     * @param string $name
     * @param HTMLPurifier_Config|array $config
     * @return string
     */
    public function render($ns, $directive, $value, $name, $config)
    {
        if (is_array($config) && isset($config[0])) {
            $gen_config = $config[0];
            $config = $config[1];
        } else {
            $gen_config = $config;
        }
        $this->prepareGenerator($gen_config);
        $ret = '';
        $ret .= $this->start('div', array('id' => "$name:$ns.$directive"));

        $ret .= $this->start('label', array('for' => "$name:Yes_$ns.$directive"));
        $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose'));
        $ret .= $this->text(' Yes');
        $ret .= $this->end('label');

        $attr = array(
            'type' => 'radio',
            'name' => "$name" . "[$ns.$directive]",
            'id' => "$name:Yes_$ns.$directive",
            'value' => '1'
        );
        if ($value === true) {
            $attr['checked'] = 'checked';
        }
        if ($value === null) {
            $attr['disabled'] = 'disabled';
        }
        $ret .= $this->elementEmpty('input', $attr);

        $ret .= $this->start('label', array('for' => "$name:No_$ns.$directive"));
        $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose'));
        $ret .= $this->text(' No');
        $ret .= $this->end('label');

        $attr = array(
            'type' => 'radio',
            'name' => "$name" . "[$ns.$directive]",
            'id' => "$name:No_$ns.$directive",
            'value' => '0'
        );
        if ($value === false) {
            $attr['checked'] = 'checked';
        }
        if ($value === null) {
            $attr['disabled'] = 'disabled';
        }
        $ret .= $this->elementEmpty('input', $attr);

        $ret .= $this->end('div');

        return $ret;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Printer/HTMLDefinition.php000064400000024373151214231100020104 0ustar00<?php

class HTMLPurifier_Printer_HTMLDefinition extends HTMLPurifier_Printer
{

    /**
     * @type HTMLPurifier_HTMLDefinition, for easy access
     */
    protected $def;

    /**
     * @param HTMLPurifier_Config $config
     * @return string
     */
    public function render($config)
    {
        $ret = '';
        $this->config =& $config;

        $this->def = $config->getHTMLDefinition();

        $ret .= $this->start('div', array('class' => 'HTMLPurifier_Printer'));

        $ret .= $this->renderDoctype();
        $ret .= $this->renderEnvironment();
        $ret .= $this->renderContentSets();
        $ret .= $this->renderInfo();

        $ret .= $this->end('div');

        return $ret;
    }

    /**
     * Renders the Doctype table
     * @return string
     */
    protected function renderDoctype()
    {
        $doctype = $this->def->doctype;
        $ret = '';
        $ret .= $this->start('table');
        $ret .= $this->element('caption', 'Doctype');
        $ret .= $this->row('Name', $doctype->name);
        $ret .= $this->row('XML', $doctype->xml ? 'Yes' : 'No');
        $ret .= $this->row('Default Modules', implode(', ', $doctype->modules));
        $ret .= $this->row('Default Tidy Modules', implode(', ', $doctype->tidyModules));
        $ret .= $this->end('table');
        return $ret;
    }


    /**
     * Renders environment table, which is miscellaneous info
     * @return string
     */
    protected function renderEnvironment()
    {
        $def = $this->def;

        $ret = '';

        $ret .= $this->start('table');
        $ret .= $this->element('caption', 'Environment');

        $ret .= $this->row('Parent of fragment', $def->info_parent);
        $ret .= $this->renderChildren($def->info_parent_def->child);
        $ret .= $this->row('Block wrap name', $def->info_block_wrapper);

        $ret .= $this->start('tr');
        $ret .= $this->element('th', 'Global attributes');
        $ret .= $this->element('td', $this->listifyAttr($def->info_global_attr), null, 0);
        $ret .= $this->end('tr');

        $ret .= $this->start('tr');
        $ret .= $this->element('th', 'Tag transforms');
        $list = array();
        foreach ($def->info_tag_transform as $old => $new) {
            $new = $this->getClass($new, 'TagTransform_');
            $list[] = "<$old> with $new";
        }
        $ret .= $this->element('td', $this->listify($list));
        $ret .= $this->end('tr');

        $ret .= $this->start('tr');
        $ret .= $this->element('th', 'Pre-AttrTransform');
        $ret .= $this->element('td', $this->listifyObjectList($def->info_attr_transform_pre));
        $ret .= $this->end('tr');

        $ret .= $this->start('tr');
        $ret .= $this->element('th', 'Post-AttrTransform');
        $ret .= $this->element('td', $this->listifyObjectList($def->info_attr_transform_post));
        $ret .= $this->end('tr');

        $ret .= $this->end('table');
        return $ret;
    }

    /**
     * Renders the Content Sets table
     * @return string
     */
    protected function renderContentSets()
    {
        $ret = '';
        $ret .= $this->start('table');
        $ret .= $this->element('caption', 'Content Sets');
        foreach ($this->def->info_content_sets as $name => $lookup) {
            $ret .= $this->heavyHeader($name);
            $ret .= $this->start('tr');
            $ret .= $this->element('td', $this->listifyTagLookup($lookup));
            $ret .= $this->end('tr');
        }
        $ret .= $this->end('table');
        return $ret;
    }

    /**
     * Renders the Elements ($info) table
     * @return string
     */
    protected function renderInfo()
    {
        $ret = '';
        $ret .= $this->start('table');
        $ret .= $this->element('caption', 'Elements ($info)');
        ksort($this->def->info);
        $ret .= $this->heavyHeader('Allowed tags', 2);
        $ret .= $this->start('tr');
        $ret .= $this->element('td', $this->listifyTagLookup($this->def->info), array('colspan' => 2));
        $ret .= $this->end('tr');
        foreach ($this->def->info as $name => $def) {
            $ret .= $this->start('tr');
            $ret .= $this->element('th', "<$name>", array('class' => 'heavy', 'colspan' => 2));
            $ret .= $this->end('tr');
            $ret .= $this->start('tr');
            $ret .= $this->element('th', 'Inline content');
            $ret .= $this->element('td', $def->descendants_are_inline ? 'Yes' : 'No');
            $ret .= $this->end('tr');
            if (!empty($def->excludes)) {
                $ret .= $this->start('tr');
                $ret .= $this->element('th', 'Excludes');
                $ret .= $this->element('td', $this->listifyTagLookup($def->excludes));
                $ret .= $this->end('tr');
            }
            if (!empty($def->attr_transform_pre)) {
                $ret .= $this->start('tr');
                $ret .= $this->element('th', 'Pre-AttrTransform');
                $ret .= $this->element('td', $this->listifyObjectList($def->attr_transform_pre));
                $ret .= $this->end('tr');
            }
            if (!empty($def->attr_transform_post)) {
                $ret .= $this->start('tr');
                $ret .= $this->element('th', 'Post-AttrTransform');
                $ret .= $this->element('td', $this->listifyObjectList($def->attr_transform_post));
                $ret .= $this->end('tr');
            }
            if (!empty($def->auto_close)) {
                $ret .= $this->start('tr');
                $ret .= $this->element('th', 'Auto closed by');
                $ret .= $this->element('td', $this->listifyTagLookup($def->auto_close));
                $ret .= $this->end('tr');
            }
            $ret .= $this->start('tr');
            $ret .= $this->element('th', 'Allowed attributes');
            $ret .= $this->element('td', $this->listifyAttr($def->attr), array(), 0);
            $ret .= $this->end('tr');

            if (!empty($def->required_attr)) {
                $ret .= $this->row('Required attributes', $this->listify($def->required_attr));
            }

            $ret .= $this->renderChildren($def->child);
        }
        $ret .= $this->end('table');
        return $ret;
    }

    /**
     * Renders a row describing the allowed children of an element
     * @param HTMLPurifier_ChildDef $def HTMLPurifier_ChildDef of pertinent element
     * @return string
     */
    protected function renderChildren($def)
    {
        $context = new HTMLPurifier_Context();
        $ret = '';
        $ret .= $this->start('tr');
        $elements = array();
        $attr = array();
        if (isset($def->elements)) {
            if ($def->type == 'strictblockquote') {
                $def->validateChildren(array(), $this->config, $context);
            }
            $elements = $def->elements;
        }
        if ($def->type == 'chameleon') {
            $attr['rowspan'] = 2;
        } elseif ($def->type == 'empty') {
            $elements = array();
        } elseif ($def->type == 'table') {
            $elements = array_flip(
                array(
                    'col',
                    'caption',
                    'colgroup',
                    'thead',
                    'tfoot',
                    'tbody',
                    'tr'
                )
            );
        }
        $ret .= $this->element('th', 'Allowed children', $attr);

        if ($def->type == 'chameleon') {

            $ret .= $this->element(
                'td',
                '<em>Block</em>: ' .
                $this->escape($this->listifyTagLookup($def->block->elements)),
                null,
                0
            );
            $ret .= $this->end('tr');
            $ret .= $this->start('tr');
            $ret .= $this->element(
                'td',
                '<em>Inline</em>: ' .
                $this->escape($this->listifyTagLookup($def->inline->elements)),
                null,
                0
            );

        } elseif ($def->type == 'custom') {

            $ret .= $this->element(
                'td',
                '<em>' . ucfirst($def->type) . '</em>: ' .
                $def->dtd_regex
            );

        } else {
            $ret .= $this->element(
                'td',
                '<em>' . ucfirst($def->type) . '</em>: ' .
                $this->escape($this->listifyTagLookup($elements)),
                null,
                0
            );
        }
        $ret .= $this->end('tr');
        return $ret;
    }

    /**
     * Listifies a tag lookup table.
     * @param array $array Tag lookup array in form of array('tagname' => true)
     * @return string
     */
    protected function listifyTagLookup($array)
    {
        ksort($array);
        $list = array();
        foreach ($array as $name => $discard) {
            if ($name !== '#PCDATA' && !isset($this->def->info[$name])) {
                continue;
            }
            $list[] = $name;
        }
        return $this->listify($list);
    }

    /**
     * Listifies a list of objects by retrieving class names and internal state
     * @param array $array List of objects
     * @return string
     * @todo Also add information about internal state
     */
    protected function listifyObjectList($array)
    {
        ksort($array);
        $list = array();
        foreach ($array as $obj) {
            $list[] = $this->getClass($obj, 'AttrTransform_');
        }
        return $this->listify($list);
    }

    /**
     * Listifies a hash of attributes to AttrDef classes
     * @param array $array Array hash in form of array('attrname' => HTMLPurifier_AttrDef)
     * @return string
     */
    protected function listifyAttr($array)
    {
        ksort($array);
        $list = array();
        foreach ($array as $name => $obj) {
            if ($obj === false) {
                continue;
            }
            $list[] = "$name&nbsp;=&nbsp;<i>" . $this->getClass($obj, 'AttrDef_') . '</i>';
        }
        return $this->listify($list);
    }

    /**
     * Creates a heavy header row
     * @param string $text
     * @param int $num
     * @return string
     */
    protected function heavyHeader($text, $num = 1)
    {
        $ret = '';
        $ret .= $this->start('tr');
        $ret .= $this->element('th', $text, array('colspan' => $num, 'class' => 'heavy'));
        $ret .= $this->end('tr');
        return $ret;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrCollections.php000064400000011376151214231100017014 0ustar00<?php

/**
 * Defines common attribute collections that modules reference
 */

class HTMLPurifier_AttrCollections
{

    /**
     * Associative array of attribute collections, indexed by name.
     * @type array
     */
    public $info = array();

    /**
     * Performs all expansions on internal data for use by other inclusions
     * It also collects all attribute collection extensions from
     * modules
     * @param HTMLPurifier_AttrTypes $attr_types HTMLPurifier_AttrTypes instance
     * @param HTMLPurifier_HTMLModule[] $modules Hash array of HTMLPurifier_HTMLModule members
     */
    public function __construct($attr_types, $modules)
    {
        $this->doConstruct($attr_types, $modules);
    }

    public function doConstruct($attr_types, $modules)
    {
        // load extensions from the modules
        foreach ($modules as $module) {
            foreach ($module->attr_collections as $coll_i => $coll) {
                if (!isset($this->info[$coll_i])) {
                    $this->info[$coll_i] = array();
                }
                foreach ($coll as $attr_i => $attr) {
                    if ($attr_i === 0 && isset($this->info[$coll_i][$attr_i])) {
                        // merge in includes
                        $this->info[$coll_i][$attr_i] = array_merge(
                            $this->info[$coll_i][$attr_i],
                            $attr
                        );
                        continue;
                    }
                    $this->info[$coll_i][$attr_i] = $attr;
                }
            }
        }
        // perform internal expansions and inclusions
        foreach ($this->info as $name => $attr) {
            // merge attribute collections that include others
            $this->performInclusions($this->info[$name]);
            // replace string identifiers with actual attribute objects
            $this->expandIdentifiers($this->info[$name], $attr_types);
        }
    }

    /**
     * Takes a reference to an attribute associative array and performs
     * all inclusions specified by the zero index.
     * @param array &$attr Reference to attribute array
     */
    public function performInclusions(&$attr)
    {
        if (!isset($attr[0])) {
            return;
        }
        $merge = $attr[0];
        $seen  = array(); // recursion guard
        // loop through all the inclusions
        for ($i = 0; isset($merge[$i]); $i++) {
            if (isset($seen[$merge[$i]])) {
                continue;
            }
            $seen[$merge[$i]] = true;
            // foreach attribute of the inclusion, copy it over
            if (!isset($this->info[$merge[$i]])) {
                continue;
            }
            foreach ($this->info[$merge[$i]] as $key => $value) {
                if (isset($attr[$key])) {
                    continue;
                } // also catches more inclusions
                $attr[$key] = $value;
            }
            if (isset($this->info[$merge[$i]][0])) {
                // recursion
                $merge = array_merge($merge, $this->info[$merge[$i]][0]);
            }
        }
        unset($attr[0]);
    }

    /**
     * Expands all string identifiers in an attribute array by replacing
     * them with the appropriate values inside HTMLPurifier_AttrTypes
     * @param array &$attr Reference to attribute array
     * @param HTMLPurifier_AttrTypes $attr_types HTMLPurifier_AttrTypes instance
     */
    public function expandIdentifiers(&$attr, $attr_types)
    {
        // because foreach will process new elements we add, make sure we
        // skip duplicates
        $processed = array();

        foreach ($attr as $def_i => $def) {
            // skip inclusions
            if ($def_i === 0) {
                continue;
            }

            if (isset($processed[$def_i])) {
                continue;
            }

            // determine whether or not attribute is required
            if ($required = (strpos($def_i, '*') !== false)) {
                // rename the definition
                unset($attr[$def_i]);
                $def_i = trim($def_i, '*');
                $attr[$def_i] = $def;
            }

            $processed[$def_i] = true;

            // if we've already got a literal object, move on
            if (is_object($def)) {
                // preserve previous required
                $attr[$def_i]->required = ($required || $attr[$def_i]->required);
                continue;
            }

            if ($def === false) {
                unset($attr[$def_i]);
                continue;
            }

            if ($t = $attr_types->get($def)) {
                $attr[$def_i] = $t;
                $attr[$def_i]->required = $required;
            } else {
                unset($attr[$def_i]);
            }
        }
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Token/Empty.php000064400000000370151214231100016051 0ustar00<?php

/**
 * Concrete empty token class.
 */
class HTMLPurifier_Token_Empty extends HTMLPurifier_Token_Tag
{
    public function toNode() {
        $n = parent::toNode();
        $n->empty = true;
        return $n;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Token/Tag.php000064400000003740151214231100015472 0ustar00<?php

/**
 * Abstract class of a tag token (start, end or empty), and its behavior.
 */
abstract class HTMLPurifier_Token_Tag extends HTMLPurifier_Token
{
    /**
     * Static bool marker that indicates the class is a tag.
     *
     * This allows us to check objects with <tt>!empty($obj->is_tag)</tt>
     * without having to use a function call <tt>is_a()</tt>.
     * @type bool
     */
    public $is_tag = true;

    /**
     * The lower-case name of the tag, like 'a', 'b' or 'blockquote'.
     *
     * @note Strictly speaking, XML tags are case sensitive, so we shouldn't
     * be lower-casing them, but these tokens cater to HTML tags, which are
     * insensitive.
     * @type string
     */
    public $name;

    /**
     * Associative array of the tag's attributes.
     * @type array
     */
    public $attr = array();

    /**
     * Non-overloaded constructor, which lower-cases passed tag name.
     *
     * @param string $name String name.
     * @param array $attr Associative array of attributes.
     * @param int $line
     * @param int $col
     * @param array $armor
     */
    public function __construct($name, $attr = array(), $line = null, $col = null, $armor = array())
    {
        $this->name = ctype_lower($name) ? $name : strtolower($name);
        foreach ($attr as $key => $value) {
            // normalization only necessary when key is not lowercase
            if (!ctype_lower($key)) {
                $new_key = strtolower($key);
                if (!isset($attr[$new_key])) {
                    $attr[$new_key] = $attr[$key];
                }
                if ($new_key !== $key) {
                    unset($attr[$key]);
                }
            }
        }
        $this->attr = $attr;
        $this->line = $line;
        $this->col = $col;
        $this->armor = $armor;
    }

    public function toNode() {
        return new HTMLPurifier_Node_Element($this->name, $this->attr, $this->line, $this->col, $this->armor);
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Token/End.php000064400000001114151214231100015456 0ustar00<?php

/**
 * Concrete end token class.
 *
 * @warning This class accepts attributes even though end tags cannot. This
 * is for optimization reasons, as under normal circumstances, the Lexers
 * do not pass attributes.
 */
class HTMLPurifier_Token_End extends HTMLPurifier_Token_Tag
{
    /**
     * Token that started this node.
     * Added by MakeWellFormed. Please do not edit this!
     * @type HTMLPurifier_Token
     */
    public $start;

    public function toNode() {
        throw new Exception("HTMLPurifier_Token_End->toNode not supported!");
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Token/Start.php000064400000000207151214231100016047 0ustar00<?php

/**
 * Concrete start token class.
 */
class HTMLPurifier_Token_Start extends HTMLPurifier_Token_Tag
{
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Token/Text.php000064400000002455151214231100015705 0ustar00<?php

/**
 * Concrete text token class.
 *
 * Text tokens comprise of regular parsed character data (PCDATA) and raw
 * character data (from the CDATA sections). Internally, their
 * data is parsed with all entities expanded. Surprisingly, the text token
 * does have a "tag name" called #PCDATA, which is how the DTD represents it
 * in permissible child nodes.
 */
class HTMLPurifier_Token_Text extends HTMLPurifier_Token
{

    /**
     * @type string
     */
    public $name = '#PCDATA';
    /**< PCDATA tag name compatible with DTD. */

    /**
     * @type string
     */
    public $data;
    /**< Parsed character data of text. */

    /**
     * @type bool
     */
    public $is_whitespace;

    /**< Bool indicating if node is whitespace. */

    /**
     * Constructor, accepts data and determines if it is whitespace.
     * @param string $data String parsed character data.
     * @param int $line
     * @param int $col
     */
    public function __construct($data, $line = null, $col = null)
    {
        $this->data = $data;
        $this->is_whitespace = ctype_space($data);
        $this->line = $line;
        $this->col = $col;
    }

    public function toNode() {
        return new HTMLPurifier_Node_Text($this->data, $this->is_whitespace, $this->line, $this->col);
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Token/Comment.php000064400000001367151214231100016364 0ustar00<?php

/**
 * Concrete comment token class. Generally will be ignored.
 */
class HTMLPurifier_Token_Comment extends HTMLPurifier_Token
{
    /**
     * Character data within comment.
     * @type string
     */
    public $data;

    /**
     * @type bool
     */
    public $is_whitespace = true;

    /**
     * Transparent constructor.
     *
     * @param string $data String comment data.
     * @param int $line
     * @param int $col
     */
    public function __construct($data, $line = null, $col = null)
    {
        $this->data = $data;
        $this->line = $line;
        $this->col = $col;
    }

    public function toNode() {
        return new HTMLPurifier_Node_Comment($this->data, $this->line, $this->col);
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrTypes.php000064400000007124151214231100015636 0ustar00<?php

/**
 * Provides lookup array of attribute types to HTMLPurifier_AttrDef objects
 */
class HTMLPurifier_AttrTypes
{
    /**
     * Lookup array of attribute string identifiers to concrete implementations.
     * @type HTMLPurifier_AttrDef[]
     */
    protected $info = array();

    /**
     * Constructs the info array, supplying default implementations for attribute
     * types.
     */
    public function __construct()
    {
        // XXX This is kind of poor, since we don't actually /clone/
        // instances; instead, we use the supplied make() attribute. So,
        // the underlying class must know how to deal with arguments.
        // With the old implementation of Enum, that ignored its
        // arguments when handling a make dispatch, the IAlign
        // definition wouldn't work.

        // pseudo-types, must be instantiated via shorthand
        $this->info['Enum']    = new HTMLPurifier_AttrDef_Enum();
        $this->info['Bool']    = new HTMLPurifier_AttrDef_HTML_Bool();

        $this->info['CDATA']    = new HTMLPurifier_AttrDef_Text();
        $this->info['ID']       = new HTMLPurifier_AttrDef_HTML_ID();
        $this->info['Length']   = new HTMLPurifier_AttrDef_HTML_Length();
        $this->info['MultiLength'] = new HTMLPurifier_AttrDef_HTML_MultiLength();
        $this->info['NMTOKENS'] = new HTMLPurifier_AttrDef_HTML_Nmtokens();
        $this->info['Pixels']   = new HTMLPurifier_AttrDef_HTML_Pixels();
        $this->info['Text']     = new HTMLPurifier_AttrDef_Text();
        $this->info['URI']      = new HTMLPurifier_AttrDef_URI();
        $this->info['LanguageCode'] = new HTMLPurifier_AttrDef_Lang();
        $this->info['Color']    = new HTMLPurifier_AttrDef_HTML_Color();
        $this->info['IAlign']   = self::makeEnum('top,middle,bottom,left,right');
        $this->info['LAlign']   = self::makeEnum('top,bottom,left,right');
        $this->info['FrameTarget'] = new HTMLPurifier_AttrDef_HTML_FrameTarget();

        // unimplemented aliases
        $this->info['ContentType'] = new HTMLPurifier_AttrDef_Text();
        $this->info['ContentTypes'] = new HTMLPurifier_AttrDef_Text();
        $this->info['Charsets'] = new HTMLPurifier_AttrDef_Text();
        $this->info['Character'] = new HTMLPurifier_AttrDef_Text();

        // "proprietary" types
        $this->info['Class'] = new HTMLPurifier_AttrDef_HTML_Class();

        // number is really a positive integer (one or more digits)
        // FIXME: ^^ not always, see start and value of list items
        $this->info['Number']   = new HTMLPurifier_AttrDef_Integer(false, false, true);
    }

    private static function makeEnum($in)
    {
        return new HTMLPurifier_AttrDef_Clone(new HTMLPurifier_AttrDef_Enum(explode(',', $in)));
    }

    /**
     * Retrieves a type
     * @param string $type String type name
     * @return HTMLPurifier_AttrDef Object AttrDef for type
     */
    public function get($type)
    {
        // determine if there is any extra info tacked on
        if (strpos($type, '#') !== false) {
            list($type, $string) = explode('#', $type, 2);
        } else {
            $string = '';
        }

        if (!isset($this->info[$type])) {
            trigger_error('Cannot retrieve undefined attribute type ' . $type, E_USER_ERROR);
            return;
        }
        return $this->info[$type]->make($string);
    }

    /**
     * Sets a new implementation for a type
     * @param string $type String type name
     * @param HTMLPurifier_AttrDef $impl Object AttrDef for type
     */
    public function set($type, $impl)
    {
        $this->info[$type] = $impl;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/URIDefinition.php000064400000006546151214231100016356 0ustar00<?php

class HTMLPurifier_URIDefinition extends HTMLPurifier_Definition
{

    public $type = 'URI';
    protected $filters = array();
    protected $postFilters = array();
    protected $registeredFilters = array();

    /**
     * HTMLPurifier_URI object of the base specified at %URI.Base
     */
    public $base;

    /**
     * String host to consider "home" base, derived off of $base
     */
    public $host;

    /**
     * Name of default scheme based on %URI.DefaultScheme and %URI.Base
     */
    public $defaultScheme;

    public function __construct()
    {
        $this->registerFilter(new HTMLPurifier_URIFilter_DisableExternal());
        $this->registerFilter(new HTMLPurifier_URIFilter_DisableExternalResources());
        $this->registerFilter(new HTMLPurifier_URIFilter_DisableResources());
        $this->registerFilter(new HTMLPurifier_URIFilter_HostBlacklist());
        $this->registerFilter(new HTMLPurifier_URIFilter_SafeIframe());
        $this->registerFilter(new HTMLPurifier_URIFilter_MakeAbsolute());
        $this->registerFilter(new HTMLPurifier_URIFilter_Munge());
    }

    public function registerFilter($filter)
    {
        $this->registeredFilters[$filter->name] = $filter;
    }

    public function addFilter($filter, $config)
    {
        $r = $filter->prepare($config);
        if ($r === false) return; // null is ok, for backwards compat
        if ($filter->post) {
            $this->postFilters[$filter->name] = $filter;
        } else {
            $this->filters[$filter->name] = $filter;
        }
    }

    protected function doSetup($config)
    {
        $this->setupMemberVariables($config);
        $this->setupFilters($config);
    }

    protected function setupFilters($config)
    {
        foreach ($this->registeredFilters as $name => $filter) {
            if ($filter->always_load) {
                $this->addFilter($filter, $config);
            } else {
                $conf = $config->get('URI.' . $name);
                if ($conf !== false && $conf !== null) {
                    $this->addFilter($filter, $config);
                }
            }
        }
        unset($this->registeredFilters);
    }

    protected function setupMemberVariables($config)
    {
        $this->host = $config->get('URI.Host');
        $base_uri = $config->get('URI.Base');
        if (!is_null($base_uri)) {
            $parser = new HTMLPurifier_URIParser();
            $this->base = $parser->parse($base_uri);
            $this->defaultScheme = $this->base->scheme;
            if (is_null($this->host)) $this->host = $this->base->host;
        }
        if (is_null($this->defaultScheme)) $this->defaultScheme = $config->get('URI.DefaultScheme');
    }

    public function getDefaultScheme($config, $context)
    {
        return HTMLPurifier_URISchemeRegistry::instance()->getScheme($this->defaultScheme, $config, $context);
    }

    public function filter(&$uri, $config, $context)
    {
        foreach ($this->filters as $name => $f) {
            $result = $f->filter($uri, $config, $context);
            if (!$result) return false;
        }
        return true;
    }

    public function postFilter(&$uri, $config, $context)
    {
        foreach ($this->postFilters as $name => $f) {
            $result = $f->filter($uri, $config, $context);
            if (!$result) return false;
        }
        return true;
    }

}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Filter/YouTube.php000064400000003452151214231100016520 0ustar00<?php

class HTMLPurifier_Filter_YouTube extends HTMLPurifier_Filter
{

    /**
     * @type string
     */
    public $name = 'YouTube';

    /**
     * @param string $html
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return string
     */
    public function preFilter($html, $config, $context)
    {
        $pre_regex = '#<object[^>]+>.+?' .
            '(?:http:)?//www.youtube.com/((?:v|cp)/[A-Za-z0-9\-_=]+).+?</object>#s';
        $pre_replace = '<span class="youtube-embed">\1</span>';
        return preg_replace($pre_regex, $pre_replace, $html);
    }

    /**
     * @param string $html
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return string
     */
    public function postFilter($html, $config, $context)
    {
        $post_regex = '#<span class="youtube-embed">((?:v|cp)/[A-Za-z0-9\-_=]+)</span>#';
        return preg_replace_callback($post_regex, array($this, 'postFilterCallback'), $html);
    }

    /**
     * @param $url
     * @return string
     */
    protected function armorUrl($url)
    {
        return str_replace('--', '-&#45;', $url);
    }

    /**
     * @param array $matches
     * @return string
     */
    protected function postFilterCallback($matches)
    {
        $url = $this->armorUrl($matches[1]);
        return '<object width="425" height="350" type="application/x-shockwave-flash" ' .
        'data="//www.youtube.com/' . $url . '">' .
        '<param name="movie" value="//www.youtube.com/' . $url . '"></param>' .
        '<!--[if IE]>' .
        '<embed src="//www.youtube.com/' . $url . '"' .
        'type="application/x-shockwave-flash"' .
        'wmode="transparent" width="425" height="350" />' .
        '<![endif]-->' .
        '</object>';
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Filter/ExtractStyleBlocks.php000064400000032444151214231100020720 0ustar00<?php

// why is this a top level function? Because PHP 5.2.0 doesn't seem to
// understand how to interpret this filter if it's a static method.
// It's all really silly, but if we go this route it might be reasonable
// to coalesce all of these methods into one.
function htmlpurifier_filter_extractstyleblocks_muteerrorhandler()
{
}

/**
 * This filter extracts <style> blocks from input HTML, cleans them up
 * using CSSTidy, and then places them in $purifier->context->get('StyleBlocks')
 * so they can be used elsewhere in the document.
 *
 * @note
 *      See tests/HTMLPurifier/Filter/ExtractStyleBlocksTest.php for
 *      sample usage.
 *
 * @note
 *      This filter can also be used on stylesheets not included in the
 *      document--something purists would probably prefer. Just directly
 *      call HTMLPurifier_Filter_ExtractStyleBlocks->cleanCSS()
 */
class HTMLPurifier_Filter_ExtractStyleBlocks extends HTMLPurifier_Filter
{
    /**
     * @type string
     */
    public $name = 'ExtractStyleBlocks';

    /**
     * @type array
     */
    private $_styleMatches = array();

    /**
     * @type csstidy
     */
    private $_tidy;

    /**
     * @type HTMLPurifier_AttrDef_HTML_ID
     */
    private $_id_attrdef;

    /**
     * @type HTMLPurifier_AttrDef_CSS_Ident
     */
    private $_class_attrdef;

    /**
     * @type HTMLPurifier_AttrDef_Enum
     */
    private $_enum_attrdef;

    public function __construct()
    {
        $this->_tidy = new csstidy();
        $this->_tidy->set_cfg('lowercase_s', false);
        $this->_id_attrdef = new HTMLPurifier_AttrDef_HTML_ID(true);
        $this->_class_attrdef = new HTMLPurifier_AttrDef_CSS_Ident();
        $this->_enum_attrdef = new HTMLPurifier_AttrDef_Enum(
            array(
                'first-child',
                'link',
                'visited',
                'active',
                'hover',
                'focus'
            )
        );
    }

    /**
     * Save the contents of CSS blocks to style matches
     * @param array $matches preg_replace style $matches array
     */
    protected function styleCallback($matches)
    {
        $this->_styleMatches[] = $matches[1];
    }

    /**
     * Removes inline <style> tags from HTML, saves them for later use
     * @param string $html
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return string
     * @todo Extend to indicate non-text/css style blocks
     */
    public function preFilter($html, $config, $context)
    {
        $tidy = $config->get('Filter.ExtractStyleBlocks.TidyImpl');
        if ($tidy !== null) {
            $this->_tidy = $tidy;
        }
        // NB: this must be NON-greedy because if we have
        // <style>foo</style>  <style>bar</style>
        // we must not grab foo</style>  <style>bar
        $html = preg_replace_callback('#<style(?:\s.*)?>(.*)<\/style>#isU', array($this, 'styleCallback'), $html);
        $style_blocks = $this->_styleMatches;
        $this->_styleMatches = array(); // reset
        $context->register('StyleBlocks', $style_blocks); // $context must not be reused
        if ($this->_tidy) {
            foreach ($style_blocks as &$style) {
                $style = $this->cleanCSS($style, $config, $context);
            }
        }
        return $html;
    }

    /**
     * Takes CSS (the stuff found in <style>) and cleans it.
     * @warning Requires CSSTidy <http://csstidy.sourceforge.net/>
     * @param string $css CSS styling to clean
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @throws HTMLPurifier_Exception
     * @return string Cleaned CSS
     */
    public function cleanCSS($css, $config, $context)
    {
        // prepare scope
        $scope = $config->get('Filter.ExtractStyleBlocks.Scope');
        if ($scope !== null) {
            $scopes = array_map('trim', explode(',', $scope));
        } else {
            $scopes = array();
        }
        // remove comments from CSS
        $css = trim($css);
        if (strncmp('<!--', $css, 4) === 0) {
            $css = substr($css, 4);
        }
        if (strlen($css) > 3 && substr($css, -3) == '-->') {
            $css = substr($css, 0, -3);
        }
        $css = trim($css);
        set_error_handler('htmlpurifier_filter_extractstyleblocks_muteerrorhandler');
        $this->_tidy->parse($css);
        restore_error_handler();
        $css_definition = $config->getDefinition('CSS');
        $html_definition = $config->getDefinition('HTML');
        $new_css = array();
        foreach ($this->_tidy->css as $k => $decls) {
            // $decls are all CSS declarations inside an @ selector
            $new_decls = array();
            foreach ($decls as $selector => $style) {
                $selector = trim($selector);
                if ($selector === '') {
                    continue;
                } // should not happen
                // Parse the selector
                // Here is the relevant part of the CSS grammar:
                //
                // ruleset
                //   : selector [ ',' S* selector ]* '{' ...
                // selector
                //   : simple_selector [ combinator selector | S+ [ combinator? selector ]? ]?
                // combinator
                //   : '+' S*
                //   : '>' S*
                // simple_selector
                //   : element_name [ HASH | class | attrib | pseudo ]*
                //   | [ HASH | class | attrib | pseudo ]+
                // element_name
                //   : IDENT | '*'
                //   ;
                // class
                //   : '.' IDENT
                //   ;
                // attrib
                //   : '[' S* IDENT S* [ [ '=' | INCLUDES | DASHMATCH ] S*
                //     [ IDENT | STRING ] S* ]? ']'
                //   ;
                // pseudo
                //   : ':' [ IDENT | FUNCTION S* [IDENT S*]? ')' ]
                //   ;
                //
                // For reference, here are the relevant tokens:
                //
                // HASH         #{name}
                // IDENT        {ident}
                // INCLUDES     ==
                // DASHMATCH    |=
                // STRING       {string}
                // FUNCTION     {ident}\(
                //
                // And the lexical scanner tokens
                //
                // name         {nmchar}+
                // nmchar       [_a-z0-9-]|{nonascii}|{escape}
                // nonascii     [\240-\377]
                // escape       {unicode}|\\[^\r\n\f0-9a-f]
                // unicode      \\{h}}{1,6}(\r\n|[ \t\r\n\f])?
                // ident        -?{nmstart}{nmchar*}
                // nmstart      [_a-z]|{nonascii}|{escape}
                // string       {string1}|{string2}
                // string1      \"([^\n\r\f\\"]|\\{nl}|{escape})*\"
                // string2      \'([^\n\r\f\\"]|\\{nl}|{escape})*\'
                //
                // We'll implement a subset (in order to reduce attack
                // surface); in particular:
                //
                //      - No Unicode support
                //      - No escapes support
                //      - No string support (by proxy no attrib support)
                //      - element_name is matched against allowed
                //        elements (some people might find this
                //        annoying...)
                //      - Pseudo-elements one of :first-child, :link,
                //        :visited, :active, :hover, :focus

                // handle ruleset
                $selectors = array_map('trim', explode(',', $selector));
                $new_selectors = array();
                foreach ($selectors as $sel) {
                    // split on +, > and spaces
                    $basic_selectors = preg_split('/\s*([+> ])\s*/', $sel, -1, PREG_SPLIT_DELIM_CAPTURE);
                    // even indices are chunks, odd indices are
                    // delimiters
                    $nsel = null;
                    $delim = null; // guaranteed to be non-null after
                    // two loop iterations
                    for ($i = 0, $c = count($basic_selectors); $i < $c; $i++) {
                        $x = $basic_selectors[$i];
                        if ($i % 2) {
                            // delimiter
                            if ($x === ' ') {
                                $delim = ' ';
                            } else {
                                $delim = ' ' . $x . ' ';
                            }
                        } else {
                            // simple selector
                            $components = preg_split('/([#.:])/', $x, -1, PREG_SPLIT_DELIM_CAPTURE);
                            $sdelim = null;
                            $nx = null;
                            for ($j = 0, $cc = count($components); $j < $cc; $j++) {
                                $y = $components[$j];
                                if ($j === 0) {
                                    if ($y === '*' || isset($html_definition->info[$y = strtolower($y)])) {
                                        $nx = $y;
                                    } else {
                                        // $nx stays null; this matters
                                        // if we don't manage to find
                                        // any valid selector content,
                                        // in which case we ignore the
                                        // outer $delim
                                    }
                                } elseif ($j % 2) {
                                    // set delimiter
                                    $sdelim = $y;
                                } else {
                                    $attrdef = null;
                                    if ($sdelim === '#') {
                                        $attrdef = $this->_id_attrdef;
                                    } elseif ($sdelim === '.') {
                                        $attrdef = $this->_class_attrdef;
                                    } elseif ($sdelim === ':') {
                                        $attrdef = $this->_enum_attrdef;
                                    } else {
                                        throw new HTMLPurifier_Exception('broken invariant sdelim and preg_split');
                                    }
                                    $r = $attrdef->validate($y, $config, $context);
                                    if ($r !== false) {
                                        if ($r !== true) {
                                            $y = $r;
                                        }
                                        if ($nx === null) {
                                            $nx = '';
                                        }
                                        $nx .= $sdelim . $y;
                                    }
                                }
                            }
                            if ($nx !== null) {
                                if ($nsel === null) {
                                    $nsel = $nx;
                                } else {
                                    $nsel .= $delim . $nx;
                                }
                            } else {
                                // delimiters to the left of invalid
                                // basic selector ignored
                            }
                        }
                    }
                    if ($nsel !== null) {
                        if (!empty($scopes)) {
                            foreach ($scopes as $s) {
                                $new_selectors[] = "$s $nsel";
                            }
                        } else {
                            $new_selectors[] = $nsel;
                        }
                    }
                }
                if (empty($new_selectors)) {
                    continue;
                }
                $selector = implode(', ', $new_selectors);
                foreach ($style as $name => $value) {
                    if (!isset($css_definition->info[$name])) {
                        unset($style[$name]);
                        continue;
                    }
                    $def = $css_definition->info[$name];
                    $ret = $def->validate($value, $config, $context);
                    if ($ret === false) {
                        unset($style[$name]);
                    } else {
                        $style[$name] = $ret;
                    }
                }
                $new_decls[$selector] = $style;
            }
            $new_css[$k] = $new_decls;
        }
        // remove stuff that shouldn't be used, could be reenabled
        // after security risks are analyzed
        $this->_tidy->css = $new_css;
        $this->_tidy->import = array();
        $this->_tidy->charset = null;
        $this->_tidy->namespace = null;
        $css = $this->_tidy->print->plain();
        // we are going to escape any special characters <>& to ensure
        // that no funny business occurs (i.e. </style> in a font-family prop).
        if ($config->get('Filter.ExtractStyleBlocks.Escaping')) {
            $css = str_replace(
                array('<', '>', '&'),
                array('\3C ', '\3E ', '\26 '),
                $css
            );
        }
        return $css;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/URIScheme/nntp.php000064400000001164151214231100016440 0ustar00<?php

/**
 * Validates nntp (Network News Transfer Protocol) as defined by generic RFC 1738
 */
class HTMLPurifier_URIScheme_nntp extends HTMLPurifier_URIScheme
{
    /**
     * @type int
     */
    public $default_port = 119;

    /**
     * @type bool
     */
    public $browsable = false;

    /**
     * @param HTMLPurifier_URI $uri
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool
     */
    public function doValidate(&$uri, $config, $context)
    {
        $uri->userinfo = null;
        $uri->query = null;
        return true;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/URIScheme/ftp.php000064400000003156151214231100016255 0ustar00<?php

/**
 * Validates ftp (File Transfer Protocol) URIs as defined by generic RFC 1738.
 */
class HTMLPurifier_URIScheme_ftp extends HTMLPurifier_URIScheme
{
    /**
     * @type int
     */
    public $default_port = 21;

    /**
     * @type bool
     */
    public $browsable = true; // usually

    /**
     * @type bool
     */
    public $hierarchical = true;

    /**
     * @param HTMLPurifier_URI $uri
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool
     */
    public function doValidate(&$uri, $config, $context)
    {
        $uri->query = null;

        // typecode check
        $semicolon_pos = strrpos($uri->path, ';'); // reverse
        if ($semicolon_pos !== false) {
            $type = substr($uri->path, $semicolon_pos + 1); // no semicolon
            $uri->path = substr($uri->path, 0, $semicolon_pos);
            $type_ret = '';
            if (strpos($type, '=') !== false) {
                // figure out whether or not the declaration is correct
                list($key, $typecode) = explode('=', $type, 2);
                if ($key !== 'type') {
                    // invalid key, tack it back on encoded
                    $uri->path .= '%3B' . $type;
                } elseif ($typecode === 'a' || $typecode === 'i' || $typecode === 'd') {
                    $type_ret = ";type=$typecode";
                }
            } else {
                $uri->path .= '%3B' . $type;
            }
            $uri->path = str_replace(';', '%3B', $uri->path);
            $uri->path .= $type_ret;
        }
        return true;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/URIScheme/https.php000064400000000452151214231100016622 0ustar00<?php

/**
 * Validates https (Secure HTTP) according to http scheme.
 */
class HTMLPurifier_URIScheme_https extends HTMLPurifier_URIScheme_http
{
    /**
     * @type int
     */
    public $default_port = 443;
    /**
     * @type bool
     */
    public $secure = true;
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/URIScheme/http.php000064400000001217151214231100016437 0ustar00<?php

/**
 * Validates http (HyperText Transfer Protocol) as defined by RFC 2616
 */
class HTMLPurifier_URIScheme_http extends HTMLPurifier_URIScheme
{
    /**
     * @type int
     */
    public $default_port = 80;

    /**
     * @type bool
     */
    public $browsable = true;

    /**
     * @type bool
     */
    public $hierarchical = true;

    /**
     * @param HTMLPurifier_URI $uri
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool
     */
    public function doValidate(&$uri, $config, $context)
    {
        $uri->userinfo = null;
        return true;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/URIScheme/mailto.php000064400000001575151214231100016754 0ustar00<?php

// VERY RELAXED! Shouldn't cause problems, not even Firefox checks if the
// email is valid, but be careful!

/**
 * Validates mailto (for E-mail) according to RFC 2368
 * @todo Validate the email address
 * @todo Filter allowed query parameters
 */

class HTMLPurifier_URIScheme_mailto extends HTMLPurifier_URIScheme
{
    /**
     * @type bool
     */
    public $browsable = false;

    /**
     * @type bool
     */
    public $may_omit_host = true;

    /**
     * @param HTMLPurifier_URI $uri
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool
     */
    public function doValidate(&$uri, $config, $context)
    {
        $uri->userinfo = null;
        $uri->host     = null;
        $uri->port     = null;
        // we need to validate path against RFC 2368's addr-spec
        return true;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/URIScheme/data.php000064400000010416151214231100016372 0ustar00<?php

/**
 * Implements data: URI for base64 encoded images supported by GD.
 */
class HTMLPurifier_URIScheme_data extends HTMLPurifier_URIScheme
{
    /**
     * @type bool
     */
    public $browsable = true;

    /**
     * @type array
     */
    public $allowed_types = array(
        // you better write validation code for other types if you
        // decide to allow them
        'image/jpeg' => true,
        'image/gif' => true,
        'image/png' => true,
    );
    // this is actually irrelevant since we only write out the path
    // component
    /**
     * @type bool
     */
    public $may_omit_host = true;

    /**
     * @param HTMLPurifier_URI $uri
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool
     */
    public function doValidate(&$uri, $config, $context)
    {
        $result = explode(',', $uri->path, 2);
        $is_base64 = false;
        $charset = null;
        $content_type = null;
        if (count($result) == 2) {
            list($metadata, $data) = $result;
            // do some legwork on the metadata
            $metas = explode(';', $metadata);
            while (!empty($metas)) {
                $cur = array_shift($metas);
                if ($cur == 'base64') {
                    $is_base64 = true;
                    break;
                }
                if (substr($cur, 0, 8) == 'charset=') {
                    // doesn't match if there are arbitrary spaces, but
                    // whatever dude
                    if ($charset !== null) {
                        continue;
                    } // garbage
                    $charset = substr($cur, 8); // not used
                } else {
                    if ($content_type !== null) {
                        continue;
                    } // garbage
                    $content_type = $cur;
                }
            }
        } else {
            $data = $result[0];
        }
        if ($content_type !== null && empty($this->allowed_types[$content_type])) {
            return false;
        }
        if ($charset !== null) {
            // error; we don't allow plaintext stuff
            $charset = null;
        }
        $data = rawurldecode($data);
        if ($is_base64) {
            $raw_data = base64_decode($data);
        } else {
            $raw_data = $data;
        }
        if ( strlen($raw_data) < 12 ) {
            // error; exif_imagetype throws exception with small files,
            // and this likely indicates a corrupt URI/failed parse anyway
            return false;
        }
        // XXX probably want to refactor this into a general mechanism
        // for filtering arbitrary content types
        if (function_exists('sys_get_temp_dir')) {
            $file = tempnam(sys_get_temp_dir(), "");
        } else {
            $file = tempnam("/tmp", "");
        }
        file_put_contents($file, $raw_data);
        if (function_exists('exif_imagetype')) {
            $image_code = exif_imagetype($file);
            unlink($file);
        } elseif (function_exists('getimagesize')) {
            set_error_handler(array($this, 'muteErrorHandler'));
            $info = getimagesize($file);
            restore_error_handler();
            unlink($file);
            if ($info == false) {
                return false;
            }
            $image_code = $info[2];
        } else {
            trigger_error("could not find exif_imagetype or getimagesize functions", E_USER_ERROR);
        }
        $real_content_type = image_type_to_mime_type($image_code);
        if ($real_content_type != $content_type) {
            // we're nice guys; if the content type is something else we
            // support, change it over
            if (empty($this->allowed_types[$real_content_type])) {
                return false;
            }
            $content_type = $real_content_type;
        }
        // ok, it's kosher, rewrite what we need
        $uri->userinfo = null;
        $uri->host = null;
        $uri->port = null;
        $uri->fragment = null;
        $uri->query = null;
        $uri->path = "$content_type;base64," . base64_encode($raw_data);
        return true;
    }

    /**
     * @param int $errno
     * @param string $errstr
     */
    public function muteErrorHandler($errno, $errstr)
    {
    }
}
htmlpurifier/library/HTMLPurifier/URIScheme/file.php000064400000002374151214231100016404 0ustar00<?php

/**
 * Validates file as defined by RFC 1630 and RFC 1738.
 */
class HTMLPurifier_URIScheme_file extends HTMLPurifier_URIScheme
{
    /**
     * Generally file:// URLs are not accessible from most
     * machines, so placing them as an img src is incorrect.
     * @type bool
     */
    public $browsable = false;

    /**
     * Basically the *only* URI scheme for which this is true, since
     * accessing files on the local machine is very common.  In fact,
     * browsers on some operating systems don't understand the
     * authority, though I hear it is used on Windows to refer to
     * network shares.
     * @type bool
     */
    public $may_omit_host = true;

    /**
     * @param HTMLPurifier_URI $uri
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool
     */
    public function doValidate(&$uri, $config, $context)
    {
        // Authentication method is not supported
        $uri->userinfo = null;
        // file:// makes no provisions for accessing the resource
        $uri->port = null;
        // While it seems to work on Firefox, the querystring has
        // no possible effect and is thus stripped.
        $uri->query = null;
        return true;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/URIScheme/news.php000064400000001276151214231100016441 0ustar00<?php

/**
 * Validates news (Usenet) as defined by generic RFC 1738
 */
class HTMLPurifier_URIScheme_news extends HTMLPurifier_URIScheme
{
    /**
     * @type bool
     */
    public $browsable = false;

    /**
     * @type bool
     */
    public $may_omit_host = true;

    /**
     * @param HTMLPurifier_URI $uri
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool
     */
    public function doValidate(&$uri, $config, $context)
    {
        $uri->userinfo = null;
        $uri->host = null;
        $uri->port = null;
        $uri->query = null;
        // typecode check needed on path
        return true;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/URIScheme/tel.php000064400000002230151214231100016240 0ustar00<?php

/**
 * Validates tel (for phone numbers).
 *
 * The relevant specifications for this protocol are RFC 3966 and RFC 5341,
 * but this class takes a much simpler approach: we normalize phone
 * numbers so that they only include (possibly) a leading plus,
 * and then any number of digits and x'es.
 */

class HTMLPurifier_URIScheme_tel extends HTMLPurifier_URIScheme
{
    /**
     * @type bool
     */
    public $browsable = false;

    /**
     * @type bool
     */
    public $may_omit_host = true;

    /**
     * @param HTMLPurifier_URI $uri
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool
     */
    public function doValidate(&$uri, $config, $context)
    {
        $uri->userinfo = null;
        $uri->host     = null;
        $uri->port     = null;

        // Delete all non-numeric characters, non-x characters
        // from phone number, EXCEPT for a leading plus sign.
        $uri->path = preg_replace('/(?!^\+)[^\dx]/', '',
                     // Normalize e(x)tension to lower-case
                     str_replace('X', 'x', $uri->path));

        return true;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Lexer/DOMLex.php000064400000030257151214231100016051 0ustar00<?php

/**
 * Parser that uses PHP 5's DOM extension (part of the core).
 *
 * In PHP 5, the DOM XML extension was revamped into DOM and added to the core.
 * It gives us a forgiving HTML parser, which we use to transform the HTML
 * into a DOM, and then into the tokens.  It is blazingly fast (for large
 * documents, it performs twenty times faster than
 * HTMLPurifier_Lexer_DirectLex,and is the default choice for PHP 5.
 *
 * @note Any empty elements will have empty tokens associated with them, even if
 * this is prohibited by the spec. This is cannot be fixed until the spec
 * comes into play.
 *
 * @note PHP's DOM extension does not actually parse any entities, we use
 *       our own function to do that.
 *
 * @warning DOM tends to drop whitespace, which may wreak havoc on indenting.
 *          If this is a huge problem, due to the fact that HTML is hand
 *          edited and you are unable to get a parser cache that caches the
 *          the output of HTML Purifier while keeping the original HTML lying
 *          around, you may want to run Tidy on the resulting output or use
 *          HTMLPurifier_DirectLex
 */

class HTMLPurifier_Lexer_DOMLex extends HTMLPurifier_Lexer
{

    /**
     * @type HTMLPurifier_TokenFactory
     */
    private $factory;

    public function __construct()
    {
        // setup the factory
        parent::__construct();
        $this->factory = new HTMLPurifier_TokenFactory();
    }

    /**
     * @param string $html
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return HTMLPurifier_Token[]
     */
    public function tokenizeHTML($html, $config, $context)
    {
        $html = $this->normalize($html, $config, $context);

        // attempt to armor stray angled brackets that cannot possibly
        // form tags and thus are probably being used as emoticons
        if ($config->get('Core.AggressivelyFixLt')) {
            $char = '[^a-z!\/]';
            $comment = "/<!--(.*?)(-->|\z)/is";
            $html = preg_replace_callback($comment, array($this, 'callbackArmorCommentEntities'), $html);
            do {
                $old = $html;
                $html = preg_replace("/<($char)/i", '&lt;\\1', $html);
            } while ($html !== $old);
            $html = preg_replace_callback($comment, array($this, 'callbackUndoCommentSubst'), $html); // fix comments
        }

        // preprocess html, essential for UTF-8
        $html = $this->wrapHTML($html, $config, $context);

        $doc = new DOMDocument();
        $doc->encoding = 'UTF-8'; // theoretically, the above has this covered

        $options = 0;
        if ($config->get('Core.AllowParseManyTags') && defined('LIBXML_PARSEHUGE')) {
            $options |= LIBXML_PARSEHUGE;
        }

        set_error_handler(array($this, 'muteErrorHandler'));
        // loadHTML() fails on PHP 5.3 when second parameter is given
        if ($options) {
            $doc->loadHTML($html, $options);
        } else {
            $doc->loadHTML($html);
        }
        restore_error_handler();

        $body = $doc->getElementsByTagName('html')->item(0)-> // <html>
                      getElementsByTagName('body')->item(0);  // <body>

        $div = $body->getElementsByTagName('div')->item(0); // <div>
        $tokens = array();
        $this->tokenizeDOM($div, $tokens, $config);
        // If the div has a sibling, that means we tripped across
        // a premature </div> tag.  So remove the div we parsed,
        // and then tokenize the rest of body.  We can't tokenize
        // the sibling directly as we'll lose the tags in that case.
        if ($div->nextSibling) {
            $body->removeChild($div);
            $this->tokenizeDOM($body, $tokens, $config);
        }
        return $tokens;
    }

    /**
     * Iterative function that tokenizes a node, putting it into an accumulator.
     * To iterate is human, to recurse divine - L. Peter Deutsch
     * @param DOMNode $node DOMNode to be tokenized.
     * @param HTMLPurifier_Token[] $tokens   Array-list of already tokenized tokens.
     * @return HTMLPurifier_Token of node appended to previously passed tokens.
     */
    protected function tokenizeDOM($node, &$tokens, $config)
    {
        $level = 0;
        $nodes = array($level => new HTMLPurifier_Queue(array($node)));
        $closingNodes = array();
        do {
            while (!$nodes[$level]->isEmpty()) {
                $node = $nodes[$level]->shift(); // FIFO
                $collect = $level > 0 ? true : false;
                $needEndingTag = $this->createStartNode($node, $tokens, $collect, $config);
                if ($needEndingTag) {
                    $closingNodes[$level][] = $node;
                }
                if ($node->childNodes && $node->childNodes->length) {
                    $level++;
                    $nodes[$level] = new HTMLPurifier_Queue();
                    foreach ($node->childNodes as $childNode) {
                        $nodes[$level]->push($childNode);
                    }
                }
            }
            $level--;
            if ($level && isset($closingNodes[$level])) {
                while ($node = array_pop($closingNodes[$level])) {
                    $this->createEndNode($node, $tokens);
                }
            }
        } while ($level > 0);
    }

    /**
     * Portably retrieve the tag name of a node; deals with older versions
     * of libxml like 2.7.6
     * @param DOMNode $node
     */
    protected function getTagName($node)
    {
        if (isset($node->tagName)) {
            return $node->tagName;
        } else if (isset($node->nodeName)) {
            return $node->nodeName;
        } else if (isset($node->localName)) {
            return $node->localName;
        }
        return null;
    }

    /**
     * Portably retrieve the data of a node; deals with older versions
     * of libxml like 2.7.6
     * @param DOMNode $node
     */
    protected function getData($node)
    {
        if (isset($node->data)) {
            return $node->data;
        } else if (isset($node->nodeValue)) {
            return $node->nodeValue;
        } else if (isset($node->textContent)) {
            return $node->textContent;
        }
        return null;
    }


    /**
     * @param DOMNode $node DOMNode to be tokenized.
     * @param HTMLPurifier_Token[] $tokens   Array-list of already tokenized tokens.
     * @param bool $collect  Says whether or start and close are collected, set to
     *                    false at first recursion because it's the implicit DIV
     *                    tag you're dealing with.
     * @return bool if the token needs an endtoken
     * @todo data and tagName properties don't seem to exist in DOMNode?
     */
    protected function createStartNode($node, &$tokens, $collect, $config)
    {
        // intercept non element nodes. WE MUST catch all of them,
        // but we're not getting the character reference nodes because
        // those should have been preprocessed
        if ($node->nodeType === XML_TEXT_NODE) {
            $data = $this->getData($node); // Handle variable data property
            if ($data !== null) {
              $tokens[] = $this->factory->createText($data);
            }
            return false;
        } elseif ($node->nodeType === XML_CDATA_SECTION_NODE) {
            // undo libxml's special treatment of <script> and <style> tags
            $last = end($tokens);
            $data = $node->data;
            // (note $node->tagname is already normalized)
            if ($last instanceof HTMLPurifier_Token_Start && ($last->name == 'script' || $last->name == 'style')) {
                $new_data = trim($data);
                if (substr($new_data, 0, 4) === '<!--') {
                    $data = substr($new_data, 4);
                    if (substr($data, -3) === '-->') {
                        $data = substr($data, 0, -3);
                    } else {
                        // Highly suspicious! Not sure what to do...
                    }
                }
            }
            $tokens[] = $this->factory->createText($this->parseText($data, $config));
            return false;
        } elseif ($node->nodeType === XML_COMMENT_NODE) {
            // this is code is only invoked for comments in script/style in versions
            // of libxml pre-2.6.28 (regular comments, of course, are still
            // handled regularly)
            $tokens[] = $this->factory->createComment($node->data);
            return false;
        } elseif ($node->nodeType !== XML_ELEMENT_NODE) {
            // not-well tested: there may be other nodes we have to grab
            return false;
        }
        $attr = $node->hasAttributes() ? $this->transformAttrToAssoc($node->attributes) : array();
        $tag_name = $this->getTagName($node); // Handle variable tagName property
        if (empty($tag_name)) {
            return (bool) $node->childNodes->length;
        }
        // We still have to make sure that the element actually IS empty
        if (!$node->childNodes->length) {
            if ($collect) {
                $tokens[] = $this->factory->createEmpty($tag_name, $attr);
            }
            return false;
        } else {
            if ($collect) {
                $tokens[] = $this->factory->createStart($tag_name, $attr);
            }
            return true;
        }
    }

    /**
     * @param DOMNode $node
     * @param HTMLPurifier_Token[] $tokens
     */
    protected function createEndNode($node, &$tokens)
    {
        $tag_name = $this->getTagName($node); // Handle variable tagName property
        $tokens[] = $this->factory->createEnd($tag_name);
    }

    /**
     * Converts a DOMNamedNodeMap of DOMAttr objects into an assoc array.
     *
     * @param DOMNamedNodeMap $node_map DOMNamedNodeMap of DOMAttr objects.
     * @return array Associative array of attributes.
     */
    protected function transformAttrToAssoc($node_map)
    {
        // NamedNodeMap is documented very well, so we're using undocumented
        // features, namely, the fact that it implements Iterator and
        // has a ->length attribute
        if ($node_map->length === 0) {
            return array();
        }
        $array = array();
        foreach ($node_map as $attr) {
            $array[$attr->name] = $attr->value;
        }
        return $array;
    }

    /**
     * An error handler that mutes all errors
     * @param int $errno
     * @param string $errstr
     */
    public function muteErrorHandler($errno, $errstr)
    {
    }

    /**
     * Callback function for undoing escaping of stray angled brackets
     * in comments
     * @param array $matches
     * @return string
     */
    public function callbackUndoCommentSubst($matches)
    {
        return '<!--' . strtr($matches[1], array('&amp;' => '&', '&lt;' => '<')) . $matches[2];
    }

    /**
     * Callback function that entity-izes ampersands in comments so that
     * callbackUndoCommentSubst doesn't clobber them
     * @param array $matches
     * @return string
     */
    public function callbackArmorCommentEntities($matches)
    {
        return '<!--' . str_replace('&', '&amp;', $matches[1]) . $matches[2];
    }

    /**
     * Wraps an HTML fragment in the necessary HTML
     * @param string $html
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return string
     */
    protected function wrapHTML($html, $config, $context, $use_div = true)
    {
        $def = $config->getDefinition('HTML');
        $ret = '';

        if (!empty($def->doctype->dtdPublic) || !empty($def->doctype->dtdSystem)) {
            $ret .= '<!DOCTYPE html ';
            if (!empty($def->doctype->dtdPublic)) {
                $ret .= 'PUBLIC "' . $def->doctype->dtdPublic . '" ';
            }
            if (!empty($def->doctype->dtdSystem)) {
                $ret .= '"' . $def->doctype->dtdSystem . '" ';
            }
            $ret .= '>';
        }

        $ret .= '<html><head>';
        $ret .= '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';
        // No protection if $html contains a stray </div>!
        $ret .= '</head><body>';
        if ($use_div) $ret .= '<div>';
        $ret .= $html;
        if ($use_div) $ret .= '</div>';
        $ret .= '</body></html>';
        return $ret;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Lexer/PH5P.php000064400000544465151214231100015510 0ustar00<?php

/**
 * Experimental HTML5-based parser using Jeroen van der Meer's PH5P library.
 * Occupies space in the HTML5 pseudo-namespace, which may cause conflicts.
 *
 * @note
 *    Recent changes to PHP's DOM extension have resulted in some fatal
 *    error conditions with the original version of PH5P. Pending changes,
 *    this lexer will punt to DirectLex if DOM throws an exception.
 */

class HTMLPurifier_Lexer_PH5P extends HTMLPurifier_Lexer_DOMLex
{
    /**
     * @param string $html
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return HTMLPurifier_Token[]
     */
    public function tokenizeHTML($html, $config, $context)
    {
        $new_html = $this->normalize($html, $config, $context);
        $new_html = $this->wrapHTML($new_html, $config, $context, false /* no div */);
        try {
            $parser = new HTML5($new_html);
            $doc = $parser->save();
        } catch (DOMException $e) {
            // Uh oh, it failed. Punt to DirectLex.
            $lexer = new HTMLPurifier_Lexer_DirectLex();
            $context->register('PH5PError', $e); // save the error, so we can detect it
            return $lexer->tokenizeHTML($html, $config, $context); // use original HTML
        }
        $tokens = array();
        $this->tokenizeDOM(
            $doc->getElementsByTagName('html')->item(0)-> // <html>
                  getElementsByTagName('body')->item(0) //   <body>
            ,
            $tokens, $config
        );
        return $tokens;
    }
}

/*

Copyright 2007 Jeroen van der Meer <http://jero.net/>

Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

*/

class HTML5
{
    private $data;
    private $char;
    private $EOF;
    private $state;
    private $tree;
    private $token;
    private $content_model;
    private $escape = false;
    private $entities = array(
        'AElig;',
        'AElig',
        'AMP;',
        'AMP',
        'Aacute;',
        'Aacute',
        'Acirc;',
        'Acirc',
        'Agrave;',
        'Agrave',
        'Alpha;',
        'Aring;',
        'Aring',
        'Atilde;',
        'Atilde',
        'Auml;',
        'Auml',
        'Beta;',
        'COPY;',
        'COPY',
        'Ccedil;',
        'Ccedil',
        'Chi;',
        'Dagger;',
        'Delta;',
        'ETH;',
        'ETH',
        'Eacute;',
        'Eacute',
        'Ecirc;',
        'Ecirc',
        'Egrave;',
        'Egrave',
        'Epsilon;',
        'Eta;',
        'Euml;',
        'Euml',
        'GT;',
        'GT',
        'Gamma;',
        'Iacute;',
        'Iacute',
        'Icirc;',
        'Icirc',
        'Igrave;',
        'Igrave',
        'Iota;',
        'Iuml;',
        'Iuml',
        'Kappa;',
        'LT;',
        'LT',
        'Lambda;',
        'Mu;',
        'Ntilde;',
        'Ntilde',
        'Nu;',
        'OElig;',
        'Oacute;',
        'Oacute',
        'Ocirc;',
        'Ocirc',
        'Ograve;',
        'Ograve',
        'Omega;',
        'Omicron;',
        'Oslash;',
        'Oslash',
        'Otilde;',
        'Otilde',
        'Ouml;',
        'Ouml',
        'Phi;',
        'Pi;',
        'Prime;',
        'Psi;',
        'QUOT;',
        'QUOT',
        'REG;',
        'REG',
        'Rho;',
        'Scaron;',
        'Sigma;',
        'THORN;',
        'THORN',
        'TRADE;',
        'Tau;',
        'Theta;',
        'Uacute;',
        'Uacute',
        'Ucirc;',
        'Ucirc',
        'Ugrave;',
        'Ugrave',
        'Upsilon;',
        'Uuml;',
        'Uuml',
        'Xi;',
        'Yacute;',
        'Yacute',
        'Yuml;',
        'Zeta;',
        'aacute;',
        'aacute',
        'acirc;',
        'acirc',
        'acute;',
        'acute',
        'aelig;',
        'aelig',
        'agrave;',
        'agrave',
        'alefsym;',
        'alpha;',
        'amp;',
        'amp',
        'and;',
        'ang;',
        'apos;',
        'aring;',
        'aring',
        'asymp;',
        'atilde;',
        'atilde',
        'auml;',
        'auml',
        'bdquo;',
        'beta;',
        'brvbar;',
        'brvbar',
        'bull;',
        'cap;',
        'ccedil;',
        'ccedil',
        'cedil;',
        'cedil',
        'cent;',
        'cent',
        'chi;',
        'circ;',
        'clubs;',
        'cong;',
        'copy;',
        'copy',
        'crarr;',
        'cup;',
        'curren;',
        'curren',
        'dArr;',
        'dagger;',
        'darr;',
        'deg;',
        'deg',
        'delta;',
        'diams;',
        'divide;',
        'divide',
        'eacute;',
        'eacute',
        'ecirc;',
        'ecirc',
        'egrave;',
        'egrave',
        'empty;',
        'emsp;',
        'ensp;',
        'epsilon;',
        'equiv;',
        'eta;',
        'eth;',
        'eth',
        'euml;',
        'euml',
        'euro;',
        'exist;',
        'fnof;',
        'forall;',
        'frac12;',
        'frac12',
        'frac14;',
        'frac14',
        'frac34;',
        'frac34',
        'frasl;',
        'gamma;',
        'ge;',
        'gt;',
        'gt',
        'hArr;',
        'harr;',
        'hearts;',
        'hellip;',
        'iacute;',
        'iacute',
        'icirc;',
        'icirc',
        'iexcl;',
        'iexcl',
        'igrave;',
        'igrave',
        'image;',
        'infin;',
        'int;',
        'iota;',
        'iquest;',
        'iquest',
        'isin;',
        'iuml;',
        'iuml',
        'kappa;',
        'lArr;',
        'lambda;',
        'lang;',
        'laquo;',
        'laquo',
        'larr;',
        'lceil;',
        'ldquo;',
        'le;',
        'lfloor;',
        'lowast;',
        'loz;',
        'lrm;',
        'lsaquo;',
        'lsquo;',
        'lt;',
        'lt',
        'macr;',
        'macr',
        'mdash;',
        'micro;',
        'micro',
        'middot;',
        'middot',
        'minus;',
        'mu;',
        'nabla;',
        'nbsp;',
        'nbsp',
        'ndash;',
        'ne;',
        'ni;',
        'not;',
        'not',
        'notin;',
        'nsub;',
        'ntilde;',
        'ntilde',
        'nu;',
        'oacute;',
        'oacute',
        'ocirc;',
        'ocirc',
        'oelig;',
        'ograve;',
        'ograve',
        'oline;',
        'omega;',
        'omicron;',
        'oplus;',
        'or;',
        'ordf;',
        'ordf',
        'ordm;',
        'ordm',
        'oslash;',
        'oslash',
        'otilde;',
        'otilde',
        'otimes;',
        'ouml;',
        'ouml',
        'para;',
        'para',
        'part;',
        'permil;',
        'perp;',
        'phi;',
        'pi;',
        'piv;',
        'plusmn;',
        'plusmn',
        'pound;',
        'pound',
        'prime;',
        'prod;',
        'prop;',
        'psi;',
        'quot;',
        'quot',
        'rArr;',
        'radic;',
        'rang;',
        'raquo;',
        'raquo',
        'rarr;',
        'rceil;',
        'rdquo;',
        'real;',
        'reg;',
        'reg',
        'rfloor;',
        'rho;',
        'rlm;',
        'rsaquo;',
        'rsquo;',
        'sbquo;',
        'scaron;',
        'sdot;',
        'sect;',
        'sect',
        'shy;',
        'shy',
        'sigma;',
        'sigmaf;',
        'sim;',
        'spades;',
        'sub;',
        'sube;',
        'sum;',
        'sup1;',
        'sup1',
        'sup2;',
        'sup2',
        'sup3;',
        'sup3',
        'sup;',
        'supe;',
        'szlig;',
        'szlig',
        'tau;',
        'there4;',
        'theta;',
        'thetasym;',
        'thinsp;',
        'thorn;',
        'thorn',
        'tilde;',
        'times;',
        'times',
        'trade;',
        'uArr;',
        'uacute;',
        'uacute',
        'uarr;',
        'ucirc;',
        'ucirc',
        'ugrave;',
        'ugrave',
        'uml;',
        'uml',
        'upsih;',
        'upsilon;',
        'uuml;',
        'uuml',
        'weierp;',
        'xi;',
        'yacute;',
        'yacute',
        'yen;',
        'yen',
        'yuml;',
        'yuml',
        'zeta;',
        'zwj;',
        'zwnj;'
    );

    const PCDATA = 0;
    const RCDATA = 1;
    const CDATA = 2;
    const PLAINTEXT = 3;

    const DOCTYPE = 0;
    const STARTTAG = 1;
    const ENDTAG = 2;
    const COMMENT = 3;
    const CHARACTR = 4;
    const EOF = 5;

    public function __construct($data)
    {
        $this->data = $data;
        $this->char = -1;
        $this->EOF = strlen($data);
        $this->tree = new HTML5TreeConstructer;
        $this->content_model = self::PCDATA;

        $this->state = 'data';

        while ($this->state !== null) {
            $this->{$this->state . 'State'}();
        }
    }

    public function save()
    {
        return $this->tree->save();
    }

    private function char()
    {
        return ($this->char < $this->EOF)
            ? $this->data[$this->char]
            : false;
    }

    private function character($s, $l = 0)
    {
        if ($s + $l < $this->EOF) {
            if ($l === 0) {
                return $this->data[$s];
            } else {
                return substr($this->data, $s, $l);
            }
        }
    }

    private function characters($char_class, $start)
    {
        return preg_replace('#^([' . $char_class . ']+).*#s', '\\1', substr($this->data, $start));
    }

    private function dataState()
    {
        // Consume the next input character
        $this->char++;
        $char = $this->char();

        if ($char === '&' && ($this->content_model === self::PCDATA || $this->content_model === self::RCDATA)) {
            /* U+0026 AMPERSAND (&)
            When the content model flag is set to one of the PCDATA or RCDATA
            states: switch to the entity data state. Otherwise: treat it as per
            the "anything else"    entry below. */
            $this->state = 'entityData';

        } elseif ($char === '-') {
            /* If the content model flag is set to either the RCDATA state or
            the CDATA state, and the escape flag is false, and there are at
            least three characters before this one in the input stream, and the
            last four characters in the input stream, including this one, are
            U+003C LESS-THAN SIGN, U+0021 EXCLAMATION MARK, U+002D HYPHEN-MINUS,
            and U+002D HYPHEN-MINUS ("<!--"), then set the escape flag to true. */
            if (($this->content_model === self::RCDATA || $this->content_model ===
                    self::CDATA) && $this->escape === false &&
                $this->char >= 3 && $this->character($this->char - 4, 4) === '<!--'
            ) {
                $this->escape = true;
            }

            /* In any case, emit the input character as a character token. Stay
            in the data state. */
            $this->emitToken(
                array(
                    'type' => self::CHARACTR,
                    'data' => $char
                )
            );

            /* U+003C LESS-THAN SIGN (<) */
        } elseif ($char === '<' && ($this->content_model === self::PCDATA ||
                (($this->content_model === self::RCDATA ||
                        $this->content_model === self::CDATA) && $this->escape === false))
        ) {
            /* When the content model flag is set to the PCDATA state: switch
            to the tag open state.

            When the content model flag is set to either the RCDATA state or
            the CDATA state and the escape flag is false: switch to the tag
            open state.

            Otherwise: treat it as per the "anything else" entry below. */
            $this->state = 'tagOpen';

            /* U+003E GREATER-THAN SIGN (>) */
        } elseif ($char === '>') {
            /* If the content model flag is set to either the RCDATA state or
            the CDATA state, and the escape flag is true, and the last three
            characters in the input stream including this one are U+002D
            HYPHEN-MINUS, U+002D HYPHEN-MINUS, U+003E GREATER-THAN SIGN ("-->"),
            set the escape flag to false. */
            if (($this->content_model === self::RCDATA ||
                    $this->content_model === self::CDATA) && $this->escape === true &&
                $this->character($this->char, 3) === '-->'
            ) {
                $this->escape = false;
            }

            /* In any case, emit the input character as a character token.
            Stay in the data state. */
            $this->emitToken(
                array(
                    'type' => self::CHARACTR,
                    'data' => $char
                )
            );

        } elseif ($this->char === $this->EOF) {
            /* EOF
            Emit an end-of-file token. */
            $this->EOF();

        } elseif ($this->content_model === self::PLAINTEXT) {
            /* When the content model flag is set to the PLAINTEXT state
            THIS DIFFERS GREATLY FROM THE SPEC: Get the remaining characters of
            the text and emit it as a character token. */
            $this->emitToken(
                array(
                    'type' => self::CHARACTR,
                    'data' => substr($this->data, $this->char)
                )
            );

            $this->EOF();

        } else {
            /* Anything else
            THIS DIFFERS GREATLY FROM THE SPEC: Get as many character that
            otherwise would also be treated as a character token and emit it
            as a single character token. Stay in the data state. */
            $len = strcspn($this->data, '<&', $this->char);
            $char = substr($this->data, $this->char, $len);
            $this->char += $len - 1;

            $this->emitToken(
                array(
                    'type' => self::CHARACTR,
                    'data' => $char
                )
            );

            $this->state = 'data';
        }
    }

    private function entityDataState()
    {
        // Attempt to consume an entity.
        $entity = $this->entity();

        // If nothing is returned, emit a U+0026 AMPERSAND character token.
        // Otherwise, emit the character token that was returned.
        $char = (!$entity) ? '&' : $entity;
        $this->emitToken(
            array(
                'type' => self::CHARACTR,
                'data' => $char
            )
        );

        // Finally, switch to the data state.
        $this->state = 'data';
    }

    private function tagOpenState()
    {
        switch ($this->content_model) {
            case self::RCDATA:
            case self::CDATA:
                /* If the next input character is a U+002F SOLIDUS (/) character,
                consume it and switch to the close tag open state. If the next
                input character is not a U+002F SOLIDUS (/) character, emit a
                U+003C LESS-THAN SIGN character token and switch to the data
                state to process the next input character. */
                if ($this->character($this->char + 1) === '/') {
                    $this->char++;
                    $this->state = 'closeTagOpen';

                } else {
                    $this->emitToken(
                        array(
                            'type' => self::CHARACTR,
                            'data' => '<'
                        )
                    );

                    $this->state = 'data';
                }
                break;

            case self::PCDATA:
                // If the content model flag is set to the PCDATA state
                // Consume the next input character:
                $this->char++;
                $char = $this->char();

                if ($char === '!') {
                    /* U+0021 EXCLAMATION MARK (!)
                    Switch to the markup declaration open state. */
                    $this->state = 'markupDeclarationOpen';

                } elseif ($char === '/') {
                    /* U+002F SOLIDUS (/)
                    Switch to the close tag open state. */
                    $this->state = 'closeTagOpen';

                } elseif (preg_match('/^[A-Za-z]$/', $char)) {
                    /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z
                    Create a new start tag token, set its tag name to the lowercase
                    version of the input character (add 0x0020 to the character's code
                    point), then switch to the tag name state. (Don't emit the token
                    yet; further details will be filled in before it is emitted.) */
                    $this->token = array(
                        'name' => strtolower($char),
                        'type' => self::STARTTAG,
                        'attr' => array()
                    );

                    $this->state = 'tagName';

                } elseif ($char === '>') {
                    /* U+003E GREATER-THAN SIGN (>)
                    Parse error. Emit a U+003C LESS-THAN SIGN character token and a
                    U+003E GREATER-THAN SIGN character token. Switch to the data state. */
                    $this->emitToken(
                        array(
                            'type' => self::CHARACTR,
                            'data' => '<>'
                        )
                    );

                    $this->state = 'data';

                } elseif ($char === '?') {
                    /* U+003F QUESTION MARK (?)
                    Parse error. Switch to the bogus comment state. */
                    $this->state = 'bogusComment';

                } else {
                    /* Anything else
                    Parse error. Emit a U+003C LESS-THAN SIGN character token and
                    reconsume the current input character in the data state. */
                    $this->emitToken(
                        array(
                            'type' => self::CHARACTR,
                            'data' => '<'
                        )
                    );

                    $this->char--;
                    $this->state = 'data';
                }
                break;
        }
    }

    private function closeTagOpenState()
    {
        $next_node = strtolower($this->characters('A-Za-z', $this->char + 1));
        $the_same = count($this->tree->stack) > 0 && $next_node === end($this->tree->stack)->nodeName;

        if (($this->content_model === self::RCDATA || $this->content_model === self::CDATA) &&
            (!$the_same || ($the_same && (!preg_match(
                            '/[\t\n\x0b\x0c >\/]/',
                            $this->character($this->char + 1 + strlen($next_node))
                        ) || $this->EOF === $this->char)))
        ) {
            /* If the content model flag is set to the RCDATA or CDATA states then
            examine the next few characters. If they do not match the tag name of
            the last start tag token emitted (case insensitively), or if they do but
            they are not immediately followed by one of the following characters:
                * U+0009 CHARACTER TABULATION
                * U+000A LINE FEED (LF)
                * U+000B LINE TABULATION
                * U+000C FORM FEED (FF)
                * U+0020 SPACE
                * U+003E GREATER-THAN SIGN (>)
                * U+002F SOLIDUS (/)
                * EOF
            ...then there is a parse error. Emit a U+003C LESS-THAN SIGN character
            token, a U+002F SOLIDUS character token, and switch to the data state
            to process the next input character. */
            $this->emitToken(
                array(
                    'type' => self::CHARACTR,
                    'data' => '</'
                )
            );

            $this->state = 'data';

        } else {
            /* Otherwise, if the content model flag is set to the PCDATA state,
            or if the next few characters do match that tag name, consume the
            next input character: */
            $this->char++;
            $char = $this->char();

            if (preg_match('/^[A-Za-z]$/', $char)) {
                /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z
                Create a new end tag token, set its tag name to the lowercase version
                of the input character (add 0x0020 to the character's code point), then
                switch to the tag name state. (Don't emit the token yet; further details
                will be filled in before it is emitted.) */
                $this->token = array(
                    'name' => strtolower($char),
                    'type' => self::ENDTAG
                );

                $this->state = 'tagName';

            } elseif ($char === '>') {
                /* U+003E GREATER-THAN SIGN (>)
                Parse error. Switch to the data state. */
                $this->state = 'data';

            } elseif ($this->char === $this->EOF) {
                /* EOF
                Parse error. Emit a U+003C LESS-THAN SIGN character token and a U+002F
                SOLIDUS character token. Reconsume the EOF character in the data state. */
                $this->emitToken(
                    array(
                        'type' => self::CHARACTR,
                        'data' => '</'
                    )
                );

                $this->char--;
                $this->state = 'data';

            } else {
                /* Parse error. Switch to the bogus comment state. */
                $this->state = 'bogusComment';
            }
        }
    }

    private function tagNameState()
    {
        // Consume the next input character:
        $this->char++;
        $char = $this->character($this->char);

        if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
            /* U+0009 CHARACTER TABULATION
            U+000A LINE FEED (LF)
            U+000B LINE TABULATION
            U+000C FORM FEED (FF)
            U+0020 SPACE
            Switch to the before attribute name state. */
            $this->state = 'beforeAttributeName';

        } elseif ($char === '>') {
            /* U+003E GREATER-THAN SIGN (>)
            Emit the current tag token. Switch to the data state. */
            $this->emitToken($this->token);
            $this->state = 'data';

        } elseif ($this->char === $this->EOF) {
            /* EOF
            Parse error. Emit the current tag token. Reconsume the EOF
            character in the data state. */
            $this->emitToken($this->token);

            $this->char--;
            $this->state = 'data';

        } elseif ($char === '/') {
            /* U+002F SOLIDUS (/)
            Parse error unless this is a permitted slash. Switch to the before
            attribute name state. */
            $this->state = 'beforeAttributeName';

        } else {
            /* Anything else
            Append the current input character to the current tag token's tag name.
            Stay in the tag name state. */
            $this->token['name'] .= strtolower($char);
            $this->state = 'tagName';
        }
    }

    private function beforeAttributeNameState()
    {
        // Consume the next input character:
        $this->char++;
        $char = $this->character($this->char);

        if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
            /* U+0009 CHARACTER TABULATION
            U+000A LINE FEED (LF)
            U+000B LINE TABULATION
            U+000C FORM FEED (FF)
            U+0020 SPACE
            Stay in the before attribute name state. */
            $this->state = 'beforeAttributeName';

        } elseif ($char === '>') {
            /* U+003E GREATER-THAN SIGN (>)
            Emit the current tag token. Switch to the data state. */
            $this->emitToken($this->token);
            $this->state = 'data';

        } elseif ($char === '/') {
            /* U+002F SOLIDUS (/)
            Parse error unless this is a permitted slash. Stay in the before
            attribute name state. */
            $this->state = 'beforeAttributeName';

        } elseif ($this->char === $this->EOF) {
            /* EOF
            Parse error. Emit the current tag token. Reconsume the EOF
            character in the data state. */
            $this->emitToken($this->token);

            $this->char--;
            $this->state = 'data';

        } else {
            /* Anything else
            Start a new attribute in the current tag token. Set that attribute's
            name to the current input character, and its value to the empty string.
            Switch to the attribute name state. */
            $this->token['attr'][] = array(
                'name' => strtolower($char),
                'value' => null
            );

            $this->state = 'attributeName';
        }
    }

    private function attributeNameState()
    {
        // Consume the next input character:
        $this->char++;
        $char = $this->character($this->char);

        if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
            /* U+0009 CHARACTER TABULATION
            U+000A LINE FEED (LF)
            U+000B LINE TABULATION
            U+000C FORM FEED (FF)
            U+0020 SPACE
            Stay in the before attribute name state. */
            $this->state = 'afterAttributeName';

        } elseif ($char === '=') {
            /* U+003D EQUALS SIGN (=)
            Switch to the before attribute value state. */
            $this->state = 'beforeAttributeValue';

        } elseif ($char === '>') {
            /* U+003E GREATER-THAN SIGN (>)
            Emit the current tag token. Switch to the data state. */
            $this->emitToken($this->token);
            $this->state = 'data';

        } elseif ($char === '/' && $this->character($this->char + 1) !== '>') {
            /* U+002F SOLIDUS (/)
            Parse error unless this is a permitted slash. Switch to the before
            attribute name state. */
            $this->state = 'beforeAttributeName';

        } elseif ($this->char === $this->EOF) {
            /* EOF
            Parse error. Emit the current tag token. Reconsume the EOF
            character in the data state. */
            $this->emitToken($this->token);

            $this->char--;
            $this->state = 'data';

        } else {
            /* Anything else
            Append the current input character to the current attribute's name.
            Stay in the attribute name state. */
            $last = count($this->token['attr']) - 1;
            $this->token['attr'][$last]['name'] .= strtolower($char);

            $this->state = 'attributeName';
        }
    }

    private function afterAttributeNameState()
    {
        // Consume the next input character:
        $this->char++;
        $char = $this->character($this->char);

        if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
            /* U+0009 CHARACTER TABULATION
            U+000A LINE FEED (LF)
            U+000B LINE TABULATION
            U+000C FORM FEED (FF)
            U+0020 SPACE
            Stay in the after attribute name state. */
            $this->state = 'afterAttributeName';

        } elseif ($char === '=') {
            /* U+003D EQUALS SIGN (=)
            Switch to the before attribute value state. */
            $this->state = 'beforeAttributeValue';

        } elseif ($char === '>') {
            /* U+003E GREATER-THAN SIGN (>)
            Emit the current tag token. Switch to the data state. */
            $this->emitToken($this->token);
            $this->state = 'data';

        } elseif ($char === '/' && $this->character($this->char + 1) !== '>') {
            /* U+002F SOLIDUS (/)
            Parse error unless this is a permitted slash. Switch to the
            before attribute name state. */
            $this->state = 'beforeAttributeName';

        } elseif ($this->char === $this->EOF) {
            /* EOF
            Parse error. Emit the current tag token. Reconsume the EOF
            character in the data state. */
            $this->emitToken($this->token);

            $this->char--;
            $this->state = 'data';

        } else {
            /* Anything else
            Start a new attribute in the current tag token. Set that attribute's
            name to the current input character, and its value to the empty string.
            Switch to the attribute name state. */
            $this->token['attr'][] = array(
                'name' => strtolower($char),
                'value' => null
            );

            $this->state = 'attributeName';
        }
    }

    private function beforeAttributeValueState()
    {
        // Consume the next input character:
        $this->char++;
        $char = $this->character($this->char);

        if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
            /* U+0009 CHARACTER TABULATION
            U+000A LINE FEED (LF)
            U+000B LINE TABULATION
            U+000C FORM FEED (FF)
            U+0020 SPACE
            Stay in the before attribute value state. */
            $this->state = 'beforeAttributeValue';

        } elseif ($char === '"') {
            /* U+0022 QUOTATION MARK (")
            Switch to the attribute value (double-quoted) state. */
            $this->state = 'attributeValueDoubleQuoted';

        } elseif ($char === '&') {
            /* U+0026 AMPERSAND (&)
            Switch to the attribute value (unquoted) state and reconsume
            this input character. */
            $this->char--;
            $this->state = 'attributeValueUnquoted';

        } elseif ($char === '\'') {
            /* U+0027 APOSTROPHE (')
            Switch to the attribute value (single-quoted) state. */
            $this->state = 'attributeValueSingleQuoted';

        } elseif ($char === '>') {
            /* U+003E GREATER-THAN SIGN (>)
            Emit the current tag token. Switch to the data state. */
            $this->emitToken($this->token);
            $this->state = 'data';

        } else {
            /* Anything else
            Append the current input character to the current attribute's value.
            Switch to the attribute value (unquoted) state. */
            $last = count($this->token['attr']) - 1;
            $this->token['attr'][$last]['value'] .= $char;

            $this->state = 'attributeValueUnquoted';
        }
    }

    private function attributeValueDoubleQuotedState()
    {
        // Consume the next input character:
        $this->char++;
        $char = $this->character($this->char);

        if ($char === '"') {
            /* U+0022 QUOTATION MARK (")
            Switch to the before attribute name state. */
            $this->state = 'beforeAttributeName';

        } elseif ($char === '&') {
            /* U+0026 AMPERSAND (&)
            Switch to the entity in attribute value state. */
            $this->entityInAttributeValueState('double');

        } elseif ($this->char === $this->EOF) {
            /* EOF
            Parse error. Emit the current tag token. Reconsume the character
            in the data state. */
            $this->emitToken($this->token);

            $this->char--;
            $this->state = 'data';

        } else {
            /* Anything else
            Append the current input character to the current attribute's value.
            Stay in the attribute value (double-quoted) state. */
            $last = count($this->token['attr']) - 1;
            $this->token['attr'][$last]['value'] .= $char;

            $this->state = 'attributeValueDoubleQuoted';
        }
    }

    private function attributeValueSingleQuotedState()
    {
        // Consume the next input character:
        $this->char++;
        $char = $this->character($this->char);

        if ($char === '\'') {
            /* U+0022 QUOTATION MARK (')
            Switch to the before attribute name state. */
            $this->state = 'beforeAttributeName';

        } elseif ($char === '&') {
            /* U+0026 AMPERSAND (&)
            Switch to the entity in attribute value state. */
            $this->entityInAttributeValueState('single');

        } elseif ($this->char === $this->EOF) {
            /* EOF
            Parse error. Emit the current tag token. Reconsume the character
            in the data state. */
            $this->emitToken($this->token);

            $this->char--;
            $this->state = 'data';

        } else {
            /* Anything else
            Append the current input character to the current attribute's value.
            Stay in the attribute value (single-quoted) state. */
            $last = count($this->token['attr']) - 1;
            $this->token['attr'][$last]['value'] .= $char;

            $this->state = 'attributeValueSingleQuoted';
        }
    }

    private function attributeValueUnquotedState()
    {
        // Consume the next input character:
        $this->char++;
        $char = $this->character($this->char);

        if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
            /* U+0009 CHARACTER TABULATION
            U+000A LINE FEED (LF)
            U+000B LINE TABULATION
            U+000C FORM FEED (FF)
            U+0020 SPACE
            Switch to the before attribute name state. */
            $this->state = 'beforeAttributeName';

        } elseif ($char === '&') {
            /* U+0026 AMPERSAND (&)
            Switch to the entity in attribute value state. */
            $this->entityInAttributeValueState();

        } elseif ($char === '>') {
            /* U+003E GREATER-THAN SIGN (>)
            Emit the current tag token. Switch to the data state. */
            $this->emitToken($this->token);
            $this->state = 'data';

        } else {
            /* Anything else
            Append the current input character to the current attribute's value.
            Stay in the attribute value (unquoted) state. */
            $last = count($this->token['attr']) - 1;
            $this->token['attr'][$last]['value'] .= $char;

            $this->state = 'attributeValueUnquoted';
        }
    }

    private function entityInAttributeValueState()
    {
        // Attempt to consume an entity.
        $entity = $this->entity();

        // If nothing is returned, append a U+0026 AMPERSAND character to the
        // current attribute's value. Otherwise, emit the character token that
        // was returned.
        $char = (!$entity)
            ? '&'
            : $entity;

        $last = count($this->token['attr']) - 1;
        $this->token['attr'][$last]['value'] .= $char;
    }

    private function bogusCommentState()
    {
        /* Consume every character up to the first U+003E GREATER-THAN SIGN
        character (>) or the end of the file (EOF), whichever comes first. Emit
        a comment token whose data is the concatenation of all the characters
        starting from and including the character that caused the state machine
        to switch into the bogus comment state, up to and including the last
        consumed character before the U+003E character, if any, or up to the
        end of the file otherwise. (If the comment was started by the end of
        the file (EOF), the token is empty.) */
        $data = $this->characters('^>', $this->char);
        $this->emitToken(
            array(
                'data' => $data,
                'type' => self::COMMENT
            )
        );

        $this->char += strlen($data);

        /* Switch to the data state. */
        $this->state = 'data';

        /* If the end of the file was reached, reconsume the EOF character. */
        if ($this->char === $this->EOF) {
            $this->char = $this->EOF - 1;
        }
    }

    private function markupDeclarationOpenState()
    {
        /* If the next two characters are both U+002D HYPHEN-MINUS (-)
        characters, consume those two characters, create a comment token whose
        data is the empty string, and switch to the comment state. */
        if ($this->character($this->char + 1, 2) === '--') {
            $this->char += 2;
            $this->state = 'comment';
            $this->token = array(
                'data' => null,
                'type' => self::COMMENT
            );

            /* Otherwise if the next seven chacacters are a case-insensitive match
            for the word "DOCTYPE", then consume those characters and switch to the
            DOCTYPE state. */
        } elseif (strtolower($this->character($this->char + 1, 7)) === 'doctype') {
            $this->char += 7;
            $this->state = 'doctype';

            /* Otherwise, is is a parse error. Switch to the bogus comment state.
            The next character that is consumed, if any, is the first character
            that will be in the comment. */
        } else {
            $this->char++;
            $this->state = 'bogusComment';
        }
    }

    private function commentState()
    {
        /* Consume the next input character: */
        $this->char++;
        $char = $this->char();

        /* U+002D HYPHEN-MINUS (-) */
        if ($char === '-') {
            /* Switch to the comment dash state  */
            $this->state = 'commentDash';

            /* EOF */
        } elseif ($this->char === $this->EOF) {
            /* Parse error. Emit the comment token. Reconsume the EOF character
            in the data state. */
            $this->emitToken($this->token);
            $this->char--;
            $this->state = 'data';

            /* Anything else */
        } else {
            /* Append the input character to the comment token's data. Stay in
            the comment state. */
            $this->token['data'] .= $char;
        }
    }

    private function commentDashState()
    {
        /* Consume the next input character: */
        $this->char++;
        $char = $this->char();

        /* U+002D HYPHEN-MINUS (-) */
        if ($char === '-') {
            /* Switch to the comment end state  */
            $this->state = 'commentEnd';

            /* EOF */
        } elseif ($this->char === $this->EOF) {
            /* Parse error. Emit the comment token. Reconsume the EOF character
            in the data state. */
            $this->emitToken($this->token);
            $this->char--;
            $this->state = 'data';

            /* Anything else */
        } else {
            /* Append a U+002D HYPHEN-MINUS (-) character and the input
            character to the comment token's data. Switch to the comment state. */
            $this->token['data'] .= '-' . $char;
            $this->state = 'comment';
        }
    }

    private function commentEndState()
    {
        /* Consume the next input character: */
        $this->char++;
        $char = $this->char();

        if ($char === '>') {
            $this->emitToken($this->token);
            $this->state = 'data';

        } elseif ($char === '-') {
            $this->token['data'] .= '-';

        } elseif ($this->char === $this->EOF) {
            $this->emitToken($this->token);
            $this->char--;
            $this->state = 'data';

        } else {
            $this->token['data'] .= '--' . $char;
            $this->state = 'comment';
        }
    }

    private function doctypeState()
    {
        /* Consume the next input character: */
        $this->char++;
        $char = $this->char();

        if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
            $this->state = 'beforeDoctypeName';

        } else {
            $this->char--;
            $this->state = 'beforeDoctypeName';
        }
    }

    private function beforeDoctypeNameState()
    {
        /* Consume the next input character: */
        $this->char++;
        $char = $this->char();

        if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
            // Stay in the before DOCTYPE name state.

        } elseif (preg_match('/^[a-z]$/', $char)) {
            $this->token = array(
                'name' => strtoupper($char),
                'type' => self::DOCTYPE,
                'error' => true
            );

            $this->state = 'doctypeName';

        } elseif ($char === '>') {
            $this->emitToken(
                array(
                    'name' => null,
                    'type' => self::DOCTYPE,
                    'error' => true
                )
            );

            $this->state = 'data';

        } elseif ($this->char === $this->EOF) {
            $this->emitToken(
                array(
                    'name' => null,
                    'type' => self::DOCTYPE,
                    'error' => true
                )
            );

            $this->char--;
            $this->state = 'data';

        } else {
            $this->token = array(
                'name' => $char,
                'type' => self::DOCTYPE,
                'error' => true
            );

            $this->state = 'doctypeName';
        }
    }

    private function doctypeNameState()
    {
        /* Consume the next input character: */
        $this->char++;
        $char = $this->char();

        if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
            $this->state = 'AfterDoctypeName';

        } elseif ($char === '>') {
            $this->emitToken($this->token);
            $this->state = 'data';

        } elseif (preg_match('/^[a-z]$/', $char)) {
            $this->token['name'] .= strtoupper($char);

        } elseif ($this->char === $this->EOF) {
            $this->emitToken($this->token);
            $this->char--;
            $this->state = 'data';

        } else {
            $this->token['name'] .= $char;
        }

        $this->token['error'] = ($this->token['name'] === 'HTML')
            ? false
            : true;
    }

    private function afterDoctypeNameState()
    {
        /* Consume the next input character: */
        $this->char++;
        $char = $this->char();

        if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
            // Stay in the DOCTYPE name state.

        } elseif ($char === '>') {
            $this->emitToken($this->token);
            $this->state = 'data';

        } elseif ($this->char === $this->EOF) {
            $this->emitToken($this->token);
            $this->char--;
            $this->state = 'data';

        } else {
            $this->token['error'] = true;
            $this->state = 'bogusDoctype';
        }
    }

    private function bogusDoctypeState()
    {
        /* Consume the next input character: */
        $this->char++;
        $char = $this->char();

        if ($char === '>') {
            $this->emitToken($this->token);
            $this->state = 'data';

        } elseif ($this->char === $this->EOF) {
            $this->emitToken($this->token);
            $this->char--;
            $this->state = 'data';

        } else {
            // Stay in the bogus DOCTYPE state.
        }
    }

    private function entity()
    {
        $start = $this->char;

        // This section defines how to consume an entity. This definition is
        // used when parsing entities in text and in attributes.

        // The behaviour depends on the identity of the next character (the
        // one immediately after the U+0026 AMPERSAND character):

        switch ($this->character($this->char + 1)) {
            // U+0023 NUMBER SIGN (#)
            case '#':

                // The behaviour further depends on the character after the
                // U+0023 NUMBER SIGN:
                switch ($this->character($this->char + 1)) {
                    // U+0078 LATIN SMALL LETTER X
                    // U+0058 LATIN CAPITAL LETTER X
                    case 'x':
                    case 'X':
                        // Follow the steps below, but using the range of
                        // characters U+0030 DIGIT ZERO through to U+0039 DIGIT
                        // NINE, U+0061 LATIN SMALL LETTER A through to U+0066
                        // LATIN SMALL LETTER F, and U+0041 LATIN CAPITAL LETTER
                        // A, through to U+0046 LATIN CAPITAL LETTER F (in other
                        // words, 0-9, A-F, a-f).
                        $char = 1;
                        $char_class = '0-9A-Fa-f';
                        break;

                    // Anything else
                    default:
                        // Follow the steps below, but using the range of
                        // characters U+0030 DIGIT ZERO through to U+0039 DIGIT
                        // NINE (i.e. just 0-9).
                        $char = 0;
                        $char_class = '0-9';
                        break;
                }

                // Consume as many characters as match the range of characters
                // given above.
                $this->char++;
                $e_name = $this->characters($char_class, $this->char + $char + 1);
                $entity = $this->character($start, $this->char);
                $cond = strlen($e_name) > 0;

                // The rest of the parsing happens below.
                break;

            // Anything else
            default:
                // Consume the maximum number of characters possible, with the
                // consumed characters case-sensitively matching one of the
                // identifiers in the first column of the entities table.

                $e_name = $this->characters('0-9A-Za-z;', $this->char + 1);
                $len = strlen($e_name);

                for ($c = 1; $c <= $len; $c++) {
                    $id = substr($e_name, 0, $c);
                    $this->char++;

                    if (in_array($id, $this->entities)) {
                        if ($e_name[$c - 1] !== ';') {
                            if ($c < $len && $e_name[$c] == ';') {
                                $this->char++; // consume extra semicolon
                            }
                        }
                        $entity = $id;
                        break;
                    }
                }

                $cond = isset($entity);
                // The rest of the parsing happens below.
                break;
        }

        if (!$cond) {
            // If no match can be made, then this is a parse error. No
            // characters are consumed, and nothing is returned.
            $this->char = $start;
            return false;
        }

        // Return a character token for the character corresponding to the
        // entity name (as given by the second column of the entities table).
        return html_entity_decode('&' . rtrim($entity, ';') . ';', ENT_QUOTES, 'UTF-8');
    }

    private function emitToken($token)
    {
        $emit = $this->tree->emitToken($token);

        if (is_int($emit)) {
            $this->content_model = $emit;

        } elseif ($token['type'] === self::ENDTAG) {
            $this->content_model = self::PCDATA;
        }
    }

    private function EOF()
    {
        $this->state = null;
        $this->tree->emitToken(
            array(
                'type' => self::EOF
            )
        );
    }
}

class HTML5TreeConstructer
{
    public $stack = array();

    private $phase;
    private $mode;
    private $dom;
    private $foster_parent = null;
    private $a_formatting = array();

    private $head_pointer = null;
    private $form_pointer = null;

    private $scoping = array('button', 'caption', 'html', 'marquee', 'object', 'table', 'td', 'th');
    private $formatting = array(
        'a',
        'b',
        'big',
        'em',
        'font',
        'i',
        'nobr',
        's',
        'small',
        'strike',
        'strong',
        'tt',
        'u'
    );
    private $special = array(
        'address',
        'area',
        'base',
        'basefont',
        'bgsound',
        'blockquote',
        'body',
        'br',
        'center',
        'col',
        'colgroup',
        'dd',
        'dir',
        'div',
        'dl',
        'dt',
        'embed',
        'fieldset',
        'form',
        'frame',
        'frameset',
        'h1',
        'h2',
        'h3',
        'h4',
        'h5',
        'h6',
        'head',
        'hr',
        'iframe',
        'image',
        'img',
        'input',
        'isindex',
        'li',
        'link',
        'listing',
        'menu',
        'meta',
        'noembed',
        'noframes',
        'noscript',
        'ol',
        'optgroup',
        'option',
        'p',
        'param',
        'plaintext',
        'pre',
        'script',
        'select',
        'spacer',
        'style',
        'tbody',
        'textarea',
        'tfoot',
        'thead',
        'title',
        'tr',
        'ul',
        'wbr'
    );

    // The different phases.
    const INIT_PHASE = 0;
    const ROOT_PHASE = 1;
    const MAIN_PHASE = 2;
    const END_PHASE = 3;

    // The different insertion modes for the main phase.
    const BEFOR_HEAD = 0;
    const IN_HEAD = 1;
    const AFTER_HEAD = 2;
    const IN_BODY = 3;
    const IN_TABLE = 4;
    const IN_CAPTION = 5;
    const IN_CGROUP = 6;
    const IN_TBODY = 7;
    const IN_ROW = 8;
    const IN_CELL = 9;
    const IN_SELECT = 10;
    const AFTER_BODY = 11;
    const IN_FRAME = 12;
    const AFTR_FRAME = 13;

    // The different types of elements.
    const SPECIAL = 0;
    const SCOPING = 1;
    const FORMATTING = 2;
    const PHRASING = 3;

    const MARKER = 0;

    public function __construct()
    {
        $this->phase = self::INIT_PHASE;
        $this->mode = self::BEFOR_HEAD;
        $this->dom = new DOMDocument;

        $this->dom->encoding = 'UTF-8';
        $this->dom->preserveWhiteSpace = true;
        $this->dom->substituteEntities = true;
        $this->dom->strictErrorChecking = false;
    }

    // Process tag tokens
    public function emitToken($token)
    {
        switch ($this->phase) {
            case self::INIT_PHASE:
                return $this->initPhase($token);
                break;
            case self::ROOT_PHASE:
                return $this->rootElementPhase($token);
                break;
            case self::MAIN_PHASE:
                return $this->mainPhase($token);
                break;
            case self::END_PHASE :
                return $this->trailingEndPhase($token);
                break;
        }
    }

    private function initPhase($token)
    {
        /* Initially, the tree construction stage must handle each token
        emitted from the tokenisation stage as follows: */

        /* A DOCTYPE token that is marked as being in error
        A comment token
        A start tag token
        An end tag token
        A character token that is not one of one of U+0009 CHARACTER TABULATION,
            U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
            or U+0020 SPACE
        An end-of-file token */
        if ((isset($token['error']) && $token['error']) ||
            $token['type'] === HTML5::COMMENT ||
            $token['type'] === HTML5::STARTTAG ||
            $token['type'] === HTML5::ENDTAG ||
            $token['type'] === HTML5::EOF ||
            ($token['type'] === HTML5::CHARACTR && isset($token['data']) &&
                !preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']))
        ) {
            /* This specification does not define how to handle this case. In
            particular, user agents may ignore the entirety of this specification
            altogether for such documents, and instead invoke special parse modes
            with a greater emphasis on backwards compatibility. */

            $this->phase = self::ROOT_PHASE;
            return $this->rootElementPhase($token);

            /* A DOCTYPE token marked as being correct */
        } elseif (isset($token['error']) && !$token['error']) {
            /* Append a DocumentType node to the Document  node, with the name
            attribute set to the name given in the DOCTYPE token (which will be
            "HTML"), and the other attributes specific to DocumentType objects
            set to null, empty lists, or the empty string as appropriate. */
            $doctype = new DOMDocumentType(null, null, 'HTML');

            /* Then, switch to the root element phase of the tree construction
            stage. */
            $this->phase = self::ROOT_PHASE;

            /* A character token that is one of one of U+0009 CHARACTER TABULATION,
            U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
            or U+0020 SPACE */
        } elseif (isset($token['data']) && preg_match(
                '/^[\t\n\x0b\x0c ]+$/',
                $token['data']
            )
        ) {
            /* Append that character  to the Document node. */
            $text = $this->dom->createTextNode($token['data']);
            $this->dom->appendChild($text);
        }
    }

    private function rootElementPhase($token)
    {
        /* After the initial phase, as each token is emitted from the tokenisation
        stage, it must be processed as described in this section. */

        /* A DOCTYPE token */
        if ($token['type'] === HTML5::DOCTYPE) {
            // Parse error. Ignore the token.

            /* A comment token */
        } elseif ($token['type'] === HTML5::COMMENT) {
            /* Append a Comment node to the Document object with the data
            attribute set to the data given in the comment token. */
            $comment = $this->dom->createComment($token['data']);
            $this->dom->appendChild($comment);

            /* A character token that is one of one of U+0009 CHARACTER TABULATION,
            U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
            or U+0020 SPACE */
        } elseif ($token['type'] === HTML5::CHARACTR &&
            preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
        ) {
            /* Append that character  to the Document node. */
            $text = $this->dom->createTextNode($token['data']);
            $this->dom->appendChild($text);

            /* A character token that is not one of U+0009 CHARACTER TABULATION,
                U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED
                (FF), or U+0020 SPACE
            A start tag token
            An end tag token
            An end-of-file token */
        } elseif (($token['type'] === HTML5::CHARACTR &&
                !preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) ||
            $token['type'] === HTML5::STARTTAG ||
            $token['type'] === HTML5::ENDTAG ||
            $token['type'] === HTML5::EOF
        ) {
            /* Create an HTMLElement node with the tag name html, in the HTML
            namespace. Append it to the Document object. Switch to the main
            phase and reprocess the current token. */
            $html = $this->dom->createElement('html');
            $this->dom->appendChild($html);
            $this->stack[] = $html;

            $this->phase = self::MAIN_PHASE;
            return $this->mainPhase($token);
        }
    }

    private function mainPhase($token)
    {
        /* Tokens in the main phase must be handled as follows: */

        /* A DOCTYPE token */
        if ($token['type'] === HTML5::DOCTYPE) {
            // Parse error. Ignore the token.

            /* A start tag token with the tag name "html" */
        } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'html') {
            /* If this start tag token was not the first start tag token, then
            it is a parse error. */

            /* For each attribute on the token, check to see if the attribute
            is already present on the top element of the stack of open elements.
            If it is not, add the attribute and its corresponding value to that
            element. */
            foreach ($token['attr'] as $attr) {
                if (!$this->stack[0]->hasAttribute($attr['name'])) {
                    $this->stack[0]->setAttribute($attr['name'], $attr['value']);
                }
            }

            /* An end-of-file token */
        } elseif ($token['type'] === HTML5::EOF) {
            /* Generate implied end tags. */
            $this->generateImpliedEndTags();

            /* Anything else. */
        } else {
            /* Depends on the insertion mode: */
            switch ($this->mode) {
                case self::BEFOR_HEAD:
                    return $this->beforeHead($token);
                    break;
                case self::IN_HEAD:
                    return $this->inHead($token);
                    break;
                case self::AFTER_HEAD:
                    return $this->afterHead($token);
                    break;
                case self::IN_BODY:
                    return $this->inBody($token);
                    break;
                case self::IN_TABLE:
                    return $this->inTable($token);
                    break;
                case self::IN_CAPTION:
                    return $this->inCaption($token);
                    break;
                case self::IN_CGROUP:
                    return $this->inColumnGroup($token);
                    break;
                case self::IN_TBODY:
                    return $this->inTableBody($token);
                    break;
                case self::IN_ROW:
                    return $this->inRow($token);
                    break;
                case self::IN_CELL:
                    return $this->inCell($token);
                    break;
                case self::IN_SELECT:
                    return $this->inSelect($token);
                    break;
                case self::AFTER_BODY:
                    return $this->afterBody($token);
                    break;
                case self::IN_FRAME:
                    return $this->inFrameset($token);
                    break;
                case self::AFTR_FRAME:
                    return $this->afterFrameset($token);
                    break;
                case self::END_PHASE:
                    return $this->trailingEndPhase($token);
                    break;
            }
        }
    }

    private function beforeHead($token)
    {
        /* Handle the token as follows: */

        /* A character token that is one of one of U+0009 CHARACTER TABULATION,
        U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
        or U+0020 SPACE */
        if ($token['type'] === HTML5::CHARACTR &&
            preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
        ) {
            /* Append the character to the current node. */
            $this->insertText($token['data']);

            /* A comment token */
        } elseif ($token['type'] === HTML5::COMMENT) {
            /* Append a Comment node to the current node with the data attribute
            set to the data given in the comment token. */
            $this->insertComment($token['data']);

            /* A start tag token with the tag name "head" */
        } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'head') {
            /* Create an element for the token, append the new element to the
            current node and push it onto the stack of open elements. */
            $element = $this->insertElement($token);

            /* Set the head element pointer to this new element node. */
            $this->head_pointer = $element;

            /* Change the insertion mode to "in head". */
            $this->mode = self::IN_HEAD;

            /* A start tag token whose tag name is one of: "base", "link", "meta",
            "script", "style", "title". Or an end tag with the tag name "html".
            Or a character token that is not one of U+0009 CHARACTER TABULATION,
            U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
            or U+0020 SPACE. Or any other start tag token */
        } elseif ($token['type'] === HTML5::STARTTAG ||
            ($token['type'] === HTML5::ENDTAG && $token['name'] === 'html') ||
            ($token['type'] === HTML5::CHARACTR && !preg_match(
                    '/^[\t\n\x0b\x0c ]$/',
                    $token['data']
                ))
        ) {
            /* Act as if a start tag token with the tag name "head" and no
            attributes had been seen, then reprocess the current token. */
            $this->beforeHead(
                array(
                    'name' => 'head',
                    'type' => HTML5::STARTTAG,
                    'attr' => array()
                )
            );

            return $this->inHead($token);

            /* Any other end tag */
        } elseif ($token['type'] === HTML5::ENDTAG) {
            /* Parse error. Ignore the token. */
        }
    }

    private function inHead($token)
    {
        /* Handle the token as follows: */

        /* A character token that is one of one of U+0009 CHARACTER TABULATION,
        U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
        or U+0020 SPACE.

        THIS DIFFERS FROM THE SPEC: If the current node is either a title, style
        or script element, append the character to the current node regardless
        of its content. */
        if (($token['type'] === HTML5::CHARACTR &&
                preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) || (
                $token['type'] === HTML5::CHARACTR && in_array(
                    end($this->stack)->nodeName,
                    array('title', 'style', 'script')
                ))
        ) {
            /* Append the character to the current node. */
            $this->insertText($token['data']);

            /* A comment token */
        } elseif ($token['type'] === HTML5::COMMENT) {
            /* Append a Comment node to the current node with the data attribute
            set to the data given in the comment token. */
            $this->insertComment($token['data']);

        } elseif ($token['type'] === HTML5::ENDTAG &&
            in_array($token['name'], array('title', 'style', 'script'))
        ) {
            array_pop($this->stack);
            return HTML5::PCDATA;

            /* A start tag with the tag name "title" */
        } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'title') {
            /* Create an element for the token and append the new element to the
            node pointed to by the head element pointer, or, if that is null
            (innerHTML case), to the current node. */
            if ($this->head_pointer !== null) {
                $element = $this->insertElement($token, false);
                $this->head_pointer->appendChild($element);

            } else {
                $element = $this->insertElement($token);
            }

            /* Switch the tokeniser's content model flag  to the RCDATA state. */
            return HTML5::RCDATA;

            /* A start tag with the tag name "style" */
        } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'style') {
            /* Create an element for the token and append the new element to the
            node pointed to by the head element pointer, or, if that is null
            (innerHTML case), to the current node. */
            if ($this->head_pointer !== null) {
                $element = $this->insertElement($token, false);
                $this->head_pointer->appendChild($element);

            } else {
                $this->insertElement($token);
            }

            /* Switch the tokeniser's content model flag  to the CDATA state. */
            return HTML5::CDATA;

            /* A start tag with the tag name "script" */
        } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'script') {
            /* Create an element for the token. */
            $element = $this->insertElement($token, false);
            $this->head_pointer->appendChild($element);

            /* Switch the tokeniser's content model flag  to the CDATA state. */
            return HTML5::CDATA;

            /* A start tag with the tag name "base", "link", or "meta" */
        } elseif ($token['type'] === HTML5::STARTTAG && in_array(
                $token['name'],
                array('base', 'link', 'meta')
            )
        ) {
            /* Create an element for the token and append the new element to the
            node pointed to by the head element pointer, or, if that is null
            (innerHTML case), to the current node. */
            if ($this->head_pointer !== null) {
                $element = $this->insertElement($token, false);
                $this->head_pointer->appendChild($element);
                array_pop($this->stack);

            } else {
                $this->insertElement($token);
            }

            /* An end tag with the tag name "head" */
        } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'head') {
            /* If the current node is a head element, pop the current node off
            the stack of open elements. */
            if ($this->head_pointer->isSameNode(end($this->stack))) {
                array_pop($this->stack);

                /* Otherwise, this is a parse error. */
            } else {
                // k
            }

            /* Change the insertion mode to "after head". */
            $this->mode = self::AFTER_HEAD;

            /* A start tag with the tag name "head" or an end tag except "html". */
        } elseif (($token['type'] === HTML5::STARTTAG && $token['name'] === 'head') ||
            ($token['type'] === HTML5::ENDTAG && $token['name'] !== 'html')
        ) {
            // Parse error. Ignore the token.

            /* Anything else */
        } else {
            /* If the current node is a head element, act as if an end tag
            token with the tag name "head" had been seen. */
            if ($this->head_pointer->isSameNode(end($this->stack))) {
                $this->inHead(
                    array(
                        'name' => 'head',
                        'type' => HTML5::ENDTAG
                    )
                );

                /* Otherwise, change the insertion mode to "after head". */
            } else {
                $this->mode = self::AFTER_HEAD;
            }

            /* Then, reprocess the current token. */
            return $this->afterHead($token);
        }
    }

    private function afterHead($token)
    {
        /* Handle the token as follows: */

        /* A character token that is one of one of U+0009 CHARACTER TABULATION,
        U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
        or U+0020 SPACE */
        if ($token['type'] === HTML5::CHARACTR &&
            preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
        ) {
            /* Append the character to the current node. */
            $this->insertText($token['data']);

            /* A comment token */
        } elseif ($token['type'] === HTML5::COMMENT) {
            /* Append a Comment node to the current node with the data attribute
            set to the data given in the comment token. */
            $this->insertComment($token['data']);

            /* A start tag token with the tag name "body" */
        } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'body') {
            /* Insert a body element for the token. */
            $this->insertElement($token);

            /* Change the insertion mode to "in body". */
            $this->mode = self::IN_BODY;

            /* A start tag token with the tag name "frameset" */
        } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'frameset') {
            /* Insert a frameset element for the token. */
            $this->insertElement($token);

            /* Change the insertion mode to "in frameset". */
            $this->mode = self::IN_FRAME;

            /* A start tag token whose tag name is one of: "base", "link", "meta",
            "script", "style", "title" */
        } elseif ($token['type'] === HTML5::STARTTAG && in_array(
                $token['name'],
                array('base', 'link', 'meta', 'script', 'style', 'title')
            )
        ) {
            /* Parse error. Switch the insertion mode back to "in head" and
            reprocess the token. */
            $this->mode = self::IN_HEAD;
            return $this->inHead($token);

            /* Anything else */
        } else {
            /* Act as if a start tag token with the tag name "body" and no
            attributes had been seen, and then reprocess the current token. */
            $this->afterHead(
                array(
                    'name' => 'body',
                    'type' => HTML5::STARTTAG,
                    'attr' => array()
                )
            );

            return $this->inBody($token);
        }
    }

    private function inBody($token)
    {
        /* Handle the token as follows: */

        switch ($token['type']) {
            /* A character token */
            case HTML5::CHARACTR:
                /* Reconstruct the active formatting elements, if any. */
                $this->reconstructActiveFormattingElements();

                /* Append the token's character to the current node. */
                $this->insertText($token['data']);
                break;

            /* A comment token */
            case HTML5::COMMENT:
                /* Append a Comment node to the current node with the data
                attribute set to the data given in the comment token. */
                $this->insertComment($token['data']);
                break;

            case HTML5::STARTTAG:
                switch ($token['name']) {
                    /* A start tag token whose tag name is one of: "script",
                    "style" */
                    case 'script':
                    case 'style':
                        /* Process the token as if the insertion mode had been "in
                        head". */
                        return $this->inHead($token);
                        break;

                    /* A start tag token whose tag name is one of: "base", "link",
                    "meta", "title" */
                    case 'base':
                    case 'link':
                    case 'meta':
                    case 'title':
                        /* Parse error. Process the token as if the insertion mode
                        had    been "in head". */
                        return $this->inHead($token);
                        break;

                    /* A start tag token with the tag name "body" */
                    case 'body':
                        /* Parse error. If the second element on the stack of open
                        elements is not a body element, or, if the stack of open
                        elements has only one node on it, then ignore the token.
                        (innerHTML case) */
                        if (count($this->stack) === 1 || $this->stack[1]->nodeName !== 'body') {
                            // Ignore

                            /* Otherwise, for each attribute on the token, check to see
                            if the attribute is already present on the body element (the
                            second element)    on the stack of open elements. If it is not,
                            add the attribute and its corresponding value to that
                            element. */
                        } else {
                            foreach ($token['attr'] as $attr) {
                                if (!$this->stack[1]->hasAttribute($attr['name'])) {
                                    $this->stack[1]->setAttribute($attr['name'], $attr['value']);
                                }
                            }
                        }
                        break;

                    /* A start tag whose tag name is one of: "address",
                    "blockquote", "center", "dir", "div", "dl", "fieldset",
                    "listing", "menu", "ol", "p", "ul" */
                    case 'address':
                    case 'blockquote':
                    case 'center':
                    case 'dir':
                    case 'div':
                    case 'dl':
                    case 'fieldset':
                    case 'listing':
                    case 'menu':
                    case 'ol':
                    case 'p':
                    case 'ul':
                        /* If the stack of open elements has a p element in scope,
                        then act as if an end tag with the tag name p had been
                        seen. */
                        if ($this->elementInScope('p')) {
                            $this->emitToken(
                                array(
                                    'name' => 'p',
                                    'type' => HTML5::ENDTAG
                                )
                            );
                        }

                        /* Insert an HTML element for the token. */
                        $this->insertElement($token);
                        break;

                    /* A start tag whose tag name is "form" */
                    case 'form':
                        /* If the form element pointer is not null, ignore the
                        token with a parse error. */
                        if ($this->form_pointer !== null) {
                            // Ignore.

                            /* Otherwise: */
                        } else {
                            /* If the stack of open elements has a p element in
                            scope, then act as if an end tag with the tag name p
                            had been seen. */
                            if ($this->elementInScope('p')) {
                                $this->emitToken(
                                    array(
                                        'name' => 'p',
                                        'type' => HTML5::ENDTAG
                                    )
                                );
                            }

                            /* Insert an HTML element for the token, and set the
                            form element pointer to point to the element created. */
                            $element = $this->insertElement($token);
                            $this->form_pointer = $element;
                        }
                        break;

                    /* A start tag whose tag name is "li", "dd" or "dt" */
                    case 'li':
                    case 'dd':
                    case 'dt':
                        /* If the stack of open elements has a p  element in scope,
                        then act as if an end tag with the tag name p had been
                        seen. */
                        if ($this->elementInScope('p')) {
                            $this->emitToken(
                                array(
                                    'name' => 'p',
                                    'type' => HTML5::ENDTAG
                                )
                            );
                        }

                        $stack_length = count($this->stack) - 1;

                        for ($n = $stack_length; 0 <= $n; $n--) {
                            /* 1. Initialise node to be the current node (the
                            bottommost node of the stack). */
                            $stop = false;
                            $node = $this->stack[$n];
                            $cat = $this->getElementCategory($node->tagName);

                            /* 2. If node is an li, dd or dt element, then pop all
                            the    nodes from the current node up to node, including
                            node, then stop this algorithm. */
                            if ($token['name'] === $node->tagName || ($token['name'] !== 'li'
                                    && ($node->tagName === 'dd' || $node->tagName === 'dt'))
                            ) {
                                for ($x = $stack_length; $x >= $n; $x--) {
                                    array_pop($this->stack);
                                }

                                break;
                            }

                            /* 3. If node is not in the formatting category, and is
                            not    in the phrasing category, and is not an address or
                            div element, then stop this algorithm. */
                            if ($cat !== self::FORMATTING && $cat !== self::PHRASING &&
                                $node->tagName !== 'address' && $node->tagName !== 'div'
                            ) {
                                break;
                            }
                        }

                        /* Finally, insert an HTML element with the same tag
                        name as the    token's. */
                        $this->insertElement($token);
                        break;

                    /* A start tag token whose tag name is "plaintext" */
                    case 'plaintext':
                        /* If the stack of open elements has a p  element in scope,
                        then act as if an end tag with the tag name p had been
                        seen. */
                        if ($this->elementInScope('p')) {
                            $this->emitToken(
                                array(
                                    'name' => 'p',
                                    'type' => HTML5::ENDTAG
                                )
                            );
                        }

                        /* Insert an HTML element for the token. */
                        $this->insertElement($token);

                        return HTML5::PLAINTEXT;
                        break;

                    /* A start tag whose tag name is one of: "h1", "h2", "h3", "h4",
                    "h5", "h6" */
                    case 'h1':
                    case 'h2':
                    case 'h3':
                    case 'h4':
                    case 'h5':
                    case 'h6':
                        /* If the stack of open elements has a p  element in scope,
                        then act as if an end tag with the tag name p had been seen. */
                        if ($this->elementInScope('p')) {
                            $this->emitToken(
                                array(
                                    'name' => 'p',
                                    'type' => HTML5::ENDTAG
                                )
                            );
                        }

                        /* If the stack of open elements has in scope an element whose
                        tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then
                        this is a parse error; pop elements from the stack until an
                        element with one of those tag names has been popped from the
                        stack. */
                        while ($this->elementInScope(array('h1', 'h2', 'h3', 'h4', 'h5', 'h6'))) {
                            array_pop($this->stack);
                        }

                        /* Insert an HTML element for the token. */
                        $this->insertElement($token);
                        break;

                    /* A start tag whose tag name is "a" */
                    case 'a':
                        /* If the list of active formatting elements contains
                        an element whose tag name is "a" between the end of the
                        list and the last marker on the list (or the start of
                        the list if there is no marker on the list), then this
                        is a parse error; act as if an end tag with the tag name
                        "a" had been seen, then remove that element from the list
                        of active formatting elements and the stack of open
                        elements if the end tag didn't already remove it (it
                        might not have if the element is not in table scope). */
                        $leng = count($this->a_formatting);

                        for ($n = $leng - 1; $n >= 0; $n--) {
                            if ($this->a_formatting[$n] === self::MARKER) {
                                break;

                            } elseif ($this->a_formatting[$n]->nodeName === 'a') {
                                $this->emitToken(
                                    array(
                                        'name' => 'a',
                                        'type' => HTML5::ENDTAG
                                    )
                                );
                                break;
                            }
                        }

                        /* Reconstruct the active formatting elements, if any. */
                        $this->reconstructActiveFormattingElements();

                        /* Insert an HTML element for the token. */
                        $el = $this->insertElement($token);

                        /* Add that element to the list of active formatting
                        elements. */
                        $this->a_formatting[] = $el;
                        break;

                    /* A start tag whose tag name is one of: "b", "big", "em", "font",
                    "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */
                    case 'b':
                    case 'big':
                    case 'em':
                    case 'font':
                    case 'i':
                    case 'nobr':
                    case 's':
                    case 'small':
                    case 'strike':
                    case 'strong':
                    case 'tt':
                    case 'u':
                        /* Reconstruct the active formatting elements, if any. */
                        $this->reconstructActiveFormattingElements();

                        /* Insert an HTML element for the token. */
                        $el = $this->insertElement($token);

                        /* Add that element to the list of active formatting
                        elements. */
                        $this->a_formatting[] = $el;
                        break;

                    /* A start tag token whose tag name is "button" */
                    case 'button':
                        /* If the stack of open elements has a button element in scope,
                        then this is a parse error; act as if an end tag with the tag
                        name "button" had been seen, then reprocess the token. (We don't
                        do that. Unnecessary.) */
                        if ($this->elementInScope('button')) {
                            $this->inBody(
                                array(
                                    'name' => 'button',
                                    'type' => HTML5::ENDTAG
                                )
                            );
                        }

                        /* Reconstruct the active formatting elements, if any. */
                        $this->reconstructActiveFormattingElements();

                        /* Insert an HTML element for the token. */
                        $this->insertElement($token);

                        /* Insert a marker at the end of the list of active
                        formatting elements. */
                        $this->a_formatting[] = self::MARKER;
                        break;

                    /* A start tag token whose tag name is one of: "marquee", "object" */
                    case 'marquee':
                    case 'object':
                        /* Reconstruct the active formatting elements, if any. */
                        $this->reconstructActiveFormattingElements();

                        /* Insert an HTML element for the token. */
                        $this->insertElement($token);

                        /* Insert a marker at the end of the list of active
                        formatting elements. */
                        $this->a_formatting[] = self::MARKER;
                        break;

                    /* A start tag token whose tag name is "xmp" */
                    case 'xmp':
                        /* Reconstruct the active formatting elements, if any. */
                        $this->reconstructActiveFormattingElements();

                        /* Insert an HTML element for the token. */
                        $this->insertElement($token);

                        /* Switch the content model flag to the CDATA state. */
                        return HTML5::CDATA;
                        break;

                    /* A start tag whose tag name is "table" */
                    case 'table':
                        /* If the stack of open elements has a p element in scope,
                        then act as if an end tag with the tag name p had been seen. */
                        if ($this->elementInScope('p')) {
                            $this->emitToken(
                                array(
                                    'name' => 'p',
                                    'type' => HTML5::ENDTAG
                                )
                            );
                        }

                        /* Insert an HTML element for the token. */
                        $this->insertElement($token);

                        /* Change the insertion mode to "in table". */
                        $this->mode = self::IN_TABLE;
                        break;

                    /* A start tag whose tag name is one of: "area", "basefont",
                    "bgsound", "br", "embed", "img", "param", "spacer", "wbr" */
                    case 'area':
                    case 'basefont':
                    case 'bgsound':
                    case 'br':
                    case 'embed':
                    case 'img':
                    case 'param':
                    case 'spacer':
                    case 'wbr':
                        /* Reconstruct the active formatting elements, if any. */
                        $this->reconstructActiveFormattingElements();

                        /* Insert an HTML element for the token. */
                        $this->insertElement($token);

                        /* Immediately pop the current node off the stack of open elements. */
                        array_pop($this->stack);
                        break;

                    /* A start tag whose tag name is "hr" */
                    case 'hr':
                        /* If the stack of open elements has a p element in scope,
                        then act as if an end tag with the tag name p had been seen. */
                        if ($this->elementInScope('p')) {
                            $this->emitToken(
                                array(
                                    'name' => 'p',
                                    'type' => HTML5::ENDTAG
                                )
                            );
                        }

                        /* Insert an HTML element for the token. */
                        $this->insertElement($token);

                        /* Immediately pop the current node off the stack of open elements. */
                        array_pop($this->stack);
                        break;

                    /* A start tag whose tag name is "image" */
                    case 'image':
                        /* Parse error. Change the token's tag name to "img" and
                        reprocess it. (Don't ask.) */
                        $token['name'] = 'img';
                        return $this->inBody($token);
                        break;

                    /* A start tag whose tag name is "input" */
                    case 'input':
                        /* Reconstruct the active formatting elements, if any. */
                        $this->reconstructActiveFormattingElements();

                        /* Insert an input element for the token. */
                        $element = $this->insertElement($token, false);

                        /* If the form element pointer is not null, then associate the
                        input element with the form element pointed to by the form
                        element pointer. */
                        $this->form_pointer !== null
                            ? $this->form_pointer->appendChild($element)
                            : end($this->stack)->appendChild($element);

                        /* Pop that input element off the stack of open elements. */
                        array_pop($this->stack);
                        break;

                    /* A start tag whose tag name is "isindex" */
                    case 'isindex':
                        /* Parse error. */
                        // w/e

                        /* If the form element pointer is not null,
                        then ignore the token. */
                        if ($this->form_pointer === null) {
                            /* Act as if a start tag token with the tag name "form" had
                            been seen. */
                            $this->inBody(
                                array(
                                    'name' => 'body',
                                    'type' => HTML5::STARTTAG,
                                    'attr' => array()
                                )
                            );

                            /* Act as if a start tag token with the tag name "hr" had
                            been seen. */
                            $this->inBody(
                                array(
                                    'name' => 'hr',
                                    'type' => HTML5::STARTTAG,
                                    'attr' => array()
                                )
                            );

                            /* Act as if a start tag token with the tag name "p" had
                            been seen. */
                            $this->inBody(
                                array(
                                    'name' => 'p',
                                    'type' => HTML5::STARTTAG,
                                    'attr' => array()
                                )
                            );

                            /* Act as if a start tag token with the tag name "label"
                            had been seen. */
                            $this->inBody(
                                array(
                                    'name' => 'label',
                                    'type' => HTML5::STARTTAG,
                                    'attr' => array()
                                )
                            );

                            /* Act as if a stream of character tokens had been seen. */
                            $this->insertText(
                                'This is a searchable index. ' .
                                'Insert your search keywords here: '
                            );

                            /* Act as if a start tag token with the tag name "input"
                            had been seen, with all the attributes from the "isindex"
                            token, except with the "name" attribute set to the value
                            "isindex" (ignoring any explicit "name" attribute). */
                            $attr = $token['attr'];
                            $attr[] = array('name' => 'name', 'value' => 'isindex');

                            $this->inBody(
                                array(
                                    'name' => 'input',
                                    'type' => HTML5::STARTTAG,
                                    'attr' => $attr
                                )
                            );

                            /* Act as if a stream of character tokens had been seen
                            (see below for what they should say). */
                            $this->insertText(
                                'This is a searchable index. ' .
                                'Insert your search keywords here: '
                            );

                            /* Act as if an end tag token with the tag name "label"
                            had been seen. */
                            $this->inBody(
                                array(
                                    'name' => 'label',
                                    'type' => HTML5::ENDTAG
                                )
                            );

                            /* Act as if an end tag token with the tag name "p" had
                            been seen. */
                            $this->inBody(
                                array(
                                    'name' => 'p',
                                    'type' => HTML5::ENDTAG
                                )
                            );

                            /* Act as if a start tag token with the tag name "hr" had
                            been seen. */
                            $this->inBody(
                                array(
                                    'name' => 'hr',
                                    'type' => HTML5::ENDTAG
                                )
                            );

                            /* Act as if an end tag token with the tag name "form" had
                            been seen. */
                            $this->inBody(
                                array(
                                    'name' => 'form',
                                    'type' => HTML5::ENDTAG
                                )
                            );
                        }
                        break;

                    /* A start tag whose tag name is "textarea" */
                    case 'textarea':
                        $this->insertElement($token);

                        /* Switch the tokeniser's content model flag to the
                        RCDATA state. */
                        return HTML5::RCDATA;
                        break;

                    /* A start tag whose tag name is one of: "iframe", "noembed",
                    "noframes" */
                    case 'iframe':
                    case 'noembed':
                    case 'noframes':
                        $this->insertElement($token);

                        /* Switch the tokeniser's content model flag to the CDATA state. */
                        return HTML5::CDATA;
                        break;

                    /* A start tag whose tag name is "select" */
                    case 'select':
                        /* Reconstruct the active formatting elements, if any. */
                        $this->reconstructActiveFormattingElements();

                        /* Insert an HTML element for the token. */
                        $this->insertElement($token);

                        /* Change the insertion mode to "in select". */
                        $this->mode = self::IN_SELECT;
                        break;

                    /* A start or end tag whose tag name is one of: "caption", "col",
                    "colgroup", "frame", "frameset", "head", "option", "optgroup",
                    "tbody", "td", "tfoot", "th", "thead", "tr". */
                    case 'caption':
                    case 'col':
                    case 'colgroup':
                    case 'frame':
                    case 'frameset':
                    case 'head':
                    case 'option':
                    case 'optgroup':
                    case 'tbody':
                    case 'td':
                    case 'tfoot':
                    case 'th':
                    case 'thead':
                    case 'tr':
                        // Parse error. Ignore the token.
                        break;

                    /* A start or end tag whose tag name is one of: "event-source",
                    "section", "nav", "article", "aside", "header", "footer",
                    "datagrid", "command" */
                    case 'event-source':
                    case 'section':
                    case 'nav':
                    case 'article':
                    case 'aside':
                    case 'header':
                    case 'footer':
                    case 'datagrid':
                    case 'command':
                        // Work in progress!
                        break;

                    /* A start tag token not covered by the previous entries */
                    default:
                        /* Reconstruct the active formatting elements, if any. */
                        $this->reconstructActiveFormattingElements();

                        $this->insertElement($token, true, true);
                        break;
                }
                break;

            case HTML5::ENDTAG:
                switch ($token['name']) {
                    /* An end tag with the tag name "body" */
                    case 'body':
                        /* If the second element in the stack of open elements is
                        not a body element, this is a parse error. Ignore the token.
                        (innerHTML case) */
                        if (count($this->stack) < 2 || $this->stack[1]->nodeName !== 'body') {
                            // Ignore.

                            /* If the current node is not the body element, then this
                            is a parse error. */
                        } elseif (end($this->stack)->nodeName !== 'body') {
                            // Parse error.
                        }

                        /* Change the insertion mode to "after body". */
                        $this->mode = self::AFTER_BODY;
                        break;

                    /* An end tag with the tag name "html" */
                    case 'html':
                        /* Act as if an end tag with tag name "body" had been seen,
                        then, if that token wasn't ignored, reprocess the current
                        token. */
                        $this->inBody(
                            array(
                                'name' => 'body',
                                'type' => HTML5::ENDTAG
                            )
                        );

                        return $this->afterBody($token);
                        break;

                    /* An end tag whose tag name is one of: "address", "blockquote",
                    "center", "dir", "div", "dl", "fieldset", "listing", "menu",
                    "ol", "pre", "ul" */
                    case 'address':
                    case 'blockquote':
                    case 'center':
                    case 'dir':
                    case 'div':
                    case 'dl':
                    case 'fieldset':
                    case 'listing':
                    case 'menu':
                    case 'ol':
                    case 'pre':
                    case 'ul':
                        /* If the stack of open elements has an element in scope
                        with the same tag name as that of the token, then generate
                        implied end tags. */
                        if ($this->elementInScope($token['name'])) {
                            $this->generateImpliedEndTags();

                            /* Now, if the current node is not an element with
                            the same tag name as that of the token, then this
                            is a parse error. */
                            // w/e

                            /* If the stack of open elements has an element in
                            scope with the same tag name as that of the token,
                            then pop elements from this stack until an element
                            with that tag name has been popped from the stack. */
                            for ($n = count($this->stack) - 1; $n >= 0; $n--) {
                                if ($this->stack[$n]->nodeName === $token['name']) {
                                    $n = -1;
                                }

                                array_pop($this->stack);
                            }
                        }
                        break;

                    /* An end tag whose tag name is "form" */
                    case 'form':
                        /* If the stack of open elements has an element in scope
                        with the same tag name as that of the token, then generate
                        implied    end tags. */
                        if ($this->elementInScope($token['name'])) {
                            $this->generateImpliedEndTags();

                        }

                        if (end($this->stack)->nodeName !== $token['name']) {
                            /* Now, if the current node is not an element with the
                            same tag name as that of the token, then this is a parse
                            error. */
                            // w/e

                        } else {
                            /* Otherwise, if the current node is an element with
                            the same tag name as that of the token pop that element
                            from the stack. */
                            array_pop($this->stack);
                        }

                        /* In any case, set the form element pointer to null. */
                        $this->form_pointer = null;
                        break;

                    /* An end tag whose tag name is "p" */
                    case 'p':
                        /* If the stack of open elements has a p element in scope,
                        then generate implied end tags, except for p elements. */
                        if ($this->elementInScope('p')) {
                            $this->generateImpliedEndTags(array('p'));

                            /* If the current node is not a p element, then this is
                            a parse error. */
                            // k

                            /* If the stack of open elements has a p element in
                            scope, then pop elements from this stack until the stack
                            no longer has a p element in scope. */
                            for ($n = count($this->stack) - 1; $n >= 0; $n--) {
                                if ($this->elementInScope('p')) {
                                    array_pop($this->stack);

                                } else {
                                    break;
                                }
                            }
                        }
                        break;

                    /* An end tag whose tag name is "dd", "dt", or "li" */
                    case 'dd':
                    case 'dt':
                    case 'li':
                        /* If the stack of open elements has an element in scope
                        whose tag name matches the tag name of the token, then
                        generate implied end tags, except for elements with the
                        same tag name as the token. */
                        if ($this->elementInScope($token['name'])) {
                            $this->generateImpliedEndTags(array($token['name']));

                            /* If the current node is not an element with the same
                            tag name as the token, then this is a parse error. */
                            // w/e

                            /* If the stack of open elements has an element in scope
                            whose tag name matches the tag name of the token, then
                            pop elements from this stack until an element with that
                            tag name has been popped from the stack. */
                            for ($n = count($this->stack) - 1; $n >= 0; $n--) {
                                if ($this->stack[$n]->nodeName === $token['name']) {
                                    $n = -1;
                                }

                                array_pop($this->stack);
                            }
                        }
                        break;

                    /* An end tag whose tag name is one of: "h1", "h2", "h3", "h4",
                    "h5", "h6" */
                    case 'h1':
                    case 'h2':
                    case 'h3':
                    case 'h4':
                    case 'h5':
                    case 'h6':
                        $elements = array('h1', 'h2', 'h3', 'h4', 'h5', 'h6');

                        /* If the stack of open elements has in scope an element whose
                        tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then
                        generate implied end tags. */
                        if ($this->elementInScope($elements)) {
                            $this->generateImpliedEndTags();

                            /* Now, if the current node is not an element with the same
                            tag name as that of the token, then this is a parse error. */
                            // w/e

                            /* If the stack of open elements has in scope an element
                            whose tag name is one of "h1", "h2", "h3", "h4", "h5", or
                            "h6", then pop elements from the stack until an element
                            with one of those tag names has been popped from the stack. */
                            while ($this->elementInScope($elements)) {
                                array_pop($this->stack);
                            }
                        }
                        break;

                    /* An end tag whose tag name is one of: "a", "b", "big", "em",
                    "font", "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */
                    case 'a':
                    case 'b':
                    case 'big':
                    case 'em':
                    case 'font':
                    case 'i':
                    case 'nobr':
                    case 's':
                    case 'small':
                    case 'strike':
                    case 'strong':
                    case 'tt':
                    case 'u':
                        /* 1. Let the formatting element be the last element in
                        the list of active formatting elements that:
                            * is between the end of the list and the last scope
                            marker in the list, if any, or the start of the list
                            otherwise, and
                            * has the same tag name as the token.
                        */
                        while (true) {
                            for ($a = count($this->a_formatting) - 1; $a >= 0; $a--) {
                                if ($this->a_formatting[$a] === self::MARKER) {
                                    break;

                                } elseif ($this->a_formatting[$a]->tagName === $token['name']) {
                                    $formatting_element = $this->a_formatting[$a];
                                    $in_stack = in_array($formatting_element, $this->stack, true);
                                    $fe_af_pos = $a;
                                    break;
                                }
                            }

                            /* If there is no such node, or, if that node is
                            also in the stack of open elements but the element
                            is not in scope, then this is a parse error. Abort
                            these steps. The token is ignored. */
                            if (!isset($formatting_element) || ($in_stack &&
                                    !$this->elementInScope($token['name']))
                            ) {
                                break;

                                /* Otherwise, if there is such a node, but that node
                                is not in the stack of open elements, then this is a
                                parse error; remove the element from the list, and
                                abort these steps. */
                            } elseif (isset($formatting_element) && !$in_stack) {
                                unset($this->a_formatting[$fe_af_pos]);
                                $this->a_formatting = array_merge($this->a_formatting);
                                break;
                            }

                            /* 2. Let the furthest block be the topmost node in the
                            stack of open elements that is lower in the stack
                            than the formatting element, and is not an element in
                            the phrasing or formatting categories. There might
                            not be one. */
                            $fe_s_pos = array_search($formatting_element, $this->stack, true);
                            $length = count($this->stack);

                            for ($s = $fe_s_pos + 1; $s < $length; $s++) {
                                $category = $this->getElementCategory($this->stack[$s]->nodeName);

                                if ($category !== self::PHRASING && $category !== self::FORMATTING) {
                                    $furthest_block = $this->stack[$s];
                                }
                            }

                            /* 3. If there is no furthest block, then the UA must
                            skip the subsequent steps and instead just pop all
                            the nodes from the bottom of the stack of open
                            elements, from the current node up to the formatting
                            element, and remove the formatting element from the
                            list of active formatting elements. */
                            if (!isset($furthest_block)) {
                                for ($n = $length - 1; $n >= $fe_s_pos; $n--) {
                                    array_pop($this->stack);
                                }

                                unset($this->a_formatting[$fe_af_pos]);
                                $this->a_formatting = array_merge($this->a_formatting);
                                break;
                            }

                            /* 4. Let the common ancestor be the element
                            immediately above the formatting element in the stack
                            of open elements. */
                            $common_ancestor = $this->stack[$fe_s_pos - 1];

                            /* 5. If the furthest block has a parent node, then
                            remove the furthest block from its parent node. */
                            if ($furthest_block->parentNode !== null) {
                                $furthest_block->parentNode->removeChild($furthest_block);
                            }

                            /* 6. Let a bookmark note the position of the
                            formatting element in the list of active formatting
                            elements relative to the elements on either side
                            of it in the list. */
                            $bookmark = $fe_af_pos;

                            /* 7. Let node and last node  be the furthest block.
                            Follow these steps: */
                            $node = $furthest_block;
                            $last_node = $furthest_block;

                            while (true) {
                                for ($n = array_search($node, $this->stack, true) - 1; $n >= 0; $n--) {
                                    /* 7.1 Let node be the element immediately
                                    prior to node in the stack of open elements. */
                                    $node = $this->stack[$n];

                                    /* 7.2 If node is not in the list of active
                                    formatting elements, then remove node from
                                    the stack of open elements and then go back
                                    to step 1. */
                                    if (!in_array($node, $this->a_formatting, true)) {
                                        unset($this->stack[$n]);
                                        $this->stack = array_merge($this->stack);

                                    } else {
                                        break;
                                    }
                                }

                                /* 7.3 Otherwise, if node is the formatting
                                element, then go to the next step in the overall
                                algorithm. */
                                if ($node === $formatting_element) {
                                    break;

                                    /* 7.4 Otherwise, if last node is the furthest
                                    block, then move the aforementioned bookmark to
                                    be immediately after the node in the list of
                                    active formatting elements. */
                                } elseif ($last_node === $furthest_block) {
                                    $bookmark = array_search($node, $this->a_formatting, true) + 1;
                                }

                                /* 7.5 If node has any children, perform a
                                shallow clone of node, replace the entry for
                                node in the list of active formatting elements
                                with an entry for the clone, replace the entry
                                for node in the stack of open elements with an
                                entry for the clone, and let node be the clone. */
                                if ($node->hasChildNodes()) {
                                    $clone = $node->cloneNode();
                                    $s_pos = array_search($node, $this->stack, true);
                                    $a_pos = array_search($node, $this->a_formatting, true);

                                    $this->stack[$s_pos] = $clone;
                                    $this->a_formatting[$a_pos] = $clone;
                                    $node = $clone;
                                }

                                /* 7.6 Insert last node into node, first removing
                                it from its previous parent node if any. */
                                if ($last_node->parentNode !== null) {
                                    $last_node->parentNode->removeChild($last_node);
                                }

                                $node->appendChild($last_node);

                                /* 7.7 Let last node be node. */
                                $last_node = $node;
                            }

                            /* 8. Insert whatever last node ended up being in
                            the previous step into the common ancestor node,
                            first removing it from its previous parent node if
                            any. */
                            if ($last_node->parentNode !== null) {
                                $last_node->parentNode->removeChild($last_node);
                            }

                            $common_ancestor->appendChild($last_node);

                            /* 9. Perform a shallow clone of the formatting
                            element. */
                            $clone = $formatting_element->cloneNode();

                            /* 10. Take all of the child nodes of the furthest
                            block and append them to the clone created in the
                            last step. */
                            while ($furthest_block->hasChildNodes()) {
                                $child = $furthest_block->firstChild;
                                $furthest_block->removeChild($child);
                                $clone->appendChild($child);
                            }

                            /* 11. Append that clone to the furthest block. */
                            $furthest_block->appendChild($clone);

                            /* 12. Remove the formatting element from the list
                            of active formatting elements, and insert the clone
                            into the list of active formatting elements at the
                            position of the aforementioned bookmark. */
                            $fe_af_pos = array_search($formatting_element, $this->a_formatting, true);
                            unset($this->a_formatting[$fe_af_pos]);
                            $this->a_formatting = array_merge($this->a_formatting);

                            $af_part1 = array_slice($this->a_formatting, 0, $bookmark - 1);
                            $af_part2 = array_slice($this->a_formatting, $bookmark, count($this->a_formatting));
                            $this->a_formatting = array_merge($af_part1, array($clone), $af_part2);

                            /* 13. Remove the formatting element from the stack
                            of open elements, and insert the clone into the stack
                            of open elements immediately after (i.e. in a more
                            deeply nested position than) the position of the
                            furthest block in that stack. */
                            $fe_s_pos = array_search($formatting_element, $this->stack, true);
                            $fb_s_pos = array_search($furthest_block, $this->stack, true);
                            unset($this->stack[$fe_s_pos]);

                            $s_part1 = array_slice($this->stack, 0, $fb_s_pos);
                            $s_part2 = array_slice($this->stack, $fb_s_pos + 1, count($this->stack));
                            $this->stack = array_merge($s_part1, array($clone), $s_part2);

                            /* 14. Jump back to step 1 in this series of steps. */
                            unset($formatting_element, $fe_af_pos, $fe_s_pos, $furthest_block);
                        }
                        break;

                    /* An end tag token whose tag name is one of: "button",
                    "marquee", "object" */
                    case 'button':
                    case 'marquee':
                    case 'object':
                        /* If the stack of open elements has an element in scope whose
                        tag name matches the tag name of the token, then generate implied
                        tags. */
                        if ($this->elementInScope($token['name'])) {
                            $this->generateImpliedEndTags();

                            /* Now, if the current node is not an element with the same
                            tag name as the token, then this is a parse error. */
                            // k

                            /* Now, if the stack of open elements has an element in scope
                            whose tag name matches the tag name of the token, then pop
                            elements from the stack until that element has been popped from
                            the stack, and clear the list of active formatting elements up
                            to the last marker. */
                            for ($n = count($this->stack) - 1; $n >= 0; $n--) {
                                if ($this->stack[$n]->nodeName === $token['name']) {
                                    $n = -1;
                                }

                                array_pop($this->stack);
                            }

                            $marker = end(array_keys($this->a_formatting, self::MARKER, true));

                            for ($n = count($this->a_formatting) - 1; $n > $marker; $n--) {
                                array_pop($this->a_formatting);
                            }
                        }
                        break;

                    /* Or an end tag whose tag name is one of: "area", "basefont",
                    "bgsound", "br", "embed", "hr", "iframe", "image", "img",
                    "input", "isindex", "noembed", "noframes", "param", "select",
                    "spacer", "table", "textarea", "wbr" */
                    case 'area':
                    case 'basefont':
                    case 'bgsound':
                    case 'br':
                    case 'embed':
                    case 'hr':
                    case 'iframe':
                    case 'image':
                    case 'img':
                    case 'input':
                    case 'isindex':
                    case 'noembed':
                    case 'noframes':
                    case 'param':
                    case 'select':
                    case 'spacer':
                    case 'table':
                    case 'textarea':
                    case 'wbr':
                        // Parse error. Ignore the token.
                        break;

                    /* An end tag token not covered by the previous entries */
                    default:
                        for ($n = count($this->stack) - 1; $n >= 0; $n--) {
                            /* Initialise node to be the current node (the bottommost
                            node of the stack). */
                            $node = end($this->stack);

                            /* If node has the same tag name as the end tag token,
                            then: */
                            if ($token['name'] === $node->nodeName) {
                                /* Generate implied end tags. */
                                $this->generateImpliedEndTags();

                                /* If the tag name of the end tag token does not
                                match the tag name of the current node, this is a
                                parse error. */
                                // k

                                /* Pop all the nodes from the current node up to
                                node, including node, then stop this algorithm. */
                                for ($x = count($this->stack) - $n; $x >= $n; $x--) {
                                    array_pop($this->stack);
                                }

                            } else {
                                $category = $this->getElementCategory($node);

                                if ($category !== self::SPECIAL && $category !== self::SCOPING) {
                                    /* Otherwise, if node is in neither the formatting
                                    category nor the phrasing category, then this is a
                                    parse error. Stop this algorithm. The end tag token
                                    is ignored. */
                                    return false;
                                }
                            }
                        }
                        break;
                }
                break;
        }
    }

    private function inTable($token)
    {
        $clear = array('html', 'table');

        /* A character token that is one of one of U+0009 CHARACTER TABULATION,
        U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
        or U+0020 SPACE */
        if ($token['type'] === HTML5::CHARACTR &&
            preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
        ) {
            /* Append the character to the current node. */
            $text = $this->dom->createTextNode($token['data']);
            end($this->stack)->appendChild($text);

            /* A comment token */
        } elseif ($token['type'] === HTML5::COMMENT) {
            /* Append a Comment node to the current node with the data
            attribute set to the data given in the comment token. */
            $comment = $this->dom->createComment($token['data']);
            end($this->stack)->appendChild($comment);

            /* A start tag whose tag name is "caption" */
        } elseif ($token['type'] === HTML5::STARTTAG &&
            $token['name'] === 'caption'
        ) {
            /* Clear the stack back to a table context. */
            $this->clearStackToTableContext($clear);

            /* Insert a marker at the end of the list of active
            formatting elements. */
            $this->a_formatting[] = self::MARKER;

            /* Insert an HTML element for the token, then switch the
            insertion mode to "in caption". */
            $this->insertElement($token);
            $this->mode = self::IN_CAPTION;

            /* A start tag whose tag name is "colgroup" */
        } elseif ($token['type'] === HTML5::STARTTAG &&
            $token['name'] === 'colgroup'
        ) {
            /* Clear the stack back to a table context. */
            $this->clearStackToTableContext($clear);

            /* Insert an HTML element for the token, then switch the
            insertion mode to "in column group". */
            $this->insertElement($token);
            $this->mode = self::IN_CGROUP;

            /* A start tag whose tag name is "col" */
        } elseif ($token['type'] === HTML5::STARTTAG &&
            $token['name'] === 'col'
        ) {
            $this->inTable(
                array(
                    'name' => 'colgroup',
                    'type' => HTML5::STARTTAG,
                    'attr' => array()
                )
            );

            $this->inColumnGroup($token);

            /* A start tag whose tag name is one of: "tbody", "tfoot", "thead" */
        } elseif ($token['type'] === HTML5::STARTTAG && in_array(
                $token['name'],
                array('tbody', 'tfoot', 'thead')
            )
        ) {
            /* Clear the stack back to a table context. */
            $this->clearStackToTableContext($clear);

            /* Insert an HTML element for the token, then switch the insertion
            mode to "in table body". */
            $this->insertElement($token);
            $this->mode = self::IN_TBODY;

            /* A start tag whose tag name is one of: "td", "th", "tr" */
        } elseif ($token['type'] === HTML5::STARTTAG &&
            in_array($token['name'], array('td', 'th', 'tr'))
        ) {
            /* Act as if a start tag token with the tag name "tbody" had been
            seen, then reprocess the current token. */
            $this->inTable(
                array(
                    'name' => 'tbody',
                    'type' => HTML5::STARTTAG,
                    'attr' => array()
                )
            );

            return $this->inTableBody($token);

            /* A start tag whose tag name is "table" */
        } elseif ($token['type'] === HTML5::STARTTAG &&
            $token['name'] === 'table'
        ) {
            /* Parse error. Act as if an end tag token with the tag name "table"
            had been seen, then, if that token wasn't ignored, reprocess the
            current token. */
            $this->inTable(
                array(
                    'name' => 'table',
                    'type' => HTML5::ENDTAG
                )
            );

            return $this->mainPhase($token);

            /* An end tag whose tag name is "table" */
        } elseif ($token['type'] === HTML5::ENDTAG &&
            $token['name'] === 'table'
        ) {
            /* If the stack of open elements does not have an element in table
            scope with the same tag name as the token, this is a parse error.
            Ignore the token. (innerHTML case) */
            if (!$this->elementInScope($token['name'], true)) {
                return false;

                /* Otherwise: */
            } else {
                /* Generate implied end tags. */
                $this->generateImpliedEndTags();

                /* Now, if the current node is not a table element, then this
                is a parse error. */
                // w/e

                /* Pop elements from this stack until a table element has been
                popped from the stack. */
                while (true) {
                    $current = end($this->stack)->nodeName;
                    array_pop($this->stack);

                    if ($current === 'table') {
                        break;
                    }
                }

                /* Reset the insertion mode appropriately. */
                $this->resetInsertionMode();
            }

            /* An end tag whose tag name is one of: "body", "caption", "col",
            "colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr" */
        } elseif ($token['type'] === HTML5::ENDTAG && in_array(
                $token['name'],
                array(
                    'body',
                    'caption',
                    'col',
                    'colgroup',
                    'html',
                    'tbody',
                    'td',
                    'tfoot',
                    'th',
                    'thead',
                    'tr'
                )
            )
        ) {
            // Parse error. Ignore the token.

            /* Anything else */
        } else {
            /* Parse error. Process the token as if the insertion mode was "in
            body", with the following exception: */

            /* If the current node is a table, tbody, tfoot, thead, or tr
            element, then, whenever a node would be inserted into the current
            node, it must instead be inserted into the foster parent element. */
            if (in_array(
                end($this->stack)->nodeName,
                array('table', 'tbody', 'tfoot', 'thead', 'tr')
            )
            ) {
                /* The foster parent element is the parent element of the last
                table element in the stack of open elements, if there is a
                table element and it has such a parent element. If there is no
                table element in the stack of open elements (innerHTML case),
                then the foster parent element is the first element in the
                stack of open elements (the html  element). Otherwise, if there
                is a table element in the stack of open elements, but the last
                table element in the stack of open elements has no parent, or
                its parent node is not an element, then the foster parent
                element is the element before the last table element in the
                stack of open elements. */
                for ($n = count($this->stack) - 1; $n >= 0; $n--) {
                    if ($this->stack[$n]->nodeName === 'table') {
                        $table = $this->stack[$n];
                        break;
                    }
                }

                if (isset($table) && $table->parentNode !== null) {
                    $this->foster_parent = $table->parentNode;

                } elseif (!isset($table)) {
                    $this->foster_parent = $this->stack[0];

                } elseif (isset($table) && ($table->parentNode === null ||
                        $table->parentNode->nodeType !== XML_ELEMENT_NODE)
                ) {
                    $this->foster_parent = $this->stack[$n - 1];
                }
            }

            $this->inBody($token);
        }
    }

    private function inCaption($token)
    {
        /* An end tag whose tag name is "caption" */
        if ($token['type'] === HTML5::ENDTAG && $token['name'] === 'caption') {
            /* If the stack of open elements does not have an element in table
            scope with the same tag name as the token, this is a parse error.
            Ignore the token. (innerHTML case) */
            if (!$this->elementInScope($token['name'], true)) {
                // Ignore

                /* Otherwise: */
            } else {
                /* Generate implied end tags. */
                $this->generateImpliedEndTags();

                /* Now, if the current node is not a caption element, then this
                is a parse error. */
                // w/e

                /* Pop elements from this stack until a caption element has
                been popped from the stack. */
                while (true) {
                    $node = end($this->stack)->nodeName;
                    array_pop($this->stack);

                    if ($node === 'caption') {
                        break;
                    }
                }

                /* Clear the list of active formatting elements up to the last
                marker. */
                $this->clearTheActiveFormattingElementsUpToTheLastMarker();

                /* Switch the insertion mode to "in table". */
                $this->mode = self::IN_TABLE;
            }

            /* A start tag whose tag name is one of: "caption", "col", "colgroup",
            "tbody", "td", "tfoot", "th", "thead", "tr", or an end tag whose tag
            name is "table" */
        } elseif (($token['type'] === HTML5::STARTTAG && in_array(
                    $token['name'],
                    array(
                        'caption',
                        'col',
                        'colgroup',
                        'tbody',
                        'td',
                        'tfoot',
                        'th',
                        'thead',
                        'tr'
                    )
                )) || ($token['type'] === HTML5::ENDTAG &&
                $token['name'] === 'table')
        ) {
            /* Parse error. Act as if an end tag with the tag name "caption"
            had been seen, then, if that token wasn't ignored, reprocess the
            current token. */
            $this->inCaption(
                array(
                    'name' => 'caption',
                    'type' => HTML5::ENDTAG
                )
            );

            return $this->inTable($token);

            /* An end tag whose tag name is one of: "body", "col", "colgroup",
            "html", "tbody", "td", "tfoot", "th", "thead", "tr" */
        } elseif ($token['type'] === HTML5::ENDTAG && in_array(
                $token['name'],
                array(
                    'body',
                    'col',
                    'colgroup',
                    'html',
                    'tbody',
                    'tfoot',
                    'th',
                    'thead',
                    'tr'
                )
            )
        ) {
            // Parse error. Ignore the token.

            /* Anything else */
        } else {
            /* Process the token as if the insertion mode was "in body". */
            $this->inBody($token);
        }
    }

    private function inColumnGroup($token)
    {
        /* A character token that is one of one of U+0009 CHARACTER TABULATION,
        U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
        or U+0020 SPACE */
        if ($token['type'] === HTML5::CHARACTR &&
            preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
        ) {
            /* Append the character to the current node. */
            $text = $this->dom->createTextNode($token['data']);
            end($this->stack)->appendChild($text);

            /* A comment token */
        } elseif ($token['type'] === HTML5::COMMENT) {
            /* Append a Comment node to the current node with the data
            attribute set to the data given in the comment token. */
            $comment = $this->dom->createComment($token['data']);
            end($this->stack)->appendChild($comment);

            /* A start tag whose tag name is "col" */
        } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'col') {
            /* Insert a col element for the token. Immediately pop the current
            node off the stack of open elements. */
            $this->insertElement($token);
            array_pop($this->stack);

            /* An end tag whose tag name is "colgroup" */
        } elseif ($token['type'] === HTML5::ENDTAG &&
            $token['name'] === 'colgroup'
        ) {
            /* If the current node is the root html element, then this is a
            parse error, ignore the token. (innerHTML case) */
            if (end($this->stack)->nodeName === 'html') {
                // Ignore

                /* Otherwise, pop the current node (which will be a colgroup
                element) from the stack of open elements. Switch the insertion
                mode to "in table". */
            } else {
                array_pop($this->stack);
                $this->mode = self::IN_TABLE;
            }

            /* An end tag whose tag name is "col" */
        } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'col') {
            /* Parse error. Ignore the token. */

            /* Anything else */
        } else {
            /* Act as if an end tag with the tag name "colgroup" had been seen,
            and then, if that token wasn't ignored, reprocess the current token. */
            $this->inColumnGroup(
                array(
                    'name' => 'colgroup',
                    'type' => HTML5::ENDTAG
                )
            );

            return $this->inTable($token);
        }
    }

    private function inTableBody($token)
    {
        $clear = array('tbody', 'tfoot', 'thead', 'html');

        /* A start tag whose tag name is "tr" */
        if ($token['type'] === HTML5::STARTTAG && $token['name'] === 'tr') {
            /* Clear the stack back to a table body context. */
            $this->clearStackToTableContext($clear);

            /* Insert a tr element for the token, then switch the insertion
            mode to "in row". */
            $this->insertElement($token);
            $this->mode = self::IN_ROW;

            /* A start tag whose tag name is one of: "th", "td" */
        } elseif ($token['type'] === HTML5::STARTTAG &&
            ($token['name'] === 'th' || $token['name'] === 'td')
        ) {
            /* Parse error. Act as if a start tag with the tag name "tr" had
            been seen, then reprocess the current token. */
            $this->inTableBody(
                array(
                    'name' => 'tr',
                    'type' => HTML5::STARTTAG,
                    'attr' => array()
                )
            );

            return $this->inRow($token);

            /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */
        } elseif ($token['type'] === HTML5::ENDTAG &&
            in_array($token['name'], array('tbody', 'tfoot', 'thead'))
        ) {
            /* If the stack of open elements does not have an element in table
            scope with the same tag name as the token, this is a parse error.
            Ignore the token. */
            if (!$this->elementInScope($token['name'], true)) {
                // Ignore

                /* Otherwise: */
            } else {
                /* Clear the stack back to a table body context. */
                $this->clearStackToTableContext($clear);

                /* Pop the current node from the stack of open elements. Switch
                the insertion mode to "in table". */
                array_pop($this->stack);
                $this->mode = self::IN_TABLE;
            }

            /* A start tag whose tag name is one of: "caption", "col", "colgroup",
            "tbody", "tfoot", "thead", or an end tag whose tag name is "table" */
        } elseif (($token['type'] === HTML5::STARTTAG && in_array(
                    $token['name'],
                    array('caption', 'col', 'colgroup', 'tbody', 'tfoor', 'thead')
                )) ||
            ($token['type'] === HTML5::STARTTAG && $token['name'] === 'table')
        ) {
            /* If the stack of open elements does not have a tbody, thead, or
            tfoot element in table scope, this is a parse error. Ignore the
            token. (innerHTML case) */
            if (!$this->elementInScope(array('tbody', 'thead', 'tfoot'), true)) {
                // Ignore.

                /* Otherwise: */
            } else {
                /* Clear the stack back to a table body context. */
                $this->clearStackToTableContext($clear);

                /* Act as if an end tag with the same tag name as the current
                node ("tbody", "tfoot", or "thead") had been seen, then
                reprocess the current token. */
                $this->inTableBody(
                    array(
                        'name' => end($this->stack)->nodeName,
                        'type' => HTML5::ENDTAG
                    )
                );

                return $this->mainPhase($token);
            }

            /* An end tag whose tag name is one of: "body", "caption", "col",
            "colgroup", "html", "td", "th", "tr" */
        } elseif ($token['type'] === HTML5::ENDTAG && in_array(
                $token['name'],
                array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr')
            )
        ) {
            /* Parse error. Ignore the token. */

            /* Anything else */
        } else {
            /* Process the token as if the insertion mode was "in table". */
            $this->inTable($token);
        }
    }

    private function inRow($token)
    {
        $clear = array('tr', 'html');

        /* A start tag whose tag name is one of: "th", "td" */
        if ($token['type'] === HTML5::STARTTAG &&
            ($token['name'] === 'th' || $token['name'] === 'td')
        ) {
            /* Clear the stack back to a table row context. */
            $this->clearStackToTableContext($clear);

            /* Insert an HTML element for the token, then switch the insertion
            mode to "in cell". */
            $this->insertElement($token);
            $this->mode = self::IN_CELL;

            /* Insert a marker at the end of the list of active formatting
            elements. */
            $this->a_formatting[] = self::MARKER;

            /* An end tag whose tag name is "tr" */
        } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'tr') {
            /* If the stack of open elements does not have an element in table
            scope with the same tag name as the token, this is a parse error.
            Ignore the token. (innerHTML case) */
            if (!$this->elementInScope($token['name'], true)) {
                // Ignore.

                /* Otherwise: */
            } else {
                /* Clear the stack back to a table row context. */
                $this->clearStackToTableContext($clear);

                /* Pop the current node (which will be a tr element) from the
                stack of open elements. Switch the insertion mode to "in table
                body". */
                array_pop($this->stack);
                $this->mode = self::IN_TBODY;
            }

            /* A start tag whose tag name is one of: "caption", "col", "colgroup",
            "tbody", "tfoot", "thead", "tr" or an end tag whose tag name is "table" */
        } elseif ($token['type'] === HTML5::STARTTAG && in_array(
                $token['name'],
                array('caption', 'col', 'colgroup', 'tbody', 'tfoot', 'thead', 'tr')
            )
        ) {
            /* Act as if an end tag with the tag name "tr" had been seen, then,
            if that token wasn't ignored, reprocess the current token. */
            $this->inRow(
                array(
                    'name' => 'tr',
                    'type' => HTML5::ENDTAG
                )
            );

            return $this->inCell($token);

            /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */
        } elseif ($token['type'] === HTML5::ENDTAG &&
            in_array($token['name'], array('tbody', 'tfoot', 'thead'))
        ) {
            /* If the stack of open elements does not have an element in table
            scope with the same tag name as the token, this is a parse error.
            Ignore the token. */
            if (!$this->elementInScope($token['name'], true)) {
                // Ignore.

                /* Otherwise: */
            } else {
                /* Otherwise, act as if an end tag with the tag name "tr" had
                been seen, then reprocess the current token. */
                $this->inRow(
                    array(
                        'name' => 'tr',
                        'type' => HTML5::ENDTAG
                    )
                );

                return $this->inCell($token);
            }

            /* An end tag whose tag name is one of: "body", "caption", "col",
            "colgroup", "html", "td", "th" */
        } elseif ($token['type'] === HTML5::ENDTAG && in_array(
                $token['name'],
                array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr')
            )
        ) {
            /* Parse error. Ignore the token. */

            /* Anything else */
        } else {
            /* Process the token as if the insertion mode was "in table". */
            $this->inTable($token);
        }
    }

    private function inCell($token)
    {
        /* An end tag whose tag name is one of: "td", "th" */
        if ($token['type'] === HTML5::ENDTAG &&
            ($token['name'] === 'td' || $token['name'] === 'th')
        ) {
            /* If the stack of open elements does not have an element in table
            scope with the same tag name as that of the token, then this is a
            parse error and the token must be ignored. */
            if (!$this->elementInScope($token['name'], true)) {
                // Ignore.

                /* Otherwise: */
            } else {
                /* Generate implied end tags, except for elements with the same
                tag name as the token. */
                $this->generateImpliedEndTags(array($token['name']));

                /* Now, if the current node is not an element with the same tag
                name as the token, then this is a parse error. */
                // k

                /* Pop elements from this stack until an element with the same
                tag name as the token has been popped from the stack. */
                while (true) {
                    $node = end($this->stack)->nodeName;
                    array_pop($this->stack);

                    if ($node === $token['name']) {
                        break;
                    }
                }

                /* Clear the list of active formatting elements up to the last
                marker. */
                $this->clearTheActiveFormattingElementsUpToTheLastMarker();

                /* Switch the insertion mode to "in row". (The current node
                will be a tr element at this point.) */
                $this->mode = self::IN_ROW;
            }

            /* A start tag whose tag name is one of: "caption", "col", "colgroup",
            "tbody", "td", "tfoot", "th", "thead", "tr" */
        } elseif ($token['type'] === HTML5::STARTTAG && in_array(
                $token['name'],
                array(
                    'caption',
                    'col',
                    'colgroup',
                    'tbody',
                    'td',
                    'tfoot',
                    'th',
                    'thead',
                    'tr'
                )
            )
        ) {
            /* If the stack of open elements does not have a td or th element
            in table scope, then this is a parse error; ignore the token.
            (innerHTML case) */
            if (!$this->elementInScope(array('td', 'th'), true)) {
                // Ignore.

                /* Otherwise, close the cell (see below) and reprocess the current
                token. */
            } else {
                $this->closeCell();
                return $this->inRow($token);
            }

            /* A start tag whose tag name is one of: "caption", "col", "colgroup",
            "tbody", "td", "tfoot", "th", "thead", "tr" */
        } elseif ($token['type'] === HTML5::STARTTAG && in_array(
                $token['name'],
                array(
                    'caption',
                    'col',
                    'colgroup',
                    'tbody',
                    'td',
                    'tfoot',
                    'th',
                    'thead',
                    'tr'
                )
            )
        ) {
            /* If the stack of open elements does not have a td or th element
            in table scope, then this is a parse error; ignore the token.
            (innerHTML case) */
            if (!$this->elementInScope(array('td', 'th'), true)) {
                // Ignore.

                /* Otherwise, close the cell (see below) and reprocess the current
                token. */
            } else {
                $this->closeCell();
                return $this->inRow($token);
            }

            /* An end tag whose tag name is one of: "body", "caption", "col",
            "colgroup", "html" */
        } elseif ($token['type'] === HTML5::ENDTAG && in_array(
                $token['name'],
                array('body', 'caption', 'col', 'colgroup', 'html')
            )
        ) {
            /* Parse error. Ignore the token. */

            /* An end tag whose tag name is one of: "table", "tbody", "tfoot",
            "thead", "tr" */
        } elseif ($token['type'] === HTML5::ENDTAG && in_array(
                $token['name'],
                array('table', 'tbody', 'tfoot', 'thead', 'tr')
            )
        ) {
            /* If the stack of open elements does not have an element in table
            scope with the same tag name as that of the token (which can only
            happen for "tbody", "tfoot" and "thead", or, in the innerHTML case),
            then this is a parse error and the token must be ignored. */
            if (!$this->elementInScope($token['name'], true)) {
                // Ignore.

                /* Otherwise, close the cell (see below) and reprocess the current
                token. */
            } else {
                $this->closeCell();
                return $this->inRow($token);
            }

            /* Anything else */
        } else {
            /* Process the token as if the insertion mode was "in body". */
            $this->inBody($token);
        }
    }

    private function inSelect($token)
    {
        /* Handle the token as follows: */

        /* A character token */
        if ($token['type'] === HTML5::CHARACTR) {
            /* Append the token's character to the current node. */
            $this->insertText($token['data']);

            /* A comment token */
        } elseif ($token['type'] === HTML5::COMMENT) {
            /* Append a Comment node to the current node with the data
            attribute set to the data given in the comment token. */
            $this->insertComment($token['data']);

            /* A start tag token whose tag name is "option" */
        } elseif ($token['type'] === HTML5::STARTTAG &&
            $token['name'] === 'option'
        ) {
            /* If the current node is an option element, act as if an end tag
            with the tag name "option" had been seen. */
            if (end($this->stack)->nodeName === 'option') {
                $this->inSelect(
                    array(
                        'name' => 'option',
                        'type' => HTML5::ENDTAG
                    )
                );
            }

            /* Insert an HTML element for the token. */
            $this->insertElement($token);

            /* A start tag token whose tag name is "optgroup" */
        } elseif ($token['type'] === HTML5::STARTTAG &&
            $token['name'] === 'optgroup'
        ) {
            /* If the current node is an option element, act as if an end tag
            with the tag name "option" had been seen. */
            if (end($this->stack)->nodeName === 'option') {
                $this->inSelect(
                    array(
                        'name' => 'option',
                        'type' => HTML5::ENDTAG
                    )
                );
            }

            /* If the current node is an optgroup element, act as if an end tag
            with the tag name "optgroup" had been seen. */
            if (end($this->stack)->nodeName === 'optgroup') {
                $this->inSelect(
                    array(
                        'name' => 'optgroup',
                        'type' => HTML5::ENDTAG
                    )
                );
            }

            /* Insert an HTML element for the token. */
            $this->insertElement($token);

            /* An end tag token whose tag name is "optgroup" */
        } elseif ($token['type'] === HTML5::ENDTAG &&
            $token['name'] === 'optgroup'
        ) {
            /* First, if the current node is an option element, and the node
            immediately before it in the stack of open elements is an optgroup
            element, then act as if an end tag with the tag name "option" had
            been seen. */
            $elements_in_stack = count($this->stack);

            if ($this->stack[$elements_in_stack - 1]->nodeName === 'option' &&
                $this->stack[$elements_in_stack - 2]->nodeName === 'optgroup'
            ) {
                $this->inSelect(
                    array(
                        'name' => 'option',
                        'type' => HTML5::ENDTAG
                    )
                );
            }

            /* If the current node is an optgroup element, then pop that node
            from the stack of open elements. Otherwise, this is a parse error,
            ignore the token. */
            if ($this->stack[$elements_in_stack - 1] === 'optgroup') {
                array_pop($this->stack);
            }

            /* An end tag token whose tag name is "option" */
        } elseif ($token['type'] === HTML5::ENDTAG &&
            $token['name'] === 'option'
        ) {
            /* If the current node is an option element, then pop that node
            from the stack of open elements. Otherwise, this is a parse error,
            ignore the token. */
            if (end($this->stack)->nodeName === 'option') {
                array_pop($this->stack);
            }

            /* An end tag whose tag name is "select" */
        } elseif ($token['type'] === HTML5::ENDTAG &&
            $token['name'] === 'select'
        ) {
            /* If the stack of open elements does not have an element in table
            scope with the same tag name as the token, this is a parse error.
            Ignore the token. (innerHTML case) */
            if (!$this->elementInScope($token['name'], true)) {
                // w/e

                /* Otherwise: */
            } else {
                /* Pop elements from the stack of open elements until a select
                element has been popped from the stack. */
                while (true) {
                    $current = end($this->stack)->nodeName;
                    array_pop($this->stack);

                    if ($current === 'select') {
                        break;
                    }
                }

                /* Reset the insertion mode appropriately. */
                $this->resetInsertionMode();
            }

            /* A start tag whose tag name is "select" */
        } elseif ($token['name'] === 'select' &&
            $token['type'] === HTML5::STARTTAG
        ) {
            /* Parse error. Act as if the token had been an end tag with the
            tag name "select" instead. */
            $this->inSelect(
                array(
                    'name' => 'select',
                    'type' => HTML5::ENDTAG
                )
            );

            /* An end tag whose tag name is one of: "caption", "table", "tbody",
            "tfoot", "thead", "tr", "td", "th" */
        } elseif (in_array(
                $token['name'],
                array(
                    'caption',
                    'table',
                    'tbody',
                    'tfoot',
                    'thead',
                    'tr',
                    'td',
                    'th'
                )
            ) && $token['type'] === HTML5::ENDTAG
        ) {
            /* Parse error. */
            // w/e

            /* If the stack of open elements has an element in table scope with
            the same tag name as that of the token, then act as if an end tag
            with the tag name "select" had been seen, and reprocess the token.
            Otherwise, ignore the token. */
            if ($this->elementInScope($token['name'], true)) {
                $this->inSelect(
                    array(
                        'name' => 'select',
                        'type' => HTML5::ENDTAG
                    )
                );

                $this->mainPhase($token);
            }

            /* Anything else */
        } else {
            /* Parse error. Ignore the token. */
        }
    }

    private function afterBody($token)
    {
        /* Handle the token as follows: */

        /* A character token that is one of one of U+0009 CHARACTER TABULATION,
        U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
        or U+0020 SPACE */
        if ($token['type'] === HTML5::CHARACTR &&
            preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
        ) {
            /* Process the token as it would be processed if the insertion mode
            was "in body". */
            $this->inBody($token);

            /* A comment token */
        } elseif ($token['type'] === HTML5::COMMENT) {
            /* Append a Comment node to the first element in the stack of open
            elements (the html element), with the data attribute set to the
            data given in the comment token. */
            $comment = $this->dom->createComment($token['data']);
            $this->stack[0]->appendChild($comment);

            /* An end tag with the tag name "html" */
        } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'html') {
            /* If the parser was originally created in order to handle the
            setting of an element's innerHTML attribute, this is a parse error;
            ignore the token. (The element will be an html element in this
            case.) (innerHTML case) */

            /* Otherwise, switch to the trailing end phase. */
            $this->phase = self::END_PHASE;

            /* Anything else */
        } else {
            /* Parse error. Set the insertion mode to "in body" and reprocess
            the token. */
            $this->mode = self::IN_BODY;
            return $this->inBody($token);
        }
    }

    private function inFrameset($token)
    {
        /* Handle the token as follows: */

        /* A character token that is one of one of U+0009 CHARACTER TABULATION,
        U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
        U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */
        if ($token['type'] === HTML5::CHARACTR &&
            preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
        ) {
            /* Append the character to the current node. */
            $this->insertText($token['data']);

            /* A comment token */
        } elseif ($token['type'] === HTML5::COMMENT) {
            /* Append a Comment node to the current node with the data
            attribute set to the data given in the comment token. */
            $this->insertComment($token['data']);

            /* A start tag with the tag name "frameset" */
        } elseif ($token['name'] === 'frameset' &&
            $token['type'] === HTML5::STARTTAG
        ) {
            $this->insertElement($token);

            /* An end tag with the tag name "frameset" */
        } elseif ($token['name'] === 'frameset' &&
            $token['type'] === HTML5::ENDTAG
        ) {
            /* If the current node is the root html element, then this is a
            parse error; ignore the token. (innerHTML case) */
            if (end($this->stack)->nodeName === 'html') {
                // Ignore

            } else {
                /* Otherwise, pop the current node from the stack of open
                elements. */
                array_pop($this->stack);

                /* If the parser was not originally created in order to handle
                the setting of an element's innerHTML attribute (innerHTML case),
                and the current node is no longer a frameset element, then change
                the insertion mode to "after frameset". */
                $this->mode = self::AFTR_FRAME;
            }

            /* A start tag with the tag name "frame" */
        } elseif ($token['name'] === 'frame' &&
            $token['type'] === HTML5::STARTTAG
        ) {
            /* Insert an HTML element for the token. */
            $this->insertElement($token);

            /* Immediately pop the current node off the stack of open elements. */
            array_pop($this->stack);

            /* A start tag with the tag name "noframes" */
        } elseif ($token['name'] === 'noframes' &&
            $token['type'] === HTML5::STARTTAG
        ) {
            /* Process the token as if the insertion mode had been "in body". */
            $this->inBody($token);

            /* Anything else */
        } else {
            /* Parse error. Ignore the token. */
        }
    }

    private function afterFrameset($token)
    {
        /* Handle the token as follows: */

        /* A character token that is one of one of U+0009 CHARACTER TABULATION,
        U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
        U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */
        if ($token['type'] === HTML5::CHARACTR &&
            preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
        ) {
            /* Append the character to the current node. */
            $this->insertText($token['data']);

            /* A comment token */
        } elseif ($token['type'] === HTML5::COMMENT) {
            /* Append a Comment node to the current node with the data
            attribute set to the data given in the comment token. */
            $this->insertComment($token['data']);

            /* An end tag with the tag name "html" */
        } elseif ($token['name'] === 'html' &&
            $token['type'] === HTML5::ENDTAG
        ) {
            /* Switch to the trailing end phase. */
            $this->phase = self::END_PHASE;

            /* A start tag with the tag name "noframes" */
        } elseif ($token['name'] === 'noframes' &&
            $token['type'] === HTML5::STARTTAG
        ) {
            /* Process the token as if the insertion mode had been "in body". */
            $this->inBody($token);

            /* Anything else */
        } else {
            /* Parse error. Ignore the token. */
        }
    }

    private function trailingEndPhase($token)
    {
        /* After the main phase, as each token is emitted from the tokenisation
        stage, it must be processed as described in this section. */

        /* A DOCTYPE token */
        if ($token['type'] === HTML5::DOCTYPE) {
            // Parse error. Ignore the token.

            /* A comment token */
        } elseif ($token['type'] === HTML5::COMMENT) {
            /* Append a Comment node to the Document object with the data
            attribute set to the data given in the comment token. */
            $comment = $this->dom->createComment($token['data']);
            $this->dom->appendChild($comment);

            /* A character token that is one of one of U+0009 CHARACTER TABULATION,
            U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
            or U+0020 SPACE */
        } elseif ($token['type'] === HTML5::CHARACTR &&
            preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
        ) {
            /* Process the token as it would be processed in the main phase. */
            $this->mainPhase($token);

            /* A character token that is not one of U+0009 CHARACTER TABULATION,
            U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
            or U+0020 SPACE. Or a start tag token. Or an end tag token. */
        } elseif (($token['type'] === HTML5::CHARACTR &&
                preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) ||
            $token['type'] === HTML5::STARTTAG || $token['type'] === HTML5::ENDTAG
        ) {
            /* Parse error. Switch back to the main phase and reprocess the
            token. */
            $this->phase = self::MAIN_PHASE;
            return $this->mainPhase($token);

            /* An end-of-file token */
        } elseif ($token['type'] === HTML5::EOF) {
            /* OMG DONE!! */
        }
    }

    private function insertElement($token, $append = true, $check = false)
    {
        // Proprietary workaround for libxml2's limitations with tag names
        if ($check) {
            // Slightly modified HTML5 tag-name modification,
            // removing anything that's not an ASCII letter, digit, or hyphen
            $token['name'] = preg_replace('/[^a-z0-9-]/i', '', $token['name']);
            // Remove leading hyphens and numbers
            $token['name'] = ltrim($token['name'], '-0..9');
            // In theory, this should ever be needed, but just in case
            if ($token['name'] === '') {
                $token['name'] = 'span';
            } // arbitrary generic choice
        }

        $el = $this->dom->createElement($token['name']);

        foreach ($token['attr'] as $attr) {
            if (!$el->hasAttribute($attr['name'])) {
                $el->setAttribute($attr['name'], $attr['value']);
            }
        }

        $this->appendToRealParent($el);
        $this->stack[] = $el;

        return $el;
    }

    private function insertText($data)
    {
        $text = $this->dom->createTextNode($data);
        $this->appendToRealParent($text);
    }

    private function insertComment($data)
    {
        $comment = $this->dom->createComment($data);
        $this->appendToRealParent($comment);
    }

    private function appendToRealParent($node)
    {
        if ($this->foster_parent === null) {
            end($this->stack)->appendChild($node);

        } elseif ($this->foster_parent !== null) {
            /* If the foster parent element is the parent element of the
            last table element in the stack of open elements, then the new
            node must be inserted immediately before the last table element
            in the stack of open elements in the foster parent element;
            otherwise, the new node must be appended to the foster parent
            element. */
            for ($n = count($this->stack) - 1; $n >= 0; $n--) {
                if ($this->stack[$n]->nodeName === 'table' &&
                    $this->stack[$n]->parentNode !== null
                ) {
                    $table = $this->stack[$n];
                    break;
                }
            }

            if (isset($table) && $this->foster_parent->isSameNode($table->parentNode)) {
                $this->foster_parent->insertBefore($node, $table);
            } else {
                $this->foster_parent->appendChild($node);
            }

            $this->foster_parent = null;
        }
    }

    private function elementInScope($el, $table = false)
    {
        if (is_array($el)) {
            foreach ($el as $element) {
                if ($this->elementInScope($element, $table)) {
                    return true;
                }
            }

            return false;
        }

        $leng = count($this->stack);

        for ($n = 0; $n < $leng; $n++) {
            /* 1. Initialise node to be the current node (the bottommost node of
            the stack). */
            $node = $this->stack[$leng - 1 - $n];

            if ($node->tagName === $el) {
                /* 2. If node is the target node, terminate in a match state. */
                return true;

            } elseif ($node->tagName === 'table') {
                /* 3. Otherwise, if node is a table element, terminate in a failure
                state. */
                return false;

            } elseif ($table === true && in_array(
                    $node->tagName,
                    array(
                        'caption',
                        'td',
                        'th',
                        'button',
                        'marquee',
                        'object'
                    )
                )
            ) {
                /* 4. Otherwise, if the algorithm is the "has an element in scope"
                variant (rather than the "has an element in table scope" variant),
                and node is one of the following, terminate in a failure state. */
                return false;

            } elseif ($node === $node->ownerDocument->documentElement) {
                /* 5. Otherwise, if node is an html element (root element), terminate
                in a failure state. (This can only happen if the node is the topmost
                node of the    stack of open elements, and prevents the next step from
                being invoked if there are no more elements in the stack.) */
                return false;
            }

            /* Otherwise, set node to the previous entry in the stack of open
            elements and return to step 2. (This will never fail, since the loop
            will always terminate in the previous step if the top of the stack
            is reached.) */
        }
    }

    private function reconstructActiveFormattingElements()
    {
        /* 1. If there are no entries in the list of active formatting elements,
        then there is nothing to reconstruct; stop this algorithm. */
        $formatting_elements = count($this->a_formatting);

        if ($formatting_elements === 0) {
            return false;
        }

        /* 3. Let entry be the last (most recently added) element in the list
        of active formatting elements. */
        $entry = end($this->a_formatting);

        /* 2. If the last (most recently added) entry in the list of active
        formatting elements is a marker, or if it is an element that is in the
        stack of open elements, then there is nothing to reconstruct; stop this
        algorithm. */
        if ($entry === self::MARKER || in_array($entry, $this->stack, true)) {
            return false;
        }

        for ($a = $formatting_elements - 1; $a >= 0; true) {
            /* 4. If there are no entries before entry in the list of active
            formatting elements, then jump to step 8. */
            if ($a === 0) {
                $step_seven = false;
                break;
            }

            /* 5. Let entry be the entry one earlier than entry in the list of
            active formatting elements. */
            $a--;
            $entry = $this->a_formatting[$a];

            /* 6. If entry is neither a marker nor an element that is also in
            thetack of open elements, go to step 4. */
            if ($entry === self::MARKER || in_array($entry, $this->stack, true)) {
                break;
            }
        }

        while (true) {
            /* 7. Let entry be the element one later than entry in the list of
            active formatting elements. */
            if (isset($step_seven) && $step_seven === true) {
                $a++;
                $entry = $this->a_formatting[$a];
            }

            /* 8. Perform a shallow clone of the element entry to obtain clone. */
            $clone = $entry->cloneNode();

            /* 9. Append clone to the current node and push it onto the stack
            of open elements  so that it is the new current node. */
            end($this->stack)->appendChild($clone);
            $this->stack[] = $clone;

            /* 10. Replace the entry for entry in the list with an entry for
            clone. */
            $this->a_formatting[$a] = $clone;

            /* 11. If the entry for clone in the list of active formatting
            elements is not the last entry in the list, return to step 7. */
            if (end($this->a_formatting) !== $clone) {
                $step_seven = true;
            } else {
                break;
            }
        }
    }

    private function clearTheActiveFormattingElementsUpToTheLastMarker()
    {
        /* When the steps below require the UA to clear the list of active
        formatting elements up to the last marker, the UA must perform the
        following steps: */

        while (true) {
            /* 1. Let entry be the last (most recently added) entry in the list
            of active formatting elements. */
            $entry = end($this->a_formatting);

            /* 2. Remove entry from the list of active formatting elements. */
            array_pop($this->a_formatting);

            /* 3. If entry was a marker, then stop the algorithm at this point.
            The list has been cleared up to the last marker. */
            if ($entry === self::MARKER) {
                break;
            }
        }
    }

    private function generateImpliedEndTags($exclude = array())
    {
        /* When the steps below require the UA to generate implied end tags,
        then, if the current node is a dd element, a dt element, an li element,
        a p element, a td element, a th  element, or a tr element, the UA must
        act as if an end tag with the respective tag name had been seen and
        then generate implied end tags again. */
        $node = end($this->stack);
        $elements = array_diff(array('dd', 'dt', 'li', 'p', 'td', 'th', 'tr'), $exclude);

        while (in_array(end($this->stack)->nodeName, $elements)) {
            array_pop($this->stack);
        }
    }

    private function getElementCategory($node)
    {
        $name = $node->tagName;
        if (in_array($name, $this->special)) {
            return self::SPECIAL;
        } elseif (in_array($name, $this->scoping)) {
            return self::SCOPING;
        } elseif (in_array($name, $this->formatting)) {
            return self::FORMATTING;
        } else {
            return self::PHRASING;
        }
    }

    private function clearStackToTableContext($elements)
    {
        /* When the steps above require the UA to clear the stack back to a
        table context, it means that the UA must, while the current node is not
        a table element or an html element, pop elements from the stack of open
        elements. If this causes any elements to be popped from the stack, then
        this is a parse error. */
        while (true) {
            $node = end($this->stack)->nodeName;

            if (in_array($node, $elements)) {
                break;
            } else {
                array_pop($this->stack);
            }
        }
    }

    private function resetInsertionMode()
    {
        /* 1. Let last be false. */
        $last = false;
        $leng = count($this->stack);

        for ($n = $leng - 1; $n >= 0; $n--) {
            /* 2. Let node be the last node in the stack of open elements. */
            $node = $this->stack[$n];

            /* 3. If node is the first node in the stack of open elements, then
            set last to true. If the element whose innerHTML  attribute is being
            set is neither a td  element nor a th element, then set node to the
            element whose innerHTML  attribute is being set. (innerHTML  case) */
            if ($this->stack[0]->isSameNode($node)) {
                $last = true;
            }

            /* 4. If node is a select element, then switch the insertion mode to
            "in select" and abort these steps. (innerHTML case) */
            if ($node->nodeName === 'select') {
                $this->mode = self::IN_SELECT;
                break;

                /* 5. If node is a td or th element, then switch the insertion mode
                to "in cell" and abort these steps. */
            } elseif ($node->nodeName === 'td' || $node->nodeName === 'th') {
                $this->mode = self::IN_CELL;
                break;

                /* 6. If node is a tr element, then switch the insertion mode to
                "in    row" and abort these steps. */
            } elseif ($node->nodeName === 'tr') {
                $this->mode = self::IN_ROW;
                break;

                /* 7. If node is a tbody, thead, or tfoot element, then switch the
                insertion mode to "in table body" and abort these steps. */
            } elseif (in_array($node->nodeName, array('tbody', 'thead', 'tfoot'))) {
                $this->mode = self::IN_TBODY;
                break;

                /* 8. If node is a caption element, then switch the insertion mode
                to "in caption" and abort these steps. */
            } elseif ($node->nodeName === 'caption') {
                $this->mode = self::IN_CAPTION;
                break;

                /* 9. If node is a colgroup element, then switch the insertion mode
                to "in column group" and abort these steps. (innerHTML case) */
            } elseif ($node->nodeName === 'colgroup') {
                $this->mode = self::IN_CGROUP;
                break;

                /* 10. If node is a table element, then switch the insertion mode
                to "in table" and abort these steps. */
            } elseif ($node->nodeName === 'table') {
                $this->mode = self::IN_TABLE;
                break;

                /* 11. If node is a head element, then switch the insertion mode
                to "in body" ("in body"! not "in head"!) and abort these steps.
                (innerHTML case) */
            } elseif ($node->nodeName === 'head') {
                $this->mode = self::IN_BODY;
                break;

                /* 12. If node is a body element, then switch the insertion mode to
                "in body" and abort these steps. */
            } elseif ($node->nodeName === 'body') {
                $this->mode = self::IN_BODY;
                break;

                /* 13. If node is a frameset element, then switch the insertion
                mode to "in frameset" and abort these steps. (innerHTML case) */
            } elseif ($node->nodeName === 'frameset') {
                $this->mode = self::IN_FRAME;
                break;

                /* 14. If node is an html element, then: if the head element
                pointer is null, switch the insertion mode to "before head",
                otherwise, switch the insertion mode to "after head". In either
                case, abort these steps. (innerHTML case) */
            } elseif ($node->nodeName === 'html') {
                $this->mode = ($this->head_pointer === null)
                    ? self::BEFOR_HEAD
                    : self::AFTER_HEAD;

                break;

                /* 15. If last is true, then set the insertion mode to "in body"
                and    abort these steps. (innerHTML case) */
            } elseif ($last) {
                $this->mode = self::IN_BODY;
                break;
            }
        }
    }

    private function closeCell()
    {
        /* If the stack of open elements has a td or th element in table scope,
        then act as if an end tag token with that tag name had been seen. */
        foreach (array('td', 'th') as $cell) {
            if ($this->elementInScope($cell, true)) {
                $this->inCell(
                    array(
                        'name' => $cell,
                        'type' => HTML5::ENDTAG
                    )
                );

                break;
            }
        }
    }

    public function save()
    {
        return $this->dom;
    }
}
htmlpurifier/library/HTMLPurifier/Lexer/DirectLex.php000064400000050022151214231100016634 0ustar00<?php

/**
 * Our in-house implementation of a parser.
 *
 * A pure PHP parser, DirectLex has absolutely no dependencies, making
 * it a reasonably good default for PHP4.  Written with efficiency in mind,
 * it can be four times faster than HTMLPurifier_Lexer_PEARSax3, although it
 * pales in comparison to HTMLPurifier_Lexer_DOMLex.
 *
 * @todo Reread XML spec and document differences.
 */
class HTMLPurifier_Lexer_DirectLex extends HTMLPurifier_Lexer
{
    /**
     * @type bool
     */
    public $tracksLineNumbers = true;

    /**
     * Whitespace characters for str(c)spn.
     * @type string
     */
    protected $_whitespace = "\x20\x09\x0D\x0A";

    /**
     * Callback function for script CDATA fudge
     * @param array $matches, in form of array(opening tag, contents, closing tag)
     * @return string
     */
    protected function scriptCallback($matches)
    {
        return $matches[1] . htmlspecialchars($matches[2], ENT_COMPAT, 'UTF-8') . $matches[3];
    }

    /**
     * @param String $html
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return array|HTMLPurifier_Token[]
     */
    public function tokenizeHTML($html, $config, $context)
    {
        // special normalization for script tags without any armor
        // our "armor" heurstic is a < sign any number of whitespaces after
        // the first script tag
        if ($config->get('HTML.Trusted')) {
            $html = preg_replace_callback(
                '#(<script[^>]*>)(\s*[^<].+?)(</script>)#si',
                array($this, 'scriptCallback'),
                $html
            );
        }

        $html = $this->normalize($html, $config, $context);

        $cursor = 0; // our location in the text
        $inside_tag = false; // whether or not we're parsing the inside of a tag
        $array = array(); // result array

        // This is also treated to mean maintain *column* numbers too
        $maintain_line_numbers = $config->get('Core.MaintainLineNumbers');

        if ($maintain_line_numbers === null) {
            // automatically determine line numbering by checking
            // if error collection is on
            $maintain_line_numbers = $config->get('Core.CollectErrors');
        }

        if ($maintain_line_numbers) {
            $current_line = 1;
            $current_col = 0;
            $length = strlen($html);
        } else {
            $current_line = false;
            $current_col = false;
            $length = false;
        }
        $context->register('CurrentLine', $current_line);
        $context->register('CurrentCol', $current_col);
        $nl = "\n";
        // how often to manually recalculate. This will ALWAYS be right,
        // but it's pretty wasteful. Set to 0 to turn off
        $synchronize_interval = $config->get('Core.DirectLexLineNumberSyncInterval');

        $e = false;
        if ($config->get('Core.CollectErrors')) {
            $e =& $context->get('ErrorCollector');
        }

        // for testing synchronization
        $loops = 0;

        while (++$loops) {
            // $cursor is either at the start of a token, or inside of
            // a tag (i.e. there was a < immediately before it), as indicated
            // by $inside_tag

            if ($maintain_line_numbers) {
                // $rcursor, however, is always at the start of a token.
                $rcursor = $cursor - (int)$inside_tag;

                // Column number is cheap, so we calculate it every round.
                // We're interested at the *end* of the newline string, so
                // we need to add strlen($nl) == 1 to $nl_pos before subtracting it
                // from our "rcursor" position.
                $nl_pos = strrpos($html, $nl, $rcursor - $length);
                $current_col = $rcursor - (is_bool($nl_pos) ? 0 : $nl_pos + 1);

                // recalculate lines
                if ($synchronize_interval && // synchronization is on
                    $cursor > 0 && // cursor is further than zero
                    $loops % $synchronize_interval === 0) { // time to synchronize!
                    $current_line = 1 + $this->substrCount($html, $nl, 0, $cursor);
                }
            }

            $position_next_lt = strpos($html, '<', $cursor);
            $position_next_gt = strpos($html, '>', $cursor);

            // triggers on "<b>asdf</b>" but not "asdf <b></b>"
            // special case to set up context
            if ($position_next_lt === $cursor) {
                $inside_tag = true;
                $cursor++;
            }

            if (!$inside_tag && $position_next_lt !== false) {
                // We are not inside tag and there still is another tag to parse
                $token = new
                HTMLPurifier_Token_Text(
                    $this->parseText(
                        substr(
                            $html,
                            $cursor,
                            $position_next_lt - $cursor
                        ), $config
                    )
                );
                if ($maintain_line_numbers) {
                    $token->rawPosition($current_line, $current_col);
                    $current_line += $this->substrCount($html, $nl, $cursor, $position_next_lt - $cursor);
                }
                $array[] = $token;
                $cursor = $position_next_lt + 1;
                $inside_tag = true;
                continue;
            } elseif (!$inside_tag) {
                // We are not inside tag but there are no more tags
                // If we're already at the end, break
                if ($cursor === strlen($html)) {
                    break;
                }
                // Create Text of rest of string
                $token = new
                HTMLPurifier_Token_Text(
                    $this->parseText(
                        substr(
                            $html,
                            $cursor
                        ), $config
                    )
                );
                if ($maintain_line_numbers) {
                    $token->rawPosition($current_line, $current_col);
                }
                $array[] = $token;
                break;
            } elseif ($inside_tag && $position_next_gt !== false) {
                // We are in tag and it is well formed
                // Grab the internals of the tag
                $strlen_segment = $position_next_gt - $cursor;

                if ($strlen_segment < 1) {
                    // there's nothing to process!
                    $token = new HTMLPurifier_Token_Text('<');
                    $cursor++;
                    continue;
                }

                $segment = substr($html, $cursor, $strlen_segment);

                if ($segment === false) {
                    // somehow, we attempted to access beyond the end of
                    // the string, defense-in-depth, reported by Nate Abele
                    break;
                }

                // Check if it's a comment
                if (substr($segment, 0, 3) === '!--') {
                    // re-determine segment length, looking for -->
                    $position_comment_end = strpos($html, '-->', $cursor);
                    if ($position_comment_end === false) {
                        // uh oh, we have a comment that extends to
                        // infinity. Can't be helped: set comment
                        // end position to end of string
                        if ($e) {
                            $e->send(E_WARNING, 'Lexer: Unclosed comment');
                        }
                        $position_comment_end = strlen($html);
                        $end = true;
                    } else {
                        $end = false;
                    }
                    $strlen_segment = $position_comment_end - $cursor;
                    $segment = substr($html, $cursor, $strlen_segment);
                    $token = new
                    HTMLPurifier_Token_Comment(
                        substr(
                            $segment,
                            3,
                            $strlen_segment - 3
                        )
                    );
                    if ($maintain_line_numbers) {
                        $token->rawPosition($current_line, $current_col);
                        $current_line += $this->substrCount($html, $nl, $cursor, $strlen_segment);
                    }
                    $array[] = $token;
                    $cursor = $end ? $position_comment_end : $position_comment_end + 3;
                    $inside_tag = false;
                    continue;
                }

                // Check if it's an end tag
                $is_end_tag = (strpos($segment, '/') === 0);
                if ($is_end_tag) {
                    $type = substr($segment, 1);
                    $token = new HTMLPurifier_Token_End($type);
                    if ($maintain_line_numbers) {
                        $token->rawPosition($current_line, $current_col);
                        $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor);
                    }
                    $array[] = $token;
                    $inside_tag = false;
                    $cursor = $position_next_gt + 1;
                    continue;
                }

                // Check leading character is alnum, if not, we may
                // have accidently grabbed an emoticon. Translate into
                // text and go our merry way
                if (!ctype_alpha($segment[0])) {
                    // XML:  $segment[0] !== '_' && $segment[0] !== ':'
                    if ($e) {
                        $e->send(E_NOTICE, 'Lexer: Unescaped lt');
                    }
                    $token = new HTMLPurifier_Token_Text('<');
                    if ($maintain_line_numbers) {
                        $token->rawPosition($current_line, $current_col);
                        $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor);
                    }
                    $array[] = $token;
                    $inside_tag = false;
                    continue;
                }

                // Check if it is explicitly self closing, if so, remove
                // trailing slash. Remember, we could have a tag like <br>, so
                // any later token processing scripts must convert improperly
                // classified EmptyTags from StartTags.
                $is_self_closing = (strrpos($segment, '/') === $strlen_segment - 1);
                if ($is_self_closing) {
                    $strlen_segment--;
                    $segment = substr($segment, 0, $strlen_segment);
                }

                // Check if there are any attributes
                $position_first_space = strcspn($segment, $this->_whitespace);

                if ($position_first_space >= $strlen_segment) {
                    if ($is_self_closing) {
                        $token = new HTMLPurifier_Token_Empty($segment);
                    } else {
                        $token = new HTMLPurifier_Token_Start($segment);
                    }
                    if ($maintain_line_numbers) {
                        $token->rawPosition($current_line, $current_col);
                        $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor);
                    }
                    $array[] = $token;
                    $inside_tag = false;
                    $cursor = $position_next_gt + 1;
                    continue;
                }

                // Grab out all the data
                $type = substr($segment, 0, $position_first_space);
                $attribute_string =
                    trim(
                        substr(
                            $segment,
                            $position_first_space
                        )
                    );
                if ($attribute_string) {
                    $attr = $this->parseAttributeString(
                        $attribute_string,
                        $config,
                        $context
                    );
                } else {
                    $attr = array();
                }

                if ($is_self_closing) {
                    $token = new HTMLPurifier_Token_Empty($type, $attr);
                } else {
                    $token = new HTMLPurifier_Token_Start($type, $attr);
                }
                if ($maintain_line_numbers) {
                    $token->rawPosition($current_line, $current_col);
                    $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor);
                }
                $array[] = $token;
                $cursor = $position_next_gt + 1;
                $inside_tag = false;
                continue;
            } else {
                // inside tag, but there's no ending > sign
                if ($e) {
                    $e->send(E_WARNING, 'Lexer: Missing gt');
                }
                $token = new
                HTMLPurifier_Token_Text(
                    '<' .
                    $this->parseText(
                        substr($html, $cursor), $config
                    )
                );
                if ($maintain_line_numbers) {
                    $token->rawPosition($current_line, $current_col);
                }
                // no cursor scroll? Hmm...
                $array[] = $token;
                break;
            }
            break;
        }

        $context->destroy('CurrentLine');
        $context->destroy('CurrentCol');
        return $array;
    }

    /**
     * PHP 5.0.x compatible substr_count that implements offset and length
     * @param string $haystack
     * @param string $needle
     * @param int $offset
     * @param int $length
     * @return int
     */
    protected function substrCount($haystack, $needle, $offset, $length)
    {
        static $oldVersion;
        if ($oldVersion === null) {
            $oldVersion = version_compare(PHP_VERSION, '5.1', '<');
        }
        if ($oldVersion) {
            $haystack = substr($haystack, $offset, $length);
            return substr_count($haystack, $needle);
        } else {
            return substr_count($haystack, $needle, $offset, $length);
        }
    }

    /**
     * Takes the inside of an HTML tag and makes an assoc array of attributes.
     *
     * @param string $string Inside of tag excluding name.
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return array Assoc array of attributes.
     */
    public function parseAttributeString($string, $config, $context)
    {
        $string = (string)$string; // quick typecast

        if ($string == '') {
            return array();
        } // no attributes

        $e = false;
        if ($config->get('Core.CollectErrors')) {
            $e =& $context->get('ErrorCollector');
        }

        // let's see if we can abort as quickly as possible
        // one equal sign, no spaces => one attribute
        $num_equal = substr_count($string, '=');
        $has_space = strpos($string, ' ');
        if ($num_equal === 0 && !$has_space) {
            // bool attribute
            return array($string => $string);
        } elseif ($num_equal === 1 && !$has_space) {
            // only one attribute
            list($key, $quoted_value) = explode('=', $string);
            $quoted_value = trim($quoted_value);
            if (!$key) {
                if ($e) {
                    $e->send(E_ERROR, 'Lexer: Missing attribute key');
                }
                return array();
            }
            if (!$quoted_value) {
                return array($key => '');
            }
            $first_char = @$quoted_value[0];
            $last_char = @$quoted_value[strlen($quoted_value) - 1];

            $same_quote = ($first_char == $last_char);
            $open_quote = ($first_char == '"' || $first_char == "'");

            if ($same_quote && $open_quote) {
                // well behaved
                $value = substr($quoted_value, 1, strlen($quoted_value) - 2);
            } else {
                // not well behaved
                if ($open_quote) {
                    if ($e) {
                        $e->send(E_ERROR, 'Lexer: Missing end quote');
                    }
                    $value = substr($quoted_value, 1);
                } else {
                    $value = $quoted_value;
                }
            }
            if ($value === false) {
                $value = '';
            }
            return array($key => $this->parseAttr($value, $config));
        }

        // setup loop environment
        $array = array(); // return assoc array of attributes
        $cursor = 0; // current position in string (moves forward)
        $size = strlen($string); // size of the string (stays the same)

        // if we have unquoted attributes, the parser expects a terminating
        // space, so let's guarantee that there's always a terminating space.
        $string .= ' ';

        $old_cursor = -1;
        while ($cursor < $size) {
            if ($old_cursor >= $cursor) {
                throw new Exception("Infinite loop detected");
            }
            $old_cursor = $cursor;

            $cursor += ($value = strspn($string, $this->_whitespace, $cursor));
            // grab the key

            $key_begin = $cursor; //we're currently at the start of the key

            // scroll past all characters that are the key (not whitespace or =)
            $cursor += strcspn($string, $this->_whitespace . '=', $cursor);

            $key_end = $cursor; // now at the end of the key

            $key = substr($string, $key_begin, $key_end - $key_begin);

            if (!$key) {
                if ($e) {
                    $e->send(E_ERROR, 'Lexer: Missing attribute key');
                }
                $cursor += 1 + strcspn($string, $this->_whitespace, $cursor + 1); // prevent infinite loop
                continue; // empty key
            }

            // scroll past all whitespace
            $cursor += strspn($string, $this->_whitespace, $cursor);

            if ($cursor >= $size) {
                $array[$key] = $key;
                break;
            }

            // if the next character is an equal sign, we've got a regular
            // pair, otherwise, it's a bool attribute
            $first_char = @$string[$cursor];

            if ($first_char == '=') {
                // key="value"

                $cursor++;
                $cursor += strspn($string, $this->_whitespace, $cursor);

                if ($cursor === false) {
                    $array[$key] = '';
                    break;
                }

                // we might be in front of a quote right now

                $char = @$string[$cursor];

                if ($char == '"' || $char == "'") {
                    // it's quoted, end bound is $char
                    $cursor++;
                    $value_begin = $cursor;
                    $cursor = strpos($string, $char, $cursor);
                    $value_end = $cursor;
                } else {
                    // it's not quoted, end bound is whitespace
                    $value_begin = $cursor;
                    $cursor += strcspn($string, $this->_whitespace, $cursor);
                    $value_end = $cursor;
                }

                // we reached a premature end
                if ($cursor === false) {
                    $cursor = $size;
                    $value_end = $cursor;
                }

                $value = substr($string, $value_begin, $value_end - $value_begin);
                if ($value === false) {
                    $value = '';
                }
                $array[$key] = $this->parseAttr($value, $config);
                $cursor++;
            } else {
                // boolattr
                if ($key !== '') {
                    $array[$key] = $key;
                } else {
                    // purely theoretical
                    if ($e) {
                        $e->send(E_ERROR, 'Lexer: Missing attribute key');
                    }
                }
            }
        }
        return $array;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/PercentEncoder.php000064400000006755151214231100016610 0ustar00<?php

/**
 * Class that handles operations involving percent-encoding in URIs.
 *
 * @warning
 *      Be careful when reusing instances of PercentEncoder. The object
 *      you use for normalize() SHOULD NOT be used for encode(), or
 *      vice-versa.
 */
class HTMLPurifier_PercentEncoder
{

    /**
     * Reserved characters to preserve when using encode().
     * @type array
     */
    protected $preserve = array();

    /**
     * String of characters that should be preserved while using encode().
     * @param bool $preserve
     */
    public function __construct($preserve = false)
    {
        // unreserved letters, ought to const-ify
        for ($i = 48; $i <= 57; $i++) { // digits
            $this->preserve[$i] = true;
        }
        for ($i = 65; $i <= 90; $i++) { // upper-case
            $this->preserve[$i] = true;
        }
        for ($i = 97; $i <= 122; $i++) { // lower-case
            $this->preserve[$i] = true;
        }
        $this->preserve[45] = true; // Dash         -
        $this->preserve[46] = true; // Period       .
        $this->preserve[95] = true; // Underscore   _
        $this->preserve[126]= true; // Tilde        ~

        // extra letters not to escape
        if ($preserve !== false) {
            for ($i = 0, $c = strlen($preserve); $i < $c; $i++) {
                $this->preserve[ord($preserve[$i])] = true;
            }
        }
    }

    /**
     * Our replacement for urlencode, it encodes all non-reserved characters,
     * as well as any extra characters that were instructed to be preserved.
     * @note
     *      Assumes that the string has already been normalized, making any
     *      and all percent escape sequences valid. Percents will not be
     *      re-escaped, regardless of their status in $preserve
     * @param string $string String to be encoded
     * @return string Encoded string.
     */
    public function encode($string)
    {
        $ret = '';
        for ($i = 0, $c = strlen($string); $i < $c; $i++) {
            if ($string[$i] !== '%' && !isset($this->preserve[$int = ord($string[$i])])) {
                $ret .= '%' . sprintf('%02X', $int);
            } else {
                $ret .= $string[$i];
            }
        }
        return $ret;
    }

    /**
     * Fix up percent-encoding by decoding unreserved characters and normalizing.
     * @warning This function is affected by $preserve, even though the
     *          usual desired behavior is for this not to preserve those
     *          characters. Be careful when reusing instances of PercentEncoder!
     * @param string $string String to normalize
     * @return string
     */
    public function normalize($string)
    {
        if ($string == '') {
            return '';
        }
        $parts = explode('%', $string);
        $ret = array_shift($parts);
        foreach ($parts as $part) {
            $length = strlen($part);
            if ($length < 2) {
                $ret .= '%25' . $part;
                continue;
            }
            $encoding = substr($part, 0, 2);
            $text     = substr($part, 2);
            if (!ctype_xdigit($encoding)) {
                $ret .= '%25' . $part;
                continue;
            }
            $int = hexdec($encoding);
            if (isset($this->preserve[$int])) {
                $ret .= chr($int) . $text;
                continue;
            }
            $encoding = strtoupper($encoding);
            $ret .= '%' . $encoding . $text;
        }
        return $ret;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/URISchemeRegistry.php000064400000004551151214231100017215 0ustar00<?php

/**
 * Registry for retrieving specific URI scheme validator objects.
 */
class HTMLPurifier_URISchemeRegistry
{

    /**
     * Retrieve sole instance of the registry.
     * @param HTMLPurifier_URISchemeRegistry $prototype Optional prototype to overload sole instance with,
     *                   or bool true to reset to default registry.
     * @return HTMLPurifier_URISchemeRegistry
     * @note Pass a registry object $prototype with a compatible interface and
     *       the function will copy it and return it all further times.
     */
    public static function instance($prototype = null)
    {
        static $instance = null;
        if ($prototype !== null) {
            $instance = $prototype;
        } elseif ($instance === null || $prototype == true) {
            $instance = new HTMLPurifier_URISchemeRegistry();
        }
        return $instance;
    }

    /**
     * Cache of retrieved schemes.
     * @type HTMLPurifier_URIScheme[]
     */
    protected $schemes = array();

    /**
     * Retrieves a scheme validator object
     * @param string $scheme String scheme name like http or mailto
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return HTMLPurifier_URIScheme
     */
    public function getScheme($scheme, $config, $context)
    {
        if (!$config) {
            $config = HTMLPurifier_Config::createDefault();
        }

        // important, otherwise attacker could include arbitrary file
        $allowed_schemes = $config->get('URI.AllowedSchemes');
        if (!$config->get('URI.OverrideAllowedSchemes') &&
            !isset($allowed_schemes[$scheme])
        ) {
            return;
        }

        if (isset($this->schemes[$scheme])) {
            return $this->schemes[$scheme];
        }
        if (!isset($allowed_schemes[$scheme])) {
            return;
        }

        $class = 'HTMLPurifier_URIScheme_' . $scheme;
        if (!class_exists($class)) {
            return;
        }
        $this->schemes[$scheme] = new $class();
        return $this->schemes[$scheme];
    }

    /**
     * Registers a custom scheme to the cache, bypassing reflection.
     * @param string $scheme Scheme name
     * @param HTMLPurifier_URIScheme $scheme_obj
     */
    public function register($scheme, $scheme_obj)
    {
        $this->schemes[$scheme] = $scheme_obj;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ChildDef/Table.php000064400000015730151214231100016372 0ustar00<?php

/**
 * Definition for tables.  The general idea is to extract out all of the
 * essential bits, and then reconstruct it later.
 *
 * This is a bit confusing, because the DTDs and the W3C
 * validators seem to disagree on the appropriate definition. The
 * DTD claims:
 *
 *      (CAPTION?, (COL*|COLGROUP*), THEAD?, TFOOT?, TBODY+)
 *
 * But actually, the HTML4 spec then has this to say:
 *
 *      The TBODY start tag is always required except when the table
 *      contains only one table body and no table head or foot sections.
 *      The TBODY end tag may always be safely omitted.
 *
 * So the DTD is kind of wrong.  The validator is, unfortunately, kind
 * of on crack.
 *
 * The definition changed again in XHTML1.1; and in my opinion, this
 * formulation makes the most sense.
 *
 *      caption?, ( col* | colgroup* ), (( thead?, tfoot?, tbody+ ) | ( tr+ ))
 *
 * Essentially, we have two modes: thead/tfoot/tbody mode, and tr mode.
 * If we encounter a thead, tfoot or tbody, we are placed in the former
 * mode, and we *must* wrap any stray tr segments with a tbody. But if
 * we don't run into any of them, just have tr tags is OK.
 */
class HTMLPurifier_ChildDef_Table extends HTMLPurifier_ChildDef
{
    /**
     * @type bool
     */
    public $allow_empty = false;

    /**
     * @type string
     */
    public $type = 'table';

    /**
     * @type array
     */
    public $elements = array(
        'tr' => true,
        'tbody' => true,
        'thead' => true,
        'tfoot' => true,
        'caption' => true,
        'colgroup' => true,
        'col' => true
    );

    public function __construct()
    {
    }

    /**
     * @param array $children
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return array
     */
    public function validateChildren($children, $config, $context)
    {
        if (empty($children)) {
            return false;
        }

        // only one of these elements is allowed in a table
        $caption = false;
        $thead = false;
        $tfoot = false;

        // whitespace
        $initial_ws = array();
        $after_caption_ws = array();
        $after_thead_ws = array();
        $after_tfoot_ws = array();

        // as many of these as you want
        $cols = array();
        $content = array();

        $tbody_mode = false; // if true, then we need to wrap any stray
                             // <tr>s with a <tbody>.

        $ws_accum =& $initial_ws;

        foreach ($children as $node) {
            if ($node instanceof HTMLPurifier_Node_Comment) {
                $ws_accum[] = $node;
                continue;
            }
            switch ($node->name) {
            case 'tbody':
                $tbody_mode = true;
                // fall through
            case 'tr':
                $content[] = $node;
                $ws_accum =& $content;
                break;
            case 'caption':
                // there can only be one caption!
                if ($caption !== false)  break;
                $caption = $node;
                $ws_accum =& $after_caption_ws;
                break;
            case 'thead':
                $tbody_mode = true;
                // XXX This breaks rendering properties with
                // Firefox, which never floats a <thead> to
                // the top. Ever. (Our scheme will float the
                // first <thead> to the top.)  So maybe
                // <thead>s that are not first should be
                // turned into <tbody>? Very tricky, indeed.
                if ($thead === false) {
                    $thead = $node;
                    $ws_accum =& $after_thead_ws;
                } else {
                    // Oops, there's a second one! What
                    // should we do?  Current behavior is to
                    // transmutate the first and last entries into
                    // tbody tags, and then put into content.
                    // Maybe a better idea is to *attach
                    // it* to the existing thead or tfoot?
                    // We don't do this, because Firefox
                    // doesn't float an extra tfoot to the
                    // bottom like it does for the first one.
                    $node->name = 'tbody';
                    $content[] = $node;
                    $ws_accum =& $content;
                }
                break;
            case 'tfoot':
                // see above for some aveats
                $tbody_mode = true;
                if ($tfoot === false) {
                    $tfoot = $node;
                    $ws_accum =& $after_tfoot_ws;
                } else {
                    $node->name = 'tbody';
                    $content[] = $node;
                    $ws_accum =& $content;
                }
                break;
            case 'colgroup':
            case 'col':
                $cols[] = $node;
                $ws_accum =& $cols;
                break;
            case '#PCDATA':
                // How is whitespace handled? We treat is as sticky to
                // the *end* of the previous element. So all of the
                // nonsense we have worked on is to keep things
                // together.
                if (!empty($node->is_whitespace)) {
                    $ws_accum[] = $node;
                }
                break;
            }
        }

        if (empty($content)) {
            return false;
        }

        $ret = $initial_ws;
        if ($caption !== false) {
            $ret[] = $caption;
            $ret = array_merge($ret, $after_caption_ws);
        }
        if ($cols !== false) {
            $ret = array_merge($ret, $cols);
        }
        if ($thead !== false) {
            $ret[] = $thead;
            $ret = array_merge($ret, $after_thead_ws);
        }
        if ($tfoot !== false) {
            $ret[] = $tfoot;
            $ret = array_merge($ret, $after_tfoot_ws);
        }

        if ($tbody_mode) {
            // we have to shuffle tr into tbody
            $current_tr_tbody = null;

            foreach($content as $node) {
                switch ($node->name) {
                case 'tbody':
                    $current_tr_tbody = null;
                    $ret[] = $node;
                    break;
                case 'tr':
                    if ($current_tr_tbody === null) {
                        $current_tr_tbody = new HTMLPurifier_Node_Element('tbody');
                        $ret[] = $current_tr_tbody;
                    }
                    $current_tr_tbody->children[] = $node;
                    break;
                case '#PCDATA':
                    //assert($node->is_whitespace);
                    if ($current_tr_tbody === null) {
                        $ret[] = $node;
                    } else {
                        $current_tr_tbody->children[] = $node;
                    }
                    break;
                }
            }
        } else {
            $ret = array_merge($ret, $content);
        }

        return $ret;

    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ChildDef/StrictBlockquote.php000064400000005542151214231100020644 0ustar00<?php

/**
 * Takes the contents of blockquote when in strict and reformats for validation.
 */
class HTMLPurifier_ChildDef_StrictBlockquote extends HTMLPurifier_ChildDef_Required
{
    /**
     * @type array
     */
    protected $real_elements;

    /**
     * @type array
     */
    protected $fake_elements;

    /**
     * @type bool
     */
    public $allow_empty = true;

    /**
     * @type string
     */
    public $type = 'strictblockquote';

    /**
     * @type bool
     */
    protected $init = false;

    /**
     * @param HTMLPurifier_Config $config
     * @return array
     * @note We don't want MakeWellFormed to auto-close inline elements since
     *       they might be allowed.
     */
    public function getAllowedElements($config)
    {
        $this->init($config);
        return $this->fake_elements;
    }

    /**
     * @param array $children
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return array
     */
    public function validateChildren($children, $config, $context)
    {
        $this->init($config);

        // trick the parent class into thinking it allows more
        $this->elements = $this->fake_elements;
        $result = parent::validateChildren($children, $config, $context);
        $this->elements = $this->real_elements;

        if ($result === false) {
            return array();
        }
        if ($result === true) {
            $result = $children;
        }

        $def = $config->getHTMLDefinition();
        $block_wrap_name = $def->info_block_wrapper;
        $block_wrap = false;
        $ret = array();

        foreach ($result as $node) {
            if ($block_wrap === false) {
                if (($node instanceof HTMLPurifier_Node_Text && !$node->is_whitespace) ||
                    ($node instanceof HTMLPurifier_Node_Element && !isset($this->elements[$node->name]))) {
                        $block_wrap = new HTMLPurifier_Node_Element($def->info_block_wrapper);
                        $ret[] = $block_wrap;
                }
            } else {
                if ($node instanceof HTMLPurifier_Node_Element && isset($this->elements[$node->name])) {
                    $block_wrap = false;

                }
            }
            if ($block_wrap) {
                $block_wrap->children[] = $node;
            } else {
                $ret[] = $node;
            }
        }
        return $ret;
    }

    /**
     * @param HTMLPurifier_Config $config
     */
    private function init($config)
    {
        if (!$this->init) {
            $def = $config->getHTMLDefinition();
            // allow all inline elements
            $this->real_elements = $this->elements;
            $this->fake_elements = $def->info_content_sets['Flow'];
            $this->fake_elements['#PCDATA'] = true;
            $this->init = true;
        }
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ChildDef/List.php000064400000005705151214231100016257 0ustar00<?php

/**
 * Definition for list containers ul and ol.
 *
 * What does this do?  The big thing is to handle ol/ul at the top
 * level of list nodes, which should be handled specially by /folding/
 * them into the previous list node.  We generally shouldn't ever
 * see other disallowed elements, because the autoclose behavior
 * in MakeWellFormed handles it.
 */
class HTMLPurifier_ChildDef_List extends HTMLPurifier_ChildDef
{
    /**
     * @type string
     */
    public $type = 'list';
    /**
     * @type array
     */
    // lying a little bit, so that we can handle ul and ol ourselves
    // XXX: This whole business with 'wrap' is all a bit unsatisfactory
    public $elements = array('li' => true, 'ul' => true, 'ol' => true);

    /**
     * @param array $children
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return array
     */
    public function validateChildren($children, $config, $context)
    {
        // Flag for subclasses
        $this->whitespace = false;

        // if there are no tokens, delete parent node
        if (empty($children)) {
            return false;
        }

        // if li is not allowed, delete parent node
        if (!isset($config->getHTMLDefinition()->info['li'])) {
            trigger_error("Cannot allow ul/ol without allowing li", E_USER_WARNING);
            return false;
        }

        // the new set of children
        $result = array();

        // a little sanity check to make sure it's not ALL whitespace
        $all_whitespace = true;

        $current_li = null;

        foreach ($children as $node) {
            if (!empty($node->is_whitespace)) {
                $result[] = $node;
                continue;
            }
            $all_whitespace = false; // phew, we're not talking about whitespace

            if ($node->name === 'li') {
                // good
                $current_li = $node;
                $result[] = $node;
            } else {
                // we want to tuck this into the previous li
                // Invariant: we expect the node to be ol/ul
                // ToDo: Make this more robust in the case of not ol/ul
                // by distinguishing between existing li and li created
                // to handle non-list elements; non-list elements should
                // not be appended to an existing li; only li created
                // for non-list. This distinction is not currently made.
                if ($current_li === null) {
                    $current_li = new HTMLPurifier_Node_Element('li');
                    $result[] = $current_li;
                }
                $current_li->children[] = $node;
                $current_li->empty = false; // XXX fascinating! Check for this error elsewhere ToDo
            }
        }
        if (empty($result)) {
            return false;
        }
        if ($all_whitespace) {
            return false;
        }
        return $result;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ChildDef/Empty.php000064400000001542151214231100016435 0ustar00<?php

/**
 * Definition that disallows all elements.
 * @warning validateChildren() in this class is actually never called, because
 *          empty elements are corrected in HTMLPurifier_Strategy_MakeWellFormed
 *          before child definitions are parsed in earnest by
 *          HTMLPurifier_Strategy_FixNesting.
 */
class HTMLPurifier_ChildDef_Empty extends HTMLPurifier_ChildDef
{
    /**
     * @type bool
     */
    public $allow_empty = true;

    /**
     * @type string
     */
    public $type = 'empty';

    public function __construct()
    {
    }

    /**
     * @param HTMLPurifier_Node[] $children
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return array
     */
    public function validateChildren($children, $config, $context)
    {
        return array();
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ChildDef/Required.php000064400000006426151214231100017125 0ustar00<?php

/**
 * Definition that allows a set of elements, but disallows empty children.
 */
class HTMLPurifier_ChildDef_Required extends HTMLPurifier_ChildDef
{
    /**
     * Lookup table of allowed elements.
     * @type array
     */
    public $elements = array();

    /**
     * Whether or not the last passed node was all whitespace.
     * @type bool
     */
    protected $whitespace = false;

    /**
     * @param array|string $elements List of allowed element names (lowercase).
     */
    public function __construct($elements)
    {
        if (is_string($elements)) {
            $elements = str_replace(' ', '', $elements);
            $elements = explode('|', $elements);
        }
        $keys = array_keys($elements);
        if ($keys == array_keys($keys)) {
            $elements = array_flip($elements);
            foreach ($elements as $i => $x) {
                $elements[$i] = true;
                if (empty($i)) {
                    unset($elements[$i]);
                } // remove blank
            }
        }
        $this->elements = $elements;
    }

    /**
     * @type bool
     */
    public $allow_empty = false;

    /**
     * @type string
     */
    public $type = 'required';

    /**
     * @param array $children
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return array
     */
    public function validateChildren($children, $config, $context)
    {
        // Flag for subclasses
        $this->whitespace = false;

        // if there are no tokens, delete parent node
        if (empty($children)) {
            return false;
        }

        // the new set of children
        $result = array();

        // whether or not parsed character data is allowed
        // this controls whether or not we silently drop a tag
        // or generate escaped HTML from it
        $pcdata_allowed = isset($this->elements['#PCDATA']);

        // a little sanity check to make sure it's not ALL whitespace
        $all_whitespace = true;

        $stack = array_reverse($children);
        while (!empty($stack)) {
            $node = array_pop($stack);
            if (!empty($node->is_whitespace)) {
                $result[] = $node;
                continue;
            }
            $all_whitespace = false; // phew, we're not talking about whitespace

            if (!isset($this->elements[$node->name])) {
                // special case text
                // XXX One of these ought to be redundant or something
                if ($pcdata_allowed && $node instanceof HTMLPurifier_Node_Text) {
                    $result[] = $node;
                    continue;
                }
                // spill the child contents in
                // ToDo: Make configurable
                if ($node instanceof HTMLPurifier_Node_Element) {
                    for ($i = count($node->children) - 1; $i >= 0; $i--) {
                        $stack[] = $node->children[$i];
                    }
                    continue;
                }
                continue;
            }
            $result[] = $node;
        }
        if (empty($result)) {
            return false;
        }
        if ($all_whitespace) {
            $this->whitespace = true;
            return false;
        }
        return $result;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ChildDef/Custom.php000064400000005255151214231100016616 0ustar00<?php

/**
 * Custom validation class, accepts DTD child definitions
 *
 * @warning Currently this class is an all or nothing proposition, that is,
 *          it will only give a bool return value.
 */
class HTMLPurifier_ChildDef_Custom extends HTMLPurifier_ChildDef
{
    /**
     * @type string
     */
    public $type = 'custom';

    /**
     * @type bool
     */
    public $allow_empty = false;

    /**
     * Allowed child pattern as defined by the DTD.
     * @type string
     */
    public $dtd_regex;

    /**
     * PCRE regex derived from $dtd_regex.
     * @type string
     */
    private $_pcre_regex;

    /**
     * @param $dtd_regex Allowed child pattern from the DTD
     */
    public function __construct($dtd_regex)
    {
        $this->dtd_regex = $dtd_regex;
        $this->_compileRegex();
    }

    /**
     * Compiles the PCRE regex from a DTD regex ($dtd_regex to $_pcre_regex)
     */
    protected function _compileRegex()
    {
        $raw = str_replace(' ', '', $this->dtd_regex);
        if ($raw[0] != '(') {
            $raw = "($raw)";
        }
        $el = '[#a-zA-Z0-9_.-]+';
        $reg = $raw;

        // COMPLICATED! AND MIGHT BE BUGGY! I HAVE NO CLUE WHAT I'M
        // DOING! Seriously: if there's problems, please report them.

        // collect all elements into the $elements array
        preg_match_all("/$el/", $reg, $matches);
        foreach ($matches[0] as $match) {
            $this->elements[$match] = true;
        }

        // setup all elements as parentheticals with leading commas
        $reg = preg_replace("/$el/", '(,\\0)', $reg);

        // remove commas when they were not solicited
        $reg = preg_replace("/([^,(|]\(+),/", '\\1', $reg);

        // remove all non-paranthetical commas: they are handled by first regex
        $reg = preg_replace("/,\(/", '(', $reg);

        $this->_pcre_regex = $reg;
    }

    /**
     * @param HTMLPurifier_Node[] $children
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool
     */
    public function validateChildren($children, $config, $context)
    {
        $list_of_children = '';
        $nesting = 0; // depth into the nest
        foreach ($children as $node) {
            if (!empty($node->is_whitespace)) {
                continue;
            }
            $list_of_children .= $node->name . ',';
        }
        // add leading comma to deal with stray comma declarations
        $list_of_children = ',' . rtrim($list_of_children, ',');
        $okay =
            preg_match(
                '/^,?' . $this->_pcre_regex . '$/',
                $list_of_children
            );
        return (bool)$okay;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ChildDef/Optional.php000064400000002271151214231100017124 0ustar00<?php

/**
 * Definition that allows a set of elements, and allows no children.
 * @note This is a hack to reuse code from HTMLPurifier_ChildDef_Required,
 *       really, one shouldn't inherit from the other.  Only altered behavior
 *       is to overload a returned false with an array.  Thus, it will never
 *       return false.
 */
class HTMLPurifier_ChildDef_Optional extends HTMLPurifier_ChildDef_Required
{
    /**
     * @type bool
     */
    public $allow_empty = true;

    /**
     * @type string
     */
    public $type = 'optional';

    /**
     * @param array $children
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return array
     */
    public function validateChildren($children, $config, $context)
    {
        $result = parent::validateChildren($children, $config, $context);
        // we assume that $children is not modified
        if ($result === false) {
            if (empty($children)) {
                return true;
            } elseif ($this->whitespace) {
                return $children;
            } else {
                return array();
            }
        }
        return $result;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ChildDef/Chameleon.php000064400000003552151214231100017235 0ustar00<?php

/**
 * Definition that uses different definitions depending on context.
 *
 * The del and ins tags are notable because they allow different types of
 * elements depending on whether or not they're in a block or inline context.
 * Chameleon allows this behavior to happen by using two different
 * definitions depending on context.  While this somewhat generalized,
 * it is specifically intended for those two tags.
 */
class HTMLPurifier_ChildDef_Chameleon extends HTMLPurifier_ChildDef
{

    /**
     * Instance of the definition object to use when inline. Usually stricter.
     * @type HTMLPurifier_ChildDef_Optional
     */
    public $inline;

    /**
     * Instance of the definition object to use when block.
     * @type HTMLPurifier_ChildDef_Optional
     */
    public $block;

    /**
     * @type string
     */
    public $type = 'chameleon';

    /**
     * @param array $inline List of elements to allow when inline.
     * @param array $block List of elements to allow when block.
     */
    public function __construct($inline, $block)
    {
        $this->inline = new HTMLPurifier_ChildDef_Optional($inline);
        $this->block = new HTMLPurifier_ChildDef_Optional($block);
        $this->elements = $this->block->elements;
    }

    /**
     * @param HTMLPurifier_Node[] $children
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return bool
     */
    public function validateChildren($children, $config, $context)
    {
        if ($context->get('IsInline') === false) {
            return $this->block->validateChildren(
                $children,
                $config,
                $context
            );
        } else {
            return $this->inline->validateChildren(
                $children,
                $config,
                $context
            );
        }
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/EntityLookup.php000064400000002622151214231100016343 0ustar00<?php

/**
 * Object that provides entity lookup table from entity name to character
 */
class HTMLPurifier_EntityLookup
{
    /**
     * Assoc array of entity name to character represented.
     * @type array
     */
    public $table;

    /**
     * Sets up the entity lookup table from the serialized file contents.
     * @param bool $file
     * @note The serialized contents are versioned, but were generated
     *       using the maintenance script generate_entity_file.php
     * @warning This is not in constructor to help enforce the Singleton
     */
    public function setup($file = false)
    {
        if (!$file) {
            $file = HTMLPURIFIER_PREFIX . '/HTMLPurifier/EntityLookup/entities.ser';
        }
        $this->table = unserialize(file_get_contents($file));
    }

    /**
     * Retrieves sole instance of the object.
     * @param bool|HTMLPurifier_EntityLookup $prototype Optional prototype of custom lookup table to overload with.
     * @return HTMLPurifier_EntityLookup
     */
    public static function instance($prototype = false)
    {
        // no references, since PHP doesn't copy unless modified
        static $instance = null;
        if ($prototype) {
            $instance = $prototype;
        } elseif (!$instance) {
            $instance = new HTMLPurifier_EntityLookup();
            $instance->setup();
        }
        return $instance;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/AttrTransform.php000064400000003705151214231100016506 0ustar00<?php

/**
 * Processes an entire attribute array for corrections needing multiple values.
 *
 * Occasionally, a certain attribute will need to be removed and popped onto
 * another value.  Instead of creating a complex return syntax for
 * HTMLPurifier_AttrDef, we just pass the whole attribute array to a
 * specialized object and have that do the special work.  That is the
 * family of HTMLPurifier_AttrTransform.
 *
 * An attribute transformation can be assigned to run before or after
 * HTMLPurifier_AttrDef validation.  See HTMLPurifier_HTMLDefinition for
 * more details.
 */

abstract class HTMLPurifier_AttrTransform
{

    /**
     * Abstract: makes changes to the attributes dependent on multiple values.
     *
     * @param array $attr Assoc array of attributes, usually from
     *              HTMLPurifier_Token_Tag::$attr
     * @param HTMLPurifier_Config $config Mandatory HTMLPurifier_Config object.
     * @param HTMLPurifier_Context $context Mandatory HTMLPurifier_Context object
     * @return array Processed attribute array.
     */
    abstract public function transform($attr, $config, $context);

    /**
     * Prepends CSS properties to the style attribute, creating the
     * attribute if it doesn't exist.
     * @param array &$attr Attribute array to process (passed by reference)
     * @param string $css CSS to prepend
     */
    public function prependCSS(&$attr, $css)
    {
        $attr['style'] = isset($attr['style']) ? $attr['style'] : '';
        $attr['style'] = $css . $attr['style'];
    }

    /**
     * Retrieves and removes an attribute
     * @param array &$attr Attribute array to process (passed by reference)
     * @param mixed $key Key of attribute to confiscate
     * @return mixed
     */
    public function confiscateAttr(&$attr, $key)
    {
        if (!isset($attr[$key])) {
            return null;
        }
        $value = $attr[$key];
        unset($attr[$key]);
        return $value;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Language/messages/en.php000064400000007720151214231100017635 0ustar00<?php

$fallback = false;

$messages = array(

    'HTMLPurifier' => 'HTML Purifier',
// for unit testing purposes
    'LanguageFactoryTest: Pizza' => 'Pizza',
    'LanguageTest: List' => '$1',
    'LanguageTest: Hash' => '$1.Keys; $1.Values',
    'Item separator' => ', ',
    'Item separator last' => ' and ', // non-Harvard style

    'ErrorCollector: No errors' => 'No errors detected. However, because error reporting is still incomplete, there may have been errors that the error collector was not notified of; please inspect the output HTML carefully.',
    'ErrorCollector: At line' => ' at line $line',
    'ErrorCollector: Incidental errors' => 'Incidental errors',
    'Lexer: Unclosed comment' => 'Unclosed comment',
    'Lexer: Unescaped lt' => 'Unescaped less-than sign (<) should be &lt;',
    'Lexer: Missing gt' => 'Missing greater-than sign (>), previous less-than sign (<) should be escaped',
    'Lexer: Missing attribute key' => 'Attribute declaration has no key',
    'Lexer: Missing end quote' => 'Attribute declaration has no end quote',
    'Lexer: Extracted body' => 'Removed document metadata tags',
    'Strategy_RemoveForeignElements: Tag transform' => '<$1> element transformed into $CurrentToken.Serialized',
    'Strategy_RemoveForeignElements: Missing required attribute' => '$CurrentToken.Compact element missing required attribute $1',
    'Strategy_RemoveForeignElements: Foreign element to text' => 'Unrecognized $CurrentToken.Serialized tag converted to text',
    'Strategy_RemoveForeignElements: Foreign element removed' => 'Unrecognized $CurrentToken.Serialized tag removed',
    'Strategy_RemoveForeignElements: Comment removed' => 'Comment containing "$CurrentToken.Data" removed',
    'Strategy_RemoveForeignElements: Foreign meta element removed' => 'Unrecognized $CurrentToken.Serialized meta tag and all descendants removed',
    'Strategy_RemoveForeignElements: Token removed to end' => 'Tags and text starting from $1 element where removed to end',
    'Strategy_RemoveForeignElements: Trailing hyphen in comment removed' => 'Trailing hyphen(s) in comment removed',
    'Strategy_RemoveForeignElements: Hyphens in comment collapsed' => 'Double hyphens in comments are not allowed, and were collapsed into single hyphens',
    'Strategy_MakeWellFormed: Unnecessary end tag removed' => 'Unnecessary $CurrentToken.Serialized tag removed',
    'Strategy_MakeWellFormed: Unnecessary end tag to text' => 'Unnecessary $CurrentToken.Serialized tag converted to text',
    'Strategy_MakeWellFormed: Tag auto closed' => '$1.Compact started on line $1.Line auto-closed by $CurrentToken.Compact',
    'Strategy_MakeWellFormed: Tag carryover' => '$1.Compact started on line $1.Line auto-continued into $CurrentToken.Compact',
    'Strategy_MakeWellFormed: Stray end tag removed' => 'Stray $CurrentToken.Serialized tag removed',
    'Strategy_MakeWellFormed: Stray end tag to text' => 'Stray $CurrentToken.Serialized tag converted to text',
    'Strategy_MakeWellFormed: Tag closed by element end' => '$1.Compact tag started on line $1.Line closed by end of $CurrentToken.Serialized',
    'Strategy_MakeWellFormed: Tag closed by document end' => '$1.Compact tag started on line $1.Line closed by end of document',
    'Strategy_FixNesting: Node removed' => '$CurrentToken.Compact node removed',
    'Strategy_FixNesting: Node excluded' => '$CurrentToken.Compact node removed due to descendant exclusion by ancestor element',
    'Strategy_FixNesting: Node reorganized' => 'Contents of $CurrentToken.Compact node reorganized to enforce its content model',
    'Strategy_FixNesting: Node contents removed' => 'Contents of $CurrentToken.Compact node removed',
    'AttrValidator: Attributes transformed' => 'Attributes on $CurrentToken.Compact transformed from $1.Keys to $2.Keys',
    'AttrValidator: Attribute removed' => '$CurrentAttr.Name attribute on $CurrentToken.Compact removed',
);

$errorNames = array(
    E_ERROR => 'Error',
    E_WARNING => 'Warning',
    E_NOTICE => 'Notice'
);

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/HTMLModule.php000064400000023674151214231100015621 0ustar00<?php

/**
 * Represents an XHTML 1.1 module, with information on elements, tags
 * and attributes.
 * @note Even though this is technically XHTML 1.1, it is also used for
 *       regular HTML parsing. We are using modulization as a convenient
 *       way to represent the internals of HTMLDefinition, and our
 *       implementation is by no means conforming and does not directly
 *       use the normative DTDs or XML schemas.
 * @note The public variables in a module should almost directly
 *       correspond to the variables in HTMLPurifier_HTMLDefinition.
 *       However, the prefix info carries no special meaning in these
 *       objects (include it anyway if that's the correspondence though).
 * @todo Consider making some member functions protected
 */

class HTMLPurifier_HTMLModule
{

    // -- Overloadable ----------------------------------------------------

    /**
     * Short unique string identifier of the module.
     * @type string
     */
    public $name;

    /**
     * Informally, a list of elements this module changes.
     * Not used in any significant way.
     * @type array
     */
    public $elements = array();

    /**
     * Associative array of element names to element definitions.
     * Some definitions may be incomplete, to be merged in later
     * with the full definition.
     * @type array
     */
    public $info = array();

    /**
     * Associative array of content set names to content set additions.
     * This is commonly used to, say, add an A element to the Inline
     * content set. This corresponds to an internal variable $content_sets
     * and NOT info_content_sets member variable of HTMLDefinition.
     * @type array
     */
    public $content_sets = array();

    /**
     * Associative array of attribute collection names to attribute
     * collection additions. More rarely used for adding attributes to
     * the global collections. Example is the StyleAttribute module adding
     * the style attribute to the Core. Corresponds to HTMLDefinition's
     * attr_collections->info, since the object's data is only info,
     * with extra behavior associated with it.
     * @type array
     */
    public $attr_collections = array();

    /**
     * Associative array of deprecated tag name to HTMLPurifier_TagTransform.
     * @type array
     */
    public $info_tag_transform = array();

    /**
     * List of HTMLPurifier_AttrTransform to be performed before validation.
     * @type array
     */
    public $info_attr_transform_pre = array();

    /**
     * List of HTMLPurifier_AttrTransform to be performed after validation.
     * @type array
     */
    public $info_attr_transform_post = array();

    /**
     * List of HTMLPurifier_Injector to be performed during well-formedness fixing.
     * An injector will only be invoked if all of it's pre-requisites are met;
     * if an injector fails setup, there will be no error; it will simply be
     * silently disabled.
     * @type array
     */
    public $info_injector = array();

    /**
     * Boolean flag that indicates whether or not getChildDef is implemented.
     * For optimization reasons: may save a call to a function. Be sure
     * to set it if you do implement getChildDef(), otherwise it will have
     * no effect!
     * @type bool
     */
    public $defines_child_def = false;

    /**
     * Boolean flag whether or not this module is safe. If it is not safe, all
     * of its members are unsafe. Modules are safe by default (this might be
     * slightly dangerous, but it doesn't make much sense to force HTML Purifier,
     * which is based off of safe HTML, to explicitly say, "This is safe," even
     * though there are modules which are "unsafe")
     *
     * @type bool
     * @note Previously, safety could be applied at an element level granularity.
     *       We've removed this ability, so in order to add "unsafe" elements
     *       or attributes, a dedicated module with this property set to false
     *       must be used.
     */
    public $safe = true;

    /**
     * Retrieves a proper HTMLPurifier_ChildDef subclass based on
     * content_model and content_model_type member variables of
     * the HTMLPurifier_ElementDef class. There is a similar function
     * in HTMLPurifier_HTMLDefinition.
     * @param HTMLPurifier_ElementDef $def
     * @return HTMLPurifier_ChildDef subclass
     */
    public function getChildDef($def)
    {
        return false;
    }

    // -- Convenience -----------------------------------------------------

    /**
     * Convenience function that sets up a new element
     * @param string $element Name of element to add
     * @param string|bool $type What content set should element be registered to?
     *              Set as false to skip this step.
     * @param string|HTMLPurifier_ChildDef $contents Allowed children in form of:
     *              "$content_model_type: $content_model"
     * @param array|string $attr_includes What attribute collections to register to
     *              element?
     * @param array $attr What unique attributes does the element define?
     * @see HTMLPurifier_ElementDef:: for in-depth descriptions of these parameters.
     * @return HTMLPurifier_ElementDef Created element definition object, so you
     *         can set advanced parameters
     */
    public function addElement($element, $type, $contents, $attr_includes = array(), $attr = array())
    {
        $this->elements[] = $element;
        // parse content_model
        list($content_model_type, $content_model) = $this->parseContents($contents);
        // merge in attribute inclusions
        $this->mergeInAttrIncludes($attr, $attr_includes);
        // add element to content sets
        if ($type) {
            $this->addElementToContentSet($element, $type);
        }
        // create element
        $this->info[$element] = HTMLPurifier_ElementDef::create(
            $content_model,
            $content_model_type,
            $attr
        );
        // literal object $contents means direct child manipulation
        if (!is_string($contents)) {
            $this->info[$element]->child = $contents;
        }
        return $this->info[$element];
    }

    /**
     * Convenience function that creates a totally blank, non-standalone
     * element.
     * @param string $element Name of element to create
     * @return HTMLPurifier_ElementDef Created element
     */
    public function addBlankElement($element)
    {
        if (!isset($this->info[$element])) {
            $this->elements[] = $element;
            $this->info[$element] = new HTMLPurifier_ElementDef();
            $this->info[$element]->standalone = false;
        } else {
            trigger_error("Definition for $element already exists in module, cannot redefine");
        }
        return $this->info[$element];
    }

    /**
     * Convenience function that registers an element to a content set
     * @param string $element Element to register
     * @param string $type Name content set (warning: case sensitive, usually upper-case
     *        first letter)
     */
    public function addElementToContentSet($element, $type)
    {
        if (!isset($this->content_sets[$type])) {
            $this->content_sets[$type] = '';
        } else {
            $this->content_sets[$type] .= ' | ';
        }
        $this->content_sets[$type] .= $element;
    }

    /**
     * Convenience function that transforms single-string contents
     * into separate content model and content model type
     * @param string $contents Allowed children in form of:
     *                  "$content_model_type: $content_model"
     * @return array
     * @note If contents is an object, an array of two nulls will be
     *       returned, and the callee needs to take the original $contents
     *       and use it directly.
     */
    public function parseContents($contents)
    {
        if (!is_string($contents)) {
            return array(null, null);
        } // defer
        switch ($contents) {
            // check for shorthand content model forms
            case 'Empty':
                return array('empty', '');
            case 'Inline':
                return array('optional', 'Inline | #PCDATA');
            case 'Flow':
                return array('optional', 'Flow | #PCDATA');
        }
        list($content_model_type, $content_model) = explode(':', $contents);
        $content_model_type = strtolower(trim($content_model_type));
        $content_model = trim($content_model);
        return array($content_model_type, $content_model);
    }

    /**
     * Convenience function that merges a list of attribute includes into
     * an attribute array.
     * @param array $attr Reference to attr array to modify
     * @param array $attr_includes Array of includes / string include to merge in
     */
    public function mergeInAttrIncludes(&$attr, $attr_includes)
    {
        if (!is_array($attr_includes)) {
            if (empty($attr_includes)) {
                $attr_includes = array();
            } else {
                $attr_includes = array($attr_includes);
            }
        }
        $attr[0] = $attr_includes;
    }

    /**
     * Convenience function that generates a lookup table with boolean
     * true as value.
     * @param string $list List of values to turn into a lookup
     * @note You can also pass an arbitrary number of arguments in
     *       place of the regular argument
     * @return array array equivalent of list
     */
    public function makeLookup($list)
    {
        if (is_string($list)) {
            $list = func_get_args();
        }
        $ret = array();
        foreach ($list as $value) {
            if (is_null($value)) {
                continue;
            }
            $ret[$value] = true;
        }
        return $ret;
    }

    /**
     * Lazy load construction of the module after determining whether
     * or not it's needed, and also when a finalized configuration object
     * is available.
     * @param HTMLPurifier_Config $config
     */
    public function setup($config)
    {
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/DefinitionCache.php000064400000007511151214231100016713 0ustar00<?php

/**
 * Abstract class representing Definition cache managers that implements
 * useful common methods and is a factory.
 * @todo Create a separate maintenance file advanced users can use to
 *       cache their custom HTMLDefinition, which can be loaded
 *       via a configuration directive
 * @todo Implement memcached
 */
abstract class HTMLPurifier_DefinitionCache
{
    /**
     * @type string
     */
    public $type;

    /**
     * @param string $type Type of definition objects this instance of the
     *      cache will handle.
     */
    public function __construct($type)
    {
        $this->type = $type;
    }

    /**
     * Generates a unique identifier for a particular configuration
     * @param HTMLPurifier_Config $config Instance of HTMLPurifier_Config
     * @return string
     */
    public function generateKey($config)
    {
        return $config->version . ',' . // possibly replace with function calls
               $config->getBatchSerial($this->type) . ',' .
               $config->get($this->type . '.DefinitionRev');
    }

    /**
     * Tests whether or not a key is old with respect to the configuration's
     * version and revision number.
     * @param string $key Key to test
     * @param HTMLPurifier_Config $config Instance of HTMLPurifier_Config to test against
     * @return bool
     */
    public function isOld($key, $config)
    {
        if (substr_count($key, ',') < 2) {
            return true;
        }
        list($version, $hash, $revision) = explode(',', $key, 3);
        $compare = version_compare($version, $config->version);
        // version mismatch, is always old
        if ($compare != 0) {
            return true;
        }
        // versions match, ids match, check revision number
        if ($hash == $config->getBatchSerial($this->type) &&
            $revision < $config->get($this->type . '.DefinitionRev')) {
            return true;
        }
        return false;
    }

    /**
     * Checks if a definition's type jives with the cache's type
     * @note Throws an error on failure
     * @param HTMLPurifier_Definition $def Definition object to check
     * @return bool true if good, false if not
     */
    public function checkDefType($def)
    {
        if ($def->type !== $this->type) {
            trigger_error("Cannot use definition of type {$def->type} in cache for {$this->type}");
            return false;
        }
        return true;
    }

    /**
     * Adds a definition object to the cache
     * @param HTMLPurifier_Definition $def
     * @param HTMLPurifier_Config $config
     */
    abstract public function add($def, $config);

    /**
     * Unconditionally saves a definition object to the cache
     * @param HTMLPurifier_Definition $def
     * @param HTMLPurifier_Config $config
     */
    abstract public function set($def, $config);

    /**
     * Replace an object in the cache
     * @param HTMLPurifier_Definition $def
     * @param HTMLPurifier_Config $config
     */
    abstract public function replace($def, $config);

    /**
     * Retrieves a definition object from the cache
     * @param HTMLPurifier_Config $config
     */
    abstract public function get($config);

    /**
     * Removes a definition object to the cache
     * @param HTMLPurifier_Config $config
     */
    abstract public function remove($config);

    /**
     * Clears all objects from cache
     * @param HTMLPurifier_Config $config
     */
    abstract public function flush($config);

    /**
     * Clears all expired (older version or revision) objects from cache
     * @note Be careful implementing this method as flush. Flush must
     *       not interfere with other Definition types, and cleanup()
     *       should not be repeatedly called by userland code.
     * @param HTMLPurifier_Config $config
     */
    abstract public function cleanup($config);
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/PropertyList.php000064400000005337151214231100016363 0ustar00<?php

/**
 * Generic property list implementation
 */
class HTMLPurifier_PropertyList
{
    /**
     * Internal data-structure for properties.
     * @type array
     */
    protected $data = array();

    /**
     * Parent plist.
     * @type HTMLPurifier_PropertyList
     */
    protected $parent;

    /**
     * Cache.
     * @type array
     */
    protected $cache;

    /**
     * @param HTMLPurifier_PropertyList $parent Parent plist
     */
    public function __construct($parent = null)
    {
        $this->parent = $parent;
    }

    /**
     * Recursively retrieves the value for a key
     * @param string $name
     * @throws HTMLPurifier_Exception
     */
    public function get($name)
    {
        if ($this->has($name)) {
            return $this->data[$name];
        }
        // possible performance bottleneck, convert to iterative if necessary
        if ($this->parent) {
            return $this->parent->get($name);
        }
        throw new HTMLPurifier_Exception("Key '$name' not found");
    }

    /**
     * Sets the value of a key, for this plist
     * @param string $name
     * @param mixed $value
     */
    public function set($name, $value)
    {
        $this->data[$name] = $value;
    }

    /**
     * Returns true if a given key exists
     * @param string $name
     * @return bool
     */
    public function has($name)
    {
        return array_key_exists($name, $this->data);
    }

    /**
     * Resets a value to the value of it's parent, usually the default. If
     * no value is specified, the entire plist is reset.
     * @param string $name
     */
    public function reset($name = null)
    {
        if ($name == null) {
            $this->data = array();
        } else {
            unset($this->data[$name]);
        }
    }

    /**
     * Squashes this property list and all of its property lists into a single
     * array, and returns the array. This value is cached by default.
     * @param bool $force If true, ignores the cache and regenerates the array.
     * @return array
     */
    public function squash($force = false)
    {
        if ($this->cache !== null && !$force) {
            return $this->cache;
        }
        if ($this->parent) {
            return $this->cache = array_merge($this->parent->squash($force), $this->data);
        } else {
            return $this->cache = $this->data;
        }
    }

    /**
     * Returns the parent plist.
     * @return HTMLPurifier_PropertyList
     */
    public function getParent()
    {
        return $this->parent;
    }

    /**
     * Sets the parent plist.
     * @param HTMLPurifier_PropertyList $plist Parent plist
     */
    public function setParent($plist)
    {
        $this->parent = $plist;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Strategy/RemoveForeignElements.php000064400000021722151214231100021745 0ustar00<?php

/**
 * Removes all unrecognized tags from the list of tokens.
 *
 * This strategy iterates through all the tokens and removes unrecognized
 * tokens. If a token is not recognized but a TagTransform is defined for
 * that element, the element will be transformed accordingly.
 */

class HTMLPurifier_Strategy_RemoveForeignElements extends HTMLPurifier_Strategy
{

    /**
     * @param HTMLPurifier_Token[] $tokens
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return array|HTMLPurifier_Token[]
     */
    public function execute($tokens, $config, $context)
    {
        $definition = $config->getHTMLDefinition();
        $generator = new HTMLPurifier_Generator($config, $context);
        $result = array();

        $escape_invalid_tags = $config->get('Core.EscapeInvalidTags');
        $remove_invalid_img = $config->get('Core.RemoveInvalidImg');

        // currently only used to determine if comments should be kept
        $trusted = $config->get('HTML.Trusted');
        $comment_lookup = $config->get('HTML.AllowedComments');
        $comment_regexp = $config->get('HTML.AllowedCommentsRegexp');
        $check_comments = $comment_lookup !== array() || $comment_regexp !== null;

        $remove_script_contents = $config->get('Core.RemoveScriptContents');
        $hidden_elements = $config->get('Core.HiddenElements');

        // remove script contents compatibility
        if ($remove_script_contents === true) {
            $hidden_elements['script'] = true;
        } elseif ($remove_script_contents === false && isset($hidden_elements['script'])) {
            unset($hidden_elements['script']);
        }

        $attr_validator = new HTMLPurifier_AttrValidator();

        // removes tokens until it reaches a closing tag with its value
        $remove_until = false;

        // converts comments into text tokens when this is equal to a tag name
        $textify_comments = false;

        $token = false;
        $context->register('CurrentToken', $token);

        $e = false;
        if ($config->get('Core.CollectErrors')) {
            $e =& $context->get('ErrorCollector');
        }

        foreach ($tokens as $token) {
            if ($remove_until) {
                if (empty($token->is_tag) || $token->name !== $remove_until) {
                    continue;
                }
            }
            if (!empty($token->is_tag)) {
                // DEFINITION CALL

                // before any processing, try to transform the element
                if (isset($definition->info_tag_transform[$token->name])) {
                    $original_name = $token->name;
                    // there is a transformation for this tag
                    // DEFINITION CALL
                    $token = $definition->
                        info_tag_transform[$token->name]->transform($token, $config, $context);
                    if ($e) {
                        $e->send(E_NOTICE, 'Strategy_RemoveForeignElements: Tag transform', $original_name);
                    }
                }

                if (isset($definition->info[$token->name])) {
                    // mostly everything's good, but
                    // we need to make sure required attributes are in order
                    if (($token instanceof HTMLPurifier_Token_Start || $token instanceof HTMLPurifier_Token_Empty) &&
                        $definition->info[$token->name]->required_attr &&
                        ($token->name != 'img' || $remove_invalid_img) // ensure config option still works
                    ) {
                        $attr_validator->validateToken($token, $config, $context);
                        $ok = true;
                        foreach ($definition->info[$token->name]->required_attr as $name) {
                            if (!isset($token->attr[$name])) {
                                $ok = false;
                                break;
                            }
                        }
                        if (!$ok) {
                            if ($e) {
                                $e->send(
                                    E_ERROR,
                                    'Strategy_RemoveForeignElements: Missing required attribute',
                                    $name
                                );
                            }
                            continue;
                        }
                        $token->armor['ValidateAttributes'] = true;
                    }

                    if (isset($hidden_elements[$token->name]) && $token instanceof HTMLPurifier_Token_Start) {
                        $textify_comments = $token->name;
                    } elseif ($token->name === $textify_comments && $token instanceof HTMLPurifier_Token_End) {
                        $textify_comments = false;
                    }

                } elseif ($escape_invalid_tags) {
                    // invalid tag, generate HTML representation and insert in
                    if ($e) {
                        $e->send(E_WARNING, 'Strategy_RemoveForeignElements: Foreign element to text');
                    }
                    $token = new HTMLPurifier_Token_Text(
                        $generator->generateFromToken($token)
                    );
                } else {
                    // check if we need to destroy all of the tag's children
                    // CAN BE GENERICIZED
                    if (isset($hidden_elements[$token->name])) {
                        if ($token instanceof HTMLPurifier_Token_Start) {
                            $remove_until = $token->name;
                        } elseif ($token instanceof HTMLPurifier_Token_Empty) {
                            // do nothing: we're still looking
                        } else {
                            $remove_until = false;
                        }
                        if ($e) {
                            $e->send(E_ERROR, 'Strategy_RemoveForeignElements: Foreign meta element removed');
                        }
                    } else {
                        if ($e) {
                            $e->send(E_ERROR, 'Strategy_RemoveForeignElements: Foreign element removed');
                        }
                    }
                    continue;
                }
            } elseif ($token instanceof HTMLPurifier_Token_Comment) {
                // textify comments in script tags when they are allowed
                if ($textify_comments !== false) {
                    $data = $token->data;
                    $token = new HTMLPurifier_Token_Text($data);
                } elseif ($trusted || $check_comments) {
                    // always cleanup comments
                    $trailing_hyphen = false;
                    if ($e) {
                        // perform check whether or not there's a trailing hyphen
                        if (substr($token->data, -1) == '-') {
                            $trailing_hyphen = true;
                        }
                    }
                    $token->data = rtrim($token->data, '-');
                    $found_double_hyphen = false;
                    while (strpos($token->data, '--') !== false) {
                        $found_double_hyphen = true;
                        $token->data = str_replace('--', '-', $token->data);
                    }
                    if ($trusted || !empty($comment_lookup[trim($token->data)]) ||
                        ($comment_regexp !== null && preg_match($comment_regexp, trim($token->data)))) {
                        // OK good
                        if ($e) {
                            if ($trailing_hyphen) {
                                $e->send(
                                    E_NOTICE,
                                    'Strategy_RemoveForeignElements: Trailing hyphen in comment removed'
                                );
                            }
                            if ($found_double_hyphen) {
                                $e->send(E_NOTICE, 'Strategy_RemoveForeignElements: Hyphens in comment collapsed');
                            }
                        }
                    } else {
                        if ($e) {
                            $e->send(E_NOTICE, 'Strategy_RemoveForeignElements: Comment removed');
                        }
                        continue;
                    }
                } else {
                    // strip comments
                    if ($e) {
                        $e->send(E_NOTICE, 'Strategy_RemoveForeignElements: Comment removed');
                    }
                    continue;
                }
            } elseif ($token instanceof HTMLPurifier_Token_Text) {
            } else {
                continue;
            }
            $result[] = $token;
        }
        if ($remove_until && $e) {
            // we removed tokens until the end, throw error
            $e->send(E_ERROR, 'Strategy_RemoveForeignElements: Token removed to end', $remove_until);
        }
        $context->destroy('CurrentToken');
        return $result;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Strategy/Composite.php000064400000001327151214231100017442 0ustar00<?php

/**
 * Composite strategy that runs multiple strategies on tokens.
 */
abstract class HTMLPurifier_Strategy_Composite extends HTMLPurifier_Strategy
{

    /**
     * List of strategies to run tokens through.
     * @type HTMLPurifier_Strategy[]
     */
    protected $strategies = array();

    /**
     * @param HTMLPurifier_Token[] $tokens
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return HTMLPurifier_Token[]
     */
    public function execute($tokens, $config, $context)
    {
        foreach ($this->strategies as $strategy) {
            $tokens = $strategy->execute($tokens, $config, $context);
        }
        return $tokens;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Strategy/MakeWellFormed.php000064400000065741151214231100020350 0ustar00<?php

/**
 * Takes tokens makes them well-formed (balance end tags, etc.)
 *
 * Specification of the armor attributes this strategy uses:
 *
 *      - MakeWellFormed_TagClosedError: This armor field is used to
 *        suppress tag closed errors for certain tokens [TagClosedSuppress],
 *        in particular, if a tag was generated automatically by HTML
 *        Purifier, we may rely on our infrastructure to close it for us
 *        and shouldn't report an error to the user [TagClosedAuto].
 */
class HTMLPurifier_Strategy_MakeWellFormed extends HTMLPurifier_Strategy
{

    /**
     * Array stream of tokens being processed.
     * @type HTMLPurifier_Token[]
     */
    protected $tokens;

    /**
     * Current token.
     * @type HTMLPurifier_Token
     */
    protected $token;

    /**
     * Zipper managing the true state.
     * @type HTMLPurifier_Zipper
     */
    protected $zipper;

    /**
     * Current nesting of elements.
     * @type array
     */
    protected $stack;

    /**
     * Injectors active in this stream processing.
     * @type HTMLPurifier_Injector[]
     */
    protected $injectors;

    /**
     * Current instance of HTMLPurifier_Config.
     * @type HTMLPurifier_Config
     */
    protected $config;

    /**
     * Current instance of HTMLPurifier_Context.
     * @type HTMLPurifier_Context
     */
    protected $context;

    /**
     * @param HTMLPurifier_Token[] $tokens
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return HTMLPurifier_Token[]
     * @throws HTMLPurifier_Exception
     */
    public function execute($tokens, $config, $context)
    {
        $definition = $config->getHTMLDefinition();

        // local variables
        $generator = new HTMLPurifier_Generator($config, $context);
        $escape_invalid_tags = $config->get('Core.EscapeInvalidTags');
        // used for autoclose early abortion
        $global_parent_allowed_elements = $definition->info_parent_def->child->getAllowedElements($config);
        $e = $context->get('ErrorCollector', true);
        $i = false; // injector index
        list($zipper, $token) = HTMLPurifier_Zipper::fromArray($tokens);
        if ($token === NULL) {
            return array();
        }
        $reprocess = false; // whether or not to reprocess the same token
        $stack = array();

        // member variables
        $this->stack =& $stack;
        $this->tokens =& $tokens;
        $this->token =& $token;
        $this->zipper =& $zipper;
        $this->config = $config;
        $this->context = $context;

        // context variables
        $context->register('CurrentNesting', $stack);
        $context->register('InputZipper', $zipper);
        $context->register('CurrentToken', $token);

        // -- begin INJECTOR --

        $this->injectors = array();

        $injectors = $config->getBatch('AutoFormat');
        $def_injectors = $definition->info_injector;
        $custom_injectors = $injectors['Custom'];
        unset($injectors['Custom']); // special case
        foreach ($injectors as $injector => $b) {
            // XXX: Fix with a legitimate lookup table of enabled filters
            if (strpos($injector, '.') !== false) {
                continue;
            }
            $injector = "HTMLPurifier_Injector_$injector";
            if (!$b) {
                continue;
            }
            $this->injectors[] = new $injector;
        }
        foreach ($def_injectors as $injector) {
            // assumed to be objects
            $this->injectors[] = $injector;
        }
        foreach ($custom_injectors as $injector) {
            if (!$injector) {
                continue;
            }
            if (is_string($injector)) {
                $injector = "HTMLPurifier_Injector_$injector";
                $injector = new $injector;
            }
            $this->injectors[] = $injector;
        }

        // give the injectors references to the definition and context
        // variables for performance reasons
        foreach ($this->injectors as $ix => $injector) {
            $error = $injector->prepare($config, $context);
            if (!$error) {
                continue;
            }
            array_splice($this->injectors, $ix, 1); // rm the injector
            trigger_error("Cannot enable {$injector->name} injector because $error is not allowed", E_USER_WARNING);
        }

        // -- end INJECTOR --

        // a note on reprocessing:
        //      In order to reduce code duplication, whenever some code needs
        //      to make HTML changes in order to make things "correct", the
        //      new HTML gets sent through the purifier, regardless of its
        //      status. This means that if we add a start token, because it
        //      was totally necessary, we don't have to update nesting; we just
        //      punt ($reprocess = true; continue;) and it does that for us.

        // isset is in loop because $tokens size changes during loop exec
        for (;;
             // only increment if we don't need to reprocess
             $reprocess ? $reprocess = false : $token = $zipper->next($token)) {

            // check for a rewind
            if (is_int($i)) {
                // possibility: disable rewinding if the current token has a
                // rewind set on it already. This would offer protection from
                // infinite loop, but might hinder some advanced rewinding.
                $rewind_offset = $this->injectors[$i]->getRewindOffset();
                if (is_int($rewind_offset)) {
                    for ($j = 0; $j < $rewind_offset; $j++) {
                        if (empty($zipper->front)) break;
                        $token = $zipper->prev($token);
                        // indicate that other injectors should not process this token,
                        // but we need to reprocess it.  See Note [Injector skips]
                        unset($token->skip[$i]);
                        $token->rewind = $i;
                        if ($token instanceof HTMLPurifier_Token_Start) {
                            array_pop($this->stack);
                        } elseif ($token instanceof HTMLPurifier_Token_End) {
                            $this->stack[] = $token->start;
                        }
                    }
                }
                $i = false;
            }

            // handle case of document end
            if ($token === NULL) {
                // kill processing if stack is empty
                if (empty($this->stack)) {
                    break;
                }

                // peek
                $top_nesting = array_pop($this->stack);
                $this->stack[] = $top_nesting;

                // send error [TagClosedSuppress]
                if ($e && !isset($top_nesting->armor['MakeWellFormed_TagClosedError'])) {
                    $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag closed by document end', $top_nesting);
                }

                // append, don't splice, since this is the end
                $token = new HTMLPurifier_Token_End($top_nesting->name);

                // punt!
                $reprocess = true;
                continue;
            }

            //echo '<br>'; printZipper($zipper, $token);//printTokens($this->stack);
            //flush();

            // quick-check: if it's not a tag, no need to process
            if (empty($token->is_tag)) {
                if ($token instanceof HTMLPurifier_Token_Text) {
                    foreach ($this->injectors as $i => $injector) {
                        if (isset($token->skip[$i])) {
                            // See Note [Injector skips]
                            continue;
                        }
                        if ($token->rewind !== null && $token->rewind !== $i) {
                            continue;
                        }
                        // XXX fuckup
                        $r = $token;
                        $injector->handleText($r);
                        $token = $this->processToken($r, $i);
                        $reprocess = true;
                        break;
                    }
                }
                // another possibility is a comment
                continue;
            }

            if (isset($definition->info[$token->name])) {
                $type = $definition->info[$token->name]->child->type;
            } else {
                $type = false; // Type is unknown, treat accordingly
            }

            // quick tag checks: anything that's *not* an end tag
            $ok = false;
            if ($type === 'empty' && $token instanceof HTMLPurifier_Token_Start) {
                // claims to be a start tag but is empty
                $token = new HTMLPurifier_Token_Empty(
                    $token->name,
                    $token->attr,
                    $token->line,
                    $token->col,
                    $token->armor
                );
                $ok = true;
            } elseif ($type && $type !== 'empty' && $token instanceof HTMLPurifier_Token_Empty) {
                // claims to be empty but really is a start tag
                // NB: this assignment is required
                $old_token = $token;
                $token = new HTMLPurifier_Token_End($token->name);
                $token = $this->insertBefore(
                    new HTMLPurifier_Token_Start($old_token->name, $old_token->attr, $old_token->line, $old_token->col, $old_token->armor)
                );
                // punt (since we had to modify the input stream in a non-trivial way)
                $reprocess = true;
                continue;
            } elseif ($token instanceof HTMLPurifier_Token_Empty) {
                // real empty token
                $ok = true;
            } elseif ($token instanceof HTMLPurifier_Token_Start) {
                // start tag

                // ...unless they also have to close their parent
                if (!empty($this->stack)) {

                    // Performance note: you might think that it's rather
                    // inefficient, recalculating the autoclose information
                    // for every tag that a token closes (since when we
                    // do an autoclose, we push a new token into the
                    // stream and then /process/ that, before
                    // re-processing this token.)  But this is
                    // necessary, because an injector can make an
                    // arbitrary transformations to the autoclosing
                    // tokens we introduce, so things may have changed
                    // in the meantime.  Also, doing the inefficient thing is
                    // "easy" to reason about (for certain perverse definitions
                    // of "easy")

                    $parent = array_pop($this->stack);
                    $this->stack[] = $parent;

                    $parent_def = null;
                    $parent_elements = null;
                    $autoclose = false;
                    if (isset($definition->info[$parent->name])) {
                        $parent_def = $definition->info[$parent->name];
                        $parent_elements = $parent_def->child->getAllowedElements($config);
                        $autoclose = !isset($parent_elements[$token->name]);
                    }

                    if ($autoclose && $definition->info[$token->name]->wrap) {
                        // Check if an element can be wrapped by another
                        // element to make it valid in a context (for
                        // example, <ul><ul> needs a <li> in between)
                        $wrapname = $definition->info[$token->name]->wrap;
                        $wrapdef = $definition->info[$wrapname];
                        $elements = $wrapdef->child->getAllowedElements($config);
                        if (isset($elements[$token->name]) && isset($parent_elements[$wrapname])) {
                            $newtoken = new HTMLPurifier_Token_Start($wrapname);
                            $token = $this->insertBefore($newtoken);
                            $reprocess = true;
                            continue;
                        }
                    }

                    $carryover = false;
                    if ($autoclose && $parent_def->formatting) {
                        $carryover = true;
                    }

                    if ($autoclose) {
                        // check if this autoclose is doomed to fail
                        // (this rechecks $parent, which his harmless)
                        $autoclose_ok = isset($global_parent_allowed_elements[$token->name]);
                        if (!$autoclose_ok) {
                            foreach ($this->stack as $ancestor) {
                                $elements = $definition->info[$ancestor->name]->child->getAllowedElements($config);
                                if (isset($elements[$token->name])) {
                                    $autoclose_ok = true;
                                    break;
                                }
                                if ($definition->info[$token->name]->wrap) {
                                    $wrapname = $definition->info[$token->name]->wrap;
                                    $wrapdef = $definition->info[$wrapname];
                                    $wrap_elements = $wrapdef->child->getAllowedElements($config);
                                    if (isset($wrap_elements[$token->name]) && isset($elements[$wrapname])) {
                                        $autoclose_ok = true;
                                        break;
                                    }
                                }
                            }
                        }
                        if ($autoclose_ok) {
                            // errors need to be updated
                            $new_token = new HTMLPurifier_Token_End($parent->name);
                            $new_token->start = $parent;
                            // [TagClosedSuppress]
                            if ($e && !isset($parent->armor['MakeWellFormed_TagClosedError'])) {
                                if (!$carryover) {
                                    $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag auto closed', $parent);
                                } else {
                                    $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag carryover', $parent);
                                }
                            }
                            if ($carryover) {
                                $element = clone $parent;
                                // [TagClosedAuto]
                                $element->armor['MakeWellFormed_TagClosedError'] = true;
                                $element->carryover = true;
                                $token = $this->processToken(array($new_token, $token, $element));
                            } else {
                                $token = $this->insertBefore($new_token);
                            }
                        } else {
                            $token = $this->remove();
                        }
                        $reprocess = true;
                        continue;
                    }

                }
                $ok = true;
            }

            if ($ok) {
                foreach ($this->injectors as $i => $injector) {
                    if (isset($token->skip[$i])) {
                        // See Note [Injector skips]
                        continue;
                    }
                    if ($token->rewind !== null && $token->rewind !== $i) {
                        continue;
                    }
                    $r = $token;
                    $injector->handleElement($r);
                    $token = $this->processToken($r, $i);
                    $reprocess = true;
                    break;
                }
                if (!$reprocess) {
                    // ah, nothing interesting happened; do normal processing
                    if ($token instanceof HTMLPurifier_Token_Start) {
                        $this->stack[] = $token;
                    } elseif ($token instanceof HTMLPurifier_Token_End) {
                        throw new HTMLPurifier_Exception(
                            'Improper handling of end tag in start code; possible error in MakeWellFormed'
                        );
                    }
                }
                continue;
            }

            // sanity check: we should be dealing with a closing tag
            if (!$token instanceof HTMLPurifier_Token_End) {
                throw new HTMLPurifier_Exception('Unaccounted for tag token in input stream, bug in HTML Purifier');
            }

            // make sure that we have something open
            if (empty($this->stack)) {
                if ($escape_invalid_tags) {
                    if ($e) {
                        $e->send(E_WARNING, 'Strategy_MakeWellFormed: Unnecessary end tag to text');
                    }
                    $token = new HTMLPurifier_Token_Text($generator->generateFromToken($token));
                } else {
                    if ($e) {
                        $e->send(E_WARNING, 'Strategy_MakeWellFormed: Unnecessary end tag removed');
                    }
                    $token = $this->remove();
                }
                $reprocess = true;
                continue;
            }

            // first, check for the simplest case: everything closes neatly.
            // Eventually, everything passes through here; if there are problems
            // we modify the input stream accordingly and then punt, so that
            // the tokens get processed again.
            $current_parent = array_pop($this->stack);
            if ($current_parent->name == $token->name) {
                $token->start = $current_parent;
                foreach ($this->injectors as $i => $injector) {
                    if (isset($token->skip[$i])) {
                        // See Note [Injector skips]
                        continue;
                    }
                    if ($token->rewind !== null && $token->rewind !== $i) {
                        continue;
                    }
                    $r = $token;
                    $injector->handleEnd($r);
                    $token = $this->processToken($r, $i);
                    $this->stack[] = $current_parent;
                    $reprocess = true;
                    break;
                }
                continue;
            }

            // okay, so we're trying to close the wrong tag

            // undo the pop previous pop
            $this->stack[] = $current_parent;

            // scroll back the entire nest, trying to find our tag.
            // (feature could be to specify how far you'd like to go)
            $size = count($this->stack);
            // -2 because -1 is the last element, but we already checked that
            $skipped_tags = false;
            for ($j = $size - 2; $j >= 0; $j--) {
                if ($this->stack[$j]->name == $token->name) {
                    $skipped_tags = array_slice($this->stack, $j);
                    break;
                }
            }

            // we didn't find the tag, so remove
            if ($skipped_tags === false) {
                if ($escape_invalid_tags) {
                    if ($e) {
                        $e->send(E_WARNING, 'Strategy_MakeWellFormed: Stray end tag to text');
                    }
                    $token = new HTMLPurifier_Token_Text($generator->generateFromToken($token));
                } else {
                    if ($e) {
                        $e->send(E_WARNING, 'Strategy_MakeWellFormed: Stray end tag removed');
                    }
                    $token = $this->remove();
                }
                $reprocess = true;
                continue;
            }

            // do errors, in REVERSE $j order: a,b,c with </a></b></c>
            $c = count($skipped_tags);
            if ($e) {
                for ($j = $c - 1; $j > 0; $j--) {
                    // notice we exclude $j == 0, i.e. the current ending tag, from
                    // the errors... [TagClosedSuppress]
                    if (!isset($skipped_tags[$j]->armor['MakeWellFormed_TagClosedError'])) {
                        $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag closed by element end', $skipped_tags[$j]);
                    }
                }
            }

            // insert tags, in FORWARD $j order: c,b,a with </a></b></c>
            $replace = array($token);
            for ($j = 1; $j < $c; $j++) {
                // ...as well as from the insertions
                $new_token = new HTMLPurifier_Token_End($skipped_tags[$j]->name);
                $new_token->start = $skipped_tags[$j];
                array_unshift($replace, $new_token);
                if (isset($definition->info[$new_token->name]) && $definition->info[$new_token->name]->formatting) {
                    // [TagClosedAuto]
                    $element = clone $skipped_tags[$j];
                    $element->carryover = true;
                    $element->armor['MakeWellFormed_TagClosedError'] = true;
                    $replace[] = $element;
                }
            }
            $token = $this->processToken($replace);
            $reprocess = true;
            continue;
        }

        $context->destroy('CurrentToken');
        $context->destroy('CurrentNesting');
        $context->destroy('InputZipper');

        unset($this->injectors, $this->stack, $this->tokens);
        return $zipper->toArray($token);
    }

    /**
     * Processes arbitrary token values for complicated substitution patterns.
     * In general:
     *
     * If $token is an array, it is a list of tokens to substitute for the
     * current token. These tokens then get individually processed. If there
     * is a leading integer in the list, that integer determines how many
     * tokens from the stream should be removed.
     *
     * If $token is a regular token, it is swapped with the current token.
     *
     * If $token is false, the current token is deleted.
     *
     * If $token is an integer, that number of tokens (with the first token
     * being the current one) will be deleted.
     *
     * @param HTMLPurifier_Token|array|int|bool $token Token substitution value
     * @param HTMLPurifier_Injector|int $injector Injector that performed the substitution; default is if
     *        this is not an injector related operation.
     * @throws HTMLPurifier_Exception
     */
    protected function processToken($token, $injector = -1)
    {
        // Zend OpCache miscompiles $token = array($token), so
        // avoid this pattern.  See: https://github.com/ezyang/htmlpurifier/issues/108

        // normalize forms of token
        if (is_object($token)) {
            $tmp = $token;
            $token = array(1, $tmp);
        }
        if (is_int($token)) {
            $tmp = $token;
            $token = array($tmp);
        }
        if ($token === false) {
            $token = array(1);
        }
        if (!is_array($token)) {
            throw new HTMLPurifier_Exception('Invalid token type from injector');
        }
        if (!is_int($token[0])) {
            array_unshift($token, 1);
        }
        if ($token[0] === 0) {
            throw new HTMLPurifier_Exception('Deleting zero tokens is not valid');
        }

        // $token is now an array with the following form:
        // array(number nodes to delete, new node 1, new node 2, ...)

        $delete = array_shift($token);
        list($old, $r) = $this->zipper->splice($this->token, $delete, $token);

        if ($injector > -1) {
            // See Note [Injector skips]
            // Determine appropriate skips.  Here's what the code does:
            //  *If* we deleted one or more tokens, copy the skips
            //  of those tokens into the skips of the new tokens (in $token).
            //  Also, mark the newly inserted tokens as having come from
            //  $injector.
            $oldskip = isset($old[0]) ? $old[0]->skip : array();
            foreach ($token as $object) {
                $object->skip = $oldskip;
                $object->skip[$injector] = true;
            }
        }

        return $r;

    }

    /**
     * Inserts a token before the current token. Cursor now points to
     * this token.  You must reprocess after this.
     * @param HTMLPurifier_Token $token
     */
    private function insertBefore($token)
    {
        // NB not $this->zipper->insertBefore(), due to positioning
        // differences
        $splice = $this->zipper->splice($this->token, 0, array($token));

        return $splice[1];
    }

    /**
     * Removes current token. Cursor now points to new token occupying previously
     * occupied space.  You must reprocess after this.
     */
    private function remove()
    {
        return $this->zipper->delete();
    }
}

// Note [Injector skips]
// ~~~~~~~~~~~~~~~~~~~~~
// When I originally designed this class, the idea behind the 'skip'
// property of HTMLPurifier_Token was to help avoid infinite loops
// in injector processing.  For example, suppose you wrote an injector
// that bolded swear words.  Naively, you might write it so that
// whenever you saw ****, you replaced it with <strong>****</strong>.
//
// When this happens, we will reprocess all of the tokens with the
// other injectors.  Now there is an opportunity for infinite loop:
// if we rerun the swear-word injector on these tokens, we might
// see **** and then reprocess again to get
// <strong><strong>****</strong></strong> ad infinitum.
//
// Thus, the idea of a skip is that once we process a token with
// an injector, we mark all of those tokens as having "come from"
// the injector, and we never run the injector again on these
// tokens.
//
// There were two more complications, however:
//
//  - With HTMLPurifier_Injector_RemoveEmpty, we noticed that if
//    you had <b><i></i></b>, after you removed the <i></i>, you
//    really would like this injector to go back and reprocess
//    the <b> tag, discovering that it is now empty and can be
//    removed.  So we reintroduced the possibility of infinite looping
//    by adding a "rewind" function, which let you go back to an
//    earlier point in the token stream and reprocess it with injectors.
//    Needless to say, we need to UN-skip the token so it gets
//    reprocessed.
//
//  - Suppose that you successfuly process a token, replace it with
//    one with your skip mark, but now another injector wants to
//    process the skipped token with another token.  Should you continue
//    to skip that new token, or reprocess it?  If you reprocess,
//    you can end up with an infinite loop where one injector converts
//    <a> to <b>, and then another injector converts it back.  So
//    we inherit the skips, but for some reason, I thought that we
//    should inherit the skip from the first token of the token
//    that we deleted.  Why?  Well, it seems to work OK.
//
// If I were to redesign this functionality, I would absolutely not
// go about doing it this way: the semantics are just not very well
// defined, and in any case you probably wanted to operate on trees,
// not token streams.

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Strategy/FixNesting.php000064400000016605151214231100017563 0ustar00<?php

/**
 * Takes a well formed list of tokens and fixes their nesting.
 *
 * HTML elements dictate which elements are allowed to be their children,
 * for example, you can't have a p tag in a span tag.  Other elements have
 * much more rigorous definitions: tables, for instance, require a specific
 * order for their elements.  There are also constraints not expressible by
 * document type definitions, such as the chameleon nature of ins/del
 * tags and global child exclusions.
 *
 * The first major objective of this strategy is to iterate through all
 * the nodes and determine whether or not their children conform to the
 * element's definition.  If they do not, the child definition may
 * optionally supply an amended list of elements that is valid or
 * require that the entire node be deleted (and the previous node
 * rescanned).
 *
 * The second objective is to ensure that explicitly excluded elements of
 * an element do not appear in its children.  Code that accomplishes this
 * task is pervasive through the strategy, though the two are distinct tasks
 * and could, theoretically, be seperated (although it's not recommended).
 *
 * @note Whether or not unrecognized children are silently dropped or
 *       translated into text depends on the child definitions.
 *
 * @todo Enable nodes to be bubbled out of the structure.  This is
 *       easier with our new algorithm.
 */

class HTMLPurifier_Strategy_FixNesting extends HTMLPurifier_Strategy
{

    /**
     * @param HTMLPurifier_Token[] $tokens
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return array|HTMLPurifier_Token[]
     */
    public function execute($tokens, $config, $context)
    {

        //####################################################################//
        // Pre-processing

        // O(n) pass to convert to a tree, so that we can efficiently
        // refer to substrings
        $top_node = HTMLPurifier_Arborize::arborize($tokens, $config, $context);

        // get a copy of the HTML definition
        $definition = $config->getHTMLDefinition();

        $excludes_enabled = !$config->get('Core.DisableExcludes');

        // setup the context variable 'IsInline', for chameleon processing
        // is 'false' when we are not inline, 'true' when it must always
        // be inline, and an integer when it is inline for a certain
        // branch of the document tree
        $is_inline = $definition->info_parent_def->descendants_are_inline;
        $context->register('IsInline', $is_inline);

        // setup error collector
        $e =& $context->get('ErrorCollector', true);

        //####################################################################//
        // Loop initialization

        // stack that contains all elements that are excluded
        // it is organized by parent elements, similar to $stack,
        // but it is only populated when an element with exclusions is
        // processed, i.e. there won't be empty exclusions.
        $exclude_stack = array($definition->info_parent_def->excludes);

        // variable that contains the start token while we are processing
        // nodes. This enables error reporting to do its job
        $node = $top_node;
        // dummy token
        list($token, $d) = $node->toTokenPair();
        $context->register('CurrentNode', $node);
        $context->register('CurrentToken', $token);

        //####################################################################//
        // Loop

        // We need to implement a post-order traversal iteratively, to
        // avoid running into stack space limits.  This is pretty tricky
        // to reason about, so we just manually stack-ify the recursive
        // variant:
        //
        //  function f($node) {
        //      foreach ($node->children as $child) {
        //          f($child);
        //      }
        //      validate($node);
        //  }
        //
        // Thus, we will represent a stack frame as array($node,
        // $is_inline, stack of children)
        // e.g. array_reverse($node->children) - already processed
        // children.

        $parent_def = $definition->info_parent_def;
        $stack = array(
            array($top_node,
                  $parent_def->descendants_are_inline,
                  $parent_def->excludes, // exclusions
                  0)
            );

        while (!empty($stack)) {
            list($node, $is_inline, $excludes, $ix) = array_pop($stack);
            // recursive call
            $go = false;
            $def = empty($stack) ? $definition->info_parent_def : $definition->info[$node->name];
            while (isset($node->children[$ix])) {
                $child = $node->children[$ix++];
                if ($child instanceof HTMLPurifier_Node_Element) {
                    $go = true;
                    $stack[] = array($node, $is_inline, $excludes, $ix);
                    $stack[] = array($child,
                        // ToDo: I don't think it matters if it's def or
                        // child_def, but double check this...
                        $is_inline || $def->descendants_are_inline,
                        empty($def->excludes) ? $excludes
                                              : array_merge($excludes, $def->excludes),
                        0);
                    break;
                }
            };
            if ($go) continue;
            list($token, $d) = $node->toTokenPair();
            // base case
            if ($excludes_enabled && isset($excludes[$node->name])) {
                $node->dead = true;
                if ($e) $e->send(E_ERROR, 'Strategy_FixNesting: Node excluded');
            } else {
                // XXX I suppose it would be slightly more efficient to
                // avoid the allocation here and have children
                // strategies handle it
                $children = array();
                foreach ($node->children as $child) {
                    if (!$child->dead) $children[] = $child;
                }
                $result = $def->child->validateChildren($children, $config, $context);
                if ($result === true) {
                    // nop
                    $node->children = $children;
                } elseif ($result === false) {
                    $node->dead = true;
                    if ($e) $e->send(E_ERROR, 'Strategy_FixNesting: Node removed');
                } else {
                    $node->children = $result;
                    if ($e) {
                        // XXX This will miss mutations of internal nodes. Perhaps defer to the child validators
                        if (empty($result) && !empty($children)) {
                            $e->send(E_ERROR, 'Strategy_FixNesting: Node contents removed');
                        } else if ($result != $children) {
                            $e->send(E_WARNING, 'Strategy_FixNesting: Node reorganized');
                        }
                    }
                }
            }
        }

        //####################################################################//
        // Post-processing

        // remove context variables
        $context->destroy('IsInline');
        $context->destroy('CurrentNode');
        $context->destroy('CurrentToken');

        //####################################################################//
        // Return

        return HTMLPurifier_Arborize::flatten($node, $config, $context);
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Strategy/ValidateAttributes.php000064400000002323151214231100021275 0ustar00<?php

/**
 * Validate all attributes in the tokens.
 */

class HTMLPurifier_Strategy_ValidateAttributes extends HTMLPurifier_Strategy
{

    /**
     * @param HTMLPurifier_Token[] $tokens
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return HTMLPurifier_Token[]
     */
    public function execute($tokens, $config, $context)
    {
        // setup validator
        $validator = new HTMLPurifier_AttrValidator();

        $token = false;
        $context->register('CurrentToken', $token);

        foreach ($tokens as $key => $token) {

            // only process tokens that have attributes,
            //   namely start and empty tags
            if (!$token instanceof HTMLPurifier_Token_Start && !$token instanceof HTMLPurifier_Token_Empty) {
                continue;
            }

            // skip tokens that are armored
            if (!empty($token->armor['ValidateAttributes'])) {
                continue;
            }

            // note that we have no facilities here for removing tokens
            $validator->validateToken($token, $config, $context);
        }
        $context->destroy('CurrentToken');
        return $tokens;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Strategy/Core.php000064400000001006151214231100016362 0ustar00<?php

/**
 * Core strategy composed of the big four strategies.
 */
class HTMLPurifier_Strategy_Core extends HTMLPurifier_Strategy_Composite
{
    public function __construct()
    {
        $this->strategies[] = new HTMLPurifier_Strategy_RemoveForeignElements();
        $this->strategies[] = new HTMLPurifier_Strategy_MakeWellFormed();
        $this->strategies[] = new HTMLPurifier_Strategy_FixNesting();
        $this->strategies[] = new HTMLPurifier_Strategy_ValidateAttributes();
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Filter.php000064400000003131151214231100015116 0ustar00<?php

/**
 * Represents a pre or post processing filter on HTML Purifier's output
 *
 * Sometimes, a little ad-hoc fixing of HTML has to be done before
 * it gets sent through HTML Purifier: you can use filters to acheive
 * this effect. For instance, YouTube videos can be preserved using
 * this manner. You could have used a decorator for this task, but
 * PHP's support for them is not terribly robust, so we're going
 * to just loop through the filters.
 *
 * Filters should be exited first in, last out. If there are three filters,
 * named 1, 2 and 3, the order of execution should go 1->preFilter,
 * 2->preFilter, 3->preFilter, purify, 3->postFilter, 2->postFilter,
 * 1->postFilter.
 *
 * @note Methods are not declared abstract as it is perfectly legitimate
 *       for an implementation not to want anything to happen on a step
 */

class HTMLPurifier_Filter
{

    /**
     * Name of the filter for identification purposes.
     * @type string
     */
    public $name;

    /**
     * Pre-processor function, handles HTML before HTML Purifier
     * @param string $html
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return string
     */
    public function preFilter($html, $config, $context)
    {
        return $html;
    }

    /**
     * Post-processor function, handles HTML after HTML Purifier
     * @param string $html
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return string
     */
    public function postFilter($html, $config, $context)
    {
        return $html;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ConfigSchema.php000064400000013417151214231100016227 0ustar00<?php

/**
 * Configuration definition, defines directives and their defaults.
 */
class HTMLPurifier_ConfigSchema
{
    /**
     * Defaults of the directives and namespaces.
     * @type array
     * @note This shares the exact same structure as HTMLPurifier_Config::$conf
     */
    public $defaults = array();

    /**
     * The default property list. Do not edit this property list.
     * @type array
     */
    public $defaultPlist;

    /**
     * Definition of the directives.
     * The structure of this is:
     *
     *  array(
     *      'Namespace' => array(
     *          'Directive' => new stdClass(),
     *      )
     *  )
     *
     * The stdClass may have the following properties:
     *
     *  - If isAlias isn't set:
     *      - type: Integer type of directive, see HTMLPurifier_VarParser for definitions
     *      - allow_null: If set, this directive allows null values
     *      - aliases: If set, an associative array of value aliases to real values
     *      - allowed: If set, a lookup array of allowed (string) values
     *  - If isAlias is set:
     *      - namespace: Namespace this directive aliases to
     *      - name: Directive name this directive aliases to
     *
     * In certain degenerate cases, stdClass will actually be an integer. In
     * that case, the value is equivalent to an stdClass with the type
     * property set to the integer. If the integer is negative, type is
     * equal to the absolute value of integer, and allow_null is true.
     *
     * This class is friendly with HTMLPurifier_Config. If you need introspection
     * about the schema, you're better of using the ConfigSchema_Interchange,
     * which uses more memory but has much richer information.
     * @type array
     */
    public $info = array();

    /**
     * Application-wide singleton
     * @type HTMLPurifier_ConfigSchema
     */
    protected static $singleton;

    public function __construct()
    {
        $this->defaultPlist = new HTMLPurifier_PropertyList();
    }

    /**
     * Unserializes the default ConfigSchema.
     * @return HTMLPurifier_ConfigSchema
     */
    public static function makeFromSerial()
    {
        $contents = file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/ConfigSchema/schema.ser');
        $r = unserialize($contents);
        if (!$r) {
            $hash = sha1($contents);
            trigger_error("Unserialization of configuration schema failed, sha1 of file was $hash", E_USER_ERROR);
        }
        return $r;
    }

    /**
     * Retrieves an instance of the application-wide configuration definition.
     * @param HTMLPurifier_ConfigSchema $prototype
     * @return HTMLPurifier_ConfigSchema
     */
    public static function instance($prototype = null)
    {
        if ($prototype !== null) {
            HTMLPurifier_ConfigSchema::$singleton = $prototype;
        } elseif (HTMLPurifier_ConfigSchema::$singleton === null || $prototype === true) {
            HTMLPurifier_ConfigSchema::$singleton = HTMLPurifier_ConfigSchema::makeFromSerial();
        }
        return HTMLPurifier_ConfigSchema::$singleton;
    }

    /**
     * Defines a directive for configuration
     * @warning Will fail of directive's namespace is defined.
     * @warning This method's signature is slightly different from the legacy
     *          define() static method! Beware!
     * @param string $key Name of directive
     * @param mixed $default Default value of directive
     * @param string $type Allowed type of the directive. See
     *      HTMLPurifier_VarParser::$types for allowed values
     * @param bool $allow_null Whether or not to allow null values
     */
    public function add($key, $default, $type, $allow_null)
    {
        $obj = new stdClass();
        $obj->type = is_int($type) ? $type : HTMLPurifier_VarParser::$types[$type];
        if ($allow_null) {
            $obj->allow_null = true;
        }
        $this->info[$key] = $obj;
        $this->defaults[$key] = $default;
        $this->defaultPlist->set($key, $default);
    }

    /**
     * Defines a directive value alias.
     *
     * Directive value aliases are convenient for developers because it lets
     * them set a directive to several values and get the same result.
     * @param string $key Name of Directive
     * @param array $aliases Hash of aliased values to the real alias
     */
    public function addValueAliases($key, $aliases)
    {
        if (!isset($this->info[$key]->aliases)) {
            $this->info[$key]->aliases = array();
        }
        foreach ($aliases as $alias => $real) {
            $this->info[$key]->aliases[$alias] = $real;
        }
    }

    /**
     * Defines a set of allowed values for a directive.
     * @warning This is slightly different from the corresponding static
     *          method definition.
     * @param string $key Name of directive
     * @param array $allowed Lookup array of allowed values
     */
    public function addAllowedValues($key, $allowed)
    {
        $this->info[$key]->allowed = $allowed;
    }

    /**
     * Defines a directive alias for backwards compatibility
     * @param string $key Directive that will be aliased
     * @param string $new_key Directive that the alias will be to
     */
    public function addAlias($key, $new_key)
    {
        $obj = new stdClass;
        $obj->key = $new_key;
        $obj->isAlias = true;
        $this->info[$key] = $obj;
    }

    /**
     * Replaces any stdClass that only has the type property with type integer.
     */
    public function postProcess()
    {
        foreach ($this->info as $key => $v) {
            if (count((array) $v) == 1) {
                $this->info[$key] = $v->type;
            } elseif (count((array) $v) == 2 && isset($v->allow_null)) {
                $this->info[$key] = -$v->type;
            }
        }
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Generator.php000064400000024013151214231100015621 0ustar00<?php

/**
 * Generates HTML from tokens.
 * @todo Refactor interface so that configuration/context is determined
 *       upon instantiation, no need for messy generateFromTokens() calls
 * @todo Make some of the more internal functions protected, and have
 *       unit tests work around that
 */
class HTMLPurifier_Generator
{

    /**
     * Whether or not generator should produce XML output.
     * @type bool
     */
    private $_xhtml = true;

    /**
     * :HACK: Whether or not generator should comment the insides of <script> tags.
     * @type bool
     */
    private $_scriptFix = false;

    /**
     * Cache of HTMLDefinition during HTML output to determine whether or
     * not attributes should be minimized.
     * @type HTMLPurifier_HTMLDefinition
     */
    private $_def;

    /**
     * Cache of %Output.SortAttr.
     * @type bool
     */
    private $_sortAttr;

    /**
     * Cache of %Output.FlashCompat.
     * @type bool
     */
    private $_flashCompat;

    /**
     * Cache of %Output.FixInnerHTML.
     * @type bool
     */
    private $_innerHTMLFix;

    /**
     * Stack for keeping track of object information when outputting IE
     * compatibility code.
     * @type array
     */
    private $_flashStack = array();

    /**
     * Configuration for the generator
     * @type HTMLPurifier_Config
     */
    protected $config;

    /**
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     */
    public function __construct($config, $context)
    {
        $this->config = $config;
        $this->_scriptFix = $config->get('Output.CommentScriptContents');
        $this->_innerHTMLFix = $config->get('Output.FixInnerHTML');
        $this->_sortAttr = $config->get('Output.SortAttr');
        $this->_flashCompat = $config->get('Output.FlashCompat');
        $this->_def = $config->getHTMLDefinition();
        $this->_xhtml = $this->_def->doctype->xml;
    }

    /**
     * Generates HTML from an array of tokens.
     * @param HTMLPurifier_Token[] $tokens Array of HTMLPurifier_Token
     * @return string Generated HTML
     */
    public function generateFromTokens($tokens)
    {
        if (!$tokens) {
            return '';
        }

        // Basic algorithm
        $html = '';
        for ($i = 0, $size = count($tokens); $i < $size; $i++) {
            if ($this->_scriptFix && $tokens[$i]->name === 'script'
                && $i + 2 < $size && $tokens[$i+2] instanceof HTMLPurifier_Token_End) {
                // script special case
                // the contents of the script block must be ONE token
                // for this to work.
                $html .= $this->generateFromToken($tokens[$i++]);
                $html .= $this->generateScriptFromToken($tokens[$i++]);
            }
            $html .= $this->generateFromToken($tokens[$i]);
        }

        // Tidy cleanup
        if (extension_loaded('tidy') && $this->config->get('Output.TidyFormat')) {
            $tidy = new Tidy;
            $tidy->parseString(
                $html,
                array(
                   'indent'=> true,
                   'output-xhtml' => $this->_xhtml,
                   'show-body-only' => true,
                   'indent-spaces' => 2,
                   'wrap' => 68,
                ),
                'utf8'
            );
            $tidy->cleanRepair();
            $html = (string) $tidy; // explicit cast necessary
        }

        // Normalize newlines to system defined value
        if ($this->config->get('Core.NormalizeNewlines')) {
            $nl = $this->config->get('Output.Newline');
            if ($nl === null) {
                $nl = PHP_EOL;
            }
            if ($nl !== "\n") {
                $html = str_replace("\n", $nl, $html);
            }
        }
        return $html;
    }

    /**
     * Generates HTML from a single token.
     * @param HTMLPurifier_Token $token HTMLPurifier_Token object.
     * @return string Generated HTML
     */
    public function generateFromToken($token)
    {
        if (!$token instanceof HTMLPurifier_Token) {
            trigger_error('Cannot generate HTML from non-HTMLPurifier_Token object', E_USER_WARNING);
            return '';

        } elseif ($token instanceof HTMLPurifier_Token_Start) {
            $attr = $this->generateAttributes($token->attr, $token->name);
            if ($this->_flashCompat) {
                if ($token->name == "object") {
                    $flash = new stdClass();
                    $flash->attr = $token->attr;
                    $flash->param = array();
                    $this->_flashStack[] = $flash;
                }
            }
            return '<' . $token->name . ($attr ? ' ' : '') . $attr . '>';

        } elseif ($token instanceof HTMLPurifier_Token_End) {
            $_extra = '';
            if ($this->_flashCompat) {
                if ($token->name == "object" && !empty($this->_flashStack)) {
                    // doesn't do anything for now
                }
            }
            return $_extra . '</' . $token->name . '>';

        } elseif ($token instanceof HTMLPurifier_Token_Empty) {
            if ($this->_flashCompat && $token->name == "param" && !empty($this->_flashStack)) {
                $this->_flashStack[count($this->_flashStack)-1]->param[$token->attr['name']] = $token->attr['value'];
            }
            $attr = $this->generateAttributes($token->attr, $token->name);
             return '<' . $token->name . ($attr ? ' ' : '') . $attr .
                ( $this->_xhtml ? ' /': '' ) // <br /> v. <br>
                . '>';

        } elseif ($token instanceof HTMLPurifier_Token_Text) {
            return $this->escape($token->data, ENT_NOQUOTES);

        } elseif ($token instanceof HTMLPurifier_Token_Comment) {
            return '<!--' . $token->data . '-->';
        } else {
            return '';

        }
    }

    /**
     * Special case processor for the contents of script tags
     * @param HTMLPurifier_Token $token HTMLPurifier_Token object.
     * @return string
     * @warning This runs into problems if there's already a literal
     *          --> somewhere inside the script contents.
     */
    public function generateScriptFromToken($token)
    {
        if (!$token instanceof HTMLPurifier_Token_Text) {
            return $this->generateFromToken($token);
        }
        // Thanks <http://lachy.id.au/log/2005/05/script-comments>
        $data = preg_replace('#//\s*$#', '', $token->data);
        return '<!--//--><![CDATA[//><!--' . "\n" . trim($data) . "\n" . '//--><!]]>';
    }

    /**
     * Generates attribute declarations from attribute array.
     * @note This does not include the leading or trailing space.
     * @param array $assoc_array_of_attributes Attribute array
     * @param string $element Name of element attributes are for, used to check
     *        attribute minimization.
     * @return string Generated HTML fragment for insertion.
     */
    public function generateAttributes($assoc_array_of_attributes, $element = '')
    {
        $html = '';
        if ($this->_sortAttr) {
            ksort($assoc_array_of_attributes);
        }
        foreach ($assoc_array_of_attributes as $key => $value) {
            if (!$this->_xhtml) {
                // Remove namespaced attributes
                if (strpos($key, ':') !== false) {
                    continue;
                }
                // Check if we should minimize the attribute: val="val" -> val
                if ($element && !empty($this->_def->info[$element]->attr[$key]->minimized)) {
                    $html .= $key . ' ';
                    continue;
                }
            }
            // Workaround for Internet Explorer innerHTML bug.
            // Essentially, Internet Explorer, when calculating
            // innerHTML, omits quotes if there are no instances of
            // angled brackets, quotes or spaces.  However, when parsing
            // HTML (for example, when you assign to innerHTML), it
            // treats backticks as quotes.  Thus,
            //      <img alt="``" />
            // becomes
            //      <img alt=`` />
            // becomes
            //      <img alt='' />
            // Fortunately, all we need to do is trigger an appropriate
            // quoting style, which we do by adding an extra space.
            // This also is consistent with the W3C spec, which states
            // that user agents may ignore leading or trailing
            // whitespace (in fact, most don't, at least for attributes
            // like alt, but an extra space at the end is barely
            // noticeable).  Still, we have a configuration knob for
            // this, since this transformation is not necesary if you
            // don't process user input with innerHTML or you don't plan
            // on supporting Internet Explorer.
            if ($this->_innerHTMLFix) {
                if (strpos($value, '`') !== false) {
                    // check if correct quoting style would not already be
                    // triggered
                    if (strcspn($value, '"\' <>') === strlen($value)) {
                        // protect!
                        $value .= ' ';
                    }
                }
            }
            $html .= $key.'="'.$this->escape($value).'" ';
        }
        return rtrim($html);
    }

    /**
     * Escapes raw text data.
     * @todo This really ought to be protected, but until we have a facility
     *       for properly generating HTML here w/o using tokens, it stays
     *       public.
     * @param string $string String data to escape for HTML.
     * @param int $quote Quoting style, like htmlspecialchars. ENT_NOQUOTES is
     *               permissible for non-attribute output.
     * @return string escaped data.
     */
    public function escape($string, $quote = null)
    {
        // Workaround for APC bug on Mac Leopard reported by sidepodcast
        // http://htmlpurifier.org/phorum/read.php?3,4823,4846
        if ($quote === null) {
            $quote = ENT_COMPAT;
        }
        return htmlspecialchars($string, $quote, 'UTF-8');
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/DefinitionCacheFactory.php000064400000006201151214231100020236 0ustar00<?php

/**
 * Responsible for creating definition caches.
 */
class HTMLPurifier_DefinitionCacheFactory
{
    /**
     * @type array
     */
    protected $caches = array('Serializer' => array());

    /**
     * @type array
     */
    protected $implementations = array();

    /**
     * @type HTMLPurifier_DefinitionCache_Decorator[]
     */
    protected $decorators = array();

    /**
     * Initialize default decorators
     */
    public function setup()
    {
        $this->addDecorator('Cleanup');
    }

    /**
     * Retrieves an instance of global definition cache factory.
     * @param HTMLPurifier_DefinitionCacheFactory $prototype
     * @return HTMLPurifier_DefinitionCacheFactory
     */
    public static function instance($prototype = null)
    {
        static $instance;
        if ($prototype !== null) {
            $instance = $prototype;
        } elseif ($instance === null || $prototype === true) {
            $instance = new HTMLPurifier_DefinitionCacheFactory();
            $instance->setup();
        }
        return $instance;
    }

    /**
     * Registers a new definition cache object
     * @param string $short Short name of cache object, for reference
     * @param string $long Full class name of cache object, for construction
     */
    public function register($short, $long)
    {
        $this->implementations[$short] = $long;
    }

    /**
     * Factory method that creates a cache object based on configuration
     * @param string $type Name of definitions handled by cache
     * @param HTMLPurifier_Config $config Config instance
     * @return mixed
     */
    public function create($type, $config)
    {
        $method = $config->get('Cache.DefinitionImpl');
        if ($method === null) {
            return new HTMLPurifier_DefinitionCache_Null($type);
        }
        if (!empty($this->caches[$method][$type])) {
            return $this->caches[$method][$type];
        }
        if (isset($this->implementations[$method]) &&
            class_exists($class = $this->implementations[$method], false)) {
            $cache = new $class($type);
        } else {
            if ($method != 'Serializer') {
                trigger_error("Unrecognized DefinitionCache $method, using Serializer instead", E_USER_WARNING);
            }
            $cache = new HTMLPurifier_DefinitionCache_Serializer($type);
        }
        foreach ($this->decorators as $decorator) {
            $new_cache = $decorator->decorate($cache);
            // prevent infinite recursion in PHP 4
            unset($cache);
            $cache = $new_cache;
        }
        $this->caches[$method][$type] = $cache;
        return $this->caches[$method][$type];
    }

    /**
     * Registers a decorator to add to all new cache objects
     * @param HTMLPurifier_DefinitionCache_Decorator|string $decorator An instance or the name of a decorator
     */
    public function addDecorator($decorator)
    {
        if (is_string($decorator)) {
            $class = "HTMLPurifier_DefinitionCache_Decorator_$decorator";
            $decorator = new $class;
        }
        $this->decorators[$decorator->name] = $decorator;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Bootstrap.php000064400000011005151214231100015645 0ustar00<?php

// constants are slow, so we use as few as possible
if (!defined('HTMLPURIFIER_PREFIX')) {
    define('HTMLPURIFIER_PREFIX', realpath(dirname(__FILE__) . '/..'));
}

// accomodations for versions earlier than 5.0.2
// borrowed from PHP_Compat, LGPL licensed, by Aidan Lister <aidan@php.net>
if (!defined('PHP_EOL')) {
    switch (strtoupper(substr(PHP_OS, 0, 3))) {
        case 'WIN':
            define('PHP_EOL', "\r\n");
            break;
        case 'DAR':
            define('PHP_EOL', "\r");
            break;
        default:
            define('PHP_EOL', "\n");
    }
}

/**
 * Bootstrap class that contains meta-functionality for HTML Purifier such as
 * the autoload function.
 *
 * @note
 *      This class may be used without any other files from HTML Purifier.
 */
class HTMLPurifier_Bootstrap
{

    /**
     * Autoload function for HTML Purifier
     * @param string $class Class to load
     * @return bool
     */
    public static function autoload($class)
    {
        $file = HTMLPurifier_Bootstrap::getPath($class);
        if (!$file) {
            return false;
        }
        // Technically speaking, it should be ok and more efficient to
        // just do 'require', but Antonio Parraga reports that with
        // Zend extensions such as Zend debugger and APC, this invariant
        // may be broken.  Since we have efficient alternatives, pay
        // the cost here and avoid the bug.
        require_once HTMLPURIFIER_PREFIX . '/' . $file;
        return true;
    }

    /**
     * Returns the path for a specific class.
     * @param string $class Class path to get
     * @return string
     */
    public static function getPath($class)
    {
        if (strncmp('HTMLPurifier', $class, 12) !== 0) {
            return false;
        }
        // Custom implementations
        if (strncmp('HTMLPurifier_Language_', $class, 22) === 0) {
            $code = str_replace('_', '-', substr($class, 22));
            $file = 'HTMLPurifier/Language/classes/' . $code . '.php';
        } else {
            $file = str_replace('_', '/', $class) . '.php';
        }
        if (!file_exists(HTMLPURIFIER_PREFIX . '/' . $file)) {
            return false;
        }
        return $file;
    }

    /**
     * "Pre-registers" our autoloader on the SPL stack.
     */
    public static function registerAutoload()
    {
        $autoload = array('HTMLPurifier_Bootstrap', 'autoload');
        if (($funcs = spl_autoload_functions()) === false) {
            spl_autoload_register($autoload);
        } elseif (function_exists('spl_autoload_unregister')) {
            if (version_compare(PHP_VERSION, '5.3.0', '>=')) {
                // prepend flag exists, no need for shenanigans
                spl_autoload_register($autoload, true, true);
            } else {
                $buggy  = version_compare(PHP_VERSION, '5.2.11', '<');
                $compat = version_compare(PHP_VERSION, '5.1.2', '<=') &&
                          version_compare(PHP_VERSION, '5.1.0', '>=');
                foreach ($funcs as $func) {
                    if ($buggy && is_array($func)) {
                        // :TRICKY: There are some compatibility issues and some
                        // places where we need to error out
                        $reflector = new ReflectionMethod($func[0], $func[1]);
                        if (!$reflector->isStatic()) {
                            throw new Exception(
                                'HTML Purifier autoloader registrar is not compatible
                                with non-static object methods due to PHP Bug #44144;
                                Please do not use HTMLPurifier.autoload.php (or any
                                file that includes this file); instead, place the code:
                                spl_autoload_register(array(\'HTMLPurifier_Bootstrap\', \'autoload\'))
                                after your own autoloaders.'
                            );
                        }
                        // Suprisingly, spl_autoload_register supports the
                        // Class::staticMethod callback format, although call_user_func doesn't
                        if ($compat) {
                            $func = implode('::', $func);
                        }
                    }
                    spl_autoload_unregister($func);
                }
                spl_autoload_register($autoload);
                foreach ($funcs as $func) {
                    spl_autoload_register($func);
                }
            }
        }
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ContentSets.php000064400000013010151214231100016137 0ustar00<?php

/**
 * @todo Unit test
 */
class HTMLPurifier_ContentSets
{

    /**
     * List of content set strings (pipe separators) indexed by name.
     * @type array
     */
    public $info = array();

    /**
     * List of content set lookups (element => true) indexed by name.
     * @type array
     * @note This is in HTMLPurifier_HTMLDefinition->info_content_sets
     */
    public $lookup = array();

    /**
     * Synchronized list of defined content sets (keys of info).
     * @type array
     */
    protected $keys = array();
    /**
     * Synchronized list of defined content values (values of info).
     * @type array
     */
    protected $values = array();

    /**
     * Merges in module's content sets, expands identifiers in the content
     * sets and populates the keys, values and lookup member variables.
     * @param HTMLPurifier_HTMLModule[] $modules List of HTMLPurifier_HTMLModule
     */
    public function __construct($modules)
    {
        if (!is_array($modules)) {
            $modules = array($modules);
        }
        // populate content_sets based on module hints
        // sorry, no way of overloading
        foreach ($modules as $module) {
            foreach ($module->content_sets as $key => $value) {
                $temp = $this->convertToLookup($value);
                if (isset($this->lookup[$key])) {
                    // add it into the existing content set
                    $this->lookup[$key] = array_merge($this->lookup[$key], $temp);
                } else {
                    $this->lookup[$key] = $temp;
                }
            }
        }
        $old_lookup = false;
        while ($old_lookup !== $this->lookup) {
            $old_lookup = $this->lookup;
            foreach ($this->lookup as $i => $set) {
                $add = array();
                foreach ($set as $element => $x) {
                    if (isset($this->lookup[$element])) {
                        $add += $this->lookup[$element];
                        unset($this->lookup[$i][$element]);
                    }
                }
                $this->lookup[$i] += $add;
            }
        }

        foreach ($this->lookup as $key => $lookup) {
            $this->info[$key] = implode(' | ', array_keys($lookup));
        }
        $this->keys   = array_keys($this->info);
        $this->values = array_values($this->info);
    }

    /**
     * Accepts a definition; generates and assigns a ChildDef for it
     * @param HTMLPurifier_ElementDef $def HTMLPurifier_ElementDef reference
     * @param HTMLPurifier_HTMLModule $module Module that defined the ElementDef
     */
    public function generateChildDef(&$def, $module)
    {
        if (!empty($def->child)) { // already done!
            return;
        }
        $content_model = $def->content_model;
        if (is_string($content_model)) {
            // Assume that $this->keys is alphanumeric
            $def->content_model = preg_replace_callback(
                '/\b(' . implode('|', $this->keys) . ')\b/',
                array($this, 'generateChildDefCallback'),
                $content_model
            );
            //$def->content_model = str_replace(
            //    $this->keys, $this->values, $content_model);
        }
        $def->child = $this->getChildDef($def, $module);
    }

    public function generateChildDefCallback($matches)
    {
        return $this->info[$matches[0]];
    }

    /**
     * Instantiates a ChildDef based on content_model and content_model_type
     * member variables in HTMLPurifier_ElementDef
     * @note This will also defer to modules for custom HTMLPurifier_ChildDef
     *       subclasses that need content set expansion
     * @param HTMLPurifier_ElementDef $def HTMLPurifier_ElementDef to have ChildDef extracted
     * @param HTMLPurifier_HTMLModule $module Module that defined the ElementDef
     * @return HTMLPurifier_ChildDef corresponding to ElementDef
     */
    public function getChildDef($def, $module)
    {
        $value = $def->content_model;
        if (is_object($value)) {
            trigger_error(
                'Literal object child definitions should be stored in '.
                'ElementDef->child not ElementDef->content_model',
                E_USER_NOTICE
            );
            return $value;
        }
        switch ($def->content_model_type) {
            case 'required':
                return new HTMLPurifier_ChildDef_Required($value);
            case 'optional':
                return new HTMLPurifier_ChildDef_Optional($value);
            case 'empty':
                return new HTMLPurifier_ChildDef_Empty();
            case 'custom':
                return new HTMLPurifier_ChildDef_Custom($value);
        }
        // defer to its module
        $return = false;
        if ($module->defines_child_def) { // save a func call
            $return = $module->getChildDef($def);
        }
        if ($return !== false) {
            return $return;
        }
        // error-out
        trigger_error(
            'Could not determine which ChildDef class to instantiate',
            E_USER_ERROR
        );
        return false;
    }

    /**
     * Converts a string list of elements separated by pipes into
     * a lookup array.
     * @param string $string List of elements
     * @return array Lookup array of elements
     */
    protected function convertToLookup($string)
    {
        $array = explode('|', str_replace(' ', '', $string));
        $ret = array();
        foreach ($array as $k) {
            $ret[$k] = true;
        }
        return $ret;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Arborize.php000064400000004766151214231100015465 0ustar00<?php

/**
 * Converts a stream of HTMLPurifier_Token into an HTMLPurifier_Node,
 * and back again.
 *
 * @note This transformation is not an equivalence.  We mutate the input
 * token stream to make it so; see all [MUT] markers in code.
 */
class HTMLPurifier_Arborize
{
    public static function arborize($tokens, $config, $context) {
        $definition = $config->getHTMLDefinition();
        $parent = new HTMLPurifier_Token_Start($definition->info_parent);
        $stack = array($parent->toNode());
        foreach ($tokens as $token) {
            $token->skip = null; // [MUT]
            $token->carryover = null; // [MUT]
            if ($token instanceof HTMLPurifier_Token_End) {
                $token->start = null; // [MUT]
                $r = array_pop($stack);
                //assert($r->name === $token->name);
                //assert(empty($token->attr));
                $r->endCol = $token->col;
                $r->endLine = $token->line;
                $r->endArmor = $token->armor;
                continue;
            }
            $node = $token->toNode();
            $stack[count($stack)-1]->children[] = $node;
            if ($token instanceof HTMLPurifier_Token_Start) {
                $stack[] = $node;
            }
        }
        //assert(count($stack) == 1);
        return $stack[0];
    }

    public static function flatten($node, $config, $context) {
        $level = 0;
        $nodes = array($level => new HTMLPurifier_Queue(array($node)));
        $closingTokens = array();
        $tokens = array();
        do {
            while (!$nodes[$level]->isEmpty()) {
                $node = $nodes[$level]->shift(); // FIFO
                list($start, $end) = $node->toTokenPair();
                if ($level > 0) {
                    $tokens[] = $start;
                }
                if ($end !== NULL) {
                    $closingTokens[$level][] = $end;
                }
                if ($node instanceof HTMLPurifier_Node_Element) {
                    $level++;
                    $nodes[$level] = new HTMLPurifier_Queue();
                    foreach ($node->children as $childNode) {
                        $nodes[$level]->push($childNode);
                    }
                }
            }
            $level--;
            if ($level && isset($closingTokens[$level])) {
                while ($token = array_pop($closingTokens[$level])) {
                    $tokens[] = $token;
                }
            }
        } while ($level > 0);
        return $tokens;
    }
}
htmlpurifier/library/HTMLPurifier/Config.php000064400000075647151214231100015123 0ustar00<?php

/**
 * Configuration object that triggers customizable behavior.
 *
 * @warning This class is strongly defined: that means that the class
 *          will fail if an undefined directive is retrieved or set.
 *
 * @note Many classes that could (although many times don't) use the
 *       configuration object make it a mandatory parameter.  This is
 *       because a configuration object should always be forwarded,
 *       otherwise, you run the risk of missing a parameter and then
 *       being stumped when a configuration directive doesn't work.
 *
 * @todo Reconsider some of the public member variables
 */
class HTMLPurifier_Config
{

    /**
     * HTML Purifier's version
     * @type string
     */
    public $version = '4.13.0';

    /**
     * Whether or not to automatically finalize
     * the object if a read operation is done.
     * @type bool
     */
    public $autoFinalize = true;

    // protected member variables

    /**
     * Namespace indexed array of serials for specific namespaces.
     * @see getSerial() for more info.
     * @type string[]
     */
    protected $serials = array();

    /**
     * Serial for entire configuration object.
     * @type string
     */
    protected $serial;

    /**
     * Parser for variables.
     * @type HTMLPurifier_VarParser_Flexible
     */
    protected $parser = null;

    /**
     * Reference HTMLPurifier_ConfigSchema for value checking.
     * @type HTMLPurifier_ConfigSchema
     * @note This is public for introspective purposes. Please don't
     *       abuse!
     */
    public $def;

    /**
     * Indexed array of definitions.
     * @type HTMLPurifier_Definition[]
     */
    protected $definitions;

    /**
     * Whether or not config is finalized.
     * @type bool
     */
    protected $finalized = false;

    /**
     * Property list containing configuration directives.
     * @type array
     */
    protected $plist;

    /**
     * Whether or not a set is taking place due to an alias lookup.
     * @type bool
     */
    private $aliasMode;

    /**
     * Set to false if you do not want line and file numbers in errors.
     * (useful when unit testing).  This will also compress some errors
     * and exceptions.
     * @type bool
     */
    public $chatty = true;

    /**
     * Current lock; only gets to this namespace are allowed.
     * @type string
     */
    private $lock;

    /**
     * Constructor
     * @param HTMLPurifier_ConfigSchema $definition ConfigSchema that defines
     * what directives are allowed.
     * @param HTMLPurifier_PropertyList $parent
     */
    public function __construct($definition, $parent = null)
    {
        $parent = $parent ? $parent : $definition->defaultPlist;
        $this->plist = new HTMLPurifier_PropertyList($parent);
        $this->def = $definition; // keep a copy around for checking
        $this->parser = new HTMLPurifier_VarParser_Flexible();
    }

    /**
     * Convenience constructor that creates a config object based on a mixed var
     * @param mixed $config Variable that defines the state of the config
     *                      object. Can be: a HTMLPurifier_Config() object,
     *                      an array of directives based on loadArray(),
     *                      or a string filename of an ini file.
     * @param HTMLPurifier_ConfigSchema $schema Schema object
     * @return HTMLPurifier_Config Configured object
     */
    public static function create($config, $schema = null)
    {
        if ($config instanceof HTMLPurifier_Config) {
            // pass-through
            return $config;
        }
        if (!$schema) {
            $ret = HTMLPurifier_Config::createDefault();
        } else {
            $ret = new HTMLPurifier_Config($schema);
        }
        if (is_string($config)) {
            $ret->loadIni($config);
        } elseif (is_array($config)) $ret->loadArray($config);
        return $ret;
    }

    /**
     * Creates a new config object that inherits from a previous one.
     * @param HTMLPurifier_Config $config Configuration object to inherit from.
     * @return HTMLPurifier_Config object with $config as its parent.
     */
    public static function inherit(HTMLPurifier_Config $config)
    {
        return new HTMLPurifier_Config($config->def, $config->plist);
    }

    /**
     * Convenience constructor that creates a default configuration object.
     * @return HTMLPurifier_Config default object.
     */
    public static function createDefault()
    {
        $definition = HTMLPurifier_ConfigSchema::instance();
        $config = new HTMLPurifier_Config($definition);
        return $config;
    }

    /**
     * Retrieves a value from the configuration.
     *
     * @param string $key String key
     * @param mixed $a
     *
     * @return mixed
     */
    public function get($key, $a = null)
    {
        if ($a !== null) {
            $this->triggerError(
                "Using deprecated API: use \$config->get('$key.$a') instead",
                E_USER_WARNING
            );
            $key = "$key.$a";
        }
        if (!$this->finalized) {
            $this->autoFinalize();
        }
        if (!isset($this->def->info[$key])) {
            // can't add % due to SimpleTest bug
            $this->triggerError(
                'Cannot retrieve value of undefined directive ' . htmlspecialchars($key),
                E_USER_WARNING
            );
            return;
        }
        if (isset($this->def->info[$key]->isAlias)) {
            $d = $this->def->info[$key];
            $this->triggerError(
                'Cannot get value from aliased directive, use real name ' . $d->key,
                E_USER_ERROR
            );
            return;
        }
        if ($this->lock) {
            list($ns) = explode('.', $key);
            if ($ns !== $this->lock) {
                $this->triggerError(
                    'Cannot get value of namespace ' . $ns . ' when lock for ' .
                    $this->lock .
                    ' is active, this probably indicates a Definition setup method ' .
                    'is accessing directives that are not within its namespace',
                    E_USER_ERROR
                );
                return;
            }
        }
        return $this->plist->get($key);
    }

    /**
     * Retrieves an array of directives to values from a given namespace
     *
     * @param string $namespace String namespace
     *
     * @return array
     */
    public function getBatch($namespace)
    {
        if (!$this->finalized) {
            $this->autoFinalize();
        }
        $full = $this->getAll();
        if (!isset($full[$namespace])) {
            $this->triggerError(
                'Cannot retrieve undefined namespace ' .
                htmlspecialchars($namespace),
                E_USER_WARNING
            );
            return;
        }
        return $full[$namespace];
    }

    /**
     * Returns a SHA-1 signature of a segment of the configuration object
     * that uniquely identifies that particular configuration
     *
     * @param string $namespace Namespace to get serial for
     *
     * @return string
     * @note Revision is handled specially and is removed from the batch
     *       before processing!
     */
    public function getBatchSerial($namespace)
    {
        if (empty($this->serials[$namespace])) {
            $batch = $this->getBatch($namespace);
            unset($batch['DefinitionRev']);
            $this->serials[$namespace] = sha1(serialize($batch));
        }
        return $this->serials[$namespace];
    }

    /**
     * Returns a SHA-1 signature for the entire configuration object
     * that uniquely identifies that particular configuration
     *
     * @return string
     */
    public function getSerial()
    {
        if (empty($this->serial)) {
            $this->serial = sha1(serialize($this->getAll()));
        }
        return $this->serial;
    }

    /**
     * Retrieves all directives, organized by namespace
     *
     * @warning This is a pretty inefficient function, avoid if you can
     */
    public function getAll()
    {
        if (!$this->finalized) {
            $this->autoFinalize();
        }
        $ret = array();
        foreach ($this->plist->squash() as $name => $value) {
            list($ns, $key) = explode('.', $name, 2);
            $ret[$ns][$key] = $value;
        }
        return $ret;
    }

    /**
     * Sets a value to configuration.
     *
     * @param string $key key
     * @param mixed $value value
     * @param mixed $a
     */
    public function set($key, $value, $a = null)
    {
        if (strpos($key, '.') === false) {
            $namespace = $key;
            $directive = $value;
            $value = $a;
            $key = "$key.$directive";
            $this->triggerError("Using deprecated API: use \$config->set('$key', ...) instead", E_USER_NOTICE);
        } else {
            list($namespace) = explode('.', $key);
        }
        if ($this->isFinalized('Cannot set directive after finalization')) {
            return;
        }
        if (!isset($this->def->info[$key])) {
            $this->triggerError(
                'Cannot set undefined directive ' . htmlspecialchars($key) . ' to value',
                E_USER_WARNING
            );
            return;
        }
        $def = $this->def->info[$key];

        if (isset($def->isAlias)) {
            if ($this->aliasMode) {
                $this->triggerError(
                    'Double-aliases not allowed, please fix '.
                    'ConfigSchema bug with' . $key,
                    E_USER_ERROR
                );
                return;
            }
            $this->aliasMode = true;
            $this->set($def->key, $value);
            $this->aliasMode = false;
            $this->triggerError("$key is an alias, preferred directive name is {$def->key}", E_USER_NOTICE);
            return;
        }

        // Raw type might be negative when using the fully optimized form
        // of stdClass, which indicates allow_null == true
        $rtype = is_int($def) ? $def : $def->type;
        if ($rtype < 0) {
            $type = -$rtype;
            $allow_null = true;
        } else {
            $type = $rtype;
            $allow_null = isset($def->allow_null);
        }

        try {
            $value = $this->parser->parse($value, $type, $allow_null);
        } catch (HTMLPurifier_VarParserException $e) {
            $this->triggerError(
                'Value for ' . $key . ' is of invalid type, should be ' .
                HTMLPurifier_VarParser::getTypeName($type),
                E_USER_WARNING
            );
            return;
        }
        if (is_string($value) && is_object($def)) {
            // resolve value alias if defined
            if (isset($def->aliases[$value])) {
                $value = $def->aliases[$value];
            }
            // check to see if the value is allowed
            if (isset($def->allowed) && !isset($def->allowed[$value])) {
                $this->triggerError(
                    'Value not supported, valid values are: ' .
                    $this->_listify($def->allowed),
                    E_USER_WARNING
                );
                return;
            }
        }
        $this->plist->set($key, $value);

        // reset definitions if the directives they depend on changed
        // this is a very costly process, so it's discouraged
        // with finalization
        if ($namespace == 'HTML' || $namespace == 'CSS' || $namespace == 'URI') {
            $this->definitions[$namespace] = null;
        }

        $this->serials[$namespace] = false;
    }

    /**
     * Convenience function for error reporting
     *
     * @param array $lookup
     *
     * @return string
     */
    private function _listify($lookup)
    {
        $list = array();
        foreach ($lookup as $name => $b) {
            $list[] = $name;
        }
        return implode(', ', $list);
    }

    /**
     * Retrieves object reference to the HTML definition.
     *
     * @param bool $raw Return a copy that has not been setup yet. Must be
     *             called before it's been setup, otherwise won't work.
     * @param bool $optimized If true, this method may return null, to
     *             indicate that a cached version of the modified
     *             definition object is available and no further edits
     *             are necessary.  Consider using
     *             maybeGetRawHTMLDefinition, which is more explicitly
     *             named, instead.
     *
     * @return HTMLPurifier_HTMLDefinition|null
     */
    public function getHTMLDefinition($raw = false, $optimized = false)
    {
        return $this->getDefinition('HTML', $raw, $optimized);
    }

    /**
     * Retrieves object reference to the CSS definition
     *
     * @param bool $raw Return a copy that has not been setup yet. Must be
     *             called before it's been setup, otherwise won't work.
     * @param bool $optimized If true, this method may return null, to
     *             indicate that a cached version of the modified
     *             definition object is available and no further edits
     *             are necessary.  Consider using
     *             maybeGetRawCSSDefinition, which is more explicitly
     *             named, instead.
     *
     * @return HTMLPurifier_CSSDefinition|null
     */
    public function getCSSDefinition($raw = false, $optimized = false)
    {
        return $this->getDefinition('CSS', $raw, $optimized);
    }

    /**
     * Retrieves object reference to the URI definition
     *
     * @param bool $raw Return a copy that has not been setup yet. Must be
     *             called before it's been setup, otherwise won't work.
     * @param bool $optimized If true, this method may return null, to
     *             indicate that a cached version of the modified
     *             definition object is available and no further edits
     *             are necessary.  Consider using
     *             maybeGetRawURIDefinition, which is more explicitly
     *             named, instead.
     *
     * @return HTMLPurifier_URIDefinition|null
     */
    public function getURIDefinition($raw = false, $optimized = false)
    {
        return $this->getDefinition('URI', $raw, $optimized);
    }

    /**
     * Retrieves a definition
     *
     * @param string $type Type of definition: HTML, CSS, etc
     * @param bool $raw Whether or not definition should be returned raw
     * @param bool $optimized Only has an effect when $raw is true.  Whether
     *        or not to return null if the result is already present in
     *        the cache.  This is off by default for backwards
     *        compatibility reasons, but you need to do things this
     *        way in order to ensure that caching is done properly.
     *        Check out enduser-customize.html for more details.
     *        We probably won't ever change this default, as much as the
     *        maybe semantics is the "right thing to do."
     *
     * @throws HTMLPurifier_Exception
     * @return HTMLPurifier_Definition|null
     */
    public function getDefinition($type, $raw = false, $optimized = false)
    {
        if ($optimized && !$raw) {
            throw new HTMLPurifier_Exception("Cannot set optimized = true when raw = false");
        }
        if (!$this->finalized) {
            $this->autoFinalize();
        }
        // temporarily suspend locks, so we can handle recursive definition calls
        $lock = $this->lock;
        $this->lock = null;
        $factory = HTMLPurifier_DefinitionCacheFactory::instance();
        $cache = $factory->create($type, $this);
        $this->lock = $lock;
        if (!$raw) {
            // full definition
            // ---------------
            // check if definition is in memory
            if (!empty($this->definitions[$type])) {
                $def = $this->definitions[$type];
                // check if the definition is setup
                if ($def->setup) {
                    return $def;
                } else {
                    $def->setup($this);
                    if ($def->optimized) {
                        $cache->add($def, $this);
                    }
                    return $def;
                }
            }
            // check if definition is in cache
            $def = $cache->get($this);
            if ($def) {
                // definition in cache, save to memory and return it
                $this->definitions[$type] = $def;
                return $def;
            }
            // initialize it
            $def = $this->initDefinition($type);
            // set it up
            $this->lock = $type;
            $def->setup($this);
            $this->lock = null;
            // save in cache
            $cache->add($def, $this);
            // return it
            return $def;
        } else {
            // raw definition
            // --------------
            // check preconditions
            $def = null;
            if ($optimized) {
                if (is_null($this->get($type . '.DefinitionID'))) {
                    // fatally error out if definition ID not set
                    throw new HTMLPurifier_Exception(
                        "Cannot retrieve raw version without specifying %$type.DefinitionID"
                    );
                }
            }
            if (!empty($this->definitions[$type])) {
                $def = $this->definitions[$type];
                if ($def->setup && !$optimized) {
                    $extra = $this->chatty ?
                        " (try moving this code block earlier in your initialization)" :
                        "";
                    throw new HTMLPurifier_Exception(
                        "Cannot retrieve raw definition after it has already been setup" .
                        $extra
                    );
                }
                if ($def->optimized === null) {
                    $extra = $this->chatty ? " (try flushing your cache)" : "";
                    throw new HTMLPurifier_Exception(
                        "Optimization status of definition is unknown" . $extra
                    );
                }
                if ($def->optimized !== $optimized) {
                    $msg = $optimized ? "optimized" : "unoptimized";
                    $extra = $this->chatty ?
                        " (this backtrace is for the first inconsistent call, which was for a $msg raw definition)"
                        : "";
                    throw new HTMLPurifier_Exception(
                        "Inconsistent use of optimized and unoptimized raw definition retrievals" . $extra
                    );
                }
            }
            // check if definition was in memory
            if ($def) {
                if ($def->setup) {
                    // invariant: $optimized === true (checked above)
                    return null;
                } else {
                    return $def;
                }
            }
            // if optimized, check if definition was in cache
            // (because we do the memory check first, this formulation
            // is prone to cache slamming, but I think
            // guaranteeing that either /all/ of the raw
            // setup code or /none/ of it is run is more important.)
            if ($optimized) {
                // This code path only gets run once; once we put
                // something in $definitions (which is guaranteed by the
                // trailing code), we always short-circuit above.
                $def = $cache->get($this);
                if ($def) {
                    // save the full definition for later, but don't
                    // return it yet
                    $this->definitions[$type] = $def;
                    return null;
                }
            }
            // check invariants for creation
            if (!$optimized) {
                if (!is_null($this->get($type . '.DefinitionID'))) {
                    if ($this->chatty) {
                        $this->triggerError(
                            'Due to a documentation error in previous version of HTML Purifier, your ' .
                            'definitions are not being cached.  If this is OK, you can remove the ' .
                            '%$type.DefinitionRev and %$type.DefinitionID declaration.  Otherwise, ' .
                            'modify your code to use maybeGetRawDefinition, and test if the returned ' .
                            'value is null before making any edits (if it is null, that means that a ' .
                            'cached version is available, and no raw operations are necessary).  See ' .
                            '<a href="http://htmlpurifier.org/docs/enduser-customize.html#optimized">' .
                            'Customize</a> for more details',
                            E_USER_WARNING
                        );
                    } else {
                        $this->triggerError(
                            "Useless DefinitionID declaration",
                            E_USER_WARNING
                        );
                    }
                }
            }
            // initialize it
            $def = $this->initDefinition($type);
            $def->optimized = $optimized;
            return $def;
        }
        throw new HTMLPurifier_Exception("The impossible happened!");
    }

    /**
     * Initialise definition
     *
     * @param string $type What type of definition to create
     *
     * @return HTMLPurifier_CSSDefinition|HTMLPurifier_HTMLDefinition|HTMLPurifier_URIDefinition
     * @throws HTMLPurifier_Exception
     */
    private function initDefinition($type)
    {
        // quick checks failed, let's create the object
        if ($type == 'HTML') {
            $def = new HTMLPurifier_HTMLDefinition();
        } elseif ($type == 'CSS') {
            $def = new HTMLPurifier_CSSDefinition();
        } elseif ($type == 'URI') {
            $def = new HTMLPurifier_URIDefinition();
        } else {
            throw new HTMLPurifier_Exception(
                "Definition of $type type not supported"
            );
        }
        $this->definitions[$type] = $def;
        return $def;
    }

    public function maybeGetRawDefinition($name)
    {
        return $this->getDefinition($name, true, true);
    }

    /**
     * @return HTMLPurifier_HTMLDefinition|null
     */
    public function maybeGetRawHTMLDefinition()
    {
        return $this->getDefinition('HTML', true, true);
    }
    
    /**
     * @return HTMLPurifier_CSSDefinition|null
     */
    public function maybeGetRawCSSDefinition()
    {
        return $this->getDefinition('CSS', true, true);
    }
    
    /**
     * @return HTMLPurifier_URIDefinition|null
     */
    public function maybeGetRawURIDefinition()
    {
        return $this->getDefinition('URI', true, true);
    }

    /**
     * Loads configuration values from an array with the following structure:
     * Namespace.Directive => Value
     *
     * @param array $config_array Configuration associative array
     */
    public function loadArray($config_array)
    {
        if ($this->isFinalized('Cannot load directives after finalization')) {
            return;
        }
        foreach ($config_array as $key => $value) {
            $key = str_replace('_', '.', $key);
            if (strpos($key, '.') !== false) {
                $this->set($key, $value);
            } else {
                $namespace = $key;
                $namespace_values = $value;
                foreach ($namespace_values as $directive => $value2) {
                    $this->set($namespace .'.'. $directive, $value2);
                }
            }
        }
    }

    /**
     * Returns a list of array(namespace, directive) for all directives
     * that are allowed in a web-form context as per an allowed
     * namespaces/directives list.
     *
     * @param array $allowed List of allowed namespaces/directives
     * @param HTMLPurifier_ConfigSchema $schema Schema to use, if not global copy
     *
     * @return array
     */
    public static function getAllowedDirectivesForForm($allowed, $schema = null)
    {
        if (!$schema) {
            $schema = HTMLPurifier_ConfigSchema::instance();
        }
        if ($allowed !== true) {
            if (is_string($allowed)) {
                $allowed = array($allowed);
            }
            $allowed_ns = array();
            $allowed_directives = array();
            $blacklisted_directives = array();
            foreach ($allowed as $ns_or_directive) {
                if (strpos($ns_or_directive, '.') !== false) {
                    // directive
                    if ($ns_or_directive[0] == '-') {
                        $blacklisted_directives[substr($ns_or_directive, 1)] = true;
                    } else {
                        $allowed_directives[$ns_or_directive] = true;
                    }
                } else {
                    // namespace
                    $allowed_ns[$ns_or_directive] = true;
                }
            }
        }
        $ret = array();
        foreach ($schema->info as $key => $def) {
            list($ns, $directive) = explode('.', $key, 2);
            if ($allowed !== true) {
                if (isset($blacklisted_directives["$ns.$directive"])) {
                    continue;
                }
                if (!isset($allowed_directives["$ns.$directive"]) && !isset($allowed_ns[$ns])) {
                    continue;
                }
            }
            if (isset($def->isAlias)) {
                continue;
            }
            if ($directive == 'DefinitionID' || $directive == 'DefinitionRev') {
                continue;
            }
            $ret[] = array($ns, $directive);
        }
        return $ret;
    }

    /**
     * Loads configuration values from $_GET/$_POST that were posted
     * via ConfigForm
     *
     * @param array $array $_GET or $_POST array to import
     * @param string|bool $index Index/name that the config variables are in
     * @param array|bool $allowed List of allowed namespaces/directives
     * @param bool $mq_fix Boolean whether or not to enable magic quotes fix
     * @param HTMLPurifier_ConfigSchema $schema Schema to use, if not global copy
     *
     * @return mixed
     */
    public static function loadArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true, $schema = null)
    {
        $ret = HTMLPurifier_Config::prepareArrayFromForm($array, $index, $allowed, $mq_fix, $schema);
        $config = HTMLPurifier_Config::create($ret, $schema);
        return $config;
    }

    /**
     * Merges in configuration values from $_GET/$_POST to object. NOT STATIC.
     *
     * @param array $array $_GET or $_POST array to import
     * @param string|bool $index Index/name that the config variables are in
     * @param array|bool $allowed List of allowed namespaces/directives
     * @param bool $mq_fix Boolean whether or not to enable magic quotes fix
     */
    public function mergeArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true)
    {
         $ret = HTMLPurifier_Config::prepareArrayFromForm($array, $index, $allowed, $mq_fix, $this->def);
         $this->loadArray($ret);
    }

    /**
     * Prepares an array from a form into something usable for the more
     * strict parts of HTMLPurifier_Config
     *
     * @param array $array $_GET or $_POST array to import
     * @param string|bool $index Index/name that the config variables are in
     * @param array|bool $allowed List of allowed namespaces/directives
     * @param bool $mq_fix Boolean whether or not to enable magic quotes fix
     * @param HTMLPurifier_ConfigSchema $schema Schema to use, if not global copy
     *
     * @return array
     */
    public static function prepareArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true, $schema = null)
    {
        if ($index !== false) {
            $array = (isset($array[$index]) && is_array($array[$index])) ? $array[$index] : array();
        }
        $mq = $mq_fix && function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc();

        $allowed = HTMLPurifier_Config::getAllowedDirectivesForForm($allowed, $schema);
        $ret = array();
        foreach ($allowed as $key) {
            list($ns, $directive) = $key;
            $skey = "$ns.$directive";
            if (!empty($array["Null_$skey"])) {
                $ret[$ns][$directive] = null;
                continue;
            }
            if (!isset($array[$skey])) {
                continue;
            }
            $value = $mq ? stripslashes($array[$skey]) : $array[$skey];
            $ret[$ns][$directive] = $value;
        }
        return $ret;
    }

    /**
     * Loads configuration values from an ini file
     *
     * @param string $filename Name of ini file
     */
    public function loadIni($filename)
    {
        if ($this->isFinalized('Cannot load directives after finalization')) {
            return;
        }
        $array = parse_ini_file($filename, true);
        $this->loadArray($array);
    }

    /**
     * Checks whether or not the configuration object is finalized.
     *
     * @param string|bool $error String error message, or false for no error
     *
     * @return bool
     */
    public function isFinalized($error = false)
    {
        if ($this->finalized && $error) {
            $this->triggerError($error, E_USER_ERROR);
        }
        return $this->finalized;
    }

    /**
     * Finalizes configuration only if auto finalize is on and not
     * already finalized
     */
    public function autoFinalize()
    {
        if ($this->autoFinalize) {
            $this->finalize();
        } else {
            $this->plist->squash(true);
        }
    }

    /**
     * Finalizes a configuration object, prohibiting further change
     */
    public function finalize()
    {
        $this->finalized = true;
        $this->parser = null;
    }

    /**
     * Produces a nicely formatted error message by supplying the
     * stack frame information OUTSIDE of HTMLPurifier_Config.
     *
     * @param string $msg An error message
     * @param int $no An error number
     */
    protected function triggerError($msg, $no)
    {
        // determine previous stack frame
        $extra = '';
        if ($this->chatty) {
            $trace = debug_backtrace();
            // zip(tail(trace), trace) -- but PHP is not Haskell har har
            for ($i = 0, $c = count($trace); $i < $c - 1; $i++) {
                // XXX this is not correct on some versions of HTML Purifier
                if (isset($trace[$i + 1]['class']) && $trace[$i + 1]['class'] === 'HTMLPurifier_Config') {
                    continue;
                }
                $frame = $trace[$i];
                $extra = " invoked on line {$frame['line']} in file {$frame['file']}";
                break;
            }
        }
        trigger_error($msg . $extra, $no);
    }

    /**
     * Returns a serialized form of the configuration object that can
     * be reconstituted.
     *
     * @return string
     */
    public function serialize()
    {
        $this->getDefinition('HTML');
        $this->getDefinition('CSS');
        $this->getDefinition('URI');
        return serialize($this);
    }

}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/EntityLookup/entities.ser000064400000012277151214231100020200 0ustar00a:253:{s:4:"fnof";s:2:"ƒ";s:5:"Alpha";s:2:"Α";s:4:"Beta";s:2:"Β";s:5:"Gamma";s:2:"Γ";s:5:"Delta";s:2:"Δ";s:7:"Epsilon";s:2:"Ε";s:4:"Zeta";s:2:"Ζ";s:3:"Eta";s:2:"Η";s:5:"Theta";s:2:"Θ";s:4:"Iota";s:2:"Ι";s:5:"Kappa";s:2:"Κ";s:6:"Lambda";s:2:"Λ";s:2:"Mu";s:2:"Μ";s:2:"Nu";s:2:"Ν";s:2:"Xi";s:2:"Ξ";s:7:"Omicron";s:2:"Ο";s:2:"Pi";s:2:"Π";s:3:"Rho";s:2:"Ρ";s:5:"Sigma";s:2:"Σ";s:3:"Tau";s:2:"Τ";s:7:"Upsilon";s:2:"Υ";s:3:"Phi";s:2:"Φ";s:3:"Chi";s:2:"Χ";s:3:"Psi";s:2:"Ψ";s:5:"Omega";s:2:"Ω";s:5:"alpha";s:2:"α";s:4:"beta";s:2:"β";s:5:"gamma";s:2:"γ";s:5:"delta";s:2:"δ";s:7:"epsilon";s:2:"ε";s:4:"zeta";s:2:"ζ";s:3:"eta";s:2:"η";s:5:"theta";s:2:"θ";s:4:"iota";s:2:"ι";s:5:"kappa";s:2:"κ";s:6:"lambda";s:2:"λ";s:2:"mu";s:2:"μ";s:2:"nu";s:2:"ν";s:2:"xi";s:2:"ξ";s:7:"omicron";s:2:"ο";s:2:"pi";s:2:"π";s:3:"rho";s:2:"ρ";s:6:"sigmaf";s:2:"ς";s:5:"sigma";s:2:"σ";s:3:"tau";s:2:"τ";s:7:"upsilon";s:2:"υ";s:3:"phi";s:2:"φ";s:3:"chi";s:2:"χ";s:3:"psi";s:2:"ψ";s:5:"omega";s:2:"ω";s:8:"thetasym";s:2:"ϑ";s:5:"upsih";s:2:"ϒ";s:3:"piv";s:2:"ϖ";s:4:"bull";s:3:"•";s:6:"hellip";s:3:"…";s:5:"prime";s:3:"′";s:5:"Prime";s:3:"″";s:5:"oline";s:3:"‾";s:5:"frasl";s:3:"⁄";s:6:"weierp";s:3:"℘";s:5:"image";s:3:"ℑ";s:4:"real";s:3:"ℜ";s:5:"trade";s:3:"™";s:7:"alefsym";s:3:"ℵ";s:4:"larr";s:3:"←";s:4:"uarr";s:3:"↑";s:4:"rarr";s:3:"→";s:4:"darr";s:3:"↓";s:4:"harr";s:3:"↔";s:5:"crarr";s:3:"↵";s:4:"lArr";s:3:"⇐";s:4:"uArr";s:3:"⇑";s:4:"rArr";s:3:"⇒";s:4:"dArr";s:3:"⇓";s:4:"hArr";s:3:"⇔";s:6:"forall";s:3:"∀";s:4:"part";s:3:"∂";s:5:"exist";s:3:"∃";s:5:"empty";s:3:"∅";s:5:"nabla";s:3:"∇";s:4:"isin";s:3:"∈";s:5:"notin";s:3:"∉";s:2:"ni";s:3:"∋";s:4:"prod";s:3:"∏";s:3:"sum";s:3:"∑";s:5:"minus";s:3:"−";s:6:"lowast";s:3:"∗";s:5:"radic";s:3:"√";s:4:"prop";s:3:"∝";s:5:"infin";s:3:"∞";s:3:"ang";s:3:"∠";s:3:"and";s:3:"∧";s:2:"or";s:3:"∨";s:3:"cap";s:3:"∩";s:3:"cup";s:3:"∪";s:3:"int";s:3:"∫";s:6:"there4";s:3:"∴";s:3:"sim";s:3:"∼";s:4:"cong";s:3:"≅";s:5:"asymp";s:3:"≈";s:2:"ne";s:3:"≠";s:5:"equiv";s:3:"≡";s:2:"le";s:3:"≤";s:2:"ge";s:3:"≥";s:3:"sub";s:3:"⊂";s:3:"sup";s:3:"⊃";s:4:"nsub";s:3:"⊄";s:4:"sube";s:3:"⊆";s:4:"supe";s:3:"⊇";s:5:"oplus";s:3:"⊕";s:6:"otimes";s:3:"⊗";s:4:"perp";s:3:"⊥";s:4:"sdot";s:3:"⋅";s:5:"lceil";s:3:"⌈";s:5:"rceil";s:3:"⌉";s:6:"lfloor";s:3:"⌊";s:6:"rfloor";s:3:"⌋";s:4:"lang";s:3:"〈";s:4:"rang";s:3:"〉";s:3:"loz";s:3:"◊";s:6:"spades";s:3:"♠";s:5:"clubs";s:3:"♣";s:6:"hearts";s:3:"♥";s:5:"diams";s:3:"♦";s:4:"quot";s:1:""";s:3:"amp";s:1:"&";s:2:"lt";s:1:"<";s:2:"gt";s:1:">";s:4:"apos";s:1:"'";s:5:"OElig";s:2:"Œ";s:5:"oelig";s:2:"œ";s:6:"Scaron";s:2:"Š";s:6:"scaron";s:2:"š";s:4:"Yuml";s:2:"Ÿ";s:4:"circ";s:2:"ˆ";s:5:"tilde";s:2:"˜";s:4:"ensp";s:3:" ";s:4:"emsp";s:3:" ";s:6:"thinsp";s:3:" ";s:4:"zwnj";s:3:"‌";s:3:"zwj";s:3:"‍";s:3:"lrm";s:3:"‎";s:3:"rlm";s:3:"‏";s:5:"ndash";s:3:"–";s:5:"mdash";s:3:"—";s:5:"lsquo";s:3:"‘";s:5:"rsquo";s:3:"’";s:5:"sbquo";s:3:"‚";s:5:"ldquo";s:3:"“";s:5:"rdquo";s:3:"”";s:5:"bdquo";s:3:"„";s:6:"dagger";s:3:"†";s:6:"Dagger";s:3:"‡";s:6:"permil";s:3:"‰";s:6:"lsaquo";s:3:"‹";s:6:"rsaquo";s:3:"›";s:4:"euro";s:3:"€";s:4:"nbsp";s:2:" ";s:5:"iexcl";s:2:"¡";s:4:"cent";s:2:"¢";s:5:"pound";s:2:"£";s:6:"curren";s:2:"¤";s:3:"yen";s:2:"¥";s:6:"brvbar";s:2:"¦";s:4:"sect";s:2:"§";s:3:"uml";s:2:"¨";s:4:"copy";s:2:"©";s:4:"ordf";s:2:"ª";s:5:"laquo";s:2:"«";s:3:"not";s:2:"¬";s:3:"shy";s:2:"­";s:3:"reg";s:2:"®";s:4:"macr";s:2:"¯";s:3:"deg";s:2:"°";s:6:"plusmn";s:2:"±";s:4:"sup2";s:2:"²";s:4:"sup3";s:2:"³";s:5:"acute";s:2:"´";s:5:"micro";s:2:"µ";s:4:"para";s:2:"¶";s:6:"middot";s:2:"·";s:5:"cedil";s:2:"¸";s:4:"sup1";s:2:"¹";s:4:"ordm";s:2:"º";s:5:"raquo";s:2:"»";s:6:"frac14";s:2:"¼";s:6:"frac12";s:2:"½";s:6:"frac34";s:2:"¾";s:6:"iquest";s:2:"¿";s:6:"Agrave";s:2:"À";s:6:"Aacute";s:2:"Á";s:5:"Acirc";s:2:"Â";s:6:"Atilde";s:2:"Ã";s:4:"Auml";s:2:"Ä";s:5:"Aring";s:2:"Å";s:5:"AElig";s:2:"Æ";s:6:"Ccedil";s:2:"Ç";s:6:"Egrave";s:2:"È";s:6:"Eacute";s:2:"É";s:5:"Ecirc";s:2:"Ê";s:4:"Euml";s:2:"Ë";s:6:"Igrave";s:2:"Ì";s:6:"Iacute";s:2:"Í";s:5:"Icirc";s:2:"Î";s:4:"Iuml";s:2:"Ï";s:3:"ETH";s:2:"Ð";s:6:"Ntilde";s:2:"Ñ";s:6:"Ograve";s:2:"Ò";s:6:"Oacute";s:2:"Ó";s:5:"Ocirc";s:2:"Ô";s:6:"Otilde";s:2:"Õ";s:4:"Ouml";s:2:"Ö";s:5:"times";s:2:"×";s:6:"Oslash";s:2:"Ø";s:6:"Ugrave";s:2:"Ù";s:6:"Uacute";s:2:"Ú";s:5:"Ucirc";s:2:"Û";s:4:"Uuml";s:2:"Ü";s:6:"Yacute";s:2:"Ý";s:5:"THORN";s:2:"Þ";s:5:"szlig";s:2:"ß";s:6:"agrave";s:2:"à";s:6:"aacute";s:2:"á";s:5:"acirc";s:2:"â";s:6:"atilde";s:2:"ã";s:4:"auml";s:2:"ä";s:5:"aring";s:2:"å";s:5:"aelig";s:2:"æ";s:6:"ccedil";s:2:"ç";s:6:"egrave";s:2:"è";s:6:"eacute";s:2:"é";s:5:"ecirc";s:2:"ê";s:4:"euml";s:2:"ë";s:6:"igrave";s:2:"ì";s:6:"iacute";s:2:"í";s:5:"icirc";s:2:"î";s:4:"iuml";s:2:"ï";s:3:"eth";s:2:"ð";s:6:"ntilde";s:2:"ñ";s:6:"ograve";s:2:"ò";s:6:"oacute";s:2:"ó";s:5:"ocirc";s:2:"ô";s:6:"otilde";s:2:"õ";s:4:"ouml";s:2:"ö";s:6:"divide";s:2:"÷";s:6:"oslash";s:2:"ø";s:6:"ugrave";s:2:"ù";s:6:"uacute";s:2:"ú";s:5:"ucirc";s:2:"û";s:4:"uuml";s:2:"ü";s:6:"yacute";s:2:"ý";s:5:"thorn";s:2:"þ";s:4:"yuml";s:2:"ÿ";}htmlpurifier/library/HTMLPurifier/StringHash.php000064400000002056151214231100015750 0ustar00<?php

/**
 * This is in almost every respect equivalent to an array except
 * that it keeps track of which keys were accessed.
 *
 * @warning For the sake of backwards compatibility with early versions
 *     of PHP 5, you must not use the $hash[$key] syntax; if you do
 *     our version of offsetGet is never called.
 */
class HTMLPurifier_StringHash extends ArrayObject
{
    /**
     * @type array
     */
    protected $accessed = array();

    /**
     * Retrieves a value, and logs the access.
     * @param mixed $index
     * @return mixed
     */
    public function offsetGet($index)
    {
        $this->accessed[$index] = true;
        return parent::offsetGet($index);
    }

    /**
     * Returns a lookup array of all array indexes that have been accessed.
     * @return array in form array($index => true).
     */
    public function getAccessed()
    {
        return $this->accessed;
    }

    /**
     * Resets the access array.
     */
    public function resetAccessed()
    {
        $this->accessed = array();
    }
}

// vim: et sw=4 sts=4
HTMLPurifier/DefinitionCache/Serializer/HTML/4.13.0,f474c0a322b208e83d22d3aef33ecb184bc71d31,1.ser000064400000266765151214231100030102 0ustar00htmlpurifier/libraryO:27:"HTMLPurifier_HTMLDefinition":15:{s:4:"info";a:61:{s:4:"abbr";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:7:{s:5:"class";O:31:"HTMLPurifier_AttrDef_HTML_Class":2:{s:9:"minimized";b:0;s:8:"required";b:0;}s:2:"id";O:28:"HTMLPurifier_AttrDef_HTML_ID":3:{s:11:"*selector";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}s:5:"title";O:25:"HTMLPurifier_AttrDef_Text":2:{s:9:"minimized";b:0;s:8:"required";b:0;}s:5:"style";O:24:"HTMLPurifier_AttrDef_CSS":2:{s:9:"minimized";b:0;s:8:"required";b:0;}s:3:"dir";O:25:"HTMLPurifier_AttrDef_Enum":4:{s:12:"valid_values";a:2:{s:3:"ltr";i:0;s:3:"rtl";i:1;}s:17:"*case_sensitive";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}s:8:"xml:lang";O:25:"HTMLPurifier_AttrDef_Lang":2:{s:9:"minimized";b:0;s:8:"required";b:0;}s:4:"lang";r:26;}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:40:{s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:1;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:7:"acronym";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:7:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:40:{s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:1;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:4:"cite";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:7:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:40:{s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:1;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:3:"dfn";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:7:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:40:{s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:1;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:3:"kbd";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:7:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:40:{s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:1;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:1:"q";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:8:{s:4:"cite";O:24:"HTMLPurifier_AttrDef_URI":4:{s:9:"*parser";O:22:"HTMLPurifier_URIParser":1:{s:17:"*percentEncoder";O:27:"HTMLPurifier_PercentEncoder":1:{s:11:"*preserve";a:66:{i:48;b:1;i:49;b:1;i:50;b:1;i:51;b:1;i:52;b:1;i:53;b:1;i:54;b:1;i:55;b:1;i:56;b:1;i:57;b:1;i:65;b:1;i:66;b:1;i:67;b:1;i:68;b:1;i:69;b:1;i:70;b:1;i:71;b:1;i:72;b:1;i:73;b:1;i:74;b:1;i:75;b:1;i:76;b:1;i:77;b:1;i:78;b:1;i:79;b:1;i:80;b:1;i:81;b:1;i:82;b:1;i:83;b:1;i:84;b:1;i:85;b:1;i:86;b:1;i:87;b:1;i:88;b:1;i:89;b:1;i:90;b:1;i:97;b:1;i:98;b:1;i:99;b:1;i:100;b:1;i:101;b:1;i:102;b:1;i:103;b:1;i:104;b:1;i:105;b:1;i:106;b:1;i:107;b:1;i:108;b:1;i:109;b:1;i:110;b:1;i:111;b:1;i:112;b:1;i:113;b:1;i:114;b:1;i:115;b:1;i:116;b:1;i:117;b:1;i:118;b:1;i:119;b:1;i:120;b:1;i:121;b:1;i:122;b:1;i:45;b:1;i:46;b:1;i:95;b:1;i:126;b:1;}}}s:17:"*embedsResource";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:40:{s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:1;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:4:"samp";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:7:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:40:{s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:1;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:3:"var";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:7:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:40:{s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:1;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:2:"em";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:7:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:40:{s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:1;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";b:1;}s:6:"strong";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:7:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:40:{s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:1;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";b:1;}s:4:"code";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:7:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:40:{s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:1;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";b:1;}s:4:"span";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:7:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:40:{s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:1;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:2:"br";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:5:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:5:"clear";O:25:"HTMLPurifier_AttrDef_Enum":4:{s:12:"valid_values";a:4:{s:4:"left";i:0;s:3:"all";i:1;s:5:"right";i:2;s:4:"none";i:3;}s:17:"*case_sensitive";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:27:"HTMLPurifier_ChildDef_Empty":3:{s:11:"allow_empty";b:1;s:4:"type";s:5:"empty";s:8:"elements";a:0:{}}s:22:"descendants_are_inline";b:0;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:7:"address";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:7:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:41:{s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;s:1:"p";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:1;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:10:"blockquote";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:8:{s:4:"cite";O:24:"HTMLPurifier_AttrDef_URI":4:{s:9:"*parser";O:22:"HTMLPurifier_URIParser":1:{s:17:"*percentEncoder";O:27:"HTMLPurifier_PercentEncoder":1:{s:11:"*preserve";a:66:{i:48;b:1;i:49;b:1;i:50;b:1;i:51;b:1;i:52;b:1;i:53;b:1;i:54;b:1;i:55;b:1;i:56;b:1;i:57;b:1;i:65;b:1;i:66;b:1;i:67;b:1;i:68;b:1;i:69;b:1;i:70;b:1;i:71;b:1;i:72;b:1;i:73;b:1;i:74;b:1;i:75;b:1;i:76;b:1;i:77;b:1;i:78;b:1;i:79;b:1;i:80;b:1;i:81;b:1;i:82;b:1;i:83;b:1;i:84;b:1;i:85;b:1;i:86;b:1;i:87;b:1;i:88;b:1;i:89;b:1;i:90;b:1;i:97;b:1;i:98;b:1;i:99;b:1;i:100;b:1;i:101;b:1;i:102;b:1;i:103;b:1;i:104;b:1;i:105;b:1;i:106;b:1;i:107;b:1;i:108;b:1;i:109;b:1;i:110;b:1;i:111;b:1;i:112;b:1;i:113;b:1;i:114;b:1;i:115;b:1;i:116;b:1;i:117;b:1;i:118;b:1;i:119;b:1;i:120;b:1;i:121;b:1;i:122;b:1;i:45;b:1;i:46;b:1;i:95;b:1;i:126;b:1;}}}s:17:"*embedsResource";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:61:{s:2:"h1";b:1;s:2:"h2";b:1;s:2:"h3";b:1;s:2:"h4";b:1;s:2:"h5";b:1;s:2:"h6";b:1;s:7:"address";b:1;s:10:"blockquote";b:1;s:3:"pre";b:1;s:1:"p";b:1;s:3:"div";b:1;s:2:"hr";b:1;s:5:"table";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"center";b:1;s:3:"dir";b:1;s:4:"menu";b:1;s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:2:"ol";b:1;s:2:"ul";b:1;s:2:"dl";b:1;s:4:"form";b:1;s:8:"fieldset";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:0;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:3:"pre";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:8:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;s:5:"width";O:28:"HTMLPurifier_AttrDef_Integer":5:{s:11:"*negative";b:0;s:7:"*zero";b:0;s:11:"*positive";b:1;s:9:"minimized";b:0;s:8:"required";b:0;}}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:40:{s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:1;s:13:"required_attr";a:0:{}s:8:"excludes";a:7:{s:3:"img";b:1;s:3:"big";b:1;s:5:"small";b:1;s:6:"object";b:1;s:6:"applet";b:1;s:4:"font";b:1;s:8:"basefont";b:1;}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:2:"h1";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:8:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;s:5:"align";O:25:"HTMLPurifier_AttrDef_Enum":4:{s:12:"valid_values";a:4:{s:4:"left";i:0;s:5:"right";i:1;s:6:"center";i:2;s:7:"justify";i:3;}s:17:"*case_sensitive";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:40:{s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:1;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:2:"h2";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:8:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;s:5:"align";O:25:"HTMLPurifier_AttrDef_Enum":4:{s:12:"valid_values";a:4:{s:4:"left";i:0;s:5:"right";i:1;s:6:"center";i:2;s:7:"justify";i:3;}s:17:"*case_sensitive";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:40:{s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:1;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:2:"h3";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:8:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;s:5:"align";O:25:"HTMLPurifier_AttrDef_Enum":4:{s:12:"valid_values";a:4:{s:4:"left";i:0;s:5:"right";i:1;s:6:"center";i:2;s:7:"justify";i:3;}s:17:"*case_sensitive";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:40:{s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:1;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:2:"h4";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:8:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;s:5:"align";O:25:"HTMLPurifier_AttrDef_Enum":4:{s:12:"valid_values";a:4:{s:4:"left";i:0;s:5:"right";i:1;s:6:"center";i:2;s:7:"justify";i:3;}s:17:"*case_sensitive";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:40:{s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:1;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:2:"h5";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:8:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;s:5:"align";O:25:"HTMLPurifier_AttrDef_Enum":4:{s:12:"valid_values";a:4:{s:4:"left";i:0;s:5:"right";i:1;s:6:"center";i:2;s:7:"justify";i:3;}s:17:"*case_sensitive";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:40:{s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:1;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:2:"h6";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:8:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;s:5:"align";O:25:"HTMLPurifier_AttrDef_Enum":4:{s:12:"valid_values";a:4:{s:4:"left";i:0;s:5:"right";i:1;s:6:"center";i:2;s:7:"justify";i:3;}s:17:"*case_sensitive";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:40:{s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:1;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:1:"p";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:8:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;s:5:"align";O:25:"HTMLPurifier_AttrDef_Enum":4:{s:12:"valid_values";a:4:{s:4:"left";i:0;s:5:"right";i:1;s:6:"center";i:2;s:7:"justify";i:3;}s:17:"*case_sensitive";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:40:{s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:1;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:10:{s:7:"address";i:0;s:10:"blockquote";i:1;s:6:"center";i:2;s:3:"dir";i:3;s:3:"div";i:4;s:2:"dl";i:5;s:8:"fieldset";i:6;s:2:"ol";i:7;s:1:"p";i:8;s:2:"ul";i:9;}s:4:"wrap";N;s:10:"formatting";N;}s:3:"div";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:8:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;s:5:"align";O:25:"HTMLPurifier_AttrDef_Enum":4:{s:12:"valid_values";a:4:{s:4:"left";i:0;s:5:"right";i:1;s:6:"center";i:2;s:7:"justify";i:3;}s:17:"*case_sensitive";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:61:{s:2:"h1";b:1;s:2:"h2";b:1;s:2:"h3";b:1;s:2:"h4";b:1;s:2:"h5";b:1;s:2:"h6";b:1;s:7:"address";b:1;s:10:"blockquote";b:1;s:3:"pre";b:1;s:1:"p";b:1;s:3:"div";b:1;s:2:"hr";b:1;s:5:"table";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"center";b:1;s:3:"dir";b:1;s:4:"menu";b:1;s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:2:"ol";b:1;s:2:"ul";b:1;s:2:"dl";b:1;s:4:"form";b:1;s:8:"fieldset";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:0;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:1:"a";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:12:{s:4:"href";O:24:"HTMLPurifier_AttrDef_URI":4:{s:9:"*parser";O:22:"HTMLPurifier_URIParser":1:{s:17:"*percentEncoder";O:27:"HTMLPurifier_PercentEncoder":1:{s:11:"*preserve";a:66:{i:48;b:1;i:49;b:1;i:50;b:1;i:51;b:1;i:52;b:1;i:53;b:1;i:54;b:1;i:55;b:1;i:56;b:1;i:57;b:1;i:65;b:1;i:66;b:1;i:67;b:1;i:68;b:1;i:69;b:1;i:70;b:1;i:71;b:1;i:72;b:1;i:73;b:1;i:74;b:1;i:75;b:1;i:76;b:1;i:77;b:1;i:78;b:1;i:79;b:1;i:80;b:1;i:81;b:1;i:82;b:1;i:83;b:1;i:84;b:1;i:85;b:1;i:86;b:1;i:87;b:1;i:88;b:1;i:89;b:1;i:90;b:1;i:97;b:1;i:98;b:1;i:99;b:1;i:100;b:1;i:101;b:1;i:102;b:1;i:103;b:1;i:104;b:1;i:105;b:1;i:106;b:1;i:107;b:1;i:108;b:1;i:109;b:1;i:110;b:1;i:111;b:1;i:112;b:1;i:113;b:1;i:114;b:1;i:115;b:1;i:116;b:1;i:117;b:1;i:118;b:1;i:119;b:1;i:120;b:1;i:121;b:1;i:122;b:1;i:45;b:1;i:46;b:1;i:95;b:1;i:126;b:1;}}}s:17:"*embedsResource";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}s:3:"rel";O:35:"HTMLPurifier_AttrDef_HTML_LinkTypes":3:{s:7:"*name";s:10:"AllowedRel";s:9:"minimized";b:0;s:8:"required";b:0;}s:3:"rev";O:35:"HTMLPurifier_AttrDef_HTML_LinkTypes":3:{s:7:"*name";s:10:"AllowedRev";s:9:"minimized";b:0;s:8:"required";b:0;}s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;s:4:"name";r:13;s:6:"target";O:37:"HTMLPurifier_AttrDef_HTML_FrameTarget":4:{s:12:"valid_values";b:0;s:17:"*case_sensitive";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:3:{i:0;O:35:"HTMLPurifier_AttrTransform_NameSync":1:{s:5:"idDef";O:28:"HTMLPurifier_AttrDef_HTML_ID":3:{s:11:"*selector";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}}i:1;O:43:"HTMLPurifier_AttrTransform_TargetNoreferrer":0:{}i:2;O:41:"HTMLPurifier_AttrTransform_TargetNoopener":0:{}}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:40:{s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:1;s:13:"required_attr";a:0:{}s:8:"excludes";a:1:{s:1:"a";b:1;}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";b:1;}s:2:"ol";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:10:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;s:7:"compact";O:30:"HTMLPurifier_AttrDef_HTML_Bool":3:{s:7:"*name";s:7:"compact";s:9:"minimized";b:1;s:8:"required";b:0;}s:5:"start";O:28:"HTMLPurifier_AttrDef_Integer":5:{s:11:"*negative";b:1;s:7:"*zero";b:1;s:11:"*positive";b:1;s:9:"minimized";b:0;s:8:"required";b:0;}s:4:"type";O:25:"HTMLPurifier_AttrDef_Enum":4:{s:12:"valid_values";a:5:{i:1;i:0;s:1:"i";i:1;s:1:"I";i:2;s:1:"a";i:3;s:1:"A";i:4;}s:17:"*case_sensitive";b:1;s:9:"minimized";b:0;s:8:"required";b:0;}}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:26:"HTMLPurifier_ChildDef_List":3:{s:4:"type";s:4:"list";s:8:"elements";a:3:{s:2:"li";b:1;s:2:"ul";b:1;s:2:"ol";b:1;}s:11:"allow_empty";N;}s:22:"descendants_are_inline";b:0;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";s:2:"li";s:10:"formatting";N;}s:2:"ul";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:9:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;s:7:"compact";O:30:"HTMLPurifier_AttrDef_HTML_Bool":3:{s:7:"*name";s:7:"compact";s:9:"minimized";b:1;s:8:"required";b:0;}s:4:"type";O:25:"HTMLPurifier_AttrDef_Enum":4:{s:12:"valid_values";a:3:{s:6:"square";i:0;s:4:"disc";i:1;s:6:"circle";i:2;}s:17:"*case_sensitive";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:26:"HTMLPurifier_ChildDef_List":3:{s:4:"type";s:4:"list";s:8:"elements";a:3:{s:2:"li";b:1;s:2:"ul";b:1;s:2:"ol";b:1;}s:11:"allow_empty";N;}s:22:"descendants_are_inline";b:0;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";s:2:"li";s:10:"formatting";N;}s:2:"dl";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:8:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;s:7:"compact";O:30:"HTMLPurifier_AttrDef_HTML_Bool":3:{s:7:"*name";s:7:"compact";s:9:"minimized";b:1;s:8:"required";b:0;}}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Required":4:{s:8:"elements";a:2:{s:2:"dt";b:1;s:2:"dd";b:1;}s:13:"*whitespace";b:0;s:11:"allow_empty";b:0;s:4:"type";s:8:"required";}s:22:"descendants_are_inline";b:0;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:2:"li";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:9:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;s:5:"value";O:28:"HTMLPurifier_AttrDef_Integer":5:{s:11:"*negative";b:1;s:7:"*zero";b:1;s:11:"*positive";b:1;s:9:"minimized";b:0;s:8:"required";b:0;}s:4:"type";O:25:"HTMLPurifier_AttrDef_Enum":4:{s:12:"valid_values";a:8:{i:1;i:0;s:1:"i";i:1;s:1:"I";i:2;s:1:"a";i:3;s:1:"A";i:4;s:4:"disc";i:5;s:6:"square";i:6;s:6:"circle";i:7;}s:17:"*case_sensitive";b:1;s:9:"minimized";b:0;s:8:"required";b:0;}}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:61:{s:2:"h1";b:1;s:2:"h2";b:1;s:2:"h3";b:1;s:2:"h4";b:1;s:2:"h5";b:1;s:2:"h6";b:1;s:7:"address";b:1;s:10:"blockquote";b:1;s:3:"pre";b:1;s:1:"p";b:1;s:3:"div";b:1;s:2:"hr";b:1;s:5:"table";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"center";b:1;s:3:"dir";b:1;s:4:"menu";b:1;s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:2:"ol";b:1;s:2:"ul";b:1;s:2:"dl";b:1;s:4:"form";b:1;s:8:"fieldset";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:0;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:2:"dd";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:7:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:61:{s:2:"h1";b:1;s:2:"h2";b:1;s:2:"h3";b:1;s:2:"h4";b:1;s:2:"h5";b:1;s:2:"h6";b:1;s:7:"address";b:1;s:10:"blockquote";b:1;s:3:"pre";b:1;s:1:"p";b:1;s:3:"div";b:1;s:2:"hr";b:1;s:5:"table";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"center";b:1;s:3:"dir";b:1;s:4:"menu";b:1;s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:2:"ol";b:1;s:2:"ul";b:1;s:2:"dl";b:1;s:4:"form";b:1;s:8:"fieldset";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:0;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:2:"dt";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:7:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:40:{s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:1;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:2:"hr";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:11:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;s:5:"align";O:25:"HTMLPurifier_AttrDef_Enum":4:{s:12:"valid_values";a:4:{s:4:"left";i:0;s:5:"right";i:1;s:6:"center";i:2;s:7:"justify";i:3;}s:17:"*case_sensitive";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}s:7:"noshade";O:30:"HTMLPurifier_AttrDef_HTML_Bool":3:{s:7:"*name";s:7:"noshade";s:9:"minimized";b:1;s:8:"required";b:0;}s:4:"size";O:32:"HTMLPurifier_AttrDef_HTML_Pixels":3:{s:6:"*max";N;s:9:"minimized";b:0;s:8:"required";b:0;}s:5:"width";O:32:"HTMLPurifier_AttrDef_HTML_Length":3:{s:6:"*max";N;s:9:"minimized";b:0;s:8:"required";b:0;}}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:27:"HTMLPurifier_ChildDef_Empty":3:{s:11:"allow_empty";b:1;s:4:"type";s:5:"empty";s:8:"elements";a:0:{}}s:22:"descendants_are_inline";b:0;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:3:"sub";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:7:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:40:{s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:1;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:3:"sup";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:7:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:40:{s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:1;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:1:"b";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:7:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:40:{s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:1;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";b:1;}s:3:"big";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:7:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:40:{s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:1;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";b:1;}s:1:"i";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:7:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:40:{s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:1;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";b:1;}s:5:"small";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:7:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:40:{s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:1;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";b:1;}s:2:"tt";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:7:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:40:{s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:1;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";b:1;}s:3:"del";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:8:{s:4:"cite";O:24:"HTMLPurifier_AttrDef_URI":4:{s:9:"*parser";O:22:"HTMLPurifier_URIParser":1:{s:17:"*percentEncoder";O:27:"HTMLPurifier_PercentEncoder":1:{s:11:"*preserve";a:66:{i:48;b:1;i:49;b:1;i:50;b:1;i:51;b:1;i:52;b:1;i:53;b:1;i:54;b:1;i:55;b:1;i:56;b:1;i:57;b:1;i:65;b:1;i:66;b:1;i:67;b:1;i:68;b:1;i:69;b:1;i:70;b:1;i:71;b:1;i:72;b:1;i:73;b:1;i:74;b:1;i:75;b:1;i:76;b:1;i:77;b:1;i:78;b:1;i:79;b:1;i:80;b:1;i:81;b:1;i:82;b:1;i:83;b:1;i:84;b:1;i:85;b:1;i:86;b:1;i:87;b:1;i:88;b:1;i:89;b:1;i:90;b:1;i:97;b:1;i:98;b:1;i:99;b:1;i:100;b:1;i:101;b:1;i:102;b:1;i:103;b:1;i:104;b:1;i:105;b:1;i:106;b:1;i:107;b:1;i:108;b:1;i:109;b:1;i:110;b:1;i:111;b:1;i:112;b:1;i:113;b:1;i:114;b:1;i:115;b:1;i:116;b:1;i:117;b:1;i:118;b:1;i:119;b:1;i:120;b:1;i:121;b:1;i:122;b:1;i:45;b:1;i:46;b:1;i:95;b:1;i:126;b:1;}}}s:17:"*embedsResource";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:31:"HTMLPurifier_ChildDef_Chameleon":5:{s:6:"inline";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:40:{s:7:"#PCDATA";b:1;s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;}s:13:"*whitespace";b:0;}s:5:"block";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:61:{s:7:"#PCDATA";b:1;s:2:"h1";b:1;s:2:"h2";b:1;s:2:"h3";b:1;s:2:"h4";b:1;s:2:"h5";b:1;s:2:"h6";b:1;s:7:"address";b:1;s:10:"blockquote";b:1;s:3:"pre";b:1;s:1:"p";b:1;s:3:"div";b:1;s:2:"hr";b:1;s:5:"table";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"center";b:1;s:3:"dir";b:1;s:4:"menu";b:1;s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:2:"ol";b:1;s:2:"ul";b:1;s:2:"dl";b:1;s:4:"form";b:1;s:8:"fieldset";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;}s:13:"*whitespace";b:0;}s:4:"type";s:9:"chameleon";s:11:"allow_empty";N;s:8:"elements";a:61:{s:7:"#PCDATA";b:1;s:2:"h1";b:1;s:2:"h2";b:1;s:2:"h3";b:1;s:2:"h4";b:1;s:2:"h5";b:1;s:2:"h6";b:1;s:7:"address";b:1;s:10:"blockquote";b:1;s:3:"pre";b:1;s:1:"p";b:1;s:3:"div";b:1;s:2:"hr";b:1;s:5:"table";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"center";b:1;s:3:"dir";b:1;s:4:"menu";b:1;s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:2:"ol";b:1;s:2:"ul";b:1;s:2:"dl";b:1;s:4:"form";b:1;s:8:"fieldset";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;}}s:22:"descendants_are_inline";b:0;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:3:"ins";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:8:{s:4:"cite";O:24:"HTMLPurifier_AttrDef_URI":4:{s:9:"*parser";O:22:"HTMLPurifier_URIParser":1:{s:17:"*percentEncoder";O:27:"HTMLPurifier_PercentEncoder":1:{s:11:"*preserve";a:66:{i:48;b:1;i:49;b:1;i:50;b:1;i:51;b:1;i:52;b:1;i:53;b:1;i:54;b:1;i:55;b:1;i:56;b:1;i:57;b:1;i:65;b:1;i:66;b:1;i:67;b:1;i:68;b:1;i:69;b:1;i:70;b:1;i:71;b:1;i:72;b:1;i:73;b:1;i:74;b:1;i:75;b:1;i:76;b:1;i:77;b:1;i:78;b:1;i:79;b:1;i:80;b:1;i:81;b:1;i:82;b:1;i:83;b:1;i:84;b:1;i:85;b:1;i:86;b:1;i:87;b:1;i:88;b:1;i:89;b:1;i:90;b:1;i:97;b:1;i:98;b:1;i:99;b:1;i:100;b:1;i:101;b:1;i:102;b:1;i:103;b:1;i:104;b:1;i:105;b:1;i:106;b:1;i:107;b:1;i:108;b:1;i:109;b:1;i:110;b:1;i:111;b:1;i:112;b:1;i:113;b:1;i:114;b:1;i:115;b:1;i:116;b:1;i:117;b:1;i:118;b:1;i:119;b:1;i:120;b:1;i:121;b:1;i:122;b:1;i:45;b:1;i:46;b:1;i:95;b:1;i:126;b:1;}}}s:17:"*embedsResource";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:31:"HTMLPurifier_ChildDef_Chameleon":5:{s:6:"inline";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:40:{s:7:"#PCDATA";b:1;s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;}s:13:"*whitespace";b:0;}s:5:"block";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:61:{s:7:"#PCDATA";b:1;s:2:"h1";b:1;s:2:"h2";b:1;s:2:"h3";b:1;s:2:"h4";b:1;s:2:"h5";b:1;s:2:"h6";b:1;s:7:"address";b:1;s:10:"blockquote";b:1;s:3:"pre";b:1;s:1:"p";b:1;s:3:"div";b:1;s:2:"hr";b:1;s:5:"table";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"center";b:1;s:3:"dir";b:1;s:4:"menu";b:1;s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:2:"ol";b:1;s:2:"ul";b:1;s:2:"dl";b:1;s:4:"form";b:1;s:8:"fieldset";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;}s:13:"*whitespace";b:0;}s:4:"type";s:9:"chameleon";s:11:"allow_empty";N;s:8:"elements";a:61:{s:7:"#PCDATA";b:1;s:2:"h1";b:1;s:2:"h2";b:1;s:2:"h3";b:1;s:2:"h4";b:1;s:2:"h5";b:1;s:2:"h6";b:1;s:7:"address";b:1;s:10:"blockquote";b:1;s:3:"pre";b:1;s:1:"p";b:1;s:3:"div";b:1;s:2:"hr";b:1;s:5:"table";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"center";b:1;s:3:"dir";b:1;s:4:"menu";b:1;s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:2:"ol";b:1;s:2:"ul";b:1;s:2:"dl";b:1;s:4:"form";b:1;s:8:"fieldset";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;}}s:22:"descendants_are_inline";b:0;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:3:"bdo";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:7:{s:3:"dir";O:25:"HTMLPurifier_AttrDef_Enum":4:{s:12:"valid_values";a:2:{s:3:"ltr";i:0;s:3:"rtl";i:1;}s:17:"*case_sensitive";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:8:"xml:lang";r:26;s:4:"lang";r:26;}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:1:{i:0;O:33:"HTMLPurifier_AttrTransform_BdoDir":0:{}}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:40:{s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:1;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:7:"caption";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:8:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;s:5:"align";O:25:"HTMLPurifier_AttrDef_Enum":4:{s:12:"valid_values";a:4:{s:3:"top";i:0;s:6:"bottom";i:1;s:4:"left";i:2;s:5:"right";i:3;}s:17:"*case_sensitive";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:40:{s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:1;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:5:"table";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:16:{s:6:"border";O:32:"HTMLPurifier_AttrDef_HTML_Pixels":3:{s:6:"*max";N;s:9:"minimized";b:0;s:8:"required";b:0;}s:11:"cellpadding";O:32:"HTMLPurifier_AttrDef_HTML_Length":3:{s:6:"*max";N;s:9:"minimized";b:0;s:8:"required";b:0;}s:11:"cellspacing";O:32:"HTMLPurifier_AttrDef_HTML_Length":3:{s:6:"*max";N;s:9:"minimized";b:0;s:8:"required";b:0;}s:5:"frame";O:25:"HTMLPurifier_AttrDef_Enum":4:{s:12:"valid_values";a:9:{s:4:"void";i:0;s:5:"above";i:1;s:5:"below";i:2;s:6:"hsides";i:3;s:3:"lhs";i:4;s:3:"rhs";i:5;s:6:"vsides";i:6;s:3:"box";i:7;s:6:"border";i:8;}s:17:"*case_sensitive";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}s:5:"rules";O:25:"HTMLPurifier_AttrDef_Enum":4:{s:12:"valid_values";a:5:{s:4:"none";i:0;s:6:"groups";i:1;s:4:"rows";i:2;s:4:"cols";i:3;s:3:"all";i:4;}s:17:"*case_sensitive";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}s:7:"summary";O:25:"HTMLPurifier_AttrDef_Text":2:{s:9:"minimized";b:0;s:8:"required";b:0;}s:5:"width";O:32:"HTMLPurifier_AttrDef_HTML_Length":3:{s:6:"*max";N;s:9:"minimized";b:0;s:8:"required";b:0;}s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;s:5:"align";O:25:"HTMLPurifier_AttrDef_Enum":4:{s:12:"valid_values";a:3:{s:4:"left";i:0;s:6:"center";i:1;s:5:"right";i:2;}s:17:"*case_sensitive";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}s:7:"bgcolor";O:31:"HTMLPurifier_AttrDef_HTML_Color":2:{s:9:"minimized";b:0;s:8:"required";b:0;}}s:18:"attr_transform_pre";a:2:{s:10:"background";O:37:"HTMLPurifier_AttrTransform_Background":0:{}s:6:"height";O:33:"HTMLPurifier_AttrTransform_Length":2:{s:7:"*name";s:6:"height";s:10:"*cssName";s:6:"height";}}s:19:"attr_transform_post";a:0:{}s:5:"child";O:27:"HTMLPurifier_ChildDef_Table":3:{s:11:"allow_empty";b:0;s:4:"type";s:5:"table";s:8:"elements";a:7:{s:2:"tr";b:1;s:5:"tbody";b:1;s:5:"thead";b:1;s:5:"tfoot";b:1;s:7:"caption";b:1;s:8:"colgroup";b:1;s:3:"col";b:1;}}s:22:"descendants_are_inline";b:0;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:2:"td";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:18:{s:4:"abbr";r:3499;s:7:"colspan";r:1108;s:7:"rowspan";r:1108;s:5:"scope";O:25:"HTMLPurifier_AttrDef_Enum":4:{s:12:"valid_values";a:4:{s:3:"row";i:0;s:3:"col";i:1;s:8:"rowgroup";i:2;s:8:"colgroup";i:3;}s:17:"*case_sensitive";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}s:5:"align";O:25:"HTMLPurifier_AttrDef_Enum":4:{s:12:"valid_values";a:5:{s:4:"left";i:0;s:6:"center";i:1;s:5:"right";i:2;s:7:"justify";i:3;s:4:"char";i:4;}s:17:"*case_sensitive";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}s:7:"charoff";O:32:"HTMLPurifier_AttrDef_HTML_Length":3:{s:6:"*max";N;s:9:"minimized";b:0;s:8:"required";b:0;}s:6:"valign";O:25:"HTMLPurifier_AttrDef_Enum":4:{s:12:"valid_values";a:4:{s:3:"top";i:0;s:6:"middle";i:1;s:6:"bottom";i:2;s:8:"baseline";i:3;}s:17:"*case_sensitive";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;s:7:"bgcolor";r:3521;s:6:"height";O:32:"HTMLPurifier_AttrDef_HTML_Length":3:{s:6:"*max";N;s:9:"minimized";b:0;s:8:"required";b:0;}s:6:"nowrap";O:30:"HTMLPurifier_AttrDef_HTML_Bool":3:{s:7:"*name";s:6:"nowrap";s:9:"minimized";b:1;s:8:"required";b:0;}s:5:"width";O:32:"HTMLPurifier_AttrDef_HTML_Length":3:{s:6:"*max";N;s:9:"minimized";b:0;s:8:"required";b:0;}}s:18:"attr_transform_pre";a:1:{s:10:"background";O:37:"HTMLPurifier_AttrTransform_Background":0:{}}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:61:{s:2:"h1";b:1;s:2:"h2";b:1;s:2:"h3";b:1;s:2:"h4";b:1;s:2:"h5";b:1;s:2:"h6";b:1;s:7:"address";b:1;s:10:"blockquote";b:1;s:3:"pre";b:1;s:1:"p";b:1;s:3:"div";b:1;s:2:"hr";b:1;s:5:"table";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"center";b:1;s:3:"dir";b:1;s:4:"menu";b:1;s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:2:"ol";b:1;s:2:"ul";b:1;s:2:"dl";b:1;s:4:"form";b:1;s:8:"fieldset";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:0;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:2:"th";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:18:{s:4:"abbr";r:3499;s:7:"colspan";r:1108;s:7:"rowspan";r:1108;s:5:"scope";O:25:"HTMLPurifier_AttrDef_Enum":4:{s:12:"valid_values";a:4:{s:3:"row";i:0;s:3:"col";i:1;s:8:"rowgroup";i:2;s:8:"colgroup";i:3;}s:17:"*case_sensitive";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}s:5:"align";O:25:"HTMLPurifier_AttrDef_Enum":4:{s:12:"valid_values";a:5:{s:4:"left";i:0;s:6:"center";i:1;s:5:"right";i:2;s:7:"justify";i:3;s:4:"char";i:4;}s:17:"*case_sensitive";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}s:7:"charoff";O:32:"HTMLPurifier_AttrDef_HTML_Length":3:{s:6:"*max";N;s:9:"minimized";b:0;s:8:"required";b:0;}s:6:"valign";O:25:"HTMLPurifier_AttrDef_Enum":4:{s:12:"valid_values";a:4:{s:3:"top";i:0;s:6:"middle";i:1;s:6:"bottom";i:2;s:8:"baseline";i:3;}s:17:"*case_sensitive";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;s:7:"bgcolor";r:3521;s:6:"height";O:32:"HTMLPurifier_AttrDef_HTML_Length":3:{s:6:"*max";N;s:9:"minimized";b:0;s:8:"required";b:0;}s:6:"nowrap";O:30:"HTMLPurifier_AttrDef_HTML_Bool":3:{s:7:"*name";s:6:"nowrap";s:9:"minimized";b:1;s:8:"required";b:0;}s:5:"width";O:32:"HTMLPurifier_AttrDef_HTML_Length":3:{s:6:"*max";N;s:9:"minimized";b:0;s:8:"required";b:0;}}s:18:"attr_transform_pre";a:1:{s:10:"background";O:37:"HTMLPurifier_AttrTransform_Background":0:{}}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:61:{s:2:"h1";b:1;s:2:"h2";b:1;s:2:"h3";b:1;s:2:"h4";b:1;s:2:"h5";b:1;s:2:"h6";b:1;s:7:"address";b:1;s:10:"blockquote";b:1;s:3:"pre";b:1;s:1:"p";b:1;s:3:"div";b:1;s:2:"hr";b:1;s:5:"table";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"center";b:1;s:3:"dir";b:1;s:4:"menu";b:1;s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:2:"ol";b:1;s:2:"ul";b:1;s:2:"dl";b:1;s:4:"form";b:1;s:8:"fieldset";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:0;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:2:"tr";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:11:{s:5:"align";O:25:"HTMLPurifier_AttrDef_Enum":4:{s:12:"valid_values";a:5:{s:4:"left";i:0;s:6:"center";i:1;s:5:"right";i:2;s:7:"justify";i:3;s:4:"char";i:4;}s:17:"*case_sensitive";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}s:7:"charoff";O:32:"HTMLPurifier_AttrDef_HTML_Length":3:{s:6:"*max";N;s:9:"minimized";b:0;s:8:"required";b:0;}s:6:"valign";O:25:"HTMLPurifier_AttrDef_Enum":4:{s:12:"valid_values";a:4:{s:3:"top";i:0;s:6:"middle";i:1;s:6:"bottom";i:2;s:8:"baseline";i:3;}s:17:"*case_sensitive";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;s:7:"bgcolor";r:3521;}s:18:"attr_transform_pre";a:1:{s:10:"background";O:37:"HTMLPurifier_AttrTransform_Background":0:{}}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Required":4:{s:8:"elements";a:2:{s:2:"td";b:1;s:2:"th";b:1;}s:13:"*whitespace";b:0;s:11:"allow_empty";b:0;s:4:"type";s:8:"required";}s:22:"descendants_are_inline";b:0;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:3:"col";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:12:{s:4:"span";r:1108;s:5:"width";O:37:"HTMLPurifier_AttrDef_HTML_MultiLength":3:{s:6:"*max";N;s:9:"minimized";b:0;s:8:"required";b:0;}s:5:"align";O:25:"HTMLPurifier_AttrDef_Enum":4:{s:12:"valid_values";a:5:{s:4:"left";i:0;s:6:"center";i:1;s:5:"right";i:2;s:7:"justify";i:3;s:4:"char";i:4;}s:17:"*case_sensitive";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}s:7:"charoff";O:32:"HTMLPurifier_AttrDef_HTML_Length":3:{s:6:"*max";N;s:9:"minimized";b:0;s:8:"required";b:0;}s:6:"valign";O:25:"HTMLPurifier_AttrDef_Enum":4:{s:12:"valid_values";a:4:{s:3:"top";i:0;s:6:"middle";i:1;s:6:"bottom";i:2;s:8:"baseline";i:3;}s:17:"*case_sensitive";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:27:"HTMLPurifier_ChildDef_Empty":3:{s:11:"allow_empty";b:1;s:4:"type";s:5:"empty";s:8:"elements";a:0:{}}s:22:"descendants_are_inline";b:0;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:8:"colgroup";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:12:{s:4:"span";r:1108;s:5:"width";O:37:"HTMLPurifier_AttrDef_HTML_MultiLength":3:{s:6:"*max";N;s:9:"minimized";b:0;s:8:"required";b:0;}s:5:"align";O:25:"HTMLPurifier_AttrDef_Enum":4:{s:12:"valid_values";a:5:{s:4:"left";i:0;s:6:"center";i:1;s:5:"right";i:2;s:7:"justify";i:3;s:4:"char";i:4;}s:17:"*case_sensitive";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}s:7:"charoff";O:32:"HTMLPurifier_AttrDef_HTML_Length":3:{s:6:"*max";N;s:9:"minimized";b:0;s:8:"required";b:0;}s:6:"valign";O:25:"HTMLPurifier_AttrDef_Enum":4:{s:12:"valid_values";a:4:{s:3:"top";i:0;s:6:"middle";i:1;s:6:"bottom";i:2;s:8:"baseline";i:3;}s:17:"*case_sensitive";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:1:{s:3:"col";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:0;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:5:"tbody";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:10:{s:5:"align";O:25:"HTMLPurifier_AttrDef_Enum":4:{s:12:"valid_values";a:5:{s:4:"left";i:0;s:6:"center";i:1;s:5:"right";i:2;s:7:"justify";i:3;s:4:"char";i:4;}s:17:"*case_sensitive";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}s:7:"charoff";O:32:"HTMLPurifier_AttrDef_HTML_Length":3:{s:6:"*max";N;s:9:"minimized";b:0;s:8:"required";b:0;}s:6:"valign";O:25:"HTMLPurifier_AttrDef_Enum":4:{s:12:"valid_values";a:4:{s:3:"top";i:0;s:6:"middle";i:1;s:6:"bottom";i:2;s:8:"baseline";i:3;}s:17:"*case_sensitive";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;}s:18:"attr_transform_pre";a:1:{s:10:"background";O:37:"HTMLPurifier_AttrTransform_Background":0:{}}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Required":4:{s:8:"elements";a:1:{s:2:"tr";b:1;}s:13:"*whitespace";b:0;s:11:"allow_empty";b:0;s:4:"type";s:8:"required";}s:22:"descendants_are_inline";b:0;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:5:"thead";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:10:{s:5:"align";O:25:"HTMLPurifier_AttrDef_Enum":4:{s:12:"valid_values";a:5:{s:4:"left";i:0;s:6:"center";i:1;s:5:"right";i:2;s:7:"justify";i:3;s:4:"char";i:4;}s:17:"*case_sensitive";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}s:7:"charoff";O:32:"HTMLPurifier_AttrDef_HTML_Length":3:{s:6:"*max";N;s:9:"minimized";b:0;s:8:"required";b:0;}s:6:"valign";O:25:"HTMLPurifier_AttrDef_Enum":4:{s:12:"valid_values";a:4:{s:3:"top";i:0;s:6:"middle";i:1;s:6:"bottom";i:2;s:8:"baseline";i:3;}s:17:"*case_sensitive";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;}s:18:"attr_transform_pre";a:1:{s:10:"background";O:37:"HTMLPurifier_AttrTransform_Background":0:{}}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Required":4:{s:8:"elements";a:1:{s:2:"tr";b:1;}s:13:"*whitespace";b:0;s:11:"allow_empty";b:0;s:4:"type";s:8:"required";}s:22:"descendants_are_inline";b:0;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:5:"tfoot";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:10:{s:5:"align";O:25:"HTMLPurifier_AttrDef_Enum":4:{s:12:"valid_values";a:5:{s:4:"left";i:0;s:6:"center";i:1;s:5:"right";i:2;s:7:"justify";i:3;s:4:"char";i:4;}s:17:"*case_sensitive";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}s:7:"charoff";O:32:"HTMLPurifier_AttrDef_HTML_Length":3:{s:6:"*max";N;s:9:"minimized";b:0;s:8:"required";b:0;}s:6:"valign";O:25:"HTMLPurifier_AttrDef_Enum":4:{s:12:"valid_values";a:4:{s:3:"top";i:0;s:6:"middle";i:1;s:6:"bottom";i:2;s:8:"baseline";i:3;}s:17:"*case_sensitive";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;}s:18:"attr_transform_pre";a:1:{s:10:"background";O:37:"HTMLPurifier_AttrTransform_Background":0:{}}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Required":4:{s:8:"elements";a:1:{s:2:"tr";b:1;}s:13:"*whitespace";b:0;s:11:"allow_empty";b:0;s:4:"type";s:8:"required";}s:22:"descendants_are_inline";b:0;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:3:"img";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:17:{s:6:"height";O:32:"HTMLPurifier_AttrDef_HTML_Pixels":3:{s:6:"*max";i:1200;s:9:"minimized";b:0;s:8:"required";b:0;}s:5:"width";O:32:"HTMLPurifier_AttrDef_HTML_Pixels":3:{s:6:"*max";i:1200;s:9:"minimized";b:0;s:8:"required";b:0;}s:8:"longdesc";O:24:"HTMLPurifier_AttrDef_URI":4:{s:9:"*parser";O:22:"HTMLPurifier_URIParser":1:{s:17:"*percentEncoder";O:27:"HTMLPurifier_PercentEncoder":1:{s:11:"*preserve";a:66:{i:48;b:1;i:49;b:1;i:50;b:1;i:51;b:1;i:52;b:1;i:53;b:1;i:54;b:1;i:55;b:1;i:56;b:1;i:57;b:1;i:65;b:1;i:66;b:1;i:67;b:1;i:68;b:1;i:69;b:1;i:70;b:1;i:71;b:1;i:72;b:1;i:73;b:1;i:74;b:1;i:75;b:1;i:76;b:1;i:77;b:1;i:78;b:1;i:79;b:1;i:80;b:1;i:81;b:1;i:82;b:1;i:83;b:1;i:84;b:1;i:85;b:1;i:86;b:1;i:87;b:1;i:88;b:1;i:89;b:1;i:90;b:1;i:97;b:1;i:98;b:1;i:99;b:1;i:100;b:1;i:101;b:1;i:102;b:1;i:103;b:1;i:104;b:1;i:105;b:1;i:106;b:1;i:107;b:1;i:108;b:1;i:109;b:1;i:110;b:1;i:111;b:1;i:112;b:1;i:113;b:1;i:114;b:1;i:115;b:1;i:116;b:1;i:117;b:1;i:118;b:1;i:119;b:1;i:120;b:1;i:121;b:1;i:122;b:1;i:45;b:1;i:46;b:1;i:95;b:1;i:126;b:1;}}}s:17:"*embedsResource";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;s:3:"alt";r:3499;s:3:"src";O:24:"HTMLPurifier_AttrDef_URI":4:{s:9:"*parser";O:22:"HTMLPurifier_URIParser":1:{s:17:"*percentEncoder";O:27:"HTMLPurifier_PercentEncoder":1:{s:11:"*preserve";a:66:{i:48;b:1;i:49;b:1;i:50;b:1;i:51;b:1;i:52;b:1;i:53;b:1;i:54;b:1;i:55;b:1;i:56;b:1;i:57;b:1;i:65;b:1;i:66;b:1;i:67;b:1;i:68;b:1;i:69;b:1;i:70;b:1;i:71;b:1;i:72;b:1;i:73;b:1;i:74;b:1;i:75;b:1;i:76;b:1;i:77;b:1;i:78;b:1;i:79;b:1;i:80;b:1;i:81;b:1;i:82;b:1;i:83;b:1;i:84;b:1;i:85;b:1;i:86;b:1;i:87;b:1;i:88;b:1;i:89;b:1;i:90;b:1;i:97;b:1;i:98;b:1;i:99;b:1;i:100;b:1;i:101;b:1;i:102;b:1;i:103;b:1;i:104;b:1;i:105;b:1;i:106;b:1;i:107;b:1;i:108;b:1;i:109;b:1;i:110;b:1;i:111;b:1;i:112;b:1;i:113;b:1;i:114;b:1;i:115;b:1;i:116;b:1;i:117;b:1;i:118;b:1;i:119;b:1;i:120;b:1;i:121;b:1;i:122;b:1;i:45;b:1;i:46;b:1;i:95;b:1;i:126;b:1;}}}s:17:"*embedsResource";b:1;s:9:"minimized";b:0;s:8:"required";b:1;}s:4:"name";r:13;s:5:"align";O:25:"HTMLPurifier_AttrDef_Enum":4:{s:12:"valid_values";a:5:{s:3:"top";i:0;s:6:"middle";i:1;s:6:"bottom";i:2;s:4:"left";i:3;s:5:"right";i:4;}s:17:"*case_sensitive";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}s:6:"border";O:32:"HTMLPurifier_AttrDef_HTML_Pixels":3:{s:6:"*max";N;s:9:"minimized";b:0;s:8:"required";b:0;}s:6:"hspace";O:32:"HTMLPurifier_AttrDef_HTML_Pixels":3:{s:6:"*max";N;s:9:"minimized";b:0;s:8:"required";b:0;}s:6:"vspace";O:32:"HTMLPurifier_AttrDef_HTML_Pixels":3:{s:6:"*max";N;s:9:"minimized";b:0;s:8:"required";b:0;}}s:18:"attr_transform_pre";a:1:{i:0;O:38:"HTMLPurifier_AttrTransform_ImgRequired":0:{}}s:19:"attr_transform_post";a:2:{i:0;r:4298;i:1;O:35:"HTMLPurifier_AttrTransform_NameSync":1:{s:5:"idDef";O:28:"HTMLPurifier_AttrDef_HTML_ID":3:{s:11:"*selector";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}}}s:5:"child";O:27:"HTMLPurifier_ChildDef_Empty":3:{s:11:"allow_empty";b:1;s:4:"type";s:5:"empty";s:8:"elements";a:0:{}}s:22:"descendants_are_inline";b:0;s:13:"required_attr";a:2:{i:0;s:3:"alt";i:1;s:3:"src";}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:8:"basefont";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:4:{s:5:"color";r:3521;s:4:"face";r:3499;s:4:"size";r:3499;s:2:"id";r:9;}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:27:"HTMLPurifier_ChildDef_Empty":3:{s:11:"allow_empty";b:1;s:4:"type";s:5:"empty";s:8:"elements";a:0:{}}s:22:"descendants_are_inline";b:0;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:6:"center";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:7:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:61:{s:2:"h1";b:1;s:2:"h2";b:1;s:2:"h3";b:1;s:2:"h4";b:1;s:2:"h5";b:1;s:2:"h6";b:1;s:7:"address";b:1;s:10:"blockquote";b:1;s:3:"pre";b:1;s:1:"p";b:1;s:3:"div";b:1;s:2:"hr";b:1;s:5:"table";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"center";b:1;s:3:"dir";b:1;s:4:"menu";b:1;s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:2:"ol";b:1;s:2:"ul";b:1;s:2:"dl";b:1;s:4:"form";b:1;s:8:"fieldset";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:0;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:3:"dir";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:8:{s:7:"compact";O:30:"HTMLPurifier_AttrDef_HTML_Bool":3:{s:7:"*name";s:7:"compact";s:9:"minimized";b:1;s:8:"required";b:0;}s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Required":4:{s:8:"elements";a:1:{s:2:"li";b:1;}s:13:"*whitespace";b:0;s:11:"allow_empty";b:0;s:4:"type";s:8:"required";}s:22:"descendants_are_inline";b:0;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:4:"font";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:10:{s:5:"color";r:3521;s:4:"face";r:3499;s:4:"size";r:3499;s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:40:{s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:1;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:4:"menu";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:8:{s:7:"compact";O:30:"HTMLPurifier_AttrDef_HTML_Bool":3:{s:7:"*name";s:7:"compact";s:9:"minimized";b:1;s:8:"required";b:0;}s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Required":4:{s:8:"elements";a:1:{s:2:"li";b:1;}s:13:"*whitespace";b:0;s:11:"allow_empty";b:0;s:4:"type";s:8:"required";}s:22:"descendants_are_inline";b:0;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:1:"s";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:7:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:40:{s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:1;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";b:1;}s:6:"strike";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:7:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:40:{s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:1;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";b:1;}s:1:"u";O:23:"HTMLPurifier_ElementDef":11:{s:10:"standalone";b:1;s:4:"attr";a:7:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:40:{s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:22:"descendants_are_inline";b:1;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";b:1;}}s:16:"info_global_attr";a:0:{}s:11:"info_parent";s:3:"div";s:15:"info_parent_def";O:23:"HTMLPurifier_ElementDef":13:{s:10:"standalone";b:1;s:4:"attr";a:8:{s:5:"class";r:6;s:2:"id";r:9;s:5:"title";r:13;s:5:"style";r:16;s:3:"dir";r:19;s:8:"xml:lang";r:26;s:4:"lang";r:26;s:5:"align";O:25:"HTMLPurifier_AttrDef_Enum":4:{s:12:"valid_values";a:4:{s:4:"left";i:0;s:5:"right";i:1;s:6:"center";i:2;s:7:"justify";i:3;}s:17:"*case_sensitive";b:0;s:9:"minimized";b:0;s:8:"required";b:0;}}s:18:"attr_transform_pre";a:0:{}s:19:"attr_transform_post";a:0:{}s:5:"child";O:30:"HTMLPurifier_ChildDef_Optional":4:{s:11:"allow_empty";b:1;s:4:"type";s:8:"optional";s:8:"elements";a:61:{s:2:"h1";b:1;s:2:"h2";b:1;s:2:"h3";b:1;s:2:"h4";b:1;s:2:"h5";b:1;s:2:"h6";b:1;s:7:"address";b:1;s:10:"blockquote";b:1;s:3:"pre";b:1;s:1:"p";b:1;s:3:"div";b:1;s:2:"hr";b:1;s:5:"table";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"center";b:1;s:3:"dir";b:1;s:4:"menu";b:1;s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:2:"ol";b:1;s:2:"ul";b:1;s:2:"dl";b:1;s:4:"form";b:1;s:8:"fieldset";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;s:7:"#PCDATA";b:1;}s:13:"*whitespace";b:0;}s:13:"content_model";s:415:"h1 | h2 | h3 | h4 | h5 | h6 | address | blockquote | pre | p | div | hr | table | script | noscript | center | dir | menu | abbr | acronym | cite | dfn | kbd | q | samp | var | em | strong | code | span | br | a | sub | sup | b | big | i | small | tt | del | ins | bdo | img | object | basefont | font | s | strike | u | iframe | ol | ul | dl | form | fieldset | input | select | textarea | button | label | #PCDATA";s:18:"content_model_type";s:8:"optional";s:22:"descendants_are_inline";b:0;s:13:"required_attr";a:0:{}s:8:"excludes";a:0:{}s:9:"autoclose";a:0:{}s:4:"wrap";N;s:10:"formatting";N;}s:18:"info_block_wrapper";s:1:"p";s:18:"info_tag_transform";a:0:{}s:23:"info_attr_transform_pre";a:1:{s:4:"lang";O:31:"HTMLPurifier_AttrTransform_Lang":0:{}}s:24:"info_attr_transform_post";a:0:{}s:17:"info_content_sets";a:7:{s:4:"Flow";a:60:{s:2:"h1";b:1;s:2:"h2";b:1;s:2:"h3";b:1;s:2:"h4";b:1;s:2:"h5";b:1;s:2:"h6";b:1;s:7:"address";b:1;s:10:"blockquote";b:1;s:3:"pre";b:1;s:1:"p";b:1;s:3:"div";b:1;s:2:"hr";b:1;s:5:"table";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"center";b:1;s:3:"dir";b:1;s:4:"menu";b:1;s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:2:"ol";b:1;s:2:"ul";b:1;s:2:"dl";b:1;s:4:"form";b:1;s:8:"fieldset";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;}s:6:"Inline";a:39:{s:4:"abbr";b:1;s:7:"acronym";b:1;s:4:"cite";b:1;s:3:"dfn";b:1;s:3:"kbd";b:1;s:1:"q";b:1;s:4:"samp";b:1;s:3:"var";b:1;s:2:"em";b:1;s:6:"strong";b:1;s:4:"code";b:1;s:4:"span";b:1;s:2:"br";b:1;s:1:"a";b:1;s:3:"sub";b:1;s:3:"sup";b:1;s:1:"b";b:1;s:3:"big";b:1;s:1:"i";b:1;s:5:"small";b:1;s:2:"tt";b:1;s:3:"del";b:1;s:3:"ins";b:1;s:3:"bdo";b:1;s:3:"img";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"object";b:1;s:8:"basefont";b:1;s:4:"font";b:1;s:1:"s";b:1;s:6:"strike";b:1;s:1:"u";b:1;s:6:"iframe";b:1;s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;}s:5:"Block";a:14:{s:7:"address";b:1;s:10:"blockquote";b:1;s:3:"pre";b:1;s:1:"p";b:1;s:3:"div";b:1;s:2:"hr";b:1;s:5:"table";b:1;s:6:"script";b:1;s:8:"noscript";b:1;s:6:"center";b:1;s:3:"dir";b:1;s:4:"menu";b:1;s:4:"form";b:1;s:8:"fieldset";b:1;}s:7:"Heading";a:6:{s:2:"h1";b:1;s:2:"h2";b:1;s:2:"h3";b:1;s:2:"h4";b:1;s:2:"h5";b:1;s:2:"h6";b:1;}s:4:"List";a:3:{s:2:"ol";b:1;s:2:"ul";b:1;s:2:"dl";b:1;}s:4:"Form";a:2:{s:4:"form";b:1;s:8:"fieldset";b:1;}s:8:"Formctrl";a:5:{s:5:"input";b:1;s:6:"select";b:1;s:8:"textarea";b:1;s:6:"button";b:1;s:5:"label";b:1;}}s:13:"info_injector";a:0:{}s:7:"doctype";O:20:"HTMLPurifier_Doctype":7:{s:4:"name";s:22:"XHTML 1.0 Transitional";s:7:"modules";a:19:{i:0;s:16:"CommonAttributes";i:1;s:4:"Text";i:2;s:9:"Hypertext";i:3;s:4:"List";i:4;s:12:"Presentation";i:5;s:4:"Edit";i:6;s:3:"Bdo";i:7;s:6:"Tables";i:8;s:5:"Image";i:9;s:14:"StyleAttribute";i:10;s:9:"Scripting";i:11;s:6:"Object";i:12;s:5:"Forms";i:13;s:4:"Name";i:14;s:6:"Legacy";i:15;s:6:"Target";i:16;s:6:"Iframe";i:17;s:19:"XMLCommonAttributes";i:18;s:22:"NonXMLCommonAttributes";}s:11:"tidyModules";a:4:{i:0;s:17:"Tidy_Transitional";i:1;s:10:"Tidy_XHTML";i:2;s:16:"Tidy_Proprietary";i:3;s:9:"Tidy_Name";}s:3:"xml";b:1;s:7:"aliases";a:0:{}s:9:"dtdPublic";s:38:"-//W3C//DTD XHTML 1.0 Transitional//EN";s:9:"dtdSystem";s:55:"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";}s:40:"HTMLPurifier_HTMLDefinition_anonModule";N;s:4:"type";s:4:"HTML";s:5:"setup";b:1;s:9:"optimized";N;}htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer/README000064400000000140151214231100021162 0ustar00This is a dummy file to prevent Git from ignoring this empty directory.

    vim: et sw=4 sts=4
HTMLPurifier/DefinitionCache/Serializer/URI/4.13.0,3478238e680361cd87bf880f5b3cc50a1e7abc6c,1.ser000064400000001004151214231100027717 0ustar00htmlpurifier/libraryO:26:"HTMLPurifier_URIDefinition":8:{s:4:"type";s:3:"URI";s:10:"*filters";a:2:{s:13:"HostBlacklist";O:36:"HTMLPurifier_URIFilter_HostBlacklist":4:{s:4:"name";s:13:"HostBlacklist";s:12:"*blacklist";a:0:{}s:4:"post";b:0;s:11:"always_load";b:0;}s:10:"SafeIframe";O:33:"HTMLPurifier_URIFilter_SafeIframe":4:{s:4:"name";s:10:"SafeIframe";s:11:"always_load";b:1;s:9:"*regexp";N;s:4:"post";b:0;}}s:14:"*postFilters";a:0:{}s:4:"base";N;s:4:"host";N;s:13:"defaultScheme";s:4:"http";s:5:"setup";b:1;s:9:"optimized";N;}htmlpurifier/library/HTMLPurifier/DefinitionCache/Null.php000064400000002510151214231100017617 0ustar00<?php

/**
 * Null cache object to use when no caching is on.
 */
class HTMLPurifier_DefinitionCache_Null extends HTMLPurifier_DefinitionCache
{

    /**
     * @param HTMLPurifier_Definition $def
     * @param HTMLPurifier_Config $config
     * @return bool
     */
    public function add($def, $config)
    {
        return false;
    }

    /**
     * @param HTMLPurifier_Definition $def
     * @param HTMLPurifier_Config $config
     * @return bool
     */
    public function set($def, $config)
    {
        return false;
    }

    /**
     * @param HTMLPurifier_Definition $def
     * @param HTMLPurifier_Config $config
     * @return bool
     */
    public function replace($def, $config)
    {
        return false;
    }

    /**
     * @param HTMLPurifier_Config $config
     * @return bool
     */
    public function remove($config)
    {
        return false;
    }

    /**
     * @param HTMLPurifier_Config $config
     * @return bool
     */
    public function get($config)
    {
        return false;
    }

    /**
     * @param HTMLPurifier_Config $config
     * @return bool
     */
    public function flush($config)
    {
        return false;
    }

    /**
     * @param HTMLPurifier_Config $config
     * @return bool
     */
    public function cleanup($config)
    {
        return false;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator.php000064400000004513151214231100020634 0ustar00<?php

class HTMLPurifier_DefinitionCache_Decorator extends HTMLPurifier_DefinitionCache
{

    /**
     * Cache object we are decorating
     * @type HTMLPurifier_DefinitionCache
     */
    public $cache;

    /**
     * The name of the decorator
     * @var string
     */
    public $name;

    public function __construct()
    {
    }

    /**
     * Lazy decorator function
     * @param HTMLPurifier_DefinitionCache $cache Reference to cache object to decorate
     * @return HTMLPurifier_DefinitionCache_Decorator
     */
    public function decorate(&$cache)
    {
        $decorator = $this->copy();
        // reference is necessary for mocks in PHP 4
        $decorator->cache =& $cache;
        $decorator->type = $cache->type;
        return $decorator;
    }

    /**
     * Cross-compatible clone substitute
     * @return HTMLPurifier_DefinitionCache_Decorator
     */
    public function copy()
    {
        return new HTMLPurifier_DefinitionCache_Decorator();
    }

    /**
     * @param HTMLPurifier_Definition $def
     * @param HTMLPurifier_Config $config
     * @return mixed
     */
    public function add($def, $config)
    {
        return $this->cache->add($def, $config);
    }

    /**
     * @param HTMLPurifier_Definition $def
     * @param HTMLPurifier_Config $config
     * @return mixed
     */
    public function set($def, $config)
    {
        return $this->cache->set($def, $config);
    }

    /**
     * @param HTMLPurifier_Definition $def
     * @param HTMLPurifier_Config $config
     * @return mixed
     */
    public function replace($def, $config)
    {
        return $this->cache->replace($def, $config);
    }

    /**
     * @param HTMLPurifier_Config $config
     * @return mixed
     */
    public function get($config)
    {
        return $this->cache->get($config);
    }

    /**
     * @param HTMLPurifier_Config $config
     * @return mixed
     */
    public function remove($config)
    {
        return $this->cache->remove($config);
    }

    /**
     * @param HTMLPurifier_Config $config
     * @return mixed
     */
    public function flush($config)
    {
        return $this->cache->flush($config);
    }

    /**
     * @param HTMLPurifier_Config $config
     * @return mixed
     */
    public function cleanup($config)
    {
        return $this->cache->cleanup($config);
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Memory.php000064400000004012151214231100022076 0ustar00<?php

/**
 * Definition cache decorator class that saves all cache retrievals
 * to PHP's memory; good for unit tests or circumstances where
 * there are lots of configuration objects floating around.
 */
class HTMLPurifier_DefinitionCache_Decorator_Memory extends HTMLPurifier_DefinitionCache_Decorator
{
    /**
     * @type array
     */
    protected $definitions;

    /**
     * @type string
     */
    public $name = 'Memory';

    /**
     * @return HTMLPurifier_DefinitionCache_Decorator_Memory
     */
    public function copy()
    {
        return new HTMLPurifier_DefinitionCache_Decorator_Memory();
    }

    /**
     * @param HTMLPurifier_Definition $def
     * @param HTMLPurifier_Config $config
     * @return mixed
     */
    public function add($def, $config)
    {
        $status = parent::add($def, $config);
        if ($status) {
            $this->definitions[$this->generateKey($config)] = $def;
        }
        return $status;
    }

    /**
     * @param HTMLPurifier_Definition $def
     * @param HTMLPurifier_Config $config
     * @return mixed
     */
    public function set($def, $config)
    {
        $status = parent::set($def, $config);
        if ($status) {
            $this->definitions[$this->generateKey($config)] = $def;
        }
        return $status;
    }

    /**
     * @param HTMLPurifier_Definition $def
     * @param HTMLPurifier_Config $config
     * @return mixed
     */
    public function replace($def, $config)
    {
        $status = parent::replace($def, $config);
        if ($status) {
            $this->definitions[$this->generateKey($config)] = $def;
        }
        return $status;
    }

    /**
     * @param HTMLPurifier_Config $config
     * @return mixed
     */
    public function get($config)
    {
        $key = $this->generateKey($config);
        if (isset($this->definitions[$key])) {
            return $this->definitions[$key];
        }
        $this->definitions[$key] = parent::get($config);
        return $this->definitions[$key];
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Template.php.in000064400000003211151214231100023006 0ustar00<?php

require_once 'HTMLPurifier/DefinitionCache/Decorator.php';

/**
 * Definition cache decorator template.
 */
class HTMLPurifier_DefinitionCache_Decorator_Template extends HTMLPurifier_DefinitionCache_Decorator
{

    /**
     * @type string
     */
    public $name = 'Template'; // replace this

    public function copy()
    {
        // replace class name with yours
        return new HTMLPurifier_DefinitionCache_Decorator_Template();
    }

    // remove methods you don't need

    /**
     * @param HTMLPurifier_Definition $def
     * @param HTMLPurifier_Config $config
     * @return mixed
     */
    public function add($def, $config)
    {
        return parent::add($def, $config);
    }

    /**
     * @param HTMLPurifier_Definition $def
     * @param HTMLPurifier_Config $config
     * @return mixed
     */
    public function set($def, $config)
    {
        return parent::set($def, $config);
    }

    /**
     * @param HTMLPurifier_Definition $def
     * @param HTMLPurifier_Config $config
     * @return mixed
     */
    public function replace($def, $config)
    {
        return parent::replace($def, $config);
    }

    /**
     * @param HTMLPurifier_Config $config
     * @return mixed
     */
    public function get($config)
    {
        return parent::get($config);
    }

    /**
     * @param HTMLPurifier_Config $config
     * @return mixed
     */
    public function flush($config)
    {
        return parent::flush($config);
    }

    /**
     * @param HTMLPurifier_Config $config
     * @return mixed
     */
    public function cleanup($config)
    {
        return parent::cleanup($config);
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php000064400000003243151214231100022222 0ustar00<?php

/**
 * Definition cache decorator class that cleans up the cache
 * whenever there is a cache miss.
 */
class HTMLPurifier_DefinitionCache_Decorator_Cleanup extends HTMLPurifier_DefinitionCache_Decorator
{
    /**
     * @type string
     */
    public $name = 'Cleanup';

    /**
     * @return HTMLPurifier_DefinitionCache_Decorator_Cleanup
     */
    public function copy()
    {
        return new HTMLPurifier_DefinitionCache_Decorator_Cleanup();
    }

    /**
     * @param HTMLPurifier_Definition $def
     * @param HTMLPurifier_Config $config
     * @return mixed
     */
    public function add($def, $config)
    {
        $status = parent::add($def, $config);
        if (!$status) {
            parent::cleanup($config);
        }
        return $status;
    }

    /**
     * @param HTMLPurifier_Definition $def
     * @param HTMLPurifier_Config $config
     * @return mixed
     */
    public function set($def, $config)
    {
        $status = parent::set($def, $config);
        if (!$status) {
            parent::cleanup($config);
        }
        return $status;
    }

    /**
     * @param HTMLPurifier_Definition $def
     * @param HTMLPurifier_Config $config
     * @return mixed
     */
    public function replace($def, $config)
    {
        $status = parent::replace($def, $config);
        if (!$status) {
            parent::cleanup($config);
        }
        return $status;
    }

    /**
     * @param HTMLPurifier_Config $config
     * @return mixed
     */
    public function get($config)
    {
        $ret = parent::get($config);
        if (!$ret) {
            parent::cleanup($config);
        }
        return $ret;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer.php000064400000022202151214231100021016 0ustar00<?php

class HTMLPurifier_DefinitionCache_Serializer extends HTMLPurifier_DefinitionCache
{

    /**
     * @param HTMLPurifier_Definition $def
     * @param HTMLPurifier_Config $config
     * @return int|bool
     */
    public function add($def, $config)
    {
        if (!$this->checkDefType($def)) {
            return;
        }
        $file = $this->generateFilePath($config);
        if (file_exists($file)) {
            return false;
        }
        if (!$this->_prepareDir($config)) {
            return false;
        }
        return $this->_write($file, serialize($def), $config);
    }

    /**
     * @param HTMLPurifier_Definition $def
     * @param HTMLPurifier_Config $config
     * @return int|bool
     */
    public function set($def, $config)
    {
        if (!$this->checkDefType($def)) {
            return;
        }
        $file = $this->generateFilePath($config);
        if (!$this->_prepareDir($config)) {
            return false;
        }
        return $this->_write($file, serialize($def), $config);
    }

    /**
     * @param HTMLPurifier_Definition $def
     * @param HTMLPurifier_Config $config
     * @return int|bool
     */
    public function replace($def, $config)
    {
        if (!$this->checkDefType($def)) {
            return;
        }
        $file = $this->generateFilePath($config);
        if (!file_exists($file)) {
            return false;
        }
        if (!$this->_prepareDir($config)) {
            return false;
        }
        return $this->_write($file, serialize($def), $config);
    }

    /**
     * @param HTMLPurifier_Config $config
     * @return bool|HTMLPurifier_Config
     */
    public function get($config)
    {
        $file = $this->generateFilePath($config);
        if (!file_exists($file)) {
            return false;
        }
        return unserialize(file_get_contents($file));
    }

    /**
     * @param HTMLPurifier_Config $config
     * @return bool
     */
    public function remove($config)
    {
        $file = $this->generateFilePath($config);
        if (!file_exists($file)) {
            return false;
        }
        return unlink($file);
    }

    /**
     * @param HTMLPurifier_Config $config
     * @return bool
     */
    public function flush($config)
    {
        if (!$this->_prepareDir($config)) {
            return false;
        }
        $dir = $this->generateDirectoryPath($config);
        $dh = opendir($dir);
        // Apparently, on some versions of PHP, readdir will return
        // an empty string if you pass an invalid argument to readdir.
        // So you need this test.  See #49.
        if (false === $dh) {
            return false;
        }
        while (false !== ($filename = readdir($dh))) {
            if (empty($filename)) {
                continue;
            }
            if ($filename[0] === '.') {
                continue;
            }
            unlink($dir . '/' . $filename);
        }
        closedir($dh);
        return true;
    }

    /**
     * @param HTMLPurifier_Config $config
     * @return bool
     */
    public function cleanup($config)
    {
        if (!$this->_prepareDir($config)) {
            return false;
        }
        $dir = $this->generateDirectoryPath($config);
        $dh = opendir($dir);
        // See #49 (and above).
        if (false === $dh) {
            return false;
        }
        while (false !== ($filename = readdir($dh))) {
            if (empty($filename)) {
                continue;
            }
            if ($filename[0] === '.') {
                continue;
            }
            $key = substr($filename, 0, strlen($filename) - 4);
            if ($this->isOld($key, $config)) {
                unlink($dir . '/' . $filename);
            }
        }
        closedir($dh);
        return true;
    }

    /**
     * Generates the file path to the serial file corresponding to
     * the configuration and definition name
     * @param HTMLPurifier_Config $config
     * @return string
     * @todo Make protected
     */
    public function generateFilePath($config)
    {
        $key = $this->generateKey($config);
        return $this->generateDirectoryPath($config) . '/' . $key . '.ser';
    }

    /**
     * Generates the path to the directory contain this cache's serial files
     * @param HTMLPurifier_Config $config
     * @return string
     * @note No trailing slash
     * @todo Make protected
     */
    public function generateDirectoryPath($config)
    {
        $base = $this->generateBaseDirectoryPath($config);
        return $base . '/' . $this->type;
    }

    /**
     * Generates path to base directory that contains all definition type
     * serials
     * @param HTMLPurifier_Config $config
     * @return mixed|string
     * @todo Make protected
     */
    public function generateBaseDirectoryPath($config)
    {
        $base = $config->get('Cache.SerializerPath');
        $base = is_null($base) ? HTMLPURIFIER_PREFIX . '/HTMLPurifier/DefinitionCache/Serializer' : $base;
        return $base;
    }

    /**
     * Convenience wrapper function for file_put_contents
     * @param string $file File name to write to
     * @param string $data Data to write into file
     * @param HTMLPurifier_Config $config
     * @return int|bool Number of bytes written if success, or false if failure.
     */
    private function _write($file, $data, $config)
    {
        $result = file_put_contents($file, $data);
        if ($result !== false) {
            // set permissions of the new file (no execute)
            $chmod = $config->get('Cache.SerializerPermissions');
            if ($chmod !== null) {
                chmod($file, $chmod & 0666);
            }
        }
        return $result;
    }

    /**
     * Prepares the directory that this type stores the serials in
     * @param HTMLPurifier_Config $config
     * @return bool True if successful
     */
    private function _prepareDir($config)
    {
        $directory = $this->generateDirectoryPath($config);
        $chmod = $config->get('Cache.SerializerPermissions');
        if ($chmod === null) {
            if (!@mkdir($directory) && !is_dir($directory)) {
                trigger_error(
                    'Could not create directory ' . $directory . '',
                    E_USER_WARNING
                );
                return false;
            }
            return true;
        }
        if (!is_dir($directory)) {
            $base = $this->generateBaseDirectoryPath($config);
            if (!is_dir($base)) {
                trigger_error(
                    'Base directory ' . $base . ' does not exist,
                    please create or change using %Cache.SerializerPath',
                    E_USER_WARNING
                );
                return false;
            } elseif (!$this->_testPermissions($base, $chmod)) {
                return false;
            }
            if (!@mkdir($directory, $chmod) && !is_dir($directory)) {
                trigger_error(
                    'Could not create directory ' . $directory . '',
                    E_USER_WARNING
                );
                return false;
            }
            if (!$this->_testPermissions($directory, $chmod)) {
                return false;
            }
        } elseif (!$this->_testPermissions($directory, $chmod)) {
            return false;
        }
        return true;
    }

    /**
     * Tests permissions on a directory and throws out friendly
     * error messages and attempts to chmod it itself if possible
     * @param string $dir Directory path
     * @param int $chmod Permissions
     * @return bool True if directory is writable
     */
    private function _testPermissions($dir, $chmod)
    {
        // early abort, if it is writable, everything is hunky-dory
        if (is_writable($dir)) {
            return true;
        }
        if (!is_dir($dir)) {
            // generally, you'll want to handle this beforehand
            // so a more specific error message can be given
            trigger_error(
                'Directory ' . $dir . ' does not exist',
                E_USER_WARNING
            );
            return false;
        }
        if (function_exists('posix_getuid') && $chmod !== null) {
            // POSIX system, we can give more specific advice
            if (fileowner($dir) === posix_getuid()) {
                // we can chmod it ourselves
                $chmod = $chmod | 0700;
                if (chmod($dir, $chmod)) {
                    return true;
                }
            } elseif (filegroup($dir) === posix_getgid()) {
                $chmod = $chmod | 0070;
            } else {
                // PHP's probably running as nobody, so we'll
                // need to give global permissions
                $chmod = $chmod | 0777;
            }
            trigger_error(
                'Directory ' . $dir . ' not writable, ' .
                'please chmod to ' . decoct($chmod),
                E_USER_WARNING
            );
        } else {
            // generic error message
            trigger_error(
                'Directory ' . $dir . ' not writable, ' .
                'please alter file permissions',
                E_USER_WARNING
            );
        }
        return false;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Encoder.php000064400000062057151214231100015264 0ustar00<?php

/**
 * A UTF-8 specific character encoder that handles cleaning and transforming.
 * @note All functions in this class should be static.
 */
class HTMLPurifier_Encoder
{

    /**
     * Constructor throws fatal error if you attempt to instantiate class
     */
    private function __construct()
    {
        trigger_error('Cannot instantiate encoder, call methods statically', E_USER_ERROR);
    }

    /**
     * Error-handler that mutes errors, alternative to shut-up operator.
     */
    public static function muteErrorHandler()
    {
    }

    /**
     * iconv wrapper which mutes errors, but doesn't work around bugs.
     * @param string $in Input encoding
     * @param string $out Output encoding
     * @param string $text The text to convert
     * @return string
     */
    public static function unsafeIconv($in, $out, $text)
    {
        set_error_handler(array('HTMLPurifier_Encoder', 'muteErrorHandler'));
        $r = iconv($in, $out, $text);
        restore_error_handler();
        return $r;
    }

    /**
     * iconv wrapper which mutes errors and works around bugs.
     * @param string $in Input encoding
     * @param string $out Output encoding
     * @param string $text The text to convert
     * @param int $max_chunk_size
     * @return string
     */
    public static function iconv($in, $out, $text, $max_chunk_size = 8000)
    {
        $code = self::testIconvTruncateBug();
        if ($code == self::ICONV_OK) {
            return self::unsafeIconv($in, $out, $text);
        } elseif ($code == self::ICONV_TRUNCATES) {
            // we can only work around this if the input character set
            // is utf-8
            if ($in == 'utf-8') {
                if ($max_chunk_size < 4) {
                    trigger_error('max_chunk_size is too small', E_USER_WARNING);
                    return false;
                }
                // split into 8000 byte chunks, but be careful to handle
                // multibyte boundaries properly
                if (($c = strlen($text)) <= $max_chunk_size) {
                    return self::unsafeIconv($in, $out, $text);
                }
                $r = '';
                $i = 0;
                while (true) {
                    if ($i + $max_chunk_size >= $c) {
                        $r .= self::unsafeIconv($in, $out, substr($text, $i));
                        break;
                    }
                    // wibble the boundary
                    if (0x80 != (0xC0 & ord($text[$i + $max_chunk_size]))) {
                        $chunk_size = $max_chunk_size;
                    } elseif (0x80 != (0xC0 & ord($text[$i + $max_chunk_size - 1]))) {
                        $chunk_size = $max_chunk_size - 1;
                    } elseif (0x80 != (0xC0 & ord($text[$i + $max_chunk_size - 2]))) {
                        $chunk_size = $max_chunk_size - 2;
                    } elseif (0x80 != (0xC0 & ord($text[$i + $max_chunk_size - 3]))) {
                        $chunk_size = $max_chunk_size - 3;
                    } else {
                        return false; // rather confusing UTF-8...
                    }
                    $chunk = substr($text, $i, $chunk_size); // substr doesn't mind overlong lengths
                    $r .= self::unsafeIconv($in, $out, $chunk);
                    $i += $chunk_size;
                }
                return $r;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }

    /**
     * Cleans a UTF-8 string for well-formedness and SGML validity
     *
     * It will parse according to UTF-8 and return a valid UTF8 string, with
     * non-SGML codepoints excluded.
     *
     * Specifically, it will permit:
     * \x{9}\x{A}\x{D}\x{20}-\x{7E}\x{A0}-\x{D7FF}\x{E000}-\x{FFFD}\x{10000}-\x{10FFFF}
     * Source: https://www.w3.org/TR/REC-xml/#NT-Char
     * Arguably this function should be modernized to the HTML5 set
     * of allowed characters:
     * https://www.w3.org/TR/html5/syntax.html#preprocessing-the-input-stream
     * which simultaneously expand and restrict the set of allowed characters.
     *
     * @param string $str The string to clean
     * @param bool $force_php
     * @return string
     *
     * @note Just for reference, the non-SGML code points are 0 to 31 and
     *       127 to 159, inclusive.  However, we allow code points 9, 10
     *       and 13, which are the tab, line feed and carriage return
     *       respectively. 128 and above the code points map to multibyte
     *       UTF-8 representations.
     *
     * @note Fallback code adapted from utf8ToUnicode by Henri Sivonen and
     *       hsivonen@iki.fi at <http://iki.fi/hsivonen/php-utf8/> under the
     *       LGPL license.  Notes on what changed are inside, but in general,
     *       the original code transformed UTF-8 text into an array of integer
     *       Unicode codepoints. Understandably, transforming that back to
     *       a string would be somewhat expensive, so the function was modded to
     *       directly operate on the string.  However, this discourages code
     *       reuse, and the logic enumerated here would be useful for any
     *       function that needs to be able to understand UTF-8 characters.
     *       As of right now, only smart lossless character encoding converters
     *       would need that, and I'm probably not going to implement them.
     */
    public static function cleanUTF8($str, $force_php = false)
    {
        // UTF-8 validity is checked since PHP 4.3.5
        // This is an optimization: if the string is already valid UTF-8, no
        // need to do PHP stuff. 99% of the time, this will be the case.
        if (preg_match(
            '/^[\x{9}\x{A}\x{D}\x{20}-\x{7E}\x{A0}-\x{D7FF}\x{E000}-\x{FFFD}\x{10000}-\x{10FFFF}]*$/Du',
            $str
        )) {
            return $str;
        }

        $mState = 0; // cached expected number of octets after the current octet
                     // until the beginning of the next UTF8 character sequence
        $mUcs4  = 0; // cached Unicode character
        $mBytes = 1; // cached expected number of octets in the current sequence

        // original code involved an $out that was an array of Unicode
        // codepoints.  Instead of having to convert back into UTF-8, we've
        // decided to directly append valid UTF-8 characters onto a string
        // $out once they're done.  $char accumulates raw bytes, while $mUcs4
        // turns into the Unicode code point, so there's some redundancy.

        $out = '';
        $char = '';

        $len = strlen($str);
        for ($i = 0; $i < $len; $i++) {
            $in = ord($str[$i]);
            $char .= $str[$i]; // append byte to char
            if (0 == $mState) {
                // When mState is zero we expect either a US-ASCII character
                // or a multi-octet sequence.
                if (0 == (0x80 & ($in))) {
                    // US-ASCII, pass straight through.
                    if (($in <= 31 || $in == 127) &&
                        !($in == 9 || $in == 13 || $in == 10) // save \r\t\n
                    ) {
                        // control characters, remove
                    } else {
                        $out .= $char;
                    }
                    // reset
                    $char = '';
                    $mBytes = 1;
                } elseif (0xC0 == (0xE0 & ($in))) {
                    // First octet of 2 octet sequence
                    $mUcs4 = ($in);
                    $mUcs4 = ($mUcs4 & 0x1F) << 6;
                    $mState = 1;
                    $mBytes = 2;
                } elseif (0xE0 == (0xF0 & ($in))) {
                    // First octet of 3 octet sequence
                    $mUcs4 = ($in);
                    $mUcs4 = ($mUcs4 & 0x0F) << 12;
                    $mState = 2;
                    $mBytes = 3;
                } elseif (0xF0 == (0xF8 & ($in))) {
                    // First octet of 4 octet sequence
                    $mUcs4 = ($in);
                    $mUcs4 = ($mUcs4 & 0x07) << 18;
                    $mState = 3;
                    $mBytes = 4;
                } elseif (0xF8 == (0xFC & ($in))) {
                    // First octet of 5 octet sequence.
                    //
                    // This is illegal because the encoded codepoint must be
                    // either:
                    // (a) not the shortest form or
                    // (b) outside the Unicode range of 0-0x10FFFF.
                    // Rather than trying to resynchronize, we will carry on
                    // until the end of the sequence and let the later error
                    // handling code catch it.
                    $mUcs4 = ($in);
                    $mUcs4 = ($mUcs4 & 0x03) << 24;
                    $mState = 4;
                    $mBytes = 5;
                } elseif (0xFC == (0xFE & ($in))) {
                    // First octet of 6 octet sequence, see comments for 5
                    // octet sequence.
                    $mUcs4 = ($in);
                    $mUcs4 = ($mUcs4 & 1) << 30;
                    $mState = 5;
                    $mBytes = 6;
                } else {
                    // Current octet is neither in the US-ASCII range nor a
                    // legal first octet of a multi-octet sequence.
                    $mState = 0;
                    $mUcs4  = 0;
                    $mBytes = 1;
                    $char = '';
                }
            } else {
                // When mState is non-zero, we expect a continuation of the
                // multi-octet sequence
                if (0x80 == (0xC0 & ($in))) {
                    // Legal continuation.
                    $shift = ($mState - 1) * 6;
                    $tmp = $in;
                    $tmp = ($tmp & 0x0000003F) << $shift;
                    $mUcs4 |= $tmp;

                    if (0 == --$mState) {
                        // End of the multi-octet sequence. mUcs4 now contains
                        // the final Unicode codepoint to be output

                        // Check for illegal sequences and codepoints.

                        // From Unicode 3.1, non-shortest form is illegal
                        if (((2 == $mBytes) && ($mUcs4 < 0x0080)) ||
                            ((3 == $mBytes) && ($mUcs4 < 0x0800)) ||
                            ((4 == $mBytes) && ($mUcs4 < 0x10000)) ||
                            (4 < $mBytes) ||
                            // From Unicode 3.2, surrogate characters = illegal
                            (($mUcs4 & 0xFFFFF800) == 0xD800) ||
                            // Codepoints outside the Unicode range are illegal
                            ($mUcs4 > 0x10FFFF)
                        ) {

                        } elseif (0xFEFF != $mUcs4 && // omit BOM
                            // check for valid Char unicode codepoints
                            (
                                0x9 == $mUcs4 ||
                                0xA == $mUcs4 ||
                                0xD == $mUcs4 ||
                                (0x20 <= $mUcs4 && 0x7E >= $mUcs4) ||
                                // 7F-9F is not strictly prohibited by XML,
                                // but it is non-SGML, and thus we don't allow it
                                (0xA0 <= $mUcs4 && 0xD7FF >= $mUcs4) ||
                                (0xE000 <= $mUcs4 && 0xFFFD >= $mUcs4) ||
                                (0x10000 <= $mUcs4 && 0x10FFFF >= $mUcs4)
                            )
                        ) {
                            $out .= $char;
                        }
                        // initialize UTF8 cache (reset)
                        $mState = 0;
                        $mUcs4  = 0;
                        $mBytes = 1;
                        $char = '';
                    }
                } else {
                    // ((0xC0 & (*in) != 0x80) && (mState != 0))
                    // Incomplete multi-octet sequence.
                    // used to result in complete fail, but we'll reset
                    $mState = 0;
                    $mUcs4  = 0;
                    $mBytes = 1;
                    $char ='';
                }
            }
        }
        return $out;
    }

    /**
     * Translates a Unicode codepoint into its corresponding UTF-8 character.
     * @note Based on Feyd's function at
     *       <http://forums.devnetwork.net/viewtopic.php?p=191404#191404>,
     *       which is in public domain.
     * @note While we're going to do code point parsing anyway, a good
     *       optimization would be to refuse to translate code points that
     *       are non-SGML characters.  However, this could lead to duplication.
     * @note This is very similar to the unichr function in
     *       maintenance/generate-entity-file.php (although this is superior,
     *       due to its sanity checks).
     */

    // +----------+----------+----------+----------+
    // | 33222222 | 22221111 | 111111   |          |
    // | 10987654 | 32109876 | 54321098 | 76543210 | bit
    // +----------+----------+----------+----------+
    // |          |          |          | 0xxxxxxx | 1 byte 0x00000000..0x0000007F
    // |          |          | 110yyyyy | 10xxxxxx | 2 byte 0x00000080..0x000007FF
    // |          | 1110zzzz | 10yyyyyy | 10xxxxxx | 3 byte 0x00000800..0x0000FFFF
    // | 11110www | 10wwzzzz | 10yyyyyy | 10xxxxxx | 4 byte 0x00010000..0x0010FFFF
    // +----------+----------+----------+----------+
    // | 00000000 | 00011111 | 11111111 | 11111111 | Theoretical upper limit of legal scalars: 2097151 (0x001FFFFF)
    // | 00000000 | 00010000 | 11111111 | 11111111 | Defined upper limit of legal scalar codes
    // +----------+----------+----------+----------+

    public static function unichr($code)
    {
        if ($code > 1114111 or $code < 0 or
          ($code >= 55296 and $code <= 57343) ) {
            // bits are set outside the "valid" range as defined
            // by UNICODE 4.1.0
            return '';
        }

        $x = $y = $z = $w = 0;
        if ($code < 128) {
            // regular ASCII character
            $x = $code;
        } else {
            // set up bits for UTF-8
            $x = ($code & 63) | 128;
            if ($code < 2048) {
                $y = (($code & 2047) >> 6) | 192;
            } else {
                $y = (($code & 4032) >> 6) | 128;
                if ($code < 65536) {
                    $z = (($code >> 12) & 15) | 224;
                } else {
                    $z = (($code >> 12) & 63) | 128;
                    $w = (($code >> 18) & 7)  | 240;
                }
            }
        }
        // set up the actual character
        $ret = '';
        if ($w) {
            $ret .= chr($w);
        }
        if ($z) {
            $ret .= chr($z);
        }
        if ($y) {
            $ret .= chr($y);
        }
        $ret .= chr($x);

        return $ret;
    }

    /**
     * @return bool
     */
    public static function iconvAvailable()
    {
        static $iconv = null;
        if ($iconv === null) {
            $iconv = function_exists('iconv') && self::testIconvTruncateBug() != self::ICONV_UNUSABLE;
        }
        return $iconv;
    }

    /**
     * Convert a string to UTF-8 based on configuration.
     * @param string $str The string to convert
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return string
     */
    public static function convertToUTF8($str, $config, $context)
    {
        $encoding = $config->get('Core.Encoding');
        if ($encoding === 'utf-8') {
            return $str;
        }
        static $iconv = null;
        if ($iconv === null) {
            $iconv = self::iconvAvailable();
        }
        if ($iconv && !$config->get('Test.ForceNoIconv')) {
            // unaffected by bugs, since UTF-8 support all characters
            $str = self::unsafeIconv($encoding, 'utf-8//IGNORE', $str);
            if ($str === false) {
                // $encoding is not a valid encoding
                trigger_error('Invalid encoding ' . $encoding, E_USER_ERROR);
                return '';
            }
            // If the string is bjorked by Shift_JIS or a similar encoding
            // that doesn't support all of ASCII, convert the naughty
            // characters to their true byte-wise ASCII/UTF-8 equivalents.
            $str = strtr($str, self::testEncodingSupportsASCII($encoding));
            return $str;
        } elseif ($encoding === 'iso-8859-1') {
            $str = utf8_encode($str);
            return $str;
        }
        $bug = HTMLPurifier_Encoder::testIconvTruncateBug();
        if ($bug == self::ICONV_OK) {
            trigger_error('Encoding not supported, please install iconv', E_USER_ERROR);
        } else {
            trigger_error(
                'You have a buggy version of iconv, see https://bugs.php.net/bug.php?id=48147 ' .
                'and http://sourceware.org/bugzilla/show_bug.cgi?id=13541',
                E_USER_ERROR
            );
        }
    }

    /**
     * Converts a string from UTF-8 based on configuration.
     * @param string $str The string to convert
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return string
     * @note Currently, this is a lossy conversion, with unexpressable
     *       characters being omitted.
     */
    public static function convertFromUTF8($str, $config, $context)
    {
        $encoding = $config->get('Core.Encoding');
        if ($escape = $config->get('Core.EscapeNonASCIICharacters')) {
            $str = self::convertToASCIIDumbLossless($str);
        }
        if ($encoding === 'utf-8') {
            return $str;
        }
        static $iconv = null;
        if ($iconv === null) {
            $iconv = self::iconvAvailable();
        }
        if ($iconv && !$config->get('Test.ForceNoIconv')) {
            // Undo our previous fix in convertToUTF8, otherwise iconv will barf
            $ascii_fix = self::testEncodingSupportsASCII($encoding);
            if (!$escape && !empty($ascii_fix)) {
                $clear_fix = array();
                foreach ($ascii_fix as $utf8 => $native) {
                    $clear_fix[$utf8] = '';
                }
                $str = strtr($str, $clear_fix);
            }
            $str = strtr($str, array_flip($ascii_fix));
            // Normal stuff
            $str = self::iconv('utf-8', $encoding . '//IGNORE', $str);
            return $str;
        } elseif ($encoding === 'iso-8859-1') {
            $str = utf8_decode($str);
            return $str;
        }
        trigger_error('Encoding not supported', E_USER_ERROR);
        // You might be tempted to assume that the ASCII representation
        // might be OK, however, this is *not* universally true over all
        // encodings.  So we take the conservative route here, rather
        // than forcibly turn on %Core.EscapeNonASCIICharacters
    }

    /**
     * Lossless (character-wise) conversion of HTML to ASCII
     * @param string $str UTF-8 string to be converted to ASCII
     * @return string ASCII encoded string with non-ASCII character entity-ized
     * @warning Adapted from MediaWiki, claiming fair use: this is a common
     *       algorithm. If you disagree with this license fudgery,
     *       implement it yourself.
     * @note Uses decimal numeric entities since they are best supported.
     * @note This is a DUMB function: it has no concept of keeping
     *       character entities that the projected character encoding
     *       can allow. We could possibly implement a smart version
     *       but that would require it to also know which Unicode
     *       codepoints the charset supported (not an easy task).
     * @note Sort of with cleanUTF8() but it assumes that $str is
     *       well-formed UTF-8
     */
    public static function convertToASCIIDumbLossless($str)
    {
        $bytesleft = 0;
        $result = '';
        $working = 0;
        $len = strlen($str);
        for ($i = 0; $i < $len; $i++) {
            $bytevalue = ord($str[$i]);
            if ($bytevalue <= 0x7F) { //0xxx xxxx
                $result .= chr($bytevalue);
                $bytesleft = 0;
            } elseif ($bytevalue <= 0xBF) { //10xx xxxx
                $working = $working << 6;
                $working += ($bytevalue & 0x3F);
                $bytesleft--;
                if ($bytesleft <= 0) {
                    $result .= "&#" . $working . ";";
                }
            } elseif ($bytevalue <= 0xDF) { //110x xxxx
                $working = $bytevalue & 0x1F;
                $bytesleft = 1;
            } elseif ($bytevalue <= 0xEF) { //1110 xxxx
                $working = $bytevalue & 0x0F;
                $bytesleft = 2;
            } else { //1111 0xxx
                $working = $bytevalue & 0x07;
                $bytesleft = 3;
            }
        }
        return $result;
    }

    /** No bugs detected in iconv. */
    const ICONV_OK = 0;

    /** Iconv truncates output if converting from UTF-8 to another
     *  character set with //IGNORE, and a non-encodable character is found */
    const ICONV_TRUNCATES = 1;

    /** Iconv does not support //IGNORE, making it unusable for
     *  transcoding purposes */
    const ICONV_UNUSABLE = 2;

    /**
     * glibc iconv has a known bug where it doesn't handle the magic
     * //IGNORE stanza correctly.  In particular, rather than ignore
     * characters, it will return an EILSEQ after consuming some number
     * of characters, and expect you to restart iconv as if it were
     * an E2BIG.  Old versions of PHP did not respect the errno, and
     * returned the fragment, so as a result you would see iconv
     * mysteriously truncating output. We can work around this by
     * manually chopping our input into segments of about 8000
     * characters, as long as PHP ignores the error code.  If PHP starts
     * paying attention to the error code, iconv becomes unusable.
     *
     * @return int Error code indicating severity of bug.
     */
    public static function testIconvTruncateBug()
    {
        static $code = null;
        if ($code === null) {
            // better not use iconv, otherwise infinite loop!
            $r = self::unsafeIconv('utf-8', 'ascii//IGNORE', "\xCE\xB1" . str_repeat('a', 9000));
            if ($r === false) {
                $code = self::ICONV_UNUSABLE;
            } elseif (($c = strlen($r)) < 9000) {
                $code = self::ICONV_TRUNCATES;
            } elseif ($c > 9000) {
                trigger_error(
                    'Your copy of iconv is extremely buggy. Please notify HTML Purifier maintainers: ' .
                    'include your iconv version as per phpversion()',
                    E_USER_ERROR
                );
            } else {
                $code = self::ICONV_OK;
            }
        }
        return $code;
    }

    /**
     * This expensive function tests whether or not a given character
     * encoding supports ASCII. 7/8-bit encodings like Shift_JIS will
     * fail this test, and require special processing. Variable width
     * encodings shouldn't ever fail.
     *
     * @param string $encoding Encoding name to test, as per iconv format
     * @param bool $bypass Whether or not to bypass the precompiled arrays.
     * @return Array of UTF-8 characters to their corresponding ASCII,
     *      which can be used to "undo" any overzealous iconv action.
     */
    public static function testEncodingSupportsASCII($encoding, $bypass = false)
    {
        // All calls to iconv here are unsafe, proof by case analysis:
        // If ICONV_OK, no difference.
        // If ICONV_TRUNCATE, all calls involve one character inputs,
        // so bug is not triggered.
        // If ICONV_UNUSABLE, this call is irrelevant
        static $encodings = array();
        if (!$bypass) {
            if (isset($encodings[$encoding])) {
                return $encodings[$encoding];
            }
            $lenc = strtolower($encoding);
            switch ($lenc) {
                case 'shift_jis':
                    return array("\xC2\xA5" => '\\', "\xE2\x80\xBE" => '~');
                case 'johab':
                    return array("\xE2\x82\xA9" => '\\');
            }
            if (strpos($lenc, 'iso-8859-') === 0) {
                return array();
            }
        }
        $ret = array();
        if (self::unsafeIconv('UTF-8', $encoding, 'a') === false) {
            return false;
        }
        for ($i = 0x20; $i <= 0x7E; $i++) { // all printable ASCII chars
            $c = chr($i); // UTF-8 char
            $r = self::unsafeIconv('UTF-8', "$encoding//IGNORE", $c); // initial conversion
            if ($r === '' ||
                // This line is needed for iconv implementations that do not
                // omit characters that do not exist in the target character set
                ($r === $c && self::unsafeIconv($encoding, 'UTF-8//IGNORE', $r) !== $c)
            ) {
                // Reverse engineer: what's the UTF-8 equiv of this byte
                // sequence? This assumes that there's no variable width
                // encoding that doesn't support ASCII.
                $ret[self::unsafeIconv($encoding, 'UTF-8//IGNORE', $c)] = $c;
            }
        }
        $encodings[$encoding] = $ret;
        return $ret;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/HTMLDefinition.php000064400000042523151214231100016456 0ustar00<?php

/**
 * Definition of the purified HTML that describes allowed children,
 * attributes, and many other things.
 *
 * Conventions:
 *
 * All member variables that are prefixed with info
 * (including the main $info array) are used by HTML Purifier internals
 * and should not be directly edited when customizing the HTMLDefinition.
 * They can usually be set via configuration directives or custom
 * modules.
 *
 * On the other hand, member variables without the info prefix are used
 * internally by the HTMLDefinition and MUST NOT be used by other HTML
 * Purifier internals. Many of them, however, are public, and may be
 * edited by userspace code to tweak the behavior of HTMLDefinition.
 *
 * @note This class is inspected by Printer_HTMLDefinition; please
 *       update that class if things here change.
 *
 * @warning Directives that change this object's structure must be in
 *          the HTML or Attr namespace!
 */
class HTMLPurifier_HTMLDefinition extends HTMLPurifier_Definition
{

    // FULLY-PUBLIC VARIABLES ---------------------------------------------

    /**
     * Associative array of element names to HTMLPurifier_ElementDef.
     * @type HTMLPurifier_ElementDef[]
     */
    public $info = array();

    /**
     * Associative array of global attribute name to attribute definition.
     * @type array
     */
    public $info_global_attr = array();

    /**
     * String name of parent element HTML will be going into.
     * @type string
     */
    public $info_parent = 'div';

    /**
     * Definition for parent element, allows parent element to be a
     * tag that's not allowed inside the HTML fragment.
     * @type HTMLPurifier_ElementDef
     */
    public $info_parent_def;

    /**
     * String name of element used to wrap inline elements in block context.
     * @type string
     * @note This is rarely used except for BLOCKQUOTEs in strict mode
     */
    public $info_block_wrapper = 'p';

    /**
     * Associative array of deprecated tag name to HTMLPurifier_TagTransform.
     * @type array
     */
    public $info_tag_transform = array();

    /**
     * Indexed list of HTMLPurifier_AttrTransform to be performed before validation.
     * @type HTMLPurifier_AttrTransform[]
     */
    public $info_attr_transform_pre = array();

    /**
     * Indexed list of HTMLPurifier_AttrTransform to be performed after validation.
     * @type HTMLPurifier_AttrTransform[]
     */
    public $info_attr_transform_post = array();

    /**
     * Nested lookup array of content set name (Block, Inline) to
     * element name to whether or not it belongs in that content set.
     * @type array
     */
    public $info_content_sets = array();

    /**
     * Indexed list of HTMLPurifier_Injector to be used.
     * @type HTMLPurifier_Injector[]
     */
    public $info_injector = array();

    /**
     * Doctype object
     * @type HTMLPurifier_Doctype
     */
    public $doctype;



    // RAW CUSTOMIZATION STUFF --------------------------------------------

    /**
     * Adds a custom attribute to a pre-existing element
     * @note This is strictly convenience, and does not have a corresponding
     *       method in HTMLPurifier_HTMLModule
     * @param string $element_name Element name to add attribute to
     * @param string $attr_name Name of attribute
     * @param mixed $def Attribute definition, can be string or object, see
     *             HTMLPurifier_AttrTypes for details
     */
    public function addAttribute($element_name, $attr_name, $def)
    {
        $module = $this->getAnonymousModule();
        if (!isset($module->info[$element_name])) {
            $element = $module->addBlankElement($element_name);
        } else {
            $element = $module->info[$element_name];
        }
        $element->attr[$attr_name] = $def;
    }

    /**
     * Adds a custom element to your HTML definition
     * @see HTMLPurifier_HTMLModule::addElement() for detailed
     *       parameter and return value descriptions.
     */
    public function addElement($element_name, $type, $contents, $attr_collections, $attributes = array())
    {
        $module = $this->getAnonymousModule();
        // assume that if the user is calling this, the element
        // is safe. This may not be a good idea
        $element = $module->addElement($element_name, $type, $contents, $attr_collections, $attributes);
        return $element;
    }

    /**
     * Adds a blank element to your HTML definition, for overriding
     * existing behavior
     * @param string $element_name
     * @return HTMLPurifier_ElementDef
     * @see HTMLPurifier_HTMLModule::addBlankElement() for detailed
     *       parameter and return value descriptions.
     */
    public function addBlankElement($element_name)
    {
        $module  = $this->getAnonymousModule();
        $element = $module->addBlankElement($element_name);
        return $element;
    }

    /**
     * Retrieves a reference to the anonymous module, so you can
     * bust out advanced features without having to make your own
     * module.
     * @return HTMLPurifier_HTMLModule
     */
    public function getAnonymousModule()
    {
        if (!$this->_anonModule) {
            $this->_anonModule = new HTMLPurifier_HTMLModule();
            $this->_anonModule->name = 'Anonymous';
        }
        return $this->_anonModule;
    }

    private $_anonModule = null;

    // PUBLIC BUT INTERNAL VARIABLES --------------------------------------

    /**
     * @type string
     */
    public $type = 'HTML';

    /**
     * @type HTMLPurifier_HTMLModuleManager
     */
    public $manager;

    /**
     * Performs low-cost, preliminary initialization.
     */
    public function __construct()
    {
        $this->manager = new HTMLPurifier_HTMLModuleManager();
    }

    /**
     * @param HTMLPurifier_Config $config
     */
    protected function doSetup($config)
    {
        $this->processModules($config);
        $this->setupConfigStuff($config);
        unset($this->manager);

        // cleanup some of the element definitions
        foreach ($this->info as $k => $v) {
            unset($this->info[$k]->content_model);
            unset($this->info[$k]->content_model_type);
        }
    }

    /**
     * Extract out the information from the manager
     * @param HTMLPurifier_Config $config
     */
    protected function processModules($config)
    {
        if ($this->_anonModule) {
            // for user specific changes
            // this is late-loaded so we don't have to deal with PHP4
            // reference wonky-ness
            $this->manager->addModule($this->_anonModule);
            unset($this->_anonModule);
        }

        $this->manager->setup($config);
        $this->doctype = $this->manager->doctype;

        foreach ($this->manager->modules as $module) {
            foreach ($module->info_tag_transform as $k => $v) {
                if ($v === false) {
                    unset($this->info_tag_transform[$k]);
                } else {
                    $this->info_tag_transform[$k] = $v;
                }
            }
            foreach ($module->info_attr_transform_pre as $k => $v) {
                if ($v === false) {
                    unset($this->info_attr_transform_pre[$k]);
                } else {
                    $this->info_attr_transform_pre[$k] = $v;
                }
            }
            foreach ($module->info_attr_transform_post as $k => $v) {
                if ($v === false) {
                    unset($this->info_attr_transform_post[$k]);
                } else {
                    $this->info_attr_transform_post[$k] = $v;
                }
            }
            foreach ($module->info_injector as $k => $v) {
                if ($v === false) {
                    unset($this->info_injector[$k]);
                } else {
                    $this->info_injector[$k] = $v;
                }
            }
        }
        $this->info = $this->manager->getElements();
        $this->info_content_sets = $this->manager->contentSets->lookup;
    }

    /**
     * Sets up stuff based on config. We need a better way of doing this.
     * @param HTMLPurifier_Config $config
     */
    protected function setupConfigStuff($config)
    {
        $block_wrapper = $config->get('HTML.BlockWrapper');
        if (isset($this->info_content_sets['Block'][$block_wrapper])) {
            $this->info_block_wrapper = $block_wrapper;
        } else {
            trigger_error(
                'Cannot use non-block element as block wrapper',
                E_USER_ERROR
            );
        }

        $parent = $config->get('HTML.Parent');
        $def = $this->manager->getElement($parent, true);
        if ($def) {
            $this->info_parent = $parent;
            $this->info_parent_def = $def;
        } else {
            trigger_error(
                'Cannot use unrecognized element as parent',
                E_USER_ERROR
            );
            $this->info_parent_def = $this->manager->getElement($this->info_parent, true);
        }

        // support template text
        $support = "(for information on implementing this, see the support forums) ";

        // setup allowed elements -----------------------------------------

        $allowed_elements = $config->get('HTML.AllowedElements');
        $allowed_attributes = $config->get('HTML.AllowedAttributes'); // retrieve early

        if (!is_array($allowed_elements) && !is_array($allowed_attributes)) {
            $allowed = $config->get('HTML.Allowed');
            if (is_string($allowed)) {
                list($allowed_elements, $allowed_attributes) = $this->parseTinyMCEAllowedList($allowed);
            }
        }

        if (is_array($allowed_elements)) {
            foreach ($this->info as $name => $d) {
                if (!isset($allowed_elements[$name])) {
                    unset($this->info[$name]);
                }
                unset($allowed_elements[$name]);
            }
            // emit errors
            foreach ($allowed_elements as $element => $d) {
                $element = htmlspecialchars($element); // PHP doesn't escape errors, be careful!
                trigger_error("Element '$element' is not supported $support", E_USER_WARNING);
            }
        }

        // setup allowed attributes ---------------------------------------

        $allowed_attributes_mutable = $allowed_attributes; // by copy!
        if (is_array($allowed_attributes)) {
            // This actually doesn't do anything, since we went away from
            // global attributes. It's possible that userland code uses
            // it, but HTMLModuleManager doesn't!
            foreach ($this->info_global_attr as $attr => $x) {
                $keys = array($attr, "*@$attr", "*.$attr");
                $delete = true;
                foreach ($keys as $key) {
                    if ($delete && isset($allowed_attributes[$key])) {
                        $delete = false;
                    }
                    if (isset($allowed_attributes_mutable[$key])) {
                        unset($allowed_attributes_mutable[$key]);
                    }
                }
                if ($delete) {
                    unset($this->info_global_attr[$attr]);
                }
            }

            foreach ($this->info as $tag => $info) {
                foreach ($info->attr as $attr => $x) {
                    $keys = array("$tag@$attr", $attr, "*@$attr", "$tag.$attr", "*.$attr");
                    $delete = true;
                    foreach ($keys as $key) {
                        if ($delete && isset($allowed_attributes[$key])) {
                            $delete = false;
                        }
                        if (isset($allowed_attributes_mutable[$key])) {
                            unset($allowed_attributes_mutable[$key]);
                        }
                    }
                    if ($delete) {
                        if ($this->info[$tag]->attr[$attr]->required) {
                            trigger_error(
                                "Required attribute '$attr' in element '$tag' " .
                                "was not allowed, which means '$tag' will not be allowed either",
                                E_USER_WARNING
                            );
                        }
                        unset($this->info[$tag]->attr[$attr]);
                    }
                }
            }
            // emit errors
            foreach ($allowed_attributes_mutable as $elattr => $d) {
                $bits = preg_split('/[.@]/', $elattr, 2);
                $c = count($bits);
                switch ($c) {
                    case 2:
                        if ($bits[0] !== '*') {
                            $element = htmlspecialchars($bits[0]);
                            $attribute = htmlspecialchars($bits[1]);
                            if (!isset($this->info[$element])) {
                                trigger_error(
                                    "Cannot allow attribute '$attribute' if element " .
                                    "'$element' is not allowed/supported $support"
                                );
                            } else {
                                trigger_error(
                                    "Attribute '$attribute' in element '$element' not supported $support",
                                    E_USER_WARNING
                                );
                            }
                            break;
                        }
                        // otherwise fall through
                    case 1:
                        $attribute = htmlspecialchars($bits[0]);
                        trigger_error(
                            "Global attribute '$attribute' is not ".
                            "supported in any elements $support",
                            E_USER_WARNING
                        );
                        break;
                }
            }
        }

        // setup forbidden elements ---------------------------------------

        $forbidden_elements   = $config->get('HTML.ForbiddenElements');
        $forbidden_attributes = $config->get('HTML.ForbiddenAttributes');

        foreach ($this->info as $tag => $info) {
            if (isset($forbidden_elements[$tag])) {
                unset($this->info[$tag]);
                continue;
            }
            foreach ($info->attr as $attr => $x) {
                if (isset($forbidden_attributes["$tag@$attr"]) ||
                    isset($forbidden_attributes["*@$attr"]) ||
                    isset($forbidden_attributes[$attr])
                ) {
                    unset($this->info[$tag]->attr[$attr]);
                    continue;
                } elseif (isset($forbidden_attributes["$tag.$attr"])) { // this segment might get removed eventually
                    // $tag.$attr are not user supplied, so no worries!
                    trigger_error(
                        "Error with $tag.$attr: tag.attr syntax not supported for " .
                        "HTML.ForbiddenAttributes; use tag@attr instead",
                        E_USER_WARNING
                    );
                }
            }
        }
        foreach ($forbidden_attributes as $key => $v) {
            if (strlen($key) < 2) {
                continue;
            }
            if ($key[0] != '*') {
                continue;
            }
            if ($key[1] == '.') {
                trigger_error(
                    "Error with $key: *.attr syntax not supported for HTML.ForbiddenAttributes; use attr instead",
                    E_USER_WARNING
                );
            }
        }

        // setup injectors -----------------------------------------------------
        foreach ($this->info_injector as $i => $injector) {
            if ($injector->checkNeeded($config) !== false) {
                // remove injector that does not have it's required
                // elements/attributes present, and is thus not needed.
                unset($this->info_injector[$i]);
            }
        }
    }

    /**
     * Parses a TinyMCE-flavored Allowed Elements and Attributes list into
     * separate lists for processing. Format is element[attr1|attr2],element2...
     * @warning Although it's largely drawn from TinyMCE's implementation,
     *      it is different, and you'll probably have to modify your lists
     * @param array $list String list to parse
     * @return array
     * @todo Give this its own class, probably static interface
     */
    public function parseTinyMCEAllowedList($list)
    {
        $list = str_replace(array(' ', "\t"), '', $list);

        $elements = array();
        $attributes = array();

        $chunks = preg_split('/(,|[\n\r]+)/', $list);
        foreach ($chunks as $chunk) {
            if (empty($chunk)) {
                continue;
            }
            // remove TinyMCE element control characters
            if (!strpos($chunk, '[')) {
                $element = $chunk;
                $attr = false;
            } else {
                list($element, $attr) = explode('[', $chunk);
            }
            if ($element !== '*') {
                $elements[$element] = true;
            }
            if (!$attr) {
                continue;
            }
            $attr = substr($attr, 0, strlen($attr) - 1); // remove trailing ]
            $attr = explode('|', $attr);
            foreach ($attr as $key) {
                $attributes["$element.$key"] = true;
            }
        }
        return array($elements, $attributes);
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/PropertyListIterator.php000064400000001541151214231100020066 0ustar00<?php

/**
 * Property list iterator. Do not instantiate this class directly.
 */
class HTMLPurifier_PropertyListIterator extends FilterIterator
{

    /**
     * @type int
     */
    protected $l;
    /**
     * @type string
     */
    protected $filter;

    /**
     * @param Iterator $iterator Array of data to iterate over
     * @param string $filter Optional prefix to only allow values of
     */
    public function __construct(Iterator $iterator, $filter = null)
    {
        parent::__construct($iterator);
        $this->l = strlen($filter);
        $this->filter = $filter;
    }

    /**
     * @return bool
     */
    public function accept()
    {
        $key = $this->getInnerIterator()->key();
        if (strncmp($key, $this->filter, $this->l) !== 0) {
            return false;
        }
        return true;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/TagTransform/Simple.php000064400000002226151214231100017535 0ustar00<?php

/**
 * Simple transformation, just change tag name to something else,
 * and possibly add some styling. This will cover most of the deprecated
 * tag cases.
 */
class HTMLPurifier_TagTransform_Simple extends HTMLPurifier_TagTransform
{
    /**
     * @type string
     */
    protected $style;

    /**
     * @param string $transform_to Tag name to transform to.
     * @param string $style CSS style to add to the tag
     */
    public function __construct($transform_to, $style = null)
    {
        $this->transform_to = $transform_to;
        $this->style = $style;
    }

    /**
     * @param HTMLPurifier_Token_Tag $tag
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return string
     */
    public function transform($tag, $config, $context)
    {
        $new_tag = clone $tag;
        $new_tag->name = $this->transform_to;
        if (!is_null($this->style) &&
            ($new_tag instanceof HTMLPurifier_Token_Start || $new_tag instanceof HTMLPurifier_Token_Empty)
        ) {
            $this->prependCSS($new_tag->attr, $this->style);
        }
        return $new_tag;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/TagTransform/Font.php000064400000006453151214231100017220 0ustar00<?php

/**
 * Transforms FONT tags to the proper form (SPAN with CSS styling)
 *
 * This transformation takes the three proprietary attributes of FONT and
 * transforms them into their corresponding CSS attributes.  These are color,
 * face, and size.
 *
 * @note Size is an interesting case because it doesn't map cleanly to CSS.
 *       Thanks to
 *       http://style.cleverchimp.com/font_size_intervals/altintervals.html
 *       for reasonable mappings.
 * @warning This doesn't work completely correctly; specifically, this
 *          TagTransform operates before well-formedness is enforced, so
 *          the "active formatting elements" algorithm doesn't get applied.
 */
class HTMLPurifier_TagTransform_Font extends HTMLPurifier_TagTransform
{
    /**
     * @type string
     */
    public $transform_to = 'span';

    /**
     * @type array
     */
    protected $_size_lookup = array(
        '0' => 'xx-small',
        '1' => 'xx-small',
        '2' => 'small',
        '3' => 'medium',
        '4' => 'large',
        '5' => 'x-large',
        '6' => 'xx-large',
        '7' => '300%',
        '-1' => 'smaller',
        '-2' => '60%',
        '+1' => 'larger',
        '+2' => '150%',
        '+3' => '200%',
        '+4' => '300%'
    );

    /**
     * @param HTMLPurifier_Token_Tag $tag
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return HTMLPurifier_Token_End|string
     */
    public function transform($tag, $config, $context)
    {
        if ($tag instanceof HTMLPurifier_Token_End) {
            $new_tag = clone $tag;
            $new_tag->name = $this->transform_to;
            return $new_tag;
        }

        $attr = $tag->attr;
        $prepend_style = '';

        // handle color transform
        if (isset($attr['color'])) {
            $prepend_style .= 'color:' . $attr['color'] . ';';
            unset($attr['color']);
        }

        // handle face transform
        if (isset($attr['face'])) {
            $prepend_style .= 'font-family:' . $attr['face'] . ';';
            unset($attr['face']);
        }

        // handle size transform
        if (isset($attr['size'])) {
            // normalize large numbers
            if ($attr['size'] !== '') {
                if ($attr['size'][0] == '+' || $attr['size'][0] == '-') {
                    $size = (int)$attr['size'];
                    if ($size < -2) {
                        $attr['size'] = '-2';
                    }
                    if ($size > 4) {
                        $attr['size'] = '+4';
                    }
                } else {
                    $size = (int)$attr['size'];
                    if ($size > 7) {
                        $attr['size'] = '7';
                    }
                }
            }
            if (isset($this->_size_lookup[$attr['size']])) {
                $prepend_style .= 'font-size:' .
                    $this->_size_lookup[$attr['size']] . ';';
            }
            unset($attr['size']);
        }

        if ($prepend_style) {
            $attr['style'] = isset($attr['style']) ?
                $prepend_style . $attr['style'] :
                $prepend_style;
        }

        $new_tag = clone $tag;
        $new_tag->name = $this->transform_to;
        $new_tag->attr = $attr;

        return $new_tag;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Length.php000064400000007433151214231100015123 0ustar00<?php

/**
 * Represents a measurable length, with a string numeric magnitude
 * and a unit. This object is immutable.
 */
class HTMLPurifier_Length
{

    /**
     * String numeric magnitude.
     * @type string
     */
    protected $n;

    /**
     * String unit. False is permitted if $n = 0.
     * @type string|bool
     */
    protected $unit;

    /**
     * Whether or not this length is valid. Null if not calculated yet.
     * @type bool
     */
    protected $isValid;

    /**
     * Array Lookup array of units recognized by CSS 3
     * @type array
     */
    protected static $allowedUnits = array(
        'em' => true, 'ex' => true, 'px' => true, 'in' => true,
        'cm' => true, 'mm' => true, 'pt' => true, 'pc' => true,
        'ch' => true, 'rem' => true, 'vw' => true, 'vh' => true,
        'vmin' => true, 'vmax' => true
    );

    /**
     * @param string $n Magnitude
     * @param bool|string $u Unit
     */
    public function __construct($n = '0', $u = false)
    {
        $this->n = (string) $n;
        $this->unit = $u !== false ? (string) $u : false;
    }

    /**
     * @param string $s Unit string, like '2em' or '3.4in'
     * @return HTMLPurifier_Length
     * @warning Does not perform validation.
     */
    public static function make($s)
    {
        if ($s instanceof HTMLPurifier_Length) {
            return $s;
        }
        $n_length = strspn($s, '1234567890.+-');
        $n = substr($s, 0, $n_length);
        $unit = substr($s, $n_length);
        if ($unit === '') {
            $unit = false;
        }
        return new HTMLPurifier_Length($n, $unit);
    }

    /**
     * Validates the number and unit.
     * @return bool
     */
    protected function validate()
    {
        // Special case:
        if ($this->n === '+0' || $this->n === '-0') {
            $this->n = '0';
        }
        if ($this->n === '0' && $this->unit === false) {
            return true;
        }
        if (!ctype_lower($this->unit)) {
            $this->unit = strtolower($this->unit);
        }
        if (!isset(HTMLPurifier_Length::$allowedUnits[$this->unit])) {
            return false;
        }
        // Hack:
        $def = new HTMLPurifier_AttrDef_CSS_Number();
        $result = $def->validate($this->n, false, false);
        if ($result === false) {
            return false;
        }
        $this->n = $result;
        return true;
    }

    /**
     * Returns string representation of number.
     * @return string
     */
    public function toString()
    {
        if (!$this->isValid()) {
            return false;
        }
        return $this->n . $this->unit;
    }

    /**
     * Retrieves string numeric magnitude.
     * @return string
     */
    public function getN()
    {
        return $this->n;
    }

    /**
     * Retrieves string unit.
     * @return string
     */
    public function getUnit()
    {
        return $this->unit;
    }

    /**
     * Returns true if this length unit is valid.
     * @return bool
     */
    public function isValid()
    {
        if ($this->isValid === null) {
            $this->isValid = $this->validate();
        }
        return $this->isValid;
    }

    /**
     * Compares two lengths, and returns 1 if greater, -1 if less and 0 if equal.
     * @param HTMLPurifier_Length $l
     * @return int
     * @warning If both values are too large or small, this calculation will
     *          not work properly
     */
    public function compareTo($l)
    {
        if ($l === false) {
            return false;
        }
        if ($l->unit !== $this->unit) {
            $converter = new HTMLPurifier_UnitConverter();
            $l = $converter->convert($l, $this->unit);
            if ($l === false) {
                return false;
            }
        }
        return $this->n - $l->n;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Printer.php000064400000013411151214231100015316 0ustar00<?php

// OUT OF DATE, NEEDS UPDATING!
// USE XMLWRITER!

class HTMLPurifier_Printer
{

    /**
     * For HTML generation convenience funcs.
     * @type HTMLPurifier_Generator
     */
    protected $generator;

    /**
     * For easy access.
     * @type HTMLPurifier_Config
     */
    protected $config;

    /**
     * Initialize $generator.
     */
    public function __construct()
    {
    }

    /**
     * Give generator necessary configuration if possible
     * @param HTMLPurifier_Config $config
     */
    public function prepareGenerator($config)
    {
        $all = $config->getAll();
        $context = new HTMLPurifier_Context();
        $this->generator = new HTMLPurifier_Generator($config, $context);
    }

    /**
     * Main function that renders object or aspect of that object
     * @note Parameters vary depending on printer
     */
    // function render() {}

    /**
     * Returns a start tag
     * @param string $tag Tag name
     * @param array $attr Attribute array
     * @return string
     */
    protected function start($tag, $attr = array())
    {
        return $this->generator->generateFromToken(
            new HTMLPurifier_Token_Start($tag, $attr ? $attr : array())
        );
    }

    /**
     * Returns an end tag
     * @param string $tag Tag name
     * @return string
     */
    protected function end($tag)
    {
        return $this->generator->generateFromToken(
            new HTMLPurifier_Token_End($tag)
        );
    }

    /**
     * Prints a complete element with content inside
     * @param string $tag Tag name
     * @param string $contents Element contents
     * @param array $attr Tag attributes
     * @param bool $escape whether or not to escape contents
     * @return string
     */
    protected function element($tag, $contents, $attr = array(), $escape = true)
    {
        return $this->start($tag, $attr) .
            ($escape ? $this->escape($contents) : $contents) .
            $this->end($tag);
    }

    /**
     * @param string $tag
     * @param array $attr
     * @return string
     */
    protected function elementEmpty($tag, $attr = array())
    {
        return $this->generator->generateFromToken(
            new HTMLPurifier_Token_Empty($tag, $attr)
        );
    }

    /**
     * @param string $text
     * @return string
     */
    protected function text($text)
    {
        return $this->generator->generateFromToken(
            new HTMLPurifier_Token_Text($text)
        );
    }

    /**
     * Prints a simple key/value row in a table.
     * @param string $name Key
     * @param mixed $value Value
     * @return string
     */
    protected function row($name, $value)
    {
        if (is_bool($value)) {
            $value = $value ? 'On' : 'Off';
        }
        return
            $this->start('tr') . "\n" .
            $this->element('th', $name) . "\n" .
            $this->element('td', $value) . "\n" .
            $this->end('tr');
    }

    /**
     * Escapes a string for HTML output.
     * @param string $string String to escape
     * @return string
     */
    protected function escape($string)
    {
        $string = HTMLPurifier_Encoder::cleanUTF8($string);
        $string = htmlspecialchars($string, ENT_COMPAT, 'UTF-8');
        return $string;
    }

    /**
     * Takes a list of strings and turns them into a single list
     * @param string[] $array List of strings
     * @param bool $polite Bool whether or not to add an end before the last
     * @return string
     */
    protected function listify($array, $polite = false)
    {
        if (empty($array)) {
            return 'None';
        }
        $ret = '';
        $i = count($array);
        foreach ($array as $value) {
            $i--;
            $ret .= $value;
            if ($i > 0 && !($polite && $i == 1)) {
                $ret .= ', ';
            }
            if ($polite && $i == 1) {
                $ret .= 'and ';
            }
        }
        return $ret;
    }

    /**
     * Retrieves the class of an object without prefixes, as well as metadata
     * @param object $obj Object to determine class of
     * @param string $sec_prefix Further prefix to remove
     * @return string
     */
    protected function getClass($obj, $sec_prefix = '')
    {
        static $five = null;
        if ($five === null) {
            $five = version_compare(PHP_VERSION, '5', '>=');
        }
        $prefix = 'HTMLPurifier_' . $sec_prefix;
        if (!$five) {
            $prefix = strtolower($prefix);
        }
        $class = str_replace($prefix, '', get_class($obj));
        $lclass = strtolower($class);
        $class .= '(';
        switch ($lclass) {
            case 'enum':
                $values = array();
                foreach ($obj->valid_values as $value => $bool) {
                    $values[] = $value;
                }
                $class .= implode(', ', $values);
                break;
            case 'css_composite':
                $values = array();
                foreach ($obj->defs as $def) {
                    $values[] = $this->getClass($def, $sec_prefix);
                }
                $class .= implode(', ', $values);
                break;
            case 'css_multiple':
                $class .= $this->getClass($obj->single, $sec_prefix) . ', ';
                $class .= $obj->max;
                break;
            case 'css_denyelementdecorator':
                $class .= $this->getClass($obj->def, $sec_prefix) . ', ';
                $class .= $obj->element;
                break;
            case 'css_importantdecorator':
                $class .= $this->getClass($obj->def, $sec_prefix);
                if ($obj->allow) {
                    $class .= ', !important';
                }
                break;
        }
        $class .= ')';
        return $class;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/ErrorCollector.php000064400000016711151214231100016641 0ustar00<?php

/**
 * Error collection class that enables HTML Purifier to report HTML
 * problems back to the user
 */
class HTMLPurifier_ErrorCollector
{

    /**
     * Identifiers for the returned error array. These are purposely numeric
     * so list() can be used.
     */
    const LINENO   = 0;
    const SEVERITY = 1;
    const MESSAGE  = 2;
    const CHILDREN = 3;

    /**
     * @type array
     */
    protected $errors;

    /**
     * @type array
     */
    protected $_current;

    /**
     * @type array
     */
    protected $_stacks = array(array());

    /**
     * @type HTMLPurifier_Language
     */
    protected $locale;

    /**
     * @type HTMLPurifier_Generator
     */
    protected $generator;

    /**
     * @type HTMLPurifier_Context
     */
    protected $context;

    /**
     * @type array
     */
    protected $lines = array();

    /**
     * @param HTMLPurifier_Context $context
     */
    public function __construct($context)
    {
        $this->locale    =& $context->get('Locale');
        $this->context   = $context;
        $this->_current  =& $this->_stacks[0];
        $this->errors    =& $this->_stacks[0];
    }

    /**
     * Sends an error message to the collector for later use
     * @param int $severity Error severity, PHP error style (don't use E_USER_)
     * @param string $msg Error message text
     */
    public function send($severity, $msg)
    {
        $args = array();
        if (func_num_args() > 2) {
            $args = func_get_args();
            array_shift($args);
            unset($args[0]);
        }

        $token = $this->context->get('CurrentToken', true);
        $line  = $token ? $token->line : $this->context->get('CurrentLine', true);
        $col   = $token ? $token->col  : $this->context->get('CurrentCol', true);
        $attr  = $this->context->get('CurrentAttr', true);

        // perform special substitutions, also add custom parameters
        $subst = array();
        if (!is_null($token)) {
            $args['CurrentToken'] = $token;
        }
        if (!is_null($attr)) {
            $subst['$CurrentAttr.Name'] = $attr;
            if (isset($token->attr[$attr])) {
                $subst['$CurrentAttr.Value'] = $token->attr[$attr];
            }
        }

        if (empty($args)) {
            $msg = $this->locale->getMessage($msg);
        } else {
            $msg = $this->locale->formatMessage($msg, $args);
        }

        if (!empty($subst)) {
            $msg = strtr($msg, $subst);
        }

        // (numerically indexed)
        $error = array(
            self::LINENO   => $line,
            self::SEVERITY => $severity,
            self::MESSAGE  => $msg,
            self::CHILDREN => array()
        );
        $this->_current[] = $error;

        // NEW CODE BELOW ...
        // Top-level errors are either:
        //  TOKEN type, if $value is set appropriately, or
        //  "syntax" type, if $value is null
        $new_struct = new HTMLPurifier_ErrorStruct();
        $new_struct->type = HTMLPurifier_ErrorStruct::TOKEN;
        if ($token) {
            $new_struct->value = clone $token;
        }
        if (is_int($line) && is_int($col)) {
            if (isset($this->lines[$line][$col])) {
                $struct = $this->lines[$line][$col];
            } else {
                $struct = $this->lines[$line][$col] = $new_struct;
            }
            // These ksorts may present a performance problem
            ksort($this->lines[$line], SORT_NUMERIC);
        } else {
            if (isset($this->lines[-1])) {
                $struct = $this->lines[-1];
            } else {
                $struct = $this->lines[-1] = $new_struct;
            }
        }
        ksort($this->lines, SORT_NUMERIC);

        // Now, check if we need to operate on a lower structure
        if (!empty($attr)) {
            $struct = $struct->getChild(HTMLPurifier_ErrorStruct::ATTR, $attr);
            if (!$struct->value) {
                $struct->value = array($attr, 'PUT VALUE HERE');
            }
        }
        if (!empty($cssprop)) {
            $struct = $struct->getChild(HTMLPurifier_ErrorStruct::CSSPROP, $cssprop);
            if (!$struct->value) {
                // if we tokenize CSS this might be a little more difficult to do
                $struct->value = array($cssprop, 'PUT VALUE HERE');
            }
        }

        // Ok, structs are all setup, now time to register the error
        $struct->addError($severity, $msg);
    }

    /**
     * Retrieves raw error data for custom formatter to use
     */
    public function getRaw()
    {
        return $this->errors;
    }

    /**
     * Default HTML formatting implementation for error messages
     * @param HTMLPurifier_Config $config Configuration, vital for HTML output nature
     * @param array $errors Errors array to display; used for recursion.
     * @return string
     */
    public function getHTMLFormatted($config, $errors = null)
    {
        $ret = array();

        $this->generator = new HTMLPurifier_Generator($config, $this->context);
        if ($errors === null) {
            $errors = $this->errors;
        }

        // 'At line' message needs to be removed

        // generation code for new structure goes here. It needs to be recursive.
        foreach ($this->lines as $line => $col_array) {
            if ($line == -1) {
                continue;
            }
            foreach ($col_array as $col => $struct) {
                $this->_renderStruct($ret, $struct, $line, $col);
            }
        }
        if (isset($this->lines[-1])) {
            $this->_renderStruct($ret, $this->lines[-1]);
        }

        if (empty($errors)) {
            return '<p>' . $this->locale->getMessage('ErrorCollector: No errors') . '</p>';
        } else {
            return '<ul><li>' . implode('</li><li>', $ret) . '</li></ul>';
        }

    }

    private function _renderStruct(&$ret, $struct, $line = null, $col = null)
    {
        $stack = array($struct);
        $context_stack = array(array());
        while ($current = array_pop($stack)) {
            $context = array_pop($context_stack);
            foreach ($current->errors as $error) {
                list($severity, $msg) = $error;
                $string = '';
                $string .= '<div>';
                // W3C uses an icon to indicate the severity of the error.
                $error = $this->locale->getErrorName($severity);
                $string .= "<span class=\"error e$severity\"><strong>$error</strong></span> ";
                if (!is_null($line) && !is_null($col)) {
                    $string .= "<em class=\"location\">Line $line, Column $col: </em> ";
                } else {
                    $string .= '<em class="location">End of Document: </em> ';
                }
                $string .= '<strong class="description">' . $this->generator->escape($msg) . '</strong> ';
                $string .= '</div>';
                // Here, have a marker for the character on the column appropriate.
                // Be sure to clip extremely long lines.
                //$string .= '<pre>';
                //$string .= '';
                //$string .= '</pre>';
                $ret[] = $string;
            }
            foreach ($current->children as $array) {
                $context[] = $current;
                $stack = array_merge($stack, array_reverse($array, true));
                for ($i = count($array); $i > 0; $i--) {
                    $context_stack[] = $context;
                }
            }
        }
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Queue.php000064400000003017151214231100014760 0ustar00<?php

/**
 * A simple array-backed queue, based off of the classic Okasaki
 * persistent amortized queue.  The basic idea is to maintain two
 * stacks: an input stack and an output stack.  When the output
 * stack runs out, reverse the input stack and use it as the output
 * stack.
 *
 * We don't use the SPL implementation because it's only supported
 * on PHP 5.3 and later.
 *
 * Exercise: Prove that push/pop on this queue take amortized O(1) time.
 *
 * Exercise: Extend this queue to be a deque, while preserving amortized
 * O(1) time.  Some care must be taken on rebalancing to avoid quadratic
 * behaviour caused by repeatedly shuffling data from the input stack
 * to the output stack and back.
 */
class HTMLPurifier_Queue {
    private $input;
    private $output;

    public function __construct($input = array()) {
        $this->input = $input;
        $this->output = array();
    }

    /**
     * Shifts an element off the front of the queue.
     */
    public function shift() {
        if (empty($this->output)) {
            $this->output = array_reverse($this->input);
            $this->input = array();
        }
        if (empty($this->output)) {
            return NULL;
        }
        return array_pop($this->output);
    }

    /**
     * Pushes an element onto the front of the queue.
     */
    public function push($x) {
        array_push($this->input, $x);
    }

    /**
     * Checks if it's empty.
     */
    public function isEmpty() {
        return empty($this->input) && empty($this->output);
    }
}
htmlpurifier/library/HTMLPurifier/StringHashParser.php000064400000007071151214231100017127 0ustar00<?php

/**
 * Parses string hash files. File format is as such:
 *
 *      DefaultKeyValue
 *      KEY: Value
 *      KEY2: Value2
 *      --MULTILINE-KEY--
 *      Multiline
 *      value.
 *
 * Which would output something similar to:
 *
 *      array(
 *          'ID' => 'DefaultKeyValue',
 *          'KEY' => 'Value',
 *          'KEY2' => 'Value2',
 *          'MULTILINE-KEY' => "Multiline\nvalue.\n",
 *      )
 *
 * We use this as an easy to use file-format for configuration schema
 * files, but the class itself is usage agnostic.
 *
 * You can use ---- to forcibly terminate parsing of a single string-hash;
 * this marker is used in multi string-hashes to delimit boundaries.
 */
class HTMLPurifier_StringHashParser
{

    /**
     * @type string
     */
    public $default = 'ID';

    /**
     * Parses a file that contains a single string-hash.
     * @param string $file
     * @return array
     */
    public function parseFile($file)
    {
        if (!file_exists($file)) {
            return false;
        }
        $fh = fopen($file, 'r');
        if (!$fh) {
            return false;
        }
        $ret = $this->parseHandle($fh);
        fclose($fh);
        return $ret;
    }

    /**
     * Parses a file that contains multiple string-hashes delimited by '----'
     * @param string $file
     * @return array
     */
    public function parseMultiFile($file)
    {
        if (!file_exists($file)) {
            return false;
        }
        $ret = array();
        $fh = fopen($file, 'r');
        if (!$fh) {
            return false;
        }
        while (!feof($fh)) {
            $ret[] = $this->parseHandle($fh);
        }
        fclose($fh);
        return $ret;
    }

    /**
     * Internal parser that acepts a file handle.
     * @note While it's possible to simulate in-memory parsing by using
     *       custom stream wrappers, if such a use-case arises we should
     *       factor out the file handle into its own class.
     * @param resource $fh File handle with pointer at start of valid string-hash
     *            block.
     * @return array
     */
    protected function parseHandle($fh)
    {
        $state   = false;
        $single  = false;
        $ret     = array();
        do {
            $line = fgets($fh);
            if ($line === false) {
                break;
            }
            $line = rtrim($line, "\n\r");
            if (!$state && $line === '') {
                continue;
            }
            if ($line === '----') {
                break;
            }
            if (strncmp('--#', $line, 3) === 0) {
                // Comment
                continue;
            } elseif (strncmp('--', $line, 2) === 0) {
                // Multiline declaration
                $state = trim($line, '- ');
                if (!isset($ret[$state])) {
                    $ret[$state] = '';
                }
                continue;
            } elseif (!$state) {
                $single = true;
                if (strpos($line, ':') !== false) {
                    // Single-line declaration
                    list($state, $line) = explode(':', $line, 2);
                    $line = trim($line);
                } else {
                    // Use default declaration
                    $state  = $this->default;
                }
            }
            if ($single) {
                $ret[$state] = $line;
                $single = false;
                $state  = false;
            } else {
                $ret[$state] .= "$line\n";
            }
        } while (!feof($fh));
        return $ret;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/LanguageFactory.php000064400000014732151214231100016755 0ustar00<?php

/**
 * Class responsible for generating HTMLPurifier_Language objects, managing
 * caching and fallbacks.
 * @note Thanks to MediaWiki for the general logic, although this version
 *       has been entirely rewritten
 * @todo Serialized cache for languages
 */
class HTMLPurifier_LanguageFactory
{

    /**
     * Cache of language code information used to load HTMLPurifier_Language objects.
     * Structure is: $factory->cache[$language_code][$key] = $value
     * @type array
     */
    public $cache;

    /**
     * Valid keys in the HTMLPurifier_Language object. Designates which
     * variables to slurp out of a message file.
     * @type array
     */
    public $keys = array('fallback', 'messages', 'errorNames');

    /**
     * Instance to validate language codes.
     * @type HTMLPurifier_AttrDef_Lang
     *
     */
    protected $validator;

    /**
     * Cached copy of dirname(__FILE__), directory of current file without
     * trailing slash.
     * @type string
     */
    protected $dir;

    /**
     * Keys whose contents are a hash map and can be merged.
     * @type array
     */
    protected $mergeable_keys_map = array('messages' => true, 'errorNames' => true);

    /**
     * Keys whose contents are a list and can be merged.
     * @value array lookup
     */
    protected $mergeable_keys_list = array();

    /**
     * Retrieve sole instance of the factory.
     * @param HTMLPurifier_LanguageFactory $prototype Optional prototype to overload sole instance with,
     *                   or bool true to reset to default factory.
     * @return HTMLPurifier_LanguageFactory
     */
    public static function instance($prototype = null)
    {
        static $instance = null;
        if ($prototype !== null) {
            $instance = $prototype;
        } elseif ($instance === null || $prototype == true) {
            $instance = new HTMLPurifier_LanguageFactory();
            $instance->setup();
        }
        return $instance;
    }

    /**
     * Sets up the singleton, much like a constructor
     * @note Prevents people from getting this outside of the singleton
     */
    public function setup()
    {
        $this->validator = new HTMLPurifier_AttrDef_Lang();
        $this->dir = HTMLPURIFIER_PREFIX . '/HTMLPurifier';
    }

    /**
     * Creates a language object, handles class fallbacks
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @param bool|string $code Code to override configuration with. Private parameter.
     * @return HTMLPurifier_Language
     */
    public function create($config, $context, $code = false)
    {
        // validate language code
        if ($code === false) {
            $code = $this->validator->validate(
                $config->get('Core.Language'),
                $config,
                $context
            );
        } else {
            $code = $this->validator->validate($code, $config, $context);
        }
        if ($code === false) {
            $code = 'en'; // malformed code becomes English
        }

        $pcode = str_replace('-', '_', $code); // make valid PHP classname
        static $depth = 0; // recursion protection

        if ($code == 'en') {
            $lang = new HTMLPurifier_Language($config, $context);
        } else {
            $class = 'HTMLPurifier_Language_' . $pcode;
            $file  = $this->dir . '/Language/classes/' . $code . '.php';
            if (file_exists($file) || class_exists($class, false)) {
                $lang = new $class($config, $context);
            } else {
                // Go fallback
                $raw_fallback = $this->getFallbackFor($code);
                $fallback = $raw_fallback ? $raw_fallback : 'en';
                $depth++;
                $lang = $this->create($config, $context, $fallback);
                if (!$raw_fallback) {
                    $lang->error = true;
                }
                $depth--;
            }
        }
        $lang->code = $code;
        return $lang;
    }

    /**
     * Returns the fallback language for language
     * @note Loads the original language into cache
     * @param string $code language code
     * @return string|bool
     */
    public function getFallbackFor($code)
    {
        $this->loadLanguage($code);
        return $this->cache[$code]['fallback'];
    }

    /**
     * Loads language into the cache, handles message file and fallbacks
     * @param string $code language code
     */
    public function loadLanguage($code)
    {
        static $languages_seen = array(); // recursion guard

        // abort if we've already loaded it
        if (isset($this->cache[$code])) {
            return;
        }

        // generate filename
        $filename = $this->dir . '/Language/messages/' . $code . '.php';

        // default fallback : may be overwritten by the ensuing include
        $fallback = ($code != 'en') ? 'en' : false;

        // load primary localisation
        if (!file_exists($filename)) {
            // skip the include: will rely solely on fallback
            $filename = $this->dir . '/Language/messages/en.php';
            $cache = array();
        } else {
            include $filename;
            $cache = compact($this->keys);
        }

        // load fallback localisation
        if (!empty($fallback)) {

            // infinite recursion guard
            if (isset($languages_seen[$code])) {
                trigger_error(
                    'Circular fallback reference in language ' .
                    $code,
                    E_USER_ERROR
                );
                $fallback = 'en';
            }
            $language_seen[$code] = true;

            // load the fallback recursively
            $this->loadLanguage($fallback);
            $fallback_cache = $this->cache[$fallback];

            // merge fallback with current language
            foreach ($this->keys as $key) {
                if (isset($cache[$key]) && isset($fallback_cache[$key])) {
                    if (isset($this->mergeable_keys_map[$key])) {
                        $cache[$key] = $cache[$key] + $fallback_cache[$key];
                    } elseif (isset($this->mergeable_keys_list[$key])) {
                        $cache[$key] = array_merge($fallback_cache[$key], $cache[$key]);
                    }
                } else {
                    $cache[$key] = $fallback_cache[$key];
                }
            }
        }

        // save to cache for later retrieval
        $this->cache[$code] = $cache;
        return;
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/Exception.php000064400000000261151214231100015630 0ustar00<?php

/**
 * Global exception class for HTML Purifier; any exceptions we throw
 * are from here.
 */
class HTMLPurifier_Exception extends Exception
{

}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier/VarParser.php000064400000013546151214231100015611 0ustar00<?php

/**
 * Parses string representations into their corresponding native PHP
 * variable type. The base implementation does a simple type-check.
 */
class HTMLPurifier_VarParser
{

    const C_STRING = 1;
    const ISTRING = 2;
    const TEXT = 3;
    const ITEXT = 4;
    const C_INT = 5;
    const C_FLOAT = 6;
    const C_BOOL = 7;
    const LOOKUP = 8;
    const ALIST = 9;
    const HASH = 10;
    const C_MIXED = 11;

    /**
     * Lookup table of allowed types. Mainly for backwards compatibility, but
     * also convenient for transforming string type names to the integer constants.
     */
    public static $types = array(
        'string' => self::C_STRING,
        'istring' => self::ISTRING,
        'text' => self::TEXT,
        'itext' => self::ITEXT,
        'int' => self::C_INT,
        'float' => self::C_FLOAT,
        'bool' => self::C_BOOL,
        'lookup' => self::LOOKUP,
        'list' => self::ALIST,
        'hash' => self::HASH,
        'mixed' => self::C_MIXED
    );

    /**
     * Lookup table of types that are string, and can have aliases or
     * allowed value lists.
     */
    public static $stringTypes = array(
        self::C_STRING => true,
        self::ISTRING => true,
        self::TEXT => true,
        self::ITEXT => true,
    );

    /**
     * Validate a variable according to type.
     * It may return NULL as a valid type if $allow_null is true.
     *
     * @param mixed $var Variable to validate
     * @param int $type Type of variable, see HTMLPurifier_VarParser->types
     * @param bool $allow_null Whether or not to permit null as a value
     * @return string Validated and type-coerced variable
     * @throws HTMLPurifier_VarParserException
     */
    final public function parse($var, $type, $allow_null = false)
    {
        if (is_string($type)) {
            if (!isset(HTMLPurifier_VarParser::$types[$type])) {
                throw new HTMLPurifier_VarParserException("Invalid type '$type'");
            } else {
                $type = HTMLPurifier_VarParser::$types[$type];
            }
        }
        $var = $this->parseImplementation($var, $type, $allow_null);
        if ($allow_null && $var === null) {
            return null;
        }
        // These are basic checks, to make sure nothing horribly wrong
        // happened in our implementations.
        switch ($type) {
            case (self::C_STRING):
            case (self::ISTRING):
            case (self::TEXT):
            case (self::ITEXT):
                if (!is_string($var)) {
                    break;
                }
                if ($type == self::ISTRING || $type == self::ITEXT) {
                    $var = strtolower($var);
                }
                return $var;
            case (self::C_INT):
                if (!is_int($var)) {
                    break;
                }
                return $var;
            case (self::C_FLOAT):
                if (!is_float($var)) {
                    break;
                }
                return $var;
            case (self::C_BOOL):
                if (!is_bool($var)) {
                    break;
                }
                return $var;
            case (self::LOOKUP):
            case (self::ALIST):
            case (self::HASH):
                if (!is_array($var)) {
                    break;
                }
                if ($type === self::LOOKUP) {
                    foreach ($var as $k) {
                        if ($k !== true) {
                            $this->error('Lookup table contains value other than true');
                        }
                    }
                } elseif ($type === self::ALIST) {
                    $keys = array_keys($var);
                    if (array_keys($keys) !== $keys) {
                        $this->error('Indices for list are not uniform');
                    }
                }
                return $var;
            case (self::C_MIXED):
                return $var;
            default:
                $this->errorInconsistent(get_class($this), $type);
        }
        $this->errorGeneric($var, $type);
    }

    /**
     * Actually implements the parsing. Base implementation does not
     * do anything to $var. Subclasses should overload this!
     * @param mixed $var
     * @param int $type
     * @param bool $allow_null
     * @return string
     */
    protected function parseImplementation($var, $type, $allow_null)
    {
        return $var;
    }

    /**
     * Throws an exception.
     * @throws HTMLPurifier_VarParserException
     */
    protected function error($msg)
    {
        throw new HTMLPurifier_VarParserException($msg);
    }

    /**
     * Throws an inconsistency exception.
     * @note This should not ever be called. It would be called if we
     *       extend the allowed values of HTMLPurifier_VarParser without
     *       updating subclasses.
     * @param string $class
     * @param int $type
     * @throws HTMLPurifier_Exception
     */
    protected function errorInconsistent($class, $type)
    {
        throw new HTMLPurifier_Exception(
            "Inconsistency in $class: " . HTMLPurifier_VarParser::getTypeName($type) .
            " not implemented"
        );
    }

    /**
     * Generic error for if a type didn't work.
     * @param mixed $var
     * @param int $type
     */
    protected function errorGeneric($var, $type)
    {
        $vtype = gettype($var);
        $this->error("Expected type " . HTMLPurifier_VarParser::getTypeName($type) . ", got $vtype");
    }

    /**
     * @param int $type
     * @return string
     */
    public static function getTypeName($type)
    {
        static $lookup;
        if (!$lookup) {
            // Lazy load the alternative lookup table
            $lookup = array_flip(HTMLPurifier_VarParser::$types);
        }
        if (!isset($lookup[$type])) {
            return 'unknown';
        }
        return $lookup[$type];
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier.func.php000064400000001100151214231100014615 0ustar00<?php

/**
 * @file
 * Defines a function wrapper for HTML Purifier for quick use.
 * @note ''HTMLPurifier()'' is NOT the same as ''new HTMLPurifier()''
 */

/**
 * Purify HTML.
 * @param string $html String HTML to purify
 * @param mixed $config Configuration to use, can be any value accepted by
 *        HTMLPurifier_Config::create()
 * @return string
 */
function HTMLPurifier($html, $config = null)
{
    static $purifier = false;
    if (!$purifier) {
        $purifier = new HTMLPurifier();
    }
    return $purifier->purify($html, $config);
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier.php000064400000023713151214231100013701 0ustar00<?php

/*! @mainpage
 *
 * HTML Purifier is an HTML filter that will take an arbitrary snippet of
 * HTML and rigorously test, validate and filter it into a version that
 * is safe for output onto webpages. It achieves this by:
 *
 *  -# Lexing (parsing into tokens) the document,
 *  -# Executing various strategies on the tokens:
 *      -# Removing all elements not in the whitelist,
 *      -# Making the tokens well-formed,
 *      -# Fixing the nesting of the nodes, and
 *      -# Validating attributes of the nodes; and
 *  -# Generating HTML from the purified tokens.
 *
 * However, most users will only need to interface with the HTMLPurifier
 * and HTMLPurifier_Config.
 */

/*
    HTML Purifier 4.13.0 - Standards Compliant HTML Filtering
    Copyright (C) 2006-2008 Edward Z. Yang

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */

/**
 * Facade that coordinates HTML Purifier's subsystems in order to purify HTML.
 *
 * @note There are several points in which configuration can be specified
 *       for HTML Purifier.  The precedence of these (from lowest to
 *       highest) is as follows:
 *          -# Instance: new HTMLPurifier($config)
 *          -# Invocation: purify($html, $config)
 *       These configurations are entirely independent of each other and
 *       are *not* merged (this behavior may change in the future).
 *
 * @todo We need an easier way to inject strategies using the configuration
 *       object.
 */
class HTMLPurifier
{

    /**
     * Version of HTML Purifier.
     * @type string
     */
    public $version = '4.13.0';

    /**
     * Constant with version of HTML Purifier.
     */
    const VERSION = '4.13.0';

    /**
     * Global configuration object.
     * @type HTMLPurifier_Config
     */
    public $config;

    /**
     * Array of extra filter objects to run on HTML,
     * for backwards compatibility.
     * @type HTMLPurifier_Filter[]
     */
    private $filters = array();

    /**
     * Single instance of HTML Purifier.
     * @type HTMLPurifier
     */
    private static $instance;

    /**
     * @type HTMLPurifier_Strategy_Core
     */
    protected $strategy;

    /**
     * @type HTMLPurifier_Generator
     */
    protected $generator;

    /**
     * Resultant context of last run purification.
     * Is an array of contexts if the last called method was purifyArray().
     * @type HTMLPurifier_Context
     */
    public $context;

    /**
     * Initializes the purifier.
     *
     * @param HTMLPurifier_Config|mixed $config Optional HTMLPurifier_Config object
     *                for all instances of the purifier, if omitted, a default
     *                configuration is supplied (which can be overridden on a
     *                per-use basis).
     *                The parameter can also be any type that
     *                HTMLPurifier_Config::create() supports.
     */
    public function __construct($config = null)
    {
        $this->config = HTMLPurifier_Config::create($config);
        $this->strategy = new HTMLPurifier_Strategy_Core();
    }

    /**
     * Adds a filter to process the output. First come first serve
     *
     * @param HTMLPurifier_Filter $filter HTMLPurifier_Filter object
     */
    public function addFilter($filter)
    {
        trigger_error(
            'HTMLPurifier->addFilter() is deprecated, use configuration directives' .
            ' in the Filter namespace or Filter.Custom',
            E_USER_WARNING
        );
        $this->filters[] = $filter;
    }

    /**
     * Filters an HTML snippet/document to be XSS-free and standards-compliant.
     *
     * @param string $html String of HTML to purify
     * @param HTMLPurifier_Config $config Config object for this operation,
     *                if omitted, defaults to the config object specified during this
     *                object's construction. The parameter can also be any type
     *                that HTMLPurifier_Config::create() supports.
     *
     * @return string Purified HTML
     */
    public function purify($html, $config = null)
    {
        // :TODO: make the config merge in, instead of replace
        $config = $config ? HTMLPurifier_Config::create($config) : $this->config;

        // implementation is partially environment dependant, partially
        // configuration dependant
        $lexer = HTMLPurifier_Lexer::create($config);

        $context = new HTMLPurifier_Context();

        // setup HTML generator
        $this->generator = new HTMLPurifier_Generator($config, $context);
        $context->register('Generator', $this->generator);

        // set up global context variables
        if ($config->get('Core.CollectErrors')) {
            // may get moved out if other facilities use it
            $language_factory = HTMLPurifier_LanguageFactory::instance();
            $language = $language_factory->create($config, $context);
            $context->register('Locale', $language);

            $error_collector = new HTMLPurifier_ErrorCollector($context);
            $context->register('ErrorCollector', $error_collector);
        }

        // setup id_accumulator context, necessary due to the fact that
        // AttrValidator can be called from many places
        $id_accumulator = HTMLPurifier_IDAccumulator::build($config, $context);
        $context->register('IDAccumulator', $id_accumulator);

        $html = HTMLPurifier_Encoder::convertToUTF8($html, $config, $context);

        // setup filters
        $filter_flags = $config->getBatch('Filter');
        $custom_filters = $filter_flags['Custom'];
        unset($filter_flags['Custom']);
        $filters = array();
        foreach ($filter_flags as $filter => $flag) {
            if (!$flag) {
                continue;
            }
            if (strpos($filter, '.') !== false) {
                continue;
            }
            $class = "HTMLPurifier_Filter_$filter";
            $filters[] = new $class;
        }
        foreach ($custom_filters as $filter) {
            // maybe "HTMLPurifier_Filter_$filter", but be consistent with AutoFormat
            $filters[] = $filter;
        }
        $filters = array_merge($filters, $this->filters);
        // maybe prepare(), but later

        for ($i = 0, $filter_size = count($filters); $i < $filter_size; $i++) {
            $html = $filters[$i]->preFilter($html, $config, $context);
        }

        // purified HTML
        $html =
            $this->generator->generateFromTokens(
                // list of tokens
                $this->strategy->execute(
                    // list of un-purified tokens
                    $lexer->tokenizeHTML(
                        // un-purified HTML
                        $html,
                        $config,
                        $context
                    ),
                    $config,
                    $context
                )
            );

        for ($i = $filter_size - 1; $i >= 0; $i--) {
            $html = $filters[$i]->postFilter($html, $config, $context);
        }

        $html = HTMLPurifier_Encoder::convertFromUTF8($html, $config, $context);
        $this->context =& $context;
        return $html;
    }

    /**
     * Filters an array of HTML snippets
     *
     * @param string[] $array_of_html Array of html snippets
     * @param HTMLPurifier_Config $config Optional config object for this operation.
     *                See HTMLPurifier::purify() for more details.
     *
     * @return string[] Array of purified HTML
     */
    public function purifyArray($array_of_html, $config = null)
    {
        $context_array = array();
        $array = array();
        foreach($array_of_html as $key=>$value){
            if (is_array($value)) {
                $array[$key] = $this->purifyArray($value, $config);
            } else {
                $array[$key] = $this->purify($value, $config);
            }
            $context_array[$key] = $this->context;
        }
        $this->context = $context_array;
        return $array;
    }

    /**
     * Singleton for enforcing just one HTML Purifier in your system
     *
     * @param HTMLPurifier|HTMLPurifier_Config $prototype Optional prototype
     *                   HTMLPurifier instance to overload singleton with,
     *                   or HTMLPurifier_Config instance to configure the
     *                   generated version with.
     *
     * @return HTMLPurifier
     */
    public static function instance($prototype = null)
    {
        if (!self::$instance || $prototype) {
            if ($prototype instanceof HTMLPurifier) {
                self::$instance = $prototype;
            } elseif ($prototype) {
                self::$instance = new HTMLPurifier($prototype);
            } else {
                self::$instance = new HTMLPurifier();
            }
        }
        return self::$instance;
    }

    /**
     * Singleton for enforcing just one HTML Purifier in your system
     *
     * @param HTMLPurifier|HTMLPurifier_Config $prototype Optional prototype
     *                   HTMLPurifier instance to overload singleton with,
     *                   or HTMLPurifier_Config instance to configure the
     *                   generated version with.
     *
     * @return HTMLPurifier
     * @note Backwards compatibility, see instance()
     */
    public static function getInstance($prototype = null)
    {
        return HTMLPurifier::instance($prototype);
    }
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier.includes.php000064400000024424151214231100015506 0ustar00<?php

/**
 * @file
 * This file was auto-generated by generate-includes.php and includes all of
 * the core files required by HTML Purifier. Use this if performance is a
 * primary concern and you are using an opcode cache. PLEASE DO NOT EDIT THIS
 * FILE, changes will be overwritten the next time the script is run.
 *
 * @version 4.13.0
 *
 * @warning
 *      You must *not* include any other HTML Purifier files before this file,
 *      because 'require' not 'require_once' is used.
 *
 * @warning
 *      This file requires that the include path contains the HTML Purifier
 *      library directory; this is not auto-set.
 */

require 'HTMLPurifier.php';
require 'HTMLPurifier/Arborize.php';
require 'HTMLPurifier/AttrCollections.php';
require 'HTMLPurifier/AttrDef.php';
require 'HTMLPurifier/AttrTransform.php';
require 'HTMLPurifier/AttrTypes.php';
require 'HTMLPurifier/AttrValidator.php';
require 'HTMLPurifier/Bootstrap.php';
require 'HTMLPurifier/Definition.php';
require 'HTMLPurifier/CSSDefinition.php';
require 'HTMLPurifier/ChildDef.php';
require 'HTMLPurifier/Config.php';
require 'HTMLPurifier/ConfigSchema.php';
require 'HTMLPurifier/ContentSets.php';
require 'HTMLPurifier/Context.php';
require 'HTMLPurifier/DefinitionCache.php';
require 'HTMLPurifier/DefinitionCacheFactory.php';
require 'HTMLPurifier/Doctype.php';
require 'HTMLPurifier/DoctypeRegistry.php';
require 'HTMLPurifier/ElementDef.php';
require 'HTMLPurifier/Encoder.php';
require 'HTMLPurifier/EntityLookup.php';
require 'HTMLPurifier/EntityParser.php';
require 'HTMLPurifier/ErrorCollector.php';
require 'HTMLPurifier/ErrorStruct.php';
require 'HTMLPurifier/Exception.php';
require 'HTMLPurifier/Filter.php';
require 'HTMLPurifier/Generator.php';
require 'HTMLPurifier/HTMLDefinition.php';
require 'HTMLPurifier/HTMLModule.php';
require 'HTMLPurifier/HTMLModuleManager.php';
require 'HTMLPurifier/IDAccumulator.php';
require 'HTMLPurifier/Injector.php';
require 'HTMLPurifier/Language.php';
require 'HTMLPurifier/LanguageFactory.php';
require 'HTMLPurifier/Length.php';
require 'HTMLPurifier/Lexer.php';
require 'HTMLPurifier/Node.php';
require 'HTMLPurifier/PercentEncoder.php';
require 'HTMLPurifier/PropertyList.php';
require 'HTMLPurifier/PropertyListIterator.php';
require 'HTMLPurifier/Queue.php';
require 'HTMLPurifier/Strategy.php';
require 'HTMLPurifier/StringHash.php';
require 'HTMLPurifier/StringHashParser.php';
require 'HTMLPurifier/TagTransform.php';
require 'HTMLPurifier/Token.php';
require 'HTMLPurifier/TokenFactory.php';
require 'HTMLPurifier/URI.php';
require 'HTMLPurifier/URIDefinition.php';
require 'HTMLPurifier/URIFilter.php';
require 'HTMLPurifier/URIParser.php';
require 'HTMLPurifier/URIScheme.php';
require 'HTMLPurifier/URISchemeRegistry.php';
require 'HTMLPurifier/UnitConverter.php';
require 'HTMLPurifier/VarParser.php';
require 'HTMLPurifier/VarParserException.php';
require 'HTMLPurifier/Zipper.php';
require 'HTMLPurifier/AttrDef/CSS.php';
require 'HTMLPurifier/AttrDef/Clone.php';
require 'HTMLPurifier/AttrDef/Enum.php';
require 'HTMLPurifier/AttrDef/Integer.php';
require 'HTMLPurifier/AttrDef/Lang.php';
require 'HTMLPurifier/AttrDef/Switch.php';
require 'HTMLPurifier/AttrDef/Text.php';
require 'HTMLPurifier/AttrDef/URI.php';
require 'HTMLPurifier/AttrDef/CSS/Number.php';
require 'HTMLPurifier/AttrDef/CSS/AlphaValue.php';
require 'HTMLPurifier/AttrDef/CSS/Background.php';
require 'HTMLPurifier/AttrDef/CSS/BackgroundPosition.php';
require 'HTMLPurifier/AttrDef/CSS/Border.php';
require 'HTMLPurifier/AttrDef/CSS/Color.php';
require 'HTMLPurifier/AttrDef/CSS/Composite.php';
require 'HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php';
require 'HTMLPurifier/AttrDef/CSS/Filter.php';
require 'HTMLPurifier/AttrDef/CSS/Font.php';
require 'HTMLPurifier/AttrDef/CSS/FontFamily.php';
require 'HTMLPurifier/AttrDef/CSS/Ident.php';
require 'HTMLPurifier/AttrDef/CSS/ImportantDecorator.php';
require 'HTMLPurifier/AttrDef/CSS/Length.php';
require 'HTMLPurifier/AttrDef/CSS/ListStyle.php';
require 'HTMLPurifier/AttrDef/CSS/Multiple.php';
require 'HTMLPurifier/AttrDef/CSS/Percentage.php';
require 'HTMLPurifier/AttrDef/CSS/TextDecoration.php';
require 'HTMLPurifier/AttrDef/CSS/URI.php';
require 'HTMLPurifier/AttrDef/HTML/Bool.php';
require 'HTMLPurifier/AttrDef/HTML/Nmtokens.php';
require 'HTMLPurifier/AttrDef/HTML/Class.php';
require 'HTMLPurifier/AttrDef/HTML/Color.php';
require 'HTMLPurifier/AttrDef/HTML/FrameTarget.php';
require 'HTMLPurifier/AttrDef/HTML/ID.php';
require 'HTMLPurifier/AttrDef/HTML/Pixels.php';
require 'HTMLPurifier/AttrDef/HTML/Length.php';
require 'HTMLPurifier/AttrDef/HTML/LinkTypes.php';
require 'HTMLPurifier/AttrDef/HTML/MultiLength.php';
require 'HTMLPurifier/AttrDef/URI/Email.php';
require 'HTMLPurifier/AttrDef/URI/Host.php';
require 'HTMLPurifier/AttrDef/URI/IPv4.php';
require 'HTMLPurifier/AttrDef/URI/IPv6.php';
require 'HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php';
require 'HTMLPurifier/AttrTransform/Background.php';
require 'HTMLPurifier/AttrTransform/BdoDir.php';
require 'HTMLPurifier/AttrTransform/BgColor.php';
require 'HTMLPurifier/AttrTransform/BoolToCSS.php';
require 'HTMLPurifier/AttrTransform/Border.php';
require 'HTMLPurifier/AttrTransform/EnumToCSS.php';
require 'HTMLPurifier/AttrTransform/ImgRequired.php';
require 'HTMLPurifier/AttrTransform/ImgSpace.php';
require 'HTMLPurifier/AttrTransform/Input.php';
require 'HTMLPurifier/AttrTransform/Lang.php';
require 'HTMLPurifier/AttrTransform/Length.php';
require 'HTMLPurifier/AttrTransform/Name.php';
require 'HTMLPurifier/AttrTransform/NameSync.php';
require 'HTMLPurifier/AttrTransform/Nofollow.php';
require 'HTMLPurifier/AttrTransform/SafeEmbed.php';
require 'HTMLPurifier/AttrTransform/SafeObject.php';
require 'HTMLPurifier/AttrTransform/SafeParam.php';
require 'HTMLPurifier/AttrTransform/ScriptRequired.php';
require 'HTMLPurifier/AttrTransform/TargetBlank.php';
require 'HTMLPurifier/AttrTransform/TargetNoopener.php';
require 'HTMLPurifier/AttrTransform/TargetNoreferrer.php';
require 'HTMLPurifier/AttrTransform/Textarea.php';
require 'HTMLPurifier/ChildDef/Chameleon.php';
require 'HTMLPurifier/ChildDef/Custom.php';
require 'HTMLPurifier/ChildDef/Empty.php';
require 'HTMLPurifier/ChildDef/List.php';
require 'HTMLPurifier/ChildDef/Required.php';
require 'HTMLPurifier/ChildDef/Optional.php';
require 'HTMLPurifier/ChildDef/StrictBlockquote.php';
require 'HTMLPurifier/ChildDef/Table.php';
require 'HTMLPurifier/DefinitionCache/Decorator.php';
require 'HTMLPurifier/DefinitionCache/Null.php';
require 'HTMLPurifier/DefinitionCache/Serializer.php';
require 'HTMLPurifier/DefinitionCache/Decorator/Cleanup.php';
require 'HTMLPurifier/DefinitionCache/Decorator/Memory.php';
require 'HTMLPurifier/HTMLModule/Bdo.php';
require 'HTMLPurifier/HTMLModule/CommonAttributes.php';
require 'HTMLPurifier/HTMLModule/Edit.php';
require 'HTMLPurifier/HTMLModule/Forms.php';
require 'HTMLPurifier/HTMLModule/Hypertext.php';
require 'HTMLPurifier/HTMLModule/Iframe.php';
require 'HTMLPurifier/HTMLModule/Image.php';
require 'HTMLPurifier/HTMLModule/Legacy.php';
require 'HTMLPurifier/HTMLModule/List.php';
require 'HTMLPurifier/HTMLModule/Name.php';
require 'HTMLPurifier/HTMLModule/Nofollow.php';
require 'HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php';
require 'HTMLPurifier/HTMLModule/Object.php';
require 'HTMLPurifier/HTMLModule/Presentation.php';
require 'HTMLPurifier/HTMLModule/Proprietary.php';
require 'HTMLPurifier/HTMLModule/Ruby.php';
require 'HTMLPurifier/HTMLModule/SafeEmbed.php';
require 'HTMLPurifier/HTMLModule/SafeObject.php';
require 'HTMLPurifier/HTMLModule/SafeScripting.php';
require 'HTMLPurifier/HTMLModule/Scripting.php';
require 'HTMLPurifier/HTMLModule/StyleAttribute.php';
require 'HTMLPurifier/HTMLModule/Tables.php';
require 'HTMLPurifier/HTMLModule/Target.php';
require 'HTMLPurifier/HTMLModule/TargetBlank.php';
require 'HTMLPurifier/HTMLModule/TargetNoopener.php';
require 'HTMLPurifier/HTMLModule/TargetNoreferrer.php';
require 'HTMLPurifier/HTMLModule/Text.php';
require 'HTMLPurifier/HTMLModule/Tidy.php';
require 'HTMLPurifier/HTMLModule/XMLCommonAttributes.php';
require 'HTMLPurifier/HTMLModule/Tidy/Name.php';
require 'HTMLPurifier/HTMLModule/Tidy/Proprietary.php';
require 'HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php';
require 'HTMLPurifier/HTMLModule/Tidy/Strict.php';
require 'HTMLPurifier/HTMLModule/Tidy/Transitional.php';
require 'HTMLPurifier/HTMLModule/Tidy/XHTML.php';
require 'HTMLPurifier/Injector/AutoParagraph.php';
require 'HTMLPurifier/Injector/DisplayLinkURI.php';
require 'HTMLPurifier/Injector/Linkify.php';
require 'HTMLPurifier/Injector/PurifierLinkify.php';
require 'HTMLPurifier/Injector/RemoveEmpty.php';
require 'HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php';
require 'HTMLPurifier/Injector/SafeObject.php';
require 'HTMLPurifier/Lexer/DOMLex.php';
require 'HTMLPurifier/Lexer/DirectLex.php';
require 'HTMLPurifier/Node/Comment.php';
require 'HTMLPurifier/Node/Element.php';
require 'HTMLPurifier/Node/Text.php';
require 'HTMLPurifier/Strategy/Composite.php';
require 'HTMLPurifier/Strategy/Core.php';
require 'HTMLPurifier/Strategy/FixNesting.php';
require 'HTMLPurifier/Strategy/MakeWellFormed.php';
require 'HTMLPurifier/Strategy/RemoveForeignElements.php';
require 'HTMLPurifier/Strategy/ValidateAttributes.php';
require 'HTMLPurifier/TagTransform/Font.php';
require 'HTMLPurifier/TagTransform/Simple.php';
require 'HTMLPurifier/Token/Comment.php';
require 'HTMLPurifier/Token/Tag.php';
require 'HTMLPurifier/Token/Empty.php';
require 'HTMLPurifier/Token/End.php';
require 'HTMLPurifier/Token/Start.php';
require 'HTMLPurifier/Token/Text.php';
require 'HTMLPurifier/URIFilter/DisableExternal.php';
require 'HTMLPurifier/URIFilter/DisableExternalResources.php';
require 'HTMLPurifier/URIFilter/DisableResources.php';
require 'HTMLPurifier/URIFilter/HostBlacklist.php';
require 'HTMLPurifier/URIFilter/MakeAbsolute.php';
require 'HTMLPurifier/URIFilter/Munge.php';
require 'HTMLPurifier/URIFilter/SafeIframe.php';
require 'HTMLPurifier/URIScheme/data.php';
require 'HTMLPurifier/URIScheme/file.php';
require 'HTMLPurifier/URIScheme/ftp.php';
require 'HTMLPurifier/URIScheme/http.php';
require 'HTMLPurifier/URIScheme/https.php';
require 'HTMLPurifier/URIScheme/mailto.php';
require 'HTMLPurifier/URIScheme/news.php';
require 'HTMLPurifier/URIScheme/nntp.php';
require 'HTMLPurifier/URIScheme/tel.php';
require 'HTMLPurifier/VarParser/Flexible.php';
require 'HTMLPurifier/VarParser/Native.php';
htmlpurifier/library/HTMLPurifier.path.php000064400000000353151214231100014627 0ustar00<?php

/**
 * @file
 * Convenience stub file that adds HTML Purifier's library file to the path
 * without any other side-effects.
 */

set_include_path(dirname(__FILE__) . PATH_SEPARATOR . get_include_path() );

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier.composer.php000064400000000145151214231100015521 0ustar00<?php
if (!defined('HTMLPURIFIER_PREFIX')) {
    define('HTMLPURIFIER_PREFIX', dirname(__FILE__));
}
htmlpurifier/library/HTMLPurifier.auto.php000064400000000422151214231100014640 0ustar00<?php

/**
 * This is a stub include that automatically configures the include path.
 */

set_include_path(dirname(__FILE__) . PATH_SEPARATOR . get_include_path() );
require_once 'HTMLPurifier/Bootstrap.php';
require_once 'HTMLPurifier.autoload.php';

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier.autoload-legacy.php000064400000000421151214231100016741 0ustar00<?php

/**
 * @file
 * Legacy autoloader for systems lacking spl_autoload_register
 *
 * Must be separate to prevent deprecation warning on PHP 7.2
 */

function HTMLPurifier__autoload($class)
{
    return HTMLPurifier_Bootstrap::autoload($class);
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier.autoload.php000064400000001513151214231100015502 0ustar00<?php

/**
 * @file
 * Convenience file that registers autoload handler for HTML Purifier.
 * It also does some sanity checks.
 */

if (function_exists('spl_autoload_register') && function_exists('spl_autoload_unregister')) {
    // We need unregister for our pre-registering functionality
    HTMLPurifier_Bootstrap::registerAutoload();
    if (function_exists('HTMLPurifier__autoload')) {
        // Be polite and ensure that userland autoload gets retained
        spl_autoload_register('HTMLPurifier__autoload');
    }
} elseif (!function_exists('HTMLPurifier__autoload')) {
    require dirname(__FILE__) . '/HTMLPurifier.autoload-legacy.php';
}

if (ini_get('zend.ze1_compatibility_mode')) {
    trigger_error("HTML Purifier is not compatible with zend.ze1_compatibility_mode; please turn it off", E_USER_ERROR);
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier.kses.php000064400000001633151214231100014642 0ustar00<?php

/**
 * @file
 * Emulation layer for code that used kses(), substituting in HTML Purifier.
 */

require_once dirname(__FILE__) . '/HTMLPurifier.auto.php';

function kses($string, $allowed_html, $allowed_protocols = null)
{
    $config = HTMLPurifier_Config::createDefault();
    $allowed_elements = array();
    $allowed_attributes = array();
    foreach ($allowed_html as $element => $attributes) {
        $allowed_elements[$element] = true;
        foreach ($attributes as $attribute => $x) {
            $allowed_attributes["$element.$attribute"] = true;
        }
    }
    $config->set('HTML.AllowedElements', $allowed_elements);
    $config->set('HTML.AllowedAttributes', $allowed_attributes);
    if ($allowed_protocols !== null) {
        $config->set('URI.AllowedSchemes', $allowed_protocols);
    }
    $purifier = new HTMLPurifier($config);
    return $purifier->purify($string);
}

// vim: et sw=4 sts=4
htmlpurifier/library/HTMLPurifier.safe-includes.php000064400000032303151214231100016415 0ustar00<?php

/**
 * @file
 * This file was auto-generated by generate-includes.php and includes all of
 * the core files required by HTML Purifier. This is a convenience stub that
 * includes all files using dirname(__FILE__) and require_once. PLEASE DO NOT
 * EDIT THIS FILE, changes will be overwritten the next time the script is run.
 *
 * Changes to include_path are not necessary.
 */

$__dir = dirname(__FILE__);

require_once $__dir . '/HTMLPurifier.php';
require_once $__dir . '/HTMLPurifier/Arborize.php';
require_once $__dir . '/HTMLPurifier/AttrCollections.php';
require_once $__dir . '/HTMLPurifier/AttrDef.php';
require_once $__dir . '/HTMLPurifier/AttrTransform.php';
require_once $__dir . '/HTMLPurifier/AttrTypes.php';
require_once $__dir . '/HTMLPurifier/AttrValidator.php';
require_once $__dir . '/HTMLPurifier/Bootstrap.php';
require_once $__dir . '/HTMLPurifier/Definition.php';
require_once $__dir . '/HTMLPurifier/CSSDefinition.php';
require_once $__dir . '/HTMLPurifier/ChildDef.php';
require_once $__dir . '/HTMLPurifier/Config.php';
require_once $__dir . '/HTMLPurifier/ConfigSchema.php';
require_once $__dir . '/HTMLPurifier/ContentSets.php';
require_once $__dir . '/HTMLPurifier/Context.php';
require_once $__dir . '/HTMLPurifier/DefinitionCache.php';
require_once $__dir . '/HTMLPurifier/DefinitionCacheFactory.php';
require_once $__dir . '/HTMLPurifier/Doctype.php';
require_once $__dir . '/HTMLPurifier/DoctypeRegistry.php';
require_once $__dir . '/HTMLPurifier/ElementDef.php';
require_once $__dir . '/HTMLPurifier/Encoder.php';
require_once $__dir . '/HTMLPurifier/EntityLookup.php';
require_once $__dir . '/HTMLPurifier/EntityParser.php';
require_once $__dir . '/HTMLPurifier/ErrorCollector.php';
require_once $__dir . '/HTMLPurifier/ErrorStruct.php';
require_once $__dir . '/HTMLPurifier/Exception.php';
require_once $__dir . '/HTMLPurifier/Filter.php';
require_once $__dir . '/HTMLPurifier/Generator.php';
require_once $__dir . '/HTMLPurifier/HTMLDefinition.php';
require_once $__dir . '/HTMLPurifier/HTMLModule.php';
require_once $__dir . '/HTMLPurifier/HTMLModuleManager.php';
require_once $__dir . '/HTMLPurifier/IDAccumulator.php';
require_once $__dir . '/HTMLPurifier/Injector.php';
require_once $__dir . '/HTMLPurifier/Language.php';
require_once $__dir . '/HTMLPurifier/LanguageFactory.php';
require_once $__dir . '/HTMLPurifier/Length.php';
require_once $__dir . '/HTMLPurifier/Lexer.php';
require_once $__dir . '/HTMLPurifier/Node.php';
require_once $__dir . '/HTMLPurifier/PercentEncoder.php';
require_once $__dir . '/HTMLPurifier/PropertyList.php';
require_once $__dir . '/HTMLPurifier/PropertyListIterator.php';
require_once $__dir . '/HTMLPurifier/Queue.php';
require_once $__dir . '/HTMLPurifier/Strategy.php';
require_once $__dir . '/HTMLPurifier/StringHash.php';
require_once $__dir . '/HTMLPurifier/StringHashParser.php';
require_once $__dir . '/HTMLPurifier/TagTransform.php';
require_once $__dir . '/HTMLPurifier/Token.php';
require_once $__dir . '/HTMLPurifier/TokenFactory.php';
require_once $__dir . '/HTMLPurifier/URI.php';
require_once $__dir . '/HTMLPurifier/URIDefinition.php';
require_once $__dir . '/HTMLPurifier/URIFilter.php';
require_once $__dir . '/HTMLPurifier/URIParser.php';
require_once $__dir . '/HTMLPurifier/URIScheme.php';
require_once $__dir . '/HTMLPurifier/URISchemeRegistry.php';
require_once $__dir . '/HTMLPurifier/UnitConverter.php';
require_once $__dir . '/HTMLPurifier/VarParser.php';
require_once $__dir . '/HTMLPurifier/VarParserException.php';
require_once $__dir . '/HTMLPurifier/Zipper.php';
require_once $__dir . '/HTMLPurifier/AttrDef/CSS.php';
require_once $__dir . '/HTMLPurifier/AttrDef/Clone.php';
require_once $__dir . '/HTMLPurifier/AttrDef/Enum.php';
require_once $__dir . '/HTMLPurifier/AttrDef/Integer.php';
require_once $__dir . '/HTMLPurifier/AttrDef/Lang.php';
require_once $__dir . '/HTMLPurifier/AttrDef/Switch.php';
require_once $__dir . '/HTMLPurifier/AttrDef/Text.php';
require_once $__dir . '/HTMLPurifier/AttrDef/URI.php';
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Number.php';
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/AlphaValue.php';
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Background.php';
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php';
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Border.php';
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Color.php';
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Composite.php';
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php';
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Filter.php';
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Font.php';
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/FontFamily.php';
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Ident.php';
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php';
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Length.php';
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/ListStyle.php';
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Multiple.php';
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Percentage.php';
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/TextDecoration.php';
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/URI.php';
require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Bool.php';
require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Nmtokens.php';
require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Class.php';
require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Color.php';
require_once $__dir . '/HTMLPurifier/AttrDef/HTML/FrameTarget.php';
require_once $__dir . '/HTMLPurifier/AttrDef/HTML/ID.php';
require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Pixels.php';
require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Length.php';
require_once $__dir . '/HTMLPurifier/AttrDef/HTML/LinkTypes.php';
require_once $__dir . '/HTMLPurifier/AttrDef/HTML/MultiLength.php';
require_once $__dir . '/HTMLPurifier/AttrDef/URI/Email.php';
require_once $__dir . '/HTMLPurifier/AttrDef/URI/Host.php';
require_once $__dir . '/HTMLPurifier/AttrDef/URI/IPv4.php';
require_once $__dir . '/HTMLPurifier/AttrDef/URI/IPv6.php';
require_once $__dir . '/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php';
require_once $__dir . '/HTMLPurifier/AttrTransform/Background.php';
require_once $__dir . '/HTMLPurifier/AttrTransform/BdoDir.php';
require_once $__dir . '/HTMLPurifier/AttrTransform/BgColor.php';
require_once $__dir . '/HTMLPurifier/AttrTransform/BoolToCSS.php';
require_once $__dir . '/HTMLPurifier/AttrTransform/Border.php';
require_once $__dir . '/HTMLPurifier/AttrTransform/EnumToCSS.php';
require_once $__dir . '/HTMLPurifier/AttrTransform/ImgRequired.php';
require_once $__dir . '/HTMLPurifier/AttrTransform/ImgSpace.php';
require_once $__dir . '/HTMLPurifier/AttrTransform/Input.php';
require_once $__dir . '/HTMLPurifier/AttrTransform/Lang.php';
require_once $__dir . '/HTMLPurifier/AttrTransform/Length.php';
require_once $__dir . '/HTMLPurifier/AttrTransform/Name.php';
require_once $__dir . '/HTMLPurifier/AttrTransform/NameSync.php';
require_once $__dir . '/HTMLPurifier/AttrTransform/Nofollow.php';
require_once $__dir . '/HTMLPurifier/AttrTransform/SafeEmbed.php';
require_once $__dir . '/HTMLPurifier/AttrTransform/SafeObject.php';
require_once $__dir . '/HTMLPurifier/AttrTransform/SafeParam.php';
require_once $__dir . '/HTMLPurifier/AttrTransform/ScriptRequired.php';
require_once $__dir . '/HTMLPurifier/AttrTransform/TargetBlank.php';
require_once $__dir . '/HTMLPurifier/AttrTransform/TargetNoopener.php';
require_once $__dir . '/HTMLPurifier/AttrTransform/TargetNoreferrer.php';
require_once $__dir . '/HTMLPurifier/AttrTransform/Textarea.php';
require_once $__dir . '/HTMLPurifier/ChildDef/Chameleon.php';
require_once $__dir . '/HTMLPurifier/ChildDef/Custom.php';
require_once $__dir . '/HTMLPurifier/ChildDef/Empty.php';
require_once $__dir . '/HTMLPurifier/ChildDef/List.php';
require_once $__dir . '/HTMLPurifier/ChildDef/Required.php';
require_once $__dir . '/HTMLPurifier/ChildDef/Optional.php';
require_once $__dir . '/HTMLPurifier/ChildDef/StrictBlockquote.php';
require_once $__dir . '/HTMLPurifier/ChildDef/Table.php';
require_once $__dir . '/HTMLPurifier/DefinitionCache/Decorator.php';
require_once $__dir . '/HTMLPurifier/DefinitionCache/Null.php';
require_once $__dir . '/HTMLPurifier/DefinitionCache/Serializer.php';
require_once $__dir . '/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php';
require_once $__dir . '/HTMLPurifier/DefinitionCache/Decorator/Memory.php';
require_once $__dir . '/HTMLPurifier/HTMLModule/Bdo.php';
require_once $__dir . '/HTMLPurifier/HTMLModule/CommonAttributes.php';
require_once $__dir . '/HTMLPurifier/HTMLModule/Edit.php';
require_once $__dir . '/HTMLPurifier/HTMLModule/Forms.php';
require_once $__dir . '/HTMLPurifier/HTMLModule/Hypertext.php';
require_once $__dir . '/HTMLPurifier/HTMLModule/Iframe.php';
require_once $__dir . '/HTMLPurifier/HTMLModule/Image.php';
require_once $__dir . '/HTMLPurifier/HTMLModule/Legacy.php';
require_once $__dir . '/HTMLPurifier/HTMLModule/List.php';
require_once $__dir . '/HTMLPurifier/HTMLModule/Name.php';
require_once $__dir . '/HTMLPurifier/HTMLModule/Nofollow.php';
require_once $__dir . '/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php';
require_once $__dir . '/HTMLPurifier/HTMLModule/Object.php';
require_once $__dir . '/HTMLPurifier/HTMLModule/Presentation.php';
require_once $__dir . '/HTMLPurifier/HTMLModule/Proprietary.php';
require_once $__dir . '/HTMLPurifier/HTMLModule/Ruby.php';
require_once $__dir . '/HTMLPurifier/HTMLModule/SafeEmbed.php';
require_once $__dir . '/HTMLPurifier/HTMLModule/SafeObject.php';
require_once $__dir . '/HTMLPurifier/HTMLModule/SafeScripting.php';
require_once $__dir . '/HTMLPurifier/HTMLModule/Scripting.php';
require_once $__dir . '/HTMLPurifier/HTMLModule/StyleAttribute.php';
require_once $__dir . '/HTMLPurifier/HTMLModule/Tables.php';
require_once $__dir . '/HTMLPurifier/HTMLModule/Target.php';
require_once $__dir . '/HTMLPurifier/HTMLModule/TargetBlank.php';
require_once $__dir . '/HTMLPurifier/HTMLModule/TargetNoopener.php';
require_once $__dir . '/HTMLPurifier/HTMLModule/TargetNoreferrer.php';
require_once $__dir . '/HTMLPurifier/HTMLModule/Text.php';
require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy.php';
require_once $__dir . '/HTMLPurifier/HTMLModule/XMLCommonAttributes.php';
require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/Name.php';
require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/Proprietary.php';
require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php';
require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/Strict.php';
require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/Transitional.php';
require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/XHTML.php';
require_once $__dir . '/HTMLPurifier/Injector/AutoParagraph.php';
require_once $__dir . '/HTMLPurifier/Injector/DisplayLinkURI.php';
require_once $__dir . '/HTMLPurifier/Injector/Linkify.php';
require_once $__dir . '/HTMLPurifier/Injector/PurifierLinkify.php';
require_once $__dir . '/HTMLPurifier/Injector/RemoveEmpty.php';
require_once $__dir . '/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php';
require_once $__dir . '/HTMLPurifier/Injector/SafeObject.php';
require_once $__dir . '/HTMLPurifier/Lexer/DOMLex.php';
require_once $__dir . '/HTMLPurifier/Lexer/DirectLex.php';
require_once $__dir . '/HTMLPurifier/Node/Comment.php';
require_once $__dir . '/HTMLPurifier/Node/Element.php';
require_once $__dir . '/HTMLPurifier/Node/Text.php';
require_once $__dir . '/HTMLPurifier/Strategy/Composite.php';
require_once $__dir . '/HTMLPurifier/Strategy/Core.php';
require_once $__dir . '/HTMLPurifier/Strategy/FixNesting.php';
require_once $__dir . '/HTMLPurifier/Strategy/MakeWellFormed.php';
require_once $__dir . '/HTMLPurifier/Strategy/RemoveForeignElements.php';
require_once $__dir . '/HTMLPurifier/Strategy/ValidateAttributes.php';
require_once $__dir . '/HTMLPurifier/TagTransform/Font.php';
require_once $__dir . '/HTMLPurifier/TagTransform/Simple.php';
require_once $__dir . '/HTMLPurifier/Token/Comment.php';
require_once $__dir . '/HTMLPurifier/Token/Tag.php';
require_once $__dir . '/HTMLPurifier/Token/Empty.php';
require_once $__dir . '/HTMLPurifier/Token/End.php';
require_once $__dir . '/HTMLPurifier/Token/Start.php';
require_once $__dir . '/HTMLPurifier/Token/Text.php';
require_once $__dir . '/HTMLPurifier/URIFilter/DisableExternal.php';
require_once $__dir . '/HTMLPurifier/URIFilter/DisableExternalResources.php';
require_once $__dir . '/HTMLPurifier/URIFilter/DisableResources.php';
require_once $__dir . '/HTMLPurifier/URIFilter/HostBlacklist.php';
require_once $__dir . '/HTMLPurifier/URIFilter/MakeAbsolute.php';
require_once $__dir . '/HTMLPurifier/URIFilter/Munge.php';
require_once $__dir . '/HTMLPurifier/URIFilter/SafeIframe.php';
require_once $__dir . '/HTMLPurifier/URIScheme/data.php';
require_once $__dir . '/HTMLPurifier/URIScheme/file.php';
require_once $__dir . '/HTMLPurifier/URIScheme/ftp.php';
require_once $__dir . '/HTMLPurifier/URIScheme/http.php';
require_once $__dir . '/HTMLPurifier/URIScheme/https.php';
require_once $__dir . '/HTMLPurifier/URIScheme/mailto.php';
require_once $__dir . '/HTMLPurifier/URIScheme/news.php';
require_once $__dir . '/HTMLPurifier/URIScheme/nntp.php';
require_once $__dir . '/HTMLPurifier/URIScheme/tel.php';
require_once $__dir . '/HTMLPurifier/VarParser/Flexible.php';
require_once $__dir . '/HTMLPurifier/VarParser/Native.php';
htmlpurifier/LICENSE000064400000063530151214231100010260 0ustar00		  GNU LESSER GENERAL PUBLIC LICENSE
		       Version 2.1, February 1999

 Copyright (C) 1991, 1999 Free Software Foundation, Inc.
 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

[This is the first released version of the Lesser GPL.  It also counts
 as the successor of the GNU Library Public License, version 2, hence
 the version number 2.1.]

			    Preamble

  The licenses for most software are designed to take away your
freedom to share and change it.  By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.

  This license, the Lesser General Public License, applies to some
specially designated software packages--typically libraries--of the
Free Software Foundation and other authors who decide to use it.  You
can use it too, but we suggest you first think carefully about whether
this license or the ordinary General Public License is the better
strategy to use in any particular case, based on the explanations below.

  When we speak of free software, we are referring to freedom of use,
not price.  Our General Public Licenses are designed to make sure that
you have the freedom to distribute copies of free software (and charge
for this service if you wish); that you receive source code or can get
it if you want it; that you can change the software and use pieces of
it in new free programs; and that you are informed that you can do
these things.

  To protect your rights, we need to make restrictions that forbid
distributors to deny you these rights or to ask you to surrender these
rights.  These restrictions translate to certain responsibilities for
you if you distribute copies of the library or if you modify it.

  For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you.  You must make sure that they, too, receive or can get the source
code.  If you link other code with the library, you must provide
complete object files to the recipients, so that they can relink them
with the library after making changes to the library and recompiling
it.  And you must show them these terms so they know their rights.

  We protect your rights with a two-step method: (1) we copyright the
library, and (2) we offer you this license, which gives you legal
permission to copy, distribute and/or modify the library.

  To protect each distributor, we want to make it very clear that
there is no warranty for the free library.  Also, if the library is
modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.

  Finally, software patents pose a constant threat to the existence of
any free program.  We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
restrictive license from a patent holder.  Therefore, we insist that
any patent license obtained for a version of the library must be
consistent with the full freedom of use specified in this license.

  Most GNU software, including some libraries, is covered by the
ordinary GNU General Public License.  This license, the GNU Lesser
General Public License, applies to certain designated libraries, and
is quite different from the ordinary General Public License.  We use
this license for certain libraries in order to permit linking those
libraries into non-free programs.

  When a program is linked with a library, whether statically or using
a shared library, the combination of the two is legally speaking a
combined work, a derivative of the original library.  The ordinary
General Public License therefore permits such linking only if the
entire combination fits its criteria of freedom.  The Lesser General
Public License permits more lax criteria for linking other code with
the library.

  We call this license the "Lesser" General Public License because it
does Less to protect the user's freedom than the ordinary General
Public License.  It also provides other free software developers Less
of an advantage over competing non-free programs.  These disadvantages
are the reason we use the ordinary General Public License for many
libraries.  However, the Lesser license provides advantages in certain
special circumstances.

  For example, on rare occasions, there may be a special need to
encourage the widest possible use of a certain library, so that it becomes
a de-facto standard.  To achieve this, non-free programs must be
allowed to use the library.  A more frequent case is that a free
library does the same job as widely used non-free libraries.  In this
case, there is little to gain by limiting the free library to free
software only, so we use the Lesser General Public License.

  In other cases, permission to use a particular library in non-free
programs enables a greater number of people to use a large body of
free software.  For example, permission to use the GNU C Library in
non-free programs enables many more people to use the whole GNU
operating system, as well as its variant, the GNU/Linux operating
system.

  Although the Lesser General Public License is Less protective of the
users' freedom, it does ensure that the user of a program that is
linked with the Library has the freedom and the wherewithal to run
that program using a modified version of the Library.

  The precise terms and conditions for copying, distribution and
modification follow.  Pay close attention to the difference between a
"work based on the library" and a "work that uses the library".  The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.

		  GNU LESSER GENERAL PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. This License Agreement applies to any software library or other
program which contains a notice placed by the copyright holder or
other authorized party saying it may be distributed under the terms of
this Lesser General Public License (also called "this License").
Each licensee is addressed as "you".

  A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.

  The "Library", below, refers to any such software library or work
which has been distributed under these terms.  A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language.  (Hereinafter, translation is
included without limitation in the term "modification".)

  "Source code" for a work means the preferred form of the work for
making modifications to it.  For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control compilation
and installation of the library.

  Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope.  The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it).  Whether that is true depends on what the Library does
and what the program that uses the Library does.

  1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.

  You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.

  2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:

    a) The modified work must itself be a software library.

    b) You must cause the files modified to carry prominent notices
    stating that you changed the files and the date of any change.

    c) You must cause the whole of the work to be licensed at no
    charge to all third parties under the terms of this License.

    d) If a facility in the modified Library refers to a function or a
    table of data to be supplied by an application program that uses
    the facility, other than as an argument passed when the facility
    is invoked, then you must make a good faith effort to ensure that,
    in the event an application does not supply such function or
    table, the facility still operates, and performs whatever part of
    its purpose remains meaningful.

    (For example, a function in a library to compute square roots has
    a purpose that is entirely well-defined independent of the
    application.  Therefore, Subsection 2d requires that any
    application-supplied function or table used by this function must
    be optional: if the application does not supply it, the square
    root function must still compute square roots.)

These requirements apply to the modified work as a whole.  If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works.  But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.

Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.

In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.

  3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library.  To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License.  (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.)  Do not make any other change in
these notices.

  Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.

  This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.

  4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.

  If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.

  5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library".  Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.

  However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library".  The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.

  When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library.  The
threshold for this to be true is not precisely defined by law.

  If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work.  (Executables containing this object code plus portions of the
Library will still fall under Section 6.)

  Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.

  6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.

  You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License.  You must supply a copy of this License.  If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License.  Also, you must do one
of these things:

    a) Accompany the work with the complete corresponding
    machine-readable source code for the Library including whatever
    changes were used in the work (which must be distributed under
    Sections 1 and 2 above); and, if the work is an executable linked
    with the Library, with the complete machine-readable "work that
    uses the Library", as object code and/or source code, so that the
    user can modify the Library and then relink to produce a modified
    executable containing the modified Library.  (It is understood
    that the user who changes the contents of definitions files in the
    Library will not necessarily be able to recompile the application
    to use the modified definitions.)

    b) Use a suitable shared library mechanism for linking with the
    Library.  A suitable mechanism is one that (1) uses at run time a
    copy of the library already present on the user's computer system,
    rather than copying library functions into the executable, and (2)
    will operate properly with a modified version of the library, if
    the user installs one, as long as the modified version is
    interface-compatible with the version that the work was made with.

    c) Accompany the work with a written offer, valid for at
    least three years, to give the same user the materials
    specified in Subsection 6a, above, for a charge no more
    than the cost of performing this distribution.

    d) If distribution of the work is made by offering access to copy
    from a designated place, offer equivalent access to copy the above
    specified materials from the same place.

    e) Verify that the user has already received a copy of these
    materials or that you have already sent this user a copy.

  For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it.  However, as a special exception,
the materials to be distributed need not include anything that is
normally distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.

  It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system.  Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.

  7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:

    a) Accompany the combined library with a copy of the same work
    based on the Library, uncombined with any other library
    facilities.  This must be distributed under the terms of the
    Sections above.

    b) Give prominent notice with the combined library of the fact
    that part of it is a work based on the Library, and explaining
    where to find the accompanying uncombined form of the same work.

  8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License.  Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License.  However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.

  9. You are not required to accept this License, since you have not
signed it.  However, nothing else grants you permission to modify or
distribute the Library or its derivative works.  These actions are
prohibited by law if you do not accept this License.  Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.

  10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions.  You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with
this License.

  11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all.  For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.

If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply,
and the section as a whole is intended to apply in other circumstances.

It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices.  Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.

This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.

  12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License may add
an explicit geographical distribution limitation excluding those countries,
so that distribution is permitted only in or among countries not thus
excluded.  In such case, this License incorporates the limitation as if
written in the body of this License.

  13. The Free Software Foundation may publish revised and/or new
versions of the Lesser General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number.  If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation.  If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.

  14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission.  For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this.  Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.

			    NO WARRANTY

  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.

		     END OF TERMS AND CONDITIONS

           How to Apply These Terms to Your New Libraries

  If you develop a new library, and you want it to be of the greatest
possible use to the public, we recommend making it free software that
everyone can redistribute and change.  You can do so by permitting
redistribution under these terms (or, alternatively, under the terms of the
ordinary General Public License).

  To apply these terms, attach the following notices to the library.  It is
safest to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.

    <one line to give the library's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA

Also add information on how to contact you by electronic and paper mail.

You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the library, if
necessary.  Here is a sample; alter the names:

  Yoyodyne, Inc., hereby disclaims all copyright interest in the
  library `Frob' (a library for tweaking knobs) written by James Random Hacker.

  <signature of Ty Coon>, 1 April 1990
  Ty Coon, President of Vice

That's all there is to it!

    vim: et sw=4 sts=4
htmlpurifier/CREDITS000064400000000525151214231100010266 0ustar00
CREDITS

Almost everything written by Edward Z. Yang (Ambush Commander).  Lots of thanks
to the DevNetwork Community for their help (see docs/ref-devnetwork.html for
more details), Feyd especially (namely IPv6 and optimization).  Thanks to RSnake
for letting me package his fantastic XSS cheatsheet for a smoketest.

    vim: et sw=4 sts=4
appsero/VERSION000064400000000006151214231100007247 0ustar001.2.2
appsero/src/License.php000064400000063177151214231100011103 0ustar00<?php

namespace Appsero;

/**
 * Appsero License Checker
 *
 * This class will check, active and deactive license
 */
class License {

    /**
     * AppSero\Client
     *
     * @var object
     */
    protected $client;

    /**
     * Arguments of create menu
     *
     * @var array
     */
    protected $menu_args;

    /**
     * `option_name` of `wp_options` table
     *
     * @var string
     */
    protected $option_key;

    /**
     * Error message of HTTP request
     *
     * @var string
     */
    public $error;

    /**
     * Success message on form submit
     *
     * @var string
     */
    public $success;

    /**
     * Corn schedule hook name
     *
     * @var string
     */
    protected $schedule_hook;

    /**
     * Set value for valid license
     *
     * @var bool
     */
    private $is_valid_license = null;

    /**
     * Initialize the class
     *
     * @param Appsero\Client
     */
    public function __construct( Client $client ) {
        $this->client = $client;

        $this->option_key = 'appsero_' . md5( $this->client->slug ) . '_manage_license';

        $this->schedule_hook = $this->client->slug . '_license_check_event';

        // Creating WP Ajax Endpoint to refresh license remotely
        add_action( "wp_ajax_appsero_refresh_license_" . $this->client->hash, array( $this, 'refresh_license_api' ) );

        // Run hook to check license status daily
        add_action( $this->schedule_hook, array( $this, 'check_license_status' ) );

        // Active/Deactive corn schedule
        $this->run_schedule();
    }

    /**
     * Set the license option key.
     *
     * If someone wants to override the default generated key.
     *
     * @param string $key
     *
     * @since 1.3.0
     *
     * @return License
     */
    public function set_option_key( $key ) {
        $this->option_key = $key;

        return $this;
    }

    /**
     * Get the license key
     *
     * @since 1.3.0
     *
     * @return string|null
     */
    public function get_license() {
        return get_option( $this->option_key, null );
    }

    /**
     * Check license
     *
     * @return bool
     */
    public function check( $license_key ) {
        $route    = 'public/license/' . $this->client->hash . '/check';

        return $this->send_request( $license_key, $route );
    }

    /**
     * Active a license
     *
     * @return bool
     */
    public function activate( $license_key ) {
        $route    = 'public/license/' . $this->client->hash . '/activate';

        return $this->send_request( $license_key, $route );
    }

    /**
     * Deactivate a license
     *
     * @return bool
     */
    public function deactivate( $license_key ) {
        $route    = 'public/license/' . $this->client->hash . '/deactivate';

        return $this->send_request( $license_key, $route );
    }

    /**
     * Send common request
     *
     * @param $license_key
     * @param $route
     *
     * @return array
     */
    protected function send_request( $license_key, $route ) {
        $params = array(
            'license_key' => $license_key,
            'url'         => esc_url( home_url() ),
            'is_local'    => $this->client->is_local_server(),
        );

        $response = $this->client->send_request( $params, $route, true );

        if ( is_wp_error( $response ) ) {
            return array(
                'success' => false,
                'error'   => $response->get_error_message()
            );
        }

        $response = json_decode( wp_remote_retrieve_body( $response ), true );

        if ( empty( $response ) || isset( $response['exception'] )) {
            return array(
                'success' => false,
                'error'   => $this->client->__trans( 'Unknown error occurred, Please try again.' ),
            );
        }

        if ( isset( $response['errors'] ) && isset( $response['errors']['license_key'] ) ) {
            $response = array(
                'success' => false,
                'error'   => $response['errors']['license_key'][0]
            );
        }

        return $response;
    }

    /**
     * License Refresh Endpoint
     */
    public function refresh_license_api() {
        $this->check_license_status();

        return wp_send_json(
            array(
                'message' => 'License refreshed successfully.'
            ),
            200
        );
    }

    /**
     * Add settings page for license
     *
     * @param array $args
     *
     * @return void
     */
    public function add_settings_page( $args = array() ) {
        $defaults = array(
            'type'        => 'menu', // Can be: menu, options, submenu
            'page_title'  => 'Manage License',
            'menu_title'  => 'Manage License',
            'capability'  => 'manage_options',
            'menu_slug'   => $this->client->slug . '-manage-license',
            'icon_url'    => '',
            'position'    => null,
            'parent_slug' => '',
        );

        $this->menu_args = wp_parse_args( $args, $defaults );

        add_action( 'admin_menu', array( $this, 'admin_menu' ), 99 );
    }

    /**
     * Admin Menu hook
     *
     * @return void
     */
    public function admin_menu() {
        switch ( $this->menu_args['type'] ) {
            case 'menu':
                $this->create_menu_page();
                break;

            case 'submenu':
                $this->create_submenu_page();
                break;

            case 'options':
                $this->create_options_page();
                break;
        }
    }

    /**
     * License menu output
     */
    public function menu_output() {
        if ( isset( $_POST['submit'] ) ) {
            $this->license_form_submit( $_POST );
        }

        $license = $this->get_license();
        $action  = ( $license && isset( $license['status'] ) && 'activate' == $license['status'] ) ? 'deactive' : 'active';
        $this->licenses_style();
        ?>

        <div class="wrap appsero-license-settings-wrapper">
            <h1>License Settings</h1>

            <?php
                $this->show_license_page_notices();
                do_action( 'before_appsero_license_section' );
            ?>

            <div class="appsero-license-settings appsero-license-section">
                <?php $this->show_license_page_card_header( $license ); ?>

                <div class="appsero-license-details">
                    <p>
                        <?php printf( $this->client->__trans( 'Activate <strong>%s</strong> by your license key to get professional support and automatic update from your WordPress dashboard.' ), $this->client->name ); ?>
                    </p>
                    <form method="post" action="<?php $this->form_action_url(); ?>" novalidate="novalidate" spellcheck="false">
                        <input type="hidden" name="_action" value="<?php echo $action; ?>">
                        <input type="hidden" name="_nonce" value="<?php echo wp_create_nonce( $this->client->name ); ?>">
                        <div class="license-input-fields">
                            <div class="license-input-key">
                                <svg enable-background="new 0 0 512 512" version="1.1" viewBox="0 0 512 512" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
                                    <path d="m463.75 48.251c-64.336-64.336-169.01-64.335-233.35 1e-3 -43.945 43.945-59.209 108.71-40.181 167.46l-185.82 185.82c-2.813 2.813-4.395 6.621-4.395 10.606v84.858c0 8.291 6.709 15 15 15h84.858c3.984 0 7.793-1.582 10.605-4.395l21.211-21.226c3.237-3.237 4.819-7.778 4.292-12.334l-2.637-22.793 31.582-2.974c7.178-0.674 12.847-6.343 13.521-13.521l2.974-31.582 22.793 2.651c4.233 0.571 8.496-0.85 11.704-3.691 3.193-2.856 5.024-6.929 5.024-11.206v-27.929h27.422c3.984 0 7.793-1.582 10.605-4.395l38.467-37.958c58.74 19.043 122.38 4.929 166.33-39.046 64.336-64.335 64.336-169.01 0-233.35zm-42.435 106.07c-17.549 17.549-46.084 17.549-63.633 0s-17.549-46.084 0-63.633 46.084-17.549 63.633 0 17.548 46.084 0 63.633z"/>
                                </svg>
                                <input type="text" value="<?php echo $this->get_input_license_value( $action, $license ); ?>"
                                    placeholder="<?php echo esc_attr( $this->client->__trans( 'Enter your license key to activate' ) ); ?>" name="license_key"
                                    <?php echo ( 'deactive' == $action ) ? 'readonly="readonly"' : ''; ?>
                                />
                            </div>
                            <button type="submit" name="submit" class="<?php echo 'deactive' == $action ? 'deactive-button' : ''; ?>">
                                <?php echo $action == 'active' ? $this->client->__trans( 'Activate License' ) : $this->client->__trans( 'Deactivate License' ); ?>
                            </button>
                        </div>
                    </form>

                    <?php
                        if ( 'deactive' == $action && isset( $license['remaining'] ) ) {
                            $this->show_active_license_info( $license );
                        } ?>
                </div>
            </div> <!-- /.appsero-license-settings -->

            <?php do_action( 'after_appsero_license_section' ); ?>
        </div>
        <?php
    }

    /**
     * License form submit
     */
    public function license_form_submit( $form ) {
        if ( ! isset( $form['_nonce'], $form['_action'] ) ) {
            $this->error = $this->client->__trans( 'Please add all information' );

            return;
        }

        if ( ! wp_verify_nonce( $form['_nonce'], $this->client->name ) ) {
            $this->error = $this->client->__trans( "You don't have permission to manage license." );

            return;
        }

        switch ( $form['_action'] ) {
            case 'active':
                $this->active_client_license( $form );
                break;

            case 'deactive':
                $this->deactive_client_license( $form );
                break;

            case 'refresh':
                $this->refresh_client_license( $form );
                break;
        }
    }

    /**
     * Check license status on schedule
     */
    public function check_license_status() {
        $license = $this->get_license();

        if ( isset( $license['key'] ) && ! empty( $license['key'] ) ) {
            $response = $this->check( $license['key'] );

            if ( isset( $response['success'] ) && $response['success'] ) {
                $license['status']           = 'activate';
                $license['remaining']        = $response['remaining'];
                $license['activation_limit'] = $response['activation_limit'];
                $license['expiry_days']      = $response['expiry_days'];
                $license['title']            = $response['title'];
                $license['source_id']        = $response['source_identifier'];
                $license['recurring']        = $response['recurring'];
            } else {
                $license['status']      = 'deactivate';
                $license['expiry_days'] = 0;
            }

            update_option( $this->option_key, $license, false );
        }
    }

    /**
     * Check this is a valid license
     */
    public function is_valid() {
        if ( null !== $this->is_valid_license ) {
            return $this->is_valid_license;
        }

        $license = $this->get_license();

        if ( ! empty( $license['key'] ) && isset( $license['status'] ) && $license['status'] == 'activate' ) {
            $this->is_valid_license = true;
        } else {
            $this->is_valid_license = false;
        }

        return $this->is_valid_license;
    }

    /**
     * Check this is a valid license
     */
    public function is_valid_by( $option, $value ) {
        $license = $this->get_license();

        if ( ! empty( $license['key'] ) && isset( $license['status'] ) && $license['status'] == 'activate' ) {
            if ( isset( $license[ $option ] ) && $license[ $option ] == $value ) {
                return true;
            }
        }

        return false;
    }

    /**
     * Styles for licenses page
     */
    private function licenses_style() {
        ?>
        <style type="text/css">
            .appsero-license-section {
                width: 100%;
                max-width: 1100px;
                min-height: 1px;
                box-sizing: border-box;
            }
            .appsero-license-settings {
                background-color: #fff;
                box-shadow: 0px 3px 10px rgba(16, 16, 16, 0.05);
            }
            .appsero-license-settings * {
                box-sizing: border-box;
            }
            .appsero-license-title {
                background-color: #F8FAFB;
                border-bottom: 2px solid #EAEAEA;
                display: flex;
                align-items: center;
                padding: 10px 20px;
            }
            .appsero-license-title svg {
                width: 30px;
                height: 30px;
                fill: #0082BF;
            }
            .appsero-license-title span {
                font-size: 17px;
                color: #444444;
                margin-left: 10px;
            }
            .appsero-license-details {
                padding: 20px;
            }
            .appsero-license-details p {
                font-size: 15px;
                margin: 0 0 20px 0;
            }
            .license-input-key {
                position: relative;
                flex: 0 0 72%;
                max-width: 72%;
            }
            .license-input-key input {
                background-color: #F9F9F9;
                padding: 10px 15px 10px 48px;
                border: 1px solid #E8E5E5;
                border-radius: 3px;
                height: 45px;
                font-size: 16px;
                color: #71777D;
                width: 100%;
                box-shadow: 0 0 0 transparent;
            }
            .license-input-key input:focus {
                outline: 0 none;
                border: 1px solid #E8E5E5;
                box-shadow: 0 0 0 transparent;
            }
            .license-input-key svg {
                width: 22px;
                height: 22px;
                fill: #0082BF;
                position: absolute;
                left: 14px;
                top: 13px;
            }
            .license-input-fields {
                display: flex;
                justify-content: space-between;
                margin-bottom: 30px;
                max-width: 850px;
                width: 100%;
            }
            .license-input-fields button {
                color: #fff;
                font-size: 17px;
                padding: 8px;
                height: 46px;
                background-color: #0082BF;
                border-radius: 3px;
                cursor: pointer;
                flex: 0 0 25%;
                max-width: 25%;
                border: 1px solid #0082BF;
            }
            .license-input-fields button.deactive-button {
                background-color: #E40055;
                border-color: #E40055;
            }
            .license-input-fields button:focus {
                outline: 0 none;
            }
            .active-license-info {
                display: flex;
            }
            .single-license-info {
                min-width: 220px;
                flex: 0 0 30%;
            }
            .single-license-info h3 {
                font-size: 18px;
                margin: 0 0 12px 0;
            }
            .single-license-info p {
                margin: 0;
                color: #00C000;
            }
            .single-license-info p.occupied {
                color: #E40055;
            }
            .appsero-license-right-form {
                margin-left: auto;
            }
            .appsero-license-refresh-button {
                padding: 6px 10px 4px 10px;
                border: 1px solid #0082BF;
                border-radius: 3px;
                margin-left: auto;
                background-color: #0082BF;
                color: #fff;
                cursor: pointer;
            }
            .appsero-license-refresh-button .dashicons {
                color: #fff;
                margin-left: 0;
            }
        </style>
        <?php
    }

    /**
     * Show active license information
     */
    private function show_active_license_info( $license ) {
        ?>
        <div class="active-license-info">
            <div class="single-license-info">
                <h3><?php $this->client->_etrans( 'Activations Remaining' ); ?></h3>
                <?php if ( empty( $license['activation_limit'] ) ) { ?>
                    <p><?php $this->client->_etrans( 'Unlimited' ); ?></p>
                <?php } else { ?>
                    <p class="<?php echo $license['remaining'] ? '' : 'occupied'; ?>">
                        <?php printf( $this->client->__trans( '%1$d out of %2$d' ), $license['remaining'], $license['activation_limit'] ); ?>
                    </p>
                <?php } ?>
            </div>
            <div class="single-license-info">
                <h3><?php $this->client->_etrans( 'Expires in' ); ?></h3>
                <?php
                    if ( false !== $license['expiry_days'] ) {
                        $occupied = $license['expiry_days'] > 21 ? '' : 'occupied';
                        echo '<p class="' . $occupied . '">' . $license['expiry_days'] . ' days</p>';
                    } else {
                        echo '<p>' . $this->client->__trans( 'Never' ) . '</p>';
                    } ?>
            </div>
        </div>
        <?php
    }

    /**
     * Show license settings page notices
     */
    private function show_license_page_notices() {
        if ( ! empty( $this->error ) ) {
            ?>
            <div class="notice notice-error is-dismissible appsero-license-section">
                <p><?php echo $this->error; ?></p>
            </div>
        <?php
        }

        if ( ! empty( $this->success ) ) {
            ?>
            <div class="notice notice-success is-dismissible appsero-license-section">
                <p><?php echo $this->success; ?></p>
            </div>
        <?php
        }
        echo '<br />';
    }

    /**
     * Card header
     */
    private function show_license_page_card_header( $license ) {
        ?>
        <div class="appsero-license-title">
            <svg enable-background="new 0 0 299.995 299.995" version="1.1" viewBox="0 0 300 300" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
                <path d="m150 161.48c-8.613 0-15.598 6.982-15.598 15.598 0 5.776 3.149 10.807 7.817 13.505v17.341h15.562v-17.341c4.668-2.697 7.817-7.729 7.817-13.505 0-8.616-6.984-15.598-15.598-15.598z"/>
                <path d="m150 85.849c-13.111 0-23.775 10.665-23.775 23.775v25.319h47.548v-25.319c-1e-3 -13.108-10.665-23.775-23.773-23.775z"/>
                <path d="m150 1e-3c-82.839 0-150 67.158-150 150 0 82.837 67.156 150 150 150s150-67.161 150-150c0-82.839-67.161-150-150-150zm46.09 227.12h-92.173c-9.734 0-17.626-7.892-17.626-17.629v-56.919c0-8.491 6.007-15.582 14.003-17.25v-25.697c0-27.409 22.3-49.711 49.711-49.711 27.409 0 49.709 22.3 49.709 49.711v25.697c7.993 1.673 14 8.759 14 17.25v56.919h2e-3c0 9.736-7.892 17.629-17.626 17.629z"/>
            </svg>
            <span><?php echo $this->client->__trans( 'Activate License' ); ?></span>

            <?php if ( $license && $license['key'] ) : ?>
            <form method="post" class="appsero-license-right-form" action="<?php $this->form_action_url(); ?>" novalidate="novalidate" spellcheck="false">
                <input type="hidden" name="_action" value="refresh">
                <input type="hidden" name="_nonce" value="<?php echo wp_create_nonce( $this->client->name ); ?>">
                <button type="submit" name="submit" class="appsero-license-refresh-button">
                    <span class="dashicons dashicons-update"></span>
                    <?php echo $this->client->__trans( 'Refresh License' ); ?>
                </button>
            </form>
            <?php endif; ?>

        </div>
        <?php
    }

    /**
     * Active client license
     */
    private function active_client_license( $form ) {
        if ( empty( $form['license_key'] ) ) {
            $this->error = $this->client->__trans( 'The license key field is required.' );

            return;
        }

        $license_key = sanitize_text_field( $form['license_key'] );
        $response    = $this->activate( $license_key );

        if ( ! $response['success'] ) {
            $this->error = $response['error'] ? $response['error'] : $this->client->__trans( 'Unknown error occurred.' );

            return;
        }

        $data = array(
            'key'              => $license_key,
            'status'           => 'activate',
            'remaining'        => $response['remaining'],
            'activation_limit' => $response['activation_limit'],
            'expiry_days'      => $response['expiry_days'],
            'title'            => $response['title'],
            'source_id'        => $response['source_identifier'],
            'recurring'        => $response['recurring'],
        );

        update_option( $this->option_key, $data, false );

        $this->success = $this->client->__trans( 'License activated successfully.' );
    }

    /**
     * Deactive client license
     */
    private function deactive_client_license( $form ) {
        $license = $this->get_license();

        if ( empty( $license['key'] ) ) {
            $this->error = $this->client->__trans( 'License key not found.' );

            return;
        }

        $response = $this->deactivate( $license['key'] );

        $data = array(
            'key'    => '',
            'status' => 'deactivate',
        );

        update_option( $this->option_key, $data, false );

        if ( ! $response['success'] ) {
            $this->error = $response['error'] ? $response['error'] : $this->client->__trans( 'Unknown error occurred.' );

            return;
        }

        $this->success = $this->client->__trans( 'License deactivated successfully.' );
    }

    /**
     * Refresh Client License
     */
    private function refresh_client_license( $form = null ) {
        $license = $this->get_license();

        if( !$license || ! isset( $license['key'] ) || empty( $license['key'] ) ) {
            $this->error = $this->client->__trans( "License key not found" );
            return;
        }

        $this->check_license_status();

        $this->success = $this->client->__trans( 'License refreshed successfully.' );
    }

    /**
     * Add license menu page
     */
    private function create_menu_page() {
        call_user_func(
            'add_' . 'menu' . '_page',
            $this->menu_args['page_title'],
            $this->menu_args['menu_title'],
            $this->menu_args['capability'],
            $this->menu_args['menu_slug'],
            array( $this, 'menu_output' ),
            $this->menu_args['icon_url'],
            $this->menu_args['position']
        );
    }

    /**
     * Add submenu page
     */
    private function create_submenu_page() {
        call_user_func(
            'add_' . 'submenu' . '_page',
            $this->menu_args['parent_slug'],
            $this->menu_args['page_title'],
            $this->menu_args['menu_title'],
            $this->menu_args['capability'],
            $this->menu_args['menu_slug'],
            array( $this, 'menu_output' ),
            $this->menu_args['position']
        );
    }

    /**
     * Add submenu page
     */
    private function create_options_page() {
        call_user_func(
            'add_' . 'options' . '_page',
            $this->menu_args['page_title'],
            $this->menu_args['menu_title'],
            $this->menu_args['capability'],
            $this->menu_args['menu_slug'],
            array( $this, 'menu_output' ),
            $this->menu_args['position']
        );
    }

    /**
     * Schedule daily sicense checker event
     */
    public function schedule_cron_event() {
        if ( ! wp_next_scheduled( $this->schedule_hook ) ) {
            wp_schedule_event( time(), 'daily', $this->schedule_hook );

            wp_schedule_single_event( time() + 20, $this->schedule_hook );
        }
    }

    /**
     * Clear any scheduled hook
     */
    public function clear_scheduler() {
        wp_clear_scheduled_hook( $this->schedule_hook );
    }

    /**
     * Enable/Disable schedule
     */
    private function run_schedule() {
        switch ( $this->client->type ) {
            case 'plugin':
                register_activation_hook( $this->client->file, array( $this, 'schedule_cron_event' ) );
                register_deactivation_hook( $this->client->file, array( $this, 'clear_scheduler' ) );
                break;

            case 'theme':
                add_action( 'after_switch_theme', array( $this, 'schedule_cron_event' ) );
                add_action( 'switch_theme', array( $this, 'clear_scheduler' ) );
                break;
        }
    }

    /**
     * Form action URL
     */
    private function form_action_url() {
        $url = add_query_arg(
            $_GET,
            admin_url( basename( $_SERVER['SCRIPT_NAME'] ) )
        );

        echo apply_filters( 'appsero_client_license_form_action', $url );
    }

    /**
     * Get input license key
     *
     * @param  $action
     *
     * @return $license
     */
    private function get_input_license_value( $action, $license ) {
        if ( 'active' == $action ) {
            return isset( $license['key'] ) ? $license['key'] : '';
        }

        if ( 'deactive' == $action ) {
            $key_length = strlen( $license['key'] );

            return str_pad(
                substr( $license['key'], 0, $key_length / 2 ), $key_length, '*'
            );
        }

        return '';
    }
}
appsero/src/Updater.php000064400000016273151214231100011120 0ustar00<?php
namespace Appsero;

/**
 * Appsero Updater
 *
 * This class will show new updates project
 */
class Updater {

    /**
     * Appsero\Client
     *
     * @var object
     */
    protected $client;

    /**
     * Initialize the class
     *
     * @param Appsero\Client
     */
    public function __construct( Client $client ) {

        $this->client    = $client;
        $this->cache_key = 'appsero_' . md5( $this->client->slug ) . '_version_info';

        // Run hooks.
        if ( $this->client->type == 'plugin' ) {
            $this->run_plugin_hooks();
        } elseif ( $this->client->type == 'theme' ) {
            $this->run_theme_hooks();
        }
    }

    /**
     * Set up WordPress filter to hooks to get update.
     *
     * @return void
     */
    public function run_plugin_hooks() {
        add_filter( 'pre_set_site_transient_update_plugins', array( $this, 'check_plugin_update' ) );
        add_filter( 'plugins_api', array( $this, 'plugins_api_filter' ), 10, 3 );
    }

    /**
     * Set up WordPress filter to hooks to get update.
     *
     * @return void
     */
    public function run_theme_hooks() {
        add_filter( 'pre_set_site_transient_update_themes', array( $this, 'check_theme_update' ) );
    }

    /**
     * Check for Update for this specific project
     */
    public function check_plugin_update( $transient_data ) {
        global $pagenow;

        if ( ! is_object( $transient_data ) ) {
            $transient_data = new \stdClass;
        }

        if ( 'plugins.php' == $pagenow && is_multisite() ) {
            return $transient_data;
        }

        if ( ! empty( $transient_data->response ) && ! empty( $transient_data->response[ $this->client->basename ] ) ) {
            return $transient_data;
        }

        $version_info = $this->get_version_info();

        if ( false !== $version_info && is_object( $version_info ) && isset( $version_info->new_version ) ) {

            unset( $version_info->sections );

            // If new version available then set to `response`
            if ( version_compare( $this->client->project_version, $version_info->new_version, '<' ) ) {
                $transient_data->response[ $this->client->basename ] = $version_info;
            } else {
                // If new version is not available then set to `no_update`
                $transient_data->no_update[ $this->client->basename ] = $version_info;
            }

            $transient_data->last_checked = time();
            $transient_data->checked[ $this->client->basename ] = $this->client->project_version;
        }

        return $transient_data;
    }

    /**
     * Get version info from database
     *
     * @return Object or Boolean
     */
    private function get_cached_version_info() {
        global $pagenow;

        // If updater page then fetch from API now
        if ( 'update-core.php' == $pagenow ) {
            return false; // Force to fetch data
        }

        $value = get_transient( $this->cache_key );

        if( ! $value && ! isset( $value->name ) ) {
            return false; // Cache is expired
        }

        // We need to turn the icons into an array
        if ( isset( $value->icons ) ) {
            $value->icons = (array) $value->icons;
        }

        // We need to turn the banners into an array
        if ( isset( $value->banners ) ) {
            $value->banners = (array) $value->banners;
        }

        if ( isset( $value->sections ) ) {
            $value->sections = (array) $value->sections;
        }

        return $value;
    }

    /**
     * Set version info to database
     */
    private function set_cached_version_info( $value ) {
        if ( ! $value ) {
            return;
        }

        set_transient( $this->cache_key, $value, 3 * HOUR_IN_SECONDS );
    }

    /**
     * Get plugin info from Appsero
     */
    private function get_project_latest_version() {

        $license = $this->client->license()->get_license();

        $params = array(
            'version'     => $this->client->project_version,
            'name'        => $this->client->name,
            'slug'        => $this->client->slug,
            'basename'    => $this->client->basename,
            'license_key' => ! empty( $license ) && isset( $license['key'] ) ? $license['key'] : '',
        );

        $route = 'update/' . $this->client->hash . '/check';

        $response = $this->client->send_request( $params, $route, true );

        if ( is_wp_error( $response ) ) {
            return false;
        }

        $response = json_decode( wp_remote_retrieve_body( $response ) );

        if ( ! isset( $response->slug ) ) {
            return false;
        }

        if ( isset( $response->icons ) ) {
            $response->icons = (array) $response->icons;
        }

        if ( isset( $response->banners ) ) {
            $response->banners = (array) $response->banners;
        }

        if ( isset( $response->sections ) ) {
            $response->sections = (array) $response->sections;
        }

        return $response;
    }

    /**
     * Updates information on the "View version x.x details" page with custom data.
     *
     * @param mixed   $data
     * @param string  $action
     * @param object  $args
     *
     * @return object $data
     */
    public function plugins_api_filter( $data, $action = '', $args = null ) {

        if ( $action != 'plugin_information' ) {
            return $data;
        }

        if ( ! isset( $args->slug ) || ( $args->slug != $this->client->slug ) ) {
            return $data;
        }

        return $this->get_version_info();
    }

    /**
     * Check theme upate
     */
    public function check_theme_update( $transient_data ) {
        global $pagenow;

        if ( ! is_object( $transient_data ) ) {
            $transient_data = new \stdClass;
        }

        if ( 'themes.php' == $pagenow && is_multisite() ) {
            return $transient_data;
        }

        if ( ! empty( $transient_data->response ) && ! empty( $transient_data->response[ $this->client->slug ] ) ) {
            return $transient_data;
        }

        $version_info = $this->get_version_info();

        if ( false !== $version_info && is_object( $version_info ) && isset( $version_info->new_version ) ) {

            // If new version available then set to `response`
            if ( version_compare( $this->client->project_version, $version_info->new_version, '<' ) ) {
                $transient_data->response[ $this->client->slug ] = (array) $version_info;
            } else {
                // If new version is not available then set to `no_update`
                $transient_data->no_update[ $this->client->slug ] = (array) $version_info;
            }

            $transient_data->last_checked = time();
            $transient_data->checked[ $this->client->slug ] = $this->client->project_version;
        }

        return $transient_data;
    }

    /**
     * Get version information
     */
    private function get_version_info() {
        $version_info = $this->get_cached_version_info();

        if ( false === $version_info ) {
            $version_info = $this->get_project_latest_version();
            $this->set_cached_version_info( $version_info );
        }

        return $version_info;
    }

}
appsero/src/Client.php000064400000013705151214231100010727 0ustar00<?php
namespace Appsero;

/**
 * Appsero Client
 *
 * This class is necessary to set project data
 */
class Client {

    /**
     * The client version
     *
     * @var string
     */
    public $version = '1.2.0';

    /**
     * Hash identifier of the plugin
     *
     * @var string
     */
    public $hash;

    /**
     * Name of the plugin
     *
     * @var string
     */
    public $name;

    /**
     * The plugin/theme file path
     * @example .../wp-content/plugins/test-slug/test-slug.php
     *
     * @var string
     */
    public $file;

    /**
     * Main plugin file
     * @example test-slug/test-slug.php
     *
     * @var string
     */
    public $basename;

    /**
     * Slug of the plugin
     * @example test-slug
     *
     * @var string
     */
    public $slug;

    /**
     * The project version
     *
     * @var string
     */
    public $project_version;

    /**
     * The project type
     *
     * @var string
     */
    public $type;

    /**
     * textdomain
     *
     * @var string
     */
    public $textdomain;

    /**
     * The Object of Insights Class
     *
     * @var object
     */
    private $insights;

    /**
     * The Object of Updater Class
     *
     * @var object
     */
    private $updater;

    /**
     * The Object of License Class
     *
     * @var object
     */
    private $license;

	/**
     * Initialize the class
     *
     * @param string  $hash hash of the plugin
     * @param string  $name readable name of the plugin
     * @param string  $file main plugin file path
     */
    public function __construct( $hash, $name, $file ) {
        $this->hash = $hash;
        $this->name = $name;
        $this->file = $file;

        $this->set_basename_and_slug();
    }

    /**
     * Initialize insights class
     *
     * @return Appsero\Insights
     */
    public function insights() {

        if ( ! class_exists( __NAMESPACE__ . '\Insights') ) {
            require_once __DIR__ . '/Insights.php';
        }

        // if already instantiated, return the cached one
        if ( $this->insights ) {
            return $this->insights;
        }

        $this->insights = new Insights( $this );

        return $this->insights;
    }

    /**
     * Initialize plugin/theme updater
     *
     * @return Appsero\Updater
     */
    public function updater() {

        if ( ! class_exists( __NAMESPACE__ . '\Updater') ) {
            require_once __DIR__ . '/Updater.php';
        }

        // if already instantiated, return the cached one
        if ( $this->updater ) {
            return $this->updater;
        }

        $this->updater = new Updater( $this );

        return $this->updater;
    }

    /**
     * Initialize license checker
     *
     * @return Appsero\License
     */
    public function license() {

        if ( ! class_exists( __NAMESPACE__ . '\License') ) {
            require_once __DIR__ . '/License.php';
        }

        // if already instantiated, return the cached one
        if ( $this->license ) {
            return $this->license;
        }

        $this->license = new License( $this );

        return $this->license;
    }

    /**
     * API Endpoint
     *
     * @return string
     */
    public function endpoint() {
        $endpoint = apply_filters( 'appsero_endpoint', 'https://api.appsero.com' );

        return trailingslashit( $endpoint );
    }

    /**
     * Set project basename, slug and version
     *
     * @return void
     */
    protected function set_basename_and_slug() {

        if ( strpos( $this->file, WP_CONTENT_DIR . '/themes/' ) === false ) {
            $this->basename = plugin_basename( $this->file );

            list( $this->slug, $mainfile) = explode( '/', $this->basename );

            require_once ABSPATH . 'wp-admin/includes/plugin.php';

            $plugin_data = get_plugin_data( $this->file );

            $this->project_version = $plugin_data['Version'];
            $this->type = 'plugin';
        } else {
            $this->basename = str_replace( WP_CONTENT_DIR . '/themes/', '', $this->file );

            list( $this->slug, $mainfile) = explode( '/', $this->basename );

            $theme = wp_get_theme( $this->slug );

            $this->project_version = $theme->version;
            $this->type = 'theme';
        }

        $this->textdomain = $this->slug;
    }

    /**
     * Send request to remote endpoint
     *
     * @param  array  $params
     * @param  string $route
     *
     * @return array|WP_Error   Array of results including HTTP headers or WP_Error if the request failed.
     */
    public function send_request( $params, $route, $blocking = false ) {
        $url = $this->endpoint() . $route;

        $headers = array(
            'user-agent' => 'Appsero/' . md5( esc_url( home_url() ) ) . ';',
            'Accept'     => 'application/json',
        );

        $response = wp_remote_post( $url, array(
            'method'      => 'POST',
            'timeout'     => 30,
            'redirection' => 5,
            'httpversion' => '1.0',
            'blocking'    => $blocking,
            'headers'     => $headers,
            'body'        => array_merge( $params, array( 'client' => $this->version ) ),
            'cookies'     => array()
        ) );

        return $response;
    }

    /**
     * Check if the current server is localhost
     *
     * @return boolean
     */
    public function is_local_server() {
        $is_local = in_array( $_SERVER['REMOTE_ADDR'], array( '127.0.0.1', '::1' ) );

        return apply_filters( 'appsero_is_local', $is_local );
    }

    /**
     * Translate function _e()
     */
    public function _etrans( $text ) {
        call_user_func( '_e', $text, $this->textdomain );
    }

    /**
     * Translate function __()
     */
    public function __trans( $text ) {
        return call_user_func( '__', $text, $this->textdomain );
    }

    /**
     * Set project textdomain
     */
    public function set_textdomain( $textdomain ) {
        $this->textdomain = $textdomain;
    }
}
appsero/src/Insights.php000064400000124707151214231100011306 0ustar00<?php
namespace Appsero;

/**
 * Appsero Insights
 *
 * This is a tracker class to track plugin usage based on if the customer has opted in.
 * No personal information is being tracked by this class, only general settings, active plugins, environment details
 * and admin email.
 */
class Insights {

    /**
     * The notice text
     *
     * @var string
     */
    public $notice;

    /**
     * Wheather to the notice or not
     *
     * @var boolean
     */
    protected $show_notice = true;

    /**
     * If extra data needs to be sent
     *
     * @var array
     */
    protected $extra_data = array();

    /**
     * AppSero\Client
     *
     * @var object
     */
    protected $client;

    /**
     * @var boolean
     */
    private $plugin_data = false;


    /**
     * Initialize the class
     *
     * @param      $client
     * @param null $name
     * @param null $file
     */
    public function __construct( $client, $name = null, $file = null ) {

        if ( is_string( $client ) && ! empty( $name ) && ! empty( $file ) ) {
            $client = new Client( $client, $name, $file );
        }

        if ( is_object( $client ) && is_a( $client, 'Appsero\Client' ) ) {
            $this->client = $client;
        }
    }

    /**
     * Don't show the notice
     *
     * @return \self
     */
    public function hide_notice() {
        $this->show_notice = false;

        return $this;
    }

    /**
     * Add plugin data if needed
     *
     * @return \self
     */
    public function add_plugin_data() {
        $this->plugin_data = true;

        return $this;
    }

    /**
     * Add extra data if needed
     *
     * @param array $data
     *
     * @return \self
     */
    public function add_extra( $data = array() ) {
        $this->extra_data = $data;

        return $this;
    }

    /**
     * Set custom notice text
     *
     * @param  string $text
     *
     * @return \self
     */
    public function notice($text='' ) {
        $this->notice = $text;

        return $this;
    }

    /**
     * Initialize insights
     *
     * @return void
     */
    public function init() {
        if ( $this->client->type == 'plugin' ) {
            $this->init_plugin();
        } else if ( $this->client->type == 'theme' ) {
            $this->init_theme();
        }
    }

    /**
     * Initialize theme hooks
     *
     * @return void
     */
    public function init_theme() {
        $this->init_common();

        add_action( 'switch_theme', array( $this, 'deactivation_cleanup' ) );
        add_action( 'switch_theme', array( $this, 'theme_deactivated' ), 12, 3 );
    }

    /**
     * Initialize plugin hooks
     *
     * @return void
     */
    public function init_plugin() {
        // plugin deactivate popup
        if ( ! $this->is_local_server() ) {
            add_filter( 'plugin_action_links_' . $this->client->basename, array( $this, 'plugin_action_links' ) );
            add_action( 'admin_footer', array( $this, 'deactivate_scripts' ) );
        }

        $this->init_common();

        register_activation_hook( $this->client->file, array( $this, 'activate_plugin' ) );
        register_deactivation_hook( $this->client->file, array( $this, 'deactivation_cleanup' ) );
    }

    /**
     * Initialize common hooks
     *
     * @return void
     */
    protected function init_common() {

        if ( $this->show_notice ) {
            // tracking notice
            // Notices in admin pages except in MetaSlider admin pages - See MetaSliderPlugin->filter_admin_notices()
            add_action( 'admin_notices', array( $this, 'admin_notice' ) );
            // @since 3.90.1 - Notices in MetaSlider admin pages
            add_action( 'metaslider_admin_notices', array( $this, 'admin_notice' ) );
        }

        add_action( 'admin_init', array( $this, 'handle_optin_optout' ) );

        // uninstall reason
        add_action( 'wp_ajax_' . $this->client->slug . '_submit-uninstall-reason', array( $this, 'uninstall_reason_submission' ) );

        // cron events
        add_filter( 'cron_schedules', array( $this, 'add_weekly_schedule' ) );
        add_action( $this->client->slug . '_tracker_send_event', array( $this, 'send_tracking_data' ) );
        // add_action( 'admin_init', array( $this, 'send_tracking_data' ) ); // test
    }

    /**
     * Send tracking data to AppSero server
     *
     * @param  boolean  $override
     *
     * @return void
     */
    public function send_tracking_data( $override = false ) {
        if ( ! $this->tracking_allowed() && ! $override ) {
            return;
        }

        // Send a maximum of once per week
        $last_send = $this->get_last_send();

        if ( $last_send && $last_send > strtotime( '-1 week' ) ) {
            return;
        }

        $tracking_data = $this->get_tracking_data();

        $response = $this->client->send_request( $tracking_data, 'track' );

        update_option( $this->client->slug . '_tracking_last_send', time() );
    }

    /**
     * Get the tracking data points
     *
     * @return array
     */
    protected function get_tracking_data() {
        $all_plugins = $this->get_all_plugins();

        $users = get_users( array(
            'role'    => 'administrator',
            'orderby' => 'ID',
            'order'   => 'ASC',
            'number'  => 1,
            'paged'   => 1,
        ) );

        $admin_user =  ( is_array( $users ) && ! empty( $users ) ) ? $users[0] : false;
        $first_name = $last_name = '';

        if ( $admin_user ) {
            $first_name = $admin_user->first_name ? $admin_user->first_name : $admin_user->display_name;
            $last_name  = $admin_user->last_name;
        }

        $data = array(
            'url'              => esc_url( home_url() ),
            'site'             => $this->get_site_name(),
            'admin_email'      => get_option( 'admin_email' ),
            'first_name'       => $first_name,
            'last_name'        => $last_name,
            'hash'             => $this->client->hash,
            'server'           => $this->get_server_info(),
            'wp'               => $this->get_wp_info(),
            'users'            => $this->get_user_counts(),
            'active_plugins'   => count( $all_plugins['active_plugins'] ),
            'inactive_plugins' => count( $all_plugins['inactive_plugins'] ),
            'ip_address'       => $this->get_user_ip_address(),
            'project_version'  => $this->client->project_version,
            'tracking_skipped' => false,
            'is_local'         => $this->is_local_server(),
        );

        // Add Plugins
        if ($this->plugin_data) {

            $plugins_data = array();

            foreach ($all_plugins['active_plugins'] as $slug => $plugin) {
                $slug = strstr($slug, '/', true);
                if (! $slug) {
                    continue;
                }

                $plugins_data[ $slug ] = array(
                    'name' => isset($plugin['name']) ? $plugin['name'] : '',
                    'version' => isset($plugin['version']) ? $plugin['version'] : '',
                );
            }

            if (array_key_exists($this->client->slug, $plugins_data)) {
                unset($plugins_data[$this->client->slug]);
            }

            $data['plugins'] = $plugins_data;
        }

        // Add metadata
        if ( $extra = $this->get_extra_data() ) {
            $data['extra'] = $extra;
        }

        // Check this has previously skipped tracking
        $skipped = get_option( $this->client->slug . '_tracking_skipped' );

        if ( $skipped === 'yes' ) {
            delete_option( $this->client->slug . '_tracking_skipped' );

            $data['tracking_skipped'] = true;
        }

        return apply_filters( $this->client->slug . '_tracker_data', $data );
    }

    /**
     * If a child class wants to send extra data
     *
     * @return mixed
     */
    protected function get_extra_data() {
        if ( is_callable( $this->extra_data ) ) {
            return call_user_func( $this->extra_data );
        }

        if ( is_array( $this->extra_data ) ) {
            return $this->extra_data;
        }

        return array();
    }

    /**
     * Explain the user which data we collect
     *
     * @return array
     */
    protected function data_we_collect() {
        $data = array(
            'Server environment details (php, mysql, server, WordPress versions)',
            'Number of users in your site',
            'Site language',
            'Number of active and inactive plugins',
            'Site name and URL',
            'Your name and email address',
        );

        if ($this->plugin_data) {
            array_splice($data, 4, 0, ["active plugins' name"]);
        }

        return $data;
    }

    /**
     * Check if the user has opted into tracking
     *
     * @return bool
     */
    public function tracking_allowed() {
        $allow_tracking = get_option( $this->client->slug . '_allow_tracking', 'no' );

        return $allow_tracking == 'yes';
    }

    /**
     * Get the last time a tracking was sent
     *
     * @return false|string
     */
    private function get_last_send() {
        return get_option( $this->client->slug . '_tracking_last_send', false );
    }

    /**
     * Check if the notice has been dismissed or enabled
     *
     * @return boolean
     */
    public function notice_dismissed() {
        $hide_notice = get_option( $this->client->slug . '_tracking_notice', null );

        if ( 'hide' == $hide_notice ) {
            return true;
        }

        return false;
    }

    /**
     * Check if the current server is localhost
     *
     * @return boolean
     */
    private function is_local_server() {

        $host       = isset( $_SERVER['HTTP_HOST'] ) ? $_SERVER['HTTP_HOST'] : 'localhost';
        $ip         = isset( $_SERVER['SERVER_ADDR'] ) ? $_SERVER['SERVER_ADDR'] : '127.0.0.1';
        $is_local   = false;

        if( in_array( $ip,array( '127.0.0.1', '::1' ) )
            || ! strpos( $host, '.' )
            || in_array( strrchr( $host, '.' ), array( '.test', '.testing', '.local', '.localhost', '.localdomain' ) )
        ) {
            $is_local = true;
        }

        return apply_filters( 'appsero_is_local', $is_local );
    }

    /**
     * Schedule the event weekly
     *
     * @return void
     */
    private function schedule_event() {
        $hook_name = $this->client->slug . '_tracker_send_event';

        if ( ! wp_next_scheduled( $hook_name ) ) {
            wp_schedule_event( time(), 'weekly', $hook_name );
        }
    }

    /**
     * Clear any scheduled hook
     *
     * @return void
     */
    private function clear_schedule_event() {
        wp_clear_scheduled_hook( $this->client->slug . '_tracker_send_event' );
    }

    /**
     * Display the admin notice to users that have not opted-in or out
     *
     * @return void
     */
    public function admin_notice() {

        if ( $this->notice_dismissed() ) {
            return;
        }

        if ( $this->tracking_allowed() ) {
            return;
        }

        if ( ! current_user_can( 'manage_options' ) ) {
            return;
        }

        // don't show tracking if a local server
        if ( $this->is_local_server() ) {
            return;
        }

        $optin_url  = add_query_arg( $this->client->slug . '_tracker_optin', 'true' );
        $optout_url = add_query_arg( $this->client->slug . '_tracker_optout', 'true' );

        if ( empty( $this->notice ) ) {
            $notice = sprintf( $this->client->__trans( 'Want to help make <strong>%1$s</strong> even more awesome? Allow %1$s to collect non-sensitive diagnostic data and usage information.' ), $this->client->name );
        } else {
            $notice = $this->notice;
        }

        $policy_url = 'https://' . 'appsero.com/privacy-policy/';

        $notice .= ' (<a class="' . $this->client->slug . '-insights-data-we-collect" href="#">' . $this->client->__trans( 'what we collect' ) . '</a>)';
        $notice .= '<p class="description" style="display:none;">' . implode( ', ', $this->data_we_collect() ) . '. No sensitive data is tracked. ';
        $notice .= 'We are using Appsero to collect your data. <a href="' . $policy_url . '" target="_blank">Learn more</a> about how Appsero collects and handle your data.</p>';

        echo '<div class="updated"><p>';
            echo $notice;
            echo '</p><p class="submit">';
            echo '&nbsp;<a href="' . esc_url( $optin_url ) . '" class="button-primary button-large">' . $this->client->__trans( 'Allow' ) . '</a>';
            echo '&nbsp;<a href="' . esc_url( $optout_url ) . '" class="button-secondary button-large">' . $this->client->__trans( 'No thanks' ) . '</a>';
        echo '</p></div>';

        echo "<script type='text/javascript'>jQuery('." . $this->client->slug . "-insights-data-we-collect').on('click', function(e) {
                e.preventDefault();
                jQuery(this).parents('.updated').find('p.description').slideToggle('fast');
            });
            </script>
        ";
    }

    /**
     * handle the optin/optout
     *
     * @return void
     */
    public function handle_optin_optout() {

        if ( isset( $_GET[ $this->client->slug . '_tracker_optin' ] ) && $_GET[ $this->client->slug . '_tracker_optin' ] == 'true' ) {
            $this->optin();

            wp_redirect( remove_query_arg( $this->client->slug . '_tracker_optin' ) );
            exit;
        }

        if ( isset( $_GET[ $this->client->slug . '_tracker_optout' ] ) && $_GET[ $this->client->slug . '_tracker_optout' ] == 'true' ) {
            $this->optout();

            wp_redirect( remove_query_arg( $this->client->slug . '_tracker_optout' ) );
            exit;
        }
    }

    /**
     * Tracking optin
     *
     * @return void
     */
    public function optin() {
        update_option( $this->client->slug . '_allow_tracking', 'yes' );
        update_option( $this->client->slug . '_tracking_notice', 'hide' );

        $this->clear_schedule_event();
        $this->schedule_event();
        $this->send_tracking_data();
    }

    /**
     * Optout from tracking
     *
     * @return void
     */
    public function optout() {
        update_option( $this->client->slug . '_allow_tracking', 'no' );
        update_option( $this->client->slug . '_tracking_notice', 'hide' );

        $this->send_tracking_skipped_request();

        $this->clear_schedule_event();
    }

    /**
     * Get the number of post counts
     *
     * @param  string  $post_type
     *
     * @return integer
     */
    public function get_post_count( $post_type ) {
        global $wpdb;

        return (int) $wpdb->get_var( "SELECT count(ID) FROM $wpdb->posts WHERE post_type = '$post_type' and post_status = 'publish'");
    }

    /**
     * Get server related info.
     *
     * @return array
     */
    private static function get_server_info() {
        global $wpdb;

        $server_data = array();

        if ( isset( $_SERVER['SERVER_SOFTWARE'] ) && ! empty( $_SERVER['SERVER_SOFTWARE'] ) ) {
            $server_data['software'] = $_SERVER['SERVER_SOFTWARE'];
        }

        if ( function_exists( 'phpversion' ) ) {
            $server_data['php_version'] = phpversion();
        }

        $server_data['mysql_version']        = $wpdb->db_version();

        $server_data['php_max_upload_size']  = size_format( wp_max_upload_size() );
        $server_data['php_default_timezone'] = date_default_timezone_get();
        $server_data['php_soap']             = class_exists( 'SoapClient' ) ? 'Yes' : 'No';
        $server_data['php_fsockopen']        = function_exists( 'fsockopen' ) ? 'Yes' : 'No';
        $server_data['php_curl']             = function_exists( 'curl_init' ) ? 'Yes' : 'No';

        return $server_data;
    }

    /**
     * Get WordPress related data.
     *
     * @return array
     */
    private function get_wp_info() {
        $wp_data = array();

        $wp_data['memory_limit'] = WP_MEMORY_LIMIT;
        $wp_data['debug_mode']   = ( defined('WP_DEBUG') && WP_DEBUG ) ? 'Yes' : 'No';
        $wp_data['locale']       = get_locale();
        $wp_data['version']      = get_bloginfo( 'version' );
        $wp_data['multisite']    = is_multisite() ? 'Yes' : 'No';
        $wp_data['theme_slug']   = get_stylesheet();

        $theme = wp_get_theme( $wp_data['theme_slug'] );

        $wp_data['theme_name']    = $theme->get( 'Name' );
        $wp_data['theme_version'] = $theme->get( 'Version' );
        $wp_data['theme_uri']     = $theme->get( 'ThemeURI' );
        $wp_data['theme_author']  = $theme->get( 'Author' );

        return $wp_data;
    }

    /**
     * Get the list of active and inactive plugins
     *
     * @return array
     */
    private function get_all_plugins() {
        // Ensure get_plugins function is loaded
        if ( ! function_exists( 'get_plugins' ) ) {
            include ABSPATH . '/wp-admin/includes/plugin.php';
        }

        $plugins             = get_plugins();
        $active_plugins_keys = get_option( 'active_plugins', array() );
        $active_plugins      = array();

        foreach ( $plugins as $k => $v ) {
            // Take care of formatting the data how we want it.
            $formatted = array();
            $formatted['name'] = strip_tags( $v['Name'] );

            if ( isset( $v['Version'] ) ) {
                $formatted['version'] = strip_tags( $v['Version'] );
            }

            if ( isset( $v['Author'] ) ) {
                $formatted['author'] = strip_tags( $v['Author'] );
            }

            if ( isset( $v['Network'] ) ) {
                $formatted['network'] = strip_tags( $v['Network'] );
            }

            if ( isset( $v['PluginURI'] ) ) {
                $formatted['plugin_uri'] = strip_tags( $v['PluginURI'] );
            }

            if ( in_array( $k, $active_plugins_keys ) ) {
                // Remove active plugins from list so we can show active and inactive separately
                unset( $plugins[$k] );
                $active_plugins[$k] = $formatted;
            } else {
                $plugins[$k] = $formatted;
            }
        }

        return array( 'active_plugins' => $active_plugins, 'inactive_plugins' => $plugins );
    }

    /**
     * Get user totals based on user role.
     *
     * @return array
     */
    public function get_user_counts() {
        $user_count          = array();
        $user_count_data     = count_users();
        $user_count['total'] = $user_count_data['total_users'];

        // Get user count based on user role
        foreach ( $user_count_data['avail_roles'] as $role => $count ) {
            if ( ! $count ) {
                continue;
            }

            $user_count[ $role ] = $count;
        }

        return $user_count;
    }

    /**
     * Add weekly cron schedule
     *
     * @param array  $schedules
     *
     * @return array
     */
    public function add_weekly_schedule( $schedules ) {

        $schedules['weekly'] = array(
            'interval' => DAY_IN_SECONDS * 7,
            'display'  => 'Once Weekly',
        );

        return $schedules;
    }

    /**
     * Plugin activation hook
     *
     * @return void
     */
    public function activate_plugin() {
        $allowed = get_option( $this->client->slug . '_allow_tracking', 'no' );

        // if it wasn't allowed before, do nothing
        if ( 'yes' !== $allowed ) {
            return;
        }

        // re-schedule and delete the last sent time so we could force send again
        $hook_name = $this->client->slug . '_tracker_send_event';
        if ( ! wp_next_scheduled( $hook_name ) ) {
            wp_schedule_event( time(), 'weekly', $hook_name );
        }

        delete_option( $this->client->slug . '_tracking_last_send' );

        $this->send_tracking_data( true );
    }

    /**
     * Clear our options upon deactivation
     *
     * @return void
     */
    public function deactivation_cleanup() {
        $this->clear_schedule_event();

        if ( 'theme' == $this->client->type ) {
            delete_option( $this->client->slug . '_tracking_last_send' );
            delete_option( $this->client->slug . '_allow_tracking' );
        }

        delete_option( $this->client->slug . '_tracking_notice' );
    }

    /**
     * Hook into action links and modify the deactivate link
     *
     * @param  array  $links
     *
     * @return array
     */
    public function plugin_action_links( $links ) {

        if ( array_key_exists( 'deactivate', $links ) ) {
            $links['deactivate'] = str_replace( '<a', '<a class="' . $this->client->slug . '-deactivate-link"', $links['deactivate'] );
        }

        return $links;
    }

    /**
     * Plugin uninstall reasons
     *
     * @return array
     */
    private function get_uninstall_reasons() {
        $reasons = array(
			array(
				'id'          => 'could-not-understand',
				'text'        => $this->client->__trans( "Couldn't understand" ),
				'placeholder' => $this->client->__trans( 'Would you like us to assist you?' ),
                'icon'        => '<svg xmlns="http://www.w3.org/2000/svg" width="23" height="23" viewBox="0 0 23 23"><g fill="none"><g fill="#3B86FF"><path d="M11.5 0C17.9 0 23 5.1 23 11.5 23 17.9 17.9 23 11.5 23 10.6 23 9.6 22.9 8.8 22.7L8.8 22.6C9.3 22.5 9.7 22.3 10 21.9 10.3 21.6 10.4 21.3 10.4 20.9 10.8 21 11.1 21 11.5 21 16.7 21 21 16.7 21 11.5 21 6.3 16.7 2 11.5 2 6.3 2 2 6.3 2 11.5 2 13 2.3 14.3 2.9 15.6 2.7 16 2.4 16.3 2.2 16.8L2.1 17.1 2.1 17.3C2 17.5 2 17.7 2 18 0.7 16.1 0 13.9 0 11.5 0 5.1 5.1 0 11.5 0ZM6 13.6C6 13.7 6.1 13.8 6.1 13.9 6.3 14.5 6.2 15.7 6.1 16.4 6.1 16.6 6 16.9 6 17.1 6 17.1 6.1 17.1 6.1 17.1 7.1 16.9 8.2 16 9.3 15.5 9.8 15.2 10.4 15 10.9 15 11.2 15 11.4 15 11.6 15.2 11.9 15.4 12.1 16 11.6 16.4 11.5 16.5 11.3 16.6 11.1 16.7 10.5 17 9.9 17.4 9.3 17.7 9 17.9 9 18.1 9.1 18.5 9.2 18.9 9.3 19.4 9.3 19.8 9.4 20.3 9.3 20.8 9 21.2 8.8 21.5 8.5 21.6 8.1 21.7 7.9 21.8 7.6 21.9 7.3 21.9L6.5 22C6.3 22 6 21.9 5.8 21.9 5 21.8 4.4 21.5 3.9 20.9 3.3 20.4 3.1 19.6 3 18.8L3 18.5C3 18.2 3 17.9 3.1 17.7L3.1 17.6C3.2 17.1 3.5 16.7 3.7 16.3 4 15.9 4.2 15.4 4.3 15 4.4 14.6 4.4 14.5 4.6 14.2 4.6 13.9 4.7 13.7 4.9 13.6 5.2 13.2 5.7 13.2 6 13.6ZM11.7 11.2C13.1 11.2 14.3 11.7 15.2 12.9 15.3 13 15.4 13.1 15.4 13.2 15.4 13.4 15.3 13.8 15.2 13.8 15 13.9 14.9 13.8 14.8 13.7 14.6 13.5 14.4 13.2 14.1 13.1 13.5 12.6 12.8 12.3 12 12.2 10.7 12.1 9.5 12.3 8.4 12.8 8.3 12.8 8.2 12.8 8.1 12.8 7.9 12.8 7.8 12.4 7.8 12.2 7.7 12.1 7.8 11.9 8 11.8 8.4 11.7 8.8 11.5 9.2 11.4 10 11.2 10.9 11.1 11.7 11.2ZM16.3 5.9C17.3 5.9 18 6.6 18 7.6 18 8.5 17.3 9.3 16.3 9.3 15.4 9.3 14.7 8.5 14.7 7.6 14.7 6.6 15.4 5.9 16.3 5.9ZM8.3 5C9.2 5 9.9 5.8 9.9 6.7 9.9 7.7 9.2 8.4 8.2 8.4 7.3 8.4 6.6 7.7 6.6 6.7 6.6 5.8 7.3 5 8.3 5Z"/></g></g></svg>'
			),
			array(
				'id'          => 'found-better-plugin',
				'text'        => $this->client->__trans( 'Found a better plugin' ),
				'placeholder' => $this->client->__trans( 'Which plugin?' ),
                'icon'        => '<svg xmlns="http://www.w3.org/2000/svg" width="23" height="23" viewBox="0 0 23 23"><g fill="none"><g fill="#3B86FF"><path d="M17.1 14L22.4 19.3C23.2 20.2 23.2 21.5 22.4 22.4 21.5 23.2 20.2 23.2 19.3 22.4L19.3 22.4 14 17.1C15.3 16.3 16.3 15.3 17.1 14L17.1 14ZM8.6 0C13.4 0 17.3 3.9 17.3 8.6 17.3 13.4 13.4 17.2 8.6 17.2 3.9 17.2 0 13.4 0 8.6 0 3.9 3.9 0 8.6 0ZM8.6 2.2C5.1 2.2 2.2 5.1 2.2 8.6 2.2 12.2 5.1 15.1 8.6 15.1 12.2 15.1 15.1 12.2 15.1 8.6 15.1 5.1 12.2 2.2 8.6 2.2ZM8.6 3.6L8.6 5C6.6 5 5 6.6 5 8.6L5 8.6 3.6 8.6C3.6 5.9 5.9 3.6 8.6 3.6L8.6 3.6Z"/></g></g></svg>',
			),
			array(
				'id'          => 'not-have-that-feature',
				'text'        => $this->client->__trans( "Missing a specific feature" ),
				'placeholder' => $this->client->__trans( 'Could you tell us more about that feature?' ),
                'icon'        => '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="17" viewBox="0 0 24 17"><g fill="none"><g fill="#3B86FF"><path d="M19.4 0C19.7 0.6 19.8 1.3 19.8 2 19.8 3.2 19.4 4.4 18.5 5.3 17.6 6.2 16.5 6.7 15.2 6.7 15.2 6.7 15.2 6.7 15.2 6.7 14 6.7 12.9 6.2 12 5.3 11.2 4.4 10.7 3.3 10.7 2 10.7 1.3 10.8 0.6 11.1 0L7.6 0 7 0 6.5 0 6.5 5.7C6.3 5.6 5.9 5.3 5.6 5.1 5 4.6 4.3 4.3 3.5 4.3 3.5 4.3 3.5 4.3 3.4 4.3 1.6 4.4 0 5.9 0 7.9 0 8.6 0.2 9.2 0.5 9.7 1.1 10.8 2.2 11.5 3.5 11.5 4.3 11.5 5 11.2 5.6 10.8 6 10.5 6.3 10.3 6.5 10.2L6.5 10.2 6.5 17 6.5 17 7 17 7.6 17 22.5 17C23.3 17 24 16.3 24 15.5L24 0 19.4 0Z"/></g></g></svg>',
			),
			array(
				'id'          => 'is-not-working',
				'text'        => $this->client->__trans( 'Not working' ),
				'placeholder' => $this->client->__trans( 'Could you tell us a bit more whats not working?' ),
                'icon'        => '<svg xmlns="http://www.w3.org/2000/svg" width="23" height="23" viewBox="0 0 23 23"><g fill="none"><g fill="#3B86FF"><path d="M11.5 0C17.9 0 23 5.1 23 11.5 23 17.9 17.9 23 11.5 23 5.1 23 0 17.9 0 11.5 0 5.1 5.1 0 11.5 0ZM11.8 14.4C11.2 14.4 10.7 14.8 10.7 15.4 10.7 16 11.2 16.4 11.8 16.4 12.4 16.4 12.8 16 12.8 15.4 12.8 14.8 12.4 14.4 11.8 14.4ZM12 7C10.1 7 9.1 8.1 9 9.6L10.5 9.6C10.5 8.8 11.1 8.3 11.9 8.3 12.7 8.3 13.2 8.8 13.2 9.5 13.2 10.1 13 10.4 12.2 10.9 11.3 11.4 10.9 12 11 12.9L11 13.4 12.5 13.4 12.5 13C12.5 12.4 12.7 12.1 13.5 11.6 14.4 11.1 14.9 10.4 14.9 9.4 14.9 8 13.7 7 12 7Z"/></g></g></svg>',
			),
			array(
				'id'          => 'looking-for-other',
				'text'        => $this->client->__trans( "Not what I was looking" ),
				'placeholder' => $this->client->__trans( 'Could you tell us a bit more?' ),
                'icon'        => '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="17" viewBox="0 0 24 17"><g fill="none"><g fill="#3B86FF"><path d="M23.5 9C23.5 9 23.5 8.9 23.5 8.9 23.5 8.9 23.5 8.9 23.5 8.9 23.4 8.6 23.2 8.3 23 8 22.2 6.5 20.6 3.7 19.8 2.6 18.8 1.3 17.7 0 16.1 0 15.7 0 15.3 0.1 14.9 0.2 13.8 0.6 12.6 1.2 12.3 2.7L11.7 2.7C11.4 1.2 10.2 0.6 9.1 0.2 8.7 0.1 8.3 0 7.9 0 6.3 0 5.2 1.3 4.2 2.6 3.4 3.7 1.8 6.5 1 8 0.8 8.3 0.6 8.6 0.5 8.9 0.5 8.9 0.5 8.9 0.5 8.9 0.5 8.9 0.5 9 0.5 9 0.2 9.7 0 10.5 0 11.3 0 14.4 2.5 17 5.5 17 7.3 17 8.8 16.1 9.8 14.8L14.2 14.8C15.2 16.1 16.7 17 18.5 17 21.5 17 24 14.4 24 11.3 24 10.5 23.8 9.7 23.5 9ZM5.5 15C3.6 15 2 13.2 2 11 2 8.8 3.6 7 5.5 7 7.4 7 9 8.8 9 11 9 13.2 7.4 15 5.5 15ZM18.5 15C16.6 15 15 13.2 15 11 15 8.8 16.6 7 18.5 7 20.4 7 22 8.8 22 11 22 13.2 20.4 15 18.5 15Z"/></g></g></svg>',
			),
			array(
				'id'          => 'did-not-work-as-expected',
				'text'        => $this->client->__trans( "Didn't work as expected" ),
				'placeholder' => $this->client->__trans( 'What did you expect?' ),
                'icon'        => '<svg xmlns="http://www.w3.org/2000/svg" width="23" height="23" viewBox="0 0 23 23"><g fill="none"><g fill="#3B86FF"><path d="M11.5 0C17.9 0 23 5.1 23 11.5 23 17.9 17.9 23 11.5 23 5.1 23 0 17.9 0 11.5 0 5.1 5.1 0 11.5 0ZM11.5 2C6.3 2 2 6.3 2 11.5 2 16.7 6.3 21 11.5 21 16.7 21 21 16.7 21 11.5 21 6.3 16.7 2 11.5 2ZM12.5 12.9L12.7 5 10.2 5 10.5 12.9 12.5 12.9ZM11.5 17.4C12.4 17.4 13 16.8 13 15.9 13 15 12.4 14.4 11.5 14.4 10.6 14.4 10 15 10 15.9 10 16.8 10.6 17.4 11.5 17.4Z"/></g></g></svg>',
			),
			array(
				'id'          => 'other',
				'text'        => $this->client->__trans( 'Others' ),
				'placeholder' => $this->client->__trans( 'Could you tell us a bit more?' ),
                'icon'        => '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="23" viewBox="0 0 24 6"><g fill="none"><g fill="#3B86FF"><path d="M3 0C4.7 0 6 1.3 6 3 6 4.7 4.7 6 3 6 1.3 6 0 4.7 0 3 0 1.3 1.3 0 3 0ZM12 0C13.7 0 15 1.3 15 3 15 4.7 13.7 6 12 6 10.3 6 9 4.7 9 3 9 1.3 10.3 0 12 0ZM21 0C22.7 0 24 1.3 24 3 24 4.7 22.7 6 21 6 19.3 6 18 4.7 18 3 18 1.3 19.3 0 21 0Z"/></g></g></svg>',
			),
		);

        return $reasons;
    }

    /**
     * Plugin deactivation uninstall reason submission
     *
     * @return void
     */
    public function uninstall_reason_submission() {

        if ( ! isset( $_POST['reason_id'] ) ) {
            wp_send_json_error();
        }

        if ( ! wp_verify_nonce( $_POST['nonce'], 'appsero-security-nonce' ) ) {
            wp_send_json_error( 'Nonce verification failed' );
        }

        if ( ! current_user_can( 'manage_options' ) ) {
            wp_send_json_error( 'You are not allowed for this task' );
        }

        $data                = $this->get_tracking_data();
        $data['reason_id']   = sanitize_text_field( $_POST['reason_id'] );
        $data['reason_info'] = isset( $_REQUEST['reason_info'] ) ? trim( stripslashes( $_REQUEST['reason_info'] ) ) : '';

        $this->client->send_request( $data, 'deactivate' );

        wp_send_json_success();
    }

    /**
     * Handle the plugin deactivation feedback
     *
     * @return void
     */
    public function deactivate_scripts() {
        global $pagenow;

        if ( 'plugins.php' != $pagenow ) {
            return;
        }

        $this->deactivation_modal_styles();
        $reasons = $this->get_uninstall_reasons();
        $custom_reasons = apply_filters( 'appsero_custom_deactivation_reasons', array() );
        ?>

        <div class="wd-dr-modal" id="<?php echo $this->client->slug; ?>-wd-dr-modal">
            <div class="wd-dr-modal-wrap">
                <div class="wd-dr-modal-header">
                    <h3><?php $this->client->_etrans( 'Goodbyes are always hard. If you have a moment, please let us know how we can improve.' ); ?></h3>
                </div>

                <div class="wd-dr-modal-body">
                    <ul class="wd-de-reasons">
                        <?php foreach ( $reasons as $reason ) { ?>
                            <li data-placeholder="<?php echo esc_attr( $reason['placeholder'] ); ?>">
                                <label>
                                    <input type="radio" name="selected-reason" value="<?php echo $reason['id']; ?>">
                                    <div class="wd-de-reason-icon"><?php echo $reason['icon']; ?></div>
                                    <div class="wd-de-reason-text"><?php echo $reason['text']; ?></div>
                                </label>
                            </li>
                        <?php } ?>
                    </ul>
                    <?php if ( $custom_reasons && is_array( $custom_reasons ) ) : ?>
                    <ul class="wd-de-reasons wd-de-others-reasons">
                        <?php foreach ( $custom_reasons as $reason ) { ?>
                            <li data-placeholder="<?php echo esc_attr( $reason['placeholder'] ); ?>" data-customreason="true">
                                <label>
                                    <input type="radio" name="selected-reason" value="<?php echo $reason['id']; ?>">
                                    <div class="wd-de-reason-icon"><?php echo $reason['icon']; ?></div>
                                    <div class="wd-de-reason-text"><?php echo $reason['text']; ?></div>
                                </label>
                            </li>
                        <?php } ?>
                    </ul>
                    <?php endif; ?>
                    <div class="wd-dr-modal-reason-input"><textarea></textarea></div>
                    <p class="wd-dr-modal-reasons-bottom">
                       <?php
                       echo sprintf(
	                       $this->client->__trans( 'We share your data with <a href="%1$s" target="_blank">Appsero</a> to troubleshoot problems &amp; make product improvements. <a href="%2$s" target="_blank">Learn more</a> about how Appsero handles your data.'),
	                       esc_url( 'https://appsero.com/' ),
                           esc_url( 'https://appsero.com/privacy-policy' )
                       );
                       ?>
                    </p>
                </div>

                <div class="wd-dr-modal-footer">
                    <a href="#" class="dont-bother-me wd-dr-button-secondary"><?php $this->client->_etrans( "Skip & Deactivate" ); ?></a>
                    <button class="wd-dr-button-secondary wd-dr-cancel-modal"><?php $this->client->_etrans( 'Cancel' ); ?></button>
                    <button class="wd-dr-submit-modal"><?php $this->client->_etrans( 'Submit & Deactivate' ); ?></button>
                </div>
            </div>
        </div>

        <script type="text/javascript">
            (function($) {
                $(function() {
                    var modal = $( '#<?php echo $this->client->slug; ?>-wd-dr-modal' );
                    var deactivateLink = '';

                    // Open modal
                    $( '#the-list' ).on('click', 'a.<?php echo $this->client->slug; ?>-deactivate-link', function(e) {
                        e.preventDefault();

                        modal.addClass('modal-active');
                        deactivateLink = $(this).attr('href');
                        modal.find('a.dont-bother-me').attr('href', deactivateLink).css('float', 'left');
                    });

                    // Close modal; Cancel
                    modal.on('click', 'button.wd-dr-cancel-modal', function(e) {
                        e.preventDefault();
                        modal.removeClass('modal-active');
                    });

                    // Reason change
                    modal.on('click', 'input[type="radio"]', function () {
                        var parent = $(this).parents('li');
                        var isCustomReason = parent.data('customreason');
                        var inputValue = $(this).val();

                        if ( isCustomReason ) {
                            $('ul.wd-de-reasons.wd-de-others-reasons li').removeClass('wd-de-reason-selected');
                        } else {
                            $('ul.wd-de-reasons li').removeClass('wd-de-reason-selected');

                            if ( "other" != inputValue ) {
                                $('ul.wd-de-reasons.wd-de-others-reasons').css('display', 'none');
                            }
                        }

                        // Show if has custom reasons
                        if ( "other" == inputValue ) {
                            $('ul.wd-de-reasons.wd-de-others-reasons').css('display', 'flex');
                        }

                        parent.addClass('wd-de-reason-selected');
                        $('.wd-dr-modal-reason-input').show();

                        $('.wd-dr-modal-reason-input textarea').attr('placeholder', parent.data('placeholder')).focus();
                    });

                    // Submit response
                    modal.on('click', 'button.wd-dr-submit-modal', function(e) {
                        e.preventDefault();

                        var button = $(this);

                        if ( button.hasClass('disabled') ) {
                            return;
                        }

                        var $radio = $( 'input[type="radio"]:checked', modal );
                        var $input = $('.wd-dr-modal-reason-input textarea');

                        $.ajax({
                            url: ajaxurl,
                            type: 'POST',
                            data: {
                                nonce: '<?php echo wp_create_nonce( 'appsero-security-nonce' ); ?>',
                                action: '<?php echo $this->client->slug; ?>_submit-uninstall-reason',
                                reason_id: ( 0 === $radio.length ) ? 'none' : $radio.val(),
                                reason_info: ( 0 !== $input.length ) ? $input.val().trim() : ''
                            },
                            beforeSend: function() {
                                button.addClass('disabled');
                                button.text('Processing...');
                            },
                            complete: function() {
                                window.location.href = deactivateLink;
                            }
                        });
                    });
                });
            }(jQuery));
        </script>

        <?php
    }

    /**
     * Run after theme deactivated
     * @param  string $new_name
     * @param  object $new_theme
     * @param  object $old_theme
     * @return void
     */
    public function theme_deactivated( $new_name, $new_theme, $old_theme ) {
        // Make sure this is appsero theme
        if ( $old_theme->get_template() == $this->client->slug ) {
            $this->client->send_request( $this->get_tracking_data(), 'deactivate' );
        }
    }

    /**
     * Get user IP Address
     */
    private function get_user_ip_address() {
        $response = wp_remote_get( 'https://icanhazip.com/' );

        if ( is_wp_error( $response ) ) {
            return '';
        }

        $ip = trim( wp_remote_retrieve_body( $response ) );

        if ( ! filter_var( $ip, FILTER_VALIDATE_IP ) ) {
            return '';
        }

        return $ip;
    }

    /**
     * Get site name
     */
    private function get_site_name() {
        $site_name = get_bloginfo( 'name' );

        if ( empty( $site_name ) ) {
            $site_name = get_bloginfo( 'description' );
            $site_name = wp_trim_words( $site_name, 3, '' );
        }

        if ( empty( $site_name ) ) {
            $site_name = esc_url( home_url() );
        }

        return $site_name;
    }

    /**
     * Send request to appsero if user skip to send tracking data
     */
    private function send_tracking_skipped_request() {
        $skipped = get_option( $this->client->slug . '_tracking_skipped' );

        $data = array(
            'hash'               => $this->client->hash,
            'previously_skipped' => false,
        );

        if ( $skipped === 'yes' ) {
            $data['previously_skipped'] = true;
        } else {
            update_option( $this->client->slug . '_tracking_skipped', 'yes' );
        }

        $this->client->send_request( $data, 'tracking-skipped' );
    }

    /**
     * Deactivation modal styles
     */
    private function deactivation_modal_styles() {
        ?>
        <style type="text/css">
            .wd-dr-modal {
                position: fixed;
                z-index: 99999;
                top: 0;
                right: 0;
                bottom: 0;
                left: 0;
                background: rgba(0,0,0,0.5);
                display: none;
                box-sizing: border-box;
                overflow: scroll;
            }
            .wd-dr-modal * {
                box-sizing: border-box;
            }
            .wd-dr-modal.modal-active {
                display: block;
            }
            .wd-dr-modal-wrap {
                max-width: 870px;
                width: 100%;
                position: relative;
                margin: 10% auto;
                background: #fff;
            }
            .wd-dr-modal-header {
                border-bottom: 1px solid #E8E8E8;
                padding: 20px 20px 18px 20px;
            }
            .wd-dr-modal-header h3 {
                line-height: 1.8;
                margin: 0;
                color: #4A5568;
            }
            .wd-dr-modal-body {
                padding: 5px 20px 20px 20px;
            }
            .wd-dr-modal-body .reason-input {
                margin-top: 5px;
                margin-left: 20px;
            }
            .wd-dr-modal-footer {
                border-top: 1px solid #E8E8E8;
                padding: 20px;
                text-align: right;
            }
            .wd-dr-modal-reasons-bottom {
                margin: 0;
            }
            ul.wd-de-reasons {
                display: flex;
                margin: 0 -5px 0 -5px;
                padding: 15px 0 20px 0;
            }
            ul.wd-de-reasons.wd-de-others-reasons {
                padding-top: 0;
                display: none;
            }
            ul.wd-de-reasons li {
                padding: 0 5px;
                margin: 0;
                width: 14.26%;
            }
            ul.wd-de-reasons label {
                position: relative;
                border: 1px solid #E8E8E8;
                border-radius: 4px;
                display: block;
                text-align: center;
                height: 100%;
                padding: 15px 3px 8px 3px;
            }
            ul.wd-de-reasons label:after {
                width: 0;
                height: 0;
                border-left: 8px solid transparent;
                border-right: 8px solid transparent;
                border-top: 10px solid #3B86FF;
                position: absolute;
                left: 50%;
                top: 100%;
                margin-left: -8px;
            }
            ul.wd-de-reasons label input[type="radio"] {
                position: absolute;
                left: 0;
                right: 0;
                visibility: hidden;
            }
            .wd-de-reason-text {
                color: #4A5568;
                font-size: 13px;
            }
            .wd-de-reason-icon {
                margin-bottom: 7px;
            }
            ul.wd-de-reasons li.wd-de-reason-selected label {
                background-color: #3B86FF;
                border-color: #3B86FF;
            }
            li.wd-de-reason-selected .wd-de-reason-icon svg,
            li.wd-de-reason-selected .wd-de-reason-icon svg g {
                fill: #fff;
            }
            li.wd-de-reason-selected .wd-de-reason-text {
                color: #fff;
            }
            ul.wd-de-reasons li.wd-de-reason-selected label:after {
                content: "";
            }
            .wd-dr-modal-reason-input {
                margin-bottom: 15px;
                display: none;
            }
            .wd-dr-modal-reason-input textarea {
                background: #FAFAFA;
                border: 1px solid #287EB8;
                border-radius: 4px;
                width: 100%;
                height: 100px;
                color: #524242;
                font-size: 13px;
                line-height: 1.4;
                padding: 11px 15px;
                resize: none;
            }
            .wd-dr-modal-reason-input textarea:focus {
                outline: 0 none;
                box-shadow: 0 0 0;
            }
            .wd-dr-button-secondary, .wd-dr-button-secondary:hover {
                border: 1px solid #EBEBEB;
                border-radius: 3px;
                font-size: 13px;
                line-height: 1.5;
                color: #718096;
                padding: 5px 12px;
                cursor: pointer;
                background-color: transparent;
                text-decoration: none;
            }
            .wd-dr-submit-modal, .wd-dr-submit-modal:hover {
                border: 1px solid #3B86FF;
                background-color: #3B86FF;
                border-radius: 3px;
                font-size: 13px;
                line-height: 1.5;
                color: #fff;
                padding: 5px 12px;
                cursor: pointer;
                margin-left: 4px;
            }
        </style>
        <?php
    }

}
appsero/readme.md000064400000015342151214231100007767 0ustar00# Appsero - Client

- [Installation](#installation)
- [Insights](#insights)
- [Dynamic Usage](#dynamic-usage)


## Installation

You can install AppSero Client in two ways, via composer and manually.

### 1. Composer Installation

Add dependency in your project (theme/plugin):

```
composer require appsero/client
```

Now add `autoload.php` in your file if you haven't done already.

```php
require __DIR__ . '/vendor/autoload.php';
```

### 2. Manual Installation

Clone the repository in your project.

```
cd /path/to/your/project/folder
git clone https://github.com/AppSero/client.git appsero
```

Now include the dependencies in your plugin/theme.

```php
require __DIR__ . '/appsero/src/Client.php';
```

## Insights

AppSero can be used in both themes and plugins.

The `Appsero\Client` class has *three* parameters:

```php
$client = new Appsero\Client( $hash, $name, $file );
```

- **hash** (*string*, *required*) - The unique identifier for a plugin or theme.
- **name** (*string*, *required*) - The name of the plugin or theme.
- **file** (*string*, *required*) - The **main file** path of the plugin. For theme, path to `functions.php`

### Usage Example

Please refer to the **installation** step before start using the class.

You can obtain the **hash** for your plugin for the [Appsero Dashboard](https://dashboard.appsero.com). The 3rd parameter **must** have to be the main file of the plugin.

```php
/**
 * Initialize the tracker
 *
 * @return void
 */
function appsero_init_tracker_appsero_test() {

    if ( ! class_exists( 'Appsero\Client' ) ) {
        require_once __DIR__ . '/appsero/src/Client.php';
    }

    $client = new Appsero\Client( 'a4a8da5b-b419-4656-98e9-4a42e9044891', 'Akismet', __FILE__ );

    // Active insights
    $client->insights()->init();

    // Active automatic updater
    $client->updater();

    // Active license page and checker
    $args = array(
        'type'       => 'options',
        'menu_title' => 'Akismet',
        'page_title' => 'Akismet License Settings',
        'menu_slug'  => 'akismet_settings',
    );
    $client->license()->add_settings_page( $args );
}

appsero_init_tracker_appsero_test();
```

Make sure you call this function directly, never use any action hook to call this function.

> For plugins example code that needs to be used on your main plugin file.
> For themes example code that needs to be used on your themes `functions.php` file.

## More Usage

```php
$client = new Appsero\Client( 'a4a8da5b-b419-4656-98e9-4a42e9044892', 'Twenty Twelve', __FILE__ );
```

#### 1. Hiding the notice

Sometimes you wouldn't want to show the notice, or want to customize the notice message. You can do that as well.

```php
$client->insights()
       ->hide_notice()
       ->init();
```

#### 2. Customizing the notice message

```php
$client->insights()
       ->notice( 'My Custom Notice Message' )
       ->init();
```

#### 3. Adding extra data

You can add extra metadata from your theme or plugin. In that case, the **keys** has to be whitelisted from the Appsero dashboard.
`add_extra` method also support callback as parameter, If you need database call then callback is best for you.

```php
$metadata = array(
    'key'     => 'value',
    'another' => 'another_value'
);
$client->insights()
       ->add_extra( $metadata )
       ->init();
```

Or if you want to run a query then pass callback, we will call the function when it is necessary.

```php
$metadata = function () {
    $total_posts = wp_count_posts();

    return array(
        'total_posts' => $total_posts,
        'another'     => 'another_value'
    );
};
$client->insights()
       ->add_extra( $metadata )
       ->init();
```

#### 4. Set textdomain

You may set your own textdomain to translate text.

```php
$client->set_textdomain( 'your-project-textdomain' );
```




#### 5. Get Plugin Data
If you want to get the most used plugins with your plugin or theme, send the active plugins' data to Appsero.
```php
$client->insights()
       ->add_plugin_data()
       ->init();
```
---

#### 6. Set Notice Message
Change opt-in message text
```php
$client->insights()
       ->notice("Your custom notice text")
       ->init();
```
---

### Check License Validity

Check your plugin/theme is using with valid license or not, First create a global variable of `License` object then use it anywhere in your code.
If you are using it outside of same function make sure you global the variable before using the condition.

```php
$client = new Appsero\Client( 'a4a8da5b-b419-4656-98e9-4a42e9044892', 'Twenty Twelve', __FILE__ );

$args = array(
    'type'        => 'submenu',
    'menu_title'  => 'Twenty Twelve License',
    'page_title'  => 'Twenty Twelve License Settings',
    'menu_slug'   => 'twenty_twelve_settings',
    'parent_slug' => 'themes.php',
);

global $twenty_twelve_license;
$twenty_twelve_license = $client->license();
$twenty_twelve_license->add_settings_page( $args );

if ( $twenty_twelve_license->is_valid()  ) {
    // Your special code here
}

Or check by pricing plan title

if ( $twenty_twelve_license->is_valid_by( 'title', 'Business' ) ) {
    // Your special code here
}

// Set custom options key for storing the license info
$twenty_twelve_license->set_option_key( 'my_plugin_license' );
```

### Use your own license form

You can easily manage license by creating a form using HTTP request. Call `license_form_submit` method from License object.

```php
global $twenty_twelve_license; // License object
$twenty_twelve_license->license_form_submit([
    '_nonce'      => wp_create_nonce( 'Twenty Twelve' ), // create a nonce with name
    '_action'     => 'active', // active, deactive
    'license_key' => 'random-license-key', // no need to provide if you want to deactive
]);
if ( ! $twenty_twelve_license->error ) {
    // license activated
    $twenty_twelve_license->success; // Success message is here
} else {
    $twenty_twelve_license->error; // has error message here
}
```

### Set Custom Deactivation Reasons

First set your deactivation reasons in Appsero dashboard then map them in your plugin/theme using filter hook.

- **id** is the deactivation slug
- **text** is the deactivation title
- **placeholder** will show on textarea field
- **icon** You can set SVG icon with 23x23 size

```php
add_filter( 'appsero_custom_deactivation_reasons', function () {
    return [
        [
            'id'          => 'looks-buggy',
            'text'        => 'Looks buggy',
            'placeholder' => 'Can you please tell which feature looks buggy?',
            'icon'        => '',
        ],
        [
            'id'          => 'bad-ui',
            'text'        => 'Bad UI',
            'placeholder' => 'Could you tell us a bit more?',
            'icon'        => '',
        ],
    ];
} );
```

## Credits

Created and maintained by [Appsero](https://appsero.com).
js/proxy/elFinderSupportVer1.js000064400000023701151215013360012562 0ustar00/**
 * elFinder transport to support old protocol.
 *
 * @example
 * jQuery('selector').elfinder({
 *   .... 
 *   transport : new elFinderSupportVer1()
 * })
 *
 * @author Dmitry (dio) Levashov
 **/
window.elFinderSupportVer1 = function(upload) {
	"use strict";
	var self = this,
		dateObj, today, yesterday,
		getDateString = function(date) {
			return date.replace('Today', today).replace('Yesterday', yesterday);
		};
	
	dateObj = new Date();
	today = dateObj.getFullYear() + '/' + (dateObj.getMonth() + 1) + '/' + dateObj.getDate();
	dateObj = new Date(Date.now() - 86400000);
	yesterday = dateObj.getFullYear() + '/' + (dateObj.getMonth() + 1) + '/' + dateObj.getDate();
	
	this.upload = upload || 'auto';
	
	this.init = function(fm) {
		this.fm = fm;
		this.fm.parseUploadData = function(text) {
			var data;

			if (!jQuery.trim(text)) {
				return {error : ['errResponse', 'errDataEmpty']};
			}

			try {
				data = JSON.parse(text);
			} catch (e) {
				return {error : ['errResponse', 'errDataNotJSON']};
			}
			
			return self.normalize('upload', data);
		};
	};
	
	
	this.send = function(opts) {
		var self = this,
			fm = this.fm,
			dfrd = jQuery.Deferred(),
			cmd = opts.data.cmd,
			args = [],
			_opts = {},
			data,
			xhr;
			
		dfrd.abort = function() {
			if (xhr.state() == 'pending') {
				xhr.quiet = true;
				xhr.abort();
			}
		};
		
		switch (cmd) {
			case 'open':
				opts.data.tree = 1;
				break;
			case 'parents':
			case 'tree':
				return dfrd.resolve({tree : []});
			case 'get':
				opts.data.cmd = 'read';
				opts.data.current = fm.file(opts.data.target).phash;
				break;
			case 'put':
				opts.data.cmd = 'edit';
				opts.data.current = fm.file(opts.data.target).phash;
				break;
			case 'archive':
			case 'rm':
				opts.data.current = fm.file(opts.data.targets[0]).phash;
				break;
			case 'extract':
			case 'rename':
			case 'resize':
				opts.data.current = fm.file(opts.data.target).phash;
				break;
			case 'duplicate':
				_opts = jQuery.extend(true, {}, opts);

				jQuery.each(opts.data.targets, function(i, hash) {
					jQuery.ajax(Object.assign(_opts, {data : {cmd : 'duplicate', target : hash, current : fm.file(hash).phash}}))
						.fail(function(error) {
							fm.error(fm.res('error', 'connect'));
						})
						.done(function(data) {
							data = self.normalize('duplicate', data);
							if (data.error) {
								fm.error(data.error);
							} else if (data.added) {
								fm.trigger('add', {added : data.added});
							}
						});
				});
				return dfrd.resolve({});
				
			case 'mkdir':
			case 'mkfile':
				opts.data.current = opts.data.target;
				break;
			case 'paste':
				opts.data.current = opts.data.dst;
				if (! opts.data.tree) {
					jQuery.each(opts.data.targets, function(i, h) {
						if (fm.file(h) && fm.file(h).mime === 'directory') {
							opts.data.tree = '1';
							return false;
						}
					});
				}
				break;
				
			case 'size':
				return dfrd.resolve({error : fm.res('error', 'cmdsupport')});
			case 'search':
				return dfrd.resolve({error : fm.res('error', 'cmdsupport')});
				
			case 'file':
				opts.data.cmd = 'open';
				opts.data.current = fm.file(opts.data.target).phash;
				break;
		}
		// cmd = opts.data.cmd
		
		xhr = jQuery.ajax(opts)
			.fail(function(error) {
				dfrd.reject(error);
			})
			.done(function(raw) {
				data = self.normalize(cmd, raw);
				dfrd.resolve(data);
			});
			
		return dfrd;
	};
	
	// fix old connectors errors messages as possible
	// this.errors = {
	// 	'Unknown command'                                  : 'Unknown command.',
	// 	'Invalid backend configuration'                    : 'Invalid backend configuration.',
	// 	'Access denied'                                    : 'Access denied.',
	// 	'PHP JSON module not installed'                    : 'PHP JSON module not installed.',
	// 	'File not found'                                   : 'File not found.',
	// 	'Invalid name'                                     : 'Invalid file name.',
	// 	'File or folder with the same name already exists' : 'File named "$1" already exists in this location.',
	// 	'Not allowed file type'                            : 'Not allowed file type.',
	// 	'File exceeds the maximum allowed filesize'        : 'File exceeds maximum allowed size.',
	// 	'Unable to copy into itself'                       : 'Unable to copy "$1" into itself.',
	// 	'Unable to create archive'                         : 'Unable to create archive.',
	// 	'Unable to extract files from archive'             : 'Unable to extract files from "$1".'
	// }
	
	this.normalize = function(cmd, data) {
		var self = this,
			fm   = this.fm,
			files = {}, 
			filter = function(file) { return file && file.hash && file.name && file.mime ? file : null; },
			getDirs = function(items) {
				return jQuery.grep(items, function(i) {
					return i && i.mime && i.mime === 'directory'? true : false;
				});
			},
			getTreeDiff = function(files) {
				var dirs = getDirs(files);
				treeDiff = fm.diff(dirs, null, ['date', 'ts']);
				if (treeDiff.added.length) {
					treeDiff.added = getDirs(treeDiff.added);
				}
				if (treeDiff.changed.length) {
					treeDiff.changed = getDirs(treeDiff.changed);
				}
				if (treeDiff.removed.length) {
					var removed = [];
					jQuery.each(treeDiff.removed, function(i, h) {
						var item;
						if ((item = fm.file(h)) && item.mime === 'directory') {
							removed.push(h);
						}
					});
					treeDiff.removed = removed;
				}
				return treeDiff;
			},
			phash, diff, isCwd, treeDiff;

		if ((cmd == 'tmb' || cmd == 'get')) {
			return data;
		}
		
		// if (data.error) {
		// 	jQuery.each(data.error, function(i, msg) {
		// 		if (self.errors[msg]) {
		// 			data.error[i] = self.errors[msg];
		// 		}
		// 	});
		// }
		
		if (cmd == 'upload' && data.error && data.cwd) {
			data.warning = Object.assign({}, data.error);
			data.error = false;
		}
		
		
		if (data.error) {
			return data;
		}
		
		if (cmd == 'put') {

			phash = fm.file(data.target.hash).phash;
			return {changed : [this.normalizeFile(data.target, phash)]};
		}
		
		phash = data.cwd.hash;

		isCwd = (phash == fm.cwd().hash);
		
		if (data.tree) {
			jQuery.each(this.normalizeTree(data.tree), function(i, file) {
				files[file.hash] = file;
			});
		}
		
		jQuery.each(data.cdc||[], function(i, file) {
			var hash = file.hash,
				mcts;

			if (files[hash]) {
				if (file.date) {
					mcts = Date.parse(getDateString(file.date));
					if (mcts && !isNaN(mcts)) {
						files[hash].ts = Math.floor(mcts / 1000);
					} else {
						files[hash].date = file.date || fm.formatDate(file);
					}
				}
				files[hash].locked = file.hash == phash ? true : file.rm === void(0) ? false : !file.rm;
			} else {
				files[hash] = self.normalizeFile(file, phash, data.tmb);
			}
		});
		
		if (!data.tree) {
			jQuery.each(fm.files(), function(hash, file) {
				if (!files[hash] && file.phash != phash && file.mime == 'directory') {
					files[hash] = file;
				}
			});
		}
		
		if (cmd == 'open') {
			return {
					cwd     : files[phash] || this.normalizeFile(data.cwd),
					files   : jQuery.map(files, function(f) { return f; }),
					options : self.normalizeOptions(data),
					init    : !!data.params,
					debug   : data.debug
				};
		}
		
		if (isCwd) {
			diff = fm.diff(jQuery.map(files, filter));
		} else {
			if (data.tree && cmd !== 'paste') {
				diff = getTreeDiff(files);
			} else {
				diff = {
					added   : [],
					removed : [],
					changed : []
				};
				if (cmd === 'paste') {
					diff.sync = true;
				}
			}
		}
		
		return Object.assign({
			current : data.cwd.hash,
			error   : data.error,
			warning : data.warning,
			options : {tmb : !!data.tmb}
		}, diff);
		
	};
	
	/**
	 * Convert old api tree into plain array of dirs
	 *
	 * @param  Object  root dir
	 * @return Array
	 */
	this.normalizeTree = function(root) {
		var self     = this,
			result   = [],
			traverse = function(dirs, phash) {
				var i, dir;
				
				for (i = 0; i < dirs.length; i++) {
					dir = dirs[i];
					result.push(self.normalizeFile(dir, phash));
					dir.dirs.length && traverse(dir.dirs, dir.hash);
				}
			};

		traverse([root]);

		return result;
	};
	
	/**
	 * Convert file info from old api format into new one
	 *
	 * @param  Object  file
	 * @param  String  parent dir hash
	 * @return Object
	 */
	this.normalizeFile = function(file, phash, tmb) {
		var mime = file.mime || 'directory',
			size = mime == 'directory' && !file.linkTo ? 0 : file.size,
			mcts = file.date? Date.parse(getDateString(file.date)) : void 0,
			info = {
				url    : file.url,
				hash   : file.hash,
				phash  : phash,
				name   : file.name,
				mime   : mime,
				ts     : file.ts,
				size   : size,
				read   : file.read,
				write  : file.write,
				locked : !phash ? true : file.rm === void(0) ? false : !file.rm
			};
		
		if (! info.ts) {
			if (mcts && !isNaN(mcts)) {
				info.ts = Math.floor(mcts / 1000);
			} else {
				info.date = file.date || this.fm.formatDate(file);
			}
		}
		
		if (file.mime == 'application/x-empty' || file.mime == 'inode/x-empty') {
			info.mime = 'text/plain';
		}
		
		if (file.linkTo) {
			info.alias = file.linkTo;
		}

		if (file.linkTo) {
			info.linkTo = file.linkTo;
		}
		
		if (file.tmb) {
			info.tmb = file.tmb;
		} else if (info.mime.indexOf('image/') === 0 && tmb) {
			info.tmb = 1;
			
		}

		if (file.dirs && file.dirs.length) {
			info.dirs = true;
		}
		if (file.dim) {
			info.dim = file.dim;
		}
		if (file.resize) {
			info.resize = file.resize;
		}
		return info;
	};
	
	this.normalizeOptions = function(data) {
		var opts = {
				path          : data.cwd.rel,
				disabled      : jQuery.merge((data.disabled || []), [ 'search', 'netmount', 'zipdl' ]),
				tmb           : !!data.tmb,
				copyOverwrite : true
			};
		
		if (data.params) {
			opts.api      = 1;
			opts.url      = data.params.url;
			opts.archivers = {
				create  : data.params.archives || [],
				extract : data.params.extract || []
			};
		}
		
		if (opts.path.indexOf('/') !== -1) {
			opts.separator = '/';
		} else if (opts.path.indexOf('\\') !== -1) {
			opts.separator = '\\';
		}
		return opts;
	};
};
js/commands/quicklook.js000064400000057575151215013360011340 0ustar00/**
 * @class  elFinder command "quicklook"
 * Fast preview for some files types
 *
 * @author Dmitry (dio) Levashov
 **/
(elFinder.prototype.commands.quicklook = function() {
	"use strict";
	var self       = this,
		fm         = self.fm,
		/**
		 * window closed state
		 *
		 * @type Number
		 **/
		closed     = 0,
		/**
		 * window animated state
		 *
		 * @type Number
		 **/
		animated   = 1,
		/**
		 * window opened state
		 *
		 * @type Number
		 **/
		opened     = 2,
		/**
		 * window docked state
		 *
		 * @type Number
		 **/
		docked     = 3,
		/**
		 * window docked and hidden state
		 *
		 * @type Number
		 **/
		dockedhidden = 4,
		/**
		 * window state
		 *
		 * @type Number
		 **/
		state      = closed,
		/**
		 * Event name of update
		 * for fix conflicts with Prototype.JS
		 * 
		 * `@see https://github.com/Studio-42/elFinder/pull/2346
		 * @type String
		 **/
		evUpdate = Element.update? 'quicklookupdate' : 'update',
		/**
		 * navbar icon class
		 *
		 * @type String
		 **/
		navicon    = 'elfinder-quicklook-navbar-icon',
		/**
		 * navbar "fullscreen" icon class
		 *
		 * @type String
		 **/
		fullscreen = 'elfinder-quicklook-fullscreen',
		/**
		 * info wrapper class
		 * 
		 * @type String
		 */
		infocls    = 'elfinder-quicklook-info-wrapper',
		/**
		 * Triger keydown/keypress event with left/right arrow key code
		 *
		 * @param  Number  left/right arrow key code
		 * @return void
		 **/
		navtrigger = function(code) {
			jQuery(document).trigger(jQuery.Event('keydown', { keyCode: code, ctrlKey : false, shiftKey : false, altKey : false, metaKey : false }));
		},
		/**
		 * Return css for closed window
		 *
		 * @param  jQuery  file node in cwd
		 * @return void
		 **/
		closedCss = function(node) {
			var elf = fm.getUI().offset(),
				base = (function() {
					var target = node.find('.elfinder-cwd-file-wrapper');
					return target.length? target : node;
				})(),
				baseOffset = base.offset() || { top: 0, left: 0 };
			return {
				opacity : 0,
				width   : base.width(),
				height  : base.height() - 30,
				top     : baseOffset.top - elf.top,
				left    : baseOffset.left  - elf.left
			};
		},
		/**
		 * Return css for opened window
		 *
		 * @return void
		 **/
		openedCss = function() {
			var contain = self.options.contain || fm.options.dialogContained,
				win = contain? fm.getUI() : jQuery(window),
				elf = fm.getUI().offset(),
				w = Math.min(width, win.width()-10),
				h = Math.min(height, win.height()-80);
			return {
				opacity : 1,
				width  : w,
				height : h,
				top    : parseInt((win.height() - h - 60) / 2 + (contain? 0 : win.scrollTop() - elf.top)),
				left   : parseInt((win.width() - w) / 2 + (contain? 0 : win.scrollLeft() - elf.left))
			};
		},
		
		mediaNode = {},
		support = function(codec, name) {
			var node  = name || codec.substr(0, codec.indexOf('/')),
				media = mediaNode[node]? mediaNode[node] : (mediaNode[node] = document.createElement(node)),
				value = false;
			
			try {
				value = media.canPlayType && media.canPlayType(codec);
			} catch(e) {}
			
			return (value && value !== '' && value != 'no')? true : false;
		},
		
		platformWin = (window.navigator.platform.indexOf('Win') != -1),
		
		/**
		 * Opened window width (from config)
		 *
		 * @type Number
		 **/
		width, 
		/**
		 * Opened window height (from config)
		 *
		 * @type Number
		 **/
		height, 
		/**
		 * Previous style before docked
		 *
		 * @type String
		 **/
		prevStyle,
		/**
		 * elFinder node
		 *
		 * @type jQuery
		 **/
		parent, 
		/**
		 * elFinder current directory node
		 *
		 * @type jQuery
		 **/
		cwd, 
		/**
		 * Current directory hash
		 *
		 * @type String
		 **/
		cwdHash,
		dockEnabled = false,
		navdrag = false,
		navmove = false,
		navtm   = null,
		leftKey = jQuery.ui.keyCode.LEFT,
		rightKey = jQuery.ui.keyCode.RIGHT,
		coverEv = 'mousemove touchstart ' + ('onwheel' in document? 'wheel' : 'onmousewheel' in document? 'mousewheel' : 'DOMMouseScroll'),
		title   = jQuery('<span class="elfinder-dialog-title elfinder-quicklook-title"></span>'),
		icon    = jQuery('<div></div>'),
		info    = jQuery('<div class="elfinder-quicklook-info"></div>'),//.hide(),
		cover   = jQuery('<div class="ui-front elfinder-quicklook-cover"></div>'),
		fsicon  = jQuery('<div class="'+navicon+' '+navicon+'-fullscreen"></div>')
			.on('click touchstart', function(e) {
				if (navmove) {
					return;
				}
				
				var win     = self.window,
					full    = win.hasClass(fullscreen),
					$window = jQuery(window),
					resize  = function() { self.preview.trigger('changesize'); };
					
				e.stopPropagation();
				e.preventDefault();
				
				if (full) {
					navStyle = '';
					navShow();
					win.toggleClass(fullscreen)
					.css(win.data('position'));
					$window.trigger(self.resize).off(self.resize, resize);
					navbar.off('mouseenter mouseleave');
					cover.off(coverEv);
				} else {
					win.toggleClass(fullscreen)
					.data('position', {
						left   : win.css('left'), 
						top    : win.css('top'), 
						width  : win.width(), 
						height : win.height(),
						display: 'block'
					})
					.removeAttr('style');

					jQuery(window).on(self.resize, resize)
					.trigger(self.resize);

					cover.on(coverEv, function(e) {
						if (! navdrag) {
							if (e.type === 'mousemove' || e.type === 'touchstart') {
								navShow();
								navtm = setTimeout(function() {
									if (fm.UA.Mobile || navbar.parent().find('.elfinder-quicklook-navbar:hover').length < 1) {
										navbar.fadeOut('slow', function() {
											cover.show();
										});
									}
								}, 3000);
							}
							if (cover.is(':visible')) {
								coverHide();
								cover.data('tm', setTimeout(function() {
									cover.show();
								}, 3000));
							}
						}
					}).show().trigger('mousemove');
					
					navbar.on('mouseenter mouseleave', function(e) {
						if (! navdrag) {
							if (e.type === 'mouseenter') {
								navShow();
							} else {
								cover.trigger('mousemove');
							}
						}
					});
				}
				if (fm.zIndex) {
					win.css('z-index', fm.zIndex + 1);
				}
				if (fm.UA.Mobile) {
					navbar.attr('style', navStyle);
				} else {
					navbar.attr('style', navStyle).draggable(full ? 'destroy' : {
						start: function() {
							navdrag = true;
							navmove = true;
							cover.show();
							navShow();
						},
						stop: function() {
							navdrag = false;
							navStyle = self.navbar.attr('style');
							requestAnimationFrame(function() {
								navmove = false;
							});
						}
					});
				}
				jQuery(this).toggleClass(navicon+'-fullscreen-off');
				var collection = win;
				if (parent.is('.ui-resizable')) {
					collection = collection.add(parent);
				}
				collection.resizable(full ? 'enable' : 'disable').removeClass('ui-state-disabled');

				win.trigger('viewchange');
			}
		),
		
		updateOnSel = function() {
			self.update(void(0), (function() {
				var fm = self.fm,
					files = fm.selectedFiles(),
					cnt = files.length,
					inDock = self.docked(),
					getInfo = function() {
						var ts = 0;
						jQuery.each(files, function(i, f) {
							var t = parseInt(f.ts);
							if (ts >= 0) {
								if (t > ts) {
									ts = t;
								}
							} else {
								ts = 'unknown';
							}
						});
						return {
							hash : files[0].hash  + '/' + (+new Date()),
							name : fm.i18n('items') + ': ' + cnt,
							mime : 'group',
							size : spinner,
							ts   : ts,
							files : jQuery.map(files, function(f) { return f.hash; }),
							getSize : true
						};
					};
				if (! cnt) {
					cnt = 1;
					files = [fm.cwd()];
				}
				return (cnt === 1)? files[0] : getInfo();
			})());
		},
		
		navShow = function() {
			if (self.window.hasClass(fullscreen)) {
				navtm && clearTimeout(navtm);
				navtm = null;
				// if use `show()` it make infinite loop with old jQuery (jQuery/jQuery UI: 1.8.0/1.9.0)
				// see #1478 https://github.com/Studio-42/elFinder/issues/1478
				navbar.stop(true, true).css('display', 'block');
				coverHide();
			}
		},
		
		coverHide = function() {
			cover.data('tm') && clearTimeout(cover.data('tm'));
			cover.removeData('tm');
			cover.hide();
		},
			
		prev = jQuery('<div class="'+navicon+' '+navicon+'-prev"></div>').on('click touchstart', function(e) { ! navmove && navtrigger(leftKey); return false; }),
		next = jQuery('<div class="'+navicon+' '+navicon+'-next"></div>').on('click touchstart', function(e) { ! navmove && navtrigger(rightKey); return false; }),
		navbar  = jQuery('<div class="elfinder-quicklook-navbar"></div>')
			.append(prev)
			.append(fsicon)
			.append(next)
			.append('<div class="elfinder-quicklook-navbar-separator"></div>')
			.append(jQuery('<div class="'+navicon+' '+navicon+'-close"></div>').on('click touchstart', function(e) { ! navmove && self.window.trigger('close'); return false; }))
		,
		titleClose = jQuery('<span class="ui-front ui-icon elfinder-icon-close ui-icon-closethick"></span>').on('mousedown', function(e) {
			e.stopPropagation();
			self.window.trigger('close');
		}),
		titleDock = jQuery('<span class="ui-front ui-icon elfinder-icon-minimize ui-icon-minusthick"></span>').on('mousedown', function(e) {
			e.stopPropagation();
			if (! self.docked()) {
				self.window.trigger('navdockin');
			} else {
				self.window.trigger('navdockout');
			}
		}),
		spinner = '<span class="elfinder-spinner-text">' + fm.i18n('calc') + '</span>' + '<span class="elfinder-spinner"></span>',
		navStyle = '',
		init = true,
		dockHeight,	getSize, tm4cwd, dockedNode, selectTm;

	/**
	 * Any flags for each plugin
	 */
	this.flags = {};
	
	this.cover = cover;
	this.evUpdate = evUpdate;
	(this.navbar = navbar)._show = navShow;
	this.resize = 'resize.'+fm.namespace;
	this.info = jQuery('<div></div>').addClass(infocls)
		.append(icon)
		.append(info);
	this.autoPlay = function() {
		if (self.opened()) {
			return !! self.options[self.docked()? 'dockAutoplay' : 'autoplay'];
		}
		return false;
	};
	this.preview = jQuery('<div class="elfinder-quicklook-preview ui-helper-clearfix"></div>')
		// clean info/icon
		.on('change', function() {
			navShow();
			navbar.attr('style', navStyle);
			self.docked() && navbar.hide();
			self.preview.attr('style', '').removeClass('elfinder-overflow-auto');
			self.info.attr('style', '').hide();
			self.cover.removeClass('elfinder-quicklook-coverbg');
			icon.removeAttr('class').attr('style', '');
			info.html('');
		})
		// update info/icon
		.on(evUpdate, function(e) {
			var preview = self.preview,
				file    = e.file,
				tpl     = '<div class="elfinder-quicklook-info-data">{value}</div>',
				update  = function() {
					var win = self.window.css('overflow', 'hidden');
					name = fm.escape(file.i18 || file.name);
					!file.read && e.stopImmediatePropagation();
					self.window.data('hash', file.hash);
					self.preview.off('changesize').trigger('change').children().remove();
					title.html(name);
					
					prev.css('visibility', '');
					next.css('visibility', '');
					if (file.hash === fm.cwdId2Hash(cwd.find('[id]:not(.elfinder-cwd-parent):first').attr('id'))) {
						prev.css('visibility', 'hidden');
					}
					if (file.hash === fm.cwdId2Hash(cwd.find('[id]:last').attr('id'))) {
						next.css('visibility', 'hidden');
					}
					
					if (file.mime === 'directory') {
						getSizeHashes = [ file.hash ];
					} else if (file.mime === 'group' && file.getSize) {
						getSizeHashes = file.files;
					}
					
					info.html(
						tpl.replace(/\{value\}/, name)
						+ tpl.replace(/\{value\}/, fm.mime2kind(file))
						+ tpl.replace(/\{value\}/, getSizeHashes.length ? spinner : fm.formatSize(file.size))
						+ tpl.replace(/\{value\}/, fm.i18n('modify')+': '+ fm.formatDate(file))
					);
					
					if (getSizeHashes.length) {
						getSize = fm.getSize(getSizeHashes).done(function(data) {
							info.find('span.elfinder-spinner').parent().html(data.formated);
						}).fail(function() {
							info.find('span.elfinder-spinner').parent().html(fm.i18n('unknown'));
						}).always(function() {
							getSize = null;
						});
						getSize._hash = file.hash;
					}
					
					icon.addClass('elfinder-cwd-icon ui-corner-all '+fm.mime2class(file.mime));
					
					if (file.icon) {
						icon.css(fm.getIconStyle(file, true));
					}
					
					self.info.attr('class', infocls);
					if (file.csscls) {
						self.info.addClass(file.csscls);
					}
	
					if (file.read && (tmb = fm.tmb(file))) {
						jQuery('<img/>')
							.hide()
							.appendTo(self.preview)
							.on('load', function() {
								icon.addClass(tmb.className).css('background-image', "url('"+tmb.url+"')");
								jQuery(this).remove();
							})
							.attr('src', tmb.url);
					}
					self.info.delay(100).fadeIn(10);
					if (self.window.hasClass(fullscreen)) {
						cover.trigger('mousemove');
					}
					win.css('overflow', '');
				},
				tmb, name, getSizeHashes = [];

			if (file && ! Object.keys(file).length) {
				file = fm.cwd();
			}
			if (file && getSize && getSize.state() === 'pending' && getSize._hash !== file.hash) {
				getSize.reject();
			}
			if (file && (e.forceUpdate || self.window.data('hash') !== file.hash)) {
				update();
			} else { 
				e.stopImmediatePropagation();
			}
		});

	this.window = jQuery('<div class="ui-front ui-helper-reset ui-widget elfinder-quicklook touch-punch" style="position:absolute"></div>')
		.hide()
		.addClass(fm.UA.Touch? 'elfinder-touch' : '')
		.on('click', function(e) {
			var win = this;
			e.stopPropagation();
			if (state === opened) {
				requestAnimationFrame(function() {
					state === opened && fm.toFront(win);
				});
			}
		})
		.append(
			jQuery('<div class="ui-dialog-titlebar ui-widget-header ui-corner-top ui-helper-clearfix elfinder-quicklook-titlebar"></div>')
			.append(
				jQuery('<span class="ui-widget-header ui-dialog-titlebar-close ui-corner-all elfinder-titlebar-button elfinder-quicklook-titlebar-icon'+(platformWin? ' elfinder-titlebar-button-right' : '')+'"></span>').append(
					titleClose, titleDock
				),
				title
			),
			this.preview,
			self.info.hide(),
			cover.hide(),
			navbar
		)
		.draggable({handle : 'div.elfinder-quicklook-titlebar'})
		.on('open', function(e, clcss) {
			var win  = self.window, 
				file = self.value,
				node = fm.getUI('cwd'),
				open = function(status) {
					state = status;
					self.update(1, self.value);
					self.change();
					win.trigger('resize.' + fm.namespace);
				};

			if (!init && state === closed) {
				if (file && file.hash !== cwdHash) {
					node = fm.cwdHash2Elm(file.hash.split('/', 2)[0]);
				}
				navStyle = '';
				navbar.attr('style', '');
				state = animated;
				node.trigger('scrolltoview');
				coverHide();
				win.css(clcss || closedCss(node))
					.show()
					.animate(openedCss(), 550, function() {
						open(opened);
						navShow();
					});
				fm.toFront(win);
			} else if (state === dockedhidden) {
				fm.getUI('navdock').data('addNode')(dockedNode);
				open(docked);
				self.preview.trigger('changesize');
				fm.storage('previewDocked', '1');
				if (fm.getUI('navdock').width() === 0) {
					win.trigger('navdockout');
				}
			}
		})
		.on('close', function(e, dfd) {
			var win     = self.window,
				preview = self.preview.trigger('change'),
				file    = self.value,
				hash    = (win.data('hash') || '').split('/', 2)[0],
				close   = function(status, winhide) {
					state = status;
					winhide && fm.toHide(win);
					preview.children().remove();
					self.update(0, self.value);
					win.data('hash', '');
					dfd && dfd.resolve();
				},
				node;
				
			if (self.opened()) {
				getSize && getSize.state() === 'pending' && getSize.reject();
				if (! self.docked()) {
					state = animated;
					win.hasClass(fullscreen) && fsicon.click();
					(hash && (node = cwd.find('#'+hash)).length)
						? win.animate(closedCss(node), 500, function() {
							preview.off('changesize');
							close(closed, true);
						})
						: close(closed, true);
				} else {
					dockedNode = fm.getUI('navdock').data('removeNode')(self.window.attr('id'), 'detach');
					close(dockedhidden);
					fm.storage('previewDocked', '2');
				}
			}
		})
		.on('navdockin', function(e, data) {
			var w      = self.window,
				box    = fm.getUI('navdock'),
				height = dockHeight || box.width(),
				opts   = data || {};
			
			if (init) {
				opts.init = true;
			}
			state = docked;
			prevStyle = w.attr('style');
			w.toggleClass('ui-front').removeClass('ui-widget').draggable('disable').resizable('disable').removeAttr('style').css({
				width: '100%',
				height: height,
				boxSizing: 'border-box',
				paddingBottom: 0,
				zIndex: 'unset'
			});
			navbar.hide();
			titleDock.toggleClass('ui-icon-plusthick ui-icon-minusthick elfinder-icon-full elfinder-icon-minimize');
			
			fm.toHide(w, true);
			box.data('addNode')(w, opts);
			
			self.preview.trigger('changesize');
			
			fm.storage('previewDocked', '1');
		})
		.on('navdockout', function(e) {
			var w   = self.window,
				box = fm.getUI('navdock'),
				dfd = jQuery.Deferred(),
				clcss = closedCss(self.preview);
			
			dockHeight = w.outerHeight();
			box.data('removeNode')(w.attr('id'), fm.getUI());
			w.toggleClass('ui-front').addClass('ui-widget').draggable('enable').resizable('enable').attr('style', prevStyle);
			titleDock.toggleClass('ui-icon-plusthick ui-icon-minusthick elfinder-icon-full elfinder-icon-minimize');
			
			state = closed;
			w.trigger('open', clcss);
			
			fm.storage('previewDocked', '0');
		})
		.on('resize.' + fm.namespace, function() {
			self.preview.trigger('changesize'); 
		});

	/**
	 * This command cannot be disable by backend
	 *
	 * @type Boolean
	 **/
	this.alwaysEnabled = true;
	
	/**
	 * Selected file
	 *
	 * @type Object
	 **/
	this.value = null;
	
	this.handlers = {
		// save selected file
		select : function(e, d) {
			selectTm && cancelAnimationFrame(selectTm);
			if (! e.data || ! e.data.selected || ! e.data.selected.length) {
				selectTm = requestAnimationFrame(function() {
					self.opened() && updateOnSel();
				});
			} else {
				self.opened() && updateOnSel();
			}
		},
		error  : function() { self.window.is(':visible') && self.window.trigger('close'); },
		'searchshow searchhide' : function() { this.opened() && this.window.trigger('close'); },
		navbarshow : function() {
			requestAnimationFrame(function() {
				self.docked() && self.preview.trigger('changesize');
			});
		},
		destroy : function() { self.window.remove(); }
	};
	
	this.shortcuts = [{
		pattern     : 'space'
	}];
	
	this.support = {
		audio : {
			ogg : support('audio/ogg;'),
			webm: support('audio/webm;'),
			mp3 : support('audio/mpeg;'),
			wav : support('audio/wav;'),
			m4a : support('audio/mp4;') || support('audio/x-m4a;') || support('audio/aac;'),
			flac: support('audio/flac;'),
			amr : support('audio/amr;')
		},
		video : {
			ogg  : support('video/ogg;'),
			webm : support('video/webm;'),
			mp4  : support('video/mp4;'),
			mkv  : support('video/x-matroska;') || support('video/webm;'),
			'3gp': support('video/3gpp;') || support('video/mp4;'), // try as mp4
			m3u8 : support('application/x-mpegURL', 'video') || support('application/vnd.apple.mpegURL', 'video'),
			mpd  : support('application/dash+xml', 'video')
		}
	};
	// for GC
	mediaNode = {};
	
	/**
	 * Return true if quickLoock window is hiddenReturn true if quickLoock window is visible and not animated
	 *
	 * @return Boolean
	 **/
	this.closed = function() {
		return (state == closed || state == dockedhidden);
	};
	
	/**
	 * Return true if quickLoock window is visible and not animated
	 *
	 * @return Boolean
	 **/
	this.opened = function() {
		return state == opened || state == docked;
	};
	
	/**
	 * Return true if quickLoock window is in NavDock
	 *
	 * @return Boolean
	 **/
	this.docked = function() {
		return state == docked;
	};
	
	/**
	 * Adds an integration into help dialog.
	 *
	 * @param Object opts  options
	 */
	this.addIntegration = function(opts) {
		requestAnimationFrame(function() {
			fm.trigger('helpIntegration', Object.assign({cmd: 'quicklook'}, opts));
		});
	};

	/**
	 * Init command.
	 * Add default plugins and init other plugins
	 *
	 * @return Object
	 **/
	this.init = function() {
		var o       = this.options, 
			win     = this.window,
			preview = this.preview,
			i, p, cwdDispInlineRegex;
		
		width  = o.width  > 0 ? parseInt(o.width)  : 450;	
		height = o.height > 0 ? parseInt(o.height) : 300;
		if (o.dockHeight !== 'auto') {
			dockHeight = parseInt(o.dockHeight);
			if (! dockHeight) {
				dockHeight = void(0);
			}
		}

		fm.one('load', function() {
			
			dockEnabled = fm.getUI('navdock').data('dockEnabled');
			
			! dockEnabled && titleDock.hide();
			
			parent = fm.getUI();
			cwd    = fm.getUI('cwd');

			if (fm.zIndex) {
				win.css('z-index', fm.zIndex + 1);
			}
			
			win.appendTo(parent);
			
			// close window on escape
			jQuery(document).on('keydown.'+fm.namespace, function(e) {
				e.keyCode == jQuery.ui.keyCode.ESCAPE && self.opened() && ! self.docked() && win.hasClass('elfinder-frontmost') && win.trigger('close');
			});
			
			win.resizable({ 
				handles   : 'se', 
				minWidth  : 350, 
				minHeight : 120, 
				resize    : function() { 
					// use another event to avoid recursion in fullscreen mode
					// may be there is clever solution, but i cant find it :(
					preview.trigger('changesize'); 
				}
			});
			
			self.change(function() {
				if (self.opened()) {
					if (self.value) {
						if (self.value.tmb && self.value.tmb == 1) {
							// try re-get file object
							self.value = Object.assign({}, fm.file(self.value.hash));
						}
						preview.trigger(jQuery.Event(evUpdate, {file : self.value}));
					}
				}
			});
			
			preview.on(evUpdate, function(e) {
				var file, hash, serach;
				
				if (file = e.file) {
					hash = file.hash;
					serach = (fm.searchStatus.mixed && fm.searchStatus.state > 1);
				
					if (file.mime !== 'directory') {
						if (parseInt(file.size) || file.mime.match(o.mimeRegexNotEmptyCheck)) {
							// set current dispInlineRegex
							self.dispInlineRegex = cwdDispInlineRegex;
							if (serach || fm.optionsByHashes[hash]) {
								try {
									self.dispInlineRegex = new RegExp(fm.option('dispInlineRegex', hash), 'i');
								} catch(e) {
									try {
										self.dispInlineRegex = new RegExp(!fm.isRoot(file)? fm.option('dispInlineRegex', file.phash) : fm.options.dispInlineRegex, 'i');
									} catch(e) {
										self.dispInlineRegex = /^$/;
									}
								}
							}
						} else {
							//  do not preview of file that size = 0
							e.stopImmediatePropagation();
						}
					} else {
						self.dispInlineRegex = /^$/;
					}
					
					self.info.show();
				} else {
					e.stopImmediatePropagation();
				}
			});

			jQuery.each(fm.commands.quicklook.plugins || [], function(i, plugin) {
				if (typeof(plugin) == 'function') {
					new plugin(self);
				}
			});
		}).one('open', function() {
			var dock = Number(fm.storage('previewDocked') || o.docked),
				win;
			if (dockEnabled && dock >= 1) {
				win = self.window;
				self.exec();
				win.trigger('navdockin', { init : true });
				if (dock === 2) {
					win.trigger('close');
				} else {
					self.update(void(0), fm.cwd());
					self.change();
				}
			}
			init = false;
		}).bind('open', function() {
			cwdHash = fm.cwd().hash;
			self.value = fm.cwd();
			// set current volume dispInlineRegex
			try {
				cwdDispInlineRegex = new RegExp(fm.option('dispInlineRegex'), 'i');
			} catch(e) {
				cwdDispInlineRegex = /^$/;
			}
		}).bind('change', function(e) {
			if (e.data && e.data.changed && self.opened()) {
				jQuery.each(e.data.changed, function() {
					if (self.window.data('hash') === this.hash) {
						self.window.data('hash', null);
						self.preview.trigger(evUpdate);
						return false;
					}
				});
			}
		}).bind('navdockresizestart navdockresizestop', function(e) {
			cover[e.type === 'navdockresizestart'? 'show' : 'hide']();
		});
	};
	
	this.getstate = function() {
		return self.opened()? 1 : 0;
	};
	
	this.exec = function() {
		self.closed() && updateOnSel();
		self.enabled() && self.window.trigger(self.opened() ? 'close' : 'open');
		return jQuery.Deferred().resolve();
	};

	this.hideinfo = function() {
		this.info.stop(true, true).hide();
	};

}).prototype = { forceLoad : true }; // this is required command
js/commands/preference.js000064400000052570151215013360011443 0ustar00/**
 * @class  elFinder command "preference"
 * "Preference" dialog
 *
 * @author Naoki Sawada
 **/
elFinder.prototype.commands.preference = function() {
	var self    = this,
		fm      = this.fm,
		r       = 'replace',
		tab     = '<li class="' + fm.res('class', 'tabstab') + ' elfinder-preference-tab-{id}"><a href="#'+fm.namespace+'-preference-{id}" id="'+fm.namespace+'-preference-tab-{id}" class="ui-tabs-anchor {class}">{title}</a></li>',
		base    = jQuery('<div class="ui-tabs ui-widget ui-widget-content ui-corner-all elfinder-preference">'), 
		ul      = jQuery('<ul class="ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-top">'),
		tabs    = jQuery('<div class="elfinder-preference-tabs ui-tabs-panel ui-widget-content ui-corner-bottom"></div>'),
		sep     = '<div class="elfinder-preference-separator"></div>',
		selfUrl = jQuery('base').length? document.location.href.replace(/#.*$/, '') : '',
		selectTab = function(tab) {
			jQuery('#'+fm.namespace+'-preference-tab-'+tab).trigger('mouseover').trigger('click');
			openTab = tab;
		},
		clTabActive = fm.res('class', 'tabsactive'),
		build   = function() {
			var cats = self.options.categories || {
					'language' : ['language'],
					'theme' : ['theme'],
					'toolbar' : ['toolbarPref'],
					'workspace' : ['iconSize','columnPref', 'selectAction', 'makefileTypes', 'useStoredEditor', 'editorMaximized', 'useFullscreen', 'showHidden'],
					'dialog' : ['autoFocusDialog'],
					'selectionInfo' : ['infoItems', 'hashChecker'],
					'reset' : ['clearBrowserData'],
					'all' : true
				},
				forms = self.options.prefs || ['language', 'theme', 'toolbarPref', 'iconSize', 'columnPref', 'selectAction', 'makefileTypes', 'useStoredEditor', 'editorMaximized', 'useFullscreen', 'showHidden', 'infoItems', 'hashChecker', 'autoFocusDialog', 'clearBrowserData'];
			
			if (!fm.cookieEnabled) {
				delete cats.language;
			}

			forms = fm.arrayFlip(forms, true);
			
			if (fm.options.getFileCallback) {
				delete forms.selectAction;
			}
			if (!fm.UA.Fullscreen) {
				delete forms.useFullscreen;
			}

			forms.language && (forms.language = (function() {
				var langSel = jQuery('<select></select>').on('change', function() {
						var lang = jQuery(this).val();
						fm.storage('lang', lang);
						jQuery('#'+fm.id).elfinder('reload');
					}),
					optTags = [],
					langs = self.options.langs || {
						ar: 'العربية',
						bg: 'Български',
						ca: 'Català',
						cs: 'Čeština',
						da: 'Dansk',
						de: 'Deutsch',
						el: 'Ελληνικά',
						en: 'English',
						es: 'Español',
						fa: 'فارسی',
						fo: 'Føroyskt',
						fr: 'Français',
						fr_CA: 'Français (Canada)',
						he: 'עברית',
						hr: 'Hrvatski',
						hu: 'Magyar',
						id: 'Bahasa Indonesia',
						it: 'Italiano',
						ja: '日本語',
						ko: '한국어',
						nl: 'Nederlands',
						no: 'Norsk',
						//pl: 'Polski',
						pt_BR: 'Português',
						ro: 'Română',
						ru: 'Pусский',
						si: 'සිංහල',
						sk: 'Slovenčina',
						sl: 'Slovenščina',
						sr: 'Srpski',
						sv: 'Svenska',
						tr: 'Türkçe',
						ug_CN: 'ئۇيغۇرچە',
						uk: 'Український',
						vi: 'Tiếng Việt',
						zh_CN: '简体中文',
						zh_TW: '正體中文'
					};
				if (!fm.cookieEnabled) {
					return jQuery();
				}
				jQuery.each(langs, function(lang, name) {
					optTags.push('<option value="'+lang+'">'+name+'</option>');
				});
				return langSel.append(optTags.join('')).val(fm.lang);
			})());
			
			forms.theme && (forms.theme = (function() {
				var cnt = fm.options.themes? Object.keys(fm.options.themes).length : 0;
				if (cnt === 0 || (cnt === 1 && fm.options.themes.default)) {
					return null;
				}
				var themeSel = jQuery('<select></select>').on('change', function() {
						var theme = jQuery(this).val();
						fm.changeTheme(theme).storage('theme', theme);
					}),
					optTags = [],
					tpl = {
						image: '<img class="elfinder-preference-theme elfinder-preference-theme-image" src="$2" />',
						link: '<a href="$1" target="_blank" title="$3">$2</a>',
						data: '<dt>$1</dt><dd><span class="elfinder-preference-theme elfinder-preference-theme-$0">$2</span></dd>'
					},
					items = ['image', 'description', 'author', 'email', 'license'],
					render = function(key, data) {
					},
					defBtn = jQuery('<button class="ui-button ui-corner-all ui-widget elfinder-preference-theme-default"></button>').text(fm.i18n('default')).on('click', function(e) {
						themeSel.val('default').trigger('change');
					}),
					list = jQuery('<div class="elfinder-reference-hide-taball"></div>').on('click', 'button', function() {
							var val = jQuery(this).data('themeid');
							themeSel.val(val).trigger('change');
					});

				if (!fm.options.themes.default) {
					themeSel.append('<option value="default">'+fm.i18n('default')+'</option>');
				}
				jQuery.each(fm.options.themes, function(id, val) {
					var opt = jQuery('<option class="elfinder-theme-option-'+id+'" value="'+id+'">'+fm.i18n(id)+'</option>'),
						dsc = jQuery('<fieldset class="ui-widget ui-widget-content ui-corner-all elfinder-theme-list-'+id+'"><legend>'+fm.i18n(id)+'</legend><div><span class="elfinder-spinner"></span></div></fieldset>'),
						tm;
					themeSel.append(opt);
					list.append(dsc);
					tm = setTimeout(function() {
						dsc.find('span.elfinder-spinner').replaceWith(fm.i18n(['errRead', id]));
					}, 10000);
					fm.getTheme(id).always(function() {
						tm && clearTimeout(tm);
					}).done(function(data) {
						var link, val = jQuery(), dl = jQuery('<dl></dl>');
						link = data.link? tpl.link.replace(/\$1/g, data.link).replace(/\$3/g, fm.i18n('website')) : '$2';
						if (data.name) {
							opt.html(fm.i18n(data.name));
						}
						dsc.children('legend').html(link.replace(/\$2/g, fm.i18n(data.name) || id));
						jQuery.each(items, function(i, key) {
							var t = tpl[key] || tpl.data,
								elm;
							if (data[key]) {
								elm = t.replace(/\$0/g, fm.escape(key)).replace(/\$1/g, fm.i18n(key)).replace(/\$2/g, fm.i18n(data[key]));
								if (key === 'image' && data.link) {
									elm = jQuery(elm).on('click', function() {
										themeSel.val(id).trigger('change');
									}).attr('title', fm.i18n('select'));
								}
								dl.append(elm);
							}
						});
						val = val.add(dl);
						val = val.add(jQuery('<div class="elfinder-preference-theme-btn"></div>').append(jQuery('<button class="ui-button ui-corner-all ui-widget"></button>').data('themeid', id).html(fm.i18n('select'))));
						dsc.find('span.elfinder-spinner').replaceWith(val);
					}).fail(function() {
						dsc.find('span.elfinder-spinner').replaceWith(fm.i18n(['errRead', id]));
					});
				});
				return jQuery('<div></div>').append(themeSel.val(fm.theme && fm.theme.id? fm.theme.id : 'default'), defBtn, list);
			})());

			forms.toolbarPref && (forms.toolbarPref = (function() {
				var pnls = jQuery.map(fm.options.uiOptions.toolbar, function(v) {
						return jQuery.isArray(v)? v : null;
					}),
					tags = [],
					hides = fm.storage('toolbarhides') || {};
				jQuery.each(pnls, function() {
					var cmd = this,
						name = fm.i18n('cmd'+cmd);
					if (name === 'cmd'+cmd) {
						name = fm.i18n(cmd);
					}
					tags.push('<span class="elfinder-preference-toolbar-item"><label><input type="checkbox" value="'+cmd+'" '+(hides[cmd]? '' : 'checked')+'/>'+name+'</label></span>');
				});
				return jQuery(tags.join(' ')).on('change', 'input', function() {
					var v = jQuery(this).val(),
						o = jQuery(this).is(':checked');
					if (!o && !hides[v]) {
						hides[v] = true;
					} else if (o && hides[v]) {
						delete hides[v];
					}
					fm.storage('toolbarhides', hides);
					fm.trigger('toolbarpref');
				});
			})());
			
			forms.iconSize && (forms.iconSize = (function() {
				var max = fm.options.uiOptions.cwd.iconsView.sizeMax || 3,
					size = fm.storage('iconsize') || fm.options.uiOptions.cwd.iconsView.size || 0,
					sld = jQuery('<div class="touch-punch"></div>').slider({
						classes: {
							'ui-slider-handle': 'elfinder-tabstop',
						},
						value: size,
						max: max,
						slide: function(e, ui) {
							fm.getUI('cwd').trigger('iconpref', {size: ui.value});
						},
						change: function(e, ui) {
							fm.storage('iconsize', ui.value);
						}
					});
				fm.getUI('cwd').on('iconpref', function(e, data) {
					sld.slider('option', 'value', data.size);
				});
				return sld;
			})());

			forms.columnPref && (forms.columnPref = (function() {
				var cols = fm.options.uiOptions.cwd.listView.columns,
					tags = [],
					hides = fm.storage('columnhides') || {};
				jQuery.each(cols, function() {
					var key = this,
						name = fm.getColumnName(key);
					tags.push('<span class="elfinder-preference-column-item"><label><input type="checkbox" value="'+key+'" '+(hides[key]? '' : 'checked')+'/>'+name+'</label></span>');
				});
				return jQuery(tags.join(' ')).on('change', 'input', function() {
					var v = jQuery(this).val(),
						o = jQuery(this).is(':checked');
					if (!o && !hides[v]) {
						hides[v] = true;
					} else if (o && hides[v]) {
						delete hides[v];
					}
					fm.storage('columnhides', hides);
					fm.trigger('columnpref', { repaint: true });
				});
			})());
			
			forms.selectAction && (forms.selectAction = (function() {
				var actSel = jQuery('<select></select>').on('change', function() {
						var act = jQuery(this).val();
						fm.storage('selectAction', act === 'default'? null : act);
					}),
					optTags = [],
					acts = self.options.selectActions,
					defAct = fm.getCommand('open').options.selectAction || 'open';
				
				if (jQuery.inArray(defAct, acts) === -1) {
					acts.unshift(defAct);
				}
				jQuery.each(acts, function(i, act) {
					var names = jQuery.map(act.split('/'), function(cmd) {
						var name = fm.i18n('cmd'+cmd);
						if (name === 'cmd'+cmd) {
							name = fm.i18n(cmd);
						}
						return name;
					});
					optTags.push('<option value="'+act+'">'+names.join('/')+'</option>');
				});
				return actSel.append(optTags.join('')).val(fm.storage('selectAction') || defAct);
			})());
			
			forms.makefileTypes && (forms.makefileTypes = (function() {
				var hides = fm.getCommand('edit').getMkfileHides(),
					getTag = function() {
						var tags = [];
						// re-assign hides
						hides = fm.getCommand('edit').getMkfileHides();
						jQuery.each(fm.mimesCanMakeEmpty, function(mime, type) {
							var name = fm.getCommand('mkfile').getTypeName(mime, type);
							tags.push('<span class="elfinder-preference-column-item" title="'+fm.escape(name)+'"><label><input type="checkbox" value="'+mime+'" '+(hides[mime]? '' : 'checked')+'/>'+type+'</label></span>');
						});
						return tags.join(' ');
					},
					elm = jQuery('<div></div>').on('change', 'input', function() {
						var v = jQuery(this).val(),
							o = jQuery(this).is(':checked');
						if (!o && !hides[v]) {
							hides[v] = true;
						} else if (o && hides[v]) {
							delete hides[v];
						}
						fm.storage('mkfileHides', hides);
						fm.trigger('canMakeEmptyFile');
					}).append(getTag()),
					add = jQuery('<div></div>').append(
						jQuery('<input type="text" placeholder="'+fm.i18n('typeOfTextfile')+'"/>').on('keydown', function(e) {
							(e.keyCode === jQuery.ui.keyCode.ENTER) && jQuery(this).next().trigger('click');
						}),
						jQuery('<button class="ui-button"></button>').html(fm.i18n('add')).on('click', function() {
							var input = jQuery(this).prev(),
								val = input.val(),
								uiToast = fm.getUI('toast'),
								err = function() {
									uiToast.appendTo(input.closest('.ui-dialog'));
									fm.toast({
										msg: fm.i18n('errUsupportType'),
										mode: 'warning',
										onHidden: function() {
											uiToast.children().length === 1 && uiToast.appendTo(fm.getUI());
										}
									});
									input.trigger('focus');
									return false;
								},
								tmpMimes;
							if (!val.match(/\//)) {
								val = fm.arrayFlip(fm.mimeTypes)[val];
								if (!val) {
									return err();
								}
								input.val(val);
							}
							if (!fm.mimeIsText(val) || !fm.mimeTypes[val]) {
								return err();
							}
							fm.trigger('canMakeEmptyFile', {mimes: [val], unshift: true});
							tmpMimes = {};
							tmpMimes[val] = fm.mimeTypes[val];
							fm.storage('mkfileTextMimes', Object.assign(tmpMimes, fm.storage('mkfileTextMimes') || {}));
							input.val('');
							uiToast.appendTo(input.closest('.ui-dialog'));
							fm.toast({
								msg: fm.i18n(['complete', val + ' (' + tmpMimes[val] + ')']),
								onHidden: function() {
									uiToast.children().length === 1 && uiToast.appendTo(fm.getUI());
								}
							});
						}),
						jQuery('<button class="ui-button"></button>').html(fm.i18n('reset')).on('click', function() {
							fm.one('canMakeEmptyFile', {done: function() {
								elm.empty().append(getTag());
							}});
							fm.trigger('canMakeEmptyFile', {resetTexts: true});
						})
					),
					tm;
				fm.bind('canMakeEmptyFile', {done: function(e) {
					if (e.data && e.data.mimes && e.data.mimes.length) {
						elm.empty().append(getTag());
					}
				}});
				return jQuery('<div></div>').append(elm, add);
			})());

			forms.useStoredEditor && (forms.useStoredEditor = jQuery('<input type="checkbox"/>').prop('checked', (function() {
				var s = fm.storage('useStoredEditor');
				return s? (s > 0) : fm.options.commandsOptions.edit.useStoredEditor;
			})()).on('change', function(e) {
				fm.storage('useStoredEditor', jQuery(this).is(':checked')? 1 : -1);
			}));

			forms.editorMaximized && (forms.editorMaximized = jQuery('<input type="checkbox"/>').prop('checked', (function() {
				var s = fm.storage('editorMaximized');
				return s? (s > 0) : fm.options.commandsOptions.edit.editorMaximized;
			})()).on('change', function(e) {
				fm.storage('editorMaximized', jQuery(this).is(':checked')? 1 : -1);
			}));

			forms.useFullscreen && (forms.useFullscreen = jQuery('<input type="checkbox"/>').prop('checked', (function() {
				var s = fm.storage('useFullscreen');
				return s? (s > 0) : fm.options.commandsOptions.fullscreen.mode === 'screen';
			})()).on('change', function(e) {
				fm.storage('useFullscreen', jQuery(this).is(':checked')? 1 : -1);
			}));

			if (forms.showHidden) {
				(function() {
					var setTitle = function() {
							var s = fm.storage('hide'),
								t = [],
								v;
							if (s && s.items) {
								jQuery.each(s.items, function(h, n) {
									t.push(fm.escape(n));
								});
							}
							elms.prop('disabled', !t.length)[t.length? 'removeClass' : 'addClass']('ui-state-disabled');
							v = t.length? t.join('\n') : '';
							forms.showHidden.attr('title',v);
							useTooltip && forms.showHidden.tooltip('option', 'content', v.replace(/\n/g, '<br>')).tooltip('close');
						},
						chk = jQuery('<input type="checkbox"/>').prop('checked', (function() {
							var s = fm.storage('hide');
							return s && s.show;
						})()).on('change', function(e) {
							var o = {};
							o[jQuery(this).is(':checked')? 'show' : 'hide'] = true;
							fm.exec('hide', void(0), o);
						}),
						btn = jQuery('<button class="ui-button ui-corner-all ui-widget"></button>').append(fm.i18n('reset')).on('click', function() {
							fm.exec('hide', void(0), {reset: true});
							jQuery(this).parent().find('input:first').prop('checked', false);
							setTitle();
						}),
						elms = jQuery().add(chk).add(btn),
						useTooltip;
					
					forms.showHidden = jQuery('<div></div>').append(chk, btn);
					fm.bind('hide', function(e) {
						var d = e.data;
						if (!d.opts || (!d.opts.show && !d.opts.hide)) {
							setTitle();
						}
					});
					if (fm.UA.Mobile && jQuery.fn.tooltip) {
						useTooltip = true;
						forms.showHidden.tooltip({
							classes: {
								'ui-tooltip': 'elfinder-ui-tooltip ui-widget-shadow'
							},
							tooltipClass: 'elfinder-ui-tooltip ui-widget-shadow',
							track: true
						}).css('user-select', 'none');
						btn.css('user-select', 'none');
					}
					setTitle();
				})();
			}
			
			forms.infoItems && (forms.infoItems = (function() {
				var items = fm.getCommand('info').items,
					tags = [],
					hides = fm.storage('infohides') || fm.arrayFlip(fm.options.commandsOptions.info.hideItems, true);
				jQuery.each(items, function() {
					var key = this,
						name = fm.i18n(key);
					tags.push('<span class="elfinder-preference-info-item"><label><input type="checkbox" value="'+key+'" '+(hides[key]? '' : 'checked')+'/>'+name+'</label></span>');
				});
				return jQuery(tags.join(' ')).on('change', 'input', function() {
					var v = jQuery(this).val(),
						o = jQuery(this).is(':checked');
					if (!o && !hides[v]) {
						hides[v] = true;
					} else if (o && hides[v]) {
						delete hides[v];
					}
					fm.storage('infohides', hides);
					fm.trigger('infopref', { repaint: true });
				});
			})());
			
			forms.hashChecker && fm.hashCheckers.length && (forms.hashChecker = (function() {
				var tags = [],
					enabled = fm.arrayFlip(fm.storage('hashchekcer') || fm.options.commandsOptions.info.showHashAlgorisms, true);
				jQuery.each(fm.hashCheckers, function() {
					var cmd = this,
						name = fm.i18n(cmd);
					tags.push('<span class="elfinder-preference-hashchecker-item"><label><input type="checkbox" value="'+cmd+'" '+(enabled[cmd]? 'checked' : '')+'/>'+name+'</label></span>');
				});
				return jQuery(tags.join(' ')).on('change', 'input', function() {
					var v = jQuery(this).val(),
						o = jQuery(this).is(':checked');
					if (o) {
						enabled[v] = true;
					} else if (enabled[v]) {
						delete enabled[v];
					}
					fm.storage('hashchekcer', jQuery.grep(fm.hashCheckers, function(v) {
						return enabled[v];
					}));
				});
			})());

			forms.autoFocusDialog && (forms.autoFocusDialog = jQuery('<input type="checkbox"/>').prop('checked', (function() {
				var s = fm.storage('autoFocusDialog');
				return s? (s > 0) : fm.options.uiOptions.dialog.focusOnMouseOver;
			})()).on('change', function(e) {
				fm.storage('autoFocusDialog', jQuery(this).is(':checked')? 1 : -1);
			}));
			
			forms.clearBrowserData && (forms.clearBrowserData = jQuery('<button></button>').text(fm.i18n('reset')).button().on('click', function(e) {
				e.preventDefault();
				fm.storage();
				jQuery('#'+fm.id).elfinder('reload');
			}));
			
			jQuery.each(cats, function(id, prefs) {
				var dls, found;
				if (prefs === true) {
					found = 1;
				} else if (prefs) {
					dls = jQuery();
					jQuery.each(prefs, function(i, n) {
						var f, title, chks = '', cbox;
						if (f = forms[n]) {
							found = 2;
							title = fm.i18n(n);
							cbox = jQuery(f).filter('input[type="checkbox"]');
							if (!cbox.length) {
								cbox = jQuery(f).find('input[type="checkbox"]');
							}
							if (cbox.length === 1) {
								if (!cbox.attr('id')) {
									cbox.attr('id', 'elfinder-preference-'+n+'-checkbox');
								}
								title = '<label for="'+cbox.attr('id')+'">'+title+'</label>';
							} else if (cbox.length > 1) {
								chks = ' elfinder-preference-checkboxes';
							}
							dls = dls.add(jQuery('<dt class="elfinder-preference-'+n+chks+'">'+title+'</dt>')).add(jQuery('<dd class="elfinder-preference-'+n+chks+'"></dd>').append(f));
						}
					});
				}
				if (found) {
					ul.append(tab[r](/\{id\}/g, id)[r](/\{title\}/, fm.i18n(id))[r](/\{class\}/, openTab === id? 'elfinder-focus' : ''));
					if (found === 2) {
						tabs.append(
							jQuery('<div id="'+fm.namespace+'-preference-'+id+'" class="elfinder-preference-content"></div>')
							.hide()
							.append(jQuery('<dl></dl>').append(dls))
						);
					}
				}
			});

			ul.on('click', 'a', function(e) {
				var t = jQuery(e.target),
					h = t.attr('href');
				e.preventDefault();
				e.stopPropagation();

				ul.children().removeClass(clTabActive);
				t.removeClass('ui-state-hover').parent().addClass(clTabActive);

				if (h.match(/all$/)) {
					tabs.addClass('elfinder-preference-taball').children().show();
				} else {
					tabs.removeClass('elfinder-preference-taball').children().hide();
					jQuery(h).show();
				}
			}).on('focus blur', 'a', function(e) {
				jQuery(this).parent().toggleClass('ui-state-focus', e.type === 'focusin');
			}).on('mouseenter mouseleave', 'li', function(e) {
				jQuery(this).toggleClass('ui-state-hover', e.type === 'mouseenter');
			});

			tabs.find('a,input,select,button').addClass('elfinder-tabstop');
			base.append(ul, tabs);

			dialog = self.fmDialog(base, {
				title : self.title,
				width : self.options.width || 600,
				height: self.options.height || 400,
				maxWidth: 'window',
				maxHeight: 'window',
				autoOpen : false,
				destroyOnClose : false,
				allowMinimize : false,
				open : function() {
					openTab && selectTab(openTab);
					openTab = null;
				},
				resize : function() {
					tabs.height(dialog.height() - ul.outerHeight(true) - (tabs.outerHeight(true) - tabs.height()) - 5);
				}
			})
			.on('click', function(e) {
				e.stopPropagation();
			})
			.css({
				overflow: 'hidden'
			});

			dialog.closest('.ui-dialog')
			.css({
				overflow: 'hidden'
			})
			.addClass('elfinder-bg-translucent');
			
			openTab = 'all';
		},
		dialog, openTab;

	this.shortcuts = [{
		pattern     : 'ctrl+comma',
		description : this.title
	}];

	this.alwaysEnabled  = false;
	
	this.getstate = function() {
		return 0;
	};
	
	this.exec = function(sel, cOpts) {
		!dialog && build();
		if (cOpts) {
			if (cOpts.tab) {
				selectTab(cOpts.tab);
			} else if (cOpts._currentType === 'cwd') {
				selectTab('workspace');
			}
		}
		dialog.elfinderdialog('open');
		return jQuery.Deferred().resolve();
	};

};js/commands/info.js000064400000032207151215013360010253 0ustar00/**
 * @class elFinder command "info". 
 * Display dialog with file properties.
 *
 * @author Dmitry (dio) Levashov, dio@std42.ru
 **/
 (elFinder.prototype.commands.info = function() {
	"use strict";
	var m   = 'msg',
		fm  = this.fm,
		spclass = 'elfinder-spinner',
		btnclass = 'elfinder-info-button',
		msg = {
			calc     : fm.i18n('calc'),
			size     : fm.i18n('size'),
			unknown  : fm.i18n('unknown'),
			path     : fm.i18n('path'),
			aliasfor : fm.i18n('aliasfor'),
			modify   : fm.i18n('modify'),
			perms    : fm.i18n('perms'),
			locked   : fm.i18n('locked'),
			dim      : fm.i18n('dim'),
			kind     : fm.i18n('kind'),
			files    : fm.i18n('files'),
			folders  : fm.i18n('folders'),
			roots    : fm.i18n('volumeRoots'),
			items    : fm.i18n('items'),
			yes      : fm.i18n('yes'),
			no       : fm.i18n('no'),
			link     : fm.i18n('link'),
			owner    : fm.i18n('owner'),
			group    : fm.i18n('group'),
			perm     : fm.i18n('perm'),
			getlink  : fm.i18n('getLink'),
			share    : fm.i18n('getShareText')
		},
		applyZWSP = function(str, remove) {
			if (remove) {
				return str.replace(/\u200B/g, '');
			} else {
				return str.replace(/(\/|\\)/g, "$1\u200B");
			}
		};
	
	this.items = ['size', 'aliasfor', 'path', 'link', 'dim', 'modify', 'perms', 'locked', 'owner', 'group', 'perm'];
	if (this.options.custom && Object.keys(this.options.custom).length) {
		jQuery.each(this.options.custom, function(name, details) {
			details.label && this.items.push(details.label);
		});
	}

	this.tpl = {
		main       : '<div class="ui-helper-clearfix elfinder-info-title {dirclass}"><span class="elfinder-cwd-icon {class} ui-corner-all"{style}></span>{title}</div><table class="elfinder-info-tb">{content}</table>',
		itemTitle  : '<strong>{name}</strong><span class="elfinder-info-kind">{kind}</span>',
		groupTitle : '<strong>{items}: {num}</strong>',
		row        : '<tr><td class="elfinder-info-label">{label} : </td><td class="{class}">{value}</td></tr>',
		spinner    : '<span>{text}</span> <span class="'+spclass+' '+spclass+'-{name}"></span>'
	};
	
	this.alwaysEnabled = true;
	this.updateOnSelect = false;
	this.shortcuts = [{
		pattern     : 'ctrl+i'
	}];
	
	this.init = function() {
		jQuery.each(msg, function(k, v) {
			msg[k] = fm.i18n(v);
		});
	};
	
	this.getstate = function() {
		return 0;
	};
	
	this.exec = function(hashes) {
		var files   = this.files(hashes);
		if (! files.length) {
			files   = this.files([ this.fm.cwd().hash ]);
		}
		var self    = this,
			fm      = this.fm,
			o       = this.options,
			tpl     = this.tpl,
			row     = tpl.row,
			cnt     = files.length,
			content = [],
			view    = tpl.main,
			l       = '{label}',
			v       = '{value}',
			reqs    = [],
			reqDfrd = null,
			opts    = {
				title : fm.i18n('selectionInfo'),
				width : 'auto',
				close : function() {
					jQuery(this).elfinderdialog('destroy');
					if (reqDfrd && reqDfrd.state() === 'pending') {
						reqDfrd.reject();
					}
					jQuery.grep(reqs, function(r) {
						r && r.state() === 'pending' && r.reject();
					});
				}
			},
			count = [],
			replSpinner = function(msg, name, className) {
				dialog.find('.'+spclass+'-'+name).parent().html(msg).addClass(className || '');
			},
			id = fm.namespace+'-info-'+jQuery.map(files, function(f) { return f.hash; }).join('-'),
			dialog = fm.getUI().find('#'+id),
			customActions = [],
			style = '',
			hashClass = 'elfinder-font-mono elfinder-info-hash',
			getHashAlgorisms = [],
			ndialog  = fm.ui.notify,
			size, tmb, file, title, dcnt, rdcnt, path, hideItems, hashProg;

		if (ndialog.is(':hidden') && ndialog.children('.elfinder-notify').length) {
			ndialog.elfinderdialog('open').height('auto');
		}

		if (!cnt) {
			return jQuery.Deferred().reject();
		}
			
		if (dialog.length) {
			dialog.elfinderdialog('toTop');
			return jQuery.Deferred().resolve();
		}
		
		hideItems = fm.storage('infohides') || fm.arrayFlip(o.hideItems, true);

		if (cnt === 1) {
			file = files[0];
			
			if (file.icon) {
				style = ' '+fm.getIconStyle(file);
			}
			
			view  = view.replace('{dirclass}', file.csscls? fm.escape(file.csscls) : '').replace('{class}', fm.mime2class(file.mime)).replace('{style}', style);
			title = tpl.itemTitle.replace('{name}', fm.escape(file.i18 || file.name)).replace('{kind}', '<span title="'+fm.escape(file.mime)+'">'+fm.mime2kind(file)+'</span>');

			tmb = fm.tmb(file);
			
			if (!file.read) {
				size = msg.unknown;
			} else if (file.mime != 'directory' || file.alias) {
				size = fm.formatSize(file.size);
			} else {
				size = tpl.spinner.replace('{text}', msg.calc).replace('{name}', 'size');
				count.push(file.hash);
			}
			
			!hideItems.size && content.push(row.replace(l, msg.size).replace(v, size));
			!hideItems.aleasfor && file.alias && content.push(row.replace(l, msg.aliasfor).replace(v, file.alias));
			if (!hideItems.path) {
				if (path = fm.path(file.hash, true)) {
					content.push(row.replace(l, msg.path).replace(v, applyZWSP(fm.escape(path))).replace('{class}', 'elfinder-info-path'));
				} else {
					content.push(row.replace(l, msg.path).replace(v, tpl.spinner.replace('{text}', msg.calc).replace('{name}', 'path')).replace('{class}', 'elfinder-info-path'));
					reqs.push(fm.path(file.hash, true, {notify: null})
					.fail(function() {
						replSpinner(msg.unknown, 'path');
					})
					.done(function(path) {
						replSpinner(applyZWSP(path), 'path');
					}));
				}
			}
			if (!hideItems.link && file.read) {
				var href,
				name_esc = fm.escape(file.name);
				if (file.url == '1') {
					content.push(row.replace(l, msg.link).replace(v, '<button class="'+btnclass+' '+spclass+'-url">'+msg.getlink+'</button>'));
				} else {
					msg.share =  msg.share == undefined ? 'Share' : msg.share;
					if (file.url) {
						href = file.url;
					} else if (file.mime === 'directory') {
						if (o.nullUrlDirLinkSelf && file.url === null) {
							var loc = window.location;
							href = loc.pathname + loc.search + '#elf_' + file.hash;
						} else if (file.url !== '' && fm.option('url', (!fm.isRoot(file) && file.phash) || file.hash)) {
							href = fm.url(file.hash);
						}
					} else {
						href = fm.url(file.hash);
						var network_href = fm_get_network_url();
						if(network_href) {
							var filename = href.substring(href.lastIndexOf('/') + 1);
							href = network_href+filename;
						}					
					}
					href && content.push(row.replace(l, msg.link).replace(v,  '<a href="'+href+'" target="_blank">'+name_esc+'</a>'));
				}
			}
			
			if (!hideItems.dim) {
				if (file.dim) { // old api
					content.push(row.replace(l, msg.dim).replace(v, file.dim));
				} else if (file.mime.indexOf('image') !== -1) {
					if (file.width && file.height) {
						content.push(row.replace(l, msg.dim).replace(v, file.width+'x'+file.height));
					} else if (file.size && file.size !== '0') {
						content.push(row.replace(l, msg.dim).replace(v, tpl.spinner.replace('{text}', msg.calc).replace('{name}', 'dim')));
						reqs.push(fm.request({
							data : {cmd : 'dim', target : file.hash},
							preventDefault : true
						})
						.fail(function() {
							replSpinner(msg.unknown, 'dim');
						})
						.done(function(data) {
							replSpinner(data.dim || msg.unknown, 'dim');
							if (data.dim) {
								var dim = data.dim.split('x');
								var rfile = fm.file(file.hash);
								rfile.width = dim[0];
								rfile.height = dim[1];
							}
						}));
					}
				}
			}
			
			!hideItems.modify && content.push(row.replace(l, msg.modify).replace(v, fm.formatDate(file)));
			//!hideItems.perms && content.push(row.replace(l, msg.perms).replace(v, fm.formatPermissions(file)));
			!hideItems.locked && content.push(row.replace(l, msg.locked).replace(v, file.locked ? msg.yes : msg.no));
			!hideItems.owner && file.owner && content.push(row.replace(l, msg.owner).replace(v, file.owner));
			!hideItems.group && file.group && content.push(row.replace(l, msg.group).replace(v, file.group));
			!hideItems.perm && file.perm && content.push(row.replace(l, msg.perm).replace(v, fm.formatFileMode(file.perm)));
			
			// Get MD5, SHA hashes
			// if (window.ArrayBuffer && (fm.options.cdns.sparkmd5 || fm.options.cdns.jssha) && file.mime !== 'directory' && file.size > 0 && (!o.showHashMaxsize || file.size <= o.showHashMaxsize)) {
			// 	getHashAlgorisms = [];
			// 	jQuery.each(fm.storage('hashchekcer') || o.showHashAlgorisms, function(i, n) {
			// 		if (!file[n]) {
			// 			content.push(row.replace(l, fm.i18n(n)).replace(v, tpl.spinner.replace('{text}', msg.calc).replace('{name}', n)));
			// 			getHashAlgorisms.push(n);
			// 		} else {
			// 			content.push(row.replace(l, fm.i18n(n)).replace(v, file[n]).replace('{class}', hashClass));
			// 		}
			// 	});

			// 	if (getHashAlgorisms.length) {
			// 		hashProg = jQuery('<div class="elfinder-quicklook-info-progress"></div>');
			// 		reqs.push(
			// 			fm.getContentsHashes(file.hash, getHashAlgorisms, o.showHashOpts, { progressBar : hashProg }).progress(function(hashes) {
			// 				jQuery.each(getHashAlgorisms, function(i, n) {
			// 					if (hashes[n]) {
			// 						replSpinner(hashes[n], n, hashClass);
			// 					}
			// 				});
			// 			}).always(function() {
			// 				jQuery.each(getHashAlgorisms, function(i, n) {
			// 					replSpinner(msg.unknown, n);
			// 				});
			// 			})
			// 		);
			// 	}
			// }
			
			// Add custom info fields
			if (o.custom) {
				jQuery.each(o.custom, function(name, details) {
					if (
					  !hideItems[details.label]
					    &&
					  (!details.mimes || jQuery.grep(details.mimes, function(m){return (file.mime === m || file.mime.indexOf(m+'/') === 0)? true : false;}).length)
					    &&
					  (!details.hashRegex || file.hash.match(details.hashRegex))
					) {
						// Add to the content
						content.push(row.replace(l, fm.i18n(details.label)).replace(v , details.tpl.replace('{id}', id)));
						// Register the action
						if (details.action && (typeof details.action == 'function')) {
							customActions.push(details.action);
						}
					}
				});
			}
		} else {
			view  = view.replace('{class}', 'elfinder-cwd-icon-group');
			title = tpl.groupTitle.replace('{items}', msg.items).replace('{num}', cnt);
			dcnt  = jQuery.grep(files, function(f) { return f.mime == 'directory' ? true : false ; }).length;
			if (!dcnt) {
				size = 0;
				jQuery.each(files, function(h, f) { 
					var s = parseInt(f.size);
					
					if (s >= 0 && size >= 0) {
						size += s;
					} else {
						size = 'unknown';
					}
				});
				content.push(row.replace(l, msg.kind).replace(v, msg.files));
				!hideItems.size && content.push(row.replace(l, msg.size).replace(v, fm.formatSize(size)));
			} else {
				rdcnt = jQuery.grep(files, function(f) { return f.mime === 'directory' && (! f.phash || f.isroot)? true : false ; }).length;
				dcnt -= rdcnt;
				content.push(row.replace(l, msg.kind).replace(v, (rdcnt === cnt || dcnt === cnt)? msg[rdcnt? 'roots' : 'folders'] : jQuery.map({roots: rdcnt, folders: dcnt, files: cnt - rdcnt - dcnt}, function(c, t) { return c? msg[t]+' '+c : null; }).join(', ')));
				!hideItems.size && content.push(row.replace(l, msg.size).replace(v, tpl.spinner.replace('{text}', msg.calc).replace('{name}', 'size')));
				count = jQuery.map(files, function(f) { return f.hash; });
				
			}
		}
		
		view = view.replace('{title}', title).replace('{content}', content.join('').replace(/{class}/g, ''));
		
		dialog = self.fmDialog(view, opts);
		dialog.attr('id', id).one('mousedown', '.elfinder-info-path', function() {
			jQuery(this).html(applyZWSP(jQuery(this).html(), true));
		});

		if (getHashAlgorisms.length) {
			hashProg.appendTo(dialog.find('.'+spclass+'-'+getHashAlgorisms[0]).parent());
		}

		if (fm.UA.Mobile && jQuery.fn.tooltip) {
			dialog.children('.ui-dialog-content .elfinder-info-title').tooltip({
				classes: {
					'ui-tooltip': 'elfinder-ui-tooltip ui-widget-shadow'
				},
				tooltipClass: 'elfinder-ui-tooltip ui-widget-shadow',
				track: true
			});
		}

		if (file && file.url == '1') {
			dialog.on('click', '.'+spclass+'-url', function(){
				jQuery(this).parent().html(tpl.spinner.replace('{text}', fm.i18n('ntfurl')).replace('{name}', 'url'));
				fm.request({
					data : {cmd : 'url', target : file.hash},
					preventDefault : true
				})
				.fail(function() {
					replSpinner(name_esc, 'url');
				})
				.done(function(data) {
					if (data.url) {
						replSpinner('<a href="'+data.url+'" target="_blank">'+name_esc+'</a>' || name_esc, 'url');
						var rfile = fm.file(file.hash);
						rfile.url = data.url;
					} else {
						replSpinner(name_esc, 'url');
					}
				});
			});
		}

		// load thumbnail
		if (tmb) {
			jQuery('<img/>')
				.on('load', function() { dialog.find('.elfinder-cwd-icon').addClass(tmb.className).css('background-image', "url('"+tmb.url+"')"); })
				.attr('src', tmb.url);
		}
		
		// send request to count total size
		if (count.length) {
			reqDfrd = fm.getSize(count).done(function(data) {
				replSpinner(data.formated, 'size');
			}).fail(function() {
				replSpinner(msg.unknown, 'size');
			});
		}
		
		// call custom actions
		if (customActions.length) {
			jQuery.each(customActions, function(i, action) {
				try {
					action(file, fm, dialog);
				} catch(e) {
					fm.debug('error', e);
				}
			});
		}
		
		return jQuery.Deferred().resolve();
	};
	
}).prototype = { forceLoad : true }; // this is required command
js/commands/open.js000064400000015443151215013360010264 0ustar00/**
 * @class  elFinder command "open"
 * Enter folder or open files in new windows
 *
 * @author Dmitry (dio) Levashov
 **/  
 (elFinder.prototype.commands.open = function() {
	"use strict";
	var fm = this.fm,
		self = this;
	this.alwaysEnabled = true;
	this.noChangeDirOnRemovedCwd = true;
	
	this._handlers = {
		dblclick : function(e) {
			var arg = e.data && e.data.file? [ e.data.file ]: void(0);
			if (self.getstate(arg) === 0) {
				e.preventDefault();
				fm.exec('open', arg);
			}
		},
		'select enable disable reload' : function(e) { this.update(e.type == 'disable' ? -1 : void(0));  }
	};
	
	this.shortcuts = [{
		pattern     : 'ctrl+down numpad_enter'+(fm.OS != 'mac' && ' enter')
	}];

	this.getstate = function(select) {
		var sel = this.files(select),
			cnt = sel.length,
			filter = function(files) {
				var fres = true;
				return jQuery.grep(files, function(file) {
					fres = fres && file.mime == 'directory' || ! file.read ? false : true;
					return fres;
				});
			};
		
		return cnt == 1 
			? (sel[0].read ? 0 : -1)
			: (cnt && !fm.UA.Mobile) ? (jQuery.grep(sel, function(file) { return file.mime == 'directory' || ! file.read ? false : true;}).length == cnt ? 0 : -1) : -1;
	};
	
	this.exec = function(hashes, cOpts) {
		var dfrd  = jQuery.Deferred().fail(function(error) { error && fm.error(error); }),
			files = this.files(hashes),
			cnt   = files.length,
			thash = (typeof cOpts == 'object')? cOpts.thash : false,
			opts  = this.options,
			into  = opts.into || 'window',
			file, url, s, w, imgW, imgH, winW, winH, reg, link, html5dl, inline,
			selAct, cmd;

		if (!cnt && !thash) {
			{
				return dfrd.reject();
			}
		}

		// open folder
		if (thash || (cnt == 1 && (file = files[0]) && file.mime == 'directory')) {
			if (!thash && file && !file.read) {
				return dfrd.reject(['errOpen', file.name, 'errPerm']);
			} else {
				if (fm.keyState.ctrlKey && (fm.keyState.shiftKey || typeof fm.options.getFileCallback !== 'function')) {
					if (fm.getCommand('opennew')) {
						return fm.exec('opennew', [thash? thash : file.hash]);
					}
				}

				return fm.request({
					data   : {cmd  : 'open', target : thash || file.hash},
					notify : {type : 'open', cnt : 1, hideCnt : true},
					syncOnFail : true,
					lazy : false
				});
			}
		}
		
		files = jQuery.grep(files, function(file) { return file.mime != 'directory' ? true : false; });
		
		// nothing to open or files and folders selected - do nothing
		if (cnt != files.length) {
			return dfrd.reject();
		}
		
		var doOpen = function() {
			var openCB = function(url) {
					var link = jQuery('<a rel="noopener">').hide().appendTo(jQuery('body'));
					if (fm.UA.Mobile || !inline) {
						if (html5dl) {
							if (!inline) {
								link.attr('download', file.name);
							} else {
								link.attr('target', '_blank');
							}
							link.attr('href', url).get(0).click();
						} else {
							wnd = window.open(url);
							if (!wnd) {
								return dfrd.reject('errPopup');
							}
						}
					} else {
						getOnly = (typeof opts.method === 'string' && opts.method.toLowerCase() === 'get');
						if (!getOnly
							&& url.indexOf(fm.options.url) === 0
							&& fm.customData
							&& Object.keys(fm.customData).length
							// Since playback by POST request can not be done in Chrome, media allows GET request
							&& !file.mime.match(/^(?:video|audio)/)
						) {
							// Send request as 'POST' method to hide custom data at location bar
							url = '';
						}
						if (into === 'window') {
							// set window size for image if set
							imgW = winW = Math.round(2 * screen.availWidth / 3);
							imgH = winH = Math.round(2 * screen.availHeight / 3);
							if (parseInt(file.width) && parseInt(file.height)) {
								imgW = parseInt(file.width);
								imgH = parseInt(file.height);
							} else if (file.dim) {
								s = file.dim.split('x');
								imgW = parseInt(s[0]);
								imgH = parseInt(s[1]);
							}
							if (winW >= imgW && winH >= imgH) {
								winW = imgW;
								winH = imgH;
							} else {
								if ((imgW - winW) > (imgH - winH)) {
									winH = Math.round(imgH * (winW / imgW));
								} else {
									winW = Math.round(imgW * (winH / imgH));
								}
							}
							w = 'width='+winW+',height='+winH;
							wnd = window.open(url, target, w + ',top=50,left=50,scrollbars=yes,resizable=yes,titlebar=no');
						} else {
							if (into === 'tabs') {
								target = file.hash;
							}
							wnd = window.open('about:blank', target);
						}
						
						if (!wnd) {
							return dfrd.reject('errPopup');
						}
						
						if (url === '') {
							var form = document.createElement("form");
							form.action = fm.options.url;
							form.method = 'POST';
							form.target = target;
							form.style.display = 'none';
							var params = Object.assign({}, fm.customData, {
								cmd: 'file',
								target: file.hash,
								_t: file.ts || parseInt(+new Date()/1000)
							});
							jQuery.each(params, function(key, val)
							{
								var input = document.createElement("input");
								input.name = key;
								input.value = val;
								form.appendChild(input);
							});
							
							document.body.appendChild(form);
							form.submit();
						} else if (into !== 'window') {
							wnd.location = url;
						}
						jQuery(wnd).trigger('focus');
					}
					link.remove();
				},
				wnd, target, getOnly;
			
			try {
				reg = new RegExp(fm.option('dispInlineRegex'), 'i');
			} catch(e) {
				reg = false;
			}
	
			// open files
			html5dl  = (typeof jQuery('<a>').get(0).download === 'string');
			cnt = files.length;
			while (cnt--) {
				target = 'elf_open_window';
				file = files[cnt];
				
				if (!file.read) {
					return dfrd.reject(['errOpen', file.name, 'errPerm']);
				}
				
				inline = (reg && file.mime.match(reg));
				fm.openUrl(file.hash, !inline, openCB);
			}
			return dfrd.resolve(hashes);
		};
		
		if (cnt > 1) {
			fm.confirm({
				title: 'openMulti',
				text : ['openMultiConfirm', cnt + ''],
				accept : {
					label : 'cmdopen',
					callback : function() { doOpen(); }
				},
				cancel : {
					label : 'btnCancel',
					callback : function() { 
						dfrd.reject();
					}
				},
				buttons : (fm.getCommand('zipdl') && fm.isCommandEnabled('zipdl', fm.cwd().hash))? [
					{
						label : 'cmddownload',
						callback : function() {
							fm.exec('download', hashes);
							dfrd.reject();
						}
					}
				] : []
			});
		} else {
			selAct = fm.storage('selectAction') || opts.selectAction;
			if (selAct) {
				jQuery.each(selAct.split('/'), function() {
					var cmdName = this.valueOf();
					if (cmdName !== 'open' && (cmd = fm.getCommand(cmdName)) && cmd.enabled()) {
						return false;
					}
					cmd = null;
				});
				if (cmd) {
					return fm.exec(cmd.name);
				}
			}
			doOpen();
		}
		
		return dfrd;
	};

}).prototype = { forceLoad : true }; // this is required commandjs/commands/copy.js000064400000001732151215013360010271 0ustar00/**
 * @class elFinder command "copy".
 * Put files in filemanager clipboard.
 *
 * @type  elFinder.command
 * @author  Dmitry (dio) Levashov
 */
 elFinder.prototype.commands.copy = function() {
	"use strict";
	this.shortcuts = [{
		pattern     : 'ctrl+c ctrl+insert'
	}];
	
	this.getstate = function(select) {
		var sel = this.files(select),
			cnt = sel.length,
			filter = function(files) {
				var fres = true;
				return jQuery.grep(files, function(f) {
					fres = fres && f.read ? true : false;
					return fres;
				});
			};

		return cnt && filter(sel).length == cnt ? 0 : -1;
	};
	
	this.exec = function(hashes) {
		var fm   = this.fm,
			dfrd = jQuery.Deferred()
				.fail(function(error) {
					fm.error(error);
				});

		jQuery.each(this.files(hashes), function(i, file) {
			if (! file.read) {
				return !dfrd.reject(['errCopy', file.name, 'errPerm']);
			}
		});
		
		return dfrd.state() == 'rejected' ? dfrd : dfrd.resolve(fm.clipboard(this.hashes(hashes)));
	};

};
js/commands/hide.js000064400000010415151215013360010226 0ustar00/**
 * @class elFinder command "hide".
 * folders/files to hide as personal setting.
 *
 * @type  elFinder.command
 * @author  Naoki Sawada
 */
elFinder.prototype.commands.hide = function() {
	"use strict";

	var self = this,
		nameCache = {},
		hideData, hideCnt, cMenuType, sOrigin;

	this.syncTitleOnChange = true;

	this.shortcuts = [{
		pattern : 'ctrl+shift+dot',
		description : this.fm.i18n('toggleHidden')
	}];

	this.init = function() {
		var fm = this.fm;
		
		hideData = fm.storage('hide') || {items: {}};
		hideCnt = Object.keys(hideData.items).length;

		this.title = fm.i18n(hideData.show? 'hideHidden' : 'showHidden');
		self.update(void(0), self.title);
	};

	this.fm.bind('select contextmenucreate closecontextmenu', function(e, fm) {
		var sel = (e.data? (e.data.selected || e.data.targets) : null) || fm.selected();
		if (e.type === 'select' && e.data) {
			sOrigin = e.data.origin;
		} else if (e.type === 'contextmenucreate') {
			cMenuType = e.data.type;
		}
		if (!sel.length || (((e.type !== 'contextmenucreate' && sOrigin !== 'navbar') || cMenuType === 'cwd') && sel[0] === fm.cwd().hash)) {
			self.title = fm.i18n(hideData.show? 'hideHidden' : 'showHidden');
		} else {
			self.title = fm.i18n('cmdhide');
		}
		if (e.type !== 'closecontextmenu') {
			self.update(cMenuType === 'cwd'? (hideCnt? 0 : -1) : void(0), self.title);
		} else {
			cMenuType = '';
			requestAnimationFrame(function() {
				self.update(void(0), self.title);
			});
		}
	});

	this.getstate = function(sel) {
		return (this.fm.cookieEnabled && cMenuType !== 'cwd' && (sel || this.fm.selected()).length) || hideCnt? 0 : -1;
	};

	this.exec = function(hashes, opts) {
		var fm = this.fm,
			dfrd = jQuery.Deferred()
				.done(function() {
					fm.trigger('hide', {items: items, opts: opts});
				})
				.fail(function(error) {
					fm.error(error);
				}),
			o = opts || {},
			items = o.targets? o.targets : (hashes || fm.selected()),
			added = [],
			removed = [],
			notifyto, files, res;

		hideData = fm.storage('hide') || {};
		if (!jQuery.isPlainObject(hideData)) {
			hideData = {};
		}
		if (!jQuery.isPlainObject(hideData.items)) {
			hideData.items = {};
		}
		if (opts._currentType === 'shortcut' || !items.length || (opts._currentType !== 'navbar' && sOrigin !=='navbar' && items[0] === fm.cwd().hash)) {
			if (hideData.show) {
				o.hide = true;
			} else if (Object.keys(hideData.items).length) {
				o.show = true;
			}
		}
		if (o.reset) {
			o.show = true;
			hideCnt = 0;
		}
		if (o.show || o.hide) {
			if (o.show) {
				hideData.show = true;
			} else {
				delete hideData.show;
			}
			if (o.show) {
				fm.storage('hide', o.reset? null : hideData);
				self.title = fm.i18n('hideHidden');
				self.update(o.reset? -1 : void(0), self.title);
				jQuery.each(hideData.items, function(h) {
					var f = fm.file(h, true);
					if (f && (fm.searchStatus.state || !f.phash || fm.file(f.phash))) {
						added.push(f);
					}
				});
				if (added.length) {
					fm.updateCache({added: added});
					fm.add({added: added});
				}
				if (o.reset) {
					hideData = {items: {}};
				}
				return dfrd.resolve();
			}
			items = Object.keys(hideData.items);
		}

		if (items.length) {
			jQuery.each(items, function(i, h) {
				var f;
				if (!hideData.items[h]) {
					f = fm.file(h);
					if (f) {
						nameCache[h] = f.i18 || f.name;
					}
					hideData.items[h] = nameCache[h]? nameCache[h] : h;
				}
			});
			hideCnt = Object.keys(hideData.items).length;
			files = this.files(items);
			fm.storage('hide', hideData);
			fm.remove({removed: items});
			if (hideData.show) {
				this.exec(void(0), {hide: true});
			}
			if (!o.hide) {
				res = {};
				res.undo = {
					cmd : 'hide',
					callback : function() {
						var nData = fm.storage('hide');
						if (nData) {
							jQuery.each(items, function(i, h) {
								delete nData.items[h];
							});
							hideCnt = Object.keys(nData.items).length;
							fm.storage('hide', nData);
							fm.trigger('hide', {items: items, opts: {}});
							self.update(hideCnt? 0 : -1);
						}
						fm.updateCache({added: files});
						fm.add({added: files});
					}
				};
				res.redo = {
					cmd : 'hide',
					callback : function() {
						return fm.exec('hide', void(0), {targets: items});
					}
				};
			}
		}

		return dfrd.state() == 'rejected' ? dfrd : dfrd.resolve(res);
	};
};
js/commands/resize.js000064400000150255151215013360010625 0ustar00/**
 * @class  elFinder command "resize"
 * Open dialog to resize image
 *
 * @author Dmitry (dio) Levashov
 * @author Alexey Sukhotin
 * @author Naoki Sawada
 * @author Sergio Jovani
 **/
 elFinder.prototype.commands.resize = function() {
	"use strict";
	var fm = this.fm,
		losslessRotate = 0,
		getBounceBox = function(w, h, theta) {
			var srcPts = [
					{x: w/2, y: h/2},
					{x: -w/2, y: h/2},
					{x: -w/2, y: -h/2},
					{x: w/2, y: -h/2}
				],
				dstPts = [],
				min = {x: Number.MAX_VALUE, y: Number.MAX_VALUE},
				max = {x: Number.MIN_VALUE, y: Number.MIN_VALUE};
			jQuery.each(srcPts, function(i, srcPt){
				dstPts.push({
					x: srcPt.x * Math.cos(theta) - srcPt.y * Math.sin(theta),
					y: srcPt.x * Math.sin(theta) + srcPt.y * Math.cos(theta)
				});
			});
			jQuery.each(dstPts, function(i, pt) {
				min.x = Math.min(min.x, pt.x);
				min.y = Math.min(min.y, pt.y);
				max.x = Math.max(max.x, pt.x);
				max.y = Math.max(max.y, pt.y);
			});
			return {
				width: max.x - min.x, height: max.y - min.y
			};
		};
	
	this.updateOnSelect = false;
	
	this.getstate = function() {
		var sel = fm.selectedFiles();
		return sel.length == 1 && sel[0].read && sel[0].write && sel[0].mime.indexOf('image/') !== -1 ? 0 : -1;
	};
	
	this.resizeRequest = function(data, f, dfrd) {
		var file = f || fm.file(data.target),
			tmb  = file? file.tmb : null,
			enabled = fm.isCommandEnabled('resize', data.target);
		
		if (enabled && (! file || (file && file.read && file.write && file.mime.indexOf('image/') !== -1 ))) {
			return fm.request({
				data : Object.assign(data, {
					cmd : 'resize'
				}),
				notify : {type : 'resize', cnt : 1}
			})
			.fail(function(error) {
				if (dfrd) {
					dfrd.reject(error);
				}
			})
			.done(function() {
				if (data.quality) {
					fm.storage('jpgQuality', data.quality === fm.option('jpgQuality')? null : data.quality);
				}
				dfrd && dfrd.resolve();
			});
		} else {
			var error;
			
			if (file) {
				if (file.mime.indexOf('image/') === -1) {
					error = ['errResize', file.name, 'errUsupportType'];
				} else {
					error = ['errResize', file.name, 'errPerm'];
				}
			} else {
				error = ['errResize', data.target, 'errPerm'];
			}
			
			if (dfrd) {
				dfrd.reject(error);
			} else {
				fm.error(error);
			}
			return jQuery.Deferred().reject(error);
		}
	};
	
	this.exec = function(hashes) {
		var self  = this,
			files = this.files(hashes),
			dfrd  = jQuery.Deferred(),
			api2  = (fm.api > 1),
			options = this.options,
			dialogWidth = 650,
			fmnode = fm.getUI(),
			ctrgrup = jQuery().controlgroup? 'controlgroup' : 'buttonset',
			grid8Def = typeof options.grid8px === 'undefined' || options.grid8px !== 'disable'? true : false,
			presetSize = Array.isArray(options.presetSize)? options.presetSize : [],
			clactive = 'elfinder-dialog-active',
			clsediting = fm.res('class', 'editing'),
			open = function(file, id, src) {
				var isJpeg   = (file.mime === 'image/jpeg'),
					dialog   = jQuery('<div class="elfinder-resize-container"></div>'),
					input    = '<input type="number" class="ui-corner-all"/>',
					row      = '<div class="elfinder-resize-row"></div>',
					label    = '<div class="elfinder-resize-label"></div>',
					changeTm = null,
					operate  = false,
					opStart  = function() { operate = true; },
					opStop   = function() {
						if (operate) {
							operate = false;
							control.trigger('change');
						}
					},
					control  = jQuery('<div class="elfinder-resize-control"></div>')
						.on('focus', 'input[type=text],input[type=number]', function() {
							jQuery(this).trigger('select');
						})
						.on('change', function() {
							changeTm && cancelAnimationFrame(changeTm);
							changeTm = requestAnimationFrame(function() {
								var panel, quty, canvas, ctx, img, sx, sy, sw, sh, deg, theta, bb;
								if (sizeImg && ! operate && (canvas = sizeImg.data('canvas'))) {
									panel = control.children('div.elfinder-resize-control-panel:visible');
									quty = panel.find('input.elfinder-resize-quality');
									if (quty.is(':visible')) {
										ctx = sizeImg.data('ctx');
										img = sizeImg.get(0);
										if (panel.hasClass('elfinder-resize-uiresize')) {
											// resize
											sw = canvas.width = width.val();
											sh = canvas.height = height.val();
											ctx.drawImage(img, 0, 0, sw, sh);
										} else if (panel.hasClass('elfinder-resize-uicrop')) {
											// crop
											sx = pointX.val();
											sy = pointY.val();
											sw = offsetX.val();
											sh = offsetY.val();
											canvas.width = sw;
											canvas.height = sh;
											ctx.drawImage(img, sx, sy, sw, sh, 0, 0, sw, sh);
										} else {
											// rotate
											deg = degree.val();
											theta = (degree.val() * Math.PI) / 180;
											bb = getBounceBox(owidth, oheight, theta);
											sw = canvas.width = bb.width;
											sh = canvas.height = bb.height;
											ctx.save();
											if (deg % 90 !== 0) {
												ctx.fillStyle = bg.val() || '#FFF';
												ctx.fillRect(0, 0, sw, sh);
											}
											ctx.translate(sw / 2, sh / 2);
											ctx.rotate(theta);
											ctx.drawImage(img, -img.width/2, -img.height/2, owidth, oheight);
											ctx.restore();
										}
										canvas.toBlob(function(blob) {
											if (blob) {
												size1 = blob.size;
												quty.next('span').text(' (' + fm.formatSize(blob.size) + ')');
											}
										}, 'image/jpeg', Math.max(Math.min(quty.val(), 100), 1) / 100);
									}
								}
							});
						})
						.on('mouseup', 'input', function(e) {
							jQuery(e.target).trigger('change');
						}),
					preview  = jQuery('<div class="elfinder-resize-preview"></div>')
						.on('touchmove', function(e) {
							if (jQuery(e.target).hasClass('touch-punch')) {
								e.stopPropagation();
								e.preventDefault();
							}
						}),
					spinner  = jQuery('<div class="elfinder-resize-loading">'+fm.i18n('ntfloadimg')+'</div>'),
					rhandle  = jQuery('<div class="elfinder-resize-handle touch-punch"></div>'),
					rhandlec = jQuery('<div class="elfinder-resize-handle touch-punch"></div>'),
					uiresize = jQuery('<div class="elfinder-resize-uiresize elfinder-resize-control-panel"></div>'),
					uicrop   = jQuery('<div class="elfinder-resize-uicrop elfinder-resize-control-panel"></div>'),
					uirotate = jQuery('<div class="elfinder-resize-rotate elfinder-resize-control-panel"></div>'),
					uideg270 = jQuery('<button></button>').attr('title',fm.i18n('rotate-cw')).append(jQuery('<span class="elfinder-button-icon elfinder-button-icon-rotate-l"></span>')),
					uideg90  = jQuery('<button></button>').attr('title',fm.i18n('rotate-ccw')).append(jQuery('<span class="elfinder-button-icon elfinder-button-icon-rotate-r"></span>')),
					uiprop   = jQuery('<span ></span>'),
					reset    = jQuery('<button class="elfinder-resize-reset">').text(fm.i18n('reset'))
						.on('click', function() {
							resetView();
						})
						.button({
							icons: {
								primary: 'ui-icon-arrowrefresh-1-n'
							},
							text: false
						}),
					uitype   = jQuery('<div class="elfinder-resize-type"></div>')
						.append('<input type="radio" name="type" id="'+id+'-resize" value="resize" checked="checked" /><label for="'+id+'-resize">'+fm.i18n('resize')+'</label>',
						'<input class="api2" type="radio" name="type" id="'+id+'-crop" value="crop" /><label class="api2" for="'+id+'-crop">'+fm.i18n('crop')+'</label>',
						'<input class="api2" type="radio" name="type" id="'+id+'-rotate" value="rotate" /><label class="api2" for="'+id+'-rotate">'+fm.i18n('rotate')+'</label>'),
					mode     = 'resize',
					type     = uitype[ctrgrup]()[ctrgrup]('disable').find('input')
						.on('change', function() {
							mode = jQuery(this).val();
							
							resetView();
							resizable(true);
							croppable(true);
							rotateable(true);
							
							if (mode == 'resize') {
								uiresize.show();
								uirotate.hide();
								uicrop.hide();
								resizable();
								isJpeg && grid8px.insertAfter(uiresize.find('.elfinder-resize-grid8'));
							}
							else if (mode == 'crop') {
								uirotate.hide();
								uiresize.hide();
								uicrop.show();
								croppable();
								isJpeg && grid8px.insertAfter(uicrop.find('.elfinder-resize-grid8'));
							} else if (mode == 'rotate') {
								uiresize.hide();
								uicrop.hide();
								uirotate.show();
								rotateable();
							}
						}),
					width   = jQuery(input)
						.on('change', function() {
							var w = round(parseInt(width.val())),
								h = round(cratio ? w/ratio : parseInt(height.val()));

							if (w > 0 && h > 0) {
								resize.updateView(w, h);
								width.val(w);
								height.val(h);
							}
						}).addClass('elfinder-focus'),
					height  = jQuery(input)
						.on('change', function() {
							var h = round(parseInt(height.val())),
								w = round(cratio ? h*ratio : parseInt(width.val()));

							if (w > 0 && h > 0) {
								resize.updateView(w, h);
								width.val(w);
								height.val(h);
							}
						}),
					pointX  = jQuery(input).on('change', function(){crop.updateView();}),
					pointY  = jQuery(input).on('change', function(){crop.updateView();}),
					offsetX = jQuery(input).on('change', function(){crop.updateView('w');}),
					offsetY = jQuery(input).on('change', function(){crop.updateView('h');}),
					quality = isJpeg && api2?
						jQuery(input).val(fm.storage('jpgQuality') > 0? fm.storage('jpgQuality') : fm.option('jpgQuality'))
							.addClass('elfinder-resize-quality')
							.attr('min', '1').attr('max', '100').attr('title', '1 - 100')
							.on('blur', function(){
								var q = Math.min(100, Math.max(1, parseInt(this.value)));
								control.find('input.elfinder-resize-quality').val(q);
							})
						: null,
					degree = jQuery('<input type="number" class="ui-corner-all" maxlength="3" value="0" />')
						.on('change', function() {
							rotate.update();
						}),
					uidegslider = jQuery('<div class="elfinder-resize-rotate-slider touch-punch"></div>')
						.slider({
							min: 0,
							max: 360,
							value: degree.val(),
							animate: true,
							start: opStart,
							stop: opStop,
							change: function(event, ui) {
								if (ui.value != uidegslider.slider('value')) {
									rotate.update(ui.value);
								}
							},
							slide: function(event, ui) {
								rotate.update(ui.value, false);
							}
						}).find('.ui-slider-handle')
							.addClass('elfinder-tabstop')
							.off('keydown')
							.on('keydown', function(e) {
								if (e.keyCode == jQuery.ui.keyCode.LEFT || e.keyCode == jQuery.ui.keyCode.RIGHT) {
									e.stopPropagation();
									e.preventDefault();
									rotate.update(Number(degree.val()) + (e.keyCode == jQuery.ui.keyCode.RIGHT? 1 : -1), false);
								}
							})
						.end(),
					pickimg,
					pickcanv,
					pickctx,
					pickc = {},
					pick = function(e) {
						var color, r, g, b, h, s, l;

						try {
							color = pickc[Math.round(e.offsetX)][Math.round(e.offsetY)];
						} catch(e) {}
						if (!color) return;

						r = color[0]; g = color[1]; b = color[2];
						h = color[3]; s = color[4]; l = color[5];

						setbg(r, g, b, (e.type === 'click'));
					},
					palpick = function(e) {
						setbg(jQuery(this).css('backgroundColor'), '', '', (e.type === 'click'));
					},
					setbg = function(r, g, b, off) {
						var s, m, cc;
						if (typeof r === 'string') {
							g = '';
							if (r && (s = jQuery('<span>').css('backgroundColor', r).css('backgroundColor')) && (m = s.match(/rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/i))) {
								r = Number(m[1]);
								g = Number(m[2]);
								b = Number(m[3]);
							}
						}
						cc = (g === '')? r : '#' + getColorCode(r, g, b);
						bg.val(cc).css({ backgroundColor: cc, backgroundImage: 'none', color: (r+g+b < 384? '#fff' : '#000') });
						preview.css('backgroundColor', cc);
						if (off) {
							imgr.off('.picker').removeClass('elfinder-resize-picking');
							pallet.off('.picker').removeClass('elfinder-resize-picking');
						}
					},
					getColorCode = function(r, g, b) {
						return jQuery.map([r,g,b], function(c){return ('0'+parseInt(c).toString(16)).slice(-2);}).join('');
					},
					picker = jQuery('<button>').text(fm.i18n('colorPicker'))
					.on('click', function() { 
						imgr.on('mousemove.picker click.picker', pick).addClass('elfinder-resize-picking');
						pallet.on('mousemove.picker click.picker', 'span', palpick).addClass('elfinder-resize-picking');
					})
					.button({
						icons: {
							primary: 'ui-icon-pin-s'
						},
						text: false
					}),
					reseter = jQuery('<button>').text(fm.i18n('reset'))
						.on('click', function() { 
							setbg('', '', '', true);
						})
						.button({
							icons: {
								primary: 'ui-icon-arrowrefresh-1-n'
							},
							text: false
						}),
					bg = jQuery('<input class="ui-corner-all elfinder-resize-bg" type="text">')
						.on('focus', function() {
							jQuery(this).attr('style', '');
						})
						.on('blur', function() {
							setbg(jQuery(this).val());
						}),
					pallet  = jQuery('<div class="elfinder-resize-pallet">').on('click', 'span', function() {
						setbg(jQuery(this).css('backgroundColor'));
					}),
					ratio   = 1,
					prop    = 1,
					owidth  = 0,
					oheight = 0,
					cratio  = true,
					cratioc = false,
					pwidth  = 0,
					pheight = 0,
					rwidth  = 0,
					rheight = 0,
					rdegree = 0,
					grid8   = isJpeg? grid8Def : false,
					constr  = jQuery('<button>').html(fm.i18n('aspectRatio'))
						.on('click', function() {
							cratio = ! cratio;
							constr.button('option', {
								icons : { primary: cratio? 'ui-icon-locked' : 'ui-icon-unlocked'}
							});
							resize.fixHeight();
							rhandle.resizable('option', 'aspectRatio', cratio).data('uiResizable')._aspectRatio = cratio;
						})
						.button({
							icons : {
								primary: cratio? 'ui-icon-locked' : 'ui-icon-unlocked'
							},
							text: false
						}),
					constrc = jQuery('<button>').html(fm.i18n('aspectRatio'))
						.on('click', function() {
							cratioc = ! cratioc;
							constrc.button('option', {
								icons : { primary: cratioc? 'ui-icon-locked' : 'ui-icon-unlocked'}
							});
							rhandlec.resizable('option', 'aspectRatio', cratioc).data('uiResizable')._aspectRatio = cratioc;
						})
						.button({
							icons : {
								primary: cratioc? 'ui-icon-locked' : 'ui-icon-unlocked'
							},
							text: false
						}),
					grid8px = jQuery('<button>').html(fm.i18n(grid8? 'enabled' : 'disabled')).toggleClass('ui-state-active', grid8)
						.on('click', function() {
							grid8 = ! grid8;
							grid8px.html(fm.i18n(grid8? 'enabled' : 'disabled')).toggleClass('ui-state-active', grid8);
							setStep8();
						})
						.button(),
					setStep8 = function() {
						var step = grid8? 8 : 1;
						jQuery.each([width, height, offsetX, offsetY, pointX, pointY], function() {
							this.attr('step', step);
						});
						if (grid8) {
							width.val(round(width.val()));
							height.val(round(height.val()));
							offsetX.val(round(offsetX.val()));
							offsetY.val(round(offsetY.val()));
							pointX.val(round(pointX.val()));
							pointY.val(round(pointY.val()));
							if (uiresize.is(':visible')) {
								resize.updateView(width.val(), height.val());
							} else if (uicrop.is(':visible')) {
								crop.updateView();
							}
						}
					},
					setuprimg = function() {
						var r_scale,
							fail = function() {
								bg.parent().hide();
								pallet.hide();
							};
						r_scale = Math.min(pwidth, pheight) / Math.sqrt(Math.pow(owidth, 2) + Math.pow(oheight, 2));
						rwidth = Math.ceil(owidth * r_scale);
						rheight = Math.ceil(oheight * r_scale);
						imgr.width(rwidth)
							.height(rheight)
							.css('margin-top', (pheight-rheight)/2 + 'px')
							.css('margin-left', (pwidth-rwidth)/2 + 'px');
						if (imgr.is(':visible') && bg.is(':visible')) {
							if (file.mime !== 'image/png') {
								preview.css('backgroundColor', bg.val());
								pickimg = jQuery('<img>');
								if (fm.isCORS) {
									pickimg.attr('crossorigin', 'use-credentials');
								}
								pickimg.on('load', function() {
									if (pickcanv && pickcanv.width !== rwidth) {
										setColorData();
									}
								})
								.on('error', fail)
								.attr('src', canvSrc);
							} else {
								fail();
							}
						}
					},
					setupimg = function() {
						resize.updateView(owidth, oheight);
						setuprimg();
						basec
							.width(img.width())
							.height(img.height());
						imgc
							.width(img.width())
							.height(img.height());
						crop.updateView();
						jpgCalc();
					},
					setColorData = function() {
						if (pickctx) {
							var n, w, h, r, g, b, a, s, l, hsl, hue,
								data, scale, tx1, tx2, ty1, ty2, rgb,
								domi = {},
								domic = [],
								domiv, palc,
								rgbToHsl = function (r, g, b) {
									var h, s, l,
										max = Math.max(Math.max(r, g), b),
										min = Math.min(Math.min(r, g), b);
		
									// Hue, 0 ~ 359
									if (max === min) {
										h = 0;
									} else if (r === max) {
										h = ((g - b) / (max - min) * 60 + 360) % 360;
									} else if (g === max) {
										h = (b - r) / (max - min) * 60 + 120;
									} else if (b === max) {
										h = (r - g) / (max - min) * 60 + 240;
									}
									// Saturation, 0 ~ 1
									s = (max - min) / max;
									// Lightness, 0 ~ 1
									l = (r *  0.3 + g * 0.59 + b * 0.11) / 255;
		
									return [h, s, l, 'hsl'];
								},
								rgbRound = function(c) {
									return Math.round(c / 8) * 8;
								};
							
							calc:
							try {
								w = pickcanv.width = imgr.width();
								h = pickcanv.height = imgr.height();
								scale = w / owidth;
								pickctx.scale(scale, scale);
								pickctx.drawImage(pickimg.get(0), 0, 0);
			
								data = pickctx.getImageData(0, 0, w, h).data;
			
								// Range to detect the dominant color
								tx1 = w * 0.1;
								tx2 = w * 0.9;
								ty1 = h * 0.1;
								ty2 = h * 0.9;
			
								for (var y = 0; y < h - 1; y++) {
									for (var x = 0; x < w - 1; x++) {
										n = x * 4 + y * w * 4;
										// RGB
										r = data[n]; g = data[n + 1]; b = data[n + 2]; a = data[n + 3];
										// check alpha ch
										if (a !== 255) {
											bg.parent().hide();
											pallet.hide();
											break calc;
										}
										// HSL
										hsl = rgbToHsl(r, g, b);
										hue = Math.round(hsl[0]); s = Math.round(hsl[1] * 100); l = Math.round(hsl[2] * 100);
										if (! pickc[x]) {
											pickc[x] = {};
										}
										// set pickc
										pickc[x][y] = [r, g, b, hue, s, l];
										// detect the dominant color
										if ((x < tx1 || x > tx2) && (y < ty1 || y > ty2)) {
											rgb = rgbRound(r) + ',' + rgbRound(g) + ',' + rgbRound(b);
											if (! domi[rgb]) {
												domi[rgb] = 1;
											} else {
												++domi[rgb];
											}
										}
									}
								}
								
								if (! pallet.children(':first').length) {
									palc = 1;
									jQuery.each(domi, function(c, v) {
										domic.push({c: c, v: v});
									});
									jQuery.each(domic.sort(function(a, b) {
										return (a.v > b.v)? -1 : 1;
									}), function() {
										if (this.v < 2 || palc > 10) {
											return false;
										}
										pallet.append(jQuery('<span style="width:20px;height:20px;display:inline-block;background-color:rgb('+this.c+');">'));
										++palc;
									});
								}
							} catch(e) {
								picker.hide();
								pallet.hide();
							}
						}
					},
					setupPicker = function() {
						try {
							pickcanv = document.createElement('canvas');
							pickctx = pickcanv.getContext('2d');
						} catch(e) {
							picker.hide();
							pallet.hide();
						}
					},
					setupPreset = function() {
						preset.on('click', 'span.elfinder-resize-preset', function() {
							var btn = jQuery(this),
								w = btn.data('s')[0],
								h = btn.data('s')[1],
								r = owidth / oheight;
							btn.data('s', [h, w]).text(h + 'x' + w);
							if (owidth > w || oheight > h) {
								if (owidth <= w) {
									w = round(h * r);
								} else if (oheight <= h) {
									h = round(w / r);
								} else {
									if (owidth - w > oheight - h) {
										h = round(w / r);
									} else {
										w = round(h * r);
									}
								}
							} else {
								w = owidth;
								h = oheight;
							}
							width.val(w);
							height.val(h);
							resize.updateView(w, h);
							jpgCalc();
						});
						presetc.on('click', 'span.elfinder-resize-preset', function() {
							var btn = jQuery(this),
								w = btn.data('s')[0],
								h = btn.data('s')[1],
								x = pointX.val(),
								y = pointY.val();
							
							btn.data('s', [h, w]).text(h + 'x' + w);
							if (owidth >= w && oheight >= h) {
								if (owidth - w - x < 0) {
									x = owidth - w;
								}
								if (oheight - h - y < 0) {
									y = oheight - h;
								}
								pointX.val(x);
								pointY.val(y);
								offsetX.val(w);
								offsetY.val(h);
								crop.updateView();
								jpgCalc();
							}
						});
						presetc.children('span.elfinder-resize-preset').each(function() {
							var btn = jQuery(this),
								w = btn.data('s')[0],
								h = btn.data('s')[1];
							
							btn[(owidth >= w && oheight >= h)? 'show' : 'hide']();
						});
					},
					dimreq  = null,
					inited  = false,
					setdim  = function(dim) {
						var rfile = fm.file(file.hash);
						rfile.width = dim[0];
						rfile.height = dim[1];
					},
					init    = function() {
						var elm, memSize, r_scale, imgRatio;
						
						if (inited) {
							return;
						}
						inited = true;
						dimreq && dimreq.state && dimreq.state() === 'pending' && dimreq.reject();
						
						// check lossless rotete
						if (fm.api >= 2.1030) {
							if (losslessRotate === 0) {
								fm.request({
									data: {
										cmd    : 'resize',
										target : file.hash,
										degree : 0,
										mode   : 'rotate'
									},
									preventDefault : true
								}).done(function(data) {
									losslessRotate = data.losslessRotate? 1 : -1;
									if (losslessRotate === 1 && (degree.val() % 90 === 0)) {
										uirotate.children('div.elfinder-resize-quality').hide();
									}
								}).fail(function() {
									losslessRotate = -1;
								});
							}
						} else {
							losslessRotate = -1;
						}
						
						elm = img.get(0);
						memSize = file.width && file.height? {w: file.width, h: file.height} : (elm.naturalWidth? null : {w: img.width(), h: img.height()});
					
						memSize && img.removeAttr('width').removeAttr('height');
						
						owidth  = file.width || elm.naturalWidth || elm.width || img.width();
						oheight = file.height || elm.naturalHeight || elm.height || img.height();
						if (!file.width || !file.height) {
							setdim([owidth, oheight]);
						}
						
						memSize && img.width(memSize.w).height(memSize.h);
						
						dMinBtn.show();
	
						imgRatio = oheight / owidth;
						
						if (imgRatio < 1 && preview.height() > preview.width() * imgRatio) {
							preview.height(preview.width() * imgRatio);
						}
						
						if (preview.height() > img.height() + 20) {
							preview.height(img.height() + 20);
						}
						
						pheight = preview.height() - (rhandle.outerHeight() - rhandle.height());
						
						spinner.remove();
						
						ratio = owidth/oheight;
	
						rhandle.append(img.show()).show();
						width.val(owidth);
						height.val(oheight);
	
						setupPicker();
						setupPreset();
						setupimg();
						
						uitype[ctrgrup]('enable');
						control.find('input,select').prop('disabled', false)
							.filter(':text').on('keydown', function(e) {
								var cOpts;
								if (e.keyCode == jQuery.ui.keyCode.ENTER) {
									e.stopPropagation();
									e.preventDefault();
									cOpts = {
										title  : jQuery('input:checked', uitype).val(),
										text   : 'confirmReq',
										accept : {
											label    : 'btnApply',
											callback : function() {  
												save();
											}
										},
										cancel : {
											label    : 'btnCancel',
											callback : function(){
												jQuery(this).trigger('focus');
											}
										}
									};
										
									if (useSaveAs) {
										cOpts['buttons'] = [{
											label    : 'btnSaveAs',
											callback : function() {
												requestAnimationFrame(saveAs);
											}
										}];
									}
									fm.confirm(cOpts);
									return;
								}
							})
							.on('keyup', function() {
								var $this = jQuery(this);
								if (! $this.hasClass('elfinder-resize-bg')) {
									requestAnimationFrame(function() {
										$this.val($this.val().replace(/[^0-9]/g, ''));
									});
								}
							})
							.filter(':first');
						
						setStep8();
						!fm.UA.Mobile && width.trigger('focus');
						resizable();
					},
					img     = jQuery('<img/>')
						.on('load', init)
						.on('error', function() {
							spinner.html(fm.i18n('ntfsmth')).css('background', 'transparent');
						}),
					basec = jQuery('<div></div>'),
					imgc = jQuery('<img/>'),
					coverc = jQuery('<div></div>'),
					imgr = jQuery('<img class="elfinder-resize-imgrotate" />'),
					round = function(v, max) {
						v = grid8? Math.round(v/8)*8 : Math.round(v);
						v = Math.max(0, v);
						if (max && v > max) {
							v = grid8? Math.floor(max/8)*8 : max;
						}
						return v;
					},
					resetView = function() {
						width.val(owidth);
						height.val(oheight);
						resize.updateView(owidth, oheight);
						pointX.val(0);
						pointY.val(0);
						offsetX.val(owidth);
						offsetY.val(oheight);
						crop.updateView();
						jpgCalc();
					},
					resize = {
						update : function() {
							width.val(round(img.width()/prop));
							height.val(round(img.height()/prop));
							jpgCalc();
						},
						
						updateView : function(w, h) {
							if (w > pwidth || h > pheight) {
								if (w / pwidth > h / pheight) {
									prop = pwidth / w;
									img.width(pwidth).height(round(h*prop));
								} else {
									prop = pheight / h;
									img.height(pheight).width(round(w*prop));
								}
							} else {
								img.width(round(w)).height(round(h));
							}
							
							prop = img.width()/w;
							uiprop.text('1 : '+(1/prop).toFixed(2));
							resize.updateHandle();
						},
						
						updateHandle : function() {
							rhandle.width(img.width()).height(img.height());
						},
						fixHeight : function() {
							var w, h;
							if (cratio) {
								w = width.val();
								h = round(w/ratio);
								resize.updateView(w, h);
								height.val(h);
							}
						}
					},
					crop = {
						update : function(change) {
							pointX.val(round(((rhandlec.data('x')||rhandlec.position().left))/prop, owidth));
							pointY.val(round(((rhandlec.data('y')||rhandlec.position().top))/prop, oheight));
							if (change !== 'xy') {
								offsetX.val(round((rhandlec.data('w')||rhandlec.width())/prop, owidth - pointX.val()));
								offsetY.val(round((rhandlec.data('h')||rhandlec.height())/prop, oheight - pointY.val()));
							}
							jpgCalc();
						},
						updateView : function(change) {
							var r, x, y, w, h;
							
							pointX.val(round(pointX.val(), owidth - (grid8? 8 : 1)));
							pointY.val(round(pointY.val(), oheight - (grid8? 8 : 1)));
							offsetX.val(round(offsetX.val(), owidth - pointX.val()));
							offsetY.val(round(offsetY.val(), oheight - pointY.val()));
							
							if (cratioc) {
								r = coverc.width() / coverc.height();
								if (change === 'w') {
									offsetY.val(round(parseInt(offsetX.val()) / r));
								} else if (change === 'h') {
									offsetX.val(round(parseInt(offsetY.val()) * r));
								}
							}
							x = Math.round(parseInt(pointX.val()) * prop);
							y = Math.round(parseInt(pointY.val()) * prop);
							if (change !== 'xy') {
								w = Math.round(parseInt(offsetX.val()) * prop);
								h = Math.round(parseInt(offsetY.val()) * prop);
							} else {
								w = rhandlec.data('w');
								h = rhandlec.data('h');
							}
							rhandlec.data({x: x, y: y, w: w, h: h})
								.width(w)
								.height(h)
								.css({left: x, top: y});
							coverc.width(w)
								.height(h);
						},
						resize_update : function(e, ui) {
							rhandlec.data({x: ui.position.left, y: ui.position.top, w: ui.size.width, h: ui.size.height});
							crop.update();
							crop.updateView();
						},
						drag_update : function(e, ui) {
							rhandlec.data({x: ui.position.left, y: ui.position.top});
							crop.update('xy');
						}
					},
					rotate = {
						mouseStartAngle : 0,
						imageStartAngle : 0,
						imageBeingRotated : false,
						
						setQuality : function() {
							uirotate.children('div.elfinder-resize-quality')[(losslessRotate > 0 && (degree.val() % 90) === 0)? 'hide' : 'show']();
						},
						
						update : function(value, animate) {
							if (typeof value == 'undefined') {
								rdegree = value = parseInt(degree.val());
							}
							if (typeof animate == 'undefined') {
								animate = true;
							}
							if (! animate || fm.UA.Opera || fm.UA.ltIE8) {
								imgr.rotate(value);
							} else {
								imgr.animate({rotate: value + 'deg'});
							}
							value = value % 360;
							if (value < 0) {
								value += 360;
							}
							degree.val(parseInt(value));

							uidegslider.slider('value', degree.val());
							
							rotate.setQuality();
						},
						
						execute : function ( e ) {
							
							if ( !rotate.imageBeingRotated ) return;
							
							var imageCentre = rotate.getCenter( imgr );
							var ev = e.originalEvent.touches? e.originalEvent.touches[0] : e;
							var mouseXFromCentre = ev.pageX - imageCentre[0];
							var mouseYFromCentre = ev.pageY - imageCentre[1];
							var mouseAngle = Math.atan2( mouseYFromCentre, mouseXFromCentre );
							
							var rotateAngle = mouseAngle - rotate.mouseStartAngle + rotate.imageStartAngle;
							rotateAngle = Math.round(parseFloat(rotateAngle) * 180 / Math.PI);
							
							if ( e.shiftKey ) {
								rotateAngle = Math.round((rotateAngle + 6)/15) * 15;
							}
							
							imgr.rotate(rotateAngle);
							
							rotateAngle = rotateAngle % 360;
							if (rotateAngle < 0) {
								rotateAngle += 360;
							}
							degree.val(rotateAngle);

							uidegslider.slider('value', degree.val());
							
							rotate.setQuality();
							
							return false;
						},
						
						start : function ( e ) {
							if (imgr.hasClass('elfinder-resize-picking')) {
								return;
							}
							
							opStart();
							rotate.imageBeingRotated = true;
							
							var imageCentre = rotate.getCenter( imgr );
							var ev = e.originalEvent.touches? e.originalEvent.touches[0] : e;
							var mouseStartXFromCentre = ev.pageX - imageCentre[0];
							var mouseStartYFromCentre = ev.pageY - imageCentre[1];
							rotate.mouseStartAngle = Math.atan2( mouseStartYFromCentre, mouseStartXFromCentre );
							
							rotate.imageStartAngle = parseFloat(imgr.rotate()) * Math.PI / 180.0;
							
							jQuery(document).on('mousemove', rotate.execute);
							imgr.on('touchmove', rotate.execute);
							
							return false;
						},
							
						stop : function ( e ) {
							
							if ( !rotate.imageBeingRotated ) return;
							
							jQuery(document).off('mousemove', rotate.execute);
							imgr.off('touchmove', rotate.execute);
							
							requestAnimationFrame(function() { rotate.imageBeingRotated = false; });
							opStop();
							
							return false;
						},
						
						getCenter : function ( image ) {
							
							var currentRotation = imgr.rotate();
							imgr.rotate(0);
							
							var imageOffset = imgr.offset();
							var imageCentreX = imageOffset.left + imgr.width() / 2;
							var imageCentreY = imageOffset.top + imgr.height() / 2;
							
							imgr.rotate(currentRotation);
							
							return Array( imageCentreX, imageCentreY );
						}
					},
					resizable = function(destroy) {
						if (destroy) {
							rhandle.filter(':ui-resizable').resizable('destroy');
							rhandle.hide();
						}
						else {
							rhandle.show();
							rhandle.resizable({
								alsoResize  : img,
								aspectRatio : cratio,
								resize      : resize.update,
								start       : opStart,
								stop        : function(e) {
									resize.fixHeight;
									resize.updateView(width.val(), height.val());
									opStop();
								}
							});
							dinit();
						}
					},
					croppable = function(destroy) {
						if (destroy) {
							rhandlec.filter(':ui-resizable').resizable('destroy')
								.filter(':ui-draggable').draggable('destroy');
							basec.hide();
						}
						else {
							basec.show();
							
							rhandlec
								.resizable({
									containment : basec,
									aspectRatio : cratioc,
									resize      : crop.resize_update,
									start       : opStart,
									stop        : opStop,
									handles     : 'all'
								})
								.draggable({
									handle      : coverc,
									containment : imgc,
									drag        : crop.drag_update,
									start       : opStart,
									stop        : function() {
										crop.updateView('xy');
										opStop();
									}
								});
							
							dinit();
							crop.update();
						}
					},
					rotateable = function(destroy) {
						if (destroy) {
							imgr.hide();
						}
						else {
							imgr.show();
							dinit();
						}
					},
					checkVals = function() {
						var w, h, x, y, d, q, b = '';
						
						if (mode == 'resize') {
							w = parseInt(width.val()) || 0;
							h = parseInt(height.val()) || 0;
						} else if (mode == 'crop') {
							w = parseInt(offsetX.val()) || 0;
							h = parseInt(offsetY.val()) || 0;
							x = parseInt(pointX.val()) || 0;
							y = parseInt(pointY.val()) || 0;
						} else if (mode == 'rotate') {
							w = owidth;
							h = oheight;
							d = parseInt(degree.val()) || 0;
							if (d < 0 || d > 360) {
								fm.error('Invalid rotate degree');
								return false;
							}
							if (d == 0 || d == 360) {
								fm.error('errResizeNoChange');
								return false;
							}
							b = bg.val();
						}
						q = quality? parseInt(quality.val()) : 0;
						
						if (mode != 'rotate') {
							if (w <= 0 || h <= 0) {
								fm.error('Invalid image size');
								return false;
							}
							if (w == owidth && h == oheight && parseInt(size0 / 1000) === parseInt(size1/1000)) {
								fm.error('errResizeNoChange');
								return false;
							}
						}
						
						return {w: w, h: h, x: x, y: y, d: d, q: q, b: b};
					},
					save = function() {
						var vals;
						
						if (vals = checkVals()) {
							dialog.elfinderdialog('close');
							self.resizeRequest({
								target : file.hash,
								width  : vals.w,
								height : vals.h,
								x      : vals.x,
								y      : vals.y,
								degree : vals.d,
								quality: vals.q,
								bg     : vals.b,
								mode   : mode
							}, file, dfrd);
						}
					},
					saveAs = function() {
						var fail = function() {
								dialogs.addClass(clsediting).fadeIn(function() {
									base.addClass(clactive);
								});
								fm.disable();
							},
							make = function() {
								self.mime = file.mime;
								self.prefix = file.name.replace(/ \d+(\.[^.]+)?$/, '$1');
								self.requestCmd = 'mkfile';
								self.nextAction = {};
								self.data = {target : file.phash};
								jQuery.proxy(fm.res('mixin', 'make'), self)()
									.done(function(data) {
										var hash, dfd;
										if (data.added && data.added.length) {
											hash = data.added[0].hash;
											dfd = fm.api < 2.1032? fm.url(file.hash, { async: true, temporary: true }) : null;
											jQuery.when(dfd).done(function(url) {
												fm.request({
													options : {type : 'post'},
													data : {
														cmd     : 'put',
														target  : hash,
														encoding: dfd? 'scheme' : 'hash', 
														content : dfd? fm.convAbsUrl(url) : file.hash
													},
													notify : {type : 'copy', cnt : 1},
													syncOnFail : true
												})
												.fail(fail)
												.done(function(data) {
													data = fm.normalize(data);
													fm.updateCache(data);
													file = fm.file(hash);
													data.changed && data.changed.length && fm.change(data);
													base.show().find('.elfinder-dialog-title').html(fm.escape(file.name));
													save();
													dialogs.fadeIn();
												});
											}).fail(fail);
										} else {
											fail();
										}
									})
									.fail(fail)
									.always(function() {
										delete self.mime;
										delete self.prefix;
										delete self.nextAction;
										delete self.data;
									});
								fm.trigger('unselectfiles', { files: [ file.hash ] });
							},
							reqOpen = null,
							dialogs;
						
						if (checkVals()) {
							dialogs = fmnode.children('.' + self.dialogClass + ':visible').removeClass(clsediting).fadeOut();
							base.removeClass(clactive);
							fm.enable();
							if (fm.searchStatus.state < 2 && file.phash !== fm.cwd().hash) {
								reqOpen = fm.exec('open', [file.phash], {thash: file.phash});
							}
							
							jQuery.when([reqOpen]).done(function() {
								reqOpen? fm.one('cwdrender', make) : make();
							}).fail(fail);
						}
					},
					buttons = {},
					hline   = 'elfinder-resize-handle-hline',
					vline   = 'elfinder-resize-handle-vline',
					rpoint  = 'elfinder-resize-handle-point',
					canvSrc = src,
					sizeImg = quality? jQuery('<img>').attr('crossorigin', fm.isCORS? 'use-credentials' : '').attr('src', canvSrc).on('load', function() {
						try {
							var canv = document.createElement('canvas');
							sizeImg.data('canvas', canv).data('ctx', canv.getContext('2d'));
							jpgCalc();
						} catch(e) {
							sizeImg.removeData('canvas').removeData('ctx');
						}
					}) : null,
					jpgCalc = function() {
						control.find('input.elfinder-resize-quality:visible').trigger('change');
					},
					dinit   = function(e) {
						if (base.hasClass('elfinder-dialog-minimized') || base.is(':hidden')) {
							return;
						}
						
						preset.hide();
						presetc.hide();
						
						var win   = fm.options.dialogContained? fmnode : jQuery(window),
							winH  = win.height(),
							winW  = win.width(),
							presW = 'auto',
							presIn = true,
							dw, ctrW, prvW;
						
						base.width(Math.min(dialogWidth, winW - 30));
						preview.attr('style', '');
						if (owidth && oheight) {
							pwidth  = preview.width()  - (rhandle.outerWidth()  - rhandle.width());
							pheight = preview.height() - (rhandle.outerHeight() - rhandle.height());
							resize.updateView(owidth, oheight);
						}
						ctrW  = dialog.find('div.elfinder-resize-control').width();
						prvW  = preview.width();
						
						dw = dialog.width() - 20;
						if (prvW > dw) {
							preview.width(dw);
							presIn = false;
						} else if ((dw - prvW) < ctrW) {
							if (winW > winH) {
								preview.width(dw - ctrW - 20);
							} else {
								preview.css({ float: 'none', marginLeft: 'auto', marginRight: 'auto'});
								presIn = false;
							}
						}
						if (presIn) {
							presW = ctrW;
						}
						pwidth  = preview.width()  - (rhandle.outerWidth()  - rhandle.width());
						if (fmnode.hasClass('elfinder-fullscreen')) {
							if (base.height() > winH) {
								winH -= 2;
								preview.height(winH - base.height() + preview.height());
								base.css('top', 0 - fmnode.offset().top);
							}
						} else {
							winH -= 30;
							(preview.height() > winH) && preview.height(winH);
						}
						pheight = preview.height() - (rhandle.outerHeight() - rhandle.height());
						if (owidth && oheight) {
							setupimg();
						}
						if (img.height() && preview.height() > img.height() + 20) {
							preview.height(img.height() + 20);
							pheight = preview.height() - (rhandle.outerHeight() - rhandle.height());
							setuprimg();
						}
						
						preset.css('width', presW).show();
						presetc.css('width', presW).show();
						if (!presetc.children('span.elfinder-resize-preset:visible').length) {
							presetc.hide();
						}
						dialog.elfinderdialog('posInit');
					},
					preset = (function() {
						var sets = jQuery('<fieldset class="elfinder-resize-preset-container">').append(jQuery('<legend>').html(fm.i18n('presets'))).css('box-sizing', 'border-box').hide(),
							hasC;
						jQuery.each(presetSize, function(i, s) {
							if (s.length === 2) {
								hasC = true;
								sets.append(jQuery('<span class="elfinder-resize-preset"></span>')
									.data('s', s)
									.text(s[0]+'x'+s[1])
									.button()
								);
							}
						});
						if (!hasC) {
							return jQuery();
						} else {
							return sets;
						}
					})(),
					presetc = preset.clone(true),
					useSaveAs = fm.uploadMimeCheck(file.mime, file.phash),
					dMinBtn, base;
				
				size0 = size1 = file.size;
				uiresize.append(
					jQuery(row).append(jQuery(label).text(fm.i18n('width')), width),
					jQuery(row).append(jQuery(label).text(fm.i18n('height')), height, jQuery('<div class="elfinder-resize-whctrls">').append(constr, reset)),
					(quality? jQuery(row).append(jQuery(label).text(fm.i18n('quality')), quality, jQuery('<span></span>')) : jQuery()),
					(isJpeg? jQuery(row).append(jQuery(label).text(fm.i18n('8pxgrid')).addClass('elfinder-resize-grid8'), grid8px) : jQuery()),
					jQuery(row).append(jQuery(label).text(fm.i18n('scale')), uiprop),
					jQuery(row).append(preset)
				);

				if (api2) {
					uicrop.append(
						jQuery(row).append(jQuery(label).text('X'), pointX),
						jQuery(row).append(jQuery(label).text('Y')).append(pointY),
						jQuery(row).append(jQuery(label).text(fm.i18n('width')), offsetX),
						jQuery(row).append(jQuery(label).text(fm.i18n('height')), offsetY, jQuery('<div class="elfinder-resize-whctrls">').append(constrc, reset.clone(true))),
						(quality? jQuery(row).append(jQuery(label).text(fm.i18n('quality')), quality.clone(true), jQuery('<span></span>')) : jQuery()),
						(isJpeg? jQuery(row).append(jQuery(label).text(fm.i18n('8pxgrid')).addClass('elfinder-resize-grid8')) : jQuery()),
						jQuery(row).append(presetc)
					);
					
					uirotate.append(
						jQuery(row).addClass('elfinder-resize-degree').append(
							jQuery(label).text(fm.i18n('rotate')),
							degree,
							jQuery('<span></span>').text(fm.i18n('degree')),
							jQuery('<div></div>').append(uideg270, uideg90)[ctrgrup]()
						),
						jQuery(row).css('height', '20px').append(uidegslider),
						((quality)? jQuery(row)[losslessRotate < 1? 'show' : 'hide']().addClass('elfinder-resize-quality').append(
							jQuery(label).text(fm.i18n('quality')),
							quality.clone(true),
							jQuery('<span></span>')) : jQuery()
						),
						jQuery(row).append(jQuery(label).text(fm.i18n('bgcolor')), bg, picker, reseter),
						jQuery(row).css('height', '20px').append(pallet)
					);
					uideg270.on('click', function() {
						rdegree = rdegree - 90;
						rotate.update(rdegree);
					});
					uideg90.on('click', function(){
						rdegree = rdegree + 90;
						rotate.update(rdegree);
					});
				}
				
				dialog.append(uitype).on('resize', function(e){
					e.stopPropagation();
				});

				if (api2) {
					control.append(/*jQuery(row), */uiresize, uicrop.hide(), uirotate.hide());
				} else {
					control.append(/*jQuery(row), */uiresize);
				}
				
				rhandle.append('<div class="'+hline+' '+hline+'-top"></div>',
					'<div class="'+hline+' '+hline+'-bottom"></div>',
					'<div class="'+vline+' '+vline+'-left"></div>',
					'<div class="'+vline+' '+vline+'-right"></div>',
					'<div class="'+rpoint+' '+rpoint+'-e"></div>',
					'<div class="'+rpoint+' '+rpoint+'-se"></div>',
					'<div class="'+rpoint+' '+rpoint+'-s"></div>');
					
				preview.append(spinner).append(rhandle.hide()).append(img.hide());

				if (api2) {
					rhandlec.css('position', 'absolute')
						.append('<div class="'+hline+' '+hline+'-top"></div>',
						'<div class="'+hline+' '+hline+'-bottom"></div>',
						'<div class="'+vline+' '+vline+'-left"></div>',
						'<div class="'+vline+' '+vline+'-right"></div>',
						'<div class="'+rpoint+' '+rpoint+'-n"></div>',
						'<div class="'+rpoint+' '+rpoint+'-e"></div>',
						'<div class="'+rpoint+' '+rpoint+'-s"></div>',
						'<div class="'+rpoint+' '+rpoint+'-w"></div>',
						'<div class="'+rpoint+' '+rpoint+'-ne"></div>',
						'<div class="'+rpoint+' '+rpoint+'-se"></div>',
						'<div class="'+rpoint+' '+rpoint+'-sw"></div>',
						'<div class="'+rpoint+' '+rpoint+'-nw"></div>');

					preview.append(basec.css('position', 'absolute').hide().append(imgc, rhandlec.append(coverc)));
					
					preview.append(imgr.hide());
				}
				
				preview.css('overflow', 'hidden');
				
				dialog.append(preview, control);
				
				buttons[fm.i18n('btnApply')] = save;
				if (useSaveAs) {
					buttons[fm.i18n('btnSaveAs')] = function() { requestAnimationFrame(saveAs); };
				}
				buttons[fm.i18n('btnCancel')] = function() { dialog.elfinderdialog('close'); };
				
				dialog.find('input,button').addClass('elfinder-tabstop');
				
				base = self.fmDialog(dialog, {
					title          : fm.escape(file.name),
					width          : dialogWidth,
					resizable      : false,
					buttons        : buttons,
					open           : function() {
						var doDimReq = function(force) {
								dimreq = fm.request({
									data : {cmd : 'dim', target : file.hash, substitute : substituteImg? 400 : ''},
									preventDefault : true
								})
								.done(function(data) {
									if (!data.url && needPng) {
										dialog.elfinderdialog('close');
										fm.error(['errOpen', file.name]);
									} else {
										if (data.dim) {
											var dim = data.dim.split('x');
											file.width = dim[0];
											file.height = dim[1];
											setdim(dim);
											if (data.url) {
												img.attr('src', data.url);
												imgc.attr('src', data.url);
												imgr.attr('src', data.url);
											}
											return init();
										}
									}
								});
							},
							needPng = !{'image/jpeg':true,'image/png':true,'image/gif':true,}[file.mime],
							substituteImg = fm.option('substituteImg', file.hash) && (needPng || file.size > options.dimSubImgSize)? true : false,
							hasSize = (file.width && file.height)? true : false;
						dMinBtn = base.find('.ui-dialog-titlebar .elfinder-titlebar-minimize').hide();
						fm.bind('resize', dinit);
						img.attr('src', src).one('error.dimreq', function() {
							doDimReq(true);
						});
						imgc.attr('src', src);
						imgr.attr('src', src);
						if (api2) {
							imgr.on('mousedown touchstart', rotate.start)
								.on('touchend', rotate.stop);
							base.on('mouseup', rotate.stop);
						}
						if (hasSize && !substituteImg) {
							return init();
						}
						if (file.size > (options.getDimThreshold || 0)) {
							img.off('error.dimreq');
							doDimReq();
						} else if (hasSize) {
							return init();
						}
					},
					close          : function() {
						if (api2) {
							imgr.off('mousedown touchstart', rotate.start)
								.off('touchend', rotate.stop);
							jQuery(document).off('mouseup', rotate.stop);
						}
						fm.unbind('resize', dinit);
						jQuery(this).elfinderdialog('destroy');
					},
					resize         : function(e, data) {
						if (data && data.minimize === 'off') {
							dinit();
						}
					}
				}).attr('id', id).closest('.ui-dialog').addClass(clsediting);
				
				// for IE < 9 dialog mising at open second+ time.
				if (fm.UA.ltIE8) {
					jQuery('.elfinder-dialog').css('filter', '');
				}
				
				coverc.css({ 'opacity': 0.2, 'background-color': '#fff', 'position': 'absolute'}),
				rhandlec.css('cursor', 'move');
				rhandlec.find('.elfinder-resize-handle-point').css({
					'background-color' : '#fff',
					'opacity': 0.5,
					'border-color':'#000'
				});

				if (! api2) {
					uitype.find('.api2').remove();
				}
				
				control.find('input,select').prop('disabled', true);
				control.find('input.elfinder-resize-quality')
					.next('span').addClass('elfinder-resize-jpgsize').attr('title', fm.i18n('roughFileSize'));

			},
			
			id, dialog, size0, size1
			;
			

		if (!files.length || files[0].mime.indexOf('image/') === -1) {
			return dfrd.reject();
		}
		
		id = 'resize-'+fm.namespace+'-'+files[0].hash;
		dialog = fmnode.find('#'+id);
		
		if (dialog.length) {
			dialog.elfinderdialog('toTop');
			return dfrd.resolve();
		}
		
		
		fm.openUrl(files[0].hash, 'sameorigin', function(src) {
			open(files[0], id, src);
		});
			
		return dfrd;
	};

};

(function ($) {
	
	var findProperty = function (styleObject, styleArgs) {
		var i = 0 ;
		for( i in styleArgs) {
	        if (typeof styleObject[styleArgs[i]] != 'undefined') 
	        	return styleArgs[i];
		}
		styleObject[styleArgs[i]] = '';
	    return styleArgs[i];
	};
	
	jQuery.cssHooks.rotate = {
		get: function(elem, computed, extra) {
			return jQuery(elem).rotate();
		},
		set: function(elem, value) {
			jQuery(elem).rotate(value);
			return value;
		}
	};
	jQuery.cssHooks.transform = {
		get: function(elem, computed, extra) {
			var name = findProperty( elem.style , 
				['WebkitTransform', 'MozTransform', 'OTransform' , 'msTransform' , 'transform'] );
			return elem.style[name];
		},
		set: function(elem, value) {
			var name = findProperty( elem.style , 
				['WebkitTransform', 'MozTransform', 'OTransform' , 'msTransform' , 'transform'] );
			elem.style[name] = value;
			return value;
		}
	};
	
	jQuery.fn.rotate = function(val) {
		var r;
		if (typeof val == 'undefined') {
			if (!!window.opera) {
				r = this.css('transform').match(/rotate\((.*?)\)/);
				return  ( r && r[1])?
					Math.round(parseFloat(r[1]) * 180 / Math.PI) : 0;
			} else {
				r = this.css('transform').match(/rotate\((.*?)\)/);
				return  ( r && r[1])? parseInt(r[1]) : 0;
			}
		}
		this.css('transform', 
			this.css('transform').replace(/none|rotate\(.*?\)/, '') + 'rotate(' + parseInt(val) + 'deg)');
		return this;
	};

	jQuery.fx.step.rotate  = function(fx) {
		if ( fx.state == 0 ) {
			fx.start = jQuery(fx.elem).rotate();
			fx.now = fx.start;
		}
		jQuery(fx.elem).rotate(fx.now);
	};

	if (typeof window.addEventListener == "undefined" && typeof document.getElementsByClassName == "undefined") { // IE & IE<9
		var GetAbsoluteXY = function(element) {
			var pnode = element;
			var x = pnode.offsetLeft;
			var y = pnode.offsetTop;
			
			while ( pnode.offsetParent ) {
				pnode = pnode.offsetParent;
				if (pnode != document.body && pnode.currentStyle['position'] != 'static') {
					break;
				}
				if (pnode != document.body && pnode != document.documentElement) {
					x -= pnode.scrollLeft;
					y -= pnode.scrollTop;
				}
				x += pnode.offsetLeft;
				y += pnode.offsetTop;
			}
			
			return { x: x, y: y };
		};
		
		var StaticToAbsolute = function (element) {
			if ( element.currentStyle['position'] != 'static') {
				return ;
			}

			var xy = GetAbsoluteXY(element);
			element.style.position = 'absolute' ;
			element.style.left = xy.x + 'px';
			element.style.top = xy.y + 'px';
		};

		var IETransform = function(element,transform){

			var r;
			var m11 = 1;
			var m12 = 1;
			var m21 = 1;
			var m22 = 1;

			if (typeof element.style['msTransform'] != 'undefined'){
				return true;
			}

			StaticToAbsolute(element);

			r = transform.match(/rotate\((.*?)\)/);
			var rotate =  ( r && r[1])	?	parseInt(r[1])	:	0;

			rotate = rotate % 360;
			if (rotate < 0) rotate = 360 + rotate;

			var radian= rotate * Math.PI / 180;
			var cosX =Math.cos(radian);
			var sinY =Math.sin(radian);

			m11 *= cosX;
			m12 *= -sinY;
			m21 *= sinY;
			m22 *= cosX;

			element.style.filter =  (element.style.filter || '').replace(/progid:DXImageTransform\.Microsoft\.Matrix\([^)]*\)/, "" ) +
				("progid:DXImageTransform.Microsoft.Matrix(" + 
					 "M11=" + m11 + 
					",M12=" + m12 + 
					",M21=" + m21 + 
					",M22=" + m22 + 
					",FilterType='bilinear',sizingMethod='auto expand')") 
				;

	  		var ow = parseInt(element.style.width || element.width || 0 );
	  		var oh = parseInt(element.style.height || element.height || 0 );

			radian = rotate * Math.PI / 180;
			var absCosX =Math.abs(Math.cos(radian));
			var absSinY =Math.abs(Math.sin(radian));

			var dx = (ow - (ow * absCosX + oh * absSinY)) / 2;
			var dy = (oh - (ow * absSinY + oh * absCosX)) / 2;

			element.style.marginLeft = Math.floor(dx) + "px";
			element.style.marginTop  = Math.floor(dy) + "px";

			return(true);
		};
		
		var transform_set = jQuery.cssHooks.transform.set;
		jQuery.cssHooks.transform.set = function(elem, value) {
			transform_set.apply(this, [elem, value] );
			IETransform(elem,value);
			return value;
		};
	}

})(jQuery);
js/commands/mkdir.js000064400000005016151215013360010424 0ustar00/**
 * @class  elFinder command "mkdir"
 * Create new folder
 *
 * @author Dmitry (dio) Levashov
 **/
 elFinder.prototype.commands.mkdir = function() {
	"use strict";
	var fm   = this.fm,
		self = this,
		curOrg;
	
	this.value           = '';
	this.disableOnSearch = true;
	this.updateOnSelect  = false;
	this.syncTitleOnChange = true;
	this.mime            = 'directory';
	this.prefix          = 'untitled folder';
	this.exec            = function(select, cOpts) {
		var onCwd;

		if (select && select.length && cOpts && cOpts._currentType && cOpts._currentType === 'navbar') {
			this.origin = cOpts._currentType;
			this.data = {
				target: select[0]
			};
		} else {
			onCwd = fm.cwd().hash === select[0];
			this.origin = curOrg && !onCwd? curOrg : 'cwd';
			delete this.data;
		}
		if (! select && ! this.options.intoNewFolderToolbtn) {
			fm.getUI('cwd').trigger('unselectall');
		}
		//this.move = (!onCwd && curOrg !== 'navbar' && fm.selected().length)? true : false;
		this.move = this.value === fm.i18n('cmdmkdirin');
		return jQuery.proxy(fm.res('mixin', 'make'), self)();
	};
	
	this.shortcuts = [{
		pattern     : 'ctrl+shift+n'
	}];

	this.init = function() {
		if (this.options.intoNewFolderToolbtn) {
			this.syncTitleOnChange = true;
		}
	};
	
	fm.bind('select contextmenucreate closecontextmenu', function(e) {
		var sel = (e.data? (e.data.selected || e.data.targets) : null) || fm.selected();
		
		self.className = 'mkdir';
		curOrg = e.data && sel.length? (e.data.origin || e.data.type || '') : '';
		if (!self.options.intoNewFolderToolbtn && curOrg === '') {
			curOrg = 'cwd';
		}
		if (sel.length && curOrg !== 'navbar' && curOrg !== 'cwd' && fm.cwd().hash !== sel[0]) {
			self.title = fm.i18n('cmdmkdirin');
			self.className += ' elfinder-button-icon-mkdirin';
		} else {
			self.title = fm.i18n('cmdmkdir');
		}
		if (e.type !== 'closecontextmenu') {
			self.update(void(0), self.title);
		} else {
			requestAnimationFrame(function() {
				self.update(void(0), self.title);
			});
		}
	});
	
	this.getstate = function(select) {
		var cwd = fm.cwd(),
			sel = (curOrg === 'navbar' || (select && select[0] !== cwd.hash))? this.files(select || fm.selected()) : [],
			cnt = sel.length,
			filter = function(files) {
				var fres = true;
				return jQuery.grep(files, function(f) {
					fres = fres && f.read && ! f.locked? true : false;
					return fres;
				});
			};

		if (curOrg === 'navbar') {
			return cnt && sel[0].write && sel[0].read? 0 : -1;  
		} else {
			return cwd.write && (!cnt || filter(sel).length == cnt)? 0 : -1;
		}
	};

};
js/commands/duplicate.js000064400000002560151215013360011271 0ustar00/**
 * @class elFinder command "duplicate"
 * Create file/folder copy with suffix "copy Number"
 *
 * @type  elFinder.command
 * @author  Dmitry (dio) Levashov
 */
 elFinder.prototype.commands.duplicate = function() {
	"use strict";
	var fm = this.fm;
	
	this.getstate = function(select) {
		var sel = this.files(select),
			cnt = sel.length,
			filter = function(files) {
				var fres = true;
				return jQuery.grep(files, function(f) {
					fres = fres && f.read && f.phash === fm.cwd().hash && ! fm.isRoot(f)? true : false;
					return fres;
				});
			};

		return cnt && fm.cwd().write && filter(sel).length == cnt ? 0 : -1;
	};
	
	this.exec = function(hashes) {
		var fm     = this.fm,
			files  = this.files(hashes),
			cnt    = files.length,
			dfrd   = jQuery.Deferred()
				.fail(function(error) {
					error && fm.error(error);
				}), 
			args = [];
			
		if (! cnt) {
			return dfrd.reject();
		}
		
		jQuery.each(files, function(i, file) {
			if (!file.read || !fm.file(file.phash).write) {
				return !dfrd.reject(['errCopy', file.name, 'errPerm']);
			}
		});
		
		if (dfrd.state() == 'rejected') {
			return dfrd;
		}
		
		return fm.request({
			data   : {cmd : 'duplicate', targets : this.hashes(hashes)},
			notify : {type : 'copy', cnt : cnt},
			navigate : {
				toast : {
					inbuffer : {msg: fm.i18n(['complete', fm.i18n('cmdduplicate')])}
				}
			}
		});
		
	};

};
js/commands/getfile.js000064400000010103151215013360010726 0ustar00/**
 * @class elFinder command "getfile". 
 * Return selected files info into outer callback.
 * For use elFinder with wysiwyg editors etc.
 *
 * @author Dmitry (dio) Levashov, dio@std42.ru
 **/
 (elFinder.prototype.commands.getfile = function() {
	"use strict";
	var self   = this,
		fm     = this.fm,
		filter = function(files) {
			var o = self.options,
				fres = true;

			files = jQuery.grep(files, function(file) {
				fres = fres && (file.mime != 'directory' || o.folders) && file.read ? true : false;
				return fres;
			});

			return o.multiple || files.length == 1 ? files : [];
		};
	
	this.alwaysEnabled = true;
	this.callback      = fm.options.getFileCallback;
	this._disabled     = typeof(this.callback) == 'function';
	
	this.getstate = function(select) {
		var sel = this.files(select),
			cnt = sel.length;
			
		return this.callback && cnt && filter(sel).length == cnt ? 0 : -1;
	};
	
	this.exec = function(hashes) {
		var fm    = this.fm,
			opts  = this.options,
			files = this.files(hashes),
			cnt   = files.length,
			url   = fm.option('url'),
			tmb   = fm.option('tmbUrl'),
			dfrd  = jQuery.Deferred()
				.done(function(data) {
					var res,
						done = function() {
							if (opts.oncomplete == 'close') {
								fm.hide();
							} else if (opts.oncomplete == 'destroy') {
								fm.destroy();
							}
						},
						fail = function(error) {
							if (opts.onerror == 'close') {
								fm.hide();
							} else if (opts.onerror == 'destroy') {
								fm.destroy();
							} else {
								error && fm.error(error);
							}
						};
					
					fm.trigger('getfile', {files : data});
					
					try {
						res = self.callback(data, fm);
					} catch(e) {
						fail(['Error in `getFileCallback`.', e.message]);
						return;
					}
					
					if (typeof res === 'object' && typeof res.done === 'function') {
						res.done(done).fail(fail);
					} else {
						done();
					}
				}),
			result = function(file) {
				return opts.onlyURL
					? opts.multiple ? jQuery.map(files, function(f) { return f.url; }) : files[0].url
					: opts.multiple ? files : files[0];
			},
			req = [], 
			i, file, dim;

		for (i = 0; i < cnt; i++) {
			file = files[i];
			if (file.mime == 'directory' && !opts.folders) {
				return dfrd.reject();
			}
			file.baseUrl = url;
			if (file.url == '1') {
				req.push(fm.request({
					data : {cmd : 'url', target : file.hash},
					notify : {type : 'url', cnt : 1, hideCnt : true},
					preventDefault : true
				})
				.done(function(data) {
					if (data.url) {
						var rfile = fm.file(this.hash);
						rfile.url = this.url = data.url;
					}
				}.bind(file)));
			} else {
				file.url = fm.url(file.hash);
			}
			if (! opts.onlyURL) {
				if (opts.getPath) {
					file.path = fm.path(file.hash);
					if (file.path === '' && file.phash) {
						// get parents
						(function() {
							var dfd  = jQuery.Deferred();
							req.push(dfd);
							fm.path(file.hash, false, {})
								.done(function(path) {
									file.path = path;
								})
								.fail(function() {
									file.path = '';
								})
								.always(function() {
									dfd.resolve();
								});
						})();
					}
				}
				if (file.tmb && file.tmb != 1) {
					file.tmb = tmb + file.tmb;
				}
				if (!file.width && !file.height) {
					if (file.dim) {
						dim = file.dim.split('x');
						file.width = dim[0];
						file.height = dim[1];
					} else if (opts.getImgSize && file.mime.indexOf('image') !== -1) {
						req.push(fm.request({
							data : {cmd : 'dim', target : file.hash},
							notify : {type : 'dim', cnt : 1, hideCnt : true},
							preventDefault : true
						})
						.done(function(data) {
							if (data.dim) {
								var dim = data.dim.split('x');
								var rfile = fm.file(this.hash);
								rfile.width = this.width = dim[0];
								rfile.height = this.height = dim[1];
							}
						}.bind(file)));
					}
				}
			}
		}
		
		if (req.length) {
			jQuery.when.apply(null, req).always(function() {
				dfrd.resolve(result(files));
			});
			return dfrd;
		}
		
		return dfrd.resolve(result(files));
	};

}).prototype = { forceLoad : true }; // this is required command
js/commands/paste.js000064400000024253151215013360010436 0ustar00/**
 * @class  elFinder command "paste"
 * Paste filesfrom clipboard into directory.
 * If files pasted in its parent directory - files duplicates will created
 *
 * @author Dmitry (dio) Levashov
 **/
elFinder.prototype.commands.paste = function() {
	"use strict";
	this.updateOnSelect  = false;
	
	this.handlers = {
		changeclipboard : function() { this.update(); }
	};

	this.shortcuts = [{
		pattern     : 'ctrl+v shift+insert'
	}];
	
	this.getstate = function(dst) {
		if (this._disabled) {
			return -1;
		}
		if (dst) {
			if (Array.isArray(dst)) {
				if (dst.length != 1) {
					return -1;
				}
				dst = this.fm.file(dst[0]);
			}
		} else {
			dst = this.fm.cwd();
		}

		return this.fm.clipboard().length && dst.mime == 'directory' && dst.write ? 0 : -1;
	};
	
	this.exec = function(select, cOpts) {
		var self   = this,
			fm     = self.fm,
			opts   = cOpts || {},
			dst    = select ? this.files(select)[0] : fm.cwd(),
			files  = fm.clipboard(),
			cnt    = files.length,
			cut    = cnt ? files[0].cut : false,
			cmd    = opts._cmd? opts._cmd : (cut? 'move' : 'copy'),
			error  = 'err' + cmd.charAt(0).toUpperCase() + cmd.substr(1),
			fpaste = [],
			fcopy  = [],
			dfrd   = jQuery.Deferred()
				.fail(function(error) {
					error && fm.error(error);
				})
				.always(function() {
					fm.unlockfiles({files : jQuery.map(files, function(f) { return f.hash; })});
				}),
			copy  = function(files) {
				return files.length && fm._commands.duplicate
					? fm.exec('duplicate', files)
					: jQuery.Deferred().resolve();
			},
			paste = function(files) {
				var dfrd      = jQuery.Deferred(),
					existed   = [],
					hashes  = {},
					intersect = function(files, names) {
						var ret = [], 
							i   = files.length;

						while (i--) {
							jQuery.inArray(files[i].name, names) !== -1 && ret.unshift(i);
						}
						return ret;
					},
					confirm   = function(ndx) {
						var i    = existed[ndx],
							file = files[i],
							last = ndx == existed.length-1;

						if (!file) {
							return;
						}

						fm.confirm({
							title  : fm.i18n(cmd + 'Files'),
							text   : ['errExists', file.name, cmd === 'restore'? 'confirmRest' : 'confirmRepl'], 
							all    : !last,
							accept : {
								label    : 'btnYes',
								callback : function(all) {
									!last && !all
										? confirm(++ndx)
										: paste(files);
								}
							},
							reject : {
								label    : 'btnNo',
								callback : function(all) {
									var i;

									if (all) {
										i = existed.length;
										while (ndx < i--) {
											files[existed[i]].remove = true;
										}
									} else {
										files[existed[ndx]].remove = true;
									}

									!last && !all
										? confirm(++ndx)
										: paste(files);
								}
							},
							cancel : {
								label    : 'btnCancel',
								callback : function() {
									dfrd.resolve();
								}
							},
							buttons : [
								{
									label : 'btnBackup',
									callback : function(all) {
										var i;
										if (all) {
											i = existed.length;
											while (ndx < i--) {
												files[existed[i]].rename = true;
											}
										} else {
											files[existed[ndx]].rename = true;
										}
										!last && !all
											? confirm(++ndx)
											: paste(files);
									}
								}
							]
						});
					},
					valid     = function(names) {
						var exists = {}, existedArr;
						if (names) {
							if (Array.isArray(names)) {
								if (names.length) {
									if (typeof names[0] == 'string') {
										// elFinder <= 2.1.6 command `is` results
										existed = intersect(files, names);
									} else {
										jQuery.each(names, function(i, v) {
											exists[v.name] = v.hash;
										});
										existed = intersect(files, jQuery.map(exists, function(h, n) { return n; }));
										jQuery.each(files, function(i, file) {
											if (exists[file.name]) {
												hashes[exists[file.name]] = file.name;
											}
										});
									}
								}
							} else {
								existedArr = [];
								existed = jQuery.map(names, function(n) {
									if (typeof n === 'string') {
										return n;
									} else {
										// support to >=2.1.11 plugin Normalizer, Sanitizer
										existedArr = existedArr.concat(n);
										return false;
									}
								});
								if (existedArr.length) {
									existed = existed.concat(existedArr);
								}
								existed = intersect(files, existed);
								hashes = names;
							}
						}
						existed.length ? confirm(0) : paste(files);
					},
					paste     = function(selFiles) {
						var renames = [],
							files  = jQuery.grep(selFiles, function(file) { 
								if (file.rename) {
									renames.push(file.name);
								}
								return !file.remove ? true : false;
							}),
							cnt    = files.length,
							groups = {},
							args   = [],
							targets, reqData;

						if (!cnt) {
							return dfrd.resolve();
						}

						targets = jQuery.map(files, function(f) { return f.hash; });
						
						reqData = {cmd : 'paste', dst : dst.hash, targets : targets, cut : cut ? 1 : 0, renames : renames, hashes : hashes, suffix : fm.options.backupSuffix};
						if (fm.api < 2.1) {
							reqData.src = files[0].phash;
						}
						
						fm.request({
								data   : reqData,
								notify : {type : cmd, cnt : cnt},
								cancel : true,
								navigate : { 
									toast  : opts.noToast? {} : {
										inbuffer : {msg: fm.i18n(['complete', fm.i18n('cmd' + cmd)]), action: {
											cmd: 'open',
											msg: 'cmdopendir',
											data: [dst.hash],
											done: 'select',
											cwdNot: dst.hash
										}}
									}
								}
							})
							.done(function(data) {
								var dsts = {},
									added = data.added && data.added.length? data.added : null;
								if (cut && added) {
									// undo/redo
									jQuery.each(files, function(i, f) {
										var phash = f.phash,
											srcHash = function(name) {
												var hash;
												jQuery.each(added, function(i, f) {
													if (f.name === name) {
														hash = f.hash;
														return false;
													}
												});
												return hash;
											},
											shash = srcHash(f.name);
										if (shash) {
											if (dsts[phash]) {
												dsts[phash].push(shash);
											} else {
												dsts[phash] = [ shash ];
											}
										}
									});
									if (Object.keys(dsts).length) {
										data.undo = {
											cmd : 'move',
											callback : function() {
												var reqs = [];
												jQuery.each(dsts, function(dst, targets) {
													reqs.push(fm.request({
														data : {cmd : 'paste', dst : dst, targets : targets, cut : 1},
														notify : {type : 'undo', cnt : targets.length}
													}));
												});
												return jQuery.when.apply(null, reqs);
											}
										};
										data.redo = {
											cmd : 'move',
											callback : function() {
												return fm.request({
													data : reqData,
													notify : {type : 'redo', cnt : cnt}
												});
											}
										};
									}
								}
								dfrd.resolve(data);
							})
							.fail(function(flg) {
								dfrd.reject();
								if (flg === 0) {
									// canceling
									fm.sync();
								}
							})
							.always(function() {
								fm.unlockfiles({files : files});
							});
					},
					internames;

				if (!fm.isCommandEnabled(self.name, dst.hash) || !files.length) {
					return dfrd.resolve();
				}
				
				if (fm.oldAPI) {
					paste(files);
				} else {
					
					if (!fm.option('copyOverwrite', dst.hash)) {
						paste(files);
					} else {
						internames = jQuery.map(files, function(f) { return f.name; });
						dst.hash == fm.cwd().hash
							? valid(jQuery.map(fm.files(), function(file) { return file.phash == dst.hash ? {hash: file.hash, name: file.name} : null; }))
							: fm.request({
								data : {cmd : 'ls', target : dst.hash, intersect : internames},
								notify : {type : 'prepare', cnt : 1, hideCnt : true},
								preventFail : true
							})
							.always(function(data) {
								valid(data.list);
							});
					}
				}
				
				return dfrd;
			},
			parents, fparents, cutDfrd;


		if (!cnt || !dst || dst.mime != 'directory') {
			return dfrd.reject();
		}
			
		if (!dst.write)	{
			return dfrd.reject([error, files[0].name, 'errPerm']);
		}
		
		parents = fm.parents(dst.hash);
		
		jQuery.each(files, function(i, file) {
			if (!file.read) {
				return !dfrd.reject([error, file.name, 'errPerm']);
			}
			
			if (cut && file.locked) {
				return !dfrd.reject(['errLocked', file.name]);
			}
			
			if (jQuery.inArray(file.hash, parents) !== -1) {
				return !dfrd.reject(['errCopyInItself', file.name]);
			}
			
			if (file.mime && file.mime !== 'directory' && ! fm.uploadMimeCheck(file.mime, dst.hash)) {
				return !dfrd.reject([error, file.name, 'errUploadMime']);
			}
			
			fparents = fm.parents(file.hash);
			fparents.pop();
			if (jQuery.inArray(dst.hash, fparents) !== -1) {
				
				if (jQuery.grep(fparents, function(h) { var d = fm.file(h); return d.phash == dst.hash && d.name == file.name ? true : false; }).length) {
					return !dfrd.reject(['errReplByChild', file.name]);
				}
			}
			
			if (file.phash == dst.hash) {
				fcopy.push(file.hash);
			} else {
				fpaste.push({
					hash  : file.hash,
					phash : file.phash,
					name  : file.name
				});
			}
		});

		if (dfrd.state() === 'rejected') {
			return dfrd;
		}

		cutDfrd = jQuery.Deferred();
		if (cut && self.options.moveConfirm) {
			fm.confirm({
				title  : 'moveFiles',
				text   : fm.i18n('confirmMove', dst.i18 || dst.name),
				accept : {
					label    : 'btnYes',
					callback : function() {  
						cutDfrd.resolve();
					}
				},
				cancel : {
					label    : 'btnCancel',
					callback : function() {
						cutDfrd.reject();
					}
				}
			});
		} else {
			cutDfrd.resolve();
		}

		cutDfrd.done(function() {
			jQuery.when(
				copy(fcopy),
				paste(fpaste)
			)
			.done(function(cr, pr) {
				dfrd.resolve(pr && pr.undo? pr : void(0));
			})
			.fail(function() {
				dfrd.reject();
			})
			.always(function() {
				cut && fm.clipboard([]);
			});
		}).fail(function() {
			dfrd.reject();
		});
		
		return dfrd;
	};

};
js/commands/extract.js000064400000012265151215013360010774 0ustar00/**
 * @class  elFinder command "extract"
 * Extract files from archive
 *
 * @author Dmitry (dio) Levashov
 **/
 elFinder.prototype.commands.extract = function() {
	"use strict";
	var self    = this,
		fm      = self.fm,
		mimes   = [],
		filter  = function(files) {
			var fres = true;
			return jQuery.grep(files, function(file) { 
				fres = fres && file.read && jQuery.inArray(file.mime, mimes) !== -1 ? true : false;
				return fres;
			});
		};
	
	this.variants = [];
	this.disableOnSearch = true;
	
	// Update mimes list on open/reload
	fm.bind('open reload', function() {
		mimes = fm.option('archivers')['extract'] || [];
		if (fm.api > 2) {
			self.variants = [[{makedir: true}, fm.i18n('cmdmkdir')], [{}, fm.i18n('btnCwd')]];
		} else {
			self.variants = [[{}, fm.i18n('btnCwd')]];
		}
		self.change();
	});
	
	this.getstate = function(select) {
		var sel = this.files(select),
			cnt = sel.length,
			cwdHash, cwdChk;
		if (!cnt || filter(sel).length != cnt) {
			return -1;
		} else if (fm.searchStatus.state > 0) {
			cwdHash = this.fm.cwd().hash;
			jQuery.each(sel, function(i, file) {
				cwdChk = (file.phash === cwdHash);
				return cwdChk;
			});
			return cwdChk? 0 : -1;
		} else {
			return this.fm.cwd().write? 0 : -1;
		}
	};
	
	this.exec = function(hashes, opts) {
		var files    = this.files(hashes),
			dfrd     = jQuery.Deferred(),
			cnt      = files.length,
			makedir  = opts && opts.makedir ? 1 : 0,
			i, error,
			decision,

			overwriteAll = false,
			omitAll = false,
			mkdirAll = 0,
			siblings = fm.files(files[0].phash),

			names = [],
			map = {};

		jQuery.each(siblings, function(id, file) {
			map[file.name] = file;
			names.push(file.name);
		});
		
		var decide = function(decision) {
			switch (decision) {
				case 'overwrite_all' :
					overwriteAll = true;
					break;
				case 'omit_all':
					omitAll = true;
					break;
			}
		};

		var unpack = function(file) {
			if (!(file.read && fm.file(file.phash).write)) {
				error = ['errExtract', file.name, 'errPerm'];
				fm.error(error);
				dfrd.reject(error);
			} else if (jQuery.inArray(file.mime, mimes) === -1) {
				error = ['errExtract', file.name, 'errNoArchive'];
				fm.error(error);
				dfrd.reject(error);
			} else {
				fm.request({
					data:{cmd:'extract', target:file.hash, makedir:makedir},
					notify:{type:'extract', cnt:1},
					syncOnFail:true,
					navigate:{
						toast : makedir? {
							incwd    : {msg: fm.i18n(['complete', fm.i18n('cmdextract')]), action: {cmd: 'open', msg: 'cmdopen'}},
							inbuffer : {msg: fm.i18n(['complete', fm.i18n('cmdextract')]), action: {cmd: 'open', msg: 'cmdopen'}}
						} : {
							inbuffer : {msg: fm.i18n(['complete', fm.i18n('cmdextract')])}
						}
					}
				})
				.fail(function (error) {
					if (dfrd.state() != 'rejected') {
						dfrd.reject(error);
					}
				})
				.done(function () {
				});
			}
		};
		
		var confirm = function(files, index) {
			var file = files[index],
			name = fm.splitFileExtention(file.name)[0],
			existed = (jQuery.inArray(name, names) >= 0),
			next = function(){
				if((index+1) < cnt) {
					confirm(files, index+1);
				} else {
					dfrd.resolve();
				}
			};
			if (!makedir && existed && map[name].mime != 'directory') {
				fm.confirm(
					{
						title : fm.i18n('ntfextract'),
						text  : ['errExists', name, 'confirmRepl'],
						accept:{
							label : 'btnYes',
							callback:function (all) {
								decision = all ? 'overwrite_all' : 'overwrite';
								decide(decision);
								if(!overwriteAll && !omitAll) {
									if('overwrite' == decision) {
										unpack(file);
									}
									if((index+1) < cnt) {
										confirm(files, index+1);
									} else {
										dfrd.resolve();
									}
								} else if(overwriteAll) {
									for (i = index; i < cnt; i++) {
										unpack(files[i]);
									}
									dfrd.resolve();
								}
							}
						},
						reject : {
							label : 'btnNo',
							callback:function (all) {
								decision = all ? 'omit_all' : 'omit';
								decide(decision);
								if(!overwriteAll && !omitAll && (index+1) < cnt) {
									confirm(files, index+1);
								} else if (omitAll) {
									dfrd.resolve();
								}
							}
						},
						cancel : {
							label : 'btnCancel',
							callback:function () {
								dfrd.resolve();
							}
						},
						all : ((index+1) < cnt)
					}
				);
			} else if (!makedir) {
				if (mkdirAll == 0) {
					fm.confirm({
						title : fm.i18n('cmdextract'),
						text  : [fm.i18n('cmdextract')+' "'+file.name+'"', 'confirmRepl'],
						accept:{
							label : 'btnYes',
							callback:function (all) {
								all && (mkdirAll = 1);
								unpack(file);
								next();
							}
						},
						reject : {
							label : 'btnNo',
							callback:function (all) {
								all && (mkdirAll = -1);
								next();
							}
						},
						cancel : {
							label : 'btnCancel',
							callback:function () {
								dfrd.resolve();
							}
						},
						all : ((index+1) < cnt)
					});
				} else {
					(mkdirAll > 0) && unpack(file);
					next();
				}
			} else {
				unpack(file);
				next();
			}
		};
		
		if (!(this.enabled() && cnt && mimes.length)) {
			return dfrd.reject();
		}
		
		if(cnt > 0) {
			confirm(files, 0);
		}

		return dfrd;
	};

};
js/commands/cut.js000064400000002172151215013360010111 0ustar00/**
 * @class elFinder command "copy".
 * Put files in filemanager clipboard.
 *
 * @type  elFinder.command
 * @author  Dmitry (dio) Levashov
 */
 elFinder.prototype.commands.cut = function() {
	"use strict";
	var fm = this.fm;
	
	this.shortcuts = [{
		pattern     : 'ctrl+x shift+insert'
	}];
	
	this.getstate = function(select) {
		var sel = this.files(select),
			cnt = sel.length,
			filter = function(files) {
				var fres = true;
				return jQuery.grep(files, function(f) {
					fres = fres && f.read && ! f.locked && ! fm.isRoot(f) ? true : false;
					return fres;
				});
			};
		
		return cnt && filter(sel).length == cnt ? 0 : -1;
	};
	
	this.exec = function(hashes) {
		var dfrd = jQuery.Deferred()
				.fail(function(error) {
					fm.error(error);
				});

		jQuery.each(this.files(hashes), function(i, file) {
			if (!(file.read && ! file.locked && ! fm.isRoot(file)) ) {
				return !dfrd.reject(['errCopy', file.name, 'errPerm']);
			}
			if (file.locked) {
				return !dfrd.reject(['errLocked', file.name]);
			}
		});
		
		return dfrd.state() == 'rejected' ? dfrd : dfrd.resolve(fm.clipboard(this.hashes(hashes), true));
	};

};
js/commands/chmod.js000064400000022567151215013360010422 0ustar00/**
 * @class elFinder command "chmod".
 * Chmod files.
 *
 * @type  elFinder.command
 * @author Naoki Sawada
 */
 elFinder.prototype.commands.chmod = function() {
	"use strict";
	this.updateOnSelect = false;
	var fm  = this.fm,
		level = {
			0 : 'owner',
			1 : 'group',
			2 : 'other'
		},
		msg = {
			read     : fm.i18n('read'),
			write    : fm.i18n('write'),
			execute  : fm.i18n('execute'),
			perm     : fm.i18n('perm'),
			kind     : fm.i18n('kind'),
			files    : fm.i18n('files')
		},
		isPerm = function(perm){
			return (!isNaN(parseInt(perm, 8)) && parseInt(perm, 8) <= 511) || perm.match(/^([r-][w-][x-]){3}$/i);
		};

	this.tpl = {
		main       : '<div class="ui-helper-clearfix elfinder-info-title"><span class="elfinder-cwd-icon {class} ui-corner-all"></span>{title}</div>'
					+'{dataTable}',
		itemTitle  : '<strong>{name}</strong><span id="elfinder-info-kind">{kind}</span>',
		groupTitle : '<strong>{items}: {num}</strong>',
		dataTable  : '<table id="{id}-table-perm"><tr><td>{0}</td><td>{1}</td><td>{2}</td></tr></table>'
					+'<div class="">'+msg.perm+': <input class="elfinder-tabstop elfinder-focus" id="{id}-perm" type="text" size="4" maxlength="3" value="{value}"></div>',
		fieldset   : '<fieldset id="{id}-fieldset-{level}"><legend>{f_title}{name}</legend>'
					+'<input type="checkbox" value="4" class="elfinder-tabstop" id="{id}-read-{level}-perm"{checked-r}> <label for="{id}-read-{level}-perm">'+msg.read+'</label><br>'
					+'<input type="checkbox" value="6" class="elfinder-tabstop" id="{id}-write-{level}-perm"{checked-w}> <label for="{id}-write-{level}-perm">'+msg.write+'</label><br>'
					+'<input type="checkbox" value="5" class="elfinder-tabstop" id="{id}-execute-{level}-perm"{checked-x}> <label for="{id}-execute-{level}-perm">'+msg.execute+'</label><br>'
	};

	this.shortcuts = [{
		//pattern     : 'ctrl+p'
	}];

	this.getstate = function(sel) {
		var fm = this.fm;
		sel = sel || fm.selected();
		if (sel.length == 0) {
			sel = [ fm.cwd().hash ];
		}
		return this.checkstate(this.files(sel)) ? 0 : -1;
	};
	
	this.checkstate = function(sel) {
		var cnt = sel.length,
			filter = function(files) {
				var fres = true;
				return jQuery.grep(sel, function(f) {
					fres = fres && f.isowner && f.perm && isPerm(f.perm) && (cnt == 1 || f.mime != 'directory') ? true : false;
					return fres;
				});
			};
		return (cnt && cnt === filter(sel).length)? true : false;
	};

	this.exec = function(select) {
		var hashes  = this.hashes(select),
			files   = this.files(hashes);
		if (! files.length) {
			hashes = [ this.fm.cwd().hash ];
			files   = this.files(hashes);
		}
		var fm  = this.fm,
		dfrd    = jQuery.Deferred().always(function() {
			fm.enable();
		}),
		tpl     = this.tpl,
		cnt     = files.length,
		file    = files[0],
		id = fm.namespace + '-perm-' + file.hash,
		view    = tpl.main,
		checked = ' checked="checked"',
		buttons = function() {
			var buttons = {};
			buttons[fm.i18n('btnApply')] = save;
			buttons[fm.i18n('btnCancel')] = function() { dialog.elfinderdialog('close'); };
			return buttons;
		},
		save = function() {
			var perm = jQuery.trim(jQuery('#'+id+'-perm').val()),
				reqData;
			
			if (!isPerm(perm)) return false;
			
			dialog.elfinderdialog('close');
			
			reqData = {
				cmd     : 'chmod',
				targets : hashes,
				mode    : perm
			};
			fm.request({
				data : reqData,
				notify : {type : 'chmod', cnt : cnt}
			})
			.fail(function(error) {
				dfrd.reject(error);
			})
			.done(function(data) {
				if (data.changed && data.changed.length) {
					data.undo = {
						cmd : 'chmod',
						callback : function() {
							var reqs = [];
							jQuery.each(prevVals, function(perm, hashes) {
								reqs.push(fm.request({
									data : {cmd : 'chmod', targets : hashes, mode : perm},
									notify : {type : 'undo', cnt : hashes.length}
								}));
							});
							return jQuery.when.apply(null, reqs);
						}
					};
					data.redo = {
						cmd : 'chmod',
						callback : function() {
							return fm.request({
								data : reqData,
								notify : {type : 'redo', cnt : hashes.length}
							});
						}
					};
				}
				dfrd.resolve(data);
			});
		},
		setperm = function() {
			var perm = '';
			var _perm;
			for (var i = 0; i < 3; i++){
				_perm = 0;
				if (jQuery("#"+id+"-read-"+level[i]+'-perm').is(':checked')) {
					_perm = (_perm | 4);
				}
				if (jQuery("#"+id+"-write-"+level[i]+'-perm').is(':checked')) {
					_perm = (_perm | 2);
				}
				if (jQuery("#"+id+"-execute-"+level[i]+'-perm').is(':checked')) {
					_perm = (_perm | 1);
				}
				perm += _perm.toString(8);
			}
			jQuery('#'+id+'-perm').val(perm);
		},
		setcheck = function(perm) {
			var _perm;
			for (var i = 0; i < 3; i++){
				_perm = parseInt(perm.slice(i, i+1), 8);
				jQuery("#"+id+"-read-"+level[i]+'-perm').prop("checked", false);
				jQuery("#"+id+"-write-"+level[i]+'-perm').prop("checked", false);
				jQuery("#"+id+"-execute-"+level[i]+'-perm').prop("checked", false);
				if ((_perm & 4) == 4) {
					jQuery("#"+id+"-read-"+level[i]+'-perm').prop("checked", true);
				}
				if ((_perm & 2) == 2) {
					jQuery("#"+id+"-write-"+level[i]+'-perm').prop("checked", true);
				}
				if ((_perm & 1) == 1) {
					jQuery("#"+id+"-execute-"+level[i]+'-perm').prop("checked", true);
				}
			}
			setperm();
		},
		makeperm = function(files) {
			var perm = '777', ret = '', chk, _chk, _perm;
			var len = files.length;
			for (var i2 = 0; i2 < len; i2++) {
				chk = getPerm(files[i2].perm);
				if (! prevVals[chk]) {
					prevVals[chk] = [];
				}
				prevVals[chk].push(files[i2].hash);
				ret = '';
				for (var i = 0; i < 3; i++){
					_chk = parseInt(chk.slice(i, i+1), 8);
					_perm = parseInt(perm.slice(i, i+1), 8);
					if ((_chk & 4) != 4 && (_perm & 4) == 4) {
						_perm -= 4;
					}
					if ((_chk & 2) != 2 && (_perm & 2) == 2) {
						_perm -= 2;
					}
					if ((_chk & 1) != 1 && (_perm & 1) == 1) {
						_perm -= 1;
					}
					ret += _perm.toString(8);
				}
				perm = ret;
			}
			return perm;
		},
		makeName = function(name) {
			return name? ':'+name : '';
		},
		makeDataTable = function(perm, f) {
			var _perm, fieldset;
			var value = '';
			var dataTable = tpl.dataTable;
			for (var i = 0; i < 3; i++){
				_perm = parseInt(perm.slice(i, i+1), 8);
				value += _perm.toString(8);
				fieldset = tpl.fieldset.replace('{f_title}', fm.i18n(level[i])).replace('{name}', makeName(f[level[i]])).replace(/\{level\}/g, level[i]);
				dataTable = dataTable.replace('{'+i+'}', fieldset)
				                     .replace('{checked-r}', ((_perm & 4) == 4)? checked : '')
				                     .replace('{checked-w}', ((_perm & 2) == 2)? checked : '')
				                     .replace('{checked-x}', ((_perm & 1) == 1)? checked : '');
			}
			dataTable = dataTable.replace('{value}', value).replace('{valueCaption}', msg['perm']);
			return dataTable;
		},
		getPerm = function(perm){
			if (isNaN(parseInt(perm, 8))) {
				var mode_array = perm.split('');
				var a = [];

				for (var i = 0, l = mode_array.length; i < l; i++) {
					if (i === 0 || i === 3 || i === 6) {
						if (mode_array[i].match(/[r]/i)) {
							a.push(1);
						} else if (mode_array[i].match(/[-]/)) {
							a.push(0);
						}
					} else if ( i === 1 || i === 4 || i === 7) {
						 if (mode_array[i].match(/[w]/i)) {
							a.push(1);
						} else if (mode_array[i].match(/[-]/)) {
							a.push(0);
						}
					} else {
						if (mode_array[i].match(/[x]/i)) {
							a.push(1);
						} else if (mode_array[i].match(/[-]/)) {
							a.push(0);
						}
					}
				}
			
				a.splice(3, 0, ",");
				a.splice(7, 0, ",");

				var b = a.join("");
				var b_array = b.split(",");
				var c = [];
			
				for (var j = 0, m = b_array.length; j < m; j++) {
					var p = parseInt(b_array[j], 2).toString(8);
					c.push(p);
				}

				perm = c.join('');
			} else {
				perm = parseInt(perm, 8).toString(8);
			}
			return perm;
		},
		opts    = {
			title : this.title,
			width : 'auto',
			buttons : buttons(),
			close : function() { jQuery(this).elfinderdialog('destroy'); }
		},
		dialog = fm.getUI().find('#'+id),
		prevVals = {},
		tmb = '', title, dataTable;

		if (dialog.length) {
			dialog.elfinderdialog('toTop');
			return jQuery.Deferred().resolve();
		}

		view  = view.replace('{class}', cnt > 1 ? 'elfinder-cwd-icon-group' : fm.mime2class(file.mime));
		if (cnt > 1) {
			title = tpl.groupTitle.replace('{items}', fm.i18n('items')).replace('{num}', cnt);
		} else {
			title = tpl.itemTitle.replace('{name}', file.name).replace('{kind}', fm.mime2kind(file));
			tmb = fm.tmb(file);
		}

		dataTable = makeDataTable(makeperm(files), files.length == 1? files[0] : {});

		view = view.replace('{title}', title).replace('{dataTable}', dataTable).replace(/{id}/g, id);

		dialog = this.fmDialog(view, opts);
		dialog.attr('id', id);

		// load thumbnail
		if (tmb) {
			jQuery('<img/>')
				.on('load', function() { dialog.find('.elfinder-cwd-icon').addClass(tmb.className).css('background-image', "url('"+tmb.url+"')"); })
				.attr('src', tmb.url);
		}

		jQuery('#' + id + '-table-perm :checkbox').on('click', function(){setperm('perm');});
		jQuery('#' + id + '-perm').on('keydown', function(e) {
			var c = e.keyCode;
			if (c == jQuery.ui.keyCode.ENTER) {
				e.stopPropagation();
				save();
				return;
			}
		}).on('focus', function(e){
			jQuery(this).trigger('select');
		}).on('keyup', function(e) {
			if (jQuery(this).val().length == 3) {
				jQuery(this).trigger('select');
				setcheck(jQuery(this).val());
			}
		});
		
		return dfrd;
	};
};
js/commands/rename.js000064400000037653151215013360010601 0ustar00/**
 * @class elFinder command "rename". 
 * Rename selected file.
 *
 * @author Dmitry (dio) Levashov, dio@std42.ru
 * @author Naoki Sawada
 **/
elFinder.prototype.commands.rename = function() {
	"use strict";

	// set alwaysEnabled to allow root rename on client size
	this.alwaysEnabled = true;

	this.syncTitleOnChange = true;

	var self = this,
		fm = self.fm,
		request = function(dfrd, targtes, file, name) {
			var sel = targtes? [file.hash].concat(targtes) : [file.hash],
				cnt = sel.length,
				data = {}, rootNames;
			
			fm.lockfiles({files : sel});
			
			if (fm.isRoot(file) && !file.netkey) {
				if (!(rootNames = fm.storage('rootNames'))) {
					rootNames = {};
				}
				if (name === '') {
					if (rootNames[file.hash]) {
						file.name = file._name;
						file.i18 = file._i18;
						delete rootNames[file.hash];
						delete file._name;
						delete file._i18;
					} else {
						dfrd && dfrd.reject();
						fm.unlockfiles({files : sel}).trigger('selectfiles', {files : sel});
						return;
					}
				} else {
					if (typeof file._name === 'undefined') {
						file._name = file.name;
						file._i18 = file.i18;
					}
					file.name = rootNames[file.hash] = name;
					delete file.i18;
				}
				fm.storage('rootNames', rootNames);
				data = { changed: [file] };
				fm.updateCache(data);
				fm.change(data);
				dfrd && dfrd.resolve(data);
				fm.unlockfiles({files : sel}).trigger('selectfiles', {files : sel});
				return;
			}

			data = {
				cmd : 'rename',
				name : name,
				target : file.hash
			};

			if (cnt > 1) {
				data['targets'] = targtes;
				if (name.match(/\*/)) {
					data['q'] = name;
				}
			}
			
			fm.request({
					data   : data,
					notify : {type : 'rename', cnt : cnt},
					navigate : {}
				})
				.fail(function(error) {
					var err = fm.parseError(error);
					dfrd && dfrd.reject();
					if (! err || ! Array.isArray(err) || err[0] !== 'errRename') {
						fm.sync();
					}
				})
				.done(function(data) {
					var cwdHash;
					if (data.added && data.added.length && cnt === 1) {
						data.undo = {
							cmd : 'rename',
							callback : function() {
								return fm.request({
									data   : {cmd : 'rename', target : data.added[0].hash, name : file.name},
									notify : {type : 'undo', cnt : 1}
								});
							}
						};
						data.redo = {
							cmd : 'rename',
							callback : function() {
								return fm.request({
									data   : {cmd : 'rename', target : file.hash, name : name},
									notify : {type : 'rename', cnt : 1}
								});
							}
						};
					}
					dfrd && dfrd.resolve(data);
					if (!(cwdHash = fm.cwd().hash) || cwdHash === file.hash) {
						fm.exec('open', jQuery.map(data.added, function(f) {
							return (f.mime === 'directory')? f.hash : null;
						})[0]);
					}
				})
				.always(function() {
					fm.unlockfiles({files : sel}).trigger('selectfiles', {files : sel});
				}
			);
		},
		getHint = function(name, target) {
			var sel = target || fm.selected(),
				splits = fm.splitFileExtention(name),
				f1 = fm.file(sel[0]),
				f2 = fm.file(sel[1]),
				ext, hint, add;
			
			ext = splits[1]? ('.' + splits[1]) : '';
			if (splits[1] && splits[0] === '*') {
				// change extention
				hint =  '"' + fm.splitFileExtention(f1.name)[0] + ext + '", ';
				hint += '"' + fm.splitFileExtention(f2.name)[0] + ext + '"';
			} else if (splits[0].length > 1) {
				if (splits[0].substr(-1) === '*') {
					// add prefix
					add = splits[0].substr(0, splits[0].length - 1);
					hint =  '"' + add + f1.name+'", ';
					hint += '"' + add + f2.name+'"';
				} else if (splits[0].substr(0, 1) === '*') {
					// add suffix
					add = splits[0].substr(1);
					hint =  '"'+fm.splitFileExtention(f1.name)[0] + add + ext + '", ';
					hint += '"'+fm.splitFileExtention(f2.name)[0] + add + ext + '"';
				}
			}
			if (!hint) {
				hint = '"'+splits[0] + '1' + ext + '", "' + splits[0] + '2' + ext + '"';
			}
			if (sel.length > 2) {
				hint += ' ...';
			}
			return hint;
		},
		batchRename = function() {
			var sel = fm.selected(),
				tplr = '<input name="type" type="radio" class="elfinder-tabstop">',
				mkChk = function(node, label) {
					return jQuery('<label class="elfinder-rename-batch-checks">' + fm.i18n(label) + '</label>').prepend(node);
				},
				name = jQuery('<input type="text" class="ui-corner-all elfinder-tabstop">'),
				num  = jQuery(tplr),
				prefix  = jQuery(tplr),
				suffix  = jQuery(tplr),
				extention  = jQuery(tplr),
				checks = jQuery('<div></div>').append(
					mkChk(num, 'plusNumber'),
					mkChk(prefix, 'asPrefix'),
					mkChk(suffix, 'asSuffix'),
					mkChk(extention, 'changeExtention')
				),
				preview = jQuery('<div class="elfinder-rename-batch-preview"></div>'),
				node = jQuery('<div class="elfinder-rename-batch"></div>').append(
						jQuery('<div class="elfinder-rename-batch-name"></div>').append(name),
						jQuery('<div class="elfinder-rename-batch-type"></div>').append(checks),
						preview
					),
				opts = {
					title : fm.i18n('batchRename'),
					modal : true,
					destroyOnClose : true,
					width: Math.min(380, fm.getUI().width() - 20),
					buttons : {},
					open : function() {
						name.on('input', mkPrev).trigger('focus');
					}
				},
				getName = function() {
					var vName = name.val(),
						ext = fm.splitFileExtention(fm.file(sel[0]).name)[1];
					if (vName !== '' || num.is(':checked')) {
						if (prefix.is(':checked')) {
							vName += '*';
						} else if (suffix.is(':checked')) {
							vName = '*' + vName + '.' + ext;
						} else if (extention.is(':checked')) {
							vName = '*.' + vName;
						} else if (ext) {
							vName += '.' + ext;
						}
					}
					return vName;
				},
				mkPrev = function() {
					var vName = getName();
					if (vName !== '') {
						preview.html(fm.i18n(['renameMultiple', sel.length, getHint(vName)]));
					} else {
						preview.empty();
					}
				},
				radios = checks.find('input:radio').on('change', mkPrev),
				dialog;
			
			opts.buttons[fm.i18n('btnApply')] = function() {
				var vName = getName(),
					file, targets;
				if (vName !== '') {
					dialog.elfinderdialog('close');
					targets = sel;
					file = fm.file(targets.shift());
					request(void(0), targets, file, vName);
				}
			};
			opts.buttons[fm.i18n('btnCancel')] = function() {
				dialog.elfinderdialog('close');
			};
			if (jQuery.fn.checkboxradio) {
				radios.checkboxradio({
					create: function(e, ui) {
						if (this === num.get(0)) {
							num.prop('checked', true).change();
						}
					}
				});
			} else {
				checks.buttonset({
					create: function(e, ui) {
						num.prop('checked', true).change();
					}
				});
			}
			dialog = self.fmDialog(node, opts);
		};
	
	this.noChangeDirOnRemovedCwd = true;
	
	this.shortcuts = [{
		pattern : 'f2' + (fm.OS == 'mac' ? ' enter' : '')
	}, {
		pattern : 'shift+f2',
		description : 'batchRename',
		callback : function() {
			fm.selected().length > 1 && batchRename();
		}
	}];
	
	this.getstate = function(select) {
		var sel = this.files(select),
			cnt = sel.length,
			phash, ext, mime, brk, state, isRoot;
		
		if (!cnt) {
			return -1;
		}
		
		if (cnt > 1 && sel[0].phash) {
			phash = sel[0].phash;
			ext = fm.splitFileExtention(sel[0].name)[1].toLowerCase();
			mime = sel[0].mime;
		}
		if (cnt === 1) {
			isRoot = fm.isRoot(sel[0]);
		}

		state = (cnt === 1 && ((fm.cookieEnabled && isRoot) || !sel[0].locked) || (fm.api > 2.1030 && cnt === jQuery.grep(sel, function(f) {
			if (!brk && !f.locked && f.phash === phash && !fm.isRoot(f) && (mime === f.mime || ext === fm.splitFileExtention(f.name)[1].toLowerCase())) {
				return true;
			} else {
				brk && (brk = true);
				return false;
			}
		}).length)) ? 0 : -1;
		
		// because alwaysEnabled = true, it need check disabled on connector 
		if (!isRoot && state === 0 && fm.option('disabledFlip', sel[0].hash)['rename']) {
			state = -1;
		}

		if (state !== -1 && cnt > 1) {
			self.extra = {
				icon: 'preference',
				node: jQuery('<span></span>')
					.attr({title: fm.i18n('batchRename')})
					.on('click touchstart', function(e){
						if (e.type === 'touchstart' && e.originalEvent.touches.length > 1) {
							return;
						}
						e.stopPropagation();
						e.preventDefault();
						fm.getUI().trigger('click'); // to close the context menu immediately
						batchRename();
					})
			};
		} else {
			delete self.extra;
		}
			
		return state;
	};
	
	this.exec = function(hashes, cOpts) {
		var cwd      = fm.getUI('cwd'),
			sel      = hashes || (fm.selected().length? fm.selected() : false) || [fm.cwd().hash],
			cnt      = sel.length,
			file     = fm.file(sel.shift()),
			filename = '.elfinder-cwd-filename',
			opts     = cOpts || {},
			incwd    = (fm.cwd().hash == file.hash),
			type     = (opts._currentType === 'navbar' || opts._currentType === 'files')? opts._currentType : (incwd? 'navbar' : 'files'),
			navbar   = (type !== 'files'),
			target   = fm[navbar? 'navHash2Elm' : 'cwdHash2Elm'](file.hash),
			tarea    = (!navbar && fm.storage('view') != 'list'),
			split    = function(name) {
				var ext = fm.splitFileExtention(name)[1];
				return [name.substr(0, name.length - ext.length - 1), ext];
			},
			unselect = function() {
				requestAnimationFrame(function() {
					input && input.trigger('blur');
				});
			},
			rest     = function(){
				if (!overlay.is(':hidden')) {
					overlay.elfinderoverlay('hide').off('click close', cancel);
				}
				pnode.removeClass('ui-front')
					.css('position', '')
					.off('unselect.'+fm.namespace, unselect);
				if (tarea) {
					node && node.css('max-height', '');
				} else if (!navbar) {
					pnode.css('width', '')
						.parent('td').css('overflow', '');
				}
			}, colwidth,
			dfrd     = jQuery.Deferred()
				.fail(function(error) {
					var parent = input.parent(),
						name   = fm.escape(file.i18 || file.name);

					input.off();
					if (tarea) {
						name = name.replace(/([_.])/g, '&#8203;$1');
					}
					requestAnimationFrame(function() {
						if (navbar) {
							input.replaceWith(name);
						} else {
							if (parent.length) {
								input.remove();
								parent.html(name);
							} else {
								target.find(filename).html(name);
							}
						}
					});
					error && fm.error(error);
				})
				.always(function() {
					rest();
					fm.unbind('resize', resize);
					fm.enable();
				}),
			blur = function(e) {
				var name   = jQuery.trim(input.val()),
				splits = fm.splitFileExtention(name),
				valid  = true,
				req = function() {
					input.off();
					rest();
					if (navbar) {
						input.replaceWith(fm.escape(name));
					} else {
						node.html(fm.escape(name));
					}
					request(dfrd, sel, file, name);
				};

				if (!overlay.is(':hidden')) {
					pnode.css('z-index', '');
				}
				if (name === '') {
					if (!fm.isRoot(file)) {
						return cancel();
					}
					if (navbar) {
						input.replaceWith(fm.escape(file.name));
					} else {
						node.html(fm.escape(file.name));
					}
				}
				if (!inError && pnode.length) {
					
					input.off('blur');
					
					if (cnt === 1 && name === file.name) {
						return dfrd.reject();
					}
					if (fm.options.validName && fm.options.validName.test) {
						try {
							valid = fm.options.validName.test(name);
						} catch(e) {
							valid = false;
						}
					}
					if (name === '.' || name === '..' || !valid) {
						inError = true;
						fm.error(file.mime === 'directory'? 'errInvDirname' : 'errInvName', {modal: true, close: function(){setTimeout(select, 120);}});
						return false;
					}
					if (cnt === 1 && fm.fileByName(name, file.phash)) {
						inError = true;
						fm.error(['errExists', name], {modal: true, close: function(){setTimeout(select, 120);}});
						return false;
					}
					
					if (cnt === 1) {
						req();
					} else {
						fm.confirm({
							title : 'cmdrename',
							text  : ['renameMultiple', cnt, getHint(name, [file.hash].concat(sel))],
							accept : {
								label : 'btnYes',
								callback : req
							},
							cancel : {
								label : 'btnCancel',
								callback : function() {
									setTimeout(function() {
										inError = true;
										select();
									}, 120);
								}
							}
						});
						setTimeout(function() {
							fm.trigger('unselectfiles', {files: fm.selected()})
								.trigger('selectfiles', {files : [file.hash].concat(sel)});
						}, 120);
					}
				}
			},
			input = jQuery(tarea? '<textarea></textarea>' : '<input type="text"/>')
				.on('keyup text', function(){
					if (tarea) {
						this.style.height = '1px';
						this.style.height = this.scrollHeight + 'px';
					} else if (colwidth) {
						this.style.width = colwidth + 'px';
						if (this.scrollWidth > colwidth) {
							this.style.width = this.scrollWidth + 10 + 'px';
						}
					}
				})
				.on('keydown', function(e) {
					e.stopImmediatePropagation();
					if (e.keyCode == jQuery.ui.keyCode.ESCAPE) {
						dfrd.reject();
					} else if (e.keyCode == jQuery.ui.keyCode.ENTER) {
						e.preventDefault();
						input.trigger('blur');
					}
				})
				.on('mousedown click dblclick', function(e) {
					e.stopPropagation();
					if (e.type === 'dblclick') {
						e.preventDefault();
					}
				})
				.on('blur', blur)
				.on('dragenter dragleave dragover drop', function(e) {
					// stop bubbling to prevent upload with native drop event
					e.stopPropagation();
				}),
			select = function() {
				var name = fm.splitFileExtention(input.val())[0];
				if (!inError && fm.UA.Mobile && !fm.UA.iOS) { // since iOS has a bug? (z-index not effect) so disable it
					overlay.on('click close', cancel).elfinderoverlay('show');
					pnode.css('z-index', overlay.css('z-index') + 1);
				}
				! fm.enabled() && fm.enable();
				if (inError) {
					inError = false;
					input.on('blur', blur);
				}
				input.trigger('focus').trigger('select');
				input[0].setSelectionRange && input[0].setSelectionRange(0, name.length);
			},
			node = navbar? target.contents().filter(function(){ return this.nodeType==3 && jQuery(this).parent().attr('id') === fm.navHash2Id(file.hash); })
					: target.find(filename),
			pnode = node.parent(),
			overlay = fm.getUI('overlay'),
			cancel = function(e) { 
				if (!overlay.is(':hidden')) {
					pnode.css('z-index', '');
				}
				if (! inError) {
					dfrd.reject();
					if (e) {
						e.stopPropagation();
						e.preventDefault();
					}
				}
			},
			resize = function() {
				target.trigger('scrolltoview', {blink : false});
			},
			inError = false;
		
		pnode.addClass('ui-front')
			.css('position', 'relative')
			.on('unselect.'+fm.namespace, unselect);
		fm.bind('resize', resize);
		if (navbar) {
			node.replaceWith(input.val(file.name));
		} else {
			if (tarea) {
				node.css('max-height', 'none');
			} else if (!navbar) {
				colwidth = pnode.width();
				pnode.width(colwidth - 15)
					.parent('td').css('overflow', 'visible');
			}
			node.empty().append(input.val(file.name));
		}
		
		if (cnt > 1 && fm.api <= 2.1030) {
			return dfrd.reject();
		}
		
		if (!file || !node.length) {
			return dfrd.reject('errCmdParams', this.title);
		}
		
		if (file.locked && !fm.isRoot(file)) {
			return dfrd.reject(['errLocked', file.name]);
		}
		
		fm.one('select', function() {
			input.parent().length && file && jQuery.inArray(file.hash, fm.selected()) === -1 && input.trigger('blur');
		});
		
		input.trigger('keyup');
		
		select();
		
		return dfrd;
	};

	fm.bind('select contextmenucreate closecontextmenu', function(e) {
		var sel = (e.data? (e.data.selected || e.data.targets) : null) || fm.selected(),
			file;
		if (sel && sel.length === 1 && (file = fm.file(sel[0])) && fm.isRoot(file)) {
			self.title = fm.i18n('kindAlias') + ' (' + fm.i18n('preference') + ')';
		} else {
			self.title = fm.i18n('cmdrename');
		}
		if (e.type !== 'closecontextmenu') {
			self.update(void(0), self.title);
		} else {
			requestAnimationFrame(function() {
				self.update(void(0), self.title);
			});
		}
	}).remove(function(e) {
		var rootNames;
		if (e.data && e.data.removed && (rootNames = fm.storage('rootNames'))) {
			jQuery.each(e.data.removed, function(i, h) {
				if (rootNames[h]) {
					delete rootNames[h];
				}
			});
			fm.storage('rootNames', rootNames);
		}
	});
};
js/commands/rm.js000064400000034652151215013360007744 0ustar00/**
 * @class  elFinder command "rm"
 * Delete files
 *
 * @author Dmitry (dio) Levashov
 * @author Naoki Sawada
 **/
 elFinder.prototype.commands.rm = function() {
	"use strict";
	var self = this,
		fm = this.fm,
		tpl = '<div class="ui-helper-clearfix elfinder-rm-title"><span class="elfinder-cwd-icon {class} ui-corner-all"></span>{title}<div class="elfinder-rm-desc">{desc}</div></div>',
		confirm = function(dfrd, targets, files, tHash, addTexts) {
			var cnt = targets.length,
				cwd = fm.cwd().hash,
				descs = [],
				spinner = fm.i18n('calc') + '<span class="elfinder-spinner"></span>',
				dialog, text, tmb, size, f, fname;
			
			if (cnt > 1) {
				size = 0;
				jQuery.each(files, function(h, f) { 
					if (f.size && f.size != 'unknown' && f.mime !== 'directory') {
						var s = parseInt(f.size);
						if (s >= 0 && size >= 0) {
							size += s;
						}
					} else {
						size = 'unknown';
						return false;
					}
				});
				getSize = (size === 'unknown');
				descs.push(fm.i18n('size')+': '+(getSize? spinner : fm.formatSize(size)));
				text = [jQuery(tpl.replace('{class}', 'elfinder-cwd-icon-group').replace('{title}', '<strong>' + fm.i18n('items')+ ': ' + cnt + '</strong>').replace('{desc}', descs.join('<br>')))];
			} else {
				f = files[0];
				tmb = fm.tmb(f);
				getSize = (f.mime === 'directory');
				descs.push(fm.i18n('size')+': '+(getSize? spinner : fm.formatSize(f.size)));
				descs.push(fm.i18n('modify')+': '+fm.formatDate(f));
				fname = fm.escape(f.i18 || f.name).replace(/([_.])/g, '&#8203;$1');
				text = [jQuery(tpl.replace('{class}', fm.mime2class(f.mime)).replace('{title}', '<strong>' + fname + '</strong>').replace('{desc}', descs.join('<br>')))];
			}
			
			if (addTexts) {
				text = text.concat(addTexts);
			}
			
			text.push(tHash? 'confirmTrash' : 'confirmRm');
			
			dialog = fm.confirm({
				title  : self.title,
				text   : text,
				accept : {
					label    : 'btnRm',
					callback : function() {  
						if (tHash) {
							self.toTrash(dfrd, targets, tHash);
						} else {
							remove(dfrd, targets);
						}
					}
				},
				cancel : {
					label    : 'btnCancel',
					callback : function() {
						fm.unlockfiles({files : targets});
						if (targets.length === 1 && fm.file(targets[0]).phash !== cwd) {
							fm.select({selected : targets});
						} else {
							fm.selectfiles({files : targets});
						}
						dfrd.reject();
					}
				}
			});
			// load thumbnail
			if (tmb) {
				jQuery('<img/>')
					.on('load', function() { dialog.find('.elfinder-cwd-icon').addClass(tmb.className).css('background-image', "url('"+tmb.url+"')"); })
					.attr('src', tmb.url);
			}
			
			if (getSize) {
				getSize = fm.getSize(jQuery.map(files, function(f) { return f.mime === 'directory'? f.hash : null; })).done(function(data) {
					dialog.find('span.elfinder-spinner').parent().html(fm.i18n('size')+': '+data.formated);
				}).fail(function() {
					dialog.find('span.elfinder-spinner').parent().html(fm.i18n('size')+': '+fm.i18n('unknown'));
				}).always(function() {
					getSize = false;
				});
			}
		},
		toTrash = function(dfrd, targets, tHash) {
			var dsts = {},
				itemCnt = targets.length,
				maxCnt = self.options.toTrashMaxItems,
				checkDirs = [],
				reqDfd = jQuery.Deferred(),
				req, dirs, cnt;
			
			if (itemCnt > maxCnt) {
				self.confirm(dfrd, targets, self.files(targets), null, [fm.i18n('tooManyToTrash')]);
				return;
			}
			
			// Directory preparation preparation and directory enumeration
			jQuery.each(targets, function(i, h) {
				var file = fm.file(h),
					path = fm.path(h).replace(/\\/g, '/'),
					m = path.match(/^[^\/]+?(\/(?:[^\/]+?\/)*)[^\/]+?$/);
				
				if (file) {
					if (m) {
						m[1] = m[1].replace(/(^\/.*?)\/?$/, '$1');
						if (! dsts[m[1]]) {
							dsts[m[1]] = [];
						}
						dsts[m[1]].push(h);
					}
					if (file.mime === 'directory') {
						checkDirs.push(h);
					}
				}
			});
			
			// Check directory information
			if (checkDirs.length) {
				req = fm.request({
					data : {cmd : 'size', targets : checkDirs},
					notify : {type: 'readdir', cnt: 1, hideCnt: true},
					preventDefault : true
				}).done(function(data) {
					var cnt = 0;
					data.fileCnt && (cnt += parseInt(data.fileCnt));
					data.dirCnt && (cnt += parseInt(data.dirCnt));
					reqDfd[cnt > maxCnt ? 'reject' : 'resolve']();
				}).fail(function() {
					reqDfd.reject();
				});
				setTimeout(function() {
					var xhr = (req && req.xhr)? req.xhr : null;
					if (xhr && xhr.state() == 'pending') {
						req.syncOnFail(false);
						req.reject();
						reqDfd.reject();
					}
				}, self.options.infoCheckWait * 1000);
			} else {
				reqDfd.resolve();
			}
			
			// Directory creation and paste command execution
			reqDfd.done(function() {
				dirs = Object.keys(dsts);
				cnt = dirs.length;
				if (cnt) {
					fm.request({
						data   : {cmd  : 'mkdir', target : tHash, dirs : dirs}, 
						notify : {type : 'chkdir', cnt : cnt},
						preventFail : true
					})
					.fail(function(error) {
						dfrd.reject(error);
						fm.unlockfiles({files : targets});
					})
					.done(function(data) {
						var margeRes = function(data, phash, reqData) {
								var undo, prevUndo, redo, prevRedo;
								jQuery.each(data, function(k, v) {
									if (Array.isArray(v)) {
										if (res[k]) {
											res[k] = res[k].concat(v);
										} else {
											res[k] = v;
										}
									}
								});
								if (data.sync) {
									res.sync = 1;
								}
								if (data.added && data.added.length) {
									undo = function() {
										var targets = [],
											dirs    = jQuery.map(data.added, function(f) { return f.mime === 'directory'? f.hash : null; });
										jQuery.each(data.added, function(i, f) {
											if (jQuery.inArray(f.phash, dirs) === -1) {
												targets.push(f.hash);
											}
										});
										return fm.exec('restore', targets, {noToast: true});
									};
									redo = function() {
										return fm.request({
											data   : reqData,
											notify : {type : 'redo', cnt : targets.length}
										});
									};
									if (res.undo) {
										prevUndo = res.undo;
										res.undo = function() {
											undo();
											prevUndo();
										};
									} else {
										res.undo = undo;
									}
									if (res.redo) {
										prevRedo = res.redo;
										res.redo = function() {
											redo();
											prevRedo();
										};
									} else {
										res.redo = redo;
									}
								}
							},
							err = ['errTrash'],
							res = {},
							hasNtf = function() {
								return fm.ui.notify.children('.elfinder-notify-trash').length;
							},
							hashes, tm, prg, prgSt;
						
						if (hashes = data.hashes) {
							prg = 1 / cnt * 100;
							prgSt = cnt === 1? 100 : 5;
							tm = setTimeout(function() {
								fm.notify({type : 'trash', cnt : 1, hideCnt : true, progress : prgSt});
							}, fm.notifyDelay);
							jQuery.each(dsts, function(dir, files) {
								var phash = fm.file(files[0]).phash,
									reqData;
								if (hashes[dir]) {
									reqData = {cmd : 'paste', dst : hashes[dir], targets : files, cut : 1};
									fm.request({
										data : reqData,
										preventDefault : true
									})
									.fail(function(error) {
										if (error) {
											err = err.concat(error);
										}
									})
									.done(function(data) {
										data = fm.normalize(data);
										fm.updateCache(data);
										margeRes(data, phash, reqData);
										if (data.warning) {
											err = err.concat(data.warning);
											delete data.warning;
										}
										// fire some event to update cache/ui
										data.removed && data.removed.length && fm.remove(data);
										data.added   && data.added.length   && fm.add(data);
										data.changed && data.changed.length && fm.change(data);
										// fire event with command name
										fm.trigger('paste', data);
										// fire event with command name + 'done'
										fm.trigger('pastedone');
										// force update content
										data.sync && fm.sync();
									})
									.always(function() {
										var hashes = [], addTexts, end = 2;
										if (hasNtf()) {
											fm.notify({type : 'trash', cnt : 0, hideCnt : true, progress : prg});
										} else {
											prgSt+= prg;
										}
										if (--cnt < 1) {
											tm && clearTimeout(tm);
											hasNtf() && fm.notify({type : 'trash', cnt  : -1});
											fm.unlockfiles({files : targets});
											if (Object.keys(res).length) {
												if (err.length > 1) {
													if (res.removed || res.removed.length) {
														hashes = jQuery.grep(targets, function(h) {
															return jQuery.inArray(h, res.removed) === -1? true : false;
														});
													}
													if (hashes.length) {
														if (err.length > end) {
															end = (fm.messages[err[end-1]] || '').indexOf('$') === -1? end : end + 1;
														}
														dfrd.reject();
														fm.exec('rm', hashes, { addTexts: err.slice(0, end), forceRm: true });
													} else {
														fm.error(err);
													}
												}
												res._noSound = true;
												if (res.undo && res.redo) {
													res.undo = {
														cmd : 'trash',
														callback : res.undo,
													};
													res.redo = {
														cmd : 'trash',
														callback : res.redo
													};
												}
												dfrd.resolve(res);
											} else {
												dfrd.reject(err);
											}
										}
									});
								}
							});
						} else {
							dfrd.reject('errFolderNotFound');
							fm.unlockfiles({files : targets});
						}
					});
				} else {
					dfrd.reject(['error', 'The folder hierarchy to be deleting can not be determined.']);
					fm.unlockfiles({files : targets});
				}
			}).fail(function() {
				self.confirm(dfrd, targets, self.files(targets), null, [fm.i18n('tooManyToTrash')]);
			});
		},
		remove = function(dfrd, targets, quiet) {
			var notify = quiet? {} : {type : 'rm', cnt : targets.length};
			fm.request({
				data   : {cmd  : 'rm', targets : targets}, 
				notify : notify,
				preventFail : true
			})
			.fail(function(error) {
				dfrd.reject(error);
			})
			.done(function(data) {
				if (data.error || data.warning) {
					data.sync = true;
				}
				dfrd.resolve(data);
			})
			.always(function() {
				fm.unlockfiles({files : targets});
			});
		},
		getTHash = function(targets) {
			var thash = null,
				root1st;
			
			if (targets && targets.length) {
				if (targets.length > 1 && fm.searchStatus.state === 2) {
					root1st = fm.file(fm.root(targets[0])).volumeid;
					if (!jQuery.grep(targets, function(h) { return h.indexOf(root1st) !== 0? true : false ; }).length) {
						thash = fm.option('trashHash', targets[0]);
					}
				} else {
					thash = fm.option('trashHash', targets[0]);
				}
			}
			return thash;
		},
		getSize = false;
	
	// for to be able to overwrite
	this.confirm = confirm;
	this.toTrash = toTrash;
	this.remove = remove;

	this.syncTitleOnChange = true;
	this.updateOnSelect = false;
	this.shortcuts = [{
		pattern     : 'delete ctrl+backspace shift+delete'
	}];
	this.value = 'rm';
	
	this.init = function() {
		var update = function(origin) {
			var targets;
			delete self.extra;
			self.title = fm.i18n('cmd' + self.value);
			self.className = self.value;
			self.button && self.button.children('span.elfinder-button-icon')[self.value === 'trash'? 'addClass' : 'removeClass']('elfinder-button-icon-trash');
			if (origin && origin !== 'cwd' && (self.state > -1 || origin === 'navbar')) {
				if (self.value === 'trash') {
					self.extra = {
						icon: 'rm',
						node: jQuery('<span></span>')
							.attr({title: fm.i18n('cmdrm')})
							.on('ready', function(e, data) {
								targets = data.targets;
							})
							.on('click touchstart', function(e){
								if (e.type === 'touchstart' && e.originalEvent.touches.length > 1) {
									return;
								}
								e.stopPropagation();
								e.preventDefault();
								fm.getUI().trigger('click'); // to close the context menu immediately
								fm.exec('rm', targets, {_userAction: true, forceRm : true});
							})
					};
				}
			}
		};
		// re-assign for extended command
		self = this;
		fm = this.fm;
		// bind function of change
		self.change(function() {
			update();
		});
		fm.bind('contextmenucreate', function(e) {
			update(e.data.type);
		});
	};
	
	this.getstate = function(select) {
		var sel   = this.hashes(select),
			filter = function(files) {
				var fres = true;
				return jQuery.grep(files, function(h) {
					var f;
					fres = fres && (f = fm.file(h)) && ! f.locked && ! fm.isRoot(f)? true : false;
					return fres;
				});
			};
		
		return sel.length && filter(sel).length == sel.length ? 0 : -1;
	};
	
	this.exec = function(hashes, cOpts) {
		var opts   = cOpts || {},
			dfrd   = jQuery.Deferred()
				.always(function() {
					if (getSize && getSize.state && getSize.state() === 'pending') {
						getSize.reject();
					}
				})
				.fail(function(error) {
					error && fm.error(error);
				}).done(function(data) {
					!opts.quiet && !data._noSound && data.removed && data.removed.length && fm.trigger('playsound', {soundFile : 'rm.wav'});
				}),
			files  = self.files(hashes),
			cnt    = files.length,
			tHash  = null,
			addTexts = opts.addTexts? opts.addTexts : null,
			forceRm = opts.forceRm,
			quiet = opts.quiet,
			targets;

		if (! cnt) {
			return dfrd.reject();
		}
		
		jQuery.each(files, function(i, file) {
			if (fm.isRoot(file)) {
				return !dfrd.reject(['errRm', file.name, 'errPerm']);
			}
			if (file.locked) {
				return !dfrd.reject(['errLocked', file.name]);
			}
		});

		if (dfrd.state() === 'pending') {
			targets = self.hashes(hashes);
			cnt     = files.length;
			
			if (forceRm || (self.event && self.event.originalEvent && self.event.originalEvent.shiftKey)) {
				tHash = '';
				self.title = fm.i18n('cmdrm');
			}
			
			if (tHash === null) {
				tHash = getTHash(targets);
			}
			
			fm.lockfiles({files : targets});
			
			if (tHash && self.options.quickTrash) {
				self.toTrash(dfrd, targets, tHash);
			} else {
				if (quiet) {
					remove(dfrd, targets, quiet);
				} else {
					self.confirm(dfrd, targets, files, tHash, addTexts);
				}
			}
		}
			
		return dfrd;
	};

	fm.bind('select contextmenucreate closecontextmenu', function(e) {
		var targets = (e.data? (e.data.selected || e.data.targets) : null) || fm.selected();
		if (targets && targets.length) {
			self.update(void(0), (targets? getTHash(targets) : fm.option('trashHash'))? 'trash' : 'rm');
		}
	});

};
js/commands/view.js000064400000005464151215013360010277 0ustar00/**
 * @class  elFinder command "view"
 * Change current directory view (icons/list)
 *
 * @author Dmitry (dio) Levashov
 **/
elFinder.prototype.commands.view = function() {
	"use strict";
	var self = this,
		fm = this.fm,
		subMenuRaw;
	this.value          = fm.viewType;
	this.alwaysEnabled  = true;
	this.updateOnSelect = false;

	this.options = { ui : 'viewbutton'};
	
	this.getstate = function() {
		return 0;
	};
	
	this.extra = {
		icon: 'menu',
		node: jQuery('<span></span>')
			.attr({title: fm.i18n('viewtype')})
			.on('click touchstart', function(e){
				if (e.type === 'touchstart' && e.originalEvent.touches.length > 1) {
					return;
				}
				var node = jQuery(this);
				e.stopPropagation();
				e.preventDefault();
				fm.trigger('contextmenu', {
					raw: getSubMenuRaw(),
					x: node.offset().left,
					y: node.offset().top
				});
			})
	};

	this.exec = function() {
		var self  = this,
			value = this.value == 'list' ? 'icons' : 'list';
			
		fm.storage('view', value);
		return fm.lazy(function() {
			fm.viewchange();
			self.update(void(0), value);
			this.resolve();
		});
	};

	fm.bind('init', function() {
		subMenuRaw = (function() {
			var cwd = fm.getUI('cwd'),
				raws = [],
				sizeNames = fm.options.uiOptions.cwd.iconsView.sizeNames,
				max = fm.options.uiOptions.cwd.iconsView.sizeMax,
				i, size;
			for (i = 0; i <= max; i++) {
				raws.push(
					{
						label    : fm.i18n(sizeNames[i] || ('Size-' + i + ' icons')),
						icon     : 'view',
						callback : (function(s) {
							return function() {
								cwd.trigger('iconpref', {size: s});
								fm.storage('iconsize', s);
								if (self.value === 'list') {
									self.exec();
								}
							};
						})(i)
					}
				);
			}
			raws.push('|');
			raws.push(
				{
					label    : fm.i18n('viewlist'),
					icon     : 'view-list',
					callback : function() {
						if (self.value !== 'list') {
							self.exec();
						}
					}
				}		
			);
			return raws;
		})();
	}).bind('contextmenucreate', function() {
		self.extra = {
			icon: 'menu',
			node: jQuery('<span></span>')
				.attr({title: fm.i18n('cmdview')})
				.on('click touchstart', function(e){
					if (e.type === 'touchstart' && e.originalEvent.touches.length > 1) {
						return;
					}
					var node = jQuery(this),
						raw = subMenuRaw.concat(),
						idx, i;
					if (self.value === 'list') {
						idx = subMenuRaw.length - 1;
					} else {
						idx = parseInt(fm.storage('iconsize') || 0);
					}
					for (i = 0; i < subMenuRaw.length; i++) {
						if (subMenuRaw[i] !== '|') {
							subMenuRaw[i].options = (i === idx? {'className': 'ui-state-active'} : void(0))
							;
						}
					}
					e.stopPropagation();
					e.preventDefault();
					fm.trigger('contextmenu', {
						raw: subMenuRaw,
						x: node.offset().left,
						y: node.offset().top
					});
				})
		};
	});

};
js/commands/forward.js000064400000000775151215013360010771 0ustar00/**
 * @class  elFinder command "forward"
 * Open next visited folder
 *
 * @author Dmitry (dio) Levashov
 **/
(elFinder.prototype.commands.forward = function() {
	"use strict";
	this.alwaysEnabled = true;
	this.updateOnSelect = true;
	this.shortcuts = [{
		pattern     : 'ctrl+right'
	}];
	
	this.getstate = function() {
		return this.fm.history.canForward() ? 0 : -1;
	};
	
	this.exec = function() {
		return this.fm.history.forward();
	};
	
}).prototype = { forceLoad : true }; // this is required command
js/commands/selectnone.js000064400000001022151215013360011446 0ustar00/**
 * @class  elFinder command "selectnone"
 * Unselect ALL of cwd items
 *
 * @author Naoki Sawada
 **/
elFinder.prototype.commands.selectnone = function() {
	"use strict";
	var self = this,
		fm = this.fm,
		state = -1;
	
	fm.bind('select', function(e) {
		state = (e.data && e.data.unselectall)? -1 : 0;
	});
	
	this.state = -1;
	this.updateOnSelect = false;
	
	this.getstate = function() {
		return state;
	};
	
	this.exec = function() {
		fm.getUI('cwd').trigger('unselectall');
		return jQuery.Deferred().resolve();
	};
};
js/commands/hidden.js000064400000000424151215013360010547 0ustar00/**
 * @class  elFinder command "hidden"
 * Always hidden command for uiCmdMap
 *
 * @author Naoki Sawada
 **/
elFinder.prototype.commands.hidden = function() {
	"use strict";
	this.hidden = true;
	this.updateOnSelect = false;
	this.getstate = function() {
		return -1;
	};
};js/commands/archive.js000064400000004742151215013360010744 0ustar00/**
 * @class  elFinder command "archive"
 * Archive selected files
 *
 * @author Dmitry (dio) Levashov
 **/
 elFinder.prototype.commands.archive = function() {
	"use strict";
	var self  = this,
		fm    = self.fm,
		mimes = [],
		dfrd;
		
	this.variants = [];
	
	this.disableOnSearch = false;
	
	this.nextAction = {};
	
	/**
	 * Update mimes on open/reload
	 *
	 * @return void
	 **/
	fm.bind('open reload', function() {
		self.variants = [];
		jQuery.each((mimes = fm.option('archivers')['create'] || []), function(i, mime) {
			self.variants.push([mime, fm.mime2kind(mime)]);
		});
		self.change();
	});
	
	this.getstate = function(select) {
		var sel = this.files(select),
			cnt = sel.length,
			chk = (cnt && ! fm.isRoot(sel[0]) && (fm.file(sel[0].phash) || {}).write),
			filter = function(files) {
				var fres = true;
				return jQuery.grep(files, function(f) {
					fres = fres && f.read && f.hash.indexOf(cwdId) === 0 ? true : false;
					return fres;
				});
			},
			cwdId;
		
		if (chk && fm.searchStatus.state > 1) {
			if (chk = (cnt === filter(sel).length)) {
				cwdId = fm.cwd().volumeid;
			}
		}
		
		return chk && !this._disabled && mimes.length && (cnt || (dfrd && dfrd.state() == 'pending')) ? 0 : -1;
	};
	
	this.exec = function(hashes, type) {
		var files = this.files(hashes),
			cnt   = files.length,
			mime  = type || mimes[0],
			cwd   = fm.file(files[0].phash) || null,
			error = ['errArchive', 'errPerm', 'errCreatingTempDir', 'errFtpDownloadFile', 'errFtpUploadFile', 'errFtpMkdir', 'errArchiveExec', 'errExtractExec', 'errRm'],
			i, open;

		dfrd = jQuery.Deferred().fail(function(error) {
			error && fm.error(error);
		});

		if (! (cnt && mimes.length && jQuery.inArray(mime, mimes) !== -1)) {
			return dfrd.reject();
		}
		
		if (!cwd.write) {
			return dfrd.reject(error);
		}
		
		for (i = 0; i < cnt; i++) {
			if (!files[i].read) {
				return dfrd.reject(error);
			}
		}

		self.mime   = mime;
		self.prefix = ((cnt > 1)? 'Archive' : files[0].name) + (fm.option('archivers')['createext']? '.' + fm.option('archivers')['createext'][mime] : '');
		self.data   = {targets : self.hashes(hashes), type : mime};
		
		if (fm.cwd().hash !== cwd.hash) {
			open = fm.exec('open', cwd.hash).done(function() {
				fm.one('cwdrender', function() {
					fm.selectfiles({files : hashes});
					dfrd = jQuery.proxy(fm.res('mixin', 'make'), self)();
				});
			});
		} else {
			fm.selectfiles({files : hashes});
			dfrd = jQuery.proxy(fm.res('mixin', 'make'), self)();
		}
		
		return dfrd;
	};

};
js/commands/up.js000064400000001306151215013360007740 0ustar00/**
 * @class  elFinder command "up"
 * Go into parent directory
 *
 * @author Dmitry (dio) Levashov
 **/
(elFinder.prototype.commands.up = function() {
	"use strict";
	this.alwaysEnabled = true;
	this.updateOnSelect = false;
	
	this.shortcuts = [{
		pattern     : 'ctrl+up'
	}];
	
	this.getstate = function() {
		return this.fm.cwd().phash ? 0 : -1;
	};
	
	this.exec = function() {
		var fm = this.fm,
			cwdhash = fm.cwd().hash;
		return this.fm.cwd().phash ? this.fm.exec('open', this.fm.cwd().phash).done(function() {
			fm.one('opendone', function() {
				fm.selectfiles({files : [cwdhash]});
			});
		}) : jQuery.Deferred().reject();
	};

}).prototype = { forceLoad : true }; // this is required command
js/commands/places.js000064400000001405151215013360010563 0ustar00/**
 * @class  elFinder command "places"
 * Regist to Places
 *
 * @author Naoki Sawada
 **/
 elFinder.prototype.commands.places = function() {
	"use strict";
	var self   = this,
	fm     = this.fm,
	filter = function(hashes) {
		var fres = true;
		return jQuery.grep(self.files(hashes), function(f) {
			fres = fres && f.mime == 'directory' ? true : false;
			return fres;
		});
	},
	places = null;
	
	this.getstate = function(select) {
		var sel = this.hashes(select),
		cnt = sel.length;
		
		return  places && cnt && cnt == filter(sel).length ? 0 : -1;
	};
	
	this.exec = function(hashes) {
		var files = this.files(hashes);
		places.trigger('regist', [ files ]);
		return jQuery.Deferred().resolve();
	};
	
	fm.one('load', function(){
		places = fm.ui.places;
	});

};
js/commands/selectinvert.js000064400000000727151215013360012031 0ustar00/**
 * @class  elFinder command "selectinvert"
 * Invert Selection of cwd items
 *
 * @author Naoki Sawada
 **/
elFinder.prototype.commands.selectinvert = function() {
	"use strict";
	this.updateOnSelect = false;
	
	this.getstate = function() {
		return 0;
	};
	
	this.exec = function() {
		jQuery(document).trigger(jQuery.Event('keydown', { keyCode: 73, ctrlKey : true, shiftKey : true, altKey : false, metaKey : false }));
		return jQuery.Deferred().resolve();
	};

};
js/commands/empty.js000064400000006503151215013360010456 0ustar00/**
 * @class elFinder command "empty".
 * Empty the folder
 *
 * @type  elFinder.command
 * @author  Naoki Sawada
 */
 elFinder.prototype.commands.empty = function() {
	"use strict";
	var self, fm,
		selFiles = function(select) {
			var sel = self.files(select);
			if (!sel.length) {
				sel = [ fm.cwd() ];
			}
			return sel;
		};
	
	this.linkedCmds = ['rm'];
	
	this.init = function() {
		// lazy assign to make possible to become superclass
		self = this;
		fm = this.fm;
	};

	this.getstate = function(select) {
		var sel = selFiles(select),
			cnt,
			filter = function(files) {
				var fres = true;
				return jQuery.grep(files, function(f) {
					fres = fres && f.read && f.write && f.mime === 'directory' ? true : false;
					return fres;
				});
			};
		
		cnt = sel.length;
		return filter(sel).length == cnt ? 0 : -1;
	};
	
	this.exec = function(hashes) {
		var dirs = selFiles(hashes),
			cnt  = dirs.length,
			dfrd = jQuery.Deferred()
				.done(function() {
					var data = {changed: {}};
					fm.toast({msg: fm.i18n(['"'+success.join('", ')+'"', 'complete', fm.i18n('cmdempty')])});
					jQuery.each(dirs, function(i, dir) {
						data.changed[dir.hash] = dir;
					});
					fm.change(data);
				})
				.always(function() {
					var cwd = fm.cwd().hash;
					fm.trigger('selectfiles', {files: jQuery.map(dirs, function(d) { return cwd === d.phash? d.hash : null; })});
				}),
			success = [],
			done = function(res) {
				if (typeof res === 'number') {
					success.push(dirs[res].name);
					delete dirs[res].dirs;
				} else {
					res && fm.error(res);
				}
				(--cnt < 1) && dfrd[success.length? 'resolve' : 'reject']();
			};

		jQuery.each(dirs, function(i, dir) {
			var tm;
			if (!(dir.write && dir.mime === 'directory')) {
				done(['errEmpty', dir.name, 'errPerm']);
				return null;
			}
			if (!fm.isCommandEnabled('rm', dir.hash)) {
				done(['errCmdNoSupport', '"rm"']);
				return null;
			}
			tm = setTimeout(function() {
				fm.notify({type : 'search', cnt : 1, hideCnt : cnt > 1? false : true});
			}, fm.notifyDelay);
			fm.request({
				data : {cmd  : 'open', target : dir.hash},
				preventDefault : true,
				asNotOpen : true
			}).done(function(data) {
				var targets = [];
				tm && clearTimeout(tm);
				if (fm.ui.notify.children('.elfinder-notify-search').length) {
					fm.notify({type : 'search', cnt : -1, hideCnt : cnt > 1? false : true});
				}
				if (data && data.files && data.files.length) {
					if (data.files.length > fm.maxTargets) {
						done(['errEmpty', dir.name, 'errMaxTargets', fm.maxTargets]);
					} else {
						fm.updateCache(data);
						jQuery.each(data.files, function(i, f) {
							if (!f.write || f.locked) {
								done(['errEmpty', dir.name, 'errRm', f.name, 'errPerm']);
								targets = [];
								return false;
							}
							targets.push(f.hash);
						});
						if (targets.length) {
							fm.exec('rm', targets, { _userAction : true, addTexts : [ fm.i18n('folderToEmpty', dir.name) ] })
							.fail(function(error) {
								fm.trigger('unselectfiles', {files: fm.selected()});
								done(fm.parseError(error) || '');
							})
							.done(function() { done(i); });
						}
					}
				} else {
					fm.toast({ mode: 'warning', msg: fm.i18n('filderIsEmpty', dir.name)});
					done('');
				}
			}).fail(function(error) {
				done(fm.parseError(error) || '');
			});
		});
		
		return dfrd;
	};

};
js/commands/sort.js000064400000010505151215013360010304 0ustar00/**
 * @class  elFinder command "sort"
 * Change sort files rule
 *
 * @author Dmitry (dio) Levashov
 **/
elFinder.prototype.commands.sort = function() {
	"use strict";
	var self  = this,
		fm    = self.fm,
		setVar = function() {
			self.variants = [];
			jQuery.each(fm.sortRules, function(name, value) {
				if (fm.sorters[name]) {
					var arr = (name === fm.sortType)? (fm.sortOrder === 'asc'? 'n' : 's') : '';
					self.variants.push([name, (arr? '<span class="ui-icon ui-icon-arrowthick-1-'+arr+'"></span>' : '') + '&nbsp;' + fm.i18n('sort'+name)]);
				}
			});
			self.variants.push('|');
			self.variants.push([
				'stick',
				(fm.sortStickFolders? '<span class="ui-icon ui-icon-check"></span>' : '') + '&nbsp;' + fm.i18n('sortFoldersFirst')
			]);
			if (fm.ui.tree && fm.options.sortAlsoTreeview !== null) {
				self.variants.push('|');
				self.variants.push([
					'tree',
					(fm.sortAlsoTreeview? '<span class="ui-icon ui-icon-check"></span>' : '') + '&nbsp;' + fm.i18n('sortAlsoTreeview')
				]);
			}
			updateContextmenu();
		},
		updateContextmenu = function() {
			var cm = fm.getUI('contextmenu'),
				icon, sub;
			if (cm.is(':visible')) {
				icon = cm.find('span.elfinder-button-icon-sort');
				sub = icon.siblings('div.elfinder-contextmenu-sub');
				sub.find('span.ui-icon').remove();
				sub.children('div.elfinder-contextsubmenu-item').each(function() {
					var tgt = jQuery(this).children('span'),
						name = tgt.text().trim(),
						arr;
					if (name === (i18Name.stick || (i18Name.stick = fm.i18n('sortFoldersFirst')))) {
						if (fm.sortStickFolders) {
							tgt.prepend('<span class="ui-icon ui-icon-check"></span>');
						}
					} else if (name === (i18Name.tree || (i18Name.tree = fm.i18n('sortAlsoTreeview')))) {
						if (fm.sortAlsoTreeview) {
							tgt.prepend('<span class="ui-icon ui-icon-check"></span>');
						}
					} else if (name === (i18Name[fm.sortType] || (i18Name[fm.sortType] = fm.i18n('sort' + fm.sortType)))) {
						arr = fm.sortOrder === 'asc'? 'n' : 's';
						tgt.prepend('<span class="ui-icon ui-icon-arrowthick-1-'+arr+'"></span>');
					}
				});
			}
		},
		i18Name = {};
	
	/**
	 * Command options
	 *
	 * @type  Object
	 */
	this.options = {ui : 'sortbutton'};
	
	this.keepContextmenu = true;

	fm.bind('sortchange', setVar)
	.bind('sorterupdate', function() {
		setVar();
		fm.getUI().children('.elfinder-button-sort-menu').children('.elfinder-button-menu-item').each(function() {
			var tgt = jQuery(this),
				rel = tgt.attr('rel');
			tgt.toggle(!!(! rel || fm.sorters[rel]));
		});
	})
	.bind('cwdrender', function() {
		var cols = jQuery(fm.cwd).find('div.elfinder-cwd-wrapper-list table');
		if (cols.length) {
			jQuery.each(fm.sortRules, function(name, value) {
				var td = cols.find('thead tr td.elfinder-cwd-view-th-'+name);
				if (td.length) {
					var current = ( name == fm.sortType),
					sort = {
						type  : name,
						order : current ? fm.sortOrder == 'asc' ? 'desc' : 'asc' : fm.sortOrder
					},arr;
					if (current) {
						td.addClass('ui-state-active');
						arr = fm.sortOrder == 'asc' ? 'n' : 's';
						jQuery('<span class="ui-icon ui-icon-triangle-1-'+arr+'"></span>').appendTo(td);
					}
					jQuery(td).on('click', function(e){
						if (! jQuery(this).data('dragging')) {
							e.stopPropagation();
							if (! fm.getUI('cwd').data('longtap')) {
								fm.exec('sort', [], sort);
							}
						}
					})
					.on('mouseenter mouseleave', function(e) {
						jQuery(this).toggleClass('ui-state-hover', e.type === 'mouseenter');
					});
				}
				
			});
		}
	});
	
	this.getstate = function() {
		return 0;
	};
	
	this.exec = function(hashes, cOpt) {
		var fm = this.fm,
			sortopt = jQuery.isPlainObject(cOpt)? cOpt : (function() {
				cOpt += '';
				var sOpts = {};
				if (cOpt === 'stick') {
					sOpts.stick = !fm.sortStickFolders;
				} else if (cOpt === 'tree') {
					sOpts.tree = !fm.sortAlsoTreeview;
				} else if (fm.sorters[cOpt]) {
					if (fm.sortType === cOpt) {
						sOpts.order = fm.sortOrder === 'asc'? 'desc' : 'asc';
					} else {
						sOpts.type = cOpt;
					}
				}
				return sOpts;
			})(),
			sort = Object.assign({
				type  : fm.sortType,
				order : fm.sortOrder,
				stick : fm.sortStickFolders,
				tree  : fm.sortAlsoTreeview
			}, sortopt);

		return fm.lazy(function() {
			fm.setSort(sort.type, sort.order, sort.stick, sort.tree);
			this.resolve();
		});
	};

};
js/commands/back.js000064400000001000151215013360010203 0ustar00/**
 * @class  elFinder command "back"
 * Open last visited folder
 *
 * @author Dmitry (dio) Levashov
 **/
(elFinder.prototype.commands.back = function() {
	"use strict";
	this.alwaysEnabled  = true;
	this.updateOnSelect = false;
	this.shortcuts      = [{
		pattern     : 'ctrl+left backspace'
	}];
	
	this.getstate = function() {
		return this.fm.history.canBack() ? 0 : -1;
	};
	
	this.exec = function() {
		return this.fm.history.back();
	};

}).prototype = { forceLoad : true }; // this is required command
js/commands/edit.js000064400000104756151215013360010256 0ustar00/**
 * @class elFinder command "edit". 
 * Edit text file in dialog window
 *
 * @author Dmitry (dio) Levashov, dio@std42.ru
 **/
 elFinder.prototype.commands.edit = function() {
	"use strict";
	var self  = this,
		fm    = this.fm,
		clsEditing = fm.res('class', 'editing'),
		mimesSingle = [],
		mimes = [],
		allowAll = false,
		rtrim = function(str){
			return str.replace(/\s+$/, '');
		},
		getEncSelect = function(heads) {
			var sel = jQuery('<select class="ui-corner-all"></select>'),
				hval;
			if (heads) {
				jQuery.each(heads, function(i, head) {
					hval = fm.escape(head.value);
					sel.append('<option value="'+hval+'">'+(head.caption? fm.escape(head.caption) : hval)+'</option>');
				});
			}
			jQuery.each(self.options.encodings, function(i, v) {
				sel.append('<option value="'+v+'">'+v+'</option>');
			});
			return sel;
		},
		getDlgWidth = function() {
			var win = fm.options.dialogContained? fm.getUI() : jQuery(window),
				m, width;
			if (typeof self.options.dialogWidth === 'string' && (m = self.options.dialogWidth.match(/(\d+)%/))) {
				width = parseInt(win.width() * (m[1] / 100));
			} else {
				width = parseInt(self.options.dialogWidth || 650);
			}
			return Math.min(width, win.width());
		},
		getDlgHeight = function() {
			if (!self.options.dialogHeight) {
				return void(0);
			}
			var win = fm.options.dialogContained? fm.getUI() : jQuery(window),
				m, height;
			if (typeof self.options.dialogHeight === 'string' && (m = self.options.dialogHeight.match(/(\d+)%/))) {
				height = parseInt(win.height() * (m[1] / 100));
			} else {
				height = parseInt(self.options.dialogHeight || win.height());
			}
			return Math.min(height, win.height());
		},

		/**
		 * Return files acceptable to edit
		 *
		 * @param  Array  files hashes
		 * @return Array
		 **/
		filter = function(files) {
			var cnt = files.length,
				mime, ext, skip;
			
			if (cnt > 1) {
				mime = files[0].mime;
				ext = files[0].name.replace(/^.*(\.[^.]+)$/, '$1');
			}
			return jQuery.grep(files, function(file) {
				var res;
				if (skip || file.mime === 'directory') {
					return false;
				}
				res = file.read
					&& (allowAll || fm.mimeIsText(file.mime) || jQuery.inArray(file.mime, cnt === 1? mimesSingle : mimes) !== -1) 
					&& (!self.onlyMimes.length || jQuery.inArray(file.mime, self.onlyMimes) !== -1)
					&& (cnt === 1 || (file.mime === mime && file.name.substr(ext.length * -1) === ext))
					&& (fm.uploadMimeCheck(file.mime, file.phash)? true : false)
					&& setEditors(file, cnt)
					&& Object.keys(editors).length;
				if (!res) {
					skip = true;
				}
				return res;
			});
		},

		fileSync = function(hash) {
			var old = fm.file(hash),
				f;
			fm.request({
				cmd: 'info',
				targets: [hash],
				preventDefault: true
			}).done(function(data) {
				var changed;
				if (data && data.files && data.files.length) {
					f = data.files[0];
					if (old.ts != f.ts || old.size != f.size) {
						changed = { changed: [ f ] };
						fm.updateCache(changed);
						fm.change(changed);
					}
				}
			});
		},

		/**
		 * Open dialog with textarea to edit file
		 *
		 * @param  String  id       dialog id
		 * @param  Object  file     file object
		 * @param  String  content  file content
		 * @return jQuery.Deferred
		 **/
		dialog = function(id, file, content, encoding, editor, toasts) {

			var dfrd = jQuery.Deferred(),
				_loaded = false,
				loaded = function() {
					if (!_loaded) {
						fm.toast({
							mode: 'warning',
							msg: fm.i18n('nowLoading')
						});
						return false;
					}
					return true;
				},
				makeToasts = function() {
					// make toast message
					if (toasts && Array.isArray(toasts)) {
						jQuery.each(toasts, function() {
							this.msg && fm.toast(this);
						});
					}
				},
				save = function() {
					var encord = selEncoding? selEncoding.val():void(0),
						saveDfd = jQuery.Deferred().fail(function(err) {
							dialogNode.show().find('button.elfinder-btncnt-0,button.elfinder-btncnt-1').hide();
						}),
						conf, res, tm;
					if (!loaded()) {
						return saveDfd.resolve();
					}
					if (ta.editor) {
						ta.editor.save(ta[0], ta.editor.instance);
						conf = ta.editor.confObj;
						if (conf.info && (conf.info.schemeContent || conf.info.arrayBufferContent)) {
							encord = 'scheme';
						}
					}
					res = getContent();
					setOld(res);
					if (res.promise) {
						tm = setTimeout(function() {
							fm.notify({
								type : 'chkcontent',
								cnt : 1,
								hideCnt: true,
								cancel : function() {
									res.reject();
								}
							});
						}, 100);
						res.always(function() {
							tm && clearTimeout(tm);
							fm.notify({ type : 'chkcontent', cnt: -1 });
						}).done(function(data) {
							dfrd.notifyWith(ta, [encord, ta.data('hash'), old, saveDfd]);
						}).fail(function(err) {
							saveDfd.reject(err);
						});
					} else {
						dfrd.notifyWith(ta, [encord, ta.data('hash'), old, saveDfd]);
					}
					return saveDfd;
				},
				saveon = function() {
					if (!loaded()) { return; }
					save().fail(function(err) {
						err && fm.error(err);
					});
				},
				cancel = function() {
					ta.elfinderdialog('close');
				},
				savecl = function() {
					if (!loaded()) { return; }
					dialogNode.hide();
					save().done(function() {
						_loaded = false;
						dialogNode.show();
						cancel();
					}).fail(function(err) {
						dialogNode.show();
						err && fm.error(err);
					});
				},
				saveAs = function() {
					if (!loaded()) { return; }
					var prevOld = old,
						phash = file.phash,
						fail = function(err) {
							dialogs.addClass(clsEditing).fadeIn(function() {
								err && fm.error(err);
							});
							old = prevOld;
							fm.disable();
						},
						make = function() {
							self.mime = saveAsFile.mime || file.mime;
							self.prefix = (saveAsFile.name || file.name).replace(/ \d+(\.[^.]+)?$/, '$1');
							self.requestCmd = 'mkfile';
							self.nextAction = {};
							self.data = {target : phash};
							jQuery.proxy(fm.res('mixin', 'make'), self)()
								.done(function(data) {
									var oldHash;
									if (data.added && data.added.length) {
										oldHash = ta.data('hash');
										ta.data('hash', data.added[0].hash);
										save().done(function() {
											_loaded = false;
											dialogNode.show();
											cancel();
											dialogs.fadeIn();
										}).fail(function() {
											fm.exec('rm', [data.added[0].hash], { forceRm: true, quiet: true });
											ta.data('hash', oldHash);
											dialogNode.find('button.elfinder-btncnt-2').hide();
											fail();
										});
									} else {
										fail();
									}
								})
								.progress(function(err) {
									if (err && err === 'errUploadMime') {
										ta.trigger('saveAsFail');
									}
								})
								.fail(fail)
								.always(function() {
									delete self.mime;
									delete self.prefix;
									delete self.nextAction;
									delete self.data;
								});
							fm.trigger('unselectfiles', { files: [ file.hash ] });
						},
						reqOpen = null,
						reqInfo = null,
						dialogs = fm.getUI().children('.' + self.dialogClass + ':visible');
						if (dialogNode.is(':hidden')) {
							dialogs = dialogs.add(dialogNode);
						}
						dialogs.removeClass(clsEditing).fadeOut();
					
					fm.enable();
					
					if (fm.searchStatus.state < 2 && phash !== fm.cwd().hash) {
						reqOpen = fm.exec('open', [phash], {thash: phash});
					} else if (!fm.file(phash)) {
						reqInfo = fm.request({cmd: 'info', targets: [phash]}); 
					}
					
					jQuery.when([reqOpen, reqInfo]).done(function() {
						if (reqInfo) {
							fm.one('infodone', function() {
								fm.file(phash)? make() : fail('errFolderNotFound');
							});
						} else {
							reqOpen? fm.one('cwdrender', make) : make();
						}
					}).fail(fail);
				},
				changed = function() {
					var dfd = jQuery.Deferred(),
						res, tm;
					if (!_loaded) {
						return dfd.resolve(false);
					}
					ta.editor && ta.editor.save(ta[0], ta.editor.instance);
					res = getContent();
					if (res && res.promise) {
						tm = setTimeout(function() {
							fm.notify({
								type : 'chkcontent',
								cnt : 1,
								hideCnt: true,
								cancel : function() {
									res.reject();
								}
							});
						}, 100);
						res.always(function() {
							tm && clearTimeout(tm);
							fm.notify({ type : 'chkcontent', cnt: -1 });
						}).done(function(d) {
							dfd.resolve(old !== d);
						}).fail(function(err) {
							dfd.resolve(err || (old === undefined? false : true));
						});
					} else {
						dfd.resolve(old !== res);
					}
					return dfd;
				},
				opts = {
					title   : fm.escape(file.name),
					width   : getDlgWidth(),
					height  : getDlgHeight(),
					buttons : {},
					cssClass  : clsEditing,
					maxWidth  : 'window',
					maxHeight : 'window',
					allowMinimize : true,
					allowMaximize : true,
					openMaximized : editorMaximized() || (editor && editor.info && editor.info.openMaximized),
					btnHoverFocus : false,
					closeOnEscape : false,
					propagationEvents : ['mousemove', 'mouseup', 'click'],
					minimize : function() {
						var conf;
						if (ta.editor && dialogNode.closest('.ui-dialog').is(':hidden')) {
							conf = ta.editor.confObj;
							if (conf.info && conf.info.syncInterval) {
								fileSync(file.hash);
							}
						}
					},
					close   : function() {
						var close = function() {
								var conf;
								dfrd.resolve();
								if (ta.editor) {
									ta.editor.close(ta[0], ta.editor.instance);
									conf = ta.editor.confObj;
									if (conf.info && conf.info.syncInterval) {
										fileSync(file.hash);
									}
								}
								ta.elfinderdialog('destroy');
							},
							onlySaveAs = (typeof saveAsFile.name !== 'undefined'),
							accept = onlySaveAs? {
								label    : 'btnSaveAs',
								callback : function() {
									requestAnimationFrame(saveAs);
								}
							} : {
								label    : 'btnSaveClose',
								callback : function() {
									save().done(function() {
										close();
									});
								}
							};
						changed().done(function(change) {
							var msgs = ['confirmNotSave'];
							if (change) {
								if (typeof change === 'string') {
									msgs.unshift(change);
								}
								fm.confirm({
									title  : self.title,
									text   : msgs,
									accept : accept,
									cancel : {
										label    : 'btnClose',
										callback : close
									},
									buttons : onlySaveAs? null : [{
										label    : 'btnSaveAs',
										callback : function() {
											requestAnimationFrame(saveAs);
										}
									}]
								});
							} else {
								close();
							}
						});
					},
					open    : function() {
						var loadRes, conf, interval;
						ta.initEditArea.call(ta, id, file, content, fm);
						if (ta.editor) {
							loadRes = ta.editor.load(ta[0]) || null;
							if (loadRes && loadRes.done) {
								loadRes.always(function() {
									_loaded = true;
								}).done(function(instance) {
									ta.editor.instance = instance;
									ta.editor.focus(ta[0], ta.editor.instance);
									setOld(getContent());
									requestAnimationFrame(function() {
										dialogNode.trigger('resize');
									});
								}).fail(function(error) {
									error && fm.error(error);
									ta.elfinderdialog('destroy');
									return;
								}).always(makeToasts);
							} else {
								_loaded = true;
								if (loadRes && (typeof loadRes === 'string' || Array.isArray(loadRes))) {
									fm.error(loadRes);
									ta.elfinderdialog('destroy');
									return;
								}
								ta.editor.instance = loadRes;
								ta.editor.focus(ta[0], ta.editor.instance);
								setOld(getContent());
								requestAnimationFrame(function() {
									dialogNode.trigger('resize');
								});
								makeToasts();
							}
							conf = ta.editor.confObj;
							if (conf.info && conf.info.syncInterval) {
								if (interval = parseInt(conf.info.syncInterval)) {
									setTimeout(function() {
										autoSync(interval);
									}, interval);
								}
							}
						} else {
							_loaded = true;
							setOld(getContent());
						}
					},
					resize : function(e, data) {
						ta.editor && ta.editor.resize(ta[0], ta.editor.instance, e, data || {});
					}
				},
				getContent = function() {
					var res = ta.getContent.call(ta, ta[0]);
					if (res === undefined || res === false || res === null) {
						res = jQuery.Deferred().reject();
					}
					return res;
				},
				setOld = function(res) {
					if (res && res.promise) {
						res.done(function(d) {
							old = d;
						});
					} else {
						old = res;
					}
				},
				autoSync = function(interval) {
					if (dialogNode.is(':visible')) {
						fileSync(file.hash);
						setTimeout(function() {
							autoSync(interval);
						}, interval);
					}
				},
				stateChange = function() {
					if (selEncoding) {
						changed().done(function(change) {
							if (change) {
								selEncoding.attr('title', fm.i18n('saveAsEncoding')).addClass('elfinder-edit-changed');
							} else {
								selEncoding.attr('title', fm.i18n('openAsEncoding')).removeClass('elfinder-edit-changed');
							}
						});
					}
				},
				saveAsFile = {},
				ta, old, dialogNode, selEncoding, extEditor, maxW, syncInterval;
				
			if (editor) {
				if (editor.html) {
					ta = jQuery(editor.html);
				}
				extEditor = {
					init     : editor.init || null,
					load     : editor.load,
					getContent : editor.getContent || null,
					save     : editor.save,
					beforeclose : typeof editor.beforeclose == 'function' ? editor.beforeclose : void 0,
					close    : typeof editor.close == 'function' ? editor.close : function() {},
					focus    : typeof editor.focus == 'function' ? editor.focus : function() {},
					resize   : typeof editor.resize == 'function' ? editor.resize : function() {},
					instance : null,
					doSave   : saveon,
					doCancel : cancel,
					doClose  : savecl,
					file     : file,
					fm       : fm,
					confObj  : editor,
					trigger  : function(evName, data) {
						fm.trigger('editEditor' + evName, Object.assign({}, editor.info || {}, data));
					}
				};
			}
			
			if (!ta) {
				if (!fm.mimeIsText(file.mime)) {
					return dfrd.reject('errEditorNotFound');
				}
				(function() {
					ta = jQuery('<textarea class="elfinder-file-edit" rows="20" id="'+id+'-ta"></textarea>')
						.on('input propertychange', stateChange);
					
					if (!editor || !editor.info || editor.info.useTextAreaEvent) {
						ta.on('keydown', function(e) {
							var code = e.keyCode,
								value, start;
							
							e.stopPropagation();
							if (code == jQuery.ui.keyCode.TAB) {
								e.preventDefault();
								// insert tab on tab press
								if (this.setSelectionRange) {
									value = this.value;
									start = this.selectionStart;
									this.value = value.substr(0, start) + "\t" + value.substr(this.selectionEnd);
									start += 1;
									this.setSelectionRange(start, start);
								}
							}
							
							if (e.ctrlKey || e.metaKey) {
								// close on ctrl+w/q
								if (code == 'Q'.charCodeAt(0) || code == 'W'.charCodeAt(0)) {
									e.preventDefault();
									cancel();
								}
								if (code == 'S'.charCodeAt(0)) {
									e.preventDefault();
									saveon();
								}
							}
							
						})
						.on('mouseenter', function(){this.focus();});
					}

					ta.initEditArea = function(id, file, content) {
						// ta.hide() for performance tune. Need ta.show() in `load()` if use textarea node.
						ta.hide().val(content);
						this._setupSelEncoding(content);
					};
				})();
			}

			// extended function to setup selector of encoding for text editor
			ta._setupSelEncoding = function(content) {
				var heads = (encoding && encoding !== 'unknown')? [{value: encoding}] : [],
					wfake = jQuery('<select></select>').hide(),
					setSelW = function(init) {
						init && wfake.appendTo(selEncoding.parent());
						wfake.empty().append(jQuery('<option></option>').text(selEncoding.val()));
						selEncoding.width(wfake.width());
					};
				if (content === '' || ! encoding || encoding !== 'UTF-8') {
					heads.push({value: 'UTF-8'});
				}
				selEncoding = getEncSelect(heads).on('touchstart', function(e) {
					// for touch punch event handler
					e.stopPropagation();
				}).on('change', function() {
					// reload to change encoding if not edited
					changed().done(function(change) {
						if (! change && getContent() !== '') {
							cancel();
							edit(file, selEncoding.val(), editor).fail(function(err) { err && fm.error(err); });
						}
					});
					setSelW();
				}).on('mouseover', stateChange);
				ta.parent().next().prepend(jQuery('<div class="ui-dialog-buttonset elfinder-edit-extras"></div>').append(selEncoding));
				setSelW(true);
			};

			ta.data('hash', file.hash);
			
			if (extEditor) {
				ta.editor = extEditor;
				
				if (typeof extEditor.beforeclose === 'function') {
					opts.beforeclose = function() {
						return extEditor.beforeclose(ta[0], extEditor.instance);
					};
				}
				
				if (typeof extEditor.init === 'function') {
					ta.initEditArea = extEditor.init;
				}
				
				if (typeof extEditor.getContent === 'function') {
					ta.getContent = extEditor.getContent;
				}
			}
			
			if (! ta.initEditArea) {
				ta.initEditArea = function() {};
			}
			
			if (! ta.getContent) {
				ta.getContent = function() {
					return rtrim(ta.val());
				};
			}
			
			if (!editor || !editor.info || !editor.info.preventGet) {
				opts.buttons[fm.i18n('btnSave')]      = saveon;
				opts.buttons[fm.i18n('btnSaveClose')] = savecl;
				opts.buttons[fm.i18n('btnSaveAs')]    = saveAs;
				opts.buttons[fm.i18n('btnCancel')]    = cancel;
			}
			
			if (editor && typeof editor.prepare === 'function') {
				editor.prepare(ta, opts, file);
			}
			
			dialogNode = self.fmDialog(ta, opts)
				.attr('id', id)
				.on('keydown keyup keypress', function(e) {
					e.stopPropagation();
				})
				.css({ overflow: 'hidden', minHeight: '7em' })
				.addClass('elfinder-edit-editor')
				.closest('.ui-dialog')
				.on('changeType', function(e, data) {
					if (data.extention && data.mime) {
						var ext = data.extention,
							mime = data.mime,
							btnSet = jQuery(this).children('.ui-dialog-buttonpane').children('.ui-dialog-buttonset');
						btnSet.children('.elfinder-btncnt-0,.elfinder-btncnt-1').hide();
						saveAsFile.name = fm.splitFileExtention(file.name)[0] + '.' + data.extention;
						saveAsFile.mime = data.mime;
						if (!data.keepEditor) {
							btnSet.children('.elfinder-btncnt-2').trigger('click');
						}
					}
				});
			
			// care to viewport scale change with mobile devices
			maxW = (fm.options.dialogContained? fm.getUI() : jQuery(window)).width();
			(dialogNode.width() > maxW) && dialogNode.width(maxW);
			
			return dfrd.promise();
		},
		
		/**
		 * Get file content and
		 * open dialog with textarea to edit file content
		 *
		 * @param  String  file hash
		 * @return jQuery.Deferred
		 **/
		edit = function(file, convert, editor) {
			var hash   = file.hash,
				opts   = fm.options,
				dfrd   = jQuery.Deferred(), 
				id     = 'edit-'+fm.namespace+'-'+file.hash,
				d      = fm.getUI().find('#'+id),
				conv   = !convert? 0 : convert,
				noContent = false,
				req, error, res;
			
			
			if (d.length) {
				d.elfinderdialog('toTop');
				return dfrd.resolve();
			}
			
			if (!file.read || (!file.write && (!editor.info || !editor.info.converter))) {
				error = ['errOpen', file.name, 'errPerm'];
				return dfrd.reject(error);
			}
			
			if (editor && editor.info) {
				if (typeof editor.info.edit === 'function') {
					res = editor.info.edit.call(fm, file, editor);
					if (res.promise) {
						res.done(function() {
							dfrd.resolve();
						}).fail(function(error) {
							dfrd.reject(error);
						});
					} else {
						res? dfrd.resolve() : dfrd.reject();
					}
					return dfrd;
				}

				noContent = editor.info.preventGet || editor.info.noContent;
				if (editor.info.urlAsContent || noContent) {
					req = jQuery.Deferred();
					if (editor.info.urlAsContent) {
						fm.url(hash, { async: true, onetime: true, temporary: true }).done(function(url) {
							req.resolve({content: url});
						});
					} else {
						req.resolve({});
					}
				} else {
					if (conv) {
						file.encoding = conv;
						fm.cache(file, 'change');
					}
					req = fm.request({
						data           : {cmd : 'get', target : hash, conv : conv, _t : file.ts},
						options        : {type: 'get', cache : true},
						notify         : {type : 'file', cnt : 1},
						preventDefault : true
					});
				}

				req.done(function(data) {
					var selEncoding, reg, m, res;
					if (data.doconv) {
						fm.confirm({
							title  : self.title,
							text   : data.doconv === 'unknown'? 'confirmNonUTF8' : 'confirmConvUTF8',
							accept : {
								label    : 'btnConv',
								callback : function() {  
									dfrd = edit(file, selEncoding.val(), editor);
								}
							},
							cancel : {
								label    : 'btnCancel',
								callback : function() { dfrd.reject(); }
							},
							optionsCallback : function(options) {
								options.create = function() {
									var base = jQuery('<div class="elfinder-dialog-confirm-encoding"></div>'),
										head = {value: data.doconv},
										detected;
									
									if (data.doconv === 'unknown') {
										head.caption = '-';
									}
									selEncoding = getEncSelect([head]);
									jQuery(this).next().find('.ui-dialog-buttonset')
										.prepend(base.append(jQuery('<label>'+fm.i18n('encoding')+' </label>').append(selEncoding)));
								};
							}
						});
					} else {
						if (!noContent && fm.mimeIsText(file.mime)) {
							reg = new RegExp('^(data:'+file.mime.replace(/([.+])/g, '\\$1')+';base64,)', 'i');
							if (!editor.info.dataScheme) {
								if (window.atob && (m = data.content.match(reg))) {
									data.content = atob(data.content.substr(m[1].length));
								}
							} else {
								if (window.btoa && !data.content.match(reg)) {
									data.content = 'data:'+file.mime+';base64,'+btoa(data.content);
								}
							}
						}
						dialog(id, file, data.content, data.encoding, editor, data.toasts)
							.done(function(data) {
								dfrd.resolve(data);
							})
							.progress(function(encoding, newHash, data, saveDfd) {
								var ta = this;
								if (newHash) {
									hash = newHash;
								}
								fm.request({
									options : {type : 'post'},
									data : {
										cmd     : 'put',
										target  : hash,
										encoding : encoding || data.encoding,
										content : data
									},
									notify : {type : 'save', cnt : 1},
									syncOnFail : true,
									preventFail : true,
									navigate : {
										target : 'changed',
										toast : {
											inbuffer : {msg: fm.i18n(['complete', fm.i18n('btnSave')])}
										}
									}
								})
								.fail(function(error) {
									dfrd.reject(error);
									saveDfd.reject();
								})
								.done(function(data) {
									requestAnimationFrame(function(){
										ta.trigger('focus');
										ta.editor && ta.editor.focus(ta[0], ta.editor.instance);
									});
									saveDfd.resolve();
								});
							})
							.fail(function(error) {
								dfrd.reject(error);
							});
					}
				})
				.fail(function(error) {
					var err = fm.parseError(error);
					err = Array.isArray(err)? err[0] : err;
					if (file.encoding) {
						file.encoding = '';
						fm.cache(file, 'change');
					}
					(err !== 'errConvUTF8') && fm.sync();
					dfrd.reject(error);
				});
			}

			return dfrd.promise();
		},
		
		/**
		 * Current editors of selected files
		 * 
		 * @type Object
		 */
		editors = {},
		
		/**
		 * Fallback editor (Simple text editor)
		 * 
		 * @type Object
		 */
		fallbackEditor = {
			// Simple Text (basic textarea editor)
			info : {
				id : 'textarea',
				name : 'TextArea',
				useTextAreaEvent : true
			},
			load : function(textarea) {
				// trigger event 'editEditorPrepare'
				this.trigger('Prepare', {
					node: textarea,
					editorObj: void(0),
					instance: void(0),
					opts: {}
				});
				textarea.setSelectionRange && textarea.setSelectionRange(0, 0);
				jQuery(textarea).trigger('focus').show();
			},
			save : function(){}
		},

		/**
		 * Set current editors
		 * 
		 * @param  Object  file object
		 * @param  Number  cnt  count of selected items
		 * @return Void
		 */
		setEditors = function(file, cnt) {
			var mimeMatch = function(fileMime, editorMimes){
					if (!editorMimes) {
						return fm.mimeIsText(fileMime);
					} else {
						if (editorMimes[0] === '*' || jQuery.inArray(fileMime, editorMimes) !== -1) {
							return true;
						}
						var i, l;
						l = editorMimes.length;
						for (i = 0; i < l; i++) {
							if (fileMime.indexOf(editorMimes[i]) === 0) {
								return true;
							}
						}
						return false;
					}
				},
				extMatch = function(fileName, editorExts){
					if (!editorExts || !editorExts.length) {
						return true;
					}
					var ext = fileName.replace(/^.+\.([^.]+)|(.+)$/, '$1$2').toLowerCase(),
					i, l;
					l = editorExts.length;
					for (i = 0; i < l; i++) {
						if (ext === editorExts[i].toLowerCase()) {
							return true;
						}
					}
					return false;
				},
				optEditors = self.options.editors || [],
				cwdWrite = fm.cwd().write;
			
			stored = fm.storage('storedEditors') || {};
			editors = {};
			if (!optEditors.length) {
				optEditors = [fallbackEditor];
			}
			jQuery.each(optEditors, function(i, editor) {
				var name;
				if ((cnt === 1 || !editor.info.single)
						&& ((!editor.info || !editor.info.converter)? file.write : cwdWrite)
						&& (file.size > 0 || (!editor.info.converter && editor.info.canMakeEmpty !== false && fm.mimesCanMakeEmpty[file.mime]))
						&& (!editor.info.maxSize || file.size <= editor.info.maxSize)
						&& mimeMatch(file.mime, editor.mimes || null)
						&& extMatch(file.name, editor.exts || null)
						&& typeof editor.load == 'function'
						&& typeof editor.save == 'function') {
					
					name = editor.info.name? editor.info.name : ('Editor ');
					editor.id = editor.info.id? editor.info.id : ('editor' + i),
					editor.name = name;
					editor.i18n = fm.i18n(name);
					editors[editor.id] = editor;
				}
			});
			return Object.keys(editors).length? true : false;
		},
		store = function(mime, editor) {
			if (mime && editor) {
				if (!jQuery.isPlainObject(stored)) {
					stored = {};
				}
				stored[mime] = editor.id;
				fm.storage('storedEditors', stored);
				fm.trigger('selectfiles', {files : fm.selected()});
			}
		},
		useStoredEditor = function() {
			var d = fm.storage('useStoredEditor');
			return d? (d > 0) : self.options.useStoredEditor;
		},
		editorMaximized = function() {
			var d = fm.storage('editorMaximized');
			return d? (d > 0) : self.options.editorMaximized;
		},
		getSubMenuRaw = function(files, callback) {
			var subMenuRaw = [];
			jQuery.each(editors, function(id, ed) {
				subMenuRaw.push(
					{
						label    : fm.escape(ed.i18n),
						icon     : ed.info && ed.info.icon? ed.info.icon : 'edit',
						options  : { iconImg: ed.info && ed.info.iconImg? fm.baseUrl + ed.info.iconImg : void(0) },
						callback : function() {
							store(files[0].mime, ed);
							callback && callback.call(ed);
						}
					}		
				);
			});
			return subMenuRaw;
		},
		getStoreId = function(name) {
			// for compatibility to previous version
			return name.toLowerCase().replace(/ +/g, '');
		},
		getStoredEditor = function(mime) {
			var name = stored[mime];
			return name && Object.keys(editors).length? editors[getStoreId(name)] : void(0);
		},
		infoRequest = function() {

		},
		stored;
	
	// make public method
	this.getEncSelect = getEncSelect;

	this.shortcuts = [{
		pattern     : 'ctrl+e'
	}];
	
	this.init = function() {
		var self = this,
			fm   = this.fm,
			opts = this.options,
			cmdChecks = [],
			ccData, dfd;
		
		this.onlyMimes = this.options.mimes || [];
		
		fm.one('open', function() {
			// editors setup
			if (opts.editors && Array.isArray(opts.editors)) {
				fm.trigger('canMakeEmptyFile', {mimes: Object.keys(fm.storage('mkfileTextMimes') || {}).concat(opts.makeTextMimes || ['text/plain'])});
				jQuery.each(opts.editors, function(i, editor) {
					if (editor.info && editor.info.cmdCheck) {
						cmdChecks.push(editor.info.cmdCheck);
					}
				});
				if (cmdChecks.length) {
					if (fm.api >= 2.1030) {
						dfd = fm.request({
							data : {
								cmd: 'editor',
								name: cmdChecks,
								method: 'enabled'
							},
							preventDefault : true
						}).done(function(d) {
							ccData = d;
						}).fail(function() {
							ccData = {};
						});
					} else {
						ccData = {};
						dfd = jQuery.Deferred().resolve();
					}
				} else {
					dfd = jQuery.Deferred().resolve();
				}
				
				dfd.always(function() {
					if (ccData) {
						opts.editors = jQuery.grep(opts.editors, function(e) {
							if (e.info && e.info.cmdCheck) {
								return ccData[e.info.cmdCheck]? true : false;
							} else {
								return true;
							}
						});
					}
					jQuery.each(opts.editors, function(i, editor) {
						if (editor.setup && typeof editor.setup === 'function') {
							editor.setup.call(editor, opts, fm);
						}
						if (!editor.disabled) {
							if (editor.mimes && Array.isArray(editor.mimes)) {
								mimesSingle = mimesSingle.concat(editor.mimes);
								if (!editor.info || !editor.info.single) {
									mimes = mimes.concat(editor.mimes);
								}
							}
							if (!allowAll && editor.mimes && editor.mimes[0] === '*') {
								allowAll = true;
							}
							if (!editor.info) {
								editor.info = {};
							}
							if (editor.info.integrate) {
								fm.trigger('helpIntegration', Object.assign({cmd: 'edit'}, editor.info.integrate));
							}
							if (editor.info.canMakeEmpty) {
								fm.trigger('canMakeEmptyFile', {mimes: Array.isArray(editor.info.canMakeEmpty)? editor.info.canMakeEmpty : editor.mimes});
							}
						}
					});
					
					mimesSingle = (jQuery.uniqueSort || jQuery.unique)(mimesSingle);
					mimes = (jQuery.uniqueSort || jQuery.unique)(mimes);
					
					opts.editors = jQuery.grep(opts.editors, function(e) {
						return e.disabled? false : true;
					});
				});
			}
		})
		.bind('select', function() {
			editors = null;
		})
		.bind('contextmenucreate', function(e) {
			var file, editor,
				single = function(editor) {
					var title = self.title;
					fm.one('contextmenucreatedone', function() {
						self.title = title;
					});
					self.title = fm.escape(editor.i18n);
					if (editor.info && editor.info.iconImg) {
						self.contextmenuOpts = {
							iconImg: fm.baseUrl + editor.info.iconImg
						};
					}
					delete self.variants;
				};
			
			self.contextmenuOpts = void(0);
			if (e.data.type === 'files' && self.enabled()) {
				file = fm.file(e.data.targets[0]);
				if (setEditors(file, e.data.targets.length)) {
					if (Object.keys(editors).length > 1) {
						if (!useStoredEditor() || !(editor = getStoredEditor(file.mime))) {
							delete self.extra;
							self.variants = [];
							jQuery.each(editors, function(id, editor) {
								self.variants.push([{ editor: editor }, editor.i18n, editor.info && editor.info.iconImg? fm.baseUrl + editor.info.iconImg : 'edit']);
							});
						} else {
							single(editor);
							self.extra = {
								icon: 'menu',
								node: jQuery('<span></span>')
									.attr({title: fm.i18n('select')})
									.on('click touchstart', function(e){
										if (e.type === 'touchstart' && e.originalEvent.touches.length > 1) {
											return;
										}
										var node = jQuery(this);
										e.stopPropagation();
										e.preventDefault();
										fm.trigger('contextmenu', {
											raw: getSubMenuRaw(fm.selectedFiles(), function() {
												var hashes = fm.selected();
												fm.exec('edit', hashes, {editor: this});
												fm.trigger('selectfiles', {files : hashes});
											}),
											x: node.offset().left,
											y: node.offset().top
										});
									})
							};
						}
					} else {
						single(editors[Object.keys(editors)[0]]);
						delete self.extra;
					}
				}
			}
		})
		.bind('canMakeEmptyFile', function(e) {
			if (e.data && e.data.resetTexts) {
				var defs = fm.arrayFlip(self.options.makeTextMimes || ['text/plain']),
					hides = self.getMkfileHides();

				jQuery.each((fm.storage('mkfileTextMimes') || {}), function(mime, type) {
					if (!defs[mime]) {
						delete fm.mimesCanMakeEmpty[mime];
						delete hides[mime];
					}
				});
				fm.storage('mkfileTextMimes', null);
				if (Object.keys(hides).length) {
					fm.storage('mkfileHides', hides);
				} else {
					fm.storage('mkfileHides', null);
				}
			}
		});
	};
	
	this.getstate = function(select) {
		var sel = this.files(select),
			cnt = sel.length;

		return cnt && filter(sel).length == cnt ? 0 : -1;
	};
	
	this.exec = function(select, opts) {
		var fm    = this.fm, 
			files = filter(this.files(select)),
			hashes = jQuery.map(files, function(f) { return f.hash; }),
			list  = [],
			editor = opts && opts.editor? opts.editor : null,
			node = jQuery(opts && opts._currentNode? opts._currentNode : fm.cwdHash2Elm(hashes[0])),
			getEditor = function() {
				var dfd = jQuery.Deferred(),
					storedId;
				
				if (!editor && Object.keys(editors).length > 1) {
					if (useStoredEditor() && (editor = getStoredEditor(files[0].mime))) {
						return dfd.resolve(editor);
					}
					fm.trigger('contextmenu', {
						raw: getSubMenuRaw(files, function() {
							dfd.resolve(this);
						}),
						x: node.offset().left,
						y: node.offset().top + 22,
						opened: function() {
							fm.one('closecontextmenu',function() {
								requestAnimationFrame(function() {
									if (dfd.state() === 'pending') {
										dfd.reject();
									}
								});
							});
						}
					});
					
					fm.trigger('selectfiles', {files : hashes});
					
					return dfd;
				} else {
					Object.keys(editors).length > 1 && editor && store(files[0].mime, editor);
					return dfd.resolve(editor? editor : (Object.keys(editors).length? editors[Object.keys(editors)[0]] : null));
				}
			},
			dfrd = jQuery.Deferred(),
			file;

		if (editors === null) {
			setEditors(files[0], hashes.length);
		}
		
		if (!node.length) {
			node = fm.getUI('cwd');
		}
		
		getEditor().done(function(editor) {
			while ((file = files.shift())) {
				list.push(edit(file, (file.encoding || void(0)), editor).fail(function(error) {
					error && fm.error(error);
				}));
			}
			
			if (list.length) { 
				jQuery.when.apply(null, list).done(function() {
					dfrd.resolve();
				}).fail(function() {
					dfrd.reject();
				});
			} else {
				dfrd.reject();
			}
		}).fail(function() {
			dfrd.reject();
		});
		
		return dfrd;
	};

	this.getMkfileHides = function() {
		return fm.storage('mkfileHides') || fm.arrayFlip(self.options.mkfileHideMimes || []);
	};

};
js/commands/quicklook.plugins.js000064400000165010151215013360013000 0ustar00elFinder.prototype.commands.quicklook.plugins = [
	
	/**
	 * Images preview plugin
	 *
	 * @param elFinder.commands.quicklook
	 **/
	function(ql) {
		"use strict";
		var mimes   = ['image/jpeg', 'image/png', 'image/gif', 'image/svg+xml', 'image/x-ms-bmp'],
			getDimSize = ql.fm.returnBytes((ql.options.getDimThreshold || 0)),
			preview = ql.preview,
			WebP, flipMime;
		
		// webp support
		WebP = new Image();
		WebP.onload = WebP.onerror = function() {
			if (WebP.height == 2) {
				mimes.push('image/webp');
			}
		};
		WebP.src='data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA';
		
		// what kind of images we can display
		jQuery.each(navigator.mimeTypes, function(i, o) {
			var mime = o.type;
			
			if (mime.indexOf('image/') === 0 && jQuery.inArray(mime, mimes)) {
				mimes.push(mime);
			} 
		});
			
		preview.on(ql.evUpdate, function(e) {
			var fm   = ql.fm,
				file = e.file,
				showed = false,
				dimreq = null,
				setdim  = function(dim) {
					var rfile = fm.file(file.hash);
					rfile.width = dim[0];
					rfile.height = dim[1];
				},
				show = function() {
					var elm, varelm, memSize, width, height, prop;
					
					dimreq && dimreq.state && dimreq.state() === 'pending' && dimreq.reject();
					if (showed) {
						return;
					}
					showed = true;
					
					elm = img.get(0);
					memSize = file.width && file.height? {w: file.width, h: file.height} : (elm.naturalWidth? null : {w: img.width(), h: img.height()});
				
					memSize && img.removeAttr('width').removeAttr('height');
					
					width  = file.width || elm.naturalWidth || elm.width || img.width();
					height = file.height || elm.naturalHeight || elm.height || img.height();
					if (!file.width || !file.height) {
						setdim([width, height]);
					}
					
					memSize && img.width(memSize.w).height(memSize.h);

					prop = (width/height).toFixed(2);
					preview.on('changesize', function() {
						var pw = parseInt(preview.width()),
							ph = parseInt(preview.height()),
							w, h;
					
						if (prop < (pw/ph).toFixed(2)) {
							h = ph;
							w = Math.floor(h * prop);
						} else {
							w = pw;
							h = Math.floor(w/prop);
						}
						img.width(w).height(h).css('margin-top', h < ph ? Math.floor((ph - h)/2) : 0);
					
					})
					.trigger('changesize');
					
					//show image
					img.fadeIn(100);
				},
				hideInfo = function() {
					loading.remove();
					// hide info/icon
					ql.hideinfo();
				},
				url, img, loading, prog, m, opDfd;

			if (!flipMime) {
				flipMime = fm.arrayFlip(mimes);
			}
			if (flipMime[file.mime] && ql.dispInlineRegex.test(file.mime)) {
				// this is our file - stop event propagation
				e.stopImmediatePropagation();

				loading = jQuery('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+fm.i18n('nowLoading')+'</span><span class="elfinder-spinner"></span></div>').appendTo(ql.info.find('.elfinder-quicklook-info'));
				prog = jQuery('<div class="elfinder-quicklook-info-progress"></div>').appendTo(loading);

				img = jQuery('<img/>')
					.hide()
					.appendTo(preview)
					.on('load', function() {
						hideInfo();
						show();
					})
					.on('error', function() {
						loading.remove();
					});
				opDfd = fm.openUrl(file.hash, false, function(url) {
					img.attr('src', url);
				}, { progressBar: prog });
				// stop loading on change file if not loaded yet
				preview.one('change', function() {
					opDfd && opDfd.state && opDfd.state() === 'pending' && opDfd.reject();
				});

				if (file.width && file.height) {
					show();
				} else if (file.size > getDimSize) {
					dimreq = fm.request({
						data : {cmd : 'dim', target : file.hash},
						preventDefault : true
					})
					.done(function(data) {
						if (data.dim) {
							var dim = data.dim.split('x');
							file.width = dim[0];
							file.height = dim[1];
							setdim(dim);
							show();
						}
					});
				}
			}
			
		});
	},
	
	/**
	 * TIFF image preview
	 *
	 * @param  object  ql  elFinder.commands.quicklook
	 */
	function(ql) {
		"use strict";
		var fm   = ql.fm,
			mime = 'image/tiff',
			preview = ql.preview;
		if (window.Worker && window.Uint8Array) {
			preview.on(ql.evUpdate, function(e) {
				var file = e.file,
					err = function(e) {
						wk && wk.terminate();
						loading.remove();
						fm.debug('error', e);
					},
					setdim = function(dim) {
						var rfile = fm.file(file.hash);
						rfile.width = dim[0];
						rfile.height = dim[1];
					},
					loading, prog, url, base, wk, opDfd;
				if (file.mime === mime) {
					e.stopImmediatePropagation();

					loading = jQuery('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+fm.i18n('nowLoading')+'</span><span class="elfinder-spinner"></span></div>').appendTo(ql.info.find('.elfinder-quicklook-info'));
					prog = jQuery('<div class="elfinder-quicklook-info-progress"></div>').appendTo(loading);
					// stop loading on change file if not loaded yet
					preview.one('change', function() {
						wk && wk.terminate();
						loading.remove();
					});

					opDfd = fm.getContents(file.hash, 'arraybuffer', { progressBar: prog }).done(function(data) {
						if (data) {
							base = jQuery('<div></div>').css({width:'100%',height:'100%'}).hide().appendTo(preview);
							try {
								wk = fm.getWorker();
								wk.onmessage = function(res) {
									var data = res.data,
										cv, co, id, prop;
									wk && wk.terminate();
									cv = document.createElement('canvas');
									co = cv.getContext('2d');
									cv.width = data.width;
									cv.height = data.height;
									id = co.createImageData(data.width, data.height);
									(id).data.set(new Uint8Array(data.image));
									co.putImageData(id, 0, 0);
									base.append(cv).show();
									loading.remove();
									prop = (data.width/data.height).toFixed(2);
									preview.on('changesize', function() {
										var pw = parseInt(preview.width()),
											ph = parseInt(preview.height()),
											w, h;
										if (prop < (pw/ph).toFixed(2)) {
											h = ph;
											w = Math.floor(h * prop);
										} else {
											w = pw;
											h = Math.floor(w/prop);
										}
										jQuery(cv).width(w).height(h).css('margin-top', h < ph ? Math.floor((ph - h)/2) : 0);
									}).trigger('changesize');
									if (!file.width || !file.height) {
										setdim([data.width, data.height]);
									}
									ql.hideinfo();
								};
								wk.onerror = err;
								wk.postMessage({
									scripts: [fm.options.cdns.tiff, document.location.origin+'/wp-content/plugins/wp-file-manager/lib/js/worker/quicklook.tiff.js'],
									data: { data: data }
								});
							} catch(e) {
								err(e);
							}
						} else {
							err();
						}
					});
					// stop loading on change file if not loaded yet
					preview.one('change', function() {
						opDfd && opDfd.state && opDfd.state() === 'pending' && opDfd.reject();
					});
				}
			});
		}
	},

	/**
	 * PSD(Adobe Photoshop data) preview plugin
	 *
	 * @param elFinder.commands.quicklook
	 **/
	function(ql) {
		"use strict";
		var fm      = ql.fm,
			mimes   = fm.arrayFlip(['image/vnd.adobe.photoshop', 'image/x-photoshop']),
			preview = ql.preview,
			load    = function(url, img, loading) {
				try {
					fm.replaceXhrSend();
					PSD.fromURL(url).then(function(psd) {
						var prop;
						img.attr('src', psd.image.toBase64());
						requestAnimationFrame(function() {
							prop = (img.width()/img.height()).toFixed(2);
							preview.on('changesize', function() {
								var pw = parseInt(preview.width()),
									ph = parseInt(preview.height()),
									w, h;
							
								if (prop < (pw/ph).toFixed(2)) {
									h = ph;
									w = Math.floor(h * prop);
								} else {
									w = pw;
									h = Math.floor(w/prop);
								}
								img.width(w).height(h).css('margin-top', h < ph ? Math.floor((ph - h)/2) : 0);
							}).trigger('changesize');
							
							loading.remove();
							// hide info/icon
							ql.hideinfo();
							//show image
							img.fadeIn(100);
						});
					}, function() {
						loading.remove();
						img.remove();
					});
					fm.restoreXhrSend();
				} catch(e) {
					fm.restoreXhrSend();
					loading.remove();
					img.remove();
				}
			},
			PSD;
		
		preview.on(ql.evUpdate, function(e) {
			var file = e.file,
				url, img, loading, prog, m,
				_define, _require, opDfd;

			if (mimes[file.mime] && fm.options.cdns.psd && ! fm.UA.ltIE10 && ql.dispInlineRegex.test(file.mime)) {
				// this is our file - stop event propagation
				e.stopImmediatePropagation();

				loading = jQuery('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+fm.i18n('nowLoading')+'</span><span class="elfinder-spinner"></span></div>').appendTo(ql.info.find('.elfinder-quicklook-info'));
				prog = jQuery('<div class="elfinder-quicklook-info-progress"></div>').appendTo(loading);
				opDfd = fm.openUrl(file.hash, 'sameorigin', function(url) {
					if (url) {
						img = jQuery('<img/>').hide().appendTo(preview);
						if (PSD) {
							load(url, img, loading);
						} else {
							_define = window.define;
							_require = window.require;
							window.require = null;
							window.define = null;
							fm.loadScript(
								[ fm.options.cdns.psd ],
								function() {
									PSD = require('psd');
									_define? (window.define = _define) : (delete window.define);
									_require? (window.require = _require) : (delete window.require);
									load(url, img, loading);
								}
							);
						}
					}
				}, { progressBar: prog });
				// stop loading on change file if not loaded yet
				preview.one('change', function() {
					opDfd && opDfd.state && opDfd.state() === 'pending' && opDfd.reject();
				});
			}
		});
	},
	
	/**
	 * HTML preview plugin
	 *
	 * @param elFinder.commands.quicklook
	 **/
	function(ql) {
		"use strict";
		var fm      = ql.fm,
			mimes   = fm.arrayFlip(['text/html', 'application/xhtml+xml']),
			preview = ql.preview;
			
		preview.on(ql.evUpdate, function(e) {
			var file = e.file, jqxhr, loading, prog;
			
			if (mimes[file.mime] && ql.dispInlineRegex.test(file.mime) && (!ql.options.getSizeMax || file.size <= ql.options.getSizeMax)) {
				e.stopImmediatePropagation();

				loading = jQuery('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+fm.i18n('nowLoading')+'</span><span class="elfinder-spinner"></span></div>').appendTo(ql.info.find('.elfinder-quicklook-info'));
				prog = jQuery('<div class="elfinder-quicklook-info-progress"></div>').appendTo(loading);

				// stop loading on change file if not loaded yet
				preview.one('change', function() {
					jqxhr.state() == 'pending' && jqxhr.reject();
				}).addClass('elfinder-overflow-auto');
				
				jqxhr = fm.request({
					data           : {cmd : 'get', target : file.hash, conv : 1, _t : file.ts},
					options        : {type: 'get', cache : true},
					preventDefault : true,
					progressBar    : prog
				})
				.done(function(data) {
					ql.hideinfo();
					var doc = jQuery('<iframe class="elfinder-quicklook-preview-html"></iframe>').appendTo(preview)[0].contentWindow.document;
					doc.open();
					doc.write(data.content);
					doc.close();
				})
				.always(function() {
					loading.remove();
				});
			}
		});
	},
	
	/**
	 * MarkDown preview plugin
	 *
	 * @param elFinder.commands.quicklook
	 **/
	function(ql) {
		"use strict";
		var fm      = ql.fm,
			mimes   = fm.arrayFlip(['text/x-markdown']),
			preview = ql.preview,
			marked  = null,
			show = function(data, loading) {
				ql.hideinfo();
				var doc = jQuery('<iframe class="elfinder-quicklook-preview-html"></iframe>').appendTo(preview)[0].contentWindow.document;
				doc.open();
				doc.write(marked(data.content));
				doc.close();
				loading.remove();
			},
			error = function(loading) {
				marked = false;
				loading.remove();
			};
			
		preview.on(ql.evUpdate, function(e) {
			var file = e.file, jqxhr, loading, prog;
			
			if (mimes[file.mime] && fm.options.cdns.marked && marked !== false && ql.dispInlineRegex.test(file.mime) && (!ql.options.getSizeMax || file.size <= ql.options.getSizeMax)) {
				e.stopImmediatePropagation();

				loading = jQuery('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+fm.i18n('nowLoading')+'</span><span class="elfinder-spinner"></span></div>').appendTo(ql.info.find('.elfinder-quicklook-info'));
				prog = jQuery('<div class="elfinder-quicklook-info-progress"></div>').appendTo(loading);

				// stop loading on change file if not loaded yet
				preview.one('change', function() {
					jqxhr.state() == 'pending' && jqxhr.reject();
				}).addClass('elfinder-overflow-auto');
				
				jqxhr = fm.request({
					data           : {cmd : 'get', target : file.hash, conv : 1, _t : file.ts},
					options        : {type: 'get', cache : true},
					preventDefault : true,
					progressBar    : prog
				})
				.done(function(data) {
					if (marked || window.marked) {
						if (!marked) {
							marked = window.marked;
						}
						show(data, loading);
					} else {
						fm.loadScript([fm.options.cdns.marked],
							function(res) { 
								marked = res || window.marked || false;
								delete window.marked;
								if (marked) {
									show(data, loading);
								} else {
									error(loading);
								}
							},
							{
								tryRequire: true,
								error: function() {
									error(loading);
								}
							}
						);
					}
				})
				.fail(function() {
					error(loading);
				});
			}
		});
	},

	/**
	 * PDF/ODT/ODS/ODP preview with ViewerJS
	 * 
	 * @param elFinder.commands.quicklook
	 */
	 function(ql) {
		if (ql.options.viewerjs) {
			var fm      = ql.fm,
				preview = ql.preview,
				opts    = ql.options.viewerjs,
				mimes   = opts.url? fm.arrayFlip(opts.mimes || []) : [],
				win     = ql.window,
				navi    = ql.navbar,
				setNavi = function() {
					navi.css('bottom', win.hasClass('elfinder-quicklook-fullscreen')? '30px' : '');
				};

			if (opts.url) {
				preview.on('update', function(e) {
					var file = e.file, node, loading, prog, opDfd;

					if (mimes[file.mime] && (file.mime !== 'application/pdf' || !opts.pdfNative || !ql.flags.pdfNative)) {
						e.stopImmediatePropagation();
						loading = jQuery('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+fm.i18n('nowLoading')+'</span><span class="elfinder-spinner"></span></div>').appendTo(ql.info.find('.elfinder-quicklook-info'));
						prog = jQuery('<div class="elfinder-quicklook-info-progress"></div>').appendTo(loading);
						opDfd = fm.openUrl(file.hash, 'sameorigin', function(url) {
							if (url) {
								node = jQuery('<iframe class="elfinder-quicklook-preview-iframe"></iframe>')
									.css('background-color', 'transparent')
									.on('load', function() {
										ql.hideinfo();
										loading.remove();
										node.css('background-color', '#fff');
									})
									.on('error', function() {
										loading.remove();
										node.remove();
									})
									.appendTo(preview)
									.attr('src', opts.url + '#' + url);

								win.on('viewchange.viewerjs', setNavi);
								setNavi();

								preview.one('change', function() {
									win.off('viewchange.viewerjs');
									loading.remove();
									node.off('load').remove();
								});
							}
						}, { progressBar: prog });
						// stop loading on change file if not loaded yet
						preview.one('change', function() {
							opDfd && opDfd.state && opDfd.state() === 'pending' && opDfd.reject();
						});
					}
				});
			}
		}
	},

	/**
	 * PDF preview plugin
	 *
	 * @param elFinder.commands.quicklook
	 **/
	function(ql) {
		"use strict";
		var fm      = ql.fm,
			mime    = 'application/pdf',
			preview = ql.preview,
			active  = false,
			urlhash = '',
			firefox, toolbar;
			
		if ((fm.UA.Safari && fm.OS === 'mac' && !fm.UA.iOS) || fm.UA.IE || fm.UA.Firefox) {
			active = true;
		} else {
			jQuery.each(navigator.plugins, function(i, plugins) {
				jQuery.each(plugins, function(i, plugin) {
					if (plugin.type === mime) {
						return !(active = true);
					}
				});
			});
		}

		ql.flags.pdfNative = active;
		if (active) {
			if (typeof ql.options.pdfToolbar !== 'undefined' && !ql.options.pdfToolbar) {
				urlhash = '#toolbar=0';
			}
			preview.on(ql.evUpdate, function(e) {
				var file = e.file,
					opDfd;
				
				if (active && file.mime === mime && ql.dispInlineRegex.test(file.mime)) {
					e.stopImmediatePropagation();
					opDfd = fm.openUrl(file.hash, false, function(url) {
						if (url) {
							ql.hideinfo();
							ql.cover.addClass('elfinder-quicklook-coverbg');
							jQuery('<object class="elfinder-quicklook-preview-pdf" data="'+url+urlhash+'" type="application/pdf" ></object>')
								.on('error', function(e) {
									active = false;
									ql.update(void(0), fm.cwd());
									ql.update(void(0), file);
								})
								.appendTo(preview);
						}
					});
					// stop loading on change file if not loaded yet
					preview.one('change', function() {
						opDfd && opDfd.state && opDfd.state() === 'pending' && opDfd.reject();
					});
				}
				
			});
		}
	},
	
	/**
	 * Flash preview plugin
	 *
	 * @param elFinder.commands.quicklook
	 **/
	function(ql) {
		"use strict";
		var fm      = ql.fm,
			mime    = 'application/x-shockwave-flash',
			preview = ql.preview,
			active  = false;

		jQuery.each(navigator.plugins, function(i, plugins) {
			jQuery.each(plugins, function(i, plugin) {
				if (plugin.type === mime) {
					return !(active = true);
				}
			});
		});
		
		active && preview.on(ql.evUpdate, function(e) {
			var file = e.file,
				node, opDfd;
				
			if (file.mime === mime && ql.dispInlineRegex.test(file.mime)) {
				e.stopImmediatePropagation();
				opDfd = fm.openUrl(file.hash, false, function(url) {
					if (url) {
						ql.hideinfo();
						node = jQuery('<embed class="elfinder-quicklook-preview-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" src="'+url+'" quality="high" type="application/x-shockwave-flash" wmode="transparent" />')
							.appendTo(preview);
					}
				});
				// stop loading on change file if not loaded yet
				preview.one('change', function() {
					opDfd && opDfd.state && opDfd.state() === 'pending' && opDfd.reject();
				});
			}
		});
	},
	
	/**
	 * HTML5 audio preview plugin
	 *
	 * @param elFinder.commands.quicklook
	 **/
	function(ql) {
		"use strict";
		var fm       = ql.fm,
			preview  = ql.preview,
			mimes    = {
				'audio/mpeg'    : 'mp3',
				'audio/mpeg3'   : 'mp3',
				'audio/mp3'     : 'mp3',
				'audio/x-mpeg3' : 'mp3',
				'audio/x-mp3'   : 'mp3',
				'audio/x-wav'   : 'wav',
				'audio/wav'     : 'wav',
				'audio/x-m4a'   : 'm4a',
				'audio/aac'     : 'm4a',
				'audio/mp4'     : 'm4a',
				'audio/x-mp4'   : 'm4a',
				'audio/ogg'     : 'ogg',
				'audio/webm'    : 'webm',
				'audio/flac'    : 'flac',
				'audio/x-flac'  : 'flac',
				'audio/amr'     : 'amr'
			},
			node, curHash,
			win  = ql.window,
			navi = ql.navbar,
			AMR, autoplay,
			controlsList = typeof ql.options.mediaControlsList === 'string' && ql.options.mediaControlsList? ' controlsList="' + fm.escape(ql.options.mediaControlsList) + '"' : '',
			setNavi = function() {
				navi.css('bottom', win.hasClass('elfinder-quicklook-fullscreen')? '50px' : '');
			},
			getNode = function(src, hash) {
				return jQuery('<audio class="elfinder-quicklook-preview-audio ui-front" controls' + controlsList + ' preload="auto" autobuffer><source src="'+src+'" ></source></audio>')
					.on('change', function(e) {
						// Firefox fire change event on seek or volume change
						e.stopPropagation();
					})
					.on('error', function(e) {
						node && node.data('hash') === hash && reset();
					})
					.data('hash', hash)
					.appendTo(preview);
			},
			amrToWavUrl = function(hash) {
				var dfd = jQuery.Deferred(),
					loader = jQuery.Deferred().done(function() {
						var opDfd;
						opDfd = fm.getContents(hash, 'arraybuffer', { progressBar: prog }).done(function(data) {
							try {
								var buffer = AMR.toWAV(new Uint8Array(data));
								if (buffer) {
									dfd.resolve(URL.createObjectURL(new Blob([buffer], { type: 'audio/x-wav' })));
								} else {
									dfd.reject();
								}
							} catch(e) {
								dfd.reject();
							}
						}).fail(function() {
							dfd.reject();
						});
						// stop loading on change file if not loaded yet
						preview.one('change', function() {
							opDfd && opDfd.state && opDfd.state() === 'pending' && opDfd.reject();
						});
					}).fail(function() {
						AMR = false;
						dfd.reject();
					}),
					_AMR;
				if (window.TextEncoder && window.URL && URL.createObjectURL && typeof AMR === 'undefined') {
					// previous window.AMR
					_AMR = window.AMR;
					delete window.AMR;
					fm.loadScript(
						[ fm.options.cdns.amr ],
						function() { 
							AMR = window.AMR? window.AMR : false;
							// restore previous window.AMR
							window.AMR = _AMR;
							loader[AMR? 'resolve':'reject']();
						},
						{
							error: function() {
								loader.reject();
							}
						}
					);
				} else {
					loader[AMR? 'resolve':'reject']();
				}
				return dfd;
			},
			play = function(player) {
				var hash = node.data('hash'),
					playPromise;
				autoplay && (playPromise = player.play());
				// uses "playPromise['catch']" instead "playPromise.catch" to support Old IE
				if (playPromise && playPromise['catch']) {
					playPromise['catch'](function(e) {
						if (!player.paused) {
							node && node.data('hash') === hash && reset();
						}
					});
				}
			},
			reset = function() {
				if (node && node.parent().length) {
					var elm = node[0],
						url = node.children('source').attr('src');
					win.off('viewchange.audio');
					try {
						elm.pause();
						node.empty();
						if (url.match(/^blob:/)) {
							URL.revokeObjectURL(url);
						}
						elm.src = '';
						elm.load();
					} catch(e) {}
					node.remove();
					node = null;
				}
			},
			loading, prog;

		preview.on(ql.evUpdate, function(e) {
			var file = e.file,
				type = mimes[file.mime],
				html5, opDfd;

			if (mimes[file.mime] && ql.dispInlineRegex.test(file.mime) && ((html5 = ql.support.audio[type]) || (type === 'amr'))) {
				autoplay = ql.autoPlay();
				curHash = file.hash;
				if (!html5) {
					if (fm.options.cdns.amr && type === 'amr' && AMR !== false) {
						e.stopImmediatePropagation();
						loading = jQuery('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+fm.i18n('nowLoading')+'</span><span class="elfinder-spinner"></span></div>').appendTo(ql.info.find('.elfinder-quicklook-info'));
						prog = jQuery('<div class="elfinder-quicklook-info-progress"></div>').appendTo(loading);
						node = getNode('', curHash);
						amrToWavUrl(file.hash).done(function(url) {
							loading.remove();
							if (curHash === file.hash) {
								var elm = node[0];
								try {
									node.children('source').attr('src', url);
									elm.pause();
									elm.load();
									play(elm);
									win.on('viewchange.audio', setNavi);
									setNavi();
								} catch(e) {
									URL.revokeObjectURL(url);
									node.remove();
								}
							} else {
								URL.revokeObjectURL(url);
							}
						}).fail(function() {
							node.remove();
						});
					}
				} else {
					e.stopImmediatePropagation();
					loading = jQuery('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+fm.i18n('nowLoading')+'</span><span class="elfinder-spinner"></span></div>').appendTo(ql.info.find('.elfinder-quicklook-info'));
					prog = jQuery('<div class="elfinder-quicklook-info-progress"></div>').appendTo(loading);
					opDfd = fm.openUrl(curHash, false, function(url) {
						loading.remove();
						if (url) {
							node = getNode(url, curHash);
							play(node[0]);
							win.on('viewchange.audio', setNavi);
							setNavi();
						} else {
							node.remove();
						}
					}, { progressBar: prog });
					// stop loading on change file if not loaded yet
					preview.one('change', function() {
						opDfd && opDfd.state && opDfd.state() === 'pending' && opDfd.reject();
					});
				}
			}
		}).one('change', reset);
	},
	
	/**
	 * HTML5 video preview plugin
	 *
	 * @param elFinder.commands.quicklook
	 **/
	function(ql) {
		"use strict";
		var fm       = ql.fm,
			preview  = ql.preview,
			mimes    = {
				'video/mp4'       : 'mp4',
				'video/x-m4v'     : 'mp4',
				'video/quicktime' : 'mp4',
				'video/mpeg'      : 'mpeg',
				'video/ogg'       : 'ogg',
				'application/ogg' : 'ogg',
				'video/webm'      : 'webm',
				'video/x-matroska': 'mkv',
				'video/3gpp'      : '3gp',
				'application/vnd.apple.mpegurl' : 'm3u8',
				'application/x-mpegurl' : 'm3u8',
				'application/dash+xml'  : 'mpd',
				'video/x-flv'     : 'flv',
				'video/x-msvideo' : 'avi'
			},
			node,
			win  = ql.window,
			navi = ql.navbar,
			cHls, cDash, pDash, cFlv, cVideojs, autoplay, tm, loading, prog,
			controlsList = typeof ql.options.mediaControlsList === 'string' && ql.options.mediaControlsList? ' controlsList="' + fm.escape(ql.options.mediaControlsList) + '"' : '',
			setNavi = function() {
				if (fm.UA.iOS) {
					if (win.hasClass('elfinder-quicklook-fullscreen')) {
						preview.css('height', '-webkit-calc(100% - 50px)');
						navi._show();
					} else {
						preview.css('height', '');
					}
				} else {
					navi.css('bottom', win.hasClass('elfinder-quicklook-fullscreen')? '50px' : '');
				}
			},
			render = function(file, opts) {
				var errTm = function(e) {
						if (err > 1) {
							tm && clearTimeout(tm);
							tm = setTimeout(function() {
								!canPlay && reset(true);
							}, 800);
						}
					},
					err = 0, 
					canPlay;
				//reset();
				pDash = null;
				opts = opts || {};
				ql.hideinfo();
				node = jQuery('<video class="elfinder-quicklook-preview-video" controls' + controlsList + ' preload="auto" autobuffer playsinline>'
						+'</video>')
					.on('change', function(e) {
						// Firefox fire change event on seek or volume change
						e.stopPropagation();
					})
					.on('timeupdate progress', errTm)
					.on('canplay', function() {
						canPlay = true;
					})
					.data('hash', file.hash);
				// can not handling error event with jQuery `on` event handler
				node[0].addEventListener('error', function(e) {
					if (opts.src && fm.convAbsUrl(opts.src) === fm.convAbsUrl(e.target.src)) {
						++err;
						errTm();
					}
				}, true);

				if (opts.src) {
					node.append('<source src="'+opts.src+'" type="'+file.mime+'"></source><source src="'+opts.src+'"></source>');
				}
				
				node.appendTo(preview);

				win.on('viewchange.video', setNavi);
				setNavi();
			},
			loadHls = function(file) {
				var hls, opDfd;
				opDfd = fm.openUrl(file.hash, false, function(url) {
					loading.remove();
					if (url) {
						render(file);
						hls = new cHls();
						hls.loadSource(url);
						hls.attachMedia(node[0]);
						if (autoplay) {
							hls.on(cHls.Events.MANIFEST_PARSED, function() {
								play(node[0]);
							});
						}
					}
				}, { progressBar: prog });
				// stop loading on change file if not loaded yet
				preview.one('change', function() {
					opDfd && opDfd.state && opDfd.state() === 'pending' && opDfd.reject();
				});
			},
			loadDash = function(file) {
				var opDfd;
				opDfd = fm.openUrl(file.hash, false, function(url) {
					var debug;
					loading.remove();
					if (url) {
						render(file);
						pDash = window.dashjs.MediaPlayer().create();
						debug = pDash.getDebug();
						if (debug.setLogLevel) {
							debug.setLogLevel(dashjs.Debug.LOG_LEVEL_FATAL);
						} else if (debug.setLogToBrowserConsole) {
							debug.setLogToBrowserConsole(false);
						}
						pDash.initialize(node[0], url, autoplay);
						pDash.on('error', function(e) {
							reset(true);
						});
					}
				}, { progressBar: prog });
				// stop loading on change file if not loaded yet
				preview.one('change', function() {
					opDfd && opDfd.state && opDfd.state() === 'pending' && opDfd.reject();
				});
			},
			loadFlv = function(file) {
				var opDfd
				if (!cFlv.isSupported()) {
					cFlv = false;
					return;
				}
				opDfd = fm.openUrl(file.hash, false, function(url) {
					loading.remove();
					if (url) {
						var player = cFlv.createPlayer({
							type: 'flv',
							url: url
						});
						render(file);
						player.on(cFlv.Events.ERROR, function() {
							player.destroy();
							reset(true);
						});
						player.attachMediaElement(node[0]);
						player.load();
						play(player);
					}
				}, { progressBar: prog });
				// stop loading on change file if not loaded yet
				preview.one('change', function() {
					opDfd && opDfd.state && opDfd.state() === 'pending' && opDfd.reject();
				});
			},
			loadVideojs = function(file) {
				var opDfd;
				opDfd = fm.openUrl(file.hash, false, function(url) {
					loading.remove();
					if (url) {
						render(file);
						node[0].src = url;
						cVideojs(node[0], {
							src: url
						});
					}
				}, { progressBar: prog });
				// stop loading on change file if not loaded yet
				preview.one('change', function() {
					opDfd && opDfd.state && opDfd.state() === 'pending' && opDfd.reject();
				});
			},
			play = function(player) {
				var hash = node.data('hash'),
					playPromise;
				autoplay && (playPromise = player.play());
				// uses "playPromise['catch']" instead "playPromise.catch" to support Old IE
				if (playPromise && playPromise['catch']) {
					playPromise['catch'](function(e) {
						if (!player.paused) {
							node && node.data('hash') === hash && reset(true);
						}
					});
				}
			},
			reset = function(showInfo) {
				tm && clearTimeout(tm);
				if (node && node.parent().length) {
					var elm = node[0];
					win.off('viewchange.video');
					pDash && pDash.reset();
					try {
						elm.pause();
						node.empty();
						elm.src = '';
						elm.load();
					} catch(e) {}
					node.remove();
					node = null;
				}
				showInfo && ql.info.show();
			};

		preview.on(ql.evUpdate, function(e) {
			var file = e.file,
				mime = file.mime.toLowerCase(),
				type = mimes[mime],
				stock, playPromise, opDfd;
			
			if (mimes[mime] && ql.dispInlineRegex.test(file.mime) /*&& (((type === 'm3u8' || (type === 'mpd' && !fm.UA.iOS) || type === 'flv') && !fm.UA.ltIE10) || ql.support.video[type])*/) {
				autoplay = ql.autoPlay();
				loading = jQuery('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+fm.i18n('nowLoading')+'</span><span class="elfinder-spinner"></span></div>');
				prog = jQuery('<div class="elfinder-quicklook-info-progress"></div>').appendTo(loading);
				if (ql.support.video[type] && (type !== 'm3u8' || fm.UA.Safari)) {
					e.stopImmediatePropagation();
					loading.appendTo(ql.info.find('.elfinder-quicklook-info'));
					opDfd = fm.openUrl(file.hash, false, function(url) {
						loading.remove();
						if (url) {
							render(file, { src: url });
							play(node[0]);
						}
					}, { progressBar: prog });
					// stop loading on change file if not loaded yet
					preview.one('change', function() {
						opDfd && opDfd.state && opDfd.state() === 'pending' && opDfd.reject();
					});
				} else {
					if (cHls !== false && fm.options.cdns.hls && type === 'm3u8') {
						e.stopImmediatePropagation();
						loading.appendTo(ql.info.find('.elfinder-quicklook-info'));
						if (cHls) {
							loadHls(file);
						} else {
							stock = window.Hls;
							delete window.Hls;
							fm.loadScript(
								[ fm.options.cdns.hls ],
								function(res) { 
									cHls = res || window.Hls || false;
									window.Hls = stock;
									cHls && loadHls(file);
								},
								{
									tryRequire: true,
									error : function() {
										cHls = false;
									}
								}
							);
						}
					} else if (cDash !== false && fm.options.cdns.dash && type === 'mpd') {
						e.stopImmediatePropagation();
						loading.appendTo(ql.info.find('.elfinder-quicklook-info'));
						if (cDash) {
							loadDash(file);
						} else {
							fm.loadScript(
								[ fm.options.cdns.dash ],
								function() {
									// dashjs require window.dashjs in global scope
									cDash = window.dashjs? true : false;
									cDash && loadDash(file);
								},
								{
									tryRequire: true,
									error : function() {
										cDash = false;
									}
								}
							);
						}
					} else if (cFlv !== false && fm.options.cdns.flv && type === 'flv') {
						e.stopImmediatePropagation();
						loading.appendTo(ql.info.find('.elfinder-quicklook-info'));
						if (cFlv) {
							loadFlv(file);
						} else {
							stock = window.flvjs;
							delete window.flvjs;
							fm.loadScript(
								[ fm.options.cdns.flv ],
								function(res) { 
									cFlv = res || window.flvjs || false;
									window.flvjs = stock;
									cFlv && loadFlv(file);
								},
								{
									tryRequire: true,
									error : function() {
										cFlv = false;
									}
								}
							);
						}
					} else if (fm.options.cdns.videojs) {
						e.stopImmediatePropagation();
						loading.appendTo(ql.info.find('.elfinder-quicklook-info'));
						if (cVideojs) {
							loadVideojs(file);
						} else {
							fm.loadScript(
								[ fm.options.cdns.videojs + '/video.min.js' ],
								function(res) { 
									cVideojs = res || window.videojs || false;
									//window.flvjs = stock;
									cVideojs && loadVideojs(file);
								},
								{
									tryRequire: true,
									error : function() {
										cVideojs = false;
									}
								}
							).loadCss([fm.options.cdns.videojs + '/video-js.min.css']);
						}
					}
				}
			}
		}).one('change', reset);
	},
	
	/**
	 * Audio/video preview plugin using browser plugins
	 *
	 * @param elFinder.commands.quicklook
	 **/
	function(ql) {
		"use strict";
		var preview = ql.preview,
			mimes   = [],
			node,
			win  = ql.window,
			navi = ql.navbar;
			
		jQuery.each(navigator.plugins, function(i, plugins) {
			jQuery.each(plugins, function(i, plugin) {
				(plugin.type.indexOf('audio/') === 0 || plugin.type.indexOf('video/') === 0) && mimes.push(plugin.type);
			});
		});
		mimes = ql.fm.arrayFlip(mimes);
		
		preview.on(ql.evUpdate, function(e) {
			var file  = e.file,
				mime  = file.mime,
				video, opDfd, loading, prog,
				setNavi = function() {
					navi.css('bottom', win.hasClass('elfinder-quicklook-fullscreen')? '50px' : '');
				};
			
			if (mimes[file.mime] && ql.dispInlineRegex.test(file.mime)) {
				e.stopImmediatePropagation();
				loading = jQuery('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+fm.i18n('nowLoading')+'</span><span class="elfinder-spinner"></span></div>').appendTo(ql.info.find('.elfinder-quicklook-info'));
				prog = jQuery('<div class="elfinder-quicklook-info-progress"></div>').appendTo(loading);
				opDfd = ql.fm.openUrl(file.hash, false, function(url) {
					loading.remove();
					if (url) {
						(video = mime.indexOf('video/') === 0) && ql.hideinfo();
						node = jQuery('<embed src="'+url+'" type="'+mime+'" class="elfinder-quicklook-preview-'+(video ? 'video' : 'audio')+'"/>')
							.appendTo(preview);
						
						win.on('viewchange.embed', setNavi);
						setNavi();
					}
				}, { progressBar: prog });
				// stop loading on change file if not loaded yet
				preview.one('change', function() {
					opDfd && opDfd.state && opDfd.state() === 'pending' && opDfd.reject();
				});
			}
		}).one('change', function() {
			if (node && node.parent().length) {
				win.off('viewchange.embed');
				node.remove();
				node= null;
			}
		});
		
	},

	/**
	 * Archive(zip|gzip|tar|bz2) preview plugin using https://github.com/imaya/zlib.js
	 *
	 * @param elFinder.commands.quicklook
	 **/
	function(ql) {
		"use strict";
		var fm      = ql.fm,
			mimes   = fm.arrayFlip(['application/zip', 'application/x-gzip', 'application/x-tar', 'application/x-bzip2']),
			preview = ql.preview,
			sizeMax = fm.returnBytes(ql.options.unzipMaxSize || 0),
			Zlib    = (fm.options.cdns.zlibUnzip && fm.options.cdns.zlibGunzip)? true : false,
			bzip2   = fm.options.cdns.bzip2? true : false;

		if (window.Worker && window.Uint8Array && window.DataView) {
			preview.on(ql.evUpdate, function(e) {
				var file  = e.file,
					isTar = (file.mime === 'application/x-tar'),
					isBzip2 = (file.mime === 'application/x-bzip2'),
					isZlib = (file.mime === 'application/zip' || file.mime === 'application/x-gzip');
				if (mimes[file.mime] && (!sizeMax || file.size <= sizeMax) && (
						isTar
						|| (isBzip2 && bzip2)
						|| (isZlib && Zlib)
					)) {
					var jqxhr, wk, loading, prog, url,
						req = function() {
							jqxhr = fm.getContents(file.hash, 'arraybuffer', { progressBar: prog })
							.fail(function() {
								loading.remove();
							})
							.done(function(data) {
								var unzip, filenames,
									err = function(e) {
										wk && wk.terminate();
										loading.remove();
										if (isZlib) {
											Zlib = false;
										} else if (isBzip2) {
											bzip2 = false;
										}
										fm.debug('error', e);
									};
								try {
									wk = fm.getWorker();
									wk.onmessage = function(res) {
										wk && wk.terminate();
										loading.remove();
										if (!res.data || res.data.error) {
											new Error(res.data && res.data.error? res.data.error : '');
										} else {
											makeList(res.data.files);
										}
									};
									wk.onerror = err;
									if (file.mime === 'application/x-tar') {
										wk.postMessage({
											scripts: [fm.getWorkerUrl('quicklook.unzip.js')],
											data: { type: 'tar', bin: data }
										});
									} else if (file.mime === 'application/zip') {
										wk.postMessage({
											scripts: [fm.options.cdns.zlibUnzip, fm.getWorkerUrl('quicklook.unzip.js')],
											data: { type: 'zip', bin: data }
										});
									} else if (file.mime === 'application/x-gzip') {
										wk.postMessage({
											scripts: [fm.options.cdns.zlibGunzip, fm.getWorkerUrl('quicklook.unzip.js')],
											data: { type: 'gzip', bin: data }
										});

									} else if (file.mime === 'application/x-bzip2') {
										wk.postMessage({
											scripts: [fm.options.cdns.bzip2, fm.getWorkerUrl('quicklook.unzip.js')],
											data: { type: 'bzip2', bin: data }
										});
									}
								} catch (e) {
									err(e);
								}
							});
						},
						makeList = function(filenames) {
							var header, list, doc, tsize = 0;
							if (filenames && filenames.length) {
								filenames = jQuery.map(filenames, function(str) {
									return fm.decodeRawString(str);
								});
								filenames.sort();
								list = fm.escape(filenames.join("\n").replace(/\{formatSize\((\d+)\)\}/g, function(m, s) {
									tsize += parseInt(s);
									return fm.formatSize(s);
								}));
								header = '<strong>'+fm.escape(file.mime)+'</strong> ('+fm.formatSize(file.size)+' / '+fm.formatSize(tsize)+')'+'<hr/>';
								doc = jQuery('<div class="elfinder-quicklook-preview-archive-wrapper">'+header+'<pre class="elfinder-quicklook-preview-text">'+list+'</pre></div>')
									.on('touchstart', function(e) {
										if (jQuery(this)['scroll' + (fm.direction === 'ltr'? 'Right' : 'Left')]() > 5) {
											e.originalEvent._preventSwipeX = true;
										}
									})
									.appendTo(preview);
								ql.hideinfo();
							}
							loading.remove();
						};

					// this is our file - stop event propagation
					e.stopImmediatePropagation();
					
					loading = jQuery('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+fm.i18n('nowLoading')+'</span><span class="elfinder-spinner"></span></div>').appendTo(ql.info.find('.elfinder-quicklook-info'));
					prog = jQuery('<div class="elfinder-quicklook-info-progress"></div>').appendTo(loading);
					
					// stop loading on change file if not loaded yet
					preview.one('change', function() {
						jqxhr.state() === 'pending' && jqxhr.reject();
						wk && wk.terminate();
						loading.remove();
					});
					
					req();
				}
			});
		}
	},

	/**
	 * RAR Archive preview plugin using https://github.com/43081j/rar.js
	 *
	 * @param elFinder.commands.quicklook
	 **/
	function(ql) {
		"use strict";
		var fm      = ql.fm,
			mimes   = fm.arrayFlip(['application/x-rar']),
			preview = ql.preview,
			RAR;

		if (window.DataView) {
			preview.on(ql.evUpdate, function(e) {
				var file = e.file;
				if (mimes[file.mime] && fm.options.cdns.rar && RAR !== false) {
					var loading, prog, url, archive, abort,
						getList = function(url) {
							if (abort) {
								loading.remove();
								return;
							}
							try {
								archive = RAR({
									file: url,
									type: 2,
									xhrHeaders: fm.customHeaders,
									xhrFields: fm.xhrFields
								}, function(err) {
									loading.remove();
									var filenames = [],
										header, doc;
									if (abort || err) {
										// An error occurred (not a rar, read error, etc)
										err && fm.debug('error', err);
										return;
									}
									jQuery.each(archive.entries, function() {
										filenames.push(this.path + (this.size? ' (' + fm.formatSize(this.size) + ')' : ''));
									});
									if (filenames.length) {
										filenames = jQuery.map(filenames, function(str) {
											return fm.decodeRawString(str);
										});
										filenames.sort();
										header = '<strong>'+fm.escape(file.mime)+'</strong> ('+fm.formatSize(file.size)+')'+'<hr/>';
										doc = jQuery('<div class="elfinder-quicklook-preview-archive-wrapper">'+header+'<pre class="elfinder-quicklook-preview-text">'+fm.escape(filenames.join("\n"))+'</pre></div>')
											.on('touchstart', function(e) {
												if (jQuery(this)['scroll' + (fm.direction === 'ltr'? 'Right' : 'Left')]() > 5) {
													e.originalEvent._preventSwipeX = true;
												}
											})
											.appendTo(preview);
										ql.hideinfo();
									}
								});
							} catch(e) {
								loading.remove();
							}
						},
						error = function() {
							RAR = false;
							loading.remove();
						},
						_RAR, opDfd;

					// this is our file - stop event propagation
					e.stopImmediatePropagation();
					
					loading = jQuery('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+fm.i18n('nowLoading')+'</span><span class="elfinder-spinner"></span></div>').appendTo(ql.info.find('.elfinder-quicklook-info'));
					prog = jQuery('<div class="elfinder-quicklook-info-progress"></div>').appendTo(loading);
					
					// stop loading on change file if not loaded yet
					preview.one('change', function() {
						archive && (archive.abort = true);
						loading.remove();
						abort = true;
					});
					
					opDfd = fm.openUrl(file.hash, 'sameorigin', function(url) {
						if (url) {
							if (RAR) {
								getList(url);
							} else {
								if (window.RarArchive) {
									_RAR = window.RarArchive;
									delete window.RarArchive;
								}
								fm.loadScript(
									[ fm.options.cdns.rar ],
									function() {
										if (fm.hasRequire) {
											require(['rar'], function(RarArchive) {
												RAR = RarArchive;
												getList(url);
											}, error);
										} else {
											if (RAR = window.RarArchive) {
												if (_RAR) {
													window.RarArchive = _RAR;
												} else {
													delete window.RarArchive;
												}
												getList(url);
											} else {
												error();
											}
										}
									},
									{
										tryRequire: true,
										error : error
									}
								);
							}
						}
					}, { progressBar: prog, temporary: true });
					// stop loading on change file if not loaded yet
					preview.one('change', function() {
						opDfd && opDfd.state && opDfd.state() === 'pending' && opDfd.reject();
					});
				}
			});
		}
	},

	/**
	 * CAD-Files and 3D-Models online viewer on sharecad.org
	 *
	 * @param elFinder.commands.quicklook
	 **/
	function(ql) {
		"use strict";
		var fm      = ql.fm,
			mimes   = fm.arrayFlip(ql.options.sharecadMimes || []),
			preview = ql.preview,
			win     = ql.window,
			node;
			
		if (ql.options.sharecadMimes.length) {
			ql.addIntegration({
				title: 'ShareCAD.org CAD and 3D-Models viewer',
				link: 'https://sharecad.org/DWGOnlinePlugin'
			});
		}

		preview.on(ql.evUpdate, function(e) {
			var file = e.file;
			if (mimes[file.mime.toLowerCase()] && fm.option('onetimeUrl', file.hash)) {
				var win     = ql.window,
					loading, prog, url;
				
				e.stopImmediatePropagation();
				if (file.url == '1') {
					preview.hide();
					jQuery('<div class="elfinder-quicklook-info-data"><button class="elfinder-info-button">'+fm.i18n('getLink')+'</button></div>').appendTo(ql.info.find('.elfinder-quicklook-info'))
					.on('click', function() {
						var self = jQuery(this);
						self.html('<span class="elfinder-spinner">');
						fm.request({
							data : {cmd : 'url', target : file.hash},
							preventDefault : true,
							progressBar : prog
						})
						.always(function() {
							self.html('');
						})
						.done(function(data) {
							var rfile = fm.file(file.hash);
							file.url = rfile.url = data.url || '';
							if (file.url) {
								preview.trigger({
									type: ql.evUpdate,
									file: file,
									forceUpdate: true
								});
							}
						});
					});
				}
				if (file.url !== '' && file.url != '1') {
					preview.one('change', function() {
						loading.remove();
						node.off('load').remove();
						node = null;
					}).addClass('elfinder-overflow-auto');
					
					loading = jQuery('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+fm.i18n('nowLoading')+'</span><span class="elfinder-spinner"></span></div>').appendTo(ql.info.find('.elfinder-quicklook-info'));
					prog = jQuery('<div class="elfinder-quicklook-info-progress"></div>').appendTo(loading);
					
					url = fm.convAbsUrl(fm.url(file.hash));
					node = jQuery('<iframe class="elfinder-quicklook-preview-iframe" scrolling="no"></iframe>')
						.css('background-color', 'transparent')
						.appendTo(preview)
						.on('load', function() {
							ql.hideinfo();
							loading.remove();
							ql.preview.after(ql.info);
							jQuery(this).css('background-color', '#fff').show();
						})
						.on('error', function() {
							loading.remove();
							ql.preview.after(ql.info);
						})
						.attr('src', '//sharecad.org/cadframe/load?url=' + encodeURIComponent(url));
					
					ql.info.after(ql.preview);
				}
			}
			
		});
	},

	/**
	 * KML preview with GoogleMaps API
	 *
	 * @param elFinder.commands.quicklook
	 */
	function(ql) {
		"use strict";
		var fm      = ql.fm,
			mimes   = {
				'application/vnd.google-earth.kml+xml' : true,
				'application/vnd.google-earth.kmz' : true
			},
			preview = ql.preview,
			gMaps, loadMap, wGmfail, fail, mapScr;

		if (ql.options.googleMapsApiKey) {
			ql.addIntegration({
				title: 'Google Maps',
				link: 'https://www.google.com/intl/' + fm.lang.replace('_', '-') + '/help/terms_maps.html'
			});
			gMaps = (window.google && google.maps);
			// start load maps
			loadMap = function(file, node, prog) {
				var mapsOpts = ql.options.googleMapsOpts.maps;
				fm.forExternalUrl(file.hash, { progressBar: prog }).done(function(url) {
					if (url) {
						try {
							new gMaps.KmlLayer(url, Object.assign({
								map: new gMaps.Map(node.get(0), mapsOpts)
							}, ql.options.googleMapsOpts.kml));
							ql.hideinfo();
						} catch(e) {
							fail();
						}
					} else {
						fail();
					}
				});
			};
			// keep stored error handler if exists
			wGmfail = window.gm_authFailure;
			// on error function
			fail = function() {
				mapScr = null;
			};
			// API script url
			mapScr = 'https://maps.googleapis.com/maps/api/js?key=' + ql.options.googleMapsApiKey;
			// error handler
			window.gm_authFailure = function() {
				fail();
				wGmfail && wGmfail();
			};

			preview.on(ql.evUpdate, function(e) {
				var file = e.file;
				if (mapScr && mimes[file.mime.toLowerCase()]) {
					var win     = ql.window,
						getLink = (file.url == '1' && !fm.option('onetimeUrl', file.hash)),
						loading, prog, url, node;
				
					e.stopImmediatePropagation();
					loading = jQuery('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+fm.i18n('nowLoading')+'</span><span class="elfinder-spinner"></span></div>').appendTo(ql.info.find('.elfinder-quicklook-info'));
					prog = jQuery('<div class="elfinder-quicklook-info-progress"></div>').appendTo(loading);
					if (getLink) {
						preview.hide();
						jQuery('<div class="elfinder-quicklook-info-data"><button class="elfinder-info-button">'+fm.i18n('getLink')+'</button></div>').appendTo(ql.info.find('.elfinder-quicklook-info'))
						.on('click', function() {
							var self = jQuery(this);
							self.html('<span class="elfinder-spinner">');
							fm.request({
								data : {cmd : 'url', target : file.hash},
								preventDefault : true,
								progressBar : prog
							})
							.always(function() {
								loading.remove();
								self.html('');
							})
							.done(function(data) {
								var rfile = fm.file(file.hash);
								file.url = rfile.url = data.url || '';
								if (file.url) {
									preview.trigger({
										type: ql.evUpdate,
										file: file,
										forceUpdate: true
									});
								}
							});
						});
					}
					if (file.url !== '' && !getLink) {
						node = jQuery('<div style="width:100%;height:100%;"></div>').appendTo(preview);
						preview.one('change', function() {
							node.remove();
							node = null;
						});
						if (!gMaps) {
							fm.loadScript([mapScr], function() {
								gMaps = window.google && google.maps;
								gMaps && loadMap(file, node, prog);
							});
						} else {
							loadMap(file, node, prog);
						}
					}
				}
			});
		}
	},

	/**
	 * Any supported files preview plugin using (Google docs | MS Office) online viewer
	 *
	 * @param elFinder.commands.quicklook
	 **/
	function(ql) {
		"use strict";
		var fm      = ql.fm,
			mimes   = Object.assign(fm.arrayFlip(ql.options.googleDocsMimes || [], 'g'), fm.arrayFlip(ql.options.officeOnlineMimes || [], 'm')),
			preview = ql.preview,
			win     = ql.window,
			navi    = ql.navbar,
			urls    = {
				g: 'docs.google.com/gview?embedded=true&url=',
				m: 'view.officeapps.live.com/op/embed.aspx?wdStartOn=0&src='
			},
			navBottom = {
				g: '56px',
				m: '24px'
			},
			mLimits = {
				xls  : 5242880, // 5MB
				xlsb : 5242880,
				xlsx : 5242880,
				xlsm : 5242880,
				other: 10485760 // 10MB
			},
			node, enable;
		
		if (ql.options.googleDocsMimes.length) {
			enable = true;
			ql.addIntegration({
				title: 'Google Docs Viewer',
				link: 'https://docs.google.com/'
			});
		}
		if (ql.options.officeOnlineMimes.length) {
			enable = true;
			ql.addIntegration({
				title: 'MS Online Doc Viewer',
				link: 'https://products.office.com/office-online/view-office-documents-online'
			});
		}

		if (enable) {
			preview.on(ql.evUpdate, function(e) {
				var file = e.file,
					type, dfd;
				// 25MB is maximum filesize of Google Docs prevew
				if (file.size <= 26214400 && (type = mimes[file.mime])) {
					var win     = ql.window,
						setNavi = function() {
							navi.css('bottom', win.hasClass('elfinder-quicklook-fullscreen')? navBottom[type] : '');
						},
						ext     = fm.mimeTypes[file.mime],
						getLink = (file.url == '1' && !fm.option('onetimeUrl', file.hash)),
						loading, prog, url, tm;
					
					if (type === 'm') {
						if ((mLimits[ext] && file.size > mLimits[ext]) || file.size > mLimits.other) {
							type = 'g';
						}
					}
					if (getLink) {
						preview.hide();
						jQuery('<div class="elfinder-quicklook-info-data"><button class="elfinder-info-button">'+fm.i18n('getLink')+'</button></div>').appendTo(ql.info.find('.elfinder-quicklook-info'))
						.on('click', function() {
							var self = jQuery(this);
							self.html('<span class="elfinder-spinner">');
							fm.request({
								data : {cmd : 'url', target : file.hash},
								preventDefault : true
							})
							.always(function() {
								self.html('');
							})
							.done(function(data) {
								var rfile = fm.file(file.hash);
								file.url = rfile.url = data.url || '';
								if (file.url) {
									preview.trigger({
										type: ql.evUpdate,
										file: file,
										forceUpdate: true
									});
								}
							});
						});
					}
					if (file.url !== '' && !getLink) {
						e.stopImmediatePropagation();
						preview.one('change', function() {
							dfd && dfd.status && dfd.status() === 'pending' && dfd.reject();
							win.off('viewchange.googledocs');
							loading.remove();
							node.off('load').remove();
							node = null;
						}).addClass('elfinder-overflow-auto');
						
						loading = jQuery('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+fm.i18n('nowLoading')+'</span><span class="elfinder-spinner"></span></div>').appendTo(ql.info.find('.elfinder-quicklook-info'));
						prog = jQuery('<div class="elfinder-quicklook-info-progress"></div>').appendTo(loading);

						node = jQuery('<iframe class="elfinder-quicklook-preview-iframe"></iframe>')
							.css('background-color', 'transparent')
							.appendTo(preview);

						dfd = fm.forExternalUrl(file.hash, { progressBar: prog }).done(function(url) {
							var load = function() {
									try {
										if (node && (!node.attr('src') || node.get(0).contentWindow.document/*maybe HTTP 204*/)) {
											node.attr('src', 'https://' + urls[type] + encodeURIComponent(url));
											// Retry because Google Docs viewer sometimes returns HTTP 204
											tm = setTimeout(load, 2000);
										}
									} catch(e) {}
								};
							if (url) {
								if (file.ts) {
									url += (url.match(/\?/)? '&' : '?') + '_t=' + file.ts;
								}
								node.on('load', function() {
									tm && clearTimeout(tm);
									ql.hideinfo();
									loading.remove();
									ql.preview.after(ql.info);
									jQuery(this).css('background-color', '#fff').show();
								})
								.on('error', function() {
									tm && clearTimeout(tm);
									loading.remove();
									ql.preview.after(ql.info);
								});
								load();
							} else {
								loading.remove();
								node.remove();
							}
						});

						win.on('viewchange.googledocs', setNavi);
						setNavi();
						ql.info.after(ql.preview);
					}
				}
				
			});
		}
	},

	/**
	 * Texts preview plugin
	 *
	 * @param elFinder.commands.quicklook
	 **/
	function(ql) {
		"use strict";
		var fm      = ql.fm,
			preview = ql.preview,
			textLines = parseInt(ql.options.textInitialLines) || 150,
			prettifyLines = parseInt(ql.options.prettifyMaxLines) || 500,
			PR, _PR,
			error = function() {
				prettify = function() { return false; };
				_PR && (window.PR = _PR);
				PR = false;
			},
			prettify = function(node) {
				if (fm.options.cdns.prettify) {
					prettify = function(node) {
						setTimeout(function() {
							PRcheck(node);
						}, 100);
						return 'pending';
					};
					if (window.PR) {
						_PR = window.PR;
					}
					fm.loadScript([fm.options.cdns.prettify + (fm.options.cdns.prettify.match(/\?/)? '&' : '?') + 'autorun=false'], function(wPR) {
						PR = wPR || window.PR;
						if (typeof PR === 'object') {
							prettify = function() { return true; };
							if (_PR) {
								window.PR = _PR;
							} else {
								delete window.PR;
							}
							exec(node);
						} else {
							error();
						}
					}, {
						tryRequire: true,
						error : error
					});
				} else {
					error();
				}
			},
			exec = function(node) {
				if (node && !node.hasClass('prettyprinted')) {
					node.css('cursor', 'wait');
					requestAnimationFrame(function() {
						PR.prettyPrint && PR.prettyPrint(null, node.get(0));
						node.css('cursor', '');
					});
				}
			},
			PRcheck = function(node) {
				var status = prettify(node);
				if (status === true) {
					exec(node);
				}
			};
		
		preview.on(ql.evUpdate, function(e) {
			var file = e.file,
				mime = file.mime,
				jqxhr, loading, prog, encSelect;
			
			if (fm.mimeIsText(file.mime) && (!ql.options.getSizeMax || file.size <= ql.options.getSizeMax) && PR !== false) {
				e.stopImmediatePropagation();
				
				loading = jQuery('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+fm.i18n('nowLoading')+'</span><span class="elfinder-spinner"></span></div>').appendTo(ql.info.find('.elfinder-quicklook-info'));
				prog = jQuery('<div class="elfinder-quicklook-info-progress"></div>').appendTo(loading);

				// stop loading on change file if not loadin yet
				preview.one('change', function() {
					jqxhr.state() == 'pending' && jqxhr.reject();
					encSelect && encSelect.remove();
				});
				
				jqxhr = fm.request({
					data           : {cmd : 'get', target : file.hash, conv : (file.encoding || 1), _t : file.ts},
					options        : {type: 'get', cache : true},
					preventDefault : true,
					progressBar    : prog
				})
				.done(function(data) {
					var reg = new RegExp('^(data:'+file.mime.replace(/([.+])/g, '\\$1')+';base64,)', 'i'),
						text = data.content,
						part, more, node, lines, m;
					if (typeof text !== 'string') {
						return;
					}
					ql.hideinfo();
					if (window.atob && (m = text.match(reg))) {
						text = atob(text.substr(m[1].length));
					}
					
					lines = text.match(/([^\r\n]{1,100}[\r\n]*)/g);
					more = lines.length - textLines;
					if (more > 10) {
						part = lines.splice(0, textLines).join('');
					} else {
						more = 0;
					}

					node = jQuery('<div class="elfinder-quicklook-preview-text-wrapper"><pre class="elfinder-quicklook-preview-text prettyprint"></pre></div>');
					
					if (more) {
						node.append(jQuery('<div class="elfinder-quicklook-preview-charsleft"><hr/><span>' + fm.i18n('linesLeft', fm.toLocaleString(more)) + '</span></div>')
							.on('click', function() {
								var top = node.scrollTop();
								jQuery(this).remove();
								node.children('pre').removeClass('prettyprinted').text(text).scrollTop(top);
								if (lines.length <= prettifyLines) {
									PRcheck(node);
								}
							})
						);
					}
					node.children('pre').text(part || text);
					
					node.on('touchstart', function(e) {
						if (jQuery(this)['scroll' + (fm.direction === 'ltr'? 'Right' : 'Left')]() > 5) {
							e.originalEvent._preventSwipeX = true;
						}
					}).appendTo(preview);

					// make toast message
					if (data.toasts && Array.isArray(data.toasts)) {
						jQuery.each(data.toasts, function() {
							this.msg && fm.toast(this);
						});
					}

					PRcheck(node);
				})
				.always(function(data) {
					var cmdEdit, sel, head;
					if (cmdEdit = fm.getCommand('edit')) {
						head = [];
						if (data && data.encoding) {
							head.push({value: data.encoding});
						}
						head.push({value: 'UTF-8'});
						sel = cmdEdit.getEncSelect(head);
						sel.on('change', function() {
							file.encoding = sel.val();
							fm.cache(file, 'change');
							preview.trigger({
								type: ql.evUpdate,
								file: file,
								forceUpdate: true
							});
						});
						encSelect = jQuery('<div class="elfinder-quicklook-encoding"></div>').append(sel);
						ql.window.append(encSelect);
					}
					loading.remove();
				});
			}
		});
	}
];
js/commands/mkfile.js000064400000003213151215013360010562 0ustar00/**
 * @class  elFinder command "mkfile"
 * Create new empty file
 *
 * @author Dmitry (dio) Levashov
 **/
elFinder.prototype.commands.mkfile = function() {
	"use strict";
	var self = this;

	this.disableOnSearch = true;
	this.updateOnSelect  = false;
	this.mime            = 'text/plain';
	this.prefix          = 'untitled file.txt';
	this.variants        = [];

	this.getTypeName = function(mime, type) {
		var fm = self.fm,
			name;
		if (name = fm.messages['kind' + fm.kinds[mime]]) {
			name = fm.i18n(['extentiontype', type.toUpperCase(), name]);
		} else {
			name = fm.i18n(['extentionfile', type.toUpperCase()]);
		}
		return name;
	};

	this.fm.bind('open reload canMakeEmptyFile', function() {
		var fm = self.fm,
			hides = fm.getCommand('edit').getMkfileHides();
		self.variants = [];
		if (fm.mimesCanMakeEmpty) {
			jQuery.each(fm.mimesCanMakeEmpty, function(mime, type) {
				type && !hides[mime] && fm.uploadMimeCheck(mime) && self.variants.push([mime, self.getTypeName(mime, type)]);
			});
		}
		self.change();
	});

	this.getstate = function() {
		return this.fm.cwd().write ? 0 : -1;
	};

	this.exec = function(_dum, mime) {
		var fm = self.fm,
			type, err;
		if (type = fm.mimesCanMakeEmpty[mime]) {
			if (fm.uploadMimeCheck(mime)) {
				this.mime = mime;
				this.prefix = fm.i18n(['untitled file', type]);
				
				var prefix_val = this.prefix;
				if(prefix_val.includes("untitled file")){
					prefix_val.replace("untitled file", "NewFile");
					this.prefix = prefix_val;
				}
				return jQuery.proxy(fm.res('mixin', 'make'), self)();
			}
			err = ['errMkfile', self.getTypeName(mime, type)];
		}
		return jQuery.Deferred().reject(err);
	};
};
js/commands/reload.js000064400000003560151215013360010566 0ustar00/**
 * @class  elFinder command "reload"
 * Sync files and folders
 *
 * @author Dmitry (dio) Levashov
 **/
(elFinder.prototype.commands.reload = function() {
	"use strict";
	var self   = this,
		search = false;
	
	this.alwaysEnabled = true;
	this.updateOnSelect = true;
	
	this.shortcuts = [{
		pattern     : 'ctrl+shift+r f5'
	}];
	
	this.getstate = function() {
		return 0;
	};
	
	this.init = function() {
		this.fm.bind('search searchend', function() {
			search = this.type == 'search';
		});
	};
	
	this.fm.bind('contextmenu', function(){
		var fm = self.fm;
		if (fm.options.sync >= 1000) {
			self.extra = {
				icon: 'accept',
				node: jQuery('<span></span>')
					.attr({title: fm.i18n('autoSync')})
					.on('click touchstart', function(e){
						if (e.type === 'touchstart' && e.originalEvent.touches.length > 1) {
							return;
						}
						e.stopPropagation();
						e.preventDefault();
						jQuery(this).parent()
							.toggleClass('ui-state-disabled', fm.options.syncStart)
							.parent().removeClass('ui-state-hover');
						fm.options.syncStart = !fm.options.syncStart;
						fm.autoSync(fm.options.syncStart? null : 'stop');
					}).on('ready', function(){
						jQuery(this).parent().toggleClass('ui-state-disabled', !fm.options.syncStart).css('pointer-events', 'auto');
					})
			};
		}
	});
	
	this.exec = function() {
		var fm = this.fm;
		if (!search) {
			var dfrd    = fm.sync(),
				timeout = setTimeout(function() {
					fm.notify({type : 'reload', cnt : 1, hideCnt : true});
					dfrd.always(function() { fm.notify({type : 'reload', cnt  : -1}); });
				}, fm.notifyDelay);
				
			return dfrd.always(function() { 
				clearTimeout(timeout); 
				fm.trigger('reload');
			});
		} else {
			jQuery('div.elfinder-toolbar > div.'+fm.res('class', 'searchbtn') + ' > span.ui-icon-search').click();
		}
	};

}).prototype = { forceLoad : true }; // this is required command
js/commands/fullscreen.js000064400000002062151215013360011456 0ustar00/**
 * @class  elFinder command "fullscreen"
 * elFinder node to full scrren mode
 *
 * @author Naoki Sawada
 **/

elFinder.prototype.commands.fullscreen = function() {
	"use strict";
	var self   = this,
		fm     = this.fm,
		update = function(e, data) {
			var full;
			e.preventDefault();
			e.stopPropagation();
			if (data && data.fullscreen) {
				full = (data.fullscreen === 'on');
				self.update(void(0), full);
				self.title = fm.i18n(full ? 'reinstate' : 'cmdfullscreen');
			}
		};

	this.alwaysEnabled  = true;
	this.updateOnSelect = false;
	this.syncTitleOnChange = true;
	this.value = false;

	this.options = {
		ui : 'fullscreenbutton'
	};

	this.getstate = function() {
		return 0;
	};
	
	this.exec = function() {
		var node = fm.getUI().get(0),
			full = (node === fm.toggleFullscreen(node));
		self.title = fm.i18n(full ? 'reinstate' : 'cmdfullscreen');
		self.update(void(0), full);
		return jQuery.Deferred().resolve();
	};
	
	fm.bind('init', function() {
		fm.getUI().off('resize.' + fm.namespace, update).on('resize.' + fm.namespace, update);
	});
};
js/commands/home.js000064400000001020151215013360010235 0ustar00(elFinder.prototype.commands.home = function() {
	"use strict";
	this.title = 'Home';
	this.alwaysEnabled  = true;
	this.updateOnSelect = false;
	this.shortcuts = [{
		pattern     : 'ctrl+home ctrl+shift+up',
		description : 'Home'
	}];
	
	this.getstate = function() {
		var root = this.fm.root(),
			cwd  = this.fm.cwd().hash;
			
		return root && cwd && root != cwd ? 0: -1;
	};
	
	this.exec = function() {
		return this.fm.exec('open', this.fm.root());
	};
	

}).prototype = { forceLoad : true }; // this is required command
js/commands/help.js000064400000034323151215013360010251 0ustar00/**
 * @class  elFinder command "help"
 * "About" dialog
 *
 * @author Dmitry (dio) Levashov
 **/
 (elFinder.prototype.commands.help = function() {
	"use strict";
	var fm   = this.fm,
		self = this,
		linktpl = '<div class="elfinder-help-link"> <a href="{url}">{link}</a></div>',
		linktpltgt = '<div class="elfinder-help-link"> <a href="{url}" target="_blank">{link}</a></div>',
		atpl    = '<div class="elfinder-help-team"><div>{author}</div>{work}</div>',
		url     = /\{url\}/,
		link    = /\{link\}/,
		author  = /\{author\}/,
		work    = /\{work\}/,
		r       = 'replace',
		prim    = 'ui-priority-primary',
		sec     = 'ui-priority-secondary',
		lic     = 'elfinder-help-license',
		tab     = '<li class="' + fm.res('class', 'tabstab') + ' elfinder-help-tab-{id}"><a href="#'+fm.namespace+'-help-{id}" class="ui-tabs-anchor">{title}</a></li>',
		html    = ['<div class="ui-tabs ui-widget ui-widget-content ui-corner-all elfinder-help">', 
				'<ul class="ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-top">'],
		stpl    = '<div class="elfinder-help-shortcut"><div class="elfinder-help-shortcut-pattern">{pattern}</div> {descrip}</div>',
		sep     = '<div class="elfinder-help-separator"></div>',
		selfUrl = jQuery('base').length? fm.escape(document.location.href.replace(/#.*$/, '')) : '',
		clTabActive = fm.res('class', 'tabsactive'),
		
		getTheme = function() {
			var src;
			if (fm.theme && fm.theme.author) {
				src = atpl[r]('elfinder-help-team', 'elfinder-help-team elfinder-help-term-theme')[r](author, fm.i18n(fm.theme.author) + (fm.theme.email? ' &lt;'+fm.theme.email+'&gt;' : ''))[r](work, fm.i18n('theme') + ' ('+fm.i18n(fm.theme.name)+')');
			} else {
				src = '<div class="elfinder-help-team elfinder-help-term-theme" style="display:none"></div>';
			}
			return src;
		},

		about = function() {
			html.push('<div id="'+fm.namespace+'-help-about" class="ui-tabs-panel ui-widget-content ui-corner-bottom"><div class="elfinder-help-logo"></div>');
			html.push('<h3>elFinder</h3>');
			html.push('<div class="'+prim+'">'+fm.i18n('webfm')+'</div>');
			html.push('<div class="'+sec+'">'+fm.i18n('ver')+': '+fm.version+'</div>');
			html.push('<div class="'+sec+'">'+fm.i18n('protocolver')+': <span class="apiver"></span></div>');
			html.push('<div class="'+sec+'">jQuery/jQuery UI: '+jQuery().jquery+'/'+jQuery.ui.version+'</div>');

			html.push(sep);
			
			html.push(linktpltgt[r](url, 'https://studio-42.github.io/elFinder/')[r](link, fm.i18n('homepage')));
			html.push(linktpltgt[r](url, 'https://github.com/Studio-42/elFinder/wiki')[r](link, fm.i18n('docs')));
			html.push(linktpltgt[r](url, 'https://github.com/Studio-42/elFinder')[r](link, fm.i18n('github')));
			//html.push(linktpltgt[r](url, 'http://twitter.com/elrte_elfinder')[r](link, fm.i18n('twitter')));
			
			html.push(sep);
			
			html.push('<div class="'+prim+'">'+fm.i18n('team')+'</div>');
			
			html.push(atpl[r](author, 'Dmitry "dio" Levashov &lt;dio@std42.ru&gt;')[r](work, fm.i18n('chiefdev')));
			html.push(atpl[r](author, 'Naoki Sawada &lt;hypweb+elfinder@gmail.com&gt;')[r](work, fm.i18n('developer')));
			html.push(atpl[r](author, 'Troex Nevelin &lt;troex@fury.scancode.ru&gt;')[r](work, fm.i18n('maintainer')));
			html.push(atpl[r](author, 'Alexey Sukhotin &lt;strogg@yandex.ru&gt;')[r](work, fm.i18n('contributor')));
			
			if (fm.i18[fm.lang].translator) {
				jQuery.each(fm.i18[fm.lang].translator.split(', '), function() {
					html.push(atpl[r](author, jQuery.trim(this))[r](work, fm.i18n('translator')+' ('+fm.i18[fm.lang].language+')'));
				});	
			}
			
			html.push(getTheme());

			html.push(sep);
			html.push('<div class="'+lic+'">'+fm.i18n('icons')+': Pixelmixer, <a href="http://p.yusukekamiyamane.com" target="_blank">Fugue</a>, <a href="https://icons8.com" target="_blank">Icons8</a></div>');
			
			html.push(sep);
			html.push('<div class="'+lic+'">Licence: 3-clauses BSD Licence</div>');
			html.push('<div class="'+lic+'">Copyright © 2009-2021, Studio 42</div>');
			html.push('<div class="'+lic+'">„ …'+fm.i18n('dontforget')+' ”</div>');
			html.push('</div>');
		},
		shortcuts = function() {
			var sh = fm.shortcuts();
			// shortcuts tab
			html.push('<div id="'+fm.namespace+'-help-shortcuts" class="ui-tabs-panel ui-widget-content ui-corner-bottom">');
			
			if (sh.length) {
				html.push('<div class="ui-widget-content elfinder-help-shortcuts">');
				jQuery.each(sh, function(i, s) {
					html.push(stpl.replace(/\{pattern\}/, s[0]).replace(/\{descrip\}/, s[1]));
				});
			
				html.push('</div>');
			} else {
				html.push('<div class="elfinder-help-disabled">'+fm.i18n('shortcutsof')+'</div>');
			}
			
			
			html.push('</div>');
			
		},
		help = function() {
			// help tab
			html.push('<div id="'+fm.namespace+'-help-help" class="ui-tabs-panel ui-widget-content ui-corner-bottom">');
			html.push('<a href="https://github.com/Studio-42/elFinder/wiki" target="_blank" class="elfinder-dont-panic"><span>DON\'T PANIC</span></a>');
			html.push('</div>');
			// end help
		},
		useInteg = false,
		integrations = function() {
			useInteg = true;
			html.push('<div id="'+fm.namespace+'-help-integrations" class="ui-tabs-panel ui-widget-content ui-corner-bottom"></div>');
		},
		useDebug = false,
		debug = function() {
			useDebug = true;
			// debug tab
			html.push('<div id="'+fm.namespace+'-help-debug" class="ui-tabs-panel ui-widget-content ui-corner-bottom">');
			html.push('<div class="ui-widget-content elfinder-help-debug"><ul></ul></div>');
			html.push('</div>');
			// end debug
		},
		debugRender = function() {
			var render = function(elm, obj) {
				jQuery.each(obj, function(k, v) {
					elm.append(jQuery('<dt></dt>').text(k));
					if (typeof v === 'undefined') {
						elm.append(jQuery('<dd></dd>').append(jQuery('<span></span>').text('undfined')));
					} else if (typeof v === 'object' && !v) {
						elm.append(jQuery('<dd></dd>').append(jQuery('<span></span>').text('null')));
					} else if (typeof v === 'object' && (jQuery.isPlainObject(v) || v.length)) {
						elm.append( jQuery('<dd></dd>').append(render(jQuery('<dl></dl>'), v)));
					} else {
						elm.append(jQuery('<dd></dd>').append(jQuery('<span></span>').text((v && typeof v === 'object')? '[]' : (v? v : '""'))));
					}
				});
				return elm;
			},
			cnt = debugUL.children('li').length,
			targetL, target, tabId,
			info, lastUL, lastDIV;
			
			if (self.debug.options || self.debug.debug) {
				if (cnt >= 5) {
					lastUL = debugUL.children('li:last');
					lastDIV = debugDIV.children('div:last');
					if (lastDIV.is(':hidden')) {
						lastUL.remove();
						lastDIV.remove();
					} else {
						lastUL.prev().remove();
						lastDIV.prev().remove();
					}
				}
				
				tabId = fm.namespace + '-help-debug-' + (+new Date());
				targetL = jQuery('<li></li>').html('<a href="'+selfUrl+'#'+tabId+'">'+self.debug.debug.cmd+'</a>').prependTo(debugUL);
				target = jQuery('<div id="'+tabId+'"></div>').data('debug', self.debug);
				
				targetL.on('click.debugrender', function() {
					var debug = target.data('debug');
					target.removeData('debug');
					if (debug) {
						target.hide();
						if (debug.debug) {
							info = jQuery('<fieldset>').append(jQuery('<legend></legend>').text('debug'), render(jQuery('<dl></dl>'), debug.debug));
							target.append(info);
						}
						if (debug.options) {
							info = jQuery('<fieldset>').append(jQuery('<legend></legend>').text('options'), render(jQuery('<dl></dl>'), debug.options));
							target.append(info);
						}
						target.show();
					}
					targetL.off('click.debugrender');
				});
				
				debugUL.after(target);
				
				opened && debugDIV.tabs('refresh');
			}
		},
		content = '',
		opened, tabInteg, integDIV, tabDebug, debugDIV, debugUL;
	
	this.alwaysEnabled  = true;
	this.updateOnSelect = false;
	this.state = -1;
	
	this.shortcuts = [{
		pattern     : 'f1',
		description : this.title
	}];
	
	fm.bind('load', function() {
		var parts = self.options.view || ['about', 'shortcuts', 'help', 'integrations', 'debug'],
			i, helpSource, tabBase, tabNav, tabs, delta;
		
		// remove 'preference' tab, it moved to command 'preference'
		if ((i = jQuery.inArray('preference', parts)) !== -1) {
			parts.splice(i, 1);
		}
		
		// debug tab require jQueryUI Tabs Widget
		if (! jQuery.fn.tabs) {
			if ((i = jQuery.inArray(parts, 'debug')) !== -1) {
				parts.splice(i, 1);
			}
		}
		
		jQuery.each(parts, function(i, title) {
			html.push(tab[r](/\{id\}/g, title)[r](/\{title\}/, fm.i18n(title)));
		});
		
		html.push('</ul>');

		jQuery.inArray('about', parts) !== -1 && about();
		jQuery.inArray('shortcuts', parts) !== -1 && shortcuts();
		if (jQuery.inArray('help', parts) !== -1) {
			helpSource = fm.i18nBaseUrl + 'help/%s.html.js';
			help();
		}
		jQuery.inArray('integrations', parts) !== -1 && integrations();
		jQuery.inArray('debug', parts) !== -1 && debug();
		
		html.push('</div>');
		content = jQuery(html.join(''));
		
		content.find('.ui-tabs-nav li')
			.on('mouseenter mouseleave', function(e) {
				jQuery(this).toggleClass('ui-state-hover', e.type === 'mouseenter');
			})
			.on('focus blur', 'a', function(e) {
				jQuery(e.delegateTarget).toggleClass('ui-state-focus', e.type === 'focusin');
			})
			.children()
			.on('click', function(e) {
				var link = jQuery(this);
				
				e.preventDefault();
				e.stopPropagation();
				
				link.parent().addClass(clTabActive).siblings().removeClass(clTabActive);
				content.children('.ui-tabs-panel').hide().filter(link.attr('href')).show();
			})
			.filter(':first').trigger('click');
		
		if (useInteg) {
			tabInteg = content.find('.elfinder-help-tab-integrations').hide();
			integDIV = content.find('#'+fm.namespace+'-help-integrations').hide().append(jQuery('<div class="elfinder-help-integrations-desc"></div>').html(fm.i18n('integrationWith')));
			fm.bind('helpIntegration', function(e) {
				var ul = integDIV.children('ul:first'),
					data, elm, cmdUL, cmdCls;
				if (e.data) {
					if (jQuery.isPlainObject(e.data)) {
						data = Object.assign({
							link: '',
							title: '',
							banner: ''
						}, e.data);
						if (data.title || data.link) {
							if (!data.title) {
								data.title = data.link;
							}
							if (data.link) {
								elm = jQuery('<a></a>').attr('href', data.link).attr('target', '_blank').text(data.title);
							} else {
								elm = jQuery('<span></span>').text(data.title);
							}
							if (data.banner) {
								elm = jQuery('<span></span>').append(jQuery('<img/>').attr(data.banner), elm);
							}
						}
					} else {
						elm = jQuery(e.data);
						elm.filter('a').each(function() {
							var tgt = jQuery(this);
							if (!tgt.attr('target')) {
								tgt.attr('target', '_blank');;
							}
						});
					}
					if (elm) {
						tabInteg.show();
						if (!ul.length) {
							ul = jQuery('<ul class="elfinder-help-integrations"></ul>').appendTo(integDIV);
						}
						if (data && data.cmd) {
							cmdCls = 'elfinder-help-integration-' + data.cmd;
							cmdUL = ul.find('ul.' + cmdCls);
							if (!cmdUL.length) {
								cmdUL = jQuery('<ul class="'+cmdCls+'"></ul>');
								ul.append(jQuery('<li></li>').append(jQuery('<span></span>').html(fm.i18n('cmd'+data.cmd))).append(cmdUL));
							}
							elm = cmdUL.append(jQuery('<li></li>').append(elm));
						} else {
							ul.append(jQuery('<li></li>').append(elm));
						}
					}
				}
			}).bind('themechange', function() {
				content.find('div.elfinder-help-term-theme').replaceWith(getTheme());
			});
		}

		// debug
		if (useDebug) {
			tabDebug = content.find('.elfinder-help-tab-debug').hide();
			debugDIV = content.find('#'+fm.namespace+'-help-debug').children('div:first');
			debugUL = debugDIV.children('ul:first').on('click', function(e) {
				e.preventDefault();
				e.stopPropagation();
			});

			self.debug = {};
	
			fm.bind('backenddebug', function(e) {
				// CAUTION: DO NOT TOUCH `e.data`
				if (useDebug && e.data && e.data.debug) {
					self.debug = { options : e.data.options, debug : Object.assign({ cmd : fm.currentReqCmd }, e.data.debug) };
					if (self.dialog) {
						debugRender();
					}
				}
			});
		}

		content.find('#'+fm.namespace+'-help-about').find('.apiver').text(fm.api);
		self.dialog = self.fmDialog(content, {
				title : self.title,
				width : 530,
				maxWidth: 'window',
				maxHeight: 'window',
				autoOpen : false,
				destroyOnClose : false,
				close : function() {
					if (useDebug) {
						tabDebug.hide();
						debugDIV.tabs('destroy');
					}
					opened = false;
				}
			})
			.on('click', function(e) {
				e.stopPropagation();
			})
			.css({
				overflow: 'hidden'
			});
		
		tabBase = self.dialog.children('.ui-tabs');
		tabNav = tabBase.children('.ui-tabs-nav:first');
		tabs = tabBase.children('.ui-tabs-panel');
		delta = self.dialog.outerHeight(true) - self.dialog.height();
		self.dialog.closest('.ui-dialog').on('resize', function() {
			tabs.height(self.dialog.height() - delta - tabNav.outerHeight(true) - 20);
		});
		
		if (helpSource) {
			self.dialog.one('initContents', function() {
				jQuery.ajax({
					url: self.options.helpSource? self.options.helpSource : helpSource.replace('%s', fm.lang),
					dataType: 'html'
				}).done(function(source) {
					jQuery('#'+fm.namespace+'-help-help').html(source);
				}).fail(function() {
					jQuery.ajax({
						url: helpSource.replace('%s', 'en'),
						dataType: 'html'
					}).done(function(source) {
						jQuery('#'+fm.namespace+'-help-help').html(source);
					});
				});
			});
		}
		
		self.state = 0;

		fm.trigger('helpBuilded', self.dialog);
	}).one('open', function() {
		var debug = false;
		fm.one('backenddebug', function() {
			debug =true;
		}).one('opendone', function() {
			requestAnimationFrame(function() {
				if (! debug && useDebug) {
					useDebug = false;
					tabDebug.hide();
					debugDIV.hide();
					debugUL.hide();
				}
			});
		});
	});
	
	this.getstate = function() {
		return 0;
	};
	
	this.exec = function(sel, opts) {
		var tab = opts? opts.tab : void(0),
			debugShow = function() {
				if (useDebug) {
					debugDIV.tabs();
					debugUL.find('a:first').trigger('click');
					tabDebug.show();
					opened = true;
				}
			};
		debugShow();
		this.dialog.trigger('initContents').elfinderdialog('open').find((tab? '.elfinder-help-tab-'+tab : '.ui-tabs-nav li') + ' a:first').trigger('click');
		return jQuery.Deferred().resolve();
	};

}).prototype = { forceLoad : true }; // this is required command
js/commands/netmount.js000064400000024671151215013360011177 0ustar00/**
 * @class  elFinder command "netmount"
 * Mount network volume with user credentials.
 *
 * @author Dmitry (dio) Levashov
 **/
elFinder.prototype.commands.netmount = function() {
	"use strict";
	var self = this,
		hasMenus = false,
		content;

	this.alwaysEnabled  = true;
	this.updateOnSelect = false;

	this.drivers = [];
	
	this.handlers = {
		load : function() {
			this.button.hide();
			var fm = self.fm;
			if (fm.cookieEnabled) {
				fm.one('open', function() {
					self.drivers = fm.netDrivers;
					if (self.drivers.length) {
						jQuery.each(self.drivers, function() {
							var d = self.options[this];
							if (d) {
								hasMenus = true;
								if (d.integrateInfo) {
									fm.trigger('helpIntegration', Object.assign({cmd: 'netmount'}, d.integrateInfo));
								}
							}
						});
					}
				});
			}
		}
	};

	this.getstate = function() {
		return hasMenus ? 0 : -1;
	};
	
	this.exec = function() {
		var fm = self.fm,
			dfrd = jQuery.Deferred(),
			o = self.options,
			create = function() {
				var winFocus = function() {
						inputs.protocol.trigger('change', 'winfocus');
					},
					inputs = {
						protocol : jQuery('<select></select>')
						.on('change', function(e, data){
							var protocol = this.value;
							content.find('.elfinder-netmount-tr').hide();
							content.find('.elfinder-netmount-tr-'+protocol).show();
							dialogNode && dialogNode.children('.ui-dialog-buttonpane:first').find('button').show();
							if (typeof o[protocol].select == 'function') {
								o[protocol].select(fm, e, data);
							}
						})
						.addClass('ui-corner-all')
					},
					opts = {
						title          : fm.i18n('netMountDialogTitle'),
						resizable      : true,
						modal          : true,
						destroyOnClose : false,
						open           : function() {
							jQuery(window).on('focus.'+fm.namespace, winFocus);
							inputs.protocol.trigger('change');
						},
						close          : function() { 
							dfrd.state() == 'pending' && dfrd.reject();
							jQuery(window).off('focus.'+fm.namespace, winFocus);
						},
						buttons        : {}
					},
					doMount = function() {
						var protocol = inputs.protocol.val(),
							data = {cmd : 'netmount', protocol: protocol},
							cur = o[protocol],
							mnt2res;
						jQuery.each(content.find('input.elfinder-netmount-inputs-'+protocol), function(name, input) {
							var val, elm;
							elm = jQuery(input);
							if (elm.is(':radio,:checkbox')) {
								if (elm.is(':checked')) {
									val = jQuery.trim(elm.val());
								}
							} else {
								val = jQuery.trim(elm.val());
							}
							if (val) {
								data[input.name] = val;
							}
						});

						if (!data.host) {
							return fm.trigger('error', {error : 'errNetMountHostReq', opts : {modal: true}});
						}

						if (data.mnt2res) {
							mnt2res = true;
						}

						fm.request({data : data, notify : {type : 'netmount', cnt : 1, hideCnt : true}})
							.done(function(data) {
								var pdir;
								if (data.added && data.added.length) {
									mnt2res && inputs.protocol.trigger('change', 'reset');
									if (data.added[0].phash) {
										if (pdir = fm.file(data.added[0].phash)) {
											if (! pdir.dirs) {
												pdir.dirs = 1;
												fm.change({ changed: [ pdir ] });
											}
										}
									}
									fm.one('netmountdone', function() {
										fm.exec('open', data.added[0].hash);
									});
								}
								dfrd.resolve();
							})
							.fail(function(error) {
								if (cur.fail && typeof cur.fail == 'function') {
									cur.fail(fm, fm.parseError(error));
								}
								dfrd.reject(error);
							});
	
						self.dialog.elfinderdialog('close');
					},
					form = jQuery('<form autocomplete="off"></form>').on('keydown', 'input', function(e) {
						var comp = true,
							next;
						if (e.keyCode === jQuery.ui.keyCode.ENTER) {
							jQuery.each(form.find('input:visible:not(.elfinder-input-optional)'), function() {
								if (jQuery(this).val() === '') {
									comp = false;
									next = jQuery(this);
									return false;
								}
							});
							if (comp) {
								doMount();
							} else {
								next.trigger('focus');
							}
						}
					}),
					hidden  = jQuery('<div></div>'),
					dialog;

				content = jQuery('<table class="elfinder-info-tb elfinder-netmount-tb"></table>')
					.append(jQuery('<tr></tr>').append(jQuery('<td>'+fm.i18n('protocol')+'</td>')).append(jQuery('<td></td>').append(inputs.protocol)));

				jQuery.each(self.drivers, function(i, protocol) {
					if (o[protocol]) {
						inputs.protocol.append('<option value="'+protocol+'">'+fm.i18n(o[protocol].name || protocol)+'</option>');
						jQuery.each(o[protocol].inputs, function(name, input) {
							input.attr('name', name);
							if (input.attr('type') != 'hidden') {
								input.addClass('ui-corner-all elfinder-netmount-inputs-'+protocol);
								content.append(jQuery('<tr></tr>').addClass('elfinder-netmount-tr elfinder-netmount-tr-'+protocol).append(jQuery('<td>'+fm.i18n(name)+'</td>')).append(jQuery('<td></td>').append(input)));
							} else {
								input.addClass('elfinder-netmount-inputs-'+protocol);
								hidden.append(input);
							}
						});
						o[protocol].protocol = inputs.protocol;
					}
				});
				
				content.append(hidden);
				
				content.find('.elfinder-netmount-tr').hide();
				content.find('.elfinder-netmount-tr-' + self.drivers[0]).show();

				opts.buttons[fm.i18n('btnMount')] = doMount;

				opts.buttons[fm.i18n('btnCancel')] = function() {
					self.dialog.elfinderdialog('close');
				};
				
				content.find('select,input').addClass('elfinder-tabstop');
				
				dialog = self.fmDialog(form.append(content), opts).ready(function() {
					inputs.protocol.trigger('change');
					dialog.elfinderdialog('posInit');
				});
				dialogNode = dialog.closest('.ui-dialog');
				return dialog;
			},
			dialogNode;
		
		if (!self.dialog) {
			self.dialog = create();
		} else {
			self.dialog.elfinderdialog('open');
		}

		return dfrd.promise();
	};

	self.fm.bind('netmount', function(e) {
		var d = e.data || null,
			o = self.options,
			done = function() {
				if (o[d.protocol] && typeof o[d.protocol].done == 'function') {
					o[d.protocol].done(self.fm, d);
					content.find('select,input').addClass('elfinder-tabstop');
					self.dialog.elfinderdialog('tabstopsInit');
				}
			};
		if (d && d.protocol) {
			if (d.mode && d.mode === 'redirect') {
				// To support of third-party cookie blocking (ITP) on CORS
				// On iOS and iPadOS 13.4 and Safari 13.1 on macOS, the session cannot be continued when redirecting OAuth in CORS mode
				self.fm.request({
					data : {cmd : 'netmount', protocol : d.protocol, host: d.host, user : 'init', pass : 'return', options: d.options}, 
					preventDefault : true
				}).done(function(data) {
					d = JSON.parse(data.body);
					done();
				});
			} else {
				done();
			}
		}
	});

};

elFinder.prototype.commands.netunmount = function() {
	var self = this;

	this.alwaysEnabled  = true;
	this.updateOnSelect = false;

	this.drivers = [];
	
	this.handlers = {
		load : function() {
			this.drivers = this.fm.netDrivers;
		}
	};

	this.getstate = function(sel) {
		var fm = this.fm,
			file;
		return !!sel && this.drivers.length && !this._disabled && (file = fm.file(sel[0])) && file.netkey ? 0 : -1;
	};
	
	this.exec = function(hashes) {
		var self   = this,
			fm     = this.fm,
			dfrd   = jQuery.Deferred()
				.fail(function(error) {
					error && fm.error(error);
				}),
			drive  = fm.file(hashes[0]),
			childrenRoots = function(hash) {
				var roots = [],
					work;
				if (fm.leafRoots) {
					work = [];
					jQuery.each(fm.leafRoots, function(phash, hashes) {
						var parents = fm.parents(phash),
							idx, deep;
						if ((idx = jQuery.inArray(hash, parents)) !== -1) {
							idx = parents.length - idx;
							jQuery.each(hashes, function(i, h) {
								work.push({i: idx, hash: h});
							});
						}
					});
					if (work.length) {
						work.sort(function(a, b) { return a.i < b.i; });
						jQuery.each(work, function(i, o) {
							roots.push(o.hash);
						});
					}
				}
				return roots;
			};

		if (this._disabled) {
			return dfrd.reject();
		}

		if (dfrd.state() == 'pending') {
			fm.confirm({
				title  : self.title,
				text   : fm.i18n('confirmUnmount', drive.name),
				accept : {
					label    : 'btnUnmount',
					callback : function() {  
						var target =  drive.hash,
							roots = childrenRoots(target),
							requests = [],
							removed = [],
							doUmount = function() {
								jQuery.when(requests).done(function() {
									fm.request({
										data   : {cmd  : 'netmount', protocol : 'netunmount', host: drive.netkey, user : target, pass : 'dum'}, 
										notify : {type : 'netunmount', cnt : 1, hideCnt : true},
										preventFail : true
									})
									.fail(function(error) {
										dfrd.reject(error);
									})
									.done(function(data) {
										drive.volumeid && delete fm.volumeExpires[drive.volumeid];
										dfrd.resolve();
									});
								}).fail(function(error) {
									if (removed.length) {
										fm.remove({ removed: removed });
									}
									dfrd.reject(error);
								});
							};
						
						if (roots.length) {
							fm.confirm({
								title : self.title,
								text  : (function() {
									var msgs = ['unmountChildren'];
									jQuery.each(roots, function(i, hash) {
										msgs.push([fm.file(hash).name]);
									});
									return msgs;
								})(),
								accept : {
									label : 'btnUnmount',
									callback : function() {
										jQuery.each(roots, function(i, hash) {
											var d = fm.file(hash);
											if (d.netkey) {
												requests.push(fm.request({
													data   : {cmd  : 'netmount', protocol : 'netunmount', host: d.netkey, user : d.hash, pass : 'dum'}, 
													notify : {type : 'netunmount', cnt : 1, hideCnt : true},
													preventDefault : true
												}).done(function(data) {
													if (data.removed) {
														d.volumeid && delete fm.volumeExpires[d.volumeid];
														removed = removed.concat(data.removed);
													}
												}));
											}
										});
										doUmount();
									}
								},
								cancel : {
									label : 'btnCancel',
									callback : function() {
										dfrd.reject();
									}
								}
							});
						} else {
							requests = null;
							doUmount();
						}
					}
				},
				cancel : {
					label    : 'btnCancel',
					callback : function() { dfrd.reject(); }
				}
			});
		}
			
		return dfrd;
	};

};
js/commands/upload.js000064400000030630151215013360010602 0ustar00/**
 * @class elFinder command "upload"
 * Upload files using iframe or XMLHttpRequest & FormData.
 * Dialog allow to send files using drag and drop
 *
 * @type  elFinder.command
 * @author  Dmitry (dio) Levashov
 */
 elFinder.prototype.commands.upload = function() {
	"use strict";
	var hover = this.fm.res('class', 'hover');
	
	this.disableOnSearch = true;
	this.updateOnSelect  = false;
	
	// Shortcut opens dialog
	this.shortcuts = [{
		pattern     : 'ctrl+u'
	}];
	
	/**
	 * Return command state
	 *
	 * @return Number
	 **/
	this.getstate = function(select) {
		var fm = this.fm, f,
		sel = (select || [fm.cwd().hash]);
		if (!this._disabled && sel.length == 1) {
			f = fm.file(sel[0]);
		}
		return (f && f.mime == 'directory' && f.write)? 0 : -1;
	};
	
	
	this.exec = function(data) {
		var fm = this.fm,
			cwdHash = fm.cwd().hash,
			getTargets = function() {
				var tgts = data && (data instanceof Array)? data : null,
					sel;
				if (! data || data instanceof Array) {
					if (! tgts && (sel = fm.selected()).length === 1 && fm.file(sel[0]).mime === 'directory') {
						tgts = sel;
					} else if (!tgts || tgts.length !== 1 || fm.file(tgts[0]).mime !== 'directory') {
						tgts = [ cwdHash ];
					}
				}
				return tgts;
			},
			targets = getTargets(),
			check = targets? targets[0] : (data && data.target? data.target : null),
			targetDir = check? fm.file(check) : fm.cwd(),
			fmUpload = function(data) {
				fm.upload(data)
					.fail(function(error) {
						dfrd.reject(error);
					})
					.done(function(data) {
						var cwd = fm.getUI('cwd'),
							node;
						dfrd.resolve(data);
						if (data && data.added && data.added[0] && ! fm.ui.notify.children('.elfinder-notify-upload').length) {
							var newItem = fm.findCwdNodes(data.added);
							if (newItem.length) {
								newItem.trigger('scrolltoview');
							} else {
								if (targetDir.hash !== cwdHash) {
									node = jQuery('<div></div>').append(
										jQuery('<button type="button" class="ui-button ui-widget ui-state-default ui-corner-all elfinder-tabstop"><span class="ui-button-text">'+fm.i18n('cmdopendir')+'</span></button>')
										.on('mouseenter mouseleave', function(e) { 
											jQuery(this).toggleClass('ui-state-hover', e.type == 'mouseenter');
										}).on('click', function() {
											fm.exec('open', check).done(function() {
												fm.one('opendone', function() {
													fm.trigger('selectfiles', {files : jQuery.map(data.added, function(f) {return f.hash;})});
												});
											});
										})
									);
								} else {
									fm.trigger('selectfiles', {files : jQuery.map(data.added, function(f) {return f.hash;})});
								}
								fm.toast({msg: fm.i18n(['complete', fm.i18n('cmdupload')]), extNode: node});
							}
						}
					})
					.progress(function() {
						dfrd.notifyWith(this, Array.from(arguments));
					});
			},
			upload = function(data) {
				dialog.elfinderdialog('close');
				if (targets) {
					data.target = targets[0];
				}
				fmUpload(data);
			},
			getSelector = function() {
				var hash = targetDir.hash,
					dirs = jQuery.map(fm.files(hash), function(f) {
						return (f.mime === 'directory' && f.write)? f : null; 
					});
				
				if (! dirs.length) {
					return jQuery();
				}
				
				return jQuery('<div class="elfinder-upload-dirselect elfinder-tabstop" title="' + fm.i18n('folders') + '"></div>')
				.on('click', function(e) {
					e.stopPropagation();
					e.preventDefault();
					dirs = fm.sortFiles(dirs);
					var $this  = jQuery(this),
						cwd    = fm.cwd(),
						base   = dialog.closest('div.ui-dialog'),
						getRaw = function(f, icon) {
							return {
								label    : fm.escape(f.i18 || f.name),
								icon     : icon,
								remain   : false,
								callback : function() {
									var title = base.children('.ui-dialog-titlebar:first').find('span.elfinder-upload-target');
									targets = [ f.hash ];
									title.html(' - ' + fm.escape(f.i18 || f.name));
									$this.trigger('focus');
								},
								options  : {
									className : (targets && targets.length && f.hash === targets[0])? 'ui-state-active' : '',
									iconClass : f.csscls || '',
									iconImg   : f.icon   || ''
								}
							};
						},
						raw = [ getRaw(targetDir, 'opendir'), '|' ];
					jQuery.each(dirs, function(i, f) {
						raw.push(getRaw(f, 'dir'));
					});
					$this.trigger('blur');
					fm.trigger('contextmenu', {
						raw: raw,
						x: e.pageX || jQuery(this).offset().left,
						y: e.pageY || jQuery(this).offset().top,
						prevNode: base,
						fitHeight: true
					});
				}).append('<span class="elfinder-button-icon elfinder-button-icon-dir" ></span>');
			},
			inputButton = function(type, caption) {
				var button,
					input = jQuery('<input type="file" ' + type + '/>')
					.on('click', function() {
						// for IE's bug
						if (fm.UA.IE) {
							setTimeout(function() {
								form.css('display', 'none').css('position', 'relative');
								requestAnimationFrame(function() {
									form.css('display', '').css('position', '');
								});
							}, 100);
						}
					})
					.on('change', function() {
						upload({input : input.get(0), type : 'files'});
					})
					.on('dragover', function(e) {
						e.originalEvent.dataTransfer.dropEffect = 'copy';
					}),
					form = jQuery('<form></form>').append(input).on('click', function(e) {
						e.stopPropagation();
					});

				return jQuery('<div class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only elfinder-tabstop elfinder-focus"><span class="ui-button-text">'+fm.i18n(caption)+'</span></div>')
					.append(form)
					.on('click', function(e) {
						e.stopPropagation();
						e.preventDefault();
						input.trigger('click');
					})
					.on('mouseenter mouseleave', function(e) {
						jQuery(this).toggleClass(hover, e.type === 'mouseenter');
					});
			},
			dfrd = jQuery.Deferred(),
			dialog, dropbox, pastebox, dropUpload, paste, dirs, spinner, uidialog;
		
		dropUpload = function(e) {
			e.stopPropagation();
			e.preventDefault();
			var file = false,
				type = '',
				elfFrom = null,
				mycwd = '',
				data = null,
				target = e._target || null,
				trf = e.dataTransfer || null,
				kind = '',
				errors;
			
			if (trf) {
				if (trf.types && trf.types.length && jQuery.inArray('Files', trf.types) !== -1) {
				    kind = 'file';
				}
				else if (trf.items && trf.items.length && trf.items[0].kind) {
				    kind = trf.items[0].kind;
				}

				try {
					elfFrom = trf.getData('elfinderfrom');
					if (elfFrom) {
						mycwd = window.location.href + fm.cwd().hash;
						if ((!target && elfFrom === mycwd) || target === mycwd) {
							dfrd.reject();
							return;
						}
					}
				} catch(e) {}
				
				if (kind === 'file' && (trf.items[0].getAsEntry || trf.items[0].webkitGetAsEntry)) {
					file = trf;
					type = 'data';
				} else if (kind !== 'string' && trf.files && trf.files.length && jQuery.inArray('Text', trf.types) === -1) {
					file = trf.files;
					type = 'files';
				} else {
					try {
						if ((data = trf.getData('text/html')) && data.match(/<(?:img|a)/i)) {
							file = [ data ];
							type = 'html';
						}
					} catch(e) {}
					if (! file) {
						if (data = trf.getData('text')) {
							file = [ data ];
							type = 'text';
						} else if (trf && trf.files) {
							// maybe folder uploading but this UA dose not support it
							kind = 'file';
						}
					}
				}
			}
			if (file) {
				fmUpload({files : file, type : type, target : target, dropEvt : e});
			} else {
				errors = ['errUploadNoFiles'];
				if (kind === 'file') {
					errors.push('errFolderUpload');
				}
				fm.error(errors);
				dfrd.reject();
			}
		};
		
		if (!targets && data) {
			if (data.input || data.files) {
				data.type = 'files';
				fmUpload(data);
			} else if (data.dropEvt) {
				dropUpload(data.dropEvt);
			}
			return dfrd;
		}
		
		paste = function(ev) {
			var e = ev.originalEvent || ev;
			var files = [], items = [];
			var file;
			if (e.clipboardData) {
				if (e.clipboardData.items && e.clipboardData.items.length){
					items = e.clipboardData.items;
					for (var i=0; i < items.length; i++) {
						if (e.clipboardData.items[i].kind == 'file') {
							file = e.clipboardData.items[i].getAsFile();
							files.push(file);
						}
					}
				} else if (e.clipboardData.files && e.clipboardData.files.length) {
					files = e.clipboardData.files;
				}
				if (files.length) {
					upload({files : files, type : 'files', clipdata : true});
					return;
				}
			}
			var my = e.target || e.srcElement;
			requestAnimationFrame(function() {
				var type = 'text',
					src;
				if (my.innerHTML) {
					jQuery(my).find('img').each(function(i, v){
						if (v.src.match(/^webkit-fake-url:\/\//)) {
							// For Safari's bug.
							// ref. https://bugs.webkit.org/show_bug.cgi?id=49141
							//      https://dev.ckeditor.com/ticket/13029
							jQuery(v).remove();
						}
					});
					
					if (jQuery(my).find('a,img').length) {
						type = 'html';
					}
					src = my.innerHTML;
					my.innerHTML = '';
					upload({files : [ src ], type : type});
				}
			});
		};
		
		dialog = jQuery('<div class="elfinder-upload-dialog-wrapper"></div>')
			.append(inputButton('multiple', 'selectForUpload'));
		
		if (! fm.UA.Mobile && (function(input) {
			return (typeof input.webkitdirectory !== 'undefined' || typeof input.directory !== 'undefined');})(document.createElement('input'))) {
			dialog.append(inputButton('multiple webkitdirectory directory', 'selectFolder'));
		}
		
		if (targetDir.dirs) {
			
			if (targetDir.hash === cwdHash || fm.navHash2Elm(targetDir.hash).hasClass('elfinder-subtree-loaded')) {
				getSelector().appendTo(dialog);
			} else {
				spinner = jQuery('<div class="elfinder-upload-dirselect" title="' + fm.i18n('nowLoading') + '"></div>')
					.append('<span class="elfinder-button-icon elfinder-button-icon-spinner" ></span>')
					.appendTo(dialog);
				fm.request({cmd : 'tree', target : targetDir.hash})
					.done(function() { 
						fm.one('treedone', function() {
							spinner.replaceWith(getSelector());
							uidialog.elfinderdialog('tabstopsInit');
						});
					})
					.fail(function() {
						spinner.remove();
					});
			}
		}
		
		if (fm.dragUpload) {
			dropbox = jQuery('<div class="ui-corner-all elfinder-upload-dropbox elfinder-tabstop" contenteditable="true" data-ph="'+fm.i18n('dropPasteFiles')+'"></div>')
				.on('paste', function(e){
					paste(e);
				})
				.on('mousedown click', function(){
					jQuery(this).trigger('focus');
				})
				.on('focus', function(){
					this.innerHTML = '';
				})
				.on('mouseover', function(){
					jQuery(this).addClass(hover);
				})
				.on('mouseout', function(){
					jQuery(this).removeClass(hover);
				})
				.on('dragenter', function(e) {
					e.stopPropagation();
				  	e.preventDefault();
				  	jQuery(this).addClass(hover);
				})
				.on('dragleave', function(e) {
					e.stopPropagation();
				  	e.preventDefault();
				  	jQuery(this).removeClass(hover);
				})
				.on('dragover', function(e) {
					e.stopPropagation();
				  	e.preventDefault();
					e.originalEvent.dataTransfer.dropEffect = 'copy';
					jQuery(this).addClass(hover);
				})
				.on('drop', function(e) {
					dialog.elfinderdialog('close');
					targets && (e.originalEvent._target = targets[0]);
					dropUpload(e.originalEvent);
				})
				.prependTo(dialog)
				.after('<div class="elfinder-upload-dialog-or">'+fm.i18n('or')+'</div>')[0];
			
		} else {
			pastebox = jQuery('<div class="ui-corner-all elfinder-upload-dropbox" contenteditable="true">'+fm.i18n('dropFilesBrowser')+'</div>')
				.on('paste drop', function(e){
					paste(e);
				})
				.on('mousedown click', function(){
					jQuery(this).trigger('focus');
				})
				.on('focus', function(){
					this.innerHTML = '';
				})
				.on('dragenter mouseover', function(){
					jQuery(this).addClass(hover);
				})
				.on('dragleave mouseout', function(){
					jQuery(this).removeClass(hover);
				})
				.prependTo(dialog)
				.after('<div class="elfinder-upload-dialog-or">'+fm.i18n('or')+'</div>')[0];
			
		}
		
		uidialog = this.fmDialog(dialog, {
			title          : this.title + '<span class="elfinder-upload-target">' + (targetDir? ' - ' + fm.escape(targetDir.i18 || targetDir.name) : '') + '</span>',
			modal          : true,
			resizable      : false,
			destroyOnClose : true,
			propagationEvents : ['mousemove', 'mouseup', 'click'],
			close          : function() {
				var cm = fm.getUI('contextmenu');
				if (cm.is(':visible')) {
					cm.click();
				}
			}
		});
		
		return dfrd;
	};

};
js/commands/colwidth.js000064400000000740151215013360011132 0ustar00/**
 * @class  elFinder command "colwidth"
 * CWD list table columns width to auto
 *
 * @author Naoki Sawada
 **/
elFinder.prototype.commands.colwidth = function() {
	"use strict";
	this.alwaysEnabled = true;
	this.updateOnSelect = false;
	
	this.getstate = function() {
		return this.fm.getUI('cwd').find('table').css('table-layout') === 'fixed' ? 0 : -1;
	};
	
	this.exec = function() {
		this.fm.getUI('cwd').trigger('colwidth');
		return jQuery.Deferred().resolve();
	};
	
};js/commands/restore.js000064400000016711151215013360011005 0ustar00/**
 * @class  elFinder command "restore"
 * Restore items from the trash
 *
 * @author Naoki Sawada
 **/
(elFinder.prototype.commands.restore = function() {
	"use strict";
	var self = this,
		fm = this.fm,
		fakeCnt = 0,
		getFilesRecursively = function(files) {
			var dfd = jQuery.Deferred(),
				dirs = [],
				results = [],
				reqs = [],
				phashes = [],
				getFile;
			
			dfd._xhrReject = function() {
				jQuery.each(reqs, function() {
					this && this.reject && this.reject();
				});
				getFile && getFile._xhrReject();
			};
			
			jQuery.each(files, function(i, f) {
				f.mime === 'directory'? dirs.push(f) : results.push(f);
			});
			
			if (dirs.length) {
				jQuery.each(dirs, function(i, d) {
					reqs.push(fm.request({
						data : {cmd  : 'open', target : d.hash},
						preventDefault : true,
						asNotOpen : true
					}));
					phashes[i] = d.hash;
				});
				jQuery.when.apply($, reqs).fail(function() {
					dfd.reject();
				}).done(function() {
					var items = [];
					jQuery.each(arguments, function(i, r) {
						var files;
						if (r.files) {
							if (r.files.length) {
								items = items.concat(r.files);
							} else {
								items.push({
									hash: 'fakefile_' + (fakeCnt++),
									phash: phashes[i],
									mime: 'fakefile',
									name: 'fakefile',
									ts: 0
								});
							}
						}
					});
					fm.cache(items);
					getFile = getFilesRecursively(items).done(function(res) {
						results = results.concat(res);
						dfd.resolve(results);
					});
				});
			} else {
				dfd.resolve(results);
			}
			
			return dfd;
		},
		restore = function(dfrd, files, targets, ops) {
			var rHashes = {},
				others = [],
				found = false,
				dirs = [],
				opts = ops || {},
				id = +new Date(),
				tm, getFile;
			
			fm.lockfiles({files : targets});
			
			dirs = jQuery.map(files, function(f) {
				return f.mime === 'directory'? f.hash : null;
			});
			
			dfrd.done(function() {
				dirs && fm.exec('rm', dirs, {forceRm : true, quiet : true});
			}).always(function() {
				fm.unlockfiles({files : targets});
			});
			
			tm = setTimeout(function() {
				fm.notify({type : 'search', id : id, cnt : 1, hideCnt : true, cancel : function() {
					getFile && getFile._xhrReject();
					dfrd.reject();
				}});
			}, fm.notifyDelay);

			fakeCnt = 0;
			getFile = getFilesRecursively(files).always(function() {
				tm && clearTimeout(tm);
				fm.notify({type : 'search', id: id, cnt : -1, hideCnt : true});
			}).fail(function() {
				dfrd.reject('errRestore', 'errFileNotFound');
			}).done(function(res) {
				var errFolderNotfound = ['errRestore', 'errFolderNotFound'],
					dirTop = '';
				
				if (res.length) {
					jQuery.each(res, function(i, f) {
						var phash = f.phash,
							pfile,
							srcRoot, tPath;
						while(phash) {
							if (srcRoot = fm.trashes[phash]) {
								if (! rHashes[srcRoot]) {
									if (found) {
										// Keep items of other trash
										others.push(f.hash);
										return null; // continue jQuery.each
									}
									rHashes[srcRoot] = {};
									found = true;
								}
		
								tPath = fm.path(f.hash).substr(fm.path(phash).length).replace(/\\/g, '/');
								tPath = tPath.replace(/\/[^\/]+?$/, '');
								if (tPath === '') {
									tPath = '/';
								}
								if (!rHashes[srcRoot][tPath]) {
									rHashes[srcRoot][tPath] = [];
								}
								if (f.mime === 'fakefile') {
									fm.updateCache({removed:[f.hash]});
								} else {
									rHashes[srcRoot][tPath].push(f.hash);
								}
								if (!dirTop || dirTop.length > tPath.length) {
									dirTop = tPath;
								}
								break;
							}
							
							// Go up one level for next check
							pfile = fm.file(phash);
							
							if (!pfile) {
								phash = false;
								// Detection method for search results
								jQuery.each(fm.trashes, function(ph) {
									var file = fm.file(ph),
										filePath = fm.path(ph);
									if ((!file.volumeid || f.hash.indexOf(file.volumeid) === 0) && fm.path(f.hash).indexOf(filePath) === 0) {
										phash = ph;
										return false;
									}
								});
							} else {
								phash = pfile.phash;
							}
						}
					});
					if (found) {
						jQuery.each(rHashes, function(src, dsts) {
							var dirs = Object.keys(dsts),
								cnt = dirs.length;
							fm.request({
								data   : {cmd  : 'mkdir', target : src, dirs : dirs}, 
								notify : {type : 'chkdir', cnt : cnt},
								preventFail : true
							}).fail(function(error) {
								dfrd.reject(error);
								fm.unlockfiles({files : targets});
							}).done(function(data) {
								var cmdPaste, hashes;
								
								if (hashes = data.hashes) {
									cmdPaste = fm.getCommand('paste');
									if (cmdPaste) {
										// wait until file cache made
										fm.one('mkdirdone', function() {
											var hasErr = false;
											jQuery.each(dsts, function(dir, files) {
												if (hashes[dir]) {
													if (files.length) {
														if (fm.file(hashes[dir])) {
															fm.clipboard(files, true);
															fm.exec('paste', [ hashes[dir] ], {_cmd : 'restore', noToast : (opts.noToast || dir !== dirTop)})
															.done(function(data) {
																if (data && (data.error || data.warning)) {
																	hasErr = true;
																}
															})
															.fail(function() {
																hasErr = true;
															})
															.always(function() {
																if (--cnt < 1) {
																	dfrd[hasErr? 'reject' : 'resolve']();
																	if (others.length) {
																		// Restore items of other trash
																		fm.exec('restore', others);
																	}
																}
															});
														} else {
															dfrd.reject(errFolderNotfound);
														}
													} else {
														if (--cnt < 1) {
															dfrd.resolve();
															if (others.length) {
																// Restore items of other trash
																fm.exec('restore', others);
															}
														}
													}
												}
											});
										});
									} else {
										dfrd.reject(['errRestore', 'errCmdNoSupport', '(paste)']);
									}
								} else {
									dfrd.reject(errFolderNotfound);
								}
							});
						});
					} else {
						dfrd.reject(errFolderNotfound);
					}
				} else {
					dfrd.reject('errFileNotFound');
					dirs && fm.exec('rm', dirs, {forceRm : true, quiet : true});
				}
			});
		};
	
	// for to be able to overwrite
	this.restore = restore;

	this.linkedCmds = ['copy', 'paste', 'mkdir', 'rm'];
	this.updateOnSelect = false;
	
	this.init = function() {
		// re-assign for extended command
		self = this;
		fm = this.fm;
	};

	this.getstate = function(sel, e) {
		sel = sel || fm.selected();
		return sel.length && jQuery.grep(sel, function(h) {var f = fm.file(h); return f && ! f.locked && ! fm.isRoot(f)? true : false; }).length == sel.length
			? 0 : -1;
	};
	
	this.exec = function(hashes, opts) {
		var dfrd   = jQuery.Deferred()
				.fail(function(error) {
					error && fm.error(error);
				}),
			files  = self.files(hashes);

		if (! files.length) {
			return dfrd.reject();
		}
		
		jQuery.each(files, function(i, file) {
			if (fm.isRoot(file)) {
				return !dfrd.reject(['errRestore', file.name]);
			}
			if (file.locked) {
				return !dfrd.reject(['errLocked', file.name]);
			}
		});

		if (dfrd.state() === 'pending') {
			this.restore(dfrd, files, hashes, opts);
		}
			
		return dfrd;
	};

}).prototype = { forceLoad : true }; // this is required command
js/commands/download.js000064400000041155151215013360011131 0ustar00/**
 * @class elFinder command "download". 
 * Download selected files.
 * Only for new api
 *
 * @author Dmitry (dio) Levashov, dio@std42.ru
 **/
 elFinder.prototype.commands.zipdl = function() {};
 elFinder.prototype.commands.download = function() {
   "use strict";
   var self   = this,
     fm     = this.fm,
     czipdl = null,
     zipOn  = false,
     mixed  = false,
     dlntf  = false,
     cpath  = window.location.pathname || '/',
     filter = function(hashes, inExec) {
       var volumeid, mixedCmd;
       
       if (czipdl !== null) {
         if (fm.searchStatus.state > 1) {
           mixed = fm.searchStatus.mixed;
         } else if (fm.leafRoots[fm.cwd().hash]) {
           volumeid = fm.cwd().volumeid;
           jQuery.each(hashes, function(i, h) {
             if (h.indexOf(volumeid) !== 0) {
               mixed = true;
               return false;
             }
           });
         }
         zipOn = (fm.isCommandEnabled('zipdl', hashes[0]));
       }
 
       if (mixed) {
         mixedCmd = czipdl? 'zipdl' : 'download';
         hashes = jQuery.grep(hashes, function(h) {
           var f = fm.file(h),
             res = (! f || (! czipdl && f.mime === 'directory') || ! fm.isCommandEnabled(mixedCmd, h))? false : true;
           if (f && inExec && ! res) {
             fm.cwdHash2Elm(f.hash).trigger('unselect');
           }
           return res;
         });
         if (! hashes.length) {
           return [];
         }
       } else {
         if (!fm.isCommandEnabled('download', hashes[0])) {
           return [];
         }
       }
       
       return jQuery.grep(self.files(hashes), function(f) { 
         var res = (! f.read || (! zipOn && f.mime == 'directory')) ? false : true;
         if (inExec && ! res) {
           fm.cwdHash2Elm(f.hash).trigger('unselect');
         }
         return res;
       });
     };
   
   this.linkedCmds = ['zipdl'];
   
   this.shortcuts = [{
     pattern     : 'shift+enter'
   }];
   
   this.getstate = function(select) {
     var sel    = this.hashes(select),
       cnt    = sel.length,
       maxReq = this.options.maxRequests || 10,
       mixed  = false,
       croot  = '';
     
     if (cnt < 1) {
       return -1;
     }
     cnt = filter(sel).length;
     
     return  (cnt && (zipOn || (cnt <= maxReq && ((!fm.UA.IE && !fm.UA.Mobile) || cnt == 1))) ? 0 : -1);
   };
   
   fm.bind('contextmenu', function(e){
     var fm = self.fm,
       helper = null,
       targets, file, link,
       getExtra = function(file) {
         var link = file.url || fm.url(file.hash);
         return {
           icon: 'link',
           node: jQuery('<a></a>')
             .attr({href: link, target: '_blank', title: fm.i18n('link')})
             .text(file.name)
             .on('mousedown click touchstart touchmove touchend contextmenu', function(e){
               e.stopPropagation();
             })
             .on('dragstart', function(e) {
               var dt = e.dataTransfer || e.originalEvent.dataTransfer || null;
               helper = null;
               if (dt) {
                 var icon  = function(f) {
                     var mime = f.mime, i, tmb = fm.tmb(f);
                     i = '<div class="elfinder-cwd-icon '+fm.mime2class(mime)+' ui-corner-all"></div>';
                     if (tmb) {
                       i = jQuery(i).addClass(tmb.className).css('background-image', "url('"+tmb.url+"')").get(0).outerHTML;
                     }
                     return i;
                   };
                 dt.effectAllowed = 'copyLink';
                 if (dt.setDragImage) {
                   helper = jQuery('<div class="elfinder-drag-helper html5-native">').append(icon(file)).appendTo(jQuery(document.body));
                   dt.setDragImage(helper.get(0), 50, 47);
                 }
                 if (!fm.UA.IE) {
                   dt.setData('elfinderfrom', window.location.href + file.phash);
                   dt.setData('elfinderfrom:' + dt.getData('elfinderfrom'), '');
                 }
               }
             })
             .on('dragend', function(e) {
               helper && helper.remove();
             })
         };
       };
     self.extra = null;
     if (e.data) {
       targets = e.data.targets || [];
       if (targets.length === 1 && (file = fm.file(targets[0])) && file.mime !== 'directory') {
         if (file.url != '1') {
           self.extra = getExtra(file);
         } else {
           // Get URL ondemand
           var node;
           self.extra = {
             icon: 'link',
             node: jQuery('<a></a>')
               .attr({href: '#', title: fm.i18n('getLink'), draggable: 'false'})
               .text(file.name)
               .on('click touchstart', function(e){
                 if (e.type === 'touchstart' && e.originalEvent.touches.length > 1) {
                   return;
                 }
                 var parent = node.parent();
                 e.stopPropagation();
                 e.preventDefault();
                 parent.removeClass('ui-state-disabled').addClass('elfinder-button-icon-spinner');
                 fm.request({
                   data : {cmd : 'url', target : file.hash},
                   preventDefault : true
                 })
                 .always(function(data) {
                   parent.removeClass('elfinder-button-icon-spinner');
                   if (data.url) {
                     var rfile = fm.file(file.hash);
                     rfile.url = data.url;
                     node.replaceWith(getExtra(file).node);
                   } else {
                     parent.addClass('ui-state-disabled');
                   }
                 });
 
               })
           };
           node = self.extra.node;
           node.ready(function(){
             requestAnimationFrame(function(){
               node.parent().addClass('ui-state-disabled').css('pointer-events', 'auto');
             });
           });
         }
       }
     }
   }).one('open', function() {
     if (fm.api >= 2.1012) {
       czipdl = fm.getCommand('zipdl');
     }
     dlntf = fm.cookieEnabled && fm.api > 2.1038 && !fm.isCORS;
   });
   
   this.exec = function(select) {
     var hashes  = this.hashes(select),
       fm      = this.fm,
       base    = fm.options.url,
       files   = filter(hashes, true),
       dfrd    = jQuery.Deferred(),
       iframes = '',
       cdata   = '',
       targets = {},
       i, url,
       linkdl  = false,
       getTask = function(hashes) {
         return function() {
           var dfd = jQuery.Deferred(),
             root = fm.file(fm.root(hashes[0])),
             single = (hashes.length === 1),
             volName = root? (root.i18 || root.name) : null,
             dir, dlName, phash;
           if (single) {
             if (dir = fm.file(hashes[0])) {
               dlName = (dir.i18 || dir.name);
             }
           } else {
             jQuery.each(hashes, function() {
               var d = fm.file(this);
               if (d && (!phash || phash === d.phash)) {
                 phash = d.phash;
               } else {
                 phash = null;
                 return false;
               }
             });
             if (phash && (dir = fm.file(phash))) {
               dlName = (dir.i18 || dir.name) + '-' + hashes.length;
             }
           }
           if (dlName) {
             volName = dlName;
           }
           volName && (volName = ' (' + volName + ')');
           fm.request({
             data : {cmd : 'zipdl', targets : hashes},
             notify : {type : 'zipdl', cnt : 1, hideCnt : true, msg : fm.i18n('ntfzipdl') + volName},
             cancel : true,
             eachCancel : true,
             preventDefault : true
           }).done(function(e) {
             var zipdl, dialog, btn = {}, dllink, form, iframe, m,
               uniq = 'dlw' + (+new Date()),
               zipdlFn = function(url) {
                 dllink = jQuery('<a></a>')
                   .attr('href', url)
                   .attr('download', fm.escape(dlName))
                   .on('click', function() {
                     dfd.resolve();
                     dialog && dialog.elfinderdialog('destroy');
                   });
                 if (linkdl) {
                   dllink.attr('target', '_blank')
                     .append('<span class="elfinder-button-icon elfinder-button-icon-download"></span>'+fm.escape(dlName));
                   btn[fm.i18n('btnCancel')] = function() {
                     dialog.elfinderdialog('destroy');
                   };
                   dialog = self.fmDialog(dllink, {
                     title: fm.i18n('link'),
                     buttons: btn,
                     width: '200px',
                     destroyOnClose: true,
                     close: function() {
                       (dfd.state() !== 'resolved') && dfd.resolve();
                     }
                   });
                 } else {
                   click(dllink.hide().appendTo('body').get(0));
                   dllink.remove();
                 }
               };
             if (e.error) {
               fm.error(e.error);
               dfd.resolve();
             } else if (e.zipdl) {
               zipdl = e.zipdl;
               if (dlName) {
                 m = fm.splitFileExtention(zipdl.name || '');
                 dlName += m[1]? ('.' + m[1]) : '.zip';
               } else {
                 dlName = zipdl.name;
               }
               if (html5dl || linkdl) {
                 url = fm.options.url + (fm.options.url.indexOf('?') === -1 ? '?' : '&')
                 + 'cmd=zipdl&download=1';
                 jQuery.each([hashes[0], zipdl.file, dlName, zipdl.mime], function(key, val) {
                   url += '&targets%5B%5D='+encodeURIComponent(val);
                 });
                 jQuery.each(fm.customData, function(key, val) {
                   url += '&'+encodeURIComponent(key)+'='+encodeURIComponent(val);
                 });
                 url += '&'+encodeURIComponent(dlName);
                 if (fm.hasParrotHeaders()) {
                   fm.getBinaryByUrl({url: url}, function(blob) {
                     if (blob instanceof Blob) {
                       url = (window.URL || window.webkitURL).createObjectURL(blob);
                       zipdlFn(url);
                     } else {
                       fm.error(['errUploadTransfer', fm.i18n('kindZIP')]);
                     }
                   });
                 } else {
                   zipdlFn(url);
                 }
               } else {
                 form = jQuery('<form action="'+fm.options.url+'" method="post" target="'+uniq+'" style="display:none"></form>')
                 .append('<input type="hidden" name="cmd" value="zipdl"/>')
                 .append('<input type="hidden" name="download" value="1"/>');
                 jQuery.each([hashes[0], zipdl.file, dlName, zipdl.mime], function(key, val) {
                   form.append('<input type="hidden" name="targets[]" value="'+fm.escape(val)+'"/>');
                 });
                 jQuery.each(fm.customData, function(key, val) {
                   form.append('<input type="hidden" name="'+key+'" value="'+fm.escape(val)+'"/>');
                 });
                 form.attr('target', uniq).appendTo('body');
                 iframe = jQuery('<iframe style="display:none" name="'+uniq+'">')
                   .appendTo('body')
                   .ready(function() {
                     form.submit().remove();
                     dfd.resolve();
                     setTimeout(function() {
                       iframe.remove();
                     }, 20000); // give 20 sec file to be saved
                   });
               }
             }
           }).fail(function(error) {
             error && fm.error(error);
             dfd.resolve();
           });
           return dfd.promise();
         };
       },
       // use MouseEvent to click element for Safari etc
       click = function(a) {
         var clickEv;
         if (typeof MouseEvent === 'function') {
           clickEv = new MouseEvent('click');
         } else {
           clickEv = document.createEvent('MouseEvents');
           clickEv.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
         }
         fm.pauseUnloadCheck(true);
         a.dispatchEvent(clickEv);
       },
       checkCookie = function(id) {
         var name = 'elfdl' + id,
           parts;
         parts = document.cookie.split(name + "=");
         if (parts.length === 2) {
           ntftm && clearTimeout(ntftm);
           document.cookie = name + '=; path=' + cpath + '; max-age=0';
           closeNotify();
         } else {
           setTimeout(function() { checkCookie(id); }, 200);
         }
       },
       closeNotify = function() {
         if (fm.ui.notify.children('.elfinder-notify-download').length) {
           fm.notify({
             type : 'download',
             cnt : -1
           });
         }
       },
       reqids = [],
       link, html5dl, fileCnt, clickEv, cid, ntftm, reqid, getUrlDfrd, urls;
       
     if (!files.length) {
       return dfrd.reject();
     }
     
     fileCnt = jQuery.grep(files, function(f) { return f.mime === 'directory'? false : true; }).length;
     link = jQuery('<a>').hide().appendTo('body');
     html5dl = (typeof link.get(0).download === 'string');
     
     if (zipOn && (fileCnt !== files.length || fileCnt >= (this.options.minFilesZipdl || 1))) {
       link.remove();
       linkdl = (!html5dl && fm.UA.Mobile);
       if (mixed) {
         targets = {};
         jQuery.each(files, function(i, f) {
           var p = f.hash.split('_', 2);
           if (! targets[p[0]]) {
             targets[p[0]] = [ f.hash ];
           } else {
             targets[p[0]].push(f.hash);
           }
         });
         if (!linkdl && fm.UA.Mobile && Object.keys(targets).length > 1) {
           linkdl = true;
         }
       } else {
         targets = [ jQuery.map(files, function(f) { return f.hash; }) ];
       }
       dfrd = fm.sequence(jQuery.map(targets, function(t) { return getTask(t); })).always(
         function() {
           fm.trigger('download', {files : files});
         }
       );
       return dfrd;
     } else {
       reqids = [];
       getUrlDfrd = jQuery.Deferred().done(function(urls) {
         for (i = 0; i < urls.length; i++) {
           url = urls[i];
           if (dlntf && url.substr(0, fm.options.url.length) === fm.options.url) {
             reqid = fm.getRequestId();
             reqids.push(reqid);
             url += '&cpath=' + cpath + '&reqid=' + reqid;
             ntftm = setTimeout(function() {
               fm.notify({
                 type : 'download',
                 cnt : 1,
                 cancel : (fm.UA.IE || fm.UA.Edge)? void(0) : function() {
                   if (reqids.length) {
                     jQuery.each(reqids, function() {
                       fm.request({
                         data: {
                           cmd: 'abort',
                           id: this
                         },
                         preventDefault: true
                       });
                     });
                   }
                   reqids = [];
                 }
               });
             }, fm.notifyDelay);
             checkCookie(reqid);
           }
           if (html5dl) {
             click(link.attr('href', url)
               .attr('download', fm.escape(files[i].name))
               .get(0)
             );
           } else {
             if (fm.UA.Mobile) {
               setTimeout(function(){
                 if (! window.open(url)) {
                   fm.error('errPopup');
                   ntftm && cleaerTimeout(ntftm);
                   closeNotify();
                 }
               }, 100);
             } else {
               iframes += '<iframe class="downloader" id="downloader-' + files[i].hash+'" style="display:none" src="'+url+'"></iframe>';
             }
           }
         }
         link.remove();
         jQuery(iframes)
           .appendTo('body')
           .ready(function() {
             setTimeout(function() {
               jQuery(iframes).each(function() {
                 jQuery('#' + jQuery(this).attr('id')).remove();
               });
             }, 20000 + (10000 * i)); // give 20 sec + 10 sec for each file to be saved
           });
         fm.trigger('download', {files : files});
         dfrd.resolve();
       });
       fileCnt = files.length;
       urls = [];
       for (i = 0; i < files.length; i++) {
         fm.openUrl(files[i].hash, true, function(v) {
           v && urls.push(v);
           if (--fileCnt < 1) {
             getUrlDfrd.resolve(urls);
           }
         });
       }
       return dfrd;
     }
   };
 
 }; js/commands/opennew.js000064400000002332151215013360010767 0ustar00/**
 * @class  elFinder command "opennew"
 * Open folder in new window
 *
 * @author Naoki Sawada
 **/  
elFinder.prototype.commands.opennew = function() {
	"use strict";
	var fm = this.fm;

	this.shortcuts = [{
		pattern  : (typeof(fm.options.getFileCallback) === 'function'? 'shift+' : '') + 'ctrl+enter'
	}];

	this.getstate = function(select) {
		var sel = this.files(select),
			cnt = sel.length;
		
		return cnt === 1 
			? (sel[0].mime === 'directory' && sel[0].read? 0 : -1) 
			: -1;
	};
	
	this.exec = function(hashes) {
		var dfrd  = jQuery.Deferred(),
			files = this.files(hashes),
			cnt   = files.length,
			opts  = this.options,
			file, loc, url, win;

		// open folder to new tab (window)
		if (cnt === 1 && (file = files[0]) && file.mime === 'directory') {
			loc = window.location;
			if (opts.url) {
				url = opts.url;
			} else {
				url = loc.pathname;
			}
			if (opts.useOriginQuery) {
				if (!url.match(/\?/)) {
					url += loc.search;
				} else if (loc.search) {
					url += '&' + loc.search.substr(1);
				}
			}
			url += '#elf_' + file.hash;
			win = window.open(url, '_blank');
			setTimeout(function() {
				win.focus();
			}, 1000);
			return dfrd.resolve();
		} else {
			return dfrd.reject();
		}
	};
};
js/commands/selectall.js000064400000001136151215013360011265 0ustar00/**
 * @class  elFinder command "selectall"
 * Select ALL of cwd items
 *
 * @author Naoki Sawada
 **/
elFinder.prototype.commands.selectall = function() {
	"use strict";
	var self = this,
		state = 0;
	
	this.fm.bind('select', function(e) {
		state = (e.data && e.data.selectall)? -1 : 0;
	});
	
	this.state = 0;
	this.updateOnSelect = false;
	
	this.getstate = function() {
		return state;
	};
	
	this.exec = function() {
		jQuery(document).trigger(jQuery.Event('keydown', { keyCode: 65, ctrlKey : true, shiftKey : false, altKey : false, metaKey : false }));
		return jQuery.Deferred().resolve();
	};
};
js/commands/opendir.js000064400000001566151215013360010764 0ustar00/**
 * @class  elFinder command "opendir"
 * Enter parent folder
 *
 * @author Naoki Sawada
 **/  
elFinder.prototype.commands.opendir = function() {
	"use strict";
	this.alwaysEnabled = true;
	
	this.getstate = function() {
		var sel = this.fm.selected(),
			cnt = sel.length,
			wz;
		if (cnt !== 1) {
			return -1;
		}
		wz = this.fm.getUI('workzone');
		return wz.hasClass('elfinder-search-result')? 0 : -1;
	};
	
	this.exec = function(hashes) {
		var fm    = this.fm,
			dfrd  = jQuery.Deferred(),
			files = this.files(hashes),
			cnt   = files.length,
			hash, pcheck = null;

		if (!cnt || !files[0].phash) {
			return dfrd.reject();
		}

		hash = files[0].phash;
		fm.trigger('searchend', { noupdate: true });
		fm.request({
			data   : {cmd  : 'open', target : hash},
			notify : {type : 'open', cnt : 1, hideCnt : true},
			syncOnFail : false
		});
		
		return dfrd;
	};

};
js/commands/search.js000064400000010016151215013360010557 0ustar00/**
 * @class  elFinder command "search"
 * Find files
 *
 * @author Dmitry (dio) Levashov
 **/
elFinder.prototype.commands.search = function() {
	"use strict";
	this.title          = 'Find files';
	this.options        = {ui : 'searchbutton'};
	this.alwaysEnabled  = true;
	this.updateOnSelect = false;
	
	/**
	 * Return command status.
	 * Search does not support old api.
	 *
	 * @return Number
	 **/
	this.getstate = function() {
		return 0;
	};
	
	/**
	 * Send search request to backend.
	 *
	 * @param  String  search string
	 * @return jQuery.Deferred
	 **/
	this.exec = function(q, target, mime, type) {
		var fm = this.fm,
			reqDef = [],
			sType = type || '',
			onlyMimes = fm.options.onlyMimes,
			phash, targetVolids = [],
			setType = function(data) {
				if (sType && sType !== 'SearchName' && sType !== 'SearchMime') {
					data.type = sType;
				}
				return data;
			},
			rootCnt;
		
		if (typeof q == 'string' && q) {
			if (typeof target == 'object') {
				mime = target.mime || '';
				target = target.target || '';
			}
			target = target? target : '';
			if (mime) {
				mime = jQuery.trim(mime).replace(',', ' ').split(' ');
				if (onlyMimes.length) {
					mime = jQuery.map(mime, function(m){ 
						m = jQuery.trim(m);
						return m && (jQuery.inArray(m, onlyMimes) !== -1
									|| jQuery.grep(onlyMimes, function(om) { return m.indexOf(om) === 0? true : false; }).length
									)? m : null;
					});
				}
			} else {
				mime = [].concat(onlyMimes);
			}

			fm.trigger('searchstart', setType({query : q, target : target, mimes : mime}));
			
			if (! onlyMimes.length || mime.length) {
				if (target === '' && fm.api >= 2.1) {
					rootCnt = Object.keys(fm.roots).length;
					jQuery.each(fm.roots, function(id, hash) {
						reqDef.push(fm.request({
							data   : setType({cmd : 'search', q : q, target : hash, mimes : mime}),
							notify : {type : 'search', cnt : 1, hideCnt : (rootCnt > 1? false : true)},
							cancel : true,
							preventDone : true
						}));
					});
				} else {
					reqDef.push(fm.request({
						data   : setType({cmd : 'search', q : q, target : target, mimes : mime}),
						notify : {type : 'search', cnt : 1, hideCnt : true},
						cancel : true,
						preventDone : true
					}));
					if (target !== '' && fm.api >= 2.1 && Object.keys(fm.leafRoots).length) {
						jQuery.each(fm.leafRoots, function(hash, roots) {
							phash = hash;
							while(phash) {
								if (target === phash) {
									jQuery.each(roots, function() {
										var f = fm.file(this);
										f && f.volumeid && targetVolids.push(f.volumeid);
										reqDef.push(fm.request({
											data   : setType({cmd : 'search', q : q, target : this, mimes : mime}),
											notify : {type : 'search', cnt : 1, hideCnt : false},
											cancel : true,
											preventDone : true
										}));
									});
								}
								phash = (fm.file(phash) || {}).phash;
							}
						});
					}
				}
			} else {
				reqDef = [jQuery.Deferred().resolve({files: []})];
			}
			
			fm.searchStatus.mixed = (reqDef.length > 1)? targetVolids : false;
			
			return jQuery.when.apply($, reqDef).done(function(data) {
				var argLen = arguments.length,
					i;
				
				data.warning && fm.error(data.warning);
				
				if (argLen > 1) {
					data.files = (data.files || []);
					for(i = 1; i < argLen; i++) {
						arguments[i].warning && fm.error(arguments[i].warning);
						
						if (arguments[i].files) {
							data.files.push.apply(data.files, arguments[i].files);
						}
					}
				}
				
				// because "preventDone : true" so update files cache
				data.files && data.files.length && fm.cache(data.files);
				
				fm.lazy(function() {
					fm.trigger('search', data);
				}).then(function() {
					// fire event with command name + 'done'
					return fm.lazy(function() {
						fm.trigger('searchdone');
					});
				}).then(function() {
					// force update content
					data.sync && fm.sync();
				});
			});
		}
		fm.getUI('toolbar').find('.'+fm.res('class', 'searchbtn')+' :text').trigger('focus');
		return jQuery.Deferred().reject();
	};

};
js/commands/undo.js000064400000007167151215013360010274 0ustar00/**
 * @class  elFinder command "undo"
 * Undo previous commands
 *
 * @author Naoki Sawada
 **/
elFinder.prototype.commands.undo = function() {
	"use strict";
	var self = this,
		fm = this.fm,
		setTitle = function(undo) {
			if (undo) {
				self.title = fm.i18n('cmdundo') + ' ' + fm.i18n('cmd'+undo.cmd);
				self.state = 0;
			} else {
				self.title = fm.i18n('cmdundo');
				self.state = -1;
			}
			self.change();
		},
		cmds = [];
	
	this.alwaysEnabled  = true;
	this.updateOnSelect = false;
	this.shortcuts      = [{
		pattern     : 'ctrl+z'
	}];
	this.syncTitleOnChange = true;
	
	this.getstate = function() {
		return cmds.length? 0 : -1;
	};
	
	this.setUndo = function(undo, redo) {
		var _undo = {};
		if (undo) {
			if (jQuery.isPlainObject(undo) && undo.cmd && undo.callback) {
				Object.assign(_undo, undo);
				if (redo) {
					delete redo.undo;
					_undo.redo = redo;
				} else {
					fm.getCommand('redo').setRedo(null);
				}
				cmds.push(_undo);
				setTitle(_undo);
			}
		}
	};
	
	this.exec = function() {
		var redo = fm.getCommand('redo'),
			dfd = jQuery.Deferred(),
			undo, res, _redo = {};
		if (cmds.length) {
			undo = cmds.pop();
			if (undo.redo) {
				Object.assign(_redo, undo.redo);
				delete undo.redo;
			} else {
				_redo = null;
			} 
			dfd.done(function() {
				if (_redo) {
					redo.setRedo(_redo, undo);
				}
			});
			
			setTitle(cmds.length? cmds[cmds.length-1] : void(0));
			
			res = undo.callback();
			
			if (res && res.done) {
				res.done(function() {
					dfd.resolve();
				}).fail(function() {
					dfd.reject();
				});
			} else {
				dfd.resolve();
			}
			if (cmds.length) {
				this.update(0, cmds[cmds.length - 1].name);
			} else {
				this.update(-1, '');
			}
		} else {
			dfd.reject();
		}
		return dfd;
	};
	
	fm.bind('exec', function(e) {
		var data = e.data || {};
		if (data.opts && data.opts._userAction) {
			if (data.dfrd && data.dfrd.done) {
				data.dfrd.done(function(res) {
					if (res && res.undo && res.redo) {
						res.undo.redo = res.redo;
						self.setUndo(res.undo);
					}
				});
			}
		}
	});
};

/**
 * @class  elFinder command "redo"
 * Redo previous commands
 *
 * @author Naoki Sawada
 **/
elFinder.prototype.commands.redo = function() {
	"use strict";
	var self = this,
		fm   = this.fm,
		setTitle = function(redo) {
			if (redo && redo.callback) {
				self.title = fm.i18n('cmdredo') + ' ' + fm.i18n('cmd'+redo.cmd);
				self.state = 0;
			} else {
				self.title = fm.i18n('cmdredo');
				self.state = -1;
			}
			self.change();
		},
		cmds = [];
	
	this.alwaysEnabled  = true;
	this.updateOnSelect = false;
	this.shortcuts      = [{
		pattern     : 'shift+ctrl+z ctrl+y'
	}];
	this.syncTitleOnChange = true;
	
	this.getstate = function() {
		return cmds.length? 0 : -1;
	};
	
	this.setRedo = function(redo, undo) {
		if (redo === null) {
			cmds = [];
			setTitle();
		} else {
			if (redo && redo.cmd && redo.callback) {
				if (undo) {
					redo.undo = undo;
				}
				cmds.push(redo);
				setTitle(redo);
			}
		}
	};
	
	this.exec = function() {
		var undo = fm.getCommand('undo'),
			dfd = jQuery.Deferred(),
			redo, res, _undo = {}, _redo = {};
		if (cmds.length) {
			redo = cmds.pop();
			if (redo.undo) {
				Object.assign(_undo, redo.undo);
				Object.assign(_redo, redo);
				delete _redo.undo;
				dfd.done(function() {
					undo.setUndo(_undo, _redo);
				});
			}
			
			setTitle(cmds.length? cmds[cmds.length-1] : void(0));
			
			res = redo.callback();
			
			if (res && res.done) {
				res.done(function() {
					dfd.resolve();
				}).fail(function() {
					dfd.reject();
				});
			} else {
				dfd.resolve();
			}
			return dfd;
		} else {
			return dfd.reject();
		}
	};
};
js/jquery.elfinder.js000064400000026502151215013360010626 0ustar00/*** jQuery UI droppable performance tune for elFinder ***/
(function(){
if (jQuery.ui) {
	if (jQuery.ui.ddmanager) {
		var origin = jQuery.ui.ddmanager.prepareOffsets;
		jQuery.ui.ddmanager.prepareOffsets = function( t, event ) {
			var isOutView = function(elem) {
				if (elem.is(':hidden')) {
					return true;
				}
				var rect = elem[0].getBoundingClientRect();
				return document.elementFromPoint(rect.left, rect.top) || document.elementFromPoint(rect.left + rect.width, rect.top + rect.height)? false : true;
			};
			
			if (event.type === 'mousedown' || t.options.elfRefresh) {
				var i, d,
				m = jQuery.ui.ddmanager.droppables[ t.options.scope ] || [],
				l = m.length;
				for ( i = 0; i < l; i++ ) {
					d = m[ i ];
					if (d.options.autoDisable && (!d.options.disabled || d.options.autoDisable > 1)) {
						d.options.disabled = isOutView(d.element);
						d.options.autoDisable = d.options.disabled? 2 : 1;
					}
				}
			}
			
			// call origin function
			return origin( t, event );
		};
	}
}
})();

 /**
 *
 * jquery.binarytransport
 *
 * @description. jQuery ajax transport for making binary data type requests.
 *
 */

(function($, undefined) {
	"use strict";

	// use this transport for "binary" data type
	jQuery.ajaxTransport("+binary", function(options, originalOptions, jqXHR) {
		// check for conditions and support for blob / arraybuffer response type
		if (window.FormData && ((options.dataType && (options.dataType == 'binary')) || (options.data && ((window.ArrayBuffer && options.data instanceof ArrayBuffer) || (window.Blob && options.data instanceof Blob))))) {
			var callback;

			// Cross domain only allowed if supported through XMLHttpRequest
			return {
				send: function( headers, complete ) {
					var i,
						dataType = options.responseType || "blob",
						xhr = options.xhr();

					xhr.open(
						options.type,
						options.url,
						options.async,
						options.username,
						options.password
					);

					// Apply custom fields if provided
					if ( options.xhrFields ) {
						for ( i in options.xhrFields ) {
							xhr[ i ] = options.xhrFields[ i ];
						}
					}

					// Override mime type if needed
					if ( options.mimeType && xhr.overrideMimeType ) {
						xhr.overrideMimeType( options.mimeType );
					}

					// X-Requested-With header
					// For cross-domain requests, seeing as conditions for a preflight are
					// akin to a jigsaw puzzle, we simply never set it to be sure.
					// (it can always be set on a per-request basis or even using ajaxSetup)
					// For same-domain requests, won't change header if already provided.
					if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
						headers[ "X-Requested-With" ] = "XMLHttpRequest";
					}

					// Set headers
					for ( i in headers ) {
						xhr.setRequestHeader( i, headers[ i ] );
					}

					// Callback
					callback = function( type ) {
						return function() {
							if ( callback ) {
								callback = xhr.onload = xhr.onerror = xhr.onabort = xhr.ontimeout = null;

								if ( type === "abort" ) {
									xhr.abort();
								} else if ( type === "error" ) {
									complete(
										xhr.status,
										xhr.statusText
									);
								} else {
									var data = {};
									data[options.dataType] = xhr.response;
									complete(
										xhr.status,
										xhr.statusText,
										data,
										xhr.getAllResponseHeaders()
									);
								}
							}
						};
					};

					// Listen to events
					xhr.onload = callback();
					xhr.onabort = xhr.onerror = xhr.ontimeout = callback( "error" );

					// Create the abort callback
					callback = callback( "abort" );

					try {
						xhr.responseType = dataType;
						// Do send the request (this may raise an exception)
						xhr.send( options.data || null );
					} catch ( e ) {
						if ( callback ) {
							throw e;
						}
					}
				},

				abort: function() {
					if ( callback ) {
						callback();
					}
				}
			};
		}
	});
})(window.jQuery);

/*!
 * jQuery UI Touch Punch 0.2.3
 *
 * Copyright 2011–2014, Dave Furfero
 * Dual licensed under the MIT or GPL Version 2 licenses.
 *
 * Depends:
 *	jquery.ui.widget.js
 *	jquery.ui.mouse.js
 */
(function ($) {

  // Detect touch support
  jQuery.support.touch = 'ontouchend' in document;

  // Ignore browsers without touch support
  if (!jQuery.support.touch) {
	return;
  }

  var mouseProto = jQuery.ui.mouse.prototype,
	  _mouseInit = mouseProto._mouseInit,
	  _mouseDestroy = mouseProto._mouseDestroy,
	  touchHandled,
	  posX, posY;

  /**
   * Simulate a mouse event based on a corresponding touch event
   * @param {Object} event A touch event
   * @param {String} simulatedType The corresponding mouse event
   */
  function simulateMouseEvent (event, simulatedType) {

	// Ignore multi-touch events
	if (event.originalEvent.touches.length > 1) {
	  return;
	}

	if (! jQuery(event.currentTarget).hasClass('touch-punch-keep-default')) {
		event.preventDefault();
	}

	var touch = event.originalEvent.changedTouches[0],
		simulatedEvent = document.createEvent('MouseEvents');
	
	// Initialize the simulated mouse event using the touch event's coordinates
	simulatedEvent.initMouseEvent(
	  simulatedType,	// type
	  true,				// bubbles					  
	  true,				// cancelable				  
	  window,			// view						  
	  1,				// detail					  
	  touch.screenX,	// screenX					  
	  touch.screenY,	// screenY					  
	  touch.clientX,	// clientX					  
	  touch.clientY,	// clientY					  
	  false,			// ctrlKey					  
	  false,			// altKey					  
	  false,			// shiftKey					  
	  false,			// metaKey					  
	  0,				// button					  
	  null				// relatedTarget			  
	);

	// Dispatch the simulated event to the target element
	event.target.dispatchEvent(simulatedEvent);
  }

  /**
   * Handle the jQuery UI widget's touchstart events
   * @param {Object} event The widget element's touchstart event
   */
  mouseProto._touchStart = function (event) {

	var self = this;

	// Ignore the event if another widget is already being handled
	if (touchHandled || !self._mouseCapture(event.originalEvent.changedTouches[0])) {
	  return;
	}

	// Track element position to avoid "false" move
	posX = event.originalEvent.changedTouches[0].screenX.toFixed(0);
	posY = event.originalEvent.changedTouches[0].screenY.toFixed(0);

	// Set the flag to prevent other widgets from inheriting the touch event
	touchHandled = true;

	// Track movement to determine if interaction was a click
	self._touchMoved = false;

	// Simulate the mouseover event
	simulateMouseEvent(event, 'mouseover');

	// Simulate the mousemove event
	simulateMouseEvent(event, 'mousemove');

	// Simulate the mousedown event
	simulateMouseEvent(event, 'mousedown');
  };

  /**
   * Handle the jQuery UI widget's touchmove events
   * @param {Object} event The document's touchmove event
   */
  mouseProto._touchMove = function (event) {

	// Ignore event if not handled
	if (!touchHandled) {
	  return;
	}

	// Ignore if it's a "false" move (position not changed)
	var x = event.originalEvent.changedTouches[0].screenX.toFixed(0);
	var y = event.originalEvent.changedTouches[0].screenY.toFixed(0);
	// Ignore if it's a "false" move (position not changed)
	if (Math.abs(posX - x) <= 4 && Math.abs(posY - y) <= 4) {
		return;
	}

	// Interaction was not a click
	this._touchMoved = true;

	// Simulate the mousemove event
	simulateMouseEvent(event, 'mousemove');
  };

  /**
   * Handle the jQuery UI widget's touchend events
   * @param {Object} event The document's touchend event
   */
  mouseProto._touchEnd = function (event) {

	// Ignore event if not handled
	if (!touchHandled) {
	  return;
	}

	// Simulate the mouseup event
	simulateMouseEvent(event, 'mouseup');

	// Simulate the mouseout event
	simulateMouseEvent(event, 'mouseout');

	// If the touch interaction did not move, it should trigger a click
	if (!this._touchMoved) {

	  // Simulate the click event
	  simulateMouseEvent(event, 'click');
	}

	// Unset the flag to allow other widgets to inherit the touch event
	touchHandled = false;
	this._touchMoved = false;
  };

  /**
   * A duck punch of the jQuery.ui.mouse _mouseInit method to support touch events.
   * This method extends the widget with bound touch event handlers that
   * translate touch events to mouse events and pass them to the widget's
   * original mouse event handling methods.
   */
  mouseProto._mouseInit = function () {
	
	var self = this;

	if (self.element.hasClass('touch-punch')) {
		// Delegate the touch handlers to the widget's element
		self.element.on({
		  touchstart: jQuery.proxy(self, '_touchStart'),
		  touchmove: jQuery.proxy(self, '_touchMove'),
		  touchend: jQuery.proxy(self, '_touchEnd')
		});
	}

	// Call the original jQuery.ui.mouse init method
	_mouseInit.call(self);
  };

  /**
   * Remove the touch event handlers
   */
  mouseProto._mouseDestroy = function () {
	
	var self = this;

	if (self.element.hasClass('touch-punch')) {
		// Delegate the touch handlers to the widget's element
		self.element.off({
		  touchstart: jQuery.proxy(self, '_touchStart'),
		  touchmove: jQuery.proxy(self, '_touchMove'),
		  touchend: jQuery.proxy(self, '_touchEnd')
		});
	}

	// Call the original jQuery.ui.mouse destroy method
	_mouseDestroy.call(self);
  };

})(jQuery);

jQuery.fn.elfinder = function(o, o2) {
	
	if (o === 'instance') {
		return this.getElFinder();
	} else if (o === 'ondemand') {

	}
	
	return this.each(function() {
		
		var cmd          = typeof o  === 'string'  ? o  : '',
			bootCallback = typeof o2 === 'function'? o2 : void(0),
			elfinder     = this.elfinder,
			opts, reloadCallback;
		
		if (!elfinder) {
			if (jQuery.isPlainObject(o)) {
				new elFinder(this, o, bootCallback);
			}
		} else {
			switch(cmd) {
				case 'close':
				case 'hide':
					elfinder.hide();
					break;
					
				case 'open':
				case 'show':
					elfinder.show();
					break;
					
				case 'destroy':
					elfinder.destroy();
					break;
				
				case 'reload':
				case 'restart':
					if (elfinder) {
						opts = jQuery.extend(true, elfinder.options, jQuery.isPlainObject(o2)? o2 : {});
						bootCallback = elfinder.bootCallback;
						if (elfinder.reloadCallback && jQuery.isFunction(elfinder.reloadCallback)) {
							elfinder.reloadCallback(opts, bootCallback);
						} else {
							elfinder.destroy();
							new elFinder(this, opts, bootCallback);
						}
					}
					break;
			}
		}
	});
};

jQuery.fn.getElFinder = function() {
	var instance;
	
	this.each(function() {
		if (this.elfinder) {
			instance = this.elfinder;
			return false;
		}
	});
	
	return instance;
};

jQuery.fn.elfUiWidgetInstance = function(name) {
	try {
		return this[name]('instance');
	} catch(e) {
		// fallback for jQuery UI < 1.11
		var data = this.data('ui-' + name);
		if (data && typeof data === 'object' && data.widgetFullName === 'ui-' + name) {
			return data;
		}
		return null;
	}
};

// function scrollRight
if (! jQuery.fn.scrollRight) {
	jQuery.fn.extend({
		scrollRight: function (val) {
			var node = this.get(0);
			if (val === undefined) {
				return Math.max(0, node.scrollWidth - (node.scrollLeft + node.clientWidth));
			}
			return this.scrollLeft(node.scrollWidth - node.clientWidth - val);
		}
	});
}

// function scrollBottom
if (! jQuery.fn.scrollBottom) {
	jQuery.fn.extend({
		scrollBottom: function(val) { 
			var node = this.get(0);
			if (val === undefined) {
				return Math.max(0, node.scrollHeight - (node.scrollTop + node.clientHeight));
			}
			return this.scrollTop(node.scrollHeight - node.clientHeight - val);
		}
	});
}
js/elFinder.options.netmount.js000064400000003066151215013360012612 0ustar00/**
 * Default elFinder config of commandsOptions.netmount
 *
 * @type  Object
 */

elFinder.prototype._options.commandsOptions.netmount = {
	ftp: {
		name : 'FTP',
		inputs: {
			host     : jQuery('<input type="text"/>'),
			port     : jQuery('<input type="number" placeholder="21" class="elfinder-input-optional"/>'),
			path     : jQuery('<input type="text" value="/"/>'),
			user     : jQuery('<input type="text"/>'),
			pass     : jQuery('<input type="password" autocomplete="new-password"/>'),
			FTPS     : jQuery('<input type="checkbox" value="1" title="File Transfer Protocol over SSL/TLS"/>'),
			encoding : jQuery('<input type="text" placeholder="Optional" class="elfinder-input-optional"/>'),
			locale   : jQuery('<input type="text" placeholder="Optional" class="elfinder-input-optional"/>')
		}
	},
	dropbox2: elFinder.prototype.makeNetmountOptionOauth('dropbox2', 'Dropbox', 'Dropbox', {noOffline : true,
		root : '/',
		pathI18n : 'path',
		integrate : {
			title: 'Dropbox.com',
			link: 'https://www.dropbox.com'
		}
	}),
	googledrive: elFinder.prototype.makeNetmountOptionOauth('googledrive', 'Google Drive', 'Google', {
		integrate : {
			title: 'Google Drive',
			link: 'https://www.google.com/drive/'
		}
	}),
	onedrive: elFinder.prototype.makeNetmountOptionOauth('onedrive', 'One Drive', 'OneDrive', {
		integrate : {
			title: 'Microsoft OneDrive',
			link: 'https://onedrive.live.com'
		}
	}),
	box: elFinder.prototype.makeNetmountOptionOauth('box', 'Box', 'Box', {
		noOffline : true,
		integrate : {
			title: 'Box.com',
			link: 'https://www.box.com'
		}
	})
};
js/worker/quicklook.tiff.js000064400000000362151215013360011755 0ustar00var data = self.data;
if (data.memory) {
  Tiff.initialize({ TOTAL_MEMORY: data.memory });
}
var tiff = new Tiff({buffer: data.data});
var image = tiff.readRGBAImage();
self.res = { image: image, width: tiff.width(), height: tiff.height() };
js/worker/calcfilehash.js000064400000001024151215013360011427 0ustar00var type = self.data.type,
	bin = self.data.bin,
	hashOpts = self.data.hashOpts;

self.res = {};
if (type === 'md5') {
	let sp = new self.SparkMD5.ArrayBuffer();
	sp.append(bin);
	self.res.hash = sp.end();
} else {
	let sha = new jsSHA('SHA' + (type.length === 5? type : ('-' + type)).toUpperCase(), 'ARRAYBUFFER'),
		opts = {};
	if (type === 'ke128') {
		opts.shakeLen = hashOpts.shake128len;
	} else if (type === 'ke256') {
		opts.shakeLen = hashOpts.shake256len;
	}
	sha.update(bin);
	self.res.hash = sha.getHash('HEX', opts);
}
js/worker/quicklook.unzip.js000064400000003464151215013360012200 0ustar00var type = self.data.type,
	bin = self.data.bin,
	unzipFiles = function() {
		/** @type {Array.<string>} */
		var filenameList = [];
		/** @type {number} */
		var i;
		/** @type {number} */
		var il;
		/** @type {Array.<Zlib.Unzip.FileHeader>} */
		var fileHeaderList;
		// need check this.Y when update cdns.zlibUnzip
		this.Y();
		fileHeaderList = this.i;
		for (i = 0, il = fileHeaderList.length; i < il; ++i) {
			// need check fileHeaderList[i].J when update cdns.zlibUnzip
			filenameList[i] = fileHeaderList[i].filename + (fileHeaderList[i].J? ' ({formatSize(' + fileHeaderList[i].J + ')})' : '');
		}
		return filenameList;
	},
	tarFiles = function(tar) {
		var filenames = [],
			tarlen = tar.length,
			offset = 0,
			toStr = function(arr) {
				return String.fromCharCode.apply(null, arr).replace(/\0+$/, '');
			},
			h, name, prefix, size, dbs;
		while (offset < tarlen && tar[offset] !== 0) {
			h = tar.subarray(offset, offset + 512);
			name = toStr(h.subarray(0, 100));
			if (prefix = toStr(h.subarray(345, 500))) {
				name = prefix + name;
			}
			size = parseInt(toStr(h.subarray(124, 136)), 8);
			dbs = Math.ceil(size / 512) * 512;
			if (name === '././@LongLink') {
				name = toStr(tar.subarray(offset + 512, offset + 512 + dbs));
			}
			(name !== 'pax_global_header') && filenames.push(name + (size? ' ({formatSize(' + size + ')})': ''));
			offset = offset + 512 + dbs;
		}
		return filenames;
	};

self.res = {};
if (type === 'tar') {
	self.res.files = tarFiles(new Uint8Array(bin));
} else if (type === 'zip') {
	self.res.files = unzipFiles.call(new Zlib.Unzip(new Uint8Array(bin)));
} else if (type === 'gzip') {
	self.res.files = tarFiles((new Zlib.Gunzip(new Uint8Array(bin))).decompress());
} else if (type === 'bzip2') {
	self.res.files = tarFiles(self.bzip2.simple(self.bzip2.array(new Uint8Array(bin))));
}
js/i18n/elfinder.sl.js000064400000102065151215013360010503 0ustar00/**
 * Slovenščina translation
 * @author Damjan Rems <d_rems at yahoo.com>
 * @version 2022-03-03
 */
 (function(root, factory) {
	if (typeof define === 'function' && define.amd) {
		define(['elfinder'], factory);
	} else if (typeof exports !== 'undefined') {
		module.exports = factory(require('elfinder'));
	} else {
		factory(root.elFinder);
	}
}(this, function(elFinder) {
	elFinder.prototype.i18.sl = {
		translator : 'Damjan Rems &lt;d_rems at yahoo.com&gt;',
		language   : 'Slovenščina',
		direction  : 'ltr',
		dateFormat : 'd.m.Y H:i', // will show like: 03.03.2022 12:34
		fancyDateFormat : '$1 H:i', // will show like: Danes 12:34
		nonameDateFormat : 'ymd-His', // noname upload will show like: 220303-123418
		messages   : {
			'getShareText' : 'Deliti',
			'Editor ': 'Urejevalnik kode',

			/********************************** errors **********************************/
			'error'                : 'Napaka',
			'errUnknown'           : 'Neznana napaka.',
			'errUnknownCmd'        : 'Neznan ukaz.',
			'errJqui'              : 'Napačna jQuery UI nastavitev. Selectable, draggable in droppable dodatki morajo biti vključeni.',
			'errNode'              : 'elFinder potrebuje "DOM Element".',
			'errURL'               : 'Napačna nastavitev elFinder-ja! Manjka URL nastavitev.',
			'errAccess'            : 'Dostop zavrnjen.',
			'errConnect'           : 'Ne morem se priključiti na "backend".',
			'errAbort'             : 'Povezava prekinjena (aborted).',
			'errTimeout'           : 'Povezava potekla (timeout).',
			'errNotFound'          : 'Nisem našel "backend-a".',
			'errResponse'          : 'Napačni "backend" odgovor.',
			'errConf'              : 'Napačna "backend" nastavitev.',
			'errJSON'              : 'JSON modul ni instaliran.',
			'errNoVolumes'         : 'Bralne količine niso na voljo.',
			'errCmdParams'         : 'Napačni parametri za ukaz "$1".',
			'errDataNotJSON'       : 'Podatki niso v JSON obliki.',
			'errDataEmpty'         : 'Ni podatkov oz. so prazni.',
			'errCmdReq'            : '"Backend" zahtevek potrebuje ime ukaza.',
			'errOpen'              : '"$1" ni možno odpreti.',
			'errNotFolder'         : 'Objekt ni mapa.',
			'errNotFile'           : 'Objekt ni datoteka.',
			'errRead'              : '"$1" ni možno brati.',
			'errWrite'             : 'Ne morem pisati v "$1".',
			'errPerm'              : 'Dostop zavrnjen.',
			'errLocked'            : '"$1" je zaklenjen(a) in je ni možno preimenovati, premakniti ali izbrisati.',
			'errExists'            : 'Datoteka z imenom "$1" že obstaja.',
			'errInvName'           : 'Napačno ime datoteke.',
			'errInvDirname'        : 'Neveljavno ime mape.',  // from v2.1.24 added 12.4.2017
			'errFolderNotFound'    : 'Mape nisem našel.',
			'errFileNotFound'      : 'Datoteke nisem našel.',
			'errTrgFolderNotFound' : 'Ciljna mapa "$1" ne obstaja.',
			'errPopup'             : 'Brskalnik je preprečil prikaz (popup) okna. Za vpogled datoteke omogočite nastavitev v vašem brskalniku.',
			'errMkdir'             : 'Ni možno dodati mape "$1".',
			'errMkfile'            : 'Ni možno dodati datoteke "$1".',
			'errRename'            : 'Ni možno preimenovati "$1".',
			'errCopyFrom'          : 'Kopiranje datotek iz "$1" ni dovoljeno.',
			'errCopyTo'            : 'Kopiranje datotek na "$1" ni dovoljeno.',
			'errMkOutLink'         : 'Povezave z izven korenskega nosilca ni mogoče ustvariti.', // from v2.1 added 03.10.2015
			'errUpload'            : 'Napaka pri prenosu.',  // old name - errUploadCommon
			'errUploadFile'        : '"$1" ni možno naložiti (upload).', // old name - errUpload
			'errUploadNoFiles'     : 'Ni datotek za nalaganje (upload).',
			'errUploadTotalSize'   : 'Podatki presegajo največjo dovoljeno velikost.', // old name - errMaxSize
			'errUploadFileSize'    : 'Datoteka presega največjo dovoljeno velikost.', //  old name - errFileMaxSize
			'errUploadMime'        : 'Datoteke s to končnico niso dovoljene.',
			'errUploadTransfer'    : '"$1" napaka pri prenosu.',
			'errUploadTemp'        : 'Ni mogoče ustvariti začasne datoteke za nalaganje.', // from v2.1 added 26.09.2015
			'errNotReplace'        : 'Objekt "$1" že obstaja na tej lokaciji in ga ni mogoče nadomestiti s predmetom druge vrste.', // new
			'errReplace'           : '"$1" ni mogoče zamenjati.',
			'errSave'              : '"$1" ni možno shraniti.',
			'errCopy'              : '"$1" ni možno kopirati.',
			'errMove'              : '"$1" ni možno premakniti.',
			'errCopyInItself'      : '"$1" ni možno kopirati samo vase.',
			'errRm'                : '"$1" ni možno izbrisati.',
			'errTrash'             : 'Ni mogoče v smeti.', // from v2.1.24 added 30.4.2017
			'errRmSrc'             : 'Izvornih datotek ni mogoče odstraniti.',
			'errExtract'           : 'Datotek iz "$1" ni možno odpakirati.',
			'errArchive'           : 'Napaka pri delanju arhiva.',
			'errArcType'           : 'Nepodprta vrsta arhiva.',
			'errNoArchive'         : 'Datoteka ni arhiv ali vrsta arhiva ni podprta.',
			'errCmdNoSupport'      : '"Backend" ne podpira tega ukaza.',
			'errReplByChild'       : 'Mape “$1” ni možno zamenjati z vsebino mape.',
			'errArcSymlinks'       : 'Zaradi varnostnih razlogov arhiva ki vsebuje "symlinks" ni možno odpakirati.', // edited 24.06.2012
			'errArcMaxSize'        : 'Datoteke v arhivu presegajo največjo dovoljeno velikost.',
			'errResize'            : '"$1" ni možno razširiti.',
			'errResizeDegree'      : 'Neveljavna stopnja vrtenja.',  // added 7.3.2013
			'errResizeRotate'      : 'Slike ni mogoče zasukati.',  // added 7.3.2013
			'errResizeSize'        : 'Neveljavna velikost slike.',  // added 7.3.2013
			'errResizeNoChange'    : 'Velikost slike ni spremenjena.',  // added 7.3.2013
			'errUsupportType'      : 'Nepodprta vrsta datoteke.',
			'errNotUTF8Content'    : 'Datoteka "$1" ni v UTF-8 in je ni mogoče urejati.',  // added 9.11.2011
			'errNetMount'          : '"$1" ni mogoče priklopiti.', // added 17.04.2012
			'errNetMountNoDriver'  : 'Nepodprt protokol.',     // added 17.04.2012
			'errNetMountFailed'    : 'Montaža ni uspela.',         // added 17.04.2012
			'errNetMountHostReq'   : 'Potreben je gostitelj.', // added 18.04.2012
			'errSessionExpires'    : 'Vaša seja je potekla zaradi neaktivnosti.',
			'errCreatingTempDir'   : 'Ni mogoče ustvariti začasnega imenika: "$1"',
			'errFtpDownloadFile'   : 'Ni mogoče prenesti datoteke s FTP: "$1"',
			'errFtpUploadFile'     : 'Datoteke ni mogoče naložiti na FTP: "$1"',
			'errFtpMkdir'          : 'Ni mogoče ustvariti oddaljenega imenika na FTP: "$1"',
			'errArchiveExec'       : 'Napaka pri arhiviranju datotek: "$1"',
			'errExtractExec'       : 'Napaka pri ekstrakciji datotek: "$1"',
			'errNetUnMount'        : 'Ni mogoče odklopiti.', // from v2.1 added 30.04.2012
			'errConvUTF8'          : 'Ni mogoče pretvoriti v UTF-8', // from v2.1 added 08.04.2014
			'errFolderUpload'      : 'Preizkusite sodobni brskalnik, če želite naložiti mapo.', // from v2.1 added 26.6.2015
			'errSearchTimeout'     : 'Časovna omejitev je potekla med iskanjem »$1«. Rezultat iskanja je delen.', // from v2.1 added 12.1.2016
			'errReauthRequire'     : 'Potrebno je ponovno pooblastilo.', // from v2.1.10 added 24.3.2016
			'errMaxTargets'        : 'Največje število izbirnih elementov je 1 dolar.', // from v2.1.17 added 17.10.2016
			'errRestore'           : 'Ni mogoče obnoviti iz koša. Cilja obnovitve ni mogoče določiti.', // from v2.1.24 added 3.5.2017
			'errEditorNotFound'    : 'Urejevalnika za to vrsto datoteke ni bilo mogoče najti.', // from v2.1.25 added 23.5.2017
			'errServerError'       : 'Na strani strežnika je prišlo do napake.', // from v2.1.25 added 16.6.2017
			'errEmpty'             : 'Ni mogoče izprazniti mape "$1".', // from v2.1.25 added 22.6.2017
			'moreErrors'           : 'Obstaja še 1 $ napak.', // from v2.1.44 added 9.12.2018
			'errMaxMkdirs'         : 'Naenkrat lahko ustvarite do $1 map.', // from v2.1.58 added 20.6.2021

			/******************************* commands names ********************************/
			'cmdarchive'   : 'Naredi arhiv',
			'cmdback'      : 'Nazaj',
			'cmdcopy'      : 'Kopiraj',
			'cmdcut'       : 'Izreži',
			'cmddownload'  : 'Poberi (download)',
			'cmdduplicate' : 'Podvoji',
			'cmdedit'      : 'Uredi datoteko',
			'cmdextract'   : 'Odpakiraj datoteke iz arhiva',
			'cmdforward'   : 'Naprej',
			'cmdgetfile'   : 'Izberi datoteke',
			'cmdhelp'      : 'Več o',
			'cmdhome'      : 'Domov',
			'cmdinfo'      : 'Lastnosti',
			'cmdmkdir'     : 'Nova mapa',
			'cmdmkdirin'   : 'V novo mapo', // from v2.1.7 added 19.2.2016
			'cmdmkfile'    : 'Nova datoteka',
			'cmdopen'      : 'Odpri',
			'cmdpaste'     : 'Prilepi',
			'cmdquicklook' : 'Hitri ogled',
			'cmdreload'    : 'Osveži',
			'cmdrename'    : 'Preimenuj',
			'cmdrm'        : 'Izbriši',
			'cmdtrash'     : 'V smeti', //from v2.1.24 added 29.4.2017
			'cmdrestore'   : 'Obnovi', //from v2.1.24 added 3.5.2017
			'cmdsearch'    : 'Poišči datoteke',
			'cmdup'        : 'Mapa nazaj',
			'cmdupload'    : 'Naloži (upload)',
			'cmdview'      : 'Ogled',
			'cmdresize'    : 'Povečaj (pomanjšaj) sliko',
			'cmdsort'      : 'Razvrsti',
			'cmdnetmount'  : 'Namestite omrežno glasnost', // added 18.04.2012
			'cmdnetunmount': 'Odklopi', // from v2.1 added 30.04.2012
			'cmdplaces'    : 'Na mesta', // added 28.12.2014
			'cmdchmod'     : 'Spremeni način', // from v2.1 added 20.6.2015
			'cmdopendir'   : 'Odprite mapo', // from v2.1 added 13.1.2016
			'cmdcolwidth'  : 'Ponastavi širino stolpca', // from v2.1.13 added 12.06.2016
			'cmdfullscreen': 'Celozaslonski način', // from v2.1.15 added 03.08.2016
			'cmdmove'      : 'Premakni se', // from v2.1.15 added 21.08.2016
			'cmdempty'     : 'Izpraznite mapo', // from v2.1.25 added 22.06.2017
			'cmdundo'      : 'Razveljavi', // from v2.1.27 added 31.07.2017
			'cmdredo'      : 'Ponovi', // from v2.1.27 added 31.07.2017
			'cmdpreference': 'Nastavitve', // from v2.1.27 added 03.08.2017
			'cmdselectall' : 'Izberi vse', // from v2.1.28 added 15.08.2017
			'cmdselectnone': 'Izberite nobenega', // from v2.1.28 added 15.08.2017
			'cmdselectinvert': 'Obrni izbor', // from v2.1.28 added 15.08.2017
			'cmdopennew'   : 'Odpri v novem oknu', // from v2.1.38 added 3.4.2018
			'cmdhide'      : 'Skrij (nastavitev)', // from v2.1.41 added 24.7.2018

			/*********************************** buttons ***********************************/
			'btnClose'  : 'Zapri',
			'btnSave'   : 'Shrani',
			'btnRm'     : 'Izbriši',
			'btnApply'  : 'Uporabi',
			'btnCancel' : 'Prekliči',
			'btnNo'     : 'Ne',
			'btnYes'    : 'Da',
			'btnMount'  : 'Mount',  // added 18.04.2012
			'btnApprove': 'Pojdi na $1 in odobri', // from v2.1 added 26.04.2012
			'btnUnmount': 'Odklopi', // from v2.1 added 30.04.2012
			'btnConv'   : 'Pretvorba', // from v2.1 added 08.04.2014
			'btnCwd'    : 'tukaj',      // from v2.1 added 22.5.2015
			'btnVolume' : 'Glasnost',    // from v2.1 added 22.5.2015
			'btnAll'    : 'vse',       // from v2.1 added 22.5.2015
			'btnMime'   : 'Vrsta MIME', // from v2.1 added 22.5.2015
			'btnFileName':'Ime datoteke',  // from v2.1 added 22.5.2015
			'btnSaveClose': 'Shrani in zapri', // from v2.1 added 12.6.2015
			'btnBackup' : 'Rezerva', // fromv2.1 added 28.11.2015
			'btnRename'    : 'Preimenuj',      // from v2.1.24 added 6.4.2017
			'btnRenameAll' : 'Preimenuj (vse)', // from v2.1.24 added 6.4.2017
			'btnPrevious' : 'Prejšnja (1 $/2 $)', // from v2.1.24 added 11.5.2017
			'btnNext'     : 'Naslednji (1 $/2 $)', // from v2.1.24 added 11.5.2017
			'btnSaveAs'   : 'Shrani kot', // from v2.1.25 added 24.5.2017

			/******************************** notifications ********************************/
			'ntfopen'     : 'Odpri mapo',
			'ntffile'     : 'Odpri datoteko',
			'ntfreload'   : 'Osveži vsebino mape',
			'ntfmkdir'    : 'Ustvarjam mapo',
			'ntfmkfile'   : 'Ustvarjam datoteke',
			'ntfrm'       : 'Brišem datoteke',
			'ntfcopy'     : 'Kopiram datoteke',
			'ntfmove'     : 'Premikam datoteke',
			'ntfprepare'  : 'Pripravljam se na kopiranje datotek',
			'ntfrename'   : 'Preimenujem datoteke',
			'ntfupload'   : 'Nalagam (upload) datoteke',
			'ntfdownload' : 'Pobiram (download) datoteke',
			'ntfsave'     : 'Shranjujem datoteke',
			'ntfarchive'  : 'Ustvarjam arhiv',
			'ntfextract'  : 'Razpakiram datoteke iz arhiva',
			'ntfsearch'   : 'Iščem datoteke',
			'ntfresize'   : 'Spreminjanje velikosti slik',
			'ntfsmth'     : 'Počakaj delam >_<',
			'ntfloadimg'  : 'Nalagam sliko',
			'ntfnetmount' : 'Montaža omrežne glasnosti', // added 18.04.2012
			'ntfnetunmount': 'Odstranitev omrežnega nosilca', // from v2.1 added 30.04.2012
			'ntfdim'      : 'Pridobivanje dimenzije slike', // added 20.05.2013
			'ntfreaddir'  : 'Branje informacij o mapi', // from v2.1 added 01.07.2013
			'ntfurl'      : 'Pridobivanje URL-ja povezave', // from v2.1 added 11.03.2014
			'ntfchmod'    : 'Spreminjanje načina datoteke', // from v2.1 added 20.6.2015
			'ntfpreupload': 'Preverjanje imena datoteke za nalaganje', // from v2.1 added 31.11.2015
			'ntfzipdl'    : 'Ustvarjanje datoteke za prenos', // from v2.1.7 added 23.1.2016
			'ntfparents'  : 'Pridobivanje informacij o poti', // from v2.1.17 added 2.11.2016
			'ntfchunkmerge': 'Obdelava naložene datoteke', // from v2.1.17 added 2.11.2016
			'ntftrash'    : 'Vrzi v smeti', // from v2.1.24 added 2.5.2017
			'ntfrestore'  : 'Obnovitev iz koša', // from v2.1.24 added 3.5.2017
			'ntfchkdir'   : 'Preverjanje ciljne mape', // from v2.1.24 added 3.5.2017
			'ntfundo'     : 'Razveljavitev prejšnje operacije', // from v2.1.27 added 31.07.2017
			'ntfredo'     : 'Ponavljanje prejšnjega razveljavljenega', // from v2.1.27 added 31.07.2017
			'ntfchkcontent' : 'Preverjanje vsebine', // from v2.1.41 added 3.8.2018

			/*********************************** volumes *********************************/
			'volume_Trash' : 'smeti', //from v2.1.24 added 29.4.2017

			/************************************ dates **********************************/
			'dateUnknown' : 'neznan',
			'Today'       : 'Danes',
			'Yesterday'   : 'Včeraj',
			'msJan'       : 'Jan',
			'msFeb'       : 'februarja',
			'msMar'       : 'mar',
			'msApr'       : 'apr',
			'msMay'       : 'Maj',
			'msJun'       : 'Jun',
			'msJul'       : 'jul',
			'msAug'       : 'Avg',
			'msSep'       : 'sep',
			'msOct'       : 'Okt',
			'msNov'       : 'nov',
			'msDec'       : 'dec',
			'January'     : 'Januar',
			'February'    : 'Februar',
			'March'       : 'Marec',
			'April'       : 'aprila',
			'May'         : 'Maj',
			'June'        : 'Junij',
			'July'        : 'Julij',
			'August'      : 'Avgust',
			'September'   : 'septembra',
			'October'     : 'Oktober',
			'November'    : 'novembra',
			'December'    : 'december',
			'Sunday'      : 'Nedelja',
			'Monday'      : 'Ponedeljek',
			'Tuesday'     : 'Torek',
			'Wednesday'   : 'Sreda',
			'Thursday'    : 'Četrtek',
			'Friday'      : 'Petek',
			'Saturday'    : 'Sobota',
			'Sun'         : 'Ned',
			'Mon'         : 'Pon',
			'Tue'         : 'Tor',
			'Wed'         : 'Sre',
			'Thu'         : 'Čet',
			'Fri'         : 'Pet',
			'Sat'         : 'Sob',

			/******************************** sort variants ********************************/
			'sortname'          : 'po imenu',
			'sortkind'          : 'po vrsti',
			'sortsize'          : 'po velikosti',
			'sortdate'          : 'po datumu',
			'sortFoldersFirst'  : 'Najprej mape',
			'sortperm'          : 'z dovoljenjem', // from v2.1.13 added 13.06.2016
			'sortmode'          : 'po načinu',       // from v2.1.13 added 13.06.2016
			'sortowner'         : 's strani lastnika',      // from v2.1.13 added 13.06.2016
			'sortgroup'         : 'po skupini',      // from v2.1.13 added 13.06.2016
			'sortAlsoTreeview'  : 'Tudi Treeview',  // from v2.1.15 added 01.08.2016

			/********************************** new items **********************************/
			'untitled file.txt' : 'NewFile.txt', // added 10.11.2015
			'untitled folder'   : 'Nova mapa',   // added 10.11.2015
			'Archive'           : 'NewArchive',  // from v2.1 added 10.11.2015
			'untitled file'     : 'Nova datoteka.$1',  // from v2.1.41 added 6.8.2018
			'extentionfile'     : '$1: datoteka',    // from v2.1.41 added 6.8.2018
			'extentiontype'     : '1 $: 2 $',      // from v2.1.43 added 17.10.2018

			/********************************** messages **********************************/
			'confirmReq'      : 'Zahtevana je potrditev',
			'confirmRm'       : 'Ste prepričani, da želite izbrisati datoteko?<br/>POZOR! Tega ukaza ni možno preklicati!',
			'confirmRepl'     : 'Zamenjam staro datoteko z novo?',
			'confirmRest'     : 'Ali želite obstoječi element zamenjati s predmetom v smetnjaku?', // fromv2.1.24 added 5.5.2017
			'confirmConvUTF8' : 'Ni v UTF-8<br/>Pretvoriti v UTF-8?<br/>Vsebina postane UTF-8 s shranjevanjem po pretvorbi.', // from v2.1 added 08.04.2014
			'confirmNonUTF8'  : 'Kodiranja znakov te datoteke ni bilo mogoče zaznati. Za urejanje ga je treba začasno pretvoriti v UTF-8.<br/>Prosimo, izberite kodiranje znakov te datoteke.', // from v2.1.19 added 28.11.2016
			'confirmNotSave'  : 'Spremenjeno je bilo.<br/>Če ne shranite sprememb, boste izgubili delo.', // from v2.1 added 15.7.2015
			'confirmTrash'    : 'Ali ste prepričani, da želite premakniti predmete v koš za smeti?', //from v2.1.24 added 29.4.2017
			'confirmMove'     : 'Ali ste prepričani, da želite premakniti elemente v »$1«?', //from v2.1.50 added 27.7.2019
			'apllyAll'        : 'Uporabi pri vseh',
			'name'            : 'Ime',
			'size'            : 'Velikost',
			'perms'           : 'Dovoljenja',
			'modify'          : 'Spremenjeno',
			'kind'            : 'Vrsta',
			'read'            : 'beri',
			'write'           : 'piši',
			'noaccess'        : 'ni dostopa',
			'and'             : 'in',
			'unknown'         : 'neznan',
			'selectall'       : 'Izberi vse datoteke',
			'selectfiles'     : 'Izberi datotek(o)e',
			'selectffile'     : 'Izberi prvo datoteko',
			'selectlfile'     : 'Izberi zadnjo datoteko',
			'viewlist'        : 'Seznam',
			'viewicons'       : 'Ikone',
			'viewSmall'       : 'Majhne ikone', // from v2.1.39 added 22.5.2018
			'viewMedium'      : 'Srednje ikone', // from v2.1.39 added 22.5.2018
			'viewLarge'       : 'Velike ikone', // from v2.1.39 added 22.5.2018
			'viewExtraLarge'  : 'Izjemno velike ikone', // from v2.1.39 added 22.5.2018
			'places'          : 'Mesta (places)',
			'calc'            : 'Izračun',
			'path'            : 'Pot do',
			'aliasfor'        : 'Sopomenka (alias) za',
			'locked'          : 'Zaklenjeno',
			'dim'             : 'Dimenzije',
			'files'           : 'Datoteke',
			'folders'         : 'Mape',
			'items'           : 'Predmeti',
			'yes'             : 'da',
			'no'              : 'ne',
			'link'            : 'Povezava',
			'searcresult'     : 'Rezultati iskanja',
			'selected'        : 'izbrani predmeti',
			'about'           : 'Več o',
			'shortcuts'       : 'Bližnjice',
			'help'            : 'Pomoč',
			'webfm'           : 'Spletni upravitelj datotek',
			'ver'             : 'Verzija',
			'protocolver'     : 'verzija protokola',
			'homepage'        : 'Domača stran',
			'docs'            : 'Dokumentacija',
			'github'          : 'Fork us on Github',
			'twitter'         : 'Sledi na twitterju',
			'facebook'        : 'Pridruži se nam na facebook-u',
			'team'            : 'Tim',
			'chiefdev'        : 'Glavni razvijalec',
			'developer'       : 'razvijalec',
			'contributor'     : 'sodelavec',
			'maintainer'      : 'vzdrževalec',
			'translator'      : 'prevajalec',
			'icons'           : 'Ikone',
			'dontforget'      : 'In ne pozabi na brisačo',
			'shortcutsof'     : 'Bližnjica onemogočena',
			'dropFiles'       : 'Datoteke spusti tukaj',
			'or'              : 'ali',
			'selectForUpload' : 'Izberi datoteke za nalaganje',
			'moveFiles'       : 'Premakni datoteke',
			'copyFiles'       : 'Kopiraj datoteke',
			'restoreFiles'    : 'Obnovite predmete', // from v2.1.24 added 5.5.2017
			'rmFromPlaces'    : 'Izbriši iz mesta (places)',
			'aspectRatio'     : 'Razmerje slike',
			'scale'           : 'Razširi',
			'width'           : 'Širina',
			'height'          : 'Višina',
			'resize'          : 'Povečaj',
			'crop'            : 'Obreži',
			'rotate'          : 'Zavrti',
			'rotate-cw'       : 'Zavrti 90 st. v smeri ure',
			'rotate-ccw'      : 'Zavrti 90 st. v obratni smeri ure',
			'degree'          : 'Stopnja',
			'netMountDialogTitle' : 'Namestite omrežno glasnost', // added 18.04.2012
			'protocol'            : 'Protokol', // added 18.04.2012
			'host'                : 'Gostitelj', // added 18.04.2012
			'port'                : 'pristanišče', // added 18.04.2012
			'user'                : 'Uporabnik', // added 18.04.2012
			'pass'                : 'Geslo', // added 18.04.2012
			'confirmUnmount'      : 'Ali odklopite $1?',  // from v2.1 added 30.04.2012
			'dropFilesBrowser': 'Spustite ali prilepite datoteke iz brskalnika', // from v2.1 added 30.05.2012
			'dropPasteFiles'  : 'Sem spustite datoteke, prilepite URL-je ali slike (odložišče).', // from v2.1 added 07.04.2014
			'encoding'        : 'Kodiranje', // from v2.1 added 19.12.2014
			'locale'          : 'Locale',   // from v2.1 added 19.12.2014
			'searchTarget'    : 'Cilj: 1 dolar',                // from v2.1 added 22.5.2015
			'searchMime'      : 'Iskanje po vhodni vrsti MIME', // from v2.1 added 22.5.2015
			'owner'           : 'Lastnik', // from v2.1 added 20.6.2015
			'group'           : 'Skupina', // from v2.1 added 20.6.2015
			'other'           : 'Drugo', // from v2.1 added 20.6.2015
			'execute'         : 'Izvedite', // from v2.1 added 20.6.2015
			'perm'            : 'dovoljenje', // from v2.1 added 20.6.2015
			'mode'            : 'način', // from v2.1 added 20.6.2015
			'emptyFolder'     : 'Mapa je prazna', // from v2.1.6 added 30.12.2015
			'emptyFolderDrop' : 'Mapa je prazna\\A Spustite, da dodate elemente', // from v2.1.6 added 30.12.2015
			'emptyFolderLTap' : 'Mapa je prazna\\A Dolg tapnite, da dodate elemente', // from v2.1.6 added 30.12.2015
			'quality'         : 'Kakovost', // from v2.1.6 added 5.1.2016
			'autoSync'        : 'Samodejna sinhronizacija',  // from v2.1.6 added 10.1.2016
			'moveUp'          : 'Pomakni se navzgor',  // from v2.1.6 added 18.1.2016
			'getLink'         : 'Pridobite URL povezavo', // from v2.1.7 added 9.2.2016
			'selectedItems'   : 'Izbrani predmeti (1 $)', // from v2.1.7 added 2.19.2016
			'folderId'        : 'ID mape', // from v2.1.10 added 3.25.2016
			'offlineAccess'   : 'Dovoli dostop brez povezave', // from v2.1.10 added 3.25.2016
			'reAuth'          : 'Za ponovno avtentikacijo', // from v2.1.10 added 3.25.2016
			'nowLoading'      : 'Zdaj se nalaga ...', // from v2.1.12 added 4.26.2016
			'openMulti'       : 'Odprite več datotek', // from v2.1.12 added 5.14.2016
			'openMultiConfirm': 'Poskušate odpreti datoteke $1. Ali ste prepričani, da želite odpreti v brskalniku?', // from v2.1.12 added 5.14.2016
			'emptySearch'     : 'Rezultati iskanja so prazni v iskalnem cilju.', // from v2.1.12 added 5.16.2016
			'editingFile'     : 'Ureja datoteko.', // from v2.1.13 added 6.3.2016
			'hasSelected'     : 'Izbrali ste $1 predmetov.', // from v2.1.13 added 6.3.2016
			'hasClipboard'    : 'V odložišče imate 1 $ elementov.', // from v2.1.13 added 6.3.2016
			'incSearchOnly'   : 'Inkrementalno iskanje je samo iz trenutnega pogleda.', // from v2.1.13 added 6.30.2016
			'reinstate'       : 'Obnovi', // from v2.1.15 added 3.8.2016
			'complete'        : '1 $ dokončan', // from v2.1.15 added 21.8.2016
			'contextmenu'     : 'Kontekstni meni', // from v2.1.15 added 9.9.2016
			'pageTurning'     : 'Obračanje strani', // from v2.1.15 added 10.9.2016
			'volumeRoots'     : 'Volumenske korenine', // from v2.1.16 added 16.9.2016
			'reset'           : 'Ponastaviti', // from v2.1.16 added 1.10.2016
			'bgcolor'         : 'Barva ozadja', // from v2.1.16 added 1.10.2016
			'colorPicker'     : 'Izbirnik barv', // from v2.1.16 added 1.10.2016
			'8pxgrid'         : 'Mreža 8px', // from v2.1.16 added 4.10.2016
			'enabled'         : 'Omogočeno', // from v2.1.16 added 4.10.2016
			'disabled'        : 'Onemogočeno', // from v2.1.16 added 4.10.2016
			'emptyIncSearch'  : 'Rezultati iskanja so prazni v trenutnem pogledu.\\APritisnite [Enter], da razširite cilj iskanja.', // from v2.1.16 added 5.10.2016
			'emptyLetSearch'  : 'Search results is empty in current view.\\APress [Enter] to expand search target.', // from v2.1.23 added 24.3.2017
			'textLabel'       : 'Besedilna oznaka', // from v2.1.17 added 13.10.2016
			'minsLeft'        : 'Še 1 min', // from v2.1.17 added 13.11.2016
			'openAsEncoding'  : 'Ponovno odprite z izbranim kodiranjem', // from v2.1.19 added 2.12.2016
			'saveAsEncoding'  : 'Shrani z izbranim kodiranjem', // from v2.1.19 added 2.12.2016
			'selectFolder'    : 'Izberite mapo', // from v2.1.20 added 13.12.2016
			'firstLetterSearch': 'Iskanje prve črke', // from v2.1.23 added 24.3.2017
			'presets'         : 'Prednastavitve', // from v2.1.25 added 26.5.2017
			'tooManyToTrash'  : 'Preveč je predmetov, tako da ne gre v smeti.', // from v2.1.25 added 9.6.2017
			'TextArea'        : 'TextArea', // from v2.1.25 added 14.6.2017
			'folderToEmpty'   : 'Izpraznite mapo "$1".', // from v2.1.25 added 22.6.2017
			'filderIsEmpty'   : 'V mapi "$1" ni elementov.', // from v2.1.25 added 22.6.2017
			'preference'      : 'Prednost', // from v2.1.26 added 28.6.2017
			'language'        : 'Jezik', // from v2.1.26 added 28.6.2017
			'clearBrowserData': 'Inicializirajte nastavitve, shranjene v tem brskalniku', // from v2.1.26 added 28.6.2017
			'toolbarPref'     : 'Nastavitve orodne vrstice', // from v2.1.27 added 2.8.2017
			'charsLeft'       : '... ostane 1 znak.',  // from v2.1.29 added 30.8.2017
			'linesLeft'       : '... še $1 vrstice.',  // from v2.1.52 added 16.1.2020
			'sum'             : 'vsota', // from v2.1.29 added 28.9.2017
			'roughFileSize'   : 'Približna velikost datoteke', // from v2.1.30 added 2.11.2017
			'autoFocusDialog' : 'Osredotočite se na element pogovornega okna s pomikom miške',  // from v2.1.30 added 2.11.2017
			'select'          : 'Izberite', // from v2.1.30 added 23.11.2017
			'selectAction'    : 'Dejanje ob izbiri datoteke', // from v2.1.30 added 23.11.2017
			'useStoredEditor' : 'Odprite z nazadnje uporabljenim urejevalnikom', // from v2.1.30 added 23.11.2017
			'selectinvert'    : 'Obrni izbor', // from v2.1.30 added 25.11.2017
			'renameMultiple'  : 'Ali ste prepričani, da želite preimenovati izbrane elemente $1, kot je $2?<br/>Tega ni mogoče razveljaviti!', // from v2.1.31 added 4.12.2017
			'batchRename'     : 'Paketno preimenovanje', // from v2.1.31 added 8.12.2017
			'plusNumber'      : '+ Številka', // from v2.1.31 added 8.12.2017
			'asPrefix'        : 'Dodajte predpono', // from v2.1.31 added 8.12.2017
			'asSuffix'        : 'Dodajte pripono', // from v2.1.31 added 8.12.2017
			'changeExtention' : 'Spremeni razširitev', // from v2.1.31 added 8.12.2017
			'columnPref'      : 'Nastavitve stolpcev (pogled seznama)', // from v2.1.32 added 6.2.2018
			'reflectOnImmediate' : 'Vse spremembe se bodo takoj odrazile v arhivu.', // from v2.1.33 added 2.3.2018
			'reflectOnUnmount'   : 'Vse spremembe se ne bodo odrazile, dokler ne odklopite tega nosilca.', // from v2.1.33 added 2.3.2018
			'unmountChildren' : 'Naslednji nosilci, nameščeni na ta nosilec, so se prav tako odklopili. Ali ste prepričani, da ga boste odklopili?', // from v2.1.33 added 5.3.2018
			'selectionInfo'   : 'Informacije o izbiri', // from v2.1.33 added 7.3.2018
			'hashChecker'     : 'Algoritmi za prikaz hash datoteke', // from v2.1.33 added 10.3.2018
			'infoItems'       : 'Informacijski elementi (informacijska plošča za izbor)', // from v2.1.38 added 28.3.2018
			'pressAgainToExit': 'Ponovno pritisnite za izhod.', // from v2.1.38 added 1.4.2018
			'toolbar'         : 'Orodna vrstica', // from v2.1.38 added 4.4.2018
			'workspace'       : 'Delovni prostor', // from v2.1.38 added 4.4.2018
			'dialog'          : 'Dialog', // from v2.1.38 added 4.4.2018
			'all'             : 'vse', // from v2.1.38 added 4.4.2018
			'iconSize'        : 'Velikost ikone (pogled ikon)', // from v2.1.39 added 7.5.2018
			'editorMaximized' : 'Odprite okno povečanega urejevalnika', // from v2.1.40 added 30.6.2018
			'editorConvNoApi' : 'Ker pretvorba prek API-ja trenutno ni na voljo, prosimo pretvorite na spletnem mestu.', //from v2.1.40 added 8.7.2018
			'editorConvNeedUpload' : 'Po pretvorbi morate biti naloženi z URL-jem elementa ali preneseno datoteko, da shranite pretvorjeno datoteko.', //from v2.1.40 added 8.7.2018
			'convertOn'       : 'Pretvarjanje na spletnem mestu $1', // from v2.1.40 added 10.7.2018
			'integrations'    : 'Integracije', // from v2.1.40 added 11.7.2018
			'integrationWith' : 'Ta elFinder ima vgrajene naslednje zunanje storitve. Pred uporabo preverite pogoje uporabe, politiko zasebnosti itd.', // from v2.1.40 added 11.7.2018
			'showHidden'      : 'Pokaži skrite predmete', // from v2.1.41 added 24.7.2018
			'hideHidden'      : 'Skrij skrite predmete', // from v2.1.41 added 24.7.2018
			'toggleHidden'    : 'Pokaži/skrij skrite predmete', // from v2.1.41 added 24.7.2018
			'makefileTypes'   : 'Vrste datotek, ki jih želite omogočiti z "Nova datoteka"', // from v2.1.41 added 7.8.2018
			'typeOfTextfile'  : 'Vrsta besedilne datoteke', // from v2.1.41 added 7.8.2018
			'add'             : 'Dodaj', // from v2.1.41 added 7.8.2018
			'theme'           : 'Tema', // from v2.1.43 added 19.10.2018
			'default'         : 'Privzeto', // from v2.1.43 added 19.10.2018
			'description'     : 'Opis', // from v2.1.43 added 19.10.2018
			'website'         : 'Spletna stran', // from v2.1.43 added 19.10.2018
			'author'          : 'Avtor', // from v2.1.43 added 19.10.2018
			'email'           : 'E-naslov', // from v2.1.43 added 19.10.2018
			'license'         : 'Licenca', // from v2.1.43 added 19.10.2018
			'exportToSave'    : 'Tega predmeta ni mogoče shraniti. Da ne bi izgubili popravkov, jih morate izvoziti v računalnik.', // from v2.1.44 added 1.12.2018
			'dblclickToSelect': 'Dvokliknite datoteko, da jo izberete.', // from v2.1.47 added 22.1.2019
			'useFullscreen'   : 'Uporabite celozaslonski način', // from v2.1.47 added 19.2.2019

			/********************************** mimetypes **********************************/
			'kindUnknown'     : 'Neznan',
			'kindRoot'        : 'Korenski nosilec', // from v2.1.16 added 16.10.2016
			'kindFolder'      : 'Mapa',
			'kindSelects'     : 'Izbori', // from v2.1.29 added 29.8.2017
			'kindAlias'       : 'Sopomenka (alias)',
			'kindAliasBroken' : 'Nedelujoča sopomenka (alias)',
			// applications
			'kindApp'         : 'Program',
			'kindPostscript'  : 'Postscript dokument',
			'kindMsOffice'    : 'Microsoft Office dokument',
			'kindMsWord'      : 'Microsoft Word dokument',
			'kindMsExcel'     : 'Microsoft Excel dokument',
			'kindMsPP'        : 'Microsoft Powerpoint predstavitev',
			'kindOO'          : 'Open Office dokument',
			'kindAppFlash'    : 'Flash program',
			'kindPDF'         : 'Prenosni format dokumenta (PDF)',
			'kindTorrent'     : 'Bittorrent datoteka',
			'kind7z'          : '7z arhiv',
			'kindTAR'         : 'TAR arhiv',
			'kindGZIP'        : 'GZIP arhiv',
			'kindBZIP'        : 'BZIP arhiv',
			'kindXZ'          : 'XZ arhiv',
			'kindZIP'         : 'ZIP arhiv',
			'kindRAR'         : 'RAR arhiv',
			'kindJAR'         : 'Java JAR datoteka',
			'kindTTF'         : 'Pisava True Type',
			'kindOTF'         : 'Odprite pisavo Type',
			'kindRPM'         : 'RPM paket',
			// texts
			'kindText'        : 'Tekst dokument',
			'kindTextPlain'   : 'Samo tekst',
			'kindPHP'         : 'PHP koda',
			'kindCSS'         : 'Cascading style sheet (CSS)',
			'kindHTML'        : 'HTML dokument',
			'kindJS'          : 'Javascript koda',
			'kindRTF'         : 'Rich Text Format (RTF)',
			'kindC'           : 'C koda',
			'kindCHeader'     : 'C header koda',
			'kindCPP'         : 'C++ koda',
			'kindCPPHeader'   : 'C++ header koda',
			'kindShell'       : 'Unix shell skripta',
			'kindPython'      : 'Python kdoa',
			'kindJava'        : 'Java koda',
			'kindRuby'        : 'Ruby koda',
			'kindPerl'        : 'Perl skripta',
			'kindSQL'         : 'SQL koda',
			'kindXML'         : 'XML dokument',
			'kindAWK'         : 'AWK koda',
			'kindCSV'         : 'Besedilo ločeno z vejico (CSV)',
			'kindDOCBOOK'     : 'Docbook XML dokument',
			'kindMarkdown'    : 'Besedilo za znižanje vrednosti', // added 20.7.2015
			// images
			'kindImage'       : 'Slika',
			'kindBMP'         : 'BMP slika',
			'kindJPEG'        : 'JPEG slika',
			'kindGIF'         : 'GIF slika',
			'kindPNG'         : 'PNG slika',
			'kindTIFF'        : 'TIFF slika',
			'kindTGA'         : 'TGA slika',
			'kindPSD'         : 'Adobe Photoshop slika',
			'kindXBITMAP'     : 'X bitmap slika',
			'kindPXM'         : 'Pixelmator slika',
			// media
			'kindAudio'       : 'Avdio medija',
			'kindAudioMPEG'   : 'MPEG zvok',
			'kindAudioMPEG4'  : 'MPEG-4 zvok',
			'kindAudioMIDI'   : 'MIDI zvok',
			'kindAudioOGG'    : 'Ogg Vorbis zvok',
			'kindAudioWAV'    : 'WAV zvok',
			'AudioPlaylist'   : 'MP3 seznam',
			'kindVideo'       : 'Video medija',
			'kindVideoDV'     : 'DV film',
			'kindVideoMPEG'   : 'MPEG film',
			'kindVideoMPEG4'  : 'MPEG-4 film',
			'kindVideoAVI'    : 'AVI film',
			'kindVideoMOV'    : 'Quick Time film',
			'kindVideoWM'     : 'Windows Media film',
			'kindVideoFlash'  : 'Flash film',
			'kindVideoMKV'    : 'Matroska film',
			'kindVideoOGG'    : 'Ogg film'
		}
	};
}));

js/i18n/elfinder.el.js000064400000132363151215013360010471 0ustar00/**
 * Ελληνικά translation
 * @author yawd <ingo@yawd.eu>
 * @version 2022-02-28
 */
 (function(root, factory) {
	if (typeof define === 'function' && define.amd) {
		define(['elfinder'], factory);
	} else if (typeof exports !== 'undefined') {
		module.exports = factory(require('elfinder'));
	} else {
		factory(root.elFinder);
	}
}(this, function(elFinder) {
	elFinder.prototype.i18.el = {
		translator : 'yawd &lt;ingo@yawd.eu&gt;',
		language   : 'Ελληνικά',
		direction  : 'ltr',
		dateFormat : 'd.m.Y H:i', // will show like: 28.02.2022 15:23
		fancyDateFormat : '$1 H:i', // will show like: Σήμερα 15:23
		nonameDateFormat : 'ymd-His', // noname upload will show like: 220228-152317
		messages   : {
			'getShareText' : 'Μερίδιο',
			'Editor ': 'Επεξεργαστής κώδικα',
			/********************************** errors **********************************/
			'error'                : 'Πρόβλημα',
			'errUnknown'           : 'Άγνωστο πρόβλημα.',
			'errUnknownCmd'        : 'Άγνωστη εντολή.',
			'errJqui'              : 'Μη έγκυρη ρύθμιση του jQuery UI. Τα components "selectable", "draggable" και "droppable" πρέπει να περιληφούν.',
			'errNode'              : 'το elFinder χρειάζεται να έχει δημιουργηθεί το DOM Element.',
			'errURL'               : 'Μη έγκυρες ρυθμίσεις για το elFinder! η επιλογή URL δεν έχει οριστεί.',
			'errAccess'            : 'Απαγορεύεται η πρόσβαση.',
			'errConnect'           : 'Δεν ήταν δυνατή η σύνδεση με το backend.',
			'errAbort'             : 'Η σύνδεση εγκαταλείφθηκε.',
			'errTimeout'           : 'Η σύνδεση έληξε.',
			'errNotFound'          : 'Δε βρέθηκε το backend.',
			'errResponse'          : 'Μή έγκυρη απάντηση από το backend.',
			'errConf'              : 'Μη έγκυρες ρυθμίσεις για το backend.',
			'errJSON'              : 'Το PHP JSON module δεν είναι εγκατεστημένο.',
			'errNoVolumes'         : 'Δεν βρέθηκαν αναγνώσιμα volumes.',
			'errCmdParams'         : 'Μη έγκυρες παράμετροι για την εντολή "$1".',
			'errDataNotJSON'       : 'Τα δεδομένα δεν είναι JSON.',
			'errDataEmpty'         : 'Τα δεδομένα είναι άδεια.',
			'errCmdReq'            : 'Το Backend request χρειάζεται όνομα εντολής.',
			'errOpen'              : 'Δεν ήταν δυνατό να ανοίξει το "$1".',
			'errNotFolder'         : 'Το αντικείμενο δεν είναι φάκελος.',
			'errNotFile'           : 'Το αντικείμενο δεν είναι αρχείο.',
			'errRead'              : 'Δεν ήταν δυνατόν να διαβαστεί το "$1".',
			'errWrite'             : 'Δεν ήταν δυνατή η εγγραφή στο "$1".',
			'errPerm'              : 'Απαγορεύεται η πρόσβαση.',
			'errLocked'            : '"$1" είναι κλειδωμένο και δεν μπορεί να μετονομαστεί, μετακινηθεί ή διαγραφεί.',
			'errExists'            : 'Το αρχείο με όνομα "$1" υπάρχει ήδη.',
			'errInvName'           : 'Μη έγκυρο όνομα αρχείου.',
			'errInvDirname'        : 'Μη έγκυρο όνομα φακέλου.',  // from v2.1.24 added 12.4.2017
			'errFolderNotFound'    : 'Ο φάκελος δε βρέθηκε.',
			'errFileNotFound'      : 'Το αρχείο δε βρέθηκε.',
			'errTrgFolderNotFound' : 'Ο φάκελος "$1" δε βρέθηκε.',
			'errPopup'             : 'Το πρόγραμμα πλήγησης εμπόδισε το άνοιγμα αναδυόμενου παραθύρου. Για ανοίξετε το αρχείο ενεργοποιήστε το στις επιλογές του περιηγητή.',
			'errMkdir'             : 'Η δυμιουργία του φακέλου "$1" δεν ήταν δυνατή.',
			'errMkfile'            : 'Η δημιουργία του αρχείου "$1" δεν ήταν δυνατή.',
			'errRename'            : 'Η μετονομασία του αρχείου "$1" δεν ήταν δυνατή.',
			'errCopyFrom'          : 'Δεν επιτρέπεται η αντιγραφή αρχείων από το volume "$1".',
			'errCopyTo'            : 'Δεν επιτρέπεται η αντιγραφή αρχείων στο volume "$1".',
			'errMkOutLink'         : 'Δεν είναι δυνατή η δημιουργία συνδέσμου προς έξω από τη ρίζα του τόμου.', // from v2.1 added 03.10.2015
			'errUpload'            : 'Πρόβλημα κατά το upload.',  // old name - errUploadCommon
			'errUploadFile'        : 'Το αρχείο "$1" δεν μπόρεσε να γίνει upload.', // old name - errUpload
			'errUploadNoFiles'     : 'Δεν βρέθηκαν αρχεία για upload.',
			'errUploadTotalSize'   : 'Τα δεδομένα υπερβαίνουν το επιτρεπόμενο μέγιστο μέγεθος δεδομένων.', // old name - errMaxSize
			'errUploadFileSize'    : 'Το αρχείο υπερβαίνει το επιτρεπόμενο μέγιστο μέγεθος.', //  old name - errFileMaxSize
			'errUploadMime'        : 'Ο τύπος αρχείου δεν επιτρέπεται.',
			'errUploadTransfer'    : 'Πρόβλημα μεταφοράς για το "$1".',
			'errUploadTemp'        : 'Δεν είναι δυνατή η δημιουργία προσωρινού αρχείου για μεταφόρτωση.', // from v2.1 added 26.09.2015
			'errNotReplace'        : 'Το αντικείμενο "$1" υπάρχει ήδη σε αυτήν τη θέση και δεν μπορεί να αντικατασταθεί από αντικείμενο με άλλο τύπο.', // new
			'errReplace'           : 'Δεν είναι δυνατή η αντικατάσταση του "$1".',
			'errSave'              : 'Το "$1" δεν ήταν δυνατόν να αποθηκευτεί.',
			'errCopy'              : 'Δεν ήταν δυνατή η αντιγραφή του "$1".',
			'errMove'              : 'Δεν ήταν δυνατή η μετακίνηση του "$1".',
			'errCopyInItself'      : 'Δεν είναι δυνατή η αντιγραφή του "$1" στον εαυτό του.',
			'errRm'                : 'Δεν ήταν δυνατή η αφαίρεση του "$1".',
			'errTrash'             : 'Δεν είναι δυνατή η είσοδος στα σκουπίδια.', // from v2.1.24 added 30.4.2017
			'errRmSrc'             : 'Δεν είναι δυνατή η κατάργηση των αρχείων προέλευσης.',
			'errExtract'           : 'Δεν ήταν δυνατή η ανάγνωση των αρχείων από "$1".',
			'errArchive'           : 'Δεν ήταν δυνατή η δημιουργία του αρχείου.',
			'errArcType'           : 'Ο τύπος αρχείου δεν υποστηρίζεται.',
			'errNoArchive'         : 'Το αρχείο δεν είναι έγκυρο ή δεν υποστηρίζεται ο τύπος του.',
			'errCmdNoSupport'      : 'Το backend δεν υποστηρίζει αυτή την εντολή.',
			'errReplByChild'       : 'Ο φάκελος “$1” δεν μπορεί να αντικατασταθεί από οποιοδήποτε αρχείο περιέχεται σε αυτόν.',
			'errArcSymlinks'       : 'Για λόγους ασφαλείας δεν είναι δυνατόν να διαβαστούν αρχεία που περιέχουν symlinks orη αρχεία με μη επιτρεπτά ονόματα.', // edited 24.06.2012
			'errArcMaxSize'        : 'Το μέγεθος του αρχείου υπερβαίνει το μέγιστο επιτρεπτό όριο.',
			'errResize'            : 'Δεν ήταν δυνατή η αλλαγή μεγέθους του "$1".',
			'errResizeDegree'      : 'Μη έγκυρος βαθμός περιστροφής.',  // added 7.3.2013
			'errResizeRotate'      : 'Δεν είναι δυνατή η περιστροφή της εικόνας.',  // added 7.3.2013
			'errResizeSize'        : 'Μη έγκυρο μέγεθος εικόνας.',  // added 7.3.2013
			'errResizeNoChange'    : 'Το μέγεθος της εικόνας δεν άλλαξε.',  // added 7.3.2013
			'errUsupportType'      : 'Ο τύπος αρχείου δεν υποστηρίζεται.',
			'errNotUTF8Content'    : 'Το αρχείο "$1" δεν είναι UTF-8 και δεν μπορεί να επεξεργασθεί.',  // added 9.11.2011
			'errNetMount'          : 'Δεν ήταν δυνατή η φόρτωση του "$1".', // added 17.04.2012
			'errNetMountNoDriver'  : 'Μη υποστηριζόμενο πρωτόκολο.',     // added 17.04.2012
			'errNetMountFailed'    : 'Η φόρτωση απέτυχε.',         // added 17.04.2012
			'errNetMountHostReq'   : 'Απαιτείται host εξυπηρετητής.', // added 18.04.2012
			'errSessionExpires'    : 'Η συνεδρία σας έχει λήξει λόγω αδράνειας.',
			'errCreatingTempDir'   : 'Δεν είναι δυνατή η δημιουργία προσωρινού καταλόγου: "$1"',
			'errFtpDownloadFile'   : 'Δεν είναι δυνατή η λήψη του αρχείου από το FTP: "$1"',
			'errFtpUploadFile'     : 'Δεν είναι δυνατή η μεταφόρτωση του αρχείου στο FTP: "$1"',
			'errFtpMkdir'          : 'Δεν είναι δυνατή η δημιουργία απομακρυσμένου καταλόγου στο FTP: "$1"',
			'errArchiveExec'       : 'Σφάλμα κατά την αρχειοθέτηση αρχείων: "$1"',
			'errExtractExec'       : 'Σφάλμα κατά την εξαγωγή αρχείων: "$1"',
			'errNetUnMount'        : 'Δεν είναι δυνατή η αποπροσάρτηση.', // from v2.1 added 30.04.2012
			'errConvUTF8'          : 'Μη μετατρέψιμο σε UTF-8', // from v2.1 added 08.04.2014
			'errFolderUpload'      : 'Δοκιμάστε το σύγχρονο πρόγραμμα περιήγησης, εάν θέλετε να ανεβάσετε το φάκελο.', // from v2.1 added 26.6.2015
			'errSearchTimeout'     : 'Έληξε το χρονικό όριο κατά την αναζήτηση "$1". Το αποτέλεσμα αναζήτησης είναι μερικό.', // from v2.1 added 12.1.2016
			'errReauthRequire'     : 'Απαιτείται εκ νέου εξουσιοδότηση.', // from v2.1.10 added 24.3.2016
			'errMaxTargets'        : 'Ο μέγιστος αριθμός επιλέξιμων στοιχείων είναι $1.', // from v2.1.17 added 17.10.2016
			'errRestore'           : 'Δεν είναι δυνατή η επαναφορά από τον κάδο απορριμμάτων. Δεν είναι δυνατός ο προσδιορισμός του προορισμού επαναφοράς.', // from v2.1.24 added 3.5.2017
			'errEditorNotFound'    : 'Δεν βρέθηκε πρόγραμμα επεξεργασίας σε αυτόν τον τύπο αρχείου.', // from v2.1.25 added 23.5.2017
			'errServerError'       : 'Παρουσιάστηκε σφάλμα από την πλευρά του διακομιστή.', // from v2.1.25 added 16.6.2017
			'errEmpty'             : 'Δεν είναι δυνατό το άδειασμα του φακέλου "$1".', // from v2.1.25 added 22.6.2017
			'moreErrors'           : 'Υπάρχουν $1 ακόμη σφάλματα.', // from v2.1.44 added 9.12.2018
			'errMaxMkdirs'         : 'Μπορείτε να δημιουργήσετε έως και $1 φακέλους ταυτόχρονα.', // from v2.1.58 added 20.6.2021

			/******************************* commands names ********************************/
			'cmdarchive'   : 'Δημιουργία archive αρχείου',
			'cmdback'      : 'Πίσω',
			'cmdcopy'      : 'Αντιγραφή',
			'cmdcut'       : 'Αφαίρεση',
			'cmddownload'  : 'Μεταφόρτωση',
			'cmdduplicate' : 'Αντίγραφο',
			'cmdedit'      : 'Επεξεργασία αρχείου',
			'cmdextract'   : 'Εξαγωγή αρχείων από archive',
			'cmdforward'   : 'Προώθηση',
			'cmdgetfile'   : 'Επιλέξτε αρχεία',
			'cmdhelp'      : 'Σχετικά με αυτό το λογισμικό',
			'cmdhome'      : 'Home',
			'cmdinfo'      : 'Πληροφορίες',
			'cmdmkdir'     : 'Νέος φάκελος',
			'cmdmkdirin'   : 'Σε Νέο Φάκελο', // from v2.1.7 added 19.2.2016
			'cmdmkfile'    : 'Νέος αρχείο',
			'cmdopen'      : 'Άνοιγμα',
			'cmdpaste'     : 'Επικόλληση',
			'cmdquicklook' : 'Προεπισκόπηση',
			'cmdreload'    : 'Ανανέωση',
			'cmdrename'    : 'Μετονομασία',
			'cmdrm'        : 'Διαγραφή',
			'cmdtrash'     : 'Στα σκουπίδια', //from v2.1.24 added 29.4.2017
			'cmdrestore'   : 'Επαναφέρω', //from v2.1.24 added 3.5.2017
			'cmdsearch'    : 'Έυρεση αρχείων',
			'cmdup'        : 'Μετάβαση στο γονικό φάκελο',
			'cmdupload'    : 'Ανέβασμα αρχείων',
			'cmdview'      : 'Προβολή',
			'cmdresize'    : 'Αλλαγή μεγέθους εικόνας',
			'cmdsort'      : 'Ταξινόμηση',
			'cmdnetmount'  : 'Προσάρτηση όγκου δικτύου', // added 18.04.2012
			'cmdnetunmount': 'Αποπροσάρτηση', // from v2.1 added 30.04.2012
			'cmdplaces'    : 'Προς τοποθεσίες', // added 28.12.2014
			'cmdchmod'     : 'Αλλαγή λειτουργίας', // from v2.1 added 20.6.2015
			'cmdopendir'   : 'Ανοίξτε έναν φάκελο', // from v2.1 added 13.1.2016
			'cmdcolwidth'  : 'Επαναφορά πλάτους στήλης', // from v2.1.13 added 12.06.2016
			'cmdfullscreen': 'ΠΛΗΡΗΣ ΟΘΟΝΗ', // from v2.1.15 added 03.08.2016
			'cmdmove'      : 'Κίνηση', // from v2.1.15 added 21.08.2016
			'cmdempty'     : 'Αδειάστε το φάκελο', // from v2.1.25 added 22.06.2017
			'cmdundo'      : 'Αναίρεση', // from v2.1.27 added 31.07.2017
			'cmdredo'      : 'Κάντε ξανά', // from v2.1.27 added 31.07.2017
			'cmdpreference': 'Προτιμήσεις', // from v2.1.27 added 03.08.2017
			'cmdselectall' : 'Επιλογή όλων', // from v2.1.28 added 15.08.2017
			'cmdselectnone': 'Επιλέξτε κανένα', // from v2.1.28 added 15.08.2017
			'cmdselectinvert': 'Αντιστροφή επιλογής', // from v2.1.28 added 15.08.2017
			'cmdopennew'   : 'Ανοιξε σε νέο παράθυρο', // from v2.1.38 added 3.4.2018
			'cmdhide'      : 'Απόκρυψη (Προτίμηση)', // from v2.1.41 added 24.7.2018

			/*********************************** buttons ***********************************/
			'btnClose'  : 'Κλείσιμο',
			'btnSave'   : 'Αποθήκευση',
			'btnRm'     : 'Αφαίρεση',
			'btnApply'  : 'Εφαρμογή',
			'btnCancel' : 'Ακύρωση',
			'btnNo'     : 'Όχι',
			'btnYes'    : 'Ναι',
			'btnMount'  : 'Mount',  // added 18.04.2012
			'btnApprove': 'Μεταβείτε στο $1 και εγκρίνετε', // from v2.1 added 26.04.2012
			'btnUnmount': 'Αποπροσάρτηση', // from v2.1 added 30.04.2012
			'btnConv'   : 'Μετατρέπω', // from v2.1 added 08.04.2014
			'btnCwd'    : 'Εδώ',      // from v2.1 added 22.5.2015
			'btnVolume' : 'Ογκος',    // from v2.1 added 22.5.2015
			'btnAll'    : 'Ολα',       // from v2.1 added 22.5.2015
			'btnMime'   : 'Τύπος MIME', // from v2.1 added 22.5.2015
			'btnFileName':'Ονομα αρχείου',  // from v2.1 added 22.5.2015
			'btnSaveClose': 'Αποθήκευση & Κλείσιμο', // from v2.1 added 12.6.2015
			'btnBackup' : 'Αντιγράφων ασφαλείας', // fromv2.1 added 28.11.2015
			'btnRename'    : 'Μετονομάζω',      // from v2.1.24 added 6.4.2017
			'btnRenameAll' : 'Μετονομασία (Όλα)', // from v2.1.24 added 6.4.2017
			'btnPrevious' : 'Προηγ ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnNext'     : 'Επόμενο ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnSaveAs'   : 'Αποθήκευση ως', // from v2.1.25 added 24.5.2017

			/******************************** notifications ********************************/
			'ntfopen'     : 'Άνοιγμα φακέλου',
			'ntffile'     : 'Άνοιγμα αρχείου',
			'ntfreload'   : 'Ανανέωση περιεχομένων φακέλου',
			'ntfmkdir'    : 'Δημιουργία φακέλου',
			'ntfmkfile'   : 'Δημιουργία αρχείων',
			'ntfrm'       : 'Διαγραφή αρχείων',
			'ntfcopy'     : 'Αντιγραφή αρχείων',
			'ntfmove'     : 'Μετακίνηση αρχείων',
			'ntfprepare'  : 'Προετοιμασία αντιγραφής αρχείων',
			'ntfrename'   : 'Μετονομασία αρχείων',
			'ntfupload'   : 'Ανέβασμα αρχείων',
			'ntfdownload' : 'Μεταφόρτωση αρχείων',
			'ntfsave'     : 'Αποθήκευση αρχείων',
			'ntfarchive'  : 'Δημιουργία αρχείου',
			'ntfextract'  : 'Εξαγωγή αρχείων από το archive',
			'ntfsearch'   : 'Αναζήτηση αρχείων',
			'ntfresize'   : 'Αλλαγή μεγέθους εικόνων',
			'ntfsmth'     : 'Σύστημα απασχολημένο>_<',
			'ntfloadimg'  : 'Φόρτωση εικόνας',
			'ntfnetmount' : 'Φόρτωση δικτυακού δίσκου', // added 18.04.2012
			'ntfnetunmount': 'Αποπροσάρτηση όγκου δικτύου', // from v2.1 added 30.04.2012
			'ntfdim'      : 'Απόκτηση διάστασης εικόνας', // added 20.05.2013
			'ntfreaddir'  : 'Ανάγνωση πληροφοριών φακέλου', // from v2.1 added 01.07.2013
			'ntfurl'      : 'Λήψη διεύθυνσης URL του συνδέσμου', // from v2.1 added 11.03.2014
			'ntfchmod'    : 'Αλλαγή λειτουργίας αρχείου', // from v2.1 added 20.6.2015
			'ntfpreupload': 'Επαλήθευση ονόματος αρχείου μεταφόρτωσης', // from v2.1 added 31.11.2015
			'ntfzipdl'    : 'Δημιουργία αρχείου για λήψη', // from v2.1.7 added 23.1.2016
			'ntfparents'  : 'Λήψη πληροφοριών διαδρομής', // from v2.1.17 added 2.11.2016
			'ntfchunkmerge': 'Επεξεργασία του μεταφορτωμένου αρχείου', // from v2.1.17 added 2.11.2016
			'ntftrash'    : 'Πετάξτε στα σκουπίδια', // from v2.1.24 added 2.5.2017
			'ntfrestore'  : 'Κάνω επαναφορά από τα σκουπίδια', // from v2.1.24 added 3.5.2017
			'ntfchkdir'   : 'Έλεγχος φακέλου προορισμού', // from v2.1.24 added 3.5.2017
			'ntfundo'     : 'Αναίρεση προηγούμενης λειτουργίας', // from v2.1.27 added 31.07.2017
			'ntfredo'     : 'Επανάληψη της προηγούμενης αναίρεσης', // from v2.1.27 added 31.07.2017
			'ntfchkcontent' : 'Έλεγχος περιεχομένου', // from v2.1.41 added 3.8.2018

			/*********************************** volumes *********************************/
			'volume_Trash' : 'Σκουπίδια', //from v2.1.24 added 29.4.2017

			/************************************ dates **********************************/
			'dateUnknown' : 'άγνωστο',
			'Today'       : 'Σήμερα',
			'Yesterday'   : 'Χθές',
			'msJan'       : 'Ιαν',
			'msFeb'       : 'Φεβ',
			'msMar'       : 'Μαρ',
			'msApr'       : 'Απρ',
			'msMay'       : 'Μαϊ',
			'msJun'       : 'Ιουν',
			'msJul'       : 'Ιουλ',
			'msAug'       : 'Αυγ',
			'msSep'       : 'Σεπ',
			'msOct'       : 'Οκτ',
			'msNov'       : 'Νοεμ',
			'msDec'       : 'Δεκ',
			'January'     : 'Ιανουάριος',
			'February'    : 'Φεβρουάριος',
			'March'       : 'Μάρτιος',
			'April'       : 'Απρίλιος',
			'May'         : 'Μάϊος',
			'June'        : 'Ιούνιος',
			'July'        : 'Ιούλιος',
			'August'      : 'Αύγουστος',
			'September'   : 'Σεπτέμβριος',
			'October'     : 'Οκτώβριος',
			'November'    : 'Νοέμβριος',
			'December'    : 'Δεκέμβριος',
			'Sunday'      : 'Κυριακή',
			'Monday'      : 'Δευτέρα',
			'Tuesday'     : 'Τρίτη',
			'Wednesday'   : 'Τετάρτη',
			'Thursday'    : 'Πέμπτη',
			'Friday'      : 'Παρασκευή',
			'Saturday'    : 'Σάββατο',
			'Sun'         : 'Κυρ',
			'Mon'         : 'Δευ',
			'Tue'         : 'Τρ',
			'Wed'         : 'Τετ',
			'Thu'         : 'Πεμ',
			'Fri'         : 'Παρ',
			'Sat'         : 'Σαβ',

			/******************************** sort variants ********************************/
			'sortname'          : 'κατά όνομα',
			'sortkind'          : 'κατά είδος',
			'sortsize'          : 'κατά μέγεθος',
			'sortdate'          : 'κατά ημερομηνία',
			'sortFoldersFirst'  : 'Πρώτα οι φάκελοι',
			'sortperm'          : 'με άδεια', // from v2.1.13 added 13.06.2016
			'sortmode'          : 'κατά τρόπο λειτουργίας',       // from v2.1.13 added 13.06.2016
			'sortowner'         : 'από τον ιδιοκτήτη',      // from v2.1.13 added 13.06.2016
			'sortgroup'         : 'ανά ομάδα',      // from v2.1.13 added 13.06.2016
			'sortAlsoTreeview'  : 'Επίσης το Treeview',  // from v2.1.15 added 01.08.2016

			/********************************** new items **********************************/
			'untitled file.txt' : 'Νέο αρχείο.txt', // added 10.11.2015
			'untitled folder'   : 'Νέος φάκελος',   // added 10.11.2015
			'Archive'           : 'ΝέοΑρχείο',  // from v2.1 added 10.11.2015
			'untitled file'     : 'Νέο αρχείο.$1',  // from v2.1.41 added 6.8.2018
			'extentionfile'     : '$1: Αρχείο',    // from v2.1.41 added 6.8.2018
			'extentiontype'     : '$1: $2',      // from v2.1.43 added 17.10.2018

			/********************************** messages **********************************/
			'confirmReq'      : 'Απαιτείται επιβεβαίωση',
			'confirmRm'       : 'Είστε σίγουροι πως θέλετε να διαγράψετε τα αρχεία?<br/>Οι αλλαγές θα είναι μόνιμες!',
			'confirmRepl'     : 'Αντικατάσταση του παλιού αρχείου με το νέο?',
			'confirmRest'     : 'Αντικατάσταση υπάρχοντος στοιχείου με το στοιχείο στον κάδο απορριμμάτων;', // fromv2.1.24 added 5.5.2017
			'confirmConvUTF8' : 'Δεν υπάρχει στο UTF-8<br/>Μετατροπή σε UTF-8;<br/>Τα περιεχόμενα γίνονται UTF-8 με αποθήκευση μετά τη μετατροπή.', // from v2.1 added 08.04.2014
			'confirmNonUTF8'  : 'Δεν ήταν δυνατός ο εντοπισμός της κωδικοποίησης χαρακτήρων αυτού του αρχείου. Πρέπει να μετατραπεί προσωρινά σε UTF-8 για επεξεργασία.<br/>Επιλέξτε την κωδικοποίηση χαρακτήρων αυτού του αρχείου.', // from v2.1.19 added 28.11.2016
			'confirmNotSave'  : 'Έχει τροποποιηθεί.<br/>Χάνεται η εργασία εάν δεν αποθηκεύσετε τις αλλαγές.', // from v2.1 added 15.7.2015
			'confirmTrash'    : 'Είστε βέβαιοι ότι θέλετε να μετακινήσετε αντικείμενα στον κάδο απορριμμάτων;', //from v2.1.24 added 29.4.2017
			'confirmMove'     : 'Είστε βέβαιοι ότι θέλετε να μετακινήσετε στοιχεία στο "$1";', //from v2.1.50 added 27.7.2019
			'apllyAll'        : 'Εφαρμογή σε όλα',
			'name'            : 'Όνομα',
			'size'            : 'Μέγεθος',
			'perms'           : 'Δικαιώματα',
			'modify'          : 'Τροποποιήθηκε',
			'kind'            : 'Είδος',
			'read'            : 'ανάγνωση',
			'write'           : 'εγγραφή',
			'noaccess'        : 'δεν υπάρχει πρόσβαση',
			'and'             : 'και',
			'unknown'         : 'άγνωστο',
			'selectall'       : 'Επιλογή όλων',
			'selectfiles'     : 'Επιλογή αρχείων',
			'selectffile'     : 'Επιλογή πρώτου αρχείου',
			'selectlfile'     : 'Επιλογή τελευταίου αρχείου',
			'viewlist'        : 'Προβολή λίστας',
			'viewicons'       : 'Προβολή εικονιδίων',
			'viewSmall'       : 'Μικρά εικονίδια', // from v2.1.39 added 22.5.2018
			'viewMedium'      : 'Μεσαία εικονίδια', // from v2.1.39 added 22.5.2018
			'viewLarge'       : 'Μεγάλα εικονίδια', // from v2.1.39 added 22.5.2018
			'viewExtraLarge'  : 'Πολύ μεγάλα εικονίδια', // from v2.1.39 added 22.5.2018
			'places'          : 'Τοποθεσίες',
			'calc'            : 'Υπολογισμός',
			'path'            : 'Διαδρομή',
			'aliasfor'        : 'Ψευδώνυμο για',
			'locked'          : 'Κλειδωμένο',
			'dim'             : 'Διαστάσεις',
			'files'           : 'Αρχεία',
			'folders'         : 'Φάκελοι',
			'items'           : 'Αντικείμενα',
			'yes'             : 'ναι',
			'no'              : 'όχι',
			'link'            : 'Σύνδεσμος',
			'searcresult'     : 'Αποτελέσματα αναζήτησης',
			'selected'        : 'επιλεγμένα αντικείμενα',
			'about'           : 'Σχετικά',
			'shortcuts'       : 'Συντομεύσεις',
			'help'            : 'Βοήθεια',
			'webfm'           : 'εργαλείο διαχείρισης αρχείων από το web',
			'ver'             : 'Έκδοση',
			'protocolver'     : 'έκδοση πρωτοκόλλου',
			'homepage'        : 'Σελίδα του project',
			'docs'            : 'Τεκμηρίωση (documentation)',
			'github'          : 'Κάντε μας fork στο Github',
			'twitter'         : 'Ακολουθήστε μας στο twitter',
			'facebook'        : 'Βρείτε μας στο facebook',
			'team'            : 'Ομάδα',
			'chiefdev'        : 'κύριος προγραμματιστής',
			'developer'       : 'προγραμματιστής',
			'contributor'     : 'συνεισφορά',
			'maintainer'      : 'συντηρητής',
			'translator'      : 'μεταφραστής',
			'icons'           : 'Εικονίδια',
			'dontforget'      : 'και μην ξεχάσεις την πετσέτα σου!',
			'shortcutsof'     : 'Οι συντομεύσεις είναι απενεργοποιημένες',
			'dropFiles'       : 'Κάντε drop τα αρχεία εδώ',
			'or'              : 'ή',
			'selectForUpload' : 'Επιλογή αρχείων για ανέβασμα',
			'moveFiles'       : 'Μετακίνηση αρχείων',
			'copyFiles'       : 'Αντιγραφή αρχείων',
			'restoreFiles'    : 'Επαναφέρετε τα στοιχεία', // from v2.1.24 added 5.5.2017
			'rmFromPlaces'    : 'Αντιγραφή από τοποθεσίες',
			'aspectRatio'     : 'Αναλογία διαστάσεων',
			'scale'           : 'Κλίμακα',
			'width'           : 'Πλάτος',
			'height'          : 'Ύψος',
			'resize'          : 'Αλλαγή μεγέθους',
			'crop'            : 'Σοδειά',
			'rotate'          : 'Περιστροφή',
			'rotate-cw'       : 'Περιστροφή κατά 90 βαθμούς CW',
			'rotate-ccw'      : 'Περιστροφή κατά 90 βαθμούς CCW',
			'degree'          : 'Βαθμός',
			'netMountDialogTitle' : 'Φορτώστε δικτυακό δίσκο', // added 18.04.2012
			'protocol'            : 'Πρωτόκολλο', // added 18.04.2012
			'host'                : 'Πλήθος', // added 18.04.2012
			'port'                : 'Λιμάνι', // added 18.04.2012
			'user'                : 'Χρήστης', // added 18.04.2012
			'pass'                : 'Κωδικός', // added 18.04.2012
			'confirmUnmount'      : 'Αποπροσαρτάτε το $1;',  // from v2.1 added 30.04.2012
			'dropFilesBrowser': 'Απόθεση ή επικόλληση αρχείων από το πρόγραμμα περιήγησης', // from v2.1 added 30.05.2012
			'dropPasteFiles'  : 'Απόθεση αρχείων, επικόλληση διευθύνσεων URL ή εικόνων (πρόχειρο) εδώ', // from v2.1 added 07.04.2014
			'encoding'        : 'Κωδικοποίηση', // from v2.1 added 19.12.2014
			'locale'          : 'Μικρός λοβός',   // from v2.1 added 19.12.2014
			'searchTarget'    : 'Στόχος: $1',                // from v2.1 added 22.5.2015
			'searchMime'      : 'Αναζήτηση με βάση τον τύπο MIME', // from v2.1 added 22.5.2015
			'owner'           : 'Ιδιοκτήτης', // from v2.1 added 20.6.2015
			'group'           : 'Ομιλος', // from v2.1 added 20.6.2015
			'other'           : 'Αλλος', // from v2.1 added 20.6.2015
			'execute'         : 'Εκτέλεση', // from v2.1 added 20.6.2015
			'perm'            : 'Αδεια', // from v2.1 added 20.6.2015
			'mode'            : 'Λειτουργία', // from v2.1 added 20.6.2015
			'emptyFolder'     : 'Ο φάκελος είναι κενός', // from v2.1.6 added 30.12.2015
			'emptyFolderDrop' : 'Ο φάκελος είναι κενός\\A Drop για προσθήκη στοιχείων', // from v2.1.6 added 30.12.2015
			'emptyFolderLTap' : 'Ο φάκελος είναι κενός\\Ένα παρατεταμένο πάτημα για προσθήκη στοιχείων', // from v2.1.6 added 30.12.2015
			'quality'         : 'Ποιότητα', // from v2.1.6 added 5.1.2016
			'autoSync'        : 'Αυτόματος συγχρονισμός',  // from v2.1.6 added 10.1.2016
			'moveUp'          : 'Μετακινηθείτε προς τα πάνω',  // from v2.1.6 added 18.1.2016
			'getLink'         : 'Λήψη συνδέσμου URL', // from v2.1.7 added 9.2.2016
			'selectedItems'   : 'Επιλεγμένα στοιχεία ($1)', // from v2.1.7 added 2.19.2016
			'folderId'        : 'Αναγνωριστικό φακέλου', // from v2.1.10 added 3.25.2016
			'offlineAccess'   : 'Να επιτρέπεται η πρόσβαση εκτός σύνδεσης', // from v2.1.10 added 3.25.2016
			'reAuth'          : 'Για εκ νέου έλεγχο ταυτότητας', // from v2.1.10 added 3.25.2016
			'nowLoading'      : 'Φορτώνει...', // from v2.1.12 added 4.26.2016
			'openMulti'       : 'Άνοιγμα πολλών αρχείων', // from v2.1.12 added 5.14.2016
			'openMultiConfirm': 'Προσπαθείτε να ανοίξετε τα αρχεία $1. Είστε βέβαιοι ότι θέλετε να ανοίξετε στο πρόγραμμα περιήγησης;', // from v2.1.12 added 5.14.2016
			'emptySearch'     : 'Τα αποτελέσματα αναζήτησης είναι κενά στον στόχο αναζήτησης.', // from v2.1.12 added 5.16.2016
			'editingFile'     : 'Επεξεργάζεται ένα αρχείο.', // from v2.1.13 added 6.3.2016
			'hasSelected'     : 'Έχετε επιλέξει $1 στοιχεία.', // from v2.1.13 added 6.3.2016
			'hasClipboard'    : 'Έχετε $1 στοιχεία στο πρόχειρο.', // from v2.1.13 added 6.3.2016
			'incSearchOnly'   : 'Η σταδιακή αναζήτηση προέρχεται μόνο από την τρέχουσα προβολή.', // from v2.1.13 added 6.30.2016
			'reinstate'       : 'Εγκαθιστώ πάλι', // from v2.1.15 added 3.8.2016
			'complete'        : '$1 ολοκληρώθηκε', // from v2.1.15 added 21.8.2016
			'contextmenu'     : 'Μενού περιβάλλοντος', // from v2.1.15 added 9.9.2016
			'pageTurning'     : 'Γυρίζοντας σελίδα', // from v2.1.15 added 10.9.2016
			'volumeRoots'     : 'Ρίζες όγκου', // from v2.1.16 added 16.9.2016
			'reset'           : 'Επαναφορά', // from v2.1.16 added 1.10.2016
			'bgcolor'         : 'Χρώμα του φόντου', // from v2.1.16 added 1.10.2016
			'colorPicker'     : 'Επιλογέας χρώματος', // from v2.1.16 added 1.10.2016
			'8pxgrid'         : 'Πλέγμα 8px', // from v2.1.16 added 4.10.2016
			'enabled'         : 'Ενεργοποιήθηκε', // from v2.1.16 added 4.10.2016
			'disabled'        : 'Ενεργοποιήθηκε', // from v2.1.16 added 4.10.2016
			'emptyIncSearch'  : 'Τα αποτελέσματα αναζήτησης είναι κενά στην τρέχουσα προβολή.\\APΠατήστε [Enter] για επέκταση του στόχου αναζήτησης.', // from v2.1.16 added 5.10.2016
			'emptyLetSearch'  : 'Τα αποτελέσματα αναζήτησης πρώτου γράμματος είναι κενά στην τρέχουσα προβολή.', // from v2.1.23 added 24.3.2017
			'textLabel'       : 'Ετικέτα κειμένου', // from v2.1.17 added 13.10.2016
			'minsLeft'        : '$1 λεπτό απομένουν', // from v2.1.17 added 13.11.2016
			'openAsEncoding'  : 'Ανοίξτε ξανά με επιλεγμένη κωδικοποίηση', // from v2.1.19 added 2.12.2016
			'saveAsEncoding'  : 'Αποθήκευση με την επιλεγμένη κωδικοποίηση', // from v2.1.19 added 2.12.2016
			'selectFolder'    : 'Επιλέξτε φάκελο', // from v2.1.20 added 13.12.2016
			'firstLetterSearch': 'Αναζήτηση πρώτου γράμματος', // from v2.1.23 added 24.3.2017
			'presets'         : 'Presets', // from v2.1.25 added 26.5.2017
			'tooManyToTrash'  : 'Είναι πάρα πολλά αντικείμενα, επομένως δεν μπορεί να πάει στα σκουπίδια.', // from v2.1.25 added 9.6.2017
			'TextArea'        : 'Περιοχή κειμένου', // from v2.1.25 added 14.6.2017
			'folderToEmpty'   : 'Αδειάστε το φάκελο "$1".', // from v2.1.25 added 22.6.2017
			'filderIsEmpty'   : 'Δεν υπάρχουν στοιχεία σε ένα φάκελο "$1".', // from v2.1.25 added 22.6.2017
			'preference'      : 'Προτίμηση', // from v2.1.26 added 28.6.2017
			'language'        : 'Γλώσσα', // from v2.1.26 added 28.6.2017
			'clearBrowserData': 'Εκκινήστε τις ρυθμίσεις που είναι αποθηκευμένες σε αυτό το πρόγραμμα περιήγησης', // from v2.1.26 added 28.6.2017
			'toolbarPref'     : 'Ρυθμίσεις γραμμής εργαλείων', // from v2.1.27 added 2.8.2017
			'charsLeft'       : '... $1 χαρακτήρες απομένουν.',  // from v2.1.29 added 30.8.2017
			'linesLeft'       : '... Απομένουν $1 γραμμές.',  // from v2.1.52 added 16.1.2020
			'sum'             : 'Αθροισμα', // from v2.1.29 added 28.9.2017
			'roughFileSize'   : 'Πρόχειρο μέγεθος αρχείου', // from v2.1.30 added 2.11.2017
			'autoFocusDialog' : 'Επικεντρωθείτε στο στοιχείο του διαλόγου με το ποντίκι',  // from v2.1.30 added 2.11.2017
			'select'          : 'Επιλέξτε', // from v2.1.30 added 23.11.2017
			'selectAction'    : 'Ενέργεια κατά την επιλογή αρχείου', // from v2.1.30 added 23.11.2017
			'useStoredEditor' : 'Ανοίξτε με το πρόγραμμα επεξεργασίας που χρησιμοποιήθηκε την τελευταία φορά', // from v2.1.30 added 23.11.2017
			'selectinvert'    : 'Αντιστροφή επιλογής', // from v2.1.30 added 25.11.2017
			'renameMultiple'  : 'Είστε βέβαιοι ότι θέλετε να μετονομάσετε $1 επιλεγμένα στοιχεία όπως $2;<br/>Αυτό δεν μπορεί να αναιρεθεί!', // from v2.1.31 added 4.12.2017
			'batchRename'     : 'Μετονομασία παρτίδας', // from v2.1.31 added 8.12.2017
			'plusNumber'      : '+ Αριθμός', // from v2.1.31 added 8.12.2017
			'asPrefix'        : 'Προσθήκη προθέματος', // from v2.1.31 added 8.12.2017
			'asSuffix'        : 'Προσθέστε επίθημα', // from v2.1.31 added 8.12.2017
			'changeExtention' : 'Αλλάξτε την επέκταση', // from v2.1.31 added 8.12.2017
			'columnPref'      : 'Ρυθμίσεις στηλών (Προβολή λίστας)', // from v2.1.32 added 6.2.2018
			'reflectOnImmediate' : 'Όλες οι αλλαγές θα εμφανιστούν αμέσως στο αρχείο.', // from v2.1.33 added 2.3.2018
			'reflectOnUnmount'   : 'Τυχόν αλλαγές δεν θα αντικατοπτρίζονται μέχρι να καταργήσετε την προσάρτηση αυτού του τόμου.', // from v2.1.33 added 2.3.2018
			'unmountChildren' : 'Οι παρακάτω τόμοι που τοποθετήθηκαν σε αυτόν τον τόμο επίσης αποπροσαρτήθηκαν. Είστε σίγουροι ότι θα το αποπροσαρτήσετε;', // from v2.1.33 added 5.3.2018
			'selectionInfo'   : 'Πληροφορίες επιλογής', // from v2.1.33 added 7.3.2018
			'hashChecker'     : 'Αλγόριθμοι για την εμφάνιση του κατακερματισμού του αρχείου', // from v2.1.33 added 10.3.2018
			'infoItems'       : 'Στοιχεία πληροφοριών (Πίνακας πληροφοριών επιλογής)', // from v2.1.38 added 28.3.2018
			'pressAgainToExit': 'Πατήστε ξανά για έξοδο.', // from v2.1.38 added 1.4.2018
			'toolbar'         : 'Γραμμή εργαλείων', // from v2.1.38 added 4.4.2018
			'workspace'       : 'Χώρος εργασίας', // from v2.1.38 added 4.4.2018
			'dialog'          : 'Διάλογος', // from v2.1.38 added 4.4.2018
			'all'             : 'Ολα', // from v2.1.38 added 4.4.2018
			'iconSize'        : 'Μέγεθος εικονιδίου (Προβολή εικονιδίων)', // from v2.1.39 added 7.5.2018
			'editorMaximized' : 'Ανοίξτε το παράθυρο μεγιστοποιημένου επεξεργαστή', // from v2.1.40 added 30.6.2018
			'editorConvNoApi' : 'Επειδή η μετατροπή μέσω API δεν είναι διαθέσιμη αυτήν τη στιγμή, πραγματοποιήστε μετατροπή στον ιστότοπο.', //from v2.1.40 added 8.7.2018
			'editorConvNeedUpload' : 'Μετά τη μετατροπή, πρέπει να ανεβάσετε με τη διεύθυνση URL του στοιχείου ή ένα αρχείο λήψης για να αποθηκεύσετε το αρχείο που μετατράπηκε.', //from v2.1.40 added 8.7.2018
			'convertOn'       : 'Μετατροπή στον ιστότοπο του $1', // from v2.1.40 added 10.7.2018
			'integrations'    : 'Ενσωματώσεις', // from v2.1.40 added 11.7.2018
			'integrationWith' : 'Αυτό το elFinder έχει ενσωματωμένες τις ακόλουθες εξωτερικές υπηρεσίες. Ελέγξτε τους όρους χρήσης, την πολιτική απορρήτου κ.λπ. πριν το χρησιμοποιήσετε.', // from v2.1.40 added 11.7.2018
			'showHidden'      : 'Εμφάνιση κρυφών στοιχείων', // from v2.1.41 added 24.7.2018
			'hideHidden'      : 'Απόκρυψη κρυφών στοιχείων', // from v2.1.41 added 24.7.2018
			'toggleHidden'    : 'Εμφάνιση/Απόκρυψη κρυφών στοιχείων', // from v2.1.41 added 24.7.2018
			'makefileTypes'   : 'Τύποι αρχείων για ενεργοποίηση με "Νέο αρχείο"', // from v2.1.41 added 7.8.2018
			'typeOfTextfile'  : 'Τύπος αρχείου κειμένου', // from v2.1.41 added 7.8.2018
			'add'             : 'Προσθήκη', // from v2.1.41 added 7.8.2018
			'theme'           : 'Θέμα', // from v2.1.43 added 19.10.2018
			'default'         : 'Προκαθορισμένο', // from v2.1.43 added 19.10.2018
			'description'     : 'Περιγραφή', // from v2.1.43 added 19.10.2018
			'website'         : 'Δικτυακός τόπος', // from v2.1.43 added 19.10.2018
			'author'          : 'Συγγραφέας', // from v2.1.43 added 19.10.2018
			'email'           : 'ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ', // from v2.1.43 added 19.10.2018
			'license'         : 'Δίδω άδεια', // from v2.1.43 added 19.10.2018
			'exportToSave'    : 'Δεν είναι δυνατή η αποθήκευση αυτού του στοιχείου. Για να αποφύγετε την απώλεια των επεξεργασιών που πρέπει να κάνετε εξαγωγή στον υπολογιστή σας.', // from v2.1.44 added 1.12.2018
			'dblclickToSelect': 'Κάντε διπλό κλικ στο αρχείο για να το επιλέξετε.', // from v2.1.47 added 22.1.2019
			'useFullscreen'   : 'Χρησιμοποιήστε τη λειτουργία πλήρους οθόνης', // from v2.1.47 added 19.2.2019

			/********************************** mimetypes **********************************/
			'kindUnknown'     : 'Άγνωστο',
			'kindRoot'        : 'Ρίζα τόμου', // from v2.1.16 added 16.10.2016
			'kindFolder'      : 'Φάκελος',
			'kindSelects'     : 'Επιλογές', // from v2.1.29 added 29.8.2017
			'kindAlias'       : 'Ψευδώνυμο (alias)',
			'kindAliasBroken' : 'Μη έγκυρο ψευδώνυμο',
			// applications
			'kindApp'         : 'Εφαρμογή',
			'kindPostscript'  : 'Έγγραφο Postscript',
			'kindMsOffice'    : 'Έγγραφο Microsoft Office',
			'kindMsWord'      : 'Έγγραφο Microsoft Word',
			'kindMsExcel'     : 'Έγγραφο Microsoft Excel',
			'kindMsPP'        : 'Παρουσίαση Microsoft Powerpoint',
			'kindOO'          : 'Έγγραφο Open Office',
			'kindAppFlash'    : 'Εφαρμογή Flash',
			'kindPDF'         : 'Μορφή φορητού εγγράφου (PDF)',
			'kindTorrent'     : 'Αρχείο Bittorrent',
			'kind7z'          : 'Αρχείο 7z',
			'kindTAR'         : 'Αρχείο TAR',
			'kindGZIP'        : 'Αρχείο GZIP',
			'kindBZIP'        : 'Αρχείο BZIP',
			'kindXZ'          : 'Αρχείο XZ',
			'kindZIP'         : 'Αρχείο ZIP',
			'kindRAR'         : 'Αρχείο RAR',
			'kindJAR'         : 'Αρχείο Java JAR',
			'kindTTF'         : 'Γραμματοσειρά True Type',
			'kindOTF'         : 'Γραμματοσειρά Open Type',
			'kindRPM'         : 'Πακέτο RPM',
			// texts
			'kindText'        : 'Έγγραφο κειμένου',
			'kindTextPlain'   : 'Απλό κείμενο',
			'kindPHP'         : 'Κώδικας PHP',
			'kindCSS'         : 'Φύλλο Cascading Style',
			'kindHTML'        : 'Έγγραφο HTML',
			'kindJS'          : 'Κώδικας Javascript',
			'kindRTF'         : 'Μορφή πλούσιου κειμένου',
			'kindC'           : 'Κώδικας C',
			'kindCHeader'     : 'Κώδικας κεφαλίδας C',
			'kindCPP'         : 'Κώδικας C++',
			'kindCPPHeader'   : 'Κώδικας κεφαλίδας C++',
			'kindShell'       : 'Σενάριο κελύφους Unix',
			'kindPython'      : 'Κώδικας Python',
			'kindJava'        : 'Κώδικας Java',
			'kindRuby'        : 'Κώδικας Ruby',
			'kindPerl'        : 'Σενάριο Perl',
			'kindSQL'         : 'Κώδικας SQL',
			'kindXML'         : 'Έγγραφο XML',
			'kindAWK'         : 'Κώδικας AWK',
			'kindCSV'         : 'Τιμές χωρισμένες με κόμμα',
			'kindDOCBOOK'     : 'Έγγραφο Docbook XML',
			'kindMarkdown'    : 'Markdown κείμενο', // added 20.7.2015
			// images
			'kindImage'       : 'Εικόνα',
			'kindBMP'         : 'Εικόνα BMP',
			'kindJPEG'        : 'Εικόνα JPEG',
			'kindGIF'         : 'Εικόνα GIF',
			'kindPNG'         : 'Εικόνα PNG',
			'kindTIFF'        : 'Εικόνα TIFF',
			'kindTGA'         : 'Εικόνα TGA',
			'kindPSD'         : 'Εικόνα Adobe Photoshop',
			'kindXBITMAP'     : 'Εικόνα X bitmap',
			'kindPXM'         : 'Εικόνα Pixelmator',
			// media
			'kindAudio'       : 'Αρχεία ήχου',
			'kindAudioMPEG'   : 'Ήχος MPEG',
			'kindAudioMPEG4'  : 'Εικόνα MPEG-4',
			'kindAudioMIDI'   : 'Εικόνα MIDI',
			'kindAudioOGG'    : 'Εικόνα Ogg Vorbis',
			'kindAudioWAV'    : 'Εικόνα WAV',
			'AudioPlaylist'   : 'Λίστα αναπαραγωγής MP3',
			'kindVideo'       : 'Αρχεία media',
			'kindVideoDV'     : 'Ταινία DV',
			'kindVideoMPEG'   : 'Ταινία MPEG',
			'kindVideoMPEG4'  : 'Ταινία MPEG-4',
			'kindVideoAVI'    : 'Ταινία AVI',
			'kindVideoMOV'    : 'Ταινία Quick Time',
			'kindVideoWM'     : 'Ταινία Windows Media',
			'kindVideoFlash'  : 'Ταινία flash',
			'kindVideoMKV'    : 'Ταινία matroska',
			'kindVideoOGG'    : 'Ταινία ogg'
		}
	};
}));js/i18n/elfinder.en.js000064400000071750151215013360010475 0ustar00/**
 * English translation
 * @author Troex Nevelin <troex@fury.scancode.ru>
 * @author Naoki Sawada <hypweb+elfinder@gmail.com>
 * @version 2020-01-16
 */
// elfinder.en.js is integrated into elfinder.(full|min).js by jake build
if (typeof elFinder === "function" && elFinder.prototype.i18) {
  elFinder.prototype.i18.en = {
    translator:
      "Troex Nevelin &lt;troex@fury.scancode.ru&gt;, Naoki Sawada &lt;hypweb+elfinder@gmail.com&gt;",
    language: "English",
    direction: "ltr",
    dateFormat: "M d, Y h:i A", // will show like: Aug 24, 2018 04:39 PM
    fancyDateFormat: "$1 h:i A", // will show like: Today 04:39 PM
    nonameDateFormat: "ymd-His", // noname upload will show like: 180824-163916
    messages: {
      getShareText : 'Share',
      "Editor ": "Code Editor",
      /********************************** errors **********************************/
      error: "Error",
      errUnknown: "Unknown error.",
      errUnknownCmd: "Unknown command.",
      errJqui:
        "Invalid jQuery UI configuration. Selectable, draggable and droppable components must be included.",
      errNode: "elFinder requires DOM Element to be created.",
      errURL: "Invalid elFinder configuration! URL option is not set.",
      errAccess: "Access denied.",
      errConnect: "Unable to connect to backend.",
      errAbort: "Connection aborted.",
      errTimeout: "Connection timeout.",
      errNotFound: "Backend not found.",
      errResponse: "Invalid backend response.",
      errConf: "Invalid backend configuration.",
      errJSON: "PHP JSON module not installed.",
      errNoVolumes: "Readable volumes not available.",
      errCmdParams: 'Invalid parameters for command "$1".',
      errDataNotJSON: "Data is not JSON.",
      errDataEmpty: "Data is empty.",
      errCmdReq: "Backend request requires command name.",
      errOpen: 'Unable to open "$1".',
      errNotFolder: "Object is not a folder.",
      errNotFile: "Object is not a file.",
      errRead: 'Unable to read "$1".',
      errWrite: 'Unable to write into "$1".',
      errPerm: "Permission denied.",
      errLocked: '"$1" is locked and can not be renamed, moved or removed.',
      errExists: 'Item named "$1" already exists.',
      errInvName: "Invalid file name.",
      errInvDirname: "Invalid folder name.", // from v2.1.24 added 12.4.2017
      errFolderNotFound: "Folder not found.",
      errFileNotFound: "File not found.",
      errTrgFolderNotFound: 'Target folder "$1" not found.',
      errPopup:
        "Browser prevented opening popup window. To open file enable it in browser options.",
      errMkdir: 'Unable to create folder "$1".',
      errMkfile: 'Unable to create file "$1".',
      errRename: 'Unable to rename "$1".',
      errCopyFrom: 'Copying files from volume "$1" not allowed.',
      errCopyTo: 'Copying files to volume "$1" not allowed.',
      errMkOutLink: "Unable to create a link to outside the volume root.", // from v2.1 added 03.10.2015
      errUpload: "Upload error.", // old name - errUploadCommon
      errUploadFile: 'Unable to upload "$1".', // old name - errUpload
      errUploadNoFiles: "No files found for upload.",
      errUploadTotalSize: "Data exceeds the maximum allowed size.", // old name - errMaxSize
      errUploadFileSize: "File exceeds maximum allowed size.", //  old name - errFileMaxSize
      errUploadMime: "File type not allowed.",
      errUploadTransfer: '"$1" transfer error.',
      errUploadTemp: "Unable to make temporary file for upload.", // from v2.1 added 26.09.2015
      errNotReplace:
        'Object "$1" already exists at this location and can not be replaced by object with another type.', // new
      errReplace: 'Unable to replace "$1".',
      errSave: 'Unable to save "$1".',
      errCopy: 'Unable to copy "$1".',
      errMove: 'Unable to move "$1".',
      errCopyInItself: 'Unable to copy "$1" into itself.',
      errRm: 'Unable to remove "$1".',
      errTrash: "Unable into trash.", // from v2.1.24 added 30.4.2017
      errRmSrc: "Unable remove source file(s).",
      errExtract: 'Unable to extract files from "$1".',
      errArchive: "Unable to create archive.",
      errArcType: "Unsupported archive type.",
      errNoArchive: "File is not archive or has unsupported archive type.",
      errCmdNoSupport: "Backend does not support this command.",
      errReplByChild:
        'The folder "$1" can\'t be replaced by an item it contains.',
      errArcSymlinks:
        "For security reason denied to unpack archives contains symlinks or files with not allowed names.", // edited 24.06.2012
      errArcMaxSize: "Archive files exceeds maximum allowed size.",
      errResize: 'Unable to resize "$1".',
      errResizeDegree: "Invalid rotate degree.", // added 7.3.2013
      errResizeRotate: "Unable to rotate image.", // added 7.3.2013
      errResizeSize: "Invalid image size.", // added 7.3.2013
      errResizeNoChange: "Image size not changed.", // added 7.3.2013
      errUsupportType: "Unsupported file type.",
      errNotUTF8Content: 'File "$1" is not in UTF-8 and cannot be edited.', // added 9.11.2011
      errNetMount: 'Unable to mount "$1".', // added 17.04.2012
      errNetMountNoDriver: "Unsupported protocol.", // added 17.04.2012
      errNetMountFailed: "Mount failed.", // added 17.04.2012
      errNetMountHostReq: "Host required.", // added 18.04.2012
      errSessionExpires: "Your session has expired due to inactivity.",
      errCreatingTempDir: 'Unable to create temporary directory: "$1"',
      errFtpDownloadFile: 'Unable to download file from FTP: "$1"',
      errFtpUploadFile: 'Unable to upload file to FTP: "$1"',
      errFtpMkdir: 'Unable to create remote directory on FTP: "$1"',
      errArchiveExec: 'Error while archiving files: "$1"',
      errExtractExec: 'Error while extracting files: "$1"',
      errNetUnMount: "Unable to unmount.", // from v2.1 added 30.04.2012
      errConvUTF8: "Not convertible to UTF-8", // from v2.1 added 08.04.2014
      errFolderUpload:
        "Try the modern browser, If you'd like to upload the folder.", // from v2.1 added 26.6.2015
      errSearchTimeout:
        'Timed out while searching "$1". Search result is partial.', // from v2.1 added 12.1.2016
      errReauthRequire: "Re-authorization is required.", // from v2.1.10 added 24.3.2016
      errMaxTargets: "Max number of selectable items is $1.", // from v2.1.17 added 17.10.2016
      errRestore:
        "Unable to restore from the trash. Can't identify the restore destination.", // from v2.1.24 added 3.5.2017
      errEditorNotFound: "Editor not found to this file type.", // from v2.1.25 added 23.5.2017
      errServerError: "Error occurred on the server side.", // from v2.1.25 added 16.6.2017
      errEmpty: 'Unable to empty folder "$1".', // from v2.1.25 added 22.6.2017
      moreErrors: "There are $1 more errors.", // from v2.1.44 added 9.12.2018

      /******************************* commands names ********************************/
      cmdarchive: "Create archive",
      cmdback: "Back",
      cmdcopy: "Copy",
      cmdcut: "Cut",
      cmddownload: "Download",
      cmdduplicate: "Duplicate",
      cmdedit: "Edit file",
      cmdextract: "Extract files from archive",
      cmdforward: "Forward",
      cmdgetfile: "Select files",
      cmdhelp: "About this software",
      cmdhome: "Root",
      cmdinfo: "Get Info & Share",
      cmdmkdir: "New folder",
      cmdmkdirin: "Into New Folder", // from v2.1.7 added 19.2.2016
      cmdmkfile: "New file",
      cmdopen: "Open",
      cmdpaste: "Paste",
      cmdquicklook: "Preview",
      cmdreload: "Reload",
      cmdrename: "Rename",
      cmdrm: "Delete",
      cmdtrash: "Into trash", //from v2.1.24 added 29.4.2017
      cmdrestore: "Restore", //from v2.1.24 added 3.5.2017
      cmdsearch: "Find files",
      cmdup: "Go to parent folder",
      cmdupload: "Upload files",
      cmdview: "View",
      cmdresize: "Resize & Rotate",
      cmdsort: "Sort",
      cmdnetmount: "Mount network volume", // added 18.04.2012
      cmdnetunmount: "Unmount", // from v2.1 added 30.04.2012
      cmdplaces: "To Places", // added 28.12.2014
      cmdchmod: "Change mode", // from v2.1 added 20.6.2015
      cmdopendir: "Open a folder", // from v2.1 added 13.1.2016
      cmdcolwidth: "Reset column width", // from v2.1.13 added 12.06.2016
      cmdfullscreen: "Full Screen", // from v2.1.15 added 03.08.2016
      cmdmove: "Move", // from v2.1.15 added 21.08.2016
      cmdempty: "Empty the folder", // from v2.1.25 added 22.06.2017
      cmdundo: "Undo", // from v2.1.27 added 31.07.2017
      cmdredo: "Redo", // from v2.1.27 added 31.07.2017
      cmdpreference: "Preferences", // from v2.1.27 added 03.08.2017
      cmdselectall: "Select all", // from v2.1.28 added 15.08.2017
      cmdselectnone: "Select none", // from v2.1.28 added 15.08.2017
      cmdselectinvert: "Invert selection", // from v2.1.28 added 15.08.2017
      cmdopennew: "Open in new window", // from v2.1.38 added 3.4.2018
      cmdhide: "Hide (Preference)", // from v2.1.41 added 24.7.2018

      /*********************************** buttons ***********************************/
      btnClose: "Close",
      btnSave: "Save",
      btnRm: "Remove",
      btnApply: "Apply",
      btnCancel: "Cancel",
      btnNo: "No",
      btnYes: "Yes",
      btnMount: "Mount", // added 18.04.2012
      btnApprove: "Goto $1 & approve", // from v2.1 added 26.04.2012
      btnUnmount: "Unmount", // from v2.1 added 30.04.2012
      btnConv: "Convert", // from v2.1 added 08.04.2014
      btnCwd: "Here", // from v2.1 added 22.5.2015
      btnVolume: "Volume", // from v2.1 added 22.5.2015
      btnAll: "All", // from v2.1 added 22.5.2015
      btnMime: "MIME Type", // from v2.1 added 22.5.2015
      btnFileName: "Filename", // from v2.1 added 22.5.2015
      btnSaveClose: "Save & Close", // from v2.1 added 12.6.2015
      btnBackup: "Backup", // fromv2.1 added 28.11.2015
      btnRename: "Rename", // from v2.1.24 added 6.4.2017
      btnRenameAll: "Rename(All)", // from v2.1.24 added 6.4.2017
      btnPrevious: "Prev ($1/$2)", // from v2.1.24 added 11.5.2017
      btnNext: "Next ($1/$2)", // from v2.1.24 added 11.5.2017
      btnSaveAs: "Save As", // from v2.1.25 added 24.5.2017

      /******************************** notifications ********************************/
      ntfopen: "Open folder",
      ntffile: "Open file",
      ntfreload: "Reload folder content",
      ntfmkdir: "Creating folder",
      ntfmkfile: "Creating files",
      ntfrm: "Delete items",
      ntfcopy: "Copy items",
      ntfmove: "Move items",
      ntfprepare: "Checking existing items",
      ntfrename: "Rename files",
      ntfupload: "Uploading files",
      ntfdownload: "Downloading files",
      ntfsave: "Save files",
      ntfarchive: "Creating archive",
      ntfextract: "Extracting files from archive",
      ntfsearch: "Searching files",
      ntfresize: "Resizing images",
      ntfsmth: "Doing something",
      ntfloadimg: "Loading image",
      ntfnetmount: "Mounting network volume", // added 18.04.2012
      ntfnetunmount: "Unmounting network volume", // from v2.1 added 30.04.2012
      ntfdim: "Acquiring image dimension", // added 20.05.2013
      ntfreaddir: "Reading folder infomation", // from v2.1 added 01.07.2013
      ntfurl: "Getting URL of link", // from v2.1 added 11.03.2014
      ntfchmod: "Changing file mode", // from v2.1 added 20.6.2015
      ntfpreupload: "Verifying upload file name", // from v2.1 added 31.11.2015
      ntfzipdl: "Creating a file for download", // from v2.1.7 added 23.1.2016
      ntfparents: "Getting path infomation", // from v2.1.17 added 2.11.2016
      ntfchunkmerge: "Processing the uploaded file", // from v2.1.17 added 2.11.2016
      ntftrash: "Doing throw in the trash", // from v2.1.24 added 2.5.2017
      ntfrestore: "Doing restore from the trash", // from v2.1.24 added 3.5.2017
      ntfchkdir: "Checking destination folder", // from v2.1.24 added 3.5.2017
      ntfundo: "Undoing previous operation", // from v2.1.27 added 31.07.2017
      ntfredo: "Redoing previous undone", // from v2.1.27 added 31.07.2017
      ntfchkcontent: "Checking contents", // from v2.1.41 added 3.8.2018

      /*********************************** volumes *********************************/
      volume_Trash: "Trash", //from v2.1.24 added 29.4.2017

      /************************************ dates **********************************/
      dateUnknown: "unknown",
      Today: "Today",
      Yesterday: "Yesterday",
      msJan: "Jan",
      msFeb: "Feb",
      msMar: "Mar",
      msApr: "Apr",
      msMay: "May",
      msJun: "Jun",
      msJul: "Jul",
      msAug: "Aug",
      msSep: "Sep",
      msOct: "Oct",
      msNov: "Nov",
      msDec: "Dec",
      January: "January",
      February: "February",
      March: "March",
      April: "April",
      May: "May",
      June: "June",
      July: "July",
      August: "August",
      September: "September",
      October: "October",
      November: "November",
      December: "December",
      Sunday: "Sunday",
      Monday: "Monday",
      Tuesday: "Tuesday",
      Wednesday: "Wednesday",
      Thursday: "Thursday",
      Friday: "Friday",
      Saturday: "Saturday",
      Sun: "Sun",
      Mon: "Mon",
      Tue: "Tue",
      Wed: "Wed",
      Thu: "Thu",
      Fri: "Fri",
      Sat: "Sat",

      /******************************** sort variants ********************************/
      sortname: "by name",
      sortkind: "by kind",
      sortsize: "by size",
      sortdate: "by date",
      sortFoldersFirst: "Folders first",
      sortperm: "by permission", // from v2.1.13 added 13.06.2016
      sortmode: "by mode", // from v2.1.13 added 13.06.2016
      sortowner: "by owner", // from v2.1.13 added 13.06.2016
      sortgroup: "by group", // from v2.1.13 added 13.06.2016
      sortAlsoTreeview: "Also Treeview", // from v2.1.15 added 01.08.2016

      /********************************** new items **********************************/
      "untitled file.txt": "NewFile.txt", // added 10.11.2015
      "untitled folder": "NewFolder", // added 10.11.2015
      Archive: "NewArchive", // from v2.1 added 10.11.2015
      "untitled file": "NewFile.$1", // from v2.1.41 added 6.8.2018
      extentionfile: "$1: File", // from v2.1.41 added 6.8.2018
      extentiontype: "$1: $2", // from v2.1.43 added 17.10.2018

      /********************************** messages **********************************/
      confirmReq: "Confirmation required",
      confirmRm:
        "Are you sure you want to permanently remove items?<br/>This cannot be undone!",
      confirmRepl:
        "Replace old file with new one? (If it contains folders, it will be merged. To backup and replace, select Backup.)",
      confirmRest: "Replace existing item with the item in trash?", // fromv2.1.24 added 5.5.2017
      confirmConvUTF8:
        "Not in UTF-8<br/>Convert to UTF-8?<br/>Contents become UTF-8 by saving after conversion.", // from v2.1 added 08.04.2014
      confirmNonUTF8:
        "Character encoding of this file couldn't be detected. It need to temporarily convert to UTF-8 for editting.<br/>Please select character encoding of this file.", // from v2.1.19 added 28.11.2016
      confirmNotSave:
        "It has been modified.<br/>Losing work if you do not save changes.", // from v2.1 added 15.7.2015
      confirmTrash: "Are you sure you want to move items to trash bin?", //from v2.1.24 added 29.4.2017
      confirmMove: 'Are you sure you want to move items to "$1"?', //from v2.1.50 added 27.7.2019
      apllyAll: "Apply to all",
      name: "Name",
      size: "Size",
      perms: "Permissions",
      modify: "Modified",
      kind: "Kind",
      read: "read",
      write: "write",
      noaccess: "no access",
      and: "and",
      unknown: "unknown",
      selectall: "Select all items",
      selectfiles: "Select item(s)",
      selectffile: "Select first item",
      selectlfile: "Select last item",
      viewlist: "List view",
      viewicons: "Icons view",
      viewSmall: "Small icons", // from v2.1.39 added 22.5.2018
      viewMedium: "Medium icons", // from v2.1.39 added 22.5.2018
      viewLarge: "Large icons", // from v2.1.39 added 22.5.2018
      viewExtraLarge: "Extra large icons", // from v2.1.39 added 22.5.2018
      places: "Places",
      calc: "Calculating",
      path: "Path",
      aliasfor: "Alias for",
      locked: "Locked",
      dim: "Dimensions",
      files: "Files",
      folders: "Folders",
      items: "Items",
      yes: "yes",
      no: "no",
      link: "Link",
      searcresult: "Search results",
      selected: "selected items",
      about: "About",
      shortcuts: "Shortcuts",
      help: "Help",
      webfm: "Web file manager",
      ver: "Version",
      protocolver: "protocol version",
      homepage: "Project home",
      docs: "Documentation",
      github: "Fork us on GitHub",
      twitter: "Follow us on Twitter",
      facebook: "Join us on Facebook",
      team: "Team",
      chiefdev: "chief developer",
      developer: "developer",
      contributor: "contributor",
      maintainer: "maintainer",
      translator: "translator",
      icons: "Icons",
      dontforget: "and don't forget to take your towel",
      shortcutsof: "Shortcuts disabled",
      dropFiles: "Drop files here",
      or: "or",
      selectForUpload: "Select files",
      moveFiles: "Move items",
      copyFiles: "Copy items",
      restoreFiles: "Restore items", // from v2.1.24 added 5.5.2017
      rmFromPlaces: "Remove from places",
      aspectRatio: "Aspect ratio",
      scale: "Scale",
      width: "Width",
      height: "Height",
      resize: "Resize",
      crop: "Crop",
      rotate: "Rotate",
      "rotate-cw": "Rotate 90 degrees CW",
      "rotate-ccw": "Rotate 90 degrees CCW",
      degree: "°",
      netMountDialogTitle: "Mount network volume", // added 18.04.2012
      protocol: "Protocol", // added 18.04.2012
      host: "Host", // added 18.04.2012
      port: "Port", // added 18.04.2012
      user: "User", // added 18.04.2012
      pass: "Password", // added 18.04.2012
      confirmUnmount: "Are you sure to unmount $1?", // from v2.1 added 30.04.2012
      dropFilesBrowser: "Drop or Paste files from browser", // from v2.1 added 30.05.2012
      dropPasteFiles: "Drop files, Paste URLs or images(clipboard) here", // from v2.1 added 07.04.2014
      encoding: "Encoding", // from v2.1 added 19.12.2014
      locale: "Locale", // from v2.1 added 19.12.2014
      searchTarget: "Target: $1", // from v2.1 added 22.5.2015
      searchMime: "Search by input MIME Type", // from v2.1 added 22.5.2015
      owner: "Owner", // from v2.1 added 20.6.2015
      group: "Group", // from v2.1 added 20.6.2015
      other: "Other", // from v2.1 added 20.6.2015
      execute: "Execute", // from v2.1 added 20.6.2015
      perm: "Permission", // from v2.1 added 20.6.2015
      mode: "Mode", // from v2.1 added 20.6.2015
      emptyFolder: "Folder is empty", // from v2.1.6 added 30.12.2015
      emptyFolderDrop: "Folder is empty\\A Drop to add items", // from v2.1.6 added 30.12.2015
      emptyFolderLTap: "Folder is empty\\A Long tap to add items", // from v2.1.6 added 30.12.2015
      quality: "Quality", // from v2.1.6 added 5.1.2016
      autoSync: "Auto sync", // from v2.1.6 added 10.1.2016
      moveUp: "Move up", // from v2.1.6 added 18.1.2016
      getLink: "Get URL link", // from v2.1.7 added 9.2.2016
      share: 'Share',
      selectedItems: "Selected items ($1)", // from v2.1.7 added 2.19.2016
      folderId: "Folder ID", // from v2.1.10 added 3.25.2016
      offlineAccess: "Allow offline access", // from v2.1.10 added 3.25.2016
      reAuth: "To re-authenticate", // from v2.1.10 added 3.25.2016
      nowLoading: "Now loading...", // from v2.1.12 added 4.26.2016
      openMulti: "Open multiple files", // from v2.1.12 added 5.14.2016
      openMultiConfirm:
        "You are trying to open the $1 files. Are you sure you want to open in browser?", // from v2.1.12 added 5.14.2016
      emptySearch: "Search results is empty in search target.", // from v2.1.12 added 5.16.2016
      editingFile: "It is editing a file.", // from v2.1.13 added 6.3.2016
      hasSelected: "You have selected $1 items.", // from v2.1.13 added 6.3.2016
      hasClipboard: "You have $1 items in the clipboard.", // from v2.1.13 added 6.3.2016
      incSearchOnly: "Incremental search is only from the current view.", // from v2.1.13 added 6.30.2016
      reinstate: "Reinstate", // from v2.1.15 added 3.8.2016
      complete: "$1 complete", // from v2.1.15 added 21.8.2016
      contextmenu: "Context menu", // from v2.1.15 added 9.9.2016
      pageTurning: "Page turning", // from v2.1.15 added 10.9.2016
      volumeRoots: "Volume roots", // from v2.1.16 added 16.9.2016
      reset: "Reset", // from v2.1.16 added 1.10.2016
      bgcolor: "Background color", // from v2.1.16 added 1.10.2016
      colorPicker: "Color picker", // from v2.1.16 added 1.10.2016
      "8pxgrid": "8px Grid", // from v2.1.16 added 4.10.2016
      enabled: "Enabled", // from v2.1.16 added 4.10.2016
      disabled: "Disabled", // from v2.1.16 added 4.10.2016
      emptyIncSearch:
        "Search results is empty in current view.\\A Press [Enter] to expand search target.", // from v2.1.16 added 5.10.2016
      emptyLetSearch: "First letter search results is empty in current view.", // from v2.1.23 added 24.3.2017
      textLabel: "Text label", // from v2.1.17 added 13.10.2016
      minsLeft: "$1 mins left", // from v2.1.17 added 13.11.2016
      openAsEncoding: "Reopen with selected encoding", // from v2.1.19 added 2.12.2016
      saveAsEncoding: "Save with the selected encoding", // from v2.1.19 added 2.12.2016
      selectFolder: "Select folder", // from v2.1.20 added 13.12.2016
      firstLetterSearch: "First letter search", // from v2.1.23 added 24.3.2017
      presets: "Presets", // from v2.1.25 added 26.5.2017
      tooManyToTrash: "It's too many items so it can't into trash.", // from v2.1.25 added 9.6.2017
      TextArea: "TextArea", // from v2.1.25 added 14.6.2017
      folderToEmpty: 'Empty the folder "$1".', // from v2.1.25 added 22.6.2017
      filderIsEmpty: 'There are no items in a folder "$1".', // from v2.1.25 added 22.6.2017
      preference: "Preference", // from v2.1.26 added 28.6.2017
      language: "Language", // from v2.1.26 added 28.6.2017
      clearBrowserData: "Initialize the settings saved in this browser", // from v2.1.26 added 28.6.2017
      toolbarPref: "Toolbar settings", // from v2.1.27 added 2.8.2017
      charsLeft: "... $1 chars left.", // from v2.1.29 added 30.8.2017
      linesLeft: "... $1 lines left.", // from v2.1.52 added 16.1.2020
      sum: "Sum", // from v2.1.29 added 28.9.2017
      roughFileSize: "Rough file size", // from v2.1.30 added 2.11.2017
      autoFocusDialog: "Focus on the element of dialog with mouseover", // from v2.1.30 added 2.11.2017
      select: "Select", // from v2.1.30 added 23.11.2017
      selectAction: "Action when select file", // from v2.1.30 added 23.11.2017
      useStoredEditor: "Open with the editor used last time", // from v2.1.30 added 23.11.2017
      selectinvert: "Invert selection", // from v2.1.30 added 25.11.2017
      renameMultiple:
        "Are you sure you want to rename $1 selected items like $2?<br/>This cannot be undone!", // from v2.1.31 added 4.12.2017
      batchRename: "Batch rename", // from v2.1.31 added 8.12.2017
      plusNumber: "+ Number", // from v2.1.31 added 8.12.2017
      asPrefix: "Add prefix", // from v2.1.31 added 8.12.2017
      asSuffix: "Add suffix", // from v2.1.31 added 8.12.2017
      changeExtention: "Change extention", // from v2.1.31 added 8.12.2017
      columnPref: "Columns settings (List view)", // from v2.1.32 added 6.2.2018
      reflectOnImmediate:
        "All changes will reflect immediately to the archive.", // from v2.1.33 added 2.3.2018
      reflectOnUnmount:
        "Any changes will not reflect until un-mount this volume.", // from v2.1.33 added 2.3.2018
      unmountChildren:
        "The following volume(s) mounted on this volume also unmounted. Are you sure to unmount it?", // from v2.1.33 added 5.3.2018
      selectionInfo: "Selection Info", // from v2.1.33 added 7.3.2018
      hashChecker: "Algorithms to show the file hash", // from v2.1.33 added 10.3.2018
      infoItems: "Info Items (Selection Info Panel)", // from v2.1.38 added 28.3.2018
      pressAgainToExit: "Press again to exit.", // from v2.1.38 added 1.4.2018
      toolbar: "Toolbar", // from v2.1.38 added 4.4.2018
      workspace: "Work Space", // from v2.1.38 added 4.4.2018
      dialog: "Dialog", // from v2.1.38 added 4.4.2018
      all: "All", // from v2.1.38 added 4.4.2018
      iconSize: "Icon Size (Icons view)", // from v2.1.39 added 7.5.2018
      editorMaximized: "Open the maximized editor window", // from v2.1.40 added 30.6.2018
      editorConvNoApi:
        "Because conversion by API is not currently available, please convert on the website.", //from v2.1.40 added 8.7.2018
      editorConvNeedUpload:
        "After conversion, you must be upload with the item URL or a downloaded file to save the converted file.", //from v2.1.40 added 8.7.2018
      convertOn: "Convert on the site of $1", // from v2.1.40 added 10.7.2018
      integrations: "Integrations", // from v2.1.40 added 11.7.2018
      integrationWith:
        "This elFinder has the following external services integrated. Please check the terms of use, privacy policy, etc. before using it.", // from v2.1.40 added 11.7.2018
      showHidden: "Show hidden items", // from v2.1.41 added 24.7.2018
      hideHidden: "Hide hidden items", // from v2.1.41 added 24.7.2018
      toggleHidden: "Show/Hide hidden items", // from v2.1.41 added 24.7.2018
      makefileTypes: 'File types to enable with "New file"', // from v2.1.41 added 7.8.2018
      typeOfTextfile: "Type of the Text file", // from v2.1.41 added 7.8.2018
      add: "Add", // from v2.1.41 added 7.8.2018
      theme: "Theme", // from v2.1.43 added 19.10.2018
      default: "Default", // from v2.1.43 added 19.10.2018
      description: "Description", // from v2.1.43 added 19.10.2018
      website: "Website", // from v2.1.43 added 19.10.2018
      author: "Author", // from v2.1.43 added 19.10.2018
      email: "Email", // from v2.1.43 added 19.10.2018
      license: "License", // from v2.1.43 added 19.10.2018
      exportToSave:
        "This item can't be saved. To avoid losing the edits you need to export to your PC.", // from v2.1.44 added 1.12.2018
      dblclickToSelect: "Double click on the file to select it.", // from v2.1.47 added 22.1.2019
      useFullscreen: "Use fullscreen mode", // from v2.1.47 added 19.2.2019

      /********************************** mimetypes **********************************/
      kindUnknown: "Unknown",
      kindRoot: "Volume Root", // from v2.1.16 added 16.10.2016
      kindFolder: "Folder",
      kindSelects: "Selections", // from v2.1.29 added 29.8.2017
      kindAlias: "Alias",
      kindAliasBroken: "Broken alias",
      // applications
      kindApp: "Application",
      kindPostscript: "Postscript document",
      kindMsOffice: "Microsoft Office document",
      kindMsWord: "Microsoft Word document",
      kindMsExcel: "Microsoft Excel document",
      kindMsPP: "Microsoft Powerpoint presentation",
      kindOO: "Open Office document",
      kindAppFlash: "Flash application",
      kindPDF: "Portable Document Format (PDF)",
      kindTorrent: "Bittorrent file",
      kind7z: "7z archive",
      kindTAR: "TAR archive",
      kindGZIP: "GZIP archive",
      kindBZIP: "BZIP archive",
      kindXZ: "XZ archive",
      kindZIP: "ZIP archive",
      kindRAR: "RAR archive",
      kindJAR: "Java JAR file",
      kindTTF: "True Type font",
      kindOTF: "Open Type font",
      kindRPM: "RPM package",
      // texts
      kindText: "Text document",
      kindTextPlain: "Plain text",
      kindPHP: "PHP source",
      kindCSS: "Cascading style sheet",
      kindHTML: "HTML document",
      kindJS: "Javascript source",
      kindRTF: "Rich Text Format",
      kindC: "C source",
      kindCHeader: "C header source",
      kindCPP: "C++ source",
      kindCPPHeader: "C++ header source",
      kindShell: "Unix shell script",
      kindPython: "Python source",
      kindJava: "Java source",
      kindRuby: "Ruby source",
      kindPerl: "Perl script",
      kindSQL: "SQL source",
      kindXML: "XML document",
      kindAWK: "AWK source",
      kindCSV: "Comma separated values",
      kindDOCBOOK: "Docbook XML document",
      kindMarkdown: "Markdown text", // added 20.7.2015
      // images
      kindImage: "Image",
      kindBMP: "BMP image",
      kindJPEG: "JPEG image",
      kindGIF: "GIF Image",
      kindPNG: "PNG Image",
      kindTIFF: "TIFF image",
      kindTGA: "TGA image",
      kindPSD: "Adobe Photoshop image",
      kindXBITMAP: "X bitmap image",
      kindPXM: "Pixelmator image",
      // media
      kindAudio: "Audio media",
      kindAudioMPEG: "MPEG audio",
      kindAudioMPEG4: "MPEG-4 audio",
      kindAudioMIDI: "MIDI audio",
      kindAudioOGG: "Ogg Vorbis audio",
      kindAudioWAV: "WAV audio",
      AudioPlaylist: "MP3 playlist",
      kindVideo: "Video media",
      kindVideoDV: "DV movie",
      kindVideoMPEG: "MPEG movie",
      kindVideoMPEG4: "MPEG-4 movie",
      kindVideoAVI: "AVI movie",
      kindVideoMOV: "Quick Time movie",
      kindVideoWM: "Windows Media movie",
      kindVideoFlash: "Flash movie",
      kindVideoMKV: "Matroska movie",
      kindVideoOGG: "Ogg movie",
    },
  };
}
js/i18n/elfinder.zh_TW.js000064400000071226151215013360011124 0ustar00/**
 * Traditional Chinese translation
 * @author Yuwei Chuang <ywchuang.tw@gmail.com>
 * @author Danny Lin <danny0838@gmail.com>
 * @author TCC <john987john987@gmail.com>
 * @author Rick Jiang <rick.jiang@aol.com>
 * @version 2021-02-23
 */
(function (root, factory) {
  if (typeof define === "function" && define.amd) {
    define(["elfinder"], factory);
  } else if (typeof exports !== "undefined") {
    module.exports = factory(require("elfinder"));
  } else {
    factory(root.elFinder);
  }
})(this, function (elFinder) {
  elFinder.prototype.i18.zh_TW = {
    translator:
      "Yuwei Chuang &lt;ywchuang.tw@gmail.com&gt;, Danny Lin &lt;danny0838@gmail.com&gt;, TCC &lt;john987john987@gmail.com&gt;, Rick Jiang &lt;rick.jiang@aol.com&gt",
    language: "正體中文",
    direction: "ltr",
    dateFormat: "Y/m/d H:i", // Mar 13, 2012 05:27 PM
    fancyDateFormat: "$1 H:i", // will produce smth like: Today 12:25 PM
    nonameDateFormat: "ymd-His", // to apply if upload file is noname: 120513172700
    messages: {
      'getShareText' : '分享',
			'Editor ': '代碼編輯器',
      /********************************** errors **********************************/
      error: "錯誤",
      errUnknown: "未知的錯誤.",
      errUnknownCmd: "未知的指令.",
      errJqui:
        "無效的 jQuery UI 設定. 必須包含 Selectable, draggable 以及 droppable 元件.",
      errNode: "elFinder 需要能建立 DOM 元素.",
      errURL: "無效的 elFinder 設定! 尚未設定 URL 選項.",
      errAccess: "拒絕存取.",
      errConnect: "無法連線至後端.",
      errAbort: "連線中斷.",
      errTimeout: "連線逾時.",
      errNotFound: "後端不存在.",
      errResponse: "無效的後端回復.",
      errConf: "無效的後端設定.",
      errJSON: "未安裝 PHP JSON 模組.",
      errNoVolumes: "無可讀取的 volumes.",
      errCmdParams: '無效的參數, 指令: "$1".',
      errDataNotJSON: "資料不是 JSON 格式.",
      errDataEmpty: "沒有資料.",
      errCmdReq: "後端請求需要命令名稱.",
      errOpen: '無法開啟 "$1".',
      errNotFolder: "非資料夾.",
      errNotFile: "非檔案.",
      errRead: '無法讀取 "$1".',
      errWrite: '無法寫入 "$1".',
      errPerm: "無權限.",
      errLocked: '"$1" 被鎖定,不能重新命名, 移動或删除.',
      errExists: '檔案 "$1" 已經存在了.',
      errInvName: "無效的檔案名稱.",
      errInvDirname: "無效的資料夾名稱", // from v2.1.24 added 12.4.2017
      errFolderNotFound: "未找到資料夾.",
      errFileNotFound: "未找到檔案.",
      errTrgFolderNotFound: '未找到目標資料夾 "$1".',
      errPopup: "連覽器攔截了彈跳視窗. 請在瀏覽器選項允許彈跳視窗.",
      errMkdir: '不能建立資料夾 "$1".',
      errMkfile: '不能建立檔案 "$1".',
      errRename: '不能重新命名 "$1".',
      errCopyFrom: '不允許從磁碟 "$1" 複製.',
      errCopyTo: '不允複製到磁碟 "$1".',
      errMkOutLink: "無法建立連結到磁碟根目錄外面.", // from v2.1 added 03.10.2015
      errUpload: "上傳錯誤.", // old name - errUploadCommon
      errUploadFile: '無法上傳 "$1".', // old name - errUpload
      errUploadNoFiles: "未找到要上傳的檔案.",
      errUploadTotalSize: "資料超過了最大允許大小.", // old name - errMaxSize
      errUploadFileSize: "檔案超過了最大允許大小.", //  old name - errFileMaxSize
      errUploadMime: "不允許的檔案類型.",
      errUploadTransfer: '"$1" 傳輸錯誤.',
      errUploadTemp: "無法建立暫存檔以供上傳.", // from v2.1 added 26.09.2015
      errNotReplace: '"$1" 已經存在此位置, 不能被其他的替换.', // new
      errReplace: '無法替换 "$1".',
      errSave: '無法保存 "$1".',
      errCopy: '無法複製 "$1".',
      errMove: '無法移動 "$1".',
      errCopyInItself: '無法移動 "$1" 到原有位置.',
      errRm: '無法删除 "$1".',
      errTrash: "無法丟入垃圾桶", // from v2.1.24 added 30.4.2017
      errRmSrc: "無法删除來源檔案.",
      errExtract: '無法從 "$1" 解壓縮檔案.',
      errArchive: "無法建立壓縮膽.",
      errArcType: "不支援的壓縮格式.",
      errNoArchive: "檔案不是壓縮檔, 或者不支援該壓缩格式.",
      errCmdNoSupport: "後端不支援該指令.",
      errReplByChild: "資料夾 “$1” 不能被它所包含的檔案(資料夾)替换.",
      errArcSymlinks: "由於安全考量,拒絕解壓縮符號連結或含有不允許檔名的檔案.", // edited 24.06.2012
      errArcMaxSize: "待壓縮檔案的大小超出上限.",
      errResize: '無法重新調整大小 "$1".',
      errResizeDegree: "無效的旋轉角度.", // added 7.3.2013
      errResizeRotate: "無法旋轉圖片.", // added 7.3.2013
      errResizeSize: "無效的圖片大小.", // added 7.3.2013
      errResizeNoChange: "圖片大小未更改.", // added 7.3.2013
      errUsupportType: "不支援的檔案格式.",
      errNotUTF8Content: '檔案 "$1" 不是 UTF-8 格式, 不能編輯.', // added 9.11.2011
      errNetMount: '無法掛載 "$1".', // added 17.04.2012
      errNetMountNoDriver: "不支援該通訊協議.", // added 17.04.2012
      errNetMountFailed: "掛載失敗.", // added 17.04.2012
      errNetMountHostReq: "需要指定主機位置.", // added 18.04.2012
      errSessionExpires: "由於過久無活動, session 已過期.",
      errCreatingTempDir: '無法建立暫時目錄: "$1"',
      errFtpDownloadFile: '無法從 FTP 下載檔案: "$1"',
      errFtpUploadFile: '無法上傳檔案到 FTP: "$1"',
      errFtpMkdir: '無法在 FTP 建立遠端目錄: "$1"',
      errArchiveExec: '壓縮檔案時發生錯誤: "$1"',
      errExtractExec: '解壓縮檔案時發生錯誤: "$1"',
      errNetUnMount: "無法卸載", // from v2.1 added 30.04.2012
      errConvUTF8: "無法轉換為 UTF-8", // from v2.1 added 08.04.2014
      errFolderUpload: "如要上傳這個資料夾, 請嘗試 Google Chrome.", // from v2.1 added 26.6.2015
      errSearchTimeout: '搜尋 "$1" 逾時. 只列出部分搜尋結果.', // from v2.1 added 12.1.2016
      errReauthRequire: "需要重新驗證權限.", // from v2.1.10 added 24.3.2016
      errMaxTargets: "最多可選擇 $1 個物件.", // from v2.1.17 added 17.10.2016
      errRestore: "無法從垃圾桶恢復。 無法識別恢復目的地。", // from v2.1.24 added 3.5.2017
      errEditorNotFound: "編輯器找不到此文件類型。", // from v2.1.25 added 23.5.2017
      errServerError: "服務器發生錯誤。", // from v2.1.25 added 16.6.2017
      errEmpty: '無法清空"$1"文件夾', // from v2.1.25 added 22.6.2017
      moreErrors: "發生 $1 個錯誤.", // from v2.1.44 added 9.12.2018

      /******************************* commands names ********************************/
      cmdarchive: "建立壓縮檔",
      cmdback: "後退",
      cmdcopy: "複製",
      cmdcut: "剪下",
      cmddownload: "下載",
      cmdduplicate: "建立副本",
      cmdedit: "編輯檔案",
      cmdextract: "從壓縮檔解壓縮",
      cmdforward: "前進",
      cmdgetfile: "選擇檔案",
      cmdhelp: "關於本軟體",
      cmdhome: "首頁",
      cmdinfo: "查看關於",
      cmdmkdir: "建立資料夾",
      cmdmkdirin: "移入新資料夾", // from v2.1.7 added 19.2.2016
      cmdmkfile: "建立文檔",
      cmdopen: "開啟",
      cmdpaste: "貼上",
      cmdquicklook: "預覽",
      cmdreload: "更新",
      cmdrename: "重新命名",
      cmdrm: "删除",
      cmdtrash: "丟到垃圾桶", //from v2.1.24 added 29.4.2017
      cmdrestore: "恢復", //from v2.1.24 added 3.5.2017
      cmdsearch: "搜尋檔案",
      cmdup: "移到上一層資料夾",
      cmdupload: "上傳檔案",
      cmdview: "檢視",
      cmdresize: "調整大小及旋轉",
      cmdsort: "排序",
      cmdnetmount: "掛載網路磁碟", // added 18.04.2012
      cmdnetunmount: "卸載", // from v2.1 added 30.04.2012
      cmdplaces: '加到"位置"', // added 28.12.2014
      cmdchmod: "更改權限", // from v2.1 added 20.6.2015
      cmdopendir: "開啟資料夾", // from v2.1 added 13.1.2016
      cmdcolwidth: "重設欄寬", // from v2.1.13 added 12.06.2016
      cmdfullscreen: "全螢幕", // from v2.1.15 added 03.08.2016
      cmdmove: "移動", // from v2.1.15 added 21.08.2016
      cmdempty: "清空資料夾", // from v2.1.25 added 22.06.2017
      cmdundo: "上一步", // from v2.1.27 added 31.07.2017
      cmdredo: "下一步", // from v2.1.27 added 31.07.2017
      cmdpreference: "優先權", // from v2.1.27 added 03.08.2017
      cmdselectall: "全選", // from v2.1.28 added 15.08.2017
      cmdselectnone: "取消選取", // from v2.1.28 added 15.08.2017
      cmdselectinvert: "反向選取", // from v2.1.28 added 15.08.2017
      cmdopennew: "在新視窗開啟", // from v2.1.38 added 3.4.2018
      cmdhide: "隱藏(偏好)", // from v2.1.41 added 24.7.2018

      /*********************************** buttons ***********************************/
      btnClose: "關閉",
      btnSave: "儲存",
      btnRm: "删除",
      btnApply: "使用",
      btnCancel: "取消",
      btnNo: "否",
      btnYes: "是",
      btnMount: "掛載", // added 18.04.2012
      btnApprove: "移到 $1 並批准", // from v2.1 added 26.04.2012
      btnUnmount: "卸載", // from v2.1 added 30.04.2012
      btnConv: "轉換", // from v2.1 added 08.04.2014
      btnCwd: "這裡", // from v2.1 added 22.5.2015
      btnVolume: "磁碟", // from v2.1 added 22.5.2015
      btnAll: "全部", // from v2.1 added 22.5.2015
      btnMime: "MIME 類型", // from v2.1 added 22.5.2015
      btnFileName: "檔名", // from v2.1 added 22.5.2015
      btnSaveClose: "儲存並關閉", // from v2.1 added 12.6.2015
      btnBackup: "備份", // fromv2.1 added 28.11.2015
      btnRename: "重新命名", // from v2.1.24 added 6.4.2017
      btnRenameAll: "重新命名全部", // from v2.1.24 added 6.4.2017
      btnPrevious: "上一頁 ($1/$2)", // from v2.1.24 added 11.5.2017
      btnNext: "下一頁 ($1/$2)", // from v2.1.24 added 11.5.2017
      btnSaveAs: "另存新檔", // from v2.1.25 added 24.5.2017

      /******************************** notifications ********************************/
      ntfopen: "開啟資料夾",
      ntffile: "開啟檔案",
      ntfreload: "更新資料夾内容",
      ntfmkdir: "建立資料夾",
      ntfmkfile: "建立檔案",
      ntfrm: "删除檔案",
      ntfcopy: "複製檔案",
      ntfmove: "移動檔案",
      ntfprepare: "準備複製檔案",
      ntfrename: "重新命名檔案",
      ntfupload: "上傳檔案",
      ntfdownload: "下載檔案",
      ntfsave: "儲存檔案",
      ntfarchive: "建立壓縮檔",
      ntfextract: "從壓縮檔解壓縮",
      ntfsearch: "搜尋檔案",
      ntfresize: "正在更改圖片大小",
      ntfsmth: "正在忙 >_<",
      ntfloadimg: "正在讀取圖片",
      ntfnetmount: "正在掛載網路磁碟", // added 18.04.2012
      ntfnetunmount: "正在卸載網路磁碟", // from v2.1 added 30.04.2012
      ntfdim: "取得圖片大小", // added 20.05.2013
      ntfreaddir: "正在讀取資料夾資訊", // from v2.1 added 01.07.2013
      ntfurl: "正在取得連結 URL", // from v2.1 added 11.03.2014
      ntfchmod: "更改檔案模式", // from v2.1 added 20.6.2015
      ntfpreupload: "正在驗證上傳檔案名稱", // from v2.1 added 31.11.2015
      ntfzipdl: "正在建立縮檔以供下載", // from v2.1.7 added 23.1.2016
      ntfparents: "正在取得路徑資訊", // from v2.1.17 added 2.11.2016
      ntfchunkmerge: "正在處理上傳的檔案", // from v2.1.17 added 2.11.2016
      ntftrash: "正在丟到垃圾桶", // from v2.1.24 added 2.5.2017
      ntfrestore: "正從垃圾桶恢復", // from v2.1.24 added 3.5.2017
      ntfchkdir: "正在檢查目標資料夾", // from v2.1.24 added 3.5.2017
      ntfundo: "正在撤銷上一步動作", // from v2.1.27 added 31.07.2017
      ntfredo: "正在重做上一步動作", // from v2.1.27 added 31.07.2017
      ntfchkcontent: "正在確認內容", // from v2.1.41 added 3.8.2018

      /*********************************** volumes *********************************/
      volume_Trash: "垃圾桶", //from v2.1.24 added 29.4.2017

      /************************************ dates **********************************/
      dateUnknown: "未知",
      Today: "今天",
      Yesterday: "昨天",
      msJan: "一月",
      msFeb: "二月",
      msMar: "三月",
      msApr: "四月",
      msMay: "五月",
      msJun: "六月",
      msJul: "七月",
      msAug: "八月",
      msSep: "九月",
      msOct: "十月",
      msNov: "十一月",
      msDec: "十二月",
      January: "一月",
      February: "二月",
      March: "三月",
      April: "四月",
      May: "五月",
      June: "六月",
      July: "七月",
      August: "八月",
      September: "九月",
      October: "十月",
      November: "十一月",
      December: "十二月",
      Sunday: "星期日",
      Monday: "星期一",
      Tuesday: "星期二",
      Wednesday: "星期三",
      Thursday: "星期四",
      Friday: "星期五",
      Saturday: "星期六",
      Sun: "周日",
      Mon: "周一",
      Tue: "周二",
      Wed: "周三",
      Thu: "周四",
      Fri: "周五",
      Sat: "周六",

      /******************************** sort variants ********************************/
      sortname: "按名稱",
      sortkind: "按類型",
      sortsize: "按大小",
      sortdate: "按日期",
      sortFoldersFirst: "資料夾置前",
      sortperm: "按權限", // from v2.1.13 added 13.06.2016
      sortmode: "按模式", // from v2.1.13 added 13.06.2016
      sortowner: "按擁有者", // from v2.1.13 added 13.06.2016
      sortgroup: "按群組", // from v2.1.13 added 13.06.2016
      sortAlsoTreeview: "也套用於樹狀圖", // from v2.1.15 added 01.08.2016

      /********************************** new items **********************************/
      "untitled file.txt": "新檔案.txt", // added 10.11.2015
      "untitled folder": "新資料夾", // added 10.11.2015
      Archive: "新壓縮檔", // from v2.1 added 10.11.2015
      'untitled file'     : '新檔案.$1',
      extentionfile: "$1: 文件", // from v2.1.41 added 6.8.2018
      extentiontype: "$1: $2", // from v2.1.43 added 17.10.2018

      /********************************** messages **********************************/
      confirmReq: "請確認",
      confirmRm: "確定要删除檔案嗎?<br/>此操作無法回復!",
      confirmRepl: "用新檔案取代原檔案?",
      confirmRest: "用垃圾桶中的項目替換現有項目?", // fromv2.1.24 added 5.5.2017
      confirmConvUTF8:
        "不是 UTF-8 檔案<br/>轉換為 UTF-8 嗎?<br/>轉換後儲存會把內容變成 UTF-8.", // from v2.1 added 08.04.2014
      confirmNonUTF8:
        "無法偵測此檔案的字元編碼, 須暫時轉換為 UTF-8 以供編輯.<br/>請選擇此檔案的字元編碼.", // from v2.1.19 added 28.11.2016
      confirmNotSave: "此檔案已修改.<br/>若未儲存將遺失目前的工作.", // from v2.1 added 15.7.2015
      confirmTrash: "確定要將項目丟到垃圾桶嗎?", //from v2.1.24 added 29.4.2017
      apllyAll: "全部套用",
      name: "名稱",
      size: "大小",
      perms: "權限",
      modify: "修改於",
      kind: "類別",
      read: "讀取",
      write: "寫入",
      noaccess: "無權限",
      and: "和",
      unknown: "未知",
      selectall: "選擇所有檔案",
      selectfiles: "選擇檔案",
      selectffile: "選擇第一個檔案",
      selectlfile: "選擇最後一個檔案",
      viewlist: "列表檢視",
      viewicons: "圖示檢視",
      viewSmall: "小圖示", // from v2.1.39 added 22.5.2018
      viewMedium: "中圖示", // from v2.1.39 added 22.5.2018
      viewLarge: "大圖示", // from v2.1.39 added 22.5.2018
      viewExtraLarge: "超大圖示", // from v2.1.39 added 22.5.2018
      places: "位置",
      calc: "計算",
      path: "路徑",
      aliasfor: "别名",
      locked: "鎖定",
      dim: "圖片大小",
      files: "檔案",
      folders: "資料夾",
      items: "項目",
      yes: "是",
      no: "否",
      link: "連結",
      searcresult: "搜尋结果",
      selected: "選取的項目",
      about: "關於",
      shortcuts: "快捷鍵",
      help: "協助",
      webfm: "網路檔案總管",
      ver: "版本",
      protocolver: "協定版本",
      homepage: "首頁",
      docs: "文件",
      github: "在 Github 建立我們的分支",
      twitter: "在 Twitter 追蹤我們",
      facebook: "在 Facebook 加入我們",
      team: "團隊",
      chiefdev: "主要開發者",
      developer: "開發者",
      contributor: "貢獻者",
      maintainer: "維護者",
      translator: "翻譯者",
      icons: "圖示",
      dontforget: "别忘了帶上你擦汗的毛巾",
      shortcutsof: "快捷鍵已停用",
      dropFiles: "把檔案拖到此處",
      or: "或",
      selectForUpload: "選擇要上傳的檔案",
      moveFiles: "移動檔案",
      copyFiles: "複製檔案",
      restoreFiles: "恢復項目", // from v2.1.24 added 5.5.2017
      rmFromPlaces: '從"位置"中删除',
      aspectRatio: "保持比例",
      scale: "寬高比",
      width: "寬",
      height: "高",
      resize: "重新調整大小",
      crop: "裁切",
      rotate: "旋轉",
      "rotate-cw": "順時針旋轉90度",
      "rotate-ccw": "逆時針旋轉90度",
      degree: "度",
      netMountDialogTitle: "掛載網路磁碟", // added 18.04.2012
      protocol: "通訊協定", // added 18.04.2012
      host: "主機", // added 18.04.2012
      port: "連接埠", // added 18.04.2012
      user: "使用者", // added 18.04.2012
      pass: "密碼", // added 18.04.2012
      confirmUnmount: "確定要卸載 $1?", // from v2.1 added 30.04.2012
      dropFilesBrowser: "從瀏覽器拖放或貼上檔案", // from v2.1 added 30.05.2012
      dropPasteFiles: "拖放檔案或從剪貼簿貼上 URL 或圖片至此", // from v2.1 added 07.04.2014
      encoding: "編碼", // from v2.1 added 19.12.2014
      locale: "語系", // from v2.1 added 19.12.2014
      searchTarget: "目標: $1", // from v2.1 added 22.5.2015
      searchMime: "根據輸入的 MIME 類型搜尋", // from v2.1 added 22.5.2015
      owner: "擁有者", // from v2.1 added 20.6.2015
      group: "群組", // from v2.1 added 20.6.2015
      other: "其他", // from v2.1 added 20.6.2015
      execute: "執行", // from v2.1 added 20.6.2015
      perm: "權限", // from v2.1 added 20.6.2015
      mode: "模式", // from v2.1 added 20.6.2015
      emptyFolder: "資料夾是空的", // from v2.1.6 added 30.12.2015
      emptyFolderDrop: "資料夾是空的\\A 拖曳以增加項目", // from v2.1.6 added 30.12.2015
      emptyFolderLTap: "資料夾是空的\\A 長按以增加項目", // from v2.1.6 added 30.12.2015
      quality: "品質", // from v2.1.6 added 5.1.2016
      autoSync: "自動同步", // from v2.1.6 added 10.1.2016
      moveUp: "上移", // from v2.1.6 added 18.1.2016
      getLink: "取得 URL 連結", // from v2.1.7 added 9.2.2016
      selectedItems: "選取的項目 ($1)", // from v2.1.7 added 2.19.2016
      folderId: "資料夾 ID", // from v2.1.10 added 3.25.2016
      offlineAccess: "允許離線存取", // from v2.1.10 added 3.25.2016
      reAuth: "重新驗證權限", // from v2.1.10 added 3.25.2016
      nowLoading: "正在載入...", // from v2.1.12 added 4.26.2016
      openMulti: "開啟多個檔案", // from v2.1.12 added 5.14.2016
      openMultiConfirm: "確定要在瀏覽器開啟 $1 個檔案嗎?", // from v2.1.12 added 5.14.2016
      emptySearch: "在搜尋目標中的搜尋結果是空的.", // from v2.1.12 added 5.16.2016
      editingFile: "正在編輯檔案.", // from v2.1.13 added 6.3.2016
      hasSelected: "己選取 $1 個項目.", // from v2.1.13 added 6.3.2016
      hasClipboard: "剪貼簿裡有 $1 個項目.", // from v2.1.13 added 6.3.2016
      incSearchOnly: "增量搜尋只來自目前視圖.", // from v2.1.13 added 6.30.2016
      reinstate: "恢復原狀", // from v2.1.15 added 3.8.2016
      complete: "$1完成", // from v2.1.15 added 21.8.2016
      contextmenu: "情境選單", // from v2.1.15 added 9.9.2016
      pageTurning: "正在換頁", // from v2.1.15 added 10.9.2016
      volumeRoots: "磁碟根目錄", // from v2.1.16 added 16.9.2016
      reset: "重設", // from v2.1.16 added 1.10.2016
      bgcolor: "背景頻色", // from v2.1.16 added 1.10.2016
      colorPicker: "顏色選擇器", // from v2.1.16 added 1.10.2016
      "8pxgrid": "8px 網格", // from v2.1.16 added 4.10.2016
      enabled: "啟用", // from v2.1.16 added 4.10.2016
      disabled: "停用", // from v2.1.16 added 4.10.2016
      emptyIncSearch: "目前視圖的搜尋結果是空的.\\A按 [Enter] 擴大搜尋目標.", // from v2.1.16 added 5.10.2016
      emptyLetSearch: "目前視圖中的第一個字母的搜索結果是空的。", // from v2.1.23 added 24.3.2017
      textLabel: "文字標示", // from v2.1.17 added 13.10.2016
      minsLeft: "剩下 $1 分鐘", // from v2.1.17 added 13.11.2016
      openAsEncoding: "以選擇的編碼重新開啟", // from v2.1.19 added 2.12.2016
      saveAsEncoding: "以選擇的編碼儲存", // from v2.1.19 added 2.12.2016
      selectFolder: "選擇資料夾", // from v2.1.20 added 13.12.2016
      firstLetterSearch: "首字母搜索", // from v2.1.23 added 24.3.2017
      presets: "預置", // from v2.1.25 added 26.5.2017
      tooManyToTrash: "有太多項目,所以不能丟入垃圾桶。", // from v2.1.25 added 9.6.2017
      TextArea: "文字區域", // from v2.1.25 added 14.6.2017
      folderToEmpty: '$1" 資料夾是空的', // from v2.1.25 added 22.6.2017
      filderIsEmpty: '"$1" 資料夾中沒有任何項目', // from v2.1.25 added 22.6.2017
      preference: "偏好", // from v2.1.26 added 28.6.2017
      language: "語言設置", // from v2.1.26 added 28.6.2017
      clearBrowserData: "初始化保存在此瀏覽器中的設置", // from v2.1.26 added 28.6.2017
      toolbarPref: "工具欄設置", // from v2.1.27 added 2.8.2017
      charsLeft: "... 剩下 $1 個字元", // from v2.1.29 added 30.8.2017
      linesLeft: "... 剩下 $1 行", // from v2.1.52 added 16.1.2020
      sum: "總計", // from v2.1.29 added 28.9.2017
      roughFileSize: "粗略的檔案大小", // from v2.1.30 added 2.11.2017
      autoFocusDialog: "滑鼠懸停在對話框內", // from v2.1.30 added 2.11.2017
      select: "選擇", // from v2.1.30 added 23.11.2017
      selectAction: "選擇檔案時的動作", // from v2.1.30 added 23.11.2017
      useStoredEditor: "使用上次的編輯器開啟", // from v2.1.30 added 23.11.2017
      selectinvert: "反向選擇", // from v2.1.30 added 25.11.2017
      renameMultiple: "確定要重新命名 $1 為 $2 嗎?<br/>此動作無法恢復!", // from v2.1.31 added 4.12.2017
      batchRename: "批次重新命名", // from v2.1.31 added 8.12.2017
      plusNumber: "增加數量", // from v2.1.31 added 8.12.2017
      asPrefix: "新增前輟", // from v2.1.31 added 8.12.2017
      asSuffix: "新增後輟", // from v2.1.31 added 8.12.2017
      changeExtention: "變更範圍", // from v2.1.31 added 8.12.2017
      columnPref: " 列設置(列表檢視)", // from v2.1.32 added 6.2.2018
      reflectOnImmediate: "所有修改將立即套用到檔案.", // from v2.1.33 added 2.3.2018
      reflectOnUnmount: "所有修改在卸載之前不會有變化.", // from v2.1.33 added 2.3.2018
      unmountChildren: "安裝在該磁碟以下的磁碟也會卸載,你確定要卸載嗎?", // from v2.1.33 added 5.3.2018
      selectionInfo: "選擇資訊", // from v2.1.33 added 7.3.2018
      hashChecker: "顯示檔案雜湊算法", // from v2.1.33 added 10.3.2018
      infoItems: "檔案資訊(選擇資訊面板)", // from v2.1.38 added 28.3.2018
      pressAgainToExit: "再次點擊後退出", // from v2.1.38 added 1.4.2018
      toolbar: "工具列", // from v2.1.38 added 4.4.2018
      workspace: "工作區", // from v2.1.38 added 4.4.2018
      dialog: "對話框", // from v2.1.38 added 4.4.2018
      all: "全部", // from v2.1.38 added 4.4.2018
      iconSize: "圖示尺寸 (圖示顯示)", // from v2.1.39 added 7.5.2018
      editorMaximized: "開啟最大化編輯視窗", // from v2.1.40 added 30.6.2018
      editorConvNoApi: "由於使用 API 轉換功能目前無法使用,請到網站上轉換.", //from v2.1.40 added 8.7.2018
      editorConvNeedUpload:
        "轉換後,必須上傳檔案網址或一個下載的檔案,以保存轉換後的檔案.", //from v2.1.40 added 8.7.2018
      convertOn: "在 $1 網站上轉換", // from v2.1.40 added 10.7.2018
      integrations: "整合", // from v2.1.40 added 11.7.2018
      integrationWith:
        "elFinder 整合以下外部服務,使用前請先檢查使用條款、隱私權政策等.", // from v2.1.40 added 11.7.2018
      showHidden: "顯示已隱藏的項目", // from v2.1.41 added 24.7.2018
      hideHidden: "隱藏已隱藏的項目", // from v2.1.41 added 24.7.2018
      toggleHidden: "顯示/隱藏已隱藏的項目", // from v2.1.41 added 24.7.2018
      makefileTypes: '允許"新檔案"使用的檔案類型', // from v2.1.41 added 7.8.2018
      typeOfTextfile: "文字檔案類型", // from v2.1.41 added 7.8.2018
      add: "新增", // from v2.1.41 added 7.8.2018
      theme: "主題", // from v2.1.43 added 19.10.2018
      default: "預設", // from v2.1.43 added 19.10.2018
      description: "描述", // from v2.1.43 added 19.10.2018
      website: "網站", // from v2.1.43 added 19.10.2018
      author: "作者", // from v2.1.43 added 19.10.2018
      email: "信箱", // from v2.1.43 added 19.10.2018
      license: "許可證", // from v2.1.43 added 19.10.2018
      exportToSave: "檔案無法存檔,為避免遺失編輯資料,需要導出到你的電腦.", // from v2.1.44 added 1.12.2018
      dblclickToSelect: "連續點擊以選擇", // from v2.1.47 added 22.1.2019
      useFullscreen: "使用全螢幕模式", // from v2.1.47 added 19.2.2019

      /********************************** mimetypes **********************************/
      kindUnknown: "未知",
      kindRoot: "磁碟根目錄", // from v2.1.16 added 16.10.2016
      kindFolder: "資料夾",
      kindSelects: "選擇", // from v2.1.29 added 29.8.2017
      kindAlias: "别名",
      kindAliasBroken: "毀損的别名",
      // applications
      kindApp: "應用程式",
      kindPostscript: "Postscript 文件",
      kindMsOffice: "Microsoft Office 文件",
      kindMsWord: "Microsoft Word 文件",
      kindMsExcel: "Microsoft Excel 文件",
      kindMsPP: "Microsoft Powerpoint 簡報",
      kindOO: "Open Office 文件",
      kindAppFlash: "Flash 應用程式",
      kindPDF: "可攜式文件格式(PDF)",
      kindTorrent: "Bittorrent 檔案",
      kind7z: "7z 壓縮檔",
      kindTAR: "TAR 壓縮檔",
      kindGZIP: "GZIP 壓縮檔",
      kindBZIP: "BZIP 壓縮檔",
      kindXZ: "XZ 壓縮檔",
      kindZIP: "ZIP 壓縮檔",
      kindRAR: "RAR 壓縮檔",
      kindJAR: "Java JAR 檔案",
      kindTTF: "True Type 字體",
      kindOTF: "Open Type 字體",
      kindRPM: "RPM 封裝檔",
      // texts
      kindText: "文字檔案",
      kindTextPlain: "純文字",
      kindPHP: "PHP 原始碼",
      kindCSS: "階層樣式表(CSS)",
      kindHTML: "HTML 文件",
      kindJS: "Javascript 原始碼",
      kindRTF: "富文本(RTF)",
      kindC: "C 原始碼",
      kindCHeader: "C 標頭原始碼",
      kindCPP: "C++ 原始碼",
      kindCPPHeader: "C++ 標頭原始碼",
      kindShell: "Unix Shell 脚本",
      kindPython: "Python 原始碼",
      kindJava: "Java 原始碼",
      kindRuby: "Ruby 原始碼",
      kindPerl: "Perl 原始碼",
      kindSQL: "SQL 原始碼",
      kindXML: "XML 文件",
      kindAWK: "AWK 原始碼",
      kindCSV: "逗號分隔值(CSV)",
      kindDOCBOOK: "Docbook XML 文件",
      kindMarkdown: "Markdown 文本", // added 20.7.2015
      // images
      kindImage: "圖片",
      kindBMP: "BMP 圖片",
      kindJPEG: "JPEG 圖片",
      kindGIF: "GIF 圖片",
      kindPNG: "PNG 圖片",
      kindTIFF: "TIFF 圖片",
      kindTGA: "TGA 圖片",
      kindPSD: "Adobe Photoshop 圖片",
      kindXBITMAP: "X bitmap 圖片",
      kindPXM: "Pixelmator 圖片",
      // media
      kindAudio: "音訊",
      kindAudioMPEG: "MPEG 音訊",
      kindAudioMPEG4: "MPEG-4 音訊",
      kindAudioMIDI: "MIDI 音訊",
      kindAudioOGG: "Ogg Vorbis 音訊",
      kindAudioWAV: "WAV 音訊",
      AudioPlaylist: "MP3 播放清單",
      kindVideo: "影片",
      kindVideoDV: "DV 影片",
      kindVideoMPEG: "MPEG 影片",
      kindVideoMPEG4: "MPEG-4 影片",
      kindVideoAVI: "AVI 影片",
      kindVideoMOV: "Quick Time 影片",
      kindVideoWM: "Windows Media 影片",
      kindVideoFlash: "Flash 影片",
      kindVideoMKV: "Matroska 影片",
      kindVideoOGG: "Ogg 影片"
    }
  };
});
js/i18n/elfinder.he.js000064400000111705151215013360010462 0ustar00/**
 * עברית translation
 * @author Yaron Shahrabani <sh.yaron@gmail.com>
 * @version 2022-03-01
 */
 (function(root, factory) {
	if (typeof define === 'function' && define.amd) {
		define(['elfinder'], factory);
	} else if (typeof exports !== 'undefined') {
		module.exports = factory(require('elfinder'));
	} else {
		factory(root.elFinder);
	}
}(this, function(elFinder) {
	elFinder.prototype.i18.he = {
		translator : 'Yaron Shahrabani &lt;sh.yaron@gmail.com&gt;',
		language   : 'עברית',
		direction  : 'rtl',
		dateFormat : 'd.m.Y H:i', // will show like: 01.03.2022 16:25
		fancyDateFormat : '$1 H:i', // will show like: היום 16:25
		nonameDateFormat : 'ymd-His', // noname upload will show like: 220301-162510
		messages   : {
			'getShareText' : 'שתפו',
			'Editor ': 'עורך קוד',
			/********************************** errors **********************************/
			'error'                : 'שגיאה',
			'errUnknown'           : 'שגיאה בלתי מוכרת.',
			'errUnknownCmd'        : 'פקודה בלתי מוכרת.',
			'errJqui'              : 'תצורת ה־jQuery UI שגויה. יש לכלול רכיבים הניתנים לבחירה, גרירה והשלכה.',
			'errNode'              : 'elFinder דורש יצירה של רכיב DOM.',
			'errURL'               : 'התצורה של elFinder שגויה! אפשרות הכתובת (URL) לא הוגדרה.',
			'errAccess'            : 'הגישה נדחית.',
			'errConnect'           : 'לא ניתן להתחבר למנגנון.',
			'errAbort'             : 'החיבור בוטל.',
			'errTimeout'           : 'זמן החיבור פג.',
			'errNotFound'          : 'לא נמצא מנגנון.',
			'errResponse'          : 'תגובת המנגנון שגויה.',
			'errConf'              : 'תצורת המנגנון שגויה.',
			'errJSON'              : 'המודול PHP JSON לא מותקן.',
			'errNoVolumes'         : 'אין כוננים זמינים לקריאה.',
			'errCmdParams'         : 'פרמטרים שגויים לפקודה „$1“.',
			'errDataNotJSON'       : 'הנתונים אינם JSON.',
			'errDataEmpty'         : 'הנתונים ריקים.',
			'errCmdReq'            : 'בקשה למנגנון דורשת שם פקודה.',
			'errOpen'              : 'לא ניתן לפתוח את „$1“.',
			'errNotFolder'         : 'הפריט אינו תיקייה.',
			'errNotFile'           : 'הפריט אינו קובץ.',
			'errRead'              : 'לא ניתן לקרוא את „$1“.',
			'errWrite'             : 'לא ניתן לכתוב אל „$1“.',
			'errPerm'              : 'ההרשאה נדחתה.',
			'errLocked'            : '„$1“ נעול ואין אפשרות לשנות את שמו, להעבירו או להסירו.',
			'errExists'            : 'קובץ בשם „$1“ כבר קיים.',
			'errInvName'           : 'שם הקובץ שגוי.',
			'errInvDirname'        : 'שם תיקייה לא חוקי.',  // from v2.1.24 added 12.4.2017
			'errFolderNotFound'    : 'התיקייה לא נמצאה.',
			'errFileNotFound'      : 'הקובץ לא נמצא.',
			'errTrgFolderNotFound' : 'תיקיית היעד „$1“ לא נמצאה.',
			'errPopup'             : 'הדפדפן מנע פתיחת חלון קובץ. כדי לפתוח קובץ יש לאפשר זאת בהגדרות הדפדפן.',
			'errMkdir'             : 'לא ניתן ליצור את התיקייה „$1“.',
			'errMkfile'            : 'לא ניתן ליצור את הקובץ „$1“.',
			'errRename'            : 'לא ניתן לשנות את השם של „$1“.',
			'errCopyFrom'          : 'העתקת קבצים מהכונן „$1“ אינה מאופשרת.',
			'errCopyTo'            : 'העתקת קבצים אל הכונן „$1“ אינה מאופשרת.',
			'errMkOutLink'         : 'לא ניתן ליצור קישור אל מחוץ לשורש הנפח.', // from v2.1 added 03.10.2015
			'errUpload'            : 'שגיאת העלאה.',  // old name - errUploadCommon
			'errUploadFile'        : 'לא ניתן להעלות את „$1“.', // old name - errUpload
			'errUploadNoFiles'     : 'לא נמצאו קבצים להעלאה.',
			'errUploadTotalSize'   : 'הנתונים חורגים מהגודל המרבי המותר.', // old name - errMaxSize
			'errUploadFileSize'    : 'הקובץ חורג מהגודל המרבי המותר.', //  old name - errFileMaxSize
			'errUploadMime'        : 'סוג הקובץ אינו מורשה.',
			'errUploadTransfer'    : 'שגיאת העברה „$1“.',
			'errUploadTemp'        : 'לא ניתן ליצור קובץ זמני להעלאה.', // from v2.1 added 26.09.2015
			'errNotReplace'        : 'הפריט „$1“ כבר קיים במיקום זה ואי אפשר להחליפו בפריט מסוג אחר.', // new
			'errReplace'           : 'לא ניתן להחליף את „$1“.',
			'errSave'              : 'לא ניתן לשמור את „$1“.',
			'errCopy'              : 'לא ניתן להעתיק את „$1“.',
			'errMove'              : 'לא ניתן להעביר את „$1“.',
			'errCopyInItself'      : 'לא ניתן להעתיק את „$1“ לתוך עצמו.',
			'errRm'                : 'לא ניתן להסיר את „$1“.',
			'errTrash'             : 'לא ניתן לאשפה.', // from v2.1.24 added 30.4.2017
			'errRmSrc'             : 'לא ניתן להסיר את קובצי המקור.',
			'errExtract'           : 'לא ניתן לחלץ קבצים מהארכיון „$1“.',
			'errArchive'           : 'לא ניתן ליצור ארכיון.',
			'errArcType'           : 'סוג הארכיון אינו נתמך.',
			'errNoArchive'         : 'הקובץ אינו ארכיון או שסוג הקובץ שלו אינו נתמך.',
			'errCmdNoSupport'      : 'המנגנון אינו תומך בפקודה זו.',
			'errReplByChild'       : 'לא ניתן להחליף את התיקייה „$1“ בפריט מתוכה.',
			'errArcSymlinks'       : 'מטעמי אבטחה לא ניתן לחלץ ארכיונים שמכילים קישורים סימבוליים או קבצים עם שמות בלתי מורשים.', // edited 24.06.2012
			'errArcMaxSize'        : 'הארכיון חורג מהגודל המרבי המותר.',
			'errResize'            : 'לא ניתן לשנות את הגודל של „$1“.',
			'errResizeDegree'      : 'מעלות ההיפוך שגויות.',  // added 7.3.2013
			'errResizeRotate'      : 'לא ניתן להפוך את התמונה.',  // added 7.3.2013
			'errResizeSize'        : 'גודל התמונה שגוי.',  // added 7.3.2013
			'errResizeNoChange'    : 'גודל התמונה לא השתנה.',  // added 7.3.2013
			'errUsupportType'      : 'סוג הקובץ אינו נתמך.',
			'errNotUTF8Content'    : 'הקובץ „$1“ הוא לא בתסדיר UTF-8 ולא ניתן לערוך אותו.',  // added 9.11.2011
			'errNetMount'          : 'לא ניתן לעגן את „$1“.', // added 17.04.2012
			'errNetMountNoDriver'  : 'פרוטוקול בלתי נתמך.',     // added 17.04.2012
			'errNetMountFailed'    : 'העיגון נכשל.',         // added 17.04.2012
			'errNetMountHostReq'   : 'נדרש מארח.', // added 18.04.2012
			'errSessionExpires'    : 'ההפעלה שלך פגה עקב חוסר פעילות.',
			'errCreatingTempDir'   : 'לא ניתן ליצור תיקייה זמנית: „$1“',
			'errFtpDownloadFile'   : 'לא ניתן להוריד קובץ מ־ FTP: „$1“',
			'errFtpUploadFile'     : 'לא ניתן להעלות קובץ ל־FTP: „$1“',
			'errFtpMkdir'          : 'לא ניתן ליצור תיקייה מרוחקת ב־FTP: „$1“',
			'errArchiveExec'       : 'שמירת הקבצים בארכיון נכשלה: „$1“',
			'errExtractExec'       : 'חילוץ קבצים נכשל: „$1“',
			'errNetUnMount'        : 'Unable to unmount.', // from v2.1 added 30.04.2012
			'errConvUTF8'          : 'לא ניתן להמרה ל-UTF-8', // from v2.1 added 08.04.2014
			'errFolderUpload'      : 'נסה את הדפדפן המודרני, אם תרצה להעלות את התיקיה.', // from v2.1 added 26.6.2015
			'errSearchTimeout'     : 'תם הזמן הקצוב בזמן חיפוש "$1". תוצאת החיפוש היא חלקית.', // from v2.1 added 12.1.2016
			'errReauthRequire'     : 'נדרש אישור מחדש.', // from v2.1.10 added 24.3.2016
			'errMaxTargets'        : 'המספר המרבי של פריטים לבחירה הוא $1.', // from v2.1.17 added 17.10.2016
			'errRestore'           : 'לא ניתן לשחזר מהאשפה. לא ניתן לזהות את יעד השחזור.', // from v2.1.24 added 3.5.2017
			'errEditorNotFound'    : 'עורך לא נמצא לסוג קובץ זה.', // from v2.1.25 added 23.5.2017
			'errServerError'       : 'אירעה שגיאה בצד השרת.', // from v2.1.25 added 16.6.2017
			'errEmpty'             : 'לא ניתן לרוקן את התיקייה "$1".', // from v2.1.25 added 22.6.2017
			'moreErrors'           : 'יש $1 שגיאות נוספות.', // from v2.1.44 added 9.12.2018
			'errMaxMkdirs'         : 'אתה יכול ליצור עד $1 תיקיות בבת אחת.', // from v2.1.58 added 20.6.2021

			/******************************* commands names ********************************/
			'cmdarchive'   : 'יצירת ארכיון',
			'cmdback'      : 'חזרה',
			'cmdcopy'      : 'העתקה',
			'cmdcut'       : 'גזירה',
			'cmddownload'  : 'הורדה',
			'cmdduplicate' : 'שכפול',
			'cmdedit'      : 'עריכת קובץ',
			'cmdextract'   : 'חילוץ קבצים מארכיון',
			'cmdforward'   : 'העברה',
			'cmdgetfile'   : 'בחירת קבצים',
			'cmdhelp'      : 'פרטים על התכנית הזו',
			'cmdhome'      : 'בית',
			'cmdinfo'      : 'קבלת מידע',
			'cmdmkdir'     : 'תיקייה חדשה',
			'cmdmkdirin'   : 'לתוך תיקייה חדשה', // from v2.1.7 added 19.2.2016
			'cmdmkfile'    : 'קובץ חדש',
			'cmdopen'      : 'פתיחה',
			'cmdpaste'     : 'הדבקה',
			'cmdquicklook' : 'תצוגה מקדימה',
			'cmdreload'    : 'רענון',
			'cmdrename'    : 'שינוי שם',
			'cmdrm'        : 'מחיקה',
			'cmdtrash'     : 'לפח', //from v2.1.24 added 29.4.2017
			'cmdrestore'   : 'לשחזר', //from v2.1.24 added 3.5.2017
			'cmdsearch'    : 'חיפוש קבצים',
			'cmdup'        : 'מעבר לתיקיית ההורה',
			'cmdupload'    : 'העלאת קבצים',
			'cmdview'      : 'תצוגה',
			'cmdresize'    : 'שינוי גודל והיפוך',
			'cmdsort'      : 'מיון',
			'cmdnetmount'  : 'עיגון כונן רשת', // added 18.04.2012
			'cmdnetunmount': 'Unmount', // from v2.1 added 30.04.2012
			'cmdplaces'    : 'למקומות', // added 28.12.2014
			'cmdchmod'     : 'שנה מצב', // from v2.1 added 20.6.2015
			'cmdopendir'   : 'פתח תיקיה', // from v2.1 added 13.1.2016
			'cmdcolwidth'  : 'אפס את רוחב העמודה', // from v2.1.13 added 12.06.2016
			'cmdfullscreen': 'מסך מלא', // from v2.1.15 added 03.08.2016
			'cmdmove'      : 'לָזוּז', // from v2.1.15 added 21.08.2016
			'cmdempty'     : 'רוקן את התיקיה', // from v2.1.25 added 22.06.2017
			'cmdundo'      : 'לבטל', // from v2.1.27 added 31.07.2017
			'cmdredo'      : 'לַעֲשׂוֹת שׁוּב', // from v2.1.27 added 31.07.2017
			'cmdpreference': 'העדפות', // from v2.1.27 added 03.08.2017
			'cmdselectall' : 'בחר הכל', // from v2.1.28 added 15.08.2017
			'cmdselectnone': 'בחר אף אחד', // from v2.1.28 added 15.08.2017
			'cmdselectinvert': 'בחירה הפוך', // from v2.1.28 added 15.08.2017
			'cmdopennew'   : 'פתח בחלון חדש', // from v2.1.38 added 3.4.2018
			'cmdhide'      : 'הסתר (העדפה)', // from v2.1.41 added 24.7.2018

			/*********************************** buttons ***********************************/
			'btnClose'  : 'סגירה',
			'btnSave'   : 'שמירה',
			'btnRm'     : 'הסרה',
			'btnApply'  : 'החלה',
			'btnCancel' : 'ביטול',
			'btnNo'     : 'לא',
			'btnYes'    : 'כן',
			'btnMount'  : 'עיגון',  // added 18.04.2012
			'btnApprove': 'עבור אל $1 ואשר', // from v2.1 added 26.04.2012
			'btnUnmount': 'Unmount', // from v2.1 added 30.04.2012
			'btnConv'   : 'להמיר', // from v2.1 added 08.04.2014
			'btnCwd'    : 'כאן',      // from v2.1 added 22.5.2015
			'btnVolume' : 'כרך',    // from v2.1 added 22.5.2015
			'btnAll'    : 'את כל',       // from v2.1 added 22.5.2015
			'btnMime'   : 'סוג MIME', // from v2.1 added 22.5.2015
			'btnFileName':'שם קובץ',  // from v2.1 added 22.5.2015
			'btnSaveClose': 'שמור וסגור', // from v2.1 added 12.6.2015
			'btnBackup' : 'גיבוי', // fromv2.1 added 28.11.2015
			'btnRename'    : 'שנה שם',      // from v2.1.24 added 6.4.2017
			'btnRenameAll' : 'שנה שם (הכל)', // from v2.1.24 added 6.4.2017
			'btnPrevious' : 'הקודם ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnNext'     : 'הבא ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnSaveAs'   : 'שמור בשם', // from v2.1.25 added 24.5.2017

			/******************************** notifications ********************************/
			'ntfopen'     : 'פתיחת תיקייה',
			'ntffile'     : 'פתיחת קובץ',
			'ntfreload'   : 'רענון תוכן התיקייה',
			'ntfmkdir'    : 'תיקייה נוצרת',
			'ntfmkfile'   : 'קבצים נוצרים',
			'ntfrm'       : 'קבצים נמחקים',
			'ntfcopy'     : 'קבצים מועתקים',
			'ntfmove'     : 'קבצים מועברים',
			'ntfprepare'  : 'העתקת קבצים בהכנה',
			'ntfrename'   : 'שמות קבצים משתנים',
			'ntfupload'   : 'קבצים נשלחים',
			'ntfdownload' : 'קבצים מתקבלים',
			'ntfsave'     : 'שמירת קבצים',
			'ntfarchive'  : 'ארכיון נוצר',
			'ntfextract'  : 'מחולצים קבצים מארכיון',
			'ntfsearch'   : 'קבצים בחיפוש',
			'ntfresize'   : 'גודל קבצים משתנה',
			'ntfsmth'     : 'מתבצעת פעולה',
			'ntfloadimg'  : 'נטענת תמונה',
			'ntfnetmount' : 'כונן רשת מעוגן', // added 18.04.2012
			'ntfnetunmount': 'Unmounting network volume', // from v2.1 added 30.04.2012
			'ntfdim'      : 'ממדי תמונה מתקבלים', // added 20.05.2013
			'ntfreaddir'  : 'קריאת מידע על תיקיות', // from v2.1 added 01.07.2013
			'ntfurl'      : 'מקבל את כתובת האתר של הקישור', // from v2.1 added 11.03.2014
			'ntfchmod'    : 'שינוי מצב קובץ', // from v2.1 added 20.6.2015
			'ntfpreupload': 'מאמת את שם הקובץ להעלאה', // from v2.1 added 31.11.2015
			'ntfzipdl'    : 'יצירת קובץ להורדה', // from v2.1.7 added 23.1.2016
			'ntfparents'  : 'קבלת מידע על נתיב', // from v2.1.17 added 2.11.2016
			'ntfchunkmerge': 'מעבד את הקובץ שהועלה', // from v2.1.17 added 2.11.2016
			'ntftrash'    : 'עושה לזרוק לפח', // from v2.1.24 added 2.5.2017
			'ntfrestore'  : 'עושה שחזור מהאשפה', // from v2.1.24 added 3.5.2017
			'ntfchkdir'   : 'בודק תיקיית יעד', // from v2.1.24 added 3.5.2017
			'ntfundo'     : 'מבטל פעולה קודמת', // from v2.1.27 added 31.07.2017
			'ntfredo'     : 'ביצוע מחדש של ביטול קודמים', // from v2.1.27 added 31.07.2017
			'ntfchkcontent' : 'בדיקת תכולה', // from v2.1.41 added 3.8.2018

			/*********************************** volumes *********************************/
			'volume_Trash' : 'פַּח אַשׁפָּה', //from v2.1.24 added 29.4.2017

			/************************************ dates **********************************/
			'dateUnknown' : 'לא ידוע',
			'Today'       : 'היום',
			'Yesterday'   : 'מחר',
			'msJan'       : 'ינו׳',
			'msFeb'       : 'פבר׳',
			'msMar'       : 'מרץ',
			'msApr'       : 'אפר׳',
			'msMay'       : 'מאי',
			'msJun'       : 'יונ׳',
			'msJul'       : 'יול׳',
			'msAug'       : 'אוג׳',
			'msSep'       : 'ספט׳',
			'msOct'       : 'אוק׳',
			'msNov'       : 'נוב׳',
			'msDec'       : 'דצמ׳',
			'January'     : 'ינואר',
			'February'    : 'פברואר',
			'March'       : 'מרץ',
			'April'       : 'אפריל',
			'May'         : 'מאי',
			'June'        : 'יוני',
			'July'        : 'יולי',
			'August'      : 'אוגוסט',
			'September'   : 'ספטמבר',
			'October'     : 'אוקטובר',
			'November'    : 'נובמבר',
			'December'    : 'דצמבר',
			'Sunday'      : 'יום ראשון',
			'Monday'      : 'יום שני',
			'Tuesday'     : 'יום שלישי',
			'Wednesday'   : 'יום רביעי',
			'Thursday'    : 'יום חמישי',
			'Friday'      : 'יום שישי',
			'Saturday'    : 'שבת',
			'Sun'         : 'א׳',
			'Mon'         : 'ב׳',
			'Tue'         : 'ג׳',
			'Wed'         : 'ד׳',
			'Thu'         : 'ה',
			'Fri'         : 'ו׳',
			'Sat'         : 'ש׳',

			/******************************** sort variants ********************************/
			'sortname'          : 'לפי שם',
			'sortkind'          : 'לפי סוג',
			'sortsize'          : 'לפי גודל',
			'sortdate'          : 'לפי תאריך',
			'sortFoldersFirst'  : 'תיקיות תחילה',
			'sortperm'          : 'על פי רשות', // from v2.1.13 added 13.06.2016
			'sortmode'          : 'לפי מצב',       // from v2.1.13 added 13.06.2016
			'sortowner'         : 'by ownerלפי הבעלים',      // from v2.1.13 added 13.06.2016
			'sortgroup'         : 'לפי קבוצה',      // from v2.1.13 added 13.06.2016
			'sortAlsoTreeview'  : 'גם Treeview',  // from v2.1.15 added 01.08.2016

			/********************************** new items **********************************/
			'untitled file.txt' : 'NewFile.txt', // added 10.11.2015
			'untitled folder'   : 'תיקייה חדשה',   // added 10.11.2015
			'Archive'           : 'ארכיון חדש',  // from v2.1 added 10.11.2015
			'untitled file'     : 'קובץ חדש.$1',  // from v2.1.41 added 6.8.2018
			'extentionfile'     : '$1: קובץ',    // from v2.1.41 added 6.8.2018
			'extentiontype'     : '$1: $2',      // from v2.1.43 added 17.10.2018

			/********************************** messages **********************************/
			'confirmReq'      : 'נדרש אישור',
			'confirmRm'       : 'להסיר את הקבצים?<br/>פעולה זו בלתי הפיכה!',
			'confirmRepl'     : 'להחליף קובץ ישן בקובץ חדש?',
			'confirmRest'     : 'להחליף את הפריט הקיים בפריט שנמצא באשפה?', // fromv2.1.24 added 5.5.2017
			'confirmConvUTF8' : 'לא ב-UTF-8<br/>המר ל-UTF-8?<br/>התוכן הופך ל-UTF-8 על ידי שמירה לאחר המרה.', // from v2.1 added 08.04.2014
			'confirmNonUTF8'  : 'לא ניתן לזהות את קידוד התווים של הקובץ הזה. זה צריך להמיר זמנית ל-UTF-8 לצורך עריכה.<br/>אנא בחר קידוד תווים של קובץ זה.', // from v2.1.19 added 28.11.2016
			'confirmNotSave'  : 'הוא השתנה.<br/>מאבד עבודה אם לא תשמור שינויים.', // from v2.1 added 15.7.2015
			'confirmTrash'    : 'האם אתה בטוח שברצונך להעביר פריטים לפח האשפה?', //from v2.1.24 added 29.4.2017
			'confirmMove'     : 'האם אתה בטוח שברצונך להעביר פריטים ל-"$1"?', //from v2.1.50 added 27.7.2019
			'apllyAll'        : 'להחיל על הכול',
			'name'            : 'שם',
			'size'            : 'גודל',
			'perms'           : 'הרשאות',
			'modify'          : 'שינוי',
			'kind'            : 'סוג',
			'read'            : 'קריאה',
			'write'           : 'כתיבה',
			'noaccess'        : 'אין גישה',
			'and'             : 'וגם',
			'unknown'         : 'לא ידוע',
			'selectall'       : 'בחירת כל הקבצים',
			'selectfiles'     : 'בחירת קובץ אחד ומעלה',
			'selectffile'     : 'בחירת הקובץ הראשון',
			'selectlfile'     : 'בחירת הקובץ האחרון',
			'viewlist'        : 'תצוגת רשימה',
			'viewicons'       : 'תצוגת סמלים',
			'viewSmall'       : 'אייקונים קטנים', // from v2.1.39 added 22.5.2018
			'viewMedium'      : 'אייקונים בינוניים', // from v2.1.39 added 22.5.2018
			'viewLarge'       : 'אייקונים גדולים', // from v2.1.39 added 22.5.2018
			'viewExtraLarge'  : 'סמלים גדולים במיוחד', // from v2.1.39 added 22.5.2018
			'places'          : 'מיקומים',
			'calc'            : 'חישוב',
			'path'            : 'נתיב',
			'aliasfor'        : 'כינוי עבור',
			'locked'          : 'נעול',
			'dim'             : 'ממדים',
			'files'           : 'קבצים',
			'folders'         : 'תיקיות',
			'items'           : 'פריטים',
			'yes'             : 'כן',
			'no'              : 'לא',
			'link'            : 'קישור',
			'searcresult'     : 'תוצאות חיפוש',
			'selected'        : 'קבצים נבחרים',
			'about'           : 'על אודות',
			'shortcuts'       : 'קיצורי דרך',
			'help'            : 'עזרה',
			'webfm'           : 'מנהל קבצים בדפדפן',
			'ver'             : 'גרסה',
			'protocolver'     : 'גרסת פרוטוקול',
			'homepage'        : 'דף הבית של המיזם',
			'docs'            : 'תיעוד',
			'github'          : 'פילוג עותק ב־Github',
			'twitter'         : 'לעקוב אחרינו בטוויטר',
			'facebook'        : 'להצטרף אלינו בפייסבוק',
			'team'            : 'צוות',
			'chiefdev'        : 'מפתח ראשי',
			'developer'       : 'מתכנת',
			'contributor'     : 'תורם',
			'maintainer'      : 'מתחזק',
			'translator'      : 'מתרגם',
			'icons'           : 'סמלים',
			'dontforget'      : 'לא לשכוח לקחת את המגבת שלך',
			'shortcutsof'     : 'קיצורי הדרך מנוטרלים',
			'dropFiles'       : 'ניתן להשליך את הקבצים לכאן',
			'or'              : 'או',
			'selectForUpload' : 'לבחור קבצים להעלאה',
			'moveFiles'       : 'העברת קבצים',
			'copyFiles'       : 'העתקת קבצים',
			'restoreFiles'    : 'שחזור פריטים', // from v2.1.24 added 5.5.2017
			'rmFromPlaces'    : 'הסרה ממיקומים',
			'aspectRatio'     : 'יחס תצוגה',
			'scale'           : 'מתיחה',
			'width'           : 'רוחב',
			'height'          : 'גובה',
			'resize'          : 'שינוי הגודל',
			'crop'            : 'חיתוך',
			'rotate'          : 'היפוך',
			'rotate-cw'       : 'היפוך ב־90 מעלות נגד השעון',
			'rotate-ccw'      : 'היפוך ב־90 מעלות עם השעון CCW',
			'degree'          : '°',
			'netMountDialogTitle' : 'עיגון כונן רשת', // added 18.04.2012
			'protocol'            : 'פרוטוקול', // added 18.04.2012
			'host'                : 'מארח', // added 18.04.2012
			'port'                : 'פתחה', // added 18.04.2012
			'user'                : 'משתמש', // added 18.04.2012
			'pass'                : 'ססמה', // added 18.04.2012
			'confirmUnmount'      : 'האם אתה מבטל $1?',  // from v2.1 added 30.04.2012
			'dropFilesBrowser': 'שחרר או הדבק קבצים מהדפדפן', // from v2.1 added 30.05.2012
			'dropPasteFiles'  : 'שחרר קבצים, הדבק כתובות URL או תמונות (לוח) כאן', // from v2.1 added 07.04.2014
			'encoding'        : 'הקידוד', // from v2.1 added 19.12.2014
			'locale'          : 'שפה',   // from v2.1 added 19.12.2014
			'searchTarget'    : 'יעד: $1',                // from v2.1 added 22.5.2015
			'searchMime'      : 'חפש לפי סוג MIME קלט', // from v2.1 added 22.5.2015
			'owner'           : 'בעלים', // from v2.1 added 20.6.2015
			'group'           : 'קְבוּצָה', // from v2.1 added 20.6.2015
			'other'           : 'אַחֵר', // from v2.1 added 20.6.2015
			'execute'         : 'לבצע', // from v2.1 added 20.6.2015
			'perm'            : 'רְשׁוּת', // from v2.1 added 20.6.2015
			'mode'            : 'Mode', // from v2.1 added 20.6.2015
			'emptyFolder'     : 'התיקייה ריקה', // from v2.1.6 added 30.12.2015
			'emptyFolderDrop' : 'התיקיה ריקה\\השחרר כדי להוסיף פריטים', // from v2.1.6 added 30.12.2015
			'emptyFolderLTap' : 'התיקיה ריקה\\הקשה ארוכה כדי להוסיף פריטים', // from v2.1.6 added 30.12.2015
			'quality'         : 'איכות', // from v2.1.6 added 5.1.2016
			'autoSync'        : 'סנכרון אוטומטי',  // from v2.1.6 added 10.1.2016
			'moveUp'          : 'לזוז למעלה',  // from v2.1.6 added 18.1.2016
			'getLink'         : 'קבל קישור כתובת URL', // from v2.1.7 added 9.2.2016
			'selectedItems'   : 'פריטים נבחרים ($1)', // from v2.1.7 added 2.19.2016
			'folderId'        : 'מזהה תיקייה', // from v2.1.10 added 3.25.2016
			'offlineAccess'   : 'אפשר גישה לא מקוונת', // from v2.1.10 added 3.25.2016
			'reAuth'          : 'לאימות מחדש', // from v2.1.10 added 3.25.2016
			'nowLoading'      : 'כעת טוען...', // from v2.1.12 added 4.26.2016
			'openMulti'       : 'פתח מספר קבצים', // from v2.1.12 added 5.14.2016
			'openMultiConfirm': 'אתה מנסה לפתוח את קבצי $1. האם אתה בטוח שברצונך לפתוח בדפדפן?', // from v2.1.12 added 5.14.2016
			'emptySearch'     : 'תוצאות החיפוש ריקות ביעד החיפוש.', // from v2.1.12 added 5.16.2016
			'editingFile'     : 'זה עריכת קובץ.', // from v2.1.13 added 6.3.2016
			'hasSelected'     : 'בחרת $1 פריטים.', // from v2.1.13 added 6.3.2016
			'hasClipboard'    : 'יש לך $1 פריטים בלוח.', // from v2.1.13 added 6.3.2016
			'incSearchOnly'   : 'חיפוש מצטבר הוא רק מהתצוגה הנוכחית.', // from v2.1.13 added 6.30.2016
			'reinstate'       : 'חזרה לשגרה', // from v2.1.15 added 3.8.2016
			'complete'        : '$1 הושלם', // from v2.1.15 added 21.8.2016
			'contextmenu'     : 'תפריט הקשר', // from v2.1.15 added 9.9.2016
			'pageTurning'     : 'הפיכת עמודים', // from v2.1.15 added 10.9.2016
			'volumeRoots'     : 'שורשי נפח', // from v2.1.16 added 16.9.2016
			'reset'           : 'איפוס', // from v2.1.16 added 1.10.2016
			'bgcolor'         : 'צבע רקע', // from v2.1.16 added 1.10.2016
			'colorPicker'     : 'בוחר צבעים', // from v2.1.16 added 1.10.2016
			'8pxgrid'         : '8 פיקסלים רשת', // from v2.1.16 added 4.10.2016
			'enabled'         : 'מופעל', // from v2.1.16 added 4.10.2016
			'disabled'        : 'מושבת', // from v2.1.16 added 4.10.2016
			'emptyIncSearch'  : 'תוצאות החיפוש ריקות בתצוגה הנוכחית.\\Aלחץ על [Enter] כדי להרחיב את יעד החיפוש.', // from v2.1.16 added 5.10.2016
			'emptyLetSearch'  : 'תוצאות החיפוש של האות הראשונה ריקות בתצוגה הנוכחית.', // from v2.1.23 added 24.3.2017
			'textLabel'       : 'תווית טקסט', // from v2.1.17 added 13.10.2016
			'minsLeft'        : 'נותרה 1 דקות', // from v2.1.17 added 13.11.2016
			'openAsEncoding'  : 'פתח מחדש עם הקידוד שנבחר', // from v2.1.19 added 2.12.2016
			'saveAsEncoding'  : 'שמור עם הקידוד שנבחר', // from v2.1.19 added 2.12.2016
			'selectFolder'    : 'בחר תיקייה', // from v2.1.20 added 13.12.2016
			'firstLetterSearch': 'חיפוש באות ראשונה', // from v2.1.23 added 24.3.2017
			'presets'         : 'הגדרות קבועות מראש', // from v2.1.25 added 26.5.2017
			'tooManyToTrash'  : 'זה יותר מדי פריטים כך שהוא לא יכול לאשפה.', // from v2.1.25 added 9.6.2017
			'TextArea'        : 'TextArea', // from v2.1.25 added 14.6.2017
			'folderToEmpty'   : 'רוקן את התיקיה "$1".', // from v2.1.25 added 22.6.2017
			'filderIsEmpty'   : 'אין פריטים בתיקייה "$1".', // from v2.1.25 added 22.6.2017
			'preference'      : 'הַעֲדָפָה', // from v2.1.26 added 28.6.2017
			'language'        : 'שפה', // from v2.1.26 added 28.6.2017
			'clearBrowserData': 'אתחל את ההגדרות שנשמרו בדפדפן זה', // from v2.1.26 added 28.6.2017
			'toolbarPref'     : 'הגדרות סרגל הכלים', // from v2.1.27 added 2.8.2017
			'charsLeft'       : '... נותרו $1 תווים.',  // from v2.1.29 added 30.8.2017
			'linesLeft'       : '... נותרו שורות 1$.',  // from v2.1.52 added 16.1.2020
			'sum'             : 'סְכוּם', // from v2.1.29 added 28.9.2017
			'roughFileSize'   : 'גודל קובץ מחוספס', // from v2.1.30 added 2.11.2017
			'autoFocusDialog' : 'התמקד באלמנט של דיאלוג עם העברה בעכבר',  // from v2.1.30 added 2.11.2017
			'select'          : 'בחר', // from v2.1.30 added 23.11.2017
			'selectAction'    : 'פעולה בעת בחירת קובץ', // from v2.1.30 added 23.11.2017
			'useStoredEditor' : 'פתח עם העורך שבו השתמשת בפעם הקודמת', // from v2.1.30 added 23.11.2017
			'selectinvert'    : 'בחירה הפוך', // from v2.1.30 added 25.11.2017
			'renameMultiple'  : 'האם אתה בטוח שברצונך לשנות את השם של $1 פריטים נבחרים כמו $2?<br/>לא ניתן לבטל זאת!', // from v2.1.31 added 4.12.2017
			'batchRename'     : 'שינוי שם אצווה', // from v2.1.31 added 8.12.2017
			'plusNumber'      : '+ מספר', // from v2.1.31 added 8.12.2017
			'asPrefix'        : 'הוסף קידומת', // from v2.1.31 added 8.12.2017
			'asSuffix'        : 'הוסיפו סיומת', // from v2.1.31 added 8.12.2017
			'changeExtention' : 'שנה סיומת', // from v2.1.31 added 8.12.2017
			'columnPref'      : 'הגדרות עמודות (תצוגת רשימה)', // from v2.1.32 added 6.2.2018
			'reflectOnImmediate' : 'כל השינויים ישתקפו מיד לארכיון.', // from v2.1.33 added 2.3.2018
			'reflectOnUnmount'   : 'כל השינויים לא ישתקפו עד לביטול הטעינה של אמצעי אחסון זה.', // from v2.1.33 added 2.3.2018
			'unmountChildren' : 'הכרך/ים הבאים שהותקנו על הכרך הזה בוטלו גם הם. האם אתה בטוח שתבטל אותו?', // from v2.1.33 added 5.3.2018
			'selectionInfo'   : 'מידע בחירה', // from v2.1.33 added 7.3.2018
			'hashChecker'     : 'אלגוריתמים להצגת ה-hash של הקובץ', // from v2.1.33 added 10.3.2018
			'infoItems'       : 'פריטי מידע (חלונית פרטי בחירה)', // from v2.1.38 added 28.3.2018
			'pressAgainToExit': 'לחץ שוב כדי לצאת.', // from v2.1.38 added 1.4.2018
			'toolbar'         : 'סרגל כלים', // from v2.1.38 added 4.4.2018
			'workspace'       : 'חלל עבודה', // from v2.1.38 added 4.4.2018
			'dialog'          : 'דיאלוג', // from v2.1.38 added 4.4.2018
			'all'             : 'את כל', // from v2.1.38 added 4.4.2018
			'iconSize'        : 'גודל סמל (תצוגת סמלים)', // from v2.1.39 added 7.5.2018
			'editorMaximized' : 'פתח את חלון העורך המקסימלי', // from v2.1.40 added 30.6.2018
			'editorConvNoApi' : 'מכיוון שהמרה באמצעות API אינה זמינה כעת, אנא המרה באתר.', //from v2.1.40 added 8.7.2018
			'editorConvNeedUpload' : 'לאחר ההמרה, עליך להעלות עם כתובת האתר של הפריט או קובץ שהורדת כדי לשמור את הקובץ שהומר.', //from v2.1.40 added 8.7.2018
			'convertOn'       : 'המר באתר של $1', // from v2.1.40 added 10.7.2018
			'integrations'    : 'אינטגרציות', // from v2.1.40 added 11.7.2018
			'integrationWith' : 'ל-elFinder זה משולבים השירותים החיצוניים הבאים. אנא בדוק את תנאי השימוש, מדיניות הפרטיות וכו\' לפני השימוש בו.', // from v2.1.40 added 11.7.2018
			'showHidden'      : 'הצג פריטים מוסתרים', // from v2.1.41 added 24.7.2018
			'hideHidden'      : 'הסתר פריטים מוסתרים', // from v2.1.41 added 24.7.2018
			'toggleHidden'    : 'הצג/הסתר פריטים מוסתרים', // from v2.1.41 added 24.7.2018
			'makefileTypes'   : 'סוגי קבצים להפעלה עם "קובץ חדש"', // from v2.1.41 added 7.8.2018
			'typeOfTextfile'  : 'סוג קובץ הטקסט', // from v2.1.41 added 7.8.2018
			'add'             : 'לְהוֹסִיף', // from v2.1.41 added 7.8.2018
			'theme'           : 'תמה', // from v2.1.43 added 19.10.2018
			'default'         : 'בְּרִירַת מֶחדָל', // from v2.1.43 added 19.10.2018
			'description'     : 'תיאור', // from v2.1.43 added 19.10.2018
			'website'         : 'Websiteאתר אינטרנט', // from v2.1.43 added 19.10.2018
			'author'          : 'מְחַבֵּר', // from v2.1.43 added 19.10.2018
			'email'           : 'אימייל', // from v2.1.43 added 19.10.2018
			'license'         : 'רישיון', // from v2.1.43 added 19.10.2018
			'exportToSave'    : 'לא ניתן לשמור את הפריט הזה. כדי למנוע אובדן של העריכות, עליך לייצא למחשב האישי שלך.', // from v2.1.44 added 1.12.2018
			'dblclickToSelect': 'לחץ פעמיים על הקובץ כדי לבחור אותו.', // from v2.1.47 added 22.1.2019
			'useFullscreen'   : 'השתמש במצב מסך מלא', // from v2.1.47 added 19.2.2019

			/********************************** mimetypes **********************************/
			'kindUnknown'     : 'בלתי ידוע',
			'kindRoot'        : 'שורש נפח', // from v2.1.16 added 16.10.2016
			'kindFolder'      : 'תיקייה',
			'kindSelects'     : 'סלקציות', // from v2.1.29 added 29.8.2017
			'kindAlias'       : 'כינוי',
			'kindAliasBroken' : 'כינוי שבור',
			// applications
			'kindApp'         : 'יישום',
			'kindPostscript'  : 'מסמך Postscript',
			'kindMsOffice'    : 'מסמך Microsoft Office',
			'kindMsWord'      : 'מסמך Microsoft Word',
			'kindMsExcel'     : 'מסמך Microsoft Excel',
			'kindMsPP'        : 'מצגת Microsoft Powerpoint',
			'kindOO'          : 'מסמך Open Office',
			'kindAppFlash'    : 'יישום Flash',
			'kindPDF'         : 'פורמט מסמך נייד (PDF)',
			'kindTorrent'     : 'קובץ Bittorrent',
			'kind7z'          : 'ארכיון 7z',
			'kindTAR'         : 'ארכיון TAR',
			'kindGZIP'        : 'ארכיון GZIP',
			'kindBZIP'        : 'ארכיון BZIP',
			'kindXZ'          : 'ארכיון XZ',
			'kindZIP'         : 'ארכיון ZIP',
			'kindRAR'         : 'ארכיון RAR',
			'kindJAR'         : 'קובץ JAR של Java',
			'kindTTF'         : 'גופן True Type',
			'kindOTF'         : 'גופן Open Type',
			'kindRPM'         : 'חבילת RPM',
			// texts
			'kindText'        : 'מסמך טקסט',
			'kindTextPlain'   : 'טקסט פשוט',
			'kindPHP'         : 'מקור PHP',
			'kindCSS'         : 'גיליון סגנון מדורג',
			'kindHTML'        : 'מסמך HTML',
			'kindJS'          : 'מקור Javascript',
			'kindRTF'         : 'תבנית טקסט עשיר',
			'kindC'           : 'מקור C',
			'kindCHeader'     : 'מקור כותרת C',
			'kindCPP'         : 'מקור C++',
			'kindCPPHeader'   : 'מקור כותרת C++',
			'kindShell'       : 'תסריט מעטפת יוניקס',
			'kindPython'      : 'מקור Python',
			'kindJava'        : 'מקור Java',
			'kindRuby'        : 'מקור Ruby',
			'kindPerl'        : 'תסריט Perl',
			'kindSQL'         : 'מקור SQL',
			'kindXML'         : 'מקור XML',
			'kindAWK'         : 'מקור AWK',
			'kindCSV'         : 'ערכים מופרדים בפסיקים',
			'kindDOCBOOK'     : 'מסמךDocbook XML',
			'kindMarkdown'    : 'טקסט של סימון', // added 20.7.2015
			// images
			'kindImage'       : 'תמונה',
			'kindBMP'         : 'תמונת BMP',
			'kindJPEG'        : 'תמונת JPEG',
			'kindGIF'         : 'תמונת GIF',
			'kindPNG'         : 'תמונת PNG',
			'kindTIFF'        : 'תמונת TIFF',
			'kindTGA'         : 'תמונת TGA',
			'kindPSD'         : 'תמונת Adobe Photoshop',
			'kindXBITMAP'     : 'תמונת מפת סיביות X',
			'kindPXM'         : 'תמונת Pixelmator',
			// media
			'kindAudio'       : 'מדיה מסוג שמע',
			'kindAudioMPEG'   : 'שמע MPEG',
			'kindAudioMPEG4'  : 'שמע MPEG-4',
			'kindAudioMIDI'   : 'שמע MIDI',
			'kindAudioOGG'    : 'שמע Ogg Vorbis',
			'kindAudioWAV'    : 'שמע WAV',
			'AudioPlaylist'   : 'רשימת נגינה MP3',
			'kindVideo'       : 'מדיה מסוג וידאו',
			'kindVideoDV'     : 'סרטון DV',
			'kindVideoMPEG'   : 'סרטון MPEG',
			'kindVideoMPEG4'  : 'סרטון MPEG-4',
			'kindVideoAVI'    : 'סרטון AVI',
			'kindVideoMOV'    : 'סרטון Quick Time',
			'kindVideoWM'     : 'סרטון Windows Media',
			'kindVideoFlash'  : 'סרטון Flash',
			'kindVideoMKV'    : 'סרטון Matroska',
			'kindVideoOGG'    : 'סרטון Ogg'
		}
	};
}));js/i18n/elfinder.ar.js000064400000116054151215013360010472 0ustar00/**
 * Arabic translation
 * @author Khamis Alqutob <alqutob@outlook.com>
 * @author Tawfek Daghistani <tawfekov@gmail.com>
 * @author Atef Ben Ali <atef.bettaib@gmail.com>
 * @version 2022-02-25
 */
 (function(root, factory) {
	if (typeof define === 'function' && define.amd) {
		define(['elfinder'], factory);
	} else if (typeof exports !== 'undefined') {
		module.exports = factory(require('elfinder'));
	} else {
		factory(root.elFinder);
	}
}(this, function(elFinder) {
	elFinder.prototype.i18.ar = {
		translator : 'Khamis Alqutob &lt;alqutob@outlook.com&gt;, Tawfek Daghistani &lt;tawfekov@gmail.com&gt;, Atef Ben Ali &lt;atef.bettaib@gmail.com&gt;',
		language   : 'Arabic',
		direction  : 'rtl',
		dateFormat : 'M d, Y h:i A', // will show like: شباط 25, 2022 06:20 PM
		fancyDateFormat : '$1 h:i A', // will show like: اليوم 06:20 PM
		nonameDateFormat : 'ymd-His', // noname upload will show like: 220225-182023
		messages   : {
			'getShareText' : 'يشارك',
			'Editor ': 'محرر الكود',
			/********************************** errors **********************************/
			'error'                : 'خطأ',
			'errUnknown'           : 'خطأ غير معروف .',
			'errUnknownCmd'        : 'أمر غير معروف .',
			'errJqui'              : 'تكوين jQuery UI غير صالح. يجب تضمين المكونات القابلة للتحديد والقابلة للسحب والإفلات',
			'errNode'              : 'يتطلب elFinder إنشاء عنصر DOM.',
			'errURL'               : 'تكوين elFinder غير صالح ! لم يتم تعيين خيار رابط URL',
			'errAccess'            : 'الوصول مرفوض .',
			'errConnect'           : 'تعذر الاتصال مع خادم الخلفية',
			'errAbort'             : 'تم فصل الإتصال',
			'errTimeout'           : 'نفذ وقت الاتصال.',
			'errNotFound'          : 'الخادوم الخلفي غير موجود .',
			'errResponse'          : 'رد غير مقبول من الخادوم الخلفي',
			'errConf'              : 'خطأ في الإعدادات الخاصة بالخادوم الخلفي ',
			'errJSON'              : 'موديول PHP JSON module غير مثبت ',
			'errNoVolumes'         : 'الأحجام المقروءة غير متوفرة',
			'errCmdParams'         : 'معلمات غير صالحة للأمر "$1".',
			'errDataNotJSON'       : 'البيانات ليست من نوع JSON ',
			'errDataEmpty'         : 'البيانات فارغة',
			'errCmdReq'            : 'الخادوم الخلفي يتطلب اسم الأمر ',
			'errOpen'              : 'غير قادر على فتح  "$1".',
			'errNotFolder'         : 'العنصر ليس مجلد',
			'errNotFile'           : 'العنصر ليس ملف',
			'errRead'              : 'غير قادر على قراءة "$1".',
			'errWrite'             : 'غير قادر على الكتابة في "$1".',
			'errPerm'              : 'وصول مرفوض ',
			'errLocked'            : '"$1" مقفل ولا يمكن إعادة تسميته أو نقله أو إزالته.',
			'errExists'            : 'العنصر الذي يحمل الاسم "$1" موجود مسبقاً.',
			'errInvName'           : 'اسم الملف غير صالح',
			'errInvDirname'        : 'اسم مجلد غير صالح',  // from v2.1.24 added 12.4.2017
			'errFolderNotFound'    : 'المجلد غير موجود',
			'errFileNotFound'      : 'الملف غير موجود',
			'errTrgFolderNotFound' : 'المجلد الهدف  "$1" غير موجود ',
			'errPopup'             : 'المتصفح منع من فتح نافذة منبثقة. لفتح ملف ، قم بتمكينه في خيارات المتصفح',
			'errMkdir'             : ' غير قادر على إنشاء مجلد "$1".',
			'errMkfile'            : ' غير قادر على إنشاء ملف "$1".',
			'errRename'            : 'غير قادر على إعادة تسمية  "$1".',
			'errCopyFrom'          : 'نسخ الملفات من الدليل "$1" غير مسموح.',
			'errCopyTo'            : 'نسخ الملفات إلى الدليل "$1" غير مسموح .',
			'errMkOutLink'         : 'تعذر إنشاء رابط إلى خارج جذر الدليل.', // from v2.1 added 03.10.2015
			'errUpload'            : 'خطأ في عملية الرفع.',  // old name - errUploadCommon
			'errUploadFile'        : 'غير قادر على رفع "$1".', // old name - errUpload
			'errUploadNoFiles'     : 'لم يتم العثور على ملفات للتحميل .',
			'errUploadTotalSize'   : 'البيانات تتجاوز الحد الأقصى للحجم المسموح به.', // old name - errMaxSize
			'errUploadFileSize'    : 'تجاوز الملف الحد الأقصى للحجم المسموح به.', //  old name - errFileMaxSize
			'errUploadMime'        : 'نوع الملف غير مسموح به.',
			'errUploadTransfer'    : '"$1" خطأ نقل.',
			'errUploadTemp'        : 'تعذر إنشاء ملف مؤقت للتحميل .', // from v2.1 added 26.09.2015
			'errNotReplace'        : 'الكائن "$1" موجود بالفعل في هذا الموقع ولا يمكن استبداله بكائن بنوع آخر.', // new
			'errReplace'           : 'غير قادر على استبدال "$1".',
			'errSave'              : 'غير قادر على حفظ "$1".',
			'errCopy'              : 'غير قادر على نسخ "$1".',
			'errMove'              : 'غير قادر على نقل "$1".',
			'errCopyInItself'      : 'غير قادر على نسخ "$1" داخل نفسه.',
			'errRm'                : 'غير قادر على إزالة "$1".',
			'errTrash'             : 'غير قادر في سلة المهملات', // from v2.1.24 added 30.4.2017
			'errRmSrc'             : 'تعذر إزالة ملف (ملفات) المصدر.',
			'errExtract'           : 'غير قادر على استخراج الملفات من "$1".',
			'errArchive'           : 'غير قادر على إنشاء ملف مضغوط.',
			'errArcType'           : 'نوع الملف المضغوط غير مدعوم.',
			'errNoArchive'         : 'هذا الملف ليس ملف مضغوط أو ذو صيغة غير مدعومة.',
			'errCmdNoSupport'      : 'الخادوم الخلفي لا يدعم هذا الأمر ',
			'errReplByChild'       : 'لا يمكن استبدال المجلد "$1" بعنصر محتوِ فيه.',
			'errArcSymlinks'       : 'لأسباب أمنية ، تم رفض فك ضغط الأرشيفات التي تحتوي على روابط رمزية أو ملفات بأسماء غير مسموح بها.', // edited 24.06.2012
			'errArcMaxSize'        : 'تتجاوز ملفات الأرشيف الحجم الأقصى المسموح به.',
			'errResize'            : 'تعذر تغيير حجم "$1".',
			'errResizeDegree'      : 'درجة تدوير غير صالحة.',  // added 7.3.2013
			'errResizeRotate'      : 'تعذر تدوير الصورة.',  // added 7.3.2013
			'errResizeSize'        : 'حجم الصورة غير صالح.',  // added 7.3.2013
			'errResizeNoChange'    : 'حجم الصورة لم يتغير.',  // added 7.3.2013
			'errUsupportType'      : 'نوع ملف غير مدعوم.',
			'errNotUTF8Content'    : 'الملف "$1" ليس بتنسيق UTF-8 ولا يمكن تحريره.',  // added 9.11.2011
			'errNetMount'          : 'غير قادر على التثبيت "$1".', // added 17.04.2012
			'errNetMountNoDriver'  : 'بروتوكول غير مدعوم.',     // added 17.04.2012
			'errNetMountFailed'    : 'فشل التثبيت.',         // added 17.04.2012
			'errNetMountHostReq'   : 'المضيف مطلوب.', // added 18.04.2012
			'errSessionExpires'    : 'انتهت جلسة العمل الخاصة بك بسبب عدم الفاعلية.',
			'errCreatingTempDir'   : 'تعذر إنشاء دليل مؤقت: "$1"',
			'errFtpDownloadFile'   : 'تعذر تنزيل الملف من FTP: "$1"',
			'errFtpUploadFile'     : 'تعذر تحميل الملف إلى FTP: "$1"',
			'errFtpMkdir'          : 'تعذر إنشاء دليل عن بعد في FTP: "$1"',
			'errArchiveExec'       : 'خطأ أثناء أرشفة الملفات: "$1"',
			'errExtractExec'       : 'خطأ أثناء استخراج الملفات: "$1"',
			'errNetUnMount'        : 'غير قادر على فك التثبيت.', // from v2.1 added 30.04.2012
			'errConvUTF8'          : 'غير قابل للتحويل إلى UTF-8', // from v2.1 added 08.04.2014
			'errFolderUpload'      : 'جرب المتصفح الحديث ، إذا كنت ترغب في تحميل المجلد.', // from v2.1 added 26.6.2015
			'errSearchTimeout'     : 'انتهت المهلة أثناء البحث "$1". نتيجة البحث جزئية.', // from v2.1 added 12.1.2016
			'errReauthRequire'     : 'مطلوب إعادة التفويض.', // from v2.1.10 added 24.3.2016
			'errMaxTargets'        : 'الحد الأقصى لعدد العناصر القابلة للتحديد هو $1.', // from v2.1.17 added 17.10.2016
			'errRestore'           : 'غير قادر على الاستعادة من سلة المهملات. لا يمكن تحديد وجهة الاستعادة.', // from v2.1.24 added 3.5.2017
			'errEditorNotFound'    : 'لم يتم العثور على المحرر لهذا النوع من الملفات.', // from v2.1.25 added 23.5.2017
			'errServerError'       : 'حدث خطأ من جانب الخادم.', // from v2.1.25 added 16.6.2017
			'errEmpty'             : 'تعذر إفراغ المجلد "$1".', // from v2.1.25 added 22.6.2017
			'moreErrors'           : 'يوجد $1 أخطاء إضافية.', // from v2.1.44 added 9.12.2018
			'errMaxMkdirs'         : 'يمكنك إنشاء ما يصل إلى $1 مجلد في وقت واحد.', // from v2.1.58 added 20.6.2021

			/******************************* commands names ********************************/
			'cmdarchive'   : 'إنشاء أرشيف',
			'cmdback'      : 'العودة',
			'cmdcopy'      : 'نسخ',
			'cmdcut'       : 'قص',
			'cmddownload'  : 'تنزيل',
			'cmdduplicate' : 'تكرار',
			'cmdedit'      : 'تحرير الملف',
			'cmdextract'   : 'إستخراج الملفات من الأرشيف',
			'cmdforward'   : 'الأمام',
			'cmdgetfile'   : 'اختيار الملفات',
			'cmdhelp'      : 'عن هذه البرمجية',
			'cmdhome'      : 'الجذر',
			'cmdinfo'      : 'الحصول على معلومات والمشاركة',
			'cmdmkdir'     : 'مجلد جديد',
			'cmdmkdirin'   : 'داخل مجلد جديد', // from v2.1.7 added 19.2.2016
			'cmdmkfile'    : 'ملف جديد',
			'cmdopen'      : 'فتح',
			'cmdpaste'     : 'لصق',
			'cmdquicklook' : 'معاينة',
			'cmdreload'    : 'إعادة تحميل',
			'cmdrename'    : 'إعادة تسمية',
			'cmdrm'        : 'حذف',
			'cmdtrash'     : 'داخل سلة المهملات', //from v2.1.24 added 29.4.2017
			'cmdrestore'   : 'إستعادة', //from v2.1.24 added 3.5.2017
			'cmdsearch'    : 'بحث عن ملفات',
			'cmdup'        : 'انتقل إلى المجلد الأصل',
			'cmdupload'    : 'رفع ملفات',
			'cmdview'      : 'عرض',
			'cmdresize'    : 'تغيير الحجم والتدوير',
			'cmdsort'      : 'فرز',
			'cmdnetmount'  : 'تثبيت حجم الشبكة', // added 18.04.2012
			'cmdnetunmount': 'إلغاء التثبيت', // from v2.1 added 30.04.2012
			'cmdplaces'    : 'الى الاماكن', // added 28.12.2014
			'cmdchmod'     : 'تغيير النمط', // from v2.1 added 20.6.2015
			'cmdopendir'   : 'فتح مجلد', // from v2.1 added 13.1.2016
			'cmdcolwidth'  : 'إعادة تعيين عرض العمود', // from v2.1.13 added 12.06.2016
			'cmdfullscreen': 'ملء الشاشة', // from v2.1.15 added 03.08.2016
			'cmdmove'      : 'نقل', // from v2.1.15 added 21.08.2016
			'cmdempty'     : 'تفريغ المجلد', // from v2.1.25 added 22.06.2017
			'cmdundo'      : 'تراجع', // from v2.1.27 added 31.07.2017
			'cmdredo'      : 'إعادة', // from v2.1.27 added 31.07.2017
			'cmdpreference': 'التفضيلات', // from v2.1.27 added 03.08.2017
			'cmdselectall' : 'تحديد الكل', // from v2.1.28 added 15.08.2017
			'cmdselectnone': 'تحديد لا شيء', // from v2.1.28 added 15.08.2017
			'cmdselectinvert': 'عكس الاختيار', // from v2.1.28 added 15.08.2017
			'cmdopennew'   : 'فتح في نافذة جديدة', // from v2.1.38 added 3.4.2018
			'cmdhide'      : 'إخفاء (الأفضلية)', // from v2.1.41 added 24.7.2018

			/*********************************** buttons ***********************************/
			'btnClose'  : 'إغلاق',
			'btnSave'   : 'حفظ',
			'btnRm'     : 'إزالة',
			'btnApply'  : 'تطبيق',
			'btnCancel' : 'إلغاء',
			'btnNo'     : 'لا',
			'btnYes'    : 'نعم',
			'btnMount'  : 'تثبيت',  // added 18.04.2012
			'btnApprove': 'انتقل إلى $1 والموافقة', // from v2.1 added 26.04.2012
			'btnUnmount': 'إلغاء التثبيت', // from v2.1 added 30.04.2012
			'btnConv'   : 'تحويل', // from v2.1 added 08.04.2014
			'btnCwd'    : 'هنا',      // from v2.1 added 22.5.2015
			'btnVolume' : 'الحجم',    // from v2.1 added 22.5.2015
			'btnAll'    : 'الكل',       // from v2.1 added 22.5.2015
			'btnMime'   : 'نوع التمثيل الصامت', // from v2.1 added 22.5.2015
			'btnFileName':'إسم الملف',  // from v2.1 added 22.5.2015
			'btnSaveClose': 'حفظ وإغلاق', // from v2.1 added 12.6.2015
			'btnBackup' : 'نسخ احتياطي', // fromv2.1 added 28.11.2015
			'btnRename'    : 'إعادة تسمية',      // from v2.1.24 added 6.4.2017
			'btnRenameAll' : 'إعادة تسمية (الجميع)', // from v2.1.24 added 6.4.2017
			'btnPrevious' : '($1/$2) السابق', // from v2.1.24 added 11.5.2017
			'btnNext'     : '($1/$2) التالي', // from v2.1.24 added 11.5.2017
			'btnSaveAs'   : 'حفظ كــ', // from v2.1.25 added 24.5.2017

			/******************************** notifications ********************************/
			'ntfopen'     : 'فتح مجلد',
			'ntffile'     : 'فتح ملف',
			'ntfreload'   : 'إعادة تحميل محتوى المجلد',
			'ntfmkdir'    : 'إنشاء مجلد',
			'ntfmkfile'   : 'إنشاء ملفات',
			'ntfrm'       : 'حذف العناصر',
			'ntfcopy'     : 'نسخ العناصر',
			'ntfmove'     : 'نقل االعناصر',
			'ntfprepare'  : 'فحص العناصر الموجودة',
			'ntfrename'   : 'إعادة تسمية الملفات',
			'ntfupload'   : 'تحميل الملفات',
			'ntfdownload' : 'تنزيل الملفات',
			'ntfsave'     : 'حفظ الملفات',
			'ntfarchive'  : 'إنشاء أرشيف',
			'ntfextract'  : 'استخراج ملفات من الأرشيف',
			'ntfsearch'   : 'البحث في الملفات',
			'ntfresize'   : 'تغيير حجم الصور',
			'ntfsmth'     : 'القيام بشيء ما',
			'ntfloadimg'  : 'تحميل الصورة',
			'ntfnetmount' : 'تثبيت حجم الشبكة', // added 18.04.2012
			'ntfnetunmount': 'إلغاء تثبيت حجم الشبكة', // from v2.1 added 30.04.2012
			'ntfdim'      : 'اكتساب أبعاد الصورة', // added 20.05.2013
			'ntfreaddir'  : 'قراءة معلومات المجلد', // from v2.1 added 01.07.2013
			'ntfurl'      : 'الحصول على URL الرابط', // from v2.1 added 11.03.2014
			'ntfchmod'    : 'تغيير نمط الملف', // from v2.1 added 20.6.2015
			'ntfpreupload': 'التحقق من اسم ملف التحميل', // from v2.1 added 31.11.2015
			'ntfzipdl'    : 'إنشاء ملف للتنزيل', // from v2.1.7 added 23.1.2016
			'ntfparents'  : 'الحصول على معلومات المسار', // from v2.1.17 added 2.11.2016
			'ntfchunkmerge': 'معالجة الملف المرفوع', // from v2.1.17 added 2.11.2016
			'ntftrash'    : 'القيام بالرمي في القمامة', // from v2.1.24 added 2.5.2017
			'ntfrestore'  : 'القيام بالاستعادة من سلة المهملات', // from v2.1.24 added 3.5.2017
			'ntfchkdir'   : 'التحقق من مجلد الوجهة', // from v2.1.24 added 3.5.2017
			'ntfundo'     : 'التراجع عن العملية السابقة', // from v2.1.27 added 31.07.2017
			'ntfredo'     : 'إعادة التراجع السابق', // from v2.1.27 added 31.07.2017
			'ntfchkcontent' : 'فحص المحتويات', // from v2.1.41 added 3.8.2018

			/*********************************** volumes *********************************/
			'volume_Trash' : 'مهملات', //from v2.1.24 added 29.4.2017

			/************************************ dates **********************************/
			'dateUnknown' : 'غير معلوم',
			'Today'       : 'اليوم',
			'Yesterday'   : 'الأمس',
			'msJan'       : 'كانون الثاني',
			'msFeb'       : 'شباط',
			'msMar'       : 'آذار',
			'msApr'       : 'نيسان',
			'msMay'       : 'أيار',
			'msJun'       : 'حزيران',
			'msJul'       : 'تموز',
			'msAug'       : 'آب',
			'msSep'       : 'أيلول',
			'msOct'       : 'تشرين الأول',
			'msNov'       : 'تشرين الثاني',
			'msDec'       : 'كانون الأول ',
			'January'     : 'كانون الثاني',
			'February'    : 'شباط',
			'March'       : 'آذار',
			'April'       : 'نيسان',
			'May'         : 'أيار',
			'June'        : 'حزيران',
			'July'        : 'تموز',
			'August'      : 'آب',
			'September'   : 'أيلول',
			'October'     : 'تشرين الأول',
			'November'    : 'تشرين الثاني',
			'December'    : 'كانون الثاني',
			'Sunday'      : 'الأحد',
			'Monday'      : 'الاثنين',
			'Tuesday'     : 'الثلاثاء',
			'Wednesday'   : 'الإربعاء',
			'Thursday'    : 'الخميس',
			'Friday'      : 'الجمعة',
			'Saturday'    : 'السبت',
			'Sun'         : 'الأحد',
			'Mon'         : 'الاثنين',
			'Tue'         : 'الثلاثاء',
			'Wed'         : 'الإربعاء',
			'Thu'         : 'الخميس',
			'Fri'         : 'الجمعة',
			'Sat'         : 'السبت',

			/******************************** sort variants ********************************/
			'sortname'          : 'حسب الاسم',
			'sortkind'          : 'حسب النوع',
			'sortsize'          : 'حسب الحجم',
			'sortdate'          : 'حسب التاريخ',
			'sortFoldersFirst'  : 'المجلدات أولا',
			'sortperm'          : 'حسب الصلاحية', // from v2.1.13 added 13.06.2016
			'sortmode'          : 'حسب النمط',       // from v2.1.13 added 13.06.2016
			'sortowner'         : 'حسب المالك',      // from v2.1.13 added 13.06.2016
			'sortgroup'         : 'حسب المجموعة',      // from v2.1.13 added 13.06.2016
			'sortAlsoTreeview'  : 'أيضا عرض الشجرة',  // from v2.1.15 added 01.08.2016

			/********************************** new items **********************************/
			'untitled file.txt' : 'NewFile.txt', // added 10.11.2015
			'untitled folder'   : 'مجلد جديد',   // added 10.11.2015
			'Archive'           : 'أرشيف جديد',  // from v2.1 added 10.11.2015
			'untitled file'     : 'الملف الجديد.$1',  // from v2.1.41 added 6.8.2018
			'extentionfile'     : '$1: ملف',    // from v2.1.41 added 6.8.2018
			'extentiontype'     : '$1: $2',      // from v2.1.43 added 17.10.2018

			/********************************** messages **********************************/
			'confirmReq'      : 'التأكيد مطلوب',
			'confirmRm'       : 'هل تريد بالتأكيد إزالة العناصر نهائيًا؟ <br/> لا يمكن التراجع عن هذا الإجراء! ',
			'confirmRepl'     : 'استبدال الملف القديم بملف جديد؟ (إذا كان يحتوي على مجلدات ، فسيتم دمجه. للنسخ الاحتياطي والاستبدال ، حدد النسخ الاحتياطي.)',
			'confirmRest'     : 'هل تريد استبدال العنصر الموجود بالعنصر الموجود في المهملات؟', // fromv2.1.24 added 5.5.2017
			'confirmConvUTF8' : 'ليس بصيغة UTF-8<br/>التحويل إلى UTF-8؟<br/>تصبح المحتويات UTF-8 بالحفظ بعد التحويل.', // from v2.1 added 08.04.2014
			'confirmNonUTF8'  : 'تعذر الكشف عن ترميز الأحرف لهذا الملف. تحتاج إلى التحويل مؤقتاً إلى UTF-8 للتحرير.<br/>الرجاء تحديد ترميز الأحرف لهذا الملف.', // from v2.1.19 added 28.11.2016
			'confirmNotSave'  : 'لقد تم تعديله.<br/>قد تخسر العمل إذا لم تقم بحفظ التغييرات.', // from v2.1 added 15.7.2015
			'confirmTrash'    : 'هل أنت متأكد أنك تريد نقل العناصر إلى سلة المهملات؟', //from v2.1.24 added 29.4.2017
			'confirmMove'     : 'هل أنت متأكد أنك تريد نقل العناصر إلى "$1"?', //from v2.1.50 added 27.7.2019
			'apllyAll'        : 'تطبيق على الكل',
			'name'            : 'الاسم',
			'size'            : 'الحجم',
			'perms'           : 'الصلاحيات',
			'modify'          : 'التعديل',
			'kind'            : 'النوع',
			'read'            : 'قابل للقراءة',
			'write'           : 'قابل للكتابة',
			'noaccess'        : 'وصول ممنوع',
			'and'             : 'و',
			'unknown'         : 'غير معروف',
			'selectall'       : 'تحديد كل العناصر',
			'selectfiles'     : 'تحديد العناصر',
			'selectffile'     : 'تحديد العنصر الأول',
			'selectlfile'     : 'تحديد العنصر الأخير',
			'viewlist'        : 'عرض القائمة',
			'viewicons'       : 'عرض أيْقونات',
			'viewSmall'       : 'أيقونات صغيرة', // from v2.1.39 added 22.5.2018
			'viewMedium'      : 'أيقونات متوسطة', // from v2.1.39 added 22.5.2018
			'viewLarge'       : 'أيقونات كبيرة', // from v2.1.39 added 22.5.2018
			'viewExtraLarge'  : 'أيقونات كبيرة جداً', // from v2.1.39 added 22.5.2018
			'places'          : 'المواقع',
			'calc'            : 'حساب',
			'path'            : 'المسار',
			'aliasfor'        : 'اسم مستعار لـ',
			'locked'          : 'مقفل',
			'dim'             : 'الأبعاد',
			'files'           : 'ملفات',
			'folders'         : 'مجلدات',
			'items'           : 'عناصر',
			'yes'             : 'نعم',
			'no'              : 'لا',
			'link'            : 'الرابط',
			'searcresult'     : 'نتائج البحث',
			'selected'        : 'العناصر المحددة',
			'about'           : 'حول',
			'shortcuts'       : 'الاختصارات',
			'help'            : 'المساعدة',
			'webfm'           : 'مدير ملفات الويب',
			'ver'             : 'الإصدار',
			'protocolver'     : 'إصدار البرتوكول',
			'homepage'        : 'رئيسية المشروع',
			'docs'            : 'الوثائق',
			'github'          : 'شاركنا على Github',
			'twitter'         : 'تابعنا على تويتر',
			'facebook'        : 'انضم إلينا على الفيس بوك',
			'team'            : 'الفريق',
			'chiefdev'        : 'رئيس المبرمجين',
			'developer'       : 'مبرمج',
			'contributor'     : 'مساهم',
			'maintainer'      : 'مشرف',
			'translator'      : 'مترجم',
			'icons'           : 'أيقونات',
			'dontforget'      : 'ولا تنس أن تأخذ المنشفة',
			'shortcutsof'     : 'الاختصارات غير مفعلة',
			'dropFiles'       : 'إفلات الملفات هنا',
			'or'              : 'أو',
			'selectForUpload' : 'اختر الملفات',
			'moveFiles'       : 'نقل العناصر',
			'copyFiles'       : 'نسخ العناصر',
			'restoreFiles'    : 'استعادة العناصر', // from v2.1.24 added 5.5.2017
			'rmFromPlaces'    : 'إزالة من الأماكن',
			'aspectRatio'     : 'ابعاد متزنة',
			'scale'           : 'مقياس',
			'width'           : 'عرض',
			'height'          : 'طول',
			'resize'          : 'تغيير الحجم',
			'crop'            : 'قص',
			'rotate'          : 'تدوير',
			'rotate-cw'       : 'استدارة 90 درجة مع عقارب الساعة',
			'rotate-ccw'      : 'استدارة 90 درجة عكس عقارب الساعة',
			'degree'          : '°',
			'netMountDialogTitle' : 'تثبيت حجم الشبكة', // added 18.04.2012
			'protocol'            : 'البروتوكول', // added 18.04.2012
			'host'                : 'المضيف', // added 18.04.2012
			'port'                : 'المنفذ', // added 18.04.2012
			'user'                : 'المستخدم', // added 18.04.2012
			'pass'                : 'كلمة المرور', // added 18.04.2012
			'confirmUnmount'      : 'هل أنت متأكد من إلغاء تثبيت $1؟',  // from v2.1 added 30.04.2012
			'dropFilesBrowser': 'قم بإسقاط أو لصق الملفات من المتصفح', // from v2.1 added 30.05.2012
			'dropPasteFiles'  : 'قم بإسقاط الملفات أو لصق الروابط أو الصور (الحافظة) هنا', // from v2.1 added 07.04.2014
			'encoding'        : 'الترميز', // from v2.1 added 19.12.2014
			'locale'          : 'اللغة',   // from v2.1 added 19.12.2014
			'searchTarget'    : 'الهدف: $1',                // from v2.1 added 22.5.2015
			'searchMime'      : 'البحث عن طريق إدخال نوع MIME', // from v2.1 added 22.5.2015
			'owner'           : 'المالك', // from v2.1 added 20.6.2015
			'group'           : 'المجموعة', // from v2.1 added 20.6.2015
			'other'           : 'أخرى', // from v2.1 added 20.6.2015
			'execute'         : 'تنفيذ', // from v2.1 added 20.6.2015
			'perm'            : 'التصريح', // from v2.1 added 20.6.2015
			'mode'            : 'النمط', // from v2.1 added 20.6.2015
			'emptyFolder'     : 'المجلد فارغ', // from v2.1.6 added 30.12.2015
			'emptyFolderDrop' : 'المجلد فارغ\\إفلات لإضافة عناصر', // from v2.1.6 added 30.12.2015
			'emptyFolderLTap' : 'المجلد فارغ\\نقرة طويلة لإضافة العناصر', // from v2.1.6 added 30.12.2015
			'quality'         : 'النوعية', // from v2.1.6 added 5.1.2016
			'autoSync'        : 'مزامنة آلية',  // from v2.1.6 added 10.1.2016
			'moveUp'          : 'تحريك لأعلى',  // from v2.1.6 added 18.1.2016
			'getLink'         : 'الحصول على رابط URL', // from v2.1.7 added 9.2.2016
			'selectedItems'   : 'العناصر المحددة ($1)', // from v2.1.7 added 2.19.2016
			'folderId'        : 'معرف المجلد', // from v2.1.10 added 3.25.2016
			'offlineAccess'   : 'السماح بالوصول دون اتصال', // from v2.1.10 added 3.25.2016
			'reAuth'          : 'لإعادة المصادقة', // from v2.1.10 added 3.25.2016
			'nowLoading'      : 'جاري التحميل الآن...', // from v2.1.12 added 4.26.2016
			'openMulti'       : 'فتح ملفات متعددة', // from v2.1.12 added 5.14.2016
			'openMultiConfirm': 'أنت تحاول فتح  $1 ملف. هل أنت متأكد أنك تريد الفتح في المتصفح؟', // from v2.1.12 added 5.14.2016
			'emptySearch'     : 'نتائج البحث فارغة في هدف البحث.', // from v2.1.12 added 5.16.2016
			'editingFile'     : 'إنها تقوم بتحرير ملف.', // from v2.1.13 added 6.3.2016
			'hasSelected'     : 'لقد قمت بتحديد $1 عناصر.', // from v2.1.13 added 6.3.2016
			'hasClipboard'    : 'يوجد لديك $1 عناصر في الحافظة.', // from v2.1.13 added 6.3.2016
			'incSearchOnly'   : 'البحث المتزايد هو فقط من العرض الحالي.', // from v2.1.13 added 6.30.2016
			'reinstate'       : 'إعادة', // from v2.1.15 added 3.8.2016
			'complete'        : '$1 إكتمل', // from v2.1.15 added 21.8.2016
			'contextmenu'     : 'قائمة السياق', // from v2.1.15 added 9.9.2016
			'pageTurning'     : 'قلب الصفحة', // from v2.1.15 added 10.9.2016
			'volumeRoots'     : 'جذور الحجم', // from v2.1.16 added 16.9.2016
			'reset'           : 'إعادة تعيين', // from v2.1.16 added 1.10.2016
			'bgcolor'         : 'لون الخلفية', // from v2.1.16 added 1.10.2016
			'colorPicker'     : 'أداة انتقاء اللون', // from v2.1.16 added 1.10.2016
			'8pxgrid'         : 'شبكة 8 بكسل', // from v2.1.16 added 4.10.2016
			'enabled'         : 'مفعل', // from v2.1.16 added 4.10.2016
			'disabled'        : 'معطل', // from v2.1.16 added 4.10.2016
			'emptyIncSearch'  : 'نتائج البحث فارغة في العرض الحالي. \\ اضغط على [Enter] لتوسيع هدف البحث.', // from v2.1.16 added 5.10.2016
			'emptyLetSearch'  : 'نتائج البحث الحرف الأول فارغة في العرض الحالي.', // from v2.1.23 added 24.3.2017
			'textLabel'       : 'تسمية نصية', // from v2.1.17 added 13.10.2016
			'minsLeft'        : '$1 دقائق باقية', // from v2.1.17 added 13.11.2016
			'openAsEncoding'  : 'إعادة فتح مع الترميز المحدد', // from v2.1.19 added 2.12.2016
			'saveAsEncoding'  : 'حفظ مع الترميز المحدد', // from v2.1.19 added 2.12.2016
			'selectFolder'    : 'تحديد مجلد', // from v2.1.20 added 13.12.2016
			'firstLetterSearch': 'البحث بالحرف الأول', // from v2.1.23 added 24.3.2017
			'presets'         : 'الإعدادات المسبقة', // from v2.1.25 added 26.5.2017
			'tooManyToTrash'  : 'هناك عدد كبير جداً من العناصر لذا لا يمكن وضعها في سلة المهملات.', // from v2.1.25 added 9.6.2017
			'TextArea'        : 'منطقة النص', // from v2.1.25 added 14.6.2017
			'folderToEmpty'   : 'إفراغ المجلد "$1".', // from v2.1.25 added 22.6.2017
			'filderIsEmpty'   : 'لا توجد عناصر في مجلد "$1".', // from v2.1.25 added 22.6.2017
			'preference'      : 'الأفضلية', // from v2.1.26 added 28.6.2017
			'language'        : 'اللغة', // from v2.1.26 added 28.6.2017
			'clearBrowserData': 'تهيئة الإعدادات المحفوظة في هذا المتصفح', // from v2.1.26 added 28.6.2017
			'toolbarPref'     : 'إعدادات شريط الأدوات', // from v2.1.27 added 2.8.2017
			'charsLeft'       : '... $1 حروف متبقية.',  // from v2.1.29 added 30.8.2017
			'linesLeft'       : '... $1 سطور متبقية.',  // from v2.1.52 added 16.1.2020
			'sum'             : 'المجموع', // from v2.1.29 added 28.9.2017
			'roughFileSize'   : 'حجم ملف تقريبي', // from v2.1.30 added 2.11.2017
			'autoFocusDialog' : 'التركيز على عنصر الحوار مع تمرير الماوس',  // from v2.1.30 added 2.11.2017
			'select'          : 'حدد', // from v2.1.30 added 23.11.2017
			'selectAction'    : 'الإجراء عند تحديد الملف', // from v2.1.30 added 23.11.2017
			'useStoredEditor' : 'الفتح باستخدام المحرر المستخدم آخر مرة', // from v2.1.30 added 23.11.2017
			'selectinvert'    : 'عكس الاختيار', // from v2.1.30 added 25.11.2017
			'renameMultiple'  : 'هل أنت متأكد أنك تريد إعادة تسمية $1 عناصر محددة مثل $2؟<br/>هذا لا يمكن التراجع عنه !', // from v2.1.31 added 4.12.2017
			'batchRename'     : 'إعادة تسمية الحزمة', // from v2.1.31 added 8.12.2017
			'plusNumber'      : '+ رقم', // from v2.1.31 added 8.12.2017
			'asPrefix'        : 'إضافة بادئة', // from v2.1.31 added 8.12.2017
			'asSuffix'        : 'إضافة لاحقة', // from v2.1.31 added 8.12.2017
			'changeExtention' : 'تغيير الامتداد', // from v2.1.31 added 8.12.2017
			'columnPref'      : 'إعدادات الأعمدة (عرض القائمة)', // from v2.1.32 added 6.2.2018
			'reflectOnImmediate' : 'ستنعكس جميع التغييرات على الفور على الأرشيف.', // from v2.1.33 added 2.3.2018
			'reflectOnUnmount'   : 'لن تنعكس أي تغييرات حتى يتم فك هذا المجلد.', // from v2.1.33 added 2.3.2018
			'unmountChildren' : 'المجلد (المجلدات) التالية المركبة على هذا المجلد غير مثبتة أيضاً. هل أنت متأكد من إلغاء تحميله؟', // from v2.1.33 added 5.3.2018
			'selectionInfo'   : 'معلومات التحديد', // from v2.1.33 added 7.3.2018
			'hashChecker'     : 'خوارزميات لإظهار تجزئة الملف', // from v2.1.33 added 10.3.2018
			'infoItems'       : 'عناصر المعلومات (لوحة معلومات التحديد)', // from v2.1.38 added 28.3.2018
			'pressAgainToExit': 'اضغط مرة أخرى للخروج.', // from v2.1.38 added 1.4.2018
			'toolbar'         : 'شريط الأدوات', // from v2.1.38 added 4.4.2018
			'workspace'       : 'مساحة العمل', // from v2.1.38 added 4.4.2018
			'dialog'          : 'الحوار', // from v2.1.38 added 4.4.2018
			'all'             : 'الكل', // from v2.1.38 added 4.4.2018
			'iconSize'        : 'حجم الأيقونة (عرض الأيقونات)', // from v2.1.39 added 7.5.2018
			'editorMaximized' : 'افتح نافذة المحرر المكبرة', // from v2.1.40 added 30.6.2018
			'editorConvNoApi' : 'نظراً لعدم توفر التحويل بواسطة API حالياً ، يرجى التحويل على موقع الويب.', //from v2.1.40 added 8.7.2018
			'editorConvNeedUpload' : 'بعد التحويل ، يجب أن تقوم بالتحميل مع عنوان رابط العنصر أو الملف الذي تم تنزيله لحفظ الملف المحول.', //from v2.1.40 added 8.7.2018
			'convertOn'       : 'تحويل على موقع $1', // from v2.1.40 added 10.7.2018
			'integrations'    : 'تكاملات', // from v2.1.40 added 11.7.2018
			'integrationWith' : 'يحتوي elFinder على الخدمات الخارجية التالية المتكاملة. يرجى التحقق من شروط الاستخدام وسياسة الخصوصية وما إلى ذلك قبل استخدامها.', // from v2.1.40 added 11.7.2018
			'showHidden'      : 'إظهار العناصر المخفية', // from v2.1.41 added 24.7.2018
			'hideHidden'      : 'إخفاء العناصر المخفية', // from v2.1.41 added 24.7.2018
			'toggleHidden'    : 'إظهار / إخفاء العناصر المخفية', // from v2.1.41 added 24.7.2018
			'makefileTypes'   : 'أنواع الملفات لتفعيلها مع "ملف جديد"', // from v2.1.41 added 7.8.2018
			'typeOfTextfile'  : 'نوع الملف النصي', // from v2.1.41 added 7.8.2018
			'add'             : 'إضافة', // from v2.1.41 added 7.8.2018
			'theme'           : 'الثيم', // from v2.1.43 added 19.10.2018
			'default'         : 'الافتراضي', // from v2.1.43 added 19.10.2018
			'description'     : 'الوصف', // from v2.1.43 added 19.10.2018
			'website'         : 'الموقع الالكتروني', // from v2.1.43 added 19.10.2018
			'author'          : 'المؤلف', // from v2.1.43 added 19.10.2018
			'email'           : 'البريد الالكتروني', // from v2.1.43 added 19.10.2018
			'license'         : 'الرخصة', // from v2.1.43 added 19.10.2018
			'exportToSave'    : 'لا يمكن حفظ هذا العنصر. لتجنب فقدان التحريرات التي تحتاجها للتصدير إلى جهاز الكمبيوتر الخاص بك.', // from v2.1.44 added 1.12.2018
			'dblclickToSelect': 'انقر نقراً مزدوجاً فوق الملف لتحديده.', // from v2.1.47 added 22.1.2019
			'useFullscreen'   : 'استخدام وضع ملء الشاشة', // from v2.1.47 added 19.2.2019

			/********************************** mimetypes **********************************/
			'kindUnknown'     : 'غير معروف',
			'kindRoot'        : 'جذر الحجم', // from v2.1.16 added 16.10.2016
			'kindFolder'      : 'مجلد',
			'kindSelects'     : 'مختارات', // from v2.1.29 added 29.8.2017
			'kindAlias'       : 'اسم مستعار',
			'kindAliasBroken' : 'اسم مستعار مكسور',
			// applications
			'kindApp'         : 'التطبيق',
			'kindPostscript'  : 'وثيقة Postscript',
			'kindMsOffice'    : 'وثيقة Microsoft Office',
			'kindMsWord'      : 'وثيقة Microsoft Word',
			'kindMsExcel'     : 'وثيقة Microsoft Excel',
			'kindMsPP'        : 'عرض تقديمي Microsoft Powerpoint',
			'kindOO'          : 'وثيقة Open Office',
			'kindAppFlash'    : 'تطبيق فلاش',
			'kindPDF'         : 'تنسيق الوثائق المحمولة (PDF)',
			'kindTorrent'     : 'ملف Bittorrent ',
			'kind7z'          : 'أرشيف  7z',
			'kindTAR'         : 'أرشيف TAR',
			'kindGZIP'        : 'أرشيف GZIP',
			'kindBZIP'        : 'أرشيف BZIP',
			'kindXZ'          : 'أرشيف XZ',
			'kindZIP'         : 'أرشيف ZIP',
			'kindRAR'         : 'أرشيف RAR',
			'kindJAR'         : 'أرشيف Java JAR',
			'kindTTF'         : 'خط True Type ',
			'kindOTF'         : 'خط Open Type ',
			'kindRPM'         : 'حزمة RPM',
			// texts
			'kindText'        : 'وثيقة نصية',
			'kindTextPlain'   : 'نص عادي',
			'kindPHP'         : 'مصدر PHP',
			'kindCSS'         : 'ورقة الأنماط المتتالية',
			'kindHTML'        : 'وثيقة HTML',
			'kindJS'          : 'مصدر Javascript',
			'kindRTF'         : 'تنسيق نص منسق',
			'kindC'           : 'مصدر C',
			'kindCHeader'     : 'مصدر C header',
			'kindCPP'         : 'مصدر C++',
			'kindCPPHeader'   : 'مصدر C++ header',
			'kindShell'       : 'مصدر Unix shell',
			'kindPython'      : 'مصدر Python',
			'kindJava'        : 'مصدر Java',
			'kindRuby'        : 'مصدر Ruby',
			'kindPerl'        : 'مصدر Perl',
			'kindSQL'         : 'مصدر SQL',
			'kindXML'         : 'وثيقة XML',
			'kindAWK'         : 'مصدر AWK',
			'kindCSV'         : 'ملف CSV',
			'kindDOCBOOK'     : 'وثيقة Docbook XML',
			'kindMarkdown'    : 'نص Markdown', // added 20.7.2015
			// images
			'kindImage'       : 'صورة',
			'kindBMP'         : 'صورة BMP',
			'kindJPEG'        : 'صورة JPEG',
			'kindGIF'         : 'صورة GIF',
			'kindPNG'         : 'صورة PNG',
			'kindTIFF'        : 'صورة TIFF',
			'kindTGA'         : 'صورة TGA',
			'kindPSD'         : 'صورة Adobe Photoshop',
			'kindXBITMAP'     : 'صورة X bitmap',
			'kindPXM'         : 'صورة Pixelmator',
			// media
			'kindAudio'       : 'وسائط صوت',
			'kindAudioMPEG'   : 'ملف صوتي MPEG ',
			'kindAudioMPEG4'  : 'ملف صوتي MPEG-4',
			'kindAudioMIDI'   : 'ملف صوتي MIDI',
			'kindAudioOGG'    : 'ملف صوتي Ogg Vorbis',
			'kindAudioWAV'    : 'ملف صوتي WAV',
			'AudioPlaylist'   : 'قائمة تشغيل MP3',
			'kindVideo'       : 'وسائط فيديو',
			'kindVideoDV'     : 'ملف فيديو DV',
			'kindVideoMPEG'   : 'ملف فيديو MPEG',
			'kindVideoMPEG4'  : 'ملف فيديو MPEG-4',
			'kindVideoAVI'    : 'ملف فيديو AVI',
			'kindVideoMOV'    : 'ملف فيديو Quick Time',
			'kindVideoWM'     : 'ملف فيديو Windows Media',
			'kindVideoFlash'  : 'ملف فيديو Flash',
			'kindVideoMKV'    : 'ملف فيديو Matroska',
			'kindVideoOGG'    : 'ملف فيديو Ogg'
		}
	};
}));js/i18n/help/de.html.js000064400000004370151215013360010561 0ustar00<h2>Anwendungstipps</h2>
<p>Die Verwendung dieser Anwendung ist ähnlich der einer lokalen Dateiverwaltung.<br><b>Hinweis</b>: auf mobilen Geräten ist das Ziehen und Ablegen (Drag and Drop) von Dateien nicht möglich.</p>
<ul>
	<li>Rechtsklick auf ein Element oder länger darauf zeigen öffnet das Kontextmenü</li>
	<li>Um Elemente in andere Ordner oder aktuellen Arbeitsbereich zu kopieren oder verschieben diese Ziehen und Ablegen</li>
	<li>Elementauswahl im Arbeitsbereich kann mit der Hochstell- oder ALT-TAste erweitert werden</li>
	<li>Um lokale Ordner und Dateien in den Zielorder oder -arbeitsbereich zu kopieren diese Ziehen und Ablegen</li>
	<li>Der Uploaddialog erlaubt Daten aus dem Clipboard (Zwischenspeicher), eine URL und Ziehen und Ablegen aus anderen Browsern und Dateiverwaltungsoberflächen</li>
	<li>Ziehen mit gedrückter ALT-Taste erlaubt einen einfachen Dateidownload (nur Google Chrome)</li>
	<li>Ordner und Dateien können ausgeblendet (versteckt) werden. Um sie wieder dauerhaft sichtbar zu machen, über die Menüleiste das "Icon Einstellungen" anklicken, dort unter Arbeitsplatz "Zeige versteckte Elemente" den Button "Neustart" anklicken</li>
	<li>Das Kontextmenü (rechte Maustaste) zeigt je nach ausgewählten Element diverse Aktionen an</li>
	<li>Je nach Art des Elements kann der Inhalt entweder mit dem integrierten Editor bearbeitet werden (z.B. .php, .txt, .ini usw.) oder wenn ein Bild dieses gedreht sowie die Größe geändert werden</li>
	<li>Zum verbinden externer Speicherorte (FTP, Dropbox, Box, GoogleDrive, OneDrive) sowie Onlineeditor <a href="https://www.zoho.com/officeplatform/integrator/" target="_blank">Zoho Office Editor</a> oder Konvertierungsdienst <a href="https://www.online-convert.com/" target="_blank">Online-Convert</a> müssen diese Anwendungen freigeschaltet als auch die entsprechenden API-Daten zum Abrufen je Dienst definiert sein.<br>Sollten diese Dienste nicht verfügbar sein, müssen diese entweder selbständig dazu programmiert werden, oder einen Entwickler des Vertrauens damit beauftragen (z.B. <a href="https://osworx.net" target="_blank">OSWorX</a>)</li>
	<li>In den Einstellungen "Menü Icon Einstellungen" kann der gesamte Arbeitsbereich, die Menüleiste sowie etliche weitere Aktionen definiert werden</li>
</ul>
js/i18n/help/tr.html.js000064400000001652151215013360010616 0ustar00<h2>İşlem İpuçları</h2>
<p>Kullanıcı arayüzündeki işlem, işletim sisteminin standart dosya yöneticisine benzer. Ancak Sürükle ve Bırak özelliği mobil tarayıcılarda mümkün değildir. </p>
<ul>
	<li>Bağlam menüsünü göstermek için sağ tıklayın veya uzun dokunun.</li>
	<li>Öğeleri taşımak/kopyalamak için klasör ağacına veya geçerli çalışma alanına sürükleyip bırakın.</li>
	<li>Çalışma alanındaki öğe seçimi Shift veya Alt (Seçenek) tuşuyla genişletilebilir.</li>
	<li>Dosya ve klasör yüklemek için hedef klasöre veya çalışma alanına sürükleyip bırakın.</li>
	<li>Yükleme iletişim kutusu, pano verilerini veya URL listelerini yapıştırma/bırakma ve diğer tarayıcı veya dosya yöneticilerinden Sürükle ve Bırak vb.</li>
	<li>Dış tarayıcıya sürüklemek için Alt (Seçenek) tuşuna basarak sürükleyin. Google Chrome ile indirme işlemi olacak.</li>
</ul>
js/i18n/help/en.html.js000064400000001440151215013360010566 0ustar00<h2>Operation Tips</h2>
<p>Operation on the UI is similar to operating system&#39;s standard file manager. However, Drag and Drop is not possible with mobile browsers. </p>
<ul>
	<li>Right click or long tap to show the context menu.</li>
	<li>Drag and drop into the folder tree or the current workspace to move/copy items.</li>
	<li>Item selection in the workspace can be extended selection with Shift or Alt (Option) key.</li>
	<li>Drag and Drop to the destination folder or workspace to upload files and folders.</li>
	<li>The upload dialog can accept paste/drop clipboard data or URL lists and Drag and Drop from other browser or file managers etc.</li>
	<li>Drag start with pressing Alt(Option) key to drag out to outside browser. It will became download operation with Google Chrome.</li>
</ul>
js/i18n/help/ko.html.js000064400000002034151215013360010575 0ustar00<h2>사용 팁</h2>
<p>UI 조작은 운영체제의 표준 파일 관리자를 사용하는 방법과 비슷합니다. 하지만 모바일 브라우저에서는 드래그앤드롭을 사용할 수 없습니다. </p>
<ul>
	<li>오른쪽 클릭하거나 길게 누르면 컨텍스트 메뉴가 나타납니다.</li>
	<li>이동/복사하려면 폴더 트리 또는 원하는 폴더로 드래그앤드롭하십시오.</li>
	<li>작업공간에서 항목을 선택하려면 Shift또는 Alt(Option) 키를 사용하여 선택 영역을 넓힐 수 있습니다.</li>
	<li>업로드 대상 폴더 또는 작업 영역으로 파일및 폴더를 드래그앤드롭하여 업로드할 수 있습니다.</li>
	<li>다른 브라우저 또는 파일관리자등에서 드래그앤드롭하거나, 클립보드를 통해 데이터또는 URL을 복사/붙여넣어 업로드할 수 있습니다.</li>
	<li>크롬브라우저의 경우, Alt(Option) 키를 누른 상태에서 브라우저 밖으로 드래그앤드롭하면 다운로드가 가능합니다.</li>
</ul>
js/i18n/help/es.html.js000064400000002042151215013360010572 0ustar00<h2>Consejos de operaci&oacute;n</h2>
<p>Operar en la Interfaz del Usuario es similar al administrador de archivos estandar del sistema operativo. Sin embargo, Arrastrar y soltar no es posible con los navegadores m&oacute;viles.</p>
<ul>
	<li>Click derecho o un tap largo para mostrar el men&uacute; de contexto.</li>
	<li>Arrastrar y soltar dentro del &aacute;rbol de carpetas o el espacio de trabajo actual para mover/copiar elementos.</li>
	<li>La selecci&oacute;n de elementos en el espacio de trabajo puede ampliarse con la tecla Shift o Alt (Opci&oacute;n).</li>
	<li>Arrastrar y soltar a la carpeta de destino o &aacute;rea de trabajo para cargar archivos y carpetas.</li>
	<li>El cuadro de di&aacute;logo de carga puede aceptar pegar/soltar datos del portapapeles o listas de URL y arrastrar y soltar desde otro navegador o administrador de archivos, etc.</li>
	<li>Iniciar a arrastrar presionando la tecla Alt (Opci&oacute;n) para arrastrar fuera del navegador. Se convertir&aacute; en una operaci&oacute;n de descarga con Google Chrome.</li>
</ul>
js/i18n/help/ru.html.js000064400000003105151215013360010612 0ustar00<h2>Советы по работе</h2>
<p>Работа с пользовательским интерфейсом похожа на стандартный файловый менеджер операционной системы. Однако перетаскивание в мобильных браузерах невозможно.</p>
<ul>
	<li>Щелкните правой кнопкой мыши или используйте «длинный тап», чтобы отобразить контекстное меню.</li>
	<li>Перетащите в дерево папок или текущую рабочую область для перемещения / копирования элементов.</li>
	<li>Выбор элемента в рабочей области может быть расширен с помощью клавиши Shift или Alt (Option).</li>
	<li>Перетащите в папку назначения или рабочую область для загрузки файлов и папок.</li>
	<li>В диалоговом окне загрузки можно использовать вставку данных или списков URL-адресов из буфера обмена, а также перетаскивать из других браузеров или файловых менеджеров и т.д.</li>
	<li>Начните перетаскивание, нажав Alt (Option), чтобы перетащить за пределы браузера. Это запустить процесс скачивания в Google Chrome.</li>
</ul>
js/i18n/help/ja.html.js000064400000002402151215013360010555 0ustar00<h2>操作のヒント</h2>
<p>UIの操作は、オペレーティングシステムの標準ファイルマネージャにほぼ準拠しています。ただし、モバイルブラウザではドラッグ&ドロップはできません。</p>
<ul>
	<li>右クリックまたはロングタップでコンテキストメニューを表示します。</li>
	<li>アイテムを移動/コピーするには、フォルダツリーまたはワークスペースにドラッグ&ドロップします。</li>
	<li>ワークスペース内のアイテムの選択は、ShiftキーまたはAltキー(Optionキー)で選択範囲を拡張できます。</li>
	<li>コピー先のフォルダまたはワークスペースにドラッグアンドドロップして、ファイルとフォルダをアップロードします。</li>
	<li>アップロードダイアログでは、クリップボードのデータやURLリストのペースト/ドロップ、他のブラウザやファイルマネージャからのドラッグ&ドロップなどを受け入れることができます。</li>
	<li>Altキー(Optionキー)を押しながらドラッグすると、ブラウザの外にドラッグできます。Google Chromeでダウンロード操作になります。</li>
</ul>
js/i18n/help/sk.html.js000064400000001745151215013360010611 0ustar00<h2>Tipy na obsluhu</h2>
<p>Obsluha na používateľskom rozhraní je podobná štandardnému správcovi súborov operačného systému. Drag and Drop však nie je možné používať s mobilnými prehliadačmi. </p>
<ul>
	<li>Kliknutím pravým tlačidlom alebo dlhým klepnutím zobrazíte kontextové menu.</li>
	<li>Presuňte myšou do stromu priečinkov alebo do aktuálneho pracovného priestoru a presuňte / kopírujte položky.</li>
	<li>Výber položky v pracovnom priestore môžete rozšíriť pomocou klávesov Shift alebo Alt (Možnosť).</li>
	<li>Premiestnite súbory a priečinky do cieľovej zložky alebo do pracovného priestoru.</li>
	<li>Dialog odovzdávania môže prijímať dáta schránky alebo zoznamy adries URL a pritiahnuť a odísť z iných prehliadačov alebo správcov súborov.</li>
	<li>Potiahnutím spustite stlačením klávesu Alt (Možnosť) pretiahnite do vonkajšieho prehliadača. Táto funkcia sa prevezme pomocou prehliadača Google Chrome.</li>
</ul>
js/i18n/help/cs.html.js000064400000001722151215013360010574 0ustar00<h2>Tipy na obsluhu</h2>
<p>Obsluha na uživatelském rozhraní je podobná standardnímu správci souborů operačního systému. Drag and Drop však není možné používat s mobilními prohlížeči. </p>
<ul>
	<li>Kliknutím pravým tlačítkem nebo dlouhým klepnutím zobrazíte kontextové menu.</li>
	<li>Přetáhněte do stromu složek nebo do aktuálního pracovního prostoru a přetáhněte / kopírujte položky.</li>
	<li>Výběr položky v pracovním prostoru můžete rozšířit pomocí kláves Shift nebo Alt (Možnost).</li>
	<li>Přemístěte soubory a složky do cílové složky nebo do pracovního prostoru.</li>
	<li>Dialog předávání může přijímat data schránky nebo seznamy adres URL a přitáhnout a odejít z jiných prohlížečů nebo správců souborů.</li>
	<li>Zatažením spusťte stisknutím klávesy Alt (Možnost) přetáhněte do vnějšího prohlížeče. Tato funkce se převezme pomocí prohlížeče Google Chrome.</li>
</ul>
js/i18n/help/pl.html.js000064400000002007151215013360010577 0ustar00<h2>Wskazówki Obsługi</h2>
<p>Działanie w interfejsie użytkownika jest podobne do standardowego menedżera plików systemu operacyjnego. Jednak Przeciąganie i Upuszczanie nie jest możliwe w przeglądarkach mobilnych. </p>
<ul>
	<li>Kliknij prawym przyciskiem myszy lub dłużej, aby wyświetlić menu kontekstowe.</li>
	<li>Przeciągnij i upuść w drzewie folderów lub bieżącym obszarze roboczym, aby przenieść/kopiować elementy.</li>
	<li>Wybór elementu w obszarze roboczym można rozszerzyć wybór z klawiszem Shift lub Alt(Opcja).</li>
	<li>Przeciągnij i Upuść do folderu docelowego lub obszaru roboczego, aby przesłać pliki i foldery.</li>
	<li>W oknie dialogowym przesyłania można zaakceptować wklejanie/upuszczanie danych schowka lub listy adresów URL, i Przeciągnij i Upuść z innych przeglądarek lub menedżerów plików, itp.</li>
	<li>Rozpocznij Przeciąganie naciskając Alt (Opcja), aby przeciągnąć na zewnątrz przeglądarki. Stanie się operacją pobierania z Google Chrome. </li>
</ul>
js/i18n/elfinder.no.js000064400000100722151215013360010477 0ustar00/**
 * Norwegian Bokmål translation
 * @author Stian Jacobsen <stian@promonorge.no>
 * @version 2022-03-02
 */
 (function(root, factory) {
	if (typeof define === 'function' && define.amd) {
		define(['elfinder'], factory);
	} else if (typeof exports !== 'undefined') {
		module.exports = factory(require('elfinder'));
	} else {
		factory(root.elFinder);
	}
}(this, function(elFinder) {
	elFinder.prototype.i18.no = {
		translator : 'Stian Jacobsen &lt;stian@promonorge.no&gt;',
		language   : 'Norwegian Bokmål',
		direction  : 'ltr',
		dateFormat : 'M d, Y h:i A', // will show like: mars 02, 2022 04:32 PM
		fancyDateFormat : '$1 h:i A', // will show like: I dag 04:32 PM
		nonameDateFormat : 'ymd-His', // noname upload will show like: 220302-163250
		messages   : {
			'getShareText' : 'Dele',
			'Editor ': 'Koderedigerer',

			/********************************** errors **********************************/
			'error'                : 'Feil',
			'errUnknown'           : 'Ukjent feil.',
			'errUnknownCmd'        : 'Ukjent kommando.',
			'errJqui'              : 'Ugyldig jQuery UI konfigurasjon. Selectable, draggable og droppable komponentene må være inkludert.',
			'errNode'              : 'elFinder påkrever at DOM Elementer kan opprettes.',
			'errURL'               : 'Ugyldig elFinder konfigurasjon! URL-valget er ikke satt.',
			'errAccess'            : 'Ingen adgang.',
			'errConnect'           : 'Kunne ikke koble til.',
			'errAbort'             : 'Tilkoblingen avbrutt.',
			'errTimeout'           : 'Tilkoblingen tidsavbrudd.',
			'errNotFound'          : 'Backend ble ikke funnet',
			'errResponse'          : 'Ugyldig backend respons.',
			'errConf'              : 'Ugyldig backend konfigurasjon.',
			'errJSON'              : 'PHP JSON modul er ikke installert.',
			'errNoVolumes'         : 'Lesbar volum er ikke tilgjennelig.',
			'errCmdParams'         : 'Ugyldig parameter for kommando "$1".',
			'errDataNotJSON'       : 'Innhold er ikke JSON.',
			'errDataEmpty'         : 'Innholdet er tomt.',
			'errCmdReq'            : 'Backend spørringen påkrever kommando.',
			'errOpen'              : 'Kunne ikke åpne "$1".',
			'errNotFolder'         : 'Objektet er ikke en mappe.',
			'errNotFile'           : 'Objektet er ikke en fil.',
			'errRead'              : 'Kunne ikke lese "$1".',
			'errWrite'             : 'Kunne ikke skrive til "$1".',
			'errPerm'              : 'Du har ikke rettigheter.',
			'errLocked'            : '"$1" er låst og kan ikke flyttes, slettes eller endres',
			'errExists'            : 'Filen "$1" finnes allerede.',
			'errInvName'           : 'Ugyldig filnavn.',
			'errInvDirname'        : 'Ugyldig mappenavn.',  // from v2.1.24 added 12.4.2017
			'errFolderNotFound'    : 'Mappen finnes ikke.',
			'errFileNotFound'      : 'Filen finnes ikke.',
			'errTrgFolderNotFound' : 'Målmappen "$1" ble ikke funnet.',
			'errPopup'             : 'Nettleseren din blokkerte et pop-up vindu. For å åpne filen må du aktivere pop-up i din nettlesers innstillinger.',
			'errMkdir'             : 'Kunne ikke opprette mappen "$1".',
			'errMkfile'            : 'Kunne ikke opprette filen "$1".',
			'errRename'            : 'Kunne ikke gi nytt navn til "$1".',
			'errCopyFrom'          : 'Kopiere filer fra "$1" er ikke tillatt.',
			'errCopyTo'            : 'Kopiere filer til "$1" er ikke tillatt.',
			'errMkOutLink'         : 'Kan ikke opprette en kobling til utenfor volumroten.', // from v2.1 added 03.10.2015
			'errUpload'            : 'Feil under opplasting.',  // old name - errUploadCommon
			'errUploadFile'        : 'Kunne ikke laste opp "$1".', // old name - errUpload
			'errUploadNoFiles'     : 'Ingen filer funnet til opplasting.',
			'errUploadTotalSize'   : 'Innholdet overgår maksimum tillatt størrelse.', // old name - errMaxSize
			'errUploadFileSize'    : 'Filen vergår maksimum tillatt størrelse.', //  old name - errFileMaxSize
			'errUploadMime'        : 'Filtypen ikke tillatt.',
			'errUploadTransfer'    : '"$1" overførings feil.',
			'errUploadTemp'        : 'Kan ikke lage en midlertidig fil for opplasting.', // from v2.1 added 26.09.2015
			'errNotReplace'        : 'Objektet "$1" eksisterer allerede på denne plasseringen og kan ikke erstattes av objektet med en annen type.', // new
			'errReplace'           : 'Kan ikke erstatte "$1".',
			'errSave'              : 'Kunne ikke lagre "$1".',
			'errCopy'              : 'Kunne ikke kopiere "$1".',
			'errMove'              : 'Kunne ikke flytte "$1".',
			'errCopyInItself'      : 'Kunne ikke kopiere "$1" til seg selv.',
			'errRm'                : 'Kunne ikke slette "$1".',
			'errTrash'             : 'Kan ikke legges i papirkurven.', // from v2.1.24 added 30.4.2017
			'errRmSrc'             : 'Kan ikke fjerne kildefil(er).',
			'errExtract'           : 'Kunne ikke pakke ut filer fra "$1".',
			'errArchive'           : 'Kunne ikke opprette arkiv.',
			'errArcType'           : 'akriv-typen er ikke støttet.',
			'errNoArchive'         : 'Filen er ikke et arkiv eller et arkiv som ikke er støttet.',
			'errCmdNoSupport'      : 'Backend støtter ikke denne kommandoen.',
			'errReplByChild'       : 'The folder “$1” can’t be replaced by an item it contains.',
			'errArcSymlinks'       : 'Av sikkerhetsgrunner nektet å pakke ut inneholder arkiver symbolkoblinger eller filer med ikke tillatte navn.', // edited 24.06.2012
			'errArcMaxSize'        : 'Arkivfiler overskrider maksimal tillatt størrelse.',
			'errResize'            : 'Kan ikke endre størrelsen på "$1".',
			'errResizeDegree'      : 'Ugyldig rotasjonsgrad.',  // added 7.3.2013
			'errResizeRotate'      : 'Kan ikke rotere bildet.',  // added 7.3.2013
			'errResizeSize'        : 'Ugyldig bildestørrelse.',  // added 7.3.2013
			'errResizeNoChange'    : 'Bildestørrelsen er ikke endret.',  // added 7.3.2013
			'errUsupportType'      : 'Ustøttet filtype.',
			'errNotUTF8Content'    : 'Filen "$1" er ikke i UTF-8 og kan ikke redigeres.',  // added 9.11.2011
			'errNetMount'          : 'Kan ikke montere "$1".', // added 17.04.2012
			'errNetMountNoDriver'  : 'Ustøttet protokoll.',     // added 17.04.2012
			'errNetMountFailed'    : 'Montering mislyktes.',         // added 17.04.2012
			'errNetMountHostReq'   : 'Vert kreves.', // added 18.04.2012
			'errSessionExpires'    : 'Økten din har utløpt på grunn av inaktivitet.',
			'errCreatingTempDir'   : 'Kan ikke opprette midlertidig katalog: "$1"',
			'errFtpDownloadFile'   : 'Kan ikke laste ned fil fra FTP: "$1"',
			'errFtpUploadFile'     : 'Kan ikke laste opp filen til FTP: "$1"',
			'errFtpMkdir'          : 'Kan ikke opprette ekstern katalog på FTP: "$1"',
			'errArchiveExec'       : 'Feil under arkivering av filer: "$1"',
			'errExtractExec'       : 'Feil under utpakking av filer: "$1"',
			'errNetUnMount'        : 'Kan ikke demontere.', // from v2.1 added 30.04.2012
			'errConvUTF8'          : 'Kan ikke konverteres til UTF-8', // from v2.1 added 08.04.2014
			'errFolderUpload'      : 'Prøv den moderne nettleseren, hvis du vil laste opp mappen.', // from v2.1 added 26.6.2015
			'errSearchTimeout'     : 'Tidsavbrudd under søking av «$1». Søkeresultatet er delvis.', // from v2.1 added 12.1.2016
			'errReauthRequire'     : 'Det kreves ny autorisasjon.', // from v2.1.10 added 24.3.2016
			'errMaxTargets'        : 'Maks antall valgbare varer er $1.', // from v2.1.17 added 17.10.2016
			'errRestore'           : 'Kan ikke gjenopprette fra papirkurven. Kan ikke identifisere gjenopprettingsdestinasjonen.', // from v2.1.24 added 3.5.2017
			'errEditorNotFound'    : 'Finner ikke redigeringsprogrammet for denne filtypen.', // from v2.1.25 added 23.5.2017
			'errServerError'       : 'Det oppstod en feil på serversiden.', // from v2.1.25 added 16.6.2017
			'errEmpty'             : 'Kan ikke tømme mappen "$1".', // from v2.1.25 added 22.6.2017
			'moreErrors'           : 'Det er $1 flere feil.', // from v2.1.44 added 9.12.2018
			'errMaxMkdirs'         : 'Du kan opprette opptil $1 mapper om gangen.', // from v2.1.58 added 20.6.2021

			/******************************* commands names ********************************/
			'cmdarchive'   : 'Opprett arkiv',
			'cmdback'      : 'Tilbake',
			'cmdcopy'      : 'Kopier',
			'cmdcut'       : 'Klipp ut',
			'cmddownload'  : 'Last ned',
			'cmdduplicate' : 'Dupliser',
			'cmdedit'      : 'Rediger fil',
			'cmdextract'   : 'Pakk ut filer fra arkiv',
			'cmdforward'   : 'Frem',
			'cmdgetfile'   : 'Velg filer',
			'cmdhelp'      : 'Om',
			'cmdhome'      : 'Hjem',
			'cmdinfo'      : 'Vis info',
			'cmdmkdir'     : 'Ny mappe',
			'cmdmkdirin'   : 'Inn i ny mappe', // from v2.1.7 added 19.2.2016
			'cmdmkfile'    : 'Ny fil',
			'cmdopen'      : 'Åpne',
			'cmdpaste'     : 'Lim inn',
			'cmdquicklook' : 'Forhåndsvis',
			'cmdreload'    : 'Last inn på nytt',
			'cmdrename'    : 'Gi nytt navn',
			'cmdrm'        : 'Slett',
			'cmdtrash'     : 'Til søppel', //from v2.1.24 added 29.4.2017
			'cmdrestore'   : 'Restaurere', //from v2.1.24 added 3.5.2017
			'cmdsearch'    : 'Find filer',
			'cmdup'        : 'Opp et nivå',
			'cmdupload'    : 'Last opp filer',
			'cmdview'      : 'Vis',
			'cmdresize'    : 'Endre størrelse og roter',
			'cmdsort'      : 'Sortere',
			'cmdnetmount'  : 'Monter nettverksvolum', // added 18.04.2012
			'cmdnetunmount': 'Demonter', // from v2.1 added 30.04.2012
			'cmdplaces'    : 'Til steder', // added 28.12.2014
			'cmdchmod'     : 'Endre modus', // from v2.1 added 20.6.2015
			'cmdopendir'   : 'Åpne en mappe', // from v2.1 added 13.1.2016
			'cmdcolwidth'  : 'Tilbakestill kolonnebredden', // from v2.1.13 added 12.06.2016
			'cmdfullscreen': 'Full skjerm', // from v2.1.15 added 03.08.2016
			'cmdmove'      : 'Bevege seg', // from v2.1.15 added 21.08.2016
			'cmdempty'     : 'Tøm mappen', // from v2.1.25 added 22.06.2017
			'cmdundo'      : 'Angre', // from v2.1.27 added 31.07.2017
			'cmdredo'      : 'Gjøre om', // from v2.1.27 added 31.07.2017
			'cmdpreference': 'Preferanser', // from v2.1.27 added 03.08.2017
			'cmdselectall' : 'Velg alle', // from v2.1.28 added 15.08.2017
			'cmdselectnone': 'Velg ingen', // from v2.1.28 added 15.08.2017
			'cmdselectinvert': 'Inverter utvalg', // from v2.1.28 added 15.08.2017
			'cmdopennew'   : 'Åpne i nytt vindu', // from v2.1.38 added 3.4.2018
			'cmdhide'      : 'Skjul (preferanse)', // from v2.1.41 added 24.7.2018

			/*********************************** buttons ***********************************/
			'btnClose'  : 'Lukk',
			'btnSave'   : 'Lagre',
			'btnRm'     : 'Slett',
			'btnApply'  : 'Søke om',
			'btnCancel' : 'Avbryt',
			'btnNo'     : 'Nei',
			'btnYes'    : 'Ja',
			'btnMount'  : 'Monter',  // added 18.04.2012
			'btnApprove': 'Gå til $1 og godkjenn', // from v2.1 added 26.04.2012
			'btnUnmount': 'Demonter', // from v2.1 added 30.04.2012
			'btnConv'   : 'Konvertere', // from v2.1 added 08.04.2014
			'btnCwd'    : 'Her',      // from v2.1 added 22.5.2015
			'btnVolume' : 'Volum',    // from v2.1 added 22.5.2015
			'btnAll'    : 'Alle',       // from v2.1 added 22.5.2015
			'btnMime'   : 'MIME-type', // from v2.1 added 22.5.2015
			'btnFileName':'Filnavn',  // from v2.1 added 22.5.2015
			'btnSaveClose': 'Lagre og lukk', // from v2.1 added 12.6.2015
			'btnBackup' : 'Sikkerhetskopiering', // fromv2.1 added 28.11.2015
			'btnRename'    : 'Gi nytt navn',      // from v2.1.24 added 6.4.2017
			'btnRenameAll' : 'Gi nytt navn (alle)', // from v2.1.24 added 6.4.2017
			'btnPrevious' : 'Forrige ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnNext'     : 'Neste ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnSaveAs'   : 'Lagre som', // from v2.1.25 added 24.5.2017

			/******************************** notifications ********************************/
			'ntfopen'     : 'Åpne mappe',
			'ntffile'     : 'Åpne fil',
			'ntfreload'   : 'Last inn mappen på nytt',
			'ntfmkdir'    : 'Oppretter mappe',
			'ntfmkfile'   : 'Oppretter filer',
			'ntfrm'       : 'Sletter filer',
			'ntfcopy'     : 'Kopierer filer',
			'ntfmove'     : 'Flytter filer',
			'ntfprepare'  : 'Gjør klar til kopiering av filer',
			'ntfrename'   : 'Gir nytt navn til filer',
			'ntfupload'   : 'Laster opp filer',
			'ntfdownload' : 'Laster ned filer',
			'ntfsave'     : 'Lagrer filer',
			'ntfarchive'  : 'Oppretter arkiv',
			'ntfextract'  : 'Pakker ut filer fra arkiv',
			'ntfsearch'   : 'Søker i filer',
			'ntfresize'   : 'Endre størrelse på bilder',
			'ntfsmth'     : 'Gjør noe... >_<',
			'ntfloadimg'  : 'Laster inn bilde',
			'ntfnetmount' : 'Montering av nettverksvolum', // added 18.04.2012
			'ntfnetunmount': 'Demonterer nettverksvolum', // from v2.1 added 30.04.2012
			'ntfdim'      : 'Få bildedimensjon', // added 20.05.2013
			'ntfreaddir'  : 'Leser mappeinformasjon', // from v2.1 added 01.07.2013
			'ntfurl'      : 'Henter URL til lenke', // from v2.1 added 11.03.2014
			'ntfchmod'    : 'Endre filmodus', // from v2.1 added 20.6.2015
			'ntfpreupload': 'Bekrefter navnet på opplastingsfilen', // from v2.1 added 31.11.2015
			'ntfzipdl'    : 'Opprette en fil for nedlasting', // from v2.1.7 added 23.1.2016
			'ntfparents'  : 'Henter baneinformasjon', // from v2.1.17 added 2.11.2016
			'ntfchunkmerge': 'Behandler den opplastede filen', // from v2.1.17 added 2.11.2016
			'ntftrash'    : 'Kaster i søpla', // from v2.1.24 added 2.5.2017
			'ntfrestore'  : 'Gjenoppretter fra søpla', // from v2.1.24 added 3.5.2017
			'ntfchkdir'   : 'Sjekker målmappen', // from v2.1.24 added 3.5.2017
			'ntfundo'     : 'Angre tidligere operasjon', // from v2.1.27 added 31.07.2017
			'ntfredo'     : 'Gjør om forrige angret', // from v2.1.27 added 31.07.2017
			'ntfchkcontent' : 'Kontrollerer innholdet', // from v2.1.41 added 3.8.2018

			/*********************************** volumes *********************************/
			'volume_Trash' : 'Søppel', //from v2.1.24 added 29.4.2017

			/************************************ dates **********************************/
			'dateUnknown' : 'Ukjent',
			'Today'       : 'I dag',
			'Yesterday'   : 'I går',
			'msJan'       : 'Jan',
			'msFeb'       : 'Feb',
			'msMar'       : 'mars',
			'msApr'       : 'apr',
			'msMay'       : 'Mai',
			'msJun'       : 'Jun',
			'msJul'       : 'jul',
			'msAug'       : 'august',
			'msSep'       : 'sep',
			'msOct'       : 'Okt',
			'msNov'       : 'nov',
			'msDec'       : 'Des',
			'January'     : 'januar',
			'February'    : 'februar',
			'March'       : 'mars',
			'April'       : 'april',
			'May'         : 'Kan',
			'June'        : 'juni',
			'July'        : 'juli',
			'August'      : 'august',
			'September'   : 'september',
			'October'     : 'oktober',
			'November'    : 'november',
			'December'    : 'desember',
			'Sunday'      : 'søndag',
			'Monday'      : 'mandag',
			'Tuesday'     : 'tirsdag',
			'Wednesday'   : 'onsdag',
			'Thursday'    : 'Torsdag',
			'Friday'      : 'fredag',
			'Saturday'    : 'lørdag',
			'Sun'         : 'Sol',
			'Mon'         : 'man',
			'Tue'         : 'tirs',
			'Wed'         : 'ons',
			'Thu'         : 'tor',
			'Fri'         : 'fre',
			'Sat'         : 'Lør',

			/******************************** sort variants ********************************/
			'sortname'          : 'ved navn',
			'sortkind'          : 'etter slag',
			'sortsize'          : 'etter størrelse',
			'sortdate'          : 'etter dato',
			'sortFoldersFirst'  : 'Mapper først',
			'sortperm'          : 'med tillatelse', // from v2.1.13 added 13.06.2016
			'sortmode'          : 'etter modus',       // from v2.1.13 added 13.06.2016
			'sortowner'         : 'av eier',      // from v2.1.13 added 13.06.2016
			'sortgroup'         : 'etter gruppe',      // from v2.1.13 added 13.06.2016
			'sortAlsoTreeview'  : 'Også Treeview',  // from v2.1.15 added 01.08.2016

			/********************************** new items **********************************/
			'untitled file.txt' : 'NewFile.txt', // added 10.11.2015
			'untitled folder'   : 'Ny mappe',   // added 10.11.2015
			'Archive'           : 'Nytt arkiv',  // from v2.1 added 10.11.2015
			'untitled file'     : 'Ny fil.$1',  // from v2.1.41 added 6.8.2018
			'extentionfile'     : '$1: Fil',    // from v2.1.41 added 6.8.2018
			'extentiontype'     : '$1: $2',      // from v2.1.43 added 17.10.2018

			/********************************** messages **********************************/
			'confirmReq'      : 'Bekreftelse nødvendig',
			'confirmRm'       : 'Er du sikker på at du ønsker å slette filene?',
			'confirmRepl'     : 'Erstatt fil?',
			'confirmRest'     : 'Vil du erstatte eksisterende element med elementet i papirkurven?', // fromv2.1.24 added 5.5.2017
			'confirmConvUTF8' : 'Ikke i UTF-8<br/>Konverter til UTF-8?<br/>Innhold blir UTF-8 ved å lagre etter konvertering.', // from v2.1 added 08.04.2014
			'confirmNonUTF8'  : 'Tegnkoding av denne filen kunne ikke oppdages. Den må midlertidig konvertere til UTF-8 for redigering.<br/>Velg tegnkoding for denne filen.', // from v2.1.19 added 28.11.2016
			'confirmNotSave'  : 'Den har blitt endret.<br/>Mister arbeid hvis du ikke lagrer endringer.', // from v2.1 added 15.7.2015
			'confirmTrash'    : 'Er du sikker på at du vil flytte elementer til søppelbøtta?', //from v2.1.24 added 29.4.2017
			'confirmMove'     : 'Er du sikker på at du vil flytte elementer til "$1"?', //from v2.1.50 added 27.7.2019
			'apllyAll'        : 'Gjelder for alle',
			'name'            : 'Navn',
			'size'            : 'Størrelse',
			'perms'           : 'Rettigheter',
			'modify'          : 'Endret',
			'kind'            : 'Type',
			'read'            : 'les',
			'write'           : 'skriv',
			'noaccess'        : 'ingen adgang',
			'and'             : 'og',
			'unknown'         : 'ukjent',
			'selectall'       : 'Velg alle filene',
			'selectfiles'     : 'Velg fil(er)',
			'selectffile'     : 'Velg første fil',
			'selectlfile'     : 'Velg siste fil',
			'viewlist'        : 'Listevisning',
			'viewicons'       : 'Ikoner',
			'viewSmall'       : 'Små ikoner', // from v2.1.39 added 22.5.2018
			'viewMedium'      : 'Middels ikoner', // from v2.1.39 added 22.5.2018
			'viewLarge'       : 'Store ikoner', // from v2.1.39 added 22.5.2018
			'viewExtraLarge'  : 'Ekstra store ikoner', // from v2.1.39 added 22.5.2018
			'places'          : 'Områder',
			'calc'            : 'Beregn',
			'path'            : 'Bane',
			'aliasfor'        : 'Alias for',
			'locked'          : 'Låst',
			'dim'             : 'Størrelser',
			'files'           : 'Filer',
			'folders'         : 'Mapper',
			'items'           : 'objekter',
			'yes'             : 'ja',
			'no'              : 'nei',
			'link'            : 'Link',
			'searcresult'     : 'Søkeresultater',
			'selected'        : 'valgte filer',
			'about'           : 'Om',
			'shortcuts'       : 'Snarveier',
			'help'            : 'Hjelp',
			'webfm'           : 'Web-filbehandler',
			'ver'             : 'Versjon',
			'protocolver'     : 'protokol versjon',
			'homepage'        : 'Prosjekt hjem',
			'docs'            : 'dokumentasjon',
			'github'          : 'Fork us on Github',
			'twitter'         : 'Follow us on twitter',
			'facebook'        : 'Join us on facebook',
			'team'            : 'Team',
			'chiefdev'        : 'sjefutvikler',
			'developer'       : 'utvikler',
			'contributor'     : 'bidragsyter',
			'maintainer'      : 'vedlikeholder',
			'translator'      : 'oversetter',
			'icons'           : 'Ikoner',
			'dontforget'      : 'and don\'t forget to bring a towel',
			'shortcutsof'     : 'Snarveier avslått',
			'dropFiles'       : 'Slipp filer her',
			'or'              : 'eller',
			'selectForUpload' : 'Velg filer til opplasting',
			'moveFiles'       : 'Flytt filer',
			'copyFiles'       : 'Kopier filer',
			'restoreFiles'    : 'Gjenopprett elementer', // from v2.1.24 added 5.5.2017
			'rmFromPlaces'    : 'Fjern fra steder',
			'aspectRatio'     : 'Størrelsesforholdet',
			'scale'           : 'Skala',
			'width'           : 'Bredde',
			'height'          : 'Høyde',
			'resize'          : 'Endre størrelse',
			'crop'            : 'Avling',
			'rotate'          : 'Rotere',
			'rotate-cw'       : 'Roter 90 grader CW',
			'rotate-ccw'      : 'Roter 90 grader moturs',
			'degree'          : '°',
			'netMountDialogTitle' : 'Monter nettverksvolum', // added 18.04.2012
			'protocol'            : 'Protokoll', // added 18.04.2012
			'host'                : 'Vert', // added 18.04.2012
			'port'                : 'Havn', // added 18.04.2012
			'user'                : 'Bruker', // added 18.04.2012
			'pass'                : 'Passord', // added 18.04.2012
			'confirmUnmount'      : 'Avmonterer du $1?',  // from v2.1 added 30.04.2012
			'dropFilesBrowser': 'Slipp eller lim inn filer fra nettleseren', // from v2.1 added 30.05.2012
			'dropPasteFiles'  : 'Slipp filer, lim inn URL-er eller bilder (utklippstavle) her', // from v2.1 added 07.04.2014
			'encoding'        : 'Koding', // from v2.1 added 19.12.2014
			'locale'          : 'Språk',   // from v2.1 added 19.12.2014
			'searchTarget'    : 'Mål: $1',                // from v2.1 added 22.5.2015
			'searchMime'      : 'Søk etter inndata MIME-type', // from v2.1 added 22.5.2015
			'owner'           : 'Eieren', // from v2.1 added 20.6.2015
			'group'           : 'Gruppe', // from v2.1 added 20.6.2015
			'other'           : 'Annen', // from v2.1 added 20.6.2015
			'execute'         : 'Henrette', // from v2.1 added 20.6.2015
			'perm'            : 'Tillatelse', // from v2.1 added 20.6.2015
			'mode'            : 'Modus', // from v2.1 added 20.6.2015
			'emptyFolder'     : 'Mappen er tom', // from v2.1.6 added 30.12.2015
			'emptyFolderDrop' : 'Mappen er tom\\A Slipp for å legge til elementer', // from v2.1.6 added 30.12.2015
			'emptyFolderLTap' : 'Mappen er tom\\Et langt trykk for å legge til elementer', // from v2.1.6 added 30.12.2015
			'quality'         : 'Kvalitet', // from v2.1.6 added 5.1.2016
			'autoSync'        : 'Automatisk synkronisering',  // from v2.1.6 added 10.1.2016
			'moveUp'          : 'Flytte opp',  // from v2.1.6 added 18.1.2016
			'getLink'         : 'Få URL-lenke', // from v2.1.7 added 9.2.2016
			'selectedItems'   : 'Valgte varer ($1)', // from v2.1.7 added 2.19.2016
			'folderId'        : 'Mappe-ID', // from v2.1.10 added 3.25.2016
			'offlineAccess'   : 'Tillat tilgang uten nett', // from v2.1.10 added 3.25.2016
			'reAuth'          : 'For å autentisere på nytt', // from v2.1.10 added 3.25.2016
			'nowLoading'      : 'Laster...', // from v2.1.12 added 4.26.2016
			'openMulti'       : 'Åpne flere filer', // from v2.1.12 added 5.14.2016
			'openMultiConfirm': 'Du prøver å åpne $1-filene. Er du sikker på at du vil åpne i nettleseren?', // from v2.1.12 added 5.14.2016
			'emptySearch'     : 'Søkeresultatene er tomme i søkemålet.', // from v2.1.12 added 5.16.2016
			'editingFile'     : 'Det er å redigere en fil.', // from v2.1.13 added 6.3.2016
			'hasSelected'     : 'Du har valgt $1 varer.', // from v2.1.13 added 6.3.2016
			'hasClipboard'    : 'Du har $1 elementer på utklippstavlen.', // from v2.1.13 added 6.3.2016
			'incSearchOnly'   : 'Inkrementelt søk er bare fra gjeldende visning.', // from v2.1.13 added 6.30.2016
			'reinstate'       : 'Gjenopprett', // from v2.1.15 added 3.8.2016
			'complete'        : '$1 fullført', // from v2.1.15 added 21.8.2016
			'contextmenu'     : 'Kontekstmenyen', // from v2.1.15 added 9.9.2016
			'pageTurning'     : 'Sidevending', // from v2.1.15 added 10.9.2016
			'volumeRoots'     : 'Volum røtter', // from v2.1.16 added 16.9.2016
			'reset'           : 'Nullstille', // from v2.1.16 added 1.10.2016
			'bgcolor'         : 'Bakgrunnsfarge', // from v2.1.16 added 1.10.2016
			'colorPicker'     : 'Fargevelger', // from v2.1.16 added 1.10.2016
			'8pxgrid'         : '8px rutenett', // from v2.1.16 added 4.10.2016
			'enabled'         : 'Aktivert', // from v2.1.16 added 4.10.2016
			'disabled'        : 'Funksjonshemmet', // from v2.1.16 added 4.10.2016
			'emptyIncSearch'  : 'Søkeresultatene er tomme i gjeldende visning.\\ATrykk på [Enter] for å utvide søkemålet.', // from v2.1.16 added 5.10.2016
			'emptyLetSearch'  : 'Søkeresultater for første bokstav er tomme i gjeldende visning.', // from v2.1.23 added 24.3.2017
			'textLabel'       : 'Tekstetikett', // from v2.1.17 added 13.10.2016
			'minsLeft'        : '$1 min igjen', // from v2.1.17 added 13.11.2016
			'openAsEncoding'  : 'Åpne på nytt med valgt koding', // from v2.1.19 added 2.12.2016
			'saveAsEncoding'  : 'Lagre med valgt koding', // from v2.1.19 added 2.12.2016
			'selectFolder'    : 'Velg mappe', // from v2.1.20 added 13.12.2016
			'firstLetterSearch': 'Første bokstavsøk', // from v2.1.23 added 24.3.2017
			'presets'         : 'Forhåndsinnstillinger', // from v2.1.25 added 26.5.2017
			'tooManyToTrash'  : 'Det er for mange gjenstander, så det kan ikke gå i søppel.', // from v2.1.25 added 9.6.2017
			'TextArea'        : 'TextArea', // from v2.1.25 added 14.6.2017
			'folderToEmpty'   : 'Tøm mappen "$1".', // from v2.1.25 added 22.6.2017
			'filderIsEmpty'   : 'Det er ingen elementer i mappen "$1".', // from v2.1.25 added 22.6.2017
			'preference'      : 'Preferanse', // from v2.1.26 added 28.6.2017
			'language'        : 'Språk', // from v2.1.26 added 28.6.2017
			'clearBrowserData': 'Initialiser innstillingene som er lagret i denne nettleseren', // from v2.1.26 added 28.6.2017
			'toolbarPref'     : 'Verktøylinjeinnstillinger', // from v2.1.27 added 2.8.2017
			'charsLeft'       : '... $1 tegn igjen.',  // from v2.1.29 added 30.8.2017
			'linesLeft'       : '... $1 linjer igjen.',  // from v2.1.52 added 16.1.2020
			'sum'             : 'Sum', // from v2.1.29 added 28.9.2017
			'roughFileSize'   : 'Grov filstørrelse', // from v2.1.30 added 2.11.2017
			'autoFocusDialog' : 'Fokuser på elementet av dialog med museover',  // from v2.1.30 added 2.11.2017
			'select'          : 'Plukke ut', // from v2.1.30 added 23.11.2017
			'selectAction'    : 'Handling når du velger fil', // from v2.1.30 added 23.11.2017
			'useStoredEditor' : 'Åpne med redigeringsprogrammet som ble brukt sist', // from v2.1.30 added 23.11.2017
			'selectinvert'    : 'Inverter utvalg', // from v2.1.30 added 25.11.2017
			'renameMultiple'  : 'Er du sikker på at du vil gi nytt navn til $1 valgte elementer som $2?<br/>Dette kan ikke angres!', // from v2.1.31 added 4.12.2017
			'batchRename'     : 'Gi nytt navn til batch', // from v2.1.31 added 8.12.2017
			'plusNumber'      : '+ Nummer', // from v2.1.31 added 8.12.2017
			'asPrefix'        : 'Legg til prefiks', // from v2.1.31 added 8.12.2017
			'asSuffix'        : 'Legg til suffiks', // from v2.1.31 added 8.12.2017
			'changeExtention' : 'Endre utvidelse', // from v2.1.31 added 8.12.2017
			'columnPref'      : 'Kolonneinnstillinger (listevisning)', // from v2.1.32 added 6.2.2018
			'reflectOnImmediate' : 'Alle endringer vil umiddelbart gjenspeiles i arkivet.', // from v2.1.33 added 2.3.2018
			'reflectOnUnmount'   : 'Eventuelle endringer gjenspeiles ikke før demontering av dette volumet.', // from v2.1.33 added 2.3.2018
			'unmountChildren' : 'Følgende volum(er) montert på dette volumet er også avmontert. Er du sikker på å demontere den?', // from v2.1.33 added 5.3.2018
			'selectionInfo'   : 'Utvalg info', // from v2.1.33 added 7.3.2018
			'hashChecker'     : 'Algoritmer for å vise filhash', // from v2.1.33 added 10.3.2018
			'infoItems'       : 'Infoelementer (utvalgsinfopanel)', // from v2.1.38 added 28.3.2018
			'pressAgainToExit': 'Trykk igjen for å avslutte.', // from v2.1.38 added 1.4.2018
			'toolbar'         : 'Verktøylinje', // from v2.1.38 added 4.4.2018
			'workspace'       : 'Arbeidsplass', // from v2.1.38 added 4.4.2018
			'dialog'          : 'Dialog', // from v2.1.38 added 4.4.2018
			'all'             : 'Alle', // from v2.1.38 added 4.4.2018
			'iconSize'        : 'Ikonstørrelse (ikonvisning)', // from v2.1.39 added 7.5.2018
			'editorMaximized' : 'Åpne vinduet for maksimert redigering', // from v2.1.40 added 30.6.2018
			'editorConvNoApi' : 'Fordi konvertering via API for øyeblikket ikke er tilgjengelig, vennligst konverter på nettstedet.', //from v2.1.40 added 8.7.2018
			'editorConvNeedUpload' : 'Fordi konvertering via API for øyeblikket ikke er tilgjengelig, vennligst konverter på nettstedet.', //from v2.1.40 added 8.7.2018
			'convertOn'       : 'Konverter på nettstedet til $1', // from v2.1.40 added 10.7.2018
			'integrations'    : 'Integrasjoner', // from v2.1.40 added 11.7.2018
			'integrationWith' : 'Denne elFinder har følgende eksterne tjenester integrert. Vennligst sjekk vilkårene for bruk, personvernerklæringen osv. før du bruker den.', // from v2.1.40 added 11.7.2018
			'showHidden'      : 'Vis skjulte elementer', // from v2.1.41 added 24.7.2018
			'hideHidden'      : 'Skjul skjulte elementer', // from v2.1.41 added 24.7.2018
			'toggleHidden'    : 'Vis/skjul skjulte elementer', // from v2.1.41 added 24.7.2018
			'makefileTypes'   : 'Filtyper for å aktivere med "Ny fil"', // from v2.1.41 added 7.8.2018
			'typeOfTextfile'  : 'Type tekstfil', // from v2.1.41 added 7.8.2018
			'add'             : 'Legge til', // from v2.1.41 added 7.8.2018
			'theme'           : 'Tema', // from v2.1.43 added 19.10.2018
			'default'         : 'Misligholde', // from v2.1.43 added 19.10.2018
			'description'     : 'Beskrivelse', // from v2.1.43 added 19.10.2018
			'website'         : 'Nettsted', // from v2.1.43 added 19.10.2018
			'author'          : 'Forfatter', // from v2.1.43 added 19.10.2018
			'email'           : 'E-post', // from v2.1.43 added 19.10.2018
			'license'         : 'Tillatelse', // from v2.1.43 added 19.10.2018
			'exportToSave'    : 'Dette elementet kan ikke lagres. For å unngå å miste redigeringene må du eksportere til PC-en.', // from v2.1.44 added 1.12.2018
			'dblclickToSelect': 'Dobbeltklikk på filen for å velge den.', // from v2.1.47 added 22.1.2019
			'useFullscreen'   : 'Bruk fullskjermmodus', // from v2.1.47 added 19.2.2019

			/********************************** mimetypes **********************************/
			'kindUnknown'     : 'Ukjent',
			'kindRoot'        : 'Volumrot', // from v2.1.16 added 16.10.2016
			'kindFolder'      : 'Mappe',
			'kindSelects'     : 'Utvalg', // from v2.1.29 added 29.8.2017
			'kindAlias'       : 'Snarvei',
			'kindAliasBroken' : 'Ugyldig snarvei',
			// applications
			'kindApp'         : 'Programfil',
			'kindPostscript'  : 'Postscript dokument',
			'kindMsOffice'    : 'Microsoft Office dokument',
			'kindMsWord'      : 'Microsoft Word dokument',
			'kindMsExcel'     : 'Microsoft Excel dokument',
			'kindMsPP'        : 'Microsoft Powerpoint-presentasjon',
			'kindOO'          : 'Open Office dokument',
			'kindAppFlash'    : 'Flash',
			'kindPDF'         : 'Portabelt dokument (PDF)',
			'kindTorrent'     : 'Bittorrent-fil',
			'kind7z'          : '7z arkiv',
			'kindTAR'         : 'TAR arkiv',
			'kindGZIP'        : 'GZIP arkiv',
			'kindBZIP'        : 'BZIP arkiv',
			'kindXZ'          : 'XZ arkiv',
			'kindZIP'         : 'ZIP arkiv',
			'kindRAR'         : 'RAR ar',
			'kindJAR'         : 'Java JAR-fil',
			'kindTTF'         : 'True Type-skrift',
			'kindOTF'         : 'Åpne Type font',
			'kindRPM'         : 'RPM-pakke',
			// texts
			'kindText'        : 'Tekst dokument',
			'kindTextPlain'   : 'Ren tekst',
			'kindPHP'         : 'PHP kilde',
			'kindCSS'         : 'Cascading stilark',
			'kindHTML'        : 'HTML dokument',
			'kindJS'          : 'Javascript',
			'kindRTF'         : 'Rikt Tekst Format',
			'kindC'           : 'C kilde',
			'kindCHeader'     : 'C header kilde',
			'kindCPP'         : 'C++ kilde',
			'kindCPPHeader'   : 'C++ header kilde',
			'kindShell'       : 'Unix-skallskript',
			'kindPython'      : 'Python kilde',
			'kindJava'        : 'Java kilde',
			'kindRuby'        : 'Ruby kilde',
			'kindPerl'        : 'Perl-manus',
			'kindSQL'         : 'SQL skilde',
			'kindXML'         : 'XML dokument',
			'kindAWK'         : 'AWK kilde',
			'kindCSV'         : 'Kommaseparerte verdier',
			'kindDOCBOOK'     : 'Docbook XML dokument',
			'kindMarkdown'    : 'Markdown-tekst', // added 20.7.2015
			// images
			'kindImage'       : 'Bilde',
			'kindBMP'         : 'BMP bilde',
			'kindJPEG'        : 'JPEG bilde',
			'kindGIF'         : 'GIF bilde',
			'kindPNG'         : 'PNG bilde',
			'kindTIFF'        : 'TIFF bilde',
			'kindTGA'         : 'TGA bilde',
			'kindPSD'         : 'Adobe Photoshop bilde',
			'kindXBITMAP'     : 'X bitmap bilde',
			'kindPXM'         : 'Pixelmator bilde',
			// media
			'kindAudio'       : 'Lydmedier',
			'kindAudioMPEG'   : 'MPEG-lyd',
			'kindAudioMPEG4'  : 'MPEG-4 lyd',
			'kindAudioMIDI'   : 'MIDI-lyd',
			'kindAudioOGG'    : 'Ogg Vorbis lyd',
			'kindAudioWAV'    : 'WAV-lyd',
			'AudioPlaylist'   : 'MP3 spilleliste',
			'kindVideo'       : 'Videomedier',
			'kindVideoDV'     : 'DV film',
			'kindVideoMPEG'   : 'MPEG film',
			'kindVideoMPEG4'  : 'MPEG-4 film',
			'kindVideoAVI'    : 'AVI film',
			'kindVideoMOV'    : 'Quick Time film',
			'kindVideoWM'     : 'Windows Media film',
			'kindVideoFlash'  : 'Flash film',
			'kindVideoMKV'    : 'Matroska film',
			'kindVideoOGG'    : 'Ogg film'
		}
	};
}));

js/i18n/elfinder.vi.js000064400000110713151215013360010502 0ustar00/**
 * Ngôn ngữ Việt Nam translation
 * @author Chung Thủy f <chungthuyf@gmail.com>
 * @author Son Nguyen <son.nguyen@catalyst.net.nz>
 * @author Nguyễn Trần Chung <admin@chungnguyen.xyz>
 * @version 2022-03-04
 */
 (function(root, factory) {
	if (typeof define === 'function' && define.amd) {
		define(['elfinder'], factory);
	} else if (typeof exports !== 'undefined') {
		module.exports = factory(require('elfinder'));
	} else {
		factory(root.elFinder);
	}
}(this, function(elFinder) {
	elFinder.prototype.i18.vi = {
		translator : 'Chung Thủy f &lt;chungthuyf@gmail.com&gt;, Son Nguyen &lt;son.nguyen@catalyst.net.nz&gt;, Nguyễn Trần Chung &lt;admin@chungnguyen.xyz&gt;',
		language   : 'Ngôn ngữ Việt Nam',
		direction  : 'ltr',
		dateFormat : 'd.m.Y H:i', // will show like: 04.03.2022 11:11
		fancyDateFormat : '$1 H:i', // will show like: Hôm nay 11:11
		nonameDateFormat : 'ymd-His', // noname upload will show like: 220304-111107
		messages   : {
			'getShareText' : 'Đăng lại',
			'Editor ': 'Trình chỉnh sửa mã',

			/********************************** errors **********************************/
			'error'                : 'Lỗi',
			'errUnknown'           : 'Lỗi không xác định được.',
			'errUnknownCmd'        : 'Lỗi không rõ lệnh.',
			'errJqui'              : 'Cấu hình jQueryUI không hợp lệ. Các thành phần lựa chọn, kéo và thả phải được bao gồm.',
			'errNode'              : 'elFinder đòi hỏi phần tử DOM phải được tạo ra.',
			'errURL'               : 'Cấu hình elFinder không hợp lệ! URL không được thiết lập tùy chọn.',
			'errAccess'            : 'Truy cập bị từ chối.',
			'errConnect'           : 'Không thể kết nối với backend.',
			'errAbort'             : 'Kết nối bị hủy bỏ.',
			'errTimeout'           : 'Thời gian chờ kết nối đã hết.',
			'errNotFound'          : 'Backend không tìm thấy.',
			'errResponse'          : 'Phản hồi backend không hợp lệ.',
			'errConf'              : 'Cấu hình backend không hợp lệ.',
			'errJSON'              : 'Mô-đun PHP JSON không được cài đặt.',
			'errNoVolumes'         : 'Tập có thể đọc không có sẵn.',
			'errCmdParams'         : 'Thông số không hợp lệ cho lệnh "$1".',
			'errDataNotJSON'       : 'Dữ liệu không phải là JSON.',
			'errDataEmpty'         : 'Dữ liệu trống.',
			'errCmdReq'            : 'Backend đòi hỏi tên lệnh.',
			'errOpen'              : 'Không thể mở "$1".',
			'errNotFolder'         : 'Đối tượng không phải là một thư mục.',
			'errNotFile'           : 'Đối tượng không phải là một tập tin.',
			'errRead'              : 'Không thể đọc "$1".',
			'errWrite'             : 'Không thể ghi vào "$1".',
			'errPerm'              : 'Quyền bị từ chối.',
			'errLocked'            : '"$1" đã bị khóa và không thể đổi tên, di chuyển hoặc loại bỏ.',
			'errExists'            : 'Tập tin có tên "$1" đã tồn tại.',
			'errInvName'           : 'Tên tập tin không hợp lệ.',
			'errInvDirname'        : 'Tên thư mục không hợp lệ.',  // from v2.1.24 added 12.4.2017
			'errFolderNotFound'    : 'Thư mục không tìm thấy.',
			'errFileNotFound'      : 'Tập tin không tìm thấy.',
			'errTrgFolderNotFound' : 'Thư mục đích "$1" không được tìm thấy.',
			'errPopup'             : 'Trình duyệt ngăn chặn mở cửa sổ popup.',
			'errMkdir'             : 'Không thể tạo thư mục "$1".',
			'errMkfile'            : 'Không thể tạo tập tin "$1".',
			'errRename'            : 'Không thể đổi tên "$1".',
			'errCopyFrom'          : 'Sao chép tập tin từ tập "$1" không được phép.',
			'errCopyTo'            : 'Sao chép tập tin tới tập "$1" không được phép.',
			'errMkOutLink'         : 'Không thể tạo liên kết ra bên ngoài volume root.', // from v2.1 added 03.10.2015
			'errUpload'            : 'Tải lên báo lỗi.',  // old name - errUploadCommon
			'errUploadFile'        : 'Không thể tải lên "$1".', // old name - errUpload
			'errUploadNoFiles'     : 'Không thấy tập tin nào để tải lên.',
			'errUploadTotalSize'   : 'Dữ liệu vượt quá kích thước tối đa cho phép.', // old name - errMaxSize
			'errUploadFileSize'    : 'Tập tin vượt quá kích thước tối đa cho phép.', //  old name - errFileMaxSize
			'errUploadMime'        : 'Kiểu tập tin không được phép.',
			'errUploadTransfer'    : 'Lỗi khi truyền "$1".',
			'errUploadTemp'        : 'Không thể tạo thư mục tạm để tải lên.', // from v2.1 added 26.09.2015
			'errNotReplace'        : 'Đối tượng "$1" đã tồn tại ở vị trí này và không thể thay thế bằng đối tượng với loại khác.', // new
			'errReplace'           : 'Không thể thay thế "$1".',
			'errSave'              : 'Không thể lưu "$1".',
			'errCopy'              : 'Không thể sao chép "$1".',
			'errMove'              : 'Không thể chuyển "$1".',
			'errCopyInItself'      : 'Không thể sao chép "$1" vào chính nó.',
			'errRm'                : 'Không thể xóa "$1".',
			'errTrash'             : 'Không thể cho vào thùng rác.', // from v2.1.24 added 30.4.2017
			'errRmSrc'             : 'Không thể xóa tệp nguồn.',
			'errExtract'           : 'Không thể giải nén các tập tin từ"$1".',
			'errArchive'           : 'Không thể tạo ra lưu trữ.',
			'errArcType'           : 'Loại lưu trữ không được hỗ trợ.',
			'errNoArchive'         : 'Tập tin không phải là lưu trữ hoặc có kiểu lưu trữ không được hỗ trợ.',
			'errCmdNoSupport'      : 'Backend không hỗ trợ lệnh này.',
			'errReplByChild'       : 'Thư mục "$1" không thể được thay thế bằng một mục con mà nó chứa.',
			'errArcSymlinks'       : 'Vì lý do bảo mật, từ chối giải nén tập tin lưu trữ có chứa liên kết mềm.', // edited 24.06.2012
			'errArcMaxSize'        : 'Tập tin lưu trữ vượt quá kích thước tối đa cho phép.',
			'errResize'            : 'Không thể thay đổi kích thước "$1".',
			'errResizeDegree'      : 'Độ xoay không hợp lệ.',  // added 7.3.2013
			'errResizeRotate'      : 'Không thể xoay hình ảnh.',  // added 7.3.2013
			'errResizeSize'        : 'Kích thước hình ảnh không hợp lệ.',  // added 7.3.2013
			'errResizeNoChange'    : 'Kích thước hình ảnh không thay đổi.',  // added 7.3.2013
			'errUsupportType'      : 'Loại tập tin không được hỗ trợ.',
			'errNotUTF8Content'    : 'Tệp "$1" không phải bộ ký tự UTF-8 nên không thể chỉnh sửa.',  // added 9.11.2011
			'errNetMount'          : 'Không thể gắn kết "$1".', // added 17.04.2012
			'errNetMountNoDriver'  : 'Giao thức không được hỗ trợ.',     // added 17.04.2012
			'errNetMountFailed'    : 'Gắn (kết nối) thất bại.',         // added 17.04.2012
			'errNetMountHostReq'   : 'Yêu cầu máy chủ.', // added 18.04.2012
			'errSessionExpires'    : 'Phiên của bạn đã hết hạn do không hoạt động.',
			'errCreatingTempDir'   : 'Không thể tạo thư mục tạm thời: "$1"',
			'errFtpDownloadFile'   : 'Không thể tải xuống tệp từ FTP: "$1"',
			'errFtpUploadFile'     : 'Không thể tải tệp lên FTP: "$1"',
			'errFtpMkdir'          : 'Không thể tạo thư mục từ xa trên FTP: "$1"',
			'errArchiveExec'       : 'Lỗi trong khi lưu trữ tệp: "$1"',
			'errExtractExec'       : 'Lỗi trong khi giải nén tập tin: "$1"',
			'errNetUnMount'        : 'Không thể gỡ gắn (liên kết).', // from v2.1 added 30.04.2012
			'errConvUTF8'          : 'Không thể chuyển đổi thành UTF-8', // from v2.1 added 08.04.2014
			'errFolderUpload'      : 'Hãy thử trình duyệt mới hơn (vì trình duyệt hiện tại có vẻ cũ nên không hỗ trợ  tải lên thư mục).', // from v2.1 added 26.6.2015
			'errSearchTimeout'     : 'Đã hết thời gian trong khi tìm kiếm "$1". Kết quả tìm kiếm là một phần.', // from v2.1 added 12.1.2016
			'errReauthRequire'     : 'Cần ủy quyền lại.', // from v2.1.10 added 24.3.2016
			'errMaxTargets'        : 'Số lượng tối đa của các mục có thể chọn là $1.', // from v2.1.17 added 17.10.2016
			'errRestore'           : 'Không thể khôi phục từ thùng rác. Không thể xác định đích khôi phục.', // from v2.1.24 added 3.5.2017
			'errEditorNotFound'    : 'Không tìm thấy trình chỉnh sửa cho loại tệp này.', // from v2.1.25 added 23.5.2017
			'errServerError'       : 'Lỗi xảy ra ở phía máy chủ.', // from v2.1.25 added 16.6.2017
			'errEmpty'             : 'Không thể làm rỗng thư mục "$1".', // from v2.1.25 added 22.6.2017
			'moreErrors'           : 'Có thêm $1 lỗi.', // from v2.1.44 added 9.12.2018
			'errMaxMkdirs'         : 'Bạn có thể tạo tối đa $ 1 thư mục cùng một lúc.', // from v2.1.58 added 20.6.2021

			/******************************* commands names ********************************/
			'cmdarchive'   : 'Tạo tập tin nén',
			'cmdback'      : 'Trở lại',
			'cmdcopy'      : 'Sao chép',
			'cmdcut'       : 'Cắt',
			'cmddownload'  : 'Tải về',
			'cmdduplicate' : 'Bản sao',
			'cmdedit'      : 'Sửa tập tin',
			'cmdextract'   : 'Giải nén tập tin',
			'cmdforward'   : 'Trước',
			'cmdgetfile'   : 'Chọn tập tin',
			'cmdhelp'      : 'Giới thiệu phần mềm',
			'cmdhome'      : 'Home',
			'cmdinfo'      : 'Thông tin',
			'cmdmkdir'     : 'Thư mục',
			'cmdmkdirin'   : 'Vào thư mục mới', // from v2.1.7 added 19.2.2016
			'cmdmkfile'    : 'Tạo tập tin Text',
			'cmdopen'      : 'Mở',
			'cmdpaste'     : 'Dán',
			'cmdquicklook' : 'Xem trước',
			'cmdreload'    : 'Nạp lại',
			'cmdrename'    : 'Đổi tên',
			'cmdrm'        : 'Xóa',
			'cmdtrash'     : 'Vào thùng rác', //from v2.1.24 added 29.4.2017
			'cmdrestore'   : 'Khôi phục', //from v2.1.24 added 3.5.2017
			'cmdsearch'    : 'Tìm tập tin',
			'cmdup'        : 'Đi tới thư mục mẹ',
			'cmdupload'    : 'Tải tập tin lên',
			'cmdview'      : 'Xem',
			'cmdresize'    : 'Thay đổi kích thước và xoay',
			'cmdsort'      : 'Sắp xếp',
			'cmdnetmount'  : 'Gắn kết khối lượng mạng', // added 18.04.2012
			'cmdnetunmount': 'Gỡ mount', // from v2.1 added 30.04.2012
			'cmdplaces'    : 'Đến địa điểm', // added 28.12.2014
			'cmdchmod'     : 'Thay đổi chế độ', // from v2.1 added 20.6.2015
			'cmdopendir'   : 'Mở một thư mục', // from v2.1 added 13.1.2016
			'cmdcolwidth'  : 'Đặt lại chiều rộng cột', // from v2.1.13 added 12.06.2016
			'cmdfullscreen': 'Toàn màn hình', // from v2.1.15 added 03.08.2016
			'cmdmove'      : 'Di chuyển', // from v2.1.15 added 21.08.2016
			'cmdempty'     : 'Làm rỗng thư mục', // from v2.1.25 added 22.06.2017
			'cmdundo'      : 'Hủy bỏ (hoàn tác)', // from v2.1.27 added 31.07.2017
			'cmdredo'      : 'Làm lại', // from v2.1.27 added 31.07.2017
			'cmdpreference': 'Sở thích', // from v2.1.27 added 03.08.2017
			'cmdselectall' : 'Chọn tất cả', // from v2.1.28 added 15.08.2017
			'cmdselectnone': 'Không chọn gì', // from v2.1.28 added 15.08.2017
			'cmdselectinvert': 'Chọn ngược lại', // from v2.1.28 added 15.08.2017
			'cmdopennew'   : 'Mở trong cửa sổ mới', // from v2.1.38 added 3.4.2018
			'cmdhide'      : 'Ẩn (Preference)', // from v2.1.41 added 24.7.2018

			/*********************************** buttons ***********************************/
			'btnClose'  : 'Đóng',
			'btnSave'   : 'Lưu',
			'btnRm'     : 'Gỡ bỏ',
			'btnApply'  : 'Áp dụng',
			'btnCancel' : 'Hủy bỏ',
			'btnNo'     : 'Không',
			'btnYes'    : 'Đồng ý',
			'btnMount'  : 'Gắn kết',  // added 18.04.2012
			'btnApprove': 'Đạt được $ 1 và phê duyệt', // from v2.1 added 26.04.2012
			'btnUnmount': 'Tháo gỡ', // from v2.1 added 30.04.2012
			'btnConv'   : 'Chuyển thành', // from v2.1 added 08.04.2014
			'btnCwd'    : 'Đây',      // from v2.1 added 22.5.2015
			'btnVolume' : 'Âm lượng',    // from v2.1 added 22.5.2015
			'btnAll'    : 'Tất cả',       // from v2.1 added 22.5.2015
			'btnMime'   : 'Loại MIME', // from v2.1 added 22.5.2015
			'btnFileName':'Tên tệp',  // from v2.1 added 22.5.2015
			'btnSaveClose': 'Lưu & Đóng', // from v2.1 added 12.6.2015
			'btnBackup' : 'Sao lưu', // fromv2.1 added 28.11.2015
			'btnRename'    : 'Đổi tên',      // from v2.1.24 added 6.4.2017
			'btnRenameAll' : 'Đổi tên (Tất cả)', // from v2.1.24 added 6.4.2017
			'btnPrevious' : 'Trước đó ($ 1 / $ 2)', // from v2.1.24 added 11.5.2017
			'btnNext'     : 'Tiếp theo ($ 1 / $ 2)', // from v2.1.24 added 11.5.2017
			'btnSaveAs'   : 'Lưu thành', // from v2.1.25 added 24.5.2017

			/******************************** notifications ********************************/
			'ntfopen'     : 'Mở thư mục',
			'ntffile'     : 'Mở tập tin',
			'ntfreload'   : 'Nạp lại nội dung thư mục',
			'ntfmkdir'    : 'Tạo thư mục',
			'ntfmkfile'   : 'Tạo tập tin',
			'ntfrm'       : 'Xóa tập tin',
			'ntfcopy'     : 'Sao chép tập tin',
			'ntfmove'     : 'Di chuyển tập tin',
			'ntfprepare'  : 'Chuẩn bị để sao chép các tập tin',
			'ntfrename'   : 'Đổi tên tập tin',
			'ntfupload'   : 'Tải tập tin lên',
			'ntfdownload' : 'Tải tập tin',
			'ntfsave'     : 'Lưu tập tin',
			'ntfarchive'  : 'Tạo tập tin nén',
			'ntfextract'  : 'Giải nén tập tin',
			'ntfsearch'   : 'Tìm kiếm tập tin',
			'ntfresize'   : 'Thay đổi kích thước hình ảnh',
			'ntfsmth'     : 'Doing something >_<',
			'ntfloadimg'  : 'Đang tải hình ảnh',
			'ntfnetmount' : 'Gắn kết khối lượng mạng', // added 18.04.2012
			'ntfnetunmount': 'Ngắt kết nối âm lượng mạng', // from v2.1 added 30.04.2012
			'ntfdim'      : 'Nhận kích thước hình ảnh', // added 20.05.2013
			'ntfreaddir'  : 'Đọc thông tin thư mục', // from v2.1 added 01.07.2013
			'ntfurl'      : 'Lấy URL của liên kết', // from v2.1 added 11.03.2014
			'ntfchmod'    : 'Thay đổi chế độ tệp', // from v2.1 added 20.6.2015
			'ntfpreupload': 'Xác minh tên tệp tải lên', // from v2.1 added 31.11.2015
			'ntfzipdl'    : 'Tạo một tệp để tải xuống', // from v2.1.7 added 23.1.2016
			'ntfparents'  : 'Nhận thông tin đường dẫn', // from v2.1.17 added 2.11.2016
			'ntfchunkmerge': 'Xử lý tệp đã tải lên', // from v2.1.17 added 2.11.2016
			'ntftrash'    : 'Ném vào thùng rác', // from v2.1.24 added 2.5.2017
			'ntfrestore'  : 'Đang khôi phục từ thùng rác', // from v2.1.24 added 3.5.2017
			'ntfchkdir'   : 'Kiểm tra thư mục đích', // from v2.1.24 added 3.5.2017
			'ntfundo'     : 'Hoàn tác hoạt động trước đó', // from v2.1.27 added 31.07.2017
			'ntfredo'     : 'Làm lại hoàn tác trước đó', // from v2.1.27 added 31.07.2017
			'ntfchkcontent' : 'Kiểm tra nội dung', // from v2.1.41 added 3.8.2018

			/*********************************** volumes *********************************/
			'volume_Trash' : 'Rác', //from v2.1.24 added 29.4.2017

			/************************************ dates **********************************/
			'dateUnknown' : 'Chưa biết',
			'Today'       : 'Hôm nay',
			'Yesterday'   : 'Hôm qua',
			'msJan'       : 'Tháng 1',
			'msFeb'       : 'Tháng 2',
			'msMar'       : 'Tháng 3',
			'msApr'       : 'Tháng 4',
			'msMay'       : 'Tháng 5',
			'msJun'       : 'Tháng 6',
			'msJul'       : 'Tháng 7',
			'msAug'       : 'Tháng 8',
			'msSep'       : 'Tháng 9',
			'msOct'       : 'Tháng 10',
			'msNov'       : 'Tháng 11',
			'msDec'       : 'Tháng 12',
			'January'     : 'Tháng 1',
			'February'    : 'Tháng 2',
			'March'       : 'Tháng 3',
			'April'       : 'Tháng 4',
			'May'         : 'Tháng 5',
			'June'        : 'Tháng 6',
			'July'        : 'Tháng 7',
			'August'      : 'Tháng 8',
			'September'   : 'Tháng 9',
			'October'     : 'Tháng 10',
			'November'    : 'Tháng 11',
			'December'    : 'Tháng 12',
			'Sunday'      : 'Chủ nhật',
			'Monday'      : 'Thứ 2',
			'Tuesday'     : 'Thứ 3',
			'Wednesday'   : 'Thứ 4',
			'Thursday'    : 'Thứ 5',
			'Friday'      : 'Thứ 6',
			'Saturday'    : 'Thứ 7',
			'Sun'         : 'Chủ nhật',
			'Mon'         : 'Thứ 2',
			'Tue'         : 'Thứ 3',
			'Wed'         : 'Thứ 4',
			'Thu'         : 'Thứ 5',
			'Fri'         : 'Thứ 6',
			'Sat'         : 'Thứ 7',

			/******************************** sort variants ********************************/
			'sortname'          : 'theo tên',
			'sortkind'          : 'theo loại',
			'sortsize'          : 'theo kích cỡ',
			'sortdate'          : 'theo ngày',
			'sortFoldersFirst'  : 'Thư mục đầu tiên',
			'sortperm'          : 'theo quyền hạn', // from v2.1.13 added 13.06.2016
			'sortmode'          : 'theo chế độ',       // from v2.1.13 added 13.06.2016
			'sortowner'         : 'theo người tạo',      // from v2.1.13 added 13.06.2016
			'sortgroup'         : 'theo nhóm',      // from v2.1.13 added 13.06.2016
			'sortAlsoTreeview'  : 'Ngoài ra Treeview',  // from v2.1.15 added 01.08.2016

			/********************************** new items **********************************/
			'untitled file.txt' : 'Tập tin mới.txt', // added 10.11.2015
			'untitled folder'   : 'Thư mục mới',   // added 10.11.2015
			'Archive'           : 'NewArchive',  // from v2.1 added 10.11.2015
			'untitled file'     : 'Tập tin mới.$1',  // from v2.1.41 added 6.8.2018
			'extentionfile'     : '$ 1: Tệp',    // from v2.1.41 added 6.8.2018
			'extentiontype'     : '$1: $2',      // from v2.1.43 added 17.10.2018

			/********************************** messages **********************************/
			'confirmReq'      : 'Yêu cầu xác nhận',
			'confirmRm'       : 'Bạn có chắc chắn muốn xóa vĩnh viễn các mục?<br/>  Điều này không thể được hoàn tác!',
			'confirmRepl'     : 'Thay tập tin cũ bằng tập tin mới? (Nếu nó chứa các thư mục, nó sẽ được hợp nhất. Để sao lưu và thay thế, chọn Sao lưu.)',
			'confirmRest'     : 'Thay thế mục hiện có bằng một mục trong thùng rác?', // fromv2.1.24 added 5.5.2017
			'confirmConvUTF8' : 'Không có trong UTF-8 <br/> Chuyển đổi thành UTF-8? <br/> Nội dung trở thành UTF-8 bằng cách lưu sau khi chuyển đổi.', // from v2.1 added 08.04.2014
			'confirmNonUTF8'  : 'Không thể phát hiện mã hóa ký tự của tệp này. Nó cần tạm thời chuyển đổi thành UTF-8 để chỉnh sửa. <br/> Vui lòng chọn mã hóa ký tự của tệp này.', // from v2.1.19 added 28.11.2016
			'confirmNotSave'  : 'Nó đã được sửa đổi. <br/> Sẽ mất công nếu bạn không lưu các thay đổi.', // from v2.1 added 15.7.2015
			'confirmTrash'    : 'Bạn có chắc chắn muốn chuyển các mục vào thùng rác?', //from v2.1.24 added 29.4.2017
			'confirmMove'     : 'Bạn có chắc chắn muốn chuyển các mục vào "$1"?', //from v2.1.50 added 27.7.2019
			'apllyAll'        : 'Áp dụng cho tất cả',
			'name'            : 'Tên',
			'size'            : 'Kích cỡ',
			'perms'           : 'Quyền',
			'modify'          : 'Sửa đổi',
			'kind'            : 'Loại',
			'read'            : 'đọc',
			'write'           : 'viết',
			'noaccess'        : 'không truy cập',
			'and'             : 'và',
			'unknown'         : 'không xác định',
			'selectall'       : 'Chọn tất cả các mục',
			'selectfiles'     : 'Chọn các mục',
			'selectffile'     : 'Chọn mục đầu tiên',
			'selectlfile'     : 'Chọn mục cuối cùng',
			'viewlist'        : 'Hiển thị danh sách',
			'viewicons'       : 'Hiển thị biểu tượng',
			'viewSmall'       : 'Biểu tượng nhỏ', // from v2.1.39 added 22.5.2018
			'viewMedium'      : 'Biểu tượng vừa', // from v2.1.39 added 22.5.2018
			'viewLarge'       : 'Biểu tượng lớn', // from v2.1.39 added 22.5.2018
			'viewExtraLarge'  : 'Biểu tượng cực lớn', // from v2.1.39 added 22.5.2018
			'places'          : 'Nơi',
			'calc'            : 'Tính toán',
			'path'            : 'Đường dẫn',
			'aliasfor'        : 'Bí danh cho',
			'locked'          : 'Đã khóa',
			'dim'             : 'Kích thước',
			'files'           : 'Tệp',
			'folders'         : 'Thư mục',
			'items'           : 'vật phẩm',
			'yes'             : 'Vâng',
			'no'              : 'không',
			'link'            : 'Liên kết',
			'searcresult'     : 'Kết quả tìm kiếm',
			'selected'        : 'mục đã chọn',
			'about'           : 'Về',
			'shortcuts'       : 'Lối tắt',
			'help'            : 'Giúp đỡ',
			'webfm'           : 'Trình quản lý tệp web',
			'ver'             : 'Phiên bản',
			'protocolver'     : 'phiên bản protocol',
			'homepage'        : 'Trang chủ dự án',
			'docs'            : 'Tài liệu',
			'github'          : 'Theo dõi chúng tôi trên GitHub',
			'twitter'         : 'Theo dõi chúng tôi trên Twitter',
			'facebook'        : 'Theo dõi chúng tôi trên Facebook',
			'team'            : 'Đội ngũ',
			'chiefdev'        : 'Trùm sò',
			'developer'       : 'người phát triển',
			'contributor'     : 'người đóng góp',
			'maintainer'      : 'người bảo trì',
			'translator'      : 'người dịch',
			'icons'           : 'Biểu tượng',
			'dontforget'      : 'và đừng quên lấy khăn tắm của bạn',
			'shortcutsof'     : 'Các phím tắt bị tắt',
			'dropFiles'       : 'Thả tệp vào đây',
			'or'              : 'hoặc',
			'selectForUpload' : 'Chọn tệp',
			'moveFiles'       : 'Di chuyển các mục',
			'copyFiles'       : 'Sao chép các mục',
			'restoreFiles'    : 'Khôi mục các mục', // from v2.1.24 added 5.5.2017
			'rmFromPlaces'    : 'Xóa khỏi địa điểm',
			'aspectRatio'     : 'Tỉ lệ khung hình',
			'scale'           : 'Tỉ lệ',
			'width'           : 'Rộng',
			'height'          : 'Cao',
			'resize'          : 'Thay đổi kích cỡ',
			'crop'            : 'Cắt',
			'rotate'          : 'Xoay',
			'rotate-cw'       : 'Xoay 90 độ CW',
			'rotate-ccw'      : 'Xoay 90 độ CCW',
			'degree'          : '°',
			'netMountDialogTitle' : 'Gắn kết khối lượng mạng', // added 18.04.2012
			'protocol'            : 'Giao thức', // added 18.04.2012
			'host'                : 'Chủ nhà', // added 18.04.2012
			'port'                : 'Hải cảng', // added 18.04.2012
			'user'                : 'Người sử dụng', // added 18.04.2012
			'pass'                : 'Mật khẩu', // added 18.04.2012
			'confirmUnmount'      : 'Bạn có ngắt kết nối $ 1 không?',  // from v2.1 added 30.04.2012
			'dropFilesBrowser': 'Thả hoặc dán tệp từ trình duyệt', // from v2.1 added 30.05.2012
			'dropPasteFiles'  : 'Thả tệp, dán URL hoặc hình ảnh (khay nhớ tạm) vào đây', // from v2.1 added 07.04.2014
			'encoding'        : 'Mã hóa', // from v2.1 added 19.12.2014
			'locale'          : 'Địa phương',   // from v2.1 added 19.12.2014
			'searchTarget'    : 'Mục tiêu: $1',                // from v2.1 added 22.5.2015
			'searchMime'      : 'Tìm kiếm theo kiểu tệp (MIME)', // from v2.1 added 22.5.2015
			'owner'           : 'Chủ sở hữu', // from v2.1 added 20.6.2015
			'group'           : 'Nhóm', // from v2.1 added 20.6.2015
			'other'           : 'Khác', // from v2.1 added 20.6.2015
			'execute'         : 'Thực thi', // from v2.1 added 20.6.2015
			'perm'            : 'Quyền', // from v2.1 added 20.6.2015
			'mode'            : 'Chế độ', // from v2.1 added 20.6.2015
			'emptyFolder'     : 'Thư mục trống', // from v2.1.6 added 30.12.2015
			'emptyFolderDrop' : 'Thư mục trống\\A Kéo thả vào đây để thêm các mục', // from v2.1.6 added 30.12.2015
			'emptyFolderLTap' : 'Thư mục trống\\A Nhấn giữ để thêm các mục', // from v2.1.6 added 30.12.2015
			'quality'         : 'Chất lượng', // from v2.1.6 added 5.1.2016
			'autoSync'        : 'Tự động động bộ',  // from v2.1.6 added 10.1.2016
			'moveUp'          : 'Di chuyển lên',  // from v2.1.6 added 18.1.2016
			'getLink'         : 'Lấy liên kết URL', // from v2.1.7 added 9.2.2016
			'selectedItems'   : 'Các mục đã chọn ($1)', // from v2.1.7 added 2.19.2016
			'folderId'        : 'ID thư mục', // from v2.1.10 added 3.25.2016
			'offlineAccess'   : 'Cho phép truy cập ngoại tuyến', // from v2.1.10 added 3.25.2016
			'reAuth'          : 'Xác thực lại', // from v2.1.10 added 3.25.2016
			'nowLoading'      : 'Đang tải...', // from v2.1.12 added 4.26.2016
			'openMulti'       : 'Mở nhiều tập tin', // from v2.1.12 added 5.14.2016
			'openMultiConfirm': 'Bạn đang cố mở các tệp $ 1. Bạn có chắc chắn muốn mở trong trình duyệt không?', // from v2.1.12 added 5.14.2016
			'emptySearch'     : 'Kết quả tìm kiếm trống trong mục tiêu tìm kiếm.', // from v2.1.12 added 5.16.2016
			'editingFile'     : 'Nó là một tập tin đang chỉnh sửa.', // from v2.1.13 added 6.3.2016
			'hasSelected'     : 'Bạn đã chọn $ 1 mục.', // from v2.1.13 added 6.3.2016
			'hasClipboard'    : 'Bạn có $ 1 mục trong khay nhớ tạm.', // from v2.1.13 added 6.3.2016
			'incSearchOnly'   : 'Tìm kiếm gia tăng chỉ từ hiển thị hiện tại.', // from v2.1.13 added 6.30.2016
			'reinstate'       : 'Phục hồi', // from v2.1.15 added 3.8.2016
			'complete'        : '$1 hoàn thành', // from v2.1.15 added 21.8.2016
			'contextmenu'     : 'Trình đơn ngữ cảnh', // from v2.1.15 added 9.9.2016
			'pageTurning'     : 'Chuyển trang', // from v2.1.15 added 10.9.2016
			'volumeRoots'     : 'Khối lượng rễ', // from v2.1.16 added 16.9.2016
			'reset'           : 'Đặt lại', // from v2.1.16 added 1.10.2016
			'bgcolor'         : 'Màu nền', // from v2.1.16 added 1.10.2016
			'colorPicker'     : 'Chọn màu', // from v2.1.16 added 1.10.2016
			'8pxgrid'         : 'Lưới 8px', // from v2.1.16 added 4.10.2016
			'enabled'         : 'Đã bật', // from v2.1.16 added 4.10.2016
			'disabled'        : 'Đã tắt', // from v2.1.16 added 4.10.2016
			'emptyIncSearch'  : 'Kết quả tìm kiếm trống trong chế độ xem hiện tại. \\ APress [Enter] để mở rộng mục tiêu tìm kiếm.', // from v2.1.16 added 5.10.2016
			'emptyLetSearch'  : 'Kết quả tìm kiếm thư đầu tiên là trống trong chế độ xem hiện tại.', // from v2.1.23 added 24.3.2017
			'textLabel'       : 'Nhãn văn bản', // from v2.1.17 added 13.10.2016
			'minsLeft'        : 'Còn $ 1 phút', // from v2.1.17 added 13.11.2016
			'openAsEncoding'  : 'Mở lại với mã hóa đã chọn', // from v2.1.19 added 2.12.2016
			'saveAsEncoding'  : 'Lưu với mã hóa đã chọn', // from v2.1.19 added 2.12.2016
			'selectFolder'    : 'Chọn thư mục', // from v2.1.20 added 13.12.2016
			'firstLetterSearch': 'Tìm kiếm chữ cái đầu tiên', // from v2.1.23 added 24.3.2017
			'presets'         : 'Đặt trước', // from v2.1.25 added 26.5.2017
			'tooManyToTrash'  : 'Có quá nhiều mục vì vậy không thể cho vào thùng rác.', // from v2.1.25 added 9.6.2017
			'TextArea'        : 'TextArea', // from v2.1.25 added 14.6.2017
			'folderToEmpty'   : 'Làm trống thư mục "$ 1".', // from v2.1.25 added 22.6.2017
			'filderIsEmpty'   : 'Không có mục nào trong thư mục "$ 1".', // from v2.1.25 added 22.6.2017
			'preference'      : 'Sự ưa thích', // from v2.1.26 added 28.6.2017
			'language'        : 'Ngôn ngữ', // from v2.1.26 added 28.6.2017
			'clearBrowserData': 'Khởi tạo các cài đặt được lưu trong trình duyệt này', // from v2.1.26 added 28.6.2017
			'toolbarPref'     : 'Cài đặt thanh công cụ', // from v2.1.27 added 2.8.2017
			'charsLeft'       : '... $ 1 ký tự còn lại.',  // from v2.1.29 added 30.8.2017
			'linesLeft'       : '... $ 1 dòng còn lại.',  // from v2.1.52 added 16.1.2020
			'sum'             : 'Tổng', // from v2.1.29 added 28.9.2017
			'roughFileSize'   : 'Kích thước tệp thô', // from v2.1.30 added 2.11.2017
			'autoFocusDialog' : 'Tập trung vào thành phần của hộp thoại bằng cách di chuột qua',  // from v2.1.30 added 2.11.2017
			'select'          : 'Lựa chọn', // from v2.1.30 added 23.11.2017
			'selectAction'    : 'Hành động khi chọn tệp', // from v2.1.30 added 23.11.2017
			'useStoredEditor' : 'Mở bằng trình chỉnh sửa được sử dụng lần trước', // from v2.1.30 added 23.11.2017
			'selectinvert'    : 'Lựa chọn đối nghịch', // from v2.1.30 added 25.11.2017
			'renameMultiple'  : 'Bạn có chắc chắn muốn đổi tên $ 1 các mục đã chọn như $ 2 không? <br/> Không thể hoàn tác thao tác này!', // from v2.1.31 added 4.12.2017
			'batchRename'     : 'Đổi tên hàng loạt', // from v2.1.31 added 8.12.2017
			'plusNumber'      : '+ Số', // from v2.1.31 added 8.12.2017
			'asPrefix'        : 'Thêm tiền tố', // from v2.1.31 added 8.12.2017
			'asSuffix'        : 'Thêm hậu tố', // from v2.1.31 added 8.12.2017
			'changeExtention' : 'Thay đổi phần mở rộng', // from v2.1.31 added 8.12.2017
			'columnPref'      : 'Cài đặt cột (Chế độ xem danh sách)', // from v2.1.32 added 6.2.2018
			'reflectOnImmediate' : 'Tất cả các thay đổi sẽ phản ánh ngay lập tức vào kho lưu trữ.', // from v2.1.33 added 2.3.2018
			'reflectOnUnmount'   : 'Mọi thay đổi sẽ không phản ánh cho đến khi hủy gắn ổ đĩa này.', // from v2.1.33 added 2.3.2018
			'unmountChildren' : '(Các) tập sau được gắn trên tập này cũng đã được ngắt kết nối. Bạn có chắc chắn để ngắt kết nối nó không?', // from v2.1.33 added 5.3.2018
			'selectionInfo'   : 'Thông tin lựa chọn', // from v2.1.33 added 7.3.2018
			'hashChecker'     : 'Các thuật toán để hiển thị hàm băm của tệp', // from v2.1.33 added 10.3.2018
			'infoItems'       : 'Mục thông tin (Bảng thông tin lựa chọn)', // from v2.1.38 added 28.3.2018
			'pressAgainToExit': 'Nhấn một lần nữa để thoát.', // from v2.1.38 added 1.4.2018
			'toolbar'         : 'Thanh công cụ', // from v2.1.38 added 4.4.2018
			'workspace'       : 'Không gian làm việc', // from v2.1.38 added 4.4.2018
			'dialog'          : 'Hộp thoại', // from v2.1.38 added 4.4.2018
			'all'             : 'Tất cả', // from v2.1.38 added 4.4.2018
			'iconSize'        : 'Kích thước biểu tượng (Chế độ xem biểu tượng)', // from v2.1.39 added 7.5.2018
			'editorMaximized' : 'Mở cửa sổ trình chỉnh sửa tối đa', // from v2.1.40 added 30.6.2018
			'editorConvNoApi' : 'Bởi vì chuyển đổi bằng API hiện không khả dụng, vui lòng chuyển đổi trên trang web.', //from v2.1.40 added 8.7.2018
			'editorConvNeedUpload' : 'Sau khi chuyển đổi, bạn phải tải lên với URL mục hoặc tệp đã tải xuống để lưu tệp đã chuyển đổi.', //from v2.1.40 added 8.7.2018
			'convertOn'       : 'Chuyển đổi trên trang web của $ 1', // from v2.1.40 added 10.7.2018
			'integrations'    : 'Tích hợp', // from v2.1.40 added 11.7.2018
			'integrationWith' : 'ElFinder này được tích hợp các dịch vụ bên ngoài sau. Vui lòng kiểm tra các điều khoản sử dụng, chính sách bảo mật, v.v. trước khi sử dụng.', // from v2.1.40 added 11.7.2018
			'showHidden'      : 'Hiển thị các mục ẩn', // from v2.1.41 added 24.7.2018
			'hideHidden'      : 'Ẩn các mục ẩn', // from v2.1.41 added 24.7.2018
			'toggleHidden'    : 'Hiển thị / Ẩn các mục ẩn', // from v2.1.41 added 24.7.2018
			'makefileTypes'   : 'Loại tệp để bật với "Tệp mới"', // from v2.1.41 added 7.8.2018
			'typeOfTextfile'  : 'Loại tệp văn bản', // from v2.1.41 added 7.8.2018
			'add'             : 'Thêm vào', // from v2.1.41 added 7.8.2018
			'theme'           : 'Chủ đề', // from v2.1.43 added 19.10.2018
			'default'         : 'Mặc định', // from v2.1.43 added 19.10.2018
			'description'     : 'Sự miêu tả', // from v2.1.43 added 19.10.2018
			'website'         : 'Trang mạng', // from v2.1.43 added 19.10.2018
			'author'          : 'Tác giả', // from v2.1.43 added 19.10.2018
			'email'           : 'E-mail', // from v2.1.43 added 19.10.2018
			'license'         : 'Giấy phép', // from v2.1.43 added 19.10.2018
			'exportToSave'    : 'Không thể lưu mục này. Để tránh mất các chỉnh sửa, bạn cần xuất sang PC của mình.', // from v2.1.44 added 1.12.2018
			'dblclickToSelect': 'Nhấp đúp vào tệp để chọn nó.', // from v2.1.47 added 22.1.2019
			'useFullscreen'   : 'Sử dụng chế độ toàn màn hình', // from v2.1.47 added 19.2.2019

			/********************************** mimetypes **********************************/
			'kindUnknown'     : 'không xác định',
			'kindRoot'        : 'Khối lượng gốc', // from v2.1.16 added 16.10.2016
			'kindFolder'      : 'Thư mục',
			'kindSelects'     : 'Lựa chọn', // from v2.1.29 added 29.8.2017
			'kindAlias'       : 'Bí danh',
			'kindAliasBroken' : 'Bí danh bị hỏng',
			// applications
			'kindApp'         : 'Ứng dụng',
			'kindPostscript'  : 'Tài liệu tái bút',
			'kindMsOffice'    : 'Tài liệu Microsoft Office',
			'kindMsWord'      : 'Tài liệu Microsoft Word',
			'kindMsExcel'     : 'Tài liệu Microsoft Excel',
			'kindMsPP'        : 'Bản trình bày Microsoft Powerpoint',
			'kindOO'          : 'Mở tài liệu Office',
			'kindAppFlash'    : 'Ứng dụng flash',
			'kindPDF'         : 'Định dạng tài liệu di động (PDF)',
			'kindTorrent'     : 'Tệp bittorrent',
			'kind7z'          : 'Kho lưu trữ 7z',
			'kindTAR'         : 'TAR lưu trữ',
			'kindGZIP'        : 'Kho lưu trữ GZIP',
			'kindBZIP'        : 'Kho lưu trữ BZIP',
			'kindXZ'          : 'Kho lưu trữ XZ',
			'kindZIP'         : 'Kho lưu trữ ZIP',
			'kindRAR'         : 'Kho lưu trữ RAR',
			'kindJAR'         : 'Tệp Java JAR',
			'kindTTF'         : 'Phông chữ True Type',
			'kindOTF'         : 'Mở loại phông chữ',
			'kindRPM'         : 'Gói RPM',
			// texts
			'kindText'        : 'Tai liệu kiểm tra',
			'kindTextPlain'   : 'Văn bản thô',
			'kindPHP'         : 'Nguồn PHP',
			'kindCSS'         : 'Bảng kiểu xếp tầng',
			'kindHTML'        : 'Tài liệu HTML',
			'kindJS'          : 'Nguồn Javascript',
			'kindRTF'         : 'Định dạng văn bản phong phú',
			'kindC'           : 'Nguồn C',
			'kindCHeader'     : 'Nguồn tiêu đề C',
			'kindCPP'         : 'Nguồn C ++',
			'kindCPPHeader'   : 'Nguồn tiêu đề C ++',
			'kindShell'       : 'Tập lệnh shell Unix',
			'kindPython'      : 'Nguồn Python',
			'kindJava'        : 'Nguồn Java',
			'kindRuby'        : 'Nguồn Ruby',
			'kindPerl'        : 'Tập lệnh Perl',
			'kindSQL'         : 'Nguồn SQL',
			'kindXML'         : 'Tài liệu XML',
			'kindAWK'         : 'Nguồn AWK',
			'kindCSV'         : 'Các giá trị được phân tách bằng dấu phẩy',
			'kindDOCBOOK'     : 'Tài liệu XML của Docbook',
			'kindMarkdown'    : 'Văn bản đánh dấu', // added 20.7.2015
			// images
			'kindImage'       : 'Hình ảnh',
			'kindBMP'         : 'Hình ảnh BMP',
			'kindJPEG'        : 'Hình ảnh JPEG',
			'kindGIF'         : 'Ảnh GIF',
			'kindPNG'         : 'Hình ảnh PNG',
			'kindTIFF'        : 'Hình ảnh TIFF',
			'kindTGA'         : 'Hình ảnh TGA',
			'kindPSD'         : 'Hình ảnh Adobe Photoshop',
			'kindXBITMAP'     : 'Hình ảnh bitmap X',
			'kindPXM'         : 'Hình ảnh Pixelmator',
			// media
			'kindAudio'       : 'Phương tiện âm thanh',
			'kindAudioMPEG'   : 'Âm thanh MPEG',
			'kindAudioMPEG4'  : 'Âm thanh MPEG-4',
			'kindAudioMIDI'   : 'Âm thanh MIDI',
			'kindAudioOGG'    : 'Âm thanh Ogg Vorbis',
			'kindAudioWAV'    : 'Âm thanh WAV',
			'AudioPlaylist'   : 'Danh sách nhạc MP3',
			'kindVideo'       : 'Phương tiện video',
			'kindVideoDV'     : 'Phim DV',
			'kindVideoMPEG'   : 'Phim MPEG',
			'kindVideoMPEG4'  : 'Phim MPEG-4',
			'kindVideoAVI'    : 'Phim AVI',
			'kindVideoMOV'    : 'Phim thời gian nhanh',
			'kindVideoWM'     : 'Phim Windows Media',
			'kindVideoFlash'  : 'Phim flash',
			'kindVideoMKV'    : 'Phim matroska',
			'kindVideoOGG'    : 'Phim ogg'
		}
	};
}));

js/i18n/elfinder.sr.js000064400000040550151215013360010511 0ustar00 /**
 * Serbian translation
 * @author Momčilo m0k1 Mićanović <moki.forum@gmail.com>
 * @version 2014-12-19
 */
(function(root, factory) {
	if (typeof define === 'function' && define.amd) {
		define(['elfinder'], factory);
	} else if (typeof exports !== 'undefined') {
		module.exports = factory(require('elfinder'));
	} else {
		factory(root.elFinder);
	}
}(this, function(elFinder) {
	elFinder.prototype.i18.sr = {
		translator : 'Momčilo m0k1 Mićanović &lt;moki.forum@gmail.com&gt;',
		language   : 'Srpski',
		direction  : 'ltr',
		dateFormat : 'd.m.Y H:i',
		fancyDateFormat : '$1 H:i',
		messages   : {
			'getShareText' : 'Објави',
			'Editor ': 'Цоде Едитор',
			
			/********************************** errors **********************************/
			'error'                : 'Greška',
			'errUnknown'           : 'Nepoznata greška.',
			'errUnknownCmd'        : 'Nepoznata komanda.',
			'errJqui'              : 'Neispravna konfiguracija jQuery UI. Komponente koje mogu da se odabiru, povlače, izbacuju moraju biti uključene.',
			'errNode'              : 'elFinder zahteva DOM Element da bude kreiran.',
			'errURL'               : 'Neispravna elFinder konfiguracija! URL opcija nije postavljena.',
			'errAccess'            : 'Pristup odbijen.',
			'errConnect'           : 'Nije moguće povezivanje s skriptom.',
			'errAbort'             : 'Veza prekinuta.',
			'errTimeout'           : 'Veza odbačena.',
			'errNotFound'          : 'Skripta nije pronađena.',
			'errResponse'          : 'Neispravan odgovor skripte.',
			'errConf'              : 'Neispravna konfiguracija skripte.',
			'errJSON'              : 'PHP JSON modul nije instaliran.',
			'errNoVolumes'         : 'Vidljivi volumeni nisu dostupni.',
			'errCmdParams'         : 'Nevažeći parametri za komandu "$1".',
			'errDataNotJSON'       : 'Podaci nisu JSON.',
			'errDataEmpty'         : 'Podaci nisu prazni.',
			'errCmdReq'            : 'Skripta zahteva komandu.',
			'errOpen'              : 'Nemoguće otvoriti "$1".',
			'errNotFolder'         : 'Objekat nije folder.',
			'errNotFile'           : 'Objekat nije datoteka.',
			'errRead'              : 'Nemoguće pročitati "$1".',
			'errWrite'             : 'Nemoguće pisati u "$1".',
			'errPerm'              : 'Dozvola je odbijena.',
			'errLocked'            : '"$1" je zaključan i nemože biti preimenovan, premešten ili obrisan.',
			'errExists'            : 'Datoteka zvana "$1" već postoji.',
			'errInvName'           : 'Neispravno ime datoteke.',
			'errFolderNotFound'    : 'Folder nije pronađen.',
			'errFileNotFound'      : 'Datoteka nije pronađena.',
			'errTrgFolderNotFound' : 'Izabrani folder "$1" nije pronađen.',
			'errPopup'             : 'Pretraživač sprečava otvaranje iskačućih prozora. Da otvorite datoteku uključite iskačuće prozore u opcijama pretraživača.',
			'errMkdir'             : 'Nemoguće kreirati folder "$1".',
			'errMkfile'            : 'Nemoguće kreirati datoteku "$1".',
			'errRename'            : 'Nemoguće preimenovati datoteku "$1".',
			'errCopyFrom'          : 'Kopiranje datoteki sa "$1" nije dozvoljeno.',
			'errCopyTo'            : 'Kopiranje datoteki na "$1" nije dozvoljeno.',
			'errUpload'            : 'Greska pri slanju.',
			'errUploadFile'        : 'Nemoguće poslati "$1".',
			'errUploadNoFiles'     : 'Nisu pronađene datoteke za slanje.',
			'errUploadTotalSize'   : 'Podaci premašuju najveću dopuštenu veličinu.',
			'errUploadFileSize'    : 'Datoteka premašuje najveću dopuštenu veličinu.',
			'errUploadMime'        : 'Vrsta datoteke nije dopuštena.',
			'errUploadTransfer'    : '"$1" greška prilikom slanja.',
			'errNotReplace'        : 'Object "$1" already exists at this location and can not be replaced by object with another type.',
			'errReplace'           : 'Unable to replace "$1".',
			'errSave'              : 'Nemožeš sačuvati "$1".',
			'errCopy'              : 'Nemožeš kopirati "$1".',
			'errMove'              : 'Nemožeš premestiti "$1".',
			'errCopyInItself'      : 'Nemožeš kopirati "$1" na istu lokaciju.',
			'errRm'                : 'Nemožeš obrisati "$1".',
			'errRmSrc'             : 'Unable remove source file(s).',
			'errExtract'           : 'Nemoguće izvaditi datoteke iz "$1".',
			'errArchive'           : 'Nemoguće kreirati arhivu.',
			'errArcType'           : 'Nepodržani tip arhive.',
			'errNoArchive'         : 'Datoteka nije arhiva ili je nepodržani tip arhive.',
			'errCmdNoSupport'      : 'Skripta nepodržava ovu komandu.',
			'errReplByChild'       : 'Folder “$1” ne može biti zamenut stavkom koju sadrži.',
			'errArcSymlinks'       : 'Zbog bezbednosnih razloga ne možete raspakovati arhive koje sadrže simboličke veze ili datoteke sa nedozvoljenim imenima.',
			'errArcMaxSize'        : 'Arhiva je dostigla maksimalnu veličinu.',
			'errResize'            : 'Nemoguće promeniti veličinu "$1".',
			'errResizeDegree'      : 'Invalid rotate degree.',
			'errResizeRotate'      : 'Unable to rotate image.',
			'errResizeSize'        : 'Invalid image size.',
			'errResizeNoChange'    : 'Image size not changed.',
			'errUsupportType'      : 'nepodržan tip datoteke.',
			'errNotUTF8Content'    : 'Datoteka "$1" nije u UTF-8  formati i ne može biti izmenjena.',
			'errNetMount'          : 'Nije moguće montirati "$1".',
			'errNetMountNoDriver'  : 'Nepodržani protokol.',
			'errNetMountFailed'    : 'Montiranje neuspelo.',
			'errNetMountHostReq'   : 'Host je potreban.',
			'errSessionExpires'    : 'Your session has expired due to inactivity.',
			'errCreatingTempDir'   : 'Unable to create temporary directory: "$1"',
			'errFtpDownloadFile'   : 'Unable to download file from FTP: "$1"',
			'errFtpUploadFile'     : 'Unable to upload file to FTP: "$1"',
			'errFtpMkdir'          : 'Unable to create remote directory on FTP: "$1"',
			'errArchiveExec'       : 'Error while archiving files: "$1"',
			'errExtractExec'       : 'Error while extracting files: "$1"',

			/******************************* commands names ********************************/
			'cmdarchive'   : 'Kreiraj arhivu',
			'cmdback'      : 'Nazad',
			'cmdcopy'      : 'Kopiraj',
			'cmdcut'       : 'Iseci',
			'cmddownload'  : 'Preuzmi',
			'cmdduplicate' : 'Dupliraj',
			'cmdedit'      : 'Izmeni datoteku',
			'cmdextract'   : 'Raspakuj arhivu',
			'cmdforward'   : 'Napred',
			'cmdgetfile'   : 'Izaberi datoteke',
			'cmdhelp'      : 'O ovom softveru',
			'cmdhome'      : 'Početna',
			'cmdinfo'      : 'Proveri informacije',
			'cmdmkdir'     : 'Novi folder',
			'cmdmkfile'    : 'Nova datoteka',
			'cmdopen'      : 'Otvori',
			'cmdpaste'     : 'Zalepi',
			'cmdquicklook' : 'Pregledaj',
			'cmdreload'    : 'Povno učitaj',
			'cmdrename'    : 'Preimenuj',
			'cmdrm'        : 'Obriši',
			'cmdsearch'    : 'Pronađi datoteke',
			'cmdup'        : 'Idi na nadređeni folder',
			'cmdupload'    : 'Pošalji datoteke',
			'cmdview'      : 'Pogledaj',
			'cmdresize'    : 'Promeni veličinu slike',
			'cmdsort'      : 'Sortiraj',
			'cmdnetmount'  : 'Mount network volume',
			'cmdselectall': 'Одабери све',
			'cmdfullscreen': 'Цео екран',
			
			/*********************************** buttons ***********************************/ 
			'btnClose'  : 'Zatvori',
			'btnSave'   : 'Sačuvaj',
			'btnRm'     : 'Obriši',
			'btnApply'  : 'Potvrdi',
			'btnCancel' : 'Prekini',
			'btnNo'     : 'Ne',
			'btnYes'    : 'Da',
			'btnMount'  : 'Mount',
			
			/******************************** notifications ********************************/
			'ntfopen'     : 'Otvaranje foldera',
			'ntffile'     : 'Otvaranje datoteke',
			'ntfreload'   : 'Ponovo učitavanje sadržaja foldera',
			'ntfmkdir'    : 'Kreiranje foldera',
			'ntfmkfile'   : 'Kreiranje datoteke',
			'ntfrm'       : 'Brisanje datoteke',
			'ntfcopy'     : 'Kopiranje datoteke',
			'ntfmove'     : 'Premeštanje datoteke',
			'ntfprepare'  : 'Priprema za kopiranje dateoteke',
			'ntfrename'   : 'Primenovanje datoteke',
			'ntfupload'   : 'Slanje datoteke',
			'ntfdownload' : 'Preuzimanje datoteke',
			'ntfsave'     : 'Čuvanje datoteke',
			'ntfarchive'  : 'Kreiranje arhive',
			'ntfextract'  : 'Izdvajanje datoteka iz arhive',
			'ntfsearch'   : 'Pretraga datoteka',
			'ntfresize'   : 'Resizing images',
			'ntfsmth'     : 'Radim nešto >_<',
			'ntfloadimg'  : 'Učitavanje slike',
			'ntfnetmount' : 'Montiranje mrežnog volumena', 
			'ntfdim'      : 'Acquiring image dimension',
			
			
			/************************************ dates **********************************/
			'dateUnknown' : 'nepoznat',
			'Today'       : 'Danas',
			'Yesterday'   : 'Sutra',
			'msJan'       : 'Jan',
			'msFeb'       : 'Feb',
			'msMar'       : 'Mar',
			'msApr'       : 'Apr',
			'msMay'       : 'Maj',
			'msJun'       : 'Jun',
			'msJul'       : 'Jul',
			'msAug'       : 'Avg',
			'msSep'       : 'Sep',
			'msOct'       : 'Okt',
			'msNov'       : 'Nov',
			'msDec'       : 'Dec',
			'January'     : 'Januar',
			'February'    : 'Februar',
			'March'       : 'Mart',
			'April'       : 'April',
			'May'         : 'Maj',
			'June'        : 'Jun',
			'July'        : 'Jul',
			'August'      : 'Avgust',
			'September'   : 'Septembar',
			'October'     : 'Oktobar',
			'November'    : 'Novembar',
			'December'    : 'Decembar',
			'Sunday'      : 'Nedelja', 
			'Monday'      : 'Ponedeljak', 
			'Tuesday'     : 'Utorak', 
			'Wednesday'   : 'Sreda', 
			'Thursday'    : 'Četvrtak', 
			'Friday'      : 'Petak', 
			'Saturday'    : 'Subota',
			'Sun'         : 'Ned', 
			'Mon'         : 'Pon', 
			'Tue'         : 'Uto', 
			'Wed'         : 'Sre', 
			'Thu'         : 'Čet', 
			'Fri'         : 'Pet', 
			'Sat'         : 'Sub',
			
			/******************************** sort variants ********************************/
			'sortname'          : 'po imenu', 
			'sortkind'          : 'po vrsti', 
			'sortsize'          : 'po veličini',
			'sortdate'          : 'po datumu',
			'sortFoldersFirst'  : 'Prvo folderi',

			/********************************** new items **********************************/
			'untitled file.txt' : 'Нова датотека.txt', // added 10.11.2015
			'untitled folder'   : 'НевФолдер',   // added 10.11.2015
			'Archive'           : 'НоваАрхива',  // from v2.1 added 10.11.2015
			'untitled file'     : 'Нова датотека.$1',
			'extentionfile': "$1: Datoteka", // from v2.1.41 added 6.8.2018
      		'extentiontype': "$1: $2", // from v2.1.43 added 17.10.2018
			
			/********************************** messages **********************************/
			'confirmReq'      : 'Potrebna potvrda',
			'confirmRm'       : 'Da li ste sigurni da želite da obrišete datoteke?<br/>Ovo se ne može poništiti!',
			'confirmRepl'     : 'Zameniti stare datoteke sa novima?',
			'apllyAll'        : 'Potvrdi za sve',
			'name'            : 'Ime',
			'size'            : 'Veličina',
			'perms'           : 'Dozvole',
			'modify'          : 'Izmenjeno',
			'kind'            : 'Vrsta',
			'read'            : 'čitanje',
			'write'           : 'pisanje',
			'noaccess'        : 'bez pristupa',
			'and'             : 'i',
			'unknown'         : 'nepoznato',
			'selectall'       : 'Izaberi sve datoteke',
			'selectfiles'     : 'Izaberi datoteku(e)',
			'selectffile'     : 'Izaberi prvu datoteku',
			'selectlfile'     : 'Izaberi poslednju datoteku',
			'viewlist'        : 'Popisni prikaz',
			'viewicons'       : 'Pregled ikona',
			'places'          : 'Mesta',
			'calc'            : 'Izračunaj', 
			'path'            : 'Putanja',
			'aliasfor'        : 'Nadimak za',
			'locked'          : 'Zaključano',
			'dim'             : 'Dimenzije',
			'files'           : 'Datoteke',
			'folders'         : 'Folderi',
			'items'           : 'Stavke',
			'yes'             : 'da',
			'no'              : 'ne',
			'link'            : 'Veza',
			'searcresult'     : 'Rezultati pretrage',  
			'selected'        : 'odabrane stavke',
			'about'           : 'O softveru',
			'shortcuts'       : 'Prečice',
			'help'            : 'Pomoć',
			'webfm'           : 'Web menađer datoteka',
			'ver'             : 'Verzija',
			'protocolver'     : 'verzija protokla',
			'homepage'        : 'Adresa projekta',
			'docs'            : 'Dokumentacija',
			'github'          : 'Forkuj nas na Github',
			'twitter'         : 'Prati nas na twitter',
			'facebook'        : 'Pridruži nam se na facebook',
			'team'            : 'Tim',
			'chiefdev'        : 'glavni programer',
			'developer'       : 'programer',
			'contributor'     : 'pomoćnik',
			'maintainer'      : 'održavatelj',
			'translator'      : 'prevodilac',
			'icons'           : 'Ikone',
			'dontforget'      : 'i ne zaboravite da ponesete peškir',
			'shortcutsof'     : 'Prečice isključene',
			'dropFiles'       : 'Prevucite datoteke ovde',
			'or'              : 'ili',
			'selectForUpload' : 'Odaberite datoteke za slanje',
			'moveFiles'       : 'Premesti datoteke',
			'copyFiles'       : 'Kopiraj datoteke',
			'rmFromPlaces'    : 'Ukloni iz mesta',
			'aspectRatio'     : 'Omer širine i visine',
			'scale'           : 'Razmera',
			'width'           : 'Širina',
			'height'          : 'Visina',
			'resize'          : 'Promeni veličinu',
			'crop'            : 'Iseci',
			'rotate'          : 'Rotiraj',
			'rotate-cw'       : 'Rotiraj 90 stepeni CW',
			'rotate-ccw'      : 'Rotiraj 90 stepeni CCW',
			'degree'          : 'Stepeni',
			'netMountDialogTitle' : 'Montiraj mrežni volumen', 
			'protocol'            : 'Protokol', 
			'host'                : 'Host', 
			'port'                : 'Port', 
			'user'                : 'Korisničko Ime', 
			'pass'                : 'Lozinka', 

			/********************************** mimetypes **********************************/
			'kindUnknown'     : 'Nepoznat',
			'kindFolder'      : 'Folder',
			'kindAlias'       : 'Nadimak',
			'kindAliasBroken' : 'Neispravan nadimak',
			// applications
			'kindApp'         : 'Aplikacija',
			'kindPostscript'  : 'Postscript dokument',
			'kindMsOffice'    : 'Microsoft Office dokument',
			'kindMsWord'      : 'Microsoft Word dokument',
			'kindMsExcel'     : 'Microsoft Excel dokument',
			'kindMsPP'        : 'Microsoft Powerpoint prezentacija',
			'kindOO'          : 'Open Office dokument',
			'kindAppFlash'    : 'Flash aplikacija',
			'kindPDF'         : 'Portable Document Format (PDF)',
			'kindTorrent'     : 'Bittorrent datoteka',
			'kind7z'          : '7z arhiva',
			'kindTAR'         : 'TAR arhiva',
			'kindGZIP'        : 'GZIP arhiva',
			'kindBZIP'        : 'BZIP arhiva',
			'kindXZ'          : 'XZ arhiva',
			'kindZIP'         : 'ZIP arhiva',
			'kindRAR'         : 'RAR arhiva',
			'kindJAR'         : 'Java JAR datoteka',
			'kindTTF'         : 'True Type font',
			'kindOTF'         : 'Open Type font',
			'kindRPM'         : 'RPM paket',
			// texts
			'kindText'        : 'Teokstualni dokument',
			'kindTextPlain'   : 'Čist tekst',
			'kindPHP'         : 'PHP kod',
			'kindCSS'         : 'CSS kod',
			'kindHTML'        : 'HTML dokument',
			'kindJS'          : 'Javascript kod',
			'kindRTF'         : 'Rich Text Format',
			'kindC'           : 'C kod',
			'kindCHeader'     : 'C header kod',
			'kindCPP'         : 'C++ kod',
			'kindCPPHeader'   : 'C++ header kod',
			'kindShell'       : 'Unix shell skripta',
			'kindPython'      : 'Python kod',
			'kindJava'        : 'Java kod',
			'kindRuby'        : 'Ruby kod',
			'kindPerl'        : 'Perl skripta',
			'kindSQL'         : 'SQL kod',
			'kindXML'         : 'XML dokument',
			'kindAWK'         : 'AWK kod',
			'kindCSV'         : 'Comma separated values',
			'kindDOCBOOK'     : 'Docbook XML dokument',
			// images
			'kindImage'       : 'Slika',
			'kindBMP'         : 'BMP slika',
			'kindJPEG'        : 'JPEG slika',
			'kindGIF'         : 'GIF slika',
			'kindPNG'         : 'PNG slika',
			'kindTIFF'        : 'TIFF slika',
			'kindTGA'         : 'TGA slika',
			'kindPSD'         : 'Adobe Photoshop slika',
			'kindXBITMAP'     : 'X bitmap slika',
			'kindPXM'         : 'Pixelmator slika',
			// media
			'kindAudio'       : 'Zvuk',
			'kindAudioMPEG'   : 'MPEG zvuk',
			'kindAudioMPEG4'  : 'MPEG-4 zvuk',
			'kindAudioMIDI'   : 'MIDI zvuk',
			'kindAudioOGG'    : 'Ogg Vorbis zvuk',
			'kindAudioWAV'    : 'WAV zvuk',
			'AudioPlaylist'   : 'MP3 lista',
			'kindVideo'       : 'Video',
			'kindVideoDV'     : 'DV video',
			'kindVideoMPEG'   : 'MPEG video',
			'kindVideoMPEG4'  : 'MPEG-4 video',
			'kindVideoAVI'    : 'AVI video',
			'kindVideoMOV'    : 'Quick Time video',
			'kindVideoWM'     : 'Windows Media video',
			'kindVideoFlash'  : 'Flash video',
			'kindVideoMKV'    : 'Matroska video',
			'kindVideoOGG'    : 'Ogg video'
		}
	};
}));
js/i18n/elfinder.fa.js000064400000123137151215013360010456 0ustar00/**
 * فارسی translation
 * @author Keyhan Mohammadpour <keyhan_universityworks@yahoo.com>
 * @author Farhad Zare <farhad@persianoc.com>
 * @version 2022-02-28
 */
 (function(root, factory) {
	if (typeof define === 'function' && define.amd) {
		define(['elfinder'], factory);
	} else if (typeof exports !== 'undefined') {
		module.exports = factory(require('elfinder'));
	} else {
		factory(root.elFinder);
	}
}(this, function(elFinder) {
	elFinder.prototype.i18.fa = {
		translator : 'Keyhan Mohammadpour &lt;keyhan_universityworks@yahoo.com&gt;, Farhad Zare &lt;farhad@persianoc.com&gt;',
		language   : 'فارسی',
		direction  : 'rtl',
		dateFormat : 'd.m.Y H:i', // will show like: 28.02.2022 15:41
		fancyDateFormat : '$1 H:i', // will show like: امروز 15:41
		nonameDateFormat : 'ymd-His', // noname upload will show like: 220228-154144
		messages   : {
			'getShareText' : 'اشتراک گذاری',
			'Editor ': 'ویرایشگر کد',
			/********************************** errors **********************************/
			'error'                : 'خطا',
			'errUnknown'           : 'خطای ناشناخته.',
			'errUnknownCmd'        : 'دستور ناشناخته.',
			'errJqui'              : 'تنظیمات کتابخانه JQuery UI شما به درستی انجام نشده است. این کتابخانه بایستی شامل Resizable ،Draggable و Droppable باشد.',
			'errNode'              : 'elfinder به درستی ایجاد نشده است.',
			'errURL'               : 'تنظیمات elfinder شما به درستی انجام نشده است. تنظیم Url را اصلاح نمایید.',
			'errAccess'            : 'محدودیت سطح دسترسی',
			'errConnect'           : 'امکان اتصال به مدیریت وجود ندارد.',
			'errAbort'             : 'ارتباط قطع شده است.',
			'errTimeout'           : 'مهلت زمانی ارتباط شما به اتمام رسیده است.',
			'errNotFound'          : 'تنظیم مدیریت یافت نشد.',
			'errResponse'          : 'پاسخ دریافتی از مدیریت صحیح نمی باشد.',
			'errConf'              : 'تنطیمات مدیریت به درستی انجام نشده است.',
			'errJSON'              : 'ماژول PHP JSON نصب نیست.',
			'errNoVolumes'         : 'درایوهای قابل خواندن یافت نشدند.',
			'errCmdParams'         : 'پارامترهای دستور "$1" به صورت صحیح ارسال نشده است.',
			'errDataNotJSON'       : 'داده ها در قالب JSON نمی باشند.',
			'errDataEmpty'         : 'داده دریافتی خالی است.',
			'errCmdReq'            : 'درخواست از سمت مدیریت نیازمند نام دستور می باشد.',
			'errOpen'              : 'امکان باز نمودن "$1" وجود ندارد.',
			'errNotFolder'         : 'آیتم موردنظر پوشه نیست.',
			'errNotFile'           : 'آیتم موردنظر فایل نیست.',
			'errRead'              : 'امکان خواندن "$1" وجود ندارد.',
			'errWrite'             : 'امکان نوشتن در درون "$1" وجود ندارد.',
			'errPerm'              : 'شما مجاز به انجام این عمل نمی باشید.',
			'errLocked'            : '"$1" قفل گردیده است و شما قادر به تغییر نام ، حذف و یا جابجایی آن نمی باشید.',
			'errExists'            : 'فایلی با نام "$1" هم اکنون وجود دارد.',
			'errInvName'           : 'نام انتخابی شما صحیح نمی باشد.',
			'errInvDirname'        : 'نام پوشه غیرمعتبر می باشد.',  // from v2.1.24 added 12.4.2017
			'errFolderNotFound'    : 'پوشه مورد نظر یافت نشد.',
			'errFileNotFound'      : 'فایل مورد نظر یافت نشد.',
			'errTrgFolderNotFound' : 'پوشه مقصد با نام "$1" یافت نشد.',
			'errPopup'             : 'مرورگر شما ار باز شدن پنجره popup جلوگیری می کند، لطفا تنظیمات مربوطه را در مرورگر خود فعال نمایید.',
			'errMkdir'             : 'امکان ایجاد پوشه ای با نام "$1" وجود ندارد.',
			'errMkfile'            : 'امکان ایجاد فایلی با نام "$1" وجود ندارد.',
			'errRename'            : 'امکان تغییر نام فایل "$1" وجود ندارد.',
			'errCopyFrom'          : 'کپی نمودن از درایو با نام "$1" ممکن نمی باشد.',
			'errCopyTo'            : 'کپی نمودن به درایو با نام "$1" ممکن نمی باشد.',
			'errMkOutLink'         : 'امکان ایجاد لینک به خارج از مسیر ریشه وجود ندارد.', // from v2.1 added 03.10.2015
			'errUpload'            : 'خطای آپلود',  // old name - errUploadCommon
			'errUploadFile'        : 'امکان آپلود "$1" وجود ندارد.', // old name - errUpload
			'errUploadNoFiles'     : 'فایلی برای آپلود یافت نشد.',
			'errUploadTotalSize'   : 'حجم داده بیش از حد مجاز می باشد.', // old name - errMaxSize
			'errUploadFileSize'    : 'حجم فایل بیش از حد مجاز می باشد.', //  old name - errFileMaxSize
			'errUploadMime'        : 'نوع فایل انتخابی مجاز نمی باشد.',
			'errUploadTransfer'    : 'در انتقال "$1" خطایی رخ داده است.',
			'errUploadTemp'        : 'امکان ایجاد فایل موقت جهت آپلود وجود ندارد.', // from v2.1 added 26.09.2015
			'errNotReplace'        : 'آیتم "$1" از قبل وجود دارد و امکان جایگزینی آن با آیتمی از نوع دیگر وجود ندارد.', // new
			'errReplace'           : 'امکان جایگزینی "$1" وجود ندارد.',
			'errSave'              : 'امکان ذخیره کردن "$1" وجود ندارد.',
			'errCopy'              : 'امکان کپی کردن "$1" وجود ندارد.',
			'errMove'              : 'امکان جابجایی "$1" وجود ندارد.',
			'errCopyInItself'      : 'امکان کپی کردن "$1" در درون خودش وجود ندارد.',
			'errRm'                : 'امکان حذف کردن "$1" وجود ندارد.',
			'errTrash'             : 'امکان حذف وجود ندارد.', // from v2.1.24 added 30.4.2017
			'errRmSrc'             : 'امکان حذف فایل(ها) از مبدا وجود ندارد.',
			'errExtract'           : 'امکان استخراج فایل فشرده "$1" وجود ندارد.',
			'errArchive'           : 'امکان ایجاد فایل فشرده وجود ندارد.',
			'errArcType'           : 'نوع ناشناخته برای فایل فشرده.',
			'errNoArchive'         : 'این فایل فشرده نیست یا اینکه این نوع فایل فشرده پشتیبانی نمی شود.',
			'errCmdNoSupport'      : 'مدیریت از این دستور پشتیبانی نمی کند.',
			'errReplByChild'       : 'امکان جایگزینی پوشه "$1" با یک آیتم از درون خودش وجود ندارد.',
			'errArcSymlinks'       : 'به دلایل مسائل امنیتی امکان باز کردن فایل فشرده دارای symlinks وجود ندارد.', // edited 24.06.2012
			'errArcMaxSize'        : 'فایل های فشرده به حداکثر اندازه تعیین شده رسیده اند.',
			'errResize'            : 'امکان تغییر اندازه "$1" وجود ندارد.',
			'errResizeDegree'      : 'درجه چرخش نامعتبر است.',  // added 7.3.2013
			'errResizeRotate'      : 'امکان چرخش تصویر وجود ندارد.',  // added 7.3.2013
			'errResizeSize'        : 'اندازه تصویر نامعتبر است.',  // added 7.3.2013
			'errResizeNoChange'    : 'تغییری در اندازه تصویر ایجاد نشده است.',  // added 7.3.2013
			'errUsupportType'      : 'این نوع فایل پشتیبانی نمی شود.',
			'errNotUTF8Content'    : 'فایل "$1" به صورت UTF-8 ذخیره نشده و امکان ویرایش آن وجود ندارد.',  // added 9.11.2011
			'errNetMount'          : 'امکان اتصال "$1" وجود ندارد.', // added 17.04.2012
			'errNetMountNoDriver'  : 'این پروتکل پشتیبانی نمی شود.',     // added 17.04.2012
			'errNetMountFailed'    : 'اتصال ناموفق بود.',         // added 17.04.2012
			'errNetMountHostReq'   : 'میزبان موردنیاز است.', // added 18.04.2012
			'errSessionExpires'    : 'اعتبار جلسه کاری شما بدلیل عدم فعالیت برای مدت زمان طولانی به اتمام رسیده است.',
			'errCreatingTempDir'   : 'امکان ایجاد دایرکتوری موقت وجود ندارد: "$1"',
			'errFtpDownloadFile'   : 'امکان دریافت فایل از FTP وجود ندارد: "$1"',
			'errFtpUploadFile'     : 'امکان آپلود فایل به FTP وجود ندارد: "$1"',
			'errFtpMkdir'          : 'امکان ایجاد دایرکتوری برروی FTP وجود ندارد: "$1"',
			'errArchiveExec'       : 'خطا در زمان فشرده سازی این فایل‌ها: "$1"',
			'errExtractExec'       : 'خطا در زمان بازگشایی این فایل‌ها: "$1"',
			'errNetUnMount'        : 'امکان قطع اتصال وجود ندارد.', // from v2.1 added 30.04.2012
			'errConvUTF8'          : 'امکان تبدیل به UTF-8 وجود ندارد', // from v2.1 added 08.04.2014
			'errFolderUpload'      : 'جهت آپلود کردن پوشه، از یک مرورگر مدرن استفاده نمایید.', // from v2.1 added 26.6.2015
			'errSearchTimeout'     : 'در هنگان جستجو برای "$1" خطایی رخ داده است. نتیجه جستجو به صورت ناتمام می باشد.', // from v2.1 added 12.1.2016
			'errReauthRequire'     : 'اعتبارسنجی مجدد موردنیاز است.', // from v2.1.10 added 24.3.2016
			'errMaxTargets'        : 'حداکثر تعداد انتخاب قابل قبول $1 می‌باشد.', // from v2.1.17 added 17.10.2016
			'errRestore'           : 'امکان بازیابی وجود ندارد. مقصد بازیابی نامشخص است.', // from v2.1.24 added 3.5.2017
			'errEditorNotFound'    : 'ویرایشگری برای این نوع فایل یافت نشد.', // from v2.1.25 added 23.5.2017
			'errServerError'       : 'خطایی در سمت سرور به وجود آمده است.', // from v2.1.25 added 16.6.2017
			'errEmpty'             : 'امکان خالی کردن پوشه "$1" وجود ندارد.', // from v2.1.25 added 22.6.2017
			'moreErrors'           : '$1 خطای دیگر نیز وجود دارد.', // from v2.1.44 added 9.12.2018
			'errMaxMkdirs'         : 'شما می توانید تا $1 پوشه در یک زمان ایجاد کنید.', // from v2.1.58 added 20.6.2021

			/******************************* commands names ********************************/
			'cmdarchive'   : 'ایجاد فایل فشرده',
			'cmdback'      : 'بازگشت به عقب',
			'cmdcopy'      : 'کپی',
			'cmdcut'       : 'بریدن',
			'cmddownload'  : 'دانلود',
			'cmdduplicate' : 'تکثیر فایل',
			'cmdedit'      : 'ویرایش محتوای فایل',
			'cmdextract'   : 'بازگشایی فایل فشرده',
			'cmdforward'   : 'حرکت به جلو',
			'cmdgetfile'   : 'انتخاب فایل‌ها',
			'cmdhelp'      : 'درباره این نرم‌افزار',
			'cmdhome'      : 'ریشه',
			'cmdinfo'      : 'مشاهده مشخصات',
			'cmdmkdir'     : 'پوشه جدید',
			'cmdmkdirin'   : 'انتقال به پوشه جدید', // from v2.1.7 added 19.2.2016
			'cmdmkfile'    : 'فایل جدید',
			'cmdopen'      : 'باز کردن',
			'cmdpaste'     : 'چسباندن',
			'cmdquicklook' : 'پیش نمایش',
			'cmdreload'    : 'بارگذاری مجدد',
			'cmdrename'    : 'تغییر نام',
			'cmdrm'        : 'حذف',
			'cmdtrash'     : 'انتقال به سطل بازیافت', //from v2.1.24 added 29.4.2017
			'cmdrestore'   : 'بازیابی', //from v2.1.24 added 3.5.2017
			'cmdsearch'    : 'جستجوی فایل',
			'cmdup'        : 'رفتن به سطح بالاتر',
			'cmdupload'    : 'آپلود فایل',
			'cmdview'      : 'مشاهده',
			'cmdresize'    : 'تغییر اندازه و چرخش',
			'cmdsort'      : 'مرتب سازی',
			'cmdnetmount'  : 'اتصال درایو شبکه', // added 18.04.2012
			'cmdnetunmount': 'قطع اتصال', // from v2.1 added 30.04.2012
			'cmdplaces'    : 'به مسیرهای', // added 28.12.2014
			'cmdchmod'     : 'تغییر حالت', // from v2.1 added 20.6.2015
			'cmdopendir'   : 'بازکردن یک پوشه', // from v2.1 added 13.1.2016
			'cmdcolwidth'  : 'بازنشانی عرض ستون', // from v2.1.13 added 12.06.2016
			'cmdfullscreen': 'حالت نمایش تمام صفحه', // from v2.1.15 added 03.08.2016
			'cmdmove'      : 'انتقال', // from v2.1.15 added 21.08.2016
			'cmdempty'     : 'خالی کردن پوشه', // from v2.1.25 added 22.06.2017
			'cmdundo'      : 'خنثی‌سازی', // from v2.1.27 added 31.07.2017
			'cmdredo'      : 'انجام مجدد', // from v2.1.27 added 31.07.2017
			'cmdpreference': 'تنظیمات', // from v2.1.27 added 03.08.2017
			'cmdselectall' : 'انتخاب همه موارد', // from v2.1.28 added 15.08.2017
			'cmdselectnone': 'لغو انتخاب', // from v2.1.28 added 15.08.2017
			'cmdselectinvert': 'انتخاب معکوس', // from v2.1.28 added 15.08.2017
			'cmdopennew'   : 'باز کردن در پنجره جدید', // from v2.1.38 added 3.4.2018
			'cmdhide'      : 'مخفی (پیشنهادی)', // from v2.1.41 added 24.7.2018

			/*********************************** buttons ***********************************/
			'btnClose'  : 'بستن',
			'btnSave'   : 'ذخیره',
			'btnRm'     : 'حذف',
			'btnApply'  : 'اعمال',
			'btnCancel' : 'انصراف',
			'btnNo'     : 'خیر',
			'btnYes'    : 'بلی',
			'btnMount'  : 'اتصال',  // added 18.04.2012
			'btnApprove': 'رفتن به $1 و تایید', // from v2.1 added 26.04.2012
			'btnUnmount': 'قطع اتصال', // from v2.1 added 30.04.2012
			'btnConv'   : 'تبدیل', // from v2.1 added 08.04.2014
			'btnCwd'    : 'اینجا',      // from v2.1 added 22.5.2015
			'btnVolume' : 'درایو',    // from v2.1 added 22.5.2015
			'btnAll'    : 'همه',       // from v2.1 added 22.5.2015
			'btnMime'   : 'نوع فایل', // from v2.1 added 22.5.2015
			'btnFileName':'نام فایل',  // from v2.1 added 22.5.2015
			'btnSaveClose': 'ذخیره و بستن', // from v2.1 added 12.6.2015
			'btnBackup' : 'پشتیبان‌گیری', // fromv2.1 added 28.11.2015
			'btnRename'    : 'تغییر نام',      // from v2.1.24 added 6.4.2017
			'btnRenameAll' : 'تغییر نام(همه)', // from v2.1.24 added 6.4.2017
			'btnPrevious' : 'قبلی ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnNext'     : 'بعدی ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnSaveAs'   : 'ذخیره با نام جدید', // from v2.1.25 added 24.5.2017

			/******************************** notifications ********************************/
			'ntfopen'     : 'در حال باز کردن پوشه',
			'ntffile'     : 'در حال باز کردن فایل',
			'ntfreload'   : 'بارگذاری مجدد محتویات پوشه',
			'ntfmkdir'    : 'در حال ایجاد پوشه',
			'ntfmkfile'   : 'در حال ایجاد فایل',
			'ntfrm'       : 'در حال حذف موارد موردنظر',
			'ntfcopy'     : 'در حال کپی موارد موردنظر',
			'ntfmove'     : 'در حال انتقال موارد موردنظر',
			'ntfprepare'  : 'بررسی موارد موجود',
			'ntfrename'   : 'در حال تغییر نام فایل',
			'ntfupload'   : 'در حال آپلود فایل',
			'ntfdownload' : 'در حال دانلود فایل',
			'ntfsave'     : 'در حال ذخیره فایل',
			'ntfarchive'  : 'در حال ایجاد فایل فشرده',
			'ntfextract'  : 'در حال استخراج فایل ها از حالت فشرده',
			'ntfsearch'   : 'در حال جستجوی فایل',
			'ntfresize'   : 'در حال تغییر اندازه تصاویر',
			'ntfsmth'     : 'درحال انجام عملیات ....',
			'ntfloadimg'  : 'در حال بارگذاری تصویر',
			'ntfnetmount' : 'در حال اتصال درایو شبکه', // added 18.04.2012
			'ntfnetunmount': 'قطع اتصال درایو شبکه', // from v2.1 added 30.04.2012
			'ntfdim'      : 'در حال محاسبه ابعاد تصویر', // added 20.05.2013
			'ntfreaddir'  : 'در حال دریافت مشخصات پوشه', // from v2.1 added 01.07.2013
			'ntfurl'      : 'در حال دریافت URL', // from v2.1 added 11.03.2014
			'ntfchmod'    : 'در حال تغییر نوع فایل', // from v2.1 added 20.6.2015
			'ntfpreupload': 'در حال تایید نام فایل جهت آپلود', // from v2.1 added 31.11.2015
			'ntfzipdl'    : 'در حال ایجاد فایل جهت دانلود', // from v2.1.7 added 23.1.2016
			'ntfparents'  : 'در حال دریافت اطلاعات مسیر', // from v2.1.17 added 2.11.2016
			'ntfchunkmerge': 'در حال پردازش فایل آپلود شده', // from v2.1.17 added 2.11.2016
			'ntftrash'    : 'در حال انتقال به سطل بازیافت', // from v2.1.24 added 2.5.2017
			'ntfrestore'  : 'در حال بازیابی از سطل بازیافت', // from v2.1.24 added 3.5.2017
			'ntfchkdir'   : 'بررسی پوشه مقصد', // from v2.1.24 added 3.5.2017
			'ntfundo'     : 'در حال خنثی‌سازی آخرین عملیات', // from v2.1.27 added 31.07.2017
			'ntfredo'     : 'در حال انجام مجدد آخرین عملیات', // from v2.1.27 added 31.07.2017
			'ntfchkcontent' : 'در حال بررسی مطالب', // from v2.1.41 added 3.8.2018

			/*********************************** volumes *********************************/
			'volume_Trash' : 'سطل بازیافت', //from v2.1.24 added 29.4.2017

			/************************************ dates **********************************/
			'dateUnknown' : 'نامعلوم',
			'Today'       : 'امروز',
			'Yesterday'   : 'دیروز',
			'msJan'       : 'ژانویه',
			'msFeb'       : 'فوریه',
			'msMar'       : 'مارس',
			'msApr'       : 'آوریل',
			'msMay'       : 'می',
			'msJun'       : 'جون',
			'msJul'       : 'جولای',
			'msAug'       : 'آگوست',
			'msSep'       : 'سپتامبر',
			'msOct'       : 'اکتبر',
			'msNov'       : 'نوامبر',
			'msDec'       : 'دسامبر',
			'January'     : 'ژانویه',
			'February'    : 'فوریه',
			'March'       : 'مارس',
			'April'       : 'آوریل',
			'May'         : 'می',
			'June'        : 'جون',
			'July'        : 'جولای',
			'August'      : 'آگوست',
			'September'   : 'سپتامبر',
			'October'     : 'اکتبر',
			'November'    : 'نوامبر',
			'December'    : 'دسامبر',
			'Sunday'      : 'یک‌شنبه',
			'Monday'      : 'دوشنبه',
			'Tuesday'     : 'سه‌شنبه',
			'Wednesday'   : 'چهارشنبه',
			'Thursday'    : 'پنج‌شنبه',
			'Friday'      : 'جمعه',
			'Saturday'    : 'شنبه',
			'Sun'         : 'یک‌شنبه',
			'Mon'         : 'دوشنبه',
			'Tue'         : 'سه‌شنبه',
			'Wed'         : 'چهارشنبه',
			'Thu'         : 'پنج‌شنبه',
			'Fri'         : 'جمعه',
			'Sat'         : 'شنبه',

			/******************************** sort variants ********************************/
			'sortname'          : 'بر اساس نام',
			'sortkind'          : 'بر اساس نوع',
			'sortsize'          : 'بر اساس اندازه',
			'sortdate'          : 'بر اساس تاریخ',
			'sortFoldersFirst'  : 'پوشه‌ها در ابتدای لیست',
			'sortperm'          : 'براساس سطح دسترسی', // from v2.1.13 added 13.06.2016
			'sortmode'          : 'براساس مد دسترسی',       // from v2.1.13 added 13.06.2016
			'sortowner'         : 'براساس مالک',      // from v2.1.13 added 13.06.2016
			'sortgroup'         : 'براساس گروه',      // from v2.1.13 added 13.06.2016
			'sortAlsoTreeview'  : 'همچنین نمای درختی',  // from v2.1.15 added 01.08.2016

			/********************************** new items **********************************/
			'untitled file.txt' : 'فایل.txt جدید', // added 10.11.2015
			'untitled folder'   : 'پوشه جدید',   // added 10.11.2015
			'Archive'           : 'بایگانی جدید',  // from v2.1 added 10.11.2015
			'untitled file'     : 'فایل جدید.$1',  // from v2.1.41 added 6.8.2018
			'extentionfile'     : '$1: فایل',    // from v2.1.41 added 6.8.2018
			'extentiontype'     : '$1: $2',      // from v2.1.43 added 17.10.2018

			/********************************** messages **********************************/
			'confirmReq'      : 'تایید نهایی عملیات ضروری است.',
			'confirmRm'       : 'آیا مطمئنید که موارد انتخابی حذف شوند؟ موارد حدف شده قابل بازیابی نخواهند بود!',
			'confirmRepl'     : 'مالیلد جایگزینی فایل قدیمی با فایل جدید انجام شود؟ (برای جایگزینی پوشه محتوای قدیمی با محتوای پوشه جدید ادغام خواهد شد. برای تهیه پشتیبانی و سپس جایگزینی گزینه پشتیبان‌گیری را انتخاب نمایید)',
			'confirmRest'     : 'آیا مایلید موارد موجود با موارد بازیابی شده از سطل بازیافت جایگزین شود؟', // fromv2.1.24 added 5.5.2017
			'confirmConvUTF8' : 'UTF-8 نیست<br/>تبدیل به UTF-8 انجام شود؟<br/>پس از ذخیره سازی محتوا به صورت UTF-8 خواهد بود.', // from v2.1 added 08.04.2014
			'confirmNonUTF8'  : 'encoding این فایل قابل تشخیص نیست. جهت ویرایش نیاز است که به صورت موقت به UTF-8 تبدیل شود.<br/>لطفا encoding فایل را انتخاب نمایید.', // from v2.1.19 added 28.11.2016
			'confirmNotSave'  : 'تغییراتی اعمال شده است.<br/>در صورت عدم ذخیره تغییرات از بین خواهد رفت.', // from v2.1 added 15.7.2015
			'confirmTrash'    : 'آیا مطمئنید که این موارد به سطل بازیافت منتقل شوند؟', //from v2.1.24 added 29.4.2017
			'confirmMove'     : 'آیا مطمئن هستید که می خواهید موارد را به "$1" منتقل کنید؟', //from v2.1.50 added 27.7.2019
			'apllyAll'        : 'اعمال تغییرات به همه موارد',
			'name'            : 'نام',
			'size'            : 'اندازه',
			'perms'           : 'سطح دسترسی',
			'modify'          : 'آخرین تغییرات',
			'kind'            : 'نوع',
			'read'            : 'خواندن',
			'write'           : 'نوشتن',
			'noaccess'        : 'دسترسی وجود ندارد',
			'and'             : 'و',
			'unknown'         : 'نامعلوم',
			'selectall'       : 'انتخاب همه موارد',
			'selectfiles'     : 'انتخاب یک یا چند مورد',
			'selectffile'     : 'انتخاب اولین مورد',
			'selectlfile'     : 'انتخاب آخرین مورد',
			'viewlist'        : 'حالت نمایش لیست',
			'viewicons'       : 'نمایش با آیکون',
			'viewSmall'       : 'آیکون‌های کوچک', // from v2.1.39 added 22.5.2018
			'viewMedium'      : 'آیکون‌های متوسط', // from v2.1.39 added 22.5.2018
			'viewLarge'       : 'آیکون‌های بزرگ', // from v2.1.39 added 22.5.2018
			'viewExtraLarge'  : 'آیکون‌های خیلی بزرگ', // from v2.1.39 added 22.5.2018
			'places'          : 'مسیرها',
			'calc'            : 'محاسبه',
			'path'            : 'مسیر',
			'aliasfor'        : 'نام مستعار برای',
			'locked'          : 'قفل شده',
			'dim'             : 'ابعاد',
			'files'           : 'فایل‌ها',
			'folders'         : 'پوشه‌ها',
			'items'           : 'آیتم‌ها',
			'yes'             : 'بلی',
			'no'              : 'خیر',
			'link'            : 'لینک',
			'searcresult'     : 'نتایج جستجو',
			'selected'        : 'موارد انتخاب شده',
			'about'           : 'درباره',
			'shortcuts'       : 'میانبرها',
			'help'            : 'راهنمایی',
			'webfm'           : 'مدیر فایل تحت وب',
			'ver'             : 'نسخه',
			'protocolver'     : 'نسخه پروتکل',
			'homepage'        : 'صفحه اصلی پروژه',
			'docs'            : 'مستندات',
			'github'          : 'صفحه پروژه را در Github مشاهده کنید',
			'twitter'         : 'ما را در Twitter دنبال کنید',
			'facebook'        : 'به ما در facebook ملحق شوید',
			'team'            : 'تیم',
			'chiefdev'        : 'توسعه دهنده اصلی',
			'developer'       : 'توسعه دهنده',
			'contributor'     : 'مشارکت کننده',
			'maintainer'      : 'پشتیبان',
			'translator'      : 'مترجم',
			'icons'           : 'آیکون‌ها',
			'dontforget'      : 'و فراموش نکنید که حوله خود را بردارید',
			'shortcutsof'     : 'میانبرها غیرفعال شده‌اند.',
			'dropFiles'       : 'فایل ها در این بخش رها کنید.',
			'or'              : 'یا',
			'selectForUpload' : 'انتخاب فایل جهت آپلود',
			'moveFiles'       : 'انتقال موارد',
			'copyFiles'       : 'کپی موارد',
			'restoreFiles'    : 'بازیابی موارد', // from v2.1.24 added 5.5.2017
			'rmFromPlaces'    : 'حذف',
			'aspectRatio'     : 'نسبت تصویر',
			'scale'           : 'مقیاس',
			'width'           : 'طول',
			'height'          : 'ارتفاع',
			'resize'          : 'تغییر اندازه',
			'crop'            : 'بریدن',
			'rotate'          : 'چرخاندن',
			'rotate-cw'       : 'چرخاندن 90 درجه در جهت عقربه‌های ساعت',
			'rotate-ccw'      : 'چرخاندن 90 درجه در جهت خلاف عقربه‌های ساعت',
			'degree'          : '°',
			'netMountDialogTitle' : 'اتصال درایو شبکه', // added 18.04.2012
			'protocol'            : 'پروتکل', // added 18.04.2012
			'host'                : 'میزبان', // added 18.04.2012
			'port'                : 'پورت', // added 18.04.2012
			'user'                : 'نام کاربری', // added 18.04.2012
			'pass'                : 'کلمه عبور', // added 18.04.2012
			'confirmUnmount'      : 'مطمئن به قطع اتصال $1 می باشد؟',  // from v2.1 added 30.04.2012
			'dropFilesBrowser': 'فایل‌ها را به داخل این کادر بیندازید یا از حافظه paste کنید', // from v2.1 added 30.05.2012
			'dropPasteFiles'  : 'فایل‌ها را به داخل این کادر بیندازید یا از داخل حافظه آدرس URL/تصاویر را paste کنید', // from v2.1 added 07.04.2014
			'encoding'        : 'نوع کد گذاری', // from v2.1 added 19.12.2014
			'locale'          : 'نوع Locale',   // from v2.1 added 19.12.2014
			'searchTarget'    : 'مقصد: $1',                // from v2.1 added 22.5.2015
			'searchMime'      : 'جستجو براساس MIME Type وارد شده', // from v2.1 added 22.5.2015
			'owner'           : 'مالک', // from v2.1 added 20.6.2015
			'group'           : 'گروه', // from v2.1 added 20.6.2015
			'other'           : 'سایر', // from v2.1 added 20.6.2015
			'execute'         : 'قابل اجرا', // from v2.1 added 20.6.2015
			'perm'            : 'سطح دسترسی', // from v2.1 added 20.6.2015
			'mode'            : 'مد دسترسی', // from v2.1 added 20.6.2015
			'emptyFolder'     : 'پوشه خالی است', // from v2.1.6 added 30.12.2015
			'emptyFolderDrop' : 'پوشه خالی است، فایل‌ها را جهت افزودن کشیده و رها کنید', // from v2.1.6 added 30.12.2015
			'emptyFolderLTap' : 'پوشه خالی است، یک اشاره طولانی برای افزودن فایل کافی است', // from v2.1.6 added 30.12.2015
			'quality'         : 'کیفیت', // from v2.1.6 added 5.1.2016
			'autoSync'        : 'همگام‌سازی خودکار',  // from v2.1.6 added 10.1.2016
			'moveUp'          : 'حرکت به بالا',  // from v2.1.6 added 18.1.2016
			'getLink'         : 'دریافت URL لینک', // from v2.1.7 added 9.2.2016
			'selectedItems'   : 'موارد انتخاب شده ($1)', // from v2.1.7 added 2.19.2016
			'folderId'        : 'شناسه پوشه', // from v2.1.10 added 3.25.2016
			'offlineAccess'   : 'اجازه دسترسی به صورت آفلاین', // from v2.1.10 added 3.25.2016
			'reAuth'          : 'جهت اعتبارسنجی مجدد', // from v2.1.10 added 3.25.2016
			'nowLoading'      : 'در حال بازگذاری...', // from v2.1.12 added 4.26.2016
			'openMulti'       : 'بازکردن چندین فایل', // from v2.1.12 added 5.14.2016
			'openMultiConfirm': 'شما قصد باز کردن $1 فایل را دارید. آیا مایلید همه موارد در مرورگر باز شود؟', // from v2.1.12 added 5.14.2016
			'emptySearch'     : 'موردی یافت نشد.', // from v2.1.12 added 5.16.2016
			'editingFile'     : 'در حال ویرایش یک فایل.', // from v2.1.13 added 6.3.2016
			'hasSelected'     : 'شما $1 مورد را انتخاب کرده‌اید.', // from v2.1.13 added 6.3.2016
			'hasClipboard'    : 'در حافظه $1 مورد وجود دارد.', // from v2.1.13 added 6.3.2016
			'incSearchOnly'   : 'جستجوی افزایش فقط از نمای فعلی.', // from v2.1.13 added 6.30.2016
			'reinstate'       : 'بازگرداندن', // from v2.1.15 added 3.8.2016
			'complete'        : 'عملیات $1 انجام شد', // from v2.1.15 added 21.8.2016
			'contextmenu'     : 'منو راست', // from v2.1.15 added 9.9.2016
			'pageTurning'     : 'چرخش صفحه', // from v2.1.15 added 10.9.2016
			'volumeRoots'     : 'ریشه‌های درایو', // from v2.1.16 added 16.9.2016
			'reset'           : 'بازنشانی', // from v2.1.16 added 1.10.2016
			'bgcolor'         : 'رنگ پس زمینه', // from v2.1.16 added 1.10.2016
			'colorPicker'     : 'انتخابگر رنگ', // from v2.1.16 added 1.10.2016
			'8pxgrid'         : 'گرید 8px', // from v2.1.16 added 4.10.2016
			'enabled'         : 'فعال شده', // from v2.1.16 added 4.10.2016
			'disabled'        : 'غیرفعال شده', // from v2.1.16 added 4.10.2016
			'emptyIncSearch'  : 'در نمای فعلی موردی یافت نشد.\\Aبا فشردن کلید Enter مسیر جستجو را تغییر دهید.', // from v2.1.16 added 5.10.2016
			'emptyLetSearch'  : 'برای جستجوی تک حرفی در نمایش فعلی موردی یافت نشد.', // from v2.1.23 added 24.3.2017
			'textLabel'       : 'عنوان متنی', // from v2.1.17 added 13.10.2016
			'minsLeft'        : '$1 دقیقه باقیمانده', // from v2.1.17 added 13.11.2016
			'openAsEncoding'  : 'باز کردن مجدد با کد گذاری انتخاب شده', // from v2.1.19 added 2.12.2016
			'saveAsEncoding'  : 'ذخیره با کد گذاری انتخاب شده', // from v2.1.19 added 2.12.2016
			'selectFolder'    : 'انتخاب پوشه', // from v2.1.20 added 13.12.2016
			'firstLetterSearch': 'جستجوی تک حرفی', // from v2.1.23 added 24.3.2017
			'presets'         : 'از پیش تعیین شده', // from v2.1.25 added 26.5.2017
			'tooManyToTrash'  : 'موارد زیاد است و امکان انتقال به سطل بازیافت وجود ندارد.', // from v2.1.25 added 9.6.2017
			'TextArea'        : 'ویرایش محتوا', // from v2.1.25 added 14.6.2017
			'folderToEmpty'   : 'خالی کردن پوشه "$1".', // from v2.1.25 added 22.6.2017
			'filderIsEmpty'   : 'پوشه "$1" ‌ذاتا خالی است.', // from v2.1.25 added 22.6.2017
			'preference'      : 'تنظیمات', // from v2.1.26 added 28.6.2017
			'language'        : 'زبان', // from v2.1.26 added 28.6.2017
			'clearBrowserData': 'بازبینی تنظیمات ذخیره شده در این مرورگر', // from v2.1.26 added 28.6.2017
			'toolbarPref'     : 'تنظیمات نوار ابزار', // from v2.1.27 added 2.8.2017
			'charsLeft'       : '... $1 کاراکتر باقیمانده.',  // from v2.1.29 added 30.8.2017
			'linesLeft'       : '$1 خط مانده است',  // from v2.1.52 added 16.1.2020
			'sum'             : 'مجموع', // from v2.1.29 added 28.9.2017
			'roughFileSize'   : 'اندازه فایل نامتعارف', // from v2.1.30 added 2.11.2017
			'autoFocusDialog' : 'انتخاب عناصر داخل دیالوگ با mouseover',  // from v2.1.30 added 2.11.2017
			'select'          : 'انتخاب', // from v2.1.30 added 23.11.2017
			'selectAction'    : 'عملیات به هنگام انتخاب فایل', // from v2.1.30 added 23.11.2017
			'useStoredEditor' : 'باز کردن با ویرایشگر مورداستفاده در آخرین دفعه', // from v2.1.30 added 23.11.2017
			'selectinvert'    : 'انتخاب معکوس', // from v2.1.30 added 25.11.2017
			'renameMultiple'  : 'آیا مایل به تغییر نام $1 مورد انتخاب شده همانند $2 هستید؟<br/>امکان بازگرداندن این تغییر پس از اعمالو جود ندارد!', // from v2.1.31 added 4.12.2017
			'batchRename'     : 'تغییرنام گروهی', // from v2.1.31 added 8.12.2017
			'plusNumber'      : '+ عدد', // from v2.1.31 added 8.12.2017
			'asPrefix'        : 'افزودن پیشوند', // from v2.1.31 added 8.12.2017
			'asSuffix'        : 'افزودن پسوند', // from v2.1.31 added 8.12.2017
			'changeExtention' : 'تغییر پسوند فایل', // from v2.1.31 added 8.12.2017
			'columnPref'      : 'تنظیمات ستون‌ها (حالت نمایش لیست)', // from v2.1.32 added 6.2.2018
			'reflectOnImmediate' : 'تمامی تغییرات به صورت آنی برروی فایل فشرده اعمال خواهد شد.', // from v2.1.33 added 2.3.2018
			'reflectOnUnmount'   : 'تمامی تغییرات تا زمانی که اتصال این درایو قطع نشده است اعمال نخواهند شد.', // from v2.1.33 added 2.3.2018
			'unmountChildren' : 'اتصال به درایوهای زیر قطع خواهد شد. آیا مطمئن به ادامه عملیات هستید؟', // from v2.1.33 added 5.3.2018
			'selectionInfo'   : 'مشخصات', // from v2.1.33 added 7.3.2018
			'hashChecker'     : 'الگوریتم های نمایش hash فایل', // from v2.1.33 added 10.3.2018
			'infoItems'       : 'موارد اطلاعات', // from v2.1.38 added 28.3.2018
			'pressAgainToExit': 'جهت خروج مجدد فشار دهید.', // from v2.1.38 added 1.4.2018
			'toolbar'         : 'نوار ابزار', // from v2.1.38 added 4.4.2018
			'workspace'       : 'فضای کاری', // from v2.1.38 added 4.4.2018
			'dialog'          : 'پنجره دیالوگ', // from v2.1.38 added 4.4.2018
			'all'             : 'همه', // from v2.1.38 added 4.4.2018
			'iconSize'        : 'اندازه آیکون‌ها (نمایش به صورت آیکون)', // from v2.1.39 added 7.5.2018
			'editorMaximized' : 'باز کردن پنجره ویرایشگر به صورت تمام صفحه', // from v2.1.40 added 30.6.2018
			'editorConvNoApi' : 'بدلیل در دسترسی نبودن تبدیل از طریق API، لطفا برروی وب سایت تبدیل را انجام دهید.', //from v2.1.40 added 8.7.2018
			'editorConvNeedUpload' : 'پس از تبدیل, شما بایستی از طریق آدرس URL یا فایل دریافت شده آپلود را انجاد دهید تا فایل تبدیل شده ذخیره گردد.', //from v2.1.40 added 8.7.2018
			'convertOn'       : 'تبدیل برروی سایت از $1', // from v2.1.40 added 10.7.2018
			'integrations'    : 'هماهنگ سازی‌ها', // from v2.1.40 added 11.7.2018
			'integrationWith' : 'elFinder با سرویس های زیر هماهنگ شده است. لطفا ابتدا شرایط استفاده، مقررات حریم خصوصی و سایر موارد را مطالعه بفرمایید.', // from v2.1.40 added 11.7.2018
			'showHidden'      : 'نمایش موارد پنهان', // from v2.1.41 added 24.7.2018
			'hideHidden'      : 'موارد مخفی را پنهان کنید', // from v2.1.41 added 24.7.2018
			'toggleHidden'    : 'نمایش / پنهان کردن موارد پنهان', // from v2.1.41 added 24.7.2018
			'makefileTypes'   : 'انواع فایل برای فعال کردن با "فایل جدید"', // from v2.1.41 added 7.8.2018
			'typeOfTextfile'  : 'نوع فایل نوشتاری', // from v2.1.41 added 7.8.2018
			'add'             : 'اضافه کردن', // from v2.1.41 added 7.8.2018
			'theme'           : 'تم', // from v2.1.43 added 19.10.2018
			'default'         : 'پیش فرض', // from v2.1.43 added 19.10.2018
			'description'     : 'توضیحات', // from v2.1.43 added 19.10.2018
			'website'         : 'وب سایت', // from v2.1.43 added 19.10.2018
			'author'          : 'نویستده', // from v2.1.43 added 19.10.2018
			'email'           : 'ایمیل', // from v2.1.43 added 19.10.2018
			'license'         : 'لایسنس', // from v2.1.43 added 19.10.2018
			'exportToSave'    : 'این مورد ذخیره نمی شود برای جلوگیری از دست دادن ویرایش ها ، آنها را به رایانه خود منتقل کنید.', // from v2.1.44 added 1.12.2018
			'dblclickToSelect': 'برای انتخاب پرونده ، دوبار کلیک کنید.', // from v2.1.47 added 22.1.2019
			'useFullscreen'   : 'از حالت تمام صفحه استفاده کنید', // from v2.1.47 added 19.2.2019

			/********************************** mimetypes **********************************/
			'kindUnknown'     : 'نامعلوم',
			'kindRoot'        : 'ریشه درایو', // from v2.1.16 added 16.10.2016
			'kindFolder'      : 'پوشه',
			'kindSelects'     : 'انتخاب شده‌ها', // from v2.1.29 added 29.8.2017
			'kindAlias'       : 'اسم مستعار',
			'kindAliasBroken' : 'اسم مستعار ناقص',
			// applications
			'kindApp'         : 'برنامه',
			'kindPostscript'  : 'سند Postscript',
			'kindMsOffice'    : 'سند Microsoft Office',
			'kindMsWord'      : 'سند Microsoft Word',
			'kindMsExcel'     : 'سند Microsoft Excel',
			'kindMsPP'        : 'فایل ارایه Microsoft Powerpoint',
			'kindOO'          : 'سند Open Office',
			'kindAppFlash'    : 'برنامه فلش',
			'kindPDF'         : 'سند قابل حمل (PDF)',
			'kindTorrent'     : 'فایل تورنت',
			'kind7z'          : 'فایل فشرده 7z',
			'kindTAR'         : 'فایل فشرده TAR',
			'kindGZIP'        : 'فایل فشرده GZIP',
			'kindBZIP'        : 'فایل فشرده BZIP',
			'kindXZ'          : 'فایل فشرده XZ',
			'kindZIP'         : 'فایل فشرده ZIP',
			'kindRAR'         : 'فایل فشرده RAR',
			'kindJAR'         : 'فایل JAR مربوط به جاوا',
			'kindTTF'         : 'فونت True Type',
			'kindOTF'         : 'فونت Open Type',
			'kindRPM'         : 'بسته RPM',
			// texts
			'kindText'        : 'سند متنی',
			'kindTextPlain'   : 'سند متنی ساده',
			'kindPHP'         : 'سورس کد PHP',
			'kindCSS'         : 'فایل style sheet',
			'kindHTML'        : 'سند HTML',
			'kindJS'          : 'سورس کد Javascript',
			'kindRTF'         : 'سند متنی غنی',
			'kindC'           : 'سورس کد C',
			'kindCHeader'     : 'سورس کد C header',
			'kindCPP'         : 'سورس کد C++',
			'kindCPPHeader'   : 'سورس کد C++ header',
			'kindShell'       : 'اسکریپت شل یونیکس',
			'kindPython'      : 'سورس کد Python',
			'kindJava'        : 'سورس کد Java',
			'kindRuby'        : 'سورس کد Ruby',
			'kindPerl'        : 'اسکریپت Perl',
			'kindSQL'         : 'سورس کد SQL',
			'kindXML'         : 'سند XML',
			'kindAWK'         : 'سورس کد AWK',
			'kindCSV'         : 'مقادیر جداشده با کامل',
			'kindDOCBOOK'     : 'سند Docbook XML',
			'kindMarkdown'    : 'سند متنی Markdown', // added 20.7.2015
			// images
			'kindImage'       : 'تصویر',
			'kindBMP'         : 'تصویر BMP',
			'kindJPEG'        : 'تصویر JPEG',
			'kindGIF'         : 'تصویر GIF',
			'kindPNG'         : 'تصویر PNG',
			'kindTIFF'        : 'تصویر TIFF',
			'kindTGA'         : 'تصویر TGA',
			'kindPSD'         : 'تصویر Adobe Photoshop',
			'kindXBITMAP'     : 'تصویر X bitmap',
			'kindPXM'         : 'تصویر Pixelmator',
			// media
			'kindAudio'       : 'فایل صوتی',
			'kindAudioMPEG'   : 'فایل صوتی MPEG',
			'kindAudioMPEG4'  : 'فایل صوتی MPEG-4',
			'kindAudioMIDI'   : 'فایل صوتی MIDI',
			'kindAudioOGG'    : 'فایل صوتی Ogg Vorbis',
			'kindAudioWAV'    : 'فایل صوتی WAV',
			'AudioPlaylist'   : 'لیست پخش MP3',
			'kindVideo'       : 'فایل ویدیویی',
			'kindVideoDV'     : 'فایل ویدیویی DV',
			'kindVideoMPEG'   : 'فایل ویدیویی MPEG',
			'kindVideoMPEG4'  : 'فایل ویدیویی MPEG-4',
			'kindVideoAVI'    : 'فایل ویدیویی AVI',
			'kindVideoMOV'    : 'فایل ویدیویی Quick Time',
			'kindVideoWM'     : 'فایل ویدیویی Windows Media',
			'kindVideoFlash'  : 'فایل ویدیویی Flash',
			'kindVideoMKV'    : 'فایل ویدیویی Matroska',
			'kindVideoOGG'    : 'فایل ویدیویی Ogg'
		}
	};
}));js/i18n/elfinder.fallback.js000064400000000353151215013360011621 0ustar00(function(factory) {
	if (typeof define === 'function' && define.amd) {
		define(factory);
	} else if (typeof exports !== 'undefined') {
		module.exports = factory();
	} else {
		factory();
	}
}(this, function() {
	return void 0;
}));
js/i18n/elfinder.zh_CN.js000064400000077407151215013360011101 0ustar00/**
 * 简体中文 translation
 * @author 翻译者 deerchao <deerchao@gmail.com>
 * @author Andy Hu <andyhu7@yahoo.com.hk>
 * @author Max Wen<max.wen@qq.com>
 * @author Kejun Chang <changkejun@hotmail.com>
 * @author LDMING <china-live@live.cn>
 * @author Andy Lee <oraclei@126.com>
 * @author Cololi <i@cololi.moe>
 * @version 2022-03-04
 */
 (function(root, factory) {
	if (typeof define === 'function' && define.amd) {
		define(['elfinder'], factory);
	} else if (typeof exports !== 'undefined') {
		module.exports = factory(require('elfinder'));
	} else {
		factory(root.elFinder);
	}
}(this, function(elFinder) {
	elFinder.prototype.i18.zh_CN = {
		translator : '翻译者 deerchao &lt;deerchao@gmail.com&gt;, Andy Hu &lt;andyhu7@yahoo.com.hk&gt;, Max Wen&lt;max.wen@qq.com&gt;, Kejun Chang &lt;changkejun@hotmail.com&gt;, LDMING &lt;china-live@live.cn&gt;, Andy Lee &lt;oraclei@126.com&gt;, Cololi &lt;i@cololi.moe&gt;',
		language   : '简体中文',
		direction  : 'ltr',
		dateFormat : 'Y-m-d H:i', // will show like: 2022-03-04 11:47
		fancyDateFormat : '$1 H:i', // will show like: 今天 11:47
		nonameDateFormat : 'ymd-His', // noname upload will show like: 220304-114755
		messages   : {
			'getShareText' : '分享',
			'Editor ': '代码编辑器',

			/********************************** errors **********************************/
			'error'                : '错误',
			'errUnknown'           : '未知的错误.',
			'errUnknownCmd'        : '未知的命令.',
			'errJqui'              : '无效的 jQuery UI 配置,必须包含 Selectable、draggable 以及 droppable 组件.',
			'errNode'              : 'elFinder 需要能创建 DOM 元素.',
			'errURL'               : '无效的 elFinder 配置! URL 选项未配置.',
			'errAccess'            : '访问被拒绝.',
			'errConnect'           : '不能连接到服务器端.',
			'errAbort'             : '连接中止.',
			'errTimeout'           : '连接超时.',
			'errNotFound'          : '未找到服务器端.',
			'errResponse'          : '无效的服务器端响应.',
			'errConf'              : '无效的服务器端配置.',
			'errJSON'              : 'PHP JSON 模块未安装.',
			'errNoVolumes'         : '无可读的卷.',
			'errCmdParams'         : '无效的命令 "$1".',
			'errDataNotJSON'       : '服务器返回的数据不符合 JSON 格式.',
			'errDataEmpty'         : '服务器返回的数据为空.',
			'errCmdReq'            : '服务器端请求需要命令名称.',
			'errOpen'              : '无法打开 "$1".',
			'errNotFolder'         : '对象不是文件夹.',
			'errNotFile'           : '对象不是文件.',
			'errRead'              : '无法读取 "$1".',
			'errWrite'             : '无法写入 "$1".',
			'errPerm'              : '没有权限.',
			'errLocked'            : '"$1" 已被锁定,不能重命名, 移动或删除.',
			'errExists'            : '文件 "$1" 已经存在.',
			'errInvName'           : '无效的文件名.',
			'errInvDirname'        : '无效的文件夹名.',  // from v2.1.24 added 12.4.2017
			'errFolderNotFound'    : '文件夹不存在.',
			'errFileNotFound'      : '文件不存在.',
			'errTrgFolderNotFound' : '未找到目标文件夹 "$1".',
			'errPopup'             : '浏览器拦截了弹出窗口. 请在选项中允许弹出窗口.',
			'errMkdir'             : '不能创建文件夹 "$1".',
			'errMkfile'            : '不能创建文件 "$1".',
			'errRename'            : '不能重命名 "$1".',
			'errCopyFrom'          : '不允许从卷 "$1" 复制.',
			'errCopyTo'            : '不允许向卷 "$1" 复制.',
			'errMkOutLink'         : '无法创建链接到卷根以外的链接.', // from v2.1 added 03.10.2015
			'errUpload'            : '上传出错.',  // old name - errUploadCommon
			'errUploadFile'        : '无法上传 "$1".', // old name - errUpload
			'errUploadNoFiles'     : '未找到要上传的文件.',
			'errUploadTotalSize'   : '数据超过了允许的最大大小.', // old name - errMaxSize
			'errUploadFileSize'    : '文件超过了允许的最大大小.', //  old name - errFileMaxSize
			'errUploadMime'        : '不允许的文件类型.',
			'errUploadTransfer'    : '"$1" 传输错误.',
			'errUploadTemp'        : '无法为上传文件创建临时文件.', // from v2.1 added 26.09.2015
			'errNotReplace'        : ' "$1" 已存在, 不能被替换.', // new
			'errReplace'           : '无法替换 "$1".',
			'errSave'              : '无法保存 "$1".',
			'errCopy'              : '无法复制 "$1".',
			'errMove'              : '无法移动 "$1".',
			'errCopyInItself'      : '不能移动 "$1" 到原有位置.',
			'errRm'                : '无法删除 "$1".',
			'errTrash'             : '无法移到回收站.', // from v2.1.24 added 30.4.2017
			'errRmSrc'             : '不能删除源文件.',
			'errExtract'           : '无法从 "$1" 提取文件.',
			'errArchive'           : '无法创建压缩包.',
			'errArcType'           : '不支持的压缩格式.',
			'errNoArchive'         : '文件不是压缩包, 或者不支持该压缩格式.',
			'errCmdNoSupport'      : '服务器端不支持该命令.',
			'errReplByChild'       : '不能用文件夹 “$1” 下的项替换文件夹 “$1” 自身.',
			'errArcSymlinks'       : '出于安全上的考虑,不允许解压包含符号链接的压缩包.', // edited 24.06.2012
			'errArcMaxSize'        : '压缩包文件超过最大允许文件大小范围.',
			'errResize'            : '无法将调整大小到 "$1".',
			'errResizeDegree'      : '无效的旋转角度.',  // added 7.3.2013
			'errResizeRotate'      : '无法旋转图片.',  // added 7.3.2013
			'errResizeSize'        : '无效的图片尺寸.',  // added 7.3.2013
			'errResizeNoChange'    : '图片尺寸未改变.',  // added 7.3.2013
			'errUsupportType'      : '不被支持的文件格式.',
			'errNotUTF8Content'    : '文件 "$1" 不是 UTF-8 格式, 不能编辑.',  // added 9.11.2011
			'errNetMount'          : '无法装载 "$1".', // added 17.04.2012
			'errNetMountNoDriver'  : '不支持该协议.',     // added 17.04.2012
			'errNetMountFailed'    : '装载失败.',         // added 17.04.2012
			'errNetMountHostReq'   : '需要指定主机.', // added 18.04.2012
			'errSessionExpires'    : '您的会话由于长时间未活动已过期.',
			'errCreatingTempDir'   : '无法创建临时目录 "$1"',
			'errFtpDownloadFile'   : '无法从FTP下载文件 "$1" ',
			'errFtpUploadFile'     : '无法将文件 "$1" 上传至FTP',
			'errFtpMkdir'          : '无法在FTP上创建远程目录 "$1"',
			'errArchiveExec'       : '归档文件"$1"时出错.',
			'errExtractExec'       : '解压文件"$1"时出错.',
			'errNetUnMount'        : '无法卸载.', // from v2.1 added 30.04.2012
			'errConvUTF8'          : '未转换至UTF-8', // from v2.1 added 08.04.2014
			'errFolderUpload'      : '如果您需要上传目录, 请尝试使用Google Chrome.', // from v2.1 added 26.6.2015
			'errSearchTimeout'     : '搜索 "$1" 超时,仅显示部分搜索结果.', // from v2.1 added 12.1.2016
			'errReauthRequire'     : '必需重新授权.', // from v2.1.10 added 24.3.2016
			'errMaxTargets'        : '最大可选择项目数为 $1.', // from v2.1.17 added 17.10.2016
			'errRestore'           : '无法从回收站中恢复,无法识别还原目的地.', // from v2.1.24 added 3.5.2017
			'errEditorNotFound'    : '找不到这个文件的编辑器.', // from v2.1.25 added 23.5.2017
			'errServerError'       : '服务端发生错误.', // from v2.1.25 added 16.6.2017
			'errEmpty'             : '无法清空文件夹 "$1".', // from v2.1.25 added 22.6.2017
			'moreErrors'           : '存在 $1 多个错误.', // from v2.1.44 added 9.12.2018
			'errMaxMkdirs'         : '您一次最多可以创建 $1 个文件夹。', // from v2.1.58 added 20.6.2021

			/******************************* commands names ********************************/
			'cmdarchive'   : '创建压缩包',
			'cmdback'      : '后退',
			'cmdcopy'      : '复制',
			'cmdcut'       : '剪切',
			'cmddownload'  : '下载',
			'cmdduplicate' : '创建副本',
			'cmdedit'      : '编辑文件',
			'cmdextract'   : '从压缩包提取文件',
			'cmdforward'   : '前进',
			'cmdgetfile'   : '选择文件',
			'cmdhelp'      : '关于',
			'cmdhome'      : '首页',
			'cmdinfo'      : '查看详情',
			'cmdmkdir'     : '新建文件夹',
			'cmdmkdirin'   : '至新文件夹', // from v2.1.7 added 19.2.2016
			'cmdmkfile'    : '新建文件',
			'cmdopen'      : '打开',
			'cmdpaste'     : '粘贴',
			'cmdquicklook' : '预览',
			'cmdreload'    : '刷新',
			'cmdrename'    : '重命名',
			'cmdrm'        : '删除',
			'cmdtrash'     : '至回收站', //from v2.1.24 added 29.4.2017
			'cmdrestore'   : '恢复', //from v2.1.24 added 3.5.2017
			'cmdsearch'    : '查找文件',
			'cmdup'        : '转到上一级文件夹',
			'cmdupload'    : '上传文件',
			'cmdview'      : '查看',
			'cmdresize'    : '调整大小&旋转',
			'cmdsort'      : '排序',
			'cmdnetmount'  : '装载网络卷', // added 18.04.2012
			'cmdnetunmount': '卸载', // from v2.1 added 30.04.2012
			'cmdplaces'    : '添加到收藏夹', // added 28.12.2014
			'cmdchmod'     : '改变模式', // from v2.1 added 20.6.2015
			'cmdopendir'   : '打开文件夹', // from v2.1 added 13.1.2016
			'cmdcolwidth'  : '设置列宽', // from v2.1.13 added 12.06.2016
			'cmdfullscreen': '全屏显示', // from v2.1.15 added 03.08.2016
			'cmdmove'      : '移动', // from v2.1.15 added 21.08.2016
			'cmdempty'     : '清空文件夹', // from v2.1.25 added 22.06.2017
			'cmdundo'      : '撤消', // from v2.1.27 added 31.07.2017
			'cmdredo'      : '重做', // from v2.1.27 added 31.07.2017
			'cmdpreference': '偏好', // from v2.1.27 added 03.08.2017
			'cmdselectall' : '全选', // from v2.1.28 added 15.08.2017
			'cmdselectnone': '全不选', // from v2.1.28 added 15.08.2017
			'cmdselectinvert': '反向选择', // from v2.1.28 added 15.08.2017
			'cmdopennew'   : '在新窗口打开', // from v2.1.38 added 3.4.2018
			'cmdhide'      : '隐藏 (偏好)', // from v2.1.41 added 24.7.2018

			/*********************************** buttons ***********************************/
			'btnClose'  : '关闭',
			'btnSave'   : '保存',
			'btnRm'     : '删除',
			'btnApply'  : '应用',
			'btnCancel' : '取消',
			'btnNo'     : '否',
			'btnYes'    : '是',
			'btnMount'  : '装载',  // added 18.04.2012
			'btnApprove': '至 $1 并确认', // from v2.1 added 26.04.2012
			'btnUnmount': '卸载', // from v2.1 added 30.04.2012
			'btnConv'   : '转换', // from v2.1 added 08.04.2014
			'btnCwd'    : '这里',      // from v2.1 added 22.5.2015
			'btnVolume' : '卷',    // from v2.1 added 22.5.2015
			'btnAll'    : '全部',       // from v2.1 added 22.5.2015
			'btnMime'   : 'MIME类型', // from v2.1 added 22.5.2015
			'btnFileName':'文件名',  // from v2.1 added 22.5.2015
			'btnSaveClose': '保存并关闭', // from v2.1 added 12.6.2015
			'btnBackup' : '备份', // fromv2.1 added 28.11.2015
			'btnRename'    : '重命名',      // from v2.1.24 added 6.4.2017
			'btnRenameAll' : '重命名(All)', // from v2.1.24 added 6.4.2017
			'btnPrevious' : '向前 ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnNext'     : '向后 ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnSaveAs'   : '另存为', // from v2.1.25 added 24.5.2017

			/******************************** notifications ********************************/
			'ntfopen'     : '打开文件夹',
			'ntffile'     : '打开文件',
			'ntfreload'   : '刷新文件夹内容',
			'ntfmkdir'    : '创建文件夹',
			'ntfmkfile'   : '创建文件',
			'ntfrm'       : '删除文件',
			'ntfcopy'     : '复制文件',
			'ntfmove'     : '移动文件',
			'ntfprepare'  : '准备复制文件',
			'ntfrename'   : '重命名文件',
			'ntfupload'   : '上传文件',
			'ntfdownload' : '下载文件',
			'ntfsave'     : '保存文件',
			'ntfarchive'  : '创建压缩包',
			'ntfextract'  : '从压缩包提取文件',
			'ntfsearch'   : '搜索文件',
			'ntfresize'   : '正在更改尺寸',
			'ntfsmth'     : '正在忙 >_<',
			'ntfloadimg'  : '正在加载图片',
			'ntfnetmount' : '正在装载网络卷', // added 18.04.2012
			'ntfnetunmount': '卸载网络卷', // from v2.1 added 30.04.2012
			'ntfdim'      : '获取图像尺寸', // added 20.05.2013
			'ntfreaddir'  : '正在读取文件夹信息', // from v2.1 added 01.07.2013
			'ntfurl'      : '正在获取链接地址', // from v2.1 added 11.03.2014
			'ntfchmod'    : '正在改变文件模式', // from v2.1 added 20.6.2015
			'ntfpreupload': '正在验证上传文件名', // from v2.1 added 31.11.2015
			'ntfzipdl'    : '正在创建一个下载文件', // from v2.1.7 added 23.1.2016
			'ntfparents'  : '正在取得路径信息', // from v2.1.17 added 2.11.2016
			'ntfchunkmerge': '正在处理上传文件', // from v2.1.17 added 2.11.2016
			'ntftrash'    : '移动到回收站', // from v2.1.24 added 2.5.2017
			'ntfrestore'  : '从回收站恢复', // from v2.1.24 added 3.5.2017
			'ntfchkdir'   : '检查目标文件夹', // from v2.1.24 added 3.5.2017
			'ntfundo'     : '撤消上一个全局操作', // from v2.1.27 added 31.07.2017
			'ntfredo'     : '重做上一全局操作', // from v2.1.27 added 31.07.2017
			'ntfchkcontent' : '检查内容', // from v2.1.41 added 3.8.2018

			/*********************************** volumes *********************************/
			'volume_Trash' : '回收站', //from v2.1.24 added 29.4.2017

			/************************************ dates **********************************/
			'dateUnknown' : '未知',
			'Today'       : '今天',
			'Yesterday'   : '昨天',
			'msJan'       : '一月',
			'msFeb'       : '二月',
			'msMar'       : '三月',
			'msApr'       : '四月',
			'msMay'       : '五月',
			'msJun'       : '六月',
			'msJul'       : '七月',
			'msAug'       : '八月',
			'msSep'       : '九月',
			'msOct'       : '十月',
			'msNov'       : '十一月',
			'msDec'       : '十二月',
			'January'     : '一月',
			'February'    : '二月',
			'March'       : '三月',
			'April'       : '四月',
			'May'         : '五月',
			'June'        : '六月',
			'July'        : '七月',
			'August'      : '八月',
			'September'   : '九月',
			'October'     : '十月',
			'November'    : '十一月',
			'December'    : '十二月',
			'Sunday'      : '星期日',
			'Monday'      : '星期一',
			'Tuesday'     : '星期二',
			'Wednesday'   : '星期三',
			'Thursday'    : '星期四',
			'Friday'      : '星期五',
			'Saturday'    : '星期六',
			'Sun'         : '周日',
			'Mon'         : '周一',
			'Tue'         : '周二',
			'Wed'         : '周三',
			'Thu'         : '周四',
			'Fri'         : '周五',
			'Sat'         : '周六',

			/******************************** sort variants ********************************/
			'sortname'          : '按名称',
			'sortkind'          : '按类型',
			'sortsize'          : '按大小',
			'sortdate'          : '按日期',
			'sortFoldersFirst'  : '文件夹优先',
			'sortperm'          : '按权限排序', // from v2.1.13 added 13.06.2016
			'sortmode'          : '按属性排序',       // from v2.1.13 added 13.06.2016
			'sortowner'         : '按所有者排序',      // from v2.1.13 added 13.06.2016
			'sortgroup'         : '按组排序',      // from v2.1.13 added 13.06.2016
			'sortAlsoTreeview'  : '同时刷新树状目录',  // from v2.1.15 added 01.08.2016

			/********************************** new items **********************************/
			'untitled file.txt' : '新文件.txt', // added 10.11.2015
			'untitled folder'   : '新文件夹',   // added 10.11.2015
			'Archive'           : '新压缩包',  // from v2.1 added 10.11.2015
			'untitled file'     : '新文件.$1',  // from v2.1.41 added 6.8.2018
			'extentionfile'     : '$1: 文件',    // from v2.1.41 added 6.8.2018
			'extentiontype'     : '1 美元:2 美元',      // from v2.1.43 added 17.10.2018

			/********************************** messages **********************************/
			'confirmReq'      : '请确认',
			'confirmRm'       : '确定要删除文件吗?<br/>该操作不可撤销!',
			'confirmRepl'     : '用新的文件替换原有文件?',
			'confirmRest'     : '从回收站替换当前项?', // fromv2.1.24 added 5.5.2017
			'confirmConvUTF8' : '文件不是UTF-8格式.<br/>转换为UTF-8吗?<br/>通过在转换后保存,内容变为UTF-8.', // from v2.1 added 08.04.2014
			'confirmNonUTF8'  : '无法检测到此文件的字符编码.需要暂时转换此文件为UTF-8编码以进行编辑.<br/>请选择此文件的字符编码.', // from v2.1.19 added 28.11.2016
			'confirmNotSave'  : '文件已被编辑.<br/>如果不保存直接关闭,将丢失编辑内容.', // from v2.1 added 15.7.2015
			'confirmTrash'    : '确定要将该项移动到回收站么?', //from v2.1.24 added 29.4.2017
			'confirmMove'     : '确定要移动该项到 "$1"?', //from v2.1.50 added 27.7.2019
			'apllyAll'        : '全部应用',
			'name'            : '名称',
			'size'            : '大小',
			'perms'           : '权限',
			'modify'          : '修改于',
			'kind'            : '类别',
			'read'            : '读取',
			'write'           : '写入',
			'noaccess'        : '无权限',
			'and'             : '和',
			'unknown'         : '未知',
			'selectall'       : '选择所有文件',
			'selectfiles'     : '选择文件',
			'selectffile'     : '选择第一个文件',
			'selectlfile'     : '选择最后一个文件',
			'viewlist'        : '列表视图',
			'viewicons'       : '图标视图',
			'viewSmall'       : '小图标', // from v2.1.39 added 22.5.2018
			'viewMedium'      : '中图标', // from v2.1.39 added 22.5.2018
			'viewLarge'       : '大图标', // from v2.1.39 added 22.5.2018
			'viewExtraLarge'  : '超大图标', // from v2.1.39 added 22.5.2018
			'places'          : '位置',
			'calc'            : '计算',
			'path'            : '路径',
			'aliasfor'        : '别名',
			'locked'          : '锁定',
			'dim'             : '尺寸',
			'files'           : '文件',
			'folders'         : '文件夹',
			'items'           : '项目',
			'yes'             : '是',
			'no'              : '否',
			'link'            : '链接',
			'searcresult'     : '搜索结果',
			'selected'        : '选中的项目',
			'about'           : '关于',
			'shortcuts'       : '快捷键',
			'help'            : '帮助',
			'webfm'           : '网络文件管理器',
			'ver'             : '版本',
			'protocolver'     : '协议版本',
			'homepage'        : '项目主页',
			'docs'            : '文档',
			'github'          : '复刻我们的github',
			'twitter'         : '关注我们的twitter',
			'facebook'        : '加入我们的facebook',
			'team'            : '团队',
			'chiefdev'        : '首席开发',
			'developer'       : '开发',
			'contributor'     : '贡献',
			'maintainer'      : '维护',
			'translator'      : '翻译',
			'icons'           : '图标',
			'dontforget'      : '别忘了带上你擦汗的毛巾',
			'shortcutsof'     : '快捷键已禁用',
			'dropFiles'       : '把文件拖到这里',
			'or'              : '或者',
			'selectForUpload' : '选择要上传的文件',
			'moveFiles'       : '移动文件',
			'copyFiles'       : '复制文件',
			'restoreFiles'    : '恢复文件', // from v2.1.24 added 5.5.2017
			'rmFromPlaces'    : '从这里中删除',
			'aspectRatio'     : '保持比例',
			'scale'           : '缩放比例',
			'width'           : '宽',
			'height'          : '高',
			'resize'          : '调整大小',
			'crop'            : '裁切',
			'rotate'          : '旋转',
			'rotate-cw'       : '顺时针旋转90°',
			'rotate-ccw'      : '逆时针旋转90°',
			'degree'          : '°',
			'netMountDialogTitle' : '装载网络目录', // added 18.04.2012
			'protocol'            : '协议', // added 18.04.2012
			'host'                : '主机', // added 18.04.2012
			'port'                : '端口', // added 18.04.2012
			'user'                : '用户', // added 18.04.2012
			'pass'                : '密码', // added 18.04.2012
			'confirmUnmount'      : '确实要卸载 $1?',  // from v2.1 added 30.04.2012
			'dropFilesBrowser': '从浏览器中拖放或粘贴文件', // from v2.1 added 30.05.2012
			'dropPasteFiles'  : '拖放文件,粘贴网址或剪贴板图像', // from v2.1 added 07.04.2014
			'encoding'        : '编码', // from v2.1 added 19.12.2014
			'locale'          : '语言环境',   // from v2.1 added 19.12.2014
			'searchTarget'    : '目标: $1',                // from v2.1 added 22.5.2015
			'searchMime'      : '按输入MIME类型搜索', // from v2.1 added 22.5.2015
			'owner'           : '所有者', // from v2.1 added 20.6.2015
			'group'           : '组', // from v2.1 added 20.6.2015
			'other'           : '其他', // from v2.1 added 20.6.2015
			'execute'         : '执行', // from v2.1 added 20.6.2015
			'perm'            : '许可', // from v2.1 added 20.6.2015
			'mode'            : '属性', // from v2.1 added 20.6.2015
			'emptyFolder'     : '文件夹是空的', // from v2.1.6 added 30.12.2015
			'emptyFolderDrop' : '文件夹是空的\\A 拖放可追加项目', // from v2.1.6 added 30.12.2015
			'emptyFolderLTap' : '文件夹是空的\\A 长按可添加项目', // from v2.1.6 added 30.12.2015
			'quality'         : '品质', // from v2.1.6 added 5.1.2016
			'autoSync'        : '自动同步',  // from v2.1.6 added 10.1.2016
			'moveUp'          : '向上移动',  // from v2.1.6 added 18.1.2016
			'getLink'         : '获取URL链接', // from v2.1.7 added 9.2.2016
			'selectedItems'   : '已选择项目 ($1)', // from v2.1.7 added 2.19.2016
			'folderId'        : '目录ID', // from v2.1.10 added 3.25.2016
			'offlineAccess'   : '允许离线操作', // from v2.1.10 added 3.25.2016
			'reAuth'          : '重新验证', // from v2.1.10 added 3.25.2016
			'nowLoading'      : '正在加载...', // from v2.1.12 added 4.26.2016
			'openMulti'       : '打开多个文件', // from v2.1.12 added 5.14.2016
			'openMultiConfirm': '您正在尝试打开$1文件.您确定要在浏览器中打开吗?', // from v2.1.12 added 5.14.2016
			'emptySearch'     : '搜索目标中没有匹配结果', // from v2.1.12 added 5.16.2016
			'editingFile'     : '正在编辑文件.', // from v2.1.13 added 6.3.2016
			'hasSelected'     : '已选择 $1 个项目.', // from v2.1.13 added 6.3.2016
			'hasClipboard'    : '剪贴板里有 $1 个项目.', // from v2.1.13 added 6.3.2016
			'incSearchOnly'   : '增量搜索仅来自当前视图.', // from v2.1.13 added 6.30.2016
			'reinstate'       : '恢复', // from v2.1.15 added 3.8.2016
			'complete'        : '$1 完成', // from v2.1.15 added 21.8.2016
			'contextmenu'     : '上下文菜单', // from v2.1.15 added 9.9.2016
			'pageTurning'     : '翻页', // from v2.1.15 added 10.9.2016
			'volumeRoots'     : '根目录', // from v2.1.16 added 16.9.2016
			'reset'           : '重置', // from v2.1.16 added 1.10.2016
			'bgcolor'         : '背景色', // from v2.1.16 added 1.10.2016
			'colorPicker'     : '颜色选择器', // from v2.1.16 added 1.10.2016
			'8pxgrid'         : '步长(8px)', // from v2.1.16 added 4.10.2016
			'enabled'         : '启用', // from v2.1.16 added 4.10.2016
			'disabled'        : '关闭', // from v2.1.16 added 4.10.2016
			'emptyIncSearch'  : '当前视图下没有匹配结果', // from v2.1.16 added 5.10.2016
			'emptyLetSearch'  : '当前视图中的第一个字母搜索结果为空', // from v2.1.23 added 24.3.2017
			'textLabel'       : '文本标签', // from v2.1.17 added 13.10.2016
			'minsLeft'        : '剩余 $1 分钟', // from v2.1.17 added 13.11.2016
			'openAsEncoding'  : '使用所选编码重新打开', // from v2.1.19 added 2.12.2016
			'saveAsEncoding'  : '使用所选编码保存', // from v2.1.19 added 2.12.2016
			'selectFolder'    : '选择目录', // from v2.1.20 added 13.12.2016
			'firstLetterSearch': '首字母搜索', // from v2.1.23 added 24.3.2017
			'presets'         : '预置', // from v2.1.25 added 26.5.2017
			'tooManyToTrash'  : '项目太多,不能移动到回收站.', // from v2.1.25 added 9.6.2017
			'TextArea'        : '文本区域', // from v2.1.25 added 14.6.2017
			'folderToEmpty'   : '清空文件夹 "$1".', // from v2.1.25 added 22.6.2017
			'filderIsEmpty'   : '文件夹 "$1" 为空.', // from v2.1.25 added 22.6.2017
			'preference'      : '偏好', // from v2.1.26 added 28.6.2017
			'language'        : '语言设置', // from v2.1.26 added 28.6.2017
			'clearBrowserData': '清除保存在此浏览器中的偏好设置', // from v2.1.26 added 28.6.2017
			'toolbarPref'     : '工具栏设置', // from v2.1.27 added 2.8.2017
			'charsLeft'       : '... 剩余$1字符',  // from v2.1.29 added 30.8.2017
			'linesLeft'       : '... 剩余$1行',  // from v2.1.52 added 16.1.2020
			'sum'             : '总数', // from v2.1.29 added 28.9.2017
			'roughFileSize'   : '粗略的文件大小', // from v2.1.30 added 2.11.2017
			'autoFocusDialog' : '鼠标悬停在对话框内可编辑区域时自动获得焦点',  // from v2.1.30 added 2.11.2017
			'select'          : '选择', // from v2.1.30 added 23.11.2017
			'selectAction'    : '双击选择的文件时', // from v2.1.30 added 23.11.2017
			'useStoredEditor' : '用上次使用的编辑器打开', // from v2.1.30 added 23.11.2017
			'selectinvert'    : '反向选择', // from v2.1.30 added 25.11.2017
			'renameMultiple'  : '确定要重命名选定项 $1 为 $2 吗?<br/>该操作不能撤消!', // from v2.1.31 added 4.12.2017
			'batchRename'     : '批量重命名', // from v2.1.31 added 8.12.2017
			'plusNumber'      : '增加数量', // from v2.1.31 added 8.12.2017
			'asPrefix'        : '添加前缀', // from v2.1.31 added 8.12.2017
			'asSuffix'        : '添加后缀', // from v2.1.31 added 8.12.2017
			'changeExtention' : '变化范围', // from v2.1.31 added 8.12.2017
			'columnPref'      : '列设置 (列表视图)', // from v2.1.32 added 6.2.2018
			'reflectOnImmediate' : '所有修改将立即反馈到文档.', // from v2.1.33 added 2.3.2018
			'reflectOnUnmount'   : '所有修改在卸载本卷之前不会反馈', // from v2.1.33 added 2.3.2018
			'unmountChildren' : '安装在本卷上的以下卷也会卸载.你确定要卸载吗?', // from v2.1.33 added 5.3.2018
			'selectionInfo'   : '选择信息', // from v2.1.33 added 7.3.2018
			'hashChecker'     : '显示文件散列值的算法', // from v2.1.33 added 10.3.2018
			'infoItems'       : '信息条目 (选择信息面板)', // from v2.1.38 added 28.3.2018
			'pressAgainToExit': '再按退出', // from v2.1.38 added 1.4.2018
			'toolbar'         : '工具条', // from v2.1.38 added 4.4.2018
			'workspace'       : '工作空间', // from v2.1.38 added 4.4.2018
			'dialog'          : '对话框', // from v2.1.38 added 4.4.2018
			'all'             : '全部', // from v2.1.38 added 4.4.2018
			'iconSize'        : '图标尺寸 (图标视图)', // from v2.1.39 added 7.5.2018
			'editorMaximized' : '打开最大化编辑器窗口', // from v2.1.40 added 30.6.2018
			'editorConvNoApi' : '由于通过 API 转换功能当前不可用,请到网站上转换.', //from v2.1.40 added 8.7.2018
			'editorConvNeedUpload' : '转换后,必须上传条目URL或一个下载的文件,以保存转换后的文件.', //from v2.1.40 added 8.7.2018
			'convertOn'       : '在 $1 站点上转换', // from v2.1.40 added 10.7.2018
			'integrations'    : '集成', // from v2.1.40 added 11.7.2018
			'integrationWith' : '本 elFinder 集成以下外部服务.使用前请检查使用条款、隐私政策等.', // from v2.1.40 added 11.7.2018
			'showHidden'      : '显示已隐藏的条目', // from v2.1.41 added 24.7.2018
			'hideHidden'      : '隐藏已隐藏的条目', // from v2.1.41 added 24.7.2018
			'toggleHidden'    : '显示/隐藏已隐藏的条目', // from v2.1.41 added 24.7.2018
			'makefileTypes'   : '允许"新文件"使用的文件类型', // from v2.1.41 added 7.8.2018
			'typeOfTextfile'  : '文本文件类型', // from v2.1.41 added 7.8.2018
			'add'             : '添加', // from v2.1.41 added 7.8.2018
			'theme'           : '主题', // from v2.1.43 added 19.10.2018
			'default'         : '缺省', // from v2.1.43 added 19.10.2018
			'description'     : '描述', // from v2.1.43 added 19.10.2018
			'website'         : '网站', // from v2.1.43 added 19.10.2018
			'author'          : '作者', // from v2.1.43 added 19.10.2018
			'email'           : '邮箱', // from v2.1.43 added 19.10.2018
			'license'         : '许可证', // from v2.1.43 added 19.10.2018
			'exportToSave'    : '本条目不能保存. 为避免丢失编辑数据,须要导出到你的电脑.', // from v2.1.44 added 1.12.2018
			'dblclickToSelect': '在文件上双击以选中它.', // from v2.1.47 added 22.1.2019
			'useFullscreen'   : '使用全屏模式', // from v2.1.47 added 19.2.2019

			/********************************** mimetypes **********************************/
			'kindUnknown'     : '未知',
			'kindRoot'        : '根目录', // from v2.1.16 added 16.10.2016
			'kindFolder'      : '文件夹',
			'kindSelects'     : '选择', // from v2.1.29 added 29.8.2017
			'kindAlias'       : '别名',
			'kindAliasBroken' : '错误的别名',
			// applications
			'kindApp'         : '程序',
			'kindPostscript'  : 'Postscript 文档',
			'kindMsOffice'    : 'Microsoft Office 文档',
			'kindMsWord'      : 'Microsoft Word 文档',
			'kindMsExcel'     : 'Microsoft Excel 文档',
			'kindMsPP'        : 'Microsoft Powerpoint 演示',
			'kindOO'          : 'Open Office 文档',
			'kindAppFlash'    : 'Flash 程序',
			'kindPDF'         : 'PDF 文档',
			'kindTorrent'     : 'Bittorrent 文件',
			'kind7z'          : '7z 压缩包',
			'kindTAR'         : 'TAR 压缩包',
			'kindGZIP'        : 'GZIP 压缩包',
			'kindBZIP'        : 'BZIP 压缩包',
			'kindXZ'          : 'XZ 压缩包',
			'kindZIP'         : 'ZIP 压缩包',
			'kindRAR'         : 'RAR 压缩包',
			'kindJAR'         : 'Java JAR 文件',
			'kindTTF'         : 'True Type 字体',
			'kindOTF'         : 'Open Type 字体',
			'kindRPM'         : 'RPM 包',
			// texts
			'kindText'        : '文本文件',
			'kindTextPlain'   : '纯文本',
			'kindPHP'         : 'PHP 源代码',
			'kindCSS'         : '层叠样式表(CSS)',
			'kindHTML'        : 'HTML 文档',
			'kindJS'          : 'Javascript 源代码',
			'kindRTF'         : '富文本格式(RTF)',
			'kindC'           : 'C 源代码',
			'kindCHeader'     : 'C 头文件',
			'kindCPP'         : 'C++ 源代码',
			'kindCPPHeader'   : 'C++ 头文件',
			'kindShell'       : 'Unix 外壳脚本',
			'kindPython'      : 'Python 源代码',
			'kindJava'        : 'Java 源代码',
			'kindRuby'        : 'Ruby 源代码',
			'kindPerl'        : 'Perl 源代码',
			'kindSQL'         : 'SQL 脚本',
			'kindXML'         : 'XML 文档',
			'kindAWK'         : 'AWK 源代码',
			'kindCSV'         : '逗号分隔值文件(CSV)',
			'kindDOCBOOK'     : 'Docbook XML 文档',
			'kindMarkdown'    : 'Markdown 文本', // added 20.7.2015
			// images
			'kindImage'       : '图片',
			'kindBMP'         : 'BMP 图片',
			'kindJPEG'        : 'JPEG 图片',
			'kindGIF'         : 'GIF 图片',
			'kindPNG'         : 'PNG 图片',
			'kindTIFF'        : 'TIFF 图片',
			'kindTGA'         : 'TGA 图片',
			'kindPSD'         : 'Adobe Photoshop 图片',
			'kindXBITMAP'     : 'X bitmap 图片',
			'kindPXM'         : 'Pixelmator 图片',
			// media
			'kindAudio'       : '音频',
			'kindAudioMPEG'   : 'MPEG 音频',
			'kindAudioMPEG4'  : 'MPEG-4 音频',
			'kindAudioMIDI'   : 'MIDI 音频',
			'kindAudioOGG'    : 'Ogg Vorbis 音频',
			'kindAudioWAV'    : 'WAV 音频',
			'AudioPlaylist'   : 'MP3 播放列表',
			'kindVideo'       : '视频',
			'kindVideoDV'     : 'DV 视频',
			'kindVideoMPEG'   : 'MPEG 视频',
			'kindVideoMPEG4'  : 'MPEG-4 视频',
			'kindVideoAVI'    : 'AVI 视频',
			'kindVideoMOV'    : 'Quick Time 视频',
			'kindVideoWM'     : 'Windows Media 视频',
			'kindVideoFlash'  : 'Flash 视频',
			'kindVideoMKV'    : 'Matroska 视频',
			'kindVideoOGG'    : 'Ogg 视频'
		}
	};
}));

js/i18n/elfinder.fo.js000064400000102062151215013360010466 0ustar00/**
 * Faroese translation
 * @author Marius Hammer <marius@vrg.fo>
 * @version 2022-03-01
 */
(function(root, factory) {
	if (typeof define === 'function' && define.amd) {
		define(['elfinder'], factory);
	} else if (typeof exports !== 'undefined') {
		module.exports = factory(require('elfinder'));
	} else {
		factory(root.elFinder);
	}
}(this, function(elFinder) {
	elFinder.prototype.i18.fo = {
		translator : 'Marius Hammer &lt;marius@vrg.fo&gt;',
		language   : 'Faroese',
		direction  : 'ltr',
		dateFormat : 'd.m.Y H:i', // will show like: 01.03.2022 11:44
		fancyDateFormat : '$1 H:i', // will show like: Í dag 11:44
		nonameDateFormat : 'ymd-His', // noname upload will show like: 220301-114438
		messages   : {
			'getShareText' : 'Deildu',
			'Editor ': 'Kóðaritill',
			/********************************** errors **********************************/
			'error'                : 'Villa íkomin',
			'errUnknown'           : 'Ókend villa.',
			'errUnknownCmd'        : 'Ókend boð.',
			'errJqui'              : 'Ógildig jQuery UI konfiguratión. Vælbærar, sum kunnu hálast runt og kunnu sleppast skulu takast við.',
			'errNode'              : 'elFinder krevur DOM Element stovna.',
			'errURL'               : 'Ugyldig elFinder konfiguration! URL stilling er ikki ásett.',
			'errAccess'            : 'Atgongd nokta.',
			'errConnect'           : 'Far ikki samband við backend.',
			'errAbort'             : 'Sambandi avbrotið.',
			'errTimeout'           : 'Sambandi broti av.',
			'errNotFound'          : 'Backend ikki funnið.',
			'errResponse'          : 'Ógildugt backend svar.',
			'errConf'              : 'Ógildugt backend konfiguratión.',
			'errJSON'              : 'PHP JSON modulið er ikki innstallera.',
			'errNoVolumes'         : 'Lesiligar mappur er ikki atkomulig.',
			'errCmdParams'         : 'Ógildigar stillingar fyri kommando "$1".',
			'errDataNotJSON'       : 'Dáta er ikki JSON.',
			'errDataEmpty'         : 'Dáta er tømt.',
			'errCmdReq'            : 'Backend krevur eitt kommando navn.',
			'errOpen'              : 'Kundi ikki opna "$1".',
			'errNotFolder'         : 'Luturin er ikki ein mappa.',
			'errNotFile'           : 'Luturin er ikki ein fíla.',
			'errRead'              : 'Kundi ikki lesa til "$1".',
			'errWrite'             : 'Kundi ikki skriva til "$1".',
			'errPerm'              : 'Atgongd nokta.',
			'errLocked'            : '"$1" er løst og kann ikki umdoybast, flytast ella strikast.',
			'errExists'            : 'Tað finst longu ein fíla við navn "$1".',
			'errInvName'           : 'Ógildugt fíla navn.',
			'errInvDirname'        : 'Ógilt nafn möppu.',  // from v2.1.24 added 12.4.2017
			'errFolderNotFound'    : 'Mappa ikki funnin.',
			'errFileNotFound'      : 'Fíla ikki funnin.',
			'errTrgFolderNotFound' : 'Mappan "$1" bleiv ikke funnin.',
			'errPopup'             : 'Kagin forðaði í at opna eitt popup-vindeyga. Fyri at opna fíluna, aktivera popup-vindeygu í tínum kaga stillingum.',
			'errMkdir'             : '\'Kundi ikki stovna mappu "$1".',
			'errMkfile'            : 'Kundi ikki stovna mappu "$1".',
			'errRename'            : 'Kundi ikki umdoyba "$1".',
			'errCopyFrom'          : 'Kopiering av fílum frá mappuni "$1" er ikke loyvt.',
			'errCopyTo'            : 'Kopiering av fílum til mappuna "$1" er ikke loyvt.',
			'errMkOutLink'         : 'Ikki ført fyri at stovna leinkju til uttanfyri \'volume\' rót.', // from v2.1 added 03.10.2015
			'errUpload'            : 'Innlegginar feilur.',  // old name - errUploadCommon
			'errUploadFile'        : 'Kundi ikki leggja "$1" inn.', // old name - errUpload
			'errUploadNoFiles'     : 'Ongar fílar funnir at leggja inn.',
			'errUploadTotalSize'   : 'Dátain er størri enn mest loyvda støddin.', // old name - errMaxSize
			'errUploadFileSize'    : 'Fíla er størri enn mest loyvda støddin.', //  old name - errFileMaxSize
			'errUploadMime'        : 'Fílu slag ikki góðkent.',
			'errUploadTransfer'    : '"$1" innleggingar feilur.',
			'errUploadTemp'        : 'Ikki ført fyri at gera fyribils fílu fyri innlegging.', // from v2.1 added 26.09.2015
			'errNotReplace'        : 'Lutur "$1" finst longu á hesum stað og can ikki skiftast út av lutið av øðrum slag.', // new
			'errReplace'           : 'Ikki ført fyri at erstattae "$1".',
			'errSave'              : 'Kundi ikki goyma "$1".',
			'errCopy'              : 'Kundi ikki kopiera "$1".',
			'errMove'              : 'Kundi ikki flyta "$1".',
			'errCopyInItself'      : 'Kundi ikki kopiera "$1" inn í seg sjálva.',
			'errRm'                : 'Kundi ikki strika "$1".',
			'errTrash'             : 'Ekki hægt að fara í ruslið.', // from v2.1.24 added 30.4.2017
			'errRmSrc'             : 'Ikki ført fyri at strika keldu fíla(r).',
			'errExtract'           : 'Kundi ikki útpakka fílar frá "$1".',
			'errArchive'           : 'Kundi ikki stovna arkiv.',
			'errArcType'           : 'Arkiv slagið er ikki stuðla.',
			'errNoArchive'         : 'Fílan er ikki eitt arkiv ella er ikki eitt stuðla arkiva slag.',
			'errCmdNoSupport'      : 'Backend stuðlar ikki hesi boð.',
			'errReplByChild'       : 'appan "$1" kann ikki erstattast av einari vøru, hon inniheldur.',
			'errArcSymlinks'       : 'Av trygdarávum grundum, noktaði skipanin at pakka út arkivir ið innihalda symlinks ella fílur við nøvn ið ikki eru loyvd.', // edited 24.06.2012
			'errArcMaxSize'        : 'Arkiv fílar fylla meir enn mest loyvda støddin.',
			'errResize'            : 'Kundi ikki broyta støddina á "$1".',
			'errResizeDegree'      : 'Ógildugt roterings stig.',  // added 7.3.2013
			'errResizeRotate'      : 'Ikki ført fyri at rotera mynd.',  // added 7.3.2013
			'errResizeSize'        : 'Ógildug myndastødd.',  // added 7.3.2013
			'errResizeNoChange'    : 'Mynda stødd ikki broytt.',  // added 7.3.2013
			'errUsupportType'      : 'Ikki stuðla fíla slag.',
			'errNotUTF8Content'    : 'Fílan "$1" er ikki í UTF-8 og kann ikki vera rættað.',  // added 9.11.2011
			'errNetMount'          : 'Kundi ikki "mounta" "$1".', // added 17.04.2012
			'errNetMountNoDriver'  : 'Ikki stuðla protokol.',     // added 17.04.2012
			'errNetMountFailed'    : 'Mount miseydnaðist.',         // added 17.04.2012
			'errNetMountHostReq'   : 'Host kravt.', // added 18.04.2012
			'errSessionExpires'    : 'Tín seta er útgingin vegna óvirkniy.',
			'errCreatingTempDir'   : 'Ikki ført fyri at stovna fyribils fíluskrá: "$1"',
			'errFtpDownloadFile'   : 'Ikki ført fyri at taka fílu niður frá FTP: "$1"',
			'errFtpUploadFile'     : 'Ikki ført fyri at leggja fílu til FTP: "$1"',
			'errFtpMkdir'          : 'Ikki ført fyri at stovna fjar-fílaskrá á FTP: "$1"',
			'errArchiveExec'       : 'Villa íkomin undir arkiveran af fílar: "$1"',
			'errExtractExec'       : 'Villa íkomin undir útpakking af fílum: "$1"',
			'errNetUnMount'        : 'Unable to unmount', // from v2.1 added 30.04.2012
			'errConvUTF8'          : 'Kann ikki broytast til UTF-8', // from v2.1 added 08.04.2014
			'errFolderUpload'      : 'Royn Google Chrome, um tú ynskir at leggja mappu innn.', // from v2.1 added 26.6.2015
			'errSearchTimeout'     : 'Tími rann út þegar leitað var að "$1". Leitarniðurstaða er að hluta.', // from v2.1 added 12.1.2016
			'errReauthRequire'     : 'Endurheimild er krafist.', // from v2.1.10 added 24.3.2016
			'errMaxTargets'        : 'Hámarksfjöldi vara sem hægt er að velja er $1.', // from v2.1.17 added 17.10.2016
			'errRestore'           : 'Ekki er hægt að endurheimta úr ruslinu. Ekki er hægt að bera kennsl á endurheimtunarstaðinn.', // from v2.1.24 added 3.5.2017
			'errEditorNotFound'    : 'Ritstjóri fannst ekki fyrir þessa skráartegund.', // from v2.1.25 added 23.5.2017
			'errServerError'       : 'Villa kom upp á þjóninum.', // from v2.1.25 added 16.6.2017
			'errEmpty'             : 'Ekki tókst að tæma möppuna "$1".', // from v2.1.25 added 22.6.2017
			'moreErrors'           : 'Það eru $1 villur í viðbót.', // from v2.1.44 added 9.12.2018
			'errMaxMkdirs'         : 'Þú getur búið til allt að $1 möppur í einu.', // from v2.1.58 added 20.6.2021

			/******************************* commands names ********************************/
			'cmdarchive'   : 'Stovna arkiv',
			'cmdback'      : 'Aftur\'',
			'cmdcopy'      : 'Kopier',
			'cmdcut'       : 'Klipp',
			'cmddownload'  : 'Tak niður',
			'cmdduplicate' : 'Tvífalda',
			'cmdedit'      : 'Rætta fílu',
			'cmdextract'   : 'Pakka út fílar úr arkiv',
			'cmdforward'   : 'Fram',
			'cmdgetfile'   : 'Vel fílar',
			'cmdhelp'      : 'Um hesa software',
			'cmdhome'      : 'Heim',
			'cmdinfo'      : 'Fá upplýsingar',
			'cmdmkdir'     : 'Nýggja mappu',
			'cmdmkdirin'   : 'Inn í nýja möppu', // from v2.1.7 added 19.2.2016
			'cmdmkfile'    : 'Nýggja fílu',
			'cmdopen'      : 'Opna',
			'cmdpaste'     : 'Set inn',
			'cmdquicklook' : 'Forsýning',
			'cmdreload'    : 'Les inn umaftur',
			'cmdrename'    : 'Umdoyp',
			'cmdrm'        : 'Strika',
			'cmdtrash'     : 'Í ruslið', //from v2.1.24 added 29.4.2017
			'cmdrestore'   : 'Endurheimta', //from v2.1.24 added 3.5.2017
			'cmdsearch'    : 'Finn fílar',
			'cmdup'        : 'Eitt stig upp',
			'cmdupload'    : 'Legg fílar inn',
			'cmdview'      : 'Síggj',
			'cmdresize'    : 'Tillaga stødd & Roter',
			'cmdsort'      : 'Raða',
			'cmdnetmount'  : 'Settu hljóðstyrk netkerfisins', // added 18.04.2012
			'cmdnetunmount': 'Aftengja', // from v2.1 added 30.04.2012
			'cmdplaces'    : 'Til støð', // added 28.12.2014
			'cmdchmod'     : 'Broytir stíl', // from v2.1 added 20.6.2015
			'cmdopendir'   : 'Opnaðu möppu', // from v2.1 added 13.1.2016
			'cmdcolwidth'  : 'Endurstilla dálkbreidd', // from v2.1.13 added 12.06.2016
			'cmdfullscreen': 'Fullur skjár', // from v2.1.15 added 03.08.2016
			'cmdmove'      : 'Færa', // from v2.1.15 added 21.08.2016
			'cmdempty'     : 'Tæmdu möppuna', // from v2.1.25 added 22.06.2017
			'cmdundo'      : 'Afturkalla', // from v2.1.27 added 31.07.2017
			'cmdredo'      : 'Gera aftur', // from v2.1.27 added 31.07.2017
			'cmdpreference': 'Kjörstillingar', // from v2.1.27 added 03.08.2017
			'cmdselectall' : 'Velja allt', // from v2.1.28 added 15.08.2017
			'cmdselectnone': 'Veldu ekkert', // from v2.1.28 added 15.08.2017
			'cmdselectinvert': 'Snúa vali við', // from v2.1.28 added 15.08.2017
			'cmdopennew'   : 'Opna í nýjum glugga', // from v2.1.38 added 3.4.2018
			'cmdhide'      : 'Fela (Preference)', // from v2.1.41 added 24.7.2018

			/*********************************** buttons ***********************************/
			'btnClose'  : 'Lat aftur',
			'btnSave'   : 'Goym',
			'btnRm'     : 'Strika',
			'btnApply'  : 'Brúka',
			'btnCancel' : 'Angra',
			'btnNo'     : 'Nei',
			'btnYes'    : 'Ja',
			'btnMount'  : 'Mount',  // added 18.04.2012
			'btnApprove': 'Farðu í $1 og samþykktu', // from v2.1 added 26.04.2012
			'btnUnmount': 'Aftengja', // from v2.1 added 30.04.2012
			'btnConv'   : 'Konverter', // from v2.1 added 08.04.2014
			'btnCwd'    : 'Her',      // from v2.1 added 22.5.2015
			'btnVolume' : 'Hljóðstyrkur',    // from v2.1 added 22.5.2015
			'btnAll'    : 'Øll',       // from v2.1 added 22.5.2015
			'btnMime'   : 'MIME Slag', // from v2.1 added 22.5.2015
			'btnFileName':'Fílunavn',  // from v2.1 added 22.5.2015
			'btnSaveClose': 'Goym & Lat aftur', // from v2.1 added 12.6.2015
			'btnBackup' : 'Öryggisafrit', // fromv2.1 added 28.11.2015
			'btnRename'    : 'Endurnefna',      // from v2.1.24 added 6.4.2017
			'btnRenameAll' : 'Endurnefna (Allt)', // from v2.1.24 added 6.4.2017
			'btnPrevious' : 'Fyrri ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnNext'     : 'Næst ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnSaveAs'   : 'Vista sem', // from v2.1.25 added 24.5.2017

			/******************************** notifications ********************************/
			'ntfopen'     : 'Opna mappu',
			'ntffile'     : '\'Opna fílu',
			'ntfreload'   : 'Les innaftur mappu innihald',
			'ntfmkdir'    : 'Stovnar mappu',
			'ntfmkfile'   : 'Stovnar fílur',
			'ntfrm'       : 'Strikar fílur',
			'ntfcopy'     : 'Kopierar fílur',
			'ntfmove'     : 'Flytur fílar',
			'ntfprepare'  : 'Ger klárt at kopiera fílar',
			'ntfrename'   : 'Umdoyp fílar',
			'ntfupload'   : 'Leggur inn fílar',
			'ntfdownload' : 'Tekur fílar niður',
			'ntfsave'     : 'Goymir fílar',
			'ntfarchive'  : 'Stovnar arkiv',
			'ntfextract'  : 'Útpakkar fílar frá arkiv',
			'ntfsearch'   : 'Leitar eftir fílum',
			'ntfresize'   : 'Broytir stødd á fílur',
			'ntfsmth'     : '\'Ger okkurt >_<',
			'ntfloadimg'  : 'Lesur mynd inn',
			'ntfnetmount' : 'Mounting network volume', // added 18.04.2012
			'ntfnetunmount': 'Unmounting network volume', // from v2.1 added 30.04.2012
			'ntfdim'      : 'Tekur mynda vídd', // added 20.05.2013
			'ntfreaddir'  : 'Lesur mappu upplýsingar', // from v2.1 added 01.07.2013
			'ntfurl'      : 'Far URL af leinkju', // from v2.1 added 11.03.2014
			'ntfchmod'    : 'Broyti fílu stíl', // from v2.1 added 20.6.2015
			'ntfpreupload': 'Kannar fílunavnið á fílu', // from v2.1 added 31.11.2015
			'ntfzipdl'    : 'Að búa til skrá til að sækja', // from v2.1.7 added 23.1.2016
			'ntfparents'  : 'Að sækja upplýsingar um slóð', // from v2.1.17 added 2.11.2016
			'ntfchunkmerge': 'Er að vinna úr skránni sem hlaðið var upp', // from v2.1.17 added 2.11.2016
			'ntftrash'    : 'Er að henda í ruslið', // from v2.1.24 added 2.5.2017
			'ntfrestore'  : 'Að gera endurheimt úr ruslinu', // from v2.1.24 added 3.5.2017
			'ntfchkdir'   : 'Athugar áfangamöppu', // from v2.1.24 added 3.5.2017
			'ntfundo'     : 'Afturkallar fyrri aðgerð', // from v2.1.27 added 31.07.2017
			'ntfredo'     : 'Endurgerir fyrra afturkallað', // from v2.1.27 added 31.07.2017
			'ntfchkcontent' : 'Athugun á innihaldi', // from v2.1.41 added 3.8.2018

			/*********************************** volumes *********************************/
			'volume_Trash' : 'Ruslið', //from v2.1.24 added 29.4.2017

			/************************************ dates **********************************/
			'dateUnknown' : 'ókent',
			'Today'       : 'Í dag',
			'Yesterday'   : 'Í gjár',
			'msJan'       : 'Jan',
			'msFeb'       : 'Feb',
			'msMar'       : 'Mar',
			'msApr'       : 'Apr',
			'msMay'       : 'Mai',
			'msJun'       : 'Jun',
			'msJul'       : 'Jul',
			'msAug'       : 'Aug',
			'msSep'       : 'Sep',
			'msOct'       : 'Okt',
			'msNov'       : 'Nov',
			'msDec'       : 'Des',
			'January'     : 'Januar',
			'February'    : 'Februar',
			'March'       : 'Mars',
			'April'       : 'Apríl',
			'May'         : 'Mai',
			'June'        : 'Juni',
			'July'        : 'Juli',
			'August'      : 'August',
			'September'   : 'September',
			'October'     : 'Oktober',
			'November'    : 'November',
			'December'    : 'Desember',
			'Sunday'      : 'Sunnudag',
			'Monday'      : 'Mánadag',
			'Tuesday'     : 'Týsdag',
			'Wednesday'   : 'Mikudag',
			'Thursday'    : 'Hósdag',
			'Friday'      : 'Fríggjadag',
			'Saturday'    : 'Leygardag',
			'Sun'         : 'Sun',
			'Mon'         : 'Mán',
			'Tue'         : 'Týs',
			'Wed'         : 'Mik',
			'Thu'         : 'Hós',
			'Fri'         : 'Frí',
			'Sat'         : 'Ley',

			/******************************** sort variants ********************************/
			'sortname'          : 'eftir navn',
			'sortkind'          : 'eftir slag',
			'sortsize'          : 'eftir stødd',
			'sortdate'          : 'eftir dato',
			'sortFoldersFirst'  : 'mappur fyrst',
			'sortperm'          : 'með leyfi', // from v2.1.13 added 13.06.2016
			'sortmode'          : 'eftir ham',       // from v2.1.13 added 13.06.2016
			'sortowner'         : 'eftir eiganda',      // from v2.1.13 added 13.06.2016
			'sortgroup'         : 'eftir hópi',      // from v2.1.13 added 13.06.2016
			'sortAlsoTreeview'  : 'Einnig Treeview',  // from v2.1.15 added 01.08.2016

			/********************************** new items **********************************/
			'untitled file.txt' : 'NýggjaFílu.txt', // added 10.11.2015
			'untitled folder'   : 'NýggjaMappu',   // added 10.11.2015
			'Archive'           : 'NýtArkiv',  // from v2.1 added 10.11.2015
			'untitled file'     : 'Nýskrá.$1',  // from v2.1.41 added 6.8.2018
			'extentionfile'     : '$1: Skrá',    // from v2.1.41 added 6.8.2018
			'extentiontype'     : '$1: $2',      // from v2.1.43 added 17.10.2018

			/********************************** messages **********************************/
			'confirmReq'      : 'Váttan kravd',
			'confirmRm'       : 'Ert tú vísur í at tú ynskir at strika fílarnar?<br/>Hetta kann ikki angrast!',
			'confirmRepl'     : 'Erstatta gomlu fílu við nýggja?',
			'confirmRest'     : 'Skipta út núverandi hlut með hlutnum í ruslinu?', // fromv2.1.24 added 5.5.2017
			'confirmConvUTF8' : 'Brúka á øll', // from v2.1 added 08.04.2014
			'confirmNonUTF8'  : 'Ekki var hægt að greina stafakóðun þessarar skráar. Það þarf að breyta tímabundið í UTF-8 til að breyta.<br/>Vinsamlegast veldu táknkóðun þessarar skráar.', // from v2.1.19 added 28.11.2016
			'confirmNotSave'  : 'Er blivi rættað.<br/>Missir sínar broytingar um tú ikki goymir.', // from v2.1 added 15.7.2015
			'confirmTrash'    : 'Ertu viss um að þú viljir færa hluti í ruslafötuna?', //from v2.1.24 added 29.4.2017
			'confirmMove'     : 'Ertu viss um að þú viljir færa hluti í "$1"?', //from v2.1.50 added 27.7.2019
			'apllyAll'        : 'Brúka til øll',
			'name'            : 'Navn',
			'size'            : 'Stødd',
			'perms'           : 'Rættindi',
			'modify'          : 'Rættað',
			'kind'            : 'Slag',
			'read'            : 'síggja',
			'write'           : 'broyta',
			'noaccess'        : 'onga atgongd',
			'and'             : 'og',
			'unknown'         : 'ókent',
			'selectall'       : 'Vel allar fílur',
			'selectfiles'     : 'Vel fílu(r)',
			'selectffile'     : 'Vel fyrstu fílu',
			'selectlfile'     : 'Vel síðstu fílu',
			'viewlist'        : 'Lista vísing',
			'viewicons'       : 'Ikon vísing',
			'viewSmall'       : 'Lítil tákn', // from v2.1.39 added 22.5.2018
			'viewMedium'      : 'Miðlungs tákn', // from v2.1.39 added 22.5.2018
			'viewLarge'       : 'Stór tákn', // from v2.1.39 added 22.5.2018
			'viewExtraLarge'  : 'Extra stór tákn', // from v2.1.39 added 22.5.2018
			'places'          : 'Støð',
			'calc'            : 'Rokna',
			'path'            : 'Stiga',
			'aliasfor'        : 'Hjánavn fyri',
			'locked'          : 'Læst',
			'dim'             : 'Vídd',
			'files'           : 'Fílur',
			'folders'         : 'Mappur',
			'items'           : 'Myndir',
			'yes'             : 'ja',
			'no'              : 'nei',
			'link'            : 'Leinkja',
			'searcresult'     : 'Leiti úrslit',
			'selected'        : 'valdar myndir',
			'about'           : 'Um',
			'shortcuts'       : 'Snarvegir',
			'help'            : 'Hjálp',
			'webfm'           : 'Web fílu umsitan',
			'ver'             : 'Útgáva',
			'protocolver'     : 'protokol versión',
			'homepage'        : 'Verkætlan heim',
			'docs'            : 'Skjalfesting',
			'github'          : 'Mynda okkum á Github',
			'twitter'         : 'Fylg okkum á twitter',
			'facebook'        : 'Fylg okkum á facebook',
			'team'            : 'Lið',
			'chiefdev'        : 'forritaleiðari',
			'developer'       : 'forritari',
			'contributor'     : 'stuðulsveitari',
			'maintainer'      : 'viðlíkahaldari',
			'translator'      : 'umsetari',
			'icons'           : 'Ikonir',
			'dontforget'      : 'og ekki gleyma að taka handklæðið þitt',
			'shortcutsof'     : 'Snarvegir sligi frá',
			'dropFiles'       : 'Slepp fílur her',
			'or'              : 'ella',
			'selectForUpload' : 'Vel fílur at leggja inn',
			'moveFiles'       : 'Flyt fílur',
			'copyFiles'       : 'Kopier fílur',
			'restoreFiles'    : 'Endurheimta hluti', // from v2.1.24 added 5.5.2017
			'rmFromPlaces'    : 'Flyt frá støð',
			'aspectRatio'     : 'Skermformat',
			'scale'           : 'Skalera',
			'width'           : 'Longd',
			'height'          : 'Hædd',
			'resize'          : 'Tilliga stødd',
			'crop'            : 'Sker til',
			'rotate'          : 'Rotera',
			'rotate-cw'       : 'Rotera 90 gradir við urið',
			'rotate-ccw'      : 'otera 90 gradir móti urið',
			'degree'          : '°',
			'netMountDialogTitle' : 'Settu hljóðstyrk netkerfisins', // added 18.04.2012
			'protocol'            : 'Protokol', // added 18.04.2012
			'host'                : 'Host', // added 18.04.2012
			'port'                : 'Port', // added 18.04.2012
			'user'                : 'Brúkari', // added 18.04.2012
			'pass'                : 'Loyniorð', // added 18.04.2012
			'confirmUnmount'      : 'Ertu að taka $1 af?',  // from v2.1 added 30.04.2012
			'dropFilesBrowser': 'Hála ella set innn fílar frá kaga', // from v2.1 added 30.05.2012
			'dropPasteFiles'  : 'Hála ella set inn fílar frá URls her', // from v2.1 added 07.04.2014
			'encoding'        : 'Encoding', // from v2.1 added 19.12.2014
			'locale'          : 'Tungumál',   // from v2.1 added 19.12.2014
			'searchTarget'    : 'skotmark: $1',                // from v2.1 added 22.5.2015
			'searchMime'      : 'Leita við input MIME Type', // from v2.1 added 22.5.2015
			'owner'           : 'Eigari', // from v2.1 added 20.6.2015
			'group'           : 'Bólkur', // from v2.1 added 20.6.2015
			'other'           : 'Annað', // from v2.1 added 20.6.2015
			'execute'         : 'Útfør', // from v2.1 added 20.6.2015
			'perm'            : 'Rættindi', // from v2.1 added 20.6.2015
			'mode'            : 'Mode', // from v2.1 added 20.6.2015
			'emptyFolder'     : 'Mappan er tóm', // from v2.1.6 added 30.12.2015
			'emptyFolderDrop' : 'Mappan er tóm\\Slepptu til að bæta við hlutum', // from v2.1.6 added 30.12.2015
			'emptyFolderLTap' : 'Mappan er tóm\\Langsmellið til að bæta við hlutum', // from v2.1.6 added 30.12.2015
			'quality'         : 'Gæði', // from v2.1.6 added 5.1.2016
			'autoSync'        : 'Sjálfvirk samstilling',  // from v2.1.6 added 10.1.2016
			'moveUp'          : 'Fara upp',  // from v2.1.6 added 18.1.2016
			'getLink'         : 'Fáðu slóð tengil', // from v2.1.7 added 9.2.2016
			'selectedItems'   : 'Valdir hlutir ($1)', // from v2.1.7 added 2.19.2016
			'folderId'        : 'Auðkenni möppu', // from v2.1.10 added 3.25.2016
			'offlineAccess'   : 'Leyfa aðgang án nettengingar', // from v2.1.10 added 3.25.2016
			'reAuth'          : 'Til að sannvotta aftur', // from v2.1.10 added 3.25.2016
			'nowLoading'      : 'Hleður núna...', // from v2.1.12 added 4.26.2016
			'openMulti'       : 'Opnaðu margar skrár', // from v2.1.12 added 5.14.2016
			'openMultiConfirm': 'Þú ert að reyna að opna $1 skrárnar. Ertu viss um að þú viljir opna í vafra?', // from v2.1.12 added 5.14.2016
			'emptySearch'     : 'Leitarniðurstöður eru tómar í leitarmarkmiði.', // from v2.1.12 added 5.16.2016
			'editingFile'     : 'Það er verið að breyta skrá.', // from v2.1.13 added 6.3.2016
			'hasSelected'     : 'Þú hefur valið $1 atriði.', // from v2.1.13 added 6.3.2016
			'hasClipboard'    : 'Þú ert með $1 atriði á klippiborðinu.', // from v2.1.13 added 6.3.2016
			'incSearchOnly'   : 'Stigvaxandi leit er aðeins frá núverandi skjá.', // from v2.1.13 added 6.30.2016
			'reinstate'       : 'Settu aftur inn', // from v2.1.15 added 3.8.2016
			'complete'        : '$1 lokið', // from v2.1.15 added 21.8.2016
			'contextmenu'     : 'Samhengisvalmynd', // from v2.1.15 added 9.9.2016
			'pageTurning'     : 'Blaðsnúningur', // from v2.1.15 added 10.9.2016
			'volumeRoots'     : 'Rætur bindi', // from v2.1.16 added 16.9.2016
			'reset'           : 'Endurstilla', // from v2.1.16 added 1.10.2016
			'bgcolor'         : 'Bakgrunns litur', // from v2.1.16 added 1.10.2016
			'colorPicker'     : 'Litaplokkari', // from v2.1.16 added 1.10.2016
			'8pxgrid'         : '8px Grid', // from v2.1.16 added 4.10.2016
			'enabled'         : 'Virkt', // from v2.1.16 added 4.10.2016
			'disabled'        : 'Öryrkjar', // from v2.1.16 added 4.10.2016
			'emptyIncSearch'  : 'Leitarniðurstöður eru tómar í núverandi yfirliti.\\AÝttu á [Enter] til að stækka leitarmarkmiðið.', // from v2.1.16 added 5.10.2016
			'emptyLetSearch'  : 'Fyrsta stafur leitarniðurstöður eru tómar í núverandi skjá.', // from v2.1.23 added 24.3.2017
			'textLabel'       : 'Texti merki', // from v2.1.17 added 13.10.2016
			'minsLeft'        : '$1 mín eftir', // from v2.1.17 added 13.11.2016
			'openAsEncoding'  : 'Opnaðu aftur með valinni kóðun', // from v2.1.19 added 2.12.2016
			'saveAsEncoding'  : 'Vistaðu með völdum kóðun', // from v2.1.19 added 2.12.2016
			'selectFolder'    : 'Veldu möppu', // from v2.1.20 added 13.12.2016
			'firstLetterSearch': 'Fyrsta stafs leit', // from v2.1.23 added 24.3.2017
			'presets'         : 'Forstillingar', // from v2.1.25 added 26.5.2017
			'tooManyToTrash'  : 'Það er of mikið af hlutum svo það má ekki fara í ruslið.', // from v2.1.25 added 9.6.2017
			'TextArea'        : 'TextArea', // from v2.1.25 added 14.6.2017
			'folderToEmpty'   : 'Tæmdu möppuna "$1".', // from v2.1.25 added 22.6.2017
			'filderIsEmpty'   : 'Það eru engin atriði í möppunni "$1".', // from v2.1.25 added 22.6.2017
			'preference'      : 'Preference', // from v2.1.26 added 28.6.2017
			'language'        : 'Tungumál', // from v2.1.26 added 28.6.2017
			'clearBrowserData': 'Uppstilltu stillingarnar sem vistaðar eru í þessum vafra', // from v2.1.26 added 28.6.2017
			'toolbarPref'     : 'Stillingar tækjastikunnar', // from v2.1.27 added 2.8.2017
			'charsLeft'       : '... $1 stafir eftir.',  // from v2.1.29 added 30.8.2017
			'linesLeft'       : '... $1 línur eftir.',  // from v2.1.52 added 16.1.2020
			'sum'             : 'Summa', // from v2.1.29 added 28.9.2017
			'roughFileSize'   : 'Gróf skráarstærð', // from v2.1.30 added 2.11.2017
			'autoFocusDialog' : 'Einbeittu þér að þætti gluggans með músinni',  // from v2.1.30 added 2.11.2017
			'select'          : 'Veljið', // from v2.1.30 added 23.11.2017
			'selectAction'    : 'Aðgerð þegar skrá er valin', // from v2.1.30 added 23.11.2017
			'useStoredEditor' : 'Opna með ritlinum sem notaður var síðast', // from v2.1.30 added 23.11.2017
			'selectinvert'    : 'Snúa vali við', // from v2.1.30 added 25.11.2017
			'renameMultiple'  : 'Ertu viss um að þú viljir endurnefna $1 valin atriði eins og $2?<br/>Ekki er hægt að afturkalla þetta!', // from v2.1.31 added 4.12.2017
			'batchRename'     : 'Endurnefna runu', // from v2.1.31 added 8.12.2017
			'plusNumber'      : '+ Númer', // from v2.1.31 added 8.12.2017
			'asPrefix'        : 'Bæta við forskeyti', // from v2.1.31 added 8.12.2017
			'asSuffix'        : 'Bæta við viðskeyti', // from v2.1.31 added 8.12.2017
			'changeExtention' : 'Breyta eftirnafn', // from v2.1.31 added 8.12.2017
			'columnPref'      : 'Dálkastillingar (listayfirlit)', // from v2.1.32 added 6.2.2018
			'reflectOnImmediate' : 'Allar breytingar birtast strax í skjalasafninu.', // from v2.1.33 added 2.3.2018
			'reflectOnUnmount'   : 'Allar breytingar munu ekki endurspeglast fyrr en aftengdu þetta hljóðstyrk.', // from v2.1.33 added 2.3.2018
			'unmountChildren' : 'Eftirfarandi bindi(r) sem sett voru á þetta bindi voru einnig afsett. Ertu viss um að taka það af?', // from v2.1.33 added 5.3.2018
			'selectionInfo'   : 'Upplýsingar um val', // from v2.1.33 added 7.3.2018
			'hashChecker'     : 'Reiknirit til að sýna skráarhash', // from v2.1.33 added 10.3.2018
			'infoItems'       : 'Upplýsingaatriði (upplýsingaborð fyrir val)', // from v2.1.38 added 28.3.2018
			'pressAgainToExit': 'Ýttu aftur til að hætta.', // from v2.1.38 added 1.4.2018
			'toolbar'         : 'Tækjastikan', // from v2.1.38 added 4.4.2018
			'workspace'       : 'Vinnurými', // from v2.1.38 added 4.4.2018
			'dialog'          : 'Dialog', // from v2.1.38 added 4.4.2018
			'all'             : 'Allt', // from v2.1.38 added 4.4.2018
			'iconSize'        : 'Táknstærð (táknskjár)', // from v2.1.39 added 7.5.2018
			'editorMaximized' : 'Opnaðu hámarks ritstjóragluggann', // from v2.1.40 added 30.6.2018
			'editorConvNoApi' : 'Vegna þess að umbreyting með API er ekki í boði eins og er, vinsamlegast umbreyttu á vefsíðunni.', //from v2.1.40 added 8.7.2018
			'editorConvNeedUpload' : 'Eftir umbreytingu verður þú að vera hlaðið upp með vefslóð hlutarins eða niðurhalðri skrá til að vista breyttu skrána.', //from v2.1.40 added 8.7.2018
			'convertOn'       : 'Umbreyttu á síðunni $1', // from v2.1.40 added 10.7.2018
			'integrations'    : 'Samþættingar', // from v2.1.40 added 11.7.2018
			'integrationWith' : 'Þessi elFinder hefur eftirfarandi ytri þjónustu samþætta. Vinsamlegast athugaðu notkunarskilmála, persónuverndarstefnu osfrv. áður en þú notar það.', // from v2.1.40 added 11.7.2018
			'showHidden'      : 'Sýndu falin atriði', // from v2.1.41 added 24.7.2018
			'hideHidden'      : 'Fela falin atriði', // from v2.1.41 added 24.7.2018
			'toggleHidden'    : 'Sýna/fela falin atriði', // from v2.1.41 added 24.7.2018
			'makefileTypes'   : 'Skráargerðir til að virkja með "Ný skrá"', // from v2.1.41 added 7.8.2018
			'typeOfTextfile'  : 'Tegund textaskráarinnar', // from v2.1.41 added 7.8.2018
			'add'             : 'Bæta við', // from v2.1.41 added 7.8.2018
			'theme'           : 'Þema', // from v2.1.43 added 19.10.2018
			'default'         : 'Sjálfgefna', // from v2.1.43 added 19.10.2018
			'description'     : 'Lýsing', // from v2.1.43 added 19.10.2018
			'website'         : 'Vefsíða', // from v2.1.43 added 19.10.2018
			'author'          : 'Höfundur', // from v2.1.43 added 19.10.2018
			'email'           : 'Tölvupóstur', // from v2.1.43 added 19.10.2018
			'license'         : 'Leyfi', // from v2.1.43 added 19.10.2018
			'exportToSave'    : 'Ekki er hægt að vista þetta atriði. Til að forðast að tapa breytingunum þarftu að flytja út á tölvuna þína.', // from v2.1.44 added 1.12.2018
			'dblclickToSelect': 'Tvísmelltu á skrána til að velja hana.', // from v2.1.47 added 22.1.2019
			'useFullscreen'   : 'Notaðu fullskjástillingu', // from v2.1.47 added 19.2.2019

			/********************************** mimetypes **********************************/
			'kindUnknown'     : 'Ókent',
			'kindRoot'        : 'Hljóðstyrksrót', // from v2.1.16 added 16.10.2016
			'kindFolder'      : 'Mappa',
			'kindSelects'     : 'Valmöguleikar', // from v2.1.29 added 29.8.2017
			'kindAlias'       : 'Hjánavn',
			'kindAliasBroken' : 'Óvirki hjánavn',
			// applications
			'kindApp'         : 'Applikatión',
			'kindPostscript'  : 'Postscript skjal',
			'kindMsOffice'    : 'Microsoft Office skjal',
			'kindMsWord'      : 'Microsoft Word skjal',
			'kindMsExcel'     : 'Microsoft Excel skjal',
			'kindMsPP'        : 'Microsoft Powerpoint framløga',
			'kindOO'          : 'Open Office skjal',
			'kindAppFlash'    : 'Flash applikatión',
			'kindPDF'         : 'Færanlegt skjalasnið (PDF)',
			'kindTorrent'     : 'Bittorrent fíla',
			'kind7z'          : '7z arkiv',
			'kindTAR'         : 'TAR arkiv',
			'kindGZIP'        : 'GZIP arkiv',
			'kindBZIP'        : 'BZIP arkiv',
			'kindXZ'          : 'XZ arkiv',
			'kindZIP'         : 'ZIP arkiv',
			'kindRAR'         : 'RAR arkiv',
			'kindJAR'         : 'Java JAR ffílaile',
			'kindTTF'         : 'True Type leturgerð',
			'kindOTF'         : 'Opnaðu leturgerð',
			'kindRPM'         : 'RPM pakki',
			// texts
			'kindText'        : 'Text skjal',
			'kindTextPlain'   : 'Reinur tekstur',
			'kindPHP'         : 'PHP kelda',
			'kindCSS'         : 'Cascading style sheet (CSS)',
			'kindHTML'        : 'HTML skjal',
			'kindJS'          : 'Javascript kelda',
			'kindRTF'         : 'Rich Text Format (RTF)',
			'kindC'           : 'C kelda',
			'kindCHeader'     : 'C header kelda',
			'kindCPP'         : 'C++ kelda',
			'kindCPPHeader'   : 'C++ header kelda',
			'kindShell'       : 'Unix skel handrit',
			'kindPython'      : 'Python kelda',
			'kindJava'        : 'Java kelda',
			'kindRuby'        : 'Ruby kelda',
			'kindPerl'        : 'Perl handrit',
			'kindSQL'         : 'SQL kelda',
			'kindXML'         : 'XML skjal',
			'kindAWK'         : 'AWK kelda',
			'kindCSV'         : 'Comma separated values (CSV)',
			'kindDOCBOOK'     : 'Docbook XML skjal',
			'kindMarkdown'    : 'Markdown texti', // added 20.7.2015
			// images
			'kindImage'       : 'Mynd',
			'kindBMP'         : 'BMP mynd',
			'kindJPEG'        : 'JPEG mynd',
			'kindGIF'         : 'GIF mynd',
			'kindPNG'         : 'PNG mynd',
			'kindTIFF'        : 'TIFF mynd',
			'kindTGA'         : 'TGA mynd',
			'kindPSD'         : 'Adobe Photoshop mynd',
			'kindXBITMAP'     : 'X bitmap mynd',
			'kindPXM'         : 'Pixelmator mynd',
			// media
			'kindAudio'       : 'Hljóðmiðlar',
			'kindAudioMPEG'   : 'MPEG ljóðfíla',
			'kindAudioMPEG4'  : 'MPEG-4 ljóðfíla',
			'kindAudioMIDI'   : 'MIDI ljóðfíla',
			'kindAudioOGG'    : 'Ogg Vorbis ljóðfíla',
			'kindAudioWAV'    : 'WAV ljóðfíla',
			'AudioPlaylist'   : 'MP3 playlisti',
			'kindVideo'       : 'Myndbandsmiðlar',
			'kindVideoDV'     : 'DV filmur',
			'kindVideoMPEG'   : 'MPEG filmur',
			'kindVideoMPEG4'  : 'MPEG-4 filmur',
			'kindVideoAVI'    : 'AVI filmur',
			'kindVideoMOV'    : 'Quick Time filmur',
			'kindVideoWM'     : 'Windows Media filmur',
			'kindVideoFlash'  : 'Flash filmur',
			'kindVideoMKV'    : 'Matroska filmur',
			'kindVideoOGG'    : 'Ogg filmur'
		}
	};
}));js/i18n/elfinder.hr.js000064400000102013151215013360010467 0ustar00/**
 * Croatian translation
 * @version 2022-03-01
 */
 (function(root, factory) {
	if (typeof define === 'function' && define.amd) {
		define(['elfinder'], factory);
	} else if (typeof exports !== 'undefined') {
		module.exports = factory(require('elfinder'));
	} else {
		factory(root.elFinder);
	}
}(this, function(elFinder) {
	elFinder.prototype.i18.hr = {
		translator : '',
		language   : 'Croatian',
		direction  : 'ltr',
		dateFormat : 'd.m.Y. H:i', // will show like: 01.03.2022. 18:44
		fancyDateFormat : '$1 H:i', // will show like: Danas 18:44
		nonameDateFormat : 'ymd-His', // noname upload will show like: 220301-184452
		messages   : {
			'getShareText' : 'Udio',
			'Editor ': 'Urednik koda',
			/********************************** errors **********************************/
			'error'                : 'Greška',
			'errUnknown'           : 'Nepoznata greška.',
			'errUnknownCmd'        : 'Nepoznata naredba.',
			'errJqui'              : 'Kriva jQuery UI konfiguracija. Selectable, draggable, i droppable komponente moraju biti uključene.',
			'errNode'              : 'elFinder zahtjeva DOM element da bi bio stvoren.',
			'errURL'               : 'Krivo konfiguriran elFinder. Opcija URL nije postavljena.',
			'errAccess'            : 'Zabranjen pristup.',
			'errConnect'           : 'Nije moguće spajanje na server.',
			'errAbort'             : 'Prekinuta veza.',
			'errTimeout'           : 'Veza je istekla.',
			'errNotFound'          : 'Server nije pronađen.',
			'errResponse'          : 'Krivi odgovor servera.',
			'errConf'              : 'Krivo konfiguriran server',
			'errJSON'              : 'Nije instaliran PHP JSON modul.',
			'errNoVolumes'         : 'Disk nije dostupan.',
			'errCmdParams'         : 'Krivi parametri za naredbu "$1".',
			'errDataNotJSON'       : 'Podaci nisu tipa JSON.',
			'errDataEmpty'         : 'Nema podataka.',
			'errCmdReq'            : 'Pozadinski zahtjev zahtijeva naziv naredbe.',
			'errOpen'              : 'Ne mogu otvoriti "$1".',
			'errNotFolder'         : 'Objekt nije mapa.',
			'errNotFile'           : 'Objekt nije dokument.',
			'errRead'              : 'Ne mogu pročitati "$1".',
			'errWrite'             : 'Ne mogu pisati u "$1".',
			'errPerm'              : 'Pristup zabranjen',
			'errLocked'            : '"$1" je zaključan i ne može biti preimenovan, premješten ili obrisan.',
			'errExists'            : 'Dokument s imenom "$1" već postoji.',
			'errInvName'           : 'Krivo ime dokumenta',
			'errInvDirname'        : 'Nevažeći naziv mape.',  // from v2.1.24 added 12.4.2017
			'errFolderNotFound'    : 'Mapa nije pronađena',
			'errFileNotFound'      : 'Dokument nije pronađen',
			'errTrgFolderNotFound' : 'Mapa "$1" nije pronađena',
			'errPopup'             : 'Preglednik je spriječio otvaranje skočnog prozora. Da biste otvorili datoteku, omogućite je u opcijama preglednika.',
			'errMkdir'             : 'Ne mogu napraviti mapu "$1".',
			'errMkfile'            : 'Ne mogu napraviti dokument "$1".',
			'errRename'            : 'Ne mogu preimenovati "$1".',
			'errCopyFrom'          : 'Kopiranje s diska "$1" nije dozvoljeno.',
			'errCopyTo'            : 'Kopiranje na disk "$1" nije dozvoljeno.',
			'errMkOutLink'         : 'Nije moguće stvoriti vezu na izvan korijena volumena.', // from v2.1 added 03.10.2015
			'errUpload'            : 'Greška pri prebacivanju dokumenta na server.',  // old name - errUploadCommon
			'errUploadFile'        : 'Ne mogu prebaciti "$1" na server', // old name - errUpload
			'errUploadNoFiles'     : 'Nema dokumenata za prebacivanje na server',
			'errUploadTotalSize'   : 'Dokumenti prelaze maksimalnu dopuštenu veličinu.', // old name - errMaxSize
			'errUploadFileSize'    : 'Dokument je prevelik.', //  old name - errFileMaxSize
			'errUploadMime'        : 'Ovaj tip dokumenta nije dopušten.',
			'errUploadTransfer'    : '"$1" greška pri prebacivanju',
			'errUploadTemp'        : 'Ne mogu napraviti privremeni dokument za prijenos na server', // from v2.1 added 26.09.2015
			'errNotReplace'        : 'Objekt "$1" već postoji na ovoj lokaciji i ne može se zamijeniti objektom druge vrste.', // new
			'errReplace'           : 'Ne mogu zamijeniti "$1".',
			'errSave'              : 'Ne mogu spremiti "$1".',
			'errCopy'              : 'Ne mogu kopirati "$1".',
			'errMove'              : 'Ne mogu premjestiti "$1".',
			'errCopyInItself'      : 'Ne mogu kopirati "$1" na isto mjesto.',
			'errRm'                : 'Ne mogu ukloniti "$1".',
			'errTrash'             : 'Nije moguće u smeće.', // from v2.1.24 added 30.4.2017
			'errRmSrc'             : 'Ne mogu ukloniti izvorni kod.',
			'errExtract'           : 'Nije moguće izdvojiti datoteke iz "$1".',
			'errArchive'           : 'Nije moguće stvoriti arhivu.',
			'errArcType'           : 'Nepodržana vrsta arhive.',
			'errNoArchive'         : 'Datoteka nije arhivska ili ima nepodržanu vrstu arhive.',
			'errCmdNoSupport'      : 'Backend ne podržava ovu naredbu.',
			'errReplByChild'       : 'Mapa "$1" ne može se zamijeniti stavkom koju sadrži.',
			'errArcSymlinks'       : 'Iz sigurnosnih razloga odbijeno raspakiranje arhive sadrži simbolične veze ili datoteke s nedopuštenim nazivima.', // edited 24.06.2012
			'errArcMaxSize'        : 'Arhivske datoteke premašuju maksimalnu dopuštenu veličinu.',
			'errResize'            : 'Nije moguće promijeniti veličinu "$1".',
			'errResizeDegree'      : 'Neispravan stupanj rotacije.',  // added 7.3.2013
			'errResizeRotate'      : 'Nije moguće rotirati sliku.',  // added 7.3.2013
			'errResizeSize'        : 'Nevažeća veličina slike.',  // added 7.3.2013
			'errResizeNoChange'    : 'Veličina slike nije promijenjena.',  // added 7.3.2013
			'errUsupportType'      : 'Nepodržana vrsta datoteke.',
			'errNotUTF8Content'    : 'Datoteka "$1" nije u UTF-8 i ne može se uređivati.',  // added 9.11.2011
			'errNetMount'          : 'Nije moguće montirati "$1".', // added 17.04.2012
			'errNetMountNoDriver'  : 'Nepodržani protokol.',     // added 17.04.2012
			'errNetMountFailed'    : 'Montiranje nije uspjelo.',         // added 17.04.2012
			'errNetMountHostReq'   : 'Potreban host.', // added 18.04.2012
			'errSessionExpires'    : 'Vaša sesija je istekla zbog neaktivnosti.',
			'errCreatingTempDir'   : 'Nije moguće stvoriti privremeni direktorij: "$1"',
			'errFtpDownloadFile'   : 'Nije moguće preuzeti datoteku s FTP-a: "$1"',
			'errFtpUploadFile'     : 'Nije moguće prenijeti datoteku na FTP: "$1"',
			'errFtpMkdir'          : 'Nije moguće stvoriti udaljeni direktorij na FTP-u: "$1"',
			'errArchiveExec'       : 'Pogreška pri arhiviranju datoteka: "$1"',
			'errExtractExec'       : 'Pogreška prilikom izdvajanja datoteka: "$1"',
			'errNetUnMount'        : 'Unable to unmount', // from v2.1 added 30.04.2012
			'errConvUTF8'          : 'Nije konvertibilno u UTF-8', // from v2.1 added 08.04.2014
			'errFolderUpload'      : 'Isprobajte Google Chrome, ako želite prenijeti mapu.', // from v2.1 added 26.6.2015
			'errSearchTimeout'     : 'Isteklo je vrijeme tijekom pretraživanja "$1". Rezultat pretraživanja je djelomičan.', // from v2.1 added 12.1.2016
			'errReauthRequire'     : 'Potrebna je ponovna autorizacija.', // from v2.1.10 added 24.3.2016
			'errMaxTargets'        : 'Maksimalni broj stavki koje se mogu odabrati je $1.', // from v2.1.17 added 17.10.2016
			'errRestore'           : 'Nije moguće vratiti iz smeća. Nije moguće identificirati odredište vraćanja.', // from v2.1.24 added 3.5.2017
			'errEditorNotFound'    : 'Urednik nije pronađen za ovu vrstu datoteke.', // from v2.1.25 added 23.5.2017
			'errServerError'       : 'Pogreška se dogodila na strani poslužitelja.', // from v2.1.25 added 16.6.2017
			'errEmpty'             : 'Nije moguće isprazniti mapu "$1".', // from v2.1.25 added 22.6.2017
			'moreErrors'           : 'Postoji još $1 pogreške.', // from v2.1.44 added 9.12.2018
			'errMaxMkdirs'         : 'Možete stvoriti do $1 mape odjednom.', // from v2.1.58 added 20.6.2021

			/******************************* commands names ********************************/
			'cmdarchive'   : 'Arhiviraj',
			'cmdback'      : 'Nazad',
			'cmdcopy'      : 'Kopiraj',
			'cmdcut'       : 'Izreži',
			'cmddownload'  : 'Preuzmi',
			'cmdduplicate' : 'Dupliciraj',
			'cmdedit'      : 'Uredi dokument',
			'cmdextract'   : 'Raspakiraj arhivu',
			'cmdforward'   : 'Naprijed',
			'cmdgetfile'   : 'Odaberi dokumente',
			'cmdhelp'      : 'O programu',
			'cmdhome'      : 'Početak',
			'cmdinfo'      : 'Info',
			'cmdmkdir'     : 'Nova mapa',
			'cmdmkdirin'   : 'U novu mapu', // from v2.1.7 added 19.2.2016
			'cmdmkfile'    : 'Nova файл',
			'cmdopen'      : 'Otvori',
			'cmdpaste'     : 'Zalijepi',
			'cmdquicklook' : 'Pregled',
			'cmdreload'    : 'Ponovo učitaj',
			'cmdrename'    : 'Preimenuj',
			'cmdrm'        : 'Obriši',
			'cmdtrash'     : 'U smeće', //from v2.1.24 added 29.4.2017
			'cmdrestore'   : 'Obnovi', //from v2.1.24 added 3.5.2017
			'cmdsearch'    : 'Pronađi',
			'cmdup'        : 'Roditeljska mapa',
			'cmdupload'    : 'Prebaci dokumente na server',
			'cmdview'      : 'Pregledaj',
			'cmdresize'    : 'Promjeni veličinu i rotiraj',
			'cmdsort'      : 'Sortiraj',
			'cmdnetmount'  : 'Spoji se na mrežni disk', // added 18.04.2012
			'cmdnetunmount': 'Odspoji disk', // from v2.1 added 30.04.2012
			'cmdplaces'    : 'Na Mjesta', // added 28.12.2014
			'cmdchmod'     : 'Promijenite način rada', // from v2.1 added 20.6.2015
			'cmdopendir'   : 'Otvori mapu', // from v2.1 added 13.1.2016
			'cmdcolwidth'  : 'Ponovno postavite širinu stupca', // from v2.1.13 added 12.06.2016
			'cmdfullscreen': 'Puni zaslon', // from v2.1.15 added 03.08.2016
			'cmdmove'      : 'Potez', // from v2.1.15 added 21.08.2016
			'cmdempty'     : 'Ispraznite mapu', // from v2.1.25 added 22.06.2017
			'cmdundo'      : 'Poništi', // from v2.1.27 added 31.07.2017
			'cmdredo'      : 'ponovo uraditi', // from v2.1.27 added 31.07.2017
			'cmdpreference': 'Preferences', // from v2.1.27 added 03.08.2017
			'cmdselectall' : 'Odaberi sve', // from v2.1.28 added 15.08.2017
			'cmdselectnone': 'Odaberi nijednu', // from v2.1.28 added 15.08.2017
			'cmdselectinvert': 'Obrni odabir', // from v2.1.28 added 15.08.2017
			'cmdopennew'   : 'Otvori u novom prozoru', // from v2.1.38 added 3.4.2018
			'cmdhide'      : 'Sakrij (preference)', // from v2.1.41 added 24.7.2018

			/*********************************** buttons ***********************************/
			'btnClose'  : 'Zatvori',
			'btnSave'   : 'Spremi',
			'btnRm'     : 'Ukloni',
			'btnApply'  : 'Primjeni',
			'btnCancel' : 'Odustani',
			'btnNo'     : 'Ne',
			'btnYes'    : 'Da',
			'btnMount'  : 'Montirajte',  // added 18.04.2012
			'btnApprove': 'Idi na $1 i odobri', // from v2.1 added 26.04.2012
			'btnUnmount': 'Unmount', // from v2.1 added 30.04.2012
			'btnConv'   : 'Pretvoriti', // from v2.1 added 08.04.2014
			'btnCwd'    : 'Ovdje',      // from v2.1 added 22.5.2015
			'btnVolume' : 'Volumen',    // from v2.1 added 22.5.2015
			'btnAll'    : 'svi',       // from v2.1 added 22.5.2015
			'btnMime'   : 'MIME vrsta', // from v2.1 added 22.5.2015
			'btnFileName':'Naziv datoteke',  // from v2.1 added 22.5.2015
			'btnSaveClose': 'Spremi i zatvori', // from v2.1 added 12.6.2015
			'btnBackup' : 'Sigurnosna kopija', // fromv2.1 added 28.11.2015
			'btnRename'    : 'Preimenovati',      // from v2.1.24 added 6.4.2017
			'btnRenameAll' : 'Preimenuj (sve)', // from v2.1.24 added 6.4.2017
			'btnPrevious' : 'Prethodno ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnNext'     : 'Sljedeće ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnSaveAs'   : 'Spremi kao', // from v2.1.25 added 24.5.2017

			/******************************** notifications ********************************/
			'ntfopen'     : 'Otvori mapu',
			'ntffile'     : 'Otvori dokument',
			'ntfreload'   : 'Ponovo učitaj sadržaj mape',
			'ntfmkdir'    : 'Radim mapu',
			'ntfmkfile'   : 'Radim dokumente',
			'ntfrm'       : 'Brišem dokumente',
			'ntfcopy'     : 'Kopiram dokumente',
			'ntfmove'     : 'Mičem dokumente',
			'ntfprepare'  : 'Priprema za kopiranje dokumenata',
			'ntfrename'   : 'Preimenuj dokumente',
			'ntfupload'   : 'Pohranjujem dokumente na server',
			'ntfdownload' : 'Preuzimam dokumente',
			'ntfsave'     : 'Spremi dokumente',
			'ntfarchive'  : 'Radim arhivu',
			'ntfextract'  : 'Ekstrahiranje datoteka iz arhive',
			'ntfsearch'   : 'Tražim dokumente',
			'ntfresize'   : 'Promjena veličine slika',
			'ntfsmth'     : 'Nešto radeći',
			'ntfloadimg'  : 'Učitavam sliku',
			'ntfnetmount' : 'Mounting network volume', // added 18.04.2012
			'ntfnetunmount': 'Unmounting network volume', // from v2.1 added 30.04.2012
			'ntfdim'      : 'Stjecanje dimenzije slike', // added 20.05.2013
			'ntfreaddir'  : 'Čitanje podataka mape', // from v2.1 added 01.07.2013
			'ntfurl'      : 'Dobivanje URL-a linka', // from v2.1 added 11.03.2014
			'ntfchmod'    : 'Promjena načina rada datoteke', // from v2.1 added 20.6.2015
			'ntfpreupload': 'Provjera naziva datoteke za prijenos', // from v2.1 added 31.11.2015
			'ntfzipdl'    : 'Izrada datoteke za preuzimanje', // from v2.1.7 added 23.1.2016
			'ntfparents'  : 'Dobivanje informacija o putu', // from v2.1.17 added 2.11.2016
			'ntfchunkmerge': 'Obrada učitane datoteke', // from v2.1.17 added 2.11.2016
			'ntftrash'    : 'Bacam u smeće', // from v2.1.24 added 2.5.2017
			'ntfrestore'  : 'Vršim obnavljanje iz smeća', // from v2.1.24 added 3.5.2017
			'ntfchkdir'   : 'Provjera odredišne mape', // from v2.1.24 added 3.5.2017
			'ntfundo'     : 'Poništavanje prethodne operacije', // from v2.1.27 added 31.07.2017
			'ntfredo'     : 'Redoing previous undone', // from v2.1.27 added 31.07.2017
			'ntfchkcontent' : 'Provjera sadržaja', // from v2.1.41 added 3.8.2018

			/*********************************** volumes *********************************/
			'volume_Trash' : 'Otpad', //from v2.1.24 added 29.4.2017

			/************************************ dates **********************************/
			'dateUnknown' : 'nepoznato',
			'Today'       : 'Danas',
			'Yesterday'   : 'Jučer',
			'msJan'       : 'Sij',
			'msFeb'       : 'Vel',
			'msMar'       : 'Ožu',
			'msApr'       : 'Tra',
			'msMay'       : 'Svi',
			'msJun'       : 'Lip',
			'msJul'       : 'Srp',
			'msAug'       : 'Kol',
			'msSep'       : 'Ruj',
			'msOct'       : 'Lis',
			'msNov'       : 'Stu',
			'msDec'       : 'Pro',
			'January'     : 'Siječanj',
			'February'    : 'Veljača',
			'March'       : 'Ožujak',
			'April'       : 'Travanj',
			'May'         : 'Svibanj',
			'June'        : 'Lipanj',
			'July'        : 'Srpanj',
			'August'      : 'Kolovoz',
			'September'   : 'Rujan',
			'October'     : 'Listopad',
			'November'    : 'Studeni',
			'December'    : 'Prosinac',
			'Sunday'      : 'Nedjelja',
			'Monday'      : 'Ponedjeljak',
			'Tuesday'     : 'Utorak',
			'Wednesday'   : 'Srijeda',
			'Thursday'    : 'Četvrtak',
			'Friday'      : 'Petak',
			'Saturday'    : 'Subota',
			'Sun'         : 'Ned',
			'Mon'         : 'Pon',
			'Tue'         : 'Uto',
			'Wed'         : 'Sri',
			'Thu'         : 'Čet',
			'Fri'         : 'Pet',
			'Sat'         : 'Sub',

			/******************************** sort variants ********************************/
			'sortname'          : 'po imenu',
			'sortkind'          : 'po tipu',
			'sortsize'          : 'po veličini',
			'sortdate'          : 'po datumu',
			'sortFoldersFirst'  : 'Prvo mape',
			'sortperm'          : 'po dopuštenju', // from v2.1.13 added 13.06.2016
			'sortmode'          : 'po načinu rada',       // from v2.1.13 added 13.06.2016
			'sortowner'         : 'od strane vlasnika',      // from v2.1.13 added 13.06.2016
			'sortgroup'         : 'po grupi',      // from v2.1.13 added 13.06.2016
			'sortAlsoTreeview'  : 'Također Treeview',  // from v2.1.15 added 01.08.2016

			/********************************** new items **********************************/
			'untitled file.txt' : 'NoviDokument.txt', // added 10.11.2015
			'untitled folder'   : 'NovaMapa',   // added 10.11.2015
			'Archive'           : 'NovaArhiva',  // from v2.1 added 10.11.2015
			'untitled file'     : 'Nova datoteka.$1',  // from v2.1.41 added 6.8.2018
			'extentionfile'     : '$1: Datoteka',    // from v2.1.41 added 6.8.2018
			'extentiontype'     : '$1: $2',      // from v2.1.43 added 17.10.2018

			/********************************** messages **********************************/
			'confirmReq'      : 'Potvrda',
			'confirmRm'       : 'Jeste li sigurni?',
			'confirmRepl'     : 'Zamijeni stare dokumente novima?',
			'confirmRest'     : 'Zamijeniti postojeću stavku stavkom u smeću?', // fromv2.1.24 added 5.5.2017
			'confirmConvUTF8' : 'Nije u UTF-8<br/>Pretvoriti u UTF-8?<br/>Sadržaj postaje UTF-8 spremanjem nakon pretvorbe.', // from v2.1 added 08.04.2014
			'confirmNonUTF8'  : 'Nije bilo moguće otkriti kodiranje znakova ove datoteke. Mora se privremeno pretvoriti u UTF-8 radi uređivanja.<br/>Odaberite kodiranje znakova ove datoteke.', // from v2.1.19 added 28.11.2016
			'confirmNotSave'  : 'Promijenjen je.<br/>Gubi se posao ako ne spremite promjene.', // from v2.1 added 15.7.2015
			'confirmTrash'    : 'Jeste li sigurni da želite premjestiti stavke u koš za smeće?', //from v2.1.24 added 29.4.2017
			'confirmMove'     : 'Jeste li sigurni da želite premjestiti stavke u "$1"?', //from v2.1.50 added 27.7.2019
			'apllyAll'        : 'Primjeni na sve ',
			'name'            : 'Ime',
			'size'            : 'Veličina',
			'perms'           : 'Dozvole',
			'modify'          : 'Modificiran',
			'kind'            : 'Tip',
			'read'            : 'čitanje',
			'write'           : 'pisanje',
			'noaccess'        : 'bez pristupa',
			'and'             : 'i',
			'unknown'         : 'nepoznato',
			'selectall'       : 'Odaberi sve',
			'selectfiles'     : 'Odaberi dokument(e)',
			'selectffile'     : 'Odaberi prvi dokument',
			'selectlfile'     : 'Odaberi zadnji dokument',
			'viewlist'        : 'Lista',
			'viewicons'       : 'Ikone',
			'viewSmall'       : 'Male ikone', // from v2.1.39 added 22.5.2018
			'viewMedium'      : 'Srednje ikone', // from v2.1.39 added 22.5.2018
			'viewLarge'       : 'Velike ikone', // from v2.1.39 added 22.5.2018
			'viewExtraLarge'  : 'Ekstra velike ikone', // from v2.1.39 added 22.5.2018
			'places'          : 'Mjesta',
			'calc'            : 'Računaj',
			'path'            : 'Put',
			'aliasfor'        : 'Drugo ime za',
			'locked'          : 'Zaključano',
			'dim'             : 'Dimenzije',
			'files'           : 'Dokumenti',
			'folders'         : 'Mape',
			'items'           : 'Stavke',
			'yes'             : 'da',
			'no'              : 'ne',
			'link'            : 'poveznica',
			'searcresult'     : 'Rezultati pretrage',
			'selected'        : 'odabrane stavke',
			'about'           : 'Info',
			'shortcuts'       : 'Prečaci',
			'help'            : 'Pomoć',
			'webfm'           : 'Web upravitelj datoteka',
			'ver'             : 'Verzija',
			'protocolver'     : 'verzija protokola',
			'homepage'        : 'Projektni dom',
			'docs'            : 'Dokumentacija',
			'github'          : 'Fork us on Github',
			'twitter'         : 'Follow us on twitter',
			'facebook'        : 'Join us on facebook',
			'team'            : 'Tim',
			'chiefdev'        : 'glavni developer',
			'developer'       : 'razvojni programer',
			'contributor'     : 'doprinositelj',
			'maintainer'      : 'održavatelj',
			'translator'      : 'prevoditelj',
			'icons'           : 'Ikone',
			'dontforget'      : 'i ne zaboravi uzeti svoj ručnik',
			'shortcutsof'     : 'Prečaci isključeni',
			'dropFiles'       : 'Ovdje ispusti dokumente',
			'or'              : 'ili',
			'selectForUpload' : 'Odaberi dokumente koje prebacuješ na server',
			'moveFiles'       : 'Premjesti dokumente',
			'copyFiles'       : 'Kopiraj dokumente',
			'restoreFiles'    : 'Vrati stavke', // from v2.1.24 added 5.5.2017
			'rmFromPlaces'    : 'Uklonite s mjesta',
			'aspectRatio'     : 'Omjer stranica',
			'scale'           : 'Skaliraj',
			'width'           : 'Širina',
			'height'          : 'Visina',
			'resize'          : 'Promjena veličine',
			'crop'            : 'Usjev',
			'rotate'          : 'Rotirati',
			'rotate-cw'       : 'Rotirajte za 90 stupnjeva CW',
			'rotate-ccw'      : 'Rotirajte za 90 stupnjeva u smjeru suprotnom od smjera desno',
			'degree'          : '°',
			'netMountDialogTitle' : 'Montirajte mrežni volumen', // added 18.04.2012
			'protocol'            : 'Protokol', // added 18.04.2012
			'host'                : 'Domaćin', // added 18.04.2012
			'port'                : 'Luka', // added 18.04.2012
			'user'                : 'Korisnik', // added 18.04.2012
			'pass'                : 'Zaporka', // added 18.04.2012
			'confirmUnmount'      : 'Jeste li isključili $1?',  // from v2.1 added 30.04.2012
			'dropFilesBrowser': 'Ispustite ili zalijepite datoteke iz preglednika', // from v2.1 added 30.05.2012
			'dropPasteFiles'  : 'Ovdje ispustite ili zalijepite datoteke i URL-ove', // from v2.1 added 07.04.2014
			'encoding'        : 'Encoding', // from v2.1 added 19.12.2014
			'locale'          : 'Jezik',   // from v2.1 added 19.12.2014
			'searchTarget'    : 'Cilj: $1',                // from v2.1 added 22.5.2015
			'searchMime'      : 'Pretraživanje po MIME vrsti unosa', // from v2.1 added 22.5.2015
			'owner'           : 'Vlasnik', // from v2.1 added 20.6.2015
			'group'           : 'Grupa', // from v2.1 added 20.6.2015
			'other'           : 'Other', // from v2.1 added 20.6.2015
			'execute'         : 'Izvrši', // from v2.1 added 20.6.2015
			'perm'            : 'Dozvole', // from v2.1 added 20.6.2015
			'mode'            : 'Mode', // from v2.1 added 20.6.2015
			'emptyFolder'     : 'Mapa je prazna', // from v2.1.6 added 30.12.2015
			'emptyFolderDrop' : 'Mapa je prazna\\A Dovuci dokumente koje želiš dodati', // from v2.1.6 added 30.12.2015
			'emptyFolderLTap' : 'Mapa je prazna\\A Pritisni dugo za dodavanje dokumenata', // from v2.1.6 added 30.12.2015
			'quality'         : 'Kvaliteta', // from v2.1.6 added 5.1.2016
			'autoSync'        : 'Automatska sinkronizacija',  // from v2.1.6 added 10.1.2016
			'moveUp'          : 'Gore',  // from v2.1.6 added 18.1.2016
			'getLink'         : 'Nabavite URL vezu', // from v2.1.7 added 9.2.2016
			'selectedItems'   : 'Odabrane stavke ($1)', // from v2.1.7 added 2.19.2016
			'folderId'        : 'ID foldera', // from v2.1.10 added 3.25.2016
			'offlineAccess'   : 'Dopustite izvanmrežni pristup', // from v2.1.10 added 3.25.2016
			'reAuth'          : 'Za ponovnu provjeru autentičnosti', // from v2.1.10 added 3.25.2016
			'nowLoading'      : 'Učitava se...', // from v2.1.12 added 4.26.2016
			'openMulti'       : 'Otvorite više datoteka', // from v2.1.12 added 5.14.2016
			'openMultiConfirm': 'Pokušavate otvoriti $1 datoteke. Jeste li sigurni da želite otvoriti u pregledniku?', // from v2.1.12 added 5.14.2016
			'emptySearch'     : 'Rezultati pretraživanja su prazni u cilju pretraživanja.', // from v2.1.12 added 5.16.2016
			'editingFile'     : 'Uređuje datoteku.', // from v2.1.13 added 6.3.2016
			'hasSelected'     : 'Odabrali ste $1 stavke.', // from v2.1.13 added 6.3.2016
			'hasClipboard'    : 'Imate $1 stavke u međuspremniku.', // from v2.1.13 added 6.3.2016
			'incSearchOnly'   : 'Inkrementalno pretraživanje je samo iz trenutnog prikaza.', // from v2.1.13 added 6.30.2016
			'reinstate'       : 'Vratite u funkciju', // from v2.1.15 added 3.8.2016
			'complete'        : '$1 završeno', // from v2.1.15 added 21.8.2016
			'contextmenu'     : 'Kontekstni izbornik', // from v2.1.15 added 9.9.2016
			'pageTurning'     : 'Okretanje stranice', // from v2.1.15 added 10.9.2016
			'volumeRoots'     : 'Korijeni volumena', // from v2.1.16 added 16.9.2016
			'reset'           : 'Resetiraj', // from v2.1.16 added 1.10.2016
			'bgcolor'         : 'Boja pozadine', // from v2.1.16 added 1.10.2016
			'colorPicker'     : 'Birač boja', // from v2.1.16 added 1.10.2016
			'8pxgrid'         : 'Mreža od 8px', // from v2.1.16 added 4.10.2016
			'enabled'         : 'Omogućeno', // from v2.1.16 added 4.10.2016
			'disabled'        : 'Onemogućeno', // from v2.1.16 added 4.10.2016
			'emptyIncSearch'  : 'Rezultati pretraživanja su prazni u trenutnom prikazu.\\APritisnite [Enter] za proširenje cilja pretraživanja.', // from v2.1.16 added 5.10.2016
			'emptyLetSearch'  : 'Rezultati pretraživanja prvog slova su prazni u trenutnom prikazu.', // from v2.1.23 added 24.3.2017
			'textLabel'       : 'Oznaka teksta', // from v2.1.17 added 13.10.2016
			'minsLeft'        : '$1 preostalo min', // from v2.1.17 added 13.11.2016
			'openAsEncoding'  : 'Ponovno otvori s odabranim kodiranjem', // from v2.1.19 added 2.12.2016
			'saveAsEncoding'  : 'Spremite s odabranim kodiranjem', // from v2.1.19 added 2.12.2016
			'selectFolder'    : 'Odaberite mapu', // from v2.1.20 added 13.12.2016
			'firstLetterSearch': 'Pretraživanje prvog slova', // from v2.1.23 added 24.3.2017
			'presets'         : 'Unaprijed postavljene postavke', // from v2.1.25 added 26.5.2017
			'tooManyToTrash'  : 'Previše je predmeta pa ne može u smeće.', // from v2.1.25 added 9.6.2017
			'TextArea'        : 'TextArea', // from v2.1.25 added 14.6.2017
			'folderToEmpty'   : 'Ispraznite mapu "$1".', // from v2.1.25 added 22.6.2017
			'filderIsEmpty'   : 'Nema stavki u mapi "$1".', // from v2.1.25 added 22.6.2017
			'preference'      : 'preferencija', // from v2.1.26 added 28.6.2017
			'language'        : 'Jezik', // from v2.1.26 added 28.6.2017
			'clearBrowserData': 'Inicijalizirajte postavke spremljene u ovom pregledniku', // from v2.1.26 added 28.6.2017
			'toolbarPref'     : 'Postavke alatne trake', // from v2.1.27 added 2.8.2017
			'charsLeft'       : '... preostalih $1 znakova.',  // from v2.1.29 added 30.8.2017
			'linesLeft'       : '... preostalih $1 redaka.',  // from v2.1.52 added 16.1.2020
			'sum'             : 'zbroj', // from v2.1.29 added 28.9.2017
			'roughFileSize'   : 'Gruba veličina datoteke', // from v2.1.30 added 2.11.2017
			'autoFocusDialog' : 'Usredotočite se na element dijaloga s prelaskom miša',  // from v2.1.30 added 2.11.2017
			'select'          : 'Odaberi', // from v2.1.30 added 23.11.2017
			'selectAction'    : 'Radnja pri odabiru datoteke', // from v2.1.30 added 23.11.2017
			'useStoredEditor' : 'Otvorite zadnji put korištenim uređivačom', // from v2.1.30 added 23.11.2017
			'selectinvert'    : 'Obrni odabir', // from v2.1.30 added 25.11.2017
			'renameMultiple'  : 'Jeste li sigurni da želite preimenovati $1 odabrane stavke poput $2?<br/>Ovo se ne može poništiti!', // from v2.1.31 added 4.12.2017
			'batchRename'     : 'Preimenovanje grupe', // from v2.1.31 added 8.12.2017
			'plusNumber'      : '+ Broj', // from v2.1.31 added 8.12.2017
			'asPrefix'        : 'Dodajte prefiks', // from v2.1.31 added 8.12.2017
			'asSuffix'        : 'Dodajte sufiks', // from v2.1.31 added 8.12.2017
			'changeExtention' : 'Promjena ekstenzije', // from v2.1.31 added 8.12.2017
			'columnPref'      : 'Postavke stupaca (prikaz popisa)', // from v2.1.32 added 6.2.2018
			'reflectOnImmediate' : 'Sve promjene će se odmah odraziti na arhivu.', // from v2.1.33 added 2.3.2018
			'reflectOnUnmount'   : 'Sve promjene neće se odraziti sve dok ne isključite ovaj volumen.', // from v2.1.33 added 2.3.2018
			'unmountChildren' : 'Sljedeći volumen(i) montirani na ovaj volumen također su se demontirali. Jeste li sigurni da ćete ga isključiti?', // from v2.1.33 added 5.3.2018
			'selectionInfo'   : 'Informacije o odabiru', // from v2.1.33 added 7.3.2018
			'hashChecker'     : 'Algoritmi za prikaz hash datoteke', // from v2.1.33 added 10.3.2018
			'infoItems'       : 'Info stavke (Informacija o izboru)', // from v2.1.38 added 28.3.2018
			'pressAgainToExit': 'Pritisnite ponovno za izlaz.', // from v2.1.38 added 1.4.2018
			'toolbar'         : 'Alatna traka', // from v2.1.38 added 4.4.2018
			'workspace'       : 'Radni prostor', // from v2.1.38 added 4.4.2018
			'dialog'          : 'Dialog', // from v2.1.38 added 4.4.2018
			'all'             : 'svi', // from v2.1.38 added 4.4.2018
			'iconSize'        : 'Veličina ikone (prikaz ikona)', // from v2.1.39 added 7.5.2018
			'editorMaximized' : 'Otvorite uvećani prozor uređivača', // from v2.1.40 added 30.6.2018
			'editorConvNoApi' : 'Budući da konverzija putem API-ja trenutno nije dostupna, molimo vas da izvršite konverziju na web stranici.', //from v2.1.40 added 8.7.2018
			'editorConvNeedUpload' : 'Nakon pretvorbe morate prenijeti s URL-om stavke ili preuzetu datoteku da biste spremili pretvorenu datoteku.', //from v2.1.40 added 8.7.2018
			'convertOn'       : 'Pretvorite na web-mjestu od $1', // from v2.1.40 added 10.7.2018
			'integrations'    : 'Integracije', // from v2.1.40 added 11.7.2018
			'integrationWith' : 'Ovaj elFinder ima integrirane sljedeće vanjske usluge. Prije korištenja provjerite uvjete korištenja, politiku privatnosti itd.', // from v2.1.40 added 11.7.2018
			'showHidden'      : 'Prikaži skrivene stavke', // from v2.1.41 added 24.7.2018
			'hideHidden'      : 'Sakrij skrivene stavke', // from v2.1.41 added 24.7.2018
			'toggleHidden'    : 'Prikaži/sakrij skrivene stavke', // from v2.1.41 added 24.7.2018
			'makefileTypes'   : 'Vrste datoteka za omogućavanje s "Nova datoteka"', // from v2.1.41 added 7.8.2018
			'typeOfTextfile'  : 'Vrsta tekstualne datoteke', // from v2.1.41 added 7.8.2018
			'add'             : 'Dodajte', // from v2.1.41 added 7.8.2018
			'theme'           : 'Tema', // from v2.1.43 added 19.10.2018
			'default'         : 'Zadano', // from v2.1.43 added 19.10.2018
			'description'     : 'Opis', // from v2.1.43 added 19.10.2018
			'website'         : 'web-mjesto', // from v2.1.43 added 19.10.2018
			'author'          : 'Autor', // from v2.1.43 added 19.10.2018
			'email'           : 'E-mail', // from v2.1.43 added 19.10.2018
			'license'         : 'Licenca', // from v2.1.43 added 19.10.2018
			'exportToSave'    : 'Ova se stavka ne može spremiti. Kako biste izbjegli gubitak uređivanja, morate ih izvesti na svoje računalo.', // from v2.1.44 added 1.12.2018
			'dblclickToSelect': 'Dvaput kliknite na datoteku da biste je odabrali.', // from v2.1.47 added 22.1.2019
			'useFullscreen'   : 'Koristite način cijelog zaslona', // from v2.1.47 added 19.2.2019

			/********************************** mimetypes **********************************/
			'kindUnknown'     : 'nepoznato',
			'kindRoot'        : 'Korijen volumena', // from v2.1.16 added 16.10.2016
			'kindFolder'      : 'Mapa',
			'kindSelects'     : 'Selekcije', // from v2.1.29 added 29.8.2017
			'kindAlias'       : 'Drugo ime',
			'kindAliasBroken' : 'Broken alias',
			// applications
			'kindApp'         : 'Aplikacija',
			'kindPostscript'  : 'Postscript dokument',
			'kindMsOffice'    : 'Microsoft Office dokument',
			'kindMsWord'      : 'Microsoft Word dokument',
			'kindMsExcel'     : 'Microsoft Excel dokument',
			'kindMsPP'        : 'Microsoft Powerpoint prezentacija',
			'kindOO'          : 'Open Office dokument',
			'kindAppFlash'    : 'Flash aplikacija',
			'kindPDF'         : 'Prijenosni format dokumenta (PDF)',
			'kindTorrent'     : 'Bittorrent dokument',
			'kind7z'          : '7z arhiva',
			'kindTAR'         : 'TAR arhiva',
			'kindGZIP'        : 'GZIP arhiva',
			'kindBZIP'        : 'BZIP arhiva',
			'kindXZ'          : 'XZ arhiva',
			'kindZIP'         : 'ZIP arhiva',
			'kindRAR'         : 'RAR arhiva',
			'kindJAR'         : 'Java JAR dokument',
			'kindTTF'         : 'True Type font',
			'kindOTF'         : 'Otvorite Vrsta fonta',
			'kindRPM'         : 'RPM paket',
			// texts
			'kindText'        : 'Tekst arhiva',
			'kindTextPlain'   : 'Obični tekst',
			'kindPHP'         : 'PHP izvor',
			'kindCSS'         : 'Kaskadni stilski list',
			'kindHTML'        : 'HTML dokument',
			'kindJS'          : 'Javascript izvor',
			'kindRTF'         : 'Format obogaćenog teksta',
			'kindC'           : 'C izvor',
			'kindCHeader'     : 'C izvor zaglavlja',
			'kindCPP'         : 'C++ izvor',
			'kindCPPHeader'   : 'C++ izvor zaglavlja',
			'kindShell'       : 'Unix shell skripta',
			'kindPython'      : 'Python izvor',
			'kindJava'        : 'Java izvor',
			'kindRuby'        : 'Ruby izvor',
			'kindPerl'        : 'Perl skripta',
			'kindSQL'         : 'SQL izvor',
			'kindXML'         : 'XML dokument',
			'kindAWK'         : 'AWK izvor',
			'kindCSV'         : 'vrijednosti razdvojene zarezom',
			'kindDOCBOOK'     : 'Docbook XML dokument',
			'kindMarkdown'    : 'Markdown tekst', // added 20.7.2015
			// images
			'kindImage'       : 'slika',
			'kindBMP'         : 'BMP slika',
			'kindJPEG'        : 'JPEG slika',
			'kindGIF'         : 'GIF slika',
			'kindPNG'         : 'PNG slika',
			'kindTIFF'        : 'TIFF slika',
			'kindTGA'         : 'TGA slika',
			'kindPSD'         : 'Adobe Photoshop slika',
			'kindXBITMAP'     : 'X bitmap slika',
			'kindPXM'         : 'Pixelmator slika',
			// media
			'kindAudio'       : 'Audio mediji',
			'kindAudioMPEG'   : 'MPEG zvuk',
			'kindAudioMPEG4'  : 'MPEG-4 zvuk',
			'kindAudioMIDI'   : 'MIDI zvuk',
			'kindAudioOGG'    : 'Ogg Vorbis zvuk',
			'kindAudioWAV'    : 'WAV zvuk',
			'AudioPlaylist'   : 'MP3 lista',
			'kindVideo'       : 'Video ',
			'kindVideoDV'     : 'DV video',
			'kindVideoMPEG'   : 'MPEG video',
			'kindVideoMPEG4'  : 'MPEG-4 video',
			'kindVideoAVI'    : 'AVI video',
			'kindVideoMOV'    : 'Quick Time video',
			'kindVideoWM'     : 'Windows Media video',
			'kindVideoFlash'  : 'Flash video',
			'kindVideoMKV'    : 'Matroska video',
			'kindVideoOGG'    : 'Ogg video'
		}
	};
}));js/i18n/elfinder.cs.js000064400000103154151215013360010472 0ustar00/**
 * Čeština translation
 * @author RobiNN <kelcakrobo@gmail.com>
 * @author Jay Gridley <gridley.jay@hotmail.com>
 * @version 2022-02-28
 */
 (function(root, factory) {
	if (typeof define === 'function' && define.amd) {
		define(['elfinder'], factory);
	} else if (typeof exports !== 'undefined') {
		module.exports = factory(require('elfinder'));
	} else {
		factory(root.elFinder);
	}
}(this, function(elFinder) {
	elFinder.prototype.i18.cs = {
		translator : 'RobiNN &lt;kelcakrobo@gmail.com&gt;, Jay Gridley &lt;gridley.jay@hotmail.com&gt;',
		language   : 'Čeština',
		direction  : 'ltr',
		dateFormat : 'd. m. Y H:i', // will show like: 28. 02. 2022 11:30
		fancyDateFormat : '$1 H:i', // will show like: Dnes 11:30
		nonameDateFormat : 'ymd-His', // noname upload will show like: 220228-113024
		messages   : {
			'getShareText' : 'Podíl',
			'Editor ': 'Editor kódu',
			/********************************** errors **********************************/
			'error'                : 'Chyba',
			'errUnknown'           : 'Neznámá chyba.',
			'errUnknownCmd'        : 'Neznámý příkaz.',
			'errJqui'              : 'Nedostačující konfigurace jQuery UI. Musí být zahrnuty komponenty Selectable, Draggable a Droppable.',
			'errNode'              : 'elFinder vyžaduje vytvořený DOM Elementu.',
			'errURL'               : 'Chybná konfigurace elFinderu! Není nastavena hodnota URL.',
			'errAccess'            : 'Přístup zamítnut.',
			'errConnect'           : 'Nepodařilo se připojit k backendu.',
			'errAbort'             : 'Připojení zrušeno.',
			'errTimeout'           : 'Vypšel limit pro připojení.',
			'errNotFound'          : 'Backend nenalezen.',
			'errResponse'          : 'Nesprávná odpověď backendu.',
			'errConf'              : 'Nepsrávná konfigurace backendu.',
			'errJSON'              : 'PHP modul JSON není nainstalován.',
			'errNoVolumes'         : 'Není dostupný čitelný oddíl.',
			'errCmdParams'         : 'Nesprávné parametry příkazu "$1".',
			'errDataNotJSON'       : 'Data nejsou ve formátu JSON.',
			'errDataEmpty'         : 'Data jsou prázdná.',
			'errCmdReq'            : 'Dotaz backendu vyžaduje název příkazu.',
			'errOpen'              : 'Chyba při otevírání "$1".',
			'errNotFolder'         : 'Objekt není složka.',
			'errNotFile'           : 'Objekt není soubor.',
			'errRead'              : 'Chyba při čtení "$1".',
			'errWrite'             : 'Chyba při zápisu do "$1".',
			'errPerm'              : 'Přístup odepřen.',
			'errLocked'            : '"$1" je uzamčený a nemůže být přejmenován, přesunut nebo smazán.',
			'errExists'            : 'Soubor s názvem "$1" již existuje.',
			'errInvName'           : 'Nesprávný název souboru.',
			'errInvDirname'        : 'Neplatný název adresáře.',  // from v2.1.24 added 12.4.2017
			'errFolderNotFound'    : 'Složka nenalezena.',
			'errFileNotFound'      : 'Soubor nenalezen.',
			'errTrgFolderNotFound' : 'Cílová složka "$1" nenalezena.',
			'errPopup'             : 'Prohlížeč zabránil otevření vyskakovacího okna. K otevření souboru, povolte vyskakovací okno v prohlížeči.',
			'errMkdir'             : 'Nepodařilo se vytvořit složku "$1".',
			'errMkfile'            : 'Nepodařilo se vytvořit soubor "$1".',
			'errRename'            : 'Nepodařilo se přejmenovat "$1".',
			'errCopyFrom'          : 'Kopírování souborů z oddílu "$1" není povoleno.',
			'errCopyTo'            : 'Kopírování souborů do oddílu "$1" není povoleno.',
			'errMkOutLink'         : 'Nelze vytvořit odkaz mimo kořenového svazku.', // from v2.1 added 03.10.2015
			'errUpload'            : 'Chyba nahrávání.',  // old name - errUploadCommon
			'errUploadFile'        : 'Nepodařilo se nahrát "$1".', // old name - errUpload
			'errUploadNoFiles'     : 'Nejsou vybrány žádné soubory k nahrání.',
			'errUploadTotalSize'   : 'Překročena maximální povolená velikost dat.', // old name - errMaxSize
			'errUploadFileSize'    : 'Překročena maximální povolená velikost souboru.', //  old name - errFileMaxSize
			'errUploadMime'        : 'Nepovolený typ souboru.',
			'errUploadTransfer'    : '"$1" chyba přenosu.',
			'errUploadTemp'        : 'Nelze vytvořit dočasný soubor pro upload.', // from v2.1 added 26.09.2015
			'errNotReplace'        : 'Objekt "$1" v tomto umístění již existuje a nelze jej nahradit s jiným typem objektu.', // new
			'errReplace'           : 'Nelze nahradit "$1".',
			'errSave'              : '"$1" nelze uložit.',
			'errCopy'              : '"$1" nelze zkopírovat.',
			'errMove'              : '"$1" nelze přemístit.',
			'errCopyInItself'      : '"$1" nelze zkopírovat do sebe sama.',
			'errRm'                : '"$1" nelze odstranit.',
			'errTrash'             : 'Nelze se dostat do koše.', // from v2.1.24 added 30.4.2017
			'errRmSrc'             : 'Nelze odstranit zdrojový soubor(y).',
			'errExtract'           : 'Nelze extrahovat soubory z "$1".',
			'errArchive'           : 'Nelze vytvořit archív.',
			'errArcType'           : 'Nepodporovaný typ archívu.',
			'errNoArchive'         : 'Soubor není archív nebo má nepodporovaný formát.',
			'errCmdNoSupport'      : 'Backend tento příkaz nepodporuje.',
			'errReplByChild'       : 'Složka "$1" nemůže být nahrazena souborem, který sama obsahuje.',
			'errArcSymlinks'       : 'Z bezpečnostních důvodů je zakázáno rozbalit archívy obsahující symlinky.', // edited 24.06.2012
			'errArcMaxSize'        : 'Soubory archívu překračují maximální povolenou velikost.',
			'errResize'            : 'Nepodařilo se změnit velikost obrázku "$1".',
			'errResizeDegree'      : 'Neplatný stupeň rotace.',  // added 7.3.2013
			'errResizeRotate'      : 'Nelze otočit obrázek.',  // added 7.3.2013
			'errResizeSize'        : 'Neplatná velikost obrázku.',  // added 7.3.2013
			'errResizeNoChange'    : 'Velikost obrazu se nezmění.',  // added 7.3.2013
			'errUsupportType'      : 'Nepodporovaný typ souboru.',
			'errNotUTF8Content'    : 'Soubor "$1" nemá ani obsah kódovaný v UTF-8 a nelze změnit.',  // added 9.11.2011
			'errNetMount'          : 'Není možné se připojit "$ 1".', // added 17.04.2012
			'errNetMountNoDriver'  : 'Nepodporovaný protokol.',     // added 17.04.2012
			'errNetMountFailed'    : 'Připojení se nezdařilo.',         // added 17.04.2012
			'errNetMountHostReq'   : 'Hostitel se vyžaduje.', // added 18.04.2012
			'errSessionExpires'    : 'Relace byla ukončena z důvodu nečinnosti.',
			'errCreatingTempDir'   : 'Nelze vytvořit dočasný adresář: "$1"',
			'errFtpDownloadFile'   : 'Nelze stáhnout soubor z FTP: "$1"',
			'errFtpUploadFile'     : 'Nelze nahrát soubor na FTP: "$1"',
			'errFtpMkdir'          : 'Nepodařilo se vytvořit vzdálený adresář na FTP: "$1"',
			'errArchiveExec'       : 'Při archivaci do souboru došlo k chybě: "$1"',
			'errExtractExec'       : 'Chyba při extrahování souboru: "$1"',
			'errNetUnMount'        : 'Nepodařilo se odpojit', // from v2.1 added 30.04.2012
			'errConvUTF8'          : 'Nelze převést na UTF-8', // from v2.1 added 08.04.2014
			'errFolderUpload'      : 'Chcete-li nahrát složku, zkuste moderní prohlížeč.', // from v2.1 added 26.6.2015
			'errSearchTimeout'     : 'Vypršení časového limitu při hledání "$1". Je částečně výsledkem hledání.', // from v2.1 added 12.1.2016
			'errReauthRequire'     : 'Opětovné povolení je nutné.', // from v2.1.10 added 24.3.2016
			'errMaxTargets'        : 'Maximální počet volitelných předmětů je $1.', // from v2.1.17 added 17.10.2016
			'errRestore'           : 'Nelze obnovit z koše. Nelze identifikovat cíl obnovení.', // from v2.1.24 added 3.5.2017
			'errEditorNotFound'    : 'Editor tohoto typu souboru nebyl nalezen.', // from v2.1.25 added 23.5.2017
			'errServerError'       : 'Došlo k chybě na straně serveru.', // from v2.1.25 added 16.6.2017
			'errEmpty'             : 'Nelze vyprázdnit složku "$1".', // from v2.1.25 added 22.6.2017
			'moreErrors'           : 'Existují ještě další $1 chyby.', // from v2.1.44 added 9.12.2018
			'errMaxMkdirs'         : 'Můžete vytvořit až $1 složek najednou.', // from v2.1.58 added 20.6.2021

			/******************************* commands names ********************************/
			'cmdarchive'   : 'Vytvořit archív',
			'cmdback'      : 'Zpět',
			'cmdcopy'      : 'Kopírovat',
			'cmdcut'       : 'Vyjmout',
			'cmddownload'  : 'Stáhnout',
			'cmdduplicate' : 'Duplikovat',
			'cmdedit'      : 'Upravit soubor',
			'cmdextract'   : 'Rozbalit archív',
			'cmdforward'   : 'Vpřed',
			'cmdgetfile'   : 'Vybrat soubory',
			'cmdhelp'      : 'O softwaru',
			'cmdhome'      : 'Domů',
			'cmdinfo'      : 'Zobrazit informace',
			'cmdmkdir'     : 'Nová složka',
			'cmdmkdirin'   : 'Do nové složky', // from v2.1.7 added 19.2.2016
			'cmdmkfile'    : 'Nový soubor',
			'cmdopen'      : 'Otevřít',
			'cmdpaste'     : 'Vložit',
			'cmdquicklook' : 'Náhled',
			'cmdreload'    : 'Obnovit',
			'cmdrename'    : 'Přejmenovat',
			'cmdrm'        : 'Smazat',
			'cmdtrash'     : 'Do koše', //from v2.1.24 added 29.4.2017
			'cmdrestore'   : 'Obnovit', //from v2.1.24 added 3.5.2017
			'cmdsearch'    : 'Najít soubory',
			'cmdup'        : 'Přejít do nadřazené složky',
			'cmdupload'    : 'Nahrát soubor(y)',
			'cmdview'      : 'Zobrazit',
			'cmdresize'    : 'Změnit velikost',
			'cmdsort'      : 'Seřadit',
			'cmdnetmount'  : 'Připojit síťovou jednotku', // added 18.04.2012
			'cmdnetunmount': 'Odpojit', // from v2.1 added 30.04.2012
			'cmdplaces'    : 'Umístění', // added 28.12.2014
			'cmdchmod'     : 'Změnit režim', // from v2.1 added 20.6.2015
			'cmdopendir'   : 'Otevření složky', // from v2.1 added 13.1.2016
			'cmdcolwidth'  : 'Obnovení šířku sloupce', // from v2.1.13 added 12.06.2016
			'cmdfullscreen': 'Celá obrazovka', // from v2.1.15 added 03.08.2016
			'cmdmove'      : 'Posouvat', // from v2.1.15 added 21.08.2016
			'cmdempty'     : 'Vyprázdnit složku', // from v2.1.25 added 22.06.2017
			'cmdundo'      : 'Krok zpět', // from v2.1.27 added 31.07.2017
			'cmdredo'      : 'Udělat to znovu', // from v2.1.27 added 31.07.2017
			'cmdpreference': 'Preference', // from v2.1.27 added 03.08.2017
			'cmdselectall' : 'Vyberat vše', // from v2.1.28 added 15.08.2017
			'cmdselectnone': 'Nic nevyberať', // from v2.1.28 added 15.08.2017
			'cmdselectinvert': 'Invertovat výběr', // from v2.1.28 added 15.08.2017
			'cmdopennew'   : 'Otevři v novém okně', // from v2.1.38 added 3.4.2018
			'cmdhide'      : 'Skrýt (Předvolba)', // from v2.1.41 added 24.7.2018

			/*********************************** buttons ***********************************/
			'btnClose'  : 'Zavřít',
			'btnSave'   : 'Uložit',
			'btnRm'     : 'Odstranit',
			'btnApply'  : 'Použít',
			'btnCancel' : 'Zrušit',
			'btnNo'     : 'Ne',
			'btnYes'    : 'Ano',
			'btnMount'  : 'Připojit',  // added 18.04.2012
			'btnApprove': 'Přejít do části 1 $ & schválit', // from v2.1 added 26.04.2012
			'btnUnmount': 'Odpojit', // from v2.1 added 30.04.2012
			'btnConv'   : 'Převést', // from v2.1 added 08.04.2014
			'btnCwd'    : 'Tu',      // from v2.1 added 22.5.2015
			'btnVolume' : 'Médium',    // from v2.1 added 22.5.2015
			'btnAll'    : 'Všechno',       // from v2.1 added 22.5.2015
			'btnMime'   : 'MIME typ', // from v2.1 added 22.5.2015
			'btnFileName':'Název souboru',  // from v2.1 added 22.5.2015
			'btnSaveClose': 'Uložit & zavřít', // from v2.1 added 12.6.2015
			'btnBackup' : 'Zálohovat', // fromv2.1 added 28.11.2015
			'btnRename'    : 'Přejmenovat',      // from v2.1.24 added 6.4.2017
			'btnRenameAll' : 'Přejmenovat vše', // from v2.1.24 added 6.4.2017
			'btnPrevious' : 'Předch ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnNext'     : 'Další ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnSaveAs'   : 'Uložit jako', // from v2.1.25 added 24.5.2017

			/******************************** notifications ********************************/
			'ntfopen'     : 'Otevírání složky',
			'ntffile'     : 'Otevírání souboru',
			'ntfreload'   : 'Obnovování obsahu složky',
			'ntfmkdir'    : 'Vytváření složky',
			'ntfmkfile'   : 'Vytváření souborů',
			'ntfrm'       : 'Vymazání položek',
			'ntfcopy'     : 'Kopírování položek',
			'ntfmove'     : 'Přemístění položek',
			'ntfprepare'  : 'Kontrola existujících položek',
			'ntfrename'   : 'Přejmenovávání souborů',
			'ntfupload'   : 'Nahrávání souborů',
			'ntfdownload' : 'Stahování souborů',
			'ntfsave'     : 'Ukládání souborů',
			'ntfarchive'  : 'Vytváření archívu',
			'ntfextract'  : 'Rozbalování souborů z archívu',
			'ntfsearch'   : 'Vyhledávání souborů',
			'ntfresize'   : 'Změna velikosti obrázků',
			'ntfsmth'     : 'Čekejte prosím...',
			'ntfloadimg'  : 'Načítání obrázků',
			'ntfnetmount' : 'Připojení síťového média', // added 18.04.2012
			'ntfnetunmount': 'Odpojení síťového média', // from v2.1 added 30.04.2012
			'ntfdim'      : 'Získejte rozměr obrazu', // added 20.05.2013
			'ntfreaddir'  : 'Přečtěte si informace o složce', // from v2.1 added 01.07.2013
			'ntfurl'      : 'Získejte adresu URL odkazu', // from v2.1 added 11.03.2014
			'ntfchmod'    : 'Změna souboru', // from v2.1 added 20.6.2015
			'ntfpreupload': 'Zkontrolujte název nahravaného souboru', // from v2.1 added 31.11.2015
			'ntfzipdl'    : 'Vytvořit soubor ke stažení', // from v2.1.7 added 23.1.2016
			'ntfparents'  : 'Získání informací o cestě', // from v2.1.17 added 2.11.2016
			'ntfchunkmerge': 'Zpracování nahraného souboru', // from v2.1.17 added 2.11.2016
			'ntftrash'    : 'Hodit do koše', // from v2.1.24 added 2.5.2017
			'ntfrestore'  : 'Obnova z koše', // from v2.1.24 added 3.5.2017
			'ntfchkdir'   : 'Kontrola cílové složky', // from v2.1.24 added 3.5.2017
			'ntfundo'     : 'Zrušit  předchozí operaci', // from v2.1.27 added 31.07.2017
			'ntfredo'     : 'Obnovit předchozí zrušení', // from v2.1.27 added 31.07.2017
			'ntfchkcontent' : 'Kontrola obsahu', // from v2.1.41 added 3.8.2018

			/*********************************** volumes *********************************/
			'volume_Trash' : 'Koš', //from v2.1.24 added 29.4.2017

			/************************************ dates **********************************/
			'dateUnknown' : 'neznámý',
			'Today'       : 'Dnes',
			'Yesterday'   : 'Včera',
			'msJan'       : 'Led',
			'msFeb'       : 'Úno',
			'msMar'       : 'Bře',
			'msApr'       : 'Dub',
			'msMay'       : 'Kvě',
			'msJun'       : 'Čer',
			'msJul'       : 'Čec',
			'msAug'       : 'Srp',
			'msSep'       : 'Zář',
			'msOct'       : 'Říj',
			'msNov'       : 'Lis',
			'msDec'       : 'Pro',
			'January'     : 'Leden',
			'February'    : 'Únor',
			'March'       : 'Březen',
			'April'       : 'Duben',
			'May'         : 'Květen',
			'June'        : 'Červen',
			'July'        : 'Červenec',
			'August'      : 'Srpen',
			'September'   : 'Září',
			'October'     : 'Říjen',
			'November'    : 'Listopad',
			'December'    : 'Prosinec',
			'Sunday'      : 'Neděle',
			'Monday'      : 'Pondělí',
			'Tuesday'     : 'Úterý',
			'Wednesday'   : 'Středa',
			'Thursday'    : 'Čtvrtek',
			'Friday'      : 'Pátek',
			'Saturday'    : 'Sobota',
			'Sun'         : 'Ne',
			'Mon'         : 'Po',
			'Tue'         : 'Út',
			'Wed'         : 'St',
			'Thu'         : 'Čt',
			'Fri'         : 'Pá',
			'Sat'         : 'So',

			/******************************** sort variants ********************************/
			'sortname'          : 'dle jména',
			'sortkind'          : 'dle typu',
			'sortsize'          : 'dle velikosti',
			'sortdate'          : 'dle data',
			'sortFoldersFirst'  : 'Napřed složky',
			'sortperm'          : 'dle povolení', // from v2.1.13 added 13.06.2016
			'sortmode'          : 'dle módu',       // from v2.1.13 added 13.06.2016
			'sortowner'         : 'dle majitele',      // from v2.1.13 added 13.06.2016
			'sortgroup'         : 'dle skupiny',      // from v2.1.13 added 13.06.2016
			'sortAlsoTreeview'  : 'Také stromové zobrazení',  // from v2.1.15 added 01.08.2016

			/********************************** new items **********************************/
			'untitled file.txt' : 'Nový soubor.txt', // added 10.11.2015
			'untitled folder'   : 'Nová složka',   // added 10.11.2015
			'Archive'           : 'Nový archiv',  // from v2.1 added 10.11.2015
			'untitled file'     : 'Nový soubor.$1',  // from v2.1.41 added 6.8.2018
			'extentionfile'     : '$1 soubor',    // from v2.1.41 added 6.8.2018
			'extentiontype'     : '$1: $2',      // from v2.1.43 added 17.10.2018

			/********************************** messages **********************************/
			'confirmReq'      : 'Požadováno potvrzení',
			'confirmRm'       : 'Opravdu chcete odstranit tyto soubory?<br/>Operace nelze vrátit!',
			'confirmRepl'     : 'Nahradit staré soubory novými?',
			'confirmRest'     : 'Nahradit stávající položku položkou z koše?', // fromv2.1.24 added 5.5.2017
			'confirmConvUTF8' : 'Není v UTF-8, převést do UTF-8?<br/>Obsah po převodu se stává UTF-8.', // from v2.1 added 08.04.2014
			'confirmNonUTF8'  : 'Kódování tohoto souboru nemoholo rozpoznán. Pro úpravy je třeba dočasně převést do kódování UTF-8.<br/>Prosím, vyberte kódování znaků souboru.', // from v2.1.19 added 28.11.2016
			'confirmNotSave'  : 'Byl změněn.<br/>Pokud obsahuje neuložené změny, dojde ke ztrátě práce.', // from v2.1 added 15.7.2015
			'confirmTrash'    : 'Opravdu chcete položky přesunout do koše?', //from v2.1.24 added 29.4.2017
			'confirmMove'     : 'Opravdu chcete položky přesunout do "$1"?', //from v2.1.50 added 27.7.2019
			'apllyAll'        : 'Pro všechny',
			'name'            : 'Název',
			'size'            : 'Velikost',
			'perms'           : 'Práva',
			'modify'          : 'Upravený',
			'kind'            : 'Typ',
			'read'            : 'čtení',
			'write'           : 'zápis',
			'noaccess'        : 'přístup odepřen',
			'and'             : 'a',
			'unknown'         : 'neznámý',
			'selectall'       : 'Vybrat všechny položky',
			'selectfiles'     : 'Vybrat položku(y)',
			'selectffile'     : 'Vybrat první položku',
			'selectlfile'     : 'Vybrat poslední položku',
			'viewlist'        : 'Seznam',
			'viewicons'       : 'Ikony',
			'viewSmall'       : 'Malé ikony', // from v2.1.39 added 22.5.2018
			'viewMedium'      : 'Střední ikony', // from v2.1.39 added 22.5.2018
			'viewLarge'       : 'Velké ikony', // from v2.1.39 added 22.5.2018
			'viewExtraLarge'  : 'Extra velké ikony', // from v2.1.39 added 22.5.2018
			'places'          : 'Místa',
			'calc'            : 'Vypočítat',
			'path'            : 'Cesta',
			'aliasfor'        : 'Zástupce pro',
			'locked'          : 'Uzamčený',
			'dim'             : 'Rozměry',
			'files'           : 'Soubory',
			'folders'         : 'Složky',
			'items'           : 'Položky',
			'yes'             : 'ano',
			'no'              : 'ne',
			'link'            : 'Odkaz',
			'searcresult'     : 'Výsledky hledání',
			'selected'        : 'vybrané položky',
			'about'           : 'O softwaru',
			'shortcuts'       : 'Zkratky',
			'help'            : 'Nápověda',
			'webfm'           : 'Webový správce souborů',
			'ver'             : 'Verze',
			'protocolver'     : 'verze protokolu',
			'homepage'        : 'Domovská stránka projektu',
			'docs'            : 'Dokumentace',
			'github'          : 'Najdete nás na Gitgube',
			'twitter'         : 'Následujte nás na Twitteri',
			'facebook'        : 'Připojte se k nám na Facebooku',
			'team'            : 'Tým',
			'chiefdev'        : 'séf vývojářů',
			'developer'       : 'vývojár',
			'contributor'     : 'spolupracovník',
			'maintainer'      : 'údržba',
			'translator'      : 'překlad',
			'icons'           : 'Ikony',
			'dontforget'      : 'a nezapomeňte si vzít plavky',
			'shortcutsof'     : 'Zkratky nejsou povoleny',
			'dropFiles'       : 'Sem přetáhněte soubory',
			'or'              : 'nebo',
			'selectForUpload' : 'Vyberte soubory',
			'moveFiles'       : 'Přesunout sobory',
			'copyFiles'       : 'Zkopírovat soubory',
			'restoreFiles'    : 'Obnovit položky', // from v2.1.24 added 5.5.2017
			'rmFromPlaces'    : 'Odstranit z míst',
			'aspectRatio'     : 'Poměr stran',
			'scale'           : 'Měřítko',
			'width'           : 'Šířka',
			'height'          : 'Výška',
			'resize'          : 'Změnit vel.',
			'crop'            : 'Ořezat',
			'rotate'          : 'Otočit',
			'rotate-cw'       : 'Otočit o +90 stupňů',
			'rotate-ccw'      : 'Otočit o -90 stupňů',
			'degree'          : ' stupňů',
			'netMountDialogTitle' : 'Připojení síťového média', // added 18.04.2012
			'protocol'            : 'Protokol', // added 18.04.2012
			'host'                : 'Hostitel', // added 18.04.2012
			'port'                : 'Přístav', // added 18.04.2012
			'user'                : 'Uživatel', // added 18.04.2012
			'pass'                : 'Heslo', // added 18.04.2012
			'confirmUnmount'      : 'Chcete odpojit $1?',  // from v2.1 added 30.04.2012
			'dropFilesBrowser': 'Přemístěte nebo přesuňte soubory z prohlížeče', // from v2.1 added 30.05.2012
			'dropPasteFiles'  : 'Zde přemístěte nebo přesuňte soubory a adresy URL', // from v2.1 added 07.04.2014
			'encoding'        : 'Kódování', // from v2.1 added 19.12.2014
			'locale'          : 'Lokalizce',   // from v2.1 added 19.12.2014
			'searchTarget'    : 'Cíl: $1',                // from v2.1 added 22.5.2015
			'searchMime'      : 'Vyhledávání podle vstupního MIME typu', // from v2.1 added 22.5.2015
			'owner'           : 'Majitel', // from v2.1 added 20.6.2015
			'group'           : 'Skupina', // from v2.1 added 20.6.2015
			'other'           : 'Ostatní', // from v2.1 added 20.6.2015
			'execute'         : 'Spustit', // from v2.1 added 20.6.2015
			'perm'            : 'Povolení', // from v2.1 added 20.6.2015
			'mode'            : 'Režim', // from v2.1 added 20.6.2015
			'emptyFolder'     : 'Složka je prázdná', // from v2.1.6 added 30.12.2015
			'emptyFolderDrop' : 'Složka je prázdná, přesunout nebo zkontrolovat položky', // from v2.1.6 added 30.12.2015
			'emptyFolderLTap' : 'Složka je prázdná, dlouhim kliknutím přidáte položky', // from v2.1.6 added 30.12.2015
			'quality'         : 'Kvalita', // from v2.1.6 added 5.1.2016
			'autoSync'        : 'Automatická synchronizace',  // from v2.1.6 added 10.1.2016
			'moveUp'          : 'Přesunout nahoru',  // from v2.1.6 added 18.1.2016
			'getLink'         : 'Získat URL odkaz', // from v2.1.7 added 9.2.2016
			'selectedItems'   : 'Vybrané položky ($1)', // from v2.1.7 added 2.19.2016
			'folderId'        : 'ID složky', // from v2.1.10 added 3.25.2016
			'offlineAccess'   : 'Povolit přístup offline', // from v2.1.10 added 3.25.2016
			'reAuth'          : 'Znovu ověřit', // from v2.1.10 added 3.25.2016
			'nowLoading'      : 'Načítání...', // from v2.1.12 added 4.26.2016
			'openMulti'       : 'Otevření více souborů', // from v2.1.12 added 5.14.2016
			'openMultiConfirm': 'Pokoušíte se otevřít soubor $1. Chcete jej otevřít v prohlížeči?', // from v2.1.12 added 5.14.2016
			'emptySearch'     : 'Výsledky hledání jsou prázdné', // from v2.1.12 added 5.16.2016
			'editingFile'     : 'Upravujete soubor.', // from v2.1.13 added 6.3.2016
			'hasSelected'     : 'Vybrali jste $1 položky.', // from v2.1.13 added 6.3.2016
			'hasClipboard'    : 'Máte $1 položky v schránce.', // from v2.1.13 added 6.3.2016
			'incSearchOnly'   : 'Inkrementální hledání je pouze z aktuálního zobrazení.', // from v2.1.13 added 6.30.2016
			'reinstate'       : 'Obnovit', // from v2.1.15 added 3.8.2016
			'complete'        : '$1 kompletní', // from v2.1.15 added 21.8.2016
			'contextmenu'     : 'Kontextové menu', // from v2.1.15 added 9.9.2016
			'pageTurning'     : 'Otáčení stránky', // from v2.1.15 added 10.9.2016
			'volumeRoots'     : 'Kořeny média', // from v2.1.16 added 16.9.2016
			'reset'           : 'Obnovit', // from v2.1.16 added 1.10.2016
			'bgcolor'         : 'Barva pozadí', // from v2.1.16 added 1.10.2016
			'colorPicker'     : 'Výběr barvy', // from v2.1.16 added 1.10.2016
			'8pxgrid'         : '8px mřížka', // from v2.1.16 added 4.10.2016
			'enabled'         : 'Povoleno', // from v2.1.16 added 4.10.2016
			'disabled'        : 'Zakázáno', // from v2.1.16 added 4.10.2016
			'emptyIncSearch'  : 'Výsledky hledání jsou prázdné v aktuálním zobrazení.\\Stisknutím tlačítka [Enter] rozšíříte vyhledávání cíle.', // from v2.1.16 added 5.10.2016
			'emptyLetSearch'  : 'Výsledky vyhledávání prvního listu jsou v aktuálním zobrazení prázdné.', // from v2.1.23 added 24.3.2017
			'textLabel'       : 'Nápis textu', // from v2.1.17 added 13.10.2016
			'minsLeft'        : '$1 minut zůstává', // from v2.1.17 added 13.11.2016
			'openAsEncoding'  : 'Otevřít pomocí zvoleného kódování', // from v2.1.19 added 2.12.2016
			'saveAsEncoding'  : 'Uložit s vybraným kódováním', // from v2.1.19 added 2.12.2016
			'selectFolder'    : 'Vyberte složku', // from v2.1.20 added 13.12.2016
			'firstLetterSearch': 'Hledání prvního listu', // from v2.1.23 added 24.3.2017
			'presets'         : 'Předvolby', // from v2.1.25 added 26.5.2017
			'tooManyToTrash'  : 'Je to příliš mnoho položek, takže se nemohou dostat do koše.', // from v2.1.25 added 9.6.2017
			'TextArea'        : 'Textarea', // from v2.1.25 added 14.6.2017
			'folderToEmpty'   : 'Vyprázdnit složku "$1".', // from v2.1.25 added 22.6.2017
			'filderIsEmpty'   : 'Ve složce "$1" nejsou žádné položky.', // from v2.1.25 added 22.6.2017
			'preference'      : 'Předvolby', // from v2.1.26 added 28.6.2017
			'language'        : 'Nastavte jazyk', // from v2.1.26 added 28.6.2017
			'clearBrowserData': 'Inicializujte nastavení uložená v tomto prohlížeči', // from v2.1.26 added 28.6.2017
			'toolbarPref'     : 'Nastavení panelu nástrojů', // from v2.1.27 added 2.8.2017
			'charsLeft'       : '...$1 znaků zbývá.',  // from v2.1.29 added 30.8.2017
			'linesLeft'       : '...$1 řádků zůstává.',  // from v2.1.52 added 16.1.2020
			'sum'             : 'Součet', // from v2.1.29 added 28.9.2017
			'roughFileSize'   : 'Hrubá velikost souboru', // from v2.1.30 added 2.11.2017
			'autoFocusDialog' : 'Zaměření na prvek dialogu s mouseover',  // from v2.1.30 added 2.11.2017
			'select'          : 'Vybrat', // from v2.1.30 added 23.11.2017
			'selectAction'    : 'Akce při vybraném souboru', // from v2.1.30 added 23.11.2017
			'useStoredEditor' : 'Otevřít pomocí naposledy použitého editoru', // from v2.1.30 added 23.11.2017
			'selectinvert'    : 'Obrátit výběr položek', // from v2.1.30 added 25.11.2017
			'renameMultiple'  : 'Opravdu chcete přejmenovat $1 vybraných položek, jako například $2<br/>Není to možné vrátit zpět!', // from v2.1.31 added 4.12.2017
			'batchRename'     : 'Batch přejmenování', // from v2.1.31 added 8.12.2017
			'plusNumber'      : '+ Číslo', // from v2.1.31 added 8.12.2017
			'asPrefix'        : 'Přidat předponu', // from v2.1.31 added 8.12.2017
			'asSuffix'        : 'Přidat příponu', // from v2.1.31 added 8.12.2017
			'changeExtention' : 'Změnit příponu', // from v2.1.31 added 8.12.2017
			'columnPref'      : 'Nastavení sloupců (Zobrazení seznamu)', // from v2.1.32 added 6.2.2018
			'reflectOnImmediate' : 'Všechny změny se okamžitě projeví v archivu.', // from v2.1.33 added 2.3.2018
			'reflectOnUnmount'   : 'Jakékoliv změny se nebudou odrážet, dokud nebude tento svazek odpojen.', // from v2.1.33 added 2.3.2018
			'unmountChildren' : 'Následující svazky namontované na tomto svazku jsou také odpojeny. Opravdu ji odpojíte?', // from v2.1.33 added 5.3.2018
			'selectionInfo'   : 'Informace o výběru', // from v2.1.33 added 7.3.2018
			'hashChecker'     : 'Algoritmy pro zobrazení hashování souborů', // from v2.1.33 added 10.3.2018
			'infoItems'       : 'Informační položky (panel s informacemi o výběru)', // from v2.1.38 added 28.3.2018
			'pressAgainToExit': 'Dalším stisknutím opustíte.', // from v2.1.38 added 1.4.2018
			'toolbar'         : 'Panel nástrojů', // from v2.1.38 added 4.4.2018
			'workspace'       : 'Pracovní prostor', // from v2.1.38 added 4.4.2018
			'dialog'          : 'Dialogové okno', // from v2.1.38 added 4.4.2018
			'all'             : 'Všechno', // from v2.1.38 added 4.4.2018
			'iconSize'        : 'Velikost ikony (zobrazení ikon)', // from v2.1.39 added 7.5.2018
			'editorMaximized' : 'Otevřete maximalizované okno editora', // from v2.1.40 added 30.6.2018
			'editorConvNoApi' : 'Protože konverze podle API momentálně není k dispozici, převeďte na webové stránce.', //from v2.1.40 added 8.7.2018
			'editorConvNeedUpload' : 'Po konverzi musíte nahrát převeden soubor pomocí URL položky nebo stažený soubor k uložení převedeného souboru.', //from v2.1.40 added 8.7.2018
			'convertOn'       : 'Převést na stránce $1', // from v2.1.40 added 10.7.2018
			'integrations'    : 'Integrace', // from v2.1.40 added 11.7.2018
			'integrationWith' : 'Tento elFinder má integrované následující externí služby. Před použitím zkontrolujte podmínky používání, zásady ochrany osobních údajů atd.', // from v2.1.40 added 11.7.2018
			'showHidden'      : 'Zobrazit skryté položky', // from v2.1.41 added 24.7.2018
			'hideHidden'      : 'Skrýt skryté položky', // from v2.1.41 added 24.7.2018
			'toggleHidden'    : 'Zobrazit/skrýt skryté položky', // from v2.1.41 added 24.7.2018
			'makefileTypes'   : 'Typy souborů, jež mají být povoleny pomocí "Nový soubor"', // from v2.1.41 added 7.8.2018
			'typeOfTextfile'  : 'Typ textového souboru', // from v2.1.41 added 7.8.2018
			'add'             : 'Přidat', // from v2.1.41 added 7.8.2018
			'theme'           : 'Téma', // from v2.1.43 added 19.10.2018
			'default'         : 'Výchozí', // from v2.1.43 added 19.10.2018
			'description'     : 'Popis', // from v2.1.43 added 19.10.2018
			'website'         : 'Stránka', // from v2.1.43 added 19.10.2018
			'author'          : 'Autor', // from v2.1.43 added 19.10.2018
			'email'           : 'E-mail', // from v2.1.43 added 19.10.2018
			'license'         : 'Licence', // from v2.1.43 added 19.10.2018
			'exportToSave'    : 'Tuto položku nelze uložit. Abyste se vyhnuli ztrátě úprav, musíte je exportovat do počítače.', // from v2.1.44 added 1.12.2018
			'dblclickToSelect': 'Poklepáním na soubor jej vyberte.', // from v2.1.47 added 22.1.2019
			'useFullscreen'   : 'Použít režim celé obrazovky', // from v2.1.47 added 19.2.2019

			/********************************** mimetypes **********************************/
			'kindUnknown'     : 'Neznámý',
			'kindRoot'        : 'Kořen média', // from v2.1.16 added 16.10.2016
			'kindFolder'      : 'Složka',
			'kindSelects'     : 'Výběry', // from v2.1.29 added 29.8.2017
			'kindAlias'       : 'Přezdívka',
			'kindAliasBroken' : 'Zlomený alias',
			// applications
			'kindApp'         : 'Aplikace',
			'kindPostscript'  : 'Dokument Postscriptu',
			'kindMsOffice'    : 'Dokument Microsoft Office',
			'kindMsWord'      : 'Dokument Microsoft Word',
			'kindMsExcel'     : 'Dokument Microsoft Excel',
			'kindMsPP'        : 'Prezentace Microsoft Powerpoint',
			'kindOO'          : 'Otevřít dokument Office',
			'kindAppFlash'    : 'Flash aplikace',
			'kindPDF'         : 'PDF',
			'kindTorrent'     : 'Soubor BitTorrent',
			'kind7z'          : 'Archív 7z',
			'kindTAR'         : 'Archív TAR',
			'kindGZIP'        : 'Archív GZIP',
			'kindBZIP'        : 'Archív BZIP',
			'kindXZ'          : 'Archív XZ',
			'kindZIP'         : 'Archív ZIP',
			'kindRAR'         : 'Archív RAR',
			'kindJAR'         : 'Soubor Java JAR',
			'kindTTF'         : 'True Type písmo',
			'kindOTF'         : 'Otevřete písmo Type',
			'kindRPM'         : 'RPM balíček',
			// texts
			'kindText'        : 'Textový dokument',
			'kindTextPlain'   : 'Čistý text',
			'kindPHP'         : 'PHP zdrojový kód',
			'kindCSS'         : 'Kaskádové styly',
			'kindHTML'        : 'HTML dokument',
			'kindJS'          : 'Javascript zdrojový kód',
			'kindRTF'         : 'Formát RTF',
			'kindC'           : 'C zdrojový kód',
			'kindCHeader'     : 'C hlavička',
			'kindCPP'         : 'C++ zdrojový kód',
			'kindCPPHeader'   : 'C++ hlavička',
			'kindShell'       : 'Unix shell skript',
			'kindPython'      : 'Python zdrojový kód',
			'kindJava'        : 'Java zdrojový kód',
			'kindRuby'        : 'Ruby zdrojový kód',
			'kindPerl'        : 'Perl skript',
			'kindSQL'         : 'SQL zdrojový kód',
			'kindXML'         : 'Dokument XML',
			'kindAWK'         : 'AWK zdrojový kód',
			'kindCSV'         : 'CSV',
			'kindDOCBOOK'     : 'Docbook XML dokument',
			'kindMarkdown'    : 'Markdown text', // added 20.7.2015
			// images
			'kindImage'       : 'Obrázek',
			'kindBMP'         : 'Obrázek BMP',
			'kindJPEG'        : 'Obrázek JPEG',
			'kindGIF'         : 'Obrázek GIF',
			'kindPNG'         : 'Obrázek PNG',
			'kindTIFF'        : 'Obrázek TIFF',
			'kindTGA'         : 'Obrázek TGA',
			'kindPSD'         : 'Obrázek Adobe Photoshop',
			'kindXBITMAP'     : 'Obrázek X bitmapa',
			'kindPXM'         : 'Obrázek Pixelmator',
			// media
			'kindAudio'       : 'Audio sobory',
			'kindAudioMPEG'   : 'Zvuk MPEG',
			'kindAudioMPEG4'  : 'Zvuk MPEG-4',
			'kindAudioMIDI'   : 'Zvuk MIDI',
			'kindAudioOGG'    : 'Zvuk Ogg Vorbis',
			'kindAudioWAV'    : 'Zvuk WAV',
			'AudioPlaylist'   : 'Seznam skladeb MP3',
			'kindVideo'       : 'Video sobory',
			'kindVideoDV'     : 'DV video',
			'kindVideoMPEG'   : 'MPEG video',
			'kindVideoMPEG4'  : 'MPEG-4 video',
			'kindVideoAVI'    : 'AVI video',
			'kindVideoMOV'    : 'Quick Time video',
			'kindVideoWM'     : 'Windows Media video',
			'kindVideoFlash'  : 'Flash video',
			'kindVideoMKV'    : 'Matroska video',
			'kindVideoOGG'    : 'Ogg video'
		}
	};
}));js/i18n/elfinder.de.js000064400000103630151215013360010454 0ustar00/**
 * Deutsch translation
 * @author JPG & Mace <dev@flying-datacenter.de>
 * @author tora60 from pragmaMx.org
 * @author Timo-Linde <info@timo-linde.de>
 * @author OSWorX <info@osworx.net>
 * @author Maximilian Schwarz <info@deefuse.de>
 * @author SF Webdesign <webdesign@stephan-frank.de>
 * @version 2022-02-28
 */
 (function(root, factory) {
	if (typeof define === 'function' && define.amd) {
		define(['elfinder'], factory);
	} else if (typeof exports !== 'undefined') {
		module.exports = factory(require('elfinder'));
	} else {
		factory(root.elFinder);
	}
}(this, function(elFinder) {
	elFinder.prototype.i18.de = {
		translator : 'JPG & Mace &lt;dev@flying-datacenter.de&gt;, tora60 from pragmaMx.org, Timo-Linde &lt;info@timo-linde.de&gt;, OSWorX &lt;info@osworx.net&gt;, Maximilian Schwarz &lt;info@deefuse.de&gt;, SF Webdesign &lt;webdesign@stephan-frank.de&gt;',
		language   : 'Deutsch',
		direction  : 'ltr',
		dateFormat : 'j. F Y H:i', // will show like: 28. Februar 2022 13:17
		fancyDateFormat : '$1 H:i', // will show like: Heute 13:17
		nonameDateFormat : 'ymd-His', // noname upload will show like: 220228-131758
		messages   : {
			'getShareText' : 'Aktie',
			'Editor ': 'Kodex-Editor',
			/********************************** errors **********************************/
			'error'                : 'Fehler',
			'errUnknown'           : 'Unbekannter Fehler.',
			'errUnknownCmd'        : 'Unbekannter Befehl.',
			'errJqui'              : 'Ungültige jQuery UI-Konfiguration. Die Komponenten Selectable, Draggable und Droppable müssen inkludiert sein.',
			'errNode'              : 'Für elFinder muss das DOM-Element erstellt werden.',
			'errURL'               : 'Ungültige elFinder-Konfiguration! Die URL-Option ist nicht gesetzt.',
			'errAccess'            : 'Zugriff verweigert.',
			'errConnect'           : 'Verbindung zum Backend fehlgeschlagen.',
			'errAbort'             : 'Verbindung abgebrochen.',
			'errTimeout'           : 'Zeitüberschreitung der Verbindung.',
			'errNotFound'          : 'Backend nicht gefunden.',
			'errResponse'          : 'Ungültige Backend-Antwort.',
			'errConf'              : 'Ungültige Backend-Konfiguration.',
			'errJSON'              : 'PHP JSON-Modul nicht vorhanden.',
			'errNoVolumes'         : 'Keine lesbaren Laufwerke vorhanden.',
			'errCmdParams'         : 'Ungültige Parameter für Befehl: "$1".',
			'errDataNotJSON'       : 'Daten nicht im JSON-Format.',
			'errDataEmpty'         : 'Daten sind leer.',
			'errCmdReq'            : 'Backend-Anfrage benötigt Befehl.',
			'errOpen'              : 'Kann "$1" nicht öffnen.',
			'errNotFolder'         : 'Objekt ist kein Ordner.',
			'errNotFile'           : 'Objekt ist keine Datei.',
			'errRead'              : 'Kann "$1" nicht öffnen.',
			'errWrite'             : 'Kann nicht in "$1" schreiben.',
			'errPerm'              : 'Zugriff verweigert.',
			'errLocked'            : '"$1" ist gesperrt und kann nicht umbenannt, verschoben oder gelöscht werden.',
			'errExists'            : 'Die Datei "$1" existiert bereits.',
			'errInvName'           : 'Ungültiger Dateiname.',
			'errInvDirname'        : 'Ungültiger Ordnername.',  // from v2.1.24 added 12.4.2017
			'errFolderNotFound'    : 'Ordner nicht gefunden.',
			'errFileNotFound'      : 'Datei nicht gefunden.',
			'errTrgFolderNotFound' : 'Zielordner "$1" nicht gefunden.',
			'errPopup'             : 'Der Browser hat das Pop-Up-Fenster unterbunden. Um die Datei zu öffnen, Pop-Ups in den Browsereinstellungen aktivieren.',
			'errMkdir'             : 'Kann Ordner "$1" nicht erstellen.',
			'errMkfile'            : 'Kann Datei "$1" nicht erstellen.',
			'errRename'            : 'Kann "$1" nicht umbenennen.',
			'errCopyFrom'          : 'Kopieren von Dateien von "$1" nicht erlaubt.',
			'errCopyTo'            : 'Kopieren von Dateien nach "$1" nicht erlaubt.',
			'errMkOutLink'         : 'Der Link kann nicht außerhalb der Partition führen.', // from v2.1 added 03.10.2015
			'errUpload'            : 'Upload-Fehler.',  // old name - errUploadCommon
			'errUploadFile'        : 'Kann "$1" nicht hochladen.', // old name - errUpload
			'errUploadNoFiles'     : 'Keine Dateien zum Hochladen gefunden.',
			'errUploadTotalSize'   : 'Gesamtgröße überschreitet die Maximalgröße.', // old name - errMaxSize
			'errUploadFileSize'    : 'Die Datei überschreitet die Maximalgröße.', //  old name - errFileMaxSize
			'errUploadMime'        : 'Dateiart (mime) nicht zulässig.',
			'errUploadTransfer'    : '"$1" Übertragungsfehler.',
			'errUploadTemp'        : 'Kann temporäre Datei nicht erstellen.', // from v2.1 added 26.09.2015
			'errNotReplace'        : 'Das Objekt "$1" existiert bereits an dieser Stelle und kann nicht durch ein Objekt eines anderen Typs ersetzt werden.', // new
			'errReplace'           : 'Kann "$1" nicht ersetzen.',
			'errSave'              : 'Kann "$1" nicht speichern.',
			'errCopy'              : 'Kann "$1" nicht kopieren.',
			'errMove'              : 'Kann "$1" nicht verschieben.',
			'errCopyInItself'      : '"$1" kann sich nicht in sich selbst kopieren.',
			'errRm'                : 'Kann "$1" nicht entfernen.',
			'errTrash'             : 'Kann Objekt nicht in Mülleimer legen.', // from v2.1.24 added 30.4.2017
			'errRmSrc'             : 'Kann Quelldatei(en) nicht entfernen.',
			'errExtract'           : 'Kann "$1" nicht entpacken.',
			'errArchive'           : 'Archiv konnte nicht erstellt werden.',
			'errArcType'           : 'Archivtyp nicht untersützt.',
			'errNoArchive'         : 'Bei der Datei handelt es sich nicht um ein Archiv, oder die Archivart wird nicht unterstützt.',
			'errCmdNoSupport'      : 'Das Backend unterstützt diesen Befehl nicht.',
			'errReplByChild'       : 'Der Ordner "$1" kann nicht durch etwas ersetzt werden, das ihn selbst enthält.',
			'errArcSymlinks'       : 'Aus Sicherheitsgründen ist es verboten, ein Archiv mit symbolischen Links zu extrahieren.', // edited 24.06.2012
			'errArcMaxSize'        : 'Die Archivdateien übersteigen die maximal erlaubte Größe.',
			'errResize'            : 'Größe von "$1" kann nicht geändert werden.',
			'errResizeDegree'      : 'Ungültiger Rotationswert.',  // added 7.3.2013
			'errResizeRotate'      : 'Bild konnte nicht gedreht werden.',  // added 7.3.2013
			'errResizeSize'        : 'Ungültige Bildgröße.',  // added 7.3.2013
			'errResizeNoChange'    : 'Bildmaße nicht geändert.',  // added 7.3.2013
			'errUsupportType'      : 'Nicht unterstützte Dateiart.',
			'errNotUTF8Content'    : 'Die Datei "$1" ist nicht im UTF-8-Format und kann nicht bearbeitet werden.',  // added 9.11.2011
			'errNetMount'          : 'Verbindung mit "$1" nicht möglich.', // added 17.04.2012
			'errNetMountNoDriver'  : 'Nicht unterstütztes Protokoll.',     // added 17.04.2012
			'errNetMountFailed'    : 'Verbindung fehlgeschlagen.',         // added 17.04.2012
			'errNetMountHostReq'   : 'Host benötigt.', // added 18.04.2012
			'errSessionExpires'    : 'Diese Sitzung ist aufgrund von Inaktivität abgelaufen.',
			'errCreatingTempDir'   : 'Erstellung des temporären Ordners nicht möglich: "$1"',
			'errFtpDownloadFile'   : 'Download der Datei über FTP nicht möglich: "$1"',
			'errFtpUploadFile'     : 'Upload der Datei zu FTP nicht möglich: "$1"',
			'errFtpMkdir'          : 'Erstellung des Remote-Ordners mit FTP nicht möglich: "$1"',
			'errArchiveExec'       : 'Fehler beim Archivieren der Dateien: "$1"',
			'errExtractExec'       : 'Fehler beim Extrahieren der Dateien: "$1"',
			'errNetUnMount'        : 'Kann nicht ausgehängt werden.', // from v2.1 added 30.04.2012
			'errConvUTF8'          : 'Kann nicht zu UTF-8 konvertiert werden.', // from v2.1 added 08.04.2014
			'errFolderUpload'      : 'Ordner kann nich hochladen werden, eventuell mit Google Chrome versuchen.', // from v2.1 added 26.6.2015
			'errSearchTimeout'     : 'Zeitüberschreitung während der Suche nach "$1". Suchergebnis ist unvollständig.', // from v2.1 added 12.1.2016
			'errReauthRequire'     : 'Erneutes Anmelden ist erforderlich.', // from v2.1.10 added 24.3.2016
			'errMaxTargets'        : 'Die maximale Anzahl auswählbarer Elemente ist $1', // from v2.1.17 added 17.10.2016
			'errRestore'           : 'Datei konnte nicht aus Mülleimer wieder hergestellt werden bzw. Ziel für Wiederherstellung nicht gefunden.', // from v2.1.24 added 3.5.2017
			'errEditorNotFound'    : 'Kein Editor für diesen Dateityp gefunden.', // from v2.1.25 added 23.5.2017
			'errServerError'       : 'Ein serverseitiger Fehler trat auf.', // from v2.1.25 added 16.6.2017
			'errEmpty'             : 'Konnte Ordner "$1" nicht Leeren.', // from v2.1.25 added 22.6.2017
			'moreErrors'           : 'Es sind noch $1 weitere Fehler.', // from v2.1.44 added 9.12.2018
			'errMaxMkdirs'         : 'Sie können bis zu $1 Ordner gleichzeitig erstellen.', // from v2.1.58 added 20.6.2021

			/******************************* commands names ********************************/
			'cmdarchive'   : 'Archiv erstellen',
			'cmdback'      : 'Zurück',
			'cmdcopy'      : 'Kopieren',
			'cmdcut'       : 'Ausschneiden',
			'cmddownload'  : 'Herunterladen',
			'cmdduplicate' : 'Duplizieren',
			'cmdedit'      : 'Datei bearbeiten',
			'cmdextract'   : 'Archiv entpacken',
			'cmdforward'   : 'Vorwärts',
			'cmdgetfile'   : 'Datei auswählen',
			'cmdhelp'      : 'Über diese Software',
			'cmdhome'      : 'Startordner',
			'cmdinfo'      : 'Informationen',
			'cmdmkdir'     : 'Neuer Ordner',
			'cmdmkdirin'   : 'In neuen Ordner', // from v2.1.7 added 19.2.2016
			'cmdmkfile'    : 'Neuer Datei',
			'cmdopen'      : 'Öffnen',
			'cmdpaste'     : 'Einfügen',
			'cmdquicklook' : 'Vorschau',
			'cmdreload'    : 'Aktualisieren',
			'cmdrename'    : 'Umbenennen',
			'cmdrm'        : 'Löschen',
			'cmdtrash'     : 'In den Mülleimer legen', //from v2.1.24 added 29.4.2017
			'cmdrestore'   : 'Wiederherstellen', //from v2.1.24 added 3.5.2017
			'cmdsearch'    : 'Suchen',
			'cmdup'        : 'In übergeordneten Ordner wechseln',
			'cmdupload'    : 'Datei hochladen',
			'cmdview'      : 'Ansehen',
			'cmdresize'    : 'Größe ändern & drehen',
			'cmdsort'      : 'Sortieren',
			'cmdnetmount'  : 'Verbinde mit Netzwerkspeicher', // added 18.04.2012
			'cmdnetunmount': 'Abhängen', // from v2.1 added 30.04.2012
			'cmdplaces'    : 'Favoriten', // added 28.12.2014
			'cmdchmod'     : 'Berechtigung ändern', // from v2.1 added 20.6.2015
			'cmdopendir'   : 'Einen Ordner öffnen', // from v2.1 added 13.1.2016
			'cmdcolwidth'  : 'Spaltenbreite zurücksetzen', // from v2.1.13 added 12.06.2016
			'cmdfullscreen': 'Vollbild', // from v2.1.15 added 03.08.2016
			'cmdmove'      : 'Verschieben', // from v2.1.15 added 21.08.2016
			'cmdempty'     : 'Ordner Leeren', // from v2.1.25 added 22.06.2017
			'cmdundo'      : 'Rückgängig', // from v2.1.27 added 31.07.2017
			'cmdredo'      : 'Wiederholen', // from v2.1.27 added 31.07.2017
			'cmdpreference': 'Einstellungen', // from v2.1.27 added 03.08.2017
			'cmdselectall' : 'Alle auswählen', // from v2.1.28 added 15.08.2017
			'cmdselectnone': 'Keine auswählen', // from v2.1.28 added 15.08.2017
			'cmdselectinvert': 'Auswahl rückgängig machen', // from v2.1.28 added 15.08.2017
			'cmdopennew'   : 'In neuem Fenster öffnen', // from v2.1.38 added 3.4.2018
			'cmdhide'      : 'Verstecken', // from v2.1.41 added 24.7.2018

			/*********************************** buttons ***********************************/
			'btnClose'  : 'Schließen',
			'btnSave'   : 'Speichern',
			'btnRm'     : 'Entfernen',
			'btnApply'  : 'Anwenden',
			'btnCancel' : 'Abbrechen',
			'btnNo'     : 'Nein',
			'btnYes'    : 'Ja',
			'btnMount'  : 'Verbinden',  // added 18.04.2012
			'btnApprove': 'Gehe zu $1 und genehmige', // from v2.1 added 26.04.2012
			'btnUnmount': 'Auswerfen', // from v2.1 added 30.04.2012
			'btnConv'   : 'Konvertieren', // from v2.1 added 08.04.2014
			'btnCwd'    : 'Arbeitspfad',      // from v2.1 added 22.5.2015
			'btnVolume' : 'Partition',    // from v2.1 added 22.5.2015
			'btnAll'    : 'Alle',       // from v2.1 added 22.5.2015
			'btnMime'   : 'MIME-Typ', // from v2.1 added 22.5.2015
			'btnFileName':'Dateiname',  // from v2.1 added 22.5.2015
			'btnSaveClose': 'Speichern & Schließen', // from v2.1 added 12.6.2015
			'btnBackup' : 'Sicherung', // fromv2.1 added 28.11.2015
			'btnRename'    : 'Umbenennen',      // from v2.1.24 added 6.4.2017
			'btnRenameAll' : 'Alle Umbenennen', // from v2.1.24 added 6.4.2017
			'btnPrevious' : 'Zurück ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnNext'     : 'Weiter ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnSaveAs'   : 'Speichern als', // from v2.1.25 added 24.5.2017

			/******************************** notifications ********************************/
			'ntfopen'     : 'Öffne Ordner',
			'ntffile'     : 'Öffne Datei',
			'ntfreload'   : 'Ordnerinhalt neu',
			'ntfmkdir'    : 'Erstelle Ordner',
			'ntfmkfile'   : 'Erstelle Dateien',
			'ntfrm'       : 'Lösche Dateien',
			'ntfcopy'     : 'Kopiere Dateien',
			'ntfmove'     : 'Verschiebe Dateien',
			'ntfprepare'  : 'Kopiervorgang initialisieren',
			'ntfrename'   : 'Benenne Dateien um',
			'ntfupload'   : 'Dateien hochladen',
			'ntfdownload' : 'Dateien herunterladen',
			'ntfsave'     : 'Speichere Datei',
			'ntfarchive'  : 'Erstelle Archiv',
			'ntfextract'  : 'Entpacke Dateien',
			'ntfsearch'   : 'Suche',
			'ntfresize'   : 'Bildgrößen ändern',
			'ntfsmth'     : 'Bin beschäftigt ..',
			'ntfloadimg'  : 'Lade Bild ..',
			'ntfnetmount' : 'Mit Netzwerkspeicher verbinden', // added 18.04.2012
			'ntfnetunmount': 'Netzwerkspeicher auswerfen', // from v2.1 added 30.04.2012
			'ntfdim'      : 'Bildgröße erfassen', // added 20.05.2013
			'ntfreaddir'  : 'Lese Ordnerinformationen', // from v2.1 added 01.07.2013
			'ntfurl'      : 'Hole URL von Link', // from v2.1 added 11.03.2014
			'ntfchmod'    : 'Ändere Dateiberechtigungen', // from v2.1 added 20.6.2015
			'ntfpreupload': 'Upload-Dateinamen überprüfen', // from v2.1 added 31.11.2015
			'ntfzipdl'    : 'Erstelle Datei zum Download', // from v2.1.7 added 23.1.2016
			'ntfparents'  : 'Beziehe Pfad Informationen', // from v2.1.17 added 2.11.2016
			'ntfchunkmerge': 'Upload läuft', // from v2.1.17 added 2.11.2016
			'ntftrash'    : 'Bewege in den Mülleimer', // from v2.1.24 added 2.5.2017
			'ntfrestore'  : 'Wiederherstellung aus Mülleimer', // from v2.1.24 added 3.5.2017
			'ntfchkdir'   : 'Prüfe Zielordner', // from v2.1.24 added 3.5.2017
			'ntfundo'     : 'Vorherige Operation rückgängig machen', // from v2.1.27 added 31.07.2017
			'ntfredo'     : 'Wiederherstellen', // from v2.1.27 added 31.07.2017
			'ntfchkcontent' : 'Überprüfe Inhalte', // from v2.1.41 added 3.8.2018

			/*********************************** volumes *********************************/
			'volume_Trash' : 'Mülleimer', //from v2.1.24 added 29.4.2017

			/************************************ dates **********************************/
			'dateUnknown' : 'unbekannt',
			'Today'       : 'Heute',
			'Yesterday'   : 'Gestern',
			'msJan'       : 'Januar',
			'msFeb'       : 'Februar',
			'msMar'       : 'Mär',
			'msApr'       : 'Apr',
			'msMay'       : 'Mai',
			'msJun'       : 'Juni',
			'msJul'       : 'Juli',
			'msAug'       : 'Aug',
			'msSep'       : 'Sep',
			'msOct'       : 'Okt',
			'msNov'       : 'Nov',
			'msDec'       : 'Dez',
			'January'     : 'Januar',
			'February'    : 'Februar',
			'March'       : 'März',
			'April'       : 'April',
			'May'         : 'Mai',
			'June'        : 'Juni',
			'July'        : 'Juli',
			'August'      : 'August',
			'September'   : 'September',
			'October'     : 'Oktober',
			'November'    : 'November',
			'December'    : 'Dezember',
			'Sunday'      : 'Sonntag',
			'Monday'      : 'Montag',
			'Tuesday'     : 'Dienstag',
			'Wednesday'   : 'Mittwoch',
			'Thursday'    : 'Donnerstag',
			'Friday'      : 'Freitag',
			'Saturday'    : 'Samstag',
			'Sun'         : 'So',
			'Mon'         : 'Mo',
			'Tue'         : 'Di',
			'Wed'         : 'Mi',
			'Thu'         : 'Do',
			'Fri'         : 'Fr',
			'Sat'         : 'Sa',

			/******************************** sort variants ********************************/
			'sortname'          : 'nach Name',
			'sortkind'          : 'nach Art',
			'sortsize'          : 'nach Größe',
			'sortdate'          : 'nach Datum',
			'sortFoldersFirst'  : 'Ordner zuerst',
			'sortperm'          : 'nach Berechtigung', // from v2.1.13 added 13.06.2016
			'sortmode'          : 'nach Modus',       // from v2.1.13 added 13.06.2016
			'sortowner'         : 'nach Besitzer',      // from v2.1.13 added 13.06.2016
			'sortgroup'         : 'nach Gruppe',      // from v2.1.13 added 13.06.2016
			'sortAlsoTreeview'  : 'auch Baumansicht',  // from v2.1.15 added 01.08.2016

			/********************************** new items **********************************/
			'untitled file.txt' : 'Neues Textdokument.txt', // added 10.11.2015
			'untitled folder'   : 'Neuer Ordner',   // added 10.11.2015
			'Archive'           : 'Neues Archiv',  // from v2.1 added 10.11.2015
			'untitled file'     : 'Neue Datei.$1',  // from v2.1.41 added 6.8.2018
			'extentionfile'     : '$1: Datei',    // from v2.1.41 added 6.8.2018
			'extentiontype'     : '$1: $2',      // from v2.1.43 added 17.10.2018

			/********************************** messages **********************************/
			'confirmReq'      : 'Bestätigung benötigt',
			'confirmRm'       : 'Sollen die Dateien gelöscht werden?<br>Vorgang ist endgültig!',
			'confirmRepl'     : 'Datei ersetzen?',
			'confirmRest'     : 'Vorhandenes Element durch das Element aus Mülleimer ersetzen?', // fromv2.1.24 added 5.5.2017
			'confirmConvUTF8' : 'Nicht UTF-8 kodiert<br>Zu UTF-8 konvertieren?<br>Inhalte werden zu UTF-8 konvertiert bei Speicherung.', // from v2.1 added 08.04.2014
			'confirmNonUTF8'  : 'Die Zeichencodierung dieser Datei konnte nicht erkannt werden. Es muss vorübergehend in UTF-8 zur Bearbeitung konvertiert werden.<br> Bitte eine Zeichenkodierung dieser Datei auswählen.', // from v2.1.19 added 28.11.2016
			'confirmNotSave'  : 'Die Datei wurde geändert.<br>Änderungen gehen verloren wenn nicht gespeichert wird.', // from v2.1 added 15.7.2015
			'confirmTrash'    : 'Sicher diese Elemente in den Mülleimer verschieben?', //from v2.1.24 added 29.4.2017
			'confirmMove'     : 'Sicher alle Elemente nach "$1" verschieben?', //from v2.1.50 added 27.7.2019
			'apllyAll'        : 'Alles bestätigen',
			'name'            : 'Name',
			'size'            : 'Größe',
			'perms'           : 'Berechtigungen',
			'modify'          : 'Geändert',
			'kind'            : 'Typ',
			'read'            : 'Lesen',
			'write'           : 'Schreiben',
			'noaccess'        : 'Kein Zugriff',
			'and'             : 'und',
			'unknown'         : 'unbekannt',
			'selectall'       : 'Alle Dateien auswählen',
			'selectfiles'     : 'Dateien auswählen',
			'selectffile'     : 'Erste Datei auswählen',
			'selectlfile'     : 'Letzte Datei auswählen',
			'viewlist'        : 'Spaltenansicht',
			'viewicons'       : 'Symbolansicht',
			'viewSmall'       : 'Kleine Icons', // from v2.1.39 added 22.5.2018
			'viewMedium'      : 'Medium Icons', // from v2.1.39 added 22.5.2018
			'viewLarge'       : 'Große Icons', // from v2.1.39 added 22.5.2018
			'viewExtraLarge'  : 'Extragroße Icons', // from v2.1.39 added 22.5.2018
			'places'          : 'Favoriten',
			'calc'            : 'Berechne',
			'path'            : 'Pfad',
			'aliasfor'        : 'Verknüpfung zu',
			'locked'          : 'Gesperrt',
			'dim'             : 'Bildgröße',
			'files'           : 'Dateien',
			'folders'         : 'Ordner',
			'items'           : 'Objekte',
			'yes'             : 'ja',
			'no'              : 'nein',
			'link'            : 'Link',
			'searcresult'     : 'Suchergebnisse',
			'selected'        : 'Objekte ausgewählt',
			'about'           : 'Über',
			'shortcuts'       : 'Tastenkombinationen',
			'help'            : 'Hilfe',
			'webfm'           : 'Web-Dateiverwaltung',
			'ver'             : 'Fassung',
			'protocolver'     : 'Protokoll-Version',
			'homepage'        : 'Projekt-Webseite',
			'docs'            : 'Dokumentation',
			'github'          : 'Forke uns auf Github',
			'twitter'         : 'Folge uns auf twitter',
			'facebook'        : 'Begleite uns auf facebook',
			'team'            : 'Mannschaft',
			'chiefdev'        : 'Chefentwickler',
			'developer'       : 'Entwickler',
			'contributor'     : 'Unterstützer',
			'maintainer'      : 'Maintainer',
			'translator'      : 'Übersetzer',
			'icons'           : 'Symbole',
			'dontforget'      : 'und vergiss nicht .. morgen ist auch noch ein Tag ..',
			'shortcutsof'     : 'Tastenkombinationen deaktiviert',
			'dropFiles'       : 'Dateien hier ablegen',
			'or'              : 'oder',
			'selectForUpload' : 'Dateien zum Upload auswählen',
			'moveFiles'       : 'Dateien verschieben',
			'copyFiles'       : 'Dateien kopieren',
			'restoreFiles'    : 'Elemente wiederherstellen', // from v2.1.24 added 5.5.2017
			'rmFromPlaces'    : 'Lösche von Favoriten',
			'aspectRatio'     : 'Seitenverhältnis',
			'scale'           : 'Maßstab',
			'width'           : 'Breite',
			'height'          : 'Höhe',
			'resize'          : 'Größe ändern',
			'crop'            : 'Zuschneiden',
			'rotate'          : 'Drehen',
			'rotate-cw'       : 'Drehe 90° im Uhrzeigersinn',
			'rotate-ccw'      : 'Drehe 90° gegen Uhrzeigersinn',
			'degree'          : '°',
			'netMountDialogTitle' : 'verbinde Netzwerkspeicher', // added 18.04.2012
			'protocol'            : 'Protokoll', // added 18.04.2012
			'host'                : 'Gastgeber', // added 18.04.2012
			'port'                : 'Hafen', // added 18.04.2012
			'user'                : 'Benutzer', // added 18.04.2012
			'pass'                : 'Passwort', // added 18.04.2012
			'confirmUnmount'      : 'Soll "$1" ausgehängt werden',  // from v2.1 added 30.04.2012
			'dropFilesBrowser': 'Dateien in den Browser ziehen', // from v2.1 added 30.05.2012
			'dropPasteFiles'  : 'Dateien hier loslassen', // from v2.1 added 07.04.2014
			'encoding'        : 'Kodierung', // from v2.1 added 19.12.2014
			'locale'          : 'Lokal',   // from v2.1 added 19.12.2014
			'searchTarget'    : 'Ziel: $1',                // from v2.1 added 22.5.2015
			'searchMime'      : 'Suche nach MIME-Typ', // from v2.1 added 22.5.2015
			'owner'           : 'Besitzer', // from v2.1 added 20.6.2015
			'group'           : 'Gruppe', // from v2.1 added 20.6.2015
			'other'           : 'Andere', // from v2.1 added 20.6.2015
			'execute'         : 'Ausführen', // from v2.1 added 20.6.2015
			'perm'            : 'Berechtigung', // from v2.1 added 20.6.2015
			'mode'            : 'Modus', // from v2.1 added 20.6.2015
			'emptyFolder'     : 'Der Ordner ist leer', // from v2.1.6 added 30.12.2015
			'emptyFolderDrop' : 'Der Ordner ist leer\\A Elemente durch Ziehen hinzufügen', // from v2.1.6 added 30.12.2015
			'emptyFolderLTap' : 'Der Ordner ist leer\\A Elemente durch langes Tippen hinzufügen', // from v2.1.6 added 30.12.2015
			'quality'         : 'Qualität', // from v2.1.6 added 5.1.2016
			'autoSync'        : 'Automatische Synchronisation',  // from v2.1.6 added 10.1.2016
			'moveUp'          : 'Nach oben bewegen',  // from v2.1.6 added 18.1.2016
			'getLink'         : 'URL-Link holen', // from v2.1.7 added 9.2.2016
			'selectedItems'   : 'Ausgewählte Objekte ($1)', // from v2.1.7 added 2.19.2016
			'folderId'        : 'Ordner-ID', // from v2.1.10 added 3.25.2016
			'offlineAccess'   : 'Offline-Zugriff erlauben', // from v2.1.10 added 3.25.2016
			'reAuth'          : 'Erneut anmelden', // from v2.1.10 added 3.25.2016
			'nowLoading'      : 'Wird geladen...', // from v2.1.12 added 4.26.2016
			'openMulti'       : 'mehrere Dateien öffnen', // from v2.1.12 added 5.14.2016
			'openMultiConfirm': 'Es wird versucht die $1 Dateien zu öffnen .. sicher im Browser öffnen?', // from v2.1.12 added 5.14.2016
			'emptySearch'     : 'Kein Suchergebnis', // from v2.1.12 added 5.16.2016
			'editingFile'     : 'Datei wird bearbeitet.', // from v2.1.13 added 6.3.2016
			'hasSelected'     : '$1 Objekt(e) ausgewählt.', // from v2.1.13 added 6.3.2016
			'hasClipboard'    : '$1 Objekte im Clipboard.', // from v2.1.13 added 6.3.2016
			'incSearchOnly'   : 'Inkrementelle Suche bezieht sich nur auf die aktuelle Ansicht.', // from v2.1.13 added 6.30.2016
			'reinstate'       : 'Wiederherstellen', // from v2.1.15 added 3.8.2016
			'complete'        : '$1 abgeschlossen', // from v2.1.15 added 21.8.2016
			'contextmenu'     : 'Kontextmenü', // from v2.1.15 added 9.9.2016
			'pageTurning'     : 'Seite umblättern', // from v2.1.15 added 10.9.2016
			'volumeRoots'     : 'Volume-Rootverzeichnisse', // from v2.1.16 added 16.9.2016
			'reset'           : 'Neustart', // from v2.1.16 added 1.10.2016
			'bgcolor'         : 'Hintergrund Farbe', // from v2.1.16 added 1.10.2016
			'colorPicker'     : 'Farbauswahl', // from v2.1.16 added 1.10.2016
			'8pxgrid'         : '8px Raster', // from v2.1.16 added 4.10.2016
			'enabled'         : 'Ein', // from v2.1.16 added 4.10.2016
			'disabled'        : 'Aus', // from v2.1.16 added 4.10.2016
			'emptyIncSearch'  : 'Keine Ergebnisse in der aktuellen Anzeige', // from v2.1.16 added 5.10.2016
			'emptyLetSearch'  : 'Die Ergebnisse der ersten Buchstabensuche sind in der aktuellen Ansicht leer.', // from v2.1.23 added 24.3.2017
			'textLabel'       : 'Text Bezeichnung', // from v2.1.17 added 13.10.2016
			'minsLeft'        : '$1 Minuten übrig', // from v2.1.17 added 13.11.2016
			'openAsEncoding'  : 'Wiedereröffnen mit ausgewählter Codierung', // from v2.1.19 added 2.12.2016
			'saveAsEncoding'  : 'Speichern mit der gewählten Kodierung', // from v2.1.19 added 2.12.2016
			'selectFolder'    : 'Verzeichnis auswählen', // from v2.1.20 added 13.12.2016
			'firstLetterSearch': 'Erster Buchstabe suche', // from v2.1.23 added 24.3.2017
			'presets'         : 'Voreinstellungen', // from v2.1.25 added 26.5.2017
			'tooManyToTrash'  : 'Zu viele Elemente auf einmal für den Mülleimer.', // from v2.1.25 added 9.6.2017
			'TextArea'        : 'Textbereich', // from v2.1.25 added 14.6.2017
			'folderToEmpty'   : 'Leere Ordner "$1".', // from v2.1.25 added 22.6.2017
			'filderIsEmpty'   : 'Es befinden sich keine Elemente im Ordner "$1".', // from v2.1.25 added 22.6.2017
			'preference'      : 'Einstellungen', // from v2.1.26 added 28.6.2017
			'language'        : 'Spracheinstellungen', // from v2.1.26 added 28.6.2017
			'clearBrowserData': 'Initialisiere die Einstellungen, welche in diesem Browser gespeichert sind', // from v2.1.26 added 28.6.2017
			'toolbarPref'     : 'Toolbareinstellung', // from v2.1.27 added 2.8.2017
			'charsLeft'       : '... $1 Zeichen übrig',  // from v2.1.29 added 30.8.2017
			'linesLeft'       : '... $1 Zeilen übrig.',  // from v2.1.52 added 16.1.2020
			'sum'             : 'Summe', // from v2.1.29 added 28.9.2017
			'roughFileSize'   : 'Ungefähre Dateigröße', // from v2.1.30 added 2.11.2017
			'autoFocusDialog' : 'Fokussierung auf das Element Dialog mit Mouseover',  // from v2.1.30 added 2.11.2017
			'select'          : 'Auswählen', // from v2.1.30 added 23.11.2017
			'selectAction'    : 'Aktion bei der Auswahl der Datei', // from v2.1.30 added 23.11.2017
			'useStoredEditor' : 'Öffnen mit dem zuletzt verwendeten Editor', // from v2.1.30 added 23.11.2017
			'selectinvert'    : 'Auswahl umkehren', // from v2.1.30 added 25.11.2017
			'renameMultiple'  : 'Sicher $1 ausgewählte Elemente in $2 umbenennen?<br>Rückgängig nicht möglich!', // from v2.1.31 added 4.12.2017
			'batchRename'     : 'Stapelumbenennung', // from v2.1.31 added 8.12.2017
			'plusNumber'      : '+ Nummer', // from v2.1.31 added 8.12.2017
			'asPrefix'        : 'Vorzeichen hinzufügen', // from v2.1.31 added 8.12.2017
			'asSuffix'        : 'Nachzeichen hinzufügen', // from v2.1.31 added 8.12.2017
			'changeExtention' : 'Erweiterung ändern', // from v2.1.31 added 8.12.2017
			'columnPref'      : 'Spalteneinstellungen (Listenansicht)', // from v2.1.32 added 6.2.2018
			'reflectOnImmediate' : 'Alle Änderungen werden sofort im Archiv angewendet.', // from v2.1.33 added 2.3.2018
			'reflectOnUnmount'   : 'Alle Änderungen werden nicht angewendet bis dieses Volume entfernt wird.', // from v2.1.33 added 2.3.2018
			'unmountChildren' : 'Die folgenden Datenträger, die auf diesem Datenträger eingehängt sind, werden ebenfalls ausgehängt. Sicher dass alle aushängt werden sollen?', // from v2.1.33 added 5.3.2018
			'selectionInfo'   : 'Auswahl Info', // from v2.1.33 added 7.3.2018
			'hashChecker'     : 'Datei-Hash-Algorithmen', // from v2.1.33 added 10.3.2018
			'infoItems'       : 'Info-Elemente (Auswahl-Info-Panel)', // from v2.1.38 added 28.3.2018
			'pressAgainToExit': 'Drücken Sie erneut, um zu beenden.', // from v2.1.38 added 1.4.2018
			'toolbar'         : 'Symbolleiste', // from v2.1.38 added 4.4.2018
			'workspace'       : 'Arbeitsplatz', // from v2.1.38 added 4.4.2018
			'dialog'          : 'Dialog', // from v2.1.38 added 4.4.2018
			'all'             : 'Alle', // from v2.1.38 added 4.4.2018
			'iconSize'        : 'Icongröße (Symbolansicht)', // from v2.1.39 added 7.5.2018
			'editorMaximized' : 'Öffne Editorfenster in voller Größe', // from v2.1.40 added 30.6.2018
			'editorConvNoApi' : 'Aktuell keine API zur Bearbeitung verfügbar, bitte auf Webseite bearbeiten', //from v2.1.40 added 8.7.2018
			'editorConvNeedUpload' : 'Um zu speichern nach der Bearbeitung Element entweder mit URL hochladen oder mit herunter geladener Datei', //from v2.1.40 added 8.7.2018
			'convertOn'       : 'Bearbeiten auf Seite $1', // from v2.1.40 added 10.7.2018
			'integrations'    : 'Integrationen', // from v2.1.40 added 11.7.2018
			'integrationWith' : 'Diese Software hat folgende externe Dienste integriert. Vor Anwendung bitte die jeweiligen Nutzungsbedingungen usw. beachten', // from v2.1.40 added 11.7.2018
			'showHidden'      : 'Zeige versteckte Elemente', // from v2.1.41 added 24.7.2018
			'hideHidden'      : 'Verberge versteckte Elemente', // from v2.1.41 added 24.7.2018
			'toggleHidden'    : 'Zeige/Verberge versteckte Elemente', // from v2.1.41 added 24.7.2018
			'makefileTypes'   : 'Dateiarten bei "Neue Datei" aktivieren', // from v2.1.41 added 7.8.2018
			'typeOfTextfile'  : 'Art der Textdatei', // from v2.1.41 added 7.8.2018
			'add'             : 'Neu', // from v2.1.41 added 7.8.2018
			'theme'           : 'Thema', // from v2.1.43 added 19.10.2018
			'default'         : 'Standard', // from v2.1.43 added 19.10.2018
			'description'     : 'Beschreibung', // from v2.1.43 added 19.10.2018
			'website'         : 'Webseite', // from v2.1.43 added 19.10.2018
			'author'          : 'Autor', // from v2.1.43 added 19.10.2018
			'email'           : 'Email', // from v2.1.43 added 19.10.2018
			'license'         : 'Lizenz', // from v2.1.43 added 19.10.2018
			'exportToSave'    : 'Dieses Element kann nicht gespeichert werden. Um Änderungen nicht zu verlieren, muss es auf den lokalen PC exportiert werden', // from v2.1.44 added 1.12.2018
			'dblclickToSelect': 'Doppelt auf Datei klicken um auszuwählen', // from v2.1.47 added 22.1.2019
			'useFullscreen'   : 'Gesamter Bildschirm', // from v2.1.47 added 19.2.2019

			/********************************** mimetypes **********************************/
			'kindUnknown'     : 'Unbekannt',
			'kindRoot'        : 'Stammverzeichnis', // from v2.1.16 added 16.10.2016
			'kindFolder'      : 'Ordner',
			'kindSelects'     : 'Auswahlkriterien', // from v2.1.29 added 29.8.2017
			'kindAlias'       : 'Verknüpfung',
			'kindAliasBroken' : 'Defekte Verknüpfung',
			// applications
			'kindApp'         : 'Programm',
			'kindPostscript'  : 'Postscript-Dokument',
			'kindMsOffice'    : 'MS Office-Dokument',
			'kindMsWord'      : 'MS Word-Dokument',
			'kindMsExcel'     : 'MS Excel-Dokument',
			'kindMsPP'        : 'MS Powerpoint-Präsentation',
			'kindOO'          : 'Open Office-Dokument',
			'kindAppFlash'    : 'Flash',
			'kindPDF'         : 'Portables Dokumentenformat (PDF)',
			'kindTorrent'     : 'Bittorrent-Datei',
			'kind7z'          : '7z-Archiv',
			'kindTAR'         : 'TAR-Archiv',
			'kindGZIP'        : 'GZIP-Archiv',
			'kindBZIP'        : 'BZIP-Archiv',
			'kindXZ'          : 'XZ-Archiv',
			'kindZIP'         : 'ZIP-Archiv',
			'kindRAR'         : 'RAR-Archiv',
			'kindJAR'         : 'Java JAR-Datei',
			'kindTTF'         : 'True Type-Schrift',
			'kindOTF'         : 'Open Type-Schrift',
			'kindRPM'         : 'RPM-Paket',
			// texts
			'kindText'        : 'Text-Dokument',
			'kindTextPlain'   : 'Text-Dokument',
			'kindPHP'         : 'PHP-Quelltext',
			'kindCSS'         : 'CSS Stilvorlage',
			'kindHTML'        : 'HTML-Dokument',
			'kindJS'          : 'Javascript-Quelltext',
			'kindRTF'         : 'Formatierte Textdatei',
			'kindC'           : 'C-Quelltext',
			'kindCHeader'     : 'C Header-Quelltext',
			'kindCPP'         : 'C++ Quelltext',
			'kindCPPHeader'   : 'C++ Header-Quelltext',
			'kindShell'       : 'Unix-Shell-Skript',
			'kindPython'      : 'Python-Quelltext',
			'kindJava'        : 'Java-Quelltext',
			'kindRuby'        : 'Ruby-Quelltext',
			'kindPerl'        : 'Perl Script',
			'kindSQL'         : 'SQL-Quelltext',
			'kindXML'         : 'XML-Dokument',
			'kindAWK'         : 'AWK-Quelltext',
			'kindCSV'         : 'Kommagetrennte Daten',
			'kindDOCBOOK'     : 'Docbook XML-Dokument',
			'kindMarkdown'    : 'Markdown-Text', // added 20.7.2015
			// images
			'kindImage'       : 'Bild',
			'kindBMP'         : 'Bitmap-Bild',
			'kindJPEG'        : 'JPEG-Bild',
			'kindGIF'         : 'GIF-Bild',
			'kindPNG'         : 'PNG-Bild',
			'kindTIFF'        : 'TIFF-Bild',
			'kindTGA'         : 'TGA-Bild',
			'kindPSD'         : 'Adobe Photoshop-Dokument',
			'kindXBITMAP'     : 'X Bitmap-Bild',
			'kindPXM'         : 'Pixelmator-Bild',
			// media
			'kindAudio'       : 'Audiodatei',
			'kindAudioMPEG'   : 'MPEG Audio',
			'kindAudioMPEG4'  : 'MPEG-4 Audio',
			'kindAudioMIDI'   : 'MIDI Audio',
			'kindAudioOGG'    : 'Ogg Vorbis Audio',
			'kindAudioWAV'    : 'WAV Audio',
			'AudioPlaylist'   : 'MP3-Playlist',
			'kindVideo'       : 'Videodatei',
			'kindVideoDV'     : 'DV Film',
			'kindVideoMPEG'   : 'MPEG Film',
			'kindVideoMPEG4'  : 'MPEG4 Film',
			'kindVideoAVI'    : 'AVI Film',
			'kindVideoMOV'    : 'QuickTime Film',
			'kindVideoWM'     : 'Windows Media Film',
			'kindVideoFlash'  : 'Flash Film',
			'kindVideoMKV'    : 'Matroska Film',
			'kindVideoOGG'    : 'Ogg Film'
		}
	};
}));js/i18n/elfinder.it.js000064400000104227151215013360010503 0ustar00/**
 * Italiano translation
 * @author Alberto Tocci (alberto.tocci@gmail.com)
 * @author Claudio Nicora (coolsoft.ita@gmail.com)
 * @author Stefano Galeazzi <stefano.galeazzi@probanet.it>
 * @author Thomas Camaran <camaran@gmail.com>
 * @version 2022-03-02
 */
 (function(root, factory) {
	if (typeof define === 'function' && define.amd) {
		define(['elfinder'], factory);
	} else if (typeof exports !== 'undefined') {
		module.exports = factory(require('elfinder'));
	} else {
		factory(root.elFinder);
	}
}(this, function(elFinder) {
	elFinder.prototype.i18.it = {
		translator : 'Alberto Tocci (alberto.tocci@gmail.com), Claudio Nicora (coolsoft.ita@gmail.com), Stefano Galeazzi &lt;stefano.galeazzi@probanet.it&gt;, Thomas Camaran &lt;camaran@gmail.com&gt;',
		language   : 'Italiano',
		direction  : 'ltr',
		dateFormat : 'd/m/Y H:i', // will show like: 02/03/2022 12:52
		fancyDateFormat : '$1 H:i', // will show like: Oggi 12:52
		nonameDateFormat : 'ymd-His', // noname upload will show like: 220302-125236
		messages   : {
			'getShareText' : 'Condividere',
			'Editor ': 'Editor di codice',

			/********************************** errors **********************************/
			'error'                : 'Errore',
			'errUnknown'           : 'Errore sconosciuto.',
			'errUnknownCmd'        : 'Comando sconosciuto.',
			'errJqui'              : 'Configurazione JQuery UI non valida. Devono essere inclusi i plugin Selectable, Draggable e Droppable.',
			'errNode'              : 'elFinder necessita dell\'elemento DOM per essere inizializzato.',
			'errURL'               : 'Configurazione non valida.Il parametro URL non è settato.',
			'errAccess'            : 'Accesso negato.',
			'errConnect'           : 'Impossibile collegarsi al backend.',
			'errAbort'             : 'Connessione annullata.',
			'errTimeout'           : 'Timeout di connessione.',
			'errNotFound'          : 'Backend non trovato.',
			'errResponse'          : 'Risposta non valida dal backend.',
			'errConf'              : 'Configurazione backend non valida.',
			'errJSON'              : 'Modulo PHP JSON non installato.',
			'errNoVolumes'         : 'Non è stato possibile leggere i volumi.',
			'errCmdParams'         : 'Parametri non validi per il comando "$1".',
			'errDataNotJSON'       : 'I dati non sono nel formato JSON.',
			'errDataEmpty'         : 'Stringa vuota.',
			'errCmdReq'            : 'La richiesta al backend richiede il nome del comando.',
			'errOpen'              : 'Impossibile aprire "$1".',
			'errNotFolder'         : 'L\'oggetto non è una cartella..',
			'errNotFile'           : 'L\'oggetto non è un file.',
			'errRead'              : 'Impossibile leggere "$1".',
			'errWrite'             : 'Non è possibile scrivere in "$1".',
			'errPerm'              : 'Permesso negato.',
			'errLocked'            : '"$1" è bloccato e non può essere rinominato, spostato o eliminato.',
			'errExists'            : 'Il file "$1" è già esistente.',
			'errInvName'           : 'Nome file non valido.',
			'errInvDirname'        : 'Nome cartella non valido.',  // from v2.1.24 added 12.4.2017
			'errFolderNotFound'    : 'Cartella non trovata.',
			'errFileNotFound'      : 'File non trovato.',
			'errTrgFolderNotFound' : 'La cartella di destinazione"$1" non è stata trovata.',
			'errPopup'             : 'Il tuo Browser non consente di aprire finestre di pop-up. Per aprire il file abilita questa opzione nelle impostazioni del tuo Browser.',
			'errMkdir'             : 'Impossibile creare la cartella "$1".',
			'errMkfile'            : 'Impossibile creare il file "$1".',
			'errRename'            : 'Impossibile rinominare "$1".',
			'errCopyFrom'          : 'Non è possibile copiare file da "$1".',
			'errCopyTo'            : 'Non è possibile copiare file in "$1".',
			'errMkOutLink'         : 'Impossibile creare un link all\'esterno della radice del volume.', // from v2.1 added 03.10.2015
			'errUpload'            : 'Errore di Caricamento.',  // old name - errUploadCommon
			'errUploadFile'        : 'Impossibile Caricare "$1".', // old name - errUpload
			'errUploadNoFiles'     : 'Non sono stati specificati file da caricare.',
			'errUploadTotalSize'   : 'La dimensione totale dei file supera il limite massimo consentito.', // old name - errMaxSize
			'errUploadFileSize'    : 'Le dimensioni del file superano il massimo consentito.', //  old name - errFileMaxSize
			'errUploadMime'        : 'FileType non consentito.',
			'errUploadTransfer'    : 'Trasferimento errato del file "$1".',
			'errUploadTemp'        : 'Impossibile creare il file temporaneo per l\'upload.', // from v2.1 added 26.09.2015
			'errNotReplace'        : 'L\'oggetto "$1" esiste già in questa cartella e non può essere sostituito con un oggetto di un tipo differente.', // new
			'errReplace'           : 'Impossibile sostituire "$1".',
			'errSave'              : 'Impossibile salvare "$1".',
			'errCopy'              : 'Impossibile copiare "$1".',
			'errMove'              : 'Impossibile spostare "$1".',
			'errCopyInItself'      : 'Sorgente e destinazione risultato essere uguali.',
			'errRm'                : 'Impossibile rimuovere "$1".',
			'errTrash'             : 'Impossibile cestinare.', // from v2.1.24 added 30.4.2017
			'errRmSrc'             : 'Impossibile eliminare i file origine.',
			'errExtract'           : 'Impossibile estrarre file da "$1".',
			'errArchive'           : 'Impossibile creare archivio.',
			'errArcType'           : 'Tipo di archivio non supportato.',
			'errNoArchive'         : 'Il file non è un archivio o contiene file non supportati.',
			'errCmdNoSupport'      : 'Il Backend non supporta questo comando.',
			'errReplByChild'       : 'La cartella $1 non può essere sostituita da un oggetto in essa contenuto.',
			'errArcSymlinks'       : 'Per questioni di sicurezza non è possibile estrarre archivi che contengono collegamenti..', // edited 24.06.2012
			'errArcMaxSize'        : 'La dimensione dell\'archivio supera le massime dimensioni consentite.',
			'errResize'            : 'Impossibile ridimensionare "$1".',
			'errResizeDegree'      : 'Angolo di rotazione non valido.',  // added 7.3.2013
			'errResizeRotate'      : 'Impossibile ruotare l\'immagine.',  // added 7.3.2013
			'errResizeSize'        : 'Dimensione dell\'immagine non valida.',  // added 7.3.2013
			'errResizeNoChange'    : 'Dimensione dell\'immagine non modificata.',  // added 7.3.2013
			'errUsupportType'      : 'Tipo di file non supportato.',
			'errNotUTF8Content'    : 'Il file "$1" non è nel formato UTF-8 e non può essere modificato.',  // added 9.11.2011
			'errNetMount'          : 'Impossibile montare "$1".', // added 17.04.2012
			'errNetMountNoDriver'  : 'Protocollo non supportato.',     // added 17.04.2012
			'errNetMountFailed'    : 'Mount fallito.',         // added 17.04.2012
			'errNetMountHostReq'   : 'Host richiesto.', // added 18.04.2012
			'errSessionExpires'    : 'La sessione è scaduta a causa di inattività.',
			'errCreatingTempDir'   : 'Impossibile creare la cartella temporanea: "$1"',
			'errFtpDownloadFile'   : 'Impossibile scaricare il file tramite FTP: "$1"',
			'errFtpUploadFile'     : 'Impossibile caricare il file tramite FTP: "$1"',
			'errFtpMkdir'          : 'Impossibile creare la cartella remota tramite FTP: "$1"',
			'errArchiveExec'       : 'Errore durante l\'archiviazione dei file: "$1"',
			'errExtractExec'       : 'Errore durante l\'estrazione dei file: "$1"',
			'errNetUnMount'        : 'Impossibile smontare', // from v2.1 added 30.04.2012
			'errConvUTF8'          : 'Non convertibile nel formato UTF-8', // from v2.1 added 08.04.2014
			'errFolderUpload'      : 'Per uploadare l0intera cartella usare Google Chrome.', // from v2.1 added 26.6.2015
			'errSearchTimeout'     : 'Timeout durante la ricerca di "$1". I risultati della ricerca sono parziali.', // from v2.1 added 12.1.2016
			'errReauthRequire'     : 'E\' necessaria la riautorizzazione.', // from v2.1.10 added 24.3.2016
			'errMaxTargets'        : 'Il numero massimo di oggetti selezionabili è $1.', // from v2.1.17 added 17.10.2016
			'errRestore'           : 'Impossibile ripristinare dal cestino: destinazione di ripristino non trovata.', // from v2.1.24 added 3.5.2017
			'errEditorNotFound'    : 'Impossibile trovare un editor per questo tipo di file.', // from v2.1.25 added 23.5.2017
			'errServerError'       : 'Si è verificato un errore lato server.', // from v2.1.25 added 16.6.2017
			'errEmpty'             : 'Impossibile svuotare la cartella "$1".', // from v2.1.25 added 22.6.2017
			'moreErrors'           : 'Ci sono $ 1 in più di errori.', // from v2.1.44 added 9.12.2018
			'errMaxMkdirs'         : 'Puoi creare fino a $ 1 cartelle alla volta.', // from v2.1.58 added 20.6.2021

			/******************************* commands names ********************************/
			'cmdarchive'   : 'Crea archivio',
			'cmdback'      : 'Indietro',
			'cmdcopy'      : 'Copia',
			'cmdcut'       : 'Taglia',
			'cmddownload'  : 'Scarica',
			'cmdduplicate' : 'Duplica',
			'cmdedit'      : 'Modifica File',
			'cmdextract'   : 'Estrai Archivio',
			'cmdforward'   : 'Avanti',
			'cmdgetfile'   : 'Seleziona File',
			'cmdhelp'      : 'Informazioni su...',
			'cmdhome'      : 'Home',
			'cmdinfo'      : 'Informazioni',
			'cmdmkdir'     : 'Nuova cartella',
			'cmdmkdirin'   : 'In una nuova cartella', // from v2.1.7 added 19.2.2016
			'cmdmkfile'    : 'Nuovo file',
			'cmdopen'      : 'Apri',
			'cmdpaste'     : 'Incolla',
			'cmdquicklook' : 'Anteprima',
			'cmdreload'    : 'Ricarica',
			'cmdrename'    : 'Rinomina',
			'cmdrm'        : 'Elimina',
			'cmdtrash'     : 'Nel cestino', //from v2.1.24 added 29.4.2017
			'cmdrestore'   : 'Ripristina', //from v2.1.24 added 3.5.2017
			'cmdsearch'    : 'Ricerca file',
			'cmdup'        : 'Vai alla directory padre',
			'cmdupload'    : 'Carica File',
			'cmdview'      : 'Visualizza',
			'cmdresize'    : 'Ridimensiona Immagine',
			'cmdsort'      : 'Ordina',
			'cmdnetmount'  : 'Monta disco di rete', // added 18.04.2012
			'cmdnetunmount': 'Smonta', // from v2.1 added 30.04.2012
			'cmdplaces'    : 'Aggiungi ad Accesso rapido', // added 28.12.2014
			'cmdchmod'     : 'Cambia modalità', // from v2.1 added 20.6.2015
			'cmdopendir'   : 'Apri una cartella', // from v2.1 added 13.1.2016
			'cmdcolwidth'  : 'Reimposta dimensione colonne', // from v2.1.13 added 12.06.2016
			'cmdfullscreen': 'Schermo intero', // from v2.1.15 added 03.08.2016
			'cmdmove'      : 'Sposta', // from v2.1.15 added 21.08.2016
			'cmdempty'     : 'Svuota la cartella', // from v2.1.25 added 22.06.2017
			'cmdundo'      : 'Annulla', // from v2.1.27 added 31.07.2017
			'cmdredo'      : 'Ripeti', // from v2.1.27 added 31.07.2017
			'cmdpreference': 'Preferenze', // from v2.1.27 added 03.08.2017
			'cmdselectall' : 'Seleziona tutto', // from v2.1.28 added 15.08.2017
			'cmdselectnone': 'Annulla selezione', // from v2.1.28 added 15.08.2017
			'cmdselectinvert': 'Inverti selezione', // from v2.1.28 added 15.08.2017
			'cmdopennew'   : 'Apri in una nuova finestra', // from v2.1.38 added 3.4.2018
			'cmdhide'      : 'Nascondi (Preferenza)', // from v2.1.41 added 24.7.2018

			/*********************************** buttons ***********************************/
			'btnClose'  : 'Chiudi',
			'btnSave'   : 'Salva',
			'btnRm'     : 'Elimina',
			'btnApply'  : 'Applica',
			'btnCancel' : 'Annulla',
			'btnNo'     : 'No',
			'btnYes'    : 'Sì',
			'btnMount'  : 'Monta',  // added 18.04.2012
			'btnApprove': 'Vai a $1 & approva', // from v2.1 added 26.04.2012
			'btnUnmount': 'Smonta', // from v2.1 added 30.04.2012
			'btnConv'   : 'Converti', // from v2.1 added 08.04.2014
			'btnCwd'    : 'Qui',      // from v2.1 added 22.5.2015
			'btnVolume' : 'Disco',    // from v2.1 added 22.5.2015
			'btnAll'    : 'Tutti',       // from v2.1 added 22.5.2015
			'btnMime'   : 'Tipo MIME', // from v2.1 added 22.5.2015
			'btnFileName':'Nome file',  // from v2.1 added 22.5.2015
			'btnSaveClose': 'Salva & Chiudi', // from v2.1 added 12.6.2015
			'btnBackup' : 'Backup', // fromv2.1 added 28.11.2015
			'btnRename'    : 'Rinomina',      // from v2.1.24 added 6.4.2017
			'btnRenameAll' : 'Rinomina (tutto)', // from v2.1.24 added 6.4.2017
			'btnPrevious' : 'Indietro ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnNext'     : 'Avanti ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnSaveAs'   : 'Salva come', // from v2.1.25 added 24.5.2017

			/******************************** notifications ********************************/
			'ntfopen'     : 'Apri cartella',
			'ntffile'     : 'Apri file',
			'ntfreload'   : 'Ricarica il contenuto della cartella',
			'ntfmkdir'    : 'Creazione delle directory in corso',
			'ntfmkfile'   : 'Creazione dei files in corso',
			'ntfrm'       : 'Eliminazione dei files in corso',
			'ntfcopy'     : 'Copia file in corso',
			'ntfmove'     : 'Spostamento file in corso',
			'ntfprepare'  : 'Preparazione della copia dei file.',
			'ntfrename'   : 'Sto rinominando i file',
			'ntfupload'   : 'Caricamento file in corso',
			'ntfdownload' : 'Downloading file in corso',
			'ntfsave'     : 'Salvataggio file in corso',
			'ntfarchive'  : 'Creazione archivio in corso',
			'ntfextract'  : 'Estrazione file dall\'archivio in corso',
			'ntfsearch'   : 'Ricerca files in corso',
			'ntfresize'   : 'Ridimensionamento immagini',
			'ntfsmth'     : 'Operazione in corso. Attendere...',
			'ntfloadimg'  : 'Caricamento immagine in corso',
			'ntfnetmount' : 'Montaggio disco di rete', // added 18.04.2012
			'ntfnetunmount': 'Smontaggio disco di rete', // from v2.1 added 30.04.2012
			'ntfdim'      : 'Lettura dimensioni immagine', // added 20.05.2013
			'ntfreaddir'  : 'Lettura informazioni cartella', // from v2.1 added 01.07.2013
			'ntfurl'      : 'Lettura URL del collegamento', // from v2.1 added 11.03.2014
			'ntfchmod'    : 'Modifica della modalità del file', // from v2.1 added 20.6.2015
			'ntfpreupload': 'Verifica del nome del file caricato', // from v2.1 added 31.11.2015
			'ntfzipdl'    : 'Creazione del file da scaricare', // from v2.1.7 added 23.1.2016
			'ntfparents'  : 'Ottenimento informazioni percorso', // from v2.1.17 added 2.11.2016
			'ntfchunkmerge': 'Processazione file caricato', // from v2.1.17 added 2.11.2016
			'ntftrash'    : 'Spostamento nel cestino', // from v2.1.24 added 2.5.2017
			'ntfrestore'  : 'Ripristino dal cestino', // from v2.1.24 added 3.5.2017
			'ntfchkdir'   : 'Controllo cartella destinazione', // from v2.1.24 added 3.5.2017
			'ntfundo'     : 'Annullamento operazione precedente', // from v2.1.27 added 31.07.2017
			'ntfredo'     : 'Rifacimento precedente annullamento', // from v2.1.27 added 31.07.2017
			'ntfchkcontent' : 'Controllo dei contenuti', // from v2.1.41 added 3.8.2018

			/*********************************** volumes *********************************/
			'volume_Trash' : 'Cestino', //from v2.1.24 added 29.4.2017

			/************************************ dates **********************************/
			'dateUnknown' : 'Sconosciuto',
			'Today'       : 'Oggi',
			'Yesterday'   : 'Ieri',
			'msJan'       : 'Gen',
			'msFeb'       : 'febbraio',
			'msMar'       : 'Mar',
			'msApr'       : 'aprile',
			'msMay'       : 'Mag',
			'msJun'       : 'Giu',
			'msJul'       : 'Lug',
			'msAug'       : 'Ago',
			'msSep'       : 'Set',
			'msOct'       : 'Ott',
			'msNov'       : 'Nov',
			'msDec'       : 'Dic',
			'January'     : 'Gennaio',
			'February'    : 'Febbraio',
			'March'       : 'Marzo',
			'April'       : 'Aprile',
			'May'         : 'Maggio',
			'June'        : 'Giugno',
			'July'        : 'Luglio',
			'August'      : 'Agosto',
			'September'   : 'Settembre',
			'October'     : 'Ottobre',
			'November'    : 'Novembre',
			'December'    : 'Dicembre',
			'Sunday'      : 'Domenica',
			'Monday'      : 'Lunedì',
			'Tuesday'     : 'Martedì',
			'Wednesday'   : 'Mercoledì',
			'Thursday'    : 'Giovedì',
			'Friday'      : 'Venerdì',
			'Saturday'    : 'Sabato',
			'Sun'         : 'Dom',
			'Mon'         : 'Lun',
			'Tue'         : 'Mar',
			'Wed'         : 'Mer',
			'Thu'         : 'Gio',
			'Fri'         : 'Ven',
			'Sat'         : 'Sab',

			/******************************** sort variants ********************************/
			'sortname'          : 'per nome',
			'sortkind'          : 'per tipo',
			'sortsize'          : 'per dimensione',
			'sortdate'          : 'per data',
			'sortFoldersFirst'  : 'cartelle in testa',
			'sortperm'          : 'per permessi', // from v2.1.13 added 13.06.2016
			'sortmode'          : 'per modalità',       // from v2.1.13 added 13.06.2016
			'sortowner'         : 'per possessore',      // from v2.1.13 added 13.06.2016
			'sortgroup'         : 'per gruppo',      // from v2.1.13 added 13.06.2016
			'sortAlsoTreeview'  : 'Anche vista ad albero',  // from v2.1.15 added 01.08.2016

			/********************************** new items **********************************/
			'untitled file.txt' : 'NuovoFile.txt', // added 10.11.2015
			'untitled folder'   : 'NuovaCartella',   // added 10.11.2015
			'Archive'           : 'NuovoArchivio',  // from v2.1 added 10.11.2015
			'untitled file'     : 'NuovoFile.$1',  // from v2.1.41 added 6.8.2018
			'extentionfile'     : '$1: file',    // from v2.1.41 added 6.8.2018
			'extentiontype'     : '$1: $2',      // from v2.1.43 added 17.10.2018

			/********************************** messages **********************************/
			'confirmReq'      : 'Conferma richiesta',
			'confirmRm'       : 'Sei sicuro di voler eliminare i file?<br />L\'operazione non è reversibile!',
			'confirmRepl'     : 'Sostituire i file ?',
			'confirmRest'     : 'Rimpiazza l\'oggetto esistente con quello nel cestino?', // fromv2.1.24 added 5.5.2017
			'confirmConvUTF8' : 'Non in formato UTF-8<br/>Convertire in UTF-8?<br/>Il contenuto diventerà UTF-8 salvando dopo la conversione.', // from v2.1 added 08.04.2014
			'confirmNonUTF8'  : 'La codifica caratteri di questo file non può essere determinata. Sarà temporaneamente convertito in UTF-8 per l\'editting.<br/>Per cortesia, selezionare la codifica caratteri per il file.', // from v2.1.19 added 28.11.2016
			'confirmNotSave'  : 'Il contenuto è stato modificato.<br/>Le modifiche andranno perse se non si salveranno.', // from v2.1 added 15.7.2015
			'confirmTrash'    : 'Sei sicuro di voler cestinare gli oggetti?', //from v2.1.24 added 29.4.2017
			'confirmMove'     : 'Sei sicuro di voler spostare gli articoli a "$ 1"?', //from v2.1.50 added 27.7.2019
			'apllyAll'        : 'Applica a tutti',
			'name'            : 'Nome',
			'size'            : 'Dimensione',
			'perms'           : 'Permessi',
			'modify'          : 'Modificato il',
			'kind'            : 'Tipo',
			'read'            : 'lettura',
			'write'           : 'scrittura',
			'noaccess'        : 'nessun accesso',
			'and'             : 'e',
			'unknown'         : 'sconosciuto',
			'selectall'       : 'Seleziona tutti i file',
			'selectfiles'     : 'Seleziona file',
			'selectffile'     : 'Seleziona il primo file',
			'selectlfile'     : 'Seleziona l\'ultimo file',
			'viewlist'        : 'Visualizza Elenco',
			'viewicons'       : 'Visualizza Icone',
			'viewSmall'       : 'Icone piccole', // from v2.1.39 added 22.5.2018
			'viewMedium'      : 'Icone medie', // from v2.1.39 added 22.5.2018
			'viewLarge'       : 'Icone grandi', // from v2.1.39 added 22.5.2018
			'viewExtraLarge'  : 'Icone molto grandi', // from v2.1.39 added 22.5.2018
			'places'          : 'Accesso rapido',
			'calc'            : 'Calcola',
			'path'            : 'Percorso',
			'aliasfor'        : 'Alias per',
			'locked'          : 'Bloccato',
			'dim'             : 'Dimensioni',
			'files'           : 'File',
			'folders'         : 'Cartelle',
			'items'           : 'Oggetti',
			'yes'             : 'sì',
			'no'              : 'no',
			'link'            : 'Collegamento',
			'searcresult'     : 'Risultati ricerca',
			'selected'        : 'oggetti selezionati',
			'about'           : 'Informazioni',
			'shortcuts'       : 'Scorciatoie',
			'help'            : 'Aiuto',
			'webfm'           : 'Gestore file WEB',
			'ver'             : 'Versione',
			'protocolver'     : 'versione protocollo',
			'homepage'        : 'Home del progetto',
			'docs'            : 'Documentazione',
			'github'          : 'Seguici su Github',
			'twitter'         : 'Seguici su Twitter',
			'facebook'        : 'Seguici su Facebook',
			'team'            : 'Gruppo',
			'chiefdev'        : 'sviluppatore capo',
			'developer'       : 'sviluppatore',
			'contributor'     : 'collaboratore',
			'maintainer'      : 'manutentore',
			'translator'      : 'traduttore',
			'icons'           : 'Icone',
			'dontforget'      : 'e non dimenticate di portare l\'asciugamano',
			'shortcutsof'     : 'Scorciatoie disabilitate',
			'dropFiles'       : 'Trascina i file qui',
			'or'              : 'o',
			'selectForUpload' : 'Seleziona file da caricare',
			'moveFiles'       : 'Sposta file',
			'copyFiles'       : 'Copia file',
			'restoreFiles'    : 'Ripristina oggetti', // from v2.1.24 added 5.5.2017
			'rmFromPlaces'    : 'Rimuovi da Accesso rapido',
			'aspectRatio'     : 'Proporzioni',
			'scale'           : 'Scala',
			'width'           : 'Larghezza',
			'height'          : 'Altezza',
			'resize'          : 'Ridimensione',
			'crop'            : 'Ritaglia',
			'rotate'          : 'Ruota',
			'rotate-cw'       : 'Ruota di 90° in senso orario',
			'rotate-ccw'      : 'Ruota di 90° in senso antiorario',
			'degree'          : 'Gradi',
			'netMountDialogTitle' : 'Monta disco di rete', // added 18.04.2012
			'protocol'            : 'Protocollo', // added 18.04.2012
			'host'                : 'Ospite', // added 18.04.2012
			'port'                : 'Porta', // added 18.04.2012
			'user'                : 'Utente', // added 18.04.2012
			'pass'                : 'Parola d\'ordine', // added 18.04.2012
			'confirmUnmount'      : 'Vuoi smontare $1?',  // from v2.1 added 30.04.2012
			'dropFilesBrowser': 'Rilascia o incolla dal browser', // from v2.1 added 30.05.2012
			'dropPasteFiles'  : 'Rilascia o incolla files e indirizzi URL qui', // from v2.1 added 07.04.2014
			'encoding'        : 'Codifica', // from v2.1 added 19.12.2014
			'locale'          : 'Lingua',   // from v2.1 added 19.12.2014
			'searchTarget'    : 'Destinazione: $1',                // from v2.1 added 22.5.2015
			'searchMime'      : 'Cerca per MIME Type', // from v2.1 added 22.5.2015
			'owner'           : 'Possessore', // from v2.1 added 20.6.2015
			'group'           : 'Gruppo', // from v2.1 added 20.6.2015
			'other'           : 'Altri', // from v2.1 added 20.6.2015
			'execute'         : 'Esegui', // from v2.1 added 20.6.2015
			'perm'            : 'Permessi', // from v2.1 added 20.6.2015
			'mode'            : 'Modalità', // from v2.1 added 20.6.2015
			'emptyFolder'     : 'La cartella è vuota', // from v2.1.6 added 30.12.2015
			'emptyFolderDrop' : 'La cartella è vuota\\A Trascina e rilascia per aggiungere elementi', // from v2.1.6 added 30.12.2015
			'emptyFolderLTap' : 'La cartella è vuota\\A Premi a lungo per aggiungere elementi', // from v2.1.6 added 30.12.2015
			'quality'         : 'Qualità', // from v2.1.6 added 5.1.2016
			'autoSync'        : 'Sincr. automatica',  // from v2.1.6 added 10.1.2016
			'moveUp'          : 'Sposta in alto',  // from v2.1.6 added 18.1.2016
			'getLink'         : 'Mostra URL link', // from v2.1.7 added 9.2.2016
			'selectedItems'   : 'Elementi selezionati ($1)', // from v2.1.7 added 2.19.2016
			'folderId'        : 'ID cartella', // from v2.1.10 added 3.25.2016
			'offlineAccess'   : 'Permetti accesso non in linea', // from v2.1.10 added 3.25.2016
			'reAuth'          : 'Per ri-autenticarsi', // from v2.1.10 added 3.25.2016
			'nowLoading'      : 'Caricamento...', // from v2.1.12 added 4.26.2016
			'openMulti'       : 'Apri più files', // from v2.1.12 added 5.14.2016
			'openMultiConfirm': 'Stai cercando di aprire $1 files. Sei sicuro di volerli aprire nel browser?', // from v2.1.12 added 5.14.2016
			'emptySearch'     : 'Nessun risultato soddisfa i criteri di ricerca', // from v2.1.12 added 5.16.2016
			'editingFile'     : 'Il file è in modifica.', // from v2.1.13 added 6.3.2016
			'hasSelected'     : '$1 elementi sono selezionati.', // from v2.1.13 added 6.3.2016
			'hasClipboard'    : '$1 elementi negli appunti.', // from v2.1.13 added 6.3.2016
			'incSearchOnly'   : 'La ricerca incrementale è solo dalla vista corrente.', // from v2.1.13 added 6.30.2016
			'reinstate'       : 'Reistanzia', // from v2.1.15 added 3.8.2016
			'complete'        : '$1 completato', // from v2.1.15 added 21.8.2016
			'contextmenu'     : 'Menu contestuale', // from v2.1.15 added 9.9.2016
			'pageTurning'     : 'Orientamento pagina', // from v2.1.15 added 10.9.2016
			'volumeRoots'     : 'Percorsi base del volume', // from v2.1.16 added 16.9.2016
			'reset'           : 'Resetta', // from v2.1.16 added 1.10.2016
			'bgcolor'         : 'Colore di sfondo', // from v2.1.16 added 1.10.2016
			'colorPicker'     : 'Selettore colori', // from v2.1.16 added 1.10.2016
			'8pxgrid'         : 'Griglia di 8px', // from v2.1.16 added 4.10.2016
			'enabled'         : 'Abilitato', // from v2.1.16 added 4.10.2016
			'disabled'        : 'Disabilitato', // from v2.1.16 added 4.10.2016
			'emptyIncSearch'  : 'Nessun risultato di ricerca nella vista corrente\\APremere [Invio] per espandere l\'oggetto della ricerca.', // from v2.1.16 added 5.10.2016
			'emptyLetSearch'  : 'Nessun risultato di ricerca tramite prima lettera nella vista corrente.', // from v2.1.23 added 24.3.2017
			'textLabel'       : 'Etichetta di testo', // from v2.1.17 added 13.10.2016
			'minsLeft'        : '$1 minuti rimanenti', // from v2.1.17 added 13.11.2016
			'openAsEncoding'  : 'Riapri con la codifica di caratteri selezionata', // from v2.1.19 added 2.12.2016
			'saveAsEncoding'  : 'Salva con la codifica di caratteri selezionata', // from v2.1.19 added 2.12.2016
			'selectFolder'    : 'Seleziona cartella', // from v2.1.20 added 13.12.2016
			'firstLetterSearch': 'Cerca tramite la prima lettera', // from v2.1.23 added 24.3.2017
			'presets'         : 'Opzioni predefinite', // from v2.1.25 added 26.5.2017
			'tooManyToTrash'  : 'Troppi oggetti da spostare nel cestino', // from v2.1.25 added 9.6.2017
			'TextArea'        : 'Area di testo', // from v2.1.25 added 14.6.2017
			'folderToEmpty'   : 'Svuota la cartella "$1".', // from v2.1.25 added 22.6.2017
			'filderIsEmpty'   : 'Non ci sono oggetti nella cartella "$1".', // from v2.1.25 added 22.6.2017
			'preference'      : 'Preferenze', // from v2.1.26 added 28.6.2017
			'language'        : 'Impostazioni Lingua', // from v2.1.26 added 28.6.2017
			'clearBrowserData': 'Inizializza le impostazioni salvate nel browser', // from v2.1.26 added 28.6.2017
			'toolbarPref'     : 'Impostazioni ToolBar', // from v2.1.27 added 2.8.2017
			'charsLeft'       : '... $1 caratteri rimanenti.',  // from v2.1.29 added 30.8.2017
			'linesLeft'       : '... $ 1 righe rimaste.',  // from v2.1.52 added 16.1.2020
			'sum'             : 'Somma', // from v2.1.29 added 28.9.2017
			'roughFileSize'   : 'Dimensione file approssimativa', // from v2.1.30 added 2.11.2017
			'autoFocusDialog' : 'Fuoco sull\'elemento sotto al mouse',  // from v2.1.30 added 2.11.2017
			'select'          : 'Seleziona', // from v2.1.30 added 23.11.2017
			'selectAction'    : 'Azione quando un file è selezionato', // from v2.1.30 added 23.11.2017
			'useStoredEditor' : 'Apri con l\'editor usato l\'ultima volta', // from v2.1.30 added 23.11.2017
			'selectinvert'    : 'Inverti selezione', // from v2.1.30 added 25.11.2017
			'renameMultiple'  : 'Sei sicuro di voler rinominare $1 selezionati come $2?<br/>Questo non può essere annullato!', // from v2.1.31 added 4.12.2017
			'batchRename'     : 'Rinomina in batch', // from v2.1.31 added 8.12.2017
			'plusNumber'      : '+ Numero', // from v2.1.31 added 8.12.2017
			'asPrefix'        : 'Aggiungi prefisso', // from v2.1.31 added 8.12.2017
			'asSuffix'        : 'Aggiungi sufisso', // from v2.1.31 added 8.12.2017
			'changeExtention' : 'Cambia estensione', // from v2.1.31 added 8.12.2017
			'columnPref'      : 'Impostazioni delle colonne (visualizzazione elenco)', // from v2.1.32 added 6.2.2018
			'reflectOnImmediate' : 'Tutti i cambiamenti saranno immeditamente applicati.', // from v2.1.33 added 2.3.2018
			'reflectOnUnmount'   : 'Qualsiasi modifica non sarà visibile fino a quando non si monta questo volume.', // from v2.1.33 added 2.3.2018
			'unmountChildren' : 'Anche i seguenti volumi montati su questo volume smontati. Sei sicuro di smontarlo?', // from v2.1.33 added 5.3.2018
			'selectionInfo'   : 'Seleziona Info', // from v2.1.33 added 7.3.2018
			'hashChecker'     : 'Algoritmi per visualizzare l\'hash del file', // from v2.1.33 added 10.3.2018
			'infoItems'       : 'Informazioni (pannello di informazioni sulla selezione)', // from v2.1.38 added 28.3.2018
			'pressAgainToExit': 'Premi di nuovo per uscire.', // from v2.1.38 added 1.4.2018
			'toolbar'         : 'Barra degli strumenti', // from v2.1.38 added 4.4.2018
			'workspace'       : 'Spazio di lavoro', // from v2.1.38 added 4.4.2018
			'dialog'          : 'Dialogo', // from v2.1.38 added 4.4.2018
			'all'             : 'Tutti', // from v2.1.38 added 4.4.2018
			'iconSize'        : 'Dimensione icona (Visualizzazione icone)', // from v2.1.39 added 7.5.2018
			'editorMaximized' : 'Apri la finestra dell\'editor ingrandita', // from v2.1.40 added 30.6.2018
			'editorConvNoApi' : 'Poiché la conversione tramite API non è attualmente disponibile, converti sul sito web.', //from v2.1.40 added 8.7.2018
			'editorConvNeedUpload' : 'Dopo la conversione, devi essere caricato con l\'URL dell\'elemento o un file scaricato per salvare il file convertito.', //from v2.1.40 added 8.7.2018
			'convertOn'       : 'Converti sul sito di $ 1', // from v2.1.40 added 10.7.2018
			'integrations'    : 'Integrazioni', // from v2.1.40 added 11.7.2018
			'integrationWith' : 'Questo elFinder ha i seguenti servizi esterni integrati. Si prega di verificare i termini di utilizzo, l\'informativa sulla privacy, ecc. prima di utilizzarlo.', // from v2.1.40 added 11.7.2018
			'showHidden'      : 'Mostra elementi nascosti', // from v2.1.41 added 24.7.2018
			'hideHidden'      : 'Nascondi oggetti nascosti', // from v2.1.41 added 24.7.2018
			'toggleHidden'    : 'Mostra/Nascondi elementi nascosti', // from v2.1.41 added 24.7.2018
			'makefileTypes'   : 'Tipi di file da abilitare con "Nuovo file"', // from v2.1.41 added 7.8.2018
			'typeOfTextfile'  : 'Tipo di file di testo', // from v2.1.41 added 7.8.2018
			'add'             : 'Aggiungere', // from v2.1.41 added 7.8.2018
			'theme'           : 'Tema', // from v2.1.43 added 19.10.2018
			'default'         : 'predefinita', // from v2.1.43 added 19.10.2018
			'description'     : 'Descrizione', // from v2.1.43 added 19.10.2018
			'website'         : 'Sito web', // from v2.1.43 added 19.10.2018
			'author'          : 'autrice', // from v2.1.43 added 19.10.2018
			'email'           : 'E-mail', // from v2.1.43 added 19.10.2018
			'license'         : 'Licenza', // from v2.1.43 added 19.10.2018
			'exportToSave'    : 'Questo elemento non può essere salvato. Per evitare di perdere le modifiche, devi esportare sul tuo PC.', // from v2.1.44 added 1.12.2018
			'dblclickToSelect': 'Fare doppio clic sul file per selezionarlo.', // from v2.1.47 added 22.1.2019
			'useFullscreen'   : 'Usa la modalità a schermo intero', // from v2.1.47 added 19.2.2019

			/********************************** mimetypes **********************************/
			'kindUnknown'     : 'Sconosciuto',
			'kindRoot'        : 'Percorso base del volume', // from v2.1.16 added 16.10.2016
			'kindFolder'      : 'Cartella',
			'kindSelects'     : 'Selezioni', // from v2.1.29 added 29.8.2017
			'kindAlias'       : 'Alias',
			'kindAliasBroken' : 'Alias guasto',
			// applications
			'kindApp'         : 'Applicazione',
			'kindPostscript'  : 'Documento Postscript',
			'kindMsOffice'    : 'Documento Microsoft Office',
			'kindMsWord'      : 'Documento Microsoft Word',
			'kindMsExcel'     : 'Documento Microsoft Excel',
			'kindMsPP'        : 'Presentazione Microsoft Powerpoint',
			'kindOO'          : 'Documento Open Office',
			'kindAppFlash'    : 'Applicazione Flash',
			'kindPDF'         : 'Documento PDF',
			'kindTorrent'     : 'File Bittorrent',
			'kind7z'          : 'Archivio 7z',
			'kindTAR'         : 'Archivio TAR',
			'kindGZIP'        : 'Archivio GZIP',
			'kindBZIP'        : 'Archivio BZIP',
			'kindXZ'          : 'Archivio XZ',
			'kindZIP'         : 'Archivio ZIP',
			'kindRAR'         : 'Archivio RAR',
			'kindJAR'         : 'File Java JAR',
			'kindTTF'         : 'Font True Type',
			'kindOTF'         : 'Font Open Type',
			'kindRPM'         : 'Pacchetto RPM',
			// texts
			'kindText'        : 'Documento di testo',
			'kindTextPlain'   : 'Testo Semplice',
			'kindPHP'         : 'File PHP',
			'kindCSS'         : 'Foglio di stile a cascata (CSS)',
			'kindHTML'        : 'Documento HTML',
			'kindJS'          : 'File Javascript',
			'kindRTF'         : 'File RTF (Rich Text Format)',
			'kindC'           : 'File C',
			'kindCHeader'     : 'File C (header)',
			'kindCPP'         : 'File C++',
			'kindCPPHeader'   : 'File C++ (header)',
			'kindShell'       : 'Script Unix shell',
			'kindPython'      : 'File Python',
			'kindJava'        : 'File Java',
			'kindRuby'        : 'File Ruby',
			'kindPerl'        : 'File Perl',
			'kindSQL'         : 'File SQL',
			'kindXML'         : 'File XML',
			'kindAWK'         : 'File AWK',
			'kindCSV'         : 'File CSV (Comma separated values)',
			'kindDOCBOOK'     : 'File Docbook XML',
			'kindMarkdown'    : 'Testo markdown', // added 20.7.2015
			// images
			'kindImage'       : 'Immagine',
			'kindBMP'         : 'Immagine BMP',
			'kindJPEG'        : 'Immagine JPEG',
			'kindGIF'         : 'Immagine GIF',
			'kindPNG'         : 'Immagine PNG',
			'kindTIFF'        : 'Immagine TIFF',
			'kindTGA'         : 'Immagine TGA',
			'kindPSD'         : 'Immagine Adobe Photoshop',
			'kindXBITMAP'     : 'Immagine X bitmap',
			'kindPXM'         : 'Immagine Pixelmator',
			// media
			'kindAudio'       : 'File Audio',
			'kindAudioMPEG'   : 'Audio MPEG',
			'kindAudioMPEG4'  : 'Audio MPEG-4',
			'kindAudioMIDI'   : 'Audio MIDI',
			'kindAudioOGG'    : 'Audio Ogg Vorbis',
			'kindAudioWAV'    : 'Audio WAV',
			'AudioPlaylist'   : 'Playlist MP3',
			'kindVideo'       : 'File Video',
			'kindVideoDV'     : 'Filmato DV',
			'kindVideoMPEG'   : 'Filmato MPEG',
			'kindVideoMPEG4'  : 'Filmato MPEG-4',
			'kindVideoAVI'    : 'Filmato AVI',
			'kindVideoMOV'    : 'Filmato Quick Time',
			'kindVideoWM'     : 'Filmato Windows Media',
			'kindVideoFlash'  : 'Filmato Flash',
			'kindVideoMKV'    : 'Filmato Matroska',
			'kindVideoOGG'    : 'Filmato Ogg'
		}
	};
}));

js/i18n/elfinder.fr_CA.js000064400000106225151215013360011041 0ustar00/**
 * française translation
 * @author Régis Guyomarch <regisg@gmail.com>
 * @author Benoit Delachaux <benorde33@gmail.com>
 * @author Jonathan Grunder <jonathan.grunder@gmail.com>
 * @version 2022-03-01
 */
 (function(root, factory) {
	if (typeof define === 'function' && define.amd) {
		define(['elfinder'], factory);
	} else if (typeof exports !== 'undefined') {
		module.exports = factory(require('elfinder'));
	} else {
		factory(root.elFinder);
	}
}(this, function(elFinder) {
	elFinder.prototype.i18.fr_CA = {
		translator : 'Régis Guyomarch &lt;regisg@gmail.com&gt;, Benoit Delachaux &lt;benorde33@gmail.com&gt;, Jonathan Grunder &lt;jonathan.grunder@gmail.com&gt;',
		language   : 'française',
		direction  : 'ltr',
		dateFormat : 'd/M/Y H:i', // will show like: 01/Mar/2022 12:32
		fancyDateFormat : '$1 H:i', // will show like: Aujourd'hui 12:32
		nonameDateFormat : 'ymd-His', // noname upload will show like: 220301-123221
		messages   : {
			'getShareText' : 'Partagez',
			'Editor ': 'Editeur de codes',
			/********************************** errors **********************************/
			'error'                : 'Erreur',
			'errUnknown'           : 'Erreur inconnue.',
			'errUnknownCmd'        : 'Commande inconnue.',
			'errJqui'              : 'Mauvaise configuration de jQuery UI. Les composants Selectable, draggable et droppable doivent être inclus.',
			'errNode'              : 'elFinder requiert que l\'élément DOM ait été créé.',
			'errURL'               : 'Mauvaise configuration d\'elFinder ! L\'option URL n\'a pas été définie.',
			'errAccess'            : 'Accès refusé.',
			'errConnect'           : 'Impossible de se connecter au backend.',
			'errAbort'             : 'Connexion interrompue.',
			'errTimeout'           : 'Délai de connexion dépassé.',
			'errNotFound'          : 'Backend non trouvé.',
			'errResponse'          : 'Mauvaise réponse du backend.',
			'errConf'              : 'Mauvaise configuration du backend.',
			'errJSON'              : 'Le module PHP JSON n\'est pas installé.',
			'errNoVolumes'         : 'Aucun volume lisible.',
			'errCmdParams'         : 'Mauvais paramétrage de la commande "$1".',
			'errDataNotJSON'       : 'Les données ne sont pas au format JSON.',
			'errDataEmpty'         : 'Données inexistantes.',
			'errCmdReq'            : 'La requête au Backend doit comporter le nom de la commande.',
			'errOpen'              : 'Impossible d\'ouvrir "$1".',
			'errNotFolder'         : 'Cet objet n\'est pas un dossier.',
			'errNotFile'           : 'Cet objet n\'est pas un fichier.',
			'errRead'              : 'Impossible de lire "$1".',
			'errWrite'             : 'Impossible d\'écrire dans "$1".',
			'errPerm'              : 'Permission refusée.',
			'errLocked'            : '"$1" est verrouillé et ne peut être déplacé ou supprimé.',
			'errExists'            : 'Un élément nommé "$1" existe déjà.',
			'errInvName'           : 'Nom de fichier incorrect.',
			'errInvDirname'        : 'Nom de dossier incorrect.',  // from v2.1.24 added 12.4.2017
			'errFolderNotFound'    : 'Dossier non trouvé.',
			'errFileNotFound'      : 'Fichier non trouvé.',
			'errTrgFolderNotFound' : 'Dossier destination "$1" non trouvé.',
			'errPopup'             : 'Le navigateur web a empêché l\'ouverture d\'une fenêtre "popup". Pour ouvrir le fichier, modifiez les options du navigateur web.',
			'errMkdir'             : 'Impossible de créer le dossier "$1".',
			'errMkfile'            : 'Impossible de créer le fichier "$1".',
			'errRename'            : 'Impossible de renommer "$1".',
			'errCopyFrom'          : 'Interdiction de copier des fichiers depuis le volume "$1".',
			'errCopyTo'            : 'Interdiction de copier des fichiers vers le volume "$1".',
			'errMkOutLink'         : 'Impossible de créer un lien en dehors du volume principal.', // from v2.1 added 03.10.2015
			'errUpload'            : 'Erreur lors de l\'envoi du fichier.',  // old name - errUploadCommon
			'errUploadFile'        : 'Impossible d\'envoyer "$1".', // old name - errUpload
			'errUploadNoFiles'     : 'Aucun fichier à envoyer.',
			'errUploadTotalSize'   : 'Les données dépassent la taille maximale allouée.', // old name - errMaxSize
			'errUploadFileSize'    : 'Le fichier dépasse la taille maximale allouée.', //  old name - errFileMaxSize
			'errUploadMime'        : 'Type de fichier non autorisé.',
			'errUploadTransfer'    : '"$1" erreur transfert.',
			'errUploadTemp'        : 'Impossible de créer un fichier temporaire pour transférer les fichiers.', // from v2.1 added 26.09.2015
			'errNotReplace'        : 'L\'objet "$1" existe déjà à cet endroit et ne peut être remplacé par un objet d\'un type différent.', // new
			'errReplace'           : 'Impossible de remplacer "$1".',
			'errSave'              : 'Impossible de sauvegarder "$1".',
			'errCopy'              : 'Impossible de copier "$1".',
			'errMove'              : 'Impossible de déplacer "$1".',
			'errCopyInItself'      : 'Impossible de copier "$1" sur lui-même.',
			'errRm'                : 'Impossible de supprimer "$1".',
			'errTrash'             : 'Impossible de déplacer dans la corbeille', // from v2.1.24 added 30.4.2017
			'errRmSrc'             : 'Impossible de supprimer le(s) fichier(s) source(s).',
			'errExtract'           : 'Imbossible d\'extraire les fichiers à partir de "$1".',
			'errArchive'           : 'Impossible de créer l\'archive.',
			'errArcType'           : 'Type d\'archive non supporté.',
			'errNoArchive'         : 'Le fichier n\'est pas une archive, ou c\'est un type d\'archive non supporté.',
			'errCmdNoSupport'      : 'Le Backend ne prend pas en charge cette commande.',
			'errReplByChild'       : 'Le dossier “$1” ne peut pas être remplacé par un élément qu\'il contient.',
			'errArcSymlinks'       : 'Par mesure de sécurité, il est défendu d\'extraire une archive contenant des liens symboliques ou des noms de fichier non autorisés.', // edited 24.06.2012
			'errArcMaxSize'        : 'Les fichiers de l\'archive excèdent la taille maximale autorisée.',
			'errResize'            : 'Impossible de redimensionner "$1".',
			'errResizeDegree'      : 'Degré de rotation invalide.',  // added 7.3.2013
			'errResizeRotate'      : 'L\'image ne peut pas être tournée.',  // added 7.3.2013
			'errResizeSize'        : 'Dimension de l\'image non-valide.',  // added 7.3.2013
			'errResizeNoChange'    : 'L\'image n\'est pas redimensionnable.',  // added 7.3.2013
			'errUsupportType'      : 'Type de fichier non supporté.',
			'errNotUTF8Content'    : 'Le fichier "$1" n\'est pas en UTF-8, il ne peut être édité.',  // added 9.11.2011
			'errNetMount'          : 'Impossible de monter "$1".', // added 17.04.2012
			'errNetMountNoDriver'  : 'Protocole non supporté.',     // added 17.04.2012
			'errNetMountFailed'    : 'Echec du montage.',         // added 17.04.2012
			'errNetMountHostReq'   : 'Hôte requis.', // added 18.04.2012
			'errSessionExpires'    : 'Votre session a expiré en raison de son inactivité.',
			'errCreatingTempDir'   : 'Impossible de créer le répertoire temporaire : "$1"',
			'errFtpDownloadFile'   : 'Impossible de télécharger le file depuis l\'accès FTP : "$1"',
			'errFtpUploadFile'     : 'Impossible d\'envoyer le fichier vers l\'accès FTP : "$1"',
			'errFtpMkdir'          : 'Impossible de créer un répertoire distant sur l\'accès FTP :"$1"',
			'errArchiveExec'       : 'Erreur lors de l\'archivage des fichiers : "$1"',
			'errExtractExec'       : 'Erreur lors de l\'extraction des fichiers : "$1"',
			'errNetUnMount'        : 'Impossible de démonter.', // from v2.1 added 30.04.2012
			'errConvUTF8'          : 'Conversion en UTF-8 impossible', // from v2.1 added 08.04.2014
			'errFolderUpload'      : 'Essayez Google Chrome, si voulez envoyer le dossier.', // from v2.1 added 26.6.2015
			'errSearchTimeout'     : 'Délai d’attente dépassé pour la recherche "$1". Le résultat de la recherche est partiel.', // from v2.1 added 12.1.2016
			'errReauthRequire'     : 'Réauthorisation requise.', // from v2.1.10 added 24.3.2016
			'errMaxTargets'        : 'Le nombre maximal d\'éléments pouvant être sélectionnés est $1.', // from v2.1.17 added 17.10.2016
			'errRestore'           : 'Impossible de restaurer la corbeille. La destination de la restauration n\'a pu être identifiée.', // from v2.1.24 added 3.5.2017
			'errEditorNotFound'    : 'Aucun éditeur n\'a été trouvé pour ce type de fichier.', // from v2.1.25 added 23.5.2017
			'errServerError'       : 'Une erreur est survenue du côté serveur.', // from v2.1.25 added 16.6.2017
			'errEmpty'             : 'Impossible de vider le dossier "$1".', // from v2.1.25 added 22.6.2017
			'moreErrors'           : 'Il y a $1 d\'erreurs supplémentaires.', // from v2.1.44 added 9.12.2018
			'errMaxMkdirs'         : 'Vous pouvez créer jusqu\'à $1 dossiers à la fois.', // from v2.1.58 added 20.6.2021

			/******************************* commands names ********************************/
			'cmdarchive'   : 'Créer une archive',
			'cmdback'      : 'Précédent',
			'cmdcopy'      : 'Copier',
			'cmdcut'       : 'Couper',
			'cmddownload'  : 'Télécharger',
			'cmdduplicate' : 'Dupliquer',
			'cmdedit'      : 'Éditer le fichier',
			'cmdextract'   : 'Extraire les fichiers de l\'archive',
			'cmdforward'   : 'Suivant',
			'cmdgetfile'   : 'Sélectionner les fichiers',
			'cmdhelp'      : 'À propos de ce logiciel',
			'cmdhome'      : 'Accueil',
			'cmdinfo'      : 'Informations',
			'cmdmkdir'     : 'Nouveau dossier',
			'cmdmkdirin'   : 'Dans un nouveau dossier', // from v2.1.7 added 19.2.2016
			'cmdmkfile'    : 'Nouveau fichier',
			'cmdopen'      : 'Ouvrir',
			'cmdpaste'     : 'Coller',
			'cmdquicklook' : 'Prévisualiser',
			'cmdreload'    : 'Actualiser',
			'cmdrename'    : 'Renommer',
			'cmdrm'        : 'Supprimer',
			'cmdtrash'     : 'À la corbeille', //from v2.1.24 added 29.4.2017
			'cmdrestore'   : 'Restaurer', //from v2.1.24 added 3.5.2017
			'cmdsearch'    : 'Trouver les fichiers',
			'cmdup'        : 'Remonter au dossier parent',
			'cmdupload'    : 'Envoyer les fichiers',
			'cmdview'      : 'Vue',
			'cmdresize'    : 'Redimensionner l\'image',
			'cmdsort'      : 'Trier',
			'cmdnetmount'  : 'Monter un volume réseau', // added 18.04.2012
			'cmdnetunmount': 'Démonter', // from v2.1 added 30.04.2012
			'cmdplaces'    : 'Vers Favoris', // added 28.12.2014
			'cmdchmod'     : 'Changer de mode', // from v2.1 added 20.6.2015
			'cmdopendir'   : 'Ouvrir un dossier', // from v2.1 added 13.1.2016
			'cmdcolwidth'  : 'Réinitialiser largeur colone', // from v2.1.13 added 12.06.2016
			'cmdfullscreen': 'Plein écran', // from v2.1.15 added 03.08.2016
			'cmdmove'      : 'Déplacer', // from v2.1.15 added 21.08.2016
			'cmdempty'     : 'Vider le dossier', // from v2.1.25 added 22.06.2017
			'cmdundo'      : 'Annuler', // from v2.1.27 added 31.07.2017
			'cmdredo'      : 'Refaire', // from v2.1.27 added 31.07.2017
			'cmdpreference': 'Préférences', // from v2.1.27 added 03.08.2017
			'cmdselectall' : 'Tout sélectionner', // from v2.1.28 added 15.08.2017
			'cmdselectnone': 'Tout désélectionner', // from v2.1.28 added 15.08.2017
			'cmdselectinvert': 'Inverser la sélection', // from v2.1.28 added 15.08.2017
			'cmdopennew'   : 'Ouvrir dans une nouvelle fenêtre', // from v2.1.38 added 3.4.2018
			'cmdhide'      : 'Masquer (Préférence)', // from v2.1.41 added 24.7.2018

			/*********************************** buttons ***********************************/
			'btnClose'  : 'Fermer',
			'btnSave'   : 'Sauvegarder',
			'btnRm'     : 'Supprimer',
			'btnApply'  : 'Confirmer',
			'btnCancel' : 'Annuler',
			'btnNo'     : 'Non',
			'btnYes'    : 'Oui',
			'btnMount'  : 'Monter',  // added 18.04.2012
			'btnApprove': 'Aller à $1 & approuver', // from v2.1 added 26.04.2012
			'btnUnmount': 'Démonter', // from v2.1 added 30.04.2012
			'btnConv'   : 'Convertir', // from v2.1 added 08.04.2014
			'btnCwd'    : 'Ici',      // from v2.1 added 22.5.2015
			'btnVolume' : 'Le volume',    // from v2.1 added 22.5.2015
			'btnAll'    : 'Tous',       // from v2.1 added 22.5.2015
			'btnMime'   : 'Type MIME', // from v2.1 added 22.5.2015
			'btnFileName':'Nom du fichier',  // from v2.1 added 22.5.2015
			'btnSaveClose': 'Enregistrer & Ferme', // from v2.1 added 12.6.2015
			'btnBackup' : 'Sauvegarde', // fromv2.1 added 28.11.2015
			'btnRename'    : 'Renommer',      // from v2.1.24 added 6.4.2017
			'btnRenameAll' : 'Renommer (tous)', // from v2.1.24 added 6.4.2017
			'btnPrevious' : 'Préc. ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnNext'     : 'Suiv. ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnSaveAs'   : 'Sauvegarder sous', // from v2.1.25 added 24.5.2017

			/******************************** notifications ********************************/
			'ntfopen'     : 'Ouvrir le dossier',
			'ntffile'     : 'Ouvrir le fichier',
			'ntfreload'   : 'Actualiser le contenu du dossier',
			'ntfmkdir'    : 'Création du dossier',
			'ntfmkfile'   : 'Création des fichiers',
			'ntfrm'       : 'Supprimer les éléments',
			'ntfcopy'     : 'Copier les éléments',
			'ntfmove'     : 'Déplacer les éléments',
			'ntfprepare'  : 'Préparation de la copie des éléments',
			'ntfrename'   : 'Renommer les fichiers',
			'ntfupload'   : 'Envoi des fichiers',
			'ntfdownload' : 'Téléchargement des fichiers',
			'ntfsave'     : 'Sauvegarder les fichiers',
			'ntfarchive'  : 'Création de l\'archive',
			'ntfextract'  : 'Extraction des fichiers de l\'archive',
			'ntfsearch'   : 'Recherche des fichiers',
			'ntfresize'   : 'Redimensionner les images',
			'ntfsmth'     : 'Fait quelque chose',
			'ntfloadimg'  : 'Chargement de l\'image',
			'ntfnetmount' : 'Monte le volume réseau', // added 18.04.2012
			'ntfnetunmount': 'Démonte le volume réseau', // from v2.1 added 30.04.2012
			'ntfdim'      : 'Calcule la dimension de l\'image', // added 20.05.2013
			'ntfreaddir'  : 'Lecture des informations du dossier', // from v2.1 added 01.07.2013
			'ntfurl'      : 'Récupération de l’URL du lien', // from v2.1 added 11.03.2014
			'ntfchmod'    : 'Changement de mode', // from v2.1 added 20.6.2015
			'ntfpreupload': 'Vérification du nom du fichier envoyé', // from v2.1 added 31.11.2015
			'ntfzipdl'    : 'Création d’un fichier pour le téléchargement', // from v2.1.7 added 23.1.2016
			'ntfparents'  : 'Traitement de l\'information du chemin', // from v2.1.17 added 2.11.2016
			'ntfchunkmerge': 'Traitement du fichier envoyé', // from v2.1.17 added 2.11.2016
			'ntftrash'    : 'Mettre à la corbeille', // from v2.1.24 added 2.5.2017
			'ntfrestore'  : 'Restaurer depuis la corbeille', // from v2.1.24 added 3.5.2017
			'ntfchkdir'   : 'Validation du dossier de destination', // from v2.1.24 added 3.5.2017
			'ntfundo'     : 'Annuler l\'opération précédente', // from v2.1.27 added 31.07.2017
			'ntfredo'     : 'Refaire l\'opération annulée', // from v2.1.27 added 31.07.2017
			'ntfchkcontent' : 'Vérification du contenu', // from v2.1.41 added 3.8.2018

			/*********************************** volumes *********************************/
			'volume_Trash' : 'Corbeille', //from v2.1.24 added 29.4.2017

			/************************************ dates **********************************/
			'dateUnknown' : 'Inconnue',
			'Today'       : 'Aujourd\'hui',
			'Yesterday'   : 'Hier',
			'msJan'       : 'Jan',
			'msFeb'       : 'Fév',
			'msMar'       : 'Mar',
			'msApr'       : 'Avr',
			'msMay'       : 'Mai',
			'msJun'       : 'Jun',
			'msJul'       : 'Jul',
			'msAug'       : 'Aoû',
			'msSep'       : 'Sep',
			'msOct'       : 'Oct',
			'msNov'       : 'Nov',
			'msDec'       : 'Déc',
			'January'     : 'Janvier',
			'February'    : 'Février',
			'March'       : 'Mars',
			'April'       : 'Avril',
			'May'         : 'Mai',
			'June'        : 'Juin',
			'July'        : 'Huillet',
			'August'      : 'Août',
			'September'   : 'Septembre',
			'October'     : 'Octobre',
			'November'    : 'Novembre',
			'December'    : 'Décembre',
			'Sunday'      : 'Dimanche',
			'Monday'      : 'Lundi',
			'Tuesday'     : 'Mardi',
			'Wednesday'   : 'Mercredi',
			'Thursday'    : 'Jeudi',
			'Friday'      : 'Vendredi',
			'Saturday'    : 'Samedi',
			'Sun'         : 'Dim',
			'Mon'         : 'Lun',
			'Tue'         : 'Mar',
			'Wed'         : 'Mer',
			'Thu'         : 'Jeu',
			'Fri'         : 'Ven',
			'Sat'         : 'Sam',

			/******************************** sort variants ********************************/
			'sortname'          : 'par nom',
			'sortkind'          : 'par type',
			'sortsize'          : 'par taille',
			'sortdate'          : 'par date',
			'sortFoldersFirst'  : 'Dossiers en premier',
			'sortperm'          : 'par permission', // from v2.1.13 added 13.06.2016
			'sortmode'          : 'par mode',       // from v2.1.13 added 13.06.2016
			'sortowner'         : 'par propriétaire',      // from v2.1.13 added 13.06.2016
			'sortgroup'         : 'par groupe',      // from v2.1.13 added 13.06.2016
			'sortAlsoTreeview'  : 'Egalement arborescence',  // from v2.1.15 added 01.08.2016

			/********************************** new items **********************************/
			'untitled file.txt' : 'NouveauFichier.txt', // added 10.11.2015
			'untitled folder'   : 'NouveauDossier',   // added 10.11.2015
			'Archive'           : 'NouvelleArchive',  // from v2.1 added 10.11.2015
			'untitled file'     : 'NouveauFichier.$1',  // from v2.1.41 added 6.8.2018
			'extentionfile'     : '$1: Fichier',    // from v2.1.41 added 6.8.2018
			'extentiontype'     : '$1: $2',      // from v2.1.43 added 17.10.2018

			/********************************** messages **********************************/
			'confirmReq'      : 'Confirmation requise',
			'confirmRm'       : 'Êtes-vous certain de vouloir supprimer les éléments ?<br/>Cela ne peut être annulé !',
			'confirmRepl'     : 'Supprimer l\'ancien fichier par le nouveau ?',
			'confirmRest'     : 'Remplacer l\'élément existant par l\'élément de la corbeille ?', // fromv2.1.24 added 5.5.2017
			'confirmConvUTF8' : 'L\'encodage n\'est pas UTf-8<br/>Convertir en UTF-8 ?<br/>Les contenus deviendront UTF-8 en sauvegardant après la conversion.', // from v2.1 added 08.04.2014
			'confirmNonUTF8'  : 'Impossible de détecter l\'encodage de ce fichier. Pour être modifié, il doit être temporairement convertit en UTF-8.<br/>Veuillez s\'il vous plaît sélectionner un encodage pour ce fichier.', // from v2.1.19 added 28.11.2016
			'confirmNotSave'  : 'Ce fichier a été modifié.<br/>Les données seront perdues si les changements ne sont pas sauvegardés.', // from v2.1 added 15.7.2015
			'confirmTrash'    : 'Êtes-vous certain de vouloir déplacer les éléments vers la corbeille?', //from v2.1.24 added 29.4.2017
			'confirmMove'     : 'Voulez-vous vraiment déplacer les éléments vers "$1" ?', //from v2.1.50 added 27.7.2019
			'apllyAll'        : 'Appliquer à tous',
			'name'            : 'Nom',
			'size'            : 'Taille',
			'perms'           : 'Autorisations',
			'modify'          : 'Modifié',
			'kind'            : 'Type',
			'read'            : 'Lecture',
			'write'           : 'Écriture',
			'noaccess'        : 'Pas d\'accès',
			'and'             : 'et',
			'unknown'         : 'inconnu',
			'selectall'       : 'Sélectionner tous les éléments',
			'selectfiles'     : 'Sélectionner le(s) élément(s)',
			'selectffile'     : 'Sélectionner le premier élément',
			'selectlfile'     : 'Sélectionner le dernier élément',
			'viewlist'        : 'Vue par liste',
			'viewicons'       : 'Vue par icônes',
			'viewSmall'       : 'Petites icônes', // from v2.1.39 added 22.5.2018
			'viewMedium'      : 'Moyennes icônes', // from v2.1.39 added 22.5.2018
			'viewLarge'       : 'Grandes icônes', // from v2.1.39 added 22.5.2018
			'viewExtraLarge'  : 'Très grandes icônes', // from v2.1.39 added 22.5.2018
			'places'          : 'Favoris',
			'calc'            : 'Calculer',
			'path'            : 'Chemin',
			'aliasfor'        : 'Raccourcis pour',
			'locked'          : 'Verrouiller',
			'dim'             : 'Dimensions',
			'files'           : 'Fichiers',
			'folders'         : 'Dossiers',
			'items'           : 'Éléments',
			'yes'             : 'oui',
			'no'              : 'non',
			'link'            : 'Lien',
			'searcresult'     : 'Résultats de la recherche',
			'selected'        : 'Éléments sélectionnés',
			'about'           : 'À propos',
			'shortcuts'       : 'Raccourcis',
			'help'            : 'Aide',
			'webfm'           : 'Gestionnaire de fichier Web',
			'ver'             : 'Version',
			'protocolver'     : 'Version du protocole',
			'homepage'        : 'Page du projet',
			'docs'            : 'La documentation',
			'github'          : 'Forkez-nous sur Github',
			'twitter'         : 'Suivez nous sur twitter',
			'facebook'        : 'Joignez-nous facebook',
			'team'            : 'Équipe',
			'chiefdev'        : 'Développeur en chef',
			'developer'       : 'Développeur',
			'contributor'     : 'Contributeur',
			'maintainer'      : 'Mainteneur',
			'translator'      : 'Traducteur',
			'icons'           : 'Icônes',
			'dontforget'      : 'et n\'oubliez pas votre serviette',
			'shortcutsof'     : 'Raccourcis désactivés',
			'dropFiles'       : 'Déposez les fichiers ici',
			'or'              : 'ou',
			'selectForUpload' : 'Sélectionner les fichiers à envoyer',
			'moveFiles'       : 'Déplacer les éléments',
			'copyFiles'       : 'Copier les éléments',
			'restoreFiles'    : 'Restaurer les éléments', // from v2.1.24 added 5.5.2017
			'rmFromPlaces'    : 'Retirer des favoris',
			'aspectRatio'     : 'Ratio d’affichage',
			'scale'           : 'Mise à l\'échelle',
			'width'           : 'Largeur',
			'height'          : 'Hauteur',
			'resize'          : 'Redimensionner',
			'crop'            : 'Recadrer',
			'rotate'          : 'Rotation',
			'rotate-cw'       : 'Rotation de 90 degrés horaire',
			'rotate-ccw'      : 'Rotation de 90 degrés antihoraire',
			'degree'          : '°',
			'netMountDialogTitle' : 'Monter un volume réseau', // added 18.04.2012
			'protocol'            : 'Protocole', // added 18.04.2012
			'host'                : 'Hôte', // added 18.04.2012
			'port'                : 'Port', // added 18.04.2012
			'user'                : 'Utilisateur', // added 18.04.2012
			'pass'                : 'Mot de passe', // added 18.04.2012
			'confirmUnmount'      : 'Démonter $1?',  // from v2.1 added 30.04.2012
			'dropFilesBrowser': 'Glissez-déposez depuis le navigateur de fichier', // from v2.1 added 30.05.2012
			'dropPasteFiles'  : 'Glissez-déposez les fichiers ici', // from v2.1 added 07.04.2014
			'encoding'        : 'Encodage', // from v2.1 added 19.12.2014
			'locale'          : 'Encodage régional',   // from v2.1 added 19.12.2014
			'searchTarget'    : 'Destination: $1',                // from v2.1 added 22.5.2015
			'searchMime'      : 'Recherche par type MIME', // from v2.1 added 22.5.2015
			'owner'           : 'Propriétaire', // from v2.1 added 20.6.2015
			'group'           : 'Groupe', // from v2.1 added 20.6.2015
			'other'           : 'Autre', // from v2.1 added 20.6.2015
			'execute'         : 'Exécuter', // from v2.1 added 20.6.2015
			'perm'            : 'Permission', // from v2.1 added 20.6.2015
			'mode'            : 'Mode', // from v2.1 added 20.6.2015
			'emptyFolder'     : 'Le dossier est vide', // from v2.1.6 added 30.12.2015
			'emptyFolderDrop' : 'Le dossier est vide.\\ Glissez-déposez pour ajouter des éléments.', // from v2.1.6 added 30.12.2015
			'emptyFolderLTap' : 'Le dossier est vide.\\ Appuyez longuement pour ajouter des éléments.', // from v2.1.6 added 30.12.2015
			'quality'         : 'Qualité', // from v2.1.6 added 5.1.2016
			'autoSync'        : 'Synchronisation automatique',  // from v2.1.6 added 10.1.2016
			'moveUp'          : 'Déplacer vers le haut',  // from v2.1.6 added 18.1.2016
			'getLink'         : 'Obtenir le lien d’URL', // from v2.1.7 added 9.2.2016
			'selectedItems'   : 'Éléments sélectionnés ($1)', // from v2.1.7 added 2.19.2016
			'folderId'        : 'ID du dossier', // from v2.1.10 added 3.25.2016
			'offlineAccess'   : 'Permettre l\'accès hors-ligne', // from v2.1.10 added 3.25.2016
			'reAuth'          : 'Pour se réauthentifier', // from v2.1.10 added 3.25.2016
			'nowLoading'      : 'En cours de chargement...', // from v2.1.12 added 4.26.2016
			'openMulti'       : 'Ouvrir multiples fichiers', // from v2.1.12 added 5.14.2016
			'openMultiConfirm': 'Vous allez ouvrir $1 fichiers. Êtes-vous sûr de vouloir les ouvrir dans le navigateur ?', // from v2.1.12 added 5.14.2016
			'emptySearch'     : 'Aucun résultat trouvé avec les paramètres de recherche.', // from v2.1.12 added 5.16.2016
			'editingFile'     : 'Modification d\'un fichier.', // from v2.1.13 added 6.3.2016
			'hasSelected'     : 'Vous avez sélectionné $1 éléments.', // from v2.1.13 added 6.3.2016
			'hasClipboard'    : 'Vous avez $1 éléments dans le presse-papier.', // from v2.1.13 added 6.3.2016
			'incSearchOnly'   : 'Recherche incrémentale disponible uniquement pour la vue active.', // from v2.1.13 added 6.30.2016
			'reinstate'       : 'Rétablir', // from v2.1.15 added 3.8.2016
			'complete'        : '$1 complété', // from v2.1.15 added 21.8.2016
			'contextmenu'     : 'Menu contextuel', // from v2.1.15 added 9.9.2016
			'pageTurning'     : 'Tourner la page', // from v2.1.15 added 10.9.2016
			'volumeRoots'     : 'Volumes principaux', // from v2.1.16 added 16.9.2016
			'reset'           : 'Réinitialiser', // from v2.1.16 added 1.10.2016
			'bgcolor'         : 'Couleur de fond', // from v2.1.16 added 1.10.2016
			'colorPicker'     : 'Sélecteur de couleur', // from v2.1.16 added 1.10.2016
			'8pxgrid'         : 'Grille 8px', // from v2.1.16 added 4.10.2016
			'enabled'         : 'Actif', // from v2.1.16 added 4.10.2016
			'disabled'        : 'Inactif', // from v2.1.16 added 4.10.2016
			'emptyIncSearch'  : 'Aucun résultat trouvé.\\AAppuyez sur [Entrée] pour développer la cible de recherche.', // from v2.1.16 added 5.10.2016
			'emptyLetSearch'  : 'Aucun résultat trouvé pour la recherche par première lettre.', // from v2.1.23 added 24.3.2017
			'textLabel'       : 'Label texte', // from v2.1.17 added 13.10.2016
			'minsLeft'        : '$1 mins restantes', // from v2.1.17 added 13.11.2016
			'openAsEncoding'  : 'Réouvrir avec l\'encodage sélectionné', // from v2.1.19 added 2.12.2016
			'saveAsEncoding'  : 'Sauvegarder avec l\'encodage sélectionné', // from v2.1.19 added 2.12.2016
			'selectFolder'    : 'Choisir le dossier', // from v2.1.20 added 13.12.2016
			'firstLetterSearch': 'Recherche par première lettre', // from v2.1.23 added 24.3.2017
			'presets'         : 'Présélections', // from v2.1.25 added 26.5.2017
			'tooManyToTrash'  : 'Impossible de mettre autant d\'éléments à la corbeille.', // from v2.1.25 added 9.6.2017
			'TextArea'        : 'Zone de texte', // from v2.1.25 added 14.6.2017
			'folderToEmpty'   : 'Vider le dossier "$1".', // from v2.1.25 added 22.6.2017
			'filderIsEmpty'   : 'Il n\'y a pas d\'élément dans le dossier "$1".', // from v2.1.25 added 22.6.2017
			'preference'      : 'Préférence', // from v2.1.26 added 28.6.2017
			'language'        : 'Configuration de langue', // from v2.1.26 added 28.6.2017
			'clearBrowserData': 'Initialisation des configurations sauvegardées dans ce navigateur', // from v2.1.26 added 28.6.2017
			'toolbarPref'     : 'Paramètres de la barre d\'outils', // from v2.1.27 added 2.8.2017
			'charsLeft'       : '... $1 caractères restants.',  // from v2.1.29 added 30.8.2017
			'linesLeft'       : '... $1 de lignes restantes.',  // from v2.1.52 added 16.1.2020
			'sum'             : 'Somme', // from v2.1.29 added 28.9.2017
			'roughFileSize'   : 'Taille de fichier brute', // from v2.1.30 added 2.11.2017
			'autoFocusDialog' : 'Concentrez-vous sur l\'élément de dialogue avec le survol de la souris',  // from v2.1.30 added 2.11.2017
			'select'          : 'Sélectionner', // from v2.1.30 added 23.11.2017
			'selectAction'    : 'Action lors de la sélection d\'un fichier', // from v2.1.30 added 23.11.2017
			'useStoredEditor' : 'Ouvrir avec le dernier éditeur utilisé', // from v2.1.30 added 23.11.2017
			'selectinvert'    : 'Inverser la sélection', // from v2.1.30 added 25.11.2017
			'renameMultiple'  : 'Êtes-vous sûr de vouloir renommer les éléments sélectionnés $1 en $2 ?<br/>L\'action est définitive !', // from v2.1.31 added 4.12.2017
			'batchRename'     : 'Renommer le Batch', // from v2.1.31 added 8.12.2017
			'plusNumber'      : '+ Nombre', // from v2.1.31 added 8.12.2017
			'asPrefix'        : 'Ajouter un préfixe', // from v2.1.31 added 8.12.2017
			'asSuffix'        : 'Ajouter un suffixe', // from v2.1.31 added 8.12.2017
			'changeExtention' : 'Modifier l\'extention', // from v2.1.31 added 8.12.2017
			'columnPref'      : 'Paramètres des colonnes (List view)', // from v2.1.32 added 6.2.2018
			'reflectOnImmediate' : 'Les changements seront immédiatement appliqués à l\'archive.', // from v2.1.33 added 2.3.2018
			'reflectOnUnmount'   : 'Aucun changement ne sera appliqué tant que ce volume n\'a pas été démonté.', // from v2.1.33 added 2.3.2018
			'unmountChildren' : 'Le(s) volume(s) suivant(s) montés sur ce volume seront également démontés. Êtes-vous sûr de vouloir le démonter ?', // from v2.1.33 added 5.3.2018
			'selectionInfo'   : 'Informations sur la sélection', // from v2.1.33 added 7.3.2018
			'hashChecker'     : 'Algorithme de hachage de fichier', // from v2.1.33 added 10.3.2018
			'infoItems'       : 'Éléments d\'information (panneau d\'informations de sélection)', // from v2.1.38 added 28.3.2018
			'pressAgainToExit': 'Appuyez à nouveau pour quitter.', // from v2.1.38 added 1.4.2018
			'toolbar'         : 'Barre d\'outils', // from v2.1.38 added 4.4.2018
			'workspace'       : 'Espace de travail', // from v2.1.38 added 4.4.2018
			'dialog'          : 'Dialogue', // from v2.1.38 added 4.4.2018
			'all'             : 'Tout', // from v2.1.38 added 4.4.2018
			'iconSize'        : 'Taille des icônes (vue Icônes)', // from v2.1.39 added 7.5.2018
			'editorMaximized' : 'Ouvrir la fenêtre agrandie de l\'éditeur', // from v2.1.40 added 30.6.2018
			'editorConvNoApi' : 'Étant donné que la conversion par API n\'est pas disponible actuellement, veuillez effectuer la conversion sur le site Web.', //from v2.1.40 added 8.7.2018
			'editorConvNeedUpload' : 'Après la conversion, vous devez télécharger l\'URL de l\'élément ou un fichier téléchargé pour enregistrer le fichier converti.', //from v2.1.40 added 8.7.2018
			'convertOn'       : 'Convertissez sur le site de $1', // from v2.1.40 added 10.7.2018
			'integrations'    : 'Intégrations', // from v2.1.40 added 11.7.2018
			'integrationWith' : 'Cet elFinder intègre les services externes suivants. Veuillez vérifier les conditions d\'utilisation, la politique de confidentialité, etc. avant de l\'utiliser.', // from v2.1.40 added 11.7.2018
			'showHidden'      : 'Afficher les éléments cachés', // from v2.1.41 added 24.7.2018
			'hideHidden'      : 'Masquer les éléments cachés', // from v2.1.41 added 24.7.2018
			'toggleHidden'    : 'Afficher/Masquer les éléments masqués', // from v2.1.41 added 24.7.2018
			'makefileTypes'   : 'Types de fichiers à activer avec "Nouveau fichier"', // from v2.1.41 added 7.8.2018
			'typeOfTextfile'  : 'Type de fichier texte', // from v2.1.41 added 7.8.2018
			'add'             : 'Ajouter', // from v2.1.41 added 7.8.2018
			'theme'           : 'Défaut', // from v2.1.43 added 19.10.2018
			'default'         : 'défaut', // from v2.1.43 added 19.10.2018
			'description'     : 'La description', // from v2.1.43 added 19.10.2018
			'website'         : 'Site Internet', // from v2.1.43 added 19.10.2018
			'author'          : 'Auteure', // from v2.1.43 added 19.10.2018
			'email'           : 'Email', // from v2.1.43 added 19.10.2018
			'license'         : 'la licence', // from v2.1.43 added 19.10.2018
			'exportToSave'    : 'Cet élément ne peut pas être enregistré. Pour éviter de perdre les modifications, vous devez exporter vers votre PC.', // from v2.1.44 added 1.12.2018
			'dblclickToSelect': 'Double-cliquez sur le fichier pour le sélectionner.', // from v2.1.47 added 22.1.2019
			'useFullscreen'   : 'Utiliser le mode plein écran', // from v2.1.47 added 19.2.2019

			/********************************** mimetypes **********************************/
			'kindUnknown'     : 'Inconnu',
			'kindRoot'        : 'Volume principal', // from v2.1.16 added 16.10.2016
			'kindFolder'      : 'Dossier',
			'kindSelects'     : 'Sélections', // from v2.1.29 added 29.8.2017
			'kindAlias'       : 'Raccourci',
			'kindAliasBroken' : 'Raccourci cassé',
			// applications
			'kindApp'         : 'Application',
			'kindPostscript'  : 'Document Postscript',
			'kindMsOffice'    : 'Document Microsoft Office',
			'kindMsWord'      : 'Document Microsoft Word',
			'kindMsExcel'     : 'Document Microsoft Excel',
			'kindMsPP'        : 'Présentation Microsoft PowerPoint',
			'kindOO'          : 'Document OpenOffice',
			'kindAppFlash'    : 'Application Flash',
			'kindPDF'         : 'Format de document portable (PDF)',
			'kindTorrent'     : 'Fichier BitTorrent',
			'kind7z'          : 'Archive 7z',
			'kindTAR'         : 'Archive TAR',
			'kindGZIP'        : 'Archive GZIP',
			'kindBZIP'        : 'Archive BZIP',
			'kindXZ'          : 'Archive XZ',
			'kindZIP'         : 'Archive ZIP',
			'kindRAR'         : 'Archive RAR',
			'kindJAR'         : 'Fichier Java JAR',
			'kindTTF'         : 'Police True Type',
			'kindOTF'         : 'Police Open Type',
			'kindRPM'         : 'Package RPM',
			// texts
			'kindText'        : 'Document Text',
			'kindTextPlain'   : 'Texte non formaté',
			'kindPHP'         : 'Source PHP',
			'kindCSS'         : 'Feuille de style en cascade',
			'kindHTML'        : 'Document HTML',
			'kindJS'          : 'Source JavaScript',
			'kindRTF'         : 'Format de texte enrichi (Rich Text Format)',
			'kindC'           : 'Source C',
			'kindCHeader'     : 'Source header C',
			'kindCPP'         : 'Source C++',
			'kindCPPHeader'   : 'Source header C++',
			'kindShell'       : 'Shell script Unix',
			'kindPython'      : 'Source Python',
			'kindJava'        : 'Source Java',
			'kindRuby'        : 'Source Ruby',
			'kindPerl'        : 'Script Perl',
			'kindSQL'         : 'Source SQL',
			'kindXML'         : 'Document XML',
			'kindAWK'         : 'Source AWK',
			'kindCSV'         : 'CSV',
			'kindDOCBOOK'     : 'Document Docbook XML',
			'kindMarkdown'    : 'Texte de démarque', // added 20.7.2015
			// images
			'kindImage'       : 'Image',
			'kindBMP'         : 'Image BMP',
			'kindJPEG'        : 'Image JPEG',
			'kindGIF'         : 'Image GIF',
			'kindPNG'         : 'Image PNG',
			'kindTIFF'        : 'Image TIFF',
			'kindTGA'         : 'Image TGA',
			'kindPSD'         : 'Image Adobe Photoshop',
			'kindXBITMAP'     : 'Image X bitmap',
			'kindPXM'         : 'Image Pixelmator',
			// media
			'kindAudio'       : 'Son',
			'kindAudioMPEG'   : 'Son MPEG',
			'kindAudioMPEG4'  : 'Son MPEG-4',
			'kindAudioMIDI'   : 'Son MIDI',
			'kindAudioOGG'    : 'Son Ogg Vorbis',
			'kindAudioWAV'    : 'Son WAV',
			'AudioPlaylist'   : 'Liste de lecture audio',
			'kindVideo'       : 'Vidéo',
			'kindVideoDV'     : 'Vidéo DV',
			'kindVideoMPEG'   : 'Vidéo MPEG',
			'kindVideoMPEG4'  : 'Vidéo MPEG-4',
			'kindVideoAVI'    : 'Vidéo AVI',
			'kindVideoMOV'    : 'Vidéo Quick Time',
			'kindVideoWM'     : 'Vidéo Windows Media',
			'kindVideoFlash'  : 'Vidéo Flash',
			'kindVideoMKV'    : 'Vidéo Matroska',
			'kindVideoOGG'    : 'Vidéo Ogg'
		}
	};
}));js/i18n/elfinder.da.js000064400000100743151215013360010452 0ustar00/**
 * Danish translation
 * @author Mark Topper (webman.io)
 * @author Helmuth Mikkelsen <helmuthm@gmail.com>
 * @version 2022-02-28
 */
 (function(root, factory) {
	if (typeof define === 'function' && define.amd) {
		define(['elfinder'], factory);
	} else if (typeof exports !== 'undefined') {
		module.exports = factory(require('elfinder'));
	} else {
		factory(root.elFinder);
	}
}(this, function(elFinder) {
	elFinder.prototype.i18.da = {
		translator : 'Mark Topper (webman.io), Helmuth Mikkelsen &lt;helmuthm@gmail.com&gt;',
		language   : 'Danish',
		direction  : 'ltr',
		dateFormat : 'd.m.Y H:i', // will show like: 28.02.2022 11:38
		fancyDateFormat : '$1 H:i', // will show like: I dag 11:38
		nonameDateFormat : 'Ymd-His', // noname upload will show like: 20220228-113848
		messages   : {
			'getShareText' : 'Del',
			'Editor ': 'Kode Editor',
			/********************************** errors **********************************/
			'error'                : 'Fejl',
			'errUnknown'           : 'Ukendt fejl.',
			'errUnknownCmd'        : 'Ukendt kommando.',
			'errJqui'              : 'Ugyldig jQuery UI-konfiguration. Valgbare, trækbare og dropbare komponenter skal medtages.',
			'errNode'              : 'elFinder kræver DOM Element oprettet.',
			'errURL'               : 'Ugyldig elFinder konfiguration! URL option er ikke sat.',
			'errAccess'            : 'Adgang nægtet.',
			'errConnect'           : 'Kan ikke få kontatkt med backend.',
			'errAbort'             : 'Forbindelse afbrudt.',
			'errTimeout'           : 'Forbindelse timeout.',
			'errNotFound'          : 'Backend ikke fundet.',
			'errResponse'          : 'Ugyldigt backend svar.',
			'errConf'              : 'Ugyldig backend konfiguration.',
			'errJSON'              : 'PHP JSON modul ikke installeret.',
			'errNoVolumes'         : 'Læsbare diskenheder er ikke tilgængelige.',
			'errCmdParams'         : 'Ugyldige parametre for kommando "$1".',
			'errDataNotJSON'       : 'Data er ikke JSON.',
			'errDataEmpty'         : 'Data er tom.',
			'errCmdReq'            : 'Backend-anmodning kræver kommandonavn.',
			'errOpen'              : 'Kunne ikke åbne "$1".',
			'errNotFolder'         : 'Objektet er ikke en mappe.',
			'errNotFile'           : 'Objektet er ikke en fil.',
			'errRead'              : 'Kunne ikke læse "$1".',
			'errWrite'             : 'Kunne ikke skrive til "$1".',
			'errPerm'              : 'Adgang nægtet.',
			'errLocked'            : '"$1" er låst og kan ikke blive omdøbt, flyttet eller slettet.',
			'errExists'            : 'Der findes allerede en fil ved navn "$1".',
			'errInvName'           : 'Ugyldigt filnavn.',
			'errInvDirname'        : 'Ugyldigt mappenavn.',  // from v2.1.24 added 12.4.2017
			'errFolderNotFound'    : 'Mappe ikke fundet.',
			'errFileNotFound'      : 'Fil ikke fundet.',
			'errTrgFolderNotFound' : 'Mappen "$1" blev ikke fundet.',
			'errPopup'             : 'Browser forhindrede åbning af pop up-vindue. For at åbne filen skal du aktivere den i browserindstillinger.',
			'errMkdir'             : 'Kunne ikke oprette mappen "$1".',
			'errMkfile'            : 'Kunne ikke oprette filen "$1".',
			'errRename'            : 'Kunne ikke omdøbe "$1".',
			'errCopyFrom'          : 'Kopiering af filer fra diskenhed "$1" er ikke tilladt.',
			'errCopyTo'            : 'Kopiering af filer til diskenhed "$1" er ikke tilladt.',
			'errMkOutLink'         : 'Kan ikke oprette et link til uden for diskenhedsroden.', // from v2.1 added 03.10.2015
			'errUpload'            : 'Upload fejl.',  // old name - errUploadCommon
			'errUploadFile'        : 'Kunne ikke uploade "$1".', // old name - errUpload
			'errUploadNoFiles'     : 'Ingen filer fundet til upload.',
			'errUploadTotalSize'   : 'Data overskrider den maksimalt tilladte størrelse.', // old name - errMaxSize
			'errUploadFileSize'    : 'Fil overskrider den maksimalt tilladte størrelse.', //  old name - errFileMaxSize
			'errUploadMime'        : 'Filtype ikke godkendt.',
			'errUploadTransfer'    : '"$1" overførselsfejl.',
			'errUploadTemp'        : 'Kan ikke oprette midlertidig fil til upload.', // from v2.1 added 26.09.2015
			'errNotReplace'        : 'Objekt "$1" findes allerede på dette sted og kan ikke erstattes af objekt med en anden type.', // new
			'errReplace'           : 'Kan ikke erstatte "$1".',
			'errSave'              : 'Kunne ikke gemme "$1".',
			'errCopy'              : 'Kunne ikke kopiere "$1".',
			'errMove'              : 'Kunne ikke flytte "$1".',
			'errCopyInItself'      : 'Kunne ikke kopiere "$1" til sig selv.',
			'errRm'                : 'Kunne ikke slette "$1".',
			'errTrash'             : 'Kan ikke komme i papirkurven.', // from v2.1.24 added 30.4.2017
			'errRmSrc'             : 'Kunne ikke fjerne kildefil(er).',
			'errExtract'           : 'Kunne ikke udpakke filer fra "$1".',
			'errArchive'           : 'Kunne ikke oprette arkiv.',
			'errArcType'           : 'Arkivtypen er ikke understøttet.',
			'errNoArchive'         : 'Filen er ikke et arkiv eller har ien kke-understøttet arkivtype.',
			'errCmdNoSupport'      : 'Backend understøtter ikke denne kommando.',
			'errReplByChild'       : 'Mappen "$1" kan ikke erstattes af et element, den indeholder.',
			'errArcSymlinks'       : 'Af sikkerhedsmæssige årsager nægtes at udpakke arkiver der indeholder symlinks eller filer med ikke-tilladte navne.', // edited 24.06.2012
			'errArcMaxSize'        : 'Arkivfiler overskrider den maksimalt tilladte størrelse.',
			'errResize'            : 'Kunne ikke ændre størrelsen på "$1".',
			'errResizeDegree'      : 'Ugyldig rotationsgrad.',  // added 7.3.2013
			'errResizeRotate'      : 'Kunne ikke rotere billedet.',  // added 7.3.2013
			'errResizeSize'        : 'Ugyldig billedstørrelse.',  // added 7.3.2013
			'errResizeNoChange'    : 'Billedstørrelse ikke ændret.',  // added 7.3.2013
			'errUsupportType'      : 'Ikke-understøttet filtype.',
			'errNotUTF8Content'    : 'Filen "$1" er ikke i UTF-8 og kan ikke blive redigeret.',  // added 9.11.2011
			'errNetMount'          : 'Kunne ikke mounte "$1".', // added 17.04.2012
			'errNetMountNoDriver'  : 'Ikke-understøttet protokol.',     // added 17.04.2012
			'errNetMountFailed'    : 'Mount mislykkedes.',         // added 17.04.2012
			'errNetMountHostReq'   : 'Værten kræves.', // added 18.04.2012
			'errSessionExpires'    : 'Din session er udløbet på grund af inaktivitet.',
			'errCreatingTempDir'   : 'Kunne ikke oprette midlertidig mappe: "$1"',
			'errFtpDownloadFile'   : 'Kunne ikke downloade filen fra FTP: "$1"',
			'errFtpUploadFile'     : 'Kunne ikke uploade filen til FTP: "$1"',
			'errFtpMkdir'          : 'Kunne ikke oprette fjernmappe på FTP: "$1"',
			'errArchiveExec'       : 'Fejl under arkivering af filer: "$1"',
			'errExtractExec'       : 'Fejl under udpakning af filer: "$1"',
			'errNetUnMount'        : 'Kan ikke unmounte.', // from v2.1 added 30.04.2012
			'errConvUTF8'          : 'Kan ikke konverteres til UTF-8', // from v2.1 added 08.04.2014
			'errFolderUpload'      : 'Prøv den nyeste browser, hvis du vil uploade mappen.', // from v2.1 added 26.6.2015
			'errSearchTimeout'     : 'Time out under søgning på "$1". Søgeresultatet er delvis.', // from v2.1 added 12.1.2016
			'errReauthRequire'     : 'Re-autorisation er påkrævet.', // from v2.1.10 added 24.3.2016
			'errMaxTargets'        : 'Maksimalt antal valgbare emner er $1.', // from v2.1.17 added 17.10.2016
			'errRestore'           : 'Kan ikke gendannes fra papirkurven. Kan ikke identificere gendannelsesdestinationen.', // from v2.1.24 added 3.5.2017
			'errEditorNotFound'    : 'Editor blev ikke fundet til denne filtype.', // from v2.1.25 added 23.5.2017
			'errServerError'       : 'Der opstod en fejl på serversiden.', // from v2.1.25 added 16.6.2017
			'errEmpty'             : 'Kunne ikke tømme mappen "$1".', // from v2.1.25 added 22.6.2017
			'moreErrors'           : 'Der er $1 flere fejl.', // from v2.1.44 added 9.12.2018
			'errMaxMkdirs'         : 'Du kan oprette op til $1 mapper ad gangen.', // from v2.1.58 added 20.6.2021

			/******************************* commands names ********************************/
			'cmdarchive'   : 'Opret arkiv',
			'cmdback'      : 'Tilbage',
			'cmdcopy'      : 'Kopier',
			'cmdcut'       : 'Klip',
			'cmddownload'  : 'Downloade',
			'cmdduplicate' : 'Dupliker',
			'cmdedit'      : 'Rediger fil',
			'cmdextract'   : 'Udpak filer fra arkiv',
			'cmdforward'   : 'Frem',
			'cmdgetfile'   : 'Vælg filer',
			'cmdhelp'      : 'Om denne software',
			'cmdhome'      : 'Hjem',
			'cmdinfo'      : 'Information',
			'cmdmkdir'     : 'Ny mappe',
			'cmdmkdirin'   : 'I en ny mappe', // from v2.1.7 added 19.2.2016
			'cmdmkfile'    : 'Ny fil',
			'cmdopen'      : 'Åben',
			'cmdpaste'     : 'Indsæt',
			'cmdquicklook' : 'Vis',
			'cmdreload'    : 'Genindlæs',
			'cmdrename'    : 'Omdøb',
			'cmdrm'        : 'Slet',
			'cmdtrash'     : 'I papirkurven', //from v2.1.24 added 29.4.2017
			'cmdrestore'   : 'Gendan', //from v2.1.24 added 3.5.2017
			'cmdsearch'    : 'Find filer',
			'cmdup'        : 'Gå til overordnet mappe',
			'cmdupload'    : 'Upload filer',
			'cmdview'      : 'Vis',
			'cmdresize'    : 'Tilpas størrelse & Roter',
			'cmdsort'      : 'Sorter',
			'cmdnetmount'  : 'Mount netværksdrev', // added 18.04.2012
			'cmdnetunmount': 'Afmonter', // from v2.1 added 30.04.2012
			'cmdplaces'    : 'Til steder', // added 28.12.2014
			'cmdchmod'     : 'Skift tilstand', // from v2.1 added 20.6.2015
			'cmdopendir'   : 'Åbn en mappe', // from v2.1 added 13.1.2016
			'cmdcolwidth'  : 'Nulstil søjlebredde', // from v2.1.13 added 12.06.2016
			'cmdfullscreen': 'Fuld skærm', // from v2.1.15 added 03.08.2016
			'cmdmove'      : 'Flyt', // from v2.1.15 added 21.08.2016
			'cmdempty'     : 'Tøm mappe', // from v2.1.25 added 22.06.2017
			'cmdundo'      : 'Fortryd', // from v2.1.27 added 31.07.2017
			'cmdredo'      : 'Gentag igen', // from v2.1.27 added 31.07.2017
			'cmdpreference': 'Præferencer', // from v2.1.27 added 03.08.2017
			'cmdselectall' : 'Vælg alle', // from v2.1.28 added 15.08.2017
			'cmdselectnone': 'Vælg ingen', // from v2.1.28 added 15.08.2017
			'cmdselectinvert': 'Inverter valg', // from v2.1.28 added 15.08.2017
			'cmdopennew'   : 'Åbn i nyt vindue', // from v2.1.38 added 3.4.2018
			'cmdhide'      : 'Skjul (præference)', // from v2.1.41 added 24.7.2018

			/*********************************** buttons ***********************************/
			'btnClose'  : 'Luk',
			'btnSave'   : 'Gem',
			'btnRm'     : 'Slet',
			'btnApply'  : 'Anvend',
			'btnCancel' : 'Annuler',
			'btnNo'     : 'Nej',
			'btnYes'    : 'Ja',
			'btnMount'  : 'Mount',  // added 18.04.2012
			'btnApprove': 'Gå til $1 & godkend', // from v2.1 added 26.04.2012
			'btnUnmount': 'Afmonter', // from v2.1 added 30.04.2012
			'btnConv'   : 'Konverter', // from v2.1 added 08.04.2014
			'btnCwd'    : 'Her',      // from v2.1 added 22.5.2015
			'btnVolume' : 'Diskenhed',    // from v2.1 added 22.5.2015
			'btnAll'    : 'Alle',       // from v2.1 added 22.5.2015
			'btnMime'   : 'MIME-type', // from v2.1 added 22.5.2015
			'btnFileName':'Filnavn',  // from v2.1 added 22.5.2015
			'btnSaveClose': 'Gem & Luk', // from v2.1 added 12.6.2015
			'btnBackup' : 'Sikkerhedskopiering', // fromv2.1 added 28.11.2015
			'btnRename'    : 'Omdøb',      // from v2.1.24 added 6.4.2017
			'btnRenameAll' : 'Omdøb(Alle)', // from v2.1.24 added 6.4.2017
			'btnPrevious' : 'Forrige ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnNext'     : 'Næste ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnSaveAs'   : 'Gem som', // from v2.1.25 added 24.5.2017

			/******************************** notifications ********************************/
			'ntfopen'     : 'Åben mappe',
			'ntffile'     : 'Åben fil',
			'ntfreload'   : 'Genindlæs mappeindhold',
			'ntfmkdir'    : 'Opretter mappe',
			'ntfmkfile'   : 'Opretter filer',
			'ntfrm'       : 'Sletter filer',
			'ntfcopy'     : 'Kopier filer',
			'ntfmove'     : 'Flytter filer',
			'ntfprepare'  : 'Kontrol af eksisterende emner',
			'ntfrename'   : 'Omdøb filer',
			'ntfupload'   : 'Uploader filer',
			'ntfdownload' : 'Downloader filer',
			'ntfsave'     : 'Gemmer filer',
			'ntfarchive'  : 'Opretter arkiv',
			'ntfextract'  : 'Udpakker filer fra arkiv',
			'ntfsearch'   : 'Søger filer',
			'ntfresize'   : 'Ændring af størrelsen på billeder',
			'ntfsmth'     : 'Gør noget',
			'ntfloadimg'  : 'Henter billede',
			'ntfnetmount' : 'Mounter netværksdrev', // added 18.04.2012
			'ntfnetunmount': 'Unmounter netværksdrev', // from v2.1 added 30.04.2012
			'ntfdim'      : 'Henter billeddimension', // added 20.05.2013
			'ntfreaddir'  : 'Læser folderinfomation', // from v2.1 added 01.07.2013
			'ntfurl'      : 'Får URL til link', // from v2.1 added 11.03.2014
			'ntfchmod'    : 'Ændring af filtilstand', // from v2.1 added 20.6.2015
			'ntfpreupload': 'Bekræftelse af upload filnavn', // from v2.1 added 31.11.2015
			'ntfzipdl'    : 'Oprettelse af en fil til download', // from v2.1.7 added 23.1.2016
			'ntfparents'  : 'Få stiinformation', // from v2.1.17 added 2.11.2016
			'ntfchunkmerge': 'Behandler den uploadede fil', // from v2.1.17 added 2.11.2016
			'ntftrash'    : 'Smider i papirkurv', // from v2.1.24 added 2.5.2017
			'ntfrestore'  : 'Udfører gendannelse fra papirkurven', // from v2.1.24 added 3.5.2017
			'ntfchkdir'   : 'Kontrollerer destinationsmappe', // from v2.1.24 added 3.5.2017
			'ntfundo'     : 'Fortryder tidligere handling', // from v2.1.27 added 31.07.2017
			'ntfredo'     : 'Gentager tidligere fortryd', // from v2.1.27 added 31.07.2017
			'ntfchkcontent' : 'Kontrol af indhold', // from v2.1.41 added 3.8.2018

			/*********************************** volumes *********************************/
			'volume_Trash' : 'Papirkurv', //from v2.1.24 added 29.4.2017

			/************************************ dates **********************************/
			'dateUnknown' : 'ukendt',
			'Today'       : 'I dag',
			'Yesterday'   : 'I går',
			'msJan'       : 'januar',
			'msFeb'       : 'februar',
			'msMar'       : 'marts',
			'msApr'       : 'april',
			'msMay'       : 'Maj',
			'msJun'       : 'juni',
			'msJul'       : 'juli',
			'msAug'       : 'Aug',
			'msSep'       : 'Sep',
			'msOct'       : 'Okt',
			'msNov'       : 'Nov',
			'msDec'       : 'Dec',
			'January'     : 'Januar',
			'February'    : 'Februar',
			'March'       : 'Marts',
			'April'       : 'April',
			'May'         : 'Maj',
			'June'        : 'Juni',
			'July'        : 'Juli',
			'August'      : 'August',
			'September'   : 'September',
			'October'     : 'Oktober',
			'November'    : 'November',
			'December'    : 'December',
			'Sunday'      : 'Søndag',
			'Monday'      : 'Mandag',
			'Tuesday'     : 'Tirsdag',
			'Wednesday'   : 'Onsdag',
			'Thursday'    : 'Torsdag',
			'Friday'      : 'Fredag',
			'Saturday'    : 'Lørdag',
			'Sun'         : 'Søn',
			'Mon'         : 'Man',
			'Tue'         : 'Tir',
			'Wed'         : 'Ons',
			'Thu'         : 'Tor',
			'Fri'         : 'Fre',
			'Sat'         : 'Lør',

			/******************************** sort variants ********************************/
			'sortname'          : 'efter navn',
			'sortkind'          : 'efter type',
			'sortsize'          : 'efter størrelse',
			'sortdate'          : 'efter dato',
			'sortFoldersFirst'  : 'Mapper først',
			'sortperm'          : 'efter tilladelse', // from v2.1.13 added 13.06.2016
			'sortmode'          : 'efter mode',       // from v2.1.13 added 13.06.2016
			'sortowner'         : 'efter ejer',      // from v2.1.13 added 13.06.2016
			'sortgroup'         : 'efter gruppe',      // from v2.1.13 added 13.06.2016
			'sortAlsoTreeview'  : 'Også Treeview',  // from v2.1.15 added 01.08.2016

			/********************************** new items **********************************/
			'untitled file.txt' : 'NyFil.txt', // added 10.11.2015
			'untitled folder'   : 'NyFolder',   // added 10.11.2015
			'Archive'           : 'NytArkiv',  // from v2.1 added 10.11.2015
			'untitled file'     : 'NyFil.$1',  // from v2.1.41 added 6.8.2018
			'extentionfile'     : '$1: Fil',    // from v2.1.41 added 6.8.2018
			'extentiontype'     : '$1: $2',      // from v2.1.43 added 17.10.2018

			/********************************** messages **********************************/
			'confirmReq'      : 'Bekræftelse påkrævet',
			'confirmRm'       : 'Er du sikker på du vil slette valgte filer?<br/>Dette kan ikke fortrydes!',
			'confirmRepl'     : 'Erstat gammel fil med ny fil?',
			'confirmRest'     : 'Erstat eksisterende element med elementet i papirkurven?', // fromv2.1.24 added 5.5.2017
			'confirmConvUTF8' : 'Ikke i UTF-8<br/>Konverter til UTF-8?<br/>Indholdet bliver UTF-8 ved at gemme efter konvertering.', // from v2.1 added 08.04.2014
			'confirmNonUTF8'  : 'Tegnkodning af denne fil kunne ikke registreres. Det er nødvendigt at konvertere midlertidigt til UTF-8 til redigering.<br/>Vælg tegnkodning af denne fil.', // from v2.1.19 added 28.11.2016
			'confirmNotSave'  : 'Det er blevet ændret.<br/>Du mister arbejde, hvis du ikke gemmer ændringer.', // from v2.1 added 15.7.2015
			'confirmTrash'    : 'Er du sikker på, at du vil flytte emner til papirkurven?', //from v2.1.24 added 29.4.2017
			'confirmMove'     : 'Er du sikker på, at du vil flytte emner til "$1"?', //from v2.1.50 added 27.7.2019
			'apllyAll'        : 'Anvend ved alle',
			'name'            : 'Navn',
			'size'            : 'Størrelse',
			'perms'           : 'Rettigheder',
			'modify'          : 'Ændret',
			'kind'            : 'Type',
			'read'            : 'læse',
			'write'           : 'skrive',
			'noaccess'        : 'ingen adgang',
			'and'             : 'og',
			'unknown'         : 'ukendt',
			'selectall'       : 'Vælg alle filer',
			'selectfiles'     : 'Vælg fil(er)',
			'selectffile'     : 'Vælg første fil',
			'selectlfile'     : 'Vælg sidste fil',
			'viewlist'        : 'Listevisning',
			'viewicons'       : 'Ikonvisning',
			'viewSmall'       : 'Små ikoner', // from v2.1.39 added 22.5.2018
			'viewMedium'      : 'Medium ikoner', // from v2.1.39 added 22.5.2018
			'viewLarge'       : 'Store ikoner', // from v2.1.39 added 22.5.2018
			'viewExtraLarge'  : 'Ekstra store ikoner', // from v2.1.39 added 22.5.2018
			'places'          : 'Placeringer',
			'calc'            : 'Beregn',
			'path'            : 'Sti',
			'aliasfor'        : 'Alias for',
			'locked'          : 'Låst',
			'dim'             : 'Størrelser',
			'files'           : 'Filer',
			'folders'         : 'Mapper',
			'items'           : 'Emner',
			'yes'             : 'ja',
			'no'              : 'nej',
			'link'            : 'Link',
			'searcresult'     : 'Søgeresultater',
			'selected'        : 'valgte emner',
			'about'           : 'Om',
			'shortcuts'       : 'Genveje',
			'help'            : 'Hjælp',
			'webfm'           : 'Internet filmanager',
			'ver'             : 'Version',
			'protocolver'     : 'protokol version',
			'homepage'        : 'Projektside',
			'docs'            : 'Dokumentation',
			'github'          : 'Fork os på Github',
			'twitter'         : 'Følg os på Twitter',
			'facebook'        : 'Følg os på Facebook',
			'team'            : 'Hold',
			'chiefdev'        : 'hovedudvikler',
			'developer'       : 'udvikler',
			'contributor'     : 'bidragyder',
			'maintainer'      : 'vedligeholder',
			'translator'      : 'oversætter',
			'icons'           : 'Ikoner',
			'dontforget'      : 'og glem ikke at tage dit håndklæde',
			'shortcutsof'     : 'Gemveje deaktiveret',
			'dropFiles'       : 'Drop filer hertil',
			'or'              : 'eller',
			'selectForUpload' : 'Vælg filer',
			'moveFiles'       : 'Flyt filer',
			'copyFiles'       : 'Kopier filer',
			'restoreFiles'    : 'Gendan emner', // from v2.1.24 added 5.5.2017
			'rmFromPlaces'    : 'Slet fra placering',
			'aspectRatio'     : 'Skærmformat',
			'scale'           : 'Skala',
			'width'           : 'Bredde',
			'height'          : 'Højde',
			'resize'          : 'Tilpas størrelse',
			'crop'            : 'Beskær',
			'rotate'          : 'Roter',
			'rotate-cw'       : 'Roter 90 grader med uret',
			'rotate-ccw'      : 'Roter 90 grader mod uret',
			'degree'          : 'Grader',
			'netMountDialogTitle' : 'Mount netwærkdrev', // added 18.04.2012
			'protocol'            : 'Protokol', // added 18.04.2012
			'host'                : 'Vært', // added 18.04.2012
			'port'                : 'Port', // added 18.04.2012
			'user'                : 'Bruger', // added 18.04.2012
			'pass'                : 'Kodeord', // added 18.04.2012
			'confirmUnmount'      : 'Unmounter du $1?',  // from v2.1 added 30.04.2012
			'dropFilesBrowser': 'Slip eller indsæt filer fra browseren', // from v2.1 added 30.05.2012
			'dropPasteFiles'  : 'Slip filer, indsæt webadresser eller billeder (udklipsholder) her', // from v2.1 added 07.04.2014
			'encoding'        : 'Indkodning', // from v2.1 added 19.12.2014
			'locale'          : 'Sprog',   // from v2.1 added 19.12.2014
			'searchTarget'    : 'Mål: $1',                // from v2.1 added 22.5.2015
			'searchMime'      : 'Søg efter input MIME-type', // from v2.1 added 22.5.2015
			'owner'           : 'Ejer', // from v2.1 added 20.6.2015
			'group'           : 'Gruppe', // from v2.1 added 20.6.2015
			'other'           : 'Andet', // from v2.1 added 20.6.2015
			'execute'         : 'Udfør', // from v2.1 added 20.6.2015
			'perm'            : 'Tilladelse', // from v2.1 added 20.6.2015
			'mode'            : 'Mode', // from v2.1 added 20.6.2015
			'emptyFolder'     : 'Mappe er tom', // from v2.1.6 added 30.12.2015
			'emptyFolderDrop' : 'Mappe er tom\\A Drop for at tilføje enmer', // from v2.1.6 added 30.12.2015
			'emptyFolderLTap' : 'Mappen er tom\\A Langt tryk for at tilføje emner', // from v2.1.6 added 30.12.2015
			'quality'         : 'Kvalitet', // from v2.1.6 added 5.1.2016
			'autoSync'        : 'Autosync',  // from v2.1.6 added 10.1.2016
			'moveUp'          : 'Flyt op',  // from v2.1.6 added 18.1.2016
			'getLink'         : 'Hent URL-link', // from v2.1.7 added 9.2.2016
			'selectedItems'   : 'Valgte emner ($1)', // from v2.1.7 added 2.19.2016
			'folderId'        : 'Folder-ID', // from v2.1.10 added 3.25.2016
			'offlineAccess'   : 'Tillad offline adgang', // from v2.1.10 added 3.25.2016
			'reAuth'          : 'For at godkende igen', // from v2.1.10 added 3.25.2016
			'nowLoading'      : 'Indlæser nu...', // from v2.1.12 added 4.26.2016
			'openMulti'       : 'Åben flere filer', // from v2.1.12 added 5.14.2016
			'openMultiConfirm': 'Du prøver at åbne $1-filerne. Er du sikker på, at du vil åbne i browseren?', // from v2.1.12 added 5.14.2016
			'emptySearch'     : 'Søgeresultaterne er tomme i søgemålet.', // from v2.1.12 added 5.16.2016
			'editingFile'     : 'Redigerer en fil.', // from v2.1.13 added 6.3.2016
			'hasSelected'     : 'Du har valgt $1 emner.', // from v2.1.13 added 6.3.2016
			'hasClipboard'    : 'Du har $1 emner i udklipsholder.', // from v2.1.13 added 6.3.2016
			'incSearchOnly'   : 'Inkrementel søgning er kun fra den aktuelle visning.', // from v2.1.13 added 6.30.2016
			'reinstate'       : 'Genindsæt', // from v2.1.15 added 3.8.2016
			'complete'        : '$1 færdig', // from v2.1.15 added 21.8.2016
			'contextmenu'     : 'Kontekstmenu', // from v2.1.15 added 9.9.2016
			'pageTurning'     : 'Sidevending', // from v2.1.15 added 10.9.2016
			'volumeRoots'     : 'Diskenheds rødder', // from v2.1.16 added 16.9.2016
			'reset'           : 'Nulstil', // from v2.1.16 added 1.10.2016
			'bgcolor'         : 'Baggrundsfarve', // from v2.1.16 added 1.10.2016
			'colorPicker'     : 'Farvevælger', // from v2.1.16 added 1.10.2016
			'8pxgrid'         : '8px grid', // from v2.1.16 added 4.10.2016
			'enabled'         : 'Aktiveret', // from v2.1.16 added 4.10.2016
			'disabled'        : 'Deaktiveret', // from v2.1.16 added 4.10.2016
			'emptyIncSearch'  : 'Søgeresultaterne er tomme i den aktuelle visning.\\ATryk på [Enter] for at udvide søgemålet.', // from v2.1.16 added 5.10.2016
			'emptyLetSearch'  : 'Førstebogstavs søgeresultater er tomme i den aktuelle visning.', // from v2.1.23 added 24.3.2017
			'textLabel'       : 'Tekstlabel', // from v2.1.17 added 13.10.2016
			'minsLeft'        : '$1 minutter tilbage', // from v2.1.17 added 13.11.2016
			'openAsEncoding'  : 'Åbn igen med valgt encoding', // from v2.1.19 added 2.12.2016
			'saveAsEncoding'  : 'Gem med valgt encoding', // from v2.1.19 added 2.12.2016
			'selectFolder'    : 'Vælg mappe', // from v2.1.20 added 13.12.2016
			'firstLetterSearch': 'Førstebogstavs søgning', // from v2.1.23 added 24.3.2017
			'presets'         : 'Forudindstillinger', // from v2.1.25 added 26.5.2017
			'tooManyToTrash'  : 'Det er for mange emner, så det kan ikke komme i papirkurven.', // from v2.1.25 added 9.6.2017
			'TextArea'        : 'TextArea', // from v2.1.25 added 14.6.2017
			'folderToEmpty'   : 'Tøm mappen "$1".', // from v2.1.25 added 22.6.2017
			'filderIsEmpty'   : 'Der er ingen emner i mappen "$1".', // from v2.1.25 added 22.6.2017
			'preference'      : 'Præference', // from v2.1.26 added 28.6.2017
			'language'        : 'Sprog', // from v2.1.26 added 28.6.2017
			'clearBrowserData': 'Initialiser de indstillinger, der er gemt i denne browser', // from v2.1.26 added 28.6.2017
			'toolbarPref'     : 'Værktøjslinjens indstillinger', // from v2.1.27 added 2.8.2017
			'charsLeft'       : '... $1 tegn tilbage.',  // from v2.1.29 added 30.8.2017
			'linesLeft'       : '... $1 linjer tilbage.',  // from v2.1.52 added 16.1.2020
			'sum'             : 'Sum', // from v2.1.29 added 28.9.2017
			'roughFileSize'   : 'Omtrentlig filstørrelse', // from v2.1.30 added 2.11.2017
			'autoFocusDialog' : 'Fokuser på elementet i dialog med musemarkering',  // from v2.1.30 added 2.11.2017
			'select'          : 'Vælg', // from v2.1.30 added 23.11.2017
			'selectAction'    : 'Handling, når du vælger fil', // from v2.1.30 added 23.11.2017
			'useStoredEditor' : 'Åbn med den editor, der blev brugt sidst', // from v2.1.30 added 23.11.2017
			'selectinvert'    : 'Inverter valg', // from v2.1.30 added 25.11.2017
			'renameMultiple'  : 'Er du sikker på, at du vil omdøbe $1 valgte emner som $2?<br/>Dette kan ikke fortrydes!', // from v2.1.31 added 4.12.2017
			'batchRename'     : 'Batch omdøbning', // from v2.1.31 added 8.12.2017
			'plusNumber'      : '+ Tal', // from v2.1.31 added 8.12.2017
			'asPrefix'        : 'Tilføj prefix', // from v2.1.31 added 8.12.2017
			'asSuffix'        : 'Tilføj suffix', // from v2.1.31 added 8.12.2017
			'changeExtention' : 'Skift filendelse', // from v2.1.31 added 8.12.2017
			'columnPref'      : 'Kolonneindstillinger (listevisning)', // from v2.1.32 added 6.2.2018
			'reflectOnImmediate' : 'Alle ændringer påvirker straks arkivet.', // from v2.1.33 added 2.3.2018
			'reflectOnUnmount'   : 'Eventuelle ændringer gennemføres ikke, før denne enhed fjernes.', // from v2.1.33 added 2.3.2018
			'unmountChildren' : 'Følgende disk(e) mounted på denne enhed unmountes også. Er du sikker på at unmounte den?', // from v2.1.33 added 5.3.2018
			'selectionInfo'   : 'Valg info', // from v2.1.33 added 7.3.2018
			'hashChecker'     : 'Algoritmer, der viser filens hash', // from v2.1.33 added 10.3.2018
			'infoItems'       : 'Info-emner (panelet til valg af info)', // from v2.1.38 added 28.3.2018
			'pressAgainToExit': 'Tryk igen for at afslutte.', // from v2.1.38 added 1.4.2018
			'toolbar'         : 'Værktøjslinje', // from v2.1.38 added 4.4.2018
			'workspace'       : 'Arbejdsområde', // from v2.1.38 added 4.4.2018
			'dialog'          : 'Dialog', // from v2.1.38 added 4.4.2018
			'all'             : 'Alle', // from v2.1.38 added 4.4.2018
			'iconSize'        : 'Ikonstørrelse (ikonvisning)', // from v2.1.39 added 7.5.2018
			'editorMaximized' : 'Åbn det maksimerede editorvindue', // from v2.1.40 added 30.6.2018
			'editorConvNoApi' : 'Da konvertering via API ikke er tilgængelig i øjeblikket, bedes du konvertere på webstedet.', //from v2.1.40 added 8.7.2018
			'editorConvNeedUpload' : 'Efter konvertering skal du uploade med elementets URL eller en downloadet fil for at gemme den konverterede fil.', //from v2.1.40 added 8.7.2018
			'convertOn'       : 'Konverter på stedet på $1', // from v2.1.40 added 10.7.2018
			'integrations'    : 'Integrationer', // from v2.1.40 added 11.7.2018
			'integrationWith' : 'Denne elFinder har følgende eksterne tjenester integreret. Kontroller venligst vilkårene for brug, fortrolighedspolitik osv. inden du bruger det.', // from v2.1.40 added 11.7.2018
			'showHidden'      : 'Vis skjulte emner', // from v2.1.41 added 24.7.2018
			'hideHidden'      : 'Skjul skjulte emner', // from v2.1.41 added 24.7.2018
			'toggleHidden'    : 'Vis / Skjul skjulte emner', // from v2.1.41 added 24.7.2018
			'makefileTypes'   : 'Filtyper, der skal aktiveres med "Ny fil"', // from v2.1.41 added 7.8.2018
			'typeOfTextfile'  : 'Type af tekstfilen', // from v2.1.41 added 7.8.2018
			'add'             : 'Tilføj', // from v2.1.41 added 7.8.2018
			'theme'           : 'Tema', // from v2.1.43 added 19.10.2018
			'default'         : 'Standard', // from v2.1.43 added 19.10.2018
			'description'     : 'Beskrivelse', // from v2.1.43 added 19.10.2018
			'website'         : 'Hjemmeside', // from v2.1.43 added 19.10.2018
			'author'          : 'Forfatter', // from v2.1.43 added 19.10.2018
			'email'           : 'Mail', // from v2.1.43 added 19.10.2018
			'license'         : 'Licens', // from v2.1.43 added 19.10.2018
			'exportToSave'    : 'Dette element kan ikke gemmes. For at undgå at miste redigeringerne skal du eksportere til din pc.', // from v2.1.44 added 1.12.2018
			'dblclickToSelect': 'Dobbeltklik på filen for at vælge den.', // from v2.1.47 added 22.1.2019
			'useFullscreen'   : 'Brug fuldskærmstilstand', // from v2.1.47 added 19.2.2019

			/********************************** mimetypes **********************************/
			'kindUnknown'     : 'Ukendt',
			'kindRoot'        : 'Diskenheds rod', // from v2.1.16 added 16.10.2016
			'kindFolder'      : 'Mappe',
			'kindSelects'     : 'Valg', // from v2.1.29 added 29.8.2017
			'kindAlias'       : 'Alias',
			'kindAliasBroken' : 'Ødelagt alias',
			// applications
			'kindApp'         : 'Applikation',
			'kindPostscript'  : 'Postscript dokument',
			'kindMsOffice'    : 'Microsoft Office dokument',
			'kindMsWord'      : 'Microsoft Word dokument',
			'kindMsExcel'     : 'Microsoft Excel dokument',
			'kindMsPP'        : 'Microsoft Powerpoint præsentation',
			'kindOO'          : 'Open Office dokument',
			'kindAppFlash'    : 'Flash applikation',
			'kindPDF'         : 'Flytbart Dokument Format (PDF)',
			'kindTorrent'     : 'Bittorrent fil',
			'kind7z'          : '7z arkiv',
			'kindTAR'         : 'TAR arkiv',
			'kindGZIP'        : 'GZIP arkiv',
			'kindBZIP'        : 'BZIP arkiv',
			'kindXZ'          : 'XZ arkiv',
			'kindZIP'         : 'ZIP arkiv',
			'kindRAR'         : 'RAR arkiv',
			'kindJAR'         : 'Java JAR fil',
			'kindTTF'         : 'True Type skrift',
			'kindOTF'         : 'Open Type skrift',
			'kindRPM'         : 'RPM pakke',
			// texts
			'kindText'        : 'Tekstdokument',
			'kindTextPlain'   : 'Ren tekst',
			'kindPHP'         : 'PHP-kode',
			'kindCSS'         : 'Cascading style sheet',
			'kindHTML'        : 'HTML-dokument',
			'kindJS'          : 'Javascript-kode',
			'kindRTF'         : 'Rich Text Format',
			'kindC'           : 'Ckkode',
			'kindCHeader'     : 'C header-kode',
			'kindCPP'         : 'C++-kode',
			'kindCPPHeader'   : 'C++ header-kode',
			'kindShell'       : 'Unix-skal-script',
			'kindPython'      : 'Python-kode',
			'kindJava'        : 'Java-kode',
			'kindRuby'        : 'Ruby-kode',
			'kindPerl'        : 'Perlscript',
			'kindSQL'         : 'SQ- kode',
			'kindXML'         : 'XML-dokument',
			'kindAWK'         : 'AWK-kode',
			'kindCSV'         : 'Komma seperarede værdier',
			'kindDOCBOOK'     : 'Docbook XML-dokument',
			'kindMarkdown'    : 'Markdown-tekst', // added 20.7.2015
			// images
			'kindImage'       : 'Billede',
			'kindBMP'         : 'BMP-billede',
			'kindJPEG'        : 'JPEG-billede',
			'kindGIF'         : 'GIF-billede',
			'kindPNG'         : 'PNG-billede',
			'kindTIFF'        : 'TIFF-billede',
			'kindTGA'         : 'TGA-billede',
			'kindPSD'         : 'Adobe Photoshop-billede',
			'kindXBITMAP'     : 'X bitmap-billede',
			'kindPXM'         : 'Pixelmator-billede',
			// media
			'kindAudio'       : 'Lydmedie',
			'kindAudioMPEG'   : 'MPEG-lyd',
			'kindAudioMPEG4'  : 'MPEG-4-lyd',
			'kindAudioMIDI'   : 'MIDI-lyd',
			'kindAudioOGG'    : 'Ogg Vorbis-lyd',
			'kindAudioWAV'    : 'WAV-lyd',
			'AudioPlaylist'   : 'MP3-spilleliste',
			'kindVideo'       : 'Videomedie',
			'kindVideoDV'     : 'DV-video',
			'kindVideoMPEG'   : 'MPEG-video',
			'kindVideoMPEG4'  : 'MPEG-4-video',
			'kindVideoAVI'    : 'AVI-video',
			'kindVideoMOV'    : 'Quick Time-video',
			'kindVideoWM'     : 'Windows Media-video',
			'kindVideoFlash'  : 'Flash-video',
			'kindVideoMKV'    : 'Matroska-video',
			'kindVideoOGG'    : 'Ogg-video'
		}
	};
}));js/i18n/elfinder.sv.js000064400000101021151215013360010504 0ustar00/**
 * Svenska translation
 * @author Gabriel Satzger <gabriel.satzger@sbg.se>
 * @version 2022-03-03
 */
 (function(root, factory) {
	if (typeof define === 'function' && define.amd) {
		define(['elfinder'], factory);
	} else if (typeof exports !== 'undefined') {
		module.exports = factory(require('elfinder'));
	} else {
		factory(root.elFinder);
	}
}(this, function(elFinder) {
	elFinder.prototype.i18.sv = {
		translator : 'Gabriel Satzger &lt;gabriel.satzger@sbg.se&gt;',
		language   : 'Svenska',
		direction  : 'ltr',
		dateFormat : 'Y-m-d H:i', // will show like: 2022-03-03 15:33
		fancyDateFormat : '$1 H:i', // will show like: Idag 15:33
		nonameDateFormat : 'ymd-His', // noname upload will show like: 220303-153348
		messages   : {
			'getShareText' : 'Dela med sig',
			'Editor ': 'Kodredigerare',

			/********************************** errors **********************************/
			'error'                : 'Fel',
			'errUnknown'           : 'Okänt error.',
			'errUnknownCmd'        : 'Okänt kommando.',
			'errJqui'              : 'Felaktig jQuery UI konfiguration. Komponenterna selectable, draggable och droppable måste vara inkluderade.',
			'errNode'              : 'elFinder kräver att DOM Elementen skapats.',
			'errURL'               : 'Felaktig elFinder konfiguration! URL parametern är inte satt.',
			'errAccess'            : 'Åtkomst nekad.',
			'errConnect'           : 'Kan inte ansluta till backend.',
			'errAbort'             : 'Anslutningen avbröts.',
			'errTimeout'           : 'Anslutningen löpte ut.',
			'errNotFound'          : 'Backend hittades inte.',
			'errResponse'          : 'Ogiltig backend svar.',
			'errConf'              : 'Ogiltig backend konfiguration.',
			'errJSON'              : 'PHP JSON modul är inte installerad.',
			'errNoVolumes'         : 'Läsbara volymer är inte tillgängliga.',
			'errCmdParams'         : 'Ogiltiga parametrar för kommandot "$1".',
			'errDataNotJSON'       : 'Datan är inte JSON.',
			'errDataEmpty'         : 'Datan är tom.',
			'errCmdReq'            : 'Backend begäran kräver kommandonamn.',
			'errOpen'              : 'Kan inte öppna "$1".',
			'errNotFolder'         : 'Objektet är inte en mapp.',
			'errNotFile'           : 'Objektet är inte en fil.',
			'errRead'              : 'Kan inte läsa "$1".',
			'errWrite'             : 'Kan inte skriva till "$1".',
			'errPerm'              : 'Tillstånd nekat.',
			'errLocked'            : '"$1" är låst och kan inte döpas om, flyttas eller tas bort.',
			'errExists'            : 'Fil med namn "$1" finns redan.',
			'errInvName'           : 'Ogiltigt filnamn.',
			'errInvDirname'        : 'Ogiltigt mappnamn.',  // from v2.1.24 added 12.4.2017
			'errFolderNotFound'    : 'Mappen hittades inte.',
			'errFileNotFound'      : 'Filen hittades inte.',
			'errTrgFolderNotFound' : 'Målmappen "$1" hittades inte.',
			'errPopup'             : 'Webbläsaren hindrade popup-fönstret att öppnas. Ändra i webbläsarens inställningar för att kunna öppna filen.',
			'errMkdir'             : 'Kan inte skapa mappen "$1".',
			'errMkfile'            : 'Kan inte skapa filen "$1".',
			'errRename'            : 'Kan inte döpa om "$1".',
			'errCopyFrom'          : 'Kopiera filer från volym "$1" tillåts inte.',
			'errCopyTo'            : 'Kopiera filer till volym "$1" tillåts inte.',
			'errMkOutLink'         : 'Det går inte att skapa en länk utanför volymroten.', // from v2.1 added 03.10.2015
			'errUpload'            : 'Error vid uppladdningen.',  // old name - errUploadCommon
			'errUploadFile'        : 'Kan inte ladda upp "$1".', // old name - errUpload
			'errUploadNoFiles'     : 'Inga filer hittades för uppladdning.',
			'errUploadTotalSize'   : 'Data överskrider den högsta tillåtna storleken.', // old name - errMaxSize
			'errUploadFileSize'    : 'Filen överskrider den högsta tillåtna storleken.', //  old name - errFileMaxSize
			'errUploadMime'        : 'Otillåten filtyp.',
			'errUploadTransfer'    : '"$1" överföringsfel.',
			'errUploadTemp'        : 'Det gick inte att göra en tillfällig fil för uppladdning.', // from v2.1 added 26.09.2015
			'errNotReplace'        : 'Objekt "$1" finns redan på den här platsen och kan inte ersättas av objekt med en annan typ.', // new
			'errReplace'           : 'Det går inte att ersätta "$1".',
			'errSave'              : 'Kan inte spara "$1".',
			'errCopy'              : 'Kan inte kopiera "$1".',
			'errMove'              : 'Kan inte flytta "$1".',
			'errCopyInItself'      : 'Kan inte flytta "$1" till sig själv.',
			'errRm'                : 'Kan inte ta bort "$1".',
			'errTrash'             : 'Kan inte hamna i papperskorgen.', // from v2.1.24 added 30.4.2017
			'errRmSrc'             : 'Det går inte att ta bort källfil(er).',
			'errExtract'           : 'Kan inte packa upp filen från "$1".',
			'errArchive'           : 'Kan inte skapa arkiv.',
			'errArcType'           : 'Arkivtypen stöds inte.',
			'errNoArchive'         : 'Filen är inte av typen arkiv.',
			'errCmdNoSupport'      : 'Backend stöder inte detta kommando.',
			'errReplByChild'       : 'Mappen “$1” kan inte ersättas av ett objekt den innehåller.',
			'errArcSymlinks'       : 'Av säkerhetsskäl nekas arkivet att packas upp då det innehåller symboliska länkar eller filer med ej tillåtna namn.', // edited 24.06.2012
			'errArcMaxSize'        : 'Arkivfiler överskrider största tillåtna storlek.',
			'errResize'            : 'Kan inte ändra storlek "$1".',
			'errResizeDegree'      : 'Ogiltig rotationsgrad.',  // added 7.3.2013
			'errResizeRotate'      : 'Det går inte att rotera bilden.',  // added 7.3.2013
			'errResizeSize'        : 'Ogiltig bildstorlek.',  // added 7.3.2013
			'errResizeNoChange'    : 'Bildstorleken har inte ändrats.',  // added 7.3.2013
			'errUsupportType'      : 'Filtypen stöds inte.',
			'errNotUTF8Content'    : 'Filen "$1" är inte i UTF-8 och kan inte redigeras.',  // added 9.11.2011
			'errNetMount'          : 'Kan inte koppla "$1".', // added 17.04.2012
			'errNetMountNoDriver'  : 'Protokollet stöds inte.',     // added 17.04.2012
			'errNetMountFailed'    : 'Kopplingen misslyckades.',         // added 17.04.2012
			'errNetMountHostReq'   : 'Host krävs.', // added 18.04.2012
			'errSessionExpires'    : 'Din session har löpt ut på grund av inaktivitet.',
			'errCreatingTempDir'   : 'Det gick inte att skapa en tillfällig katalog: "$1"',
			'errFtpDownloadFile'   : 'Det gick inte att ladda ner filen från FTP: "$1"',
			'errFtpUploadFile'     : 'Det gick inte att ladda upp filen till FTP: "$1"',
			'errFtpMkdir'          : 'Det går inte att skapa fjärrkatalog på FTP: "$1"',
			'errArchiveExec'       : 'Fel vid arkivering av filer: "$1"',
			'errExtractExec'       : 'Fel vid extrahering av filer: "$1"',
			'errNetUnMount'        : 'Det går inte att avmontera.', // from v2.1 added 30.04.2012
			'errConvUTF8'          : 'Ej konvertibel till UTF-8', // from v2.1 added 08.04.2014
			'errFolderUpload'      : 'Prova den moderna webbläsaren, om du vill ladda upp mappen.', // from v2.1 added 26.6.2015
			'errSearchTimeout'     : 'Tidsgränsen tog slut när du sökte efter "$1". Sökresultatet är delvis.', // from v2.1 added 12.1.2016
			'errReauthRequire'     : 'Återauktorisering krävs.', // from v2.1.10 added 24.3.2016
			'errMaxTargets'        : 'Max antal valbara föremål är $1.', // from v2.1.17 added 17.10.2016
			'errRestore'           : 'Det gick inte att återställa från papperskorgen. Kan inte identifiera återställningsdestinationen.', // from v2.1.24 added 3.5.2017
			'errEditorNotFound'    : 'Det gick inte att hitta redigeraren för denna filtyp.', // from v2.1.25 added 23.5.2017
			'errServerError'       : 'Fel uppstod på serversidan.', // from v2.1.25 added 16.6.2017
			'errEmpty'             : 'Det gick inte att tömma mappen "$1".', // from v2.1.25 added 22.6.2017
			'moreErrors'           : 'Det finns $1 fler fel.', // from v2.1.44 added 9.12.2018
			'errMaxMkdirs'         : 'Du kan skapa upp till $1 mappar åt gången.', // from v2.1.58 added 20.6.2021

			/******************************* commands names ********************************/
			'cmdarchive'   : 'Skapa arkiv',
			'cmdback'      : 'Tillbaka',
			'cmdcopy'      : 'Kopiera',
			'cmdcut'       : 'Klipp ut',
			'cmddownload'  : 'Ladda ned',
			'cmdduplicate' : 'Duplicera',
			'cmdedit'      : 'Redigera fil',
			'cmdextract'   : 'Extrahera filer från arkiv',
			'cmdforward'   : 'Framåt',
			'cmdgetfile'   : 'Välj filer',
			'cmdhelp'      : 'Om denna programvara',
			'cmdhome'      : 'Hem',
			'cmdinfo'      : 'Visa info',
			'cmdmkdir'     : 'Ny mapp',
			'cmdmkdirin'   : 'Till ny mapp', // from v2.1.7 added 19.2.2016
			'cmdmkfile'    : 'Ny fil',
			'cmdopen'      : 'Öppna',
			'cmdpaste'     : 'Klistra in',
			'cmdquicklook' : 'Förhandsgranska',
			'cmdreload'    : 'Ladda om',
			'cmdrename'    : 'Döp om',
			'cmdrm'        : 'Radera',
			'cmdtrash'     : 'Till papperskorgen', //from v2.1.24 added 29.4.2017
			'cmdrestore'   : 'Återställ', //from v2.1.24 added 3.5.2017
			'cmdsearch'    : 'Hitta filer',
			'cmdup'        : 'Gå till överordnade katalog',
			'cmdupload'    : 'Ladda upp filer',
			'cmdview'      : 'Visa',
			'cmdresize'    : 'Ändra bildstorlek',
			'cmdsort'      : 'Sortera',
			'cmdnetmount'  : 'Montera nätverksvolym', // added 18.04.2012
			'cmdnetunmount': 'Avmontera', // from v2.1 added 30.04.2012
			'cmdplaces'    : 'Till platser', // added 28.12.2014
			'cmdchmod'     : 'Ändra läge', // from v2.1 added 20.6.2015
			'cmdopendir'   : 'Öppna en mapp', // from v2.1 added 13.1.2016
			'cmdcolwidth'  : 'Återställ kolumnbredd', // from v2.1.13 added 12.06.2016
			'cmdfullscreen': 'Fullskärm', // from v2.1.15 added 03.08.2016
			'cmdmove'      : 'Flytta', // from v2.1.15 added 21.08.2016
			'cmdempty'     : 'Töm mappen', // from v2.1.25 added 22.06.2017
			'cmdundo'      : 'Ångra', // from v2.1.27 added 31.07.2017
			'cmdredo'      : 'Göra om', // from v2.1.27 added 31.07.2017
			'cmdpreference': 'Inställningar', // from v2.1.27 added 03.08.2017
			'cmdselectall' : 'Välj alla', // from v2.1.28 added 15.08.2017
			'cmdselectnone': 'Välj ingen', // from v2.1.28 added 15.08.2017
			'cmdselectinvert': 'Invertera urval', // from v2.1.28 added 15.08.2017
			'cmdopennew'   : 'Öppna i nytt fönster', // from v2.1.38 added 3.4.2018
			'cmdhide'      : 'Dölj (preferens)', // from v2.1.41 added 24.7.2018

			/*********************************** buttons ***********************************/
			'btnClose'  : 'Stäng',
			'btnSave'   : 'Spara',
			'btnRm'     : 'Ta bort',
			'btnApply'  : 'Verkställ',
			'btnCancel' : 'Ångra',
			'btnNo'     : 'Nej',
			'btnYes'    : 'Ja',
			'btnMount'  : 'Montera',  // added 18.04.2012
			'btnApprove': 'Gå till $1 och godkänn', // from v2.1 added 26.04.2012
			'btnUnmount': 'Avmontera', // from v2.1 added 30.04.2012
			'btnConv'   : 'Konvertera', // from v2.1 added 08.04.2014
			'btnCwd'    : 'Här',      // from v2.1 added 22.5.2015
			'btnVolume' : 'Volym',    // from v2.1 added 22.5.2015
			'btnAll'    : 'Allt',       // from v2.1 added 22.5.2015
			'btnMime'   : 'MIME-typ', // from v2.1 added 22.5.2015
			'btnFileName':'Filnamn',  // from v2.1 added 22.5.2015
			'btnSaveClose': 'Spara & Stäng', // from v2.1 added 12.6.2015
			'btnBackup' : 'Säkerhetskopiering', // fromv2.1 added 28.11.2015
			'btnRename'    : 'Döp om',      // from v2.1.24 added 6.4.2017
			'btnRenameAll' : 'Byt namn (alla)', // from v2.1.24 added 6.4.2017
			'btnPrevious' : 'Föregående ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnNext'     : 'Nästa ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnSaveAs'   : 'Spara som', // from v2.1.25 added 24.5.2017

			/******************************** notifications ********************************/
			'ntfopen'     : 'Öppnar mapp',
			'ntffile'     : 'Öppnar fil',
			'ntfreload'   : 'Laddar om mappinnehållet',
			'ntfmkdir'    : 'Skapar katalog',
			'ntfmkfile'   : 'Skapar fil',
			'ntfrm'       : 'Tar bort filer',
			'ntfcopy'     : 'Kopierar filer',
			'ntfmove'     : 'Flyttar filer',
			'ntfprepare'  : 'Förbereder att flytta filer',
			'ntfrename'   : 'Döper om filer',
			'ntfupload'   : 'Laddar upp filer',
			'ntfdownload' : 'Laddar ner filer',
			'ntfsave'     : 'Sparar filer',
			'ntfarchive'  : 'Skapar arkiv',
			'ntfextract'  : 'Extraherar filer från arkiv',
			'ntfsearch'   : 'Söker filer',
			'ntfresize'   : 'Ändra storlek på bilder',
			'ntfsmth'     : 'Gör någonting >_<',
			'ntfloadimg'  : 'Laddar bild',
			'ntfnetmount' : 'kopplar nätverksvolym', // added 18.04.2012
			'ntfnetunmount': 'Avmonterar nätverksvolym', // from v2.1 added 30.04.2012
			'ntfdim'      : 'Skaffa bilddimension', // added 20.05.2013
			'ntfreaddir'  : ' Läser mappinformation', // from v2.1 added 01.07.2013
			'ntfurl'      : 'Hämtar URL till länk', // from v2.1 added 11.03.2014
			'ntfchmod'    : 'Ändra filläge', // from v2.1 added 20.6.2015
			'ntfpreupload': 'Verifierar uppladdningsfilens namn', // from v2.1 added 31.11.2015
			'ntfzipdl'    : 'Skapa en fil för nedladdning', // from v2.1.7 added 23.1.2016
			'ntfparents'  : 'Hämta sökvägsinformation', // from v2.1.17 added 2.11.2016
			'ntfchunkmerge': 'Bearbetar den uppladdade filen', // from v2.1.17 added 2.11.2016
			'ntftrash'    : 'Håller på att slänga i soporna', // from v2.1.24 added 2.5.2017
			'ntfrestore'  : 'Återställer från papperskorgen', // from v2.1.24 added 3.5.2017
			'ntfchkdir'   : 'Kontrollerar målmapp', // from v2.1.24 added 3.5.2017
			'ntfundo'     : 'Ångra föregående åtgärd', // from v2.1.27 added 31.07.2017
			'ntfredo'     : 'Gör om föregående ångrat', // from v2.1.27 added 31.07.2017
			'ntfchkcontent' : 'Kontrollerar innehållet', // from v2.1.41 added 3.8.2018

			/*********************************** volumes *********************************/
			'volume_Trash' : 'Skräp', //from v2.1.24 added 29.4.2017

			/************************************ dates **********************************/
			'dateUnknown' : 'okänt',
			'Today'       : 'Idag',
			'Yesterday'   : 'Igår',
			'msJan'       : 'Jan',
			'msFeb'       : 'feb',
			'msMar'       : 'Mar',
			'msApr'       : 'apr',
			'msMay'       : 'Maj',
			'msJun'       : 'Jun',
			'msJul'       : 'jul',
			'msAug'       : 'aug',
			'msSep'       : 'sep',
			'msOct'       : 'Okt',
			'msNov'       : 'nov',
			'msDec'       : 'dec',
			'January'     : 'Januari',
			'February'    : 'Februari',
			'March'       : 'Mars',
			'April'       : 'april',
			'May'         : 'Maj',
			'June'        : 'Juni',
			'July'        : 'Juli',
			'August'      : 'Augusti',
			'September'   : 'September',
			'October'     : 'Oktober',
			'November'    : 'november',
			'December'    : 'december',
			'Sunday'      : 'Söndag',
			'Monday'      : 'Måndag',
			'Tuesday'     : 'Tisdag',
			'Wednesday'   : 'Onsdag',
			'Thursday'    : 'Torsdag',
			'Friday'      : 'Fredag',
			'Saturday'    : 'Lördag',
			'Sun'         : 'Sön',
			'Mon'         : 'Mån',
			'Tue'         : 'Tis',
			'Wed'         : 'Ons',
			'Thu'         : 'Tor',
			'Fri'         : 'Fre',
			'Sat'         : 'Lör',

			/******************************** sort variants ********************************/
			'sortname'          : 'efter namn',
			'sortkind'          : 'efter sort',
			'sortsize'          : 'efter storlek',
			'sortdate'          : 'efter datum',
			'sortFoldersFirst'  : 'Mappar först',
			'sortperm'          : 'med tillstånd', // from v2.1.13 added 13.06.2016
			'sortmode'          : 'efter läge',       // from v2.1.13 added 13.06.2016
			'sortowner'         : 'efter läge',      // from v2.1.13 added 13.06.2016
			'sortgroup'         : 'efter grupp',      // from v2.1.13 added 13.06.2016
			'sortAlsoTreeview'  : 'Även Treeview',  // from v2.1.15 added 01.08.2016

			/********************************** new items **********************************/
			'untitled file.txt' : 'Ny fil.txt', // added 10.11.2015
			'untitled folder'   : 'Ny mapp',   // added 10.11.2015
			'Archive'           : 'Nytt Arkiv',  // from v2.1 added 10.11.2015
			'untitled file'     : 'Ny fil.$1',  // from v2.1.41 added 6.8.2018
			'extentionfile'     : '$1: Fil',    // from v2.1.41 added 6.8.2018
			'extentiontype'     : '$1: $2',      // from v2.1.43 added 17.10.2018

			/********************************** messages **********************************/
			'confirmReq'      : 'Bekräftelse krävs',
			'confirmRm'       : 'Är du säker på att du vill ta bort filer? <br/> Detta kan inte ångras!',
			'confirmRepl'     : 'Ersätt den gamla filen med en ny?',
			'confirmRest'     : 'Ersätta befintliga objekt med objektet i papperskorgen?', // fromv2.1.24 added 5.5.2017
			'confirmConvUTF8' : 'Inte i UTF-8<br/>Konvertera till UTF-8?<br/>Innehåll blir UTF-8 genom att spara efter konvertering.', // from v2.1 added 08.04.2014
			'confirmNonUTF8'  : 'Det gick inte att upptäcka teckenkodning för den här filen. Den måste tillfälligt konverteras till UTF-8 för redigering.<br/>Välj teckenkodning för denna fil.', // from v2.1.19 added 28.11.2016
			'confirmNotSave'  : 'Den har ändrats.<br/>Förlorar arbete om du inte sparar ändringar.', // from v2.1 added 15.7.2015
			'confirmTrash'    : 'Är du säker på att du vill flytta föremål till papperskorgen?', //from v2.1.24 added 29.4.2017
			'confirmMove'     : 'Är du säker på att du vill flytta objekt till "$1"?', //from v2.1.50 added 27.7.2019
			'apllyAll'        : 'Använd för alla',
			'name'            : 'Namn',
			'size'            : 'Storlek',
			'perms'           : 'Rättigheter',
			'modify'          : 'Ändrad',
			'kind'            : 'Sort',
			'read'            : 'läs',
			'write'           : 'skriv',
			'noaccess'        : 'ingen åtkomst',
			'and'             : 'och',
			'unknown'         : 'okänd',
			'selectall'       : 'Välj alla filer',
			'selectfiles'     : 'Välj fil(er)',
			'selectffile'     : 'Välj första filen',
			'selectlfile'     : 'Välj sista filen',
			'viewlist'        : 'Listvy',
			'viewicons'       : 'Ikonvy',
			'viewSmall'       : 'Små ikoner', // from v2.1.39 added 22.5.2018
			'viewMedium'      : 'Medelstora ikoner', // from v2.1.39 added 22.5.2018
			'viewLarge'       : 'Stora ikoner', // from v2.1.39 added 22.5.2018
			'viewExtraLarge'  : 'Extra stora ikoner', // from v2.1.39 added 22.5.2018
			'places'          : 'Platser',
			'calc'            : 'Beräkna',
			'path'            : 'Sökväg',
			'aliasfor'        : 'Alias för',
			'locked'          : 'Låst',
			'dim'             : 'Dimensioner',
			'files'           : 'Filer',
			'folders'         : 'Mappar',
			'items'           : 'Objekt',
			'yes'             : 'ja',
			'no'              : 'nej',
			'link'            : 'Länk',
			'searcresult'     : 'Sökresultat',
			'selected'        : 'valda objekt',
			'about'           : 'Om',
			'shortcuts'       : 'Genväg',
			'help'            : 'Hjälp',
			'webfm'           : 'Webbfilhanterare',
			'ver'             : 'Version',
			'protocolver'     : 'protokolversion',
			'homepage'        : 'Projekt hemsida',
			'docs'            : 'Dokumentation',
			'github'          : 'Forka oss på Github',
			'twitter'         : 'Följ oss på twitter',
			'facebook'        : 'Följ oss på facebook',
			'team'            : 'Team',
			'chiefdev'        : 'senior utvecklare',
			'developer'       : 'utvecklare',
			'contributor'     : 'bidragsgivare',
			'maintainer'      : 'underhållare',
			'translator'      : 'översättare',
			'icons'           : 'Ikoner',
			'dontforget'      : 'och glöm inte att ta med din handduk',
			'shortcutsof'     : 'Genvägar avaktiverade',
			'dropFiles'       : 'Släpp filerna här',
			'or'              : 'eller',
			'selectForUpload' : 'Välj filer att ladda upp',
			'moveFiles'       : 'Flytta filer',
			'copyFiles'       : 'Kopiera filer',
			'restoreFiles'    : 'Återställ objekt', // from v2.1.24 added 5.5.2017
			'rmFromPlaces'    : 'Ta bort från platser',
			'aspectRatio'     : 'Aspekt ratio',
			'scale'           : 'Skala',
			'width'           : 'Bredd',
			'height'          : 'Höjd',
			'resize'          : 'Ändra storlek',
			'crop'            : 'Beskär',
			'rotate'          : 'Rotera',
			'rotate-cw'       : 'Rotera 90 grader medurs',
			'rotate-ccw'      : 'Rotera 90 grader moturs',
			'degree'          : 'Grader',
			'netMountDialogTitle' : 'Koppla nätverksvolym', // added 18.04.2012
			'protocol'            : 'Protokol', // added 18.04.2012
			'host'                : 'Värd', // added 18.04.2012
			'port'                : 'Hamn', // added 18.04.2012
			'user'                : 'användare', // added 18.04.2012
			'pass'                : 'Lösenord', // added 18.04.2012
			'confirmUnmount'      : 'Avmonterar du $1?',  // from v2.1 added 30.04.2012
			'dropFilesBrowser': 'Släpp eller klistra in filer från webbläsaren', // from v2.1 added 30.05.2012
			'dropPasteFiles'  : 'Släpp filer, klistra in webbadresser eller bilder (klippbord) här', // from v2.1 added 07.04.2014
			'encoding'        : 'Kodning', // from v2.1 added 19.12.2014
			'locale'          : 'Plats',   // from v2.1 added 19.12.2014
			'searchTarget'    : 'Mål: $1',                // from v2.1 added 22.5.2015
			'searchMime'      : 'Sök efter indata MIME-typ', // from v2.1 added 22.5.2015
			'owner'           : 'Ägare', // from v2.1 added 20.6.2015
			'group'           : 'Grupp', // from v2.1 added 20.6.2015
			'other'           : 'Övrig', // from v2.1 added 20.6.2015
			'execute'         : 'Kör', // from v2.1 added 20.6.2015
			'perm'            : 'Lov', // from v2.1 added 20.6.2015
			'mode'            : 'Läge', // from v2.1 added 20.6.2015
			'emptyFolder'     : 'Mappen är tom', // from v2.1.6 added 30.12.2015
			'emptyFolderDrop' : 'Mappen är tom\\A Släpp för att lägga till objekt', // from v2.1.6 added 30.12.2015
			'emptyFolderLTap' : 'Mappen är tom\\En lång tryckning för att lägga till objekt', // from v2.1.6 added 30.12.2015
			'quality'         : 'Kvalitet', // from v2.1.6 added 5.1.2016
			'autoSync'        : 'Automatisk synkronisering',  // from v2.1.6 added 10.1.2016
			'moveUp'          : 'Flytta upp',  // from v2.1.6 added 18.1.2016
			'getLink'         : 'Få URL-länk', // from v2.1.7 added 9.2.2016
			'selectedItems'   : 'Valda föremål ($1)', // from v2.1.7 added 2.19.2016
			'folderId'        : 'Mapp-ID', // from v2.1.10 added 3.25.2016
			'offlineAccess'   : 'Tillåt offlineåtkomst', // from v2.1.10 added 3.25.2016
			'reAuth'          : 'För att autentisera på nytt', // from v2.1.10 added 3.25.2016
			'nowLoading'      : 'Laddar...', // from v2.1.12 added 4.26.2016
			'openMulti'       : 'Öppna flera filer', // from v2.1.12 added 5.14.2016
			'openMultiConfirm': 'Du försöker öppna $1-filerna. Är du säker på att du vill öppna i webbläsaren?', // from v2.1.12 added 5.14.2016
			'emptySearch'     : 'Sökresultaten är tomma i sökmålet.', // from v2.1.12 added 5.16.2016
			'editingFile'     : 'Det är att redigera en fil.', // from v2.1.13 added 6.3.2016
			'hasSelected'     : 'Du har valt $1 objekt.', // from v2.1.13 added 6.3.2016
			'hasClipboard'    : 'Du har $1 objekt i urklippet.', // from v2.1.13 added 6.3.2016
			'incSearchOnly'   : 'Inkrementell sökning är endast från den aktuella vyn.', // from v2.1.13 added 6.30.2016
			'reinstate'       : 'Återställ', // from v2.1.15 added 3.8.2016
			'complete'        : '$1 färdig', // from v2.1.15 added 21.8.2016
			'contextmenu'     : 'Innehållsmeny', // from v2.1.15 added 9.9.2016
			'pageTurning'     : 'Sidvändning', // from v2.1.15 added 10.9.2016
			'volumeRoots'     : 'Volymrötter', // from v2.1.16 added 16.9.2016
			'reset'           : 'Återställa', // from v2.1.16 added 1.10.2016
			'bgcolor'         : 'Bakgrundsfärg', // from v2.1.16 added 1.10.2016
			'colorPicker'     : 'Färgväljare', // from v2.1.16 added 1.10.2016
			'8pxgrid'         : '8px rutnät', // from v2.1.16 added 4.10.2016
			'enabled'         : 'Aktiverad', // from v2.1.16 added 4.10.2016
			'disabled'        : 'Inaktiverad', // from v2.1.16 added 4.10.2016
			'emptyIncSearch'  : 'Sökresultaten är tomma i den aktuella vyn.\\ATryck på [Retur] för att utöka sökmålet.', // from v2.1.16 added 5.10.2016
			'emptyLetSearch'  : 'Sökresultaten för första bokstaven är tomma i den aktuella vyn.', // from v2.1.23 added 24.3.2017
			'textLabel'       : 'Textetikett', // from v2.1.17 added 13.10.2016
			'minsLeft'        : '$1 min kvar', // from v2.1.17 added 13.11.2016
			'openAsEncoding'  : 'Öppna igen med vald kodning', // from v2.1.19 added 2.12.2016
			'saveAsEncoding'  : 'Spara med vald kodning', // from v2.1.19 added 2.12.2016
			'selectFolder'    : 'Välj mapp', // from v2.1.20 added 13.12.2016
			'firstLetterSearch': 'Första bokstavssökning', // from v2.1.23 added 24.3.2017
			'presets'         : 'Förinställningar', // from v2.1.25 added 26.5.2017
			'tooManyToTrash'  : 'Det är för många föremål så att det inte kan hamna i papperskorgen.', // from v2.1.25 added 9.6.2017
			'TextArea'        : 'TextArea', // from v2.1.25 added 14.6.2017
			'folderToEmpty'   : 'Töm mappen "$1".', // from v2.1.25 added 22.6.2017
			'filderIsEmpty'   : 'Det finns inga objekt i mappen "$1".', // from v2.1.25 added 22.6.2017
			'preference'      : 'Preferens', // from v2.1.26 added 28.6.2017
			'language'        : 'Språk', // from v2.1.26 added 28.6.2017
			'clearBrowserData': 'Initiera inställningarna som sparats i den här webbläsaren', // from v2.1.26 added 28.6.2017
			'toolbarPref'     : 'Verktygsfältsinställningar', // from v2.1.27 added 2.8.2017
			'charsLeft'       : '... $1 tecken kvar.',  // from v2.1.29 added 30.8.2017
			'linesLeft'       : '... $1 rader kvar.',  // from v2.1.52 added 16.1.2020
			'sum'             : 'Belopp', // from v2.1.29 added 28.9.2017
			'roughFileSize'   : 'Grov filstorlek', // from v2.1.30 added 2.11.2017
			'autoFocusDialog' : 'Fokusera på elementet av dialog med muspekaren',  // from v2.1.30 added 2.11.2017
			'select'          : 'Välj', // from v2.1.30 added 23.11.2017
			'selectAction'    : 'Åtgärd när du väljer fil', // from v2.1.30 added 23.11.2017
			'useStoredEditor' : 'Öppna med den editor som användes förra gången', // from v2.1.30 added 23.11.2017
			'selectinvert'    : 'Invertera urval', // from v2.1.30 added 25.11.2017
			'renameMultiple'  : 'Är du säker på att du vill byta namn på $1 valda objekt som $2?<br/>Detta kan inte ångras!', // from v2.1.31 added 4.12.2017
			'batchRename'     : 'Byt namn på batch', // from v2.1.31 added 8.12.2017
			'plusNumber'      : '+ Nummer', // from v2.1.31 added 8.12.2017
			'asPrefix'        : 'Lägg till prefix', // from v2.1.31 added 8.12.2017
			'asSuffix'        : 'Lägg till suffix', // from v2.1.31 added 8.12.2017
			'changeExtention' : 'Ändra förlängning', // from v2.1.31 added 8.12.2017
			'columnPref'      : 'Kolumninställningar (listvy)', // from v2.1.32 added 6.2.2018
			'reflectOnImmediate' : 'Alla ändringar kommer omedelbart att återspeglas i arkivet.', // from v2.1.33 added 2.3.2018
			'reflectOnUnmount'   : 'Eventuella ändringar kommer inte att återspeglas förrän avmontering av denna volym.', // from v2.1.33 added 2.3.2018
			'unmountChildren' : 'Följande volym(er) monterade på denna volym avmonterade också. Är du säker på att avmontera den?', // from v2.1.33 added 5.3.2018
			'selectionInfo'   : 'Urvalsinformation', // from v2.1.33 added 7.3.2018
			'hashChecker'     : 'Algoritmer för att visa filens hash', // from v2.1.33 added 10.3.2018
			'infoItems'       : 'Infoobjekt (panel med urvalsinformation)', // from v2.1.38 added 28.3.2018
			'pressAgainToExit': 'Tryck igen för att avsluta.', // from v2.1.38 added 1.4.2018
			'toolbar'         : 'Verktygsfält', // from v2.1.38 added 4.4.2018
			'workspace'       : 'Arbetsutrymme', // from v2.1.38 added 4.4.2018
			'dialog'          : 'Dialog', // from v2.1.38 added 4.4.2018
			'all'             : 'Allt', // from v2.1.38 added 4.4.2018
			'iconSize'        : 'Ikonstorlek (ikonvy)', // from v2.1.39 added 7.5.2018
			'editorMaximized' : 'Öppna fönstret för maximerad redigering', // from v2.1.40 added 30.6.2018
			'editorConvNoApi' : 'Eftersom konvertering via API för närvarande inte är tillgänglig, vänligen konvertera på webbplatsen.', //from v2.1.40 added 8.7.2018
			'editorConvNeedUpload' : 'Efter konvertering måste du ladda upp med objektets URL eller en nedladdad fil för att spara den konverterade filen.', //from v2.1.40 added 8.7.2018
			'convertOn'       : 'Konvertera på webbplatsen för $1', // from v2.1.40 added 10.7.2018
			'integrations'    : 'Integrationer', // from v2.1.40 added 11.7.2018
			'integrationWith' : 'Denna elFinder har följande externa tjänster integrerade. Vänligen kontrollera användarvillkoren, integritetspolicyn etc. innan du använder den.', // from v2.1.40 added 11.7.2018
			'showHidden'      : 'Visa dolda föremål', // from v2.1.41 added 24.7.2018
			'hideHidden'      : 'Göm dolda föremål', // from v2.1.41 added 24.7.2018
			'toggleHidden'    : 'Visa/dölj dolda objekt', // from v2.1.41 added 24.7.2018
			'makefileTypes'   : 'Filtyper att aktivera med "Ny fil"', // from v2.1.41 added 7.8.2018
			'typeOfTextfile'  : 'Typ av textfil', // from v2.1.41 added 7.8.2018
			'add'             : 'Lägg till', // from v2.1.41 added 7.8.2018
			'theme'           : 'Tema', // from v2.1.43 added 19.10.2018
			'default'         : 'Standard', // from v2.1.43 added 19.10.2018
			'description'     : 'Beskrivning', // from v2.1.43 added 19.10.2018
			'website'         : 'Hemsida', // from v2.1.43 added 19.10.2018
			'author'          : 'Författare', // from v2.1.43 added 19.10.2018
			'email'           : 'E-post', // from v2.1.43 added 19.10.2018
			'license'         : 'Licens', // from v2.1.43 added 19.10.2018
			'exportToSave'    : 'Det här objektet kan inte sparas. För att undvika att förlora redigeringarna måste du exportera till din PC.', // from v2.1.44 added 1.12.2018
			'dblclickToSelect': 'Dubbelklicka på filen för att välja den.', // from v2.1.47 added 22.1.2019
			'useFullscreen'   : 'Använd helskärmsläge', // from v2.1.47 added 19.2.2019

			/********************************** mimetypes **********************************/
			'kindUnknown'     : 'Okänd',
			'kindRoot'        : 'Volymrot', // from v2.1.16 added 16.10.2016
			'kindFolder'      : 'Mapp',
			'kindSelects'     : 'Urval', // from v2.1.29 added 29.8.2017
			'kindAlias'       : 'Alias',
			'kindAliasBroken' : 'Trasigt alias',
			// applications
			'kindApp'         : 'Applikation',
			'kindPostscript'  : 'Postscript',
			'kindMsOffice'    : 'Microsoft Office',
			'kindMsWord'      : 'Microsoft Word',
			'kindMsExcel'     : 'Microsoft Excel',
			'kindMsPP'        : 'Microsoft Powerpoint',
			'kindOO'          : 'Open Office',
			'kindAppFlash'    : 'Flash',
			'kindPDF'         : 'Portable Document Format (PDF)',
			'kindTorrent'     : 'Bittorrent',
			'kind7z'          : '7z',
			'kindTAR'         : 'TAR',
			'kindGZIP'        : 'GZIP',
			'kindBZIP'        : 'BZIP',
			'kindXZ'          : 'XZ',
			'kindZIP'         : 'ZIP',
			'kindRAR'         : 'RAR',
			'kindJAR'         : 'Java JAR',
			'kindTTF'         : 'True Type',
			'kindOTF'         : 'Open Type',
			'kindRPM'         : 'RPM',
			// texts
			'kindText'        : 'Text',
			'kindTextPlain'   : 'Vanlig text',
			'kindPHP'         : 'PHP',
			'kindCSS'         : 'Cascading stilark',
			'kindHTML'        : 'HTML',
			'kindJS'          : 'Javascript',
			'kindRTF'         : 'Rich Text Format',
			'kindC'           : 'C',
			'kindCHeader'     : 'C header',
			'kindCPP'         : 'C++',
			'kindCPPHeader'   : 'C++ header',
			'kindShell'       : 'Unix-skalskript',
			'kindPython'      : 'Python',
			'kindJava'        : 'Java',
			'kindRuby'        : 'Ruby',
			'kindPerl'        : 'Perl',
			'kindSQL'         : 'SQL',
			'kindXML'         : 'XML',
			'kindAWK'         : 'AWK',
			'kindCSV'         : 'CSV',
			'kindDOCBOOK'     : 'Docbook XML',
			'kindMarkdown'    : 'Markdown text', // added 20.7.2015
			// images
			'kindImage'       : 'Bild',
			'kindBMP'         : 'BMP',
			'kindJPEG'        : 'JPEG',
			'kindGIF'         : 'GIF',
			'kindPNG'         : 'PNG',
			'kindTIFF'        : 'TIFF',
			'kindTGA'         : 'TGA',
			'kindPSD'         : 'Adobe Photoshop',
			'kindXBITMAP'     : 'X bitmap',
			'kindPXM'         : 'Pixelmator',
			// media
			'kindAudio'       : 'Ljudmedia',
			'kindAudioMPEG'   : 'MPEG-ljud',
			'kindAudioMPEG4'  : 'MPEG-4-ljud',
			'kindAudioMIDI'   : 'MIDI-ljud',
			'kindAudioOGG'    : 'Ogg Vorbis ljud',
			'kindAudioWAV'    : 'WAV-ljud',
			'AudioPlaylist'   : 'MP3-spellista',
			'kindVideo'       : 'Videomedia',
			'kindVideoDV'     : 'DV-film',
			'kindVideoMPEG'   : 'MPEG-film',
			'kindVideoMPEG4'  : 'MPEG-4 film',
			'kindVideoAVI'    : 'AVI-film',
			'kindVideoMOV'    : 'Quicktime film',
			'kindVideoWM'     : 'Windows media film',
			'kindVideoFlash'  : 'Flash film',
			'kindVideoMKV'    : 'Filmen Matroska',
			'kindVideoOGG'    : 'Ogg film'
		}
	};
}));

js/i18n/elfinder.nl.js000064400000101623151215013360010475 0ustar00/**
 * Nederlands translation
 * @author Barry vd. Heuvel <barry@fruitcakestudio.nl>
 * @author Patrick Tingen <patrick@tingen.net>
 * @version 2022-03-02
 */
 (function(root, factory) {
	if (typeof define === 'function' && define.amd) {
		define(['elfinder'], factory);
	} else if (typeof exports !== 'undefined') {
		module.exports = factory(require('elfinder'));
	} else {
		factory(root.elFinder);
	}
}(this, function(elFinder) {
	elFinder.prototype.i18.nl = {
		translator : 'Barry vd. Heuvel &lt;barry@fruitcakestudio.nl&gt;, Patrick Tingen &lt;patrick@tingen.net&gt;',
		language   : 'Nederlands',
		direction  : 'ltr',
		dateFormat : 'd-m-Y H:i', // will show like: 02-03-2022 15:08
		fancyDateFormat : '$1 H:i', // will show like: Vandaag 15:08
		nonameDateFormat : 'ymd-His', // noname upload will show like: 220302-150849
		messages   : {
			'getShareText' : 'Delen',
			'Editor ': 'Code-editor',

			/********************************** errors **********************************/
			'error'                : 'Fout',
			'errUnknown'           : 'Onbekend fout',
			'errUnknownCmd'        : 'Onbekend commando',
			'errJqui'              : 'Ongeldige jQuery UI configuratie. Selectable, draggable en droppable componenten moeten aanwezig zijn',
			'errNode'              : 'Voor elFinder moet een DOM Element gemaakt worden',
			'errURL'               : 'Ongeldige elFinder configuratie! URL optie is niet ingesteld',
			'errAccess'            : 'Toegang geweigerd',
			'errConnect'           : 'Kan geen verbinding met de backend maken',
			'errAbort'             : 'Verbinding afgebroken',
			'errTimeout'           : 'Verbinding time-out',
			'errNotFound'          : 'Backend niet gevonden',
			'errResponse'          : 'Ongeldige reactie van de backend',
			'errConf'              : 'Ongeldige backend configuratie',
			'errJSON'              : 'PHP JSON module niet geïnstalleerd',
			'errNoVolumes'         : 'Leesbaar volume is niet beschikbaar',
			'errCmdParams'         : 'Ongeldige parameters voor commando "$1"',
			'errDataNotJSON'       : 'Data is niet JSON',
			'errDataEmpty'         : 'Data is leeg',
			'errCmdReq'            : 'Backend verzoek heeft een commando naam nodig',
			'errOpen'              : 'Kan "$1" niet openen',
			'errNotFolder'         : 'Object is geen map',
			'errNotFile'           : 'Object is geen bestand',
			'errRead'              : 'Kan "$1" niet lezen',
			'errWrite'             : 'Kan niet schrijven in "$1"',
			'errPerm'              : 'Toegang geweigerd',
			'errLocked'            : '"$1" is vergrendeld en kan niet hernoemd, verplaats of verwijderd worden',
			'errExists'            : 'Bestand "$1" bestaat al',
			'errInvName'           : 'Ongeldige bestandsnaam',
			'errInvDirname'        : 'Ongeldige mapnaam.',  // from v2.1.24 added 12.4.2017
			'errFolderNotFound'    : 'Map niet gevonden',
			'errFileNotFound'      : 'Bestand niet gevonden',
			'errTrgFolderNotFound' : 'Doelmap "$1" niet gevonden',
			'errPopup'             : 'De browser heeft voorkomen dat de pop-up is geopend. Pas de browser instellingen aan om de popup te kunnen openen',
			'errMkdir'             : 'Kan map "$1" niet aanmaken',
			'errMkfile'            : 'Kan bestand "$1" niet aanmaken',
			'errRename'            : 'Kan "$1" niet hernoemen',
			'errCopyFrom'          : 'Bestanden kopiëren van "$1" is niet toegestaan',
			'errCopyTo'            : 'Bestanden kopiëren naar "$1" is niet toegestaan',
			'errMkOutLink'         : 'Kan geen link maken buiten de hoofdmap', // from v2.1 added 03.10.2015
			'errUpload'            : 'Upload fout',  // old name - errUploadCommon
			'errUploadFile'        : 'Kan "$1" niet uploaden', // old name - errUpload
			'errUploadNoFiles'     : 'Geen bestanden gevonden om te uploaden',
			'errUploadTotalSize'   : 'Data overschrijdt de maximale grootte', // old name - errMaxSize
			'errUploadFileSize'    : 'Bestand overschrijdt de maximale grootte', //  old name - errFileMaxSize
			'errUploadMime'        : 'Bestandstype niet toegestaan',
			'errUploadTransfer'    : '"$1" overdrachtsfout',
			'errUploadTemp'        : 'Kan geen tijdelijk bestand voor de upload maken', // from v2.1 added 26.09.2015
			'errNotReplace'        : 'Object "$1" bestaat al op deze locatie en kan niet vervangen worden door een ander type object', // new
			'errReplace'           : 'Kan "$1" niet vervangen',
			'errSave'              : 'Kan "$1" niet opslaan',
			'errCopy'              : 'Kan "$1" niet kopiëren',
			'errMove'              : 'Kan "$1" niet verplaatsen',
			'errCopyInItself'      : 'Kan "$1" niet in zichzelf kopiëren',
			'errRm'                : 'Kan "$1" niet verwijderen',
			'errTrash'             : 'Kan niet in de prullenbak.', // from v2.1.24 added 30.4.2017
			'errRmSrc'             : 'Kan bronbestanden niet verwijderen',
			'errExtract'           : 'Kan de bestanden van "$1" niet uitpakken',
			'errArchive'           : 'Kan het archief niet maken',
			'errArcType'           : 'Archief type is niet ondersteund',
			'errNoArchive'         : 'Bestand is geen archief of geen ondersteund archief type',
			'errCmdNoSupport'      : 'Backend ondersteund dit commando niet',
			'errReplByChild'       : 'De map "$1" kan niet vervangen worden door een item uit die map',
			'errArcSymlinks'       : 'Om veiligheidsredenen kan een bestand met symlinks of bestanden met niet toegestane namen niet worden uitgepakt ', // edited 24.06.2012
			'errArcMaxSize'        : 'Archief overschrijdt de maximale bestandsgrootte',
			'errResize'            : 'Kan het formaat van "$1" niet wijzigen',
			'errResizeDegree'      : 'Ongeldig aantal graden om te draaien',  // added 7.3.2013
			'errResizeRotate'      : 'Afbeelding kan niet gedraaid worden',  // added 7.3.2013
			'errResizeSize'        : 'Ongeldig afbeelding formaat',  // added 7.3.2013
			'errResizeNoChange'    : 'Afbeelding formaat is niet veranderd',  // added 7.3.2013
			'errUsupportType'      : 'Bestandstype wordt niet ondersteund',
			'errNotUTF8Content'    : 'Bestand "$1" is niet in UTF-8 and kan niet aangepast worden',  // added 9.11.2011
			'errNetMount'          : 'Kan "$1" niet mounten', // added 17.04.2012
			'errNetMountNoDriver'  : 'Niet ondersteund protocol',     // added 17.04.2012
			'errNetMountFailed'    : 'Mount mislukt',         // added 17.04.2012
			'errNetMountHostReq'   : 'Host is verplicht', // added 18.04.2012
			'errSessionExpires'    : 'Uw sessie is verlopen vanwege inactiviteit',
			'errCreatingTempDir'   : 'Kan de tijdelijke map niet aanmaken: "$1" ',
			'errFtpDownloadFile'   : 'Kan het bestand niet downloaden vanaf FTP: "$1"',
			'errFtpUploadFile'     : 'Kan het bestand niet uploaden naar FTP: "$1"',
			'errFtpMkdir'          : 'Kan het externe map niet aanmaken op de FTP-server: "$1"',
			'errArchiveExec'       : 'Er is een fout opgetreden bij het archivering van de bestanden: "$1" ',
			'errExtractExec'       : 'Er is een fout opgetreden bij het uitpakken van de bestanden: "$1" ',
			'errNetUnMount'        : 'Kan niet unmounten', // from v2.1 added 30.04.2012
			'errConvUTF8'          : 'Niet om te zetten naar UTF-8', // from v2.1 added 08.04.2014
			'errFolderUpload'      : 'Probeer een moderne browser als je bestanden wil uploaden', // from v2.1 added 26.6.2015
			'errSearchTimeout'     : 'Time-out bij zoeken naar "$1". Zoekresulataat is niet compleet', // from v2.1 added 12.1.2016
			'errReauthRequire'     : 'Je moet je opnieuw aanmelden', // from v2.1.10 added 24.3.2016
			'errMaxTargets'        : 'Max aantal selecteerbare items is $1', // from v2.1.17 added 17.10.2016
			'errRestore'           : 'Kan niet herstellen uit prullenbak, weet niet waar het heen moet', // from v2.1.24 added 3.5.2017
			'errEditorNotFound'    : 'Geen editor voor dit type bestand', // from v2.1.25 added 23.5.2017
			'errServerError'       : 'Fout opgetreden op de server', // from v2.1.25 added 16.6.2017
			'errEmpty'             : 'Kan folder "$1" niet legen', // from v2.1.25 added 22.6.2017
			'moreErrors'           : 'Er zijn nog $1 fouten', // from v2.1.44 added 9.12.2018
			'errMaxMkdirs'         : 'U kunt maximaal $1 mappen tegelijk maken.', // from v2.1.58 added 20.6.2021

			/******************************* commands names ********************************/
			'cmdarchive'   : 'Maak archief',
			'cmdback'      : 'Vorige',
			'cmdcopy'      : 'Kopieer',
			'cmdcut'       : 'Knip',
			'cmddownload'  : 'Downloaden',
			'cmdduplicate' : 'Dupliceer',
			'cmdedit'      : 'Pas bestand aan',
			'cmdextract'   : 'Bestanden uit archief uitpakken',
			'cmdforward'   : 'Volgende',
			'cmdgetfile'   : 'Kies bestanden',
			'cmdhelp'      : 'Over deze software',
			'cmdhome'      : 'Home',
			'cmdinfo'      : 'Bekijk info',
			'cmdmkdir'     : 'Nieuwe map',
			'cmdmkdirin'   : 'In nieuwe map', // from v2.1.7 added 19.2.2016
			'cmdmkfile'    : 'Nieuw bestand',
			'cmdopen'      : 'Open',
			'cmdpaste'     : 'Plak',
			'cmdquicklook' : 'Voorbeeld',
			'cmdreload'    : 'Vernieuwen',
			'cmdrename'    : 'Naam wijzigen',
			'cmdrm'        : 'Verwijder',
			'cmdtrash'     : 'Naar prullenbak', //from v2.1.24 added 29.4.2017
			'cmdrestore'   : 'Herstellen', //from v2.1.24 added 3.5.2017
			'cmdsearch'    : 'Zoek bestanden',
			'cmdup'        : 'Ga een map hoger',
			'cmdupload'    : 'Upload bestanden',
			'cmdview'      : 'Bekijk',
			'cmdresize'    : 'Formaat wijzigen',
			'cmdsort'      : 'Sorteren',
			'cmdnetmount'  : 'Mount netwerk volume', // added 18.04.2012
			'cmdnetunmount': 'Afmelden', // from v2.1 added 30.04.2012
			'cmdplaces'    : 'Naar Plaatsen', // added 28.12.2014
			'cmdchmod'     : 'Wijzig modus', // from v2.1 added 20.6.2015
			'cmdopendir'   : 'Open een map', // from v2.1 added 13.1.2016
			'cmdcolwidth'  : 'Herstel kolombreedtes', // from v2.1.13 added 12.06.2016
			'cmdfullscreen': 'Volledig scherm', // from v2.1.15 added 03.08.2016
			'cmdmove'      : 'Verplaatsen', // from v2.1.15 added 21.08.2016
			'cmdempty'     : 'Map leegmaken', // from v2.1.25 added 22.06.2017
			'cmdundo'      : 'ongedaan maken', // from v2.1.27 added 31.07.2017
			'cmdredo'      : 'Opnieuw doen', // from v2.1.27 added 31.07.2017
			'cmdpreference': 'Voorkeuren', // from v2.1.27 added 03.08.2017
			'cmdselectall' : 'Selecteer alles', // from v2.1.28 added 15.08.2017
			'cmdselectnone': 'Deselecteer alles', // from v2.1.28 added 15.08.2017
			'cmdselectinvert': 'Selectie omkeren', // from v2.1.28 added 15.08.2017
			'cmdopennew'   : 'Open in nieuw venster', // from v2.1.38 added 3.4.2018
			'cmdhide'      : 'Verberg (voorkeur)', // from v2.1.41 added 24.7.2018

			/*********************************** buttons ***********************************/
			'btnClose'  : 'Sluit',
			'btnSave'   : 'Opslaan',
			'btnRm'     : 'Verwijder',
			'btnApply'  : 'Toepassen',
			'btnCancel' : 'Annuleren',
			'btnNo'     : 'Nee',
			'btnYes'    : 'Ja',
			'btnMount'  : 'Mount',  // added 18.04.2012
			'btnApprove': 'Ga naar $1 & keur goed', // from v2.1 added 26.04.2012
			'btnUnmount': 'Afmelden', // from v2.1 added 30.04.2012
			'btnConv'   : 'Converteer', // from v2.1 added 08.04.2014
			'btnCwd'    : 'Hier',      // from v2.1 added 22.5.2015
			'btnVolume' : 'Volume',    // from v2.1 added 22.5.2015
			'btnAll'    : 'Alles',       // from v2.1 added 22.5.2015
			'btnMime'   : 'Mime type', // from v2.1 added 22.5.2015
			'btnFileName':'Bestandsnaam',  // from v2.1 added 22.5.2015
			'btnSaveClose': 'Opslaan & Sluiten', // from v2.1 added 12.6.2015
			'btnBackup' : 'Back-up', // fromv2.1 added 28.11.2015
			'btnRename'    : 'Hernoemen',      // from v2.1.24 added 6.4.2017
			'btnRenameAll' : 'Hernoem alles', // from v2.1.24 added 6.4.2017
			'btnPrevious' : 'Vorige ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnNext'     : 'Volgende ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnSaveAs'   : 'Opslaan als', // from v2.1.25 added 24.5.2017

			/******************************** notifications ********************************/
			'ntfopen'     : 'Bezig met openen van map',
			'ntffile'     : 'Bezig met openen bestand',
			'ntfreload'   : 'Herladen map inhoud',
			'ntfmkdir'    : 'Bezig met map maken',
			'ntfmkfile'   : 'Bezig met Bestanden maken',
			'ntfrm'       : 'Verwijderen bestanden',
			'ntfcopy'     : 'Kopieer bestanden',
			'ntfmove'     : 'Verplaats bestanden',
			'ntfprepare'  : 'Voorbereiden kopiëren',
			'ntfrename'   : 'Hernoem bestanden',
			'ntfupload'   : 'Bestanden uploaden actief',
			'ntfdownload' : 'Bestanden downloaden actief',
			'ntfsave'     : 'Bestanden opslaan',
			'ntfarchive'  : 'Archief aan het maken',
			'ntfextract'  : 'Bestanden uitpakken actief',
			'ntfsearch'   : 'Zoeken naar bestanden',
			'ntfresize'   : 'Formaat wijzigen van afbeeldingen',
			'ntfsmth'     : 'Iets aan het doen',
			'ntfloadimg'  : 'Laden van plaatje',
			'ntfnetmount' : 'Mounten van netwerk volume', // added 18.04.2012
			'ntfnetunmount': 'Unmounten van netwerk volume', // from v2.1 added 30.04.2012
			'ntfdim'      : 'Opvragen afbeeldingen dimensies', // added 20.05.2013
			'ntfreaddir'  : 'Map informatie lezen', // from v2.1 added 01.07.2013
			'ntfurl'      : 'URL van link ophalen', // from v2.1 added 11.03.2014
			'ntfchmod'    : 'Bestandsmodus wijzigen', // from v2.1 added 20.6.2015
			'ntfpreupload': 'Upload bestandsnaam verifiëren', // from v2.1 added 31.11.2015
			'ntfzipdl'    : 'Zipbestand aan het maken', // from v2.1.7 added 23.1.2016
			'ntfparents'  : 'Verzamelen padinformatie', // from v2.1.17 added 2.11.2016
			'ntfchunkmerge': 'Aan het verwerken', // from v2.1.17 added 2.11.2016
			'ntftrash'    : 'Aan het verwijderen', // from v2.1.24 added 2.5.2017
			'ntfrestore'  : 'Aan het herstellen', // from v2.1.24 added 3.5.2017
			'ntfchkdir'   : 'Controleren doelmap', // from v2.1.24 added 3.5.2017
			'ntfundo'     : 'Vorige bewerking ongedaan maken', // from v2.1.27 added 31.07.2017
			'ntfredo'     : 'Opnieuw doen', // from v2.1.27 added 31.07.2017
			'ntfchkcontent' : 'Inhoud controleren', // from v2.1.41 added 3.8.2018

			/*********************************** volumes *********************************/
			'volume_Trash' : 'Prullenbak', //from v2.1.24 added 29.4.2017

			/************************************ dates **********************************/
			'dateUnknown' : 'onbekend',
			'Today'       : 'Vandaag',
			'Yesterday'   : 'Gisteren',
			'msJan'       : 'Jan',
			'msFeb'       : 'februari',
			'msMar'       : 'maart',
			'msApr'       : 'april',
			'msMay'       : 'Mei',
			'msJun'       : 'Jun',
			'msJul'       : 'juli',
			'msAug'       : 'aug',
			'msSep'       : 'september',
			'msOct'       : 'Okt',
			'msNov'       : 'november',
			'msDec'       : 'december',
			'January'     : 'Januari',
			'February'    : 'Februari',
			'March'       : 'Maart',
			'April'       : 'april',
			'May'         : 'Mei',
			'June'        : 'Juni',
			'July'        : 'Juli',
			'August'      : 'Augustus',
			'September'   : 'september',
			'October'     : 'Oktober',
			'November'    : 'november',
			'December'    : 'december',
			'Sunday'      : 'Zondag',
			'Monday'      : 'Maandag',
			'Tuesday'     : 'Dinsdag',
			'Wednesday'   : 'Woensdag',
			'Thursday'    : 'Donderdag',
			'Friday'      : 'Vrijdag',
			'Saturday'    : 'Zaterdag',
			'Sun'         : 'Zo',
			'Mon'         : 'Ma',
			'Tue'         : 'Di',
			'Wed'         : 'Wo',
			'Thu'         : 'Do',
			'Fri'         : 'Vr',
			'Sat'         : 'Za',

			/******************************** sort variants ********************************/
			'sortname'          : 'op naam',
			'sortkind'          : 'op type',
			'sortsize'          : 'op grootte',
			'sortdate'          : 'op datum',
			'sortFoldersFirst'  : 'Mappen eerst',
			'sortperm'          : 'op rechten', // from v2.1.13 added 13.06.2016
			'sortmode'          : 'op mode',       // from v2.1.13 added 13.06.2016
			'sortowner'         : 'op eigenaar',      // from v2.1.13 added 13.06.2016
			'sortgroup'         : 'op groep',      // from v2.1.13 added 13.06.2016
			'sortAlsoTreeview'  : 'Als boom',  // from v2.1.15 added 01.08.2016

			/********************************** new items **********************************/
			'untitled file.txt' : 'NieuwBestand.txt', // added 10.11.2015
			'untitled folder'   : 'NieuweMap',   // added 10.11.2015
			'Archive'           : 'NieuwArchief',  // from v2.1 added 10.11.2015
			'untitled file'     : 'NieuwBestand.$1',  // from v2.1.41 added 6.8.2018
			'extentionfile'     : '$1: Bestand',    // from v2.1.41 added 6.8.2018
			'extentiontype'     : '$1: $2',      // from v2.1.43 added 17.10.2018

			/********************************** messages **********************************/
			'confirmReq'      : 'Bevestiging nodig',
			'confirmRm'       : 'Weet u zeker dat u deze bestanden wil verwijderen?<br/>Deze actie kan niet ongedaan gemaakt worden!',
			'confirmRepl'     : 'Oud bestand vervangen door het nieuwe bestand?',
			'confirmRest'     : 'Bestaand item vervangen door het item in de prullenbak?', // fromv2.1.24 added 5.5.2017
			'confirmConvUTF8' : 'Niet in UTF-8<br/>Converteren naar UTF-8?<br/>De inhoud wordt UTF-8 door op te slaan na de conversie', // from v2.1 added 08.04.2014
			'confirmNonUTF8'  : 'Tekencodering van dit bestand kan niet worden gedetecteerd. Het moet tijdelijk worden geconverteerd naar UTF-8 voor bewerking.<br/>Selecteer de tekencodering van dit bestand.', // from v2.1.19 added 28.11.2016
			'confirmNotSave'  : 'Het is aangepast.<br/>Wijzigingen gaan verloren als je niet opslaat', // from v2.1 added 15.7.2015
			'confirmTrash'    : 'Weet u zeker dat u items naar de prullenbak wilt verplaatsen?', //from v2.1.24 added 29.4.2017
			'confirmMove'     : 'Weet u zeker dat u items naar \'$1\' wilt verplaatsen?', //from v2.1.50 added 27.7.2019
			'apllyAll'        : 'Toepassen op alles',
			'name'            : 'Naam',
			'size'            : 'Grootte',
			'perms'           : 'Rechten',
			'modify'          : 'Aangepast',
			'kind'            : 'Type',
			'read'            : 'lees',
			'write'           : 'schrijf',
			'noaccess'        : 'geen toegang',
			'and'             : 'en',
			'unknown'         : 'onbekend',
			'selectall'       : 'Selecteer alle bestanden',
			'selectfiles'     : 'Selecteer bestand(en)',
			'selectffile'     : 'Selecteer eerste bestand',
			'selectlfile'     : 'Selecteer laatste bestand',
			'viewlist'        : 'Lijst weergave',
			'viewicons'       : 'Icoon weergave',
			'viewSmall'       : 'Klein', // from v2.1.39 added 22.5.2018
			'viewMedium'      : 'Middelgroot', // from v2.1.39 added 22.5.2018
			'viewLarge'       : 'Groot', // from v2.1.39 added 22.5.2018
			'viewExtraLarge'  : 'Extra groot', // from v2.1.39 added 22.5.2018
			'places'          : 'Plaatsen',
			'calc'            : 'Bereken',
			'path'            : 'Pad',
			'aliasfor'        : 'Alias voor',
			'locked'          : 'Vergrendeld',
			'dim'             : 'Dimensies',
			'files'           : 'Bestanden',
			'folders'         : 'Mappen',
			'items'           : 'Artikelen',
			'yes'             : 'ja',
			'no'              : 'nee',
			'link'            : 'Koppeling',
			'searcresult'     : 'Zoek resultaten',
			'selected'        : 'geselecteerde items',
			'about'           : 'Over',
			'shortcuts'       : 'Snelkoppelingen',
			'help'            : 'Helpen',
			'webfm'           : 'Web bestandsmanager',
			'ver'             : 'Versie',
			'protocolver'     : 'protocol versie',
			'homepage'        : 'Project thuis',
			'docs'            : 'Documentatie',
			'github'          : 'Fork ons op Github',
			'twitter'         : 'Volg ons op twitter',
			'facebook'        : 'Wordt lid op facebook',
			'team'            : 'Team',
			'chiefdev'        : 'Hoofd ontwikkelaar',
			'developer'       : 'ontwikkelaar',
			'contributor'     : 'bijdrager',
			'maintainer'      : 'onderhouder',
			'translator'      : 'vertaler',
			'icons'           : 'Iconen',
			'dontforget'      : 'En vergeet je handdoek niet!',
			'shortcutsof'     : 'Snelkoppelingen uitgeschakeld',
			'dropFiles'       : 'Sleep hier uw bestanden heen',
			'or'              : 'of',
			'selectForUpload' : 'Selecteer bestanden om te uploaden',
			'moveFiles'       : 'Verplaats bestanden',
			'copyFiles'       : 'Kopieer bestanden',
			'restoreFiles'    : 'Items herstellen', // from v2.1.24 added 5.5.2017
			'rmFromPlaces'    : 'Verwijder uit Plaatsen',
			'aspectRatio'     : 'beeldverhouding',
			'scale'           : 'Schaal',
			'width'           : 'Breedte',
			'height'          : 'Hoogte',
			'resize'          : 'Verkleinen',
			'crop'            : 'Bijsnijden',
			'rotate'          : 'Draaien',
			'rotate-cw'       : 'Draai 90 graden rechtsom',
			'rotate-ccw'      : 'Draai 90 graden linksom',
			'degree'          : '°',
			'netMountDialogTitle' : 'Mount netwerk volume', // added 18.04.2012
			'protocol'            : 'Protocol', // added 18.04.2012
			'host'                : 'Gastheer', // added 18.04.2012
			'port'                : 'Poort', // added 18.04.2012
			'user'                : 'Gebruikersnaams', // added 18.04.2012
			'pass'                : 'Wachtwoord', // added 18.04.2012
			'confirmUnmount'      : 'Weet u zeker dat u $1 wil unmounten?',  // from v2.1 added 30.04.2012
			'dropFilesBrowser': 'Sleep of plak bestanden vanuit de browser', // from v2.1 added 30.05.2012
			'dropPasteFiles'  : 'Sleep of plak bestanden hier', // from v2.1 added 07.04.2014
			'encoding'        : 'Encodering', // from v2.1 added 19.12.2014
			'locale'          : 'Localisatie',   // from v2.1 added 19.12.2014
			'searchTarget'    : 'Doel: $1',                // from v2.1 added 22.5.2015
			'searchMime'      : 'Zoek op invoer MIME Type', // from v2.1 added 22.5.2015
			'owner'           : 'Eigenaar', // from v2.1 added 20.6.2015
			'group'           : 'Groep', // from v2.1 added 20.6.2015
			'other'           : 'Overig', // from v2.1 added 20.6.2015
			'execute'         : 'Uitvoeren', // from v2.1 added 20.6.2015
			'perm'            : 'Rechten', // from v2.1 added 20.6.2015
			'mode'            : 'Modus', // from v2.1 added 20.6.2015
			'emptyFolder'     : 'Map is leeg', // from v2.1.6 added 30.12.2015
			'emptyFolderDrop' : 'Map is leeg\\A Sleep hier naar toe om toe te voegen', // from v2.1.6 added 30.12.2015
			'emptyFolderLTap' : 'Map is leeg\\A Lang ingedrukt houden om toe te voegen', // from v2.1.6 added 30.12.2015
			'quality'         : 'Kwaliteit', // from v2.1.6 added 5.1.2016
			'autoSync'        : 'Automatisch synchroniseren',  // from v2.1.6 added 10.1.2016
			'moveUp'          : 'Omhoog',  // from v2.1.6 added 18.1.2016
			'getLink'         : 'Geef link', // from v2.1.7 added 9.2.2016
			'selectedItems'   : 'Geselecteerde items ($1)', // from v2.1.7 added 2.19.2016
			'folderId'        : 'Map ID', // from v2.1.10 added 3.25.2016
			'offlineAccess'   : 'Toestaan offline toegang', // from v2.1.10 added 3.25.2016
			'reAuth'          : 'Opnieuw autenticeren', // from v2.1.10 added 3.25.2016
			'nowLoading'      : 'Laden..', // from v2.1.12 added 4.26.2016
			'openMulti'       : 'Open meerdere bestanden', // from v2.1.12 added 5.14.2016
			'openMultiConfirm': 'Je probeert het $1 bestanden te openen. Weet je zeker dat je dat in je browser wil doen?', // from v2.1.12 added 5.14.2016
			'emptySearch'     : 'Geen zoekresultaten', // from v2.1.12 added 5.16.2016
			'editingFile'     : 'Bestand wordt bewerkt', // from v2.1.13 added 6.3.2016
			'hasSelected'     : 'Je hebt $1 items geselecteerd', // from v2.1.13 added 6.3.2016
			'hasClipboard'    : 'Je hebt $1 items op het clipboard', // from v2.1.13 added 6.3.2016
			'incSearchOnly'   : 'Verder zoeken kan alleen vanuit huidige view', // from v2.1.13 added 6.30.2016
			'reinstate'       : 'Herstellen', // from v2.1.15 added 3.8.2016
			'complete'        : '$1 compleet', // from v2.1.15 added 21.8.2016
			'contextmenu'     : 'Contextmenu', // from v2.1.15 added 9.9.2016
			'pageTurning'     : 'Pagina omslaan', // from v2.1.15 added 10.9.2016
			'volumeRoots'     : 'Volumewortels', // from v2.1.16 added 16.9.2016
			'reset'           : 'Resetten', // from v2.1.16 added 1.10.2016
			'bgcolor'         : 'Achtergrondkleur', // from v2.1.16 added 1.10.2016
			'colorPicker'     : 'Kleurkiezer', // from v2.1.16 added 1.10.2016
			'8pxgrid'         : '8px raster', // from v2.1.16 added 4.10.2016
			'enabled'         : 'Actief', // from v2.1.16 added 4.10.2016
			'disabled'        : 'Inactief', // from v2.1.16 added 4.10.2016
			'emptyIncSearch'  : 'Zoekresultaten zijn leeg in actuele view\\ADruk [Enter] om zoekgebied uit te breiden', // from v2.1.16 added 5.10.2016
			'emptyLetSearch'  : 'Zoeken op eerste letter is leeg in actuele view', // from v2.1.23 added 24.3.2017
			'textLabel'       : 'Tekstlabel', // from v2.1.17 added 13.10.2016
			'minsLeft'        : '$1 minuten over', // from v2.1.17 added 13.11.2016
			'openAsEncoding'  : 'Opnieuw openen met geselecteerde encoding', // from v2.1.19 added 2.12.2016
			'saveAsEncoding'  : 'Opslaan met geselecteerde encoding', // from v2.1.19 added 2.12.2016
			'selectFolder'    : 'Selecteer map', // from v2.1.20 added 13.12.2016
			'firstLetterSearch': 'Zoeken op eerste letter', // from v2.1.23 added 24.3.2017
			'presets'         : 'Voorkeuren', // from v2.1.25 added 26.5.2017
			'tooManyToTrash'  : 'Teveel voor in de prullenbak', // from v2.1.25 added 9.6.2017
			'TextArea'        : 'Tekstgebied', // from v2.1.25 added 14.6.2017
			'folderToEmpty'   : 'Map "$1" legen', // from v2.1.25 added 22.6.2017
			'filderIsEmpty'   : 'Er zijn geen items in map "$1"', // from v2.1.25 added 22.6.2017
			'preference'      : 'Voorkeur', // from v2.1.26 added 28.6.2017
			'language'        : 'Taal', // from v2.1.26 added 28.6.2017
			'clearBrowserData': 'Initialiseer instellingen van deze browser', // from v2.1.26 added 28.6.2017
			'toolbarPref'     : 'Toolbar instellingen', // from v2.1.27 added 2.8.2017
			'charsLeft'       : '... $1 tekens over',  // from v2.1.29 added 30.8.2017
			'linesLeft'       : '... $1 regels over.',  // from v2.1.52 added 16.1.2020
			'sum'             : 'Totaal', // from v2.1.29 added 28.9.2017
			'roughFileSize'   : 'Geschatte bestandsgrootte', // from v2.1.30 added 2.11.2017
			'autoFocusDialog' : 'Focus op het dialoogelement met mouseover',  // from v2.1.30 added 2.11.2017
			'select'          : 'Selecteren', // from v2.1.30 added 23.11.2017
			'selectAction'    : 'Actie als bestand is geselecteerd', // from v2.1.30 added 23.11.2017
			'useStoredEditor' : 'Open met laatstgebruikte editor', // from v2.1.30 added 23.11.2017
			'selectinvert'    : 'Selectie omkeren', // from v2.1.30 added 25.11.2017
			'renameMultiple'  : 'Weet je zeker dat je $1 items wil hernoemen naar $2?<br/>Dit kan niet ongedaan worden gemaakt!', // from v2.1.31 added 4.12.2017
			'batchRename'     : 'Batch hernoemen', // from v2.1.31 added 8.12.2017
			'plusNumber'      : '+ Nummer', // from v2.1.31 added 8.12.2017
			'asPrefix'        : 'Voeg prefix toe', // from v2.1.31 added 8.12.2017
			'asSuffix'        : 'Voeg suffix toe', // from v2.1.31 added 8.12.2017
			'changeExtention' : 'Verander extentie', // from v2.1.31 added 8.12.2017
			'columnPref'      : 'Kolominstelllingen (List view)', // from v2.1.32 added 6.2.2018
			'reflectOnImmediate' : 'Aanpassingen worden direct toegepast op het archief', // from v2.1.33 added 2.3.2018
			'reflectOnUnmount'   : 'Aanpassingen worden pas toegepast na re-mount van dit volume', // from v2.1.33 added 2.3.2018
			'unmountChildren' : 'Deze volume(s) worden ook unmounted. Weet je het zeker?', // from v2.1.33 added 5.3.2018
			'selectionInfo'   : 'Selectie informatie', // from v2.1.33 added 7.3.2018
			'hashChecker'     : 'Algoritmes voor file hash', // from v2.1.33 added 10.3.2018
			'infoItems'       : 'Informatie Items (Selectie Info Panel)', // from v2.1.38 added 28.3.2018
			'pressAgainToExit': 'Druk nogmaals om te eindigen', // from v2.1.38 added 1.4.2018
			'toolbar'         : 'Werkbalk', // from v2.1.38 added 4.4.2018
			'workspace'       : 'Werkruimte', // from v2.1.38 added 4.4.2018
			'dialog'          : 'Dialoog', // from v2.1.38 added 4.4.2018
			'all'             : 'Alles', // from v2.1.38 added 4.4.2018
			'iconSize'        : 'Icoongrootte (Icons view)', // from v2.1.39 added 7.5.2018
			'editorMaximized' : 'Open de maximale editor', // from v2.1.40 added 30.6.2018
			'editorConvNoApi' : 'Conversie via API is niet beschikbaar, converteer aub op de website', //from v2.1.40 added 8.7.2018
			'editorConvNeedUpload' : 'After conversion, you must be upload with the item URL or a downloaded file to save the converted file', //from v2.1.40 added 8.7.2018
			'convertOn'       : 'Converteer op de site $1', // from v2.1.40 added 10.7.2018
			'integrations'    : 'Integratie', // from v2.1.40 added 11.7.2018
			'integrationWith' : 'Deze elFinder heeft de volgende externe services. Controleer de voorwaarden, privacy policy, etc. voor gebruik', // from v2.1.40 added 11.7.2018
			'showHidden'      : 'Toon verborgen items', // from v2.1.41 added 24.7.2018
			'hideHidden'      : 'Verberg verborgen items', // from v2.1.41 added 24.7.2018
			'toggleHidden'    : 'Toon/verberg verborgen items', // from v2.1.41 added 24.7.2018
			'makefileTypes'   : 'File types die aangemaakt mogen worden', // from v2.1.41 added 7.8.2018
			'typeOfTextfile'  : 'Type voor tekstbestand', // from v2.1.41 added 7.8.2018
			'add'             : 'Toevoegen', // from v2.1.41 added 7.8.2018
			'theme'           : 'Thema', // from v2.1.43 added 19.10.2018
			'default'         : 'Standaard', // from v2.1.43 added 19.10.2018
			'description'     : 'Beschrijving', // from v2.1.43 added 19.10.2018
			'website'         : 'Website', // from v2.1.43 added 19.10.2018
			'author'          : 'Auteur', // from v2.1.43 added 19.10.2018
			'email'           : 'E-mail', // from v2.1.43 added 19.10.2018
			'license'         : 'Licensie', // from v2.1.43 added 19.10.2018
			'exportToSave'    : 'Dit item kan niet worden opgeslagen, exporteer naar je pc om wijzingen te bewaren', // from v2.1.44 added 1.12.2018
			'dblclickToSelect': 'Dubbelklik op het bestand om het te selecteren.', // from v2.1.47 added 22.1.2019
			'useFullscreen'   : 'Volledig scherm gebruiken', // from v2.1.47 added 19.2.2019

			/********************************** mimetypes **********************************/
			'kindUnknown'     : 'Onbekend',
			'kindRoot'        : 'Volume root', // from v2.1.16 added 16.10.2016
			'kindFolder'      : 'Map',
			'kindSelects'     : 'Selecties', // from v2.1.29 added 29.8.2017
			'kindAlias'       : 'Alias',
			'kindAliasBroken' : 'Verbroken alias',
			// applications
			'kindApp'         : 'Applicatie',
			'kindPostscript'  : 'Postscript-document',
			'kindMsOffice'    : 'Microsoft Office-document',
			'kindMsWord'      : 'Microsoft Word-document',
			'kindMsExcel'     : 'Microsoft Excel-document',
			'kindMsPP'        : 'Microsoft Powerpoint-presentatie',
			'kindOO'          : 'Office-document openen',
			'kindAppFlash'    : 'Flash applicatie',
			'kindPDF'         : 'Draagbaar documentformaat (PDF)',
			'kindTorrent'     : 'Bittorrent bestand',
			'kind7z'          : '7z archief',
			'kindTAR'         : 'TAR archief',
			'kindGZIP'        : 'GZIP archief',
			'kindBZIP'        : 'BZIP archief',
			'kindXZ'          : 'XZ archief',
			'kindZIP'         : 'ZIP archief',
			'kindRAR'         : 'RAR archief',
			'kindJAR'         : 'Java JAR bestand',
			'kindTTF'         : 'True Type-lettertype',
			'kindOTF'         : 'Lettertype openen',
			'kindRPM'         : 'RPM pakket',
			// texts
			'kindText'        : 'Tekst bestand',
			'kindTextPlain'   : 'Tekst',
			'kindPHP'         : 'PHP bronbestand',
			'kindCSS'         : 'Trapsgewijze stijlblad',
			'kindHTML'        : 'HTML-document',
			'kindJS'          : 'Javascript bronbestand',
			'kindRTF'         : 'Rijk tekst formaat',
			'kindC'           : 'C bronbestand',
			'kindCHeader'     : 'C header bronbestand',
			'kindCPP'         : 'C++ bronbestand',
			'kindCPPHeader'   : 'C++ header bronbestand',
			'kindShell'       : 'Unix-shellscript',
			'kindPython'      : 'Python bronbestand',
			'kindJava'        : 'Java bronbestand',
			'kindRuby'        : 'Ruby bronbestand',
			'kindPerl'        : 'Perl bronbestand',
			'kindSQL'         : 'SQL bronbestand',
			'kindXML'         : 'XML-document',
			'kindAWK'         : 'AWK bronbestand',
			'kindCSV'         : 'Komma gescheiden waardes',
			'kindDOCBOOK'     : 'Docbook XML-document',
			'kindMarkdown'    : 'Markdown tekst', // added 20.7.2015
			// images
			'kindImage'       : 'Afbeelding',
			'kindBMP'         : 'BMP afbeelding',
			'kindJPEG'        : 'JPEG afbeelding',
			'kindGIF'         : 'GIF afbeelding',
			'kindPNG'         : 'PNG afbeelding',
			'kindTIFF'        : 'TIFF afbeelding',
			'kindTGA'         : 'TGA afbeelding',
			'kindPSD'         : 'Adobe Photoshop afbeelding',
			'kindXBITMAP'     : 'X bitmap afbeelding',
			'kindPXM'         : 'Pixelmator afbeelding',
			// media
			'kindAudio'       : 'Audiomedia',
			'kindAudioMPEG'   : 'MPEG-audio',
			'kindAudioMPEG4'  : 'MPEG-4-audio',
			'kindAudioMIDI'   : 'MIDI-audio',
			'kindAudioOGG'    : 'Ogg Vorbis-audio',
			'kindAudioWAV'    : 'WAV-audio',
			'AudioPlaylist'   : 'MP3-afspeellijst',
			'kindVideo'       : 'Videomedia',
			'kindVideoDV'     : 'DV video',
			'kindVideoMPEG'   : 'MPEG video',
			'kindVideoMPEG4'  : 'MPEG-4 video',
			'kindVideoAVI'    : 'AVI video',
			'kindVideoMOV'    : 'Quick Time video',
			'kindVideoWM'     : 'Windows Media video',
			'kindVideoFlash'  : 'Flash video',
			'kindVideoMKV'    : 'Matroska video',
			'kindVideoOGG'    : 'Ogg video'
		}
	};
}));

js/i18n/elfinder.pt_BR.js000064400000104077151215013360011100 0ustar00/**
 * Português translation
 * @author Leandro Carvalho <contato@leandrowebdev.net>
 * @author Wesley Osorio<wesleyfosorio@hotmail.com>
 * @author Fernando H. Bandeira <fernando.bandeira94@gmail.com>
 * @author Gustavo Brito <britopereiragustavo@gmail.com>
 * @version 2022-03-02
 */
 (function(root, factory) {
	if (typeof define === 'function' && define.amd) {
		define(['elfinder'], factory);
	} else if (typeof exports !== 'undefined') {
		module.exports = factory(require('elfinder'));
	} else {
		factory(root.elFinder);
	}
}(this, function(elFinder) {
	elFinder.prototype.i18.pt_BR = {
		translator : 'Leandro Carvalho &lt;contato@leandrowebdev.net&gt;, Wesley Osorio&lt;wesleyfosorio@hotmail.com&gt;, Fernando H. Bandeira &lt;fernando.bandeira94@gmail.com&gt;, Gustavo Brito &lt;britopereiragustavo@gmail.com&gt;',
		language   : 'Português',
		direction  : 'ltr',
		dateFormat : 'd M Y H:i', // will show like: 02 março 2022 16:59
		fancyDateFormat : '$1 H:i', // will show like: Hoje 16:59
		nonameDateFormat : 'ymd-His', // noname upload will show like: 220302-165954
		messages   : {
			'getShareText' : 'Participação',
			'Editor ': 'Editor de código',


			/********************************** errors **********************************/
			'error'                : 'Erro',
			'errUnknown'           : 'Erro desconhecido.',
			'errUnknownCmd'        : 'Comando desconhecido.',
			'errJqui'              : 'Configuração inválida do JQuery UI. Verifique se os componentes selectable, draggable e droppable estão incluídos.',
			'errNode'              : 'elFinder requer um elemento DOM para ser criado.',
			'errURL'               : 'Configuração inválida do elFinder! Você deve setar a opção da URL.',
			'errAccess'            : 'Acesso negado.',
			'errConnect'           : 'Incapaz de conectar ao backend.',
			'errAbort'             : 'Conexão abortada.',
			'errTimeout'           : 'Tempo de conexão excedido',
			'errNotFound'          : 'Backend não encontrado.',
			'errResponse'          : 'Resposta inválida do backend.',
			'errConf'              : 'Configuração inválida do backend.',
			'errJSON'              : 'Módulo PHP JSON não está instalado.',
			'errNoVolumes'         : 'Não existe nenhum volume legível disponivel.',
			'errCmdParams'         : 'Parâmetro inválido para o comando "$1".',
			'errDataNotJSON'       : 'Dados não estão no formato JSON.',
			'errDataEmpty'         : 'Dados vazios.',
			'errCmdReq'            : 'Requisição do Backend requer nome de comando.',
			'errOpen'              : 'Incapaz de abrir "$1".',
			'errNotFolder'         : 'Objeto não é uma pasta.',
			'errNotFile'           : 'Objeto não é um arquivo.',
			'errRead'              : 'Incapaz de ler "$1".',
			'errWrite'             : 'Incapaz de escrever em "$1".',
			'errPerm'              : 'Permissão negada.',
			'errLocked'            : '"$1" está bloqueado e não pode ser renomeado, movido ou removido.',
			'errExists'            : 'O nome do arquivo "$1" já existe neste local.',
			'errInvName'           : 'Nome do arquivo inválido.',
			'errInvDirname'        : 'Nome da pasta inválida.',  // from v2.1.24 added 12.4.2017
			'errFolderNotFound'    : 'Pasta não encontrada.',
			'errFileNotFound'      : 'Arquivo não encontrado.',
			'errTrgFolderNotFound' : 'Pasta de destino "$1" não encontrada.',
			'errPopup'             : 'O seu navegador está bloqueando popup\'s. Para abrir o arquivo, altere esta opção no seu Navegador.',
			'errMkdir'             : 'Incapaz de criar a pasta "$1".',
			'errMkfile'            : 'Incapaz de criar o arquivo "$1".',
			'errRename'            : 'Incapaz de renomear "$1".',
			'errCopyFrom'          : 'Copia dos arquivos do volume "$1" não permitida.',
			'errCopyTo'            : 'Copia dos arquivos para o volume "$1" não permitida.',
			'errMkOutLink'         : 'Incapaz de criar um link fora da unidade raiz.', // from v2.1 added 03.10.2015
			'errUpload'            : 'Erro no upload.',  // old name - errUploadCommon
			'errUploadFile'        : 'Não foi possível fazer o upload "$1".', // old name - errUpload
			'errUploadNoFiles'     : 'Não foi encontrado nenhum arquivo para upload.',
			'errUploadTotalSize'   : 'Os dados excedem o tamanho máximo permitido.', // old name - errMaxSize
			'errUploadFileSize'    : 'Arquivo excede o tamanho máximo permitido.', //  old name - errFileMaxSize
			'errUploadMime'        : 'Tipo de arquivo não permitido.',
			'errUploadTransfer'    : '"$1" erro na transferência.',
			'errUploadTemp'        : 'Incapaz de criar um arquivo temporário para upload.', // from v2.1 added 26.09.2015
			'errNotReplace'        : 'Objeto "$1" já existe neste local e não pode ser substituído por um objeto com outro tipo.', // new
			'errReplace'           : 'Incapaz de substituir "$1".',
			'errSave'              : 'Incapaz de salvar "$1".',
			'errCopy'              : 'Incapaz de copiar "$1".',
			'errMove'              : 'Incapaz de mover "$1".',
			'errCopyInItself'      : 'Incapaz de copiar "$1" nele mesmo.',
			'errRm'                : 'Incapaz de remover "$1".',
			'errTrash'             : 'Incapaz de deletar.', // from v2.1.24 added 30.4.2017
			'errRmSrc'             : 'Incapaz de remover o(s) arquivo(s) fonte.',
			'errExtract'           : 'Incapaz de extrair os arquivos de "$1".',
			'errArchive'           : 'Incapaz de criar o arquivo.',
			'errArcType'           : 'Tipo de arquivo não suportado.',
			'errNoArchive'         : 'Arquivo inválido ou é de um tipo não suportado.',
			'errCmdNoSupport'      : 'Backend não suporta este comando.',
			'errReplByChild'       : 'A pasta “$1” não pode ser substituída por um item que contém.',
			'errArcSymlinks'       : 'Por razões de segurança, negada a permissão para descompactar arquivos que contenham links ou arquivos com nomes não permitidos.', // edited 24.06.2012
			'errArcMaxSize'        : 'Arquivo excede o tamanho máximo permitido.',
			'errResize'            : 'Incapaz de redimensionar "$1".',
			'errResizeDegree'      : 'Grau de rotação inválido.',  // added 7.3.2013
			'errResizeRotate'      : 'Incapaz de rotacionar a imagem.',  // added 7.3.2013
			'errResizeSize'        : 'Tamanho inválido de imagem.',  // added 7.3.2013
			'errResizeNoChange'    : 'Tamanho da imagem não alterado.',  // added 7.3.2013
			'errUsupportType'      : 'Tipo de arquivo não suportado.',
			'errNotUTF8Content'    : 'Arquivo "$1" não está em UTF-8 e não pode ser editado.',  // added 9.11.2011
			'errNetMount'          : 'Incapaz de montar montagem "$1".', // added 17.04.2012
			'errNetMountNoDriver'  : 'Protocolo não suportado.',     // added 17.04.2012
			'errNetMountFailed'    : 'Montagem falhou.',         // added 17.04.2012
			'errNetMountHostReq'   : 'Servidor requerido.', // added 18.04.2012
			'errSessionExpires'    : 'Sua sessão expirou por inatividade.',
			'errCreatingTempDir'   : 'Não foi possível criar um diretório temporário: "$1"',
			'errFtpDownloadFile'   : 'Não foi possível fazer o download do arquivo do FTP: "$1"',
			'errFtpUploadFile'     : 'Não foi possível fazer o upload do arquivo para o FTP: "$1"',
			'errFtpMkdir'          : 'Não foi possível criar um diretório remoto no FTP: "$1"',
			'errArchiveExec'       : 'Erro ao arquivar os arquivos: "$1"',
			'errExtractExec'       : 'Erro na extração dos arquivos: "$1"',
			'errNetUnMount'        : 'Incapaz de desmontar', // from v2.1 added 30.04.2012
			'errConvUTF8'          : 'Não conversivel para UTF-8', // from v2.1 added 08.04.2014
			'errFolderUpload'      : 'Tente utilizar o Google Chrome, se você deseja enviar uma pasta.', // from v2.1 added 26.6.2015
			'errSearchTimeout'     : 'Tempo limite atingido para a busca "$1". O resultado da pesquisa é parcial.', // from v2.1 added 12.1.2016
			'errReauthRequire'     : 'Re-autorização é necessária.', // from v2.1.10 added 24.3.2016
			'errMaxTargets'        : 'O número máximo de itens selecionáveis ​​é $1.', // from v2.1.17 added 17.10.2016
			'errRestore'           : 'Não foi possível restaurar a partir do lixo. Não é possível identificar o destino da restauração.', // from v2.1.24 added 3.5.2017
			'errEditorNotFound'    : 'Editor não encontrado para este tipo de arquivo.', // from v2.1.25 added 23.5.2017
			'errServerError'       : 'Ocorreu um erro no lado do servidor.', // from v2.1.25 added 16.6.2017
			'errEmpty'             : 'Não foi possível esvaziar a pasta "$1".', // from v2.1.25 added 22.6.2017
			'moreErrors'           : 'Existem mais $1 erros.', // from v2.1.44 added 9.12.2018
			'errMaxMkdirs'         : 'Você pode criar até $1 pastas de uma vez.', // from v2.1.58 added 20.6.2021

			/******************************* commands names ********************************/
			'cmdarchive'   : 'Criar arquivo',
			'cmdback'      : 'Voltar',
			'cmdcopy'      : 'Copiar',
			'cmdcut'       : 'Cortar',
			'cmddownload'  : 'Baixar',
			'cmdduplicate' : 'Duplicar',
			'cmdedit'      : 'Editar arquivo',
			'cmdextract'   : 'Extrair arquivo de ficheiros',
			'cmdforward'   : 'Avançar',
			'cmdgetfile'   : 'Selecionar arquivos',
			'cmdhelp'      : 'Sobre este software',
			'cmdhome'      : 'Home',
			'cmdinfo'      : 'Propriedades',
			'cmdmkdir'     : 'Nova pasta',
			'cmdmkdirin'   : 'Em uma nova pasta', // from v2.1.7 added 19.2.2016
			'cmdmkfile'    : 'Novo arquivo',
			'cmdopen'      : 'Abrir',
			'cmdpaste'     : 'Colar',
			'cmdquicklook' : 'Pré-vizualização',
			'cmdreload'    : 'Recarregar',
			'cmdrename'    : 'Renomear',
			'cmdrm'        : 'Deletar',
			'cmdtrash'     : 'Mover para a lixeira', //from v2.1.24 added 29.4.2017
			'cmdrestore'   : 'Restaurar', //from v2.1.24 added 3.5.2017
			'cmdsearch'    : 'Achar arquivos',
			'cmdup'        : 'Ir para o diretório pai',
			'cmdupload'    : 'Fazer upload de arquivo',
			'cmdview'      : 'Vizualizar',
			'cmdresize'    : 'Redimencionar & Rotacionar',
			'cmdsort'      : 'Ordenar',
			'cmdnetmount'  : 'Montar unidade de rede', // added 18.04.2012
			'cmdnetunmount': 'Desmontar', // from v2.1 added 30.04.2012
			'cmdplaces'    : 'Para locais', // added 28.12.2014
			'cmdchmod'     : 'Alterar permissão', // from v2.1 added 20.6.2015
			'cmdopendir'   : 'Abrir pasta', // from v2.1 added 13.1.2016
			'cmdcolwidth'  : 'Redefinir largura da coluna', // from v2.1.13 added 12.06.2016
			'cmdfullscreen': 'Tela cheia', // from v2.1.15 added 03.08.2016
			'cmdmove'      : 'Mover', // from v2.1.15 added 21.08.2016
			'cmdempty'     : 'Esvaziar a pasta', // from v2.1.25 added 22.06.2017
			'cmdundo'      : 'Desfazer', // from v2.1.27 added 31.07.2017
			'cmdredo'      : 'Refazer', // from v2.1.27 added 31.07.2017
			'cmdpreference': 'Preferências', // from v2.1.27 added 03.08.2017
			'cmdselectall' : 'Selecionar tudo', // from v2.1.28 added 15.08.2017
			'cmdselectnone': 'Selecionar nenhum', // from v2.1.28 added 15.08.2017
			'cmdselectinvert': 'Inverter seleção', // from v2.1.28 added 15.08.2017
			'cmdopennew'   : 'Abrir em nova janela', // from v2.1.38 added 3.4.2018
			'cmdhide'      : 'Ocultar (preferência)', // from v2.1.41 added 24.7.2018

			/*********************************** buttons ***********************************/
			'btnClose'  : 'Fechar',
			'btnSave'   : 'Salvar',
			'btnRm'     : 'Remover',
			'btnApply'  : 'Aplicar',
			'btnCancel' : 'Cancelar',
			'btnNo'     : 'Não',
			'btnYes'    : 'Sim',
			'btnMount'  : 'Montar',  // added 18.04.2012
			'btnApprove': 'Vá para $1 & aprove', // from v2.1 added 26.04.2012
			'btnUnmount': 'Desmontar', // from v2.1 added 30.04.2012
			'btnConv'   : 'Converter', // from v2.1 added 08.04.2014
			'btnCwd'    : 'Aqui',      // from v2.1 added 22.5.2015
			'btnVolume' : 'Volume',    // from v2.1 added 22.5.2015
			'btnAll'    : 'Todos',       // from v2.1 added 22.5.2015
			'btnMime'   : 'Tipo MIME', // from v2.1 added 22.5.2015
			'btnFileName':'Nome do arquivo',  // from v2.1 added 22.5.2015
			'btnSaveClose': 'Salvar & Fechar', // from v2.1 added 12.6.2015
			'btnBackup' : 'Cópia de segurança', // fromv2.1 added 28.11.2015
			'btnRename'    : 'Renomear',      // from v2.1.24 added 6.4.2017
			'btnRenameAll' : 'Renomear (tudo)', // from v2.1.24 added 6.4.2017
			'btnPrevious' : 'Anterior ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnNext'     : 'Próximo ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnSaveAs'   : 'Salvar como', // from v2.1.25 added 24.5.2017

			/******************************** notifications ********************************/
			'ntfopen'     : 'Abrir pasta',
			'ntffile'     : 'Abrir arquivo',
			'ntfreload'   : 'Recarregar conteudo da pasta',
			'ntfmkdir'    : 'Criar diretório',
			'ntfmkfile'   : 'Criar arquivos',
			'ntfrm'       : 'Deletar arquivos',
			'ntfcopy'     : 'Copiar arquivos',
			'ntfmove'     : 'Mover arquivos',
			'ntfprepare'  : 'Preparando para copiar arquivos',
			'ntfrename'   : 'Renomear arquivos',
			'ntfupload'   : 'Subindo os arquivos',
			'ntfdownload' : 'Baixando os arquivos',
			'ntfsave'     : 'Salvando os arquivos',
			'ntfarchive'  : 'Criando os arquivos',
			'ntfextract'  : 'Extraindo arquivos compactados',
			'ntfsearch'   : 'Procurando arquivos',
			'ntfresize'   : 'Redimensionando imagens',
			'ntfsmth'     : 'Fazendo alguma coisa',
			'ntfloadimg'  : 'Carregando Imagem',
			'ntfnetmount' : 'Montando unidade de rede', // added 18.04.2012
			'ntfnetunmount': 'Desmontando unidade de rede', // from v2.1 added 30.04.2012
			'ntfdim'      : 'Adquirindo dimensão da imagem', // added 20.05.2013
			'ntfreaddir'  : 'Lendo informações da pasta', // from v2.1 added 01.07.2013
			'ntfurl'      : 'Recebendo URL do link', // from v2.1 added 11.03.2014
			'ntfchmod'    : 'Alterando permissões do arquivo', // from v2.1 added 20.6.2015
			'ntfpreupload': 'Verificando o nome do arquivo de upload', // from v2.1 added 31.11.2015
			'ntfzipdl'    : 'Criando um arquivo para download', // from v2.1.7 added 23.1.2016
			'ntfparents'  : 'Obtendo informações do caminho', // from v2.1.17 added 2.11.2016
			'ntfchunkmerge': 'Processando o arquivo carregado', // from v2.1.17 added 2.11.2016
			'ntftrash'    : 'Movendo para a lixeira', // from v2.1.24 added 2.5.2017
			'ntfrestore'  : 'Restaurando da lixeira', // from v2.1.24 added 3.5.2017
			'ntfchkdir'   : 'Verificando a pasta de destino', // from v2.1.24 added 3.5.2017
			'ntfundo'     : 'Desfazendo a operação anterior', // from v2.1.27 added 31.07.2017
			'ntfredo'     : 'Refazendo o desfazer anterior', // from v2.1.27 added 31.07.2017
			'ntfchkcontent' : 'Verificando conteúdos', // from v2.1.41 added 3.8.2018

			/*********************************** volumes *********************************/
			'volume_Trash' : 'Lixo', //from v2.1.24 added 29.4.2017

			/************************************ dates **********************************/
			'dateUnknown' : 'Desconhecido',
			'Today'       : 'Hoje',
			'Yesterday'   : 'Ontem',
			'msJan'       : 'janeiro',
			'msFeb'       : 'Fev',
			'msMar'       : 'março',
			'msApr'       : 'Abr',
			'msMay'       : 'Mai',
			'msJun'       : 'Jun',
			'msJul'       : 'julho',
			'msAug'       : 'Ago',
			'msSep'       : 'Set',
			'msOct'       : 'Out',
			'msNov'       : 'novembro',
			'msDec'       : 'Dez',
			'January'     : 'Janeiro',
			'February'    : 'Fevereiro',
			'March'       : 'Março',
			'April'       : 'Abril',
			'May'         : 'Maio',
			'June'        : 'Junho',
			'July'        : 'Julho',
			'August'      : 'Agosto',
			'September'   : 'Setembro',
			'October'     : 'Outubro',
			'November'    : 'Novembro',
			'December'    : 'Dezembro',
			'Sunday'      : 'Domingo',
			'Monday'      : 'Segunda-feira',
			'Tuesday'     : 'Terça-feira',
			'Wednesday'   : 'Quarta-feira',
			'Thursday'    : 'Quinta-feira',
			'Friday'      : 'Sexta-feira',
			'Saturday'    : 'Sábado',
			'Sun'         : 'Dom',
			'Mon'         : 'Seg',
			'Tue'         : 'Ter',
			'Wed'         : 'Qua',
			'Thu'         : 'Qui',
			'Fri'         : 'Sex',
			'Sat'         : 'Sáb',

			/******************************** sort variants ********************************/
			'sortname'          : 'por nome',
			'sortkind'          : 'por tipo',
			'sortsize'          : 'por tam.',
			'sortdate'          : 'por data',
			'sortFoldersFirst'  : 'Pastas primeiro',
			'sortperm'          : 'Com permissão', // from v2.1.13 added 13.06.2016
			'sortmode'          : 'Por modo',       // from v2.1.13 added 13.06.2016
			'sortowner'         : 'Por proprietário',      // from v2.1.13 added 13.06.2016
			'sortgroup'         : 'Por grupo',      // from v2.1.13 added 13.06.2016
			'sortAlsoTreeview'  : 'Vizualizar em árvore',  // from v2.1.15 added 01.08.2016

			/********************************** new items **********************************/
			'untitled file.txt' : 'NovoArquivo.txt', // added 10.11.2015
			'untitled folder'   : 'NovaPasta',   // added 10.11.2015
			'Archive'           : 'NovoArquivo',  // from v2.1 added 10.11.2015
			'untitled file'     : 'NovoArquivo.$1',  // from v2.1.41 added 6.8.2018
			'extentionfile'     : '$1: Arquivo',    // from v2.1.41 added 6.8.2018
			'extentiontype'     : '$1: $2',      // from v2.1.43 added 17.10.2018

			/********************************** messages **********************************/
			'confirmReq'      : 'Confirmação requerida',
			'confirmRm'       : 'Você tem certeza que deseja remover os arquivos?<br />Isto não pode ser desfeito!',
			'confirmRepl'     : 'Substituir arquivo velho com este novo?',
			'confirmRest'     : 'Substituir o item existente pelo item na lixeira?', // fromv2.1.24 added 5.5.2017
			'confirmConvUTF8' : 'Não está em UTF-8<br/>Converter para UTF-8?<br/>Conteúdo se torna UTF-8 após salvar as conversões.', // from v2.1 added 08.04.2014
			'confirmNonUTF8'  : 'Não foi possível detectar a codificação de caracteres deste arquivo. Ele precisa ser convertido temporariamente em UTF-8 para edição. Por favor, selecione a codificação de caracteres deste arquivo.', // from v2.1.19 added 28.11.2016
			'confirmNotSave'  : 'Isto foi modificado.<br/>Você vai perder seu trabalho caso não salve as mudanças.', // from v2.1 added 15.7.2015
			'confirmTrash'    : 'Tem certeza de que deseja mover itens para a lixeira?', //from v2.1.24 added 29.4.2017
			'confirmMove'     : 'Tem certeza de que deseja mover itens para "$1"?', //from v2.1.50 added 27.7.2019
			'apllyAll'        : 'Aplicar a todos',
			'name'            : 'Nome',
			'size'            : 'Tamanho',
			'perms'           : 'Permissões',
			'modify'          : 'Modificado',
			'kind'            : 'Tipo',
			'read'            : 'Ler',
			'write'           : 'Escrever',
			'noaccess'        : 'Inacessível',
			'and'             : 'e',
			'unknown'         : 'Desconhecido',
			'selectall'       : 'Selecionar todos arquivos',
			'selectfiles'     : 'Selecionar arquivo(s)',
			'selectffile'     : 'Selecionar primeiro arquivo',
			'selectlfile'     : 'Slecionar último arquivo',
			'viewlist'        : 'Exibir como lista',
			'viewicons'       : 'Exibir como ícones',
			'viewSmall'       : 'Ícones pequenos', // from v2.1.39 added 22.5.2018
			'viewMedium'      : 'Ícones médios', // from v2.1.39 added 22.5.2018
			'viewLarge'       : 'Ícones grandes', // from v2.1.39 added 22.5.2018
			'viewExtraLarge'  : 'Ícones gigantes', // from v2.1.39 added 22.5.2018
			'places'          : 'Lugares',
			'calc'            : 'Calcular',
			'path'            : 'Caminho',
			'aliasfor'        : 'Alias para',
			'locked'          : 'Bloqueado',
			'dim'             : 'Dimesões',
			'files'           : 'Arquivos',
			'folders'         : 'Pastas',
			'items'           : 'Itens',
			'yes'             : 'sim',
			'no'              : 'não',
			'link'            : 'Link',
			'searcresult'     : 'Resultados da pesquisa',
			'selected'        : 'itens selecionados',
			'about'           : 'Sobre',
			'shortcuts'       : 'Atalhos',
			'help'            : 'Ajuda',
			'webfm'           : 'Gerenciador de arquivos web',
			'ver'             : 'Versão',
			'protocolver'     : 'Versão do protocolo',
			'homepage'        : 'Home do projeto',
			'docs'            : 'Documentação',
			'github'          : 'Fork us on Github',
			'twitter'         : 'Siga-nos no twitter',
			'facebook'        : 'Junte-se a nós no Facebook',
			'team'            : 'Time',
			'chiefdev'        : 'Desenvolvedor chefe',
			'developer'       : 'Desenvolvedor',
			'contributor'     : 'Contribuinte',
			'maintainer'      : 'Mantenedor',
			'translator'      : 'Tradutor',
			'icons'           : 'Ícones',
			'dontforget'      : 'e não se esqueça de levar a sua toalha',
			'shortcutsof'     : 'Atalhos desabilitados',
			'dropFiles'       : 'Solte os arquivos aqui',
			'or'              : 'ou',
			'selectForUpload' : 'Selecione arquivos para upload',
			'moveFiles'       : 'Mover arquivos',
			'copyFiles'       : 'Copiar arquivos',
			'restoreFiles'    : 'Restaurar itens', // from v2.1.24 added 5.5.2017
			'rmFromPlaces'    : 'Remover de Lugares',
			'aspectRatio'     : 'Manter aspecto',
			'scale'           : 'Tamanho',
			'width'           : 'Largura',
			'height'          : 'Altura',
			'resize'          : 'Redimencionar',
			'crop'            : 'Cortar',
			'rotate'          : 'Rotacionar',
			'rotate-cw'       : 'Girar 90 graus CW',
			'rotate-ccw'      : 'Girar 90 graus CCW',
			'degree'          : '°',
			'netMountDialogTitle' : 'Montar Unidade de rede', // added 18.04.2012
			'protocol'            : 'Protocolo', // added 18.04.2012
			'host'                : 'Servidor', // added 18.04.2012
			'port'                : 'Porta', // added 18.04.2012
			'user'                : 'Usuário', // added 18.04.2012
			'pass'                : 'Senha', // added 18.04.2012
			'confirmUnmount'      : 'Deseja desmontar $1?',  // from v2.1 added 30.04.2012
			'dropFilesBrowser': 'Soltar ou colar arquivos do navegador', // from v2.1 added 30.05.2012
			'dropPasteFiles'  : 'Solte ou cole arquivos aqui', // from v2.1 added 07.04.2014
			'encoding'        : 'Codificação', // from v2.1 added 19.12.2014
			'locale'          : 'Local',   // from v2.1 added 19.12.2014
			'searchTarget'    : 'Alvo: $1',                // from v2.1 added 22.5.2015
			'searchMime'      : 'Perquisar por input MIME Type', // from v2.1 added 22.5.2015
			'owner'           : 'Dono', // from v2.1 added 20.6.2015
			'group'           : 'Grupo', // from v2.1 added 20.6.2015
			'other'           : 'Outro', // from v2.1 added 20.6.2015
			'execute'         : 'Executar', // from v2.1 added 20.6.2015
			'perm'            : 'Permissão', // from v2.1 added 20.6.2015
			'mode'            : 'Modo', // from v2.1 added 20.6.2015
			'emptyFolder'     : 'Pasta vazia', // from v2.1.6 added 30.12.2015
			'emptyFolderDrop' : 'Pasta vazia\\A Arraste itens para os adicionar', // from v2.1.6 added 30.12.2015
			'emptyFolderLTap' : 'Pasta vazia\\A De um toque longo para adicionar itens', // from v2.1.6 added 30.12.2015
			'quality'         : 'Qualidade', // from v2.1.6 added 5.1.2016
			'autoSync'        : 'Auto sincronização',  // from v2.1.6 added 10.1.2016
			'moveUp'          : 'Mover para cima',  // from v2.1.6 added 18.1.2016
			'getLink'         : 'Obter link', // from v2.1.7 added 9.2.2016
			'selectedItems'   : 'Itens selecionados ($1)', // from v2.1.7 added 2.19.2016
			'folderId'        : 'ID da pasta', // from v2.1.10 added 3.25.2016
			'offlineAccess'   : 'Permitir acesso offline', // from v2.1.10 added 3.25.2016
			'reAuth'          : 'Se autenticar novamente', // from v2.1.10 added 3.25.2016
			'nowLoading'      : 'Carregando...', // from v2.1.12 added 4.26.2016
			'openMulti'       : 'Abrir múltiplos arquivos', // from v2.1.12 added 5.14.2016
			'openMultiConfirm': 'Você está tentando abrir os arquivos $1. Tem certeza de que deseja abrir no navegador?', // from v2.1.12 added 5.14.2016
			'emptySearch'     : 'Os resultados da pesquisa estão vazios no destino da pesquisa.', // from v2.1.12 added 5.16.2016
			'editingFile'     : 'Arquivo sendo editado.', // from v2.1.13 added 6.3.2016
			'hasSelected'     : 'Voce selecionou $1 itens.', // from v2.1.13 added 6.3.2016
			'hasClipboard'    : 'Você tem $1 itens na área de transferência.', // from v2.1.13 added 6.3.2016
			'incSearchOnly'   : 'A pesquisa incremental é apenas da visualização atual.', // from v2.1.13 added 6.30.2016
			'reinstate'       : 'Restabelecer', // from v2.1.15 added 3.8.2016
			'complete'        : '$1 completo', // from v2.1.15 added 21.8.2016
			'contextmenu'     : 'Menu contextual', // from v2.1.15 added 9.9.2016
			'pageTurning'     : 'Virar página', // from v2.1.15 added 10.9.2016
			'volumeRoots'     : 'Raízes de volume', // from v2.1.16 added 16.9.2016
			'reset'           : 'Resetar', // from v2.1.16 added 1.10.2016
			'bgcolor'         : 'Cor de fundo', // from v2.1.16 added 1.10.2016
			'colorPicker'     : 'Seletor de cores', // from v2.1.16 added 1.10.2016
			'8pxgrid'         : 'Grade 8px', // from v2.1.16 added 4.10.2016
			'enabled'         : 'Ativado', // from v2.1.16 added 4.10.2016
			'disabled'        : 'Desativado', // from v2.1.16 added 4.10.2016
			'emptyIncSearch'  : 'Os resultados da pesquisa estão vazios na exibição atual.\\APressione [Enter] para expandir o alvo da pesquisa.', // from v2.1.16 added 5.10.2016
			'emptyLetSearch'  : 'Os resultados da pesquisa da primeira letra estão vazios na exibição atual.', // from v2.1.23 added 24.3.2017
			'textLabel'       : 'Texto do rótulo', // from v2.1.17 added 13.10.2016
			'minsLeft'        : '$1 minutos restantes', // from v2.1.17 added 13.11.2016
			'openAsEncoding'  : 'Reabrir com a codificação selecionada', // from v2.1.19 added 2.12.2016
			'saveAsEncoding'  : 'Salvar com a codificação selecionada', // from v2.1.19 added 2.12.2016
			'selectFolder'    : 'Selecione a pasta', // from v2.1.20 added 13.12.2016
			'firstLetterSearch': 'Buscar primeira letra', // from v2.1.23 added 24.3.2017
			'presets'         : 'Predefinições', // from v2.1.25 added 26.5.2017
			'tooManyToTrash'  : 'São muitos itens, portanto não podem ser jogados no lixo.', // from v2.1.25 added 9.6.2017
			'TextArea'        : 'TextArea', // from v2.1.25 added 14.6.2017
			'folderToEmpty'   : 'Esvaziar a pasta "$1".', // from v2.1.25 added 22.6.2017
			'filderIsEmpty'   : 'Não há itens em uma pasta "$1".', // from v2.1.25 added 22.6.2017
			'preference'      : 'Preferência', // from v2.1.26 added 28.6.2017
			'language'        : 'Língua', // from v2.1.26 added 28.6.2017
			'clearBrowserData': 'Inicialize as configurações salvas neste navegador', // from v2.1.26 added 28.6.2017
			'toolbarPref'     : 'Barra de ferramentas', // from v2.1.27 added 2.8.2017
			'charsLeft'       : '... $1 caracteres restantes.',  // from v2.1.29 added 30.8.2017
			'linesLeft'       : '... $1 linhas restantes.',  // from v2.1.52 added 16.1.2020
			'sum'             : 'Somar', // from v2.1.29 added 28.9.2017
			'roughFileSize'   : 'Tamanho aproximado do arquivo', // from v2.1.30 added 2.11.2017
			'autoFocusDialog' : 'Focar no elemento do diálogo com o mouse por cima',  // from v2.1.30 added 2.11.2017
			'select'          : 'Selecione', // from v2.1.30 added 23.11.2017
			'selectAction'    : 'Ação ao selecionar arquivo', // from v2.1.30 added 23.11.2017
			'useStoredEditor' : 'Abrir com o editor usado pela última vez', // from v2.1.30 added 23.11.2017
			'selectinvert'    : 'Inverter seleção', // from v2.1.30 added 25.11.2017
			'renameMultiple'  : 'Tem certeza de que deseja renomear $1 itens selecionados como $2?<br/>Isto não poderá ser desfeito!', // from v2.1.31 added 4.12.2017
			'batchRename'     : 'Renomear Batch', // from v2.1.31 added 8.12.2017
			'plusNumber'      : '+ Número', // from v2.1.31 added 8.12.2017
			'asPrefix'        : 'Adicionar prefixo', // from v2.1.31 added 8.12.2017
			'asSuffix'        : 'Adicionar sufixo', // from v2.1.31 added 8.12.2017
			'changeExtention' : 'Alterar extensão', // from v2.1.31 added 8.12.2017
			'columnPref'      : 'Configurações de colunas (exibição em lista)', // from v2.1.32 added 6.2.2018
			'reflectOnImmediate' : 'Todas as alterações serão refletidas imediatamente no arquivo.', // from v2.1.33 added 2.3.2018
			'reflectOnUnmount'   : 'Quaisquer alterações não serão refletidas até desmontar este volume.', // from v2.1.33 added 2.3.2018
			'unmountChildren' : 'O(s) seguinte(s) volume(s) montado neste volume também desmontado. Você tem certeza que quer desmontá-lo(s)?', // from v2.1.33 added 5.3.2018
			'selectionInfo'   : 'Informações da seleção', // from v2.1.33 added 7.3.2018
			'hashChecker'     : 'Algoritmos para mostrar o hash do arquivo', // from v2.1.33 added 10.3.2018
			'infoItems'       : 'Itens de informação (painel Informações de seleção)', // from v2.1.38 added 28.3.2018
			'pressAgainToExit': 'Pressione novamente para sair.', // from v2.1.38 added 1.4.2018
			'toolbar'         : 'Barra de ferramentas', // from v2.1.38 added 4.4.2018
			'workspace'       : 'Área de trabalho', // from v2.1.38 added 4.4.2018
			'dialog'          : 'Diálogo', // from v2.1.38 added 4.4.2018
			'all'             : 'Tudo', // from v2.1.38 added 4.4.2018
			'iconSize'        : 'Tamanho do ícone (Visualização de ícones)', // from v2.1.39 added 7.5.2018
			'editorMaximized' : 'Abra a janela maximizada do editor', // from v2.1.40 added 30.6.2018
			'editorConvNoApi' : 'Como a conversão por API não está disponível no momento, faça a conversão no site.', //from v2.1.40 added 8.7.2018
			'editorConvNeedUpload' : 'Após a conversão, você deve fazer o upload com o URL do item ou um arquivo baixado para salvar o arquivo convertido.', //from v2.1.40 added 8.7.2018
			'convertOn'       : 'Converter no site $1', // from v2.1.40 added 10.7.2018
			'integrations'    : 'Integrações', // from v2.1.40 added 11.7.2018
			'integrationWith' : 'Este elFinder possui os seguintes serviços externos integrados. Por favor, verifique os termos de uso, política de privacidade, etc. antes de usá-lo.', // from v2.1.40 added 11.7.2018
			'showHidden'      : 'Mostrar itens ocultos', // from v2.1.41 added 24.7.2018
			'hideHidden'      : 'Ocultar itens ocultos', // from v2.1.41 added 24.7.2018
			'toggleHidden'    : 'Mostrar/Ocultar itens ocultos', // from v2.1.41 added 24.7.2018
			'makefileTypes'   : 'Tipos de arquivo para ativar com "Novo arquivo"', // from v2.1.41 added 7.8.2018
			'typeOfTextfile'  : 'Tipo do arquivo de texto', // from v2.1.41 added 7.8.2018
			'add'             : 'Adicionar', // from v2.1.41 added 7.8.2018
			'theme'           : 'Tema', // from v2.1.43 added 19.10.2018
			'default'         : 'Padrão', // from v2.1.43 added 19.10.2018
			'description'     : 'Descrição', // from v2.1.43 added 19.10.2018
			'website'         : 'Site da internet', // from v2.1.43 added 19.10.2018
			'author'          : 'Autor', // from v2.1.43 added 19.10.2018
			'email'           : 'E-mail', // from v2.1.43 added 19.10.2018
			'license'         : 'Licença', // from v2.1.43 added 19.10.2018
			'exportToSave'    : 'Este item não pode ser salvo. Para evitar perder as edições, você precisa exportar para o seu PC.', // from v2.1.44 added 1.12.2018
			'dblclickToSelect': 'Clique duas vezes no arquivo para selecioná-lo.', // from v2.1.47 added 22.1.2019
			'useFullscreen'   : 'Usar o modo de tela cheia', // from v2.1.47 added 19.2.2019

			/********************************** mimetypes **********************************/
			'kindUnknown'     : 'Desconhecio',
			'kindRoot'        : 'Raiz do volume', // from v2.1.16 added 16.10.2016
			'kindFolder'      : 'Pasta',
			'kindSelects'     : 'Seleções', // from v2.1.29 added 29.8.2017
			'kindAlias'       : 'Alias',
			'kindAliasBroken' : 'Alias inválido',
			// applications
			'kindApp'         : 'Aplicação',
			'kindPostscript'  : 'Documento Postscript',
			'kindMsOffice'    : 'Documento Microsoft Office',
			'kindMsWord'      : 'Documento Microsoft Word',
			'kindMsExcel'     : 'Documento Microsoft Excel',
			'kindMsPP'        : 'Apresentação Microsoft Powerpoint',
			'kindOO'          : 'Documento Open Office',
			'kindAppFlash'    : 'Aplicação Flash',
			'kindPDF'         : 'Formato de Documento Portátil (PDF)',
			'kindTorrent'     : 'Arquivo Bittorrent',
			'kind7z'          : 'Arquivo 7z',
			'kindTAR'         : 'Arquivo TAR',
			'kindGZIP'        : 'Arquivo GZIP',
			'kindBZIP'        : 'Arquivo BZIP',
			'kindXZ'          : 'Arquivo XZ',
			'kindZIP'         : 'Arquivo ZIP',
			'kindRAR'         : 'Arquivo RAR',
			'kindJAR'         : 'Arquivo JAR',
			'kindTTF'         : 'Tipo verdadeiro da fonte',
			'kindOTF'         : 'Abrir tipo de fonte',
			'kindRPM'         : 'Pacote RPM',
			// texts
			'kindText'        : 'Arquivo de texto',
			'kindTextPlain'   : 'Texto simples',
			'kindPHP'         : 'PHP',
			'kindCSS'         : 'Planilha em estilo cascata (CSS)',
			'kindHTML'        : 'Documento HTML',
			'kindJS'          : 'Javascript',
			'kindRTF'         : 'Formato Rich Text',
			'kindC'           : 'C',
			'kindCHeader'     : 'C cabeçalho',
			'kindCPP'         : 'C++',
			'kindCPPHeader'   : 'C++ cabeçalho',
			'kindShell'       : 'script de shell Unix',
			'kindPython'      : 'Python',
			'kindJava'        : 'Java',
			'kindRuby'        : 'Ruby',
			'kindPerl'        : 'Perl',
			'kindSQL'         : 'SQL',
			'kindXML'         : 'Documento XML',
			'kindAWK'         : 'AWK',
			'kindCSV'         : 'Valores separados por vírgula',
			'kindDOCBOOK'     : 'Documento Docbook XML',
			'kindMarkdown'    : 'Texto Markdown', // added 20.7.2015
			// images
			'kindImage'       : 'Imagem',
			'kindBMP'         : 'Imagem BMP',
			'kindJPEG'        : 'Imagem JPEG',
			'kindGIF'         : 'Imagem GIF',
			'kindPNG'         : 'Imagem PNG',
			'kindTIFF'        : 'Imagem TIFF',
			'kindTGA'         : 'Imagem TGA',
			'kindPSD'         : 'Imagem Adobe Photoshop',
			'kindXBITMAP'     : 'Imagem X bitmap',
			'kindPXM'         : 'Imagem Pixelmator',
			// media
			'kindAudio'       : 'Arquivo de audio',
			'kindAudioMPEG'   : 'Audio MPEG',
			'kindAudioMPEG4'  : 'Audio MPEG-4',
			'kindAudioMIDI'   : 'Audio MIDI',
			'kindAudioOGG'    : 'Audio Ogg Vorbis',
			'kindAudioWAV'    : 'Audio WAV',
			'AudioPlaylist'   : 'Lista de reprodução MP3 ',
			'kindVideo'       : 'Arquivo de video',
			'kindVideoDV'     : 'DV filme',
			'kindVideoMPEG'   : 'Video MPEG',
			'kindVideoMPEG4'  : 'Video MPEG-4',
			'kindVideoAVI'    : 'Video AVI',
			'kindVideoMOV'    : 'Filme rápido',
			'kindVideoWM'     : 'Video Windows Media',
			'kindVideoFlash'  : 'Video Flash',
			'kindVideoMKV'    : 'MKV',
			'kindVideoOGG'    : 'Video Ogg'
		}
	};
}));

js/i18n/elfinder.uk.js000064400000123072151215013360010505 0ustar00/**
 * Українська мова translation
 * @author ITLancer
 * @author cjayho <cj.fooser@gmail.com>
 * @version 2022-03-03
 */
 (function(root, factory) {
	if (typeof define === 'function' && define.amd) {
		define(['elfinder'], factory);
	} else if (typeof exports !== 'undefined') {
		module.exports = factory(require('elfinder'));
	} else {
		factory(root.elFinder);
	}
}(this, function(elFinder) {
	elFinder.prototype.i18.uk = {
		translator : 'ITLancer, cjayho &lt;cj.fooser@gmail.com&gt;',
		language   : 'Українська мова',
		direction  : 'ltr',
		dateFormat : 'd.m.Y H:i', // will show like: 03.03.2022 18:02
		fancyDateFormat : '$1 H:i', // will show like: сьогодні 18:02
		nonameDateFormat : 'ymd-His', // noname upload will show like: 220303-180221
		messages   : {
			'getShareText' : 'Поділіться',
			'Editor ': 'Редактор коду',

			/********************************** errors **********************************/
			'error'                : 'Помилка',
			'errUnknown'           : 'Невідома помилка.',
			'errUnknownCmd'        : 'Невідома команда.',
			'errJqui'              : 'Неправильне налаштування jQuery UI. Відсутні компоненти: selectable, draggable, droppable.',
			'errNode'              : 'Відсутній елемент DOM для створення elFinder.',
			'errURL'               : 'Неправильне налаштування! Не вказана опція URL.',
			'errAccess'            : 'Доступ заборонено.',
			'errConnect'           : 'Не вдалося з’єднатися з backend.',
			'errAbort'             : 'З’єднання розірване.',
			'errTimeout'           : 'Тайм-аут з’єднання.',
			'errNotFound'          : 'Не знайдено backend.',
			'errResponse'          : 'Неправильна відповідь від backend.',
			'errConf'              : 'Неправильне налаштування backend.',
			'errJSON'              : 'Модуль PHP JSON не встановлено.',
			'errNoVolumes'         : 'Немає доступних для читання директорій.',
			'errCmdParams'         : 'Неправильні параметри для команди "$1".',
			'errDataNotJSON'       : 'Дані не у форматі JSON.',
			'errDataEmpty'         : 'Дані відсутні.',
			'errCmdReq'            : 'Backend вимагає назву команди.',
			'errOpen'              : 'Неможливо відкрити "$1".',
			'errNotFolder'         : 'Об’єкт не є папкою.',
			'errNotFile'           : 'Об’єкт не є файлом.',
			'errRead'              : 'Неможливо прочитати "$1".',
			'errWrite'             : 'Неможливо записати в "$1".',
			'errPerm'              : 'Помилка доступу.',
			'errLocked'            : 'Файл "$1" заблоковано і його неможливо перемістити, перейменувати чи вилучити.',
			'errExists'            : 'Файл з назвою "$1" вже існує.',
			'errInvName'           : 'Недійсна назва файла.',
			'errInvDirname'        : 'Недійсна назва теки.',  // from v2.1.24 added 12.4.2017
			'errFolderNotFound'    : 'Теку не знайдено.',
			'errFileNotFound'      : 'Файл не знайдено.',
			'errTrgFolderNotFound' : 'Цільову теку "$1" не знайдено.',
			'errPopup'             : 'Браузер забороняє відкривати popup-вікно. Дозвольте у налаштування браузера, щоб відкрити файл.',
			'errMkdir'             : 'Неможливо створити теку "$1".',
			'errMkfile'            : 'Неможливо створити файл "$1".',
			'errRename'            : 'Неможливо перейменувати файл "$1".',
			'errCopyFrom'          : 'Копіювання файлів з тому "$1" не дозволено.',
			'errCopyTo'            : 'Копіювання файлів на том "$1" не дозволено.',
			'errMkOutLink'         : 'Неможливо створити посилання у місце за межами кореневої теки носія.', // from v2.1 added 03.10.2015
			'errUpload'            : 'Помилка відвантаження.',  // old name - errUploadCommon
			'errUploadFile'        : 'Неможливо відвантажити файл "$1".', // old name - errUpload
			'errUploadNoFiles'     : 'Не знайдено файлів для відвантаження.',
			'errUploadTotalSize'   : 'Об\'єм даних перевищив встановлений ліміт.', // old name - errMaxSize
			'errUploadFileSize'    : 'Об\'єм файла перевищив встановлений ліміт.', //  old name - errFileMaxSize
			'errUploadMime'        : 'Файли цього типу заборонені.',
			'errUploadTransfer'    : '"$1" : помилка передачі.',
			'errUploadTemp'        : 'Неможливо створити тимчасовий файл для відвантаження.', // from v2.1 added 26.09.2015
			'errNotReplace'        : 'Об\'єкт "$1" вже існує тут та не може бути заміненим на об\'єкт іншого типу.', // new
			'errReplace'           : 'Неможливо замінити "$1".',
			'errSave'              : 'Неможливо записати "$1".',
			'errCopy'              : 'Неможливо скопіювати "$1".',
			'errMove'              : 'Неможливо перенести "$1".',
			'errCopyInItself'      : 'Неможливо скопіювати "$1" сам у себе.',
			'errRm'                : 'Неможливо вилучити "$1".',
			'errTrash'             : 'Неможливо пересунути до смітника.', // from v2.1.24 added 30.4.2017
			'errRmSrc'             : 'Неможливо видалити оригінальний(і) файл(и).',
			'errExtract'           : 'Неможливо розпакувати файли з "$1".',
			'errArchive'           : 'Неможливо створити архів.',
			'errArcType'           : 'Тип архіву не підтримується.',
			'errNoArchive'         : 'Файл не є архівом, або є архівом, тип якого не підтримується.',
			'errCmdNoSupport'      : 'Серверна частина не підтримує цієї команди.',
			'errReplByChild'       : 'Папка “$1” не може бути замінена елементом, який вона містить.',
			'errArcSymlinks'       : 'З міркувань безпеки заборонено розпаковувати архіви з символічними посиланнями.', // edited 24.06.2012
			'errArcMaxSize'        : 'Розмір файлів архіву перевищує допустиме значення.',
			'errResize'            : 'Неможливо масштабувати "$1".',
			'errResizeDegree'      : 'Недійсний кут обертання.',  // added 7.3.2013
			'errResizeRotate'      : 'Неможливо повернути світлину.',  // added 7.3.2013
			'errResizeSize'        : 'Недійсний розмір світлини.',  // added 7.3.2013
			'errResizeNoChange'    : 'Розмір світлини не змінено.',  // added 7.3.2013
			'errUsupportType'      : 'Непідтримуваний тип файла.',
			'errNotUTF8Content'    : 'Файл "$1" не в UTF-8 і не може бути відредагований.',  // added 9.11.2011
			'errNetMount'          : 'Неможливо змонтувати "$1".', // added 17.04.2012
			'errNetMountNoDriver'  : 'Непідтримуваний протокл.',     // added 17.04.2012
			'errNetMountFailed'    : 'В процесі монтування сталася помилка.',         // added 17.04.2012
			'errNetMountHostReq'   : 'Необхідно вказати хост.', // added 18.04.2012
			'errSessionExpires'    : 'Час сеансу минув через неактивність.',
			'errCreatingTempDir'   : 'НЕможливо створити тимчасову директорію: "$1"',
			'errFtpDownloadFile'   : 'Неможливо завантажити файл з FTP: "$1"',
			'errFtpUploadFile'     : 'Неможливо завантажити файл на FTP: "$1"',
			'errFtpMkdir'          : 'Неможливо створити віддалений каталог на FTP: "$1"',
			'errArchiveExec'       : 'Помилка при архівації файлів: "$1"',
			'errExtractExec'       : 'Помилка при розархівуванні файлів: "$1"',
			'errNetUnMount'        : 'Неможливо демонтувати', // from v2.1 added 30.04.2012
			'errConvUTF8'          : 'Неможливо конвертувати в UTF - 8', // from v2.1 added 08.04.2014
			'errFolderUpload'      : 'Використовуйте Google Chrome, якщо ви хочете завантажити папку', // from v2.1 added 26.6.2015
			'errSearchTimeout'     : 'Час пошуку "$1" вийшов. Результат пошуку частковий', // from v2.1 added 12.1.2016
			'errReauthRequire'     : 'Необхідна повторна авторизація.', // from v2.1.10 added 24.3.2016
			'errMaxTargets'        : 'Максимальна кількість об\'єктів що можна обрати складає $1.', // from v2.1.17 added 17.10.2016
			'errRestore'           : 'Неможливо відновити зі смітника: неможливо визначити місце куди відновлювати.', // from v2.1.24 added 3.5.2017
			'errEditorNotFound'    : 'Для цього типу файлів не знайдено редактора.', // from v2.1.25 added 23.5.2017
			'errServerError'       : 'Помилка на боці сервера.', // from v2.1.25 added 16.6.2017
			'errEmpty'             : 'Неможливо спорожнити теку "$1".', // from v2.1.25 added 22.6.2017
			'moreErrors'           : 'Є також ще $1 помилок.', // from v2.1.44 added 9.12.2018
			'errMaxMkdirs'         : 'Ви можете створити до $1 папки одночасно.', // from v2.1.58 added 20.6.2021

			/******************************* commands names ********************************/
			'cmdarchive'   : 'Архівувати',
			'cmdback'      : 'Назад',
			'cmdcopy'      : 'Копівати',
			'cmdcut'       : 'Вирізати',
			'cmddownload'  : 'Завантажити',
			'cmdduplicate' : 'Дублювати',
			'cmdedit'      : 'Редагувати файл',
			'cmdextract'   : 'Розпакувати файли з архіву',
			'cmdforward'   : 'Вперед',
			'cmdgetfile'   : 'Вибрати файли',
			'cmdhelp'      : 'Про програму',
			'cmdhome'      : 'Додому',
			'cmdinfo'      : 'Інформація',
			'cmdmkdir'     : 'Створити теку',
			'cmdmkdirin'   : 'До нової теки', // from v2.1.7 added 19.2.2016
			'cmdmkfile'    : 'Створити файл',
			'cmdopen'      : 'Відкрити',
			'cmdpaste'     : 'Вставити',
			'cmdquicklook' : 'Попередній перегляд',
			'cmdreload'    : 'Перечитати',
			'cmdrename'    : 'Перейменувати',
			'cmdrm'        : 'Вилучити',
			'cmdtrash'     : 'До смітника', //from v2.1.24 added 29.4.2017
			'cmdrestore'   : 'Відновити', //from v2.1.24 added 3.5.2017
			'cmdsearch'    : 'Шукати файли',
			'cmdup'        : 'На 1 рівень вгору',
			'cmdupload'    : 'Відвантажити файли',
			'cmdview'      : 'Перегляд',
			'cmdresize'    : 'Масштабувати зображення',
			'cmdsort'      : 'Сортування',
			'cmdnetmount'  : 'Змонтувати мережевий диск', // added 18.04.2012
			'cmdnetunmount': 'Розмонтувати', // from v2.1 added 30.04.2012
			'cmdplaces'    : 'До Місць', // added 28.12.2014
			'cmdchmod'     : 'Змінити права', // from v2.1 added 20.6.2015
			'cmdopendir'   : 'Відкрии директорію', // from v2.1 added 13.1.2016
			'cmdcolwidth'  : 'Скинути ширину стовпчика', // from v2.1.13 added 12.06.2016
			'cmdfullscreen': 'Повний екран', // from v2.1.15 added 03.08.2016
			'cmdmove'      : 'Пересунути', // from v2.1.15 added 21.08.2016
			'cmdempty'     : 'Спорожнити теку', // from v2.1.25 added 22.06.2017
			'cmdundo'      : 'Скасувати', // from v2.1.27 added 31.07.2017
			'cmdredo'      : 'Відновити', // from v2.1.27 added 31.07.2017
			'cmdpreference': 'Налаштування', // from v2.1.27 added 03.08.2017
			'cmdselectall' : 'Вибрати усі', // from v2.1.28 added 15.08.2017
			'cmdselectnone': 'Зняти вибір', // from v2.1.28 added 15.08.2017
			'cmdselectinvert': 'Інвертувати вибір', // from v2.1.28 added 15.08.2017
			'cmdopennew'   : 'Відкрити у новому вікні', // from v2.1.38 added 3.4.2018
			'cmdhide'      : 'Сховати (Налаштування)', // from v2.1.41 added 24.7.2018

			/*********************************** buttons ***********************************/
			'btnClose'  : 'Закрити',
			'btnSave'   : 'Зберегти',
			'btnRm'     : 'Вилучити',
			'btnApply'  : 'Застосувати',
			'btnCancel' : 'Скасувати',
			'btnNo'     : 'Ні',
			'btnYes'    : 'Так',
			'btnMount'  : 'Підключити',  // added 18.04.2012
			'btnApprove': 'Перейти в $1 і прийняти', // from v2.1 added 26.04.2012
			'btnUnmount': 'Відключити', // from v2.1 added 30.04.2012
			'btnConv'   : 'Конвертувати', // from v2.1 added 08.04.2014
			'btnCwd'    : 'Тут',      // from v2.1 added 22.5.2015
			'btnVolume' : 'Розділ',    // from v2.1 added 22.5.2015
			'btnAll'    : 'Всі',       // from v2.1 added 22.5.2015
			'btnMime'   : 'MIME тип', // from v2.1 added 22.5.2015
			'btnFileName':'Назва файла',  // from v2.1 added 22.5.2015
			'btnSaveClose': 'Зберегти і вийти', // from v2.1 added 12.6.2015
			'btnBackup' : 'Резервна копія', // fromv2.1 added 28.11.2015
			'btnRename'    : 'Перейменувати',      // from v2.1.24 added 6.4.2017
			'btnRenameAll' : 'Перейменуваті(Усі)', // from v2.1.24 added 6.4.2017
			'btnPrevious' : 'Попер. ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnNext'     : 'Наступ. ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnSaveAs'   : 'Зберегти як', // from v2.1.25 added 24.5.2017

			/******************************** notifications ********************************/
			'ntfopen'     : 'Відкрити теку',
			'ntffile'     : 'Відкрити файл',
			'ntfreload'   : 'Перечитати вміст теки',
			'ntfmkdir'    : 'Створення теки',
			'ntfmkfile'   : 'Створення файлів',
			'ntfrm'       : 'Вилучити файли',
			'ntfcopy'     : 'Копіювати файли',
			'ntfmove'     : 'Перенести файли',
			'ntfprepare'  : 'Підготовка до копіювання файлів',
			'ntfrename'   : 'Перейменувати файли',
			'ntfupload'   : 'Відвантажити файли',
			'ntfdownload' : 'Завантажити файли',
			'ntfsave'     : 'Записати файли',
			'ntfarchive'  : 'Створення архіву',
			'ntfextract'  : 'Розпаковування архіву',
			'ntfsearch'   : 'Пошук файлів',
			'ntfresize'   : 'Зміна розміру світлини',
			'ntfsmth'     : 'Виконуємо',
			'ntfloadimg'  : 'Завантаження зображення',
			'ntfnetmount' : 'Монтування мережевого диска', // added 18.04.2012
			'ntfnetunmount': 'Розмонтування мережевого диска', // from v2.1 added 30.04.2012
			'ntfdim'      : 'Визначення розміру світлини', // added 20.05.2013
			'ntfreaddir'  : 'Читання інформації директорії', // from v2.1 added 01.07.2013
			'ntfurl'      : 'отримання URL посилання', // from v2.1 added 11.03.2014
			'ntfchmod'    : 'Зміна прав файлу', // from v2.1 added 20.6.2015
			'ntfpreupload': 'Перевірка імені завантажуваного файла', // from v2.1 added 31.11.2015
			'ntfzipdl'    : 'Створення файлу для завантаження', // from v2.1.7 added 23.1.2016
			'ntfparents'  : 'Отримання інформації про шлях', // from v2.1.17 added 2.11.2016
			'ntfchunkmerge': 'Обробка вивантаженого файлу', // from v2.1.17 added 2.11.2016
			'ntftrash'    : 'Переміщуємо до смітника', // from v2.1.24 added 2.5.2017
			'ntfrestore'  : 'Відновлюємо зі смітника', // from v2.1.24 added 3.5.2017
			'ntfchkdir'   : 'Перевіряємо теку призначення', // from v2.1.24 added 3.5.2017
			'ntfundo'     : 'Скасування попередньої дії', // from v2.1.27 added 31.07.2017
			'ntfredo'     : 'Повторення раніше скасованої дії', // from v2.1.27 added 31.07.2017
			'ntfchkcontent' : 'Перевірка вмісту', // from v2.1.41 added 3.8.2018

			/*********************************** volumes *********************************/
			'volume_Trash' : 'Смітник', //from v2.1.24 added 29.4.2017

			/************************************ dates **********************************/
			'dateUnknown' : 'невідомо',
			'Today'       : 'сьогодні',
			'Yesterday'   : 'вчора',
			'msJan'       : 'Січ',
			'msFeb'       : 'Лют',
			'msMar'       : 'Бер',
			'msApr'       : 'Кві',
			'msMay'       : 'Тра',
			'msJun'       : 'Чер',
			'msJul'       : 'Лип',
			'msAug'       : 'Сер',
			'msSep'       : 'Вер',
			'msOct'       : 'Жов',
			'msNov'       : 'Лис',
			'msDec'       : 'Гру',
			'January'     : 'січня',
			'February'    : 'лютого',
			'March'       : 'березня',
			'April'       : 'квітня',
			'May'         : 'травня',
			'June'        : 'червня',
			'July'        : 'липня',
			'August'      : 'серпня',
			'September'   : 'вересня',
			'October'     : 'жовтня',
			'November'    : 'листопада',
			'December'    : 'грудня',
			'Sunday'      : 'Неділя',
			'Monday'      : 'Понеділок',
			'Tuesday'     : 'Вівторок',
			'Wednesday'   : 'Середа',
			'Thursday'    : 'Четвер',
			'Friday'      : 'П’ятниця',
			'Saturday'    : 'Субота',
			'Sun'         : 'Нд',
			'Mon'         : 'Пн',
			'Tue'         : 'Вт',
			'Wed'         : 'Ср',
			'Thu'         : 'Чт',
			'Fri'         : 'Пт',
			'Sat'         : 'Сб',

			/******************************** sort variants ********************************/
			'sortname'          : 'за назвою',
			'sortkind'          : 'за типом',
			'sortsize'          : 'за розміром',
			'sortdate'          : 'за датою',
			'sortFoldersFirst'  : 'Список тек',
			'sortperm'          : 'за дозволами', // from v2.1.13 added 13.06.2016
			'sortmode'          : 'за режимом',       // from v2.1.13 added 13.06.2016
			'sortowner'         : 'за власником',      // from v2.1.13 added 13.06.2016
			'sortgroup'         : 'за групою',      // from v2.1.13 added 13.06.2016
			'sortAlsoTreeview'  : 'Також вигляд дерева',  // from v2.1.15 added 01.08.2016

			/********************************** new items **********************************/
			'untitled file.txt' : 'неназваний файл.txt', // added 10.11.2015
			'untitled folder'   : 'неназвана тека',   // added 10.11.2015
			'Archive'           : 'НовийАрхів',  // from v2.1 added 10.11.2015
			'untitled file'     : 'НовийФайл.$1',  // from v2.1.41 added 6.8.2018
			'extentionfile'     : '$1: Файл',    // from v2.1.41 added 6.8.2018
			'extentiontype'     : '$1: $2 ',      // from v2.1.43 added 17.10.2018

			/********************************** messages **********************************/
			'confirmReq'      : 'Необхідне підтвердження',
			'confirmRm'       : 'Ви справді хочете вилучити файли?<br/>Операція незворотня!',
			'confirmRepl'     : 'Замінити старий файл новим? (при наявності тек вони будуть об\'єднані. Для резервної копії та заміни оберіть Резервну Копію)',
			'confirmRest'     : 'Замінити існуючий об\'єкт об\'єктом зі смітника?', // fromv2.1.24 added 5.5.2017
			'confirmConvUTF8' : 'Не у UTF-8<br/>Конвертувати у UTF-8?<br/>Вміст стане у UTF-8 збереженням після конвертації.', // from v2.1 added 08.04.2014
			'confirmNonUTF8'  : 'Кодування символів цього файлу неможливо визначити. Потрібно тимчасово конвертувати його у UTF-8 для редагування.<br/>Оберіть кодування цього файлу.', // from v2.1.19 added 28.11.2016
			'confirmNotSave'  : 'Було внесено зміни.<br/>Якщо ії не зберегти, їх буде втрачено.', // from v2.1 added 15.7.2015
			'confirmTrash'    : 'Ви точно бажаєте перемістити ці об\'єкти до смітника?', //from v2.1.24 added 29.4.2017
			'confirmMove'     : 'Ви точно бажаєте перемістити об\'єкти до "$1"?', //from v2.1.50 added 27.7.2019
			'apllyAll'        : 'Застосувати до всіх',
			'name'            : 'Назва',
			'size'            : 'Розмір',
			'perms'           : 'Доступи',
			'modify'          : 'Змінено',
			'kind'            : 'Тип',
			'read'            : 'читання',
			'write'           : 'запис',
			'noaccess'        : 'недоступно',
			'and'             : 'і',
			'unknown'         : 'невідомо',
			'selectall'       : 'Вибрати всі файли',
			'selectfiles'     : 'Вибрати файл(и)',
			'selectffile'     : 'Вибрати перший файл',
			'selectlfile'     : 'Вибрати останній файл',
			'viewlist'        : 'Списком',
			'viewicons'       : 'Значками',
			'viewSmall'       : 'Маленькі значки', // from v2.1.39 added 22.5.2018
			'viewMedium'      : 'Середні значки', // from v2.1.39 added 22.5.2018
			'viewLarge'       : 'Великі значки', // from v2.1.39 added 22.5.2018
			'viewExtraLarge'  : 'Дуже великі значки', // from v2.1.39 added 22.5.2018
			'places'          : 'Розташування',
			'calc'            : 'Вирахувати',
			'path'            : 'Шлях',
			'aliasfor'        : 'Аліас для',
			'locked'          : 'Заблоковано',
			'dim'             : 'Розміри',
			'files'           : 'Файли',
			'folders'         : 'теки',
			'items'           : 'Елементи',
			'yes'             : 'так',
			'no'              : 'ні',
			'link'            : 'Посилання',
			'searcresult'     : 'Результати пошуку',
			'selected'        : 'Вибрані елементи',
			'about'           : 'Про',
			'shortcuts'       : 'Ярлики',
			'help'            : 'Допомога',
			'webfm'           : 'Web-менеджер файлів',
			'ver'             : 'Версія',
			'protocolver'     : 'версія протоколу',
			'homepage'        : 'Сторінка проекту',
			'docs'            : 'Документація',
			'github'          : 'Fork us on Github',
			'twitter'         : 'Слідкуйте у Твітері',
			'facebook'        : 'Приєднуйтесь у фейсбуці',
			'team'            : 'Автори',
			'chiefdev'        : 'головний розробник',
			'developer'       : 'розробник',
			'contributor'     : 'учасник',
			'maintainer'      : 'супроводжувач',
			'translator'      : 'перекладач',
			'icons'           : 'Значки',
			'dontforget'      : 'і не забудьте рушничок',
			'shortcutsof'     : 'Створення посилань вимкнено',
			'dropFiles'       : 'Кидайте файли сюди',
			'or'              : 'або',
			'selectForUpload' : 'Виберіть файли для відвантаження',
			'moveFiles'       : 'Перемістити файли',
			'copyFiles'       : 'Копіювати файли',
			'restoreFiles'    : 'Відновити об\'єкти', // from v2.1.24 added 5.5.2017
			'rmFromPlaces'    : 'Вилучити з розташувань',
			'aspectRatio'     : 'Співвідношення',
			'scale'           : 'Масштаб',
			'width'           : 'Ширина',
			'height'          : 'Висота',
			'resize'          : 'Змінити розмір',
			'crop'            : 'Обрізати',
			'rotate'          : 'Повернути',
			'rotate-cw'       : 'Повернути на 90 градусів за год. стр.',
			'rotate-ccw'      : 'Повернути на 90 градусів проти год. стр.',
			'degree'          : 'Градус',
			'netMountDialogTitle' : 'Змонтувати носій у мережі', // added 18.04.2012
			'protocol'            : 'версія протоколу', // added 18.04.2012
			'host'                : 'Хост', // added 18.04.2012
			'port'                : 'Порт', // added 18.04.2012
			'user'                : 'Логін', // added 18.04.2012
			'pass'                : 'Пароль', // added 18.04.2012
			'confirmUnmount'      : 'Ви відмонтовуєте $1?',  // from v2.1 added 30.04.2012
			'dropFilesBrowser': 'Перетягніть або вставте файли з оглядача', // from v2.1 added 30.05.2012
			'dropPasteFiles'  : 'Перетягніть файли, Вставте URL або світлини (з буфера обміну) сюди', // from v2.1 added 07.04.2014
			'encoding'        : 'Кодування', // from v2.1 added 19.12.2014
			'locale'          : 'Локаль',   // from v2.1 added 19.12.2014
			'searchTarget'    : 'Призначення: $1',                // from v2.1 added 22.5.2015
			'searchMime'      : 'Пошук за введеним типом MIME', // from v2.1 added 22.5.2015
			'owner'           : 'Власник', // from v2.1 added 20.6.2015
			'group'           : 'Група', // from v2.1 added 20.6.2015
			'other'           : 'Інші', // from v2.1 added 20.6.2015
			'execute'         : 'Виконання', // from v2.1 added 20.6.2015
			'perm'            : 'Дозвіл', // from v2.1 added 20.6.2015
			'mode'            : 'Режим', // from v2.1 added 20.6.2015
			'emptyFolder'     : 'Тека порожня', // from v2.1.6 added 30.12.2015
			'emptyFolderDrop' : 'Тека порожня\\A Перетягніть об\'єкти для додавання', // from v2.1.6 added 30.12.2015
			'emptyFolderLTap' : 'Тека порожня\\A Для додавання об\'єктів торкніть та утримуйте', // from v2.1.6 added 30.12.2015
			'quality'         : 'Якість', // from v2.1.6 added 5.1.2016
			'autoSync'        : 'Авто синх.',  // from v2.1.6 added 10.1.2016
			'moveUp'          : 'Пересунути вгору',  // from v2.1.6 added 18.1.2016
			'getLink'         : 'Отримати URL', // from v2.1.7 added 9.2.2016
			'selectedItems'   : 'Обрані об\'єкти ($1)', // from v2.1.7 added 2.19.2016
			'folderId'        : 'ID теки', // from v2.1.10 added 3.25.2016
			'offlineAccess'   : 'Дозволити доступ офлайн', // from v2.1.10 added 3.25.2016
			'reAuth'          : 'Для реаутентифікації', // from v2.1.10 added 3.25.2016
			'nowLoading'      : 'Зараз завантажуємо...', // from v2.1.12 added 4.26.2016
			'openMulti'       : 'Відкрити декілька файлів', // from v2.1.12 added 5.14.2016
			'openMultiConfirm': 'Ви намагаєтесь відкрити $1 файлів. Ви впевнені що хочете відкрити ії у оглядачі?', // from v2.1.12 added 5.14.2016
			'emptySearch'     : 'Пошук не дав результатів у обраному місці.', // from v2.1.12 added 5.16.2016
			'editingFile'     : 'Редагує файл.', // from v2.1.13 added 6.3.2016
			'hasSelected'     : 'Ви обрали $1 об\'єктів.', // from v2.1.13 added 6.3.2016
			'hasClipboard'    : 'У вас є $1 об\'єктів у буфері обміну.', // from v2.1.13 added 6.3.2016
			'incSearchOnly'   : 'Інкрементний пошук є тільки для поточного перегляду.', // from v2.1.13 added 6.30.2016
			'reinstate'       : 'Відновити', // from v2.1.15 added 3.8.2016
			'complete'        : '$1 виконано', // from v2.1.15 added 21.8.2016
			'contextmenu'     : 'Контекстне меню', // from v2.1.15 added 9.9.2016
			'pageTurning'     : 'Обертання сторінки', // from v2.1.15 added 10.9.2016
			'volumeRoots'     : 'Кореневі теки носіїв', // from v2.1.16 added 16.9.2016
			'reset'           : 'Обнулити', // from v2.1.16 added 1.10.2016
			'bgcolor'         : 'Колір фону', // from v2.1.16 added 1.10.2016
			'colorPicker'     : 'Обрати колір', // from v2.1.16 added 1.10.2016
			'8pxgrid'         : 'сітка 8px', // from v2.1.16 added 4.10.2016
			'enabled'         : 'Увімкнено', // from v2.1.16 added 4.10.2016
			'disabled'        : 'Вимкнено', // from v2.1.16 added 4.10.2016
			'emptyIncSearch'  : 'Результати пошуку у поточному перегляді відсутні.\\AНатисніть [Enter] для розширення критеріїв пошуку.', // from v2.1.16 added 5.10.2016
			'emptyLetSearch'  : 'Результати пошуку за першою літерою відсутні у поточному перегляді.', // from v2.1.23 added 24.3.2017
			'textLabel'       : 'Текстова мітка', // from v2.1.17 added 13.10.2016
			'minsLeft'        : '$1 хв. залишилось', // from v2.1.17 added 13.11.2016
			'openAsEncoding'  : 'Відкрити знову з обраним кодуванням', // from v2.1.19 added 2.12.2016
			'saveAsEncoding'  : 'Зберегти з обраним кодуванням', // from v2.1.19 added 2.12.2016
			'selectFolder'    : 'Обрати теку', // from v2.1.20 added 13.12.2016
			'firstLetterSearch': 'Пошук за першою літерою', // from v2.1.23 added 24.3.2017
			'presets'         : 'Шаблони', // from v2.1.25 added 26.5.2017
			'tooManyToTrash'  : 'Дуже багато об\'єктів для переміщення у смітник.', // from v2.1.25 added 9.6.2017
			'TextArea'        : 'ТекстовеПоле', // from v2.1.25 added 14.6.2017
			'folderToEmpty'   : 'Спорожнити теку "$1".', // from v2.1.25 added 22.6.2017
			'filderIsEmpty'   : 'Тека "$1" порожня.', // from v2.1.25 added 22.6.2017
			'preference'      : 'Налаштування', // from v2.1.26 added 28.6.2017
			'language'        : 'Мова', // from v2.1.26 added 28.6.2017
			'clearBrowserData': 'Ініціювати налаштування збережені у цьому оглядачі', // from v2.1.26 added 28.6.2017
			'toolbarPref'     : 'Налаштування лотку інструментів', // from v2.1.27 added 2.8.2017
			'charsLeft'       : '... $1 символів залишилось.',  // from v2.1.29 added 30.8.2017
			'linesLeft'       : '... $1 рядків залишилось.',  // from v2.1.52 added 16.1.2020
			'sum'             : 'Сума', // from v2.1.29 added 28.9.2017
			'roughFileSize'   : 'Приблизний розмір файу', // from v2.1.30 added 2.11.2017
			'autoFocusDialog' : 'Фокусувати елемент діалога при наведенні курсора миші',  // from v2.1.30 added 2.11.2017
			'select'          : 'Обрати', // from v2.1.30 added 23.11.2017
			'selectAction'    : 'Дія при виборі файла', // from v2.1.30 added 23.11.2017
			'useStoredEditor' : 'Відкрити редактором, що використовувався крайній раз.', // from v2.1.30 added 23.11.2017
			'selectinvert'    : 'Інвертувати вибір', // from v2.1.30 added 25.11.2017
			'renameMultiple'  : 'Ви точно хочете перейменувати $1 обраних об\'єктів на кшталт $2?<br/>Це незворотна дія!', // from v2.1.31 added 4.12.2017
			'batchRename'     : 'Пакетне перейменування', // from v2.1.31 added 8.12.2017
			'plusNumber'      : '+ Число', // from v2.1.31 added 8.12.2017
			'asPrefix'        : 'Додати префікс', // from v2.1.31 added 8.12.2017
			'asSuffix'        : 'Додати суфікс', // from v2.1.31 added 8.12.2017
			'changeExtention' : 'Змінити розширення', // from v2.1.31 added 8.12.2017
			'columnPref'      : 'Налаштування стовпчиків (вигляд списку)', // from v2.1.32 added 6.2.2018
			'reflectOnImmediate' : 'Усі зміни будуть негайно застосовані у архіві.', // from v2.1.33 added 2.3.2018
			'reflectOnUnmount'   : 'Деякі зміни не буде видно до розмонтування носія.', // from v2.1.33 added 2.3.2018
			'unmountChildren' : 'Наступний(і) носій(ї) на цьому носії також не змонтовані. Ви точно хочете відмонтувати носій?', // from v2.1.33 added 5.3.2018
			'selectionInfo'   : 'Інформація про обране', // from v2.1.33 added 7.3.2018
			'hashChecker'     : 'Алгоритми для показу хешу файла', // from v2.1.33 added 10.3.2018
			'infoItems'       : 'Інформаційні об\'єкти (Панель інформації про обране)', // from v2.1.38 added 28.3.2018
			'pressAgainToExit': 'Натисніть знову для виходу.', // from v2.1.38 added 1.4.2018
			'toolbar'         : 'Панель інструментів', // from v2.1.38 added 4.4.2018
			'workspace'       : 'Робочий простір', // from v2.1.38 added 4.4.2018
			'dialog'          : 'Діалог', // from v2.1.38 added 4.4.2018
			'all'             : 'Усі', // from v2.1.38 added 4.4.2018
			'iconSize'        : 'Розмір значків (вигляд значків)', // from v2.1.39 added 7.5.2018
			'editorMaximized' : 'Відкрити розгорнуте вікно редактора', // from v2.1.40 added 30.6.2018
			'editorConvNoApi' : 'Через неможливість конвертування API, сконвертуйте на вебсайті.', //from v2.1.40 added 8.7.2018
			'editorConvNeedUpload' : 'Після конвертування вам треба завантажити за допомогою URL або збереженого файу, для збереження конвертованого файлу.', //from v2.1.40 added 8.7.2018
			'convertOn'       : 'Конвертувати сайт з $1', // from v2.1.40 added 10.7.2018
			'integrations'    : 'Інтеграції', // from v2.1.40 added 11.7.2018
			'integrationWith' : 'Цей elFinder має наступні інтегровані сервіси. Перевірте умови використання, політику приватності та інше перед використанням.', // from v2.1.40 added 11.7.2018
			'showHidden'      : 'Показати приховані об\'єкти', // from v2.1.41 added 24.7.2018
			'hideHidden'      : 'Сховати приховані об\'єкти', // from v2.1.41 added 24.7.2018
			'toggleHidden'    : 'Показати/Сховати приховані о\'єкти', // from v2.1.41 added 24.7.2018
			'makefileTypes'   : 'Типи файлів, які можна створювати', // from v2.1.41 added 7.8.2018
			'typeOfTextfile'  : 'Тип текстового файлу', // from v2.1.41 added 7.8.2018
			'add'             : 'Додати', // from v2.1.41 added 7.8.2018
			'theme'           : 'Тема', // from v2.1.43 added 19.10.2018
			'default'         : 'Як зазвичай', // from v2.1.43 added 19.10.2018
			'description'     : 'Опис', // from v2.1.43 added 19.10.2018
			'website'         : 'Веб-сайт', // from v2.1.43 added 19.10.2018
			'author'          : 'Автор', // from v2.1.43 added 19.10.2018
			'email'           : 'E-mail', // from v2.1.43 added 19.10.2018
			'license'         : 'Ліцензія', // from v2.1.43 added 19.10.2018
			'exportToSave'    : 'Об\'єкт неможливо зберегти. Щоб уникнути втрати правок вам треба експортувати ії до себе у пристрій.', // from v2.1.44 added 1.12.2018
			'dblclickToSelect': 'Двічі клацніть файл для вибору.', // from v2.1.47 added 22.1.2019
			'useFullscreen'   : 'Використовувати повноекранний режим', // from v2.1.47 added 19.2.2019

			/********************************** mimetypes **********************************/
			'kindUnknown'     : 'Невідомо',
			'kindRoot'        : 'Коренева тека носія', // from v2.1.16 added 16.10.2016
			'kindFolder'      : 'Папка',
			'kindSelects'     : 'Вибір', // from v2.1.29 added 29.8.2017
			'kindAlias'       : 'Аліас',
			'kindAliasBroken' : 'Пошкоджений аліас',
			// applications
			'kindApp'         : 'Програма',
			'kindPostscript'  : 'Документ Postscript',
			'kindMsOffice'    : 'Документ Microsoft Office',
			'kindMsWord'      : 'Документ Microsoft Word',
			'kindMsExcel'     : 'Документ Microsoft Excel',
			'kindMsPP'        : 'Презентація Microsoft Powerpoint',
			'kindOO'          : 'Документ Open Office',
			'kindAppFlash'    : 'Flash-додаток',
			'kindPDF'         : 'Портативний формат документів (PDF)',
			'kindTorrent'     : 'Файл Bittorrent',
			'kind7z'          : 'Архів 7z',
			'kindTAR'         : 'Архів TAR',
			'kindGZIP'        : 'Архів GZIP',
			'kindBZIP'        : 'Архів BZIP',
			'kindXZ'          : 'Архів XZ',
			'kindZIP'         : 'Архів ZIP',
			'kindRAR'         : 'Архів RAR',
			'kindJAR'         : 'Файл Java JAR',
			'kindTTF'         : 'Шрифт True Type',
			'kindOTF'         : 'Шрифт Open Type',
			'kindRPM'         : 'Пакунок RPM',
			// texts
			'kindText'        : 'Текстовий документ',
			'kindTextPlain'   : 'Простий текст',
			'kindPHP'         : 'Код PHP',
			'kindCSS'         : 'Каскадна таблиця стилів (CSS)',
			'kindHTML'        : 'Документ HTML',
			'kindJS'          : 'Код Javascript',
			'kindRTF'         : 'Файл RTF',
			'kindC'           : 'Код C',
			'kindCHeader'     : 'Заголовковий код C',
			'kindCPP'         : 'Код C++',
			'kindCPPHeader'   : 'Заголовковий код C++',
			'kindShell'       : 'Скрипт Unix shell',
			'kindPython'      : 'Код Python',
			'kindJava'        : 'Код Java',
			'kindRuby'        : 'Код Ruby',
			'kindPerl'        : 'Код Perl',
			'kindSQL'         : 'Код SQL',
			'kindXML'         : 'Документ XML',
			'kindAWK'         : 'Код AWK',
			'kindCSV'         : 'Значення розділені комою (CSV)',
			'kindDOCBOOK'     : 'Документ Docbook XML',
			'kindMarkdown'    : 'Текст Markdown', // added 20.7.2015
			// images
			'kindImage'       : 'Зображення',
			'kindBMP'         : 'Зображення BMP',
			'kindJPEG'        : 'Зображення JPEG',
			'kindGIF'         : 'Зображення GIF',
			'kindPNG'         : 'Зображення PNG',
			'kindTIFF'        : 'Зображення TIFF',
			'kindTGA'         : 'Зображення TGA',
			'kindPSD'         : 'Зображення Adobe Photoshop',
			'kindXBITMAP'     : 'Зображення X bitmap',
			'kindPXM'         : 'Зображення Pixelmator',
			// media
			'kindAudio'       : 'Аудіо',
			'kindAudioMPEG'   : 'Аудіо MPEG',
			'kindAudioMPEG4'  : 'Аудіо MPEG-4',
			'kindAudioMIDI'   : 'Аудіо MIDI',
			'kindAudioOGG'    : 'Аудіо Ogg Vorbis',
			'kindAudioWAV'    : 'Аудіо WAV',
			'AudioPlaylist'   : 'Список відтворення MP3',
			'kindVideo'       : 'Відео',
			'kindVideoDV'     : 'Відео DV',
			'kindVideoMPEG'   : 'Відео MPEG',
			'kindVideoMPEG4'  : 'Відео MPEG-4',
			'kindVideoAVI'    : 'Відео AVI',
			'kindVideoMOV'    : 'Відео Quick Time',
			'kindVideoWM'     : 'Відео Windows Media',
			'kindVideoFlash'  : 'Відео Flash',
			'kindVideoMKV'    : 'Відео Matroska',
			'kindVideoOGG'    : 'Відео Ogg'
		}
	};
}));

js/i18n/elfinder.bg.js000064400000124076151215013360010463 0ustar00/**
 * Bulgarian translation
 * @author Stamo Petkov <stamo.petkov@gmail.com>
 * @author Nikolay Petkov <office@cmstory.com>
 * @version 2022-02-25
 */
 (function(root, factory) {
	if (typeof define === 'function' && define.amd) {
		define(['elfinder'], factory);
	} else if (typeof exports !== 'undefined') {
		module.exports = factory(require('elfinder'));
	} else {
		factory(root.elFinder);
	}
}(this, function(elFinder) {
	elFinder.prototype.i18.bg = {
		translator : 'Stamo Petkov &lt;stamo.petkov@gmail.com&gt;, Nikolay Petkov &lt;office@cmstory.com&gt;',
		language   : 'Bulgarian',
		direction  : 'ltr',
		dateFormat : 'd.m.Y H:i', // will show like: 25.02.2022 18:31
		fancyDateFormat : '$1 H:i', // will show like: днес 18:31
		nonameDateFormat : 'Ymd-His', // noname upload will show like: 20220225-183105
		messages   : {
			'getShareText' : 'Сподели',
			'Editor ': 'Редактор на кодове',
			/********************************** errors **********************************/
			'error'                : 'Грешка',
			'errUnknown'           : 'Непозната грешка.',
			'errUnknownCmd'        : 'Непозната команда.',
			'errJqui'              : 'Грешна конфигурация на jQuery UI. Компонентите selectable, draggable и droppable трябва да са включени.',
			'errNode'              : 'elFinder изисква да бъде създаден DOM елемент.',
			'errURL'               : 'Грешка в настройките на elFinder! не е зададена стойност на URL.',
			'errAccess'            : 'Достъп отказан.',
			'errConnect'           : 'Няма връзка със сървъра.',
			'errAbort'             : 'Връзката е прекъсната.',
			'errTimeout'           : 'Просрочена връзка.',
			'errNotFound'          : 'Сървърът не е намерен.',
			'errResponse'          : 'Грешен отговор от сървъра.',
			'errConf'              : 'Грешни настройки на сървъра.',
			'errJSON'              : 'Не е инсталиран модул на PHP за JSON.',
			'errNoVolumes'         : 'Няма дялове достъпни за четене.',
			'errCmdParams'         : 'Грешни параметри на командата "$1".',
			'errDataNotJSON'       : 'Данните не са JSON.',
			'errDataEmpty'         : 'Липсват данни.',
			'errCmdReq'            : 'Запитването от сървъра изисква име на команда.',
			'errOpen'              : 'Неуспешно отваряне на "$1".',
			'errNotFolder'         : 'Обектът не е папка.',
			'errNotFile'           : 'Обектът не е файл.',
			'errRead'              : 'Неуспешно прочитане на "$1".',
			'errWrite'             : 'Неуспешен запис в "$1".',
			'errPerm'              : 'Разрешение отказано.',
			'errLocked'            : '"$1" е заключен и не може да бъде преименуван, местен или премахван.',
			'errExists'            : 'Вече съществува файл с име "$1"',
			'errInvName'           : 'Грешно име на файл.',
			'errInvDirname'        : 'Невалидно име на папка.',  // from v2.1.24 added 12.4.2017
			'errFolderNotFound'    : 'Папката не е открита.',
			'errFileNotFound'      : 'Файлът не е открит.',
			'errTrgFolderNotFound' : 'Целевата папка "$1" не е намерена.',
			'errPopup'             : 'Браузъра блокира отварянето на прозорец. За да отворите файла, разрешете отварянето в настройките на браузъра.',
			'errMkdir'             : 'Неуспешно създаване на папка "$1".',
			'errMkfile'            : 'Неуспешно създаване на файл "$1".',
			'errRename'            : 'Неуспешно преименуване на "$1".',
			'errCopyFrom'          : 'Копирането на файлове от том "$1" не е разрешено.',
			'errCopyTo'            : 'Копирането на файлове в том "$1" не е разрешено.',
			'errMkOutLink'         : 'Неуспех при създаване на връзка извън началото на ресурса.', // from v2.1 added 03.10.2015
			'errUpload'            : 'Грешка при качване.',  // old name - errUploadCommon
			'errUploadFile'        : 'Неуспешно качване на "$1".', // old name - errUpload
			'errUploadNoFiles'     : 'Не са намерени файлове за качване.',
			'errUploadTotalSize'   : 'Данните превишават максимално допостумия размер.', // old name - errMaxSize
			'errUploadFileSize'    : 'Файлът превишава максимално допустимия размер.', //  old name - errFileMaxSize
			'errUploadMime'        : 'Непозволен тип на файла.',
			'errUploadTransfer'    : '"$1" грешка при предаване.',
			'errUploadTemp'        : 'Неуспешно създаване на временен файл за качване.', // from v2.1 added 26.09.2015
			'errNotReplace'        : 'Обект "$1" вече съществува на това място и не може да бъде заменен от обект от друг тип.', // new
			'errReplace'           : 'Не може да се замени "$1".',
			'errSave'              : 'Не може да се запише "$1".',
			'errCopy'              : 'Не може да се копира "$1".',
			'errMove'              : 'Не може да се премести "$1".',
			'errCopyInItself'      : 'Не може да се копира "$1" върху самия него.',
			'errRm'                : 'Не може да се премахне "$1".',
			'errTrash'             : 'Не може да се премести в кошчето', // from v2.1.24 added 30.4.2017
			'errRmSrc'             : 'Не може да се премахне изходния файл(ове).',
			'errExtract'           : 'Не може да се извлекат файловете от "$1".',
			'errArchive'           : 'Не може да се създаде архив.',
			'errArcType'           : 'Неподдържан тип на архива.',
			'errNoArchive'         : 'Файлът не е архив или е от неподдържан тип.',
			'errCmdNoSupport'      : 'Сървъра не поддържа тази команда.',
			'errReplByChild'       : 'Папката “$1” не може да бъде заменена от съдържащ се в нея елемент.',
			'errArcSymlinks'       : 'От съображения за сигурност няма да бъдат разопаковани архиви съдържащи symlinks.', // edited 24.06.2012
			'errArcMaxSize'        : 'Архивните файлове превишават максимално допустимия размер.',
			'errResize'            : 'Не може да се преоразмери "$1".',
			'errResizeDegree'      : 'Невалиден градус за ротация.',  // added 7.3.2013
			'errResizeRotate'      : 'Изображението не е ротирано.',  // added 7.3.2013
			'errResizeSize'        : 'Невалиден размер на изображение.',  // added 7.3.2013
			'errResizeNoChange'    : 'Размерът на изображението не е променен.',  // added 7.3.2013
			'errUsupportType'      : 'Неподдържан тип на файл.',
			'errNotUTF8Content'    : 'Файл "$1" не е в UTF-8 формат и не може да бъде редактиран.',  // added 9.11.2011
			'errNetMount'          : 'Не може да се монтира "$1".', // added 17.04.2012
			'errNetMountNoDriver'  : 'Неподдържан протокол.',     // added 17.04.2012
			'errNetMountFailed'    : 'Монтирането не е успешно.',         // added 17.04.2012
			'errNetMountHostReq'   : 'Хост се изисква.', // added 18.04.2012
			'errSessionExpires'    : 'Сесията ви изтече поради липса на активност.',
			'errCreatingTempDir'   : 'Не може да се създаде временна директория: "$1"',
			'errFtpDownloadFile'   : 'Не може да се изтегли файл от FTP: "$1"',
			'errFtpUploadFile'     : 'Не може да се качи файл на FTP: "$1"',
			'errFtpMkdir'          : 'Не може да се създаде директория на FTP: "$1"',
			'errArchiveExec'       : 'Грешка при архивиране на файлове: "$1"',
			'errExtractExec'       : 'Грешка при разархивиране на файлове: "$1"',
			'errNetUnMount'        : 'Не може да се размонтира', // from v2.1 added 30.04.2012
			'errConvUTF8'          : 'Не е конвертируем до UTF-8', // from v2.1 added 08.04.2014
			'errFolderUpload'      : 'Опитайте Google Chrome, ако искате да качите папка.', // from v2.1 added 26.6.2015
			'errSearchTimeout'     : 'Времето изтече при търсенето на "$1". Резултатът от търсенето е частичен.', // from v2.1 added 12.1.2016
			'errReauthRequire'     : 'Необходимо е повторно оторизиране.', // from v2.1.10 added 24.3.2016
			'errMaxTargets'        : 'Максималният брой избрани файлове е $ 1.', // from v2.1.17 added 17.10.2016
			'errRestore'           : 'Не може да се възстанови от кошчето. Не може да се определи местоположението за възстановяване.', // from v2.1.24 added 3.5.2017
			'errEditorNotFound'    : 'Не е намерен редактор за този тип файл.', // from v2.1.25 added 23.5.2017
			'errServerError'       : 'Възникна грешка на сървъра.', // from v2.1.25 added 16.6.2017
			'errEmpty'             : 'Папката "$1" не може да се изпразни.', // from v2.1.25 added 22.6.2017
			'moreErrors'           : 'Има още $1 грешки.', // from v2.1.44 added 9.12.2018
			'errMaxMkdirs'         : 'Можете да създадете до $1 папки наведнъж.', // from v2.1.58 added 20.6.2021

			/******************************* commands names ********************************/
			'cmdarchive'   : 'Създай архив',
			'cmdback'      : 'Назад',
			'cmdcopy'      : 'Копирай',
			'cmdcut'       : 'Изрежи',
			'cmddownload'  : 'Свали',
			'cmdduplicate' : 'Дублирай',
			'cmdedit'      : 'Редактирай файл',
			'cmdextract'   : 'Извлечи файловете от архива',
			'cmdforward'   : 'Напред',
			'cmdgetfile'   : 'Избери файлове',
			'cmdhelp'      : 'За тази програма',
			'cmdhome'      : 'Начало',
			'cmdinfo'      : 'Получете информация и споделете',
			'cmdmkdir'     : 'Нова папка',
			'cmdmkdirin'   : 'В нова папка', // from v2.1.7 added 19.2.2016
			'cmdmkfile'    : 'Нов файл',
			'cmdopen'      : 'Отвори',
			'cmdpaste'     : 'Вмъкни',
			'cmdquicklook' : 'Преглед',
			'cmdreload'    : 'Презареди',
			'cmdrename'    : 'Преименувай',
			'cmdrm'        : 'Изтрий',
			'cmdtrash'     : 'В кошчето', //from v2.1.24 added 29.4.2017
			'cmdrestore'   : 'Възстанови', //from v2.1.24 added 3.5.2017
			'cmdsearch'    : 'Намери файлове',
			'cmdup'        : 'Една директория нагоре',
			'cmdupload'    : 'Качи файлове',
			'cmdview'      : 'Виж',
			'cmdresize'    : 'Промени изображение',
			'cmdsort'      : 'Подреди',
			'cmdnetmount'  : 'Монтирай мрежов ресурс', // added 18.04.2012
			'cmdnetunmount': 'Размонтирай', // from v2.1 added 30.04.2012
			'cmdplaces'    : 'Към избрани', // added 28.12.2014
			'cmdchmod'     : 'Промяна на вид', // from v2.1 added 20.6.2015
			'cmdopendir'   : 'Отвори папка', // from v2.1 added 13.1.2016
			'cmdcolwidth'  : 'Нулирай ширината на колоната', // from v2.1.13 added 12.06.2016
			'cmdfullscreen': 'Цял екран', // from v2.1.15 added 03.08.2016
			'cmdmove'      : 'Премести', // from v2.1.15 added 21.08.2016
			'cmdempty'     : 'Изпразни папката', // from v2.1.25 added 22.06.2017
			'cmdundo'      : 'Отмени', // from v2.1.27 added 31.07.2017
			'cmdredo'      : 'Преправи', // from v2.1.27 added 31.07.2017
			'cmdpreference': 'Настройки', // from v2.1.27 added 03.08.2017
			'cmdselectall' : 'Избери всичко', // from v2.1.28 added 15.08.2017
			'cmdselectnone': 'Избери нищо', // from v2.1.28 added 15.08.2017
			'cmdselectinvert': 'Обърни селекцията', // from v2.1.28 added 15.08.2017
			'cmdopennew'   : 'Отвори в нов прозорец', // from v2.1.38 added 3.4.2018
			'cmdhide'      : 'Скрий (лично)', // from v2.1.41 added 24.7.2018

			/*********************************** buttons ***********************************/
			'btnClose'  : 'Затвори',
			'btnSave'   : 'Запиши',
			'btnRm'     : 'Премахни',
			'btnApply'  : 'Приложи',
			'btnCancel' : 'Отказ',
			'btnNo'     : 'Не',
			'btnYes'    : 'Да',
			'btnMount'  : 'Монтирай',  // added 18.04.2012
			'btnApprove': 'Отиди на $1 и одобри', // from v2.1 added 26.04.2012
			'btnUnmount': 'Размонтирай', // from v2.1 added 30.04.2012
			'btnConv'   : 'Конвертирай', // from v2.1 added 08.04.2014
			'btnCwd'    : 'Тук',      // from v2.1 added 22.5.2015
			'btnVolume' : 'Ресурс',    // from v2.1 added 22.5.2015
			'btnAll'    : 'Всички',       // from v2.1 added 22.5.2015
			'btnMime'   : 'MIME тип', // from v2.1 added 22.5.2015
			'btnFileName':'Име',  // from v2.1 added 22.5.2015
			'btnSaveClose': 'Запази и затвори', // from v2.1 added 12.6.2015
			'btnBackup' : 'Архивирай', // fromv2.1 added 28.11.2015
			'btnRename'    : 'Преименувай',      // from v2.1.24 added 6.4.2017
			'btnRenameAll' : 'Преименувай(Всички)', // from v2.1.24 added 6.4.2017
			'btnPrevious' : 'Пред ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnNext'     : 'След ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnSaveAs'   : 'Запази като', // from v2.1.25 added 24.5.2017

			/******************************** notifications ********************************/
			'ntfopen'     : 'Отваряне на папка',
			'ntffile'     : 'Отваряне на файл',
			'ntfreload'   : 'Презареждане съдържанието на папка',
			'ntfmkdir'    : 'Създава се директория',
			'ntfmkfile'   : 'Създава се файл',
			'ntfrm'       : 'Изтриване на файлове',
			'ntfcopy'     : 'Копиране на файлове',
			'ntfmove'     : 'Преместване на файлове',
			'ntfprepare'  : 'Подготовка за копиране на файлове',
			'ntfrename'   : 'Преименуване на файлове',
			'ntfupload'   : 'Качват се файлове',
			'ntfdownload' : 'Свалят се файлове',
			'ntfsave'     : 'Запис на файлове',
			'ntfarchive'  : 'Създава се архив',
			'ntfextract'  : 'Извличат се файловете от архив',
			'ntfsearch'   : 'Търсят се файлове',
			'ntfresize'   : 'Преоразмеряват се изображения',
			'ntfsmth'     : 'Зает съм >_<',
			'ntfloadimg'  : 'Зареждат се изображения',
			'ntfnetmount' : 'Монтира се мрежов ресурс', // added 18.04.2012
			'ntfnetunmount': 'Размонтира се мрежов ресурс', // from v2.1 added 30.04.2012
			'ntfdim'      : 'Извличат се размерите на изображение', // added 20.05.2013
			'ntfreaddir'  : 'Извлича се информация за папка', // from v2.1 added 01.07.2013
			'ntfurl'      : 'Взима се URL от връзка', // from v2.1 added 11.03.2014
			'ntfchmod'    : 'Променя се вида на файл', // from v2.1 added 20.6.2015
			'ntfpreupload': 'Проверка на името на файла за качване', // from v2.1 added 31.11.2015
			'ntfzipdl'    : 'Създаване на файл за изтегляне', // from v2.1.7 added 23.1.2016
			'ntfparents'  : 'Получава се информация за пътя', // from v2.1.17 added 2.11.2016
			'ntfchunkmerge': 'Обработка на качения файл', // from v2.1.17 added 2.11.2016
			'ntftrash'    : 'Прехвърлят се позиции в кошчето', // from v2.1.24 added 2.5.2017
			'ntfrestore'  : 'Извършва се възстановяване от кошчето', // from v2.1.24 added 3.5.2017
			'ntfchkdir'   : 'Проверка на целевата папка', // from v2.1.24 added 3.5.2017
			'ntfundo'     : 'Отмяна на предишната операция', // from v2.1.27 added 31.07.2017
			'ntfredo'     : 'Възстановяване на предходните отменени', // from v2.1.27 added 31.07.2017
			'ntfchkcontent' : 'Проверка на съдържанието', // from v2.1.41 added 3.8.2018

			/*********************************** volumes *********************************/
			'volume_Trash' : 'Кошче', //from v2.1.24 added 29.4.2017

			/************************************ dates **********************************/
			'dateUnknown' : 'неизвестна',
			'Today'       : 'днес',
			'Yesterday'   : 'вчера',
			'msJan'       : 'яну',
			'msFeb'       : 'фев',
			'msMar'       : 'мар',
			'msApr'       : 'апр',
			'msMay'       : 'май',
			'msJun'       : 'юни',
			'msJul'       : 'юли',
			'msAug'       : 'авг',
			'msSep'       : 'сеп',
			'msOct'       : 'окт',
			'msNov'       : 'ное',
			'msDec'       : 'дек',
			'January'     : 'януари',
			'February'    : 'февруари',
			'March'       : 'март',
			'April'       : 'април',
			'May'         : 'май',
			'June'        : 'юни',
			'July'        : 'юли',
			'August'      : 'август',
			'September'   : 'септември',
			'October'     : 'октомври',
			'November'    : 'ноември',
			'December'    : 'декември',
			'Sunday'      : 'неделя',
			'Monday'      : 'понеделник',
			'Tuesday'     : 'вторник',
			'Wednesday'   : 'сряда',
			'Thursday'    : 'четвъртък',
			'Friday'      : 'петък',
			'Saturday'    : 'събота',
			'Sun'         : 'нед',
			'Mon'         : 'пон',
			'Tue'         : 'вто',
			'Wed'         : 'сря',
			'Thu'         : 'чет',
			'Fri'         : 'пет',
			'Sat'         : 'съб',

			/******************************** sort variants ********************************/
			'sortname'          : 'по име',
			'sortkind'          : 'по вид',
			'sortsize'          : 'по размер',
			'sortdate'          : 'по дата',
			'sortFoldersFirst'  : 'Папките първи',
			'sortperm'          : 'по права', // from v2.1.13 added 13.06.2016
			'sortmode'          : 'по вид',       // from v2.1.13 added 13.06.2016
			'sortowner'         : 'по собственик',      // from v2.1.13 added 13.06.2016
			'sortgroup'         : 'по група',      // from v2.1.13 added 13.06.2016
			'sortAlsoTreeview'  : 'Също дървовиден изглед',  // from v2.1.15 added 01.08.2016

			/********************************** new items **********************************/
			'untitled file.txt' : 'Нов файл.txt', // added 10.11.2015
			'untitled folder'   : 'Нова папка',   // added 10.11.2015
			'Archive'           : 'Нов архив',  // from v2.1 added 10.11.2015
			'untitled file'     : 'Нов файл.$1',  // from v2.1.41 added 6.8.2018
			'extentionfile'     : '$1: Файл',    // from v2.1.41 added 6.8.2018
			'extentiontype'     : '$1: $2',      // from v2.1.43 added 17.10.2018

			/********************************** messages **********************************/
			'confirmReq'      : 'Изисква се подтвърждение',
			'confirmRm'       : 'Сигурни ли сте, че желаете да премахнете файловете?<br/>Това действие е необратимо!',
			'confirmRepl'     : 'Да заменя ли стария файл с новия?',
			'confirmRest'     : 'Да се замени ли съществуващата позиция с тази в кошчето?', // fromv2.1.24 added 5.5.2017
			'confirmConvUTF8' : 'Не е в UTF-8 формат<br/>Конвертиране до UTF-8?<br/>Съдържанието става в UTF-8 формат при запазване след конверсията.', // from v2.1 added 08.04.2014
			'confirmNonUTF8'  : 'Кодирането на този файл не може да бъде открито. Необходимо е временно да се преобразува в UTF-8 за редактиране. <br/> Моля, изберете кодиране на този файл.', // from v2.1.19 added 28.11.2016
			'confirmNotSave'  : 'Има направени промени.<br/>Те ще бъдат загубени, ако не запишете промените.', // from v2.1 added 15.7.2015
			'confirmTrash'    : 'Наистина ли искате да преместите позиции в кошчето за боклук?', //from v2.1.24 added 29.4.2017
			'confirmMove'     : 'Наистина ли искате да преместите елементи в "$1"?', //from v2.1.50 added 27.7.2019
			'apllyAll'        : 'Приложи за всички',
			'name'            : 'Име',
			'size'            : 'Размер',
			'perms'           : 'Права',
			'modify'          : 'Променено',
			'kind'            : 'Вид',
			'read'            : 'четене',
			'write'           : 'запис',
			'noaccess'        : 'без достъп',
			'and'             : 'и',
			'unknown'         : 'непознат',
			'selectall'       : 'Избери всички файлове',
			'selectfiles'     : 'Избери файл(ове)',
			'selectffile'     : 'Избери първият файл',
			'selectlfile'     : 'Избери последният файл',
			'viewlist'        : 'Изглед списък',
			'viewicons'       : 'Изглед икони',
			'viewSmall'       : 'Малки икони', // from v2.1.39 added 22.5.2018
			'viewMedium'      : 'Средни икони', // from v2.1.39 added 22.5.2018
			'viewLarge'       : 'Големи икони', // from v2.1.39 added 22.5.2018
			'viewExtraLarge'  : 'Много големи икони', // from v2.1.39 added 22.5.2018
			'places'          : 'Избрани',
			'calc'            : 'Изчисли',
			'path'            : 'Път',
			'aliasfor'        : 'Връзка към',
			'locked'          : 'Заключен',
			'dim'             : 'Размери',
			'files'           : 'Файлове',
			'folders'         : 'Папки',
			'items'           : 'Позиции',
			'yes'             : 'да',
			'no'              : 'не',
			'link'            : 'Връзка',
			'searcresult'     : 'Резултати от търсенето',
			'selected'        : 'Избрани позиции',
			'about'           : 'За',
			'shortcuts'       : 'Бързи клавиши',
			'help'            : 'Помощ',
			'webfm'           : 'Файлов менажер за Интернет',
			'ver'             : 'Версия',
			'protocolver'     : 'версия на протокола',
			'homepage'        : 'Начало',
			'docs'            : 'Документация',
			'github'          : 'Разклонение в Github',
			'twitter'         : 'Последвайте ни в Twitter',
			'facebook'        : 'Присъединете се към нас във Facebook',
			'team'            : 'Екип',
			'chiefdev'        : 'Главен разработчик',
			'developer'       : 'разработчик',
			'contributor'     : 'сътрудник',
			'maintainer'      : 'поддръжка',
			'translator'      : 'преводач',
			'icons'           : 'Икони',
			'dontforget'      : 'и не забравяйте да си вземете кърпата',
			'shortcutsof'     : 'Преките пътища са изключени',
			'dropFiles'       : 'Пуснете файловете тук',
			'or'              : 'или',
			'selectForUpload' : 'Избери файлове',
			'moveFiles'       : 'Премести файлове',
			'copyFiles'       : 'Копирай файлове',
			'restoreFiles'    : 'Възстанови файлове', // from v2.1.24 added 5.5.2017
			'rmFromPlaces'    : 'Премахни от избрани',
			'aspectRatio'     : 'Отношение',
			'scale'           : 'Мащаб',
			'width'           : 'Ширина',
			'height'          : 'Височина',
			'resize'          : 'Преоразмери',
			'crop'            : 'Отрежи',
			'rotate'          : 'Ротирай',
			'rotate-cw'       : 'Ротирай 90 градуса CW',
			'rotate-ccw'      : 'Ротирай 90 градуса CCW',
			'degree'          : '°',
			'netMountDialogTitle' : 'Монтиране на мрежов ресурс', // added 18.04.2012
			'protocol'            : 'Протокол', // added 18.04.2012
			'host'                : 'Хост', // added 18.04.2012
			'port'                : 'Порт', // added 18.04.2012
			'user'                : 'Потребител', // added 18.04.2012
			'pass'                : 'Парола', // added 18.04.2012
			'confirmUnmount'      : 'Ще размонтирате $1?',  // from v2.1 added 30.04.2012
			'dropFilesBrowser': 'Пусни или вмъкни файлове от браузера', // from v2.1 added 30.05.2012
			'dropPasteFiles'  : 'Тук поснете файловете, URL адресите или изображенията от клипборда', // from v2.1 added 07.04.2014
			'encoding'        : 'Кодировка', // from v2.1 added 19.12.2014
			'locale'          : 'Локали',   // from v2.1 added 19.12.2014
			'searchTarget'    : 'Цел: $1',                // from v2.1 added 22.5.2015
			'searchMime'      : 'Търсене по въведен MIME тип', // from v2.1 added 22.5.2015
			'owner'           : 'Собственик', // from v2.1 added 20.6.2015
			'group'           : 'Група', // from v2.1 added 20.6.2015
			'other'           : 'Други', // from v2.1 added 20.6.2015
			'execute'         : 'Изпълнява', // from v2.1 added 20.6.2015
			'perm'            : 'Разрешение', // from v2.1 added 20.6.2015
			'mode'            : 'Вид', // from v2.1 added 20.6.2015
			'emptyFolder'     : 'Папката е празна', // from v2.1.6 added 30.12.2015
			'emptyFolderDrop' : 'Папката е празна\\A Влачи и пусни за да добавите файлове', // from v2.1.6 added 30.12.2015
			'emptyFolderLTap' : 'Папката е празна\\A Докоснете дълго за да добавите позиции', // from v2.1.6 added 30.12.2015
			'quality'         : 'Качество', // from v2.1.6 added 5.1.2016
			'autoSync'        : 'Автоматично синхронизиране',  // from v2.1.6 added 10.1.2016
			'moveUp'          : 'Премести нагоре',  // from v2.1.6 added 18.1.2016
			'getLink'         : 'Вземи URL връзка', // from v2.1.7 added 9.2.2016
			'selectedItems'   : 'Избрани позиции ($1)', // from v2.1.7 added 2.19.2016
			'folderId'        : 'Папка ID', // from v2.1.10 added 3.25.2016
			'offlineAccess'   : 'Позволи офлайн достъп', // from v2.1.10 added 3.25.2016
			'reAuth'          : 'За повторно удостоверяване', // from v2.1.10 added 3.25.2016
			'nowLoading'      : 'Сега се зарежда...', // from v2.1.12 added 4.26.2016
			'openMulti'       : 'Отваряне на няколко файла', // from v2.1.12 added 5.14.2016
			'openMultiConfirm': 'Опитвате се да отворите $1 файла. Наистина ли искате да ги отворите в браузъра?', // from v2.1.12 added 5.14.2016
			'emptySearch'     : 'Няма резултат от търсенето.', // from v2.1.12 added 5.16.2016
			'editingFile'     : 'Редактира се файл.', // from v2.1.13 added 6.3.2016
			'hasSelected'     : 'Вие сте избрали $1 позиции.', // from v2.1.13 added 6.3.2016
			'hasClipboard'    : 'Имате $1 позиции в клипборда.', // from v2.1.13 added 6.3.2016
			'incSearchOnly'   : 'Инкременталното търсене е само от текущия изглед.', // from v2.1.13 added 6.30.2016
			'reinstate'       : 'Възстановяване', // from v2.1.15 added 3.8.2016
			'complete'        : '$1 завършени', // from v2.1.15 added 21.8.2016
			'contextmenu'     : 'Контекстно меню', // from v2.1.15 added 9.9.2016
			'pageTurning'     : 'Завъртане на страницата', // from v2.1.15 added 10.9.2016
			'volumeRoots'     : 'Начала на ресурси', // from v2.1.16 added 16.9.2016
			'reset'           : 'Нулиране', // from v2.1.16 added 1.10.2016
			'bgcolor'         : 'Цвят на фона', // from v2.1.16 added 1.10.2016
			'colorPicker'     : 'Средство за избиране на цвят', // from v2.1.16 added 1.10.2016
			'8pxgrid'         : '8px мрежа', // from v2.1.16 added 4.10.2016
			'enabled'         : 'Активно', // from v2.1.16 added 4.10.2016
			'disabled'        : 'Неактивно', // from v2.1.16 added 4.10.2016
			'emptyIncSearch'  : 'Няма резултат от търсенето в текущия изглед.\\AНатиснете [Enter] за да разширите целта на търсене.', // from v2.1.16 added 5.10.2016
			'emptyLetSearch'  : 'Резултатите от търсенето на първата буква са празни в текущия изглед.', // from v2.1.23 added 24.3.2017
			'textLabel'       : 'Текстов етикет', // from v2.1.17 added 13.10.2016
			'minsLeft'        : '$1 мин остават', // from v2.1.17 added 13.11.2016
			'openAsEncoding'  : 'Отваряне отново с избрано кодиране', // from v2.1.19 added 2.12.2016
			'saveAsEncoding'  : 'Запазете с избраното кодиране', // from v2.1.19 added 2.12.2016
			'selectFolder'    : 'Избери папка', // from v2.1.20 added 13.12.2016
			'firstLetterSearch': 'Търсене по първа буква', // from v2.1.23 added 24.3.2017
			'presets'         : 'Мостри', // from v2.1.25 added 26.5.2017
			'tooManyToTrash'  : 'Прекалено много позиции, не може да премести в кошчето.', // from v2.1.25 added 9.6.2017
			'TextArea'        : 'Текстово поле', // from v2.1.25 added 14.6.2017
			'folderToEmpty'   : 'Изпразнете папка "$1".', // from v2.1.25 added 22.6.2017
			'filderIsEmpty'   : 'В папка "$1" няма позиции.', // from v2.1.25 added 22.6.2017
			'preference'      : 'Настройки', // from v2.1.26 added 28.6.2017
			'language'        : 'Настройка на езика', // from v2.1.26 added 28.6.2017
			'clearBrowserData': 'Инициализирайте настройките запаметени в този браузър', // from v2.1.26 added 28.6.2017
			'toolbarPref'     : 'Настройки на лентата с инструменти', // from v2.1.27 added 2.8.2017
			'charsLeft'       : '... $1 символа остават.',  // from v2.1.29 added 30.8.2017
			'linesLeft'       : '... $1 оставени редове.',  // from v2.1.52 added 16.1.2020
			'sum'             : 'Сумарно', // from v2.1.29 added 28.9.2017
			'roughFileSize'   : 'Груб размер на файла', // from v2.1.30 added 2.11.2017
			'autoFocusDialog' : 'Фокусирайте върху елемента в диалоговия прозорец с мишката',  // from v2.1.30 added 2.11.2017
			'select'          : 'Избери', // from v2.1.30 added 23.11.2017
			'selectAction'    : 'Действие при избор на файл', // from v2.1.30 added 23.11.2017
			'useStoredEditor' : 'Отворете с редактора, използван за последен път', // from v2.1.30 added 23.11.2017
			'selectinvert'    : 'Обърнете селекцията', // from v2.1.30 added 25.11.2017
			'renameMultiple'  : 'Наистина ли искате да преименувате $1 избрани позиции като $2? <br/> Това не може да бъде отменено!', // from v2.1.31 added 4.12.2017
			'batchRename'     : 'Групово преименуване', // from v2.1.31 added 8.12.2017
			'plusNumber'      : '+ Номер', // from v2.1.31 added 8.12.2017
			'asPrefix'        : 'Добави префикс', // from v2.1.31 added 8.12.2017
			'asSuffix'        : 'Добави суфикс', // from v2.1.31 added 8.12.2017
			'changeExtention' : 'Промени разширение', // from v2.1.31 added 8.12.2017
			'columnPref'      : 'Настройки за колони (Изглед в списък)', // from v2.1.32 added 6.2.2018
			'reflectOnImmediate' : 'Всички промени ще се отразят незабавно в архива.', // from v2.1.33 added 2.3.2018
			'reflectOnUnmount'   : 'Промените няма да се отразят, докато не размонтирате този диск.', // from v2.1.33 added 2.3.2018
			'unmountChildren' : 'Следните томове, монтирани на този том, също са демонтирани. Сигурен ли си, че ще го демонтираш?', // from v2.1.33 added 5.3.2018
			'selectionInfo'   : 'Информация за селекцията', // from v2.1.33 added 7.3.2018
			'hashChecker'     : 'Алгоритми за показване на файловия хеш', // from v2.1.33 added 10.3.2018
			'infoItems'       : 'Информационни елементи (информационен панел за избор)', // from v2.1.38 added 28.3.2018
			'pressAgainToExit': 'Натиснете отново, за да излезете.', // from v2.1.38 added 1.4.2018
			'toolbar'         : 'Лента с инструменти', // from v2.1.38 added 4.4.2018
			'workspace'       : 'Работно пространство', // from v2.1.38 added 4.4.2018
			'dialog'          : 'Диалог', // from v2.1.38 added 4.4.2018
			'all'             : 'Всички', // from v2.1.38 added 4.4.2018
			'iconSize'        : 'Размер на иконите (изглед с икони)', // from v2.1.39 added 7.5.2018
			'editorMaximized' : 'Отваря максимизиран прозорец на редактора', // from v2.1.40 added 30.6.2018
			'editorConvNoApi' : 'Тъй като в момента не е налична API за конверсията, моля, конвертирайте в уебсайта.', //from v2.1.40 added 8.7.2018
			'editorConvNeedUpload' : 'След конверсията трябва да го качите с URL адреса или изтегления файл, за да запазите конвертирания файл.', //from v2.1.40 added 8.7.2018
			'convertOn'       : 'Конвертиране на сайта от $1', // from v2.1.40 added 10.7.2018
			'integrations'    : 'Интеграции', // from v2.1.40 added 11.7.2018
			'integrationWith' : 'Този elFinder има следните интегрирани външни услуги. Моля, проверете условията за ползване, декларацията за поверителност и т.н., преди да ги използвате.', // from v2.1.40 added 11.7.2018
			'showHidden'      : 'Покажи скритите елементи', // from v2.1.41 added 24.7.2018
			'hideHidden'      : 'Скрий скритите елементи', // from v2.1.41 added 24.7.2018
			'toggleHidden'    : 'Покажи/скрий скритите елементи', // from v2.1.41 added 24.7.2018
			'makefileTypes'   : 'Типове файлове за активиране с "Нов файл"', // from v2.1.41 added 7.8.2018
			'typeOfTextfile'  : 'Тип на текстовия файл', // from v2.1.41 added 7.8.2018
			'add'             : 'Добавете', // from v2.1.41 added 7.8.2018
			'theme'           : 'Тема', // from v2.1.43 added 19.10.2018
			'default'         : 'По подразбиране', // from v2.1.43 added 19.10.2018
			'description'     : 'Описание', // from v2.1.43 added 19.10.2018
			'website'         : 'уебсайт', // from v2.1.43 added 19.10.2018
			'author'          : 'Автор', // from v2.1.43 added 19.10.2018
			'email'           : 'електронна поща', // from v2.1.43 added 19.10.2018
			'license'         : 'Лиценз', // from v2.1.43 added 19.10.2018
			'exportToSave'    : 'Този елемент не може да бъде запазен. За да избегнете загубата на редакциите, трябва да експортирате на вашия компютър.', // from v2.1.44 added 1.12.2018
			'dblclickToSelect': 'Щракнете двукратно върху файла, за да го изберете.', // from v2.1.47 added 22.1.2019
			'useFullscreen'   : 'Използвайте режим на цял екран', // from v2.1.47 added 19.2.2019

			/********************************** mimetypes **********************************/
			'kindUnknown'     : 'Непознат',
			'kindRoot'        : 'Начало на ресурс', // from v2.1.16 added 16.10.2016
			'kindFolder'      : 'Папка',
			'kindSelects'     : 'Селекции', // from v2.1.29 added 29.8.2017
			'kindAlias'       : 'Връзка',
			'kindAliasBroken' : 'Счупена връзка',
			// applications
			'kindApp'         : 'Приложение',
			'kindPostscript'  : 'Postscript документ',
			'kindMsOffice'    : 'Microsoft Office документ',
			'kindMsWord'      : 'Microsoft Word документ',
			'kindMsExcel'     : 'Microsoft Excel документ',
			'kindMsPP'        : 'Microsoft Powerpoint презентация',
			'kindOO'          : 'Open Office документ',
			'kindAppFlash'    : 'Flash приложение',
			'kindPDF'         : 'PDF документ',
			'kindTorrent'     : 'Bittorrent файл',
			'kind7z'          : '7z архив',
			'kindTAR'         : 'TAR архив',
			'kindGZIP'        : 'GZIP архив',
			'kindBZIP'        : 'BZIP архив',
			'kindXZ'          : 'XZ архив',
			'kindZIP'         : 'ZIP архив',
			'kindRAR'         : 'RAR архив',
			'kindJAR'         : 'Java JAR файл',
			'kindTTF'         : 'True Type шрифт',
			'kindOTF'         : 'Open Type шрифт',
			'kindRPM'         : 'RPM пакет',
			// texts
			'kindText'        : 'Текстов документ',
			'kindTextPlain'   : 'Чист текст',
			'kindPHP'         : 'PHP изходен код',
			'kindCSS'         : 'CSS таблица със стилове',
			'kindHTML'        : 'HTML документ',
			'kindJS'          : 'Javascript изходен код',
			'kindRTF'         : 'RTF текстови файл',
			'kindC'           : 'C изходен код',
			'kindCHeader'     : 'C header изходен код',
			'kindCPP'         : 'C++ изходен код',
			'kindCPPHeader'   : 'C++ header изходен код',
			'kindShell'       : 'Unix shell изходен код',
			'kindPython'      : 'Python изходен код',
			'kindJava'        : 'Java изходен код',
			'kindRuby'        : 'Ruby изходен код',
			'kindPerl'        : 'Perl изходен код',
			'kindSQL'         : 'SQL изходен код',
			'kindXML'         : 'XML документ',
			'kindAWK'         : 'AWK изходен код',
			'kindCSV'         : 'CSV стойности разделени със запетая',
			'kindDOCBOOK'     : 'Docbook XML документ',
			'kindMarkdown'    : 'Markdown текст', // added 20.7.2015
			// images
			'kindImage'       : 'Изображение',
			'kindBMP'         : 'BMP изображение',
			'kindJPEG'        : 'JPEG изображение',
			'kindGIF'         : 'GIF изображение',
			'kindPNG'         : 'PNG изображение',
			'kindTIFF'        : 'TIFF изображение',
			'kindTGA'         : 'TGA изображение',
			'kindPSD'         : 'Adobe Photoshop изображение',
			'kindXBITMAP'     : 'X bitmap изображение',
			'kindPXM'         : 'Pixelmator изображение',
			// media
			'kindAudio'       : 'Аудио медия',
			'kindAudioMPEG'   : 'MPEG звук',
			'kindAudioMPEG4'  : 'MPEG-4 звук',
			'kindAudioMIDI'   : 'MIDI звук',
			'kindAudioOGG'    : 'Ogg Vorbis звук',
			'kindAudioWAV'    : 'WAV звук',
			'AudioPlaylist'   : 'MP3 списък за изпълнение',
			'kindVideo'       : 'Видео медия',
			'kindVideoDV'     : 'DV филм',
			'kindVideoMPEG'   : 'MPEG филм',
			'kindVideoMPEG4'  : 'MPEG-4 филм',
			'kindVideoAVI'    : 'AVI филм',
			'kindVideoMOV'    : 'Quick Time филм',
			'kindVideoWM'     : 'Windows Media филм',
			'kindVideoFlash'  : 'Flash филм',
			'kindVideoMKV'    : 'Matroska филм',
			'kindVideoOGG'    : 'Ogg филм'
		}
	};
}));

Djs/i18n/elfinder.tr.js000064400000103226151215013360010512 0ustar00/**
 * Türkçe translation
 * @author I.Taskinoglu & A.Kaya <alikaya@armsyazilim.com>
 * @author Abdullah ELEN <abdullahelen@msn.com>
 * @author Osman KAYAN <osmnkayan@gmail.com>
 * @author alikayan95@gmail.com
 * @author Cengiz AKCAN cengiz@vobo.company
 * @version 2022-03-03
 */
 (function(root, factory) {
	if (typeof define === 'function' && define.amd) {
		define(['elfinder'], factory);
	} else if (typeof exports !== 'undefined') {
		module.exports = factory(require('elfinder'));
	} else {
		factory(root.elFinder);
	}
}(this, function(elFinder) {
	elFinder.prototype.i18.tr = {
		translator : 'I.Taskinoglu & A.Kaya &lt;alikaya@armsyazilim.com&gt;, Abdullah ELEN &lt;abdullahelen@msn.com&gt;, Osman KAYAN &lt;osmnkayan@gmail.com&gt;, alikayan95@gmail.com, Cengiz AKCAN cengiz@vobo.company',
		language   : 'Türkçe',
		direction  : 'ltr',
		dateFormat : 'd.m.Y H:i', // will show like: 03.03.2022 15:56
		fancyDateFormat : '$1 H:i', // will show like: Bugün 15:56
		nonameDateFormat : 'ymd-His', // noname upload will show like: 220303-155625
		messages   : {
			'getShareText' : 'Paylaş',
			'Editor ': 'Kod Düzenleyici',
			

			/********************************** errors **********************************/
			'error'                : 'Hata',
			'errUnknown'           : 'Bilinmeyen hata.',
			'errUnknownCmd'        : 'Bilinmeyen komut.',
			'errJqui'              : 'Geçersiz jQuery UI yapılandırması. Seçilebilir, sürükle ve bırak bileşenlerini içermelidir.',
			'errNode'              : 'elFinder, DOM Element\'ini oluşturması gerekir.',
			'errURL'               : 'Geçersiz elFinder yapılandırması! URL seçeneği ayarlı değil.',
			'errAccess'            : 'Erişim engellendi.',
			'errConnect'           : 'Sunucuya bağlanamıyor.',
			'errAbort'             : 'Bağlantı durduruldu.',
			'errTimeout'           : 'Bağlantı zaman aşımı.',
			'errNotFound'          : 'Sunucu bulunamadı.',
			'errResponse'          : 'Geçersiz sunucu yanıtı.',
			'errConf'              : 'Geçersiz sunucu yapılandırması.',
			'errJSON'              : 'PHP JSON modülü kurulu değil.',
			'errNoVolumes'         : 'Okunabilir birimler mevcut değil.',
			'errCmdParams'         : '"$1" komutu için geçersiz parametre.',
			'errDataNotJSON'       : 'Bu veri JSON formatında değil.',
			'errDataEmpty'         : 'Boş veri.',
			'errCmdReq'            : 'Sunucu isteği için komut adı gerekli.',
			'errOpen'              : '"$1" açılamıyor.',
			'errNotFolder'         : 'Bu nesne bir klasör değil.',
			'errNotFile'           : 'Bu nesne bir dosya değil.',
			'errRead'              : '"$1" okunamıyor.',
			'errWrite'             : '"$1" yazılamıyor.',
			'errPerm'              : 'Yetki engellendi.',
			'errLocked'            : '"$1" kilitli. Bu nedenle taşıma, yeniden adlandırma veya kaldırma yapılamıyor.',
			'errExists'            : '"$1" adında bir dosya zaten var.',
			'errInvName'           : 'Geçersiz dosya ismi.',
			'errInvDirname'        : 'Geçersiz klasör ismi',  // from v2.1.24 added 12.4.2017
			'errFolderNotFound'    : 'Klasör bulunamıyor.',
			'errFileNotFound'      : 'Dosya bulunamadı.',
			'errTrgFolderNotFound' : 'Hedef klasör "$1" bulunamadı.',
			'errPopup'             : 'Tarayıcı popup penceresi açmayı engelledi. Tarayıcı ayarlarından dosya açmayı aktif hale getirin.',
			'errMkdir'             : 'Klasör oluşturulamıyor "$1".',
			'errMkfile'            : '"$1" dosyası oluşturulamıyor.',
			'errRename'            : '"$1" yeniden adlandırma yapılamıyor.',
			'errCopyFrom'          : '"$1" biriminden dosya kopyalamaya izin verilmedi.',
			'errCopyTo'            : '"$1" birimine dosya kopyalamaya izin verilmedi.',
			'errMkOutLink'         : 'Kök birim dışında bir bağlantı oluşturulamıyor', // from v2.1 added 03.10.2015
			'errUpload'            : 'Dosya yükleme hatası.',  // old name - errUploadCommon
			'errUploadFile'        : '"$1" dosya yüklenemedi.', // old name - errUpload
			'errUploadNoFiles'     : 'Yüklenecek dosya bulunamadı.',
			'errUploadTotalSize'   : 'Veri izin verilen boyuttan büyük.', // old name - errMaxSize
			'errUploadFileSize'    : 'Dosya izin verilen boyuttan büyük.', //  old name - errFileMaxSize
			'errUploadMime'        : 'Dosya türüne izin verilmedi.',
			'errUploadTransfer'    : '"$1" transfer hatası.',
			'errUploadTemp'        : 'Yükleme için geçici dosya yapılamıyor.', // from v2.1 added 26.09.2015
			'errNotReplace'        : '"$1" nesnesi bu konumda zaten var ve başka türde nesne ile değiştirilemez.', // new
			'errReplace'           : 'Değişiklik yapılamıyor "$1".',
			'errSave'              : '"$1" kaydedilemiyor.',
			'errCopy'              : '"$1" kopyalanamıyor.',
			'errMove'              : '"$1" taşınamıyor.',
			'errCopyInItself'      : '"$1" kendi içine kopyalanamaz.',
			'errRm'                : '"$1" kaldırılamıyor.',
			'errTrash'             : 'Çöp kutusuna taşınamıyor.', // from v2.1.24 added 30.4.2017
			'errRmSrc'             : 'Kaynak dosya(lar) kaldırılamıyor.',
			'errExtract'           : '"$1" kaynağından dosyalar çıkartılamıyor.',
			'errArchive'           : 'Arşiv oluşturulamıyor.',
			'errArcType'           : 'Desteklenmeyen arşiv türü.',
			'errNoArchive'         : 'Dosya arşiv değil veya desteklenmeyen arşiv türü.',
			'errCmdNoSupport'      : 'Sunucu bu komutu desteklemiyor.',
			'errReplByChild'       : '“$1” klasörü içerdiği bir öğe tarafından değiştirilemez.',
			'errArcSymlinks'       : 'Sembolik bağlantıları içeren arşivlerin açılması güvenlik nedeniyle reddedildi.', // edited 24.06.2012
			'errArcMaxSize'        : 'Arşiv dosyaları izin verilen maksimum boyutu aştı.',
			'errResize'            : '"$1" yeniden boyutlandırılamıyor.',
			'errResizeDegree'      : 'Geçersiz döndürme derecesi.',  // added 7.3.2013
			'errResizeRotate'      : 'Resim döndürülemiyor.',  // added 7.3.2013
			'errResizeSize'        : 'Geçersiz resim boyutu.',  // added 7.3.2013
			'errResizeNoChange'    : 'Resim boyutu değiştirilemez.',  // added 7.3.2013
			'errUsupportType'      : 'Desteklenmeyen dosya türü.',
			'errNotUTF8Content'    : 'Dosya "$1" UTF-8 olmadığından düzenlenemez.',  // added 9.11.2011
			'errNetMount'          : '"$1" bağlanamadı.', // added 17.04.2012
			'errNetMountNoDriver'  : 'Desteklenmeyen protokol.',     // added 17.04.2012
			'errNetMountFailed'    : 'Bağlama hatası.',         // added 17.04.2012
			'errNetMountHostReq'   : 'Sunucu gerekli.', // added 18.04.2012
			'errSessionExpires'    : 'Uzun süre işlem yapılmadığından oturumunuz sonlandı.',
			'errCreatingTempDir'   : 'Geçici dizin oluşturulamıyor: "$1"',
			'errFtpDownloadFile'   : 'Dosya FTP: "$1" adresinden indirilemiyor.',
			'errFtpUploadFile'     : 'Dosya FTP: "$1" adresine yüklenemiyor.',
			'errFtpMkdir'          : 'FTP: "$1" üzerinde uzak dizin oluşturulamıyor.',
			'errArchiveExec'       : '"$1" Dosyalarında arşivlenirken hata oluştu.',
			'errExtractExec'       : '"$1" Dosyaları arşivden çıkartılırken hata oluştu.',
			'errNetUnMount'        : 'Bağlantı kaldırılamıyor.', // from v2.1 added 30.04.2012
			'errConvUTF8'          : 'UTF-8\'e dönüştürülemez.', // from v2.1 added 08.04.2014
			'errFolderUpload'      : 'Klasör yükleyebilmek için daha modern bir tarayıcıya ihtiyacınız var.', // from v2.1 added 26.6.2015
			'errSearchTimeout'     : '"$1" araması zaman aşımına uğradı. Kısmi arama sonuçları listeleniyor.', // from v2.1 added 12.1.2016
			'errReauthRequire'     : 'Yeniden yetkilendirme gerekiyor.', // from v2.1.10 added 24.3.2016
			'errMaxTargets'        : 'Maksimum seçilebilir öge sayısı $1 adettir', // from v2.1.17 added 17.10.2016
			'errRestore'           : 'Çöp kutusundan geri yüklenemiyor. Geri yükleme notkası belirlenemiyor.', // from v2.1.24 added 3.5.2017
			'errEditorNotFound'    : 'Editör bu dosya türünü bulamıyor.', // from v2.1.25 added 23.5.2017
			'errServerError'       : 'Sunucu tarafında beklenilmeyen bir hata oluştu.', // from v2.1.25 added 16.6.2017
			'errEmpty'             : '"$1" klasörü boşaltılamıyor.', // from v2.1.25 added 22.6.2017
			'moreErrors'           : '"$1" veya daha fazla hata', // from v2.1.44 added 9.12.2018
			'errMaxMkdirs'         : 'Tek seferde 1$\'a kadar klasör oluşturabilirsiniz.', // from v2.1.58 added 20.6.2021

			/******************************* commands names ********************************/
			'cmdarchive'   : 'Arşiv oluştur',
			'cmdback'      : 'Geri',
			'cmdcopy'      : 'Kopyala',
			'cmdcut'       : 'Kes',
			'cmddownload'  : 'İndir',
			'cmdduplicate' : 'Çoğalt',
			'cmdedit'      : 'Dosyayı düzenle',
			'cmdextract'   : 'Arşivden dosyaları çıkart',
			'cmdforward'   : 'İleri',
			'cmdgetfile'   : 'Dosyaları seç',
			'cmdhelp'      : 'Bu yazılım hakkında',
			'cmdhome'      : 'Anasayfa',
			'cmdinfo'      : 'Bilgi göster',
			'cmdmkdir'     : 'Yeni klasör',
			'cmdmkdirin'   : 'Yeni Klasör / aç', // from v2.1.7 added 19.2.2016
			'cmdmkfile'    : 'Yeni dosya',
			'cmdopen'      : 'Aç',
			'cmdpaste'     : 'Yapıştır',
			'cmdquicklook' : 'Ön izleme',
			'cmdreload'    : 'Geri Yükle',
			'cmdrename'    : 'Yeniden Adlandır',
			'cmdrm'        : 'Sil',
			'cmdtrash'     : 'Çöpe at', //from v2.1.24 added 29.4.2017
			'cmdrestore'   : 'geri yükle', //from v2.1.24 added 3.5.2017
			'cmdsearch'    : 'Dosyaları bul',
			'cmdup'        : 'Üst dizine çık',
			'cmdupload'    : 'Dosyaları yükle',
			'cmdview'      : 'Görüntüle',
			'cmdresize'    : 'Resmi yeniden boyutlandır',
			'cmdsort'      : 'Sırala',
			'cmdnetmount'  : 'Bağlı ağ birimi', // added 18.04.2012
			'cmdnetunmount': 'Devredışı bırak', // from v2.1 added 30.04.2012
			'cmdplaces'    : 'Yerlere', // added 28.12.2014
			'cmdchmod'     : 'Mod değiştir', // from v2.1 added 20.6.2015
			'cmdopendir'   : 'Klasör aç', // from v2.1 added 13.1.2016
			'cmdcolwidth'  : 'Sütun genişliğini sıfırla', // from v2.1.13 added 12.06.2016
			'cmdfullscreen': 'Tam ekran', // from v2.1.15 added 03.08.2016
			'cmdmove'      : 'Taşı', // from v2.1.15 added 21.08.2016
			'cmdempty'     : 'Klasörü boşalt', // from v2.1.25 added 22.06.2017
			'cmdundo'      : 'Geri al', // from v2.1.27 added 31.07.2017
			'cmdredo'      : 'Yinele', // from v2.1.27 added 31.07.2017
			'cmdpreference': 'Tercihler', // from v2.1.27 added 03.08.2017
			'cmdselectall' : 'Tümünü seç', // from v2.1.28 added 15.08.2017
			'cmdselectnone': 'Seçimi temizle', // from v2.1.28 added 15.08.2017
			'cmdselectinvert': 'Diğerlerini seç', // from v2.1.28 added 15.08.2017
			'cmdopennew'   : 'Yeni Sekmede aç', // from v2.1.38 added 3.4.2018
			'cmdhide'      : 'Ögeyi Gizle', // from v2.1.41 added 24.7.2018

			/*********************************** buttons ***********************************/
			'btnClose'  : 'Kapat',
			'btnSave'   : 'Kaydet',
			'btnRm'     : 'Kaldır',
			'btnApply'  : 'Uygula',
			'btnCancel' : 'İptal',
			'btnNo'     : 'Hayır',
			'btnYes'    : 'Evet',
			'btnMount'  : 'Bağla',  // added 18.04.2012
			'btnApprove': 'Git $1 & onayla', // from v2.1 added 26.04.2012
			'btnUnmount': 'Bağlantıyı kes', // from v2.1 added 30.04.2012
			'btnConv'   : 'Dönüştür', // from v2.1 added 08.04.2014
			'btnCwd'    : 'Buraya',      // from v2.1 added 22.5.2015
			'btnVolume' : 'Birim',    // from v2.1 added 22.5.2015
			'btnAll'    : 'Hepsi',       // from v2.1 added 22.5.2015
			'btnMime'   : 'MIME Türü', // from v2.1 added 22.5.2015
			'btnFileName':'Dosya adı',  // from v2.1 added 22.5.2015
			'btnSaveClose': 'Kaydet & Kapat', // from v2.1 added 12.6.2015
			'btnBackup' : 'Yedekle', // fromv2.1 added 28.11.2015
			'btnRename'    : 'Yeniden adlandır',      // from v2.1.24 added 6.4.2017
			'btnRenameAll' : 'Yeniden adlandır(Tümü)', // from v2.1.24 added 6.4.2017
			'btnPrevious' : 'Önceki ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnNext'     : 'Sonraki ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnSaveAs'   : 'Farklı Kaydet', // from v2.1.25 added 24.5.2017

			/******************************** notifications ********************************/
			'ntfopen'     : 'Klasör Aç',
			'ntffile'     : 'Dosya Aç',
			'ntfreload'   : 'Klasör içeriğini yeniden yükle',
			'ntfmkdir'    : 'Dizin oluşturuluyor',
			'ntfmkfile'   : 'Dosyaları oluşturma',
			'ntfrm'       : 'Dosyaları sil',
			'ntfcopy'     : 'Dosyaları kopyala',
			'ntfmove'     : 'Dosyaları taşı',
			'ntfprepare'  : 'Dosyaları kopyalamaya hazırla',
			'ntfrename'   : 'Dosyaları yeniden adlandır',
			'ntfupload'   : 'Dosyalar yükleniyor',
			'ntfdownload' : 'Dosyalar indiriliyor',
			'ntfsave'     : 'Dosyalar kaydediliyor',
			'ntfarchive'  : 'Arşiv oluşturuluyor',
			'ntfextract'  : 'Arşivden dosyalar çıkartılıyor',
			'ntfsearch'   : 'Dosyalar aranıyor',
			'ntfresize'   : 'Resimler boyutlandırılıyor',
			'ntfsmth'     : 'İşlem yapılıyor',
			'ntfloadimg'  : 'Resim yükleniyor',
			'ntfnetmount' : 'Ağ birimine bağlanılıyor', // added 18.04.2012
			'ntfnetunmount': 'Ağ birimi bağlantısı kesiliyor', // from v2.1 added 30.04.2012
			'ntfdim'      : 'Resim boyutu alınıyor', // added 20.05.2013
			'ntfreaddir'  : 'Klasör bilgisi okunuyor', // from v2.1 added 01.07.2013
			'ntfurl'      : 'Bağlantının URL\'si alınıyor', // from v2.1 added 11.03.2014
			'ntfchmod'    : 'Dosya modu değiştiriliyor', // from v2.1 added 20.6.2015
			'ntfpreupload': 'Yüklenen dosya ismi doğrulanıyor', // from v2.1 added 31.11.2015
			'ntfzipdl'    : 'İndirilecek dosya oluşturuluyor', // from v2.1.7 added 23.1.2016
			'ntfparents'  : 'Dosya yolu bilgileri alınıyor', // from v2.1.17 added 2.11.2016
			'ntfchunkmerge': 'Yüklenen dosya işleniyor', // from v2.1.17 added 2.11.2016
			'ntftrash'    : 'Çöp kutusuna atma', // from v2.1.24 added 2.5.2017
			'ntfrestore'  : 'Çöp kutusundan geri yükle', // from v2.1.24 added 3.5.2017
			'ntfchkdir'   : 'Hedef klasör kontrol ediliyor', // from v2.1.24 added 3.5.2017
			'ntfundo'     : 'Önceki işlemi geri alma', // from v2.1.27 added 31.07.2017
			'ntfredo'     : 'Önceki geri almayı tekrarlama', // from v2.1.27 added 31.07.2017
			'ntfchkcontent' : 'İçeriği kontrol ediniz', // from v2.1.41 added 3.8.2018

			/*********************************** volumes *********************************/
			'volume_Trash' : 'Çöp', //from v2.1.24 added 29.4.2017

			/************************************ dates **********************************/
			'dateUnknown' : 'Bilinmiyor',
			'Today'       : 'Bugün',
			'Yesterday'   : 'Dün',
			'msJan'       : 'Oca',
			'msFeb'       : 'Şub',
			'msMar'       : 'Mart',
			'msApr'       : 'Nis',
			'msMay'       : 'Mayıs',
			'msJun'       : 'Haz',
			'msJul'       : 'Tem',
			'msAug'       : 'Ağu',
			'msSep'       : 'Eyl',
			'msOct'       : 'Ekm',
			'msNov'       : 'Kas',
			'msDec'       : 'Ara',
			'January'     : 'Ocak',
			'February'    : 'Şubat',
			'March'       : 'Mart',
			'April'       : 'Nisan',
			'May'         : 'Mayıs',
			'June'        : 'Haziran',
			'July'        : 'Temmuz',
			'August'      : 'Ağustos',
			'September'   : 'Eylül',
			'October'     : 'Ekim',
			'November'    : 'Kasım',
			'December'    : 'Aralık',
			'Sunday'      : 'Pazar',
			'Monday'      : 'Pazartesi',
			'Tuesday'     : 'Salı',
			'Wednesday'   : 'Çarşamba',
			'Thursday'    : 'Perşembe',
			'Friday'      : 'Cuma',
			'Saturday'    : 'Cumartesi',
			'Sun'         : 'Paz',
			'Mon'         : 'Pzt',
			'Tue'         : 'Sal',
			'Wed'         : 'Çar',
			'Thu'         : 'Per',
			'Fri'         : 'Cum',
			'Sat'         : 'Cmt',

			/******************************** sort variants ********************************/
			'sortname'          : 'Ada göre',
			'sortkind'          : 'Türe göre',
			'sortsize'          : 'Boyuta göre',
			'sortdate'          : 'Tarihe göre',
			'sortFoldersFirst'  : 'Önce klasörler',
			'sortperm'          : 'izinlere göre', // from v2.1.13 added 13.06.2016
			'sortmode'          : 'moduna göre',       // from v2.1.13 added 13.06.2016
			'sortowner'         : 'sahibine göre',      // from v2.1.13 added 13.06.2016
			'sortgroup'         : 'grubuna göre',      // from v2.1.13 added 13.06.2016
			'sortAlsoTreeview'  : 'Ayrıca ağaç görünümü',  // from v2.1.15 added 01.08.2016

			/********************************** new items **********************************/
			'untitled file.txt' : 'YeniDosya.txt', // added 10.11.2015
			'untitled folder'   : 'YeniKlasor',   // added 10.11.2015
			'Archive'           : 'YeniArsiv',  // from v2.1 added 10.11.2015
			'untitled file'     : 'YeniDosya.$1',  // from v2.1.41 added 6.8.2018
			'extentionfile'     : '$1: Dosya',    // from v2.1.41 added 6.8.2018
			'extentiontype'     : '$1: $2',      // from v2.1.43 added 17.10.2018

			/********************************** messages **********************************/
			'confirmReq'      : 'Onay gerekli',
			'confirmRm'       : 'Dosyaları kaldırmak istediğinden emin misin?<br/>Bu işlem geri alınamaz!',
			'confirmRepl'     : 'Eski dosya yenisi ile değiştirilsin mi?',
			'confirmRest'     : 'Mevcut öge çöp kutusundaki ögeyle değiştirilsin mi?', // fromv2.1.24 added 5.5.2017
			'confirmConvUTF8' : 'UTF-8 değil<br/>UTF-8\'e dönüştürülsün mü?<br/>Dönüştürme sonrası kaydedebilmek için içeriğin UTF-8 olması gerekir.', // from v2.1 added 08.04.2014
			'confirmNonUTF8'  : 'Bu dosyanın karakter kodlaması tespit edilemedi. Düzenleme için geçici olarak UTF-8\'e dönüştürülmesi gerekir.<br/>Lütfen bu dosyanın karakter kodlamasını seçin.', // from v2.1.19 added 28.11.2016
			'confirmNotSave'  : 'Düzenlenmiş içerik.<br/>Değişiklikleri kaydetmek istemiyorsanız son yapılanlar kaybolacak.', // from v2.1 added 15.7.2015
			'confirmTrash'    : 'Öğeleri çöp kutusuna taşımak istediğinizden emin misiniz?', //from v2.1.24 added 29.4.2017
			'confirmMove'     : '"$1" değiştirmek istediğinizden emin misiniz?', //from v2.1.50 added 27.7.2019
			'apllyAll'        : 'Tümüne uygula',
			'name'            : 'İsim',
			'size'            : 'Boyut',
			'perms'           : 'Yetkiler',
			'modify'          : 'Değiştirildi',
			'kind'            : 'Tür',
			'read'            : 'oku',
			'write'           : 'yaz',
			'noaccess'        : 'erişim yok',
			'and'             : 've',
			'unknown'         : 'bilinimiyor',
			'selectall'       : 'Tüm dosyaları seç',
			'selectfiles'     : 'Dosya(lar)ı seç',
			'selectffile'     : 'İlk dosyayı seç',
			'selectlfile'     : 'Son dosyayı seç',
			'viewlist'        : 'Liste görünümü',
			'viewicons'       : 'Simge görünümü',
			'viewSmall'       : 'Small iconlar', // from v2.1.39 added 22.5.2018
			'viewMedium'      : 'Medium iconlar', // from v2.1.39 added 22.5.2018
			'viewLarge'       : 'Large iconlar', // from v2.1.39 added 22.5.2018
			'viewExtraLarge'  : 'Extra large iconlar', // from v2.1.39 added 22.5.2018
			'places'          : 'Yerler',
			'calc'            : 'Hesapla',
			'path'            : 'Yol',
			'aliasfor'        : 'Takma adı:',
			'locked'          : 'Kilitli',
			'dim'             : 'Ölçüler',
			'files'           : 'Dosyalar',
			'folders'         : 'Klasörler',
			'items'           : 'Nesneler',
			'yes'             : 'evet',
			'no'              : 'hayır',
			'link'            : 'Bağlantı',
			'searcresult'     : 'Arama sonuçları',
			'selected'        : 'Seçili öğeler',
			'about'           : 'Hakkında',
			'shortcuts'       : 'Kısayollar',
			'help'            : 'Yardım',
			'webfm'           : 'Web dosyası yöneticisi',
			'ver'             : 'Sürüm',
			'protocolver'     : 'protokol sürümü',
			'homepage'        : 'Proje Anasayfası',
			'docs'            : 'Belgeler',
			'github'          : 'Github\'ta bizi takip edin',
			'twitter'         : 'Twitter\'da bizi takip edin',
			'facebook'        : 'Facebook\'ta bize katılın',
			'team'            : 'Takım',
			'chiefdev'        : 'geliştirici şefi',
			'developer'       : 'geliştirici',
			'contributor'     : 'iştirakçi',
			'maintainer'      : 'bakıcı',
			'translator'      : 'çeviri',
			'icons'           : 'Simgeler',
			'dontforget'      : 've havlunuzu almayı unutmayın',
			'shortcutsof'     : 'Kısayollar devre dışı',
			'dropFiles'       : 'Dosyaları buraya taşı',
			'or'              : 'veya',
			'selectForUpload' : 'Yüklemek için dosyaları seçin',
			'moveFiles'       : 'Dosyaları taşı',
			'copyFiles'       : 'Dosyaları kopyala',
			'restoreFiles'    : 'Öğeleri geri yükle', // from v2.1.24 added 5.5.2017
			'rmFromPlaces'    : 'Yerlerinden sil',
			'aspectRatio'     : 'Görünüm oranı',
			'scale'           : 'Ölçeklendir',
			'width'           : 'Genişlik',
			'height'          : 'Yükseklik',
			'resize'          : 'Boyutlandır',
			'crop'            : 'Kırp',
			'rotate'          : 'Döndür',
			'rotate-cw'       : '90 derece sağa döndür',
			'rotate-ccw'      : '90 derece sola döndür',
			'degree'          : 'Derece',
			'netMountDialogTitle' : 'Bağlı (Mount) ağ birimi', // added 18.04.2012
			'protocol'            : 'Protokol', // added 18.04.2012
			'host'                : 'Sunucu', // added 18.04.2012
			'port'                : 'Kapı(Port)', // added 18.04.2012
			'user'                : 'Kullanıcı', // added 18.04.2012
			'pass'                : 'Şifre', // added 18.04.2012
			'confirmUnmount'      : 'Bağlantı kesilsin mi $1?',  // from v2.1 added 30.04.2012
			'dropFilesBrowser': 'Dosyaları tarayıcıdan yapıştır veya bırak', // from v2.1 added 30.05.2012
			'dropPasteFiles'  : 'Dosyaları buraya yapıştır veya bırak', // from v2.1 added 07.04.2014
			'encoding'        : 'Kodlama', // from v2.1 added 19.12.2014
			'locale'          : 'Yerel',   // from v2.1 added 19.12.2014
			'searchTarget'    : 'Hedef: $1',                // from v2.1 added 22.5.2015
			'searchMime'      : 'Giriş MIME Türüne Göre Arama', // from v2.1 added 22.5.2015
			'owner'           : 'Sahibi', // from v2.1 added 20.6.2015
			'group'           : 'Grup', // from v2.1 added 20.6.2015
			'other'           : 'Diğer', // from v2.1 added 20.6.2015
			'execute'         : 'Çalıştır', // from v2.1 added 20.6.2015
			'perm'            : 'Yetki', // from v2.1 added 20.6.2015
			'mode'            : 'Mod', // from v2.1 added 20.6.2015
			'emptyFolder'     : 'Klasör boş', // from v2.1.6 added 30.12.2015
			'emptyFolderDrop' : 'Klasör boş\\A Eklemek için sürükleyin', // from v2.1.6 added 30.12.2015
			'emptyFolderLTap' : 'Klasör boş\\A Eklemek için basılı tutun', // from v2.1.6 added 30.12.2015
			'quality'         : 'Kalite', // from v2.1.6 added 5.1.2016
			'autoSync'        : 'Otomatik senkronizasyon',  // from v2.1.6 added 10.1.2016
			'moveUp'          : 'Yukarı taşı',  // from v2.1.6 added 18.1.2016
			'getLink'         : 'URL bağlantısı alın', // from v2.1.7 added 9.2.2016
			'selectedItems'   : 'Seçili öğeler ($1)', // from v2.1.7 added 2.19.2016
			'folderId'        : 'Klasör kimliği', // from v2.1.10 added 3.25.2016
			'offlineAccess'   : 'Çevrimdışı erişime izin ver', // from v2.1.10 added 3.25.2016
			'reAuth'          : 'Yeniden kimlik doğrulaması için', // from v2.1.10 added 3.25.2016
			'nowLoading'      : 'Şimdi yükleniyor...', // from v2.1.12 added 4.26.2016
			'openMulti'       : 'Çoklu dosya aç', // from v2.1.12 added 5.14.2016
			'openMultiConfirm': '$1 dosyalarını açmaya çalışıyorsunuz. Tarayıcıda açmak istediğinizden emin misiniz?', // from v2.1.12 added 5.14.2016
			'emptySearch'     : 'Arama hedefinde eşleşen sonuç bulunamadı.', // from v2.1.12 added 5.16.2016
			'editingFile'     : 'Dosya düzenleniyor.', // from v2.1.13 added 6.3.2016
			'hasSelected'     : '$1 öğe seçtiniz.', // from v2.1.13 added 6.3.2016
			'hasClipboard'    : 'Panonuzda $1 öğeniz var.', // from v2.1.13 added 6.3.2016
			'incSearchOnly'   : 'Artan arama yalnızca geçerli görünümden yapılır.', // from v2.1.13 added 6.30.2016
			'reinstate'       : 'Eski durumuna getir', // from v2.1.15 added 3.8.2016
			'complete'        : '$1 tamamlandı', // from v2.1.15 added 21.8.2016
			'contextmenu'     : 'Durum menüsü', // from v2.1.15 added 9.9.2016
			'pageTurning'     : 'Sayfa çevir', // from v2.1.15 added 10.9.2016
			'volumeRoots'     : 'Disk kök dizini', // from v2.1.16 added 16.9.2016
			'reset'           : 'Sıfırla', // from v2.1.16 added 1.10.2016
			'bgcolor'         : 'Arkaplan rengi', // from v2.1.16 added 1.10.2016
			'colorPicker'     : 'Renk seçici', // from v2.1.16 added 1.10.2016
			'8pxgrid'         : '8px Izgara', // from v2.1.16 added 4.10.2016
			'enabled'         : 'Etkin', // from v2.1.16 added 4.10.2016
			'disabled'        : 'Engelli', // from v2.1.16 added 4.10.2016
			'emptyIncSearch'  : 'Geçerli görünümde arama sonucu bulunamadı. Arama sonucunu genişletmek için \\APress [Enter]  yapın', // from v2.1.16 added 5.10.2016
			'emptyLetSearch'  : 'Geçerli görünümde ilk harf arama sonuçları boş.', // from v2.1.23 added 24.3.2017
			'textLabel'       : 'Metin etiketi', // from v2.1.17 added 13.10.2016
			'minsLeft'        : '$1 dakika kaldı', // from v2.1.17 added 13.11.2016
			'openAsEncoding'  : 'Seçilen kodlamayla yeniden aç', // from v2.1.19 added 2.12.2016
			'saveAsEncoding'  : 'Seçilen kodlamayla kaydet', // from v2.1.19 added 2.12.2016
			'selectFolder'    : 'Klasör seç', // from v2.1.20 added 13.12.2016
			'firstLetterSearch': 'İlk arama sayfası', // from v2.1.23 added 24.3.2017
			'presets'         : 'Hazır ayarlar', // from v2.1.25 added 26.5.2017
			'tooManyToTrash'  : 'çok fazla öge var çöp kutusuna atılamaz.', // from v2.1.25 added 9.6.2017
			'TextArea'        : 'Metin alanı(TextArea)', // from v2.1.25 added 14.6.2017
			'folderToEmpty'   : '"$1" klasörünü boşalt.', // from v2.1.25 added 22.6.2017
			'filderIsEmpty'   : '"$1" klasöründe öge yok.', // from v2.1.25 added 22.6.2017
			'preference'      : 'Tercih', // from v2.1.26 added 28.6.2017
			'language'        : 'Dil ayarları', // from v2.1.26 added 28.6.2017
			'clearBrowserData': 'Bu tarayıcıda kayıtlı ayarları başlat', // from v2.1.26 added 28.6.2017
			'toolbarPref'     : 'Araç çubuğu ayarları', // from v2.1.27 added 2.8.2017
			'charsLeft'       : '... $1 karakter kaldı',  // from v2.1.29 added 30.8.2017
			'linesLeft'       : '... $1 satır kaldı.',  // from v2.1.52 added 16.1.2020
			'sum'             : 'Toplam', // from v2.1.29 added 28.9.2017
			'roughFileSize'   : 'Kaba dosya boyutu', // from v2.1.30 added 2.11.2017
			'autoFocusDialog' : 'Fare ile üzerine gelince diyalog öğesi odaklansın',  // from v2.1.30 added 2.11.2017
			'select'          : 'Seç', // from v2.1.30 added 23.11.2017
			'selectAction'    : 'Dosya seçildiğinde işleme al', // from v2.1.30 added 23.11.2017
			'useStoredEditor' : 'Geçen sefer kullanılan editörle aç', // from v2.1.30 added 23.11.2017
			'selectinvert'    : 'Zıt seçim', // from v2.1.30 added 25.11.2017
			'renameMultiple'  : '$1 seçilen öğeleri $2 gibi yeniden adlandırmak istediğinizden emin misiniz?</br>Bu geri alınamaz!', // from v2.1.31 added 4.12.2017
			'batchRename'     : 'Yığın adını değiştir', // from v2.1.31 added 8.12.2017
			'plusNumber'      : '+ Sayı', // from v2.1.31 added 8.12.2017
			'asPrefix'        : 'Ön ek kele', // from v2.1.31 added 8.12.2017
			'asSuffix'        : 'Son ek ekle', // from v2.1.31 added 8.12.2017
			'changeExtention' : 'Uzantıyı değiştir', // from v2.1.31 added 8.12.2017
			'columnPref'      : 'Sütun ayarları (Liste görünümü)', // from v2.1.32 added 6.2.2018
			'reflectOnImmediate' : 'Tüm değişiklikler hemen arşive yansıtılacaktır.', // from v2.1.33 added 2.3.2018
			'reflectOnUnmount'   : 'Herhangi bir değişiklik, bu birimi kaldırılıncaya kadar yansıtılmayacaktır.', // from v2.1.33 added 2.3.2018
			'unmountChildren' : 'Bu cihaza monte edilen aşağıdaki birim (ler) de bağlanmamıştır. Çıkardığınızdan emin misiniz?', // from v2.1.33 added 5.3.2018
			'selectionInfo'   : 'Seçim Bilgisi', // from v2.1.33 added 7.3.2018
			'hashChecker'     : 'Dosya imza(hash) algoritmaları', // from v2.1.33 added 10.3.2018
			'infoItems'       : 'öğelerin bilgisi (Seçim Bilgi Paneli)', // from v2.1.38 added 28.3.2018
			'pressAgainToExit': 'Çıkmak için tekrar basın.', // from v2.1.38 added 1.4.2018
			'toolbar'         : 'Araç Çubuğu', // from v2.1.38 added 4.4.2018
			'workspace'       : 'Çalışma alanı', // from v2.1.38 added 4.4.2018
			'dialog'          : 'Diyalog', // from v2.1.38 added 4.4.2018
			'all'             : 'Tümü', // from v2.1.38 added 4.4.2018
			'iconSize'        : 'İcon Boyutu (İcon Görünümü İçin)', // from v2.1.39 added 7.5.2018
			'editorMaximized' : 'Maksimum düzenleyici penceresini aç', // from v2.1.40 added 30.6.2018
			'editorConvNoApi' : 'API ile dönüşüm şu anda mevcut olmadığından, lütfen web sitesinde dönüştürün.', //from v2.1.40 added 8.7.2018
			'editorConvNeedUpload' : 'Dönüştürmeden sonra, dönüştürülen dosyayı kaydetmek için öğe URL\'si veya indirilen bir dosya ile karşıya yüklemeniz gerekir.', //from v2.1.40 added 8.7.2018
			'convertOn'       : ' $1 site çevrildi', // from v2.1.40 added 10.7.2018
			'integrations'    : 'Entegrasyonlar', // from v2.1.40 added 11.7.2018
			'integrationWith' : 'Bu elFinder aşağıdaki harici hizmetlere entegre edilmiştir. Lütfen kullanmadan önce kullanım koşullarını, gizlilik politikasını vb. Kontrol edin.', // from v2.1.40 added 11.7.2018
			'showHidden'      : 'Gizli ögeleri aç.', // from v2.1.41 added 24.7.2018
			'hideHidden'      : 'Gizli ögeleri kapat.', // from v2.1.41 added 24.7.2018
			'toggleHidden'    : 'Gizli ögeleri aç/kapat', // from v2.1.41 added 24.7.2018
			'makefileTypes'   : '"Yeni dosya" ile etkinleştirilecek dosya türleri', // from v2.1.41 added 7.8.2018
			'typeOfTextfile'  : 'Text dosyası tipi.', // from v2.1.41 added 7.8.2018
			'add'             : 'Ekle', // from v2.1.41 added 7.8.2018
			'theme'           : 'Tema', // from v2.1.43 added 19.10.2018
			'default'         : 'Varsayılan', // from v2.1.43 added 19.10.2018
			'description'     : 'Açıklama', // from v2.1.43 added 19.10.2018
			'website'         : 'Websayfası', // from v2.1.43 added 19.10.2018
			'author'          : 'Yazar', // from v2.1.43 added 19.10.2018
			'email'           : 'E-mail', // from v2.1.43 added 19.10.2018
			'license'         : 'Lisans', // from v2.1.43 added 19.10.2018
			'exportToSave'    : 'Bu öğe kaydedilemez. Düzenlemeleri kaybetmemek için PC\'nize aktarmanız gerekir.', // from v2.1.44 added 1.12.2018
			'dblclickToSelect': 'Dosyayı seçmek için çift tıklayın.', // from v2.1.47 added 22.1.2019
			'useFullscreen'   : 'Tam ekran modunu kullan', // from v2.1.47 added 19.2.2019

			/********************************** mimetypes **********************************/
			'kindUnknown'     : 'Bilinmiyor',
			'kindRoot'        : 'Sürücü Kök dizini', // from v2.1.16 added 16.10.2016
			'kindFolder'      : 'Klasör',
			'kindSelects'     : 'Seçim', // from v2.1.29 added 29.8.2017
			'kindAlias'       : 'Alias (Takma ad)',
			'kindAliasBroken' : 'Bozuk alias',
			// applications
			'kindApp'         : 'Uygulama',
			'kindPostscript'  : 'Postscript dosyası',
			'kindMsOffice'    : 'Microsoft Office dosyası',
			'kindMsWord'      : 'Microsoft Word dosyası',
			'kindMsExcel'     : 'Microsoft Excel dosyası',
			'kindMsPP'        : 'Microsoft Powerpoint sunumu',
			'kindOO'          : 'Open Office dosyası',
			'kindAppFlash'    : 'Flash uygulaması',
			'kindPDF'         : 'PDF',
			'kindTorrent'     : 'Bittorrent dosyası',
			'kind7z'          : '7z arşivi',
			'kindTAR'         : 'TAR arşivi',
			'kindGZIP'        : 'GZIP arşivi',
			'kindBZIP'        : 'BZIP arşivi',
			'kindXZ'          : 'XZ arşivi',
			'kindZIP'         : 'ZIP arşivi',
			'kindRAR'         : 'RAR arşivi',
			'kindJAR'         : 'Java JAR dosyası',
			'kindTTF'         : 'True Type fontu',
			'kindOTF'         : 'Open Type fontu',
			'kindRPM'         : 'RPM paketi',
			// texts
			'kindText'        : 'Metin dosyası',
			'kindTextPlain'   : 'Düz metin',
			'kindPHP'         : 'PHP kodu',
			'kindCSS'         : 'CSS dosyası',
			'kindHTML'        : 'HTML dosyası',
			'kindJS'          : 'Javascript kodu',
			'kindRTF'         : 'Zengin Metin Belgesi',
			'kindC'           : 'C kodu',
			'kindCHeader'     : 'C başlık kodu',
			'kindCPP'         : 'C++ kodu',
			'kindCPPHeader'   : 'C++ başlık kodu',
			'kindShell'       : 'Unix shell scripti',
			'kindPython'      : 'Python kodu',
			'kindJava'        : 'Java kodu',
			'kindRuby'        : 'Ruby kodu',
			'kindPerl'        : 'Perl scripti',
			'kindSQL'         : 'SQL kodu',
			'kindXML'         : 'XML dosyası',
			'kindAWK'         : 'AWK kodu',
			'kindCSV'         : 'CSV',
			'kindDOCBOOK'     : 'Docbook XML dosyası',
			'kindMarkdown'    : 'Markdown dosyası', // added 20.7.2015
			// images
			'kindImage'       : 'Resim',
			'kindBMP'         : 'BMP dosyası',
			'kindJPEG'        : 'JPEG dosyası',
			'kindGIF'         : 'GIF dosyası',
			'kindPNG'         : 'PNG dosyası',
			'kindTIFF'        : 'TIFF dosyası',
			'kindTGA'         : 'TGA dosyası',
			'kindPSD'         : 'Adobe Photoshop dosyası',
			'kindXBITMAP'     : 'X bitmap dosyası',
			'kindPXM'         : 'Pixelmator dosyası',
			// media
			'kindAudio'       : 'Ses ortamı',
			'kindAudioMPEG'   : 'MPEG ses',
			'kindAudioMPEG4'  : 'MPEG-4 ses',
			'kindAudioMIDI'   : 'MIDI ses',
			'kindAudioOGG'    : 'Ogg Vorbis ses',
			'kindAudioWAV'    : 'WAV ses',
			'AudioPlaylist'   : 'MP3 listesi',
			'kindVideo'       : 'Video ortamı',
			'kindVideoDV'     : 'DV video',
			'kindVideoMPEG'   : 'MPEG video',
			'kindVideoMPEG4'  : 'MPEG-4 video',
			'kindVideoAVI'    : 'AVI video',
			'kindVideoMOV'    : 'Quick Time video',
			'kindVideoWM'     : 'Windows Media video',
			'kindVideoFlash'  : 'Flash video',
			'kindVideoMKV'    : 'Matroska video',
			'kindVideoOGG'    : 'Ogg video'
		}
	};
}));

js/i18n/elfinder.ja.js000064400000114427151215013370010465 0ustar00/**
 * Japanese translation
 * @author Tomoaki Yoshida <info@yoshida-studio.jp>
 * @author Naoki Sawada <hypweb+elfinder@gmail.com>
 * @version 2022-03-02
 */
 (function(root, factory) {
	if (typeof define === 'function' && define.amd) {
		define(['elfinder'], factory);
	} else if (typeof exports !== 'undefined') {
		module.exports = factory(require('elfinder'));
	} else {
		factory(root.elFinder);
	}
}(this, function(elFinder) {
	elFinder.prototype.i18.ja = {
		translator : 'Tomoaki Yoshida &lt;info@yoshida-studio.jp&gt;, Naoki Sawada &lt;hypweb+elfinder@gmail.com&gt;',
		language   : 'Japanese',
		direction  : 'ltr',
		dateFormat : 'Y/m/d h:i A', // will show like: 2022/03/02 01:09 PM
		fancyDateFormat : '$1 h:i A', // will show like: 今日 01:09 PM
		nonameDateFormat : 'ymd-His', // noname upload will show like: 220302-130931
		messages   : {
			'getShareText' : '共有',
			'Editor ': 'コードエディタ',

			/********************************** errors **********************************/
			'error'                : 'エラー',
			'errUnknown'           : '不明なエラーです。',
			'errUnknownCmd'        : '不明なコマンドです。',
			'errJqui'              : '無効な jQuery UI 設定です。Selectable, Draggable, Droppable コンポーネントを含める必要があります。',
			'errNode'              : 'elFinder は DOM Element が必要です。',
			'errURL'               : '無効な elFinder 設定です! URLを設定されていません。',
			'errAccess'            : 'アクセスが拒否されました。',
			'errConnect'           : 'バックエンドとの接続ができません。',
			'errAbort'             : '接続が中断されました。',
			'errTimeout'           : '接続がタイムアウトしました。',
			'errNotFound'          : 'バックエンドが見つかりません。',
			'errResponse'          : '無効なバックエンドレスポンスです。',
			'errConf'              : 'バックエンドの設定が有効ではありません。',
			'errJSON'              : 'PHP JSON モジュールがインストールされていません。',
			'errNoVolumes'         : '読み込み可能なボリュームがありません。',
			'errCmdParams'         : 'コマンド "$1"のパラメーターが無効です。',
			'errDataNotJSON'       : 'JSONデータではありません。',
			'errDataEmpty'         : '空のデータです。',
			'errCmdReq'            : 'バックエンドリクエストはコマンド名が必要です。',
			'errOpen'              : '"$1" を開くことができません。',
			'errNotFolder'         : 'オブジェクトがフォルダではありません。',
			'errNotFile'           : 'オブジェクトがファイルではありません。',
			'errRead'              : '"$1" を読み込むことができません。',
			'errWrite'             : '"$1" に書き込むことができません。',
			'errPerm'              : '権限がありません。',
			'errLocked'            : '"$1" はロックされているので名前の変更、移動、削除ができません。',
			'errExists'            : '"$1" というアイテム名はすでに存在しています。',
			'errInvName'           : '無効なファイル名です。',
			'errInvDirname'        : '無効なフォルダ名です。',  // from v2.1.24 added 12.4.2017
			'errFolderNotFound'    : 'フォルダが見つかりません。',
			'errFileNotFound'      : 'ファイルが見つかりません。',
			'errTrgFolderNotFound' : 'ターゲットとするフォルダ "$1" が見つかりません。',
			'errPopup'             : 'ポップアップウィンドウが開けません。ファイルを開くにはブラウザの設定を変更してください。',
			'errMkdir'             : 'フォルダ "$1" を作成することができません。',
			'errMkfile'            : 'ファイル "$1" を作成することができません。',
			'errRename'            : '"$1" の名前を変更することができません。',
			'errCopyFrom'          : '"$1" からのファイルコピーは許可されていません。',
			'errCopyTo'            : '"$1" へのファイルコピーは許可されていません。',
			'errMkOutLink'         : 'ボリュームルート外へのリンクを作成することはできません。', // from v2.1 added 03.10.2015
			'errUpload'            : 'アップロードエラー',  // old name - errUploadCommon
			'errUploadFile'        : '"$1" をアップロードすることができません。', // old name - errUpload
			'errUploadNoFiles'     : 'アップロードされたファイルはありません。',
			'errUploadTotalSize'   : 'データが許容サイズを超えています。', // old name - errMaxSize
			'errUploadFileSize'    : 'ファイルが許容サイズを超えています。', //  old name - errFileMaxSize
			'errUploadMime'        : '許可されていないファイル形式です。',
			'errUploadTransfer'    : '"$1" 転送エラーです。',
			'errUploadTemp'        : 'アップロード用一時ファイルを作成できません。', // from v2.1 added 26.09.2015
			'errNotReplace'        : 'アイテム "$1" はすでにこの場所にあり、アイテムのタイプが違うので置き換えることはできません。', // new
			'errReplace'           : '"$1" を置き換えることができません。',
			'errSave'              : '"$1" を保存することができません。',
			'errCopy'              : '"$1" をコピーすることができません。',
			'errMove'              : '"$1" を移動することができません。',
			'errCopyInItself'      : '"$1" をそれ自身の中にコピーすることはできません。',
			'errRm'                : '"$1" を削除することができません。',
			'errTrash'             : 'ごみ箱に入れることができません。', // from v2.1.24 added 30.4.2017
			'errRmSrc'             : '元ファイルを削除することができません。',
			'errExtract'           : '"$1" を解凍することができません。',
			'errArchive'           : 'アーカイブを作成することができません。',
			'errArcType'           : 'サポート外のアーカイブ形式です。',
			'errNoArchive'         : 'アーカイブでないかサポートされていないアーカイブ形式です。',
			'errCmdNoSupport'      : 'サポートされていないコマンドです。',
			'errReplByChild'       : 'フォルダ "$1" に含まれてるアイテムを置き換えることはできません。',
			'errArcSymlinks'       : 'シンボリックリンクまたは許容されないファイル名を含むアーカイブはセキュリティ上、解凍できません。', // edited 24.06.2012
			'errArcMaxSize'        : 'アーカイブが許容されたサイズを超えています。',
			'errResize'            : '"$1" のリサイズまたは回転ができません。',
			'errResizeDegree'      : 'イメージの回転角度が不正です。',  // added 7.3.2013
			'errResizeRotate'      : 'イメージを回転できません。',  // added 7.3.2013
			'errResizeSize'        : '指定されたイメージサイズが不正です。',  // added 7.3.2013
			'errResizeNoChange'    : 'イメージサイズなどの変更点がありません。',  // added 7.3.2013
			'errUsupportType'      : 'このファイルタイプはサポートされていません。',
			'errNotUTF8Content'    : 'ファイル "$1" には UTF-8 以外の文字が含まれているので編集できません。',  // added 9.11.2011
			'errNetMount'          : '"$1" をマウントできません。', // added 17.04.2012
			'errNetMountNoDriver'  : 'サポートされていないプロトコルです。',     // added 17.04.2012
			'errNetMountFailed'    : 'マウントに失敗しました。',         // added 17.04.2012
			'errNetMountHostReq'   : 'ホスト名は必須です。', // added 18.04.2012
			'errSessionExpires'    : 'アクションがなかったため、セッションが期限切れになりました。',
			'errCreatingTempDir'   : '一時ディレクトリを作成できません:"$1"',
			'errFtpDownloadFile'   : 'FTP からファイルをダウンロードできません:"$1"',
			'errFtpUploadFile'     : 'FTP へファイルをアップロードできません:"$1"',
			'errFtpMkdir'          : 'FTP にリモートディレクトリを作成できません:"$1"',
			'errArchiveExec'       : 'ファイルのアーカイブ中にエラーが発生しました:"$1"',
			'errExtractExec'       : 'ファイルの抽出中にエラーが発生しました:"$1"',
			'errNetUnMount'        : 'アンマウントできません。', // from v2.1 added 30.04.2012
			'errConvUTF8'          : 'UTF-8 に変換できませんでした。', // from v2.1 added 08.04.2014
			'errFolderUpload'      : 'フォルダをアップロードしたいのであれば、モダンブラウザを試してください。', // from v2.1 added 26.6.2015
			'errSearchTimeout'     : '"$1" を検索中にタイムアウトしました。検索結果は部分的です。', // from v2.1 added 12.1.2016
			'errReauthRequire'     : '再認可が必要です。', // from v2.1.10 added 24.3.2016
			'errMaxTargets'        : '選択可能な最大アイテム数は $1 個です。', // from v2.1.17 added 17.10.2016
			'errRestore'           : '宛先の特定ができないため、ごみ箱から戻せません。', // from v2.1.24 added 3.5.2017
			'errEditorNotFound'    : 'このファイルタイプのエディターがありません。', // from v2.1.25 added 23.5.2017
			'errServerError'       : 'サーバー側でエラーが発生しました。', // from v2.1.25 added 16.6.2017
			'errEmpty'             : 'フォルダ"$1"を空にすることができません。', // from v2.1.25 added 22.6.2017
			'moreErrors'           : 'さらに $1 件のエラーがあります。', // from v2.1.44 added 9.12.2018
			'errMaxMkdirs'         : '一度に作成できるフォルダーは $1 個までです。', // from v2.1.58 added 20.6.2021

			/******************************* commands names ********************************/
			'cmdarchive'   : 'アーカイブ作成',
			'cmdback'      : '戻る',
			'cmdcopy'      : 'コピー',
			'cmdcut'       : 'カット',
			'cmddownload'  : 'ダウンロード',
			'cmdduplicate' : '複製',
			'cmdedit'      : 'ファイル編集',
			'cmdextract'   : 'アーカイブを解凍',
			'cmdforward'   : '進む',
			'cmdgetfile'   : 'ファイル選択',
			'cmdhelp'      : 'このソフトウェアについて',
			'cmdhome'      : 'ルート',
			'cmdinfo'      : '情報',
			'cmdmkdir'     : '新規フォルダ',
			'cmdmkdirin'   : '新規フォルダへ', // from v2.1.7 added 19.2.2016
			'cmdmkfile'    : '新規ファイル',
			'cmdopen'      : '開く',
			'cmdpaste'     : 'ペースト',
			'cmdquicklook' : 'プレビュー',
			'cmdreload'    : 'リロード',
			'cmdrename'    : 'リネーム',
			'cmdrm'        : '削除',
			'cmdtrash'     : 'ごみ箱へ', //from v2.1.24 added 29.4.2017
			'cmdrestore'   : '復元', //from v2.1.24 added 3.5.2017
			'cmdsearch'    : 'ファイルを探す',
			'cmdup'        : '親フォルダへ移動',
			'cmdupload'    : 'ファイルアップロード',
			'cmdview'      : 'ビュー',
			'cmdresize'    : 'リサイズと回転',
			'cmdsort'      : 'ソート',
			'cmdnetmount'  : 'ネットワークボリュームをマウント', // added 18.04.2012
			'cmdnetunmount': 'アンマウント', // from v2.1 added 30.04.2012
			'cmdplaces'    : 'よく使う項目へ', // added 28.12.2014
			'cmdchmod'     : '属性変更', // from v2.1 added 20.6.2015
			'cmdopendir'   : 'フォルダを開く', // from v2.1 added 13.1.2016
			'cmdcolwidth'  : '列幅リセット', // from v2.1.13 added 12.06.2016
			'cmdfullscreen': 'フルスクリーン', // from v2.1.15 added 03.08.2016
			'cmdmove'      : '移動', // from v2.1.15 added 21.08.2016
			'cmdempty'     : 'フォルダを空に', // from v2.1.25 added 22.06.2017
			'cmdundo'      : '元に戻す', // from v2.1.27 added 31.07.2017
			'cmdredo'      : 'やり直し', // from v2.1.27 added 31.07.2017
			'cmdpreference': '個人設定', // from v2.1.27 added 03.08.2017
			'cmdselectall' : 'すべて選択', // from v2.1.28 added 15.08.2017
			'cmdselectnone': '選択解除', // from v2.1.28 added 15.08.2017
			'cmdselectinvert': '選択を反転', // from v2.1.28 added 15.08.2017
			'cmdopennew'   : '新しいウィンドウで開く', // from v2.1.38 added 3.4.2018
			'cmdhide'      : '非表示 (個人設定)', // from v2.1.41 added 24.7.2018

			/*********************************** buttons ***********************************/
			'btnClose'  : '閉じる',
			'btnSave'   : '保存',
			'btnRm'     : '削除',
			'btnApply'  : '適用',
			'btnCancel' : 'キャンセル',
			'btnNo'     : 'いいえ',
			'btnYes'    : 'はい',
			'btnMount'  : 'マウント',  // added 18.04.2012
			'btnApprove': '$1へ行き認可する', // from v2.1 added 26.04.2012
			'btnUnmount': 'アンマウント', // from v2.1 added 30.04.2012
			'btnConv'   : '変換', // from v2.1 added 08.04.2014
			'btnCwd'    : 'この場所',      // from v2.1 added 22.5.2015
			'btnVolume' : 'ボリューム',    // from v2.1 added 22.5.2015
			'btnAll'    : '全て',       // from v2.1 added 22.5.2015
			'btnMime'   : 'MIMEタイプ', // from v2.1 added 22.5.2015
			'btnFileName':'ファイル名',  // from v2.1 added 22.5.2015
			'btnSaveClose': '保存して閉じる', // from v2.1 added 12.6.2015
			'btnBackup' : 'バックアップ', // fromv2.1 added 28.11.2015
			'btnRename'    : 'リネーム',      // from v2.1.24 added 6.4.2017
			'btnRenameAll' : 'リネーム(全て)', // from v2.1.24 added 6.4.2017
			'btnPrevious' : '前へ ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnNext'     : '次へ ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnSaveAs'   : '別名保存', // from v2.1.25 added 24.5.2017

			/******************************** notifications ********************************/
			'ntfopen'     : 'フォルダを開いています',
			'ntffile'     : 'ファイルを開いています',
			'ntfreload'   : 'フォルダを再読込しています',
			'ntfmkdir'    : 'フォルダを作成しています',
			'ntfmkfile'   : 'ファイルを作成しています',
			'ntfrm'       : 'アイテムを削除しています',
			'ntfcopy'     : 'アイテムをコピーしています',
			'ntfmove'     : 'アイテムを移動しています',
			'ntfprepare'  : '既存アイテムを確認しています',
			'ntfrename'   : 'ファイル名を変更しています',
			'ntfupload'   : 'ファイルをアップロードしています',
			'ntfdownload' : 'ファイルをダウンロードしています',
			'ntfsave'     : 'ファイルを保存しています',
			'ntfarchive'  : 'アーカイブ作成しています',
			'ntfextract'  : 'アーカイブを解凍しています',
			'ntfsearch'   : 'ファイル検索中',
			'ntfresize'   : 'リサイズしています',
			'ntfsmth'     : '処理をしています',
			'ntfloadimg'  : 'イメージを読み込んでいます',
			'ntfnetmount' : 'ネットボリュームをマウント中', // added 18.04.2012
			'ntfnetunmount': 'ネットボリュームをアンマウント中', // from v2.1 added 30.04.2012
			'ntfdim'      : '画像サイズを取得しています', // added 20.05.2013
			'ntfreaddir'  : 'フォルダ情報を読み取っています', // from v2.1 added 01.07.2013
			'ntfurl'      : 'リンクURLを取得しています', // from v2.1 added 11.03.2014
			'ntfchmod'    : 'ファイル属性を変更しています', // from v2.1 added 20.6.2015
			'ntfpreupload': 'アップロードファイル名を検証中', // from v2.1 added 31.11.2015
			'ntfzipdl'    : 'ダウンロード用ファイルを作成中', // from v2.1.7 added 23.1.2016
			'ntfparents'  : 'パス情報を取得しています', // from v2.1.17 added 2.11.2016
			'ntfchunkmerge': 'アップロード済みファイルを処理中', // from v2.1.17 added 2.11.2016
			'ntftrash'    : 'ごみ箱に入れています', // from v2.1.24 added 2.5.2017
			'ntfrestore'  : 'ごみ箱から元に戻しています', // from v2.1.24 added 3.5.2017
			'ntfchkdir'   : '宛先フォルダを確認しています', // from v2.1.24 added 3.5.2017
			'ntfundo'     : '前の操作を取り消して元に戻しています', // from v2.1.27 added 31.07.2017
			'ntfredo'     : '元に戻した操作をやり直しています', // from v2.1.27 added 31.07.2017
			'ntfchkcontent' : 'コンテンツをチェックしています', // from v2.1.41 added 3.8.2018

			/*********************************** volumes *********************************/
			'volume_Trash' : 'ごみ箱', //from v2.1.24 added 29.4.2017

			/************************************ dates **********************************/
			'dateUnknown' : '不明',
			'Today'       : '今日',
			'Yesterday'   : '昨日',
			'msJan'       : '1月',
			'msFeb'       : '2月',
			'msMar'       : '3月',
			'msApr'       : '4月',
			'msMay'       : '5月',
			'msJun'       : '6月',
			'msJul'       : '7月',
			'msAug'       : '8月',
			'msSep'       : '9月',
			'msOct'       : '10月',
			'msNov'       : '11月',
			'msDec'       : '12月',
			'January'     : '1月',
			'February'    : '2月',
			'March'       : '3月',
			'April'       : '4月',
			'May'         : '5月',
			'June'        : '6月',
			'July'        : '7月',
			'August'      : '8月',
			'September'   : '9月',
			'October'     : '10月',
			'November'    : '11月',
			'December'    : '12月',
			'Sunday'      : '日曜日',
			'Monday'      : '月曜日',
			'Tuesday'     : '火曜日',
			'Wednesday'   : '水曜日',
			'Thursday'    : '木曜日',
			'Friday'      : '金曜日',
			'Saturday'    : '土曜日',
			'Sun'         : '(日)',
			'Mon'         : '(月)',
			'Tue'         : '(火)',
			'Wed'         : '(水)',
			'Thu'         : '(木)',
			'Fri'         : '(金)',
			'Sat'         : '(土)',

			/******************************** sort variants ********************************/
			'sortname'          : '名前順',
			'sortkind'          : '種類順',
			'sortsize'          : 'サイズ順',
			'sortdate'          : '日付順',
			'sortFoldersFirst'  : 'フォルダ優先',
			'sortperm'          : '権限順', // from v2.1.13 added 13.06.2016
			'sortmode'          : '属性順',       // from v2.1.13 added 13.06.2016
			'sortowner'         : 'オーナー順',      // from v2.1.13 added 13.06.2016
			'sortgroup'         : 'グループ順',      // from v2.1.13 added 13.06.2016
			'sortAlsoTreeview'  : 'ツリービューも',  // from v2.1.15 added 01.08.2016

			/********************************** new items **********************************/
			'untitled file.txt' : '新規ファイル.txt', // added 10.11.2015
			'untitled folder'   : '新規フォルダ',   // added 10.11.2015
			'Archive'           : '新規アーカイブ',  // from v2.1 added 10.11.2015
			'untitled file'     : '新規ファイル.$1',  // from v2.1.41 added 6.8.2018
			'extentionfile'     : '$1: ファイル',    // from v2.1.41 added 6.8.2018
			'extentiontype'     : '$1: $2',      // from v2.1.43 added 17.10.2018

			/********************************** messages **********************************/
			'confirmReq'      : '処理を実行しますか?',
			'confirmRm'       : 'アイテムを完全に削除してもよろしいですか?<br/>この操作は取り消しできません!',
			'confirmRepl'     : '古いファイルを新しいファイルで上書きしますか? (フォルダが含まれている場合は統合されます。置き換える場合は「バックアップ」選択してください。)',
			'confirmRest'     : '既存のアイテムをごみ箱のアイテムで上書きしますか?', // fromv2.1.24 added 5.5.2017
			'confirmConvUTF8' : 'UTF-8 以外の文字が含まれています。<br/>UTF-8  に変換しますか?<br/>変換後の保存でコンテンツは UTF-8 になります。', // from v2.1 added 08.04.2014
			'confirmNonUTF8'  : 'このファイルの文字エンコーディングを判別できませんでした。編集するには一時的に UTF-8 に変換する必要があります。<br/>文字エンコーディングを指定してください。', // from v2.1.19 added 28.11.2016
			'confirmNotSave'  : '変更されています。<br/>保存せずに閉じると編集内容が失われます。', // from v2.1 added 15.7.2015
			'confirmTrash'    : 'アイテムをごみ箱に移動してもよろしいですか?', //from v2.1.24 added 29.4.2017
			'confirmMove'     : 'アイテムを"$1"に移動してもよろしいですか?', //from v2.1.50 added 27.7.2019
			'apllyAll'        : '全てに適用します',
			'name'            : '名前',
			'size'            : 'サイズ',
			'perms'           : '権限',
			'modify'          : '更新',
			'kind'            : '種類',
			'read'            : '読み取り',
			'write'           : '書き込み',
			'noaccess'        : 'アクセス禁止',
			'and'             : ',',
			'unknown'         : '不明',
			'selectall'       : 'すべてのアイテムを選択',
			'selectfiles'     : 'アイテム選択',
			'selectffile'     : '最初のアイテムを選択',
			'selectlfile'     : '最後のアイテムを選択',
			'viewlist'        : 'リスト形式で表示',
			'viewicons'       : 'アイコン形式で表示',
			'viewSmall'       : '小アイコン', // from v2.1.39 added 22.5.2018
			'viewMedium'      : '中アイコン', // from v2.1.39 added 22.5.2018
			'viewLarge'       : '大アイコン', // from v2.1.39 added 22.5.2018
			'viewExtraLarge'  : '特大アイコン', // from v2.1.39 added 22.5.2018
			'places'          : 'よく使う項目',
			'calc'            : '計算中',
			'path'            : 'パス',
			'aliasfor'        : 'エイリアス',
			'locked'          : 'ロック',
			'dim'             : '画素数',
			'files'           : 'ファイル',
			'folders'         : 'フォルダ',
			'items'           : 'アイテム',
			'yes'             : 'はい',
			'no'              : 'いいえ',
			'link'            : 'リンク',
			'searcresult'     : '検索結果',
			'selected'        : '選択されたアイテム',
			'about'           : '概要',
			'shortcuts'       : 'ショートカット',
			'help'            : 'ヘルプ',
			'webfm'           : 'ウェブファイルマネージャー',
			'ver'             : 'バージョン',
			'protocolver'     : 'プロトコルバージョン',
			'homepage'        : 'プロジェクトホーム',
			'docs'            : 'ドキュメンテーション',
			'github'          : 'Github でフォーク',
			'twitter'         : 'Twitter でフォロー',
			'facebook'        : 'Facebookグループ に参加',
			'team'            : 'チーム',
			'chiefdev'        : 'チーフデベロッパー',
			'developer'       : 'デベロッパー',
			'contributor'     : 'コントリビュータ',
			'maintainer'      : 'メインテナー',
			'translator'      : '翻訳者',
			'icons'           : 'アイコン',
			'dontforget'      : 'タオル忘れちゃだめよ~',
			'shortcutsof'     : 'ショートカットは利用できません',
			'dropFiles'       : 'ここにファイルをドロップ',
			'or'              : 'または',
			'selectForUpload' : 'ファイルを選択',
			'moveFiles'       : 'アイテムを移動',
			'copyFiles'       : 'アイテムをコピー',
			'restoreFiles'    : 'アイテムを元に戻す', // from v2.1.24 added 5.5.2017
			'rmFromPlaces'    : 'ここから削除',
			'aspectRatio'     : '縦横比維持',
			'scale'           : '表示縮尺',
			'width'           : '幅',
			'height'          : '高さ',
			'resize'          : 'リサイズ',
			'crop'            : '切り抜き',
			'rotate'          : '回転',
			'rotate-cw'       : '90度左回転',
			'rotate-ccw'      : '90度右回転',
			'degree'          : '度',
			'netMountDialogTitle' : 'ネットワークボリュームのマウント', // added 18.04.2012
			'protocol'            : 'プロトコル', // added 18.04.2012
			'host'                : 'ホスト名', // added 18.04.2012
			'port'                : 'ポート', // added 18.04.2012
			'user'                : 'ユーザー名', // added 18.04.2012
			'pass'                : 'パスワード', // added 18.04.2012
			'confirmUnmount'      : '$1をアンマウントしますか?',  // from v2.1 added 30.04.2012
			'dropFilesBrowser': 'ブラウザからファイルをドロップまたは貼り付け', // from v2.1 added 30.05.2012
			'dropPasteFiles'  : 'ここにファイルをドロップ または URLリスト, 画像(クリップボード) を貼り付け', // from v2.1 added 07.04.2014
			'encoding'        : 'エンコーディング', // from v2.1 added 19.12.2014
			'locale'          : 'ロケール',   // from v2.1 added 19.12.2014
			'searchTarget'    : '検索範囲: $1',                // from v2.1 added 22.5.2015
			'searchMime'      : '指定した MIME タイプで検索', // from v2.1 added 22.5.2015
			'owner'           : 'オーナー', // from v2.1 added 20.6.2015
			'group'           : 'グループ', // from v2.1 added 20.6.2015
			'other'           : 'その他', // from v2.1 added 20.6.2015
			'execute'         : '実行', // from v2.1 added 20.6.2015
			'perm'            : 'パーミッション', // from v2.1 added 20.6.2015
			'mode'            : '属性', // from v2.1 added 20.6.2015
			'emptyFolder'     : '空のフォルダ', // from v2.1.6 added 30.12.2015
			'emptyFolderDrop' : '空のフォルダ\\Aアイテムを追加するにはここへドロップ', // from v2.1.6 added 30.12.2015
			'emptyFolderLTap' : '空のフォルダ\\Aアイテムを追加するにはここをロングタップ', // from v2.1.6 added 30.12.2015
			'quality'         : '品質', // from v2.1.6 added 5.1.2016
			'autoSync'        : '自動更新',  // from v2.1.6 added 10.1.2016
			'moveUp'          : '上へ移動',  // from v2.1.6 added 18.1.2016
			'getLink'         : 'リンクURLを取得', // from v2.1.7 added 9.2.2016
			'selectedItems'   : '選択アイテム ($1)', // from v2.1.7 added 2.19.2016
			'folderId'        : 'フォルダID', // from v2.1.10 added 3.25.2016
			'offlineAccess'   : 'オフライン アクセスを可能にする', // from v2.1.10 added 3.25.2016
			'reAuth'          : '再認証する', // from v2.1.10 added 3.25.2016
			'nowLoading'      : '読み込んでいます...', // from v2.1.12 added 4.26.2016
			'openMulti'       : '複数ファイルオープン', // from v2.1.12 added 5.14.2016
			'openMultiConfirm': '$1 個のファイルを開こうとしています。このままブラウザで開きますか?', // from v2.1.12 added 5.14.2016
			'emptySearch'     : '検索対象に該当するアイテムはありません。', // from v2.1.12 added 5.16.2016
			'editingFile'     : 'ファイルを編集中です。', // from v2.1.13 added 6.3.2016
			'hasSelected'     : '$1 個のアイテムを選択中です。', // from v2.1.13 added 6.3.2016
			'hasClipboard'    : '$1 個のアイテムがクリップボードに入っています。', // from v2.1.13 added 6.3.2016
			'incSearchOnly'   : '逐次検索対象は現在のビューのみです。', // from v2.1.13 added 6.30.2016
			'reinstate'       : '元に戻す', // from v2.1.15 added 3.8.2016
			'complete'        : '$1 完了', // from v2.1.15 added 21.8.2016
			'contextmenu'     : 'コンテキストメニュー', // from v2.1.15 added 9.9.2016
			'pageTurning'     : 'ページめくり', // from v2.1.15 added 10.9.2016
			'volumeRoots'     : 'ボリュームルート', // from v2.1.16 added 16.9.2016
			'reset'           : 'リセット', // from v2.1.16 added 1.10.2016
			'bgcolor'         : '背景色', // from v2.1.16 added 1.10.2016
			'colorPicker'     : 'カラーピッカー', // from v2.1.16 added 1.10.2016
			'8pxgrid'         : '8pxグリッド', // from v2.1.16 added 4.10.2016
			'enabled'         : '有効', // from v2.1.16 added 4.10.2016
			'disabled'        : '無効', // from v2.1.16 added 4.10.2016
			'emptyIncSearch'  : '現在のビュー内に該当するアイテムはありません。\\A[Enter]キーで検索対象を拡げます。', // from v2.1.16 added 5.10.2016
			'emptyLetSearch'  : '現在のビュー内に指定された文字で始まるアイテムはありません。', // from v2.1.23 added 24.3.2017
			'textLabel'       : 'テキストラベル', // from v2.1.17 added 13.10.2016
			'minsLeft'        : '残り$1分', // from v2.1.17 added 13.11.2016
			'openAsEncoding'  : '選択したエンコーディングで開き直す', // from v2.1.19 added 2.12.2016
			'saveAsEncoding'  : '選択したエンコーディングで保存', // from v2.1.19 added 2.12.2016
			'selectFolder'    : 'フォルダを選択', // from v2.1.20 added 13.12.2016
			'firstLetterSearch': '一文字目で検索', // from v2.1.23 added 24.3.2017
			'presets'         : 'プリセット', // from v2.1.25 added 26.5.2017
			'tooManyToTrash'  : 'アイテム数が多すぎるのでごみ箱に入れられません。', // from v2.1.25 added 9.6.2017
			'TextArea'        : 'テキストエリア', // from v2.1.25 added 14.6.2017
			'folderToEmpty'   : 'フォルダ"$1"を空にします。', // from v2.1.25 added 22.6.2017
			'filderIsEmpty'   : 'フォルダ"$1"にアイテムはありません。', // from v2.1.25 added 22.6.2017
			'preference'      : '個人設定', // from v2.1.26 added 28.6.2017
			'language'        : '言語', // from v2.1.26 added 28.6.2017
			'clearBrowserData': 'ブラウザに保存された設定を初期化する', // from v2.1.26 added 28.6.2017
			'toolbarPref'     : 'ツールバー設定', // from v2.1.27 added 2.8.2017
			'charsLeft'       : '... 残り $1 文字',  // from v2.1.29 added 30.8.2017
			'linesLeft'       : '... 残り $1 行',  // from v2.1.52 added 16.1.2020
			'sum'             : '合計', // from v2.1.29 added 28.9.2017
			'roughFileSize'   : '大まかなファイルサイズ', // from v2.1.30 added 2.11.2017
			'autoFocusDialog' : 'マウスオーバーでダイアログの要素にフォーカスする',  // from v2.1.30 added 2.11.2017
			'select'          : '選択', // from v2.1.30 added 23.11.2017
			'selectAction'    : 'ファイル選択時の動作', // from v2.1.30 added 23.11.2017
			'useStoredEditor' : '前回使用したエディターで開く', // from v2.1.30 added 23.11.2017
			'selectinvert'    : '選択アイテムを反転', // from v2.1.30 added 25.11.2017
			'renameMultiple'  : '選択した $1 個のアイテムを $2 のようにリネームしますか?<br/>この操作は取り消しできません!', // from v2.1.31 added 4.12.2017
			'batchRename'     : '一括リネーム', // from v2.1.31 added 8.12.2017
			'plusNumber'      : '+ 連番', // from v2.1.31 added 8.12.2017
			'asPrefix'        : '先頭に追加', // from v2.1.31 added 8.12.2017
			'asSuffix'        : '末尾に追加', // from v2.1.31 added 8.12.2017
			'changeExtention' : '拡張子変更', // from v2.1.31 added 8.12.2017
			'columnPref'      : '列項目設定(リストビュー)', // from v2.1.32 added 6.2.2018
			'reflectOnImmediate' : '全ての変更は、直ちにアーカイブに反映されます。', // from v2.1.33 added 2.3.2018
			'reflectOnUnmount'   : 'このボリュームをアンマウントするまで、変更は反映されません。', // from v2.1.33 added 2.3.2018
			'unmountChildren' : 'このボリュームにマウントされている以下のボリュームもアンマウントされます。アンマウントしますか?', // from v2.1.33 added 5.3.2018
			'selectionInfo'   : '選択情報', // from v2.1.33 added 7.3.2018
			'hashChecker'     : 'ファイルハッシュを表示するアルゴリズム', // from v2.1.33 added 10.3.2018
			'infoItems'       : '情報項目 (選択情報パネル)', // from v2.1.38 added 28.3.2018
			'pressAgainToExit': 'もう一度押すと終了します。', // from v2.1.38 added 1.4.2018
			'toolbar'         : 'ツールバー', // from v2.1.38 added 4.4.2018
			'workspace'       : 'ワークスペース', // from v2.1.38 added 4.4.2018
			'dialog'          : 'ダイアログ', // from v2.1.38 added 4.4.2018
			'all'             : 'すべて', // from v2.1.38 added 4.4.2018
			'iconSize'        : 'アイコンサイズ (アイコンビュー)', // from v2.1.39 added 7.5.2018
			'editorMaximized' : 'エディターウィンドウを最大化して開く', // from v2.1.40 added 30.6.2018
			'editorConvNoApi' : '現在 API による変換は利用できないので、Web サイトで変換を行ってください。', //from v2.1.40 added 8.7.2018
			'editorConvNeedUpload' : '変換後に変換されたファイルを保存するには、アイテムの URL またはダウンロードしたファイルをアップロードする必要があります。', //from v2.1.40 added 8.7.2018
			'convertOn'       : '$1 のサイト上で変換する', // from v2.1.40 added 10.7.2018
			'integrations'    : '統合', // from v2.1.40 added 11.7.2018
			'integrationWith' : 'この elFinder は次の外部サービスが統合されています。それらの利用規約、プライバシーポリシーなどをご確認の上、ご利用ください。', // from v2.1.40 added 11.7.2018
			'showHidden'      : '非表示アイテムを表示', // from v2.1.41 added 24.7.2018
			'hideHidden'      : '非表示アイテムを隠す', // from v2.1.41 added 24.7.2018
			'toggleHidden'    : '非表示アイテムの表示/非表示', // from v2.1.41 added 24.7.2018
			'makefileTypes'   : '「新しいファイル」で有効にするファイルタイプ', // from v2.1.41 added 7.8.2018
			'typeOfTextfile'  : 'テキストファイルのタイプ', // from v2.1.41 added 7.8.2018
			'add'             : '追加', // from v2.1.41 added 7.8.2018
			'theme'           : 'テーマ', // from v2.1.43 added 19.10.2018
			'default'         : 'デフォルト', // from v2.1.43 added 19.10.2018
			'description'     : '説明', // from v2.1.43 added 19.10.2018
			'website'         : 'ウェブサイト', // from v2.1.43 added 19.10.2018
			'author'          : '作者', // from v2.1.43 added 19.10.2018
			'email'           : 'Eメール', // from v2.1.43 added 19.10.2018
			'license'         : 'ライセンス', // from v2.1.43 added 19.10.2018
			'exportToSave'    : 'このアイテムは保存できません。 編集内容を失わないようにするには、PCにエクスポートする必要があります。', // from v2.1.44 added 1.12.2018
			'dblclickToSelect': 'ファイルをダブルクリックして選択します。', // from v2.1.47 added 22.1.2019
			'useFullscreen'   : 'フルスクリーンモードの利用', // from v2.1.47 added 19.2.2019

			/********************************** mimetypes **********************************/
			'kindUnknown'     : '不明',
			'kindRoot'        : 'ボリュームルート', // from v2.1.16 added 16.10.2016
			'kindFolder'      : 'フォルダ',
			'kindSelects'     : '複数選択', // from v2.1.29 added 29.8.2017
			'kindAlias'       : '別名',
			'kindAliasBroken' : '宛先不明の別名',
			// applications
			'kindApp'         : 'アプリケーション',
			'kindPostscript'  : 'Postscript ドキュメント',
			'kindMsOffice'    : 'Microsoft Office ドキュメント',
			'kindMsWord'      : 'Microsoft Word ドキュメント',
			'kindMsExcel'     : 'Microsoft Excel ドキュメント',
			'kindMsPP'        : 'Microsoft Powerpoint プレゼンテーション',
			'kindOO'          : 'Open Office ドキュメント',
			'kindAppFlash'    : 'Flash アプリケーション',
			'kindPDF'         : 'PDF',
			'kindTorrent'     : 'Bittorrent ファイル',
			'kind7z'          : '7z アーカイブ',
			'kindTAR'         : 'TAR アーカイブ',
			'kindGZIP'        : 'GZIP アーカイブ',
			'kindBZIP'        : 'BZIP アーカイブ',
			'kindXZ'          : 'XZ アーカイブ',
			'kindZIP'         : 'ZIP アーカイブ',
			'kindRAR'         : 'RAR アーカイブ',
			'kindJAR'         : 'Java JAR ファイル',
			'kindTTF'         : 'True Type フォント',
			'kindOTF'         : 'Open Type フォント',
			'kindRPM'         : 'RPM パッケージ',
			// texts
			'kindText'        : 'Text ドキュメント',
			'kindTextPlain'   : 'プレインテキスト',
			'kindPHP'         : 'PHP ソース',
			'kindCSS'         : 'スタイルシート',
			'kindHTML'        : 'HTML ドキュメント',
			'kindJS'          : 'Javascript ソース',
			'kindRTF'         : 'Rich Text フォーマット',
			'kindC'           : 'C ソース',
			'kindCHeader'     : 'C ヘッダーソース',
			'kindCPP'         : 'C++ ソース',
			'kindCPPHeader'   : 'C++ ヘッダーソース',
			'kindShell'       : 'Unix shell スクリプト',
			'kindPython'      : 'Python ソース',
			'kindJava'        : 'Java ソース',
			'kindRuby'        : 'Ruby ソース',
			'kindPerl'        : 'Perl スクリプト',
			'kindSQL'         : 'SQL ソース',
			'kindXML'         : 'XML ドキュメント',
			'kindAWK'         : 'AWK ソース',
			'kindCSV'         : 'CSV',
			'kindDOCBOOK'     : 'Docbook XML ドキュメント',
			'kindMarkdown'    : 'Markdown テキスト', // added 20.7.2015
			// images
			'kindImage'       : 'イメージ',
			'kindBMP'         : 'BMP イメージ',
			'kindJPEG'        : 'JPEG イメージ',
			'kindGIF'         : 'GIF イメージ',
			'kindPNG'         : 'PNG イメージ',
			'kindTIFF'        : 'TIFF イメージ',
			'kindTGA'         : 'TGA イメージ',
			'kindPSD'         : 'Adobe Photoshop イメージ',
			'kindXBITMAP'     : 'X bitmap イメージ',
			'kindPXM'         : 'Pixelmator イメージ',
			// media
			'kindAudio'       : 'オーディオメディア',
			'kindAudioMPEG'   : 'MPEG オーディオ',
			'kindAudioMPEG4'  : 'MPEG-4 オーディオ',
			'kindAudioMIDI'   : 'MIDI オーディオ',
			'kindAudioOGG'    : 'Ogg Vorbis オーディオ',
			'kindAudioWAV'    : 'WAV オーディオ',
			'AudioPlaylist'   : 'MP3 プレイリスト',
			'kindVideo'       : 'ビデオメディア',
			'kindVideoDV'     : 'DV ムービー',
			'kindVideoMPEG'   : 'MPEG ムービー',
			'kindVideoMPEG4'  : 'MPEG-4 ムービー',
			'kindVideoAVI'    : 'AVI ムービー',
			'kindVideoMOV'    : 'Quick Time ムービー',
			'kindVideoWM'     : 'Windows Media ムービー',
			'kindVideoFlash'  : 'Flash ムービー',
			'kindVideoMKV'    : 'Matroska ムービー',
			'kindVideoOGG'    : 'Ogg ムービー'
		}
	};
}));

js/i18n/elfinder.ru.js000064400000123414151215013370010515 0ustar00/**
 * Русский язык translation
 * @author Dmitry "dio" Levashov <dio@std42.ru>
 * @author Andrew Berezovsky <andrew.berezovsky@gmail.com>
 * @author Alex Yashkin <alex@yashkin.by>
 * @version 2022-03-03
 */
 (function(root, factory) {
	if (typeof define === 'function' && define.amd) {
		define(['elfinder'], factory);
	} else if (typeof exports !== 'undefined') {
		module.exports = factory(require('elfinder'));
	} else {
		factory(root.elFinder);
	}
}(this, function(elFinder) {
	elFinder.prototype.i18.ru = {
		translator : 'Dmitry "dio" Levashov &lt;dio@std42.ru&gt;, Andrew Berezovsky &lt;andrew.berezovsky@gmail.com&gt;, Alex Yashkin &lt;alex@yashkin.by&gt;',
		language   : 'Русский язык',
		direction  : 'ltr',
		dateFormat : 'd M Y H:i', // will show like: 03 Мар 2022 11:22
		fancyDateFormat : '$1 H:i', // will show like: Сегодня 11:22
		nonameDateFormat : 'ymd-His', // noname upload will show like: 220303-112216
		messages   : {
			'getShareText' : 'Делиться',
			'Editor ': 'Редактор кода',

			/********************************** errors **********************************/
			'error'                : 'Ошибка',
			'errUnknown'           : 'Неизвестная ошибка.',
			'errUnknownCmd'        : 'Неизвестная команда.',
			'errJqui'              : 'Отсутствуют необходимые компоненты jQuery UI - selectable, draggable и droppable.',
			'errNode'              : 'Отсутствует DOM элемент для инициализации elFinder.',
			'errURL'               : 'Неверная конфигурация elFinder! Не указан URL.',
			'errAccess'            : 'Доступ запрещен.',
			'errConnect'           : 'Не удалось соединиться с сервером.',
			'errAbort'             : 'Соединение прервано.',
			'errTimeout'           : 'Таймаут соединения.',
			'errNotFound'          : 'Сервер не найден.',
			'errResponse'          : 'Некорректный ответ сервера.',
			'errConf'              : 'Некорректная настройка сервера.',
			'errJSON'              : 'Модуль PHP JSON не установлен.',
			'errNoVolumes'         : 'Отсутствуют корневые директории достуные для чтения.',
			'errCmdParams'         : 'Некорректные параметры команды "$1".',
			'errDataNotJSON'       : 'Данные не в формате JSON.',
			'errDataEmpty'         : 'Данные отсутствуют.',
			'errCmdReq'            : 'Для запроса к серверу необходимо указать имя команды.',
			'errOpen'              : 'Не удалось открыть "$1".',
			'errNotFolder'         : 'Объект не является папкой.',
			'errNotFile'           : 'Объект не является файлом.',
			'errRead'              : 'Ошибка чтения "$1".',
			'errWrite'             : 'Ошибка записи в "$1".',
			'errPerm'              : 'Доступ запрещен.',
			'errLocked'            : '"$1" защищен и не может быть переименован, перемещен или удален.',
			'errExists'            : 'В папке уже существует файл с именем "$1".',
			'errInvName'           : 'Недопустимое имя файла.',
			'errInvDirname'        : 'Недопустимое имя папки.',  // from v2.1.24 added 12.4.2017
			'errFolderNotFound'    : 'Папка не найдена.',
			'errFileNotFound'      : 'Файл не найден.',
			'errTrgFolderNotFound' : 'Целевая папка "$1" не найдена.',
			'errPopup'             : 'Браузер заблокировал открытие нового окна. Чтобы открыть файл, измените настройки браузера.',
			'errMkdir'             : 'Ошибка создания папки "$1".',
			'errMkfile'            : 'Ошибка создания файла "$1".',
			'errRename'            : 'Ошибка переименования "$1".',
			'errCopyFrom'          : 'Копирование файлов из директории "$1" запрещено.',
			'errCopyTo'            : 'Копирование файлов в директорию "$1" запрещено.',
			'errMkOutLink'         : 'Невозможно создать ссылку вне корня раздела.', // from v2.1 added 03.10.2015
			'errUpload'            : 'Ошибка загрузки.',  // old name - errUploadCommon
			'errUploadFile'        : 'Невозможно загрузить "$1".', // old name - errUpload
			'errUploadNoFiles'     : 'Нет файлов для загрузки.',
			'errUploadTotalSize'   : 'Превышен допустимый размер загружаемых данных.', // old name - errMaxSize
			'errUploadFileSize'    : 'Размер файла превышает допустимый.', //  old name - errFileMaxSize
			'errUploadMime'        : 'Недопустимый тип файла.',
			'errUploadTransfer'    : 'Ошибка передачи файла "$1".',
			'errUploadTemp'        : 'Невозможно создать временный файл для загрузки.', // from v2.1 added 26.09.2015
			'errNotReplace'        : 'Объект "$1" по этому адресу уже существует и не может быть заменен объектом другого типа.', // new
			'errReplace'           : 'Невозможно заменить "$1".',
			'errSave'              : 'Невозможно сохранить "$1".',
			'errCopy'              : 'Невозможно скопировать "$1".',
			'errMove'              : 'Невозможно переместить "$1".',
			'errCopyInItself'      : 'Невозможно скопировать "$1" в самого себя.',
			'errRm'                : 'Невозможно удалить "$1".',
			'errTrash'             : 'Невозможно переместить в корзину.', // from v2.1.24 added 30.4.2017
			'errRmSrc'             : 'Невозможно удалить файлы источника.',
			'errExtract'           : 'Невозможно извлечь фалы из "$1".',
			'errArchive'           : 'Невозможно создать архив.',
			'errArcType'           : 'Неподдерживаемый тип архива.',
			'errNoArchive'         : 'Файл не является архивом или неподдерживаемый тип архива.',
			'errCmdNoSupport'      : 'Сервер не поддерживает эту команду.',
			'errReplByChild'       : 'Невозможно заменить папку "$1" содержащимся в ней объектом.',
			'errArcSymlinks'       : 'По соображениям безопасности запрещена распаковка архивов, содержащих ссылки (symlinks) или файлы с недопустимыми именами.', // edited 24.06.2012
			'errArcMaxSize'        : 'Размер файлов в архиве превышает максимально разрешенный.',
			'errResize'            : 'Не удалось изменить размер "$1".',
			'errResizeDegree'      : 'Некорректный градус поворота.',  // added 7.3.2013
			'errResizeRotate'      : 'Невозможно повернуть изображение.',  // added 7.3.2013
			'errResizeSize'        : 'Некорректный размер изображения.',  // added 7.3.2013
			'errResizeNoChange'    : 'Размер изображения не изменился.',  // added 7.3.2013
			'errUsupportType'      : 'Неподдерживаемый тип файла.',
			'errNotUTF8Content'    : 'Файл "$1" содержит текст в кодировке отличной от UTF-8 и не может быть отредактирован.',  // added 9.11.2011
			'errNetMount'          : 'Невозможно подключить "$1".', // added 17.04.2012
			'errNetMountNoDriver'  : 'Неподдерживаемый протокол.',     // added 17.04.2012
			'errNetMountFailed'    : 'Ошибка монтирования.',         // added 17.04.2012
			'errNetMountHostReq'   : 'Требуется указать хост.', // added 18.04.2012
			'errSessionExpires'    : 'Сессия была завершена так как превышено время отсутствия активности.',
			'errCreatingTempDir'   : 'Невозможно создать временную директорию: "$1"',
			'errFtpDownloadFile'   : 'Невозможно скачать файл с FTP: "$1"',
			'errFtpUploadFile'     : 'Невозможно загрузить файл на FTP: "$1"',
			'errFtpMkdir'          : 'Невозможно создать директорию на FTP: "$1"',
			'errArchiveExec'       : 'Ошибка при выполнении архивации: "$1"',
			'errExtractExec'       : 'Ошибка при выполнении распаковки: "$1"',
			'errNetUnMount'        : 'Невозможно отключить', // from v2.1 added 30.04.2012
			'errConvUTF8'          : 'Не конвертируется в UTF-8', // from v2.1 added 08.04.2014
			'errFolderUpload'      : 'Если вы хотите загружать папки, попробуйте Google Chrome.', // from v2.1 added 26.6.2015
			'errSearchTimeout'     : 'Превышено время ожидания при поиске "$1". Результаты поиска частичные.', // from v2.1 added 12.1.2016
			'errReauthRequire'     : 'Требуется повторная авторизация.', // from v2.1.10 added 24.3.2016
			'errMaxTargets'        : 'Максимальное число выбираемых файлов: $1.', // from v2.1.17 added 17.10.2016
			'errRestore'           : 'Невозможно восстановить из корзины. Не удалось определить путь для восстановления.', // from v2.1.24 added 3.5.2017
			'errEditorNotFound'    : 'Не найден редактор для этого типа файлов.', // from v2.1.25 added 23.5.2017
			'errServerError'       : 'Возникла ошибка на стороне сервера.', // from v2.1.25 added 16.6.2017
			'errEmpty'             : 'Невозможно очистить папку "$1".', // from v2.1.25 added 22.6.2017
			'moreErrors'           : 'Еще ошибок: $1', // from v2.1.44 added 9.12.2018
			'errMaxMkdirs'         : 'Вы можете создать до $1 папки одновременно.', // from v2.1.58 added 20.6.2021

			/******************************* commands names ********************************/
			'cmdarchive'   : 'Создать архив',
			'cmdback'      : 'Назад',
			'cmdcopy'      : 'Копировать',
			'cmdcut'       : 'Вырезать',
			'cmddownload'  : 'Скачать',
			'cmdduplicate' : 'Сделать копию',
			'cmdedit'      : 'Редактировать файл',
			'cmdextract'   : 'Распаковать архив',
			'cmdforward'   : 'Вперед',
			'cmdgetfile'   : 'Выбрать файлы',
			'cmdhelp'      : 'О программе',
			'cmdhome'      : 'Домой',
			'cmdinfo'      : 'Свойства',
			'cmdmkdir'     : 'Новая папка',
			'cmdmkdirin'   : 'В новую папку', // from v2.1.7 added 19.2.2016
			'cmdmkfile'    : 'Новый файл',
			'cmdopen'      : 'Открыть',
			'cmdpaste'     : 'Вставить',
			'cmdquicklook' : 'Быстрый просмотр',
			'cmdreload'    : 'Обновить',
			'cmdrename'    : 'Переименовать',
			'cmdrm'        : 'Удалить',
			'cmdtrash'     : 'Переместить в корзину', //from v2.1.24 added 29.4.2017
			'cmdrestore'   : 'Восстановить', //from v2.1.24 added 3.5.2017
			'cmdsearch'    : 'Поиск файлов',
			'cmdup'        : 'Наверх',
			'cmdupload'    : 'Загрузить файлы',
			'cmdview'      : 'Вид',
			'cmdresize'    : 'Изменить размер и повернуть',
			'cmdsort'      : 'Сортировать',
			'cmdnetmount'  : 'Подключить сетевой раздел', // added 18.04.2012
			'cmdnetunmount': 'Отключить', // from v2.1 added 30.04.2012
			'cmdplaces'    : 'В избранное', // added 28.12.2014
			'cmdchmod'     : 'Изменить права доступа', // from v2.1 added 20.6.2015
			'cmdopendir'   : 'Открыть папку', // from v2.1 added 13.1.2016
			'cmdcolwidth'  : 'Сбросить ширину колонок', // from v2.1.13 added 12.06.2016
			'cmdfullscreen': 'Полный экран', // from v2.1.15 added 03.08.2016
			'cmdmove'      : 'Переместить', // from v2.1.15 added 21.08.2016
			'cmdempty'     : 'Очистить папку', // from v2.1.25 added 22.06.2017
			'cmdundo'      : 'Отменить', // from v2.1.27 added 31.07.2017
			'cmdredo'      : 'Вернуть', // from v2.1.27 added 31.07.2017
			'cmdpreference': 'Предпочтения', // from v2.1.27 added 03.08.2017
			'cmdselectall' : 'Выбрать все', // from v2.1.28 added 15.08.2017
			'cmdselectnone': 'Отменить выбор', // from v2.1.28 added 15.08.2017
			'cmdselectinvert': 'Инвертировать выбор', // from v2.1.28 added 15.08.2017
			'cmdopennew'   : 'Открыть в новом окне', // from v2.1.38 added 3.4.2018
			'cmdhide'      : 'Скрыть (персонально)', // from v2.1.41 added 24.7.2018

			/*********************************** buttons ***********************************/
			'btnClose'  : 'Закрыть',
			'btnSave'   : 'Сохранить',
			'btnRm'     : 'Удалить',
			'btnApply'  : 'Применить',
			'btnCancel' : 'Отмена',
			'btnNo'     : 'Нет',
			'btnYes'    : 'Да',
			'btnMount'  : 'Подключить',  // added 18.04.2012
			'btnApprove': 'Перейти в $1 и применить', // from v2.1 added 26.04.2012
			'btnUnmount': 'Отключить', // from v2.1 added 30.04.2012
			'btnConv'   : 'Конвертировать', // from v2.1 added 08.04.2014
			'btnCwd'    : 'Здесь',      // from v2.1 added 22.5.2015
			'btnVolume' : 'Раздел',    // from v2.1 added 22.5.2015
			'btnAll'    : 'Все',       // from v2.1 added 22.5.2015
			'btnMime'   : 'MIME тип', // from v2.1 added 22.5.2015
			'btnFileName':'Имя файла',  // from v2.1 added 22.5.2015
			'btnSaveClose': 'Сохранить и закрыть', // from v2.1 added 12.6.2015
			'btnBackup' : 'Резервная копия', // fromv2.1 added 28.11.2015
			'btnRename'    : 'Переименовать',      // from v2.1.24 added 6.4.2017
			'btnRenameAll' : 'Переименовать (все)', // from v2.1.24 added 6.4.2017
			'btnPrevious' : 'Пред. ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnNext'     : 'След. ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnSaveAs'   : 'Сохранить как', // from v2.1.25 added 24.5.2017

			/******************************** notifications ********************************/
			'ntfopen'     : 'Открыть папку',
			'ntffile'     : 'Открыть файл',
			'ntfreload'   : 'Обновить текущую папку',
			'ntfmkdir'    : 'Создание папки',
			'ntfmkfile'   : 'Создание файлов',
			'ntfrm'       : 'Удалить файлы',
			'ntfcopy'     : 'Скопировать файлы',
			'ntfmove'     : 'Переместить файлы',
			'ntfprepare'  : 'Подготовка к копированию файлов',
			'ntfrename'   : 'Переименовать файлы',
			'ntfupload'   : 'Загрузка файлов',
			'ntfdownload' : 'Скачивание файлов',
			'ntfsave'     : 'Сохранить файлы',
			'ntfarchive'  : 'Создание архива',
			'ntfextract'  : 'Распаковка архива',
			'ntfsearch'   : 'Поиск файлов',
			'ntfresize'   : 'Изменение размеров изображений',
			'ntfsmth'     : 'Занят важным делом',
			'ntfloadimg'  : 'Загрузка изображения',
			'ntfnetmount' : 'Подключение сетевого диска', // added 18.04.2012
			'ntfnetunmount': 'Отключение сетевого диска', // from v2.1 added 30.04.2012
			'ntfdim'      : 'Получение размеров изображения', // added 20.05.2013
			'ntfreaddir'  : 'Чтение информации о папке', // from v2.1 added 01.07.2013
			'ntfurl'      : 'Получение URL ссылки', // from v2.1 added 11.03.2014
			'ntfchmod'    : 'Изменение прав доступа к файлу', // from v2.1 added 20.6.2015
			'ntfpreupload': 'Проверка измени загруженного файла', // from v2.1 added 31.11.2015
			'ntfzipdl'    : 'Создание файла для скачки', // from v2.1.7 added 23.1.2016
			'ntfparents'  : 'Получение информации о пути', // from v2.1.17 added 2.11.2016
			'ntfchunkmerge': 'Обработка загруженного файла', // from v2.1.17 added 2.11.2016
			'ntftrash'    : 'Перемещение в корзину', // from v2.1.24 added 2.5.2017
			'ntfrestore'  : 'Восстановление из корзины', // from v2.1.24 added 3.5.2017
			'ntfchkdir'   : 'Проверка папки назначения', // from v2.1.24 added 3.5.2017
			'ntfundo'     : 'Отмена предыдущей операции', // from v2.1.27 added 31.07.2017
			'ntfredo'     : 'Восстановление предыдущей операции', // from v2.1.27 added 31.07.2017
			'ntfchkcontent' : 'Проверка содержимого', // from v2.1.41 added 3.8.2018

			/*********************************** volumes *********************************/
			'volume_Trash' : 'Корзина', //from v2.1.24 added 29.4.2017

			/************************************ dates **********************************/
			'dateUnknown' : 'неизвестно',
			'Today'       : 'Сегодня',
			'Yesterday'   : 'Вчера',
			'msJan'       : 'Янв',
			'msFeb'       : 'Фев',
			'msMar'       : 'Мар',
			'msApr'       : 'Апр',
			'msMay'       : 'Май',
			'msJun'       : 'Июн',
			'msJul'       : 'Июл',
			'msAug'       : 'Авг',
			'msSep'       : 'Сен',
			'msOct'       : 'Окт',
			'msNov'       : 'Ноя',
			'msDec'       : 'Дек',
			'January'     : 'Январь',
			'February'    : 'Февраль',
			'March'       : 'Март',
			'April'       : 'Апрель',
			'May'         : 'Май',
			'June'        : 'Июнь',
			'July'        : 'Июль',
			'August'      : 'Август',
			'September'   : 'Сентябрь',
			'October'     : 'Октябрь',
			'November'    : 'Ноябрь',
			'December'    : 'Декабрь',
			'Sunday'      : 'Воскресенье',
			'Monday'      : 'Понедельник',
			'Tuesday'     : 'Вторник',
			'Wednesday'   : 'Среда',
			'Thursday'    : 'Четверг',
			'Friday'      : 'Пятница',
			'Saturday'    : 'Суббота',
			'Sun'         : 'Вск',
			'Mon'         : 'Пнд',
			'Tue'         : 'Втр',
			'Wed'         : 'Срд',
			'Thu'         : 'Чтв',
			'Fri'         : 'Птн',
			'Sat'         : 'Сбт',

			/******************************** sort variants ********************************/
			'sortname'          : 'по имени',
			'sortkind'          : 'по типу',
			'sortsize'          : 'по размеру',
			'sortdate'          : 'по дате',
			'sortFoldersFirst'  : 'Папки в начале',
			'sortperm'          : 'по разрешениям', // from v2.1.13 added 13.06.2016
			'sortmode'          : 'по режиму',       // from v2.1.13 added 13.06.2016
			'sortowner'         : 'по владельцу',      // from v2.1.13 added 13.06.2016
			'sortgroup'         : 'по группе',      // from v2.1.13 added 13.06.2016
			'sortAlsoTreeview'  : 'Также и дерево каталогов',  // from v2.1.15 added 01.08.2016

			/********************************** new items **********************************/
			'untitled file.txt' : 'НовыйФайл.txt', // added 10.11.2015
			'untitled folder'   : 'НоваяПапка',   // added 10.11.2015
			'Archive'           : 'НовыйАрхив',  // from v2.1 added 10.11.2015
			'untitled file'     : 'НовыйФайл.$1',  // from v2.1.41 added 6.8.2018
			'extentionfile'     : '$1 Файл',    // from v2.1.41 added 6.8.2018
			'extentiontype'     : '$1: $2',      // from v2.1.43 added 17.10.2018

			/********************************** messages **********************************/
			'confirmReq'      : 'Необходимо подтверждение',
			'confirmRm'       : 'Вы уверены, что хотите удалить файлы?<br>Действие необратимо!',
			'confirmRepl'     : 'Заменить старый файл новым?',
			'confirmRest'     : 'Заменить существующий файл файлом из корзины?', // fromv2.1.24 added 5.5.2017
			'confirmConvUTF8' : 'Не UTF-8<br/>Сконвертировать в UTF-8?<br/>Данные станут UTF-8 при сохранении после конвертации.', // from v2.1 added 08.04.2014
			'confirmNonUTF8'  : 'Невозможно определить кодировку файла. Необходима предварительная конвертация файла в UTF-8 для дальнейшего редактирования.<br/>Выберите кодировку файла.', // from v2.1.19 added 28.11.2016
			'confirmNotSave'  : 'Произошли изменения.<br/>Если не сохраните изменения, то потеряете их.', // from v2.1 added 15.7.2015
			'confirmTrash'    : 'Вы уверены, что хотите переместить файлы в корзину?', //from v2.1.24 added 29.4.2017
			'confirmMove'     : 'Вы уверены, что хотите переместить файлы в "$1"?', //from v2.1.50 added 27.7.2019
			'apllyAll'        : 'Применить для всех',
			'name'            : 'Имя',
			'size'            : 'Размер',
			'perms'           : 'Доступ',
			'modify'          : 'Изменен',
			'kind'            : 'Тип',
			'read'            : 'чтение',
			'write'           : 'запись',
			'noaccess'        : 'нет доступа',
			'and'             : 'и',
			'unknown'         : 'неизвестно',
			'selectall'       : 'Выбрать все файлы',
			'selectfiles'     : 'Выбрать файл(ы)',
			'selectffile'     : 'Выбрать первый файл',
			'selectlfile'     : 'Выбрать последний файл',
			'viewlist'        : 'В виде списка',
			'viewicons'       : 'В виде иконок',
			'viewSmall'       : 'Маленькие иконки', // from v2.1.39 added 22.5.2018
			'viewMedium'      : 'Средние иконки', // from v2.1.39 added 22.5.2018
			'viewLarge'       : 'Большие иконки', // from v2.1.39 added 22.5.2018
			'viewExtraLarge'  : 'Очень большие иконки', // from v2.1.39 added 22.5.2018
			'places'          : 'Избранное',
			'calc'            : 'Вычислить',
			'path'            : 'Путь',
			'aliasfor'        : 'Указывает на',
			'locked'          : 'Защита',
			'dim'             : 'Размеры',
			'files'           : 'Файлы',
			'folders'         : 'Папки',
			'items'           : 'Объекты',
			'yes'             : 'да',
			'no'              : 'нет',
			'link'            : 'Ссылка',
			'searcresult'     : 'Результаты поиска',
			'selected'        : 'выбрано',
			'about'           : 'О программе',
			'shortcuts'       : 'Горячие клавиши',
			'help'            : 'Помощь',
			'webfm'           : 'Файловый менеджер для Web',
			'ver'             : 'Версия',
			'protocolver'     : 'версия протокола',
			'homepage'        : 'Сайт проекта',
			'docs'            : 'Документация',
			'github'          : 'Форкните на GitHub',
			'twitter'         : 'Следите в Twitter',
			'facebook'        : 'Присоединяйтесь на Facebook',
			'team'            : 'Команда',
			'chiefdev'        : 'ведущий разработчик',
			'developer'       : 'разработчик',
			'contributor'     : 'участник',
			'maintainer'      : 'сопровождение проекта',
			'translator'      : 'переводчик',
			'icons'           : 'Иконки',
			'dontforget'      : 'и не забудьте взять своё полотенце',
			'shortcutsof'     : 'Горячие клавиши отключены',
			'dropFiles'       : 'Перетащите файлы сюда',
			'or'              : 'или',
			'selectForUpload' : 'Выбрать файлы для загрузки',
			'moveFiles'       : 'Переместить файлы',
			'copyFiles'       : 'Скопировать файлы',
			'restoreFiles'    : 'Восстановить файлы', // from v2.1.24 added 5.5.2017
			'rmFromPlaces'    : 'Удалить из избранного',
			'aspectRatio'     : 'Соотношение сторон',
			'scale'           : 'Масштаб',
			'width'           : 'Ширина',
			'height'          : 'Высота',
			'resize'          : 'Изменить размер',
			'crop'            : 'Обрезать',
			'rotate'          : 'Повернуть',
			'rotate-cw'       : 'Повернуть на 90 градусов по часовой стрелке',
			'rotate-ccw'      : 'Повернуть на 90 градусов против часовой стрелке',
			'degree'          : '°',
			'netMountDialogTitle' : 'Подключить сетевой диск', // added 18.04.2012
			'protocol'            : 'Протокол', // added 18.04.2012
			'host'                : 'Хост', // added 18.04.2012
			'port'                : 'Порт', // added 18.04.2012
			'user'                : 'Пользователь', // added 18.04.2012
			'pass'                : 'Пароль', // added 18.04.2012
			'confirmUnmount'      : 'Вы хотите отключить $1?',  // from v2.1 added 30.04.2012
			'dropFilesBrowser': 'Перетащите или вставьте файлы из браузера', // from v2.1 added 30.05.2012
			'dropPasteFiles'  : 'Перетащите или вставьте файлы и ссылки сюда', // from v2.1 added 07.04.2014
			'encoding'        : 'Кодировка', // from v2.1 added 19.12.2014
			'locale'          : 'Локаль',   // from v2.1 added 19.12.2014
			'searchTarget'    : 'Цель: $1',                // from v2.1 added 22.5.2015
			'searchMime'      : 'Поиск по введенному MIME типу', // from v2.1 added 22.5.2015
			'owner'           : 'Владелец', // from v2.1 added 20.6.2015
			'group'           : 'Группа', // from v2.1 added 20.6.2015
			'other'           : 'Остальные', // from v2.1 added 20.6.2015
			'execute'         : 'Исполнить', // from v2.1 added 20.6.2015
			'perm'            : 'Разрешение', // from v2.1 added 20.6.2015
			'mode'            : 'Режим', // from v2.1 added 20.6.2015
			'emptyFolder'     : 'Папка пуста', // from v2.1.6 added 30.12.2015
			'emptyFolderDrop' : 'Папка пуста\\A Перетащите чтобы добавить', // from v2.1.6 added 30.12.2015
			'emptyFolderLTap' : 'Папка пуста\\A Долгое нажатие чтобы добавить', // from v2.1.6 added 30.12.2015
			'quality'         : 'Качество', // from v2.1.6 added 5.1.2016
			'autoSync'        : 'Авто синхронизация',  // from v2.1.6 added 10.1.2016
			'moveUp'          : 'Передвинуть вверх',  // from v2.1.6 added 18.1.2016
			'getLink'         : 'Получить URL ссылку', // from v2.1.7 added 9.2.2016
			'selectedItems'   : 'Выбранные объекты ($1)', // from v2.1.7 added 2.19.2016
			'folderId'        : 'ID папки', // from v2.1.10 added 3.25.2016
			'offlineAccess'   : 'Позволить автономный доступ', // from v2.1.10 added 3.25.2016
			'reAuth'          : 'Авторизоваться повторно', // from v2.1.10 added 3.25.2016
			'nowLoading'      : 'Загружается...', // from v2.1.12 added 4.26.2016
			'openMulti'       : 'Открыть несколько файлов', // from v2.1.12 added 5.14.2016
			'openMultiConfirm': 'Вы пытаетесь открыть $1 файл(а/ов). Вы уверены, что хотите открыть их в браузере?', // from v2.1.12 added 5.14.2016
			'emptySearch'     : 'Ничего не найдено', // from v2.1.12 added 5.16.2016
			'editingFile'     : 'Это редактируемый файл.', // from v2.1.13 added 6.3.2016
			'hasSelected'     : 'Вы выбрали $1 файл(-ов).', // from v2.1.13 added 6.3.2016
			'hasClipboard'    : 'У вас $1 файл(-ов) в буфере обмена.', // from v2.1.13 added 6.3.2016
			'incSearchOnly'   : 'Инкрементный поиск возможен только из текущего вида.', // from v2.1.13 added 6.30.2016
			'reinstate'       : 'Восстановить', // from v2.1.15 added 3.8.2016
			'complete'        : '$1 завершен', // from v2.1.15 added 21.8.2016
			'contextmenu'     : 'Контекстное меню', // from v2.1.15 added 9.9.2016
			'pageTurning'     : 'Переключение страницы', // from v2.1.15 added 10.9.2016
			'volumeRoots'     : 'Корни томов', // from v2.1.16 added 16.9.2016
			'reset'           : 'Сбросить', // from v2.1.16 added 1.10.2016
			'bgcolor'         : 'Фоновый цвет', // from v2.1.16 added 1.10.2016
			'colorPicker'     : 'Выбор цвета', // from v2.1.16 added 1.10.2016
			'8pxgrid'         : '8px сетка', // from v2.1.16 added 4.10.2016
			'enabled'         : 'Включено', // from v2.1.16 added 4.10.2016
			'disabled'        : 'Отключено', // from v2.1.16 added 4.10.2016
			'emptyIncSearch'  : 'Ничего не найдено в текущем виде.\\AНажмите [Enter] для развертывания цели поиска.', // from v2.1.16 added 5.10.2016
			'emptyLetSearch'  : 'Поиск по первому символу не дал результатов в текущем виде.', // from v2.1.23 added 24.3.2017
			'textLabel'       : 'Текстовая метка', // from v2.1.17 added 13.10.2016
			'minsLeft'        : '$1 минут осталось', // from v2.1.17 added 13.11.2016
			'openAsEncoding'  : 'Переоткрыть с выбранной кодировкой', // from v2.1.19 added 2.12.2016
			'saveAsEncoding'  : 'Сохранить с выбранной кодировкой', // from v2.1.19 added 2.12.2016
			'selectFolder'    : 'Выбрать папку', // from v2.1.20 added 13.12.2016
			'firstLetterSearch': 'Поиск по первому символу', // from v2.1.23 added 24.3.2017
			'presets'         : 'Пресеты', // from v2.1.25 added 26.5.2017
			'tooManyToTrash'  : 'Слишком много файлов для перемещения в корзину.', // from v2.1.25 added 9.6.2017
			'TextArea'        : 'Текстовая область', // from v2.1.25 added 14.6.2017
			'folderToEmpty'   : 'Очистить папку "$1".', // from v2.1.25 added 22.6.2017
			'filderIsEmpty'   : 'Нет файлов в паке "$1".', // from v2.1.25 added 22.6.2017
			'preference'      : 'Настройки', // from v2.1.26 added 28.6.2017
			'language'        : 'Язык', // from v2.1.26 added 28.6.2017
			'clearBrowserData': 'Сбросить настройки для этого браузера', // from v2.1.26 added 28.6.2017
			'toolbarPref'     : 'Настройки панели', // from v2.1.27 added 2.8.2017
			'charsLeft'       : '... еще символов: $1.',  // from v2.1.29 added 30.8.2017
			'linesLeft'       : '... еще строк: $1.',  // from v2.1.52 added 16.1.2020
			'sum'             : 'Общий размер', // from v2.1.29 added 28.9.2017
			'roughFileSize'   : 'Приблизительный размер файла', // from v2.1.30 added 2.11.2017
			'autoFocusDialog' : 'Фокус на элементе диалога при наведении мыши',  // from v2.1.30 added 2.11.2017
			'select'          : 'Выбрать', // from v2.1.30 added 23.11.2017
			'selectAction'    : 'Действие при выборе файла', // from v2.1.30 added 23.11.2017
			'useStoredEditor' : 'Открывать в редакторе, выбранном в прошлый раз', // from v2.1.30 added 23.11.2017
			'selectinvert'    : 'Выбрать элементы с инвертированием', // from v2.1.30 added 25.11.2017
			'renameMultiple'  : 'Переименовать выбранные элементы ($1 шт.) в $2?<br/>Действие нельзя отменить!', // from v2.1.31 added 4.12.2017
			'batchRename'     : 'Групповое переименование', // from v2.1.31 added 8.12.2017
			'plusNumber'      : '+ Число', // from v2.1.31 added 8.12.2017
			'asPrefix'        : 'Добавить префикс', // from v2.1.31 added 8.12.2017
			'asSuffix'        : 'Добавить суффикс', // from v2.1.31 added 8.12.2017
			'changeExtention' : 'Изменить расширение', // from v2.1.31 added 8.12.2017
			'columnPref'      : 'Настройки колонок (для просмотра в виде списка)', // from v2.1.32 added 6.2.2018
			'reflectOnImmediate' : 'Все изменения будут немедленно отражены в архиве.', // from v2.1.33 added 2.3.2018
			'reflectOnUnmount'   : 'Изменения не вступят в силу до тех пор, пока вы не размонтируете этот том.', // from v2.1.33 added 2.3.2018
			'unmountChildren' : 'Тома, смонтированные на этом томе, также будут размонтированы. Вы хотите отключить его?', // from v2.1.33 added 5.3.2018
			'selectionInfo'   : 'Свойства', // from v2.1.33 added 7.3.2018
			'hashChecker'     : 'Алгоритмы для отображения хеш-сумм файлов', // from v2.1.33 added 10.3.2018
			'infoItems'       : 'Элементы в панели свойств', // from v2.1.38 added 28.3.2018
			'pressAgainToExit': 'Нажмите снова для выхода.', // from v2.1.38 added 1.4.2018
			'toolbar'         : 'Панель', // from v2.1.38 added 4.4.2018
			'workspace'       : 'Рабочая область', // from v2.1.38 added 4.4.2018
			'dialog'          : 'Диалог', // from v2.1.38 added 4.4.2018
			'all'             : 'Все', // from v2.1.38 added 4.4.2018
			'iconSize'        : 'Размер иконок (В виде иконок)', // from v2.1.39 added 7.5.2018
			'editorMaximized' : 'Открывать редактор в развернутом виде', // from v2.1.40 added 30.6.2018
			'editorConvNoApi' : 'Так как конвертация с помощью API недоступно, произведите конвертацию на веб-сайте.', //from v2.1.40 added 8.7.2018
			'editorConvNeedUpload' : 'После конвертации вы должны загрузить скачанный файл, чтобы сохранить его.', //from v2.1.40 added 8.7.2018
			'convertOn'       : 'Конвертировать на сайте $1', // from v2.1.40 added 10.7.2018
			'integrations'    : 'Интеграции', // from v2.1.40 added 11.7.2018
			'integrationWith' : 'Менеджер elFinder интегрирован со следующими внешними сервисами. Ознакомьтесь с правилами пользования, политиками безопасности и др. перед их использованием.', // from v2.1.40 added 11.7.2018
			'showHidden'      : 'Показать скрытые элементы', // from v2.1.41 added 24.7.2018
			'hideHidden'      : 'Скрыть скрытые элементы', // from v2.1.41 added 24.7.2018
			'toggleHidden'    : 'Показать/скрыть скрытые элементы', // from v2.1.41 added 24.7.2018
			'makefileTypes'   : 'Типы файлов в меню "Новый файл"', // from v2.1.41 added 7.8.2018
			'typeOfTextfile'  : 'Тип текстового файла', // from v2.1.41 added 7.8.2018
			'add'             : 'Добавить', // from v2.1.41 added 7.8.2018
			'theme'           : 'Тема', // from v2.1.43 added 19.10.2018
			'default'         : 'По умолчанию', // from v2.1.43 added 19.10.2018
			'description'     : 'Описание', // from v2.1.43 added 19.10.2018
			'website'         : 'Веб-сайт', // from v2.1.43 added 19.10.2018
			'author'          : 'Автор', // from v2.1.43 added 19.10.2018
			'email'           : 'Эл. адрес', // from v2.1.43 added 19.10.2018
			'license'         : 'Лицензия', // from v2.1.43 added 19.10.2018
			'exportToSave'    : 'Невозможно сохранить файл. Чтобы не потерять изменения, экспортируйте их на свой ПК.', // from v2.1.44 added 1.12.2018
			'dblclickToSelect': 'Двойной клик по файлу для его выбора.', // from v2.1.47 added 22.1.2019
			'useFullscreen'   : 'Использовать полноэкранный режим', // from v2.1.47 added 19.2.2019

			/********************************** mimetypes **********************************/
			'kindUnknown'     : 'Неизвестный',
			'kindRoot'        : 'Корень тома', // from v2.1.16 added 16.10.2016
			'kindFolder'      : 'Папка',
			'kindSelects'     : 'Выбор', // from v2.1.29 added 29.8.2017
			'kindAlias'       : 'Ссылка',
			'kindAliasBroken' : 'Битая ссылка',
			// applications
			'kindApp'         : 'Приложение',
			'kindPostscript'  : 'Документ Postscript',
			'kindMsOffice'    : 'Документ Microsoft Office',
			'kindMsWord'      : 'Документ Microsoft Word',
			'kindMsExcel'     : 'Документ Microsoft Excel',
			'kindMsPP'        : 'Презентация Microsoft Powerpoint',
			'kindOO'          : 'Документ Open Office',
			'kindAppFlash'    : 'Приложение Flash',
			'kindPDF'         : 'Документ PDF',
			'kindTorrent'     : 'Файл Bittorrent',
			'kind7z'          : 'Архив 7z',
			'kindTAR'         : 'Архив TAR',
			'kindGZIP'        : 'Архив GZIP',
			'kindBZIP'        : 'Архив BZIP',
			'kindXZ'          : 'Архив XZ',
			'kindZIP'         : 'Архив ZIP',
			'kindRAR'         : 'Архив RAR',
			'kindJAR'         : 'Файл Java JAR',
			'kindTTF'         : 'Шрифт True Type',
			'kindOTF'         : 'Шрифт Open Type',
			'kindRPM'         : 'Пакет RPM',
			// texts
			'kindText'        : 'Текстовый документ',
			'kindTextPlain'   : 'Простой текст',
			'kindPHP'         : 'Исходник PHP',
			'kindCSS'         : 'Таблицы стилей CSS',
			'kindHTML'        : 'Документ HTML',
			'kindJS'          : 'Исходник Javascript',
			'kindRTF'         : 'Расширенный текстовый формат',
			'kindC'           : 'Исходник C',
			'kindCHeader'     : 'Заголовочный файл C',
			'kindCPP'         : 'Исходник C++',
			'kindCPPHeader'   : 'Заголовочный файл C++',
			'kindShell'       : 'Скрипт Unix shell',
			'kindPython'      : 'Исходник Python',
			'kindJava'        : 'Исходник Java',
			'kindRuby'        : 'Исходник Ruby',
			'kindPerl'        : 'Исходник Perl',
			'kindSQL'         : 'Исходник SQL',
			'kindXML'         : 'Документ XML',
			'kindAWK'         : 'Исходник AWK',
			'kindCSV'         : 'Текст с разделителями',
			'kindDOCBOOK'     : 'Документ Docbook XML',
			'kindMarkdown'    : 'Текст Markdown', // added 20.7.2015
			// images
			'kindImage'       : 'Изображение',
			'kindBMP'         : 'Изображение BMP',
			'kindJPEG'        : 'Изображение JPEG',
			'kindGIF'         : 'Изображение GIF',
			'kindPNG'         : 'Изображение PNG',
			'kindTIFF'        : 'Изображение TIFF',
			'kindTGA'         : 'Изображение TGA',
			'kindPSD'         : 'Изображение Adobe Photoshop',
			'kindXBITMAP'     : 'Изображение X bitmap',
			'kindPXM'         : 'Изображение Pixelmator',
			// media
			'kindAudio'       : 'Аудио файл',
			'kindAudioMPEG'   : 'Аудио MPEG',
			'kindAudioMPEG4'  : 'Аудио MPEG-4',
			'kindAudioMIDI'   : 'Аудио MIDI',
			'kindAudioOGG'    : 'Аудио Ogg Vorbis',
			'kindAudioWAV'    : 'Аудио WAV',
			'AudioPlaylist'   : 'Плейлист MP3',
			'kindVideo'       : 'Видео файл',
			'kindVideoDV'     : 'Видео DV',
			'kindVideoMPEG'   : 'Видео MPEG',
			'kindVideoMPEG4'  : 'Видео MPEG-4',
			'kindVideoAVI'    : 'Видео AVI',
			'kindVideoMOV'    : 'Видео Quick Time',
			'kindVideoWM'     : 'Видео Windows Media',
			'kindVideoFlash'  : 'Видео Flash',
			'kindVideoMKV'    : 'Видео Matroska',
			'kindVideoOGG'    : 'Видео Ogg'
		}
	};
}));

js/i18n/elfinder.hu.js000064400000105042151215013370010500 0ustar00/**
 * Hungarian translation
 * @author Gáspár Lajos <info@glsys.eu>
 * @author karrak1
 * @version 2022-03-02
 */
 (function(root, factory) {
	if (typeof define === 'function' && define.amd) {
		define(['elfinder'], factory);
	} else if (typeof exports !== 'undefined') {
		module.exports = factory(require('elfinder'));
	} else {
		factory(root.elFinder);
	}
}(this, function(elFinder) {
	elFinder.prototype.i18.hu = {
		translator : 'Gáspár Lajos &lt;info@glsys.eu&gt;, karrak1',
		language   : 'Hungarian',
		direction  : 'ltr',
		dateFormat : 'Y.F.d H:i:s', // will show like: 2022.Március.02 11:28:34
		fancyDateFormat : '$1 H:i', // will show like: Ma 11:28
		nonameDateFormat : 'ymd-His', // noname upload will show like: 220302-112834
		messages   : {
			'getShareText' : 'Részvény',
			'Editor ': 'Kódszerkesztő',

			/********************************** errors **********************************/
			'error'                : 'Hiba',
			'errUnknown'           : 'Ismeretlen hiba.',
			'errUnknownCmd'        : 'Ismeretlen parancs.',
			'errJqui'              : 'Hibás jQuery UI konfiguráció. A "selectable", "draggable" és a "droppable" komponensek szükségesek.',
			'errNode'              : 'Az elFinder "DOM" elem létrehozását igényli.',
			'errURL'               : 'Hibás elFinder konfiguráció! "URL" paraméter nincs megadva.',
			'errAccess'            : 'Hozzáférés megtagadva.',
			'errConnect'           : 'Nem sikerült csatlakozni a kiszolgálóhoz.',
			'errAbort'             : 'Kapcsolat megszakítva.',
			'errTimeout'           : 'Kapcsolat időtúllépés.',
			'errNotFound'          : 'A backend nem elérhető.',
			'errResponse'          : 'Hibás backend válasz.',
			'errConf'              : 'Hibás backend konfiguráció.',
			'errJSON'              : 'PHP JSON modul nincs telepítve.',
			'errNoVolumes'         : 'Nem állnak rendelkezésre olvasható kötetek.',
			'errCmdParams'         : 'érvénytelen paraméterek a parancsban. ("$1")',
			'errDataNotJSON'       : 'A válasz nem JSON típusú adat.',
			'errDataEmpty'         : 'Nem érkezett adat.',
			'errCmdReq'            : 'A backend kérelem parancsnevet igényel.',
			'errOpen'              : '"$1" megnyitása nem sikerült.',
			'errNotFolder'         : 'Az objektum nem egy mappa.',
			'errNotFile'           : 'Az objektum nem egy fájl.',
			'errRead'              : '"$1" olvasása nem sikerült.',
			'errWrite'             : '"$1" írása nem sikerült.',
			'errPerm'              : 'Engedély megtagadva.',
			'errLocked'            : '"$1" zárolás alatt van, és nem lehet átnevezni, mozgatni vagy eltávolítani.',
			'errExists'            : '"$1" nevű fájl már létezik.',
			'errInvName'           : 'Érvénytelen fáljnév.',
			'errInvDirname'        : 'Érvénytelen mappanév.',  // from v2.1.24 added 12.4.2017
			'errFolderNotFound'    : 'Mappa nem található.',
			'errFileNotFound'      : 'Fájl nem található.',
			'errTrgFolderNotFound' : 'Cél mappa nem található. ("$1")',
			'errPopup'             : 'A böngésző megakadályozta egy felugró ablak megnyitását. A fájl megnyitását tegye lehetővé a böngésző beállitásaiban.',
			'errMkdir'             : '"$1" mappa létrehozása sikertelen.',
			'errMkfile'            : '"$1" fájl létrehozása sikertelen.',
			'errRename'            : '"$1" átnevezése sikertelen.',
			'errCopyFrom'          : 'Fájlok másolása a kötetről nem megengedett. ("$1")',
			'errCopyTo'            : 'Fájlok másolása a kötetre nem megengedett. ("$1")',
			'errMkOutLink'         : 'Hivatkozás létrehozása a root köteten kívül nem megengedett.', // from v2.1 added 03.10.2015
			'errUpload'            : 'Feltöltési hiba.',  // old name - errUploadCommon
			'errUploadFile'        : 'Nem sikerült a fájlt feltölteni. ($1)', // old name - errUpload
			'errUploadNoFiles'     : 'Nem található fájl feltöltéshez.',
			'errUploadTotalSize'   : 'Az adat meghaladja a maximálisan megengedett méretet.', // old name - errMaxSize
			'errUploadFileSize'    : 'A fájl meghaladja a maximálisan megengedett méretet.', //  old name - errFileMaxSize
			'errUploadMime'        : 'A fájltípus nem engedélyezett.',
			'errUploadTransfer'    : '"$1" transzfer hiba.',
			'errUploadTemp'        : 'Sikertelen az ideiglenes fájl léterhezozása feltöltéshez.', // from v2.1 added 26.09.2015
			'errNotReplace'        : 'Az objektum "$1" már létezik ezen a helyen, és nem lehet cserélni másik típusra', // new
			'errReplace'           : '"$1" nem cserélhető.',
			'errSave'              : '"$1" mentése nem sikerült.',
			'errCopy'              : '"$1" másolása nem sikerült.',
			'errMove'              : '"$1" áthelyezése nem sikerült.',
			'errCopyInItself'      : '"$1" nem másolható saját magára.',
			'errRm'                : '"$1" törlése nem sikerült.',
			'errTrash'             : 'Nem mehet a kukába.', // from v2.1.24 added 30.4.2017
			'errRmSrc'             : 'Forrásfájl(ok) eltávolítása sikertelen.',
			'errExtract'           : 'Nem sikerült kikibontani a "$1" fájlokat.',
			'errArchive'           : 'Nem sikerült létrehozni az archívumot.',
			'errArcType'           : 'Nem támogatott archívum típus.',
			'errNoArchive'         : 'A fájl nem archív, vagy nem támogatott archívumtípust tartalmaz.',
			'errCmdNoSupport'      : 'A backend nem támogatja ezt a parancsot.',
			'errReplByChild'       : 'Az „$1” mappát nem lehet helyettesíteni egy abban található elemmel.',
			'errArcSymlinks'       : 'Biztonsági okokból az archívumok kicsomagolásának megtagadása szimbolikus linkeket vagy fájlokat tartalmaz, amelyek nem engedélyezettek.', // edited 24.06.2012
			'errArcMaxSize'        : 'Az archív fájlok meghaladják a megengedett legnagyobb méretet.',
			'errResize'            : 'Nem lehet átméretezni a (z) "$1".',
			'errResizeDegree'      : 'Érvénytelen forgatási fok.',  // added 7.3.2013
			'errResizeRotate'      : 'Nem lehet elforgatni a képet.',  // added 7.3.2013
			'errResizeSize'        : 'Érvénytelen képméret.',  // added 7.3.2013
			'errResizeNoChange'    : 'A kép mérete nem változott.',  // added 7.3.2013
			'errUsupportType'      : 'Nem támogatott fájl típus',
			'errNotUTF8Content'    : 'Az "$1" fájl nincs az UTF-8-ban, és nem szerkeszthető.',  // added 9.11.2011
			'errNetMount'          : 'Nem lehet beilleszteni a(z) "$1".', // added 17.04.2012
			'errNetMountNoDriver'  : 'Nem támogatott protokoll.',     // added 17.04.2012
			'errNetMountFailed'    : 'A csatlakozás nem sikerült.',         // added 17.04.2012
			'errNetMountHostReq'   : 'Host szükséges.', // added 18.04.2012
			'errSessionExpires'    : 'A session inaktivitás miatt lejárt.',
			'errCreatingTempDir'   : 'Nem lehet ideiglenes könyvtárat létrehozni: "$1"',
			'errFtpDownloadFile'   : 'Nem lehet letölteni a fájlt az FTP-ről: "$1"',
			'errFtpUploadFile'     : 'Nem lehet feltölteni a fájlt az FTP-re: "$1"',
			'errFtpMkdir'          : 'Nem sikerült távoli könyvtárat létrehozni az FTP-n: "$1"',
			'errArchiveExec'       : 'Hiba a fájlok archiválásakor: "$1"',
			'errExtractExec'       : 'Hiba a fájlok kibontásakor: "$1"',
			'errNetUnMount'        : 'Nem lehet leválasztani', // from v2.1 added 30.04.2012
			'errConvUTF8'          : 'Nem konvertálható UTF-8-ra', // from v2.1 added 08.04.2014
			'errFolderUpload'      : 'Próbálja ki a Google Chrome-ot, ha szeretné feltölteni a mappát.', // from v2.1 added 26.6.2015
			'errSearchTimeout'     : 'Dőtúllépés a(z) "$1" keresése közben. A keresési eredmény részleges.', // from v2.1 added 12.1.2016
			'errReauthRequire'     : 'Új engedélyre van szükség.', // from v2.1.10 added 24.3.2016
			'errMaxTargets'        : 'A választható tételek maximális száma 1 USD.', // from v2.1.17 added 17.10.2016
			'errRestore'           : 'Nem lehet visszaállítani a kukából. Nem lehet azonosítani a visszaállítási célt.', // from v2.1.24 added 3.5.2017
			'errEditorNotFound'    : 'A szerkesztő nem található ehhez a fájltípushoz.', // from v2.1.25 added 23.5.2017
			'errServerError'       : 'Hiba történt a szerver oldalon.', // from v2.1.25 added 16.6.2017
			'errEmpty'             : 'Nem sikerült üríteni a(z) "$1" mappát.', // from v2.1.25 added 22.6.2017
			'moreErrors'           : '$1 további hiba van.', // from v2.1.44 added 9.12.2018
			'errMaxMkdirs'         : 'Egyszerre legfeljebb $1 mappát hozhat létre.', // from v2.1.58 added 20.6.2021

			/******************************* commands names ********************************/
			'cmdarchive'   : 'Archívum létrehozása',
			'cmdback'      : 'Vissza',
			'cmdcopy'      : 'Másolás',
			'cmdcut'       : 'Kivágás',
			'cmddownload'  : 'Letöltés',
			'cmdduplicate' : 'Másolat készítés',
			'cmdedit'      : 'Szerkesztés',
			'cmdextract'   : 'Kibontás',
			'cmdforward'   : 'Előre',
			'cmdgetfile'   : 'Fájlok kijelölése',
			'cmdhelp'      : 'Erről a programról...',
			'cmdhome'      : 'Főkönyvtár',
			'cmdinfo'      : 'Tulajdonságok',
			'cmdmkdir'     : 'Új mappa',
			'cmdmkdirin'   : 'Új mappába', // from v2.1.7 added 19.2.2016
			'cmdmkfile'    : 'Új fájl',
			'cmdopen'      : 'Megnyitás',
			'cmdpaste'     : 'Beillesztés',
			'cmdquicklook' : 'Előnézet',
			'cmdreload'    : 'Frissítés',
			'cmdrename'    : 'Átnevezés',
			'cmdrm'        : 'Törlés',
			'cmdtrash'     : 'A kukába', //from v2.1.24 added 29.4.2017
			'cmdrestore'   : 'visszaállítás', //from v2.1.24 added 3.5.2017
			'cmdsearch'    : 'Keresés',
			'cmdup'        : 'Ugrás a szülőmappába',
			'cmdupload'    : 'Feltöltés',
			'cmdview'      : 'Nézet',
			'cmdresize'    : 'Átméretezés és forgatás',
			'cmdsort'      : 'Rendezés',
			'cmdnetmount'  : 'Csatlakoztassa a hálózat hangerejét', // added 18.04.2012
			'cmdnetunmount': 'Leválaszt', // from v2.1 added 30.04.2012
			'cmdplaces'    : 'Helyekhez', // added 28.12.2014
			'cmdchmod'     : 'Módváltás', // from v2.1 added 20.6.2015
			'cmdopendir'   : 'Mappa megnyitása', // from v2.1 added 13.1.2016
			'cmdcolwidth'  : 'Állítsa vissza az oszlop szélességét', // from v2.1.13 added 12.06.2016
			'cmdfullscreen': 'Teljes képernyő', // from v2.1.15 added 03.08.2016
			'cmdmove'      : 'Mozog', // from v2.1.15 added 21.08.2016
			'cmdempty'     : 'Ürítse ki a mappát', // from v2.1.25 added 22.06.2017
			'cmdundo'      : 'Visszavonás', // from v2.1.27 added 31.07.2017
			'cmdredo'      : 'Újra', // from v2.1.27 added 31.07.2017
			'cmdpreference': 'preferenciák', // from v2.1.27 added 03.08.2017
			'cmdselectall' : 'Mindet kiválaszt', // from v2.1.28 added 15.08.2017
			'cmdselectnone': 'Válasszon egyet sem', // from v2.1.28 added 15.08.2017
			'cmdselectinvert': 'Fordított kijelölés', // from v2.1.28 added 15.08.2017
			'cmdopennew'   : 'Fordított kijelölés', // from v2.1.38 added 3.4.2018
			'cmdhide'      : 'Fordított kijelölés', // from v2.1.41 added 24.7.2018

			/*********************************** buttons ***********************************/
			'btnClose'  : 'Bezár',
			'btnSave'   : 'Ment',
			'btnRm'     : 'Töröl',
			'btnApply'  : 'Alkalmaz',
			'btnCancel' : 'Mégsem',
			'btnNo'     : 'Nem',
			'btnYes'    : 'Igen',
			'btnMount'  : 'Csatlakoztat',  // added 18.04.2012
			'btnApprove': 'Tovább $1 és jóváhagyás', // from v2.1 added 26.04.2012
			'btnUnmount': 'Leválaszt', // from v2.1 added 30.04.2012
			'btnConv'   : 'Átalakít', // from v2.1 added 08.04.2014
			'btnCwd'    : 'Itt',      // from v2.1 added 22.5.2015
			'btnVolume' : 'Hangerő',    // from v2.1 added 22.5.2015
			'btnAll'    : 'Összes',       // from v2.1 added 22.5.2015
			'btnMime'   : 'MIME Tipus', // from v2.1 added 22.5.2015
			'btnFileName':'Fájl név',  // from v2.1 added 22.5.2015
			'btnSaveClose': 'Mentés és Kilépés', // from v2.1 added 12.6.2015
			'btnBackup' : 'Biztonsági mentés', // fromv2.1 added 28.11.2015
			'btnRename'    : 'Átnevezés',      // from v2.1.24 added 6.4.2017
			'btnRenameAll' : 'Átnevezés (összes)', // from v2.1.24 added 6.4.2017
			'btnPrevious' : 'Előző ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnNext'     : 'Következő ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnSaveAs'   : 'Mentés másként', // from v2.1.25 added 24.5.2017

			/******************************** notifications ********************************/
			'ntfopen'     : 'Mappa megnyitás',
			'ntffile'     : 'Fájl megnyitás',
			'ntfreload'   : 'A mappa tartalmának újratöltése',
			'ntfmkdir'    : 'Mappa létrehozása',
			'ntfmkfile'   : 'Fájlok létrehozása',
			'ntfrm'       : 'Fájlok törélse',
			'ntfcopy'     : 'Fájlok másolása',
			'ntfmove'     : 'Fájlok áthelyezése',
			'ntfprepare'  : 'Meglévő elemek ellenőrzése',
			'ntfrename'   : 'Fájlok átnevezése',
			'ntfupload'   : 'Fájlok feltöltése',
			'ntfdownload' : 'Fájlok letöltése',
			'ntfsave'     : 'Fájlok mentése',
			'ntfarchive'  : 'Archívum létrehozása',
			'ntfextract'  : 'Kibontás archívumból',
			'ntfsearch'   : 'Fájlok keresése',
			'ntfresize'   : 'Képek átméretezése',
			'ntfsmth'     : 'Csinál valamit >_<',
			'ntfloadimg'  : 'Kép betöltése',
			'ntfnetmount' : 'Hálózati meghajtó hozzáadása', // added 18.04.2012
			'ntfnetunmount': 'Hálózati meghajtó leválasztása', // from v2.1 added 30.04.2012
			'ntfdim'      : 'Képméret megállapítása', // added 20.05.2013
			'ntfreaddir'  : 'A mappa adatainak olvasása', // from v2.1 added 01.07.2013
			'ntfurl'      : 'A link URL-jének lekérdezése', // from v2.1 added 11.03.2014
			'ntfchmod'    : 'A fájlmód megváltoztatása', // from v2.1 added 20.6.2015
			'ntfpreupload': 'A feltöltött fájlnév ellenőrzése', // from v2.1 added 31.11.2015
			'ntfzipdl'    : 'Fájl létrehozása letöltésre', // from v2.1.7 added 23.1.2016
			'ntfparents'  : 'Útvonalinformációk lekérése', // from v2.1.17 added 2.11.2016
			'ntfchunkmerge': 'A feltöltött fájl feldolgozása', // from v2.1.17 added 2.11.2016
			'ntftrash'    : 'A szemétbe dobják', // from v2.1.24 added 2.5.2017
			'ntfrestore'  : 'Visszaállítás a kukából', // from v2.1.24 added 3.5.2017
			'ntfchkdir'   : 'Célmappa ellenőrzése', // from v2.1.24 added 3.5.2017
			'ntfundo'     : 'Az előző művelet visszavonása', // from v2.1.27 added 31.07.2017
			'ntfredo'     : 'Az előző visszavonás újraindítása', // from v2.1.27 added 31.07.2017
			'ntfchkcontent' : 'A tartalom ellenőrzése', // from v2.1.41 added 3.8.2018

			/*********************************** volumes *********************************/
			'volume_Trash' : 'Szemét', //from v2.1.24 added 29.4.2017

			/************************************ dates **********************************/
			'dateUnknown' : 'Ismeretlen',
			'Today'       : 'Ma',
			'Yesterday'   : 'Tegnap',
			'msJan'       : 'jan',
			'msFeb'       : 'febr',
			'msMar'       : 'márc',
			'msApr'       : 'ápr',
			'msMay'       : 'máj',
			'msJun'       : 'jún',
			'msJul'       : 'júl',
			'msAug'       : 'aug',
			'msSep'       : 'szept',
			'msOct'       : 'okt',
			'msNov'       : 'nov',
			'msDec'       : 'dec',
			'January'     : 'Január',
			'February'    : 'Február',
			'March'       : 'Március',
			'April'       : 'Április',
			'May'         : 'Május',
			'June'        : 'Június',
			'July'        : 'Július',
			'August'      : 'Augusztus',
			'September'   : 'Szeptember',
			'October'     : 'Október',
			'November'    : 'november',
			'December'    : 'december',
			'Sunday'      : 'Vasárnap',
			'Monday'      : 'Hétfő',
			'Tuesday'     : 'Kedd',
			'Wednesday'   : 'Szerda',
			'Thursday'    : 'Csütörtök',
			'Friday'      : 'Péntek',
			'Saturday'    : 'Szombat',
			'Sun'         : 'V',
			'Mon'         : 'H',
			'Tue'         : 'K',
			'Wed'         : 'Sz',
			'Thu'         : 'Cs',
			'Fri'         : 'P',
			'Sat'         : 'Szo',

			/******************************** sort variants ********************************/
			'sortname'          : 'név szerint',
			'sortkind'          : 'kedvesen',
			'sortsize'          : 'méret szerint',
			'sortdate'          : 'dátum szerint',
			'sortFoldersFirst'  : 'Először a mappák',
			'sortperm'          : 'engedély alapján', // from v2.1.13 added 13.06.2016
			'sortmode'          : 'mód szerint',       // from v2.1.13 added 13.06.2016
			'sortowner'         : 'tulajdonos alapján',      // from v2.1.13 added 13.06.2016
			'sortgroup'         : 'csoportok szerint',      // from v2.1.13 added 13.06.2016
			'sortAlsoTreeview'  : 'Szintén Treeview',  // from v2.1.15 added 01.08.2016

			/********************************** new items **********************************/
			'untitled file.txt' : 'NewFile.txt', // added 10.11.2015
			'untitled folder'   : 'Új mappa',   // added 10.11.2015
			'Archive'           : 'ÚjArchívum',  // from v2.1 added 10.11.2015
			'untitled file'     : 'Új fájl.$1',  // from v2.1.41 added 6.8.2018
			'extentionfile'     : 'Új fájl.$1',    // from v2.1.41 added 6.8.2018
			'extentiontype'     : '$1: $2',      // from v2.1.43 added 17.10.2018

			/********************************** messages **********************************/
			'confirmReq'      : 'Megerősítés szükséges',
			'confirmRm'       : 'Valóban törölni akarja a kijelölt adatokat?<br/>Ez később nem fordítható vissza!',
			'confirmRepl'     : 'Lecseréli a régi fájlt egy újra? (Ha mappákat tartalmaz, a rendszer egyesíti. A biztonsági mentéshez és a cseréhez válassza a Biztonsági mentés lehetőséget.)',
			'confirmRest'     : 'Lecseréli a meglévő elemet a kukában lévő elemre?', // fromv2.1.24 added 5.5.2017
			'confirmConvUTF8' : 'Nem UTF-8.<br/>Átalakítsam UTF-8-ra?<br/>A tartalom mentés után UTF-8 lesz..', // from v2.1 added 08.04.2014
			'confirmNonUTF8'  : 'Ennek a fájlnak a karakterkódolása nem észlelhető. Átmenetileg át kell konvertálni UTF-8-ra a szerkesztéshez.<br/>Kérjük, válassza ki a fájl karakterkódolását.', // from v2.1.19 added 28.11.2016
			'confirmNotSave'  : 'Megváltozott.<br/>Módosítások elvesznek, ha nem menti el azokat.', // from v2.1 added 15.7.2015
			'confirmTrash'    : 'Biztos, hogy áthelyezi az elemeket a kukába?', //from v2.1.24 added 29.4.2017
			'confirmMove'     : 'Biztosan áthelyezi az elemeket ide: "$1"?', //from v2.1.50 added 27.7.2019
			'apllyAll'        : 'Mindenre vonatkozik',
			'name'            : 'Név',
			'size'            : 'Méret',
			'perms'           : 'Jogok',
			'modify'          : 'Módosítva',
			'kind'            : 'Típus',
			'read'            : 'olvasás',
			'write'           : 'írás',
			'noaccess'        : '-',
			'and'             : 'és',
			'unknown'         : 'ismeretlen',
			'selectall'       : 'Összes kijelölése',
			'selectfiles'     : 'Fájlok kijelölése',
			'selectffile'     : 'Első fájl kijelölése',
			'selectlfile'     : 'Utolsó fájl kijelölése',
			'viewlist'        : 'Lista nézet',
			'viewicons'       : 'Ikon nézet',
			'viewSmall'       : 'Kis ikonok', // from v2.1.39 added 22.5.2018
			'viewMedium'      : 'Közepes ikonok', // from v2.1.39 added 22.5.2018
			'viewLarge'       : 'Nagy ikonok', // from v2.1.39 added 22.5.2018
			'viewExtraLarge'  : 'Extra nagy ikonok', // from v2.1.39 added 22.5.2018
			'places'          : 'Helyek',
			'calc'            : 'Kiszámítja',
			'path'            : 'Útvonal',
			'aliasfor'        : 'Cél',
			'locked'          : 'Zárolt',
			'dim'             : 'Méretek',
			'files'           : 'Fájlok',
			'folders'         : 'Mappák',
			'items'           : 'Elemek',
			'yes'             : 'igen',
			'no'              : 'nem',
			'link'            : 'Parancsikon',
			'searcresult'     : 'Keresés eredménye',
			'selected'        : 'kijelölt elemek',
			'about'           : 'Névjegy',
			'shortcuts'       : 'Gyorsbillenytyűk',
			'help'            : 'Súgó',
			'webfm'           : 'Webes fájlkezelő',
			'ver'             : 'Verzió',
			'protocolver'     : 'protokol verzió',
			'homepage'        : 'Projekt honlap',
			'docs'            : 'Dokumentáció',
			'github'          : 'Hozz létre egy új verziót a Github-on',
			'twitter'         : 'Kövess minket a twitter-en',
			'facebook'        : 'Csatlakozz hozzánk a facebook-on',
			'team'            : 'Csapat',
			'chiefdev'        : 'vezető fejlesztő',
			'developer'       : 'fejlesztő',
			'contributor'     : 'külsős hozzájáruló',
			'maintainer'      : 'karbantartó',
			'translator'      : 'fordító',
			'icons'           : 'Ikonok',
			'dontforget'      : 'törölközőt ne felejts el hozni!',
			'shortcutsof'     : 'Parancsikonok letiltva',
			'dropFiles'       : 'Fájlok dobása ide',
			'or'              : 'vagy',
			'selectForUpload' : 'fájlok böngészése',
			'moveFiles'       : 'Fájlok áthelyezése',
			'copyFiles'       : 'Fájlok másolása',
			'restoreFiles'    : 'Elemek visszaállítása', // from v2.1.24 added 5.5.2017
			'rmFromPlaces'    : 'Távolítsa el a helyekről',
			'aspectRatio'     : 'Oldalarány',
			'scale'           : 'Skála',
			'width'           : 'Szélesség',
			'height'          : 'Magasság',
			'resize'          : 'Átméretezés',
			'crop'            : 'Vág',
			'rotate'          : 'Forgat',
			'rotate-cw'       : 'Forgassa el 90 fokkal',
			'rotate-ccw'      : 'Forgassa el 90 fokkal CCW irányban',
			'degree'          : '°',
			'netMountDialogTitle' : 'Csatlakoztassa a hálózati kötetet', // added 18.04.2012
			'protocol'            : 'Protokoll', // added 18.04.2012
			'host'                : 'Házigazda', // added 18.04.2012
			'port'                : 'Kikötő', // added 18.04.2012
			'user'                : 'Felhasználó', // added 18.04.2012
			'pass'                : 'Jelszó', // added 18.04.2012
			'confirmUnmount'      : 'Leválasztod $1?',  // from v2.1 added 30.04.2012
			'dropFilesBrowser': 'Fájlok dobása vagy beillesztése a böngészőből', // from v2.1 added 30.05.2012
			'dropPasteFiles'  : 'Dobja ide a fájlokat, illesszen be URL-eket vagy képeket (vágólap).', // from v2.1 added 07.04.2014
			'encoding'        : 'Kódolás', // from v2.1 added 19.12.2014
			'locale'          : 'Nyelv',   // from v2.1 added 19.12.2014
			'searchTarget'    : 'Cél: $1',                // from v2.1 added 22.5.2015
			'searchMime'      : 'Keresés a MIME típus bevitele alapján', // from v2.1 added 22.5.2015
			'owner'           : 'Tulajdonos', // from v2.1 added 20.6.2015
			'group'           : 'Csoport', // from v2.1 added 20.6.2015
			'other'           : 'Egyéb', // from v2.1 added 20.6.2015
			'execute'         : 'Végrehajt', // from v2.1 added 20.6.2015
			'perm'            : 'Engedély', // from v2.1 added 20.6.2015
			'mode'            : 'Mód', // from v2.1 added 20.6.2015
			'emptyFolder'     : 'A mappa üres', // from v2.1.6 added 30.12.2015
			'emptyFolderDrop' : 'A mappa üres\\Elem eldobása', // from v2.1.6 added 30.12.2015
			'emptyFolderLTap' : 'A mappa üres\\Hosszú koppintás elemek hozzáadásához', // from v2.1.6 added 30.12.2015
			'quality'         : 'Minőség', // from v2.1.6 added 5.1.2016
			'autoSync'        : 'Automatikus szinkronizáció',  // from v2.1.6 added 10.1.2016
			'moveUp'          : 'Mozgatás fel',  // from v2.1.6 added 18.1.2016
			'getLink'         : 'URL-link letöltése', // from v2.1.7 added 9.2.2016
			'selectedItems'   : 'Kiválasztott elemek ($1)', // from v2.1.7 added 2.19.2016
			'folderId'        : 'Mappa ID', // from v2.1.10 added 3.25.2016
			'offlineAccess'   : 'Offline hozzáférés engedélyezése', // from v2.1.10 added 3.25.2016
			'reAuth'          : 'Újrahitelesítéshez', // from v2.1.10 added 3.25.2016
			'nowLoading'      : 'Most betölt...', // from v2.1.12 added 4.26.2016
			'openMulti'       : 'Több fájl megnyitása', // from v2.1.12 added 5.14.2016
			'openMultiConfirm': 'Megpróbálja megnyitni a $1 fájlokat. Biztosan meg akarja nyitni a böngészőben?', // from v2.1.12 added 5.14.2016
			'emptySearch'     : 'A keresési eredmények üresek a keresési célban.', // from v2.1.12 added 5.16.2016
			'editingFile'     : 'Ez egy fájl szerkesztése.', // from v2.1.13 added 6.3.2016
			'hasSelected'     : '$1 elemet választott ki.', // from v2.1.13 added 6.3.2016
			'hasClipboard'    : '$1 elem van a vágólapon.', // from v2.1.13 added 6.3.2016
			'incSearchOnly'   : 'A növekményes keresés csak az aktuális nézetből történik.', // from v2.1.13 added 6.30.2016
			'reinstate'       : 'Helyezze vissza', // from v2.1.15 added 3.8.2016
			'complete'        : '$1 kész', // from v2.1.15 added 21.8.2016
			'contextmenu'     : 'Helyi menü', // from v2.1.15 added 9.9.2016
			'pageTurning'     : 'Lapozás', // from v2.1.15 added 10.9.2016
			'volumeRoots'     : 'Kötetgyökerek', // from v2.1.16 added 16.9.2016
			'reset'           : 'Visszaállítás', // from v2.1.16 added 1.10.2016
			'bgcolor'         : 'Háttérszín', // from v2.1.16 added 1.10.2016
			'colorPicker'     : 'Színválasztó', // from v2.1.16 added 1.10.2016
			'8pxgrid'         : '8 képpontos rács', // from v2.1.16 added 4.10.2016
			'enabled'         : 'Engedélyezve', // from v2.1.16 added 4.10.2016
			'disabled'        : 'Tiltva', // from v2.1.16 added 4.10.2016
			'emptyIncSearch'  : 'A keresési eredmények üresek az aktuális nézetben.\\ANyomja meg az [Enter] billentyűt a keresési cél kibontásához.', // from v2.1.16 added 5.10.2016
			'emptyLetSearch'  : 'Az első betűs keresés eredménye üres az aktuális nézetben.', // from v2.1.23 added 24.3.2017
			'textLabel'       : 'Szöveges címke', // from v2.1.17 added 13.10.2016
			'minsLeft'        : '$1 perc van hátra', // from v2.1.17 added 13.11.2016
			'openAsEncoding'  : 'Nyissa meg újra a kiválasztott kódolással', // from v2.1.19 added 2.12.2016
			'saveAsEncoding'  : 'Mentés a kiválasztott kódolással', // from v2.1.19 added 2.12.2016
			'selectFolder'    : 'Mappa kiválasztása', // from v2.1.20 added 13.12.2016
			'firstLetterSearch': 'Első betű keresése', // from v2.1.23 added 24.3.2017
			'presets'         : 'Előbeállítások', // from v2.1.25 added 26.5.2017
			'tooManyToTrash'  : 'Túl sok az elem, így nem kerülhet a szemétbe.', // from v2.1.25 added 9.6.2017
			'TextArea'        : 'TextArea', // from v2.1.25 added 14.6.2017
			'folderToEmpty'   : 'Ürítse ki a „$1” mappát.', // from v2.1.25 added 22.6.2017
			'filderIsEmpty'   : 'Nincsenek elemek a "$1" mappában.', // from v2.1.25 added 22.6.2017
			'preference'      : 'Preferencia', // from v2.1.26 added 28.6.2017
			'language'        : 'Nyelv', // from v2.1.26 added 28.6.2017
			'clearBrowserData': 'Inicializálja az ebben a böngészőben mentett beállításokat', // from v2.1.26 added 28.6.2017
			'toolbarPref'     : 'Eszköztár beállításai', // from v2.1.27 added 2.8.2017
			'charsLeft'       : '... $1 karakter maradt.',  // from v2.1.29 added 30.8.2017
			'linesLeft'       : '... $1 sor maradt.',  // from v2.1.52 added 16.1.2020
			'sum'             : 'Összeg', // from v2.1.29 added 28.9.2017
			'roughFileSize'   : 'Durva fájlméret', // from v2.1.30 added 2.11.2017
			'autoFocusDialog' : 'Fókuszáljon a párbeszédpanel elemére az egérmutatóval',  // from v2.1.30 added 2.11.2017
			'select'          : 'Válassza ki', // from v2.1.30 added 23.11.2017
			'selectAction'    : 'Művelet a fájl kiválasztásakor', // from v2.1.30 added 23.11.2017
			'useStoredEditor' : 'Nyissa meg a legutóbb használt szerkesztővel', // from v2.1.30 added 23.11.2017
			'selectinvert'    : 'Fordított kijelölés', // from v2.1.30 added 25.11.2017
			'renameMultiple'  : 'Biztosan át szeretné nevezni $1 kiválasztott elemet, például $2?<br/>Ez nem vonható vissza!', // from v2.1.31 added 4.12.2017
			'batchRename'     : 'Kötegelt átnevezés', // from v2.1.31 added 8.12.2017
			'plusNumber'      : '+ Szám', // from v2.1.31 added 8.12.2017
			'asPrefix'        : 'Előtag hozzáadása', // from v2.1.31 added 8.12.2017
			'asSuffix'        : 'Utótag hozzáadása', // from v2.1.31 added 8.12.2017
			'changeExtention' : 'Utótag hozzáadása', // from v2.1.31 added 8.12.2017
			'columnPref'      : 'Oszlopbeállítások (lista nézet)', // from v2.1.32 added 6.2.2018
			'reflectOnImmediate' : 'Minden változás azonnal megjelenik az archívumban.', // from v2.1.33 added 2.3.2018
			'reflectOnUnmount'   : 'A módosítások csak akkor jelennek meg, ha leválasztják a kötetet.', // from v2.1.33 added 2.3.2018
			'unmountChildren' : 'Az erre a kötetre szerelt következő kötet(ek) szintén le vannak szerelve. Biztosan leválasztja?', // from v2.1.33 added 5.3.2018
			'selectionInfo'   : 'Kiválasztási információ', // from v2.1.33 added 7.3.2018
			'hashChecker'     : 'Algoritmusok a fájl hash megjelenítéséhez', // from v2.1.33 added 10.3.2018
			'infoItems'       : 'Információs elemek (Információs panel kiválasztása)', // from v2.1.38 added 28.3.2018
			'pressAgainToExit': 'Nyomja meg újra a kilépéshez.', // from v2.1.38 added 1.4.2018
			'toolbar'         : 'Eszköztár', // from v2.1.38 added 4.4.2018
			'workspace'       : 'Munkaterület', // from v2.1.38 added 4.4.2018
			'dialog'          : 'Párbeszéd', // from v2.1.38 added 4.4.2018
			'all'             : 'Minden', // from v2.1.38 added 4.4.2018
			'iconSize'        : 'Ikonméret (Ikonok nézet)', // from v2.1.39 added 7.5.2018
			'editorMaximized' : 'Nyissa meg a teljes méretű szerkesztő ablakot', // from v2.1.40 added 30.6.2018
			'editorConvNoApi' : 'Mivel az API-n keresztüli konvertálás jelenleg nem érhető el, kérjük, konvertálja a webhelyen.', //from v2.1.40 added 8.7.2018
			'editorConvNeedUpload' : 'A konvertálás után fel kell töltenie az elem URL-jét vagy egy letöltött fájlt a konvertált fájl mentéséhez.', //from v2.1.40 added 8.7.2018
			'convertOn'       : 'Konvertálás a webhelyen: $1', // from v2.1.40 added 10.7.2018
			'integrations'    : 'Integrációk', // from v2.1.40 added 11.7.2018
			'integrationWith' : 'Ez az elFinder a következő külső szolgáltatásokat tartalmazza. Kérjük, használat előtt ellenőrizze a használati feltételeket, az adatvédelmi szabályzatot stb.', // from v2.1.40 added 11.7.2018
			'showHidden'      : 'Rejtett elemek megjelenítése', // from v2.1.41 added 24.7.2018
			'hideHidden'      : 'Rejtett elemek elrejtése', // from v2.1.41 added 24.7.2018
			'toggleHidden'    : 'Rejtett elemek megjelenítése/elrejtése', // from v2.1.41 added 24.7.2018
			'makefileTypes'   : 'Az „Új fájl” funkcióval engedélyezhető fájltípusok', // from v2.1.41 added 7.8.2018
			'typeOfTextfile'  : 'A szövegfájl típusa', // from v2.1.41 added 7.8.2018
			'add'             : 'Hozzáadás', // from v2.1.41 added 7.8.2018
			'theme'           : 'Téma', // from v2.1.43 added 19.10.2018
			'default'         : 'Alapértelmezett', // from v2.1.43 added 19.10.2018
			'description'     : 'Leírás', // from v2.1.43 added 19.10.2018
			'website'         : 'Weboldal', // from v2.1.43 added 19.10.2018
			'author'          : 'Szerző', // from v2.1.43 added 19.10.2018
			'email'           : 'Email', // from v2.1.43 added 19.10.2018
			'license'         : 'Engedély', // from v2.1.43 added 19.10.2018
			'exportToSave'    : 'Ez az elem nem menthető. A szerkesztések elvesztésének elkerülése érdekében exportálnia kell őket a számítógépére.', // from v2.1.44 added 1.12.2018
			'dblclickToSelect': 'Kattintson duplán a fájlra a kiválasztásához.', // from v2.1.47 added 22.1.2019
			'useFullscreen'   : 'Teljes képernyős mód használata', // from v2.1.47 added 19.2.2019

			/********************************** mimetypes **********************************/
			'kindUnknown'     : 'Ismeretlen',
			'kindRoot'        : 'Kötetgyökér', // from v2.1.16 added 16.10.2016
			'kindFolder'      : 'Mappa',
			'kindSelects'     : 'Válogatás', // from v2.1.29 added 29.8.2017
			'kindAlias'       : 'Parancsikon',
			'kindAliasBroken' : 'Hibás parancsikon',
			// applications
			'kindApp'         : 'Alkalmazás',
			'kindPostscript'  : 'Postscript dokumentum',
			'kindMsOffice'    : 'Microsoft Office dokumentum',
			'kindMsWord'      : 'Microsoft Word dokumentum',
			'kindMsExcel'     : 'Microsoft Excel dokumentum',
			'kindMsPP'        : 'Microsoft Powerpoint bemutató',
			'kindOO'          : 'Open Office dokumentum',
			'kindAppFlash'    : 'Flash alkalmazás',
			'kindPDF'         : 'Hordozható dokumentum formátum (PDF)',
			'kindTorrent'     : 'Bittorrent fájl',
			'kind7z'          : '7z archívum',
			'kindTAR'         : 'TAR archívum',
			'kindGZIP'        : 'GZIP archívum',
			'kindBZIP'        : 'BZIP archívum',
			'kindXZ'          : 'XZ archívum',
			'kindZIP'         : 'ZIP archívum',
			'kindRAR'         : 'RAR archívum',
			'kindJAR'         : 'Java JAR fájl',
			'kindTTF'         : 'True Type betűtípus',
			'kindOTF'         : 'Nyissa meg a Type betűtípust',
			'kindRPM'         : 'RPM csomag',
			// texts
			'kindText'        : 'Szöveges dokumentum',
			'kindTextPlain'   : 'Egyszerű szöveg',
			'kindPHP'         : 'PHP forráskód',
			'kindCSS'         : 'Lépcsőzetes stíluslap',
			'kindHTML'        : 'HTML dokumentum',
			'kindJS'          : 'Javascript forráskód',
			'kindRTF'         : 'Rich Text formátum',
			'kindC'           : 'C forráskód',
			'kindCHeader'     : 'C header forráskód',
			'kindCPP'         : 'C++ forráskód',
			'kindCPPHeader'   : 'C++ header forráskód',
			'kindShell'       : 'Unix shell szkript',
			'kindPython'      : 'Python forráskód',
			'kindJava'        : 'Java forráskód',
			'kindRuby'        : 'Ruby forráskód',
			'kindPerl'        : 'Perl szkript',
			'kindSQL'         : 'SQL forráskód',
			'kindXML'         : 'XML dokumentum',
			'kindAWK'         : 'AWK forráskód',
			'kindCSV'         : 'Vesszővel elválasztott értékek',
			'kindDOCBOOK'     : 'Docbook XML dokumentum',
			'kindMarkdown'    : 'Markdown szöveg', // added 20.7.2015
			// images
			'kindImage'       : 'Kép',
			'kindBMP'         : 'BMP kép',
			'kindJPEG'        : 'JPEG kép',
			'kindGIF'         : 'GIF kép',
			'kindPNG'         : 'PNG kép',
			'kindTIFF'        : 'TIFF kép',
			'kindTGA'         : 'TGA kép',
			'kindPSD'         : 'Adobe Photoshop kép',
			'kindXBITMAP'     : 'X bittérképes kép',
			'kindPXM'         : 'Pixelmator kép',
			// media
			'kindAudio'       : 'Hangfájl',
			'kindAudioMPEG'   : 'MPEG hangfájl',
			'kindAudioMPEG4'  : 'MPEG-4 hangfájl',
			'kindAudioMIDI'   : 'MIDI hangfájl',
			'kindAudioOGG'    : 'Ogg Vorbis hangfájl',
			'kindAudioWAV'    : 'WAV hangfájl',
			'AudioPlaylist'   : 'MP3 lejátszási lista',
			'kindVideo'       : 'Film',
			'kindVideoDV'     : 'DV film',
			'kindVideoMPEG'   : 'MPEG film',
			'kindVideoMPEG4'  : 'MPEG-4 film',
			'kindVideoAVI'    : 'AVI film',
			'kindVideoMOV'    : 'Quick Time film',
			'kindVideoWM'     : 'Windows Media film',
			'kindVideoFlash'  : 'Flash film',
			'kindVideoMKV'    : 'Matroska film',
			'kindVideoOGG'    : 'Ogg film'
		}
	};
}));
js/i18n/elfinder.pl.js000064400000103536151215013370010505 0ustar00/**
 * Polski translation
 * @author Marcin Mikołajczyk <marcin@pjwstk.edu.pl>
 * @author Bogusław Zięba <bobi@poczta.fm>
 * @author Bogusław Zięba <bobi@poczta.fm>
 * @version 2022-03-08
 */
(function(root, factory) {
	if (typeof define === 'function' && define.amd) {
		define(['elfinder'], factory);
	} else if (typeof exports !== 'undefined') {
		module.exports = factory(require('elfinder'));
	} else {
		factory(root.elFinder);
	}
}(this, function(elFinder) {
	elFinder.prototype.i18.pl = {
		translator : 'Marcin Mikołajczyk &lt;marcin@pjwstk.edu.pl&gt;, Bogusław Zięba &lt;bobi@poczta.fm&gt;, Bogusław Zięba &lt;bobi@poczta.fm&gt;',
		language   : 'Język Polski',
		direction  : 'ltr',
		dateFormat : 'd.m.Y H:i', // will show like: 08.03.2022 11:30
		fancyDateFormat : '$1 H:i', // will show like: Dzisiaj 11:30
		nonameDateFormat : 'ymd-His', // noname upload will show like: 220308-113034
		messages   : {
			'getShareText' : 'Dzielić',
			'Editor ': 'Edytor kodu',
			/********************************** errors **********************************/
			'error'                : 'Błąd',
			'errUnknown'           : 'Nieznany błąd.',
			'errUnknownCmd'        : 'Nieznane polecenie.',
			'errJqui'              : 'Niepoprawna konfiguracja jQuery UI. Muszą być zawarte komponenty selectable, draggable i droppable.',
			'errNode'              : 'elFinder wymaga utworzenia obiektu DOM.',
			'errURL'               : 'Niepoprawna konfiguracja elFinder! Pole URL nie jest ustawione.',
			'errAccess'            : 'Dostęp zabroniony.',
			'errConnect'           : 'Błąd połączenia z zapleczem.',
			'errAbort'             : 'Połączenie zostało przerwane.',
			'errTimeout'           : 'Upłynął czas oczekiwania na połączenie.',
			'errNotFound'          : 'Zaplecze nie zostało znalezione.',
			'errResponse'          : 'Nieprawidłowa odpowiedź zaplecza.',
			'errConf'              : 'Niepoprawna konfiguracja zaplecza.',
			'errJSON'              : 'Moduł PHP JSON nie jest zainstalowany.',
			'errNoVolumes'         : 'Brak możliwości odczytu katalogów.',
			'errCmdParams'         : 'Nieprawidłowe parametry dla polecenia "$1".',
			'errDataNotJSON'       : 'Dane nie są JSON.',
			'errDataEmpty'         : 'Dane są puste.',
			'errCmdReq'            : 'Zaplecze wymaga podania nazwy polecenia.',
			'errOpen'              : 'Nie można otworzyć "$1".',
			'errNotFolder'         : 'Obiekt nie jest katalogiem.',
			'errNotFile'           : 'Obiekt nie jest plikiem.',
			'errRead'              : 'Nie można odczytać "$1".',
			'errWrite'             : 'Nie można zapisać do "$1".',
			'errPerm'              : 'Brak uprawnień.',
			'errLocked'            : '"$1" jest zablokowany i nie może zostać zmieniony, przeniesiony lub usunięty.',
			'errExists'            : 'Plik "$1" już istnieje.',
			'errInvName'           : 'Nieprawidłowa nazwa pliku.',
			'errInvDirname'        : 'Nieprawidłowa nazwa folderu.',  // from v2.1.24 added 12.4.2017
			'errFolderNotFound'    : 'Nie znaleziono folderu.',
			'errFileNotFound'      : 'Plik nie został znaleziony.',
			'errTrgFolderNotFound' : 'Katalog docelowy "$1" nie został znaleziony.',
			'errPopup'             : 'Przeglądarka zablokowała otwarcie nowego okna. Aby otworzyć plik, zmień ustawienia przeglądarki.',
			'errMkdir'             : 'Nie można utworzyć katalogu "$1".',
			'errMkfile'            : 'Nie można utworzyć pliku "$1".',
			'errRename'            : 'Nie można zmienić nazwy "$1".',
			'errCopyFrom'          : 'Kopiowanie z katalogu "$1" nie jest możliwe.',
			'errCopyTo'            : 'Kopiowanie do katalogu "$1" nie jest możliwe.',
			'errMkOutLink'         : 'Nie można utworzyć link do zewnętrznego katalogu głównego.', // from v2.1 added 03.10.2015
			'errUpload'            : 'Błąd wysyłania.',  // old name - errUploadCommon
			'errUploadFile'        : 'Nie można wysłać "$1".', // old name - errUpload
			'errUploadNoFiles'     : 'Nie znaleziono plików do wysłania.',
			'errUploadTotalSize'   : 'Przekroczono dopuszczalny rozmiar wysyłanych plików.', // old name - errMaxSize
			'errUploadFileSize'    : 'Plik przekracza dopuszczalny rozmiar.', //  old name - errFileMaxSize
			'errUploadMime'        : 'Niedozwolony typ pliku.',
			'errUploadTransfer'    : 'Błąd przesyłania "$1".',
			'errUploadTemp'        : 'Nie można wykonać tymczasowego pliku do przesłania.', // from v2.1 added 26.09.2015
			'errNotReplace'        : 'Obiekt "$1" istnieje już w tej lokalizacji i nie może być zastąpiony przez inny typ obiektu.', // new
			'errReplace'           : 'Nie można zastąpić "$1".',
			'errSave'              : 'Nie można zapisać "$1".',
			'errCopy'              : 'Nie można skopiować "$1".',
			'errMove'              : 'Nie można przenieść "$1".',
			'errCopyInItself'      : 'Nie można skopiować "$1" w miejsce jego samego.',
			'errRm'                : 'Nie można usunąć "$1".',
			'errTrash'             : 'Nie można do kosza.', // from v2.1.24 added 30.4.2017
			'errRmSrc'             : 'Nie należy usunąć pliku(s) źródłowy.',
			'errExtract'           : 'Nie można wypakować plików z "$1".',
			'errArchive'           : 'Nie można utworzyć archiwum.',
			'errArcType'           : 'Nieobsługiwany typ archiwum.',
			'errNoArchive'         : 'Plik nie jest prawidłowym typem archiwum.',
			'errCmdNoSupport'      : 'Zaplecze nie obsługuje tego polecenia.',
			'errReplByChild'       : 'Nie można zastąpić katalogu "$1" elementem w nim zawartym',
			'errArcSymlinks'       : 'Ze względów bezpieczeństwa rozpakowywanie archiwów zawierających dowiązania symboliczne (symlinks) jest niedozwolone.', // edited 24.06.2012
			'errArcMaxSize'        : 'Archiwum przekracza maksymalny dopuszczalny rozmiar.',
			'errResize'            : 'Nie można zmienić rozmiaru "$1".',
			'errResizeDegree'      : 'Nieprawidłowy stopień obracania.',  // added 7.3.2013
			'errResizeRotate'      : 'Nie można obrócić obrazu.',  // added 7.3.2013
			'errResizeSize'        : 'Nieprawidłowy rozmiar obrazu.',  // added 7.3.2013
			'errResizeNoChange'    : 'Nie zmieniono rozmiaru obrazu.',  // added 7.3.2013
			'errUsupportType'      : 'Nieobsługiwany typ pliku.',
			'errNotUTF8Content'    : 'Plik "$1" nie jest UTF-8 i nie może być edytowany.',  // added 9.11.2011
			'errNetMount'          : 'Nie można zamontować "$1".', // added 17.04.2012
			'errNetMountNoDriver'  : 'Nieobsługiwany protokół.',     // added 17.04.2012
			'errNetMountFailed'    : 'Montowanie nie powiodło się.',         // added 17.04.2012
			'errNetMountHostReq'   : 'Host wymagany.', // added 18.04.2012
			'errSessionExpires'    : 'Twoja sesja wygasła z powodu nieaktywności.',
			'errCreatingTempDir'   : 'Nie można utworzyć katalogu tymczasowego: "$1"',
			'errFtpDownloadFile'   : 'Nie można pobrać pliku z FTP: "$1"',
			'errFtpUploadFile'     : 'Nie można przesłać pliku na serwer FTP: "$1"',
			'errFtpMkdir'          : 'Nie można utworzyć zdalnego katalogu FTP: "$1"',
			'errArchiveExec'       : 'Błąd podczas archiwizacji plików: "$1"',
			'errExtractExec'       : 'Błąd podczas wyodrębniania plików: "$1"',
			'errNetUnMount'        : 'Nie można odmontować', // from v2.1 added 30.04.2012
			'errConvUTF8'          : 'Nie wymienialne na UTF-8', // from v2.1 added 08.04.2014
			'errFolderUpload'      : 'Wypróbuj Google Chrome, jeśli chcesz przesłać katalog.', // from v2.1 added 26.6.2015
			'errSearchTimeout'     : 'Upłynął limit czasu podczas wyszukiwania "$1". Wynik wyszukiwania jest częściowy.', // from v2.1 added 12.1.2016
			'errReauthRequire'     : 'Wymagana jest ponowna autoryzacja.', // from v2.1.10 added 24.3.2016
			'errMaxTargets'        : 'Maks. liczba elementów do wyboru to $1.', // from v2.1.17 added 17.10.2016
			'errRestore'           : 'Nie można przywrócić z kosza. Nie można zidentyfikować przywrócić docelowego.', // from v2.1.24 added 3.5.2017
			'errEditorNotFound'    : 'Nie znaleziono edytora tego typu pliku.', // from v2.1.25 added 23.5.2017
			'errServerError'       : 'Wystąpił błąd po stronie serwera .', // from v2.1.25 added 16.6.2017
			'errEmpty'             : 'Nie można do pustego folderu "$1".', // from v2.1.25 added 22.6.2017
			'moreErrors'           : 'Jest jeszcze $1 błąd/błędy.', // from v2.1.44 added 9.12.2018
			'errMaxMkdirs'         : 'You can create up to $1 folders at one time.', // from v2.1.58 added 20.6.2021

			/******************************* commands names ********************************/
			'cmdarchive'   : 'Utwórz archiwum',
			'cmdback'      : 'Wstecz',
			'cmdcopy'      : 'Kopiuj',
			'cmdcut'       : 'Wytnij',
			'cmddownload'  : 'Pobierz',
			'cmdduplicate' : 'Duplikuj',
			'cmdedit'      : 'Edytuj plik',
			'cmdextract'   : 'Wypakuj pliki z archiwum',
			'cmdforward'   : 'Dalej',
			'cmdgetfile'   : 'Wybierz pliki',
			'cmdhelp'      : 'Informacje o programie',
			'cmdhome'      : 'Główny',
			'cmdinfo'      : 'Właściwości',
			'cmdmkdir'     : 'Nowy katalog',
			'cmdmkdirin'   : 'Do nowego katalogu', // from v2.1.7 added 19.2.2016
			'cmdmkfile'    : 'Nowy plik',
			'cmdopen'      : 'Otwórz',
			'cmdpaste'     : 'Wklej',
			'cmdquicklook' : 'Podgląd',
			'cmdreload'    : 'Odśwież',
			'cmdrename'    : 'Zmień nazwę',
			'cmdrm'        : 'Usuń',
			'cmdtrash'     : 'Do kosza', //from v2.1.24 added 29.4.2017
			'cmdrestore'   : 'Przywróć', //from v2.1.24 added 3.5.2017
			'cmdsearch'    : 'Wyszukaj pliki',
			'cmdup'        : 'Przejdź do katalogu nadrzędnego',
			'cmdupload'    : 'Wyślij pliki',
			'cmdview'      : 'Widok',
			'cmdresize'    : 'Zmień rozmiar i Obróć',
			'cmdsort'      : 'Sortuj',
			'cmdnetmount'  : 'Zamontuj wolumin sieciowy', // added 18.04.2012
			'cmdnetunmount': 'Odmontuj', // from v2.1 added 30.04.2012
			'cmdplaces'    : 'Do Miejsc', // added 28.12.2014
			'cmdchmod'     : 'Zmiana trybu', // from v2.1 added 20.6.2015
			'cmdopendir'   : 'Otwórz katalog', // from v2.1 added 13.1.2016
			'cmdcolwidth'  : 'Resetuj szerokość kolumny', // from v2.1.13 added 12.06.2016
			'cmdfullscreen': 'Pełny ekran', // from v2.1.15 added 03.08.2016
			'cmdmove'      : 'Przenieś', // from v2.1.15 added 21.08.2016
			'cmdempty'     : 'Opróżnij folder', // from v2.1.25 added 22.06.2017
			'cmdundo'      : 'Cofnij', // from v2.1.27 added 31.07.2017
			'cmdredo'      : 'Ponów', // from v2.1.27 added 31.07.2017
			'cmdpreference': 'Preferencje', // from v2.1.27 added 03.08.2017
			'cmdselectall' : 'Zaznacz wszystko', // from v2.1.28 added 15.08.2017
			'cmdselectnone': 'Odznacz wszystko', // from v2.1.28 added 15.08.2017
			'cmdselectinvert': 'Odwróć wybór', // from v2.1.28 added 15.08.2017
			'cmdopennew'   : 'Otwórz w nowym oknie', // from v2.1.38 added 3.4.2018
			'cmdhide'      : 'Ukryj (osobiste)', // from v2.1.41 added 24.7.2018

			/*********************************** buttons ***********************************/
			'btnClose'  : 'Zamknij',
			'btnSave'   : 'Zapisz',
			'btnRm'     : 'Usuń',
			'btnApply'  : 'Zastosuj',
			'btnCancel' : 'Anuluj',
			'btnNo'     : 'Nie',
			'btnYes'    : 'Tak',
			'btnMount'  : 'Montuj',  // added 18.04.2012
			'btnApprove': 'Idź do $1 & zatwierdź', // from v2.1 added 26.04.2012
			'btnUnmount': 'Odmontuj', // from v2.1 added 30.04.2012
			'btnConv'   : 'Konwertuj', // from v2.1 added 08.04.2014
			'btnCwd'    : 'Tutaj',      // from v2.1 added 22.5.2015
			'btnVolume' : 'Wolumin',    // from v2.1 added 22.5.2015
			'btnAll'    : 'Wszystko',       // from v2.1 added 22.5.2015
			'btnMime'   : 'Typ MIME', // from v2.1 added 22.5.2015
			'btnFileName':'Nazwa pliku',  // from v2.1 added 22.5.2015
			'btnSaveClose': 'Zapisz & Zamknij', // from v2.1 added 12.6.2015
			'btnBackup' : 'Kopia zapasowa', // fromv2.1 added 28.11.2015
			'btnRename'    : 'Zmień nazwę',      // from v2.1.24 added 6.4.2017
			'btnRenameAll' : 'Zmień nazwę(Wszystkie)', // from v2.1.24 added 6.4.2017
			'btnPrevious' : 'Poprz ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnNext'     : 'Nast ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnSaveAs'   : 'Zapisz Jako', // from v2.1.25 added 24.5.2017

			/******************************** notifications ********************************/
			'ntfopen'     : 'Otwieranie katalogu',
			'ntffile'     : 'Otwórz plik',
			'ntfreload'   : 'Odśwież zawartość katalogu',
			'ntfmkdir'    : 'Tworzenie katalogu',
			'ntfmkfile'   : 'Tworzenie plików',
			'ntfrm'       : 'Usuwanie plików',
			'ntfcopy'     : 'Kopiowanie plików',
			'ntfmove'     : 'Przenoszenie plików',
			'ntfprepare'  : 'Przygotowanie do kopiowania plików',
			'ntfrename'   : 'Zmiana nazw plików',
			'ntfupload'   : 'Wysyłanie plików',
			'ntfdownload' : 'Pobieranie plików',
			'ntfsave'     : 'Zapisywanie plików',
			'ntfarchive'  : 'Tworzenie archiwum',
			'ntfextract'  : 'Wypakowywanie plików z archiwum',
			'ntfsearch'   : 'Wyszukiwanie plików',
			'ntfresize'   : 'Zmiana rozmiaru obrazów',
			'ntfsmth'     : 'Robienie czegoś >_<',
			'ntfloadimg'  : 'Ładowanie obrazu',
			'ntfnetmount' : 'Montaż woluminu sieciowego', // added 18.04.2012
			'ntfnetunmount': 'Odłączanie woluminu sieciowego', // from v2.1 added 30.04.2012
			'ntfdim'      : 'Pozyskiwanie wymiaru obrazu', // added 20.05.2013
			'ntfreaddir'  : 'Odczytywanie informacji katalogu', // from v2.1 added 01.07.2013
			'ntfurl'      : 'Pobieranie URL linku', // from v2.1 added 11.03.2014
			'ntfchmod'    : 'Zmiana trybu pliku', // from v2.1 added 20.6.2015
			'ntfpreupload': 'Weryfikacja nazwy przesłanego pliku', // from v2.1 added 31.11.2015
			'ntfzipdl'    : 'Tworzenie pliku do pobrania', // from v2.1.7 added 23.1.2016
			'ntfparents'  : 'Uzyskiwanie informacji o ścieżce', // from v2.1.17 added 2.11.2016
			'ntfchunkmerge': 'Przetwarzanie przesłanego pliku', // from v2.1.17 added 2.11.2016
			'ntftrash'    : 'Wykonuje wrzucanie do kosza', // from v2.1.24 added 2.5.2017
			'ntfrestore'  : 'Wykonuje przywracanie z kosza', // from v2.1.24 added 3.5.2017
			'ntfchkdir'   : 'Sprawdzanie folderu docelowego', // from v2.1.24 added 3.5.2017
			'ntfundo'     : 'Cofanie poprzedniej operacji', // from v2.1.27 added 31.07.2017
			'ntfredo'     : 'Ponownie poprzednio cofnięte', // from v2.1.27 added 31.07.2017
			'ntfchkcontent' : 'Sprawdzanie zawartości', // from v2.1.41 added 3.8.2018

			/*********************************** volumes *********************************/
			'volume_Trash' : 'Śmieci', //from v2.1.24 added 29.4.2017

			/************************************ dates **********************************/
			'dateUnknown' : 'nieznana',
			'Today'       : 'Dzisiaj',
			'Yesterday'   : 'Wczoraj',
			'msJan'       : 'Sty',
			'msFeb'       : 'Lut',
			'msMar'       : 'Mar',
			'msApr'       : 'Kwi',
			'msMay'       : 'Maj',
			'msJun'       : 'Cze',
			'msJul'       : 'Lip',
			'msAug'       : 'Sie',
			'msSep'       : 'Wrz',
			'msOct'       : 'Paź',
			'msNov'       : 'Lis',
			'msDec'       : 'Gru',
			'January'     : 'Styczeń',
			'February'    : 'Luty',
			'March'       : 'Marzec',
			'April'       : 'Kwiecień',
			'May'         : 'Maj',
			'June'        : 'Czerwiec',
			'July'        : 'Lipiec',
			'August'      : 'Sierpień',
			'September'   : 'Wrzesień',
			'October'     : 'Październik',
			'November'    : 'Listopad',
			'December'    : 'Grudzień',
			'Sunday'      : 'Niedziela',
			'Monday'      : 'Poniedziałek',
			'Tuesday'     : 'Wtorek',
			'Wednesday'   : 'Środa',
			'Thursday'    : 'Czwartek',
			'Friday'      : 'Piątek',
			'Saturday'    : 'Sobota',
			'Sun'         : 'Nie',
			'Mon'         : 'Pon',
			'Tue'         : 'Wto',
			'Wed'         : 'Śro',
			'Thu'         : 'Czw',
			'Fri'         : 'Pią',
			'Sat'         : 'Sob',

			/******************************** sort variants ********************************/
			'sortname'          : 'w/g nazwy',
			'sortkind'          : 'w/g typu',
			'sortsize'          : 'w/g rozmiaru',
			'sortdate'          : 'w/g daty',
			'sortFoldersFirst'  : 'katalogi pierwsze',
			'sortperm'          : 'wg/nazwy', // from v2.1.13 added 13.06.2016
			'sortmode'          : 'wg/trybu',       // from v2.1.13 added 13.06.2016
			'sortowner'         : 'wg/właściciela',      // from v2.1.13 added 13.06.2016
			'sortgroup'         : 'wg/grup',      // from v2.1.13 added 13.06.2016
			'sortAlsoTreeview'  : 'Również drzewa katalogów',  // from v2.1.15 added 01.08.2016

			/********************************** new items **********************************/
			'untitled file.txt' : 'NowyPlik.txt', // added 10.11.2015
			'untitled folder'   : 'NowyFolder',   // added 10.11.2015
			'Archive'           : 'NoweArchiwum',  // from v2.1 added 10.11.2015
			'untitled file'     : 'NowyPlik.$1',  // from v2.1.41 added 6.8.2018
			'extentionfile'     : '$1 Plik',    // from v2.1.41 added 6.8.2018
			'extentiontype'     : '$1: $2',      // from v2.1.43 added 17.10.2018

			/********************************** messages **********************************/
			'confirmReq'      : 'Wymagane potwierdzenie',
			'confirmRm'       : 'Czy na pewno chcesz usunąć pliki?<br/>Tej operacji nie można cofnąć!',
			'confirmRepl'     : 'Zastąpić stary plik nowym?',
			'confirmRest'     : 'Zamienić istniejący element na pozycję w koszu?', // fromv2.1.24 added 5.5.2017
			'confirmConvUTF8' : 'Nie w UTF-8<br/>Konwertować na UTF-8?<br/>Zawartość stanie się  UTF-8 poprzez zapisanie po konwersji.', // from v2.1 added 08.04.2014
			'confirmNonUTF8'  : 'Nie można wykryć kodowania tego pliku. Musi być tymczasowo przekształcony do UTF-8. <br/> Proszę wybrać kodowanie znaków tego pliku.', // from v2.1.19 added 28.11.2016
			'confirmNotSave'  : 'Został zmodyfikowany.<br/>Utracisz pracę, jeśli nie zapiszesz zmian.', // from v2.1 added 15.7.2015
			'confirmTrash'    : 'Czy na pewno chcesz przenieść elementy do kosza?', //from v2.1.24 added 29.4.2017
			'confirmMove'     : 'Czy na pewno chcesz przenieść elementy do "$1"?', //from v2.1.50 added 27.7.2019
			'apllyAll'        : 'Zastosuj do wszystkich',
			'name'            : 'Nazwa',
			'size'            : 'Rozmiar',
			'perms'           : 'Uprawnienia',
			'modify'          : 'Zmodyfikowany',
			'kind'            : 'Typ',
			'read'            : 'odczyt',
			'write'           : 'zapis',
			'noaccess'        : 'brak dostępu',
			'and'             : 'i',
			'unknown'         : 'nieznany',
			'selectall'       : 'Zaznacz wszystkie pliki',
			'selectfiles'     : 'Zaznacz plik(i)',
			'selectffile'     : 'Zaznacz pierwszy plik',
			'selectlfile'     : 'Zaznacz ostatni plik',
			'viewlist'        : 'Widok listy',
			'viewicons'       : 'Widok ikon',
			'viewSmall'       : 'Małe ikony', // from v2.1.39 added 22.5.2018
			'viewMedium'      : 'Średnie ikony', // from v2.1.39 added 22.5.2018
			'viewLarge'       : 'Duże ikony', // from v2.1.39 added 22.5.2018
			'viewExtraLarge'  : 'Bardzo duże ikony', // from v2.1.39 added 22.5.2018
			'places'          : 'Ulubione',
			'calc'            : 'Obliczanie',
			'path'            : 'Ścieżka',
			'aliasfor'        : 'Alias do',
			'locked'          : 'Zablokowany',
			'dim'             : 'Wymiary',
			'files'           : 'Plik(ów)',
			'folders'         : 'Katalogi',
			'items'           : 'Element(ów)',
			'yes'             : 'tak',
			'no'              : 'nie',
			'link'            : 'Odnośnik',
			'searcresult'     : 'Wyniki wyszukiwania',
			'selected'        : 'zaznaczonych obiektów',
			'about'           : 'O programie',
			'shortcuts'       : 'Skróty klawiaturowe',
			'help'            : 'Pomoc',
			'webfm'           : 'Menedżer plików sieciowych',
			'ver'             : 'Wersja',
			'protocolver'     : 'wersja protokołu',
			'homepage'        : 'Strona projektu',
			'docs'            : 'Dokumentacja',
			'github'          : 'Obserwuj rozwój projektu na Github',
			'twitter'         : 'Śledź nas na Twitterze',
			'facebook'        : 'Dołącz do nas na Facebooku',
			'team'            : 'Zespół',
			'chiefdev'        : 'główny programista',
			'developer'       : 'programista',
			'contributor'     : 'współautor',
			'maintainer'      : 'koordynator',
			'translator'      : 'tłumacz',
			'icons'           : 'Ikony',
			'dontforget'      : 'i nie zapomnij zabrać ręcznika',
			'shortcutsof'     : 'Skróty klawiaturowe są wyłączone',
			'dropFiles'       : 'Upuść pliki tutaj',
			'or'              : 'lub',
			'selectForUpload' : 'Wybierz pliki',
			'moveFiles'       : 'Przenieś pliki',
			'copyFiles'       : 'Kopiuj pliki',
			'restoreFiles'    : 'Przywróć elementy', // from v2.1.24 added 5.5.2017
			'rmFromPlaces'    : 'Usuń z miejsc',
			'aspectRatio'     : 'Zachowaj proporcje',
			'scale'           : 'Skala',
			'width'           : 'Szerokość',
			'height'          : 'Wysokość',
			'resize'          : 'Zmień rozmiar',
			'crop'            : 'Przytnij',
			'rotate'          : 'Obróć',
			'rotate-cw'       : 'Obróć 90° w lewo',
			'rotate-ccw'      : 'Obróć 90° w prawo',
			'degree'          : '°',
			'netMountDialogTitle' : 'Montaż woluminu sieciowego', // added 18.04.2012
			'protocol'            : 'Protokół', // added 18.04.2012
			'host'                : 'Host', // added 18.04.2012
			'port'                : 'Port', // added 18.04.2012
			'user'                : 'Użytkownik', // added 18.04.2012
			'pass'                : 'Hasło', // added 18.04.2012
			'confirmUnmount'      : 'Czy chcesz odmontować $1?',  // from v2.1 added 30.04.2012
			'dropFilesBrowser': 'Upuść lub Wklej pliki z przeglądarki', // from v2.1 added 30.05.2012
			'dropPasteFiles'  : 'Upuść lub Wklej tutaj pliki i adresy URL', // from v2.1 added 07.04.2014
			'encoding'        : 'Kodowanie', // from v2.1 added 19.12.2014
			'locale'          : 'Lokalne',   // from v2.1 added 19.12.2014
			'searchTarget'    : 'Docelowo: $1',                // from v2.1 added 22.5.2015
			'searchMime'      : 'Wyszukiwanie poprzez wpisanie typu MIME', // from v2.1 added 22.5.2015
			'owner'           : 'Właściciel', // from v2.1 added 20.6.2015
			'group'           : 'Grupa', // from v2.1 added 20.6.2015
			'other'           : 'Inne', // from v2.1 added 20.6.2015
			'execute'         : 'Wykonaj', // from v2.1 added 20.6.2015
			'perm'            : 'Uprawnienia', // from v2.1 added 20.6.2015
			'mode'            : 'Tryb', // from v2.1 added 20.6.2015
			'emptyFolder'     : 'Katalog jest pusty', // from v2.1.6 added 30.12.2015
			'emptyFolderDrop' : 'Katalog jest pusty\\AUpuść aby dodać pozycje', // from v2.1.6 added 30.12.2015
			'emptyFolderLTap' : 'Katalog jest pusty\\ADotknij dłużej aby dodać pozycje', // from v2.1.6 added 30.12.2015
			'quality'         : 'Jakość', // from v2.1.6 added 5.1.2016
			'autoSync'        : 'Auto synchronizacja',  // from v2.1.6 added 10.1.2016
			'moveUp'          : 'Przenieś w górę',  // from v2.1.6 added 18.1.2016
			'getLink'         : 'Pobierz URL linku', // from v2.1.7 added 9.2.2016
			'selectedItems'   : 'Wybrane pozycje ($1)', // from v2.1.7 added 2.19.2016
			'folderId'        : 'ID Katalogu', // from v2.1.10 added 3.25.2016
			'offlineAccess'   : 'Zezwól na dostęp offline', // from v2.1.10 added 3.25.2016
			'reAuth'          : 'Aby ponownie uwierzytelnić', // from v2.1.10 added 3.25.2016
			'nowLoading'      : 'Teraz ładuję...', // from v2.1.12 added 4.26.2016
			'openMulti'       : 'Otwieranie wielu plików', // from v2.1.12 added 5.14.2016
			'openMultiConfirm': 'Próbujesz otworzyć $1 plików. Czy na pewno chcesz, aby otworzyć w przeglądarce?', // from v2.1.12 added 5.14.2016
			'emptySearch'     : 'Wynik wyszukiwania jest pusty', // from v2.1.12 added 5.16.2016
			'editingFile'     : 'Edytujesz plik.', // from v2.1.13 added 6.3.2016
			'hasSelected'     : 'Masz wybranych $1 pozycji.', // from v2.1.13 added 6.3.2016
			'hasClipboard'    : 'Masz $1 pozycji w schowku.', // from v2.1.13 added 6.3.2016
			'incSearchOnly'   : 'Wyszukiwanie przyrostowe jest wyłącznie z bieżącego widoku.', // from v2.1.13 added 6.30.2016
			'reinstate'       : 'Przywracanie', // from v2.1.15 added 3.8.2016
			'complete'        : '$1 zakończone', // from v2.1.15 added 21.8.2016
			'contextmenu'     : 'Menu kontekstowe', // from v2.1.15 added 9.9.2016
			'pageTurning'     : 'Obracanie strony', // from v2.1.15 added 10.9.2016
			'volumeRoots'     : 'Wolumin główny', // from v2.1.16 added 16.9.2016
			'reset'           : 'Resetuj', // from v2.1.16 added 1.10.2016
			'bgcolor'         : 'Kolor tła', // from v2.1.16 added 1.10.2016
			'colorPicker'     : 'Wybierania kolorów', // from v2.1.16 added 1.10.2016
			'8pxgrid'         : '8px Kratka', // from v2.1.16 added 4.10.2016
			'enabled'         : 'Włączone', // from v2.1.16 added 4.10.2016
			'disabled'        : 'Wyłączone', // from v2.1.16 added 4.10.2016
			'emptyIncSearch'  : 'Wyniki wyszukiwania są puste w bieżącym widoku.\\AWciśnij [Enter] aby poszerzyć zakres wyszukiwania.', // from v2.1.16 added 5.10.2016
			'emptyLetSearch'  : 'Wyszukiwanie pierwszej litery brak wyników w bieżącym widoku.', // from v2.1.23 added 24.3.2017
			'textLabel'       : 'Etykieta tekstowa', // from v2.1.17 added 13.10.2016
			'minsLeft'        : '$1 min pozostało', // from v2.1.17 added 13.11.2016
			'openAsEncoding'  : 'Otwórz ponownie z wybranym kodowaniem', // from v2.1.19 added 2.12.2016
			'saveAsEncoding'  : 'Zapisz z wybranym kodowaniem', // from v2.1.19 added 2.12.2016
			'selectFolder'    : 'Wybierz katalog', // from v2.1.20 added 13.12.2016
			'firstLetterSearch': 'Wyszukiwanie pierwszej litery', // from v2.1.23 added 24.3.2017
			'presets'         : 'Wstępnie ustalone', // from v2.1.25 added 26.5.2017
			'tooManyToTrash'  : 'To zbyt wiele rzeczy, więc nie mogą być w koszu.', // from v2.1.25 added 9.6.2017
			'TextArea'        : 'PoleTekstowe', // from v2.1.25 added 14.6.2017
			'folderToEmpty'   : 'Opróżnij folder "$1".', // from v2.1.25 added 22.6.2017
			'filderIsEmpty'   : 'Brak elementów w folderze "$1".', // from v2.1.25 added 22.6.2017
			'preference'      : 'Preferencje', // from v2.1.26 added 28.6.2017
			'language'        : 'Ustawienie języka', // from v2.1.26 added 28.6.2017
			'clearBrowserData': 'Zainicjuj ustawienia zapisane w tej przeglądarce', // from v2.1.26 added 28.6.2017
			'toolbarPref'     : 'Ustawienia paska narzędzi', // from v2.1.27 added 2.8.2017
			'charsLeft'       : '... pozostało $1 znak(ów).',  // from v2.1.29 added 30.8.2017
			'linesLeft'       : '... pozostało $1 lini.',  // from v2.1.52 added 16.1.2020
			'sum'             : 'Suma', // from v2.1.29 added 28.9.2017
			'roughFileSize'   : 'Przybliżony rozmiar pliku', // from v2.1.30 added 2.11.2017
			'autoFocusDialog' : 'Skoncentruj się na elemencie dialogowym po najechaniu myszą',  // from v2.1.30 added 2.11.2017
			'select'          : 'Wybierz', // from v2.1.30 added 23.11.2017
			'selectAction'    : 'Działanie po wybraniu pliku', // from v2.1.30 added 23.11.2017
			'useStoredEditor' : 'Otwórz za pomocą ostatnio używanego edytora', // from v2.1.30 added 23.11.2017
			'selectinvert'    : 'Odwróć zaznaczenie', // from v2.1.30 added 25.11.2017
			'renameMultiple'  : 'Czy na pewno chcesz zmienić nazwę $1 wybranych elementów takich jak $2?<br/>Tego nie da się cofnąć!', // from v2.1.31 added 4.12.2017
			'batchRename'     : 'Zmień partiami', // from v2.1.31 added 8.12.2017
			'plusNumber'      : '+ Liczba', // from v2.1.31 added 8.12.2017
			'asPrefix'        : 'Dodaj prefix', // from v2.1.31 added 8.12.2017
			'asSuffix'        : 'Dodaj suffix', // from v2.1.31 added 8.12.2017
			'changeExtention' : 'Zmień rozszerzenie', // from v2.1.31 added 8.12.2017
			'columnPref'      : 'Ustawienia kolumn (Widok listy)', // from v2.1.32 added 6.2.2018
			'reflectOnImmediate' : 'Wszystkie zmiany widoczne natychmiast w archiwum.', // from v2.1.33 added 2.3.2018
			'reflectOnUnmount'   : 'Wszelkie zmiany nie będą widoczne, dopóki nie odłączysz tego woluminu.', // from v2.1.33 added 2.3.2018
			'unmountChildren' : 'Następujący wolumin (y), zamontowany na tym urządzeniu również niezamontowany. Czy na pewno chcesz go odmontować?', // from v2.1.33 added 5.3.2018
			'selectionInfo'   : 'Informacje Wyboru', // from v2.1.33 added 7.3.2018
			'hashChecker'     : 'Algorytmy do pokazywania hash pliku', // from v2.1.33 added 10.3.2018
			'infoItems'       : 'Info Elementów (Wybór Panelu Informacyjnego)', // from v2.1.38 added 28.3.2018
			'pressAgainToExit': 'Naciśnij ponownie, aby wyjść.', // from v2.1.38 added 1.4.2018
			'toolbar'         : 'Pasek narzędziowy', // from v2.1.38 added 4.4.2018
			'workspace'       : 'Obszar Pracy', // from v2.1.38 added 4.4.2018
			'dialog'          : 'Dialog', // from v2.1.38 added 4.4.2018
			'all'             : 'Wszystko', // from v2.1.38 added 4.4.2018
			'iconSize'        : 'Rozmiar Ikony (Podgląd ikon)', // from v2.1.39 added 7.5.2018
			'editorMaximized' : 'Otwórz zmaksymalizowane okno edytora', // from v2.1.40 added 30.6.2018
			'editorConvNoApi' : 'Ponieważ konwersja przez API nie jest obecnie dostępna, należy dokonać konwersji w witrynie.', //from v2.1.40 added 8.7.2018
			'editorConvNeedUpload' : 'Po konwersji musisz przesłać z adresem URL pozycji lub pobranym plikiem, aby zapisać przekonwertowany plik.', //from v2.1.40 added 8.7.2018
			'convertOn'       : 'Konwertuj na stronie $1', // from v2.1.40 added 10.7.2018
			'integrations'    : 'Integracje', // from v2.1.40 added 11.7.2018
			'integrationWith' : 'Ten elFinder ma zintegrowane następujące usługi zewnętrzne. Przed użyciem ich sprawdź warunki użytkowania, politykę prywatności itp.', // from v2.1.40 added 11.7.2018
			'showHidden'      : 'Pokaż ukryte pozycje', // from v2.1.41 added 24.7.2018
			'hideHidden'      : 'Ukryj ukryte pozycje', // from v2.1.41 added 24.7.2018
			'toggleHidden'    : 'Pokaż/Ukryj ukryte pozycje', // from v2.1.41 added 24.7.2018
			'makefileTypes'   : 'Typy plików, które można włączyć za pomocą "Nowy plik"', // from v2.1.41 added 7.8.2018
			'typeOfTextfile'  : 'Typ pliku tekstowego', // from v2.1.41 added 7.8.2018
			'add'             : 'Dodaj', // from v2.1.41 added 7.8.2018
			'theme'           : 'Motyw', // from v2.1.43 added 19.10.2018
			'default'         : 'Domyślnie', // from v2.1.43 added 19.10.2018
			'description'     : 'Opis', // from v2.1.43 added 19.10.2018
			'website'         : 'Witryna', // from v2.1.43 added 19.10.2018
			'author'          : 'Autor', // from v2.1.43 added 19.10.2018
			'email'           : 'E-mail', // from v2.1.43 added 19.10.2018
			'license'         : 'Licencja', // from v2.1.43 added 19.10.2018
			'exportToSave'    : 'Tego elementu nie można zapisać. Aby uniknąć utraty zmian, musisz wyeksportować go na swój komputer.', // from v2.1.44 added 1.12.2018
			'dblclickToSelect': 'Kliknij dwukrotnie plik, aby go wybrać.', // from v2.1.47 added 22.1.2019
			'useFullscreen'   : 'Użyj trybu pełnoekranowego', // from v2.1.47 added 19.2.2019

			/********************************** mimetypes **********************************/
			'kindUnknown'     : 'Nieznany',
			'kindRoot'        : 'Główny Wolumin', // from v2.1.16 added 16.10.2016
			'kindFolder'      : 'Katalog',
			'kindSelects'     : 'Zaznaczenie', // from v2.1.29 added 29.8.2017
			'kindAlias'       : 'Alias',
			'kindAliasBroken' : 'Utracony alias',
			// applications
			'kindApp'         : 'Aplikacja',
			'kindPostscript'  : 'Dokument Postscript',
			'kindMsOffice'    : 'Dokument Office',
			'kindMsWord'      : 'Dokument Word',
			'kindMsExcel'     : 'Dokument Excel',
			'kindMsPP'        : 'Prezentacja PowerPoint',
			'kindOO'          : 'Dokument OpenOffice',
			'kindAppFlash'    : 'Aplikacja Flash',
			'kindPDF'         : 'Dokument przenośny PDF',
			'kindTorrent'     : 'Plik BitTorrent',
			'kind7z'          : 'Archiwum 7z',
			'kindTAR'         : 'Archiwum TAR',
			'kindGZIP'        : 'Archiwum GZIP',
			'kindBZIP'        : 'Archiwum BZIP',
			'kindXZ'          : 'Archiwum XZ',
			'kindZIP'         : 'Archiwum ZIP',
			'kindRAR'         : 'Archiwum RAR',
			'kindJAR'         : 'Plik Java JAR',
			'kindTTF'         : 'Czcionka TrueType',
			'kindOTF'         : 'Czcionka OpenType',
			'kindRPM'         : 'Pakiet RPM',
			// texts
			'kindText'        : 'Dokument tekstowy',
			'kindTextPlain'   : 'Zwykły tekst',
			'kindPHP'         : 'Kod źródłowy PHP',
			'kindCSS'         : 'Kaskadowe arkusze stylów',
			'kindHTML'        : 'Dokument HTML',
			'kindJS'          : 'Kod źródłowy Javascript',
			'kindRTF'         : 'Tekst sformatowany RTF',
			'kindC'           : 'Kod źródłowy C',
			'kindCHeader'     : 'Plik nagłówka C',
			'kindCPP'         : 'Kod źródłowy C++',
			'kindCPPHeader'   : 'Plik nagłówka C++',
			'kindShell'       : 'Skrypt powłoki Unix',
			'kindPython'      : 'Kod źródłowy Python',
			'kindJava'        : 'Kod źródłowy Java',
			'kindRuby'        : 'Kod źródłowy Ruby',
			'kindPerl'        : 'Skrypt Perl',
			'kindSQL'         : 'Kod źródłowy SQL',
			'kindXML'         : 'Dokument XML',
			'kindAWK'         : 'Kod źródłowy AWK',
			'kindCSV'         : 'Tekst rozdzielany przecinkami CSV',
			'kindDOCBOOK'     : 'Dokument Docbook XML',
			'kindMarkdown'    : 'Tekst promocyjny', // added 20.7.2015
			// images
			'kindImage'       : 'Obraz',
			'kindBMP'         : 'Obraz BMP',
			'kindJPEG'        : 'Obraz JPEG',
			'kindGIF'         : 'Obraz GIF',
			'kindPNG'         : 'Obraz PNG',
			'kindTIFF'        : 'Obraz TIFF',
			'kindTGA'         : 'Obraz TGA',
			'kindPSD'         : 'Obraz Adobe Photoshop',
			'kindXBITMAP'     : 'Obraz X BitMap',
			'kindPXM'         : 'Obraz Pixelmator',
			// media
			'kindAudio'       : 'Plik dźwiękowy',
			'kindAudioMPEG'   : 'Plik dźwiękowy MPEG',
			'kindAudioMPEG4'  : 'Plik dźwiękowy MPEG-4',
			'kindAudioMIDI'   : 'Plik dźwiękowy MIDI',
			'kindAudioOGG'    : 'Plik dźwiękowy Ogg Vorbis',
			'kindAudioWAV'    : 'Plik dźwiękowy WAV',
			'AudioPlaylist'   : 'Lista odtwarzania MP3',
			'kindVideo'       : 'Plik wideo',
			'kindVideoDV'     : 'Plik wideo DV',
			'kindVideoMPEG'   : 'Plik wideo MPEG',
			'kindVideoMPEG4'  : 'Plik wideo MPEG-4',
			'kindVideoAVI'    : 'Plik wideo AVI',
			'kindVideoMOV'    : 'Plik wideo Quick Time',
			'kindVideoWM'     : 'Plik wideo Windows Media',
			'kindVideoFlash'  : 'Plik wideo Flash',
			'kindVideoMKV'    : 'Plik wideo Matroska',
			'kindVideoOGG'    : 'Plik wideo Ogg'
		}
	};
}));

js/i18n/elfinder.ro.js000064400000104147151215013370010511 0ustar00/**
 * Română translation
 * @author Cristian Tabacitu <hello@tabacitu.ro>
 * @version 2022-03-03
 */
 (function(root, factory) {
	if (typeof define === 'function' && define.amd) {
		define(['elfinder'], factory);
	} else if (typeof exports !== 'undefined') {
		module.exports = factory(require('elfinder'));
	} else {
		factory(root.elFinder);
	}
}(this, function(elFinder) {
	elFinder.prototype.i18.ro = {
		translator : 'Cristian Tabacitu &lt;hello@tabacitu.ro&gt;',
		language   : 'Română',
		direction  : 'ltr',
		dateFormat : 'd M Y h:i', // will show like: 03 Mar 2022 11:15
		fancyDateFormat : '$1 h:i A', // will show like: Astăzi 11:15 AM
		nonameDateFormat : 'ymd-His', // noname upload will show like: 220303-111529
		messages   : {
			'getShareText' : 'Acțiune',
			'Editor ': 'Editor de coduri',

			/********************************** errors **********************************/
			'error'                : 'Eroare',
			'errUnknown'           : 'Eroare necunoscută.',
			'errUnknownCmd'        : 'Comandă necunoscuta.',
			'errJqui'              : 'Configurație jQuery UI necunoscută. Componentele selectable, draggable și droppable trebuie să fie incluse.',
			'errNode'              : 'elFinder necesită ca DOM Element să fie creat.',
			'errURL'               : 'Configurație elFinder nevalidă! URL option nu este setat.',
			'errAccess'            : 'Acces interzis.',
			'errConnect'           : 'Nu ne-am putut conecta la backend.',
			'errAbort'             : 'Conexiunea a fost oprită.',
			'errTimeout'           : 'Conexiunea a fost întreruptă.',
			'errNotFound'          : 'Nu am gasit backend-ul.',
			'errResponse'          : 'Răspuns backend greșit.',
			'errConf'              : 'Configurație backend greșită.',
			'errJSON'              : 'Modulul PHP JSON nu este instalat.',
			'errNoVolumes'         : 'Volumele citibile nu sunt disponibile.',
			'errCmdParams'         : 'Parametri greșiți pentru comanda "$1".',
			'errDataNotJSON'       : 'Datele nu sunt în format JSON.',
			'errDataEmpty'         : 'Datele sunt goale.',
			'errCmdReq'            : 'Cererea către backend necesită un nume de comandă.',
			'errOpen'              : 'Nu am putut deschide "$1".',
			'errNotFolder'         : 'Obiectul nu este un dosar.',
			'errNotFile'           : 'Obiectul nu este un fișier.',
			'errRead'              : 'Nu am putut citi "$1".',
			'errWrite'             : 'Nu am putu scrie în "$1".',
			'errPerm'              : 'Nu ai permisiunea necesară.',
			'errLocked'            : '"$1" este blocat și nu poate fi redenumit, mutat sau șters.',
			'errExists'            : 'Un fișier cu numele "$1" există deja.',
			'errInvName'           : 'Numele pentru fișier este greșit.',
			'errInvDirname'        : 'Nume de folder nevalid.',  // from v2.1.24 added 12.4.2017
			'errFolderNotFound'    : 'Nu am găsit dosarul.',
			'errFileNotFound'      : 'Nu am găsit fișierul.',
			'errTrgFolderNotFound' : 'Nu am găsit dosarul pentru destinație "$1".',
			'errPopup'             : 'Browserul tău a prevenit deschiderea ferestrei popup. Pentru a deschide fișierul permite deschidere ferestrei.',
			'errMkdir'             : 'Nu am putut crea dosarul "$1".',
			'errMkfile'            : 'Nu am putut crea fișierul "$1".',
			'errRename'            : 'Nu am putut redenumi "$1".',
			'errCopyFrom'          : 'Copierea fișierelor de pe volumul "$1" este interzisă.',
			'errCopyTo'            : 'Copierea fișierelor către volumul "$1" este interzisă.',
			'errMkOutLink'         : 'Nu am putut crea linkul în afara volumului rădăcină.', // from v2.1 added 03.10.2015
			'errUpload'            : 'Eroare de upload.',  // old name - errUploadCommon
			'errUploadFile'        : 'Nu am putut urca "$1".', // old name - errUpload
			'errUploadNoFiles'     : 'Nu am găsit fișiere pentru a le urca.',
			'errUploadTotalSize'   : 'Datele depâșest limita maximă de mărime.', // old name - errMaxSize
			'errUploadFileSize'    : 'Fișierul este prea mare.', //  old name - errFileMaxSize
			'errUploadMime'        : 'Acest tip de fișier nu este permis.',
			'errUploadTransfer'    : 'Eroare la transferarea "$1".',
			'errUploadTemp'        : 'Nu am putut crea fișierul temporar pentru upload.', // from v2.1 added 26.09.2015
			'errNotReplace'        : 'Obiectul "$1" există deja în acest loc și nu poate fi înlocuit de un obiect de alt tip.', // new
			'errReplace'           : 'Nu am putut înlocui "$1".',
			'errSave'              : 'Nu am putut salva "$1".',
			'errCopy'              : 'Nu am putut copia "$1".',
			'errMove'              : 'Nu am putut muta "$1".',
			'errCopyInItself'      : 'Nu am putut copia "$1" în el însuși.',
			'errRm'                : 'Nu am putut șterge "$1".',
			'errTrash'             : 'Imposibil în coșul de gunoi.', // from v2.1.24 added 30.4.2017
			'errRmSrc'             : 'Nu am putut șterge fișierul sursă.',
			'errExtract'           : 'Nu am putut extrage fișierele din "$1".',
			'errArchive'           : 'Nu am putut crea arhiva.',
			'errArcType'           : 'Arhiva este de un tip nesuportat.',
			'errNoArchive'         : 'Fișierul nu este o arhiva sau este o arhivă de un tip necunoscut.',
			'errCmdNoSupport'      : 'Backend-ul nu suportă această comandă.',
			'errReplByChild'       : 'Dosarul “$1” nu poate fi înlocuit de un element pe care el îl conține.',
			'errArcSymlinks'       : 'Din motive de securitate, arhiva nu are voie să conțină symlinks sau fișiere cu nume interzise.', // edited 24.06.2012
			'errArcMaxSize'        : 'Fișierul arhivei depășește mărimea maximă permisă.',
			'errResize'            : 'Nu am putut redimensiona "$1".',
			'errResizeDegree'      : 'Grad de rotație nevalid.',  // added 7.3.2013
			'errResizeRotate'      : 'Imaginea nu a fost rotită.',  // added 7.3.2013
			'errResizeSize'        : 'Mărimea imaginii este nevalidă.',  // added 7.3.2013
			'errResizeNoChange'    : 'Mărimea imaginii nu a fost schimbată.',  // added 7.3.2013
			'errUsupportType'      : 'Tipul acesta de fișier nu este suportat.',
			'errNotUTF8Content'    : 'Fișierul "$1" nu folosește UTF-8 și nu poate fi editat.',  // added 9.11.2011
			'errNetMount'          : 'Nu am putut încărca "$1".', // added 17.04.2012
			'errNetMountNoDriver'  : 'Protocol nesuportat.',     // added 17.04.2012
			'errNetMountFailed'    : 'Încărcare eșuată.',         // added 17.04.2012
			'errNetMountHostReq'   : 'Gazda este necesară.', // added 18.04.2012
			'errSessionExpires'    : 'Sesiunea a expirat datorită lipsei de activitate.',
			'errCreatingTempDir'   : 'Nu am putut crea fișierul temporar: "$1"',
			'errFtpDownloadFile'   : 'Nu am putut descarca fișierul de pe FTP: "$1"',
			'errFtpUploadFile'     : 'Nu am putut încărca fișierul pe FTP: "$1"',
			'errFtpMkdir'          : 'Nu am putut crea acest dosar pe FTP: "$1"',
			'errArchiveExec'       : 'Eroare la arhivarea fișierelor: "$1"',
			'errExtractExec'       : 'Eroare la dezarhivarea fișierelor: "$1"',
			'errNetUnMount'        : 'Nu am putut elimina volumul', // from v2.1 added 30.04.2012
			'errConvUTF8'          : 'Nu poate fi convertit la UTF-8', // from v2.1 added 08.04.2014
			'errFolderUpload'      : 'Pentru a urca dosare încearcă Google Chrome.', // from v2.1 added 26.6.2015
			'errSearchTimeout'     : 'Timpul expirat în timpul căutării „$1”. Rezultatul căutării este parțial.', // from v2.1 added 12.1.2016
			'errReauthRequire'     : 'Este necesară reautorizarea.', // from v2.1.10 added 24.3.2016
			'errMaxTargets'        : 'Numărul maxim de articole selectabile este de 1 USD.', // from v2.1.17 added 17.10.2016
			'errRestore'           : 'Nu se poate restabili din coșul de gunoi. Nu se poate identifica destinația de restaurare.', // from v2.1.24 added 3.5.2017
			'errEditorNotFound'    : 'Editorul nu a fost găsit pentru acest tip de fișier.', // from v2.1.25 added 23.5.2017
			'errServerError'       : 'A apărut o eroare pe partea serverului.', // from v2.1.25 added 16.6.2017
			'errEmpty'             : 'Nu se poate goli folderul „$1”.', // from v2.1.25 added 22.6.2017
			'moreErrors'           : 'Mai sunt erori de $1.', // from v2.1.44 added 9.12.2018
			'errMaxMkdirs'         : 'Puteți crea până la $1 foldere simultan.', // from v2.1.58 added 20.6.2021

			/******************************* commands names ********************************/
			'cmdarchive'   : 'Creeaza arhivă',
			'cmdback'      : 'Înapoi',
			'cmdcopy'      : 'Copiază',
			'cmdcut'       : 'Taie',
			'cmddownload'  : 'Descarcă',
			'cmdduplicate' : 'Creează duplicat',
			'cmdedit'      : 'Modifică fișier',
			'cmdextract'   : 'Extrage fișierele din arhivă',
			'cmdforward'   : 'Înainte',
			'cmdgetfile'   : 'Alege fișiere',
			'cmdhelp'      : 'Despre acest software',
			'cmdhome'      : 'Acasă',
			'cmdinfo'      : 'Informații',
			'cmdmkdir'     : 'Dosar nou',
			'cmdmkdirin'   : 'În folderul nou', // from v2.1.7 added 19.2.2016
			'cmdmkfile'    : 'Fișier nou',
			'cmdopen'      : 'Deschide',
			'cmdpaste'     : 'Lipește',
			'cmdquicklook' : 'Previzualizează',
			'cmdreload'    : 'Reîncarcă',
			'cmdrename'    : 'Redenumește',
			'cmdrm'        : 'Șterge',
			'cmdtrash'     : 'În gunoi', //from v2.1.24 added 29.4.2017
			'cmdrestore'   : 'Restabili', //from v2.1.24 added 3.5.2017
			'cmdsearch'    : 'Găsește fișiere',
			'cmdup'        : 'Mergi la dosarul părinte',
			'cmdupload'    : 'Urcă fișiere',
			'cmdview'      : 'Vezi',
			'cmdresize'    : 'Redimensionează & rotește',
			'cmdsort'      : 'Sortează',
			'cmdnetmount'  : 'Încarcă volum din rețea', // added 18.04.2012
			'cmdnetunmount': 'Elimină volum', // from v2.1 added 30.04.2012
			'cmdplaces'    : 'La Locuri', // added 28.12.2014
			'cmdchmod'     : 'Schimbă mod', // from v2.1 added 20.6.2015
			'cmdopendir'   : 'Deschide un folder', // from v2.1 added 13.1.2016
			'cmdcolwidth'  : 'Resetați lățimea coloanei', // from v2.1.13 added 12.06.2016
			'cmdfullscreen': 'Ecran complet', // from v2.1.15 added 03.08.2016
			'cmdmove'      : 'Mișcare', // from v2.1.15 added 21.08.2016
			'cmdempty'     : 'Goliți folderul', // from v2.1.25 added 22.06.2017
			'cmdundo'      : 'Anula', // from v2.1.27 added 31.07.2017
			'cmdredo'      : 'A reface', // from v2.1.27 added 31.07.2017
			'cmdpreference': 'Preferințe', // from v2.1.27 added 03.08.2017
			'cmdselectall' : 'Selectează tot', // from v2.1.28 added 15.08.2017
			'cmdselectnone': 'Selectați niciunul', // from v2.1.28 added 15.08.2017
			'cmdselectinvert': 'Inverseaza selectia', // from v2.1.28 added 15.08.2017
			'cmdopennew'   : 'Deschide într-o fereastră nouă', // from v2.1.38 added 3.4.2018
			'cmdhide'      : 'Ascunde (Preferință)', // from v2.1.41 added 24.7.2018

			/*********************************** buttons ***********************************/
			'btnClose'  : 'Închide',
			'btnSave'   : 'Salvează',
			'btnRm'     : 'Șterge',
			'btnApply'  : 'Aplică',
			'btnCancel' : 'Anulează',
			'btnNo'     : 'Nu',
			'btnYes'    : 'Da',
			'btnMount'  : 'Încarcă',  // added 18.04.2012
			'btnApprove': 'Mergi la $1 și aprobă', // from v2.1 added 26.04.2012
			'btnUnmount': 'Elimină volum', // from v2.1 added 30.04.2012
			'btnConv'   : 'Convertește', // from v2.1 added 08.04.2014
			'btnCwd'    : 'Aici',      // from v2.1 added 22.5.2015
			'btnVolume' : 'Volum',    // from v2.1 added 22.5.2015
			'btnAll'    : 'Toate',       // from v2.1 added 22.5.2015
			'btnMime'   : 'Tipuri MIME', // from v2.1 added 22.5.2015
			'btnFileName':'Nume fișier',  // from v2.1 added 22.5.2015
			'btnSaveClose': 'Salvează și închide', // from v2.1 added 12.6.2015
			'btnBackup' : 'Backup', // fromv2.1 added 28.11.2015
			'btnRename'    : 'Redenumiți',      // from v2.1.24 added 6.4.2017
			'btnRenameAll' : 'Redenumiți(Toate)', // from v2.1.24 added 6.4.2017
			'btnPrevious' : 'Anterior ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnNext'     : 'Următorul ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnSaveAs'   : 'Salvează ca', // from v2.1.25 added 24.5.2017

			/******************************** notifications ********************************/
			'ntfopen'     : 'Deschide dosar',
			'ntffile'     : 'Deschide fișier',
			'ntfreload'   : 'Actualizează conținutul dosarului',
			'ntfmkdir'    : 'Se creează dosarul',
			'ntfmkfile'   : 'Se creează fișierele',
			'ntfrm'       : 'Șterge fișiere',
			'ntfcopy'     : 'Copiază fișiere',
			'ntfmove'     : 'Mută fișiere',
			'ntfprepare'  : 'Pregătește copierea fișierelor',
			'ntfrename'   : 'Redenumește fișiere',
			'ntfupload'   : 'Se urcă fișierele',
			'ntfdownload' : 'Se descarcă fișierele',
			'ntfsave'     : 'Salvează fișiere',
			'ntfarchive'  : 'Se creează arhiva',
			'ntfextract'  : 'Se extrag fișierele din arhivă',
			'ntfsearch'   : 'Se caută fișierele',
			'ntfresize'   : 'Se redimnesionează imaginile',
			'ntfsmth'     : 'Se întamplă ceva',
			'ntfloadimg'  : 'Se încarcă imaginea',
			'ntfnetmount' : 'Se încarcă volumul din rețea', // added 18.04.2012
			'ntfnetunmount': 'Se elimină volumul din rețea', // from v2.1 added 30.04.2012
			'ntfdim'      : 'Se preiau dimensiunile imaginii', // added 20.05.2013
			'ntfreaddir'  : 'Se citesc informațiile dosarului', // from v2.1 added 01.07.2013
			'ntfurl'      : 'Se preia URL-ul din link', // from v2.1 added 11.03.2014
			'ntfchmod'    : 'Se schimba modul de fișier', // from v2.1 added 20.6.2015
			'ntfpreupload': 'Se verifică numele fișierului de încărcare', // from v2.1 added 31.11.2015
			'ntfzipdl'    : 'Crearea unui fișier pentru descărcare', // from v2.1.7 added 23.1.2016
			'ntfparents'  : 'Obținerea informațiilor despre cale', // from v2.1.17 added 2.11.2016
			'ntfchunkmerge': 'Se procesează fișierul încărcat', // from v2.1.17 added 2.11.2016
			'ntftrash'    : 'Aruncă la gunoi', // from v2.1.24 added 2.5.2017
			'ntfrestore'  : 'Se efectuează restaurarea din coșul de gunoi', // from v2.1.24 added 3.5.2017
			'ntfchkdir'   : 'Se verifică folderul de destinație', // from v2.1.24 added 3.5.2017
			'ntfundo'     : 'Se anulează operația anterioară', // from v2.1.27 added 31.07.2017
			'ntfredo'     : 'Se reface anularea anterioară', // from v2.1.27 added 31.07.2017
			'ntfchkcontent' : 'Verificarea conținutului', // from v2.1.41 added 3.8.2018

			/*********************************** volumes *********************************/
			'volume_Trash' : 'Gunoi', //from v2.1.24 added 29.4.2017

			/************************************ dates **********************************/
			'dateUnknown' : 'necunoscută',
			'Today'       : 'Astăzi',
			'Yesterday'   : 'Ieri',
			'msJan'       : 'Ian',
			'msFeb'       : 'Feb',
			'msMar'       : 'Mar',
			'msApr'       : 'Aprilie',
			'msMay'       : 'Mai',
			'msJun'       : 'Iun',
			'msJul'       : 'Iul',
			'msAug'       : 'aug',
			'msSep'       : 'sept',
			'msOct'       : 'oct',
			'msNov'       : 'nov',
			'msDec'       : 'Dec',
			'January'     : 'Ianuarie',
			'February'    : 'Februarie',
			'March'       : 'Martie',
			'April'       : 'Aprilie',
			'May'         : 'Mai',
			'June'        : 'Iunie',
			'July'        : 'Iulie',
			'August'      : 'August',
			'September'   : 'Septembrie',
			'October'     : 'Octombrie',
			'November'    : 'Noiembrie',
			'December'    : 'Decembrie',
			'Sunday'      : 'Duminică',
			'Monday'      : 'Luni',
			'Tuesday'     : 'Marți',
			'Wednesday'   : 'Miercuri',
			'Thursday'    : 'Joi',
			'Friday'      : 'Vineri',
			'Saturday'    : 'Sâmbătă',
			'Sun'         : 'Du',
			'Mon'         : 'Lu',
			'Tue'         : 'Ma',
			'Wed'         : 'Mi',
			'Thu'         : 'Jo',
			'Fri'         : 'Vi',
			'Sat'         : 'Sâ',

			/******************************** sort variants ********************************/
			'sortname'          : 'după nume',
			'sortkind'          : 'după tip',
			'sortsize'          : 'după mărime',
			'sortdate'          : 'după dată',
			'sortFoldersFirst'  : 'Dosarele primele',
			'sortperm'          : 'cu permisiunea', // from v2.1.13 added 13.06.2016
			'sortmode'          : 'după mod',       // from v2.1.13 added 13.06.2016
			'sortowner'         : 'de catre proprietar',      // from v2.1.13 added 13.06.2016
			'sortgroup'         : 'pe grupe',      // from v2.1.13 added 13.06.2016
			'sortAlsoTreeview'  : 'De asemenea, Treeview',  // from v2.1.15 added 01.08.2016

			/********************************** new items **********************************/
			'untitled file.txt' : 'FisierNou.txt', // added 10.11.2015
			'untitled folder'   : 'DosarNou',   // added 10.11.2015
			'Archive'           : 'ArhivaNoua',  // from v2.1 added 10.11.2015
			'untitled file'     : 'Fișier nou.$1',  // from v2.1.41 added 6.8.2018
			'extentionfile'     : '$1: Fișier',    // from v2.1.41 added 6.8.2018
			'extentiontype'     : '$1: $2',      // from v2.1.43 added 17.10.2018

			/********************************** messages **********************************/
			'confirmReq'      : 'Este necesară confirmare',
			'confirmRm'       : 'Ești sigur că vrei să ștergi fișierele?<br/>Acțiunea este ireversibilă!',
			'confirmRepl'     : 'Înlocuiește fișierul vechi cu cel nou?',
			'confirmRest'     : 'Înlocuiți elementul existent cu articolul din coșul de gunoi?', // fromv2.1.24 added 5.5.2017
			'confirmConvUTF8' : 'Nu este în UTF-8<br/>Convertim la UTF-8?<br/>Conținutul devine UTF-8 după salvarea conversiei.', // from v2.1 added 08.04.2014
			'confirmNonUTF8'  : 'Codificarea caracterelor acestui fișier nu a putut fi detectată. Trebuie să se convertească temporar în UTF-8 pentru editare.<br/>Selectați codificarea caracterelor pentru acest fișier.', // from v2.1.19 added 28.11.2016
			'confirmNotSave'  : 'Au avut loc modificări.<br/>Dacă nu salvezi se vor pierde modificările.', // from v2.1 added 15.7.2015
			'confirmTrash'    : 'Sigur doriți să mutați articolele în coșul de gunoi?', //from v2.1.24 added 29.4.2017
			'confirmMove'     : 'Sigur doriți să mutați articole în „$1”?', //from v2.1.50 added 27.7.2019
			'apllyAll'        : 'Aplică pentru toate',
			'name'            : 'Nume',
			'size'            : 'Mărime',
			'perms'           : 'Permisiuni',
			'modify'          : 'Modificat la',
			'kind'            : 'Tip',
			'read'            : 'citire',
			'write'           : 'scriere',
			'noaccess'        : 'acces interzis',
			'and'             : 'și',
			'unknown'         : 'necunoscut',
			'selectall'       : 'Alege toate fișierele',
			'selectfiles'     : 'Alege fișier(e)',
			'selectffile'     : 'Alege primul fișier',
			'selectlfile'     : 'Alege ultimul fișier',
			'viewlist'        : 'Vezi ca listă',
			'viewicons'       : 'Vezi ca icoane',
			'viewSmall'       : 'Pictograme mici', // from v2.1.39 added 22.5.2018
			'viewMedium'      : 'Pictograme medii', // from v2.1.39 added 22.5.2018
			'viewLarge'       : 'Pictograme mari', // from v2.1.39 added 22.5.2018
			'viewExtraLarge'  : 'Pictograme foarte mari', // from v2.1.39 added 22.5.2018
			'places'          : 'Locuri',
			'calc'            : 'Calculează',
			'path'            : 'Cale',
			'aliasfor'        : 'Alias pentru',
			'locked'          : 'Securizat',
			'dim'             : 'Dimensiuni',
			'files'           : 'Fișiere',
			'folders'         : 'Dosare',
			'items'           : 'Elemente',
			'yes'             : 'da',
			'no'              : 'nu',
			'link'            : 'Legătură',
			'searcresult'     : 'Rezultatele căutării',
			'selected'        : 'elemente alese',
			'about'           : 'Despre',
			'shortcuts'       : 'Scurtături',
			'help'            : 'Ajutor',
			'webfm'           : 'Manager web pentru fișiere',
			'ver'             : 'Versiune',
			'protocolver'     : 'versiune protocol',
			'homepage'        : 'Pagina proiectului',
			'docs'            : 'Documentație',
			'github'          : 'Fork nou pe Github',
			'twitter'         : 'Urmărește-ne pe twitter',
			'facebook'        : 'Alătura-te pe facebook',
			'team'            : 'Echipa',
			'chiefdev'        : 'dezvoltator șef',
			'developer'       : 'dezvoltator',
			'contributor'     : 'contribuitor',
			'maintainer'      : 'întreţinător',
			'translator'      : 'traducător',
			'icons'           : 'Icoane',
			'dontforget'      : 'și nu uita să-ți iei prosopul',
			'shortcutsof'     : 'Scurtăturile sunt dezactivate',
			'dropFiles'       : 'Dă drumul fișierelor aici',
			'or'              : 'sau',
			'selectForUpload' : 'Alege fișiere pentru a le urca',
			'moveFiles'       : 'Mută fișiere',
			'copyFiles'       : 'Copiază fișiere',
			'restoreFiles'    : 'Restaurați articolele', // from v2.1.24 added 5.5.2017
			'rmFromPlaces'    : 'Șterge din locuri',
			'aspectRatio'     : 'Raportul de aspect',
			'scale'           : 'Scală',
			'width'           : 'Lățime',
			'height'          : 'Înălțime',
			'resize'          : 'Redimensionează',
			'crop'            : 'Decupează',
			'rotate'          : 'Rotește',
			'rotate-cw'       : 'Rotește cu 90° în sensul ceasului',
			'rotate-ccw'      : 'Rotește cu 90° în sensul invers ceasului',
			'degree'          : '°',
			'netMountDialogTitle' : 'Încarcă volum din rețea', // added 18.04.2012
			'protocol'            : 'Protocol', // added 18.04.2012
			'host'                : 'Gazdă', // added 18.04.2012
			'port'                : 'Port', // added 18.04.2012
			'user'                : 'Utilizator', // added 18.04.2012
			'pass'                : 'Parolă', // added 18.04.2012
			'confirmUnmount'      : 'Vrei să elimini volumul $1?',  // from v2.1 added 30.04.2012
			'dropFilesBrowser': 'Drag&drop sau lipește din browser', // from v2.1 added 30.05.2012
			'dropPasteFiles'  : 'Drag&drop sau lipește fișiere aici', // from v2.1 added 07.04.2014
			'encoding'        : 'Encodare', // from v2.1 added 19.12.2014
			'locale'          : 'Locale',   // from v2.1 added 19.12.2014
			'searchTarget'    : 'Țintă: $1',                // from v2.1 added 22.5.2015
			'searchMime'      : 'Caută după tipul MIME', // from v2.1 added 22.5.2015
			'owner'           : 'Proprietar', // from v2.1 added 20.6.2015
			'group'           : 'grup', // from v2.1 added 20.6.2015
			'other'           : 'Alte', // from v2.1 added 20.6.2015
			'execute'         : 'A executa', // from v2.1 added 20.6.2015
			'perm'            : 'Permisiune', // from v2.1 added 20.6.2015
			'mode'            : 'Mod', // from v2.1 added 20.6.2015
			'emptyFolder'     : 'Folderul este gol', // from v2.1.6 added 30.12.2015
			'emptyFolderDrop' : 'Folderul este gol\\A Drop pentru a adăuga elemente', // from v2.1.6 added 30.12.2015
			'emptyFolderLTap' : 'Dosarul este gol\\A Atingeți lung pentru a adăuga elemente', // from v2.1.6 added 30.12.2015
			'quality'         : 'Calitate', // from v2.1.6 added 5.1.2016
			'autoSync'        : 'Auto-sincronizare',  // from v2.1.6 added 10.1.2016
			'moveUp'          : 'Mișcă-te în sus',  // from v2.1.6 added 18.1.2016
			'getLink'         : 'Obțineți linkul URL', // from v2.1.7 added 9.2.2016
			'selectedItems'   : 'Articole selectate ($1)', // from v2.1.7 added 2.19.2016
			'folderId'        : 'ID dosar', // from v2.1.10 added 3.25.2016
			'offlineAccess'   : 'Permite accesul offline', // from v2.1.10 added 3.25.2016
			'reAuth'          : 'Pentru a se re-autentifica', // from v2.1.10 added 3.25.2016
			'nowLoading'      : 'Acum se încarcă...', // from v2.1.12 added 4.26.2016
			'openMulti'       : 'Deschideți mai multe fișiere', // from v2.1.12 added 5.14.2016
			'openMultiConfirm': 'Încercați să deschideți fișierele $1. Sigur doriți să deschideți în browser?', // from v2.1.12 added 5.14.2016
			'emptySearch'     : 'Rezultatele căutării sunt goale în ținta de căutare.', // from v2.1.12 added 5.16.2016
			'editingFile'     : 'Este editarea unui fișier.', // from v2.1.13 added 6.3.2016
			'hasSelected'     : 'Ați selectat articole de 1 USD.', // from v2.1.13 added 6.3.2016
			'hasClipboard'    : 'Aveți articole de 1 USD în clipboard.', // from v2.1.13 added 6.3.2016
			'incSearchOnly'   : 'Căutarea incrementală este numai din vizualizarea curentă.', // from v2.1.13 added 6.30.2016
			'reinstate'       : 'Reintroduceți', // from v2.1.15 added 3.8.2016
			'complete'        : '1 dolar complet', // from v2.1.15 added 21.8.2016
			'contextmenu'     : 'Meniul contextual', // from v2.1.15 added 9.9.2016
			'pageTurning'     : 'Întoarcerea paginii', // from v2.1.15 added 10.9.2016
			'volumeRoots'     : 'Rădăcini de volum', // from v2.1.16 added 16.9.2016
			'reset'           : 'Resetează', // from v2.1.16 added 1.10.2016
			'bgcolor'         : 'Culoare de fundal', // from v2.1.16 added 1.10.2016
			'colorPicker'     : 'Selector de culoare', // from v2.1.16 added 1.10.2016
			'8pxgrid'         : 'Grilă 8px', // from v2.1.16 added 4.10.2016
			'enabled'         : 'Activat', // from v2.1.16 added 4.10.2016
			'disabled'        : 'Dezactivat', // from v2.1.16 added 4.10.2016
			'emptyIncSearch'  : 'Rezultatele căutării sunt goale în vizualizarea curentă.\\APăsați [Enter] pentru a extinde ținta de căutare.', // from v2.1.16 added 5.10.2016
			'emptyLetSearch'  : 'Rezultatele căutării cu prima literă sunt goale în vizualizarea curentă.', // from v2.1.23 added 24.3.2017
			'textLabel'       : 'Etichetă text', // from v2.1.17 added 13.10.2016
			'minsLeft'        : '1 $ min. rămase', // from v2.1.17 added 13.11.2016
			'openAsEncoding'  : 'Redeschideți cu codificarea selectată', // from v2.1.19 added 2.12.2016
			'saveAsEncoding'  : 'Salvați cu codificarea selectată', // from v2.1.19 added 2.12.2016
			'selectFolder'    : 'Selectați folderul', // from v2.1.20 added 13.12.2016
			'firstLetterSearch': 'Căutare prima literă', // from v2.1.23 added 24.3.2017
			'presets'         : 'Presetări', // from v2.1.25 added 26.5.2017
			'tooManyToTrash'  : 'Sunt prea multe articole, așa că nu pot fi la gunoi.', // from v2.1.25 added 9.6.2017
			'TextArea'        : 'TextArea', // from v2.1.25 added 14.6.2017
			'folderToEmpty'   : 'Goliți folderul „$1”.', // from v2.1.25 added 22.6.2017
			'filderIsEmpty'   : 'Nu există elemente într-un folder „$1”.', // from v2.1.25 added 22.6.2017
			'preference'      : 'Preferinţă', // from v2.1.26 added 28.6.2017
			'language'        : 'Limba', // from v2.1.26 added 28.6.2017
			'clearBrowserData': 'Inițializați setările salvate în acest browser', // from v2.1.26 added 28.6.2017
			'toolbarPref'     : 'Setările barei de instrumente', // from v2.1.27 added 2.8.2017
			'charsLeft'       : '... $1 caractere rămase.',  // from v2.1.29 added 30.8.2017
			'linesLeft'       : '... 1 $ linii rămase.',  // from v2.1.52 added 16.1.2020
			'sum'             : 'Sumă', // from v2.1.29 added 28.9.2017
			'roughFileSize'   : 'Dimensiunea aspră a fișierului', // from v2.1.30 added 2.11.2017
			'autoFocusDialog' : 'Concentrați-vă pe elementul de dialog cu mouseover',  // from v2.1.30 added 2.11.2017
			'select'          : 'Selectați', // from v2.1.30 added 23.11.2017
			'selectAction'    : 'Acțiune când selectați fișierul', // from v2.1.30 added 23.11.2017
			'useStoredEditor' : 'Deschideți cu editorul folosit ultima dată', // from v2.1.30 added 23.11.2017
			'selectinvert'    : 'Inverseaza selectia', // from v2.1.30 added 25.11.2017
			'renameMultiple'  : 'Sigur doriți să redenumiți $1 elementele selectate, cum ar fi $2?<br/>Acest lucru nu poate fi anulat!', // from v2.1.31 added 4.12.2017
			'batchRename'     : 'Redenumirea lotului', // from v2.1.31 added 8.12.2017
			'plusNumber'      : '+ Număr', // from v2.1.31 added 8.12.2017
			'asPrefix'        : 'Adăugați prefix', // from v2.1.31 added 8.12.2017
			'asSuffix'        : 'Adăugați sufix', // from v2.1.31 added 8.12.2017
			'changeExtention' : 'Schimbați extensia', // from v2.1.31 added 8.12.2017
			'columnPref'      : 'Setări coloane (vizualizare listă)', // from v2.1.32 added 6.2.2018
			'reflectOnImmediate' : 'Toate modificările se vor reflecta imediat în arhivă.', // from v2.1.33 added 2.3.2018
			'reflectOnUnmount'   : 'Orice modificare nu se va reflecta până când nu demontați acest volum.', // from v2.1.33 added 2.3.2018
			'unmountChildren' : 'Următoarele volume montate pe acest volum au fost, de asemenea, demontate. Ești sigur că o demontați?', // from v2.1.33 added 5.3.2018
			'selectionInfo'   : 'Informații de selecție', // from v2.1.33 added 7.3.2018
			'hashChecker'     : 'Algoritmi pentru a afișa hash-ul fișierului', // from v2.1.33 added 10.3.2018
			'infoItems'       : 'Elemente de informații (panoul de informații de selecție)', // from v2.1.38 added 28.3.2018
			'pressAgainToExit': 'Apăsați din nou pentru a ieși.', // from v2.1.38 added 1.4.2018
			'toolbar'         : 'Bara de instrumente', // from v2.1.38 added 4.4.2018
			'workspace'       : 'Spațiu de lucru', // from v2.1.38 added 4.4.2018
			'dialog'          : 'Dialog', // from v2.1.38 added 4.4.2018
			'all'             : 'Toate', // from v2.1.38 added 4.4.2018
			'iconSize'        : 'Dimensiunea pictogramei (vizualizarea pictogramelor)', // from v2.1.39 added 7.5.2018
			'editorMaximized' : 'Deschideți fereastra editorului maximizat', // from v2.1.40 added 30.6.2018
			'editorConvNoApi' : 'Deoarece conversia prin API nu este disponibilă în prezent, vă rugăm să efectuați conversia pe site.', //from v2.1.40 added 8.7.2018
			'editorConvNeedUpload' : 'După conversie, trebuie să fiți încărcat cu adresa URL a articolului sau cu un fișier descărcat pentru a salva fișierul convertit.', //from v2.1.40 added 8.7.2018
			'convertOn'       : 'Convertiți pe site-ul de $1', // from v2.1.40 added 10.7.2018
			'integrations'    : 'Integrari', // from v2.1.40 added 11.7.2018
			'integrationWith' : 'Acest elFinder are următoarele servicii externe integrate. Vă rugăm să verificați termenii de utilizare, politica de confidențialitate etc. înainte de a o utiliza.', // from v2.1.40 added 11.7.2018
			'showHidden'      : 'Afișează elementele ascunse', // from v2.1.41 added 24.7.2018
			'hideHidden'      : 'Ascunde elementele ascunse', // from v2.1.41 added 24.7.2018
			'toggleHidden'    : 'Afișează/Ascunde elementele ascunse', // from v2.1.41 added 24.7.2018
			'makefileTypes'   : 'Tipuri de fișiere de activat cu „Fișier nou”', // from v2.1.41 added 7.8.2018
			'typeOfTextfile'  : 'Tipul fișierului text', // from v2.1.41 added 7.8.2018
			'add'             : 'Adăuga', // from v2.1.41 added 7.8.2018
			'theme'           : 'Temă', // from v2.1.43 added 19.10.2018
			'default'         : 'Mod implicit', // from v2.1.43 added 19.10.2018
			'description'     : 'Descriere', // from v2.1.43 added 19.10.2018
			'website'         : 'Site-ul web', // from v2.1.43 added 19.10.2018
			'author'          : 'Autor', // from v2.1.43 added 19.10.2018
			'email'           : 'E-mail', // from v2.1.43 added 19.10.2018
			'license'         : 'Licență', // from v2.1.43 added 19.10.2018
			'exportToSave'    : 'Acest articol nu poate fi salvat. Pentru a evita pierderea editărilor, trebuie să exportați pe computer.', // from v2.1.44 added 1.12.2018
			'dblclickToSelect': 'Faceți dublu clic pe fișier pentru a-l selecta.', // from v2.1.47 added 22.1.2019
			'useFullscreen'   : 'Utilizați modul ecran complet', // from v2.1.47 added 19.2.2019

			/********************************** mimetypes **********************************/
			'kindUnknown'     : 'Necunoscut',
			'kindRoot'        : 'Rădăcină de volum', // from v2.1.16 added 16.10.2016
			'kindFolder'      : 'Dosar',
			'kindSelects'     : 'Selecții', // from v2.1.29 added 29.8.2017
			'kindAlias'       : 'Alias',
			'kindAliasBroken' : 'Alias stricat',
			// applications
			'kindApp'         : 'Aplicație',
			'kindPostscript'  : 'Document Postscript',
			'kindMsOffice'    : 'Document Microsoft Office',
			'kindMsWord'      : 'Document Microsoft Word',
			'kindMsExcel'     : 'Document Microsoft Excel',
			'kindMsPP'        : 'Prezentare Microsoft Powerpoint',
			'kindOO'          : 'Document Open Office',
			'kindAppFlash'    : 'Aplicație Flash',
			'kindPDF'         : 'Document Portabil (PDF)',
			'kindTorrent'     : 'Fișier Bittorrent',
			'kind7z'          : 'Arhivă 7z',
			'kindTAR'         : 'Arhivă TAR',
			'kindGZIP'        : 'Arhivă GZIP',
			'kindBZIP'        : 'Arhivă BZIP',
			'kindXZ'          : 'Arhivă XZ',
			'kindZIP'         : 'Arhivă ZIP',
			'kindRAR'         : 'Arhivă RAR',
			'kindJAR'         : 'Fișier Java JAR',
			'kindTTF'         : 'Font True Type',
			'kindOTF'         : 'Font Open Type',
			'kindRPM'         : 'Pachet RPM',
			// texts
			'kindText'        : 'Document text',
			'kindTextPlain'   : 'Text simplu',
			'kindPHP'         : 'Sursă PHP',
			'kindCSS'         : 'Fișier de stil (CSS)',
			'kindHTML'        : 'Document HTML',
			'kindJS'          : 'Sursă Javascript',
			'kindRTF'         : 'Text formatat (rich text)',
			'kindC'           : 'Sursă C',
			'kindCHeader'     : 'Sursă C header',
			'kindCPP'         : 'Sursă C++',
			'kindCPPHeader'   : 'Sursă C++ header',
			'kindShell'       : 'Script terminal Unix',
			'kindPython'      : 'Sursă Python',
			'kindJava'        : 'Sursă Java',
			'kindRuby'        : 'Sursă Ruby',
			'kindPerl'        : 'Script Perl',
			'kindSQL'         : 'Sursă SQL',
			'kindXML'         : 'Document XML',
			'kindAWK'         : 'Sursă AWK',
			'kindCSV'         : 'Valori separate de virgulă (CSV)',
			'kindDOCBOOK'     : 'Document Docbook XML',
			'kindMarkdown'    : 'Text Markdown', // added 20.7.2015
			// images
			'kindImage'       : 'Imagine',
			'kindBMP'         : 'Imagine BMP',
			'kindJPEG'        : 'Imagine JPEG',
			'kindGIF'         : 'Imagine GIF',
			'kindPNG'         : 'Imagine PNG',
			'kindTIFF'        : 'Imagine TIFF',
			'kindTGA'         : 'Imagine TGA',
			'kindPSD'         : 'Imagine Adobe Photoshop',
			'kindXBITMAP'     : 'Imagine X bitmap',
			'kindPXM'         : 'Imagine Pixelmator',
			// media
			'kindAudio'       : 'Audio',
			'kindAudioMPEG'   : 'Audio MPEG',
			'kindAudioMPEG4'  : 'Audio MPEG-4',
			'kindAudioMIDI'   : 'Audio MIDI',
			'kindAudioOGG'    : 'Audio Ogg Vorbis',
			'kindAudioWAV'    : 'Audio WAV',
			'AudioPlaylist'   : 'Playlist MP3',
			'kindVideo'       : 'Video',
			'kindVideoDV'     : 'Video DV',
			'kindVideoMPEG'   : 'Video MPEG',
			'kindVideoMPEG4'  : 'Video MPEG-4',
			'kindVideoAVI'    : 'Video AVI',
			'kindVideoMOV'    : 'Video Quick Time',
			'kindVideoWM'     : 'Video Windows Media',
			'kindVideoFlash'  : 'Video Flash',
			'kindVideoMKV'    : 'Video Matroska',
			'kindVideoOGG'    : 'Video Ogg'
		}
	};
}));

js/i18n/elfinder.ca.js000064400000105025151215013370010450 0ustar00/**
 * Català translation
 * @author Sergio Jovani <lesergi@gmail.com>
 * @version 2022-02-28
 */
 (function(root, factory) {
	if (typeof define === 'function' && define.amd) {
		define(['elfinder'], factory);
	} else if (typeof exports !== 'undefined') {
		module.exports = factory(require('elfinder'));
	} else {
		factory(root.elFinder);
	}
}(this, function(elFinder) {
	elFinder.prototype.i18.ca = {
		translator : 'Sergio Jovani &lt;lesergi@gmail.com&gt;',
		language   : 'Català',
		direction  : 'ltr',
		dateFormat : 'M d, Y h:i A', // will show like: febr. 28, 2022 11:14 AM
		fancyDateFormat : '$1 h:i A', // will show like: Avui 11:14 AM
		nonameDateFormat : 'ymd-His', // noname upload will show like: 220228-111450
		messages   : {
			'getShareText' : 'Compartir',
			'Editor ': 'Editor de codi',
			/********************************** errors **********************************/
			'error'                : 'Error',
			'errUnknown'           : 'Error desconegut.',
			'errUnknownCmd'        : 'Ordre desconeguda.',
			'errJqui'              : 'La configuració de jQuery UI no és vàlida. S\'han d\'incloure els components "selectable", "draggable" i "droppable".',
			'errNode'              : 'elFinder necessita crear elements DOM.',
			'errURL'               : 'La configuració de l\'elFinder no és vàlida! L\'opció URL no està configurada.',
			'errAccess'            : 'Accés denegat.',
			'errConnect'           : 'No s\'ha pogut connectar amb el rerefons.',
			'errAbort'             : 'S\'ha interromput la connexió.',
			'errTimeout'           : 'Temps de connexió excedit.',
			'errNotFound'          : 'No s\'ha trobat el rerefons.',
			'errResponse'          : 'La resposta del rerefons no és vàlida.',
			'errConf'              : 'La configuració del rerefons no és vàlida.',
			'errJSON'              : 'No està instal·lat el mòdul JSON del PHP.',
			'errNoVolumes'         : 'No s\'han trobat volums llegibles.',
			'errCmdParams'         : 'Els paràmetres per l\'ordre "$1" no són vàlids.',
			'errDataNotJSON'       : 'Les dades no són JSON.',
			'errDataEmpty'         : 'Les dades estan buides.',
			'errCmdReq'            : 'La sol·licitud del rerefons necessita el nom de l\'ordre.',
			'errOpen'              : 'No s\'ha pogut obrir "$1".',
			'errNotFolder'         : 'L\'objecte no és una carpeta.',
			'errNotFile'           : 'L\'objecte no és un fitxer.',
			'errRead'              : 'No s\'ha pogut llegir "$1".',
			'errWrite'             : 'No s\'ha pogut escriure a "$1".',
			'errPerm'              : 'Permís denegat.',
			'errLocked'            : '"$1" està bloquejat i no podeu canviar-li el nom, moure-lo ni suprimir-lo.',
			'errExists'            : 'Ja existeix un fitxer anomenat "$1".',
			'errInvName'           : 'El nom de fitxer no és vàlid.',
			'errInvDirname'        : 'Nom de carpeta no vàlid.',  // from v2.1.24 added 12.4.2017
			'errFolderNotFound'    : 'No s\'ha trobat la carpeta.',
			'errFileNotFound'      : 'No s\'ha trobat el fitxer.',
			'errTrgFolderNotFound' : 'No s\'ha trobat la carpeta de destí "$1".',
			'errPopup'             : 'El navegador ha evitat obrir una finestra emergent. Autoritzeu-la per obrir el fitxer.',
			'errMkdir'             : 'No s\'ha pogut crear la carpeta "$1".',
			'errMkfile'            : 'No s\'ha pogut crear el fitxer "$1".',
			'errRename'            : 'No s\'ha pogut canviar el nom de "$1".',
			'errCopyFrom'          : 'No està permès copiar fitxers des del volum "$1".',
			'errCopyTo'            : 'No està permès copiar fitxers al volum "$1".',
			'errMkOutLink'         : 'No es pot crear un enllaç fora de l\'arrel del volum.', // from v2.1 added 03.10.2015
			'errUpload'            : 'S\'ha produït un error en la càrrega.',  // old name - errUploadCommon
			'errUploadFile'        : 'No s\'ha pogut carregar "$1".', // old name - errUpload
			'errUploadNoFiles'     : 'No s\'han trobat fitxers per carregar.',
			'errUploadTotalSize'   : 'Les dades excedeixen la mida màxima permesa.', // old name - errMaxSize
			'errUploadFileSize'    : 'El fitxer excedeix la mida màxima permesa.', //  old name - errFileMaxSize
			'errUploadMime'        : 'El tipus de fitxer no està permès.',
			'errUploadTransfer'    : 'S\'ha produït un error en transferir "$1".',
			'errUploadTemp'        : 'No es pot crear un fitxer temporal per carregar-lo.', // from v2.1 added 26.09.2015
			'errNotReplace'        : 'L\'objecte "$1" ja existeix en aquesta ubicació i no es pot substituir per un altre tipus.', // new
			'errReplace'           : 'No es pot substituir "$1".',
			'errSave'              : 'No s\'ha pogut desar "$1".',
			'errCopy'              : 'No s\'ha pogut copiar "$1".',
			'errMove'              : 'No s\'ha pogut moure "$1".',
			'errCopyInItself'      : 'No s\'ha pogut copiar "$1" a si mateix.',
			'errRm'                : 'No s\'ha pogut suprimir "$1".',
			'errTrash'             : 'No es pot a la paperera.', // from v2.1.24 added 30.4.2017
			'errRmSrc'             : 'No es poden eliminar els fitxers font.',
			'errExtract'           : 'No s\'han pogut extreure els fitxers de "$1".',
			'errArchive'           : 'No s\'ha pogut crear l\'arxiu.',
			'errArcType'           : 'El tipus d\'arxiu no està suportat.',
			'errNoArchive'         : 'El fitxer no és un arxiu o és un tipus no suportat.',
			'errCmdNoSupport'      : 'El rerefons no suporta aquesta ordre.',
			'errReplByChild'       : 'No es pot reemplaçar la carpeta “$1” per un element que conté.',
			'errArcSymlinks'       : 'Per raons de seguretat, no es permet extreure arxius que contenen enllaços simbòlics.', // edited 24.06.2012
			'errArcMaxSize'        : 'Els fitxers de l\'arxiu excedeixen la mida màxima permesa.',
			'errResize'            : 'No s\'ha pogut redimensionar "$1".',
			'errResizeDegree'      : 'El grau de rotació no és vàlid.',  // added 7.3.2013
			'errResizeRotate'      : 'No es pot girar la imatge.',  // added 7.3.2013
			'errResizeSize'        : 'Mida de la imatge no vàlida.',  // added 7.3.2013
			'errResizeNoChange'    : 'La mida de la imatge no ha canviat.',  // added 7.3.2013
			'errUsupportType'      : 'El tipus de fitxer no està suportat.',
			'errNotUTF8Content'    : 'El fitxer "$1" no està en UTF-8 i no es pot editar.',  // added 9.11.2011
			'errNetMount'          : 'No es pot muntar "$1".', // added 17.04.2012
			'errNetMountNoDriver'  : 'Protocol no compatible.',     // added 17.04.2012
			'errNetMountFailed'    : 'El muntatge ha fallat.',         // added 17.04.2012
			'errNetMountHostReq'   : 'Es requereix amfitrió.', // added 18.04.2012
			'errSessionExpires'    : 'La teva sessió ha caducat per inactivitat.',
			'errCreatingTempDir'   : 'No es pot crear el directori temporal: "$1"',
			'errFtpDownloadFile'   : 'No es pot descarregar el fitxer des d\'FTP: "$1"',
			'errFtpUploadFile'     : 'No es pot carregar el fitxer a FTP: "$1"',
			'errFtpMkdir'          : 'No es pot crear un directori remot a FTP: "$1"',
			'errArchiveExec'       : 'Error en arxivar fitxers: "$1"',
			'errExtractExec'       : 'Error en extreure fitxers: "$1"',
			'errNetUnMount'        : 'No es pot desmuntar.', // from v2.1 added 30.04.2012
			'errConvUTF8'          : 'No convertible a UTF-8', // from v2.1 added 08.04.2014
			'errFolderUpload'      : 'Proveu el navegador modern, si voleu carregar la carpeta.', // from v2.1 added 26.6.2015
			'errSearchTimeout'     : 'S\'ha esgotat el temps en cercar "$1". El resultat de la cerca és parcial.', // from v2.1 added 12.1.2016
			'errReauthRequire'     : 'Cal una reautorització.', // from v2.1.10 added 24.3.2016
			'errMaxTargets'        : 'El nombre màxim d\'articles seleccionables és d\' $1.', // from v2.1.17 added 17.10.2016
			'errRestore'           : 'No es pot restaurar des de la paperera. No es pot identificar la destinació de la restauració.', // from v2.1.24 added 3.5.2017
			'errEditorNotFound'    : 'No s\'ha trobat l\'editor per a aquest tipus de fitxer.', // from v2.1.25 added 23.5.2017
			'errServerError'       : 'S\'ha produït un error al costat del servidor.', // from v2.1.25 added 16.6.2017
			'errEmpty'             : 'No es pot buidar la carpeta "$1".', // from v2.1.25 added 22.6.2017
			'moreErrors'           : 'Hi ha errors d\' $1 més.', // from v2.1.44 added 9.12.2018
			'errMaxMkdirs'         : 'Podeu crear fins a $1 carpetes alhora.', // from v2.1.58 added 20.6.2021

			/******************************* commands names ********************************/
			'cmdarchive'   : 'Crea arxiu',
			'cmdback'      : 'Enrere',
			'cmdcopy'      : 'Copia',
			'cmdcut'       : 'Retalla',
			'cmddownload'  : 'Descarrega',
			'cmdduplicate' : 'Duplica',
			'cmdedit'      : 'Edita el fitxer',
			'cmdextract'   : 'Extreu els fitxers de l\'arxiu',
			'cmdforward'   : 'Endavant',
			'cmdgetfile'   : 'Selecciona els fitxers',
			'cmdhelp'      : 'Quant a aquest programari',
			'cmdhome'      : 'Inici',
			'cmdinfo'      : 'Obté informació',
			'cmdmkdir'     : 'Nova carpeta',
			'cmdmkdirin'   : 'A la carpeta nova', // from v2.1.7 added 19.2.2016
			'cmdmkfile'    : 'Nou fitxer',
			'cmdopen'      : 'Obre',
			'cmdpaste'     : 'Enganxa',
			'cmdquicklook' : 'Previsualitza',
			'cmdreload'    : 'Torna a carregar',
			'cmdrename'    : 'Canvia el nom',
			'cmdrm'        : 'Suprimeix',
			'cmdtrash'     : 'A les escombraries', //from v2.1.24 added 29.4.2017
			'cmdrestore'   : 'Restaurar', //from v2.1.24 added 3.5.2017
			'cmdsearch'    : 'Cerca fitxers',
			'cmdup'        : 'Vés al directori superior',
			'cmdupload'    : 'Carrega fitxers',
			'cmdview'      : 'Visualitza',
			'cmdresize'    : 'Redimensiona la imatge',
			'cmdsort'      : 'Ordena',
			'cmdnetmount'  : 'Munta el volum de xarxa', // added 18.04.2012
			'cmdnetunmount': 'Desmuntar', // from v2.1 added 30.04.2012
			'cmdplaces'    : 'A Llocs', // added 28.12.2014
			'cmdchmod'     : 'Canvia el mode', // from v2.1 added 20.6.2015
			'cmdopendir'   : 'Obre una carpeta', // from v2.1 added 13.1.2016
			'cmdcolwidth'  : 'Restableix l\'amplada de la columna', // from v2.1.13 added 12.06.2016
			'cmdfullscreen': 'Pantalla completa', // from v2.1.15 added 03.08.2016
			'cmdmove'      : 'Moure\'s', // from v2.1.15 added 21.08.2016
			'cmdempty'     : 'Buida la carpeta', // from v2.1.25 added 22.06.2017
			'cmdundo'      : 'Desfer', // from v2.1.27 added 31.07.2017
			'cmdredo'      : 'Refer', // from v2.1.27 added 31.07.2017
			'cmdpreference': 'Preferències', // from v2.1.27 added 03.08.2017
			'cmdselectall' : 'Seleccionar tot', // from v2.1.28 added 15.08.2017
			'cmdselectnone': 'Seleccioneu cap', // from v2.1.28 added 15.08.2017
			'cmdselectinvert': 'Inverteix la selecció', // from v2.1.28 added 15.08.2017
			'cmdopennew'   : 'Obre en una finestra nova', // from v2.1.38 added 3.4.2018
			'cmdhide'      : 'Amaga (preferència)', // from v2.1.41 added 24.7.2018

			/*********************************** buttons ***********************************/
			'btnClose'  : 'Tanca',
			'btnSave'   : 'Desa',
			'btnRm'     : 'Suprimeix',
			'btnApply'  : 'Aplica',
			'btnCancel' : 'Cancel·la',
			'btnNo'     : 'No',
			'btnYes'    : 'Sí',
			'btnMount'  : 'Munta',  // added 18.04.2012
			'btnApprove': 'Anar a $1 i aprovar', // from v2.1 added 26.04.2012
			'btnUnmount': 'Desmuntar', // from v2.1 added 30.04.2012
			'btnConv'   : 'Converteix', // from v2.1 added 08.04.2014
			'btnCwd'    : 'Aquí',      // from v2.1 added 22.5.2015
			'btnVolume' : 'Volum',    // from v2.1 added 22.5.2015
			'btnAll'    : 'Tots',       // from v2.1 added 22.5.2015
			'btnMime'   : 'Tipus MIME', // from v2.1 added 22.5.2015
			'btnFileName':'Nom de l\'arxiu',  // from v2.1 added 22.5.2015
			'btnSaveClose': 'Desa i tanca', // from v2.1 added 12.6.2015
			'btnBackup' : 'Còpia de seguretat', // fromv2.1 added 28.11.2015
			'btnRename'    : 'Canvia el nom',      // from v2.1.24 added 6.4.2017
			'btnRenameAll' : 'Canvia el nom (tots)', // from v2.1.24 added 6.4.2017
			'btnPrevious' : 'Anterior ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnNext'     : 'Pròxim ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnSaveAs'   : 'Guardar com', // from v2.1.25 added 24.5.2017

			/******************************** notifications ********************************/
			'ntfopen'     : 'S\'està obrint la carpeta',
			'ntffile'     : 'S\'està obrint el fitxer',
			'ntfreload'   : 'S\'està tornant a carregar el contingut de la carpeta',
			'ntfmkdir'    : 'S\'està creant el directori',
			'ntfmkfile'   : 'S\'estan creant el fitxers',
			'ntfrm'       : 'S\'estan suprimint els fitxers',
			'ntfcopy'     : 'S\'estan copiant els fitxers',
			'ntfmove'     : 'S\'estan movent els fitxers',
			'ntfprepare'  : 'S\'està preparant per copiar fitxers',
			'ntfrename'   : 'S\'estan canviant els noms del fitxers',
			'ntfupload'   : 'S\'estan carregant els fitxers',
			'ntfdownload' : 'S\'estan descarregant els fitxers',
			'ntfsave'     : 'S\'estan desant els fitxers',
			'ntfarchive'  : 'S\'està creant l\'arxiu',
			'ntfextract'  : 'S\'estan extreient els fitxers de l\'arxiu',
			'ntfsearch'   : 'S\'estan cercant els fitxers',
			'ntfresize'   : 'Canviar la mida de les imatges',
			'ntfsmth'     : 'S\'estan realitzant operacions',
			'ntfloadimg'  : 'S\'està carregant la imatge',
			'ntfnetmount' : 'Muntatge del volum de xarxa', // added 18.04.2012
			'ntfnetunmount': 'S\'està desmuntant el volum de xarxa', // from v2.1 added 30.04.2012
			'ntfdim'      : 'Adquisició de la dimensió de la imatge', // added 20.05.2013
			'ntfreaddir'  : 'Lectura de la informació de la carpeta', // from v2.1 added 01.07.2013
			'ntfurl'      : 'Obtenint l\'URL de l\'enllaç', // from v2.1 added 11.03.2014
			'ntfchmod'    : 'Canvi de mode de fitxer', // from v2.1 added 20.6.2015
			'ntfpreupload': 'S\'està verificant el nom del fitxer de càrrega', // from v2.1 added 31.11.2015
			'ntfzipdl'    : 'Creació d\'un fitxer per descarregar', // from v2.1.7 added 23.1.2016
			'ntfparents'  : 'Obtenció d\'informació del camí', // from v2.1.17 added 2.11.2016
			'ntfchunkmerge': 'S\'està processant el fitxer penjat', // from v2.1.17 added 2.11.2016
			'ntftrash'    : 'Fent llençar a les escombraries', // from v2.1.24 added 2.5.2017
			'ntfrestore'  : 'S\'està fent la restauració des de la paperera', // from v2.1.24 added 3.5.2017
			'ntfchkdir'   : 'S\'està comprovant la carpeta de destinació', // from v2.1.24 added 3.5.2017
			'ntfundo'     : 'S\'està desfent l\'operació anterior', // from v2.1.27 added 31.07.2017
			'ntfredo'     : 'S\'està refent l\'anterior desfet', // from v2.1.27 added 31.07.2017
			'ntfchkcontent' : 'Comprovació de continguts', // from v2.1.41 added 3.8.2018

			/*********************************** volumes *********************************/
			'volume_Trash' : 'Paperera', //from v2.1.24 added 29.4.2017

			/************************************ dates **********************************/
			'dateUnknown' : 'desconegut',
			'Today'       : 'Avui',
			'Yesterday'   : 'Ahir',
			'msJan'       : 'gen.',
			'msFeb'       : 'febr.',
			'msMar'       : 'març',
			'msApr'       : 'abr.',
			'msMay'       : 'maig',
			'msJun'       : 'juny',
			'msJul'       : 'jul.',
			'msAug'       : 'ag.',
			'msSep'       : 'set.',
			'msOct'       : 'oct.',
			'msNov'       : 'nov.',
			'msDec'       : 'des.',
			'January'     : 'gener',
			'February'    : 'febrer',
			'March'       : 'març',
			'April'       : 'Abril',
			'May'         : 'maig',
			'June'        : 'juny',
			'July'        : 'juliol',
			'August'      : 'Agost',
			'September'   : 'setembre',
			'October'     : 'Octubre',
			'November'    : 'de novembre',
			'December'    : 'desembre',
			'Sunday'      : 'diumenge',
			'Monday'      : 'dilluns',
			'Tuesday'     : 'dimarts',
			'Wednesday'   : 'dimecres',
			'Thursday'    : 'dijous',
			'Friday'      : 'divendres',
			'Saturday'    : 'dissabte',
			'Sun'         : 'diumenge',
			'Mon'         : 'dilluns',
			'Tue'         : 'dimarts',
			'Wed'         : 'dimecres',
			'Thu'         : 'dijous',
			'Fri'         : 'divendres',
			'Sat'         : 'dissabte',

			/******************************** sort variants ********************************/
			'sortname'          : 'per nom',
			'sortkind'          : 'per tipus',
			'sortsize'          : 'per mida',
			'sortdate'          : 'per data',
			'sortFoldersFirst'  : 'Primer les carpetes',
			'sortperm'          : 'amb permís', // from v2.1.13 added 13.06.2016
			'sortmode'          : 'per modalitat',       // from v2.1.13 added 13.06.2016
			'sortowner'         : 'pel propietari',      // from v2.1.13 added 13.06.2016
			'sortgroup'         : 'per grup',      // from v2.1.13 added 13.06.2016
			'sortAlsoTreeview'  : 'També Treeview',  // from v2.1.15 added 01.08.2016

			/********************************** new items **********************************/
			'untitled file.txt' : 'Nou fitxer.txt', // added 10.11.2015
			'untitled folder'   : 'Carpeta nova',   // added 10.11.2015
			'Archive'           : 'Nou Arxiu',  // from v2.1 added 10.11.2015
			'untitled file'     : 'Nou fitxer.$1',  // from v2.1.41 added 6.8.2018
			'extentionfile'     : '$1: Dossier',    // from v2.1.41 added 6.8.2018
			'extentiontype'     : '$1: $2',      // from v2.1.43 added 17.10.2018

			/********************************** messages **********************************/
			'confirmReq'      : 'Es necessita confirmació',
			'confirmRm'       : 'Voleu suprimir els fitxers?<br />L\'acció es podrà desfer!',
			'confirmRepl'     : 'Voleu reemplaçar el fitxer antic amb el nou?',
			'confirmRest'     : 'Voleu substituir l\'element existent per l\'element de la paperera?', // fromv2.1.24 added 5.5.2017
			'confirmConvUTF8' : 'No és a UTF-8<br/>Convertiu a UTF-8?<br/>Els continguts es converteixen en UTF-8 desant després de la conversió.', // from v2.1 added 08.04.2014
			'confirmNonUTF8'  : 'No s\'ha pogut detectar la codificació de caràcters d\'aquest fitxer. S\'ha de convertir temporalment a UTF-8 per editar-lo.<br/>Seleccioneu la codificació de caràcters d\'aquest fitxer.', // from v2.1.19 added 28.11.2016
			'confirmNotSave'  : 'S\'ha modificat.<br/>Perdre feina si no deseu els canvis.', // from v2.1 added 15.7.2015
			'confirmTrash'    : 'Esteu segur que voleu moure els elements a la paperera?', //from v2.1.24 added 29.4.2017
			'confirmMove'     : 'Esteu segur que voleu moure els elements a "$1"?', //from v2.1.50 added 27.7.2019
			'apllyAll'        : 'Aplica a tot',
			'name'            : 'Nom',
			'size'            : 'Mida',
			'perms'           : 'Permisos',
			'modify'          : 'Modificat',
			'kind'            : 'Tipus',
			'read'            : 'llegir',
			'write'           : 'escriure',
			'noaccess'        : 'sense accés',
			'and'             : 'i',
			'unknown'         : 'desconegut',
			'selectall'       : 'Selecciona tots els fitxers',
			'selectfiles'     : 'Selecciona el(s) fitxer(s)',
			'selectffile'     : 'Selecciona el primer fitxer',
			'selectlfile'     : 'Selecciona l\'últim fitxer',
			'viewlist'        : 'Vista en llista',
			'viewicons'       : 'Vista en icones',
			'viewSmall'       : 'Petites icones', // from v2.1.39 added 22.5.2018
			'viewMedium'      : 'Icones mitjanes', // from v2.1.39 added 22.5.2018
			'viewLarge'       : 'Icones grans', // from v2.1.39 added 22.5.2018
			'viewExtraLarge'  : 'Icones extra grans', // from v2.1.39 added 22.5.2018
			'places'          : 'Llocs',
			'calc'            : 'Calcula',
			'path'            : 'Camí',
			'aliasfor'        : 'Àlies per',
			'locked'          : 'Bloquejat',
			'dim'             : 'Dimensions',
			'files'           : 'Fitxers',
			'folders'         : 'Carpetes',
			'items'           : 'Elements',
			'yes'             : 'sí',
			'no'              : 'no',
			'link'            : 'Enllaç',
			'searcresult'     : 'Resultats de la cerca',
			'selected'        : 'Elements seleccionats',
			'about'           : 'Quant a',
			'shortcuts'       : 'Dreceres',
			'help'            : 'Ajuda',
			'webfm'           : 'Gestor de fitxers web',
			'ver'             : 'Versió',
			'protocolver'     : 'versió de protocol',
			'homepage'        : 'Pàgina del projecte',
			'docs'            : 'Documentació',
			'github'          : 'Bifurca\'ns a GitHub',
			'twitter'         : 'Segueix-nos a Twitter',
			'facebook'        : 'Uniu-vos a Facebook',
			'team'            : 'Equip',
			'chiefdev'        : 'cap desenvolupador',
			'developer'       : 'desenvolupador',
			'contributor'     : 'col·laborador',
			'maintainer'      : 'mantenidor',
			'translator'      : 'traductor',
			'icons'           : 'Icones',
			'dontforget'      : 'i no oblideu agafar la vostra tovallola',
			'shortcutsof'     : 'Les dreceres estan inhabilitades',
			'dropFiles'       : 'Arrossegueu els fitxers aquí',
			'or'              : 'o',
			'selectForUpload' : 'Seleccioneu els fitxer a carregar',
			'moveFiles'       : 'Mou els fitxers',
			'copyFiles'       : 'Copia els fitxers',
			'restoreFiles'    : 'Restaurar elements', // from v2.1.24 added 5.5.2017
			'rmFromPlaces'    : 'Suprimeix dels llocs',
			'aspectRatio'     : 'Relació d\'aspecte',
			'scale'           : 'Escala',
			'width'           : 'Amplada',
			'height'          : 'Alçada',
			'resize'          : 'Redimensiona',
			'crop'            : 'Retalla',
			'rotate'          : 'Girar',
			'rotate-cw'       : 'Gireu 90 graus CW',
			'rotate-ccw'      : 'Gireu 90 graus cap a la dreta',
			'degree'          : '°',
			'netMountDialogTitle' : 'Munta el volum de xarxa', // added 18.04.2012
			'protocol'            : 'Protocol', // added 18.04.2012
			'host'                : 'Amfitrió', // added 18.04.2012
			'port'                : 'Port', // added 18.04.2012
			'user'                : 'Usuari', // added 18.04.2012
			'pass'                : 'Contrasenya', // added 18.04.2012
			'confirmUnmount'      : 'Esteu desmuntant $1?',  // from v2.1 added 30.04.2012
			'dropFilesBrowser': 'Deixa anar o enganxar fitxers des del navegador', // from v2.1 added 30.05.2012
			'dropPasteFiles'  : 'Deixa anar fitxers, enganxar URL o imatges (porta-retalls) aquí', // from v2.1 added 07.04.2014
			'encoding'        : 'Codificació', // from v2.1 added 19.12.2014
			'locale'          : 'Localització',   // from v2.1 added 19.12.2014
			'searchTarget'    : 'Objectiu: $1',                // from v2.1 added 22.5.2015
			'searchMime'      : 'Cerca per tipus MIME d\'entrada', // from v2.1 added 22.5.2015
			'owner'           : 'Propietari', // from v2.1 added 20.6.2015
			'group'           : 'Grup', // from v2.1 added 20.6.2015
			'other'           : 'Altres', // from v2.1 added 20.6.2015
			'execute'         : 'Executar', // from v2.1 added 20.6.2015
			'perm'            : 'Permís', // from v2.1 added 20.6.2015
			'mode'            : 'Mode', // from v2.1 added 20.6.2015
			'emptyFolder'     : 'La carpeta està buida', // from v2.1.6 added 30.12.2015
			'emptyFolderDrop' : 'La carpeta està buida\\A Drop per afegir elements', // from v2.1.6 added 30.12.2015
			'emptyFolderLTap' : 'La carpeta està buida\\Un toc llarg per afegir elements', // from v2.1.6 added 30.12.2015
			'quality'         : 'Qualitat', // from v2.1.6 added 5.1.2016
			'autoSync'        : 'Sincronització automàtica',  // from v2.1.6 added 10.1.2016
			'moveUp'          : 'Mou-te',  // from v2.1.6 added 18.1.2016
			'getLink'         : 'Obteniu l\'enllaç URL', // from v2.1.7 added 9.2.2016
			'selectedItems'   : 'Articles seleccionats ($1)', // from v2.1.7 added 2.19.2016
			'folderId'        : 'ID de la carpeta', // from v2.1.10 added 3.25.2016
			'offlineAccess'   : 'Permet l\'accés fora de línia', // from v2.1.10 added 3.25.2016
			'reAuth'          : 'Per tornar a autenticar', // from v2.1.10 added 3.25.2016
			'nowLoading'      : 'S\'està carregant...', // from v2.1.12 added 4.26.2016
			'openMulti'       : 'Obriu diversos fitxers', // from v2.1.12 added 5.14.2016
			'openMultiConfirm': 'Esteu provant d\'obrir els fitxers $1. Esteu segur que voleu obrir-lo al navegador?', // from v2.1.12 added 5.14.2016
			'emptySearch'     : 'Els resultats de la cerca estan buits a l\'objectiu de la cerca.', // from v2.1.12 added 5.16.2016
			'editingFile'     : 'És editar un fitxer.', // from v2.1.13 added 6.3.2016
			'hasSelected'     : 'Heu seleccionat articles d\' $1.', // from v2.1.13 added 6.3.2016
			'hasClipboard'    : 'Tens articles d\' $1 al porta-retalls.', // from v2.1.13 added 6.3.2016
			'incSearchOnly'   : 'La cerca incremental només és des de la vista actual.', // from v2.1.13 added 6.30.2016
			'reinstate'       : 'Reintegrar', // from v2.1.15 added 3.8.2016
			'complete'        : '$1 completat', // from v2.1.15 added 21.8.2016
			'contextmenu'     : 'Menú contextual', // from v2.1.15 added 9.9.2016
			'pageTurning'     : 'Pas de pàgina', // from v2.1.15 added 10.9.2016
			'volumeRoots'     : 'Arrels de volum', // from v2.1.16 added 16.9.2016
			'reset'           : 'Restableix', // from v2.1.16 added 1.10.2016
			'bgcolor'         : 'Color de fons', // from v2.1.16 added 1.10.2016
			'colorPicker'     : 'Selector de colors', // from v2.1.16 added 1.10.2016
			'8pxgrid'         : 'Quadrícula de 8 píxels', // from v2.1.16 added 4.10.2016
			'enabled'         : 'Habilitat', // from v2.1.16 added 4.10.2016
			'disabled'        : 'Discapacitat', // from v2.1.16 added 4.10.2016
			'emptyIncSearch'  : 'Els resultats de la cerca estan buits a la vista actual.\\APmeu [Retorn] per ampliar l\'objectiu de la cerca.', // from v2.1.16 added 5.10.2016
			'emptyLetSearch'  : 'Els resultats de la cerca de la primera lletra estan buits a la vista actual.', // from v2.1.23 added 24.3.2017
			'textLabel'       : 'Etiqueta de text', // from v2.1.17 added 13.10.2016
			'minsLeft'        : 'Queden $1 min', // from v2.1.17 added 13.11.2016
			'openAsEncoding'  : 'Torna a obrir amb la codificació seleccionada', // from v2.1.19 added 2.12.2016
			'saveAsEncoding'  : 'Desa amb la codificació seleccionada', // from v2.1.19 added 2.12.2016
			'selectFolder'    : 'Seleccioneu la carpeta', // from v2.1.20 added 13.12.2016
			'firstLetterSearch': 'Recerca de la primera lletra', // from v2.1.23 added 24.3.2017
			'presets'         : 'Presets', // from v2.1.25 added 26.5.2017
			'tooManyToTrash'  : 'Hi ha massa articles perquè no es puguin a la paperera.', // from v2.1.25 added 9.6.2017
			'TextArea'        : 'Àrea de text', // from v2.1.25 added 14.6.2017
			'folderToEmpty'   : 'Buida la carpeta "$1".', // from v2.1.25 added 22.6.2017
			'filderIsEmpty'   : 'No hi ha elements a una carpeta "$1".', // from v2.1.25 added 22.6.2017
			'preference'      : 'Preferència', // from v2.1.26 added 28.6.2017
			'language'        : 'Llenguatge', // from v2.1.26 added 28.6.2017
			'clearBrowserData': 'Inicialitzeu la configuració desada en aquest navegador', // from v2.1.26 added 28.6.2017
			'toolbarPref'     : 'Configuració de la barra d\'eines', // from v2.1.27 added 2.8.2017
			'charsLeft'       : '... $1 caràcters restants.',  // from v2.1.29 added 30.8.2017
			'linesLeft'       : '... Queden 1 $ línies.',  // from v2.1.52 added 16.1.2020
			'sum'             : 'Suma', // from v2.1.29 added 28.9.2017
			'roughFileSize'   : 'Mida aproximada del fitxer', // from v2.1.30 added 2.11.2017
			'autoFocusDialog' : 'Centra\'t en l\'element de diàleg amb el ratolí',  // from v2.1.30 added 2.11.2017
			'select'          : 'Seleccioneu', // from v2.1.30 added 23.11.2017
			'selectAction'    : 'Acció en seleccionar un fitxer', // from v2.1.30 added 23.11.2017
			'useStoredEditor' : 'Obriu amb l\'editor utilitzat l\'última vegada', // from v2.1.30 added 23.11.2017
			'selectinvert'    : 'Inverteix la selecció', // from v2.1.30 added 25.11.2017
			'renameMultiple'  : 'Esteu segur que voleu canviar el nom de $1 als elements seleccionats com ara $2?<br/>Això no es pot desfer!', // from v2.1.31 added 4.12.2017
			'batchRename'     : 'Canviar el nom del lot', // from v2.1.31 added 8.12.2017
			'plusNumber'      : '+ Número', // from v2.1.31 added 8.12.2017
			'asPrefix'        : 'Afegeix un prefix', // from v2.1.31 added 8.12.2017
			'asSuffix'        : 'Afegeix un sufix', // from v2.1.31 added 8.12.2017
			'changeExtention' : 'Canvia l\'extensió', // from v2.1.31 added 8.12.2017
			'columnPref'      : 'Configuració de les columnes (visualització de llista)', // from v2.1.32 added 6.2.2018
			'reflectOnImmediate' : 'Tots els canvis es reflectiran immediatament a l\'arxiu.', // from v2.1.33 added 2.3.2018
			'reflectOnUnmount'   : 'Qualsevol canvi no es reflectirà fins que no desmunteu aquest volum.', // from v2.1.33 added 2.3.2018
			'unmountChildren' : 'Els següents volums muntats en aquest volum també s\'han desmuntat. Segur que el desmuntareu?', // from v2.1.33 added 5.3.2018
			'selectionInfo'   : 'Informació de selecció', // from v2.1.33 added 7.3.2018
			'hashChecker'     : 'Algorismes per mostrar el hash del fitxer', // from v2.1.33 added 10.3.2018
			'infoItems'       : 'Elements d\'informació (tauler d\'informació de selecció)', // from v2.1.38 added 28.3.2018
			'pressAgainToExit': 'Premeu de nou per sortir.', // from v2.1.38 added 1.4.2018
			'toolbar'         : 'Barra d\'eines', // from v2.1.38 added 4.4.2018
			'workspace'       : 'Espai de treball', // from v2.1.38 added 4.4.2018
			'dialog'          : 'Diàleg', // from v2.1.38 added 4.4.2018
			'all'             : 'Tots', // from v2.1.38 added 4.4.2018
			'iconSize'        : 'Mida de les icones (visualització d\'icones)', // from v2.1.39 added 7.5.2018
			'editorMaximized' : 'Obriu la finestra de l\'editor maximitzat', // from v2.1.40 added 30.6.2018
			'editorConvNoApi' : 'Com que la conversió per API no està disponible actualment, feu la conversió al lloc web.', //from v2.1.40 added 8.7.2018
			'editorConvNeedUpload' : 'Després de la conversió, s\'ha de carregar amb l\'URL de l\'element o un fitxer descarregat per desar el fitxer convertit.', //from v2.1.40 added 8.7.2018
			'convertOn'       : 'Converteix al lloc de $1', // from v2.1.40 added 10.7.2018
			'integrations'    : 'Integracions', // from v2.1.40 added 11.7.2018
			'integrationWith' : 'Aquest elFinder té integrats els següents serveis externs. Consulteu les condicions d\'ús, la política de privadesa, etc. abans d\'utilitzar-lo.', // from v2.1.40 added 11.7.2018
			'showHidden'      : 'Mostra els elements ocults', // from v2.1.41 added 24.7.2018
			'hideHidden'      : 'Amaga els elements ocults', // from v2.1.41 added 24.7.2018
			'toggleHidden'    : 'Mostra/amaga els elements ocults', // from v2.1.41 added 24.7.2018
			'makefileTypes'   : 'Tipus de fitxers per activar amb "Fitxer nou"', // from v2.1.41 added 7.8.2018
			'typeOfTextfile'  : 'Tipus de fitxer de text', // from v2.1.41 added 7.8.2018
			'add'             : 'Afegeix', // from v2.1.41 added 7.8.2018
			'theme'           : 'Tema', // from v2.1.43 added 19.10.2018
			'default'         : 'Per defecte', // from v2.1.43 added 19.10.2018
			'description'     : 'Descripció', // from v2.1.43 added 19.10.2018
			'website'         : 'Lloc web', // from v2.1.43 added 19.10.2018
			'author'          : 'Autor', // from v2.1.43 added 19.10.2018
			'email'           : 'Correu electrònic', // from v2.1.43 added 19.10.2018
			'license'         : 'llicència', // from v2.1.43 added 19.10.2018
			'exportToSave'    : 'Aquest element no es pot desar. Per evitar perdre les edicions, heu d\'exportar-les al vostre ordinador.', // from v2.1.44 added 1.12.2018
			'dblclickToSelect': 'Feu doble clic al fitxer per seleccionar-lo.', // from v2.1.47 added 22.1.2019
			'useFullscreen'   : 'Utilitzeu el mode de pantalla completa', // from v2.1.47 added 19.2.2019

			/********************************** mimetypes **********************************/
			'kindUnknown'     : 'Desconegut',
			'kindRoot'        : 'Arrel de volum', // from v2.1.16 added 16.10.2016
			'kindFolder'      : 'Carpeta',
			'kindSelects'     : 'Seleccions', // from v2.1.29 added 29.8.2017
			'kindAlias'       : 'Àlies',
			'kindAliasBroken' : 'Àlies no vàlid',
			// applications
			'kindApp'         : 'Aplicació',
			'kindPostscript'  : 'Document Postscript',
			'kindMsOffice'    : 'Document del Microsoft Office',
			'kindMsWord'      : 'Document del Microsoft Word',
			'kindMsExcel'     : 'Document del Microsoft Excel',
			'kindMsPP'        : 'Presentació del Microsoft Powerpoint',
			'kindOO'          : 'Document de l\'Open Office',
			'kindAppFlash'    : 'Aplicació Flash',
			'kindPDF'         : 'Document PDF',
			'kindTorrent'     : 'Fitxer Bittorrent',
			'kind7z'          : 'Arxiu 7z',
			'kindTAR'         : 'Arxiu TAR',
			'kindGZIP'        : 'Arxiu GZIP',
			'kindBZIP'        : 'Arxiu BZIP',
			'kindXZ'          : 'Arxiu XZ',
			'kindZIP'         : 'Arxiu ZIP',
			'kindRAR'         : 'Arxiu RAR',
			'kindJAR'         : 'Fitxer JAR de Java',
			'kindTTF'         : 'Tipus de lletra True Type',
			'kindOTF'         : 'Tipus de lletra Open Type',
			'kindRPM'         : 'Paquet RPM',
			// texts
			'kindText'        : 'Document de text',
			'kindTextPlain'   : 'Document de text net',
			'kindPHP'         : 'Codi PHP',
			'kindCSS'         : 'Full d\'estils CSS',
			'kindHTML'        : 'Document HTML',
			'kindJS'          : 'Codi Javascript',
			'kindRTF'         : 'Document RTF',
			'kindC'           : 'Codi C',
			'kindCHeader'     : 'Codi de caçalera C',
			'kindCPP'         : 'Codi C++',
			'kindCPPHeader'   : 'Codi de caçalera C++',
			'kindShell'       : 'Script Unix',
			'kindPython'      : 'Codi Python',
			'kindJava'        : 'Codi Java',
			'kindRuby'        : 'Codi Ruby',
			'kindPerl'        : 'Script Perl',
			'kindSQL'         : 'Codi SQL',
			'kindXML'         : 'Document XML',
			'kindAWK'         : 'Codi AWK',
			'kindCSV'         : 'Document CSV',
			'kindDOCBOOK'     : 'Document XML de Docbook',
			'kindMarkdown'    : 'Text de reducció', // added 20.7.2015
			// images
			'kindImage'       : 'Imatge',
			'kindBMP'         : 'Imatge BMP',
			'kindJPEG'        : 'Imatge JPEG',
			'kindGIF'         : 'Imatge GIF',
			'kindPNG'         : 'Imatge PNG',
			'kindTIFF'        : 'Imatge TIFF',
			'kindTGA'         : 'Imatge TGA',
			'kindPSD'         : 'Imatge Adobe Photoshop',
			'kindXBITMAP'     : 'Imatge X bitmap',
			'kindPXM'         : 'Imatge Pixelmator',
			// media
			'kindAudio'       : 'Fitxer d\'àudio',
			'kindAudioMPEG'   : 'Fitxer d\'àudio MPEG',
			'kindAudioMPEG4'  : 'Fitxer d\'àudio MPEG-4',
			'kindAudioMIDI'   : 'Fitxer d\'àudio MIDI',
			'kindAudioOGG'    : 'Fitxer d\'àudio Ogg Vorbis',
			'kindAudioWAV'    : 'Fitxer d\'àudio WAV',
			'AudioPlaylist'   : 'Llista de reproducció MP3',
			'kindVideo'       : 'Fitxer de vídeo',
			'kindVideoDV'     : 'Fitxer de vídeo DV',
			'kindVideoMPEG'   : 'Fitxer de vídeo MPEG',
			'kindVideoMPEG4'  : 'Fitxer de vídeo MPEG-4',
			'kindVideoAVI'    : 'Fitxer de vídeo AVI',
			'kindVideoMOV'    : 'Fitxer de vídeo Quick Time',
			'kindVideoWM'     : 'Fitxer de vídeo Windows Media',
			'kindVideoFlash'  : 'Fitxer de vídeo Flash',
			'kindVideoMKV'    : 'Fitxer de vídeo Matroska',
			'kindVideoOGG'    : 'Fitxer de vídeo Ogg'
		}
	};
}));js/i18n/elfinder.LANG.js000064400000077754151215013370010627 0ustar00/**
 * elFinder translation template
 * use this file to create new translation
 * submit new translation via https://github.com/Studio-42/elFinder/issues
 * or make a pull request
 */

/**
 * XXXXX translation
 * @author Translator Name <translator@email.tld>
 * @version 201x-xx-xx
 */
(function(root, factory) {
	if (typeof define === 'function' && define.amd) {
		define(['elfinder'], factory);
	} else if (typeof exports !== 'undefined') {
		module.exports = factory(require('elfinder'));
	} else {
		factory(root.elFinder);
	}
}(this, function(elFinder) {
	elFinder.prototype.i18.REPLACE_WITH_xx_OR_xx_YY_LANG_CODE = {
		translator : 'Translator name &lt;translator@email.tld&gt;',
		language   : 'Language of translation in your language',
		direction  : 'ltr',
		dateFormat : 'M d, Y h:i A', // will show like: Mar 13, 2012 05:27 PM
		fancyDateFormat : '$1 h:i A', // will show like: Today 12:25 PM
		nonameDateFormat : 'ymd-His', // noname upload will show like: 120513-172700
		messages   : {

			/********************************** errors **********************************/
			'error'                : 'Error',
			'errUnknown'           : 'Unknown error.',
			'errUnknownCmd'        : 'Unknown command.',
			'errJqui'              : 'Invalid jQuery UI configuration. Selectable, draggable and droppable components must be included.',
			'errNode'              : 'elFinder requires DOM Element to be created.',
			'errURL'               : 'Invalid elFinder configuration! URL option is not set.',
			'errAccess'            : 'Access denied.',
			'errConnect'           : 'Unable to connect to backend.',
			'errAbort'             : 'Connection aborted.',
			'errTimeout'           : 'Connection timeout.',
			'errNotFound'          : 'Backend not found.',
			'errResponse'          : 'Invalid backend response.',
			'errConf'              : 'Invalid backend configuration.',
			'errJSON'              : 'PHP JSON module not installed.',
			'errNoVolumes'         : 'Readable volumes not available.',
			'errCmdParams'         : 'Invalid parameters for command "$1".',
			'errDataNotJSON'       : 'Data is not JSON.',
			'errDataEmpty'         : 'Data is empty.',
			'errCmdReq'            : 'Backend request requires command name.',
			'errOpen'              : 'Unable to open "$1".',
			'errNotFolder'         : 'Object is not a folder.',
			'errNotFile'           : 'Object is not a file.',
			'errRead'              : 'Unable to read "$1".',
			'errWrite'             : 'Unable to write into "$1".',
			'errPerm'              : 'Permission denied.',
			'errLocked'            : '"$1" is locked and can not be renamed, moved or removed.',
			'errExists'            : 'Item named "$1" already exists.',
			'errInvName'           : 'Invalid file name.',
			'errInvDirname'        : 'Invalid folder name.',  // from v2.1.24 added 12.4.2017
			'errFolderNotFound'    : 'Folder not found.',
			'errFileNotFound'      : 'File not found.',
			'errTrgFolderNotFound' : 'Target folder "$1" not found.',
			'errPopup'             : 'Browser prevented opening popup window. To open file enable it in browser options.',
			'errMkdir'             : 'Unable to create folder "$1".',
			'errMkfile'            : 'Unable to create file "$1".',
			'errRename'            : 'Unable to rename "$1".',
			'errCopyFrom'          : 'Copying files from volume "$1" not allowed.',
			'errCopyTo'            : 'Copying files to volume "$1" not allowed.',
			'errMkOutLink'         : 'Unable to create a link to outside the volume root.', // from v2.1 added 03.10.2015
			'errUpload'            : 'Upload error.',  // old name - errUploadCommon
			'errUploadFile'        : 'Unable to upload "$1".', // old name - errUpload
			'errUploadNoFiles'     : 'No files found for upload.',
			'errUploadTotalSize'   : 'Data exceeds the maximum allowed size.', // old name - errMaxSize
			'errUploadFileSize'    : 'File exceeds maximum allowed size.', //  old name - errFileMaxSize
			'errUploadMime'        : 'File type not allowed.',
			'errUploadTransfer'    : '"$1" transfer error.',
			'errUploadTemp'        : 'Unable to make temporary file for upload.', // from v2.1 added 26.09.2015
			'errNotReplace'        : 'Object "$1" already exists at this location and can not be replaced by object with another type.', // new
			'errReplace'           : 'Unable to replace "$1".',
			'errSave'              : 'Unable to save "$1".',
			'errCopy'              : 'Unable to copy "$1".',
			'errMove'              : 'Unable to move "$1".',
			'errCopyInItself'      : 'Unable to copy "$1" into itself.',
			'errRm'                : 'Unable to remove "$1".',
			'errTrash'             : 'Unable into trash.', // from v2.1.24 added 30.4.2017
			'errRmSrc'             : 'Unable remove source file(s).',
			'errExtract'           : 'Unable to extract files from "$1".',
			'errArchive'           : 'Unable to create archive.',
			'errArcType'           : 'Unsupported archive type.',
			'errNoArchive'         : 'File is not archive or has unsupported archive type.',
			'errCmdNoSupport'      : 'Backend does not support this command.',
			'errReplByChild'       : 'The folder "$1" can\'t be replaced by an item it contains.',
			'errArcSymlinks'       : 'For security reason denied to unpack archives contains symlinks or files with not allowed names.', // edited 24.06.2012
			'errArcMaxSize'        : 'Archive files exceeds maximum allowed size.',
			'errResize'            : 'Unable to resize "$1".',
			'errResizeDegree'      : 'Invalid rotate degree.',  // added 7.3.2013
			'errResizeRotate'      : 'Unable to rotate image.',  // added 7.3.2013
			'errResizeSize'        : 'Invalid image size.',  // added 7.3.2013
			'errResizeNoChange'    : 'Image size not changed.',  // added 7.3.2013
			'errUsupportType'      : 'Unsupported file type.',
			'errNotUTF8Content'    : 'File "$1" is not in UTF-8 and cannot be edited.',  // added 9.11.2011
			'errNetMount'          : 'Unable to mount "$1".', // added 17.04.2012
			'errNetMountNoDriver'  : 'Unsupported protocol.',     // added 17.04.2012
			'errNetMountFailed'    : 'Mount failed.',         // added 17.04.2012
			'errNetMountHostReq'   : 'Host required.', // added 18.04.2012
			'errSessionExpires'    : 'Your session has expired due to inactivity.',
			'errCreatingTempDir'   : 'Unable to create temporary directory: "$1"',
			'errFtpDownloadFile'   : 'Unable to download file from FTP: "$1"',
			'errFtpUploadFile'     : 'Unable to upload file to FTP: "$1"',
			'errFtpMkdir'          : 'Unable to create remote directory on FTP: "$1"',
			'errArchiveExec'       : 'Error while archiving files: "$1"',
			'errExtractExec'       : 'Error while extracting files: "$1"',
			'errNetUnMount'        : 'Unable to unmount.', // from v2.1 added 30.04.2012
			'errConvUTF8'          : 'Not convertible to UTF-8', // from v2.1 added 08.04.2014
			'errFolderUpload'      : 'Try the modern browser, If you\'d like to upload the folder.', // from v2.1 added 26.6.2015
			'errSearchTimeout'     : 'Timed out while searching "$1". Search result is partial.', // from v2.1 added 12.1.2016
			'errReauthRequire'     : 'Re-authorization is required.', // from v2.1.10 added 24.3.2016
			'errMaxTargets'        : 'Max number of selectable items is $1.', // from v2.1.17 added 17.10.2016
			'errRestore'           : 'Unable to restore from the trash. Can\'t identify the restore destination.', // from v2.1.24 added 3.5.2017
			'errEditorNotFound'    : 'Editor not found to this file type.', // from v2.1.25 added 23.5.2017
			'errServerError'       : 'Error occurred on the server side.', // from v2.1.25 added 16.6.2017
			'errEmpty'             : 'Unable to empty folder "$1".', // from v2.1.25 added 22.6.2017
			'moreErrors'           : 'There are $1 more errors.', // from v2.1.44 added 9.12.2018
			'errMaxMkdirs'         : 'You can create up to $1 folders at one time.', // from v2.1.58 added 20.6.2021

			/******************************* commands names ********************************/
			'cmdarchive'   : 'Create archive',
			'cmdback'      : 'Back',
			'cmdcopy'      : 'Copy',
			'cmdcut'       : 'Cut',
			'cmddownload'  : 'Download',
			'cmdduplicate' : 'Duplicate',
			'cmdedit'      : 'Edit file',
			'cmdextract'   : 'Extract files from archive',
			'cmdforward'   : 'Forward',
			'cmdgetfile'   : 'Select files',
			'cmdhelp'      : 'About this software',
			'cmdhome'      : 'Root',
			'cmdinfo'      : 'Get info',
			'cmdmkdir'     : 'New folder',
			'cmdmkdirin'   : 'Into New Folder', // from v2.1.7 added 19.2.2016
			'cmdmkfile'    : 'New file',
			'cmdopen'      : 'Open',
			'cmdpaste'     : 'Paste',
			'cmdquicklook' : 'Preview',
			'cmdreload'    : 'Reload',
			'cmdrename'    : 'Rename',
			'cmdrm'        : 'Delete',
			'cmdtrash'     : 'Into trash', //from v2.1.24 added 29.4.2017
			'cmdrestore'   : 'Restore', //from v2.1.24 added 3.5.2017
			'cmdsearch'    : 'Find files',
			'cmdup'        : 'Go to parent folder',
			'cmdupload'    : 'Upload files',
			'cmdview'      : 'View',
			'cmdresize'    : 'Resize & Rotate',
			'cmdsort'      : 'Sort',
			'cmdnetmount'  : 'Mount network volume', // added 18.04.2012
			'cmdnetunmount': 'Unmount', // from v2.1 added 30.04.2012
			'cmdplaces'    : 'To Places', // added 28.12.2014
			'cmdchmod'     : 'Change mode', // from v2.1 added 20.6.2015
			'cmdopendir'   : 'Open a folder', // from v2.1 added 13.1.2016
			'cmdcolwidth'  : 'Reset column width', // from v2.1.13 added 12.06.2016
			'cmdfullscreen': 'Full Screen', // from v2.1.15 added 03.08.2016
			'cmdmove'      : 'Move', // from v2.1.15 added 21.08.2016
			'cmdempty'     : 'Empty the folder', // from v2.1.25 added 22.06.2017
			'cmdundo'      : 'Undo', // from v2.1.27 added 31.07.2017
			'cmdredo'      : 'Redo', // from v2.1.27 added 31.07.2017
			'cmdpreference': 'Preferences', // from v2.1.27 added 03.08.2017
			'cmdselectall' : 'Select all', // from v2.1.28 added 15.08.2017
			'cmdselectnone': 'Select none', // from v2.1.28 added 15.08.2017
			'cmdselectinvert': 'Invert selection', // from v2.1.28 added 15.08.2017
			'cmdopennew'   : 'Open in new window', // from v2.1.38 added 3.4.2018
			'cmdhide'      : 'Hide (Preference)', // from v2.1.41 added 24.7.2018

			/*********************************** buttons ***********************************/
			'btnClose'  : 'Close',
			'btnSave'   : 'Save',
			'btnRm'     : 'Remove',
			'btnApply'  : 'Apply',
			'btnCancel' : 'Cancel',
			'btnNo'     : 'No',
			'btnYes'    : 'Yes',
			'btnMount'  : 'Mount',  // added 18.04.2012
			'btnApprove': 'Goto $1 & approve', // from v2.1 added 26.04.2012
			'btnUnmount': 'Unmount', // from v2.1 added 30.04.2012
			'btnConv'   : 'Convert', // from v2.1 added 08.04.2014
			'btnCwd'    : 'Here',      // from v2.1 added 22.5.2015
			'btnVolume' : 'Volume',    // from v2.1 added 22.5.2015
			'btnAll'    : 'All',       // from v2.1 added 22.5.2015
			'btnMime'   : 'MIME Type', // from v2.1 added 22.5.2015
			'btnFileName':'Filename',  // from v2.1 added 22.5.2015
			'btnSaveClose': 'Save & Close', // from v2.1 added 12.6.2015
			'btnBackup' : 'Backup', // fromv2.1 added 28.11.2015
			'btnRename'    : 'Rename',      // from v2.1.24 added 6.4.2017
			'btnRenameAll' : 'Rename(All)', // from v2.1.24 added 6.4.2017
			'btnPrevious' : 'Prev ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnNext'     : 'Next ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnSaveAs'   : 'Save As', // from v2.1.25 added 24.5.2017

			/******************************** notifications ********************************/
			'ntfopen'     : 'Open folder',
			'ntffile'     : 'Open file',
			'ntfreload'   : 'Reload folder content',
			'ntfmkdir'    : 'Creating folder',
			'ntfmkfile'   : 'Creating files',
			'ntfrm'       : 'Delete items',
			'ntfcopy'     : 'Copy items',
			'ntfmove'     : 'Move items',
			'ntfprepare'  : 'Checking existing items',
			'ntfrename'   : 'Rename files',
			'ntfupload'   : 'Uploading files',
			'ntfdownload' : 'Downloading files',
			'ntfsave'     : 'Save files',
			'ntfarchive'  : 'Creating archive',
			'ntfextract'  : 'Extracting files from archive',
			'ntfsearch'   : 'Searching files',
			'ntfresize'   : 'Resizing images',
			'ntfsmth'     : 'Doing something',
			'ntfloadimg'  : 'Loading image',
			'ntfnetmount' : 'Mounting network volume', // added 18.04.2012
			'ntfnetunmount': 'Unmounting network volume', // from v2.1 added 30.04.2012
			'ntfdim'      : 'Acquiring image dimension', // added 20.05.2013
			'ntfreaddir'  : 'Reading folder infomation', // from v2.1 added 01.07.2013
			'ntfurl'      : 'Getting URL of link', // from v2.1 added 11.03.2014
			'ntfchmod'    : 'Changing file mode', // from v2.1 added 20.6.2015
			'ntfpreupload': 'Verifying upload file name', // from v2.1 added 31.11.2015
			'ntfzipdl'    : 'Creating a file for download', // from v2.1.7 added 23.1.2016
			'ntfparents'  : 'Getting path infomation', // from v2.1.17 added 2.11.2016
			'ntfchunkmerge': 'Processing the uploaded file', // from v2.1.17 added 2.11.2016
			'ntftrash'    : 'Doing throw in the trash', // from v2.1.24 added 2.5.2017
			'ntfrestore'  : 'Doing restore from the trash', // from v2.1.24 added 3.5.2017
			'ntfchkdir'   : 'Checking destination folder', // from v2.1.24 added 3.5.2017
			'ntfundo'     : 'Undoing previous operation', // from v2.1.27 added 31.07.2017
			'ntfredo'     : 'Redoing previous undone', // from v2.1.27 added 31.07.2017
			'ntfchkcontent' : 'Checking contents', // from v2.1.41 added 3.8.2018

			/*********************************** volumes *********************************/
			'volume_Trash' : 'Trash', //from v2.1.24 added 29.4.2017

			/************************************ dates **********************************/
			'dateUnknown' : 'unknown',
			'Today'       : 'Today',
			'Yesterday'   : 'Yesterday',
			'msJan'       : 'Jan',
			'msFeb'       : 'Feb',
			'msMar'       : 'Mar',
			'msApr'       : 'Apr',
			'msMay'       : 'May',
			'msJun'       : 'Jun',
			'msJul'       : 'Jul',
			'msAug'       : 'Aug',
			'msSep'       : 'Sep',
			'msOct'       : 'Oct',
			'msNov'       : 'Nov',
			'msDec'       : 'Dec',
			'January'     : 'January',
			'February'    : 'February',
			'March'       : 'March',
			'April'       : 'April',
			'May'         : 'May',
			'June'        : 'June',
			'July'        : 'July',
			'August'      : 'August',
			'September'   : 'September',
			'October'     : 'October',
			'November'    : 'November',
			'December'    : 'December',
			'Sunday'      : 'Sunday',
			'Monday'      : 'Monday',
			'Tuesday'     : 'Tuesday',
			'Wednesday'   : 'Wednesday',
			'Thursday'    : 'Thursday',
			'Friday'      : 'Friday',
			'Saturday'    : 'Saturday',
			'Sun'         : 'Sun',
			'Mon'         : 'Mon',
			'Tue'         : 'Tue',
			'Wed'         : 'Wed',
			'Thu'         : 'Thu',
			'Fri'         : 'Fri',
			'Sat'         : 'Sat',

			/******************************** sort variants ********************************/
			'sortname'          : 'by name',
			'sortkind'          : 'by kind',
			'sortsize'          : 'by size',
			'sortdate'          : 'by date',
			'sortFoldersFirst'  : 'Folders first',
			'sortperm'          : 'by permission', // from v2.1.13 added 13.06.2016
			'sortmode'          : 'by mode',       // from v2.1.13 added 13.06.2016
			'sortowner'         : 'by owner',      // from v2.1.13 added 13.06.2016
			'sortgroup'         : 'by group',      // from v2.1.13 added 13.06.2016
			'sortAlsoTreeview'  : 'Also Treeview',  // from v2.1.15 added 01.08.2016

			/********************************** new items **********************************/
			'untitled file.txt' : 'NewFile.txt', // added 10.11.2015
			'untitled folder'   : 'NewFolder',   // added 10.11.2015
			'Archive'           : 'NewArchive',  // from v2.1 added 10.11.2015
			'untitled file'     : 'NewFile.$1',  // from v2.1.41 added 6.8.2018
			'extentionfile'     : '$1: File',    // from v2.1.41 added 6.8.2018
			'extentiontype'     : '$1: $2',      // from v2.1.43 added 17.10.2018

			/********************************** messages **********************************/
			'confirmReq'      : 'Confirmation required',
			'confirmRm'       : 'Are you sure you want to permanently remove items?<br/>This cannot be undone!',
			'confirmRepl'     : 'Replace old file with new one? (If it contains folders, it will be merged. To backup and replace, select Backup.)',
			'confirmRest'     : 'Replace existing item with the item in trash?', // fromv2.1.24 added 5.5.2017
			'confirmConvUTF8' : 'Not in UTF-8<br/>Convert to UTF-8?<br/>Contents become UTF-8 by saving after conversion.', // from v2.1 added 08.04.2014
			'confirmNonUTF8'  : 'Character encoding of this file couldn\'t be detected. It need to temporarily convert to UTF-8 for editting.<br/>Please select character encoding of this file.', // from v2.1.19 added 28.11.2016
			'confirmNotSave'  : 'It has been modified.<br/>Losing work if you do not save changes.', // from v2.1 added 15.7.2015
			'confirmTrash'    : 'Are you sure you want to move items to trash bin?', //from v2.1.24 added 29.4.2017
			'confirmMove'     : 'Are you sure you want to move items to "$1"?', //from v2.1.50 added 27.7.2019
			'apllyAll'        : 'Apply to all',
			'name'            : 'Name',
			'size'            : 'Size',
			'perms'           : 'Permissions',
			'modify'          : 'Modified',
			'kind'            : 'Kind',
			'read'            : 'read',
			'write'           : 'write',
			'noaccess'        : 'no access',
			'and'             : 'and',
			'unknown'         : 'unknown',
			'selectall'       : 'Select all items',
			'selectfiles'     : 'Select item(s)',
			'selectffile'     : 'Select first item',
			'selectlfile'     : 'Select last item',
			'viewlist'        : 'List view',
			'viewicons'       : 'Icons view',
			'viewSmall'       : 'Small icons', // from v2.1.39 added 22.5.2018
			'viewMedium'      : 'Medium icons', // from v2.1.39 added 22.5.2018
			'viewLarge'       : 'Large icons', // from v2.1.39 added 22.5.2018
			'viewExtraLarge'  : 'Extra large icons', // from v2.1.39 added 22.5.2018
			'places'          : 'Places',
			'calc'            : 'Calculate',
			'path'            : 'Path',
			'aliasfor'        : 'Alias for',
			'locked'          : 'Locked',
			'dim'             : 'Dimensions',
			'files'           : 'Files',
			'folders'         : 'Folders',
			'items'           : 'Items',
			'yes'             : 'yes',
			'no'              : 'no',
			'link'            : 'Link',
			'searcresult'     : 'Search results',
			'selected'        : 'selected items',
			'about'           : 'About',
			'shortcuts'       : 'Shortcuts',
			'help'            : 'Help',
			'webfm'           : 'Web file manager',
			'ver'             : 'Version',
			'protocolver'     : 'protocol version',
			'homepage'        : 'Project home',
			'docs'            : 'Documentation',
			'github'          : 'Fork us on GitHub',
			'twitter'         : 'Follow us on Twitter',
			'facebook'        : 'Join us on Facebook',
			'team'            : 'Team',
			'chiefdev'        : 'chief developer',
			'developer'       : 'developer',
			'contributor'     : 'contributor',
			'maintainer'      : 'maintainer',
			'translator'      : 'translator',
			'icons'           : 'Icons',
			'dontforget'      : 'and don\'t forget to take your towel',
			'shortcutsof'     : 'Shortcuts disabled',
			'dropFiles'       : 'Drop files here',
			'or'              : 'or',
			'selectForUpload' : 'Select files',
			'moveFiles'       : 'Move items',
			'copyFiles'       : 'Copy items',
			'restoreFiles'    : 'Restore items', // from v2.1.24 added 5.5.2017
			'rmFromPlaces'    : 'Remove from places',
			'aspectRatio'     : 'Aspect ratio',
			'scale'           : 'Scale',
			'width'           : 'Width',
			'height'          : 'Height',
			'resize'          : 'Resize',
			'crop'            : 'Crop',
			'rotate'          : 'Rotate',
			'rotate-cw'       : 'Rotate 90 degrees CW',
			'rotate-ccw'      : 'Rotate 90 degrees CCW',
			'degree'          : '°',
			'netMountDialogTitle' : 'Mount network volume', // added 18.04.2012
			'protocol'            : 'Protocol', // added 18.04.2012
			'host'                : 'Host', // added 18.04.2012
			'port'                : 'Port', // added 18.04.2012
			'user'                : 'User', // added 18.04.2012
			'pass'                : 'Password', // added 18.04.2012
			'confirmUnmount'      : 'Are you unmount $1?',  // from v2.1 added 30.04.2012
			'dropFilesBrowser': 'Drop or Paste files from browser', // from v2.1 added 30.05.2012
			'dropPasteFiles'  : 'Drop files, Paste URLs or images(clipboard) here', // from v2.1 added 07.04.2014
			'encoding'        : 'Encoding', // from v2.1 added 19.12.2014
			'locale'          : 'Locale',   // from v2.1 added 19.12.2014
			'searchTarget'    : 'Target: $1',                // from v2.1 added 22.5.2015
			'searchMime'      : 'Search by input MIME Type', // from v2.1 added 22.5.2015
			'owner'           : 'Owner', // from v2.1 added 20.6.2015
			'group'           : 'Group', // from v2.1 added 20.6.2015
			'other'           : 'Other', // from v2.1 added 20.6.2015
			'execute'         : 'Execute', // from v2.1 added 20.6.2015
			'perm'            : 'Permission', // from v2.1 added 20.6.2015
			'mode'            : 'Mode', // from v2.1 added 20.6.2015
			'emptyFolder'     : 'Folder is empty', // from v2.1.6 added 30.12.2015
			'emptyFolderDrop' : 'Folder is empty\\A Drop to add items', // from v2.1.6 added 30.12.2015
			'emptyFolderLTap' : 'Folder is empty\\A Long tap to add items', // from v2.1.6 added 30.12.2015
			'quality'         : 'Quality', // from v2.1.6 added 5.1.2016
			'autoSync'        : 'Auto sync',  // from v2.1.6 added 10.1.2016
			'moveUp'          : 'Move up',  // from v2.1.6 added 18.1.2016
			'getLink'         : 'Get URL link', // from v2.1.7 added 9.2.2016
			'selectedItems'   : 'Selected items ($1)', // from v2.1.7 added 2.19.2016
			'folderId'        : 'Folder ID', // from v2.1.10 added 3.25.2016
			'offlineAccess'   : 'Allow offline access', // from v2.1.10 added 3.25.2016
			'reAuth'          : 'To re-authenticate', // from v2.1.10 added 3.25.2016
			'nowLoading'      : 'Now loading...', // from v2.1.12 added 4.26.2016
			'openMulti'       : 'Open multiple files', // from v2.1.12 added 5.14.2016
			'openMultiConfirm': 'You are trying to open the $1 files. Are you sure you want to open in browser?', // from v2.1.12 added 5.14.2016
			'emptySearch'     : 'Search results is empty in search target.', // from v2.1.12 added 5.16.2016
			'editingFile'     : 'It is editing a file.', // from v2.1.13 added 6.3.2016
			'hasSelected'     : 'You have selected $1 items.', // from v2.1.13 added 6.3.2016
			'hasClipboard'    : 'You have $1 items in the clipboard.', // from v2.1.13 added 6.3.2016
			'incSearchOnly'   : 'Incremental search is only from the current view.', // from v2.1.13 added 6.30.2016
			'reinstate'       : 'Reinstate', // from v2.1.15 added 3.8.2016
			'complete'        : '$1 complete', // from v2.1.15 added 21.8.2016
			'contextmenu'     : 'Context menu', // from v2.1.15 added 9.9.2016
			'pageTurning'     : 'Page turning', // from v2.1.15 added 10.9.2016
			'volumeRoots'     : 'Volume roots', // from v2.1.16 added 16.9.2016
			'reset'           : 'Reset', // from v2.1.16 added 1.10.2016
			'bgcolor'         : 'Background color', // from v2.1.16 added 1.10.2016
			'colorPicker'     : 'Color picker', // from v2.1.16 added 1.10.2016
			'8pxgrid'         : '8px Grid', // from v2.1.16 added 4.10.2016
			'enabled'         : 'Enabled', // from v2.1.16 added 4.10.2016
			'disabled'        : 'Disabled', // from v2.1.16 added 4.10.2016
			'emptyIncSearch'  : 'Search results is empty in current view.\\APress [Enter] to expand search target.', // from v2.1.16 added 5.10.2016
			'emptyLetSearch'  : 'First letter search results is empty in current view.', // from v2.1.23 added 24.3.2017
			'textLabel'       : 'Text label', // from v2.1.17 added 13.10.2016
			'minsLeft'        : '$1 mins left', // from v2.1.17 added 13.11.2016
			'openAsEncoding'  : 'Reopen with selected encoding', // from v2.1.19 added 2.12.2016
			'saveAsEncoding'  : 'Save with the selected encoding', // from v2.1.19 added 2.12.2016
			'selectFolder'    : 'Select folder', // from v2.1.20 added 13.12.2016
			'firstLetterSearch': 'First letter search', // from v2.1.23 added 24.3.2017
			'presets'         : 'Presets', // from v2.1.25 added 26.5.2017
			'tooManyToTrash'  : 'It\'s too many items so it can\'t into trash.', // from v2.1.25 added 9.6.2017
			'TextArea'        : 'TextArea', // from v2.1.25 added 14.6.2017
			'folderToEmpty'   : 'Empty the folder "$1".', // from v2.1.25 added 22.6.2017
			'filderIsEmpty'   : 'There are no items in a folder "$1".', // from v2.1.25 added 22.6.2017
			'preference'      : 'Preference', // from v2.1.26 added 28.6.2017
			'language'        : 'Language', // from v2.1.26 added 28.6.2017
			'clearBrowserData': 'Initialize the settings saved in this browser', // from v2.1.26 added 28.6.2017
			'toolbarPref'     : 'Toolbar settings', // from v2.1.27 added 2.8.2017
			'charsLeft'       : '... $1 chars left.',  // from v2.1.29 added 30.8.2017
			'linesLeft'       : '... $1 lines left.',  // from v2.1.52 added 16.1.2020
			'sum'             : 'Sum', // from v2.1.29 added 28.9.2017
			'roughFileSize'   : 'Rough file size', // from v2.1.30 added 2.11.2017
			'autoFocusDialog' : 'Focus on the element of dialog with mouseover',  // from v2.1.30 added 2.11.2017
			'select'          : 'Select', // from v2.1.30 added 23.11.2017
			'selectAction'    : 'Action when select file', // from v2.1.30 added 23.11.2017
			'useStoredEditor' : 'Open with the editor used last time', // from v2.1.30 added 23.11.2017
			'selectinvert'    : 'Invert selection', // from v2.1.30 added 25.11.2017
			'renameMultiple'  : 'Are you sure you want to rename $1 selected items like $2?<br/>This cannot be undone!', // from v2.1.31 added 4.12.2017
			'batchRename'     : 'Batch rename', // from v2.1.31 added 8.12.2017
			'plusNumber'      : '+ Number', // from v2.1.31 added 8.12.2017
			'asPrefix'        : 'Add prefix', // from v2.1.31 added 8.12.2017
			'asSuffix'        : 'Add suffix', // from v2.1.31 added 8.12.2017
			'changeExtention' : 'Change extention', // from v2.1.31 added 8.12.2017
			'columnPref'      : 'Columns settings (List view)', // from v2.1.32 added 6.2.2018
			'reflectOnImmediate' : 'All changes will reflect immediately to the archive.', // from v2.1.33 added 2.3.2018
			'reflectOnUnmount'   : 'Any changes will not reflect until un-mount this volume.', // from v2.1.33 added 2.3.2018
			'unmountChildren' : 'The following volume(s) mounted on this volume also unmounted. Are you sure to unmount it?', // from v2.1.33 added 5.3.2018
			'selectionInfo'   : 'Selection Info', // from v2.1.33 added 7.3.2018
			'hashChecker'     : 'Algorithms to show the file hash', // from v2.1.33 added 10.3.2018
			'infoItems'       : 'Info Items (Selection Info Panel)', // from v2.1.38 added 28.3.2018
			'pressAgainToExit': 'Press again to exit.', // from v2.1.38 added 1.4.2018
			'toolbar'         : 'Toolbar', // from v2.1.38 added 4.4.2018
			'workspace'       : 'Work Space', // from v2.1.38 added 4.4.2018
			'dialog'          : 'Dialog', // from v2.1.38 added 4.4.2018
			'all'             : 'All', // from v2.1.38 added 4.4.2018
			'iconSize'        : 'Icon Size (Icons view)', // from v2.1.39 added 7.5.2018
			'editorMaximized' : 'Open the maximized editor window', // from v2.1.40 added 30.6.2018
			'editorConvNoApi' : 'Because conversion by API is not currently available, please convert on the website.', //from v2.1.40 added 8.7.2018
			'editorConvNeedUpload' : 'After conversion, you must be upload with the item URL or a downloaded file to save the converted file.', //from v2.1.40 added 8.7.2018
			'convertOn'       : 'Convert on the site of $1', // from v2.1.40 added 10.7.2018
			'integrations'    : 'Integrations', // from v2.1.40 added 11.7.2018
			'integrationWith' : 'This elFinder has the following external services integrated. Please check the terms of use, privacy policy, etc. before using it.', // from v2.1.40 added 11.7.2018
			'showHidden'      : 'Show hidden items', // from v2.1.41 added 24.7.2018
			'hideHidden'      : 'Hide hidden items', // from v2.1.41 added 24.7.2018
			'toggleHidden'    : 'Show/Hide hidden items', // from v2.1.41 added 24.7.2018
			'makefileTypes'   : 'File types to enable with "New file"', // from v2.1.41 added 7.8.2018
			'typeOfTextfile'  : 'Type of the Text file', // from v2.1.41 added 7.8.2018
			'add'             : 'Add', // from v2.1.41 added 7.8.2018
			'theme'           : 'Theme', // from v2.1.43 added 19.10.2018
			'default'         : 'Default', // from v2.1.43 added 19.10.2018
			'description'     : 'Description', // from v2.1.43 added 19.10.2018
			'website'         : 'Website', // from v2.1.43 added 19.10.2018
			'author'          : 'Author', // from v2.1.43 added 19.10.2018
			'email'           : 'Email', // from v2.1.43 added 19.10.2018
			'license'         : 'License', // from v2.1.43 added 19.10.2018
			'exportToSave'    : 'This item can\'t be saved. To avoid losing the edits you need to export to your PC.', // from v2.1.44 added 1.12.2018
			'dblclickToSelect': 'Double click on the file to select it.', // from v2.1.47 added 22.1.2019
			'useFullscreen'   : 'Use fullscreen mode', // from v2.1.47 added 19.2.2019

			/********************************** mimetypes **********************************/
			'kindUnknown'     : 'Unknown',
			'kindRoot'        : 'Volume Root', // from v2.1.16 added 16.10.2016
			'kindFolder'      : 'Folder',
			'kindSelects'     : 'Selections', // from v2.1.29 added 29.8.2017
			'kindAlias'       : 'Alias',
			'kindAliasBroken' : 'Broken alias',
			// applications
			'kindApp'         : 'Application',
			'kindPostscript'  : 'Postscript document',
			'kindMsOffice'    : 'Microsoft Office document',
			'kindMsWord'      : 'Microsoft Word document',
			'kindMsExcel'     : 'Microsoft Excel document',
			'kindMsPP'        : 'Microsoft Powerpoint presentation',
			'kindOO'          : 'Open Office document',
			'kindAppFlash'    : 'Flash application',
			'kindPDF'         : 'Portable Document Format (PDF)',
			'kindTorrent'     : 'Bittorrent file',
			'kind7z'          : '7z archive',
			'kindTAR'         : 'TAR archive',
			'kindGZIP'        : 'GZIP archive',
			'kindBZIP'        : 'BZIP archive',
			'kindXZ'          : 'XZ archive',
			'kindZIP'         : 'ZIP archive',
			'kindRAR'         : 'RAR archive',
			'kindJAR'         : 'Java JAR file',
			'kindTTF'         : 'True Type font',
			'kindOTF'         : 'Open Type font',
			'kindRPM'         : 'RPM package',
			// texts
			'kindText'        : 'Text document',
			'kindTextPlain'   : 'Plain text',
			'kindPHP'         : 'PHP source',
			'kindCSS'         : 'Cascading style sheet',
			'kindHTML'        : 'HTML document',
			'kindJS'          : 'Javascript source',
			'kindRTF'         : 'Rich Text Format',
			'kindC'           : 'C source',
			'kindCHeader'     : 'C header source',
			'kindCPP'         : 'C++ source',
			'kindCPPHeader'   : 'C++ header source',
			'kindShell'       : 'Unix shell script',
			'kindPython'      : 'Python source',
			'kindJava'        : 'Java source',
			'kindRuby'        : 'Ruby source',
			'kindPerl'        : 'Perl script',
			'kindSQL'         : 'SQL source',
			'kindXML'         : 'XML document',
			'kindAWK'         : 'AWK source',
			'kindCSV'         : 'Comma separated values',
			'kindDOCBOOK'     : 'Docbook XML document',
			'kindMarkdown'    : 'Markdown text', // added 20.7.2015
			// images
			'kindImage'       : 'Image',
			'kindBMP'         : 'BMP image',
			'kindJPEG'        : 'JPEG image',
			'kindGIF'         : 'GIF Image',
			'kindPNG'         : 'PNG Image',
			'kindTIFF'        : 'TIFF image',
			'kindTGA'         : 'TGA image',
			'kindPSD'         : 'Adobe Photoshop image',
			'kindXBITMAP'     : 'X bitmap image',
			'kindPXM'         : 'Pixelmator image',
			// media
			'kindAudio'       : 'Audio media',
			'kindAudioMPEG'   : 'MPEG audio',
			'kindAudioMPEG4'  : 'MPEG-4 audio',
			'kindAudioMIDI'   : 'MIDI audio',
			'kindAudioOGG'    : 'Ogg Vorbis audio',
			'kindAudioWAV'    : 'WAV audio',
			'AudioPlaylist'   : 'MP3 playlist',
			'kindVideo'       : 'Video media',
			'kindVideoDV'     : 'DV movie',
			'kindVideoMPEG'   : 'MPEG movie',
			'kindVideoMPEG4'  : 'MPEG-4 movie',
			'kindVideoAVI'    : 'AVI movie',
			'kindVideoMOV'    : 'Quick Time movie',
			'kindVideoWM'     : 'Windows Media movie',
			'kindVideoFlash'  : 'Flash movie',
			'kindVideoMKV'    : 'Matroska movie',
			'kindVideoOGG'    : 'Ogg movie'
		}
	};
}));

js/i18n/elfinder.si.js000064400000146476151215013370010517 0ustar00/**
 * Sinhala translation
 * @author CodeLyokoXtEAM <XcodeLyokoTEAM@gmail.com>
 * @version 2022-03-03
 */
 (function(root, factory) {
	if (typeof define === 'function' && define.amd) {
		define(['elfinder'], factory);
	} else if (typeof exports !== 'undefined') {
		module.exports = factory(require('elfinder'));
	} else {
		factory(root.elFinder);
	}
}(this, function(elFinder) {
	elFinder.prototype.i18.si = {
		translator : 'CodeLyokoXtEAM &lt;XcodeLyokoTEAM@gmail.com&gt;',
		language   : 'Sinhala',
		direction  : 'ltr',
		dateFormat : 'Y.m.d h:i A', // will show like: 2022.03.03 01:13 PM
		fancyDateFormat : '$1 h:i A', // will show like: අද 01:13 PM
		nonameDateFormat : 'Ymd-His', // noname upload will show like: 20220303-131342
		messages   : {
			'getShareText' : 'බෙදාගන්න',
			'Editor ': 'කේත සංස්කාරකය',

			/********************************** errors **********************************/
			'error'                : 'දෝෂයකි.',
			'errUnknown'           : 'නොදන්නා දෝෂයකි.',
			'errUnknownCmd'        : 'නොදන්නා විධානයකි.',
			'errJqui'              : 'වලංගු නොවන jQuery UI සැකැස්මකි. තේරිය හැකි, ඇදගෙන යාම සහ ඇද දැමිය හැකි කොටස් ඇතුළත් කළ යුතුය.',
			'errNode'              : 'ElFinder විසින් DOM Element නිර්මාණය කිරීමට අවශ්‍යව අැත.',
			'errURL'               : 'වලංගු නොවන elFinder සැකැස්මකි! URL විකල්පය සැකසා නැත.',
			'errAccess'            : 'භාවිතය අත්හිටුවා ඇත.',
			'errConnect'           : 'පසුබිම(Backend) වෙත සම්බන්ධ වීමට නොහැකිය.',
			'errAbort'             : 'සම්බන්ධතාවය වසාදමා ඇත.',
			'errTimeout'           : 'සම්බන්ධතා කල් ඉකුත්වී ඇත.',
			'errNotFound'          : 'පසුබිම(Backend) සොයාගත නොහැකි විය.',
			'errResponse'          : 'වලංගු නොවන පසුබිම(Backend) ප්‍රතිචාරය.',
			'errConf'              : 'වලංගු නොවන Backend සැකැස්මකි.',
			'errJSON'              : 'PHP JSON මොඩියුලය ස්ථාපනය කර නැත.',
			'errNoVolumes'         : 'කියවිය හැකි එ්කක(volumes) නොමැත.',
			'errCmdParams'         : '"$1" නම් විධානය වලංගු නොවන පරාමිතියකි.',
			'errDataNotJSON'       : 'JSON දත්ත නොවේ.',
			'errDataEmpty'         : 'හිස් දත්තයකි.',
			'errCmdReq'            : 'Backend සඳහා ඉල්ලන ලද විධානයේ නම අවශ්‍ය වේ.',
			'errOpen'              : '"$1" විවෘත කළ නොහැක.',
			'errNotFolder'         : 'අායිත්තම(object) ෆොල්ඩරයක් නොවේ.',
			'errNotFile'           : 'අායිත්තම(object) ගොනුවක් නොවේ.',
			'errRead'              : '"$1" කියවීමට නොහැක.',
			'errWrite'             : '"$1" තුල ලිවීමට නොහැකිය.',
			'errPerm'              : 'අවසරය නොමැත.',
			'errLocked'            : '"$1" අගුළු දමා ඇති අතර එය නැවත නම් කිරීම, සම්පූර්ණයෙන් විස්ථාපනය කිරීම හෝ ඉවත් කිරීම කළ නොහැක.',
			'errExists'            : '"$1" නම් ගොනුව දැනටමත් පවතී.',
			'errInvName'           : 'ගොනු නම වලංගු නොවේ.',
			'errInvDirname'        : 'ෆෝල්ඩර් නම වලංගු නොවේ.',  // from v2.1.24 added 12.4.2017
			'errFolderNotFound'    : 'ෆෝල්ඩරය හමු නොවිණි.',
			'errFileNotFound'      : 'ගොනුව හමු නොවිණි.',
			'errTrgFolderNotFound' : 'ඉලක්කගත ෆෝල්ඩරය "$1" හමු නොවිනි.',
			'errPopup'             : 'බ්‍රවුසරය උත්පතන කවුළුව විවෘත කිරීම වළක්වයි. ගොනු විවෘත කිරීම සඳහා බ්‍රවුසරයේ විකල්ප තුළ එය සක්රිය කරන්න.',
			'errMkdir'             : '"$1" ෆෝල්ඩරය සෑදීමට නොහැකිය.',
			'errMkfile'            : '"$1" ගොනුව සෑදිය නොහැක.',
			'errRename'            : '"$1" නැවත නම් කිරීමට නොහැකි විය.',
			'errCopyFrom'          : '"$1" volume යෙන් ගොනු පිටපත් කිරීම තහනම්ය.',
			'errCopyTo'            : '"$1" volume යට ගොනු පිටපත් කිරීම තහනම්ය.',
			'errMkOutLink'         : 'volume root යෙන් පිටතට සබැඳිය(link) නිර්මාණය කිරීමට නොහැකි විය.', // from v2.1 added 03.10.2015
			'errUpload'            : 'උඩුගත(upload) කිරීමේ දෝෂයකි.',  // old name - errUploadCommon
			'errUploadFile'        : '"$1" උඩුගත(upload) කිරීමට නොහැකි විය.', // old name - errUpload
			'errUploadNoFiles'     : 'උඩුගත(upload) කිරීම සඳහා ගොනු කිසිවක් සොයාගත නොහැකි විය.',
			'errUploadTotalSize'   : 'දත්ත අවසර දී අැති උපරිම ප්‍රමාණය ඉක්මවා ඇත.', // old name - errMaxSize
			'errUploadFileSize'    : 'ගොනු අවසර දී අැති උපරිම ප්‍රමාණය ඉක්මවා ඇත.', //  old name - errFileMaxSize
			'errUploadMime'        : 'ගොනු වර්ගයට අවසර නැත.',
			'errUploadTransfer'    : '"$1" ව මාරු කිරීමේ දෝෂයකි.',
			'errUploadTemp'        : 'upload කිරීම සඳහා තාවකාලික ගොනුව සෑදිය නොහැක.', // from v2.1 added 26.09.2015
			'errNotReplace'        : '"$1" අායිත්තම(object) දැනටමත් මෙම ස්ථානයේ පවතී, වෙනත් වර්ගයකිනි ප්‍රතිස්ථාපනය කළ නොහැක.', // new
			'errReplace'           : '"$1" ප්‍රතිස්ථාපනය කළ නොහැක.',
			'errSave'              : '"$1" සුරැකීමට නොහැක.',
			'errCopy'              : '"$1" පිටපත් කිරීමට නොහැක.',
			'errMove'              : '"$1" සම්පූර්ණයෙන් විස්ථාපනය කිරීමට නොහැක.',
			'errCopyInItself'      : '"$1" තුලට පිටපත් කිරීමට නොහැක.',
			'errRm'                : '"$1" ඉවත් කිරීමට නොහැකි විය.',
			'errTrash'             : 'කුණු-කූඩය තුලට දැමීමට නොහැක.', // from v2.1.24 added 30.4.2017
			'errRmSrc'             : 'මූලාශ්‍රය ගොනු(ව) ඉවත් කළ නොහැක.',
			'errExtract'           : '"$1" වෙතින් ගොනු දිග හැරීමට නොහැක.',
			'errArchive'           : 'සංරක්ෂිතය සෑදීමට නොහැකි විය.',
			'errArcType'           : 'නොගැලපෙන සංරක්ෂණ වර්ගයකි.',
			'errNoArchive'         : 'ගොනුව නොගැලපෙන සංරක්ෂණ වර්ගයක් හෝ සංරක්ෂිතයක් නොවේ.',
			'errCmdNoSupport'      : 'පසුබිම(Backend) මෙම විධානය නොදනී.',
			'errReplByChild'       : '"$1" ෆෝල්ඩරය එහිම අඩංගු අයිතමයක් මගින් ප්‍රතිස්ථාපනය කළ නොහැක.',
			'errArcSymlinks'       : 'ආරක්ෂිත හේතුව නිසා අනුමත නොකෙරෙන සබැඳි සම්බන්දතා හෝ ලිපිගොනු නම් අඩංගු බැවින් සංරක්ෂිතය දිග හැරීම කිරීමට ඉඩ නොදෙන.', // edited 24.06.2012
			'errArcMaxSize'        : 'සංරක්ෂිතය ලිපිගොනු උපරිම ප්‍රමාණය ඉක්මවා ඇත.',
			'errResize'            : 'ප්‍රතිප්‍රමාණය කිරීමට නොහැකි විය.',
			'errResizeDegree'      : 'වලංගු නොවන භ්‍රමණ කෝණයකි.',  // added 7.3.2013
			'errResizeRotate'      : 'රූපය භ්‍රමණය කිරීමට නොහැකි විය.',  // added 7.3.2013
			'errResizeSize'        : 'රූපයේ ප්‍රමාණය වලංගු නොවේ.',  // added 7.3.2013
			'errResizeNoChange'    : 'රූපයේ ප්‍රමාණය වෙනස් නොවුණි.',  // added 7.3.2013
			'errUsupportType'      : 'නොගැලපෙන ගොනු වර්ගයකි.',
			'errNotUTF8Content'    : '"$1" ගොනුව UTF-8 හි නොමැති අතර සංස්කරණය කළ නොහැක.',  // added 9.11.2011
			'errNetMount'          : '"$1" සවි(mount) කිරීමට නොහැක.', // added 17.04.2012
			'errNetMountNoDriver'  : 'ප්‍රොටොකෝලය(protocol) නොගැලපේ.',     // added 17.04.2012
			'errNetMountFailed'    : 'සවි කිරීම(mount කිරීම) අසාර්ථක විය.',         // added 17.04.2012
			'errNetMountHostReq'   : 'ධාරකය(Host) අවශ්‍ය වේ.', // added 18.04.2012
			'errSessionExpires'    : 'ඔබේ අක්‍රියතාව හේතුවෙන් සැසිය(session) කල් ඉකුත් වී ඇත.',
			'errCreatingTempDir'   : 'තාවකාලික ඩිරෙක්ටරයක්(directory) ​​සෑදිය නොහැක: "$1"',
			'errFtpDownloadFile'   : 'FTP වලින් ගොනුව බාගත(download) කිරීමට නොහැකි විය: "$1"',
			'errFtpUploadFile'     : 'ගොනුව FTP වෙත උඩුගත(upload) කිරීමට නොහැකි විය: "$1"',
			'errFtpMkdir'          : 'FTP මත දුරස්ථ නාමාවලියක්(remote directory) නිර්මාණය කිරීමට නොහැකි විය: "$1"',
			'errArchiveExec'       : 'ගොනු සංරක්ෂණය(archiving) කිරීමේදී දෝෂයක් ඇතිවිය: "$1"',
			'errExtractExec'       : 'ගොනු දිගහැරීමේදී(extracting) දෝෂයක් ඇතිවිය: "$1"',
			'errNetUnMount'        : 'විසන්ධි කිරීමට(unmount) නොහැක.', // from v2.1 added 30.04.2012
			'errConvUTF8'          : 'UTF-8 වෙත පරිවර්තනය කළ නොහැක.', // from v2.1 added 08.04.2014
			'errFolderUpload'      : 'ඔබ ෆෝල්ඩරය උඩුගත(upload) කිරීමට කැමති නම් නවීන බ්‍රවුසරයකින් උත්සාහ කරන්න.', // from v2.1 added 26.6.2015
			'errSearchTimeout'     : '"$1" සෙවීම කල් ඉකුත්වී ඇත. සෙවුම් ප්‍රතිඵල අර්ධ වශයෙන් දිස්වේ.', // from v2.1 added 12.1.2016
			'errReauthRequire'     : 'නැවත බලය(Re-authorization) ලබා දීම අවශ්‍ය වේ.', // from v2.1.10 added 24.3.2016
			'errMaxTargets'        : 'තෝරා ගත හැකි උපරිම අයිතම සංඛ්‍යාව $1 ක් වේ.', // from v2.1.17 added 17.10.2016
			'errRestore'           : 'කුණු කූඩයෙන් නැවත ලබා ගත නොහැක. යළි පිහිටුවීමේ ගමනාන්තය(restore destination) හඳුනාගත නොහැක.', // from v2.1.24 added 3.5.2017
			'errEditorNotFound'    : 'මෙම ගොනු වර්ගයේ සංස්කාරකය හමු නොවිණි.', // from v2.1.25 added 23.5.2017
			'errServerError'       : 'සේවාදායකයේ පැත්තෙන්(server side) දෝශයක් ඇතිවිය.', // from v2.1.25 added 16.6.2017
			'errEmpty'             : '"$1" ෆෝල්ඩරය හිස් කිරීමට නොහැක.', // from v2.1.25 added 22.6.2017
			'moreErrors'           : 'තවත් $1 දෝෂ ඇත.', // from v2.1.44 added 9.12.2018
			'errMaxMkdirs'         : 'ඔබට එක් වරකට $1 දක්වා ෆෝල්ඩර සෑදිය හැක.', // from v2.1.58 added 20.6.2021

			/******************************* commands names ********************************/
			'cmdarchive'   : 'සංරක්ෂිතය(archive) නිර්මාණය කරන්න',
			'cmdback'      : 'ආපසු',
			'cmdcopy'      : 'පිටපත් කරන්න',
			'cmdcut'       : 'මුළුමනින්ම පිටපත් කරන්න(Cut)',
			'cmddownload'  : 'බාගත කරන්න(Download)',
			'cmdduplicate' : 'අනුපිටපත් කරන්න(Duplicate)',
			'cmdedit'      : 'ගොනුව සංස්කරණය කරන්න',
			'cmdextract'   : 'සංරක්ෂිතයේ ගොනු දිගහරින්න(Extract)',
			'cmdforward'   : 'ඉදිරියට',
			'cmdgetfile'   : 'ගොනු තෝරන්න',
			'cmdhelp'      : 'මෙම මෘදුකාංගය පිළිබඳව',
			'cmdhome'      : 'නිවහන(Home)',
			'cmdinfo'      : 'තොරතුරු ලබාගන්න',
			'cmdmkdir'     : 'අළුත් ෆෝල්ඩරයක්',
			'cmdmkdirin'   : 'අළුත් ෆෝල්ඩරයක් තුළට', // from v2.1.7 added 19.2.2016
			'cmdmkfile'    : 'නව ගොනුවක්',
			'cmdopen'      : 'විවෘත කරන්න',
			'cmdpaste'     : 'දමන්න(Paste)',
			'cmdquicklook' : 'පූර්ව දර්ශනයක්(Preview)',
			'cmdreload'    : 'නැවත අළුත් කරන්න(Reload)',
			'cmdrename'    : 'නම වෙනස් කරන්න',
			'cmdrm'        : 'මකන්න',
			'cmdtrash'     : 'කුණු කූඩයට දමන්න', //from v2.1.24 added 29.4.2017
			'cmdrestore'   : 'යළි පිහිටුවන්න(Restore)', //from v2.1.24 added 3.5.2017
			'cmdsearch'    : 'ගොනු සොයන්න',
			'cmdup'        : 'ප්‍ර්‍රධාන නාමාවලිය(parent directory) වෙත යන්න',
			'cmdupload'    : 'ගොනු උඩුගත(Upload) කරන්න',
			'cmdview'      : 'දර්ශනය(View)',
			'cmdresize'    : 'ප්‍රථිප්‍රමාණය සහ භ්‍රමණය',
			'cmdsort'      : 'වර්ගීකරණය කරන්න',
			'cmdnetmount'  : 'ජාල එ්කකයක් සවි කරන්න(Mount network volume)', // added 18.04.2012
			'cmdnetunmount': 'ගලවන්න(Unmount)', // from v2.1 added 30.04.2012
			'cmdplaces'    : 'පහසු ස්ථානයට(To Places)', // added 28.12.2014
			'cmdchmod'     : 'ක්‍රමය වෙනස් කරන්න', // from v2.1 added 20.6.2015
			'cmdopendir'   : 'ෆෝල්ඩරය විවෘත කරන්න', // from v2.1 added 13.1.2016
			'cmdcolwidth'  : 'නැවත තීරු පළල පිහිටුවන්න', // from v2.1.13 added 12.06.2016
			'cmdfullscreen': 'පුළුල් තිරය', // from v2.1.15 added 03.08.2016
			'cmdmove'      : 'මාරු කරන්න(Move)', // from v2.1.15 added 21.08.2016
			'cmdempty'     : 'ෆෝල්ඩරය හිස් කරන්න', // from v2.1.25 added 22.06.2017
			'cmdundo'      : 'නිෂ්ප්‍රභ කරන්න', // from v2.1.27 added 31.07.2017
			'cmdredo'      : 'නැවත කරන්න', // from v2.1.27 added 31.07.2017
			'cmdpreference': 'අභිමතයන් (Preferences)', // from v2.1.27 added 03.08.2017
			'cmdselectall' : 'සියල්ල තෝරන්න', // from v2.1.28 added 15.08.2017
			'cmdselectnone': 'කිසිවක් තෝරන්න එපා', // from v2.1.28 added 15.08.2017
			'cmdselectinvert': 'විරුද්ධ අාකාරයට තෝරන්න', // from v2.1.28 added 15.08.2017
			'cmdopennew'   : 'නව කවුළුවක විවෘත කරන්න', // from v2.1.38 added 3.4.2018
			'cmdhide'      : 'සඟවන්න (මනාපය)', // from v2.1.41 added 24.7.2018

			/*********************************** buttons ***********************************/
			'btnClose'  : 'වසන්න',
			'btnSave'   : 'සුරකින්න',
			'btnRm'     : 'ඉවත් කරන්න',
			'btnApply'  : 'යොදන්න(Apply)',
			'btnCancel' : 'අවලංගු කරන්න',
			'btnNo'     : 'නැත',
			'btnYes'    : 'ඔව්',
			'btnMount'  : 'සවිකිරීම(Mount)',  // added 18.04.2012
			'btnApprove': 'කරුණාකර $1 අනුමත කරන්න', // from v2.1 added 26.04.2012
			'btnUnmount': 'ගලවන්න(Unmount)', // from v2.1 added 30.04.2012
			'btnConv'   : 'පරිවර්තනය කරන්න', // from v2.1 added 08.04.2014
			'btnCwd'    : 'මෙතන',      // from v2.1 added 22.5.2015
			'btnVolume' : 'එ්කකය(Volume)',    // from v2.1 added 22.5.2015
			'btnAll'    : 'සියල්ල',       // from v2.1 added 22.5.2015
			'btnMime'   : 'MIME වර්ගය', // from v2.1 added 22.5.2015
			'btnFileName':'ගොනුවේ නම',  // from v2.1 added 22.5.2015
			'btnSaveClose': 'සුරකින්න සහ වසන්න', // from v2.1 added 12.6.2015
			'btnBackup' : 'උපස්ථ(Backup) කරන්න', // fromv2.1 added 28.11.2015
			'btnRename'    : 'නම වෙනස් කරන්න',      // from v2.1.24 added 6.4.2017
			'btnRenameAll' : 'නම වෙනස් කරන්න(සියල්ල)', // from v2.1.24 added 6.4.2017
			'btnPrevious' : 'පෙර ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnNext'     : 'ඊළඟ ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnSaveAs'   : 'වෙනත් නමකින් සුරකිමින්(Save As)', // from v2.1.25 added 24.5.2017

			/******************************** notifications ********************************/
			'ntfopen'     : 'ෆෝල්ඩරය විවෘත කරමින්',
			'ntffile'     : 'ගොනුව විවෘත කරමින්',
			'ntfreload'   : 'ෆෝල්ඩර් අන්තර්ගතය නැවත අළුත් කරමින්(Reloading)',
			'ntfmkdir'    : 'ෆෝල්ඩරයක් නිර්මාණය කරමින්',
			'ntfmkfile'   : 'ගොනුව නිර්මාණය කරමින්',
			'ntfrm'       : 'අයිතමයන් මකමින්',
			'ntfcopy'     : 'අයිතමයන් පිටපත් කරමින්',
			'ntfmove'     : 'අයිතමයන් සම්පූර්ණයෙන් විස්ථාපනය කරමින්',
			'ntfprepare'  : 'පවතින අයිතම පිරික්සමින්',
			'ntfrename'   : 'ගොනු නැවත නම් කරමින්',
			'ntfupload'   : 'ගොනු උඩුගත(uploading) කරමින්',
			'ntfdownload' : 'ගොනු බාගත(downloading) කරමින්',
			'ntfsave'     : 'ගොනු සුරකිමින්',
			'ntfarchive'  : 'සංරක්ෂණය(archive) සාදමින්',
			'ntfextract'  : 'සංරක්ෂණයෙන්(archive) ගොනු දිගහරිමින්(Extracting)',
			'ntfsearch'   : 'ගොනු සොයමින්',
			'ntfresize'   : 'රූප ප්‍රමාණය වෙනස් කරමින්',
			'ntfsmth'     : 'දෙයක් කරමින්',
			'ntfloadimg'  : 'පින්තූරය පූරණය කරමින්(Loading)',
			'ntfnetmount' : 'ජාල එ්කකයක් සවිකරමින්(Mounting network volume)', // added 18.04.2012
			'ntfnetunmount': 'ජාල එ්කකයක් ගලවමින්(Unmounting network volume)', // from v2.1 added 30.04.2012
			'ntfdim'      : 'පිංතූරයේ මානය(dimension) ලබාගනිමින්', // added 20.05.2013
			'ntfreaddir'  : 'ෆෝල්ඩරයේ තොරතුරු කියවමින්', // from v2.1 added 01.07.2013
			'ntfurl'      : 'සබැඳියේ URL ලබා ගැනීම', // from v2.1 added 11.03.2014
			'ntfchmod'    : 'ගොනු ආකරය වෙනස් කරමින්', // from v2.1 added 20.6.2015
			'ntfpreupload': 'උඩුගත(upload) කරන ලද ගොනු නාමය සත්‍යාපනය කරමින්(Verifying)', // from v2.1 added 31.11.2015
			'ntfzipdl'    : 'බාගත කරගැනීම(download) සඳහා ගොනුවක් නිර්මාණය කරමින්', // from v2.1.7 added 23.1.2016
			'ntfparents'  : 'මාර්ග(path) තොරතුරු ලබා ගනිමින්', // from v2.1.17 added 2.11.2016
			'ntfchunkmerge': 'උඩුගත කරන ලද(uploaded) ගොනුව සකසමින්', // from v2.1.17 added 2.11.2016
			'ntftrash'    : 'කුණු කූඩයට දමමින්', // from v2.1.24 added 2.5.2017
			'ntfrestore'  : 'කුණු කූඩයට දැමීම යළි පිහිටුවමින්(Doing restore)', // from v2.1.24 added 3.5.2017
			'ntfchkdir'   : 'ගමනාන්ත(destination) ෆෝල්ඩරය පරීක්ෂා කරමින්', // from v2.1.24 added 3.5.2017
			'ntfundo'     : 'පෙර මෙහෙයුම(operation) ඉවත් කරමින්', // from v2.1.27 added 31.07.2017
			'ntfredo'     : 'පෙර ආපසු හැරවීම යළි සැකසමින්', // from v2.1.27 added 31.07.2017
			'ntfchkcontent' : 'අන්තර්ගතය පරීක්ෂා කිරීම', // from v2.1.41 added 3.8.2018

			/*********************************** volumes *********************************/
			'volume_Trash' : 'කුණු කූඩය', //from v2.1.24 added 29.4.2017

			/************************************ dates **********************************/
			'dateUnknown' : 'නොදනී',
			'Today'       : 'අද',
			'Yesterday'   : 'ඊයේ',
			'msJan'       : 'ජනවා.',
			'msFeb'       : 'පෙබ.',
			'msMar'       : 'මාර්.',
			'msApr'       : 'අප්‍රේ.',
			'msMay'       : 'මැයි',
			'msJun'       : 'ජූනි',
			'msJul'       : 'ජුලි',
			'msAug'       : 'අගෝ.',
			'msSep'       : 'සැප්.',
			'msOct'       : 'ඔක්තෝ.',
			'msNov'       : 'නොවැ.',
			'msDec'       : 'දෙසැ.',
			'January'     : 'ජනවාරි',
			'February'    : 'පෙබරවාරි',
			'March'       : 'මාර්තු',
			'April'       : 'අප්‍රේල්',
			'May'         : 'මැයි',
			'June'        : 'ජූනි',
			'July'        : 'ජුලි',
			'August'      : 'අගෝස්තු',
			'September'   : 'සැප්තැම්බර්',
			'October'     : 'ඔක්තෝම්බර්',
			'November'    : 'නොවැම්බර්',
			'December'    : 'දෙසැම්බර්',
			'Sunday'      : 'ඉරිදා',
			'Monday'      : 'සඳුදා',
			'Tuesday'     : 'අඟහරුවාදා',
			'Wednesday'   : 'බදාදා',
			'Thursday'    : 'බ්‍රහස්පතින්දා',
			'Friday'      : 'සිකුරාදා',
			'Saturday'    : 'සෙනසුරාදා',
			'Sun'         : 'ඉරිදා',
			'Mon'         : 'සඳු.',
			'Tue'         : 'අඟහ.',
			'Wed'         : 'බදාදා',
			'Thu'         : 'බ්‍රහස්.',
			'Fri'         : 'සිකු.',
			'Sat'         : 'සෙන.',

			/******************************** sort variants ********************************/
			'sortname'          : 'නම අනුව',
			'sortkind'          : 'වර්ගය අනුව',
			'sortsize'          : 'ප්‍රමාණය අනුව',
			'sortdate'          : 'දිනය අනුව',
			'sortFoldersFirst'  : 'ෆෝල්ඩර වලට පළමු තැන',
			'sortperm'          : 'අවසරය අනුව', // from v2.1.13 added 13.06.2016
			'sortmode'          : 'අාකාරය අනුව',       // from v2.1.13 added 13.06.2016
			'sortowner'         : 'හිමිකරු අනුව',      // from v2.1.13 added 13.06.2016
			'sortgroup'         : 'කණ්ඩායම අනුව',      // from v2.1.13 added 13.06.2016
			'sortAlsoTreeview'  : 'එලෙසටම රුක්සටහනත්(Treeview)',  // from v2.1.15 added 01.08.2016

			/********************************** new items **********************************/
			'untitled file.txt' : 'NewFile.txt', // added 10.11.2015
			'untitled folder'   : 'නව ෆෝල්ඩරයක්',   // added 10.11.2015
			'Archive'           : 'නව ලේඛනාගාරය',  // from v2.1 added 10.11.2015
			'untitled file'     : 'නව ගොනුව.$1',  // from v2.1.41 added 6.8.2018
			'extentionfile'     : '$1: ගොනුව',    // from v2.1.41 added 6.8.2018
			'extentiontype'     : '$1: $2',      // from v2.1.43 added 17.10.2018

			/********************************** messages **********************************/
			'confirmReq'      : 'තහවුරු කිරීම අවශ්‍යයි',
			'confirmRm'       : 'අයිතමයන් සදහටම ඉවත් කිරීමට අවශ්‍ය බව ඔබට විශ්වාසද?<br/>මෙය අාපසු හැරවිය නොහැකිය!',
			'confirmRepl'     : 'පැරණි අයිතමය නව එකක මගින් ප්‍රතිස්ථාපනය කරන්නද?',
			'confirmRest'     : 'දැනට පවතින අයිතමය කුණු කූඩය තුළ පවතින අයිතමය මගින් ප්‍රතිස්ථාපනය කරන්නද?', // fromv2.1.24 added 5.5.2017
			'confirmConvUTF8' : 'UTF-8 හි නොවේ<br/> UTF-8 වෙත පරිවර්තනය කරන්න ද?<br/>සුරැකීමෙන් පසු අන්තර්ගතය UTF-8 බවට පරිවර්තනය වේ.', // from v2.1 added 08.04.2014
			'confirmNonUTF8'  : 'මෙම ගොනුවෙහි කේතන කේත(Character encoding) හඳුනාගත නොහැකි විය. සංස්කරණ කිරීමට එය තාවකාලිකව UTF-8 වෙත පරිවර්තනය කිරීම අවශ්‍ය වේ.<br/>කරුණාකර මෙම ගොනුවෙහි අක්ෂර කේතන කේත(character encoding) තෝරන්න.', // from v2.1.19 added 28.11.2016
			'confirmNotSave'  : 'මෙය වෙනස් කර ඇත.<br/>ඔබට වෙනස්කම් සුරැකීමට නොහැකි නම් සිදු කරනු ලැබූ වෙනස්කම් අහිමි වේ.', // from v2.1 added 15.7.2015
			'confirmTrash'    : 'කුණු කූඩය තුලට අයිතමය යැවීමට ඔබට අවශ්‍ය ද?', //from v2.1.24 added 29.4.2017
			'confirmMove'     : 'ඔබට අයිතම "$1" වෙත ගෙන යාමට අවශ්‍ය බව විශ්වාසද?', //from v2.1.50 added 27.7.2019
			'apllyAll'        : 'සියල්ලටම යොදන්න',
			'name'            : 'නම',
			'size'            : 'ප්‍රමාණය',
			'perms'           : 'අවසරය',
			'modify'          : 'නවීකරණය කෙරුණ ලද්දේ',
			'kind'            : 'ජාතිය',
			'read'            : 'කියවන්න',
			'write'           : 'ලියන්න',
			'noaccess'        : 'ප්‍රවේශයක් නොමැත',
			'and'             : 'සහ',
			'unknown'         : 'නොහඳුනයි',
			'selectall'       : 'සියලු ගොනු තෝරන්න',
			'selectfiles'     : 'ගොනු(ව) තෝරන්න',
			'selectffile'     : 'පළමු ගොනුව තෝරන්න',
			'selectlfile'     : 'අවසාන ගොනුව තෝරන්න',
			'viewlist'        : 'ලැයිස්තු අාකාරය',
			'viewicons'       : 'අයිකන අාකාරය',
			'viewSmall'       : 'කුඩා අයිකන', // from v2.1.39 added 22.5.2018
			'viewMedium'      : 'මධ්යම අයිකන', // from v2.1.39 added 22.5.2018
			'viewLarge'       : 'විශාල අයිකන', // from v2.1.39 added 22.5.2018
			'viewExtraLarge'  : 'අමතර විශාල අයිකන', // from v2.1.39 added 22.5.2018
			'places'          : 'ස්ථාන',
			'calc'            : 'ගණනය කරන්න',
			'path'            : 'මාර්ගය',
			'aliasfor'        : 'සඳහා අන්වර්ථය',
			'locked'          : 'අගුළු දමා ඇත',
			'dim'             : 'මාන(Dimensions)',
			'files'           : 'ගොනු',
			'folders'         : 'ෆෝල්ඩර',
			'items'           : 'අයිතම(Items)',
			'yes'             : 'ඔව්',
			'no'              : 'නැත',
			'link'            : 'සබැඳිය(Link)',
			'searcresult'     : 'සෙවුම් ප්‍රතිඵල',
			'selected'        : 'තෝරාගත් අයිතම',
			'about'           : 'මේ ගැන',
			'shortcuts'       : 'කෙටිමං',
			'help'            : 'උදව්',
			'webfm'           : 'වෙබ් ගොනු කළමනාකරු',
			'ver'             : 'අනුවාදය(version)',
			'protocolver'     : 'ප්‍රොටොකෝලය අනුවාදය(protocol version)',
			'homepage'        : 'ව්‍යාපෘතිය නිවහන',
			'docs'            : 'ලේඛනගත කිරීම',
			'github'          : 'Github හරහා සංවාදයේ යෙදෙන්න',
			'twitter'         : 'Twitter හරහා අපව සම්බන්ධ වන්න',
			'facebook'        : 'Facebook හරහා අප සමඟ එකතු වන්න',
			'team'            : 'කණ්ඩායම',
			'chiefdev'        : 'ප්‍රධාන සංස්කරු(chief developer)',
			'developer'       : 'සංස්කරු(developer)',
			'contributor'     : 'දායකයා(contributor)',
			'maintainer'      : 'නඩත්තු කරන්නා(maintainer)',
			'translator'      : 'පරිවර්තකයා',
			'icons'           : 'අයිකන',
			'dontforget'      : 'සහ ඔබේ තුවාය ගැනීමට අමතක නොකරන්න',
			'shortcutsof'     : 'කෙටිමං අක්‍රීය කර ඇත',
			'dropFiles'       : 'ගොනු මෙතැනට ඇද දමන්න',
			'or'              : 'හෝ',
			'selectForUpload' : 'ගොනු තෝරන්න',
			'moveFiles'       : 'අායිත්තම සම්පූර්ණයෙන් විස්ථාපනය',
			'copyFiles'       : 'අයිතමයන් පිටපත් කරන්න',
			'restoreFiles'    : 'අයිතම නැවත පිහිටුවන්න', // from v2.1.24 added 5.5.2017
			'rmFromPlaces'    : 'ස්ථාන වලින් ඉවත් කරන්න',
			'aspectRatio'     : 'දර්ශන අනුපාතය(Aspect ratio)',
			'scale'           : 'පරිමාණය',
			'width'           : 'පළල',
			'height'          : 'උස',
			'resize'          : 'ප්‍රතිප්‍රමානණය',
			'crop'            : 'බෝග',
			'rotate'          : 'කැරකැවීම',
			'rotate-cw'       : 'අංශක 90කින් කරකවන්න CW',
			'rotate-ccw'      : 'අංශක 90කින් කරකවන්න CCW',
			'degree'          : '°',
			'netMountDialogTitle' : 'ජාල පරිමාව සවි කරන්න', // added 18.04.2012
			'protocol'            : 'ප්රොටෝකෝලය', // added 18.04.2012
			'host'                : 'සත්කාරක', // added 18.04.2012
			'port'                : 'වරාය', // added 18.04.2012
			'user'                : 'පරිශීලක', // added 18.04.2012
			'pass'                : 'මුරපදය', // added 18.04.2012
			'confirmUnmount'      : 'ඔබ $1 ඉවත් කරනවාද?',  // from v2.1 added 30.04.2012
			'dropFilesBrowser': 'බ්‍රවුසරයෙන් ගොනු දමන්න හෝ අලවන්න', // from v2.1 added 30.05.2012
			'dropPasteFiles'  : 'මෙහි ගොනු දමන්න, URL හෝ පින්තූර (ක්ලිප්බෝඩ්) අලවන්න', // from v2.1 added 07.04.2014
			'encoding'        : 'කේතීකරණය(Encoding)', // from v2.1 added 19.12.2014
			'locale'          : 'දේශීය',   // from v2.1 added 19.12.2014
			'searchTarget'    : 'ඉලක්කය: $1',                // from v2.1 added 22.5.2015
			'searchMime'      : 'ආදාන MIME වර්ගය අනුව සොයන්න', // from v2.1 added 22.5.2015
			'owner'           : 'හිමිකරු', // from v2.1 added 20.6.2015
			'group'           : 'සමූහය', // from v2.1 added 20.6.2015
			'other'           : 'වෙනත්', // from v2.1 added 20.6.2015
			'execute'         : 'ක්‍රයාත්මක කරන්න', // from v2.1 added 20.6.2015
			'perm'            : 'අවසරය', // from v2.1 added 20.6.2015
			'mode'            : 'මාදිලිය', // from v2.1 added 20.6.2015
			'emptyFolder'     : 'ෆෝල්ඩරය හිස්', // from v2.1.6 added 30.12.2015
			'emptyFolderDrop' : 'ෆාේල්ඩරය හිස්\\A අායිත්තම අතහැරීමෙන් අැතුලු කරන්න', // from v2.1.6 added 30.12.2015
			'emptyFolderLTap' : 'ෆාේල්ඩරය හිස්\\A දිර්ඝ එබීමෙන් අායිත්තම අැතුලු කරන්න', // from v2.1.6 added 30.12.2015
			'quality'         : 'ගුණාත්මකභාවය', // from v2.1.6 added 5.1.2016
			'autoSync'        : 'ස්වයංක්‍රීය සමමුහුර්තකරණය',  // from v2.1.6 added 10.1.2016
			'moveUp'          : 'ඉහළට ගමන් කරන්න',  // from v2.1.6 added 18.1.2016
			'getLink'         : 'URL සබැඳිය ලබා ගන්න', // from v2.1.7 added 9.2.2016
			'selectedItems'   : 'තෝරාගත් අයිතම ($1)', // from v2.1.7 added 2.19.2016
			'folderId'        : 'ෆෝල්ඩර හැඳුනුම්පත', // from v2.1.10 added 3.25.2016
			'offlineAccess'   : 'නොබැඳි ප්‍රවේශයට ඉඩ දෙන්න', // from v2.1.10 added 3.25.2016
			'reAuth'          : 'නැවත සත්‍යාපනය කිරීමට', // from v2.1.10 added 3.25.2016
			'nowLoading'      : 'දැන් පූරණය වෙමින් පවතී...', // from v2.1.12 added 4.26.2016
			'openMulti'       : 'බහු ගොනු විවෘත කරන්න', // from v2.1.12 added 5.14.2016
			'openMultiConfirm': 'ඔබ $1 ගොනු විවෘත කිරීමට උත්සාහ කරයි. බ්‍රව්සරයෙන් ඔබට විවෘත කිරීමට අවශ්‍ය බව ඔබට විශ්වාසද?', // from v2.1.12 added 5.14.2016
			'emptySearch'     : 'සෙවුම් ඉලක්කයේ ගවේෂණ ප්‍රතිඵල නොමැත.', // from v2.1.12 added 5.16.2016
			'editingFile'     : 'එය ගොනුව සංස්කරණය කිරීමකි.', // from v2.1.13 added 6.3.2016
			'hasSelected'     : 'ඔබ අයිතම $1 ප්‍රමාණයක් තෝරාගෙන ඇත.', // from v2.1.13 added 6.3.2016
			'hasClipboard'    : 'ඔබට පසුරු පුවරුවේ අයිතම $1ක් ඇත.', // from v2.1.13 added 6.3.2016
			'incSearchOnly'   : 'වර්ධක සෙවීම වත්මන් දර්ශනයෙන් පමණි.', // from v2.1.13 added 6.30.2016
			'reinstate'       : 'යථා තත්ත්වයට පත් කරන්න', // from v2.1.15 added 3.8.2016
			'complete'        : '$1 සම්පූර්ණයි', // from v2.1.15 added 21.8.2016
			'contextmenu'     : 'සන්දර්භය මෙනුව', // from v2.1.15 added 9.9.2016
			'pageTurning'     : 'පිටුව හැරවීම', // from v2.1.15 added 10.9.2016
			'volumeRoots'     : 'පරිමාව මූලයන්', // from v2.1.16 added 16.9.2016
			'reset'           : 'යළි පිහිටුවන්න(Reset)', // from v2.1.16 added 1.10.2016
			'bgcolor'         : 'පසුබිම් වර්ණය', // from v2.1.16 added 1.10.2016
			'colorPicker'     : 'වර්ණ තෝරන්නා', // from v2.1.16 added 1.10.2016
			'8pxgrid'         : 'පික්සල් 8ක දැල', // from v2.1.16 added 4.10.2016
			'enabled'         : 'සක්‍රීයයි', // from v2.1.16 added 4.10.2016
			'disabled'        : 'අක්‍රීයයි', // from v2.1.16 added 4.10.2016
			'emptyIncSearch'  : 'වර්තමාන දර්ශනය තුළ සෙවුම් ප්‍රතිපල හිස්ව ඇත. \\A සෙවුම් ඉලක්කය පුළුල් කිරීම සඳහා [Enter] යතුර ඔබන්න.', // from v2.1.16 added 5.10.2016
			'emptyLetSearch'  : 'වර්තමාන දර්ශනයේ පළමු අකුර සෙවුම් ප්‍රතිපල හිස්ව පවතී.', // from v2.1.23 added 24.3.2017
			'textLabel'       : 'ලේබල්වල නම්', // from v2.1.17 added 13.10.2016
			'minsLeft'        : 'විනාඩි $1 ක් ගතවේ', // from v2.1.17 added 13.11.2016
			'openAsEncoding'  : 'තෝරාගත් කේතනය සමඟ නැවත විවෘත කරන්න', // from v2.1.19 added 2.12.2016
			'saveAsEncoding'  : 'තෝරාගත් කේතනය සමඟ සුරකින්න', // from v2.1.19 added 2.12.2016
			'selectFolder'    : 'ෆෝල්ඩරය තෝරන්න', // from v2.1.20 added 13.12.2016
			'firstLetterSearch': 'පළමු අකුරෙන් සෙවීම', // from v2.1.23 added 24.3.2017
			'presets'         : 'පෙරසිටුවීම්', // from v2.1.25 added 26.5.2017
			'tooManyToTrash'  : 'එය බොහෝ අයිතම නිසා එය කුණු කූඩයට දැමිය නොහැක.', // from v2.1.25 added 9.6.2017
			'TextArea'        : 'TextArea', // from v2.1.25 added 14.6.2017
			'folderToEmpty'   : '"$1" ෆෝල්ඩරය හිස් කරන්න.', // from v2.1.25 added 22.6.2017
			'filderIsEmpty'   : '"$1" ෆෝල්ඩරයක අයිතම නොමැත.', // from v2.1.25 added 22.6.2017
			'preference'      : 'මනාපය', // from v2.1.26 added 28.6.2017
			'language'        : 'භාෂා සැකසුම', // from v2.1.26 added 28.6.2017
			'clearBrowserData': 'මෙම බ්‍රවුසරයේ සුරකින ලද සැකසුම් ආරම්භ කරන්න', // from v2.1.26 added 28.6.2017
			'toolbarPref'     : 'මෙවලම් තීරු සැකසුම', // from v2.1.27 added 2.8.2017
			'charsLeft'       : '... $1 ක් අකුරු ඉතිරිව පවතී',  // from v2.1.29 added 30.8.2017
			'linesLeft'       : '... $1 පේළි ඉතිරියි.',  // from v2.1.52 added 16.1.2020
			'sum'             : 'එකතුව', // from v2.1.29 added 28.9.2017
			'roughFileSize'   : 'රළු ගොනු විශාලත්වය', // from v2.1.30 added 2.11.2017
			'autoFocusDialog' : 'මූසිකය සමඟ සංවාදයේ අංගය කෙරෙහි අවධානය යොමු කරන්න',  // from v2.1.30 added 2.11.2017
			'select'          : 'තෝරන්න', // from v2.1.30 added 23.11.2017
			'selectAction'    : 'ගොනුවක් තේරූ විට සිදුකල යුතු දේ', // from v2.1.30 added 23.11.2017
			'useStoredEditor' : 'අවසන් වරට භාවිතා කළ සංස්කාරකය සමඟ විවෘත කරන්න', // from v2.1.30 added 23.11.2017
			'selectinvert'    : 'ප්‍රතිවිරුද්ධ අාකාරයට තෝරන්න', // from v2.1.30 added 25.11.2017
			'renameMultiple'  : '$2 වැනි තෝරාගත් අයිතම $1 නැවත නම් කිරීමට ඔබට අවශ්‍ය බව ඔබට විශ්වාසද?<br/>මෙය පසුගමනය කළ නොහැක!', // from v2.1.31 added 4.12.2017
			'batchRename'     : 'කණ්ඩායම නැවත නම් කිරීම', // from v2.1.31 added 8.12.2017
			'plusNumber'      : '+ අංකය', // from v2.1.31 added 8.12.2017
			'asPrefix'        : 'උපසර්ගය එකතු කරන්න', // from v2.1.31 added 8.12.2017
			'asSuffix'        : 'උපසර්ගය එකතු කරන්න', // from v2.1.31 added 8.12.2017
			'changeExtention' : 'දිගුව වෙනස් කරන්න', // from v2.1.31 added 8.12.2017
			'columnPref'      : 'තීරු සැකසීම් (ලැයිස්තු දසුන)', // from v2.1.32 added 6.2.2018
			'reflectOnImmediate' : 'සියලුම වෙනස්කම් සංරක්ෂිතයට වහාම පිළිබිඹු වේ.', // from v2.1.33 added 2.3.2018
			'reflectOnUnmount'   : 'සියලුම වෙනස්කම් සංරක්ෂිතයට වහාම පිළිබිඹු වේ.', // from v2.1.33 added 2.3.2018
			'unmountChildren' : 'මෙම වෙළුමේ සවිකර ඇති පහත වෙළුම් (ය) ද ඉවත් කරන ලදී. ඔබට එය ඉවත් කිරීමට විශ්වාසද?', // from v2.1.33 added 5.3.2018
			'selectionInfo'   : 'තෝරාගැනීම්වල තොරතුරු', // from v2.1.33 added 7.3.2018
			'hashChecker'     : 'ගොනු හැෂ් පෙන්වීමට ඇල්ගොරිතම', // from v2.1.33 added 10.3.2018
			'infoItems'       : 'තොරතුරු අයිතම (තේරීම් තොරතුරු පැනලය)', // from v2.1.38 added 28.3.2018
			'pressAgainToExit': 'පිටවීමට නැවත ඔබන්න.', // from v2.1.38 added 1.4.2018
			'toolbar'         : 'මෙවලම් තීරුව', // from v2.1.38 added 4.4.2018
			'workspace'       : 'වැඩ අවකාශය', // from v2.1.38 added 4.4.2018
			'dialog'          : 'ඩයලොග්', // from v2.1.38 added 4.4.2018
			'all'             : 'සියලුම', // from v2.1.38 added 4.4.2018
			'iconSize'        : 'අයිකන ප්‍රමාණය (අයිකන දසුන)', // from v2.1.39 added 7.5.2018
			'editorMaximized' : 'උපරිම සංස්කාරක කවුළුව විවෘත කරන්න', // from v2.1.40 added 30.6.2018
			'editorConvNoApi' : 'API මගින් පරිවර්තනය දැනට නොමැති නිසා, කරුණාකර වෙබ් අඩවියට පරිවර්තනය කරන්න.', //from v2.1.40 added 8.7.2018
			'editorConvNeedUpload' : 'පරිවර්තනය කිරීමෙන් පසු, ඔබ පරිවර්තනය කළ ගොනුව සුරැකීමට අයිතම URL හෝ බාගත කළ ගොනුවක් සමඟ උඩුගත කළ යුතුය.', //from v2.1.40 added 8.7.2018
			'convertOn'       : '$1 හි අඩවියට පරිවර්තනය කරන්න', // from v2.1.40 added 10.7.2018
			'integrations'    : 'ඒකාබද්ධ කිරීම්', // from v2.1.40 added 11.7.2018
			'integrationWith' : 'මෙම elFinder පහත බාහිර සේවාවන් ඒකාබද්ධ කර ඇත. කරුණාකර එය භාවිතා කිරීමට පෙර භාවිත නියමයන්, රහස්‍යතා ප්‍රතිපත්තිය, ආදිය පරීක්ෂා කරන්න.', // from v2.1.40 added 11.7.2018
			'showHidden'      : 'සැඟවුණු අයිතම පෙන්වන්න', // from v2.1.41 added 24.7.2018
			'hideHidden'      : 'සැඟවුණු අයිතම සඟවන්න', // from v2.1.41 added 24.7.2018
			'toggleHidden'    : 'සැඟවුණු අයිතම පෙන්වන්න/සඟවන්න', // from v2.1.41 added 24.7.2018
			'makefileTypes'   : '"නව ගොනුව" සමඟ සබල කිරීමට ගොනු වර්ග', // from v2.1.41 added 7.8.2018
			'typeOfTextfile'  : 'පෙළ ගොනුවේ වර්ගය', // from v2.1.41 added 7.8.2018
			'add'             : 'එකතු කරන්න', // from v2.1.41 added 7.8.2018
			'theme'           : 'තේමාව', // from v2.1.43 added 19.10.2018
			'default'         : 'පෙරනිමිය', // from v2.1.43 added 19.10.2018
			'description'     : 'විස්තර', // from v2.1.43 added 19.10.2018
			'website'         : 'වෙබ් අඩවිය', // from v2.1.43 added 19.10.2018
			'author'          : 'කර්තෘ', // from v2.1.43 added 19.10.2018
			'email'           : 'විද්යුත් තැපෑල', // from v2.1.43 added 19.10.2018
			'license'         : 'බලපත්රය', // from v2.1.43 added 19.10.2018
			'exportToSave'    : 'මෙම අයිතමය සුරැකිය නොහැක. සංස්කරණ අහිමි වීම වළක්වා ගැනීම සඳහා ඔබ ඔබේ පරිගණකයට අපනයනය කළ යුතුය.', // from v2.1.44 added 1.12.2018
			'dblclickToSelect': 'ගොනුව තේරීමට එය මත දෙවරක් ක්ලික් කරන්න.', // from v2.1.47 added 22.1.2019
			'useFullscreen'   : 'සම්පූර්ණ තිර මාදිලිය භාවිතා කරන්න', // from v2.1.47 added 19.2.2019

			/********************************** mimetypes **********************************/
			'kindUnknown'     : 'නොදන්නා',
			'kindRoot'        : 'Volume Root', // from v2.1.16 added 16.10.2016
			'kindFolder'      : 'ෆෝල්ඩරය',
			'kindSelects'     : 'තේරීම්', // from v2.1.29 added 29.8.2017
			'kindAlias'       : 'අන්වර්ථ නාමය',
			'kindAliasBroken' : 'කැඩුණු අන්වර්ථය',
			// applications
			'kindApp'         : 'අයදුම්පත',
			'kindPostscript'  : 'Postscript ලේඛනය',
			'kindMsOffice'    : 'Microsoft Office ලේඛනය',
			'kindMsWord'      : 'Microsoft Word ලේඛනය',
			'kindMsExcel'     : 'Microsoft Excel ලේඛනය',
			'kindMsPP'        : 'Microsoft Powerpoint ඉදිරිපත් කිරීම',
			'kindOO'          : 'Open Office ලේඛනය',
			'kindAppFlash'    : 'ෆ්ලෑෂ් යෙදුම',
			'kindPDF'         : 'අතේ ගෙන යා හැකි ලේඛන ආකෘතිය (PDF)',
			'kindTorrent'     : 'Bittorrent ගොනුව',
			'kind7z'          : '7z සංරක්ෂිතය',
			'kindTAR'         : 'TAR ලේඛනාගාරය',
			'kindGZIP'        : 'GZIP ලේඛනාගාරය',
			'kindBZIP'        : 'BZIP ලේඛනාගාරය',
			'kindXZ'          : 'XZ ලේඛනාගාරය',
			'kindZIP'         : 'ZIP සංරක්ෂිතය',
			'kindRAR'         : 'RAR ලේඛනාගාරය',
			'kindJAR'         : 'ජාවා JAR ගොනුව',
			'kindTTF'         : 'සත්‍ය අකුරු වර්ගය',
			'kindOTF'         : 'අකුරු වර්ගය විවෘත කරන්න',
			'kindRPM'         : 'RPM පැකේජය',
			// texts
			'kindText'        : 'Text ලේඛනය',
			'kindTextPlain'   : 'සරල පෙළ',
			'kindPHP'         : 'PHP මූලාශ්‍රය',
			'kindCSS'         : 'කැස්කැඩින් ස්ටයිල් ෂීට්',
			'kindHTML'        : 'HTML ලේඛනය',
			'kindJS'          : 'Javascript මූලාශ්‍රය',
			'kindRTF'         : 'පොහොසත් පෙළ ආකෘතිය',
			'kindC'           : 'C මූලාශ්‍රය',
			'kindCHeader'     : 'C header මූලාශ්‍රය',
			'kindCPP'         : 'C++ මූලාශ්‍රය',
			'kindCPPHeader'   : 'C++ header මූලාශ්‍රය',
			'kindShell'       : 'Unix shell රචනයකි',
			'kindPython'      : 'Python මූලාශ්‍රය',
			'kindJava'        : 'Java මූලාශ්‍රය',
			'kindRuby'        : 'Ruby මූලාශ්‍රය',
			'kindPerl'        : 'Perl රචනයකි',
			'kindSQL'         : 'SQL මූලාශ්‍රය',
			'kindXML'         : 'XML ලේඛනය',
			'kindAWK'         : 'AWK මූලාශ්‍රය',
			'kindCSV'         : 'කොමාවන් වෙන් කළ අගයන්',
			'kindDOCBOOK'     : 'Docbook XML ලේඛනය',
			'kindMarkdown'    : 'සලකුණු පෙළ', // added 20.7.2015
			// images
			'kindImage'       : 'පින්තූරය',
			'kindBMP'         : 'BMP පින්තූරය',
			'kindJPEG'        : 'JPEG පින්තූරය',
			'kindGIF'         : 'GIF පින්තූරය',
			'kindPNG'         : 'PNG පින්තූරය',
			'kindTIFF'        : 'TIFF පින්තූරය',
			'kindTGA'         : 'TGA පින්තූරය',
			'kindPSD'         : 'Adobe Photoshop පින්තූරය',
			'kindXBITMAP'     : 'X bitmap පින්තූරය',
			'kindPXM'         : 'Pixelmator පින්තූරය',
			// media
			'kindAudio'       : 'ශබ්ධ මාධ්‍ය',
			'kindAudioMPEG'   : 'MPEG ශබ්ධපටය',
			'kindAudioMPEG4'  : 'MPEG-4 ශබ්ධපටය',
			'kindAudioMIDI'   : 'MIDI ශබ්ධපටය',
			'kindAudioOGG'    : 'Ogg Vorbis ශබ්ධපටය',
			'kindAudioWAV'    : 'WAV ශබ්ධපටය',
			'AudioPlaylist'   : 'MP3 ධාවන ලැයිස්තුව',
			'kindVideo'       : 'Video මාධ්‍ය',
			'kindVideoDV'     : 'DV චිත්‍රපටය',
			'kindVideoMPEG'   : 'MPEG චිත්‍රපටය',
			'kindVideoMPEG4'  : 'MPEG-4 චිත්‍රපටය',
			'kindVideoAVI'    : 'AVI චිත්‍රපටය',
			'kindVideoMOV'    : 'Quick Time චිත්‍රපටය',
			'kindVideoWM'     : 'Windows Media චිත්‍රපටය',
			'kindVideoFlash'  : 'Flash චිත්‍රපටය',
			'kindVideoMKV'    : 'Matroska චිත්‍රපටය',
			'kindVideoOGG'    : 'Ogg චිත්‍රපටය'
		}
	};
}));js/i18n/elfinder.es.js000064400000104714151215013370010500 0ustar00/**
 * Español internacional translation
 * @author Julián Torres <julian.torres@pabernosmatao.com>
 * @author Luis Faura <luis@luisfaura.es>
 * @author Adrià Vilanova <me@avm99963.tk>
 * @author Wilman Marín Duran <fuclo05@hotmail.com>
 * @version 2022-02-28
 */
 (function(root, factory) {
	if (typeof define === 'function' && define.amd) {
		define(['elfinder'], factory);
	} else if (typeof exports !== 'undefined') {
		module.exports = factory(require('elfinder'));
	} else {
		factory(root.elFinder);
	}
}(this, function(elFinder) {
	elFinder.prototype.i18.es = {
		translator : 'Julián Torres &lt;julian.torres@pabernosmatao.com&gt;, Luis Faura &lt;luis@luisfaura.es&gt;, Adrià Vilanova &lt;me@avm99963.tk&gt;, Wilman Marín Duran &lt;fuclo05@hotmail.com&gt;',
		language   : 'Español internacional',
		direction  : 'ltr',
		dateFormat : 'M d, Y h:i A', // will show like: Feb 28, 2022 03:38 PM
		fancyDateFormat : '$1 h:i A', // will show like: Hoy 03:38 PM
		nonameDateFormat : 'ymd-His', // noname upload will show like: 220228-153813
		messages   : {
			'getShareText' : 'Cuota',
			'Editor ': 'Editora de código',
			/********************************** errors **********************************/
			'error'                : 'Error',
			'errUnknown'           : 'Error desconocido.',
			'errUnknownCmd'        : 'Comando desconocido.',
			'errJqui'              : 'Configuración no válida de jQuery UI. Deben estar incluidos los componentes selectable, draggable y droppable.',
			'errNode'              : 'elFinder necesita crear elementos DOM.',
			'errURL'               : '¡Configuración no válida de elFinder! La opción URL no está configurada.',
			'errAccess'            : 'Acceso denegado.',
			'errConnect'           : 'No se ha podido conectar con el backend.',
			'errAbort'             : 'Conexión cancelada.',
			'errTimeout'           : 'Conexión cancelada por timeout.',
			'errNotFound'          : 'Backend no encontrado.',
			'errResponse'          : 'Respuesta no válida del backend.',
			'errConf'              : 'Configuración no válida del backend .',
			'errJSON'              : 'El módulo PHP JSON no está instalado.',
			'errNoVolumes'         : 'No hay disponibles volúmenes legibles.',
			'errCmdParams'         : 'Parámetros no válidos para el comando "$1".',
			'errDataNotJSON'       : 'los datos no están en formato JSON.',
			'errDataEmpty'         : 'No hay datos.',
			'errCmdReq'            : 'La petición del backend necesita un nombre de comando.',
			'errOpen'              : 'No se puede abrir "$1".',
			'errNotFolder'         : 'El objeto no es una carpeta.',
			'errNotFile'           : 'El objeto no es un archivo.',
			'errRead'              : 'No se puede leer "$1".',
			'errWrite'             : 'No se puede escribir en "$1".',
			'errPerm'              : 'Permiso denegado.',
			'errLocked'            : '"$1" está bloqueado y no puede ser renombrado, movido o borrado.',
			'errExists'            : 'Ya existe un archivo llamado "$1".',
			'errInvName'           : 'Nombre de archivo no válido.',
			'errInvDirname'        : 'Nombre de carpeta inválido.',  // from v2.1.24 added 12.4.2017
			'errFolderNotFound'    : 'Carpeta no encontrada.',
			'errFileNotFound'      : 'Archivo no encontrado.',
			'errTrgFolderNotFound' : 'Carpeta de destino "$1" no encontrada.',
			'errPopup'             : 'El navegador impide abrir nuevas ventanas. Puede activarlo en las opciones del navegador.',
			'errMkdir'             : 'No se puede crear la carpeta "$1".',
			'errMkfile'            : 'No se puede crear el archivo "$1".',
			'errRename'            : 'No se puede renombrar "$1".',
			'errCopyFrom'          : 'No se permite copiar archivos desde el volumen "$1".',
			'errCopyTo'            : 'No se permite copiar archivos al volumen "$1".',
			'errMkOutLink'         : 'No se ha podido crear el enlace fuera del volumen raíz.', // from v2.1 added 03.10.2015
			'errUpload'            : 'Error en el envío.',  // old name - errUploadCommon
			'errUploadFile'        : 'No se ha podido cargar "$1".', // old name - errUpload
			'errUploadNoFiles'     : 'No hay archivos para subir.',
			'errUploadTotalSize'   : 'El tamaño de los datos excede el máximo permitido.', // old name - errMaxSize
			'errUploadFileSize'    : 'El tamaño del archivo excede el máximo permitido.', //  old name - errFileMaxSize
			'errUploadMime'        : 'Tipo de archivo no permitido.',
			'errUploadTransfer'    : 'Error al transferir "$1".',
			'errUploadTemp'        : 'No se ha podido crear el archivo temporal para la subida.', // from v2.1 added 26.09.2015
			'errNotReplace'        : 'El objeto "$1" ya existe y no puede ser reemplazado por otro con otro tipo.', // new
			'errReplace'           : 'No se puede reemplazar "$1".',
			'errSave'              : 'No se puede guardar "$1".',
			'errCopy'              : 'No se puede copiar "$1".',
			'errMove'              : 'No se puede mover "$1".',
			'errCopyInItself'      : 'No se puede copiar "$1" en si mismo.',
			'errRm'                : 'No se puede borrar "$1".',
			'errTrash'             : 'No se puede enviar a la papelera.', // from v2.1.24 added 30.4.2017
			'errRmSrc'             : 'No se puede(n) borrar los archivo(s).',
			'errExtract'           : 'No se puede extraer archivos desde "$1".',
			'errArchive'           : 'No se puede crear el archivo.',
			'errArcType'           : 'Tipo de archivo no soportado.',
			'errNoArchive'         : 'El archivo no es de tipo archivo o es de un tipo no soportado.',
			'errCmdNoSupport'      : 'El backend no soporta este comando.',
			'errReplByChild'       : 'La carpeta “$1” no puede ser reemplazada por un elemento contenido en ella.',
			'errArcSymlinks'       : 'Por razones de seguridad no se pueden descomprimir archivos que contengan enlaces simbólicos.', // edited 24.06.2012
			'errArcMaxSize'        : 'El tamaño del archivo excede el máximo permitido.',
			'errResize'            : 'Error al redimensionar "$1".',
			'errResizeDegree'      : 'Grado de rotación inválido.',  // added 7.3.2013
			'errResizeRotate'      : 'Error al rotar la imagen.',  // added 7.3.2013
			'errResizeSize'        : 'Tamaño de imagen inválido.',  // added 7.3.2013
			'errResizeNoChange'    : 'No se puede cambiar el tamaño de la imagen.',  // added 7.3.2013
			'errUsupportType'      : 'Tipo de archivo no soportado.',
			'errNotUTF8Content'    : 'El archivo "$1" no está en formato UTF-8 y no puede ser editado.',  // added 9.11.2011
			'errNetMount'          : 'Fallo al montar "$1".', // added 17.04.2012
			'errNetMountNoDriver'  : 'Protocolo no soportado.',     // added 17.04.2012
			'errNetMountFailed'    : 'Fallo al montar.',         // added 17.04.2012
			'errNetMountHostReq'   : 'Dominio requerido.', // added 18.04.2012
			'errSessionExpires'    : 'La sesión ha expirado por inactividad',
			'errCreatingTempDir'   : 'No se ha podido crear al directorio temporal: "$1"',
			'errFtpDownloadFile'   : 'No se ha podido descargar el archivo desde FTP: "$1"',
			'errFtpUploadFile'     : 'No se ha podido cargar el archivo a FTP: "$1"',
			'errFtpMkdir'          : 'No se ha podido crear el directorio remoto en FTP: "$1"',
			'errArchiveExec'       : 'Se ha producido un error durante el archivo: "$1"',
			'errExtractExec'       : 'Se ha producido un error durante la extracción de archivos: "$1"',
			'errNetUnMount'        : 'Imposible montar', // from v2.1 added 30.04.2012
			'errConvUTF8'          : 'No es convertible a UTF-8', // from v2.1 added 08.04.2014
			'errFolderUpload'      : 'Prueba con un navegador moderno, si quieres subir la carpeta completa.', // from v2.1 added 26.6.2015
			'errSearchTimeout'     : 'Se agotó el tiempo de espera buscando "$1". Los resultados de búsqueda son parciales.', // from v2.1 added 12.1.2016
			'errReauthRequire'     : 'Se requiere autorizar de nuevo.', // from v2.1.10 added 24.3.2016
			'errMaxTargets'        : 'Número máximo de elementos seleccionables es $1.', // from v2.1.17 added 17.10.2016
			'errRestore'           : 'No se puede restaurar desde la papelera. No se puede identificar el destino de restauración.', // from v2.1.24 added 3.5.2017
			'errEditorNotFound'    : 'Editor no encontrado para este tipo de archivo.', // from v2.1.25 added 23.5.2017
			'errServerError'       : 'Error ocurrido en el lado del servidor.', // from v2.1.25 added 16.6.2017
			'errEmpty'             : 'No es posible vaciar la carpeta "$1".', // from v2.1.25 added 22.6.2017
			'moreErrors'           : 'Hay $1 más errores.', // from v2.1.44 added 9.12.2018
			'errMaxMkdirs'         : 'Puede crear carpetas de hasta $1 a la vez.', // from v2.1.58 added 20.6.2021

			/******************************* commands names ********************************/
			'cmdarchive'   : 'Crear archivo',
			'cmdback'      : 'Atrás',
			'cmdcopy'      : 'Copiar',
			'cmdcut'       : 'Cortar',
			'cmddownload'  : 'Descargar',
			'cmdduplicate' : 'Duplicar',
			'cmdedit'      : 'Editar archivo',
			'cmdextract'   : 'Extraer elementos del archivo',
			'cmdforward'   : 'Adelante',
			'cmdgetfile'   : 'Seleccionar archivos',
			'cmdhelp'      : 'Acerca de este software',
			'cmdhome'      : 'Inicio',
			'cmdinfo'      : 'Obtener información',
			'cmdmkdir'     : 'Nueva carpeta',
			'cmdmkdirin'   : 'En una nueva carpeta', // from v2.1.7 added 19.2.2016
			'cmdmkfile'    : 'Nueva archivo',
			'cmdopen'      : 'Abrir',
			'cmdpaste'     : 'Pegar',
			'cmdquicklook' : 'Previsualizar',
			'cmdreload'    : 'Recargar',
			'cmdrename'    : 'Cambiar nombre',
			'cmdrm'        : 'Eliminar',
			'cmdtrash'     : 'Enviar a la papelera', //from v2.1.24 added 29.4.2017
			'cmdrestore'   : 'Restaurar', //from v2.1.24 added 3.5.2017
			'cmdsearch'    : 'Buscar archivos',
			'cmdup'        : 'Ir a la carpeta raíz',
			'cmdupload'    : 'Subir archivos',
			'cmdview'      : 'Ver',
			'cmdresize'    : 'Redimensionar y rotar',
			'cmdsort'      : 'Ordenar',
			'cmdnetmount'  : 'Montar volumen en red', // added 18.04.2012
			'cmdnetunmount': 'Desmontar', // from v2.1 added 30.04.2012
			'cmdplaces'    : 'A Lugares', // added 28.12.2014
			'cmdchmod'     : 'Cambiar modo', // from v2.1 added 20.6.2015
			'cmdopendir'   : 'Abrir una carpeta', // from v2.1 added 13.1.2016
			'cmdcolwidth'  : 'Restablecer ancho de columna', // from v2.1.13 added 12.06.2016
			'cmdfullscreen': 'Pantalla completa', // from v2.1.15 added 03.08.2016
			'cmdmove'      : 'Mover', // from v2.1.15 added 21.08.2016
			'cmdempty'     : 'Vaciar la carpeta', // from v2.1.25 added 22.06.2017
			'cmdundo'      : 'Deshacer', // from v2.1.27 added 31.07.2017
			'cmdredo'      : 'Rehacer', // from v2.1.27 added 31.07.2017
			'cmdpreference': 'Preferencias', // from v2.1.27 added 03.08.2017
			'cmdselectall' : 'Seleccionar todo', // from v2.1.28 added 15.08.2017
			'cmdselectnone': 'Seleccionar ninguno', // from v2.1.28 added 15.08.2017
			'cmdselectinvert': 'Invertir selección', // from v2.1.28 added 15.08.2017
			'cmdopennew'   : 'Abrir en nueva ventana', // from v2.1.38 added 3.4.2018
			'cmdhide'      : 'Ocultar (Preferencia)', // from v2.1.41 added 24.7.2018

			/*********************************** buttons ***********************************/
			'btnClose'  : 'Cerrar',
			'btnSave'   : 'Guardar',
			'btnRm'     : 'Eliminar',
			'btnApply'  : 'Aplicar',
			'btnCancel' : 'Cancelar',
			'btnNo'     : 'No',
			'btnYes'    : 'Sí',
			'btnMount'  : 'Montar',  // added 18.04.2012
			'btnApprove': 'Ir a $1 y aprobar', // from v2.1 added 26.04.2012
			'btnUnmount': 'Desmontar', // from v2.1 added 30.04.2012
			'btnConv'   : 'Convertir', // from v2.1 added 08.04.2014
			'btnCwd'    : 'Aquí',      // from v2.1 added 22.5.2015
			'btnVolume' : 'Volumen',    // from v2.1 added 22.5.2015
			'btnAll'    : 'Todos',       // from v2.1 added 22.5.2015
			'btnMime'   : 'Tipo MIME', // from v2.1 added 22.5.2015
			'btnFileName':'Nombre de archivo',  // from v2.1 added 22.5.2015
			'btnSaveClose': 'Guardar y cerrar', // from v2.1 added 12.6.2015
			'btnBackup' : 'Copia de seguridad', // fromv2.1 added 28.11.2015
			'btnRename'    : 'Renombrar',      // from v2.1.24 added 6.4.2017
			'btnRenameAll' : 'Renombrar(Todo)', // from v2.1.24 added 6.4.2017
			'btnPrevious' : 'Ant ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnNext'     : 'Sig ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnSaveAs'   : 'Guardar como', // from v2.1.25 added 24.5.2017

			/******************************** notifications ********************************/
			'ntfopen'     : 'Abrir carpeta',
			'ntffile'     : 'Abrir archivo',
			'ntfreload'   : 'Actualizar contenido de la carpeta',
			'ntfmkdir'    : 'Creando directorio',
			'ntfmkfile'   : 'Creando archivos',
			'ntfrm'       : 'Eliminando archivos',
			'ntfcopy'     : 'Copiar archivos',
			'ntfmove'     : 'Mover archivos',
			'ntfprepare'  : 'Preparar copia de archivos',
			'ntfrename'   : 'Renombrar archivos',
			'ntfupload'   : 'Subiendo archivos',
			'ntfdownload' : 'Descargando archivos',
			'ntfsave'     : 'Guardar archivos',
			'ntfarchive'  : 'Creando archivo',
			'ntfextract'  : 'Extrayendo elementos del archivo',
			'ntfsearch'   : 'Buscando archivos',
			'ntfresize'   : 'Redimensionando imágenes',
			'ntfsmth'     : 'Haciendo algo',
			'ntfloadimg'  : 'Cargando imagen',
			'ntfnetmount' : 'Montando volumen en red', // added 18.04.2012
			'ntfnetunmount': 'Desmontando volumen en red', // from v2.1 added 30.04.2012
			'ntfdim'      : 'Adquiriendo tamaño de imagen', // added 20.05.2013
			'ntfreaddir'  : 'Leyendo información de la carpeta', // from v2.1 added 01.07.2013
			'ntfurl'      : 'Obteniendo URL del enlace', // from v2.1 added 11.03.2014
			'ntfchmod'    : 'Cambiando el modo de archivo', // from v2.1 added 20.6.2015
			'ntfpreupload': 'Verificando nombre del archivo subido', // from v2.1 added 31.11.2015
			'ntfzipdl'    : 'Creando un archivo para descargar', // from v2.1.7 added 23.1.2016
			'ntfparents'  : 'Obteniendo información de la ruta', // from v2.1.17 added 2.11.2016
			'ntfchunkmerge': 'Procesando el archivo cargado', // from v2.1.17 added 2.11.2016
			'ntftrash'    : 'Enviando a la papelera', // from v2.1.24 added 2.5.2017
			'ntfrestore'  : 'Restaurando desde la papelera', // from v2.1.24 added 3.5.2017
			'ntfchkdir'   : 'Comprobando carpeta de destino', // from v2.1.24 added 3.5.2017
			'ntfundo'     : 'Deshaciendo operación previa', // from v2.1.27 added 31.07.2017
			'ntfredo'     : 'Rehaciendo previo deshacer', // from v2.1.27 added 31.07.2017
			'ntfchkcontent' : 'Comprobación de contenidos', // from v2.1.41 added 3.8.2018

			/*********************************** volumes *********************************/
			'volume_Trash' : 'Papelera', //from v2.1.24 added 29.4.2017

			/************************************ dates **********************************/
			'dateUnknown' : 'desconocida',
			'Today'       : 'Hoy',
			'Yesterday'   : 'Ayer',
			'msJan'       : 'Ene',
			'msFeb'       : 'Feb',
			'msMar'       : 'mar',
			'msApr'       : 'Abr',
			'msMay'       : 'May',
			'msJun'       : 'jun',
			'msJul'       : 'Jul',
			'msAug'       : 'Ago',
			'msSep'       : 'sep',
			'msOct'       : 'Oct',
			'msNov'       : 'Nov',
			'msDec'       : 'Dic',
			'January'     : 'Enero',
			'February'    : 'Febrero',
			'March'       : 'Marzo',
			'April'       : 'Abril',
			'May'         : 'Mayo',
			'June'        : 'Junio',
			'July'        : 'Julio',
			'August'      : 'Agosto',
			'September'   : 'Septiembre',
			'October'     : 'Octubre',
			'November'    : 'Noviembre',
			'December'    : 'Diciembre',
			'Sunday'      : 'Domingo',
			'Monday'      : 'Lunes',
			'Tuesday'     : 'Martes',
			'Wednesday'   : 'Miércoles',
			'Thursday'    : 'Jueves',
			'Friday'      : 'Viernes',
			'Saturday'    : 'Sábado',
			'Sun'         : 'Dom',
			'Mon'         : 'Lun',
			'Tue'         : 'Mar',
			'Wed'         : 'Mie',
			'Thu'         : 'Jue',
			'Fri'         : 'Vie',
			'Sat'         : 'Sab',

			/******************************** sort variants ********************************/
			'sortname'          : 'por nombre',
			'sortkind'          : 'por tipo',
			'sortsize'          : 'por tamaño',
			'sortdate'          : 'por fecha',
			'sortFoldersFirst'  : 'Las carpetas primero',
			'sortperm'          : 'por permiso', // from v2.1.13 added 13.06.2016
			'sortmode'          : 'por modo',       // from v2.1.13 added 13.06.2016
			'sortowner'         : 'por propietario',      // from v2.1.13 added 13.06.2016
			'sortgroup'         : 'por grupo',      // from v2.1.13 added 13.06.2016
			'sortAlsoTreeview'  : 'También árbol de directorios',  // from v2.1.15 added 01.08.2016

			/********************************** new items **********************************/
			'untitled file.txt' : 'NuevoArchivo.txt', // added 10.11.2015
			'untitled folder'   : 'NuevaCarpeta',   // added 10.11.2015
			'Archive'           : 'NuevoArchivo',  // from v2.1 added 10.11.2015
			'untitled file'     : 'Archivo nuevo.$1',  // from v2.1.41 added 6.8.2018
			'extentionfile'     : '$1: Archivar',    // from v2.1.41 added 6.8.2018
			'extentiontype'     : '$1: $2',      // from v2.1.43 added 17.10.2018

			/********************************** messages **********************************/
			'confirmReq'      : 'Se necesita confirmación',
			'confirmRm'       : '¿Está seguro de querer eliminar archivos?<br/>¡Esto no se puede deshacer!',
			'confirmRepl'     : '¿Reemplazar el antiguo archivo con el nuevo?',
			'confirmRest'     : '¿Reemplazar elemento existente con el elemento en la papelera?', // fromv2.1.24 added 5.5.2017
			'confirmConvUTF8' : 'No está en UTF-8<br/>Convertir a UTF-8?<br/>Los contenidos se guardarán en UTF-8 tras la conversión.', // from v2.1 added 08.04.2014
			'confirmNonUTF8'  : 'Codificación de caracteres de este archivo no pudo ser detectada. Es necesario convertir temporalmente a UTF-8 para editarlo. <br/> Por favor, seleccione la codificación de caracteres de este archivo.', // from v2.1.19 added 28.11.2016
			'confirmNotSave'  : 'Ha sido modificado.<br/>Perderás los cambios si no los guardas.', // from v2.1 added 15.7.2015
			'confirmTrash'    : '¿Estás seguro que quieres mover los elementos a la papelera?', //from v2.1.24 added 29.4.2017
			'confirmMove'     : '¿Estás segura de que quieres mover elementos a "$1"?', //from v2.1.50 added 27.7.2019
			'apllyAll'        : 'Aplicar a todo',
			'name'            : 'Nombre',
			'size'            : 'Tamaño',
			'perms'           : 'Permisos',
			'modify'          : 'Modificado',
			'kind'            : 'Tipo',
			'read'            : 'lectura',
			'write'           : 'escritura',
			'noaccess'        : 'sin acceso',
			'and'             : 'y',
			'unknown'         : 'desconocido',
			'selectall'       : 'Seleccionar todos los archivos',
			'selectfiles'     : 'Seleccionar archivo(s)',
			'selectffile'     : 'Seleccionar primer archivo',
			'selectlfile'     : 'Seleccionar último archivo',
			'viewlist'        : 'ver como lista',
			'viewicons'       : 'Ver como iconos',
			'viewSmall'       : 'Iconos pequeños', // from v2.1.39 added 22.5.2018
			'viewMedium'      : 'Iconos medianos', // from v2.1.39 added 22.5.2018
			'viewLarge'       : 'Iconos grandes', // from v2.1.39 added 22.5.2018
			'viewExtraLarge'  : 'Iconos extra grandes', // from v2.1.39 added 22.5.2018
			'places'          : 'Lugares',
			'calc'            : 'Calcular',
			'path'            : 'Ruta',
			'aliasfor'        : 'Alias para',
			'locked'          : 'Bloqueado',
			'dim'             : 'Dimensiones',
			'files'           : 'Archivos',
			'folders'         : 'Carpetas',
			'items'           : 'Elementos',
			'yes'             : 'sí',
			'no'              : 'no',
			'link'            : 'Enlace',
			'searcresult'     : 'Resultados de la búsqueda',
			'selected'        : 'elementos seleccionados',
			'about'           : 'Acerca',
			'shortcuts'       : 'Accesos directos',
			'help'            : 'Ayuda',
			'webfm'           : 'Administrador de archivos web',
			'ver'             : 'Versión',
			'protocolver'     : 'versión del protocolo',
			'homepage'        : 'Inicio',
			'docs'            : 'Documentación',
			'github'          : 'Bifúrcanos en Github',
			'twitter'         : 'Síguenos en Twitter',
			'facebook'        : 'Únete a nosotros en Facebook',
			'team'            : 'Equipo',
			'chiefdev'        : 'desarrollador jefe',
			'developer'       : 'desarrollador',
			'contributor'     : 'contribuyente',
			'maintainer'      : 'mantenedor',
			'translator'      : 'traductor',
			'icons'           : 'Iconos',
			'dontforget'      : 'y no olvide traer su toalla',
			'shortcutsof'     : 'Accesos directos desactivados',
			'dropFiles'       : 'Arrastre archivos aquí',
			'or'              : 'o',
			'selectForUpload' : 'Seleccione archivos para subir',
			'moveFiles'       : 'Mover archivos',
			'copyFiles'       : 'Copiar archivos',
			'restoreFiles'    : 'Restaurar elementos', // from v2.1.24 added 5.5.2017
			'rmFromPlaces'    : 'Eliminar en sus ubicaciones',
			'aspectRatio'     : 'Relación de aspecto',
			'scale'           : 'Escala',
			'width'           : 'Ancho',
			'height'          : 'Alto',
			'resize'          : 'Redimensionar',
			'crop'            : 'Recortar',
			'rotate'          : 'Rotar',
			'rotate-cw'       : 'Rotar 90 grados en sentido horario',
			'rotate-ccw'      : 'Rotar 90 grados en sentido anti-horario',
			'degree'          : '°',
			'netMountDialogTitle' : 'Montar volumen en red', // added 18.04.2012
			'protocol'            : 'Protocolo', // added 18.04.2012
			'host'                : 'Dominio', // added 18.04.2012
			'port'                : 'Puerto', // added 18.04.2012
			'user'                : 'Usuario', // added 18.04.2012
			'pass'                : 'Contraseña', // added 18.04.2012
			'confirmUnmount'      : '¿Desmontar $1?',  // from v2.1 added 30.04.2012
			'dropFilesBrowser': 'Arrastra o pega archivos del navegador', // from v2.1 added 30.05.2012
			'dropPasteFiles'  : 'Arrastra o pega enlaces URL aquí', // from v2.1 added 07.04.2014
			'encoding'        : 'Codificando', // from v2.1 added 19.12.2014
			'locale'          : 'Local',   // from v2.1 added 19.12.2014
			'searchTarget'    : 'Destino: $1',                // from v2.1 added 22.5.2015
			'searchMime'      : 'Buscar entrada por tipo MIME', // from v2.1 added 22.5.2015
			'owner'           : 'Propietario', // from v2.1 added 20.6.2015
			'group'           : 'Grupo', // from v2.1 added 20.6.2015
			'other'           : 'Otro', // from v2.1 added 20.6.2015
			'execute'         : 'Ejecutar', // from v2.1 added 20.6.2015
			'perm'            : 'Permiso', // from v2.1 added 20.6.2015
			'mode'            : 'Modo', // from v2.1 added 20.6.2015
			'emptyFolder'     : 'La carpeta está vacía', // from v2.1.6 added 30.12.2015
			'emptyFolderDrop' : 'La carpeta está vacía\\A Arrastrar para añadir elementos', // from v2.1.6 added 30.12.2015
			'emptyFolderLTap' : 'La carpeta está vacía\\A Presiona durante un rato para añadir elementos', // from v2.1.6 added 30.12.2015
			'quality'         : 'Calidad', // from v2.1.6 added 5.1.2016
			'autoSync'        : 'Sincronización automática',  // from v2.1.6 added 10.1.2016
			'moveUp'          : 'Mover arriba',  // from v2.1.6 added 18.1.2016
			'getLink'         : 'Obtener enlace', // from v2.1.7 added 9.2.2016
			'selectedItems'   : 'Elementos seleccionados ($1)', // from v2.1.7 added 2.19.2016
			'folderId'        : 'ID carpeta', // from v2.1.10 added 3.25.2016
			'offlineAccess'   : 'Permitir acceso sin conexión', // from v2.1.10 added 3.25.2016
			'reAuth'          : 'Para volver a autenticarse', // from v2.1.10 added 3.25.2016
			'nowLoading'      : 'Cargando ahora...', // from v2.1.12 added 4.26.2016
			'openMulti'       : 'Abrir múltiples archivos', // from v2.1.12 added 5.14.2016
			'openMultiConfirm': 'Estás tratando de abrir los $1 archivos. ¿Estás seguro que quieres abrir en el navegador?', // from v2.1.12 added 5.14.2016
			'emptySearch'     : 'No se encontraron resultados en el objetivo de búsqueda.', // from v2.1.12 added 5.16.2016
			'editingFile'     : 'Está editando un archivo.', // from v2.1.13 added 6.3.2016
			'hasSelected'     : 'Has seleccionado $1 elementos.', // from v2.1.13 added 6.3.2016
			'hasClipboard'    : 'Posees $1 elementos en el portapapeles.', // from v2.1.13 added 6.3.2016
			'incSearchOnly'   : 'La búsqueda incremental solo se realiza desde la vista actual.', // from v2.1.13 added 6.30.2016
			'reinstate'       : 'Reinstanciar', // from v2.1.15 added 3.8.2016
			'complete'        : '$1 completo', // from v2.1.15 added 21.8.2016
			'contextmenu'     : 'Menú contextual', // from v2.1.15 added 9.9.2016
			'pageTurning'     : 'Cambio de página', // from v2.1.15 added 10.9.2016
			'volumeRoots'     : 'Raíces del volumen', // from v2.1.16 added 16.9.2016
			'reset'           : 'Reiniciar', // from v2.1.16 added 1.10.2016
			'bgcolor'         : 'Color de fondo', // from v2.1.16 added 1.10.2016
			'colorPicker'     : 'Selector de color', // from v2.1.16 added 1.10.2016
			'8pxgrid'         : '8px Cuadricula', // from v2.1.16 added 4.10.2016
			'enabled'         : 'Habilitado', // from v2.1.16 added 4.10.2016
			'disabled'        : 'Deshabilitado', // from v2.1.16 added 4.10.2016
			'emptyIncSearch'  : 'Los resultados de la búsqueda están vacíos en la vista actual. \\ APulse [Intro] para expandir el objetivo de búsqueda.', // from v2.1.16 added 5.10.2016
			'emptyLetSearch'  : 'La primera letra de los resultados de búsqueda está vacía en la vista actual.', // from v2.1.23 added 24.3.2017
			'textLabel'       : 'Etiqueta de texto', // from v2.1.17 added 13.10.2016
			'minsLeft'        : 'Falta $1 minuto(s)', // from v2.1.17 added 13.11.2016
			'openAsEncoding'  : 'Abrir nuevamente con la codificación seleccionada', // from v2.1.19 added 2.12.2016
			'saveAsEncoding'  : 'Guardar con la codificación seleccionada', // from v2.1.19 added 2.12.2016
			'selectFolder'    : 'Seleccionar carpeta', // from v2.1.20 added 13.12.2016
			'firstLetterSearch': 'Primera letra de búsqueda', // from v2.1.23 added 24.3.2017
			'presets'         : 'Preestablecidos', // from v2.1.25 added 26.5.2017
			'tooManyToTrash'  : 'Son demasiados elementos, por lo que no puede enviarse a la papelera.', // from v2.1.25 added 9.6.2017
			'TextArea'        : 'Área de texto', // from v2.1.25 added 14.6.2017
			'folderToEmpty'   : 'Vaciar la carpeta "$1".', // from v2.1.25 added 22.6.2017
			'filderIsEmpty'   : 'No hay elementos en la carpeta "$1".', // from v2.1.25 added 22.6.2017
			'preference'      : 'Preferencia', // from v2.1.26 added 28.6.2017
			'language'        : 'Lenguaje', // from v2.1.26 added 28.6.2017
			'clearBrowserData': 'Inicializa la configuración guardada en este navegador', // from v2.1.26 added 28.6.2017
			'toolbarPref'     : 'Configuración de la barra de herramientas', // from v2.1.27 added 2.8.2017
			'charsLeft'       : '...falta $1 caracteres.',  // from v2.1.29 added 30.8.2017
			'linesLeft'       : '... Quedan $1 líneas.',  // from v2.1.52 added 16.1.2020
			'sum'             : 'Suma', // from v2.1.29 added 28.9.2017
			'roughFileSize'   : 'Tamaño de archivo aproximado', // from v2.1.30 added 2.11.2017
			'autoFocusDialog' : 'Centrado en el elemento de diálogo con \'mouseover\'',  // from v2.1.30 added 2.11.2017
			'select'          : 'Seleccionar', // from v2.1.30 added 23.11.2017
			'selectAction'    : 'Acción cuando selecciona un archivo', // from v2.1.30 added 23.11.2017
			'useStoredEditor' : 'Abrir con el editor utilizado la última vez', // from v2.1.30 added 23.11.2017
			'selectinvert'    : 'Invertir selección', // from v2.1.30 added 25.11.2017
			'renameMultiple'  : '¿Estás seguro que quieres renombrar $1 elementos seleccionados como $2?<br/>¡Esto no puede ser deshecho!', // from v2.1.31 added 4.12.2017
			'batchRename'     : 'Cambiar el nombre del lote', // from v2.1.31 added 8.12.2017
			'plusNumber'      : '+ Número', // from v2.1.31 added 8.12.2017
			'asPrefix'        : 'Añadir prefijo', // from v2.1.31 added 8.12.2017
			'asSuffix'        : 'Añadir sufijo', // from v2.1.31 added 8.12.2017
			'changeExtention' : 'Cambiar extensión', // from v2.1.31 added 8.12.2017
			'columnPref'      : 'Configuración de columnas (Vista de lista)', // from v2.1.32 added 6.2.2018
			'reflectOnImmediate' : 'Todos los cambios se reflejarán inmediatamente en el archivo.', // from v2.1.33 added 2.3.2018
			'reflectOnUnmount'   : 'Cualquier cambio no se reflejará hasta que no se desmonte este volumen.', // from v2.1.33 added 2.3.2018
			'unmountChildren' : 'Los siguientes volúmenes montados en este volumen también se desmontaron. ¿Estás seguro de desmontarlo?', // from v2.1.33 added 5.3.2018
			'selectionInfo'   : 'Información de la selección', // from v2.1.33 added 7.3.2018
			'hashChecker'     : 'Algoritmos para mostrar el hash de archivos', // from v2.1.33 added 10.3.2018
			'infoItems'       : 'Elementos de información (Panel de información de selección)', // from v2.1.38 added 28.3.2018
			'pressAgainToExit': 'Presiona de nuevo para salir.', // from v2.1.38 added 1.4.2018
			'toolbar'         : 'Barra de herramienta', // from v2.1.38 added 4.4.2018
			'workspace'       : 'Espacio de trabajo', // from v2.1.38 added 4.4.2018
			'dialog'          : 'Diálogo', // from v2.1.38 added 4.4.2018
			'all'             : 'Todo', // from v2.1.38 added 4.4.2018
			'iconSize'        : 'Tamaño de icono (vista de iconos)', // from v2.1.39 added 7.5.2018
			'editorMaximized' : 'Abra la ventana del editor maximizado', // from v2.1.40 added 30.6.2018
			'editorConvNoApi' : 'Debido a que la conversión por API no está disponible actualmente, realice la conversión en el sitio web.', //from v2.1.40 added 8.7.2018
			'editorConvNeedUpload' : 'Después de la conversión, debe cargar la URL del elemento o un archivo descargado para guardar el archivo convertido.', //from v2.1.40 added 8.7.2018
			'convertOn'       : 'Convertir en el sitio de $1', // from v2.1.40 added 10.7.2018
			'integrations'    : 'integraciones', // from v2.1.40 added 11.7.2018
			'integrationWith' : 'Este elFinder tiene integrados los siguientes servicios externos. Consulte los términos de uso, la política de privacidad, etc. antes de usarlo.', // from v2.1.40 added 11.7.2018
			'showHidden'      : 'Mostrar elementos ocultos', // from v2.1.41 added 24.7.2018
			'hideHidden'      : 'Ocultar elementos ocultos', // from v2.1.41 added 24.7.2018
			'toggleHidden'    : 'Mostrar/Ocultar elementos ocultos', // from v2.1.41 added 24.7.2018
			'makefileTypes'   : 'Tipos de archivos para habilitar con "Nuevo archivo"', // from v2.1.41 added 7.8.2018
			'typeOfTextfile'  : 'Tipo de archivo de texto', // from v2.1.41 added 7.8.2018
			'add'             : 'Agregar', // from v2.1.41 added 7.8.2018
			'theme'           : 'Tema', // from v2.1.43 added 19.10.2018
			'default'         : 'Por defecto', // from v2.1.43 added 19.10.2018
			'description'     : 'Descripción', // from v2.1.43 added 19.10.2018
			'website'         : 'Sitio web', // from v2.1.43 added 19.10.2018
			'author'          : 'Autora', // from v2.1.43 added 19.10.2018
			'email'           : 'Correo electrónico', // from v2.1.43 added 19.10.2018
			'license'         : 'Licencia', // from v2.1.43 added 19.10.2018
			'exportToSave'    : 'Este elemento no se puede guardar. Para evitar perder las ediciones, debe exportarlas a su PC.', // from v2.1.44 added 1.12.2018
			'dblclickToSelect': 'Haga doble clic en el archivo para seleccionarlo.', // from v2.1.47 added 22.1.2019
			'useFullscreen'   : 'Usar el modo de pantalla completa', // from v2.1.47 added 19.2.2019

			/********************************** mimetypes **********************************/
			'kindUnknown'     : 'Desconocido',
			'kindRoot'        : 'Raíces del volumen', // from v2.1.16 added 16.10.2016
			'kindFolder'      : 'Carpeta',
			'kindSelects'     : 'Selecciones', // from v2.1.29 added 29.8.2017
			'kindAlias'       : 'Alias',
			'kindAliasBroken' : 'Alias roto',
			// applications
			'kindApp'         : 'Aplicación',
			'kindPostscript'  : 'Documento Postscript',
			'kindMsOffice'    : 'Documento Microsoft Office',
			'kindMsWord'      : 'Documento Microsoft Word',
			'kindMsExcel'     : 'Documento Microsoft Excel',
			'kindMsPP'        : 'Presentación Microsoft Powerpoint',
			'kindOO'          : 'Documento Open Office',
			'kindAppFlash'    : 'Aplicación Flash',
			'kindPDF'         : 'Documento PDF',
			'kindTorrent'     : 'Archivo Bittorrent',
			'kind7z'          : 'Archivo 7z',
			'kindTAR'         : 'Archivo TAR',
			'kindGZIP'        : 'Archivo GZIP',
			'kindBZIP'        : 'Archivo BZIP',
			'kindXZ'          : 'Archivo XZ',
			'kindZIP'         : 'Archivo ZIP',
			'kindRAR'         : 'Archivo RAR',
			'kindJAR'         : 'Archivo Java JAR',
			'kindTTF'         : 'Fuente True Type',
			'kindOTF'         : 'Fuente Open Type',
			'kindRPM'         : 'Paquete RPM',
			// texts
			'kindText'        : 'Documento de texto',
			'kindTextPlain'   : 'Texto plano',
			'kindPHP'         : 'Código PHP',
			'kindCSS'         : 'Hoja de estilos CSS',
			'kindHTML'        : 'Documento HTML',
			'kindJS'          : 'Código Javascript',
			'kindRTF'         : 'Documento RTF',
			'kindC'           : 'Código C',
			'kindCHeader'     : 'Código C cabeceras',
			'kindCPP'         : 'Código C++',
			'kindCPPHeader'   : 'Código C++ cabeceras',
			'kindShell'       : 'Script de terminal de Unix',
			'kindPython'      : 'Código Python',
			'kindJava'        : 'Código Java',
			'kindRuby'        : 'Código Ruby',
			'kindPerl'        : 'Código Perl',
			'kindSQL'         : 'Código QL',
			'kindXML'         : 'Documento XML',
			'kindAWK'         : 'Código AWK',
			'kindCSV'         : 'Documento CSV (valores separados por comas)',
			'kindDOCBOOK'     : 'Documento Docbook XML',
			'kindMarkdown'    : 'Texto Markdown', // added 20.7.2015
			// images
			'kindImage'       : 'Imagen',
			'kindBMP'         : 'Imagen BMP',
			'kindJPEG'        : 'Imagen JPEG',
			'kindGIF'         : 'Imagen GIF',
			'kindPNG'         : 'Imagen PNG',
			'kindTIFF'        : 'Imagen TIFF',
			'kindTGA'         : 'Imagen TGA',
			'kindPSD'         : 'Imagen Adobe Photoshop',
			'kindXBITMAP'     : 'Imagen X bitmap',
			'kindPXM'         : 'Imagen Pixelmator',
			// media
			'kindAudio'       : 'Archivo de audio',
			'kindAudioMPEG'   : 'Audio MPEG',
			'kindAudioMPEG4'  : 'Audio MPEG-4',
			'kindAudioMIDI'   : 'Audio MIDI',
			'kindAudioOGG'    : 'Audio Ogg Vorbis',
			'kindAudioWAV'    : 'Audio WAV',
			'AudioPlaylist'   : 'Lista de reproducción MP3',
			'kindVideo'       : 'Archivo de vídeo',
			'kindVideoDV'     : 'Película DV',
			'kindVideoMPEG'   : 'Película MPEG',
			'kindVideoMPEG4'  : 'Película MPEG-4',
			'kindVideoAVI'    : 'Película AVI',
			'kindVideoMOV'    : 'Película Quick Time',
			'kindVideoWM'     : 'Película Windows Media',
			'kindVideoFlash'  : 'Película Flash',
			'kindVideoMKV'    : 'Película Matroska MKV',
			'kindVideoOGG'    : 'Película Ogg'
		}
	};
}));js/i18n/elfinder.fr.js000064400000106222151215013370010474 0ustar00/**
 * française translation
 * @author Régis Guyomarch <regisg@gmail.com>
 * @author Benoit Delachaux <benorde33@gmail.com>
 * @author Jonathan Grunder <jonathan.grunder@gmail.com>
 * @version 2022-03-01
 */
 (function(root, factory) {
	if (typeof define === 'function' && define.amd) {
		define(['elfinder'], factory);
	} else if (typeof exports !== 'undefined') {
		module.exports = factory(require('elfinder'));
	} else {
		factory(root.elFinder);
	}
}(this, function(elFinder) {
	elFinder.prototype.i18.fr = {
		translator : 'Régis Guyomarch &lt;regisg@gmail.com&gt;, Benoit Delachaux &lt;benorde33@gmail.com&gt;, Jonathan Grunder &lt;jonathan.grunder@gmail.com&gt;',
		language   : 'française',
		direction  : 'ltr',
		dateFormat : 'd/M/Y H:i', // will show like: 01/Mar/2022 12:27
		fancyDateFormat : '$1 H:i', // will show like: Aujourd'hui 12:27
		nonameDateFormat : 'ymd-His', // noname upload will show like: 220301-122726
		messages   : {
			'getShareText' : 'Partagez',
			'Editor ': 'Editeur de codes',
			/********************************** errors **********************************/
			'error'                : 'Erreur',
			'errUnknown'           : 'Erreur inconnue.',
			'errUnknownCmd'        : 'Commande inconnue.',
			'errJqui'              : 'Mauvaise configuration de jQuery UI. Les composants Selectable, draggable et droppable doivent être inclus.',
			'errNode'              : 'elFinder requiert que l\'élément DOM ait été créé.',
			'errURL'               : 'Mauvaise configuration d\'elFinder ! L\'option URL n\'a pas été définie.',
			'errAccess'            : 'Accès refusé.',
			'errConnect'           : 'Impossible de se connecter au backend.',
			'errAbort'             : 'Connexion interrompue.',
			'errTimeout'           : 'Délai de connexion dépassé.',
			'errNotFound'          : 'Backend non trouvé.',
			'errResponse'          : 'Mauvaise réponse du backend.',
			'errConf'              : 'Mauvaise configuration du backend.',
			'errJSON'              : 'Le module PHP JSON n\'est pas installé.',
			'errNoVolumes'         : 'Aucun volume lisible.',
			'errCmdParams'         : 'Mauvais paramétrage de la commande "$1".',
			'errDataNotJSON'       : 'Les données ne sont pas au format JSON.',
			'errDataEmpty'         : 'Données inexistantes.',
			'errCmdReq'            : 'La requête au Backend doit comporter le nom de la commande.',
			'errOpen'              : 'Impossible d\'ouvrir "$1".',
			'errNotFolder'         : 'Cet objet n\'est pas un dossier.',
			'errNotFile'           : 'Cet objet n\'est pas un fichier.',
			'errRead'              : 'Impossible de lire "$1".',
			'errWrite'             : 'Impossible d\'écrire dans "$1".',
			'errPerm'              : 'Permission refusée.',
			'errLocked'            : '"$1" est verrouillé et ne peut être déplacé ou supprimé.',
			'errExists'            : 'Un élément nommé "$1" existe déjà.',
			'errInvName'           : 'Nom de fichier incorrect.',
			'errInvDirname'        : 'Nom de dossier incorrect.',  // from v2.1.24 added 12.4.2017
			'errFolderNotFound'    : 'Dossier non trouvé.',
			'errFileNotFound'      : 'Fichier non trouvé.',
			'errTrgFolderNotFound' : 'Dossier destination "$1" non trouvé.',
			'errPopup'             : 'Le navigateur web a empêché l\'ouverture d\'une fenêtre "popup". Pour ouvrir le fichier, modifiez les options du navigateur web.',
			'errMkdir'             : 'Impossible de créer le dossier "$1".',
			'errMkfile'            : 'Impossible de créer le fichier "$1".',
			'errRename'            : 'Impossible de renommer "$1".',
			'errCopyFrom'          : 'Interdiction de copier des fichiers depuis le volume "$1".',
			'errCopyTo'            : 'Interdiction de copier des fichiers vers le volume "$1".',
			'errMkOutLink'         : 'Impossible de créer un lien en dehors du volume principal.', // from v2.1 added 03.10.2015
			'errUpload'            : 'Erreur lors de l\'envoi du fichier.',  // old name - errUploadCommon
			'errUploadFile'        : 'Impossible d\'envoyer "$1".', // old name - errUpload
			'errUploadNoFiles'     : 'Aucun fichier à envoyer.',
			'errUploadTotalSize'   : 'Les données dépassent la taille maximale allouée.', // old name - errMaxSize
			'errUploadFileSize'    : 'Le fichier dépasse la taille maximale allouée.', //  old name - errFileMaxSize
			'errUploadMime'        : 'Type de fichier non autorisé.',
			'errUploadTransfer'    : '"$1" erreur transfert.',
			'errUploadTemp'        : 'Impossible de créer un fichier temporaire pour transférer les fichiers.', // from v2.1 added 26.09.2015
			'errNotReplace'        : 'L\'objet "$1" existe déjà à cet endroit et ne peut être remplacé par un objet d\'un type différent.', // new
			'errReplace'           : 'Impossible de remplacer "$1".',
			'errSave'              : 'Impossible de sauvegarder "$1".',
			'errCopy'              : 'Impossible de copier "$1".',
			'errMove'              : 'Impossible de déplacer "$1".',
			'errCopyInItself'      : 'Impossible de copier "$1" sur lui-même.',
			'errRm'                : 'Impossible de supprimer "$1".',
			'errTrash'             : 'Impossible de déplacer dans la corbeille', // from v2.1.24 added 30.4.2017
			'errRmSrc'             : 'Impossible de supprimer le(s) fichier(s) source(s).',
			'errExtract'           : 'Imbossible d\'extraire les fichiers à partir de "$1".',
			'errArchive'           : 'Impossible de créer l\'archive.',
			'errArcType'           : 'Type d\'archive non supporté.',
			'errNoArchive'         : 'Le fichier n\'est pas une archive, ou c\'est un type d\'archive non supporté.',
			'errCmdNoSupport'      : 'Le Backend ne prend pas en charge cette commande.',
			'errReplByChild'       : 'Le dossier “$1” ne peut pas être remplacé par un élément qu\'il contient.',
			'errArcSymlinks'       : 'Par mesure de sécurité, il est défendu d\'extraire une archive contenant des liens symboliques ou des noms de fichier non autorisés.', // edited 24.06.2012
			'errArcMaxSize'        : 'Les fichiers de l\'archive excèdent la taille maximale autorisée.',
			'errResize'            : 'Impossible de redimensionner "$1".',
			'errResizeDegree'      : 'Degré de rotation invalide.',  // added 7.3.2013
			'errResizeRotate'      : 'L\'image ne peut pas être tournée.',  // added 7.3.2013
			'errResizeSize'        : 'Dimension de l\'image non-valide.',  // added 7.3.2013
			'errResizeNoChange'    : 'L\'image n\'est pas redimensionnable.',  // added 7.3.2013
			'errUsupportType'      : 'Type de fichier non supporté.',
			'errNotUTF8Content'    : 'Le fichier "$1" n\'est pas en UTF-8, il ne peut être édité.',  // added 9.11.2011
			'errNetMount'          : 'Impossible de monter "$1".', // added 17.04.2012
			'errNetMountNoDriver'  : 'Protocole non supporté.',     // added 17.04.2012
			'errNetMountFailed'    : 'Echec du montage.',         // added 17.04.2012
			'errNetMountHostReq'   : 'Hôte requis.', // added 18.04.2012
			'errSessionExpires'    : 'Votre session a expiré en raison de son inactivité.',
			'errCreatingTempDir'   : 'Impossible de créer le répertoire temporaire : "$1"',
			'errFtpDownloadFile'   : 'Impossible de télécharger le file depuis l\'accès FTP : "$1"',
			'errFtpUploadFile'     : 'Impossible d\'envoyer le fichier vers l\'accès FTP : "$1"',
			'errFtpMkdir'          : 'Impossible de créer un répertoire distant sur l\'accès FTP :"$1"',
			'errArchiveExec'       : 'Erreur lors de l\'archivage des fichiers : "$1"',
			'errExtractExec'       : 'Erreur lors de l\'extraction des fichiers : "$1"',
			'errNetUnMount'        : 'Impossible de démonter.', // from v2.1 added 30.04.2012
			'errConvUTF8'          : 'Conversion en UTF-8 impossible', // from v2.1 added 08.04.2014
			'errFolderUpload'      : 'Essayez Google Chrome, si voulez envoyer le dossier.', // from v2.1 added 26.6.2015
			'errSearchTimeout'     : 'Délai d’attente dépassé pour la recherche "$1". Le résultat de la recherche est partiel.', // from v2.1 added 12.1.2016
			'errReauthRequire'     : 'Réauthorisation requise.', // from v2.1.10 added 24.3.2016
			'errMaxTargets'        : 'Le nombre maximal d\'éléments pouvant être sélectionnés est $1.', // from v2.1.17 added 17.10.2016
			'errRestore'           : 'Impossible de restaurer la corbeille. La destination de la restauration n\'a pu être identifiée.', // from v2.1.24 added 3.5.2017
			'errEditorNotFound'    : 'Aucun éditeur n\'a été trouvé pour ce type de fichier.', // from v2.1.25 added 23.5.2017
			'errServerError'       : 'Une erreur est survenue du côté serveur.', // from v2.1.25 added 16.6.2017
			'errEmpty'             : 'Impossible de vider le dossier "$1".', // from v2.1.25 added 22.6.2017
			'moreErrors'           : 'Il y a $1 d\'erreurs supplémentaires.', // from v2.1.44 added 9.12.2018
			'errMaxMkdirs'         : 'Vous pouvez créer jusqu\'à $1 dossiers à la fois.', // from v2.1.58 added 20.6.2021

			/******************************* commands names ********************************/
			'cmdarchive'   : 'Créer une archive',
			'cmdback'      : 'Précédent',
			'cmdcopy'      : 'Copier',
			'cmdcut'       : 'Couper',
			'cmddownload'  : 'Télécharger',
			'cmdduplicate' : 'Dupliquer',
			'cmdedit'      : 'Éditer le fichier',
			'cmdextract'   : 'Extraire les fichiers de l\'archive',
			'cmdforward'   : 'Suivant',
			'cmdgetfile'   : 'Sélectionner les fichiers',
			'cmdhelp'      : 'À propos de ce logiciel',
			'cmdhome'      : 'Accueil',
			'cmdinfo'      : 'Informations',
			'cmdmkdir'     : 'Nouveau dossier',
			'cmdmkdirin'   : 'Dans un nouveau dossier', // from v2.1.7 added 19.2.2016
			'cmdmkfile'    : 'Nouveau fichier',
			'cmdopen'      : 'Ouvrir',
			'cmdpaste'     : 'Coller',
			'cmdquicklook' : 'Prévisualiser',
			'cmdreload'    : 'Actualiser',
			'cmdrename'    : 'Renommer',
			'cmdrm'        : 'Supprimer',
			'cmdtrash'     : 'À la corbeille', //from v2.1.24 added 29.4.2017
			'cmdrestore'   : 'Restaurer', //from v2.1.24 added 3.5.2017
			'cmdsearch'    : 'Trouver les fichiers',
			'cmdup'        : 'Remonter au dossier parent',
			'cmdupload'    : 'Envoyer les fichiers',
			'cmdview'      : 'Vue',
			'cmdresize'    : 'Redimensionner l\'image',
			'cmdsort'      : 'Trier',
			'cmdnetmount'  : 'Monter un volume réseau', // added 18.04.2012
			'cmdnetunmount': 'Démonter', // from v2.1 added 30.04.2012
			'cmdplaces'    : 'Vers Favoris', // added 28.12.2014
			'cmdchmod'     : 'Changer de mode', // from v2.1 added 20.6.2015
			'cmdopendir'   : 'Ouvrir un dossier', // from v2.1 added 13.1.2016
			'cmdcolwidth'  : 'Réinitialiser largeur colone', // from v2.1.13 added 12.06.2016
			'cmdfullscreen': 'Plein écran', // from v2.1.15 added 03.08.2016
			'cmdmove'      : 'Déplacer', // from v2.1.15 added 21.08.2016
			'cmdempty'     : 'Vider le dossier', // from v2.1.25 added 22.06.2017
			'cmdundo'      : 'Annuler', // from v2.1.27 added 31.07.2017
			'cmdredo'      : 'Refaire', // from v2.1.27 added 31.07.2017
			'cmdpreference': 'Préférences', // from v2.1.27 added 03.08.2017
			'cmdselectall' : 'Tout sélectionner', // from v2.1.28 added 15.08.2017
			'cmdselectnone': 'Tout désélectionner', // from v2.1.28 added 15.08.2017
			'cmdselectinvert': 'Inverser la sélection', // from v2.1.28 added 15.08.2017
			'cmdopennew'   : 'Ouvrir dans une nouvelle fenêtre', // from v2.1.38 added 3.4.2018
			'cmdhide'      : 'Masquer (Préférence)', // from v2.1.41 added 24.7.2018

			/*********************************** buttons ***********************************/
			'btnClose'  : 'Fermer',
			'btnSave'   : 'Sauvegarder',
			'btnRm'     : 'Supprimer',
			'btnApply'  : 'Confirmer',
			'btnCancel' : 'Annuler',
			'btnNo'     : 'Non',
			'btnYes'    : 'Oui',
			'btnMount'  : 'Monter',  // added 18.04.2012
			'btnApprove': 'Aller à $1 & approuver', // from v2.1 added 26.04.2012
			'btnUnmount': 'Démonter', // from v2.1 added 30.04.2012
			'btnConv'   : 'Convertir', // from v2.1 added 08.04.2014
			'btnCwd'    : 'Ici',      // from v2.1 added 22.5.2015
			'btnVolume' : 'Le volume',    // from v2.1 added 22.5.2015
			'btnAll'    : 'Tous',       // from v2.1 added 22.5.2015
			'btnMime'   : 'Type MIME', // from v2.1 added 22.5.2015
			'btnFileName':'Nom du fichier',  // from v2.1 added 22.5.2015
			'btnSaveClose': 'Enregistrer & Ferme', // from v2.1 added 12.6.2015
			'btnBackup' : 'Sauvegarde', // fromv2.1 added 28.11.2015
			'btnRename'    : 'Renommer',      // from v2.1.24 added 6.4.2017
			'btnRenameAll' : 'Renommer (tous)', // from v2.1.24 added 6.4.2017
			'btnPrevious' : 'Préc. ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnNext'     : 'Suiv. ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnSaveAs'   : 'Sauvegarder sous', // from v2.1.25 added 24.5.2017

			/******************************** notifications ********************************/
			'ntfopen'     : 'Ouvrir le dossier',
			'ntffile'     : 'Ouvrir le fichier',
			'ntfreload'   : 'Actualiser le contenu du dossier',
			'ntfmkdir'    : 'Création du dossier',
			'ntfmkfile'   : 'Création des fichiers',
			'ntfrm'       : 'Supprimer les éléments',
			'ntfcopy'     : 'Copier les éléments',
			'ntfmove'     : 'Déplacer les éléments',
			'ntfprepare'  : 'Préparation de la copie des éléments',
			'ntfrename'   : 'Renommer les fichiers',
			'ntfupload'   : 'Envoi des fichiers',
			'ntfdownload' : 'Téléchargement des fichiers',
			'ntfsave'     : 'Sauvegarder les fichiers',
			'ntfarchive'  : 'Création de l\'archive',
			'ntfextract'  : 'Extraction des fichiers de l\'archive',
			'ntfsearch'   : 'Recherche des fichiers',
			'ntfresize'   : 'Redimensionner les images',
			'ntfsmth'     : 'Fait quelque chose',
			'ntfloadimg'  : 'Chargement de l\'image',
			'ntfnetmount' : 'Monte le volume réseau', // added 18.04.2012
			'ntfnetunmount': 'Démonte le volume réseau', // from v2.1 added 30.04.2012
			'ntfdim'      : 'Calcule la dimension de l\'image', // added 20.05.2013
			'ntfreaddir'  : 'Lecture des informations du dossier', // from v2.1 added 01.07.2013
			'ntfurl'      : 'Récupération de l’URL du lien', // from v2.1 added 11.03.2014
			'ntfchmod'    : 'Changement de mode', // from v2.1 added 20.6.2015
			'ntfpreupload': 'Vérification du nom du fichier envoyé', // from v2.1 added 31.11.2015
			'ntfzipdl'    : 'Création d’un fichier pour le téléchargement', // from v2.1.7 added 23.1.2016
			'ntfparents'  : 'Traitement de l\'information du chemin', // from v2.1.17 added 2.11.2016
			'ntfchunkmerge': 'Traitement du fichier envoyé', // from v2.1.17 added 2.11.2016
			'ntftrash'    : 'Mettre à la corbeille', // from v2.1.24 added 2.5.2017
			'ntfrestore'  : 'Restaurer depuis la corbeille', // from v2.1.24 added 3.5.2017
			'ntfchkdir'   : 'Validation du dossier de destination', // from v2.1.24 added 3.5.2017
			'ntfundo'     : 'Annuler l\'opération précédente', // from v2.1.27 added 31.07.2017
			'ntfredo'     : 'Refaire l\'opération annulée', // from v2.1.27 added 31.07.2017
			'ntfchkcontent' : 'Vérification du contenu', // from v2.1.41 added 3.8.2018

			/*********************************** volumes *********************************/
			'volume_Trash' : 'Corbeille', //from v2.1.24 added 29.4.2017

			/************************************ dates **********************************/
			'dateUnknown' : 'Inconnue',
			'Today'       : 'Aujourd\'hui',
			'Yesterday'   : 'Hier',
			'msJan'       : 'Jan',
			'msFeb'       : 'Fév',
			'msMar'       : 'Mar',
			'msApr'       : 'Avr',
			'msMay'       : 'Mai',
			'msJun'       : 'Jun',
			'msJul'       : 'Jul',
			'msAug'       : 'Aoû',
			'msSep'       : 'Sep',
			'msOct'       : 'Oct',
			'msNov'       : 'Nov',
			'msDec'       : 'Déc',
			'January'     : 'Janvier',
			'February'    : 'Février',
			'March'       : 'Mars',
			'April'       : 'Avril',
			'May'         : 'Mai',
			'June'        : 'Juin',
			'July'        : 'Huillet',
			'August'      : 'Août',
			'September'   : 'Septembre',
			'October'     : 'Octobre',
			'November'    : 'Novembre',
			'December'    : 'Décembre',
			'Sunday'      : 'Dimanche',
			'Monday'      : 'Lundi',
			'Tuesday'     : 'Mardi',
			'Wednesday'   : 'Mercredi',
			'Thursday'    : 'Jeudi',
			'Friday'      : 'Vendredi',
			'Saturday'    : 'Samedi',
			'Sun'         : 'Dim',
			'Mon'         : 'Lun',
			'Tue'         : 'Mar',
			'Wed'         : 'Mer',
			'Thu'         : 'Jeu',
			'Fri'         : 'Ven',
			'Sat'         : 'Sam',

			/******************************** sort variants ********************************/
			'sortname'          : 'par nom',
			'sortkind'          : 'par type',
			'sortsize'          : 'par taille',
			'sortdate'          : 'par date',
			'sortFoldersFirst'  : 'Dossiers en premier',
			'sortperm'          : 'par permission', // from v2.1.13 added 13.06.2016
			'sortmode'          : 'par mode',       // from v2.1.13 added 13.06.2016
			'sortowner'         : 'par propriétaire',      // from v2.1.13 added 13.06.2016
			'sortgroup'         : 'par groupe',      // from v2.1.13 added 13.06.2016
			'sortAlsoTreeview'  : 'Egalement arborescence',  // from v2.1.15 added 01.08.2016

			/********************************** new items **********************************/
			'untitled file.txt' : 'NouveauFichier.txt', // added 10.11.2015
			'untitled folder'   : 'NouveauDossier',   // added 10.11.2015
			'Archive'           : 'NouvelleArchive',  // from v2.1 added 10.11.2015
			'untitled file'     : 'NouveauFichier.$1',  // from v2.1.41 added 6.8.2018
			'extentionfile'     : '$1: Fichier',    // from v2.1.41 added 6.8.2018
			'extentiontype'     : '$1: $2',      // from v2.1.43 added 17.10.2018

			/********************************** messages **********************************/
			'confirmReq'      : 'Confirmation requise',
			'confirmRm'       : 'Êtes-vous certain de vouloir supprimer les éléments ?<br/>Cela ne peut être annulé !',
			'confirmRepl'     : 'Supprimer l\'ancien fichier par le nouveau ?',
			'confirmRest'     : 'Remplacer l\'élément existant par l\'élément de la corbeille ?', // fromv2.1.24 added 5.5.2017
			'confirmConvUTF8' : 'L\'encodage n\'est pas UTf-8<br/>Convertir en UTF-8 ?<br/>Les contenus deviendront UTF-8 en sauvegardant après la conversion.', // from v2.1 added 08.04.2014
			'confirmNonUTF8'  : 'Impossible de détecter l\'encodage de ce fichier. Pour être modifié, il doit être temporairement convertit en UTF-8.<br/>Veuillez s\'il vous plaît sélectionner un encodage pour ce fichier.', // from v2.1.19 added 28.11.2016
			'confirmNotSave'  : 'Ce fichier a été modifié.<br/>Les données seront perdues si les changements ne sont pas sauvegardés.', // from v2.1 added 15.7.2015
			'confirmTrash'    : 'Êtes-vous certain de vouloir déplacer les éléments vers la corbeille?', //from v2.1.24 added 29.4.2017
			'confirmMove'     : 'Voulez-vous vraiment déplacer les éléments vers "$1" ?', //from v2.1.50 added 27.7.2019
			'apllyAll'        : 'Appliquer à tous',
			'name'            : 'Nom',
			'size'            : 'Taille',
			'perms'           : 'Autorisations',
			'modify'          : 'Modifié',
			'kind'            : 'Type',
			'read'            : 'Lecture',
			'write'           : 'Écriture',
			'noaccess'        : 'Pas d\'accès',
			'and'             : 'et',
			'unknown'         : 'inconnu',
			'selectall'       : 'Sélectionner tous les éléments',
			'selectfiles'     : 'Sélectionner le(s) élément(s)',
			'selectffile'     : 'Sélectionner le premier élément',
			'selectlfile'     : 'Sélectionner le dernier élément',
			'viewlist'        : 'Vue par liste',
			'viewicons'       : 'Vue par icônes',
			'viewSmall'       : 'Petites icônes', // from v2.1.39 added 22.5.2018
			'viewMedium'      : 'Moyennes icônes', // from v2.1.39 added 22.5.2018
			'viewLarge'       : 'Grandes icônes', // from v2.1.39 added 22.5.2018
			'viewExtraLarge'  : 'Très grandes icônes', // from v2.1.39 added 22.5.2018
			'places'          : 'Favoris',
			'calc'            : 'Calculer',
			'path'            : 'Chemin',
			'aliasfor'        : 'Raccourcis pour',
			'locked'          : 'Verrouiller',
			'dim'             : 'Dimensions',
			'files'           : 'Fichiers',
			'folders'         : 'Dossiers',
			'items'           : 'Éléments',
			'yes'             : 'oui',
			'no'              : 'non',
			'link'            : 'Lien',
			'searcresult'     : 'Résultats de la recherche',
			'selected'        : 'Éléments sélectionnés',
			'about'           : 'À propos',
			'shortcuts'       : 'Raccourcis',
			'help'            : 'Aide',
			'webfm'           : 'Gestionnaire de fichier Web',
			'ver'             : 'Version',
			'protocolver'     : 'Version du protocole',
			'homepage'        : 'Page du projet',
			'docs'            : 'La documentation',
			'github'          : 'Forkez-nous sur Github',
			'twitter'         : 'Suivez nous sur twitter',
			'facebook'        : 'Joignez-nous facebook',
			'team'            : 'Équipe',
			'chiefdev'        : 'Développeur en chef',
			'developer'       : 'Développeur',
			'contributor'     : 'Contributeur',
			'maintainer'      : 'Mainteneur',
			'translator'      : 'Traducteur',
			'icons'           : 'Icônes',
			'dontforget'      : 'et n\'oubliez pas votre serviette',
			'shortcutsof'     : 'Raccourcis désactivés',
			'dropFiles'       : 'Déposez les fichiers ici',
			'or'              : 'ou',
			'selectForUpload' : 'Sélectionner les fichiers à envoyer',
			'moveFiles'       : 'Déplacer les éléments',
			'copyFiles'       : 'Copier les éléments',
			'restoreFiles'    : 'Restaurer les éléments', // from v2.1.24 added 5.5.2017
			'rmFromPlaces'    : 'Retirer des favoris',
			'aspectRatio'     : 'Ratio d’affichage',
			'scale'           : 'Mise à l\'échelle',
			'width'           : 'Largeur',
			'height'          : 'Hauteur',
			'resize'          : 'Redimensionner',
			'crop'            : 'Recadrer',
			'rotate'          : 'Rotation',
			'rotate-cw'       : 'Rotation de 90 degrés horaire',
			'rotate-ccw'      : 'Rotation de 90 degrés antihoraire',
			'degree'          : '°',
			'netMountDialogTitle' : 'Monter un volume réseau', // added 18.04.2012
			'protocol'            : 'Protocole', // added 18.04.2012
			'host'                : 'Hôte', // added 18.04.2012
			'port'                : 'Port', // added 18.04.2012
			'user'                : 'Utilisateur', // added 18.04.2012
			'pass'                : 'Mot de passe', // added 18.04.2012
			'confirmUnmount'      : 'Démonter $1?',  // from v2.1 added 30.04.2012
			'dropFilesBrowser': 'Glissez-déposez depuis le navigateur de fichier', // from v2.1 added 30.05.2012
			'dropPasteFiles'  : 'Glissez-déposez les fichiers ici', // from v2.1 added 07.04.2014
			'encoding'        : 'Encodage', // from v2.1 added 19.12.2014
			'locale'          : 'Encodage régional',   // from v2.1 added 19.12.2014
			'searchTarget'    : 'Destination: $1',                // from v2.1 added 22.5.2015
			'searchMime'      : 'Recherche par type MIME', // from v2.1 added 22.5.2015
			'owner'           : 'Propriétaire', // from v2.1 added 20.6.2015
			'group'           : 'Groupe', // from v2.1 added 20.6.2015
			'other'           : 'Autre', // from v2.1 added 20.6.2015
			'execute'         : 'Exécuter', // from v2.1 added 20.6.2015
			'perm'            : 'Permission', // from v2.1 added 20.6.2015
			'mode'            : 'Mode', // from v2.1 added 20.6.2015
			'emptyFolder'     : 'Le dossier est vide', // from v2.1.6 added 30.12.2015
			'emptyFolderDrop' : 'Le dossier est vide.\\ Glissez-déposez pour ajouter des éléments.', // from v2.1.6 added 30.12.2015
			'emptyFolderLTap' : 'Le dossier est vide.\\ Appuyez longuement pour ajouter des éléments.', // from v2.1.6 added 30.12.2015
			'quality'         : 'Qualité', // from v2.1.6 added 5.1.2016
			'autoSync'        : 'Synchronisation automatique',  // from v2.1.6 added 10.1.2016
			'moveUp'          : 'Déplacer vers le haut',  // from v2.1.6 added 18.1.2016
			'getLink'         : 'Obtenir le lien d’URL', // from v2.1.7 added 9.2.2016
			'selectedItems'   : 'Éléments sélectionnés ($1)', // from v2.1.7 added 2.19.2016
			'folderId'        : 'ID du dossier', // from v2.1.10 added 3.25.2016
			'offlineAccess'   : 'Permettre l\'accès hors-ligne', // from v2.1.10 added 3.25.2016
			'reAuth'          : 'Pour se réauthentifier', // from v2.1.10 added 3.25.2016
			'nowLoading'      : 'En cours de chargement...', // from v2.1.12 added 4.26.2016
			'openMulti'       : 'Ouvrir multiples fichiers', // from v2.1.12 added 5.14.2016
			'openMultiConfirm': 'Vous allez ouvrir $1 fichiers. Êtes-vous sûr de vouloir les ouvrir dans le navigateur ?', // from v2.1.12 added 5.14.2016
			'emptySearch'     : 'Aucun résultat trouvé avec les paramètres de recherche.', // from v2.1.12 added 5.16.2016
			'editingFile'     : 'Modification d\'un fichier.', // from v2.1.13 added 6.3.2016
			'hasSelected'     : 'Vous avez sélectionné $1 éléments.', // from v2.1.13 added 6.3.2016
			'hasClipboard'    : 'Vous avez $1 éléments dans le presse-papier.', // from v2.1.13 added 6.3.2016
			'incSearchOnly'   : 'Recherche incrémentale disponible uniquement pour la vue active.', // from v2.1.13 added 6.30.2016
			'reinstate'       : 'Rétablir', // from v2.1.15 added 3.8.2016
			'complete'        : '$1 complété', // from v2.1.15 added 21.8.2016
			'contextmenu'     : 'Menu contextuel', // from v2.1.15 added 9.9.2016
			'pageTurning'     : 'Tourner la page', // from v2.1.15 added 10.9.2016
			'volumeRoots'     : 'Volumes principaux', // from v2.1.16 added 16.9.2016
			'reset'           : 'Réinitialiser', // from v2.1.16 added 1.10.2016
			'bgcolor'         : 'Couleur de fond', // from v2.1.16 added 1.10.2016
			'colorPicker'     : 'Sélecteur de couleur', // from v2.1.16 added 1.10.2016
			'8pxgrid'         : 'Grille 8px', // from v2.1.16 added 4.10.2016
			'enabled'         : 'Actif', // from v2.1.16 added 4.10.2016
			'disabled'        : 'Inactif', // from v2.1.16 added 4.10.2016
			'emptyIncSearch'  : 'Aucun résultat trouvé.\\AAppuyez sur [Entrée] pour développer la cible de recherche.', // from v2.1.16 added 5.10.2016
			'emptyLetSearch'  : 'Aucun résultat trouvé pour la recherche par première lettre.', // from v2.1.23 added 24.3.2017
			'textLabel'       : 'Label texte', // from v2.1.17 added 13.10.2016
			'minsLeft'        : '$1 mins restantes', // from v2.1.17 added 13.11.2016
			'openAsEncoding'  : 'Réouvrir avec l\'encodage sélectionné', // from v2.1.19 added 2.12.2016
			'saveAsEncoding'  : 'Sauvegarder avec l\'encodage sélectionné', // from v2.1.19 added 2.12.2016
			'selectFolder'    : 'Choisir le dossier', // from v2.1.20 added 13.12.2016
			'firstLetterSearch': 'Recherche par première lettre', // from v2.1.23 added 24.3.2017
			'presets'         : 'Présélections', // from v2.1.25 added 26.5.2017
			'tooManyToTrash'  : 'Impossible de mettre autant d\'éléments à la corbeille.', // from v2.1.25 added 9.6.2017
			'TextArea'        : 'Zone de texte', // from v2.1.25 added 14.6.2017
			'folderToEmpty'   : 'Vider le dossier "$1".', // from v2.1.25 added 22.6.2017
			'filderIsEmpty'   : 'Il n\'y a pas d\'élément dans le dossier "$1".', // from v2.1.25 added 22.6.2017
			'preference'      : 'Préférence', // from v2.1.26 added 28.6.2017
			'language'        : 'Configuration de langue', // from v2.1.26 added 28.6.2017
			'clearBrowserData': 'Initialisation des configurations sauvegardées dans ce navigateur', // from v2.1.26 added 28.6.2017
			'toolbarPref'     : 'Paramètres de la barre d\'outils', // from v2.1.27 added 2.8.2017
			'charsLeft'       : '... $1 caractères restants.',  // from v2.1.29 added 30.8.2017
			'linesLeft'       : '... $1 de lignes restantes.',  // from v2.1.52 added 16.1.2020
			'sum'             : 'Somme', // from v2.1.29 added 28.9.2017
			'roughFileSize'   : 'Taille de fichier brute', // from v2.1.30 added 2.11.2017
			'autoFocusDialog' : 'Concentrez-vous sur l\'élément de dialogue avec le survol de la souris',  // from v2.1.30 added 2.11.2017
			'select'          : 'Sélectionner', // from v2.1.30 added 23.11.2017
			'selectAction'    : 'Action lors de la sélection d\'un fichier', // from v2.1.30 added 23.11.2017
			'useStoredEditor' : 'Ouvrir avec le dernier éditeur utilisé', // from v2.1.30 added 23.11.2017
			'selectinvert'    : 'Inverser la sélection', // from v2.1.30 added 25.11.2017
			'renameMultiple'  : 'Êtes-vous sûr de vouloir renommer les éléments sélectionnés $1 en $2 ?<br/>L\'action est définitive !', // from v2.1.31 added 4.12.2017
			'batchRename'     : 'Renommer le Batch', // from v2.1.31 added 8.12.2017
			'plusNumber'      : '+ Nombre', // from v2.1.31 added 8.12.2017
			'asPrefix'        : 'Ajouter un préfixe', // from v2.1.31 added 8.12.2017
			'asSuffix'        : 'Ajouter un suffixe', // from v2.1.31 added 8.12.2017
			'changeExtention' : 'Modifier l\'extention', // from v2.1.31 added 8.12.2017
			'columnPref'      : 'Paramètres des colonnes (List view)', // from v2.1.32 added 6.2.2018
			'reflectOnImmediate' : 'Les changements seront immédiatement appliqués à l\'archive.', // from v2.1.33 added 2.3.2018
			'reflectOnUnmount'   : 'Aucun changement ne sera appliqué tant que ce volume n\'a pas été démonté.', // from v2.1.33 added 2.3.2018
			'unmountChildren' : 'Le(s) volume(s) suivant(s) montés sur ce volume seront également démontés. Êtes-vous sûr de vouloir le démonter ?', // from v2.1.33 added 5.3.2018
			'selectionInfo'   : 'Informations sur la sélection', // from v2.1.33 added 7.3.2018
			'hashChecker'     : 'Algorithme de hachage de fichier', // from v2.1.33 added 10.3.2018
			'infoItems'       : 'Éléments d\'information (panneau d\'informations de sélection)', // from v2.1.38 added 28.3.2018
			'pressAgainToExit': 'Appuyez à nouveau pour quitter.', // from v2.1.38 added 1.4.2018
			'toolbar'         : 'Barre d\'outils', // from v2.1.38 added 4.4.2018
			'workspace'       : 'Espace de travail', // from v2.1.38 added 4.4.2018
			'dialog'          : 'Dialogue', // from v2.1.38 added 4.4.2018
			'all'             : 'Tout', // from v2.1.38 added 4.4.2018
			'iconSize'        : 'Taille des icônes (vue Icônes)', // from v2.1.39 added 7.5.2018
			'editorMaximized' : 'Ouvrir la fenêtre agrandie de l\'éditeur', // from v2.1.40 added 30.6.2018
			'editorConvNoApi' : 'Étant donné que la conversion par API n\'est pas disponible actuellement, veuillez effectuer la conversion sur le site Web.', //from v2.1.40 added 8.7.2018
			'editorConvNeedUpload' : 'Après la conversion, vous devez télécharger l\'URL de l\'élément ou un fichier téléchargé pour enregistrer le fichier converti.', //from v2.1.40 added 8.7.2018
			'convertOn'       : 'Convertissez sur le site de $1', // from v2.1.40 added 10.7.2018
			'integrations'    : 'Intégrations', // from v2.1.40 added 11.7.2018
			'integrationWith' : 'Cet elFinder intègre les services externes suivants. Veuillez vérifier les conditions d\'utilisation, la politique de confidentialité, etc. avant de l\'utiliser.', // from v2.1.40 added 11.7.2018
			'showHidden'      : 'Afficher les éléments cachés', // from v2.1.41 added 24.7.2018
			'hideHidden'      : 'Masquer les éléments cachés', // from v2.1.41 added 24.7.2018
			'toggleHidden'    : 'Afficher/Masquer les éléments masqués', // from v2.1.41 added 24.7.2018
			'makefileTypes'   : 'Types de fichiers à activer avec "Nouveau fichier"', // from v2.1.41 added 7.8.2018
			'typeOfTextfile'  : 'Type de fichier texte', // from v2.1.41 added 7.8.2018
			'add'             : 'Ajouter', // from v2.1.41 added 7.8.2018
			'theme'           : 'Défaut', // from v2.1.43 added 19.10.2018
			'default'         : 'défaut', // from v2.1.43 added 19.10.2018
			'description'     : 'La description', // from v2.1.43 added 19.10.2018
			'website'         : 'Site Internet', // from v2.1.43 added 19.10.2018
			'author'          : 'Auteure', // from v2.1.43 added 19.10.2018
			'email'           : 'Email', // from v2.1.43 added 19.10.2018
			'license'         : 'la licence', // from v2.1.43 added 19.10.2018
			'exportToSave'    : 'Cet élément ne peut pas être enregistré. Pour éviter de perdre les modifications, vous devez exporter vers votre PC.', // from v2.1.44 added 1.12.2018
			'dblclickToSelect': 'Double-cliquez sur le fichier pour le sélectionner.', // from v2.1.47 added 22.1.2019
			'useFullscreen'   : 'Utiliser le mode plein écran', // from v2.1.47 added 19.2.2019

			/********************************** mimetypes **********************************/
			'kindUnknown'     : 'Inconnu',
			'kindRoot'        : 'Volume principal', // from v2.1.16 added 16.10.2016
			'kindFolder'      : 'Dossier',
			'kindSelects'     : 'Sélections', // from v2.1.29 added 29.8.2017
			'kindAlias'       : 'Raccourci',
			'kindAliasBroken' : 'Raccourci cassé',
			// applications
			'kindApp'         : 'Application',
			'kindPostscript'  : 'Document Postscript',
			'kindMsOffice'    : 'Document Microsoft Office',
			'kindMsWord'      : 'Document Microsoft Word',
			'kindMsExcel'     : 'Document Microsoft Excel',
			'kindMsPP'        : 'Présentation Microsoft PowerPoint',
			'kindOO'          : 'Document OpenOffice',
			'kindAppFlash'    : 'Application Flash',
			'kindPDF'         : 'Format de document portable (PDF)',
			'kindTorrent'     : 'Fichier BitTorrent',
			'kind7z'          : 'Archive 7z',
			'kindTAR'         : 'Archive TAR',
			'kindGZIP'        : 'Archive GZIP',
			'kindBZIP'        : 'Archive BZIP',
			'kindXZ'          : 'Archive XZ',
			'kindZIP'         : 'Archive ZIP',
			'kindRAR'         : 'Archive RAR',
			'kindJAR'         : 'Fichier Java JAR',
			'kindTTF'         : 'Police True Type',
			'kindOTF'         : 'Police Open Type',
			'kindRPM'         : 'Package RPM',
			// texts
			'kindText'        : 'Document Text',
			'kindTextPlain'   : 'Texte non formaté',
			'kindPHP'         : 'Source PHP',
			'kindCSS'         : 'Feuille de style en cascade',
			'kindHTML'        : 'Document HTML',
			'kindJS'          : 'Source JavaScript',
			'kindRTF'         : 'Format de texte enrichi (Rich Text Format)',
			'kindC'           : 'Source C',
			'kindCHeader'     : 'Source header C',
			'kindCPP'         : 'Source C++',
			'kindCPPHeader'   : 'Source header C++',
			'kindShell'       : 'Shell script Unix',
			'kindPython'      : 'Source Python',
			'kindJava'        : 'Source Java',
			'kindRuby'        : 'Source Ruby',
			'kindPerl'        : 'Script Perl',
			'kindSQL'         : 'Source SQL',
			'kindXML'         : 'Document XML',
			'kindAWK'         : 'Source AWK',
			'kindCSV'         : 'CSV',
			'kindDOCBOOK'     : 'Document Docbook XML',
			'kindMarkdown'    : 'Texte de démarque', // added 20.7.2015
			// images
			'kindImage'       : 'Image',
			'kindBMP'         : 'Image BMP',
			'kindJPEG'        : 'Image JPEG',
			'kindGIF'         : 'Image GIF',
			'kindPNG'         : 'Image PNG',
			'kindTIFF'        : 'Image TIFF',
			'kindTGA'         : 'Image TGA',
			'kindPSD'         : 'Image Adobe Photoshop',
			'kindXBITMAP'     : 'Image X bitmap',
			'kindPXM'         : 'Image Pixelmator',
			// media
			'kindAudio'       : 'Son',
			'kindAudioMPEG'   : 'Son MPEG',
			'kindAudioMPEG4'  : 'Son MPEG-4',
			'kindAudioMIDI'   : 'Son MIDI',
			'kindAudioOGG'    : 'Son Ogg Vorbis',
			'kindAudioWAV'    : 'Son WAV',
			'AudioPlaylist'   : 'Liste de lecture audio',
			'kindVideo'       : 'Vidéo',
			'kindVideoDV'     : 'Vidéo DV',
			'kindVideoMPEG'   : 'Vidéo MPEG',
			'kindVideoMPEG4'  : 'Vidéo MPEG-4',
			'kindVideoAVI'    : 'Vidéo AVI',
			'kindVideoMOV'    : 'Vidéo Quick Time',
			'kindVideoWM'     : 'Vidéo Windows Media',
			'kindVideoFlash'  : 'Vidéo Flash',
			'kindVideoMKV'    : 'Vidéo Matroska',
			'kindVideoOGG'    : 'Vidéo Ogg'
		}
	};
}));js/i18n/elfinder.ug_CN.js000064400000123506151215013370011064 0ustar00/**
 * ئ‍ۇيغۇرچە translation
 * @author تەرجىمە قىلغۇچى:  ئۆتكۈر بىز شىركىتى info@otkur.biz
 * @version 2022-03-03
 */
 (function(root, factory) {
	if (typeof define === 'function' && define.amd) {
		define(['elfinder'], factory);
	} else if (typeof exports !== 'undefined') {
		module.exports = factory(require('elfinder'));
	} else {
		factory(root.elFinder);
	}
}(this, function(elFinder) {
	elFinder.prototype.i18.ug_CN = {
		translator : 'تەرجىمە قىلغۇچى:  ئۆتكۈر بىز شىركىتى info@otkur.biz',
		language   : 'ئ‍ۇيغۇرچە',
		direction  : 'rtl',
		dateFormat : 'Y-m-d H:i', // will show like: 2022-03-03 16:56
		fancyDateFormat : '$1 H:i', // will show like: بۈگۈن 16:56
		nonameDateFormat : 'ymd-His', // noname upload will show like: 220303-165611
		messages   : {
			'getShareText' : 'ھەمبەھىرلەش',
			'Editor ': 'كود تەھرىرلىگۈچى',

			/********************************** errors **********************************/
			'error'                : 'خاتالىق',
			'errUnknown'           : 'كۈتۈلمىگەن خاتالىقكەن.',
			'errUnknownCmd'        : 'كۈتۈلمىگەن بۇيرۇقكەن.',
			'errJqui'              : 'jQuery UI تەڭشىكى توغرا بولمىغان. چوقۇم Selectable، draggable، droppabl قاتارلىق بۆلەكلەر بولۇشى كېرەك.',
			'errNode'              : 'elFinder DOM ئېلىمىنتلىرىنى قۇرالىشى كېرەك.',
			'errURL'               : 'elFinder تەڭشىكى توغرا بولمىغان! URL تەڭشىكى يېزىلمىغان.',
			'errAccess'            : 'زىيارەت قىلىش چەكلەنگەن.',
			'errConnect'           : 'ئارقا سۇپىغا ئۇلاش مەغلۇپ بولدى..',
			'errAbort'             : 'ئارقا سۇپىغا توختىتىلدى.',
			'errTimeout'           : 'ئارقا سۇپىغا بەلگىلەنگەن ۋاقىتتا ئۇلىيالمىدى.',
			'errNotFound'          : 'ئارقا سۇپا تېپىلمىدى.',
			'errResponse'          : 'ئارقا سۇپىدىن توغرا بولمىغان ئىنكاس قايتتى.',
			'errConf'              : 'ئارقا سۇپا تەڭشىكى توغرا ئەمەس.',
			'errJSON'              : 'PHP JSON بۆلىكى قاچىلانمىغان.',
			'errNoVolumes'         : 'ئوقۇشقا بولىدىغان ھۈججەت خالتىسى يوق.',
			'errCmdParams'         : 'پارامېتىر خاتا، بۇيرۇق: "$1".',
			'errDataNotJSON'       : 'ئارقا سۇپا قايتۇرغان سانلىق مەلۇمات توغرا بولغان JSON ئەمەسكەن.',
			'errDataEmpty'         : 'ئارقا سۇپا قايتۇرغان سانلىق مەلۇمات قۇرۇقكەن.',
			'errCmdReq'            : 'ئارقا سۇپىدىكى بۇيرۇقنىڭ ئ‍سىمى تەمىنلىنىشى كېرەك.',
			'errOpen'              : '"$1"نى ئاچالمىدى.',
			'errNotFolder'         : 'ئوبىكىت مۇندەرىجە ئەمەسكەن.',
			'errNotFile'           : 'ئوبىكىت ھۈججەت ئەمەسكەن.',
			'errRead'              : '"$1"نى ئوقۇيالمىدى.',
			'errWrite'             : '"$1"نى يازالمىدى.',
			'errPerm'              : 'ھوقۇق يوق.',
			'errLocked'            : '"$1" تاقالغان,ئۆزگەرتەلمەيسىز.',
			'errExists'            : '"$1" ناملىق ھۈججەت باركەن.',
			'errInvName'           : 'توغرا بولمىغان ھۈججەت قىسقۇچ ئىسمى.',
			'errInvDirname'        : 'ھۆججەت قىسقۇچنىڭ ئىسمى ئىناۋەتسىز.',  // from v2.1.24 added 12.4.2017
			'errFolderNotFound'    : 'ھۈججەت قىسقۇچنى تاپالمىدى.',
			'errFileNotFound'      : 'ھۈججەتنى تاپالمىدى.',
			'errTrgFolderNotFound' : '"$1" ناملىق ھۈججەت قىسقۇچنى تاپالمىدى.',
			'errPopup'             : 'سەكرەپ چىققان يېڭى بەتنى تور كۆرگۈچ كۆرسەتمىدى، ئۈستىدىكى ئەسكەرتىشتىن تور كۆرگۈچنى كۆرسىتىشكە تەڭشەڭ.',
			'errMkdir'             : '"$1" ناملىق ھۈججەت قىسقۇچنى قۇرالمىدى.',
			'errMkfile'            : '"$1" ناملىق ھۈججەتنى قۇرالمىدى.',
			'errRename'            : '"$1" ناملىق ھۈججەتنىڭ ئىسمىنى يېڭىلاش مەغلۇپ بولدى.',
			'errCopyFrom'          : ' "$1" ناملىق ئورۇندىن ھۈججەت كۆچۈرۈش چەكلەنگەن.',
			'errCopyTo'            : '"$1" ناملىق ئورۇنغا ھۈججەت كۆچۈرۈش چەكلەنگەن.',
			'errMkOutLink'         : 'ئاۋاز يىلتىزىنىڭ سىرتىغا ئۇلىنىش قۇرالمىدى.', // from v2.1 added 03.10.2015
			'errUpload'            : 'يۈكلەشتە خاتالىق كۆرۈلدى.',  // old name - errUploadCommon
			'errUploadFile'        : '"$1" ناملىق ھۈججەتنى يۈكلەشتە خاتالىق كۆرۈلدى.', // old name - errUpload
			'errUploadNoFiles'     : 'يۈكلىمەكچى بولغان ھۈججەت تېپىلمىدى.',
			'errUploadTotalSize'   : 'سانلىق مەلۇمات چوڭلىقى چەكلىمىدىن ئېشىپ كەتكەن..', // old name - errMaxSize
			'errUploadFileSize'    : 'ھۈججەت چوڭلىقى چەكلىمىدىن ئېشىپ كەتكەن..', //  old name - errFileMaxSize
			'errUploadMime'        : 'چەكلەنگەن ھۈججەت شەكلى.',
			'errUploadTransfer'    : '"$1" ناملىق ھۈججەتنى يوللاشتا خاتالىق كۆرۈلدى.',
			'errUploadTemp'        : 'يوللاش ئۈچۈن ۋاقىتلىق ھۆججەت ھاسىل قىلالمىدى.', // from v2.1 added 26.09.2015
			'errNotReplace'        : '"$1" ناملىق ھۈججەت باركەن، ئالماشتۇرۇشقا بولمايدۇ.', // new
			'errReplace'           : '"$1" ناملىق ھۈججەتنى ئالماشتۇرۇش مەغلۇپ بولدى.',
			'errSave'              : '"$1" ناملىق ھۈججەتنى ساقلاش مەغلۇپ بولدى.',
			'errCopy'              : '"$1" ناملىق ھۈججەتنى كۆچۈرۈش مەغلۇپ بولدى.',
			'errMove'              : '"$1" ناملىق ھۈججەتنى يۆتكەش مەغلۇپ بولدى.',
			'errCopyInItself'      : '"$1" ناملىق ھۈججەتنى ئەسلى ئورنىغا يۆتكەش مەغلۇپ بولدى.',
			'errRm'                : '"$1" ناملىق ھۈججەتنى ئۆچۈرۈش مەغلۇپ بولدى.',
			'errTrash'             : 'ئەخلەت ساندۇقىغا كىرەلمىدى.', // from v2.1.24 added 30.4.2017
			'errRmSrc'             : 'ئەسلى ھۈججەتنى ئۆچۈرۈش مەغلۇپ بولدى.',
			'errExtract'           : ' "$1" ناملىق مەلۇماتتىن ھۈججەت ئايرىش مەغلۇپ بولدى..',
			'errArchive'           : 'پىرىسلانغان ھۈججەت ھاسىللاش مەغلۇپ بولدى.',
			'errArcType'           : 'بۇ خىل پىرىسلانغان ھۈججەت شەكلىنى سىستېما بىر تەرەپ قىلالمىدى.',
			'errNoArchive'         : 'ھۈججەت پىرىسلانغان ھۈججەت ئەمەس، ياكى توغرا پىرىسلانمىغان.',
			'errCmdNoSupport'      : 'بۇ خىل بۇيرۇقنى بىر تەرەپ قىلالمىدى.',
			'errReplByChild'       : '“$1” ناملىق ھۈججەت قىسقۇچنى ئالماشۇتۇرۇشقا بولمايدۇ.',
			'errArcSymlinks'       : 'بىخەتەرلىك ئۈچۈن بۇ مەشغۇلات ئەمەلدىن قالدۇرۇلدى..', // edited 24.06.2012
			'errArcMaxSize'        : 'پىرىسلانغان ھۈججەتنىڭ چوڭلىقى چەكلىمىدىن ئېشىپ كەنكەن.',
			'errResize'            : ' "$1" چوڭلۇقنى تەڭشەشكە بولمىدى.',
			'errResizeDegree'      : 'توغرا بولمىغان پىقىرىتىش گىرادۇسى',  // added 7.3.2013
			'errResizeRotate'      : 'رەسىمنى پىقىرىتىشقا بولمىدى.',  // added 7.3.2013
			'errResizeSize'        : 'توغرا بولمىغان رەسىم چوڭلىقى.',  // added 7.3.2013
			'errResizeNoChange'    : 'رەسىم چوڭلىقى ئۆزگەرمىگەن.',  // added 7.3.2013
			'errUsupportType'      : 'قوللىمايدىغان ھۈججەت شەكلى.',
			'errNotUTF8Content'    : '"$1" ناملىق ھۈججەتنىڭ كودى  UTF-8ئەمەسكەن،  تەھرىرلىگىلى بولمايدۇ.',  // added 9.11.2011
			'errNetMount'          : ' "$1" نى يۈكلەشتە خاتلىق يۈز بەردى..', // added 17.04.2012
			'errNetMountNoDriver'  : 'بۇ خىل پروتوكول قوللانمىدى..',     // added 17.04.2012
			'errNetMountFailed'    : 'يۈكلەش مەغلۇپ بولدى.',         // added 17.04.2012
			'errNetMountHostReq'   : 'مۇلازىمىتىرنى كۆرسىتىپ بېرىڭ.', // added 18.04.2012
			'errSessionExpires'    : 'سىزنىڭ ھەرىكەتسىزلىكىڭىز سەۋەبىدىن ۋاقتىڭىز توشتى.',
			'errCreatingTempDir'   : 'ۋاقىتلىق مۇندەرىجە قۇرالمىدى: "$ 1"',
			'errFtpDownloadFile'   : 'FTP دىن ھۆججەت چۈشۈرۈشكە ئامالسىز: "$ 1"',
			'errFtpUploadFile'     : 'FTP غا ھۆججەت يۈكلىيەلمىدى: "$ 1"',
			'errFtpMkdir'          : 'FTP دا يىراقتىن مۇندەرىجە قۇرالمىدى: "$ 1"',
			'errArchiveExec'       : 'ھۆججەتلەرنى ئارخىپلاشتۇرغاندا خاتالىق: "$ 1"',
			'errExtractExec'       : 'ھۆججەتلەرنى چىقىرىشتا خاتالىق: "$ 1"',
			'errNetUnMount'        : 'ساناقسىز.', // from v2.1 added 30.04.2012
			'errConvUTF8'          : 'UTF-8 غا ئايلاندۇرغىلى بولمايدۇ', // from v2.1 added 08.04.2014
			'errFolderUpload'      : 'ئەگەر ھۆججەت قىسقۇچنى يۈكلىمەكچى بولسىڭىز ، زامانىۋى توركۆرگۈنى سىناپ بېقىڭ.', // from v2.1 added 26.6.2015
			'errSearchTimeout'     : '«$ 1» نى ئىزدەۋاتقاندا ۋاقتى ئۆتتى. ئىزدەش نەتىجىسى قىسمەن.', // from v2.1 added 12.1.2016
			'errReauthRequire'     : 'قايتا ھوقۇق بېرىش تەلەپ قىلىنىدۇ.', // from v2.1.10 added 24.3.2016
			'errMaxTargets'        : 'تاللىغىلى بولىدىغان تۈرلەرنىڭ ئەڭ كۆپ سانى 1 دوللار.', // from v2.1.17 added 17.10.2016
			'errRestore'           : 'ئەخلەت ساندۇقىدىن ئەسلىگە كەلتۈرگىلى بولمايدۇ. ئەسلىگە كەلتۈرۈش مەنزىلىنى ئېنىقلىيالمىدى.', // from v2.1.24 added 3.5.2017
			'errEditorNotFound'    : 'تەھرىرلىگۈچ بۇ ھۆججەت تىپىغا تېپىلمىدى.', // from v2.1.25 added 23.5.2017
			'errServerError'       : 'مۇلازىمېتىر تەرەپتە خاتالىق كۆرۈلدى.', // from v2.1.25 added 16.6.2017
			'errEmpty'             : '"$ 1" ھۆججەت قىسقۇچىنى بوشاتقىلى بولمايدۇ.', // from v2.1.25 added 22.6.2017
			'moreErrors'           : 'يەنە 1 دوللار خاتالىق بار.', // from v2.1.44 added 9.12.2018
			'errMaxMkdirs'         : 'بىرلا ۋاقىتتا $ 1 ھۆججەت قىسقۇچ قۇرالايسىز.', // from v2.1.58 added 20.6.2021

			/******************************* commands names ********************************/
			'cmdarchive'   : 'پىرىسلاش',
			'cmdback'      : 'قايتىش',
			'cmdcopy'      : 'كۆچۈرۈش',
			'cmdcut'       : 'كېسىش',
			'cmddownload'  : 'چۈشۈرۈش',
			'cmdduplicate' : 'نۇسخىلاش',
			'cmdedit'      : 'تەھرىرلەش',
			'cmdextract'   : 'پىرىستىن ھۈججەت چىقىرىش',
			'cmdforward'   : 'ئ‍الدىغا مېڭىش',
			'cmdgetfile'   : 'تاللاش',
			'cmdhelp'      : 'ئەپ ھەققىدە',
			'cmdhome'      : 'باش بەت',
			'cmdinfo'      : 'ئۇچۇرلىرى',
			'cmdmkdir'     : 'يېڭى ھۈججەت قىسقۇچ',
			'cmdmkdirin'   : 'يېڭى ھۆججەت قىسقۇچقا', // from v2.1.7 added 19.2.2016
			'cmdmkfile'    : 'يېڭى ھۈججەت',
			'cmdopen'      : 'ئېچىش',
			'cmdpaste'     : 'چاپلاش',
			'cmdquicklook' : 'كۆرۈش',
			'cmdreload'    : 'يېڭىلاش',
			'cmdrename'    : 'نام يېڭىلاش',
			'cmdrm'        : 'ئۆچۈرۈش',
			'cmdtrash'     : 'ئەخلەت ساندۇقىغا', //from v2.1.24 added 29.4.2017
			'cmdrestore'   : 'ئەسلىگە كەلتۈرۈش', //from v2.1.24 added 3.5.2017
			'cmdsearch'    : 'ھۈججەت ئىزدەش',
			'cmdup'        : 'ئالدىنقى مۇندەرىجىگە بېرىش',
			'cmdupload'    : 'يۈكلەش',
			'cmdview'      : 'كۆرۈش',
			'cmdresize'    : 'چوڭلىقىنى تەڭشەش',
			'cmdsort'      : 'تەرتىپ',
			'cmdnetmount'  : 'توردىن قوشۇش', // added 18.04.2012
			'cmdnetunmount': 'Unmount', // from v2.1 added 30.04.2012
			'cmdplaces'    : 'جايلارغا', // added 28.12.2014
			'cmdchmod'     : 'ھالەتنى ئۆزگەرتىش', // from v2.1 added 20.6.2015
			'cmdopendir'   : 'ھۆججەت قىسقۇچنى ئېچىڭ', // from v2.1 added 13.1.2016
			'cmdcolwidth'  : 'ستون كەڭلىكىنى ئەسلىگە كەلتۈرۈڭ', // from v2.1.13 added 12.06.2016
			'cmdfullscreen': 'تولۇق ئېكران', // from v2.1.15 added 03.08.2016
			'cmdmove'      : 'يۆتكەڭ', // from v2.1.15 added 21.08.2016
			'cmdempty'     : 'قىسقۇچنى بوش قويۇڭ', // from v2.1.25 added 22.06.2017
			'cmdundo'      : 'ئەمەلدىن قالدۇرۇش', // from v2.1.27 added 31.07.2017
			'cmdredo'      : 'Redo', // from v2.1.27 added 31.07.2017
			'cmdpreference': 'مايىللىق', // from v2.1.27 added 03.08.2017
			'cmdselectall' : 'ھەممىنى تاللاڭ', // from v2.1.28 added 15.08.2017
			'cmdselectnone': 'ھېچقايسىسىنى تاللىماڭ', // from v2.1.28 added 15.08.2017
			'cmdselectinvert': 'تەتۈر تاللاش', // from v2.1.28 added 15.08.2017
			'cmdopennew'   : 'يېڭى كۆزنەكتە ئېچىڭ', // from v2.1.38 added 3.4.2018
			'cmdhide'      : 'يوشۇرۇش (مايىللىق)', // from v2.1.41 added 24.7.2018

			/*********************************** buttons ***********************************/
			'btnClose'  : 'تاقاش',
			'btnSave'   : 'ساقلاش',
			'btnRm'     : 'ئۆچۈرۈش',
			'btnApply'  : 'ئىشلىتىش',
			'btnCancel' : 'بېكارلاش',
			'btnNo'     : 'ياق',
			'btnYes'    : 'ھەئە',
			'btnMount'  : 'يۈكلەش',  // added 18.04.2012
			'btnApprove': 'Goto $ 1 & تەستىق', // from v2.1 added 26.04.2012
			'btnUnmount': 'Unmount', // from v2.1 added 30.04.2012
			'btnConv'   : 'ئايلاندۇرۇش', // from v2.1 added 08.04.2014
			'btnCwd'    : 'بۇ يەردە',      // from v2.1 added 22.5.2015
			'btnVolume' : 'ھەجىم',    // from v2.1 added 22.5.2015
			'btnAll'    : 'ھەممىسى',       // from v2.1 added 22.5.2015
			'btnMime'   : 'MIME تىپى', // from v2.1 added 22.5.2015
			'btnFileName':'ھۆججەت ئىسمى',  // from v2.1 added 22.5.2015
			'btnSaveClose': 'ساقلاش ۋە تاقاش', // from v2.1 added 12.6.2015
			'btnBackup' : 'زاپاسلاش', // fromv2.1 added 28.11.2015
			'btnRename'    : 'ئىسىمنى ئۆزگەرتىش',      // from v2.1.24 added 6.4.2017
			'btnRenameAll' : 'Rename(All)', // from v2.1.24 added 6.4.2017
			'btnPrevious' : 'ئالدىنقى ($ 1 / $ 2)', // from v2.1.24 added 11.5.2017
			'btnNext'     : 'كېيىنكى ($ 1 / $ 2)', // from v2.1.24 added 11.5.2017
			'btnSaveAs'   : 'Save As', // from v2.1.25 added 24.5.2017

			/******************************** notifications ********************************/
			'ntfopen'     : 'قىسقۇچنى ئېچىش',
			'ntffile'     : 'ھۈججەتنى ئېچىش',
			'ntfreload'   : 'يېڭىلاش',
			'ntfmkdir'    : 'قىسقۇچ قۇرۇش',
			'ntfmkfile'   : 'ھۈججەت قۇرۇش',
			'ntfrm'       : 'ئۆچۈرۈش',
			'ntfcopy'     : 'كۆچۈرۈش',
			'ntfmove'     : 'يۆتكەش',
			'ntfprepare'  : 'كۆچۈرۈش تەييارلىقى',
			'ntfrename'   : 'نام يېڭىلاش',
			'ntfupload'   : 'يۈكلەش',
			'ntfdownload' : 'چۈشۈرۈش',
			'ntfsave'     : 'ساقلاش',
			'ntfarchive'  : 'پىرىسلاش',
			'ntfextract'  : 'پىرىستىن يېشىش',
			'ntfsearch'   : 'ئىزدەش',
			'ntfresize'   : 'چوڭلىقى ئۆزگەرتىلىۋاتىدۇ',
			'ntfsmth'     : 'ئالدىراش >_<',
			'ntfloadimg'  : 'رەسىم ئېچىلىۋاتىدۇ',
			'ntfnetmount' : 'تور ھۈججىتى يۈكلىنىۋاتىدۇ', // added 18.04.2012
			'ntfnetunmount': 'تور ئاۋازىنى ئۆچۈرۈۋېتىش', // from v2.1 added 30.04.2012
			'ntfdim'      : 'رەسىم ئۆلچىمىگە ئېرىشىش', // added 20.05.2013
			'ntfreaddir'  : 'قىسقۇچ ئۇچۇرلىرىنى ئوقۇش', // from v2.1 added 01.07.2013
			'ntfurl'      : 'ئۇلىنىش ئادرېسىغا ئېرىشىش', // from v2.1 added 11.03.2014
			'ntfchmod'    : 'ھۆججەت ھالىتىنى ئۆزگەرتىش', // from v2.1 added 20.6.2015
			'ntfpreupload': 'يۈكلەش ھۆججەت نامىنى دەلىللەش', // from v2.1 added 31.11.2015
			'ntfzipdl'    : 'چۈشۈرۈش ئۈچۈن ھۆججەت قۇرۇش', // from v2.1.7 added 23.1.2016
			'ntfparents'  : 'يول ئۇچۇرىغا ئېرىشىش', // from v2.1.17 added 2.11.2016
			'ntfchunkmerge': 'يۈكلەنگەن ھۆججەتنى بىر تەرەپ قىلىش', // from v2.1.17 added 2.11.2016
			'ntftrash'    : 'ئەخلەت ساندۇقىغا تاشلاش', // from v2.1.24 added 2.5.2017
			'ntfrestore'  : 'ئەخلەت ساندۇقىدىن ئەسلىگە كەلتۈرۈش', // from v2.1.24 added 3.5.2017
			'ntfchkdir'   : 'نىشان ھۆججەت قىسقۇچىنى تەكشۈرۈش', // from v2.1.24 added 3.5.2017
			'ntfundo'     : 'ئالدىنقى مەشغۇلاتنى بىكار قىلىش', // from v2.1.27 added 31.07.2017
			'ntfredo'     : 'ئىلگىرىكى ئەمەلدىن قالدۇرۇش', // from v2.1.27 added 31.07.2017
			'ntfchkcontent' : 'مەزمۇننى تەكشۈرۈش', // from v2.1.41 added 3.8.2018

			/*********************************** volumes *********************************/
			'volume_Trash' : 'ئەخلەت ساندۇقى', //from v2.1.24 added 29.4.2017

			/************************************ dates **********************************/
			'dateUnknown' : 'ئېنىق ئەمەس',
			'Today'       : 'بۈگۈن',
			'Yesterday'   : 'تۆنۈگۈن',
			'msJan'       : '1-ئاي',
			'msFeb'       : '2-ئاي',
			'msMar'       : '3-ئاي',
			'msApr'       : '4-ئاي',
			'msMay'       : '5-ئاي',
			'msJun'       : '6-ئاي',
			'msJul'       : '7-ئاي',
			'msAug'       : '8-ئاي',
			'msSep'       : '9-ئ‍اي',
			'msOct'       : '10-ئاي',
			'msNov'       : '11-ئاي',
			'msDec'       : '12-ئاي',
			'January'     : '1-ئاي',
			'February'    : '2-ئاي',
			'March'       : '3-ئاي',
			'April'       : '4-ئاي',
			'May'         : '5-ئاي',
			'June'        : '6-ئاي',
			'July'        : '7-ئاي',
			'August'      : '8-ئاي',
			'September'   : '9-ئاي',
			'October'     : '10-ئاي',
			'November'    : '11-ئاي',
			'December'    : '12-ئاي',
			'Sunday'      : 'يەكشەنبە',
			'Monday'      : 'دۈشەنبە',
			'Tuesday'     : 'سەيشەنبە',
			'Wednesday'   : 'چارشەنبە',
			'Thursday'    : 'پەيشەنبە',
			'Friday'      : 'جۈمە',
			'Saturday'    : 'شەنبە',
			'Sun'         : 'يە',
			'Mon'         : 'دۈ',
			'Tue'         : 'سە',
			'Wed'         : 'چا',
			'Thu'         : 'پە',
			'Fri'         : 'جۈ',
			'Sat'         : 'شە',

			/******************************** sort variants ********************************/
			'sortname'          : 'نامى ',
			'sortkind'          : 'شەكلى ',
			'sortsize'          : 'چوڭلىقى',
			'sortdate'          : 'ۋاقتى',
			'sortFoldersFirst'  : 'قىسقۇچلار باشتا',
			'sortperm'          : 'رۇخسەت بىلەن', // from v2.1.13 added 13.06.2016
			'sortmode'          : 'by mode',       // from v2.1.13 added 13.06.2016
			'sortowner'         : 'ئىگىسى تەرىپىدىن',      // from v2.1.13 added 13.06.2016
			'sortgroup'         : 'گۇرۇپپا بويىچە',      // from v2.1.13 added 13.06.2016
			'sortAlsoTreeview'  : 'Treeview',  // from v2.1.15 added 01.08.2016

			/********************************** new items **********************************/
			'untitled file.txt' : 'يېڭى ھۆججەت.txt', // added 10.11.2015
			'untitled folder'   : 'يېڭى ھۆججەت قىسقۇچ',   // added 10.11.2015
			'Archive'           : 'يېڭى ئارخېۋى',  // from v2.1 added 10.11.2015
			'untitled file'     :'يېڭىھۆججەت.$1',  // from v2.1.41 added 6.8.2018
			'extentionfile'     : '$1: ھۆججەت',    // from v2.1.41 added 6.8.2018
			'extentiontype'     : '$1: $2',      // from v2.1.43 added 17.10.2018

			/********************************** messages **********************************/
			'confirmReq'      : 'مۇقىملاشتۇرۇڭ',
			'confirmRm'       : 'راستىنلا ئۆچۈرەمسىز?<br/>كەينىگە قايتۇرغىلى بولمايدۇ!',
			'confirmRepl'     : 'ھازىرقى ھۈججەت بىلەن كونىسىنى ئالماشتۇرامسىز?',
			'confirmRest'     : 'مەۋجۇت نەرسىنى ئەخلەت ساندۇقىغا ئالماشتۇرۇڭ؟', // fromv2.1.24 added 5.5.2017
			'confirmConvUTF8' : 'UTF-8 دا ئەمەس <br/> UTF-8 غا ئايلاندۇرامسىز؟ <br/> مەزمۇن ئۆزگەرتىلگەندىن كېيىن تېجەش ئارقىلىق UTF-8 غا ئايلىنىدۇ.', // from v2.1 added 08.04.2014
			'confirmNonUTF8'  : 'بۇ ھۆججەتنىڭ ھەرپ-بەلگە كودلىرىنى بايقىغىلى بولمايدۇ. ئۇنى تەھرىرلەش ئۈچۈن UTF-8 غا ۋاقىتلىق ئۆزگەرتىش كېرەك. <br/> بۇ ھۆججەتنىڭ ھەرپ-بەلگە كودلىرىنى تاللاڭ.', // from v2.1.19 added 28.11.2016
			'confirmNotSave'  : 'ئۇ ئۆزگەرتىلدى. <br/> ئۆزگەرتىشنى ساقلىمىسىڭىز خىزمەتتىن ئايرىلىدۇ.', // from v2.1 added 15.7.2015
			'confirmTrash'    : 'نەرسىلەرنى ئەخلەت ساندۇقىغا يۆتكىمەكچىمۇ؟', //from v2.1.24 added 29.4.2017
			'confirmMove'     : 'تۈرلەرنى «$ 1» غا يۆتكىمەكچىمۇ؟', //from v2.1.50 added 27.7.2019
			'apllyAll'        : 'ھەممىسىگە ئىشلىتىش',
			'name'            : 'نامى',
			'size'            : 'چوڭلىقى',
			'perms'           : 'ھوقۇق',
			'modify'          : 'ئۆزگەرگەن ۋاقتى',
			'kind'            : 'تۈرى',
			'read'            : 'ئوقۇش',
			'write'           : 'يېزىش',
			'noaccess'        : 'ھوقۇق يوق',
			'and'             : 'ھەم',
			'unknown'         : 'ئېنىق ئەمەس',
			'selectall'       : 'ھەممىنى تاللاش',
			'selectfiles'     : 'تاللاش',
			'selectffile'     : 'بىرىنچىسىنى تاللاش',
			'selectlfile'     : 'ئەڭ ئاخىرقىسىنى تاللاش',
			'viewlist'        : 'جەدۋەللىك كۆرىنىشى',
			'viewicons'       : 'رەسىملىك كۆرىنىشى',
			'viewSmall'       : 'كىچىك سىنبەلگىلەر', // from v2.1.39 added 22.5.2018
			'viewMedium'      : 'ئوتتۇرا سىنبەلگىلەر', // from v2.1.39 added 22.5.2018
			'viewLarge'       : 'چوڭ سىنبەلگىلەر', // from v2.1.39 added 22.5.2018
			'viewExtraLarge'  : 'قوشۇمچە چوڭ سىنبەلگىلەر', // from v2.1.39 added 22.5.2018
			'places'          : 'ئورنى',
			'calc'            : 'ھېسابلاش',
			'path'            : 'ئورنى',
			'aliasfor'        : 'باشقا نامى',
			'locked'          : 'تاقالغان',
			'dim'             : 'چوڭلىقى',
			'files'           : 'ھۈججەت',
			'folders'         : 'قىسقۇچ',
			'items'           : 'تۈرلەر',
			'yes'             : 'ھەئە',
			'no'              : 'ياق',
			'link'            : 'ئۇلىنىش',
			'searcresult'     : 'ئىزدەش نەتىجىسى',
			'selected'        : 'تاللانغان تۈرلەر',
			'about'           : 'چۈشەنچە',
			'shortcuts'       : 'تېز كونۇپكىلار',
			'help'            : 'ياردەم',
			'webfm'           : 'تور ھۈججەتلىرىنى باشقۇرۇش',
			'ver'             : 'نەشرى',
			'protocolver'     : 'پروتوكول نەشرى',
			'homepage'        : 'تۈر باش بېتى',
			'docs'            : 'ھۈججەت',
			'github'          : 'Fork us on Github',
			'twitter'         : 'Follow us on twitter',
			'facebook'        : 'Join us on facebook',
			'team'            : 'گۇرۇپپا',
			'chiefdev'        : 'باش پىروگراممىر',
			'developer'       : 'پىروگراممىر',
			'contributor'     : 'تۆھپىكار',
			'maintainer'      : 'ئاسرىغۇچى',
			'translator'      : 'تەرجىمان',
			'icons'           : 'سىنبەلگە',
			'dontforget'      : 'تەرىڭىزنى سۈرتىدىغان قولياغلىقىڭىزنى ئۇنۇتماڭ جۇمۇ',
			'shortcutsof'     : 'تېز كونۇپكىلار چەكلەنگەن',
			'dropFiles'       : 'ھۈججەتنى موشۇ يەرگە تاشلاڭ',
			'or'              : 'ياكى',
			'selectForUpload' : 'يۈكلىمەكچى بولغان ھۈججەتنى تاللاڭ',
			'moveFiles'       : 'يۆتكەش',
			'copyFiles'       : 'كۆچۈرۈش',
			'restoreFiles'    : 'تۈرلەرنى ئەسلىگە كەلتۈرۈش', // from v2.1.24 added 5.5.2017
			'rmFromPlaces'    : 'ھۈججەتلەرنى ئۆچۈرۈش',
			'aspectRatio'     : 'نىسبىتىنى ساقلاش',
			'scale'           : 'نىسبىتى',
			'width'           : 'ئۇزۇنلىقى',
			'height'          : 'ئىگىزلىكى',
			'resize'          : 'چوڭلىقىنى تەڭشەش',
			'crop'            : 'كېسىش',
			'rotate'          : 'پىقىرىتىش',
			'rotate-cw'       : 'سائەت ئىستىرىلكىسى بويىچە 90 گىرادۇس پىقىرىتىش',
			'rotate-ccw'      : 'سائەت ئىستىرىلكىسىنى تەتۈر يۆنىلىشى بويىچە 90گىرادۇس پىقىرىتىش',
			'degree'          : 'گىرادۇس',
			'netMountDialogTitle' : 'تور ئاۋازى', // added 18.04.2012
			'protocol'            : 'پىروتوكڭل', // added 18.04.2012
			'host'                : 'مۇلازىمىتىر', // added 18.04.2012
			'port'                : 'پورت', // added 18.04.2012
			'user'                : 'ئەزا', // added 18.04.2012
			'pass'                : 'ئىم', // added 18.04.2012
			'confirmUnmount'      : 'سىز $ 1 نى ھېسابلىمايسىز؟',  // from v2.1 added 30.04.2012
			'dropFilesBrowser': 'توركۆرگۈدىن ھۆججەتلەرنى تاشلاش ياكى چاپلاش', // from v2.1 added 30.05.2012
			'dropPasteFiles'  : 'ھۆججەتلەرنى بۇ يەرگە تاشلاڭ ، URL ياكى رەسىملەرنى چاپلاڭ', // from v2.1 added 07.04.2014
			'encoding'        : 'كودلاش', // from v2.1 added 19.12.2014
			'locale'          : 'Locale',   // from v2.1 added 19.12.2014
			'searchTarget'    : 'نىشان: $ 1',                // from v2.1 added 22.5.2015
			'searchMime'      : 'كىرگۈزۈش MIME تىپى ئارقىلىق ئىزدەش', // from v2.1 added 22.5.2015
			'owner'           : 'ئىگىسى', // from v2.1 added 20.6.2015
			'group'           : 'گۇرۇپپا', // from v2.1 added 20.6.2015
			'other'           : 'باشقىلىرى', // from v2.1 added 20.6.2015
			'execute'         : 'ئىجرا قىلىڭ', // from v2.1 added 20.6.2015
			'perm'            : 'ئىجازەت', // from v2.1 added 20.6.2015
			'mode'            : 'Mode', // from v2.1 added 20.6.2015
			'emptyFolder'     : 'ھۆججەت قىسقۇچ قۇرۇق', // from v2.1.6 added 30.12.2015
			'emptyFolderDrop' : 'ھۆججەت قىسقۇچ قۇرۇق \\ تۈر قوشۇش ئۈچۈن تاشلاش', // from v2.1.6 added 30.12.2015
			'emptyFolderLTap' : 'ھۆججەت قىسقۇچ قۇرۇق \\ تۈر قوشۇش ئۈچۈن ئۇزۇن چېكىش', // from v2.1.6 added 30.12.2015
			'quality'         : 'سۈپەت', // from v2.1.6 added 5.1.2016
			'autoSync'        : 'ئاپتوماتىك ماسقەدەملەش',  // from v2.1.6 added 10.1.2016
			'moveUp'          : 'يۆتكەڭ',  // from v2.1.6 added 18.1.2016
			'getLink'         : 'URL ئۇلىنىشىغا ئېرىشىڭ', // from v2.1.7 added 9.2.2016
			'selectedItems'   : 'تاللانغان تۈرلەر ($ 1)', // from v2.1.7 added 2.19.2016
			'folderId'        : 'ھۆججەت قىسقۇچ كىملىكى', // from v2.1.10 added 3.25.2016
			'offlineAccess'   : 'تورسىز زىيارەت قىلىشقا يول قويۇڭ', // from v2.1.10 added 3.25.2016
			'reAuth'          : 'قايتا دەلىللەش', // from v2.1.10 added 3.25.2016
			'nowLoading'      : 'ھازىر يۈكلەۋاتىدۇ ...', // from v2.1.12 added 4.26.2016
			'openMulti'       : 'كۆپ ھۆججەتلەرنى ئېچىڭ', // from v2.1.12 added 5.14.2016
			'openMultiConfirm': 'سىز $ 1 ھۆججىتىنى ئاچماقچى بولۇۋاتىسىز. توركۆرگۈدە ئاچماقچىمۇ؟', // from v2.1.12 added 5.14.2016
			'emptySearch'     : 'ئىزدەش نەتىجىسى ئىزدەش نىشانىدا قۇرۇق.', // from v2.1.12 added 5.16.2016
			'editingFile'     : 'ئۇ ھۆججەتنى تەھرىرلەۋاتىدۇ.', // from v2.1.13 added 6.3.2016
			'hasSelected'     : 'سىز $ 1 تۈرنى تاللىدىڭىز.', // from v2.1.13 added 6.3.2016
			'hasClipboard'    : 'چاپلاش تاختىسىدا 1 دوللارلىق نەرسە بار.', // from v2.1.13 added 6.3.2016
			'incSearchOnly'   : 'كۆپەيتىلگەن ئىزدەش پەقەت ھازىرقى كۆرۈنۈشتىن كەلگەن.', // from v2.1.13 added 6.30.2016
			'reinstate'       : 'Reinstate', // from v2.1.15 added 3.8.2016
			'complete'        : '$ 1 تامام', // from v2.1.15 added 21.8.2016
			'contextmenu'     : 'مەزمۇن تىزىملىكى', // from v2.1.15 added 9.9.2016
			'pageTurning'     : 'بەت ئايلانمىسى', // from v2.1.15 added 10.9.2016
			'volumeRoots'     : 'توم يىلتىزى', // from v2.1.16 added 16.9.2016
			'reset'           : 'ئەسلىگە قايتۇرۇش', // from v2.1.16 added 1.10.2016
			'bgcolor'         : 'تەگلىك رەڭگى', // from v2.1.16 added 1.10.2016
			'colorPicker'     : 'رەڭ تاللىغۇچ', // from v2.1.16 added 1.10.2016
			'8pxgrid'         : '8px Grid', // from v2.1.16 added 4.10.2016
			'enabled'         : 'قوزغىتىلدى', // from v2.1.16 added 4.10.2016
			'disabled'        : 'چەكلەنگەن', // from v2.1.16 added 4.10.2016
			'emptyIncSearch'  : 'نۆۋەتتىكى كۆرۈنۈشتە ئىزدەش نەتىجىسى قۇرۇق. \\ APress [Enter] ئىزدەش نىشانىنى كېڭەيتىش.', // from v2.1.16 added 5.10.2016
			'emptyLetSearch'  : 'نۆۋەتتىكى كۆرۈنۈشتە بىرىنچى ھەرىپ ئىزدەش نەتىجىسى قۇرۇق.', // from v2.1.23 added 24.3.2017
			'textLabel'       : 'تېكىست بەلگىسى', // from v2.1.17 added 13.10.2016
			'minsLeft'        : '1 مىنۇت قالدى', // from v2.1.17 added 13.11.2016
			'openAsEncoding'  : 'تاللانغان كودلاش ئارقىلىق قايتا ئېچىڭ', // from v2.1.19 added 2.12.2016
			'saveAsEncoding'  : 'تاللانغان كودلاش ئارقىلىق ساقلاڭ', // from v2.1.19 added 2.12.2016
			'selectFolder'    : 'ھۆججەت قىسقۇچنى تاللاڭ', // from v2.1.20 added 13.12.2016
			'firstLetterSearch': 'بىرىنچى خەت ئىزدەش', // from v2.1.23 added 24.3.2017
			'presets'         : 'ئالدىن بەلگىلەيدۇ', // from v2.1.25 added 26.5.2017
			'tooManyToTrash'  : 'ئۇ بەك كۆپ نەرسە بولغاچقا ئەخلەت ساندۇقىغا كىرەلمەيدۇ.', // from v2.1.25 added 9.6.2017
			'TextArea'        : 'TextArea', // from v2.1.25 added 14.6.2017
			'folderToEmpty'   : '«$ 1» ھۆججەت قىسقۇچىنى بىكار قىلىڭ.', // from v2.1.25 added 22.6.2017
			'filderIsEmpty'   : '«$ 1» ھۆججەت قىسقۇچىدا ھېچقانداق نەرسە يوق.', // from v2.1.25 added 22.6.2017
			'preference'      : 'مايىللىق', // from v2.1.26 added 28.6.2017
			'language'        : 'تىل', // from v2.1.26 added 28.6.2017
			'clearBrowserData': 'بۇ توركۆرگۈدە ساقلانغان تەڭشەكلەرنى قوزغىتىڭ', // from v2.1.26 added 28.6.2017
			'toolbarPref'     : 'قورالبالدىقى تەڭشىكى', // from v2.1.27 added 2.8.2017
			'charsLeft'       : '... 1 دوللار قالدى.',  // from v2.1.29 added 30.8.2017
			'linesLeft'       : '... $ 1 قۇر قالدى.',  // from v2.1.52 added 16.1.2020
			'sum'             : 'Sum', // from v2.1.29 added 28.9.2017
			'roughFileSize'   : 'ھۆججەت چوڭلۇقى', // from v2.1.30 added 2.11.2017
			'autoFocusDialog' : 'چاشقىنەك ئارقىلىق دىئالوگ ئېلېمېنتىغا دىققەت قىلىڭ',  // from v2.1.30 added 2.11.2017
			'select'          : 'تاللاڭ', // from v2.1.30 added 23.11.2017
			'selectAction'    : 'ھۆججەت تاللىغاندا ھەرىكەت', // from v2.1.30 added 23.11.2017
			'useStoredEditor' : 'ئالدىنقى قېتىم ئىشلىتىلگەن تەھرىرلىگۈچ بىلەن ئېچىڭ', // from v2.1.30 added 23.11.2017
			'selectinvert'    : 'تەتۈر تاللاش', // from v2.1.30 added 25.11.2017
			'renameMultiple'  : '$ 2 غا ئوخشاش $ 1 تاللانغان تۈرنىڭ ئىسمىنى ئۆزگەرتمەكچىمۇ؟ <br/> بۇنى ئەمەلدىن قالدۇرغىلى بولمايدۇ.', // from v2.1.31 added 4.12.2017
			'batchRename'     : 'گۇرۇپپا نامىنى ئۆزگەرتىش', // from v2.1.31 added 8.12.2017
			'plusNumber'      : '+ سان', // from v2.1.31 added 8.12.2017
			'asPrefix'        : 'ئالدى قوشۇلغۇچى قوشۇڭ', // from v2.1.31 added 8.12.2017
			'asSuffix'        : 'قوشۇمچى قوشۇڭ', // from v2.1.31 added 8.12.2017
			'changeExtention' : 'كېڭەيتىلمىنى ئۆزگەرتىش', // from v2.1.31 added 8.12.2017
			'columnPref'      : 'ستون تەڭشىكى (تىزىملىك كۆرۈنۈشى)', // from v2.1.32 added 6.2.2018
			'reflectOnImmediate' : 'بارلىق ئۆزگەرتىشلەر ئارخىپقا دەرھال ئەكىس ئەتتۈرىدۇ.', // from v2.1.33 added 2.3.2018
			'reflectOnUnmount'   : 'بۇ ئاۋازنى قاچىلىمىغۇچە ھەر قانداق ئۆزگىرىش ئەكس ئەتمەيدۇ.', // from v2.1.33 added 2.3.2018
			'unmountChildren' : 'بۇ ھەجىمگە ئورنىتىلغان تۆۋەندىكى توم (لار) مۇ ساناقسىز. ئۇنى ئۆچۈرەمسىز؟', // from v2.1.33 added 5.3.2018
			'selectionInfo'   : 'تاللاش ئۇچۇرى', // from v2.1.33 added 7.3.2018
			'hashChecker'     : 'ئالگورىزىملار ھۆججەتنى كۆرسىتىپ بېرىدۇ', // from v2.1.33 added 10.3.2018
			'infoItems'       : 'ئۇچۇر تۈرلىرى (تاللاش ئۇچۇر تاختىسى)', // from v2.1.38 added 28.3.2018
			'pressAgainToExit': 'چېكىنىش ئۈچۈن يەنە بىر قېتىم بېسىڭ.', // from v2.1.38 added 1.4.2018
			'toolbar'         : 'قورالبالدىقى', // from v2.1.38 added 4.4.2018
			'workspace'       : 'خىزمەت بوشلۇقى', // from v2.1.38 added 4.4.2018
			'dialog'          : 'Dialog', // from v2.1.38 added 4.4.2018
			'all'             : 'ھەممىسى', // from v2.1.38 added 4.4.2018
			'iconSize'        : 'سىنبەلگە چوڭلۇقى (سىنبەلگە كۆرۈنۈشى)', // from v2.1.39 added 7.5.2018
			'editorMaximized' : 'چوڭايتىلغان تەھرىرلىگۈچ كۆزنىكىنى ئېچىڭ', // from v2.1.40 added 30.6.2018
			'editorConvNoApi' : 'API نى ئۆزگەرتىش ھازىرچە بولمىغاچقا ، توربېكەتكە ئايلاندۇرۇڭ.', //from v2.1.40 added 8.7.2018
			'editorConvNeedUpload' : 'ئۆزگەرتىلگەندىن كېيىن ، چوقۇم ئۆزگەرتىلگەن ھۆججەتنى ساقلاش ئۈچۈن چوقۇم URL ئادرېسى ياكى چۈشۈرۈلگەن ھۆججەت بىلەن يۈكلىنىشىڭىز كېرەك.', //from v2.1.40 added 8.7.2018
			'convertOn'       : '$ 1 تور بېتىگە ئايلاندۇرۇڭ', // from v2.1.40 added 10.7.2018
			'integrations'    : 'بىرىكتۈرۈش', // from v2.1.40 added 11.7.2018
			'integrationWith' : 'بۇ elFinder نىڭ تۆۋەندىكى تاشقى مۇلازىمەتلىرى بىرلەشتۈرۈلگەن. ئىشلىتىشتىن بۇرۇن ئىشلىتىش شەرتلىرى ، مەخپىيەتلىك تۈزۈمى قاتارلىقلارنى تەكشۈرۈپ بېقىڭ.', // from v2.1.40 added 11.7.2018
			'showHidden'      : 'يوشۇرۇن تۈرلەرنى كۆرسەت', // from v2.1.41 added 24.7.2018
			'hideHidden'      : 'يوشۇرۇن نەرسىلەرنى يوشۇرۇش', // from v2.1.41 added 24.7.2018
			'toggleHidden'    : 'يوشۇرۇن تۈرلەرنى كۆرسىتىش / يوشۇرۇش', // from v2.1.41 added 24.7.2018
			'makefileTypes'   : '«يېڭى ھۆججەت» ئارقىلىق قوزغىتىدىغان ھۆججەت تىپلىرى', // from v2.1.41 added 7.8.2018
			'typeOfTextfile'  : 'تېكىست ھۆججىتىنىڭ تىپى', // from v2.1.41 added 7.8.2018
			'add'             : 'قوش', // from v2.1.41 added 7.8.2018
			'theme'           : 'Theme', // from v2.1.43 added 19.10.2018
			'default'         : 'سۈكۈتتىكى', // from v2.1.43 added 19.10.2018
			'description'     : 'چۈشەندۈرۈش', // from v2.1.43 added 19.10.2018
			'website'         : 'تور بېكەت', // from v2.1.43 added 19.10.2018
			'author'          : 'ئاپتور', // from v2.1.43 added 19.10.2018
			'email'           : 'ئېلخەت', // from v2.1.43 added 19.10.2018
			'license'         : 'ئىجازەتنامە', // from v2.1.43 added 19.10.2018
			'exportToSave'    : 'بۇ تۈرنى ساقلىغىلى بولمايدۇ. تەھرىرلەشنى يوقىتىپ قويۇشتىن ساقلىنىش ئۈچۈن كومپيۇتېرىڭىزغا ئېكسپورت قىلىشىڭىز كېرەك.', // from v2.1.44 added 1.12.2018
			'dblclickToSelect': 'ئۇنى تاللاش ئۈچۈن ھۆججەتنى قوش چېكىڭ.', // from v2.1.47 added 22.1.2019
			'useFullscreen'   : 'پۈتۈن ئېكران ھالىتىنى ئىشلىتىڭ', // from v2.1.47 added 19.2.2019

			/********************************** mimetypes **********************************/
			'kindUnknown'     : 'ئېنىق ئەمەس',
			'kindRoot'        : 'توم يىلتىز', // from v2.1.16 added 16.10.2016
			'kindFolder'      : 'ھۈججەت قىسقۇچ',
			'kindSelects'     : 'تاللاش', // from v2.1.29 added 29.8.2017
			'kindAlias'       : 'باشقا نامى',
			'kindAliasBroken' : 'باشقا نامى خاتا',
			// applications
			'kindApp'         : 'كود ھۈججىتى',
			'kindPostscript'  : 'Postscript ھۈججىتى',
			'kindMsOffice'    : 'Microsoft Office ھۈججىتى',
			'kindMsWord'      : 'Microsoft Word ھۈججىتى',
			'kindMsExcel'     : 'Microsoft Excel ھۈججىتى',
			'kindMsPP'        : 'Microsoft Powerpoint ھۈججىتى',
			'kindOO'          : 'Open Office ھۈججىتى',
			'kindAppFlash'    : 'Flash ھۈججىتى',
			'kindPDF'         : 'ئېلىپ يۈرۈشكە ئەپلىك ھۆججەت فورماتى (PDF)',
			'kindTorrent'     : 'Bittorrent ھۈججىتى',
			'kind7z'          : '7z ھۈججىتى',
			'kindTAR'         : 'TAR ھۈججىتى',
			'kindGZIP'        : 'GZIP ھۈججىتى',
			'kindBZIP'        : 'BZIP ھۈججىتى',
			'kindXZ'          : 'XZ ھۈججىتى',
			'kindZIP'         : 'ZIP ھۈججىتى',
			'kindRAR'         : 'RAR ھۈججىتى',
			'kindJAR'         : 'Java JAR ھۈججىتى',
			'kindTTF'         : 'True Type فونت',
			'kindOTF'         : 'Open Type فونت',
			'kindRPM'         : 'RPM',
			// texts
			'kindText'        : 'تېكىست',
			'kindTextPlain'   : 'تېكىست',
			'kindPHP'         : 'PHP ھۈججىتى',
			'kindCSS'         : 'CSS ھۈججىتى',
			'kindHTML'        : 'HTML ھۈججىتى',
			'kindJS'          : 'Javascript ھۈججىتى',
			'kindRTF'         : 'RTF ھۈججىتى',
			'kindC'           : 'C ھۈججىتى',
			'kindCHeader'     : 'C باش ھۈججىتى',
			'kindCPP'         : 'C++ ھۈججىتى',
			'kindCPPHeader'   : 'C++ باش ھۈججىتى',
			'kindShell'       : 'Unix سىكىرىپت ھۈججىتى',
			'kindPython'      : 'Python ھۈججىتى',
			'kindJava'        : 'Java ھۈججىتى',
			'kindRuby'        : 'Ruby ھۈججىتى',
			'kindPerl'        : 'Perl ھۈججىتى',
			'kindSQL'         : 'SQL ھۈججىتى',
			'kindXML'         : 'XML ھۈججىتى',
			'kindAWK'         : 'AWK ھۈججىتى',
			'kindCSV'         : 'CSV ھۈججىتى',
			'kindDOCBOOK'     : 'Docbook XML ھۈججىتى',
			'kindMarkdown'    : 'Markdown text', // added 20.7.2015
			// images
			'kindImage'       : 'رەسىم',
			'kindBMP'         : 'BMP رەسىم',
			'kindJPEG'        : 'JPEG رەسىم',
			'kindGIF'         : 'GIF رەسىم',
			'kindPNG'         : 'PNG رەسىم',
			'kindTIFF'        : 'TIFF رەسىم',
			'kindTGA'         : 'TGA رەسىم',
			'kindPSD'         : 'Adobe Photoshop رەسىم',
			'kindXBITMAP'     : 'X bitmap رەسىم',
			'kindPXM'         : 'Pixelmator رەسىم',
			// media
			'kindAudio'       : 'ئاۋاز',
			'kindAudioMPEG'   : 'MPEG ئاۋاز',
			'kindAudioMPEG4'  : 'MPEG-4 ئاۋاز',
			'kindAudioMIDI'   : 'MIDI ئاۋاز',
			'kindAudioOGG'    : 'Ogg Vorbis ئاۋاز',
			'kindAudioWAV'    : 'WAV ئاۋاز',
			'AudioPlaylist'   : 'MP3 قويۇش تىزىملىكى',
			'kindVideo'       : 'سىن',
			'kindVideoDV'     : 'DV سىن',
			'kindVideoMPEG'   : 'MPEG سىن',
			'kindVideoMPEG4'  : 'MPEG-4 سىن',
			'kindVideoAVI'    : 'AVI سىن',
			'kindVideoMOV'    : 'Quick Time سىن',
			'kindVideoWM'     : 'Windows Media سىن',
			'kindVideoFlash'  : 'Flash سىن',
			'kindVideoMKV'    : 'Matroska سىن',
			'kindVideoOGG'    : 'Ogg سىن'
		}
	};
}));

js/i18n/elfinder.sk.js000064400000104427151215013370010507 0ustar00/**
 * Slovenčina translation
 * @author RobiNN <kelcakrobo@gmail.com>
 * @author Jakub Ďuraš <jkblmr@gmail.com>
 * @version 2022-03-03
 */
 (function(root, factory) {
	if (typeof define === 'function' && define.amd) {
		define(['elfinder'], factory);
	} else if (typeof exports !== 'undefined') {
		module.exports = factory(require('elfinder'));
	} else {
		factory(root.elFinder);
	}
}(this, function(elFinder) {
	elFinder.prototype.i18.sk = {
		translator : 'RobiNN &lt;kelcakrobo@gmail.com&gt;, Jakub Ďuraš &lt;jkblmr@gmail.com&gt;',
		language   : 'Slovenčina',
		direction  : 'ltr',
		dateFormat : 'd.m.Y H:i', // will show like: 03.03.2022 11:36
		fancyDateFormat : '$1 H:i', // will show like: Dnes 11:36
		nonameDateFormat : 'ymd-His', // noname upload will show like: 220303-113626
		messages   : {
			'getShareText' : 'zdieľam',
			'Editor ': 'Editor kódu',

			/********************************** errors **********************************/
			'error'                : 'Chyba',
			'errUnknown'           : 'Neznáma chyba.',
			'errUnknownCmd'        : 'Neznámy príkaz.',
			'errJqui'              : 'Nesprávna jQuery UI konfigurácia. Selectable, draggable a droppable musia byť načítané.',
			'errNode'              : 'elFinder vyžaduje vytvorenie DOM elementu.',
			'errURL'               : 'Nesprávna elFinder konfigurácia! URL nie je definovaná.',
			'errAccess'            : 'Prístup zamietnutý.',
			'errConnect'           : 'Nepodarilo sa pripojiť do backendu.',
			'errAbort'             : 'Spojenie bolo prerušené.',
			'errTimeout'           : 'Časový limit vypršal.',
			'errNotFound'          : 'Backend nenájdený.',
			'errResponse'          : 'Nesprávna backend odpoveď.',
			'errConf'              : 'Nesprávna backend konfigurácia.',
			'errJSON'              : 'PHP JSON modul nie je nainštalovaný.',
			'errNoVolumes'         : 'Nie sú dostupné žiadne čitateľné média.',
			'errCmdParams'         : 'Nesprávne parametre pre príkaz "$1".',
			'errDataNotJSON'       : 'Dáta nie sú formátu JSON.',
			'errDataEmpty'         : 'Prázdne dáta.',
			'errCmdReq'            : 'Backend požiadavka požaduje názov príkazu.',
			'errOpen'              : 'Nie je možné otvoriť "$1".',
			'errNotFolder'         : 'Objekt nie je priečinok.',
			'errNotFile'           : 'Objekt nie je súbor.',
			'errRead'              : 'Nie je možné prečítať "$1".',
			'errWrite'             : 'Nie je možné písať do "$1".',
			'errPerm'              : 'Prístup zamietnutý.',
			'errLocked'            : '"$1" je uzamknutý a nemôže byť premenovaný, presunutý alebo odstránený.',
			'errExists'            : 'Položka s názvom "$1" už existuje.',
			'errInvName'           : 'Neplatný názov súboru.',
			'errInvDirname'        : 'Neplatný názov priečinka.',  // from v2.1.24 added 12.4.2017
			'errFolderNotFound'    : 'Priečinok nebol nájdený.',
			'errFileNotFound'      : 'Súbor nenájdený.',
			'errTrgFolderNotFound' : 'Cieľový priečinok "$1" sa nenašiel.',
			'errPopup'             : 'Prehliadač zabránil otvoreniu vyskakovacieho okna. Pre otvorenie súboru povoľte vyskakovacie okná.',
			'errMkdir'             : 'Nepodarilo sa vytvoriť priečinok "$1".',
			'errMkfile'            : 'Nepodarilo sa vytvoriť súbor "$1".',
			'errRename'            : 'Nepodarilo sa premenovať "$1".',
			'errCopyFrom'          : 'Kopírovanie súborov z média "$1" nie je povolené.',
			'errCopyTo'            : 'Kopírovanie súborov na médium "$1" nie je povolené.',
			'errMkOutLink'         : 'Nie je možné vytvoriť odkaz mimo koreňového zväzku.', // from v2.1 added 03.10.2015
			'errUpload'            : 'Chyba pri nahrávaní.',  // old name - errUploadCommon
			'errUploadFile'        : 'Nepodarilo sa nahrať "$1".', // old name - errUpload
			'errUploadNoFiles'     : 'Neboli nájdené žiadne súbory na nahranie.',
			'errUploadTotalSize'   : 'Dáta prekračujú maximálnu povolenú veľkosť.', // old name - errMaxSize
			'errUploadFileSize'    : 'Súbor prekračuje maximálnu povolenú veľkosť.', //  old name - errFileMaxSize
			'errUploadMime'        : 'Nepovolený typ súboru.',
			'errUploadTransfer'    : 'Problém s nahrávaním "$1".',
			'errUploadTemp'        : 'Nepodarilo sa vytvoriť dočasný súbor na nahranie.', // from v2.1 added 26.09.2015
			'errNotReplace'        : 'Objekt "$1" na tomto mieste už existuje a nemôže byť nahradený objektom iného typu.', // new
			'errReplace'           : 'Nie je možné nahradiť "$1".',
			'errSave'              : 'Nie je možné uložiť "$1".',
			'errCopy'              : 'Nie je možné kopírovať "$1".',
			'errMove'              : 'Nie je možné preniesť "$1".',
			'errCopyInItself'      : 'Nie je možné kopírovať "$1" do seba.',
			'errRm'                : 'Nie je možné vymazať "$1".',
			'errTrash'             : 'Nie je možné presunúť do koša.', // from v2.1.24 added 30.4.2017
			'errRmSrc'             : 'Nie je možné odstrániť zdrojový/é súbor/y.',
			'errExtract'           : 'Nie je možné extrahovať súbory z "$1".',
			'errArchive'           : 'Nie je možné vytvoriť archív.',
			'errArcType'           : 'Nepodporovaný typ archívu.',
			'errNoArchive'         : 'Súbor nie je archív alebo má nepodporovaný typ archívu.',
			'errCmdNoSupport'      : 'Backend nepodporuje tento príkaz.',
			'errReplByChild'       : 'Priečinok "$1" nemôže byť nahradený položkou, ktorú už obsahuje.',
			'errArcSymlinks'       : 'Z bezpečnostných dôvodov bolo zakázané extrahovanie archívov obsahujúcich symlinky, alebo súborov s nepovolenými názvami.', // edited 24.06.2012
			'errArcMaxSize'        : 'Súbory archívu prekračujú maximálnu povolenú veľkosť.',
			'errResize'            : 'Nie je možné zmeniť veľkosť "$1".',
			'errResizeDegree'      : 'Neplatný stupeň otočenia.',  // added 7.3.2013
			'errResizeRotate'      : 'Nie je možné otočiť obrázok.',  // added 7.3.2013
			'errResizeSize'        : 'Neplatná veľkosť obrázka.',  // added 7.3.2013
			'errResizeNoChange'    : 'Veľkosť obrázku sa nezmenila.',  // added 7.3.2013
			'errUsupportType'      : 'Nepodporovaný typ súboru.',
			'errNotUTF8Content'    : 'Súbor "$1" nie je v UTF-8 a nemôže byť upravený.',  // added 9.11.2011
			'errNetMount'          : 'Nie je možné pripojiť "$1".', // added 17.04.2012
			'errNetMountNoDriver'  : 'Nepodporovaný protokol.',     // added 17.04.2012
			'errNetMountFailed'    : 'Pripájanie zlyhalo.',         // added 17.04.2012
			'errNetMountHostReq'   : 'Hosť je požadovaný.', // added 18.04.2012
			'errSessionExpires'    : 'Vaša relácia vypršala kvôli nečinnosti.',
			'errCreatingTempDir'   : 'Nepodarilo sa vytvoriť dočasný adresár: "$1"',
			'errFtpDownloadFile'   : 'Nie je možné stiahnuť súbor z FTP: "$1"',
			'errFtpUploadFile'     : 'Nie je možné nahrať súbor na FTP: "$1"',
			'errFtpMkdir'          : 'Nedá sa vytvoriť vzdialený adresár na FTP: "$1"',
			'errArchiveExec'       : 'Chyba pri archivácii súborov: "$1"',
			'errExtractExec'       : 'Chyba pri extrahovaní súborov: "$1"',
			'errNetUnMount'        : 'Nepodarilo sa odpojiť', // from v2.1 added 30.04.2012
			'errConvUTF8'          : 'Nie je prevoditeľný na UTF-8', // from v2.1 added 08.04.2014
			'errFolderUpload'      : 'Vyskúšajte moderný prehliadač, ak chcete nahrať priečinok.', // from v2.1 added 26.6.2015
			'errSearchTimeout'     : 'Vypršal časový limit pri hľadaní "$1". Výsledok vyhľadávania je čiastočný.', // from v2.1 added 12.1.2016
			'errReauthRequire'     : 'Opätovné povolenie je potrebné.', // from v2.1.10 added 24.3.2016
			'errMaxTargets'        : 'Maximálny počet voliteľných položiek je $1.', // from v2.1.17 added 17.10.2016
			'errRestore'           : 'Nepodarilo sa obnoviť z koša. Cieľ obnovenia nie je možné identifikovať.', // from v2.1.24 added 3.5.2017
			'errEditorNotFound'    : 'Editor tohto typu súboru nebol nájdený.', // from v2.1.25 added 23.5.2017
			'errServerError'       : 'Vyskytla sa chyba na strane servera.', // from v2.1.25 added 16.6.2017
			'errEmpty'             : 'Nepodarilo sa vyprázdniť priečinok "$1".', // from v2.1.25 added 22.6.2017
			'moreErrors'           : 'Existujú ešte ďalšie $1 chyby.', // from v2.1.44 added 9.12.2018
			'errMaxMkdirs'         : 'Môžete vytvoriť až $1 priečinkov naraz.', // from v2.1.58 added 20.6.2021

			/******************************* commands names ********************************/
			'cmdarchive'   : 'Vytvoriť archív',
			'cmdback'      : 'Späť',
			'cmdcopy'      : 'Kopírovať',
			'cmdcut'       : 'Vystrihnúť',
			'cmddownload'  : 'Stiahnuť',
			'cmdduplicate' : 'Duplikovať',
			'cmdedit'      : 'Upraviť súbor',
			'cmdextract'   : 'Extrahovať súbory z archívu',
			'cmdforward'   : 'Ďalej',
			'cmdgetfile'   : 'Vybrať súbory',
			'cmdhelp'      : 'O tomto softvéri',
			'cmdhome'      : 'Domov',
			'cmdinfo'      : 'Info',
			'cmdmkdir'     : 'Nový priečinok',
			'cmdmkdirin'   : 'Do novej zložky', // from v2.1.7 added 19.2.2016
			'cmdmkfile'    : 'Nový súbor',
			'cmdopen'      : 'Otvoriť',
			'cmdpaste'     : 'Vložiť',
			'cmdquicklook' : 'Náhľad',
			'cmdreload'    : 'Obnoviť',
			'cmdrename'    : 'Premenovať',
			'cmdrm'        : 'Vymazať',
			'cmdtrash'     : 'Do koša', //from v2.1.24 added 29.4.2017
			'cmdrestore'   : 'Obnoviť', //from v2.1.24 added 3.5.2017
			'cmdsearch'    : 'Nájsť súbory',
			'cmdup'        : 'Prejsť do nadradeného priečinka',
			'cmdupload'    : 'Nahrať súbory',
			'cmdview'      : 'Pozrieť',
			'cmdresize'    : 'Zmeniť veľkosť obrázku',
			'cmdsort'      : 'Zoradiť',
			'cmdnetmount'  : 'Pripojiť sieťové médium', // added 18.04.2012
			'cmdnetunmount': 'Odpojiť', // from v2.1 added 30.04.2012
			'cmdplaces'    : 'Do umiestnení', // added 28.12.2014
			'cmdchmod'     : 'Zmeniť režim', // from v2.1 added 20.6.2015
			'cmdopendir'   : 'Otvoriť priečinok', // from v2.1 added 13.1.2016
			'cmdcolwidth'  : 'Resetovať šírku stĺpca', // from v2.1.13 added 12.06.2016
			'cmdfullscreen': 'Celá obrazovka', // from v2.1.15 added 03.08.2016
			'cmdmove'      : 'Posúvať', // from v2.1.15 added 21.08.2016
			'cmdempty'     : 'Vyprázdniť priečinok', // from v2.1.25 added 22.06.2017
			'cmdundo'      : 'Krok späť', // from v2.1.27 added 31.07.2017
			'cmdredo'      : 'Vykonať znova', // from v2.1.27 added 31.07.2017
			'cmdpreference': 'Preferencie', // from v2.1.27 added 03.08.2017
			'cmdselectall' : 'Vybrať všetko', // from v2.1.28 added 15.08.2017
			'cmdselectnone': 'Nič nevyberať', // from v2.1.28 added 15.08.2017
			'cmdselectinvert': 'Invertovať výber', // from v2.1.28 added 15.08.2017
			'cmdopennew'   : 'Otvoriť v novom okne', // from v2.1.38 added 3.4.2018
			'cmdhide'      : 'Skryť (Predvoľba)', // from v2.1.41 added 24.7.2018

			/*********************************** buttons ***********************************/
			'btnClose'  : 'Zavrieť',
			'btnSave'   : 'Uložiť',
			'btnRm'     : 'Vymazať',
			'btnApply'  : 'Použiť',
			'btnCancel' : 'Zrušiť',
			'btnNo'     : 'Nie',
			'btnYes'    : 'Áno',
			'btnMount'  : 'Pripojiť',  // added 18.04.2012
			'btnApprove': 'Ísť na $1 & schváliť', // from v2.1 added 26.04.2012
			'btnUnmount': 'Odpojiť', // from v2.1 added 30.04.2012
			'btnConv'   : 'Previesť', // from v2.1 added 08.04.2014
			'btnCwd'    : 'Tu',      // from v2.1 added 22.5.2015
			'btnVolume' : 'Médium',    // from v2.1 added 22.5.2015
			'btnAll'    : 'Všetko',       // from v2.1 added 22.5.2015
			'btnMime'   : 'MIME typ', // from v2.1 added 22.5.2015
			'btnFileName':'Názov súboru',  // from v2.1 added 22.5.2015
			'btnSaveClose': 'Uložiť & zavrieť', // from v2.1 added 12.6.2015
			'btnBackup' : 'Zálohovať', // fromv2.1 added 28.11.2015
			'btnRename'    : 'Premenovať',      // from v2.1.24 added 6.4.2017
			'btnRenameAll' : 'Premenovať všetko', // from v2.1.24 added 6.4.2017
			'btnPrevious' : 'Predchádzajúce ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnNext'     : 'Ďalšie ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnSaveAs'   : 'Uložiť ako', // from v2.1.25 added 24.5.2017

			/******************************** notifications ********************************/
			'ntfopen'     : 'Otváranie priečinka',
			'ntffile'     : 'Otváranie súboru',
			'ntfreload'   : 'Znovu-načítanie obsahu priečinka',
			'ntfmkdir'    : 'Vytváranie priečinka',
			'ntfmkfile'   : 'Vytváranie súborov',
			'ntfrm'       : 'Vymazanie položiek',
			'ntfcopy'     : 'Kopírovanie položiek',
			'ntfmove'     : 'Premiestnenie položiek',
			'ntfprepare'  : 'Kontrola existujúcich položiek',
			'ntfrename'   : 'Premenovanie súborov',
			'ntfupload'   : 'Nahrávanie súborov',
			'ntfdownload' : 'Sťahovanie súborov',
			'ntfsave'     : 'Uloženie súborov',
			'ntfarchive'  : 'Vytváranie archívu',
			'ntfextract'  : 'Extrahovanie súborov z archívu',
			'ntfsearch'   : 'Vyhľadávanie súborov',
			'ntfresize'   : 'Zmena veľkosti obrázkov',
			'ntfsmth'     : 'Počkajte prosím...',
			'ntfloadimg'  : 'Načítavanie obrázka',
			'ntfnetmount' : 'Pripájanie sieťového média', // added 18.04.2012
			'ntfnetunmount': 'Odpájanie sieťového média', // from v2.1 added 30.04.2012
			'ntfdim'      : 'Získanie rozmeru obrázka', // added 20.05.2013
			'ntfreaddir'  : 'Čítajú sa informácie o priečinku', // from v2.1 added 01.07.2013
			'ntfurl'      : 'Získanie adresy URL odkazu', // from v2.1 added 11.03.2014
			'ntfchmod'    : 'Zmena súboru', // from v2.1 added 20.6.2015
			'ntfpreupload': 'Overenie názvu nahravaného súboru', // from v2.1 added 31.11.2015
			'ntfzipdl'    : 'Vytvorenie súboru na stiahnutie', // from v2.1.7 added 23.1.2016
			'ntfparents'  : 'Získanie informácií o ceste', // from v2.1.17 added 2.11.2016
			'ntfchunkmerge': 'Spracovanie nahraného súboru', // from v2.1.17 added 2.11.2016
			'ntftrash'    : 'Vhadzovanie do koša', // from v2.1.24 added 2.5.2017
			'ntfrestore'  : 'Vykonávanie obnovy z koša', // from v2.1.24 added 3.5.2017
			'ntfchkdir'   : 'Kontrola cieľového priečinka', // from v2.1.24 added 3.5.2017
			'ntfundo'     : 'Zrušiť predchádzajúcu operáciu', // from v2.1.27 added 31.07.2017
			'ntfredo'     : 'Obnovenie predchádzajúceho zrušenia', // from v2.1.27 added 31.07.2017
			'ntfchkcontent' : 'Kontrola obsahu', // from v2.1.41 added 3.8.2018

			/*********************************** volumes *********************************/
			'volume_Trash' : 'Kôš', //from v2.1.24 added 29.4.2017

			/************************************ dates **********************************/
			'dateUnknown' : 'neznámy',
			'Today'       : 'Dnes',
			'Yesterday'   : 'Včera',
			'msJan'       : 'jan',
			'msFeb'       : 'feb',
			'msMar'       : 'Mar',
			'msApr'       : 'Apr',
			'msMay'       : 'Maj',
			'msJun'       : 'Jun',
			'msJul'       : 'Júl',
			'msAug'       : 'Aug',
			'msSep'       : 'sept',
			'msOct'       : 'Okt',
			'msNov'       : 'Nov',
			'msDec'       : 'dec',
			'January'     : 'Január',
			'February'    : 'Február',
			'March'       : 'Marec',
			'April'       : 'Apríl',
			'May'         : 'Máj',
			'June'        : 'Jún',
			'July'        : 'Júl',
			'August'      : 'augusta',
			'September'   : 'septembra',
			'October'     : 'Október',
			'November'    : 'novembra',
			'December'    : 'December',
			'Sunday'      : 'Nedeľa',
			'Monday'      : 'Pondelok',
			'Tuesday'     : 'Utorok',
			'Wednesday'   : 'Streda',
			'Thursday'    : 'Štvrtok',
			'Friday'      : 'Piatok',
			'Saturday'    : 'Sobota',
			'Sun'         : 'Ned',
			'Mon'         : 'Pon',
			'Tue'         : 'Ut',
			'Wed'         : 'Str',
			'Thu'         : 'Štv',
			'Fri'         : 'Pia',
			'Sat'         : 'Sob',

			/******************************** sort variants ********************************/
			'sortname'          : 'podľa názvu',
			'sortkind'          : 'podľa druhu',
			'sortsize'          : 'podľa veľkosti',
			'sortdate'          : 'podľa dátumu',
			'sortFoldersFirst'  : 'Najskôr priečinky',
			'sortperm'          : 'podľa povolenia', // from v2.1.13 added 13.06.2016
			'sortmode'          : 'podľa módu',       // from v2.1.13 added 13.06.2016
			'sortowner'         : 'podľa majiteľa',      // from v2.1.13 added 13.06.2016
			'sortgroup'         : 'podľa skupiny',      // from v2.1.13 added 13.06.2016
			'sortAlsoTreeview'  : 'Tiež stromové zobrazenie',  // from v2.1.15 added 01.08.2016

			/********************************** new items **********************************/
			'untitled file.txt' : 'Nový súbor.txt', // added 10.11.2015
			'untitled folder'   : 'Nový priečinok',   // added 10.11.2015
			'Archive'           : 'Nový archív',  // from v2.1 added 10.11.2015
			'untitled file'     : 'Nový súbor.$1',  // from v2.1.41 added 6.8.2018
			'extentionfile'     : '$1 súbor',    // from v2.1.41 added 6.8.2018
			'extentiontype'     : '$1: $2',      // from v2.1.43 added 17.10.2018

			/********************************** messages **********************************/
			'confirmReq'      : 'Potrebné potvrdenie',
			'confirmRm'       : 'Určite chcete vymazať súbory?<br/>Nie je to možné vrátiť späť!',
			'confirmRepl'     : 'Nahradiť starý súbor za nový? (Ak obsahuje priečinky, bude zlúčené. Ak chcete zálohovať a nahradiť, vyberte možnosť Zálohovať.)',
			'confirmRest'     : 'Nahradiť existujúcu položku s položkou v koši?', // fromv2.1.24 added 5.5.2017
			'confirmConvUTF8' : 'Nie je v UTF-8<br/>Previesť na UTF-8?<br/>Obsah bude v UTF-8 po uložení konverzie.', // from v2.1 added 08.04.2014
			'confirmNonUTF8'  : 'Kódovanie tohto súboru nemohlo byť detekované. Pre úpravu dočasne potrebujete previesť na UTF-8 .<br/>Prosím, vyberte kódovanie znakov tohto súboru.', // from v2.1.19 added 28.11.2016
			'confirmNotSave'  : 'Bol upravený.<br/>Ak zmeny neuložíte, stratíte vykonanú prácu.', // from v2.1 added 15.7.2015
			'confirmTrash'    : 'Naozaj chcete presunúť položky do koša?', //from v2.1.24 added 29.4.2017
			'confirmMove'     : 'Naozaj chcete presunúť položky do "$1"?', //from v2.1.50 added 27.7.2019
			'apllyAll'        : 'Použiť na všetky',
			'name'            : 'Názov',
			'size'            : 'Veľkosť',
			'perms'           : 'Povolenia',
			'modify'          : 'Zmenené',
			'kind'            : 'Druh',
			'read'            : 'čítať',
			'write'           : 'zapisovať',
			'noaccess'        : 'bez prístupu',
			'and'             : 'a',
			'unknown'         : 'neznámy',
			'selectall'       : 'Vybrať všetky položky',
			'selectfiles'     : 'Vybrať položku(y)',
			'selectffile'     : 'Vybrať prvú položku',
			'selectlfile'     : 'Vybrať poslednú položku',
			'viewlist'        : 'Zoznam',
			'viewicons'       : 'Ikony',
			'viewSmall'       : 'Malé ikony', // from v2.1.39 added 22.5.2018
			'viewMedium'      : 'Stredné ikony', // from v2.1.39 added 22.5.2018
			'viewLarge'       : 'Veľké ikony', // from v2.1.39 added 22.5.2018
			'viewExtraLarge'  : 'Extra veľké ikony', // from v2.1.39 added 22.5.2018
			'places'          : 'Miesta',
			'calc'            : 'Prepočítavanie',
			'path'            : 'Cesta',
			'aliasfor'        : 'Alias pre',
			'locked'          : 'Uzamknuté',
			'dim'             : 'Rozmery',
			'files'           : 'Súbory',
			'folders'         : 'Priečinky',
			'items'           : 'Položky',
			'yes'             : 'áno',
			'no'              : 'nie',
			'link'            : 'Odkaz',
			'searcresult'     : 'Výsledky hľadania',
			'selected'        : 'zvolené položky',
			'about'           : 'O aplikácii',
			'shortcuts'       : 'Skratky',
			'help'            : 'Pomoc',
			'webfm'           : 'Webový správca súborov',
			'ver'             : 'Verzia',
			'protocolver'     : 'verzia protokolu',
			'homepage'        : 'Domovská stránka',
			'docs'            : 'Dokumentácia',
			'github'          : 'Pozri nás na Githube',
			'twitter'         : 'Nasleduj nás na Twitteri',
			'facebook'        : 'Pripoj sa k nám na Facebooku',
			'team'            : 'Tím',
			'chiefdev'        : 'Hlavný vývojár',
			'developer'       : 'Vývojár',
			'contributor'     : 'Prispievateľ',
			'maintainer'      : 'Správca',
			'translator'      : 'Prekladateľ',
			'icons'           : 'Ikony',
			'dontforget'      : 'a nezabudnite si plavky',
			'shortcutsof'     : 'Skratky nie sú povolené',
			'dropFiles'       : 'Sem pretiahnite súbory',
			'or'              : 'alebo',
			'selectForUpload' : 'Vyberte súbory',
			'moveFiles'       : 'Premiestniť súbory',
			'copyFiles'       : 'Kopírovať súbory',
			'restoreFiles'    : 'Obnoviť položky', // from v2.1.24 added 5.5.2017
			'rmFromPlaces'    : 'Odstrániť z umiestnení',
			'aspectRatio'     : 'Pomer zobrazenia',
			'scale'           : 'Mierka',
			'width'           : 'Šírka',
			'height'          : 'Výška',
			'resize'          : 'Zmeniť veľkosť',
			'crop'            : 'Orezať',
			'rotate'          : 'Otočiť',
			'rotate-cw'       : 'Otočiť o 90 stupňov (v smere h.r.)',
			'rotate-ccw'      : 'Otočiť o 90 stupňov (proti smeru)',
			'degree'          : '°',
			'netMountDialogTitle' : 'Pripojiť sieťové médium', // added 18.04.2012
			'protocol'            : 'Protokol', // added 18.04.2012
			'host'                : 'Hosť', // added 18.04.2012
			'port'                : 'Port', // added 18.04.2012
			'user'                : 'Užívateľ', // added 18.04.2012
			'pass'                : 'Heslo', // added 18.04.2012
			'confirmUnmount'      : 'Naozaj chcete odpojiť $1?',  // from v2.1 added 30.04.2012
			'dropFilesBrowser': 'Premiestnite alebo presuňte súbory z prehliadača', // from v2.1 added 30.05.2012
			'dropPasteFiles'  : 'Tu premiestnite alebo presuňte súbory a adresy URL', // from v2.1 added 07.04.2014
			'encoding'        : 'Kódovanie', // from v2.1 added 19.12.2014
			'locale'          : 'Lokalizácia',   // from v2.1 added 19.12.2014
			'searchTarget'    : 'Cieľ: $1',                // from v2.1 added 22.5.2015
			'searchMime'      : 'Vyhľadávanie podľa vstupného MIME typu', // from v2.1 added 22.5.2015
			'owner'           : 'Majiteľ', // from v2.1 added 20.6.2015
			'group'           : 'Skupina', // from v2.1 added 20.6.2015
			'other'           : 'Ostatné', // from v2.1 added 20.6.2015
			'execute'         : 'Spustiť', // from v2.1 added 20.6.2015
			'perm'            : 'Povolenie', // from v2.1 added 20.6.2015
			'mode'            : 'Režim', // from v2.1 added 20.6.2015
			'emptyFolder'     : 'Priečinok je prázdny', // from v2.1.6 added 30.12.2015
			'emptyFolderDrop' : 'Priečinok je prázdny\\A Premiestnite alebo presuňte položky', // from v2.1.6 added 30.12.2015
			'emptyFolderLTap' : 'Priečinok je prázdny\\A Dlhým kliknutím pridáte položky', // from v2.1.6 added 30.12.2015
			'quality'         : 'Kvalita', // from v2.1.6 added 5.1.2016
			'autoSync'        : 'Automatická synchronizácia',  // from v2.1.6 added 10.1.2016
			'moveUp'          : 'Posunúť nahor',  // from v2.1.6 added 18.1.2016
			'getLink'         : 'Získať URL odkaz', // from v2.1.7 added 9.2.2016
			'selectedItems'   : 'Vybraté položky ($1)', // from v2.1.7 added 2.19.2016
			'folderId'        : 'ID priečinka', // from v2.1.10 added 3.25.2016
			'offlineAccess'   : 'Povoliť prístup v offline režime', // from v2.1.10 added 3.25.2016
			'reAuth'          : 'Znova overiť', // from v2.1.10 added 3.25.2016
			'nowLoading'      : 'Práve načítava...', // from v2.1.12 added 4.26.2016
			'openMulti'       : 'Otvorenie viacerých súborov', // from v2.1.12 added 5.14.2016
			'openMultiConfirm': 'Pokúšate sa otvoriť súbor $1. Naozaj ho chcete otvoriť v prehliadači?', // from v2.1.12 added 5.14.2016
			'emptySearch'     : 'Výsledky vyhľadávania sú prázdne v hľadanom cieli.', // from v2.1.12 added 5.16.2016
			'editingFile'     : 'Je to úprava súboru.', // from v2.1.13 added 6.3.2016
			'hasSelected'     : 'Vybrali ste $1 položky.', // from v2.1.13 added 6.3.2016
			'hasClipboard'    : 'Máte $1 položky v schránke.', // from v2.1.13 added 6.3.2016
			'incSearchOnly'   : 'Prírastkové hľadanie je iba z aktuálneho zobrazenia.', // from v2.1.13 added 6.30.2016
			'reinstate'       : 'Obnovovanie', // from v2.1.15 added 3.8.2016
			'complete'        : '$1: kompletné', // from v2.1.15 added 21.8.2016
			'contextmenu'     : 'Kontextové menu', // from v2.1.15 added 9.9.2016
			'pageTurning'     : 'Otáčanie stránky', // from v2.1.15 added 10.9.2016
			'volumeRoots'     : 'Korene média', // from v2.1.16 added 16.9.2016
			'reset'           : 'Resetovať', // from v2.1.16 added 1.10.2016
			'bgcolor'         : 'Farba pozadia', // from v2.1.16 added 1.10.2016
			'colorPicker'     : 'Výber farby', // from v2.1.16 added 1.10.2016
			'8pxgrid'         : '8px mriežka', // from v2.1.16 added 4.10.2016
			'enabled'         : 'Povolené', // from v2.1.16 added 4.10.2016
			'disabled'        : 'Zakázané', // from v2.1.16 added 4.10.2016
			'emptyIncSearch'  : 'Výsledky vyhľadávania sú prázdne v aktuálnom zobrazení. Stlačením tlačidla [Enter] rozšírite vyhľadávanie cieľa.', // from v2.1.16 added 5.10.2016
			'emptyLetSearch'  : 'Výsledky vyhľadávania prvého listu sú v aktuálnom zobrazení prázdne.', // from v2.1.23 added 24.3.2017
			'textLabel'       : 'Nápis textu', // from v2.1.17 added 13.10.2016
			'minsLeft'        : '$1 minút ostáva', // from v2.1.17 added 13.11.2016
			'openAsEncoding'  : 'Otvoriť s vybratým kódovaním', // from v2.1.19 added 2.12.2016
			'saveAsEncoding'  : 'Uložiť s vybratým kódovaním', // from v2.1.19 added 2.12.2016
			'selectFolder'    : 'Vyberte priečinok', // from v2.1.20 added 13.12.2016
			'firstLetterSearch': 'Hľadanie prvého listu', // from v2.1.23 added 24.3.2017
			'presets'         : 'Presety', // from v2.1.25 added 26.5.2017
			'tooManyToTrash'  : 'Je to príliš veľa položiek, takže sa nemôže dostať do koša.', // from v2.1.25 added 9.6.2017
			'TextArea'        : 'Textarea', // from v2.1.25 added 14.6.2017
			'folderToEmpty'   : 'Vyprázdniť priečinok "$1".', // from v2.1.25 added 22.6.2017
			'filderIsEmpty'   : 'V priečinku "$1" nie sú žiadne položky.', // from v2.1.25 added 22.6.2017
			'preference'      : 'Preferencie', // from v2.1.26 added 28.6.2017
			'language'        : 'Nastavenie jazyka', // from v2.1.26 added 28.6.2017
			'clearBrowserData': 'Inicializujte nastavenia uložené v tomto prehliadači', // from v2.1.26 added 28.6.2017
			'toolbarPref'     : 'Nastavenie panela s nástrojmi', // from v2.1.27 added 2.8.2017
			'charsLeft'       : '...$1 znakov ostáva.',  // from v2.1.29 added 30.8.2017
			'linesLeft'       : '...$1 riadkov ostáva.',  // from v2.1.52 added 16.1.2020
			'sum'             : 'Súčet', // from v2.1.29 added 28.9.2017
			'roughFileSize'   : 'Hrubá veľkosť súboru', // from v2.1.30 added 2.11.2017
			'autoFocusDialog' : 'Zameranie na prvok dialógu s mouseover',  // from v2.1.30 added 2.11.2017
			'select'          : 'Vybrať', // from v2.1.30 added 23.11.2017
			'selectAction'    : 'Akcia pri vybranom súbore', // from v2.1.30 added 23.11.2017
			'useStoredEditor' : 'Otvoriť pomocou naposledy použitého editora', // from v2.1.30 added 23.11.2017
			'selectinvert'    : 'Invertovať výber položiek', // from v2.1.30 added 25.11.2017
			'renameMultiple'  : 'Naozaj chcete premenovať $1 vybraných položiek, ako napríklad $2<br/>Nie je to možné vrátiť späť!', // from v2.1.31 added 4.12.2017
			'batchRename'     : 'Batch premenovanie', // from v2.1.31 added 8.12.2017
			'plusNumber'      : '+ Číslo', // from v2.1.31 added 8.12.2017
			'asPrefix'        : 'Pridať predponu', // from v2.1.31 added 8.12.2017
			'asSuffix'        : 'Pridať príponu', // from v2.1.31 added 8.12.2017
			'changeExtention' : 'Zmeniť príponu', // from v2.1.31 added 8.12.2017
			'columnPref'      : 'Nastavenia stĺpcov (zoznamové zobrazenie)', // from v2.1.32 added 6.2.2018
			'reflectOnImmediate' : 'Všetky zmeny sa okamžite premietnu do archívu.', // from v2.1.33 added 2.3.2018
			'reflectOnUnmount'   : 'Akékoľvek zmeny sa neodzrkadľujú, kým sa toto médium neodinštaluje.', // from v2.1.33 added 2.3.2018
			'unmountChildren' : 'Nasledujúce médium(a) pripojené v tomto médiu je tiež odpojené. Určite ho odpojiť?', // from v2.1.33 added 5.3.2018
			'selectionInfo'   : 'Informácie o výbere', // from v2.1.33 added 7.3.2018
			'hashChecker'     : 'Algoritmy na zobrazenie hashu súborov', // from v2.1.33 added 10.3.2018
			'infoItems'       : 'Informačné položky (panel s informáciami o výbere)', // from v2.1.38 added 28.3.2018
			'pressAgainToExit': 'Opätovným stlačením opustíte.', // from v2.1.38 added 1.4.2018
			'toolbar'         : 'Panel nástrojov', // from v2.1.38 added 4.4.2018
			'workspace'       : 'Pracovný priestor', // from v2.1.38 added 4.4.2018
			'dialog'          : 'Dialóg', // from v2.1.38 added 4.4.2018
			'all'             : 'Všetko', // from v2.1.38 added 4.4.2018
			'iconSize'        : 'Veľkosť ikony (zobrazenie ikon)', // from v2.1.39 added 7.5.2018
			'editorMaximized' : 'Otvorte maximalizované okno editora', // from v2.1.40 added 30.6.2018
			'editorConvNoApi' : 'Pretože konverzia podľa rozhrania API momentálne nie je k dispozícii, skonvertujte na webovej stránke.', //from v2.1.40 added 8.7.2018
			'editorConvNeedUpload' : 'Po konverzii musíte nahrať skonvertovaný súbor pomocou URL položky alebo stiahnutý súbor na uloženie skonvertovaného súboru.', //from v2.1.40 added 8.7.2018
			'convertOn'       : 'Konvertovať na stránke $1', // from v2.1.40 added 10.7.2018
			'integrations'    : 'Integrácie', // from v2.1.40 added 11.7.2018
			'integrationWith' : 'Tento elFinder má integrované nasledujúce externé služby. Pred použitím skontrolujte podmienky používania, zásady ochrany osobných údajov atď.', // from v2.1.40 added 11.7.2018
			'showHidden'      : 'Zobraziť skryté položky', // from v2.1.41 added 24.7.2018
			'hideHidden'      : 'Skryť skryté položky', // from v2.1.41 added 24.7.2018
			'toggleHidden'    : 'Zobraziť/skryť skryté položky', // from v2.1.41 added 24.7.2018
			'makefileTypes'   : 'Typy súborov, ktoré sa majú povoliť pomocou "Nový súbor"', // from v2.1.41 added 7.8.2018
			'typeOfTextfile'  : 'Typ textového súboru', // from v2.1.41 added 7.8.2018
			'add'             : 'Pridať', // from v2.1.41 added 7.8.2018
			'theme'           : 'Téma', // from v2.1.43 added 19.10.2018
			'default'         : 'Predvolená', // from v2.1.43 added 19.10.2018
			'description'     : 'Popis', // from v2.1.43 added 19.10.2018
			'website'         : 'Stránka', // from v2.1.43 added 19.10.2018
			'author'          : 'Autor', // from v2.1.43 added 19.10.2018
			'email'           : 'E-mail', // from v2.1.43 added 19.10.2018
			'license'         : 'Licencia', // from v2.1.43 added 19.10.2018
			'exportToSave'    : 'Túto položku nemožno uložiť. Ak chcete zabrániť strate úprav, musíte ju exportovať do počítača.', // from v2.1.44 added 1.12.2018
			'dblclickToSelect': 'Dvakrát kliknite na súbor a vyberte ho.', // from v2.1.47 added 22.1.2019
			'useFullscreen'   : 'Použiť režim celej obrazovky', // from v2.1.47 added 19.2.2019

			/********************************** mimetypes **********************************/
			'kindUnknown'     : 'Neznámy',
			'kindRoot'        : 'Koreň média', // from v2.1.16 added 16.10.2016
			'kindFolder'      : 'Priečinok',
			'kindSelects'     : 'Výbery', // from v2.1.29 added 29.8.2017
			'kindAlias'       : 'alias',
			'kindAliasBroken' : 'Porušený alias',
			// applications
			'kindApp'         : 'Aplikácia',
			'kindPostscript'  : 'Postscript dokument',
			'kindMsOffice'    : 'Microsoft Office dokument',
			'kindMsWord'      : 'Microsoft Word dokument',
			'kindMsExcel'     : 'Microsoft Excel dokument',
			'kindMsPP'        : 'Microsoft Powerpoint prezentácia',
			'kindOO'          : 'Open Office dokument',
			'kindAppFlash'    : 'Flashová aplikácia',
			'kindPDF'         : 'Portable Document Format (PDF)',
			'kindTorrent'     : 'Bittorrent súbor',
			'kind7z'          : '7z archív',
			'kindTAR'         : 'TAR archív',
			'kindGZIP'        : 'GZIP archív',
			'kindBZIP'        : 'BZIP archív',
			'kindXZ'          : 'XZ archív',
			'kindZIP'         : 'ZIP archív',
			'kindRAR'         : 'RAR archív',
			'kindJAR'         : 'Java JAR súbor',
			'kindTTF'         : 'True Type písmo',
			'kindOTF'         : 'Otvorte písmo Type',
			'kindRPM'         : 'RPM balík',
			// texts
			'kindText'        : 'Textový document',
			'kindTextPlain'   : 'Obyčajný text',
			'kindPHP'         : 'PHP zdrojový kód',
			'kindCSS'         : 'Kaskádové štýly (CSS)',
			'kindHTML'        : 'HTML dokument',
			'kindJS'          : 'Javascript zdrojový kód',
			'kindRTF'         : 'Formát RTF',
			'kindC'           : 'C zdrojový kód',
			'kindCHeader'     : 'C header zdrojový kód',
			'kindCPP'         : 'C++ zdrojový kód',
			'kindCPPHeader'   : 'C++ header zdrojový kód',
			'kindShell'       : 'Unix shell skript',
			'kindPython'      : 'Python zdrojový kód',
			'kindJava'        : 'Java zdrojový kód',
			'kindRuby'        : 'Ruby zdrojový kód',
			'kindPerl'        : 'Perl zdrojový kód',
			'kindSQL'         : 'SQL zdrojový kód',
			'kindXML'         : 'XML dokument',
			'kindAWK'         : 'AWK zdrojový kód',
			'kindCSV'         : 'Čiarkou oddeľované hodnoty',
			'kindDOCBOOK'     : 'Docbook XML dokument',
			'kindMarkdown'    : 'Text označenia', // added 20.7.2015
			// images
			'kindImage'       : 'Obrázok',
			'kindBMP'         : 'BMP obrázok',
			'kindJPEG'        : 'JPEG obrázok',
			'kindGIF'         : 'GIF obrázok',
			'kindPNG'         : 'PNG obrázok',
			'kindTIFF'        : 'TIFF obrázok',
			'kindTGA'         : 'TGA obrázok',
			'kindPSD'         : 'Adobe Photoshop obrázok',
			'kindXBITMAP'     : 'X bitmap obrázok',
			'kindPXM'         : 'Pixelmator obrázok',
			// media
			'kindAudio'       : 'Zvukový súbor',
			'kindAudioMPEG'   : 'MPEG zvuk',
			'kindAudioMPEG4'  : 'MPEG-4 zvuk',
			'kindAudioMIDI'   : 'MIDI zvuk',
			'kindAudioOGG'    : 'Ogg Vorbis zvuk',
			'kindAudioWAV'    : 'WAV zvuk',
			'AudioPlaylist'   : 'MP3 playlist',
			'kindVideo'       : 'Video súbor',
			'kindVideoDV'     : 'DV video',
			'kindVideoMPEG'   : 'MPEG video',
			'kindVideoMPEG4'  : 'MPEG-4 video',
			'kindVideoAVI'    : 'AVI video',
			'kindVideoMOV'    : 'Quick Time video',
			'kindVideoWM'     : 'Windows Media video',
			'kindVideoFlash'  : 'Flash video',
			'kindVideoMKV'    : 'Matroska video',
			'kindVideoOGG'    : 'Ogg video'
		}
	};
}));

js/i18n/elfinder.id.js000064400000102244151215013370010461 0ustar00/**
 * Bahasa Indonesia translation
 * @author Suyadi <1441177004009@student.unsika.ac.id>
 * @author Ammar Faizi <ammarfaizi2@gmail.com>
 * @version 2022-03-02
 */
 (function(root, factory) {
	if (typeof define === 'function' && define.amd) {
		define(['elfinder'], factory);
	} else if (typeof exports !== 'undefined') {
		module.exports = factory(require('elfinder'));
	} else {
		factory(root.elFinder);
	}
}(this, function(elFinder) {
	elFinder.prototype.i18.id = {
		translator : 'Suyadi &lt;1441177004009@student.unsika.ac.id&gt;, Ammar Faizi &lt;ammarfaizi2@gmail.com&gt;',
		language   : 'Bahasa Indonesia',
		direction  : 'ltr',
		dateFormat : 'j F, Y H:i', // will show like: 2 Maret, 2022 12:14
		fancyDateFormat : '$1 H:i', // will show like: Hari ini 12:14
		nonameDateFormat : 'd m Y - H : i : s', // noname upload will show like: 02 03 2022 - 12 : 14 : 15
		messages   : {
			'getShareText' : 'Membagikan',
			'Editor ': 'Editor Kode',

			/********************************** errors **********************************/
			'error'                : 'Kesalahan',
			'errUnknown'           : 'Kesalahan tak dikenal.',
			'errUnknownCmd'        : 'Perintah tak dikenal.',
			'errJqui'              : 'Konfigurasi jQuery UI tidak valid. Komponen pemilih, penyeret dan penaruh harus disertakan.',
			'errNode'              : 'elFinder membutuhkan pembuatan elemen DOM.',
			'errURL'               : 'Konfigurasi elFinder tidak valid! opsi URL belum diatur.',
			'errAccess'            : 'Akses ditolak.',
			'errConnect'           : 'Tidak dapat tersambung ke backend.',
			'errAbort'             : 'Koneksi dibatalkan.',
			'errTimeout'           : 'Waktu koneksi habis.',
			'errNotFound'          : 'Backend tidak ditemukan.',
			'errResponse'          : 'Respon backend tidak valid.',
			'errConf'              : 'Konfigurasi elFinder tidak valid.',
			'errJSON'              : 'Modul PHP JSON belum terpasang.',
			'errNoVolumes'         : 'Tidak tersedia ruang kosong.',
			'errCmdParams'         : 'Parameter perintah "$1" tidak valid.',
			'errDataNotJSON'       : 'Data bukan merupakan JSON.',
			'errDataEmpty'         : 'Data masih kosong.',
			'errCmdReq'            : 'Permintaan ke backend membutuhkan nama perintah.',
			'errOpen'              : 'Tidak dapat membuka "$1".',
			'errNotFolder'         : 'Obyek ini bukan folder.',
			'errNotFile'           : 'Obyek ini bukan berkas.',
			'errRead'              : 'Tidak dapat membaca "$1".',
			'errWrite'             : 'Tidak dapat menulis ke "$1".',
			'errPerm'              : 'Ijin ditolak.',
			'errLocked'            : '"$1" ini terkunci dan tak dapat dipidahkan, diubah atau dihapus.',
			'errExists'            : 'Berkas bernama "$1" sudah ada.',
			'errInvName'           : 'Nama berkas tidak valid.',
			'errInvDirname'        : 'Nama folder salah.',  // from v2.1.24 added 12.4.2017
			'errFolderNotFound'    : 'Folder tidak ditemukan.',
			'errFileNotFound'      : 'Berkas tidak ditemukan.',
			'errTrgFolderNotFound' : 'Folder tujuan "$1" tidak ditemukan.',
			'errPopup'             : 'Peramban anda mencegah untuk membuka jendela munculan. Untuk dapat membuka berkas ini ubah pengaturan pada peramban anda.',
			'errMkdir'             : 'Tidak dapat membuat folder "$1".',
			'errMkfile'            : 'Tidak dapat membuat berkas "$1".',
			'errRename'            : 'Tidak dapat mengubah nama "$1".',
			'errCopyFrom'          : 'Tidak diizinkan menyalin berkas dari volume "$1".',
			'errCopyTo'            : 'tidak diizinkan menyalin berkas ke volume "$1".',
			'errMkOutLink'         : 'Tidak dapat membuat tautan diluar volume root.', // from v2.1 added 03.10.2015
			'errUpload'            : 'Kesalahan saat mengunggah.',  // old name - errUploadCommon
			'errUploadFile'        : 'Tidak dapat mengunggah "$1".', // old name - errUpload
			'errUploadNoFiles'     : 'Tak ada berkas untuk diunggah.',
			'errUploadTotalSize'   : 'Data melampaui ukuran yang diperbolehkan.', // old name - errMaxSize
			'errUploadFileSize'    : 'Berkas melampaui ukuran yang diperbolehkan.', //  old name - errFileMaxSize
			'errUploadMime'        : 'Jenis berkas ini tidak diijinkan.',
			'errUploadTransfer'    : 'Kesalahan transfer "$1".',
			'errUploadTemp'        : 'Tidak dapat membuat file sementara untuk diupload.', // from v2.1 added 26.09.2015
			'errNotReplace'        : 'Obyek "$1" sudah ada di lokasi ini dan tidak dapat ditimpa oleh obyek jenis lain.', // new
			'errReplace'           : 'Tidak dapat menimpa "$1".',
			'errSave'              : 'Tidak dapat menyimpan "$1".',
			'errCopy'              : 'Tidak dapat menyalin "$1".',
			'errMove'              : 'Tidak dapat memindahkan "$1".',
			'errCopyInItself'      : 'Tidak dapat menyalin "$1" ke dirinya sendiri.',
			'errRm'                : 'Tidak dapat menghapus "$1".',
			'errTrash'             : 'Tidak dapat masuk ke tempat sampah.', // from v2.1.24 added 30.4.2017
			'errRmSrc'             : 'Tidak dapat menghapus sumber berkas.',
			'errExtract'           : 'Tidak dapat mengekstrak berkas dari "$1".',
			'errArchive'           : 'Tidak dapat membuat arsip.',
			'errArcType'           : 'Jenis arsip tidak didukung.',
			'errNoArchive'         : 'Berkas ini bukan arsip atau arsip jenis ini tidak didukung.',
			'errCmdNoSupport'      : 'Backend tidak mendukung perintah ini.',
			'errReplByChild'       : 'Folder “$1” tidak dapat ditimpa dengan berkas didalamnya.',
			'errArcSymlinks'       : 'Untuk keamanan tak diijinkan mengekstrak arsip berisi symlink atau jenis berkas yang tak diijinkan.', // edited 24.06.2012
			'errArcMaxSize'        : 'Arsip ini melampaui ukuran yang diijinkan.',
			'errResize'            : 'Tidak dapat mengubah ukuran "$1".',
			'errResizeDegree'      : 'Derajat putaran tidak valid.',  // added 7.3.2013
			'errResizeRotate'      : 'Citra tidak diputar.',  // added 7.3.2013
			'errResizeSize'        : 'Ukuran citra tidak valid.',  // added 7.3.2013
			'errResizeNoChange'    : 'Ukuran citra tidak diubah.',  // added 7.3.2013
			'errUsupportType'      : 'Jenis berkas tidak didukung.',
			'errNotUTF8Content'    : 'Berkas "$1" tidak dalam format UTF-8 dan tidak dapat disunting.',  // added 9.11.2011
			'errNetMount'          : 'Tidak dapat membaca susunan "$1".', // added 17.04.2012
			'errNetMountNoDriver'  : 'Protokol tidak didukung.',     // added 17.04.2012
			'errNetMountFailed'    : 'Tidak dapat membaca susunannya.',         // added 17.04.2012
			'errNetMountHostReq'   : 'Host harus ada.', // added 18.04.2012
			'errSessionExpires'    : 'Sesi anda telah kadaluwarsa karena lama tidak aktif.',
			'errCreatingTempDir'   : 'Tidak dapat membuat direktori sementara: "$1"',
			'errFtpDownloadFile'   : 'Tidak dapat mengunduh berkas dari FTP: "$1"',
			'errFtpUploadFile'     : 'Tidak dapat mengunggah berkas dari FTP: "$1"',
			'errFtpMkdir'          : 'Tidak dapat membuat remot direktori dari FTP: "$1"',
			'errArchiveExec'       : 'Kesalahan saat mengarsipkan berkas: "$1"',
			'errExtractExec'       : 'Kesalahan saat mengekstrak berkas: "$1"',
			'errNetUnMount'        : 'Tidak dapat melakukan mount.', // from v2.1 added 30.04.2012
			'errConvUTF8'          : 'Tidak cocok untuk konversi ke UTF-8', // from v2.1 added 08.04.2014
			'errFolderUpload'      : 'Coba dengan browser yang modern, Jika akan mengupload folder.', // from v2.1 added 26.6.2015
			'errSearchTimeout'     : 'Waktu habis selama melakukan pencarian "$1". Hasil sementara.', // from v2.1 added 12.1.2016
			'errReauthRequire'     : 'Re-authorization dibutuhkan.', // from v2.1.10 added 24.3.2016
			'errMaxTargets'        : 'Berkas maksimal yang dipilih adalah $1.', // from v2.1.17 added 17.10.2016
			'errRestore'           : 'Tidak dapat mengembalikan berkas dari tempat sampah. Tujuan tidak ditemukan.', // from v2.1.24 added 3.5.2017
			'errEditorNotFound'    : 'Tidak ditemukan editor untuk file tipe ini.', // from v2.1.25 added 23.5.2017
			'errServerError'       : 'Terjadi kesalahan di sisi server.', // from v2.1.25 added 16.6.2017
			'errEmpty'             : 'Tidak dapat mengosongkan folder "$1".', // from v2.1.25 added 22.6.2017
			'moreErrors'           : 'Ada $1 kesalahan lagi.', // from v2.1.44 added 9.12.2018
			'errMaxMkdirs'         : 'Anda dapat membuat hingga $1 folder sekaligus.', // from v2.1.58 added 20.6.2021

			/******************************* commands names ********************************/
			'cmdarchive'   : 'Buat arsip',
			'cmdback'      : 'Kembali',
			'cmdcopy'      : 'Salin',
			'cmdcut'       : 'Potong',
			'cmddownload'  : 'Unduh',
			'cmdduplicate' : 'Gandakan',
			'cmdedit'      : 'Sunting berkas',
			'cmdextract'   : 'Ekstrak berkas dari arsip',
			'cmdforward'   : 'Maju',
			'cmdgetfile'   : 'Pilih berkas',
			'cmdhelp'      : 'Tentang software ini',
			'cmdhome'      : 'Rumah',
			'cmdinfo'      : 'Dapatkan info',
			'cmdmkdir'     : 'Buat folder',
			'cmdmkdirin'   : 'Masuk ke folder baru', // from v2.1.7 added 19.2.2016
			'cmdmkfile'    : 'Buat fail',
			'cmdopen'      : 'Buka',
			'cmdpaste'     : 'Tempel',
			'cmdquicklook' : 'Pratinjau',
			'cmdreload'    : 'Muat-ulang',
			'cmdrename'    : 'Ganti nama',
			'cmdrm'        : 'Hapus',
			'cmdtrash'     : 'Sampahkan', //from v2.1.24 added 29.4.2017
			'cmdrestore'   : 'Kembalikan', //from v2.1.24 added 3.5.2017
			'cmdsearch'    : 'Cari berkas',
			'cmdup'        : 'Ke direktori utama',
			'cmdupload'    : 'Unggah berkas',
			'cmdview'      : 'Lihat',
			'cmdresize'    : 'Ubah ukuran & Putar',
			'cmdsort'      : 'Urutkan',
			'cmdnetmount'  : 'Baca-susun volume jaringan', // added 18.04.2012
			'cmdnetunmount': 'Lepas', // from v2.1 added 30.04.2012
			'cmdplaces'    : 'Ke Tempat', // added 28.12.2014
			'cmdchmod'     : 'Mode mengubah', // from v2.1 added 20.6.2015
			'cmdopendir'   : 'Membuka folder', // from v2.1 added 13.1.2016
			'cmdcolwidth'  : 'Setel ulang lebar kolom', // from v2.1.13 added 12.06.2016
			'cmdfullscreen': 'Layar Penuh', // from v2.1.15 added 03.08.2016
			'cmdmove'      : 'Pindah', // from v2.1.15 added 21.08.2016
			'cmdempty'     : 'Kosongkan foldernya', // from v2.1.25 added 22.06.2017
			'cmdundo'      : 'Membuka', // from v2.1.27 added 31.07.2017
			'cmdredo'      : 'Mengulangi', // from v2.1.27 added 31.07.2017
			'cmdpreference': 'Preferensi', // from v2.1.27 added 03.08.2017
			'cmdselectall' : 'Pilih Semua', // from v2.1.28 added 15.08.2017
			'cmdselectnone': 'Pilih tidak ada', // from v2.1.28 added 15.08.2017
			'cmdselectinvert': 'Pilihan sebaliknya', // from v2.1.28 added 15.08.2017
			'cmdopennew'   : 'Buka di jendela baru', // from v2.1.38 added 3.4.2018
			'cmdhide'      : 'Sembunyikan (Preferensi)', // from v2.1.41 added 24.7.2018

			/*********************************** buttons ***********************************/
			'btnClose'  : 'Tutup',
			'btnSave'   : 'Simpan',
			'btnRm'     : 'Buang',
			'btnApply'  : 'Terapkan',
			'btnCancel' : 'Batal',
			'btnNo'     : 'Tidak',
			'btnYes'    : 'Ya',
			'btnMount'  : 'Baca susunan',  // added 18.04.2012
			'btnApprove': 'Menuju ke $1 & setujui', // from v2.1 added 26.04.2012
			'btnUnmount': 'Lepas', // from v2.1 added 30.04.2012
			'btnConv'   : 'Konversi', // from v2.1 added 08.04.2014
			'btnCwd'    : 'Disini',      // from v2.1 added 22.5.2015
			'btnVolume' : 'Volume',    // from v2.1 added 22.5.2015
			'btnAll'    : 'Semua',       // from v2.1 added 22.5.2015
			'btnMime'   : 'Jenis MIME', // from v2.1 added 22.5.2015
			'btnFileName':'Nama file',  // from v2.1 added 22.5.2015
			'btnSaveClose': 'Simpan & Tutup', // from v2.1 added 12.6.2015
			'btnBackup' : 'Cadangan', // fromv2.1 added 28.11.2015
			'btnRename'    : 'Ubah nama',      // from v2.1.24 added 6.4.2017
			'btnRenameAll' : 'Ubah nama(Semua)', // from v2.1.24 added 6.4.2017
			'btnPrevious' : 'Sebelumnya ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnNext'     : 'Selanjutnya ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnSaveAs'   : 'Simpan sebagai', // from v2.1.25 added 24.5.2017

			/******************************** notifications ********************************/
			'ntfopen'     : 'Buka folder',
			'ntffile'     : 'Buka berkas',
			'ntfreload'   : 'Muat-ulang isi folder',
			'ntfmkdir'    : 'Membuat direktori',
			'ntfmkfile'   : 'Membuat berkas',
			'ntfrm'       : 'Menghapus berkas',
			'ntfcopy'     : 'Salin berkas',
			'ntfmove'     : 'Pindahkan berkas',
			'ntfprepare'  : 'Persiapan menyalin berkas',
			'ntfrename'   : 'Ubah nama berkas',
			'ntfupload'   : 'Unggah berkas',
			'ntfdownload' : 'Mengunduh berkas',
			'ntfsave'     : 'Simpan berkas',
			'ntfarchive'  : 'Membuat arsip',
			'ntfextract'  : 'Mengekstrak berkas dari arsip',
			'ntfsearch'   : 'Mencari berkas',
			'ntfresize'   : 'Mengubah ukuran citra',
			'ntfsmth'     : 'Melakukan sesuatu',
			'ntfloadimg'  : 'Memuat citra',
			'ntfnetmount' : 'Membaca susunan volume jaringan', // added 18.04.2012
			'ntfnetunmount': 'Melepas volume jaringan', // from v2.1 added 30.04.2012
			'ntfdim'      : 'Mendapatkan dimensi citra', // added 20.05.2013
			'ntfreaddir'  : 'Membaca informasi folder', // from v2.1 added 01.07.2013
			'ntfurl'      : 'Mendapatkan URL dari link', // from v2.1 added 11.03.2014
			'ntfchmod'    : 'Dalam mode mengubah', // from v2.1 added 20.6.2015
			'ntfpreupload': 'Sedang memverifikasi nama file yang diupload', // from v2.1 added 31.11.2015
			'ntfzipdl'    : 'Membuat file untuk didownload', // from v2.1.7 added 23.1.2016
			'ntfparents'  : 'Mengambil informasi path', // from v2.1.17 added 2.11.2016
			'ntfchunkmerge': 'Sedang mengupload file', // from v2.1.17 added 2.11.2016
			'ntftrash'    : 'Sedang melempar ke tempat sampah', // from v2.1.24 added 2.5.2017
			'ntfrestore'  : 'Sedang mengembalikan dari tempat sampah', // from v2.1.24 added 3.5.2017
			'ntfchkdir'   : 'Mengecek folder tujuan', // from v2.1.24 added 3.5.2017
			'ntfundo'     : 'Mengurungkan operasi sebelumnya', // from v2.1.27 added 31.07.2017
			'ntfredo'     : 'Mengulangi yang dibatalkan sebelumnya', // from v2.1.27 added 31.07.2017
			'ntfchkcontent' : 'Memeriksa konten', // from v2.1.41 added 3.8.2018

			/*********************************** volumes *********************************/
			'volume_Trash' : 'Sampah', //from v2.1.24 added 29.4.2017

			/************************************ dates **********************************/
			'dateUnknown' : 'tak diketahui',
			'Today'       : 'Hari ini',
			'Yesterday'   : 'Kemarin',
			'msJan'       : 'Jan',
			'msFeb'       : 'Februari',
			'msMar'       : 'Merusak',
			'msApr'       : 'April',
			'msMay'       : 'Mei',
			'msJun'       : 'Jun',
			'msJul'       : 'Juli',
			'msAug'       : 'Agt',
			'msSep'       : 'Sep',
			'msOct'       : 'Okt',
			'msNov'       : 'Nop',
			'msDec'       : 'Des',
			'January'     : 'Januari',
			'February'    : 'Pebruari',
			'March'       : 'Maret',
			'April'       : 'April',
			'May'         : 'Mei',
			'June'        : 'Juni',
			'July'        : 'Juli',
			'August'      : 'Agustus',
			'September'   : 'September',
			'October'     : 'Oktober',
			'November'    : 'Nopember',
			'December'    : 'Desember',
			'Sunday'      : 'Minggu',
			'Monday'      : 'Senin',
			'Tuesday'     : 'Selasa',
			'Wednesday'   : 'Rabu',
			'Thursday'    : 'Kamis',
			'Friday'      : 'Jum \'at',
			'Saturday'    : 'Sabtu',
			'Sun'         : 'Min',
			'Mon'         : 'Sen',
			'Tue'         : 'Sel',
			'Wed'         : 'Rab',
			'Thu'         : 'Kam',
			'Fri'         : 'Jum',
			'Sat'         : 'Sab',

			/******************************** sort variants ********************************/
			'sortname'          : 'menurut nama',
			'sortkind'          : 'menurut jenis',
			'sortsize'          : 'menurut ukuran',
			'sortdate'          : 'menurut tanggal',
			'sortFoldersFirst'  : 'Utamakan folder',
			'sortperm'          : 'menurut perizinan', // from v2.1.13 added 13.06.2016
			'sortmode'          : 'menurut mode',       // from v2.1.13 added 13.06.2016
			'sortowner'         : 'menurut pemilik',      // from v2.1.13 added 13.06.2016
			'sortgroup'         : 'menurut grup',      // from v2.1.13 added 13.06.2016
			'sortAlsoTreeview'  : 'Juga Treeview',  // from v2.1.15 added 01.08.2016

			/********************************** new items **********************************/
			'untitled file.txt' : 'FileBaru.txt', // added 10.11.2015
			'untitled folder'   : 'FolderBaru',   // added 10.11.2015
			'Archive'           : 'ArsipBaru',  // from v2.1 added 10.11.2015
			'untitled file'     : 'File Baru.$1',  // from v2.1.41 added 6.8.2018
			'extentionfile'     : '$1: Berkas',    // from v2.1.41 added 6.8.2018
			'extentiontype'     : '$1: $2',      // from v2.1.43 added 17.10.2018

			/********************************** messages **********************************/
			'confirmReq'      : 'Diperlukan konfirmasi',
			'confirmRm'       : 'Anda yakin akan menghapus berkas?<br/>Ini tidak dapat kembalikan!',
			'confirmRepl'     : 'Timpa berkas lama dengan yang baru?',
			'confirmRest'     : 'Timpa berkas yang ada dengan berkas dari sampah?', // fromv2.1.24 added 5.5.2017
			'confirmConvUTF8' : 'Bukan UTF-8<br/>Konversi ke UTF-8?<br/>Konten akan berubah menjadi UTF-8 ketika disimpan dengan konversi.', // from v2.1 added 08.04.2014
			'confirmNonUTF8'  : 'Encoding karakter file ini tidak dapat dideteksi. Itu perlu dikonversi sementara ke UTF-8 untuk diedit.<br/>Silakan pilih pengkodean karakter dari file ini.', // from v2.1.19 added 28.11.2016
			'confirmNotSave'  : 'Telah terjadi perubahan.<br/>Kehilangan perkerjaan jika kamu tidak menyimpan.', // from v2.1 added 15.7.2015
			'confirmTrash'    : 'Anda yakin untuk membuang berkas ke tempat sampah?', //from v2.1.24 added 29.4.2017
			'confirmMove'     : 'Anda yakin ingin memindahkan item ke "$1"?', //from v2.1.50 added 27.7.2019
			'apllyAll'        : 'Terapkan ke semua',
			'name'            : 'Nama',
			'size'            : 'Ukuran',
			'perms'           : 'Perijinan',
			'modify'          : 'Diubah',
			'kind'            : 'Jenis',
			'read'            : 'baca',
			'write'           : 'tulis',
			'noaccess'        : 'tidak ada akses',
			'and'             : 'dan',
			'unknown'         : 'tak diketahui',
			'selectall'       : 'Pilih semua berkas',
			'selectfiles'     : 'Pilih berkas',
			'selectffile'     : 'Pilih berkas pertama',
			'selectlfile'     : 'Pilih berkas terakhir',
			'viewlist'        : 'Tampilan daftar',
			'viewicons'       : 'Tampilan ikon',
			'viewSmall'       : 'Ikon kecil', // from v2.1.39 added 22.5.2018
			'viewMedium'      : 'Ikon sedang', // from v2.1.39 added 22.5.2018
			'viewLarge'       : 'Ikon besar', // from v2.1.39 added 22.5.2018
			'viewExtraLarge'  : 'Ikon ekstra besar', // from v2.1.39 added 22.5.2018
			'places'          : 'Lokasi',
			'calc'            : 'Hitung',
			'path'            : 'Alamat',
			'aliasfor'        : 'Nama lain untuk',
			'locked'          : 'Dikunci',
			'dim'             : 'Dimensi',
			'files'           : 'Berkas',
			'folders'         : 'Folder',
			'items'           : 'Pokok',
			'yes'             : 'ya',
			'no'              : 'tidak',
			'link'            : 'Tautan',
			'searcresult'     : 'Hasil pencarian',
			'selected'        : 'Pokok terpilih',
			'about'           : 'Tentang',
			'shortcuts'       : 'Pintasan',
			'help'            : 'Bantuan',
			'webfm'           : 'Pengelola berkas web',
			'ver'             : 'Versi',
			'protocolver'     : 'versi protokol',
			'homepage'        : 'Rumah proyek',
			'docs'            : 'Dokumentasi',
			'github'          : 'Ambil kami di Github',
			'twitter'         : 'Ikuti kami di twitter',
			'facebook'        : 'Gabung dengan kami di facebook',
			'team'            : 'Tim',
			'chiefdev'        : 'kepala pengembang',
			'developer'       : 'pengembang',
			'contributor'     : 'kontributor',
			'maintainer'      : 'pengurus',
			'translator'      : 'penerjemah',
			'icons'           : 'Ikon',
			'dontforget'      : 'dan jangan lupa pakai handukmu',
			'shortcutsof'     : 'Pintasan dimatikan',
			'dropFiles'       : 'Seret berkas anda kesini',
			'or'              : 'atau',
			'selectForUpload' : 'Pilih berkas untuk diunggah',
			'moveFiles'       : 'Pindahkan berkas',
			'copyFiles'       : 'Salin berkas',
			'restoreFiles'    : 'Kembalikan berkas', // from v2.1.24 added 5.5.2017
			'rmFromPlaces'    : 'Hapus dari lokasi',
			'aspectRatio'     : 'Aspek rasio',
			'scale'           : 'Skala',
			'width'           : 'Lebar',
			'height'          : 'Tinggi',
			'resize'          : 'Ubah ukuran',
			'crop'            : 'Potong',
			'rotate'          : 'Putar',
			'rotate-cw'       : 'Putar 90 derajat ke kanan',
			'rotate-ccw'      : 'Putar 90 derajat ke kiri',
			'degree'          : '°',
			'netMountDialogTitle' : 'Baca susunan volume jaringan', // added 18.04.2012
			'protocol'            : 'Protokol', // added 18.04.2012
			'host'                : 'Tuan rumah', // added 18.04.2012
			'port'                : 'Pelabuhan', // added 18.04.2012
			'user'                : 'Pengguna', // added 18.04.2012
			'pass'                : 'Sandi', // added 18.04.2012
			'confirmUnmount'      : 'Apakah anda unmount $1?',  // from v2.1 added 30.04.2012
			'dropFilesBrowser': 'Seret atau Tempel file dari browser', // from v2.1 added 30.05.2012
			'dropPasteFiles'  : 'Seret file, Tempel URL atau gambar dari clipboard', // from v2.1 added 07.04.2014
			'encoding'        : 'pengkodean', // from v2.1 added 19.12.2014
			'locale'          : 'Lokasi',   // from v2.1 added 19.12.2014
			'searchTarget'    : 'Target: $1',                // from v2.1 added 22.5.2015
			'searchMime'      : 'Mencari berdasarkan inpu MIME Type', // from v2.1 added 22.5.2015
			'owner'           : 'Pemilik', // from v2.1 added 20.6.2015
			'group'           : 'Grup', // from v2.1 added 20.6.2015
			'other'           : 'Lainnya', // from v2.1 added 20.6.2015
			'execute'         : 'Eksekusi', // from v2.1 added 20.6.2015
			'perm'            : 'Izin', // from v2.1 added 20.6.2015
			'mode'            : 'Mode', // from v2.1 added 20.6.2015
			'emptyFolder'     : 'Folder kosong', // from v2.1.6 added 30.12.2015
			'emptyFolderDrop' : 'Folder kosong\\A Seret untuk tambahkan berkas', // from v2.1.6 added 30.12.2015
			'emptyFolderLTap' : 'Folder kosong\\A Tekan yang lama untuk tambahkan berkas', // from v2.1.6 added 30.12.2015
			'quality'         : 'Kualitas', // from v2.1.6 added 5.1.2016
			'autoSync'        : 'Sinkronasi Otomatis',  // from v2.1.6 added 10.1.2016
			'moveUp'          : 'Pindah ke atas',  // from v2.1.6 added 18.1.2016
			'getLink'         : 'Mendepatkan URL link', // from v2.1.7 added 9.2.2016
			'selectedItems'   : '($1) berkas dipilih', // from v2.1.7 added 2.19.2016
			'folderId'        : 'ID Folder', // from v2.1.10 added 3.25.2016
			'offlineAccess'   : 'Izin akses offline', // from v2.1.10 added 3.25.2016
			'reAuth'          : 'Untuk mengautentikasi ulang', // from v2.1.10 added 3.25.2016
			'nowLoading'      : 'Sedang memuat...', // from v2.1.12 added 4.26.2016
			'openMulti'       : 'Membuka file bersamaan', // from v2.1.12 added 5.14.2016
			'openMultiConfirm': 'Anda mencoba membuka file $1. Apakah anda ingin membuka di browser?', // from v2.1.12 added 5.14.2016
			'emptySearch'     : 'Hasil pencarian kosong dalam target', // from v2.1.12 added 5.16.2016
			'editingFile'     : 'Sedang mengedit file', // from v2.1.13 added 6.3.2016
			'hasSelected'     : 'Anda memilih $1 berkas', // from v2.1.13 added 6.3.2016
			'hasClipboard'    : 'Kamu mempunyai $i berkas di clipboard', // from v2.1.13 added 6.3.2016
			'incSearchOnly'   : 'Hanya pencarian bertamah untuk menampilkan tampilan sekarang', // from v2.1.13 added 6.30.2016
			'reinstate'       : 'Mengembalikan lagi', // from v2.1.15 added 3.8.2016
			'complete'        : '$1 selesai', // from v2.1.15 added 21.8.2016
			'contextmenu'     : 'Menu konteks', // from v2.1.15 added 9.9.2016
			'pageTurning'     : 'Pembalikan halaman', // from v2.1.15 added 10.9.2016
			'volumeRoots'     : 'akar volume', // from v2.1.16 added 16.9.2016
			'reset'           : 'Mengatur ulang', // from v2.1.16 added 1.10.2016
			'bgcolor'         : 'Warna background', // from v2.1.16 added 1.10.2016
			'colorPicker'     : 'Mengambil warna', // from v2.1.16 added 1.10.2016
			'8pxgrid'         : 'Kotak 8px', // from v2.1.16 added 4.10.2016
			'enabled'         : 'Diaktifkan', // from v2.1.16 added 4.10.2016
			'disabled'        : 'Nonaktifkan', // from v2.1.16 added 4.10.2016
			'emptyIncSearch'  : 'Hasil pencarian kosong dalam tampilan saat ini.\\ATekan [Enter] untuk memperluas target pencarian.', // from v2.1.16 added 5.10.2016
			'emptyLetSearch'  : 'Hasil pencarian huruf pertama kosong dalam tampilan saat ini.', // from v2.1.23 added 24.3.2017
			'textLabel'       : 'Label teks', // from v2.1.17 added 13.10.2016
			'minsLeft'        : '$1 menit lagi', // from v2.1.17 added 13.11.2016
			'openAsEncoding'  : 'Buka kembali dengan penyandian yang dipilih', // from v2.1.19 added 2.12.2016
			'saveAsEncoding'  : 'Simpan dengan pengkodean yang dipilih', // from v2.1.19 added 2.12.2016
			'selectFolder'    : 'Pilih folder', // from v2.1.20 added 13.12.2016
			'firstLetterSearch': 'Pencarian huruf pertama', // from v2.1.23 added 24.3.2017
			'presets'         : 'Preset', // from v2.1.25 added 26.5.2017
			'tooManyToTrash'  : 'Itu terlalu banyak item sehingga tidak bisa menjadi sampah.', // from v2.1.25 added 9.6.2017
			'TextArea'        : 'Area Teks', // from v2.1.25 added 14.6.2017
			'folderToEmpty'   : 'Kosongkan folder "$1".', // from v2.1.25 added 22.6.2017
			'filderIsEmpty'   : 'Tidak ada item dalam folder "$1".', // from v2.1.25 added 22.6.2017
			'preference'      : 'Preferensi', // from v2.1.26 added 28.6.2017
			'language'        : 'Bahasa', // from v2.1.26 added 28.6.2017
			'clearBrowserData': 'Inisialisasi pengaturan yang disimpan di browser ini', // from v2.1.26 added 28.6.2017
			'toolbarPref'     : 'Pengaturan bilah alat', // from v2.1.27 added 2.8.2017
			'charsLeft'       : '... $1 karakter tersisa.',  // from v2.1.29 added 30.8.2017
			'linesLeft'       : '... $1 baris tersisa.',  // from v2.1.52 added 16.1.2020
			'sum'             : 'Jumlah', // from v2.1.29 added 28.9.2017
			'roughFileSize'   : 'Ukuran file kasar', // from v2.1.30 added 2.11.2017
			'autoFocusDialog' : 'Fokus pada elemen dialog dengan mouseover',  // from v2.1.30 added 2.11.2017
			'select'          : 'Pilih', // from v2.1.30 added 23.11.2017
			'selectAction'    : 'Tindakan saat memilih file', // from v2.1.30 added 23.11.2017
			'useStoredEditor' : 'Buka dengan editor yang digunakan terakhir kali', // from v2.1.30 added 23.11.2017
			'selectinvert'    : 'Pilihan sebaliknya', // from v2.1.30 added 25.11.2017
			'renameMultiple'  : 'Anda yakin ingin mengganti nama $1 item terpilih seperti $2?<br/>Ini tidak dapat diurungkan!', // from v2.1.31 added 4.12.2017
			'batchRename'     : 'Ganti nama batch', // from v2.1.31 added 8.12.2017
			'plusNumber'      : '+ Nomor', // from v2.1.31 added 8.12.2017
			'asPrefix'        : 'Tambahkan awalan', // from v2.1.31 added 8.12.2017
			'asSuffix'        : 'Tambahkan akhiran', // from v2.1.31 added 8.12.2017
			'changeExtention' : 'Ubah ekstensi', // from v2.1.31 added 8.12.2017
			'columnPref'      : 'Pengaturan kolom (Tampilan daftar)', // from v2.1.32 added 6.2.2018
			'reflectOnImmediate' : 'Semua perubahan akan langsung direfleksikan ke arsip.', // from v2.1.33 added 2.3.2018
			'reflectOnUnmount'   : 'Perubahan apa pun tidak akan terlihat sampai volume ini dilepas.', // from v2.1.33 added 2.3.2018
			'unmountChildren' : 'Volume berikut yang dipasang pada volume ini juga dilepas. Apakah Anda yakin untuk melepasnya?', // from v2.1.33 added 5.3.2018
			'selectionInfo'   : 'Info Seleksi', // from v2.1.33 added 7.3.2018
			'hashChecker'     : 'Algoritma untuk menampilkan hash file', // from v2.1.33 added 10.3.2018
			'infoItems'       : 'Item Info (Panel Info Pilihan)', // from v2.1.38 added 28.3.2018
			'pressAgainToExit': 'Tekan lagi untuk keluar.', // from v2.1.38 added 1.4.2018
			'toolbar'         : 'Bilah Alat', // from v2.1.38 added 4.4.2018
			'workspace'       : 'Ruang Kerja', // from v2.1.38 added 4.4.2018
			'dialog'          : 'Dialog', // from v2.1.38 added 4.4.2018
			'all'             : 'Semua', // from v2.1.38 added 4.4.2018
			'iconSize'        : 'Ukuran Ikon (Tampilan ikon)', // from v2.1.39 added 7.5.2018
			'editorMaximized' : 'Buka jendela editor yang dimaksimalkan', // from v2.1.40 added 30.6.2018
			'editorConvNoApi' : 'Karena konversi oleh API saat ini tidak tersedia, harap konversi di situs web.', //from v2.1.40 added 8.7.2018
			'editorConvNeedUpload' : 'Setelah konversi, Anda harus mengunggah dengan URL item atau file yang diunduh untuk menyimpan file yang dikonversi.', //from v2.1.40 added 8.7.2018
			'convertOn'       : 'Konversi di situs $1', // from v2.1.40 added 10.7.2018
			'integrations'    : 'Integrasi', // from v2.1.40 added 11.7.2018
			'integrationWith' : 'ElFinder ini memiliki layanan eksternal berikut yang terintegrasi. Silakan periksa syarat penggunaan, kebijakan privasi, dll. sebelum menggunakannya.', // from v2.1.40 added 11.7.2018
			'showHidden'      : 'Tampilkan item tersembunyi', // from v2.1.41 added 24.7.2018
			'hideHidden'      : 'Sembunyikan item tersembunyi', // from v2.1.41 added 24.7.2018
			'toggleHidden'    : 'Tampilkan/Sembunyikan item tersembunyi', // from v2.1.41 added 24.7.2018
			'makefileTypes'   : 'Jenis file untuk diaktifkan dengan "File baru"', // from v2.1.41 added 7.8.2018
			'typeOfTextfile'  : 'Jenis file teks', // from v2.1.41 added 7.8.2018
			'add'             : 'Menambahkan', // from v2.1.41 added 7.8.2018
			'theme'           : 'Tema', // from v2.1.43 added 19.10.2018
			'default'         : 'Bawaan', // from v2.1.43 added 19.10.2018
			'description'     : 'Keterangan', // from v2.1.43 added 19.10.2018
			'website'         : 'Situs web', // from v2.1.43 added 19.10.2018
			'author'          : 'Pengarang', // from v2.1.43 added 19.10.2018
			'email'           : 'Surel', // from v2.1.43 added 19.10.2018
			'license'         : 'Lisensi', // from v2.1.43 added 19.10.2018
			'exportToSave'    : 'Item ini tidak dapat disimpan. Untuk menghindari kehilangan hasil edit, Anda perlu mengekspor ke PC Anda.', // from v2.1.44 added 1.12.2018
			'dblclickToSelect': 'Klik dua kali pada file untuk memilihnya.', // from v2.1.47 added 22.1.2019
			'useFullscreen'   : 'Gunakan mode layar penuh', // from v2.1.47 added 19.2.2019

			/********************************** mimetypes **********************************/
			'kindUnknown'     : 'Tak diketahui',
			'kindRoot'        : 'Volume Akar', // from v2.1.16 added 16.10.2016
			'kindFolder'      : 'Map',
			'kindSelects'     : 'Pilihan', // from v2.1.29 added 29.8.2017
			'kindAlias'       : 'Nama lain',
			'kindAliasBroken' : 'Nama lain rusak',
			// applications
			'kindApp'         : 'Aplikasi',
			'kindPostscript'  : 'Dokumen postscript',
			'kindMsOffice'    : 'Dokumen Ms. Office',
			'kindMsWord'      : 'Dokumen Ms. Word',
			'kindMsExcel'     : 'Dokumen Ms. Excel',
			'kindMsPP'        : 'Dokumen Ms. Powerpoint',
			'kindOO'          : 'Dokumen Open Office',
			'kindAppFlash'    : 'Aplikasi Flash',
			'kindPDF'         : 'Portable Dokumen Format (PDF)',
			'kindTorrent'     : 'Berkas Bittorrent',
			'kind7z'          : 'Arsip 7z',
			'kindTAR'         : 'Arsip TAR',
			'kindGZIP'        : 'Arsip GZIP',
			'kindBZIP'        : 'Arsip BZIP',
			'kindXZ'          : 'Arsip XZ',
			'kindZIP'         : 'Arsip ZIP',
			'kindRAR'         : 'Arsip RAR',
			'kindJAR'         : 'Berkas Java JAR',
			'kindTTF'         : 'Huruf True Type',
			'kindOTF'         : 'Huruf Open Type',
			'kindRPM'         : 'Paket RPM',
			// texts
			'kindText'        : 'Dokumen teks',
			'kindTextPlain'   : 'Berkas teks biasa',
			'kindPHP'         : 'Kode-sumber PHP',
			'kindCSS'         : 'Lembar bergaya susun',
			'kindHTML'        : 'Dokumen HTML',
			'kindJS'          : 'Kode-sumber Javascript',
			'kindRTF'         : 'Berkas Rich Text',
			'kindC'           : 'Kode-sumber C',
			'kindCHeader'     : 'Kode-sumber header C',
			'kindCPP'         : 'Kode-sumber C++',
			'kindCPPHeader'   : 'Kode-sumber header C++',
			'kindShell'       : 'Berkas shell Unix',
			'kindPython'      : 'Kode-sumber Python',
			'kindJava'        : 'Kode-sumber Java',
			'kindRuby'        : 'Kode-sumber Ruby',
			'kindPerl'        : 'Kode-sumber Perl',
			'kindSQL'         : 'Kode-sumber SQL',
			'kindXML'         : 'Dokumen XML',
			'kindAWK'         : 'Kode-sumber AWK',
			'kindCSV'         : 'Dokumen CSV',
			'kindDOCBOOK'     : 'Dokumen Docbook XML',
			'kindMarkdown'    : 'teks penurunan harga', // added 20.7.2015
			// images
			'kindImage'       : 'Citra',
			'kindBMP'         : 'Citra BMP',
			'kindJPEG'        : 'Citra JPEG',
			'kindGIF'         : 'Citra GIF',
			'kindPNG'         : 'Citra PNG',
			'kindTIFF'        : 'Citra TIFF',
			'kindTGA'         : 'Citra TGA',
			'kindPSD'         : 'Citra Adobe Photoshop',
			'kindXBITMAP'     : 'Citra X bitmap',
			'kindPXM'         : 'Citra Pixelmator',
			// media
			'kindAudio'       : 'Berkas audio',
			'kindAudioMPEG'   : 'Berkas audio MPEG',
			'kindAudioMPEG4'  : 'Berkas audio MPEG-4',
			'kindAudioMIDI'   : 'Berkas audio MIDI',
			'kindAudioOGG'    : 'Berkas audio Ogg Vorbis',
			'kindAudioWAV'    : 'Berkas audio WAV',
			'AudioPlaylist'   : 'Berkas daftar putar MP3',
			'kindVideo'       : 'Berkas video',
			'kindVideoDV'     : 'Berkas video DV',
			'kindVideoMPEG'   : 'Berkas video MPEG',
			'kindVideoMPEG4'  : 'Berkas video MPEG-4',
			'kindVideoAVI'    : 'Berkas video AVI',
			'kindVideoMOV'    : 'Berkas video Quick Time',
			'kindVideoWM'     : 'Berkas video Windows Media',
			'kindVideoFlash'  : 'Berkas video Flash',
			'kindVideoMKV'    : 'Berkas video Matroska',
			'kindVideoOGG'    : 'Berkas video Ogg'
		}
	};
}));

js/i18n/elfinder.ko.js000064400000106177151215013370010507 0ustar00/**
 * Korea-한국어 translation
 * @author Hwang Ahreum; <luckmagic@naver.com>
 * @author Park Sungyong; <sungyong@gmail.com>
 * @author Yeonjeong Woo <eat_sweetly@naver.com>
 * @author Kwon Hyungjoo <hyung778@gmail.com>
 * @version 2022-03-02
 */
 (function(root, factory) {
	if (typeof define === 'function' && define.amd) {
		define(['elfinder'], factory);
	} else if (typeof exports !== 'undefined') {
		module.exports = factory(require('elfinder'));
	} else {
		factory(root.elFinder);
	}
}(this, function(elFinder) {
	elFinder.prototype.i18.ko = {
		translator : 'Hwang Ahreum; &lt;luckmagic@naver.com&gt;, Park Sungyong; &lt;sungyong@gmail.com&gt;, Yeonjeong Woo &lt;eat_sweetly@naver.com&gt;, Kwon Hyungjoo &lt;hyung778@gmail.com&gt;',
		language   : 'Korea-한국어',
		direction  : 'ltr',
		dateFormat : 'Y-m-d H:i', // will show like: 2022-03-02 13:21
		fancyDateFormat : '$1 H:i', // will show like: 오늘 13:21
		nonameDateFormat : 'ymd-His', // noname upload will show like: 220302-132116
		messages   : {
			'getShareText' : '공유하다',
			'Editor ': '코드 편집기',

			/********************************** errors **********************************/
			'error'                : '오류',
			'errUnknown'           : '알 수 없는 오류.',
			'errUnknownCmd'        : '알 수 없는 명령어.',
			'errJqui'              : 'jQuery UI 설정이 올바르지 않습니다. Selectable, draggable 및 droppable 구성 요소가 포함되어 있어야 합니다.',
			'errNode'              : 'elFinder를 생성하기 위해서는 DOM Element를 요구합니다.',
			'errURL'               : 'elFinder 환경설정이 올바르지 않습니다! URL 옵션이 설정되지 않았습니다.',
			'errAccess'            : '접근 제한.',
			'errConnect'           : 'Backend에 연결할 수 없습니다.',
			'errAbort'             : '연결 실패.',
			'errTimeout'           : '연결시간 초과.',
			'errNotFound'          : 'Backend를 찾을 수 없습니다.',
			'errResponse'          : 'Backend가 응답하지 않습니다.',
			'errConf'              : 'Backend 환경설정이 올바르지 않습니다.',
			'errJSON'              : 'PHP JSON 모듈이 설치되지 않았습니다.',
			'errNoVolumes'         : '읽을 수 있는 볼륨이 없습니다.',
			'errCmdParams'         : '"$1" 명령에 잘못된 매개 변수가 있습니다.',
			'errDataNotJSON'       : '데이터가 JSON이 아닙니다.',
			'errDataEmpty'         : '데이터가 비어있습니다.',
			'errCmdReq'            : 'Backend 요청에는 명령어 이름이 필요합니다.',
			'errOpen'              : '"$1"을(를) 열 수 없습니다.',
			'errNotFolder'         : '폴더가 아닙니다.',
			'errNotFile'           : '파일이 아닙니다.',
			'errRead'              : '"$1"을(를) 읽을 수 없습니다.',
			'errWrite'             : '"$1"에 쓸 수 없습니다.',
			'errPerm'              : '권한이 없습니다.',
			'errLocked'            : '"$1"이(가) 잠겨 있습니다, 이동, 삭제가 불가능합니다',
			'errExists'            : '이미 "$1"파일이 존재합니다.',
			'errInvName'           : '파일명에 올바르지 않은 문자가 포함되었습니다.',
			'errInvDirname'        : '폴더명에 올바르지 않은 문자가 포함되었습니다.',  // from v2.1.24 added 12.4.2017
			'errFolderNotFound'    : '폴더를 찾을 수 없습니다.',
			'errFileNotFound'      : '파일을 찾을 수 없습니다.',
			'errTrgFolderNotFound' : '"$1" 폴더를 찾을 수 없습니다.',
			'errPopup'             : '브라우저에서 팝업을 차단하였습니다. 팝업을 허용하려면 브라우저 옵션을 변경하세요.',
			'errMkdir'             : '"$1" 폴더를 생성할 수 없습니다.',
			'errMkfile'            : '"$1" 파일을 생성할 수 없습니다.',
			'errRename'            : '"$1"의 이름을 변경할 수 없습니다.',
			'errCopyFrom'          : '볼률 "$1"으(로)부터 파일을 복사할 수 없습니다.',
			'errCopyTo'            : '볼률 "$1"에 파일을 복사할 수 없습니다.',
			'errMkOutLink'         : 'root 볼륨 외부에 링크를 만들 수 없습니다.', // from v2.1 added 03.10.2015
			'errUpload'            : '업로드 오류.',  // old name - errUploadCommon
			'errUploadFile'        : '"$1"을(를) 업로드할 수 없습니다.', // old name - errUpload
			'errUploadNoFiles'     : '업로드할 파일이 없습니다.',
			'errUploadTotalSize'   : '데이터가 허용된 최대크기를 초과하였습니다.', // old name - errMaxSize
			'errUploadFileSize'    : '파일이 허용된 최대크기를 초과하였습니다.', //  old name - errFileMaxSize
			'errUploadMime'        : '잘못된 파일형식입니다.',
			'errUploadTransfer'    : '"$1" 전송 오류.',
			'errUploadTemp'        : '업로드에 필요한 임시파일 생성을 할 수 없습니다.', // from v2.1 added 26.09.2015
			'errNotReplace'        : '"$1"개체가 현재 위치에 이미 존재하며 다른 유형의 개체로 대체 할 수 없습니다.', // new
			'errReplace'           : '"$1"을(를) 변경할 수 없습니다.',
			'errSave'              : '"$1"을(를) 저장할 수 없습니다.',
			'errCopy'              : '"$1"을(를) 복사할 수 없습니다.',
			'errMove'              : '"$1"을(를) 이동할 수 없습니다.',
			'errCopyInItself'      : '"$1"을(를) 자기 자신에게 복사할 수 없습니다.',
			'errRm'                : '"$1"의 이름을 변경할 수 없습니다.',
			'errTrash'             : '휴지통으로 보낼 수 없습니다.', // from v2.1.24 added 30.4.2017
			'errRmSrc'             : '원본 파일을 제거할 수 없습니다.',
			'errExtract'           : '"$1"에 압축을 풀 수 없습니다.',
			'errArchive'           : '압축파일을 생성할 수 없습니다.',
			'errArcType'           : '지원하지 않는 압축파일 형식입니다.',
			'errNoArchive'         : '압축파일이 아니거나 지원하지 않는 압축파일 형식입니다.',
			'errCmdNoSupport'      : 'Backend에서 이 명령을 지원하지 않습니다.',
			'errReplByChild'       : '"$1" 폴더에 덮어쓸수 없습니다.',
			'errArcSymlinks'       : '보안상의 이유로 압축파일이 심볼릭 링크를 포함하거나 허용되지 않는 이름이 있을 경우 압축 해제가 불가능합니다.', // edited 24.06.2012
			'errArcMaxSize'        : '압축파일이 허용된 최대크기를 초과하였습니다.',
			'errResize'            : '"$1"의 크기 변경을 할 수 없습니다.',
			'errResizeDegree'      : '회전가능한 각도가 아닙니다.',  // added 7.3.2013
			'errResizeRotate'      : '이미지를 회전할 수 없습니다.',  // added 7.3.2013
			'errResizeSize'        : '올바르지 않은 크기의 이미지입니다.',  // added 7.3.2013
			'errResizeNoChange'    : '이미지 크기가 변경되지 않았습니다.',  // added 7.3.2013
			'errUsupportType'      : '지원하지 않는 파일 형식.',
			'errNotUTF8Content'    : '파일 "$1"은 UTF-8 형식이 아니어서 편집할 수 없습니다.',  // added 9.11.2011
			'errNetMount'          : '"$1"을(를) 마운트할 수 없습니다.', // added 17.04.2012
			'errNetMountNoDriver'  : '지원되지 않는 프로토콜.',     // added 17.04.2012
			'errNetMountFailed'    : '마운드 실패.',         // added 17.04.2012
			'errNetMountHostReq'   : '호스트가 필요합니다.', // added 18.04.2012
			'errSessionExpires'    : '활동이 없어 세션이 만료되었습니다.',
			'errCreatingTempDir'   : '임시 폴더 생성에 실패했습니다: "$1"',
			'errFtpDownloadFile'   : 'FTP를 통한 다운로드에 실패했습니다: "$1"',
			'errFtpUploadFile'     : 'FTP에 업로드 실패했습니다: "$1"',
			'errFtpMkdir'          : 'FTP에서 폴더 생성에 실패했습니다: "$1"',
			'errArchiveExec'       : '압축중 오류가 발생했습니다: "$1"',
			'errExtractExec'       : '압축해제중 오류가 발생했습니다: "$1"',
			'errNetUnMount'        : '마운트를 해제할 수 없습니다.', // from v2.1 added 30.04.2012
			'errConvUTF8'          : 'UTF-8로 변환할 수 없습니다.', // from v2.1 added 08.04.2014
			'errFolderUpload'      : '폴더를 업로드 하려면 최신 브라우저를 사용하세요.', // from v2.1 added 26.6.2015
			'errSearchTimeout'     : '"$1" 검색중 시간을 초과하였습니다. 일부 결과만 표시됩니다.', // from v2.1 added 12.1.2016
			'errReauthRequire'     : '재인증이 필요합니다.', // from v2.1.10 added 24.3.2016
			'errMaxTargets'        : '선택 가능한 최대 개수는 $1개입니다.', // from v2.1.17 added 17.10.2016
			'errRestore'           : '휴지통에서 복원할 수 없습니다. 복원할 위치를 확인할 수 없습니다.', // from v2.1.24 added 3.5.2017
			'errEditorNotFound'    : '이 파일 형식을 위한 편집기를 찾지 못했습니다.', // from v2.1.25 added 23.5.2017
			'errServerError'       : '서버측에서 오류가 발생했습니다.', // from v2.1.25 added 16.6.2017
			'errEmpty'             : '"$1" 폴더를 비울 수 없습니다.', // from v2.1.25 added 22.6.2017
			'moreErrors'           : '$1개의 오류가 더 발생했습니다.', // from v2.1.44 added 9.12.2018
			'errMaxMkdirs'         : '한 번에 최대 $1개의 폴더를 만들 수 있습니다.', // from v2.1.58 added 20.6.2021

			/******************************* commands names ********************************/
			'cmdarchive'   : '압축파일생성',
			'cmdback'      : '뒤로',
			'cmdcopy'      : '복사',
			'cmdcut'       : '자르기',
			'cmddownload'  : '다운로드',
			'cmdduplicate' : '사본',
			'cmdedit'      : '편집',
			'cmdextract'   : '압축풀기',
			'cmdforward'   : '앞으로',
			'cmdgetfile'   : '선택',
			'cmdhelp'      : '이 소프트웨어는',
			'cmdhome'      : '홈',
			'cmdinfo'      : '파일정보',
			'cmdmkdir'     : '새 폴더',
			'cmdmkdirin'   : '새 폴더로', // from v2.1.7 added 19.2.2016
			'cmdmkfile'    : '새 파일',
			'cmdopen'      : '열기',
			'cmdpaste'     : '붙여넣기',
			'cmdquicklook' : '미리보기',
			'cmdreload'    : '새로고침',
			'cmdrename'    : '이름바꾸기',
			'cmdrm'        : '삭제',
			'cmdtrash'     : '휴지통으로', //from v2.1.24 added 29.4.2017
			'cmdrestore'   : '복원', //from v2.1.24 added 3.5.2017
			'cmdsearch'    : '파일찾기',
			'cmdup'        : '상위폴더',
			'cmdupload'    : '업로드',
			'cmdview'      : '보기',
			'cmdresize'    : '이미지 크기 변경 & 회전',
			'cmdsort'      : '정렬',
			'cmdnetmount'  : '네트워크 볼륨 마운트', // added 18.04.2012
			'cmdnetunmount': '마운트 해제', // from v2.1 added 30.04.2012
			'cmdplaces'    : '즐겨찾기로', // added 28.12.2014
			'cmdchmod'     : '모드 변경', // from v2.1 added 20.6.2015
			'cmdopendir'   : '폴더 열기', // from v2.1 added 13.1.2016
			'cmdcolwidth'  : '컬럼 넓이 초기화', // from v2.1.13 added 12.06.2016
			'cmdfullscreen': '전체 화면', // from v2.1.15 added 03.08.2016
			'cmdmove'      : '이동', // from v2.1.15 added 21.08.2016
			'cmdempty'     : '폴더 비우기', // from v2.1.25 added 22.06.2017
			'cmdundo'      : '실행 취소', // from v2.1.27 added 31.07.2017
			'cmdredo'      : '다시 실행', // from v2.1.27 added 31.07.2017
			'cmdpreference': '환경설정', // from v2.1.27 added 03.08.2017
			'cmdselectall' : '전체 선택', // from v2.1.28 added 15.08.2017
			'cmdselectnone': '선택 취소', // from v2.1.28 added 15.08.2017
			'cmdselectinvert': '선택 반전', // from v2.1.28 added 15.08.2017
			'cmdopennew'   : '새 창으로 열기', // from v2.1.38 added 3.4.2018
			'cmdhide'      : '숨기기 (환경설정)', // from v2.1.41 added 24.7.2018

			/*********************************** buttons ***********************************/
			'btnClose'  : '닫기',
			'btnSave'   : '저장',
			'btnRm'     : '삭제',
			'btnApply'  : '적용',
			'btnCancel' : '취소',
			'btnNo'     : '아니오',
			'btnYes'    : '예',
			'btnMount'  : '마운트',  // added 18.04.2012
			'btnApprove': '$1로 이동 및 승인', // from v2.1 added 26.04.2012
			'btnUnmount': '마운트 해제', // from v2.1 added 30.04.2012
			'btnConv'   : '변환', // from v2.1 added 08.04.2014
			'btnCwd'    : '여기',      // from v2.1 added 22.5.2015
			'btnVolume' : '볼륨',    // from v2.1 added 22.5.2015
			'btnAll'    : '전체',       // from v2.1 added 22.5.2015
			'btnMime'   : 'MIME 타입', // from v2.1 added 22.5.2015
			'btnFileName':'파일 이름',  // from v2.1 added 22.5.2015
			'btnSaveClose': '저장후 닫기', // from v2.1 added 12.6.2015
			'btnBackup' : '백업', // fromv2.1 added 28.11.2015
			'btnRename'    : '이름변경',      // from v2.1.24 added 6.4.2017
			'btnRenameAll' : '전체이름 변경', // from v2.1.24 added 6.4.2017
			'btnPrevious' : '이전 ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnNext'     : '다음 ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnSaveAs'   : '다른 이름으로 저장하기', // from v2.1.25 added 24.5.2017

			/******************************** notifications ********************************/
			'ntfopen'     : '폴더 열기',
			'ntffile'     : '파일 열기',
			'ntfreload'   : '새로고침',
			'ntfmkdir'    : '폴더 생성',
			'ntfmkfile'   : '파일 생성',
			'ntfrm'       : '삭제',
			'ntfcopy'     : '복사',
			'ntfmove'     : '이동',
			'ntfprepare'  : '복사 준비',
			'ntfrename'   : '이름바꾸기',
			'ntfupload'   : '업로드',
			'ntfdownload' : '다운로드',
			'ntfsave'     : '저장하기',
			'ntfarchive'  : '압축파일만들기',
			'ntfextract'  : '압축풀기',
			'ntfsearch'   : '검색',
			'ntfresize'   : '이미지 크기 변경',
			'ntfsmth'     : '작업중 >_<',
			'ntfloadimg'  : '이미지 불러오는 중',
			'ntfnetmount' : '네트워크 볼륨 마운트 중', // added 18.04.2012
			'ntfnetunmount': '네트워크 볼륨 마운트 해제 중', // from v2.1 added 30.04.2012
			'ntfdim'      : '이미지 해상도 가져오는 중', // added 20.05.2013
			'ntfreaddir'  : '폴더 정보 읽는 중', // from v2.1 added 01.07.2013
			'ntfurl'      : '링크 URL 가져오는 중', // from v2.1 added 11.03.2014
			'ntfchmod'    : '파일 모드 변경하는 중', // from v2.1 added 20.6.2015
			'ntfpreupload': '업로드된 파일명 검증 중', // from v2.1 added 31.11.2015
			'ntfzipdl'    : '다운로드할 파일 생성 중', // from v2.1.7 added 23.1.2016
			'ntfparents'  : '경로 정보 가져오는 중', // from v2.1.17 added 2.11.2016
			'ntfchunkmerge': '업로드된 파일 처리 중', // from v2.1.17 added 2.11.2016
			'ntftrash'    : '휴지통으로 이동 중', // from v2.1.24 added 2.5.2017
			'ntfrestore'  : '휴지통에서 복원 중', // from v2.1.24 added 3.5.2017
			'ntfchkdir'   : '대상 폴더 점검 중', // from v2.1.24 added 3.5.2017
			'ntfundo'     : '이전 작업 취소 중', // from v2.1.27 added 31.07.2017
			'ntfredo'     : '취소된 작업 다시 하는 중', // from v2.1.27 added 31.07.2017
			'ntfchkcontent' : '내용 확인 중', // from v2.1.41 added 3.8.2018

			/*********************************** volumes *********************************/
			'volume_Trash' : '휴지통', //from v2.1.24 added 29.4.2017

			/************************************ dates **********************************/
			'dateUnknown' : '알 수 없음',
			'Today'       : '오늘',
			'Yesterday'   : '어제',
			'msJan'       : '1월',
			'msFeb'       : '2월',
			'msMar'       : '3월',
			'msApr'       : '4월',
			'msMay'       : '5월',
			'msJun'       : '6월',
			'msJul'       : '7월',
			'msAug'       : '8월',
			'msSep'       : '9월',
			'msOct'       : '10월',
			'msNov'       : '11월',
			'msDec'       : '12월',
			'January'     : '1월',
			'February'    : '2월',
			'March'       : '3월',
			'April'       : '4월',
			'May'         : '5월',
			'June'        : '6월',
			'July'        : '7월',
			'August'      : '8월',
			'September'   : '9월',
			'October'     : '10월',
			'November'    : '11월',
			'December'    : '12월',
			'Sunday'      : '일요일',
			'Monday'      : '월요일',
			'Tuesday'     : '화요일',
			'Wednesday'   : '수요일',
			'Thursday'    : '목요일',
			'Friday'      : '금요일',
			'Saturday'    : '토요일',
			'Sun'         : '일',
			'Mon'         : '월',
			'Tue'         : '화',
			'Wed'         : '수',
			'Thu'         : '목',
			'Fri'         : '금',
			'Sat'         : '토',

			/******************************** sort variants ********************************/
			'sortname'          : '이름',
			'sortkind'          : '종류',
			'sortsize'          : '크기',
			'sortdate'          : '날짜',
			'sortFoldersFirst'  : '폴더 먼저',
			'sortperm'          : '퍼미션별', // from v2.1.13 added 13.06.2016
			'sortmode'          : '모드별',       // from v2.1.13 added 13.06.2016
			'sortowner'         : '소유자별',      // from v2.1.13 added 13.06.2016
			'sortgroup'         : '그룹별',      // from v2.1.13 added 13.06.2016
			'sortAlsoTreeview'  : '트리뷰도 같이',  // from v2.1.15 added 01.08.2016

			/********************************** new items **********************************/
			'untitled file.txt' : '새파일.txt', // added 10.11.2015
			'untitled folder'   : '새폴더',   // added 10.11.2015
			'Archive'           : '새아카이브',  // from v2.1 added 10.11.2015
			'untitled file'     : '새파일.$1',  // from v2.1.41 added 6.8.2018
			'extentionfile'     : '$1: 파일',    // from v2.1.41 added 6.8.2018
			'extentiontype'     : '$1: $2',      // from v2.1.43 added 17.10.2018

			/********************************** messages **********************************/
			'confirmReq'      : '확인',
			'confirmRm'       : '이 파일을 정말로 삭제 하겠습니까?<br/>실행 후 되돌릴 수 없습니다!',
			'confirmRepl'     : '오래된 파일을 새 파일로 바꾸시겠습니까? (폴더가 포함되어 있으면 병합됩니다. 백업 및 교체하려면 백업을 선택하세요.)',
			'confirmRest'     : '이미 있는 파일을 휴지통에 있는 파일로 교체하시겠습니까?', // fromv2.1.24 added 5.5.2017
			'confirmConvUTF8' : 'UTF-8이 아닙니다<br/>UTF-8로 변환할까요?<br/>변환후 저장하면 UTF-8로 바뀝니다.', // from v2.1 added 08.04.2014
			'confirmNonUTF8'  : '이 파일의 인코딩 타입을 알아내지 못했습니다. 편집하려면 임시로 UTF-8로 변환해야 합니다.<br/>이 파일의 인코딩을 선택해주세요.', // from v2.1.19 added 28.11.2016
			'confirmNotSave'  : '변경된 부분이 있습니다.<br/>저장하지 않는다면 현재 작업중인 내용을 잃을 수 있습니다.', // from v2.1 added 15.7.2015
			'confirmTrash'    : '휴지통으로 이동하시겠습니까?', //from v2.1.24 added 29.4.2017
			'confirmMove'     : '이 파일을 정말 "$1"(으)로 이동하시겠습니까?', //from v2.1.50 added 27.7.2019
			'apllyAll'        : '모두 적용',
			'name'            : '이름',
			'size'            : '크기',
			'perms'           : '권한',
			'modify'          : '수정된 시간',
			'kind'            : '종류',
			'read'            : '읽기',
			'write'           : '쓰기',
			'noaccess'        : '액세스 불가',
			'and'             : '와',
			'unknown'         : '알 수 없음',
			'selectall'       : '모든 파일 선택',
			'selectfiles'     : '파일 선택',
			'selectffile'     : '첫번째 파일 선택',
			'selectlfile'     : '마지막 파일 선택',
			'viewlist'        : '리스트 보기',
			'viewicons'       : '아이콘 보기',
			'viewSmall'       : '작은 아이콘', // from v2.1.39 added 22.5.2018
			'viewMedium'      : '중간 아이콘', // from v2.1.39 added 22.5.2018
			'viewLarge'       : '큰 아이콘', // from v2.1.39 added 22.5.2018
			'viewExtraLarge'  : '아주 큰 아이콘', // from v2.1.39 added 22.5.2018
			'places'          : '즐겨찾기',
			'calc'            : '계산',
			'path'            : '경로',
			'aliasfor'        : '별명',
			'locked'          : '잠금',
			'dim'             : '크기',
			'files'           : '파일',
			'folders'         : '폴더',
			'items'           : '아이템',
			'yes'             : '예',
			'no'              : '아니오',
			'link'            : '링크',
			'searcresult'     : '검색 결과',
			'selected'        : '아이템 선택',
			'about'           : '이 프로그램은..',
			'shortcuts'       : '단축아이콘',
			'help'            : '도움말',
			'webfm'           : '웹 파일매니저',
			'ver'             : '버전',
			'protocolver'     : '프로토콜 버전',
			'homepage'        : '홈페이지',
			'docs'            : '문서',
			'github'          : 'Github에서 포크하기',
			'twitter'         : '트위터에서 팔로우하기',
			'facebook'        : '페이스북에서 가입하기',
			'team'            : '팀',
			'chiefdev'        : '개발팀장',
			'developer'       : '개발자',
			'contributor'     : '공헌자',
			'maintainer'      : '관리자',
			'translator'      : '번역',
			'icons'           : '아이콘',
			'dontforget'      : '그리고 수건 가져가는 것을 잊지 마세요',
			'shortcutsof'     : '단축아이콘 사용불가',
			'dropFiles'       : '여기로 이동하기',
			'or'              : '또는',
			'selectForUpload' : '업로드 파일 선택',
			'moveFiles'       : '파일 이동',
			'copyFiles'       : '파일 복사',
			'restoreFiles'    : '복원하기', // from v2.1.24 added 5.5.2017
			'rmFromPlaces'    : '현재 폴더에서 삭제하기',
			'aspectRatio'     : '화면비율',
			'scale'           : '크기',
			'width'           : '가로',
			'height'          : '세로',
			'resize'          : '사이즈 변경',
			'crop'            : '자르기',
			'rotate'          : '회전',
			'rotate-cw'       : '반시계방향 90도 회전',
			'rotate-ccw'      : '시계방향 90도 회전',
			'degree'          : '도',
			'netMountDialogTitle' : '네트워크 볼륨 마운트', // added 18.04.2012
			'protocol'            : '프로토콜', // added 18.04.2012
			'host'                : '호스트', // added 18.04.2012
			'port'                : '포트', // added 18.04.2012
			'user'                : '사용자', // added 18.04.2012
			'pass'                : '비밀번호', // added 18.04.2012
			'confirmUnmount'      : '$1을(를) 마운트 해제하시겠습니까?',  // from v2.1 added 30.04.2012
			'dropFilesBrowser': '브라우저에서 파일을 끌어오거나 붙여넣으세요', // from v2.1 added 30.05.2012
			'dropPasteFiles'  : '파일을 끌어오거나, 클립보드의 URL이나 이미지들을 붙여넣으세요', // from v2.1 added 07.04.2014
			'encoding'        : '인코딩', // from v2.1 added 19.12.2014
			'locale'          : '로케일',   // from v2.1 added 19.12.2014
			'searchTarget'    : '대상: $1',                // from v2.1 added 22.5.2015
			'searchMime'      : '입력한 MIME 타입으로 검색하기', // from v2.1 added 22.5.2015
			'owner'           : '소유자', // from v2.1 added 20.6.2015
			'group'           : '그룹', // from v2.1 added 20.6.2015
			'other'           : '그외', // from v2.1 added 20.6.2015
			'execute'         : '실행', // from v2.1 added 20.6.2015
			'perm'            : '권한', // from v2.1 added 20.6.2015
			'mode'            : '모드', // from v2.1 added 20.6.2015
			'emptyFolder'     : '빈 폴더입니다', // from v2.1.6 added 30.12.2015
			'emptyFolderDrop' : '빈 폴더입니다\\A 드래드 앤 드롭으로 파일을 추가하세요', // from v2.1.6 added 30.12.2015
			'emptyFolderLTap' : '빈 폴더입니다\\A 길게 눌러 파일을 추가하세요', // from v2.1.6 added 30.12.2015
			'quality'         : '품질', // from v2.1.6 added 5.1.2016
			'autoSync'        : '자동 동기',  // from v2.1.6 added 10.1.2016
			'moveUp'          : '위로 이동',  // from v2.1.6 added 18.1.2016
			'getLink'         : 'URL 링크 가져오기', // from v2.1.7 added 9.2.2016
			'selectedItems'   : '선택된 항목 ($1)', // from v2.1.7 added 2.19.2016
			'folderId'        : '폴더 ID', // from v2.1.10 added 3.25.2016
			'offlineAccess'   : '오프라인 접근 허용', // from v2.1.10 added 3.25.2016
			'reAuth'          : '재인증하기', // from v2.1.10 added 3.25.2016
			'nowLoading'      : '로딩중...', // from v2.1.12 added 4.26.2016
			'openMulti'       : '여러 파일 열기', // from v2.1.12 added 5.14.2016
			'openMultiConfirm': '$1 파일을 열려고 합니다. 브라우저에서 열겠습니까?', // from v2.1.12 added 5.14.2016
			'emptySearch'     : '검색결과가 없습니다.', // from v2.1.12 added 5.16.2016
			'editingFile'     : '편집중인 파일입니다.', // from v2.1.13 added 6.3.2016
			'hasSelected'     : '$1개를 선택했습니다.', // from v2.1.13 added 6.3.2016
			'hasClipboard'    : '클립보드에 $1개가 있습니다.', // from v2.1.13 added 6.3.2016
			'incSearchOnly'   : '증분 검색은 현재 보기에서만 가능합니다.', // from v2.1.13 added 6.30.2016
			'reinstate'       : '복원', // from v2.1.15 added 3.8.2016
			'complete'        : '$1 완료', // from v2.1.15 added 21.8.2016
			'contextmenu'     : '컨텍스트 메뉴', // from v2.1.15 added 9.9.2016
			'pageTurning'     : '페이지 전환', // from v2.1.15 added 10.9.2016
			'volumeRoots'     : '볼륨 루트', // from v2.1.16 added 16.9.2016
			'reset'           : '초기화', // from v2.1.16 added 1.10.2016
			'bgcolor'         : '배경색', // from v2.1.16 added 1.10.2016
			'colorPicker'     : '색 선택기', // from v2.1.16 added 1.10.2016
			'8pxgrid'         : '8px 그리드', // from v2.1.16 added 4.10.2016
			'enabled'         : '활성', // from v2.1.16 added 4.10.2016
			'disabled'        : '비활성', // from v2.1.16 added 4.10.2016
			'emptyIncSearch'  : '현재 보기에는 검색결과가 없습니다.\\A[Enter]를 눌러 검색 대상을 확장하세요.', // from v2.1.16 added 5.10.2016
			'emptyLetSearch'  : '현재 보기에는 첫 글자 검색 결과가 없습니다.', // from v2.1.23 added 24.3.2017
			'textLabel'       : '텍스트 라벨', // from v2.1.17 added 13.10.2016
			'minsLeft'        : '$1 분 남았습니다', // from v2.1.17 added 13.11.2016
			'openAsEncoding'  : '선택한 인코딩으로 다시 열기', // from v2.1.19 added 2.12.2016
			'saveAsEncoding'  : '선택한 인코딩으로 저장하기', // from v2.1.19 added 2.12.2016
			'selectFolder'    : '폴더 선택', // from v2.1.20 added 13.12.2016
			'firstLetterSearch': '첫 글자 검색', // from v2.1.23 added 24.3.2017
			'presets'         : '프리셋', // from v2.1.25 added 26.5.2017
			'tooManyToTrash'  : '휴지통으로 옮기기엔 항목이 너무 많습니다.', // from v2.1.25 added 9.6.2017
			'TextArea'        : '글자영역', // from v2.1.25 added 14.6.2017
			'folderToEmpty'   : '"$1" 폴더를 비우세요.', // from v2.1.25 added 22.6.2017
			'filderIsEmpty'   : '"$1" 폴더에 아무것도 없습니다.', // from v2.1.25 added 22.6.2017
			'preference'      : '환경설정', // from v2.1.26 added 28.6.2017
			'language'        : '언어 설정', // from v2.1.26 added 28.6.2017
			'clearBrowserData': '이 브라우저에 저장된 설정값 초기화하기', // from v2.1.26 added 28.6.2017
			'toolbarPref'     : '툴바 설정', // from v2.1.27 added 2.8.2017
			'charsLeft'       : '... $1 글자 남았습니다.',  // from v2.1.29 added 30.8.2017
			'linesLeft'       : '... $1 줄 남았습니다.',  // from v2.1.52 added 16.1.2020
			'sum'             : '합계', // from v2.1.29 added 28.9.2017
			'roughFileSize'   : '대략적인 파일 크기', // from v2.1.30 added 2.11.2017
			'autoFocusDialog' : '마우스를 가져갈 때 대화창 요소에 초점 맞추기',  // from v2.1.30 added 2.11.2017
			'select'          : '선택', // from v2.1.30 added 23.11.2017
			'selectAction'    : '파일 선택시 동작', // from v2.1.30 added 23.11.2017
			'useStoredEditor' : '마지막 사용한 편집기로 열기', // from v2.1.30 added 23.11.2017
			'selectinvert'    : '선택 반전', // from v2.1.30 added 25.11.2017
			'renameMultiple'  : '선택한 $1을(를) $2와 같이 바꾸겠습니까?<br/>이 작업은 되돌릴 수 없습니다!', // from v2.1.31 added 4.12.2017
			'batchRename'     : '일괄 이름 바꾸기', // from v2.1.31 added 8.12.2017
			'plusNumber'      : '+ 숫자', // from v2.1.31 added 8.12.2017
			'asPrefix'        : '접두사 추가', // from v2.1.31 added 8.12.2017
			'asSuffix'        : '접미사 추가', // from v2.1.31 added 8.12.2017
			'changeExtention' : '확장자 변경', // from v2.1.31 added 8.12.2017
			'columnPref'      : '사이드바 설정 (리스트 보기)', // from v2.1.32 added 6.2.2018
			'reflectOnImmediate' : '모든 변경은 아카이브에 즉시 반영됩니다.', // from v2.1.33 added 2.3.2018
			'reflectOnUnmount'   : '이 볼륨의 마운트를 해제할 때까지는 어떠한 변경사항도 반영되지 않습니다.', // from v2.1.33 added 2.3.2018
			'unmountChildren' : '아래의 볼륨들도 이 볼륨과 함께 마운트가 해제됩니다. 계속하시겠습니까?', // from v2.1.33 added 5.3.2018
			'selectionInfo'   : '선택 정보', // from v2.1.33 added 7.3.2018
			'hashChecker'     : '파일 해쉬 알고리즘', // from v2.1.33 added 10.3.2018
			'infoItems'       : '정보 (선택 정보 패널)', // from v2.1.38 added 28.3.2018
			'pressAgainToExit': '나가기 위해서 한 번 더 누르세요.', // from v2.1.38 added 1.4.2018
			'toolbar'         : '툴바', // from v2.1.38 added 4.4.2018
			'workspace'       : '작업공간', // from v2.1.38 added 4.4.2018
			'dialog'          : '대화상자', // from v2.1.38 added 4.4.2018
			'all'             : '전체', // from v2.1.38 added 4.4.2018
			'iconSize'        : '아이콘 크기 (아이콘 보기)', // from v2.1.39 added 7.5.2018
			'editorMaximized' : '최대화된 편집기 창을 엽니다', // from v2.1.40 added 30.6.2018
			'editorConvNoApi' : '현재 API를 통한 변환이 불가능하므로 웹 사이트에서 변환하시기 바랍니다.', //from v2.1.40 added 8.7.2018
			'editorConvNeedUpload' : '변환 후 변환된 파일을 저장하기 위해서는 파일 URL이나 다운로드받은 파일을 업로드 해야 합니다.', //from v2.1.40 added 8.7.2018
			'convertOn'       : '$1 사이트에서 변환하시기 바랍니다.', // from v2.1.40 added 10.7.2018
			'integrations'    : '통합', // from v2.1.40 added 11.7.2018
			'integrationWith' : 'elFinder에는 다음과 같은 외부 서비스가 통합되어 있습니다. 이용하기 전에 이용 약관, 개인정보 보호정책 등을 확인하시기 바랍니다.', // from v2.1.40 added 11.7.2018
			'showHidden'      : '숨겨진 파일 표시', // from v2.1.41 added 24.7.2018
			'hideHidden'      : '숨겨진 파일 숨기기', // from v2.1.41 added 24.7.2018
			'toggleHidden'    : '숨겨진 항목 표시/숨기기', // from v2.1.41 added 24.7.2018
			'makefileTypes'   : '"새 파일"에서 사용할 파일 형식', // from v2.1.41 added 7.8.2018
			'typeOfTextfile'  : '텍스트 파일 유형', // from v2.1.41 added 7.8.2018
			'add'             : '추가', // from v2.1.41 added 7.8.2018
			'theme'           : '테마', // from v2.1.43 added 19.10.2018
			'default'         : '기본값', // from v2.1.43 added 19.10.2018
			'description'     : '설명', // from v2.1.43 added 19.10.2018
			'website'         : '웹사이트', // from v2.1.43 added 19.10.2018
			'author'          : '저자', // from v2.1.43 added 19.10.2018
			'email'           : '이메일', // from v2.1.43 added 19.10.2018
			'license'         : '라이선스', // from v2.1.43 added 19.10.2018
			'exportToSave'    : '이 파일은 저장될 수 없습니다. 편집한 내용을 유지하려면 PC로 내보내시기 바랍니다.', // from v2.1.44 added 1.12.2018
			'dblclickToSelect': '파일을 두 번 클릭하여 선택하세요.', // from v2.1.47 added 22.1.2019
			'useFullscreen'   : '전체 화면 모드 사용', // from v2.1.47 added 19.2.2019

			/********************************** mimetypes **********************************/
			'kindUnknown'     : '알 수 없음',
			'kindRoot'        : 'Root 볼륨', // from v2.1.16 added 16.10.2016
			'kindFolder'      : '폴더',
			'kindSelects'     : '선택', // from v2.1.29 added 29.8.2017
			'kindAlias'       : '별칭',
			'kindAliasBroken' : '손상된 별칭',
			// applications
			'kindApp'         : '응용프로그램',
			'kindPostscript'  : 'Postscript 문서',
			'kindMsOffice'    : 'Microsoft Office 문서',
			'kindMsWord'      : 'Microsoft Word 문서',
			'kindMsExcel'     : 'Microsoft Excel 문서',
			'kindMsPP'        : 'Microsoft Powerpoint 프레젠테이션',
			'kindOO'          : 'Open Office 문서',
			'kindAppFlash'    : '플래쉬 파일',
			'kindPDF'         : 'PDF 문서',
			'kindTorrent'     : '비트토렌트 파일',
			'kind7z'          : '7z 압축파일',
			'kindTAR'         : 'TAR 압축파일',
			'kindGZIP'        : 'GZIP 압축파일',
			'kindBZIP'        : 'BZIP 압축파일',
			'kindXZ'          : 'XZ 압축파일',
			'kindZIP'         : 'ZIP 압축파일',
			'kindRAR'         : 'RAR 압축파일',
			'kindJAR'         : '자바 JAR 파일',
			'kindTTF'         : '트루 타입 글꼴',
			'kindOTF'         : '오픈 타입 글꼴',
			'kindRPM'         : 'RPM 패키지',
			// texts
			'kindText'        : '텍스트 문서',
			'kindTextPlain'   : '일반 텍스트',
			'kindPHP'         : 'PHP 소스',
			'kindCSS'         : 'CSS 문서',
			'kindHTML'        : 'HTML 문서',
			'kindJS'          : '자바스크립트 소스',
			'kindRTF'         : 'RTF 형식',
			'kindC'           : 'C 소스',
			'kindCHeader'     : 'C 헤더 소스',
			'kindCPP'         : 'C++ 소스',
			'kindCPPHeader'   : 'C++ 헤더 소스',
			'kindShell'       : '유닉스 쉘 스크립트',
			'kindPython'      : '파이썬 소스',
			'kindJava'        : '자바 소스',
			'kindRuby'        : '루비 소스',
			'kindPerl'        : '펄 스크립트',
			'kindSQL'         : 'SQL 소스',
			'kindXML'         : 'XML 문서',
			'kindAWK'         : 'AWK 소스',
			'kindCSV'         : 'CSV 파일',
			'kindDOCBOOK'     : '닥북 XML 문서',
			'kindMarkdown'    : '마크다운 문서', // added 20.7.2015
			// images
			'kindImage'       : '이미지',
			'kindBMP'         : 'BMP 이미지',
			'kindJPEG'        : 'JPEG 이미지',
			'kindGIF'         : 'GIF 이미지',
			'kindPNG'         : 'PNG 이미지',
			'kindTIFF'        : 'TIFF 이미지',
			'kindTGA'         : 'TGA 이미지',
			'kindPSD'         : 'Adobe Photoshop 이미지',
			'kindXBITMAP'     : 'X 비트맵 이미지',
			'kindPXM'         : 'Pixelmator 이미지',
			// media
			'kindAudio'       : '오디오 미디어',
			'kindAudioMPEG'   : 'MPEG 오디오',
			'kindAudioMPEG4'  : 'MPEG-4 오디오',
			'kindAudioMIDI'   : 'MIDI 오디오',
			'kindAudioOGG'    : 'Ogg Vorbis 오디오',
			'kindAudioWAV'    : 'WAV 오디오',
			'AudioPlaylist'   : 'MP3 플레이 리스트',
			'kindVideo'       : '동영상 미디어',
			'kindVideoDV'     : 'DV 동영상',
			'kindVideoMPEG'   : 'MPEG 동영상',
			'kindVideoMPEG4'  : 'MPEG-4 동영상',
			'kindVideoAVI'    : 'AVI 동영상',
			'kindVideoMOV'    : '퀵 타임 동영상',
			'kindVideoWM'     : '윈도우 미디어 플레이어 동영상',
			'kindVideoFlash'  : '플래쉬 동영상',
			'kindVideoMKV'    : 'Matroska 동영상',
			'kindVideoOGG'    : 'Ogg 동영상'
		}
	};
}));

js/elFinder.js000064400001067345151215013370007264 0ustar00/**
 * @class elFinder - file manager for web
 *
 * @author Dmitry (dio) Levashov
 **/
 var elFinder = function(elm, opts, bootCallback) {
	"use strict";
	//this.time('load');
	var self = this,
		
		/**
		 * Objects array of jQuery.Deferred that calls before elFinder boot up
		 * 
		 * @type Array
		 */
		dfrdsBeforeBootup = [],
		
		/**
		 * Plugin name to check for conflicts with bootstrap etc
		 *
		 * @type Array
		 **/
		conflictChecks = ['button', 'tooltip'],
		
		/**
		 * Node on which elfinder creating
		 *
		 * @type jQuery
		 **/
		node = jQuery(elm),
		
		/**
		 * Object of events originally registered in this node
		 * 
		 * @type Object
		 */
		prevEvents = jQuery.extend(true, {}, jQuery._data(node.get(0), 'events')),
		
		/**
		 * Store node contents.
		 *
		 * @see this.destroy
		 * @type jQuery
		 **/
		prevContent = jQuery('<div></div>').append(node.contents()).attr('class', node.attr('class') || '').attr('style', node.attr('style') || ''),
		
		/**
		 * Instance ID. Required to get/set cookie
		 *
		 * @type String
		 **/
		id = node.attr('id') || node.attr('id', 'elfauto' + jQuery('.elfinder').length).attr('id'),
		
		/**
		 * Events namespace
		 *
		 * @type String
		 **/
		namespace = 'elfinder-' + id,
		
		/**
		 * Mousedown event
		 *
		 * @type String
		 **/
		mousedown = 'mousedown.'+namespace,
		
		/**
		 * Keydown event
		 *
		 * @type String
		 **/
		keydown = 'keydown.'+namespace,
		
		/**
		 * Keypress event
		 *
		 * @type String
		 **/
		keypress = 'keypress.'+namespace,
		
		/**
		 * Keypup event
		 *
		 * @type String
		 **/
		keyup    = 'keyup.'+namespace,

		/**
		 * Is shortcuts/commands enabled
		 *
		 * @type Boolean
		 **/
		enabled = false,
		
		/**
		 * Store enabled value before ajax request
		 *
		 * @type Boolean
		 **/
		prevEnabled = false,
		
		/**
		 * List of build-in events which mapped into methods with same names
		 *
		 * @type Array
		 **/
		events = ['enable', 'disable', 'load', 'open', 'reload', 'select',  'add', 'remove', 'change', 'dblclick', 'getfile', 'lockfiles', 'unlockfiles', 'selectfiles', 'unselectfiles', 'dragstart', 'dragstop', 'search', 'searchend', 'viewchange'],
		
		/**
		 * Rules to validate data from backend
		 *
		 * @type Object
		 **/
		rules = {},
		
		/**
		 * Current working directory hash
		 *
		 * @type String
		 **/
		cwd = '',
		
		/**
		 * Current working directory options default
		 *
		 * @type Object
		 **/
		cwdOptionsDefault = {
			path          : '',
			url           : '',
			tmbUrl        : '',
			disabled      : [],
			separator     : '/',
			archives      : [],
			extract       : [],
			copyOverwrite : true,
			uploadOverwrite : true,
			uploadMaxSize : 0,
			jpgQuality    : 100,
			tmbCrop       : false,
			tmbReqCustomData : false,
			tmb           : false // old API
		},
		
		/**
		 * Current working directory options
		 *
		 * @type Object
		 **/
		cwdOptions = {},
		
		/**
		 * Files/dirs cache
		 *
		 * @type Object
		 **/
		files = {},
		
		/**
		 * Hidden Files/dirs cache
		 *
		 * @type Object
		 **/
		hiddenFiles = {},

		/**
		 * Files/dirs hash cache of each dirs
		 *
		 * @type Object
		 **/
		ownFiles = {},
		
		/**
		 * Selected files hashes
		 *
		 * @type Array
		 **/
		selected = [],
		
		/**
		 * Events listeners
		 *
		 * @type Object
		 **/
		listeners = {},
		
		/**
		 * Shortcuts
		 *
		 * @type Object
		 **/
		shortcuts = {},
		
		/**
		 * Buffer for copied files
		 *
		 * @type Array
		 **/
		clipboard = [],
		
		/**
		 * Copied/cuted files hashes
		 * Prevent from remove its from cache.
		 * Required for dispaly correct files names in error messages
		 *
		 * @type Object
		 **/
		remember = {},
		
		/**
		 * Queue for 'open' requests
		 *
		 * @type Array
		 **/
		queue = [],
		
		/**
		 * Queue for only cwd requests e.g. `tmb`
		 *
		 * @type Array
		 **/
		cwdQueue = [],
		
		/**
		 * Commands prototype
		 *
		 * @type Object
		 **/
		base = new self.command(self),
		
		/**
		 * elFinder node width
		 *
		 * @type String
		 * @default "auto"
		 **/
		width  = 'auto',
		
		/**
		 * elFinder node height
		 * Number: pixcel or String: Number + "%"
		 *
		 * @type Number | String
		 * @default 400
		 **/
		height = 400,
		
		/**
		 * Base node object or selector
		 * Element which is the reference of the height percentage
		 *
		 * @type Object|String
		 * @default null | jQuery(window) (if height is percentage)
		 **/
		heightBase = null,
		
		/**
		 * MIME type list(Associative array) handled as a text file
		 * 
		 * @type Object|null
		 */
		textMimes = null,
		
		/**
		 * elfinder path for sound played on remove
		 * @type String
		 * @default ./sounds/
		 **/
		soundPath = '../wp-content/plugins/wp-file-manager/lib/sounds/',
		
		/**
		 * JSON.stringify of previous fm.sorters
		 * @type String
		 */
		prevSorterStr = '',

		/**
		 * Map table of file extention to MIME-Type
		 * @type Object
		 */
		extToMimeTable,

		/**
		 * Disabled page unload function
		 * @type Boolean
		 */
		diableUnloadCheck = false,

		beeper = jQuery(document.createElement('audio')).hide().appendTo('body')[0],
			
		syncInterval,
		autoSyncStop = 0,
		
		uiCmdMapPrev = '',
		
		gcJobRes = null,
		
		open = function(data) {
			// NOTES: Do not touch data object
		
			var volumeid, contextmenu, emptyDirs = {}, stayDirs = {},
				rmClass, hashes, calc, gc, collapsed, prevcwd, sorterStr, diff;
			
			if (self.api >= 2.1) {
				// support volume driver option `uiCmdMap`
				self.commandMap = (data.options.uiCmdMap && Object.keys(data.options.uiCmdMap).length)? data.options.uiCmdMap : {};
				if (uiCmdMapPrev !== JSON.stringify(self.commandMap)) {
					uiCmdMapPrev = JSON.stringify(self.commandMap);
				}
			} else {
				self.options.sync = 0;
			}
			
			if (data.init) {
				// init - reset cache
				files = {};
				ownFiles = {};
			} else {
				// remove only files from prev cwd
				// and collapsed directory (included 100+ directories) to empty for perfomance tune in DnD
				prevcwd = cwd;
				rmClass = 'elfinder-subtree-loaded ' + self.res('class', 'navexpand');
				collapsed = self.res('class', 'navcollapse');
				hashes = Object.keys(files);
				calc = function(i) {
					if (!files[i]) {
						return true;
					}
					
					var isDir = (files[i].mime === 'directory'),
						phash = files[i].phash,
						pnav;
						
					if (
						(!isDir
							|| emptyDirs[phash]
							|| (!stayDirs[phash]
								&& self.navHash2Elm(files[i].hash).is(':hidden')
								&& self.navHash2Elm(phash).next('.elfinder-navbar-subtree').children().length > 100
							)
						)
						&& (isDir || phash !== cwd)
						&& ! remember[i]
					) {
						if (isDir && !emptyDirs[phash]) {
							emptyDirs[phash] = true;
							self.navHash2Elm(phash)
							 .removeClass(rmClass)
							 .next('.elfinder-navbar-subtree').empty();
						}
						deleteCache(files[i]);
					} else if (isDir) {
						stayDirs[phash] = true;
					}
				};
				gc = function() {
					if (hashes.length) {
						gcJobRes && gcJobRes._abort();
						gcJobRes = self.asyncJob(calc, hashes, {
							interval : 20,
							numPerOnce : 100
						}).done(function() {
							var hd = self.storage('hide') || {items: {}};
							if (Object.keys(hiddenFiles).length) {
								jQuery.each(hiddenFiles, function(h) {
									if (!hd.items[h]) {
										delete hiddenFiles[h];
									}
								});
							}
						});
					}
				};
				
				self.trigger('filesgc').one('filesgc', function() {
					hashes = [];
				});
				
				self.one('opendone', function() {
					if (prevcwd !== cwd) {
						if (! node.data('lazycnt')) {
							gc();
						} else {
							self.one('lazydone', gc);
						}
					}
				});
			}

			self.sorters = {};
			cwd = data.cwd.hash;
			cache(data.files);
			if (!files[cwd]) {
				cache([data.cwd]);
			} else {
				diff = self.diff([data.cwd], true);
				if (diff.changed.length) {
					cache(diff.changed, 'change');
					self.change({changed: diff.changed});
				}
			}
			data.changed && data.changed.length && cache(data.changed, 'change');

			// trigger event 'sorterupdate'
			sorterStr = JSON.stringify(self.sorters);
			if (prevSorterStr !== sorterStr) {
				self.trigger('sorterupdate');
				prevSorterStr = sorterStr;
			}

			self.lastDir(cwd);
			
			self.autoSync();
		},
		
		/**
		 * Store info about files/dirs in "files" object.
		 *
		 * @param  Array  files
		 * @param  String data type
		 * @return void
		 **/
		cache = function(data, type) {
			var type      = type || 'files',
				keeps = ['sizeInfo', 'encoding'],
				defsorter = { name: true, perm: true, date: true,  size: true, kind: true },
				sorterChk = !self.sorters._checked && (type === 'files'),
				l         = data.length,
				setSorter = function(file) {
					var f = file || {},
						sorters = [];
					jQuery.each(self.sortRules, function(key) {
						if (defsorter[key] || typeof f[key] !== 'undefined' || (key === 'mode' && typeof f.perm !== 'undefined')) {
							sorters.push(key);
						}
					});
					self.sorters = self.arrayFlip(sorters, true);
					self.sorters._checked = true;
				},
				changedParents = {},
				hideData = self.storage('hide') || {},
				hides = hideData.items || {},
				f, i, i1, keepProp, parents, hidden;

			for (i = 0; i < l; i++) {
				f = Object.assign({}, data[i]);
				hidden = (!hideData.show && hides[f.hash])? true : false;
				if (f.name && f.hash && f.mime) {
					if (!hidden) {
						if (sorterChk && f.phash === cwd) {
							setSorter(f);
							sorterChk = false;
						}
						
						if (f.phash && (type === 'add' || (type === 'change' && (!files[f.hash] || f.size !== files[f.hash])))) {
							if (parents = self.parents(f.phash)) {
								jQuery.each(parents, function() {
									changedParents[this] = true;
								});
							}
						}
					}

					if (files[f.hash]) {
						for (i1 =0; i1 < keeps.length; i1++) {
							if(files[f.hash][keeps[i1]] && ! f[keeps[i1]]) {
								f[keeps[i1]] = files[f.hash][keeps[i1]];
							}
						}
						if (f.sizeInfo && !f.size) {
							f.size = f.sizeInfo.size;
						}
						deleteCache(files[f.hash], true);
					}
					if (hides[f.hash]) {
						hiddenFiles[f.hash] = f;
					}
					if (hidden) {
						l--;
						data.splice(i--, 1);
					} else {
						files[f.hash] = f;
						if (f.mime === 'directory' && !ownFiles[f.hash]) {
							ownFiles[f.hash] = {};
						}
						if (f.phash) {
							if (!ownFiles[f.phash]) {
								ownFiles[f.phash] = {};
							}
							ownFiles[f.phash][f.hash] = true;
						}
					}
				}
			}
			// delete sizeInfo cache
			jQuery.each(Object.keys(changedParents), function() {
				var target = files[this];
				if (target && target.sizeInfo) {
					delete target.sizeInfo;
				}
			});
			
			// for empty folder
			sorterChk && setSorter();
		},
		
		/**
		 * Delete file object from files caches
		 * 
		 * @param  Array  removed hashes
		 * @return void
		 */
		remove = function(removed) {
			var l       = removed.length,
				roots   = {},
				rm      = function(hash) {
					var file = files[hash], i;
					if (file) {
						if (file.mime === 'directory') {
							if (roots[hash]) {
								delete self.roots[roots[hash]];
							}
							// restore stats of deleted root parent directory
							jQuery.each(self.leafRoots, function(phash, roots) {
								var idx, pdir;
								if ((idx = jQuery.inArray(hash, roots))!== -1) {
									if (roots.length === 1) {
										if ((pdir = Object.assign({}, files[phash])) && pdir._realStats) {
											jQuery.each(pdir._realStats, function(k, v) {
												pdir[k] = v;
											});
											remove(files[phash]._realStats);
											self.change({ changed: [pdir] });
										}
										delete self.leafRoots[phash];
									} else {
										self.leafRoots[phash].splice(idx, 1);
									}
								}
							});
							if (self.searchStatus.state < 2) {
								jQuery.each(files, function(h, f) {
									f.phash == hash && rm(h);
								});
							}
						}
						if (file.phash) {
							if (parents = self.parents(file.phash)) {
								jQuery.each(parents, function() {
									changedParents[this] = true;
								});
							}
						}
						deleteCache(files[hash]);
					}
				},
				changedParents = {},
				parents;
		
			jQuery.each(self.roots, function(k, v) {
				roots[v] = k;
			});
			while (l--) {
				rm(removed[l]);
			}
			// delete sizeInfo cache
			jQuery.each(Object.keys(changedParents), function() {
				var target = files[this];
				if (target && target.sizeInfo) {
					delete target.sizeInfo;
				}
			});
		},
		
		/**
		 * Update file object in files caches
		 * 
		 * @param  Array  changed file objects
		 * @return void
		 * @deprecated should be use `cache(updatesArrayData, 'change');`
		 */
		change = function(changed) {
			jQuery.each(changed, function(i, file) {
				var hash = file.hash;
				if (files[hash]) {
					jQuery.each(Object.keys(files[hash]), function(i, v){
						if (typeof file[v] === 'undefined') {
							delete files[hash][v];
						}
					});
				}
				files[hash] = files[hash] ? Object.assign(files[hash], file) : file;
			});
		},
		
		/**
		 * Delete cache data of files, ownFiles and self.optionsByHashes
		 * 
		 * @param  Object  file
		 * @param  Boolean update
		 * @return void
		 */
		deleteCache = function(file, update) {
			var hash = file.hash,
				phash = file.phash;
			
			if (phash && ownFiles[phash]) {
				 delete ownFiles[phash][hash];
			}
			if (!update) {
				ownFiles[hash] && delete ownFiles[hash];
				self.optionsByHashes[hash] && delete self.optionsByHashes[hash];
			}
			delete files[hash];
		},
		
		/**
		 * Maximum number of concurrent connections on request
		 * 
		 * @type Number
		 */
		requestMaxConn,
		
		/**
		 * Current number of connections
		 * 
		 * @type Number
		 */
		requestCnt = 0,
		
		/**
		 * Queue waiting for connection
		 * 
		 * @type Array
		 */
		requestQueue = [],
		
		/**
		 * Current open command instance
		 * 
		 * @type Object
		 */
		currentOpenCmd = null,

		/**
		 * Exec shortcut
		 *
		 * @param  jQuery.Event  keydown/keypress event
		 * @return void
		 */
		execShortcut = function(e) {
			var code    = e.keyCode,
				ctrlKey = !!(e.ctrlKey || e.metaKey),
				isMousedown = e.type === 'mousedown',
				ddm;

			!isMousedown && (self.keyState.keyCode = code);
			self.keyState.ctrlKey  = ctrlKey;
			self.keyState.shiftKey = e.shiftKey;
			self.keyState.metaKey  = e.metaKey;
			self.keyState.altKey   = e.altKey;
			if (isMousedown) {
				return;
			} else if (e.type === 'keyup') {
				self.keyState.keyCode = null;
				return;
			}

			if (enabled) {

				jQuery.each(shortcuts, function(i, shortcut) {
					if (shortcut.type    == e.type 
					&& shortcut.keyCode  == code 
					&& shortcut.shiftKey == e.shiftKey 
					&& shortcut.ctrlKey  == ctrlKey 
					&& shortcut.altKey   == e.altKey) {
						e.preventDefault();
						e.stopPropagation();
						shortcut.callback(e, self);
						self.debug('shortcut-exec', i+' : '+shortcut.description);
					}
				});
				
				// prevent tab out of elfinder
				if (code == jQuery.ui.keyCode.TAB && !jQuery(e.target).is(':input')) {
					e.preventDefault();
				}
				
				// cancel any actions by [Esc] key
				if (e.type === 'keydown' && code == jQuery.ui.keyCode.ESCAPE) {
					// copy or cut 
					if (! node.find('.ui-widget:visible').length) {
						self.clipboard().length && self.clipboard([]);
					}
					// dragging
					if (jQuery.ui.ddmanager) {
						ddm = jQuery.ui.ddmanager.current;
						ddm && ddm.helper && ddm.cancel();
					}
					// button menus
					self.toHide(node.find('.ui-widget.elfinder-button-menu.elfinder-frontmost:visible'));
					// trigger keydownEsc
					self.trigger('keydownEsc', e);
				}

			}
		},
		date = new Date(),
		utc,
		i18n,
		inFrame = (window.parent !== window),
		parentIframe = (function() {
			var pifm, ifms;
			if (inFrame) {
				try {
					ifms = jQuery('iframe', window.parent.document);
					if (ifms.length) {
						jQuery.each(ifms, function(i, ifm) {
							if (ifm.contentWindow === window) {
								pifm = jQuery(ifm);
								return false;
							}
						});
					}
				} catch(e) {}
			}
			return pifm;
		})(),
		/**
		 * elFinder boot up function
		 * 
		 * @type Function
		 */
		bootUp,
		/**
		 * Original function of XMLHttpRequest.prototype.send
		 * 
		 * @type Function
		 */
		savedXhrSend;
	
	// opts must be an object
	if (!opts) {
		opts = {};
	}
	
	// set UA.Angle, UA.Rotated for mobile devices
	if (self.UA.Mobile) {
		jQuery(window).on('orientationchange.'+namespace, function() {
			var a = ((screen && screen.orientation && screen.orientation.angle) || window.orientation || 0) + 0;
			if (a === -90) {
				a = 270;
			}
			self.UA.Angle = a;
			self.UA.Rotated = a % 180 === 0? false : true;
		}).trigger('orientationchange.'+namespace);
	}
	
	// check opt.bootCallback
	if (opts.bootCallback && typeof opts.bootCallback === 'function') {
		(function() {
			var func = bootCallback,
				opFunc = opts.bootCallback;
			bootCallback = function(fm, extraObj) {
				func && typeof func === 'function' && func.call(this, fm, extraObj);
				opFunc.call(this, fm, extraObj);
			};
		})();
	}
	delete opts.bootCallback;

	/**
	 * Protocol version
	 *
	 * @type String
	 **/
	this.api = null;
	
	/**
	 * elFinder use new api
	 *
	 * @type Boolean
	 **/
	this.newAPI = false;
	
	/**
	 * elFinder use old api
	 *
	 * @type Boolean
	 **/
	this.oldAPI = false;
	
	/**
	 * Net drivers names
	 *
	 * @type Array
	 **/
	this.netDrivers = [];
	
	/**
	 * Base URL of elfFinder library starting from Manager HTML
	 * 
	 * @type String
	 */
	this.baseUrl = '';
	
	/**
	 * Base URL of i18n js files
	 * baseUrl + "js/i18n/" when empty value
	 * 
	 * @type String
	 */
	this.i18nBaseUrl = '';

	/**
	 * Base URL of worker js files
	 * baseUrl + "js/worker/" when empty value
	 * 
	 * @type String
	 */
	 this.workerBaseUrl = '';

	/**
	 * Is elFinder CSS loaded
	 * 
	 * @type Boolean
	 */
	this.cssloaded = false;
	
	/**
	 * Current theme object
	 * 
	 * @type Object|Null
	 */
	this.theme = null;

	this.mimesCanMakeEmpty = {};

	/**
	 * Callback function at boot up that option specified at elFinder starting
	 * 
	 * @type Function
	 */
	this.bootCallback;

	/**
	 * Callback function at reload(restart) elFinder 
	 * 
	 * @type Function
	 */
	this.reloadCallback;

	/**
	 * ID. Required to create unique cookie name
	 *
	 * @type String
	 **/
	this.id = id;

	/**
	 * Method to store/fetch data
	 *
	 * @type Function
	 **/
	this.storage = (function() {
		try {
			if ('localStorage' in window && window.localStorage !== null) {
				if (self.UA.Safari) {
					// check for Mac/iOS safari private browsing mode
					window.localStorage.setItem('elfstoragecheck', 1);
					window.localStorage.removeItem('elfstoragecheck');
				}
				return self.localStorage;
			} else {
				return self.cookie;
			}
		} catch (e) {
			return self.cookie;
		}
	})();

	/**
	 * Set pause page unload check function or Get state
	 *
	 * @param      Boolean   state   To set state
	 * @param      Boolean   keep    Keep disabled
	 * @return     Boolean|void
	 */
	this.pauseUnloadCheck = function(state, keep) {
		if (typeof state === 'undefined') {
			return diableUnloadCheck;
		} else {
			diableUnloadCheck = !!state;
			if (state && !keep) {
				requestAnimationFrame(function() {
					diableUnloadCheck = false;
				});
			}
		}
	};

	/**
	 * Configuration options
	 *
	 * @type Object
	 **/
	//this.options = jQuery.extend(true, {}, this._options, opts);
	this.options = Object.assign({}, this._options);
	
	// for old type configuration
	if (opts.uiOptions) {
		if (opts.uiOptions.toolbar && Array.isArray(opts.uiOptions.toolbar)) {
			if (jQuery.isPlainObject(opts.uiOptions.toolbar[opts.uiOptions.toolbar.length - 1])) {
				self.options.uiOptions.toolbarExtra = Object.assign(self.options.uiOptions.toolbarExtra || {}, opts.uiOptions.toolbar.pop());
			}
		}
	}
	
	// Overwrite if opts value is an array
	(function() {
		var arrOv = function(obj, base) {
			if (jQuery.isPlainObject(obj)) {
				jQuery.each(obj, function(k, v) {
					if (jQuery.isPlainObject(v)) {
						if (!base[k]) {
							base[k] = {};
						}
						arrOv(v, base[k]);
					} else {
						base[k] = v;
					}
				});
			}
		};
		arrOv(opts, self.options);
	})();
	
	// join toolbarExtra to toolbar
	this.options.uiOptions.toolbar.push(this.options.uiOptions.toolbarExtra);
	delete this.options.uiOptions.toolbarExtra;

	/**
	 * Arrays that has to unbind events
	 * 
	 * @type Object
	 */
	this.toUnbindEvents = {};
	
	/**
	 * Attach listener to events
	 * To bind to multiply events at once, separate events names by space
	 * 
	 * @param  String  event(s) name(s)
	 * @param  Object  event handler or {done: handler}
	 * @param  Boolean priority first
	 * @return elFinder
	 */
	this.bind = function(event, callback, priorityFirst) {
		var i, len;
		
		if (callback && (typeof callback === 'function' || typeof callback.done === 'function')) {
			event = ('' + event).toLowerCase().replace(/^\s+|\s+$/g, '').split(/\s+/);
			
			len = event.length;
			for (i = 0; i < len; i++) {
				if (listeners[event[i]] === void(0)) {
					listeners[event[i]] = [];
				}
				listeners[event[i]][priorityFirst? 'unshift' : 'push'](callback);
			}
		}
		return this;
	};
	
	/**
	 * Remove event listener if exists
	 * To un-bind to multiply events at once, separate events names by space
	 *
	 * @param  String    event(s) name(s)
	 * @param  Function  callback
	 * @return elFinder
	 */
	this.unbind = function(event, callback) {
		var i, len, l, ci;
		
		event = ('' + event).toLowerCase().split(/\s+/);
		
		len = event.length;
		for (i = 0; i < len; i++) {
			if (l = listeners[event[i]]) {
				ci = jQuery.inArray(callback, l);
				ci > -1 && l.splice(ci, 1);
			}
		}
		
		callback = null;
		return this;
	};
	
	/**
	 * Fire event - send notification to all event listeners
	 * In the callback `this` becames an event object
	 *
	 * @param  String   event type
	 * @param  Object   data to send across event
	 * @param  Boolean  allow modify data (call by reference of data) default: true
	 * @return elFinder
	 */
	this.trigger = function(evType, data, allowModify) {
		var type      = evType.toLowerCase(),
			isopen    = (type === 'open'),
			dataIsObj = (typeof data === 'object'),
			handlers  = listeners[type] || [],
			dones     = [],
			i, l, jst, event;
		
		this.debug('event-'+type, data);
		
		if (! dataIsObj || typeof allowModify === 'undefined') {
			allowModify = true;
		}
		if (l = handlers.length) {
			event = jQuery.Event(type);
			if (data) {
				data._getEvent = function() {
					return event;
				};
			}
			if (allowModify) {
				event.data = data;
			}

			for (i = 0; i < l; i++) {
				if (! handlers[i]) {
					// probably un-binded this handler
					continue;
				}

				// handler is jQuery.Deferred(), call all functions upon completion
				if (handlers[i].done) {
					dones.push(handlers[i].done);
					continue;
				}
				
				// set `event.data` only callback has argument
				if (handlers[i].length) {
					if (!allowModify) {
						// to avoid data modifications. remember about "sharing" passing arguments in js :) 
						if (typeof jst === 'undefined') {
							try {
								jst = JSON.stringify(data);
							} catch(e) {
								jst = false;
							}
						}
						event.data = jst? JSON.parse(jst) : data;
					}
				}

				try {
					if (handlers[i].call(event, event, this) === false || event.isDefaultPrevented()) {
						this.debug('event-stoped', event.type);
						break;
					}
				} catch (ex) {
					window.console && window.console.log && window.console.log(ex);
				}
				
			}
			
			// call done functions
			if (l = dones.length) {
				for (i = 0; i < l; i++) {
					try {
						if (dones[i].call(event, event, this) === false || event.isDefaultPrevented()) {
							this.debug('event-stoped', event.type + '(done)');
							break;
						}
					} catch (ex) {
						window.console && window.console.log && window.console.log(ex);
					}
				}
			}

			if (this.toUnbindEvents[type] && this.toUnbindEvents[type].length) {
				jQuery.each(this.toUnbindEvents[type], function(i, v) {
					self.unbind(v.type, v.callback);
				});
				delete this.toUnbindEvents[type];
			}
		}
		return this;
	};
	
	/**
	 * Get event listeners
	 *
	 * @param  String   event type
	 * @return Array    listed event functions
	 */
	this.getListeners = function(event) {
		return event? listeners[event.toLowerCase()] : listeners;
	};

	// set fm.baseUrl
	this.baseUrl = (function() {
		var myTag, base, baseUrl;
		
		if (self.options.baseUrl) {
			return self.options.baseUrl;
		} else {
			baseUrl = '';
			myTag = null;
			jQuery('head > script').each(function() {
				if (this.src && this.src.match(/js\/elfinder(?:-[a-z0-9_-]+)?\.(?:min|full)\.js(?:$|\?)/i)) {
					myTag = jQuery(this);
					return false;
				}
			});
			if (myTag) {
				baseUrl = myTag.attr('src').replace(/js\/[^\/]+$/, '');
				if (! baseUrl.match(/^(https?\/\/|\/)/)) {
					// check <base> tag
					if (base = jQuery('head > base[href]').attr('href')) {
						baseUrl = base.replace(/\/$/, '') + '/' + baseUrl; 
					}
				}
			}
			if (baseUrl !== '') {
				self.options.baseUrl = baseUrl;
			} else {
				if (! self.options.baseUrl) {
					self.options.baseUrl = './';
				}
				baseUrl = self.options.baseUrl;
			}
			return baseUrl;
		}
	})();
	
	this.i18nBaseUrl = (this.options.i18nBaseUrl || this.baseUrl + 'js/i18n').replace(/\/$/, '') + '/';
	this.workerBaseUrl = (this.options.workerBaseUrl || this.baseUrl + 'js/worker').replace(/\/$/, '') + '/';

	this.options.maxErrorDialogs = Math.max(1, parseInt(this.options.maxErrorDialogs || 5));

	// set dispInlineRegex
	cwdOptionsDefault.dispInlineRegex = this.options.dispInlineRegex;

	// auto load required CSS
	if (this.options.cssAutoLoad) {
		(function() {
			var baseUrl = self.baseUrl,
				myCss = jQuery('head > link[href$="css/elfinder.min.css"],link[href$="css/elfinder.full.css"]:first').length,
				rmTag = function() {
					if (node.data('cssautoloadHide')) {
						node.data('cssautoloadHide').remove();
						node.removeData('cssautoloadHide');
					}
				},
				loaded = function() {
					if (!self.cssloaded) {
						rmTag();
						self.cssloaded = true;
						self.trigger('cssloaded');
					}
				};
			
			if (! myCss) {
				// to request CSS auto loading
				self.cssloaded = null;
			}

			// additional CSS files
			if (Array.isArray(self.options.cssAutoLoad)) {
				if (!self.options.themes.default) {
					// set as default theme
					self.options.themes = Object.assign({
						'default' : {
							'name': 'default',
							'cssurls': self.options.cssAutoLoad
						}
					}, self.options.themes);
					if (!self.options.theme) {
						self.options.theme = 'default';
					}
				} else {
					if (self.cssloaded === true) {
						self.loadCss(self.options.cssAutoLoad);
					} else {
						self.bind('cssloaded', function() {
							self.loadCss(self.options.cssAutoLoad);
						});
					}
				}
			}

			// try to load main css
			if (self.cssloaded === null) {
				// hide elFinder node while css loading
				node.addClass('elfinder')
					.data('cssautoloadHide', jQuery('<style>.elfinder{visibility:hidden;overflow:hidden}</style>'));
				jQuery('head').append(node.data('cssautoloadHide'));

				// set default theme
				if (!self.options.themes.default) {
					self.options.themes = Object.assign({
						'default' : {
							'name': 'default',
							'cssurls': '',
							'author': 'elFinder Project',
							'license': '3-clauses BSD'
						}
					}, self.options.themes);
					if (!self.options.theme) {
						self.options.theme = 'default';
					}
				}

				// Delay 'visibility' check it required for browsers such as Safari
				requestAnimationFrame(function() {
					if (node.css('visibility') === 'hidden') {
						// load CSS
						self.loadCss([baseUrl+'css/elfinder.min.css'], {
							dfd: jQuery.Deferred().done(function() {
								loaded();
							}).fail(function() {
								rmTag();
								if (!self.cssloaded) {
									self.cssloaded = false;
									self.bind('init', function() {
										if (!self.cssloaded) {
											self.error(['errRead', 'CSS (elfinder.min)']);
										}
									});
								}
							})
						});
					} else {
						loaded();
					}
				});
			}
		})();
	}

	// load theme if exists
	(function() {
		var theme,
			themes = self.options.themes,
			ids = Object.keys(themes || {});
		if (ids.length) {
			theme = self.storage('theme') || self.options.theme;
			if (!themes[theme]) {
				theme = ids[0];
			}
			if (self.cssloaded) {
				self.changeTheme(theme);
			} else {
				self.bind('cssloaded', function() {
					self.changeTheme(theme);
				});
			}
		}
	})();
	
	/**
	 * Volume option to set the properties of the root Stat
	 * 
	 * @type Object
	 */
	this.optionProperties = {
		icon: void(0),
		csscls: void(0),
		tmbUrl: void(0),
		uiCmdMap: {},
		netkey: void(0),
		disabled: []
	};
	
	if (! inFrame && ! this.options.enableAlways && jQuery('body').children().length === 2) { // only node and beeper
		this.options.enableAlways = true;
	}
	
	// make options.debug
	if (this.options.debug === true) {
		this.options.debug = 'all';
	} else if (Array.isArray(this.options.debug)) {
		(function() {
			var d = {};
			jQuery.each(self.options.debug, function() {
				d[this] = true;
			});
			self.options.debug = d;
		})();
	} else {
		this.options.debug = false;
	}
	
	/**
	 * Original functions evacuated by conflict check
	 * 
	 * @type Object
	 */
	this.noConflicts = {};
	
	/**
	 * Check and save conflicts with bootstrap etc
	 * 
	 * @type Function
	 */
	this.noConflict = function() {
		jQuery.each(conflictChecks, function(i, p) {
			if (jQuery.fn[p] && typeof jQuery.fn[p].noConflict === 'function') {
				self.noConflicts[p] = jQuery.fn[p].noConflict();
			}
		});
	};
	// do check conflict
	this.noConflict();
	
	/**
	 * Is elFinder over CORS
	 *
	 * @type Boolean
	 **/
	this.isCORS = false;
	
	// configure for CORS
	(function(){
		if (typeof self.options.cors !== 'undefined' && self.options.cors !== null) {
			self.isCORS = self.options.cors? true : false;
		} else {
			var parseUrl = document.createElement('a'),
				parseUploadUrl,
				selfProtocol = window.location.protocol,
				portReg = function(protocol) {
					protocol = (!protocol || protocol === ':')? selfProtocol : protocol;
					return protocol === 'https:'? /\:443$/ : /\:80$/;
				},
				selfHost = window.location.host.replace(portReg(selfProtocol), '');
			parseUrl.href = opts.url;
			if (opts.urlUpload && (opts.urlUpload !== opts.url)) {
				parseUploadUrl = document.createElement('a');
				parseUploadUrl.href = opts.urlUpload;
			}
			if (selfHost !== parseUrl.host.replace(portReg(parseUrl.protocol), '')
				|| (parseUrl.protocol !== ':'&& parseUrl.protocol !== '' && (selfProtocol !== parseUrl.protocol))
				|| (parseUploadUrl && 
					(selfHost !== parseUploadUrl.host.replace(portReg(parseUploadUrl.protocol), '')
					|| (parseUploadUrl.protocol !== ':' && parseUploadUrl.protocol !== '' && (selfProtocol !== parseUploadUrl.protocol))
					)
				)
			) {
				self.isCORS = true;
			}
		}
		if (self.isCORS) {
			if (!jQuery.isPlainObject(self.options.customHeaders)) {
				self.options.customHeaders = {};
			}
			if (!jQuery.isPlainObject(self.options.xhrFields)) {
				self.options.xhrFields = {};
			}
			self.options.requestType = 'post';
			self.options.customHeaders['X-Requested-With'] = 'XMLHttpRequest';
			self.options.xhrFields['withCredentials'] = true;
		}
	})();

	/**
	 * Ajax request type
	 *
	 * @type String
	 * @default "get"
	 **/
	this.requestType = /^(get|post)$/i.test(this.options.requestType) ? this.options.requestType.toLowerCase() : 'get';
	
	// set `requestMaxConn` by option
	requestMaxConn = Math.max(parseInt(this.options.requestMaxConn), 1);
	
	/**
	 * Custom data that given as options
	 * 
	 * @type Object
	 * @default {}
	 */
	this.optsCustomData = jQuery.isPlainObject(this.options.customData) ? this.options.customData : {};

	/**
	 * Any data to send across every ajax request
	 *
	 * @type Object
	 * @default {}
	 **/
	this.customData = Object.assign({}, this.optsCustomData);

	/**
	 * Previous custom data from connector
	 * 
	 * @type Object|null
	 */
	this.prevCustomData = null;

	/**
	 * Any custom headers to send across every ajax request
	 *
	 * @type Object
	 * @default {}
	*/
	this.customHeaders = jQuery.isPlainObject(this.options.customHeaders) ? this.options.customHeaders : {};

	/**
	 * Any custom xhrFields to send across every ajax request
	 *
	 * @type Object
	 * @default {}
	 */
	this.xhrFields = jQuery.isPlainObject(this.options.xhrFields) ? this.options.xhrFields : {};

	/**
	 * Replace XMLHttpRequest.prototype.send to extended function for 3rd party libs XHR request etc.
	 * 
	 * @type Function
	 */
	this.replaceXhrSend = function() {
		if (! savedXhrSend) {
			savedXhrSend = XMLHttpRequest.prototype.send;
		}
		XMLHttpRequest.prototype.send = function() {
			var xhr = this;
			// set request headers
			if (self.customHeaders) {
				jQuery.each(self.customHeaders, function(key) {
					xhr.setRequestHeader(key, this);
				});
			}
			// set xhrFields
			if (self.xhrFields) {
				jQuery.each(self.xhrFields, function(key) {
					if (key in xhr) {
						xhr[key] = this;
					}
				});
			}
			return savedXhrSend.apply(this, arguments);
		};
	};
	
	/**
	 * Restore saved original XMLHttpRequest.prototype.send
	 * 
	 * @type Function
	 */
	this.restoreXhrSend = function() {
		savedXhrSend && (XMLHttpRequest.prototype.send = savedXhrSend);
	};

	/**
	 * command names for into queue for only cwd requests
	 * these commands aborts before `open` request
	 *
	 * @type Array
	 * @default ['tmb', 'parents']
	 */
	this.abortCmdsOnOpen = this.options.abortCmdsOnOpen || ['tmb', 'parents'];

	/**
	 * ui.nav id prefix
	 * 
	 * @type String
	 */
	this.navPrefix = 'nav' + (elFinder.prototype.uniqueid? elFinder.prototype.uniqueid : '') + '-';
	
	/**
	 * ui.cwd id prefix
	 * 
	 * @type String
	 */
	this.cwdPrefix = elFinder.prototype.uniqueid? ('cwd' + elFinder.prototype.uniqueid + '-') : '';
	
	// Increment elFinder.prototype.uniqueid
	++elFinder.prototype.uniqueid;
	
	/**
	 * URL to upload files
	 *
	 * @type String
	 **/
	this.uploadURL = opts.urlUpload || opts.url;
	
	/**
	 * Events namespace
	 *
	 * @type String
	 **/
	this.namespace = namespace;

	/**
	 * Today timestamp
	 *
	 * @type Number
	 **/
	this.today = (new Date(date.getFullYear(), date.getMonth(), date.getDate())).getTime()/1000;
	
	/**
	 * Yesterday timestamp
	 *
	 * @type Number
	 **/
	this.yesterday = this.today - 86400;
	
	utc = this.options.UTCDate ? 'UTC' : '';
	
	this.getHours    = 'get'+utc+'Hours';
	this.getMinutes  = 'get'+utc+'Minutes';
	this.getSeconds  = 'get'+utc+'Seconds';
	this.getDate     = 'get'+utc+'Date';
	this.getDay      = 'get'+utc+'Day';
	this.getMonth    = 'get'+utc+'Month';
	this.getFullYear = 'get'+utc+'FullYear';
	
	/**
	 * elFinder node z-index (auto detect on elFinder load)
	 *
	 * @type null | Number
	 **/
	this.zIndex;

	/**
	 * Current search status
	 * 
	 * @type Object
	 */
	this.searchStatus = {
		state  : 0, // 0: search ended, 1: search started, 2: in search result
		query  : '',
		target : '',
		mime   : '',
		mixed  : false, // in multi volumes search: false or Array that target volume ids
		ininc  : false // in incremental search
	};

	/**
	 * Interface language
	 *
	 * @type String
	 * @default "en"
	 **/
	this.lang = this.storage('lang') || this.options.lang;
	if (this.lang === 'jp') {
		this.lang = this.options.lang = 'ja';
	}

	this.viewType = this.storage('view') || this.options.defaultView || 'icons';

	this.sortType = this.storage('sortType') || this.options.sortType || 'name';
	
	this.sortOrder = this.storage('sortOrder') || this.options.sortOrder || 'asc';

	this.sortStickFolders = this.storage('sortStickFolders');
	if (this.sortStickFolders === null) {
		this.sortStickFolders = !!this.options.sortStickFolders;
	} else {
		this.sortStickFolders = !!this.sortStickFolders;
	}

	this.sortAlsoTreeview = this.storage('sortAlsoTreeview');
	if (this.sortAlsoTreeview === null || this.options.sortAlsoTreeview === null) {
		this.sortAlsoTreeview = !!this.options.sortAlsoTreeview;
	} else {
		this.sortAlsoTreeview = !!this.sortAlsoTreeview;
	}

	this.sortRules = jQuery.extend(true, {}, this._sortRules, this.options.sortRules);
	
	jQuery.each(this.sortRules, function(name, method) {
		if (typeof method != 'function') {
			delete self.sortRules[name];
		} 
	});
	
	this.compare = jQuery.proxy(this.compare, this);
	
	/**
	 * Delay in ms before open notification dialog
	 *
	 * @type Number
	 * @default 500
	 **/
	this.notifyDelay = this.options.notifyDelay > 0 ? parseInt(this.options.notifyDelay) : 500;
	
	/**
	 * Dragging UI Helper object
	 *
	 * @type jQuery | null
	 **/
	this.draggingUiHelper = null;
	
	/**
	 * Base droppable options
	 *
	 * @type Object
	 **/
	this.droppable = {
		greedy     : true,
		tolerance  : 'pointer',
		accept     : '.elfinder-cwd-file-wrapper,.elfinder-navbar-dir,.elfinder-cwd-file,.elfinder-cwd-filename',
		hoverClass : this.res('class', 'adroppable'),
		classes    : { // Deprecated hoverClass jQueryUI>=1.12.0
			'ui-droppable-hover': this.res('class', 'adroppable')
		},
		autoDisable: true, // elFinder original, see jquery.elfinder.js
		drop : function(e, ui) {
			var dst     = jQuery(this),
				targets = jQuery.grep(ui.helper.data('files')||[], function(h) { return h? true : false; }),
				result  = [],
				dups    = [],
				faults  = [],
				isCopy  = ui.helper.hasClass('elfinder-drag-helper-plus'),
				c       = 'class',
				cnt, hash, i, h;
			
			if (typeof e.button === 'undefined' || ui.helper.data('namespace') !== namespace || ! self.insideWorkzone(e.pageX, e.pageY)) {
				return false;
			}
			if (dst.hasClass(self.res(c, 'cwdfile'))) {
				hash = self.cwdId2Hash(dst.attr('id'));
			} else if (dst.hasClass(self.res(c, 'navdir'))) {
				hash = self.navId2Hash(dst.attr('id'));
			} else {
				hash = cwd;
			}

			cnt = targets.length;
			
			while (cnt--) {
				h = targets[cnt];
				// ignore drop into itself or in own location
				if (h != hash && files[h].phash != hash) {
					result.push(h);
				} else {
					((isCopy && h !== hash && files[hash].write)? dups : faults).push(h);
				}
			}
			
			if (faults.length) {
				return false;
			}
			
			ui.helper.data('droped', true);
			
			if (dups.length) {
				ui.helper.hide();
				self.exec('duplicate', dups, {_userAction: true});
			}
			
			if (result.length) {
				ui.helper.hide();
				self.clipboard(result, !isCopy);
				self.exec('paste', hash, {_userAction: true}, hash).always(function(){
					self.clipboard([]);
					self.trigger('unlockfiles', {files : targets});
				});
				self.trigger('drop', {files : targets});
			}
		}
	};
	
	/**
	 * Return true if filemanager is active
	 *
	 * @return Boolean
	 **/
	this.enabled = function() {
		return enabled && this.visible();
	};
	
	/**
	 * Return true if filemanager is visible
	 *
	 * @return Boolean
	 **/
	this.visible = function() {
		return node[0].elfinder && node.is(':visible');
	};
	
	/**
	 * Return file is root?
	 * 
	 * @param  Object  target file object
	 * @return Boolean
	 */
	this.isRoot = function(file) {
		return (file.isroot || ! file.phash)? true : false;
	};
	
	/**
	 * Return root dir hash for current working directory
	 * 
	 * @param  String   target hash
	 * @param  Boolean  include fake parent (optional)
	 * @return String
	 */
	this.root = function(hash, fake) {
		hash = hash || cwd;
		var dir, i;
		
		if (! fake) {
			jQuery.each(self.roots, function(id, rhash) {
				if (hash.indexOf(id) === 0) {
					dir = rhash;
					return false;
				}
			});
			if (dir) {
				return dir;
			}
		}
		
		dir = files[hash];
		while (dir && dir.phash && (fake || ! dir.isroot)) {
			dir = files[dir.phash];
		}
		if (dir) {
			return dir.hash;
		}
		
		while (i in files && files.hasOwnProperty(i)) {
			dir = files[i];
			if (dir.mime === 'directory' && !dir.phash && dir.read) {
				return dir.hash;
			}
		}
		
		return '';
	};
	
	/**
	 * Return current working directory info
	 * 
	 * @return Object
	 */
	this.cwd = function() {
		return files[cwd] || {};
	};
	
	/**
	 * Return required cwd option
	 * 
	 * @param  String  option name
	 * @param  String  target hash (optional)
	 * @return mixed
	 */
	this.option = function(name, target) {
		var res, item;
		target = target || cwd;
		if (self.optionsByHashes[target] && typeof self.optionsByHashes[target][name] !== 'undefined') {
			return self.optionsByHashes[target][name];
		}
		if (self.hasVolOptions && cwd !== target && (!(item = self.file(target)) || item.phash !== cwd)) {
			res = '';
			jQuery.each(self.volOptions, function(id, opt) {
				if (target.indexOf(id) === 0) {
					res = opt[name] || '';
					return false;
				}
			});
			return res;
		} else {
			return cwdOptions[name] || '';
		}
	};
	
	/**
	 * Return disabled commands by each folder
	 * 
	 * @param  Array  target hashes
	 * @return Array
	 */
	this.getDisabledCmds = function(targets, flip) {
		var disabled = {'hidden': true};
		if (! Array.isArray(targets)) {
			targets = [ targets ];
		}
		jQuery.each(targets, function(i, h) {
			var disCmds = self.option('disabledFlip', h);
			if (disCmds) {
				Object.assign(disabled, disCmds);
			}
		});
		return flip? disabled : Object.keys(disabled);
	};
	
	/**
	 * Return file data from current dir or tree by it's hash
	 * 
	 * @param  String  file hash
	 * @return Object
	 */
	this.file = function(hash, alsoHidden) { 
		return hash? (files[hash] || (alsoHidden? hiddenFiles[hash] : void(0))) : void(0); 
	};
	
	/**
	 * Return all cached files
	 * 
	 * @param  String  parent hash
	 * @return Object
	 */
	this.files = function(phash) {
		var items = {};
		if (phash) {
			if (!ownFiles[phash]) {
				return {};
			}
			jQuery.each(ownFiles[phash], function(h) {
				if (files[h]) {
					items[h] = files[h];
				} else {
					delete ownFiles[phash][h];
				}
			});
			return Object.assign({}, items);
		}
		return Object.assign({}, files);
	};
	
	/**
	 * Return list of file parents hashes include file hash
	 * 
	 * @param  String  file hash
	 * @return Array
	 */
	this.parents = function(hash) {
		var parents = [],
			dir;
		
		while (hash && (dir = this.file(hash))) {
			parents.unshift(dir.hash);
			hash = dir.phash;
		}
		return parents;
	};
	
	this.path2array = function(hash, i18) {
		var file, 
			path = [];
			
		while (hash) {
			if ((file = files[hash]) && file.hash) {
				path.unshift(i18 && file.i18 ? file.i18 : file.name);
				hash = file.isroot? null : file.phash;
			} else {
				path = [];
				break;
			}
		}
			
		return path;
	};
	
	/**
	 * Return file path or Get path async with jQuery.Deferred
	 * 
	 * @param  Object  file
	 * @param  Boolean i18
	 * @param  Object  asyncOpt
	 * @return String|jQuery.Deferred
	 */
	this.path = function(hash, i18, asyncOpt) { 
		var path = files[hash] && files[hash].path
			? files[hash].path
			: this.path2array(hash, i18).join(cwdOptions.separator);
		if (! asyncOpt || ! files[hash]) {
			return path;
		} else {
			asyncOpt = Object.assign({notify: {type : 'parents', cnt : 1, hideCnt : true}}, asyncOpt);
			
			var dfd    = jQuery.Deferred(),
				notify = asyncOpt.notify,
				noreq  = false,
				req    = function() {
					self.request({
						data : {cmd : 'parents', target : files[hash].phash},
						notify : notify,
						preventFail : true
					})
					.done(done)
					.fail(function() {
						dfd.reject();
					});
				},
				done   = function() {
					self.one('parentsdone', function() {
						path = self.path(hash, i18);
						if (path === '' && noreq) {
							//retry with request
							noreq = false;
							req();
						} else {
							if (notify) {
								clearTimeout(ntftm);
								notify.cnt = -(parseInt(notify.cnt || 0));
								self.notify(notify);
							}
							dfd.resolve(path);
						}
					});
				},
				ntftm;
		
			if (path) {
				return dfd.resolve(path);
			} else {
				if (self.ui['tree']) {
					// try as no request
					if (notify) {
						ntftm = setTimeout(function() {
							self.notify(notify);
						}, self.notifyDelay);
					}
					noreq = true;
					done(true);
				} else {
					req();
				}
				return dfd;
			}
		}
	};
	
	/**
	 * Return file url if set
	 * 
	 * @param  String  file hash
	 * @param  Object  Options
	 * @return String|Object of jQuery Deferred
	 */
	this.url = function(hash, o) {
		var file   = files[hash],
			opts   = o || {},
			async  = opts.async || false,
			temp   = opts.temporary || false,
			onetm  = (opts.onetime && self.option('onetimeUrl', hash)) || false,
			absurl = opts.absurl || false,
			dfrd   = (async || onetm)? jQuery.Deferred() : null,
			filter = function(url) {
				if (url && absurl) {
					url = self.convAbsUrl(url);
				}
				return url;
			},
			getUrl = function(url) {
				if (url) {
					return filter(url);
				}
				if (file.url) {
					return filter(file.url);
				}
				
				if (typeof baseUrl === 'undefined') {
					baseUrl = getBaseUrl();
				}
				
				if (baseUrl) {
					return filter(baseUrl + jQuery.map(self.path2array(hash), function(n) { return encodeURIComponent(n); }).slice(1).join('/'));
				}

				var params = Object.assign({}, self.customData, {
					cmd: 'file',
					target: file.hash
				});
				if (self.oldAPI) {
					params.cmd = 'open';
					params.current = file.phash;
				}
				return filter(self.options.url + (self.options.url.indexOf('?') === -1 ? '?' : '&') + jQuery.param(params, true));
			},
			getBaseUrl = function() {
				return self.option('url', (!self.isRoot(file) && file.phash) || file.hash);
			},
			baseUrl, res;
		
		if (!file || !file.read) {
			return async? dfrd.resolve('') : '';
		}
		
		if (onetm && (!file.url || file.url == '1') && !(baseUrl = getBaseUrl())) {
			async = true;
			this.request({
				data : { cmd : 'url', target : hash, options : { onetime: 1 } },
				preventDefault : true,
				options: {async: async},
				notify: {type : 'file', cnt : 1, hideCnt : true},
				progressBar: opts.progressBar
			}).done(function(data) {
				dfrd.resolve(filter(data.url || ''));
			}).fail(function() {
				dfrd.resolve('');
			});
		} else {
			if (file.url == '1' || (temp && !file.url && !(baseUrl = getBaseUrl()))) {
				this.request({
					data : { cmd : 'url', target : hash, options : { temporary: temp? 1 : 0 } },
					preventDefault : true,
					options: {async: async},
					notify: async? {type : temp? 'file' : 'url', cnt : 1, hideCnt : true} : {},
					progressBar: opts.progressBar
				})
				.done(function(data) {
					file.url = data.url || '';
				})
				.fail(function() {
					file.url = '';
				})
				.always(function() {
					var url;
					if (file.url && temp) {
						url = file.url;
						file.url = '1'; // restore
					}
					if (async) {
						dfrd.resolve(getUrl(url));
					} else {
						return getUrl(url);
					}
				});
			} else {
				if (async) {
					dfrd.resolve(getUrl());
				} else {
					return getUrl();
				}
			}
		}
		if (async) {
			return dfrd;
		}
	};
	
	/**
	 * Return file url for the extarnal service
	 *
	 * @param      String  hash     The hash
	 * @param      Object  options  The options
	 * @return     Object  jQuery Deferred
	 */
	this.forExternalUrl = function(hash, options) {
		var onetime = self.option('onetimeUrl', hash),
			opts = {
				async: true,
				absurl: true
			};

		opts[onetime? 'onetime' : 'temporary'] = true;
		return self.url(hash, Object.assign({}, options, opts));
	};

	/**
	 * Return file url for open in elFinder
	 * 
	 * @param  String  file hash
	 * @param  Boolean for download link
	 * @param      Object  requestOpts   The request options
	 * @return String
	 */
	this.openUrl = function(hash, download, callback, requestOpts) {
		var file = files[hash],
			url  = '',
			onetimeSize = (requestOpts || {}).onetimeSize || (5 * 1024 * 1024);
		
		if (!file || !file.read) {
			return '';
		}
		
		if (!download || download === 'sameorigin') {
			if (file.url) {
				if (file.url != 1) {
					url = file.url;
				}
			} else if (cwdOptions.url && file.hash.indexOf(self.cwd().volumeid) === 0) {
				url = cwdOptions.url + jQuery.map(this.path2array(hash), function(n) { return encodeURIComponent(n); }).slice(1).join('/');
			}
			if (!download || this.isSameOrigin(url)) {
				if (url) {
					url += (url.match(/\?/)? '&' : '?') + '_'.repeat((url.match(/[\?&](_+)t=/g) || ['&t=']).sort().shift().match(/[\?&](_*)t=/)[1].length + 1) + 't=' + (file.ts || parseInt(+new Date()/1000));
					if (callback) {
						callback(url);
						return;
					} else {
						return url;
					}
				}
			}
		}
		
		if (callback && this.hasParrotHeaders()) {
			if (!requestOpts) {
				requestOpts = {};
			} else {
				delete requestOpts.onetimeSize;
			}
			if (!requestOpts.onetime && !requestOpts.temporary && file.size > onetimeSize) {
				if (file.mime.match(/^video|audio/)) {
					requestOpts.temporary = true;
				} else {
					requestOpts.onetime = true;
				}
			}
			if (requestOpts.onetime || requestOpts.temporary) {
				return this.url(file.hash, Object.assign({
					async: true
				}, requestOpts)).done(function(url) {
					callback(url);
				}).fail(function() {
					callback('');
				});
			} else {
				return this.getContents(hash, 'blob', requestOpts).done(function(blob){
					url = (window.URL || window.webkitURL).createObjectURL(blob);
					callback(url);
				}).fail(function() {
					callback('');
				});
			}
		} else {
			url = this.options.url;
			url = url + (url.indexOf('?') === -1 ? '?' : '&')
				+ (this.oldAPI ? 'cmd=open&current='+file.phash : 'cmd=file')
				+ '&target=' + file.hash
				+ '&_t=' + (file.ts || parseInt(+new Date()/1000));
			
			if (download === true) {
				url += '&download=1';
			}
			
			jQuery.each(this.customData, function(key, val) {
				url += '&' + encodeURIComponent(key) + '=' + encodeURIComponent(val);
			});
			if (callback) {
				callback(url);
				return;
			} else {
				return url;
			}
		}
	};
	
	/**
	 * Return thumbnail url
	 * 
	 * @param  Object  file object
	 * @return String
	 */
	this.tmb = function(file) {
		var tmbUrl, tmbCrop,
			cls    = 'elfinder-cwd-bgurl',
			url    = '',
			cData  = {},
			n      = 0;

		if (jQuery.isPlainObject(file)) {
			if (self.searchStatus.state && file.hash.indexOf(self.cwd().volumeid) !== 0) {
				tmbUrl = self.option('tmbUrl', file.hash);
				tmbCrop = self.option('tmbCrop', file.hash);
			} else {
				tmbUrl = cwdOptions.tmbUrl;
				tmbCrop = cwdOptions.tmbCrop;
			}
			if (tmbCrop) {
				cls += ' elfinder-cwd-bgurl-crop';
			}
			if (tmbUrl === 'self' && file.mime.indexOf('image/') === 0) {
				url = self.openUrl(file.hash);
				cls += ' elfinder-cwd-bgself';
			} else if ((self.oldAPI || tmbUrl) && file && file.tmb && file.tmb != 1) {
				url = tmbUrl + file.tmb;
			} else if (self.newAPI && file && file.tmb && file.tmb != 1) {
				url = file.tmb;
			}
			if (url) {
				if (tmbUrl !== 'self') {
					if (file.ts) {
						cData._t = file.ts;
					}
					if (cwdOptions.tmbReqCustomData && Object.keys(this.customData).length) {
						cData = Object.assign(cData, this.customData);
					}
					if (Object.keys(cData).length) {
						url += (url.match(/\?/) ? '&' : '?');
						jQuery.each(cData, function (key, val) {
							url += ((n++ === 0)? '' : '&') + encodeURIComponent(key) + '=' + encodeURIComponent(val);
						});
					}
				}
				return { url: url, className: cls };
			}
		}
		
		return false;
	};
	
	/**
	 * Return selected files hashes
	 *
	 * @return Array
	 **/
	this.selected = function() {
		return selected.slice(0);
	};
	
	/**
	 * Return selected files info
	 * 
	 * @return Array
	 */
	this.selectedFiles = function() {
		return jQuery.map(selected, function(hash) { return files[hash] ? Object.assign({}, files[hash]) : null; });
	};
	
	/**
	 * Return true if file with required name existsin required folder
	 * 
	 * @param  String  file name
	 * @param  String  parent folder hash
	 * @return Boolean
	 */
	this.fileByName = function(name, phash) {
		var hash;
	
		for (hash in files) {
			if (files.hasOwnProperty(hash) && files[hash].phash == phash && files[hash].name == name) {
				return files[hash];
			}
		}
	};
	
	/**
	 * Valid data for required command based on rules
	 * 
	 * @param  String  command name
	 * @param  Object  cammand's data
	 * @return Boolean
	 */
	this.validResponse = function(cmd, data) {
		return data.error || this.rules[this.rules[cmd] ? cmd : 'defaults'](data);
	};
	
	/**
	 * Return bytes from ini formated size
	 * 
	 * @param  String  ini formated size
	 * @return Integer
	 */
	this.returnBytes = function(val) {
		var last;
		if (isNaN(val)) {
			if (! val) {
				val = '';
			}
			// for ex. 1mb, 1KB
			val = val.replace(/b$/i, '');
			last = val.charAt(val.length - 1).toLowerCase();
			val = val.replace(/[tgmk]$/i, '');
			if (last == 't') {
				val = val * 1024 * 1024 * 1024 * 1024;
			} else if (last == 'g') {
				val = val * 1024 * 1024 * 1024;
			} else if (last == 'm') {
				val = val * 1024 * 1024;
			} else if (last == 'k') {
				val = val * 1024;
			}
			val = isNaN(val)? 0 : parseInt(val);
		} else {
			val = parseInt(val);
			if (val < 1) val = 0;
		}
		return val;
	};
	
	/**
	 * Process ajax request.
	 * Fired events :
	 * @todo
	 * @example
	 * @todo
	 * @return jQuery.Deferred
	 */
	this.request = function(opts) { 
		var self     = this,
			o        = this.options,
			dfrd     = jQuery.Deferred(),
			// request ID
			reqId    = (+ new Date()).toString(16) + Math.floor(1000 * Math.random()).toString(16), 
			// request data
			data     = Object.assign({}, self.customData, {mimes : o.onlyMimes}, opts.data || opts),
			// command name
			cmd      = data.cmd,
			// request type is binary
			isBinary = (opts.options || {}).dataType === 'binary',
			// current cmd is "open"
			isOpen   = (!opts.asNotOpen && cmd === 'open'),
			// call default fail callback (display error dialog) ?
			deffail  = !(isBinary || opts.preventDefault || opts.preventFail),
			// call default success callback ?
			defdone  = !(isBinary || opts.preventDefault || opts.preventDone),
			// current progress of receive data
			prog     = opts.progressVal || 20,
			// timer of fake progress
			progTm   = null,
			// whether the notification dialog is currently displayed
			hasNotify= false,
			// options for notify dialog
			notify   = !opts.progressBar? (opts.notify? Object.assign({progress: prog * opts.notify.cnt}, opts.notify) : {}) : {},
			// make cancel button
			cancel   = !!opts.cancel,
			// do not normalize data - return as is
			raw      = isBinary || !!opts.raw,
			// sync files on request fail
			syncOnFail = opts.syncOnFail,
			// use lazy()
			lazy     = !!opts.lazy,
			// prepare function before done()
			prepare  = opts.prepare,
			// navigate option object when cmd done
			navigate = opts.navigate,
			// open notify dialog timeout
			timeout,
			// use browser cache
			useCache = (opts.options || {}).cache,
			// request options
			options = Object.assign({
				url      : o.url,
				async    : true,
				type     : this.requestType,
				dataType : 'json',
				cache    : (self.api >= 2.1029), // api >= 2.1029 has unique request ID
				data     : data,
				headers  : this.customHeaders,
				xhrFields: this.xhrFields,
				progress : function(e) {
					var p = e.loaded / e.total * 100;
					progTm && clearTimeout(progTm);
					if (opts.progressBar) {
						try {
							opts.progressBar.width(p + '%');
						} catch(e) {}
					} else {
						if (hasNotify && notify.type) {
							p = p * notify.cnt;
							if (prog < p) {
								self.notify({
									type: notify.type,
									progress: p - prog,
									cnt: 0,
									hideCnt: notify.hideCnt
								});
								prog = p;
							}
						}
					}
					if (opts.progress) {
						try {
							opts.progress(e);
						} catch(e) {}
					}
				}
			}, opts.options || {}),
			/**
			 * Default success handler. 
			 * Call default data handlers and fire event with command name.
			 *
			 * @param Object  normalized response data
			 * @return void
			 **/
			done = function(data) {
				data.warning && self.error(data.warning);
				
				if (isOpen) {
					open(data);
				} else {
					self.updateCache(data);
				}
				
				self.lazy(function() {
					// fire some event to update cache/ui
					data.removed && data.removed.length && self.remove(data);
					data.added   && data.added.length   && self.add(data);
					data.changed && data.changed.length && self.change(data);
				}).then(function() {
					// fire event with command name
					return self.lazy(function() {
						self.trigger(cmd, data, false);
					});
				}).then(function() {
					// fire event with command name + 'done'
					return self.lazy(function() {
						self.trigger(cmd + 'done');
					});
				}).then(function() {
					// make toast message
					if (data.toasts && Array.isArray(data.toasts)) {
						jQuery.each(data.toasts, function() {
							this.msg && self.toast(this);
						});
					}
					// force update content
					data.sync && self.sync();
				});
			},
			/**
			 * Request error handler. Reject dfrd with correct error message.
			 *
			 * @param jqxhr  request object
			 * @param String request status
			 * @return void
			 **/
			error = function(xhr, status) {
				var error, data, 
					d = self.options.debug;
				
				switch (status) {
					case 'abort':
						error = xhr.quiet ? '' : ['errConnect', 'errAbort'];
						break;
					case 'timeout':	    
						error = ['errConnect', 'errTimeout'];
						break;
					case 'parsererror': 
						error = ['errResponse', 'errDataNotJSON'];
						if (xhr.responseText) {
							if (! cwd || (d && (d === 'all' || d['backend-error']))) {
								error.push(xhr.responseText);
							}
						}
						break;
					default:
						if (xhr.responseText) {
							// check responseText, Is that JSON?
							try {
								data = JSON.parse(xhr.responseText);
								if (data && data.error) {
									error = data.error;
								}
							} catch(e) {}
						}
						if (! error) {
							if (xhr.status == 403) {
								error = ['errConnect', 'errAccess', 'HTTP error ' + xhr.status];
							} else if (xhr.status == 404) {
								error = ['errConnect', 'errNotFound', 'HTTP error ' + xhr.status];
							} else if (xhr.status >= 500) {
								error = ['errResponse', 'errServerError', 'HTTP error ' + xhr.status];
							} else {
								if (xhr.status == 414 && options.type === 'get') {
									// retry by POST method
									options.type = 'post';
									self.abortXHR(xhr);
									dfrd.xhr = xhr = self.transport.send(options).fail(error).done(success);
									return;
								}
								error = xhr.quiet ? '' : ['errConnect', 'HTTP error ' + xhr.status];
							} 
						}
				}
				
				self.trigger(cmd + 'done');
				dfrd.reject({error: error}, xhr, status);
			},
			/**
			 * Request success handler. Valid response data and reject/resolve dfrd.
			 *
			 * @param Object  response data
			 * @param String request status
			 * @return void
			 **/
			success = function(response) {
				// Set currrent request command name
				self.currentReqCmd = cmd;
				
				response.debug && self.responseDebug(response);
				
				self.setCustomHeaderByXhr(xhr);

				if (raw) {
					self.abortXHR(xhr);
					response && response.debug && self.debug('backend-debug', response);
					return dfrd.resolve(response);
				}
				
				if (!response) {
					return dfrd.reject({error :['errResponse', 'errDataEmpty']}, xhr, response);
				} else if (!jQuery.isPlainObject(response)) {
					return dfrd.reject({error :['errResponse', 'errDataNotJSON']}, xhr, response);
				} else if (response.error) {
					if (isOpen) {
						// check leafRoots
						jQuery.each(self.leafRoots, function(phash, roots) {
							self.leafRoots[phash] = jQuery.grep(roots, function(h) { return h !== data.target; });
						});
					}
					return dfrd.reject({error :response.error}, xhr, response);
				}
				
				var resolve = function() {
					var pushLeafRoots = function(name) {
						if (self.leafRoots[data.target] && response[name]) {
							jQuery.each(self.leafRoots[data.target], function(i, h) {
								var root;
								if (root = self.file(h)) {
									response[name].push(root);
								}
							});
						}
					},
					setTextMimes = function() {
						self.textMimes = {};
						jQuery.each(self.res('mimes', 'text'), function() {
							self.textMimes[this.toLowerCase()] = true;
						});
					},
					actionTarget;
					
					if (isOpen) {
						pushLeafRoots('files');
					} else if (cmd === 'tree') {
						pushLeafRoots('tree');
					}
					
					response = self.normalize(response);
					
					if (!self.validResponse(cmd, response)) {
						return dfrd.reject({error :(response.norError || 'errResponse')}, xhr, response);
					}
					
					if (isOpen) {
						if (!self.api) {
							self.api    = response.api || 1;
							if (self.api == '2.0' && typeof response.options.uploadMaxSize !== 'undefined') {
								self.api = '2.1';
							}
							self.newAPI = self.api >= 2;
							self.oldAPI = !self.newAPI;
						}
						
						if (response.textMimes && Array.isArray(response.textMimes)) {
							self.resources.mimes.text = response.textMimes;
							setTextMimes();
						}
						!self.textMimes && setTextMimes();
						
						if (response.options) {
							cwdOptions = Object.assign({}, cwdOptionsDefault, response.options);
						}

						if (response.netDrivers) {
							self.netDrivers = response.netDrivers;
						}

						if (response.maxTargets) {
							self.maxTargets = response.maxTargets;
						}

						if (!!data.init) {
							self.uplMaxSize = self.returnBytes(response.uplMaxSize);
							self.uplMaxFile = !!response.uplMaxFile? Math.min(parseInt(response.uplMaxFile), 50) : 20;
						}
					}

					if (typeof prepare === 'function') {
						prepare(response);
					}
					
					if (navigate) {
						actionTarget = navigate.target || 'added';
						if (response[actionTarget] && response[actionTarget].length) {
							self.one(cmd + 'done', function() {
								var targets  = response[actionTarget],
									newItems = self.findCwdNodes(targets),
									inCwdHashes = function() {
										var cwdHash = self.cwd().hash;
										return jQuery.map(targets, function(f) { return (f.phash && cwdHash === f.phash)? f.hash : null; });
									},
									hashes   = inCwdHashes(),
									makeToast  = function(t) {
										var node = void(0),
											data = t.action? t.action.data : void(0),
											cmd, msg, done;
										if ((data || hashes.length) && t.action && (msg = t.action.msg) && (cmd = t.action.cmd) && (!t.action.cwdNot || t.action.cwdNot !== self.cwd().hash)) {
											done = t.action.done;
											data = t.action.data;
											node = jQuery('<div></div>')
												.append(
													jQuery('<button type="button" class="ui-button ui-widget ui-state-default ui-corner-all elfinder-tabstop"><span class="ui-button-text">'
														+self.i18n(msg)
														+'</span></button>')
													.on('mouseenter mouseleave', function(e) { 
														jQuery(this).toggleClass('ui-state-hover', e.type == 'mouseenter');
													})
													.on('click', function() {
														self.exec(cmd, data || hashes, {_userAction: true, _currentType: 'toast', _currentNode: jQuery(this) });
														if (done) {
															self.one(cmd+'done', function() {
																if (typeof done === 'function') {
																	done();
																} else if (done === 'select') {
																	self.trigger('selectfiles', {files : inCwdHashes()});
																}
															});
														}
													})
												);
										}
										delete t.action;
										t.extNode = node;
										return t;
									};
								
								if (! navigate.toast) {
									navigate.toast = {};
								}
								
								!navigate.noselect && self.trigger('selectfiles', {files : self.searchStatus.state > 1 ? jQuery.map(targets, function(f) { return f.hash; }) : hashes});
								
								if (newItems.length) {
									if (!navigate.noscroll) {
										newItems.first().trigger('scrolltoview', {blink : false});
										self.resources.blink(newItems, 'lookme');
									}
									if (jQuery.isPlainObject(navigate.toast.incwd)) {
										self.toast(makeToast(navigate.toast.incwd));
									}
								} else {
									if (jQuery.isPlainObject(navigate.toast.inbuffer)) {
										self.toast(makeToast(navigate.toast.inbuffer));
									}
								}
							});
						}
					}
					
					dfrd.resolve(response);
					
					response.debug && self.debug('backend-debug', response);
				};
				self.abortXHR(xhr);
				lazy? self.lazy(resolve) : resolve();
			},
			xhr, _xhr,
			xhrAbort = function(e) {
				if (xhr && xhr.state() === 'pending') {
					self.abortXHR(xhr, { quiet: true , abort: true });
					if (!e || (e.type !== 'unload' && e.type !== 'destroy')) {
						self.autoSync();
					}
				}
			},
			abort = function(e){
				self.trigger(cmd + 'done');
				if (e.type == 'autosync') {
					if (e.data.action != 'stop') return;
				} else if (e.type != 'unload' && e.type != 'destroy' && e.type != 'openxhrabort') {
					if (!e.data.added || !e.data.added.length) {
						return;
					}
				}
				xhrAbort(e);
			},
			request = function(mode) {
				var queueAbort = function() {
					syncOnFail = false;
					dfrd.reject();
				};
				
				if (mode) {
					if (mode === 'cmd') {
						return cmd;
					}
				}
				
				if (isOpen) {
					if (currentOpenCmd && currentOpenCmd.state() === 'pending') {
						if (currentOpenCmd._target === data.target) {
							return dfrd.reject('openabort');
						} else {
							if (currentOpenCmd.xhr) {
								currentOpenCmd.xhr.queueAbort();
							} else {
								currentOpenCmd.reject('openabort');
							}
						}
					}
					currentOpenCmd = dfrd;
					currentOpenCmd._target = data.target;
				}
				
				dfrd.always(function() {
					delete options.headers['X-elFinderReqid'];
					if (isOpen) {
						currentOpenCmd = null;
					}
				}).fail(function(error, xhr, response) {
					var errData, errMsg;

					if (isOpen && error === 'openabort') {
						error = '';
						syncOnFail = false;
					}

					errData = {
						cmd: cmd,
						err: error,
						xhr: xhr,
						rc: response
					};

					// unset this cmd queue when user canceling
					// see notify : function - `cancel.reject(0);`
					if (error === 0) {
						if (requestQueue.length) {
							requestQueue = jQuery.grep(requestQueue, function(req) {
								return (req('cmd') === cmd) ? false : true;
							});
						}
					}
					// trigger "requestError" event
					self.trigger('requestError', errData);
					if (errData._getEvent && errData._getEvent().isDefaultPrevented()) {
						deffail = false;
						syncOnFail = false;
						if (error) {
							error.error = '';
						}
					}
					// abort xhr
					xhrAbort();
					if (isOpen) {
						openDir = self.file(data.target);
						openDir && openDir.volumeid && self.isRoot(openDir) && delete self.volumeExpires[openDir.volumeid];
					}
					self.trigger(cmd + 'fail', response);
					errMsg = (typeof error === 'object')? error.error : error;
					if (errMsg) {
						deffail ? self.error(errMsg) : self.debug('error', self.i18n(errMsg));
					}
					syncOnFail && self.sync();
				});

				if (!cmd) {
					syncOnFail = false;
					return dfrd.reject({error :'errCmdReq'});
				}
				
				if (self.maxTargets && data.targets && data.targets.length > self.maxTargets) {
					syncOnFail = false;
					return dfrd.reject({error :['errMaxTargets', self.maxTargets]});
				}

				defdone && dfrd.done(done);
				
				// quiet abort not completed "open" requests
				if (isOpen) {
					while ((_xhr = queue.pop())) {
						_xhr.queueAbort();
					}
					if (cwd !== data.target) {
						while ((_xhr = cwdQueue.pop())) {
							_xhr.queueAbort();
						}
					}
				}

				// trigger abort autoSync for commands to add the item
				if (jQuery.inArray(cmd, (self.cmdsToAdd + ' autosync').split(' ')) !== -1) {
					if (cmd !== 'autosync') {
						self.autoSync('stop');
						dfrd.always(function() {
							self.autoSync();
						});
					}
					self.trigger('openxhrabort');
				}

				delete options.preventFail;

				if (self.api >= 2.1029) {
					if (useCache) {
						options.headers['X-elFinderReqid'] = reqId;
					} else {
						Object.assign(options.data, { reqid : reqId });
					}
				}
				
				// function for set value of this syncOnFail
				dfrd.syncOnFail = function(state) {
					syncOnFail = !!state;
				};

				requestCnt++;

				dfrd.xhr = xhr = self.transport.send(options).always(function() {
					// set responseURL from native xhr object
					if (options._xhr && typeof options._xhr.responseURL !== 'undefined') {
						xhr.responseURL = options._xhr.responseURL || '';
					}
					--requestCnt;
					if (requestQueue.length) {
						requestQueue.shift()();
					}
				}).fail(error).done(success);
				
				if (self.api >= 2.1029) {
					xhr._requestId = reqId;
				}
				
				if (isOpen || (data.compare && cmd === 'info')) {
					// regist function queueAbort
					xhr.queueAbort = queueAbort;
					// add autoSync xhr into queue
					queue.unshift(xhr);
					// bind abort()
					data.compare && self.bind(self.cmdsToAdd + ' autosync openxhrabort', abort);
					dfrd.always(function() {
						var ndx = jQuery.inArray(xhr, queue);
						data.compare && self.unbind(self.cmdsToAdd + ' autosync openxhrabort', abort);
						ndx !== -1 && queue.splice(ndx, 1);
					});
				} else if (jQuery.inArray(cmd, self.abortCmdsOnOpen) !== -1) {
					// regist function queueAbort
					xhr.queueAbort = queueAbort;
					// add "open" xhr, only cwd xhr into queue
					cwdQueue.unshift(xhr);
					dfrd.always(function() {
						var ndx = jQuery.inArray(xhr, cwdQueue);
						ndx !== -1 && cwdQueue.splice(ndx, 1);
					});
				}
				
				// abort pending xhr on window unload or elFinder destroy
				self.bind('unload destroy', abort);
				dfrd.always(function() {
					self.unbind('unload destroy', abort);
				});
				
				return dfrd;
			},
			queueingRequest = function() {
				// show notify
				if (notify.type && notify.cnt) {
					if (cancel) {
						notify.cancel = dfrd;
						opts.eachCancel && (notify.id = +new Date());
					}
					timeout = setTimeout(function() {
						// start fake count up
						progTm = setTimeout(progFakeUp, 1000);
						self.notify(notify);
						hasNotify = true;
						dfrd.always(function() {
							notify.cnt = -(parseInt(notify.cnt)||0);
							self.notify(notify);
							hasNotify = false;
						});
					}, self.notifyDelay);
					
					dfrd.always(function() {
						clearTimeout(timeout);
					});
				}
				// queueing
				if (requestCnt < requestMaxConn) {
					// do request
					return request();
				} else {
					if (isOpen) {
						requestQueue.unshift(request);
					} else {
						requestQueue.push(request);
					}
					return dfrd;
				}
			},
			progFakeUp = function() {
				var add;
				if (hasNotify && progTm) {
					add = 1 * notify.cnt;
					progTm = null;
					self.notify({
						type: notify.type,
						progress: add,
						cnt: 0,
						hideCnt: notify.hideCnt
					});
					prog += add;
					if ((prog / notify.cnt) < 80) {
						progTm = setTimeout(progFakeUp, 500);
					}
				}
			},
			bindData = {opts: opts, result: true},
			openDir;
		
		// prevent request initial request is completed
		if (!self.api && !data.init) {
			syncOnFail = false;
			return dfrd.reject();
		}

		// trigger "request.cmd" that callback be able to cancel request by substituting "false" for "event.data.result"
		self.trigger('request.' + cmd, bindData, true);
		
		if (! bindData.result) {
			self.trigger(cmd + 'done');
			return dfrd.reject();
		} else if (typeof bindData.result === 'object' && bindData.result.promise) {
			bindData.result
				.done(queueingRequest)
				.fail(function() {
					self.trigger(cmd + 'done');
					dfrd.reject();
				});
			return dfrd;
		}
		
		return queueingRequest();
	};
	
	/**
	 * Call cache()
	 * Store info about files/dirs in "files" object.
	 *
	 * @param  Array  files
	 * @param  String type
	 * @return void
	 */
	this.cache = function(dataArray, type) {
		if (! Array.isArray(dataArray)) {
			dataArray = [ dataArray ];
		}
		cache(dataArray, type);
	};
	
	/**
	 * Update file object caches by respose data object
	 * 
	 * @param  Object  respose data object
	 * @return void
	 */
	this.updateCache = function(data) {
		if (jQuery.isPlainObject(data)) {
			data.files && data.files.length && cache(data.files, 'files');
			data.tree && data.tree.length && cache(data.tree, 'tree');
			data.removed && data.removed.length && remove(data.removed);
			data.added && data.added.length && cache(data.added, 'add');
			data.changed && data.changed.length && cache(data.changed, 'change');
		}
	};
	
	/**
	 * Compare current files cache with new files and return diff
	 * 
	 * @param  Array   new files
	 * @param  String  target folder hash
	 * @param  Array   exclude properties to compare
	 * @return Object
	 */
	this.diff = function(incoming, onlydir, excludeProps) {
		var raw       = {},
			added     = [],
			removed   = [],
			changed   = [],
			excludes  = null,
			isChanged = function(hash) {
				var l = changed.length;

				while (l--) {
					if (changed[l].hash == hash) {
						return true;
					}
				}
			};
		
		jQuery.each(incoming, function(i, f) {
			raw[f.hash] = f;
		});
		
		// make excludes object
		if (excludeProps && excludeProps.length) {
			excludes = {};
			jQuery.each(excludeProps, function() {
				excludes[this] = true;
			});
		}
		
		// find removed
		jQuery.each(files, function(hash, f) {
			if (! raw[hash] && (! onlydir || f.phash === onlydir)) {
				removed.push(hash);
			}
		});
		
		// compare files
		jQuery.each(raw, function(hash, file) {
			var origin  = files[hash],
				orgKeys = {},
				chkKeyLen;

			if (!origin) {
				added.push(file);
			} else {
				// make orgKeys object
				jQuery.each(Object.keys(origin), function() {
					orgKeys[this] = true;
				});
				jQuery.each(file, function(prop) {
					delete orgKeys[prop];
					if (! excludes || ! excludes[prop]) {
						if (file[prop] !== origin[prop]) {
							changed.push(file);
							orgKeys = {};
							return false;
						}
					}
				});
				chkKeyLen = Object.keys(orgKeys).length;
				if (chkKeyLen !== 0) {
					if (excludes) {
						jQuery.each(orgKeys, function(prop) {
							if (excludes[prop]) {
								--chkKeyLen;
							}
						});
					}
					(chkKeyLen !== 0) && changed.push(file);
				}
			}
		});
		
		// parents of removed dirs mark as changed (required for tree correct work)
		jQuery.each(removed, function(i, hash) {
			var file  = files[hash], 
				phash = file.phash;

			if (phash 
			&& file.mime == 'directory' 
			&& jQuery.inArray(phash, removed) === -1 
			&& raw[phash] 
			&& !isChanged(phash)) {
				changed.push(raw[phash]);
			}
		});
		
		return {
			added   : added,
			removed : removed,
			changed : changed
		};
	};
	
	/**
	 * Sync content
	 * 
	 * @return jQuery.Deferred
	 */
	this.sync = function(onlydir, polling) {
		this.autoSync('stop');
		var self  = this,
			compare = function(){
				var c = '', cnt = 0, mtime = 0;
				if (onlydir && polling) {
					jQuery.each(files, function(h, f) {
						if (f.phash && f.phash === onlydir) {
							++cnt;
							mtime = Math.max(mtime, f.ts);
						}
						c = cnt+':'+mtime;
					});
				}
				return c;
			},
			comp  = compare(),
			dfrd  = jQuery.Deferred().always(function() { !reqFail && self.trigger('sync'); }),
			opts = [this.request({
				data           : {cmd : 'open', reload : 1, target : cwd, tree : (! onlydir && this.ui.tree) ? 1 : 0, compare : comp},
				preventDefault : true
			})],
			exParents = function() {
				var parents = [],
					curRoot = self.file(self.root(cwd)),
					curId = curRoot? curRoot.volumeid : null,
					phash = self.cwd().phash,
					isroot,pdir;
				
				while(phash) {
					if (pdir = self.file(phash)) {
						if (phash.indexOf(curId) !== 0) {
							parents.push( {target: phash, cmd: 'tree'} );
							if (! self.isRoot(pdir)) {
								parents.push( {target: phash, cmd: 'parents'} );
							}
							curRoot = self.file(self.root(phash));
							curId = curRoot? curRoot.volumeid : null;
						}
						phash = pdir.phash;
					} else {
						phash = null;
					}
				}
				return parents;
			},
			reqFail;
		
		if (! onlydir && self.api >= 2) {
			(cwd !== this.root()) && opts.push(this.request({
				data           : {cmd : 'parents', target : cwd},
				preventDefault : true
			}));
			jQuery.each(exParents(), function(i, data) {
				opts.push(self.request({
					data           : {cmd : data.cmd, target : data.target},
					preventDefault : true
				}));
			});
		}
		jQuery.when.apply($, opts)
		.fail(function(error, xhr) {
			reqFail = (xhr && xhr.status != 200);
			if (! polling || jQuery.inArray('errOpen', error) !== -1) {
				dfrd.reject(error);
				self.parseError(error) && self.request({
					data   : {cmd : 'open', target : (self.lastDir('') || self.root()), tree : 1, init : 1},
					notify : {type : 'open', cnt : 1, hideCnt : true}
				});
			} else {
				dfrd.reject((error && xhr.status != 0)? error : void 0);
			}
		})
		.done(function(odata) {
			var pdata, argLen, i;
			
			if (odata.cwd.compare) {
				if (comp === odata.cwd.compare) {
					return dfrd.reject();
				}
			}
			
			// for 2nd and more requests
			pdata = {tree : []};
			
			// results marge of 2nd and more requests
			argLen = arguments.length;
			if (argLen > 1) {
				for(i = 1; i < argLen; i++) {
					if (arguments[i].tree && arguments[i].tree.length) {
						pdata.tree.push.apply(pdata.tree, arguments[i].tree);
					}
				}
			}
			
			if (self.api < 2.1) {
				if (! pdata.tree) {
					pdata.tree = [];
				}
				pdata.tree.push(odata.cwd);
			}
			
			// data normalize
			odata = self.normalize(odata);
			if (!self.validResponse('open', odata)) {
				return dfrd.reject((odata.norError || 'errResponse'));
			}
			pdata = self.normalize(pdata);
			if (!self.validResponse('tree', pdata)) {
				return dfrd.reject((pdata.norError || 'errResponse'));
			}
			
			var diff = self.diff(odata.files.concat(pdata && pdata.tree ? pdata.tree : []), onlydir);

			diff.added.push(odata.cwd);
			
			self.updateCache(diff);
			
			// trigger events
			diff.removed.length && self.remove(diff);
			diff.added.length   && self.add(diff);
			diff.changed.length && self.change(diff);
			return dfrd.resolve(diff);
		})
		.always(function() {
			self.autoSync();
		});
		
		return dfrd;
	};
	
	this.upload = function(files) {
		return this.transport.upload(files, this);
	};
	
	/**
	 * Bind keybord shortcut to keydown event
	 *
	 * @example
	 *    elfinder.shortcut({ 
	 *       pattern : 'ctrl+a', 
	 *       description : 'Select all files', 
	 *       callback : function(e) { ... }, 
	 *       keypress : true|false (bind to keypress instead of keydown) 
	 *    })
	 *
	 * @param  Object  shortcut config
	 * @return elFinder
	 */
	this.shortcut = function(s) {
		var patterns, pattern, code, i, parts;
		
		if (this.options.allowShortcuts && s.pattern && jQuery.isFunction(s.callback)) {
			patterns = s.pattern.toUpperCase().split(/\s+/);
			
			for (i= 0; i < patterns.length; i++) {
				pattern = patterns[i];
				parts   = pattern.split('+');
				code    = (code = parts.pop()).length == 1 
					? (code > 0 ? code : code.charCodeAt(0))
					: (code > 0 ? code : jQuery.ui.keyCode[code]);

				if (code && !shortcuts[pattern]) {
					shortcuts[pattern] = {
						keyCode     : code,
						altKey      : jQuery.inArray('ALT', parts)   != -1,
						ctrlKey     : jQuery.inArray('CTRL', parts)  != -1,
						shiftKey    : jQuery.inArray('SHIFT', parts) != -1,
						type        : s.type || 'keydown',
						callback    : s.callback,
						description : s.description,
						pattern     : pattern
					};
				}
			}
		}
		return this;
	};
	
	/**
	 * Registered shortcuts
	 *
	 * @type Object
	 **/
	this.shortcuts = function() {
		var ret = [];
		
		jQuery.each(shortcuts, function(i, s) {
			ret.push([s.pattern, self.i18n(s.description)]);
		});
		return ret;
	};
	
	/**
	 * Get/set clipboard content.
	 * Return new clipboard content.
	 *
	 * @example
	 *   this.clipboard([]) - clean clipboard
	 *   this.clipboard([{...}, {...}], true) - put 2 files in clipboard and mark it as cutted
	 * 
	 * @param  Array    new files hashes
	 * @param  Boolean  cut files?
	 * @return Array
	 */
	this.clipboard = function(hashes, cut) {
		var map = function() { return jQuery.map(clipboard, function(f) { return f.hash; }); };

		if (hashes !== void(0)) {
			clipboard.length && this.trigger('unlockfiles', {files : map()});
			remember = {};
			
			clipboard = jQuery.map(hashes||[], function(hash) {
				var file = files[hash];
				if (file) {
					
					remember[hash] = true;
					
					return {
						hash   : hash,
						phash  : file.phash,
						name   : file.name,
						mime   : file.mime,
						read   : file.read,
						locked : file.locked,
						cut    : !!cut
					};
				}
				return null;
			});
			this.trigger('changeclipboard', {clipboard : clipboard.slice(0, clipboard.length)});
			cut && this.trigger('lockfiles', {files : map()});
		}

		// return copy of clipboard instead of refrence
		return clipboard.slice(0, clipboard.length);
	};
	
	/**
	 * Return true if command enabled
	 * 
	 * @param  String       command name
	 * @param  String|void  hash for check of own volume's disabled cmds
	 * @return Boolean
	 */
	this.isCommandEnabled = function(name, dstHash) {
		var disabled, cmd,
			cvid = self.cwd().volumeid || '';
		
		// In serach results use selected item hash to check
		if (!dstHash && self.searchStatus.state > 1 && self.selected().length) {
			dstHash = self.selected()[0];
		}
		if (dstHash && (! cvid || dstHash.indexOf(cvid) !== 0)) {
			disabled = self.option('disabledFlip', dstHash);
			//if (! disabled) {
			//	disabled = {};
			//}
		} else {
			disabled = cwdOptions.disabledFlip/* || {}*/;
		}
		cmd = this._commands[name];
		return cmd ? (cmd.alwaysEnabled || !disabled[name]) : false;
	};
	
	/**
	 * Exec command and return result;
	 *
	 * @param  String         command name
	 * @param  String|Array   usualy files hashes
	 * @param  String|Array   command options
	 * @param  String|void    hash for enabled check of own volume's disabled cmds
	 * @return jQuery.Deferred
	 */		
	this.exec = function(cmd, files, opts, dstHash) {
		var dfrd, resType;
		
		// apply commandMap for keyboard shortcut
		if (!dstHash && this.commandMap[cmd] && this.commandMap[cmd] !== 'hidden') {
			cmd = this.commandMap[cmd];
		}

		if (cmd === 'open') {
			if (this.searchStatus.state || this.searchStatus.ininc) {
				this.trigger('searchend', { noupdate: true });
			}
			this.autoSync('stop');
		}
		if (!dstHash && files) {
			if (jQuery.isArray(files)) {
				if (files.length) {
					dstHash = files[0];
				}
			} else {
				dstHash = files;
			}
		}
		dfrd = this._commands[cmd] && this.isCommandEnabled(cmd, dstHash) 
			? this._commands[cmd].exec(files, opts) 
			: jQuery.Deferred().reject('errUnknownCmd');
		
		resType = typeof dfrd;
		if (!(resType === 'object' && dfrd.promise)) {
			self.debug('warning', '"cmd.exec()" should be returned "jQuery.Deferred" but cmd "' + cmd + '" returned "' + resType + '"');
			dfrd = jQuery.Deferred().resolve();
		}
		
		this.trigger('exec', { dfrd : dfrd, cmd : cmd, files : files, opts : opts, dstHash : dstHash });
		return dfrd;
	};
	
	/**
	 * Create and return dialog.
	 *
	 * @param  String|DOMElement  dialog content
	 * @param  Object             dialog options
	 * @return jQuery
	 */
	this.dialog = function(content, options) {
		var dialog = jQuery('<div></div>').append(content).appendTo(node).elfinderdialog(options, self),
			dnode  = dialog.closest('.ui-dialog'),
			resize = function(){
				! dialog.data('draged') && dialog.is(':visible') && dialog.elfinderdialog('posInit');
			};
		if (dnode.length) {
			self.bind('resize', resize);
			dnode.on('remove', function() {
				self.unbind('resize', resize);
			});
		}
		return dialog;
	};
	
	/**
	 * Create and return toast.
	 *
	 * @param  Object  toast options - see ui/toast.js
	 * @return jQuery
	 */
	this.toast = function(options) {
		return jQuery('<div class="ui-front"></div>').appendTo(this.ui.toast).elfindertoast(options || {}, this);
	};
	
	/**
	 * Return UI widget or node
	 *
	 * @param  String  ui name
	 * @return jQuery
	 */
	this.getUI = function(ui) {
		return ui? (this.ui[ui] || jQuery()) : node;
	};
	
	/**
	 * Return elFinder.command instance or instances array
	 *
	 * @param  String  command name
	 * @return Object | Array
	 */
	this.getCommand = function(name) {
		return name === void(0) ? this._commands : this._commands[name];
	};
	
	/**
	 * Resize elfinder node
	 * 
	 * @param  String|Number  width
	 * @param  String|Number  height
	 * @return void
	 */
	this.resize = function(w, h) {
		var getMargin = function() {
				var m = node.outerHeight(true) - node.innerHeight(),
					p = node;
				
				while(p.get(0) !== heightBase.get(0)) {
					p = p.parent();
					m += p.outerHeight(true) - p.innerHeight();
					if (! p.parent().length) {
						// reached the document
						break;
					}
				}
				return m;
			},
			fit = ! node.hasClass('ui-resizable'),
			prv = node.data('resizeSize') || {w: 0, h: 0},
			mt, size = {};

		if (heightBase && heightBase.data('resizeTm')) {
			clearTimeout(heightBase.data('resizeTm'));
		}
		
		if (! self.options.noResizeBySelf) {
			if (typeof h === 'string') {
				if (mt = h.match(/^([0-9.]+)%$/)) {
					// setup heightBase
					if (! heightBase || ! heightBase.length) {
						heightBase = jQuery(window);
					}
					if (! heightBase.data('marginToMyNode')) {
						heightBase.data('marginToMyNode', getMargin());
					}
					if (! heightBase.data('fitToBaseFunc')) {
						heightBase.data('fitToBaseFunc', function(e) {
							var tm = heightBase.data('resizeTm');
							e.preventDefault();
							e.stopPropagation();
							tm && cancelAnimationFrame(tm);
							if (! node.hasClass('elfinder-fullscreen') && (!self.UA.Mobile || heightBase.data('rotated') !== self.UA.Rotated)) {
								heightBase.data('rotated', self.UA.Rotated);
								heightBase.data('resizeTm', requestAnimationFrame(function() {
									self.restoreSize();
								}));
							}
						});
					}
					if (typeof heightBase.data('rotated') === 'undefined') {
						heightBase.data('rotated', self.UA.Rotated);
					}
					h = heightBase.height() * (mt[1] / 100) - heightBase.data('marginToMyNode');
					
					heightBase.off('resize.' + self.namespace, heightBase.data('fitToBaseFunc'));
					fit && heightBase.on('resize.' + self.namespace, heightBase.data('fitToBaseFunc'));
				}
			}
			
			node.css({ width : w, height : parseInt(h) });
		}

		size.w = Math.round(node.width());
		size.h = Math.round(node.height());
		node.data('resizeSize', size);
		if (size.w !== prv.w || size.h !== prv.h) {
			node.trigger('resize');
			this.trigger('resize', {width : size.w, height : size.h});
		}
	};
	
	/**
	 * Restore elfinder node size
	 * 
	 * @return elFinder
	 */
	this.restoreSize = function() {
		this.resize(width, height);
	};
	
	this.show = function() {
		node.show();
		this.enable().trigger('show');
	};
	
	this.hide = function() {
		if (this.options.enableAlways) {
			prevEnabled = enabled;
			enabled = false;
		}
		this.disable();
		this.trigger('hide');
		node.hide();
	};
	
	/**
	 * Lazy execution function
	 * 
	 * @param  Object  function
	 * @param  Number  delay
	 * @param  Object  options
	 * @return Object  jQuery.Deferred
	 */
	this.lazy = function(func, delay, opts) {
		var busy = function(state) {
				var cnt = node.data('lazycnt'),
					repaint;
				
				if (state) {
					repaint = node.data('lazyrepaint')? false : opts.repaint;
					if (! cnt) {
						node.data('lazycnt', 1)
							.addClass('elfinder-processing');
					} else {
						node.data('lazycnt', ++cnt);
					}
					if (repaint) {
						node.data('lazyrepaint', true).css('display'); // force repaint
					}
				} else {
					if (cnt && cnt > 1) {
						node.data('lazycnt', --cnt);
					} else {
						repaint = node.data('lazyrepaint');
						node.data('lazycnt', 0)
							.removeData('lazyrepaint')
							.removeClass('elfinder-processing');
						repaint && node.css('display'); // force repaint;
						self.trigger('lazydone');
					}
				}
			},
			dfd  = jQuery.Deferred(),
			callFunc = function() {
				dfd.resolve(func.call(dfd));
				busy(false);
			};
		
		delay = delay || 0;
		opts = opts || {};
		busy(true);
		
		if (delay) {
			setTimeout(callFunc, delay);
		} else {
			requestAnimationFrame(callFunc);
		}
		
		return dfd;
	};
	
	/**
	 * Destroy this elFinder instance
	 *
	 * @return void
	 **/
	this.destroy = function() {
		if (node && node[0].elfinder) {
			node.hasClass('elfinder-fullscreen') && self.toggleFullscreen(node);
			this.options.syncStart = false;
			this.autoSync('forcestop');
			this.trigger('destroy').disable();
			clipboard = [];
			selected = [];
			listeners = {};
			shortcuts = {};
			jQuery(window).off('.' + namespace);
			jQuery(document).off('.' + namespace);
			self.trigger = function(){};
			jQuery(beeper).remove();
			node.off()
				.removeData()
				.empty()
				.append(prevContent.contents())
				.attr('class', prevContent.attr('class'))
				.attr('style', prevContent.attr('style'));
			delete node[0].elfinder;
			// restore kept events
			jQuery.each(prevEvents, function(n, arr) {
				jQuery.each(arr, function(i, o) {
					node.on(o.type + (o.namespace? '.'+o.namespace : ''), o.selector, o.handler);
				});
			});
		}
	};
	
	/**
	 * Start or stop auto sync
	 * 
	 * @param  String|Bool  stop
	 * @return void
	 */
	this.autoSync = function(mode) {
		var sync;
		if (self.options.sync >= 1000) {
			if (syncInterval) {
				clearTimeout(syncInterval);
				syncInterval = null;
				self.trigger('autosync', {action : 'stop'});
			}
			
			if (mode === 'stop') {
				++autoSyncStop;
			} else {
				autoSyncStop = Math.max(0, --autoSyncStop);
			}
			
			if (autoSyncStop || mode === 'forcestop' || ! self.options.syncStart) {
				return;
			} 
			
			// run interval sync
			sync = function(start){
				var timeout;
				if (cwdOptions.syncMinMs && (start || syncInterval)) {
					start && self.trigger('autosync', {action : 'start'});
					timeout = Math.max(self.options.sync, cwdOptions.syncMinMs);
					syncInterval && clearTimeout(syncInterval);
					syncInterval = setTimeout(function() {
						var dosync = true, hash = cwd, cts;
						if (cwdOptions.syncChkAsTs && files[hash] && (cts = files[hash].ts)) {
							self.request({
								data : {cmd : 'info', targets : [hash], compare : cts, reload : 1},
								preventDefault : true
							})
							.done(function(data){
								var ts;
								dosync = true;
								if (data.compare) {
									ts = data.compare;
									if (ts == cts) {
										dosync = false;
									}
								}
								if (dosync) {
									self.sync(hash).always(function(){
										if (ts) {
											// update ts for cache clear etc.
											files[hash].ts = ts;
										}
										sync();
									});
								} else {
									sync();
								}
							})
							.fail(function(error, xhr){
								var err = self.parseError(error);
								if (err && xhr.status != 0) {
									self.error(err);
									if (Array.isArray(err) && jQuery.inArray('errOpen', err) !== -1) {
										self.request({
											data   : {cmd : 'open', target : (self.lastDir('') || self.root()), tree : 1, init : 1},
											notify : {type : 'open', cnt : 1, hideCnt : true}
										});
									}
								} else {
									syncInterval = setTimeout(function() {
										sync();
									}, timeout);
								}
							});
						} else {
							self.sync(cwd, true).always(function(){
								sync();
							});
						}
					}, timeout);
				}
			};
			sync(true);
		}
	};
	
	/**
	 * Return bool is inside work zone of specific point
	 * 
	 * @param  Number event.pageX
	 * @param  Number event.pageY
	 * @return Bool
	 */
	this.insideWorkzone = function(x, y, margin) {
		var rectangle = this.getUI('workzone').data('rectangle');
		
		margin = margin || 1;
		if (x < rectangle.left + margin
		|| x > rectangle.left + rectangle.width + margin
		|| y < rectangle.top + margin
		|| y > rectangle.top + rectangle.height + margin) {
			return false;
		}
		return true;
	};
	
	/**
	 * Target ui node move to last of children of elFinder node fot to show front
	 * 
	 * @param  Object  target    Target jQuery node object
	 */
	this.toFront = function(target) {
		var nodes = node.children('.ui-front').removeClass('elfinder-frontmost'),
			lastnode = nodes.last();
		nodes.css('z-index', '');
		jQuery(target).addClass('ui-front elfinder-frontmost').css('z-index', lastnode.css('z-index') + 1);
	};
	
	/**
	 * Remove class 'elfinder-frontmost' and hide() to target ui node
	 *
	 * @param      Object   target  Target jQuery node object
	 * @param      Boolean  nohide  Do not hide
	 */
	this.toHide =function(target, nohide) {
		var tgt = jQuery(target),
			last;

		!nohide && tgt.hide();
		if (tgt.hasClass('elfinder-frontmost')) {
			tgt.removeClass('elfinder-frontmost');
			last = node.children('.ui-front:visible:not(.elfinder-frontmost)').last();
			if (last.length) {
				requestAnimationFrame(function() {
					if (!node.children('.elfinder-frontmost:visible').length) {
						self.toFront(last);
						last.trigger('frontmost');
					}
				});
			}
		}
	};

	/**
	 * Return css object for maximize
	 * 
	 * @return Object
	 */
	this.getMaximizeCss = function() {
		return {
			width   : '100%',
			height  : '100%',
			margin  : 0,
			top     : 0,
			left    : 0,
			display : 'block',
			position: 'fixed',
			zIndex  : Math.max(self.zIndex? (self.zIndex + 1) : 0 , 1000),
			maxWidth : '',
			maxHeight: ''
		};
	};
	
	// Closure for togglefullscreen
	(function() {
		// check is in iframe
		if (inFrame && self.UA.Fullscreen) {
			self.UA.Fullscreen = false;
			if (parentIframe && typeof parentIframe.attr('allowfullscreen') !== 'undefined') {
				self.UA.Fullscreen = true;
			}
		}

		var orgStyle, bodyOvf, resizeTm, fullElm, exitFull, toFull, funcObj,
			cls = 'elfinder-fullscreen',
			clsN = 'elfinder-fullscreen-native',
			checkDialog = function() {
				var t = 0,
					l = 0;
				jQuery.each(node.children('.ui-dialog,.ui-draggable'), function(i, d) {
					var $d = jQuery(d),
						pos = $d.position();
					
					if (pos.top < 0) {
						$d.css('top', t);
						t += 20;
					}
					if (pos.left < 0) {
						$d.css('left', l);
						l += 20;
					}
				});
			},
			setFuncObj = function() {
				var useFullscreen = self.storage('useFullscreen');
				funcObj = self.UA.Fullscreen && (useFullscreen? useFullscreen > 0 : self.options.commandsOptions.fullscreen.mode === 'screen') ? {
					// native full screen mode
					
					fullElm: function() {
						return document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement || null;
					},
					
					exitFull: function() {
						if (document.exitFullscreen) {
							return document.exitFullscreen();
						} else if (document.webkitExitFullscreen) {
							return document.webkitExitFullscreen();
						} else if (document.mozCancelFullScreen) {
							return document.mozCancelFullScreen();
						} else if (document.msExitFullscreen) {
							return document.msExitFullscreen();
						}
					},
					
					toFull: function(elem) {
						if (elem.requestFullscreen) {
							return elem.requestFullscreen();
						} else if (elem.webkitRequestFullscreen) {
							return elem.webkitRequestFullscreen();
						} else if (elem.mozRequestFullScreen) {
							return elem.mozRequestFullScreen();
						} else if (elem.msRequestFullscreen) {
							return elem.msRequestFullscreen();
						}
						return false;
					}
				} : {
					// node element maximize mode
					
					fullElm: function() {
						var full;
						if (node.hasClass(cls)) {
							return node.get(0);
						} else {
							full = node.find('.' + cls);
							if (full.length) {
								return full.get(0);
							}
						}
						return null;
					},
					
					exitFull: function() {
						var elm;
						
						jQuery(window).off('resize.' + namespace, resize);
						if (bodyOvf !== void(0)) {
							jQuery('body').css('overflow', bodyOvf);
						}
						bodyOvf = void(0);
						
						if (orgStyle) {
							elm = orgStyle.elm;
							restoreStyle(elm);
							jQuery(elm).trigger('resize', {fullscreen: 'off'});
						}
						
						jQuery(window).trigger('resize');
					},
					
					toFull: function(elem) {
						bodyOvf = jQuery('body').css('overflow') || '';
						jQuery('body').css('overflow', 'hidden');
						
						jQuery(elem).css(self.getMaximizeCss())
							.addClass(cls)
							.trigger('resize', {fullscreen: 'on'});
						
						checkDialog();
						
						jQuery(window).on('resize.' + namespace, resize).trigger('resize');
						
						return true;
					}
				};
			},
			restoreStyle = function(elem) {
				if (orgStyle && orgStyle.elm == elem) {
					jQuery(elem).removeClass(cls + ' ' + clsN).attr('style', orgStyle.style);
					orgStyle = null;
				}
			},
			resize = function(e) {
				var elm;
				if (e.target === window) {
					resizeTm && cancelAnimationFrame(resizeTm);
					resizeTm = requestAnimationFrame(function() {
						if (elm = funcObj.fullElm()) {
							jQuery(elm).trigger('resize', {fullscreen: 'on'});
						}
					});
				}
			};
		
		setFuncObj();

		jQuery(document).on('fullscreenchange.' + namespace + ' webkitfullscreenchange.' + namespace + ' mozfullscreenchange.' + namespace + ' MSFullscreenChange.' + namespace, function(e){
			if (self.UA.Fullscreen) {
				var elm = funcObj.fullElm(),
					win = jQuery(window);
				
				resizeTm && cancelAnimationFrame(resizeTm);
				if (elm === null) {
					win.off('resize.' + namespace, resize);
					if (orgStyle) {
						elm = orgStyle.elm;
						restoreStyle(elm);
						jQuery(elm).trigger('resize', {fullscreen: 'off'});
					}
				} else {
					jQuery(elm).addClass(cls + ' ' + clsN)
						.attr('style', 'width:100%; height:100%; margin:0; padding:0;')
						.trigger('resize', {fullscreen: 'on'});
					win.on('resize.' + namespace, resize);
					checkDialog();
				}
				win.trigger('resize');
			}
		});
		
		/**
		 * Toggle Full Scrren Mode
		 * 
		 * @param  Object target
		 * @param  Bool   full
		 * @return Object | Null  DOM node object of current full scrren
		 */
		self.toggleFullscreen = function(target, full) {
			var elm = jQuery(target).get(0),
				curElm = null;
			
			curElm = funcObj.fullElm();
			if (curElm) {
				if (curElm == elm) {
					if (full === true) {
						return curElm;
					}
				} else {
					if (full === false) {
						return curElm;
					}
				}
				funcObj.exitFull();
				return null;
			} else {
				if (full === false) {
					return null;
				}
			}
			
			setFuncObj();
			orgStyle = {elm: elm, style: jQuery(elm).attr('style')};
			if (funcObj.toFull(elm) !== false) {
				return elm;
			} else {
				orgStyle = null;
				return null;
			}
		};
	})();
	
	// Closure for toggleMaximize
	(function(){
		var cls = 'elfinder-maximized',
		resizeTm,
		resize = function(e) {
			if (e.target === window && e.data && e.data.elm) {
				var elm = e.data.elm;
				resizeTm && cancelAnimationFrame(resizeTm);
				resizeTm = requestAnimationFrame(function() {
					elm.trigger('resize', {maximize: 'on'});
				});
			}
		},
		exitMax = function(elm) {
			jQuery(window).off('resize.' + namespace, resize);
			jQuery('body').css('overflow', elm.data('bodyOvf'));
			elm.removeClass(cls)
				.attr('style', elm.data('orgStyle'))
				.removeData('bodyOvf')
				.removeData('orgStyle');
			elm.trigger('resize', {maximize: 'off'});
		},
		toMax = function(elm) {
			elm.data('bodyOvf', jQuery('body').css('overflow') || '')
				.data('orgStyle', elm.attr('style'))
				.addClass(cls)
				.css(self.getMaximizeCss());
			jQuery('body').css('overflow', 'hidden');
			jQuery(window).on('resize.' + namespace, {elm: elm}, resize);
			elm.trigger('resize', {maximize: 'on'});
		};
		
		/**
		 * Toggle Maximize target node
		 * 
		 * @param  Object target
		 * @param  Bool   max
		 * @return void
		 */
		self.toggleMaximize = function(target, max) {
			var elm = jQuery(target),
				maximized = elm.hasClass(cls);
			
			if (maximized) {
				if (max === true) {
					return;
				}
				exitMax(elm);
			} else {
				if (max === false) {
					return;
				}
				toMax(elm);
			}
		};
	})();
	
	/*************  init stuffs  ****************/
	Object.assign(jQuery.ui.keyCode, {
		'F1' : 112,
		'F2' : 113,
		'F3' : 114,
		'F4' : 115,
		'F5' : 116,
		'F6' : 117,
		'F7' : 118,
		'F8' : 119,
		'F9' : 120,
		'F10' : 121,
		'F11' : 122,
		'F12' : 123,
		'DIG0' : 48,
		'DIG1' : 49,
		'DIG2' : 50,
		'DIG3' : 51,
		'DIG4' : 52,
		'DIG5' : 53,
		'DIG6' : 54,
		'DIG7' : 55,
		'DIG8' : 56,
		'DIG9' : 57,
		'NUM0' : 96,
		'NUM1' : 97,
		'NUM2' : 98,
		'NUM3' : 99,
		'NUM4' : 100,
		'NUM5' : 101,
		'NUM6' : 102,
		'NUM7' : 103,
		'NUM8' : 104,
		'NUM9' : 105,
		'CONTEXTMENU' : 93,
		'DOT'  : 190
	});
	
	this.dragUpload = false;
	this.xhrUpload  = (typeof XMLHttpRequestUpload != 'undefined' || typeof XMLHttpRequestEventTarget != 'undefined') && typeof File != 'undefined' && typeof FormData != 'undefined';
	
	// configure transport object
	this.transport = {};

	if (typeof(this.options.transport) == 'object') {
		this.transport = this.options.transport;
		if (typeof(this.transport.init) == 'function') {
			this.transport.init(this);
		}
	}
	
	if (typeof(this.transport.send) != 'function') {
		this.transport.send = function(opts) {
			if (!self.UA.IE) {
				// keep native xhr object for handling property responseURL
				opts._xhr = new XMLHttpRequest();
				opts.xhr = function() { 
					if (opts.progress) {
						opts._xhr.addEventListener('progress', opts.progress); 
					}
					return opts._xhr;
				};
			}
			return jQuery.ajax(opts);
		};
	}
	
	if (this.transport.upload == 'iframe') {
		this.transport.upload = jQuery.proxy(this.uploads.iframe, this);
	} else if (typeof(this.transport.upload) == 'function') {
		this.dragUpload = !!this.options.dragUploadAllow;
	} else if (this.xhrUpload && !!this.options.dragUploadAllow) {
		this.transport.upload = jQuery.proxy(this.uploads.xhr, this);
		this.dragUpload = true;
	} else {
		this.transport.upload = jQuery.proxy(this.uploads.iframe, this);
	}

	/**
	 * Decoding 'raw' string converted to unicode
	 * 
	 * @param  String str
	 * @return String
	 */
	this.decodeRawString = function(str) {
		var charCodes = function(str) {
			var i, len, arr;
			for (i=0,len=str.length,arr=[]; i<len; i++) {
				arr.push(str.charCodeAt(i));
			}
			return arr;
		},
		scalarValues = function(arr) {
			var scalars = [], i, len, c;
			if (typeof arr === 'string') {arr = charCodes(arr);}
			for (i=0,len=arr.length; c=arr[i],i<len; i++) {
				if (c >= 0xd800 && c <= 0xdbff) {
					scalars.push((c & 1023) + 64 << 10 | arr[++i] & 1023);
				} else {
					scalars.push(c);
				}
			}
			return scalars;
		},
		decodeUTF8 = function(arr) {
			var i, len, c, str, char = String.fromCharCode;
			for (i=0,len=arr.length,str=""; c=arr[i],i<len; i++) {
				if (c <= 0x7f) {
					str += char(c);
				} else if (c <= 0xdf && c >= 0xc2) {
					str += char((c&31)<<6 | arr[++i]&63);
				} else if (c <= 0xef && c >= 0xe0) {
					str += char((c&15)<<12 | (arr[++i]&63)<<6 | arr[++i]&63);
				} else if (c <= 0xf7 && c >= 0xf0) {
					str += char(
						0xd800 | ((c&7)<<8 | (arr[++i]&63)<<2 | arr[++i]>>>4&3) - 64,
						0xdc00 | (arr[i++]&15)<<6 | arr[i]&63
					);
				} else {
					str += char(0xfffd);
				}
			}
			return str;
		};
		
		return decodeUTF8(scalarValues(str));
	};

	/**
	 * Gets target file contents by file.hash
	 *
	 * @param      String  hash          The hash
	 * @param      String  responseType  'blob' or 'arraybuffer' (default)
	 * @param      Object  requestOpts   The request options
	 * @return     arraybuffer|blob  The contents.
	 */
	this.getContents = function(hash, responseType, requestOpts) {
		var self = this,
			dfd = jQuery.Deferred(),
			type = responseType || 'arraybuffer',
			url, req;

		dfd.fail(function() {
			req && req.state() === 'pending' && req.reject();
		});

		url = self.openUrl(hash);
		if (!self.isSameOrigin(url)) {
			url = self.openUrl(hash, true);
		}
		req = self.request(Object.assign({
			data    : {cmd : 'get'},
			options : {
				url: url,
				type: 'get',
				cache : true,
				dataType : 'binary',
				responseType : type,
				processData: false
			},
			notify : {
				type: 'file',
				cnt: 1,
				hideCnt: true
			},
			cancel : true
		}, requestOpts || {}))
		.fail(function() {
			dfd.reject();
		})
		.done(function(data) {
			dfd.resolve(data);
		});

		return dfd;
	};

	/**
	 * Gets the binary by url.
	 *
	 * @param      {Object}    opts      The options
	 * @param      {Function}  callback  The callback
	 * @param      {Object}    requestOpts The request options
	 * @return     arraybuffer|blob  The contents.
	 */
	this.getBinaryByUrl = function(opts, callback, requestOpts) {
		var self = this,
			dfd = jQuery.Deferred(),
			url, req;

		dfd.fail(function() {
			req && req.state() === 'pending' && req.reject();
		});

		req = self.request(Object.assign({
			data    : {cmd : 'get'},
			options : Object.assign({
				type: 'get',
				cache : true,
				dataType : 'binary',
				responseType : 'blob',
				processData: false
			}, opts)
		}, requestOpts || {}))
		.fail(function() {
			dfd.reject();
		})
		.done(function(data) {
			callback && callback(data);
			dfd.resolve(data);
		});

		return dfd;
	};

	/**
	 * Gets the mimetype.
	 *
	 * @param      {string}  name     The name
	 * @param      {string}  orgMime  The organization mime
	 * @return     {string}  The mimetype.
	 */
	this.getMimetype = function(name, orgMime) {
		var mime = orgMime,
			ext, m;
		m = (name + '').match(/\.([^.]+)$/);
		if (m && (ext = m[1])) {
			if (!extToMimeTable) {
				extToMimeTable = self.arrayFlip(self.mimeTypes);
			}
			if (!(mime = extToMimeTable[ext.toLowerCase()])) {
				mime = orgMime;
			}
		}
		return mime;
	};

	/**
	 * Supported check hash algorisms
	 * 
	 * @type Array
	 */
	self.hashCheckers = [];

	/**
	 * Closure of getContentsHashes()
	 */
	(function(self) {
		var hashLibs = {};

		if (window.Worker && window.ArrayBuffer) {
			// make fm.hashCheckers
			if (self.options.cdns.sparkmd5) {
				hashLibs.SparkMD5 = true;
				self.hashCheckers.push('md5');
			}
			if (self.options.cdns.jssha) {
				hashLibs.jsSHA = true;
				self.hashCheckers = self.hashCheckers.concat(['sha1', 'sha224', 'sha256', 'sha384', 'sha512', 'sha3-224', 'sha3-256', 'sha3-384', 'sha3-512', 'shake128', 'shake256']);
			}
		}

		/**
		 * Gets the contents hashes.
		 *
		 * @param      String  target      target file.hash
		 * @param      Object  needHashes  need hash lib names
		 * @param      Object  requestOpts The request options
		 * @return     Object  hashes with lib name as key
		 */
		self.getContentsHashes = function(target, needHashes, hashOpts, requestOpts) {
			var dfd = jQuery.Deferred(),
				needs = self.arrayFlip(needHashes || ['md5'], true),
				libs = [],
				jobs = [],
				res = {},
				opts = hashOpts? hashOpts : {
					shake128len : 256,
					shake256len : 512
				},
				req;

			dfd.fail(function() {
				req && req.reject();
			});

			if (Object.keys(hashLibs).length) {
				req = self.getContents(target, 'arraybuffer', requestOpts).done(function(arrayBuffer) {
					if (needs.md5 && hashLibs.SparkMD5) {
						jobs.push((function() {
							var job = jQuery.Deferred();
							try {
								var wk = self.getWorker();
								job.fail(function() {
									wk && wk.terminate();
								});
								wk.onmessage = function(ans) {
									wk && wk.terminate();
									if (ans.data.hash) {
										var f;
										res.md5 = ans.data.hash;
										if (f = self.file(target)) {
											f.md5 = res.md5;
										}
									} else if (ans.data.error) {
										res.md5 = ans.data.error;
									}
									dfd.notify(res);
									job.resolve();
								};
								wk.onerror = function(e) {
									job.reject();
								};
								wk.postMessage({
									scripts: [self.options.cdns.sparkmd5, self.getWorkerUrl('calcfilehash.js')],
									data: { type: 'md5', bin: arrayBuffer }
								});
								dfd.fail(function() {
									job.reject();
								});
							} catch(e) {
								job.reject();
								delete hashLibs.SparkMD5;
							}
							return job;
						})());
					}
					if (hashLibs.jsSHA) {
						jQuery.each(['1', '224', '256', '384', '512', '3-224', '3-256', '3-384', '3-512', 'ke128', 'ke256'], function(i, v) {
							if (needs['sha' + v]) {
								jobs.push((function() {
									var job = jQuery.Deferred();
									try {
										var wk = self.getWorker();
										job.fail(function() {
											wk && wk.terminate();
										});
										wk.onmessage = function(ans) {
											wk && wk.terminate();
											if (ans.data.hash) {
												var f;
												res['sha' + v] = ans.data.hash;
												if (f = self.file(target)) {
													f['sha' + v] = res['sha' + v];
												}
											} else if (ans.data.error) {
												res['sha' + v] = ans.data.error;
											}
											dfd.notify(res);
											job.resolve();
										};
										wk.onerror = function(e) {
											job.reject();
										};
										wk.postMessage({
											scripts: [self.options.cdns.jssha, self.getWorkerUrl('calcfilehash.js')],
											data: { type: v, bin: arrayBuffer, hashOpts: opts }
										});
										dfd.fail(function() {
											job.reject();
										});
									} catch(e) {
										job.reject();
										delete hashLibs.jsSHA;
									}
									return job;
								})());
							}
						});
					}
					if (jobs.length) {
						jQuery.when.apply(null, jobs).always(function() {
							dfd.resolve(res);
						});
					} else {
						dfd.reject();
					}
				}).fail(function() {
					dfd.reject();
				});
			} else {
				dfd.reject();
			}

			return dfd;
		};
	})(this);

	/**
	 * Parse error value to display
	 *
	 * @param  Mixed  error
	 * @return Mixed  parsed error
	 */
	this.parseError = function(error) {
		var arg = error;
		if (jQuery.isPlainObject(arg)) {
			arg = arg.error;
		}
		return arg;
	};

	/**
	 * Alias for this.trigger('error', {error : 'message'})
	 *
	 * @param  String  error message
	 * @return elFinder
	 **/
	this.error = function() {
		var arg = arguments[0],
			opts = arguments[1] || null,
			err;
		if (arguments.length == 1 && typeof(arg) === 'function') {
			return self.bind('error', arg);
		} else {
			err = this.parseError(arg);
			return (err === true || !err)? this : self.trigger('error', {error: err, opts : opts});
		}
	};
	
	// create bind/trigger aliases for build-in events
	jQuery.each(events, function(i, name) {
		self[name] = function() {
			var arg = arguments[0];
			return arguments.length == 1 && typeof(arg) == 'function'
				? self.bind(name, arg)
				: self.trigger(name, jQuery.isPlainObject(arg) ? arg : {});
		};
	});

	// bind core event handlers
	this
		.enable(function() {
			if (!enabled && self.api && self.visible() && self.ui.overlay.is(':hidden') && ! node.children('.elfinder-dialog.' + self.res('class', 'editing') + ':visible').length) {
				enabled = true;
				document.activeElement && document.activeElement.blur();
				node.removeClass('elfinder-disabled');
			}
		})
		.disable(function() {
			prevEnabled = enabled;
			enabled = false;
			node.addClass('elfinder-disabled');
		})
		.open(function() {
			selected = [];
		})
		.select(function(e) {
			var cnt = 0,
				unselects = [];
			selected = jQuery.grep(e.data.selected || e.data.value|| [], function(hash) {
				if (unselects.length || (self.maxTargets && ++cnt > self.maxTargets)) {
					unselects.push(hash);
					return false;
				} else {
					return files[hash] ? true : false;
				}
			});
			if (unselects.length) {
				self.trigger('unselectfiles', {files: unselects, inselect: true});
				self.toast({mode: 'warning', msg: self.i18n(['errMaxTargets', self.maxTargets])});
			}
		})
		.error(function(e) { 
			var opts  = {
					cssClass  : 'elfinder-dialog-error',
					title     : self.i18n('error'),
					resizable : false,
					destroyOnClose : true,
					buttons   : {}
				},
				node = self.getUI(),
				cnt = node.children('.elfinder-dialog-error').length,
				last, counter;
			
			if (cnt < self.options.maxErrorDialogs) {
				opts.buttons[self.i18n(self.i18n('btnClose'))] = function() { jQuery(this).elfinderdialog('close'); };

				if (e.data.opts && jQuery.isPlainObject(e.data.opts)) {
					Object.assign(opts, e.data.opts);
				}

				self.dialog('<span class="elfinder-dialog-icon elfinder-dialog-icon-error"></span>'+self.i18n(e.data.error), opts);
			} else {
				last = node.children('.elfinder-dialog-error:last').children('.ui-dialog-content:first');
				counter = last.children('.elfinder-error-counter');
				if (counter.length) {
					counter.data('cnt', parseInt(counter.data('cnt')) + 1).html(self.i18n(['moreErrors', counter.data('cnt')]));
				} else {
					counter = jQuery('<span class="elfinder-error-counter">'+ self.i18n(['moreErrors', 1]) +'</span>').data('cnt', 1);
					last.append('<br/>', counter);
				}
			}
		})
		.bind('tmb', function(e) {
			jQuery.each(e.data.images||[], function(hash, tmb) {
				if (files[hash]) {
					files[hash].tmb = tmb;
				}
			});
		})
		.bind('searchstart', function(e) {
			Object.assign(self.searchStatus, e.data);
			self.searchStatus.state = 1;
		})
		.bind('search', function(e) {
			self.searchStatus.state = 2;
		})
		.bind('searchend', function() {
			self.searchStatus.state = 0;
			self.searchStatus.ininc = false;
			self.searchStatus.mixed = false;
		})
		.bind('canMakeEmptyFile', function(e) {
			var data = e.data,
				obj = {};
			if (data && Array.isArray(data.mimes)) {
				if (!data.unshift) {
					obj = self.mimesCanMakeEmpty;
				}
				jQuery.each(data.mimes, function() {
					if (!obj[this]) {
						obj[this] = self.mimeTypes[this];
					}
				});
				if (data.unshift) {
					self.mimesCanMakeEmpty = Object.assign(obj, self.mimesCanMakeEmpty);
				}
			}
		})
		.bind('themechange', function() {
			requestAnimationFrame(function() {
				self.trigger('uiresize');
			});
		})
		;

	// We listen and emit a sound on delete according to option
	if (true === this.options.sound) {
		this.bind('playsound', function(e) {
			var play  = beeper.canPlayType && beeper.canPlayType('audio/wav; codecs="1"'),
				file = e.data && e.data.soundFile;

			play && file && play != '' && play != 'no' && jQuery(beeper).html('<source src="' + soundPath + file + '" type="audio/wav">')[0].play();
		});
	}

	// bind external event handlers
	jQuery.each(this.options.handlers, function(event, callback) {
		self.bind(event, callback);
	});

	/**
	 * History object. Store visited folders
	 *
	 * @type Object
	 **/
	this.history = new this.history(this);
	
	/**
	 * Root hashed
	 * 
	 * @type Object
	 */
	this.roots = {};
	
	/**
	 * leaf roots
	 * 
	 * @type Object
	 */
	this.leafRoots = {};
	
	this.volumeExpires = {};

	/**
	 * Loaded commands
	 *
	 * @type Object
	 **/
	this._commands = {};
	
	if (!Array.isArray(this.options.commands)) {
		this.options.commands = [];
	}
	
	if (jQuery.inArray('*', this.options.commands) !== -1) {
		this.options.commands = Object.keys(this.commands);
	}
	
	/**
	 * UI command map of cwd volume ( That volume driver option `uiCmdMap` )
	 *
	 * @type Object
	 **/
	this.commandMap = {};
	
	/**
	 * cwd options of each volume
	 * key: volumeid
	 * val: options object
	 * 
	 * @type Object
	 */
	this.volOptions = {};

	/**
	 * Has volOptions data
	 * 
	 * @type Boolean
	 */
	this.hasVolOptions = false;

	/**
	 * Hash of trash holders
	 * key: trash folder hash
	 * val: source volume hash
	 * 
	 * @type Object
	 */
	this.trashes = {};

	/**
	 * cwd options of each folder/file
	 * key: hash
	 * val: options object
	 *
	 * @type Object
	 */
	this.optionsByHashes = {};
	
	/**
	 * UI Auto Hide Functions
	 * Each auto hide function mast be call to `fm.trigger('uiautohide')` at end of process
	 *
	 * @type Array
	 **/
	this.uiAutoHide = [];
	
	// trigger `uiautohide`
	this.one('open', function() {
		if (self.uiAutoHide.length) {
			setTimeout(function() {
				self.trigger('uiautohide');
			}, 500);
		}
	});
	
	// Auto Hide Functions sequential processing start
	this.bind('uiautohide', function() {
		if (self.uiAutoHide.length) {
			self.uiAutoHide.shift()();
		}
	});

	if (this.options.width) {
		width = this.options.width;
	}
	
	if (this.options.height) {
		height = this.options.height;
	}
	
	if (this.options.heightBase) {
		heightBase = jQuery(this.options.heightBase);
	}
	
	if (this.options.soundPath) {
		soundPath = this.options.soundPath.replace(/\/+$/, '') + '/';
	} else {
		soundPath = this.baseUrl + soundPath;
	}
	
	if (this.options.parrotHeaders && Array.isArray(this.options.parrotHeaders) && this.options.parrotHeaders.length) {
		this.parrotHeaders = this.options.parrotHeaders;
		// check sessionStorage
		jQuery.each(this.parrotHeaders, function(i, h) {
			var v = self.sessionStorage('core-ph:' + h);
			if (v) {
				self.customHeaders[h] = v;
			}
		});
	} else {
		this.parrotHeaders = [];
	}

	self.one('opendone', function() {
		var tm;
		// attach events to document
		jQuery(document)
			// disable elfinder on click outside elfinder
			.on('click.'+namespace, function(e) { enabled && ! self.options.enableAlways && !jQuery(e.target).closest(node).length && self.disable(); })
			// exec shortcuts
			.on(keydown+' '+keypress+' '+keyup+' '+mousedown, execShortcut);
		
		// attach events to window
		self.options.useBrowserHistory && jQuery(window)
			.on('popstate.' + namespace, function(ev) {
				var state = ev.originalEvent.state || {},
					hasThash = state.thash? true : false,
					dialog = node.find('.elfinder-frontmost:visible'),
					input = node.find('.elfinder-navbar-dir,.elfinder-cwd-filename').find('input,textarea'),
					onOpen, toast;
				if (!hasThash) {
					state = { thash: self.cwd().hash };
					// scroll to elFinder node
					jQuery('html,body').animate({ scrollTop: node.offset().top });
				}
				if (dialog.length || input.length) {
					history.pushState(state, null, location.pathname + location.search + '#elf_' + state.thash);
					if (dialog.length) {
						if (!dialog.hasClass(self.res('class', 'preventback'))) {
							if (dialog.hasClass('elfinder-contextmenu')) {
								jQuery(document).trigger(jQuery.Event('keydown', { keyCode: jQuery.ui.keyCode.ESCAPE, ctrlKey : false, shiftKey : false, altKey : false, metaKey : false }));
							} else if (dialog.hasClass('elfinder-dialog')) {
								dialog.elfinderdialog('close');
							} else {
								dialog.trigger('close');
							}
						}
					} else {
						input.trigger(jQuery.Event('keydown', { keyCode: jQuery.ui.keyCode.ESCAPE, ctrlKey : false, shiftKey : false, altKey : false, metaKey : false }));
					}
				} else {
					if (hasThash) {
						!jQuery.isEmptyObject(self.files()) && self.request({
							data   : {cmd  : 'open', target : state.thash, onhistory : 1},
							notify : {type : 'open', cnt : 1, hideCnt : true},
							syncOnFail : true
						});
					} else {
						onOpen = function() {
							toast.trigger('click');
						};
						self.one('open', onOpen, true);
						toast = self.toast({
							msg: self.i18n('pressAgainToExit'),
							onHidden: function() {
								self.unbind('open', onOpen);
								history.pushState(state, null, location.pathname + location.search + '#elf_' + state.thash);
							}
						});
					}
				}
			});
		
		jQuery(window).on('resize.' + namespace, function(e){
			if (e.target === this) {
				tm && cancelAnimationFrame(tm);
				tm = requestAnimationFrame(function() {
					var prv = node.data('resizeSize') || {w: 0, h: 0},
						size = {w: Math.round(node.width()), h: Math.round(node.height())};
					node.data('resizeSize', size);
					if (size.w !== prv.w || size.h !== prv.h) {
						node.trigger('resize');
						self.trigger('resize', {width : size.w, height : size.h});
					}
				});
			}
		})
		.on('beforeunload.' + namespace,function(e){
			var msg, cnt;
			if (!self.pauseUnloadCheck()) {
				if (node.is(':visible')) {
					if (self.ui.notify.children().length && jQuery.inArray('hasNotifyDialog', self.options.windowCloseConfirm) !== -1) {
						msg = self.i18n('ntfsmth');
					} else if (node.find('.'+self.res('class', 'editing')).length && jQuery.inArray('editingFile', self.options.windowCloseConfirm) !== -1) {
						msg = self.i18n('editingFile');
					} else if ((cnt = Object.keys(self.selected()).length) && jQuery.inArray('hasSelectedItem', self.options.windowCloseConfirm) !== -1) {
						msg = self.i18n('hasSelected', ''+cnt);
					} else if ((cnt = Object.keys(self.clipboard()).length) && jQuery.inArray('hasClipboardData', self.options.windowCloseConfirm) !== -1) {
						msg = self.i18n('hasClipboard', ''+cnt);
					}
					if (msg) {
						e.returnValue = msg;
						return msg;
					}
				}
				self.trigger('unload');
			}
		});

		// bind window onmessage for CORS
		jQuery(window).on('message.' + namespace, function(e){
			var res = e.originalEvent || null,
				obj, data;
			if (res && (self.convAbsUrl(self.options.url).indexOf(res.origin) === 0 || self.convAbsUrl(self.uploadURL).indexOf(res.origin) === 0)) {
				try {
					obj = JSON.parse(res.data);
					data = obj.data || null;
					if (data) {
						if (data.error) {
							if (obj.bind) {
								self.trigger(obj.bind+'fail', data);
							}
							self.error(data.error);
						} else {
							data.warning && self.error(data.warning);
							self.updateCache(data);
							data.removed && data.removed.length && self.remove(data);
							data.added   && data.added.length   && self.add(data);
							data.changed && data.changed.length && self.change(data);
							if (obj.bind) {
								self.trigger(obj.bind, data);
								self.trigger(obj.bind+'done');
							}
							data.sync && self.sync();
						}
					}
				} catch (e) {
					self.sync();
				}
			}
		});

		// elFinder enable always
		if (self.options.enableAlways) {
			jQuery(window).on('focus.' + namespace, function(e){
				(e.target === this) && self.enable();
			});
			if (inFrame) {
				jQuery(window.top).on('focus.' + namespace, function() {
					if (self.enable() && (! parentIframe || parentIframe.is(':visible'))) {
						requestAnimationFrame(function() {
							jQuery(window).trigger('focus');
						});
					}
				});
			}
		} else if (inFrame) {
			jQuery(window).on('blur.' + namespace, function(e){
				enabled && e.target === this && self.disable();
			});
		}

		// return focus to the window on click (elFInder in the frame)
		if (inFrame) {
			node.on('click', function(e) {
				jQuery(window).trigger('focus');
			});
		}
		
		// elFinder to enable by mouse over
		if (self.options.enableByMouseOver) {
			node.on('mouseenter touchstart', function(e) {
				(inFrame) && jQuery(window).trigger('focus');
				! self.enabled() && self.enable();
			});
		}

		// When the browser tab turn to foreground/background
		jQuery(window).on('visibilitychange.' + namespace, function(e) {
			var background = document.hidden || document.webkitHidden || document.msHidden;
			// AutoSync turn On/Off
			if (self.options.syncStart) {
				self.autoSync(background? 'stop' : void(0));
			}
		});
	});

	// store instance in node
	node[0].elfinder = this;

	// auto load language file
	dfrdsBeforeBootup.push((function() {
		var lang   = self.lang,
			langJs = self.i18nBaseUrl + 'elfinder.' + lang + '.js',
			dfd    = jQuery.Deferred().done(function() {
				if (self.i18[lang]) {
					self.lang = lang;
				}
				self.trigger('i18load');
				i18n = self.lang === 'en' 
					? self.i18['en'] 
					: jQuery.extend(true, {}, self.i18['en'], self.i18[self.lang]);
			});
		
		if (!self.i18[lang]) {
			self.lang = 'en';
			if (self.hasRequire) {
				require([langJs], function() {
					dfd.resolve();
				}, function() {
					dfd.resolve();
				});
			} else {
				self.loadScript([langJs], function() {
					dfd.resolve();
				}, {
					loadType: 'tag',
					error : function() {
						dfd.resolve();
					}
				});
			}
		} else {
			dfd.resolve();
		}
		return dfd;
	})());
	
	// elFinder boot up function
	bootUp = function() {
		var columnNames;

		/**
		 * i18 messages
		 *
		 * @type Object
		 **/
		self.messages = i18n.messages;
		
		// check jquery ui
		if (!(jQuery.fn.selectable && jQuery.fn.draggable && jQuery.fn.droppable && jQuery.fn.resizable && jQuery.fn.button && jQuery.fn.slider)) {
			return alert(self.i18n('errJqui'));
		}
		
		// check node
		if (!node.length) {
			return alert(self.i18n('errNode'));
		}
		// check connector url
		if (!self.options.url) {
			return alert(self.i18n('errURL'));
		}
		
		// column key/name map for fm.getColumnName()
		columnNames = Object.assign({
			name : self.i18n('name'),
			perm : self.i18n('perms'),
			date : self.i18n('modify'),
			size : self.i18n('size'),
			kind : self.i18n('kind'),
			modestr : self.i18n('mode'),
			modeoct : self.i18n('mode'),
			modeboth : self.i18n('mode')
		}, self.options.uiOptions.cwd.listView.columnsCustomName);

		/**
		 * Gets the column name of cwd list view
		 *
		 * @param      String  key     The key
		 * @return     String  The column name.
		 */
		self.getColumnName = function(key) {
			var res = columnNames[key] || self.i18n(key);
			return typeof res === 'function'? res() : res;
		};

		/**
		 * Interface direction
		 *
		 * @type String
		 * @default "ltr"
		 **/
		self.direction = i18n.direction;
		
		/**
		 * Date/time format
		 *
		 * @type String
		 * @default "m.d.Y"
		 **/
		self.dateFormat = self.options.dateFormat || i18n.dateFormat;
		
		/**
		 * Date format like "Yesterday 10:20:12"
		 *
		 * @type String
		 * @default "{day} {time}"
		 **/
		self.fancyFormat = self.options.fancyDateFormat || i18n.fancyDateFormat;
		
		/**
		 * Date format for if upload file has not original unique name
		 * e.g. Clipboard image data, Image data taken with iOS
		 *
		 * @type String
		 * @default "ymd-His"
		 **/
		self.nonameDateFormat = (self.options.nonameDateFormat || i18n.nonameDateFormat).replace(/[\/\\]/g, '_');

		/**
		 * Css classes 
		 *
		 * @type String
		 **/
		self.cssClass = 'ui-helper-reset ui-helper-clearfix ui-widget ui-widget-content ui-corner-all elfinder elfinder-'
				+(self.direction == 'rtl' ? 'rtl' : 'ltr')
				+(self.UA.Touch? (' elfinder-touch' + (self.options.resizable ? ' touch-punch' : '')) : '')
				+(self.UA.Mobile? ' elfinder-mobile' : '')
				+(self.UA.iOS? ' elfinder-ios' : '')
				+' '+self.options.cssClass;

		// prepare node
		node.addClass(self.cssClass)
			.on(mousedown, function() {
				!enabled && self.enable();
			});

		// draggable closure
		(function() {
			var ltr, wzRect, wzBottom, wzBottom2, nodeStyle,
				keyEvt = keydown + 'draggable' + ' keyup.' + namespace + 'draggable';
			
			/**
			 * Base draggable options
			 *
			 * @type Object
			 **/
			self.draggable = {
				appendTo   : node,
				addClasses : false,
				distance   : 4,
				revert     : true,
				refreshPositions : false,
				cursor     : 'crosshair',
				cursorAt   : {left : 50, top : 47},
				scroll     : false,
				start      : function(e, ui) {
					var helper   = ui.helper,
						targets  = jQuery.grep(helper.data('files')||[], function(h) {
							if (h) {
								remember[h] = true;
								return true;
							}
							return false;
						}),
						locked   = false,
						cnt, h;
					
					// fix node size
					nodeStyle = node.attr('style');
					node.width(node.width()).height(node.height());
					
					// set var for drag()
					ltr = (self.direction === 'ltr');
					wzRect = self.getUI('workzone').data('rectangle');
					wzBottom = wzRect.top + wzRect.height;
					wzBottom2 = wzBottom - self.getUI('navdock').outerHeight(true);
					
					self.draggingUiHelper = helper;
					cnt = targets.length;
					while (cnt--) {
						h = targets[cnt];
						if (files[h].locked) {
							locked = true;
							helper.data('locked', true);
							break;
						}
					}
					!locked && self.trigger('lockfiles', {files : targets});
		
					helper.data('autoScrTm', setInterval(function() {
						if (helper.data('autoScr')) {
							self.autoScroll[helper.data('autoScr')](helper.data('autoScrVal'));
						}
					}, 50));
				},
				drag       : function(e, ui) {
					var helper = ui.helper,
						autoScr, autoUp, bottom;
					
					if ((autoUp = wzRect.top > e.pageY) || wzBottom2 < e.pageY) {
						if (wzRect.cwdEdge > e.pageX) {
							autoScr = (ltr? 'navbar' : 'cwd') + (autoUp? 'Up' : 'Down');
						} else {
							autoScr = (ltr? 'cwd' : 'navbar') + (autoUp? 'Up' : 'Down');
						}
						if (!autoUp) {
							if (autoScr.substr(0, 3) === 'cwd') {
								if (wzBottom < e.pageY) {
									bottom = wzBottom;
								} else {
									autoScr = null;
								}
							} else {
								bottom = wzBottom2;
							}
						}
						if (autoScr) {
							helper.data('autoScr', autoScr);
							helper.data('autoScrVal', Math.pow((autoUp? wzRect.top - e.pageY : e.pageY - bottom), 1.3));
						}
					}
					if (! autoScr) {
						if (helper.data('autoScr')) {
							helper.data('refreshPositions', 1).data('autoScr', null);
						}
					}
					if (helper.data('refreshPositions') && jQuery(this).elfUiWidgetInstance('draggable')) {
						if (helper.data('refreshPositions') > 0) {
							jQuery(this).draggable('option', { refreshPositions : true, elfRefresh : true });
							helper.data('refreshPositions', -1);
						} else {
							jQuery(this).draggable('option', { refreshPositions : false, elfRefresh : false });
							helper.data('refreshPositions', null);
						}
					}
				},
				stop       : function(e, ui) {
					var helper = ui.helper,
						files;
					
					jQuery(document).off(keyEvt);
					jQuery(this).elfUiWidgetInstance('draggable') && jQuery(this).draggable('option', { refreshPositions : false });
					self.draggingUiHelper = null;
					self.trigger('focus').trigger('dragstop');
					if (! helper.data('droped')) {
						files = jQuery.grep(helper.data('files')||[], function(h) { return h? true : false ;});
						self.trigger('unlockfiles', {files : files});
						self.trigger('selectfiles', {files : self.selected()});
					}
					self.enable();
					
					// restore node style
					node.attr('style', nodeStyle);
					
					helper.data('autoScrTm') && clearInterval(helper.data('autoScrTm'));
				},
				helper     : function(e, ui) {
					var element = this.id ? jQuery(this) : jQuery(this).parents('[id]:first'),
						helper  = jQuery('<div class="elfinder-drag-helper"><span class="elfinder-drag-helper-icon-status"></span></div>'),
						icon    = function(f) {
							var mime = f.mime, i, tmb = self.tmb(f);
							i = '<div class="elfinder-cwd-icon elfinder-cwd-icon-drag '+self.mime2class(mime)+' ui-corner-all"></div>';
							if (tmb) {
								i = jQuery(i).addClass(tmb.className).css('background-image', "url('"+tmb.url+"')").get(0).outerHTML;
							} else if (f.icon) {
								i = jQuery(i).css(self.getIconStyle(f, true)).get(0).outerHTML;
							}
							if (f.csscls) {
								i = '<div class="'+f.csscls+'">' + i + '</div>';
							}
							return i;
						},
						hashes, l, ctr;
					
					self.draggingUiHelper && self.draggingUiHelper.stop(true, true);
					
					self.trigger('dragstart', {target : element[0], originalEvent : e}, true);
					
					hashes = element.hasClass(self.res('class', 'cwdfile')) 
						? self.selected() 
						: [self.navId2Hash(element.attr('id'))];
					
					helper.append(icon(files[hashes[0]])).data('files', hashes).data('locked', false).data('droped', false).data('namespace', namespace).data('dropover', 0);
		
					if ((l = hashes.length) > 1) {
						helper.append(icon(files[hashes[l-1]]) + '<span class="elfinder-drag-num">'+l+'</span>');
					}
					
					jQuery(document).on(keyEvt, function(e){
						if (self._commands.copy) {
							var chk = (e.shiftKey||e.ctrlKey||e.metaKey);
							if (ctr !== chk) {
								ctr = chk;
								if (helper.is(':visible') && helper.data('dropover') && ! helper.data('droped')) {
									helper.toggleClass('elfinder-drag-helper-plus', helper.data('locked')? true : ctr);
									self.trigger(ctr? 'unlockfiles' : 'lockfiles', {files : hashes, helper: helper});
								}
							}
						}
					});
					
					return helper;
				}
			};
		})();

		// in getFileCallback set - change default actions on double click/enter/ctrl+enter
		if (self.commands.getfile) {
			if (typeof(self.options.getFileCallback) == 'function') {
				self.bind('dblclick', function(e) {
					e.preventDefault();
					self.exec('getfile').fail(function() {
						self.exec('open', e.data && e.data.file? [ e.data.file ]: void(0));
					});
				});
				self.shortcut({
					pattern     : 'enter',
					description : self.i18n('cmdgetfile'),
					callback    : function() { self.exec('getfile').fail(function() { self.exec(self.OS == 'mac' ? 'rename' : 'open'); }); }
				})
				.shortcut({
					pattern     : 'ctrl+enter',
					description : self.i18n(self.OS == 'mac' ? 'cmdrename' : 'cmdopen'),
					callback    : function() { self.exec(self.OS == 'mac' ? 'rename' : 'open'); }
				});
			} else {
				self.options.getFileCallback = null;
			}
		}

		// load commands
		jQuery.each(self.commands, function(name, cmd) {
			var proto = Object.assign({}, cmd.prototype),
				extendsCmd, opts;
			if (jQuery.isFunction(cmd) && !self._commands[name] && (cmd.prototype.forceLoad || jQuery.inArray(name, self.options.commands) !== -1)) {
				extendsCmd = cmd.prototype.extendsCmd || '';
				if (extendsCmd) {
					if (jQuery.isFunction(self.commands[extendsCmd])) {
						cmd.prototype = Object.assign({}, base, new self.commands[extendsCmd](), cmd.prototype);
					} else {
						return true;
					}
				} else {
					cmd.prototype = Object.assign({}, base, cmd.prototype);
				}
				self._commands[name] = new cmd();
				cmd.prototype = proto;
				opts = self.options.commandsOptions[name] || {};
				if (extendsCmd && self.options.commandsOptions[extendsCmd]) {
					opts = jQuery.extend(true, {}, self.options.commandsOptions[extendsCmd], opts);
				}
				self._commands[name].setup(name, opts);
				// setup linked commands
				if (self._commands[name].linkedCmds.length) {
					jQuery.each(self._commands[name].linkedCmds, function(i, n) {
						var lcmd = self.commands[n];
						if (jQuery.isFunction(lcmd) && !self._commands[n]) {
							lcmd.prototype = base;
							self._commands[n] = new lcmd();
							self._commands[n].setup(n, self.options.commandsOptions[n]||{});
						}
					});
				}
			}
		});

		/**
		 * UI nodes
		 *
		 * @type Object
		 **/
		self.ui = {
			// container for nav panel and current folder container
			workzone : jQuery('<div></div>').appendTo(node).elfinderworkzone(self),
			// contaainer for folders tree / places
			navbar : jQuery('<div></div>').appendTo(node).elfindernavbar(self, self.options.uiOptions.navbar || {}),
			// container for for preview etc at below the navbar
			navdock : jQuery('<div></div>').appendTo(node).elfindernavdock(self, self.options.uiOptions.navdock || {}),
			// contextmenu
			contextmenu : jQuery('<div></div>').appendTo(node).elfindercontextmenu(self),
			// overlay
			overlay : jQuery('<div></div>').appendTo(node).elfinderoverlay({
				show : function() { self.disable(); },
				hide : function() { prevEnabled && self.enable(); }
			}),
			// current folder container
			cwd : jQuery('<div></div>').appendTo(node).elfindercwd(self, self.options.uiOptions.cwd || {}),
			// notification dialog window
			notify : self.dialog('', {
				cssClass      : 'elfinder-dialog-notify' + (self.options.notifyDialog.canClose? '' : ' elfinder-titlebar-button-hide'),
				position      : self.options.notifyDialog.position,
				absolute      : true,
				resizable     : false,
				autoOpen      : false,
				allowMinimize : true,
				closeOnEscape : self.options.notifyDialog.canClose? true : false,
				title         : '&nbsp;',
				width         : self.options.notifyDialog.width? parseInt(self.options.notifyDialog.width) : null,
				minHeight     : null,
				minimize      : function() { self.ui.notify.trigger('minimize'); }
			}),
			statusbar : jQuery('<div class="ui-widget-header ui-helper-clearfix ui-corner-bottom elfinder-statusbar"></div>').hide().appendTo(node),
			toast : jQuery('<div class="elfinder-toast"></div>').appendTo(node),
			bottomtray : jQuery('<div class="elfinder-bottomtray">').appendTo(node),
			progressbar : jQuery('<div class="elfinder-ui-progressbar">').appendTo(node)
		};

		self.trigger('uiready');

		// load required ui
		jQuery.each(self.options.ui || [], function(i, ui) {
			var name = 'elfinder'+ui,
				opts = self.options.uiOptions[ui] || {};
	
			if (!self.ui[ui] && jQuery.fn[name]) {
				// regist to self.ui before make instance
				self.ui[ui] = jQuery('<'+(opts.tag || 'div')+'/>').appendTo(node);
				self.ui[ui][name](self, opts);
			}
		});

		self.ui.progressbar.appendTo(self.ui.workzone);
		self.ui.notify.prev('.ui-dialog-titlebar').append('<div class="elfinder-ui-progressbar"></div>');

		// update size	
		self.resize(width, height);
		
		// make node resizable
		if (self.options.resizable) {
			node.resizable({
				resize    : function(e, ui) {
					self.resize(ui.size.width, ui.size.height);
				},
				handles   : 'se',
				minWidth  : 300,
				minHeight : 200
			});
			if (self.UA.Touch) {
				node.addClass('touch-punch');
			}
		}

		(function() {
			var navbar = self.getUI('navbar'),
				cwd    = self.getUI('cwd').parent();
			
			self.autoScroll = {
				navbarUp   : function(v) {
					navbar.scrollTop(Math.max(0, navbar.scrollTop() - v));
				},
				navbarDown : function(v) {
					navbar.scrollTop(navbar.scrollTop() + v);
				},
				cwdUp     : function(v) {
					cwd.scrollTop(Math.max(0, cwd.scrollTop() - v));
				},
				cwdDown   : function(v) {
					cwd.scrollTop(cwd.scrollTop() + v);
				}
			};
		})();

		// Swipe on the touch devices to show/hide of toolbar or navbar
		if (self.UA.Touch) {
			(function() {
				var lastX, lastY, nodeOffset, nodeWidth, nodeTop, navbarW, toolbarH,
					navbar = self.getUI('navbar'),
					toolbar = self.getUI('toolbar'),
					moveEv = 'touchmove.stopscroll',
					moveTm,
					moveUpOn = function(e) {
						var touches = e.originalEvent.touches || [{}],
							y = touches[0].pageY || null;
						if (!lastY || y < lastY) {
							e.preventDefault();
							moveTm && clearTimeout(moveTm);
						}
					},
					moveDownOn = function(e) {
						e.preventDefault();
						moveTm && clearTimeout(moveTm);
					},
					moveOff = function() {
						moveTm = setTimeout(function() {
							node.off(moveEv);
						}, 100);
					},
					handleW, handleH = 50;

				navbar = navbar.children().length? navbar : null;
				toolbar = toolbar.length? toolbar : null;
				node.on('touchstart touchmove touchend', function(e) {
					if (e.type === 'touchend') {
						lastX = false;
						lastY = false;
						moveOff();
						return;
					}
					
					var touches = e.originalEvent.touches || [{}],
						x = touches[0].pageX || null,
						y = touches[0].pageY || null,
						ltr = (self.direction === 'ltr'),
						navbarMode, treeWidth, swipeX, moveX, toolbarT, mode;
					
					if (x === null || y === null || (e.type === 'touchstart' && touches.length > 1)) {
						return;
					}
					
					if (e.type === 'touchstart') {
						nodeOffset = node.offset();
						nodeWidth = node.width();
						if (navbar) {
							lastX = false;
							if (navbar.is(':hidden')) {
								if (! handleW) {
									handleW = Math.max(50, nodeWidth / 10);
								}
								if ((ltr? (x - nodeOffset.left) : (nodeWidth + nodeOffset.left - x)) < handleW) {
									lastX = x;
								}
							} else if (! e.originalEvent._preventSwipeX) {
								navbarW = navbar.width();
								if (ltr) {
									swipeX = (x < nodeOffset.left + navbarW);
								} else {
									swipeX = (x > nodeOffset.left + nodeWidth - navbarW);
								}
								if (swipeX) {
									handleW = Math.max(50, nodeWidth / 10);
									lastX = x;
								} else {
									lastX = false;
								}
							}
						}
						if (toolbar) {
							lastY = false;
							if (! e.originalEvent._preventSwipeY) {
								toolbarH = toolbar.height();
								nodeTop = nodeOffset.top;
								if (y - nodeTop < (toolbar.is(':hidden')? handleH : (toolbarH + 30))) {
									lastY = y;
									node.on(moveEv, toolbar.is(':hidden')? moveDownOn: moveUpOn);
								}
							}
						}
					} else {
						if (navbar && lastX !== false) {
							navbarMode = (ltr? (lastX > x) : (lastX < x))? 'navhide' : 'navshow';
							moveX = Math.abs(lastX - x);
							if (navbarMode === 'navhide' && moveX > navbarW * 0.6
								|| (moveX > (navbarMode === 'navhide'? navbarW / 3 : 45)
									&& (navbarMode === 'navshow'
										|| (ltr? x < nodeOffset.left + 20 : x > nodeOffset.left + nodeWidth - 20)
									))
							) {
								self.getUI('navbar').trigger(navbarMode, {handleW: handleW});
								lastX = false;
							}
						}
						if (toolbar && lastY !== false ) {
							toolbarT = toolbar.offset().top;
							if (Math.abs(lastY - y) > Math.min(45, toolbarH / 3)) {
								mode = (lastY > y)? 'slideUp' : 'slideDown';
								if (mode === 'slideDown' || toolbarT + 20 > y) {
									if (toolbar.is(mode === 'slideDown' ? ':hidden' : ':visible')) {
										toolbar.stop(true, true).trigger('toggle', {duration: 100, handleH: handleH});
									}
									lastY = false;
								}
							}
						}
					}
				});
			})();
		}

		if (self.dragUpload) {
			// add event listener for HTML5 DnD upload
			(function() {
				var isin = function(e) {
					return (e.target.nodeName !== 'TEXTAREA' && e.target.nodeName !== 'INPUT' && jQuery(e.target).closest('div.ui-dialog-content').length === 0);
				},
				ent       = 'native-drag-enter',
				disable   = 'native-drag-disable',
				c         = 'class',
				navdir    = self.res(c, 'navdir'),
				droppable = self.res(c, 'droppable'),
				dropover  = self.res(c, 'adroppable'),
				arrow     = self.res(c, 'navarrow'),
				clDropActive = self.res(c, 'adroppable'),
				wz        = self.getUI('workzone'),
				ltr       = (self.direction === 'ltr'),
				clearTm   = function() {
					autoScrTm && cancelAnimationFrame(autoScrTm);
					autoScrTm = null;
				},
				wzRect, autoScrFn, autoScrTm;
				
				node.on('dragenter', function(e) {
					clearTm();
					if (isin(e)) {
						e.preventDefault();
						e.stopPropagation();
						wzRect = wz.data('rectangle');
					}
				})
				.on('dragleave', function(e) {
					clearTm();
					if (isin(e)) {
						e.preventDefault();
						e.stopPropagation();
					}
				})
				.on('dragover', function(e) {
					var autoUp;
					if (isin(e)) {
						e.preventDefault();
						e.stopPropagation();
						e.originalEvent.dataTransfer.dropEffect = 'none';
						if (! autoScrTm) {
							autoScrTm = requestAnimationFrame(function() {
								var wzBottom = wzRect.top + wzRect.height,
									wzBottom2 = wzBottom - self.getUI('navdock').outerHeight(true),
									fn;
								if ((autoUp = e.pageY < wzRect.top) || e.pageY > wzBottom2 ) {
									if (wzRect.cwdEdge > e.pageX) {
										fn = (ltr? 'navbar' : 'cwd') + (autoUp? 'Up' : 'Down');
									} else {
										fn = (ltr? 'cwd' : 'navbar') + (autoUp? 'Up' : 'Down');
									}
									if (!autoUp) {
										if (fn.substr(0, 3) === 'cwd') {
											if (wzBottom < e.pageY) {
												wzBottom2 = wzBottom;
											} else {
												fn = '';
											}
										}
									}
									fn && self.autoScroll[fn](Math.pow((autoUp? wzRect.top - e.pageY : e.pageY - wzBottom2), 1.3));
								}
								autoScrTm = null;
							});
						}
					} else {
						clearTm();
					}
				})
				.on('drop', function(e) {
					clearTm();
					if (isin(e)) {
						e.stopPropagation();
						e.preventDefault();
					}
				});
				
				node.on('dragenter', '.native-droppable', function(e){
					if (e.originalEvent.dataTransfer) {
						var $elm = jQuery(e.currentTarget),
							id   = e.currentTarget.id || null,
							cwd  = null,
							elfFrom;
						if (!id) { // target is cwd
							cwd = self.cwd();
							$elm.data(disable, false);
							try {
								jQuery.each(e.originalEvent.dataTransfer.types, function(i, v){
									if (v.substr(0, 13) === 'elfinderfrom:') {
										elfFrom = v.substr(13).toLowerCase();
									}
								});
							} catch(e) {}
						}
						if (!cwd || (cwd.write && (!elfFrom || elfFrom !== (window.location.href + cwd.hash).toLowerCase()))) {
							e.preventDefault();
							e.stopPropagation();
							$elm.data(ent, true);
							$elm.addClass(clDropActive);
						} else {
							$elm.data(disable, true);
						}
					}
				})
				.on('dragleave', '.native-droppable', function(e){
					if (e.originalEvent.dataTransfer) {
						var $elm = jQuery(e.currentTarget);
						e.preventDefault();
						e.stopPropagation();
						if ($elm.data(ent)) {
							$elm.data(ent, false);
						} else {
							$elm.removeClass(clDropActive);
						}
					}
				})
				.on('dragover', '.native-droppable', function(e){
					if (e.originalEvent.dataTransfer) {
						var $elm = jQuery(e.currentTarget);
						e.preventDefault();
						e.stopPropagation();
						e.originalEvent.dataTransfer.dropEffect = $elm.data(disable)? 'none' : 'copy';
						$elm.data(ent, false);
					}
				})
				.on('drop', '.native-droppable', function(e){
					if (e.originalEvent && e.originalEvent.dataTransfer) {
						var $elm = jQuery(e.currentTarget),
							id;
						e.preventDefault();
						e.stopPropagation();
						$elm.removeClass(clDropActive);
						if (e.currentTarget.id) {
							id = $elm.hasClass(navdir)? self.navId2Hash(e.currentTarget.id) : self.cwdId2Hash(e.currentTarget.id);
						} else {
							id = self.cwd().hash;
						}
						e.originalEvent._target = id;
						self.exec('upload', {dropEvt: e.originalEvent, target: id}, void 0, id);
					}
				});
			})();
		}

		// trigger event cssloaded if cssAutoLoad disabled
		if (self.cssloaded === false) {
			self.cssloaded = true;
			self.trigger('cssloaded');
		}

		// calculate elFinder node z-index
		self.zIndexCalc();

		// send initial request and start to pray >_<
		self.trigger('init')
			.request({
				data        : {cmd : 'open', target : self.startDir(), init : 1, tree : 1}, 
				preventDone : true,
				notify      : {type : 'open', cnt : 1, hideCnt : true},
				freeze      : true
			})
			.fail(function() {
				self.trigger('fail').disable().lastDir('');
				listeners = {};
				shortcuts = {};
				jQuery(document).add(node).off('.'+namespace);
				self.trigger = function() { };
			})
			.done(function(data) {
				var trashDisable = function(th) {
						var src = self.file(self.trashes[th]),
							d = self.options.debug,
							error;
						
						if (src && src.volumeid) {
							delete self.volOptions[src.volumeid].trashHash;
						}
						self.trashes[th] = false;
						self.debug('backend-error', 'Trash hash "'+th+'" was not found or not writable.');
					},
					toChkTh = {};
				
				// regist rawStringDecoder
				if (self.options.rawStringDecoder) {
					self.registRawStringDecoder(self.options.rawStringDecoder);
				}

				// re-calculate elFinder node z-index
				self.zIndexCalc();
				
				self.load().debug('api', self.api);
				// update ui's size after init
				node.trigger('resize');
				// initial open
				open(data);
				self.trigger('open', data, false);
				self.trigger('opendone');
				
				if (inFrame && self.options.enableAlways) {
					jQuery(window).trigger('focus');
				}
				
				// check self.trashes
				jQuery.each(self.trashes, function(th) {
					var dir = self.file(th),
						src;
					if (! dir) {
						toChkTh[th] = true;
					} else if (dir.mime !== 'directory' || ! dir.write) {
						trashDisable(th);
					}
				});
				if (Object.keys(toChkTh).length) {
					self.request({
						data : {cmd : 'info', targets : Object.keys(toChkTh)},
						preventDefault : true
					}).done(function(data) {
						if (data && data.files) {
							jQuery.each(data.files, function(i, dir) {
								if (dir.mime === 'directory' && dir.write) {
									delete toChkTh[dir.hash];
								}
							});
						}
					}).always(function() {
						jQuery.each(toChkTh, trashDisable);
					});
				}
				// to enable / disable
				self[self.options.enableAlways? 'enable' : 'disable']();
			});
		
		// self.timeEnd('load');
		// End of bootUp()
	};
	
	// call bootCallback function with elFinder instance, extraObject - { dfrdsBeforeBootup: dfrdsBeforeBootup }
	if (bootCallback && typeof bootCallback === 'function') {
		self.bootCallback = bootCallback;
		bootCallback.call(node.get(0), self, { dfrdsBeforeBootup: dfrdsBeforeBootup });
	}
	
	// call dfrdsBeforeBootup functions then boot up elFinder
	jQuery.when.apply(null, dfrdsBeforeBootup).done(function() {
		bootUp();
	}).fail(function(error) {
		self.error(error);
	});
};

//register elFinder to global scope
if (typeof toGlobal === 'undefined' || toGlobal) {
	window.elFinder = elFinder;
}

/**
 * Prototype
 * 
 * @type  Object
 */
elFinder.prototype = {
	
	uniqueid : 0,
	
	res : function(type, id) {
		return this.resources[type] && this.resources[type][id];
	}, 

	/**
	 * User os. Required to bind native shortcuts for open/rename
	 *
	 * @type String
	 **/
	OS : navigator.userAgent.indexOf('Mac') !== -1 ? 'mac' : navigator.userAgent.indexOf('Win') !== -1  ? 'win' : 'other',
	
	/**
	 * User browser UA.
	 * jQuery.browser: version deprecated: 1.3, removed: 1.9
	 *
	 * @type Object
	 **/
	UA : (function(){
		var self = this,
			webkit = !document.unqueID && !window.opera && !window.sidebar && 'localStorage' in window && 'WebkitAppearance' in document.documentElement.style,
			chrome = webkit && window.chrome,
			/*setRotated = function() {
				var a = ((screen && screen.orientation && screen.orientation.angle) || window.orientation || 0) + 0;
				if (a === -90) {
					a = 270;
				}
				UA.Angle = a;
				UA.Rotated = a % 180 === 0? false : true;
			},*/
			UA = {
				// Browser IE <= IE 6
				ltIE6   : typeof window.addEventListener == "undefined" && typeof document.documentElement.style.maxHeight == "undefined",
				// Browser IE <= IE 7
				ltIE7   : typeof window.addEventListener == "undefined" && typeof document.querySelectorAll == "undefined",
				// Browser IE <= IE 8
				ltIE8   : typeof window.addEventListener == "undefined" && typeof document.getElementsByClassName == "undefined",
				// Browser IE <= IE 9
				ltIE9  : document.uniqueID && document.documentMode <= 9,
				// Browser IE <= IE 10
				ltIE10  : document.uniqueID && document.documentMode <= 10,
				// Browser IE >= IE 11
				gtIE11  : document.uniqueID && document.documentMode >= 11,
				IE      : document.uniqueID,
				Firefox : window.sidebar,
				Opera   : window.opera,
				Webkit  : webkit,
				Chrome  : chrome,
				Edge    : (chrome && window.msCredentials)? true : false,
				Safari  : webkit && !window.chrome,
				Mobile  : typeof window.orientation != "undefined",
				Touch   : typeof window.ontouchstart != "undefined",
				iOS     : navigator.platform.match(/^iP(?:[ao]d|hone)/),
				Mac     : navigator.platform.match(/^Mac/),
				Fullscreen : (typeof (document.exitFullscreen || document.webkitExitFullscreen || document.mozCancelFullScreen || document.msExitFullscreen) !== 'undefined'),
				Angle   : 0,
				Rotated : false,
				CSS : (function() {
					var aStyle = document.createElement('a').style,
						pStyle = document.createElement('p').style,
						css;
					css = 'position:sticky;position:-webkit-sticky;';
					css += 'width:-webkit-max-content;width:-moz-max-content;width:-ms-max-content;width:max-content;';
					aStyle.cssText = css;
					return {
						positionSticky : aStyle.position.indexOf('sticky')!==-1,
						widthMaxContent : aStyle.width.indexOf('max-content')!==-1,
						flex : typeof pStyle.flex !== 'undefined'
					};
				})()
			};
			return UA;
	})(),
	
	/**
	 * Is cookie enabled
	 * 
	 * @type Boolean
	 */
	cookieEnabled : window.navigator.cookieEnabled,

	/**
	 * Has RequireJS?
	 * 
	 * @type Boolean
	 */
	hasRequire : (typeof define === 'function' && define.amd),
	
	/**
	 * Current request command
	 * 
	 * @type  String
	 */
	currentReqCmd : '',
	
	/**
	 * Current keyboard state
	 * 
	 * @type  Object
	 */
	keyState : {},
	
	/**
	 * Internationalization object
	 * 
	 * @type  Object
	 */
	i18 : {
		en : {
			translator      : '',
			language        : 'English',
			direction       : 'ltr',
			dateFormat      : 'd.m.Y H:i',
			fancyDateFormat : '$1 H:i',
			nonameDateFormat : 'ymd-His',
			messages        : {}
		},
		months : ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
		monthsShort : ['msJan', 'msFeb', 'msMar', 'msApr', 'msMay', 'msJun', 'msJul', 'msAug', 'msSep', 'msOct', 'msNov', 'msDec'],

		days : ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
		daysShort : ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']
	},
	
	/**
	 * File mimetype to kind mapping
	 * 
	 * @type  Object
	 */
	kinds : 	{
			'unknown'                       : 'Unknown',
			'directory'                     : 'Folder',
			'group'                         : 'Selects',
			'symlink'                       : 'Alias',
			'symlink-broken'                : 'AliasBroken',
			'application/x-empty'           : 'TextPlain',
			'application/postscript'        : 'Postscript',
			'application/vnd.ms-office'     : 'MsOffice',
			'application/msword'            : 'MsWord',
			'application/vnd.ms-word'       : 'MsWord',
			'application/vnd.openxmlformats-officedocument.wordprocessingml.document' : 'MsWord',
			'application/vnd.ms-word.document.macroEnabled.12'                        : 'MsWord',
			'application/vnd.openxmlformats-officedocument.wordprocessingml.template' : 'MsWord',
			'application/vnd.ms-word.template.macroEnabled.12'                        : 'MsWord',
			'application/vnd.ms-excel'      : 'MsExcel',
			'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'       : 'MsExcel',
			'application/vnd.ms-excel.sheet.macroEnabled.12'                          : 'MsExcel',
			'application/vnd.openxmlformats-officedocument.spreadsheetml.template'    : 'MsExcel',
			'application/vnd.ms-excel.template.macroEnabled.12'                       : 'MsExcel',
			'application/vnd.ms-excel.sheet.binary.macroEnabled.12'                   : 'MsExcel',
			'application/vnd.ms-excel.addin.macroEnabled.12'                          : 'MsExcel',
			'application/vnd.ms-powerpoint' : 'MsPP',
			'application/vnd.openxmlformats-officedocument.presentationml.presentation' : 'MsPP',
			'application/vnd.ms-powerpoint.presentation.macroEnabled.12'              : 'MsPP',
			'application/vnd.openxmlformats-officedocument.presentationml.slideshow'  : 'MsPP',
			'application/vnd.ms-powerpoint.slideshow.macroEnabled.12'                 : 'MsPP',
			'application/vnd.openxmlformats-officedocument.presentationml.template'   : 'MsPP',
			'application/vnd.ms-powerpoint.template.macroEnabled.12'                  : 'MsPP',
			'application/vnd.ms-powerpoint.addin.macroEnabled.12'                     : 'MsPP',
			'application/vnd.openxmlformats-officedocument.presentationml.slide'      : 'MsPP',
			'application/vnd.ms-powerpoint.slide.macroEnabled.12'                     : 'MsPP',
			'application/pdf'               : 'PDF',
			'application/xml'               : 'XML',
			'application/vnd.oasis.opendocument.text' : 'OO',
			'application/vnd.oasis.opendocument.text-template'         : 'OO',
			'application/vnd.oasis.opendocument.text-web'              : 'OO',
			'application/vnd.oasis.opendocument.text-master'           : 'OO',
			'application/vnd.oasis.opendocument.graphics'              : 'OO',
			'application/vnd.oasis.opendocument.graphics-template'     : 'OO',
			'application/vnd.oasis.opendocument.presentation'          : 'OO',
			'application/vnd.oasis.opendocument.presentation-template' : 'OO',
			'application/vnd.oasis.opendocument.spreadsheet'           : 'OO',
			'application/vnd.oasis.opendocument.spreadsheet-template'  : 'OO',
			'application/vnd.oasis.opendocument.chart'                 : 'OO',
			'application/vnd.oasis.opendocument.formula'               : 'OO',
			'application/vnd.oasis.opendocument.database'              : 'OO',
			'application/vnd.oasis.opendocument.image'                 : 'OO',
			'application/vnd.openofficeorg.extension'                  : 'OO',
			'application/x-shockwave-flash' : 'AppFlash',
			'application/flash-video'       : 'Flash video',
			'application/x-bittorrent'      : 'Torrent',
			'application/javascript'        : 'JS',
			'application/rtf'               : 'RTF',
			'application/rtfd'              : 'RTF',
			'application/x-font-ttf'        : 'TTF',
			'application/x-font-otf'        : 'OTF',
			'application/x-rpm'             : 'RPM',
			'application/x-web-config'      : 'TextPlain',
			'application/xhtml+xml'         : 'HTML',
			'application/docbook+xml'       : 'DOCBOOK',
			'application/x-awk'             : 'AWK',
			'application/x-gzip'            : 'GZIP',
			'application/x-bzip2'           : 'BZIP',
			'application/x-xz'              : 'XZ',
			'application/zip'               : 'ZIP',
			'application/x-zip'               : 'ZIP',
			'application/x-rar'             : 'RAR',
			'application/x-tar'             : 'TAR',
			'application/x-7z-compressed'   : '7z',
			'application/x-jar'             : 'JAR',
			'text/plain'                    : 'TextPlain',
			'text/x-php'                    : 'PHP',
			'text/html'                     : 'HTML',
			'text/javascript'               : 'JS',
			'text/css'                      : 'CSS',
			'text/rtf'                      : 'RTF',
			'text/rtfd'                     : 'RTF',
			'text/x-c'                      : 'C',
			'text/x-csrc'                   : 'C',
			'text/x-chdr'                   : 'CHeader',
			'text/x-c++'                    : 'CPP',
			'text/x-c++src'                 : 'CPP',
			'text/x-c++hdr'                 : 'CPPHeader',
			'text/x-shellscript'            : 'Shell',
			'application/x-csh'             : 'Shell',
			'text/x-python'                 : 'Python',
			'text/x-java'                   : 'Java',
			'text/x-java-source'            : 'Java',
			'text/x-ruby'                   : 'Ruby',
			'text/x-perl'                   : 'Perl',
			'text/x-sql'                    : 'SQL',
			'text/xml'                      : 'XML',
			'text/x-comma-separated-values' : 'CSV',
			'text/x-markdown'               : 'Markdown',
			'image/x-ms-bmp'                : 'BMP',
			'image/jpeg'                    : 'JPEG',
			'image/gif'                     : 'GIF',
			'image/png'                     : 'PNG',
			'image/tiff'                    : 'TIFF',
			'image/x-targa'                 : 'TGA',
			'image/vnd.adobe.photoshop'     : 'PSD',
			'image/xbm'                     : 'XBITMAP',
			'image/pxm'                     : 'PXM',
			'audio/mpeg'                    : 'AudioMPEG',
			'audio/midi'                    : 'AudioMIDI',
			'audio/ogg'                     : 'AudioOGG',
			'audio/mp4'                     : 'AudioMPEG4',
			'audio/x-m4a'                   : 'AudioMPEG4',
			'audio/wav'                     : 'AudioWAV',
			'audio/x-mp3-playlist'          : 'AudioPlaylist',
			'video/x-dv'                    : 'VideoDV',
			'video/mp4'                     : 'VideoMPEG4',
			'video/mpeg'                    : 'VideoMPEG',
			'video/x-msvideo'               : 'VideoAVI',
			'video/quicktime'               : 'VideoMOV',
			'video/x-ms-wmv'                : 'VideoWM',
			'video/x-flv'                   : 'VideoFlash',
			'video/x-matroska'              : 'VideoMKV',
			'video/ogg'                     : 'VideoOGG'
		},
	
	/**
	 * File mimetype to file extention mapping
	 * 
	 * @type  Object
	 * @see   elFinder.mimetypes.js
	 */
	mimeTypes : {},
	
	/**
	 * Ajax request data validation rules
	 * 
	 * @type  Object
	 */
	rules : {
		defaults : function(data) {
			if (!data
			|| (data.added && !Array.isArray(data.added))
			||  (data.removed && !Array.isArray(data.removed))
			||  (data.changed && !Array.isArray(data.changed))) {
				return false;
			}
			return true;
		},
		open    : function(data) { return data && data.cwd && data.files && jQuery.isPlainObject(data.cwd) && Array.isArray(data.files); },
		tree    : function(data) { return data && data.tree && Array.isArray(data.tree); },
		parents : function(data) { return data && data.tree && Array.isArray(data.tree); },
		tmb     : function(data) { return data && data.images && (jQuery.isPlainObject(data.images) || Array.isArray(data.images)); },
		upload  : function(data) { return data && (jQuery.isPlainObject(data.added) || Array.isArray(data.added));},
		search  : function(data) { return data && data.files && Array.isArray(data.files); }
	},
	
	/**
	 * Commands costructors
	 *
	 * @type Object
	 */
	commands : {},
	
	/**
	 * Commands to add the item (space delimited)
	 * 
	 * @type String
	 */
	cmdsToAdd : 'archive duplicate extract mkdir mkfile paste rm upload',
	
	parseUploadData : function(text) {
		var self = this,
			data;
		
		if (!jQuery.trim(text)) {
			return {error : ['errResponse', 'errDataEmpty']};
		}
		
		try {
			data = JSON.parse(text);
		} catch (e) {
			return {error : ['errResponse', 'errDataNotJSON']};
		}
		
		data = self.normalize(data);
		if (!self.validResponse('upload', data)) {
			return {error : (data.norError || ['errResponse'])};
		}
		data.removed = jQuery.merge((data.removed || []), jQuery.map(data.added || [], function(f) { return self.file(f.hash)? f.hash : null; }));
		return data;
		
	},
	
	iframeCnt : 0,
	
	uploads : {
		// xhr muiti uploading flag
		xhrUploading: false,
		
		// Timer of request fail to sync
		failSyncTm: null,
		
		// current chunkfail requesting chunk
		chunkfailReq: {},
		
		// check file/dir exists
		checkExists: function(files, target, fm, isDir) {
			var dfrd = jQuery.Deferred(),
				names, renames = [], hashes = {}, chkFiles = [],
				cancel = function() {
					var i = files.length;
					while (--i > -1) {
						files[i]._remove = true;
					}
				},
				resolve = function() {
					dfrd.resolve(renames, hashes);
				},
				check = function() {
					var existed = [], exists = [], i, c,
						pathStr = target !== fm.cwd().hash? fm.path(target, true) + fm.option('separator', target) : '',
						confirm = function(ndx) {
							var last = ndx == exists.length-1,
								opts = {
									cssClass : 'elfinder-confirm-upload',
									title  : fm.i18n('cmdupload'),
									text   : ['errExists', pathStr + exists[ndx].name, 'confirmRepl'], 
									all    : !last,
									accept : {
										label    : 'btnYes',
										callback : function(all) {
											!last && !all
												? confirm(++ndx)
												: resolve();
										}
									},
									reject : {
										label    : 'btnNo',
										callback : function(all) {
											var i;
			
											if (all) {
												i = exists.length;
												while (ndx < i--) {
													files[exists[i].i]._remove = true;
												}
											} else {
												files[exists[ndx].i]._remove = true;
											}
			
											!last && !all
												? confirm(++ndx)
												: resolve();
										}
									},
									cancel : {
										label    : 'btnCancel',
										callback : function() {
											cancel();
											resolve();
										}
									},
									buttons : [
										{
											label : 'btnBackup',
											cssClass : 'elfinder-confirm-btn-backup',
											callback : function(all) {
												var i;
												if (all) {
													i = exists.length;
													while (ndx < i--) {
														renames.push(exists[i].name);
													}
												} else {
													renames.push(exists[ndx].name);
												}
												!last && !all
													? confirm(++ndx)
													: resolve();
											}
										}
									]
								};
							
							if (!isDir) {
								opts.buttons.push({
									label : 'btnRename' + (last? '' : 'All'),
									cssClass : 'elfinder-confirm-btn-rename',
									callback : function() {
										renames = null;
										resolve();
									}
								});
							}
							if (fm.iframeCnt > 0) {
								delete opts.reject;
							}
							fm.confirm(opts);
						};
					
					if (! fm.file(target).read) {
						// for dropbox type
						resolve();
						return;
					}
					
					names = jQuery.map(files, function(file, i) { return file.name && (!fm.UA.iOS || file.name !== 'image.jpg')? {i: i, name: file.name} : null ;});
					
					fm.request({
						data : {cmd : 'ls', target : target, intersect : jQuery.map(names, function(item) { return item.name;})},
						notify : {type : 'preupload', cnt : 1, hideCnt : true},
						preventDefault : true
					})
					.done(function(data) {
						var existedArr, cwdItems;
						if (data) {
							if (data.error) {
								cancel();
							} else {
								if (fm.options.overwriteUploadConfirm && fm.option('uploadOverwrite', target)) {
									if (data.list) {
										if (Array.isArray(data.list)) {
											existed = data.list || [];
										} else {
											existedArr = [];
											existed = jQuery.map(data.list, function(n) {
												if (typeof n === 'string') {
													return n;
												} else {
													// support to >=2.1.11 plugin Normalizer, Sanitizer
													existedArr = existedArr.concat(n);
													return false;
												}
											});
											if (existedArr.length) {
												existed = existed.concat(existedArr);
											}
											hashes = data.list;
										}
										exists = jQuery.grep(names, function(name){
											return jQuery.inArray(name.name, existed) !== -1 ? true : false ;
										});
										if (exists.length && existed.length && target == fm.cwd().hash) {
											cwdItems = jQuery.map(fm.files(target), function(file) { return file.name; } );
											if (jQuery.grep(existed, function(n) { 
												return jQuery.inArray(n, cwdItems) === -1? true : false;
											}).length){
												fm.sync();
											}
										}
									}
								}
							}
						}
						if (exists.length > 0) {
							confirm(0);
						} else {
							resolve();
						}
					})
					.fail(function(error) {
						cancel();
						resolve();
						error && fm.error(error);
					});
				};
			if (fm.api >= 2.1 && typeof files[0] == 'object') {
				check();
			} else {
				resolve();
			}
			return dfrd;
		},
		
		// check droped contents
		checkFile : function(data, fm, target) {
			if (!!data.checked || data.type == 'files') {
				return data.files;
			} else if (data.type == 'data') {
				var dfrd = jQuery.Deferred(),
				scanDfd = jQuery.Deferred(),
				files = [],
				paths = [],
				dirctorys = [],
				processing = 0,
				items,
				mkdirs = [],
				cancel = false,
				toArray = function(list) {
					return Array.prototype.slice.call(list || [], 0);
				},
				doScan = function(items) {
					var entry, readEntries,
						excludes = fm.options.folderUploadExclude[fm.OS] || null,
						length = items.length,
						check = function() {
							if (--processing < 1 && scanDfd.state() === 'pending') {
								scanDfd.resolve();
							}
						},
						pushItem = function(file) {
							if (! excludes || ! file.name.match(excludes)) {
								paths.push(entry.fullPath || '');
								files.push(file);
							}
							check();
						},
						readEntries = function(dirReader) {
							var entries = [],
								read = function() {
									dirReader.readEntries(function(results) {
										if (cancel || !results.length) {
											for (var i = 0; i < entries.length; i++) {
												if (cancel) {
													scanDfd.reject();
													break;
												}
												doScan([entries[i]]);
											}
											check();
										} else {
											entries = entries.concat(toArray(results));
											read();
										}
									}, check);
								};
							read();
						};
					
					processing++;
					for (var i = 0; i < length; i++) {
						if (cancel) {
							scanDfd.reject();
							break;
						}
						entry = items[i];
						if (entry) {
							if (entry.isFile) {
								processing++;
								entry.file(pushItem, check);
							} else if (entry.isDirectory) {
								if (fm.api >= 2.1) {
									processing++;
									mkdirs.push(entry.fullPath);
									readEntries(entry.createReader()); // Start reading dirs.
								}
							}
						}
					}
					check();
					return scanDfd;
				}, hasDirs;
				
				items = jQuery.map(data.files.items, function(item){
					return item.getAsEntry? item.getAsEntry() : item.webkitGetAsEntry();
				});
				jQuery.each(items, function(i, item) {
					if (item.isDirectory) {
						hasDirs = true;
						return false;
					}
				});
				if (items.length > 0) {
					fm.uploads.checkExists(items, target, fm, hasDirs).done(function(renames, hashes){
						var dfds = [];
						if (fm.options.overwriteUploadConfirm && fm.option('uploadOverwrite', target)) {
							if (renames === null) {
								data.overwrite = 0;
								renames = [];
							}
							items = jQuery.grep(items, function(item){
								var i, bak, hash, dfd, hi;
								if (item.isDirectory && renames.length) {
									i = jQuery.inArray(item.name, renames);
									if (i !== -1) {
										renames.splice(i, 1);
										bak = fm.uniqueName(item.name + fm.options.backupSuffix , null, '');
										jQuery.each(hashes, function(h, name) {
											if (item.name == name) {
												hash = h;
												return false;
											}
										});
										if (! hash) {
											hash = fm.fileByName(item.name, target).hash;
										}
										fm.lockfiles({files : [hash]});
										dfd = fm.request({
											data   : {cmd : 'rename', target : hash, name : bak},
											notify : {type : 'rename', cnt : 1}
										})
										.fail(function() {
											item._remove = true;
											fm.sync();
										})
										.always(function() {
											fm.unlockfiles({files : [hash]});
										});
										dfds.push(dfd);
									}
								}
								return !item._remove? true : false;
							});
						}
						jQuery.when.apply($, dfds).done(function(){
							var notifyto, msg,
								id = +new Date();
							
							if (items.length > 0) {
								msg = fm.escape(items[0].name);
								if (items.length > 1) {
									msg += ' ... ' + items.length + fm.i18n('items');
								}
								notifyto = setTimeout(function() {
									fm.notify({
										type : 'readdir',
										id : id,
										cnt : 1,
										hideCnt: true,
										msg : fm.i18n('ntfreaddir') + ' (' + msg + ')',
										cancel: function() {
											cancel = true;
										}
									});
								}, fm.options.notifyDelay);
								doScan(items).done(function() {
									notifyto && clearTimeout(notifyto);
									fm.notify({type : 'readdir', id: id, cnt : -1});
									if (cancel) {
										dfrd.reject();
									} else {
										dfrd.resolve([files, paths, renames, hashes, mkdirs]);
									}
								}).fail(function() {
									dfrd.reject();
								});
							} else {
								dfrd.reject();
							}
						});
					});
					return dfrd.promise();
				} else {
					return dfrd.reject();
				}
			} else {
				var ret = [];
				var check = [];
				var str = data.files[0];
				if (data.type == 'html') {
					var tmp = jQuery("<html></html>").append(jQuery.parseHTML(str.replace(/ src=/ig, ' _elfsrc='))),
						atag;
					jQuery('img[_elfsrc]', tmp).each(function(){
						var url, purl,
						self = jQuery(this),
						pa = self.closest('a');
						if (pa && pa.attr('href') && pa.attr('href').match(/\.(?:jpe?g|gif|bmp|png)/i)) {
							purl = pa.attr('href');
						}
						url = self.attr('_elfsrc');
						if (url) {
							if (purl) {
								jQuery.inArray(purl, ret) == -1 && ret.push(purl);
								jQuery.inArray(url, check) == -1 &&  check.push(url);
							} else {
								jQuery.inArray(url, ret) == -1 && ret.push(url);
							}
						}
						// Probably it's clipboard data
						if (ret.length === 1 && ret[0].match(/^data:image\/png/)) {
							data.clipdata = true;
						}
					});
					atag = jQuery('a[href]', tmp);
					atag.each(function(){
						var text, loc,
							parseUrl = function(url) {
								var a = document.createElement('a');
								a.href = url;
								return a;
							};
						if (text = jQuery(this).text()) {
							loc = parseUrl(jQuery(this).attr('href'));
							if (loc.href && loc.href.match(/^(?:ht|f)tp/i) && (atag.length === 1 || ! loc.pathname.match(/(?:\.html?|\/[^\/.]*)$/i) || jQuery.trim(text).match(/\.[a-z0-9-]{1,10}$/i))) {
								if (jQuery.inArray(loc.href, ret) == -1 && jQuery.inArray(loc.href, check) == -1) ret.push(loc.href);
							}
						}
					});
				} else {
					var regex, m, url;
					regex = /((?:ht|f)tps?:\/\/[-_.!~*\'()a-z0-9;/?:\@&=+\$,%#\*\[\]]+)/ig;
					while (m = regex.exec(str)) {
						url = m[1].replace(/&amp;/g, '&');
						if (jQuery.inArray(url, ret) == -1) ret.push(url);
					}
				}
				return ret;
			}
		},

		// upload transport using XMLHttpRequest
		xhr : function(data, fm) { 
			var self   = fm ? fm : this,
				node        = self.getUI(),
				xhr         = new XMLHttpRequest(),
				notifyto    = null,
				notifyto1   = null,
				notifyto2   = null,
				dataChecked = data.checked,
				isDataType  = (data.isDataType || data.type == 'data'),
				target      = (data.target || self.cwd().hash),
				dropEvt     = (data.dropEvt || null),
				extraData   = data.extraData || null,
				chunkEnable = (self.option('uploadMaxConn', target) != -1),
				multiMax    = Math.min(5, Math.max(1, self.option('uploadMaxConn', target))),
				retryWait   = 10000, // 10 sec
				retryMax    = 30, // 10 sec * 30 = 300 secs (Max 5 mins)
				retry       = 0,
				getFile     = function(files) {
					var dfd = jQuery.Deferred(),
						file;
					if (files.promise) {
						files.always(function(f) {
							dfd.resolve(Array.isArray(f) && f.length? (isDataType? f[0][0] : f[0]) : {});
						});
					} else {
						dfd.resolve(files.length? (isDataType? files[0][0] : files[0]) : {});
					}
					return dfd;
				},
				dfrd   = jQuery.Deferred()
					.fail(function(err) {
						var error = self.parseError(err),
							userAbort;
						if (error === 'userabort') {
							userAbort = true;
							error = void 0;
						}
						if (files && (self.uploads.xhrUploading || userAbort)) {
							// send request om fail
							getFile(files).done(function(file) {
								if (!userAbort) {
									triggerError(error, file);
								}
								if (! file._cid) {
									// send sync request
									self.uploads.failSyncTm && clearTimeout(self.uploads.failSyncTm);
									self.uploads.failSyncTm = setTimeout(function() {
										self.sync(target);
									}, 1000);
								} else if (! self.uploads.chunkfailReq[file._cid]) {
									// send chunkfail request
									self.uploads.chunkfailReq[file._cid] = true;
									setTimeout(function() {
										fm.request({
											data : {
												cmd: 'upload',
												target: target,
												chunk: file._chunk,
												cid: file._cid,
												upload: ['chunkfail'],
												mimes: 'chunkfail'
											},
											options : {
												type: 'post',
												url: self.uploadURL
											},
											preventDefault: true
										}).always(function() {
											delete self.uploads.chunkfailReq[file._chunk];
										});
									}, 1000);
								}
							});
						} else {
							triggerError(error);
						}
						!userAbort && self.sync();
						self.uploads.xhrUploading = false;
						files = null;
					})
					.done(function(data) {
						self.uploads.xhrUploading = false;
						files = null;
						if (data) {
							self.currentReqCmd = 'upload';
							data.warning && triggerError(data.warning);
							self.updateCache(data);
							data.removed && data.removed.length && self.remove(data);
							data.added   && data.added.length   && self.add(data);
							data.changed && data.changed.length && self.change(data);
							self.trigger('upload', data, false);
							self.trigger('uploaddone');
							if (data.toasts && Array.isArray(data.toasts)) {
								jQuery.each(data.toasts, function() {
									this.msg && self.toast(this);
								});
							}
							data.sync && self.sync();
							if (data.debug) {
								self.responseDebug(data);
								fm.debug('backend-debug', data);
							}
						}
					})
					.always(function() {
						self.abortXHR(xhr);
						// unregist fnAbort function
						node.off('uploadabort', fnAbort);
						jQuery(window).off('unload', fnAbort);
						notifyto && clearTimeout(notifyto);
						notifyto1 && clearTimeout(notifyto1);
						notifyto2 && clearTimeout(notifyto2);
						dataChecked && !data.multiupload && checkNotify() && self.notify({type : 'upload', cnt : -cnt, progress : 0, size : 0});
						notifyto1 && uploadedNtf && self.notify({type : 'chunkmerge', cnt : -cnt});
						chunkMerge && notifyElm.children('.elfinder-notify-chunkmerge').length && self.notify({type : 'chunkmerge', cnt : -1});
					}),
				formData    = new FormData(),
				files       = data.input ? data.input.files : self.uploads.checkFile(data, self, target), 
				cnt         = data.checked? (isDataType? files[0].length : files.length) : files.length,
				isChunked   = false,
				loaded      = 0,
				prev        = 0,
				filesize    = 0,
				notify      = false,
				notifyElm   = self.ui.notify,
				cancelBtn   = true,
				uploadedNtf = false,
				abort       = false,
				checkNotify = function() {
					if (!notify && (ntfUpload = notifyElm.children('.elfinder-notify-upload')).length) {
						notify = true;
					}
					return notify;
				},
				fnAbort     = function(e, error) {
					abort = true;
					self.abortXHR(xhr, { quiet: true, abort: true });
					dfrd.reject(error);
					if (checkNotify()) {
						self.notify({type : 'upload', cnt : ntfUpload.data('cnt') * -1, progress : 0, size : 0});
					}
				},
				cancelToggle = function(show, hasChunk) {
					ntfUpload.children('.elfinder-notify-cancel')[show? 'show':'hide']();
					cancelBtn = show;
				},
				startNotify = function(size) {
					if (!size) size = filesize;
					return setTimeout(function() {
						notify = true;
						self.notify({type : 'upload', cnt : cnt, progress : loaded - prev, size : size,
							cancel: function() {
								node.trigger('uploadabort', 'userabort');
							}
						});
						ntfUpload = notifyElm.children('.elfinder-notify-upload');
						prev = loaded;
						if (data.multiupload) {
							cancelBtn && cancelToggle(true);
						} else {
							cancelToggle(cancelBtn && loaded < size);
						}
					}, self.options.notifyDelay);
				},
				doRetry = function() {
					if (retry++ <= retryMax) {
						if (checkNotify() && prev) {
							self.notify({type : 'upload', cnt : 0, progress : 0, size : prev});
						}
						self.abortXHR(xhr, { quiet: true });
						prev = loaded = 0;
						setTimeout(function() {
							var reqId;
							if (! abort) {
								xhr.open('POST', self.uploadURL, true);
								if (self.api >= 2.1029) {
									reqId = (+ new Date()).toString(16) + Math.floor(1000 * Math.random()).toString(16);
									(typeof formData['delete'] === 'function') && formData['delete']('reqid');
									formData.append('reqid', reqId);
									xhr._requestId = reqId;
								}
								xhr.send(formData);
							}
						}, retryWait);
					} else {
						node.trigger('uploadabort', ['errAbort', 'errTimeout']);
					}
				},
				progress = function() {
					var node;
					if (notify) {
						dfrd.notifyWith(ntfUpload, [{
							cnt: ntfUpload.data('cnt'),
							progress: ntfUpload.data('progress'),
							total: ntfUpload.data('total')
						}]);
					}
				},
				triggerError = function(err, file, unite) {
					err && self.trigger('xhruploadfail', { error: err, file: file });
					if (unite) {
						if (err) {
							if (errCnt < self.options.maxErrorDialogs) {
								if (Array.isArray(err)) {
									errors = errors.concat(err);
								} else {
									errors.push(err);
								}
							}
							errCnt++;
						}
					} else {
						if (err) {
							self.error(err);
						} else {
							if (errors.length) {
								if (errCnt >= self.options.maxErrorDialogs) {
									errors = errors.concat('moreErrors', errCnt - self.options.maxErrorDialogs);
								}
								self.error(errors);
							}
							errors = [];
							errCnt = 0;
						}
					}
				},
				errors = [],
				errCnt = 0,
				renames = (data.renames || null),
				hashes = (data.hashes || null),
				chunkMerge = false,
				ntfUpload = jQuery();
			
			// regist fnAbort function
			node.one('uploadabort', fnAbort);
			jQuery(window).one('unload.' + fm.namespace, fnAbort);
			
			!chunkMerge && (prev = loaded);
			
			if (!isDataType && !cnt) {
				return dfrd.reject(['errUploadNoFiles']);
			}
			
			xhr.addEventListener('error', function() {
				if (xhr.status == 0) {
					if (abort) {
						dfrd.reject();
					} else {
						// ff bug while send zero sized file
						// for safari - send directory
						if (!isDataType && data.files && jQuery.grep(data.files, function(f){return ! f.type && f.size === (self.UA.Safari? 1802 : 0)? true : false;}).length) {
							dfrd.reject(['errAbort', 'errFolderUpload']);
						} else if (data.input && jQuery.grep(data.input.files, function(f){return ! f.type && f.size === (self.UA.Safari? 1802 : 0)? true : false;}).length) {
							dfrd.reject(['errUploadNoFiles']);
						} else {
							doRetry();
						}
					}
				} else {
					node.trigger('uploadabort', 'errConnect');
				}
			}, false);
			
			xhr.addEventListener('load', function(e) {
				var status = xhr.status, res, curr = 0, error = '', errData, errObj;
				
				self.setCustomHeaderByXhr(xhr);

				if (status >= 400) {
					if (status > 500) {
						error = 'errResponse';
					} else {
						error = ['errResponse', 'errServerError'];
					}
				} else {
					if (!xhr.responseText) {
						error = ['errResponse', 'errDataEmpty'];
					}
				}
				
				if (error) {
					node.trigger('uploadabort');
					getFile(files || {}).done(function(file) {
						return dfrd.reject(file._cid? null : error);
					});
				}
				
				loaded = filesize;
				
				if (checkNotify() && (curr = loaded - prev)) {
					self.notify({type : 'upload', cnt : 0, progress : curr, size : 0});
					progress();
				}

				res = self.parseUploadData(xhr.responseText);
				
				// chunked upload commit
				if (res._chunkmerged) {
					formData = new FormData();
					var _file = [{_chunkmerged: res._chunkmerged, _name: res._name, _mtime: res._mtime}];
					chunkMerge = true;
					node.off('uploadabort', fnAbort);
					notifyto2 = setTimeout(function() {
						self.notify({type : 'chunkmerge', cnt : 1});
					}, self.options.notifyDelay);
					isDataType? send(_file, files[1]) : send(_file);
					return;
				}
				
				res._multiupload = data.multiupload? true : false;
				if (res.error) {
					errData = {
						cmd: 'upload',
						err: res,
						xhr: xhr,
						rc: xhr.status
					};
					self.trigger('uploadfail', res);
					// trigger "requestError" event
					self.trigger('requestError', errData);
					if (errData._getEvent && errData._getEvent().isDefaultPrevented()) {
						res.error = '';
					}
					if (res._chunkfailure || res._multiupload) {
						abort = true;
						self.uploads.xhrUploading = false;
						notifyto && clearTimeout(notifyto);
						if (ntfUpload.length) {
							self.notify({type : 'upload', cnt : -cnt, progress : 0, size : 0});
							dfrd.reject(res);
						} else {
							// for multi connection
							dfrd.reject();
						}
					} else {
						dfrd.reject(res);
					}
				} else {
					dfrd.resolve(res);
				}
			}, false);
			
			xhr.upload.addEventListener('loadstart', function(e) {
				if (!chunkMerge && e.lengthComputable) {
					loaded = e.loaded;
					retry && (loaded = 0);
					filesize = e.total;
					if (!loaded) {
						loaded = parseInt(filesize * 0.05);
					}
					if (checkNotify()) {
						self.notify({type : 'upload', cnt : 0, progress : loaded - prev, size : data.multiupload? 0 : filesize});
						prev = loaded;
						progress();
					}
				}
			}, false);
			
			xhr.upload.addEventListener('progress', function(e) {
				var curr;

				if (e.lengthComputable && !chunkMerge && xhr.readyState < 2) {
					
					loaded = e.loaded;

					// to avoid strange bug in safari (not in chrome) with drag&drop.
					// bug: macos finder opened in any folder,
					// reset safari cache (option+command+e), reload elfinder page,
					// drop file from finder
					// on first attempt request starts (progress callback called ones) but never ends.
					// any next drop - successfull.
					if (!data.checked && loaded > 0 && !notifyto) {
						notifyto = startNotify(xhr._totalSize - loaded);
					}
					
					if (!filesize) {
						filesize = e.total;
						if (!loaded) {
							loaded = parseInt(filesize * 0.05);
						}
					}
					
					curr = loaded - prev;
					if (checkNotify() && (curr/e.total) >= 0.05) {
						self.notify({type : 'upload', cnt : 0, progress : curr, size : 0});
						prev = loaded;
						progress();
					}
					
					if (!uploadedNtf && loaded >= filesize && !isChunked) {
						// Use "chunkmerge" for "server-in-process" notification
						uploadedNtf = true;
						notifyto1 = setTimeout(function() {
							self.notify({type : 'chunkmerge', cnt : cnt});
						}, self.options.notifyDelay);
					}

					if (cancelBtn && ! data.multiupload && loaded >= filesize) {
						checkNotify() && cancelToggle(false);
					}
				}
			}, false);
			
			var send = function(files, paths){
				var size = 0,
				fcnt = 1,
				sfiles = [],
				c = 0,
				total = cnt,
				maxFileSize,
				totalSize = 0,
				chunked = [],
				chunkID = new Date().getTime().toString().substr(-9), // for take care of the 32bit backend system
				BYTES_PER_CHUNK = Math.min((fm.uplMaxSize? fm.uplMaxSize : 2097152) - 8190, fm.options.uploadMaxChunkSize), // uplMaxSize margin 8kb or options.uploadMaxChunkSize
				blobSlice = chunkEnable? false : '',
				blobSize, blobMtime, blobName, i, start, end, chunks, blob, chunk, added, done, last, failChunk,
				multi = function(files, num){
					var sfiles = [], cid, sfilesLen = 0, cancelChk, hasChunk;
					if (!abort) {
						while(files.length && sfiles.length < num) {
							sfiles.push(files.shift());
						}
						sfilesLen = sfiles.length;
						if (sfilesLen) {
							cancelChk = sfilesLen;
							for (var i=0; i < sfilesLen; i++) {
								if (abort) {
									break;
								}
								cid = isDataType? (sfiles[i][0][0]._cid || null) : (sfiles[i][0]._cid || null);
								hasChunk = (hasChunk || cid)? true : false;
								if (!!failChunk[cid]) {
									last--;
									continue;
								}
								fm.exec('upload', {
									type: data.type,
									isDataType: isDataType,
									files: sfiles[i],
									checked: true,
									target: target,
									dropEvt: dropEvt,
									renames: renames,
									hashes: hashes,
									multiupload: true,
									overwrite: data.overwrite === 0? 0 : void 0,
									clipdata: data.clipdata
								}, void 0, target)
								.fail(function(error) {
									if (error && error === 'No such command') {
										abort = true;
										fm.error(['errUpload', 'errPerm']);
									}
									if (cid) {	
										failChunk[cid] = true;
									}
								})
								.always(function(e) {
									if (e && e.added) added = jQuery.merge(added, e.added);
									if (last <= ++done) {
										fm.trigger('multiupload', {added: added});
										notifyto && clearTimeout(notifyto);
										if (checkNotify()) {
											self.notify({type : 'upload', cnt : -cnt, progress : 0, size : 0});
										}
									}
									if (files.length) {
										multi(files, 1); // Next one
									} else {
										if (--cancelChk <= 1) {
											if (cancelBtn) {
												cancelToggle(false, hasChunk);
											}
										}
										dfrd.resolve();
									}
								});
							}
						}
					}
					if (sfiles.length < 1 || abort) {
						if (abort) {
							notifyto && clearTimeout(notifyto);
							if (cid) {
								failChunk[cid] = true;
							}
							dfrd.reject();
						} else {
							dfrd.resolve();
							self.uploads.xhrUploading = false;
						}
					}
				},
				check = function(){
					if (!self.uploads.xhrUploading) {
						self.uploads.xhrUploading = true;
						multi(sfiles, multiMax); // Max connection: 3
					} else {
						setTimeout(check, 100);
					}
				},
				reqId, err;

				if (! dataChecked && (isDataType || data.type == 'files')) {
					if (! (maxFileSize = fm.option('uploadMaxSize', target))) {
						maxFileSize = 0;
					}
					for (i=0; i < files.length; i++) {
						try {
							blob = files[i];
							blobSize = blob.size;
							if (blobSlice === false) {
								blobSlice = '';
								if (self.api >= 2.1) {
									if ('slice' in blob) {
										blobSlice = 'slice';
									} else if ('mozSlice' in blob) {
										blobSlice = 'mozSlice';
									} else if ('webkitSlice' in blob) {
										blobSlice = 'webkitSlice';
									}
								}
							}
						} catch(e) {
							cnt--;
							total--;
							continue;
						}
						
						// file size check
						if ((maxFileSize && blobSize > maxFileSize) || (!blobSlice && fm.uplMaxSize && blobSize > fm.uplMaxSize)) {
							triggerError(['errUploadFile', blob.name, 'errUploadFileSize'], blob, true);
							cnt--;
							total--;
							continue;
						}
						
						// file mime check
						if (blob.type && ! self.uploadMimeCheck(blob.type, target)) {
							triggerError(['errUploadFile', blob.name, 'errUploadMime', '(' + blob.type + ')'], blob, true);
							cnt--;
							total--;
							continue;
						}
						
						if (blobSlice && blobSize > BYTES_PER_CHUNK) {
							start = 0;
							end = BYTES_PER_CHUNK;
							chunks = -1;
							total = Math.floor((blobSize - 1) / BYTES_PER_CHUNK);
							blobMtime = blob.lastModified? Math.round(blob.lastModified/1000) : 0;
							blobName = data.clipdata? fm.date(fm.nonameDateFormat) + '.png' : blob.name;

							totalSize += blobSize;
							chunked[chunkID] = 0;
							while(start < blobSize) {
								chunk = blob[blobSlice](start, end);
								chunk._chunk = blobName + '.' + (++chunks) + '_' + total + '.part';
								chunk._cid   = chunkID;
								chunk._range = start + ',' + chunk.size + ',' + blobSize;
								chunk._mtime = blobMtime;
								chunked[chunkID]++;
								
								if (size) {
									c++;
								}
								if (typeof sfiles[c] == 'undefined') {
									sfiles[c] = [];
									if (isDataType) {
										sfiles[c][0] = [];
										sfiles[c][1] = [];
									}
								}
								size = BYTES_PER_CHUNK;
								fcnt = 1;
								if (isDataType) {
									sfiles[c][0].push(chunk);
									sfiles[c][1].push(paths[i]);
								} else {
									sfiles[c].push(chunk);
								}

								start = end;
								end = start + BYTES_PER_CHUNK;
							}
							if (chunk == null) {
								triggerError(['errUploadFile', blob.name, 'errUploadFileSize'], blob, true);
								cnt--;
								total--;
							} else {
								total += chunks;
								size = 0;
								fcnt = 1;
								c++;
							}
							continue;
						}
						if ((fm.uplMaxSize && size + blobSize > fm.uplMaxSize) || fcnt > fm.uplMaxFile) {
							size = 0;
							fcnt = 1;
							c++;
						}
						if (typeof sfiles[c] == 'undefined') {
							sfiles[c] = [];
							if (isDataType) {
								sfiles[c][0] = [];
								sfiles[c][1] = [];
							}
						}
						if (isDataType) {
							sfiles[c][0].push(blob);
							sfiles[c][1].push(paths[i]);
						} else {
							sfiles[c].push(blob);
						}
						size += blobSize;
						totalSize += blobSize;
						fcnt++;
					}
					
					if (errors.length) {
						triggerError();
					}

					if (sfiles.length == 0) {
						// no data
						data.checked = true;
						return false;
					}
					
					if (sfiles.length > 1) {
						// multi upload
						notifyto = startNotify(totalSize);
						added = [];
						done = 0;
						last = sfiles.length;
						failChunk = [];
						check();
						return true;
					}
					
					// single upload
					if (isDataType) {
						files = sfiles[0][0];
						paths = sfiles[0][1];
					} else {
						files = sfiles[0];
					}
				}
				
				if (!dataChecked) {
					if (!fm.UA.Safari || !data.files) {
						notifyto = startNotify(totalSize);
					} else {
						xhr._totalSize = totalSize;
					}
				}
				
				dataChecked = true;
				
				if (! files.length) {
					dfrd.reject(['errUploadNoFiles']);
				}
				
				xhr.open('POST', self.uploadURL, true);
				
				// set request headers
				if (fm.customHeaders) {
					jQuery.each(fm.customHeaders, function(key) {
						xhr.setRequestHeader(key, this);
					});
				}
				
				// set xhrFields
				if (fm.xhrFields) {
					jQuery.each(fm.xhrFields, function(key) {
						if (key in xhr) {
							xhr[key] = this;
						}
					});
				}

				if (self.api >= 2.1029) {
					// request ID
					reqId = (+ new Date()).toString(16) + Math.floor(1000 * Math.random()).toString(16);
					formData.append('reqid', reqId);
					xhr._requestId = reqId;
				}
				formData.append('cmd', 'upload');
				formData.append(self.newAPI ? 'target' : 'current', target);
				if (renames && renames.length) {
					jQuery.each(renames, function(i, v) {
						formData.append('renames[]', v);
					});
					formData.append('suffix', fm.options.backupSuffix);
				}
				if (hashes) {
					jQuery.each(hashes, function(i, v) {
						formData.append('hashes['+ i +']', v);
					});
				}
				jQuery.each(self.customData, function(key, val) {
					formData.append(key, val);
				});
				jQuery.each(self.options.onlyMimes, function(i, mime) {
					formData.append('mimes[]', mime);
				});
				
				jQuery.each(files, function(i, file) {
					var name, relpath;
					if (file._chunkmerged) {
						formData.append('chunk', file._chunkmerged);
						formData.append('upload[]', file._name);
						formData.append('mtime[]', file._mtime);
						data.clipdata && formData.append('overwrite', 0);
						isChunked = true;
					} else {
						if (file._chunkfail) {
							formData.append('upload[]', 'chunkfail');
							formData.append('mimes', 'chunkfail');
						} else {
							if (data.clipdata) {
								if (!file._chunk) {
									data.overwrite = 0;
									name = fm.date(fm.nonameDateFormat) + '.png';
								}
							} else {
								if (file.name) {
									name = file.name;
									if (fm.UA.iOS) {
										if (name.match(/^image\.jpe?g$/i)) {
											data.overwrite = 0;
											name = fm.date(fm.nonameDateFormat) + '.jpg';
										} else if (name.match(/^capturedvideo\.mov$/i)) {
											data.overwrite = 0;
											name = fm.date(fm.nonameDateFormat) + '.mov';
										}
									}
									relpath = (file.webkitRelativePath || file.relativePath || file._relativePath || '').replace(/[^\/]+$/, '');
									name = relpath + name;
								}
							}
							name? formData.append('upload[]', file, name) : formData.append('upload[]', file);
						}
						if (file._chunk) {
							formData.append('chunk', file._chunk);
							formData.append('cid'  , file._cid);
							formData.append('range', file._range);
							formData.append('mtime[]', file._mtime);
							isChunked = true;
						} else {
							formData.append('mtime[]', file.lastModified? Math.round(file.lastModified/1000) : 0);
						}
					}
				});
				
				if (isDataType) {
					jQuery.each(paths, function(i, path) {
						formData.append('upload_path[]', path);
					});
				}
				
				if (data.overwrite === 0) {
					formData.append('overwrite', 0);
				}
				
				// send int value that which meta key was pressed when dropped  as `dropWith`
				if (dropEvt) {
					formData.append('dropWith', parseInt(
						(dropEvt.altKey  ? '1' : '0')+
						(dropEvt.ctrlKey ? '1' : '0')+
						(dropEvt.metaKey ? '1' : '0')+
						(dropEvt.shiftKey? '1' : '0'), 2));
				}
				
				// set extraData on current request
				if (extraData) {
					jQuery.each(extraData, function(key, val) {
						formData.append(key, val);
					});
				}

				xhr.send(formData);
				
				return true;
			};
			
			if (! isDataType) {
				if (files.length > 0) {
					if (! data.clipdata && renames == null) {
						var mkdirs = [],
							paths = [],
							excludes = fm.options.folderUploadExclude[fm.OS] || null;
						jQuery.each(files, function(i, file) {
							var relPath = file.webkitRelativePath || file.relativePath || '',
								idx, rootDir;
							if (! relPath) {
								return false;
							}
							if (excludes && file.name.match(excludes)) {
								file._remove = true;
								relPath = void(0);
							} else {
								// add '/' as prefix to make same to folder uploading with DnD, see #2607
								relPath = '/' + relPath.replace(/\/[^\/]*$/, '').replace(/^\//, '');
								if (relPath && jQuery.inArray(relPath, mkdirs) === -1) {
									mkdirs.push(relPath);
									// checking the root directory to supports <input type="file" webkitdirectory> see #2378
									idx = relPath.substr(1).indexOf('/');
									if (idx !== -1 && (rootDir = relPath.substr(0, idx + 1)) && jQuery.inArray(rootDir, mkdirs) === -1) {
										mkdirs.unshift(rootDir);
									}
								}
							}
							paths.push(relPath);
						});
						renames = [];
						hashes = {};
						if (mkdirs.length) {
							(function() {
								var checkDirs = jQuery.map(mkdirs, function(name) { return name.substr(1).indexOf('/') === -1 ? {name: name.substr(1)} : null;}),
									cancelDirs = [];
								fm.uploads.checkExists(checkDirs, target, fm, true).done(
									function(res, res2) {
										var dfds = [], dfd, bak, hash;
										if (fm.options.overwriteUploadConfirm && fm.option('uploadOverwrite', target)) {
											cancelDirs = jQuery.map(checkDirs, function(dir) { return dir._remove? dir.name : null ;} );
											checkDirs = jQuery.grep(checkDirs, function(dir) { return !dir._remove? true : false ;} );
										}
										if (cancelDirs.length) {
											jQuery.each(paths.concat(), function(i, path) {
												if (jQuery.inArray(path, cancelDirs) === 0) {
													files[i]._remove = true;
													paths[i] = void(0);
												}
											});
										}
										files = jQuery.grep(files, function(file) { return file._remove? false : true; });
										paths = jQuery.grep(paths, function(path) { return path === void 0 ? false : true; });
										if (checkDirs.length) {
											dfd = jQuery.Deferred();
											if (res.length) {
												jQuery.each(res, function(i, existName) {
													// backup
													bak = fm.uniqueName(existName + fm.options.backupSuffix , null, '');
													jQuery.each(res2, function(h, name) {
														if (res[0] == name) {
															hash = h;
															return false;
														}
													});
													if (! hash) {
														hash = fm.fileByName(res[0], target).hash;
													}
													fm.lockfiles({files : [hash]});
													dfds.push(
														fm.request({
															data   : {cmd : 'rename', target : hash, name : bak},
															notify : {type : 'rename', cnt : 1}
														})
														.fail(function(error) {
															dfrd.reject(error);
															fm.sync();
														})
														.always(function() {
															fm.unlockfiles({files : [hash]});
														})
													);
												});
											} else {
												dfds.push(null);
											}
											
											jQuery.when.apply($, dfds).done(function() {
												// ensure directories
												fm.request({
													data   : {cmd : 'mkdir', target : target, dirs : mkdirs},
													notify : {type : 'mkdir', cnt : mkdirs.length},
													preventFail: true
												})
												.fail(function(error) {
													error = error || ['errUnknown'];
													if (error[0] === 'errCmdParams') {
														multiMax = 1;
													} else {
														multiMax = 0;
														dfrd.reject(error);
													}
												})
												.done(function(data) {
													var rm = false;
													if (!data.hashes) {
														data.hashes = {};
													}
													paths = jQuery.map(paths.concat(), function(p, i) {
														if (p === '/') {
															return target;
														} else {
															if (data.hashes[p]) {
																return data.hashes[p];
															} else {
																rm = true;
																files[i]._remove = true;
																return null;
															}
														}
													});
													if (rm) {
														files = jQuery.grep(files, function(file) { return file._remove? false : true; });
													}
												})
												.always(function(data) {
													if (multiMax) {
														isDataType = true;
														if (! send(files, paths)) {
															dfrd.reject();
														}
													}
												});
											});
										} else {
											dfrd.reject();
										}
									}
								);
							})();
						} else {
							fm.uploads.checkExists(files, target, fm).done(
								function(res, res2){
									if (fm.options.overwriteUploadConfirm && fm.option('uploadOverwrite', target)) {
										hashes = res2;
										if (res === null) {
											data.overwrite = 0;
										} else {
											renames = res;
										}
										files = jQuery.grep(files, function(file){return !file._remove? true : false ;});
									}
									cnt = files.length;
									if (cnt > 0) {
										if (! send(files)) {
											dfrd.reject();
										}
									} else {
										dfrd.reject();
									}
								}
							);
						}
					} else {
						if (! send(files)) {
							dfrd.reject();
						}
					}
				} else {
					dfrd.reject();
				}
			} else {
				if (dataChecked) {
					send(files[0], files[1]);
				} else {
					files.done(function(result) { // result: [files, paths, renames, hashes, mkdirs]
						renames = [];
						cnt = result[0].length;
						if (cnt) {
							if (result[4] && result[4].length) {
								// ensure directories
								fm.request({
									data   : {cmd : 'mkdir', target : target, dirs : result[4]},
									notify : {type : 'mkdir', cnt : result[4].length},
									preventFail: true
								})
								.fail(function(error) {
									error = error || ['errUnknown'];
									if (error[0] === 'errCmdParams') {
										multiMax = 1;
									} else {
										multiMax = 0;
										dfrd.reject(error);
									}
								})
								.done(function(data) {
									var rm = false;
									if (!data.hashes) {
										data.hashes = {};
									}
									result[1] = jQuery.map(result[1], function(p, i) {
										result[0][i]._relativePath = p.replace(/^\//, '');
										p = p.replace(/\/[^\/]*$/, '');
										if (p === '') {
											return target;
										} else {
											if (data.hashes[p]) {
												return data.hashes[p];
											} else {
												rm = true;
												result[0][i]._remove = true;
												return null;
											}
										}
									});
									if (rm) {
										result[0] = jQuery.grep(result[0], function(file) { return file._remove? false : true; });
									}
								})
								.always(function(data) {
									if (multiMax) {
										renames = result[2];
										hashes = result[3];
										send(result[0], result[1]);
									}
								});
								return;
							} else {
								result[1] = jQuery.map(result[1], function() { return target; });
							}
							renames = result[2];
							hashes = result[3];
							send(result[0], result[1]);
						} else {
							dfrd.reject(['errUploadNoFiles']);
						}
					}).fail(function(){
						dfrd.reject();
					});
				}
			}

			return dfrd;
		},
		
		// upload transport using iframe
		iframe : function(data, fm) { 
			var self   = fm ? fm : this,
				input  = data.input? data.input : false,
				files  = !input ? self.uploads.checkFile(data, self) : false,
				dfrd   = jQuery.Deferred()
					.fail(function(error) {
						error && self.error(error);
					}),
				name = 'iframe-'+fm.namespace+(++self.iframeCnt),
				form = jQuery('<form action="'+self.uploadURL+'" method="post" enctype="multipart/form-data" encoding="multipart/form-data" target="'+name+'" style="display:none"><input type="hidden" name="cmd" value="upload" /></form>'),
				msie = this.UA.IE,
				// clear timeouts, close notification dialog, remove form/iframe
				onload = function() {
					abortto  && clearTimeout(abortto);
					notifyto && clearTimeout(notifyto);
					notify   && self.notify({type : 'upload', cnt : -cnt});
					
					setTimeout(function() {
						msie && jQuery('<iframe src="javascript:false;"></iframe>').appendTo(form);
						form.remove();
						iframe.remove();
					}, 100);
				},
				iframe = jQuery('<iframe src="'+(msie ? 'javascript:false;' : 'about:blank')+'" name="'+name+'" style="position:absolute;left:-1000px;top:-1000px" ></iframe>')
					.on('load', function() {
						iframe.off('load')
							.on('load', function() {
								onload();
								// data will be processed in callback response or window onmessage
								dfrd.resolve();
							});
							
							// notify dialog
							notifyto = setTimeout(function() {
								notify = true;
								self.notify({type : 'upload', cnt : cnt});
							}, self.options.notifyDelay);
							
							// emulate abort on timeout
							if (self.options.iframeTimeout > 0) {
								abortto = setTimeout(function() {
									onload();
									dfrd.reject(['errConnect', 'errTimeout']);
								}, self.options.iframeTimeout);
							}
							
							form.submit();
					}),
				target  = (data.target || self.cwd().hash),
				names   = [],
				dfds    = [],
				renames = [],
				hashes  = {},
				cnt, notify, notifyto, abortto;

			if (files && files.length) {
				jQuery.each(files, function(i, val) {
					form.append('<input type="hidden" name="upload[]" value="'+val+'"/>');
				});
				cnt = 1;
			} else if (input && jQuery(input).is(':file') && jQuery(input).val()) {
				if (fm.options.overwriteUploadConfirm && fm.option('uploadOverwrite', target)) {
					names = input.files? input.files : [{ name: jQuery(input).val().replace(/^(?:.+[\\\/])?([^\\\/]+)$/, '$1') }];
					//names = jQuery.map(names, function(file){return file.name? { name: file.name } : null ;});
					dfds.push(self.uploads.checkExists(names, target, self).done(
						function(res, res2){
							hashes = res2;
							if (res === null) {
								data.overwrite = 0;
							} else{
								renames = res;
								cnt = jQuery.grep(names, function(file){return !file._remove? true : false ;}).length;
								if (cnt != names.length) {
									cnt = 0;
								}
							}
						}
					));
				}
				cnt = input.files ? input.files.length : 1;
				form.append(input);
			} else {
				return dfrd.reject();
			}
			
			jQuery.when.apply($, dfds).done(function() {
				if (cnt < 1) {
					return dfrd.reject();
				}
				form.append('<input type="hidden" name="'+(self.newAPI ? 'target' : 'current')+'" value="'+target+'"/>')
					.append('<input type="hidden" name="html" value="1"/>')
					.append('<input type="hidden" name="node" value="'+self.id+'"/>')
					.append(jQuery(input).attr('name', 'upload[]'));
				
				if (renames.length > 0) {
					jQuery.each(renames, function(i, rename) {
						form.append('<input type="hidden" name="renames[]" value="'+self.escape(rename)+'"/>');
					});
					form.append('<input type="hidden" name="suffix" value="'+fm.options.backupSuffix+'"/>');
				}
				if (hashes) {
					jQuery.each(renames, function(i, v) {
						form.append('<input type="hidden" name="['+i+']" value="'+self.escape(v)+'"/>');
					});
				}
				
				if (data.overwrite === 0) {
					form.append('<input type="hidden" name="overwrite" value="0"/>');
				}
				
				jQuery.each(self.options.onlyMimes||[], function(i, mime) {
					form.append('<input type="hidden" name="mimes[]" value="'+self.escape(mime)+'"/>');
				});
				
				jQuery.each(self.customData, function(key, val) {
					form.append('<input type="hidden" name="'+key+'" value="'+self.escape(val)+'"/>');
				});
				
				form.appendTo('body');
				iframe.appendTo('body');
			});
			
			return dfrd;
		}
	},
	
	
	/**
	 * Bind callback to event(s) The callback is executed at most once per event.
	 * To bind to multiply events at once, separate events names by space
	 *
	 * @param  String    event name
	 * @param  Function  callback
	 * @param  Boolan    priority first
	 * @return elFinder
	 */
	one : function(ev, callback, priorityFirst) {
		var self  = this,
			event = ev.toLowerCase(),
			h     = function(e, f) {
				if (!self.toUnbindEvents[event]) {
					self.toUnbindEvents[event] = [];
				}
				self.toUnbindEvents[event].push({
					type: event,
					callback: h
				});
				return (callback.done? callback.done : callback).apply(this, arguments);
			};
		if (callback.done) {
			h = {done: h};
		}
		return this.bind(event, h, priorityFirst);
	},
	
	/**
	 * Set/get data into/from localStorage
	 *
	 * @param  String       key
	 * @param  String|void  value
	 * @return String|null
	 */
	localStorage : function(key, val) {
		var self   = this,
			s      = window.localStorage,
			oldkey = 'elfinder-'+(key || '')+this.id, // old key of elFinder < 2.1.6
			prefix = window.location.pathname+'-elfinder-',
			suffix = this.id,
			clrs   = [],
			retval, oldval, t, precnt, sufcnt;

		// reset this node data
		if (typeof(key) === 'undefined') {
			precnt = prefix.length;
			sufcnt = suffix.length * -1;
			jQuery.each(s, function(key) {
				if (key.substr(0, precnt) === prefix && key.substr(sufcnt) === suffix) {
					clrs.push(key);
				}
			});
			jQuery.each(clrs, function(i, key) {
				s.removeItem(key);
			});
			return true;
		}
		
		// new key of elFinder >= 2.1.6
		key = prefix+key+suffix;
		
		if (val === null) {
			return s.removeItem(key);
		}
		
		if (val === void(0) && !(retval = s.getItem(key)) && (oldval = s.getItem(oldkey))) {
			val = oldval;
			s.removeItem(oldkey);
		}
		
		if (val !== void(0)) {
			t = typeof val;
			if (t !== 'string' && t !== 'number') {
				val = JSON.stringify(val);
			}
			try {
				s.setItem(key, val);
			} catch (e) {
				try {
					s.clear();
					s.setItem(key, val);
				} catch (e) {
					self.debug('error', e.toString());
				}
			}
			retval = s.getItem(key);
		}

		if (retval && (retval.substr(0,1) === '{' || retval.substr(0,1) === '[')) {
			try {
				return JSON.parse(retval);
			} catch(e) {}
		}
		return retval;
	},

	/**
	 * Set/get data into/from sessionStorage
	 *
	 * @param  String       key
	 * @param  String|void  value
	 * @return String|null
	 */
	sessionStorage : function(key, val) {
		var self   = this,
			s, retval, t;

		try {
			s = window.sessionStorage;
		} catch(e) {}

		if (!s) {
			return;
		}

		if (val === null) {
			return s.removeItem(key);
		}

		if (val !== void(0)) {
			t = typeof val;
			if (t !== 'string' && t !== 'number') {
				val = JSON.stringify(val);
			}
			try {
				s.setItem(key, val);
			} catch (e) {
				try {
					s.clear();
					s.setItem(key, val);
				} catch (e) {
					self.debug('error', e.toString());
				}
			}
		}
		retval = s.getItem(key);

		if (retval && (retval.substr(0,1) === '{' || retval.substr(0,1) === '[')) {
			try {
				return JSON.parse(retval);
			} catch(e) {}
		}
		return retval;
	},

	/**
	 * Get/set cookie
	 *
	 * @param  String       cookie name
	 * @param  String|void  cookie value
	 * @return String|null
	 */
	cookie : function(name, value) {
		var d, o, c, i, retval, t;

		name = 'elfinder-'+name+this.id;

		if (value === void(0)) {
			if (this.cookieEnabled && document.cookie && document.cookie != '') {
				c = document.cookie.split(';');
				name += '=';
				for (i=0; i<c.length; i++) {
					c[i] = jQuery.trim(c[i]);
					if (c[i].substring(0, name.length) == name) {
						retval = decodeURIComponent(c[i].substring(name.length));
						if (retval.substr(0,1) === '{' || retval.substr(0,1) === '[') {
							try {
								return JSON.parse(retval);
							} catch(e) {}
						}
						return retval;
					}
				}
			}
			return null;
		}

		if (!this.cookieEnabled) {
			return '';
		}

		o = Object.assign({}, this.options.cookie);
		if (value === null) {
			value = '';
			o.expires = -1;
		} else {
			t = typeof value;
			if (t !== 'string' && t !== 'number') {
				value = JSON.stringify(value);
			}
		}
		if (typeof(o.expires) == 'number') {
			d = new Date();
			d.setTime(d.getTime()+(o.expires * 86400000));
			o.expires = d;
		}
		document.cookie = name+'='+encodeURIComponent(value)+'; expires='+o.expires.toUTCString()+(o.path ? '; path='+o.path : '')+(o.domain ? '; domain='+o.domain : '')+(o.secure ? '; secure' : '')+(o.samesite ? '; samesite='+o.samesite : '');
		if (value && (value.substr(0,1) === '{' || value.substr(0,1) === '[')) {
			try {
				return JSON.parse(value);
			} catch(e) {}
		}
		return value;
	},
	
	/**
	 * Get start directory (by location.hash or last opened directory)
	 * 
	 * @return String
	 */
	startDir : function() {
		var locHash = window.location.hash;
		if (locHash && locHash.match(/^#elf_/)) {
			return locHash.replace(/^#elf_/, '');
		} else if (this.options.startPathHash) {
			return this.options.startPathHash;
		} else {
			return this.lastDir();
		}
	},
	
	/**
	 * Get/set last opened directory
	 * 
	 * @param  String|undefined  dir hash
	 * @return String
	 */
	lastDir : function(hash) { 
		return this.options.rememberLastDir ? this.storage('lastdir', hash) : '';
	},
	
	/**
	 * Node for escape html entities in texts
	 * 
	 * @type jQuery
	 */
	_node : jQuery('<span></c.length;>'),
	
	/**
	 * Replace not html-safe symbols to html entities
	 * 
	 * @param  String  text to escape
	 * @return String
	 */
	escape : function(name) {
		return this._node.text(name).html().replace(/"/g, '&quot;').replace(/'/g, '&#039;');
	},
	
	/**
	 * Cleanup ajax data.
	 * For old api convert data into new api format
	 * 
	 * @param  String  command name
	 * @param  Object  data from backend
	 * @return Object
	 */
	normalize : function(data) {
		var self   = this,
			fileFilter = (function() {
				var func, filter;
				if (filter = self.options.fileFilter) {
					if (typeof filter === 'function') {
						func = function(file) {
							return filter.call(self, file);
						};
					} else if (filter instanceof RegExp) {
						func = function(file) {
							return filter.test(file.name);
						};
					}
				}
				return func? func : null;
			})(),
			chkCmdMap = function(opts) {
				// Disable command to replace with other command
				var disabled;
				if (opts.uiCmdMap) {
					if (jQuery.isPlainObject(opts.uiCmdMap) && Object.keys(opts.uiCmdMap).length) {
						if (!opts.disabledFlip) {
							opts.disabledFlip = {};
						}
						disabled = opts.disabledFlip;
						jQuery.each(opts.uiCmdMap, function(f, t) {
							if (t === 'hidden' && !disabled[f]) {
								opts.disabled.push(f);
								opts.disabledFlip[f] = true;
							}
						});
					} else {
						delete opts.uiCmdMap;
					}
				}
			},
			normalizeOptions = function(opts) {
				var getType = function(v) {
						var type = typeof v;
						if (type === 'object' && Array.isArray(v)) {
							type = 'array';
						}
						return type;
					};
				jQuery.each(self.optionProperties, function(k, empty) {
					if (empty !== void(0)) {
						if (opts[k] && getType(opts[k]) !== getType(empty)) {
							opts[k] = empty;
						}
					}
				});
				if (opts.disabled) {
					opts.disabledFlip = self.arrayFlip(opts.disabled, true);
					jQuery.each(self.options.disabledCmdsRels, function(com, rels) {
						var m, flg;
						if (opts.disabledFlip[com]) {
							flg = true;
						} else if (m = com.match(/^([^&]+)&([^=]+)=(.*)$/)) {
							if (opts.disabledFlip[m[1]] && opts[m[2]] == m[3]) {
								flg = true;
							}
						}
						if (flg) {
							jQuery.each(rels, function(i, rel) {
								if (!opts.disabledFlip[rel]) {
									opts.disabledFlip[rel] = true;
									opts.disabled.push(rel);
								}
							});
						}
					});
				} else {
					opts.disabledFlip = {};
				}
				return opts;
			},
			filter = function(file, asMap, type) { 
				var res = asMap? file : true,
					ign = asMap? null : false,
					vid, targetOptions, isRoot, rootNames;
				
				if (file && file.hash && file.name && file.mime) {
					if (file.mime === 'application/x-empty') {
						file.mime = 'text/plain';
					}
					
					isRoot = self.isRoot(file);
					if (isRoot && ! file.volumeid) {
						self.debug('warning', 'The volume root statuses requires `volumeid` property.');
					}
					if (isRoot || file.mime === 'directory') {
						// Prevention of circular reference
						if (file.phash) {
							if (file.phash === file.hash) {
								error = error.concat(['Parent folder of "$1" is itself.', file.name]);
								return ign;
							}
							if (isRoot && file.volumeid && file.phash.indexOf(file.volumeid) === 0) {
								error = error.concat(['Parent folder of "$1" is inner itself.', file.name]);
								return ign;
							}
						}
						
						// set options, tmbUrls for each volume
						if (file.volumeid) {
							vid = file.volumeid;
							
							if (isRoot) {
								// make or update of leaf roots cache
								if (file.phash) {
									if (! self.leafRoots[file.phash]) {
										self.leafRoots[file.phash] = [ file.hash ];
									} else {
										if (jQuery.inArray(file.hash, self.leafRoots[file.phash]) === -1) {
											self.leafRoots[file.phash].push(file.hash);
										}
									}
								}

								self.hasVolOptions = true;
								if (! self.volOptions[vid]) {
									self.volOptions[vid] = {
										// set dispInlineRegex
										dispInlineRegex: self.options.dispInlineRegex
									};
								}
								
								targetOptions = self.volOptions[vid];
								
								if (file.options) {
									// >= v.2.1.14 has file.options
									Object.assign(targetOptions, file.options);
								}
								
								// for compat <= v2.1.13
								if (file.disabled) {
									targetOptions.disabled = file.disabled;
									targetOptions.disabledFlip = self.arrayFlip(file.disabled, true);
								}
								if (file.tmbUrl) {
									targetOptions.tmbUrl = file.tmbUrl;
								}
								
								// '/' required at the end of url
								if (targetOptions.url && targetOptions.url.substr(-1) !== '/') {
									targetOptions.url += '/';
								}

								// check uiCmdMap
								chkCmdMap(targetOptions);
								
								// check trash bin hash
								if (targetOptions.trashHash) {
									if (self.trashes[targetOptions.trashHash] === false) {
										delete targetOptions.trashHash;
									} else {
										self.trashes[targetOptions.trashHash] = file.hash;
									}
								}
								
								// set immediate properties
								jQuery.each(self.optionProperties, function(k) {
									if (targetOptions[k]) {
										file[k] = targetOptions[k];
									}
								});

								// regist fm.roots
								if (type !== 'cwd') {
									self.roots[vid] = file.hash;
								}

								// regist fm.volumeExpires
								if (file.expires) {
									self.volumeExpires[vid] = file.expires;
								}
							}
							
							if (prevId !== vid) {
								prevId = vid;
								i18nFolderName = self.option('i18nFolderName', vid);
							}
						}
						
						// volume root i18n name
						if (isRoot && ! file.i18) {
							name = 'volume_' + file.name,
							i18 = self.i18n(false, name);
	
							if (name !== i18) {
								file.i18 = i18;
							}
						}
						
						// i18nFolderName
						if (i18nFolderName && ! file.i18) {
							name = 'folder_' + file.name,
							i18 = self.i18n(false, name);
	
							if (name !== i18) {
								file.i18 = i18;
							}
						}
						
						if (isRoot) {
							if (rootNames = self.storage('rootNames')) {
								if (rootNames[file.hash]) {
									file._name = file.name;
									file._i18 = file.i18;
									file.name = rootNames[file.hash] = rootNames[file.hash];
									delete file.i18;
								}
								self.storage('rootNames', rootNames);
							}
						}

						// lock trash bins holder
						if (self.trashes[file.hash]) {
							file.locked = true;
						}
					} else {
						if (fileFilter) {
							try {
								if (! fileFilter(file)) {
									return ign;
								}
							} catch(e) {
								self.debug(e);
							}
						}
						if (file.size == 0) {
							file.mime = self.getMimetype(file.name, file.mime);
						}
					}
					
					if (file.options) {
						self.optionsByHashes[file.hash] = normalizeOptions(file.options);
					}
					
					delete file.options;
					
					return res;
				}
				return ign;
			},
			getDescendants = function(hashes) {
				var res = [];
				jQuery.each(self.files(), function(h, f) {
					jQuery.each(self.parents(h), function(i, ph) {
						if (jQuery.inArray(ph, hashes) !== -1 && jQuery.inArray(h, hashes) === -1) {
							res.push(h);
							return false;
						}
					});
				});
				return res;
			},
			applyLeafRootStats = function(dataArr, type) {
				jQuery.each(dataArr, function(i, f) {
					var pfile, done;
					if (self.leafRoots[f.hash]) {
						self.applyLeafRootStats(f);
					}
					// update leaf root parent stat
					if (type !== 'change' && f.phash && self.isRoot(f) && (pfile = self.file(f.phash))) {
						self.applyLeafRootStats(pfile);
						// add to data.changed
						if (!data.changed) {
							data.changed = [pfile];
						} else {
							jQuery.each(data.changed, function(i, f) {
								if (f.hash === pfile.hash) {
									data.changed[i] = pfile;
									done = true;
									return false;
								}
							});
							if (!done) {
								data.changed.push(pfile);
							}
						}
					}
				});
			},
			error = [],
			name, i18, i18nFolderName, prevId, cData;
		
		// set cunstom data
		if (data.customData && (!self.prevCustomData || (JSON.stringify(data.customData) !== JSON.stringify(self.prevCustomData)))) {
			self.prevCustomData = data.customData;
			try {
				cData = JSON.parse(data.customData);
				if (jQuery.isPlainObject(cData)) {
					self.prevCustomData = cData;
					jQuery.each(Object.keys(cData), function(i, key) {
						if (cData[key] === null) {
							delete cData[key];
							delete self.optsCustomData[key];
						}
					});
					self.customData = Object.assign({}, self.optsCustomData, cData);
				}
			} catch(e) {}
		}

		if (data.options) {
			normalizeOptions(data.options);
		}
		
		if (data.cwd) {
			if (data.cwd.volumeid && data.options && Object.keys(data.options).length && self.isRoot(data.cwd)) {
				self.hasVolOptions = true;
				self.volOptions[data.cwd.volumeid] = data.options;
			}
			data.cwd = filter(data.cwd, true, 'cwd');
		}
		if (data.files) {
			data.files = jQuery.grep(data.files, filter);
		} 
		if (data.tree) {
			data.tree = jQuery.grep(data.tree, filter);
		}
		if (data.added) {
			data.added = jQuery.grep(data.added, filter);
		}
		if (data.changed) {
			data.changed = jQuery.grep(data.changed, filter);
		}
		if (data.removed && data.removed.length && self.searchStatus.state === 2) {
			data.removed = data.removed.concat(getDescendants(data.removed));
		}
		if (data.api) {
			data.init = true;
		}

		if (Object.keys(self.leafRoots).length) {
			data.files && applyLeafRootStats(data.files);
			data.tree && applyLeafRootStats(data.tree);
			data.added && applyLeafRootStats(data.added);
			data.changed && applyLeafRootStats(data.changed, 'change');
		}

		// merge options that apply only to cwd
		if (data.cwd && data.cwd.options && data.options) {
			Object.assign(data.options, normalizeOptions(data.cwd.options));
		}

		// '/' required at the end of url
		if (data.options && data.options.url && data.options.url.substr(-1) !== '/') {
			data.options.url += '/';
		}
		
		// check error
		if (error.length) {
			data.norError = ['errResponse'].concat(error);
		}
		
		return data;
	},
	
	/**
	 * Update sort options
	 *
	 * @param {String} sort type
	 * @param {String} sort order
	 * @param {Boolean} show folder first
	 */
	setSort : function(type, order, stickFolders, alsoTreeview) {
		this.storage('sortType', (this.sortType = this.sortRules[type] ? type : 'name'));
		this.storage('sortOrder', (this.sortOrder = /asc|desc/.test(order) ? order : 'asc'));
		this.storage('sortStickFolders', (this.sortStickFolders = !!stickFolders) ? 1 : '');
		this.storage('sortAlsoTreeview', (this.sortAlsoTreeview = !!alsoTreeview) ? 1 : '');
		this.trigger('sortchange');
	},
	
	_sortRules : {
		name : function(file1, file2) {
			return elFinder.prototype.naturalCompare(file1.i18 || file1.name, file2.i18 || file2.name);
		},
		size : function(file1, file2) { 
			var size1 = parseInt(file1.size) || 0,
				size2 = parseInt(file2.size) || 0;
				
			return size1 === size2 ? 0 : size1 > size2 ? 1 : -1;
		},
		kind : function(file1, file2) {
			return elFinder.prototype.naturalCompare(file1.mime, file2.mime);
		},
		date : function(file1, file2) { 
			var date1 = file1.ts || file1.date || 0,
				date2 = file2.ts || file2.date || 0;

			return date1 === date2 ? 0 : date1 > date2 ? 1 : -1;
		},
		perm : function(file1, file2) { 
			var val = function(file) { return (file.write? 2 : 0) + (file.read? 1 : 0); },
				v1  = val(file1),
				v2  = val(file2);
			return v1 === v2 ? 0 : v1 > v2 ? 1 : -1;
		},
		mode : function(file1, file2) { 
			var v1 = file1.mode || (file1.perm || ''),
				v2 = file2.mode || (file2.perm || '');
			return elFinder.prototype.naturalCompare(v1, v2);
		},
		owner : function(file1, file2) { 
			var v1 = file1.owner || '',
				v2 = file2.owner || '';
			return elFinder.prototype.naturalCompare(v1, v2);
		},
		group : function(file1, file2) { 
			var v1 = file1.group || '',
				v2 = file2.group || '';
			return elFinder.prototype.naturalCompare(v1, v2);
		}
	},
	
	/**
	 * Valid sort rule names
	 * 
	 * @type Object
	 */
	sorters : {},
	
	/**
	 * Compare strings for natural sort
	 *
	 * @param  String
	 * @param  String
	 * @return Number
	 */
	naturalCompare : function(a, b) {
		var self = elFinder.prototype.naturalCompare;
		if (typeof self.loc == 'undefined') {
			self.loc = (navigator.userLanguage || navigator.browserLanguage || navigator.language || 'en-US');
		}
		if (typeof self.sort == 'undefined') {
			if ('11'.localeCompare('2', self.loc, {numeric: true}) > 0) {
				// Native support
				if (window.Intl && window.Intl.Collator) {
					self.sort = new Intl.Collator(self.loc, {numeric: true}).compare;
				} else {
					self.sort = function(a, b) {
						return a.localeCompare(b, self.loc, {numeric: true});
					};
				}
			} else {
				/*
				 * Edited for elFinder (emulates localeCompare() by numeric) by Naoki Sawada aka nao-pon
				 */
				/*
				 * Huddle/javascript-natural-sort (https://github.com/Huddle/javascript-natural-sort)
				 */
				/*
				 * Natural Sort algorithm for Javascript - Version 0.7 - Released under MIT license
				 * Author: Jim Palmer (based on chunking idea from Dave Koelle)
				 * http://opensource.org/licenses/mit-license.php
				 */
				self.sort = function(a, b) {
					var re = /(^-?[0-9]+(\.?[0-9]*)[df]?e?[0-9]?$|^0x[0-9a-f]+$|[0-9]+)/gi,
					sre = /(^[ ]*|[ ]*$)/g,
					dre = /(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/,
					hre = /^0x[0-9a-f]+$/i,
					ore = /^0/,
					syre = /^[\x01\x21-\x2f\x3a-\x40\x5b-\x60\x7b-\x7e]/, // symbol first - (Naoki Sawada)
					i = function(s) { return self.sort.insensitive && (''+s).toLowerCase() || ''+s; },
					// convert all to strings strip whitespace
					// first character is "_", it's smallest - (Naoki Sawada)
					x = i(a).replace(sre, '').replace(/^_/, "\x01") || '',
					y = i(b).replace(sre, '').replace(/^_/, "\x01") || '',
					// chunk/tokenize
					xN = x.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'),
					yN = y.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'),
					// numeric, hex or date detection
					xD = parseInt(x.match(hre)) || (xN.length != 1 && x.match(dre) && Date.parse(x)),
					yD = parseInt(y.match(hre)) || xD && y.match(dre) && Date.parse(y) || null,
					oFxNcL, oFyNcL,
					locRes = 0;

					// first try and sort Hex codes or Dates
					if (yD) {
						if ( xD < yD ) return -1;
						else if ( xD > yD ) return 1;
					}
					// natural sorting through split numeric strings and default strings
					for(var cLoc=0, numS=Math.max(xN.length, yN.length); cLoc < numS; cLoc++) {

						// find floats not starting with '0', string or 0 if not defined (Clint Priest)
						oFxNcL = !(xN[cLoc] || '').match(ore) && parseFloat(xN[cLoc]) || xN[cLoc] || 0;
						oFyNcL = !(yN[cLoc] || '').match(ore) && parseFloat(yN[cLoc]) || yN[cLoc] || 0;

						// handle numeric vs string comparison - number < string - (Kyle Adams)
						// but symbol first < number - (Naoki Sawada)
						if (isNaN(oFxNcL) !== isNaN(oFyNcL)) {
							if (isNaN(oFxNcL) && (typeof oFxNcL !== 'string' || ! oFxNcL.match(syre))) {
								return 1;
							} else if (typeof oFyNcL !== 'string' || ! oFyNcL.match(syre)) {
								return -1;
							}
						}

						// use decimal number comparison if either value is string zero
						if (parseInt(oFxNcL, 10) === 0) oFxNcL = 0;
						if (parseInt(oFyNcL, 10) === 0) oFyNcL = 0;

						// rely on string comparison if different types - i.e. '02' < 2 != '02' < '2'
						if (typeof oFxNcL !== typeof oFyNcL) {
							oFxNcL += '';
							oFyNcL += '';
						}

						// use locale sensitive sort for strings when case insensitive
						// note: localeCompare interleaves uppercase with lowercase (e.g. A,a,B,b)
						if (self.sort.insensitive && typeof oFxNcL === 'string' && typeof oFyNcL === 'string') {
							locRes = oFxNcL.localeCompare(oFyNcL, self.loc);
							if (locRes !== 0) return locRes;
						}

						if (oFxNcL < oFyNcL) return -1;
						if (oFxNcL > oFyNcL) return 1;
					}
					return 0;
				};
				self.sort.insensitive = true;
			}
		}
		return self.sort(a, b);
	},
	
	/**
	 * Compare files based on elFinder.sort
	 *
	 * @param  Object  file
	 * @param  Object  file
	 * @return Number
	 */
	compare : function(file1, file2) {
		var self  = this,
			type  = self.sortType,
			asc   = self.sortOrder == 'asc',
			stick = self.sortStickFolders,
			rules = self.sortRules,
			sort  = rules[type],
			d1    = file1.mime == 'directory',
			d2    = file2.mime == 'directory',
			res;
			
		if (stick) {
			if (d1 && !d2) {
				return -1;
			} else if (!d1 && d2) {
				return 1;
			}
		}
		
		res = asc ? sort(file1, file2) : sort(file2, file1);
		
		return type !== 'name' && res === 0
			? res = asc ? rules.name(file1, file2) : rules.name(file2, file1)
			: res;
	},
	
	/**
	 * Sort files based on config
	 *
	 * @param  Array  files
	 * @return Array
	 */
	sortFiles : function(files) {
		return files.sort(this.compare);
	},
	
	/**
	 * Open notification dialog 
	 * and append/update message for required notification type.
	 *
	 * @param  Object  options
	 * @example  
	 * this.notify({
	 *    type : 'copy',
	 *    msg : 'Copy files', // not required for known types @see this.notifyType
	 *    cnt : 3,
	 *    hideCnt  : false,   // true for not show count
	 *    progress : 10,      // progress bar percents (use cnt : 0 to update progress bar)
	 *    cancel   : callback // callback function for cancel button
	 * })
	 * @return elFinder
	 */
	notify : function(opts) {
		var self     = this,
			type     = opts.type,
			id       = opts.id? 'elfinder-notify-'+opts.id : '',
			msg      = this.i18n((typeof opts.msg !== 'undefined')? opts.msg : (this.messages['ntf'+type] ? 'ntf'+type : 'ntfsmth')),
			hiddens  = this.arrayFlip(this.options.notifyDialog.hiddens || []),
			ndialog  = this.ui.notify,
			dialog   = ndialog.closest('.ui-dialog'),
			notify   = ndialog.children('.elfinder-notify-'+type+(id? ('.'+id) : '')),
			button   = notify.children('div.elfinder-notify-cancel').children('button'),
			ntpl     = '<div class="elfinder-notify elfinder-notify-{type}'+(id? (' '+id) : '')+'"><span class="elfinder-dialog-icon elfinder-dialog-icon-{type}"></span><span class="elfinder-notify-msg">{msg}</span> <span class="elfinder-notify-cnt"></span><div class="elfinder-notify-progressbar"><div class="elfinder-notify-progress"></div></div><div class="elfinder-notify-cancel"></div></div>',
			delta    = opts.cnt + 0,
			size     = (typeof opts.size != 'undefined')? parseInt(opts.size) : null,
			progress = (typeof opts.progress != 'undefined' && opts.progress >= 0) ? opts.progress : null,
			fakeint  = opts.fakeinterval || 200,
			cancel   = opts.cancel,
			clhover  = 'ui-state-hover',
			close    = function() {
				var prog = notify.find('.elfinder-notify-progress'),
					rm = function() {
						notify.remove();
						if (!ndialog.children(dialog.data('minimized')? void(0) : ':visible').length) {
							if (dialog.data('minimized')) {
								dialog.data('minimized').hide();
							} else {
								ndialog.elfinderdialog('close');
							}
						}
						setProgressbar();
					};
				notify._esc && jQuery(document).off('keydown', notify._esc);
				if (notify.data('cur') < 100) {
					prog.animate({
						width : '100%'
					}, 50, function() { requestAnimationFrame(function() { rm(); }); });
				} else {
					rm();
				}
			},
			fakeUp = function(interval) {
				var cur;
				if (notify.length) {
					cur = notify.data('cur') + 1;
					if (cur <= 98) {
						notify.find('.elfinder-notify-progress').width(cur + '%');
						notify.data('cur', cur);
						setProgressbar();
						setTimeout(function() {
							interval *= 1.05; 
							fakeUp(interval);
						}, interval);
					}
				}
			},
			setProgressbar = function() {
				var cnt = 0,
					val = 0,
					ntfs = ndialog.children('.elfinder-notify'),
					w;
				if (ntfs.length) {
					ntfs.each(function() {
						cnt++;
						val += Math.min(jQuery(this).data('cur'), 100);
					});
					w = cnt? Math.floor(val / (cnt * 100) * 100) + '%' : 0;
					self.ui.progressbar.width(w);
					if (dialog.data('minimized')) {
						dialog.data('minimized').title(w);
						dialog.data('minimized').dialog().children('.ui-dialog-titlebar').children('.elfinder-ui-progressbar').width(w);
					}
				} else {
					self.ui.progressbar.width(0);
					dialog.data('minimized') && dialog.data('minimized').hide();
				}
			},
			cnt, total, prc;

		if (!type) {
			return this;
		}
		
		if (!notify.length) {
			notify = jQuery(ntpl.replace(/\{type\}/g, type).replace(/\{msg\}/g, msg));
			if (hiddens[type]) {
				notify.hide();
			} else {
				ndialog.on('minimize', function(e) {
					dialog.data('minimized') && setProgressbar();
				});
			}
			notify.appendTo(ndialog).data('cnt', 0);

			if (progress != null) {
				notify.data({progress : 0, total : 0, cur : 0});
			} else {
				notify.data({cur : 0});
				fakeUp(fakeint);
			}

			if (cancel) {
				button = jQuery('<span class="elfinder-notify-button ui-icon ui-icon-close" title="'+this.i18n('btnCancel')+'"></span>')
					.on('mouseenter mouseleave', function(e) { 
						jQuery(this).toggleClass(clhover, e.type === 'mouseenter');
					});
				notify.children('div.elfinder-notify-cancel').append(button);
			}
			ndialog.trigger('resize');
		} else if (typeof opts.msg !== 'undefined') {
			notify.children('span.elfinder-notify-msg').html(msg);
		}

		cnt = delta + parseInt(notify.data('cnt'));
		
		if (cnt > 0) {
			if (cancel && button.length) {
				if (jQuery.isFunction(cancel) || (typeof cancel === 'object' && cancel.promise)) {
					notify._esc = function(e) {
						if (e.type == 'keydown' && e.keyCode != jQuery.ui.keyCode.ESCAPE) {
							return;
						}
						e.preventDefault();
						e.stopPropagation();
						close();
						if (cancel.promise) {
							cancel.reject(0); // 0 is canceling flag
						} else {
							cancel(e);
						}
					};
					button.on('click', function(e) {
						notify._esc(e);
					});
					jQuery(document).on('keydown.' + this.namespace, notify._esc);
				}
			}
			
			!opts.hideCnt && notify.children('.elfinder-notify-cnt').text('('+cnt+')');
			if (delta > 0 && ndialog.is(':hidden') && !hiddens[type]) {
				if (dialog.data('minimized')) {
					dialog.data('minimized').show();
				} else {
					ndialog.elfinderdialog('open', this).height('auto');
				}
			}
			notify.data('cnt', cnt);
			
			if ((progress != null)
			&& (total = notify.data('total')) >= 0
			&& (prc = notify.data('progress')) >= 0) {

				total += size != null? size : delta;
				prc   += progress;
				(size == null && delta < 0) && (prc += delta * 100);
				notify.data({progress : prc, total : total});
				if (size != null) {
					prc *= 100;
					total = Math.max(1, total);
				}
				progress = Math.min(parseInt(prc/total), 100);
				
				notify.find('.elfinder-notify-progress')
					.animate({
						width : (progress < 100 ? progress : 100)+'%'
					}, 20, function() {
						notify.data('cur', progress);
						setProgressbar();
					});
			}
			
		} else {
			close();
		}
		
		return this;
	},
	
	/**
	 * Open confirmation dialog 
	 *
	 * @param  Object  options
	 * @example  
	 * this.confirm({
	 *    cssClass : 'elfinder-confirm-mydialog',
	 *    title : 'Remove files',
	 *    text  : 'Here is question text',
	 *    accept : {  // accept callback - required
	 *      label : 'Continue',
	 *      callback : function(applyToAll) { fm.log('Ok') }
	 *    },
	 *    cancel : { // cancel callback - required
	 *      label : 'Cancel',
	 *      callback : function() { fm.log('Cancel')}
	 *    },
	 *    reject : { // reject callback - optionally
	 *      label : 'No',
	 *      callback : function(applyToAll) { fm.log('No')}
	 *    },
	 *    buttons : [ // additional buttons callback - optionally
	 *      {
	 *        label : 'Btn1',
	 *        callback : function(applyToAll) { fm.log('Btn1')}
	 *      }
	 *    ],
	 *    all : true  // display checkbox "Apply to all"
	 * })
	 * @return elFinder
	 */
	confirm : function(opts) {
		var self     = this,
			complete = false,
			options = {
				cssClass  : 'elfinder-dialog-confirm',
				modal     : true,
				resizable : false,
				title     : this.i18n(opts.title || 'confirmReq'),
				buttons   : {},
				close     : function() { 
					!complete && opts.cancel.callback();
					jQuery(this).elfinderdialog('destroy');
				}
			},
			apply = this.i18n('apllyAll'),
			label, checkbox, btnNum;

		if (opts.cssClass) {
			options.cssClass += ' ' + opts.cssClass;
		}
		options.buttons[this.i18n(opts.accept.label)] = function() {
			opts.accept.callback(!!(checkbox && checkbox.prop('checked')));
			complete = true;
			jQuery(this).elfinderdialog('close');
		};
		options.buttons[this.i18n(opts.accept.label)]._cssClass = 'elfinder-confirm-accept';
		
		if (opts.reject) {
			options.buttons[this.i18n(opts.reject.label)] = function() {
				opts.reject.callback(!!(checkbox && checkbox.prop('checked')));
				complete = true;
				jQuery(this).elfinderdialog('close');
			};
			options.buttons[this.i18n(opts.reject.label)]._cssClass = 'elfinder-confirm-reject';
		}
		
		if (opts.buttons && opts.buttons.length > 0) {
			btnNum = 1;
			jQuery.each(opts.buttons, function(i, v){
				options.buttons[self.i18n(v.label)] = function() {
					v.callback(!!(checkbox && checkbox.prop('checked')));
					complete = true;
					jQuery(this).elfinderdialog('close');
				};
				options.buttons[self.i18n(v.label)]._cssClass = 'elfinder-confirm-extbtn' + (btnNum++);
				if (v.cssClass) {
					options.buttons[self.i18n(v.label)]._cssClass += ' ' + v.cssClass;
				}
			});
		}
		
		options.buttons[this.i18n(opts.cancel.label)] = function() {
			jQuery(this).elfinderdialog('close');
		};
		options.buttons[this.i18n(opts.cancel.label)]._cssClass = 'elfinder-confirm-cancel';
		
		if (opts.all) {
			options.create = function() {
				var base = jQuery('<div class="elfinder-dialog-confirm-applyall"></div>');
				checkbox = jQuery('<input type="checkbox" />');
				jQuery(this).next().find('.ui-dialog-buttonset')
					.prepend(base.append(jQuery('<label>'+apply+'</label>').prepend(checkbox)));
			};
		}
		
		if (opts.optionsCallback && jQuery.isFunction(opts.optionsCallback)) {
			opts.optionsCallback(options);
		}
		
		return this.dialog('<span class="elfinder-dialog-icon elfinder-dialog-icon-confirm"></span>' + this.i18n(opts.text), options);
	},
	
	/**
	 * Create unique file name in required dir
	 * 
	 * @param  String  file name
	 * @param  String  parent dir hash
	 * @param  String  glue
	 * @return String
	 */
	uniqueName : function(prefix, phash, glue) {
		var i = 0, ext = '', p, name;
		
		prefix = this.i18n(false, prefix);
		phash = phash || this.cwd().hash;
		glue = (typeof glue === 'undefined')? ' ' : glue;

		if (p = prefix.match(/^(.+)(\.[^.]+)$/)) {
			ext    = p[2];
			prefix = p[1];
		}
		
		name   = prefix+ext;
		
		if (!this.fileByName(name, phash)) {
			return name;
		}
		while (i < 10000) {
			name = prefix + glue + (++i) + ext;
			if (!this.fileByName(name, phash)) {
				return name;
			}
		}
		return prefix + Math.random() + ext;
	},
	
	/**
	 * Return message translated onto current language
	 * Allowed accept HTML element that was wrapped in jQuery object
	 * To be careful to XSS vulnerability of HTML element Ex. You should use `fm.escape(file.name)`
	 *
	 * @param  String|Array  message[s]|Object jQuery
	 * @return String
	 **/
	i18n : function() {
		var self = this,
			messages = this.messages, 
			input    = [],
			ignore   = [], 
			message = function(m) {
				var file;
				if (m.indexOf('#') === 0) {
					if ((file = self.file(m.substr(1)))) {
						return file.name;
					}
				}
				return m;
			},
			i, j, m, escFunc, start = 0, isErr;
		
		if (arguments.length && arguments[0] === false) {
			escFunc = function(m){ return m; };
			start = 1;
		}
		for (i = start; i< arguments.length; i++) {
			m = arguments[i];
			
			if (Array.isArray(m)) {
				for (j = 0; j < m.length; j++) {
					if (m[j] instanceof jQuery) {
						// jQuery object is HTML element
						input.push(m[j]);
					} else if (typeof m[j] !== 'undefined'){
						input.push(message('' + m[j]));
					}
				}
			} else if (m instanceof jQuery) {
				// jQuery object is HTML element
				input.push(m[j]);
			} else if (typeof m !== 'undefined'){
				input.push(message('' + m));
			}
		}
		
		for (i = 0; i < input.length; i++) {
			// dont translate placeholders
			if (jQuery.inArray(i, ignore) !== -1) {
				continue;
			}
			m = input[i];
			if (typeof m == 'string') {
				isErr = !!(messages[m] && m.match(/^err/));
				// translate message
				m = messages[m] || (escFunc? escFunc(m) : self.escape(m));
				// replace placeholders in message
				m = m.replace(/\$(\d+)/g, function(match, placeholder) {
					var res;
					placeholder = i + parseInt(placeholder);
					if (placeholder > 0 && input[placeholder]) {
						ignore.push(placeholder);
					}
					res = escFunc? escFunc(input[placeholder]) : self.escape(input[placeholder]);
					if (isErr) {
						res = '<span class="elfinder-err-var elfinder-err-var' + placeholder + '">' + res + '</span>';
					}
					return res;
				});
			} else {
				// get HTML from jQuery object
				m = m.get(0).outerHTML;
			}

			input[i] = m;
		}

		return jQuery.grep(input, function(m, i) { return jQuery.inArray(i, ignore) === -1 ? true : false; }).join('<br>');
	},
	
	/**
	 * Get icon style from file.icon
	 * 
	 * @param  Object  elFinder file object
	 * @return String|Object
	 */
	getIconStyle : function(file, asObject) {
		var self = this,
			template = {
				'background' : 'url(\'{url}\') 0 0 no-repeat',
				'background-size' : 'contain'
			},
			style = '',
			cssObj = {},
			i = 0;
		if (file.icon) {
			style = 'style="';
			jQuery.each(template, function(k, v) {
				if (i++ === 0) {
					v = v.replace('{url}', self.escape(file.icon));
				}
				if (asObject) {
					cssObj[k] = v;
				} else {
					style += k+':'+v+';';
				}
			});
			style += '"';
		}
		return asObject? cssObj : style;
	},
	
	/**
	 * Convert mimetype into css classes
	 * 
	 * @param  String  file mimetype
	 * @return String
	 */
	mime2class : function(mimeType) {
		var prefix = 'elfinder-cwd-icon-',
			mime   = mimeType.toLowerCase(),
			isText = this.textMimes[mime];
		
		mime = mime.split('/');
		if (isText) {
			mime[0] += ' ' + prefix + 'text';
		} else if (mime[1] && mime[1].match(/\+xml$/)) {
			mime[0] += ' ' + prefix + 'xml';
		}
		
		return prefix + mime[0] + (mime[1] ? ' ' + prefix + mime[1].replace(/(\.|\+)/g, '-') : '');
	},
	
	/**
	 * Return localized kind of file
	 * 
	 * @param  Object|String  file or file mimetype
	 * @return String
	 */
	mime2kind : function(f) {
		var isObj = typeof(f) == 'object' ? true : false,
			mime  = isObj ? f.mime : f,
			kind;
		

		if (isObj && f.alias && mime != 'symlink-broken') {
			kind = 'Alias';
		} else if (this.kinds[mime]) {
			if (isObj && mime === 'directory' && (! f.phash || f.isroot)) {
				kind = 'Root';
			} else {
				kind = this.kinds[mime];
			}
		} else if (this.mimeTypes[mime]) {
			kind = this.mimeTypes[mime].toUpperCase();
			if (!this.messages['kind'+kind]) {
				kind = null;
			}
		}
		if (! kind) {
			if (mime.indexOf('text') === 0) {
				kind = 'Text';
			} else if (mime.indexOf('image') === 0) {
				kind = 'Image';
			} else if (mime.indexOf('audio') === 0) {
				kind = 'Audio';
			} else if (mime.indexOf('video') === 0) {
				kind = 'Video';
			} else if (mime.indexOf('application') === 0) {
				kind = 'App';
			} else {
				kind = mime;
			}
		}
		
		return this.messages['kind'+kind] ? this.i18n('kind'+kind) : mime;
	},
	
	/**
	 * Return boolean Is mime-type text file
	 * 
	 * @param  String  mime-type
	 * @return Boolean
	 */
	mimeIsText : function(mime) {
		return (this.textMimes[mime.toLowerCase()] || (mime.indexOf('text/') === 0 && mime.substr(5, 3) !== 'rtf') || mime.match(/^application\/.+\+xml$/))? true : false;
	},
	
	/**
	 * Returns a date string formatted according to the given format string
	 * 
	 * @param  String  format string
	 * @param  Object  Date object
	 * @return String
	 */
	date : function(format, date) {
		var self = this,
			output, d, dw, m, y, h, g, i, s;
		
		if (! date) {
			date = new Date();
		}
		
		h  = date[self.getHours]();
		g  = h > 12 ? h - 12 : h;
		i  = date[self.getMinutes]();
		s  = date[self.getSeconds]();
		d  = date[self.getDate]();
		dw = date[self.getDay]();
		m  = date[self.getMonth]() + 1;
		y  = date[self.getFullYear]();
		
		output = format.replace(/[a-z]/gi, function(val) {
			switch (val) {
				case 'd': return d > 9 ? d : '0'+d;
				case 'j': return d;
				case 'D': return self.i18n(self.i18.daysShort[dw]);
				case 'l': return self.i18n(self.i18.days[dw]);
				case 'm': return m > 9 ? m : '0'+m;
				case 'n': return m;
				case 'M': return self.i18n(self.i18.monthsShort[m-1]);
				case 'F': return self.i18n(self.i18.months[m-1]);
				case 'Y': return y;
				case 'y': return (''+y).substr(2);
				case 'H': return h > 9 ? h : '0'+h;
				case 'G': return h;
				case 'g': return g;
				case 'h': return g > 9 ? g : '0'+g;
				case 'a': return h >= 12 ? 'pm' : 'am';
				case 'A': return h >= 12 ? 'PM' : 'AM';
				case 'i': return i > 9 ? i : '0'+i;
				case 's': return s > 9 ? s : '0'+s;
			}
			return val;
		});
		
		return output;
	},
	
	/**
	 * Return localized date
	 * 
	 * @param  Object  file object
	 * @return String
	 */
	formatDate : function(file, t) {
		var self = this, 
			ts   = t || file.ts, 
			i18  = self.i18,
			date, format, output, d, dw, m, y, h, g, i, s;

		if (self.options.clientFormatDate && ts > 0) {

			date = new Date(ts*1000);
			format = ts >= this.yesterday 
				? this.fancyFormat 
				: this.dateFormat;

			output = self.date(format, date);
			
			return ts >= this.yesterday
				? output.replace('$1', this.i18n(ts >= this.today ? 'Today' : 'Yesterday'))
				: output;
		} else if (file.date) {
			return file.date.replace(/([a-z]+)\s/i, function(a1, a2) { return self.i18n(a2)+' '; });
		}
		
		return self.i18n('dateUnknown');
	},
	
	/**
	 * Return localized number string
	 * 
	 * @param  Number
	 * @return String
	 */
	toLocaleString : function(num) {
		var v = new Number(num);
		if (v) {
			if (v.toLocaleString) {
				return v.toLocaleString();
			} else {
				return String(num).replace( /(\d)(?=(\d\d\d)+(?!\d))/g, '$1,');
			}
		}
		return num;
	},
	
	/**
	 * Return css class marks file permissions
	 * 
	 * @param  Object  file 
	 * @return String
	 */
	perms2class : function(o) {
		var c = '';
		
		if (!o.read && !o.write) {
			c = 'elfinder-na';
		} else if (!o.read) {
			c = 'elfinder-wo';
		} else if (!o.write) {
			c = 'elfinder-ro';
		}
		
		if (o.type) {
			c += ' elfinder-' + this.escape(o.type);
		}
		
		return c;
	},
	
	/**
	 * Return localized string with file permissions
	 * 
	 * @param  Object  file
	 * @return String
	 */
	formatPermissions : function(f) {
		var p  = [];
			
		f.read && p.push(this.i18n('read'));
		f.write && p.push(this.i18n('write'));	

		return p.length ? p.join(' '+this.i18n('and')+' ') : this.i18n('noaccess');
	},
	
	/**
	 * Return formated file size
	 * 
	 * @param  Number  file size
	 * @return String
	 */
	formatSize : function(s) {
		var n = 1, u = 'b';
		
		if (s == 'unknown') {
			return this.i18n('unknown');
		}
		
		if (s > 1073741824) {
			n = 1073741824;
			u = 'GB';
		} else if (s > 1048576) {
			n = 1048576;
			u = 'MB';
		} else if (s > 1024) {
			n = 1024;
			u = 'KB';
		}
		s = s/n;
		return (s > 0 ? n >= 1048576 ? s.toFixed(2) : Math.round(s) : 0) +' '+u;
	},
	
	/**
	 * Return formated file mode by options.fileModeStyle
	 * 
	 * @param  String  file mode
	 * @param  String  format style
	 * @return String
	 */
	formatFileMode : function(p, style) {
		var i, o, s, b, sticy, suid, sgid, str, oct;
		
		if (!style) {
			style = this.options.fileModeStyle.toLowerCase();
		}
		p = jQuery.trim(p);
		if (p.match(/[rwxs-]{9}$/i)) {
			str = p = p.substr(-9);
			if (style == 'string') {
				return str;
			}
			oct = '';
			s = 0;
			for (i=0; i<7; i=i+3) {
				o = p.substr(i, 3);
				b = 0;
				if (o.match(/[r]/i)) {
					b += 4;
				}
				if (o.match(/[w]/i)) {
					b += 2;
				}
				if (o.match(/[xs]/i)) {
					if (o.match(/[xs]/)) {
						b += 1;
					}
					if (o.match(/[s]/i)) {
						if (i == 0) {
							s += 4;
						} else if (i == 3) {
							s += 2;
						}
					}
				}
				oct += b.toString(8);
			}
			if (s) {
				oct = s.toString(8) + oct;
			}
		} else {
			p = parseInt(p, 8);
			oct = p? p.toString(8) : '';
			if (!p || style == 'octal') {
				return oct;
			}
			o = p.toString(8);
			s = 0;
			if (o.length > 3) {
				o = o.substr(-4);
				s = parseInt(o.substr(0, 1), 8);
				o = o.substr(1);
			}
			sticy = ((s & 1) == 1); // not support
			sgid = ((s & 2) == 2);
			suid = ((s & 4) == 4);
			str = '';
			for(i=0; i<3; i++) {
				if ((parseInt(o.substr(i, 1), 8) & 4) == 4) {
					str += 'r';
				} else {
					str += '-';
				}
				if ((parseInt(o.substr(i, 1), 8) & 2) == 2) {
					str += 'w';
				} else {
					str += '-';
				}
				if ((parseInt(o.substr(i, 1), 8) & 1) == 1) {
					str += ((i==0 && suid)||(i==1 && sgid))? 's' : 'x';
				} else {
					str += '-';
				}
			}
		}
		if (style == 'both') {
			return str + ' (' + oct + ')';
		} else if (style == 'string') {
			return str;
		} else {
			return oct;
		}
	},
	
	/**
	 * Regist this.decodeRawString function
	 * 
	 * @return void
	 */
	registRawStringDecoder : function(rawStringDecoder) {
		if (jQuery.isFunction(rawStringDecoder)) {
			this.decodeRawString = this.options.rawStringDecoder = rawStringDecoder;
		}
	},
	
	/**
	 * Return boolean that uploadable MIME type into target folder
	 * 
	 * @param  String  mime    MIME type
	 * @param  String  target  target folder hash
	 * @return Bool
	 */
	uploadMimeCheck : function(mime, target) {
		target = target || this.cwd().hash;
		var res   = true, // default is allow
			mimeChecker = this.option('uploadMime', target),
			allow,
			deny,
			check = function(checker) {
				var ret = false;
				if (typeof checker === 'string' && checker.toLowerCase() === 'all') {
					ret = true;
				} else if (Array.isArray(checker) && checker.length) {
					jQuery.each(checker, function(i, v) {
						v = v.toLowerCase();
						if (v === 'all' || mime.indexOf(v) === 0) {
							ret = true;
							return false;
						}
					});
				}
				return ret;
			};
		if (mime && jQuery.isPlainObject(mimeChecker)) {
			mime = mime.toLowerCase();
			allow = check(mimeChecker.allow);
			deny = check(mimeChecker.deny);
			if (mimeChecker.firstOrder === 'allow') {
				res = false; // default is deny
				if (! deny && allow === true) { // match only allow
					res = true;
				}
			} else {
				res = true; // default is allow
				if (deny === true && ! allow) { // match only deny
					res = false;
				}
			}
		}
		return res;
	},
	
	/**
	 * call chained sequence of async deferred functions
	 * 
	 * @param  Array   tasks async functions
	 * @return Object  jQuery.Deferred
	 */
	sequence : function(tasks) {
		var l = tasks.length,
			chain = function(task, idx) {
				++idx;
				if (tasks[idx]) {
					return chain(task.then(tasks[idx]), idx);
				} else {
					return task;
				}
			};
		if (l > 1) {
			return chain(tasks[0](), 0);
		} else {
			return tasks[0]();
		}
	},
	
	/**
	 * Reload contents of target URL for clear browser cache
	 * 
	 * @param  String  url target URL
	 * @return Object  jQuery.Deferred
	 */
	reloadContents : function(url) {
		var dfd = jQuery.Deferred(),
			ifm;
		try {
			ifm = jQuery('<iframe width="1" height="1" scrolling="no" frameborder="no" style="position:absolute; top:-1px; left:-1px" crossorigin="use-credentials">')
				.attr('src', url)
				.one('load', function() {
					var ifm = jQuery(this);
					try {
						this.contentDocument.location.reload(true);
						ifm.one('load', function() {
							ifm.remove();
							dfd.resolve();
						});
					} catch(e) {
						ifm.attr('src', '').attr('src', url).one('load', function() {
							ifm.remove();
							dfd.resolve();
						});
					}
				})
				.appendTo('body');
		} catch(e) {
			ifm && ifm.remove();
			dfd.reject();
		}
		return dfd;
	},
	
	/**
	 * Make netmount option for OAuth2
	 * 
	 * @param  String   protocol
	 * @param  String   name
	 * @param  String   host
	 * @param  Object   opts  Default {noOffline: false, root: 'root', pathI18n: 'folderId', folders: true}
			}
	 * 
	 * @return Object
	 */
	makeNetmountOptionOauth : function(protocol, name, host, opt) {
		var noOffline = typeof opt === 'boolean'? opt : null, // for backward compat
			opts = Object.assign({
				noOffline : false,
				root      : 'root',
				pathI18n  : 'folderId',
				folders   : true
			}, (noOffline === null? (opt || {}) : {noOffline : noOffline})),
			addFolders = function(fm, bro, folders) {
				var self = this,
					cnt  = Object.keys(jQuery.isPlainObject(folders)? folders : {}).length,
					select;
				
				bro.next().remove();
				if (cnt) {
					select = jQuery('<select class="ui-corner-all elfinder-tabstop" style="max-width:200px;">').append(
						jQuery(jQuery.map(folders, function(n,i){return '<option value="'+fm.escape((i+'').trim())+'">'+fm.escape(n)+'</option>';}).join(''))
					).on('change click', function(e){
						var node = jQuery(this),
							path = node.val(),
							spn;
						self.inputs.path.val(path);
						if (opts.folders && (e.type === 'change' || node.data('current') !== path)) {
							node.next().remove();
							node.data('current', path);
							if (path != opts.root) {
								spn = spinner();
								if (xhr && xhr.state() === 'pending') {
									fm.abortXHR(xhr, { quiet: true , abort: true });
								}
								node.after(spn);
								xhr = fm.request({
									data : {cmd : 'netmount', protocol: protocol, host: host, user: 'init', path: path, pass: 'folders'},
									preventDefault : true
								}).done(function(data){
									addFolders.call(self, fm, node, data.folders);
								}).always(function() {
									fm.abortXHR(xhr, { quiet: true });
									spn.remove();
								}).xhr;
							}
						}
					});
					bro.after(jQuery('<div></div>').append(select))
						.closest('.ui-dialog').trigger('tabstopsInit');
					select.trigger('focus');
				}
			},
			spinner = function() {
				return jQuery('<div class="elfinder-netmount-spinner"></div>').append('<span class="elfinder-spinner"></span>');
			},
			xhr;
		return {
			vars : {},
			name : name,
			inputs: {
				offline  : jQuery('<input type="checkbox"/>').on('change', function() {
					jQuery(this).parents('table.elfinder-netmount-tb').find('select:first').trigger('change', 'reset');
				}),
				host     : jQuery('<span><span class="elfinder-spinner"></span></span><input type="hidden"/>'),
				path     : jQuery('<input type="text" value="'+opts.root+'"/>'),
				user     : jQuery('<input type="hidden"/>'),
				pass     : jQuery('<input type="hidden"/>'),
				mnt2res  : jQuery('<input type="hidden"/>')
			},
			select: function(fm, ev, d){
				var f = this.inputs,
					oline = f.offline,
					f0 = jQuery(f.host[0]),
					data = d || null;
				this.vars.mbtn = f.host.closest('.ui-dialog').children('.ui-dialog-buttonpane:first').find('button.elfinder-btncnt-0');
				if (! f0.data('inrequest')
						&& (f0.find('span.elfinder-spinner').length
							|| data === 'reset'
							|| (data === 'winfocus' && ! f0.siblings('span.elfinder-button-icon-reload').length))
							)
				{
					if (oline.parent().children().length === 1) {
						f.path.parent().prev().html(fm.i18n(opts.pathI18n));
						oline.attr('title', fm.i18n('offlineAccess'));
						oline.uniqueId().after(jQuery('<label></label>').attr('for', oline.attr('id')).html(' '+fm.i18n('offlineAccess')));
					}
					f0.data('inrequest', true).empty().addClass('elfinder-spinner')
						.parent().find('span.elfinder-button-icon').remove();
					fm.request({
						data : {cmd : 'netmount', protocol: protocol, host: host, user: 'init', options: {id: fm.id, offline: oline.prop('checked')? 1:0, pass: f.host[1].value}},
						preventDefault : true
					}).done(function(data){
						f0.removeClass("elfinder-spinner").html(data.body.replace(/\{msg:([^}]+)\}/g, function(whole,s1){return fm.i18n(s1, host);}));
					});
					opts.noOffline && oline.closest('tr').hide();
				} else {
					oline.closest('tr')[(opts.noOffline || f.user.val())? 'hide':'show']();
					f0.data('funcexpup') && f0.data('funcexpup')();
				}
				this.vars.mbtn[jQuery(f.host[1]).val()? 'show':'hide']();
			},
			done: function(fm, data){
				var f = this.inputs,
					p = this.protocol,
					f0 = jQuery(f.host[0]),
					f1 = jQuery(f.host[1]),
					expires = '&nbsp;',
					vars = this.vars,
					chk = function() {
						if (vars.oauthW && !document.hasFocus() && --vars.chkCnt) {
							p.trigger('change', 'winfocus');
							vars.tm = setTimeout(chk, 3000);
						}
					},
					btn;
				
				opts.noOffline && f.offline.closest('tr').hide();
				if (data.mode == 'makebtn') {
					f0.removeClass('elfinder-spinner').removeData('expires').removeData('funcexpup');
					btn = f.host.find('input').on('mouseenter mouseleave', function(){jQuery(this).toggleClass('ui-state-hover');});
					if (data.url) {
						btn.on('click', function() {
							vars.tm && clearTimeout(vars.tm);
							vars.oauthW = window.open(data.url);
							// To correspond to safari, authentication tab sometimes not closing in CORS environment.
							// This may be a safari bug and may improve in the future.
							if ((fm.UA.iOS || fm.UA.Mac) && fm.isCORS && !vars.chkdone) {
								vars.chkCnt = 60;
								vars.tm = setTimeout(chk, 5000);
							}
						});
					}
					f1.val('');
					f.path.val(opts.root).next().remove();
					f.user.val('');
					f.pass.val('');
					! opts.noOffline && f.offline.closest('tr').show();
					vars.mbtn.hide();
				} else if (data.mode == 'folders') {
					if (data.folders) {
						addFolders.call(this, fm, f.path.nextAll(':last'), data.folders);
					}
				} else {
					if (vars.oauthW) {
						vars.tm && clearTimeout(vars.tm);
						vars.oauthW.close();
						delete vars.oauthW;
						// The problem that Safari's authentication tab doesn't close only affects the first time.
						vars.chkdone = true;
					}
					if (data.expires) {
						expires = '()';
						f0.data('expires', data.expires);
					}
					f0.html(host + expires).removeClass('elfinder-spinner');
					if (data.expires) {
						f0.data('funcexpup', function() {
							var rem = Math.floor((f0.data('expires') - (+new Date()) / 1000) / 60);
							if (rem < 3) {
								f0.parent().children('.elfinder-button-icon-reload').click();
							} else {
								f0.text(f0.text().replace(/\(.*\)/, '('+fm.i18n(['minsLeft', rem])+')'));
								setTimeout(function() {
									if (f0.is(':visible')) {
										f0.data('funcexpup')();
									}
								}, 60000);
							}
						});
						f0.data('funcexpup')();
					}
					if (data.reset) {
						p.trigger('change', 'reset');
						return;
					}
					f0.parent().append(jQuery('<span class="elfinder-button-icon elfinder-button-icon-reload" title="'+fm.i18n('reAuth')+'">')
						.on('click', function() {
							f1.val('reauth');
							p.trigger('change', 'reset');
						}));
					f1.val(protocol);
					vars.mbtn.show();
					if (data.folders) {
						addFolders.call(this, fm, f.path, data.folders);
					}
					if (data.mnt2res) {
						f.mnt2res.val('1');
					}
					f.user.val('done');
					f.pass.val('done');
					f.offline.closest('tr').hide();
				}
				f0.removeData('inrequest');
			},
			fail: function(fm, err){
				jQuery(this.inputs.host[0]).removeData('inrequest');
				this.protocol.trigger('change', 'reset');
			},
			integrateInfo: opts.integrate
		};
	},
	
	/**
	 * Find cwd's nodes from files
	 * 
	 * @param  Array    files
	 * @param  Object   opts   {firstOnly: true|false}
	 */
	findCwdNodes : function(files, opts) {
		var self    = this,
			cwd     = this.getUI('cwd'),
			cwdHash = this.cwd().hash,
			newItem = jQuery();
		
		opts = opts || {};
		
		jQuery.each(files, function(i, f) {
			if (f.phash === cwdHash || self.searchStatus.state > 1) {
				newItem = newItem.add(self.cwdHash2Elm(f.hash));
				if (opts.firstOnly) {
					return false;
				}
			}
		});
		
		return newItem;
	},
	
	/**
	 * Convert from relative URL to abstract URL based on current URL
	 * 
	 * @param  String  URL
	 * @return String
	 */
	convAbsUrl : function(url) {
		if (url.match(/^http/i)) {
			return url;
		}
		if (url.substr(0,2) === '//') {
			return window.location.protocol + url;
		}
		var root = window.location.protocol + '//' + window.location.host,
			reg  = /[^\/]+\/\.\.\//,
			ret;
		if (url.substr(0, 1) === '/') {
			ret = root + url;
		} else {
			ret = root + window.location.pathname.replace(/\/[^\/]+$/, '/') + url;
		}
		ret = ret.replace('/./', '/');
		while(reg.test(ret)) {
			ret = ret.replace(reg, '');
		}
		return ret;
	},
	
	/**
	 * Is same origin to current site
	 * 
	 * @param  String  check url
	 * @return Boolean
	 */
	isSameOrigin : function (checkUrl) {
		var url;
		checkUrl = this.convAbsUrl(checkUrl);
		if (location.origin && window.URL) {
			try {
				url = new URL(checkUrl);
				return location.origin === url.origin;
			} catch(e) {}
		}
		url = document.createElement('a');
		url.href = checkUrl;
		return location.protocol === url.protocol && location.host === url.host && location.port && url.port;
	},
	
	navHash2Id : function(hash) {
		return this.navPrefix + hash;
	},
	
	navId2Hash : function(id) {
		return typeof(id) == 'string' ? id.substr(this.navPrefix.length) : false;
	},
	
	cwdHash2Id : function(hash) {
		return this.cwdPrefix + hash;
	},
	
	cwdId2Hash : function(id) {
		return typeof(id) == 'string' ? id.substr(this.cwdPrefix.length) : false;
	},
	
	/**
	 * navHash to jQuery element object
	 *
	 * @param      String  hash    nav hash
	 * @return     Object  jQuery element object
	 */
	navHash2Elm : function(hash) {
		return jQuery(document.getElementById(this.navHash2Id(hash)));
	},

	/**
	 * cwdHash to jQuery element object
	 *
	 * @param      String  hash    cwd hash
	 * @return     Object  jQuery element object
	 */
	cwdHash2Elm : function(hash) {
		return jQuery(document.getElementById(this.cwdHash2Id(hash)));
	},

	isInWindow : function(elem, nochkHide) {
		var elm, rect;
		if (! (elm = elem.get(0))) {
			return false;
		}
		if (! nochkHide && elm.offsetParent === null) {
			return false;
		}
		rect = elm.getBoundingClientRect();
		return document.elementFromPoint(rect.left, rect.top)? true : false;
	},
	
	/**
	 * calculate elFinder node z-index
	 * 
	 * @return void
	 */
	zIndexCalc : function() {
		var self = this,
			node = this.getUI(),
			ni = node.css('z-index');
		if (ni && ni !== 'auto' && ni !== 'inherit') {
			self.zIndex = ni;
		} else {
			node.parents().each(function(i, n) {
				var z = jQuery(n).css('z-index');
				if (z !== 'auto' && z !== 'inherit' && (z = parseInt(z))) {
					self.zIndex = z;
					return false;
				}
			});
		}
	},
	
	/**
	 * Load JavaScript files
	 * 
	 * @param  Array    urls      to load JavaScript file URLs
	 * @param  Function callback  call back function on script loaded
	 * @param  Object   opts      Additional options to jQuery.ajax OR {loadType: 'tag'} to load by script tag
	 * @param  Object   check     { obj: (Object)ParentObject, name: (String)"Attribute name", timeout: (Integer)milliseconds }
	 * @return elFinder
	 */
	loadScript : function(urls, callback, opts, check) {
		var defOpts = {
				dataType : 'script',
				cache    : true
			},
			success, cnt, scripts = {}, results = {};
		
		opts = opts || {};
		if (opts.tryRequire && this.hasRequire) {
			require(urls, callback, opts.error);
		} else {
			success = function() {
				var cnt, fi, hasError;
				jQuery.each(results, function(i, status) {
					if (status !== 'success' && status !== 'notmodified') {
						hasError = true;
						return false;
					}
				});
				if (!hasError) {
					if (jQuery.isFunction(callback)) {
						if (check) {
							if (typeof check.obj[check.name] === 'undefined') {
								cnt = check.timeout? (check.timeout / 10) : 1;
								fi = setInterval(function() {
									if (--cnt < 0 || typeof check.obj[check.name] !== 'undefined') {
										clearInterval(fi);
										callback();
									}
								}, 10);
							} else {
								callback();
							}
						} else {
							callback();
						}
					}
				} else {
					if (opts.error && jQuery.isFunction(opts.error)) {
						opts.error({ loadResults: results });
					}
				}
			};

			if (opts.loadType === 'tag') {
				jQuery('head > script').each(function() {
					scripts[this.src] = this;
				});
				cnt = urls.length;
				jQuery.each(urls, function(i, url) {
					var done = false,
						script;
					
					if (scripts[url]) {
						results[i] = scripts[url]._error || 'success';
						(--cnt < 1) && success();
					} else {
						script = document.createElement('script');
						script.charset = opts.charset || 'UTF-8';
						jQuery('head').append(script);
						script.onload = script.onreadystatechange = function() {
							if ( !done && (!this.readyState ||
									this.readyState === 'loaded' || this.readyState === 'complete') ) {
								done = true;
								results[i] = 'success';
								(--cnt < 1) && success();
							}
						};
						script.onerror = function(err) {
							results[i] = script._error = (err && err.type)? err.type : 'error';
							(--cnt < 1) && success();
						};
						script.src = url;
					}
				});
			} else {
				opts = jQuery.isPlainObject(opts)? Object.assign(defOpts, opts) : defOpts;
				cnt = 0;
				(function appendScript(d, status) {
					if (d !== void(0)) {
						results[cnt++] = status;
					}
					if (urls.length) {
						jQuery.ajax(Object.assign({}, opts, {
							url: urls.shift(),
							success: appendScript,
							error: appendScript
						}));
					} else {
						success();
					}
				})();
			}
		}
		return this;
	},
	
	/**
	 * Load CSS files
	 * 
	 * @param  Array    to load CSS file URLs
	 * @param  Object   options
	 * @return elFinder
	 */
	loadCss : function(urls, opts) {
		var self = this,
			clName, dfds;
		if (typeof urls === 'string') {
			urls = [ urls ];
		}
		if (opts) {
			if (opts.className) {
				clName = opts.className;
			}
			if (opts.dfd && opts.dfd.promise) {
				dfds = [];
			}
		}
		jQuery.each(urls, function(i, url) {
			var link, df;
			url = self.convAbsUrl(url).replace(/^https?:/i, '');
			if (dfds) {
				dfds[i] = jQuery.Deferred();
			}
			if (! jQuery('head > link[href="' + self.escape(url) + '"]').length) {
				link = document.createElement('link');
				link.type = 'text/css';
				link.rel = 'stylesheet';
				link.href = url;
				if (clName) {
					link.className = clName;
				}
				if (dfds) {
					link.onload = function() {
						dfds[i].resolve();
					};
					link.onerror = function() {
						dfds[i].reject();
					};
				}
				jQuery('head').append(link);
			} else {
				dfds && dfds[i].resolve();
			}
		});
		if (dfds) {
			jQuery.when.apply(null, dfds).done(function() {
				opts.dfd.resolve();
			}).fail(function() {
				opts.dfd.reject();
			});
		}
		return this;
	},
	
	/**
	 * Abortable async job performer
	 * 
	 * @param func Function
	 * @param arr  Array
	 * @param opts Object
	 * 
	 * @return Object jQuery.Deferred that has an extended method _abort()
	 */
	asyncJob : function(func, arr, opts) {
		var dfrd = jQuery.Deferred(),
			abortFlg = false,
			parms = Object.assign({
				interval : 0,
				numPerOnce : 1
			}, opts || {}),
			resArr = [],
			vars =[],
			curVars = [],
			exec,
			tm;
		
		dfrd._abort = function(resolve) {
			tm && clearTimeout(tm);
			vars = [];
			abortFlg = true;
			if (dfrd.state() === 'pending') {
				dfrd[resolve? 'resolve' : 'reject'](resArr);
			}
		};
		
		dfrd.fail(function() {
			dfrd._abort();
		}).always(function() {
			dfrd._abort = function() {};
		});

		if (typeof func === 'function' && Array.isArray(arr)) {
			vars = arr.concat();
			exec = function() {
				var i, len, res;
				if (abortFlg) {
					return;
				}
				curVars = vars.splice(0, parms.numPerOnce);
				len = curVars.length;
				for (i = 0; i < len; i++) {
					if (abortFlg) {
						break;
					}
					res = func(curVars[i]);
					(res !== null) && resArr.push(res);
				}
				if (abortFlg) {
					return;
				}
				if (vars.length) {
					tm = setTimeout(exec, parms.interval);
				} else {
					dfrd.resolve(resArr);
				}
			};
			if (vars.length) {
				tm = setTimeout(exec, 0);
			} else {
				dfrd.resolve(resArr);
			}
		} else {
			dfrd.reject();
		}
		return dfrd;
	},
	
	getSize : function(targets) {
		var self = this,
			reqs = [],
			tgtlen = targets.length,
			dfrd = jQuery.Deferred().fail(function() {
				jQuery.each(reqs, function(i, req) {
					if (req) {
						req.syncOnFail && req.syncOnFail(false);
						req.reject();
					}
				});
			}),
			getLeafRoots = function(file) {
				var targets = [];
				if (file.mime === 'directory') {
					jQuery.each(self.leafRoots, function(hash, roots) {
						var phash;
						if (hash === file.hash) {
							targets.push.apply(targets, roots);
						} else {
							phash = (self.file(hash) || {}).phash;
							while(phash) {
								if (phash === file.hash) {
									targets.push.apply(targets, roots);
								}
								phash = (self.file(phash) || {}).phash;
							}
						}
					});
				}
				return targets;
			},
			checkPhash = function(hash) {
				var dfd = jQuery.Deferred(),
					dir = self.file(hash),
					target = dir? dir.phash : hash;
				if (target && ! self.file(target)) {
					self.request({
						data : {
							cmd    : 'parents',
							target : target
						},
						preventFail : true
					}).done(function() {
						self.one('parentsdone', function() {
							dfd.resolve();
						});
					}).fail(function() {
						dfd.resolve();
					});
				} else {
					dfd.resolve();
				}
				return dfd;
			},
			cache = function() {
				var dfd = jQuery.Deferred(),
					cnt = Object.keys(self.leafRoots).length;
				
				if (cnt > 0) {
					jQuery.each(self.leafRoots, function(hash) {
						checkPhash(hash).done(function() {
							--cnt;
							if (cnt < 1) {
								dfd.resolve();
							}
						});
					});
				} else {
					dfd.resolve();
				}
				return dfd;
			};

		self.autoSync('stop');
		cache().done(function() {
			var files = [], grps = {}, dfds = [], cache = [], singles = {};
			
			jQuery.each(targets, function() {
				files.push.apply(files, getLeafRoots(self.file(this)));
			});
			targets.push.apply(targets, files);
			
			jQuery.each(targets, function() {
				var root = self.root(this),
					file = self.file(this);
				if (file && (file.sizeInfo || file.mime !== 'directory')) {
					cache.push(jQuery.Deferred().resolve(file.sizeInfo? file.sizeInfo : {size: file.size, dirCnt: 0, fileCnt : 1}));
				} else {
					if (! grps[root]) {
						grps[root] = [ this.toString() ];
					} else {
						grps[root].push(this.toString());
					}
				}
			});
			
			jQuery.each(grps, function() {
				var idx = dfds.length;
				if (this.length === 1) {
					singles[idx] = this[0];
				}
				dfds.push(self.request({
					data : {cmd : 'size', targets : this},
					preventDefault : true
				}));
			});
			reqs.push.apply(reqs, dfds);
			dfds.push.apply(dfds, cache);
			
			jQuery.when.apply($, dfds).fail(function() {
				dfrd.reject();
			}).done(function() {
				var cache = function(h, data) {
						var file;
						if (file = self.file(h)) {
							file.sizeInfo = { isCache: true };
							jQuery.each(['size', 'dirCnt', 'fileCnt'], function() {
								file.sizeInfo[this] = data[this] || 0;
							});
							file.size = parseInt(file.sizeInfo.size);
							changed.push(file);
						}
					},
					size = 0,
					fileCnt = 0,
					dirCnt = 0,
					argLen = arguments.length,
					cnts = [],
					cntsTxt = '',
					changed = [],
					i, file, data;
				
				for (i = 0; i < argLen; i++) {
					data = arguments[i];
					file = null;
					if (!data.isCache) {
						if (singles[i] && (file = self.file(singles[i]))) {
							cache(singles[i], data);
						} else if (data.sizes && jQuery.isPlainObject(data.sizes)) {
							jQuery.each(data.sizes, function(h, sizeInfo) {
								cache(h, sizeInfo);
							});
						}
					}
					size += parseInt(data.size);
					if (fileCnt !== false) {
						if (typeof data.fileCnt === 'undefined') {
							fileCnt = false;
						} else {
							fileCnt += parseInt(data.fileCnt || 0);
						}
					}
					if (dirCnt !== false) {
						if (typeof data.dirCnt === 'undefined') {
							dirCnt = false;
						} else {
							dirCnt += parseInt(data.dirCnt || 0);
						}
					}
				}
				changed.length && self.change({changed: changed});
				
				if (dirCnt !== false){
					cnts.push(self.i18n('folders') + ': ' + (dirCnt - (tgtlen > 1? 0 : 1)));
				}
				if (fileCnt !== false){
					cnts.push(self.i18n('files') + ': ' + fileCnt);
				}
				if (cnts.length) {
					cntsTxt = '<br>' + cnts.join(', ');
				}
				dfrd.resolve({
					size: size,
					fileCnt: fileCnt,
					dirCnt: dirCnt,
					formated: (size >= 0 ? self.formatSize(size) : self.i18n('unknown')) + cntsTxt
				});
			});
			
			self.autoSync();
		});
		
		return dfrd;
	},

	/**
	 * Worker Object URL for Blob URL of getWorker()
	 */
	wkObjUrl : null,

	/**
	 * Gets the web worker.
	 *
	 * @param      {Object}  options  The options
	 * @return     {Worker}  The worker.
	 */
	getWorker : function(options){
		// for to make blob URL
		function woker() {
			self.onmessage = function(e) {
				var d = e.data;
				try {
					self.data = d.data;
					if (d.scripts) {
						for(var i = 0; i < d.scripts.length; i++) {
							importScripts(d.scripts[i]);
						}
					}
					self.postMessage(self.res);
				} catch (e) {
					self.postMessage({error: e.toString()});
				}
			};
		}
		// get woker
		var wk;
		try {
			if (!this.wkObjUrl) {
				this.wkObjUrl = (window.URL || window.webkitURL).createObjectURL(new Blob(
					[woker.toString().replace(/\s+/g, ' ').replace(/ *([^\w]) */g, '$1').replace(/^function\b.+?\{|\}$/g, '')],
					{ type:'text/javascript' }
				));
			}
			wk = new Worker(this.wkObjUrl, options);
		} catch(e) {
			this.debug('error', e.toString());
		}
		return wk;
	},

	/**
	 * Get worker absolute URL by filename
	 *
	 * @param      {string}  filename  The filename
	 * @return     {<type>}  The worker url.
	 */
	getWorkerUrl : function(filename) {
		return this.convAbsUrl(this.baseUrl + 'js/worker/' + filename);
	},

	/**
	 * Gets the theme object by settings of options.themes
	 *
	 * @param  String  themeid  The themeid
	 * @return Object  jQuery.Deferred
	 */
	getTheme : function(themeid) {
		var self = this,
			dfd = jQuery.Deferred(),
			absUrl = function(url, base) {
				if (!base) {
					base = self.convAbsUrl(self.baseUrl);
				}
				if (Array.isArray(url)) {
					return jQuery.map(url, function(v) {
						return absUrl(v, base);
					});
				} else {
					return url.match(/^(?:http|\/\/)/i)? url : base + url.replace(/^(?:\.\/|\/)/, '');
				}
			},
			themeObj, m;
		if (themeid && (themeObj = self.options.themes[themeid])) {
			if (typeof themeObj === 'string') {
				url = absUrl(themeObj);
				if (m = url.match(/^(.+\/)[^/]+\.json$/i)) {
					jQuery.getJSON(url).done(function(data) {
						themeObj = data;
						themeObj.id = themeid;
						if (themeObj.cssurls) {
							themeObj.cssurls = absUrl(themeObj.cssurls, m[1]);
						}
						dfd.resolve(themeObj);
					}).fail(function() {
						dfd.reject();
					});
				} else {
					dfd.resolve({
						id: themeid,
						name: themeid,
						cssurls: [url]
					});
				}
			} else if (jQuery.isPlainObject(themeObj) && themeObj.cssurls) {
				themeObj.id = themeid;
				themeObj.cssurls = absUrl(themeObj.cssurls);
				if (!Array.isArray(themeObj.cssurls)) {
					themeObj.cssurls = [themeObj.cssurls];
				}
				if (!themeObj.name) {
					themeObj.name = themeid;
				}
				dfd.resolve(themeObj);
			} else {
				dfd.reject();
			}
		} else {
			dfd.reject();
		}
		return dfd;
	},

	/**
	 * Change current theme
	 *
	 * @param  String  themeid  The themeid
	 * @return Object  this elFinder instance
	 */
	changeTheme : function(themeid) {
		var self = this;
		if (themeid) {
			if (self.options.themes[themeid] && (!self.theme || self.theme.id !== themeid)) {
				self.getTheme(themeid).done(function(themeObj) {
					if (themeObj.cssurls) {
						jQuery('head>link.elfinder-theme-ext').remove();
						self.loadCss(themeObj.cssurls, {
							className: 'elfinder-theme-ext',
							dfd: jQuery.Deferred().done(function() {
								self.theme = themeObj;
								self.trigger && self.trigger('themechange');
							})
						});
					}
				});
			} else if (themeid === 'default' && self.theme && self.theme.id !== 'default') {
				jQuery('head>link.elfinder-theme-ext').remove();
				self.theme = null;
				self.trigger && self.trigger('themechange');
			}
		}
		return this;
	},

	/**
	 * Apply leaf root stats to target directory
	 *
	 * @param      object     dir     object of target directory
	 * @param      boolean    update  is force update
	 * 
	 * @return     boolean    dir object was chenged 
	 */
	applyLeafRootStats : function(dir, update) {
		var self = this,
			prev = update? dir : (self.file(dir.hash) || dir),
			prevTs = prev.ts,
			change = false;
		// backup original stats
		if (update || !dir._realStats) {
			dir._realStats = {
				locked: dir.locked || 0,
				dirs: dir.dirs || 0,
				ts: dir.ts
			};
		}
		// set lock
		dir.locked = 1;
		if (!prev.locked) {
			change = true;
		}
		// has leaf root to `dirs: 1`
		dir.dirs = 1;
		if (!prev.dirs) {
			change = true;
		}
		// set ts
		jQuery.each(self.leafRoots[dir.hash], function() {
			var f = self.file(this);
			if (f && f.ts && (dir.ts || 0) < f.ts) {
				dir.ts = f.ts;
			}
		});
		if (prevTs !== dir.ts) {
			change = true;
		}

		return change;
	},

	/**
	 * To aborted XHR object
	 * 
	 * @param Object xhr
	 * @param Object opts
	 * 
	 * @return void
	 */
	abortXHR : function(xhr, o) {
		var opts = o || {};
		
		if (xhr) {
			opts.quiet && (xhr.quiet = true);
			if (opts.abort && xhr._requestId) {
				this.request({
					data: {
						cmd: 'abort',
						id: xhr._requestId
					},
					preventDefault: true
				});
			}
			xhr.abort();
			xhr = void 0;
		}
	},

	/**
	 * Sets the custom header by xhr response header with options.parrotHeaders
	 *
	 * @param Object xhr
	 * 
	 * @return void
	 */
	setCustomHeaderByXhr : function(xhr) {
		var self = this;
		if (xhr.getResponseHeader && self.parrotHeaders && self.parrotHeaders.length) {
			jQuery.each(self.parrotHeaders, function(i, h) {
				var val = xhr.getResponseHeader(h);
				if (val) {
					self.customHeaders[h] = val;
					self.sessionStorage('core-ph:'+h, val);
				} else if (typeof val === 'string') {
					delete self.customHeaders[h];
					self.sessionStorage('core-ph:'+h, null);
				}
			});
		}
	},

	/**
	 * Determines if parrot headers.
	 *
	 * @return     {boolean}  True if parrot headers, False otherwise.
	 */
	hasParrotHeaders : function() {
		var res = false,
			phs = this.parrotHeaders;
		if (Object.keys(this.customHeaders).length) {
			for (var i = 0; i < phs.length; i++) {
				if (this.customHeaders[phs[i]]) {
					res = true;
					break;
				}
			}
		}
		return res;
	},

	/**
	 * Gets the request identifier
	 *
	 * @return  String  The request identifier.
	 */
	getRequestId : function() {
		return (+ new Date()).toString(16) + Math.floor(1000 * Math.random()).toString(16);
	},
	
	/**
	 * Flip key and value of array or object
	 * 
	 * @param  Array | Object  { a: 1, b: 1, c: 2 }
	 * @param  Mixed           Static value
	 * @return Object          { 1: "b", 2: "c" }
	 */
	arrayFlip : function (trans, val) {
		var key,
			tmpArr = {},
			isArr = jQuery.isArray(trans);
		for (key in trans) {
			if (isArr || trans.hasOwnProperty(key)) {
				tmpArr[trans[key]] = val || key;
			}
		}
		return tmpArr;
	},
	
	/**
	 * Return array ["name without extention", "extention"]
	 * 
	 * @param String name
	 * 
	 * @return Array
	 * 
	 */
	splitFileExtention : function(name) {
		var m;
		if (m = name.match(/^(.+?)?\.((?:tar\.(?:gz|bz|bz2|z|lzo))|cpio\.gz|ps\.gz|xcf\.(?:gz|bz2)|[a-z0-9]{1,10})$/i)) {
			if (typeof m[1] === 'undefined') {
				m[1] = '';
			}
			return [m[1], m[2]];
		} else {
			return [name, ''];
		}
	},
	
	/**
	 * Slice the ArrayBuffer by sliceSize
	 *
	 * @param      arraybuffer  arrayBuffer  The array buffer
	 * @param      Number       sliceSize    The slice size
	 * @return     Array   Array of sleced arraybuffer
	 */
	sliceArrayBuffer : function(arrayBuffer, sliceSize) {
		var segments= [],
			fi = 0;
		while(fi * sliceSize < arrayBuffer.byteLength){
			segments.push(arrayBuffer.slice(fi * sliceSize, (fi + 1) * sliceSize));
			fi++;
		}
		return segments;
	},

	arrayBufferToBase64 : function(ab) {
		if (!window.btoa) {
			return '';
		}
		var dView = new Uint8Array(ab), // Get a byte view
			arr = Array.prototype.slice.call(dView), // Create a normal array
			arr1 = arr.map(function(item) {
				return String.fromCharCode(item); // Convert
			});
	    return window.btoa(arr1.join('')); // Form a string
	},

	log : function(m) { window.console && window.console.log && window.console.log(m); return this; },
	
	debug : function(type, m) {
		var self = this,
			d = this.options.debug,
			tb = this.options.toastBackendWarn,
			tbOpts, showlog;

		if (type === 'backend-error') {
			if (! this.cwd().hash || (d && (d === 'all' || d['backend-error']))) {
				m = Array.isArray(m)? m : [ m ];
				this.error(m);
			}
		} else if (type === 'backend-warning') {
			showlog = true;
			if (tb) {
				tbOpts = jQuery.isPlainObject(tb)? tb : {};
				jQuery.each(Array.isArray(m)? m : [ m ], function(i, m) {
					self.toast(Object.assign({
						mode : 'warning',
						msg: m
					}, tbOpts));
				});
			}
		} else if (type === 'backend-debug') {
			this.trigger('backenddebug', m);
		}
		
		if (showlog || (d && (d === 'all' || d[type]))) {
			window.console && window.console.log && window.console.log('elfinder debug: ['+type+'] ['+this.id+']', m);
		}

		return this;
	},

	/**
	 * Parse response.debug and trigger debug
	 *
	 * @param      Object  response  The response
	 */
	responseDebug : function(response) {
		var rd = response.debug,
			d;
		if (rd) {
			// set options.debug
			d = this.options.debug;
			if (!d || d !== 'all') {
				if (!d) {
					d = this.options.debug = {};
				}
				d['backend-error'] = true;
				d['warning'] = true;
			}
			if (rd.mountErrors && (typeof rd.mountErrors === 'string' || (Array.isArray(rd.mountErrors) && rd.mountErrors.length))) {
				this.debug('backend-error', rd.mountErrors);
			}
			if (rd.backendErrors && (typeof rd.backendErrors === 'string' || (Array.isArray(rd.backendErrors) && rd.backendErrors.length))) {
				this.debug('backend-warning', rd.backendErrors);
			}
		}
	},

	time : function(l) { window.console && window.console.time && window.console.time(l); },
	timeEnd : function(l) { window.console && window.console.timeEnd && window.console.timeEnd(l); }
	

};

/**
 * for conpat ex. ie8...
 *
 * Object.keys() - JavaScript | MDN
 * https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
 */
if (!Object.keys) {
	Object.keys = (function () {
		var hasOwnProperty = Object.prototype.hasOwnProperty,
				hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),
				dontEnums = [
					'toString',
					'toLocaleString',
					'valueOf',
					'hasOwnProperty',
					'isPrototypeOf',
					'propertyIsEnumerable',
					'constructor'
				],
				dontEnumsLength = dontEnums.length;

		return function (obj) {
			if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null) throw new TypeError('Object.keys called on non-object');

			var result = [];

			for (var prop in obj) {
				if (hasOwnProperty.call(obj, prop)) result.push(prop);
			}

			if (hasDontEnumBug) {
				for (var i=0; i < dontEnumsLength; i++) {
					if (hasOwnProperty.call(obj, dontEnums[i])) result.push(dontEnums[i]);
				}
			}
			return result;
		};
	})();
}
// Array.isArray
if (!Array.isArray) {
	Array.isArray = function(arr) {
		return jQuery.isArray(arr);
	};
}
// Object.assign
if (!Object.assign) {
	Object.assign = function() {
		return jQuery.extend.apply(null, arguments);
	};
}
// String.repeat
if (!String.prototype.repeat) {
	String.prototype.repeat = function(count) {
		'use strict';
		if (this == null) {
			throw new TypeError('can\'t convert ' + this + ' to object');
		}
		var str = '' + this;
		count = +count;
		if (count != count) {
			count = 0;
		}
		if (count < 0) {
			throw new RangeError('repeat count must be non-negative');
		}
		if (count == Infinity) {
			throw new RangeError('repeat count must be less than infinity');
		}
		count = Math.floor(count);
		if (str.length == 0 || count == 0) {
			return '';
		}
		// Ensuring count is a 31-bit integer allows us to heavily optimize the
		// main part. But anyway, most current (August 2014) browsers can't handle
		// strings 1 << 28 chars or longer, so:
		if (str.length * count >= 1 << 28) {
			throw new RangeError('repeat count must not overflow maximum string size');
		}
		var rpt = '';
		for (var i = 0; i < count; i++) {
			rpt += str;
		}
		return rpt;
	};
}
// String.trim
if (!String.prototype.trim) {
	String.prototype.trim = function() {
		return this.replace(/^\s+|\s+$/g, '');
	};
}
// Array.apply
(function () {
	try {
		Array.apply(null, {});
		return;
	} catch (e) { }

	var toString = Object.prototype.toString,
		arrayType = '[object Array]',
		_apply = Function.prototype.apply,
		slice = /*@cc_on @if (@_jscript_version <= 5.8)
			function () {
				var a = [], i = this.length;
				while (i-- > 0) a[i] = this[i];
				return a;
			}@else@*/Array.prototype.slice/*@end@*/;

	Function.prototype.apply = function apply(thisArg, argArray) {
		return _apply.call(this, thisArg,
			toString.call(argArray) === arrayType ? argArray : slice.call(argArray));
	};
})();
// Array.from
if (!Array.from) {
	Array.from = function(obj) {
		return obj.length === 1 ? [obj[0]] : Array.apply(null, obj);
	};
}
// window.requestAnimationFrame and window.cancelAnimationFrame
if (!window.cancelAnimationFrame) {
// http://paulirish.com/2011/requestanimationframe-for-smart-animating/
// http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating
// requestAnimationFrame polyfill by Erik Möller. fixes from Paul Irish and Tino Zijdel
// MIT license
(function() {
    var lastTime = 0;
    var vendors = ['ms', 'moz', 'webkit', 'o'];
    for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
        window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];
        window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame'] 
                                   || window[vendors[x]+'CancelRequestAnimationFrame'];
    }
 
    if (!window.requestAnimationFrame)
        window.requestAnimationFrame = function(callback, element) {
            var currTime = new Date().getTime();
            var timeToCall = Math.max(0, 16 - (currTime - lastTime));
            var id = window.setTimeout(function() { callback(currTime + timeToCall); }, 
              timeToCall);
            lastTime = currTime + timeToCall;
            return id;
        };
 
    if (!window.cancelAnimationFrame)
        window.cancelAnimationFrame = function(id) {
            clearTimeout(id);
        };
}());
}
js/elfinder.full.js000064400003676673151215013370010301 0ustar00/*!
 * elFinder - file manager for web
 * Version 2.1.49 (2019-04-14)
 * http://elfinder.org
 * 
 * Copyright 2009-2019, Studio 42
 * Licensed under a 3-clauses BSD license
 */
(function(root, factory) {
	if (typeof define === 'function' && define.amd) {
		// AMD
		define(['jquery','jquery-ui'], factory);
	} else if (typeof exports !== 'undefined') {
		// CommonJS
		var $, ui;
		try {
			$ = require('jquery');
			ui = require('jquery-ui');
		} catch (e) {}
		module.exports = factory($, ui);
	} else {
		// Browser globals (Note: root is window)
		factory(root.jQuery, root.jQuery.ui, true);
	}
}(this, function($, _ui, toGlobal) {
toGlobal = toGlobal || false;


/*
 * File: /js/elFinder.js
 */

/**
 * @class elFinder - file manager for web
 *
 * @author Dmitry (dio) Levashov
 **/
var elFinder = function(elm, opts, bootCallback) {
		//this.time('load');
	var self = this,
		
		/**
		 * Objects array of jQuery.Deferred that calls before elFinder boot up
		 * 
		 * @type Array
		 */
		dfrdsBeforeBootup = [],
		
		/**
		 * Plugin name to check for conflicts with bootstrap etc
		 *
		 * @type Array
		 **/
		conflictChecks = ['button', 'tooltip'],
		
		/**
		 * Node on which elfinder creating
		 *
		 * @type jQuery
		 **/
		node = jQuery(elm),
		
		/**
		 * Object of events originally registered in this node
		 * 
		 * @type Object
		 */
		prevEvents = jQuery.extend(true, {}, jQuery._data(node.get(0), 'events')),
		
		/**
		 * Store node contents.
		 *
		 * @see this.destroy
		 * @type jQuery
		 **/
		prevContent = jQuery('<div/>').append(node.contents()).attr('class', node.attr('class') || '').attr('style', node.attr('style') || ''),
		
		/**
		 * Instance ID. Required to get/set cookie
		 *
		 * @type String
		 **/
		id = node.attr('id') || '',
		
		/**
		 * Events namespace
		 *
		 * @type String
		 **/
		namespace = 'elfinder-' + (id ? id : Math.random().toString().substr(2, 7)),
		
		/**
		 * Mousedown event
		 *
		 * @type String
		 **/
		mousedown = 'mousedown.'+namespace,
		
		/**
		 * Keydown event
		 *
		 * @type String
		 **/
		keydown = 'keydown.'+namespace,
		
		/**
		 * Keypress event
		 *
		 * @type String
		 **/
		keypress = 'keypress.'+namespace,
		
		/**
		 * Keypup event
		 *
		 * @type String
		 **/
		keyup    = 'keyup.'+namespace,

		/**
		 * Is shortcuts/commands enabled
		 *
		 * @type Boolean
		 **/
		enabled = false,
		
		/**
		 * Store enabled value before ajax request
		 *
		 * @type Boolean
		 **/
		prevEnabled = false,
		
		/**
		 * List of build-in events which mapped into methods with same names
		 *
		 * @type Array
		 **/
		events = ['enable', 'disable', 'load', 'open', 'reload', 'select',  'add', 'remove', 'change', 'dblclick', 'getfile', 'lockfiles', 'unlockfiles', 'selectfiles', 'unselectfiles', 'dragstart', 'dragstop', 'search', 'searchend', 'viewchange'],
		
		/**
		 * Rules to validate data from backend
		 *
		 * @type Object
		 **/
		rules = {},
		
		/**
		 * Current working directory hash
		 *
		 * @type String
		 **/
		cwd = '',
		
		/**
		 * Current working directory options default
		 *
		 * @type Object
		 **/
		cwdOptionsDefault = {
			path          : '',
			url           : '',
			tmbUrl        : '',
			disabled      : [],
			separator     : '/',
			archives      : [],
			extract       : [],
			copyOverwrite : true,
			uploadOverwrite : true,
			uploadMaxSize : 0,
			jpgQuality    : 100,
			tmbCrop       : false,
			tmb           : false // old API
		},
		
		/**
		 * Current working directory options
		 *
		 * @type Object
		 **/
		cwdOptions = {},
		
		/**
		 * Files/dirs cache
		 *
		 * @type Object
		 **/
		files = {},
		
		/**
		 * Hidden Files/dirs cache
		 *
		 * @type Object
		 **/
		hiddenFiles = {},

		/**
		 * Files/dirs hash cache of each dirs
		 *
		 * @type Object
		 **/
		ownFiles = {},
		
		/**
		 * Selected files hashes
		 *
		 * @type Array
		 **/
		selected = [],
		
		/**
		 * Events listeners
		 *
		 * @type Object
		 **/
		listeners = {},
		
		/**
		 * Shortcuts
		 *
		 * @type Object
		 **/
		shortcuts = {},
		
		/**
		 * Buffer for copied files
		 *
		 * @type Array
		 **/
		clipboard = [],
		
		/**
		 * Copied/cuted files hashes
		 * Prevent from remove its from cache.
		 * Required for dispaly correct files names in error messages
		 *
		 * @type Object
		 **/
		remember = {},
		
		/**
		 * Queue for 'open' requests
		 *
		 * @type Array
		 **/
		queue = [],
		
		/**
		 * Queue for only cwd requests e.g. `tmb`
		 *
		 * @type Array
		 **/
		cwdQueue = [],
		
		/**
		 * Commands prototype
		 *
		 * @type Object
		 **/
		base = new self.command(self),
		
		/**
		 * elFinder node width
		 *
		 * @type String
		 * @default "auto"
		 **/
		width  = 'auto',
		
		/**
		 * elFinder node height
		 * Number: pixcel or String: Number + "%"
		 *
		 * @type Number | String
		 * @default 400
		 **/
		height = 400,
		
		/**
		 * Base node object or selector
		 * Element which is the reference of the height percentage
		 *
		 * @type Object|String
		 * @default null | jQuery(window) (if height is percentage)
		 **/
		heightBase = null,
		
		/**
		 * MIME type list(Associative array) handled as a text file
		 * 
		 * @type Object|null
		 */
		textMimes = null,
		
		/**
		 * elfinder path for sound played on remove
		 * @type String
		 * @default ./sounds/
		 **/
		soundPath = 'sounds/',
		
		/**
		 * JSON.stringify of previous fm.sorters
		 * @type String
		 */
		prevSorterStr = '',

		/**
		 * Map table of file extention to MIME-Type
		 * @type Object
		 */
		extToMimeTable,

		beeper = jQuery(document.createElement('audio')).hide().appendTo('body')[0],
			
		syncInterval,
		autoSyncStop = 0,
		
		uiCmdMapPrev = '',
		
		gcJobRes = null,
		
		open = function(data) {
			// NOTES: Do not touch data object
		
			var volumeid, contextmenu, emptyDirs = {}, stayDirs = {},
				rmClass, hashes, calc, gc, collapsed, prevcwd, sorterStr;
			
			if (self.api >= 2.1) {
				// support volume driver option `uiCmdMap`
				self.commandMap = (data.options.uiCmdMap && Object.keys(data.options.uiCmdMap).length)? data.options.uiCmdMap : {};
				if (uiCmdMapPrev !== JSON.stringify(self.commandMap)) {
					uiCmdMapPrev = JSON.stringify(self.commandMap);
				}
			} else {
				self.options.sync = 0;
			}
			
			if (data.init) {
				// init - reset cache
				files = {};
				ownFiles = {};
			} else {
				// remove only files from prev cwd
				// and collapsed directory (included 100+ directories) to empty for perfomance tune in DnD
				prevcwd = cwd;
				rmClass = 'elfinder-subtree-loaded ' + self.res('class', 'navexpand');
				collapsed = self.res('class', 'navcollapse');
				hashes = Object.keys(files);
				calc = function(i) {
					if (!files[i]) {
						return true;
					}
					
					var isDir = (files[i].mime === 'directory'),
						phash = files[i].phash,
						pnav;
						
					if (
						(!isDir
							|| emptyDirs[phash]
							|| (!stayDirs[phash]
								&& self.navHash2Elm(files[i].hash).is(':hidden')
								&& self.navHash2Elm(phash).next('.elfinder-navbar-subtree').children().length > 100
							)
						)
						&& (isDir || phash !== cwd)
						&& ! remember[i]
					) {
						if (isDir && !emptyDirs[phash]) {
							emptyDirs[phash] = true;
							self.navHash2Elm(phash)
							 .removeClass(rmClass)
							 .next('.elfinder-navbar-subtree').empty();
						}
						deleteCache(files[i]);
					} else if (isDir) {
						stayDirs[phash] = true;
					}
				};
				gc = function() {
					if (hashes.length) {
						gcJobRes && gcJobRes._abort();
						gcJobRes = self.asyncJob(calc, hashes, {
							interval : 20,
							numPerOnce : 100
						}).done(function() {
							var hd = self.storage('hide') || {items: {}};
							if (Object.keys(hiddenFiles).length) {
								jQuery.each(hiddenFiles, function(h) {
									if (!hd.items[h]) {
										delete hiddenFiles[h];
									}
								});
							}
						});
					}
				};
				
				self.trigger('filesgc').one('filesgc', function() {
					hashes = [];
				});
				
				self.one('opendone', function() {
					if (prevcwd !== cwd) {
						if (! node.data('lazycnt')) {
							gc();
						} else {
							self.one('lazydone', gc);
						}
					}
				});
			}

			self.sorters = {};
			cwd = data.cwd.hash;
			cache(data.files);
			if (!files[cwd]) {
				cache([data.cwd]);
			}

			// trigger event 'sorterupdate'
			sorterStr = JSON.stringify(self.sorters);
			if (prevSorterStr !== sorterStr) {
				self.trigger('sorterupdate');
				prevSorterStr = sorterStr;
			}

			self.lastDir(cwd);
			
			self.autoSync();
		},
		
		/**
		 * Store info about files/dirs in "files" object.
		 *
		 * @param  Array  files
		 * @param  String data type
		 * @return void
		 **/
		cache = function(data, type) {
			var defsorter = { name: true, perm: true, date: true,  size: true, kind: true },
				sorterChk = !self.sorters._checked,
				l         = data.length,
				setSorter = function(file) {
					var f = file || {},
						sorters = [];
					jQuery.each(self.sortRules, function(key) {
						if (defsorter[key] || typeof f[key] !== 'undefined' || (key === 'mode' && typeof f.perm !== 'undefined')) {
							sorters.push(key);
						}
					});
					self.sorters = self.arrayFlip(sorters, true);
					self.sorters._checked = true;
				},
				keeps = ['sizeInfo'],
				changedParents = {},
				hideData = self.storage('hide') || {},
				hides = hideData.items || {},
				f, i, keepProp, parents, hidden;

			for (i = 0; i < l; i++) {
				f = Object.assign({}, data[i]);
				hidden = (!hideData.show && hides[f.hash])? true : false;
				if (f.name && f.hash && f.mime) {
					if (!hidden) {
						if (sorterChk && f.phash === cwd) {
							setSorter(f);
							sorterChk = false;
						}
						
						if (f.phash && (type === 'add' || type === 'change')) {
							if (parents = self.parents(f.phash)) {
								jQuery.each(parents, function() {
									changedParents[this] = true;
								});
							}
						}
					}

					if (files[f.hash]) {
						jQuery.each(keeps, function() {
							if(files[f.hash][this] && ! f[this]) {
								f[this] = files[f.hash][this];
							}
						});
						if (f.sizeInfo && !f.size) {
							f.size = f.sizeInfo.size;
						}
						deleteCache(files[f.hash], true);
					}
					if (hides[f.hash]) {
						hiddenFiles[f.hash] = f;
					}
					if (hidden) {
						l--;
						data.splice(i--, 1);
					} else {
						files[f.hash] = f;
						if (f.mime === 'directory' && !ownFiles[f.hash]) {
							ownFiles[f.hash] = {};
						}
						if (f.phash) {
							if (!ownFiles[f.phash]) {
								ownFiles[f.phash] = {};
							}
							ownFiles[f.phash][f.hash] = true;
						}
					}
				}
			}
			// delete sizeInfo cache
			jQuery.each(Object.keys(changedParents), function() {
				var target = files[this];
				if (target && target.sizeInfo) {
					delete target.sizeInfo;
				}
			});
			
			// for empty folder
			sorterChk && setSorter();
		},
		
		/**
		 * Delete file object from files caches
		 * 
		 * @param  Array  removed hashes
		 * @return void
		 */
		remove = function(removed) {
			var l       = removed.length,
				roots   = {},
				rm      = function(hash) {
					var file = files[hash], i;
					if (file) {
						if (file.mime === 'directory') {
							if (roots[hash]) {
								delete self.roots[roots[hash]];
							}
							// restore stats of deleted root parent directory
							jQuery.each(self.leafRoots, function(phash, roots) {
								var idx, pdir;
								if ((idx = jQuery.inArray(hash, roots))!== -1) {
									if (roots.length === 1) {
										if ((pdir = Object.assign({}, files[phash])) && pdir._realStats) {
											jQuery.each(pdir._realStats, function(k, v) {
												pdir[k] = v;
											});
											remove(files[phash]._realStats);
											self.change({ changed: [pdir] });
										}
										delete self.leafRoots[phash];
									} else {
										self.leafRoots[phash].splice(idx, 1);
									}
								}
							});
							if (self.searchStatus.state < 2) {
								jQuery.each(files, function(h, f) {
									f.phash == hash && rm(h);
								});
							}
						}
						if (file.phash) {
							if (parents = self.parents(file.phash)) {
								jQuery.each(parents, function() {
									changedParents[this] = true;
								});
							}
						}
						deleteCache(files[hash]);
					}
				},
				changedParents = {},
				parents;
		
			jQuery.each(self.roots, function(k, v) {
				roots[v] = k;
			});
			while (l--) {
				rm(removed[l]);
			}
			// delete sizeInfo cache
			jQuery.each(Object.keys(changedParents), function() {
				var target = files[this];
				if (target && target.sizeInfo) {
					delete target.sizeInfo;
				}
			});
		},
		
		/**
		 * Update file object in files caches
		 * 
		 * @param  Array  changed file objects
		 * @return void
		 */
		change = function(changed) {
			jQuery.each(changed, function(i, file) {
				var hash = file.hash;
				if (files[hash]) {
					jQuery.each(Object.keys(files[hash]), function(i, v){
						if (typeof file[v] === 'undefined') {
							delete files[hash][v];
						}
					});
				}
				files[hash] = files[hash] ? Object.assign(files[hash], file) : file;
			});
		},
		
		/**
		 * Delete cache data of files, ownFiles and self.optionsByHashes
		 * 
		 * @param  Object  file
		 * @param  Boolean update
		 * @return void
		 */
		deleteCache = function(file, update) {
			var hash = file.hash,
				phash = file.phash;
			
			if (phash && ownFiles[phash]) {
				 delete ownFiles[phash][hash];
			}
			if (!update) {
				ownFiles[hash] && delete ownFiles[hash];
				self.optionsByHashes[hash] && delete self.optionsByHashes[hash];
			}
			delete files[hash];
		},
		
		/**
		 * Maximum number of concurrent connections on request
		 * 
		 * @type Number
		 */
		requestMaxConn,
		
		/**
		 * Current number of connections
		 * 
		 * @type Number
		 */
		requestCnt = 0,
		
		/**
		 * Queue waiting for connection
		 * 
		 * @type Array
		 */
		requestQueue = [],
		
		/**
		 * Flag to cancel the `open` command waiting for connection
		 * 
		 * @type Boolean
		 */
		requestQueueSkipOpen = false,
		
		/**
		 * Exec shortcut
		 *
		 * @param  jQuery.Event  keydown/keypress event
		 * @return void
		 */
		execShortcut = function(e) {
			var code    = e.keyCode,
				ctrlKey = !!(e.ctrlKey || e.metaKey),
				isMousedown = e.type === 'mousedown',
				ddm;

			!isMousedown && (self.keyState.keyCode = code);
			self.keyState.ctrlKey  = ctrlKey;
			self.keyState.shiftKey = e.shiftKey;
			self.keyState.metaKey  = e.metaKey;
			self.keyState.altKey   = e.altKey;
			if (isMousedown) {
				return;
			} else if (e.type === 'keyup') {
				self.keyState.keyCode = null;
				return;
			}

			if (enabled) {

				jQuery.each(shortcuts, function(i, shortcut) {
					if (shortcut.type    == e.type 
					&& shortcut.keyCode  == code 
					&& shortcut.shiftKey == e.shiftKey 
					&& shortcut.ctrlKey  == ctrlKey 
					&& shortcut.altKey   == e.altKey) {
						e.preventDefault();
						e.stopPropagation();
						shortcut.callback(e, self);
						self.debug('shortcut-exec', i+' : '+shortcut.description);
					}
				});
				
				// prevent tab out of elfinder
				if (code == jQuery.ui.keyCode.TAB && !jQuery(e.target).is(':input')) {
					e.preventDefault();
				}
				
				// cancel any actions by [Esc] key
				if (e.type === 'keydown' && code == jQuery.ui.keyCode.ESCAPE) {
					// copy or cut 
					if (! node.find('.ui-widget:visible').length) {
						self.clipboard().length && self.clipboard([]);
					}
					// dragging
					if (jQuery.ui.ddmanager) {
						ddm = jQuery.ui.ddmanager.current;
						ddm && ddm.helper && ddm.cancel();
					}
					// button menus
					self.toHide(node.find('.ui-widget.elfinder-button-menu.elfinder-frontmost:visible'));
					// trigger keydownEsc
					self.trigger('keydownEsc', e);
				}

			}
		},
		date = new Date(),
		utc,
		i18n,
		inFrame = (window.parent !== window),
		parentIframe = (function() {
			var pifm, ifms;
			if (inFrame) {
				try {
					ifms = jQuery('iframe', window.parent.document);
					if (ifms.length) {
						jQuery.each(ifms, function(i, ifm) {
							if (ifm.contentWindow === window) {
								pifm = jQuery(ifm);
								return false;
							}
						});
					}
				} catch(e) {}
			}
			return pifm;
		})(),
		/**
		 * elFinder boot up function
		 * 
		 * @type Function
		 */
		bootUp,
		/**
		 * Original function of XMLHttpRequest.prototype.send
		 * 
		 * @type Function
		 */
		savedXhrSend;
	
	// opts must be an object
	if (!opts) {
		opts = {};
	}
	
	// set UA.Angle, UA.Rotated for mobile devices
	if (self.UA.Mobile) {
		jQuery(window).on('orientationchange.'+namespace, function() {
			var a = ((screen && screen.orientation && screen.orientation.angle) || window.orientation || 0) + 0;
			if (a === -90) {
				a = 270;
			}
			self.UA.Angle = a;
			self.UA.Rotated = a % 180 === 0? false : true;
		}).trigger('orientationchange.'+namespace);
	}
	
	// check opt.bootCallback
	if (opts.bootCallback && typeof opts.bootCallback === 'function') {
		(function() {
			var func = bootCallback,
				opFunc = opts.bootCallback;
			bootCallback = function(fm, extraObj) {
				func && typeof func === 'function' && func.call(this, fm, extraObj);
				opFunc.call(this, fm, extraObj);
			};
		})();
	}
	delete opts.bootCallback;

	/**
	 * Protocol version
	 *
	 * @type String
	 **/
	this.api = null;
	
	/**
	 * elFinder use new api
	 *
	 * @type Boolean
	 **/
	this.newAPI = false;
	
	/**
	 * elFinder use old api
	 *
	 * @type Boolean
	 **/
	this.oldAPI = false;
	
	/**
	 * Net drivers names
	 *
	 * @type Array
	 **/
	this.netDrivers = [];
	
	/**
	 * Base URL of elfFinder library starting from Manager HTML
	 * 
	 * @type String
	 */
	this.baseUrl = '';
	
	/**
	 * Base URL of i18n js files
	 * baseUrl + "js/i18n/" when empty value
	 * 
	 * @type String
	 */
	this.i18nBaseUrl = '';

	/**
	 * Is elFinder CSS loaded
	 * 
	 * @type Boolean
	 */
	this.cssloaded = false;
	
	/**
	 * Current theme object
	 * 
	 * @type Object|Null
	 */
	this.theme = null;

	this.mimesCanMakeEmpty = {};

	/**
	 * Callback function at boot up that option specified at elFinder starting
	 * 
	 * @type Function
	 */
	this.bootCallback;

	/**
	 * ID. Required to create unique cookie name
	 *
	 * @type String
	 **/
	this.id = id;

	/**
	 * Method to store/fetch data
	 *
	 * @type Function
	 **/
	this.storage = (function() {
		try {
			if ('localStorage' in window && window.localStorage !== null) {
				if (self.UA.Safari) {
					// check for Mac/iOS safari private browsing mode
					window.localStorage.setItem('elfstoragecheck', 1);
					window.localStorage.removeItem('elfstoragecheck');
				}
				return self.localStorage;
			} else {
				return self.cookie;
			}
		} catch (e) {
			return self.cookie;
		}
	})();

	/**
	 * Configuration options
	 *
	 * @type Object
	 **/
	//this.options = jQuery.extend(true, {}, this._options, opts);
	this.options = Object.assign({}, this._options);
	
	// for old type configuration
	if (opts.uiOptions) {
		if (opts.uiOptions.toolbar && Array.isArray(opts.uiOptions.toolbar)) {
			if (jQuery.isPlainObject(opts.uiOptions.toolbar[opts.uiOptions.toolbar.length - 1])) {
				self.options.uiOptions.toolbarExtra = Object.assign(self.options.uiOptions.toolbarExtra || {}, opts.uiOptions.toolbar.pop());
			}
		}
	}
	
	// Overwrite if opts value is an array
	(function() {
		var arrOv = function(obj, base) {
			if (jQuery.isPlainObject(obj)) {
				jQuery.each(obj, function(k, v) {
					if (jQuery.isPlainObject(v)) {
						if (!base[k]) {
							base[k] = {};
						}
						arrOv(v, base[k]);
					} else {
						base[k] = v;
					}
				});
			}
		};
		arrOv(opts, self.options);
	})();
	
	// join toolbarExtra to toolbar
	this.options.uiOptions.toolbar.push(this.options.uiOptions.toolbarExtra);
	delete this.options.uiOptions.toolbarExtra;

	/**
	 * Arrays that has to unbind events
	 * 
	 * @type Object
	 */
	this.toUnbindEvents = {};
	
	/**
	 * Attach listener to events
	 * To bind to multiply events at once, separate events names by space
	 * 
	 * @param  String  event(s) name(s)
	 * @param  Object  event handler or {done: handler}
	 * @param  Boolean priority first
	 * @return elFinder
	 */
	this.bind = function(event, callback, priorityFirst) {
		var i, len;
		
		if (callback && (typeof callback === 'function' || typeof callback.done === 'function')) {
			event = ('' + event).toLowerCase().replace(/^\s+|\s+$/g, '').split(/\s+/);
			
			len = event.length;
			for (i = 0; i < len; i++) {
				if (listeners[event[i]] === void(0)) {
					listeners[event[i]] = [];
				}
				listeners[event[i]][priorityFirst? 'unshift' : 'push'](callback);
			}
		}
		return this;
	};
	
	/**
	 * Remove event listener if exists
	 * To un-bind to multiply events at once, separate events names by space
	 *
	 * @param  String    event(s) name(s)
	 * @param  Function  callback
	 * @return elFinder
	 */
	this.unbind = function(event, callback) {
		var i, len, l, ci;
		
		event = ('' + event).toLowerCase().split(/\s+/);
		
		len = event.length;
		for (i = 0; i < len; i++) {
			if (l = listeners[event[i]]) {
				ci = jQuery.inArray(callback, l);
				ci > -1 && l.splice(ci, 1);
			}
		}
		
		callback = null;
		return this;
	};
	
	/**
	 * Fire event - send notification to all event listeners
	 * In the callback `this` becames an event object
	 *
	 * @param  String   event type
	 * @param  Object   data to send across event
	 * @param  Boolean  allow modify data (call by reference of data) default: true
	 * @return elFinder
	 */
	this.trigger = function(evType, data, allowModify) {
		var type      = evType.toLowerCase(),
			isopen    = (type === 'open'),
			dataIsObj = (typeof data === 'object'),
			handlers  = listeners[type] || [],
			dones     = [],
			i, l, jst, event;
		
		this.debug('event-'+type, data);
		
		if (! dataIsObj || typeof allowModify === 'undefined') {
			allowModify = true;
		}
		if (l = handlers.length) {
			event = jQuery.Event(type);
			if (data) {
				data._event = event;
			}
			if (allowModify) {
				event.data = data;
			}

			for (i = 0; i < l; i++) {
				if (! handlers[i]) {
					// probably un-binded this handler
					continue;
				}

				// handler is jQuery.Deferred(), call all functions upon completion
				if (handlers[i].done) {
					dones.push(handlers[i].done);
					continue;
				}
				
				// set `event.data` only callback has argument
				if (handlers[i].length) {
					if (!allowModify) {
						// to avoid data modifications. remember about "sharing" passing arguments in js :) 
						if (typeof jst === 'undefined') {
							try {
								jst = JSON.stringify(data);
							} catch(e) {
								jst = false;
							}
						}
						event.data = jst? JSON.parse(jst) : data;
					}
				}

				try {
					if (handlers[i].call(event, event, this) === false || event.isDefaultPrevented()) {
						this.debug('event-stoped', event.type);
						break;
					}
				} catch (ex) {
					window.console && window.console.log && window.console.log(ex);
				}
				
			}
			
			// call done functions
			if (l = dones.length) {
				for (i = 0; i < l; i++) {
					try {
						if (dones[i].call(event, event, this) === false || event.isDefaultPrevented()) {
							this.debug('event-stoped', event.type + '(done)');
							break;
						}
					} catch (ex) {
						window.console && window.console.log && window.console.log(ex);
					}
				}
			}

			if (this.toUnbindEvents[type] && this.toUnbindEvents[type].length) {
				jQuery.each(this.toUnbindEvents[type], function(i, v) {
					self.unbind(v.type, v.callback);
				});
				delete this.toUnbindEvents[type];
			}
		}
		return this;
	};
	
	/**
	 * Get event listeners
	 *
	 * @param  String   event type
	 * @return Array    listed event functions
	 */
	this.getListeners = function(event) {
		return event? listeners[event.toLowerCase()] : listeners;
	};

	// set fm.baseUrl
	this.baseUrl = (function() {
		var myTag, myCss, base, baseUrl;
		
		if (self.options.baseUrl) {
			return self.options.baseUrl;
		} else {
			baseUrl = '';
			//myTag = jQuery('head > script[src$="js/elfinder.min.js"],script[src$="js/elfinder.full.js"]:first');
			myTag = null;
			jQuery('head > script').each(function() {
				if (this.src && this.src.match(/js\/elfinder(?:-[a-z0-9_-]+)?\.(?:min|full)\.js$/i)) {
					myTag = jQuery(this);
					return false;
				}
			});
			if (myTag) {
				myCss = jQuery('head > link[href$="css/elfinder.min.css"],link[href$="css/elfinder.full.css"]:first').length;
				if (! myCss) {
					// to request CSS auto loading
					self.cssloaded = null;
				}
				baseUrl = myTag.attr('src').replace(/js\/[^\/]+$/, '');
				if (! baseUrl.match(/^(https?\/\/|\/)/)) {
					// check <base> tag
					if (base = jQuery('head > base[href]').attr('href')) {
						baseUrl = base.replace(/\/$/, '') + '/' + baseUrl; 
					}
				}
			}
			if (baseUrl !== '') {
				self.options.baseUrl = baseUrl;
			} else {
				if (! self.options.baseUrl) {
					self.options.baseUrl = './';
				}
				baseUrl = self.options.baseUrl;
			}
			return baseUrl;
		}
	})();
	
	this.i18nBaseUrl = (this.options.i18nBaseUrl || this.baseUrl + 'js/i18n').replace(/\/$/, '') + '/';

	this.options.maxErrorDialogs = Math.max(1, parseInt(this.options.maxErrorDialogs || 5));

	// set dispInlineRegex
	cwdOptionsDefault.dispInlineRegex = this.options.dispInlineRegex;

	// auto load required CSS
	if (this.options.cssAutoLoad) {
		(function() {
			var baseUrl = self.baseUrl;
			
			// additional CSS files
			if (Array.isArray(self.options.cssAutoLoad)) {
				if (self.cssloaded === true) {
					self.loadCss(self.options.cssAutoLoad);
				} else {
					self.bind('cssloaded', function() {
						self.loadCss(self.options.cssAutoLoad);
					});
				}
			}

			// try to load main css
			if (self.cssloaded === null) {
				// hide elFinder node while css loading
				node.data('cssautoloadHide', jQuery('<style>.elfinder{visibility:hidden;overflow:hidden}</style>'));
				jQuery('head').append(node.data('cssautoloadHide'));

				// set default theme
				if (!self.options.themes.default) {
					self.options.themes = Object.assign({
						'default' : {
							'name': 'default',
							'cssurls': 'css/theme.css',
							'author': 'elFinder Project',
							'license': '3-clauses BSD'
						}
					}, self.options.themes);
					if (!self.options.theme) {
						self.options.theme = 'default';
					}
				}

				// load CSS
				self.loadCss([baseUrl+'css/elfinder.min.css'], {
					dfd: jQuery.Deferred().always(function() {
						if (node.data('cssautoloadHide')) {
							node.data('cssautoloadHide').remove();
							node.removeData('cssautoloadHide');
						}
					}).done(function() {
						if (!self.cssloaded) {
							self.cssloaded = true;
							self.trigger('cssloaded');
						}
					}).fail(function() {
						self.cssloaded = false;
						self.error(['errRead', 'CSS (elfinder or theme)']);
					})
				});
			}
			self.options.cssAutoLoad = false;
		})();
	}

	// load theme if exists
	this.changeTheme(this.storage('theme') || this.options.theme);
	
	/**
	 * Volume option to set the properties of the root Stat
	 * 
	 * @type Object
	 */
	this.optionProperties = {
		icon: void(0),
		csscls: void(0),
		tmbUrl: void(0),
		uiCmdMap: {},
		netkey: void(0),
		disabled: []
	};
	
	if (! inFrame && ! this.options.enableAlways && jQuery('body').children().length === 2) { // only node and beeper
		this.options.enableAlways = true;
	}
	
	// make options.debug
	if (this.options.debug === true) {
		this.options.debug = 'all';
	} else if (Array.isArray(this.options.debug)) {
		(function() {
			var d = {};
			jQuery.each(self.options.debug, function() {
				d[this] = true;
			});
			self.options.debug = d;
		})();
	} else {
		this.options.debug = false;
	}
	
	/**
	 * Original functions evacuated by conflict check
	 * 
	 * @type Object
	 */
	this.noConflicts = {};
	
	/**
	 * Check and save conflicts with bootstrap etc
	 * 
	 * @type Function
	 */
	this.noConflict = function() {
		jQuery.each(conflictChecks, function(i, p) {
			if (jQuery.fn[p] && typeof jQuery.fn[p].noConflict === 'function') {
				self.noConflicts[p] = jQuery.fn[p].noConflict();
			}
		});
	};
	// do check conflict
	this.noConflict();
	
	/**
	 * Is elFinder over CORS
	 *
	 * @type Boolean
	 **/
	this.isCORS = false;
	
	// configure for CORS
	(function(){
		if (typeof self.options.cors !== 'undefined' && self.options.cors !== null) {
			self.isCORS = self.options.cors? true : false;
		} else {
			var parseUrl = document.createElement('a'),
				parseUploadUrl,
				selfProtocol = window.location.protocol,
				portReg = function(protocol) {
					protocol = (!protocol || protocol === ':')? selfProtocol : protocol;
					return protocol === 'https:'? /\:443$/ : /\:80$/;
				},
				selfHost = window.location.host.replace(portReg(selfProtocol), '');
			parseUrl.href = opts.url;
			if (opts.urlUpload && (opts.urlUpload !== opts.url)) {
				parseUploadUrl = document.createElement('a');
				parseUploadUrl.href = opts.urlUpload;
			}
			if (selfHost !== parseUrl.host.replace(portReg(parseUrl.protocol), '')
				|| (parseUrl.protocol !== ':'&& parseUrl.protocol !== '' && (selfProtocol !== parseUrl.protocol))
				|| (parseUploadUrl && 
					(selfHost !== parseUploadUrl.host.replace(portReg(parseUploadUrl.protocol), '')
					|| (parseUploadUrl.protocol !== ':' && parseUploadUrl.protocol !== '' && (selfProtocol !== parseUploadUrl.protocol))
					)
				)
			) {
				self.isCORS = true;
			}
		}
		if (self.isCORS) {
			if (!jQuery.isPlainObject(self.options.customHeaders)) {
				self.options.customHeaders = {};
			}
			if (!jQuery.isPlainObject(self.options.xhrFields)) {
				self.options.xhrFields = {};
			}
			self.options.requestType = 'post';
			self.options.customHeaders['X-Requested-With'] = 'XMLHttpRequest';
			self.options.xhrFields['withCredentials'] = true;
		}
	})();

	/**
	 * Ajax request type
	 *
	 * @type String
	 * @default "get"
	 **/
	this.requestType = /^(get|post)$/i.test(this.options.requestType) ? this.options.requestType.toLowerCase() : 'get';
	
	// set `requestMaxConn` by option
	requestMaxConn = Math.max(parseInt(this.options.requestMaxConn), 1);
	
	/**
	 * Custom data that given as options
	 * 
	 * @type Object
	 * @default {}
	 */
	this.optsCustomData = jQuery.isPlainObject(this.options.customData) ? this.options.customData : {};

	/**
	 * Any data to send across every ajax request
	 *
	 * @type Object
	 * @default {}
	 **/
	this.customData = Object.assign({}, this.optsCustomData);

	/**
	 * Previous custom data from connector
	 * 
	 * @type Object|null
	 */
	this.prevCustomData = null;

	/**
	 * Any custom headers to send across every ajax request
	 *
	 * @type Object
	 * @default {}
	*/
	this.customHeaders = jQuery.isPlainObject(this.options.customHeaders) ? this.options.customHeaders : {};

	/**
	 * Any custom xhrFields to send across every ajax request
	 *
	 * @type Object
	 * @default {}
	 */
	this.xhrFields = jQuery.isPlainObject(this.options.xhrFields) ? this.options.xhrFields : {};

	/**
	 * Replace XMLHttpRequest.prototype.send to extended function for 3rd party libs XHR request etc.
	 * 
	 * @type Function
	 */
	this.replaceXhrSend = function() {
		if (! savedXhrSend) {
			savedXhrSend = XMLHttpRequest.prototype.send;
		}
		XMLHttpRequest.prototype.send = function() {
			var xhr = this;
			// set request headers
			if (self.customHeaders) {
				jQuery.each(self.customHeaders, function(key) {
					xhr.setRequestHeader(key, this);
				});
			}
			// set xhrFields
			if (self.xhrFields) {
				jQuery.each(self.xhrFields, function(key) {
					if (key in xhr) {
						xhr[key] = this;
					}
				});
			}
			return savedXhrSend.apply(this, arguments);
		};
	};
	
	/**
	 * Restore saved original XMLHttpRequest.prototype.send
	 * 
	 * @type Function
	 */
	this.restoreXhrSend = function() {
		savedXhrSend && (XMLHttpRequest.prototype.send = savedXhrSend);
	};

	/**
	 * command names for into queue for only cwd requests
	 * these commands aborts before `open` request
	 *
	 * @type Array
	 * @default ['tmb', 'parents']
	 */
	this.abortCmdsOnOpen = this.options.abortCmdsOnOpen || ['tmb', 'parents'];

	/**
	 * ui.nav id prefix
	 * 
	 * @type String
	 */
	this.navPrefix = 'nav' + (elFinder.prototype.uniqueid? elFinder.prototype.uniqueid : '') + '-';
	
	/**
	 * ui.cwd id prefix
	 * 
	 * @type String
	 */
	this.cwdPrefix = elFinder.prototype.uniqueid? ('cwd' + elFinder.prototype.uniqueid + '-') : '';
	
	// Increment elFinder.prototype.uniqueid
	++elFinder.prototype.uniqueid;
	
	/**
	 * URL to upload files
	 *
	 * @type String
	 **/
	this.uploadURL = opts.urlUpload || opts.url;
	
	/**
	 * Events namespace
	 *
	 * @type String
	 **/
	this.namespace = namespace;

	/**
	 * Today timestamp
	 *
	 * @type Number
	 **/
	this.today = (new Date(date.getFullYear(), date.getMonth(), date.getDate())).getTime()/1000;
	
	/**
	 * Yesterday timestamp
	 *
	 * @type Number
	 **/
	this.yesterday = this.today - 86400;
	
	utc = this.options.UTCDate ? 'UTC' : '';
	
	this.getHours    = 'get'+utc+'Hours';
	this.getMinutes  = 'get'+utc+'Minutes';
	this.getSeconds  = 'get'+utc+'Seconds';
	this.getDate     = 'get'+utc+'Date';
	this.getDay      = 'get'+utc+'Day';
	this.getMonth    = 'get'+utc+'Month';
	this.getFullYear = 'get'+utc+'FullYear';
	
	/**
	 * elFinder node z-index (auto detect on elFinder load)
	 *
	 * @type null | Number
	 **/
	this.zIndex;

	/**
	 * Current search status
	 * 
	 * @type Object
	 */
	this.searchStatus = {
		state  : 0, // 0: search ended, 1: search started, 2: in search result
		query  : '',
		target : '',
		mime   : '',
		mixed  : false, // in multi volumes search: false or Array that target volume ids
		ininc  : false // in incremental search
	};

	/**
	 * Interface language
	 *
	 * @type String
	 * @default "en"
	 **/
	this.lang = this.storage('lang') || this.options.lang;
	if (this.lang === 'jp') {
		this.lang = this.options.lang = 'ja';
	}

	this.viewType = this.storage('view') || this.options.defaultView || 'icons';

	this.sortType = this.storage('sortType') || this.options.sortType || 'name';
	
	this.sortOrder = this.storage('sortOrder') || this.options.sortOrder || 'asc';

	this.sortStickFolders = this.storage('sortStickFolders');
	if (this.sortStickFolders === null) {
		this.sortStickFolders = !!this.options.sortStickFolders;
	} else {
		this.sortStickFolders = !!this.sortStickFolders;
	}

	this.sortAlsoTreeview = this.storage('sortAlsoTreeview');
	if (this.sortAlsoTreeview === null || this.options.sortAlsoTreeview === null) {
		this.sortAlsoTreeview = !!this.options.sortAlsoTreeview;
	} else {
		this.sortAlsoTreeview = !!this.sortAlsoTreeview;
	}

	this.sortRules = jQuery.extend(true, {}, this._sortRules, this.options.sortRules);
	
	jQuery.each(this.sortRules, function(name, method) {
		if (typeof method != 'function') {
			delete self.sortRules[name];
		} 
	});
	
	this.compare = jQuery.proxy(this.compare, this);
	
	/**
	 * Delay in ms before open notification dialog
	 *
	 * @type Number
	 * @default 500
	 **/
	this.notifyDelay = this.options.notifyDelay > 0 ? parseInt(this.options.notifyDelay) : 500;
	
	/**
	 * Dragging UI Helper object
	 *
	 * @type jQuery | null
	 **/
	this.draggingUiHelper = null;
	
	/**
	 * Base droppable options
	 *
	 * @type Object
	 **/
	this.droppable = {
		greedy     : true,
		tolerance  : 'pointer',
		accept     : '.elfinder-cwd-file-wrapper,.elfinder-navbar-dir,.elfinder-cwd-file,.elfinder-cwd-filename',
		hoverClass : this.res('class', 'adroppable'),
		classes    : { // Deprecated hoverClass jQueryUI>=1.12.0
			'ui-droppable-hover': this.res('class', 'adroppable')
		},
		autoDisable: true, // elFinder original, see jquery.elfinder.js
		drop : function(e, ui) {
			var dst     = jQuery(this),
				targets = jQuery.grep(ui.helper.data('files')||[], function(h) { return h? true : false; }),
				result  = [],
				dups    = [],
				faults  = [],
				isCopy  = ui.helper.hasClass('elfinder-drag-helper-plus'),
				c       = 'class',
				cnt, hash, i, h;
			
			if (typeof e.button === 'undefined' || ui.helper.data('namespace') !== namespace || ! self.insideWorkzone(e.pageX, e.pageY)) {
				return false;
			}
			if (dst.hasClass(self.res(c, 'cwdfile'))) {
				hash = self.cwdId2Hash(dst.attr('id'));
			} else if (dst.hasClass(self.res(c, 'navdir'))) {
				hash = self.navId2Hash(dst.attr('id'));
			} else {
				hash = cwd;
			}

			cnt = targets.length;
			
			while (cnt--) {
				h = targets[cnt];
				// ignore drop into itself or in own location
				if (h != hash && files[h].phash != hash) {
					result.push(h);
				} else {
					((isCopy && h !== hash && files[hash].write)? dups : faults).push(h);
				}
			}
			
			if (faults.length) {
				return false;
			}
			
			ui.helper.data('droped', true);
			
			if (dups.length) {
				ui.helper.hide();
				self.exec('duplicate', dups, {_userAction: true});
			}
			
			if (result.length) {
				ui.helper.hide();
				self.clipboard(result, !isCopy);
				self.exec('paste', hash, {_userAction: true}, hash).always(function(){
					self.clipboard([]);
					self.trigger('unlockfiles', {files : targets});
				});
				self.trigger('drop', {files : targets});
			}
		}
	};
	
	/**
	 * Return true if filemanager is active
	 *
	 * @return Boolean
	 **/
	this.enabled = function() {
		return enabled && this.visible();
	};
	
	/**
	 * Return true if filemanager is visible
	 *
	 * @return Boolean
	 **/
	this.visible = function() {
		return node[0].elfinder && node.is(':visible');
	};
	
	/**
	 * Return file is root?
	 * 
	 * @param  Object  target file object
	 * @return Boolean
	 */
	this.isRoot = function(file) {
		return (file.isroot || ! file.phash)? true : false;
	};
	
	/**
	 * Return root dir hash for current working directory
	 * 
	 * @param  String   target hash
	 * @param  Boolean  include fake parent (optional)
	 * @return String
	 */
	this.root = function(hash, fake) {
		hash = hash || cwd;
		var dir, i;
		
		if (! fake) {
			jQuery.each(self.roots, function(id, rhash) {
				if (hash.indexOf(id) === 0) {
					dir = rhash;
					return false;
				}
			});
			if (dir) {
				return dir;
			}
		}
		
		dir = files[hash];
		while (dir && dir.phash && (fake || ! dir.isroot)) {
			dir = files[dir.phash];
		}
		if (dir) {
			return dir.hash;
		}
		
		while (i in files && files.hasOwnProperty(i)) {
			dir = files[i];
			if (dir.mime === 'directory' && !dir.phash && dir.read) {
				return dir.hash;
			}
		}
		
		return '';
	};
	
	/**
	 * Return current working directory info
	 * 
	 * @return Object
	 */
	this.cwd = function() {
		return files[cwd] || {};
	};
	
	/**
	 * Return required cwd option
	 * 
	 * @param  String  option name
	 * @param  String  target hash (optional)
	 * @return mixed
	 */
	this.option = function(name, target) {
		var res, item;
		target = target || cwd;
		if (self.optionsByHashes[target] && typeof self.optionsByHashes[target][name] !== 'undefined') {
			return self.optionsByHashes[target][name];
		}
		if (self.hasVolOptions && cwd !== target && (!(item = self.file(target)) || item.phash !== cwd)) {
			res = '';
			jQuery.each(self.volOptions, function(id, opt) {
				if (target.indexOf(id) === 0) {
					res = opt[name] || '';
					return false;
				}
			});
			return res;
		} else {
			return cwdOptions[name] || '';
		}
	};
	
	/**
	 * Return disabled commands by each folder
	 * 
	 * @param  Array  target hashes
	 * @return Array
	 */
	this.getDisabledCmds = function(targets, flip) {
		var disabled = {'hidden': true};
		if (! Array.isArray(targets)) {
			targets = [ targets ];
		}
		jQuery.each(targets, function(i, h) {
			var disCmds = self.option('disabledFlip', h);
			if (disCmds) {
				Object.assign(disabled, disCmds);
			}
		});
		return flip? disabled : Object.keys(disabled);
	};
	
	/**
	 * Return file data from current dir or tree by it's hash
	 * 
	 * @param  String  file hash
	 * @return Object
	 */
	this.file = function(hash, alsoHidden) { 
		return hash? (files[hash] || (alsoHidden? hiddenFiles[hash] : void(0))) : void(0); 
	};
	
	/**
	 * Return all cached files
	 * 
	 * @param  String  parent hash
	 * @return Object
	 */
	this.files = function(phash) {
		var items = {};
		if (phash) {
			if (!ownFiles[phash]) {
				return {};
			}
			jQuery.each(ownFiles[phash], function(h) {
				if (files[h]) {
					items[h] = files[h];
				} else {
					delete ownFiles[phash][h];
				}
			});
			return Object.assign({}, items);
		}
		return Object.assign({}, files);
	};
	
	/**
	 * Return list of file parents hashes include file hash
	 * 
	 * @param  String  file hash
	 * @return Array
	 */
	this.parents = function(hash) {
		var parents = [],
			dir;
		
		while (hash && (dir = this.file(hash))) {
			parents.unshift(dir.hash);
			hash = dir.phash;
		}
		return parents;
	};
	
	this.path2array = function(hash, i18) {
		var file, 
			path = [];
			
		while (hash) {
			if ((file = files[hash]) && file.hash) {
				path.unshift(i18 && file.i18 ? file.i18 : file.name);
				hash = file.isroot? null : file.phash;
			} else {
				path = [];
				break;
			}
		}
			
		return path;
	};
	
	/**
	 * Return file path or Get path async with jQuery.Deferred
	 * 
	 * @param  Object  file
	 * @param  Boolean i18
	 * @param  Object  asyncOpt
	 * @return String|jQuery.Deferred
	 */
	this.path = function(hash, i18, asyncOpt) { 
		var path = files[hash] && files[hash].path
			? files[hash].path
			: this.path2array(hash, i18).join(cwdOptions.separator);
		if (! asyncOpt || ! files[hash]) {
			return path;
		} else {
			asyncOpt = Object.assign({notify: {type : 'parents', cnt : 1, hideCnt : true}}, asyncOpt);
			
			var dfd    = jQuery.Deferred(),
				notify = asyncOpt.notify,
				noreq  = false,
				req    = function() {
					self.request({
						data : {cmd : 'parents', target : files[hash].phash},
						notify : notify,
						preventFail : true
					})
					.done(done)
					.fail(function() {
						dfd.reject();
					});
				},
				done   = function() {
					self.one('parentsdone', function() {
						path = self.path(hash, i18);
						if (path === '' && noreq) {
							//retry with request
							noreq = false;
							req();
						} else {
							if (notify) {
								clearTimeout(ntftm);
								notify.cnt = -(parseInt(notify.cnt || 0));
								self.notify(notify);
							}
							dfd.resolve(path);
						}
					});
				},
				ntftm;
		
			if (path) {
				return dfd.resolve(path);
			} else {
				if (self.ui['tree']) {
					// try as no request
					if (notify) {
						ntftm = setTimeout(function() {
							self.notify(notify);
						}, self.notifyDelay);
					}
					noreq = true;
					done(true);
				} else {
					req();
				}
				return dfd;
			}
		}
	};
	
	/**
	 * Return file url if set
	 * 
	 * @param  String  file hash
	 * @param  Object  Options
	 * @return String|Object of jQuery Deferred
	 */
	this.url = function(hash, o) {
		var file   = files[hash],
			opts   = o || {},
			async  = opts.async || false,
			temp   = opts.temporary || false,
			onetm  = (opts.onetime && self.option('onetimeUrl', hash)) || false,
			absurl = opts.absurl || false,
			dfrd   = (async || onetm)? jQuery.Deferred() : null,
			filter = function(url) {
				if (url && absurl) {
					url = self.convAbsUrl(url);
				}
				return url;
			},
			getUrl = function(url) {
				if (url) {
					return filter(url);
				}
				if (file.url) {
					return filter(file.url);
				}
				
				if (typeof baseUrl === 'undefined') {
					baseUrl = self.option('url', (!self.isRoot(file) && file.phash) || file.hash);
				}
				
				if (baseUrl) {
					return filter(baseUrl + jQuery.map(self.path2array(hash), function(n) { return encodeURIComponent(n); }).slice(1).join('/'));
				}

				var params = Object.assign({}, self.customData, {
					cmd: 'file',
					target: file.hash
				});
				if (self.oldAPI) {
					params.cmd = 'open';
					params.current = file.phash;
				}
				return filter(self.options.url + (self.options.url.indexOf('?') === -1 ? '?' : '&') + jQuery.param(params, true));
			}, 
			baseUrl, res;
		
		if (!file || !file.read) {
			return async? dfrd.resolve('') : '';
		}
		
		if (onetm) {
			async = true;
			this.request({
				data : { cmd : 'url', target : hash, options : { onetime: 1 } },
				preventDefault : true,
				options: {async: async},
				notify: {type : 'file', cnt : 1, hideCnt : true}
			}).done(function(data) {
				dfrd.resolve(filter(data.url || ''));
			}).fail(function() {
				dfrd.resolve('');
			});
		} else {
			if (file.url == '1' || (temp && !file.url && !(baseUrl = self.option('url', (!self.isRoot(file) && file.phash) || file.hash)))) {
				this.request({
					data : { cmd : 'url', target : hash, options : { temporary: temp? 1 : 0 } },
					preventDefault : true,
					options: {async: async},
					notify: async? {type : temp? 'file' : 'url', cnt : 1, hideCnt : true} : {}
				})
				.done(function(data) {
					file.url = data.url || '';
				})
				.fail(function() {
					file.url = '';
				})
				.always(function() {
					var url;
					if (file.url && temp) {
						url = file.url;
						file.url = '1'; // restore
					}
					if (async) {
						dfrd.resolve(getUrl(url));
					} else {
						return getUrl(url);
					}
				});
			} else {
				if (async) {
					dfrd.resolve(getUrl());
				} else {
					return getUrl();
				}
			}
		}
		if (async) {
			return dfrd;
		}
	};
	
	/**
	 * Return file url for the extarnal service
	 *
	 * @param      String  hash     The hash
	 * @param      Object  options  The options
	 * @return     Object  jQuery Deferred
	 */
	this.forExternalUrl = function(hash, options) {
		var onetime = self.option('onetimeUrl', hash),
			opts = {
				async: true,
				absurl: true
			};

		opts[onetime? 'onetime' : 'temporary'] = true;
		return self.url(hash, Object.assign({}, options, opts));
	};

	/**
	 * Return file url for open in elFinder
	 * 
	 * @param  String  file hash
	 * @param  Boolean for download link
	 * @return String
	 */
	this.openUrl = function(hash, download) {
		var file = files[hash],
			url  = '';
		
		if (!file || !file.read) {
			return '';
		}
		
		if (!download) {
			if (file.url) {
				if (file.url != 1) {
					url = file.url;
				}
			} else if (cwdOptions.url && file.hash.indexOf(self.cwd().volumeid) === 0) {
				url = cwdOptions.url + jQuery.map(this.path2array(hash), function(n) { return encodeURIComponent(n); }).slice(1).join('/');
			}
			if (url) {
				url += (url.match(/\?/)? '&' : '?') + '_'.repeat((url.match(/[\?&](_+)t=/g) || ['&t=']).sort().shift().match(/[\?&](_*)t=/)[1].length + 1) + 't=' + (file.ts || parseInt(+new Date()/1000));
				return url;
			}
		}
		
		url = this.options.url;
		url = url + (url.indexOf('?') === -1 ? '?' : '&')
			+ (this.oldAPI ? 'cmd=open&current='+file.phash : 'cmd=file')
			+ '&target=' + file.hash
			+ '&_t=' + (file.ts || parseInt(+new Date()/1000));
		
		if (download) {
			url += '&download=1';
		}
		
		jQuery.each(this.customData, function(key, val) {
			url += '&' + encodeURIComponent(key) + '=' + encodeURIComponent(val);
		});
		
		return url;
	};
	
	/**
	 * Return thumbnail url
	 * 
	 * @param  Object  file object
	 * @return String
	 */
	this.tmb = function(file) {
		var tmbUrl, tmbCrop,
			cls    = 'elfinder-cwd-bgurl',
			url    = '';

		if (jQuery.isPlainObject(file)) {
			if (self.searchStatus.state && file.hash.indexOf(self.cwd().volumeid) !== 0) {
				tmbUrl = self.option('tmbUrl', file.hash);
				tmbCrop = self.option('tmbCrop', file.hash);
			} else {
				tmbUrl = cwdOptions['tmbUrl'];
				tmbCrop = cwdOptions['tmbCrop'];
			}
			if (tmbCrop) {
				cls += ' elfinder-cwd-bgurl-crop';
			}
			if (tmbUrl === 'self' && file.mime.indexOf('image/') === 0) {
				url = self.openUrl(file.hash);
				cls += ' elfinder-cwd-bgself';
			} else if ((self.oldAPI || tmbUrl) && file && file.tmb && file.tmb != 1) {
				url = tmbUrl + file.tmb;
			} else if (self.newAPI && file && file.tmb && file.tmb != 1) {
				url = file.tmb;
			}
			if (url) {
				if (file.ts && tmbUrl !== 'self') {
					url += (url.match(/\?/)? '&' : '?') + '_t=' + file.ts;
				}
				return { url: url, className: cls };
			}
		}
		
		return false;
	};
	
	/**
	 * Return selected files hashes
	 *
	 * @return Array
	 **/
	this.selected = function() {
		return selected.slice(0);
	};
	
	/**
	 * Return selected files info
	 * 
	 * @return Array
	 */
	this.selectedFiles = function() {
		return jQuery.map(selected, function(hash) { return files[hash] ? Object.assign({}, files[hash]) : null; });
	};
	
	/**
	 * Return true if file with required name existsin required folder
	 * 
	 * @param  String  file name
	 * @param  String  parent folder hash
	 * @return Boolean
	 */
	this.fileByName = function(name, phash) {
		var hash;
	
		for (hash in files) {
			if (files.hasOwnProperty(hash) && files[hash].phash == phash && files[hash].name == name) {
				return files[hash];
			}
		}
	};
	
	/**
	 * Valid data for required command based on rules
	 * 
	 * @param  String  command name
	 * @param  Object  cammand's data
	 * @return Boolean
	 */
	this.validResponse = function(cmd, data) {
		return data.error || this.rules[this.rules[cmd] ? cmd : 'defaults'](data);
	};
	
	/**
	 * Return bytes from ini formated size
	 * 
	 * @param  String  ini formated size
	 * @return Integer
	 */
	this.returnBytes = function(val) {
		var last;
		if (isNaN(val)) {
			if (! val) {
				val = '';
			}
			// for ex. 1mb, 1KB
			val = val.replace(/b$/i, '');
			last = val.charAt(val.length - 1).toLowerCase();
			val = val.replace(/[tgmk]$/i, '');
			if (last == 't') {
				val = val * 1024 * 1024 * 1024 * 1024;
			} else if (last == 'g') {
				val = val * 1024 * 1024 * 1024;
			} else if (last == 'm') {
				val = val * 1024 * 1024;
			} else if (last == 'k') {
				val = val * 1024;
			}
			val = isNaN(val)? 0 : parseInt(val);
		} else {
			val = parseInt(val);
			if (val < 1) val = 0;
		}
		return val;
	};
	
	/**
	 * Process ajax request.
	 * Fired events :
	 * @todo
	 * @example
	 * @todo
	 * @return jQuery.Deferred
	 */
	this.request = function(opts) { 
		var self     = this,
			o        = this.options,
			dfrd     = jQuery.Deferred(),
			// request ID
			reqId    = (+ new Date()).toString(16) + Math.floor(1000 * Math.random()).toString(16), 
			// request data
			data     = Object.assign({}, self.customData, {mimes : o.onlyMimes}, opts.data || opts),
			// command name
			cmd      = data.cmd,
			// request type is binary
			isBinary = (opts.options || {}).dataType === 'binary',
			// current cmd is "open"
			isOpen   = (!opts.asNotOpen && cmd === 'open'),
			// call default fail callback (display error dialog) ?
			deffail  = !(isBinary || opts.preventDefault || opts.preventFail),
			// call default success callback ?
			defdone  = !(isBinary || opts.preventDefault || opts.preventDone),
			// options for notify dialog
			notify   = Object.assign({}, opts.notify),
			// make cancel button
			cancel   = !!opts.cancel,
			// do not normalize data - return as is
			raw      = isBinary || !!opts.raw,
			// sync files on request fail
			syncOnFail = opts.syncOnFail,
			// use lazy()
			lazy     = !!opts.lazy,
			// prepare function before done()
			prepare  = opts.prepare,
			// navigate option object when cmd done
			navigate = opts.navigate,
			// open notify dialog timeout
			timeout,
			// use browser cache
			useCache = (opts.options || {}).cache,
			// request options
			options = Object.assign({
				url      : o.url,
				async    : true,
				type     : this.requestType,
				dataType : 'json',
				cache    : (self.api >= 2.1029), // api >= 2.1029 has unique request ID
				data     : data,
				headers  : this.customHeaders,
				xhrFields: this.xhrFields
			}, opts.options || {}),
			/**
			 * Default success handler. 
			 * Call default data handlers and fire event with command name.
			 *
			 * @param Object  normalized response data
			 * @return void
			 **/
			done = function(data) {
				data.warning && self.error(data.warning);
				
				if (isOpen) {
					open(data);
				} else {
					self.updateCache(data);
				}
				
				data.changed && data.changed.length && change(data.changed);
				
				self.lazy(function() {
					// fire some event to update cache/ui
					data.removed && data.removed.length && self.remove(data);
					data.added   && data.added.length   && self.add(data);
					data.changed && data.changed.length && self.change(data);
				}).then(function() {
					// fire event with command name
					return self.lazy(function() {
						self.trigger(cmd, data, false);
					});
				}).then(function() {
					// fire event with command name + 'done'
					return self.lazy(function() {
						self.trigger(cmd + 'done');
					});
				}).then(function() {
					// make toast message
					if (data.toasts && Array.isArray(data.toasts)) {
						jQuery.each(data.toasts, function() {
							this.msg && self.toast(this);
						});
					}
					// force update content
					data.sync && self.sync();
				});
			},
			/**
			 * Request error handler. Reject dfrd with correct error message.
			 *
			 * @param jqxhr  request object
			 * @param String request status
			 * @return void
			 **/
			error = function(xhr, status) {
				var error, data, 
					d = self.options.debug;
				
				switch (status) {
					case 'abort':
						error = xhr.quiet ? '' : ['errConnect', 'errAbort'];
						break;
					case 'timeout':	    
						error = ['errConnect', 'errTimeout'];
						break;
					case 'parsererror': 
						error = ['errResponse', 'errDataNotJSON'];
						if (xhr.responseText) {
							if (! cwd || (d && (d === 'all' || d['backend-error']))) {
								error.push(xhr.responseText);
							}
						}
						break;
					default:
						if (xhr.responseText) {
							// check responseText, Is that JSON?
							try {
								data = JSON.parse(xhr.responseText);
								if (data && data.error) {
									error = data.error;
								}
							} catch(e) {}
						}
						if (! error) {
							if (xhr.status == 403) {
								error = ['errConnect', 'errAccess', 'HTTP error ' + xhr.status];
							} else if (xhr.status == 404) {
								error = ['errConnect', 'errNotFound', 'HTTP error ' + xhr.status];
							} else if (xhr.status >= 500) {
								error = ['errResponse', 'errServerError', 'HTTP error ' + xhr.status];
							} else {
								if (xhr.status == 414 && options.type === 'get') {
									// retry by POST method
									options.type = 'post';
									self.abortXHR(xhr);
									dfrd.xhr = xhr = self.transport.send(options).fail(error).done(success);
									return;
								}
								error = xhr.quiet ? '' : ['errConnect', 'HTTP error ' + xhr.status];
							} 
						}
				}
				
				self.trigger(cmd + 'done');
				dfrd.reject({error: error}, xhr, status);
			},
			/**
			 * Request success handler. Valid response data and reject/resolve dfrd.
			 *
			 * @param Object  response data
			 * @param String request status
			 * @return void
			 **/
			success = function(response) {
				var d = self.options.debug;
				
				// Set currrent request command name
				self.currentReqCmd = cmd;
				
				if (response.debug && (!d || d !== 'all')) {
					if (!d) {
						d = self.options.debug = {};
					}
					d['backend-error'] = true;
					d['warning'] = true;
				}
				
				if (raw) {
					self.abortXHR(xhr);
					response && response.debug && self.debug('backend-debug', response);
					return dfrd.resolve(response);
				}
				
				if (!response) {
					return dfrd.reject({error :['errResponse', 'errDataEmpty']}, xhr, response);
				} else if (!jQuery.isPlainObject(response)) {
					return dfrd.reject({error :['errResponse', 'errDataNotJSON']}, xhr, response);
				} else if (response.error) {
					if (isOpen) {
						// check leafRoots
						jQuery.each(self.leafRoots, function(phash, roots) {
							self.leafRoots[phash] = jQuery.grep(roots, function(h) { return h !== data.target; });
						});
					}
					return dfrd.reject({error :response.error}, xhr, response);
				}
				
				var resolve = function() {
					var pushLeafRoots = function(name) {
						if (self.leafRoots[data.target] && response[name]) {
							jQuery.each(self.leafRoots[data.target], function(i, h) {
								var root;
								if (root = self.file(h)) {
									response[name].push(root);
								}
							});
						}
					},
					setTextMimes = function() {
						self.textMimes = {};
						jQuery.each(self.res('mimes', 'text'), function() {
							self.textMimes[this.toLowerCase()] = true;
						});
					},
					actionTarget;
					
					if (isOpen) {
						pushLeafRoots('files');
					} else if (cmd === 'tree') {
						pushLeafRoots('tree');
					}
					
					response = self.normalize(response);
					
					if (!self.validResponse(cmd, response)) {
						return dfrd.reject({error :(response.norError || 'errResponse')}, xhr, response);
					}
					
					if (isOpen) {
						if (!self.api) {
							self.api    = response.api || 1;
							if (self.api == '2.0' && typeof response.options.uploadMaxSize !== 'undefined') {
								self.api = '2.1';
							}
							self.newAPI = self.api >= 2;
							self.oldAPI = !self.newAPI;
						}
						
						if (response.textMimes && Array.isArray(response.textMimes)) {
							self.resources.mimes.text = response.textMimes;
							setTextMimes();
						}
						!self.textMimes && setTextMimes();
						
						if (response.options) {
							cwdOptions = Object.assign({}, cwdOptionsDefault, response.options);
						}

						if (response.netDrivers) {
							self.netDrivers = response.netDrivers;
						}

						if (response.maxTargets) {
							self.maxTargets = response.maxTargets;
						}

						if (!!data.init) {
							self.uplMaxSize = self.returnBytes(response.uplMaxSize);
							self.uplMaxFile = !!response.uplMaxFile? Math.min(parseInt(response.uplMaxFile), 50) : 20;
						}
					}

					if (typeof prepare === 'function') {
						prepare(response);
					}
					
					if (navigate) {
						actionTarget = navigate.target || 'added';
						if (response[actionTarget] && response[actionTarget].length) {
							self.one(cmd + 'done', function() {
								var targets  = response[actionTarget],
									newItems = self.findCwdNodes(targets),
									inCwdHashes = function() {
										var cwdHash = self.cwd().hash;
										return jQuery.map(targets, function(f) { return (f.phash && cwdHash === f.phash)? f.hash : null; });
									},
									hashes   = inCwdHashes(),
									makeToast  = function(t) {
										var node = void(0),
											data = t.action? t.action.data : void(0),
											cmd, msg, done;
										if ((data || hashes.length) && t.action && (msg = t.action.msg) && (cmd = t.action.cmd) && (!t.action.cwdNot || t.action.cwdNot !== self.cwd().hash)) {
											done = t.action.done;
											data = t.action.data;
											node = jQuery('<div/>')
												.append(
													jQuery('<button type="button" class="ui-button ui-widget ui-state-default ui-corner-all elfinder-tabstop"><span class="ui-button-text">'
														+self.i18n(msg)
														+'</span></button>')
													.on('mouseenter mouseleave', function(e) { 
														jQuery(this).toggleClass('ui-state-hover', e.type == 'mouseenter');
													})
													.on('click', function() {
														self.exec(cmd, data || hashes, {_userAction: true, _currentType: 'toast', _currentNode: jQuery(this) });
														if (done) {
															self.one(cmd+'done', function() {
																if (typeof done === 'function') {
																	done();
																} else if (done === 'select') {
																	self.trigger('selectfiles', {files : inCwdHashes()});
																}
															});
														}
													})
												);
										}
										delete t.action;
										t.extNode = node;
										return t;
									};
								
								if (! navigate.toast) {
									navigate.toast = {};
								}
								
								!navigate.noselect && self.trigger('selectfiles', {files : self.searchStatus.state > 1 ? jQuery.map(targets, function(f) { return f.hash; }) : hashes});
								
								if (newItems.length) {
									if (!navigate.noscroll) {
										newItems.first().trigger('scrolltoview', {blink : false});
										self.resources.blink(newItems, 'lookme');
									}
									if (jQuery.isPlainObject(navigate.toast.incwd)) {
										self.toast(makeToast(navigate.toast.incwd));
									}
								} else {
									if (jQuery.isPlainObject(navigate.toast.inbuffer)) {
										self.toast(makeToast(navigate.toast.inbuffer));
									}
								}
							});
						}
					}
					
					dfrd.resolve(response);
					
					response.debug && self.debug('backend-debug', response);
				};
				self.abortXHR(xhr);
				lazy? self.lazy(resolve) : resolve();
			},
			xhr, _xhr,
			xhrAbort = function(e) {
				if (xhr && xhr.state() === 'pending') {
					self.abortXHR(xhr, { quiet: true , abort: true });
					if (!e || (e.type !== 'unload' && e.type !== 'destroy')) {
						self.autoSync();
					}
				}
			},
			abort = function(e){
				self.trigger(cmd + 'done');
				if (e.type == 'autosync') {
					if (e.data.action != 'stop') return;
				} else if (e.type != 'unload' && e.type != 'destroy' && e.type != 'openxhrabort') {
					if (!e.data.added || !e.data.added.length) {
						return;
					}
				}
				xhrAbort(e);
			},
			request = function(mode) {
				var queueAbort = function() {
					syncOnFail = false;
					dfrd.reject();
				};
				
				if (mode) {
					if (mode === 'cmd') {
						return cmd;
					}
				}
				
				if (isOpen) {
					if (requestQueueSkipOpen) {
						return dfrd.reject();
					}
					requestQueueSkipOpen = true;
				}
				
				dfrd.always(function() {
					delete options.headers['X-elFinderReqid'];
				}).fail(function(error, xhr, response) {
					var errData = {
						cmd: cmd,
						err: error,
						xhr: xhr,
						rc: response
					};

					// unset this cmd queue when user canceling
					// see notify : function - `cancel.reject(0);`
					if (error === 0) {
						if (requestQueue.length) {
							requestQueue = jQuery.grep(requestQueue, function(req) {
								return (req('cmd') === cmd) ? false : true;
							});
						}
					}
					// trigger "requestError" event
					self.trigger('requestError', errData);
					if (errData._event && errData._event.isDefaultPrevented()) {
						deffail = false;
						syncOnFail = false;
						if (error) {
							error.error = '';
						}
					}
					// abort xhr
					xhrAbort();
					if (isOpen) {
						openDir = self.file(data.target);
						openDir && openDir.volumeid && self.isRoot(openDir) && delete self.volumeExpires[openDir.volumeid];
					}
					self.trigger(cmd + 'fail', response);
					if (error) {
						deffail ? self.error(error) : self.debug('error', self.i18n(error));
					}
					syncOnFail && self.sync();
				});

				if (!cmd) {
					syncOnFail = false;
					return dfrd.reject({error :'errCmdReq'});
				}
				
				if (self.maxTargets && data.targets && data.targets.length > self.maxTargets) {
					syncOnFail = false;
					return dfrd.reject({error :['errMaxTargets', self.maxTargets]});
				}

				defdone && dfrd.done(done);
				
				// quiet abort not completed "open" requests
				if (isOpen) {
					while ((_xhr = queue.pop())) {
						_xhr.queueAbort();
					}
					if (cwd !== data.target) {
						while ((_xhr = cwdQueue.pop())) {
							_xhr.queueAbort();
						}
					}
				}

				// trigger abort autoSync for commands to add the item
				if (jQuery.inArray(cmd, (self.cmdsToAdd + ' autosync').split(' ')) !== -1) {
					if (cmd !== 'autosync') {
						self.autoSync('stop');
						dfrd.always(function() {
							self.autoSync();
						});
					}
					self.trigger('openxhrabort');
				}

				delete options.preventFail;

				if (self.api >= 2.1029) {
					if (useCache) {
						options.headers['X-elFinderReqid'] = reqId;
					} else {
						Object.assign(options.data, { reqid : reqId });
					}
				}
				
				// function for set value of this syncOnFail
				dfrd.syncOnFail = function(state) {
					syncOnFail = !!state;
				};

				requestCnt++;

				dfrd.xhr = xhr = self.transport.send(options).always(function() {
					// set responseURL from native xhr object
					if (options._xhr && typeof options._xhr.responseURL !== 'undefined') {
						xhr.responseURL = options._xhr.responseURL || '';
					}
					--requestCnt;
					if (requestQueue.length) {
						requestQueue.shift()();
					} else {
						requestQueueSkipOpen = false;
					}
				}).fail(error).done(success);
				
				if (self.api >= 2.1029) {
					xhr._requestId = reqId;
				}
				
				if (isOpen || (data.compare && cmd === 'info')) {
					// regist function queueAbort
					xhr.queueAbort = queueAbort;
					// add autoSync xhr into queue
					queue.unshift(xhr);
					// bind abort()
					data.compare && self.bind(self.cmdsToAdd + ' autosync openxhrabort', abort);
					dfrd.always(function() {
						var ndx = jQuery.inArray(xhr, queue);
						data.compare && self.unbind(self.cmdsToAdd + ' autosync openxhrabort', abort);
						ndx !== -1 && queue.splice(ndx, 1);
					});
				} else if (jQuery.inArray(cmd, self.abortCmdsOnOpen) !== -1) {
					// regist function queueAbort
					xhr.queueAbort = queueAbort;
					// add "open" xhr, only cwd xhr into queue
					cwdQueue.unshift(xhr);
					dfrd.always(function() {
						var ndx = jQuery.inArray(xhr, cwdQueue);
						ndx !== -1 && cwdQueue.splice(ndx, 1);
					});
				}
				
				// abort pending xhr on window unload or elFinder destroy
				self.bind('unload destroy', abort);
				dfrd.always(function() {
					self.unbind('unload destroy', abort);
				});
				
				return dfrd;
			},
			queueingRequest = function() {
				// show notify
				if (notify.type && notify.cnt) {
					if (cancel) {
						notify.cancel = dfrd;
						opts.eachCancel && (notify.id = +new Date());
					}
					timeout = setTimeout(function() {
						self.notify(notify);
						dfrd.always(function() {
							notify.cnt = -(parseInt(notify.cnt)||0);
							self.notify(notify);
						});
					}, self.notifyDelay);
					
					dfrd.always(function() {
						clearTimeout(timeout);
					});
				}
				// queueing
				if (isOpen) {
					requestQueueSkipOpen = false;
				}
				if (requestCnt < requestMaxConn) {
					// do request
					return request();
				} else {
					if (isOpen) {
						requestQueue.unshift(request);
					} else {
						requestQueue.push(request);
					}
					return dfrd;
				}
			},
			bindData = {opts: opts, result: true},
			openDir;
		
		// prevent request initial request is completed
		if (!self.api && !data.init) {
			syncOnFail = false;
			return dfrd.reject();
		}

		// trigger "request.cmd" that callback be able to cancel request by substituting "false" for "event.data.result"
		self.trigger('request.' + cmd, bindData, true);
		
		if (! bindData.result) {
			self.trigger(cmd + 'done');
			return dfrd.reject();
		} else if (typeof bindData.result === 'object' && bindData.result.promise) {
			bindData.result
				.done(queueingRequest)
				.fail(function() {
					self.trigger(cmd + 'done');
					dfrd.reject();
				});
			return dfrd;
		}
		
		return queueingRequest();
	};
	
	/**
	 * Call cache()
	 * Store info about files/dirs in "files" object.
	 *
	 * @param  Array  files
	 * @return void
	 */
	this.cache = function(dataArray) {
		if (! Array.isArray(dataArray)) {
			dataArray = [ dataArray ];
		}
		cache(dataArray);
	};
	
	/**
	 * Update file object caches by respose data object
	 * 
	 * @param  Object  respose data object
	 * @return void
	 */
	this.updateCache = function(data) {
		if (jQuery.isPlainObject(data)) {
			data.files && data.files.length && cache(data.files, 'files');
			data.tree && data.tree.length && cache(data.tree, 'tree');
			data.removed && data.removed.length && remove(data.removed);
			data.added && data.added.length && cache(data.added, 'add');
			data.changed && data.changed.length && change(data.changed, 'change');
		}
	};
	
	/**
	 * Compare current files cache with new files and return diff
	 * 
	 * @param  Array   new files
	 * @param  String  target folder hash
	 * @param  Array   exclude properties to compare
	 * @return Object
	 */
	this.diff = function(incoming, onlydir, excludeProps) {
		var raw       = {},
			added     = [],
			removed   = [],
			changed   = [],
			excludes  = null,
			isChanged = function(hash) {
				var l = changed.length;

				while (l--) {
					if (changed[l].hash == hash) {
						return true;
					}
				}
			};
		
		jQuery.each(incoming, function(i, f) {
			raw[f.hash] = f;
		});
		
		// make excludes object
		if (excludeProps && excludeProps.length) {
			excludes = {};
			jQuery.each(excludeProps, function() {
				excludes[this] = true;
			});
		}
		
		// find removed
		jQuery.each(files, function(hash, f) {
			if (! raw[hash] && (! onlydir || f.phash === onlydir)) {
				removed.push(hash);
			}
		});
		
		// compare files
		jQuery.each(raw, function(hash, file) {
			var origin  = files[hash],
				orgKeys = {},
				chkKeyLen;

			if (!origin) {
				added.push(file);
			} else {
				// make orgKeys object
				jQuery.each(Object.keys(origin), function() {
					orgKeys[this] = true;
				});
				jQuery.each(file, function(prop) {
					delete orgKeys[prop];
					if (! excludes || ! excludes[prop]) {
						if (file[prop] !== origin[prop]) {
							changed.push(file);
							orgKeys = {};
							return false;
						}
					}
				});
				chkKeyLen = Object.keys(orgKeys).length;
				if (chkKeyLen !== 0) {
					if (excludes) {
						jQuery.each(orgKeys, function(prop) {
							if (excludes[prop]) {
								--chkKeyLen;
							}
						});
					}
					(chkKeyLen !== 0) && changed.push(file);
				}
			}
		});
		
		// parents of removed dirs mark as changed (required for tree correct work)
		jQuery.each(removed, function(i, hash) {
			var file  = files[hash], 
				phash = file.phash;

			if (phash 
			&& file.mime == 'directory' 
			&& jQuery.inArray(phash, removed) === -1 
			&& raw[phash] 
			&& !isChanged(phash)) {
				changed.push(raw[phash]);
			}
		});
		
		return {
			added   : added,
			removed : removed,
			changed : changed
		};
	};
	
	/**
	 * Sync content
	 * 
	 * @return jQuery.Deferred
	 */
	this.sync = function(onlydir, polling) {
		this.autoSync('stop');
		var self  = this,
			compare = function(){
				var c = '', cnt = 0, mtime = 0;
				if (onlydir && polling) {
					jQuery.each(files, function(h, f) {
						if (f.phash && f.phash === onlydir) {
							++cnt;
							mtime = Math.max(mtime, f.ts);
						}
						c = cnt+':'+mtime;
					});
				}
				return c;
			},
			comp  = compare(),
			dfrd  = jQuery.Deferred().done(function() { self.trigger('sync'); }),
			opts = [this.request({
				data           : {cmd : 'open', reload : 1, target : cwd, tree : (! onlydir && this.ui.tree) ? 1 : 0, compare : comp},
				preventDefault : true
			})],
			exParents = function() {
				var parents = [],
					curRoot = self.file(self.root(cwd)),
					curId = curRoot? curRoot.volumeid : null,
					phash = self.cwd().phash,
					isroot,pdir;
				
				while(phash) {
					if (pdir = self.file(phash)) {
						if (phash.indexOf(curId) !== 0) {
							parents.push( {target: phash, cmd: 'tree'} );
							if (! self.isRoot(pdir)) {
								parents.push( {target: phash, cmd: 'parents'} );
							}
							curRoot = self.file(self.root(phash));
							curId = curRoot? curRoot.volumeid : null;
						}
						phash = pdir.phash;
					} else {
						phash = null;
					}
				}
				return parents;
			};
		
		if (! onlydir && self.api >= 2) {
			(cwd !== this.root()) && opts.push(this.request({
				data           : {cmd : 'parents', target : cwd},
				preventDefault : true
			}));
			jQuery.each(exParents(), function(i, data) {
				opts.push(self.request({
					data           : {cmd : data.cmd, target : data.target},
					preventDefault : true
				}));
			});
		}
		jQuery.when.apply($, opts)
		.fail(function(error, xhr) {
			if (! polling || jQuery.inArray('errOpen', error) !== -1) {
				dfrd.reject(error);
				self.parseError(error) && self.request({
					data   : {cmd : 'open', target : (self.lastDir('') || self.root()), tree : 1, init : 1},
					notify : {type : 'open', cnt : 1, hideCnt : true}
				});
			} else {
				dfrd.reject((error && xhr.status != 0)? error : void 0);
			}
		})
		.done(function(odata) {
			var pdata, argLen, i;
			
			if (odata.cwd.compare) {
				if (comp === odata.cwd.compare) {
					return dfrd.reject();
				}
			}
			
			// for 2nd and more requests
			pdata = {tree : []};
			
			// results marge of 2nd and more requests
			argLen = arguments.length;
			if (argLen > 1) {
				for(i = 1; i < argLen; i++) {
					if (arguments[i].tree && arguments[i].tree.length) {
						pdata.tree.push.apply(pdata.tree, arguments[i].tree);
					}
				}
			}
			
			if (self.api < 2.1) {
				if (! pdata.tree) {
					pdata.tree = [];
				}
				pdata.tree.push(odata.cwd);
			}
			
			// data normalize
			odata = self.normalize(odata);
			if (!self.validResponse('open', odata)) {
				return dfrd.reject((odata.norError || 'errResponse'));
			}
			pdata = self.normalize(pdata);
			if (!self.validResponse('tree', pdata)) {
				return dfrd.reject((pdata.norError || 'errResponse'));
			}
			
			var diff = self.diff(odata.files.concat(pdata && pdata.tree ? pdata.tree : []), onlydir);

			diff.added.push(odata.cwd);
			
			self.updateCache(diff);
			
			// trigger events
			diff.removed.length && self.remove(diff);
			diff.added.length   && self.add(diff);
			diff.changed.length && self.change(diff);
			return dfrd.resolve(diff);
		})
		.always(function() {
			self.autoSync();
		});
		
		return dfrd;
	};
	
	this.upload = function(files) {
		return this.transport.upload(files, this);
	};
	
	/**
	 * Bind keybord shortcut to keydown event
	 *
	 * @example
	 *    elfinder.shortcut({ 
	 *       pattern : 'ctrl+a', 
	 *       description : 'Select all files', 
	 *       callback : function(e) { ... }, 
	 *       keypress : true|false (bind to keypress instead of keydown) 
	 *    })
	 *
	 * @param  Object  shortcut config
	 * @return elFinder
	 */
	this.shortcut = function(s) {
		var patterns, pattern, code, i, parts;
		
		if (this.options.allowShortcuts && s.pattern && jQuery.isFunction(s.callback)) {
			patterns = s.pattern.toUpperCase().split(/\s+/);
			
			for (i= 0; i < patterns.length; i++) {
				pattern = patterns[i];
				parts   = pattern.split('+');
				code    = (code = parts.pop()).length == 1 
					? (code > 0 ? code : code.charCodeAt(0))
					: (code > 0 ? code : jQuery.ui.keyCode[code]);

				if (code && !shortcuts[pattern]) {
					shortcuts[pattern] = {
						keyCode     : code,
						altKey      : jQuery.inArray('ALT', parts)   != -1,
						ctrlKey     : jQuery.inArray('CTRL', parts)  != -1,
						shiftKey    : jQuery.inArray('SHIFT', parts) != -1,
						type        : s.type || 'keydown',
						callback    : s.callback,
						description : s.description,
						pattern     : pattern
					};
				}
			}
		}
		return this;
	};
	
	/**
	 * Registered shortcuts
	 *
	 * @type Object
	 **/
	this.shortcuts = function() {
		var ret = [];
		
		jQuery.each(shortcuts, function(i, s) {
			ret.push([s.pattern, self.i18n(s.description)]);
		});
		return ret;
	};
	
	/**
	 * Get/set clipboard content.
	 * Return new clipboard content.
	 *
	 * @example
	 *   this.clipboard([]) - clean clipboard
	 *   this.clipboard([{...}, {...}], true) - put 2 files in clipboard and mark it as cutted
	 * 
	 * @param  Array    new files hashes
	 * @param  Boolean  cut files?
	 * @return Array
	 */
	this.clipboard = function(hashes, cut) {
		var map = function() { return jQuery.map(clipboard, function(f) { return f.hash; }); };

		if (hashes !== void(0)) {
			clipboard.length && this.trigger('unlockfiles', {files : map()});
			remember = {};
			
			clipboard = jQuery.map(hashes||[], function(hash) {
				var file = files[hash];
				if (file) {
					
					remember[hash] = true;
					
					return {
						hash   : hash,
						phash  : file.phash,
						name   : file.name,
						mime   : file.mime,
						read   : file.read,
						locked : file.locked,
						cut    : !!cut
					};
				}
				return null;
			});
			this.trigger('changeclipboard', {clipboard : clipboard.slice(0, clipboard.length)});
			cut && this.trigger('lockfiles', {files : map()});
		}

		// return copy of clipboard instead of refrence
		return clipboard.slice(0, clipboard.length);
	};
	
	/**
	 * Return true if command enabled
	 * 
	 * @param  String       command name
	 * @param  String|void  hash for check of own volume's disabled cmds
	 * @return Boolean
	 */
	this.isCommandEnabled = function(name, dstHash) {
		var disabled, cmd,
			cvid = self.cwd().volumeid || '';
		
		// In serach results use selected item hash to check
		if (!dstHash && self.searchStatus.state > 1 && self.selected().length) {
			dstHash = self.selected()[0];
		}
		if (dstHash && (! cvid || dstHash.indexOf(cvid) !== 0)) {
			disabled = self.option('disabledFlip', dstHash);
			//if (! disabled) {
			//	disabled = {};
			//}
		} else {
			disabled = cwdOptions.disabledFlip/* || {}*/;
		}
		cmd = this._commands[name];
		return cmd ? (cmd.alwaysEnabled || !disabled[name]) : false;
	};
	
	/**
	 * Exec command and return result;
	 *
	 * @param  String         command name
	 * @param  String|Array   usualy files hashes
	 * @param  String|Array   command options
	 * @param  String|void    hash for enabled check of own volume's disabled cmds
	 * @return jQuery.Deferred
	 */		
	this.exec = function(cmd, files, opts, dstHash) {
		var dfrd, resType;
		
		// apply commandMap for keyboard shortcut
		if (!dstHash && this.commandMap[cmd] && this.commandMap[cmd] !== 'hidden') {
			cmd = this.commandMap[cmd];
		}

		if (cmd === 'open') {
			if (this.searchStatus.state || this.searchStatus.ininc) {
				this.trigger('searchend', { noupdate: true });
			}
			this.autoSync('stop');
		}
		if (!dstHash && files) {
			if (jQuery.isArray(files)) {
				if (files.length) {
					dstHash = files[0];
				}
			} else {
				dstHash = files;
			}
		}
		dfrd = this._commands[cmd] && this.isCommandEnabled(cmd, dstHash) 
			? this._commands[cmd].exec(files, opts) 
			: jQuery.Deferred().reject('No such command');
		
		resType = typeof dfrd;
		if (!(resType === 'object' && dfrd.promise)) {
			self.debug('warning', '"cmd.exec()" should be returned "jQuery.Deferred" but cmd "' + cmd + '" returned "' + resType + '"');
			dfrd = jQuery.Deferred().resolve();
		}
		
		this.trigger('exec', { dfrd : dfrd, cmd : cmd, files : files, opts : opts, dstHash : dstHash });
		return dfrd;
	};
	
	/**
	 * Create and return dialog.
	 *
	 * @param  String|DOMElement  dialog content
	 * @param  Object             dialog options
	 * @return jQuery
	 */
	this.dialog = function(content, options) {
		var dialog = jQuery('<div/>').append(content).appendTo(node).elfinderdialog(options, self),
			dnode  = dialog.closest('.ui-dialog'),
			resize = function(){
				! dialog.data('draged') && dialog.is(':visible') && dialog.elfinderdialog('posInit');
			};
		if (dnode.length) {
			self.bind('resize', resize);
			dnode.on('remove', function() {
				self.unbind('resize', resize);
			});
		}
		return dialog;
	};
	
	/**
	 * Create and return toast.
	 *
	 * @param  Object  toast options - see ui/toast.js
	 * @return jQuery
	 */
	this.toast = function(options) {
		return jQuery('<div class="ui-front"/>').appendTo(this.ui.toast).elfindertoast(options || {}, this);
	};
	
	/**
	 * Return UI widget or node
	 *
	 * @param  String  ui name
	 * @return jQuery
	 */
	this.getUI = function(ui) {
		return this.ui[ui] || (ui? jQuery() : node);
	};
	
	/**
	 * Return elFinder.command instance or instances array
	 *
	 * @param  String  command name
	 * @return Object | Array
	 */
	this.getCommand = function(name) {
		return name === void(0) ? this._commands : this._commands[name];
	};
	
	/**
	 * Resize elfinder node
	 * 
	 * @param  String|Number  width
	 * @param  String|Number  height
	 * @return void
	 */
	this.resize = function(w, h) {
		var getMargin = function() {
				var m = node.outerHeight(true) - node.innerHeight(),
					p = node;
				
				while(p.get(0) !== heightBase.get(0)) {
					p = p.parent();
					m += p.outerHeight(true) - p.innerHeight();
					if (! p.parent().length) {
						// reached the document
						break;
					}
				}
				return m;
			},
			fit = ! node.hasClass('ui-resizable'),
			prv = node.data('resizeSize') || {w: 0, h: 0},
			mt, size = {};

		if (heightBase && heightBase.data('resizeTm')) {
			clearTimeout(heightBase.data('resizeTm'));
		}
		
		if (typeof h === 'string') {
			if (mt = h.match(/^([0-9.]+)%$/)) {
				// setup heightBase
				if (! heightBase || ! heightBase.length) {
					heightBase = jQuery(window);
				}
				if (! heightBase.data('marginToMyNode')) {
					heightBase.data('marginToMyNode', getMargin());
				}
				if (! heightBase.data('fitToBaseFunc')) {
					heightBase.data('fitToBaseFunc', function(e) {
						var tm = heightBase.data('resizeTm');
						e.preventDefault();
						e.stopPropagation();
						tm && cancelAnimationFrame(tm);
						if (! node.hasClass('elfinder-fullscreen') && (!self.UA.Mobile || heightBase.data('rotated') !== self.UA.Rotated)) {
							heightBase.data('rotated', self.UA.Rotated);
							heightBase.data('resizeTm', requestAnimationFrame(function() {
								self.restoreSize();
							}));
						}
					});
				}
				if (typeof heightBase.data('rotated') === 'undefined') {
					heightBase.data('rotated', self.UA.Rotated);
				}
				h = heightBase.height() * (mt[1] / 100) - heightBase.data('marginToMyNode');
				
				heightBase.off('resize.' + self.namespace, heightBase.data('fitToBaseFunc'));
				fit && heightBase.on('resize.' + self.namespace, heightBase.data('fitToBaseFunc'));
			}
		}
		
		node.css({ width : w, height : parseInt(h) });
		size.w = Math.round(node.width());
		size.h = Math.round(node.height());
		node.data('resizeSize', size);
		if (size.w !== prv.w || size.h !== prv.h) {
			node.trigger('resize');
			this.trigger('resize', {width : size.w, height : size.h});
		}
	};
	
	/**
	 * Restore elfinder node size
	 * 
	 * @return elFinder
	 */
	this.restoreSize = function() {
		this.resize(width, height);
	};
	
	this.show = function() {
		node.show();
		this.enable().trigger('show');
	};
	
	this.hide = function() {
		if (this.options.enableAlways) {
			prevEnabled = enabled;
			enabled = false;
		}
		this.disable();
		this.trigger('hide');
		node.hide();
	};
	
	/**
	 * Lazy execution function
	 * 
	 * @param  Object  function
	 * @param  Number  delay
	 * @param  Object  options
	 * @return Object  jQuery.Deferred
	 */
	this.lazy = function(func, delay, opts) {
		var busy = function(state) {
				var cnt = node.data('lazycnt'),
					repaint;
				
				if (state) {
					repaint = node.data('lazyrepaint')? false : opts.repaint;
					if (! cnt) {
						node.data('lazycnt', 1)
							.addClass('elfinder-processing');
					} else {
						node.data('lazycnt', ++cnt);
					}
					if (repaint) {
						node.data('lazyrepaint', true).css('display'); // force repaint
					}
				} else {
					if (cnt && cnt > 1) {
						node.data('lazycnt', --cnt);
					} else {
						repaint = node.data('lazyrepaint');
						node.data('lazycnt', 0)
							.removeData('lazyrepaint')
							.removeClass('elfinder-processing');
						repaint && node.css('display'); // force repaint;
						self.trigger('lazydone');
					}
				}
			},
			dfd  = jQuery.Deferred(),
			callFunc = function() {
				dfd.resolve(func.call(dfd));
				busy(false);
			};
		
		delay = delay || 0;
		opts = opts || {};
		busy(true);
		
		if (delay) {
			setTimeout(callFunc, delay);
		} else {
			requestAnimationFrame(callFunc);
		}
		
		return dfd;
	};
	
	/**
	 * Destroy this elFinder instance
	 *
	 * @return void
	 **/
	this.destroy = function() {
		if (node && node[0].elfinder) {
			node.hasClass('elfinder-fullscreen') && self.toggleFullscreen(node);
			this.options.syncStart = false;
			this.autoSync('forcestop');
			this.trigger('destroy').disable();
			clipboard = [];
			selected = [];
			listeners = {};
			shortcuts = {};
			jQuery(window).off('.' + namespace);
			jQuery(document).off('.' + namespace);
			self.trigger = function(){};
			jQuery(beeper).remove();
			node.off()
				.removeData()
				.empty()
				.append(prevContent.contents())
				.attr('class', prevContent.attr('class'))
				.attr('style', prevContent.attr('style'));
			delete node[0].elfinder;
			// restore kept events
			jQuery.each(prevEvents, function(n, arr) {
				jQuery.each(arr, function(i, o) {
					node.on(o.type + (o.namespace? '.'+o.namespace : ''), o.selector, o.handler);
				});
			});
		}
	};
	
	/**
	 * Start or stop auto sync
	 * 
	 * @param  String|Bool  stop
	 * @return void
	 */
	this.autoSync = function(mode) {
		var sync;
		if (self.options.sync >= 1000) {
			if (syncInterval) {
				clearTimeout(syncInterval);
				syncInterval = null;
				self.trigger('autosync', {action : 'stop'});
			}
			
			if (mode === 'stop') {
				++autoSyncStop;
			} else {
				autoSyncStop = Math.max(0, --autoSyncStop);
			}
			
			if (autoSyncStop || mode === 'forcestop' || ! self.options.syncStart) {
				return;
			} 
			
			// run interval sync
			sync = function(start){
				var timeout;
				if (cwdOptions.syncMinMs && (start || syncInterval)) {
					start && self.trigger('autosync', {action : 'start'});
					timeout = Math.max(self.options.sync, cwdOptions.syncMinMs);
					syncInterval && clearTimeout(syncInterval);
					syncInterval = setTimeout(function() {
						var dosync = true, hash = cwd, cts;
						if (cwdOptions.syncChkAsTs && files[hash] && (cts = files[hash].ts)) {
							self.request({
								data : {cmd : 'info', targets : [hash], compare : cts, reload : 1},
								preventDefault : true
							})
							.done(function(data){
								var ts;
								dosync = true;
								if (data.compare) {
									ts = data.compare;
									if (ts == cts) {
										dosync = false;
									}
								}
								if (dosync) {
									self.sync(hash).always(function(){
										if (ts) {
											// update ts for cache clear etc.
											files[hash].ts = ts;
										}
										sync();
									});
								} else {
									sync();
								}
							})
							.fail(function(error, xhr){
								var err = self.parseError(error);
								if (err && xhr.status != 0) {
									self.error(err);
									if (Array.isArray(err) && jQuery.inArray('errOpen', err) !== -1) {
										self.request({
											data   : {cmd : 'open', target : (self.lastDir('') || self.root()), tree : 1, init : 1},
											notify : {type : 'open', cnt : 1, hideCnt : true}
										});
									}
								} else {
									syncInterval = setTimeout(function() {
										sync();
									}, timeout);
								}
							});
						} else {
							self.sync(cwd, true).always(function(){
								sync();
							});
						}
					}, timeout);
				}
			};
			sync(true);
		}
	};
	
	/**
	 * Return bool is inside work zone of specific point
	 * 
	 * @param  Number event.pageX
	 * @param  Number event.pageY
	 * @return Bool
	 */
	this.insideWorkzone = function(x, y, margin) {
		var rectangle = this.getUI('workzone').data('rectangle');
		
		margin = margin || 1;
		if (x < rectangle.left + margin
		|| x > rectangle.left + rectangle.width + margin
		|| y < rectangle.top + margin
		|| y > rectangle.top + rectangle.height + margin) {
			return false;
		}
		return true;
	};
	
	/**
	 * Target ui node move to last of children of elFinder node fot to show front
	 * 
	 * @param  Object  target    Target jQuery node object
	 */
	this.toFront = function(target) {
		var nodes = node.children('.ui-front').removeClass('elfinder-frontmost'),
			lastnode = nodes.last();
		nodes.css('z-index', '');
		jQuery(target).addClass('ui-front elfinder-frontmost').css('z-index', lastnode.css('z-index') + 1);
	};
	
	/**
	 * Remove class 'elfinder-frontmost' and hide() to target ui node
	 *
	 * @param      Object   target  Target jQuery node object
	 * @param      Boolean  nohide  Do not hide
	 */
	this.toHide =function(target, nohide) {
		var tgt = jQuery(target),
			last;

		!nohide && tgt.hide();
		if (tgt.hasClass('elfinder-frontmost')) {
			tgt.removeClass('elfinder-frontmost');
			last = node.children('.ui-front:visible:not(.elfinder-frontmost)').last();
			if (last.length) {
				requestAnimationFrame(function() {
					if (!node.children('.elfinder-frontmost:visible').length) {
						self.toFront(last);
						last.trigger('frontmost');
					}
				});
			}
		}
	};

	/**
	 * Return css object for maximize
	 * 
	 * @return Object
	 */
	this.getMaximizeCss = function() {
		return {
			width   : '100%',
			height  : '100%',
			margin  : 0,
			top     : 0,
			left    : 0,
			display : 'block',
			position: 'fixed',
			zIndex  : Math.max(self.zIndex? (self.zIndex + 1) : 0 , 1000),
			maxWidth : '',
			maxHeight: ''
		};
	};
	
	// Closure for togglefullscreen
	(function() {
		// check is in iframe
		if (inFrame && self.UA.Fullscreen) {
			self.UA.Fullscreen = false;
			if (parentIframe && typeof parentIframe.attr('allowfullscreen') !== 'undefined') {
				self.UA.Fullscreen = true;
			}
		}

		var orgStyle, bodyOvf, resizeTm, fullElm, exitFull, toFull,
			cls = 'elfinder-fullscreen',
			clsN = 'elfinder-fullscreen-native',
			checkDialog = function() {
				var t = 0,
					l = 0;
				jQuery.each(node.children('.ui-dialog,.ui-draggable'), function(i, d) {
					var $d = jQuery(d),
						pos = $d.position();
					
					if (pos.top < 0) {
						$d.css('top', t);
						t += 20;
					}
					if (pos.left < 0) {
						$d.css('left', l);
						l += 20;
					}
				});
			},
			funcObj = self.UA.Fullscreen? {
				// native full screen mode
				
				fullElm: function() {
					return document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement || null;
				},
				
				exitFull: function() {
					if (document.exitFullscreen) {
						return document.exitFullscreen();
					} else if (document.webkitExitFullscreen) {
						return document.webkitExitFullscreen();
					} else if (document.mozCancelFullScreen) {
						return document.mozCancelFullScreen();
					} else if (document.msExitFullscreen) {
						return document.msExitFullscreen();
					}
				},
				
				toFull: function(elem) {
					if (elem.requestFullscreen) {
						return elem.requestFullscreen();
					} else if (elem.webkitRequestFullscreen) {
						return elem.webkitRequestFullscreen();
					} else if (elem.mozRequestFullScreen) {
						return elem.mozRequestFullScreen();
					} else if (elem.msRequestFullscreen) {
						return elem.msRequestFullscreen();
					}
					return false;
				}
			} : {
				// node element maximize mode
				
				fullElm: function() {
					var full;
					if (node.hasClass(cls)) {
						return node.get(0);
					} else {
						full = node.find('.' + cls);
						if (full.length) {
							return full.get(0);
						}
					}
					return null;
				},
				
				exitFull: function() {
					var elm;
					
					jQuery(window).off('resize.' + namespace, resize);
					if (bodyOvf !== void(0)) {
						jQuery('body').css('overflow', bodyOvf);
					}
					bodyOvf = void(0);
					
					if (orgStyle) {
						elm = orgStyle.elm;
						restoreStyle(elm);
						jQuery(elm).trigger('resize', {fullscreen: 'off'});
					}
					
					jQuery(window).trigger('resize');
				},
				
				toFull: function(elem) {
					bodyOvf = jQuery('body').css('overflow') || '';
					jQuery('body').css('overflow', 'hidden');
					
					jQuery(elem).css(self.getMaximizeCss())
						.addClass(cls)
						.trigger('resize', {fullscreen: 'on'});
					
					checkDialog();
					
					jQuery(window).on('resize.' + namespace, resize).trigger('resize');
					
					return true;
				}
			},
			restoreStyle = function(elem) {
				if (orgStyle && orgStyle.elm == elem) {
					jQuery(elem).removeClass(cls + ' ' + clsN).attr('style', orgStyle.style);
					orgStyle = null;
				}
			},
			resize = function(e) {
				var elm;
				if (e.target === window) {
					resizeTm && cancelAnimationFrame(resizeTm);
					resizeTm = requestAnimationFrame(function() {
						if (elm = funcObj.fullElm()) {
							jQuery(elm).trigger('resize', {fullscreen: 'on'});
						}
					});
				}
			};
		
		jQuery(document).on('fullscreenchange.' + namespace + ' webkitfullscreenchange.' + namespace + ' mozfullscreenchange.' + namespace + ' MSFullscreenChange.' + namespace, function(e){
			if (self.UA.Fullscreen) {
				var elm = funcObj.fullElm(),
					win = jQuery(window);
				
				resizeTm && cancelAnimationFrame(resizeTm);
				if (elm === null) {
					win.off('resize.' + namespace, resize);
					if (orgStyle) {
						elm = orgStyle.elm;
						restoreStyle(elm);
						jQuery(elm).trigger('resize', {fullscreen: 'off'});
					}
				} else {
					jQuery(elm).addClass(cls + ' ' + clsN)
						.attr('style', 'width:100%; height:100%; margin:0; padding:0;')
						.trigger('resize', {fullscreen: 'on'});
					win.on('resize.' + namespace, resize);
					checkDialog();
				}
				win.trigger('resize');
			}
		});
		
		/**
		 * Toggle Full Scrren Mode
		 * 
		 * @param  Object target
		 * @param  Bool   full
		 * @return Object | Null  DOM node object of current full scrren
		 */
		self.toggleFullscreen = function(target, full) {
			var elm = jQuery(target).get(0),
				curElm = null;
			
			curElm = funcObj.fullElm();
			if (curElm) {
				if (curElm == elm) {
					if (full === true) {
						return curElm;
					}
				} else {
					if (full === false) {
						return curElm;
					}
				}
				funcObj.exitFull();
				return null;
			} else {
				if (full === false) {
					return null;
				}
			}
			
			orgStyle = {elm: elm, style: jQuery(elm).attr('style')};
			if (funcObj.toFull(elm) !== false) {
				return elm;
			} else {
				orgStyle = null;
				return null;
			}
		};
	})();
	
	// Closure for toggleMaximize
	(function(){
		var cls = 'elfinder-maximized',
		resizeTm,
		resize = function(e) {
			if (e.target === window && e.data && e.data.elm) {
				var elm = e.data.elm;
				resizeTm && cancelAnimationFrame(resizeTm);
				resizeTm = requestAnimationFrame(function() {
					elm.trigger('resize', {maximize: 'on'});
				});
			}
		},
		exitMax = function(elm) {
			jQuery(window).off('resize.' + namespace, resize);
			jQuery('body').css('overflow', elm.data('bodyOvf'));
			elm.removeClass(cls)
				.attr('style', elm.data('orgStyle'))
				.removeData('bodyOvf')
				.removeData('orgStyle');
			elm.trigger('resize', {maximize: 'off'});
		},
		toMax = function(elm) {
			elm.data('bodyOvf', jQuery('body').css('overflow') || '')
				.data('orgStyle', elm.attr('style'))
				.addClass(cls)
				.css(self.getMaximizeCss());
			jQuery('body').css('overflow', 'hidden');
			jQuery(window).on('resize.' + namespace, {elm: elm}, resize);
			elm.trigger('resize', {maximize: 'on'});
		};
		
		/**
		 * Toggle Maximize target node
		 * 
		 * @param  Object target
		 * @param  Bool   max
		 * @return void
		 */
		self.toggleMaximize = function(target, max) {
			var elm = jQuery(target),
				maximized = elm.hasClass(cls);
			
			if (maximized) {
				if (max === true) {
					return;
				}
				exitMax(elm);
			} else {
				if (max === false) {
					return;
				}
				toMax(elm);
			}
		};
	})();
	
	/*************  init stuffs  ****************/
	Object.assign(jQuery.ui.keyCode, {
		'F1' : 112,
		'F2' : 113,
		'F3' : 114,
		'F4' : 115,
		'F5' : 116,
		'F6' : 117,
		'F7' : 118,
		'F8' : 119,
		'F9' : 120,
		'F10' : 121,
		'F11' : 122,
		'F12' : 123,
		'DIG0' : 48,
		'DIG1' : 49,
		'DIG2' : 50,
		'DIG3' : 51,
		'DIG4' : 52,
		'DIG5' : 53,
		'DIG6' : 54,
		'DIG7' : 55,
		'DIG8' : 56,
		'DIG9' : 57,
		'NUM0' : 96,
		'NUM1' : 97,
		'NUM2' : 98,
		'NUM3' : 99,
		'NUM4' : 100,
		'NUM5' : 101,
		'NUM6' : 102,
		'NUM7' : 103,
		'NUM8' : 104,
		'NUM9' : 105,
		'CONTEXTMENU' : 93,
		'DOT'  : 190
	});
	
	this.dragUpload = false;
	this.xhrUpload  = (typeof XMLHttpRequestUpload != 'undefined' || typeof XMLHttpRequestEventTarget != 'undefined') && typeof File != 'undefined' && typeof FormData != 'undefined';
	
	// configure transport object
	this.transport = {};

	if (typeof(this.options.transport) == 'object') {
		this.transport = this.options.transport;
		if (typeof(this.transport.init) == 'function') {
			this.transport.init(this);
		}
	}
	
	if (typeof(this.transport.send) != 'function') {
		this.transport.send = function(opts) {
			if (!self.UA.IE) {
				// keep native xhr object for handling property responseURL
				opts._xhr = new XMLHttpRequest();
				opts.xhr = function() { return opts._xhr; };
			}
			return jQuery.ajax(opts);
		};
	}
	
	if (this.transport.upload == 'iframe') {
		this.transport.upload = jQuery.proxy(this.uploads.iframe, this);
	} else if (typeof(this.transport.upload) == 'function') {
		this.dragUpload = !!this.options.dragUploadAllow;
	} else if (this.xhrUpload && !!this.options.dragUploadAllow) {
		this.transport.upload = jQuery.proxy(this.uploads.xhr, this);
		this.dragUpload = true;
	} else {
		this.transport.upload = jQuery.proxy(this.uploads.iframe, this);
	}

	/**
	 * Decoding 'raw' string converted to unicode
	 * 
	 * @param  String str
	 * @return String
	 */
	this.decodeRawString = function(str) {
		var charCodes = function(str) {
			var i, len, arr;
			for (i=0,len=str.length,arr=[]; i<len; i++) {
				arr.push(str.charCodeAt(i));
			}
			return arr;
		},
		scalarValues = function(arr) {
			var scalars = [], i, len, c;
			if (typeof arr === 'string') {arr = charCodes(arr);}
			for (i=0,len=arr.length; c=arr[i],i<len; i++) {
				if (c >= 0xd800 && c <= 0xdbff) {
					scalars.push((c & 1023) + 64 << 10 | arr[++i] & 1023);
				} else {
					scalars.push(c);
				}
			}
			return scalars;
		},
		decodeUTF8 = function(arr) {
			var i, len, c, str, char = String.fromCharCode;
			for (i=0,len=arr.length,str=""; c=arr[i],i<len; i++) {
				if (c <= 0x7f) {
					str += char(c);
				} else if (c <= 0xdf && c >= 0xc2) {
					str += char((c&31)<<6 | arr[++i]&63);
				} else if (c <= 0xef && c >= 0xe0) {
					str += char((c&15)<<12 | (arr[++i]&63)<<6 | arr[++i]&63);
				} else if (c <= 0xf7 && c >= 0xf0) {
					str += char(
						0xd800 | ((c&7)<<8 | (arr[++i]&63)<<2 | arr[++i]>>>4&3) - 64,
						0xdc00 | (arr[i++]&15)<<6 | arr[i]&63
					);
				} else {
					str += char(0xfffd);
				}
			}
			return str;
		};
		
		return decodeUTF8(scalarValues(str));
	};

	/**
	 * Gets target file contents by file.hash
	 *
	 * @param      String  hash          The hash
	 * @param      String  responseType  'blob' or 'arraybuffer' (default)
	 * @return     arraybuffer|blob  The contents.
	 */
	this.getContents = function(hash, responseType) {
		var self = this,
			dfd = jQuery.Deferred(),
			type = responseType || 'arraybuffer',
			url, req;

		dfd.fail(function() {
			req && req.state() === 'pending' && req.reject();
		});

		url = self.openUrl(hash);
		if (!self.isSameOrigin(url)) {
			url = self.openUrl(hash, true);
		}
		req = self.request({
			data    : {cmd : 'get'},
			options : {
				url: url,
				type: 'get',
				cache : true,
				dataType : 'binary',
				responseType : type,
				processData: false
			}
		})
		.fail(function() {
			dfd.reject();
		})
		.done(function(data) {
			dfd.resolve(data);
		});

		return dfd;
	};

	this.getMimetype = function(name, orgMime) {
		var mime = orgMime,
			ext, m;
		m = (name + '').match(/\.([^.]+)$/);
		if (m && (ext = m[1])) {
			if (!extToMimeTable) {
				extToMimeTable = self.arrayFlip(self.mimeTypes);
			}
			if (!(mime = extToMimeTable[ext.toLowerCase()])) {
				mime = orgMime;
			}
		}
		return mime;
	};

	/**
	 * Supported check hash algorisms
	 * 
	 * @type Array
	 */
	self.hashCheckers = [];

	/**
	 * Closure of getContentsHashes()
	 */
	(function(self) {
		var hashLibs = {
				check : true
			},
			md5Calc = function(arr) {
				var spark = new hashLibs.SparkMD5.ArrayBuffer(),
					job;

				job = self.asyncJob(function(buf) {
					spark.append(buf);
				}, arr).done(function() {
					job._md5 = spark.end();
				});

				return job;
			},
			shaCalc = function(arr, length) {
				var sha, job;

				try {
					sha = new hashLibs.jsSHA('SHA' + (length.substr(0, 1) === '3'? length : ('-' + length)), 'ARRAYBUFFER');
					job = self.asyncJob(function(buf) {
						sha.update(buf);
					}, arr).done(function() {
						job._sha = sha.getHash('HEX');
					});
				} catch(e) {
					job = jQuery.Deferred.reject();
				}

				return job;
			};

		// make fm.hashCheckers
		if (self.options.cdns.sparkmd5) {
			self.hashCheckers.push('md5');
		}
		if (self.options.cdns.jssha) {
			self.hashCheckers = self.hashCheckers.concat(['sha1', 'sha224', 'sha256', 'sha384', 'sha512', 'sha3-224', 'sha3-256', 'sha3-384', 'sha3-512', 'shake128', 'shake256']);
		}

		/**
		 * Gets the contents hashes.
		 *
		 * @param      String  target      target file.hash
		 * @param      Object  needHashes  need hash lib names
		 * @return     Object  hashes with lib name as key
		 */
		self.getContentsHashes = function(target, needHashes) {
			var dfd = jQuery.Deferred(),
				needs = self.arrayFlip(needHashes || ['md5'], true),
				libs = [],
				jobs = [],
				res = {},
				req;

			dfd.fail(function() {
				req && req.reject();
			});

			if (hashLibs.check) {

				delete hashLibs.check;

				// load SparkMD5
				var libsmd5 = jQuery.Deferred();
				if (window.ArrayBuffer && self.options.cdns.sparkmd5) {
					libs.push(libsmd5);
					self.loadScript([self.options.cdns.sparkmd5],
						function(res) { 
							var SparkMD5 = res || window.SparkMD5;
							window.SparkMD5 && delete window.SparkMD5;
							libsmd5.resolve();
							if (SparkMD5) {
								hashLibs.SparkMD5 = SparkMD5;
							}
						},
						{
							tryRequire: true,
							error: function() {
								libsmd5.reject();
							}
						}
					);
				}

				// load jsSha
				var libssha = jQuery.Deferred();
				if (window.ArrayBuffer && self.options.cdns.jssha) {
					libs.push(libssha);
					self.loadScript([self.options.cdns.jssha],
						function(res) { 
							var jsSHA = res || window.jsSHA;
							window.jsSHA && delete window.jsSHA;
							libssha.resolve();
							if (jsSHA) {
								hashLibs.jsSHA = jsSHA;
							}
						},
						{
							tryRequire: true,
							error: function() {
								libssha.reject();
							}
						}
					);
				}
			}
			
			jQuery.when.apply(null, libs).always(function() {
				if (Object.keys(hashLibs).length) {
					req = self.getContents(target).done(function(arrayBuffer) {
						var arr = (arrayBuffer instanceof ArrayBuffer && arrayBuffer.byteLength > 0)? self.sliceArrayBuffer(arrayBuffer, 1048576) : false,
							i;

						if (needs.md5 && hashLibs.SparkMD5) {
							jobs.push(function() {
								var job = md5Calc(arr).done(function() {
									var f;
									res.md5 = job._md5;
									if (f = self.file(target)) {
										f.md5 = job._md5;
									}
									dfd.notify(res);
								});
								dfd.fail(function() {
									job.reject();
								});
								return job;
							});
						}
						if (hashLibs.jsSHA) {
							jQuery.each(['1', '224', '256', '384', '512', '3-224', '3-256', '3-384', '3-512', 'ke128', 'ke256'], function(i, v) {
								if (needs['sha' + v]) {
									jobs.push(function() {
										var job = shaCalc(arr, v).done(function() {
											var f;
											res['sha' + v] = job._sha;
											if (f = self.file(target)) {
												f['sha' + v] = job._sha;
											}
											dfd.notify(res);
										});
										return job;
									});
								}
							});
						}
						if (jobs.length) {
							self.sequence(jobs).always(function() {
								dfd.resolve(res);
							});
						} else {
							dfd.reject();
						}
					}).fail(function() {
						dfd.reject();
					});
				} else {
					dfd.reject();
				}
			});

			return dfd;
		};
	})(this);

	/**
	 * Parse error value to display
	 *
	 * @param  Mixed  error
	 * @return Mixed  parsed error
	 */
	this.parseError = function(error) {
		var arg = error;
		if (jQuery.isPlainObject(arg)) {
			arg = arg.error;
		}
		return arg;
	};

	/**
	 * Alias for this.trigger('error', {error : 'message'})
	 *
	 * @param  String  error message
	 * @return elFinder
	 **/
	this.error = function() {
		var arg = arguments[0],
			opts = arguments[1] || null,
			err;
		if (arguments.length == 1 && typeof(arg) === 'function') {
			return self.bind('error', arg);
		} else {
			err = this.parseError(arg);
			return (err === true || !err)? this : self.trigger('error', {error: err, opts : opts});
		}
	};
	
	// create bind/trigger aliases for build-in events
	jQuery.each(events, function(i, name) {
		self[name] = function() {
			var arg = arguments[0];
			return arguments.length == 1 && typeof(arg) == 'function'
				? self.bind(name, arg)
				: self.trigger(name, jQuery.isPlainObject(arg) ? arg : {});
		};
	});

	// bind core event handlers
	this
		.enable(function() {
			if (!enabled && self.api && self.visible() && self.ui.overlay.is(':hidden') && ! node.children('.elfinder-dialog.' + self.res('class', 'editing') + ':visible').length) {
				enabled = true;
				document.activeElement && document.activeElement.blur();
				node.removeClass('elfinder-disabled');
			}
		})
		.disable(function() {
			prevEnabled = enabled;
			enabled = false;
			node.addClass('elfinder-disabled');
		})
		.open(function() {
			selected = [];
		})
		.select(function(e) {
			var cnt = 0,
				unselects = [];
			selected = jQuery.grep(e.data.selected || e.data.value|| [], function(hash) {
				if (unselects.length || (self.maxTargets && ++cnt > self.maxTargets)) {
					unselects.push(hash);
					return false;
				} else {
					return files[hash] ? true : false;
				}
			});
			if (unselects.length) {
				self.trigger('unselectfiles', {files: unselects, inselect: true});
				self.toast({mode: 'warning', msg: self.i18n(['errMaxTargets', self.maxTargets])});
			}
		})
		.error(function(e) { 
			var opts  = {
					cssClass  : 'elfinder-dialog-error',
					title     : self.i18n('error'),
					resizable : false,
					destroyOnClose : true,
					buttons   : {}
				},
				node = self.getUI(),
				cnt = node.children('.elfinder-dialog-error').length,
				last, counter;
			
			if (cnt < self.options.maxErrorDialogs) {
				opts.buttons[self.i18n(self.i18n('btnClose'))] = function() { jQuery(this).elfinderdialog('close'); };

				if (e.data.opts && jQuery.isPlainObject(e.data.opts)) {
					Object.assign(opts, e.data.opts);
				}

				self.dialog('<span class="elfinder-dialog-icon elfinder-dialog-icon-error"/>'+self.i18n(e.data.error), opts);
			} else {
				last = node.children('.elfinder-dialog-error:last').children('.ui-dialog-content:first');
				counter = last.children('.elfinder-error-counter');
				if (counter.length) {
					counter.data('cnt', parseInt(counter.data('cnt')) + 1).html(self.i18n(['moreErrors', counter.data('cnt')]));
				} else {
					counter = jQuery('<span class="elfinder-error-counter">'+ self.i18n(['moreErrors', 1]) +'</span>').data('cnt', 1);
					last.append('<br/>', counter);
				}
			}
		})
		.bind('tmb', function(e) {
			jQuery.each(e.data.images||[], function(hash, tmb) {
				if (files[hash]) {
					files[hash].tmb = tmb;
				}
			});
		})
		.bind('searchstart', function(e) {
			Object.assign(self.searchStatus, e.data);
			self.searchStatus.state = 1;
		})
		.bind('search', function(e) {
			self.searchStatus.state = 2;
		})
		.bind('searchend', function() {
			self.searchStatus.state = 0;
			self.searchStatus.ininc = false;
			self.searchStatus.mixed = false;
		})
		.bind('canMakeEmptyFile', function(e) {
			var data = e.data,
				obj = {};
			if (data && Array.isArray(data.mimes)) {
				if (!data.unshift) {
					obj = self.mimesCanMakeEmpty;
				}
				jQuery.each(data.mimes, function() {
					if (!obj[this]) {
						obj[this] = self.mimeTypes[this];
					}
				});
				if (data.unshift) {
					self.mimesCanMakeEmpty = Object.assign(obj, self.mimesCanMakeEmpty);
				}
			}
		})
		.bind('themechange', function() {
			requestAnimationFrame(function() {
				self.trigger('uiresize');
			});
		})
		;

	// We listen and emit a sound on delete according to option
	if (true === this.options.sound) {
		this.bind('playsound', function(e) {
			var play  = beeper.canPlayType && beeper.canPlayType('audio/wav; codecs="1"'),
				file = e.data && e.data.soundFile;

			play && file && play != '' && play != 'no' && jQuery(beeper).html('<source src="' + soundPath + file + '" type="audio/wav">')[0].play();
		});
	}

	// bind external event handlers
	jQuery.each(this.options.handlers, function(event, callback) {
		self.bind(event, callback);
	});

	/**
	 * History object. Store visited folders
	 *
	 * @type Object
	 **/
	this.history = new this.history(this);
	
	/**
	 * Root hashed
	 * 
	 * @type Object
	 */
	this.roots = {};
	
	/**
	 * leaf roots
	 * 
	 * @type Object
	 */
	this.leafRoots = {};
	
	this.volumeExpires = {};

	/**
	 * Loaded commands
	 *
	 * @type Object
	 **/
	this._commands = {};
	
	if (!Array.isArray(this.options.commands)) {
		this.options.commands = [];
	}
	
	if (jQuery.inArray('*', this.options.commands) !== -1) {
		this.options.commands = Object.keys(this.commands);
	}
	
	/**
	 * UI command map of cwd volume ( That volume driver option `uiCmdMap` )
	 *
	 * @type Object
	 **/
	this.commandMap = {};
	
	/**
	 * cwd options of each volume
	 * key: volumeid
	 * val: options object
	 * 
	 * @type Object
	 */
	this.volOptions = {};

	/**
	 * Has volOptions data
	 * 
	 * @type Boolean
	 */
	this.hasVolOptions = false;

	/**
	 * Hash of trash holders
	 * key: trash folder hash
	 * val: source volume hash
	 * 
	 * @type Object
	 */
	this.trashes = {};

	/**
	 * cwd options of each folder/file
	 * key: hash
	 * val: options object
	 *
	 * @type Object
	 */
	this.optionsByHashes = {};
	
	/**
	 * UI Auto Hide Functions
	 * Each auto hide function mast be call to `fm.trigger('uiautohide')` at end of process
	 *
	 * @type Array
	 **/
	this.uiAutoHide = [];
	
	// trigger `uiautohide`
	this.one('open', function() {
		if (self.uiAutoHide.length) {
			setTimeout(function() {
				self.trigger('uiautohide');
			}, 500);
		}
	});
	
	// Auto Hide Functions sequential processing start
	this.bind('uiautohide', function() {
		if (self.uiAutoHide.length) {
			self.uiAutoHide.shift()();
		}
	});

	if (this.options.width) {
		width = this.options.width;
	}
	
	if (this.options.height) {
		height = this.options.height;
	}
	
	if (this.options.heightBase) {
		heightBase = jQuery(this.options.heightBase);
	}
	
	if (this.options.soundPath) {
		soundPath = this.options.soundPath.replace(/\/+$/, '') + '/';
	} else {
		soundPath = this.baseUrl + soundPath;
	}
	
	self.one('opendone', function() {
		var tm;
		// attach events to document
		jQuery(document)
			// disable elfinder on click outside elfinder
			.on('click.'+namespace, function(e) { enabled && ! self.options.enableAlways && !jQuery(e.target).closest(node).length && self.disable(); })
			// exec shortcuts
			.on(keydown+' '+keypress+' '+keyup+' '+mousedown, execShortcut);
		
		// attach events to window
		self.options.useBrowserHistory && jQuery(window)
			.on('popstate.' + namespace, function(ev) {
				var state = ev.originalEvent.state || {},
					hasThash = state.thash? true : false,
					dialog = node.find('.elfinder-frontmost:visible'),
					input = node.find('.elfinder-navbar-dir,.elfinder-cwd-filename').find('input,textarea'),
					onOpen, toast;
				if (!hasThash) {
					state = { thash: self.cwd().hash };
					// scroll to elFinder node
					jQuery('html,body').animate({ scrollTop: node.offset().top });
				}
				if (dialog.length || input.length) {
					history.pushState(state, null, location.pathname + location.search + '#elf_' + state.thash);
					if (dialog.length) {
						if (!dialog.hasClass(self.res('class', 'preventback'))) {
							if (dialog.hasClass('elfinder-contextmenu')) {
								jQuery(document).trigger(jQuery.Event('keydown', { keyCode: jQuery.ui.keyCode.ESCAPE, ctrlKey : false, shiftKey : false, altKey : false, metaKey : false }));
							} else if (dialog.hasClass('elfinder-dialog')) {
								dialog.elfinderdialog('close');
							} else {
								dialog.trigger('close');
							}
						}
					} else {
						input.trigger(jQuery.Event('keydown', { keyCode: jQuery.ui.keyCode.ESCAPE, ctrlKey : false, shiftKey : false, altKey : false, metaKey : false }));
					}
				} else {
					if (hasThash) {
						!jQuery.isEmptyObject(self.files()) && self.request({
							data   : {cmd  : 'open', target : state.thash, onhistory : 1},
							notify : {type : 'open', cnt : 1, hideCnt : true},
							syncOnFail : true
						});
					} else {
						onOpen = function() {
							toast.trigger('click');
						};
						self.one('open', onOpen, true);
						toast = self.toast({
							msg: self.i18n('pressAgainToExit'),
							onHidden: function() {
								self.unbind('open', onOpen);
								history.pushState(state, null, location.pathname + location.search + '#elf_' + state.thash);
							}
						});
					}
				}
			});
		
		jQuery(window).on('resize.' + namespace, function(e){
			if (e.target === this) {
				tm && cancelAnimationFrame(tm);
				tm = requestAnimationFrame(function() {
					var prv = node.data('resizeSize') || {w: 0, h: 0},
						size = {w: Math.round(node.width()), h: Math.round(node.height())};
					node.data('resizeSize', size);
					if (size.w !== prv.w || size.h !== prv.h) {
						node.trigger('resize');
						self.trigger('resize', {width : size.w, height : size.h});
					}
				});
			}
		})
		.on('beforeunload.' + namespace,function(e){
			var msg, cnt;
			if (node.is(':visible')) {
				if (self.ui.notify.children().length && jQuery.inArray('hasNotifyDialog', self.options.windowCloseConfirm) !== -1) {
					msg = self.i18n('ntfsmth');
				} else if (node.find('.'+self.res('class', 'editing')).length && jQuery.inArray('editingFile', self.options.windowCloseConfirm) !== -1) {
					msg = self.i18n('editingFile');
				} else if ((cnt = Object.keys(self.selected()).length) && jQuery.inArray('hasSelectedItem', self.options.windowCloseConfirm) !== -1) {
					msg = self.i18n('hasSelected', ''+cnt);
				} else if ((cnt = Object.keys(self.clipboard()).length) && jQuery.inArray('hasClipboardData', self.options.windowCloseConfirm) !== -1) {
					msg = self.i18n('hasClipboard', ''+cnt);
				}
				if (msg) {
					e.returnValue = msg;
					return msg;
				}
			}
			self.trigger('unload');
		});

		// bind window onmessage for CORS
		jQuery(window).on('message.' + namespace, function(e){
			var res = e.originalEvent || null,
				obj, data;
			if (res && self.uploadURL.indexOf(res.origin) === 0) {
				try {
					obj = JSON.parse(res.data);
					data = obj.data || null;
					if (data) {
						if (data.error) {
							if (obj.bind) {
								self.trigger(obj.bind+'fail', data);
							}
							self.error(data.error);
						} else {
							data.warning && self.error(data.warning);
							self.updateCache(data);
							data.removed && data.removed.length && self.remove(data);
							data.added   && data.added.length   && self.add(data);
							data.changed && data.changed.length && self.change(data);
							if (obj.bind) {
								self.trigger(obj.bind, data);
								self.trigger(obj.bind+'done');
							}
							data.sync && self.sync();
						}
					}
				} catch (e) {
					self.sync();
				}
			}
		});

		// elFinder enable always
		if (self.options.enableAlways) {
			jQuery(window).on('focus.' + namespace, function(e){
				(e.target === this) && self.enable();
			});
			if (inFrame) {
				jQuery(window.top).on('focus.' + namespace, function() {
					if (self.enable() && (! parentIframe || parentIframe.is(':visible'))) {
						requestAnimationFrame(function() {
							jQuery(window).trigger('focus');
						});
					}
				});
			}
		} else if (inFrame) {
			jQuery(window).on('blur.' + namespace, function(e){
				enabled && e.target === this && self.disable();
			});
		}

		// return focus to the window on click (elFInder in the frame)
		if (inFrame) {
			node.on('click', function(e) {
				jQuery(window).trigger('focus');
			});
		}
		
		// elFinder to enable by mouse over
		if (self.options.enableByMouseOver) {
			node.on('mouseenter touchstart', function(e) {
				(inFrame) && jQuery(window).trigger('focus');
				! self.enabled() && self.enable();
			});
		}
	});

	// store instance in node
	node[0].elfinder = this;

	// auto load language file
	dfrdsBeforeBootup.push((function() {
		var lang   = self.lang,
			langJs = self.i18nBaseUrl + 'elfinder.' + lang + '.js',
			dfd    = jQuery.Deferred().done(function() {
				if (self.i18[lang]) {
					self.lang = lang;
				}
				self.trigger('i18load');
				i18n = self.lang === 'en' 
					? self.i18['en'] 
					: jQuery.extend(true, {}, self.i18['en'], self.i18[self.lang]);
			});
		
		if (!self.i18[lang]) {
			self.lang = 'en';
			if (self.hasRequire) {
				require([langJs], function() {
					dfd.resolve();
				}, function() {
					dfd.resolve();
				});
			} else {
				self.loadScript([langJs], function() {
					dfd.resolve();
				}, {
					loadType: 'tag',
					error : function() {
						dfd.resolve();
					}
				});
			}
		} else {
			dfd.resolve();
		}
		return dfd;
	})());
	
	// elFinder boot up function
	bootUp = function() {
		var columnNames;

		/**
		 * i18 messages
		 *
		 * @type Object
		 **/
		self.messages = i18n.messages;
		
		// check jquery ui
		if (!(jQuery.fn.selectable && jQuery.fn.draggable && jQuery.fn.droppable && jQuery.fn.resizable && jQuery.fn.slider)) {
			return alert(self.i18n('errJqui'));
		}
		
		// check node
		if (!node.length) {
			return alert(self.i18n('errNode'));
		}
		// check connector url
		if (!self.options.url) {
			return alert(self.i18n('errURL'));
		}
		
		// column key/name map for fm.getColumnName()
		columnNames = Object.assign({
			name : self.i18n('name'),
			perm : self.i18n('perms'),
			date : self.i18n('modify'),
			size : self.i18n('size'),
			kind : self.i18n('kind'),
			modestr : self.i18n('mode'),
			modeoct : self.i18n('mode'),
			modeboth : self.i18n('mode')
		}, self.options.uiOptions.cwd.listView.columnsCustomName);

		/**
		 * Gets the column name of cwd list view
		 *
		 * @param      String  key     The key
		 * @return     String  The column name.
		 */
		self.getColumnName = function(key) {
			return columnNames[key] || self.i18n(key);
		};

		/**
		 * Interface direction
		 *
		 * @type String
		 * @default "ltr"
		 **/
		self.direction = i18n.direction;
		
		/**
		 * Date/time format
		 *
		 * @type String
		 * @default "m.d.Y"
		 **/
		self.dateFormat = self.options.dateFormat || i18n.dateFormat;
		
		/**
		 * Date format like "Yesterday 10:20:12"
		 *
		 * @type String
		 * @default "{day} {time}"
		 **/
		self.fancyFormat = self.options.fancyDateFormat || i18n.fancyDateFormat;
		
		/**
		 * Date format for if upload file has not original unique name
		 * e.g. Clipboard image data, Image data taken with iOS
		 *
		 * @type String
		 * @default "ymd-His"
		 **/
		self.nonameDateFormat = (self.options.nonameDateFormat || i18n.nonameDateFormat).replace(/[\/\\]/g, '_');

		/**
		 * Css classes 
		 *
		 * @type String
		 **/
		self.cssClass = 'ui-helper-reset ui-helper-clearfix ui-widget ui-widget-content ui-corner-all elfinder elfinder-'
				+(self.direction == 'rtl' ? 'rtl' : 'ltr')
				+(self.UA.Touch? (' elfinder-touch' + (self.options.resizable ? ' touch-punch' : '')) : '')
				+(self.UA.Mobile? ' elfinder-mobile' : '')
				+(self.UA.iOS? ' elfinder-ios' : '')
				+' '+self.options.cssClass;

		// prepare node
		node.addClass(self.cssClass)
			.on(mousedown, function() {
				!enabled && self.enable();
			});

		// draggable closure
		(function() {
			var ltr, wzRect, wzBottom, wzBottom2, nodeStyle,
				keyEvt = keydown + 'draggable' + ' keyup.' + namespace + 'draggable';
			
			/**
			 * Base draggable options
			 *
			 * @type Object
			 **/
			self.draggable = {
				appendTo   : node,
				addClasses : false,
				distance   : 4,
				revert     : true,
				refreshPositions : false,
				cursor     : 'crosshair',
				cursorAt   : {left : 50, top : 47},
				scroll     : false,
				start      : function(e, ui) {
					var helper   = ui.helper,
						targets  = jQuery.grep(helper.data('files')||[], function(h) {
							if (h) {
								remember[h] = true;
								return true;
							}
							return false;
						}),
						locked   = false,
						cnt, h;
					
					// fix node size
					nodeStyle = node.attr('style');
					node.width(node.width()).height(node.height());
					
					// set var for drag()
					ltr = (self.direction === 'ltr');
					wzRect = self.getUI('workzone').data('rectangle');
					wzBottom = wzRect.top + wzRect.height;
					wzBottom2 = wzBottom - self.getUI('navdock').outerHeight(true);
					
					self.draggingUiHelper = helper;
					cnt = targets.length;
					while (cnt--) {
						h = targets[cnt];
						if (files[h].locked) {
							locked = true;
							helper.data('locked', true);
							break;
						}
					}
					!locked && self.trigger('lockfiles', {files : targets});
		
					helper.data('autoScrTm', setInterval(function() {
						if (helper.data('autoScr')) {
							self.autoScroll[helper.data('autoScr')](helper.data('autoScrVal'));
						}
					}, 50));
				},
				drag       : function(e, ui) {
					var helper = ui.helper,
						autoScr, autoUp, bottom;
					
					if ((autoUp = wzRect.top > e.pageY) || wzBottom2 < e.pageY) {
						if (wzRect.cwdEdge > e.pageX) {
							autoScr = (ltr? 'navbar' : 'cwd') + (autoUp? 'Up' : 'Down');
						} else {
							autoScr = (ltr? 'cwd' : 'navbar') + (autoUp? 'Up' : 'Down');
						}
						if (!autoUp) {
							if (autoScr.substr(0, 3) === 'cwd') {
								if (wzBottom < e.pageY) {
									bottom = wzBottom;
								} else {
									autoScr = null;
								}
							} else {
								bottom = wzBottom2;
							}
						}
						if (autoScr) {
							helper.data('autoScr', autoScr);
							helper.data('autoScrVal', Math.pow((autoUp? wzRect.top - e.pageY : e.pageY - bottom), 1.3));
						}
					}
					if (! autoScr) {
						if (helper.data('autoScr')) {
							helper.data('refreshPositions', 1).data('autoScr', null);
						}
					}
					if (helper.data('refreshPositions') && jQuery(this).elfUiWidgetInstance('draggable')) {
						if (helper.data('refreshPositions') > 0) {
							jQuery(this).draggable('option', { refreshPositions : true, elfRefresh : true });
							helper.data('refreshPositions', -1);
						} else {
							jQuery(this).draggable('option', { refreshPositions : false, elfRefresh : false });
							helper.data('refreshPositions', null);
						}
					}
				},
				stop       : function(e, ui) {
					var helper = ui.helper,
						files;
					
					jQuery(document).off(keyEvt);
					jQuery(this).elfUiWidgetInstance('draggable') && jQuery(this).draggable('option', { refreshPositions : false });
					self.draggingUiHelper = null;
					self.trigger('focus').trigger('dragstop');
					if (! helper.data('droped')) {
						files = jQuery.grep(helper.data('files')||[], function(h) { return h? true : false ;});
						self.trigger('unlockfiles', {files : files});
						self.trigger('selectfiles', {files : self.selected()});
					}
					self.enable();
					
					// restore node style
					node.attr('style', nodeStyle);
					
					helper.data('autoScrTm') && clearInterval(helper.data('autoScrTm'));
				},
				helper     : function(e, ui) {
					var element = this.id ? jQuery(this) : jQuery(this).parents('[id]:first'),
						helper  = jQuery('<div class="elfinder-drag-helper"><span class="elfinder-drag-helper-icon-status"/></div>'),
						icon    = function(f) {
							var mime = f.mime, i, tmb = self.tmb(f);
							i = '<div class="elfinder-cwd-icon elfinder-cwd-icon-drag '+self.mime2class(mime)+' ui-corner-all"/>';
							if (tmb) {
								i = jQuery(i).addClass(tmb.className).css('background-image', "url('"+tmb.url+"')").get(0).outerHTML;
							} else if (f.icon) {
								i = jQuery(i).css(self.getIconStyle(f, true)).get(0).outerHTML;
							}
							if (f.csscls) {
								i = '<div class="'+f.csscls+'">' + i + '</div>';
							}
							return i;
						},
						hashes, l, ctr;
					
					self.draggingUiHelper && self.draggingUiHelper.stop(true, true);
					
					self.trigger('dragstart', {target : element[0], originalEvent : e}, true);
					
					hashes = element.hasClass(self.res('class', 'cwdfile')) 
						? self.selected() 
						: [self.navId2Hash(element.attr('id'))];
					
					helper.append(icon(files[hashes[0]])).data('files', hashes).data('locked', false).data('droped', false).data('namespace', namespace).data('dropover', 0);
		
					if ((l = hashes.length) > 1) {
						helper.append(icon(files[hashes[l-1]]) + '<span class="elfinder-drag-num">'+l+'</span>');
					}
					
					jQuery(document).on(keyEvt, function(e){
						var chk = (e.shiftKey||e.ctrlKey||e.metaKey);
						if (ctr !== chk) {
							ctr = chk;
							if (helper.is(':visible') && helper.data('dropover') && ! helper.data('droped')) {
								helper.toggleClass('elfinder-drag-helper-plus', helper.data('locked')? true : ctr);
								self.trigger(ctr? 'unlockfiles' : 'lockfiles', {files : hashes, helper: helper});
							}
						}
					});
					
					return helper;
				}
			};
		})();

		// in getFileCallback set - change default actions on double click/enter/ctrl+enter
		if (self.commands.getfile) {
			if (typeof(self.options.getFileCallback) == 'function') {
				self.bind('dblclick', function(e) {
					e.preventDefault();
					self.exec('getfile').fail(function() {
						self.exec('open', e.data && e.data.file? [ e.data.file ]: void(0));
					});
				});
				self.shortcut({
					pattern     : 'enter',
					description : self.i18n('cmdgetfile'),
					callback    : function() { self.exec('getfile').fail(function() { self.exec(self.OS == 'mac' ? 'rename' : 'open'); }); }
				})
				.shortcut({
					pattern     : 'ctrl+enter',
					description : self.i18n(self.OS == 'mac' ? 'cmdrename' : 'cmdopen'),
					callback    : function() { self.exec(self.OS == 'mac' ? 'rename' : 'open'); }
				});
			} else {
				self.options.getFileCallback = null;
			}
		}

		// load commands
		jQuery.each(self.commands, function(name, cmd) {
			var proto = Object.assign({}, cmd.prototype),
				extendsCmd, opts;
			if (jQuery.isFunction(cmd) && !self._commands[name] && (cmd.prototype.forceLoad || jQuery.inArray(name, self.options.commands) !== -1)) {
				extendsCmd = cmd.prototype.extendsCmd || '';
				if (extendsCmd) {
					if (jQuery.isFunction(self.commands[extendsCmd])) {
						cmd.prototype = Object.assign({}, base, new self.commands[extendsCmd](), cmd.prototype);
					} else {
						return true;
					}
				} else {
					cmd.prototype = Object.assign({}, base, cmd.prototype);
				}
				self._commands[name] = new cmd();
				cmd.prototype = proto;
				opts = self.options.commandsOptions[name] || {};
				if (extendsCmd && self.options.commandsOptions[extendsCmd]) {
					opts = jQuery.extend(true, {}, self.options.commandsOptions[extendsCmd], opts);
				}
				self._commands[name].setup(name, opts);
				// setup linked commands
				if (self._commands[name].linkedCmds.length) {
					jQuery.each(self._commands[name].linkedCmds, function(i, n) {
						var lcmd = self.commands[n];
						if (jQuery.isFunction(lcmd) && !self._commands[n]) {
							lcmd.prototype = base;
							self._commands[n] = new lcmd();
							self._commands[n].setup(n, self.options.commandsOptions[n]||{});
						}
					});
				}
			}
		});

		/**
		 * UI nodes
		 *
		 * @type Object
		 **/
		self.ui = {
			// container for nav panel and current folder container
			workzone : jQuery('<div/>').appendTo(node).elfinderworkzone(self),
			// container for folders tree / places
			navbar : jQuery('<div/>').appendTo(node).elfindernavbar(self, self.options.uiOptions.navbar || {}),
			// container for for preview etc at below the navbar
			navdock : jQuery('<div/>').appendTo(node).elfindernavdock(self, self.options.uiOptions.navdock || {}),
			// contextmenu
			contextmenu : jQuery('<div/>').appendTo(node).elfindercontextmenu(self),
			// overlay
			overlay : jQuery('<div/>').appendTo(node).elfinderoverlay({
				show : function() { self.disable(); },
				hide : function() { prevEnabled && self.enable(); }
			}),
			// current folder container
			cwd : jQuery('<div/>').appendTo(node).elfindercwd(self, self.options.uiOptions.cwd || {}),
			// notification dialog window
			notify : self.dialog('', {
				cssClass      : 'elfinder-dialog-notify',
				position      : self.options.notifyDialog.position,
				absolute      : true,
				resizable     : false,
				autoOpen      : false,
				closeOnEscape : false,
				title         : '&nbsp;',
				width         : self.options.notifyDialog.width? parseInt(self.options.notifyDialog.width) : null,
				minHeight     : null
			}),
			statusbar : jQuery('<div class="ui-widget-header ui-helper-clearfix ui-corner-bottom elfinder-statusbar"/>').hide().appendTo(node),
			toast : jQuery('<div class="elfinder-toast"/>').appendTo(node),
			bottomtray : jQuery('<div class="elfinder-bottomtray">').appendTo(node)
		};

		self.trigger('uiready');

		// load required ui
		jQuery.each(self.options.ui || [], function(i, ui) {
			var name = 'elfinder'+ui,
				opts = self.options.uiOptions[ui] || {};
	
			if (!self.ui[ui] && jQuery.fn[name]) {
				// regist to self.ui before make instance
				self.ui[ui] = jQuery('<'+(opts.tag || 'div')+'/>').appendTo(node);
				self.ui[ui][name](self, opts);
			}
		});
		
		// update size	
		self.resize(width, height);
		
		// make node resizable
		if (self.options.resizable) {
			node.resizable({
				resize    : function(e, ui) {
					self.resize(ui.size.width, ui.size.height);
				},
				handles   : 'se',
				minWidth  : 300,
				minHeight : 200
			});
			if (self.UA.Touch) {
				node.addClass('touch-punch');
			}
		}

		(function() {
			var navbar = self.getUI('navbar'),
				cwd    = self.getUI('cwd').parent();
			
			self.autoScroll = {
				navbarUp   : function(v) {
					navbar.scrollTop(Math.max(0, navbar.scrollTop() - v));
				},
				navbarDown : function(v) {
					navbar.scrollTop(navbar.scrollTop() + v);
				},
				cwdUp     : function(v) {
					cwd.scrollTop(Math.max(0, cwd.scrollTop() - v));
				},
				cwdDown   : function(v) {
					cwd.scrollTop(cwd.scrollTop() + v);
				}
			};
		})();

		// Swipe on the touch devices to show/hide of toolbar or navbar
		if (self.UA.Touch) {
			(function() {
				var lastX, lastY, nodeOffset, nodeWidth, nodeTop, navbarW, toolbarH,
					navbar = self.getUI('navbar'),
					toolbar = self.getUI('toolbar'),
					moveEv = 'touchmove.stopscroll',
					moveTm,
					moveUpOn = function(e) {
						var touches = e.originalEvent.touches || [{}],
							y = touches[0].pageY || null;
						if (!lastY || y < lastY) {
							e.preventDefault();
							moveTm && clearTimeout(moveTm);
						}
					},
					moveDownOn = function(e) {
						e.preventDefault();
						moveTm && clearTimeout(moveTm);
					},
					moveOff = function() {
						moveTm = setTimeout(function() {
							node.off(moveEv);
						}, 100);
					},
					handleW, handleH = 50;

				navbar = navbar.children().length? navbar : null;
				toolbar = toolbar.length? toolbar : null;
				node.on('touchstart touchmove touchend', function(e) {
					if (e.type === 'touchend') {
						lastX = false;
						lastY = false;
						moveOff();
						return;
					}
					
					var touches = e.originalEvent.touches || [{}],
						x = touches[0].pageX || null,
						y = touches[0].pageY || null,
						ltr = (self.direction === 'ltr'),
						navbarMode, treeWidth, swipeX, moveX, toolbarT, mode;
					
					if (x === null || y === null || (e.type === 'touchstart' && touches.length > 1)) {
						return;
					}
					
					if (e.type === 'touchstart') {
						nodeOffset = node.offset();
						nodeWidth = node.width();
						if (navbar) {
							lastX = false;
							if (navbar.is(':hidden')) {
								if (! handleW) {
									handleW = Math.max(50, nodeWidth / 10);
								}
								if ((ltr? (x - nodeOffset.left) : (nodeWidth + nodeOffset.left - x)) < handleW) {
									lastX = x;
								}
							} else if (! e.originalEvent._preventSwipeX) {
								navbarW = navbar.width();
								if (ltr) {
									swipeX = (x < nodeOffset.left + navbarW);
								} else {
									swipeX = (x > nodeOffset.left + nodeWidth - navbarW);
								}
								if (swipeX) {
									handleW = Math.max(50, nodeWidth / 10);
									lastX = x;
								} else {
									lastX = false;
								}
							}
						}
						if (toolbar) {
							lastY = false;
							if (! e.originalEvent._preventSwipeY) {
								toolbarH = toolbar.height();
								nodeTop = nodeOffset.top;
								if (y - nodeTop < (toolbar.is(':hidden')? handleH : (toolbarH + 30))) {
									lastY = y;
									node.on(moveEv, toolbar.is(':hidden')? moveDownOn: moveUpOn);
								}
							}
						}
					} else {
						if (navbar && lastX !== false) {
							navbarMode = (ltr? (lastX > x) : (lastX < x))? 'navhide' : 'navshow';
							moveX = Math.abs(lastX - x);
							if (navbarMode === 'navhide' && moveX > navbarW * 0.6
								|| (moveX > (navbarMode === 'navhide'? navbarW / 3 : 45)
									&& (navbarMode === 'navshow'
										|| (ltr? x < nodeOffset.left + 20 : x > nodeOffset.left + nodeWidth - 20)
									))
							) {
								self.getUI('navbar').trigger(navbarMode, {handleW: handleW});
								lastX = false;
							}
						}
						if (toolbar && lastY !== false ) {
							toolbarT = toolbar.offset().top;
							if (Math.abs(lastY - y) > Math.min(45, toolbarH / 3)) {
								mode = (lastY > y)? 'slideUp' : 'slideDown';
								if (mode === 'slideDown' || toolbarT + 20 > y) {
									if (toolbar.is(mode === 'slideDown' ? ':hidden' : ':visible')) {
										toolbar.stop(true, true).trigger('toggle', {duration: 100, handleH: handleH});
									}
									lastY = false;
								}
							}
						}
					}
				});
			})();
		}

		if (self.dragUpload) {
			// add event listener for HTML5 DnD upload
			(function() {
				var isin = function(e) {
					return (e.target.nodeName !== 'TEXTAREA' && e.target.nodeName !== 'INPUT' && jQuery(e.target).closest('div.ui-dialog-content').length === 0);
				},
				ent       = 'native-drag-enter',
				disable   = 'native-drag-disable',
				c         = 'class',
				navdir    = self.res(c, 'navdir'),
				droppable = self.res(c, 'droppable'),
				dropover  = self.res(c, 'adroppable'),
				arrow     = self.res(c, 'navarrow'),
				clDropActive = self.res(c, 'adroppable'),
				wz        = self.getUI('workzone'),
				ltr       = (self.direction === 'ltr'),
				clearTm   = function() {
					autoScrTm && cancelAnimationFrame(autoScrTm);
					autoScrTm = null;
				},
				wzRect, autoScrFn, autoScrTm;
				
				node.on('dragenter', function(e) {
					clearTm();
					if (isin(e)) {
						e.preventDefault();
						e.stopPropagation();
						wzRect = wz.data('rectangle');
					}
				})
				.on('dragleave', function(e) {
					clearTm();
					if (isin(e)) {
						e.preventDefault();
						e.stopPropagation();
					}
				})
				.on('dragover', function(e) {
					var autoUp;
					if (isin(e)) {
						e.preventDefault();
						e.stopPropagation();
						e.originalEvent.dataTransfer.dropEffect = 'none';
						if (! autoScrTm) {
							autoScrTm = requestAnimationFrame(function() {
								var wzBottom = wzRect.top + wzRect.height,
									wzBottom2 = wzBottom - self.getUI('navdock').outerHeight(true),
									fn;
								if ((autoUp = e.pageY < wzRect.top) || e.pageY > wzBottom2 ) {
									if (wzRect.cwdEdge > e.pageX) {
										fn = (ltr? 'navbar' : 'cwd') + (autoUp? 'Up' : 'Down');
									} else {
										fn = (ltr? 'cwd' : 'navbar') + (autoUp? 'Up' : 'Down');
									}
									if (!autoUp) {
										if (fn.substr(0, 3) === 'cwd') {
											if (wzBottom < e.pageY) {
												wzBottom2 = wzBottom;
											} else {
												fn = '';
											}
										}
									}
									fn && self.autoScroll[fn](Math.pow((autoUp? wzRect.top - e.pageY : e.pageY - wzBottom2), 1.3));
								}
								autoScrTm = null;
							});
						}
					} else {
						clearTm();
					}
				})
				.on('drop', function(e) {
					clearTm();
					if (isin(e)) {
						e.stopPropagation();
						e.preventDefault();
					}
				});
				
				node.on('dragenter', '.native-droppable', function(e){
					if (e.originalEvent.dataTransfer) {
						var $elm = jQuery(e.currentTarget),
							id   = e.currentTarget.id || null,
							cwd  = null,
							elfFrom;
						if (!id) { // target is cwd
							cwd = self.cwd();
							$elm.data(disable, false);
							try {
								jQuery.each(e.originalEvent.dataTransfer.types, function(i, v){
									if (v.substr(0, 13) === 'elfinderfrom:') {
										elfFrom = v.substr(13).toLowerCase();
									}
								});
							} catch(e) {}
						}
						if (!cwd || (cwd.write && (!elfFrom || elfFrom !== (window.location.href + cwd.hash).toLowerCase()))) {
							e.preventDefault();
							e.stopPropagation();
							$elm.data(ent, true);
							$elm.addClass(clDropActive);
						} else {
							$elm.data(disable, true);
						}
					}
				})
				.on('dragleave', '.native-droppable', function(e){
					if (e.originalEvent.dataTransfer) {
						var $elm = jQuery(e.currentTarget);
						e.preventDefault();
						e.stopPropagation();
						if ($elm.data(ent)) {
							$elm.data(ent, false);
						} else {
							$elm.removeClass(clDropActive);
						}
					}
				})
				.on('dragover', '.native-droppable', function(e){
					if (e.originalEvent.dataTransfer) {
						var $elm = jQuery(e.currentTarget);
						e.preventDefault();
						e.stopPropagation();
						e.originalEvent.dataTransfer.dropEffect = $elm.data(disable)? 'none' : 'copy';
						$elm.data(ent, false);
					}
				})
				.on('drop', '.native-droppable', function(e){
					if (e.originalEvent && e.originalEvent.dataTransfer) {
						var $elm = jQuery(e.currentTarget),
							id;
						e.preventDefault();
						e.stopPropagation();
						$elm.removeClass(clDropActive);
						if (e.currentTarget.id) {
							id = $elm.hasClass(navdir)? self.navId2Hash(e.currentTarget.id) : self.cwdId2Hash(e.currentTarget.id);
						} else {
							id = self.cwd().hash;
						}
						e.originalEvent._target = id;
						self.exec('upload', {dropEvt: e.originalEvent, target: id}, void 0, id);
					}
				});
			})();
		}

		// trigger event cssloaded if cddAutoLoad disabled
		if (self.cssloaded === null) {
			// check css loaded and remove hide
			(function() {
				var loaded = function() {
						if (node.data('cssautoloadHide')) {
							node.data('cssautoloadHide').remove();
							node.removeData('cssautoloadHide');
						}
						self.cssloaded = true;
						requestAnimationFrame(function() {
							self.trigger('cssloaded');
						});
					},
					cnt, fi;
				if (node.css('visibility') === 'hidden') {
					cnt = 1000; // timeout 10 secs
					fi  = setInterval(function() {
						if (--cnt < 0 || node.css('visibility') !== 'hidden') {
							clearInterval(fi);
							loaded();
						}
					}, 10);
				} else {
					loaded();
				}
			})();
		} else {
			self.cssloaded = true;
			self.trigger('cssloaded');
		}

		// calculate elFinder node z-index
		self.zIndexCalc();

		// send initial request and start to pray >_<
		self.trigger('init')
			.request({
				data        : {cmd : 'open', target : self.startDir(), init : 1, tree : 1}, 
				preventDone : true,
				notify      : {type : 'open', cnt : 1, hideCnt : true},
				freeze      : true
			})
			.fail(function() {
				self.trigger('fail').disable().lastDir('');
				listeners = {};
				shortcuts = {};
				jQuery(document).add(node).off('.'+namespace);
				self.trigger = function() { };
			})
			.done(function(data) {
				var trashDisable = function(th) {
						var src = self.file(self.trashes[th]),
							d = self.options.debug,
							error;
						
						if (src && src.volumeid) {
							delete self.volOptions[src.volumeid].trashHash;
						}
						self.trashes[th] = false;
						self.debug('backend-error', 'Trash hash "'+th+'" was not found or not writable.');
					},
					toChkTh = {};
				
				// regist rawStringDecoder
				if (self.options.rawStringDecoder) {
					self.registRawStringDecoder(self.options.rawStringDecoder);
				}

				// re-calculate elFinder node z-index
				self.zIndexCalc();
				
				self.load().debug('api', self.api);
				// update ui's size after init
				node.trigger('resize');
				// initial open
				open(data);
				self.trigger('open', data, false);
				self.trigger('opendone');
				
				if (inFrame && self.options.enableAlways) {
					jQuery(window).trigger('focus');
				}
				
				// check self.trashes
				jQuery.each(self.trashes, function(th) {
					var dir = self.file(th),
						src;
					if (! dir) {
						toChkTh[th] = true;
					} else if (dir.mime !== 'directory' || ! dir.write) {
						trashDisable(th);
					}
				});
				if (Object.keys(toChkTh).length) {
					self.request({
						data : {cmd : 'info', targets : Object.keys(toChkTh)},
						preventDefault : true
					}).done(function(data) {
						if (data && data.files) {
							jQuery.each(data.files, function(i, dir) {
								if (dir.mime === 'directory' && dir.write) {
									delete toChkTh[dir.hash];
								}
							});
						}
					}).always(function() {
						jQuery.each(toChkTh, trashDisable);
					});
				}
				// to enable / disable
				self[self.options.enableAlways? 'enable' : 'disable']();
			});
		
		// self.timeEnd('load');
		// End of bootUp()
	};
	
	// call bootCallback function with elFinder instance, extraObject - { dfrdsBeforeBootup: dfrdsBeforeBootup }
	if (bootCallback && typeof bootCallback === 'function') {
		self.bootCallback = bootCallback;
		bootCallback.call(node.get(0), self, { dfrdsBeforeBootup: dfrdsBeforeBootup });
	}
	
	// call dfrdsBeforeBootup functions then boot up elFinder
	jQuery.when.apply(null, dfrdsBeforeBootup).done(function() {
		bootUp();
	}).fail(function(error) {
		self.error(error);
	});
};

//register elFinder to global scope
if (typeof toGlobal === 'undefined' || toGlobal) {
	window.elFinder = elFinder;
}

/**
 * Prototype
 * 
 * @type  Object
 */
elFinder.prototype = {
	
	uniqueid : 0,
	
	res : function(type, id) {
		return this.resources[type] && this.resources[type][id];
	}, 

	/**
	 * User os. Required to bind native shortcuts for open/rename
	 *
	 * @type String
	 **/
	OS : navigator.userAgent.indexOf('Mac') !== -1 ? 'mac' : navigator.userAgent.indexOf('Win') !== -1  ? 'win' : 'other',
	
	/**
	 * User browser UA.
	 * jQuery.browser: version deprecated: 1.3, removed: 1.9
	 *
	 * @type Object
	 **/
	UA : (function(){
		var self = this,
			webkit = !document.unqueID && !window.opera && !window.sidebar && window.localStorage && 'WebkitAppearance' in document.documentElement.style,
			chrome = webkit && window.chrome,
			/*setRotated = function() {
				var a = ((screen && screen.orientation && screen.orientation.angle) || window.orientation || 0) + 0;
				if (a === -90) {
					a = 270;
				}
				UA.Angle = a;
				UA.Rotated = a % 180 === 0? false : true;
			},*/
			UA = {
				// Browser IE <= IE 6
				ltIE6   : typeof window.addEventListener == "undefined" && typeof document.documentElement.style.maxHeight == "undefined",
				// Browser IE <= IE 7
				ltIE7   : typeof window.addEventListener == "undefined" && typeof document.querySelectorAll == "undefined",
				// Browser IE <= IE 8
				ltIE8   : typeof window.addEventListener == "undefined" && typeof document.getElementsByClassName == "undefined",
				// Browser IE <= IE 9
				ltIE9  : document.uniqueID && document.documentMode <= 9,
				// Browser IE <= IE 10
				ltIE10  : document.uniqueID && document.documentMode <= 10,
				// Browser IE >= IE 11
				gtIE11  : document.uniqueID && document.documentMode >= 11,
				IE      : document.uniqueID,
				Firefox : window.sidebar,
				Opera   : window.opera,
				Webkit  : webkit,
				Chrome  : chrome,
				Edge    : (chrome && window.msCredentials)? true : false,
				Safari  : webkit && !window.chrome,
				Mobile  : typeof window.orientation != "undefined",
				Touch   : typeof window.ontouchstart != "undefined",
				iOS     : navigator.platform.match(/^iP(?:[ao]d|hone)/),
				Fullscreen : (typeof (document.exitFullscreen || document.webkitExitFullscreen || document.mozCancelFullScreen || document.msExitFullscreen) !== 'undefined'),
				Angle   : 0,
				Rotated : false,
				CSS : (function() {
					var aStyle = document.createElement('a').style,
						pStyle = document.createElement('p').style,
						css;
					css = 'position:sticky;position:-webkit-sticky;';
					css += 'width:-webkit-max-content;width:-moz-max-content;width:-ms-max-content;width:max-content;';
					aStyle.cssText = css;
					return {
						positionSticky : aStyle.position.indexOf('sticky')!==-1,
						widthMaxContent : aStyle.width.indexOf('max-content')!==-1,
						flex : typeof pStyle.flex !== 'undefined'
					};
				})()
			};
			return UA;
	})(),
	
	/**
	 * Has RequireJS?
	 * 
	 * @type Boolean
	 */
	hasRequire : (typeof define === 'function' && define.amd),
	
	/**
	 * Current request command
	 * 
	 * @type  String
	 */
	currentReqCmd : '',
	
	/**
	 * Current keyboard state
	 * 
	 * @type  Object
	 */
	keyState : {},
	
	/**
	 * Internationalization object
	 * 
	 * @type  Object
	 */
	i18 : {
		en : {
			translator      : '',
			language        : 'English',
			direction       : 'ltr',
			dateFormat      : 'd.m.Y H:i',
			fancyDateFormat : '$1 H:i',
			nonameDateFormat : 'ymd-His',
			messages        : {}
		},
		months : ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
		monthsShort : ['msJan', 'msFeb', 'msMar', 'msApr', 'msMay', 'msJun', 'msJul', 'msAug', 'msSep', 'msOct', 'msNov', 'msDec'],

		days : ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
		daysShort : ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']
	},
	
	/**
	 * File mimetype to kind mapping
	 * 
	 * @type  Object
	 */
	kinds : 	{
			'unknown'                       : 'Unknown',
			'directory'                     : 'Folder',
			'group'                         : 'Selects',
			'symlink'                       : 'Alias',
			'symlink-broken'                : 'AliasBroken',
			'application/x-empty'           : 'TextPlain',
			'application/postscript'        : 'Postscript',
			'application/vnd.ms-office'     : 'MsOffice',
			'application/msword'            : 'MsWord',
			'application/vnd.ms-word'       : 'MsWord',
			'application/vnd.openxmlformats-officedocument.wordprocessingml.document' : 'MsWord',
			'application/vnd.ms-word.document.macroEnabled.12'                        : 'MsWord',
			'application/vnd.openxmlformats-officedocument.wordprocessingml.template' : 'MsWord',
			'application/vnd.ms-word.template.macroEnabled.12'                        : 'MsWord',
			'application/vnd.ms-excel'      : 'MsExcel',
			'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'       : 'MsExcel',
			'application/vnd.ms-excel.sheet.macroEnabled.12'                          : 'MsExcel',
			'application/vnd.openxmlformats-officedocument.spreadsheetml.template'    : 'MsExcel',
			'application/vnd.ms-excel.template.macroEnabled.12'                       : 'MsExcel',
			'application/vnd.ms-excel.sheet.binary.macroEnabled.12'                   : 'MsExcel',
			'application/vnd.ms-excel.addin.macroEnabled.12'                          : 'MsExcel',
			'application/vnd.ms-powerpoint' : 'MsPP',
			'application/vnd.openxmlformats-officedocument.presentationml.presentation' : 'MsPP',
			'application/vnd.ms-powerpoint.presentation.macroEnabled.12'              : 'MsPP',
			'application/vnd.openxmlformats-officedocument.presentationml.slideshow'  : 'MsPP',
			'application/vnd.ms-powerpoint.slideshow.macroEnabled.12'                 : 'MsPP',
			'application/vnd.openxmlformats-officedocument.presentationml.template'   : 'MsPP',
			'application/vnd.ms-powerpoint.template.macroEnabled.12'                  : 'MsPP',
			'application/vnd.ms-powerpoint.addin.macroEnabled.12'                     : 'MsPP',
			'application/vnd.openxmlformats-officedocument.presentationml.slide'      : 'MsPP',
			'application/vnd.ms-powerpoint.slide.macroEnabled.12'                     : 'MsPP',
			'application/pdf'               : 'PDF',
			'application/xml'               : 'XML',
			'application/vnd.oasis.opendocument.text' : 'OO',
			'application/vnd.oasis.opendocument.text-template'         : 'OO',
			'application/vnd.oasis.opendocument.text-web'              : 'OO',
			'application/vnd.oasis.opendocument.text-master'           : 'OO',
			'application/vnd.oasis.opendocument.graphics'              : 'OO',
			'application/vnd.oasis.opendocument.graphics-template'     : 'OO',
			'application/vnd.oasis.opendocument.presentation'          : 'OO',
			'application/vnd.oasis.opendocument.presentation-template' : 'OO',
			'application/vnd.oasis.opendocument.spreadsheet'           : 'OO',
			'application/vnd.oasis.opendocument.spreadsheet-template'  : 'OO',
			'application/vnd.oasis.opendocument.chart'                 : 'OO',
			'application/vnd.oasis.opendocument.formula'               : 'OO',
			'application/vnd.oasis.opendocument.database'              : 'OO',
			'application/vnd.oasis.opendocument.image'                 : 'OO',
			'application/vnd.openofficeorg.extension'                  : 'OO',
			'application/x-shockwave-flash' : 'AppFlash',
			'application/flash-video'       : 'Flash video',
			'application/x-bittorrent'      : 'Torrent',
			'application/javascript'        : 'JS',
			'application/rtf'               : 'RTF',
			'application/rtfd'              : 'RTF',
			'application/x-font-ttf'        : 'TTF',
			'application/x-font-otf'        : 'OTF',
			'application/x-rpm'             : 'RPM',
			'application/x-web-config'      : 'TextPlain',
			'application/xhtml+xml'         : 'HTML',
			'application/docbook+xml'       : 'DOCBOOK',
			'application/x-awk'             : 'AWK',
			'application/x-gzip'            : 'GZIP',
			'application/x-bzip2'           : 'BZIP',
			'application/x-xz'              : 'XZ',
			'application/zip'               : 'ZIP',
			'application/x-zip'               : 'ZIP',
			'application/x-rar'             : 'RAR',
			'application/x-tar'             : 'TAR',
			'application/x-7z-compressed'   : '7z',
			'application/x-jar'             : 'JAR',
			'text/plain'                    : 'TextPlain',
			'text/x-php'                    : 'PHP',
			'text/html'                     : 'HTML',
			'text/javascript'               : 'JS',
			'text/css'                      : 'CSS',
			'text/rtf'                      : 'RTF',
			'text/rtfd'                     : 'RTF',
			'text/x-c'                      : 'C',
			'text/x-csrc'                   : 'C',
			'text/x-chdr'                   : 'CHeader',
			'text/x-c++'                    : 'CPP',
			'text/x-c++src'                 : 'CPP',
			'text/x-c++hdr'                 : 'CPPHeader',
			'text/x-shellscript'            : 'Shell',
			'application/x-csh'             : 'Shell',
			'text/x-python'                 : 'Python',
			'text/x-java'                   : 'Java',
			'text/x-java-source'            : 'Java',
			'text/x-ruby'                   : 'Ruby',
			'text/x-perl'                   : 'Perl',
			'text/x-sql'                    : 'SQL',
			'text/xml'                      : 'XML',
			'text/x-comma-separated-values' : 'CSV',
			'text/x-markdown'               : 'Markdown',
			'image/x-ms-bmp'                : 'BMP',
			'image/jpeg'                    : 'JPEG',
			'image/gif'                     : 'GIF',
			'image/png'                     : 'PNG',
			'image/tiff'                    : 'TIFF',
			'image/x-targa'                 : 'TGA',
			'image/vnd.adobe.photoshop'     : 'PSD',
			'image/xbm'                     : 'XBITMAP',
			'image/pxm'                     : 'PXM',
			'audio/mpeg'                    : 'AudioMPEG',
			'audio/midi'                    : 'AudioMIDI',
			'audio/ogg'                     : 'AudioOGG',
			'audio/mp4'                     : 'AudioMPEG4',
			'audio/x-m4a'                   : 'AudioMPEG4',
			'audio/wav'                     : 'AudioWAV',
			'audio/x-mp3-playlist'          : 'AudioPlaylist',
			'video/x-dv'                    : 'VideoDV',
			'video/mp4'                     : 'VideoMPEG4',
			'video/mpeg'                    : 'VideoMPEG',
			'video/x-msvideo'               : 'VideoAVI',
			'video/quicktime'               : 'VideoMOV',
			'video/x-ms-wmv'                : 'VideoWM',
			'video/x-flv'                   : 'VideoFlash',
			'video/x-matroska'              : 'VideoMKV',
			'video/ogg'                     : 'VideoOGG'
		},
	
	/**
	 * File mimetype to file extention mapping
	 * 
	 * @type  Object
	 * @see   elFinder.mimetypes.js
	 */
	mimeTypes : {},
	
	/**
	 * Ajax request data validation rules
	 * 
	 * @type  Object
	 */
	rules : {
		defaults : function(data) {
			if (!data
			|| (data.added && !Array.isArray(data.added))
			||  (data.removed && !Array.isArray(data.removed))
			||  (data.changed && !Array.isArray(data.changed))) {
				return false;
			}
			return true;
		},
		open    : function(data) { return data && data.cwd && data.files && jQuery.isPlainObject(data.cwd) && Array.isArray(data.files); },
		tree    : function(data) { return data && data.tree && Array.isArray(data.tree); },
		parents : function(data) { return data && data.tree && Array.isArray(data.tree); },
		tmb     : function(data) { return data && data.images && (jQuery.isPlainObject(data.images) || Array.isArray(data.images)); },
		upload  : function(data) { return data && (jQuery.isPlainObject(data.added) || Array.isArray(data.added));},
		search  : function(data) { return data && data.files && Array.isArray(data.files); }
	},
	
	/**
	 * Commands costructors
	 *
	 * @type Object
	 */
	commands : {},
	
	/**
	 * Commands to add the item (space delimited)
	 * 
	 * @type String
	 */
	cmdsToAdd : 'archive duplicate extract mkdir mkfile paste rm upload',
	
	parseUploadData : function(text) {
		var self = this,
			data;
		
		if (!jQuery.trim(text)) {
			return {error : ['errResponse', 'errDataEmpty']};
		}
		
		try {
			data = JSON.parse(text);
		} catch (e) {
			return {error : ['errResponse', 'errDataNotJSON']};
		}
		
		data = self.normalize(data);
		if (!self.validResponse('upload', data)) {
			return {error : (response.norError || ['errResponse'])};
		}
		data.removed = jQuery.merge((data.removed || []), jQuery.map(data.added || [], function(f) { return self.file(f.hash)? f.hash : null; }));
		return data;
		
	},
	
	iframeCnt : 0,
	
	uploads : {
		// xhr muiti uploading flag
		xhrUploading: false,
		
		// Timer of request fail to sync
		failSyncTm: null,
		
		// current chunkfail requesting chunk
		chunkfailReq: {},
		
		// check file/dir exists
		checkExists: function(files, target, fm, isDir) {
			var dfrd = jQuery.Deferred(),
				names, renames = [], hashes = {}, chkFiles = [],
				cancel = function() {
					var i = files.length;
					while (--i > -1) {
						files[i]._remove = true;
					}
				},
				resolve = function() {
					dfrd.resolve(renames, hashes);
				},
				check = function() {
					var existed = [], exists = [], i, c,
						pathStr = target !== fm.cwd().hash? fm.path(target, true) + fm.option('separator', target) : '',
						confirm = function(ndx) {
							alert(1);
							var last = ndx == exists.length-1,
								opts = {
									cssClass : 'elfinder-confirm-upload',
									title  : fm.i18n('cmdupload'),
									text   : ['errExists', pathStr + exists[ndx].name, 'confirmRepl'], 
									all    : !last,
									accept : {
										label    : 'btnYes',
										callback : function(all) {
											!last && !all
												? confirm(++ndx)
												: resolve();
										}
									},
									reject : {
										label    : 'btnNo',
										callback : function(all) {
											var i;
			
											if (all) {
												i = exists.length;
												while (ndx < i--) {
													files[exists[i].i]._remove = true;
												}
											} else {
												files[exists[ndx].i]._remove = true;
											}
			
											!last && !all
												? confirm(++ndx)
												: resolve();
										}
									},
									cancel : {
										label    : 'btnCancel',
										callback : function() {
											cancel();
											resolve();
										}
									},
									buttons : [
										{
											label : 'btnBackup',
											cssClass : 'elfinder-confirm-btn-backup',
											callback : function(all) {
												var i;
												if (all) {
													i = exists.length;
													while (ndx < i--) {
														renames.push(exists[i].name);
													}
												} else {
													renames.push(exists[ndx].name);
												}
												!last && !all
													? confirm(++ndx)
													: resolve();
											}
										}
									]
								};
							
							if (!isDir) {
								opts.buttons.push({
									label : 'btnRename' + (last? '' : 'All'),
									cssClass : 'elfinder-confirm-btn-rename',
									callback : function() {
										renames = null;
										resolve();
									}
								});
							}
							if (fm.iframeCnt > 0) {
								delete opts.reject;
							}
							fm.confirm(opts);
						};
					
					if (! fm.file(target).read) {
						// for dropbox type
						resolve();
						return;
					}
					
					names = jQuery.map(files, function(file, i) { return file.name && (!fm.UA.iOS || file.name !== 'image.jpg')? {i: i, name: file.name} : null ;});
					
					fm.request({
						data : {cmd : 'ls', target : target, intersect : jQuery.map(names, function(item) { return item.name;})},
						notify : {type : 'preupload', cnt : 1, hideCnt : true},
						preventDefault : true
					})
					.done(function(data) {
						var existedArr, cwdItems;
						if (data) {
							if (data.error) {
								cancel();
							} else {
								if (fm.options.overwriteUploadConfirm && fm.option('uploadOverwrite', target)) {
									if (data.list) {
										if (Array.isArray(data.list)) {
											existed = data.list || [];
										} else {
											existedArr = [];
											existed = jQuery.map(data.list, function(n) {
												if (typeof n === 'string') {
													return n;
												} else {
													// support to >=2.1.11 plugin Normalizer, Sanitizer
													existedArr = existedArr.concat(n);
													return false;
												}
											});
											if (existedArr.length) {
												existed = existed.concat(existedArr);
											}
											hashes = data.list;
										}
										exists = jQuery.grep(names, function(name){
											return jQuery.inArray(name.name, existed) !== -1 ? true : false ;
										});
										if (exists.length && existed.length && target == fm.cwd().hash) {
											cwdItems = jQuery.map(fm.files(target), function(file) { return file.name; } );
											if (jQuery.grep(existed, function(n) { 
												return jQuery.inArray(n, cwdItems) === -1? true : false;
											}).length){
												fm.sync();
											}
										}
									}
								}
							}
						}
						if (exists.length > 0) {
							confirm(0);
						} else {
							resolve();
						}
					})
					.fail(function(error) {
						cancel();
						resolve();
						error && fm.error(error);
					});
				};
			if (fm.api >= 2.1 && typeof files[0] == 'object') {
				check();
			} else {
				resolve();
			}
			return dfrd;
		},
		
		// check droped contents
		checkFile : function(data, fm, target) {
			if (!!data.checked || data.type == 'files') {
				return data.files;
			} else if (data.type == 'data') {
				var dfrd = jQuery.Deferred(),
				scanDfd = jQuery.Deferred(),
				files = [],
				paths = [],
				dirctorys = [],
				processing = 0,
				items,
				mkdirs = [],
				cancel = false,
				toArray = function(list) {
					return Array.prototype.slice.call(list || [], 0);
				},
				doScan = function(items) {
					var entry, readEntries,
						excludes = fm.options.folderUploadExclude[fm.OS] || null,
						length = items.length,
						check = function() {
							if (--processing < 1 && scanDfd.state() === 'pending') {
								scanDfd.resolve();
							}
						},
						pushItem = function(file) {
							if (! excludes || ! file.name.match(excludes)) {
								paths.push(entry.fullPath || '');
								files.push(file);
							}
							check();
						},
						readEntries = function(dirReader) {
							var entries = [],
								read = function() {
									dirReader.readEntries(function(results) {
										if (cancel || !results.length) {
											for (var i = 0; i < entries.length; i++) {
												if (cancel) {
													scanDfd.reject();
													break;
												}
												doScan([entries[i]]);
											}
											check();
										} else {
											entries = entries.concat(toArray(results));
											read();
										}
									}, check);
								};
							read();
						};
					
					processing++;
					for (var i = 0; i < length; i++) {
						if (cancel) {
							scanDfd.reject();
							break;
						}
						entry = items[i];
						if (entry) {
							if (entry.isFile) {
								processing++;
								entry.file(pushItem, check);
							} else if (entry.isDirectory) {
								if (fm.api >= 2.1) {
									processing++;
									mkdirs.push(entry.fullPath);
									readEntries(entry.createReader()); // Start reading dirs.
								}
							}
						}
					}
					check();
					return scanDfd;
				}, hasDirs;
				
				items = jQuery.map(data.files.items, function(item){
					return item.getAsEntry? item.getAsEntry() : item.webkitGetAsEntry();
				});
				jQuery.each(items, function(i, item) {
					if (item.isDirectory) {
						hasDirs = true;
						return false;
					}
				});
				if (items.length > 0) {
					fm.uploads.checkExists(items, target, fm, hasDirs).done(function(renames, hashes){
						var dfds = [];
						if (fm.options.overwriteUploadConfirm && fm.option('uploadOverwrite', target)) {
							if (renames === null) {
								data.overwrite = 0;
								renames = [];
							}
							items = jQuery.grep(items, function(item){
								var i, bak, hash, dfd, hi;
								if (item.isDirectory && renames.length) {
									i = jQuery.inArray(item.name, renames);
									if (i !== -1) {
										renames.splice(i, 1);
										bak = fm.uniqueName(item.name + fm.options.backupSuffix , null, '');
										jQuery.each(hashes, function(h, name) {
											if (item.name == name) {
												hash = h;
												return false;
											}
										});
										if (! hash) {
											hash = fm.fileByName(item.name, target).hash;
										}
										fm.lockfiles({files : [hash]});
										dfd = fm.request({
											data   : {cmd : 'rename', target : hash, name : bak},
											notify : {type : 'rename', cnt : 1}
										})
										.fail(function() {
											item._remove = true;
											fm.sync();
										})
										.always(function() {
											fm.unlockfiles({files : [hash]});
										});
										dfds.push(dfd);
									}
								}
								return !item._remove? true : false;
							});
						}
						jQuery.when.apply($, dfds).done(function(){
							var notifyto, msg,
								id = +new Date();
							
							if (items.length > 0) {
								msg = fm.escape(items[0].name);
								if (items.length > 1) {
									msg += ' ... ' + items.length + fm.i18n('items');
								}
								notifyto = setTimeout(function() {
									fm.notify({
										type : 'readdir',
										id : id,
										cnt : 1,
										hideCnt: true,
										msg : fm.i18n('ntfreaddir') + ' (' + msg + ')',
										cancel: function() {
											cancel = true;
										}
									});
								}, fm.options.notifyDelay);
								doScan(items).done(function() {
									notifyto && clearTimeout(notifyto);
									fm.notify({type : 'readdir', id: id, cnt : -1});
									if (cancel) {
										dfrd.reject();
									} else {
										dfrd.resolve([files, paths, renames, hashes, mkdirs]);
									}
								}).fail(function() {
									dfrd.reject();
								});
							} else {
								dfrd.reject();
							}
						});
					});
					return dfrd.promise();
				} else {
					return dfrd.reject();
				}
			} else {
				var ret = [];
				var check = [];
				var str = data.files[0];
				if (data.type == 'html') {
					var tmp = jQuery("<html/>").append(jQuery.parseHTML(str.replace(/ src=/ig, ' _elfsrc='))),
						atag;
					jQuery('img[_elfsrc]', tmp).each(function(){
						var url, purl,
						self = jQuery(this),
						pa = self.closest('a');
						if (pa && pa.attr('href') && pa.attr('href').match(/\.(?:jpe?g|gif|bmp|png)/i)) {
							purl = pa.attr('href');
						}
						url = self.attr('_elfsrc');
						if (url) {
							if (purl) {
								jQuery.inArray(purl, ret) == -1 && ret.push(purl);
								jQuery.inArray(url, check) == -1 &&  check.push(url);
							} else {
								jQuery.inArray(url, ret) == -1 && ret.push(url);
							}
						}
						// Probably it's clipboard data
						if (ret.length === 1 && ret[0].match(/^data:image\/png/)) {
							data.clipdata = true;
						}
					});
					atag = jQuery('a[href]', tmp);
					atag.each(function(){
						var text, loc,
							parseUrl = function(url) {
								var a = document.createElement('a');
								a.href = url;
								return a;
							};
						if (text = jQuery(this).text()) {
							loc = parseUrl(jQuery(this).attr('href'));
							if (loc.href && loc.href.match(/^(?:ht|f)tp/i) && (atag.length === 1 || ! loc.pathname.match(/(?:\.html?|\/[^\/.]*)$/i) || jQuery.trim(text).match(/\.[a-z0-9-]{1,10}$/i))) {
								if (jQuery.inArray(loc.href, ret) == -1 && jQuery.inArray(loc.href, check) == -1) ret.push(loc.href);
							}
						}
					});
				} else {
					var regex, m, url;
					regex = /((?:ht|f)tps?:\/\/[-_.!~*\'()a-z0-9;/?:\@&=+\$,%#\*\[\]]+)/ig;
					while (m = regex.exec(str)) {
						url = m[1].replace(/&amp;/g, '&');
						if (jQuery.inArray(url, ret) == -1) ret.push(url);
					}
				}
				return ret;
			}
		},

		// upload transport using XMLHttpRequest
		xhr : function(data, fm) { 
			var self   = fm ? fm : this,
				node        = self.getUI(),
				xhr         = new XMLHttpRequest(),
				notifyto    = null, notifyto2 = null,
				dataChecked = data.checked,
				isDataType  = (data.isDataType || data.type == 'data'),
				target      = (data.target || self.cwd().hash),
				dropEvt     = (data.dropEvt || null),
				extraData  = data.extraData || null,
				chunkEnable = (self.option('uploadMaxConn', target) != -1),
				multiMax    = Math.min(5, Math.max(1, self.option('uploadMaxConn', target))),
				retryWait   = 10000, // 10 sec
				retryMax    = 30, // 10 sec * 30 = 300 secs (Max 5 mins)
				retry       = 0,
				getFile     = function(files) {
					var dfd = jQuery.Deferred(),
						file;
					if (files.promise) {
						files.always(function(f) {
							dfd.resolve(Array.isArray(f) && f.length? (isDataType? f[0][0] : f[0]) : {});
						});
					} else {
						dfd.resolve(files.length? (isDataType? files[0][0] : files[0]) : {});
					}
					return dfd;
				},
				dfrd   = jQuery.Deferred()
					.fail(function(err) {
						var error = self.parseError(err),
							userAbort;
						if (error === 'userabort') {
							userAbort = true;
							error = void 0;
						}
						if (files && (self.uploads.xhrUploading || userAbort)) {
							// send request om fail
							getFile(files).done(function(file) {
								if (!userAbort) {
									triggerError(error, file);
								}
								if (! file._cid) {
									// send sync request
									self.uploads.failSyncTm && clearTimeout(self.uploads.failSyncTm);
									self.uploads.failSyncTm = setTimeout(function() {
										self.sync(target);
									}, 1000);
								} else if (! self.uploads.chunkfailReq[file._cid]) {
									// send chunkfail request
									self.uploads.chunkfailReq[file._cid] = true;
									setTimeout(function() {
										fm.request({
											data : {
												cmd: 'upload',
												target: target,
												chunk: file._chunk,
												cid: file._cid,
												upload: ['chunkfail'],
												mimes: 'chunkfail'
											},
											options : {
												type: 'post',
												url: self.uploadURL
											},
											preventDefault: true
										}).always(function() {
											delete self.uploads.chunkfailReq[file._chunk];
										});
									}, 1000);
								}
							});
						} else {
							triggerError(error);
						}
						!userAbort && self.sync();
						self.uploads.xhrUploading = false;
						files = null;
					})
					.done(function(data) {
						self.uploads.xhrUploading = false;
						files = null;
						if (data) {
							self.currentReqCmd = 'upload';
							data.warning && triggerError(data.warning);
							self.updateCache(data);
							data.removed && data.removed.length && self.remove(data);
							data.added   && data.added.length   && self.add(data);
							data.changed && data.changed.length && self.change(data);
							self.trigger('upload', data, false);
							self.trigger('uploaddone');
							if (data.toasts && Array.isArray(data.toasts)) {
								jQuery.each(data.toasts, function() {
									this.msg && self.toast(this);
								});
							}
							data.sync && self.sync();
							data.debug && fm.debug('backend-debug', data);
						}
					})
					.always(function() {
						self.abortXHR(xhr);
						// unregist fnAbort function
						node.off('uploadabort', fnAbort);
						jQuery(window).off('unload', fnAbort);
						notifyto && clearTimeout(notifyto);
						notifyto2 && clearTimeout(notifyto2);
						dataChecked && !data.multiupload && checkNotify() && self.notify({type : 'upload', cnt : -cnt, progress : 0, size : 0});
						chunkMerge && notifyElm.children('.elfinder-notify-chunkmerge').length && self.notify({type : 'chunkmerge', cnt : -1});
					}),
				formData    = new FormData(),
				files       = data.input ? data.input.files : self.uploads.checkFile(data, self, target), 
				cnt         = data.checked? (isDataType? files[0].length : files.length) : files.length,
				loaded      = 0,
				prev        = 0,
				filesize    = 0,
				notify      = false,
				notifyElm   = self.ui.notify,
				cancelBtn   = true,
				abort       = false,
				checkNotify = function() {
					if (!notify && (ntfUpload = notifyElm.children('.elfinder-notify-upload')).length) {
						notify = true;
					}
					return notify;
				},
				fnAbort     = function(e, error) {
					abort = true;
					self.abortXHR(xhr, { quiet: true, abort: true });
					dfrd.reject(error);
					if (checkNotify()) {
						self.notify({type : 'upload', cnt : ntfUpload.data('cnt') * -1, progress : 0, size : 0});
					}
				},
				cancelToggle = function(show) {
					ntfUpload.children('.elfinder-notify-cancel')[show? 'show':'hide']();
				},
				startNotify = function(size) {
					if (!size) size = filesize;
					return setTimeout(function() {
						notify = true;
						self.notify({type : 'upload', cnt : cnt, progress : loaded - prev, size : size,
							cancel: function() {
								node.trigger('uploadabort', 'userabort');
							}
						});
						ntfUpload = notifyElm.children('.elfinder-notify-upload');
						prev = loaded;
						if (data.multiupload) {
							cancelBtn && cancelToggle(true);
						} else {
							cancelToggle(cancelBtn && loaded < size);
						}
					}, self.options.notifyDelay);
				},
				doRetry = function() {
					if (retry++ <= retryMax) {
						if (checkNotify() && prev) {
							self.notify({type : 'upload', cnt : 0, progress : 0, size : prev});
						}
						self.abortXHR(xhr, { quiet: true });
						prev = loaded = 0;
						setTimeout(function() {
							var reqId;
							if (! abort) {
								xhr.open('POST', self.uploadURL, true);
								if (self.api >= 2.1029) {
									reqId = (+ new Date()).toString(16) + Math.floor(1000 * Math.random()).toString(16);
									(typeof formData['delete'] === 'function') && formData['delete']('reqid');
									formData.append('reqid', reqId);
									xhr._requestId = reqId;
								}
								xhr.send(formData);
							}
						}, retryWait);
					} else {
						node.trigger('uploadabort', ['errAbort', 'errTimeout']);
					}
				},
				progress = function() {
					var node;
					if (notify) {
						dfrd.notifyWith(ntfUpload, [{
							cnt: ntfUpload.data('cnt'),
							progress: ntfUpload.data('progress'),
							total: ntfUpload.data('total')
						}]);
					}
				},
				triggerError = function(err, file, unite) {
					err && self.trigger('xhruploadfail', { error: err, file: file });
					if (unite) {
						if (err) {
							if (errCnt < self.options.maxErrorDialogs) {
								if (Array.isArray(err)) {
									errors = errors.concat(err);
								} else {
									errors.push(err);
								}
							}
							errCnt++;
						}
					} else {
						if (err) {
							self.error(err);
						} else {
							if (errors.length) {
								if (errCnt >= self.options.maxErrorDialogs) {
									errors = errors.concat('moreErrors', errCnt - self.options.maxErrorDialogs);
								}
								self.error(errors);
							}
							errors = [];
							errCnt = 0;
						}
					}
				},
				errors = [],
				errCnt = 0,
				renames = (data.renames || null),
				hashes = (data.hashes || null),
				chunkMerge = false,
				ntfUpload = jQuery();
			
			// regist fnAbort function
			node.one('uploadabort', fnAbort);
			jQuery(window).one('unload.' + fm.namespace, fnAbort);
			
			!chunkMerge && (prev = loaded);
			
			if (!isDataType && !cnt) {
				return dfrd.reject(['errUploadNoFiles']);
			}
			
			xhr.addEventListener('error', function() {
				if (xhr.status == 0) {
					if (abort) {
						dfrd.reject();
					} else {
						// ff bug while send zero sized file
						// for safari - send directory
						if (!isDataType && data.files && jQuery.grep(data.files, function(f){return ! f.type && f.size === (self.UA.Safari? 1802 : 0)? true : false;}).length) {
							dfrd.reject(['errAbort', 'errFolderUpload']);
						} else if (data.input && jQuery.grep(data.input.files, function(f){return ! f.type && f.size === (self.UA.Safari? 1802 : 0)? true : false;}).length) {
							dfrd.reject(['errUploadNoFiles']);
						} else {
							doRetry();
						}
					}
				} else {
					node.trigger('uploadabort', 'errConnect');
				}
			}, false);
			
			xhr.addEventListener('load', function(e) {
				var status = xhr.status, res, curr = 0, error = '', errData, errObj;
				
				if (status >= 400) {
					if (status > 500) {
						error = 'errResponse';
					} else {
						error = ['errResponse', 'errServerError'];
					}
				} else {
					if (!xhr.responseText) {
						error = ['errResponse', 'errDataEmpty'];
					}
				}
				
				if (error) {
					node.trigger('uploadabort');
					getFile(files).done(function(file) {
						return dfrd.reject(file._cid? null : error);
					});
				}
				
				loaded = filesize;
				
				if (checkNotify() && (curr = loaded - prev)) {
					self.notify({type : 'upload', cnt : 0, progress : curr, size : 0});
					progress();
				}

				res = self.parseUploadData(xhr.responseText);
				
				// chunked upload commit
				if (res._chunkmerged) {
					formData = new FormData();
					var _file = [{_chunkmerged: res._chunkmerged, _name: res._name, _mtime: res._mtime}];
					chunkMerge = true;
					node.off('uploadabort', fnAbort);
					notifyto2 = setTimeout(function() {
						self.notify({type : 'chunkmerge', cnt : 1});
					}, self.options.notifyDelay);
					isDataType? send(_file, files[1]) : send(_file);
					return;
				}
				
				res._multiupload = data.multiupload? true : false;
				if (res.error) {
					errData = {
						cmd: 'upload',
						err: res,
						xhr: xhr,
						rc: xhr.status
					};
					self.trigger('uploadfail', res);
					// trigger "requestError" event
					self.trigger('requestError', errData);
					if (errData._event && errData._event.isDefaultPrevented()) {
						res.error = '';
					}
					if (res._chunkfailure || res._multiupload) {
						abort = true;
						self.uploads.xhrUploading = false;
						notifyto && clearTimeout(notifyto);
						if (ntfUpload.length) {
							self.notify({type : 'upload', cnt : -cnt, progress : 0, size : 0});
							dfrd.reject(res);
						} else {
							// for multi connection
							dfrd.reject();
						}
					} else {
						dfrd.reject(res);
					}
				} else {
					dfrd.resolve(res);
				}
			}, false);
			
			xhr.upload.addEventListener('loadstart', function(e) {
				if (!chunkMerge && e.lengthComputable) {
					loaded = e.loaded;
					retry && (loaded = 0);
					filesize = e.total;
					if (!loaded) {
						loaded = parseInt(filesize * 0.05);
					}
					if (checkNotify()) {
						self.notify({type : 'upload', cnt : 0, progress : loaded - prev, size : data.multiupload? 0 : filesize});
						prev = loaded;
						progress();
					}
				}
			}, false);
			
			xhr.upload.addEventListener('progress', function(e) {
				var curr;

				if (e.lengthComputable && !chunkMerge && xhr.readyState < 2) {
					
					loaded = e.loaded;

					// to avoid strange bug in safari (not in chrome) with drag&drop.
					// bug: macos finder opened in any folder,
					// reset safari cache (option+command+e), reload elfinder page,
					// drop file from finder
					// on first attempt request starts (progress callback called ones) but never ends.
					// any next drop - successfull.
					if (!data.checked && loaded > 0 && !notifyto) {
						notifyto = startNotify(xhr._totalSize - loaded);
					}
					
					if (!filesize) {
						filesize = e.total;
						if (!loaded) {
							loaded = parseInt(filesize * 0.05);
						}
					}
					
					curr = loaded - prev;
					if (checkNotify() && (curr/e.total) >= 0.05) {
						self.notify({type : 'upload', cnt : 0, progress : curr, size : 0});
						prev = loaded;
						progress();
					}
					
					if (! data.multiupload && loaded >= filesize) {
						cancelBtn = false;
						cancelToggle(false);
					}
				}
			}, false);
			
			var send = function(files, paths){
				var size = 0,
				fcnt = 1,
				sfiles = [],
				c = 0,
				total = cnt,
				maxFileSize,
				totalSize = 0,
				chunked = [],
				chunkID = new Date().getTime().toString().substr(-9), // for take care of the 32bit backend system
				BYTES_PER_CHUNK = Math.min((fm.uplMaxSize? fm.uplMaxSize : 2097152) - 8190, fm.options.uploadMaxChunkSize), // uplMaxSize margin 8kb or options.uploadMaxChunkSize
				blobSlice = chunkEnable? false : '',
				blobSize, blobMtime, i, start, end, chunks, blob, chunk, added, done, last, failChunk,
				multi = function(files, num){
					var sfiles = [], cid, sfilesLen = 0, cancelChk;
					if (!abort) {
						while(files.length && sfiles.length < num) {
							sfiles.push(files.shift());
						}
						sfilesLen = sfiles.length;
						if (sfilesLen) {
							cancelChk = sfilesLen;
							for (var i=0; i < sfilesLen; i++) {
								if (abort) {
									break;
								}
								cid = isDataType? (sfiles[i][0][0]._cid || null) : (sfiles[i][0]._cid || null);
								if (!!failChunk[cid]) {
									last--;
									continue;
								}
								fm.exec('upload', {
									type: data.type,
									isDataType: isDataType,
									files: sfiles[i],
									checked: true,
									target: target,
									dropEvt: dropEvt,
									renames: renames,
									hashes: hashes,
									multiupload: true,
									overwrite: data.overwrite === 0? 0 : void 0
								}, void 0, target)
								.fail(function(error) {
									if (error && error === 'No such command') {
										abort = true;
										fm.error(['errUpload', 'errPerm']);
									}
									if (cid) {	
										failChunk[cid] = true;
									}
								})
								.always(function(e) {
									if (e && e.added) added = jQuery.merge(added, e.added);
									if (last <= ++done) {
										fm.trigger('multiupload', {added: added});
										notifyto && clearTimeout(notifyto);
										if (checkNotify()) {
											self.notify({type : 'upload', cnt : -cnt, progress : 0, size : 0});
										}
									}
									if (files.length) {
										multi(files, 1); // Next one
									} else {
										if (--cancelChk <= 1) {
											cancelBtn = false;
											cancelToggle(false);
										}
									}
								});
							}
						}
					}
					if (sfiles.length < 1 || abort) {
						if (abort) {
							notifyto && clearTimeout(notifyto);
							if (cid) {
								failChunk[cid] = true;
							}
							dfrd.reject();
						} else {
							dfrd.resolve();
							self.uploads.xhrUploading = false;
						}
					}
				},
				check = function(){
					if (!self.uploads.xhrUploading) {
						self.uploads.xhrUploading = true;
						multi(sfiles, multiMax); // Max connection: 3
					} else {
						setTimeout(check, 100);
					}
				},
				reqId, err;

				if (! dataChecked && (isDataType || data.type == 'files')) {
					if (! (maxFileSize = fm.option('uploadMaxSize', target))) {
						maxFileSize = 0;
					}
					for (i=0; i < files.length; i++) {
						try {
							blob = files[i];
							blobSize = blob.size;
							if (blobSlice === false) {
								blobSlice = '';
								if (self.api >= 2.1) {
									if ('slice' in blob) {
										blobSlice = 'slice';
									} else if ('mozSlice' in blob) {
										blobSlice = 'mozSlice';
									} else if ('webkitSlice' in blob) {
										blobSlice = 'webkitSlice';
									}
								}
							}
						} catch(e) {
							cnt--;
							total--;
							continue;
						}
						
						// file size check
						if ((maxFileSize && blobSize > maxFileSize) || (!blobSlice && fm.uplMaxSize && blobSize > fm.uplMaxSize)) {
							triggerError(['errUploadFile', blob.name, 'errUploadFileSize'], blob, true);
							cnt--;
							total--;
							continue;
						}
						
						// file mime check
						if (blob.type && ! self.uploadMimeCheck(blob.type, target)) {
							triggerError(['errUploadFile', blob.name, 'errUploadMime', '(' + blob.type + ')'], blob, true);
							cnt--;
							total--;
							continue;
						}
						
						if (blobSlice && blobSize > BYTES_PER_CHUNK) {
							start = 0;
							end = BYTES_PER_CHUNK;
							chunks = -1;
							total = Math.floor((blobSize - 1) / BYTES_PER_CHUNK);
							blobMtime = blob.lastModified? Math.round(blob.lastModified/1000) : 0;

							totalSize += blobSize;
							chunked[chunkID] = 0;
							while(start < blobSize) {
								chunk = blob[blobSlice](start, end);
								chunk._chunk = blob.name + '.' + (++chunks) + '_' + total + '.part';
								chunk._cid   = chunkID;
								chunk._range = start + ',' + chunk.size + ',' + blobSize;
								chunk._mtime = blobMtime;
								chunked[chunkID]++;
								
								if (size) {
									c++;
								}
								if (typeof sfiles[c] == 'undefined') {
									sfiles[c] = [];
									if (isDataType) {
										sfiles[c][0] = [];
										sfiles[c][1] = [];
									}
								}
								size = BYTES_PER_CHUNK;
								fcnt = 1;
								if (isDataType) {
									sfiles[c][0].push(chunk);
									sfiles[c][1].push(paths[i]);
								} else {
									sfiles[c].push(chunk);
								}

								start = end;
								end = start + BYTES_PER_CHUNK;
							}
							if (chunk == null) {
								triggerError(['errUploadFile', blob.name, 'errUploadFileSize'], blob, true);
								cnt--;
								total--;
							} else {
								total += chunks;
								size = 0;
								fcnt = 1;
								c++;
							}
							continue;
						}
						if ((fm.uplMaxSize && size + blobSize > fm.uplMaxSize) || fcnt > fm.uplMaxFile) {
							size = 0;
							fcnt = 1;
							c++;
						}
						if (typeof sfiles[c] == 'undefined') {
							sfiles[c] = [];
							if (isDataType) {
								sfiles[c][0] = [];
								sfiles[c][1] = [];
							}
						}
						if (isDataType) {
							sfiles[c][0].push(blob);
							sfiles[c][1].push(paths[i]);
						} else {
							sfiles[c].push(blob);
						}
						size += blobSize;
						totalSize += blobSize;
						fcnt++;
					}
					
					if (errors.length) {
						triggerError();
					}

					if (sfiles.length == 0) {
						// no data
						data.checked = true;
						return false;
					}
					
					if (sfiles.length > 1) {
						// multi upload
						notifyto = startNotify(totalSize);
						added = [];
						done = 0;
						last = sfiles.length;
						failChunk = [];
						check();
						return true;
					}
					
					// single upload
					if (isDataType) {
						files = sfiles[0][0];
						paths = sfiles[0][1];
					} else {
						files = sfiles[0];
					}
				}
				
				if (!dataChecked) {
					if (!fm.UA.Safari || !data.files) {
						notifyto = startNotify(totalSize);
					} else {
						xhr._totalSize = totalSize;
					}
				}
				
				dataChecked = true;
				
				if (! files.length) {
					dfrd.reject(['errUploadNoFiles']);
				}
				
				xhr.open('POST', self.uploadURL, true);
				
				// set request headers
				if (fm.customHeaders) {
					jQuery.each(fm.customHeaders, function(key) {
						xhr.setRequestHeader(key, this);
					});
				}
				
				// set xhrFields
				if (fm.xhrFields) {
					jQuery.each(fm.xhrFields, function(key) {
						if (key in xhr) {
							xhr[key] = this;
						}
					});
				}

				if (self.api >= 2.1029) {
					// request ID
					reqId = (+ new Date()).toString(16) + Math.floor(1000 * Math.random()).toString(16);
					formData.append('reqid', reqId);
					xhr._requestId = reqId;
				}
				formData.append('cmd', 'upload');
				formData.append(self.newAPI ? 'target' : 'current', target);
				if (renames && renames.length) {
					jQuery.each(renames, function(i, v) {
						formData.append('renames[]', v);
					});
					formData.append('suffix', fm.options.backupSuffix);
				}
				if (hashes) {
					jQuery.each(hashes, function(i, v) {
						formData.append('hashes['+ i +']', v);
					});
				}
				jQuery.each(self.customData, function(key, val) {
					formData.append(key, val);
				});
				jQuery.each(self.options.onlyMimes, function(i, mime) {
					formData.append('mimes[]', mime);
				});
				
				jQuery.each(files, function(i, file) {
					if (file._chunkmerged) {
						formData.append('chunk', file._chunkmerged);
						formData.append('upload[]', file._name);
						formData.append('mtime[]', file._mtime);
					} else {
						if (file._chunkfail) {
							formData.append('upload[]', 'chunkfail');
							formData.append('mimes', 'chunkfail');
						} else {
							formData.append('upload[]', file);
							if (data.clipdata) {
								data.overwrite = 0;
								formData.append('name[]', fm.date(fm.nonameDateFormat) + '.png');
							}
							if (file.name && fm.UA.iOS) {
								if (file.name.match(/^image\.jpe?g$/i)) {
									data.overwrite = 0;
									formData.append('name[]', fm.date(fm.nonameDateFormat) + '.jpg');
								} else if (file.name.match(/^capturedvideo\.mov$/i)) {
									data.overwrite = 0;
									formData.append('name[]', fm.date(fm.nonameDateFormat) + '.mov');
								}
							}
						}
						if (file._chunk) {
							formData.append('chunk', file._chunk);
							formData.append('cid'  , file._cid);
							formData.append('range', file._range);
							formData.append('mtime[]', file._mtime);
						} else {
							formData.append('mtime[]', file.lastModified? Math.round(file.lastModified/1000) : 0);
						}
					}
				});
				
				if (isDataType) {
					jQuery.each(paths, function(i, path) {
						formData.append('upload_path[]', path);
					});
				}
				
				if (data.overwrite === 0) {
					formData.append('overwrite', 0);
				}
				
				// send int value that which meta key was pressed when dropped  as `dropWith`
				if (dropEvt) {
					formData.append('dropWith', parseInt(
						(dropEvt.altKey  ? '1' : '0')+
						(dropEvt.ctrlKey ? '1' : '0')+
						(dropEvt.metaKey ? '1' : '0')+
						(dropEvt.shiftKey? '1' : '0'), 2));
				}
				
				// set extraData on current request
				if (extraData) {
					jQuery.each(extraData, function(key, val) {
						formData.append(key, val);
					});
				}

				xhr.send(formData);
				
				return true;
			};
			
			if (! isDataType) {
				if (files.length > 0) {
					if (! data.clipdata && renames == null) {
						var mkdirs = [],
							paths = [],
							excludes = fm.options.folderUploadExclude[fm.OS] || null;
						jQuery.each(files, function(i, file) {
							var relPath = file.webkitRelativePath || file.relativePath || '',
								idx, rootDir;
							if (! relPath) {
								return false;
							}
							if (excludes && file.name.match(excludes)) {
								file._remove = true;
								relPath = void(0);
							} else {
								// add '/' as prefix to make same to folder uploading with DnD, see #2607
								relPath = '/' + relPath.replace(/\/[^\/]*$/, '').replace(/^\//, '');
								if (relPath && jQuery.inArray(relPath, mkdirs) === -1) {
									mkdirs.push(relPath);
									// checking the root directory to supports <input type="file" webkitdirectory> see #2378
									idx = relPath.substr(1).indexOf('/');
									if (idx !== -1 && (rootDir = relPath.substr(0, idx + 1)) && jQuery.inArray(rootDir, mkdirs) === -1) {
										mkdirs.unshift(rootDir);
									}
								}
							}
							paths.push(relPath);
						});
						renames = [];
						hashes = {};
						if (mkdirs.length) {
							(function() {
								var checkDirs = jQuery.map(mkdirs, function(name) { return name.substr(1).indexOf('/') === -1 ? {name: name.substr(1)} : null;}),
									cancelDirs = [];
								fm.uploads.checkExists(checkDirs, target, fm, true).done(
									function(res, res2) {
										var dfds = [], dfd, bak, hash;
										if (fm.options.overwriteUploadConfirm && fm.option('uploadOverwrite', target)) {
											cancelDirs = jQuery.map(checkDirs, function(dir) { return dir._remove? dir.name : null ;} );
											checkDirs = jQuery.grep(checkDirs, function(dir) { return !dir._remove? true : false ;} );
										}
										if (cancelDirs.length) {
											jQuery.each(paths.concat(), function(i, path) {
												if (jQuery.inArray(path, cancelDirs) === 0) {
													files[i]._remove = true;
													paths[i] = void(0);
												}
											});
										}
										files = jQuery.grep(files, function(file) { return file._remove? false : true; });
										paths = jQuery.grep(paths, function(path) { return path === void 0 ? false : true; });
										if (checkDirs.length) {
											dfd = jQuery.Deferred();
											if (res.length) {
												jQuery.each(res, function(i, existName) {
													// backup
													bak = fm.uniqueName(existName + fm.options.backupSuffix , null, '');
													jQuery.each(res2, function(h, name) {
														if (res[0] == name) {
															hash = h;
															return false;
														}
													});
													if (! hash) {
														hash = fm.fileByName(res[0], target).hash;
													}
													fm.lockfiles({files : [hash]});
													dfds.push(
														fm.request({
															data   : {cmd : 'rename', target : hash, name : bak},
															notify : {type : 'rename', cnt : 1}
														})
														.fail(function(error) {
															dfrd.reject(error);
															fm.sync();
														})
														.always(function() {
															fm.unlockfiles({files : [hash]});
														})
													);
												});
											} else {
												dfds.push(null);
											}
											
											jQuery.when.apply($, dfds).done(function() {
												// ensure directories
												fm.request({
													data   : {cmd : 'mkdir', target : target, dirs : mkdirs},
													notify : {type : 'mkdir', cnt : mkdirs.length},
													preventFail: true
												})
												.fail(function(error) {
													error = error || ['errUnknown'];
													if (error[0] === 'errCmdParams') {
														multiMax = 1;
													} else {
														multiMax = 0;
														dfrd.reject(error);
													}
												})
												.done(function(data) {
													var rm = false;
													if (!data.hashes) {
														data.hashes = {};
													}
													paths = jQuery.map(paths.concat(), function(p, i) {
														if (p === '/') {
															return target;
														} else {
															if (data.hashes[p]) {
																return data.hashes[p];
															} else {
																rm = true;
																files[i]._remove = true;
																return null;
															}
														}
													});
													if (rm) {
														files = jQuery.grep(files, function(file) { return file._remove? false : true; });
													}
												})
												.always(function(data) {
													if (multiMax) {
														isDataType = true;
														if (! send(files, paths)) {
															dfrd.reject();
														}
													}
												});
											});
										} else {
											dfrd.reject();
										}
									}
								);
							})();
						} else {
							fm.uploads.checkExists(files, target, fm).done(
								function(res, res2){
									if (fm.options.overwriteUploadConfirm && fm.option('uploadOverwrite', target)) {
										hashes = res2;
										if (res === null) {
											data.overwrite = 0;
										} else {
											renames = res;
										}
										files = jQuery.grep(files, function(file){return !file._remove? true : false ;});
									}
									cnt = files.length;
									if (cnt > 0) {
										if (! send(files)) {
											dfrd.reject();
										}
									} else {
										dfrd.reject();
									}
								}
							);
						}
					} else {
						if (! send(files)) {
							dfrd.reject();
						}
					}
				} else {
					dfrd.reject();
				}
			} else {
				if (dataChecked) {
					send(files[0], files[1]);
				} else {
					files.done(function(result) { // result: [files, paths, renames, hashes, mkdirs]
						renames = [];
						cnt = result[0].length;
						if (cnt) {
							if (result[4] && result[4].length) {
								// ensure directories
								fm.request({
									data   : {cmd : 'mkdir', target : target, dirs : result[4]},
									notify : {type : 'mkdir', cnt : result[4].length},
									preventFail: true
								})
								.fail(function(error) {
									error = error || ['errUnknown'];
									if (error[0] === 'errCmdParams') {
										multiMax = 1;
									} else {
										multiMax = 0;
										dfrd.reject(error);
									}
								})
								.done(function(data) {
									var rm = false;
									if (!data.hashes) {
										data.hashes = {};
									}
									result[1] = jQuery.map(result[1], function(p, i) {
										p = p.replace(/\/[^\/]*$/, '');
										if (p === '') {
											return target;
										} else {
											if (data.hashes[p]) {
												return data.hashes[p];
											} else {
												rm = true;
												result[0][i]._remove = true;
												return null;
											}
										}
									});
									if (rm) {
										result[0] = jQuery.grep(result[0], function(file) { return file._remove? false : true; });
									}
								})
								.always(function(data) {
									if (multiMax) {
										renames = result[2];
										hashes = result[3];
										send(result[0], result[1]);
									}
								});
								return;
							} else {
								result[1] = jQuery.map(result[1], function() { return target; });
							}
							renames = result[2];
							hashes = result[3];
							send(result[0], result[1]);
						} else {
							dfrd.reject(['errUploadNoFiles']);
						}
					}).fail(function(){
						dfrd.reject();
					});
				}
			}

			return dfrd;
		},
		
		// upload transport using iframe
		iframe : function(data, fm) { 
			var self   = fm ? fm : this,
				input  = data.input? data.input : false,
				files  = !input ? self.uploads.checkFile(data, self) : false,
				dfrd   = jQuery.Deferred()
					.fail(function(error) {
						error && self.error(error);
					}),
				name = 'iframe-'+fm.namespace+(++self.iframeCnt),
				form = jQuery('<form action="'+self.uploadURL+'" method="post" enctype="multipart/form-data" encoding="multipart/form-data" target="'+name+'" style="display:none"><input type="hidden" name="cmd" value="upload" /></form>'),
				msie = this.UA.IE,
				// clear timeouts, close notification dialog, remove form/iframe
				onload = function() {
					abortto  && clearTimeout(abortto);
					notifyto && clearTimeout(notifyto);
					notify   && self.notify({type : 'upload', cnt : -cnt});
					
					setTimeout(function() {
						msie && jQuery('<iframe src="javascript:false;"/>').appendTo(form);
						form.remove();
						iframe.remove();
					}, 100);
				},
				iframe = jQuery('<iframe src="'+(msie ? 'javascript:false;' : 'about:blank')+'" name="'+name+'" style="position:absolute;left:-1000px;top:-1000px" />')
					.on('load', function() {
						iframe.off('load')
							.on('load', function() {
								onload();
								// data will be processed in callback response or window onmessage
								dfrd.resolve();
							});
							
							// notify dialog
							notifyto = setTimeout(function() {
								notify = true;
								self.notify({type : 'upload', cnt : cnt});
							}, self.options.notifyDelay);
							
							// emulate abort on timeout
							if (self.options.iframeTimeout > 0) {
								abortto = setTimeout(function() {
									onload();
									dfrd.reject(['errConnect', 'errTimeout']);
								}, self.options.iframeTimeout);
							}
							
							form.submit();
					}),
				target  = (data.target || self.cwd().hash),
				names   = [],
				dfds    = [],
				renames = [],
				hashes  = {},
				cnt, notify, notifyto, abortto;

			if (files && files.length) {
				jQuery.each(files, function(i, val) {
					form.append('<input type="hidden" name="upload[]" value="'+val+'"/>');
				});
				cnt = 1;
			} else if (input && jQuery(input).is(':file') && jQuery(input).val()) {
				if (fm.options.overwriteUploadConfirm && fm.option('uploadOverwrite', target)) {
					names = input.files? input.files : [{ name: jQuery(input).val().replace(/^(?:.+[\\\/])?([^\\\/]+)$/, '$1') }];
					//names = jQuery.map(names, function(file){return file.name? { name: file.name } : null ;});
					dfds.push(self.uploads.checkExists(names, target, self).done(
						function(res, res2){
							hashes = res2;
							if (res === null) {
								data.overwrite = 0;
							} else{
								renames = res;
								cnt = jQuery.grep(names, function(file){return !file._remove? true : false ;}).length;
								if (cnt != names.length) {
									cnt = 0;
								}
							}
						}
					));
				}
				cnt = input.files ? input.files.length : 1;
				form.append(input);
			} else {
				return dfrd.reject();
			}
			
			jQuery.when.apply($, dfds).done(function() {
				if (cnt < 1) {
					return dfrd.reject();
				}
				form.append('<input type="hidden" name="'+(self.newAPI ? 'target' : 'current')+'" value="'+target+'"/>')
					.append('<input type="hidden" name="html" value="1"/>')
					.append('<input type="hidden" name="node" value="'+self.id+'"/>')
					.append(jQuery(input).attr('name', 'upload[]'));
				
				if (renames.length > 0) {
					jQuery.each(renames, function(i, rename) {
						form.append('<input type="hidden" name="renames[]" value="'+self.escape(rename)+'"/>');
					});
					form.append('<input type="hidden" name="suffix" value="'+fm.options.backupSuffix+'"/>');
				}
				if (hashes) {
					jQuery.each(renames, function(i, v) {
						form.append('<input type="hidden" name="['+i+']" value="'+self.escape(v)+'"/>');
					});
				}
				
				if (data.overwrite === 0) {
					form.append('<input type="hidden" name="overwrite" value="0"/>');
				}
				
				jQuery.each(self.options.onlyMimes||[], function(i, mime) {
					form.append('<input type="hidden" name="mimes[]" value="'+self.escape(mime)+'"/>');
				});
				
				jQuery.each(self.customData, function(key, val) {
					form.append('<input type="hidden" name="'+key+'" value="'+self.escape(val)+'"/>');
				});
				
				form.appendTo('body');
				iframe.appendTo('body');
			});
			
			return dfrd;
		}
	},
	
	
	/**
	 * Bind callback to event(s) The callback is executed at most once per event.
	 * To bind to multiply events at once, separate events names by space
	 *
	 * @param  String    event name
	 * @param  Function  callback
	 * @param  Boolan    priority first
	 * @return elFinder
	 */
	one : function(ev, callback, priorityFirst) {
		var self  = this,
			event = ev.toLowerCase(),
			h     = function(e, f) {
				if (!self.toUnbindEvents[event]) {
					self.toUnbindEvents[event] = [];
				}
				self.toUnbindEvents[event].push({
					type: event,
					callback: h
				});
				return (callback.done? callback.done : callback).apply(this, arguments);
			};
		if (callback.done) {
			h = {done: h};
		}
		return this.bind(event, h, priorityFirst);
	},
	
	/**
	 * Set/get data into/from localStorage
	 *
	 * @param  String       key
	 * @param  String|void  value
	 * @return String|null
	 */
	localStorage : function(key, val) {
		var self   = this,
			s      = window.localStorage,
			oldkey = 'elfinder-'+(key || '')+this.id, // old key of elFinder < 2.1.6
			prefix = window.location.pathname+'-elfinder-',
			suffix = this.id,
			clrs   = [],
			retval, oldval, t, precnt, sufcnt;

		// reset this node data
		if (typeof(key) === 'undefined') {
			precnt = prefix.length;
			sufcnt = suffix.length * -1;
			jQuery.each(s, function(key) {
				if (key.substr(0, precnt) === prefix && key.substr(sufcnt) === suffix) {
					clrs.push(key);
				}
			});
			jQuery.each(clrs, function(i, key) {
				s.removeItem(key);
			});
			return true;
		}
		
		// new key of elFinder >= 2.1.6
		key = prefix+key+suffix;
		
		if (val === null) {
			return s.removeItem(key);
		}
		
		if (val === void(0) && !(retval = s.getItem(key)) && (oldval = s.getItem(oldkey))) {
			val = oldval;
			s.removeItem(oldkey);
		}
		
		if (val !== void(0)) {
			t = typeof val;
			if (t !== 'string' && t !== 'number') {
				val = JSON.stringify(val);
			}
			try {
				s.setItem(key, val);
			} catch (e) {
				try {
					s.clear();
					s.setItem(key, val);
				} catch (e) {
					self.debug('error', e.toString());
				}
			}
			retval = s.getItem(key);
		}

		if (retval && (retval.substr(0,1) === '{' || retval.substr(0,1) === '[')) {
			try {
				return JSON.parse(retval);
			} catch(e) {}
		}
		return retval;
	},
	
	/**
	 * Get/set cookie
	 *
	 * @param  String       cookie name
	 * @param  String|void  cookie value
	 * @return String|null
	 */
	cookie : function(name, value) {
		var d, o, c, i, retval, t;

		name = 'elfinder-'+name+this.id;

		if (value === void(0)) {
			if (document.cookie && document.cookie != '') {
				c = document.cookie.split(';');
				name += '=';
				for (i=0; i<c.length; i++) {
					c[i] = jQuery.trim(c[i]);
					if (c[i].substring(0, name.length) == name) {
						retval = decodeURIComponent(c[i].substring(name.length));
						if (retval.substr(0,1) === '{' || retval.substr(0,1) === '[') {
							try {
								return JSON.parse(retval);
							} catch(e) {}
						}
						return retval;
					}
				}
			}
			return null;
		}

		o = Object.assign({}, this.options.cookie);
		if (value === null) {
			value = '';
			o.expires = -1;
		} else {
			t = typeof value;
			if (t !== 'string' && t !== 'number') {
				value = JSON.stringify(value);
			}
		}
		if (typeof(o.expires) == 'number') {
			d = new Date();
			d.setTime(d.getTime()+(o.expires * 86400000));
			o.expires = d;
		}
		document.cookie = name+'='+encodeURIComponent(value)+'; expires='+o.expires.toUTCString()+(o.path ? '; path='+o.path : '')+(o.domain ? '; domain='+o.domain : '')+(o.secure ? '; secure' : '');
		if (value && (value.substr(0,1) === '{' || value.substr(0,1) === '[')) {
			try {
				return JSON.parse(value);
			} catch(e) {}
		}
		return value;
	},
	
	/**
	 * Get start directory (by location.hash or last opened directory)
	 * 
	 * @return String
	 */
	startDir : function() {
		var locHash = window.location.hash;
		if (locHash && locHash.match(/^#elf_/)) {
			return locHash.replace(/^#elf_/, '');
		} else if (this.options.startPathHash) {
			return this.options.startPathHash;
		} else {
			return this.lastDir();
		}
	},
	
	/**
	 * Get/set last opened directory
	 * 
	 * @param  String|undefined  dir hash
	 * @return String
	 */
	lastDir : function(hash) { 
		return this.options.rememberLastDir ? this.storage('lastdir', hash) : '';
	},
	
	/**
	 * Node for escape html entities in texts
	 * 
	 * @type jQuery
	 */
	_node : jQuery('<span/>'),
	
	/**
	 * Replace not html-safe symbols to html entities
	 * 
	 * @param  String  text to escape
	 * @return String
	 */
	escape : function(name) {
		return this._node.text(name).html().replace(/"/g, '&quot;').replace(/'/g, '&#039;');
	},
	
	/**
	 * Cleanup ajax data.
	 * For old api convert data into new api format
	 * 
	 * @param  String  command name
	 * @param  Object  data from backend
	 * @return Object
	 */
	normalize : function(data) {
		var self   = this,
			fileFilter = (function() {
				var func, filter;
				if (filter = self.options.fileFilter) {
					if (typeof filter === 'function') {
						func = function(file) {
							return filter.call(self, file);
						};
					} else if (filter instanceof RegExp) {
						func = function(file) {
							return filter.test(file.name);
						};
					}
				}
				return func? func : null;
			})(),
			chkCmdMap = function(opts) {
				// Disable command to replace with other command
				var disabled;
				if (opts.uiCmdMap) {
					if (jQuery.isPlainObject(opts.uiCmdMap) && Object.keys(opts.uiCmdMap).length) {
						if (!opts.disabledFlip) {
							opts.disabledFlip = {};
						}
						disabled = opts.disabledFlip;
						jQuery.each(opts.uiCmdMap, function(f, t) {
							if (t === 'hidden' && !disabled[f]) {
								opts.disabled.push(f);
								opts.disabledFlip[f] = true;
							}
						});
					} else {
						delete opts.uiCmdMap;
					}
				}
			},
			normalizeOptions = function(opts) {
				var getType = function(v) {
					var type = typeof v;
					if (type === 'object' && Array.isArray(v)) {
						type = 'array';
					}
					return type;
				};
				jQuery.each(self.optionProperties, function(k, empty) {
					if (empty !== void(0)) {
						if (opts[k] && getType(opts[k]) !== getType(empty)) {
							opts[k] = empty;
						}
					}
				});
				if (opts['disabled']) {
					opts['disabledFlip'] = self.arrayFlip(opts['disabled'], true);
				} else {
					opts['disabledFlip'] = {};
				}
				return opts;
			},
			filter = function(file, asMap, type) { 
				var res = asMap? file : true,
					ign = asMap? null : false,
					vid, targetOptions, isRoot, rootNames;
				
				if (file && file.hash && file.name && file.mime) {
					if (file.mime === 'application/x-empty') {
						file.mime = 'text/plain';
					}
					
					isRoot = self.isRoot(file);
					if (isRoot && ! file.volumeid) {
						self.debug('warning', 'The volume root statuses requires `volumeid` property.');
					}
					if (isRoot || file.mime === 'directory') {
						// Prevention of circular reference
						if (file.phash) {
							if (file.phash === file.hash) {
								error = error.concat(['Parent folder of "$1" is itself.', file.name]);
								return ign;
							}
							if (isRoot && file.volumeid && file.phash.indexOf(file.volumeid) === 0) {
								error = error.concat(['Parent folder of "$1" is inner itself.', file.name]);
								return ign;
							}
						}
						
						// set options, tmbUrls for each volume
						if (file.volumeid) {
							vid = file.volumeid;
							
							if (isRoot) {
								// make or update of leaf roots cache
								if (file.phash) {
									if (! self.leafRoots[file.phash]) {
										self.leafRoots[file.phash] = [ file.hash ];
									} else {
										if (jQuery.inArray(file.hash, self.leafRoots[file.phash]) === -1) {
											self.leafRoots[file.phash].push(file.hash);
										}
									}
								}

								self.hasVolOptions = true;
								if (! self.volOptions[vid]) {
									self.volOptions[vid] = {
										// set dispInlineRegex
										dispInlineRegex: self.options.dispInlineRegex
									};
								}
								
								targetOptions = self.volOptions[vid];
								
								if (file.options) {
									// >= v.2.1.14 has file.options
									Object.assign(targetOptions, file.options);
								}
								
								// for compat <= v2.1.13
								if (file.disabled) {
									targetOptions.disabled = file.disabled;
									targetOptions.disabledFlip = self.arrayFlip(file.disabled, true);
								}
								if (file.tmbUrl) {
									targetOptions.tmbUrl = file.tmbUrl;
								}
								
								// '/' required at the end of url
								if (targetOptions.url && targetOptions.url.substr(-1) !== '/') {
									targetOptions.url += '/';
								}

								// check uiCmdMap
								chkCmdMap(targetOptions);
								
								// check trash bin hash
								if (targetOptions.trashHash) {
									if (self.trashes[targetOptions.trashHash] === false) {
										delete targetOptions.trashHash;
									} else {
										self.trashes[targetOptions.trashHash] = file.hash;
									}
								}
								
								// set immediate properties
								jQuery.each(self.optionProperties, function(k) {
									if (targetOptions[k]) {
										file[k] = targetOptions[k];
									}
								});

								// regist fm.roots
								if (type !== 'cwd') {
									self.roots[vid] = file.hash;
								}

								// regist fm.volumeExpires
								if (file.expires) {
									self.volumeExpires[vid] = file.expires;
								}
							}
							
							if (prevId !== vid) {
								prevId = vid;
								i18nFolderName = self.option('i18nFolderName', vid);
							}
						}
						
						// volume root i18n name
						if (isRoot && ! file.i18) {
							name = 'volume_' + file.name,
							i18 = self.i18n(false, name);
	
							if (name !== i18) {
								file.i18 = i18;
							}
						}
						
						// i18nFolderName
						if (i18nFolderName && ! file.i18) {
							name = 'folder_' + file.name,
							i18 = self.i18n(false, name);
	
							if (name !== i18) {
								file.i18 = i18;
							}
						}
						
						if (isRoot) {
							if (rootNames = self.storage('rootNames')) {
								if (rootNames[file.hash]) {
									file._name = file.name;
									file._i18 = file.i18;
									file.name = rootNames[file.hash] = rootNames[file.hash];
									delete file.i18;
								}
								self.storage('rootNames', rootNames);
							}
						}

						// lock trash bins holder
						if (self.trashes[file.hash]) {
							file.locked = true;
						}
					} else {
						if (fileFilter) {
							try {
								if (! fileFilter(file)) {
									return ign;
								}
							} catch(e) {
								self.debug(e);
							}
						}
						if (file.size == 0) {
							file.mime = self.getMimetype(file.name, file.mime);
						}
					}
					
					if (file.options) {
						self.optionsByHashes[file.hash] = normalizeOptions(file.options);
					}
					
					delete file.options;
					
					return res;
				}
				return ign;
			},
			getDescendants = function(hashes) {
				var res = [];
				jQuery.each(self.files(), function(h, f) {
					jQuery.each(self.parents(h), function(i, ph) {
						if (jQuery.inArray(ph, hashes) !== -1 && jQuery.inArray(h, hashes) === -1) {
							res.push(h);
							return false;
						}
					});
				});
				return res;
			},
			applyLeafRootStats = function(dataArr, type) {
				jQuery.each(dataArr, function(i, f) {
					var pfile, done;
					if (self.leafRoots[f.hash]) {
						self.applyLeafRootStats(f);
					}
					// update leaf root parent stat
					if (type !== 'change' && f.phash && self.isRoot(f) && (pfile = self.file(f.phash))) {
						self.applyLeafRootStats(pfile);
						// add to data.changed
						if (!data.changed) {
							data.changed = [pfile];
						} else {
							jQuery.each(data.changed, function(i, f) {
								if (f.hash === pfile.hash) {
									data.changed[i] = pfile;
									done = true;
									return false;
								}
							});
							if (!done) {
								data.changed.push(pfile);
							}
						}
					}
				});
			},
			error = [],
			name, i18, i18nFolderName, prevId, cData;
		
		// set cunstom data
		if (data.customData && data.customData !== self.prevCustomData) {
			self.prevCustomData = data.customData;
			try {
				cData = JSON.parse(data.customData);
				if (jQuery.isPlainObject(cData)) {
					self.prevCustomData = cData;
					jQuery.each(Object.keys(cData), function(i, key) {
						if (cData[key] === null) {
							delete cData[key];
							delete self.optsCustomData[key];
						}
					});
					self.customData = Object.assign({}, self.optsCustomData, cData);
				}
			} catch(e) {}
		}

		if (data.options) {
			normalizeOptions(data.options);
		}
		
		if (data.cwd) {
			if (data.cwd.volumeid && data.options && Object.keys(data.options).length && self.isRoot(data.cwd)) {
				self.hasVolOptions = true;
				self.volOptions[data.cwd.volumeid] = data.options;
			}
			data.cwd = filter(data.cwd, true, 'cwd');
		}
		if (data.files) {
			data.files = jQuery.grep(data.files, filter);
		} 
		if (data.tree) {
			data.tree = jQuery.grep(data.tree, filter);
		}
		if (data.added) {
			data.added = jQuery.grep(data.added, filter);
		}
		if (data.changed) {
			data.changed = jQuery.grep(data.changed, filter);
		}
		if (data.removed && data.removed.length && self.searchStatus.state === 2) {
			data.removed = data.removed.concat(getDescendants(data.removed));
		}
		if (data.api) {
			data.init = true;
		}

		if (Object.keys(self.leafRoots).length) {
			data.files && applyLeafRootStats(data.files);
			data.tree && applyLeafRootStats(data.tree);
			data.added && applyLeafRootStats(data.added);
			data.changed && applyLeafRootStats(data.changed, 'change');
		}

		// merge options that apply only to cwd
		if (data.cwd && data.cwd.options && data.options) {
			Object.assign(data.options, normalizeOptions(data.cwd.options));
		}

		// '/' required at the end of url
		if (data.options && data.options.url && data.options.url.substr(-1) !== '/') {
			data.options.url += '/';
		}
		
		// check error
		if (error.length) {
			data.norError = ['errResponse'].concat(error);
		}
		
		return data;
	},
	
	/**
	 * Update sort options
	 *
	 * @param {String} sort type
	 * @param {String} sort order
	 * @param {Boolean} show folder first
	 */
	setSort : function(type, order, stickFolders, alsoTreeview) {
		this.storage('sortType', (this.sortType = this.sortRules[type] ? type : 'name'));
		this.storage('sortOrder', (this.sortOrder = /asc|desc/.test(order) ? order : 'asc'));
		this.storage('sortStickFolders', (this.sortStickFolders = !!stickFolders) ? 1 : '');
		this.storage('sortAlsoTreeview', (this.sortAlsoTreeview = !!alsoTreeview) ? 1 : '');
		this.trigger('sortchange');
	},
	
	_sortRules : {
		name : function(file1, file2) {
			return elFinder.prototype.naturalCompare(file1.i18 || file1.name, file2.i18 || file2.name);
		},
		size : function(file1, file2) { 
			var size1 = parseInt(file1.size) || 0,
				size2 = parseInt(file2.size) || 0;
				
			return size1 === size2 ? 0 : size1 > size2 ? 1 : -1;
		},
		kind : function(file1, file2) {
			return elFinder.prototype.naturalCompare(file1.mime, file2.mime);
		},
		date : function(file1, file2) { 
			var date1 = file1.ts || file1.date || 0,
				date2 = file2.ts || file2.date || 0;

			return date1 === date2 ? 0 : date1 > date2 ? 1 : -1;
		},
		perm : function(file1, file2) { 
			var val = function(file) { return (file.write? 2 : 0) + (file.read? 1 : 0); },
				v1  = val(file1),
				v2  = val(file2);
			return v1 === v2 ? 0 : v1 > v2 ? 1 : -1;
		},
		mode : function(file1, file2) { 
			var v1 = file1.mode || (file1.perm || ''),
				v2 = file2.mode || (file2.perm || '');
			return elFinder.prototype.naturalCompare(v1, v2);
		},
		owner : function(file1, file2) { 
			var v1 = file1.owner || '',
				v2 = file2.owner || '';
			return elFinder.prototype.naturalCompare(v1, v2);
		},
		group : function(file1, file2) { 
			var v1 = file1.group || '',
				v2 = file2.group || '';
			return elFinder.prototype.naturalCompare(v1, v2);
		}
	},
	
	/**
	 * Valid sort rule names
	 * 
	 * @type Object
	 */
	sorters : {},
	
	/**
	 * Compare strings for natural sort
	 *
	 * @param  String
	 * @param  String
	 * @return Number
	 */
	naturalCompare : function(a, b) {
		var self = elFinder.prototype.naturalCompare;
		if (typeof self.loc == 'undefined') {
			self.loc = (navigator.userLanguage || navigator.browserLanguage || navigator.language || 'en-US');
		}
		if (typeof self.sort == 'undefined') {
			if ('11'.localeCompare('2', self.loc, {numeric: true}) > 0) {
				// Native support
				if (window.Intl && window.Intl.Collator) {
					self.sort = new Intl.Collator(self.loc, {numeric: true}).compare;
				} else {
					self.sort = function(a, b) {
						return a.localeCompare(b, self.loc, {numeric: true});
					};
				}
			} else {
				/*
				 * Edited for elFinder (emulates localeCompare() by numeric) by Naoki Sawada aka nao-pon
				 */
				/*
				 * Huddle/javascript-natural-sort (https://github.com/Huddle/javascript-natural-sort)
				 */
				/*
				 * Natural Sort algorithm for Javascript - Version 0.7 - Released under MIT license
				 * Author: Jim Palmer (based on chunking idea from Dave Koelle)
				 * http://opensource.org/licenses/mit-license.php
				 */
				self.sort = function(a, b) {
					var re = /(^-?[0-9]+(\.?[0-9]*)[df]?e?[0-9]?$|^0x[0-9a-f]+$|[0-9]+)/gi,
					sre = /(^[ ]*|[ ]*$)/g,
					dre = /(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/,
					hre = /^0x[0-9a-f]+$/i,
					ore = /^0/,
					syre = /^[\x01\x21-\x2f\x3a-\x40\x5b-\x60\x7b-\x7e]/, // symbol first - (Naoki Sawada)
					i = function(s) { return self.sort.insensitive && (''+s).toLowerCase() || ''+s; },
					// convert all to strings strip whitespace
					// first character is "_", it's smallest - (Naoki Sawada)
					x = i(a).replace(sre, '').replace(/^_/, "\x01") || '',
					y = i(b).replace(sre, '').replace(/^_/, "\x01") || '',
					// chunk/tokenize
					xN = x.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'),
					yN = y.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'),
					// numeric, hex or date detection
					xD = parseInt(x.match(hre)) || (xN.length != 1 && x.match(dre) && Date.parse(x)),
					yD = parseInt(y.match(hre)) || xD && y.match(dre) && Date.parse(y) || null,
					oFxNcL, oFyNcL,
					locRes = 0;

					// first try and sort Hex codes or Dates
					if (yD) {
						if ( xD < yD ) return -1;
						else if ( xD > yD ) return 1;
					}
					// natural sorting through split numeric strings and default strings
					for(var cLoc=0, numS=Math.max(xN.length, yN.length); cLoc < numS; cLoc++) {

						// find floats not starting with '0', string or 0 if not defined (Clint Priest)
						oFxNcL = !(xN[cLoc] || '').match(ore) && parseFloat(xN[cLoc]) || xN[cLoc] || 0;
						oFyNcL = !(yN[cLoc] || '').match(ore) && parseFloat(yN[cLoc]) || yN[cLoc] || 0;

						// handle numeric vs string comparison - number < string - (Kyle Adams)
						// but symbol first < number - (Naoki Sawada)
						if (isNaN(oFxNcL) !== isNaN(oFyNcL)) {
							if (isNaN(oFxNcL) && (typeof oFxNcL !== 'string' || ! oFxNcL.match(syre))) {
								return 1;
							} else if (typeof oFyNcL !== 'string' || ! oFyNcL.match(syre)) {
								return -1;
							}
						}

						// use decimal number comparison if either value is string zero
						if (parseInt(oFxNcL, 10) === 0) oFxNcL = 0;
						if (parseInt(oFyNcL, 10) === 0) oFyNcL = 0;

						// rely on string comparison if different types - i.e. '02' < 2 != '02' < '2'
						if (typeof oFxNcL !== typeof oFyNcL) {
							oFxNcL += '';
							oFyNcL += '';
						}

						// use locale sensitive sort for strings when case insensitive
						// note: localeCompare interleaves uppercase with lowercase (e.g. A,a,B,b)
						if (self.sort.insensitive && typeof oFxNcL === 'string' && typeof oFyNcL === 'string') {
							locRes = oFxNcL.localeCompare(oFyNcL, self.loc);
							if (locRes !== 0) return locRes;
						}

						if (oFxNcL < oFyNcL) return -1;
						if (oFxNcL > oFyNcL) return 1;
					}
					return 0;
				};
				self.sort.insensitive = true;
			}
		}
		return self.sort(a, b);
	},
	
	/**
	 * Compare files based on elFinder.sort
	 *
	 * @param  Object  file
	 * @param  Object  file
	 * @return Number
	 */
	compare : function(file1, file2) {
		var self  = this,
			type  = self.sortType,
			asc   = self.sortOrder == 'asc',
			stick = self.sortStickFolders,
			rules = self.sortRules,
			sort  = rules[type],
			d1    = file1.mime == 'directory',
			d2    = file2.mime == 'directory',
			res;
			
		if (stick) {
			if (d1 && !d2) {
				return -1;
			} else if (!d1 && d2) {
				return 1;
			}
		}
		
		res = asc ? sort(file1, file2) : sort(file2, file1);
		
		return type !== 'name' && res === 0
			? res = asc ? rules.name(file1, file2) : rules.name(file2, file1)
			: res;
	},
	
	/**
	 * Sort files based on config
	 *
	 * @param  Array  files
	 * @return Array
	 */
	sortFiles : function(files) {
		return files.sort(this.compare);
	},
	
	/**
	 * Open notification dialog 
	 * and append/update message for required notification type.
	 *
	 * @param  Object  options
	 * @example  
	 * this.notify({
	 *    type : 'copy',
	 *    msg : 'Copy files', // not required for known types @see this.notifyType
	 *    cnt : 3,
	 *    hideCnt  : false,   // true for not show count
	 *    progress : 10,      // progress bar percents (use cnt : 0 to update progress bar)
	 *    cancel   : callback // callback function for cancel button
	 * })
	 * @return elFinder
	 */
	notify : function(opts) {
		var type     = opts.type,
			id       = opts.id? 'elfinder-notify-'+opts.id : '',
			msg      = this.i18n((typeof opts.msg !== 'undefined')? opts.msg : (this.messages['ntf'+type] ? 'ntf'+type : 'ntfsmth')),
			ndialog  = this.ui.notify,
			notify   = ndialog.children('.elfinder-notify-'+type+(id? ('.'+id) : '')),
			button   = notify.children('div.elfinder-notify-cancel').children('button'),
			ntpl     = '<div class="elfinder-notify elfinder-notify-{type}'+(id? (' '+id) : '')+'"><span class="elfinder-dialog-icon elfinder-dialog-icon-{type}"/><span class="elfinder-notify-msg">{msg}</span> <span class="elfinder-notify-cnt"/><div class="elfinder-notify-progressbar"><div class="elfinder-notify-progress"/></div><div class="elfinder-notify-cancel"/></div>',
			delta    = opts.cnt,
			size     = (typeof opts.size != 'undefined')? parseInt(opts.size) : null,
			progress = (typeof opts.progress != 'undefined' && opts.progress >= 0) ? opts.progress : null,
			cancel   = opts.cancel,
			clhover  = 'ui-state-hover',
			close    = function() {
				notify._esc && jQuery(document).off('keydown', notify._esc);
				notify.remove();
				!ndialog.children().length && ndialog.elfinderdialog('close');
			},
			cnt, total, prc;

		if (!type) {
			return this;
		}
		
		if (!notify.length) {
			notify = jQuery(ntpl.replace(/\{type\}/g, type).replace(/\{msg\}/g, msg))
				.appendTo(ndialog)
				.data('cnt', 0);

			if (progress != null) {
				notify.data({progress : 0, total : 0});
			}

			if (cancel) {
				button = jQuery('<button type="button" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"><span class="ui-button-text">'+this.i18n('btnCancel')+'</span></button>')
					.on('mouseenter mouseleave', function(e) { 
						jQuery(this).toggleClass(clhover, e.type === 'mouseenter');
					});
				notify.children('div.elfinder-notify-cancel').append(button);
			}
		} else if (typeof opts.msg !== 'undefined') {
			notify.children('span.elfinder-notify-msg').html(msg);
		}

		cnt = delta + parseInt(notify.data('cnt'));
		
		if (cnt > 0) {
			if (cancel && button.length) {
				if (jQuery.isFunction(cancel) || (typeof cancel === 'object' && cancel.promise)) {
					notify._esc = function(e) {
						if (e.type == 'keydown' && e.keyCode != jQuery.ui.keyCode.ESCAPE) {
							return;
						}
						e.preventDefault();
						e.stopPropagation();
						close();
						if (cancel.promise) {
							cancel.reject(0); // 0 is canceling flag
						} else {
							cancel(e);
						}
					};
					button.on('click', function(e) {
						notify._esc(e);
					});
					jQuery(document).on('keydown.' + this.namespace, notify._esc);
				}
			}
			
			!opts.hideCnt && notify.children('.elfinder-notify-cnt').text('('+cnt+')');
			ndialog.is(':hidden') && ndialog.elfinderdialog('open', this).height('auto');
			notify.data('cnt', cnt);
			
			if ((progress != null)
			&& (total = notify.data('total')) >= 0
			&& (prc = notify.data('progress')) >= 0) {

				total += size != null? size : delta;
				prc   += progress;
				(size == null && delta < 0) && (prc += delta * 100);
				notify.data({progress : prc, total : total});
				if (size != null) {
					prc *= 100;
					total = Math.max(1, total);
				}
				progress = parseInt(prc/total);
				
				notify.find('.elfinder-notify-progress')
					.animate({
						width : (progress < 100 ? progress : 100)+'%'
					}, 20);
			}
			
		} else {
			close();
		}
		
		return this;
	},
	
	/**
	 * Open confirmation dialog 
	 *
	 * @param  Object  options
	 * @example  
	 * this.confirm({
	 *    cssClass : 'elfinder-confirm-mydialog',
	 *    title : 'Remove files',
	 *    text  : 'Here is question text',
	 *    accept : {  // accept callback - required
	 *      label : 'Continue',
	 *      callback : function(applyToAll) { fm.log('Ok') }
	 *    },
	 *    cancel : { // cancel callback - required
	 *      label : 'Cancel',
	 *      callback : function() { fm.log('Cancel')}
	 *    },
	 *    reject : { // reject callback - optionally
	 *      label : 'No',
	 *      callback : function(applyToAll) { fm.log('No')}
	 *    },
	 *    buttons : [ // additional buttons callback - optionally
	 *      {
	 *        label : 'Btn1',
	 *        callback : function(applyToAll) { fm.log('Btn1')}
	 *      }
	 *    ],
	 *    all : true  // display checkbox "Apply to all"
	 * })
	 * @return elFinder
	 */
	confirm : function(opts) {
		var self     = this,
			complete = false,
			options = {
				cssClass  : 'elfinder-dialog-confirm',
				modal     : true,
				resizable : false,
				title     : this.i18n(opts.title || 'confirmReq'),
				buttons   : {},
				close     : function() { 
					!complete && opts.cancel.callback();
					jQuery(this).elfinderdialog('destroy');
				}
			},
			apply = this.i18n('apllyAll'),
			label, checkbox, btnNum;

		if (opts.cssClass) {
			options.cssClass += ' ' + opts.cssClass;
		}
		options.buttons[this.i18n(opts.accept.label)] = function() {
			opts.accept.callback(!!(checkbox && checkbox.prop('checked')));
			complete = true;
			jQuery(this).elfinderdialog('close');
		};
		options.buttons[this.i18n(opts.accept.label)]._cssClass = 'elfinder-confirm-accept';
		
		if (opts.reject) {
			options.buttons[this.i18n(opts.reject.label)] = function() {
				opts.reject.callback(!!(checkbox && checkbox.prop('checked')));
				complete = true;
				jQuery(this).elfinderdialog('close');
			};
			options.buttons[this.i18n(opts.reject.label)]._cssClass = 'elfinder-confirm-reject';
		}
		
		if (opts.buttons && opts.buttons.length > 0) {
			btnNum = 1;
			jQuery.each(opts.buttons, function(i, v){
				options.buttons[self.i18n(v.label)] = function() {
					v.callback(!!(checkbox && checkbox.prop('checked')));
					complete = true;
					jQuery(this).elfinderdialog('close');
				};
				options.buttons[self.i18n(v.label)]._cssClass = 'elfinder-confirm-extbtn' + (btnNum++);
				if (v.cssClass) {
					options.buttons[self.i18n(v.label)]._cssClass += ' ' + v.cssClass;
				}
			});
		}
		
		options.buttons[this.i18n(opts.cancel.label)] = function() {
			jQuery(this).elfinderdialog('close');
		};
		options.buttons[this.i18n(opts.cancel.label)]._cssClass = 'elfinder-confirm-cancel';
		
		if (opts.all) {
			options.create = function() {
				var base = jQuery('<div class="elfinder-dialog-confirm-applyall"/>');
				checkbox = jQuery('<input type="checkbox" />');
				jQuery(this).next().find('.ui-dialog-buttonset')
					.prepend(base.append(jQuery('<label>'+apply+'</label>').prepend(checkbox)));
			};
		}
		
		if (opts.optionsCallback && jQuery.isFunction(opts.optionsCallback)) {
			opts.optionsCallback(options);
		}
		
		return this.dialog('<span class="elfinder-dialog-icon elfinder-dialog-icon-confirm"/>' + this.i18n(opts.text), options);
	},
	
	/**
	 * Create unique file name in required dir
	 * 
	 * @param  String  file name
	 * @param  String  parent dir hash
	 * @param  String  glue
	 * @return String
	 */
	uniqueName : function(prefix, phash, glue) {
		var i = 0, ext = '', p, name;
		
		prefix = this.i18n(false, prefix);
		phash = phash || this.cwd().hash;
		glue = (typeof glue === 'undefined')? ' ' : glue;

		if (p = prefix.match(/^(.+)(\.[^.]+)$/)) {
			ext    = p[2];
			prefix = p[1];
		}
		
		name   = prefix+ext;
		
		if (!this.fileByName(name, phash)) {
			return name;
		}
		while (i < 10000) {
			name = prefix + glue + (++i) + ext;
			if (!this.fileByName(name, phash)) {
				return name;
			}
		}
		return prefix + Math.random() + ext;
	},
	
	/**
	 * Return message translated onto current language
	 * Allowed accept HTML element that was wrapped in jQuery object
	 * To be careful to XSS vulnerability of HTML element Ex. You should use `fm.escape(file.name)`
	 *
	 * @param  String|Array  message[s]|Object jQuery
	 * @return String
	 **/
	i18n : function() {
		var self = this,
			messages = this.messages, 
			input    = [],
			ignore   = [], 
			message = function(m) {
				var file;
				if (m.indexOf('#') === 0) {
					if ((file = self.file(m.substr(1)))) {
						return file.name;
					}
				}
				return m;
			},
			i, j, m, escFunc, start = 0, isErr;
		
		if (arguments.length && arguments[0] === false) {
			escFunc = function(m){ return m; };
			start = 1;
		}
		for (i = start; i< arguments.length; i++) {
			m = arguments[i];
			
			if (Array.isArray(m)) {
				for (j = 0; j < m.length; j++) {
					if (m[j] instanceof jQuery) {
						// jQuery object is HTML element
						input.push(m[j]);
					} else if (typeof m[j] !== 'undefined'){
						input.push(message('' + m[j]));
					}
				}
			} else if (m instanceof jQuery) {
				// jQuery object is HTML element
				input.push(m[j]);
			} else if (typeof m !== 'undefined'){
				input.push(message('' + m));
			}
		}
		
		for (i = 0; i < input.length; i++) {
			// dont translate placeholders
			if (jQuery.inArray(i, ignore) !== -1) {
				continue;
			}
			m = input[i];
			if (typeof m == 'string') {
				isErr = !!(messages[m] && m.match(/^err/));
				// translate message
				m = messages[m] || (escFunc? escFunc(m) : self.escape(m));
				// replace placeholders in message
				m = m.replace(/\$(\d+)/g, function(match, placeholder) {
					var res;
					placeholder = i + parseInt(placeholder);
					if (placeholder > 0 && input[placeholder]) {
						ignore.push(placeholder);
					}
					res = escFunc? escFunc(input[placeholder]) : self.escape(input[placeholder]);
					if (isErr) {
						res = '<span class="elfinder-err-var elfinder-err-var' + placeholder + '">' + res + '</span>';
					}
					return res;
				});
			} else {
				// get HTML from jQuery object
				m = m.get(0).outerHTML;
			}

			input[i] = m;
		}

		return jQuery.grep(input, function(m, i) { return jQuery.inArray(i, ignore) === -1 ? true : false; }).join('<br>');
	},
	
	/**
	 * Get icon style from file.icon
	 * 
	 * @param  Object  elFinder file object
	 * @return String|Object
	 */
	getIconStyle : function(file, asObject) {
		var self = this,
			template = {
				'background' : 'url(\'{url}\') 0 0 no-repeat',
				'background-size' : 'contain'
			},
			style = '',
			cssObj = {},
			i = 0;
		if (file.icon) {
			style = 'style="';
			jQuery.each(template, function(k, v) {
				if (i++ === 0) {
					v = v.replace('{url}', self.escape(file.icon));
				}
				if (asObject) {
					cssObj[k] = v;
				} else {
					style += k+':'+v+';';
				}
			});
			style += '"';
		}
		return asObject? cssObj : style;
	},
	
	/**
	 * Convert mimetype into css classes
	 * 
	 * @param  String  file mimetype
	 * @return String
	 */
	mime2class : function(mimeType) {
		var prefix = 'elfinder-cwd-icon-',
			mime   = mimeType.toLowerCase(),
			isText = this.textMimes[mime];
		
		mime = mime.split('/');
		if (isText) {
			mime[0] += ' ' + prefix + 'text';
		} else if (mime[1] && mime[1].match(/\+xml$/)) {
			mime[0] += ' ' + prefix + 'xml';
		}
		
		return prefix + mime[0] + (mime[1] ? ' ' + prefix + mime[1].replace(/(\.|\+)/g, '-') : '');
	},
	
	/**
	 * Return localized kind of file
	 * 
	 * @param  Object|String  file or file mimetype
	 * @return String
	 */
	mime2kind : function(f) {
		var isObj = typeof(f) == 'object' ? true : false,
			mime  = isObj ? f.mime : f,
			kind;
		

		if (isObj && f.alias && mime != 'symlink-broken') {
			kind = 'Alias';
		} else if (this.kinds[mime]) {
			if (isObj && mime === 'directory' && (! f.phash || f.isroot)) {
				kind = 'Root';
			} else {
				kind = this.kinds[mime];
			}
		}
		if (! kind) {
			if (mime.indexOf('text') === 0) {
				kind = 'Text';
			} else if (mime.indexOf('image') === 0) {
				kind = 'Image';
			} else if (mime.indexOf('audio') === 0) {
				kind = 'Audio';
			} else if (mime.indexOf('video') === 0) {
				kind = 'Video';
			} else if (mime.indexOf('application') === 0) {
				kind = 'App';
			} else {
				kind = mime;
			}
		}
		
		return this.messages['kind'+kind] ? this.i18n('kind'+kind) : mime;
	},
	
	/**
	 * Return boolean Is mime-type text file
	 * 
	 * @param  String  mime-type
	 * @return Boolean
	 */
	mimeIsText : function(mime) {
		return (this.textMimes[mime.toLowerCase()] || (mime.indexOf('text/') === 0 && mime.substr(5, 3) !== 'rtf') || mime.match(/^application\/.+\+xml$/))? true : false;
	},
	
	/**
	 * Returns a date string formatted according to the given format string
	 * 
	 * @param  String  format string
	 * @param  Object  Date object
	 * @return String
	 */
	date : function(format, date) {
		var self = this,
			output, d, dw, m, y, h, g, i, s;
		
		if (! date) {
			date = new Date();
		}
		
		h  = date[self.getHours]();
		g  = h > 12 ? h - 12 : h;
		i  = date[self.getMinutes]();
		s  = date[self.getSeconds]();
		d  = date[self.getDate]();
		dw = date[self.getDay]();
		m  = date[self.getMonth]() + 1;
		y  = date[self.getFullYear]();
		
		output = format.replace(/[a-z]/gi, function(val) {
			switch (val) {
				case 'd': return d > 9 ? d : '0'+d;
				case 'j': return d;
				case 'D': return self.i18n(self.i18.daysShort[dw]);
				case 'l': return self.i18n(self.i18.days[dw]);
				case 'm': return m > 9 ? m : '0'+m;
				case 'n': return m;
				case 'M': return self.i18n(self.i18.monthsShort[m-1]);
				case 'F': return self.i18n(self.i18.months[m-1]);
				case 'Y': return y;
				case 'y': return (''+y).substr(2);
				case 'H': return h > 9 ? h : '0'+h;
				case 'G': return h;
				case 'g': return g;
				case 'h': return g > 9 ? g : '0'+g;
				case 'a': return h >= 12 ? 'pm' : 'am';
				case 'A': return h >= 12 ? 'PM' : 'AM';
				case 'i': return i > 9 ? i : '0'+i;
				case 's': return s > 9 ? s : '0'+s;
			}
			return val;
		});
		
		return output;
	},
	
	/**
	 * Return localized date
	 * 
	 * @param  Object  file object
	 * @return String
	 */
	formatDate : function(file, t) {
		var self = this, 
			ts   = t || file.ts, 
			i18  = self.i18,
			date, format, output, d, dw, m, y, h, g, i, s;

		if (self.options.clientFormatDate && ts > 0) {

			date = new Date(ts*1000);
			format = ts >= this.yesterday 
				? this.fancyFormat 
				: this.dateFormat;

			output = self.date(format, date);
			
			return ts >= this.yesterday
				? output.replace('$1', this.i18n(ts >= this.today ? 'Today' : 'Yesterday'))
				: output;
		} else if (file.date) {
			return file.date.replace(/([a-z]+)\s/i, function(a1, a2) { return self.i18n(a2)+' '; });
		}
		
		return self.i18n('dateUnknown');
	},
	
	/**
	 * Return localized number string
	 * 
	 * @param  Number
	 * @return String
	 */
	toLocaleString : function(num) {
		var v = new Number(num);
		if (v) {
			if (v.toLocaleString) {
				return v.toLocaleString();
			} else {
				return String(num).replace( /(\d)(?=(\d\d\d)+(?!\d))/g, '$1,');
			}
		}
		return num;
	},
	
	/**
	 * Return css class marks file permissions
	 * 
	 * @param  Object  file 
	 * @return String
	 */
	perms2class : function(o) {
		var c = '';
		
		if (!o.read && !o.write) {
			c = 'elfinder-na';
		} else if (!o.read) {
			c = 'elfinder-wo';
		} else if (!o.write) {
			c = 'elfinder-ro';
		}
		
		if (o.type) {
			c += ' elfinder-' + this.escape(o.type);
		}
		
		return c;
	},
	
	/**
	 * Return localized string with file permissions
	 * 
	 * @param  Object  file
	 * @return String
	 */
	formatPermissions : function(f) {
		var p  = [];
			
		f.read && p.push(this.i18n('read'));
		f.write && p.push(this.i18n('write'));	

		return p.length ? p.join(' '+this.i18n('and')+' ') : this.i18n('noaccess');
	},
	
	/**
	 * Return formated file size
	 * 
	 * @param  Number  file size
	 * @return String
	 */
	formatSize : function(s) {
		var n = 1, u = 'b';
		
		if (s == 'unknown') {
			return this.i18n('unknown');
		}
		
		if (s > 1073741824) {
			n = 1073741824;
			u = 'GB';
		} else if (s > 1048576) {
			n = 1048576;
			u = 'MB';
		} else if (s > 1024) {
			n = 1024;
			u = 'KB';
		}
		s = s/n;
		return (s > 0 ? n >= 1048576 ? s.toFixed(2) : Math.round(s) : 0) +' '+u;
	},
	
	/**
	 * Return formated file mode by options.fileModeStyle
	 * 
	 * @param  String  file mode
	 * @param  String  format style
	 * @return String
	 */
	formatFileMode : function(p, style) {
		var i, o, s, b, sticy, suid, sgid, str, oct;
		
		if (!style) {
			style = this.options.fileModeStyle.toLowerCase();
		}
		p = jQuery.trim(p);
		if (p.match(/[rwxs-]{9}$/i)) {
			str = p = p.substr(-9);
			if (style == 'string') {
				return str;
			}
			oct = '';
			s = 0;
			for (i=0; i<7; i=i+3) {
				o = p.substr(i, 3);
				b = 0;
				if (o.match(/[r]/i)) {
					b += 4;
				}
				if (o.match(/[w]/i)) {
					b += 2;
				}
				if (o.match(/[xs]/i)) {
					if (o.match(/[xs]/)) {
						b += 1;
					}
					if (o.match(/[s]/i)) {
						if (i == 0) {
							s += 4;
						} else if (i == 3) {
							s += 2;
						}
					}
				}
				oct += b.toString(8);
			}
			if (s) {
				oct = s.toString(8) + oct;
			}
		} else {
			p = parseInt(p, 8);
			oct = p? p.toString(8) : '';
			if (!p || style == 'octal') {
				return oct;
			}
			o = p.toString(8);
			s = 0;
			if (o.length > 3) {
				o = o.substr(-4);
				s = parseInt(o.substr(0, 1), 8);
				o = o.substr(1);
			}
			sticy = ((s & 1) == 1); // not support
			sgid = ((s & 2) == 2);
			suid = ((s & 4) == 4);
			str = '';
			for(i=0; i<3; i++) {
				if ((parseInt(o.substr(i, 1), 8) & 4) == 4) {
					str += 'r';
				} else {
					str += '-';
				}
				if ((parseInt(o.substr(i, 1), 8) & 2) == 2) {
					str += 'w';
				} else {
					str += '-';
				}
				if ((parseInt(o.substr(i, 1), 8) & 1) == 1) {
					str += ((i==0 && suid)||(i==1 && sgid))? 's' : 'x';
				} else {
					str += '-';
				}
			}
		}
		if (style == 'both') {
			return str + ' (' + oct + ')';
		} else if (style == 'string') {
			return str;
		} else {
			return oct;
		}
	},
	
	/**
	 * Regist this.decodeRawString function
	 * 
	 * @return void
	 */
	registRawStringDecoder : function(rawStringDecoder) {
		if (jQuery.isFunction(rawStringDecoder)) {
			this.decodeRawString = this.options.rawStringDecoder = rawStringDecoder;
		}
	},
	
	/**
	 * Return boolean that uploadable MIME type into target folder
	 * 
	 * @param  String  mime    MIME type
	 * @param  String  target  target folder hash
	 * @return Bool
	 */
	uploadMimeCheck : function(mime, target) {
		target = target || this.cwd().hash;
		var res   = true, // default is allow
			mimeChecker = this.option('uploadMime', target),
			allow,
			deny,
			check = function(checker) {
				var ret = false;
				if (typeof checker === 'string' && checker.toLowerCase() === 'all') {
					ret = true;
				} else if (Array.isArray(checker) && checker.length) {
					jQuery.each(checker, function(i, v) {
						v = v.toLowerCase();
						if (v === 'all' || mime.indexOf(v) === 0) {
							ret = true;
							return false;
						}
					});
				}
				return ret;
			};
		if (mime && jQuery.isPlainObject(mimeChecker)) {
			mime = mime.toLowerCase();
			allow = check(mimeChecker.allow);
			deny = check(mimeChecker.deny);
			if (mimeChecker.firstOrder === 'allow') {
				res = false; // default is deny
				if (! deny && allow === true) { // match only allow
					res = true;
				}
			} else {
				res = true; // default is allow
				if (deny === true && ! allow) { // match only deny
					res = false;
				}
			}
		}
		return res;
	},
	
	/**
	 * call chained sequence of async deferred functions
	 * 
	 * @param  Array   tasks async functions
	 * @return Object  jQuery.Deferred
	 */
	sequence : function(tasks) {
		var l = tasks.length,
			chain = function(task, idx) {
				++idx;
				if (tasks[idx]) {
					return chain(task.then(tasks[idx]), idx);
				} else {
					return task;
				}
			};
		if (l > 1) {
			return chain(tasks[0](), 0);
		} else {
			return tasks[0]();
		}
	},
	
	/**
	 * Reload contents of target URL for clear browser cache
	 * 
	 * @param  String  url target URL
	 * @return Object  jQuery.Deferred
	 */
	reloadContents : function(url) {
		var dfd = jQuery.Deferred(),
			ifm;
		try {
			ifm = jQuery('<iframe width="1" height="1" scrolling="no" frameborder="no" style="position:absolute; top:-1px; left:-1px" crossorigin="use-credentials">')
				.attr('src', url)
				.one('load', function() {
					var ifm = jQuery(this);
					try {
						this.contentDocument.location.reload(true);
						ifm.one('load', function() {
							ifm.remove();
							dfd.resolve();
						});
					} catch(e) {
						ifm.attr('src', '').attr('src', url).one('load', function() {
							ifm.remove();
							dfd.resolve();
						});
					}
				})
				.appendTo('body');
		} catch(e) {
			ifm && ifm.remove();
			dfd.reject();
		}
		return dfd;
	},
	
	/**
	 * Make netmount option for OAuth2
	 * 
	 * @param  String   protocol
	 * @param  String   name
	 * @param  String   host
	 * @param  Object   opts  Default {noOffline: false, root: 'root', pathI18n: 'folderId', folders: true}
			}
	 * 
	 * @return Object
	 */
	makeNetmountOptionOauth : function(protocol, name, host, opt) {
		var noOffline = typeof opt === 'boolean'? opt : null, // for backward compat
			opts = Object.assign({
				noOffline : false,
				root      : 'root',
				pathI18n  : 'folderId',
				folders   : true
			}, (noOffline === null? (opt || {}) : {noOffline : noOffline})),
			addFolders = function(fm, bro, folders) {
				var self = this,
					cnt  = Object.keys(jQuery.isPlainObject(folders)? folders : {}).length,
					select;
				
				bro.next().remove();
				if (cnt) {
					select = jQuery('<select class="ui-corner-all elfinder-tabstop" style="max-width:200px;">').append(
						jQuery(jQuery.map(folders, function(n,i){return '<option value="'+fm.escape((i+'').trim())+'">'+fm.escape(n)+'</option>';}).join(''))
					).on('change click', function(e){
						var node = jQuery(this),
							path = node.val(),
							spn;
						self.inputs.path.val(path);
						if (opts.folders && (e.type === 'change' || node.data('current') !== path)) {
							node.next().remove();
							node.data('current', path);
							if (path != opts.root) {
								spn = spinner();
								if (xhr && xhr.state() === 'pending') {
									fm.abortXHR(xhr, { quiet: true , abort: true });
								}
								node.after(spn);
								xhr = fm.request({
									data : {cmd : 'netmount', protocol: protocol, host: host, user: 'init', path: path, pass: 'folders'},
									preventDefault : true
								}).done(function(data){
									addFolders.call(self, fm, node, data.folders);
								}).always(function() {
									fm.abortXHR(xhr, { quiet: true });
									spn.remove();
								}).xhr;
							}
						}
					});
					bro.after(jQuery('<div/>').append(select))
						.closest('.ui-dialog').trigger('tabstopsInit');
					select.trigger('focus');
				}
			},
			spinner = function() {
				return jQuery('<div class="elfinder-netmount-spinner"/>').append('<span class="elfinder-spinner"/>');
			},
			xhr;
		return {
			vars : {},
			name : name,
			inputs: {
				offline  : jQuery('<input type="checkbox"/>').on('change', function() {
					jQuery(this).parents('table.elfinder-netmount-tb').find('select:first').trigger('change', 'reset');
				}),
				host     : jQuery('<span><span class="elfinder-spinner"/></span><input type="hidden"/>'),
				path     : jQuery('<input type="text" value="'+opts.root+'"/>'),
				user     : jQuery('<input type="hidden"/>'),
				pass     : jQuery('<input type="hidden"/>')
			},
			select: function(fm, ev, d){
				var f = this.inputs,
					oline = f.offline,
					f0 = jQuery(f.host[0]),
					data = d || null;
				this.vars.mbtn = f.host.closest('.ui-dialog').children('.ui-dialog-buttonpane:first').find('button.elfinder-btncnt-0');
				if (! f0.data('inrequest')
						&& (f0.find('span.elfinder-spinner').length
							|| data === 'reset'
							|| (data === 'winfocus' && ! f0.siblings('span.elfinder-button-icon-reload').length))
							)
				{
					if (oline.parent().children().length === 1) {
						f.path.parent().prev().html(fm.i18n(opts.pathI18n));
						oline.attr('title', fm.i18n('offlineAccess'));
						oline.uniqueId().after(jQuery('<label/>').attr('for', oline.attr('id')).html(' '+fm.i18n('offlineAccess')));
					}
					f0.data('inrequest', true).empty().addClass('elfinder-spinner')
						.parent().find('span.elfinder-button-icon').remove();
					fm.request({
						data : {cmd : 'netmount', protocol: protocol, host: host, user: 'init', options: {id: fm.id, offline: oline.prop('checked')? 1:0, pass: f.host[1].value}},
						preventDefault : true
					}).done(function(data){
						f0.removeClass("elfinder-spinner").html(data.body.replace(/\{msg:([^}]+)\}/g, function(whole,s1){return fm.i18n(s1, host);}));
					});
					opts.noOffline && oline.closest('tr').hide();
				} else {
					oline.closest('tr')[(opts.noOffline || f.user.val())? 'hide':'show']();
					f0.data('funcexpup') && f0.data('funcexpup')();
				}
				this.vars.mbtn[jQuery(f.host[1]).val()? 'show':'hide']();
			},
			done: function(fm, data){
				var f = this.inputs,
					p = this.protocol,
					f0 = jQuery(f.host[0]),
					f1 = jQuery(f.host[1]),
					expires = '&nbsp;';
				
				opts.noOffline && f.offline.closest('tr').hide();
				if (data.mode == 'makebtn') {
					f0.removeClass('elfinder-spinner').removeData('expires').removeData('funcexpup');
					f.host.find('input').on('mouseenter mouseleave', function(){jQuery(this).toggleClass('ui-state-hover');});
					f1.val('');
					f.path.val(opts.root).next().remove();
					f.user.val('');
					f.pass.val('');
					! opts.noOffline && f.offline.closest('tr').show();
					this.vars.mbtn.hide();
				} else if (data.mode == 'folders') {
					if (data.folders) {
						addFolders.call(this, fm, f.path.nextAll(':last'), data.folders);
					}
				} else {
					if (data.expires) {
						expires = '()';
						f0.data('expires', data.expires);
					}
					f0.html(host + expires).removeClass('elfinder-spinner');
					if (data.expires) {
						f0.data('funcexpup', function() {
							var rem = Math.floor((f0.data('expires') - (+new Date()) / 1000) / 60);
							if (rem < 3) {
								f0.parent().children('.elfinder-button-icon-reload').click();
							} else {
								f0.text(f0.text().replace(/\(.*\)/, '('+fm.i18n(['minsLeft', rem])+')'));
								setTimeout(function() {
									if (f0.is(':visible')) {
										f0.data('funcexpup')();
									}
								}, 60000);
							}
						});
						f0.data('funcexpup')();
					}
					if (data.reset) {
						p.trigger('change', 'reset');
						return;
					}
					f0.parent().append(jQuery('<span class="elfinder-button-icon elfinder-button-icon-reload" title="'+fm.i18n('reAuth')+'">')
						.on('click', function() {
							f1.val('reauth');
							p.trigger('change', 'reset');
						}));
					f1.val(protocol);
					this.vars.mbtn.show();
					if (data.folders) {
						addFolders.call(this, fm, f.path, data.folders);
					}
					f.user.val('done');
					f.pass.val('done');
					f.offline.closest('tr').hide();
				}
				f0.removeData('inrequest');
			},
			fail: function(fm, err){
				jQuery(this.inputs.host[0]).removeData('inrequest');
				this.protocol.trigger('change', 'reset');
			},
			integrateInfo: opts.integrate
		};
	},
	
	/**
	 * Find cwd's nodes from files
	 * 
	 * @param  Array    files
	 * @param  Object   opts   {firstOnly: true|false}
	 */
	findCwdNodes : function(files, opts) {
		var self    = this,
			cwd     = this.getUI('cwd'),
			cwdHash = this.cwd().hash,
			newItem = jQuery();
		
		opts = opts || {};
		
		jQuery.each(files, function(i, f) {
			if (f.phash === cwdHash || self.searchStatus.state > 1) {
				newItem = newItem.add(self.cwdHash2Elm(f.hash));
				if (opts.firstOnly) {
					return false;
				}
			}
		});
		
		return newItem;
	},
	
	/**
	 * Convert from relative URL to abstract URL based on current URL
	 * 
	 * @param  String  URL
	 * @return String
	 */
	convAbsUrl : function(url) {
		if (url.match(/^http/i)) {
			return url;
		}
		if (url.substr(0,2) === '//') {
			return window.location.protocol + url;
		}
		var root = window.location.protocol + '//' + window.location.host,
			reg  = /[^\/]+\/\.\.\//,
			ret;
		if (url.substr(0, 1) === '/') {
			ret = root + url;
		} else {
			ret = root + window.location.pathname.replace(/\/[^\/]+$/, '/') + url;
		}
		ret = ret.replace('/./', '/');
		while(reg.test(ret)) {
			ret = ret.replace(reg, '');
		}
		return ret;
	},
	
	/**
	 * Is same origin to current site
	 * 
	 * @param  String  check url
	 * @return Boolean
	 */
	isSameOrigin : function (checkUrl) {
		var url;
		checkUrl = this.convAbsUrl(checkUrl);
		if (location.origin && window.URL) {
			try {
				url = new URL(checkUrl);
				return location.origin === url.origin;
			} catch(e) {}
		}
		url = document.createElement('a');
		url.href = checkUrl;
		return location.protocol === url.protocol && location.host === url.host && location.port && url.port;
	},
	
	navHash2Id : function(hash) {
		return this.navPrefix + hash;
	},
	
	navId2Hash : function(id) {
		return typeof(id) == 'string' ? id.substr(this.navPrefix.length) : false;
	},
	
	cwdHash2Id : function(hash) {
		return this.cwdPrefix + hash;
	},
	
	cwdId2Hash : function(id) {
		return typeof(id) == 'string' ? id.substr(this.cwdPrefix.length) : false;
	},
	
	/**
	 * navHash to jQuery element object
	 *
	 * @param      String  hash    nav hash
	 * @return     Object  jQuery element object
	 */
	navHash2Elm : function(hash) {
		return jQuery(document.getElementById(this.navHash2Id(hash)));
	},

	/**
	 * cwdHash to jQuery element object
	 *
	 * @param      String  hash    cwd hash
	 * @return     Object  jQuery element object
	 */
	cwdHash2Elm : function(hash) {
		return jQuery(document.getElementById(this.cwdHash2Id(hash)));
	},

	isInWindow : function(elem, nochkHide) {
		var elm, rect;
		if (! (elm = elem.get(0))) {
			return false;
		}
		if (! nochkHide && elm.offsetParent === null) {
			return false;
		}
		rect = elm.getBoundingClientRect();
		return document.elementFromPoint(rect.left, rect.top)? true : false;
	},
	
	/**
	 * calculate elFinder node z-index
	 * 
	 * @return void
	 */
	zIndexCalc : function() {
		var self = this,
			node = this.getUI(),
			ni = node.css('z-index');
		if (ni && ni !== 'auto' && ni !== 'inherit') {
			self.zIndex = ni;
		} else {
			node.parents().each(function(i, n) {
				var z = jQuery(n).css('z-index');
				if (z !== 'auto' && z !== 'inherit' && (z = parseInt(z))) {
					self.zIndex = z;
					return false;
				}
			});
		}
	},
	
	/**
	 * Load JavaScript files
	 * 
	 * @param  Array    urls      to load JavaScript file URLs
	 * @param  Function callback  call back function on script loaded
	 * @param  Object   opts      Additional options to jQuery.ajax OR {loadType: 'tag'} to load by script tag
	 * @param  Object   check     { obj: (Object)ParentObject, name: (String)"Attribute name", timeout: (Integer)milliseconds }
	 * @return elFinder
	 */
	loadScript : function(urls, callback, opts, check) {
		var defOpts = {
				dataType : 'script',
				cache    : true
			},
			success, cnt, scripts = {}, results = {};
		
		opts = opts || {};
		if (opts.tryRequire && this.hasRequire) {
			require(urls, callback, opts.error);
		} else {
			success = function() {
				var cnt, fi, hasError;
				jQuery.each(results, function(i, status) {
					if (status !== 'success' && status !== 'notmodified') {
						hasError = true;
						return false;
					}
				});
				if (!hasError) {
					if (jQuery.isFunction(callback)) {
						if (check) {
							if (typeof check.obj[check.name] === 'undefined') {
								cnt = check.timeout? (check.timeout / 10) : 1;
								fi = setInterval(function() {
									if (--cnt < 0 || typeof check.obj[check.name] !== 'undefined') {
										clearInterval(fi);
										callback();
									}
								}, 10);
							} else {
								callback();
							}
						} else {
							callback();
						}
					}
				} else {
					if (opts.error && jQuery.isFunction(opts.error)) {
						opts.error({ loadResults: results });
					}
				}
			};

			if (opts.loadType === 'tag') {
				jQuery('head > script').each(function() {
					scripts[this.src] = this;
				});
				cnt = urls.length;
				jQuery.each(urls, function(i, url) {
					var done = false,
						script;
					
					if (scripts[url]) {
						results[i] = scripts[url]._error || 'success';
						(--cnt < 1) && success();
					} else {
						script = document.createElement('script');
						script.charset = opts.charset || 'UTF-8';
						jQuery('head').append(script);
						script.onload = script.onreadystatechange = function() {
							if ( !done && (!this.readyState ||
									this.readyState === 'loaded' || this.readyState === 'complete') ) {
								done = true;
								results[i] = 'success';
								(--cnt < 1) && success();
							}
						};
						script.onerror = function(err) {
							results[i] = script._error = (err && err.type)? err.type : 'error';
							(--cnt < 1) && success();
						};
						script.src = url;
					}
				});
			} else {
				opts = jQuery.isPlainObject(opts)? Object.assign(defOpts, opts) : defOpts;
				cnt = 0;
				(function appendScript(d, status) {
					if (d !== void(0)) {
						results[cnt++] = status;
					}
					if (urls.length) {
						jQuery.ajax(Object.assign({}, opts, {
							url: urls.shift(),
							success: appendScript,
							error: appendScript
						}));
					} else {
						success();
					}
				})();
			}
		}
		return this;
	},
	
	/**
	 * Load CSS files
	 * 
	 * @param  Array    to load CSS file URLs
	 * @param  Object   options
	 * @return elFinder
	 */
	loadCss : function(urls, opts) {
		var self = this,
			clName, dfds;
		if (typeof urls === 'string') {
			urls = [ urls ];
		}
		if (opts) {
			if (opts.className) {
				clName = opts.className;
			}
			if (opts.dfd && opts.dfd.promise) {
				dfds = [];
			}
		}
		jQuery.each(urls, function(i, url) {
			var link, df;
			url = self.convAbsUrl(url).replace(/^https?:/i, '');
			if (dfds) {
				dfds[i] = jQuery.Deferred();
			}
			if (! jQuery("head > link[href='+url+']").length) {
				link = document.createElement('link');
				link.type = 'text/css';
				link.rel = 'stylesheet';
				link.href = url;
				if (clName) {
					link.className = clName;
				}
				if (dfds) {
					link.onload = function() {
						dfds[i].resolve();
					};
					link.onerror = function() {
						dfds[i].reject();
					};
				}
				jQuery('head').append(link);
			} else {
				dfds && dfds[i].resolve();
			}
		});
		if (dfds) {
			jQuery.when.apply(null, dfds).done(function() {
				opts.dfd.resolve();
			}).fail(function() {
				opts.dfd.reject();
			});
		}
		return this;
	},
	
	/**
	 * Abortable async job performer
	 * 
	 * @param func Function
	 * @param arr  Array
	 * @param opts Object
	 * 
	 * @return Object jQuery.Deferred that has an extended method _abort()
	 */
	asyncJob : function(func, arr, opts) {
		var dfrd = jQuery.Deferred(),
			abortFlg = false,
			parms = Object.assign({
				interval : 0,
				numPerOnce : 1
			}, opts || {}),
			resArr = [],
			vars =[],
			curVars = [],
			exec,
			tm;
		
		dfrd._abort = function(resolve) {
			tm && clearTimeout(tm);
			vars = [];
			abortFlg = true;
			if (dfrd.state() === 'pending') {
				dfrd[resolve? 'resolve' : 'reject'](resArr);
			}
		};
		
		dfrd.fail(function() {
			dfrd._abort();
		}).always(function() {
			dfrd._abort = function() {};
		});

		if (typeof func === 'function' && Array.isArray(arr)) {
			vars = arr.concat();
			exec = function() {
				var i, len, res;
				if (abortFlg) {
					return;
				}
				curVars = vars.splice(0, parms.numPerOnce);
				len = curVars.length;
				for (i = 0; i < len; i++) {
					if (abortFlg) {
						break;
					}
					res = func(curVars[i]);
					(res !== null) && resArr.push(res);
				}
				if (abortFlg) {
					return;
				}
				if (vars.length) {
					tm = setTimeout(exec, parms.interval);
				} else {
					dfrd.resolve(resArr);
				}
			};
			if (vars.length) {
				tm = setTimeout(exec, 0);
			} else {
				dfrd.resolve(resArr);
			}
		} else {
			dfrd.reject();
		}
		return dfrd;
	},
	
	getSize : function(targets) {
		var self = this,
			reqs = [],
			tgtlen = targets.length,
			dfrd = jQuery.Deferred().fail(function() {
				jQuery.each(reqs, function(i, req) {
					if (req) {
						req.syncOnFail && req.syncOnFail(false);
						req.reject();
					}
				});
			}),
			getLeafRoots = function(file) {
				var targets = [];
				if (file.mime === 'directory') {
					jQuery.each(self.leafRoots, function(hash, roots) {
						var phash;
						if (hash === file.hash) {
							targets.push.apply(targets, roots);
						} else {
							phash = (self.file(hash) || {}).phash;
							while(phash) {
								if (phash === file.hash) {
									targets.push.apply(targets, roots);
								}
								phash = (self.file(phash) || {}).phash;
							}
						}
					});
				}
				return targets;
			},
			checkPhash = function(hash) {
				var dfd = jQuery.Deferred(),
					dir = self.file(hash),
					target = dir? dir.phash : hash;
				if (target && ! self.file(target)) {
					self.request({
						data : {
							cmd    : 'parents',
							target : target
						},
						preventFail : true
					}).done(function() {
						self.one('parentsdone', function() {
							dfd.resolve();
						});
					}).fail(function() {
						dfd.resolve();
					});
				} else {
					dfd.resolve();
				}
				return dfd;
			},
			cache = function() {
				var dfd = jQuery.Deferred(),
					cnt = Object.keys(self.leafRoots).length;
				
				if (cnt > 0) {
					jQuery.each(self.leafRoots, function(hash) {
						checkPhash(hash).done(function() {
							--cnt;
							if (cnt < 1) {
								dfd.resolve();
							}
						});
					});
				} else {
					dfd.resolve();
				}
				return dfd;
			};

		self.autoSync('stop');
		cache().done(function() {
			var files = [], grps = {}, dfds = [], cache = [], singles = {};
			
			jQuery.each(targets, function() {
				files.push.apply(files, getLeafRoots(self.file(this)));
			});
			targets.push.apply(targets, files);
			
			jQuery.each(targets, function() {
				var root = self.root(this),
					file = self.file(this);
				if (file && (file.sizeInfo || file.mime !== 'directory')) {
					cache.push(jQuery.Deferred().resolve(file.sizeInfo? file.sizeInfo : {size: file.size, dirCnt: 0, fileCnt : 1}));
				} else {
					if (! grps[root]) {
						grps[root] = [ this ];
					} else {
						grps[root].push(this);
					}
				}
			});
			
			jQuery.each(grps, function() {
				var idx = dfds.length;
				if (this.length === 1) {
					singles[idx] = this[0];
				}
				dfds.push(self.request({
					data : {cmd : 'size', targets : this},
					preventDefault : true
				}));
			});
			reqs.push.apply(reqs, dfds);
			dfds.push.apply(dfds, cache);
			
			jQuery.when.apply($, dfds).fail(function() {
				dfrd.reject();
			}).done(function() {
				var cache = function(h, data) {
						var file;
						if (file = self.file(h)) {
							file.sizeInfo = { isCache: true };
							jQuery.each(['size', 'dirCnt', 'fileCnt'], function() {
								file.sizeInfo[this] = data[this] || 0;
							});
							file.size = parseInt(file.sizeInfo.size);
							changed.push(file);
						}
					},
					size = 0,
					fileCnt = 0,
					dirCnt = 0,
					argLen = arguments.length,
					cnts = [],
					cntsTxt = '',
					changed = [],
					i, file, data;
				
				for (i = 0; i < argLen; i++) {
					data = arguments[i];
					file = null;
					if (!data.isCache) {
						if (singles[i] && (file = self.file(singles[i]))) {
							cache(singles[i], data);
						} else if (data.sizes && jQuery.isPlainObject(data.sizes)) {
							jQuery.each(data.sizes, function(h, sizeInfo) {
								cache(h, sizeInfo);
							});
						}
					}
					size += parseInt(data.size);
					if (fileCnt !== false) {
						if (typeof data.fileCnt === 'undefined') {
							fileCnt = false;
						}
						fileCnt += parseInt(data.fileCnt || 0);
					}
					if (dirCnt !== false) {
						if (typeof data.dirCnt === 'undefined') {
							dirCnt = false;
						}
						dirCnt += parseInt(data.dirCnt || 0);
					}
				}
				changed.length && self.change({changed: changed});
				
				if (dirCnt !== false){
					cnts.push(self.i18n('folders') + ': ' + (dirCnt - (tgtlen > 1? 0 : 1)));
				}
				if (fileCnt !== false){
					cnts.push(self.i18n('files') + ': ' + fileCnt);
				}
				if (cnts.length) {
					cntsTxt = '<br>' + cnts.join(', ');
				}
				dfrd.resolve({
					size: size,
					fileCnt: fileCnt,
					dirCnt: dirCnt,
					formated: (size >= 0 ? self.formatSize(size) : self.i18n('unknown')) + cntsTxt
				});
			});
			
			self.autoSync();
		});
		
		return dfrd;
	},
	
	/**
	 * Gets the theme object by settings of options.themes
	 *
	 * @param  String  themeid  The themeid
	 * @return Object  jQuery.Deferred
	 */
	getTheme : function(themeid) {
		var self = this,
			dfd = jQuery.Deferred(),
			absUrl = function(url, base) {
				if (!base) {
					base = self.convAbsUrl(self.baseUrl);
				}
				if (Array.isArray(url)) {
					return jQuery.map(url, function(v) {
						return absUrl(v, base);
					});
				} else {
					return url.match(/^(?:http|\/\/)/i)? url : base + url.replace(/^(?:\.\/|\/)/, '');
				}
			},
			themeObj, m;
		if (themeid && (themeObj = self.options.themes[themeid])) {
			if (typeof themeObj === 'string') {
				url = absUrl(themeObj);
				if (m = url.match(/^(.+\/)[^/]+\.json$/i)) {
					jQuery.getJSON(url).done(function(data) {
						themeObj = data;
						themeObj.id = themeid;
						if (themeObj.cssurls) {
							themeObj.cssurls = absUrl(themeObj.cssurls, m[1]);
						}
						dfd.resolve(themeObj);
					}).fail(function() {
						dfd.reject();
					});
				} else {
					dfd.resolve({
						id: themeid,
						name: themeid,
						cssurls: [url]
					});
				}
			} else if (jQuery.isPlainObject(themeObj) && themeObj.cssurls) {
				themeObj.id = themeid;
				themeObj.cssurls = absUrl(themeObj.cssurls);
				if (!Array.isArray(themeObj.cssurls)) {
					themeObj.cssurls = [themeObj.cssurls];
				}
				if (!themeObj.name) {
					themeObj.name = themeid;
				}
				dfd.resolve(themeObj);
			} else {
				dfd.reject();
			}
		} else {
			dfd.reject();
		}
		return dfd;
	},

	/**
	 * Change current theme
	 *
	 * @param  String  themeid  The themeid
	 * @return Object  this elFinder instance
	 */
	changeTheme : function(themeid) {
		var self = this;
		if (themeid) {
			if (self.options.themes[themeid] && (!self.theme || self.theme.id !== themeid)) {
				self.getTheme(themeid).done(function(themeObj) {
					if (themeObj.cssurls) {
						jQuery('head>link.elfinder-theme-ext').remove();
						self.loadCss(themeObj.cssurls, {
							className: 'elfinder-theme-ext',
							dfd: jQuery.Deferred().done(function() {
								self.theme = themeObj;
								self.trigger && self.trigger('themechange');
							})
						});
					}
				});
			} else if (themeid === 'default' && self.theme) {
				jQuery('head>link.elfinder-theme-ext').remove();
				self.theme = null;
				self.trigger && self.trigger('themechange');
			}
		}
		return this;
	},

	/**
	 * Apply leaf root stats to target directory
	 *
	 * @param      object     dir     object of target directory
	 * @param      boolean    update  is force update
	 * 
	 * @return     boolean    dir object was chenged 
	 */
	applyLeafRootStats : function(dir, update) {
		var self = this,
			prev = update? dir : (self.file(dir.hash) || dir),
			prevTs = prev.ts,
			change = false;
		// backup original stats
		if (update || !dir._realStats) {
			dir._realStats = {
				locked: dir.locked || 0,
				dirs: dir.dirs || 0,
				ts: dir.ts
			};
		}
		// set lock
		dir.locked = 1;
		if (!prev.locked) {
			change = true;
		}
		// has leaf root to `dirs: 1`
		dir.dirs = 1;
		if (!prev.dirs) {
			change = true;
		}
		// set ts
		jQuery.each(self.leafRoots[dir.hash], function() {
			var f = self.file(this);
			if (f && f.ts && (dir.ts || 0) < f.ts) {
				dir.ts = f.ts;
			}
		});
		if (prevTs !== dir.ts) {
			change = true;
		}

		return change;
	},

	/**
	 * To aborted XHR object
	 * 
	 * @param Object xhr
	 * @param Object opts
	 * 
	 * @return void
	 */
	abortXHR : function(xhr, o) {
		var opts = o || {};
		
		if (xhr) {
			opts.quiet && (xhr.quiet = true);
			if (opts.abort && xhr._requestId) {
				this.request({
					data: {
						cmd: 'abort',
						id: xhr._requestId
					},
					preventDefault: true
				});
			}
			xhr.abort();
			xhr = void 0;
		}
	},

	/**
	 * Gets the request identifier
	 *
	 * @return  String  The request identifier.
	 */
	getRequestId : function() {
		return (+ new Date()).toString(16) + Math.floor(1000 * Math.random()).toString(16);
	},
	
	/**
	 * Flip key and value of array or object
	 * 
	 * @param  Array | Object  { a: 1, b: 1, c: 2 }
	 * @param  Mixed           Static value
	 * @return Object          { 1: "b", 2: "c" }
	 */
	arrayFlip : function (trans, val) {
		var key,
			tmpArr = {},
			isArr = jQuery.isArray(trans);
		for (key in trans) {
			if (isArr || trans.hasOwnProperty(key)) {
				tmpArr[trans[key]] = val || key;
			}
		}
		return tmpArr;
	},
	
	/**
	 * Return array ["name without extention", "extention"]
	 * 
	 * @param String name
	 * 
	 * @return Array
	 * 
	 */
	splitFileExtention : function(name) {
		var m;
		if (m = name.match(/^(.+?)?\.((?:tar\.(?:gz|bz|bz2|z|lzo))|cpio\.gz|ps\.gz|xcf\.(?:gz|bz2)|[a-z0-9]{1,10})$/i)) {
			if (typeof m[1] === 'undefined') {
				m[1] = '';
			}
			return [m[1], m[2]];
		} else {
			return [name, ''];
		}
	},
	
	/**
	 * Slice the ArrayBuffer by sliceSize
	 *
	 * @param      arraybuffer  arrayBuffer  The array buffer
	 * @param      Number       sliceSize    The slice size
	 * @return     Array   Array of sleced arraybuffer
	 */
	sliceArrayBuffer : function(arrayBuffer, sliceSize) {
		var segments= [],
			fi = 0;
		while(fi * sliceSize < arrayBuffer.byteLength){
			segments.push(arrayBuffer.slice(fi * sliceSize, (fi + 1) * sliceSize));
			fi++;
		}
		return segments;
	},

	arrayBufferToBase64 : function(ab) {
		if (!window.btoa) {
			return '';
		}
		var dView = new Uint8Array(ab), // Get a byte view
			arr = Array.prototype.slice.call(dView), // Create a normal array
			arr1 = arr.map(function(item) {
				return String.fromCharCode(item); // Convert
			});
	    return window.btoa(arr1.join('')); // Form a string
	},

	log : function(m) { window.console && window.console.log && window.console.log(m); return this; },
	
	debug : function(type, m) {
		var d = this.options.debug;

		if (d && (d === 'all' || d[type])) {
			window.console && window.console.log && window.console.log('elfinder debug: ['+type+'] ['+this.id+']', m);
		} 
		
		if (type === 'backend-error') {
			if (! this.cwd().hash || (d && (d === 'all' || d['backend-error']))) {
				m = Array.isArray(m)? m : [ m ];
				this.error(m);
			}
		} else if (type === 'backend-debug') {
			this.trigger('backenddebug', m);
		}
		
		return this;
	},
	time : function(l) { window.console && window.console.time && window.console.time(l); },
	timeEnd : function(l) { window.console && window.console.timeEnd && window.console.timeEnd(l); }
	

};

/**
 * for conpat ex. ie8...
 *
 * Object.keys() - JavaScript | MDN
 * https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
 */
if (!Object.keys) {
	Object.keys = (function () {
		var hasOwnProperty = Object.prototype.hasOwnProperty,
				hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),
				dontEnums = [
					'toString',
					'toLocaleString',
					'valueOf',
					'hasOwnProperty',
					'isPrototypeOf',
					'propertyIsEnumerable',
					'constructor'
				],
				dontEnumsLength = dontEnums.length;

		return function (obj) {
			if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null) throw new TypeError('Object.keys called on non-object');

			var result = [];

			for (var prop in obj) {
				if (hasOwnProperty.call(obj, prop)) result.push(prop);
			}

			if (hasDontEnumBug) {
				for (var i=0; i < dontEnumsLength; i++) {
					if (hasOwnProperty.call(obj, dontEnums[i])) result.push(dontEnums[i]);
				}
			}
			return result;
		};
	})();
}
// Array.isArray
if (!Array.isArray) {
	Array.isArray = function(arr) {
		return jQuery.isArray(arr);
	};
}
// Object.assign
if (!Object.assign) {
	Object.assign = function() {
		return jQuery.extend.apply(null, arguments);
	};
}
// String.repeat
if (!String.prototype.repeat) {
	String.prototype.repeat = function(count) {
		'use strict';
		if (this == null) {
			throw new TypeError('can\'t convert ' + this + ' to object');
		}
		var str = '' + this;
		count = +count;
		if (count != count) {
			count = 0;
		}
		if (count < 0) {
			throw new RangeError('repeat count must be non-negative');
		}
		if (count == Infinity) {
			throw new RangeError('repeat count must be less than infinity');
		}
		count = Math.floor(count);
		if (str.length == 0 || count == 0) {
			return '';
		}
		// Ensuring count is a 31-bit integer allows us to heavily optimize the
		// main part. But anyway, most current (August 2014) browsers can't handle
		// strings 1 << 28 chars or longer, so:
		if (str.length * count >= 1 << 28) {
			throw new RangeError('repeat count must not overflow maximum string size');
		}
		var rpt = '';
		for (var i = 0; i < count; i++) {
			rpt += str;
		}
		return rpt;
	};
}
// String.trim
if (!String.prototype.trim) {
	String.prototype.trim = function() {
		return this.replace(/^\s+|\s+$/g, '');
	};
}
// Array.apply
(function () {
	try {
		Array.apply(null, {});
		return;
	} catch (e) { }

	var toString = Object.prototype.toString,
		arrayType = '[object Array]',
		_apply = Function.prototype.apply,
		slice = /*@cc_on @if (@_jscript_version <= 5.8)
			function () {
				var a = [], i = this.length;
				while (i-- > 0) a[i] = this[i];
				return a;
			}@else@*/Array.prototype.slice/*@end@*/;

	Function.prototype.apply = function apply(thisArg, argArray) {
		return _apply.call(this, thisArg,
			toString.call(argArray) === arrayType ? argArray : slice.call(argArray));
	};
})();
// Array.from
if (!Array.from) {
	Array.from = function(obj) {
		return obj.length === 1 ? [obj[0]] : Array.apply(null, obj);
	};
}
// window.requestAnimationFrame and window.cancelAnimationFrame
if (!window.cancelAnimationFrame) {
// http://paulirish.com/2011/requestanimationframe-for-smart-animating/
// http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating
// requestAnimationFrame polyfill by Erik Möller. fixes from Paul Irish and Tino Zijdel
// MIT license
(function() {
    var lastTime = 0;
    var vendors = ['ms', 'moz', 'webkit', 'o'];
    for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
        window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];
        window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame'] 
                                   || window[vendors[x]+'CancelRequestAnimationFrame'];
    }
 
    if (!window.requestAnimationFrame)
        window.requestAnimationFrame = function(callback, element) {
            var currTime = new Date().getTime();
            var timeToCall = Math.max(0, 16 - (currTime - lastTime));
            var id = window.setTimeout(function() { callback(currTime + timeToCall); }, 
              timeToCall);
            lastTime = currTime + timeToCall;
            return id;
        };
 
    if (!window.cancelAnimationFrame)
        window.cancelAnimationFrame = function(id) {
            clearTimeout(id);
        };
}());
}


/*
 * File: /js/elFinder.version.js
 */

/**
 * Application version
 *
 * @type String
 **/
elFinder.prototype.version = '2.1.49';



/*
 * File: /js/jquery.elfinder.js
 */

/*** jQuery UI droppable performance tune for elFinder ***/
(function(){
if (jQuery.ui) {
	if (jQuery.ui.ddmanager) {
		var origin = jQuery.ui.ddmanager.prepareOffsets;
		jQuery.ui.ddmanager.prepareOffsets = function( t, event ) {
			var isOutView = function(elem) {
				if (elem.is(':hidden')) {
					return true;
				}
				var rect = elem[0].getBoundingClientRect();
				return document.elementFromPoint(rect.left, rect.top) || document.elementFromPoint(rect.left + rect.width, rect.top + rect.height)? false : true;
			};
			
			if (event.type === 'mousedown' || t.options.elfRefresh) {
				var i, d,
				m = jQuery.ui.ddmanager.droppables[ t.options.scope ] || [],
				l = m.length;
				for ( i = 0; i < l; i++ ) {
					d = m[ i ];
					if (d.options.autoDisable && (!d.options.disabled || d.options.autoDisable > 1)) {
						d.options.disabled = isOutView(d.element);
						d.options.autoDisable = d.options.disabled? 2 : 1;
					}
				}
			}
			
			// call origin function
			return origin( t, event );
		};
	}
}
})();

 /**
 *
 * jquery.binarytransport.js
 *
 * @description. jQuery ajax transport for making binary data type requests.
 * @version 1.0 
 * @author Henry Algus <henryalgus@gmail.com>
 *
 */

// use this transport for "binary" data type
jQuery.ajaxTransport('+binary', function(options, originalOptions, jqXHR) {
	// check for conditions and support for blob / arraybuffer response type
	if (window.FormData && ((options.dataType && (options.dataType == 'binary')) || (options.data && ((window.ArrayBuffer && options.data instanceof ArrayBuffer) || (window.Blob && options.data instanceof Blob)))))
	{
		var xhr;
		return {
			// create new XMLHttpRequest
			send: function(headers, callback){
				// setup all variables
				xhr = new XMLHttpRequest();
				var url = options.url,
					type = options.type,
					async = options.async || true,
					// blob or arraybuffer. Default is blob
					dataType = options.responseType || 'blob',
					data = options.data || null,
					username = options.username,
					password = options.password;
					
				xhr.addEventListener('load', function(){
					var data = {};
					data[options.dataType] = xhr.response;
					// make callback and send data
					callback(xhr.status, xhr.statusText, data, xhr.getAllResponseHeaders());
				});

				xhr.open(type, url, async, username, password);
				
				// setup custom headers
				for (var i in headers ) {
					xhr.setRequestHeader(i, headers[i] );
				}

				// setuo xhrFields
				if (options.xhrFields) {
					for (var key in options.xhrFields) {
						if (key in xhr) {
							xhr[key] = options.xhrFields[key];
						}
					}
				}

				xhr.responseType = dataType;
				xhr.send(data);
			},
			abort: function(){
				xhr.abort();
			}
		};
	}
});

/*!
 * jQuery UI Touch Punch 0.2.3
 *
 * Copyright 2011–2014, Dave Furfero
 * Dual licensed under the MIT or GPL Version 2 licenses.
 *
 * Depends:
 *	jquery.ui.widget.js
 *	jquery.ui.mouse.js
 */
(function ($) {

  // Detect touch support
  jQuery.support.touch = 'ontouchend' in document;

  // Ignore browsers without touch support
  if (!jQuery.support.touch) {
	return;
  }

  var mouseProto = jQuery.ui.mouse.prototype,
	  _mouseInit = mouseProto._mouseInit,
	  _mouseDestroy = mouseProto._mouseDestroy,
	  touchHandled,
	  posX, posY;

  /**
   * Simulate a mouse event based on a corresponding touch event
   * @param {Object} event A touch event
   * @param {String} simulatedType The corresponding mouse event
   */
  function simulateMouseEvent (event, simulatedType) {

	// Ignore multi-touch events
	if (event.originalEvent.touches.length > 1) {
	  return;
	}

	if (! jQuery(event.currentTarget).hasClass('touch-punch-keep-default')) {
		event.preventDefault();
	}

	var touch = event.originalEvent.changedTouches[0],
		simulatedEvent = document.createEvent('MouseEvents');
	
	// Initialize the simulated mouse event using the touch event's coordinates
	simulatedEvent.initMouseEvent(
	  simulatedType,	// type
	  true,				// bubbles					  
	  true,				// cancelable				  
	  window,			// view						  
	  1,				// detail					  
	  touch.screenX,	// screenX					  
	  touch.screenY,	// screenY					  
	  touch.clientX,	// clientX					  
	  touch.clientY,	// clientY					  
	  false,			// ctrlKey					  
	  false,			// altKey					  
	  false,			// shiftKey					  
	  false,			// metaKey					  
	  0,				// button					  
	  null				// relatedTarget			  
	);

	// Dispatch the simulated event to the target element
	event.target.dispatchEvent(simulatedEvent);
  }

  /**
   * Handle the jQuery UI widget's touchstart events
   * @param {Object} event The widget element's touchstart event
   */
  mouseProto._touchStart = function (event) {

	var self = this;

	// Ignore the event if another widget is already being handled
	if (touchHandled || !self._mouseCapture(event.originalEvent.changedTouches[0])) {
	  return;
	}

	// Track element position to avoid "false" move
	posX = event.originalEvent.changedTouches[0].screenX.toFixed(0);
	posY = event.originalEvent.changedTouches[0].screenY.toFixed(0);

	// Set the flag to prevent other widgets from inheriting the touch event
	touchHandled = true;

	// Track movement to determine if interaction was a click
	self._touchMoved = false;

	// Simulate the mouseover event
	simulateMouseEvent(event, 'mouseover');

	// Simulate the mousemove event
	simulateMouseEvent(event, 'mousemove');

	// Simulate the mousedown event
	simulateMouseEvent(event, 'mousedown');
  };

  /**
   * Handle the jQuery UI widget's touchmove events
   * @param {Object} event The document's touchmove event
   */
  mouseProto._touchMove = function (event) {

	// Ignore event if not handled
	if (!touchHandled) {
	  return;
	}

	// Ignore if it's a "false" move (position not changed)
	var x = event.originalEvent.changedTouches[0].screenX.toFixed(0);
	var y = event.originalEvent.changedTouches[0].screenY.toFixed(0);
	// Ignore if it's a "false" move (position not changed)
	if (Math.abs(posX - x) <= 4 && Math.abs(posY - y) <= 4) {
		return;
	}

	// Interaction was not a click
	this._touchMoved = true;

	// Simulate the mousemove event
	simulateMouseEvent(event, 'mousemove');
  };

  /**
   * Handle the jQuery UI widget's touchend events
   * @param {Object} event The document's touchend event
   */
  mouseProto._touchEnd = function (event) {

	// Ignore event if not handled
	if (!touchHandled) {
	  return;
	}

	// Simulate the mouseup event
	simulateMouseEvent(event, 'mouseup');

	// Simulate the mouseout event
	simulateMouseEvent(event, 'mouseout');

	// If the touch interaction did not move, it should trigger a click
	if (!this._touchMoved) {

	  // Simulate the click event
	  simulateMouseEvent(event, 'click');
	}

	// Unset the flag to allow other widgets to inherit the touch event
	touchHandled = false;
	this._touchMoved = false;
  };

  /**
   * A duck punch of the jQuery.ui.mouse _mouseInit method to support touch events.
   * This method extends the widget with bound touch event handlers that
   * translate touch events to mouse events and pass them to the widget's
   * original mouse event handling methods.
   */
  mouseProto._mouseInit = function () {
	
	var self = this;

	if (self.element.hasClass('touch-punch')) {
		// Delegate the touch handlers to the widget's element
		self.element.on({
		  touchstart: jQuery.proxy(self, '_touchStart'),
		  touchmove: jQuery.proxy(self, '_touchMove'),
		  touchend: jQuery.proxy(self, '_touchEnd')
		});
	}

	// Call the original jQuery.ui.mouse init method
	_mouseInit.call(self);
  };

  /**
   * Remove the touch event handlers
   */
  mouseProto._mouseDestroy = function () {
	
	var self = this;

	if (self.element.hasClass('touch-punch')) {
		// Delegate the touch handlers to the widget's element
		self.element.off({
		  touchstart: jQuery.proxy(self, '_touchStart'),
		  touchmove: jQuery.proxy(self, '_touchMove'),
		  touchend: jQuery.proxy(self, '_touchEnd')
		});
	}

	// Call the original jQuery.ui.mouse destroy method
	_mouseDestroy.call(self);
  };

})(jQuery);

jQuery.fn.elfinder = function(o, o2) {
	
	if (o === 'instance') {
		return this.getElFinder();
	}
	
	return this.each(function() {
		
		var cmd          = typeof o  === 'string'  ? o  : '',
			bootCallback = typeof o2 === 'function'? o2 : void(0),
			opts;
		
		if (!this.elfinder) {
			if (jQuery.isPlainObject(o)) {
				new elFinder(this, o, bootCallback);
			}
		} else {
			switch(cmd) {
				case 'close':
				case 'hide':
					this.elfinder.hide();
					break;
					
				case 'open':
				case 'show':
					this.elfinder.show();
					break;
					
				case 'destroy':
					this.elfinder.destroy();
					break;
				
				case 'reload':
				case 'restart':
					if (this.elfinder) {
						opts = this.elfinder.options;
						bootCallback = this.elfinder.bootCallback;
						this.elfinder.destroy();
						new elFinder(this, jQuery.extend(true, opts, jQuery.isPlainObject(o2)? o2 : {}), bootCallback);
					}
					break;
			}
		}
	});
};

jQuery.fn.getElFinder = function() {
	var instance;
	
	this.each(function() {
		if (this.elfinder) {
			instance = this.elfinder;
			return false;
		}
	});
	
	return instance;
};

jQuery.fn.elfUiWidgetInstance = function(name) {
	try {
		return this[name]('instance');
	} catch(e) {
		// fallback for jQuery UI < 1.11
		var data = this.data('ui-' + name);
		if (data && typeof data === 'object' && data.widgetFullName === 'ui-' + name) {
			return data;
		}
		return null;
	}
};

// function scrollRight
if (! jQuery.fn.scrollRight) {
	jQuery.fn.extend({
		scrollRight: function (val) {
			var node = this.get(0);
			if (val === undefined) {
				return Math.max(0, node.scrollWidth - (node.scrollLeft + node.clientWidth));
			}
			return this.scrollLeft(node.scrollWidth - node.clientWidth - val);
		}
	});
}

// function scrollBottom
if (! jQuery.fn.scrollBottom) {
	jQuery.fn.extend({
		scrollBottom: function(val) { 
			var node = this.get(0);
			if (val === undefined) {
				return Math.max(0, node.scrollHeight - (node.scrollTop + node.clientHeight));
			}
			return this.scrollTop(node.scrollHeight - node.clientHeight - val);
		}
	});
}


/*
 * File: /js/elFinder.mimetypes.js
 */

elFinder.prototype.mimeTypes = {"application\/x-executable":"exe","application\/x-jar":"jar","application\/x-gzip":"gz","application\/x-bzip2":"tbz","application\/x-rar":"rar","text\/x-php":"php","text\/javascript":"js","application\/rtfd":"rtfd","text\/x-python":"py","text\/x-ruby":"rb","text\/x-shellscript":"sh","text\/x-perl":"pl","text\/xml":"xml","text\/x-csrc":"c","text\/x-chdr":"h","text\/x-c++src":"cpp","text\/x-c++hdr":"hh","text\/x-markdown":"md","text\/x-yaml":"yml","image\/x-ms-bmp":"bmp","image\/x-targa":"tga","image\/xbm":"xbm","image\/pxm":"pxm","audio\/wav":"wav","video\/x-dv":"dv","video\/x-ms-wmv":"wm","video\/ogg":"ogm","video\/MP2T":"m2ts","application\/x-mpegURL":"m3u8","application\/dash+xml":"mpd","application\/andrew-inset":"ez","application\/applixware":"aw","application\/atom+xml":"atom","application\/atomcat+xml":"atomcat","application\/atomsvc+xml":"atomsvc","application\/ccxml+xml":"ccxml","application\/cdmi-capability":"cdmia","application\/cdmi-container":"cdmic","application\/cdmi-domain":"cdmid","application\/cdmi-object":"cdmio","application\/cdmi-queue":"cdmiq","application\/cu-seeme":"cu","application\/davmount+xml":"davmount","application\/docbook+xml":"dbk","application\/dssc+der":"dssc","application\/dssc+xml":"xdssc","application\/ecmascript":"ecma","application\/emma+xml":"emma","application\/epub+zip":"epub","application\/exi":"exi","application\/font-tdpfr":"pfr","application\/gml+xml":"gml","application\/gpx+xml":"gpx","application\/gxf":"gxf","application\/hyperstudio":"stk","application\/inkml+xml":"ink","application\/ipfix":"ipfix","application\/java-serialized-object":"ser","application\/java-vm":"class","application\/json":"json","application\/jsonml+json":"jsonml","application\/lost+xml":"lostxml","application\/mac-binhex40":"hqx","application\/mac-compactpro":"cpt","application\/mads+xml":"mads","application\/marc":"mrc","application\/marcxml+xml":"mrcx","application\/mathematica":"ma","application\/mathml+xml":"mathml","application\/mbox":"mbox","application\/mediaservercontrol+xml":"mscml","application\/metalink+xml":"metalink","application\/metalink4+xml":"meta4","application\/mets+xml":"mets","application\/mods+xml":"mods","application\/mp21":"m21","application\/mp4":"mp4s","application\/msword":"doc","application\/mxf":"mxf","application\/octet-stream":"bin","application\/oda":"oda","application\/oebps-package+xml":"opf","application\/ogg":"ogx","application\/omdoc+xml":"omdoc","application\/onenote":"onetoc","application\/oxps":"oxps","application\/patch-ops-error+xml":"xer","application\/pdf":"pdf","application\/pgp-encrypted":"pgp","application\/pgp-signature":"asc","application\/pics-rules":"prf","application\/pkcs10":"p10","application\/pkcs7-mime":"p7m","application\/pkcs7-signature":"p7s","application\/pkcs8":"p8","application\/pkix-attr-cert":"ac","application\/pkix-cert":"cer","application\/pkix-crl":"crl","application\/pkix-pkipath":"pkipath","application\/pkixcmp":"pki","application\/pls+xml":"pls","application\/postscript":"ai","application\/prs.cww":"cww","application\/pskc+xml":"pskcxml","application\/rdf+xml":"rdf","application\/reginfo+xml":"rif","application\/relax-ng-compact-syntax":"rnc","application\/resource-lists+xml":"rl","application\/resource-lists-diff+xml":"rld","application\/rls-services+xml":"rs","application\/rpki-ghostbusters":"gbr","application\/rpki-manifest":"mft","application\/rpki-roa":"roa","application\/rsd+xml":"rsd","application\/rss+xml":"rss","application\/rtf":"rtf","application\/sbml+xml":"sbml","application\/scvp-cv-request":"scq","application\/scvp-cv-response":"scs","application\/scvp-vp-request":"spq","application\/scvp-vp-response":"spp","application\/sdp":"sdp","application\/set-payment-initiation":"setpay","application\/set-registration-initiation":"setreg","application\/shf+xml":"shf","application\/smil+xml":"smi","application\/sparql-query":"rq","application\/sparql-results+xml":"srx","application\/srgs":"gram","application\/srgs+xml":"grxml","application\/sru+xml":"sru","application\/ssdl+xml":"ssdl","application\/ssml+xml":"ssml","application\/tei+xml":"tei","application\/thraud+xml":"tfi","application\/timestamped-data":"tsd","application\/vnd.3gpp.pic-bw-large":"plb","application\/vnd.3gpp.pic-bw-small":"psb","application\/vnd.3gpp.pic-bw-var":"pvb","application\/vnd.3gpp2.tcap":"tcap","application\/vnd.3m.post-it-notes":"pwn","application\/vnd.accpac.simply.aso":"aso","application\/vnd.accpac.simply.imp":"imp","application\/vnd.acucobol":"acu","application\/vnd.acucorp":"atc","application\/vnd.adobe.air-application-installer-package+zip":"air","application\/vnd.adobe.formscentral.fcdt":"fcdt","application\/vnd.adobe.fxp":"fxp","application\/vnd.adobe.xdp+xml":"xdp","application\/vnd.adobe.xfdf":"xfdf","application\/vnd.ahead.space":"ahead","application\/vnd.airzip.filesecure.azf":"azf","application\/vnd.airzip.filesecure.azs":"azs","application\/vnd.amazon.ebook":"azw","application\/vnd.americandynamics.acc":"acc","application\/vnd.amiga.ami":"ami","application\/vnd.android.package-archive":"apk","application\/vnd.anser-web-certificate-issue-initiation":"cii","application\/vnd.anser-web-funds-transfer-initiation":"fti","application\/vnd.antix.game-component":"atx","application\/vnd.apple.installer+xml":"mpkg","application\/vnd.aristanetworks.swi":"swi","application\/vnd.astraea-software.iota":"iota","application\/vnd.audiograph":"aep","application\/vnd.blueice.multipass":"mpm","application\/vnd.bmi":"bmi","application\/vnd.businessobjects":"rep","application\/vnd.chemdraw+xml":"cdxml","application\/vnd.chipnuts.karaoke-mmd":"mmd","application\/vnd.cinderella":"cdy","application\/vnd.claymore":"cla","application\/vnd.cloanto.rp9":"rp9","application\/vnd.clonk.c4group":"c4g","application\/vnd.cluetrust.cartomobile-config":"c11amc","application\/vnd.cluetrust.cartomobile-config-pkg":"c11amz","application\/vnd.commonspace":"csp","application\/vnd.contact.cmsg":"cdbcmsg","application\/vnd.cosmocaller":"cmc","application\/vnd.crick.clicker":"clkx","application\/vnd.crick.clicker.keyboard":"clkk","application\/vnd.crick.clicker.palette":"clkp","application\/vnd.crick.clicker.template":"clkt","application\/vnd.crick.clicker.wordbank":"clkw","application\/vnd.criticaltools.wbs+xml":"wbs","application\/vnd.ctc-posml":"pml","application\/vnd.cups-ppd":"ppd","application\/vnd.curl.car":"car","application\/vnd.curl.pcurl":"pcurl","application\/vnd.dart":"dart","application\/vnd.data-vision.rdz":"rdz","application\/vnd.dece.data":"uvf","application\/vnd.dece.ttml+xml":"uvt","application\/vnd.dece.unspecified":"uvx","application\/vnd.dece.zip":"uvz","application\/vnd.denovo.fcselayout-link":"fe_launch","application\/vnd.dna":"dna","application\/vnd.dolby.mlp":"mlp","application\/vnd.dpgraph":"dpg","application\/vnd.dreamfactory":"dfac","application\/vnd.ds-keypoint":"kpxx","application\/vnd.dvb.ait":"ait","application\/vnd.dvb.service":"svc","application\/vnd.dynageo":"geo","application\/vnd.ecowin.chart":"mag","application\/vnd.enliven":"nml","application\/vnd.epson.esf":"esf","application\/vnd.epson.msf":"msf","application\/vnd.epson.quickanime":"qam","application\/vnd.epson.salt":"slt","application\/vnd.epson.ssf":"ssf","application\/vnd.eszigno3+xml":"es3","application\/vnd.ezpix-album":"ez2","application\/vnd.ezpix-package":"ez3","application\/vnd.fdf":"fdf","application\/vnd.fdsn.mseed":"mseed","application\/vnd.fdsn.seed":"seed","application\/vnd.flographit":"gph","application\/vnd.fluxtime.clip":"ftc","application\/vnd.framemaker":"fm","application\/vnd.frogans.fnc":"fnc","application\/vnd.frogans.ltf":"ltf","application\/vnd.fsc.weblaunch":"fsc","application\/vnd.fujitsu.oasys":"oas","application\/vnd.fujitsu.oasys2":"oa2","application\/vnd.fujitsu.oasys3":"oa3","application\/vnd.fujitsu.oasysgp":"fg5","application\/vnd.fujitsu.oasysprs":"bh2","application\/vnd.fujixerox.ddd":"ddd","application\/vnd.fujixerox.docuworks":"xdw","application\/vnd.fujixerox.docuworks.binder":"xbd","application\/vnd.fuzzysheet":"fzs","application\/vnd.genomatix.tuxedo":"txd","application\/vnd.geogebra.file":"ggb","application\/vnd.geogebra.tool":"ggt","application\/vnd.geometry-explorer":"gex","application\/vnd.geonext":"gxt","application\/vnd.geoplan":"g2w","application\/vnd.geospace":"g3w","application\/vnd.gmx":"gmx","application\/vnd.google-earth.kml+xml":"kml","application\/vnd.google-earth.kmz":"kmz","application\/vnd.grafeq":"gqf","application\/vnd.groove-account":"gac","application\/vnd.groove-help":"ghf","application\/vnd.groove-identity-message":"gim","application\/vnd.groove-injector":"grv","application\/vnd.groove-tool-message":"gtm","application\/vnd.groove-tool-template":"tpl","application\/vnd.groove-vcard":"vcg","application\/vnd.hal+xml":"hal","application\/vnd.handheld-entertainment+xml":"zmm","application\/vnd.hbci":"hbci","application\/vnd.hhe.lesson-player":"les","application\/vnd.hp-hpgl":"hpgl","application\/vnd.hp-hpid":"hpid","application\/vnd.hp-hps":"hps","application\/vnd.hp-jlyt":"jlt","application\/vnd.hp-pcl":"pcl","application\/vnd.hp-pclxl":"pclxl","application\/vnd.hydrostatix.sof-data":"sfd-hdstx","application\/vnd.ibm.minipay":"mpy","application\/vnd.ibm.modcap":"afp","application\/vnd.ibm.rights-management":"irm","application\/vnd.ibm.secure-container":"sc","application\/vnd.iccprofile":"icc","application\/vnd.igloader":"igl","application\/vnd.immervision-ivp":"ivp","application\/vnd.immervision-ivu":"ivu","application\/vnd.insors.igm":"igm","application\/vnd.intercon.formnet":"xpw","application\/vnd.intergeo":"i2g","application\/vnd.intu.qbo":"qbo","application\/vnd.intu.qfx":"qfx","application\/vnd.ipunplugged.rcprofile":"rcprofile","application\/vnd.irepository.package+xml":"irp","application\/vnd.is-xpr":"xpr","application\/vnd.isac.fcs":"fcs","application\/vnd.jam":"jam","application\/vnd.jcp.javame.midlet-rms":"rms","application\/vnd.jisp":"jisp","application\/vnd.joost.joda-archive":"joda","application\/vnd.kahootz":"ktz","application\/vnd.kde.karbon":"karbon","application\/vnd.kde.kchart":"chrt","application\/vnd.kde.kformula":"kfo","application\/vnd.kde.kivio":"flw","application\/vnd.kde.kontour":"kon","application\/vnd.kde.kpresenter":"kpr","application\/vnd.kde.kspread":"ksp","application\/vnd.kde.kword":"kwd","application\/vnd.kenameaapp":"htke","application\/vnd.kidspiration":"kia","application\/vnd.kinar":"kne","application\/vnd.koan":"skp","application\/vnd.kodak-descriptor":"sse","application\/vnd.las.las+xml":"lasxml","application\/vnd.llamagraphics.life-balance.desktop":"lbd","application\/vnd.llamagraphics.life-balance.exchange+xml":"lbe","application\/vnd.lotus-1-2-3":123,"application\/vnd.lotus-approach":"apr","application\/vnd.lotus-freelance":"pre","application\/vnd.lotus-notes":"nsf","application\/vnd.lotus-organizer":"org","application\/vnd.lotus-screencam":"scm","application\/vnd.lotus-wordpro":"lwp","application\/vnd.macports.portpkg":"portpkg","application\/vnd.mcd":"mcd","application\/vnd.medcalcdata":"mc1","application\/vnd.mediastation.cdkey":"cdkey","application\/vnd.mfer":"mwf","application\/vnd.mfmp":"mfm","application\/vnd.micrografx.flo":"flo","application\/vnd.micrografx.igx":"igx","application\/vnd.mif":"mif","application\/vnd.mobius.daf":"daf","application\/vnd.mobius.dis":"dis","application\/vnd.mobius.mbk":"mbk","application\/vnd.mobius.mqy":"mqy","application\/vnd.mobius.msl":"msl","application\/vnd.mobius.plc":"plc","application\/vnd.mobius.txf":"txf","application\/vnd.mophun.application":"mpn","application\/vnd.mophun.certificate":"mpc","application\/vnd.mozilla.xul+xml":"xul","application\/vnd.ms-artgalry":"cil","application\/vnd.ms-cab-compressed":"cab","application\/vnd.ms-excel":"xls","application\/vnd.ms-excel.addin.macroenabled.12":"xlam","application\/vnd.ms-excel.sheet.binary.macroenabled.12":"xlsb","application\/vnd.ms-excel.sheet.macroenabled.12":"xlsm","application\/vnd.ms-excel.template.macroenabled.12":"xltm","application\/vnd.ms-fontobject":"eot","application\/vnd.ms-htmlhelp":"chm","application\/vnd.ms-ims":"ims","application\/vnd.ms-lrm":"lrm","application\/vnd.ms-officetheme":"thmx","application\/vnd.ms-pki.seccat":"cat","application\/vnd.ms-pki.stl":"stl","application\/vnd.ms-powerpoint":"ppt","application\/vnd.ms-powerpoint.addin.macroenabled.12":"ppam","application\/vnd.ms-powerpoint.presentation.macroenabled.12":"pptm","application\/vnd.ms-powerpoint.slide.macroenabled.12":"sldm","application\/vnd.ms-powerpoint.slideshow.macroenabled.12":"ppsm","application\/vnd.ms-powerpoint.template.macroenabled.12":"potm","application\/vnd.ms-project":"mpp","application\/vnd.ms-word.document.macroenabled.12":"docm","application\/vnd.ms-word.template.macroenabled.12":"dotm","application\/vnd.ms-works":"wps","application\/vnd.ms-wpl":"wpl","application\/vnd.ms-xpsdocument":"xps","application\/vnd.mseq":"mseq","application\/vnd.musician":"mus","application\/vnd.muvee.style":"msty","application\/vnd.mynfc":"taglet","application\/vnd.neurolanguage.nlu":"nlu","application\/vnd.nitf":"ntf","application\/vnd.noblenet-directory":"nnd","application\/vnd.noblenet-sealer":"nns","application\/vnd.noblenet-web":"nnw","application\/vnd.nokia.n-gage.data":"ngdat","application\/vnd.nokia.n-gage.symbian.install":"n-gage","application\/vnd.nokia.radio-preset":"rpst","application\/vnd.nokia.radio-presets":"rpss","application\/vnd.novadigm.edm":"edm","application\/vnd.novadigm.edx":"edx","application\/vnd.novadigm.ext":"ext","application\/vnd.oasis.opendocument.chart":"odc","application\/vnd.oasis.opendocument.chart-template":"otc","application\/vnd.oasis.opendocument.database":"odb","application\/vnd.oasis.opendocument.formula":"odf","application\/vnd.oasis.opendocument.formula-template":"odft","application\/vnd.oasis.opendocument.graphics":"odg","application\/vnd.oasis.opendocument.graphics-template":"otg","application\/vnd.oasis.opendocument.image":"odi","application\/vnd.oasis.opendocument.image-template":"oti","application\/vnd.oasis.opendocument.presentation":"odp","application\/vnd.oasis.opendocument.presentation-template":"otp","application\/vnd.oasis.opendocument.spreadsheet":"ods","application\/vnd.oasis.opendocument.spreadsheet-template":"ots","application\/vnd.oasis.opendocument.text":"odt","application\/vnd.oasis.opendocument.text-master":"odm","application\/vnd.oasis.opendocument.text-template":"ott","application\/vnd.oasis.opendocument.text-web":"oth","application\/vnd.olpc-sugar":"xo","application\/vnd.oma.dd2+xml":"dd2","application\/vnd.openofficeorg.extension":"oxt","application\/vnd.openxmlformats-officedocument.presentationml.presentation":"pptx","application\/vnd.openxmlformats-officedocument.presentationml.slide":"sldx","application\/vnd.openxmlformats-officedocument.presentationml.slideshow":"ppsx","application\/vnd.openxmlformats-officedocument.presentationml.template":"potx","application\/vnd.openxmlformats-officedocument.spreadsheetml.sheet":"xlsx","application\/vnd.openxmlformats-officedocument.spreadsheetml.template":"xltx","application\/vnd.openxmlformats-officedocument.wordprocessingml.document":"docx","application\/vnd.openxmlformats-officedocument.wordprocessingml.template":"dotx","application\/vnd.osgeo.mapguide.package":"mgp","application\/vnd.osgi.dp":"dp","application\/vnd.osgi.subsystem":"esa","application\/vnd.palm":"pdb","application\/vnd.pawaafile":"paw","application\/vnd.pg.format":"str","application\/vnd.pg.osasli":"ei6","application\/vnd.picsel":"efif","application\/vnd.pmi.widget":"wg","application\/vnd.pocketlearn":"plf","application\/vnd.powerbuilder6":"pbd","application\/vnd.previewsystems.box":"box","application\/vnd.proteus.magazine":"mgz","application\/vnd.publishare-delta-tree":"qps","application\/vnd.pvi.ptid1":"ptid","application\/vnd.quark.quarkxpress":"qxd","application\/vnd.realvnc.bed":"bed","application\/vnd.recordare.musicxml":"mxl","application\/vnd.recordare.musicxml+xml":"musicxml","application\/vnd.rig.cryptonote":"cryptonote","application\/vnd.rim.cod":"cod","application\/vnd.rn-realmedia":"rm","application\/vnd.rn-realmedia-vbr":"rmvb","application\/vnd.route66.link66+xml":"link66","application\/vnd.sailingtracker.track":"st","application\/vnd.seemail":"see","application\/vnd.sema":"sema","application\/vnd.semd":"semd","application\/vnd.semf":"semf","application\/vnd.shana.informed.formdata":"ifm","application\/vnd.shana.informed.formtemplate":"itp","application\/vnd.shana.informed.interchange":"iif","application\/vnd.shana.informed.package":"ipk","application\/vnd.simtech-mindmapper":"twd","application\/vnd.smaf":"mmf","application\/vnd.smart.teacher":"teacher","application\/vnd.solent.sdkm+xml":"sdkm","application\/vnd.spotfire.dxp":"dxp","application\/vnd.spotfire.sfs":"sfs","application\/vnd.stardivision.calc":"sdc","application\/vnd.stardivision.draw":"sda","application\/vnd.stardivision.impress":"sdd","application\/vnd.stardivision.math":"smf","application\/vnd.stardivision.writer":"sdw","application\/vnd.stardivision.writer-global":"sgl","application\/vnd.stepmania.package":"smzip","application\/vnd.stepmania.stepchart":"sm","application\/vnd.sun.xml.calc":"sxc","application\/vnd.sun.xml.calc.template":"stc","application\/vnd.sun.xml.draw":"sxd","application\/vnd.sun.xml.draw.template":"std","application\/vnd.sun.xml.impress":"sxi","application\/vnd.sun.xml.impress.template":"sti","application\/vnd.sun.xml.math":"sxm","application\/vnd.sun.xml.writer":"sxw","application\/vnd.sun.xml.writer.global":"sxg","application\/vnd.sun.xml.writer.template":"stw","application\/vnd.sus-calendar":"sus","application\/vnd.svd":"svd","application\/vnd.symbian.install":"sis","application\/vnd.syncml+xml":"xsm","application\/vnd.syncml.dm+wbxml":"bdm","application\/vnd.syncml.dm+xml":"xdm","application\/vnd.tao.intent-module-archive":"tao","application\/vnd.tcpdump.pcap":"pcap","application\/vnd.tmobile-livetv":"tmo","application\/vnd.trid.tpt":"tpt","application\/vnd.triscape.mxs":"mxs","application\/vnd.trueapp":"tra","application\/vnd.ufdl":"ufd","application\/vnd.uiq.theme":"utz","application\/vnd.umajin":"umj","application\/vnd.unity":"unityweb","application\/vnd.uoml+xml":"uoml","application\/vnd.vcx":"vcx","application\/vnd.visio":"vsd","application\/vnd.visionary":"vis","application\/vnd.vsf":"vsf","application\/vnd.wap.wbxml":"wbxml","application\/vnd.wap.wmlc":"wmlc","application\/vnd.wap.wmlscriptc":"wmlsc","application\/vnd.webturbo":"wtb","application\/vnd.wolfram.player":"nbp","application\/vnd.wordperfect":"wpd","application\/vnd.wqd":"wqd","application\/vnd.wt.stf":"stf","application\/vnd.xara":"xar","application\/vnd.xfdl":"xfdl","application\/vnd.yamaha.hv-dic":"hvd","application\/vnd.yamaha.hv-script":"hvs","application\/vnd.yamaha.hv-voice":"hvp","application\/vnd.yamaha.openscoreformat":"osf","application\/vnd.yamaha.openscoreformat.osfpvg+xml":"osfpvg","application\/vnd.yamaha.smaf-audio":"saf","application\/vnd.yamaha.smaf-phrase":"spf","application\/vnd.yellowriver-custom-menu":"cmp","application\/vnd.zul":"zir","application\/vnd.zzazz.deck+xml":"zaz","application\/voicexml+xml":"vxml","application\/widget":"wgt","application\/winhlp":"hlp","application\/wsdl+xml":"wsdl","application\/wspolicy+xml":"wspolicy","application\/x-7z-compressed":"7z","application\/x-abiword":"abw","application\/x-ace-compressed":"ace","application\/x-apple-diskimage":"dmg","application\/x-authorware-bin":"aab","application\/x-authorware-map":"aam","application\/x-authorware-seg":"aas","application\/x-bcpio":"bcpio","application\/x-bittorrent":"torrent","application\/x-blorb":"blb","application\/x-bzip":"bz","application\/x-cbr":"cbr","application\/x-cdlink":"vcd","application\/x-cfs-compressed":"cfs","application\/x-chat":"chat","application\/x-chess-pgn":"pgn","application\/x-conference":"nsc","application\/x-cpio":"cpio","application\/x-csh":"csh","application\/x-debian-package":"deb","application\/x-dgc-compressed":"dgc","application\/x-director":"dir","application\/x-doom":"wad","application\/x-dtbncx+xml":"ncx","application\/x-dtbook+xml":"dtb","application\/x-dtbresource+xml":"res","application\/x-dvi":"dvi","application\/x-envoy":"evy","application\/x-eva":"eva","application\/x-font-bdf":"bdf","application\/x-font-ghostscript":"gsf","application\/x-font-linux-psf":"psf","application\/x-font-pcf":"pcf","application\/x-font-snf":"snf","application\/x-font-type1":"pfa","application\/x-freearc":"arc","application\/x-futuresplash":"spl","application\/x-gca-compressed":"gca","application\/x-glulx":"ulx","application\/x-gnumeric":"gnumeric","application\/x-gramps-xml":"gramps","application\/x-gtar":"gtar","application\/x-hdf":"hdf","application\/x-install-instructions":"install","application\/x-iso9660-image":"iso","application\/x-java-jnlp-file":"jnlp","application\/x-latex":"latex","application\/x-lzh-compressed":"lzh","application\/x-mie":"mie","application\/x-mobipocket-ebook":"prc","application\/x-ms-application":"application","application\/x-ms-shortcut":"lnk","application\/x-ms-wmd":"wmd","application\/x-ms-wmz":"wmz","application\/x-ms-xbap":"xbap","application\/x-msaccess":"mdb","application\/x-msbinder":"obd","application\/x-mscardfile":"crd","application\/x-msclip":"clp","application\/x-msdownload":"dll","application\/x-msmediaview":"mvb","application\/x-msmetafile":"wmf","application\/x-msmoney":"mny","application\/x-mspublisher":"pub","application\/x-msschedule":"scd","application\/x-msterminal":"trm","application\/x-mswrite":"wri","application\/x-netcdf":"nc","application\/x-nzb":"nzb","application\/x-pkcs12":"p12","application\/x-pkcs7-certificates":"p7b","application\/x-pkcs7-certreqresp":"p7r","application\/x-research-info-systems":"ris","application\/x-shar":"shar","application\/x-shockwave-flash":"swf","application\/x-silverlight-app":"xap","application\/x-sql":"sql","application\/x-stuffit":"sit","application\/x-stuffitx":"sitx","application\/x-subrip":"srt","application\/x-sv4cpio":"sv4cpio","application\/x-sv4crc":"sv4crc","application\/x-t3vm-image":"t3","application\/x-tads":"gam","application\/x-tar":"tar","application\/x-tcl":"tcl","application\/x-tex":"tex","application\/x-tex-tfm":"tfm","application\/x-texinfo":"texinfo","application\/x-tgif":"obj","application\/x-ustar":"ustar","application\/x-wais-source":"src","application\/x-x509-ca-cert":"der","application\/x-xfig":"fig","application\/x-xliff+xml":"xlf","application\/x-xpinstall":"xpi","application\/x-xz":"xz","application\/x-zmachine":"z1","application\/xaml+xml":"xaml","application\/xcap-diff+xml":"xdf","application\/xenc+xml":"xenc","application\/xhtml+xml":"xhtml","application\/xml":"xsl","application\/xml-dtd":"dtd","application\/xop+xml":"xop","application\/xproc+xml":"xpl","application\/xslt+xml":"xslt","application\/xspf+xml":"xspf","application\/xv+xml":"mxml","application\/yang":"yang","application\/yin+xml":"yin","application\/zip":"zip","audio\/adpcm":"adp","audio\/basic":"au","audio\/midi":"mid","audio\/mp4":"m4a","audio\/mpeg":"mpga","audio\/ogg":"oga","audio\/s3m":"s3m","audio\/silk":"sil","audio\/vnd.dece.audio":"uva","audio\/vnd.digital-winds":"eol","audio\/vnd.dra":"dra","audio\/vnd.dts":"dts","audio\/vnd.dts.hd":"dtshd","audio\/vnd.lucent.voice":"lvp","audio\/vnd.ms-playready.media.pya":"pya","audio\/vnd.nuera.ecelp4800":"ecelp4800","audio\/vnd.nuera.ecelp7470":"ecelp7470","audio\/vnd.nuera.ecelp9600":"ecelp9600","audio\/vnd.rip":"rip","audio\/webm":"weba","audio\/x-aac":"aac","audio\/x-aiff":"aif","audio\/x-caf":"caf","audio\/x-flac":"flac","audio\/x-matroska":"mka","audio\/x-mpegurl":"m3u","audio\/x-ms-wax":"wax","audio\/x-ms-wma":"wma","audio\/x-pn-realaudio":"ram","audio\/x-pn-realaudio-plugin":"rmp","audio\/xm":"xm","chemical\/x-cdx":"cdx","chemical\/x-cif":"cif","chemical\/x-cmdf":"cmdf","chemical\/x-cml":"cml","chemical\/x-csml":"csml","chemical\/x-xyz":"xyz","font\/collection":"ttc","font\/otf":"otf","font\/ttf":"ttf","font\/woff":"woff","font\/woff2":"woff2","image\/cgm":"cgm","image\/g3fax":"g3","image\/gif":"gif","image\/ief":"ief","image\/jpeg":"jpeg","image\/ktx":"ktx","image\/png":"png","image\/prs.btif":"btif","image\/sgi":"sgi","image\/svg+xml":"svg","image\/tiff":"tiff","image\/vnd.adobe.photoshop":"psd","image\/vnd.dece.graphic":"uvi","image\/vnd.djvu":"djvu","image\/vnd.dvb.subtitle":"sub","image\/vnd.dwg":"dwg","image\/vnd.dxf":"dxf","image\/vnd.fastbidsheet":"fbs","image\/vnd.fpx":"fpx","image\/vnd.fst":"fst","image\/vnd.fujixerox.edmics-mmr":"mmr","image\/vnd.fujixerox.edmics-rlc":"rlc","image\/vnd.ms-modi":"mdi","image\/vnd.ms-photo":"wdp","image\/vnd.net-fpx":"npx","image\/vnd.wap.wbmp":"wbmp","image\/vnd.xiff":"xif","image\/webp":"webp","image\/x-3ds":"3ds","image\/x-cmu-raster":"ras","image\/x-cmx":"cmx","image\/x-freehand":"fh","image\/x-icon":"ico","image\/x-mrsid-image":"sid","image\/x-pcx":"pcx","image\/x-pict":"pic","image\/x-portable-anymap":"pnm","image\/x-portable-bitmap":"pbm","image\/x-portable-graymap":"pgm","image\/x-portable-pixmap":"ppm","image\/x-rgb":"rgb","image\/x-xpixmap":"xpm","image\/x-xwindowdump":"xwd","message\/rfc822":"eml","model\/iges":"igs","model\/mesh":"msh","model\/vnd.collada+xml":"dae","model\/vnd.dwf":"dwf","model\/vnd.gdl":"gdl","model\/vnd.gtw":"gtw","model\/vnd.vtu":"vtu","model\/vrml":"wrl","model\/x3d+binary":"x3db","model\/x3d+vrml":"x3dv","model\/x3d+xml":"x3d","text\/cache-manifest":"appcache","text\/calendar":"ics","text\/css":"css","text\/csv":"csv","text\/html":"html","text\/n3":"n3","text\/plain":"txt","text\/prs.lines.tag":"dsc","text\/richtext":"rtx","text\/sgml":"sgml","text\/tab-separated-values":"tsv","text\/troff":"t","text\/turtle":"ttl","text\/uri-list":"uri","text\/vcard":"vcard","text\/vnd.curl":"curl","text\/vnd.curl.dcurl":"dcurl","text\/vnd.curl.mcurl":"mcurl","text\/vnd.curl.scurl":"scurl","text\/vnd.fly":"fly","text\/vnd.fmi.flexstor":"flx","text\/vnd.graphviz":"gv","text\/vnd.in3d.3dml":"3dml","text\/vnd.in3d.spot":"spot","text\/vnd.sun.j2me.app-descriptor":"jad","text\/vnd.wap.wml":"wml","text\/vnd.wap.wmlscript":"wmls","text\/x-asm":"s","text\/x-c":"cc","text\/x-fortran":"f","text\/x-java-source":"java","text\/x-nfo":"nfo","text\/x-opml":"opml","text\/x-pascal":"p","text\/x-setext":"etx","text\/x-sfv":"sfv","text\/x-uuencode":"uu","text\/x-vcalendar":"vcs","text\/x-vcard":"vcf","video\/3gpp":"3gp","video\/3gpp2":"3g2","video\/h261":"h261","video\/h263":"h263","video\/h264":"h264","video\/jpeg":"jpgv","video\/jpm":"jpm","video\/mj2":"mj2","video\/mp4":"mp4","video\/mpeg":"mpeg","video\/quicktime":"qt","video\/vnd.dece.hd":"uvh","video\/vnd.dece.mobile":"uvm","video\/vnd.dece.pd":"uvp","video\/vnd.dece.sd":"uvs","video\/vnd.dece.video":"uvv","video\/vnd.dvb.file":"dvb","video\/vnd.fvt":"fvt","video\/vnd.mpegurl":"mxu","video\/vnd.ms-playready.media.pyv":"pyv","video\/vnd.uvvu.mp4":"uvu","video\/vnd.vivo":"viv","video\/webm":"webm","video\/x-f4v":"f4v","video\/x-fli":"fli","video\/x-flv":"flv","video\/x-m4v":"m4v","video\/x-matroska":"mkv","video\/x-mng":"mng","video\/x-ms-asf":"asf","video\/x-ms-vob":"vob","video\/x-ms-wmx":"wmx","video\/x-ms-wvx":"wvx","video\/x-msvideo":"avi","video\/x-sgi-movie":"movie","video\/x-smv":"smv","x-conference\/x-cooltalk":"ice","text\/x-sql":"sql","image\/x-pixlr-data":"pxd","image\/x-adobe-dng":"dng","image\/x-sketch":"sketch","image\/x-xcf":"xcf","audio\/amr":"amr","application\/plt":"plt","application\/sat":"sat","application\/step":"step","text\/x-httpd-cgi":"cgi","text\/x-asap":"asp","text\/x-jsp":"jsp"};

/*
 * File: /js/elFinder.options.js
 */

/**
 * Default elFinder config
 *
 * @type  Object
 * @autor Dmitry (dio) Levashov
 */
elFinder.prototype._options = {
	/**
	 * URLs of 3rd party libraries CDN
	 * 
	 * @type Object
	 */
	cdns : {
		// for editor etc.
		ace        : 'https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.1',
		codemirror : 'https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.40.2',
		ckeditor   : 'https://cdnjs.cloudflare.com/ajax/libs/ckeditor/4.10.0',
		ckeditor5  : 'https://cdn.ckeditor.com/ckeditor5/11.1.1',
		tinymce    : 'https://cdnjs.cloudflare.com/ajax/libs/tinymce/4.8.3',
		simplemde  : 'https://cdnjs.cloudflare.com/ajax/libs/simplemde/1.11.2',
		fabric16   : 'https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.6.7',
		tui        : 'https://uicdn.toast.com',
		// for quicklook etc.
		hls        : 'https://cdnjs.cloudflare.com/ajax/libs/hls.js/0.10.1/hls.min.js',
		dash       : 'https://cdnjs.cloudflare.com/ajax/libs/dashjs/2.9.1/dash.all.min.js',
		flv        : 'https://cdnjs.cloudflare.com/ajax/libs/flv.js/1.4.2/flv.min.js',
		prettify   : 'https://cdn.jsdelivr.net/gh/google/code-prettify@453bd5f51e61245339b738b1bbdd42d7848722ba/loader/run_prettify.js',
		psd        : 'https://cdnjs.cloudflare.com/ajax/libs/psd.js/3.2.0/psd.min.js',
		rar        : 'https://cdn.jsdelivr.net/gh/nao-pon/rar.js@6cef13ec66dd67992fc7f3ea22f132d770ebaf8b/rar.min.js',
		zlibUnzip  : 'https://cdn.jsdelivr.net/gh/imaya/zlib.js@0.3.1/bin/unzip.min.js', // need check unzipFiles() in quicklook.plugins.js when update
		zlibGunzip : 'https://cdn.jsdelivr.net/gh/imaya/zlib.js@0.3.1/bin/gunzip.min.js',
		marked     : 'https://cdnjs.cloudflare.com/ajax/libs/marked/0.5.1/marked.min.js',
		sparkmd5   : 'https://cdnjs.cloudflare.com/ajax/libs/spark-md5/3.0.0/spark-md5.min.js',
		jssha      : 'https://cdnjs.cloudflare.com/ajax/libs/jsSHA/2.3.1/sha.js',
		amr        : 'https://cdn.jsdelivr.net/gh/yxl/opencore-amr-js@dcf3d2b5f384a1d9ded2a54e4c137a81747b222b/js/amrnb.js'
	},
	
	/**
	 * Connector url. Required!
	 *
	 * @type String
	 */
	url : '',

	/**
	 * Ajax request type.
	 *
	 * @type String
	 * @default "get"
	 */
	requestType : 'get',
	
	/**
	 * Use CORS to connector url
	 * 
	 * @type Boolean|null  true|false|null(Auto detect)
	 */
	cors : null,

	/**
	 * Maximum number of concurrent connections on request
	 * 
	 * @type Number
	 * @default 3
	 */
	requestMaxConn : 3,

	/**
	 * Transport to send request to backend.
	 * Required for future extensions using websockets/webdav etc.
	 * Must be an object with "send" method.
	 * transport.send must return jQuery.Deferred() object
	 *
	 * @type Object
	 * @default null
	 * @example
	 *  transport : {
	 *    init : function(elfinderInstance) { },
	 *    send : function(options) {
	 *      var dfrd = jQuery.Deferred();
	 *      // connect to backend ...
	 *      return dfrd;
	 *    },
	 *    upload : function(data) {
	 *      var dfrd = jQuery.Deferred();
	 *      // upload ...
	 *      return dfrd;
	 *    }
	 *    
	 *  }
	 **/
	transport : {},

	/**
	 * URL to upload file to.
	 * If not set - connector URL will be used
	 *
	 * @type String
	 * @default  ''
	 */
	urlUpload : '',

	/**
	 * Allow to drag and drop to upload files
	 *
	 * @type Boolean|String
	 * @default  'auto'
	 */
	dragUploadAllow : 'auto',
	
	/**
	 * Confirmation dialog displayed at the time of overwriting upload
	 * 
	 * @type Boolean
	 * @default true
	 */
	overwriteUploadConfirm : true,
	
	/**
	 * Max size of chunked data of file upload
	 * 
	 * @type Number
	 * @default  10485760(10MB)
	 */
	uploadMaxChunkSize : 10485760,
	
	/**
	 * Regular expression of file name to exclude when uploading folder
	 * 
	 * @type Object
	 * @default { win: /^(?:desktop\.ini|thumbs\.db)$/i, mac: /^\.ds_store$/i }
	 */
	folderUploadExclude : {
		win: /^(?:desktop\.ini|thumbs\.db)$/i,
		mac: /^\.ds_store$/i
	},
	
	/**
	 * Timeout for upload using iframe
	 *
	 * @type Number
	 * @default  0 - no timeout
	 */
	iframeTimeout : 0,
	
	/**
	 * Data to append to all requests and to upload files
	 *
	 * @type Object
	 * @default  {}
	 */
	customData : {},
	
	/**
	 * Event listeners to bind on elFinder init
	 *
	 * @type Object
	 * @default  {}
	 */
	handlers : {},

	/**
	 * Any custom headers to send across every ajax request
	 *
	 * @type Object
	 * @default {}
	 */
	customHeaders : {},

	/**
	 * Any custom xhrFields to send across every ajax request
	 *
	 * @type Object
	 * @default {}
	 */
	xhrFields : {},

	/**
	 * Interface language
	 *
	 * @type String
	 * @default "en"
	 */
	lang : 'en',

	/**
	 * Base URL of elfFinder library starting from Manager HTML
	 * Auto detect when empty value
	 * 
	 * @type String
	 * @default ""
	 */
	baseUrl : '',

	/**
	 * Base URL of i18n js files
	 * baseUrl + "js/i18n/" when empty value
	 * 
	 * @type String
	 * @default ""
	 */
	i18nBaseUrl : '',
	
	/**
	 * Auto load required CSS
	 * `false` to disable this function or
	 * CSS URL Array to load additional CSS files
	 * 
	 * @type Boolean|Array
	 * @default true
	 */
	cssAutoLoad : true,

	/**
	 * Theme to load
	 * {"themeid" : "Theme CSS URL"} or
	 * {"themeid" : "Theme manifesto.json URL"} or
	 * Theme manifesto.json Object
	 * {
	 *   "themeid" : {
	 *     "name":"Theme Name",
	 *     "cssurls":"Theme CSS URL",
	 *     "author":"Author Name",
	 *     "email":"Author Email",
	 *     "license":"License",
	 *     "link":"Web Site URL",
	 *     "image":"Screen Shot URL",
	 *     "description":"Description"
	 *   }
	 * }
	 * 
	 * @type Object
	 */
	themes : {},

	/**
	 * Theme id to initial theme
	 * 
	 * @type String|Null
	 */
	theme : null,

	/**
	 * Maximum value of error dialog open at the same time
	 * 
	 * @type Number
	 */
	maxErrorDialogs : 5,

	/**
	 * Additional css class for filemanager node.
	 *
	 * @type String
	 */
	cssClass : '',

	/**
	 * Active commands list. '*' means all of the commands that have been load.
	 * If some required commands will be missed here, elFinder will add its
	 *
	 * @type Array
	 */
	commands : ['*'],
	// Available commands list
	//commands : [
	//	'archive', 'back', 'chmod', 'colwidth', 'copy', 'cut', 'download', 'duplicate', 'edit', 'extract',
	//	'forward', 'fullscreen', 'getfile', 'help', 'home', 'info', 'mkdir', 'mkfile', 'netmount', 'netunmount',
	//	'open', 'opendir', 'paste', 'places', 'quicklook', 'reload', 'rename', 'resize', 'restore', 'rm',
	//	'search', 'sort', 'up', 'upload', 'view', 'zipdl'
	//],
	
	/**
	 * Commands options.
	 *
	 * @type Object
	 **/
	commandsOptions : {
		// // configure shortcuts of any command
		// // add `shortcuts` property into each command
		// any_command_name : {
		// 	shortcuts : [] // for disable this command's shortcuts
		// },
		// any_command_name : {
		// 	shortcuts : function(fm, shortcuts) {
		// 		// for add `CTRL + E` for this command action
		// 		shortcuts[0]['pattern'] += ' ctrl+e';
		// 		return shortcuts;
		// 	}
		// },
		// any_command_name : {
		// 	shortcuts : function(fm, shortcuts) {
		// 		// for full customize of this command's shortcuts
		// 		return [ { pattern: 'ctrl+e ctrl+down numpad_enter' + (fm.OS != 'mac' && ' enter') } ];
		// 	}
		// },
		// "getfile" command options.
		getfile : {
			onlyURL  : false,
			// allow to return multiple files info
			multiple : false,
			// allow to return filers info
			folders  : false,
			// action after callback (""/"close"/"destroy")
			oncomplete : '',
			// action when callback is fail (""/"close"/"destroy")
			onerror : '',
			// get path before callback call
			getPath    : true, 
			// get image sizes before callback call
			getImgSize : false
		},
		open : {
			// HTTP method that request to the connector when item URL is not valid URL.
			// If you set to "get" will be displayed request parameter in the browser's location field
			// so if you want to conceal its parameters should be given "post".
			// Nevertheless, please specify "get" if you want to enable the partial request by HTTP Range header.
			method : 'post',
			// Where to open into : 'window'(default), 'tab' or 'tabs'
			// 'tabs' opens in each tabs
			into   : 'window',
			// Default command list of action when select file
			// String value that is 'Command Name' or 'Command Name1/CommandName2...'
			selectAction : 'open'
		},
		opennew : {
			// URL of to open elFinder manager
			// Default '' : Origin URL
			url : '',
			// Use search query of origin URL
			useOriginQuery : true
		},
		// "upload" command options.
		upload : {
			// Open elFinder upload dialog: 'button' OR Open system OS upload dialog: 'uploadbutton'
			ui : 'button'
		},
		// "download" command options.
		download : {
			// max request to download files when zipdl disabled
			maxRequests : 10,
			// minimum count of files to use zipdl
			minFilesZipdl : 2
		},
		// "quicklook" command options.
		quicklook : {
			autoplay : true,
			width    : 450,
			height   : 300,
			// ControlsList of HTML5 audio/video preview
			// see https://googlechrome.github.io/samples/media/controlslist.html
			mediaControlsList : '', // e.g. 'nodownload nofullscreen noremoteplayback'
			// Show toolbar of PDF preview (with <embed> tag)
			pdfToolbar : true,
			// Maximum characters length to preview
			textMaxlen : 2000,
			// quicklook window must be contained in elFinder node on window open (true|false)
			contain : false,
			// preview window into NavDock (0 : undocked | 1 : docked(show) | 2 : docked(hide))
			docked   : 0,
			// Docked preview height ('auto' or Number of pixel) 'auto' is setted to the Navbar width
			dockHeight : 'auto',
			// media auto play when docked
			dockAutoplay : false,
			// Google Maps API key (Require Maps JavaScript API)
			googleMapsApiKey : '',
			// Google Maps API Options
			googleMapsOpts : {
				maps : {},
				kml : {
					suppressInfoWindows : false,
					preserveViewport : false
				}
			},
			// ViewerJS (https://viewerjs.org/) Options
			// To enable this you need to place ViewerJS on the same server as elFinder and specify that URL in `url`.
			viewerjs : {
				url: '', // Example '/ViewerJS/index.html'
				mimes: ['application/pdf', 'application/vnd.oasis.opendocument.text', 'application/vnd.oasis.opendocument.spreadsheet', 'application/vnd.oasis.opendocument.presentation']
			},
			// MIME types to CAD-Files and 3D-Models online viewer on sharecad.org
			// Example ['image/vnd.dwg', 'image/vnd.dxf', 'model/vnd.dwf', 'application/vnd.hp-hpgl', 'application/plt', 'application/step', 'model/iges', 'application/vnd.ms-pki.stl', 'application/sat', 'image/cgm', 'application/x-msmetafile']
			sharecadMimes : [],
			// MIME types to use Google Docs online viewer
			// Example ['application/pdf', 'image/tiff', 'application/vnd.ms-office', 'application/msword', 'application/vnd.ms-word', 'application/vnd.ms-excel', 'application/vnd.ms-powerpoint', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'application/postscript', 'application/rtf']
			googleDocsMimes : [],
			// MIME types to use Microsoft Office Online viewer
			// Example ['application/msword', 'application/vnd.ms-word', 'application/vnd.ms-excel', 'application/vnd.ms-powerpoint', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'application/vnd.oasis.opendocument.text', 'application/vnd.oasis.opendocument.spreadsheet', 'application/vnd.oasis.opendocument.presentation']
			// These MIME types override "googleDocsMimes"
			officeOnlineMimes : [],
			// File size (byte) threshold when using the dim command for obtain the image size necessary to image preview
			getDimThreshold : 200000,
			// MIME-Type regular expression that does not check empty files
			mimeRegexNotEmptyCheck : /^application\/vnd\.google-apps\./
		},
		// "quicklook" command options.
		edit : {
			// dialog width, integer(px) or integer+'%' (example: 650, '80%' ...)
			dialogWidth : void(0),
			// list of allowed mimetypes to edit of text files
			// if empty - any text files can be edited
			mimes : [],
			// MIME-types of text file to make as empty files
			makeTextMimes : ['text/plain', 'text/css', 'text/html'],
			// Use the editor stored in the browser
			// This value allowd overwrite with user preferences
			useStoredEditor : false,
			// Open the maximized editor window
			// This value allowd overwrite with user preferences
			editorMaximized : false,
			// edit files in wysisyg's
			editors : [
				// {
				// 	/**
				// 	 * editor info
				// 	 * @type  Object
				// 	 */
				// 	info : { name: 'Editor Name' },
				// 	/**
				// 	 * files mimetypes allowed to edit in current wysisyg
				// 	 * @type  Array
				// 	 */
				// 	mimes : ['text/html'], 
				// 	/**
				// 	 * HTML element for editing area (optional for text editor)
				// 	 * @type  String
				// 	 */
				// 	html : '<textarea></textarea>', 
				// 	/**
				// 	 * Initialize editing area node (optional for text editor)
				// 	 * 
				// 	 * @param  String  dialog DOM id
				// 	 * @param  Object  target file object
				// 	 * @param  String  target file content (text or Data URI Scheme(binary file))
				// 	 * @param  Object  elFinder instance
				// 	 * @type  Function
				// 	 */
				// 	init : function(id, file, content, fm) {
				// 		jQuery(this).attr('id', id + '-text').val(content);
				// 	},
				// 	/**
				// 	 * Get edited contents (optional for text editor)
				// 	 * @type  Function
				// 	 */
				// 	getContent : function() {
				// 		return jQuery(this).val();
				// 	},
				// 	/**
				// 	 * Called when "edit" dialog loaded.
				// 	 * Place to init wysisyg.
				// 	 * Can return wysisyg instance
				// 	 *
				// 	 * @param  DOMElement  textarea node
				// 	 * @return Object      editor instance|jQuery.Deferred(return instance on resolve())
				// 	 */
				// 	load : function(textarea) { },
				// 	/**
				// 	 * Called before "edit" dialog closed.
				// 	 * Place to destroy wysisyg instance.
				// 	 *
				// 	 * @param  DOMElement  textarea node
				// 	 * @param  Object      wysisyg instance (if was returned by "load" callback)
				// 	 * @return void
				// 	 */
				// 	close : function(textarea, instance) { },
				// 	/**
				// 	 * Called before file content send to backend.
				// 	 * Place to update textarea content if needed.
				// 	 *
				// 	 * @param  DOMElement  textarea node
				// 	 * @param  Object      wysisyg instance (if was returned by "load" callback)
				// 	 * @return void
				// 	 */
				// 	save : function(textarea, instance) {},
				// 	/**
				// 	 * Called after load() or save().
				// 	 * Set focus to wysisyg editor.
				// 	 *
				// 	 * @param  DOMElement  textarea node
				// 	 * @param  Object      wysisyg instance (if was returned by "load" callback)
				// 	 * @return void
				// 	 */
				// 	focus : function(textarea, instance) {}
				// 	/**
				// 	 * Called after dialog resized..
				// 	 *
				// 	 * @param  DOMElement  textarea node
				// 	 * @param  Object      wysisyg instance (if was returned by "load" callback)
				// 	 * @param  Object      resize event object
				// 	 * @param  Object      data object
				// 	 * @return void
				// 	 */
				// 	resize : function(textarea, instance, event, data) {}
				// 
				// }
			],
			// Character encodings of select box
			encodings : ['Big5', 'Big5-HKSCS', 'Cp437', 'Cp737', 'Cp775', 'Cp850', 'Cp852', 'Cp855', 'Cp857', 'Cp858', 
				'Cp862', 'Cp866', 'Cp874', 'EUC-CN', 'EUC-JP', 'EUC-KR', 'GB18030', 'ISO-2022-CN', 'ISO-2022-JP', 'ISO-2022-KR', 
				'ISO-8859-1', 'ISO-8859-2', 'ISO-8859-3', 'ISO-8859-4', 'ISO-8859-5', 'ISO-8859-6', 'ISO-8859-7', 
				'ISO-8859-8', 'ISO-8859-9', 'ISO-8859-13', 'ISO-8859-15', 'KOI8-R', 'KOI8-U', 'Shift-JIS', 
				'Windows-1250', 'Windows-1251', 'Windows-1252', 'Windows-1253', 'Windows-1254', 'Windows-1257'],
			// options for extra editors
			extraOptions : {
				// TUI Image Editor's options
				tuiImgEditOpts : {
					// Path prefix of icon-a.svg, icon-b.svg, icon-c.svg and icon-d.svg in the Theme. 
					// `iconsPath` MUST follow the same origin policy.
					iconsPath : void(0), // default is "./img/tui-"
					// Theme object
					theme : {}
				},
				// Pixo image editor constructor options - https://pixoeditor.com/
				// Require 'apikey' to enable it
				pixo: {
					apikey: ''
				},
				// Specify the Creative Cloud API key when using Creative SDK image editor of Creative Cloud.
				// You can get the API key at https://console.adobe.io/.
				creativeCloudApiKey : '',
				// Browsing manager URL for CKEditor, TinyMCE
				// Uses self location with the empty value or not defined.
				//managerUrl : 'elfinder.html'
				managerUrl : null,
				// CKEditor5' builds mode - 'classic', 'inline' or 'balloon' 
				ckeditor5Mode : 'balloon',
				// Setting for Online-Convert.com
				onlineConvert : {
					maxSize  : 100, // (MB) Max 100MB on free account
					showLink : true // It must be enabled with free account
				}
			}
		},
		search : {
			// Incremental search from the current view
			incsearch : {
				enable : true, // is enable true or false
				minlen : 1,    // minimum number of characters
				wait   : 500   // wait milliseconds
			},
			// Additional search types
			searchTypes : {
				// "SearchMime" is implemented in default
				SearchMime : {           // The key is search type that send to the connector
					name : 'btnMime',    // Button text to be processed in i18n()
					title : 'searchMime' // Button title to be processed in i18n()
				}
			}
		},
		// "info" command options.
		info : {
			// If the URL of the Directory is null,
			// it is assumed that the link destination is a URL to open the folder in elFinder
			nullUrlDirLinkSelf : true,
			// Information items to be hidden by default
			// These name are 'size', 'aliasfor', 'path', 'link', 'dim', 'modify', 'perms', 'locked', 'owner', 'group', 'perm' and your custom info items label
			hideItems : [],
			// Maximum file size (byte) to get file contents hash (md5, sha256 ...)
			showHashMaxsize : 104857600, // 100 MB
			// Array of hash algorisms to show on info dialog
			// These name are 'md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512', 'sha3-224', 'sha3-256', 'sha3-384', 'sha3-512', 'shake128' and 'shake256'
			showHashAlgorisms : ['md5', 'sha256'],
			custom : {
				// /**
				//  * Example of custom info `desc`
				//  */
				// desc : {
				// 	/**
				// 	 * Lable (require)
				// 	 * It is filtered by the `fm.i18n()`
				// 	 * 
				// 	 * @type String
				// 	 */
				// 	label : 'Description',
				// 	
				// 	/**
				// 	 * Template (require)
				// 	 * `{id}` is replaced in dialog.id
				// 	 * 
				// 	 * @type String
				// 	 */
				// 	tpl : '<div class="elfinder-info-desc"><span class="elfinder-spinner"></span></div>',
				// 	
				// 	/**
				// 	 * Restricts to mimetypes (optional)
				// 	 * Exact match or category match
				// 	 * 
				// 	 * @type Array
				// 	 */
				// 	mimes : ['text', 'image/jpeg', 'directory'],
				// 	
				// 	/**
				// 	 * Restricts to file.hash (optional)
				// 	 * 
				// 	 * @ type Regex
				// 	 */
				// 	hashRegex : /^l\d+_/,
				// 
				// 	/**
				// 	 * Request that asks for the description and sets the field (optional)
				// 	 * 
				// 	 * @type Function
				// 	 */
				// 	action : function(file, fm, dialog) {
				// 		fm.request({
				// 		data : { cmd : 'desc', target: file.hash },
				// 			preventDefault: true,
				// 		})
				// 		.fail(function() {
				// 			dialog.find('div.elfinder-info-desc').html(fm.i18n('unknown'));
				// 		})
				// 		.done(function(data) {
				// 			dialog.find('div.elfinder-info-desc').html(data.desc);
				// 		});
				// 	}
				// }
			}
		},
		mkdir: {
			// Enable automatic switching function ["New Folder" / "Into New Folder"] of toolbar buttton
			intoNewFolderToolbtn: false
		},
		resize: {
			// defalt status of snap to 8px grid of the jpeg image ("enable" or "disable")
			grid8px : 'disable',
			// Preset size array [width, height]
			presetSize : [[320, 240], [400, 400], [640, 480], [800,600]],
			// File size (bytes) threshold when using the `dim` command for obtain the image size necessary to start editing
			getDimThreshold : 204800,
			// File size (bytes) to request to get substitute image (400px) with the `dim` command
			dimSubImgSize : 307200
		},
		rm: {
			// If trash is valid, items moves immediately to the trash holder without confirm.
			quickTrash : true,
			// Maximum wait seconds when checking the number of items to into the trash
			infoCheckWait : 10,
			// Maximum number of items that can be placed into the Trash at one time
			toTrashMaxItems : 1000
		},
		help : {
			// Tabs to show
			view : ['about', 'shortcuts', 'help', 'integrations', 'debug'],
			// HTML source URL of the heip tab
			helpSource : ''
		},
		preference : {
			// dialog width
			width: 600,
			// dialog height
			height: 400,
			// tabs setting see preference.js : build()
			categories: null,
			// preference setting see preference.js : build()
			prefs: null,
			// language setting  see preference.js : build()
			langs: null,
			// Command list of action when select file
			// Array value are 'Command Name' or 'Command Name1/CommandName2...'
			selectActions : ['open', 'edit/download', 'resize/edit/download', 'download', 'quicklook']
		}
	},
	
	/**
	 * Callback for prepare boot up
	 * 
	 * - The this object in the function is an elFinder node
	 * - The first parameter is elFinder Instance
	 * - The second parameter is an object of other parameters
	 *   For now it can use `dfrdsBeforeBootup` Array
	 * 
	 * @type Function
	 * @default null
	 * @return void
	 */
	bootCallback : null,
	
	/**
	 * Callback for "getfile" commands.
	 * Required to use elFinder with WYSIWYG editors etc..
	 *
	 * @type Function
	 * @default null (command not active)
	 */
	getFileCallback : null,
	
	/**
	 * Default directory view. icons/list
	 *
	 * @type String
	 * @default "icons"
	 */
	defaultView : 'icons',
	
	/**
	 * Hash of default directory path to open
	 * 
	 * NOTE: This setting will be disabled if the target folder is specified in location.hash.
	 * 
	 * If you want to find the hash in Javascript
	 * can be obtained with the following code. (In the case of a standard hashing method)
	 * 
	 * var volumeId = 'l1_'; // volume id
	 * var path = 'path/to/target'; // without root path
	 * //var path = 'path\\to\\target'; // use \ on windows server
	 * var hash = volumeId + btoa(path).replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '.').replace(/\.+$/, '');
	 * 
	 * @type String
	 * @default ""
	 */
	startPathHash : '',

	/**
	 * Emit a sound when a file is deleted
	 * Sounds are in sounds/ folder
	 * 
	 * @type Boolean
	 * @default true
	 */
	sound : true,
	
	/**
	 * UI plugins to load.
	 * Current dir ui and dialogs loads always.
	 * Here set not required plugins as folders tree/toolbar/statusbar etc.
	 *
	 * @type Array
	 * @default ['toolbar', 'tree', 'path', 'stat']
	 * @full ['toolbar', 'places', 'tree', 'path', 'stat']
	 */
	ui : ['toolbar', 'tree', 'path', 'stat'],
	
	/**
	 * Some UI plugins options.
	 * @type Object
	 */
	uiOptions : {
		// toolbar configuration
		toolbar : [
			['home', 'back', 'forward', 'up', 'reload'],
			['netmount'],
			['mkdir', 'mkfile', 'upload'],
			['open', 'download', 'getfile'],
			['undo', 'redo'],
			['copy', 'cut', 'paste', 'rm', 'empty', 'hide'],
			['duplicate', 'rename', 'edit', 'resize', 'chmod'],
			['selectall', 'selectnone', 'selectinvert'],
			['quicklook', 'info'],
			['extract', 'archive'],
			['search'],
			['view', 'sort'],
			['help'],
			['fullscreen']
		],
		// toolbar extra options
		toolbarExtra : {
			// also displays the text label on the button (true / false / 'none')
			displayTextLabel: false,
			// Exclude `displayTextLabel` setting UA type
			labelExcludeUA: ['Mobile'],
			// auto hide on initial open
			autoHideUA: ['Mobile'],
			// Initial setting value of hide button in toolbar setting
			defaultHides: ['home', 'reload'],
			// show Preference button ('none', 'auto', 'always')
			// If you do not include 'preference' in the context menu you should specify 'auto' or 'always'
			showPreferenceButton: 'none',
			// show Preference button into contextmenu of the toolbar (true / false)
			preferenceInContextmenu: true
		},
		// directories tree options
		tree : {
			// expand current root on init
			openRootOnLoad : true,
			// expand current work directory on open
			openCwdOnOpen  : true,
			// auto loading current directory parents and do expand their node.
			syncTree : true,
			// Maximum number of display of each child trees
			// The tree of directories with children exceeding this number will be split
			subTreeMax : 100,
			// Numbar of max connctions of subdirs request
			subdirsMaxConn : 2,
			// Number of max simultaneous processing directory of subdirs
			subdirsAtOnce : 5,
			// Durations of each animations
			durations : {
				slideUpDown : 'fast',
				autoScroll : 'fast'
			}
			// ,
			// /**
			//  * Add CSS class name to navbar directories (optional)
			//  * see: https://github.com/Studio-42/elFinder/pull/1061,
			//  *      https://github.com/Studio-42/elFinder/issues/1231
			//  * 
			//  * @type Function
			//  */
			// getClass: function(dir) {
			// 	// e.g. This adds the directory's name (lowercase) with prefix as a CSS class
			// 	return 'elfinder-tree-' + dir.name.replace(/[ "]/g, '').toLowerCase();
			// }
		},
		// navbar options
		navbar : {
			minWidth : 150,
			maxWidth : 500,
			// auto hide on initial open
			autoHideUA: [] // e.g. ['Mobile']
		},
		navdock : {
			// disabled navdock ui
			disabled : false,
			// percentage of initial maximum height to work zone
			initMaxHeight : '50%',
			// percentage of maximum height to work zone by user resize action
			maxHeight : '90%'
		},
		cwd : {
			// display parent folder with ".." name :)
			oldSchool : false,
			
			// fm.UA types array to show item select checkboxes e.g. ['All'] or ['Mobile'] etc. default: ['Touch']
			showSelectCheckboxUA : ['Touch'],
			
			// file info columns displayed
			listView : {
				// name is always displayed, cols are ordered
				// e.g. ['perm', 'date', 'size', 'kind', 'owner', 'group', 'mode']
				// mode: 'mode'(by `fileModeStyle` setting), 'modestr'(rwxr-xr-x) , 'modeoct'(755), 'modeboth'(rwxr-xr-x (755))
				// 'owner', 'group' and 'mode', It's necessary set volume driver option "statOwner" to `true`
				// for custom, characters that can be used in the name is `a-z0-9_`
				columns : ['perm', 'date', 'size', 'kind'],
				// override this if you want custom columns name
				// example
				// columnsCustomName : {
				//		date : 'Last modification',
				// 		kind : 'Mime type'
				// }
				columnsCustomName : {},
				// fixed list header colmun
				fixedHeader : true
			},

			// icons view setting
			iconsView : {
				// default icon size (0-3 in default CSS (cwd.css - elfinder-cwd-size[number]))
				size: 0,
				// number of maximum size (3 in default CSS (cwd.css - elfinder-cwd-size[number]))
				// uses in preference.js
				sizeMax: 3,
				// Name of each size
				sizeNames: {
					0: 'viewSmall',
					1: 'viewMedium',
					2: 'viewLarge',
					3: 'viewExtraLarge' 
				}
			},

			// /**
			//  * Add CSS class name to cwd directories (optional)
			//  * see: https://github.com/Studio-42/elFinder/pull/1061,
			//  *      https://github.com/Studio-42/elFinder/issues/1231
			//  * 
			//  * @type Function
			//  */
			// ,
			// getClass: function(file) {
			// 	// e.g. This adds the directory's name (lowercase) with prefix as a CSS class
			// 	return 'elfinder-cwd-' + file.name.replace(/[ "]/g, '').toLowerCase();
			//}
			
			//,
			//// Template placeholders replacement rules for overwrite. see ui/cwd.js replacement
			//replacement : {
			//	tooltip : function(f, fm) {
			//		var list = fm.viewType == 'list', // current view type
			//			query = fm.searchStatus.state == 2, // is in search results
			//			title = fm.formatDate(f) + (f.size > 0 ? ' ('+fm.formatSize(f.size)+')' : ''),
			//			info  = '';
			//		if (query && f.path) {
			//			info = fm.escape(f.path.replace(/\/[^\/]*$/, ''));
			//		} else {
			//			info = f.tooltip? fm.escape(f.tooltip).replace(/\r/g, '&#13;') : '';
			//		}
			//		if (list) {
			//			info += (info? '&#13;' : '') + fm.escape(f.name);
			//		}
			//		return info? info + '&#13;' + title : title;
			//	}
			//}
		},
		path : {
			// Move to head of work zone without UI navbar
			toWorkzoneWithoutNavbar : true
		},
		dialog : {
			// Enable to auto focusing on mouse over in the target form element
			focusOnMouseOver : true
		},
		toast : {
			animate : {
				// to show
				showMethod: 'fadeIn', // fadeIn, slideDown, and show are built into jQuery
				showDuration: 300,    // milliseconds
				showEasing: 'swing',  // swing and linear are built into jQuery
				// timeout to hide
				timeOut: 3000,
				// to hide
				hideMethod: 'fadeOut',
				hideDuration: 1500,
				hideEasing: 'swing'
			}
		}
	},

	/**
	 * MIME regex of send HTTP header "Content-Disposition: inline" or allow preview in quicklook
	 * This option will overwrite by connector configuration
	 * 
	 * @type String
	 * @default '^(?:(?:image|video|audio)|text/plain|application/pdf$)'
	 * @example
	 *  dispInlineRegex : '.',  // is allow inline of all of MIME types
	 *  dispInlineRegex : '$^', // is not allow inline of all of MIME types
	 */
	dispInlineRegex : '^(?:(?:image|video|audio)|application/(?:x-mpegURL|dash\+xml)|(?:text/plain|application/pdf)$)',

	/**
	 * Display only required files by types
	 *
	 * @type Array
	 * @default []
	 * @example
	 *  onlyMimes : ["image"] - display all images
	 *  onlyMimes : ["image/png", "application/x-shockwave-flash"] - display png and flash
	 */
	onlyMimes : [],

	/**
	 * Custom files sort rules.
	 * All default rules (name/size/kind/date/perm/mode/owner/group) set in elFinder._sortRules
	 *
	 * @type {Object}
	 * @example
	 * sortRules : {
	 *   name : function(file1, file2) { return file1.name.toLowerCase().localeCompare(file2.name.toLowerCase()); }
	 * }
	 */
	sortRules : {},

	/**
	 * Default sort type.
	 *
	 * @type {String}
	 */
	sortType : 'name',
	
	/**
	 * Default sort order.
	 *
	 * @type {String}
	 * @default "asc"
	 */
	sortOrder : 'asc',
	
	/**
	 * Display folders first?
	 *
	 * @type {Boolean}
	 * @default true
	 */
	sortStickFolders : true,
	
	/**
	 * Sort also applies to the treeview (null: disable this feature)
	 *
	 * @type Boolean|null
	 * @default false
	 */
	sortAlsoTreeview : false,
	
	/**
	 * If true - elFinder will formating dates itself, 
	 * otherwise - backend date will be used.
	 *
	 * @type Boolean
	 */
	clientFormatDate : true,
	
	/**
	 * Show UTC dates.
	 * Required set clientFormatDate to true
	 *
	 * @type Boolean
	 */
	UTCDate : false,
	
	/**
	 * File modification datetime format.
	 * Value from selected language data  is used by default.
	 * Set format here to overwrite it.
	 *
	 * @type String
	 * @default  ""
	 */
	dateFormat : '',
	
	/**
	 * File modification datetime format in form "Yesterday 12:23:01".
	 * Value from selected language data is used by default.
	 * Set format here to overwrite it.
	 * Use $1 for "Today"/"Yesterday" placeholder
	 *
	 * @type String
	 * @default  ""
	 * @example "$1 H:m:i"
	 */
	fancyDateFormat : '',
	
	/**
	 * Style of file mode at cwd-list, info dialog
	 * 'string' (ex. rwxr-xr-x) or 'octal' (ex. 755) or 'both' (ex. rwxr-xr-x (755))
	 * 
	 * @type {String}
	 * @default 'both'
	 */
	fileModeStyle : 'both',
	
	/**
	 * elFinder width
	 *
	 * @type String|Number
	 * @default  "auto"
	 */
	width : 'auto',
	
	/**
	 * elFinder node height
	 * Number: pixcel or String: Number + "%"
	 *
	 * @type Number | String
	 * @default  400
	 */
	height : 400,
	
	/**
	 * Base node object or selector
	 * Element which is the reference of the height percentage
	 *
	 * @type Object|String
	 * @default null | jQuery(window) (if height is percentage)
	 **/
	heightBase : null,
	
	/**
	 * Make elFinder resizable if jquery ui resizable available
	 *
	 * @type Boolean
	 * @default  true
	 */
	resizable : true,
	
	/**
	 * Timeout before open notifications dialogs
	 *
	 * @type Number
	 * @default  500 (.5 sec)
	 */
	notifyDelay : 500,
	
	/**
	 * Position CSS, Width of notifications dialogs
	 *
	 * @type Object
	 * @default {position: {}, width : null} - Apply CSS definition
	 * position: CSS object | null (null: position center & middle)
	 */
	notifyDialog : {position: {}, width : null},
	
	/**
	 * Dialog contained in the elFinder node
	 * 
	 * @type Boolean
	 * @default false
	 */
	dialogContained : false,
	
	/**
	 * Allow shortcuts
	 *
	 * @type Boolean
	 * @default  true
	 */
	allowShortcuts : true,
	
	/**
	 * Remeber last opened dir to open it after reload or in next session
	 *
	 * @type Boolean
	 * @default  true
	 */
	rememberLastDir : true,
	
	/**
	 * Clear historys(elFinder) on reload(not browser) function
	 * Historys was cleared on Reload function on elFinder 2.0 (value is true)
	 * 
	 * @type Boolean
	 * @default  false
	 */
	reloadClearHistory : false,
	
	/**
	 * Use browser native history with supported browsers
	 *
	 * @type Boolean
	 * @default  true
	 */
	useBrowserHistory : true,
	
	/**
	 * Lazy load config.
	 * How many files display at once?
	 *
	 * @type Number
	 * @default  50
	 */
	showFiles : 50,
	
	/**
	 * Lazy load config.
	 * Distance in px to cwd bottom edge to start display files
	 *
	 * @type Number
	 * @default  50
	 */
	showThreshold : 50,
	
	/**
	 * Additional rule to valid new file name.
	 * By default not allowed empty names or '..'
	 * This setting does not have a sense of security.
	 *
	 * @type false|RegExp|function
	 * @default  false
	 * @example
	 *  disable names with spaces:
	 *  validName : /^[^\s]+$/,
	 */
	validName : false,
	
	/**
	 * Additional rule to filtering for browsing.
	 * This setting does not have a sense of security.
	 * 
	 * The object `this` is elFinder instance object in this function
	 *
	 * @type false|RegExp|function
	 * @default  false
	 * @example
	 *  show only png and jpg files:
	 *  fileFilter : /.*\.(png|jpg)$/i,
	 *  
	 *  show only image type files:
	 *  fileFilter : function(file) { return file.mime && file.mime.match(/^image\//i); },
	 */
	fileFilter : false,
	
	/**
	 * Backup name suffix.
	 *
	 * @type String
	 * @default  "~"
	 */
	backupSuffix : '~',
	
	/**
	 * Sync content interval
	 *
	 * @type Number
	 * @default  0 (do not sync)
	 */
	sync : 0,
	
	/**
	 * Sync start on load if sync value >= 1000
	 *
	 * @type     Bool
	 * @default  true
	 */
	syncStart : true,
	
	/**
	 * How many thumbnails create in one request
	 *
	 * @type Number
	 * @default  5
	 */
	loadTmbs : 5,
	
	/**
	 * Cookie option for browsersdoes not suppot localStorage
	 *
	 * @type Object
	 */
	cookie         : {
		expires : 30,
		domain  : '',
		path    : '/',
		secure  : false
	},
	
	/**
	 * Contextmenu config
	 *
	 * @type Object
	 */
	contextmenu : {
		// navbarfolder menu
		navbar : ['open', 'opennew', 'download', '|', 'upload', 'mkdir', '|', 'copy', 'cut', 'paste', 'duplicate', '|', 'rm', 'empty', 'hide', '|', 'rename', '|', 'archive', '|', 'places', 'info', 'chmod', 'netunmount'],
		// current directory menu
		cwd    : ['undo', 'redo', '|', 'back', 'up', 'reload', '|', 'upload', 'mkdir', 'mkfile', 'paste', '|', 'empty', 'hide', '|', 'view', 'sort', 'selectall', 'colwidth', '|', 'places', 'info', 'chmod', 'netunmount', '|', 'fullscreen'],
		// current directory file menu
		files  : ['getfile', '|' ,'open', 'opennew', 'download', 'opendir', 'quicklook', '|', 'upload', 'mkdir', '|', 'copy', 'cut', 'paste', 'duplicate', '|', 'rm', 'empty', 'hide', '|', 'rename', 'edit', 'resize', '|', 'archive', 'extract', '|', 'selectall', 'selectinvert', '|', 'places', 'info', 'chmod', 'netunmount']
	},

	/**
	 * elFinder node enable always
	 * This value will set to `true` if <body> has elFinder node only
	 * 
	 * @type     Bool
	 * @default  false
	 */
	enableAlways : false,
	
	/**
	 * elFinder node enable by mouse over
	 * 
	 * @type     Bool
	 * @default  true
	 */
	enableByMouseOver : true,

	/**
	 * Show window close confirm dialog
	 * Value is which state to show
	 * 'hasNotifyDialog', 'editingFile', 'hasSelectedItem' and 'hasClipboardData'
	 * 
	 * @type     Array
	 * @default  ['hasNotifyDialog', 'editingFile']
	 */
	windowCloseConfirm : ['hasNotifyDialog', 'editingFile'],

	/**
	 * Function decoding 'raw' string converted to unicode
	 * It is used instead of fm.decodeRawString(str)
	 * 
	 * @type Null|Function
	 */
	rawStringDecoder : typeof Encoding === 'object' && jQuery.isFunction(Encoding.convert)? function(str) {
		return Encoding.convert(str, {
			to: 'UNICODE',
			type: 'string'
		});
	} : null,

	/**
	 * Debug config
	 *
	 * @type Array|String('auto')|Boolean(true|false)
	 */
	// debug : true
	debug : ['error', 'warning', 'event-destroy']
};


/*
 * File: /js/elFinder.options.netmount.js
 */

/**
 * Default elFinder config of commandsOptions.netmount
 *
 * @type  Object
 */

elFinder.prototype._options.commandsOptions.netmount = {
	ftp: {
		name : 'FTP',
		inputs: {
			host     : jQuery('<input type="text"/>'),
			port     : jQuery('<input type="number" placeholder="21" class="elfinder-input-optional"/>'),
			path     : jQuery('<input type="text" value="/"/>'),
			user     : jQuery('<input type="text"/>'),
			pass     : jQuery('<input type="password" autocomplete="new-password"/>'),
			FTPS     : jQuery('<input type="checkbox" value="1" title="File Transfer Protocol over SSL/TLS"/>'),
			encoding : jQuery('<input type="text" placeholder="Optional" class="elfinder-input-optional"/>'),
			locale   : jQuery('<input type="text" placeholder="Optional" class="elfinder-input-optional"/>')
		}
	},
	dropbox2: elFinder.prototype.makeNetmountOptionOauth('dropbox2', 'Dropbox', 'Dropbox', {noOffline : true,
		root : '/',
		pathI18n : 'path',
		integrate : {
			title: 'Dropbox.com',
			link: 'https://www.dropbox.com'
		}
	}),
	googledrive: elFinder.prototype.makeNetmountOptionOauth('googledrive', 'Google Drive', 'Google', {
		integrate : {
			title: 'Google Drive',
			link: 'https://www.google.com/drive/'
		}
	}),
	onedrive: elFinder.prototype.makeNetmountOptionOauth('onedrive', 'One Drive', 'OneDrive', {
		integrate : {
			title: 'Microsoft OneDrive',
			link: 'https://onedrive.live.com'
		}
	}),
	box: elFinder.prototype.makeNetmountOptionOauth('box', 'Box', 'Box', {
		noOffline : true,
		integrate : {
			title: 'Box.com',
			link: 'https://www.box.com'
		}
	})
};


/*
 * File: /js/elFinder.history.js
 */

/**
 * @class elFinder.history
 * Store visited folders
 * and provide "back" and "forward" methods
 *
 * @author Dmitry (dio) Levashov
 */
elFinder.prototype.history = function(fm) {
		var self = this,
		/**
		 * Update history on "open" event?
		 *
		 * @type Boolean
		 */
		update = true,
		/**
		 * Directories hashes storage
		 *
		 * @type Array
		 */
		history = [],
		/**
		 * Current directory index in history
		 *
		 * @type Number
		 */
		current,
		/**
		 * Clear history
		 *
		 * @return void
		 */
		reset = function() {
			history = [fm.cwd().hash];
			current = 0;
			update  = true;
		},
		/**
		 * Browser native history object
		 */
		nativeHistory = (fm.options.useBrowserHistory && window.history && window.history.pushState)? window.history : null,
		/**
		 * Open prev/next folder
		 *
		 * @Boolen  open next folder?
		 * @return jQuery.Deferred
		 */
		go = function(fwd) {
			if ((fwd && self.canForward()) || (!fwd && self.canBack())) {
				update = false;
				return fm.exec('open', history[fwd ? ++current : --current]).fail(reset);
			}
			return jQuery.Deferred().reject();
		},
		/**
		 * Sets the native history.
		 *
		 * @param String thash target hash
		 */
		setNativeHistory = function(thash) {
			if (nativeHistory && (! nativeHistory.state || nativeHistory.state.thash !== thash)) {
				nativeHistory.pushState({thash: thash}, null, location.pathname + location.search + (thash? '#elf_' + thash : ''));
			}
		};
	
	/**
	 * Return true if there is previous visited directories
	 *
	 * @return Boolen
	 */
	this.canBack = function() {
		return current > 0;
	};
	
	/**
	 * Return true if can go forward
	 *
	 * @return Boolen
	 */
	this.canForward = function() {
		return current < history.length - 1;
	};
	
	/**
	 * Go back
	 *
	 * @return void
	 */
	this.back = go;
	
	/**
	 * Go forward
	 *
	 * @return void
	 */
	this.forward = function() {
		return go(true);
	};
	
	// bind to elfinder events
	fm.bind('init', function() {
		if (nativeHistory && !nativeHistory.state) {
			setNativeHistory(fm.startDir());
		}
	})
	.open(function() {
		var l = history.length,
			cwd = fm.cwd().hash;

		if (update) {
			current >= 0 && l > current + 1 && history.splice(current+1);
			history[history.length-1] != cwd && history.push(cwd);
			current = history.length - 1;
		}
		update = true;

		setNativeHistory(cwd);
	})
	.reload(fm.options.reloadClearHistory && reset);
	
};


/*
 * File: /js/elFinder.command.js
 */

/**
 * elFinder command prototype
 *
 * @type  elFinder.command
 * @author  Dmitry (dio) Levashov
 */
elFinder.prototype.command = function(fm) {
		/**
	 * elFinder instance
	 *
	 * @type  elFinder
	 */
	this.fm = fm;
	
	/**
	 * Command name, same as class name
	 *
	 * @type  String
	 */
	this.name = '';
	
	/**
	 * Dialog class name
	 *
	 * @type  String
	 */
	this.dialogClass = '';

	/**
	 * Command icon class name with out 'elfinder-button-icon-'
	 * Use this.name if it is empty
	 *
	 * @type  String
	 */
	this.className = '';

	/**
	 * Short command description
	 *
	 * @type  String
	 */
	this.title = '';
	
	/**
	 * Linked(Child) commands name
	 * They are loaded together when tthis command is loaded.
	 * 
	 * @type  Array
	 */
	this.linkedCmds = [];
	
	/**
	 * Current command state
	 *
	 * @example
	 * this.state = -1; // command disabled
	 * this.state = 0;  // command enabled
	 * this.state = 1;  // command active (for example "fullscreen" command while elfinder in fullscreen mode)
	 * @default -1
	 * @type  Number
	 */
	this.state = -1;
	
	/**
	 * If true, command can not be disabled by connector.
	 * @see this.update()
	 *
	 * @type  Boolen
	 */
	this.alwaysEnabled = false;
	
	/**
	 * Do not change dirctory on removed current work directory
	 * 
	 * @type  Boolen
	 */
	this.noChangeDirOnRemovedCwd = false;
	
	/**
	 * If true, this means command was disabled by connector.
	 * @see this.update()
	 *
	 * @type  Boolen
	 */
	this._disabled = false;
	
	/**
	 * If true, this command is disabled on serach results
	 * 
	 * @type  Boolean
	 */
	this.disableOnSearch = false;
	
	/**
	 * Call update() when event select fired
	 * 
	 * @type  Boolean
	 */
	this.updateOnSelect = true;
	
	/**
	 * Sync toolbar button title on change
	 * 
	 * @type  Boolean
	 */
	this.syncTitleOnChange = false;

	/**
	 * Keep display of the context menu when command execution
	 * 
	 * @type  Boolean
	 */
	this.keepContextmenu = false;
	
	/**
	 * elFinder events defaults handlers.
	 * Inside handlers "this" is current command object
	 *
	 * @type  Object
	 */
	this._handlers = {
		enable  : function() { this.update(void(0), this.value); },
		disable : function() { this.update(-1, this.value); },
		'open reload load sync'    : function() { 
			this._disabled = !(this.alwaysEnabled || this.fm.isCommandEnabled(this.name));
			this.update(void(0), this.value);
			this.change(); 
		}
	};
	
	/**
	 * elFinder events handlers.
	 * Inside handlers "this" is current command object
	 *
	 * @type  Object
	 */
	this.handlers = {};
	
	/**
	 * Shortcuts
	 *
	 * @type  Array
	 */
	this.shortcuts = [];
	
	/**
	 * Command options
	 *
	 * @type  Object
	 */
	this.options = {ui : 'button'};
	
	/**
	 * Callback functions on `change` event
	 * 
	 * @type  Array
	 */
	this.listeners = [];

	/**
	 * Prepare object -
	 * bind events and shortcuts
	 *
	 * @return void
	 */
	this.setup = function(name, opts) {
		var self = this,
			fm   = this.fm,
			setCallback = function(s) {
				var cb = s.callback || function(e) {
							fm.exec(self.name, void(0), {
							_userAction: true,
							_currentType: 'shortcut'
						});
					};
				s.callback = function(e) {
					var enabled, checks = {};
					if (self.enabled()) {
						if (fm.searchStatus.state < 2) {
							enabled = fm.isCommandEnabled(self.name);
						} else {
							jQuery.each(fm.selected(), function(i, h) {
								if (fm.optionsByHashes[h]) {
									checks[h] = true;
								} else {
									jQuery.each(fm.volOptions, function(id) {
										if (!checks[id] && h.indexOf(id) === 0) {
											checks[id] = true;
											return false;
										}
									});
								}
							});
							jQuery.each(checks, function(h) {
								enabled = fm.isCommandEnabled(self.name, h);
								if (! enabled) {
									return false;
								}
							});
						}
						if (enabled) {
							self.event = e;
							cb.call(self);
							delete self.event;
						}
					}
				};
			},
			i, s, sc;

		this.name      = name;
		this.title     = fm.messages['cmd'+name] ? fm.i18n('cmd'+name)
		               : ((this.extendsCmd && fm.messages['cmd'+this.extendsCmd]) ? fm.i18n('cmd'+this.extendsCmd) : name);
		this.options   = Object.assign({}, this.options, opts);
		this.listeners = [];
		this.dialogClass = 'elfinder-dialog-' + name;

		if (opts.shortcuts) {
			if (typeof opts.shortcuts === 'function') {
				sc = opts.shortcuts(this.fm, this.shortcuts);
			} else if (Array.isArray(opts.shortcuts)) {
				sc = opts.shortcuts;
			}
			this.shortcuts = sc || [];
		}

		if (this.updateOnSelect) {
			this._handlers.select = function() { this.update(void(0), this.value); };
		}

		jQuery.each(Object.assign({}, self._handlers, self.handlers), function(cmd, handler) {
			fm.bind(cmd, jQuery.proxy(handler, self));
		});

		for (i = 0; i < this.shortcuts.length; i++) {
			s = this.shortcuts[i];
			setCallback(s);
			!s.description && (s.description = this.title);
			fm.shortcut(s);
		}

		if (this.disableOnSearch) {
			fm.bind('search searchend', function() {
				self._disabled = this.type === 'search'? true : ! (this.alwaysEnabled || fm.isCommandEnabled(name));
				self.update(void(0), self.value);
			});
		}

		this.init();
	};

	/**
	 * Command specific init stuffs
	 *
	 * @return void
	 */
	this.init = function() {};

	/**
	 * Exec command
	 *
	 * @param  Array         target files hashes
	 * @param  Array|Object  command value
	 * @return jQuery.Deferred
	 */
	this.exec = function(files, opts) { 
		return jQuery.Deferred().reject(); 
	};
	
	this.getUndo = function(opts, resData) {
		return false;
	};
	
	/**
	 * Return true if command disabled.
	 *
	 * @return Boolen
	 */
	this.disabled = function() {
		return this.state < 0;
	};
	
	/**
	 * Return true if command enabled.
	 *
	 * @return Boolen
	 */
	this.enabled = function() {
		return this.state > -1;
	};
	
	/**
	 * Return true if command active.
	 *
	 * @return Boolen
	 */
	this.active = function() {
		return this.state > 0;
	};
	
	/**
	 * Return current command state.
	 * Must be overloaded in most commands
	 *
	 * @return Number
	 */
	this.getstate = function() {
		return -1;
	};
	
	/**
	 * Update command state/value
	 * and rize 'change' event if smth changed
	 *
	 * @param  Number  new state or undefined to auto update state
	 * @param  mixed   new value
	 * @return void
	 */
	this.update = function(s, v) {
		var state = this.state,
			value = this.value;

		if (this._disabled && this.fm.searchStatus === 0) {
			this.state = -1;
		} else {
			this.state = s !== void(0) ? s : this.getstate();
		}

		this.value = v;
		
		if (state != this.state || value != this.value) {
			this.change();
		}
	};
	
	/**
	 * Bind handler / fire 'change' event.
	 *
	 * @param  Function|undefined  event callback
	 * @return void
	 */
	this.change = function(c) {
		var cmd, i;
		
		if (typeof(c) === 'function') {
			this.listeners.push(c);			
		} else {
			for (i = 0; i < this.listeners.length; i++) {
				cmd = this.listeners[i];
				try {
					cmd(this.state, this.value);
				} catch (e) {
					this.fm.debug('error', e);
				}
			}
		}
		return this;
	};
	

	/**
	 * With argument check given files hashes and return list of existed files hashes.
	 * Without argument return selected files hashes.
	 *
	 * @param  Array|String|void  hashes
	 * @return Array
	 */
	this.hashes = function(hashes) {
		return hashes
			? jQuery.grep(Array.isArray(hashes) ? hashes : [hashes], function(hash) { return fm.file(hash) ? true : false; })
			: fm.selected();
	};
	
	/**
	 * Return only existed files from given fils hashes | selected files
	 *
	 * @param  Array|String|void  hashes
	 * @return Array
	 */
	this.files = function(hashes) {
		var fm = this.fm;
		
		return hashes
			? jQuery.map(Array.isArray(hashes) ? hashes : [hashes], function(hash) { return fm.file(hash) || null; })
			: fm.selectedFiles();
	};

	/**
	 * Wrapper to fm.dialog()
	 *
	 * @param  String|DOMElement  content
	 * @param  Object             options
	 * @return Object             jQuery element object
	 */
	this.fmDialog = function(content, options) {
		if (options.cssClass) {
			options.cssClass += ' ' + this.dialogClass;
		} else {
			options.cssClass = this.dialogClass;
		}
		return this.fm.dialog(content, options);
	};
};


/*
 * File: /js/elFinder.resources.js
 */

/**
 * elFinder resources registry.
 * Store shared data
 *
 * @type Object
 * @author Dmitry (dio) Levashov
 **/
elFinder.prototype.resources = {
	'class' : {
		hover       : 'ui-state-hover',
		active      : 'ui-state-active',
		disabled    : 'ui-state-disabled',
		draggable   : 'ui-draggable',
		droppable   : 'ui-droppable',
		adroppable  : 'elfinder-droppable-active',
		cwdfile     : 'elfinder-cwd-file',
		cwd         : 'elfinder-cwd',
		tree        : 'elfinder-tree',
		treeroot    : 'elfinder-navbar-root',
		navdir      : 'elfinder-navbar-dir',
		navdirwrap  : 'elfinder-navbar-dir-wrapper',
		navarrow    : 'elfinder-navbar-arrow',
		navsubtree  : 'elfinder-navbar-subtree',
		navcollapse : 'elfinder-navbar-collapsed',
		navexpand   : 'elfinder-navbar-expanded',
		treedir     : 'elfinder-tree-dir',
		placedir    : 'elfinder-place-dir',
		searchbtn   : 'elfinder-button-search',
		editing     : 'elfinder-to-editing',
		preventback : 'elfinder-prevent-back',
		tabstab     : 'ui-state-default ui-tabs-tab ui-corner-top ui-tab',
		tabsactive  : 'ui-tabs-active ui-state-active'
	},
	tpl : {
		perms      : '<span class="elfinder-perms"/>',
		lock       : '<span class="elfinder-lock"/>',
		symlink    : '<span class="elfinder-symlink"/>',
		navicon    : '<span class="elfinder-nav-icon"/>',
		navspinner : '<span class="elfinder-spinner elfinder-navbar-spinner"/>',
		navdir     : '<div class="elfinder-navbar-wrapper{root}"><span id="{id}" class="ui-corner-all elfinder-navbar-dir {cssclass}"><span class="elfinder-navbar-arrow"/><span class="elfinder-navbar-icon" {style}/>{symlink}{permissions}{name}</span><div class="elfinder-navbar-subtree" style="display:none"/></div>',
		placedir   : '<div class="elfinder-navbar-wrapper"><span id="{id}" class="ui-corner-all elfinder-navbar-dir {cssclass}" title="{title}"><span class="elfinder-navbar-arrow"/><span class="elfinder-navbar-icon" {style}/>{symlink}{permissions}{name}</span><div class="elfinder-navbar-subtree" style="display:none"/></div>'
		
	},
	// mimes.text will be overwritten with connector config if `textMimes` is included in initial response
	// @see php/elFInder.class.php `public static $textMimes`
	mimes : {
		text : [
			'application/dash+xml',
			'application/docbook+xml',
			'application/javascript',
			'application/json',
			'application/plt',
			'application/sat',
			'application/sql',
			'application/step',
			'application/vnd.hp-hpgl',
			'application/x-awk',
			'application/x-config',
			'application/x-csh',
			'application/x-empty',
			'application/x-mpegurl',
			'application/x-perl',
			'application/x-php',
			'application/x-web-config',
			'application/xhtml+xml',
			'application/xml',
			'audio/x-mp3-playlist',
			'image/cgm',
			'image/svg+xml',
			'image/vnd.dxf',
			'model/iges'
		]
	},
	
	mixin : {
		make : function() {
						var self = this,
				fm   = this.fm,
				cmd  = this.name,
				req  = this.requestCmd || cmd,
				wz   = fm.getUI('workzone'),
				org  = (this.origin && this.origin === 'navbar')? 'tree' : 'cwd',
				tree = (org === 'tree'),
				find = tree? 'navHash2Elm' : 'cwdHash2Elm',
				tarea= (! tree && fm.storage('view') != 'list'),
				sel  = fm.selected(),
				move = this.move || false,
				empty= wz.hasClass('elfinder-cwd-wrapper-empty'),
				unselect = function() {
					requestAnimationFrame(function() {
						input && input.trigger('blur');
					});
				},
				rest = function(){
					if (!overlay.is(':hidden')) {
						overlay.elfinderoverlay('hide').off('click close', cancel);
					}
					pnode.removeClass('ui-front')
						.css('position', '')
						.off('unselect.'+fm.namespace, unselect);
					if (tarea) {
						nnode && nnode.css('max-height', '');
					} else if (!tree) {
						pnode.css('width', '')
							.parent('td').css('overflow', '');
					}
				}, colwidth,
				dfrd = jQuery.Deferred()
					.fail(function(error) {
						dstCls && dst.attr('class', dstCls);
						empty && wz.addClass('elfinder-cwd-wrapper-empty');
						if (sel) {
							move && fm.trigger('unlockfiles', {files: sel});
							fm.clipboard([]);
							fm.trigger('selectfiles', { files: sel });
						}
						error && fm.error(error);
					})
					.always(function() {
						rest();
						cleanup();
						fm.enable().unbind('open', openCallback).trigger('resMixinMake');
					}),
				id    = 'tmp_'+parseInt(Math.random()*100000),
				phash = this.data && this.data.target? this.data.target : (tree? fm.file(sel[0]).hash : fm.cwd().hash),
				date = new Date(),
				file   = {
					hash  : id,
					phash : phash,
					name  : fm.uniqueName(this.prefix, phash),
					mime  : this.mime,
					read  : true,
					write : true,
					date  : 'Today '+date.getHours()+':'+date.getMinutes(),
					move  : move
				},
				dum = fm.getUI(org).trigger('create.'+fm.namespace, file),
				data = this.data || {},
				node = fm[find](id),
				nnode, pnode,
				overlay = fm.getUI('overlay'),
				cleanup = function() {
					if (node && node.length) {
						input.off();
						node.hide();
						fm.unselectfiles({files : [id]}).unbind('resize', resize);
						requestAnimationFrame(function() {
							if (tree) {
								node.closest('.elfinder-navbar-wrapper').remove();
							} else {
								node.remove();
							}
						});
					}
				},
				cancel = function(e) { 
					if (!overlay.is(':hidden')) {
						pnode.css('z-index', '');
					}
					if (! inError) {
						cleanup();
						dfrd.reject();
						if (e) {
							e.stopPropagation();
							e.preventDefault();
						}
					}
				},
				input = jQuery(tarea? '<textarea/>' : '<input type="text"/>')
					.on('keyup text', function(){
						if (tarea) {
							this.style.height = '1px';
							this.style.height = this.scrollHeight + 'px';
						} else if (colwidth) {
							this.style.width = colwidth + 'px';
							if (this.scrollWidth > colwidth) {
								this.style.width = this.scrollWidth + 10 + 'px';
							}
						}
					})
					.on('keydown', function(e) {
						e.stopImmediatePropagation();
						if (e.keyCode == jQuery.ui.keyCode.ESCAPE) {
							dfrd.reject();
						} else if (e.keyCode == jQuery.ui.keyCode.ENTER) {
							e.preventDefault();
							input.trigger('blur');
						}
					})
					.on('mousedown click dblclick', function(e) {
						e.stopPropagation();
						if (e.type === 'dblclick') {
							e.preventDefault();
						}
					})
					.on('blur', function() {
						var name   = jQuery.trim(input.val()),
							parent = input.parent(),
							valid  = true,
							cut;

						if (!overlay.is(':hidden')) {
							pnode.css('z-index', '');
						}
						if (name === '') {
							return cancel();
						}
						if (!inError && parent.length) {

							if (fm.options.validName && fm.options.validName.test) {
								try {
									valid = fm.options.validName.test(name);
								} catch(e) {
									valid = false;
								}
							}
							if (!name || name === '.' || name === '..' || !valid) {
								inError = true;
								fm.error(file.mime === 'directory'? 'errInvDirname' : 'errInvName', {modal: true, close: function(){setTimeout(select, 120);}});
								return false;
							}
							if (fm.fileByName(name, phash)) {
								inError = true;
								fm.error(['errExists', name], {modal: true, close: function(){setTimeout(select, 120);}});
								return false;
							}

							cut = (sel && move)? fm.exec('cut', sel) : null;

							jQuery.when(cut)
							.done(function() {
								var toast   = {},
									nextAct = {};
								
								rest();
								input.hide().before(jQuery('<span>').text(name));

								fm.lockfiles({files : [id]});

								fm.request({
										data        : Object.assign({cmd : req, name : name, target : phash}, data || {}), 
										notify      : {type : req, cnt : 1},
										preventFail : true,
										syncOnFail  : true,
										navigate    : {toast : toast},
									})
									.fail(function(error) {
										fm.unlockfiles({files : [id]});
										inError = true;
										input.show().prev().remove();
										fm.error(error, {
											modal: true,
											close: function() {
												if (Array.isArray(error) && jQuery.inArray('errUploadMime', error) !== -1) {
													dfrd.notify('errUploadMime').reject();
												} else {
													setTimeout(select, 120);
												}
											}
										});
									})
									.done(function(data) {
										if (data && data.added && data.added[0]) {
											var item    = data.added[0],
												dirhash = item.hash,
												newItem = fm[find](dirhash),
												acts    = {
													'directory' : { cmd: 'open', msg: 'cmdopendir' },
													'text'      : { cmd: 'edit', msg: 'cmdedit' },
													'default'   : { cmd: 'open', msg: 'cmdopen' }
												},
												tmpMimes;
											if (sel && move) {
												fm.one(req+'done', function() {
													fm.exec('paste', dirhash);
												});
											}
											if (!move) {
												if (fm.mimeIsText(item.mime) && !fm.mimesCanMakeEmpty[item.mime] && fm.mimeTypes[item.mime]) {
													fm.trigger('canMakeEmptyFile', {mimes: [item.mime], unshift: true});
													tmpMimes = {};
													tmpMimes[item.mime] = fm.mimeTypes[item.mime];
													fm.storage('mkfileTextMimes', Object.assign(tmpMimes, fm.storage('mkfileTextMimes') || {}));
												}
												Object.assign(nextAct, nextAction || acts[item.mime] || acts[item.mime.split('/')[0]] || acts[(fm.mimesCanMakeEmpty[item.mime] || jQuery.inArray(item.mime, fm.resources.mimes.text) !== -1) ? 'text' : 'none'] || acts['default']);
												Object.assign(toast, nextAct.cmd ? {
													incwd    : {msg: fm.i18n(['complete', fm.i18n('cmd'+cmd)]), action: nextAct},
													inbuffer : {msg: fm.i18n(['complete', fm.i18n('cmd'+cmd)]), action: nextAct}
												} : {
													inbuffer : {msg: fm.i18n(['complete', fm.i18n('cmd'+cmd)])}
												});
											}
										}
										dfrd.resolve(data);
									});
							})
							.fail(function() {
								dfrd.reject();
							});
						}
					})
					.on('dragenter dragleave dragover drop', function(e) {
						// stop bubbling to prevent upload with native drop event
						e.stopPropagation();
					}),
				select = function() {
					var name = fm.splitFileExtention(input.val())[0];
					if (!inError && fm.UA.Mobile && !fm.UA.iOS) { // since iOS has a bug? (z-index not effect) so disable it
						overlay.on('click close', cancel).elfinderoverlay('show');
						pnode.css('z-index', overlay.css('z-index') + 1);
					}
					inError = false;
					! fm.enabled() && fm.enable();
					input.trigger('focus').trigger('select');
					input[0].setSelectionRange && input[0].setSelectionRange(0, name.length);
				},
				resize = function() {
					node.trigger('scrolltoview', {blink : false});
				},
				openCallback = function() {
					dfrd && (dfrd.state() === 'pending') && dfrd.reject();
				},
				inError = false,
				nextAction,
				// for tree
				dst, dstCls, collapsed, expanded, arrow, subtree;

			if (!fm.isCommandEnabled(req, phash) || !node.length) {
				return dfrd.reject();
			}

			if (jQuery.isPlainObject(self.nextAction)){
				nextAction = Object.assign({}, self.nextAction);
			}
			
			if (tree) {
				dst = fm[find](phash);
				collapsed = fm.res('class', 'navcollapse');
				expanded  = fm.res('class', 'navexpand');
				arrow = fm.res('class', 'navarrow');
				subtree = fm.res('class', 'navsubtree');
				
				node.closest('.'+subtree).show();
				if (! dst.hasClass(collapsed)) {
					dstCls = dst.attr('class');
					dst.addClass(collapsed+' '+expanded+' elfinder-subtree-loaded');
				}
				if (dst.is('.'+collapsed+':not(.'+expanded+')')) {
					dst.children('.'+arrow).trigger('click').data('dfrd').done(function() {
						if (input.val() === file.name) {
							input.val(fm.uniqueName(self.prefix, phash)).trigger('select').trigger('focus');
						}
					});
				}
				nnode = node.contents().filter(function(){ return this.nodeType==3 && jQuery(this).parent().attr('id') === fm.navHash2Id(file.hash); });
				pnode = nnode.parent();
				nnode.replaceWith(input.val(file.name));
			} else {
				empty && wz.removeClass('elfinder-cwd-wrapper-empty');
				nnode = node.find('.elfinder-cwd-filename');
				pnode = nnode.parent();
				if (tarea) {
					nnode.css('max-height', 'none');
				} else {
					colwidth = pnode.width();
					pnode.width(colwidth - 15)
						.parent('td').css('overflow', 'visible');
				}
				nnode.empty().append(input.val(file.name));
			}
			pnode.addClass('ui-front')
				.css('position', 'relative')
				.on('unselect.'+fm.namespace, unselect);
			
			fm.bind('resize', resize).one('open', openCallback);
			
			input.trigger('keyup');
			select();

			return dfrd;

		}
	},
	blink: function(elm, mode) {
				var acts = {
			slowonce : function(){elm.hide().delay(250).fadeIn(750).delay(500).fadeOut(3500);},
			lookme   : function(){elm.show().fadeOut(500).fadeIn(750);}
		}, func;
		mode = mode || 'slowonce';
		
		func = acts[mode] || acts['lookme'];
		
		elm.stop(true, true);
		func();
	}
};


/*
 * File: /js/jquery.dialogelfinder.js
 */

/**
 * @class dialogelfinder - open elFinder in dialog window
 *
 * @param  Object  elFinder options with dialog options
 * @example
 * jQuery(selector).dialogelfinder({
 *     // some elfinder options
 *     title          : 'My files', // dialog title, default = "Files"
 *     width          : 850,        // dialog width, default 840
 *     autoOpen       : false,      // if false - dialog will not be opened after init, default = true
 *     destroyOnClose : true        // destroy elFinder on close dialog, default = false
 * })
 * @author Dmitry (dio) Levashov
 **/
jQuery.fn.dialogelfinder = function(opts) {
		var position = 'elfinderPosition',
		destroy  = 'elfinderDestroyOnClose',
		node;
	
	this.not('.elfinder').each(function() {

		
		var doc     = jQuery(document),
			toolbar = jQuery('<div class="ui-widget-header dialogelfinder-drag ui-corner-top">'+(opts.title || 'Files')+'</div>'),
			button  = jQuery('<a href="#" class="dialogelfinder-drag-close ui-corner-all"><span class="ui-icon ui-icon-closethick"> </span></a>')
				.appendTo(toolbar)
				.on('click', function(e) {
					e.preventDefault();
					
					node.dialogelfinder('close');
				}),
			node    = jQuery(this).addClass('dialogelfinder')
				.css('position', 'absolute')
				.hide()
				.appendTo('body')
				.draggable({
					handle : '.dialogelfinder-drag',
					containment : 'window',
					stop : function() {
						node.trigger('resize');
						elfinder.trigger('resize');
					}
				})
				.elfinder(opts)
				.prepend(toolbar),
			elfinder = node.elfinder('instance');
		
		
		node.width(parseInt(node.width()) || 840) // fix width if set to "auto"
			.data(destroy, !!opts.destroyOnClose)
			.find('.elfinder-toolbar').removeClass('ui-corner-top');
		
		opts.position && node.data(position, opts.position);
		
		opts.autoOpen !== false && jQuery(this).dialogelfinder('open');

	});
	
	if (opts == 'open') {
		var node = jQuery(this),
			pos  = node.data(position) || {
				top  : parseInt(jQuery(document).scrollTop() + (jQuery(window).height() < node.height() ? 2 : (jQuery(window).height() - node.height())/2)),
				left : parseInt(jQuery(document).scrollLeft() + (jQuery(window).width() < node.width()  ? 2 : (jQuery(window).width()  - node.width())/2))
			};

		if (node.is(':hidden')) {
			node.addClass('ui-front').css(pos).show().trigger('resize');

			setTimeout(function() {
				// fix resize icon position and make elfinder active
				node.trigger('resize').trigger('mousedown');
			}, 200);
		}
	} else if (opts == 'close') {
		node = jQuery(this).removeClass('ui-front');
			
		if (node.is(':visible')) {
			!!node.data(destroy)
				? node.elfinder('destroy').remove()
				: node.elfinder('close');
		}
	} else if (opts == 'instance') {
		return jQuery(this).getElFinder();
	}

	return this;
};


/*
 * File: /js/i18n/elfinder.en.js
 */

/**
 * English translation
 * @author Troex Nevelin <troex@fury.scancode.ru>
 * @author Naoki Sawada <hypweb+elfinder@gmail.com>
 * @version 2018-12-09
 */
// elfinder.en.js is integrated into elfinder.(full|min).js by jake build
if (typeof elFinder === 'function' && elFinder.prototype.i18) {
	elFinder.prototype.i18.en = {
		translator : 'Troex Nevelin &lt;troex@fury.scancode.ru&gt;, Naoki Sawada &lt;hypweb+elfinder@gmail.com&gt;',
		language   : 'English',
		direction  : 'ltr',
		dateFormat : 'M d, Y h:i A', // will show like: Aug 24, 2018 04:39 PM
		fancyDateFormat : '$1 h:i A', // will show like: Today 04:39 PM
		nonameDateFormat : 'ymd-His', // noname upload will show like: 180824-163916
		messages   : {

			/********************************** errors **********************************/
			'error'                : 'Error',
			'errUnknown'           : 'Unknown error.',
			'errUnknownCmd'        : 'Unknown command.',
			'errJqui'              : 'Invalid jQuery UI configuration. Selectable, draggable and droppable components must be included.',
			'errNode'              : 'elFinder requires DOM Element to be created.',
			'errURL'               : 'Invalid elFinder configuration! URL option is not set.',
			'errAccess'            : 'Access denied.',
			'errConnect'           : 'Unable to connect to backend.',
			'errAbort'             : 'Connection aborted.',
			'errTimeout'           : 'Connection timeout.',
			'errNotFound'          : 'Backend not found.',
			'errResponse'          : 'Invalid backend response.',
			'errConf'              : 'Invalid backend configuration.',
			'errJSON'              : 'PHP JSON module not installed.',
			'errNoVolumes'         : 'Readable volumes not available.',
			'errCmdParams'         : 'Invalid parameters for command "$1".',
			'errDataNotJSON'       : 'Data is not JSON.',
			'errDataEmpty'         : 'Data is empty.',
			'errCmdReq'            : 'Backend request requires command name.',
			'errOpen'              : 'Unable to open "$1".',
			'errNotFolder'         : 'Object is not a folder.',
			'errNotFile'           : 'Object is not a file.',
			'errRead'              : 'Unable to read "$1".',
			'errWrite'             : 'Unable to write into "$1".',
			'errPerm'              : 'Permission denied.',
			'errLocked'            : '"$1" is locked and can not be renamed, moved or removed.',
			'errExists'            : 'Item named "$1" already exists.',
			'errInvName'           : 'Invalid file name.',
			'errInvDirname'        : 'Invalid folder name.',  // from v2.1.24 added 12.4.2017
			'errFolderNotFound'    : 'Folder not found.',
			'errFileNotFound'      : 'File not found.',
			'errTrgFolderNotFound' : 'Target folder "$1" not found.',
			'errPopup'             : 'Browser prevented opening popup window. To open file enable it in browser options.',
			'errMkdir'             : 'Unable to create folder "$1".',
			'errMkfile'            : 'Unable to create file "$1".',
			'errRename'            : 'Unable to rename "$1".',
			'errCopyFrom'          : 'Copying files from volume "$1" not allowed.',
			'errCopyTo'            : 'Copying files to volume "$1" not allowed.',
			'errMkOutLink'         : 'Unable to create a link to outside the volume root.', // from v2.1 added 03.10.2015
			'errUpload'            : 'Upload error.',  // old name - errUploadCommon
			'errUploadFile'        : 'Unable to upload "$1".', // old name - errUpload
			'errUploadNoFiles'     : 'No files found for upload.',
			'errUploadTotalSize'   : 'Data exceeds the maximum allowed size.', // old name - errMaxSize
			'errUploadFileSize'    : 'File exceeds maximum allowed size.', //  old name - errFileMaxSize
			'errUploadMime'        : 'File type not allowed.',
			'errUploadTransfer'    : '"$1" transfer error.',
			'errUploadTemp'        : 'Unable to make temporary file for upload.', // from v2.1 added 26.09.2015
			'errNotReplace'        : 'Object "$1" already exists at this location and can not be replaced by object with another type.', // new
			'errReplace'           : 'Unable to replace "$1".',
			'errSave'              : 'Unable to save "$1".',
			'errCopy'              : 'Unable to copy "$1".',
			'errMove'              : 'Unable to move "$1".',
			'errCopyInItself'      : 'Unable to copy "$1" into itself.',
			'errRm'                : 'Unable to remove "$1".',
			'errTrash'             : 'Unable into trash.', // from v2.1.24 added 30.4.2017
			'errRmSrc'             : 'Unable remove source file(s).',
			'errExtract'           : 'Unable to extract files from "$1".',
			'errArchive'           : 'Unable to create archive.',
			'errArcType'           : 'Unsupported archive type.',
			'errNoArchive'         : 'File is not archive or has unsupported archive type.',
			'errCmdNoSupport'      : 'Backend does not support this command.',
			'errReplByChild'       : 'The folder "$1" can\'t be replaced by an item it contains.',
			'errArcSymlinks'       : 'For security reason denied to unpack archives contains symlinks or files with not allowed names.', // edited 24.06.2012
			'errArcMaxSize'        : 'Archive files exceeds maximum allowed size.',
			'errResize'            : 'Unable to resize "$1".',
			'errResizeDegree'      : 'Invalid rotate degree.',  // added 7.3.2013
			'errResizeRotate'      : 'Unable to rotate image.',  // added 7.3.2013
			'errResizeSize'        : 'Invalid image size.',  // added 7.3.2013
			'errResizeNoChange'    : 'Image size not changed.',  // added 7.3.2013
			'errUsupportType'      : 'Unsupported file type.',
			'errNotUTF8Content'    : 'File "$1" is not in UTF-8 and cannot be edited.',  // added 9.11.2011
			'errNetMount'          : 'Unable to mount "$1".', // added 17.04.2012
			'errNetMountNoDriver'  : 'Unsupported protocol.',     // added 17.04.2012
			'errNetMountFailed'    : 'Mount failed.',         // added 17.04.2012
			'errNetMountHostReq'   : 'Host required.', // added 18.04.2012
			'errSessionExpires'    : 'Your session has expired due to inactivity.',
			'errCreatingTempDir'   : 'Unable to create temporary directory: "$1"',
			'errFtpDownloadFile'   : 'Unable to download file from FTP: "$1"',
			'errFtpUploadFile'     : 'Unable to upload file to FTP: "$1"',
			'errFtpMkdir'          : 'Unable to create remote directory on FTP: "$1"',
			'errArchiveExec'       : 'Error while archiving files: "$1"',
			'errExtractExec'       : 'Error while extracting files: "$1"',
			'errNetUnMount'        : 'Unable to unmount.', // from v2.1 added 30.04.2012
			'errConvUTF8'          : 'Not convertible to UTF-8', // from v2.1 added 08.04.2014
			'errFolderUpload'      : 'Try the modern browser, If you\'d like to upload the folder.', // from v2.1 added 26.6.2015
			'errSearchTimeout'     : 'Timed out while searching "$1". Search result is partial.', // from v2.1 added 12.1.2016
			'errReauthRequire'     : 'Re-authorization is required.', // from v2.1.10 added 24.3.2016
			'errMaxTargets'        : 'Max number of selectable items is $1.', // from v2.1.17 added 17.10.2016
			'errRestore'           : 'Unable to restore from the trash. Can\'t identify the restore destination.', // from v2.1.24 added 3.5.2017
			'errEditorNotFound'    : 'Editor not found to this file type.', // from v2.1.25 added 23.5.2017
			'errServerError'       : 'Error occurred on the server side.', // from v2.1.25 added 16.6.2017
			'errEmpty'             : 'Unable to empty folder "$1".', // from v2.1.25 added 22.6.2017
			'moreErrors'           : 'There are $1 more errors.', // from v2.1.44 added 9.12.2018

			/******************************* commands names ********************************/
			'cmdarchive'   : 'Create archive',
			'cmdback'      : 'Back',
			'cmdcopy'      : 'Copy',
			'cmdcut'       : 'Cut',
			'cmddownload'  : 'Download',
			'cmdduplicate' : 'Duplicate',
			'cmdedit'      : 'Edit file',
			'cmdextract'   : 'Extract files from archive',
			'cmdforward'   : 'Forward',
			'cmdgetfile'   : 'Select files',
			'cmdhelp'      : 'About this software',
			'cmdhome'      : 'Root',
			'cmdinfo'      : 'Get info & Share',
			'cmdmkdir'     : 'New folder',
			'cmdmkdirin'   : 'Into New Folder', // from v2.1.7 added 19.2.2016
			'cmdmkfile'    : 'New file',
			'cmdopen'      : 'Open',
			'cmdpaste'     : 'Paste',
			'cmdquicklook' : 'Preview',
			'cmdreload'    : 'Reload',
			'cmdrename'    : 'Rename',
			'cmdrm'        : 'Delete',
			'cmdtrash'     : 'Into trash', //from v2.1.24 added 29.4.2017
			'cmdrestore'   : 'Restore', //from v2.1.24 added 3.5.2017
			'cmdsearch'    : 'Find files',
			'cmdup'        : 'Go to parent folder',
			'cmdupload'    : 'Upload files',
			'cmdview'      : 'View',
			'cmdresize'    : 'Resize & Rotate',
			'cmdsort'      : 'Sort',
			'cmdnetmount'  : 'Mount network volume', // added 18.04.2012
			'cmdnetunmount': 'Unmount', // from v2.1 added 30.04.2012
			'cmdplaces'    : 'To Places', // added 28.12.2014
			'cmdchmod'     : 'Change mode', // from v2.1 added 20.6.2015
			'cmdopendir'   : 'Open a folder', // from v2.1 added 13.1.2016
			'cmdcolwidth'  : 'Reset column width', // from v2.1.13 added 12.06.2016
			'cmdfullscreen': 'Full Screen', // from v2.1.15 added 03.08.2016
			'cmdmove'      : 'Move', // from v2.1.15 added 21.08.2016
			'cmdempty'     : 'Empty the folder', // from v2.1.25 added 22.06.2017
			'cmdundo'      : 'Undo', // from v2.1.27 added 31.07.2017
			'cmdredo'      : 'Redo', // from v2.1.27 added 31.07.2017
			'cmdpreference': 'Preferences', // from v2.1.27 added 03.08.2017
			'cmdselectall' : 'Select all', // from v2.1.28 added 15.08.2017
			'cmdselectnone': 'Select none', // from v2.1.28 added 15.08.2017
			'cmdselectinvert': 'Invert selection', // from v2.1.28 added 15.08.2017
			'cmdopennew'   : 'Open in new window', // from v2.1.38 added 3.4.2018
			'cmdhide'      : 'Hide (Preference)', // from v2.1.41 added 24.7.2018

			/*********************************** buttons ***********************************/
			'btnClose'  : 'Close',
			'btnSave'   : 'Save',
			'btnRm'     : 'Remove',
			'btnApply'  : 'Apply',
			'btnCancel' : 'Cancel',
			'btnNo'     : 'No',
			'btnYes'    : 'Yes',
			'btnMount'  : 'Mount',  // added 18.04.2012
			'btnApprove': 'Goto $1 & approve', // from v2.1 added 26.04.2012
			'btnUnmount': 'Unmount', // from v2.1 added 30.04.2012
			'btnConv'   : 'Convert', // from v2.1 added 08.04.2014
			'btnCwd'    : 'Here',      // from v2.1 added 22.5.2015
			'btnVolume' : 'Volume',    // from v2.1 added 22.5.2015
			'btnAll'    : 'All',       // from v2.1 added 22.5.2015
			'btnMime'   : 'MIME Type', // from v2.1 added 22.5.2015
			'btnFileName':'Filename',  // from v2.1 added 22.5.2015
			'btnSaveClose': 'Save & Close', // from v2.1 added 12.6.2015
			'btnBackup' : 'Backup', // fromv2.1 added 28.11.2015
			'btnRename'    : 'Rename',      // from v2.1.24 added 6.4.2017
			'btnRenameAll' : 'Rename(All)', // from v2.1.24 added 6.4.2017
			'btnPrevious' : 'Prev ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnNext'     : 'Next ($1/$2)', // from v2.1.24 added 11.5.2017
			'btnSaveAs'   : 'Save As', // from v2.1.25 added 24.5.2017

			/******************************** notifications ********************************/
			'ntfopen'     : 'Open folder',
			'ntffile'     : 'Open file',
			'ntfreload'   : 'Reload folder content',
			'ntfmkdir'    : 'Creating folder',
			'ntfmkfile'   : 'Creating files',
			'ntfrm'       : 'Delete items',
			'ntfcopy'     : 'Copy items',
			'ntfmove'     : 'Move items',
			'ntfprepare'  : 'Checking existing items',
			'ntfrename'   : 'Rename files',
			'ntfupload'   : 'Uploading files',
			'ntfdownload' : 'Downloading files',
			'ntfsave'     : 'Save files',
			'ntfarchive'  : 'Creating archive',
			'ntfextract'  : 'Extracting files from archive',
			'ntfsearch'   : 'Searching files',
			'ntfresize'   : 'Resizing images',
			'ntfsmth'     : 'Doing something',
			'ntfloadimg'  : 'Loading image',
			'ntfnetmount' : 'Mounting network volume', // added 18.04.2012
			'ntfnetunmount': 'Unmounting network volume', // from v2.1 added 30.04.2012
			'ntfdim'      : 'Acquiring image dimension', // added 20.05.2013
			'ntfreaddir'  : 'Reading folder infomation', // from v2.1 added 01.07.2013
			'ntfurl'      : 'Getting URL of link', // from v2.1 added 11.03.2014
			'ntfchmod'    : 'Changing file mode', // from v2.1 added 20.6.2015
			'ntfpreupload': 'Verifying upload file name', // from v2.1 added 31.11.2015
			'ntfzipdl'    : 'Creating a file for download', // from v2.1.7 added 23.1.2016
			'ntfparents'  : 'Getting path infomation', // from v2.1.17 added 2.11.2016
			'ntfchunkmerge': 'Processing the uploaded file', // from v2.1.17 added 2.11.2016
			'ntftrash'    : 'Doing throw in the trash', // from v2.1.24 added 2.5.2017
			'ntfrestore'  : 'Doing restore from the trash', // from v2.1.24 added 3.5.2017
			'ntfchkdir'   : 'Checking destination folder', // from v2.1.24 added 3.5.2017
			'ntfundo'     : 'Undoing previous operation', // from v2.1.27 added 31.07.2017
			'ntfredo'     : 'Redoing previous undone', // from v2.1.27 added 31.07.2017
			'ntfchkcontent' : 'Checking contents', // from v2.1.41 added 3.8.2018

			/*********************************** volumes *********************************/
			'volume_Trash' : 'Trash', //from v2.1.24 added 29.4.2017

			/************************************ dates **********************************/
			'dateUnknown' : 'unknown',
			'Today'       : 'Today',
			'Yesterday'   : 'Yesterday',
			'msJan'       : 'Jan',
			'msFeb'       : 'Feb',
			'msMar'       : 'Mar',
			'msApr'       : 'Apr',
			'msMay'       : 'May',
			'msJun'       : 'Jun',
			'msJul'       : 'Jul',
			'msAug'       : 'Aug',
			'msSep'       : 'Sep',
			'msOct'       : 'Oct',
			'msNov'       : 'Nov',
			'msDec'       : 'Dec',
			'January'     : 'January',
			'February'    : 'February',
			'March'       : 'March',
			'April'       : 'April',
			'May'         : 'May',
			'June'        : 'June',
			'July'        : 'July',
			'August'      : 'August',
			'September'   : 'September',
			'October'     : 'October',
			'November'    : 'November',
			'December'    : 'December',
			'Sunday'      : 'Sunday',
			'Monday'      : 'Monday',
			'Tuesday'     : 'Tuesday',
			'Wednesday'   : 'Wednesday',
			'Thursday'    : 'Thursday',
			'Friday'      : 'Friday',
			'Saturday'    : 'Saturday',
			'Sun'         : 'Sun',
			'Mon'         : 'Mon',
			'Tue'         : 'Tue',
			'Wed'         : 'Wed',
			'Thu'         : 'Thu',
			'Fri'         : 'Fri',
			'Sat'         : 'Sat',

			/******************************** sort variants ********************************/
			'sortname'          : 'by name',
			'sortkind'          : 'by kind',
			'sortsize'          : 'by size',
			'sortdate'          : 'by date',
			'sortFoldersFirst'  : 'Folders first',
			'sortperm'          : 'by permission', // from v2.1.13 added 13.06.2016
			'sortmode'          : 'by mode',       // from v2.1.13 added 13.06.2016
			'sortowner'         : 'by owner',      // from v2.1.13 added 13.06.2016
			'sortgroup'         : 'by group',      // from v2.1.13 added 13.06.2016
			'sortAlsoTreeview'  : 'Also Treeview',  // from v2.1.15 added 01.08.2016

			/********************************** new items **********************************/
			'untitled file.txt' : 'NewFile.txt', // added 10.11.2015
			'untitled folder'   : 'NewFolder',   // added 10.11.2015
			'Archive'           : 'NewArchive',  // from v2.1 added 10.11.2015
			'untitled file'     : 'NewFile.$1',  // from v2.1.41 added 6.8.2018
			'extentionfile'     : '$1: File',    // from v2.1.41 added 6.8.2018
			'extentiontype'     : '$1: $2',      // from v2.1.43 added 17.10.2018

			/********************************** messages **********************************/
			'confirmReq'      : 'Confirmation required',
			'confirmRm'       : 'Are you sure you want to permanently remove items?<br/>This cannot be undone!',
			'confirmRepl'     : 'Replace old file with new one? (If it contains folders, it will be merged. To backup and replace, select Backup.)',
			'confirmRest'     : 'Replace existing item with the item in trash?', // fromv2.1.24 added 5.5.2017
			'confirmConvUTF8' : 'Not in UTF-8<br/>Convert to UTF-8?<br/>Contents become UTF-8 by saving after conversion.', // from v2.1 added 08.04.2014
			'confirmNonUTF8'  : 'Character encoding of this file couldn\'t be detected. It need to temporarily convert to UTF-8 for editting.<br/>Please select character encoding of this file.', // from v2.1.19 added 28.11.2016
			'confirmNotSave'  : 'It has been modified.<br/>Losing work if you do not save changes.', // from v2.1 added 15.7.2015
			'confirmTrash'    : 'Are you sure you want to move items to trash bin?', //from v2.1.24 added 29.4.2017
			'apllyAll'        : 'Apply to all',
			'name'            : 'Name',
			'size'            : 'Size',
			'perms'           : 'Permissions',
			'modify'          : 'Modified',
			'kind'            : 'Kind',
			'read'            : 'read',
			'write'           : 'write',
			'noaccess'        : 'no access',
			'and'             : 'and',
			'unknown'         : 'unknown',
			'selectall'       : 'Select all items',
			'selectfiles'     : 'Select item(s)',
			'selectffile'     : 'Select first item',
			'selectlfile'     : 'Select last item',
			'viewlist'        : 'List view',
			'viewicons'       : 'Icons view',
			'viewSmall'       : 'Small icons', // from v2.1.39 added 22.5.2018
			'viewMedium'      : 'Medium icons', // from v2.1.39 added 22.5.2018
			'viewLarge'       : 'Large icons', // from v2.1.39 added 22.5.2018
			'viewExtraLarge'  : 'Extra large icons', // from v2.1.39 added 22.5.2018
			'places'          : 'Places',
			'calc'            : 'Calculate',
			'path'            : 'Path',
			'aliasfor'        : 'Alias for',
			'locked'          : 'Locked',
			'dim'             : 'Dimensions',
			'files'           : 'Files',
			'folders'         : 'Folders',
			'items'           : 'Items',
			'yes'             : 'yes',
			'no'              : 'no',
			'link'            : 'Link',
			'searcresult'     : 'Search results',
			'selected'        : 'selected items',
			'about'           : 'About',
			'shortcuts'       : 'Shortcuts',
			'help'            : 'Help',
			'webfm'           : 'Web file manager',
			'ver'             : 'Version',
			'protocolver'     : 'protocol version',
			'homepage'        : 'Project home',
			'docs'            : 'Documentation',
			'github'          : 'Fork us on GitHub',
			'twitter'         : 'Follow us on Twitter',
			'facebook'        : 'Join us on Facebook',
			'team'            : 'Team',
			'chiefdev'        : 'chief developer',
			'developer'       : 'developer',
			'contributor'     : 'contributor',
			'maintainer'      : 'maintainer',
			'translator'      : 'translator',
			'icons'           : 'Icons',
			'dontforget'      : 'and don\'t forget to take your towel',
			'shortcutsof'     : 'Shortcuts disabled',
			'dropFiles'       : 'Drop files here',
			'or'              : 'or',
			'selectForUpload' : 'Select files',
			'moveFiles'       : 'Move items',
			'copyFiles'       : 'Copy items',
			'restoreFiles'    : 'Restore items', // from v2.1.24 added 5.5.2017
			'rmFromPlaces'    : 'Remove from places',
			'aspectRatio'     : 'Aspect ratio',
			'scale'           : 'Scale',
			'width'           : 'Width',
			'height'          : 'Height',
			'resize'          : 'Resize',
			'crop'            : 'Crop',
			'rotate'          : 'Rotate',
			'rotate-cw'       : 'Rotate 90 degrees CW',
			'rotate-ccw'      : 'Rotate 90 degrees CCW',
			'degree'          : '°',
			'netMountDialogTitle' : 'Mount network volume', // added 18.04.2012
			'protocol'            : 'Protocol', // added 18.04.2012
			'host'                : 'Host', // added 18.04.2012
			'port'                : 'Port', // added 18.04.2012
			'user'                : 'User', // added 18.04.2012
			'pass'                : 'Password', // added 18.04.2012
			'confirmUnmount'      : 'Are you sure to unmount $1?',  // from v2.1 added 30.04.2012
			'dropFilesBrowser': 'Drop or Paste files from browser', // from v2.1 added 30.05.2012
			'dropPasteFiles'  : 'Drop files, Paste URLs or images(clipboard) here', // from v2.1 added 07.04.2014
			'encoding'        : 'Encoding', // from v2.1 added 19.12.2014
			'locale'          : 'Locale',   // from v2.1 added 19.12.2014
			'searchTarget'    : 'Target: $1',                // from v2.1 added 22.5.2015
			'searchMime'      : 'Search by input MIME Type', // from v2.1 added 22.5.2015
			'owner'           : 'Owner', // from v2.1 added 20.6.2015
			'group'           : 'Group', // from v2.1 added 20.6.2015
			'other'           : 'Other', // from v2.1 added 20.6.2015
			'execute'         : 'Execute', // from v2.1 added 20.6.2015
			'perm'            : 'Permission', // from v2.1 added 20.6.2015
			'mode'            : 'Mode', // from v2.1 added 20.6.2015
			'emptyFolder'     : 'Folder is empty', // from v2.1.6 added 30.12.2015
			'emptyFolderDrop' : 'Folder is empty\\A Drop to add items', // from v2.1.6 added 30.12.2015
			'emptyFolderLTap' : 'Folder is empty\\A Long tap to add items', // from v2.1.6 added 30.12.2015
			'quality'         : 'Quality', // from v2.1.6 added 5.1.2016
			'autoSync'        : 'Auto sync',  // from v2.1.6 added 10.1.2016
			'moveUp'          : 'Move up',  // from v2.1.6 added 18.1.2016
			'getLink'         : 'Get URL link', // from v2.1.7 added 9.2.2016
			'selectedItems'   : 'Selected items ($1)', // from v2.1.7 added 2.19.2016
			'folderId'        : 'Folder ID', // from v2.1.10 added 3.25.2016
			'offlineAccess'   : 'Allow offline access', // from v2.1.10 added 3.25.2016
			'reAuth'          : 'To re-authenticate', // from v2.1.10 added 3.25.2016
			'nowLoading'      : 'Now loading...', // from v2.1.12 added 4.26.2016
			'openMulti'       : 'Open multiple files', // from v2.1.12 added 5.14.2016
			'openMultiConfirm': 'You are trying to open the $1 files. Are you sure you want to open in browser?', // from v2.1.12 added 5.14.2016
			'emptySearch'     : 'Search results is empty in search target.', // from v2.1.12 added 5.16.2016
			'editingFile'     : 'It is editing a file.', // from v2.1.13 added 6.3.2016
			'hasSelected'     : 'You have selected $1 items.', // from v2.1.13 added 6.3.2016
			'hasClipboard'    : 'You have $1 items in the clipboard.', // from v2.1.13 added 6.3.2016
			'incSearchOnly'   : 'Incremental search is only from the current view.', // from v2.1.13 added 6.30.2016
			'reinstate'       : 'Reinstate', // from v2.1.15 added 3.8.2016
			'complete'        : '$1 complete', // from v2.1.15 added 21.8.2016
			'contextmenu'     : 'Context menu', // from v2.1.15 added 9.9.2016
			'pageTurning'     : 'Page turning', // from v2.1.15 added 10.9.2016
			'volumeRoots'     : 'Volume roots', // from v2.1.16 added 16.9.2016
			'reset'           : 'Reset', // from v2.1.16 added 1.10.2016
			'bgcolor'         : 'Background color', // from v2.1.16 added 1.10.2016
			'colorPicker'     : 'Color picker', // from v2.1.16 added 1.10.2016
			'8pxgrid'         : '8px Grid', // from v2.1.16 added 4.10.2016
			'enabled'         : 'Enabled', // from v2.1.16 added 4.10.2016
			'disabled'        : 'Disabled', // from v2.1.16 added 4.10.2016
			'emptyIncSearch'  : 'Search results is empty in current view.\\A Press [Enter] to expand search target.', // from v2.1.16 added 5.10.2016
			'emptyLetSearch'  : 'First letter search results is empty in current view.', // from v2.1.23 added 24.3.2017
			'textLabel'       : 'Text label', // from v2.1.17 added 13.10.2016
			'minsLeft'        : '$1 mins left', // from v2.1.17 added 13.11.2016
			'openAsEncoding'  : 'Reopen with selected encoding', // from v2.1.19 added 2.12.2016
			'saveAsEncoding'  : 'Save with the selected encoding', // from v2.1.19 added 2.12.2016
			'selectFolder'    : 'Select folder', // from v2.1.20 added 13.12.2016
			'firstLetterSearch': 'First letter search', // from v2.1.23 added 24.3.2017
			'presets'         : 'Presets', // from v2.1.25 added 26.5.2017
			'tooManyToTrash'  : 'It\'s too many items so it can\'t into trash.', // from v2.1.25 added 9.6.2017
			'TextArea'        : 'TextArea', // from v2.1.25 added 14.6.2017
			'folderToEmpty'   : 'Empty the folder "$1".', // from v2.1.25 added 22.6.2017
			'filderIsEmpty'   : 'There are no items in a folder "$1".', // from v2.1.25 added 22.6.2017
			'preference'      : 'Preference', // from v2.1.26 added 28.6.2017
			'language'        : 'Language', // from v2.1.26 added 28.6.2017
			'clearBrowserData': 'Initialize the settings saved in this browser', // from v2.1.26 added 28.6.2017
			'toolbarPref'     : 'Toolbar settings', // from v2.1.27 added 2.8.2017
			'charsLeft'       : '... $1 chars left.',  // from v2.1.29 added 30.8.2017
			'sum'             : 'Sum', // from v2.1.29 added 28.9.2017
			'roughFileSize'   : 'Rough file size', // from v2.1.30 added 2.11.2017
			'autoFocusDialog' : 'Focus on the element of dialog with mouseover',  // from v2.1.30 added 2.11.2017
			'select'          : 'Select', // from v2.1.30 added 23.11.2017
			'selectAction'    : 'Action when select file', // from v2.1.30 added 23.11.2017
			'useStoredEditor' : 'Open with the editor used last time', // from v2.1.30 added 23.11.2017
			'selectinvert'    : 'Invert selection', // from v2.1.30 added 25.11.2017
			'renameMultiple'  : 'Are you sure you want to rename $1 selected items like $2?<br/>This cannot be undone!', // from v2.1.31 added 4.12.2017
			'batchRename'     : 'Batch rename', // from v2.1.31 added 8.12.2017
			'plusNumber'      : '+ Number', // from v2.1.31 added 8.12.2017
			'asPrefix'        : 'Add prefix', // from v2.1.31 added 8.12.2017
			'asSuffix'        : 'Add suffix', // from v2.1.31 added 8.12.2017
			'changeExtention' : 'Change extention', // from v2.1.31 added 8.12.2017
			'columnPref'      : 'Columns settings (List view)', // from v2.1.32 added 6.2.2018
			'reflectOnImmediate' : 'All changes will reflect immediately to the archive.', // from v2.1.33 added 2.3.2018
			'reflectOnUnmount'   : 'Any changes will not reflect until un-mount this volume.', // from v2.1.33 added 2.3.2018
			'unmountChildren' : 'The following volume(s) mounted on this volume also unmounted. Are you sure to unmount it?', // from v2.1.33 added 5.3.2018
			'selectionInfo'   : 'Selection Info', // from v2.1.33 added 7.3.2018
			'hashChecker'     : 'Algorithms to show the file hash', // from v2.1.33 added 10.3.2018
			'infoItems'       : 'Info Items (Selection Info Panel)', // from v2.1.38 added 28.3.2018
			'pressAgainToExit': 'Press again to exit.', // from v2.1.38 added 1.4.2018
			'toolbar'         : 'Toolbar', // from v2.1.38 added 4.4.2018
			'workspace'       : 'Work Space', // from v2.1.38 added 4.4.2018
			'dialog'          : 'Dialog', // from v2.1.38 added 4.4.2018
			'all'             : 'All', // from v2.1.38 added 4.4.2018
			'iconSize'        : 'Icon Size (Icons view)', // from v2.1.39 added 7.5.2018
			'editorMaximized' : 'Open the maximized editor window', // from v2.1.40 added 30.6.2018
			'editorConvNoApi' : 'Because conversion by API is not currently available, please convert on the website.', //from v2.1.40 added 8.7.2018
			'editorConvNeedUpload' : 'After conversion, you must be upload with the item URL or a downloaded file to save the converted file.', //from v2.1.40 added 8.7.2018
			'convertOn'       : 'Convert on the site of $1', // from v2.1.40 added 10.7.2018
			'integrations'    : 'Integrations', // from v2.1.40 added 11.7.2018
			'integrationWith' : 'This elFinder has the following external services integrated. Please check the terms of use, privacy policy, etc. before using it.', // from v2.1.40 added 11.7.2018
			'showHidden'      : 'Show hidden items', // from v2.1.41 added 24.7.2018
			'hideHidden'      : 'Hide hidden items', // from v2.1.41 added 24.7.2018
			'toggleHidden'    : 'Show/Hide hidden items', // from v2.1.41 added 24.7.2018
			'makefileTypes'   : 'File types to enable with "New file"', // from v2.1.41 added 7.8.2018
			'typeOfTextfile'  : 'Type of the Text file', // from v2.1.41 added 7.8.2018
			'add'             : 'Add', // from v2.1.41 added 7.8.2018
			'theme'           : 'Theme', // from v2.1.43 added 19.10.2018
			'default'         : 'Default', // from v2.1.43 added 19.10.2018
			'description'     : 'Description', // from v2.1.43 added 19.10.2018
			'website'         : 'Website', // from v2.1.43 added 19.10.2018
			'author'          : 'Author', // from v2.1.43 added 19.10.2018
			'email'           : 'Email', // from v2.1.43 added 19.10.2018
			'license'         : 'License', // from v2.1.43 added 19.10.2018
			'exportToSave'    : 'This item can\'t be saved. To avoid losing the edits you need to export to your PC.', // from v2.1.44 added 1.12.2018

			/********************************** mimetypes **********************************/
			'kindUnknown'     : 'Unknown',
			'kindRoot'        : 'Volume Root', // from v2.1.16 added 16.10.2016
			'kindFolder'      : 'Folder',
			'kindSelects'     : 'Selections', // from v2.1.29 added 29.8.2017
			'kindAlias'       : 'Alias',
			'kindAliasBroken' : 'Broken alias',
			// applications
			'kindApp'         : 'Application',
			'kindPostscript'  : 'Postscript document',
			'kindMsOffice'    : 'Microsoft Office document',
			'kindMsWord'      : 'Microsoft Word document',
			'kindMsExcel'     : 'Microsoft Excel document',
			'kindMsPP'        : 'Microsoft Powerpoint presentation',
			'kindOO'          : 'Open Office document',
			'kindAppFlash'    : 'Flash application',
			'kindPDF'         : 'Portable Document Format (PDF)',
			'kindTorrent'     : 'Bittorrent file',
			'kind7z'          : '7z archive',
			'kindTAR'         : 'TAR archive',
			'kindGZIP'        : 'GZIP archive',
			'kindBZIP'        : 'BZIP archive',
			'kindXZ'          : 'XZ archive',
			'kindZIP'         : 'ZIP archive',
			'kindRAR'         : 'RAR archive',
			'kindJAR'         : 'Java JAR file',
			'kindTTF'         : 'True Type font',
			'kindOTF'         : 'Open Type font',
			'kindRPM'         : 'RPM package',
			// texts
			'kindText'        : 'Text document',
			'kindTextPlain'   : 'Plain text',
			'kindPHP'         : 'PHP source',
			'kindCSS'         : 'Cascading style sheet',
			'kindHTML'        : 'HTML document',
			'kindJS'          : 'Javascript source',
			'kindRTF'         : 'Rich Text Format',
			'kindC'           : 'C source',
			'kindCHeader'     : 'C header source',
			'kindCPP'         : 'C++ source',
			'kindCPPHeader'   : 'C++ header source',
			'kindShell'       : 'Unix shell script',
			'kindPython'      : 'Python source',
			'kindJava'        : 'Java source',
			'kindRuby'        : 'Ruby source',
			'kindPerl'        : 'Perl script',
			'kindSQL'         : 'SQL source',
			'kindXML'         : 'XML document',
			'kindAWK'         : 'AWK source',
			'kindCSV'         : 'Comma separated values',
			'kindDOCBOOK'     : 'Docbook XML document',
			'kindMarkdown'    : 'Markdown text', // added 20.7.2015
			// images
			'kindImage'       : 'Image',
			'kindBMP'         : 'BMP image',
			'kindJPEG'        : 'JPEG image',
			'kindGIF'         : 'GIF Image',
			'kindPNG'         : 'PNG Image',
			'kindTIFF'        : 'TIFF image',
			'kindTGA'         : 'TGA image',
			'kindPSD'         : 'Adobe Photoshop image',
			'kindXBITMAP'     : 'X bitmap image',
			'kindPXM'         : 'Pixelmator image',
			// media
			'kindAudio'       : 'Audio media',
			'kindAudioMPEG'   : 'MPEG audio',
			'kindAudioMPEG4'  : 'MPEG-4 audio',
			'kindAudioMIDI'   : 'MIDI audio',
			'kindAudioOGG'    : 'Ogg Vorbis audio',
			'kindAudioWAV'    : 'WAV audio',
			'AudioPlaylist'   : 'MP3 playlist',
			'kindVideo'       : 'Video media',
			'kindVideoDV'     : 'DV movie',
			'kindVideoMPEG'   : 'MPEG movie',
			'kindVideoMPEG4'  : 'MPEG-4 movie',
			'kindVideoAVI'    : 'AVI movie',
			'kindVideoMOV'    : 'Quick Time movie',
			'kindVideoWM'     : 'Windows Media movie',
			'kindVideoFlash'  : 'Flash movie',
			'kindVideoMKV'    : 'Matroska movie',
			'kindVideoOGG'    : 'Ogg movie'
		}
	};
}



/*
 * File: /js/ui/button.js
 */

/**
 * @class  elFinder toolbar button widget.
 * If command has variants - create menu
 *
 * @author Dmitry (dio) Levashov
 **/
jQuery.fn.elfinderbutton = function(cmd) {
		return this.each(function() {
		
		var c        = 'class',
			fm       = cmd.fm,
			disabled = fm.res(c, 'disabled'),
			active   = fm.res(c, 'active'),
			hover    = fm.res(c, 'hover'),
			item     = 'elfinder-button-menu-item',
			selected = 'elfinder-button-menu-item-selected',
			menu,
			text     = jQuery('<span class="elfinder-button-text">'+cmd.title+'</span>'),
			prvCname = 'elfinder-button-icon-' + (cmd.className? cmd.className : cmd.name),
			button   = jQuery(this).addClass('ui-state-default elfinder-button')
				.attr('title', cmd.title)
				.append('<span class="elfinder-button-icon ' + prvCname + '"/>', text)
				.on('mouseenter mouseleave', function(e) { !button.hasClass(disabled) && button[e.type == 'mouseleave' ? 'removeClass' : 'addClass'](hover);})
				.on('click', function(e) { 
					if (!button.hasClass(disabled)) {
						if (menu && cmd.variants.length >= 1) {
							// close other menus
							menu.is(':hidden') && fm.getUI().click();
							e.stopPropagation();
							menu.css(getMenuOffset()).slideToggle({
								duration: 100,
								done: function(e) {
									fm[menu.is(':visible')? 'toFront' : 'toHide'](menu);
								}
							});
						} else {
							fm.exec(cmd.name, getSelected(), {_userAction: true, _currentType: 'toolbar', _currentNode: button });
						}
						
					}
				}),
			hideMenu = function() {
				fm.toHide(menu);
			},
			getMenuOffset = function() {
				var fmNode = fm.getUI(),
					baseOffset = fmNode.offset(),
					buttonOffset = button.offset();
				return {
					top : buttonOffset.top - baseOffset.top,
					left : buttonOffset.left - baseOffset.left,
					maxHeight : fmNode.height() - 40
				};
			},
			getSelected = function() {
				var sel = fm.selected(),
					cwd;
				if (!sel.length) {
					if (cwd = fm.cwd()) {
						sel = [ fm.cwd().hash ];
					} else {
						sel = void(0);
					}
				}
				return sel;
			},
			tm;
			
		text.hide();
		
		// set self button object to cmd object
		cmd.button = button;
		
		// if command has variants create menu
		if (Array.isArray(cmd.variants)) {
			button.addClass('elfinder-menubutton');
			
			menu = jQuery('<div class="ui-front ui-widget ui-widget-content elfinder-button-menu ui-corner-all"/>')
				.hide()
				.appendTo(fm.getUI())
				.on('mouseenter mouseleave', '.'+item, function() { jQuery(this).toggleClass(hover); })
				.on('click', '.'+item, function(e) {
					var opts = jQuery(this).data('value');
					e.preventDefault();
					e.stopPropagation();
					button.removeClass(hover);
					fm.toHide(menu);
					if (typeof opts === 'undefined') {
						opts = {};
					}
					if (typeof opts === 'object') {
						opts._userAction = true;
					}
					fm.exec(cmd.name, getSelected(), opts);
				})
				.on('close', hideMenu);

			fm.bind('disable select', hideMenu).getUI().on('click', hideMenu);
			
			cmd.change(function() {
				menu.html('');
				jQuery.each(cmd.variants, function(i, variant) {
					menu.append(jQuery('<div class="'+item+'">'+variant[1]+'</div>').data('value', variant[0]).addClass(variant[0] == cmd.value ? selected : ''));
				});
			});
		}	
			
		cmd.change(function() {
			var cName;
			tm && cancelAnimationFrame(tm);
			tm = requestAnimationFrame(function() {
				if (cmd.disabled()) {
					button.removeClass(active+' '+hover).addClass(disabled);
				} else {
					button.removeClass(disabled);
					button[cmd.active() ? 'addClass' : 'removeClass'](active);
				}
				if (cmd.syncTitleOnChange) {
					cName = 'elfinder-button-icon-' + (cmd.className? cmd.className : cmd.name);
					if (prvCname !== cName) {
						button.children('.elfinder-button-icon').removeClass(prvCname).addClass(cName);
						prvCname = cName;
					}
					text.html(cmd.title);
					button.attr('title', cmd.title);
				}
			});
		})
		.change();
	});
};


/*
 * File: /js/ui/contextmenu.js
 */

/**
 * @class  elFinder contextmenu
 *
 * @author Dmitry (dio) Levashov
 **/
jQuery.fn.elfindercontextmenu = function(fm) {
		return this.each(function() {
		var self   = jQuery(this),
			cmItem = 'elfinder-contextmenu-item',
			smItem = 'elfinder-contextsubmenu-item',
			exIcon = 'elfinder-contextmenu-extra-icon',
			cHover = fm.res('class', 'hover'),
			dragOpt = {
				distance: 8,
				start: function() {
					menu.data('drag', true).data('touching') && menu.find('.'+cHover).removeClass(cHover);
				},
				stop: function() {
					menu.data('draged', true).removeData('drag');
				}
			},
			menu = jQuery(this).addClass('touch-punch ui-helper-reset ui-front ui-widget ui-state-default ui-corner-all elfinder-contextmenu elfinder-contextmenu-'+fm.direction)
				.hide()
				.on('touchstart', function(e) {
					menu.data('touching', true).children().removeClass(cHover);
				})
				.on('touchend', function(e) {
					menu.removeData('touching');
				})
				.on('mouseenter mouseleave', '.'+cmItem, function(e) {
					jQuery(this).toggleClass(cHover, (e.type === 'mouseenter' || (! menu.data('draged') && menu.data('submenuKeep'))? true : false));
					if (menu.data('draged') && menu.data('submenuKeep')) {
						menu.find('.elfinder-contextmenu-sub:visible').parent().addClass(cHover);
					}
				})
				.on('mouseenter mouseleave', '.'+exIcon, function(e) {
					jQuery(this).parent().toggleClass(cHover, e.type === 'mouseleave');
				})
				.on('mouseenter mouseleave', '.'+cmItem+',.'+smItem, function(e) {
					var setIndex = function(target, sub) {
						jQuery.each(sub? subnodes : nodes, function(i, n) {
							if (target[0] === n) {
								(sub? subnodes : nodes)._cur = i;
								if (sub) {
									subselected = target;
								} else {
									selected = target;
								}
								return false;
							}
						});
					};
					if (e.originalEvent) {
						var target = jQuery(this),
							unHover = function() {
								if (selected && !selected.children('div.elfinder-contextmenu-sub:visible').length) {
									selected.removeClass(cHover);
								}
							};
						if (e.type === 'mouseenter') {
							// mouseenter
							if (target.hasClass(smItem)) {
								// submenu
								if (subselected) {
									subselected.removeClass(cHover);
								}
								if (selected) {
									subnodes = selected.find('div.'+smItem);
								}
								setIndex(target, true);
							} else {
								// menu
								unHover();
								setIndex(target);
							}
						} else {
							// mouseleave
							if (target.hasClass(smItem)) {
								//submenu
								subselected = null;
								subnodes = null;
							} else {
								// menu
								unHover();
								(function(sel) {
									setTimeout(function() {
										if (sel === selected) {
											selected = null;
										}
									}, 250);
								})(selected);
							}
						}
					}
				})
				.on('contextmenu', function(){return false;})
				.on('mouseup', function() {
					setTimeout(function() {
						menu.removeData('draged');
					}, 100);
				})
				.draggable(dragOpt),
			ltr = fm.direction === 'ltr',
			subpos = ltr? 'left' : 'right',
			types = Object.assign({}, fm.options.contextmenu),
			tpl     = '<div class="'+cmItem+'{className}"><span class="elfinder-button-icon {icon} elfinder-contextmenu-icon"{style}/><span>{label}</span></div>',
			item = function(label, icon, callback, opts) {
				var className = '',
					style = '',
					iconClass = '',
					v, pos;
				if (opts) {
					if (opts.className) {
						className = ' ' + opts.className;
					}
					if (opts.iconClass) {
						iconClass = opts.iconClass;
						icon = '';
					}
					if (opts.iconImg) {
						v = opts.iconImg.split(/ +/);
						pos = v[1] && v[2]? fm.escape(v[1] + 'px ' + v[2] + 'px') : '';
						style = ' style="background:url(\''+fm.escape(v[0])+'\') '+(pos? pos : '0 0')+' no-repeat;'+(pos? '' : 'posbackground-size:contain;')+'"';
					}
				}
				return jQuery(tpl.replace('{icon}', icon ? 'elfinder-button-icon-'+icon : (iconClass? iconClass : ''))
						.replace('{label}', label)
						.replace('{style}', style)
						.replace('{className}', className))
					.on('click', function(e) {
						e.stopPropagation();
						e.preventDefault();
						callback();
					});
			},
			urlIcon = function(iconUrl) {
				var v = iconUrl.split(/ +/),
					pos = v[1] && v[2]? (v[1] + 'px ' + v[2] + 'px') : '';
				return {
					backgroundImage: 'url("'+v[0]+'")',
					backgroundRepeat: 'no-repeat',
					backgroundPosition: pos? pos : '',
					backgroundSize: pos? '' : 'contain'
				};
			},
			base, cwd,
			nodes, selected, subnodes, subselected, autoSyncStop, subHoverTm,

			autoToggle = function() {
				var evTouchStart = 'touchstart.contextmenuAutoToggle';
				menu.data('hideTm') && clearTimeout(menu.data('hideTm'));
				if (menu.is(':visible')) {
					menu.on('touchstart', function(e) {
						if (e.originalEvent.touches.length > 1) {
							return;
						}
						menu.stop();
						fm.toFront(menu);
						menu.data('hideTm') && clearTimeout(menu.data('hideTm'));
					})
					.data('hideTm', setTimeout(function() {
						if (menu.is(':visible')) {
							cwd.find('.elfinder-cwd-file').off(evTouchStart);
							cwd.find('.elfinder-cwd-file.ui-selected')
							.one(evTouchStart, function(e) {
								if (e.originalEvent.touches.length > 1) {
									return;
								}
								var tgt = jQuery(e.target);
								if (menu.first().length && !tgt.is('input:checkbox') && !tgt.hasClass('elfinder-cwd-select')) {
									e.stopPropagation();
									//e.preventDefault();
									open(e.originalEvent.touches[0].pageX, e.originalEvent.touches[0].pageY);
									cwd.data('longtap', true)
									tgt.one('touchend', function() {
										setTimeout(function() {
											cwd.removeData('longtap');
										}, 80);
									});
									return;
								}
								cwd.find('.elfinder-cwd-file').off(evTouchStart);
							})
							.one('unselect.'+fm.namespace, function() {
								cwd.find('.elfinder-cwd-file').off(evTouchStart);
							});
							menu.fadeOut({
								duration: 300,
								fail: function() {
									menu.css('opacity', '1').show();
								},
								done: function() {
									fm.toHide(menu);
								}
							});
						}
					}, 4500));
				}
			},
			
			keyEvts = function(e) {
				var code = e.keyCode,
					ESC = jQuery.ui.keyCode.ESCAPE,
					ENT = jQuery.ui.keyCode.ENTER,
					LEFT = jQuery.ui.keyCode.LEFT,
					RIGHT = jQuery.ui.keyCode.RIGHT,
					UP = jQuery.ui.keyCode.UP,
					DOWN = jQuery.ui.keyCode.DOWN,
					subent = fm.direction === 'ltr'? RIGHT : LEFT,
					sublev = subent === RIGHT? LEFT : RIGHT;
				
				if (jQuery.inArray(code, [ESC, ENT, LEFT, RIGHT, UP, DOWN]) !== -1) {
					e.preventDefault();
					e.stopPropagation();
					e.stopImmediatePropagation();
					if (code == ESC || code === sublev) {
						if (selected && subnodes && subselected) {
							subselected.trigger('mouseleave').trigger('submenuclose');
							selected.addClass(cHover);
							subnodes = null;
							subselected = null;
						} else {
							code == ESC && close();
						}
					} else if (code == UP || code == DOWN) {
						if (subnodes) {
							if (subselected) {
								subselected.trigger('mouseleave');
							}
							if (code == DOWN && (! subselected || subnodes.length <= ++subnodes._cur)) {
								subnodes._cur = 0;
							} else if (code == UP && (! subselected || --subnodes._cur < 0)) {
								subnodes._cur = subnodes.length - 1;
							}
							subselected = subnodes.eq(subnodes._cur).trigger('mouseenter');
						} else {
							subnodes = null;
							if (selected) {
								selected.trigger('mouseleave');
							}
							if (code == DOWN && (! selected || nodes.length <= ++nodes._cur)) {
								nodes._cur = 0;
							} else if (code == UP && (! selected || --nodes._cur < 0)) {
								nodes._cur = nodes.length - 1;
							}
							selected = nodes.eq(nodes._cur).addClass(cHover);
						}
					} else if (selected && (code == ENT || code === subent)) {
						if (selected.hasClass('elfinder-contextmenu-group')) {
							if (subselected) {
								code == ENT && subselected.click();
							} else {
								selected.trigger('mouseenter');
								subnodes = selected.find('div.'+smItem);
								subnodes._cur = 0;
								subselected = subnodes.first().addClass(cHover);
							}
						} else {
							code == ENT && selected.click();
						}
					}
				}
			},
			
			open = function(x, y, css) {
				var width      = menu.outerWidth(),
					height     = menu.outerHeight(),
					bstyle     = base.attr('style'),
					bpos       = base.offset(),
					bwidth     = base.width(),
					bheight    = base.height(),
					mw         = fm.UA.Mobile? 40 : 2,
					mh         = fm.UA.Mobile? 20 : 2,
					x          = x - (bpos? bpos.left : 0),
					y          = y - (bpos? bpos.top : 0),
					css        = Object.assign(css || {}, {
						top  : Math.max(0, y + mh + height < bheight ? y + mh : y - (y + height - bheight)),
						left : Math.max(0, (x < width + mw || x + mw + width < bwidth)? x + mw : x - mw - width),
						opacity : '1'
					}),
					evts;

				autoSyncStop = true;
				fm.autoSync('stop');
				base.width(bwidth);
				menu.stop().removeAttr('style').css(css);
				fm.toFront(menu);
				menu.show();
				base.attr('style', bstyle);
				
				css[subpos] = parseInt(menu.width());
				menu.find('.elfinder-contextmenu-sub').css(css);
				if (fm.UA.iOS) {
					jQuery('div.elfinder div.overflow-scrolling-touch').css('-webkit-overflow-scrolling', 'auto');
				}
				
				selected = null;
				subnodes = null;
				subselected = null;
				jQuery(document).on('keydown.' + fm.namespace, keyEvts);
				evts = jQuery._data(document).events;
				if (evts && evts.keydown) {
					evts.keydown.unshift(evts.keydown.pop());
				}
				
				fm.UA.Mobile && autoToggle();
				
				requestAnimationFrame(function() {
					fm.getUI().one('click.' + fm.namespace, close);
				});
			},
			
			close = function() {
				fm.getUI().off('click.' + fm.namespace, close);
				jQuery(document).off('keydown.' + fm.namespace, keyEvts);

				currentType = currentTargets = null;
				
				if (menu.is(':visible') || menu.children().length) {
					fm.toHide(menu.removeAttr('style').empty().removeData('submenuKeep'));
					try {
						if (! menu.draggable('instance')) {
							menu.draggable(dragOpt);
						}
					} catch(e) {
						if (! menu.hasClass('ui-draggable')) {
							menu.draggable(dragOpt);
						}
					}
					if (menu.data('prevNode')) {
						menu.data('prevNode').after(menu);
						menu.removeData('prevNode');
					}
					fm.trigger('closecontextmenu');
					if (fm.UA.iOS) {
						jQuery('div.elfinder div.overflow-scrolling-touch').css('-webkit-overflow-scrolling', 'touch');
					}
				}
				
				autoSyncStop && fm.searchStatus.state < 1 && ! fm.searchStatus.ininc && fm.autoSync();
				autoSyncStop = false;
			},
			
			create = function(type, targets) {
				var sep    = false,
					insSep = false,
					disabled = [],
					isCwd = type === 'cwd',
					selcnt = 0,
					cmdMap;

				currentType = type;
				currentTargets = targets;
				
				// get current uiCmdMap option
				if (!(cmdMap = fm.option('uiCmdMap', isCwd? void(0) : targets[0]))) {
					cmdMap = {};
				}
				
				if (!isCwd) {
					disabled = fm.getDisabledCmds(targets);
				}
				
				selcnt = fm.selected().length;
				if (selcnt > 1) {
					menu.append('<div class="ui-corner-top ui-widget-header elfinder-contextmenu-header"><span>'
					 + fm.i18n('selectedItems', ''+selcnt)
					 + '</span></div>');
				}
				
				nodes = jQuery();
				jQuery.each(types[type]||[], function(i, name) {
					var cmd, cmdName, useMap, node, submenu, hover;
					
					if (name === '|') {
						if (sep) {
							insSep = true;
						}
						return;
					}
					
					if (cmdMap[name]) {
						cmdName = cmdMap[name];
						useMap = true;
					} else {
						cmdName = name;
					}
					cmd = fm.getCommand(cmdName);

					if (cmd && !isCwd && (!fm.searchStatus.state || !cmd.disableOnSearch)) {
						cmd.__disabled = cmd._disabled;
						cmd._disabled = !(cmd.alwaysEnabled || (fm._commands[cmdName] ? jQuery.inArray(name, disabled) === -1 && (!useMap || !disabled[cmdName]) : false));
						jQuery.each(cmd.linkedCmds, function(i, n) {
							var c;
							if (c = fm.getCommand(n)) {
								c.__disabled = c._disabled;
								c._disabled = !(c.alwaysEnabled || (fm._commands[n] ? !disabled[n] : false));
							}
						});
					}

					if (cmd && !cmd._disabled && cmd.getstate(targets) != -1) {
						if (cmd.variants) {
							if (!cmd.variants.length) {
								return;
							}
							node = item(cmd.title, cmd.className? cmd.className : cmd.name, function(){}, cmd.contextmenuOpts);
							
							submenu = jQuery('<div class="ui-front ui-corner-all elfinder-contextmenu-sub"/>')
								.hide()
								.css('max-height', fm.getUI().height() - 30)
								.appendTo(node.append('<span class="elfinder-contextmenu-arrow"/>'));
							
							hover = function(show){
								if (! show) {
									submenu.hide();
								} else {
									var bstyle = base.attr('style');
									base.width(base.width());
									// top: '-1000px' to prevent visible scrollbar of window with the elFinder option `height: '100%'`
									submenu.css({ top: '-1000px', left: 'auto', right: 'auto' });
									var nodeOffset = node.offset(),
										nodeleft   = nodeOffset.left,
										nodetop    = nodeOffset.top,
										nodewidth  = node.outerWidth(),
										width      = submenu.outerWidth(true),
										height     = submenu.outerHeight(true),
										baseOffset = base.offset(),
										wwidth     = baseOffset.left + base.width(),
										wheight    = baseOffset.top + base.height(),
										cltr       = ltr, 
										x          = nodewidth,
										y, over;
	
									if (ltr) {
										over = (nodeleft + nodewidth + width) - wwidth;
										if (over > 10) {
											if (nodeleft > width - 5) {
												x = x - 5;
												cltr = false;
											} else {
												if (!fm.UA.Mobile) {
													x = nodewidth - over;
												}
											}
										}
									} else {
										over = width - nodeleft;
										if (over > 0) {
											if ((nodeleft + nodewidth + width - 15) < wwidth) {
												x = x - 5;
												cltr = true;
											} else {
												if (!fm.UA.Mobile) {
													x = nodewidth - over;
												}
											}
										}
									}
									over = (nodetop + 5 + height) - wheight;
									y = (over > 0 && nodetop < wheight)? 5 - over : (over > 0? 30 - height : 5);
	
									menu.find('.elfinder-contextmenu-sub:visible').hide();
									submenu.css({
										top : y,
										left : cltr? x : 'auto',
										right: cltr? 'auto' : x,
										overflowY: 'auto'
									}).show();
									base.attr('style', bstyle);
								}
							};
							
							node.addClass('elfinder-contextmenu-group')
								.on('mouseleave', '.elfinder-contextmenu-sub', function(e) {
									if (! menu.data('draged')) {
										menu.removeData('submenuKeep');
									}
								})
								.on('submenuclose', '.elfinder-contextmenu-sub', function(e) {
									hover(false);
								})
								.on('click', '.'+smItem, function(e){
									var opts, $this;
									e.stopPropagation();
									if (! menu.data('draged')) {
										$this = jQuery(this);
										if (!cmd.keepContextmenu) {
											menu.hide();
										} else {
											$this.removeClass(cHover);
											node.addClass(cHover);
										}
										opts = $this.data('exec');
										if (typeof opts === 'undefined') {
											opts = {};
										}
										if (typeof opts === 'object') {
											opts._userAction = true;
											opts._currentType = type;
											opts._currentNode = $this;
										}
										!cmd.keepContextmenu && close();
										fm.exec(cmd.name, targets, opts);
									}
								})
								.on('touchend', function(e) {
									if (! menu.data('drag')) {
										hover(true);
										menu.data('submenuKeep', true);
									}
								})
								.on('mouseenter mouseleave', function(e){
									if (! menu.data('touching')) {
										if (node.data('timer')) {
											clearTimeout(node.data('timer'));
											node.removeData('timer');
										}
										if (!jQuery(e.target).closest('.elfinder-contextmenu-sub', menu).length) {
											if (e.type === 'mouseleave') {
												if (! menu.data('submenuKeep')) {
													node.data('timer', setTimeout(function() {
														node.removeData('timer');
														hover(false);
													}, 250));
												}
											} else {
												node.data('timer', setTimeout(function() {
													node.removeData('timer');
													hover(true);
												}, nodes.find('div.elfinder-contextmenu-sub:visible').length? 250 : 0));
											}
										}
									}
								});
							
							jQuery.each(cmd.variants, function(i, variant) {
								var item = variant === '|' ? '<div class="elfinder-contextmenu-separator"/>' :
									jQuery('<div class="'+cmItem+' '+smItem+'"><span>'+variant[1]+'</span></div>').data('exec', variant[0]),
									iconClass, icon;
								if (typeof variant[2] !== 'undefined') {
									icon = jQuery('<span/>').addClass('elfinder-button-icon elfinder-contextmenu-icon');
									if (! /\//.test(variant[2])) {
										icon.addClass('elfinder-button-icon-'+variant[2]);
									} else {
										icon.css(urlIcon(variant[2]));
									}
									item.prepend(icon).addClass(smItem+'-icon');
								}
								submenu.append(item);
							});
								
						} else {
							node = item(cmd.title, cmd.className? cmd.className : cmd.name, function() {
								if (! menu.data('draged')) {
									!cmd.keepContextmenu && close();
									fm.exec(cmd.name, targets, {_userAction: true, _currentType: type, _currentNode: node});
								}
							}, cmd.contextmenuOpts);
							if (cmd.extra && cmd.extra.node) {
								jQuery('<span class="elfinder-button-icon elfinder-button-icon-'+(cmd.extra.icon || '')+' '+exIcon+'"/>')
									.append(cmd.extra.node).appendTo(node);
								jQuery(cmd.extra.node).trigger('ready', {targets: targets});
							} else {
								node.remove('.'+exIcon);
							}
						}
						
						if (cmd.extendsCmd) {
							node.children('span.elfinder-button-icon').addClass('elfinder-button-icon-' + cmd.extendsCmd);
						}
						
						if (insSep) {
							menu.append('<div class="elfinder-contextmenu-separator"/>');
						}
						menu.append(node);
						sep = true;
						insSep = false;
					}
					
					if (cmd && typeof cmd.__disabled !== 'undefined') {
						cmd._disabled = cmd.__disabled;
						delete cmd.__disabled;
						jQuery.each(cmd.linkedCmds, function(i, n) {
							var c;
							if (c = fm.getCommand(n)) {
								c._disabled = c.__disabled;
								delete c.__disabled;
							}
						});
					}
				});
				nodes = menu.children('div.'+cmItem);
			},
			
			createFromRaw = function(raw) {
				currentType = 'raw';
				jQuery.each(raw, function(i, data) {
					var node;
					
					if (data === '|') {
						menu.append('<div class="elfinder-contextmenu-separator"/>');
					} else if (data.label && typeof data.callback == 'function') {
						node = item(data.label, data.icon, function() {
							if (! menu.data('draged')) {
								!data.remain && close();
								data.callback();
							}
						}, data.options || null);
						menu.append(node);
					}
				});
				nodes = menu.children('div.'+cmItem);
			},
			
			currentType = null,
			currentTargets = null;
		
		fm.one('load', function() {
			base = fm.getUI();
			cwd = fm.getUI('cwd');
			fm.bind('contextmenu', function(e) {
				var data = e.data,
					css = {},
					prevNode;

				if (data.type && data.type !== 'files') {
					cwd.trigger('unselectall');
				}
				close();

				if (data.type && data.targets) {
					fm.trigger('contextmenucreate', data);
					create(data.type, data.targets);
					fm.trigger('contextmenucreatedone', data);
				} else if (data.raw) {
					createFromRaw(data.raw);
				}

				if (menu.children().length) {
					prevNode = data.prevNode || null;
					if (prevNode) {
						menu.data('prevNode', menu.prev());
						prevNode.after(menu);
					}
					if (data.fitHeight) {
						css = {maxHeight: Math.min(fm.getUI().height(), jQuery(window).height()), overflowY: 'auto'};
						menu.draggable('destroy').removeClass('ui-draggable');
					}
					open(data.x, data.y, css);
					// call opened callback function
					if (data.opened && typeof data.opened === 'function') {
						data.opened.call(menu);
					}
				}
			})
			.one('destroy', function() { menu.remove(); })
			.bind('disable', close)
			.bind('select', function(e){
				(currentType === 'files' && (!e.data || e.data.selected.toString() !== currentTargets.toString())) && close();
			});
		})
		.shortcut({
			pattern     : fm.OS === 'mac' ? 'ctrl+m' : 'contextmenu shift+f10',
			description : 'contextmenu',
			callback    : function(e) {
				e.stopPropagation();
				e.preventDefault();
				jQuery(document).one('contextmenu.' + fm.namespace, function(e) {
					e.preventDefault();
					e.stopPropagation();
				});
				var sel = fm.selected(),
					type, targets, pos, elm;
				
				if (sel.length) {
					type = 'files';
					targets = sel;
					elm = fm.cwdHash2Elm(sel[0]);
				} else {
					type = 'cwd';
					targets = [ fm.cwd().hash ];
					pos = fm.getUI('workzone').offset();
				}
				if (! elm || ! elm.length) {
					elm = fm.getUI('workzone');
				}
				pos = elm.offset();
				pos.top += (elm.height() / 2);
				pos.left += (elm.width() / 2);
				fm.trigger('contextmenu', {
					'type'    : type,
					'targets' : targets,
					'x'       : pos.left,
					'y'       : pos.top
				});
			}
		});
		
	});
	
};


/*
 * File: /js/ui/cwd.js
 */

/**
 * elFinder current working directory ui.
 *
 * @author Dmitry (dio) Levashov
 **/
jQuery.fn.elfindercwd = function(fm, options) {
		this.not('.elfinder-cwd').each(function() {
		// fm.time('cwdLoad');
		
		var mobile = fm.UA.Mobile,
			list = fm.viewType == 'list',

			undef = 'undefined',
			/**
			 * Select event full name
			 *
			 * @type String
			 **/
			evtSelect = 'select.'+fm.namespace,
			
			/**
			 * Unselect event full name
			 *
			 * @type String
			 **/
			evtUnselect = 'unselect.'+fm.namespace,
			
			/**
			 * Disable event full name
			 *
			 * @type String
			 **/
			evtDisable = 'disable.'+fm.namespace,
			
			/**
			 * Disable event full name
			 *
			 * @type String
			 **/
			evtEnable = 'enable.'+fm.namespace,
			
			c = 'class',
			/**
			 * File css class
			 *
			 * @type String
			 **/
			clFile       = fm.res(c, 'cwdfile'),
			
			/**
			 * Selected css class
			 *
			 * @type String
			 **/
			fileSelector = '.'+clFile,
			
			/**
			 * Selected css class
			 *
			 * @type String
			 **/
			clSelected = 'ui-selected',
			
			/**
			 * Disabled css class
			 *
			 * @type String
			 **/
			clDisabled = fm.res(c, 'disabled'),
			
			/**
			 * Draggable css class
			 *
			 * @type String
			 **/
			clDraggable = fm.res(c, 'draggable'),
			
			/**
			 * Droppable css class
			 *
			 * @type String
			 **/
			clDroppable = fm.res(c, 'droppable'),
			
			/**
			 * Hover css class
			 *
			 * @type String
			 **/
			clHover     = fm.res(c, 'hover'),

			/**
			 * Active css class
			 *
			 * @type String
			 **/
			clActive     = fm.res(c, 'active'),

			/**
			 * Hover css class
			 *
			 * @type String
			 **/
			clDropActive = fm.res(c, 'adroppable'),

			/**
			 * Css class for temporary nodes (for mkdir/mkfile) commands
			 *
			 * @type String
			 **/
			clTmp = clFile+'-tmp',

			/**
			 * Select checkbox css class
			 * 
			 * @type String
			 */
			clSelChk = 'elfinder-cwd-selectchk',

			/**
			 * Number of thumbnails to load in one request (new api only)
			 *
			 * @type Number
			 **/
			tmbNum = fm.options.loadTmbs > 0 ? fm.options.loadTmbs : 5,
			
			/**
			 * Current search query.
			 *
			 * @type String
			 */
			query = '',

			/**
			 * Currect clipboard(cut) hashes as object key
			 * 
			 * @type Object
			 */
			clipCuts = {},

			/**
			 * Parents hashes of cwd
			 *
			 * @type Array
			 */
			cwdParents = [],
			
			/**
			 * cwd current hashes
			 * 
			 * @type Array
			 */
			cwdHashes = [],

			/**
			 * incsearch current hashes
			 * 
			 * @type Array
			 */
			incHashes = void 0,

			/**
			 * Custom columns name and order
			 *
			 * @type Array
			 */
			customCols = [],

			/**
			 * Current clicked element id of first time for dblclick
			 * 
			 * @type String
			 */
			curClickId = '',

			/**
			 * Custom columns builder
			 *
			 * @type Function
			 */
			customColsBuild = function() {
				var cols = '';
				for (var i = 0; i < customCols.length; i++) {
					cols += '<td class="elfinder-col-'+customCols[i]+'">{' + customCols[i] + '}</td>';
				}
				return cols;
			},

			/**
			 * Make template.row from customCols
			 *
			 * @type Function
			 */
			makeTemplateRow = function() {
				return '<tr id="{id}" class="'+clFile+' {permsclass} {dirclass}" title="{tooltip}"{css}><td class="elfinder-col-name"><div class="elfinder-cwd-file-wrapper"><span class="elfinder-cwd-icon {mime}"{style}/>{marker}<span class="elfinder-cwd-filename">{name}</span></div>'+selectCheckbox+'</td>'+customColsBuild()+'</tr>';
			},
			
			selectCheckbox = (jQuery.map(options.showSelectCheckboxUA, function(t) {return (fm.UA[t] || t.match(/^all$/i))? true : null;}).length)? '<div class="elfinder-cwd-select"><input type="checkbox" class="'+clSelChk+'"></div>' : '',

			colResizing = false,
			
			colWidth = null,

			/**
			 * Table header height
			 */
			thHeight,

			/**
			 * File templates
			 *
			 * @type Object
			 **/
			templates = {
				icon : '<div id="{id}" class="'+clFile+' {permsclass} {dirclass} ui-corner-all" title="{tooltip}"><div class="elfinder-cwd-file-wrapper ui-corner-all"><div class="elfinder-cwd-icon {mime} ui-corner-all" unselectable="on"{style}/>{marker}</div><div class="elfinder-cwd-filename" title="{nametitle}">{name}</div>'+selectCheckbox+'</div>',
				row  : ''
			},
			
			permsTpl = fm.res('tpl', 'perms'),
			
			lockTpl = fm.res('tpl', 'lock'),
			
			symlinkTpl = fm.res('tpl', 'symlink'),
			
			/**
			 * Template placeholders replacement rules
			 *
			 * @type Object
			 **/
			replacement = {
				id : function(f) {
					return fm.cwdHash2Id(f.hash);
				},
				name : function(f) {
					var name = fm.escape(f.i18 || f.name);
					!list && (name = name.replace(/([_.])/g, '&#8203;$1'));
					return name;
				},
				nametitle : function(f) {
					return fm.escape(f.i18 || f.name);
				},
				permsclass : function(f) {
					return fm.perms2class(f);
				},
				perm : function(f) {
					return fm.formatPermissions(f);
				},
				dirclass : function(f) {
					var cName = f.mime == 'directory' ? 'directory' : '';
					f.isroot && (cName += ' isroot');
					f.csscls && (cName += ' ' + fm.escape(f.csscls));
					options.getClass && (cName += ' ' + options.getClass(f));
					return cName;
				},
				style : function(f) {
					return f.icon? fm.getIconStyle(f) : '';
				},
				mime : function(f) {
					var cName = fm.mime2class(f.mime);
					f.icon && (cName += ' elfinder-cwd-bgurl');
					return cName;
				},
				size : function(f) {
					return (f.mime === 'directory' && !f.size)? '-' : fm.formatSize(f.size);
				},
				date : function(f) {
					return fm.formatDate(f);
				},
				kind : function(f) {
					return fm.mime2kind(f);
				},
				mode : function(f) {
					return f.perm? fm.formatFileMode(f.perm) : '';
				},
				modestr : function(f) {
					return f.perm? fm.formatFileMode(f.perm, 'string') : '';
				},
				modeoct : function(f) {
					return f.perm? fm.formatFileMode(f.perm, 'octal') : '';
				},
				modeboth : function(f) {
					return f.perm? fm.formatFileMode(f.perm, 'both') : '';
				},
				marker : function(f) {
					return (f.alias || f.mime == 'symlink-broken' ? symlinkTpl : '')+(!f.read || !f.write ? permsTpl : '')+(f.locked ? lockTpl : '');
				},
				tooltip : function(f) {
					var title = fm.formatDate(f) + (f.size > 0 ? ' ('+fm.formatSize(f.size)+')' : ''),
						info  = '';
					if (query && f.path) {
						info = fm.escape(f.path.replace(/\/[^\/]*$/, ''));
					} else {
						info = f.tooltip? fm.escape(f.tooltip).replace(/\r/g, '&#13;') : '';
					}
					if (list) {
						info += (info? '&#13;' : '') + fm.escape(f.i18 || f.name);
					}
					return info? info + '&#13;' + title : title;
				}
			},
			
			/**
			 * Type badge CSS added flag
			 * 
			 * @type Object
			 */
			addedBadges = {},
			
			/**
			 * Type badge style sheet element
			 * 
			 * @type Object
			 */
			addBadgeStyleSheet,
			
			/**
			 * Add type badge CSS into 'head'
			 * 
			 * @type Fundtion
			 */
			addBadgeStyle = function(mime, name) {
				var sel, ext, type;
				if (mime && ! addedBadges[mime]) {
					if (typeof addBadgeStyleSheet === 'undefined') {
						if (jQuery('#elfinderAddBadgeStyle'+fm.namespace).length) {
							jQuery('#elfinderAddBadgeStyle'+fm.namespace).remove();
						}
						addBadgeStyleSheet = jQuery('<style id="addBadgeStyle'+fm.namespace+'"/>').insertBefore(jQuery('head').children(':first')).get(0).sheet || null;
					}
					if (addBadgeStyleSheet) {
						mime = mime.toLowerCase();
						type = mime.split('/');
						ext = fm.escape(fm.mimeTypes[mime] || (name.replace(/.bac?k$/i, '').match(/\.([^.]+)$/) || ['',''])[1]);
						if (ext) {
							sel = '.elfinder-cwd-icon-' + type[0].replace(/(\.|\+)/g, '-');
							if (typeof type[1] !== 'undefined') {
								sel += '.elfinder-cwd-icon-' + type[1].replace(/(\.|\+)/g, '-');
							}
							try {
								addBadgeStyleSheet.insertRule(sel + ':before{content:"' + ext.toLowerCase() + '"}', 0);
							} catch(e) {}
						}
						addedBadges[mime] = true;
					}
				}
			},
			
			/**
			 * Return file html
			 *
			 * @param  Object  file info
			 * @return String
			 **/
			itemhtml = function(f) {
				f.mime && f.mime !== 'directory' && !addedBadges[f.mime] && addBadgeStyle(f.mime, f.name);
				return templates[list ? 'row' : 'icon']
						.replace(/\{([a-z0-9_]+)\}/g, function(s, e) { 
							return replacement[e] ? replacement[e](f, fm) : (f[e] ? f[e] : ''); 
						});
			},
			
			/**
			 * jQueery node that will be selected next
			 * 
			 * @type Object jQuery node
			 */
			selectedNext = jQuery(),
			
			/**
			 * Flag. Required for msie to avoid unselect files on dragstart
			 *
			 * @type Boolean
			 **/
			selectLock = false,
			
			/**
			 * Move selection to prev/next file
			 *
			 * @param String  move direction
			 * @param Boolean append to current selection
			 * @return void
			 * @rise select			
			 */
			select = function(keyCode, append) {
				var code     = jQuery.ui.keyCode,
					prev     = keyCode == code.LEFT || keyCode == code.UP,
					sel      = cwd.find('[id].'+clSelected),
					selector = prev ? 'first:' : 'last',
					s, n, sib, top, left;

				function sibling(n, direction) {
					return n[direction+'All']('[id]:not(.'+clDisabled+'):not(.elfinder-cwd-parent):first');
				}
				
				if (sel.length) {
					s = sel.filter(prev ? ':first' : ':last');
					sib = sibling(s, prev ? 'prev' : 'next');
					
					if (!sib.length) {
						// there is no sibling on required side - do not move selection
						n = s;
					} else if (list || keyCode == code.LEFT || keyCode == code.RIGHT) {
						// find real prevoius file
						n = sib;
					} else {
						// find up/down side file in icons view
						top = s.position().top;
						left = s.position().left;

						n = s;
						if (prev) {
							do {
								n = n.prev('[id]');
							} while (n.length && !(n.position().top < top && n.position().left <= left));

							if (n.hasClass(clDisabled)) {
								n = sibling(n, 'next');
							}
						} else {
							do {
								n = n.next('[id]');
							} while (n.length && !(n.position().top > top && n.position().left >= left));
							
							if (n.hasClass(clDisabled)) {
								n = sibling(n, 'prev');
							}
							// there is row before last one - select last file
							if (!n.length) {
								sib = cwd.find('[id]:not(.'+clDisabled+'):last');
								if (sib.position().top > top) {
									n = sib;
								}
							}
						}
					}
					// !append && unselectAll();
				} else {
					if (selectedNext.length) {
						n = prev? selectedNext.prev() : selectedNext;
					} else {
						// there are no selected file - select first/last one
						n = cwd.find('[id]:not(.'+clDisabled+'):not(.elfinder-cwd-parent):'+(prev ? 'last' : 'first'));
					}
				}
				
				if (n && n.length && !n.hasClass('elfinder-cwd-parent')) {
					if (s && append) {
						// append new files to selected
						n = s.add(s[prev ? 'prevUntil' : 'nextUntil']('#'+n.attr('id'))).add(n);
					} else {
						// unselect selected files
						sel.trigger(evtUnselect);
					}
					// select file(s)
					n.trigger(evtSelect);
					// set its visible
					scrollToView(n.filter(prev ? ':first' : ':last'));
					// update cache/view
					trigger();
				}
			},
			
			selectedFiles = {},
			
			selectFile = function(hash) {
				fm.cwdHash2Elm(hash).trigger(evtSelect);
			},
			
			allSelected = false,
			
			selectAll = function() {
				var phash = fm.cwd().hash;

				selectCheckbox && selectAllCheckbox.find('input').prop('checked', true);
				fm.lazy(function() {
					var files;
					if (fm.maxTargets && (incHashes || cwdHashes).length > fm.maxTargets) {
						unselectAll({ notrigger: true });
						files = jQuery.map(incHashes || cwdHashes, function(hash) { return fm.file(hash) || null; });
						files = files.slice(0, fm.maxTargets);
						selectedFiles = {};
						jQuery.each(files, function(i, v) {
							selectedFiles[v.hash] = true;
							fm.cwdHash2Elm(v.hash).trigger(evtSelect);
						});
						fm.toast({mode: 'warning', msg: fm.i18n(['errMaxTargets', fm.maxTargets])});
					} else {
						cwd.find('[id]:not(.'+clSelected+'):not(.elfinder-cwd-parent)').trigger(evtSelect);
						selectedFiles = fm.arrayFlip(incHashes || cwdHashes, true);
					}
					trigger();
					selectCheckbox && selectAllCheckbox.data('pending', false);
				}, 0, {repaint: true});
			},
			
			/**
			 * Unselect all files
			 *
			 * @param  Object  options
			 * @return void
			 */
			unselectAll = function(opts) {
				var o = opts || {};
				selectCheckbox && selectAllCheckbox.find('input').prop('checked', false);
				if (Object.keys(selectedFiles).length) {
					selectLock = false;
					selectedFiles = {};
					cwd.find('[id].'+clSelected).trigger(evtUnselect);
					selectCheckbox && cwd.find('input:checkbox.'+clSelChk).prop('checked', false);
				}
				!o.notrigger && trigger();
				selectCheckbox && selectAllCheckbox.data('pending', false);
				cwd.removeClass('elfinder-cwd-allselected');
			},
			
			selectInvert = function() {
				var invHashes = {};
				if (allSelected) {
					unselectAll();
				} else if (! Object.keys(selectedFiles).length) {
					selectAll();
				} else {
					jQuery.each((incHashes || cwdHashes), function(i, h) {
						var itemNode = fm.cwdHash2Elm(h);
						if (! selectedFiles[h]) {
							invHashes[h] = true;
							itemNode.length && itemNode.trigger(evtSelect);
						} else {
							itemNode.length && itemNode.trigger(evtUnselect);
						}
					});
					selectedFiles = invHashes;
					trigger();
				}
			},
			
			/**
			 * Return selected files hashes list
			 *
			 * @return Array
			 */
			selected = function() {
				return Object.keys(selectedFiles);
			},
			
			/**
			 * Last selected node id
			 * 
			 * @type String|Void
			 */
			lastSelect = void 0,
			
			/**
			 * Fire elfinder "select" event and pass selected files to it
			 *
			 * @return void
			 */
			trigger = function() {
				var selected = Object.keys(selectedFiles),
					opts = {
						selected : selected,
						origin : 'cwd'
					};
				
				if (oldSchoolItem && (selected.length > 1 || selected[0] !== fm.cwdId2Hash(
					oldSchoolItem.attr('id'))) && oldSchoolItem.hasClass(clSelected)) {
					oldSchoolItem.trigger(evtUnselect);
				}
				allSelected = selected.length && (selected.length === (incHashes || cwdHashes).length) && (!fm.maxTargets || selected.length <= fm.maxTargets);
				if (selectCheckbox) {
					selectAllCheckbox.find('input').prop('checked', allSelected);
					cwd[allSelected? 'addClass' : 'removeClass']('elfinder-cwd-allselected');
				}
				if (allSelected) {
					opts.selectall = true;
				} else if (! selected.length) {
					opts.unselectall = true;
				}
				fm.trigger('select', opts);
			},
			
			/**
			 * Scroll file to set it visible
			 *
			 * @param DOMElement  file/dir node
			 * @return void
			 */
			scrollToView = function(o, blink) {
				if (! o.length) {
					return;
				}
				var ftop    = o.position().top,
					fheight = o.outerHeight(true),
					wtop    = wrapper.scrollTop(),
					wheight = wrapper.get(0).clientHeight,
					thheight = tableHeader? tableHeader.outerHeight(true) : 0;

				if (ftop + thheight + fheight > wtop + wheight) {
					wrapper.scrollTop(parseInt(ftop + thheight + fheight - wheight));
				} else if (ftop < wtop) {
					wrapper.scrollTop(ftop);
				}
				list && wrapper.scrollLeft(0);
				!!blink && fm.resources.blink(o, 'lookme');
			},
			
			/**
			 * Files we get from server but not show yet
			 *
			 * @type Array
			 **/
			buffer = [],
			
			/**
			 * Extra data of buffer
			 *
			 * @type Object
			 **/
			bufferExt = {},
			
			/**
			 * Return index of elements with required hash in buffer 
			 *
			 * @param String  file hash
			 * @return Number
			 */
			index = function(hash) {
				var l = buffer.length;
				
				while (l--) {
					if (buffer[l].hash == hash) {
						return l;
					}
				}
				return -1;
			},
			
			/**
			 * Scroll start event name
			 *
			 * @type String
			 **/
			scrollStartEvent = 'elfscrstart',
			
			/**
			 * Scroll stop event name
			 *
			 * @type String
			 **/
			scrollEvent = 'elfscrstop',
			
			scrolling = false,
			
			/**
			 * jQuery UI selectable option
			 * 
			 * @type Object
			 */
			selectableOption = {
				disabled   : true,
				filter     : '[id]:first',
				stop       : trigger,
				delay      : 250,
				appendTo   : 'body',
				autoRefresh: false,
				selected   : function(e, ui) { jQuery(ui.selected).trigger(evtSelect); },
				unselected : function(e, ui) { jQuery(ui.unselected).trigger(evtUnselect); }
			},
			
			/**
			 * hashes of items displayed in current view
			 * 
			 * @type Object  ItemHash => DomId
			 */
			inViewHashes = {},
			
			/**
			 * Processing when the current view is changed (On open, search, scroll, resize etc.)
			 * 
			 * @return void
			 */
			wrapperRepaint = function(init, recnt) {
				if (!bufferExt.renderd) {
					return;
				}
				var firstNode = (list? cwd.find('tbody:first') : cwd).children('[id]'+(options.oldSchool? ':not(.elfinder-cwd-parent)' : '')+':first');
				if (!firstNode.length) {
					return;
				}
				var selectable = cwd.data('selectable'),
					rec = (function() {
						var wos = wrapper.offset(),
							ww = wrapper.width(),
							w = jQuery(window),
							x = firstNode.width() / 2,
							l = Math.min(wos.left - w.scrollLeft() + (fm.direction === 'ltr'? x : ww - x), wos.left + ww - 10),
							t = wos.top - w.scrollTop() + 10 + (list? thHeight : 0);
						return {left: Math.max(0, Math.round(l)), top: Math.max(0, Math.round(t))};
					})(),
					tgt = init? firstNode : jQuery(document.elementFromPoint(rec.left , rec.top)),
					ids = {},
					tmbs = {},
					multi = 5,
					cnt = Math.ceil((bufferExt.hpi? Math.ceil((wz.data('rectangle').height / bufferExt.hpi) * 1.5) : showFiles) / multi),
					chk = function() {
						var id, hash, file, i;
						for (i = 0; i < multi; i++) {
							id = tgt.attr('id');
							if (id) {
								bufferExt.getTmbs = [];
								hash = fm.cwdId2Hash(id);
								inViewHashes[hash] = id;
								// for tmbs
								if (bufferExt.attachTmbs[hash]) {
									tmbs[hash] = bufferExt.attachTmbs[hash];
								}
								// for selectable
								selectable && (ids[id] = true);
							}
							// next node
							tgt = tgt.next();
							if (!tgt.length) {
								break;
							}
						}
					},
					done = function() {
						var idsArr;
						if (cwd.data('selectable')) {
							Object.assign(ids, selectedFiles);
							idsArr = Object.keys(ids);
							if (idsArr.length) {
								selectableOption.filter = '#'+idsArr.join(', #');
								cwd.selectable('enable').selectable('option', {filter : selectableOption.filter}).selectable('refresh');
							}
						}
						if (Object.keys(tmbs).length) {
							bufferExt.getTmbs = [];
							attachThumbnails(tmbs);
						}
					},
					setTarget = function() {
						if (!tgt.hasClass(clFile)) {
							tgt = tgt.closest(fileSelector);
						}
					},
					arr, widget;
				
				inViewHashes = {};
				selectable && cwd.selectable('option', 'disabled');
				
				if (tgt.length) {
					if (!tgt.hasClass(clFile) && !tgt.closest(fileSelector).length) {
						// dialog, serach button etc.
						widget = fm.getUI().find('.ui-dialog:visible,.ui-widget:visible');
						if (widget.length) {
							widget.hide();
							tgt = jQuery(document.elementFromPoint(rec.left , rec.top));
							widget.show();
						} else {
							widget = null;
						}
					}
					setTarget();
					if (!tgt.length) {
						// try search 5px down
						widget && widget.hide();
						tgt = jQuery(document.elementFromPoint(rec.left , rec.top + 5));
						widget && widget.show();
						setTarget();
					}
				}

				if (tgt.length) {
					if (tgt.attr('id')) {
						if (init) {
							for (var i = 0; i < cnt; i++) {
								chk();
								if (! tgt.length) {
									break;
								}
							}
							done();
						} else {
							bufferExt.repaintJob && bufferExt.repaintJob.state() === 'pending' && bufferExt.repaintJob.reject();
							arr = new Array(cnt);
							bufferExt.repaintJob = fm.asyncJob(function() {
								chk();
								if (! tgt.length) {
									done();
									bufferExt.repaintJob && bufferExt.repaintJob.state() === 'pending' && bufferExt.repaintJob.reject();
								}
							}, arr).done(done);
						}
					}
				} else if (init && bufferExt.renderd) {
					// In initial request, cwd DOM not renderd so doing lazy check
					recnt = recnt || 0;
					if (recnt < 10) { // Prevent infinite loop
						requestAnimationFrame(function() {
							wrapperRepaint(init, ++recnt);
						});
					}
				}
			},
			
			/**
			 * Item node of oldScholl ".."
			 */
			oldSchoolItem = null,

			/**
			 * display parent folder with ".." name
			 * 
			 * @param  String  phash
			 * @return void
			 */
			oldSchool = function(p) {
				var phash = fm.cwd().phash,
					pdir  = fm.file(phash) || null,
					set   = function(pdir) {
						if (pdir) {
							oldSchoolItem = jQuery(itemhtml(jQuery.extend(true, {}, pdir, {name : '..', i18 : '..', mime : 'directory'})))
								.addClass('elfinder-cwd-parent')
								.on('dblclick', function() {
									var hash = fm.cwdId2Hash(this.id);
									fm.trigger('select', {selected : [hash]}).exec('open', hash);
								});
							(list ? oldSchoolItem.children('td:first') : oldSchoolItem).children('.elfinder-cwd-select').remove();
							(list ? cwd.find('tbody') : cwd).prepend(oldSchoolItem);
							fm.draggingUiHelper && fm.draggingUiHelper.data('refreshPositions', 1);
						}
					};
				if (pdir) {
					set(pdir);
				} else {
					if (fm.getUI('tree').length) {
						fm.one('parents', function() {
							set(fm.file(phash) || null);
							wrapper.trigger(scrollEvent);
						});
					} else {
						fm.request({
							data : {cmd : 'parents', target : fm.cwd().hash},
							preventFail : true
						})
						.done(function(data) {
							set(fm.file(phash) || null);
							wrapper.trigger(scrollEvent);
						});
					}
				}
			},
			
			showFiles = fm.options.showFiles,
			
			/**
			 * Cwd scroll event handler.
			 * Lazy load - append to cwd not shown files
			 *
			 * @return void
			 */
			render = function() {
				if (bufferExt.rendering || (bufferExt.renderd && ! buffer.length)) {
					return;
				}
				var place = (list ? cwd.children('table').children('tbody') : cwd),
					phash,
					chk,
					// created document fragment for jQuery >= 1.12, 2.2, 3.0
					// see Studio-42/elFinder#1544 @ github
					docFlag = jQuery.htmlPrefilter? true : false,
					tempDom = docFlag? jQuery(document.createDocumentFragment()) : jQuery('<div/>'),
					go      = function(o){
						var over  = o || null,
							html  = [],
							dirs  = false,
							atmb  = {},
							stmb  = (fm.option('tmbUrl') === 'self'),
							init  = bufferExt.renderd? false : true,
							files, locks, selected;
						
						files = buffer.splice(0, showFiles + (over || 0) / (bufferExt.hpi || 1));
						bufferExt.renderd += files.length;
						if (! buffer.length) {
							bottomMarker.hide();
							wrapper.off(scrollEvent, render);
						}
						
						locks = [];
						html = jQuery.map(files, function(f) {
							if (f.hash && f.name) {
								if (f.mime == 'directory') {
									dirs = true;
								}
								if ((f.tmb && (f.tmb != 1 || f.size > 0)) || (stmb && f.mime.indexOf('image/') === 0)) {
									atmb[f.hash] = f.tmb || 'self';
								}
								clipCuts[f.hash] && locks.push(f.hash);
								return itemhtml(f);
							}
							return null;
						});

						// html into temp node
						tempDom.empty().append(html.join(''));
						
						// make directory droppable
						dirs && !mobile && makeDroppable(tempDom);
						
						// check selected items
						selected = [];
						if (Object.keys(selectedFiles).length) {
							tempDom.find('[id]:not(.'+clSelected+'):not(.elfinder-cwd-parent)').each(function() {
								selectedFiles[fm.cwdId2Hash(this.id)] && selected.push(jQuery(this));
							});
						}
						
						// append to cwd
						place.append(docFlag? tempDom : tempDom.children());
						
						// trigger select
						if (selected.length) {
							jQuery.each(selected, function(i, n) { n.trigger(evtSelect); });
							trigger();
						}
						
						locks.length && fm.trigger('lockfiles', {files: locks});
						!bufferExt.hpi && bottomMarkerShow(place, files.length);
						
						if (list) {
							// show thead
							cwd.find('thead').show();
							// fixed table header
							fixTableHeader({fitWidth: ! colWidth});
						}
						
						if (Object.keys(atmb).length) {
							Object.assign(bufferExt.attachTmbs, atmb);
						}
						
						if (init) {
							if (! mobile && ! cwd.data('selectable')) {
								// make files selectable
								cwd.selectable(selectableOption).data('selectable', true);
							}
						}

						! scrolling && wrapper.trigger(scrollEvent);
					};
				
				if (! bufferExt.renderd) {
					// first time to go()
					bufferExt.rendering = true;
					// scroll top on dir load to avoid scroll after page reload
					wrapper.scrollTop(0);
					phash = fm.cwd().phash;
					go();
					if (options.oldSchool) {
						if (phash && !query) {
							oldSchool(phash);
						} else {
							oldSchoolItem = jQuery();
						}
					}
					if (list) {
						colWidth && setColwidth();
						fixTableHeader({fitWidth: true});
					}
					bufferExt.itemH = (list? place.find('tr:first') : place.find('[id]:first')).outerHeight(true);
					fm.trigger('cwdrender');
					bufferExt.rendering = false;
					wrapperRepaint(true);
				}
				if (! bufferExt.rendering && buffer.length) {
					// next go()
					if ((chk = (wrapper.height() + wrapper.scrollTop() + fm.options.showThreshold + bufferExt.row) - (bufferExt.renderd * bufferExt.hpi)) > 0) {
						bufferExt.rendering = true;
						fm.lazy(function() {
							go(chk);
							bufferExt.rendering = false;
						});
					} else {
						!fm.enabled() && resize();
					}
				} else {
					resize();
				}
			},
			
			// fixed table header jQuery object
			tableHeader = null,

			// Is UA support CSS sticky
			cssSticky = fm.UA.CSS.positionSticky && fm.UA.CSS.widthMaxContent,
			
			// To fixed table header colmun
			fixTableHeader = function(optsArg) {
				thHeight = 0;
				if (! options.listView.fixedHeader) {
					return;
				}
				var setPos = function() {
					var val, pos;
					pos = (fm.direction === 'ltr')? 'left' : 'right';
					val = ((fm.direction === 'ltr')? wrapper.scrollLeft() : table.outerWidth(true) - wrapper.width() - wrapper.scrollLeft()) * -1;
					if (base.css(pos) !== val) {
						base.css(pos, val);
					}
				},
				opts = optsArg || {},
				cnt, base, table, htable, thead, tbody, hheight, htr, btr, htd, btd, htw, btw, init;
				
				tbody = cwd.find('tbody');
				btr = tbody.children('tr:first');
				if (btr.length && btr.is(':visible')) {
					table = tbody.parent();
					if (! tableHeader) {
						init = true;
						tbody.addClass('elfinder-cwd-fixheader');
						thead = cwd.find('thead').attr('id', fm.namespace+'-cwd-thead');
						htr = thead.children('tr:first');
						hheight = htr.outerHeight(true);
						cwd.css('margin-top', hheight - parseInt(table.css('padding-top')));
						if (cssSticky) {
							tableHeader = jQuery('<div class="elfinder-table-header-sticky"/>').addClass(cwd.attr('class')).append(jQuery('<table/>').append(thead));
							cwd.after(tableHeader);
							wrapper.on('resize.fixheader', function(e) {
								e.stopPropagation();
								fixTableHeader({fitWidth: true});
							});
						} else {
							base = jQuery('<div/>').addClass(cwd.attr('class')).append(jQuery('<table/>').append(thead));
							tableHeader = jQuery('<div/>').addClass(wrapper.attr('class') + ' elfinder-cwd-fixheader')
								.removeClass('ui-droppable native-droppable')
								.css(wrapper.position())
								.css({ height: hheight, width: cwd.outerWidth() })
								.append(base);
							if (fm.direction === 'rtl') {
								tableHeader.css('left', (wrapper.data('width') - wrapper.width()) + 'px');
							}
							setPos();
							wrapper.after(tableHeader)
								.on('scroll.fixheader resize.fixheader', function(e) {
									setPos();
									if (e.type === 'resize') {
										e.stopPropagation();
										tableHeader.css(wrapper.position());
										wrapper.data('width', wrapper.css('overflow', 'hidden').width());
										wrapper.css('overflow', 'auto');
										fixTableHeader();
									}
								});
						}
					} else {
						thead = jQuery('#'+fm.namespace+'-cwd-thead');
						htr = thead.children('tr:first');
					}
					
					if (init || opts.fitWidth || Math.abs(btr.outerWidth() - htr.outerWidth()) > 2) {
						cnt = customCols.length + 1;
						for (var i = 0; i < cnt; i++) {
							htd = htr.children('td:eq('+i+')');
							btd = btr.children('td:eq('+i+')');
							htw = htd.width();
							btw = btd.width();
							if (typeof htd.data('delta') === 'undefined') {
								htd.data('delta', (htd.outerWidth() - htw) - (btd.outerWidth() - btw));
							}
							btw -= htd.data('delta');
							if (! init && ! opts.fitWidth && htw === btw) {
								break;
							}
							htd.css('width', btw + 'px');
						}
					}
					
					if (!cssSticky) {
						tableHeader.data('widthTimer') && cancelAnimationFrame(tableHeader.data('widthTimer'));
						tableHeader.data('widthTimer', requestAnimationFrame(function() {
							if (tableHeader) {
								tableHeader.css('width', mBoard.width() + 'px');
								if (fm.direction === 'rtl') {
									tableHeader.css('left', (wrapper.data('width') - wrapper.width()) + 'px');
								}
							}
						}));
					}
					thHeight = thead.height();
				}
			},
			
			// Set colmun width
			setColwidth = function() {
				if (list && colWidth) {
					var cl = 'elfinder-cwd-colwidth',
					first = cwd.find('tr[id]:first'),
					former;
					if (! first.hasClass(cl)) {
						former = cwd.find('tr.'+cl);
						former.removeClass(cl).find('td').css('width', '');
						first.addClass(cl);
						cwd.find('table:first').css('table-layout', 'fixed');
						jQuery.each(jQuery.merge(['name'], customCols), function(i, k) {
							var w = colWidth[k] || first.find('td.elfinder-col-'+k).width();
							first.find('td.elfinder-col-'+k).width(w);
						});
					}
				}
			},
			
			/**
			 * Droppable options for cwd.
			 * Drop target is `wrapper`
			 * Do not add class on childs file over
			 *
			 * @type Object
			 */
			droppable = Object.assign({}, fm.droppable, {
				over : function(e, ui) {
					var dst    = jQuery(this),
						helper = ui.helper,
						ctr    = (e.shiftKey || e.ctrlKey || e.metaKey),
						hash, status, inParent;
					e.stopPropagation();
					helper.data('dropover', helper.data('dropover') + 1);
					dst.data('dropover', true);
					helper.removeClass('elfinder-drag-helper-move elfinder-drag-helper-plus');
					if (helper.data('namespace') !== fm.namespace || ! fm.insideWorkzone(e.pageX, e.pageY)) {
						dst.removeClass(clDropActive);
						//helper.removeClass('elfinder-drag-helper-move elfinder-drag-helper-plus');
						return;
					}
					if (dst.hasClass(fm.res(c, 'cwdfile'))) {
						hash = fm.cwdId2Hash(dst.attr('id'));
						dst.data('dropover', hash);
					} else {
						hash = fm.cwd().hash;
						fm.cwd().write && dst.data('dropover', hash);
					}
					inParent = (fm.file(helper.data('files')[0]).phash === hash);
					if (dst.data('dropover') === hash) {
						jQuery.each(helper.data('files'), function(i, h) {
							if (h === hash || (inParent && !ctr && !helper.hasClass('elfinder-drag-helper-plus'))) {
								dst.removeClass(clDropActive);
								return false; // break jQuery.each
							}
						});
					} else {
						dst.removeClass(clDropActive);
					}
					if (helper.data('locked') || inParent) {
						status = 'elfinder-drag-helper-plus';
					} else {
						status = 'elfinder-drag-helper-move';
						if (ctr) {
							status += ' elfinder-drag-helper-plus';
						}
					}
					dst.hasClass(clDropActive) && helper.addClass(status);
					requestAnimationFrame(function(){ dst.hasClass(clDropActive) && helper.addClass(status); });
				},
				out : function(e, ui) {
					var helper = ui.helper;
					e.stopPropagation();
					helper.removeClass('elfinder-drag-helper-move elfinder-drag-helper-plus').data('dropover', Math.max(helper.data('dropover') - 1, 0));
					jQuery(this).removeData('dropover')
					       .removeClass(clDropActive);
				},
				deactivate : function() {
					jQuery(this).removeData('dropover')
					       .removeClass(clDropActive);
				},
				drop : function(e, ui) {
					unselectAll({ notrigger: true });
					fm.droppable.drop.call(this, e, ui);
				}
			}),
			
			/**
			 * Make directory droppable
			 *
			 * @return void
			 */
			makeDroppable = function(place) {
				place = place? place : (list ? cwd.find('tbody') : cwd);
				var targets = place.children('.directory:not(.'+clDroppable+',.elfinder-na,.elfinder-ro)');

				if (fm.isCommandEnabled('paste')) {
					targets.droppable(droppable);
				}
				if (fm.isCommandEnabled('upload')) {
					targets.addClass('native-droppable');
				}
				
				place.children('.isroot').each(function(i, n) {
					var $n   = jQuery(n),
						hash = fm.cwdId2Hash(n.id);
					
					if (fm.isCommandEnabled('paste', hash)) {
						if (! $n.hasClass(clDroppable+',elfinder-na,elfinder-ro')) {
							$n.droppable(droppable);
						}
					} else {
						if ($n.hasClass(clDroppable)) {
							$n.droppable('destroy');
						}
					}
					if (fm.isCommandEnabled('upload', hash)) {
						if (! $n.hasClass('native-droppable,elfinder-na,elfinder-ro')) {
							$n.addClass('native-droppable');
						}
					} else {
						if ($n.hasClass('native-droppable')) {
							$n.removeClass('native-droppable');
						}
					}
				});
			},
			
			/**
			 * Preload required thumbnails and on load add css to files.
			 * Return false if required file is not visible yet (in buffer) -
			 * required for old api to stop loading thumbnails.
			 *
			 * @param  Object  file hash -> thumbnail map
			 * @param  Bool    reload
			 * @return void
			 */
			attachThumbnails = function(tmbs, reload) {
				var attach = function(node, tmb) {
						jQuery('<img/>')
							.on('load', function() {
								node.find('.elfinder-cwd-icon').addClass(tmb.className).css('background-image', "url('"+tmb.url+"')");
							})
							.attr('src', tmb.url);
					},
					chk  = function(hash, tmb) {
						var node = fm.cwdHash2Elm(hash),
							file, tmbObj, reloads = [];
	
						if (node.length) {
							if (tmb != '1') {
								file = fm.file(hash);
								if (file.tmb !== tmb) {
									file.tmb = tmb;
								}
								tmbObj = fm.tmb(file);
								if (reload) {
									node.find('.elfinder-cwd-icon').addClass(tmbObj.className).css('background-image', "url('"+tmbObj.url+"')");
								} else {
									attach(node, tmbObj);
								}
								delete bufferExt.attachTmbs[hash];
							} else {
								if (reload) {
									loadThumbnails([hash]);
								} else if (! bufferExt.tmbLoading[hash]) {
									bufferExt.getTmbs.push(hash);
								}
							}
						}
					};

				if (jQuery.isPlainObject(tmbs) && Object.keys(tmbs).length) {
					Object.assign(bufferExt.attachTmbs, tmbs);
					jQuery.each(tmbs, chk);
					if (! reload && bufferExt.getTmbs.length && ! Object.keys(bufferExt.tmbLoading).length) {
						loadThumbnails();
					}
				}
			},
			
			/**
			 * Load thumbnails from backend.
			 *
			 * @param  Array|void reloads  hashes list for reload thumbnail items
			 * @return void
			 */
			loadThumbnails = function(reloads) {
				var tmbs = [],
					reload = false;
				
				if (fm.oldAPI) {
					fm.request({
						data : {cmd : 'tmb', current : fm.cwd().hash},
						preventFail : true
					})
					.done(function(data) {
						if (data.images && Object.keys(data.images).length) {
							attachThumbnails(data.images);
						}
						if (data.tmb) {
							loadThumbnails();
						}
					});
					return;
				} 

				if (reloads) {
					reload = true;
					tmbs = reloads.splice(0, tmbNum);
				} else {
					tmbs = bufferExt.getTmbs.splice(0, tmbNum);
				}
				if (tmbs.length) {
					if (reload || inViewHashes[tmbs[0]] || inViewHashes[tmbs[tmbs.length-1]]) {
						jQuery.each(tmbs, function(i, h) {
							bufferExt.tmbLoading[h] = true;
						});
						fm.request({
							data : {cmd : 'tmb', targets : tmbs},
							preventFail : true
						})
						.done(function(data) {
							var errs = [],
								resLen;
							if (data.images) {
								if (resLen = Object.keys(data.images).length) {
									if (resLen < tmbs.length) {
										jQuery.each(tmbs, function(i, h) {
											if (! data.images[h]) {
												errs.push(h);
											}
										});
									}
									attachThumbnails(data.images, reload);
								} else {
									errs = tmbs;
								}
								// unset error items from bufferExt.attachTmbs
								if (errs.length) {
									jQuery.each(errs, function(i, h) {
										delete bufferExt.attachTmbs[h];
									});
								}
							}
							if (reload) {
								if (reloads.length) {
									loadThumbnails(reloads);
								}
							}
						})
						.always(function() {
							bufferExt.tmbLoading = {};
							if (! reload && bufferExt.getTmbs.length) {
								loadThumbnails();
							}
						});
					}
				}
			},
			
			/**
			 * Add new files to cwd/buffer
			 *
			 * @param  Array  new files
			 * @return void
			 */
			add = function(files, mode) {
				var place    = list ? cwd.find('tbody') : cwd,
					l        = files.length, 
					atmb     = {},
					findNode = function(file) {
						var pointer = cwd.find('[id]:first'), file2;

						while (pointer.length) {
							file2 = fm.file(fm.cwdId2Hash(pointer.attr('id')));
							if (!pointer.hasClass('elfinder-cwd-parent') && file2 && fm.compare(file, file2) < 0) {
								return pointer;
							}
							pointer = pointer.next('[id]');
						}
					},
					findIndex = function(file) {
						var l = buffer.length, i;
						
						for (i =0; i < l; i++) {
							if (fm.compare(file, buffer[i]) < 0) {
								return i;
							}
						}
						return l || -1;
					},
					// created document fragment for jQuery >= 1.12, 2.2, 3.0
					// see Studio-42/elFinder#1544 @ github
					docFlag = jQuery.htmlPrefilter? true : false,
					tempDom = docFlag? jQuery(document.createDocumentFragment()) : jQuery('<div/>'),
					file, hash, node, nodes, ndx, stmb;

				if (l > showFiles) {
					// re-render for performance tune
					content();
					selectedFiles = fm.arrayFlip(jQuery.map(files, function(f) { return f.hash; }), true);
					trigger();
				} else {
					// add the item immediately
					l && wz.removeClass('elfinder-cwd-wrapper-empty');
					
					// Self thumbnail
					stmb = (fm.option('tmbUrl') === 'self');
					
					while (l--) {
						file = files[l];
						hash = file.hash;
						
						if (fm.cwdHash2Elm(hash).length) {
							continue;
						}
						
						if ((node = findNode(file)) && ! node.length) {
							node = null;
						}
						if (! node && (ndx = findIndex(file)) >= 0) {
							buffer.splice(ndx, 0, file);
						} else {
							tempDom.empty().append(itemhtml(file));
							(file.mime === 'directory') && !mobile && makeDroppable(tempDom);
							nodes = docFlag? tempDom : tempDom.children();
							if (node) {
								node.before(nodes);
							} else {
								place.append(nodes);
							}
						}
						
						if (fm.cwdHash2Elm(hash).length) {
							if ((file.tmb && (file.tmb != 1 || file.size > 0)) || (stmb && file.mime.indexOf('image/') === 0)) {
								atmb[hash] = file.tmb || 'self';
							}
						}
					}
	
					if (list) {
						setColwidth();
						fixTableHeader({fitWidth: ! colWidth});
					}
					bottomMarkerShow(place);
					if (Object.keys(atmb).length) {
						Object.assign(bufferExt.attachTmbs, atmb);
					}
				}
			},
			
			/**
			 * Remove files from cwd/buffer
			 *
			 * @param  Array  files hashes
			 * @return void
			 */
			remove = function(files) {
				var l = files.length,
					inSearch = fm.searchStatus.state > 1,
					curCmd = fm.getCommand(fm.currentReqCmd) || {},
					hash, n, ndx, found;

				// removed cwd
				if (!fm.cwd().hash && !curCmd.noChangeDirOnRemovedCwd) {
					jQuery.each(cwdParents.reverse(), function(i, h) {
						if (fm.file(h)) {
							found = true;
							fm.one(fm.currentReqCmd + 'done', function() {
								!fm.cwd().hash && fm.exec('open', h);
							});
							return false;
						}
					});
					// fallback to fm.roots[0]
					!found && !fm.cwd().hash && fm.exec('open', fm.roots[Object.keys(fm.roots)[0]]);
					return;
				}
				
				while (l--) {
					hash = files[l];
					if ((n = fm.cwdHash2Elm(hash)).length) {
						try {
							n.remove();
							--bufferExt.renderd;
						} catch(e) {
							fm.debug('error', e);
						}
					} else if ((ndx = index(hash)) !== -1) {
						buffer.splice(ndx, 1);
					}
					selectedFiles[hash] && delete selectedFiles[hash];
					if (inSearch) {
						if ((ndx = jQuery.inArray(hash, cwdHashes)) !== -1) {
							cwdHashes.splice(ndx, 1);
						}
					}
				}
				
				inSearch && fm.trigger('cwdhasheschange', cwdHashes);
				
				if (list) {
					setColwidth();
					fixTableHeader({fitWidth: ! colWidth});
				}
			},
			
			customColsNameBuild = function() {
				var name = '',
				customColsName = '';
				for (var i = 0; i < customCols.length; i++) {
					name = fm.getColumnName(customCols[i]);
					customColsName +='<td class="elfinder-cwd-view-th-'+customCols[i]+' sortable-item">'+name+'</td>';
				}
				return customColsName;
			},
			
			setItemBoxSize = function(boxSize) {
				var place, elm;
				if (!boxSize.height) {
					place = (list ? cwd.find('tbody') : cwd);
					elm = place.find(list? 'tr:first' : '[id]:first');
					boxSize.height = elm.outerHeight(true);
					if (!list) {
						boxSize.width = elm.outerWidth(true);
					}
				}
			},

			bottomMarkerShow = function(cur, cnt) {
				var place = cur || (list ? cwd.find('tbody') : cwd),
					boxSize = itemBoxSize[fm.viewType],
					col = 1,
					row;

				if (buffer.length > 0) {
					if (!bufferExt.hpi) {
						setItemBoxSize(boxSize);
						if (! list) {
							col = Math.floor(place.width() / boxSize.width);
							bufferExt.row = boxSize.height;
							bufferExt.hpi = bufferExt.row / col;
						} else {
							bufferExt.row = bufferExt.hpi = boxSize.height;
						}
					} else if (!list) {
						col = Math.floor(place.width() / boxSize.width);
					}
					row = Math.ceil((buffer.length + (cnt || 0)) / col);
					if (list && tableHeader) {
						++row;
					}
					bottomMarker.css({top: (bufferExt.row * row) + 'px'}).show();
				}
			},
			
			wrapperContextMenu = {
				contextmenu : function(e) {
					e.preventDefault();
					if (cwd.data('longtap') !== void(0)) {
						e.stopPropagation();
						return;
					}
					fm.trigger('contextmenu', {
						'type'    : 'cwd',
						'targets' : [fm.cwd().hash],
						'x'       : e.pageX,
						'y'       : e.pageY
					});
				},
				touchstart : function(e) {
					if (e.originalEvent.touches.length > 1) {
						return;
					}
					if (cwd.data('longtap') !== false) {
						wrapper.data('touching', {x: e.originalEvent.touches[0].pageX, y: e.originalEvent.touches[0].pageY});
						cwd.data('tmlongtap', setTimeout(function(){
							// long tap
							cwd.data('longtap', true);
							fm.trigger('contextmenu', {
								'type'    : 'cwd',
								'targets' : [fm.cwd().hash],
								'x'       : wrapper.data('touching').x,
								'y'       : wrapper.data('touching').y
							});
						}, 500));
					}
					cwd.data('longtap', null);
				},
				touchend : function(e) {
					if (e.type === 'touchmove') {
						if (! wrapper.data('touching') ||
								( Math.abs(wrapper.data('touching').x - e.originalEvent.touches[0].pageX)
								+ Math.abs(wrapper.data('touching').y - e.originalEvent.touches[0].pageY)) > 4) {
							wrapper.data('touching', null);
						}
					} else {
						setTimeout(function() {
							cwd.removeData('longtap');
						}, 80);
					}
					clearTimeout(cwd.data('tmlongtap'));
				},
				click : function(e) {
					if (cwd.data('longtap')) {
						e.preventDefault();
						e.stopPropagation();
					}
				}
			},
			
			/**
			 * Update directory content
			 *
			 * @return void
			 */
			content = function() {
				fm.lazy(function() {
					var phash, emptyMethod, thtr;

					wz.append(selectAllCheckbox).removeClass('elfinder-cwd-wrapper-empty elfinder-search-result elfinder-incsearch-result elfinder-letsearch-result');
					if (fm.searchStatus.state > 1 || fm.searchStatus.ininc) {
						wz.addClass('elfinder-search-result' + (fm.searchStatus.ininc? ' elfinder-'+(query.substr(0,1) === '/' ? 'let':'inc')+'search-result' : ''));
					}
					
					// abort attachThumbJob
					bufferExt.attachThumbJob && bufferExt.attachThumbJob._abort();
					
					// destroy selectable for GC
					cwd.data('selectable') && cwd.selectable('disable').selectable('destroy').removeData('selectable');
					
					// notify cwd init
					fm.trigger('cwdinit');
					
					selectedNext = jQuery();
					try {
						// to avoid problem with draggable
						cwd.empty();
					} catch (e) {
						cwd.html('');
					}
					
					if (tableHeader) {
						wrapper.off('scroll.fixheader resize.fixheader');
						tableHeader.remove();
						tableHeader = null;
					}

					cwd.removeClass('elfinder-cwd-view-icons elfinder-cwd-view-list')
						.addClass('elfinder-cwd-view-'+(list ? 'list' :'icons'))
						.attr('style', '')
						.css('height', 'auto');
					bottomMarker.hide();

					wrapper[list ? 'addClass' : 'removeClass']('elfinder-cwd-wrapper-list')._padding = parseInt(wrapper.css('padding-top')) + parseInt(wrapper.css('padding-bottom'));
					if (fm.UA.iOS) {
						wrapper.removeClass('overflow-scrolling-touch').addClass('overflow-scrolling-touch');
					}

					if (list) {
						cwd.html('<table><thead/><tbody/></table>');
						thtr = jQuery('<tr class="ui-state-default"><td class="elfinder-cwd-view-th-name">'+fm.getColumnName('name')+'</td>'+customColsNameBuild()+'</tr>');
						cwd.find('thead').hide().append(thtr).find('td:first').append(selectAllCheckbox);
						if (jQuery.fn.sortable) {
							thtr.addClass('touch-punch touch-punch-keep-default')
								.sortable({
								axis: 'x',
								distance: 8,
								items: '> .sortable-item',
								start: function(e, ui) {
									jQuery(ui.item[0]).data('dragging', true);
									ui.placeholder
										.width(ui.helper.removeClass('ui-state-hover').width())
										.removeClass('ui-state-active')
										.addClass('ui-state-hover')
										.css('visibility', 'visible');
								},
								update: function(e, ui){
									var target = jQuery(ui.item[0]).attr('class').split(' ')[0].replace('elfinder-cwd-view-th-', ''),
										prev, done;
									customCols = jQuery.map(jQuery(this).children(), function(n) {
										var name = jQuery(n).attr('class').split(' ')[0].replace('elfinder-cwd-view-th-', '');
										if (! done) {
											if (target === name) {
												done = true;
											} else {
												prev = name;
											}
										}
										return (name === 'name')? null : name;
									});
									templates.row = makeTemplateRow();
									fm.storage('cwdCols', customCols);
									prev = '.elfinder-col-'+prev+':first';
									target = '.elfinder-col-'+target+':first';
									fm.lazy(function() {
										cwd.find('tbody tr').each(function() {
											var $this = jQuery(this);
											$this.children(prev).after($this.children(target));
										});
									});
								},
								stop: function(e, ui) {
									setTimeout(function() {
										jQuery(ui.item[0]).removeData('dragging');
									}, 100);
								}
							});
						}

						thtr.find('td').addClass('touch-punch').resizable({
							handles: fm.direction === 'ltr'? 'e' : 'w',
							start: function(e, ui) {
								var target = cwd.find('td.elfinder-col-'
									+ ui.element.attr('class').split(' ')[0].replace('elfinder-cwd-view-th-', '')
									+ ':first');
								
								ui.element
									.data('dragging', true)
									.data('resizeTarget', target)
									.data('targetWidth', target.width());
								colResizing = true;
								if (cwd.find('table').css('table-layout') !== 'fixed') {
									cwd.find('tbody tr:first td').each(function() {
										jQuery(this).width(jQuery(this).width());
									});
									cwd.find('table').css('table-layout', 'fixed');
								}
							},
							resize: function(e, ui) {
								ui.element.data('resizeTarget').width(ui.element.data('targetWidth') - (ui.originalSize.width - ui.size.width));
							},
							stop : function(e, ui) {
								colResizing = false;
								fixTableHeader({fitWidth: true});
								colWidth = {};
								cwd.find('tbody tr:first td').each(function() {
									var name = jQuery(this).attr('class').split(' ')[0].replace('elfinder-col-', '');
									colWidth[name] = jQuery(this).width();
								});
								fm.storage('cwdColWidth', colWidth);
								setTimeout(function() {
									ui.element.removeData('dragging');
								}, 100);
							}
						})
						.find('.ui-resizable-handle').addClass('ui-icon ui-icon-grip-dotted-vertical');
					}

					buffer = jQuery.map(incHashes || cwdHashes, function(hash) { return fm.file(hash) || null; });
					
					buffer = fm.sortFiles(buffer);
					
					if (incHashes) {
						incHashes = jQuery.map(buffer, function(f) { return f.hash; });
					} else {
						cwdHashes = jQuery.map(buffer, function(f) { return f.hash; });
					}
					
					bufferExt = {
						renderd: 0,
						attachTmbs: {},
						getTmbs: [],
						tmbLoading: {},
						lazyOpts: { tm : 0 }
					};
					
					wz[(buffer.length < 1) ? 'addClass' : 'removeClass']('elfinder-cwd-wrapper-empty');
					wrapper.off(scrollEvent, render).on(scrollEvent, render).trigger(scrollEvent);
					
					// set droppable
					if (!fm.cwd().write) {
						wrapper.removeClass('native-droppable')
						       .droppable('disable')
						       .removeClass('ui-state-disabled'); // for old jQueryUI see https://bugs.jqueryui.com/ticket/5974
					} else {
						wrapper[fm.isCommandEnabled('upload')? 'addClass' : 'removeClass']('native-droppable');
						wrapper.droppable(fm.isCommandEnabled('paste')? 'enable' : 'disable');
					}
				});
			},
			
			/**
			 * CWD node itself
			 *
			 * @type JQuery
			 **/
			cwd = jQuery(this)
				.addClass('ui-helper-clearfix elfinder-cwd')
				.attr('unselectable', 'on')
				// fix ui.selectable bugs and add shift+click support 
				.on('click.'+fm.namespace, fileSelector, function(e) {
					var p    = this.id ? jQuery(this) : jQuery(this).parents('[id]:first'),
						tgt  = jQuery(e.target),
						prev,
						next,
						pl,
						nl,
						sib;

					if (selectCheckbox && (tgt.is('input:checkbox.'+clSelChk) || tgt.hasClass('elfinder-cwd-select'))) {
						e.stopPropagation();
						e.preventDefault();
						p.trigger(p.hasClass(clSelected) ? evtUnselect : evtSelect);
						trigger();
						requestAnimationFrame(function() {
							tgt.prop('checked', p.hasClass(clSelected));
						});
						return;
					}

					if (cwd.data('longtap') || tgt.hasClass('elfinder-cwd-nonselect')) {
						e.stopPropagation();
						return;
					}

					if (!curClickId) {
						curClickId = p.attr('id');
						setTimeout(function() {
							curClickId = '';
						}, 500);
					}
					
					if (e.shiftKey) {
						prev = p.prevAll(lastSelect || '.'+clSelected+':first');
						next = p.nextAll(lastSelect || '.'+clSelected+':first');
						pl   = prev.length;
						nl   = next.length;
					}
					if (e.shiftKey && (pl || nl)) {
						sib = pl ? p.prevUntil('#'+prev.attr('id')) : p.nextUntil('#'+next.attr('id'));
						sib.add(p).trigger(evtSelect);
					} else if (e.ctrlKey || e.metaKey) {
						p.trigger(p.hasClass(clSelected) ? evtUnselect : evtSelect);
					} else {
						if (wrapper.data('touching') && p.hasClass(clSelected)) {
							wrapper.data('touching', null);
							fm.dblclick({file : fm.cwdId2Hash(this.id)});
							return;
						} else {
							unselectAll({ notrigger: true });
							p.trigger(evtSelect);
						}
					}

					trigger();
				})
				// call fm.open()
				.on('dblclick.'+fm.namespace, fileSelector, function(e) {
					if (curClickId) {
						var hash = fm.cwdId2Hash(curClickId);
						e.stopPropagation();
						if (this.id !== curClickId) {
							jQuery(this).trigger(evtUnselect);
							jQuery('#'+curClickId).trigger(evtSelect);
							trigger();
						}
						fm.dblclick({file : hash});
					}
				})
				// for touch device
				.on('touchstart.'+fm.namespace, fileSelector, function(e) {
					if (e.originalEvent.touches.length > 1) {
						return;
					}
					var p   = this.id ? jQuery(this) : jQuery(this).parents('[id]:first'),
						tgt = jQuery(e.target),
						nodeName = e.target.nodeName,
						sel;
					
					if ((nodeName === 'INPUT' && e.target.type === 'text') || nodeName === 'TEXTAREA' || tgt.hasClass('elfinder-cwd-nonselect')) {
						e.stopPropagation();
						return;
					}
					
					// now name editing
					if (p.find('input:text,textarea').length) {
						e.stopPropagation();
						e.preventDefault();
						return;
					}
					
					wrapper.data('touching', {x: e.originalEvent.touches[0].pageX, y: e.originalEvent.touches[0].pageY});
					if (selectCheckbox && (tgt.is('input:checkbox.'+clSelChk) || tgt.hasClass('elfinder-cwd-select'))) {
						return;
					}
					
					sel = p.prevAll('.'+clSelected+':first').length +
					      p.nextAll('.'+clSelected+':first').length;
					cwd.data('longtap', null);
					if (Object.keys(selectedFiles).length
						||
						(list && e.target.nodeName !== 'TD')
						||
						(!list && this !== e.target)
					) {
						cwd.data('longtap', false);
						p.addClass(clHover);
						p.data('tmlongtap', setTimeout(function(){
							// long tap
							cwd.data('longtap', true);
							p.trigger(evtSelect);
							trigger();
							fm.trigger('contextmenu', {
								'type'    : 'files',
								'targets' : fm.selected(),
								'x'       : e.originalEvent.touches[0].pageX,
								'y'       : e.originalEvent.touches[0].pageY
							});
						}, 500));
					}
				})
				.on('touchmove.'+fm.namespace+' touchend.'+fm.namespace, fileSelector, function(e) {
					var tgt = jQuery(e.target),
						p;
					if (selectCheckbox && (tgt.is('input:checkbox.'+clSelChk) || tgt.hasClass('elfinder-cwd-select'))) {
						return;
					}
					if (e.target.nodeName == 'INPUT' || e.target.nodeName == 'TEXTAREA') {
						e.stopPropagation();
						return;
					}
					p = this.id ? jQuery(this) : jQuery(this).parents('[id]:first');
					clearTimeout(p.data('tmlongtap'));
					if (e.type === 'touchmove') {
						wrapper.data('touching', null);
						p.removeClass(clHover);
					} else {
						if (wrapper.data('touching') && !cwd.data('longtap') && p.hasClass(clSelected)) {
							e.preventDefault();
							wrapper.data('touching', null);
							fm.dblclick({file : fm.cwdId2Hash(this.id)});
						}
						setTimeout(function() {
							cwd.removeData('longtap');
						}, 80);
					}
				})
				// attach draggable
				.on('mouseenter.'+fm.namespace, fileSelector, function(e) {
					if (scrolling) { return; }
					var $this = jQuery(this), helper = null;

					if (!mobile && !$this.data('dragRegisted') && !$this.hasClass(clTmp) && !$this.hasClass(clDraggable) && !$this.hasClass(clDisabled)) {
						$this.data('dragRegisted', true);
						if (!fm.isCommandEnabled('copy', fm.searchStatus.state > 1 || $this.hasClass('isroot')? fm.cwdId2Hash($this.attr('id')) : void 0)) {
							return;
						}
						$this.on('mousedown', function(e) {
							// shiftKey or altKey + drag start for HTML5 native drag function
							// Note: can no use shiftKey with the Google Chrome 
							var metaKey = e.shiftKey || e.altKey,
								disable = false;
							if (metaKey && !fm.UA.IE && cwd.data('selectable')) {
								// destroy jQuery-ui selectable while trigger native drag
								cwd.selectable('disable').selectable('destroy').removeData('selectable');
								requestAnimationFrame(function(){
									cwd.selectable(selectableOption).selectable('option', {disabled: false}).selectable('refresh').data('selectable', true);
								});
							}
							$this.removeClass('ui-state-disabled');
							if (metaKey) {
								$this.draggable('option', 'disabled', true).attr('draggable', 'true');
							} else {
								if (!$this.hasClass(clSelected)) {
									if (list) {
										disable = jQuery(e.target).closest('span,tr').is('tr');
									} else {
										disable = jQuery(e.target).hasClass('elfinder-cwd-file');
									}
								}
								if (disable) {
									$this.draggable('option', 'disabled', true);
								} else {
									$this.draggable('option', 'disabled', false)
										  .removeAttr('draggable')
									      .draggable('option', 'cursorAt', {left: 50 - parseInt(jQuery(e.currentTarget).css('margin-left')), top: 47});
								}
							}
						})
						.on('dragstart', function(e) {
							var dt = e.dataTransfer || e.originalEvent.dataTransfer || null;
							helper = null;
							if (dt && !fm.UA.IE) {
								var p = this.id ? jQuery(this) : jQuery(this).parents('[id]:first'),
									elm   = jQuery('<span>'),
									url   = '',
									durl  = null,
									murl  = null,
									files = [],
									icon  = function(f) {
										var mime = f.mime, i, tmb = fm.tmb(f);
										i = '<div class="elfinder-cwd-icon elfinder-cwd-icon-drag '+fm.mime2class(mime)+' ui-corner-all"/>';
										if (tmb) {
											i = jQuery(i).addClass(tmb.className).css('background-image', "url('"+tmb.url+"')").get(0).outerHTML;
										}
										return i;
									}, l, geturl = [];
								p.trigger(evtSelect);
								trigger();
								jQuery.each(selectedFiles, function(v){
									var file = fm.file(v),
										furl = file.url;
									if (file && file.mime !== 'directory') {
										if (!furl) {
											furl = fm.url(file.hash);
										} else if (furl == '1') {
											geturl.push(v);
											return true;
										}
										if (furl) {
											furl = fm.convAbsUrl(furl);
											files.push(v);
											jQuery('<a>').attr('href', furl).text(furl).appendTo(elm);
											url += furl + "\n";
											if (!durl) {
												durl = file.mime + ':' + file.name + ':' + furl;
											}
											if (!murl) {
												murl = furl + "\n" + file.name;
											}
										}
									}
								});
								if (geturl.length) {
									jQuery.each(geturl, function(i, v){
										var rfile = fm.file(v);
										rfile.url = '';
										fm.request({
											data : {cmd : 'url', target : v},
											notify : {type : 'url', cnt : 1},
											preventDefault : true
										})
										.always(function(data) {
											rfile.url = data.url? data.url : '1';
										});
									});
									return false;
								} else if (url) {
									if (dt.setDragImage) {
										helper = jQuery('<div class="elfinder-drag-helper html5-native"></div>').append(icon(fm.file(files[0]))).appendTo(jQuery(document.body));
										if ((l = files.length) > 1) {
											helper.append(icon(fm.file(files[l-1])) + '<span class="elfinder-drag-num">'+l+'</span>');
										}
										dt.setDragImage(helper.get(0), 50, 47);
									}
									dt.effectAllowed = 'copyLink';
									dt.setData('DownloadURL', durl);
									dt.setData('text/x-moz-url', murl);
									dt.setData('text/uri-list', url);
									dt.setData('text/plain', url);
									dt.setData('text/html', elm.html());
									dt.setData('elfinderfrom', window.location.href + fm.cwd().hash);
									dt.setData('elfinderfrom:' + dt.getData('elfinderfrom'), '');
								} else {
									return false;
								}
							}
						})
						.on('dragend', function(e){
							unselectAll({ notrigger: true });
							helper && helper.remove();
						})
						.draggable(fm.draggable);
					}
				})
				// add hover class to selected file
				.on(evtSelect, fileSelector, function(e) {
					var $this = jQuery(this),
						id    = fm.cwdId2Hash($this.attr('id'));
					
					if (!selectLock && !$this.hasClass(clDisabled)) {
						lastSelect = '#'+ this.id;
						$this.addClass(clSelected).children().addClass(clHover).find('input:checkbox.'+clSelChk).prop('checked', true);
						if (! selectedFiles[id]) {
							selectedFiles[id] = true;
						}
						// will be selected next
						selectedNext = cwd.find('[id].'+clSelected+':last').next();
					}
				})
				// remove hover class from unselected file
				.on(evtUnselect, fileSelector, function(e) {
					var $this = jQuery(this), 
						id    = fm.cwdId2Hash($this.attr('id'));
					
					if (!selectLock) {
						$this.removeClass(clSelected).children().removeClass(clHover).find('input:checkbox.'+clSelChk).prop('checked', false);
						if (cwd.hasClass('elfinder-cwd-allselected')) {
							selectCheckbox && selectAllCheckbox.children('input').prop('checked', false);
							cwd.removeClass('elfinder-cwd-allselected');
						}
						selectedFiles[id] && delete selectedFiles[id];
					}
					
				})
				// disable files wich removing or moving
				.on(evtDisable, fileSelector, function() {
					var $this  = jQuery(this).removeClass(clHover+' '+clSelected).addClass(clDisabled), 
						child  = $this.children(),
						target = (list ? $this : child.find('div.elfinder-cwd-file-wrapper,div.elfinder-cwd-filename'));
					
					child.removeClass(clHover+' '+clSelected);
					
					$this.hasClass(clDroppable) && $this.droppable('disable');
					target.hasClass(clDraggable) && target.draggable('disable');
				})
				// if any files was not removed/moved - unlock its
				.on(evtEnable, fileSelector, function() {
					var $this  = jQuery(this).removeClass(clDisabled), 
						target = list ? $this : $this.children('div.elfinder-cwd-file-wrapper,div.elfinder-cwd-filename');
					
					$this.hasClass(clDroppable) && $this.droppable('enable');	
					target.hasClass(clDraggable) && target.draggable('enable');
				})
				.on('scrolltoview', fileSelector, function(e, data) {
					scrollToView(jQuery(this), (data && typeof data.blink !== 'undefined')? data.blink : true);
				})
				.on('mouseenter.'+fm.namespace+' mouseleave.'+fm.namespace, fileSelector, function(e) {
					var enter = (e.type === 'mouseenter');
					if (enter && (scrolling || fm.UA.Mobile)) { return; }
					fm.trigger('hover', {hash : fm.cwdId2Hash(jQuery(this).attr('id')), type : e.type});
					jQuery(this).toggleClass(clHover, (e.type == 'mouseenter'));
				})
				// for file contextmenu
				.on('mouseenter.'+fm.namespace+' mouseleave.'+fm.namespace, '.elfinder-cwd-file-wrapper,.elfinder-cwd-filename', function(e) {
					var enter = (e.type === 'mouseenter');
					if (enter && scrolling) { return; }
					jQuery(this).closest(fileSelector).children('.elfinder-cwd-file-wrapper,.elfinder-cwd-filename').toggleClass(clActive, (e.type == 'mouseenter'));
				})
				.on('contextmenu.'+fm.namespace, function(e) {
					var file = jQuery(e.target).closest(fileSelector);
					
					if (file.get(0) === e.target && !selectedFiles[fm.cwdId2Hash(file.get(0).id)]) {
						return;
					}

					// now filename editing
					if (file.find('input:text,textarea').length) {
						e.stopPropagation();
						return;
					}
					
					if (file.length && (e.target.nodeName != 'TD' || selectedFiles[fm.cwdId2Hash(file.get(0).id)])) {
						e.stopPropagation();
						e.preventDefault();
						if (!file.hasClass(clDisabled) && !wrapper.data('touching')) {
							if (!file.hasClass(clSelected)) {
								unselectAll({ notrigger: true });
								file.trigger(evtSelect);
								trigger();
							}
							fm.trigger('contextmenu', {
								'type'    : 'files',
								'targets' : fm.selected(),
								'x'       : e.pageX,
								'y'       : e.pageY
							});

						}
						
					}
				})
				// unselect all on cwd click
				.on('click.'+fm.namespace, function(e) {
					if (e.target === this && ! cwd.data('longtap')) {
						!e.shiftKey && !e.ctrlKey && !e.metaKey && unselectAll();
					}
				})
				// prepend fake file/dir
				.on('create.'+fm.namespace, function(e, f) {
					var parent = list ? cwd.find('tbody') : cwd,
						p = parent.find('.elfinder-cwd-parent'),
						lock = f.move || false,
						file = jQuery(itemhtml(f)).addClass(clTmp),
						selected = fm.selected();
						
					if (selected.length) {
						lock && fm.trigger('lockfiles', {files: selected});
					} else {
						unselectAll();
					}

					if (p.length) {
						p.after(file);
					} else {
						parent.prepend(file);
					}
					
					setColwidth();
					wrapper.scrollTop(0).scrollLeft(0);
				})
				// unselect all selected files
				.on('unselectall', unselectAll)
				.on('selectfile', function(e, id) {
					fm.cwdHash2Elm(id).trigger(evtSelect);
					trigger();
				})
				.on('colwidth', function() {
					if (list) {
						cwd.find('table').css('table-layout', '')
							.find('td').css('width', '');
						fixTableHeader({fitWidth: true});
						fm.storage('cwdColWidth', colWidth = null);
					}
				})
				.on('iconpref', function(e, data) {
					cwd.removeClass(function(i, cName) {
						return (cName.match(/\belfinder-cwd-size\S+/g) || []).join(' ');
					});
					iconSize = data? (parseInt(data.size) || 0) : 0;
					if (!list) {
						if (iconSize > 0) {
							cwd.addClass('elfinder-cwd-size' + iconSize);
						}
						if (bufferExt.renderd) {
							requestAnimationFrame(function() {
								itemBoxSize.icons = {};
								bufferExt.hpi = null;
								bottomMarkerShow(cwd, bufferExt.renderd);
								wrapperRepaint();
							});
						}
					}
				})
				// Change icon size with mouse wheel event
				.on('onwheel' in document ? 'wheel' : 'mousewheel', function(e) {
					var tm, size, delta;
					if (!list && ((e.ctrlKey && !e.metaKey) || (!e.ctrlKey && e.metaKey))) {
						e.stopPropagation();
						e.preventDefault();
						tm = cwd.data('wheelTm');
						if (typeof tm !== 'undefined') {
							clearTimeout(tm);
							cwd.data('wheelTm', setTimeout(function() {
								cwd.removeData('wheelTm');
							}, 200));
						} else {
							cwd.data('wheelTm', false);
							size = iconSize || 0;
							delta = e.originalEvent.deltaY ? e.originalEvent.deltaY : -(e.originalEvent.wheelDelta);
							if (delta > 0) {
								if (iconSize > 0) {
									size = iconSize - 1;
								}
							} else {
								if (iconSize < options.iconsView.sizeMax) {
									size = iconSize + 1;
								}
							}
							if (size !== iconSize) {
								fm.storage('iconsize', size);
								cwd.trigger('iconpref', {size: size});
							}
						}
					}
				}),
			wrapper = jQuery('<div class="elfinder-cwd-wrapper"/>')
				// make cwd itself droppable for folders from nav panel
				.droppable(Object.assign({}, droppable, {autoDisable: false}))
				.on('contextmenu.'+fm.namespace, wrapperContextMenu.contextmenu)
				.on('touchstart.'+fm.namespace, wrapperContextMenu.touchstart)
				.on('touchmove.'+fm.namespace+' touchend.'+fm.namespace, wrapperContextMenu.touchend)
				.on('click.'+fm.namespace, wrapperContextMenu.click)
				.on('scroll.'+fm.namespace, function() {
					if (! scrolling) {
						cwd.data('selectable') && cwd.selectable('disable');
						wrapper.trigger(scrollStartEvent);
					}
					scrolling = true;
					bufferExt.scrtm && cancelAnimationFrame(bufferExt.scrtm);
					if (bufferExt.scrtm && Math.abs((bufferExt.scrolltop || 0) - (bufferExt.scrolltop = (this.scrollTop || jQuery(this).scrollTop()))) < 5) {
						bufferExt.scrtm = 0;
						wrapper.trigger(scrollEvent);
					}
					bufferExt.scrtm = requestAnimationFrame(function() {
						bufferExt.scrtm = 0;
						wrapper.trigger(scrollEvent);
					});
				})
				.on(scrollEvent, function() {
					scrolling = false;
					wrapperRepaint();
				}),
			
			bottomMarker = jQuery('<div>&nbsp;</div>')
				.css({position: 'absolute', width: '1px', height: '1px'})
				.hide(),
			
			selectAllCheckbox = selectCheckbox? jQuery('<div class="elfinder-cwd-selectall"><input type="checkbox"/></div>')
				.attr('title', fm.i18n('selectall'))
				.on('touchstart mousedown click', function(e) {
					e.stopPropagation();
					e.preventDefault();
					if (jQuery(this).data('pending') || e.type === 'click') {
						return false;
					}
					selectAllCheckbox.data('pending', true);
					if (cwd.hasClass('elfinder-cwd-allselected')) {
						selectAllCheckbox.find('input').prop('checked', false);
						requestAnimationFrame(function() {
							unselectAll();
						});
					} else {
						selectAll();
					}
				}) : jQuery(),
			
			restm = null,
			resize = function(init) {
				var initHeight = function() {
					if (typeof bufferExt.renderd !== 'undefined') {
						var h = 0;
						wrapper.siblings('div.elfinder-panel:visible').each(function() {
							h += jQuery(this).outerHeight(true);
						});
						wrapper.height(wz.height() - h - wrapper._padding);
					}
				};
				
				init && initHeight();
				
				restm && cancelAnimationFrame(restm);
				restm = requestAnimationFrame(function(){
					!init && initHeight();
					var wph, cwdoh;
					// fix cwd height if it less then wrapper
					cwd.css('height', 'auto');
					wph = wrapper[0].clientHeight - parseInt(wrapper.css('padding-top')) - parseInt(wrapper.css('padding-bottom')) - parseInt(cwd.css('margin-top')),
					cwdoh = cwd.outerHeight(true);
					if (cwdoh < wph) {
						cwd.height(wph);
					}
				});
				
				list && ! colResizing && (init? wrapper.trigger('resize.fixheader') : fixTableHeader());
				
				wrapperRepaint();
			},
			
			// elfinder node
			parent = jQuery(this).parent().on('resize', resize),
			
			// workzone node 
			wz = parent.children('.elfinder-workzone').append(wrapper.append(this).append(bottomMarker)),
			
			// message board
			mBoard = jQuery('<div class="elfinder-cwd-message-board"/>').insertAfter(cwd),

			// Volume expires
			vExpires = jQuery('<div class="elfinder-cwd-expires" />'),

			vExpiresTm,

			showVolumeExpires = function() {
				var remain, sec, int;
				vExpiresTm && clearTimeout(vExpiresTm);
				if (curVolId && fm.volumeExpires[curVolId]) {
					sec = fm.volumeExpires[curVolId] - ((+new Date()) / 1000);
					int = (sec % 60) + 0.1;
					remain = Math.floor(sec / 60);
					vExpires.html(fm.i18n(['minsLeft', remain])).show();
					if (remain) {
						vExpiresTm = setTimeout(showVolumeExpires, int * 1000);
					}
				}
			},

			// each item box size
			itemBoxSize = {
				icons : {},
				list : {}
			},

			// has UI tree
			hasUiTree,

			// Icon size of icons view
			iconSize,

			// Current volume id
			curVolId,
			
			winScrTm;

		// IE < 11 not support CSS `pointer-events: none`
		if (!fm.UA.ltIE10) {
			mBoard.append(jQuery('<div class="elfinder-cwd-trash" />').html(fm.i18n('volume_Trash')))
			      .append(vExpires);
		}

		// setup by options
		replacement = Object.assign(replacement, options.replacement || {});
		
		try {
			colWidth = fm.storage('cwdColWidth')? fm.storage('cwdColWidth') : null;
		} catch(e) {
			colWidth = null;
		}
		
		// setup costomCols
		fm.bind('columnpref', function(e) {
			var opts = e.data || {};
			if (customCols = fm.storage('cwdCols')) {
				customCols = jQuery.grep(customCols, function(n) {
					return (options.listView.columns.indexOf(n) !== -1)? true : false;
				});
				if (options.listView.columns.length > customCols.length) {
					jQuery.each(options.listView.columns, function(i, n) {
						if (customCols.indexOf(n) === -1) {
							customCols.push(n);
						}
					});
				}
			} else {
				customCols = options.listView.columns;
			}
			// column names array that hidden
			var columnhides = fm.storage('columnhides') || null;
			if (columnhides && Object.keys(columnhides).length)
			customCols = jQuery.grep(customCols, function(n) {
				return columnhides[n]? false : true;
			});
			// make template with customCols
			templates.row = makeTemplateRow();
			// repaint if need it
			list && opts.repaint && content();
		}).trigger('columnpref');

		if (mobile) {
			// for iOS5 bug
			jQuery('body').on('touchstart touchmove touchend', function(e){});
		}
		
		selectCheckbox && cwd.addClass('elfinder-has-checkbox');
		
		jQuery(window).on('scroll.'+fm.namespace, function() {
			winScrTm && cancelAnimationFrame(winScrTm);
			winScrTm = requestAnimationFrame(function() {
				wrapper.trigger(scrollEvent);
			});
		});
		
		jQuery(document).on('keydown.'+fm.namespace, function(e) {
			if (e.keyCode == jQuery.ui.keyCode.ESCAPE) {
				if (! fm.getUI().find('.ui-widget:visible').length) {
					unselectAll();
				}
			}
		});
		
		fm
			.one('init', function(){
				var style = document.createElement('style'),
				sheet, node, base, resizeTm, iconSize, i = 0;
				if (document.head) {
					document.head.appendChild(style);
					sheet = style.sheet;
					sheet.insertRule('.elfinder-cwd-wrapper-empty .elfinder-cwd:not(.elfinder-table-header-sticky):after{ content:"'+fm.i18n('emptyFolder')+'" }', i++);
					sheet.insertRule('.elfinder-cwd-wrapper-empty .native-droppable .elfinder-cwd:not(.elfinder-table-header-sticky):after{ content:"'+fm.i18n('emptyFolder'+(mobile? 'LTap' : 'Drop'))+'" }', i++);
					sheet.insertRule('.elfinder-cwd-wrapper-empty .ui-droppable-disabled .elfinder-cwd:not(.elfinder-table-header-sticky):after{ content:"'+fm.i18n('emptyFolder')+'" }', i++);
					sheet.insertRule('.elfinder-cwd-wrapper-empty.elfinder-search-result .elfinder-cwd:not(.elfinder-table-header-sticky):after{ content:"'+fm.i18n('emptySearch')+'" }', i++);
					sheet.insertRule('.elfinder-cwd-wrapper-empty.elfinder-search-result.elfinder-incsearch-result .elfinder-cwd:not(.elfinder-table-header-sticky):after{ content:"'+fm.i18n('emptyIncSearch')+'" }', i++);
					sheet.insertRule('.elfinder-cwd-wrapper-empty.elfinder-search-result.elfinder-letsearch-result .elfinder-cwd:not(.elfinder-table-header-sticky):after{ content:"'+fm.i18n('emptyLetSearch')+'" }', i++);
				}
				if (iconSize = fm.storage('iconsize') || 0) {
					cwd.trigger('iconpref', {size: iconSize});
				}
				if (! mobile) {
					fm.one('open', function() {
						sheet && fm.zIndex && sheet.insertRule('.ui-selectable-helper{z-index:'+fm.zIndex+';}', i++);
					});
					base = jQuery('<div style="position:absolute"/>');
					node = fm.getUI();
					node.on('resize', function(e, data) {
						var offset;
						e.preventDefault();
						e.stopPropagation();
						if (data && data.fullscreen) {
							offset = node.offset();
							if (data.fullscreen === 'on') {
								base.css({top:offset.top * -1 , left:offset.left * -1 }).appendTo(node);
								selectableOption.appendTo = base;
							} else {
								base.detach();
								selectableOption.appendTo = 'body';
							}
							cwd.data('selectable') && cwd.selectable('option', {appendTo : selectableOption.appendTo});
						}
					});
				}
				hasUiTree = fm.getUI('tree').length;
			})
			.bind('enable', function() {
				resize();
			})
			.bind('request.open', function() {
				bufferExt.getTmbs = [];
			})
			.one('open', function() {
				if (fm.maxTargets) {
					tmbNum = Math.min(fm.maxTargets, tmbNum);
				}
			})
			.bind('open add remove searchend', function() {
				var phash = fm.cwd().hash,
					type = this.type;
				if (type === 'open' || type === 'searchend' || fm.searchStatus.state < 2) {
					cwdHashes = jQuery.map(fm.files(phash), function(f) { return f.hash; });
					fm.trigger('cwdhasheschange', cwdHashes);
				}
				if (type === 'open') {
					var inTrash = function() {
							var isIn = false;
							jQuery.each(cwdParents, function(i, h) {
								if (fm.trashes[h]) {
									isIn = true;
									return false;
								}
							});
							return isIn;
						},
						req = phash?
							(! fm.file(phash) || hasUiTree?
								(! hasUiTree?
									fm.request({
										data: {
											cmd    : 'parents',
											target : fm.cwd().hash
										},
										preventFail : true
									}) : (function() {
										var dfd = jQuery.Deferred();
										fm.one('treesync', function(e) {
											e.data.always(function() {
												dfd.resolve();
											});
										});
										return dfd;
									})()
								) : null
							) : null,
						cwdObj = fm.cwd();
					// add/remove volume id class
					if (cwdObj.volumeid !== curVolId) {
						vExpires.empty().hide();
						if (curVolId) {
							wrapper.removeClass('elfinder-cwd-wrapper-' + curVolId);
						}
						curVolId = cwdObj.volumeid;
						showVolumeExpires();
						wrapper.addClass('elfinder-cwd-wrapper-' + curVolId);
					}
					// add/remove trash class
					jQuery.when(req).done(function() {
						cwdParents = fm.parents(cwdObj.hash);
						wrapper[inTrash()? 'addClass':'removeClass']('elfinder-cwd-wrapper-trash');
					});
					incHashes = void 0;
					unselectAll({ notrigger: true });
					content();
				}
			})
			.bind('search', function(e) {
				cwdHashes = jQuery.map(e.data.files, function(f) { return f.hash; });
				fm.trigger('cwdhasheschange', cwdHashes);
				incHashes = void 0;
				fm.searchStatus.ininc = false;
				content();
				fm.autoSync('stop');
			})
			.bind('searchend', function(e) {
				if (query || incHashes) {
					query = '';
					if (incHashes) {
						fm.trigger('incsearchend', e.data);
					} else {
						if (!e.data || !e.data.noupdate) {
							content();
						}
					}
				}
				fm.autoSync();
			})
			.bind('searchstart', function(e) {
				unselectAll();
				query = e.data.query;
			})
			.bind('incsearchstart', function(e) {
				selectedFiles = {};
				fm.lazy(function() {
					// incremental search
					var regex, q, fst = '';
					q = query = e.data.query || '';
					if (q) {
						if (q.substr(0,1) === '/') {
							q = q.substr(1);
							fst = '^';
						}
						regex = new RegExp(fst + q.replace(/([\\*\;\.\?\[\]\{\}\(\)\^\$\-\|])/g, '\\$1'), 'i');
						incHashes = jQuery.grep(cwdHashes, function(hash) {
							var file = fm.file(hash);
							return (file && (file.name.match(regex) || (file.i18 && file.i18.match(regex))))? true : false;
						});
						fm.trigger('incsearch', { hashes: incHashes, query: q })
							.searchStatus.ininc = true;
						content();
						fm.autoSync('stop');
					} else {
						fm.trigger('incsearchend');
					}
				});
			})
			.bind('incsearchend', function(e) {
				query = '';
				fm.searchStatus.ininc = false;
				incHashes = void 0;
				if (!e.data || !e.data.noupdate) {
					content();
				}
				fm.autoSync();
			})
			.bind('sortchange', function() {
				var lastScrollLeft = wrapper.scrollLeft(),
					allsel = cwd.hasClass('elfinder-cwd-allselected');
				
				content();
				fm.one('cwdrender', function() {
					wrapper.scrollLeft(lastScrollLeft);
					if (allsel) {
						selectedFiles = fm.arrayFlip(incHashes || cwdHashes, true);
					}
					(allsel || Object.keys(selectedFiles).length) && trigger();
				});
			})
			.bind('viewchange', function() {
				var l      = fm.storage('view') == 'list',
					allsel = cwd.hasClass('elfinder-cwd-allselected');
				
				if (l != list) {
					list = l;
					fm.viewType = list? 'list' : 'icons';
					if (iconSize) {
						fm.one('cwdinit', function() {
							cwd.trigger('iconpref', {size: iconSize});
						});
					}
					content();
					resize();

					if (allsel) {
						cwd.addClass('elfinder-cwd-allselected');
						selectAllCheckbox.find('input').prop('checked', true);
					}
					Object.keys(selectedFiles).length && trigger();
				}
			})
			.bind('wzresize', function() {
				var place = list ? cwd.find('tbody') : cwd,
					cwdOffset;
				resize(true);
				if (bufferExt.hpi) {
					bottomMarkerShow(place, place.find('[id]').length);
				}
				
				cwdOffset = cwd.offset();
				wz.data('rectangle', Object.assign(
					{
						width: wz.width(),
						height: wz.height(),
						cwdEdge: (fm.direction === 'ltr')? cwdOffset.left : cwdOffset.left + cwd.width()
					},
					wz.offset())
				);
				
				bufferExt.itemH = (list? place.find('tr:first') : place.find('[id]:first')).outerHeight(true);
			})
			.bind('changeclipboard', function(e) {
				clipCuts = {};
				if (e.data && e.data.clipboard && e.data.clipboard.length) {
					jQuery.each(e.data.clipboard, function(i, f) {
						if (f.cut) {
							clipCuts[f.hash] = true;
						}
					});
				}
			})
			.bind('resMixinMake', function() {
				setColwidth();
			})
			.bind('tmbreload', function(e) {
				var imgs = {},
					files = (e.data && e.data.files)? e.data.files : null;
				
				jQuery.each(files, function(i, f) {
					if (f.tmb && f.tmb != '1') {
						imgs[f.hash] = f.tmb;
					}
				});
				if (Object.keys(imgs).length) {
					attachThumbnails(imgs, true);
				}
			})
			.add(function(e) {
				var regex = query? new RegExp(query.replace(/([\\*\;\.\?\[\]\{\}\(\)\^\$\-\|])/g, '\\$1'), 'i') : null,
					mime  = fm.searchStatus.mime,
					inSearch = fm.searchStatus.state > 1,
					phash = inSearch && fm.searchStatus.target? fm.searchStatus.target : fm.cwd().hash,
					curPath = fm.path(phash),
					inTarget = function(f) {
						var res, parents, path;
						res = (f.phash === phash);
						if (!res && inSearch) {
							path = f.path || fm.path(f.hash);
							res = (curPath && path.indexOf(curPath) === 0);
							if (! res && fm.searchStatus.mixed) {
								res = jQuery.grep(fm.searchStatus.mixed, function(vid) { return f.hash.indexOf(vid) === 0? true : false; }).length? true : false;
							}
						}
						if (res && inSearch) {
							if (mime) {
								res = (f.mime.indexOf(mime) === 0);
							} else {
								res = (f.name.match(regex) || (f.i18 && f.i18.match(regex)))? true : false;
							}
						}
						return res;
					},
					files = jQuery.grep(e.data.added || [], function(f) { return inTarget(f)? true : false ;});
				add(files);
				if (fm.searchStatus.state === 2) {
					jQuery.each(files, function(i, f) {
						if (jQuery.inArray(f.hash, cwdHashes) === -1) {
							cwdHashes.push(f.hash);
						}
					});
					fm.trigger('cwdhasheschange', cwdHashes);
				}
				list && resize();
				wrapper.trigger(scrollEvent);
			})
			.change(function(e) {
				var phash = fm.cwd().hash,
					sel   = fm.selected(),
					files, added;

				if (query) {
					jQuery.each(e.data.changed || [], function(i, file) {
						if (fm.cwdHash2Elm(file.hash).length) {
							remove([file.hash]);
							add([file], 'change');
							jQuery.inArray(file.hash, sel) !== -1 && selectFile(file.hash);
							added = true;
						}
					});
				} else {
					jQuery.each(jQuery.grep(e.data.changed || [], function(f) { return f.phash == phash ? true : false; }), function(i, file) {
						if (fm.cwdHash2Elm(file.hash).length) {
							remove([file.hash]);
							add([file], 'change');
							jQuery.inArray(file.hash, sel) !== -1 && selectFile(file.hash);
							added = true;
						}
					});
				}
				
				if (added) {
					fm.trigger('cwdhasheschange', cwdHashes);
					list && resize();
					wrapper.trigger(scrollEvent);
				}
				
				trigger();
			})
			.remove(function(e) {
				var place = list ? cwd.find('tbody') : cwd;
				remove(e.data.removed || []);
				trigger();
				if (buffer.length < 1 && place.children(fileSelector).length < 1) {
					wz.addClass('elfinder-cwd-wrapper-empty');
					selectCheckbox && selectAllCheckbox.find('input').prop('checked', false);
					bottomMarker.hide();
					wrapper.off(scrollEvent, render);
					resize();
				} else {
					bottomMarkerShow(place);
					wrapper.trigger(scrollEvent);
				}
			})
			// select dragged file if no selected, disable selectable
			.dragstart(function(e) {
				var target = jQuery(e.data.target),
					oe     = e.data.originalEvent;

				if (target.hasClass(clFile)) {
					
					if (!target.hasClass(clSelected)) {
						!(oe.ctrlKey || oe.metaKey || oe.shiftKey) && unselectAll({ notrigger: true });
						target.trigger(evtSelect);
						trigger();
					}
				}
				
				cwd.removeClass(clDisabled).data('selectable') && cwd.selectable('disable');
				selectLock = true;
			})
			// enable selectable
			.dragstop(function() {
				cwd.data('selectable') && cwd.selectable('enable');
				selectLock = false;
			})
			.bind('lockfiles unlockfiles selectfiles unselectfiles', function(e) {
				var events = {
						lockfiles     : evtDisable ,
						unlockfiles   : evtEnable ,
						selectfiles   : evtSelect,
						unselectfiles : evtUnselect },
					event  = events[e.type],
					files  = e.data.files || [],
					l      = files.length,
					helper = e.data.helper || jQuery(),
					parents, ctr, add;

				if (l > 0) {
					parents = fm.parents(files[0]);
				}
				if (event === evtSelect || event === evtUnselect) {
					add  = (event === evtSelect),
					jQuery.each(files, function(i, hash) {
						var all = cwd.hasClass('elfinder-cwd-allselected');
						if (! selectedFiles[hash]) {
							add && (selectedFiles[hash] = true);
						} else {
							if (all) {
								selectCheckbox && selectAllCheckbox.children('input').prop('checked', false);
								cwd.removeClass('elfinder-cwd-allselected');
								all = false;
							}
							! add && delete selectedFiles[hash];
						}
					});
				}
				if (!helper.data('locked')) {
					while (l--) {
						try {
							fm.cwdHash2Elm(files[l]).trigger(event);
						} catch(e) {}
					}
					! e.data.inselect && trigger();
				}
				if (wrapper.data('dropover') && parents.indexOf(wrapper.data('dropover')) !== -1) {
					ctr = e.type !== 'lockfiles';
					helper.toggleClass('elfinder-drag-helper-plus', ctr);
					wrapper.toggleClass(clDropActive, ctr);
				}
			})
			// select new files after some actions
			.bind('mkdir mkfile duplicate upload rename archive extract paste multiupload', function(e) {
				if (e.type == 'upload' && e.data._multiupload) return;
				var phash = fm.cwd().hash, files;
				
				unselectAll({ notrigger: true });

				jQuery.each((e.data.added || []).concat(e.data.changed || []), function(i, file) { 
					file && file.phash == phash && selectFile(file.hash);
				});
				trigger();
			})
			.shortcut({
				pattern     :'ctrl+a', 
				description : 'selectall',
				callback    : selectAll
			})
			.shortcut({
				pattern     :'ctrl+shift+i', 
				description : 'selectinvert',
				callback    : selectInvert
			})
			.shortcut({
				pattern     : 'left right up down shift+left shift+right shift+up shift+down',
				description : 'selectfiles',
				type        : 'keydown' , //fm.UA.Firefox || fm.UA.Opera ? 'keypress' : 'keydown',
				callback    : function(e) { select(e.keyCode, e.shiftKey); }
			})
			.shortcut({
				pattern     : 'home',
				description : 'selectffile',
				callback    : function(e) { 
					unselectAll({ notrigger: true });
					scrollToView(cwd.find('[id]:first').trigger(evtSelect));
					trigger();
				}
			})
			.shortcut({
				pattern     : 'end',
				description : 'selectlfile',
				callback    : function(e) { 
					unselectAll({ notrigger: true });
					scrollToView(cwd.find('[id]:last').trigger(evtSelect)) ;
					trigger();
				}
			})
			.shortcut({
				pattern     : 'page_up',
				description : 'pageTurning',
				callback    : function(e) {
					if (bufferExt.itemH) {
						wrapper.scrollTop(
							Math.round(
								wrapper.scrollTop()
								- (Math.floor((wrapper.height() + (list? bufferExt.itemH * -1 : 16)) / bufferExt.itemH)) * bufferExt.itemH
							)
						);
					}
				}
			}).shortcut({
				pattern     : 'page_down',
				description : 'pageTurning',
				callback    : function(e) { 
					if (bufferExt.itemH) {
						wrapper.scrollTop(
							Math.round(
								wrapper.scrollTop()
								+ (Math.floor((wrapper.height() + (list? bufferExt.itemH * -1 : 16)) / bufferExt.itemH)) * bufferExt.itemH
							)
						);
					}
				}
			});
		
	});
	
	// fm.timeEnd('cwdLoad')
	
	return this;
};


/*
 * File: /js/ui/dialog.js
 */

/**
 * @class  elFinder dialog
 *
 * @author Dmitry (dio) Levashov
 **/
jQuery.fn.elfinderdialog = function(opts, fm) {
		var platformWin = (window.navigator.platform.indexOf('Win') != -1),
		delta       = {},
		syncSize    = { enabled: false, width: false, height: false, defaultSize: null },
		fitSize     = function(dialog) {
			var opts, node;
			if (syncSize.enabled) {
				node = fm.options.dialogContained? elfNode : jQuery(window);
				opts = {
					maxWidth : syncSize.width?  node.width() - delta.width  : null,
					maxHeight: syncSize.height? node.height() - delta.height : null
				};
				Object.assign(restoreStyle, opts);
				dialog.css(opts).trigger('resize');
				if (dialog.data('hasResizable') && (dialog.resizable('option', 'maxWidth') < opts.maxWidth || dialog.resizable('option', 'maxHeight') < opts.maxHeight)) {
					dialog.resizable('option', opts);
				}
			}
		},
		syncFunc    = function(e) {
			var dialog = e.data;
			syncTm && cancelAnimationFrame(syncTm);
			syncTm = requestAnimationFrame(function() {
				var opts, offset;
				if (syncSize.enabled) {
					fitSize(dialog);
				}
			});
		},
		checkEditing = function() {
			var cldialog = 'elfinder-dialog',
				dialogs = elfNode.children('.' + cldialog + '.' + fm.res('class', 'editing') + ':visible');
			fm[dialogs.length? 'disable' : 'enable']();
		},
		propagationEvents = {},
		syncTm, dialog, elfNode, restoreStyle;
	
	if (fm && fm.ui) {
		elfNode = fm.getUI();
	} else {
		elfNode = this.closest('.elfinder');
		if (! fm) {
			fm = elfNode.elfinder('instance');
		}
	}
	
	if (typeof opts  === 'string') {
		if ((dialog = this.closest('.ui-dialog')).length) {
			if (opts === 'open') {
				if (dialog.css('display') === 'none') {
					// Need dialog.show() and hide() to detect elements size in open() callbacks
					dialog.trigger('posinit').show().trigger('open').hide();
					dialog.fadeIn(120, function() {
						fm.trigger('dialogopened', {dialog: dialog});
					});
				}
			} else if (opts === 'close' || opts === 'destroy') {
				dialog.stop(true);
				if (dialog.is(':visible') || elfNode.is(':hidden')) {
					dialog.trigger('close');
					fm.trigger('dialogclosed', {dialog: dialog});
				}
				if (opts === 'destroy') {
					dialog.remove();
					fm.trigger('dialogremoved', {dialog: dialog});
				}
			} else if (opts === 'toTop') {
				dialog.trigger('totop');
				fm.trigger('dialogtotoped', {dialog: dialog});
			} else if (opts === 'posInit') {
				dialog.trigger('posinit');
				fm.trigger('dialogposinited', {dialog: dialog});
			} else if (opts === 'tabstopsInit') {
				dialog.trigger('tabstopsInit');
				fm.trigger('dialogtabstopsinited', {dialog: dialog});
			} else if (opts === 'checkEditing') {
				checkEditing();
			}
		}
		return this;
	}
	
	opts = Object.assign({}, jQuery.fn.elfinderdialog.defaults, opts);
	
	if (opts.allowMinimize && opts.allowMinimize === 'auto') {
		opts.allowMinimize = this.find('textarea,input').length? true : false; 
	}
	opts.openMaximized = opts.allowMinimize && opts.openMaximized;
	if (opts.headerBtnPos && opts.headerBtnPos === 'auto') {
		opts.headerBtnPos = platformWin? 'right' : 'left';
	}
	if (opts.headerBtnOrder && opts.headerBtnOrder === 'auto') {
		opts.headerBtnOrder = platformWin? 'close:maximize:minimize' : 'close:minimize:maximize';
	}
	
	if (opts.modal && opts.allowMinimize) {
		opts.allowMinimize = false;
	}
	
	if (fm.options.dialogContained) {
		syncSize.width = syncSize.height = syncSize.enabled = true;
	} else {
		syncSize.width = (opts.maxWidth === 'window');
		syncSize.height = (opts.maxHeight === 'window');
		if (syncSize.width || syncSize.height) {
			syncSize.enabled = true;
		}
	}

	propagationEvents = fm.arrayFlip(opts.propagationEvents, true);
	
	this.filter(':not(.ui-dialog-content)').each(function() {
		var self       = jQuery(this).addClass('ui-dialog-content ui-widget-content'),
			clactive   = 'elfinder-dialog-active',
			cldialog   = 'elfinder-dialog',
			clnotify   = 'elfinder-dialog-notify',
			clhover    = 'ui-state-hover',
			cltabstop  = 'elfinder-tabstop',
			cl1stfocus = 'elfinder-focus',
			clmodal    = 'elfinder-dialog-modal',
			id         = parseInt(Math.random()*1000000),
			titlebar   = jQuery('<div class="ui-dialog-titlebar ui-widget-header ui-corner-top ui-helper-clearfix"><span class="elfinder-dialog-title">'+opts.title+'</span></div>'),
			buttonset  = jQuery('<div class="ui-dialog-buttonset"/>'),
			buttonpane = jQuery('<div class=" ui-helper-clearfix ui-dialog-buttonpane ui-widget-content"/>')
				.append(buttonset),
			btnWidth   = 0,
			btnCnt     = 0,
			tabstops   = jQuery(),
			evCover    = jQuery('<div style="width:100%;height:100%;position:absolute;top:0px;left:0px;"/>').hide(),
			numberToTel = function() {
				if (opts.optimizeNumber) {
					dialog.find('input[type=number]').each(function() {
						jQuery(this).attr('inputmode', 'numeric');
						jQuery(this).attr('pattern', '[0-9]*');
					});
				}
			},
			tabstopsInit = function() {
				tabstops = dialog.find('.'+cltabstop);
				if (tabstops.length) {
					tabstops.attr('tabindex', '-1');
					if (! tabstops.filter('.'+cl1stfocus).length) {
						buttonset.children('.'+cltabstop+':'+(platformWin? 'first' : 'last')).addClass(cl1stfocus);
					}
				}
			},
			tabstopNext = function(cur) {
				var elms = tabstops.filter(':visible:enabled'),
					node = cur? null : elms.filter('.'+cl1stfocus+':first');
					
				if (! node || ! node.length) {
					node = elms.first();
				}
				if (cur) {
					jQuery.each(elms, function(i, elm) {
						if (elm === cur && elms[i+1]) {
							node = elms.eq(i+1);
							return false;
						}
					});
				}
				return node;
			},
			tabstopPrev = function(cur) {
				var elms = tabstops.filter(':visible:enabled'),
					node = elms.last();
				jQuery.each(elms, function(i, elm) {
					if (elm === cur && elms[i-1]) {
						node = elms.eq(i-1);
						return false;
					}
				});
				return node;
			},
			makeHeaderBtn = function() {
				jQuery.each(opts.headerBtnOrder.split(':').reverse(), function(i, v) {
					headerBtns[v] && headerBtns[v]();
				});
				if (platformWin) {
					titlebar.children('.elfinder-titlebar-button').addClass('elfinder-titlebar-button-right');
				}
			},
			headerBtns = {
				close: function() {
					titlebar.prepend(jQuery('<span class="ui-widget-header ui-dialog-titlebar-close ui-corner-all elfinder-titlebar-button"><span class="ui-icon ui-icon-closethick"/></span>')
						.on('mousedown', function(e) {
							e.preventDefault();
							e.stopPropagation();
							self.elfinderdialog('close');
						})
					);
				},
				maximize: function() {
					if (opts.allowMaximize) {
						dialog.on('resize', function(e, data) {
							var full, elm;
							e.preventDefault();
							e.stopPropagation();
							if (data && data.maximize) {
								elm = titlebar.find('.elfinder-titlebar-full');
								full = (data.maximize === 'on');
								elm.children('span.ui-icon')
									.toggleClass('ui-icon-plusthick', ! full)
									.toggleClass('ui-icon-arrowreturnthick-1-s', full);
								if (full) {
									try {
										dialog.hasClass('ui-draggable') && dialog.draggable('disable');
										dialog.hasClass('ui-resizable') && dialog.resizable('disable');
									} catch(e) {}
									self.css('width', '100%').css('height', dialog.height() - dialog.children('.ui-dialog-titlebar').outerHeight(true) - buttonpane.outerHeight(true));
								} else {
									self.attr('style', elm.data('style'));
									elm.removeData('style');
									posCheck();
									try {
										dialog.hasClass('ui-draggable') && dialog.draggable('enable');
										dialog.hasClass('ui-resizable') && dialog.resizable('enable');
									} catch(e) {}
								}
								dialog.trigger('resize', {init: true});
							}
						});
						titlebar.prepend(jQuery('<span class="ui-widget-header ui-corner-all elfinder-titlebar-button elfinder-titlebar-full"><span class="ui-icon ui-icon-plusthick"/></span>')
							.on('mousedown', function(e) {
								var elm = jQuery(this);
								e.preventDefault();
								e.stopPropagation();
								if (!dialog.hasClass('elfinder-maximized') && typeof elm.data('style') === 'undefined') {
									self.height(self.height());
									elm.data('style', self.attr('style') || '');
								}
								fm.toggleMaximize(dialog);
								typeof(opts.maximize) === 'function' && opts.maximize.call(self[0]);
							})
						);
					}
					
				},
				minimize: function() {
					var btn, mnode, doffset;
					if (opts.allowMinimize) {
						btn = jQuery('<span class="ui-widget-header ui-corner-all elfinder-titlebar-button elfinder-titlebar-minimize"><span class="ui-icon ui-icon-minusthick"/></span>')
							.on('mousedown', function(e) {
								var $this = jQuery(this),
									tray = fm.getUI('bottomtray'),
									dumStyle = { width: 70, height: 24 },
									dum = jQuery('<div/>').css(dumStyle).addClass(dialog.get(0).className + ' elfinder-dialog-minimized'),
									pos = {};
								
								e.preventDefault();
								e.stopPropagation();
								if (!dialog.data('minimized')) {
									// minimize
									doffset = dialog.data('minimized', true).position();
									mnode = dialog.clone().on('mousedown', function() {
										$this.trigger('mousedown');
									}).removeClass('ui-draggable ui-resizable elfinder-frontmost');
									tray.append(dum);
									Object.assign(pos, dum.offset(), dumStyle);
									dum.remove();
									mnode.height(dialog.height()).children('.ui-dialog-content:first').empty();
									fm.toHide(dialog.before(mnode));
									mnode.children('.ui-dialog-content:first,.ui-dialog-buttonpane,.ui-resizable-handle').remove();
									mnode.find('.elfinder-titlebar-minimize,.elfinder-titlebar-full').remove();
									mnode.find('.ui-dialog-titlebar-close').on('mousedown', function(e) {
										e.stopPropagation();
										e.preventDefault();
										mnode.remove();
										dialog.show();
										self.elfinderdialog('close');
									});
									mnode.animate(pos, function() {
										mnode.attr('style', '')
										.css({ maxWidth: dialog.width() })
										.addClass('elfinder-dialog-minimized')
										.appendTo(tray);
										checkEditing();
										typeof(opts.minimize) === 'function' && opts.minimize.call(self[0]);
									});
								} else {
									//restore
									dialog.removeData('minimized').before(mnode.css(Object.assign({'position': 'absolute'}, mnode.offset())));
									fm.toFront(mnode);
									mnode.animate(Object.assign({ width: dialog.width(), height: dialog.height() }, doffset), function() {
										dialog.show();
										fm.toFront(dialog);
										mnode.remove();
										posCheck();
										checkEditing();
										dialog.trigger('resize', {init: true});
										typeof(opts.minimize) === 'function' && opts.minimize.call(self[0]);
									});
								}
							});
						titlebar.on('dblclick', function(e) {
							jQuery(this).children('.elfinder-titlebar-minimize').trigger('mousedown');
						}).prepend(btn);
						dialog.on('togleminimize', function() {
							btn.trigger('mousedown');
						});
					}
				}
			},
			dialog = jQuery('<div class="ui-front ui-dialog ui-widget ui-widget-content ui-corner-all ui-draggable std42-dialog touch-punch '+cldialog+' '+opts.cssClass+'"/>')
				.hide()
				.append(self)
				.appendTo(elfNode)
				.draggable({
					containment : fm.options.dialogContained? elfNode : null,
					handle : '.ui-dialog-titlebar',
					start : function() {
						evCover.show();
					},
					drag : function(e, ui) {
						var top = ui.offset.top,
							left = ui.offset.left;
						if (top < 0) {
							ui.position.top = ui.position.top - top;
						}
						if (left < 0) {
							ui.position.left = ui.position.left - left;
						}
						if (fm.options.dialogContained) {
							ui.position.top < 0 && (ui.position.top = 0);
							ui.position.left < 0 && (ui.position.left = 0);
						}
					},
					stop : function(e, ui) {
						evCover.hide();
						dialog.css({height : opts.height});
						self.data('draged', true);
					}
				})
				.css({
					width     : opts.width,
					height    : opts.height,
					minWidth  : opts.minWidth,
					minHeight : opts.minHeight,
					maxWidth  : opts.maxWidth,
					maxHeight : opts.maxHeight
				})
				.on('touchstart touchmove touchend click dblclick mouseup mouseenter mouseleave mouseout mouseover mousemove', function(e) {
					// stopPropagation of user action events
					!propagationEvents[e.type] && e.stopPropagation();
				})
				.on('mousedown', function(e) {
					!propagationEvents[e.type] && e.stopPropagation();
					requestAnimationFrame(function() {
						if (dialog.is(':visible') && !dialog.hasClass('elfinder-frontmost')) {
							toFocusNode = jQuery(':focus');
							if (!toFocusNode.length) {
								toFocusNode = void(0);
							}
							dialog.trigger('totop');
						}
					});
				})
				.on('open', function() {
					dialog.data('margin-y', self.outerHeight(true) - self.height());
					if (syncSize.enabled) {
						if (opts.height && opts.height !== 'auto') {
							dialog.trigger('resize', {init: true});
						}
						if (!syncSize.defaultSize) {
							syncSize.defaultSize = { width: self.width(), height: self.height() };
						}
						fitSize(dialog);
						dialog.trigger('resize').trigger('posinit');
						elfNode.on('resize.'+fm.namespace, dialog, syncFunc);
					}
					
					if (!dialog.hasClass(clnotify)) {
						elfNode.children('.'+cldialog+':visible:not(.'+clnotify+')').each(function() {
							var d     = jQuery(this),
								top   = parseInt(d.css('top')),
								left  = parseInt(d.css('left')),
								_top  = parseInt(dialog.css('top')),
								_left = parseInt(dialog.css('left')),
								ct    = Math.abs(top - _top) < 10,
								cl    = Math.abs(left - _left) < 10;

							if (d[0] != dialog[0] && (ct || cl)) {
								dialog.css({
									top  : ct ? (top + 10) : _top,
									left : cl ? (left + 10) : _left
								});
							}
						});
					} 
					
					if (dialog.data('modal')) {
						dialog.addClass(clmodal);
						fm.getUI('overlay').elfinderoverlay('show');
					}
					
					dialog.trigger('totop');
					
					opts.openMaximized && fm.toggleMaximize(dialog);

					fm.trigger('dialogopen', {dialog: dialog});

					typeof(opts.open) == 'function' && jQuery.proxy(opts.open, self[0])();
					
					if (opts.closeOnEscape) {
						jQuery(document).on('keydown.'+id, function(e) {
							if (e.keyCode == jQuery.ui.keyCode.ESCAPE && dialog.hasClass('elfinder-frontmost')) {
								self.elfinderdialog('close');
							}
						});
					}
					dialog.hasClass(fm.res('class', 'editing')) && checkEditing();
				})
				.on('close', function(e) {
					var dialogs, dfd;
					
					if (opts.beforeclose && typeof opts.beforeclose === 'function') {
						dfd = opts.beforeclose();
						if (!dfd || !dfd.promise) {
							dfd = !dfd? jQuery.Deferred().reject() : jQuery.Deferred().resolve();
						}
					} else {
						dfd = jQuery.Deferred().resolve();
					}
					
					dfd.done(function() {
						syncSize.enabled && elfNode.off('resize.'+fm.namespace, syncFunc);
						
						if (opts.closeOnEscape) {
							jQuery(document).off('keyup.'+id);
						}
						
						if (opts.allowMaximize) {
							fm.toggleMaximize(dialog, false);
						}
						
						fm.toHide(dialog);
						dialog.data('modal') && fm.getUI('overlay').elfinderoverlay('hide');
						
						if (typeof(opts.close) == 'function') {
							jQuery.proxy(opts.close, self[0])();
						}
						if (opts.destroyOnClose && dialog.parent().length) {
							dialog.hide().remove();
						}
						
						// get focus to next dialog
						dialogs = elfNode.children('.'+cldialog+':visible');
						
						dialog.hasClass(fm.res('class', 'editing')) && checkEditing();
					});
				})
				.on('totop frontmost', function() {
					var s = fm.storage('autoFocusDialog');
					
					dialog.data('focusOnMouseOver', s? (s > 0) : fm.options.uiOptions.dialog.focusOnMouseOver);
					
					if (dialog.data('minimized')) {
						titlebar.children('.elfinder-titlebar-minimize').trigger('mousedown');
					}
					
					if (!dialog.data('modal') && fm.getUI('overlay').is(':visible')) {
						fm.getUI('overlay').before(dialog);
					} else {
						fm.toFront(dialog);
					}
					elfNode.children('.'+cldialog+':not(.'+clmodal+')').removeClass(clactive);
					dialog.addClass(clactive);

					! fm.UA.Mobile && (toFocusNode || tabstopNext()).trigger('focus');

					toFocusNode = void(0);
				})
				.on('posinit', function() {
					var css = opts.position,
						nodeOffset, minTop, minLeft, outerSize, win, winSize, nodeFull;
					if (dialog.hasClass('elfinder-maximized')) {
						return;
					}
					if (! css && ! dialog.data('resizing')) {
						nodeFull = elfNode.hasClass('elfinder-fullscreen');
						dialog.css(nodeFull? {
							maxWidth  : '100%',
							maxHeight : '100%',
							overflow   : 'auto'
						} : restoreStyle);
						if (fm.UA.Mobile && !nodeFull && dialog.data('rotated') === fm.UA.Rotated) {
							return;
						}
						dialog.data('rotated', fm.UA.Rotated);
						win = jQuery(window);
						nodeOffset = elfNode.offset();
						outerSize = {
							width : dialog.outerWidth(true),
							height: dialog.outerHeight(true)
						};
						outerSize.right = nodeOffset.left + outerSize.width;
						outerSize.bottom = nodeOffset.top + outerSize.height;
						winSize = {
							scrLeft: win.scrollLeft(),
							scrTop : win.scrollTop(),
							width  : win.width(),
							height : win.height()
						};
						winSize.right = winSize.scrLeft + winSize.width;
						winSize.bottom = winSize.scrTop + winSize.height;
						
						if (fm.options.dialogContained || nodeFull) {
							minTop = 0;
							minLeft = 0;
						} else {
							minTop = nodeOffset.top * -1 + winSize.scrTop;
							minLeft = nodeOffset.left * -1 + winSize.scrLeft;
						}
						css = {
							top  : outerSize.height >= winSize.height? minTop  : Math.max(minTop, parseInt((elfNode.height() - outerSize.height)/2 - 42)),
							left : outerSize.width  >= winSize.width ? minLeft : Math.max(minLeft, parseInt((elfNode.width() - outerSize.width)/2))
						};
						if (outerSize.right + css.left > winSize.right) {
							css.left = Math.max(minLeft, winSize.right - outerSize.right);
						}
						if (outerSize.bottom + css.top > winSize.bottom) {
							css.top = Math.max(minTop, winSize.bottom - outerSize.bottom);
						}
					}
					if (opts.absolute) {
						css.position = 'absolute';
					}
					css && dialog.css(css);
				})
				.on('resize', function(e, data) {
					var oh = 0, init = data && data.init, h, minH;
					if ((data && (data.minimize || data.maxmize)) || dialog.data('minimized')) {
						return;
					}
					e.stopPropagation();
					e.preventDefault();
					dialog.children('.ui-widget-header,.ui-dialog-buttonpane').each(function() {
						oh += jQuery(this).outerHeight(true);
					});
					if (!init && syncSize.enabled && !e.originalEvent && !dialog.hasClass('elfinder-maximized')) {
						h = Math.min(syncSize.defaultSize.height, Math.max(parseInt(dialog.css('max-height')), parseInt(dialog.css('min-height'))) - oh - dialog.data('margin-y'));
					} else {
						h = dialog.height() - oh - dialog.data('margin-y');
					}
					self.height(h);
					if (init) {
						return;
					}
					posCheck();
					minH = self.height();
					minH = (h < minH)? (minH + oh + dialog.data('margin-y')) : opts.minHeight;
					dialog.css('min-height', minH);
					dialog.data('hasResizable') && dialog.resizable('option', { minHeight: minH });
					if (typeof(opts.resize) === 'function') {
						jQuery.proxy(opts.resize, self[0])(e, data);
					}
				})
				.on('tabstopsInit', tabstopsInit)
				.on('focus', '.'+cltabstop, function() {
					jQuery(this).addClass(clhover).parent('label').addClass(clhover);
					this.id && jQuery(this).parent().find('label[for='+this.id+']').addClass(clhover);
				})
				.on('click', 'select.'+cltabstop, function() {
					var node = jQuery(this);
					node.data('keepFocus')? node.removeData('keepFocus') : node.data('keepFocus', true);
				})
				.on('blur', '.'+cltabstop, function() {
					jQuery(this).removeClass(clhover).removeData('keepFocus').parent('label').removeClass(clhover);
					this.id && jQuery(this).parent().find('label[for='+this.id+']').removeClass(clhover);
				})
				.on('mouseenter mouseleave', '.'+cltabstop+',label', function(e) {
					var $this = jQuery(this), labelfor;
					if (this.nodeName === 'LABEL') {
						if (!$this.children('.'+cltabstop).length && (!(labelfor = $this.attr('for')) || !jQuery('#'+labelfor).hasClass(cltabstop))) {
							return;
						}
					}
					if (opts.btnHoverFocus && dialog.data('focusOnMouseOver')) {
						if (e.type === 'mouseenter' && ! jQuery(':focus').data('keepFocus')) {
							$this.trigger('focus');
						}
					} else {
						$this.toggleClass(clhover, e.type == 'mouseenter');
					}
				})
				.on('keydown', '.'+cltabstop, function(e) {
					var $this = jQuery(this),
						esc, move, moveTo;
					if ($this.is(':focus')) {
						esc = e.keyCode === jQuery.ui.keyCode.ESCAPE;
						if (e.keyCode === jQuery.ui.keyCode.ENTER) {
							e.preventDefault();
							$this.trigger('click');
						}  else if (((e.keyCode === jQuery.ui.keyCode.TAB) && e.shiftKey) || e.keyCode === jQuery.ui.keyCode.LEFT || e.keyCode == jQuery.ui.keyCode.UP) {
							move = 'prev';
						}  else if (e.keyCode === jQuery.ui.keyCode.TAB || e.keyCode == jQuery.ui.keyCode.RIGHT || e.keyCode == jQuery.ui.keyCode.DOWN) {
							move = 'next';
						}
						if (move
								&&
							(
								($this.is('textarea') && !(e.ctrlKey || e.metaKey))
									||
								($this.is('select,span.ui-slider-handle') && e.keyCode !== jQuery.ui.keyCode.TAB)
									||
								($this.is('input:not(:checkbox,:radio)') && (!(e.ctrlKey || e.metaKey) && e.keyCode === jQuery.ui.keyCode[move === 'prev'? 'LEFT':'RIGHT']))
							)
						) {
							e.stopPropagation();
							return;
						}
						if (!esc) {
							e.stopPropagation();
						} else if ($this.is('input:not(:checkbox,:radio),textarea')) {
							if ($this.val() !== '') {
								$this.val('');
								e.stopPropagation();
							}
						}
						if (move) {
							e.preventDefault();
							(move === 'prev'? tabstopPrev : tabstopNext)(this).trigger('focus');
						}
					}
				})
				.data({modal: opts.modal}),
			posCheck = function() {
				var node = fm.getUI(),
					pos;
				if (node.hasClass('elfinder-fullscreen')) {
					pos = dialog.position();
					dialog.css('top', Math.max(Math.min(Math.max(pos.top, 0), node.height() - 100), 0));
					dialog.css('left', Math.max(Math.min(Math.max(pos.left, 0), node.width() - 200), 0));
				}
			},
			maxSize, toFocusNode;
		
		dialog.prepend(titlebar);

		makeHeaderBtn();

		jQuery.each(opts.buttons, function(name, cb) {
			var button = jQuery('<button type="button" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only '
					+'elfinder-btncnt-'+(btnCnt++)+' '
					+cltabstop
					+'"><span class="ui-button-text">'+name+'</span></button>')
				.on('click', jQuery.proxy(cb, self[0]));
			if (cb._cssClass) {
				button.addClass(cb._cssClass);
			}
			if (platformWin) {
				buttonset.append(button);
			} else {
				buttonset.prepend(button);
			}
		});
		
		if (buttonset.children().length) {
			dialog.append(buttonpane);
			
			dialog.show();
			buttonpane.find('button').each(function(i, btn) {
				btnWidth += jQuery(btn).outerWidth(true);
			});
			dialog.hide();
			btnWidth += 20;
			
			if (dialog.width() < btnWidth) {
				dialog.width(btnWidth);
			}
		}
		
		dialog.append(evCover);
		
		if (syncSize.enabled) {
			delta.width = dialog.outerWidth(true) - dialog.width() + ((dialog.outerWidth() - dialog.width()) / 2);
			delta.height = dialog.outerHeight(true) - dialog.height() + ((dialog.outerHeight() - dialog.height()) / 2);
		}
		
		if (fm.options.dialogContained) {
			maxSize = {
				maxWidth: elfNode.width() - delta.width,
				maxHeight: elfNode.height() - delta.height
			};
			opts.maxWidth = opts.maxWidth? Math.min(maxSize.maxWidth, opts.maxWidth) : maxSize.maxWidth;
			opts.maxHeight = opts.maxHeight? Math.min(maxSize.maxHeight, opts.maxHeight) : maxSize.maxHeight;
			dialog.css(maxSize);
		}
		
		restoreStyle = {
			maxWidth  : dialog.css('max-width'),
			maxHeight : dialog.css('max-height'),
			overflow   : dialog.css('overflow')
		};
		
		if (opts.resizable) {
			dialog.resizable({
				minWidth   : opts.minWidth,
				minHeight  : opts.minHeight,
				maxWidth   : opts.maxWidth,
				maxHeight  : opts.maxHeight,
				start      : function() {
					evCover.show();
					if (dialog.data('resizing') !== true && dialog.data('resizing')) {
						clearTimeout(dialog.data('resizing'));
					}
					dialog.data('resizing', true);
				},
				stop       : function(e, ui) {
					evCover.hide();
					dialog.data('resizing', setTimeout(function() {
						dialog.data('resizing', false);
					}, 200));
					if (syncSize.enabled) {
						syncSize.defaultSize = { width: self.width(), height: self.height() };
					}
				}
			}).data('hasResizable', true);
		} 
		
		numberToTel();
		
		tabstopsInit();
		
		typeof(opts.create) == 'function' && jQuery.proxy(opts.create, this)();
		
		if (opts.autoOpen) {
			if (opts.open) {
				requestAnimationFrame(function() {
					self.elfinderdialog('open');
				});
			} else {
				self.elfinderdialog('open');
			}
		}

		if (opts.resize) {
			fm.bind('themechange', function() {
				setTimeout(function() {
					dialog.data('margin-y', self.outerHeight(true) - self.height());
					dialog.trigger('resize', {init: true});
				}, 300);
			});
		}
	});
	
	return this;
};

jQuery.fn.elfinderdialog.defaults = {
	cssClass  : '',
	title     : '',
	modal     : false,
	resizable : true,
	autoOpen  : true,
	closeOnEscape : true,
	destroyOnClose : false,
	buttons   : {},
	btnHoverFocus : true,
	position  : null,
	absolute  : false,
	width     : 320,
	height    : 'auto',
	minWidth  : 200,
	minHeight : 70,
	maxWidth  : null,
	maxHeight : null,
	allowMinimize : 'auto',
	allowMaximize : false,
	openMaximized : false,
	headerBtnPos : 'auto',
	headerBtnOrder : 'auto',
	optimizeNumber : true,
	propagationEvents : ['mousemove', 'mouseup']
};


/*
 * File: /js/ui/fullscreenbutton.js
 */

/**
 * @class  elFinder toolbar button to switch full scrren mode.
 *
 * @author Naoki Sawada
 **/

jQuery.fn.elfinderfullscreenbutton = function(cmd) {
		return this.each(function() {
		var button = jQuery(this).elfinderbutton(cmd),
			icon   = button.children('.elfinder-button-icon'),
			tm;
		cmd.change(function() {
			tm && cancelAnimationFrame(tm);
			tm = requestAnimationFrame(function() {
				var fullscreen = cmd.value;
				icon.addClass('elfinder-button-icon-fullscreen').toggleClass('elfinder-button-icon-unfullscreen', fullscreen);
				cmd.className = fullscreen? 'unfullscreen' : '';
			});
		});
	});
};


/*
 * File: /js/ui/navbar.js
 */

/**
 * @class elfindernav - elFinder container for diretories tree and places
 *
 * @author Dmitry (dio) Levashov
 **/
jQuery.fn.elfindernavbar = function(fm, opts) {
		this.not('.elfinder-navbar').each(function() {
		var nav    = jQuery(this).hide().addClass('ui-state-default elfinder-navbar'),
			parent = nav.css('overflow', 'hidden').parent(),
			wz     = parent.children('.elfinder-workzone').append(nav),
			ltr    = fm.direction == 'ltr',
			delta, deltaW, handle, swipeHandle, autoHide, setWidth, navdock,
			setWzRect = function() {
				var cwd = fm.getUI('cwd'),
					wz  = fm.getUI('workzone'),
					wzRect = wz.data('rectangle'),
					cwdOffset = cwd.offset();
				wz.data('rectangle', Object.assign(wzRect, { cwdEdge: (fm.direction === 'ltr')? cwdOffset.left : cwdOffset.left + cwd.width() }));
			},
			setDelta = function() {
				nav.css('overflow', 'hidden');
				delta  = Math.round(nav.outerHeight() - nav.height());
				deltaW = Math.round(navdock.outerWidth() - navdock.innerWidth());
				nav.css('overflow', 'auto');
			};

		fm.one('init', function() {
			navdock = fm.getUI('navdock');
			var set = function() {
					setDelta();
					fm.bind('wzresize', function() {
						var navdockH = 0;
						navdock.width(nav.outerWidth() - deltaW);
						if (navdock.children().length > 1) {
							navdockH = navdock.outerHeight(true);
						}
						nav.height(wz.height() - navdockH - delta);
					}).trigger('wzresize');
				};
			if (fm.cssloaded) {
				set();
			} else {
				fm.one('cssloaded', set);
			}
		})
		.one('opendone',function() {
			handle && handle.trigger('resize');
			nav.css('overflow', 'auto');
		}).bind('themechange', setDelta);
		
		if (fm.UA.Touch) {
			autoHide = fm.storage('autoHide') || {};
			if (typeof autoHide.navbar === 'undefined') {
				autoHide.navbar = (opts.autoHideUA && opts.autoHideUA.length > 0 && jQuery.grep(opts.autoHideUA, function(v){ return fm.UA[v]? true : false; }).length);
				fm.storage('autoHide', autoHide);
			}
			
			if (autoHide.navbar) {
				fm.one('init', function() {
					if (nav.children().length) {
						fm.uiAutoHide.push(function(){ nav.stop(true, true).trigger('navhide', { duration: 'slow', init: true }); });
					}
				});
			}
			
			fm.bind('load', function() {
				if (nav.children().length) {
					swipeHandle = jQuery('<div class="elfinder-navbar-swipe-handle"/>').hide().appendTo(wz);
					if (swipeHandle.css('pointer-events') !== 'none') {
						swipeHandle.remove();
						swipeHandle = null;
					}
				}
			});
			
			nav.on('navshow navhide', function(e, data) {
				var mode     = (e.type === 'navshow')? 'show' : 'hide',
					duration = (data && data.duration)? data.duration : 'fast',
					handleW = (data && data.handleW)? data.handleW : Math.max(50, fm.getUI().width() / 10);
				nav.stop(true, true)[mode]({
					duration: duration,
					step    : function() {
						fm.trigger('wzresize');
					},
					complete: function() {
						if (swipeHandle) {
							if (mode === 'show') {
								swipeHandle.stop(true, true).hide();
							} else {
								swipeHandle.width(handleW? handleW : '');
								fm.resources.blink(swipeHandle, 'slowonce');
							}
						}
						fm.trigger('navbar'+ mode);
						data.init && fm.trigger('uiautohide');
						setWzRect();
					}
				});
				autoHide.navbar = (mode !== 'show');
				fm.storage('autoHide', Object.assign(fm.storage('autoHide'), {navbar: autoHide.navbar}));
			}).on('touchstart', function(e) {
				if (jQuery(this)['scroll' + (fm.direction === 'ltr'? 'Right' : 'Left')]() > 5) {
					e.originalEvent._preventSwipeX = true;
				}
			});
		}
		
		if (! fm.UA.Mobile) {
			handle = nav.resizable({
					handles : ltr ? 'e' : 'w',
					minWidth : opts.minWidth || 150,
					maxWidth : opts.maxWidth || 500,
					resize : function() {
						fm.trigger('wzresize');
					},
					stop : function(e, ui) {
						fm.storage('navbarWidth', ui.size.width);
						setWzRect();
					}
				})
				.on('resize scroll', function(e) {
					var $this = jQuery(this),
						tm = $this.data('posinit');
					e.preventDefault();
					e.stopPropagation();
					if (! ltr && e.type === 'resize') {
						nav.css('left', 0);
					}
					tm && cancelAnimationFrame(tm);
					$this.data('posinit', requestAnimationFrame(function() {
						var offset = (fm.UA.Opera && nav.scrollLeft())? 20 : 2;
						handle.css('top', 0).css({
							top  : parseInt(nav.scrollTop())+'px',
							left : ltr ? 'auto' : parseInt(nav.scrollRight() -  offset) * -1,
							right: ltr ? parseInt(nav.scrollLeft() - offset) * -1 : 'auto'
						});
						if (e.type === 'resize') {
							fm.getUI('cwd').trigger('resize');
						}
					}));
				})
				.children('.ui-resizable-handle').addClass('ui-front');
		}

		if (setWidth = fm.storage('navbarWidth')) {
			nav.width(setWidth);
		} else {
			if (fm.UA.Mobile) {
				fm.one('cssloaded', function() {
					var set = function() {
						setWidth = nav.parent().width() / 2;
						if (nav.data('defWidth') > setWidth) {
							nav.width(setWidth);
						} else {
							nav.width(nav.data('defWidth'));
						}
						nav.data('width', nav.width());
						fm.trigger('wzresize');
					};
					nav.data('defWidth', nav.width());
					jQuery(window).on('resize.' + fm.namespace, set);
					set();
				});
			}
		}

	});
	
	return this;
};


/*
 * File: /js/ui/navdock.js
 */

/**
 * @class elfindernavdock - elFinder container for preview etc at below the navbar
 *
 * @author Naoki Sawada
 **/
jQuery.fn.elfindernavdock = function(fm, opts) {
		this.not('.elfinder-navdock').each(function() {
		var self = jQuery(this).hide().addClass('ui-state-default elfinder-navdock touch-punch'),
			node = self.parent(),
			wz   = node.children('.elfinder-workzone').append(self),
			resize = function(to, h) {
				var curH = h || self.height(),
					diff = to - curH,
					len  = Object.keys(sizeSyncs).length,
					calc = len? diff / len : 0,
					ovf;
				if (diff) {
					ovf = self.css('overflow');
					self.css('overflow', 'hidden');
					self.height(to);
					jQuery.each(sizeSyncs, function(id, n) {
						n.height(n.height() + calc).trigger('resize.' + fm.namespace);
					});
					fm.trigger('wzresize');
					self.css('overflow', ovf);
				}
			},
			handle = jQuery('<div class="ui-front ui-resizable-handle ui-resizable-n"/>').appendTo(self),
			sizeSyncs = {},
			resizeFn = [],
			initMaxHeight = (parseInt(opts.initMaxHeight) || 50) / 100,
			maxHeight = (parseInt(opts.maxHeight) || 90) / 100,
			basicHeight, hasNode;
		
		
		self.data('addNode', function(cNode, opts) {
			var wzH = fm.getUI('workzone').height(),
				imaxH = wzH * initMaxHeight,
				curH, tH, mH;
			opts = Object.assign({
				first: false,
				sizeSync: true,
				init: false
			}, opts);
			if (!cNode.attr('id')) {
				cNode.attr('id', fm.namespace+'-navdock-' + (+new Date()));
			}
			opts.sizeSync && (sizeSyncs[cNode.attr('id')] = cNode);
			curH = self.height();
			tH = curH + cNode.outerHeight(true);
			
			if (opts.first) {
				handle.after(cNode);
			} else {
				self.append(cNode);
			}
			hasNode = true;
			self.resizable('enable').height(tH).show();
			
			fm.trigger('wzresize');
			
			if (opts.init) {
				mH = fm.storage('navdockHeight');
				if (mH) {
					tH = mH;
				} else {
					tH = tH > imaxH? imaxH : tH;
				}
				basicHeight = tH;
			}
			resize(Math.min(tH, wzH * maxHeight));
			
			return self;
		}).data('removeNode', function(nodeId, appendTo) {
			var cNode = jQuery('#'+nodeId);
			delete sizeSyncs[nodeId];
			self.height(self.height() - jQuery('#'+nodeId).outerHeight(true));
			if (appendTo) {
				if (appendTo === 'detach') {
					cNode = cNode.detach();
				} else {
					appendTo.append(cNode);
				}
			} else {
				cNode.remove();
			}
			if (self.children().length <= 1) {
				hasNode = false;
				self.resizable('disable').height(0).hide();
			}
			fm.trigger('wzresize');
			return cNode;
		});
		
		if (! opts.disabled) {
			fm.one('init', function() {
				var ovf;
				if (fm.getUI('navbar').children().not('.ui-resizable-handle').length) {
					self.data('dockEnabled', true);
					self.resizable({
						maxHeight: fm.getUI('workzone').height() * maxHeight,
						handles: { n: handle },
						start: function(e, ui) {
							ovf = self.css('overflow');
							self.css('overflow', 'hidden');
							fm.trigger('navdockresizestart', {event: e, ui: ui}, true);
						},
						resize: function(e, ui) {
							self.css('top', '');
							fm.trigger('wzresize', { inNavdockResize : true });
						},
						stop: function(e, ui) {
							fm.trigger('navdockresizestop', {event: e, ui: ui}, true);
							self.css('top', '');
							basicHeight = ui.size.height;
							fm.storage('navdockHeight', basicHeight);
							resize(basicHeight, ui.originalSize.height);
							self.css('overflow', ovf);
						}
					});
					fm.bind('wzresize', function(e) {
						var minH, maxH, h;
						if (self.is(':visible')) {
							maxH = fm.getUI('workzone').height() * maxHeight;
							if (! e.data || ! e.data.inNavdockResize) {
								h = self.height();
								if (maxH < basicHeight) {
									if (Math.abs(h - maxH) > 1) {
										resize(maxH);
									}
								} else {
									if (Math.abs(h - basicHeight) > 1) {
										resize(basicHeight);
									}
								}
							}
							self.resizable('option', 'maxHeight', maxH);
						}
					}).bind('themechange', function() {
						var oldH = Math.round(self.height());
						requestAnimationFrame(function() {
							var curH = Math.round(self.height()),
								diff = oldH - curH;
							if (diff !== 0) {
								resize(self.height(),  curH - diff);
							}
						});
					});
				}
				fm.bind('navbarshow navbarhide', function(e) {
					self[hasNode && e.type === 'navbarshow'? 'show' : 'hide']();
				});
			});
		}
	});
	return this;
};

/*
 * File: /js/ui/overlay.js
 */


jQuery.fn.elfinderoverlay = function(opts) {
		var fm = this.parent().elfinder('instance'),
		o, cnt, show, hide;
	
	this.filter(':not(.elfinder-overlay)').each(function() {
		opts = Object.assign({}, opts);
		jQuery(this).addClass('ui-front ui-widget-overlay elfinder-overlay')
			.hide()
			.on('mousedown', function(e) {
				e.preventDefault();
				e.stopPropagation();
			})
			.data({
				cnt  : 0,
				show : typeof(opts.show) == 'function' ? opts.show : function() { },
				hide : typeof(opts.hide) == 'function' ? opts.hide : function() { }
			});
	});
	
	if (opts == 'show') {
		o    = this.eq(0);
		cnt  = o.data('cnt') + 1;
		show = o.data('show');

		fm.toFront(o);
		o.data('cnt', cnt);

		if (o.is(':hidden')) {
			o.show();
			show();
		}
	} 
	
	if (opts == 'hide') {
		o    = this.eq(0);
		cnt  = o.data('cnt') - 1;
		hide = o.data('hide');
		
		o.data('cnt', cnt);
			
		if (cnt <= 0) {
			o.hide();
			hide();
		}
	}
	
	return this;
};


/*
 * File: /js/ui/panel.js
 */

jQuery.fn.elfinderpanel = function(fm) {
		return this.each(function() {
		var panel = jQuery(this).addClass('elfinder-panel ui-state-default ui-corner-all'),
			margin = 'margin-'+(fm.direction == 'ltr' ? 'left' : 'right');
		
		fm.one('load', function(e) {
			var navbar = fm.getUI('navbar');
			
			panel.css(margin, parseInt(navbar.outerWidth(true)));
			navbar.on('resize', function(e) {
				e.preventDefault();
				e.stopPropagation();
				panel.is(':visible') && panel.css(margin, parseInt(navbar.outerWidth(true)));
			});
		});
	});
};


/*
 * File: /js/ui/path.js
 */

/**
 * @class elFinder ui
 * Display current folder path in statusbar.
 * Click on folder name in path - open folder
 *
 * @author Dmitry (dio) Levashov
 **/
jQuery.fn.elfinderpath = function(fm, options) {
		return this.each(function() {
		var query  = '',
			target = '',
			mimes  = [],
			place  = 'statusbar',
			clHover= fm.res('class', 'hover'),
			prefix = 'path' + (elFinder.prototype.uniqueid? elFinder.prototype.uniqueid : '') + '-',
			wzbase = jQuery('<div class="ui-widget-header ui-helper-clearfix elfinder-workzone-path"/>'),
			path   = jQuery(this).addClass('elfinder-path').html('&nbsp;')
				.on('mousedown', 'span.elfinder-path-dir', function(e) {
					var hash = jQuery(this).attr('id').substr(prefix.length);
					e.preventDefault();
					if (hash != fm.cwd().hash) {
						jQuery(this).addClass(clHover);
						if (query) {
							fm.exec('search', query, { target: hash, mime: mimes.join(' ') });
						} else {
							fm.trigger('select', {selected : [hash]}).exec('open', hash);
						}
					}
				})
				.prependTo(fm.getUI('statusbar').show()),
			roots = jQuery('<div class="elfinder-path-roots"/>').on('click', function(e) {
				e.stopPropagation();
				e.preventDefault();
				
				var roots = jQuery.map(fm.roots, function(h) { return fm.file(h); }),
				raw = [];

				jQuery.each(roots, function(i, f) {
					if (! f.phash && fm.root(fm.cwd().hash, true) !== f.hash) {
						raw.push({
							label    : fm.escape(f.i18 || f.name),
							icon     : 'home',
							callback : function() { fm.exec('open', f.hash); },
							options  : {
								iconClass : f.csscls || '',
								iconImg   : f.icon   || ''
							}
						});
					}
				});
				fm.trigger('contextmenu', {
					raw: raw,
					x: e.pageX,
					y: e.pageY
				});
			}).append('<span class="elfinder-button-icon elfinder-button-icon-menu" />').appendTo(wzbase),
			render = function(cwd) {
				var dirs = [],
					names = [];
				jQuery.each(fm.parents(cwd), function(i, hash) {
					var c = (cwd === hash)? 'elfinder-path-dir elfinder-path-cwd' : 'elfinder-path-dir',
						f = fm.file(hash),
						name = fm.escape(f.i18 || f.name);
					names.push(name);
					dirs.push('<span id="'+prefix+hash+'" class="'+c+'" title="'+names.join(fm.option('separator'))+'">'+name+'</span>');
				});
				return dirs.join('<span class="elfinder-path-other">'+fm.option('separator')+'</span>');
			},
			toWorkzone = function() {
				var prev;
				path.children('span.elfinder-path-dir').attr('style', '');
				prev = fm.direction === 'ltr'? jQuery('#'+prefix + fm.cwd().hash).prevAll('span.elfinder-path-dir:first') : jQuery();
				path.scrollLeft(prev.length? prev.position().left : 0);
			},
			fit = function() {
				if (fm.UA.CSS.flex) {
					return;
				}
				var dirs = path.children('span.elfinder-path-dir'),
					cnt  = dirs.length,
					m, bg = 0, ids;
				
				if (place === 'workzone' || cnt < 2) {
					dirs.attr('style', '');
					return;
				}
				path.width(path.css('max-width'));
				dirs.css({maxWidth: (100/cnt)+'%', display: 'inline-block'});
				m = path.width() - 9;
				path.children('span.elfinder-path-other').each(function() {
					m -= jQuery(this).width();
				});
				ids = [];
				dirs.each(function(i) {
					var dir = jQuery(this),
						w   = dir.width();
					m -= w;
					if (w < this.scrollWidth) {
						ids.push(i);
					}
				});
				path.width('');
				if (ids.length) {
					if (m > 0) {
						m = m / ids.length;
						jQuery.each(ids, function(i, k) {
							var d = jQuery(dirs[k]);
							d.css('max-width', d.width() + m);
						});
					}
					dirs.last().attr('style', '');
				} else {
					dirs.attr('style', '');
				}
			},
			hasUiTree, hasUiStat;

		fm.one('init', function() {
			hasUiTree = fm.getUI('tree').length;
			hasUiStat = fm.getUI('stat').length;
			if (! hasUiTree && options.toWorkzoneWithoutNavbar) {
				wzbase.append(path).insertBefore(fm.getUI('workzone'));
				place = 'workzone';
				fm.bind('open', toWorkzone)
				.one('opendone', function() {
					fm.getUI().trigger('resize');
				});
			}
		})
		.bind('open searchend parents', function() {
			var dirs = [];

			query  = '';
			target = '';
			mimes  = [];
			
			path.html(render(fm.cwd().hash));
			if (Object.keys(fm.roots).length > 1) {
				path.css('margin', '');
				roots.show();
			} else {
				path.css('margin', 0);
				roots.hide();
			}
			!hasUiStat && fit();
		})
		.bind('searchstart', function(e) {
			if (e.data) {
				query  = e.data.query || '';
				target = e.data.target || '';
				mimes  = e.data.mimes || [];
			}
		})
		.bind('search', function(e) {
			var dirs = [],
				html = '';
			if (target) {
				html = render(target);
			} else {
				html = fm.i18n('btnAll');
			}
			path.html('<span class="elfinder-path-other">'+fm.i18n('searcresult') + ': </span>' + html);
			fit();
		})
		// on swipe to navbar show/hide
		.bind('navbarshow navbarhide', function() {
			var wz = fm.getUI('workzone');
			if (this.type === 'navbarshow') {
				fm.unbind('open', toWorkzone);
				path.prependTo(fm.getUI('statusbar'));
				wzbase.detach();
				place = 'statusbar';
			} else {
				wzbase.append(path).insertBefore(wz);
				place = 'workzone';
				toWorkzone();
				fm.bind('open', toWorkzone);
			}
			fm.trigger('uiresize');
		})
		.bind('resize uistatchange', fit);
	});
};


/*
 * File: /js/ui/places.js
 */

/**
 * @class elFinder places/favorites ui
 *
 * @author Dmitry (dio) Levashov
 * @author Naoki Sawada
 **/
jQuery.fn.elfinderplaces = function(fm, opts) {
		return this.each(function() {
		var dirs      = {},
			c         = 'class',
			navdir    = fm.res(c, 'navdir'),
			collapsed = fm.res(c, 'navcollapse'),
			expanded  = fm.res(c, 'navexpand'),
			hover     = fm.res(c, 'hover'),
			clroot    = fm.res(c, 'treeroot'),
			dropover  = fm.res(c, 'adroppable'),
			tpl       = fm.res('tpl', 'placedir'),
			ptpl      = fm.res('tpl', 'perms'),
			spinner   = jQuery(fm.res('tpl', 'navspinner')),
			suffix    = opts.suffix? opts.suffix : '',
			key       = 'places' + suffix,
			menuTimer = null,
			/**
			 * Convert places dir node into dir hash
			 *
			 * @param  String  directory id
			 * @return String
			 **/
			id2hash   = function(id) { return id.substr(6);	},
			/**
			 * Convert places dir hash into dir node id
			 *
			 * @param  String  directory id
			 * @return String
			 **/
			hash2id   = function(hash) { return 'place-'+hash; },

			/**
			 * Convert places dir hash into dir node elment (jQuery object)
			 *
			 * @param  String  directory id
			 * @return Object
			 **/
			hash2elm  = function(hash) { return jQuery(document.getElementById(hash2id(hash))); },
			
			/**
			 * Save current places state
			 *
			 * @return void
			 **/
			save      = function() {
				var hashes = [], data = {};
				
				hashes = jQuery.map(subtree.children().find('[id]'), function(n) {
					return id2hash(n.id);
				});
				if (hashes.length) {
					jQuery.each(hashes.reverse(), function(i, h) {
						data[h] = dirs[h];
					});
				} else {
					data = null;
				}
				
				fm.storage(key, data);
			},
			/**
			 * Init dir at places
			 *
			 * @return void
			 **/
			init = function() {
				var dat, hashes;
				key = 'places'+(opts.suffix? opts.suffix : ''),
				dirs = {};
				dat = fm.storage(key);
				if (typeof dat === 'string') {
					// old data type elFinder <= 2.1.12
					dat = jQuery.grep(dat.split(','), function(hash) { return hash? true : false;});
					jQuery.each(dat, function(i, d) {
						var dir = d.split('#');
						dirs[dir[0]] = dir[1]? dir[1] : dir[0];
					});
				} else if (jQuery.isPlainObject(dat)) {
					dirs = dat;
				}
				// allow modify `dirs`
				/**
				 * example for preset places
				 * 
				 * elfinderInstance.bind('placesload', function(e, fm) {
				 * 	//if (fm.storage(e.data.storageKey) === null) { // for first time only
				 * 	if (!fm.storage(e.data.storageKey)) {           // for empty places
				 * 		e.data.dirs[targetHash] = fallbackName;     // preset folder
				 * 	}
				 * }
				 **/
				fm.trigger('placesload', {dirs: dirs, storageKey: key}, true);
				
				hashes = Object.keys(dirs);
				if (hashes.length) {
					root.prepend(spinner);
					
					fm.request({
						data : {cmd : 'info', targets : hashes},
						preventDefault : true
					})
					.done(function(data) {
						var exists = {};
						
						data.files && data.files.length && fm.cache(data.files);
						
						jQuery.each(data.files, function(i, f) {
							var hash = f.hash;
							exists[hash] = f;
						});
						jQuery.each(dirs, function(h, f) {
							add(exists[h] || Object.assign({notfound: true}, f));
						});
						if (fm.storage('placesState') > 0) {
							root.trigger('click');
						}
					})
					.always(function() {
						spinner.remove();
					});
				}
			},
			/**
			 * Return node for given dir object
			 *
			 * @param  Object  directory object
			 * @return jQuery
			 **/
			create    = function(dir, hash) {
				return jQuery(tpl.replace(/\{id\}/, hash2id(dir? dir.hash : hash))
						.replace(/\{name\}/, fm.escape(dir? dir.i18 || dir.name : hash))
						.replace(/\{cssclass\}/, dir? (fm.perms2class(dir) + (dir.notfound? ' elfinder-na' : '') + (dir.csscls? ' '+dir.csscls : '')) : '')
						.replace(/\{permissions\}/, (dir && (!dir.read || !dir.write || dir.notfound))? ptpl : '')
						.replace(/\{title\}/, (dir && dir.path)? fm.escape(dir.path) : '')
						.replace(/\{symlink\}/, '')
						.replace(/\{style\}/, (dir && dir.icon)? fm.getIconStyle(dir) : ''));
			},
			/**
			 * Add new node into places
			 *
			 * @param  Object  directory object
			 * @return void
			 **/
			add = function(dir) {
				var node, hash;

				if (dir.mime !== 'directory') {
					return false;
				}
				hash = dir.hash;
				if (!fm.files().hasOwnProperty(hash)) {
					// update cache
					fm.trigger('tree', {tree: [dir]});
				}
				
				node = create(dir, hash);
				
				dirs[hash] = dir;
				subtree.prepend(node);
				root.addClass(collapsed);
				sortBtn.toggle(subtree.children().length > 1);
				
				return true;
			},
			/**
			 * Remove dir from places
			 *
			 * @param  String  directory hash
			 * @return String  removed name
			 **/
			remove = function(hash) {
				var name = null, tgt, cnt;

				if (dirs[hash]) {
					delete dirs[hash];
					tgt = hash2elm(hash);
					if (tgt.length) {
						name = tgt.text();
						tgt.parent().remove();
						cnt = subtree.children().length;
						sortBtn.toggle(cnt > 1);
						if (! cnt) {
							root.removeClass(collapsed);
							places.removeClass(expanded);
							subtree.slideToggle(false);
						}
					}
				}
				
				return name;
			},
			/**
			 * Move up dir on places
			 *
			 * @param  String  directory hash
			 * @return void
			 **/
			moveup = function(hash) {
				var self = hash2elm(hash),
					tgt  = self.parent(),
					prev = tgt.prev('div'),
					cls  = 'ui-state-hover',
					ctm  = fm.getUI('contextmenu');
				
				menuTimer && clearTimeout(menuTimer);
				
				if (prev.length) {
					ctm.find(':first').data('placesHash', hash);
					self.addClass(cls);
					tgt.insertBefore(prev);
					prev = tgt.prev('div');
					menuTimer = setTimeout(function() {
						self.removeClass(cls);
						if (ctm.find(':first').data('placesHash') === hash) {
							ctm.hide().empty();
						}
					}, 1500);
				}
				
				if(!prev.length) {
					self.removeClass(cls);
					ctm.hide().empty();
				}
			},
			/**
			 * Update dir at places
			 *
			 * @param  Object   directory
			 * @param  String   previous hash
			 * @return Boolean
			 **/
			update = function(dir, preHash) {
				var hash = dir.hash,
					tgt  = hash2elm(preHash || hash),
					node = create(dir, hash);

				if (tgt.length > 0) {
					tgt.parent().replaceWith(node);
					dirs[hash] = dir;
					return true;
				} else {
					return false;
				}
			},
			/**
			 * Remove all dir from places
			 *
			 * @return void
			 **/
			clear = function() {
				subtree.empty();
				root.removeClass(collapsed);
				places.removeClass(expanded);
				subtree.slideToggle(false);
			},
			/**
			 * Sort places dirs A-Z
			 *
			 * @return void
			 **/
			sort = function() {
				jQuery.each(dirs, function(h, f) {
					var dir = fm.file(h) || f,
						node = create(dir, h),
						ret = null;
					if (!dir) {
						node.hide();
					}
					if (subtree.children().length) {
						jQuery.each(subtree.children(), function() {
							var current =  jQuery(this);
							if ((dir.i18 || dir.name).localeCompare(current.children('.'+navdir).text()) < 0) {
								ret = !node.insertBefore(current);
								return ret;
							}
						});
						if (ret !== null) {
							return true;
						}
					}
					!hash2elm(h).length && subtree.append(node);
				});
				save();
			},
			// sort button
			sortBtn = jQuery('<span class="elfinder-button-icon elfinder-button-icon-sort elfinder-places-root-icon" title="'+fm.i18n('cmdsort')+'"/>')
				.hide()
				.on('click', function(e) {
					e.stopPropagation();
					subtree.empty();
					sort();
				}
			),
			/**
			 * Node - wrapper for places root
			 *
			 * @type jQuery
			 **/
			wrapper = create({
					hash  : 'root-'+fm.namespace, 
					name  : fm.i18n(opts.name, 'places'),
					read  : true,
					write : true
				}),
			/**
			 * Places root node
			 *
			 * @type jQuery
			 **/
			root = wrapper.children('.'+navdir)
				.addClass(clroot)
				.on('click', function(e) {
					e.stopPropagation();
					if (root.hasClass(collapsed)) {
						places.toggleClass(expanded);
						subtree.slideToggle();
						fm.storage('placesState', places.hasClass(expanded)? 1 : 0);
					}
				})
				.append(sortBtn),
			/**
			 * Container for dirs
			 *
			 * @type jQuery
			 **/
			subtree = wrapper.children('.'+fm.res(c, 'navsubtree')),
			
			/**
			 * Main places container
			 *
			 * @type jQuery
			 **/
			places = jQuery(this).addClass(fm.res(c, 'tree')+' elfinder-places ui-corner-all')
				.hide()
				.append(wrapper)
				.appendTo(fm.getUI('navbar'))
				.on('mouseenter mouseleave', '.'+navdir, function(e) {
					jQuery(this).toggleClass('ui-state-hover', (e.type == 'mouseenter'));
				})
				.on('click', '.'+navdir, function(e) {
					var p = jQuery(this);
					if (p.data('longtap')) {
						e.stopPropagation();
						return;
					}
					! p.hasClass('elfinder-na') && fm.exec('open', p.attr('id').substr(6));
				})
				.on('contextmenu', '.'+navdir+':not(.'+clroot+')', function(e) {
					var self = jQuery(this),
						hash = self.attr('id').substr(6);
					
					e.preventDefault();

					fm.trigger('contextmenu', {
						raw : [{
							label    : fm.i18n('moveUp'),
							icon     : 'up',
							remain   : true,
							callback : function() { moveup(hash); save(); }
						},'|',{
							label    : fm.i18n('rmFromPlaces'),
							icon     : 'rm',
							callback : function() { remove(hash); save(); }
						}],
						'x'       : e.pageX,
						'y'       : e.pageY
					});
					
					self.addClass('ui-state-hover');
					
					fm.getUI('contextmenu').children().on('mouseenter', function() {
						self.addClass('ui-state-hover');
					});
					
					fm.bind('closecontextmenu', function() {
						self.removeClass('ui-state-hover');
					});
				})
				.droppable({
					tolerance  : 'pointer',
					accept     : '.elfinder-cwd-file-wrapper,.elfinder-tree-dir,.elfinder-cwd-file',
					hoverClass : fm.res('class', 'adroppable'),
					classes    : { // Deprecated hoverClass jQueryUI>=1.12.0
						'ui-droppable-hover': fm.res('class', 'adroppable')
					},
					over       : function(e, ui) {
						var helper = ui.helper,
							dir    = jQuery.grep(helper.data('files'), function(h) { return (fm.file(h).mime === 'directory' && !dirs[h])? true : false; });
						e.stopPropagation();
						helper.data('dropover', helper.data('dropover') + 1);
						if (fm.insideWorkzone(e.pageX, e.pageY)) {
							if (dir.length > 0) {
								helper.addClass('elfinder-drag-helper-plus');
								fm.trigger('unlockfiles', {files : helper.data('files'), helper: helper});
							} else {
								jQuery(this).removeClass(dropover);
							}
						}
					},
					out : function(e, ui) {
						var helper = ui.helper;
						e.stopPropagation();
						helper.removeClass('elfinder-drag-helper-move elfinder-drag-helper-plus').data('dropover', Math.max(helper.data('dropover') - 1, 0));
						jQuery(this).removeData('dropover')
						       .removeClass(dropover);
					},
					drop       : function(e, ui) {
						var helper  = ui.helper,
							resolve = true;
						
						jQuery.each(helper.data('files'), function(i, hash) {
							var dir = fm.file(hash);
							
							if (dir && dir.mime == 'directory' && !dirs[dir.hash]) {
								add(dir);
							} else {
								resolve = false;
							}
						});
						save();
						resolve && helper.hide();
					}
				})
				// for touch device
				.on('touchstart', '.'+navdir+':not(.'+clroot+')', function(e) {
					if (e.originalEvent.touches.length > 1) {
						return;
					}
					var hash = jQuery(this).attr('id').substr(6),
					p = jQuery(this)
					.addClass(hover)
					.data('longtap', null)
					.data('tmlongtap', setTimeout(function(){
						// long tap
						p.data('longtap', true);
						fm.trigger('contextmenu', {
							raw : [{
								label    : fm.i18n('rmFromPlaces'),
								icon     : 'rm',
								callback : function() { remove(hash); save(); }
							}],
							'x'       : e.originalEvent.touches[0].pageX,
							'y'       : e.originalEvent.touches[0].pageY
						});
					}, 500));
				})
				.on('touchmove touchend', '.'+navdir+':not(.'+clroot+')', function(e) {
					clearTimeout(jQuery(this).data('tmlongtap'));
					if (e.type == 'touchmove') {
						jQuery(this).removeClass(hover);
					}
				});

		if (jQuery.fn.sortable) {
			subtree.addClass('touch-punch')
			.sortable({
				appendTo : fm.getUI(),
				revert   : false,
				helper   : function(e) {
					var dir = jQuery(e.target).parent();
						
					dir.children().removeClass('ui-state-hover');
					
					return jQuery('<div class="ui-widget elfinder-place-drag elfinder-'+fm.direction+'"/>')
							.append(jQuery('<div class="elfinder-navbar"/>').show().append(dir.clone()));

				},
				stop     : function(e, ui) {
					var target = jQuery(ui.item[0]),
						top    = places.offset().top,
						left   = places.offset().left,
						width  = places.width(),
						height = places.height(),
						x      = e.pageX,
						y      = e.pageY;
					
					if (!(x > left && x < left+width && y > top && y < y+height)) {
						remove(id2hash(target.children(':first').attr('id')));
						save();
					}
				},
				update   : function(e, ui) {
					save();
				}
			});
		}

		// "on regist" for command exec
		jQuery(this).on('regist', function(e, files){
			var added = false;
			jQuery.each(files, function(i, dir) {
				if (dir && dir.mime == 'directory' && !dirs[dir.hash]) {
					if (add(dir)) {
						added = true;
					}
				}
			});
			added && save();
		});
	

		// on fm load - show places and load files from backend
		fm.one('load', function() {
			var dat, hashes;
			
			if (fm.oldAPI) {
				return;
			}
			
			places.show().parent().show();

			init();

			fm.change(function(e) {
				var changed = false;
				jQuery.each(e.data.changed, function(i, file) {
					if (dirs[file.hash]) {
						if (file.mime !== 'directory') {
							if (remove(file.hash)) {
								changed = true;
							}
						} else {
							if (update(file)) {
								changed = true;
							}
						}
					}
				});
				changed && save();
			})
			.bind('rename', function(e) {
				var changed = false;
				if (e.data.removed) {
					jQuery.each(e.data.removed, function(i, hash) {
						if (e.data.added[i]) {
							if (update(e.data.added[i], hash)) {
								changed = true;
							}
						}
					});
				}
				changed && save();
			})
			.bind('rm paste', function(e) {
				var names = [],
					changed = false;
				if (e.data.removed) {
					jQuery.each(e.data.removed, function(i, hash) {
						var name = remove(hash);
						name && names.push(name);
					});
				}
				if (names.length) {
					changed = true;
				}
				if (e.data.added && names.length) {
					jQuery.each(e.data.added, function(i, file) {
						if (jQuery.inArray(file.name, names) !== 1) {
							file.mime == 'directory' && add(file);
						}
					});
				}
				changed && save();
			})
			.bind('sync netmount', function() {
				var ev = this,
					opSuffix = opts.suffix? opts.suffix : '',
					hashes;
				
				if (ev.type === 'sync') {
					// check is change of opts.suffix
					if (suffix !== opSuffix) {
						suffix = opSuffix;
						clear();
						init();
						return;
					}
				}
				
				hashes = Object.keys(dirs);
				if (hashes.length) {
					root.prepend(spinner);

					fm.request({
						data : {cmd : 'info', targets : hashes},
						preventDefault : true
					})
					.done(function(data) {
						var exists  = {},
							updated = false,
							cwd     = fm.cwd().hash;
						jQuery.each(data.files || [], function(i, file) {
							var hash = file.hash;
							exists[hash] = file;
							if (!fm.files().hasOwnProperty(file.hash)) {
								// update cache
								fm.trigger('tree', {tree: [file]});
							}
						});
						jQuery.each(dirs, function(h, f) {
							if (f.notfound === Boolean(exists[h])) {
								if ((f.phash === cwd && ev.type !== 'netmount') || (exists[h] && exists[h].mime !== 'directory')) {
									if (remove(h)) {
										updated = true;
									}
								} else {
									if (update(exists[h] || Object.assign({notfound: true}, f))) {
										updated = true;
									}
								}
							} else if (exists[h] && exists[h].phash != cwd) {
								// update permission of except cwd
								update(exists[h]);
							}
						});
						updated && save();
					})
					.always(function() {
						spinner.remove();
					});
				}
			});
			
		});
		
	});
};


/*
 * File: /js/ui/searchbutton.js
 */

/**
 * @class  elFinder toolbar search button widget.
 *
 * @author Dmitry (dio) Levashov
 **/
jQuery.fn.elfindersearchbutton = function(cmd) {
		return this.each(function() {
		var result = false,
			fm     = cmd.fm,
			disabled = fm.res('class', 'disabled'),
			isopts = cmd.options.incsearch || { enable: false },
			sTypes = cmd.options.searchTypes,
			id     = function(name){return fm.namespace + fm.escape(name);},
			toolbar= fm.getUI('toolbar'),
			btnCls = fm.res('class', 'searchbtn'),
			button = jQuery(this)
				.hide()
				.addClass('ui-widget-content elfinder-button '+btnCls)
				.on('click', function(e) {
					e.stopPropagation();
				}),
			getMenuOffset = function() {
				var fmNode = fm.getUI(),
					baseOffset = fmNode.offset(),
					buttonOffset = button.offset();
				return {
					top : buttonOffset.top - baseOffset.top,
					maxHeight : fmNode.height() - 40
				};
			},
			search = function() {
				input.data('inctm') && clearTimeout(input.data('inctm'));
				var val = jQuery.trim(input.val()),
					from = !jQuery('#' + id('SearchFromAll')).prop('checked'),
					mime = jQuery('#' + id('SearchMime')).prop('checked'),
					type = '';
				if (from) {
					if (jQuery('#' + id('SearchFromVol')).prop('checked')) {
						from = fm.root(fm.cwd().hash);
					} else {
						from = fm.cwd().hash;
					}
				}
				if (mime) {
					mime = val;
					val = '.';
				}
				if (typeSet) {
					type = typeSet.children('input:checked').val();
				}
				if (val) {
					input.trigger('focus');
					cmd.exec(val, from, mime, type).done(function() {
						result = true;
					}).fail(function() {
						abort();
					});
					
				} else {
					fm.trigger('searchend');
				}
			},
			abort = function() {
				input.data('inctm') && clearTimeout(input.data('inctm'));
				input.val('').trigger('blur');
				if (result || incVal) {
					result = false;
					incVal = '';
					fm.lazy(function() {
						fm.trigger('searchend');
					});
				}
			},
			incVal = '',
			input  = jQuery('<input type="text" size="42"/>')
				.on('focus', function() {
					// close other menus
					!button.hasClass('ui-state-active') && fm.getUI().click();
					inFocus = true;
					incVal = '';
					button.addClass('ui-state-active');
					fm.trigger('uiresize');
					opts && opts.css(getMenuOffset()).slideDown(function() {
						// Care for on browser window re-active
						button.addClass('ui-state-active');
						fm.toFront(opts);
					});
				})
				.on('blur', function() {
					inFocus = false;
					if (opts) {
						if (!opts.data('infocus')) {
							opts.slideUp(function() {
								button.removeClass('ui-state-active');
								fm.trigger('uiresize');
								fm.toHide(opts);
							});
						} else {
							opts.data('infocus', false);
						}
					} else {
						button.removeClass('ui-state-active');
					}
				})
				.appendTo(button)
				// to avoid fm shortcuts on arrows
				.on('keypress', function(e) {
					e.stopPropagation();
				})
				.on('keydown', function(e) {
					e.stopPropagation();
					if (e.keyCode === jQuery.ui.keyCode.ENTER) {
						search();
					} else if (e.keyCode === jQuery.ui.keyCode.ESCAPE) {
						e.preventDefault();
						abort();
					}
				}),
			opts, typeSet, cwdReady, inFocus;
		
		if (isopts.enable) {
			isopts.minlen = isopts.minlen || 2;
			isopts.wait = isopts.wait || 500;
			input
				.attr('title', fm.i18n('incSearchOnly'))
				.on('compositionstart', function() {
					input.data('composing', true);
				})
				.on('compositionend', function() {
					input.removeData('composing');
					input.trigger('input'); // for IE, edge
				})
				.on('input', function() {
					if (! input.data('composing')) {
						input.data('inctm') && clearTimeout(input.data('inctm'));
						input.data('inctm', setTimeout(function() {
							var val = input.val();
							if (val.length === 0 || val.length >= isopts.minlen) {
								(incVal !== val) && fm.trigger('incsearchstart', { query: val });
								incVal = val;
								if (val === '' && fm.searchStatus.state > 1 && fm.searchStatus.query) {
									input.val(fm.searchStatus.query).trigger('select');
								} 
							}
						}, isopts.wait));
					}
				});
			
			if (fm.UA.ltIE8) {
				input.on('keydown', function(e) {
						if (e.keyCode === 229) {
							input.data('imetm') && clearTimeout(input.data('imetm'));
							input.data('composing', true);
							input.data('imetm', setTimeout(function() {
								input.removeData('composing');
							}, 100));
						}
					})
					.on('keyup', function(e) {
						input.data('imetm') && clearTimeout(input.data('imetm'));
						if (input.data('composing')) {
							e.keyCode === jQuery.ui.keyCode.ENTER && input.trigger('compositionend');
						} else {
							input.trigger('input');
						}
					});
			}
		}
		
		jQuery('<span class="ui-icon ui-icon-search" title="'+cmd.title+'"/>')
			.appendTo(button)
			.on('mousedown', function(e) {
				e.stopPropagation();
				e.preventDefault();
				if (button.hasClass('ui-state-active')) {
					search();
				} else {
					input.trigger('focus');
				}
			});
		
		jQuery('<span class="ui-icon ui-icon-close"/>')
			.appendTo(button)
			.on('mousedown', function(e) {
				e.stopPropagation();
				e.preventDefault();
				if (input.val() === '' && !button.hasClass('ui-state-active')) {
					input.trigger('focus');
				} else {
					abort();
				}
			});
		
		// wait when button will be added to DOM
		fm.bind('toolbarload', function(){
			var parent = button.parent();
			if (parent.length) {
				toolbar.prepend(button.show());
				parent.remove();
				// position icons for ie7
				if (fm.UA.ltIE7) {
					var icon = button.children(fm.direction == 'ltr' ? '.ui-icon-close' : '.ui-icon-search');
					icon.css({
						right : '',
						left  : parseInt(button.width())-icon.outerWidth(true)
					});
				}
			}
		});
		
		fm
			.one('init', function() {
				fm.getUI('cwd').on('touchstart click', function() {
					inFocus && input.trigger('blur');
				});
			})
			.one('open', function() {
				opts = (fm.api < 2.1)? null : jQuery('<div class="ui-front ui-widget ui-widget-content elfinder-button-menu elfinder-button-search-menu ui-corner-all"/>')
					.append(
						jQuery('<div class="buttonset"/>')
							.append(
								jQuery('<input id="'+id('SearchFromCwd')+'" name="serchfrom" type="radio" checked="checked"/><label for="'+id('SearchFromCwd')+'">'+fm.i18n('btnCwd')+'</label>'),
								jQuery('<input id="'+id('SearchFromVol')+'" name="serchfrom" type="radio"/><label for="'+id('SearchFromVol')+'">'+fm.i18n('btnVolume')+'</label>'),
								jQuery('<input id="'+id('SearchFromAll')+'" name="serchfrom" type="radio"/><label for="'+id('SearchFromAll')+'">'+fm.i18n('btnAll')+'</label>')
							),
						jQuery('<div class="buttonset elfinder-search-type"/>')
							.append(
								jQuery('<input id="'+id('SearchName')+'" name="serchcol" type="radio" checked="checked" value="SearchName"/><label for="'+id('SearchName')+'">'+fm.i18n('btnFileName')+'</label>')
							)
					)
					.hide()
					.appendTo(fm.getUI());
				if (opts) {
					if (sTypes) {
						typeSet = opts.find('.elfinder-search-type');
						jQuery.each(cmd.options.searchTypes, function(i, v) {
							typeSet.append(jQuery('<input id="'+id(i)+'" name="serchcol" type="radio" value="'+fm.escape(i)+'"/><label for="'+id(i)+'">'+fm.i18n(v.name)+'</label>'));
						});
					}
					opts.find('div.buttonset').buttonset();
					jQuery('#'+id('SearchFromAll')).next('label').attr('title', fm.i18n('searchTarget', fm.i18n('btnAll')));
					if (sTypes) {
						jQuery.each(sTypes, function(i, v) {
							if (v.title) {
								jQuery('#'+id(i)).next('label').attr('title', fm.i18n(v.title));
							}
						});
					}
					opts.on('mousedown', 'div.buttonset', function(e){
							e.stopPropagation();
							opts.data('infocus', true);
						})
						.on('click', 'input', function(e) {
							e.stopPropagation();
							jQuery.trim(input.val())? search() : input.trigger('focus');
						})
						.on('close', function() {
							input.trigger('blur');
						});
				}
			})
			.bind('searchend', function() {
				input.val('');
			})
			.bind('open parents', function() {
				var dirs    = [],
					volroot = fm.file(fm.root(fm.cwd().hash));
				
				if (volroot) {
					jQuery.each(fm.parents(fm.cwd().hash), function(i, hash) {
						dirs.push(fm.file(hash).name);
					});
		
					jQuery('#'+id('SearchFromCwd')).next('label').attr('title', fm.i18n('searchTarget', dirs.join(fm.option('separator'))));
					jQuery('#'+id('SearchFromVol')).next('label').attr('title', fm.i18n('searchTarget', volroot.name));
				}
			})
			.bind('open', function() {
				incVal && abort();
			})
			.bind('cwdinit', function() {
				cwdReady = false;
			})
			.bind('cwdrender',function() {
				cwdReady = true;
			})
			.bind('keydownEsc', function() {
				if (incVal && incVal.substr(0, 1) === '/') {
					incVal = '';
					input.val('');
					fm.trigger('searchend');
				}
			})
			.shortcut({
				pattern     : 'ctrl+f f3',
				description : cmd.title,
				callback    : function() { 
					input.trigger('select').trigger('focus');
				}
			})
			.shortcut({
				pattern     : 'a b c d e f g h i j k l m n o p q r s t u v w x y z dig0 dig1 dig2 dig3 dig4 dig5 dig6 dig7 dig8 dig9 num0 num1 num2 num3 num4 num5 num6 num7 num8 num9',
				description : fm.i18n('firstLetterSearch'),
				callback    : function(e) { 
					if (! cwdReady) { return; }
					
					var code = e.originalEvent.keyCode,
						next = function() {
							var sel = fm.selected(),
								key = jQuery.ui.keyCode[(!sel.length || fm.cwdHash2Elm(sel[0]).next('[id]').length)? 'RIGHT' : 'HOME'];
							jQuery(document).trigger(jQuery.Event('keydown', { keyCode: key, ctrlKey : false, shiftKey : false, altKey : false, metaKey : false }));
						},
						val;
					if (code >= 96 && code <= 105) {
						code -= 48;
					}
					val = '/' + String.fromCharCode(code);
					if (incVal !== val) {
						input.val(val);
						incVal = val;
						fm
							.trigger('incsearchstart', { query: val })
							.one('cwdrender', next);
					} else{
						next();
					}
				}
			});

	});
};


/*
 * File: /js/ui/sortbutton.js
 */

/**
 * @class  elFinder toolbar button menu with sort variants.
 *
 * @author Dmitry (dio) Levashov
 **/
jQuery.fn.elfindersortbutton = function(cmd) {
		return this.each(function() {
		var fm       = cmd.fm,
			name     = cmd.name,
			c        = 'class',
			disabled = fm.res(c, 'disabled'),
			hover    = fm.res(c, 'hover'),
			item     = 'elfinder-button-menu-item',
			selected = item+'-selected',
			asc      = selected+'-asc',
			desc     = selected+'-desc',
			text     = jQuery('<span class="elfinder-button-text">'+cmd.title+'</span>'),
			button   = jQuery(this).addClass('ui-state-default elfinder-button elfinder-menubutton elfiner-button-'+name)
				.attr('title', cmd.title)
				.append('<span class="elfinder-button-icon elfinder-button-icon-'+name+'"/>', text)
				.on('mouseenter mouseleave', function(e) { !button.hasClass(disabled) && button.toggleClass(hover, e.type === 'mouseenter'); })
				.on('click', function(e) {
					if (!button.hasClass(disabled)) {
						e.stopPropagation();
						menu.is(':hidden') && fm.getUI().click();
						menu.css(getMenuOffset()).slideToggle({
							duration: 100,
							done: function(e) {
								fm[menu.is(':visible')? 'toFront' : 'toHide'](menu);
							}
						});
					}
				}),
			hide = function() { fm.toHide(menu); },
			menu = jQuery('<div class="ui-front ui-widget ui-widget-content elfinder-button-menu ui-corner-all"/>')
				.hide()
				.appendTo(fm.getUI())
				.on('mouseenter mouseleave', '.'+item, function(e) { jQuery(this).toggleClass(hover, e.type === 'mouseenter'); })
				.on('click', function(e) {
					e.preventDefault();
					e.stopPropagation();
				})
				.on('close', hide),
			update = function() {
				menu.children('[rel]').removeClass(selected+' '+asc+' '+desc)
					.filter('[rel="'+fm.sortType+'"]')
					.addClass(selected+' '+(fm.sortOrder == 'asc' ? asc : desc));

				menu.children('.elfinder-sort-stick').toggleClass(selected, fm.sortStickFolders);
				menu.children('.elfinder-sort-tree').toggleClass(selected, fm.sortAlsoTreeview);
			},
			getMenuOffset = function() {
				var baseOffset = fm.getUI().offset(),
					buttonOffset = button.offset();
				return {
					top : buttonOffset.top - baseOffset.top,
					left : buttonOffset.left - baseOffset.left
				};
			},
			tm;
			
		text.hide();
		
		jQuery.each(fm.sortRules, function(name, value) {
			menu.append(jQuery('<div class="'+item+'" rel="'+name+'"><span class="ui-icon ui-icon-arrowthick-1-n"/><span class="ui-icon ui-icon-arrowthick-1-s"/>'+fm.i18n('sort'+name)+'</div>').data('type', name));
		});
		
		menu.children().on('click', function(e) {
			cmd.exec([], jQuery(this).removeClass(hover).attr('rel'));
		});
		
		jQuery('<div class="'+item+' '+item+'-separated elfinder-sort-ext elfinder-sort-stick"><span class="ui-icon ui-icon-check"/>'+fm.i18n('sortFoldersFirst')+'</div>')
			.appendTo(menu)
			.on('click', function() {
				cmd.exec([], 'stick');
			});

		fm.one('init', function() {
			if (fm.ui.tree && fm.options.sortAlsoTreeview !== null) {
				jQuery('<div class="'+item+' '+item+'-separated elfinder-sort-ext elfinder-sort-tree"><span class="ui-icon ui-icon-check"/>'+fm.i18n('sortAlsoTreeview')+'</div>')
				.appendTo(menu)
				.on('click', function() {
					cmd.exec([], 'tree');
				});
			}
		})
		.bind('disable select', hide)
		.bind('open', function() {
			menu.children('[rel]').each(function() {
				var $this = jQuery(this);
				$this.toggle(fm.sorters[$this.attr('rel')]);
			});
		}).bind('sortchange', update).getUI().on('click', hide);
		
		if (menu.children().length > 1) {
			cmd.change(function() {
					tm && cancelAnimationFrame(tm);
					tm = requestAnimationFrame(function() {
						button.toggleClass(disabled, cmd.disabled());
						update();
					});
				})
				.change();
		} else {
			button.addClass(disabled);
		}

	});
	
};


/*
 * File: /js/ui/stat.js
 */

/**
 * @class elFinder ui
 * Display number of files/selected files and its size in statusbar
 *
 * @author Dmitry (dio) Levashov
 **/
jQuery.fn.elfinderstat = function(fm) {
		return this.each(function() {
		var size       = jQuery(this).addClass('elfinder-stat-size'),
			sel        = jQuery('<div class="elfinder-stat-selected"/>')
				.on('click', 'a', function(e) {
					var hash = jQuery(this).data('hash');
					e.preventDefault();
					fm.exec('opendir', [ hash ]);
				}),
			titleitems = fm.i18n('items'),
			titlesel   = fm.i18n('selected'),
			titlesize  = fm.i18n('size'),
			setstat    = function(files) {
				var c = 0, 
					s = 0,
					cwd = fm.cwd(),
					calc = true,
					hasSize = true;

				if (cwd.sizeInfo || cwd.size) {
					s = cwd.size;
					calc = false;
				}
				jQuery.each(files, function(i, file) {
					c++;
					if (calc) {
						s += parseInt(file.size) || 0;
						if (hasSize === true && file.mime === 'directory' && !file.sizeInfo) {
							hasSize = false;
						}
					}
				});
				size.html(titleitems+': <span class="elfinder-stat-incsearch"></span>'+c+',&nbsp;<span class="elfinder-stat-size'+(hasSize? ' elfinder-stat-size-recursive' : '')+'">'+fm.i18n(hasSize? 'sum' : 'size')+': '+fm.formatSize(s)+'</span>')
					.attr('title', size.text());
				fm.trigger('uistatchange');
			},
			setIncsearchStat = function(data) {
				size.find('span.elfinder-stat-incsearch').html(data? data.hashes.length + ' / ' : '');
				size.attr('title', size.text());
				fm.trigger('uistatchange');
			},
			setSelect = function(files) {
				var s = 0,
					c = 0,
					dirs = [],
					path, file;

				if (files.length === 1) {
					file = files[0];
					s = file.size;
					if (fm.searchStatus.state === 2) {
						path = fm.escape(file.path? file.path.replace(/\/[^\/]*$/, '') : '..');
						dirs.push('<a href="#elf_'+file.phash+'" data-hash="'+file.hash+'" title="'+path+'">'+path+'</a>');
					}
					dirs.push(fm.escape(file.i18 || file.name));
					sel.html(dirs.join('/') + (s > 0 ? ', '+fm.formatSize(s) : ''));
				} else if (files.length) {
					jQuery.each(files, function(i, file) {
						c++;
						s += parseInt(file.size)||0;
					});
					sel.html(c ? titlesel+': '+c+', '+titlesize+': '+fm.formatSize(s) : '&nbsp;');
				} else {
					sel.html('');
				}
				sel.attr('title', sel.text());
				fm.trigger('uistatchange');
			};

		fm.getUI('statusbar').prepend(size).append(sel).show();
		if (fm.UA.Mobile && jQuery.fn.tooltip) {
			fm.getUI('statusbar').tooltip({
				classes: {
					'ui-tooltip': 'elfinder-ui-tooltip ui-widget-shadow'
				},
				tooltipClass: 'elfinder-ui-tooltip ui-widget-shadow',
				track: true
			});
		}
		
		fm
		.bind('cwdhasheschange', function(e) {
			setstat(jQuery.map(e.data, function(h) { return fm.file(h); }));
		})
		.change(function(e) {
			var files = e.data.changed || [],
				cwdHash = fm.cwd().hash;
			jQuery.each(files, function() {
				if (this.hash === cwdHash) {
					if (this.size) {
						size.children('.elfinder-stat-size').addClass('elfinder-stat-size-recursive').html(fm.i18n('sum')+': '+fm.formatSize(this.size));
						size.attr('title', size.text());
					}
					return false;
				}
			});
		})
		.select(function() {
			setSelect(fm.selectedFiles());
		})
		.bind('open', function() {
			setSelect([]);
		})
		.bind('incsearch', function(e) {
			setIncsearchStat(e.data);
		})
		.bind('incsearchend', function() {
			setIncsearchStat();
		})
		;
	});
};


/*
 * File: /js/ui/toast.js
 */

/**
 * @class  elFinder toast
 * 
 * This was created inspired by the toastr. Thanks to developers of toastr.
 * CodeSeven/toastr: http://johnpapa.net <https://github.com/CodeSeven/toastr>
 *
 * @author Naoki Sawada
 **/
jQuery.fn.elfindertoast = function(opts, fm) {
		var defOpts = Object.assign({
		mode: 'success', // or 'info', 'warning' and 'error'
		msg: '',
		showMethod: 'fadeIn', //fadeIn, slideDown, and show are built into jQuery
		showDuration: 300,
		showEasing: 'swing', //swing and linear are built into jQuery
		onShown: undefined,
		hideMethod: 'fadeOut',
		hideDuration: 1500,
		hideEasing: 'swing',
		onHidden: undefined,
		timeOut: 3000,
		extNode: undefined,
		button: undefined,
		width: undefined
	}, jQuery.isPlainObject(fm.options.uiOptions.toast.defaults)? fm.options.uiOptions.toast.defaults : {});
	return this.each(function() {
		opts = Object.assign({}, defOpts, opts || {});
		
		var self = jQuery(this),
			show = function(notm) {
				self.stop();
				fm.toFront(self);
				self[opts.showMethod]({
					duration: opts.showDuration,
					easing: opts.showEasing,
					complete: function() {
						opts.onShown && opts.onShown();
						if (!notm && opts.timeOut) {
							rmTm = setTimeout(rm, opts.timeOut);
						}
					}
				});
			},
			rm = function() {
				self[opts.hideMethod]({
					duration: opts.hideDuration,
					easing: opts.hideEasing,
					complete: function() {
						opts.onHidden && opts.onHidden();
						self.remove();
					}
				});
			},
			rmTm;
		
		self.on('click', function(e) {
			e.stopPropagation();
			e.preventDefault();
			rmTm && clearTimeout(rmTm);
			opts.onHidden && opts.onHidden();
			self.stop().remove();
		}).on('mouseenter mouseleave', function(e) {
			if (opts.timeOut) {
				rmTm && clearTimeout(rmTm);
				rmTm = null;
				if (e.type === 'mouseenter') {
					show(true);
				} else {
					rmTm = setTimeout(rm, opts.timeOut);
				}
			}
		}).hide().addClass('toast-' + opts.mode).append(jQuery('<div class="elfinder-toast-msg"/>').html(opts.msg.replace(/%([a-zA-Z0-9]+)%/g, function(m, m1) {
			return fm.i18n(m1);
		})));
		
		if (opts.extNode) {
			self.append(opts.extNode);
		}

		if (opts.button) {
			self.append(
				jQuery('<button class="ui-button ui-widget ui-state-default ui-corner-all elfinder-tabstop"/>')
				.append(jQuery('<span class="ui-button-text"/>').text(fm.i18n(opts.button.text)))
				.on('mouseenter mouseleave', function(e) { 
					jQuery(this).toggleClass('ui-state-hover', e.type == 'mouseenter');
				})
				.on('click', opts.button.click || function(){})
			);
		}

		if (opts.width) {
			self.css('max-width', opts.width);
		}
		
		show();
	});
};

/*
 * File: /js/ui/toolbar.js
 */

/**
 * @class  elFinder toolbar
 *
 * @author Dmitry (dio) Levashov
 **/
jQuery.fn.elfindertoolbar = function(fm, opts) {
		this.not('.elfinder-toolbar').each(function() {
		var commands = fm._commands,
			self     = jQuery(this).addClass('ui-helper-clearfix ui-widget-header elfinder-toolbar'),
			options  = {
				// default options
				displayTextLabel: false,
				labelExcludeUA: ['Mobile'],
				autoHideUA: ['Mobile'],
				showPreferenceButton: 'none'
			},
			filter   = function(opts) {
				return jQuery.grep(opts, function(v) {
					if (jQuery.isPlainObject(v)) {
						options = Object.assign(options, v);
						return false;
					}
					return true;
				});
			},
			render = function(disabled){
				var name,cmdPref;
				
				jQuery.each(buttons, function(i, b) { b.detach(); });
				self.empty();
				l = panels.length;
				while (l--) {
					if (panels[l]) {
						panel = jQuery('<div class="ui-widget-content ui-corner-all elfinder-buttonset"/>');
						i = panels[l].length;
						while (i--) {
							name = panels[l][i];
							if ((!disabled || !disabled[name]) && (cmd = commands[name])) {
								button = 'elfinder'+cmd.options.ui;
								if (! buttons[name] && jQuery.fn[button]) {
									buttons[name] = jQuery('<div/>')[button](cmd);
								}
								if (buttons[name]) {
									buttons[name].children('.elfinder-button-text')[textLabel? 'show' : 'hide']();
									panel.prepend(buttons[name]);
								}
							}
						}
						
						panel.children().length && self.prepend(panel);
						panel.children(':gt(0)').before('<span class="ui-widget-content elfinder-toolbar-button-separator"/>');

					}
				}
				
				if (cmdPref = commands['preference']) {
					//cmdPref.state = !self.children().length? 0 : -1;
					if (options.showPreferenceButton === 'always' || (!self.children().length && options.showPreferenceButton === 'auto')) {
						//cmdPref.state = 0;
						panel = jQuery('<div class="ui-widget-content ui-corner-all elfinder-buttonset"/>');
						name = 'preference';
						button = 'elfinder'+cmd.options.ui;
						buttons[name] = jQuery('<div/>')[button](cmdPref);
						buttons[name].children('.elfinder-button-text')[textLabel? 'show' : 'hide']();
						panel.prepend(buttons[name]);
						self.append(panel);
					}
				}
				
				(! self.data('swipeClose') && self.children().length)? self.show() : self.hide();
				prevHeight = self[0].clientHeight;
				fm.trigger('toolbarload').trigger('uiresize');
			},
			buttons = {},
			panels   = filter(opts || []),
			dispre   = null,
			uiCmdMapPrev = '',
			prevHeight = 0,
			contextRaw = [],
			l, i, cmd, panel, button, swipeHandle, autoHide, textLabel, resizeTm;
		
		// normalize options
		options.showPreferenceButton = options.showPreferenceButton.toLowerCase();
		
		if (options.displayTextLabel !== 'none') {
			// correction of options.displayTextLabel
			textLabel = fm.storage('toolbarTextLabel');
			if (textLabel === null) {
				textLabel = (options.displayTextLabel && (! options.labelExcludeUA || ! options.labelExcludeUA.length || ! jQuery.grep(options.labelExcludeUA, function(v){ return fm.UA[v]? true : false; }).length));
			} else {
				textLabel = (textLabel == 1);
			}
			contextRaw.push({
				label    : fm.i18n('textLabel'),
				icon     : 'text',
				callback : function() {
					textLabel = ! textLabel;
					self.css('height', '').find('.elfinder-button-text')[textLabel? 'show':'hide']();
					fm.trigger('uiresize').storage('toolbarTextLabel', textLabel? '1' : '0');
				},
			});
		}

		if (options.preferenceInContextmenu && commands['preference']) {
			contextRaw.push({
				label    : fm.i18n('toolbarPref'),
				icon     : 'preference',
				callback : function() {
					fm.exec('preference', void(0), {tab: 'toolbar'});
				}
			});
		}

		// add contextmenu
		if (contextRaw.length) {
			self.on('contextmenu', function(e) {
					e.stopPropagation();
					e.preventDefault();
					fm.trigger('contextmenu', {
						raw: contextRaw,
						x: e.pageX,
						y: e.pageY
					});
				}).on('touchstart', function(e) {
					if (e.originalEvent.touches.length > 1) {
						return;
					}
					self.data('tmlongtap') && clearTimeout(self.data('tmlongtap'));
					self.removeData('longtap')
						.data('longtap', {x: e.originalEvent.touches[0].pageX, y: e.originalEvent.touches[0].pageY})
						.data('tmlongtap', setTimeout(function() {
							self.removeData('longtapTm')
								.trigger({
									type: 'contextmenu',
									pageX: self.data('longtap').x,
									pageY: self.data('longtap').y
								})
								.data('longtap', {longtap: true});
						}, 500));
				}).on('touchmove touchend', function(e) {
					if (self.data('tmlongtap')) {
						if (e.type === 'touchend' ||
								( Math.abs(self.data('longtap').x - e.originalEvent.touches[0].pageX)
								+ Math.abs(self.data('longtap').y - e.originalEvent.touches[0].pageY)) > 4)
						clearTimeout(self.data('tmlongtap'));
						self.removeData('longtapTm');
					}
				}).on('click', function(e) {
					if (self.data('longtap') && self.data('longtap').longtap) {
						e.stopImmediatePropagation();
						e.preventDefault();
					}
				}).on('touchend click', '.elfinder-button', function(e) {
					if (self.data('longtap') && self.data('longtap').longtap) {
						e.stopImmediatePropagation();
						e.preventDefault();
					}
				}
			);
		}

		self.prev().length && self.parent().prepend(this);
		
		render();
		
		fm.bind('open sync select toolbarpref', function() {
			var disabled = Object.assign({}, fm.option('disabledFlip')),
				userHides = fm.storage('toolbarhides'),
				doRender, sel, disabledKeys;
			
			if (! userHides && Array.isArray(options.defaultHides)) {
				userHides = {};
				jQuery.each(options.defaultHides, function() {
					userHides[this] = true;
				});
				fm.storage('toolbarhides', userHides);
			}
			if (this.type === 'select') {
				if (fm.searchStatus.state < 2) {
					return;
				}
				sel = fm.selected();
				if (sel.length) {
					disabled = fm.getDisabledCmds(sel, true);
				}
			}
			
			jQuery.each(userHides, function(n) {
				if (!disabled[n]) {
					disabled[n] = true;
				}
			});
			
			if (Object.keys(fm.commandMap).length) {
				jQuery.each(fm.commandMap, function(from, to){
					if (to === 'hidden') {
						disabled[from] = true;
					}
				});
			}
			
			disabledKeys = Object.keys(disabled);
			if (!dispre || dispre.toString() !== disabledKeys.sort().toString()) {
				render(disabledKeys.length? disabled : null);
				doRender = true;
			}
			dispre = disabledKeys.sort();

			if (doRender || uiCmdMapPrev !== JSON.stringify(fm.commandMap)) {
				uiCmdMapPrev = JSON.stringify(fm.commandMap);
				if (! doRender) {
					// reset toolbar
					jQuery.each(jQuery('div.elfinder-button'), function(){
						var origin = jQuery(this).data('origin');
						if (origin) {
							jQuery(this).after(origin).detach();
						}
					});
				}
				if (Object.keys(fm.commandMap).length) {
					jQuery.each(fm.commandMap, function(from, to){
						var cmd = fm._commands[to],
							button = cmd? 'elfinder'+cmd.options.ui : null,
							btn;
						if (button && jQuery.fn[button]) {
							btn = buttons[from];
							if (btn) {
								if (! buttons[to] && jQuery.fn[button]) {
									buttons[to] = jQuery('<div/>')[button](cmd);
									if (buttons[to]) {
										buttons[to].children('.elfinder-button-text')[textLabel? 'show' : 'hide']();
										if (cmd.extendsCmd) {
											buttons[to].children('span.elfinder-button-icon').addClass('elfinder-button-icon-' + cmd.extendsCmd);
										}
									}
								}
								if (buttons[to]) {
									btn.after(buttons[to]);
									buttons[to].data('origin', btn.detach());
								}
							}
						}
					});
				}
			}
		}).bind('resize', function(e) {
			resizeTm && cancelAnimationFrame(resizeTm);
			resizeTm = requestAnimationFrame(function() {
				var h = self[0].clientHeight;
				if (prevHeight !== h) {
					prevHeight = h;
					fm.trigger('uiresize');
				}
			});
		});
		
		if (fm.UA.Touch) {
			autoHide = fm.storage('autoHide') || {};
			if (typeof autoHide.toolbar === 'undefined') {
				autoHide.toolbar = (options.autoHideUA && options.autoHideUA.length > 0 && jQuery.grep(options.autoHideUA, function(v){ return fm.UA[v]? true : false; }).length);
				fm.storage('autoHide', autoHide);
			}
			
			if (autoHide.toolbar) {
				fm.one('init', function() {
					fm.uiAutoHide.push(function(){ self.stop(true, true).trigger('toggle', { duration: 500, init: true }); });
				});
			}
			
			fm.bind('load', function() {
				swipeHandle = jQuery('<div class="elfinder-toolbar-swipe-handle"/>').hide().appendTo(fm.getUI());
				if (swipeHandle.css('pointer-events') !== 'none') {
					swipeHandle.remove();
					swipeHandle = null;
				}
			});
			
			self.on('toggle', function(e, data) {
				var wz    = fm.getUI('workzone'),
					toshow= self.is(':hidden'),
					wzh   = wz.height(),
					h     = self.height(),
					tbh   = self.outerHeight(true),
					delta = tbh - h,
					opt   = Object.assign({
						step: function(now) {
							wz.height(wzh + (toshow? (now + delta) * -1 : h - now));
							fm.trigger('resize');
						},
						always: function() {
							requestAnimationFrame(function() {
								self.css('height', '');
								fm.trigger('uiresize');
								if (swipeHandle) {
									if (toshow) {
										swipeHandle.stop(true, true).hide();
									} else {
										swipeHandle.height(data.handleH? data.handleH : '');
										fm.resources.blink(swipeHandle, 'slowonce');
									}
								}
								toshow && self.scrollTop('0px');
								data.init && fm.trigger('uiautohide');
							});
						}
					}, data);
				self.data('swipeClose', ! toshow).stop(true, true).animate({height : 'toggle'}, opt);
				autoHide.toolbar = !toshow;
				fm.storage('autoHide', Object.assign(fm.storage('autoHide'), {toolbar: autoHide.toolbar}));
			}).on('touchstart', function(e) {
				if (self.scrollBottom() > 5) {
					e.originalEvent._preventSwipeY = true;
				}
			});
		}
	});
	
	return this;
};


/*
 * File: /js/ui/tree.js
 */

/**
 * @class  elFinder folders tree
 *
 * @author Dmitry (dio) Levashov
 **/
jQuery.fn.elfindertree = function(fm, opts) {
		var treeclass = fm.res('class', 'tree');
	
	this.not('.'+treeclass).each(function() {

		var c = 'class', mobile = fm.UA.Mobile,
			
			/**
			 * Root directory class name
			 *
			 * @type String
			 */
			root      = fm.res(c, 'treeroot'),

			/**
			 * Open root dir if not opened yet
			 *
			 * @type Boolean
			 */
			openRoot  = opts.openRootOnLoad,

			/**
			 * Open current work dir if not opened yet
			 *
			 * @type Boolean
			 */
			openCwd   = opts.openCwdOnOpen,

			
			/**
			 * Auto loading current directory parents and do expand their node
			 *
			 * @type Boolean
			 */
			syncTree  = openCwd || opts.syncTree,
			
			/**
			 * Subtree class name
			 *
			 * @type String
			 */
			subtree   = fm.res(c, 'navsubtree'),
			
			/**
			 * Directory class name
			 *
			 * @type String
			 */
			navdir    = fm.res(c, 'treedir'),
			
			/**
			 * Directory CSS selector
			 *
			 * @type String
			 */
			selNavdir = 'span.' + navdir,
			
			/**
			 * Collapsed arrow class name
			 *
			 * @type String
			 */
			collapsed = fm.res(c, 'navcollapse'),
			
			/**
			 * Expanded arrow class name
			 *
			 * @type String
			 */
			expanded  = fm.res(c, 'navexpand'),
			
			/**
			 * Class name to mark arrow for directory with already loaded children
			 *
			 * @type String
			 */
			loaded    = 'elfinder-subtree-loaded',
			
			/**
			 * Class name to mark need subdirs request
			 *
			 * @type String
			 */
			chksubdir = 'elfinder-subtree-chksubdir',
			
			/**
			 * Arraw class name
			 *
			 * @type String
			 */
			arrow = fm.res(c, 'navarrow'),
			
			/**
			 * Current directory class name
			 *
			 * @type String
			 */
			active    = fm.res(c, 'active'),
			
			/**
			 * Droppable dirs dropover class
			 *
			 * @type String
			 */
			dropover = fm.res(c, 'adroppable'),
			
			/**
			 * Hover class name
			 *
			 * @type String
			 */
			hover    = fm.res(c, 'hover'),
			
			/**
			 * Disabled dir class name
			 *
			 * @type String
			 */
			disabled = fm.res(c, 'disabled'),
			
			/**
			 * Draggable dir class name
			 *
			 * @type String
			 */
			draggable = fm.res(c, 'draggable'),
			
			/**
			 * Droppable dir  class name
			 *
			 * @type String
			 */
			droppable = fm.res(c, 'droppable'),
			
			/**
			 * root wrapper class
			 * 
			 * @type String
			 */
			wrapperRoot = 'elfinder-navbar-wrapper-root',

			/**
			 * Un-disabled cmd `paste` volume's root wrapper class
			 * 
			 * @type String
			 */
			pastable = 'elfinder-navbar-wrapper-pastable',
			
			/**
			 * Un-disabled cmd `upload` volume's root wrapper class
			 * 
			 * @type String
			 */
			uploadable = 'elfinder-navbar-wrapper-uploadable',
			
			/**
			 * Is position x inside Navbar
			 * 
			 * @param x Numbar
			 * 
			 * @return
			 */
			insideNavbar = function(x) {
				var left = navbar.offset().left;
					
				return left <= x && x <= left + navbar.width();
			},
			
			/**
			 * To call subdirs elements queue
			 * 
			 * @type Object
			 */
			subdirsQue = {},
			
			/**
			 * To exec subdirs elements ids
			 * 
			 */
			subdirsExecQue = [],
			
			/**
			 * Request subdirs to backend
			 * 
			 * @param id String
			 * 
			 * @return Deferred
			 */
			subdirs = function(ids) {
				var targets = [];
				jQuery.each(ids, function(i, id) {
					subdirsQue[id] && targets.push(fm.navId2Hash(id));
					delete subdirsQue[id];
				});
				if (targets.length) {
					return fm.request({
						data: {
							cmd: 'subdirs',
							targets: targets,
							preventDefault : true
						}
					}).done(function(res) {
						if (res && res.subdirs) {
							jQuery.each(res.subdirs, function(hash, subdirs) {
								var elm = fm.navHash2Elm(hash);
								elm.removeClass(chksubdir);
								elm[subdirs? 'addClass' : 'removeClass'](collapsed);
							});
						}
					});
				}
			},
			
			subdirsJobRes = null,
			
			/**
			 * To check target element is in window of subdirs
			 * 
			 * @return void
			 */
			checkSubdirs = function() {
				var ids = Object.keys(subdirsQue);
				if (ids.length) {
					subdirsJobRes && subdirsJobRes._abort();
					execSubdirsTm && clearTimeout(execSubdirsTm);
					subdirsExecQue = [];
					subdirsJobRes = fm.asyncJob(function(id) {
						return fm.isInWindow(jQuery('#'+id))? id : null;
					}, ids, { numPerOnce: 200 })
					.done(function(arr) {
						if (arr.length) {
							subdirsExecQue = arr;
							execSubdirs();
						}
					});
				}
			},
			
			subdirsPending = 0,
			execSubdirsTm,
			
			/**
			 * Exec subdirs as batch request
			 * 
			 * @return void
			 */
			execSubdirs = function() {
				var cnt = opts.subdirsMaxConn - subdirsPending,
					atOnce = fm.maxTargets? Math.min(fm.maxTargets, opts.subdirsAtOnce) : opts.subdirsAtOnce,
					i, ids;
				execSubdirsTm && cancelAnimationFrame(execSubdirsTm);
				if (subdirsExecQue.length) {
					if (cnt > 0) {
						for (i = 0; i < cnt; i++) {
							if (subdirsExecQue.length) {
								subdirsPending++;
								subdirs(subdirsExecQue.splice(0, atOnce)).always(function() {
									subdirsPending--;
									execSubdirs();
								});
							}
						}
					} else {
						execSubdirsTm = requestAnimationFrame(function() {
							subdirsExecQue.length && execSubdirs();
						});
					}
				}
			},
			
			drop = fm.droppable.drop,
			
			/**
			 * Droppable options
			 *
			 * @type Object
			 */
			droppableopts = jQuery.extend(true, {}, fm.droppable, {
				// show subfolders on dropover
				over : function(e, ui) {
					var dst    = jQuery(this),
						helper = ui.helper,
						cl     = hover+' '+dropover,
						hash, status;
					e.stopPropagation();
					helper.data('dropover', helper.data('dropover') + 1);
					dst.data('dropover', true);
					if (ui.helper.data('namespace') !== fm.namespace || ! fm.insideWorkzone(e.pageX, e.pageY)) {
						dst.removeClass(cl);
						helper.removeClass('elfinder-drag-helper-move elfinder-drag-helper-plus');
						return;
					}
					if (! insideNavbar(e.clientX)) {
						dst.removeClass(cl);
						return;
					}
					helper.removeClass('elfinder-drag-helper-move elfinder-drag-helper-plus');
					dst.addClass(hover);
					if (dst.is('.'+collapsed+':not(.'+expanded+')')) {
						dst.data('expandTimer', setTimeout(function() {
							dst.is('.'+collapsed+'.'+hover) && dst.children('.'+arrow).trigger('click');
						}, 500));
					}
					if (dst.is('.elfinder-ro,.elfinder-na')) {
						dst.removeClass(dropover);
						//helper.removeClass('elfinder-drag-helper-move elfinder-drag-helper-plus');
						return;
					}
					hash = fm.navId2Hash(dst.attr('id'));
					dst.data('dropover', hash);
					jQuery.each(ui.helper.data('files'), function(i, h) {
						if (h === hash || (fm.file(h).phash === hash && !ui.helper.hasClass('elfinder-drag-helper-plus'))) {
							dst.removeClass(cl);
							return false; // break jQuery.each
						}
					});
					if (helper.data('locked')) {
						status = 'elfinder-drag-helper-plus';
					} else {
						status = 'elfinder-drag-helper-move';
						if (e.shiftKey || e.ctrlKey || e.metaKey) {
							status += ' elfinder-drag-helper-plus';
						}
					}
					dst.hasClass(dropover) && helper.addClass(status);
					requestAnimationFrame(function(){ dst.hasClass(dropover) && helper.addClass(status); });
				},
				out : function(e, ui) {
					var dst    = jQuery(this),
						helper = ui.helper;
					e.stopPropagation();
					if (insideNavbar(e.clientX)) {
						helper.removeClass('elfinder-drag-helper-move elfinder-drag-helper-plus');
					}
					helper.data('dropover', Math.max(helper.data('dropover') - 1, 0));
					dst.data('expandTimer') && clearTimeout(dst.data('expandTimer'));
					dst.removeData('dropover')
					   .removeClass(hover+' '+dropover);
				},
				deactivate : function() {
					jQuery(this).removeData('dropover')
					       .removeClass(hover+' '+dropover);
				},
				drop : function(e, ui) {
					insideNavbar(e.clientX) && drop.call(this, e, ui);
				}
			}),
			
			spinner = jQuery(fm.res('tpl', 'navspinner')),
			
			/**
			 * Directory html template
			 *
			 * @type String
			 */
			tpl = fm.res('tpl', 'navdir'),
			
			/**
			 * Permissions marker html template
			 *
			 * @type String
			 */
			ptpl = fm.res('tpl', 'perms'),
			
			/**
			 * Lock marker html template
			 *
			 * @type String
			 */
			ltpl = fm.res('tpl', 'lock'),
			
			/**
			 * Symlink marker html template
			 *
			 * @type String
			 */
			stpl = fm.res('tpl', 'symlink'),
			
			/**
			 * Directory hashes that has more pages
			 * 
			 * @type Object
			 */
			hasMoreDirs = {},
			
			/**
			 * Html template replacement methods
			 *
			 * @type Object
			 */
			replace = {
				id          : function(dir) { return fm.navHash2Id(dir.hash); },
				name        : function(dir) { return fm.escape(dir.i18 || dir.name); },
				cssclass    : function(dir) {
					var cname = (dir.phash && ! dir.isroot ? '' : root)+' '+navdir+' '+fm.perms2class(dir);
					dir.dirs && !dir.link && (cname += ' ' + collapsed) && dir.dirs == -1 && (cname += ' ' + chksubdir);
					opts.getClass && (cname += ' ' + opts.getClass(dir));
					dir.csscls && (cname += ' ' + fm.escape(dir.csscls));
					return cname;
				},
				root        : function(dir) {
					var cls = '';
					if (!dir.phash || dir.isroot) {
						cls += ' '+wrapperRoot;
						if (!dir.disabled || dir.disabled.length < 1) {
							cls += ' '+pastable+' '+uploadable;
						} else {
							if (jQuery.inArray('paste', dir.disabled) === -1) {
								cls += ' '+pastable;
							}
							if (jQuery.inArray('upload', dir.disabled) === -1) {
								cls += ' '+uploadable;
							}
						}
						return cls;
					} else {
						return '';
					}
				},
				permissions : function(dir) { return !dir.read || !dir.write ? ptpl : ''; },
				symlink     : function(dir) { return dir.alias ? stpl : ''; },
				style       : function(dir) { return dir.icon ? fm.getIconStyle(dir) : ''; }
			},
			
			/**
			 * Return html for given dir
			 *
			 * @param  Object  directory
			 * @return String
			 */
			itemhtml = function(dir) {
				return tpl.replace(/(?:\{([a-z]+)\})/ig, function(m, key) {
					var res = replace[key] ? replace[key](dir) : (dir[key] || '');
					if (key === 'id' && dir.dirs == -1) {
						subdirsQue[res] = res;
					}
					return res;
				});
			},
			
			/**
			 * Return only dirs from files list
			 *
			 * @param  Array   files list
			 * @param  Boolean do check exists
			 * @return Array
			 */
			filter = function(files, checkExists) {
				return jQuery.map(files || [], function(f) {
					return (f.mime === 'directory' && (!checkExists || fm.navHash2Elm(f.hash).length)) ? f : null;
				});
			},
			
			/**
			 * Find parent subtree for required directory
			 *
			 * @param  String  dir hash
			 * @return jQuery
			 */
			findSubtree = function(hash) {
				return hash ? fm.navHash2Elm(hash).next('.'+subtree) : tree;
			},
			
			/**
			 * Find directory (wrapper) in required node
			 * before which we can insert new directory
			 *
			 * @param  jQuery  parent directory
			 * @param  Object  new directory
			 * @return jQuery
			 */
			findSibling = function(subtree, dir) {
				var node = subtree.children(':first'),
					info;

				while (node.length) {
					info = fm.file(fm.navId2Hash(node.children('[id]').attr('id')));
					
					if ((info = fm.file(fm.navId2Hash(node.children('[id]').attr('id')))) 
					&& compare(dir, info) < 0) {
						return node;
					}
					node = node.next();
				}
				return subtree.children('button.elfinder-navbar-pager-next');
			},
			
			/**
			 * Add new dirs in tree
			 *
			 * @param  Array  dirs list
			 * @return void
			 */
			updateTree = function(dirs) {
				var length  = dirs.length,
					orphans = [],
					i = length,
					tgts = jQuery(),
					done = {},
					cwd = fm.cwd(),
					append = function(parent, dirs, start, direction) {
						var hashes = {},
							curStart = 0,
							max = fm.newAPI? Math.min(10000, Math.max(10, opts.subTreeMax)) : 10000,
							setHashes = function() {
								hashes = {};
								jQuery.each(dirs, function(i, d) {
									hashes[d.hash] = i;
								});
							},
							change = function(mode) {
								if (mode === 'prepare') {
									jQuery.each(dirs, function(i, d) {
										d.node && parent.append(d.node.hide());
									});
								} else if (mode === 'done') {
									jQuery.each(dirs, function(i, d) {
										d.node && d.node.detach().show();
									});
								}
							},
							update = function(e, data) {
								var i, changed;
								e.stopPropagation();
								
								if (data.select) {
									render(getStart(data.select));
									return;
								}
								
								if (data.change) {
									change(data.change);
									return;
								}
								
								if (data.removed && data.removed.length) {
									dirs = jQuery.grep(dirs, function(d) {
										if (data.removed.indexOf(d.hash) === -1) {
											return true;
										} else {
											!changed && (changed = true);
											return false;
										}
									});
								}
								
								if (data.added && data.added.length) {
									dirs = dirs.concat(jQuery.grep(data.added, function(d) {
										if (hashes[d.hash] === void(0)) {
											!changed && (changed = true);
											return true;
										} else {
											return false;
										}
									}));
								}
								if (changed) {
									dirs.sort(compare);
									setHashes();
									render(curStart);
								}
							},
							getStart = function(target) {
								if (hashes[target] !== void(0)) {
									return Math.floor(hashes[target] / max) * max;
								}
								return void(0);
							},
							target = fm.navId2Hash(parent.prev('[id]').attr('id')),
							render = function(start, direction) {
								var html = [],
									nodes = {},
									total, page, s, parts, prev, next, prevBtn, nextBtn;
								delete hasMoreDirs[target];
								curStart = start;
								parent.off('update.'+fm.namespace, update);
								if (dirs.length > max) {
									parent.on('update.'+fm.namespace, update);
									if (start === void(0)) {
										s = 0;
										setHashes();
										start = getStart(cwd.hash);
										if (start === void(0)) {
											start = 0;
										}
									}
									parts = dirs.slice(start, start + max);
									hasMoreDirs[target] = parent;
									prev = start? Math.max(-1, start - max) : -1;
									next = (start + max >= dirs.length)? 0 : start + max;
									total = Math.ceil(dirs.length/max);
									page = Math.ceil(start/max);
								}
								jQuery.each(parts || dirs, function(i, d) {
									html.push(itemhtml(d));
									if (d.node) {
										nodes[d.hash] = d.node;
									}
								});
								if (prev > -1) {
									prevBtn = jQuery('<button class="elfinder-navbar-pager elfinder-navbar-pager-prev"/>')
										.text(fm.i18n('btnPrevious', page, total))
										.button({
											icons: {
												primary: "ui-icon-caret-1-n"
											}
										})
										.on('click', function(e) {
											e.preventDefault();
											e.stopPropagation();
											render(prev, 'up');
										});
								} else {
									prevBtn = jQuery();
								}
								if (next) {
									nextBtn = jQuery('<button class="elfinder-navbar-pager elfinder-navbar-pager-next"/>')
										.text(fm.i18n('btnNext', page + 2, total))
										.button({
											icons: {
												primary: "ui-icon-caret-1-s"
											}
										})
										.on('click', function(e) {
											e.preventDefault();
											e.stopPropagation();
											render(next, 'down');
										});
								} else {
									nextBtn = jQuery();
								}
								detach();
								parent.empty()[parts? 'addClass' : 'removeClass']('elfinder-navbar-hasmore').append(prevBtn, html.join(''), nextBtn);
								jQuery.each(nodes, function(h, n) {
									fm.navHash2Elm(h).parent().replaceWith(n);
								});
								if (direction) {
									autoScroll(fm.navHash2Id(parts[direction === 'up'? parts.length - 1 : 0].hash));
								}
								! mobile && fm.lazy(function() { updateDroppable(null, parent); });
							},
							detach = function() {
								jQuery.each(parent.children('.elfinder-navbar-wrapper'), function(i, elm) {
									var n = jQuery(elm),
										ch = n.children('[id]:first'),
										h, c;
									if (ch.hasClass(loaded)) {
										h = fm.navId2Hash(ch.attr('id'));
										if (h && (c = hashes[h]) !== void(0)) {
											dirs[c].node = n.detach();
										}
									}
								});
							};
						
						render();
					},
					dir, html, parent, sibling, init, atonce = {}, updates = [], base, node,
					firstVol = true; // check for netmount volume
				
				while (i--) {
					dir = dirs[i];

					if (done[dir.hash] || fm.navHash2Elm(dir.hash).length) {
						continue;
					}
					done[dir.hash] = true;
					
					if ((parent = findSubtree(dir.phash)).length) {
						if (dir.phash && ((init = !parent.children().length) || parent.hasClass('elfinder-navbar-hasmore') || (sibling = findSibling(parent, dir)).length)) {
							if (init) {
								if (!atonce[dir.phash]) {
									atonce[dir.phash] = [];
								}
								atonce[dir.phash].push(dir);
							} else {
								if (sibling) {
									node = itemhtml(dir);
									sibling.before(node);
									! mobile && (tgts = tgts.add(node));
								} else {
									updates.push(dir);
								}
							}
						} else {
							node = itemhtml(dir);
							parent[firstVol || dir.phash ? 'append' : 'prepend'](node);
							firstVol = false;
							if (!dir.phash || dir.isroot) {
								base = fm.navHash2Elm(dir.hash).parent();
							}
							! mobile && updateDroppable(null, base);
						}
					} else {
						orphans.push(dir);
					}
				}

				// When init, html append at once
				if (Object.keys(atonce).length){
					jQuery.each(atonce, function(p, dirs){
						var parent = findSubtree(p),
						    html   = [];
						dirs.sort(compare);
						append(parent, dirs);
					});
				}
				
				if (updates.length) {
					parent.trigger('update.' + fm.namespace, { added : updates });
				}
				
				if (orphans.length && orphans.length < length) {
					updateTree(orphans);
					return;
				} 
				
				! mobile && tgts.length && fm.lazy(function() { updateDroppable(tgts); });
				
			},
			
			/**
			 * sort function by dir.name
			 * 
			 */
			compare = function(dir1, dir2) {
				if (! fm.sortAlsoTreeview) {
					return fm.sortRules.name(dir1, dir2);
				} else {
					var asc   = fm.sortOrder == 'asc',
						type  = fm.sortType,
						rules = fm.sortRules,
						res;
					
					res = asc? rules[fm.sortType](dir1, dir2) : rules[fm.sortType](dir2, dir1);
					
					return type !== 'name' && res === 0
						? res = asc ? rules.name(dir1, dir2) : rules.name(dir2, dir1)
						: res;
				}
			},

			/**
			 * Timer ID of autoScroll
			 * 
			 * @type  Integer
			 */
			autoScrTm,

			/**
			 * Auto scroll to cwd
			 *
			 * @return Object  jQuery Deferred
			 */
			autoScroll = function(target) {
				var dfrd = jQuery.Deferred(),
					current, parent, top, treeH, bottom, tgtTop;
				autoScrTm && clearTimeout(autoScrTm);
				autoScrTm = setTimeout(function() {
					current = jQuery(document.getElementById((target || fm.navHash2Id(fm.cwd().hash))));
					if (current.length) {
						// expand parents directory
						(openCwd? current : current.parent()).parents('.elfinder-navbar-wrapper').children('.'+loaded).addClass(expanded).next('.'+subtree).show();
						
						parent = tree.parent().stop(false, true);
						top = parent.offset().top;
						treeH = parent.height();
						bottom = top + treeH - current.outerHeight();
						tgtTop = current.offset().top;
						
						if (tgtTop < top || tgtTop > bottom) {
							parent.animate({
								scrollTop : parent.scrollTop() + tgtTop - top - treeH / 3
							}, {
								duration : opts.durations.autoScroll,
								complete : function() {	dfrd.resolve(); }
							});
						} else {
							dfrd.resolve();
						}
					} else {
						dfrd.reject();
					}
				}, 100);
				return dfrd;
			},
			/**
			 * Get hashes array of items of the bottom of the leaf root back from the target
			 * 
			 * @param Object elFinder item(directory) object
			 * @return Array hashes
			 */
			getEnds = function(d) {
				var cur = d || fm.cwd(),
					res = cur.hash? [ cur.hash ] : [],
					phash, root, dir;
				
				root = fm.root(cur.hash);
				dir = fm.file(root);
				while (dir && (phash = dir.phash)) {
					res.unshift(phash);
					root = fm.root(phash);
					dir = fm.file(root);
					if (fm.navHash2Elm(dir.hash).hasClass(loaded)) {
						break;
					}
				}
				
				return res;
			},
			
			/**
			 * Select pages back in order to display the target
			 * 
			 * @param Object elFinder item(directory) object
			 * @return Object jQuery node object of target node
			 */
			selectPages = function(current) {
				var cur = current || fm.cwd(),
					curHash = cur.hash,
					node = fm.navHash2Elm(curHash);
			
				if (!node.length) {
					while(cur && cur.phash) {
						if (hasMoreDirs[cur.phash] && !fm.navHash2Elm(cur.hash).length) {
							hasMoreDirs[cur.phash].trigger('update.'+fm.namespace, { select : cur.hash });
						}
						cur = fm.file(cur.phash);
					}
					node = fm.navHash2Elm(curHash);
				}
				
				return node;
			},
			
			/**
			 * Flag indicating that synchronization is currently in progress
			 * 
			 * @type Boolean
			 */
			syncing,

			/**
			 * Mark current directory as active
			 * If current directory is not in tree - load it and its parents
			 *
			 * @param Array directory objects of cwd
			 * @param Boolean do auto scroll
			 * @return Object jQuery Deferred
			 */
			sync = function(cwdDirs, aScr) {
				var cwd     = fm.cwd(),
					cwdhash = cwd.hash,
					autoScr = aScr === void(0)? syncTree : aScr,
					loadParents = function(dir) {
						var dfd  = jQuery.Deferred(),
							reqs = [],
							ends = getEnds(dir),
							makeReq = function(cmd, h, until) {
								var data = {
										cmd    : cmd,
										target : h
									};
								if (until) {
									data.until = until;
								}
								return fm.request({
									data : data,
									preventFail : true
								});
							},
							baseHash, baseId;
						
						reqs = jQuery.map(ends, function(h) {
							var d = fm.file(h),
								isRoot = d? fm.isRoot(d) : false,
								node = fm.navHash2Elm(h),
								getPhash = function(h, dep) {
									var d, ph,
										depth = dep || 1;
									ph = (d = fm.file(h))? d.phash : false;
									if (ph && depth > 1) {
										return getPhash(ph, --depth);
									}
									return ph;
								},
								until,
								closest = (function() {
									var phash = getPhash(h);
									until = phash;
									while (phash) {
										if (fm.navHash2Elm(phash).hasClass(loaded)) {
											break;
										}
										until = phash;
										phash = getPhash(phash);
									}
									if (!phash) {
										until = void(0);
										phash = fm.root(h);
									}
									return phash;
								})(),
								cmd;
							
							if (!node.hasClass(loaded) && (isRoot || !d || !fm.navHash2Elm(d.phash).hasClass(loaded))) {
								if (isRoot || closest === getPhash(h) || closest === getPhash(h, 2)) {
									until = void(0);
									cmd = 'tree';
									if (!isRoot) {
										h = getPhash(h);
									}
								} else {
									cmd = 'parents';
								}
								if (!baseHash) {
									baseHash = (cmd === 'tree')? h : closest;
								}
								return makeReq(cmd, h, until);
							}
							return null;
						});
						
						if (reqs.length) {
							selectPages(fm.file(baseHash));
							baseId = fm.navHash2Id(baseHash);
							autoScr && autoScroll(baseId);
							baseNode = jQuery('#'+baseId);
							spinner = jQuery(fm.res('tpl', 'navspinner')).insertBefore(baseNode.children('.'+arrow));
							baseNode.removeClass(collapsed);
							
							jQuery.when.apply($, reqs)
							.done(function() {
								var res = {},data, treeDirs, dirs, argLen, i;
								argLen = arguments.length;
								if (argLen > 0) {
									for (i = 0; i < argLen; i++) {
										data = arguments[i].tree || [];
										res[ends[i]] = Object.assign([], filter(data));
									}
								}
								dfd.resolve(res);
							})
							.fail(function() {
								dfd.reject();
							});
							
							return dfd;
						} else {
							return dfd.resolve();
						}
					},
					done= function(res, dfrd) {
						var open = function() {
								if (openRoot && baseNode) {
									findSubtree(baseNode.hash).show().prev(selNavdir).addClass(expanded);
									openRoot = false;
								}
								if (autoScr) {
									autoScroll().done(checkSubdirs);
								} else {
									checkSubdirs();
								}
							},
							current;
						
						if (res) {
							jQuery.each(res, function(endHash, dirs) {
								dirs && updateTree(dirs);
								selectPages(fm.file(endHash));
								dirs && updateArrows(dirs, loaded);
							});
						}
						
						if (cwdDirs) {
							(fm.api < 2.1) && cwdDirs.push(cwd);
							updateTree(cwdDirs);
						}
						
						// set current node
						current = selectPages();
						
						if (!current.hasClass(active)) {
							tree.find(selNavdir+'.'+active).removeClass(active);
							current.addClass(active);
						}
						
						// mark as loaded to cwd parents
						current.parents('.elfinder-navbar-wrapper').children('.'+navdir).addClass(loaded);
						
						if (res) {
							fm.lazy(open).done(function() {
								dfrd.resolve();
							});
						} else {
							open();
							dfrd.resolve();
						}
					},
					rmSpinner = function(fail) {
						if (baseNode) {
							spinner.remove();
							baseNode.addClass(collapsed + (fail? '' : (' ' + loaded)));
						}
					},
					dfrd = jQuery.Deferred(),
					baseNode, spinner;
				
				if (!fm.navHash2Elm(cwdhash).length) {
					syncing = true;
					loadParents()
					.done(function(res) {
						done(res, dfrd);
						rmSpinner();
					})
					.fail(function() { 
						rmSpinner(true);
						dfrd.reject();
					})
					.always(function() {
						syncing = false;
					});
				} else {
					done(void(0), dfrd);
				}
				
				// trigger 'treesync' with my jQuery.Deferred
				fm.trigger('treesync', dfrd);

				return dfrd;
			},
			
			/**
			 * Make writable and not root dirs droppable
			 *
			 * @return void
			 */
			updateDroppable = function(target, node) {
				var limit = 100,
					next;
				
				if (!target) {
					if (!node || node.closest('div.'+wrapperRoot).hasClass(uploadable)) {
						(node || tree.find('div.'+uploadable)).find(selNavdir+':not(.elfinder-ro,.elfinder-na)').addClass('native-droppable');
					}
					if (!node || node.closest('div.'+wrapperRoot).hasClass(pastable)) {
						target = (node || tree.find('div.'+pastable)).find(selNavdir+':not(.'+droppable+')');
					} else {
						target = jQuery();
					}
					if (node) {
						// check leaf roots
						node.children('div.'+wrapperRoot).each(function() {
							updateDroppable(null, jQuery(this));
						});
					}
				}
				
				// make droppable on async
				if (target.length) {
					fm.asyncJob(function(elm) {
						jQuery(elm).droppable(droppableopts);
					}, jQuery.makeArray(target), {
						interval : 20,
						numPerOnce : 100
					});
				}
			},
			
			/**
			 * Check required folders for subfolders and update arrow classes
			 *
			 * @param  Array  folders to check
			 * @param  String css class 
			 * @return void
			 */
			updateArrows = function(dirs, cls) {
				var sel = cls == loaded
						? '.'+collapsed+':not(.'+loaded+')'
						: ':not(.'+collapsed+')';
				
				jQuery.each(dirs, function(i, dir) {
					fm.navHash2Elm(dir.phash).filter(sel)
						.filter(function() { return jQuery.grep(jQuery(this).next('.'+subtree).children(), function(n) {
							return (jQuery(n).children().hasClass(root))? false : true;
						}).length > 0; })
						.addClass(cls);
				});
			},
			
			
			
			/**
			 * Navigation tree
			 *
			 * @type JQuery
			 */
			tree = jQuery(this).addClass(treeclass)
				// make dirs draggable and toggle hover class
				.on('mouseenter mouseleave', selNavdir, function(e) {
					var enter = (e.type === 'mouseenter');
					if (enter && scrolling) { return; }
					var link  = jQuery(this); 
					
					if (!link.hasClass(dropover+' '+disabled)) {
						if (!mobile && enter && !link.data('dragRegisted') && !link.hasClass(root+' '+draggable+' elfinder-na elfinder-wo')) {
							link.data('dragRegisted', true);
							if (fm.isCommandEnabled('copy', fm.navId2Hash(link.attr('id')))) {
								link.draggable(fm.draggable);
							}
						}
						link.toggleClass(hover, enter);
					}
				})
				// native drag enter
				.on('dragenter', selNavdir, function(e) {
					if (e.originalEvent.dataTransfer) {
						var dst = jQuery(this);
						dst.addClass(hover);
						if (dst.is('.'+collapsed+':not(.'+expanded+')')) {
							dst.data('expandTimer', setTimeout(function() {
								dst.is('.'+collapsed+'.'+hover) && dst.children('.'+arrow).trigger('click');
							}, 500));
						}
					}
				})
				// native drag leave
				.on('dragleave', selNavdir, function(e) {
					if (e.originalEvent.dataTransfer) {
						var dst = jQuery(this);
						dst.data('expandTimer') && clearTimeout(dst.data('expandTimer'));
						dst.removeClass(hover);
					}
				})
				// open dir or open subfolders in tree
				.on('click', selNavdir, function(e) {
					var link = jQuery(this),
						hash = fm.navId2Hash(link.attr('id')),
						file = fm.file(hash);
					
					if (link.data('longtap')) {
						link.removeData('longtap');
						e.stopPropagation();
						return;
					}
					
					if (!link.hasClass(active)) {
						tree.find(selNavdir+'.'+active).removeClass(active);
						link.addClass(active);
					}
					if (hash != fm.cwd().hash && !link.hasClass(disabled)) {
						fm.exec('open', hash).done(function() {
							fm.one('opendone', function() {
								fm.select({selected: [hash], origin: 'navbar'});
							});
						});
					} else {
						if (link.hasClass(collapsed)) {
							link.children('.'+arrow).trigger('click');
						}
						fm.select({selected: [hash], origin: 'navbar'});
					}
				})
				// for touch device
				.on('touchstart', selNavdir, function(e) {
					if (e.originalEvent.touches.length > 1) {
						return;
					}
					var evt = e.originalEvent,
						p;
					
					if (e.target.nodeName === 'INPUT') {
						e.stopPropagation();
						return;
					}
					
					p = jQuery(this).addClass(hover)
					.removeData('longtap')
					.data('tmlongtap', setTimeout(function(e){
						// long tap
						p.data('longtap', true);
						fm.trigger('contextmenu', {
							'type'    : 'navbar',
							'targets' : [fm.navId2Hash(p.attr('id'))],
							'x'       : evt.touches[0].pageX,
							'y'       : evt.touches[0].pageY
						});
					}, 500));
				})
				.on('touchmove touchend', selNavdir, function(e) {
					if (e.target.nodeName === 'INPUT') {
						e.stopPropagation();
						return;
					}
					clearTimeout(jQuery(this).data('tmlongtap'));
					if (e.type == 'touchmove') {
						jQuery(this).removeClass(hover);
					}
				})
				// toggle subfolders in tree
				.on('click', selNavdir+'.'+collapsed+' .'+arrow, function(e) {
					var arrow = jQuery(this),
						link  = arrow.parent(selNavdir),
						stree = link.next('.'+subtree),
						dfrd  = jQuery.Deferred(),
						slideTH = 30, cnt;

					e.stopPropagation();

					if (link.hasClass(loaded)) {
						link.toggleClass(expanded);
						fm.lazy(function() {
							cnt = link.hasClass(expanded)? stree.children().length + stree.find('div.elfinder-navbar-subtree[style*=block]').children().length : stree.find('div:visible').length;
							if (cnt > slideTH) {
								stree.toggle();
								fm.draggingUiHelper && fm.draggingUiHelper.data('refreshPositions', 1);
								checkSubdirs();
							} else {
								stree.stop(true, true)[link.hasClass(expanded)? 'slideDown' : 'slideUp'](opts.durations.slideUpDown, function(){
									fm.draggingUiHelper && fm.draggingUiHelper.data('refreshPositions', 1);
									checkSubdirs();
								});
							}
						}).always(function() {
							dfrd.resolve();
						});
					} else {
						spinner.insertBefore(arrow);
						link.removeClass(collapsed);

						fm.request({cmd : 'tree', target : fm.navId2Hash(link.attr('id'))})
							.done(function(data) { 
								updateTree(Object.assign([], filter(data.tree))); 
								
								if (stree.children().length) {
									link.addClass(collapsed+' '+expanded);
									if (stree.children().length > slideTH) {
										stree.show();
										fm.draggingUiHelper && fm.draggingUiHelper.data('refreshPositions', 1);
										checkSubdirs();
									} else {
										stree.stop(true, true).slideDown(opts.durations.slideUpDown, function(){
											fm.draggingUiHelper && fm.draggingUiHelper.data('refreshPositions', 1);
											checkSubdirs();
										});
									}
								} 
							})
							.always(function(data) {
								spinner.remove();
								link.addClass(loaded);
								fm.one('treedone', function() {
									dfrd.resolve();
								});
							});
					}
					arrow.data('dfrd', dfrd);
				})
				.on('contextmenu', selNavdir, function(e) {
					var self = jQuery(this);
					
					// now dirname editing
					if (self.find('input:text').length) {
						e.stopPropagation();
						return;
					}
					
					e.preventDefault();

					fm.trigger('contextmenu', {
						'type'    : 'navbar',
						'targets' : [fm.navId2Hash(jQuery(this).attr('id'))],
						'x'       : e.pageX,
						'y'       : e.pageY
					});
					
					self.addClass('ui-state-hover');
					
					fm.getUI('contextmenu').children().on('mouseenter', function() {
						self.addClass('ui-state-hover');
					});
					
					fm.bind('closecontextmenu', function() {
						self.removeClass('ui-state-hover');
					});
				})
				.on('scrolltoview', selNavdir, function(e, data) {
					var self = jQuery(this);
					autoScroll(self.attr('id')).done(function() {
						if (!data || data.blink === 'undefined' || data.blink) {
							fm.resources.blink(self, 'lookme');
						}
					});
				})
				// prepend fake dir
				.on('create.'+fm.namespace, function(e, item) {
					var pdir = findSubtree(item.phash),
						lock = item.move || false,
						dir  = jQuery(itemhtml(item)).addClass('elfinder-navbar-wrapper-tmp'),
						selected = fm.selected();
						
					lock && selected.length && fm.trigger('lockfiles', {files: selected});
					pdir.prepend(dir);
				}),
			scrolling = false,
			navbarScrTm,
			// move tree into navbar
			navbar = fm.getUI('navbar').append(tree).show().on('scroll', function() {
				scrolling = true;
				navbarScrTm && cancelAnimationFrame(navbarScrTm);
				navbarScrTm = requestAnimationFrame(function() {
					scrolling = false;
					checkSubdirs();
				});
			}),
			
			prevSortTreeview = fm.sortAlsoTreeview;
			
		fm.open(function(e) {
			var data = e.data,
				dirs = filter(data.files),
				contextmenu = fm.getUI('contextmenu');

			data.init && tree.empty();

			if (fm.UA.iOS) {
				navbar.removeClass('overflow-scrolling-touch').addClass('overflow-scrolling-touch');
			}

			if (dirs.length) {
				fm.lazy(function() {
					if (!contextmenu.data('cmdMaps')) {
						contextmenu.data('cmdMaps', {});
					}
					updateTree(dirs);
					updateArrows(dirs, loaded);
					sync(dirs);
				});
			} else {
				sync();
			}
		})
		// add new dirs
		.add(function(e) {
			var dirs = filter(e.data.added);

			if (dirs.length) {
				updateTree(dirs);
				updateArrows(dirs, collapsed);
			}
		})
		// update changed dirs
		.change(function(e) {
			// do ot perfome while syncing
			if (syncing) {
				return;
			}

			var dirs = filter(e.data.changed, true),
				length = dirs.length,
				l    = length,
				tgts = jQuery(),
				changed = {},
				dir, phash, node, tmp, realParent, reqParent, realSibling, reqSibling, isExpanded, isLoaded, parent, subdirs;
			
			jQuery.each(hasMoreDirs, function(h, node) {
				node.trigger('update.'+fm.namespace, { change: 'prepare' });
			});
			
			while (l--) {
				dir = dirs[l];
				phash = dir.phash;
				if ((node = fm.navHash2Elm(dir.hash)).length) {
					parent = node.parent();
					if (phash) {
						realParent  = node.closest('.'+subtree);
						reqParent   = findSubtree(phash);
						realSibling = node.parent().next();
						reqSibling  = findSibling(reqParent, dir);
						
						if (!reqParent.length) {
							continue;
						}
						
						if (reqParent[0] !== realParent[0] || realSibling.get(0) !== reqSibling.get(0)) {
							reqSibling.length ? reqSibling.before(parent) : reqParent.append(parent);
						}
					}
					isExpanded = node.hasClass(expanded);
					isLoaded   = node.hasClass(loaded);
					tmp        = jQuery(itemhtml(dir));
					node.replaceWith(tmp.children(selNavdir));
					! mobile && updateDroppable(null, parent);
					
					if (dir.dirs
					&& (isExpanded || isLoaded) 
					&& (node = fm.navHash2Elm(dir.hash))
					&& node.next('.'+subtree).children().length) {
						isExpanded && node.addClass(expanded);
						isLoaded && node.addClass(loaded);
					}
					
					subdirs |= dir.dirs == -1;
				}
			}
			
			// to check subdirs
			if (subdirs) {
				checkSubdirs();
			}
			
			jQuery.each(hasMoreDirs, function(h, node) {
				node.trigger('update.'+fm.namespace, { change: 'done' });
			});
			
			length && sync(void(0), false);
		})
		// remove dirs
		.remove(function(e) {
			var dirs = e.data.removed,
				l    = dirs.length,
				node, stree, removed;
			
			jQuery.each(hasMoreDirs, function(h, node) {
				node.trigger('update.'+fm.namespace, { removed : dirs });
				node.trigger('update.'+fm.namespace, { change: 'prepare' });
			});

			while (l--) {
				if ((node = fm.navHash2Elm(dirs[l])).length) {
					removed = true;
					stree = node.closest('.'+subtree);
					node.parent().detach();
					if (!stree.children().length) {
						stree.hide().prev(selNavdir).removeClass(collapsed+' '+expanded+' '+loaded);
					}
				}
			}
			
			removed && fm.getUI('navbar').children('.ui-resizable-handle').trigger('resize');
			
			jQuery.each(hasMoreDirs, function(h, node) {
				node.trigger('update.'+fm.namespace, { change: 'done' });
			});
		})
		// lock/unlock dirs while moving
		.bind('lockfiles unlockfiles', function(e) {
			var lock = e.type == 'lockfiles',
				helperLocked = e.data.helper? e.data.helper.data('locked') : false,
				act  = (lock && !helperLocked) ? 'disable' : 'enable',
				dirs = jQuery.grep(e.data.files||[], function(h) {  
					var dir = fm.file(h);
					return dir && dir.mime == 'directory' ? true : false;
				});
				
			jQuery.each(dirs, function(i, hash) {
				var dir = fm.navHash2Elm(hash);
				
				if (dir.length && !helperLocked) {
					dir.hasClass(draggable) && dir.draggable(act);
					dir.hasClass(droppable) && dir.droppable(act);
					dir[lock ? 'addClass' : 'removeClass'](disabled);
				}
			});
		})
		.bind('sortchange', function() {
			if (fm.sortAlsoTreeview || prevSortTreeview !== fm.sortAlsoTreeview) {
				var dirs,
					ends = [],
					endsMap = {},
					endsVid = {},
					topVid = '',
					single = false,
					current;
				
				fm.lazy(function() {
					dirs = filter(fm.files());
					prevSortTreeview = fm.sortAlsoTreeview;
					
					tree.empty();
					
					// append volume roots at first
					updateTree(jQuery.map(fm.roots, function(h) {
						var dir = fm.file(h);
						return dir && !dir.phash? dir : null;
					}));
					
					if (!Object.keys(hasMoreDirs).length) {
						updateTree(dirs);
						current = selectPages();
						updateArrows(dirs, loaded);
					} else {
						ends = getEnds();
						if (ends.length > 1) {
							jQuery.each(ends, function(i, end) {
								var vid = fm.file(fm.root(end)).volumeid; 
								if (i === 0) {
									topVid = vid;
								}
								endsVid[vid] = end;
								endsMap[end] = [];
							});
							jQuery.each(dirs, function(i, d) {
								if (!d.volumeid) {
									single = true;
									return false;
								}
								endsMap[endsVid[d.volumeid] || endsVid[topVid]].push(d);
							});
						} else {
							single = true;
						}
						if (single) {
							jQuery.each(ends, function(i, endHash) {
								updateTree(dirs);
								current = selectPages(fm.file(endHash));
								updateArrows(dirs, loaded);
							});
						} else {
							jQuery.each(endsMap, function(endHash, dirs) {
								updateTree(dirs);
								current = selectPages(fm.file(endHash));
								updateArrows(dirs, loaded);
							});
						}
					}
					
					sync();
				}, 100);
			}
		});

	});
	
	return this;
};


/*
 * File: /js/ui/uploadButton.js
 */

/**
 * @class  elFinder toolbar's button tor upload file
 *
 * @author Dmitry (dio) Levashov
 **/
jQuery.fn.elfinderuploadbutton = function(cmd) {
		return this.each(function() {
		var fm = cmd.fm,
			button = jQuery(this).elfinderbutton(cmd)
				.off('click'), 
			form = jQuery('<form/>').appendTo(button),
			input = jQuery('<input type="file" multiple="true" title="'+cmd.fm.i18n('selectForUpload')+'"/>')
				.on('change', function() {
					var _input = jQuery(this);
					if (_input.val()) {
						fm.exec('upload', {input : _input.remove()[0]}, void(0), fm.cwd().hash);
						input.clone(true).appendTo(form);
					} 
				})
				.on('dragover', function(e) {
					e.originalEvent.dataTransfer.dropEffect = 'copy';
				}),
			tm;

		form.append(input.clone(true));
				
		cmd.change(function() {
			tm && cancelAnimationFrame(tm);
			tm = requestAnimationFrame(function() {
				var toShow = cmd.disabled();
				if (form.is('visible')) {
					!toShow && form.hide();
				} else {
					toShow && form.show();
				}
			});
		})
		.change();
	});
};


/*
 * File: /js/ui/viewbutton.js
 */

/**
 * @class  elFinder toolbar button to switch current directory view.
 *
 * @author Dmitry (dio) Levashov
 **/
jQuery.fn.elfinderviewbutton = function(cmd) {
		return this.each(function() {
		var button = jQuery(this).elfinderbutton(cmd),
			icon   = button.children('.elfinder-button-icon'),
			text   = button.children('.elfinder-button-text'),
			tm;

		cmd.change(function() {
			tm && cancelAnimationFrame(tm);
			tm = requestAnimationFrame(function() {
				var icons = cmd.value == 'icons';

				icon.toggleClass('elfinder-button-icon-view-list', icons);
				cmd.className = icons? 'view-list' : '';
				cmd.title = cmd.fm.i18n(icons ? 'viewlist' : 'viewicons');
				button.attr('title', cmd.title);
				text.html(cmd.title);
			});
		});
	});
};


/*
 * File: /js/ui/workzone.js
 */

/**
 * @class elfinderworkzone - elFinder container for nav and current directory
 * @author Dmitry (dio) Levashov
 **/
jQuery.fn.elfinderworkzone = function(fm) {
		var cl = 'elfinder-workzone';
	
	this.not('.'+cl).each(function() {
		var wz     = jQuery(this).addClass(cl),
			prevH  = Math.round(wz.height()),
			parent = wz.parent(),
			setDelta = function() {
				wdelta = wz.outerHeight(true) - wz.height();
			},
			fitsize = function(e) {
				var height = parent.height() - wdelta,
					style  = parent.attr('style'),
					curH   = Math.round(wz.height());
	
				if (e) {
					e.preventDefault();
					e.stopPropagation();
				}
				
				parent.css('overflow', 'hidden')
					.children(':visible:not(.'+cl+')').each(function() {
						var ch = jQuery(this);
		
						if (ch.css('position') != 'absolute' && ch.css('position') != 'fixed') {
							height -= ch.outerHeight(true);
						}
					});
				parent.attr('style', style || '');
				
				height = Math.max(0, Math.round(height));
				if (prevH !== height || curH !== height) {
					prevH  = Math.round(wz.height());
					wz.height(height);
					fm.trigger('wzresize');
				}
			},
			cssloaded = function() {
				wdelta = wz.outerHeight(true) - wz.height();
				fitsize();
			},
			wdelta;
		
		setDelta();
		parent.on('resize.' + fm.namespace, fitsize);
		fm.one('cssloaded', cssloaded)
		  .bind('uiresize', fitsize)
		  .bind('themechange', setDelta);
	});
	return this;
};


/*
 * File: /js/commands/archive.js
 */

/**
 * @class  elFinder command "archive"
 * Archive selected files
 *
 * @author Dmitry (dio) Levashov
 **/
elFinder.prototype.commands.archive = function() {
		var self  = this,
		fm    = self.fm,
		mimes = [],
		dfrd;
		
	this.variants = [];
	
	this.disableOnSearch = false;
	
	this.nextAction = {};
	
	/**
	 * Update mimes on open/reload
	 *
	 * @return void
	 **/
	fm.bind('open reload', function() {
		self.variants = [];
		jQuery.each((mimes = fm.option('archivers')['create'] || []), function(i, mime) {
			self.variants.push([mime, fm.mime2kind(mime)]);
		});
		self.change();
	});
	
	this.getstate = function(select) {
		var sel = this.files(select),
			cnt = sel.length,
			chk = (cnt && ! fm.isRoot(sel[0]) && (fm.file(sel[0].phash) || {}).write && ! jQuery.grep(sel, function(f){ return f.read ? false : true; }).length),
			cwdId;
		
		if (chk && fm.searchStatus.state > 1) {
			cwdId = fm.cwd().volumeid;
			chk = (cnt === jQuery.grep(sel, function(f) { return f.read && f.hash.indexOf(cwdId) === 0 ? true : false; }).length);
		}
		
		return chk && !this._disabled && mimes.length && (cnt || (dfrd && dfrd.state() == 'pending')) ? 0 : -1;
	};
	
	this.exec = function(hashes, type) {
		var files = this.files(hashes),
			cnt   = files.length,
			mime  = type || mimes[0],
			cwd   = fm.file(files[0].phash) || null,
			error = ['errArchive', 'errPerm', 'errCreatingTempDir', 'errFtpDownloadFile', 'errFtpUploadFile', 'errFtpMkdir', 'errArchiveExec', 'errExtractExec', 'errRm'],
			i, open;

		dfrd = jQuery.Deferred().fail(function(error) {
			error && fm.error(error);
		});

		if (! (cnt && mimes.length && jQuery.inArray(mime, mimes) !== -1)) {
			return dfrd.reject();
		}
		
		if (!cwd.write) {
			return dfrd.reject(error);
		}
		
		for (i = 0; i < cnt; i++) {
			if (!files[i].read) {
				return dfrd.reject(error);
			}
		}

		self.mime   = mime;
		self.prefix = ((cnt > 1)? 'Archive' : files[0].name) + (fm.option('archivers')['createext']? '.' + fm.option('archivers')['createext'][mime] : '');
		self.data   = {targets : self.hashes(hashes), type : mime};
		
		if (fm.cwd().hash !== cwd.hash) {
			open = fm.exec('open', cwd.hash).done(function() {
				fm.one('cwdrender', function() {
					fm.selectfiles({files : hashes});
					dfrd = jQuery.proxy(fm.res('mixin', 'make'), self)();
				});
			});
		} else {
			fm.selectfiles({files : hashes});
			dfrd = jQuery.proxy(fm.res('mixin', 'make'), self)();
		}
		
		return dfrd;
	};

};


/*
 * File: /js/commands/back.js
 */

/**
 * @class  elFinder command "back"
 * Open last visited folder
 *
 * @author Dmitry (dio) Levashov
 **/
(elFinder.prototype.commands.back = function() {
		this.alwaysEnabled  = true;
	this.updateOnSelect = false;
	this.shortcuts      = [{
		pattern     : 'ctrl+left backspace'
	}];
	
	this.getstate = function() {
		return this.fm.history.canBack() ? 0 : -1;
	};
	
	this.exec = function() {
		return this.fm.history.back();
	};

}).prototype = { forceLoad : true }; // this is required command


/*
 * File: /js/commands/chmod.js
 */

/**
 * @class elFinder command "chmod".
 * Chmod files.
 *
 * @type  elFinder.command
 * @author Naoki Sawada
 */
elFinder.prototype.commands.chmod = function() {
		this.updateOnSelect = false;
	var fm  = this.fm,
		level = {
			0 : 'owner',
			1 : 'group',
			2 : 'other'
		},
		msg = {
			read     : fm.i18n('read'),
			write    : fm.i18n('write'),
			execute  : fm.i18n('execute'),
			perm     : fm.i18n('perm'),
			kind     : fm.i18n('kind'),
			files    : fm.i18n('files')
		},
		isPerm = function(perm){
			return (!isNaN(parseInt(perm, 8) && parseInt(perm, 8) <= 511) || perm.match(/^([r-][w-][x-]){3}$/i));
		};

	this.tpl = {
		main       : '<div class="ui-helper-clearfix elfinder-info-title"><span class="elfinder-cwd-icon {class} ui-corner-all"/>{title}</div>'
					+'{dataTable}',
		itemTitle  : '<strong>{name}</strong><span id="elfinder-info-kind">{kind}</span>',
		groupTitle : '<strong>{items}: {num}</strong>',
		dataTable  : '<table id="{id}-table-perm"><tr><td>{0}</td><td>{1}</td><td>{2}</td></tr></table>'
					+'<div class="">'+msg.perm+': <input class="elfinder-tabstop elfinder-focus" id="{id}-perm" type="text" size="4" maxlength="3" value="{value}"></div>',
		fieldset   : '<fieldset id="{id}-fieldset-{level}"><legend>{f_title}{name}</legend>'
					+'<input type="checkbox" value="4" class="elfinder-tabstop" id="{id}-read-{level}-perm"{checked-r}> <label for="{id}-read-{level}-perm">'+msg.read+'</label><br>'
					+'<input type="checkbox" value="6" class="elfinder-tabstop" id="{id}-write-{level}-perm"{checked-w}> <label for="{id}-write-{level}-perm">'+msg.write+'</label><br>'
					+'<input type="checkbox" value="5" class="elfinder-tabstop" id="{id}-execute-{level}-perm"{checked-x}> <label for="{id}-execute-{level}-perm">'+msg.execute+'</label><br>'
	};

	this.shortcuts = [{
		//pattern     : 'ctrl+p'
	}];

	this.getstate = function(sel) {
		var fm = this.fm;
		sel = sel || fm.selected();
		if (sel.length == 0) {
			sel = [ fm.cwd().hash ];
		}
		return this.checkstate(this.files(sel)) ? 0 : -1;
	};
	
	this.checkstate = function(sel) {
		var cnt = sel.length;
		if (!cnt) return false;
		var chk = jQuery.grep(sel, function(f) {
			return (f.isowner && f.perm && isPerm(f.perm) && (cnt == 1 || f.mime != 'directory')) ? true : false;
		}).length;
		return (cnt == chk)? true : false;
	};

	this.exec = function(select) {
		var hashes  = this.hashes(select),
			files   = this.files(hashes);
		if (! files.length) {
			hashes = [ this.fm.cwd().hash ];
			files   = this.files(hashes);
		}
		var fm  = this.fm,
		dfrd    = jQuery.Deferred().always(function() {
			fm.enable();
		}),
		tpl     = this.tpl,
		cnt     = files.length,
		file    = files[0],
		id = fm.namespace + '-perm-' + file.hash,
		view    = tpl.main,
		checked = ' checked="checked"',
		buttons = function() {
			var buttons = {};
			buttons[fm.i18n('btnApply')] = save;
			buttons[fm.i18n('btnCancel')] = function() { dialog.elfinderdialog('close'); };
			return buttons;
		},
		save = function() {
			var perm = jQuery.trim(jQuery('#'+id+'-perm').val()),
				reqData;
			
			if (!isPerm(perm)) return false;
			
			dialog.elfinderdialog('close');
			
			reqData = {
				cmd     : 'chmod',
				targets : hashes,
				mode    : perm
			};
			fm.request({
				data : reqData,
				notify : {type : 'chmod', cnt : cnt}
			})
			.fail(function(error) {
				dfrd.reject(error);
			})
			.done(function(data) {
				if (data.changed && data.changed.length) {
					data.undo = {
						cmd : 'chmod',
						callback : function() {
							var reqs = [];
							jQuery.each(prevVals, function(perm, hashes) {
								reqs.push(fm.request({
									data : {cmd : 'chmod', targets : hashes, mode : perm},
									notify : {type : 'undo', cnt : hashes.length}
								}));
							});
							return jQuery.when.apply(null, reqs);
						}
					};
					data.redo = {
						cmd : 'chmod',
						callback : function() {
							return fm.request({
								data : reqData,
								notify : {type : 'redo', cnt : hashes.length}
							});
						}
					};
				}
				dfrd.resolve(data);
			});
		},
		setperm = function() {
			var perm = '';
			var _perm;
			for (var i = 0; i < 3; i++){
				_perm = 0;
				if (jQuery("#"+id+"-read-"+level[i]+'-perm').is(':checked')) {
					_perm = (_perm | 4);
				}
				if (jQuery("#"+id+"-write-"+level[i]+'-perm').is(':checked')) {
					_perm = (_perm | 2);
				}
				if (jQuery("#"+id+"-execute-"+level[i]+'-perm').is(':checked')) {
					_perm = (_perm | 1);
				}
				perm += _perm.toString(8);
			}
			jQuery('#'+id+'-perm').val(perm);
		},
		setcheck = function(perm) {
			var _perm;
			for (var i = 0; i < 3; i++){
				_perm = parseInt(perm.slice(i, i+1), 8);
				jQuery("#"+id+"-read-"+level[i]+'-perm').prop("checked", false);
				jQuery("#"+id+"-write-"+level[i]+'-perm').prop("checked", false);
				jQuery("#"+id+"-execute-"+level[i]+'-perm').prop("checked", false);
				if ((_perm & 4) == 4) {
					jQuery("#"+id+"-read-"+level[i]+'-perm').prop("checked", true);
				}
				if ((_perm & 2) == 2) {
					jQuery("#"+id+"-write-"+level[i]+'-perm').prop("checked", true);
				}
				if ((_perm & 1) == 1) {
					jQuery("#"+id+"-execute-"+level[i]+'-perm').prop("checked", true);
				}
			}
			setperm();
		},
		makeperm = function(files) {
			var perm = '777', ret = '', chk, _chk, _perm;
			var len = files.length;
			for (var i2 = 0; i2 < len; i2++) {
				chk = getPerm(files[i2].perm);
				if (! prevVals[chk]) {
					prevVals[chk] = [];
				}
				prevVals[chk].push(files[i2].hash);
				ret = '';
				for (var i = 0; i < 3; i++){
					_chk = parseInt(chk.slice(i, i+1), 8);
					_perm = parseInt(perm.slice(i, i+1), 8);
					if ((_chk & 4) != 4 && (_perm & 4) == 4) {
						_perm -= 4;
					}
					if ((_chk & 2) != 2 && (_perm & 2) == 2) {
						_perm -= 2;
					}
					if ((_chk & 1) != 1 && (_perm & 1) == 1) {
						_perm -= 1;
					}
					ret += _perm.toString(8);
				}
				perm = ret;
			}
			return perm;
		},
		makeName = function(name) {
			return name? ':'+name : '';
		},
		makeDataTable = function(perm, f) {
			var _perm, fieldset;
			var value = '';
			var dataTable = tpl.dataTable;
			for (var i = 0; i < 3; i++){
				_perm = parseInt(perm.slice(i, i+1), 8);
				value += _perm.toString(8);
				fieldset = tpl.fieldset.replace('{f_title}', fm.i18n(level[i])).replace('{name}', makeName(f[level[i]])).replace(/\{level\}/g, level[i]);
				dataTable = dataTable.replace('{'+i+'}', fieldset)
				                     .replace('{checked-r}', ((_perm & 4) == 4)? checked : '')
				                     .replace('{checked-w}', ((_perm & 2) == 2)? checked : '')
				                     .replace('{checked-x}', ((_perm & 1) == 1)? checked : '');
			}
			dataTable = dataTable.replace('{value}', value).replace('{valueCaption}', msg['perm']);
			return dataTable;
		},
		getPerm = function(perm){
			if (isNaN(parseInt(perm, 8))) {
				var mode_array = perm.split('');
				var a = [];

				for (var i = 0, l = mode_array.length; i < l; i++) {
					if (i === 0 || i === 3 || i === 6) {
						if (mode_array[i].match(/[r]/i)) {
							a.push(1);
						} else if (mode_array[i].match(/[-]/)) {
							a.push(0);
						}
					} else if ( i === 1 || i === 4 || i === 7) {
						 if (mode_array[i].match(/[w]/i)) {
							a.push(1);
						} else if (mode_array[i].match(/[-]/)) {
							a.push(0);
						}
					} else {
						if (mode_array[i].match(/[x]/i)) {
							a.push(1);
						} else if (mode_array[i].match(/[-]/)) {
							a.push(0);
						}
					}
				}
			
				a.splice(3, 0, ",");
				a.splice(7, 0, ",");

				var b = a.join("");
				var b_array = b.split(",");
				var c = [];
			
				for (var j = 0, m = b_array.length; j < m; j++) {
					var p = parseInt(b_array[j], 2).toString(8);
					c.push(p);
				}

				perm = c.join('');
			} else {
				perm = parseInt(perm, 8).toString(8);
			}
			return perm;
		},
		opts    = {
			title : this.title,
			width : 'auto',
			buttons : buttons(),
			close : function() { jQuery(this).elfinderdialog('destroy'); }
		},
		dialog = fm.getUI().find('#'+id),
		prevVals = {},
		tmb = '', title, dataTable;

		if (dialog.length) {
			dialog.elfinderdialog('toTop');
			return jQuery.Deferred().resolve();
		}

		view  = view.replace('{class}', cnt > 1 ? 'elfinder-cwd-icon-group' : fm.mime2class(file.mime));
		if (cnt > 1) {
			title = tpl.groupTitle.replace('{items}', fm.i18n('items')).replace('{num}', cnt);
		} else {
			title = tpl.itemTitle.replace('{name}', file.name).replace('{kind}', fm.mime2kind(file));
			tmb = fm.tmb(file);
		}

		dataTable = makeDataTable(makeperm(files), files.length == 1? files[0] : {});

		view = view.replace('{title}', title).replace('{dataTable}', dataTable).replace(/{id}/g, id);

		dialog = this.fmDialog(view, opts);
		dialog.attr('id', id);

		// load thumbnail
		if (tmb) {
			jQuery('<img/>')
				.on('load', function() { dialog.find('.elfinder-cwd-icon').addClass(tmb.className).css('background-image', "url('"+tmb.url+"')"); })
				.attr('src', tmb.url);
		}

		jQuery('#' + id + '-table-perm :checkbox').on('click', function(){setperm('perm');});
		jQuery('#' + id + '-perm').on('keydown', function(e) {
			var c = e.keyCode;
			if (c == jQuery.ui.keyCode.ENTER) {
				e.stopPropagation();
				save();
				return;
			}
		}).on('focus', function(e){
			jQuery(this).trigger('select');
		}).on('keyup', function(e) {
			if (jQuery(this).val().length == 3) {
				jQuery(this).trigger('select');
				setcheck(jQuery(this).val());
			}
		});
		
		return dfrd;
	};
};


/*
 * File: /js/commands/colwidth.js
 */

/**
 * @class  elFinder command "colwidth"
 * CWD list table columns width to auto
 *
 * @author Naoki Sawada
 **/
elFinder.prototype.commands.colwidth = function() {
		this.alwaysEnabled = true;
	this.updateOnSelect = false;
	
	this.getstate = function() {
		return this.fm.getUI('cwd').find('table').css('table-layout') === 'fixed' ? 0 : -1;
	};
	
	this.exec = function() {
		this.fm.getUI('cwd').trigger('colwidth');
		return jQuery.Deferred().resolve();
	};
	
};

/*
 * File: /js/commands/copy.js
 */

/**
 * @class elFinder command "copy".
 * Put files in filemanager clipboard.
 *
 * @type  elFinder.command
 * @author  Dmitry (dio) Levashov
 */
elFinder.prototype.commands.copy = function() {
		this.shortcuts = [{
		pattern     : 'ctrl+c ctrl+insert'
	}];
	
	this.getstate = function(select) {
		var sel = this.files(select),
			cnt = sel.length;

		return cnt && jQuery.grep(sel, function(f) { return f.read ? true : false; }).length == cnt ? 0 : -1;
	};
	
	this.exec = function(hashes) {
		var fm   = this.fm,
			dfrd = jQuery.Deferred()
				.fail(function(error) {
					fm.error(error);
				});

		jQuery.each(this.files(hashes), function(i, file) {
			if (! file.read) {
				return !dfrd.reject(['errCopy', file.name, 'errPerm']);
			}
		});
		
		return dfrd.state() == 'rejected' ? dfrd : dfrd.resolve(fm.clipboard(this.hashes(hashes)));
	};

};


/*
 * File: /js/commands/cut.js
 */

/**
 * @class elFinder command "copy".
 * Put files in filemanager clipboard.
 *
 * @type  elFinder.command
 * @author  Dmitry (dio) Levashov
 */
elFinder.prototype.commands.cut = function() {
		var fm = this.fm;
	
	this.shortcuts = [{
		pattern     : 'ctrl+x shift+insert'
	}];
	
	this.getstate = function(select) {
		var sel = this.files(select),
			cnt = sel.length;
		
		return cnt && jQuery.grep(sel, function(f) { return f.read && ! f.locked && ! fm.isRoot(f) ? true : false; }).length == cnt ? 0 : -1;
	};
	
	this.exec = function(hashes) {
		var dfrd = jQuery.Deferred()
				.fail(function(error) {
					fm.error(error);
				});

		jQuery.each(this.files(hashes), function(i, file) {
			if (!(file.read && ! file.locked && ! fm.isRoot(file)) ) {
				return !dfrd.reject(['errCopy', file.name, 'errPerm']);
			}
			if (file.locked) {
				return !dfrd.reject(['errLocked', file.name]);
			}
		});
		
		return dfrd.state() == 'rejected' ? dfrd : dfrd.resolve(fm.clipboard(this.hashes(hashes), true));
	};

};


/*
 * File: /js/commands/download.js
 */

/**
 * @class elFinder command "download". 
 * Download selected files.
 * Only for new api
 *
 * @author Dmitry (dio) Levashov, dio@std42.ru
 **/
elFinder.prototype.commands.zipdl = function() {};
elFinder.prototype.commands.download = function() {
		var self   = this,
		fm     = this.fm,
		czipdl = null,
		zipOn  = false,
		mixed  = false,
		dlntf  = false,
		cpath  = window.location.pathname || '/',
		filter = function(hashes, inExec) {
			var volumeid, mixedCmd;
			
			if (czipdl !== null) {
				if (fm.searchStatus.state > 1) {
					mixed = fm.searchStatus.mixed;
				} else if (fm.leafRoots[fm.cwd().hash]) {
					volumeid = fm.cwd().volumeid;
					jQuery.each(hashes, function(i, h) {
						if (h.indexOf(volumeid) !== 0) {
							mixed = true;
							return false;
						}
					});
				}
				zipOn = (fm.isCommandEnabled('zipdl', hashes[0]));
			}

			if (mixed) {
				mixedCmd = czipdl? 'zipdl' : 'download';
				hashes = jQuery.grep(hashes, function(h) {
					var f = fm.file(h),
						res = (! f || (! czipdl && f.mime === 'directory') || ! fm.isCommandEnabled(mixedCmd, h))? false : true;
					if (f && inExec && ! res) {
						fm.cwdHash2Elm(f.hash).trigger('unselect');
					}
					return res;
				});
				if (! hashes.length) {
					return [];
				}
			} else {
				if (!fm.isCommandEnabled('download', hashes[0])) {
					return [];
				}
			}
			
			return jQuery.grep(self.files(hashes), function(f) { 
				var res = (! f.read || (! zipOn && f.mime == 'directory')) ? false : true;
				if (inExec && ! res) {
					fm.cwdHash2Elm(f.hash).trigger('unselect');
				}
				return res;
			});
		};
	
	this.linkedCmds = ['zipdl'];
	
	this.shortcuts = [{
		pattern     : 'shift+enter'
	}];
	
	this.getstate = function(select) {
		var sel    = this.hashes(select),
			cnt    = sel.length,
			maxReq = this.options.maxRequests || 10,
			mixed  = false,
			croot  = '';
		
		if (cnt < 1) {
			return -1;
		}
		cnt = filter(sel).length;
		
		return  (cnt && (zipOn || (cnt <= maxReq && ((!fm.UA.IE && !fm.UA.Mobile) || cnt == 1))) ? 0 : -1);
	};
	
	fm.bind('contextmenu', function(e){
		var fm = self.fm,
			helper = null,
			targets, file, link,
			getExtra = function(file) {
				var link = file.url || fm.url(file.hash);
				return {
					icon: 'link',
					node: jQuery('<a/>')
						.attr({href: link, target: '_blank', title: fm.i18n('link')})
						.text(file.name)
						.on('mousedown click touchstart touchmove touchend contextmenu', function(e){
							e.stopPropagation();
						})
						.on('dragstart', function(e) {
							var dt = e.dataTransfer || e.originalEvent.dataTransfer || null;
							helper = null;
							if (dt) {
								var icon  = function(f) {
										var mime = f.mime, i, tmb = fm.tmb(f);
										i = '<div class="elfinder-cwd-icon '+fm.mime2class(mime)+' ui-corner-all"/>';
										if (tmb) {
											i = jQuery(i).addClass(tmb.className).css('background-image', "url('"+tmb.url+"')").get(0).outerHTML;
										}
										return i;
									};
								dt.effectAllowed = 'copyLink';
								if (dt.setDragImage) {
									helper = jQuery('<div class="elfinder-drag-helper html5-native">').append(icon(file)).appendTo(jQuery(document.body));
									dt.setDragImage(helper.get(0), 50, 47);
								}
								if (!fm.UA.IE) {
									dt.setData('elfinderfrom', window.location.href + file.phash);
									dt.setData('elfinderfrom:' + dt.getData('elfinderfrom'), '');
								}
							}
						})
						.on('dragend', function(e) {
							helper && helper.remove();
						})
				};
			};
		self.extra = null;
		if (e.data) {
			targets = e.data.targets || [];
			if (targets.length === 1 && (file = fm.file(targets[0])) && file.mime !== 'directory') {
				if (file.url != '1') {
					self.extra = getExtra(file);
				} else {
					// Get URL ondemand
					var node;
					self.extra = {
						icon: 'link',
						node: jQuery('<a/>')
							.attr({href: '#', title: fm.i18n('getLink'), draggable: 'false'})
							.text(file.name)
							.on('click touchstart', function(e){
								if (e.type === 'touchstart' && e.originalEvent.touches.length > 1) {
									return;
								}
								var parent = node.parent();
								e.stopPropagation();
								e.preventDefault();
								parent.removeClass('ui-state-disabled').addClass('elfinder-button-icon-spinner');
								fm.request({
									data : {cmd : 'url', target : file.hash},
									preventDefault : true
								})
								.always(function(data) {
									parent.removeClass('elfinder-button-icon-spinner');
									if (data.url) {
										var rfile = fm.file(file.hash);
										rfile.url = data.url;
										node.replaceWith(getExtra(file).node);
									} else {
										parent.addClass('ui-state-disabled');
									}
								});

							})
					};
					node = self.extra.node;
					node.ready(function(){
						requestAnimationFrame(function(){
							node.parent().addClass('ui-state-disabled').css('pointer-events', 'auto');
						});
					});
				}
			}
		}
	}).one('open', function() {
		if (fm.api >= 2.1012) {
			czipdl = fm.getCommand('zipdl');
		}
		dlntf = fm.api > 2.1038 && !fm.isCORS;
	});
	
	this.exec = function(select) {
		var hashes  = this.hashes(select),
			fm      = this.fm,
			base    = fm.options.url,
			files   = filter(hashes, true),
			dfrd    = jQuery.Deferred(),
			iframes = '',
			cdata   = '',
			targets = {},
			i, url,
			linkdl  = false,
			getTask = function(hashes) {
				return function() {
					var dfd = jQuery.Deferred(),
						root = fm.file(fm.root(hashes[0])),
						single = (hashes.length === 1),
						volName = root? (root.i18 || root.name) : null,
						dir, dlName, phash;
					if (single) {
						if (dir = fm.file(hashes[0])) {
							dlName = (dir.i18 || dir.name);
						}
					} else {
						jQuery.each(hashes, function() {
							var d = fm.file(this);
							if (d && (!phash || phash === d.phash)) {
								phash = d.phash;
							} else {
								phash = null;
								return false;
							}
						});
						if (phash && (dir = fm.file(phash))) {
							dlName = (dir.i18 || dir.name) + '-' + hashes.length;
						}
					}
					if (dlName) {
						volName = dlName;
					}
					volName && (volName = ' (' + volName + ')');
					fm.request({
						data : {cmd : 'zipdl', targets : hashes},
						notify : {type : 'zipdl', cnt : 1, hideCnt : true, msg : fm.i18n('ntfzipdl') + volName},
						cancel : true,
						eachCancel : true,
						preventDefault : true
					}).done(function(e) {
						var zipdl, dialog, btn = {}, dllink, form, iframe, m,
							uniq = 'dlw' + (+new Date());
						if (e.error) {
							fm.error(e.error);
							dfd.resolve();
						} else if (e.zipdl) {
							zipdl = e.zipdl;
							if (dlName) {
								m = fm.splitFileExtention(zipdl.name || '');
								dlName += m[1]? ('.' + m[1]) : '.zip';
							} else {
								dlName = zipdl.name;
							}
							if ((html5dl && (!fm.UA.Safari || fm.isSameOrigin(fm.options.url))) || linkdl) {
								url = fm.options.url + (fm.options.url.indexOf('?') === -1 ? '?' : '&')
								+ 'cmd=zipdl&download=1';
								jQuery.each([hashes[0], zipdl.file, dlName, zipdl.mime], function(key, val) {
									url += '&targets%5B%5D='+encodeURIComponent(val);
								});
								jQuery.each(fm.customData, function(key, val) {
									url += '&'+encodeURIComponent(key)+'='+encodeURIComponent(val);
								});
								url += '&'+encodeURIComponent(dlName);
								dllink = jQuery('<a/>')
									.attr('href', url)
									.attr('download', fm.escape(dlName))
									.on('click', function() {
										dfd.resolve();
										dialog && dialog.elfinderdialog('destroy');
									});
								if (linkdl) {
									dllink.attr('target', '_blank')
										.append('<span class="elfinder-button-icon elfinder-button-icon-download"></span>'+fm.escape(dlName));
									btn[fm.i18n('btnCancel')] = function() {
										dialog.elfinderdialog('destroy');
									};
									dialog = self.fmDialog(dllink, {
										title: fm.i18n('link'),
										buttons: btn,
										width: '200px',
										destroyOnClose: true,
										close: function() {
											(dfd.state() !== 'resolved') && dfd.resolve();
										}
									});
								} else {
									click(dllink.hide().appendTo('body').get(0));
									dllink.remove();
								}
							} else {
								form = jQuery('<form action="'+fm.options.url+'" method="post" target="'+uniq+'" style="display:none"/>')
								.append('<input type="hidden" name="cmd" value="zipdl"/>')
								.append('<input type="hidden" name="download" value="1"/>');
								jQuery.each([hashes[0], zipdl.file, dlName, zipdl.mime], function(key, val) {
									form.append('<input type="hidden" name="targets[]" value="'+fm.escape(val)+'"/>');
								});
								jQuery.each(fm.customData, function(key, val) {
									form.append('<input type="hidden" name="'+key+'" value="'+fm.escape(val)+'"/>');
								});
								form.attr('target', uniq).appendTo('body');
								iframe = jQuery('<iframe style="display:none" name="'+uniq+'">')
									.appendTo('body')
									.ready(function() {
										form.submit().remove();
										dfd.resolve();
										setTimeout(function() {
											iframe.remove();
										}, 20000); // give 20 sec file to be saved
									});
							}
						}
					}).fail(function(error) {
						error && fm.error(error);
						dfd.resolve();
					});
					return dfd.promise();
				};
			},
			// use MouseEvent to click element for Safari etc
			click = function(a) {
				var clickEv;
				if (typeof MouseEvent === 'function') {
					clickEv = new MouseEvent('click');
				} else {
					clickEv = document.createEvent('MouseEvents');
					clickEv.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
				}
				a.dispatchEvent(clickEv);
			},
			checkCookie = function(id) {
				var name = 'elfdl' + id,
					parts;
				parts = document.cookie.split(name + "=");
				if (parts.length === 2) {
					ntftm && clearTimeout(ntftm);
					document.cookie = name + '=; path=' + cpath + '; max-age=0';
					closeNotify();
				} else {
					setTimeout(function() { checkCookie(id); }, 200);
				}
			},
			closeNotify = function() {
				if (fm.ui.notify.children('.elfinder-notify-download').length) {
					fm.notify({
						type : 'download',
						cnt : -1
					});
				}
			},
			reqids = [],
			link, html5dl, fileCnt, clickEv, cid, ntftm, reqid;
			
		if (!files.length) {
			return dfrd.reject();
		}
		
		fileCnt = jQuery.grep(files, function(f) { return f.mime === 'directory'? false : true; }).length;
		link = jQuery('<a>').hide().appendTo('body');
		html5dl = (typeof link.get(0).download === 'string');
		
		if (zipOn && (fileCnt !== files.length || fileCnt >= (this.options.minFilesZipdl || 1))) {
			link.remove();
			linkdl = (!html5dl && fm.UA.Mobile);
			if (mixed) {
				targets = {};
				jQuery.each(files, function(i, f) {
					var p = f.hash.split('_', 2);
					if (! targets[p[0]]) {
						targets[p[0]] = [ f.hash ];
					} else {
						targets[p[0]].push(f.hash);
					}
				});
				if (!linkdl && fm.UA.Mobile && Object.keys(targets).length > 1) {
					linkdl = true;
				}
			} else {
				targets = [ jQuery.map(files, function(f) { return f.hash; }) ];
			}
			dfrd = fm.sequence(jQuery.map(targets, function(t) { return getTask(t); })).always(
				function() {
					fm.trigger('download', {files : files});
				}
			);
			return dfrd;
		} else {
			reqids = [];
			for (i = 0; i < files.length; i++) {
				url = fm.openUrl(files[i].hash, true);
				if (dlntf && url.substr(0, fm.options.url.length) === fm.options.url) {
					reqid = fm.getRequestId();
					reqids.push(reqid);
					url += '&cpath=' + cpath + '&reqid=' + reqid;
					ntftm = setTimeout(function() {
						fm.notify({
							type : 'download',
							cnt : 1,
							cancel : (fm.UA.IE || fm.UA.Edge)? void(0) : function() {
								if (reqids.length) {
									jQuery.each(reqids, function() {
										fm.request({
											data: {
												cmd: 'abort',
												id: this
											},
											preventDefault: true
										});
									});
								}
								reqids = [];
							}
						});
					}, fm.notifyDelay);
					checkCookie(reqid);
				}
				if (html5dl && (!fm.UA.Safari || fm.isSameOrigin(url))) {
					click(link.attr('href', url)
						.attr('download', fm.escape(files[i].name))
						.get(0)
					);
				} else {
					if (fm.UA.Mobile) {
						setTimeout(function(){
							if (! window.open(url)) {
								fm.error('errPopup');
								ntftm && cleaerTimeout(ntftm);
								closeNotify();
							}
						}, 100);
					} else {
						iframes += '<iframe class="downloader" id="downloader-' + files[i].hash+'" style="display:none" src="'+url+'"/>';
					}
				}
			}
			link.remove();
			jQuery(iframes)
				.appendTo('body')
				.ready(function() {
					setTimeout(function() {
						jQuery(iframes).each(function() {
							jQuery('#' + jQuery(this).attr('id')).remove();
						});
					}, 20000 + (10000 * i)); // give 20 sec + 10 sec for each file to be saved
				});
			fm.trigger('download', {files : files});
			return dfrd.resolve();
		}
	};

};


/*
 * File: /js/commands/duplicate.js
 */

/**
 * @class elFinder command "duplicate"
 * Create file/folder copy with suffix "copy Number"
 *
 * @type  elFinder.command
 * @author  Dmitry (dio) Levashov
 */
elFinder.prototype.commands.duplicate = function() {
		var fm = this.fm;
	
	this.getstate = function(select) {
		var sel = this.files(select),
			cnt = sel.length;

		return cnt && fm.cwd().write && jQuery.grep(sel, function(f) { return f.read && f.phash === fm.cwd().hash && ! fm.isRoot(f)? true : false; }).length == cnt ? 0 : -1;
	};
	
	this.exec = function(hashes) {
		var fm     = this.fm,
			files  = this.files(hashes),
			cnt    = files.length,
			dfrd   = jQuery.Deferred()
				.fail(function(error) {
					error && fm.error(error);
				}), 
			args = [];
			
		if (! cnt) {
			return dfrd.reject();
		}
		
		jQuery.each(files, function(i, file) {
			if (!file.read || !fm.file(file.phash).write) {
				return !dfrd.reject(['errCopy', file.name, 'errPerm']);
			}
		});
		
		if (dfrd.state() == 'rejected') {
			return dfrd;
		}
		
		return fm.request({
			data   : {cmd : 'duplicate', targets : this.hashes(hashes)},
			notify : {type : 'copy', cnt : cnt},
			navigate : {
				toast : {
					inbuffer : {msg: fm.i18n(['complete', fm.i18n('cmdduplicate')])}
				}
			}
		});
		
	};

};


/*
 * File: /js/commands/edit.js
 */

/**
 * @class elFinder command "edit". 
 * Edit text file in dialog window
 *
 * @author Dmitry (dio) Levashov, dio@std42.ru
 **/
elFinder.prototype.commands.edit = function() {
		var self  = this,
		fm    = this.fm,
		clsEditing = fm.res('class', 'editing'),
		mimesSingle = [],
		mimes = [],
		allowAll = false,
		rtrim = function(str){
			return str.replace(/\s+$/, '');
		},
		getEncSelect = function(heads) {
			var sel = jQuery('<select class="ui-corner-all"/>'),
				hval;
			if (heads) {
				jQuery.each(heads, function(i, head) {
					hval = fm.escape(head.value);
					sel.append('<option value="'+hval+'">'+(head.caption? fm.escape(head.caption) : hval)+'</option>');
				});
			}
			jQuery.each(self.options.encodings, function(i, v) {
				sel.append('<option value="'+v+'">'+v+'</option>');
			});
			return sel;
		},
		getDlgWidth = function() {
			var m, width;
			if (typeof self.options.dialogWidth === 'string' && (m = self.options.dialogWidth.match(/(\d+)%/))) {
				width = parseInt(fm.getUI().width() * (m[1] / 100));
			} else {
				width = parseInt(self.options.dialogWidth || 650);
			}
			return Math.min(width, jQuery(window).width());
		},

		/**
		 * Return files acceptable to edit
		 *
		 * @param  Array  files hashes
		 * @return Array
		 **/
		filter = function(files) {
			var cnt = files.length,
				mime, ext, skip;
			
			if (cnt > 1) {
				mime = files[0].mime;
				ext = files[0].name.replace(/^.*(\.[^.]+)$/, '$1');
			}
			return jQuery.grep(files, function(file) {
				var res;
				if (skip || file.mime === 'directory') {
					return false;
				}
				res = file.read
					&& (allowAll || fm.mimeIsText(file.mime) || jQuery.inArray(file.mime, cnt === 1? mimesSingle : mimes) !== -1) 
					&& (!self.onlyMimes.length || jQuery.inArray(file.mime, self.onlyMimes) !== -1)
					&& (cnt === 1 || (file.mime === mime && file.name.substr(ext.length * -1) === ext))
					&& (fm.uploadMimeCheck(file.mime, file.phash)? true : false)
					&& setEditors(file, cnt)
					&& Object.keys(editors).length;
				if (!res) {
					skip = true;
				}
				return res;
			});
		},

		fileSync = function(hash) {
			var old = fm.file(hash),
				f;
			fm.request({
				cmd: 'info',
				targets: [hash],
				preventDefault: true
			}).done(function(data) {
				var changed;
				if (data && data.files && data.files.length) {
					f = data.files[0];
					if (old.ts != f.ts || old.size != f.size) {
						changed = { changed: [ f ] };
						fm.updateCache(changed);
						fm.change(changed);
					}
				}
			});
		},

		/**
		 * Open dialog with textarea to edit file
		 *
		 * @param  String  id       dialog id
		 * @param  Object  file     file object
		 * @param  String  content  file content
		 * @return jQuery.Deferred
		 **/
		dialog = function(id, file, content, encoding, editor) {

			var dfrd = jQuery.Deferred(),
				_loaded = false,
				loaded = function() {
					if (!_loaded) {
						fm.toast({
							mode: 'warning',
							msg: fm.i18n('nowLoading')
						});
						return false;
					}
					return true;
				},
				save = function() {
					var encord = selEncoding? selEncoding.val():void(0),
						saveDfd = jQuery.Deferred().fail(function(err) {
							dialogNode.show().find('button.elfinder-btncnt-0,button.elfinder-btncnt-1').hide();
						}),
						conf, res;
					if (!loaded()) {
						return saveDfd.resolve();
					}
					if (ta.editor) {
						ta.editor.save(ta[0], ta.editor.instance);
						conf = ta.editor.confObj;
						if (conf.info && (conf.info.schemeContent || conf.info.arrayBufferContent)) {
							encord = 'scheme';
						}
					}
					res = getContent();
					setOld(res);
					if (res.promise) {
						res.done(function(data) {
							dfrd.notifyWith(ta, [encord, ta.data('hash'), old, saveDfd]);
						}).fail(function(err) {
							saveDfd.reject(err);
						});
					} else {
						dfrd.notifyWith(ta, [encord, ta.data('hash'), old, saveDfd]);
					}
					return saveDfd;
				},
				saveon = function() {
					if (!loaded()) { return; }
					save().fail(function(err) {
						err && fm.error(err);
					});
				},
				cancel = function() {
					ta.elfinderdialog('close');
				},
				savecl = function() {
					if (!loaded()) { return; }
					save().done(function() {
						_loaded = false;
						dialogNode.show();
						cancel();
					}).fail(function(err) {
						dialogNode.show();
						err && fm.error(err);
					});
					dialogNode.hide();
				},
				saveAs = function() {
					if (!loaded()) { return; }
					var prevOld = old,
						phash = fm.file(file.phash)? file.phash : fm.cwd().hash,
						fail = function(err) {
							dialogs.addClass(clsEditing).fadeIn(function() {
								err && fm.error(err);
							});
							old = prevOld;
							fm.disable();
						},
						make = function() {
							self.mime = saveAsFile.mime || file.mime;
							self.prefix = (saveAsFile.name || file.name).replace(/ \d+(\.[^.]+)?$/, '$1');
							self.requestCmd = 'mkfile';
							self.nextAction = {};
							self.data = {target : phash};
							jQuery.proxy(fm.res('mixin', 'make'), self)()
								.done(function(data) {
									if (data.added && data.added.length) {
										ta.data('hash', data.added[0].hash);
										save().done(function() {
											_loaded = false;
											dialogNode.show();
											cancel();
											dialogs.fadeIn();
										}).fail(fail);
									} else {
										fail();
									}
								})
								.progress(function(err) {
									if (err && err === 'errUploadMime') {
										ta.trigger('saveAsFail');
									}
								})
								.fail(fail)
								.always(function() {
									delete self.mime;
									delete self.prefix;
									delete self.nextAction;
									delete self.data;
								});
							fm.trigger('unselectfiles', { files: [ file.hash ] });
						},
						reqOpen = null,
						dialogs = fm.getUI().children('.' + self.dialogClass + ':visible');
						if (dialogNode.is(':hidden')) {
							dialogs = dialogs.add(dialogNode);
						}
						dialogs.removeClass(clsEditing).fadeOut();
					
					fm.enable();
					
					if (fm.searchStatus.state < 2 && phash !== fm.cwd().hash) {
						reqOpen = fm.exec('open', [phash], {thash: phash});
					}
					
					jQuery.when([reqOpen]).done(function() {
						reqOpen? fm.one('cwdrender', make) : make();
					}).fail(fail);
				},
				changed = function() {
					var dfd = jQuery.Deferred(),
						res, tm;
					if (!_loaded) {
						return dfd.resolve(false);
					}
					ta.editor && ta.editor.save(ta[0], ta.editor.instance);
					res = getContent();
					if (res && res.promise) {
						tm = setTimeout(function() {
							fm.notify({
								type : 'chkcontent',
								cnt : 1,
								hideCnt: true
							});
						}, 100);
						res.always(function() {
							tm && clearTimeout(tm);
							fm.notify({ type : 'chkcontent', cnt: -1 });
						}).done(function(d) {
							dfd.resolve(old !== d);
						}).fail(function(err) {
							dfd.resolve(err || true);
						});
					} else {
						dfd.resolve(old !== res);
					}
					return dfd;
				},
				opts = {
					title   : fm.escape(file.name),
					width   : getDlgWidth(),
					buttons : {},
					cssClass  : clsEditing,
					maxWidth  : 'window',
					maxHeight : 'window',
					allowMinimize : true,
					allowMaximize : true,
					openMaximized : editorMaximized() || (editor && editor.info && editor.info.openMaximized),
					btnHoverFocus : false,
					closeOnEscape : false,
					propagationEvents : ['mousemove', 'mouseup', 'click'],
					minimize : function() {
						var conf;
						if (ta.editor && dialogNode.closest('.ui-dialog').is(':hidden')) {
							conf = ta.editor.confObj;
							if (conf.info && conf.info.syncInterval) {
								fileSync(file.hash);
							}
						}
					},
					close   : function() {
						var close = function() {
								var conf;
								dfrd.resolve();
								if (ta.editor) {
									ta.editor.close(ta[0], ta.editor.instance);
									conf = ta.editor.confObj;
									if (conf.info && conf.info.syncInterval) {
										fileSync(file.hash);
									}
								}
								ta.elfinderdialog('destroy');
							},
							onlySaveAs = (typeof saveAsFile.name !== 'undefined'),
							accept = onlySaveAs? {
								label    : 'btnSaveAs',
								callback : function() {
									requestAnimationFrame(saveAs);
								}
							} : {
								label    : 'btnSaveClose',
								callback : function() {
									save().done(function() {
										close();
									});
								}
							};
						changed().done(function(change) {
							var msgs = ['confirmNotSave'];
							if (change) {
								if (typeof change === 'string') {
									msgs.unshift(change);
								}
								fm.confirm({
									title  : self.title,
									text   : msgs,
									accept : accept,
									cancel : {
										label    : 'btnClose',
										callback : close
									},
									buttons : onlySaveAs? null : [{
										label    : 'btnSaveAs',
										callback : function() {
											requestAnimationFrame(saveAs);
										}
									}]
								});
							} else {
								close();
							}
						});
					},
					open    : function() {
						var loadRes, conf, interval;
						ta.initEditArea.call(ta, id, file, content, fm);
						if (ta.editor) {
							loadRes = ta.editor.load(ta[0]) || null;
							if (loadRes && loadRes.done) {
								loadRes.always(function() {
									_loaded = true;
								}).done(function(instance) {
									ta.editor.instance = instance;
									ta.editor.focus(ta[0], ta.editor.instance);
									setOld(getContent());
									requestAnimationFrame(function() {
										dialogNode.trigger('resize');
									});
								}).fail(function(error) {
									error && fm.error(error);
									ta.elfinderdialog('destroy');
									return;
								});
							} else {
								_loaded = true;
								if (loadRes && (typeof loadRes === 'string' || Array.isArray(loadRes))) {
									fm.error(loadRes);
									ta.elfinderdialog('destroy');
									return;
								}
								ta.editor.instance = loadRes;
								ta.editor.focus(ta[0], ta.editor.instance);
								setOld(getContent());
								requestAnimationFrame(function() {
									dialogNode.trigger('resize');
								});
							}
							conf = ta.editor.confObj;
							if (conf.info && conf.info.syncInterval) {
								if (interval = parseInt(conf.info.syncInterval)) {
									setTimeout(function() {
										autoSync(interval);
									}, interval);
								}
							}
						} else {
							_loaded = true;
							setOld(getContent());
						}
					},
					resize : function(e, data) {
						ta.editor && ta.editor.resize(ta[0], ta.editor.instance, e, data || {});
					}
				},
				getContent = function() {
					return ta.getContent.call(ta, ta[0]);
				},
				setOld = function(res) {
					if (res && res.promise) {
						res.done(function(d) {
							old = d;
						});
					} else {
						old = res;
					}
				},
				autoSync = function(interval) {
					if (dialogNode.is(':visible')) {
						fileSync(file.hash);
						setTimeout(function() {
							autoSync(interval);
						}, interval);
					}
				},
				saveAsFile = {},
				ta, old, dialogNode, selEncoding, extEditor, maxW, syncInterval;
				
			if (editor) {
				if (editor.html) {
					ta = jQuery(editor.html);
				}
				extEditor = {
					init     : editor.init || null,
					load     : editor.load,
					getContent : editor.getContent || null,
					save     : editor.save,
					beforeclose : typeof editor.beforeclose == 'function' ? editor.beforeclose : void 0,
					close    : typeof editor.close == 'function' ? editor.close : function() {},
					focus    : typeof editor.focus == 'function' ? editor.focus : function() {},
					resize   : typeof editor.resize == 'function' ? editor.resize : function() {},
					instance : null,
					doSave   : saveon,
					doCancel : cancel,
					doClose  : savecl,
					file     : file,
					fm       : fm,
					confObj  : editor,
					trigger  : function(evName, data) {
						fm.trigger('editEditor' + evName, Object.assign({}, editor.info || {}, data));
					}
				};
			}
			
			if (!ta) {
				if (!fm.mimeIsText(file.mime)) {
					return dfrd.reject('errEditorNotFound');
				}
				(function() {
					var stateChange = function() {
							if (selEncoding) {
								changed().done(function(change) {
									if (change) {
										selEncoding.attr('title', fm.i18n('saveAsEncoding')).addClass('elfinder-edit-changed');
									} else {
										selEncoding.attr('title', fm.i18n('openAsEncoding')).removeClass('elfinder-edit-changed');
									}
								});
							}
						};
						
					ta = jQuery('<textarea class="elfinder-file-edit" rows="20" id="'+id+'-ta"></textarea>')
						.on('input propertychange', stateChange);
					
					if (!ta.editor || !ta.editor.info || ta.editor.info.useTextAreaEvent) {
						ta.on('keydown', function(e) {
							var code = e.keyCode,
								value, start;
							
							e.stopPropagation();
							if (code == jQuery.ui.keyCode.TAB) {
								e.preventDefault();
								// insert tab on tab press
								if (this.setSelectionRange) {
									value = this.value;
									start = this.selectionStart;
									this.value = value.substr(0, start) + "\t" + value.substr(this.selectionEnd);
									start += 1;
									this.setSelectionRange(start, start);
								}
							}
							
							if (e.ctrlKey || e.metaKey) {
								// close on ctrl+w/q
								if (code == 'Q'.charCodeAt(0) || code == 'W'.charCodeAt(0)) {
									e.preventDefault();
									cancel();
								}
								if (code == 'S'.charCodeAt(0)) {
									e.preventDefault();
									saveon();
								}
							}
							
						})
						.on('mouseenter', function(){this.focus();});
					}

					ta.initEditArea = function(id, file, content) {
						var heads = (encoding && encoding !== 'unknown')? [{value: encoding}] : [],
							wfake = jQuery('<select/>').hide(),
							setSelW = function(init) {
								init && wfake.appendTo(selEncoding.parent());
								wfake.empty().append(jQuery('<option/>').text(selEncoding.val()));
								selEncoding.width(wfake.width());
							};
						// ta.hide() for performance tune. Need ta.show() in `load()` if use textarea node.
						ta.hide().val(content);
						if (content === '' || ! encoding || encoding !== 'UTF-8') {
							heads.push({value: 'UTF-8'});
						}
						selEncoding = getEncSelect(heads).on('touchstart', function(e) {
							// for touch punch event handler
							e.stopPropagation();
						}).on('change', function() {
							// reload to change encoding if not edited
							changed().done(function(change) {
								if (! change && getContent() !== '') {
									cancel();
									edit(file, selEncoding.val(), editor).fail(function(err) { err && fm.error(err); });
								}
							});
							setSelW();
						}).on('mouseover', stateChange);
						ta.parent().next().prepend(jQuery('<div class="ui-dialog-buttonset elfinder-edit-extras"/>').append(selEncoding));
						setSelW(true);
					};
				})();
			}
			
			ta.data('hash', file.hash);
			
			if (extEditor) {
				ta.editor = extEditor;
				
				if (typeof extEditor.beforeclose === 'function') {
					opts.beforeclose = function() {
						return extEditor.beforeclose(ta[0], extEditor.instance);
					};
				}
				
				if (typeof extEditor.init === 'function') {
					ta.initEditArea = extEditor.init;
				}
				
				if (typeof extEditor.getContent === 'function') {
					ta.getContent = extEditor.getContent;
				}
			}
			
			if (! ta.initEditArea) {
				ta.initEditArea = function() {};
			}
			
			if (! ta.getContent) {
				ta.getContent = function() {
					return rtrim(ta.val());
				};
			}
			
			if (!editor || !editor.info || !editor.info.preventGet) {
				opts.buttons[fm.i18n('btnSave')]      = saveon;
				opts.buttons[fm.i18n('btnSaveClose')] = savecl;
				opts.buttons[fm.i18n('btnSaveAs')]    = saveAs;
				opts.buttons[fm.i18n('btnCancel')]    = cancel;
			}
			
			if (editor && typeof editor.prepare === 'function') {
				editor.prepare(ta, opts, file);
			}
			
			dialogNode = self.fmDialog(ta, opts)
				.attr('id', id)
				.on('keydown keyup keypress', function(e) {
					e.stopPropagation();
				})
				.css({ overflow: 'hidden', minHeight: '7em' })
				.addClass('elfinder-edit-editor')
				.closest('.ui-dialog')
				.on('changeType', function(e, data) {
					if (data.extention && data.mime) {
						var ext = data.extention,
							mime = data.mime,
							btnSet = jQuery(this).children('.ui-dialog-buttonpane').children('.ui-dialog-buttonset');
						btnSet.children('.elfinder-btncnt-0,.elfinder-btncnt-1').hide();
						saveAsFile.name = fm.splitFileExtention(file.name)[0] + '.' + data.extention;
						saveAsFile.mime = data.mime;
						if (!data.keepEditor) {
							btnSet.children('.elfinder-btncnt-2').trigger('click');
						}
					}
				});
			
			// care to viewport scale change with mobile devices
			maxW = (fm.options.dialogContained? elfNode : jQuery(window)).width();
			(dialogNode.width() > maxW) && dialogNode.width(maxW);
			
			return dfrd.promise();
		},
		
		/**
		 * Get file content and
		 * open dialog with textarea to edit file content
		 *
		 * @param  String  file hash
		 * @return jQuery.Deferred
		 **/
		edit = function(file, convert, editor) {
			var hash   = file.hash,
				opts   = fm.options,
				dfrd   = jQuery.Deferred(), 
				id     = 'edit-'+fm.namespace+'-'+file.hash,
				d      = fm.getUI().find('#'+id),
				conv   = !convert? 0 : convert,
				req, error, res;
			
			
			if (d.length) {
				d.elfinderdialog('toTop');
				return dfrd.resolve();
			}
			
			if (!file.read || (!file.write && (!editor.info || !editor.info.converter))) {
				error = ['errOpen', file.name, 'errPerm'];
				return dfrd.reject(error);
			}
			
			if (editor && editor.info) {
				if (typeof editor.info.edit === 'function') {
					res = editor.info.edit.call(fm, file, editor);
					if (res.promise) {
						res.done(function() {
							dfrd.resolve();
						}).fail(function(error) {
							dfrd.reject(error);
						});
					} else {
						res? dfrd.resolve() : dfrd.reject();
					}
					return dfrd;
				}

				if (editor.info.urlAsContent || editor.info.preventGet || editor.info.noContent) {
					req = jQuery.Deferred();
					if (editor.info.urlAsContent) {
						fm.url(hash, { async: true, onetime: true, temporary: true }).done(function(url) {
							req.resolve({content: url});
						});
					} else {
						req.resolve({});
					}
				} else {
					req = fm.request({
						data           : {cmd : 'get', target : hash, conv : conv, _t : file.ts},
						options        : {type: 'get', cache : true},
						notify         : {type : 'file', cnt : 1},
						preventDefault : true
					});
				}

				req.done(function(data) {
					var selEncoding, reg, m, res;
					if (data.doconv) {
						fm.confirm({
							title  : self.title,
							text   : data.doconv === 'unknown'? 'confirmNonUTF8' : 'confirmConvUTF8',
							accept : {
								label    : 'btnConv',
								callback : function() {  
									dfrd = edit(file, selEncoding.val(), editor);
								}
							},
							cancel : {
								label    : 'btnCancel',
								callback : function() { dfrd.reject(); }
							},
							optionsCallback : function(options) {
								options.create = function() {
									var base = jQuery('<div class="elfinder-dialog-confirm-encoding"/>'),
										head = {value: data.doconv},
										detected;
									
									if (data.doconv === 'unknown') {
										head.caption = '-';
									}
									selEncoding = getEncSelect([head]);
									jQuery(this).next().find('.ui-dialog-buttonset')
										.prepend(base.append(jQuery('<label>'+fm.i18n('encoding')+' </label>').append(selEncoding)));
								};
							}
						});
					} else {
						if ((!editor || !editor.info || !editor.info.preventGet) && fm.mimeIsText(file.mime)) {
							reg = new RegExp('^(data:'+file.mime.replace(/([.+])/g, '\\$1')+';base64,)', 'i');
							if (!editor.info.dataScheme) {
								if (window.atob && (m = data.content.match(reg))) {
									data.content = atob(data.content.substr(m[1].length));
								}
							} else {
								if (window.btoa && !data.content.match(reg)) {
									data.content = 'data:'+file.mime+';base64,'+btoa(data.content);
								}
							}
						}
						dialog(id, file, data.content, data.encoding, editor)
							.done(function(data) {
								dfrd.resolve(data);
							})
							.progress(function(encoding, newHash, data, saveDfd) {
								var ta = this;
								if (newHash) {
									hash = newHash;
								}
								fm.request({
									options : {type : 'post'},
									data : {
										cmd     : 'put',
										target  : hash,
										encoding : encoding || data.encoding,
										content : data
									},
									notify : {type : 'save', cnt : 1},
									syncOnFail : true,
									preventFail : true,
									navigate : {
										target : 'changed',
										toast : {
											inbuffer : {msg: fm.i18n(['complete', fm.i18n('btnSave')])}
										}
									}
								})
								.fail(function(error) {
									dfrd.reject(error);
									saveDfd.reject();
								})
								.done(function(data) {
									requestAnimationFrame(function(){
										ta.trigger('focus');
										ta.editor && ta.editor.focus(ta[0], ta.editor.instance);
									});
									saveDfd.resolve();
								});
							})
							.fail(function(error) {
								dfrd.reject(error);
							});
					}
				})
				.fail(function(error) {
					var err = fm.parseError(error);
					err = Array.isArray(err)? err[0] : err;
					(err !== 'errConvUTF8') && fm.sync();
					dfrd.reject(error);
				});
			}

			return dfrd.promise();
		},
		
		/**
		 * Current editors of selected files
		 * 
		 * @type Object
		 */
		editors = {},
		
		/**
		 * Fallback editor (Simple text editor)
		 * 
		 * @type Object
		 */
		fallbackEditor = {
			// Simple Text (basic textarea editor)
			info : {
				id : 'textarea',
				name : 'TextArea',
				useTextAreaEvent : true
			},
			load : function(textarea) {
				// trigger event 'editEditorPrepare'
				this.trigger('Prepare', {
					node: textarea,
					editorObj: void(0),
					instance: void(0),
					opts: {}
				});
				textarea.setSelectionRange && textarea.setSelectionRange(0, 0);
				jQuery(textarea).trigger('focus').show();
			},
			save : function(){}
		},

		/**
		 * Set current editors
		 * 
		 * @param  Object  file object
		 * @param  Number  cnt  count of selected items
		 * @return Void
		 */
		setEditors = function(file, cnt) {
			var mimeMatch = function(fileMime, editorMimes){
					if (!editorMimes) {
						return fm.mimeIsText(fileMime);
					} else {
						if (editorMimes[0] === '*' || jQuery.inArray(fileMime, editorMimes) !== -1) {
							return true;
						}
						var i, l;
						l = editorMimes.length;
						for (i = 0; i < l; i++) {
							if (fileMime.indexOf(editorMimes[i]) === 0) {
								return true;
							}
						}
						return false;
					}
				},
				extMatch = function(fileName, editorExts){
					if (!editorExts || !editorExts.length) {
						return true;
					}
					var ext = fileName.replace(/^.+\.([^.]+)|(.+)$/, '$1$2').toLowerCase(),
					i, l;
					l = editorExts.length;
					for (i = 0; i < l; i++) {
						if (ext === editorExts[i].toLowerCase()) {
							return true;
						}
					}
					return false;
				},
				optEditors = self.options.editors || [],
				cwdWrite = fm.cwd().write;
			
			stored = fm.storage('storedEditors') || {};
			editors = {};
			if (!optEditors.length) {
				optEditors = [fallbackEditor];
			}
			jQuery.each(optEditors, function(i, editor) {
				var name;
				if ((cnt === 1 || !editor.info.single)
						&& ((!editor.info || !editor.info.converter)? file.write : cwdWrite)
						&& (file.size > 0 || (!editor.info.converter && (editor.info.canMakeEmpty || (editor.info.canMakeEmpty !== false && fm.mimeIsText(file.mime)))))
						&& (!editor.info.maxSize || file.size <= editor.info.maxSize)
						&& mimeMatch(file.mime, editor.mimes || null)
						&& extMatch(file.name, editor.exts || null)
						&& typeof editor.load == 'function'
						&& typeof editor.save == 'function') {
					
					name = editor.info.name? editor.info.name : ('Code Editor');
					editor.id = editor.info.id? editor.info.id : ('editor' + i),
					editor.name = name;
					editor.i18n = fm.i18n(name);
					editors[editor.id] = editor;
				}
			});
			return Object.keys(editors).length? true : false;
		},
		store = function(mime, editor) {
			if (mime && editor) {
				if (!jQuery.isPlainObject(stored)) {
					stored = {};
				}
				stored[mime] = editor.id;
				fm.storage('storedEditors', stored);
				fm.trigger('selectfiles', {files : fm.selected()});
			}
		},
		useStoredEditor = function() {
			var d = fm.storage('useStoredEditor');
			return d? (d > 0) : self.options.useStoredEditor;
		},
		editorMaximized = function() {
			var d = fm.storage('editorMaximized');
			return d? (d > 0) : self.options.editorMaximized;
		},
		getSubMenuRaw = function(files, callback) {
			var subMenuRaw = [];
			jQuery.each(editors, function(id, ed) {
				subMenuRaw.push(
					{
						label    : fm.escape(ed.i18n),
						icon     : ed.info && ed.info.icon? ed.info.icon : 'edit',
						options  : { iconImg: ed.info && ed.info.iconImg? fm.baseUrl + ed.info.iconImg : void(0) },
						callback : function() {
							store(files[0].mime, ed);
							callback && callback.call(ed);
						}
					}		
				);
			});
			return subMenuRaw;
		},
		getStoreId = function(name) {
			// for compatibility to previous version
			return name.toLowerCase().replace(/ +/g, '');
		},
		getStoredEditor = function(mime) {
			var name = stored[mime];
			return name && Object.keys(editors).length? editors[getStoreId(name)] : void(0);
		},
		infoRequest = function() {

		},
		stored;
	
	
	this.shortcuts = [{
		pattern     : 'ctrl+e'
	}];
	
	this.init = function() {
		var self = this,
			fm   = this.fm,
			opts = this.options,
			cmdChecks = [],
			ccData, dfd;
		
		this.onlyMimes = this.options.mimes || [];
		
		fm.one('open', function() {
			// editors setup
			if (opts.editors && Array.isArray(opts.editors)) {
				fm.trigger('canMakeEmptyFile', {mimes: Object.keys(fm.storage('mkfileTextMimes') || {}).concat(opts.makeTextMimes || ['text/plain'])});
				jQuery.each(opts.editors, function(i, editor) {
					if (editor.info && editor.info.cmdCheck) {
						cmdChecks.push(editor.info.cmdCheck);
					}
				});
				if (cmdChecks.length) {
					if (fm.api >= 2.1030) {
						dfd = fm.request({
							data : {
								cmd: 'editor',
								name: cmdChecks,
								method: 'enabled'
							},
							preventDefault : true
						}).done(function(d) {
							ccData = d;
						}).fail(function() {
							ccData = {};
						});
					} else {
						ccData = {};
						dfd = jQuery.Deferred().resolve();
					}
				} else {
					dfd = jQuery.Deferred().resolve();
				}
				
				dfd.always(function() {
					if (ccData) {
						opts.editors = jQuery.grep(opts.editors, function(e) {
							if (e.info && e.info.cmdCheck) {
								return ccData[e.info.cmdCheck]? true : false;
							} else {
								return true;
							}
						});
					}
					jQuery.each(opts.editors, function(i, editor) {
						if (editor.setup && typeof editor.setup === 'function') {
							editor.setup.call(editor, opts, fm);
						}
						if (!editor.disabled) {
							if (editor.mimes && Array.isArray(editor.mimes)) {
								mimesSingle = mimesSingle.concat(editor.mimes);
								if (!editor.info || !editor.info.single) {
									mimes = mimes.concat(editor.mimes);
								}
							}
							if (!allowAll && editor.mimes && editor.mimes[0] === '*') {
								allowAll = true;
							}
							if (!editor.info) {
								editor.info = {};
							}
							if (editor.info.integrate) {
								fm.trigger('helpIntegration', Object.assign({cmd: 'edit'}, editor.info.integrate));
							}
							if (editor.info.canMakeEmpty) {
								fm.trigger('canMakeEmptyFile', {mimes: editor.mimes});
							}
						}
					});
					
					mimesSingle = (jQuery.uniqueSort || jQuery.unique)(mimesSingle);
					mimes = (jQuery.uniqueSort || jQuery.unique)(mimes);
					
					opts.editors = jQuery.grep(opts.editors, function(e) {
						return e.disabled? false : true;
					});
				});
			}
		})
		.bind('select', function() {
			editors = null;
		})
		.bind('contextmenucreate', function(e) {
			var file, editor,
				single = function(editor) {
					var title = self.title;
					fm.one('contextmenucreatedone', function() {
						self.title = title;
					});
					self.title = fm.escape(editor.i18n);
					if (editor.info && editor.info.iconImg) {
						self.contextmenuOpts = {
							iconImg: fm.baseUrl + editor.info.iconImg
						};
					}
					delete self.variants;
				};
			
			self.contextmenuOpts = void(0);
			if (e.data.type === 'files' && self.enabled()) {
				file = fm.file(e.data.targets[0]);
				if (setEditors(file, e.data.targets.length)) {
					if (Object.keys(editors).length > 1) {
						if (!useStoredEditor() || !(editor = getStoredEditor(file.mime))) {
							delete self.extra;
							self.variants = [];
							jQuery.each(editors, function(id, editor) {
								self.variants.push([{ editor: editor }, editor.i18n, editor.info && editor.info.iconImg? fm.baseUrl + editor.info.iconImg : 'edit']);
							});
						} else {
							single(editor);
							self.extra = {
								icon: 'menu',
								node: jQuery('<span/>')
									.attr({title: fm.i18n('select')})
									.on('click touchstart', function(e){
										if (e.type === 'touchstart' && e.originalEvent.touches.length > 1) {
											return;
										}
										var node = jQuery(this);
										e.stopPropagation();
										e.preventDefault();
										fm.trigger('contextmenu', {
											raw: getSubMenuRaw(fm.selectedFiles(), function() {
												var hashes = fm.selected();
												fm.exec('edit', hashes, {editor: this});
												fm.trigger('selectfiles', {files : hashes});
											}),
											x: node.offset().left,
											y: node.offset().top
										});
									})
							};
						}
					} else {
						single(editors[Object.keys(editors)[0]]);
						delete self.extra;
					}
				}
			}
		})
		.bind('canMakeEmptyFile', function(e) {
			if (e.data && e.data.resetTexts) {
				var defs = fm.arrayFlip(self.options.makeTextMimes || ['text/plain']),
					hides = fm.storage('mkfileHides') || {};

				jQuery.each((fm.storage('mkfileTextMimes') || {}), function(mime, type) {
					if (!defs[mime]) {
						delete fm.mimesCanMakeEmpty[mime];
						delete hides[mime];
					}
				});
				fm.storage('mkfileTextMimes', null);
				if (Object.keys(hides).length) {
					fm.storage('mkfileHides', hides);
				} else {
					fm.storage('mkfileHides', null);
				}
			}
		});
	};
	
	this.getstate = function(select) {
		var sel = this.files(select),
			cnt = sel.length;

		return cnt && filter(sel).length == cnt ? 0 : -1;
	};
	
	this.exec = function(select, opts) {
		var fm    = this.fm, 
			files = filter(this.files(select)),
			hashes = jQuery.map(files, function(f) { return f.hash; }),
			list  = [],
			editor = opts && opts.editor? opts.editor : null,
			node = jQuery(opts && opts._currentNode? opts._currentNode : fm.cwdHash2Elm(hashes[0])),
			getEditor = function() {
				var dfd = jQuery.Deferred(),
					storedId;
				
				if (!editor && Object.keys(editors).length > 1) {
					if (useStoredEditor() && (editor = getStoredEditor(files[0].mime))) {
						return dfd.resolve(editor);
					}
					fm.trigger('contextmenu', {
						raw: getSubMenuRaw(files, function() {
							dfd.resolve(this);
						}),
						x: node.offset().left,
						y: node.offset().top + 22,
						opened: function() {
							fm.one('closecontextmenu',function() {
								requestAnimationFrame(function() {
									if (dfd.state() === 'pending') {
										dfd.reject();
									}
								});
							});
						}
					});
					
					fm.trigger('selectfiles', {files : hashes});
					
					return dfd;
				} else {
					Object.keys(editors).length > 1 && editor && store(files[0].mime, editor);
					return dfd.resolve(editor? editor : (Object.keys(editors).length? editors[Object.keys(editors)[0]] : null));
				}
			},
			dfrd = jQuery.Deferred(),
			file;

		if (editors === null) {
			setEditors(files[0], hashes.length);
		}
		
		if (!node.length) {
			node = fm.getUI('cwd');
		}
		
		getEditor().done(function(editor) {
			while ((file = files.shift())) {
				list.push(edit(file, void(0), editor).fail(function(error) {
					error && fm.error(error);
				}));
			}
			
			if (list.length) { 
				jQuery.when.apply(null, list).done(function() {
					dfrd.resolve();
				}).fail(function() {
					dfrd.reject();
				});
			} else {
				dfrd.reject();
			}
		}).fail(function() {
			dfrd.reject();
		});
		
		return dfrd;
	};

};


/*
 * File: /js/commands/empty.js
 */

/**
 * @class elFinder command "empty".
 * Empty the folder
 *
 * @type  elFinder.command
 * @author  Naoki Sawada
 */
elFinder.prototype.commands.empty = function() {
		var self, fm,
		selFiles = function(select) {
			var sel = self.files(select);
			if (!sel.length) {
				sel = [ fm.cwd() ];
			}
			return sel;
		};
	
	this.linkedCmds = ['rm'];
	
	this.init = function() {
		// lazy assign to make possible to become superclass
		self = this;
		fm = this.fm;
	};

	this.getstate = function(select) {
		var sel = selFiles(select),
			cnt;
		
		cnt = sel.length;
		return jQuery.grep(sel, function(f) { return f.read && f.write && f.mime === 'directory' ? true : false; }).length == cnt ? 0 : -1;
	};
	
	this.exec = function(hashes) {
		var dirs = selFiles(hashes),
			cnt  = dirs.length,
			dfrd = jQuery.Deferred()
				.done(function() {
					var data = {changed: {}};
					fm.toast({msg: fm.i18n(['"'+success.join('", ')+'"', 'complete', fm.i18n('cmdempty')])});
					jQuery.each(dirs, function(i, dir) {
						data.changed[dir.hash] = dir;
					});
					fm.change(data);
				})
				.always(function() {
					var cwd = fm.cwd().hash;
					fm.trigger('selectfiles', {files: jQuery.map(dirs, function(d) { return cwd === d.phash? d.hash : null; })});
				}),
			success = [],
			done = function(res) {
				if (typeof res === 'number') {
					success.push(dirs[res].name);
					delete dirs[res].dirs;
				} else {
					res && fm.error(res);
				}
				(--cnt < 1) && dfrd[success.length? 'resolve' : 'reject']();
			};

		jQuery.each(dirs, function(i, dir) {
			var tm;
			if (!(dir.write && dir.mime === 'directory')) {
				done(['errEmpty', dir.name, 'errPerm']);
				return null;
			}
			if (!fm.isCommandEnabled('rm', dir.hash)) {
				done(['errCmdNoSupport', '"rm"']);
				return null;
			}
			tm = setTimeout(function() {
				fm.notify({type : 'search', cnt : 1, hideCnt : cnt > 1? false : true});
			}, fm.notifyDelay);
			fm.request({
				data : {cmd  : 'open', target : dir.hash},
				preventDefault : true,
				asNotOpen : true
			}).done(function(data) {
				var targets = [];
				tm && clearTimeout(tm);
				if (fm.ui.notify.children('.elfinder-notify-search').length) {
					fm.notify({type : 'search', cnt : -1, hideCnt : cnt > 1? false : true});
				}
				if (data && data.files && data.files.length) {
					if (data.files.length > fm.maxTargets) {
						done(['errEmpty', dir.name, 'errMaxTargets', fm.maxTargets]);
					} else {
						fm.updateCache(data);
						jQuery.each(data.files, function(i, f) {
							if (!f.write || f.locked) {
								done(['errEmpty', dir.name, 'errRm', f.name, 'errPerm']);
								targets = [];
								return false;
							}
							targets.push(f.hash);
						});
						if (targets.length) {
							fm.exec('rm', targets, { _userAction : true, addTexts : [ fm.i18n('folderToEmpty', dir.name) ] })
							.fail(function(error) {
								fm.trigger('unselectfiles', {files: fm.selected()});
								done(fm.parseError(error) || '');
							})
							.done(function() { done(i); });
						}
					}
				} else {
					fm.toast({ mode: 'warning', msg: fm.i18n('filderIsEmpty', dir.name)});
					done('');
				}
			}).fail(function(error) {
				done(fm.parseError(error) || '');
			});
		});
		
		return dfrd;
	};

};


/*
 * File: /js/commands/extract.js
 */

/**
 * @class  elFinder command "extract"
 * Extract files from archive
 *
 * @author Dmitry (dio) Levashov
 **/
elFinder.prototype.commands.extract = function() {
		var self    = this,
		fm      = self.fm,
		mimes   = [],
		filter  = function(files) {
			return jQuery.grep(files, function(file) { 
				return file.read && jQuery.inArray(file.mime, mimes) !== -1 ? true : false;
			});
		};
	
	this.variants = [];
	this.disableOnSearch = true;
	
	// Update mimes list on open/reload
	fm.bind('open reload', function() {
		mimes = fm.option('archivers')['extract'] || [];
		if (fm.api > 2) {
			self.variants = [[{makedir: true}, fm.i18n('cmdmkdir')], [{}, fm.i18n('btnCwd')]];
		} else {
			self.variants = [[{}, fm.i18n('btnCwd')]];
		}
		self.change();
	});
	
	this.getstate = function(select) {
		var sel = this.files(select),
			cnt = sel.length;
		
		return cnt && this.fm.cwd().write && filter(sel).length == cnt ? 0 : -1;
	};
	
	this.exec = function(hashes, opts) {
		var files    = this.files(hashes),
			dfrd     = jQuery.Deferred(),
			cnt      = files.length,
			makedir  = opts && opts.makedir ? 1 : 0,
			i, error,
			decision;

		var overwriteAll = false;
		var omitAll = false;
		var mkdirAll = 0;

		var names = jQuery.map(fm.files(hashes), function(file) { return file.name; });
		var map = {};
		jQuery.grep(fm.files(hashes), function(file) {
			map[file.name] = file;
			return false;
		});
		
		var decide = function(decision) {
			switch (decision) {
				case 'overwrite_all' :
					overwriteAll = true;
					break;
				case 'omit_all':
					omitAll = true;
					break;
			}
		};

		var unpack = function(file) {
			if (!(file.read && fm.file(file.phash).write)) {
				error = ['errExtract', file.name, 'errPerm'];
				fm.error(error);
				dfrd.reject(error);
			} else if (jQuery.inArray(file.mime, mimes) === -1) {
				error = ['errExtract', file.name, 'errNoArchive'];
				fm.error(error);
				dfrd.reject(error);
			} else {
				fm.request({
					data:{cmd:'extract', target:file.hash, makedir:makedir},
					notify:{type:'extract', cnt:1},
					syncOnFail:true,
					navigate:{
						toast : makedir? {
							incwd    : {msg: fm.i18n(['complete', fm.i18n('cmdextract')]), action: {cmd: 'open', msg: 'cmdopen'}},
							inbuffer : {msg: fm.i18n(['complete', fm.i18n('cmdextract')]), action: {cmd: 'open', msg: 'cmdopen'}}
						} : {
							inbuffer : {msg: fm.i18n(['complete', fm.i18n('cmdextract')])}
						}
					}
				})
				.fail(function (error) {
					if (dfrd.state() != 'rejected') {
						dfrd.reject(error);
					}
				})
				.done(function () {
				});
			}
		};
		
		var confirm = function(files, index) {
			var file = files[index],
			name = fm.splitFileExtention(file.name)[0],
			existed = (jQuery.inArray(name, names) >= 0),
			next = function(){
				if((index+1) < cnt) {
					confirm(files, index+1);
				} else {
					dfrd.resolve();
				}
			};
			if (!makedir && existed && map[name].mime != 'directory') {
				fm.confirm(
					{
						title : fm.i18n('ntfextract'),
						text  : ['errExists', name, 'confirmRepl'],
						accept:{
							label : 'btnYes',
							callback:function (all) {
								decision = all ? 'overwrite_all' : 'overwrite';
								decide(decision);
								if(!overwriteAll && !omitAll) {
									if('overwrite' == decision) {
										unpack(file);
									}
									if((index+1) < cnt) {
										confirm(files, index+1);
									} else {
										dfrd.resolve();
									}
								} else if(overwriteAll) {
									for (i = index; i < cnt; i++) {
										unpack(files[i]);
									}
									dfrd.resolve();
								}
							}
						},
						reject : {
							label : 'btnNo',
							callback:function (all) {
								decision = all ? 'omit_all' : 'omit';
								decide(decision);
								if(!overwriteAll && !omitAll && (index+1) < cnt) {
									confirm(files, index+1);
								} else if (omitAll) {
									dfrd.resolve();
								}
							}
						},
						cancel : {
							label : 'btnCancel',
							callback:function () {
								dfrd.resolve();
							}
						},
						all : ((index+1) < cnt)
					}
				);
			} else if (!makedir) {
				if (mkdirAll == 0) {
					fm.confirm({
						title : fm.i18n('cmdextract'),
						text  : [fm.i18n('cmdextract')+' "'+file.name+'"', 'confirmRepl'],
						accept:{
							label : 'btnYes',
							callback:function (all) {
								all && (mkdirAll = 1);
								unpack(file);
								next();
							}
						},
						reject : {
							label : 'btnNo',
							callback:function (all) {
								all && (mkdirAll = -1);
								next();
							}
						},
						cancel : {
							label : 'btnCancel',
							callback:function () {
								dfrd.resolve();
							}
						},
						all : ((index+1) < cnt)
					});
				} else {
					(mkdirAll > 0) && unpack(file);
					next();
				}
			} else {
				unpack(file);
				next();
			}
		};
		
		if (!(this.enabled() && cnt && mimes.length)) {
			return dfrd.reject();
		}
		
		if(cnt > 0) {
			confirm(files, 0);
		}

		return dfrd;
	};

};


/*
 * File: /js/commands/forward.js
 */

/**
 * @class  elFinder command "forward"
 * Open next visited folder
 *
 * @author Dmitry (dio) Levashov
 **/
(elFinder.prototype.commands.forward = function() {
		this.alwaysEnabled = true;
	this.updateOnSelect = true;
	this.shortcuts = [{
		pattern     : 'ctrl+right'
	}];
	
	this.getstate = function() {
		return this.fm.history.canForward() ? 0 : -1;
	};
	
	this.exec = function() {
		return this.fm.history.forward();
	};
	
}).prototype = { forceLoad : true }; // this is required command


/*
 * File: /js/commands/fullscreen.js
 */

/**
 * @class  elFinder command "fullscreen"
 * elFinder node to full scrren mode
 *
 * @author Naoki Sawada
 **/

elFinder.prototype.commands.fullscreen = function() {
		var self   = this,
		fm     = this.fm,
		update = function(e, data) {
			e.preventDefault();
			e.stopPropagation();
			if (data && data.fullscreen) {
				self.update(void(0), (data.fullscreen === 'on'));
			}
		};

	this.alwaysEnabled  = true;
	this.updateOnSelect = false;
	this.syncTitleOnChange = true;
	this.value = false;

	this.options = {
		ui : 'fullscreenbutton'
	};

	this.getstate = function() {
		return 0;
	};
	
	this.exec = function() {
		var node = fm.getUI().get(0),
			full = (node === fm.toggleFullscreen(node));
		self.title = fm.i18n(full ? 'reinstate' : 'cmdfullscreen');
		self.update(void(0), full);
		return jQuery.Deferred().resolve();
	};
	
	fm.bind('init', function() {
		fm.getUI().off('resize.' + fm.namespace, update).on('resize.' + fm.namespace, update);
	});
};


/*
 * File: /js/commands/getfile.js
 */

/**
 * @class elFinder command "getfile". 
 * Return selected files info into outer callback.
 * For use elFinder with wysiwyg editors etc.
 *
 * @author Dmitry (dio) Levashov, dio@std42.ru
 **/
(elFinder.prototype.commands.getfile = function() {
		var self   = this,
		fm     = this.fm,
		filter = function(files) {
			var o = self.options;

			files = jQuery.grep(files, function(file) {
				return (file.mime != 'directory' || o.folders) && file.read ? true : false;
			});

			return o.multiple || files.length == 1 ? files : [];
		};
	
	this.alwaysEnabled = true;
	this.callback      = fm.options.getFileCallback;
	this._disabled     = typeof(this.callback) == 'function';
	
	this.getstate = function(select) {
		var sel = this.files(select),
			cnt = sel.length;
			
		return this.callback && cnt && filter(sel).length == cnt ? 0 : -1;
	};
	
	this.exec = function(hashes) {
		var fm    = this.fm,
			opts  = this.options,
			files = this.files(hashes),
			cnt   = files.length,
			url   = fm.option('url'),
			tmb   = fm.option('tmbUrl'),
			dfrd  = jQuery.Deferred()
				.done(function(data) {
					var res,
						done = function() {
							if (opts.oncomplete == 'close') {
								fm.hide();
							} else if (opts.oncomplete == 'destroy') {
								fm.destroy();
							}
						},
						fail = function(error) {
							if (opts.onerror == 'close') {
								fm.hide();
							} else if (opts.onerror == 'destroy') {
								fm.destroy();
							} else {
								error && fm.error(error);
							}
						};
					
					fm.trigger('getfile', {files : data});
					
					try {
						res = self.callback(data, fm);
					} catch(e) {
						fail(['Error in `getFileCallback`.', e.message]);
						return;
					}
					
					if (typeof res === 'object' && typeof res.done === 'function') {
						res.done(done).fail(fail);
					} else {
						done();
					}
				}),
			result = function(file) {
				return opts.onlyURL
					? opts.multiple ? jQuery.map(files, function(f) { return f.url; }) : files[0].url
					: opts.multiple ? files : files[0];
			},
			req = [], 
			i, file, dim;

		for (i = 0; i < cnt; i++) {
			file = files[i];
			if (file.mime == 'directory' && !opts.folders) {
				return dfrd.reject();
			}
			file.baseUrl = url;
			if (file.url == '1') {
				req.push(fm.request({
					data : {cmd : 'url', target : file.hash},
					notify : {type : 'url', cnt : 1, hideCnt : true},
					preventDefault : true
				})
				.done(function(data) {
					if (data.url) {
						var rfile = fm.file(this.hash);
						rfile.url = this.url = data.url;
					}
				}.bind(file)));
			} else {
				file.url = fm.url(file.hash);
			}
			if (! opts.onlyURL) {
				if (opts.getPath) {
					file.path = fm.path(file.hash);
					if (file.path === '' && file.phash) {
						// get parents
						(function() {
							var dfd  = jQuery.Deferred();
							req.push(dfd);
							fm.path(file.hash, false, {})
								.done(function(path) {
									file.path = path;
								})
								.fail(function() {
									file.path = '';
								})
								.always(function() {
									dfd.resolve();
								});
						})();
					}
				}
				if (file.tmb && file.tmb != 1) {
					file.tmb = tmb + file.tmb;
				}
				if (!file.width && !file.height) {
					if (file.dim) {
						dim = file.dim.split('x');
						file.width = dim[0];
						file.height = dim[1];
					} else if (opts.getImgSize && file.mime.indexOf('image') !== -1) {
						req.push(fm.request({
							data : {cmd : 'dim', target : file.hash},
							notify : {type : 'dim', cnt : 1, hideCnt : true},
							preventDefault : true
						})
						.done(function(data) {
							if (data.dim) {
								var dim = data.dim.split('x');
								var rfile = fm.file(this.hash);
								rfile.width = this.width = dim[0];
								rfile.height = this.height = dim[1];
							}
						}.bind(file)));
					}
				}
			}
		}
		
		if (req.length) {
			jQuery.when.apply(null, req).always(function() {
				dfrd.resolve(result(files));
			});
			return dfrd;
		}
		
		return dfrd.resolve(result(files));
	};

}).prototype = { forceLoad : true }; // this is required command


/*
 * File: /js/commands/help.js
 */

/**
 * @class  elFinder command "help"
 * "About" dialog
 *
 * @author Dmitry (dio) Levashov
 **/
(elFinder.prototype.commands.help = function() {
		var fm   = this.fm,
		self = this,
		linktpl = '<div class="elfinder-help-link"> <a href="{url}">{link}</a></div>',
		linktpltgt = '<div class="elfinder-help-link"> <a href="{url}" target="_blank">{link}</a></div>',
		atpl    = '<div class="elfinder-help-team"><div>{author}</div>{work}</div>',
		url     = /\{url\}/,
		link    = /\{link\}/,
		author  = /\{author\}/,
		work    = /\{work\}/,
		r       = 'replace',
		prim    = 'ui-priority-primary',
		sec     = 'ui-priority-secondary',
		lic     = 'elfinder-help-license',
		tab     = '<li class="' + fm.res('class', 'tabstab') + ' elfinder-help-tab-{id}"><a href="#'+fm.namespace+'-help-{id}" class="ui-tabs-anchor">{title}</a></li>',
		html    = ['<div class="ui-tabs ui-widget ui-widget-content ui-corner-all elfinder-help">', 
				'<ul class="ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-top">'],
		stpl    = '<div class="elfinder-help-shortcut"><div class="elfinder-help-shortcut-pattern">{pattern}</div> {descrip}</div>',
		sep     = '<div class="elfinder-help-separator"/>',
		selfUrl = jQuery('base').length? document.location.href.replace(/#.*$/, '') : '',
		clTabActive = fm.res('class', 'tabsactive'),
		
		getTheme = function() {
			var src;
			if (fm.theme && fm.theme.author) {
				src = atpl[r]('elfinder-help-team', 'elfinder-help-team elfinder-help-term-theme')[r](author, fm.i18n(fm.theme.author) + (fm.theme.email? ' &lt;'+fm.theme.email+'&gt;' : ''))[r](work, fm.i18n('theme') + ' ('+fm.i18n(fm.theme.name)+')');
			} else {
				src = '<div class="elfinder-help-team elfinder-help-term-theme" style="display:none"></div>';
			}
			return src;
		},

		about = function() {
			html.push('<div id="'+fm.namespace+'-help-about" class="ui-tabs-panel ui-widget-content ui-corner-bottom"><div class="elfinder-help-logo"/>');
			html.push('<h3>elFinder</h3>');
			html.push('<div class="'+prim+'">'+fm.i18n('webfm')+'</div>');
			html.push('<div class="'+sec+'">'+fm.i18n('ver')+': '+fm.version+'</div>');
			html.push('<div class="'+sec+'">'+fm.i18n('protocolver')+': <span class="apiver"></span></div>');
			html.push('<div class="'+sec+'">jQuery/jQuery UI: '+jQuery().jquery+'/'+jQuery.ui.version+'</div>');

			html.push(sep);
			
			html.push(linktpltgt[r](url, 'https://studio-42.github.io/elFinder/')[r](link, fm.i18n('homepage')));
			html.push(linktpltgt[r](url, 'https://github.com/Studio-42/elFinder/wiki')[r](link, fm.i18n('docs')));
			html.push(linktpltgt[r](url, 'https://github.com/Studio-42/elFinder')[r](link, fm.i18n('github')));
			//html.push(linktpltgt[r](url, 'http://twitter.com/elrte_elfinder')[r](link, fm.i18n('twitter')));
			
			html.push(sep);
			
			html.push('<div class="'+prim+'">'+fm.i18n('team')+'</div>');
			
			html.push(atpl[r](author, 'Dmitry "dio" Levashov &lt;dio@std42.ru&gt;')[r](work, fm.i18n('chiefdev')));
			html.push(atpl[r](author, 'Naoki Sawada &lt;hypweb+elfinder@gmail.com&gt;')[r](work, fm.i18n('developer')));
			html.push(atpl[r](author, 'Troex Nevelin &lt;troex@fury.scancode.ru&gt;')[r](work, fm.i18n('maintainer')));
			html.push(atpl[r](author, 'Alexey Sukhotin &lt;strogg@yandex.ru&gt;')[r](work, fm.i18n('contributor')));
			
			if (fm.i18[fm.lang].translator) {
				jQuery.each(fm.i18[fm.lang].translator.split(', '), function() {
					html.push(atpl[r](author, jQuery.trim(this))[r](work, fm.i18n('translator')+' ('+fm.i18[fm.lang].language+')'));
				});	
			}
			
			html.push(getTheme());

			html.push(sep);
			html.push('<div class="'+lic+'">'+fm.i18n('icons')+': Pixelmixer, <a href="http://p.yusukekamiyamane.com" target="_blank">Fugue</a>, <a href="https://icons8.com" target="_blank">Icons8</a></div>');
			
			html.push(sep);
			html.push('<div class="'+lic+'">Licence: 3-clauses BSD Licence</div>');
			html.push('<div class="'+lic+'">Copyright © 2009-2019, Studio 42</div>');
			html.push('<div class="'+lic+'">„ …'+fm.i18n('dontforget')+' ”</div>');
			html.push('</div>');
		},
		shortcuts = function() {
			var sh = fm.shortcuts();
			// shortcuts tab
			html.push('<div id="'+fm.namespace+'-help-shortcuts" class="ui-tabs-panel ui-widget-content ui-corner-bottom">');
			
			if (sh.length) {
				html.push('<div class="ui-widget-content elfinder-help-shortcuts">');
				jQuery.each(sh, function(i, s) {
					html.push(stpl.replace(/\{pattern\}/, s[0]).replace(/\{descrip\}/, s[1]));
				});
			
				html.push('</div>');
			} else {
				html.push('<div class="elfinder-help-disabled">'+fm.i18n('shortcutsof')+'</div>');
			}
			
			
			html.push('</div>');
			
		},
		help = function() {
			// help tab
			html.push('<div id="'+fm.namespace+'-help-help" class="ui-tabs-panel ui-widget-content ui-corner-bottom">');
			html.push('<a href="https://github.com/Studio-42/elFinder/wiki" target="_blank" class="elfinder-dont-panic"><span>DON\'T PANIC</span></a>');
			html.push('</div>');
			// end help
		},
		useInteg = false,
		integrations = function() {
			useInteg = true;
			html.push('<div id="'+fm.namespace+'-help-integrations" class="ui-tabs-panel ui-widget-content ui-corner-bottom"/>');
		},
		useDebug = false,
		debug = function() {
			useDebug = true;
			// debug tab
			html.push('<div id="'+fm.namespace+'-help-debug" class="ui-tabs-panel ui-widget-content ui-corner-bottom">');
			html.push('<div class="ui-widget-content elfinder-help-debug"><ul></ul></div>');
			html.push('</div>');
			// end debug
		},
		debugRender = function() {
			var render = function(elm, obj) {
				jQuery.each(obj, function(k, v) {
					elm.append(jQuery('<dt/>').text(k));
					if (typeof v === 'undefined') {
						elm.append(jQuery('<dd/>').append(jQuery('<span/>').text('undfined')));
					} else if (typeof v === 'object' && !v) {
						elm.append(jQuery('<dd/>').append(jQuery('<span/>').text('null')));
					} else if (typeof v === 'object' && (jQuery.isPlainObject(v) || v.length)) {
						elm.append( jQuery('<dd/>').append(render(jQuery('<dl/>'), v)));
					} else {
						elm.append(jQuery('<dd/>').append(jQuery('<span/>').text((v && typeof v === 'object')? '[]' : (v? v : '""'))));
					}
				});
				return elm;
			},
			cnt = debugUL.children('li').length,
			targetL, target, tabId,
			info, lastUL, lastDIV;
			
			if (self.debug.options || self.debug.debug) {
				if (cnt >= 5) {
					lastUL = debugUL.children('li:last');
					lastDIV = debugDIV.children('div:last');
					if (lastDIV.is(':hidden')) {
						lastUL.remove();
						lastDIV.remove();
					} else {
						lastUL.prev().remove();
						lastDIV.prev().remove();
					}
				}
				
				tabId = fm.namespace + '-help-debug-' + (+new Date());
				targetL = jQuery('<li/>').html('<a href="'+selfUrl+'#'+tabId+'">'+self.debug.debug.cmd+'</a>').prependTo(debugUL);
				target = jQuery('<div id="'+tabId+'"/>').data('debug', self.debug);
				
				targetL.on('click.debugrender', function() {
					var debug = target.data('debug');
					target.removeData('debug');
					if (debug) {
						target.hide();
						if (debug.debug) {
							info = jQuery('<fieldset>').append(jQuery('<legend/>').text('debug'), render(jQuery('<dl/>'), debug.debug));
							target.append(info);
						}
						if (debug.options) {
							info = jQuery('<fieldset>').append(jQuery('<legend/>').text('options'), render(jQuery('<dl/>'), debug.options));
							target.append(info);
						}
						target.show();
					}
					targetL.off('click.debugrender');
				});
				
				debugUL.after(target);
				
				opened && debugDIV.tabs('refresh');
			}
		},
		content = '',
		opened, tabInteg, integDIV, tabDebug, debugDIV, debugUL;
	
	this.alwaysEnabled  = true;
	this.updateOnSelect = false;
	this.state = -1;
	
	this.shortcuts = [{
		pattern     : 'f1',
		description : this.title
	}];
	
	fm.bind('load', function() {
		var parts = self.options.view || ['about', 'shortcuts', 'help', 'integrations', 'debug'],
			i, helpSource, tabBase, tabNav, tabs, delta;
		
		// remove 'preference' tab, it moved to command 'preference'
		if ((i = jQuery.inArray('preference', parts)) !== -1) {
			parts.splice(i, 1);
		}
		
		// debug tab require jQueryUI Tabs Widget
		if (! jQuery.fn.tabs) {
			if ((i = jQuery.inArray(parts, 'debug')) !== -1) {
				parts.splice(i, 1);
			}
		}
		
		jQuery.each(parts, function(i, title) {
			html.push(tab[r](/\{id\}/g, title)[r](/\{title\}/, fm.i18n(title)));
		});
		
		html.push('</ul>');

		jQuery.inArray('about', parts) !== -1 && about();
		jQuery.inArray('shortcuts', parts) !== -1 && shortcuts();
		if (jQuery.inArray('help', parts) !== -1) {
			helpSource = fm.i18nBaseUrl + 'help/%s.html.js';
			help();
		}
		jQuery.inArray('integrations', parts) !== -1 && integrations();
		jQuery.inArray('debug', parts) !== -1 && debug();
		
		html.push('</div>');
		content = jQuery(html.join(''));
		
		content.find('.ui-tabs-nav li')
			.on('mouseenter mouseleave', function(e) {
				jQuery(this).toggleClass('ui-state-hover', e.type === 'mouseenter');
			})
			.on('focus blur', 'a', function(e) {
				jQuery(e.delegateTarget).toggleClass('ui-state-focus', e.type === 'focusin');
			})
			.children()
			.on('click', function(e) {
				var link = jQuery(this);
				
				e.preventDefault();
				e.stopPropagation();
				
				link.parent().addClass(clTabActive).siblings().removeClass(clTabActive);
				content.children('.ui-tabs-panel').hide().filter(link.attr('href')).show();
			})
			.filter(':first').trigger('click');
		
		if (useInteg) {
			tabInteg = content.find('.elfinder-help-tab-integrations').hide();
			integDIV = content.find('#'+fm.namespace+'-help-integrations').hide().append(jQuery('<div class="elfinder-help-integrations-desc"/>').html(fm.i18n('integrationWith')));
			fm.bind('helpIntegration', function(e) {
				var ul = integDIV.children('ul:first'),
					data, elm, cmdUL, cmdCls;
				if (e.data) {
					if (jQuery.isPlainObject(e.data)) {
						data = Object.assign({
							link: '',
							title: '',
							banner: ''
						}, e.data);
						if (data.title || data.link) {
							if (!data.title) {
								data.title = data.link;
							}
							if (data.link) {
								elm = jQuery('<a/>').attr('href', data.link).attr('target', '_blank').text(data.title);
							} else {
								elm = jQuery('<span/>').text(data.title);
							}
							if (data.banner) {
								elm = jQuery('<span/>').append(jQuery('<img/>').attr(data.banner), elm);
							}
						}
					} else {
						elm = jQuery(e.data);
						elm.filter('a').each(function() {
							var tgt = jQuery(this);
							if (!tgt.attr('target')) {
								tgt.attr('target', '_blank');;
							}
						});
					}
					if (elm) {
						tabInteg.show();
						if (!ul.length) {
							ul = jQuery('<ul class="elfinder-help-integrations"/>').appendTo(integDIV);
						}
						if (data && data.cmd) {
							cmdCls = 'elfinder-help-integration-' + data.cmd;
							cmdUL = ul.find('ul.' + cmdCls);
							if (!cmdUL.length) {
								cmdUL = jQuery('<ul class="'+cmdCls+'"/>');
								ul.append(jQuery('<li/>').append(jQuery('<span/>').html(fm.i18n('cmd'+data.cmd))).append(cmdUL));
							}
							elm = cmdUL.append(jQuery('<li/>').append(elm));
						} else {
							ul.append(jQuery('<li/>').append(elm));
						}
					}
				}
			}).bind('themechange', function() {
				content.find('div.elfinder-help-term-theme').replaceWith(getTheme());
			});
		}

		// debug
		if (useDebug) {
			tabDebug = content.find('.elfinder-help-tab-debug').hide();
			debugDIV = content.find('#'+fm.namespace+'-help-debug').children('div:first');
			debugUL = debugDIV.children('ul:first').on('click', function(e) {
				e.preventDefault();
				e.stopPropagation();
			});

			self.debug = {};
	
			fm.bind('backenddebug', function(e) {
				// CAUTION: DO NOT TOUCH `e.data`
				if (useDebug && e.data && e.data.debug) {
					self.debug = { options : e.data.options, debug : Object.assign({ cmd : fm.currentReqCmd }, e.data.debug) };
					if (self.dialog) {
						debugRender();
					}
				}
			});
		}

		content.find('#'+fm.namespace+'-help-about').find('.apiver').text(fm.api);
		self.dialog = self.fmDialog(content, {
				title : self.title,
				width : 530,
				maxWidth: 'window',
				maxHeight: 'window',
				autoOpen : false,
				destroyOnClose : false,
				close : function() {
					if (useDebug) {
						tabDebug.hide();
						debugDIV.tabs('destroy');
					}
					opened = false;
				}
			})
			.on('click', function(e) {
				e.stopPropagation();
			})
			.css({
				overflow: 'hidden'
			});
		
		tabBase = self.dialog.children('.ui-tabs');
		tabNav = tabBase.children('.ui-tabs-nav:first');
		tabs = tabBase.children('.ui-tabs-panel');
		delta = self.dialog.outerHeight(true) - self.dialog.height();
		self.dialog.closest('.ui-dialog').on('resize', function() {
			tabs.height(self.dialog.height() - delta - tabNav.outerHeight(true) - 20);
		});
		
		if (helpSource) {
			self.dialog.one('initContents', function() {
				jQuery.ajax({
					url: self.options.helpSource? self.options.helpSource : helpSource.replace('%s', fm.lang),
					dataType: 'html'
				}).done(function(source) {
					jQuery('#'+fm.namespace+'-help-help').html(source);
				}).fail(function() {
					jQuery.ajax({
						url: helpSource.replace('%s', 'en'),
						dataType: 'html'
					}).done(function(source) {
						jQuery('#'+fm.namespace+'-help-help').html(source);
					});
				});
			});
		}
		
		self.state = 0;

		fm.trigger('helpBuilded', self.dialog);
	}).one('open', function() {
		var debug = false;
		fm.one('backenddebug', function() {
			debug =true;
		}).one('opendone', function() {
			requestAnimationFrame(function() {
				if (! debug && useDebug) {
					useDebug = false;
					tabDebug.hide();
					debugDIV.hide();
					debugUL.hide();
				}
			});
		});
	});
	
	this.getstate = function() {
		return 0;
	};
	
	this.exec = function(sel, opts) {
		var tab = opts? opts.tab : void(0),
			debugShow = function() {
				if (useDebug) {
					debugDIV.tabs();
					debugUL.find('a:first').trigger('click');
					tabDebug.show();
					opened = true;
				}
			};
		debugShow();
		this.dialog.trigger('initContents').elfinderdialog('open').find((tab? '.elfinder-help-tab-'+tab : '.ui-tabs-nav li') + ' a:first').trigger('click');
		return jQuery.Deferred().resolve();
	};

}).prototype = { forceLoad : true }; // this is required command


/*
 * File: /js/commands/hidden.js
 */

/**
 * @class  elFinder command "hidden"
 * Always hidden command for uiCmdMap
 *
 * @author Naoki Sawada
 **/
elFinder.prototype.commands.hidden = function() {
		this.hidden = true;
	this.updateOnSelect = false;
	this.getstate = function() {
		return -1;
	};
};

/*
 * File: /js/commands/hide.js
 */

/**
 * @class elFinder command "hide".
 * folders/files to hide as personal setting.
 *
 * @type  elFinder.command
 * @author  Naoki Sawada
 */
elFinder.prototype.commands.hide = function() {
	
	var self = this,
		nameCache = {},
		hideData, hideCnt, cMenuType, sOrigin;

	this.syncTitleOnChange = true;

	this.shortcuts = [{
		pattern : 'ctrl+shift+dot',
		description : this.fm.i18n('toggleHidden')
	}];

	this.init = function() {
		var fm = this.fm;
		
		hideData = fm.storage('hide') || {items: {}};
		hideCnt = Object.keys(hideData.items).length;

		this.title = fm.i18n(hideData.show? 'hideHidden' : 'showHidden');
		self.update(void(0), self.title);
	};

	this.fm.bind('select contextmenucreate closecontextmenu', function(e, fm) {
		var sel = (e.data? (e.data.selected || e.data.targets) : null) || fm.selected();
		if (e.type === 'select' && e.data) {
			sOrigin = e.data.origin;
		} else if (e.type === 'contextmenucreate') {
			cMenuType = e.data.type;
		}
		if (!sel.length || (((e.type !== 'contextmenucreate' && sOrigin !== 'navbar') || cMenuType === 'cwd') && sel[0] === fm.cwd().hash)) {
			self.title = fm.i18n(hideData.show? 'hideHidden' : 'showHidden');
		} else {
			self.title = fm.i18n('cmdhide');
		}
		if (e.type !== 'closecontextmenu') {
			self.update(cMenuType === 'cwd'? (hideCnt? 0 : -1) : void(0), self.title);
		} else {
			cMenuType = '';
			requestAnimationFrame(function() {
				self.update(void(0), self.title);
			});
		}
	});

	this.getstate = function(sel) {
		return (cMenuType !== 'cwd' && (sel || this.fm.selected()).length) || hideCnt? 0 : -1;
	};

	this.exec = function(hashes, opts) {
		var fm = this.fm,
			dfrd = jQuery.Deferred()
				.done(function() {
					fm.trigger('hide', {items: items, opts: opts});
				})
				.fail(function(error) {
					fm.error(error);
				}),
			o = opts || {},
			items = o.targets? o.targets : (hashes || fm.selected()),
			added = [],
			removed = [],
			notifyto, files, res;

		hideData = fm.storage('hide') || {};
		if (!jQuery.isPlainObject(hideData)) {
			hideData = {};
		}
		if (!jQuery.isPlainObject(hideData.items)) {
			hideData.items = {};
		}
		if (opts._currentType === 'shortcut' || !items.length || (opts._currentType !== 'navbar' && sOrigin !=='navbar' && items[0] === fm.cwd().hash)) {
			if (hideData.show) {
				o.hide = true;
			} else if (Object.keys(hideData.items).length) {
				o.show = true;
			}
		}
		if (o.reset) {
			o.show = true;
			hideCnt = 0;
		}
		if (o.show || o.hide) {
			if (o.show) {
				hideData.show = true;
			} else {
				delete hideData.show;
			}
			if (o.show) {
				fm.storage('hide', o.reset? null : hideData);
				self.title = fm.i18n('hideHidden');
				self.update(o.reset? -1 : void(0), self.title);
				jQuery.each(hideData.items, function(h) {
					var f = fm.file(h, true);
					if (f && (fm.searchStatus.state || !f.phash || fm.file(f.phash))) {
						added.push(f);
					}
				});
				if (added.length) {
					fm.updateCache({added: added});
					fm.add({added: added});
				}
				if (o.reset) {
					hideData = {items: {}};
				}
				return dfrd.resolve();
			}
			items = Object.keys(hideData.items);
		}

		if (items.length) {
			jQuery.each(items, function(i, h) {
				var f;
				if (!hideData.items[h]) {
					f = fm.file(h);
					if (f) {
						nameCache[h] = f.i18 || f.name;
					}
					hideData.items[h] = nameCache[h]? nameCache[h] : h;
				}
			});
			hideCnt = Object.keys(hideData.items).length;
			files = this.files(items);
			fm.storage('hide', hideData);
			fm.remove({removed: items});
			if (hideData.show) {
				this.exec(void(0), {hide: true});
			}
			if (!o.hide) {
				res = {};
				res.undo = {
					cmd : 'hide',
					callback : function() {
						var nData = fm.storage('hide');
						if (nData) {
							jQuery.each(items, function(i, h) {
								delete nData.items[h];
							});
							hideCnt = Object.keys(nData.items).length;
							fm.storage('hide', nData);
							fm.trigger('hide', {items: items, opts: {}});
							self.update(hideCnt? 0 : -1);
						}
						fm.updateCache({added: files});
						fm.add({added: files});
					}
				};
				res.redo = {
					cmd : 'hide',
					callback : function() {
						return fm.exec('hide', void(0), {targets: items});
					}
				};
			}
		}

		return dfrd.state() == 'rejected' ? dfrd : dfrd.resolve(res);
	};
};


/*
 * File: /js/commands/home.js
 */

(elFinder.prototype.commands.home = function() {
		this.title = 'Home';
	this.alwaysEnabled  = true;
	this.updateOnSelect = false;
	this.shortcuts = [{
		pattern     : 'ctrl+home ctrl+shift+up',
		description : 'Home'
	}];
	
	this.getstate = function() {
		var root = this.fm.root(),
			cwd  = this.fm.cwd().hash;
			
		return root && cwd && root != cwd ? 0: -1;
	};
	
	this.exec = function() {
		return this.fm.exec('open', this.fm.root());
	};
	

}).prototype = { forceLoad : true }; // this is required command


/*
 * File: /js/commands/info.js
 */

/**
 * @class elFinder command "info". 
 * Display dialog with file properties.
 *
 * @author Dmitry (dio) Levashov, dio@std42.ru
 **/
(elFinder.prototype.commands.info = function() {
		var m   = 'msg',
		fm  = this.fm,
		spclass = 'elfinder-spinner',
		btnclass = 'elfinder-info-button',
		msg = {
			calc     : fm.i18n('calc'),
			size     : fm.i18n('size'),
			unknown  : fm.i18n('unknown'),
			path     : fm.i18n('path'),
			aliasfor : fm.i18n('aliasfor'),
			modify   : fm.i18n('modify'),
			perms    : fm.i18n('perms'),
			locked   : fm.i18n('locked'),
			dim      : fm.i18n('dim'),
			kind     : fm.i18n('kind'),
			files    : fm.i18n('files'),
			folders  : fm.i18n('folders'),
			roots    : fm.i18n('volumeRoots'),
			items    : fm.i18n('items'),
			yes      : fm.i18n('yes'),
			no       : fm.i18n('no'),
			link     : fm.i18n('link'),
			owner    : fm.i18n('owner'),
			group    : fm.i18n('group'),
			perm     : fm.i18n('perm'),
			getlink  : fm.i18n('getLink')
		},
		applyZWSP = function(str, remove) {
			if (remove) {
				return str.replace(/\u200B/g, '');
			} else {
				return str.replace(/(\/|\\)/g, "$1\u200B");
			}
		};
	
	this.items = ['size', 'aliasfor', 'path', 'link', 'dim', 'modify', 'perms', 'locked', 'owner', 'group', 'perm'];
	if (this.options.custom && Object.keys(this.options.custom).length) {
		jQuery.each(this.options.custom, function(name, details) {
			details.label && this.items.push(details.label);
		});
	}

	this.tpl = {
		main       : '<div class="ui-helper-clearfix elfinder-info-title {dirclass}"><span class="elfinder-cwd-icon {class} ui-corner-all"{style}/>{title}</div><table class="elfinder-info-tb">{content}</table>',
		itemTitle  : '<strong>{name}</strong><span class="elfinder-info-kind">{kind}</span>',
		groupTitle : '<strong>{items}: {num}</strong>',
		row        : '<tr><td class="elfinder-info-label">{label} : </td><td class="{class}">{value}</td></tr>',
		spinner    : '<span>{text}</span> <span class="'+spclass+' '+spclass+'-{name}"/>'
	};
	
	this.alwaysEnabled = true;
	this.updateOnSelect = false;
	this.shortcuts = [{
		pattern     : 'ctrl+i'
	}];
	
	this.init = function() {
		jQuery.each(msg, function(k, v) {
			msg[k] = fm.i18n(v);
		});
	};
	
	this.getstate = function() {
		return 0;
	};
	
	this.exec = function(hashes) {
		var files   = this.files(hashes);
		if (! files.length) {
			files   = this.files([ this.fm.cwd().hash ]);
		}
		var self    = this,
			fm      = this.fm,
			o       = this.options,
			tpl     = this.tpl,
			row     = tpl.row,
			cnt     = files.length,
			content = [],
			view    = tpl.main,
			l       = '{label}',
			v       = '{value}',
			reqs    = [],
			reqDfrd = null,
			opts    = {
				title : fm.i18n('selectionInfo'),
				width : 'auto',
				close : function() {
					jQuery(this).elfinderdialog('destroy');
					if (reqDfrd && reqDfrd.state() === 'pending') {
						reqDfrd.reject();
					}
					jQuery.grep(reqs, function(r) {
						r && r.state() === 'pending' && r.reject();
					});
				}
			},
			count = [],
			replSpinner = function(msg, name, className) {
				dialog.find('.'+spclass+'-'+name).parent().html(msg).addClass(className || '');
			},
			id = fm.namespace+'-info-'+jQuery.map(files, function(f) { return f.hash; }).join('-'),
			dialog = fm.getUI().find('#'+id),
			customActions = [],
			style = '',
			hashClass = 'elfinder-font-mono elfinder-info-hash',
			size, tmb, file, title, dcnt, rdcnt, path, getHashAlgorisms, hideItems;
			
		if (!cnt) {
			return jQuery.Deferred().reject();
		}
			
		if (dialog.length) {
			dialog.elfinderdialog('toTop');
			return jQuery.Deferred().resolve();
		}
		
		hideItems = fm.storage('infohides') || fm.arrayFlip(o.hideItems, true);

		if (cnt === 1) {
			file = files[0];
			
			if (file.icon) {
				style = ' '+fm.getIconStyle(file);
			}
			
			view  = view.replace('{dirclass}', file.csscls? fm.escape(file.csscls) : '').replace('{class}', fm.mime2class(file.mime)).replace('{style}', style);
			title = tpl.itemTitle.replace('{name}', fm.escape(file.i18 || file.name)).replace('{kind}', '<span title="'+fm.escape(file.mime)+'">'+fm.mime2kind(file)+'</span>');

			tmb = fm.tmb(file);
			
			if (!file.read) {
				size = msg.unknown;
			} else if (file.mime != 'directory' || file.alias) {
				size = fm.formatSize(file.size);
			} else {
				size = tpl.spinner.replace('{text}', msg.calc).replace('{name}', 'size');
				count.push(file.hash);
			}
			
			!hideItems.size && content.push(row.replace(l, msg.size).replace(v, size));
			!hideItems.aleasfor && file.alias && content.push(row.replace(l, msg.aliasfor).replace(v, file.alias));
			if (!hideItems.path) {
				if (path = fm.path(file.hash, true)) {
					content.push(row.replace(l, msg.path).replace(v, applyZWSP(fm.escape(path))).replace('{class}', 'elfinder-info-path'));
				} else {
					content.push(row.replace(l, msg.path).replace(v, tpl.spinner.replace('{text}', msg.calc).replace('{name}', 'path')).replace('{class}', 'elfinder-info-path'));
					reqs.push(fm.path(file.hash, true, {notify: null})
					.fail(function() {
						replSpinner(msg.unknown, 'path');
					})
					.done(function(path) {
						replSpinner(applyZWSP(path), 'path');
					}));
				}
			}
			if (!hideItems.link && file.read) {
				var href,
				name_esc = fm.escape(file.name);
				if (file.url == '1') {
					content.push(row.replace(l, msg.link).replace(v, '<button class="'+btnclass+' '+spclass+'-url">'+msg.getlink+'</button>'));
				} else {
					if (file.url) {
						href = file.url;
					} else if (file.mime === 'directory') {
						if (o.nullUrlDirLinkSelf && file.url === null) {
							var loc = window.location;
							href = loc.pathname + loc.search + '#elf_' + file.hash;
						} else if (file.url !== '' && fm.option('url', (!fm.isRoot(file) && file.phash) || file.hash)) {
							href = fm.url(file.hash);
						}
					} else {
						href = fm.url(file.hash);
					}
					/*href && content.push(row.replace(l, msg.link).replace(v,  '<a href="'+href+'" target="_blank">'+name_esc+'</a>'));*/
					href && content.push(row.replace(l, msg.link).replace(v,  '<a href="'+href+'" target="_blank">'+name_esc+'</a> <a href="mailto:?Subject=WP File Manager Share '+name_esc+'&amp;Body='+href+'" class="mk_elfinder_share_button" title="Share"><button class="button button-primary">Share</button></a>'));	
				}
			}
			
			if (!hideItems.dim) {
				if (file.dim) { // old api
					content.push(row.replace(l, msg.dim).replace(v, file.dim));
				} else if (file.mime.indexOf('image') !== -1) {
					if (file.width && file.height) {
						content.push(row.replace(l, msg.dim).replace(v, file.width+'x'+file.height));
					} else {
						content.push(row.replace(l, msg.dim).replace(v, tpl.spinner.replace('{text}', msg.calc).replace('{name}', 'dim')));
						reqs.push(fm.request({
							data : {cmd : 'dim', target : file.hash},
							preventDefault : true
						})
						.fail(function() {
							replSpinner(msg.unknown, 'dim');
						})
						.done(function(data) {
							replSpinner(data.dim || msg.unknown, 'dim');
							if (data.dim) {
								var dim = data.dim.split('x');
								var rfile = fm.file(file.hash);
								rfile.width = dim[0];
								rfile.height = dim[1];
							}
						}));
					}
				}
			}
			
			!hideItems.modify && content.push(row.replace(l, msg.modify).replace(v, fm.formatDate(file)));
			!hideItems.perms && content.push(row.replace(l, msg.perms).replace(v, fm.formatPermissions(file)));
			!hideItems.locked && content.push(row.replace(l, msg.locked).replace(v, file.locked ? msg.yes : msg.no));
			!hideItems.owner && file.owner && content.push(row.replace(l, msg.owner).replace(v, file.owner));
			!hideItems.group && file.group && content.push(row.replace(l, msg.group).replace(v, file.group));
			!hideItems.perm && file.perm && content.push(row.replace(l, msg.perm).replace(v, fm.formatFileMode(file.perm)));
			
			// Get MD5 hash
			if (window.ArrayBuffer && (fm.options.cdns.sparkmd5 || fm.options.cdns.jssha) && file.mime !== 'directory' && file.size > 0 && (!o.showHashMaxsize || file.size <= o.showHashMaxsize)) {
				getHashAlgorisms = [];
				jQuery.each(fm.storage('hashchekcer') || o.showHashAlgorisms, function(i, n) {
					if (!file[n]) {
					content.push(row.replace(l, fm.i18n(n)).replace(v, tpl.spinner.replace('{text}', msg.calc).replace('{name}', n)));
						getHashAlgorisms.push(n);
					} else {
						content.push(row.replace(l, fm.i18n(n)).replace(v, file[n]).replace('{class}', hashClass));
					}
				});

				reqs.push(
					fm.getContentsHashes(file.hash, getHashAlgorisms).progress(function(hashes) {
						jQuery.each(getHashAlgorisms, function(i, n) {
							if (hashes[n]) {
								replSpinner(hashes[n], n, hashClass);
							}
						});
					}).always(function() {
						jQuery.each(getHashAlgorisms, function(i, n) {
							replSpinner(msg.unknown, n);
						});
					})
				);
			}
			
			// Add custom info fields
			if (o.custom) {
				jQuery.each(o.custom, function(name, details) {
					if (
					  !hideItems[details.label]
					    &&
					  (!details.mimes || jQuery.grep(details.mimes, function(m){return (file.mime === m || file.mime.indexOf(m+'/') === 0)? true : false;}).length)
					    &&
					  (!details.hashRegex || file.hash.match(details.hashRegex))
					) {
						// Add to the content
						content.push(row.replace(l, fm.i18n(details.label)).replace(v , details.tpl.replace('{id}', id)));
						// Register the action
						if (details.action && (typeof details.action == 'function')) {
							customActions.push(details.action);
						}
					}
				});
			}
		} else {
			view  = view.replace('{class}', 'elfinder-cwd-icon-group');
			title = tpl.groupTitle.replace('{items}', msg.items).replace('{num}', cnt);
			dcnt  = jQuery.grep(files, function(f) { return f.mime == 'directory' ? true : false ; }).length;
			if (!dcnt) {
				size = 0;
				jQuery.each(files, function(h, f) { 
					var s = parseInt(f.size);
					
					if (s >= 0 && size >= 0) {
						size += s;
					} else {
						size = 'unknown';
					}
				});
				content.push(row.replace(l, msg.kind).replace(v, msg.files));
				!hideItems.size && content.push(row.replace(l, msg.size).replace(v, fm.formatSize(size)));
			} else {
				rdcnt = jQuery.grep(files, function(f) { return f.mime === 'directory' && (! f.phash || f.isroot)? true : false ; }).length;
				dcnt -= rdcnt;
				content.push(row.replace(l, msg.kind).replace(v, (rdcnt === cnt || dcnt === cnt)? msg[rdcnt? 'roots' : 'folders'] : jQuery.map({roots: rdcnt, folders: dcnt, files: cnt - rdcnt - dcnt}, function(c, t) { return c? msg[t]+' '+c : null; }).join(', ')));
				!hideItems.size && content.push(row.replace(l, msg.size).replace(v, tpl.spinner.replace('{text}', msg.calc).replace('{name}', 'size')));
				count = jQuery.map(files, function(f) { return f.hash; });
				
			}
		}
		
		view = view.replace('{title}', title).replace('{content}', content.join('').replace(/{class}/g, ''));
		
		dialog = self.fmDialog(view, opts);
		dialog.attr('id', id).one('mousedown', '.elfinder-info-path', function() {
			jQuery(this).html(applyZWSP(jQuery(this).html(), true));
		});

		if (fm.UA.Mobile && jQuery.fn.tooltip) {
			dialog.children('.ui-dialog-content .elfinder-info-title').tooltip({
				classes: {
					'ui-tooltip': 'elfinder-ui-tooltip ui-widget-shadow'
				},
				tooltipClass: 'elfinder-ui-tooltip ui-widget-shadow',
				track: true
			});
		}

		if (file && file.url == '1') {
			dialog.on('click', '.'+spclass+'-url', function(){
				jQuery(this).parent().html(tpl.spinner.replace('{text}', fm.i18n('ntfurl')).replace('{name}', 'url'));
				fm.request({
					data : {cmd : 'url', target : file.hash},
					preventDefault : true
				})
				.fail(function() {
					replSpinner(name_esc, 'url');
				})
				.done(function(data) {
					if (data.url) {
						replSpinner('<a href="'+data.url+'" target="_blank">'+name_esc+'</a>' || name_esc, 'url');
						var rfile = fm.file(file.hash);
						rfile.url = data.url;
					} else {
						replSpinner(name_esc, 'url');
					}
				});
			});
		}

		// load thumbnail
		if (tmb) {
			jQuery('<img/>')
				.on('load', function() { dialog.find('.elfinder-cwd-icon').addClass(tmb.className).css('background-image', "url('"+tmb.url+"')"); })
				.attr('src', tmb.url);
		}
		
		// send request to count total size
		if (count.length) {
			reqDfrd = fm.getSize(count).done(function(data) {
				replSpinner(data.formated, 'size');
			}).fail(function() {
				replSpinner(msg.unknown, 'size');
			});
		}
		
		// call custom actions
		if (customActions.length) {
			jQuery.each(customActions, function(i, action) {
				try {
					action(file, fm, dialog);
				} catch(e) {
					fm.debug('error', e);
				}
			});
		}
		
		return jQuery.Deferred().resolve();
	};
	
}).prototype = { forceLoad : true }; // this is required command


/*
 * File: /js/commands/mkdir.js
 */

/**
 * @class  elFinder command "mkdir"
 * Create new folder
 *
 * @author Dmitry (dio) Levashov
 **/
elFinder.prototype.commands.mkdir = function() {
		var fm   = this.fm,
		self = this,
		curOrg;
	
	this.value           = '';
	this.disableOnSearch = true;
	this.updateOnSelect  = false;
	this.syncTitleOnChange = true;
	this.mime            = 'directory';
	this.prefix          = 'untitled folder';
	this.exec            = function(select, cOpts) {
		var onCwd;

		if (select && select.length && cOpts && cOpts._currentType && cOpts._currentType === 'navbar') {
			this.origin = cOpts._currentType;
			this.data = {
				target: select[0]
			};
		} else {
			onCwd = fm.cwd().hash === select[0];
			this.origin = curOrg && !onCwd? curOrg : 'cwd';
			delete this.data;
		}
		if (! select && ! this.options.intoNewFolderToolbtn) {
			fm.getUI('cwd').trigger('unselectall');
		}
		//this.move = (!onCwd && curOrg !== 'navbar' && fm.selected().length)? true : false;
		this.move = this.value === fm.i18n('cmdmkdirin');
		return jQuery.proxy(fm.res('mixin', 'make'), self)();
	};
	
	this.shortcuts = [{
		pattern     : 'ctrl+shift+n'
	}];

	this.init = function() {
		if (this.options.intoNewFolderToolbtn) {
			this.syncTitleOnChange = true;
		}
	};
	
	fm.bind('select contextmenucreate closecontextmenu', function(e) {
		var sel = (e.data? (e.data.selected || e.data.targets) : null) || fm.selected();
		
		self.className = 'mkdir';
		curOrg = e.data && sel.length? (e.data.origin || e.data.type || '') : '';
		if (!self.options.intoNewFolderToolbtn && curOrg === '') {
			curOrg = 'cwd';
		}
		if (sel.length && curOrg !== 'navbar' && curOrg !== 'cwd' && fm.cwd().hash !== sel[0]) {
			self.title = fm.i18n('cmdmkdirin');
			self.className += ' elfinder-button-icon-mkdirin';
		} else {
			self.title = fm.i18n('cmdmkdir');
		}
		if (e.type !== 'closecontextmenu') {
			self.update(void(0), self.title);
		} else {
			requestAnimationFrame(function() {
				self.update(void(0), self.title);
			});
		}
	});
	
	this.getstate = function(select) {
		var cwd = fm.cwd(),
			sel = (curOrg === 'navbar' || (select && select[0] !== cwd.hash))? this.files(select || fm.selected()) : [],
			cnt = sel.length;

		if (curOrg === 'navbar') {
			return cnt && sel[0].write && sel[0].read? 0 : -1;  
		} else {
			return cwd.write && (!cnt || jQuery.grep(sel, function(f) { return f.read && ! f.locked? true : false; }).length == cnt)? 0 : -1;
		}
	};

};


/*
 * File: /js/commands/mkfile.js
 */

/**
 * @class  elFinder command "mkfile"
 * Create new empty file
 *
 * @author Dmitry (dio) Levashov
 **/
elFinder.prototype.commands.mkfile = function() {
		var self = this;

	this.disableOnSearch = true;
	this.updateOnSelect  = false;
	this.mime            = 'text/plain';
	this.prefix          = 'untitled file.txt';
	this.variants        = [];

	this.getTypeName = function(mime, type) {
		var fm = self.fm,
			name;
		if (name = fm.messages['kind' + fm.kinds[mime]]) {
			name = fm.i18n(['extentiontype', type.toUpperCase(), name]);
		} else {
			name = fm.i18n(['extentionfile', type.toUpperCase()]);
		}
		return name;
	};

	this.fm.bind('open reload canMakeEmptyFile', function() {
		var fm = self.fm,
			hides = fm.storage('mkfileHides') || {};
		self.variants = [];
		if (fm.mimesCanMakeEmpty) {
			jQuery.each(fm.mimesCanMakeEmpty, function(mime, type) {
				type && !hides[mime] && fm.uploadMimeCheck(mime) && self.variants.push([mime, self.getTypeName(mime, type)]);
			});
		}
		self.change();
	});

	this.getstate = function() {
		return this.fm.cwd().write ? 0 : -1;
	};

	this.exec = function(_dum, mime) {
		var fm = self.fm,
			type, err;
		if (type = fm.mimesCanMakeEmpty[mime]) {
			if (fm.uploadMimeCheck(mime)) {
				this.mime = mime;
				this.prefix = fm.i18n(['untitled file', type]);
				return jQuery.proxy(fm.res('mixin', 'make'), self)();
			}
			err = ['errMkfile', self.getTypeName(mime, type)];
		}
		return jQuery.Deferred().reject(err);
	};
};


/*
 * File: /js/commands/netmount.js
 */

/**
 * @class  elFinder command "netmount"
 * Mount network volume with user credentials.
 *
 * @author Dmitry (dio) Levashov
 **/
elFinder.prototype.commands.netmount = function() {
		var self = this,
		hasMenus = false,
		content;

	this.alwaysEnabled  = true;
	this.updateOnSelect = false;

	this.drivers = [];
	
	this.handlers = {
		load : function() {
			var fm = self.fm;
			self.drivers = fm.netDrivers;
			if (self.drivers.length) {
				requestAnimationFrame(function() {
					jQuery.each(self.drivers, function() {
						var d = self.options[this];
						if (d) {
							hasMenus = true;
							if (d.integrateInfo) {
								fm.trigger('helpIntegration', Object.assign({cmd: 'netmount'}, d.integrateInfo));
							}
						}
					});
				});
			}
		}
	};

	this.getstate = function() {
		return hasMenus ? 0 : -1;
	};
	
	this.exec = function() {
		var fm = self.fm,
			dfrd = jQuery.Deferred(),
			o = self.options,
			create = function() {
				var winFocus = function() {
						inputs.protocol.trigger('change', 'winfocus');
					},
					inputs = {
						protocol : jQuery('<select/>')
						.on('change', function(e, data){
							var protocol = this.value;
							content.find('.elfinder-netmount-tr').hide();
							content.find('.elfinder-netmount-tr-'+protocol).show();
							dialogNode && dialogNode.children('.ui-dialog-buttonpane:first').find('button').show();
							if (typeof o[protocol].select == 'function') {
								o[protocol].select(fm, e, data);
							}
							requestAnimationFrame(function() {
								content.find('input:text.elfinder-tabstop:visible:first').trigger('focus');
							});
						})
						.addClass('ui-corner-all')
					},
					opts = {
						title          : fm.i18n('netMountDialogTitle'),
						resizable      : false,
						modal          : true,
						destroyOnClose : false,
						open           : function() {
							jQuery(window).on('focus.'+fm.namespace, winFocus);
							inputs.protocol.trigger('change');
						},
						close          : function() { 
							dfrd.state() == 'pending' && dfrd.reject();
							jQuery(window).off('focus.'+fm.namespace, winFocus);
						},
						buttons        : {}
					},
					doMount = function() {
						var protocol = inputs.protocol.val(),
							data = {cmd : 'netmount', protocol: protocol},
							cur = o[protocol];
						jQuery.each(content.find('input.elfinder-netmount-inputs-'+protocol), function(name, input) {
							var val, elm;
							elm = jQuery(input);
							if (elm.is(':radio,:checkbox')) {
								if (elm.is(':checked')) {
									val = jQuery.trim(elm.val());
								}
							} else {
								val = jQuery.trim(elm.val());
							}
							if (val) {
								data[input.name] = val;
							}
						});
	
						if (!data.host) {
							return fm.trigger('error', {error : 'errNetMountHostReq', opts : {modal: true}});
						}
	
						fm.request({data : data, notify : {type : 'netmount', cnt : 1, hideCnt : true}})
							.done(function(data) {
								var pdir;
								if (data.added && data.added.length) {
									if (data.added[0].phash) {
										if (pdir = fm.file(data.added[0].phash)) {
											if (! pdir.dirs) {
												pdir.dirs = 1;
												fm.change({ changed: [ pdir ] });
											}
										}
									}
									fm.one('netmountdone', function() {
										fm.exec('open', data.added[0].hash);
									});
								}
								dfrd.resolve();
							})
							.fail(function(error) {
								if (cur.fail && typeof cur.fail == 'function') {
									cur.fail(fm, fm.parseError(error));
								}
								dfrd.reject(error);
							});
	
						self.dialog.elfinderdialog('close');
					},
					form = jQuery('<form autocomplete="off"/>').on('keydown', 'input', function(e) {
						var comp = true,
							next;
						if (e.keyCode === jQuery.ui.keyCode.ENTER) {
							jQuery.each(form.find('input:visible:not(.elfinder-input-optional)'), function() {
								if (jQuery(this).val() === '') {
									comp = false;
									next = jQuery(this);
									return false;
								}
							});
							if (comp) {
								doMount();
							} else {
								next.trigger('focus');
							}
						}
					}),
					hidden  = jQuery('<div/>'),
					dialog;

				content = jQuery('<table class="elfinder-info-tb elfinder-netmount-tb"/>')
					.append(jQuery('<tr/>').append(jQuery('<td>'+fm.i18n('protocol')+'</td>')).append(jQuery('<td/>').append(inputs.protocol)));

				jQuery.each(self.drivers, function(i, protocol) {
					if (o[protocol]) {
						inputs.protocol.append('<option value="'+protocol+'">'+fm.i18n(o[protocol].name || protocol)+'</option>');
						jQuery.each(o[protocol].inputs, function(name, input) {
							input.attr('name', name);
							if (input.attr('type') != 'hidden') {
								input.addClass('ui-corner-all elfinder-netmount-inputs-'+protocol);
								content.append(jQuery('<tr/>').addClass('elfinder-netmount-tr elfinder-netmount-tr-'+protocol).append(jQuery('<td>'+fm.i18n(name)+'</td>')).append(jQuery('<td/>').append(input)));
							} else {
								input.addClass('elfinder-netmount-inputs-'+protocol);
								hidden.append(input);
							}
						});
						o[protocol].protocol = inputs.protocol;
					}
				});
				
				content.append(hidden);
				
				content.find('.elfinder-netmount-tr').hide();

				opts.buttons[fm.i18n('btnMount')] = doMount;

				opts.buttons[fm.i18n('btnCancel')] = function() {
					self.dialog.elfinderdialog('close');
				};
				
				content.find('select,input').addClass('elfinder-tabstop');
				
				dialog = self.fmDialog(form.append(content), opts);
				dialogNode = dialog.closest('.ui-dialog');
				dialog.ready(function(){
					inputs.protocol.trigger('change');
					dialog.elfinderdialog('posInit');
				});
				return dialog;
			},
			dialogNode;
		
		if (!self.dialog) {
			self.dialog = create();
		} else {
			self.dialog.elfinderdialog('open');
		}

		return dfrd.promise();
	};

	self.fm.bind('netmount', function(e) {
		var d = e.data || null,
			o = self.options;
		if (d && d.protocol) {
			if (o[d.protocol] && typeof o[d.protocol].done == 'function') {
				o[d.protocol].done(self.fm, d);
				content.find('select,input').addClass('elfinder-tabstop');
				self.dialog.elfinderdialog('tabstopsInit');
			}
		}
	});

};

elFinder.prototype.commands.netunmount = function() {
	var self = this;

	this.alwaysEnabled  = true;
	this.updateOnSelect = false;

	this.drivers = [];
	
	this.handlers = {
		load : function() {
			this.drivers = this.fm.netDrivers;
		}
	};

	this.getstate = function(sel) {
		var fm = this.fm,
			file;
		return !!sel && this.drivers.length && !this._disabled && (file = fm.file(sel[0])) && file.netkey ? 0 : -1;
	};
	
	this.exec = function(hashes) {
		var self   = this,
			fm     = this.fm,
			dfrd   = jQuery.Deferred()
				.fail(function(error) {
					error && fm.error(error);
				}),
			drive  = fm.file(hashes[0]),
			childrenRoots = function(hash) {
				var roots = [],
					work;
				if (fm.leafRoots) {
					work = [];
					jQuery.each(fm.leafRoots, function(phash, hashes) {
						var parents = fm.parents(phash),
							idx, deep;
						if ((idx = jQuery.inArray(hash, parents)) !== -1) {
							idx = parents.length - idx;
							jQuery.each(hashes, function(i, h) {
								work.push({i: idx, hash: h});
							});
						}
					});
					if (work.length) {
						work.sort(function(a, b) { return a.i < b.i; });
						jQuery.each(work, function(i, o) {
							roots.push(o.hash);
						});
					}
				}
				return roots;
			};

		if (this._disabled) {
			return dfrd.reject();
		}

		if (dfrd.state() == 'pending') {
			fm.confirm({
				title  : self.title,
				text   : fm.i18n('confirmUnmount', drive.name),
				accept : {
					label    : 'btnUnmount',
					callback : function() {  
						var target =  drive.hash,
							roots = childrenRoots(target),
							requests = [],
							removed = [],
							doUmount = function() {
								jQuery.when(requests).done(function() {
									fm.request({
										data   : {cmd  : 'netmount', protocol : 'netunmount', host: drive.netkey, user : target, pass : 'dum'}, 
										notify : {type : 'netunmount', cnt : 1, hideCnt : true},
										preventFail : true
									})
									.fail(function(error) {
										dfrd.reject(error);
									})
									.done(function(data) {
										drive.volumeid && delete fm.volumeExpires[drive.volumeid];
										dfrd.resolve();
									});
								}).fail(function(error) {
									if (removed.length) {
										fm.remove({ removed: removed });
									}
									dfrd.reject(error);
								});
							};
						
						if (roots.length) {
							fm.confirm({
								title : self.title,
								text  : (function() {
									var msgs = ['unmountChildren'];
									jQuery.each(roots, function(i, hash) {
										msgs.push([fm.file(hash).name]);
									});
									return msgs;
								})(),
								accept : {
									label : 'btnUnmount',
									callback : function() {
										jQuery.each(roots, function(i, hash) {
											var d = fm.file(hash);
											if (d.netkey) {
												requests.push(fm.request({
													data   : {cmd  : 'netmount', protocol : 'netunmount', host: d.netkey, user : d.hash, pass : 'dum'}, 
													notify : {type : 'netunmount', cnt : 1, hideCnt : true},
													preventDefault : true
												}).done(function(data) {
													if (data.removed) {
														d.volumeid && delete fm.volumeExpires[d.volumeid];
														removed = removed.concat(data.removed);
													}
												}));
											}
										});
										doUmount();
									}
								},
								cancel : {
									label : 'btnCancel',
									callback : function() {
										dfrd.reject();
									}
								}
							});
						} else {
							requests = null;
							doUmount();
						}
					}
				},
				cancel : {
					label    : 'btnCancel',
					callback : function() { dfrd.reject(); }
				}
			});
		}
			
		return dfrd;
	};

};


/*
 * File: /js/commands/open.js
 */

/**
 * @class  elFinder command "open"
 * Enter folder or open files in new windows
 *
 * @author Dmitry (dio) Levashov
 **/  
(elFinder.prototype.commands.open = function() {
		var fm = this.fm;
	this.alwaysEnabled = true;
	this.noChangeDirOnRemovedCwd = true;
	
	this._handlers = {
		dblclick : function(e) { e.preventDefault(); fm.exec('open', e.data && e.data.file? [ e.data.file ]: void(0)); },
		'select enable disable reload' : function(e) { this.update(e.type == 'disable' ? -1 : void(0));  }
	};
	
	this.shortcuts = [{
		pattern     : 'ctrl+down numpad_enter'+(fm.OS != 'mac' && ' enter')
	}];

	this.getstate = function(select) {
		var sel = this.files(select),
			cnt = sel.length;
		
		return cnt == 1 
			? (sel[0].read? 0 : -1) 
			: (cnt && !fm.UA.Mobile) ? (jQuery.grep(sel, function(file) { return file.mime == 'directory' || ! file.read ? false : true;}).length == cnt ? 0 : -1) : -1;
	};
	
	this.exec = function(hashes, cOpts) {
		var dfrd  = jQuery.Deferred().fail(function(error) { error && fm.error(error); }),
			files = this.files(hashes),
			cnt   = files.length,
			thash = (typeof cOpts == 'object')? cOpts.thash : false,
			opts  = this.options,
			into  = opts.into || 'window',
			file, url, s, w, imgW, imgH, winW, winH, reg, link, html5dl, inline,
			selAct, cmd;

		if (!cnt && !thash) {
			{
				return dfrd.reject();
			}
		}

		// open folder
		if (thash || (cnt == 1 && (file = files[0]) && file.mime == 'directory')) {
			if (!thash && file && !file.read) {
				return dfrd.reject(['errOpen', file.name, 'errPerm']);
			} else {
				if (fm.keyState.ctrlKey && (fm.keyState.shiftKey || typeof fm.options.getFileCallback !== 'function')) {
					if (fm.getCommand('opennew')) {
						return fm.exec('opennew', [thash? thash : file.hash]);
					}
				}

				return fm.request({
					data   : {cmd  : 'open', target : thash || file.hash},
					notify : {type : 'open', cnt : 1, hideCnt : true},
					syncOnFail : true,
					lazy : false
				});
			}
		}
		
		files = jQuery.grep(files, function(file) { return file.mime != 'directory' ? true : false; });
		
		// nothing to open or files and folders selected - do nothing
		if (cnt != files.length) {
			return dfrd.reject();
		}
		
		var doOpen = function() {
			var wnd, target, getOnly;
			
			try {
				reg = new RegExp(fm.option('dispInlineRegex'), 'i');
			} catch(e) {
				reg = false;
			}
	
			// open files
			link     = jQuery('<a>').hide().appendTo(jQuery('body')),
			html5dl  = (typeof link.get(0).download === 'string');
			cnt = files.length;
			while (cnt--) {
				target = 'elf_open_window';
				file = files[cnt];
				
				if (!file.read) {
					return dfrd.reject(['errOpen', file.name, 'errPerm']);
				}
				
				inline = (reg && file.mime.match(reg));
				url = fm.openUrl(file.hash, !inline);
				if (fm.UA.Mobile || !inline) {
					if (html5dl) {
						if (!inline) {
							link.attr('download', file.name);
						} else {
							link.attr('target', '_blank');
						}
						link.attr('href', url).get(0).click();
					} else {
						wnd = window.open(url);
						if (!wnd) {
							return dfrd.reject('errPopup');
						}
					}
				} else {
					getOnly = (typeof opts.method === 'string' && opts.method.toLowerCase() === 'get');
					if (!getOnly
						&& url.indexOf(fm.options.url) === 0
						&& fm.customData
						&& Object.keys(fm.customData).length
						// Since playback by POST request can not be done in Chrome, media allows GET request
						&& !file.mime.match(/^(?:video|audio)/)
					) {
						// Send request as 'POST' method to hide custom data at location bar
						url = '';
					}
					if (into === 'window') {
						// set window size for image if set
						imgW = winW = Math.round(2 * screen.availWidth / 3);
						imgH = winH = Math.round(2 * screen.availHeight / 3);
						if (parseInt(file.width) && parseInt(file.height)) {
							imgW = parseInt(file.width);
							imgH = parseInt(file.height);
						} else if (file.dim) {
							s = file.dim.split('x');
							imgW = parseInt(s[0]);
							imgH = parseInt(s[1]);
						}
						if (winW >= imgW && winH >= imgH) {
							winW = imgW;
							winH = imgH;
						} else {
							if ((imgW - winW) > (imgH - winH)) {
								winH = Math.round(imgH * (winW / imgW));
							} else {
								winW = Math.round(imgW * (winH / imgH));
							}
						}
						w = 'width='+winW+',height='+winH;
						wnd = window.open(url, target, w + ',top=50,left=50,scrollbars=yes,resizable=yes,titlebar=no');
					} else {
						if (into === 'tabs') {
							target = file.hash;
						}
						wnd = window.open('about:blank', target);
					}
					
					if (!wnd) {
						return dfrd.reject('errPopup');
					}
					
					if (url === '') {
						var form = document.createElement("form");
						form.action = fm.options.url;
						form.method = 'POST';
						form.target = target;
						form.style.display = 'none';
						var params = Object.assign({}, fm.customData, {
							cmd: 'file',
							target: file.hash,
							_t: file.ts || parseInt(+new Date()/1000)
						});
						jQuery.each(params, function(key, val)
						{
							var input = document.createElement("input");
							input.name = key;
							input.value = val;
							form.appendChild(input);
						});
						
						document.body.appendChild(form);
						form.submit();
					} else if (into !== 'window') {
						wnd.location = url;
					}
					jQuery(wnd).trigger('focus');
				}
			}
			link.remove();
			return dfrd.resolve(hashes);
		};
		
		if (cnt > 1) {
			fm.confirm({
				title: 'openMulti',
				text : ['openMultiConfirm', cnt + ''],
				accept : {
					label : 'cmdopen',
					callback : function() { doOpen(); }
				},
				cancel : {
					label : 'btnCancel',
					callback : function() { 
						dfrd.reject();
					}
				},
				buttons : (fm.getCommand('zipdl') && fm.isCommandEnabled('zipdl', fm.cwd().hash))? [
					{
						label : 'cmddownload',
						callback : function() {
							fm.exec('download', hashes);
							dfrd.reject();
						}
					}
				] : []
			});
		} else {
			selAct = fm.storage('selectAction') || opts.selectAction;
			if (selAct) {
				jQuery.each(selAct.split('/'), function() {
					var cmdName = this.valueOf();
					if (cmdName !== 'open' && (cmd = fm.getCommand(cmdName)) && cmd.enabled()) {
						return false;
					}
					cmd = null;
				});
				if (cmd) {
					return fm.exec(cmd.name);
				}
			}
			doOpen();
		}
		
		return dfrd;
	};

}).prototype = { forceLoad : true }; // this is required command


/*
 * File: /js/commands/opendir.js
 */

/**
 * @class  elFinder command "opendir"
 * Enter parent folder
 *
 * @author Naoki Sawada
 **/  
elFinder.prototype.commands.opendir = function() {
		this.alwaysEnabled = true;
	
	this.getstate = function() {
		var sel = this.fm.selected(),
			cnt = sel.length,
			wz;
		if (cnt !== 1) {
			return -1;
		}
		wz = this.fm.getUI('workzone');
		return wz.hasClass('elfinder-search-result')? 0 : -1;
	};
	
	this.exec = function(hashes) {
		var fm    = this.fm,
			dfrd  = jQuery.Deferred(),
			files = this.files(hashes),
			cnt   = files.length,
			hash, pcheck = null;

		if (!cnt || !files[0].phash) {
			return dfrd.reject();
		}

		hash = files[0].phash;
		fm.trigger('searchend', { noupdate: true });
		fm.request({
			data   : {cmd  : 'open', target : hash},
			notify : {type : 'open', cnt : 1, hideCnt : true},
			syncOnFail : false
		});
		
		return dfrd;
	};

};


/*
 * File: /js/commands/opennew.js
 */

/**
 * @class  elFinder command "opennew"
 * Open folder in new window
 *
 * @author Naoki Sawada
 **/  
elFinder.prototype.commands.opennew = function() {
		var fm = this.fm;

	this.shortcuts = [{
		pattern  : (typeof(fm.options.getFileCallback) === 'function'? 'shift+' : '') + 'ctrl+enter'
	}];

	this.getstate = function(select) {
		var sel = this.files(select),
			cnt = sel.length;
		
		return cnt === 1 
			? (sel[0].mime === 'directory' && sel[0].read? 0 : -1) 
			: -1;
	};
	
	this.exec = function(hashes) {
		var dfrd  = jQuery.Deferred(),
			files = this.files(hashes),
			cnt   = files.length,
			opts  = this.options,
			file, loc, url, win;

		// open folder to new tab (window)
		if (cnt === 1 && (file = files[0]) && file.mime === 'directory') {
			loc = window.location;
			if (opts.url) {
				url = opts.url;
			} else {
				url = loc.pathname;
			}
			if (opts.useOriginQuery) {
				if (!url.match(/\?/)) {
					url += loc.search;
				} else if (loc.search) {
					url += '&' + loc.search.substr(1);
				}
			}
			url += '#elf_' + file.hash;
			win = window.open(url, '_blank');
			setTimeout(function() {
				win.focus();
			}, 1000);
			return dfrd.resolve();
		} else {
			return dfrd.reject();
		}
	};
};


/*
 * File: /js/commands/paste.js
 */

/**
 * @class  elFinder command "paste"
 * Paste filesfrom clipboard into directory.
 * If files pasted in its parent directory - files duplicates will created
 *
 * @author Dmitry (dio) Levashov
 **/
elFinder.prototype.commands.paste = function() {
		this.updateOnSelect  = false;
	
	this.handlers = {
		changeclipboard : function() { this.update(); }
	};

	this.shortcuts = [{
		pattern     : 'ctrl+v shift+insert'
	}];
	
	this.getstate = function(dst) {
		if (this._disabled) {
			return -1;
		}
		if (dst) {
			if (Array.isArray(dst)) {
				if (dst.length != 1) {
					return -1;
				}
				dst = this.fm.file(dst[0]);
			}
		} else {
			dst = this.fm.cwd();
		}

		return this.fm.clipboard().length && dst.mime == 'directory' && dst.write ? 0 : -1;
	};
	
	this.exec = function(select, cOpts) {
		var self   = this,
			fm     = self.fm,
			opts   = cOpts || {},
			dst    = select ? this.files(select)[0] : fm.cwd(),
			files  = fm.clipboard(),
			cnt    = files.length,
			cut    = cnt ? files[0].cut : false,
			cmd    = opts._cmd? opts._cmd : (cut? 'move' : 'copy'),
			error  = 'err' + cmd.charAt(0).toUpperCase() + cmd.substr(1),
			fpaste = [],
			fcopy  = [],
			dfrd   = jQuery.Deferred()
				.fail(function(error) {
					error && fm.error(error);
				})
				.always(function() {
					fm.unlockfiles({files : jQuery.map(files, function(f) { return f.hash; })});
				}),
			copy  = function(files) {
				return files.length && fm._commands.duplicate
					? fm.exec('duplicate', files)
					: jQuery.Deferred().resolve();
			},
			paste = function(files) {
				var dfrd      = jQuery.Deferred(),
					existed   = [],
					hashes  = {},
					intersect = function(files, names) {
						var ret = [], 
							i   = files.length;

						while (i--) {
							jQuery.inArray(files[i].name, names) !== -1 && ret.unshift(i);
						}
						return ret;
					},
					confirm   = function(ndx) {
						var i    = existed[ndx],
							file = files[i],
							last = ndx == existed.length-1;

						if (!file) {
							return;
						}

						fm.confirm({
							title  : fm.i18n(cmd + 'Files'),
							text   : ['errExists', file.name, cmd === 'restore'? 'confirmRest' : 'confirmRepl'], 
							all    : !last,
							accept : {
								label    : 'btnYes',
								callback : function(all) {
									!last && !all
										? confirm(++ndx)
										: paste(files);
								}
							},
							reject : {
								label    : 'btnNo',
								callback : function(all) {
									var i;

									if (all) {
										i = existed.length;
										while (ndx < i--) {
											files[existed[i]].remove = true;
										}
									} else {
										files[existed[ndx]].remove = true;
									}

									!last && !all
										? confirm(++ndx)
										: paste(files);
								}
							},
							cancel : {
								label    : 'btnCancel',
								callback : function() {
									dfrd.resolve();
								}
							},
							buttons : [
								{
									label : 'btnBackup',
									callback : function(all) {
										var i;
										if (all) {
											i = existed.length;
											while (ndx < i--) {
												files[existed[i]].rename = true;
											}
										} else {
											files[existed[ndx]].rename = true;
										}
										!last && !all
											? confirm(++ndx)
											: paste(files);
									}
								}
							]
						});
					},
					valid     = function(names) {
						var exists = {}, existedArr;
						if (names) {
							if (Array.isArray(names)) {
								if (names.length) {
									if (typeof names[0] == 'string') {
										// elFinder <= 2.1.6 command `is` results
										existed = intersect(files, names);
									} else {
										jQuery.each(names, function(i, v) {
											exists[v.name] = v.hash;
										});
										existed = intersect(files, jQuery.map(exists, function(h, n) { return n; }));
										jQuery.each(files, function(i, file) {
											if (exists[file.name]) {
												hashes[exists[file.name]] = file.name;
											}
										});
									}
								}
							} else {
								existedArr = [];
								existed = jQuery.map(names, function(n) {
									if (typeof n === 'string') {
										return n;
									} else {
										// support to >=2.1.11 plugin Normalizer, Sanitizer
										existedArr = existedArr.concat(n);
										return false;
									}
								});
								if (existedArr.length) {
									existed = existed.concat(existedArr);
								}
								existed = intersect(files, existed);
								hashes = names;
							}
						}
						existed.length ? confirm(0) : paste(files);
					},
					paste     = function(selFiles) {
						var renames = [],
							files  = jQuery.grep(selFiles, function(file) { 
								if (file.rename) {
									renames.push(file.name);
								}
								return !file.remove ? true : false;
							}),
							cnt    = files.length,
							groups = {},
							args   = [],
							targets, reqData;

						if (!cnt) {
							return dfrd.resolve();
						}

						targets = jQuery.map(files, function(f) { return f.hash; });
						
						reqData = {cmd : 'paste', dst : dst.hash, targets : targets, cut : cut ? 1 : 0, renames : renames, hashes : hashes, suffix : fm.options.backupSuffix};
						if (fm.api < 2.1) {
							reqData.src = files[0].phash;
						}
						
						fm.request({
								data   : reqData,
								notify : {type : cmd, cnt : cnt},
								navigate : { 
									toast  : opts.noToast? {} : {
										inbuffer : {msg: fm.i18n(['complete', fm.i18n('cmd' + cmd)]), action: {
											cmd: 'open',
											msg: 'cmdopendir',
											data: [dst.hash],
											done: 'select',
											cwdNot: dst.hash
										}}
									}
								}
							})
							.done(function(data) {
								var dsts = {},
									added = data.added && data.added.length? data.added : null;
								if (cut && added) {
									// undo/redo
									jQuery.each(files, function(i, f) {
										var phash = f.phash,
											srcHash = function(name) {
												var hash;
												jQuery.each(added, function(i, f) {
													if (f.name === name) {
														hash = f.hash;
														return false;
													}
												});
												return hash;
											},
											shash = srcHash(f.name);
										if (shash) {
											if (dsts[phash]) {
												dsts[phash].push(shash);
											} else {
												dsts[phash] = [ shash ];
											}
										}
									});
									if (Object.keys(dsts).length) {
										data.undo = {
											cmd : 'move',
											callback : function() {
												var reqs = [];
												jQuery.each(dsts, function(dst, targets) {
													reqs.push(fm.request({
														data : {cmd : 'paste', dst : dst, targets : targets, cut : 1},
														notify : {type : 'undo', cnt : targets.length}
													}));
												});
												return jQuery.when.apply(null, reqs);
											}
										};
										data.redo = {
											cmd : 'move',
											callback : function() {
												return fm.request({
													data : reqData,
													notify : {type : 'redo', cnt : cnt}
												});
											}
										};
									}
								}
								dfrd.resolve(data);
							})
							.fail(function() {
								dfrd.reject();
							})
							.always(function() {
								fm.unlockfiles({files : files});
							});
					},
					internames;

				if (!fm.isCommandEnabled(self.name, dst.hash) || !files.length) {
					return dfrd.resolve();
				}
				
				if (fm.oldAPI) {
					paste(files);
				} else {
					
					if (!fm.option('copyOverwrite', dst.hash)) {
						paste(files);
					} else {
						internames = jQuery.map(files, function(f) { return f.name; });
						dst.hash == fm.cwd().hash
							? valid(jQuery.map(fm.files(), function(file) { return file.phash == dst.hash ? {hash: file.hash, name: file.name} : null; }))
							: fm.request({
								data : {cmd : 'ls', target : dst.hash, intersect : internames},
								notify : {type : 'prepare', cnt : 1, hideCnt : true},
								preventFail : true
							})
							.always(function(data) {
								valid(data.list);
							});
					}
				}
				
				return dfrd;
			},
			parents, fparents;


		if (!cnt || !dst || dst.mime != 'directory') {
			return dfrd.reject();
		}
			
		if (!dst.write)	{
			return dfrd.reject([error, files[0].name, 'errPerm']);
		}
		
		parents = fm.parents(dst.hash);
		
		jQuery.each(files, function(i, file) {
			if (!file.read) {
				return !dfrd.reject([error, file.name, 'errPerm']);
			}
			
			if (cut && file.locked) {
				return !dfrd.reject(['errLocked', file.name]);
			}
			
			if (jQuery.inArray(file.hash, parents) !== -1) {
				return !dfrd.reject(['errCopyInItself', file.name]);
			}
			
			if (file.mime && file.mime !== 'directory' && ! fm.uploadMimeCheck(file.mime, dst.hash)) {
				return !dfrd.reject([error, file.name, 'errUploadMime']);
			}
			
			fparents = fm.parents(file.hash);
			fparents.pop();
			if (jQuery.inArray(dst.hash, fparents) !== -1) {
				
				if (jQuery.grep(fparents, function(h) { var d = fm.file(h); return d.phash == dst.hash && d.name == file.name ? true : false; }).length) {
					return !dfrd.reject(['errReplByChild', file.name]);
				}
			}
			
			if (file.phash == dst.hash) {
				fcopy.push(file.hash);
			} else {
				fpaste.push({
					hash  : file.hash,
					phash : file.phash,
					name  : file.name
				});
			}
		});

		if (dfrd.state() == 'rejected') {
			return dfrd;
		}

		jQuery.when(
			copy(fcopy),
			paste(fpaste)
		)
		.done(function(cr, pr) {
			dfrd.resolve(pr && pr.undo? pr : void(0));
		})
		.fail(function() {
			dfrd.reject();
		})
		.always(function() {
			cut && fm.clipboard([]);
		});
		
		return dfrd;
	};

};


/*
 * File: /js/commands/places.js
 */

/**
 * @class  elFinder command "places"
 * Regist to Places
 *
 * @author Naoki Sawada
 **/
elFinder.prototype.commands.places = function() {
		var self   = this,
	fm     = this.fm,
	filter = function(hashes) {
		return jQuery.grep(self.files(hashes), function(f) { return f.mime == 'directory' ? true : false; });
	},
	places = null;
	
	this.getstate = function(select) {
		var sel = this.hashes(select),
		cnt = sel.length;
		
		return  places && cnt && cnt == filter(sel).length ? 0 : -1;
	};
	
	this.exec = function(hashes) {
		var files = this.files(hashes);
		places.trigger('regist', [ files ]);
		return jQuery.Deferred().resolve();
	};
	
	fm.one('load', function(){
		places = fm.ui.places;
	});

};


/*
 * File: /js/commands/preference.js
 */

/**
 * @class  elFinder command "preference"
 * "Preference" dialog
 *
 * @author Naoki Sawada
 **/
elFinder.prototype.commands.preference = function() {
	var self    = this,
		fm      = this.fm,
		r       = 'replace',
		tab     = '<li class="' + fm.res('class', 'tabstab') + ' elfinder-preference-tab-{id}"><a href="#'+fm.namespace+'-preference-{id}" id="'+fm.namespace+'-preference-tab-{id}" class="ui-tabs-anchor {class}">{title}</a></li>',
		base    = jQuery('<div class="ui-tabs ui-widget ui-widget-content ui-corner-all elfinder-preference">'), 
		ul      = jQuery('<ul class="ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-top">'),
		tabs    = jQuery('<div class="elfinder-preference-tabs ui-tabs-panel ui-widget-content ui-corner-bottom"/>'),
		sep     = '<div class="elfinder-preference-separator"/>',
		selfUrl = jQuery('base').length? document.location.href.replace(/#.*$/, '') : '',
		selectTab = function(tab) {
			jQuery('#'+fm.namespace+'-preference-tab-'+tab).trigger('mouseover').trigger('click');
			openTab = tab;
		},
		clTabActive = fm.res('class', 'tabsactive'),
		build   = function() {
			var cats = self.options.categories || {
					'language' : ['language'],
					'theme' : ['theme'],
					'toolbar' : ['toolbarPref'],
					'workspace' : ['iconSize','columnPref', 'selectAction', 'makefileTypes', 'useStoredEditor', 'editorMaximized', 'showHidden'],
					'dialog' : ['autoFocusDialog'],
					'selectionInfo' : ['infoItems', 'hashChecker'],
					'reset' : ['clearBrowserData'],
					'all' : true
				},
				forms = self.options.prefs || ['language', 'theme', 'toolbarPref', 'iconSize', 'columnPref', 'selectAction', 'makefileTypes', 'useStoredEditor', 'editorMaximized', 'showHidden', 'infoItems', 'hashChecker', 'autoFocusDialog', 'clearBrowserData'];
			
			forms = fm.arrayFlip(forms, true);
			
			if (fm.options.getFileCallback) {
				delete forms.selectAction;
			}
			
			forms.language && (forms.language = (function() {
				var langSel = jQuery('<select/>').on('change', function() {
						var lang = jQuery(this).val();
						fm.storage('lang', lang);
						jQuery('#'+fm.id).elfinder('reload');
					}),
					optTags = [],
					langs = self.options.langs || {
						ar: 'اللغة العربية',
						bg: 'Български',
						ca: 'Català',
						cs: 'Čeština',
						da: 'Dansk',
						de: 'Deutsch',
						el: 'Ελληνικά',
						en: 'English',
						es: 'Español',
						fa: 'فارسی',
						fo: 'Føroyskt',
						fr: 'Français',
						he: 'עברית',
						hr: 'Hrvatski',
						hu: 'Magyar',
						id: 'Bahasa Indonesia',
						it: 'Italiano',
						ja: '日本語',
						ko: '한국어',
						nl: 'Nederlands',
						no: 'Norsk',
						pl: 'Polski',
						pt_BR: 'Português',
						ro: 'Română',
						ru: 'Pусский',
						si: 'සිංහල',
						sk: 'Slovenčina',
						sl: 'Slovenščina',
						sr: 'Srpski',
						sv: 'Svenska',
						tr: 'Türkçe',
						ug_CN: 'ئۇيغۇرچە',
						uk: 'Український',
						vi: 'Tiếng Việt',
						zh_CN: '简体中文',
						zh_TW: '正體中文'
					};
				jQuery.each(langs, function(lang, name) {
					optTags.push('<option value="'+lang+'">'+name+'</option>');
				});
				return langSel.append(optTags.join('')).val(fm.lang);
			})());
			
			forms.theme && (forms.theme = (function() {
				var cnt = fm.options.themes? Object.keys(fm.options.themes).length : 0;
				if (cnt === 0 || (cnt === 1 && fm.options.themes.default)) {
					return null;
				}
				var themeSel = jQuery('<select/>').on('change', function() {
						var theme = jQuery(this).val();
						fm.changeTheme(theme).storage('theme', theme);
					}),
					optTags = [],
					tpl = {
						image: '<img class="elfinder-preference-theme elfinder-preference-theme-image" src="$2" />',
						link: '<a href="$1" target="_blank" title="$3">$2</a>',
						data: '<dt>$1</dt><dd><span class="elfinder-preference-theme elfinder-preference-theme-$0">$2</span></dd>'
					},
					items = ['image', 'description', 'author', 'email', 'license'],
					render = function(key, data) {
					},
					defBtn = jQuery('<button class="ui-button ui-corner-all ui-widget elfinder-preference-theme-default"/>').text(fm.i18n('default')).on('click', function(e) {
						themeSel.val('default').trigger('change');
					}),
					list = jQuery('<div class="elfinder-reference-hide-taball"/>').on('click', 'button', function() {
							var val = jQuery(this).data('themeid');
							themeSel.val(val).trigger('change');
					});

				if (!fm.options.themes.default) {
					themeSel.append('<option value="default">'+fm.i18n('default')+'</option>');
				}
				jQuery.each(fm.options.themes, function(id, val) {
					var opt = jQuery('<option class="elfinder-theme-option-'+id+'" value="'+id+'">'+fm.i18n(id)+'</option>'),
						dsc = jQuery('<fieldset class="ui-widget ui-widget-content ui-corner-all elfinder-theme-list-'+id+'"><legend>'+fm.i18n(id)+'</legend><div><span class="elfinder-spinner"/></div></fieldset>'),
						tm;
					themeSel.append(opt);
					list.append(dsc);
					tm = setTimeout(function() {
						dsc.find('span.elfinder-spinner').replaceWith(fm.i18n(['errRead', id]));
					}, 10000);
					fm.getTheme(id).always(function() {
						tm && clearTimeout(tm);
					}).done(function(data) {
						var link, val = jQuery(), dl = jQuery('<dl/>');
						link = data.link? tpl.link.replace(/\$1/g, data.link).replace(/\$3/g, fm.i18n('website')) : '$2';
						if (data.name) {
							opt.html(fm.i18n(data.name));
						}
						dsc.children('legend').html(link.replace(/\$2/g, fm.i18n(data.name) || id));
						jQuery.each(items, function(i, key) {
							var t = tpl[key] || tpl.data,
								elm;
							if (data[key]) {
								elm = t.replace(/\$0/g, fm.escape(key)).replace(/\$1/g, fm.i18n(key)).replace(/\$2/g, fm.i18n(data[key]));
								if (key === 'image' && data.link) {
									elm = jQuery(elm).on('click', function() {
										themeSel.val(id).trigger('change');
									}).attr('title', fm.i18n('select'));
								}
								dl.append(elm);
							}
						});
						val = val.add(dl);
						val = val.add(jQuery('<div class="elfinder-preference-theme-btn"/>').append(jQuery('<button class="ui-button ui-corner-all ui-widget"/>').data('themeid', id).html(fm.i18n('select'))));
						dsc.find('span.elfinder-spinner').replaceWith(val);
					}).fail(function() {
						dsc.find('span.elfinder-spinner').replaceWith(fm.i18n(['errRead', id]));
					});
				});
				return jQuery('<div/>').append(themeSel.val(fm.theme && fm.theme.id? fm.theme.id : 'default'), defBtn, list);
			})());

			forms.toolbarPref && (forms.toolbarPref = (function() {
				var pnls = jQuery.map(fm.options.uiOptions.toolbar, function(v) {
						return jQuery.isArray(v)? v : null;
					}),
					tags = [],
					hides = fm.storage('toolbarhides') || {};
				jQuery.each(pnls, function() {
					var cmd = this,
						name = fm.i18n('cmd'+cmd);
					if (name === 'cmd'+cmd) {
						name = fm.i18n(cmd);
					}
					tags.push('<span class="elfinder-preference-toolbar-item"><label><input type="checkbox" value="'+cmd+'" '+(hides[cmd]? '' : 'checked')+'/>'+name+'</label></span>');
				});
				return jQuery(tags.join(' ')).on('change', 'input', function() {
					var v = jQuery(this).val(),
						o = jQuery(this).is(':checked');
					if (!o && !hides[v]) {
						hides[v] = true;
					} else if (o && hides[v]) {
						delete hides[v];
					}
					fm.storage('toolbarhides', hides);
					fm.trigger('toolbarpref');
				});
			})());
			
			forms.iconSize && (forms.iconSize = (function() {
				var max = fm.options.uiOptions.cwd.iconsView.sizeMax || 3,
					size = fm.storage('iconsize') || 0,
					sld = jQuery('<div class="touch-punch"/>').slider({
						classes: {
							'ui-slider-handle': 'elfinder-tabstop',
						},
						value: size,
						max: max,
						slide: function(e, ui) {
							fm.getUI('cwd').trigger('iconpref', {size: ui.value});
						},
						change: function(e, ui) {
							fm.storage('iconsize', ui.value);
						}
					});
				fm.getUI('cwd').on('iconpref', function(e, data) {
					sld.slider('option', 'value', data.size);
				});
				return sld;
			})());

			forms.columnPref && (forms.columnPref = (function() {
				var cols = fm.options.uiOptions.cwd.listView.columns,
					tags = [],
					hides = fm.storage('columnhides') || {};
				jQuery.each(cols, function() {
					var key = this,
						name = fm.getColumnName(key);
					tags.push('<span class="elfinder-preference-column-item"><label><input type="checkbox" value="'+key+'" '+(hides[key]? '' : 'checked')+'/>'+name+'</label></span>');
				});
				return jQuery(tags.join(' ')).on('change', 'input', function() {
					var v = jQuery(this).val(),
						o = jQuery(this).is(':checked');
					if (!o && !hides[v]) {
						hides[v] = true;
					} else if (o && hides[v]) {
						delete hides[v];
					}
					fm.storage('columnhides', hides);
					fm.trigger('columnpref', { repaint: true });
				});
			})());
			
			forms.selectAction && (forms.selectAction = (function() {
				var actSel = jQuery('<select/>').on('change', function() {
						var act = jQuery(this).val();
						fm.storage('selectAction', act === 'default'? null : act);
					}),
					optTags = [],
					acts = self.options.selectActions,
					defAct = fm.getCommand('open').options.selectAction || 'open';
				
				if (jQuery.inArray(defAct, acts) === -1) {
					acts.unshift(defAct);
				}
				jQuery.each(acts, function(i, act) {
					var names = jQuery.map(act.split('/'), function(cmd) {
						var name = fm.i18n('cmd'+cmd);
						if (name === 'cmd'+cmd) {
							name = fm.i18n(cmd);
						}
						return name;
					});
					optTags.push('<option value="'+act+'">'+names.join('/')+'</option>');
				});
				return actSel.append(optTags.join('')).val(fm.storage('selectAction') || defAct);
			})());
			
			forms.makefileTypes && (forms.makefileTypes = (function() {
				var hides = fm.storage('mkfileHides') || {},
					getTag = function() {
						var tags = [];
						// re-assign hides
						hides = fm.storage('mkfileHides') || {};
						jQuery.each(fm.mimesCanMakeEmpty, function(mime, type) {
							var name = fm.getCommand('mkfile').getTypeName(mime, type);
							tags.push('<span class="elfinder-preference-column-item" title="'+fm.escape(name)+'"><label><input type="checkbox" value="'+mime+'" '+(hides[mime]? '' : 'checked')+'/>'+type+'</label></span>');
						});
						return tags.join(' ');
					},
					elm = jQuery('<div/>').on('change', 'input', function() {
						var v = jQuery(this).val(),
							o = jQuery(this).is(':checked');
						if (!o && !hides[v]) {
							hides[v] = true;
						} else if (o && hides[v]) {
							delete hides[v];
						}
						fm.storage('mkfileHides', hides);
						fm.trigger('canMakeEmptyFile');
					}).append(getTag()),
					add = jQuery('<div/>').append(
						jQuery('<input type="text" placeholder="'+fm.i18n('typeOfTextfile')+'"/>').on('keydown', function(e) {
							(e.keyCode === jQuery.ui.keyCode.ENTER) && jQuery(this).next().trigger('click');
						}),
						jQuery('<button class="ui-button"/>').html(fm.i18n('add')).on('click', function() {
							var input = jQuery(this).prev(),
								val = input.val(),
								uiToast = fm.getUI('toast'),
								err = function() {
									uiToast.appendTo(input.closest('.ui-dialog'));
									fm.toast({
										msg: fm.i18n('errUsupportType'),
										mode: 'warning',
										onHidden: function() {
											uiToast.children().length === 1 && uiToast.appendTo(fm.getUI());
										}
									});
									input.trigger('focus');
									return false;
								},
								tmpMimes;
							if (!val.match(/\//)) {
								val = fm.arrayFlip(fm.mimeTypes)[val];
								if (!val) {
									return err();
								}
								input.val(val);
							}
							if (!fm.mimeIsText(val) || !fm.mimeTypes[val]) {
								return err();
							}
							fm.trigger('canMakeEmptyFile', {mimes: [val], unshift: true});
							tmpMimes = {};
							tmpMimes[val] = fm.mimeTypes[val];
							fm.storage('mkfileTextMimes', Object.assign(tmpMimes, fm.storage('mkfileTextMimes') || {}));
							input.val('');
							uiToast.appendTo(input.closest('.ui-dialog'));
							fm.toast({
								msg: fm.i18n(['complete', val + ' (' + tmpMimes[val] + ')']),
								onHidden: function() {
									uiToast.children().length === 1 && uiToast.appendTo(fm.getUI());
								}
							});
						}),
						jQuery('<button class="ui-button"/>').html(fm.i18n('reset')).on('click', function() {
							fm.one('canMakeEmptyFile', {done: function() {
								elm.empty().append(getTag());
							}});
							fm.trigger('canMakeEmptyFile', {resetTexts: true});
						})
					),
					tm;
				fm.bind('canMakeEmptyFile', {done: function(e) {
					if (e.data && e.data.mimes && e.data.mimes.length) {
						elm.empty().append(getTag());
					}
				}});
				return jQuery('<div/>').append(elm, add);
			})());

			forms.useStoredEditor && (forms.useStoredEditor = jQuery('<input type="checkbox"/>').prop('checked', (function() {
				var s = fm.storage('useStoredEditor');
				return s? (s > 0) : fm.options.commandsOptions.edit.useStoredEditor;
			})()).on('change', function(e) {
				fm.storage('useStoredEditor', jQuery(this).is(':checked')? 1 : -1);
			}));

			forms.editorMaximized && (forms.editorMaximized = jQuery('<input type="checkbox"/>').prop('checked', (function() {
				var s = fm.storage('editorMaximized');
				return s? (s > 0) : fm.options.commandsOptions.edit.editorMaximized;
			})()).on('change', function(e) {
				fm.storage('editorMaximized', jQuery(this).is(':checked')? 1 : -1);
			}));

			if (forms.showHidden) {
				(function() {
					var setTitle = function() {
							var s = fm.storage('hide'),
								t = [],
								v;
							if (s && s.items) {
								jQuery.each(s.items, function(h, n) {
									t.push(fm.escape(n));
								});
							}
							elms.prop('disabled', !t.length)[t.length? 'removeClass' : 'addClass']('ui-state-disabled');
							v = t.length? t.join('\n') : '';
							forms.showHidden.attr('title',v);
							useTooltip && forms.showHidden.tooltip('option', 'content', v.replace(/\n/g, '<br>')).tooltip('close');
						},
						chk = jQuery('<input type="checkbox"/>').prop('checked', (function() {
							var s = fm.storage('hide');
							return s && s.show;
						})()).on('change', function(e) {
							var o = {};
							o[jQuery(this).is(':checked')? 'show' : 'hide'] = true;
							fm.exec('hide', void(0), o);
						}),
						btn = jQuery('<button class="ui-button ui-corner-all ui-widget"/>').append(fm.i18n('reset')).on('click', function() {
							fm.exec('hide', void(0), {reset: true});
							jQuery(this).parent().find('input:first').prop('checked', false);
							setTitle();
						}),
						elms = jQuery().add(chk).add(btn),
						useTooltip;
					
					forms.showHidden = jQuery('<div/>').append(chk, btn);
					fm.bind('hide', function(e) {
						var d = e.data;
						if (!d.opts || (!d.opts.show && !d.opts.hide)) {
							setTitle();
						}
					});
					if (fm.UA.Mobile && jQuery.fn.tooltip) {
						useTooltip = true;
						forms.showHidden.tooltip({
							classes: {
								'ui-tooltip': 'elfinder-ui-tooltip ui-widget-shadow'
							},
							tooltipClass: 'elfinder-ui-tooltip ui-widget-shadow',
							track: true
						}).css('user-select', 'none');
						btn.css('user-select', 'none');
					}
					setTitle();
				})();
			}
			
			forms.infoItems && (forms.infoItems = (function() {
				var items = fm.getCommand('info').items,
					tags = [],
					hides = fm.storage('infohides') || fm.arrayFlip(fm.options.commandsOptions.info.hideItems, true);
				jQuery.each(items, function() {
					var key = this,
						name = fm.i18n(key);
					tags.push('<span class="elfinder-preference-info-item"><label><input type="checkbox" value="'+key+'" '+(hides[key]? '' : 'checked')+'/>'+name+'</label></span>');
				});
				return jQuery(tags.join(' ')).on('change', 'input', function() {
					var v = jQuery(this).val(),
						o = jQuery(this).is(':checked');
					if (!o && !hides[v]) {
						hides[v] = true;
					} else if (o && hides[v]) {
						delete hides[v];
					}
					fm.storage('infohides', hides);
					fm.trigger('infopref', { repaint: true });
				});
			})());
			
			forms.hashChecker && fm.hashCheckers.length && (forms.hashChecker = (function() {
				var tags = [],
					enabled = fm.arrayFlip(fm.storage('hashchekcer') || fm.options.commandsOptions.info.showHashAlgorisms, true);
				jQuery.each(fm.hashCheckers, function() {
					var cmd = this,
						name = fm.i18n(cmd);
					tags.push('<span class="elfinder-preference-hashchecker-item"><label><input type="checkbox" value="'+cmd+'" '+(enabled[cmd]? 'checked' : '')+'/>'+name+'</label></span>');
				});
				return jQuery(tags.join(' ')).on('change', 'input', function() {
					var v = jQuery(this).val(),
						o = jQuery(this).is(':checked');
					if (o) {
						enabled[v] = true;
					} else if (enabled[v]) {
						delete enabled[v];
					}
					fm.storage('hashchekcer', jQuery.grep(fm.hashCheckers, function(v) {
						return enabled[v];
					}));
				});
			})());

			forms.autoFocusDialog && (forms.autoFocusDialog = jQuery('<input type="checkbox"/>').prop('checked', (function() {
				var s = fm.storage('autoFocusDialog');
				return s? (s > 0) : fm.options.uiOptions.dialog.focusOnMouseOver;
			})()).on('change', function(e) {
				fm.storage('autoFocusDialog', jQuery(this).is(':checked')? 1 : -1);
			}));
			
			forms.clearBrowserData && (forms.clearBrowserData = jQuery('<button/>').text(fm.i18n('reset')).button().on('click', function(e) {
				e.preventDefault();
				fm.storage();
				jQuery('#'+fm.id).elfinder('reload');
			}));
			
			jQuery.each(cats, function(id, prefs) {
				var dls, found;
				if (prefs === true) {
					found = 1;
				} else if (prefs) {
					dls = jQuery();
					jQuery.each(prefs, function(i, n) {
						var f, title, chks = '', cbox;
						if (f = forms[n]) {
							found = 2;
							title = fm.i18n(n);
							cbox = jQuery(f).filter('input[type="checkbox"]');
							if (!cbox.length) {
								cbox = jQuery(f).find('input[type="checkbox"]');
							}
							if (cbox.length === 1) {
								if (!cbox.attr('id')) {
									cbox.attr('id', 'elfinder-preference-'+n+'-checkbox');
								}
								title = '<label for="'+cbox.attr('id')+'">'+title+'</label>';
							} else if (cbox.length > 1) {
								chks = ' elfinder-preference-checkboxes';
							}
							dls = dls.add(jQuery('<dt class="elfinder-preference-'+n+chks+'">'+title+'</dt>')).add(jQuery('<dd class="elfinder-preference-'+n+chks+'"/>').append(f));
						}
					});
				}
				if (found) {
					ul.append(tab[r](/\{id\}/g, id)[r](/\{title\}/, fm.i18n(id))[r](/\{class\}/, openTab === id? 'elfinder-focus' : ''));
					if (found === 2) {
						tabs.append(
							jQuery('<div id="'+fm.namespace+'-preference-'+id+'" class="elfinder-preference-content"/>')
							.hide()
							.append(jQuery('<dl/>').append(dls))
						);
					}
				}
			});

			ul.on('click', 'a', function(e) {
				var t = jQuery(e.target),
					h = t.attr('href');
				e.preventDefault();
				e.stopPropagation();

				ul.children().removeClass(clTabActive);
				t.removeClass('ui-state-hover').parent().addClass(clTabActive);

				if (h.match(/all$/)) {
					tabs.addClass('elfinder-preference-taball').children().show();
				} else {
					tabs.removeClass('elfinder-preference-taball').children().hide();
					jQuery(h).show();
				}
			}).on('focus blur', 'a', function(e) {
				jQuery(this).parent().toggleClass('ui-state-focus', e.type === 'focusin');
			}).on('mouseenter mouseleave', 'li', function(e) {
				jQuery(this).toggleClass('ui-state-hover', e.type === 'mouseenter');
			});

			tabs.find('a,input,select,button').addClass('elfinder-tabstop');
			base.append(ul, tabs);

			dialog = self.fmDialog(base, {
				title : self.title,
				width : self.options.width || 600,
				height: self.options.height || 400,
				maxWidth: 'window',
				maxHeight: 'window',
				autoOpen : false,
				destroyOnClose : false,
				allowMinimize : false,
				open : function() {
					openTab && selectTab(openTab);
					openTab = null;
				},
				resize : function() {
					tabs.height(dialog.height() - ul.outerHeight(true) - (tabs.outerHeight(true) - tabs.height()) - 5);
				}
			})
			.on('click', function(e) {
				e.stopPropagation();
			})
			.css({
				overflow: 'hidden'
			});

			dialog.closest('.ui-dialog')
			.css({
				overflow: 'hidden'
			})
			.addClass('elfinder-bg-translucent');
			
			openTab = 'all';
		},
		dialog, openTab;

	this.shortcuts = [{
		pattern     : 'ctrl+comma',
		description : this.title
	}];

	this.alwaysEnabled  = true;
	
	this.getstate = function() {
		return 0;
	};
	
	this.exec = function(sel, cOpts) {
		!dialog && build();
		if (cOpts) {
			if (cOpts.tab) {
				selectTab(cOpts.tab);
			} else if (cOpts._currentType === 'cwd') {
				selectTab('workspace');
			}
		}
		dialog.elfinderdialog('open');
		return jQuery.Deferred().resolve();
	};

};

/*
 * File: /js/commands/quicklook.js
 */

/**
 * @class  elFinder command "quicklook"
 * Fast preview for some files types
 *
 * @author Dmitry (dio) Levashov
 **/
(elFinder.prototype.commands.quicklook = function() {
		var self       = this,
		fm         = self.fm,
		/**
		 * window closed state
		 *
		 * @type Number
		 **/
		closed     = 0,
		/**
		 * window animated state
		 *
		 * @type Number
		 **/
		animated   = 1,
		/**
		 * window opened state
		 *
		 * @type Number
		 **/
		opened     = 2,
		/**
		 * window docked state
		 *
		 * @type Number
		 **/
		docked     = 3,
		/**
		 * window docked and hidden state
		 *
		 * @type Number
		 **/
		dockedhidden = 4,
		/**
		 * window state
		 *
		 * @type Number
		 **/
		state      = closed,
		/**
		 * Event name of update
		 * for fix conflicts with Prototype.JS
		 * 
		 * `@see https://github.com/Studio-42/elFinder/pull/2346
		 * @type String
		 **/
		evUpdate = Element.update? 'quicklookupdate' : 'update',
		/**
		 * navbar icon class
		 *
		 * @type String
		 **/
		navicon    = 'elfinder-quicklook-navbar-icon',
		/**
		 * navbar "fullscreen" icon class
		 *
		 * @type String
		 **/
		fullscreen = 'elfinder-quicklook-fullscreen',
		/**
		 * info wrapper class
		 * 
		 * @type String
		 */
		infocls    = 'elfinder-quicklook-info-wrapper',
		/**
		 * Triger keydown/keypress event with left/right arrow key code
		 *
		 * @param  Number  left/right arrow key code
		 * @return void
		 **/
		navtrigger = function(code) {
			jQuery(document).trigger(jQuery.Event('keydown', { keyCode: code, ctrlKey : false, shiftKey : false, altKey : false, metaKey : false }));
		},
		/**
		 * Return css for closed window
		 *
		 * @param  jQuery  file node in cwd
		 * @return void
		 **/
		closedCss = function(node) {
			var elf = fm.getUI().offset(),
				base = (function() {
					var target = node.find('.elfinder-cwd-file-wrapper');
					return target.length? target : node;
				})(),
				baseOffset = base.offset() || { top: 0, left: 0 };
			return {
				opacity : 0,
				width   : base.width(),
				height  : base.height() - 30,
				top     : baseOffset.top - elf.top,
				left    : baseOffset.left  - elf.left
			};
		},
		/**
		 * Return css for opened window
		 *
		 * @return void
		 **/
		openedCss = function() {
			var contain = self.options.contain,
				win = contain? fm.getUI() : jQuery(window),
				elf = fm.getUI().offset(),
				w = Math.min(width, win.width()-10),
				h = Math.min(height, win.height()-80);
			return {
				opacity : 1,
				width  : w,
				height : h,
				top    : parseInt((win.height() - h - 60) / 2 + (contain? 0 : win.scrollTop() - elf.top)),
				left   : parseInt((win.width() - w) / 2 + (contain? 0 : win.scrollLeft() - elf.left))
			};
		},
		
		mediaNode = {},
		support = function(codec, name) {
			var node  = name || codec.substr(0, codec.indexOf('/')),
				media = mediaNode[node]? mediaNode[node] : (mediaNode[node] = document.createElement(node)),
				value = false;
			
			try {
				value = media.canPlayType && media.canPlayType(codec);
			} catch(e) {}
			
			return (value && value !== '' && value != 'no')? true : false;
		},
		
		platformWin = (window.navigator.platform.indexOf('Win') != -1),
		
		/**
		 * Opened window width (from config)
		 *
		 * @type Number
		 **/
		width, 
		/**
		 * Opened window height (from config)
		 *
		 * @type Number
		 **/
		height, 
		/**
		 * Previous style before docked
		 *
		 * @type String
		 **/
		prevStyle,
		/**
		 * elFinder node
		 *
		 * @type jQuery
		 **/
		parent, 
		/**
		 * elFinder current directory node
		 *
		 * @type jQuery
		 **/
		cwd, 
		/**
		 * Current directory hash
		 *
		 * @type String
		 **/
		cwdHash,
		dockEnabled = false,
		navdrag = false,
		navmove = false,
		navtm   = null,
		leftKey = jQuery.ui.keyCode.LEFT,
		rightKey = jQuery.ui.keyCode.RIGHT,
		coverEv = 'mousemove touchstart ' + ('onwheel' in document? 'wheel' : 'onmousewheel' in document? 'mousewheel' : 'DOMMouseScroll'),
		title   = jQuery('<span class="elfinder-dialog-title elfinder-quicklook-title"/>'),
		icon    = jQuery('<div/>'),
		info    = jQuery('<div class="elfinder-quicklook-info"/>'),//.hide(),
		cover   = jQuery('<div class="ui-front elfinder-quicklook-cover"/>'),
		fsicon  = jQuery('<div class="'+navicon+' '+navicon+'-fullscreen"/>')
			.on('click touchstart', function(e) {
				if (navmove) {
					return;
				}
				
				var win     = self.window,
					full    = win.hasClass(fullscreen),
					$window = jQuery(window),
					resize  = function() { self.preview.trigger('changesize'); };
					
				e.stopPropagation();
				e.preventDefault();
				
				if (full) {
					navStyle = '';
					navShow();
					win.toggleClass(fullscreen)
					.css(win.data('position'));
					$window.trigger(self.resize).off(self.resize, resize);
					navbar.off('mouseenter mouseleave');
					cover.off(coverEv);
				} else {
					win.toggleClass(fullscreen)
					.data('position', {
						left   : win.css('left'), 
						top    : win.css('top'), 
						width  : win.width(), 
						height : win.height(),
						display: 'block'
					})
					.removeAttr('style');

					jQuery(window).on(self.resize, resize)
					.trigger(self.resize);

					cover.on(coverEv, function(e) {
						if (! navdrag) {
							if (e.type === 'mousemove' || e.type === 'touchstart') {
								navShow();
								navtm = setTimeout(function() {
									if (fm.UA.Mobile || navbar.parent().find('.elfinder-quicklook-navbar:hover').length < 1) {
										navbar.fadeOut('slow', function() {
											cover.show();
										});
									}
								}, 3000);
							}
							if (cover.is(':visible')) {
								coverHide();
								cover.data('tm', setTimeout(function() {
									cover.show();
								}, 3000));
							}
						}
					}).show().trigger('mousemove');
					
					navbar.on('mouseenter mouseleave', function(e) {
						if (! navdrag) {
							if (e.type === 'mouseenter') {
								navShow();
							} else {
								cover.trigger('mousemove');
							}
						}
					});
				}
				if (fm.zIndex) {
					win.css('z-index', fm.zIndex + 1);
				}
				if (fm.UA.Mobile) {
					navbar.attr('style', navStyle);
				} else {
					navbar.attr('style', navStyle).draggable(full ? 'destroy' : {
						start: function() {
							navdrag = true;
							navmove = true;
							cover.show();
							navShow();
						},
						stop: function() {
							navdrag = false;
							navStyle = self.navbar.attr('style');
							requestAnimationFrame(function() {
								navmove = false;
							});
						}
					});
				}
				jQuery(this).toggleClass(navicon+'-fullscreen-off');
				var collection = win;
				if (parent.is('.ui-resizable')) {
					collection = collection.add(parent);
				}
				collection.resizable(full ? 'enable' : 'disable').removeClass('ui-state-disabled');

				win.trigger('viewchange');
			}
		),
		
		updateOnSel = function() {
			self.update(void(0), (function() {
				var fm = self.fm,
					files = fm.selectedFiles(),
					cnt = files.length,
					inDock = self.docked(),
					getInfo = function() {
						var ts = 0;
						jQuery.each(files, function(i, f) {
							var t = parseInt(f.ts);
							if (ts >= 0) {
								if (t > ts) {
									ts = t;
								}
							} else {
								ts = 'unknown';
							}
						});
						return {
							hash : files[0].hash  + '/' + (+new Date()),
							name : fm.i18n('items') + ': ' + cnt,
							mime : 'group',
							size : spinner,
							ts   : ts,
							files : jQuery.map(files, function(f) { return f.hash; }),
							getSize : true
						};
					};
				if (! cnt) {
					cnt = 1;
					files = [fm.cwd()];
				}
				return (cnt === 1)? files[0] : getInfo();
			})());
		},
		
		navShow = function() {
			if (self.window.hasClass(fullscreen)) {
				navtm && clearTimeout(navtm);
				navtm = null;
				// if use `show()` it make infinite loop with old jQuery (jQuery/jQuery UI: 1.8.0/1.9.0)
				// see #1478 https://github.com/Studio-42/elFinder/issues/1478
				navbar.stop(true, true).css('display', 'block');
				coverHide();
			}
		},
		
		coverHide = function() {
			cover.data('tm') && clearTimeout(cover.data('tm'));
			cover.removeData('tm');
			cover.hide();
		},
			
		prev = jQuery('<div class="'+navicon+' '+navicon+'-prev"/>').on('click touchstart', function(e) { ! navmove && navtrigger(leftKey); return false; }),
		next = jQuery('<div class="'+navicon+' '+navicon+'-next"/>').on('click touchstart', function(e) { ! navmove && navtrigger(rightKey); return false; }),
		navbar  = jQuery('<div class="elfinder-quicklook-navbar"/>')
			.append(prev)
			.append(fsicon)
			.append(next)
			.append('<div class="elfinder-quicklook-navbar-separator"/>')
			.append(jQuery('<div class="'+navicon+' '+navicon+'-close"/>').on('click touchstart', function(e) { ! navmove && self.window.trigger('close'); return false; }))
		,
		titleClose = jQuery('<span class="ui-front ui-icon elfinder-icon-close ui-icon-closethick"/>').on('mousedown', function(e) {
			e.stopPropagation();
			self.window.trigger('close');
		}),
		titleDock = jQuery('<span class="ui-front ui-icon elfinder-icon-minimize ui-icon-minusthick"/>').on('mousedown', function(e) {
			e.stopPropagation();
			if (! self.docked()) {
				self.window.trigger('navdockin');
			} else {
				self.window.trigger('navdockout');
			}
		}),
		spinner = '<span class="elfinder-spinner-text">' + fm.i18n('calc') + '</span>' + '<span class="elfinder-spinner"/>',
		navStyle = '',
		init = true,
		dockHeight,	getSize, tm4cwd, dockedNode, selectTm;

	this.cover = cover;
	this.evUpdate = evUpdate;
	(this.navbar = navbar)._show = navShow;
	this.resize = 'resize.'+fm.namespace;
	this.info = jQuery('<div/>').addClass(infocls)
		.append(icon)
		.append(info);
	this.autoPlay = function() {
		if (self.opened()) {
			return !! self.options[self.docked()? 'dockAutoplay' : 'autoplay'];
		}
		return false;
	};
	this.preview = jQuery('<div class="elfinder-quicklook-preview ui-helper-clearfix"/>')
		// clean info/icon
		.on('change', function() {
			navShow();
			navbar.attr('style', navStyle);
			self.docked() && navbar.hide();
			self.preview.attr('style', '').removeClass('elfinder-overflow-auto');
			self.info.attr('style', '').hide();
			self.cover.removeClass('elfinder-quicklook-coverbg');
			icon.removeAttr('class').attr('style', '');
			info.html('');
		})
		// update info/icon
		.on(evUpdate, function(e) {
			var preview = self.preview,
				file    = e.file,
				tpl     = '<div class="elfinder-quicklook-info-data">{value}</div>',
				update  = function() {
					var win = self.window.css('overflow', 'hidden');
					name = fm.escape(file.i18 || file.name);
					!file.read && e.stopImmediatePropagation();
					self.window.data('hash', file.hash);
					self.preview.off('changesize').trigger('change').children().remove();
					title.html(name);
					
					prev.css('visibility', '');
					next.css('visibility', '');
					if (file.hash === fm.cwdId2Hash(cwd.find('[id]:not(.elfinder-cwd-parent):first').attr('id'))) {
						prev.css('visibility', 'hidden');
					}
					if (file.hash === fm.cwdId2Hash(cwd.find('[id]:last').attr('id'))) {
						next.css('visibility', 'hidden');
					}
					
					if (file.mime === 'directory') {
						getSizeHashes = [ file.hash ];
					} else if (file.mime === 'group' && file.getSize) {
						getSizeHashes = file.files;
					}
					
					info.html(
						tpl.replace(/\{value\}/, name)
						+ tpl.replace(/\{value\}/, fm.mime2kind(file))
						+ tpl.replace(/\{value\}/, getSizeHashes.length ? spinner : fm.formatSize(file.size))
						+ tpl.replace(/\{value\}/, fm.i18n('modify')+': '+ fm.formatDate(file))
					);
					
					if (getSizeHashes.length) {
						getSize = fm.getSize(getSizeHashes).done(function(data) {
							info.find('span.elfinder-spinner').parent().html(data.formated);
						}).fail(function() {
							info.find('span.elfinder-spinner').parent().html(fm.i18n('unknown'));
						}).always(function() {
							getSize = null;
						});
						getSize._hash = file.hash;
					}
					
					icon.addClass('elfinder-cwd-icon ui-corner-all '+fm.mime2class(file.mime));
					
					if (file.icon) {
						icon.css(fm.getIconStyle(file, true));
					}
					
					self.info.attr('class', infocls);
					if (file.csscls) {
						self.info.addClass(file.csscls);
					}
	
					if (file.read && (tmb = fm.tmb(file))) {
						jQuery('<img/>')
							.hide()
							.appendTo(self.preview)
							.on('load', function() {
								icon.addClass(tmb.className).css('background-image', "url('"+tmb.url+"')");
								jQuery(this).remove();
							})
							.attr('src', tmb.url);
					}
					self.info.delay(100).fadeIn(10);
					if (self.window.hasClass(fullscreen)) {
						cover.trigger('mousemove');
					}
					win.css('overflow', '');
				},
				tmb, name, getSizeHashes = [];

			if (file && ! Object.keys(file).length) {
				file = fm.cwd();
			}
			if (file && getSize && getSize.state() === 'pending' && getSize._hash !== file.hash) {
				getSize.reject();
			}
			if (file && (e.forceUpdate || self.window.data('hash') !== file.hash)) {
				update();
			} else { 
				e.stopImmediatePropagation();
			}
		});

	this.window = jQuery('<div class="ui-front ui-helper-reset ui-widget elfinder-quicklook touch-punch" style="position:absolute"/>')
		.hide()
		.addClass(fm.UA.Touch? 'elfinder-touch' : '')
		.on('click', function(e) {
			var win = this;
			e.stopPropagation();
			if (state === opened) {
				requestAnimationFrame(function() {
					state === opened && fm.toFront(win);
				});
			}
		})
		.append(
			jQuery('<div class="ui-dialog-titlebar ui-widget-header ui-corner-top ui-helper-clearfix elfinder-quicklook-titlebar"/>')
			.append(
				jQuery('<span class="ui-widget-header ui-dialog-titlebar-close ui-corner-all elfinder-titlebar-button elfinder-quicklook-titlebar-icon'+(platformWin? ' elfinder-titlebar-button-right' : '')+'"/>').append(
					titleClose, titleDock
				),
				title
			),
			this.preview,
			self.info.hide(),
			cover.hide(),
			navbar
		)
		.draggable({handle : 'div.elfinder-quicklook-titlebar'})
		.on('open', function(e, clcss) {
			var win  = self.window, 
				file = self.value,
				node = fm.getUI('cwd'),
				open = function(status) {
					state = status;
					self.update(1, self.value);
					self.change();
					win.trigger('resize.' + fm.namespace);
				};

			if (!init && state === closed) {
				if (file && file.hash !== cwdHash) {
					node = fm.cwdHash2Elm(file.hash.split('/', 2)[0]);
				}
				navStyle = '';
				navbar.attr('style', '');
				state = animated;
				node.trigger('scrolltoview');
				coverHide();
				win.css(clcss || closedCss(node))
					.show()
					.animate(openedCss(), 550, function() {
						open(opened);
						navShow();
					});
				fm.toFront(win);
			} else if (state === dockedhidden) {
				fm.getUI('navdock').data('addNode')(dockedNode);
				open(docked);
				self.preview.trigger('changesize');
				fm.storage('previewDocked', '1');
				if (fm.getUI('navdock').width() === 0) {
					win.trigger('navdockout');
				}
			}
		})
		.on('close', function(e, dfd) {
			var win     = self.window,
				preview = self.preview.trigger('change'),
				file    = self.value,
				hash    = (win.data('hash') || '').split('/', 2)[0],
				close   = function(status, winhide) {
					state = status;
					winhide && fm.toHide(win);
					preview.children().remove();
					self.update(0, self.value);
					win.data('hash', '');
					dfd && dfd.resolve();
				},
				node;
				
			if (self.opened()) {
				getSize && getSize.state() === 'pending' && getSize.reject();
				if (! self.docked()) {
					state = animated;
					win.hasClass(fullscreen) && fsicon.click();
					(hash && (node = cwd.find('#'+hash)).length)
						? win.animate(closedCss(node), 500, function() { close(closed, true); })
						: close(closed, true);
				} else {
					dockedNode = fm.getUI('navdock').data('removeNode')(self.window.attr('id'), 'detach');
					close(dockedhidden);
					fm.storage('previewDocked', '2');
				}
			}
		})
		.on('navdockin', function(e, data) {
			var w      = self.window,
				box    = fm.getUI('navdock'),
				height = dockHeight || box.width(),
				opts   = data || {};
			
			if (init) {
				opts.init = true;
			}
			state = docked;
			prevStyle = w.attr('style');
			w.toggleClass('ui-front').removeClass('ui-widget').draggable('disable').resizable('disable').removeAttr('style').css({
				width: '100%',
				height: height,
				boxSizing: 'border-box',
				paddingBottom: 0,
				zIndex: 'unset'
			});
			navbar.hide();
			titleDock.toggleClass('ui-icon-plusthick ui-icon-minusthick elfinder-icon-full elfinder-icon-minimize');
			
			fm.toHide(w, true);
			box.data('addNode')(w, opts);
			
			self.preview.trigger('changesize');
			
			fm.storage('previewDocked', '1');
		})
		.on('navdockout', function(e) {
			var w   = self.window,
				box = fm.getUI('navdock'),
				dfd = jQuery.Deferred(),
				clcss = closedCss(self.preview);
			
			dockHeight = w.outerHeight();
			box.data('removeNode')(w.attr('id'), fm.getUI());
			w.toggleClass('ui-front').addClass('ui-widget').draggable('enable').resizable('enable').attr('style', prevStyle);
			titleDock.toggleClass('ui-icon-plusthick ui-icon-minusthick elfinder-icon-full elfinder-icon-minimize');
			
			state = closed;
			w.trigger('open', clcss);
			
			fm.storage('previewDocked', '0');
		})
		.on('resize.' + fm.namespace, function() {
			self.preview.trigger('changesize'); 
		});

	/**
	 * This command cannot be disable by backend
	 *
	 * @type Boolean
	 **/
	this.alwaysEnabled = true;
	
	/**
	 * Selected file
	 *
	 * @type Object
	 **/
	this.value = null;
	
	this.handlers = {
		// save selected file
		select : function(e, d) {
			selectTm && cancelAnimationFrame(selectTm);
			if (! e.data || ! e.data.selected || ! e.data.selected.length) {
				selectTm = requestAnimationFrame(function() {
					self.opened() && updateOnSel();
				});
			} else {
				self.opened() && updateOnSel();
			}
		},
		error  : function() { self.window.is(':visible') && self.window.trigger('close'); },
		'searchshow searchhide' : function() { this.opened() && this.window.trigger('close'); },
		navbarshow : function() {
			requestAnimationFrame(function() {
				self.docked() && self.preview.trigger('changesize');
			});
		},
		destroy : function() { self.window.remove(); }
	};
	
	this.shortcuts = [{
		pattern     : 'space'
	}];
	
	this.support = {
		audio : {
			ogg : support('audio/ogg;'),
			webm: support('audio/webm;'),
			mp3 : support('audio/mpeg;'),
			wav : support('audio/wav;'),
			m4a : support('audio/mp4;') || support('audio/x-m4a;') || support('audio/aac;'),
			flac: support('audio/flac;'),
			amr : support('audio/amr;')
		},
		video : {
			ogg  : support('video/ogg;'),
			webm : support('video/webm;'),
			mp4  : support('video/mp4;'),
			mkv  : support('video/x-matroska;') || support('video/webm;'),
			'3gp': support('video/3gpp;') || support('video/mp4;'), // try as mp4
			m3u8 : support('application/x-mpegURL', 'video') || support('application/vnd.apple.mpegURL', 'video'),
			mpd  : support('application/dash+xml', 'video')
		}
	};
	// for GC
	mediaNode = {};
	
	/**
	 * Return true if quickLoock window is hiddenReturn true if quickLoock window is visible and not animated
	 *
	 * @return Boolean
	 **/
	this.closed = function() {
		return (state == closed || state == dockedhidden);
	};
	
	/**
	 * Return true if quickLoock window is visible and not animated
	 *
	 * @return Boolean
	 **/
	this.opened = function() {
		return state == opened || state == docked;
	};
	
	/**
	 * Return true if quickLoock window is in NavDock
	 *
	 * @return Boolean
	 **/
	this.docked = function() {
		return state == docked;
	};
	
	/**
	 * Adds an integration into help dialog.
	 *
	 * @param Object opts  options
	 */
	this.addIntegration = function(opts) {
		requestAnimationFrame(function() {
			fm.trigger('helpIntegration', Object.assign({cmd: 'quicklook'}, opts));
		});
	};

	/**
	 * Init command.
	 * Add default plugins and init other plugins
	 *
	 * @return Object
	 **/
	this.init = function() {
		var o       = this.options, 
			win     = this.window,
			preview = this.preview,
			i, p, cwdDispInlineRegex;
		
		width  = o.width  > 0 ? parseInt(o.width)  : 450;	
		height = o.height > 0 ? parseInt(o.height) : 300;
		if (o.dockHeight !== 'auto') {
			dockHeight = parseInt(o.dockHeight);
			if (! dockHeight) {
				dockHeight = void(0);
			}
		}

		fm.one('load', function() {
			
			dockEnabled = fm.getUI('navdock').data('dockEnabled');
			
			! dockEnabled && titleDock.hide();
			
			parent = fm.getUI();
			cwd    = fm.getUI('cwd');

			if (fm.zIndex) {
				win.css('z-index', fm.zIndex + 1);
			}
			
			win.appendTo(parent);
			
			// close window on escape
			jQuery(document).on('keydown.'+fm.namespace, function(e) {
				e.keyCode == jQuery.ui.keyCode.ESCAPE && self.opened() && ! self.docked() && win.hasClass('elfinder-frontmost') && win.trigger('close');
			});
			
			win.resizable({ 
				handles   : 'se', 
				minWidth  : 350, 
				minHeight : 120, 
				resize    : function() { 
					// use another event to avoid recursion in fullscreen mode
					// may be there is clever solution, but i cant find it :(
					preview.trigger('changesize'); 
				}
			});
			
			self.change(function() {
				if (self.opened()) {
					if (self.value) {
						if (self.value.tmb && self.value.tmb == 1) {
							// try re-get file object
							self.value = Object.assign({}, fm.file(self.value.hash));
						}
						preview.trigger(jQuery.Event(evUpdate, {file : self.value}));
					}
				}
			});
			
			preview.on(evUpdate, function(e) {
				var file, hash, serach;
				
				if (file = e.file) {
					hash = file.hash;
					serach = (fm.searchStatus.mixed && fm.searchStatus.state > 1);
				
					if (file.mime !== 'directory') {
						if (parseInt(file.size) || file.mime.match(o.mimeRegexNotEmptyCheck)) {
							// set current dispInlineRegex
							self.dispInlineRegex = cwdDispInlineRegex;
							if (serach || fm.optionsByHashes[hash]) {
								try {
									self.dispInlineRegex = new RegExp(fm.option('dispInlineRegex', hash), 'i');
								} catch(e) {
									try {
										self.dispInlineRegex = new RegExp(!fm.isRoot(file)? fm.option('dispInlineRegex', file.phash) : fm.options.dispInlineRegex, 'i');
									} catch(e) {
										self.dispInlineRegex = /^$/;
									}
								}
							}
						} else {
							//  do not preview of file that size = 0
							e.stopImmediatePropagation();
						}
					} else {
						self.dispInlineRegex = /^$/;
					}
					
					self.info.show();
				} else {
					e.stopImmediatePropagation();
				}
			});

			jQuery.each(fm.commands.quicklook.plugins || [], function(i, plugin) {
				if (typeof(plugin) == 'function') {
					new plugin(self);
				}
			});
		}).one('open', function() {
			var dock = Number(fm.storage('previewDocked') || o.docked),
				win;
			if (dockEnabled && dock >= 1) {
				win = self.window;
				self.exec();
				win.trigger('navdockin', { init : true });
				if (dock === 2) {
					win.trigger('close');
				} else {
					self.update(void(0), fm.cwd());
					self.change();
				}
			}
			init = false;
		}).bind('open', function() {
			cwdHash = fm.cwd().hash;
			self.value = fm.cwd();
			// set current volume dispInlineRegex
			try {
				cwdDispInlineRegex = new RegExp(fm.option('dispInlineRegex'), 'i');
			} catch(e) {
				cwdDispInlineRegex = /^$/;
			}
		}).bind('change', function(e) {
			if (e.data && e.data.changed && self.opened()) {
				jQuery.each(e.data.changed, function() {
					if (self.window.data('hash') === this.hash) {
						self.window.data('hash', null);
						self.preview.trigger(evUpdate);
						return false;
					}
				});
			}
		}).bind('navdockresizestart navdockresizestop', function(e) {
			cover[e.type === 'navdockresizestart'? 'show' : 'hide']();
		});
	};
	
	this.getstate = function() {
		return self.opened()? 1 : 0;
	};
	
	this.exec = function() {
		self.closed() && updateOnSel();
		self.enabled() && self.window.trigger(self.opened() ? 'close' : 'open');
		return jQuery.Deferred().resolve();
	};

	this.hideinfo = function() {
		this.info.stop(true, true).hide();
	};

}).prototype = { forceLoad : true }; // this is required command


/*
 * File: /js/commands/quicklook.plugins.js
 */

elFinder.prototype.commands.quicklook.plugins = [
	
	/**
	 * Images preview plugin
	 *
	 * @param elFinder.commands.quicklook
	 **/
	function(ql) {
				var mimes   = ['image/jpeg', 'image/png', 'image/gif', 'image/svg+xml', 'image/x-ms-bmp'],
			preview = ql.preview,
			WebP, flipMime;
		
		// webp support
		WebP = new Image();
		WebP.onload = WebP.onerror = function() {
			if (WebP.height == 2) {
				mimes.push('image/webp');
			}
		};
		WebP.src='data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA';
		
		// what kind of images we can display
		jQuery.each(navigator.mimeTypes, function(i, o) {
			var mime = o.type;
			
			if (mime.indexOf('image/') === 0 && jQuery.inArray(mime, mimes)) {
				mimes.push(mime);
			} 
		});
			
		preview.on(ql.evUpdate, function(e) {
			var fm   = ql.fm,
				file = e.file,
				showed = false,
				dimreq = null,
				setdim  = function(dim) {
					var rfile = fm.file(file.hash);
					rfile.width = dim[0];
					rfile.height = dim[1];
				},
				show = function() {
					var elm, varelm, memSize, width, height, prop;
					
					dimreq && dimreq.state && dimreq.state() === 'pending' && dimreq.reject();
					if (showed) {
						return;
					}
					showed = true;
					
					elm = img.get(0);
					memSize = file.width && file.height? {w: file.width, h: file.height} : (elm.naturalWidth? null : {w: img.width(), h: img.height()});
				
					memSize && img.removeAttr('width').removeAttr('height');
					
					width  = file.width || elm.naturalWidth || elm.width || img.width();
					height = file.height || elm.naturalHeight || elm.height || img.height();
					if (!file.width || !file.height) {
						setdim([width, height]);
					}
					
					memSize && img.width(memSize.w).height(memSize.h);

					prop = (width/height).toFixed(2);
					preview.on('changesize', function() {
						var pw = parseInt(preview.width()),
							ph = parseInt(preview.height()),
							w, h;
					
						if (prop < (pw/ph).toFixed(2)) {
							h = ph;
							w = Math.floor(h * prop);
						} else {
							w = pw;
							h = Math.floor(w/prop);
						}
						img.width(w).height(h).css('margin-top', h < ph ? Math.floor((ph - h)/2) : 0);
					
					})
					.trigger('changesize');
					
					//show image
					img.fadeIn(100);
				},
				hideInfo = function() {
					loading.remove();
					// hide info/icon
					ql.hideinfo();
				},
				url, img, loading, m;

			if (!flipMime) {
				flipMime = fm.arrayFlip(mimes);
			}
			if (flipMime[file.mime] && ql.dispInlineRegex.test(file.mime)) {
				// this is our file - stop event propagation
				e.stopImmediatePropagation();

				loading = jQuery('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+fm.i18n('nowLoading')+'</span><span class="elfinder-spinner"/></div>').appendTo(ql.info.find('.elfinder-quicklook-info'));

				url = fm.openUrl(file.hash);
				
				img = jQuery('<img/>')
					.hide()
					.appendTo(preview)
					.on('load', function() {
						hideInfo();
						show();
					})
					.on('error', function() {
						loading.remove();
					})
					.attr('src', url);
				
				if (file.width && file.height) {
					show();
				} else if (file.size > (ql.options.getDimThreshold || 0)) {
					dimreq = fm.request({
						data : {cmd : 'dim', target : file.hash},
						preventDefault : true
					})
					.done(function(data) {
						if (data.dim) {
							var dim = data.dim.split('x');
							file.width = dim[0];
							file.height = dim[1];
							setdim(dim);
							show();
						}
					});
				}
			}
			
		});
	},
	
	/**
	 * PSD(Adobe Photoshop data) preview plugin
	 *
	 * @param elFinder.commands.quicklook
	 **/
	function(ql) {
				var fm      = ql.fm,
			mimes   = fm.arrayFlip(['image/vnd.adobe.photoshop', 'image/x-photoshop']),
			preview = ql.preview,
			load    = function(url, img, loading) {
				try {
					fm.replaceXhrSend();
					PSD.fromURL(url).then(function(psd) {
						var prop;
						img.attr('src', psd.image.toBase64());
						requestAnimationFrame(function() {
							prop = (img.width()/img.height()).toFixed(2);
							preview.on('changesize', function() {
								var pw = parseInt(preview.width()),
									ph = parseInt(preview.height()),
									w, h;
							
								if (prop < (pw/ph).toFixed(2)) {
									h = ph;
									w = Math.floor(h * prop);
								} else {
									w = pw;
									h = Math.floor(w/prop);
								}
								img.width(w).height(h).css('margin-top', h < ph ? Math.floor((ph - h)/2) : 0);
							}).trigger('changesize');
							
							loading.remove();
							// hide info/icon
							ql.hideinfo();
							//show image
							img.fadeIn(100);
						});
					}, function() {
						loading.remove();
						img.remove();
					});
					fm.restoreXhrSend();
				} catch(e) {
					fm.restoreXhrSend();
					loading.remove();
					img.remove();
				}
			},
			PSD;
		
		preview.on(ql.evUpdate, function(e) {
			var file = e.file,
				url, img, loading, m,
				_define, _require;

			if (mimes[file.mime] && fm.options.cdns.psd && ! fm.UA.ltIE10 && ql.dispInlineRegex.test(file.mime)) {
				// this is our file - stop event propagation
				e.stopImmediatePropagation();

				loading = jQuery('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+fm.i18n('nowLoading')+'</span><span class="elfinder-spinner"/></div>').appendTo(ql.info.find('.elfinder-quicklook-info'));
				url = fm.openUrl(file.hash);
				if (!fm.isSameOrigin(url)) {
					url = fm.openUrl(file.hash, true);
				}
				img = jQuery('<img/>').hide().appendTo(preview);
				
				if (PSD) {
					load(url, img, loading);
				} else {
					_define = window.define;
					_require = window.require;
					window.require = null;
					window.define = null;
					fm.loadScript(
						[ fm.options.cdns.psd ],
						function() {
							PSD = require('psd');
							_define? (window.define = _define) : (delete window.define);
							_require? (window.require = _require) : (delete window.require);
							load(url, img, loading);
						}
					);
				}
			}
		});
	},
	
	/**
	 * HTML preview plugin
	 *
	 * @param elFinder.commands.quicklook
	 **/
	function(ql) {
				var fm      = ql.fm,
			mimes   = fm.arrayFlip(['text/html', 'application/xhtml+xml']),
			preview = ql.preview;
			
		preview.on(ql.evUpdate, function(e) {
			var file = e.file, jqxhr, loading;
			
			if (mimes[file.mime] && ql.dispInlineRegex.test(file.mime) && (!ql.options.getSizeMax || file.size <= ql.options.getSizeMax)) {
				e.stopImmediatePropagation();

				loading = jQuery('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+fm.i18n('nowLoading')+'</span><span class="elfinder-spinner"/></div>').appendTo(ql.info.find('.elfinder-quicklook-info'));

				// stop loading on change file if not loaded yet
				preview.one('change', function() {
					jqxhr.state() == 'pending' && jqxhr.reject();
				}).addClass('elfinder-overflow-auto');
				
				jqxhr = fm.request({
					data           : {cmd : 'get', target : file.hash, conv : 1, _t : file.ts},
					options        : {type: 'get', cache : true},
					preventDefault : true
				})
				.done(function(data) {
					ql.hideinfo();
					var doc = jQuery('<iframe class="elfinder-quicklook-preview-html"/>').appendTo(preview)[0].contentWindow.document;
					doc.open();
					doc.write(data.content);
					doc.close();
				})
				.always(function() {
					loading.remove();
				});
			}
		});
	},
	
	/**
	 * MarkDown preview plugin
	 *
	 * @param elFinder.commands.quicklook
	 **/
	function(ql) {
				var fm      = ql.fm,
			mimes   = fm.arrayFlip(['text/x-markdown']),
			preview = ql.preview,
			marked  = null,
			show = function(data, loading) {
				ql.hideinfo();
				var doc = jQuery('<iframe class="elfinder-quicklook-preview-html"/>').appendTo(preview)[0].contentWindow.document;
				doc.open();
				doc.write(marked(data.content));
				doc.close();
				loading.remove();
			},
			error = function(loading) {
				marked = false;
				loading.remove();
			};
			
		preview.on(ql.evUpdate, function(e) {
			var file = e.file, jqxhr, loading;
			
			if (mimes[file.mime] && fm.options.cdns.marked && marked !== false && ql.dispInlineRegex.test(file.mime) && (!ql.options.getSizeMax || file.size <= ql.options.getSizeMax)) {
				e.stopImmediatePropagation();

				loading = jQuery('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+fm.i18n('nowLoading')+'</span><span class="elfinder-spinner"/></div>').appendTo(ql.info.find('.elfinder-quicklook-info'));

				// stop loading on change file if not loaded yet
				preview.one('change', function() {
					jqxhr.state() == 'pending' && jqxhr.reject();
				}).addClass('elfinder-overflow-auto');
				
				jqxhr = fm.request({
					data           : {cmd : 'get', target : file.hash, conv : 1, _t : file.ts},
					options        : {type: 'get', cache : true},
					preventDefault : true
				})
				.done(function(data) {
					if (marked || window.marked) {
						if (!marked) {
							marked = window.marked;
						}
						show(data, loading);
					} else {
						fm.loadScript([fm.options.cdns.marked],
							function(res) { 
								marked = res || window.marked || false;
								delete window.marked;
								if (marked) {
									show(data, loading);
								} else {
									error(loading);
								}
							},
							{
								tryRequire: true,
								error: function() {
									error(loading);
								}
							}
						);
					}
				})
				.fail(function() {
					error(loading);
				});
			}
		});
	},

	/**
	 * PDF/ODT/ODS/ODP preview with ViewerJS
	 * 
	 * @param elFinder.commands.quicklook
	 */
	 function(ql) {
		if (ql.options.viewerjs) {
			var fm      = ql.fm,
				preview = ql.preview,
				opts    = ql.options.viewerjs,
				mimes   = opts.url? fm.arrayFlip(opts.mimes || []) : [];

			if (opts.url) {
				preview.on('update', function(e) {
					var win  = ql.window,
						file = e.file, node, loading;

					if (mimes[file.mime]) {
						var url = fm.openUrl(file.hash);
						if (url && fm.isSameOrigin(url)) {
							e.stopImmediatePropagation();

							loading = jQuery('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+fm.i18n('nowLoading')+'</span><span class="elfinder-spinner"/></div>').appendTo(ql.info.find('.elfinder-quicklook-info'));

							node = jQuery('<iframe class="elfinder-quicklook-preview-iframe"/>')
								.css('background-color', 'transparent')
								.on('load', function() {
									ql.hideinfo();
									loading.remove();
									node.css('background-color', '#fff');
								})
								.on('error', function() {
									loading.remove();
									node.remove();
								})
								.appendTo(preview)
								.attr('src', opts.url + '#' + url);

							preview.one('change', function() {
								loading.remove();
								node.off('load').remove();
							});
						}
					}
				});
			}
		}
	},

	/**
	 * PDF preview plugin
	 *
	 * @param elFinder.commands.quicklook
	 **/
	function(ql) {
				var fm      = ql.fm,
			mime    = 'application/pdf',
			preview = ql.preview,
			active  = false,
			urlhash = '',
			firefox, toolbar;
			
		if ((fm.UA.Safari && fm.OS === 'mac' && !fm.UA.iOS) || fm.UA.IE || fm.UA.Firefox) {
			active = true;
		} else {
			jQuery.each(navigator.plugins, function(i, plugins) {
				jQuery.each(plugins, function(i, plugin) {
					if (plugin.type === mime) {
						return !(active = true);
					}
				});
			});
		}

		if (active) {
			if (typeof ql.options.pdfToolbar !== 'undefined' && !ql.options.pdfToolbar) {
				urlhash = '#toolbar=0';
			}
			preview.on(ql.evUpdate, function(e) {
				var file = e.file;
				
				if (active && file.mime === mime && ql.dispInlineRegex.test(file.mime)) {
					e.stopImmediatePropagation();
					ql.hideinfo();
					ql.cover.addClass('elfinder-quicklook-coverbg');
					jQuery('<object class="elfinder-quicklook-preview-pdf" data="'+fm.openUrl(file.hash)+urlhash+'" type="application/pdf" />')
						.on('error', function(e) {
							active = false;
							ql.update(void(0), fm.cwd());
							ql.update(void(0), file);
						})
						.appendTo(preview);
				}
				
			});
		}
	},
	
	/**
	 * Flash preview plugin
	 *
	 * @param elFinder.commands.quicklook
	 **/
	function(ql) {
				var fm      = ql.fm,
			mime    = 'application/x-shockwave-flash',
			preview = ql.preview,
			active  = false;

		jQuery.each(navigator.plugins, function(i, plugins) {
			jQuery.each(plugins, function(i, plugin) {
				if (plugin.type === mime) {
					return !(active = true);
				}
			});
		});
		
		active && preview.on(ql.evUpdate, function(e) {
			var file = e.file,
				node;
				
			if (file.mime === mime && ql.dispInlineRegex.test(file.mime)) {
				e.stopImmediatePropagation();
				ql.hideinfo();
				node = jQuery('<embed class="elfinder-quicklook-preview-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" src="'+fm.openUrl(file.hash)+'" quality="high" type="application/x-shockwave-flash" wmode="transparent" />')
					.appendTo(preview);
			}
		});
	},
	
	/**
	 * HTML5 audio preview plugin
	 *
	 * @param elFinder.commands.quicklook
	 **/
	function(ql) {
				var fm       = ql.fm,
			preview  = ql.preview,
			mimes    = {
				'audio/mpeg'    : 'mp3',
				'audio/mpeg3'   : 'mp3',
				'audio/mp3'     : 'mp3',
				'audio/x-mpeg3' : 'mp3',
				'audio/x-mp3'   : 'mp3',
				'audio/x-wav'   : 'wav',
				'audio/wav'     : 'wav',
				'audio/x-m4a'   : 'm4a',
				'audio/aac'     : 'm4a',
				'audio/mp4'     : 'm4a',
				'audio/x-mp4'   : 'm4a',
				'audio/ogg'     : 'ogg',
				'audio/webm'    : 'webm',
				'audio/flac'    : 'flac',
				'audio/x-flac'  : 'flac',
				'audio/amr'     : 'amr'
			},
			node, curHash,
			win  = ql.window,
			navi = ql.navbar,
			AMR, autoplay,
			controlsList = typeof ql.options.mediaControlsList === 'string' && ql.options.mediaControlsList? ' controlsList="' + fm.escape(ql.options.mediaControlsList) + '"' : '',
			setNavi = function() {
				navi.css('bottom', win.hasClass('elfinder-quicklook-fullscreen')? '50px' : '');
			},
			getNode = function(src, hash) {
				return jQuery('<audio class="elfinder-quicklook-preview-audio ui-front" controls' + controlsList + ' preload="auto" autobuffer><source src="'+src+'" /></audio>')
					.on('change', function(e) {
						// Firefox fire change event on seek or volume change
						e.stopPropagation();
					})
					.on('error', function(e) {
						node && node.data('hash') === hash && reset();
					})
					.data('hash', hash)
					.appendTo(preview);
			},
			amrToWavUrl = function(hash) {
				var dfd = jQuery.Deferred(),
					loader = jQuery.Deferred().done(function() {
						fm.getContents(hash).done(function(data) {
							try {
								var buffer = AMR.toWAV(new Uint8Array(data));
								if (buffer) {
									dfd.resolve(URL.createObjectURL(new Blob([buffer], { type: 'audio/x-wav' })));
								} else {
									dfd.reject();
								}
							} catch(e) {
								dfd.reject();
							}
						}).fail(function() {
							dfd.reject();
						});
					}).fail(function() {
						AMR = false;
						dfd.reject();
					}),
					_AMR;
				if (window.TextEncoder && window.URL && URL.createObjectURL && typeof AMR === 'undefined') {
					// previous window.AMR
					_AMR = window.AMR;
					delete window.AMR;
					fm.loadScript(
						[ fm.options.cdns.amr ],
						function() { 
							AMR = window.AMR? window.AMR : false;
							// restore previous window.AMR
							window.AMR = _AMR;
							loader[AMR? 'resolve':'reject']();
						},
						{
							error: function() {
								loader.reject();
							}
						}
					);
				} else {
					loader[AMR? 'resolve':'reject']();
				}
				return dfd;
			},
			play = function(player) {
				var hash = node.data('hash'),
					playPromise;
				autoplay && (playPromise = player.play());
				// uses "playPromise['catch']" instead "playPromise.catch" to support Old IE
				if (playPromise && playPromise['catch']) {
					playPromise['catch'](function(e) {
						if (!player.paused) {
							node && node.data('hash') === hash && reset();
						}
					});
				}
			},
			reset = function() {
				if (node && node.parent().length) {
					var elm = node[0],
						url = node.children('source').attr('src');
					win.off('viewchange.audio');
					try {
						elm.pause();
						node.empty();
						if (url.match(/^blob:/)) {
							URL.revokeObjectURL(url);
						}
						elm.src = '';
						elm.load();
					} catch(e) {}
					node.remove();
					node = null;
				}
			};

		preview.on(ql.evUpdate, function(e) {
			var file = e.file,
				type = mimes[file.mime],
				html5, srcUrl;

			if (mimes[file.mime] && ql.dispInlineRegex.test(file.mime) && ((html5 = ql.support.audio[type]) || (type === 'amr'))) {
				autoplay = ql.autoPlay();
				curHash = file.hash;
				srcUrl = html5? fm.openUrl(curHash) : '';
				if (!html5) {
					if (fm.options.cdns.amr && type === 'amr' && AMR !== false) {
						e.stopImmediatePropagation();
						node = getNode(srcUrl, curHash);
						amrToWavUrl(file.hash).done(function(url) {
							if (curHash === file.hash) {
								var elm = node[0];
								try {
									node.children('source').attr('src', url);
									elm.pause();
									elm.load();
									play(elm);
									win.on('viewchange.audio', setNavi);
									setNavi();
								} catch(e) {
									URL.revokeObjectURL(url);
									node.remove();
								}
							} else {
								URL.revokeObjectURL(url);
							}
						}).fail(function() {
							node.remove();
						});
					}
				} else {
					e.stopImmediatePropagation();
					node = getNode(srcUrl, curHash);
					play(node[0]);
					win.on('viewchange.audio', setNavi);
					setNavi();
				}
			}
		}).on('change', reset);
	},
	
	/**
	 * HTML5 video preview plugin
	 *
	 * @param elFinder.commands.quicklook
	 **/
	function(ql) {
				var fm       = ql.fm,
			preview  = ql.preview,
			mimes    = {
				'video/mp4'       : 'mp4',
				'video/x-m4v'     : 'mp4',
				'video/quicktime' : 'mp4',
				'video/ogg'       : 'ogg',
				'application/ogg' : 'ogg',
				'video/webm'      : 'webm',
				'video/x-matroska': 'mkv',
				'video/3gpp'      : '3gp',
				'application/vnd.apple.mpegurl' : 'm3u8',
				'application/x-mpegurl' : 'm3u8',
				'application/dash+xml'  : 'mpd',
				'video/x-flv'     : 'flv'
			},
			node,
			win  = ql.window,
			navi = ql.navbar,
			cHls, cDash, pDash, cFlv, autoplay, tm,
			controlsList = typeof ql.options.mediaControlsList === 'string' && ql.options.mediaControlsList? ' controlsList="' + fm.escape(ql.options.mediaControlsList) + '"' : '',
			setNavi = function() {
				if (fm.UA.iOS) {
					if (win.hasClass('elfinder-quicklook-fullscreen')) {
						preview.css('height', '-webkit-calc(100% - 50px)');
						navi._show();
					} else {
						preview.css('height', '');
					}
				} else {
					navi.css('bottom', win.hasClass('elfinder-quicklook-fullscreen')? '50px' : '');
				}
			},
			render = function(file, opts) {
				var errTm = function(e) {
						if (err > 1) {
							tm && clearTimeout(tm);
							tm = setTimeout(function() {
								!canPlay && reset(true);
							}, 800);
						}
					},
					err = 0, 
					canPlay;
				//reset();
				pDash = null;
				opts = opts || {};
				ql.hideinfo();
				node = jQuery('<video class="elfinder-quicklook-preview-video" controls' + controlsList + ' preload="auto" autobuffer playsinline>'
						+'</video>')
					.on('change', function(e) {
						// Firefox fire change event on seek or volume change
						e.stopPropagation();
					})
					.on('timeupdate progress', errTm)
					.on('canplay', function() {
						canPlay = true;
					})
					.data('hash', file.hash);
				// can not handling error event with jQuery `on` event handler
				node[0].addEventListener('error', function(e) {
					if (opts.src && fm.convAbsUrl(opts.src) === fm.convAbsUrl(e.target.src)) {
						++err;
						errTm();
					}
				}, true);

				if (opts.src) {
					node.append('<source src="'+opts.src+'" type="'+file.mime+'"/><source src="'+opts.src+'"/>');
				}
				
				node.appendTo(preview);

				win.on('viewchange.video', setNavi);
				setNavi();
			},
			loadHls = function(file) {
				var hls;
				render(file);
				hls = new cHls();
				hls.loadSource(fm.openUrl(file.hash));
				hls.attachMedia(node[0]);
				if (autoplay) {
					hls.on(cHls.Events.MANIFEST_PARSED, function() {
						play(node[0]);
					});
				}
			},
			loadDash = function(file) {
				render(file);
				pDash = window.dashjs.MediaPlayer().create();
				pDash.getDebug().setLogToBrowserConsole(false);
				pDash.initialize(node[0], fm.openUrl(file.hash), autoplay);
				pDash.on('error', function(e) {
					reset(true);
				});
			},
			loadFlv = function(file) {
				if (!cFlv.isSupported()) {
					cFlv = false;
					return;
				}
				var player = cFlv.createPlayer({
					type: 'flv',
					url: fm.openUrl(file.hash)
				});
				render(file);
				player.on(cFlv.Events.ERROR, function() {
					player.destroy();
					reset(true);
				});
				player.attachMediaElement(node[0]);
				player.load();
				play(player);
			},
			play = function(player) {
				var hash = node.data('hash'),
					playPromise;
				autoplay && (playPromise = player.play());
				// uses "playPromise['catch']" instead "playPromise.catch" to support Old IE
				if (playPromise && playPromise['catch']) {
					playPromise['catch'](function(e) {
						if (!player.paused) {
							node && node.data('hash') === hash && reset(true);
						}
					});
				}
			},
			reset = function(showInfo) {
				tm && clearTimeout(tm);
				if (node && node.parent().length) {
					var elm = node[0];
					win.off('viewchange.video');
					pDash && pDash.reset();
					try {
						elm.pause();
						node.empty();
						elm.src = '';
						elm.load();
					} catch(e) {}
					node.remove();
					node = null;
				}
				showInfo && ql.info.show();
			};

		preview.on(ql.evUpdate, function(e) {
			var file = e.file,
				mime = file.mime.toLowerCase(),
				type = mimes[mime],
				stock, playPromise;
			
			if (mimes[mime] && ql.dispInlineRegex.test(file.mime) && (((type === 'm3u8' || (type === 'mpd' && !fm.UA.iOS) || type === 'flv') && !fm.UA.ltIE10) || ql.support.video[type])) {
				autoplay = ql.autoPlay();
				if (ql.support.video[type] && (type !== 'm3u8' || fm.UA.Safari)) {
					e.stopImmediatePropagation();
					render(file, { src: fm.openUrl(file.hash) });
					play(node[0]);
				} else {
					if (cHls !== false && fm.options.cdns.hls && type === 'm3u8') {
						e.stopImmediatePropagation();
						if (cHls) {
							loadHls(file);
						} else {
							stock = window.Hls;
							delete window.Hls;
							fm.loadScript(
								[ fm.options.cdns.hls ],
								function(res) { 
									cHls = res || window.Hls || false;
									window.Hls = stock;
									cHls && loadHls(file);
								},
								{
									tryRequire: true,
									error : function() {
										cHls = false;
									}
								}
							);
						}
					} else if (cDash !== false && fm.options.cdns.dash && type === 'mpd') {
						e.stopImmediatePropagation();
						if (cDash) {
							loadDash(file);
						} else {
							fm.loadScript(
								[ fm.options.cdns.dash ],
								function() {
									// dashjs require window.dashjs in global scope
									cDash = window.dashjs? true : false;
									cDash && loadDash(file);
								},
								{
									tryRequire: true,
									error : function() {
										cDash = false;
									}
								}
							);
						}
					} else if (cFlv !== false && fm.options.cdns.flv && type === 'flv') {
						e.stopImmediatePropagation();
						if (cFlv) {
							loadFlv(file);
						} else {
							stock = window.flvjs;
							delete window.flvjs;
							fm.loadScript(
								[ fm.options.cdns.flv ],
								function(res) { 
									cFlv = res || window.flvjs || false;
									window.flvjs = stock;
									cFlv && loadFlv(file);
								},
								{
									tryRequire: true,
									error : function() {
										cFlv = false;
									}
								}
							);
						}
					}
				}
			}
		}).on('change', reset);
	},
	
	/**
	 * Audio/video preview plugin using browser plugins
	 *
	 * @param elFinder.commands.quicklook
	 **/
	function(ql) {
				var preview = ql.preview,
			mimes   = [],
			node,
			win  = ql.window,
			navi = ql.navbar;
			
		jQuery.each(navigator.plugins, function(i, plugins) {
			jQuery.each(plugins, function(i, plugin) {
				(plugin.type.indexOf('audio/') === 0 || plugin.type.indexOf('video/') === 0) && mimes.push(plugin.type);
			});
		});
		mimes = ql.fm.arrayFlip(mimes);
		
		preview.on(ql.evUpdate, function(e) {
			var file  = e.file,
				mime  = file.mime,
				video,
				setNavi = function() {
					navi.css('bottom', win.hasClass('elfinder-quicklook-fullscreen')? '50px' : '');
				};
			
			if (mimes[file.mime] && ql.dispInlineRegex.test(file.mime)) {
				e.stopImmediatePropagation();
				(video = mime.indexOf('video/') === 0) && ql.hideinfo();
				node = jQuery('<embed src="'+ql.fm.openUrl(file.hash)+'" type="'+mime+'" class="elfinder-quicklook-preview-'+(video ? 'video' : 'audio')+'"/>')
					.appendTo(preview);
				
				win.on('viewchange.embed', setNavi);
				setNavi();
			}
		}).on('change', function() {
			if (node && node.parent().length) {
				win.off('viewchange.embed');
				node.remove();
				node= null;
			}
		});
		
	},

	/**
	 * Archive(zip|gzip|tar) preview plugin using https://github.com/imaya/zlib.js
	 *
	 * @param elFinder.commands.quicklook
	 **/
	function(ql) {
				var fm      = ql.fm,
			mimes   = fm.arrayFlip(['application/zip', 'application/x-gzip', 'application/x-tar']),
			preview = ql.preview,
			unzipFiles = function() {
				/** @type {Array.<string>} */
				var filenameList = [];
				/** @type {number} */
				var i;
				/** @type {number} */
				var il;
				/** @type {Array.<Zlib.Unzip.FileHeader>} */
				var fileHeaderList;
				// need check this.Y when update cdns.zlibUnzip
				this.Y();
				fileHeaderList = this.i;
				for (i = 0, il = fileHeaderList.length; i < il; ++i) {
					// need check fileHeaderList[i].J when update cdns.zlibUnzip
					filenameList[i] = fileHeaderList[i].filename + (fileHeaderList[i].J? ' (' + fm.formatSize(fileHeaderList[i].J) + ')' : '');
				}
				return filenameList;
			},
			tarFiles = function(tar) {
				var filenames = [],
					tarlen = tar.length,
					offset = 0,
					toStr = function(arr) {
						return String.fromCharCode.apply(null, arr).replace(/\0+$/, '');
					},
					h, name, prefix, size, dbs;
				while (offset < tarlen && tar[offset] !== 0) {
					h = tar.subarray(offset, offset + 512);
					name = toStr(h.subarray(0, 100));
					if (prefix = toStr(h.subarray(345, 500))) {
						name = prefix + name;
					}
					size = parseInt(toStr(h.subarray(124, 136)), 8);
					dbs = Math.ceil(size / 512) * 512;
					if (name === '././@LongLink') {
						name = toStr(tar.subarray(offset + 512, offset + 512 + dbs));
					}
					(name !== 'pax_global_header') && filenames.push(name + (size? ' (' + fm.formatSize(size) + ')': ''));
					offset = offset + 512 + dbs;
				}
				return filenames;
			},
			Zlib;

		if (window.Uint8Array && window.DataView && fm.options.cdns.zlibUnzip && fm.options.cdns.zlibGunzip) {
			preview.on(ql.evUpdate, function(e) {
				var file  = e.file,
					isTar = (file.mime === 'application/x-tar');
				if (mimes[file.mime] && (
						isTar
						|| ((typeof Zlib === 'undefined' || Zlib) && (file.mime === 'application/zip' || file.mime === 'application/x-gzip'))
					)) {
					var jqxhr, loading, url,
						req = function() {
							url = fm.openUrl(file.hash);
							if (!fm.isSameOrigin(url)) {
								url = fm.openUrl(file.hash, true);
							}
							jqxhr = fm.request({
								data    : {cmd : 'get'},
								options : {
									url: url,
									type: 'get',
									cache : true,
									dataType : 'binary',
									responseType :'arraybuffer',
									processData: false
								}
							})
							.fail(function() {
								loading.remove();
							})
							.done(function(data) {
								var unzip, filenames;
								try {
									if (file.mime === 'application/zip') {
										unzip = new Zlib.Unzip(new Uint8Array(data));
										//filenames = unzip.getFilenames();
										filenames = unzipFiles.call(unzip);
									} else if (file.mime === 'application/x-gzip') {
										unzip = new Zlib.Gunzip(new Uint8Array(data));
										filenames = tarFiles(unzip.decompress());
									} else if (file.mime === 'application/x-tar') {
										filenames = tarFiles(new Uint8Array(data));
									}
									makeList(filenames);
								} catch (e) {
									loading.remove();
									fm.debug('error', e);
								}
							});
						},
						makeList = function(filenames) {
							var header, doc;
							if (filenames && filenames.length) {
								filenames = jQuery.map(filenames, function(str) {
									return fm.decodeRawString(str);
								});
								filenames.sort();
								loading.remove();
								header = '<strong>'+fm.escape(file.mime)+'</strong> ('+fm.formatSize(file.size)+')'+'<hr/>';
								doc = jQuery('<div class="elfinder-quicklook-preview-archive-wrapper">'+header+'<pre class="elfinder-quicklook-preview-text">'+fm.escape(filenames.join("\n"))+'</pre></div>')
									.on('touchstart', function(e) {
										if (jQuery(this)['scroll' + (fm.direction === 'ltr'? 'Right' : 'Left')]() > 5) {
											e.originalEvent._preventSwipeX = true;
										}
									})
									.appendTo(preview);
								ql.hideinfo();
							}
						},
						_Zlib;

					// this is our file - stop event propagation
					e.stopImmediatePropagation();
					
					loading = jQuery('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+fm.i18n('nowLoading')+'</span><span class="elfinder-spinner"/></div>').appendTo(ql.info.find('.elfinder-quicklook-info'));
					
					// stop loading on change file if not loaded yet
					preview.one('change', function() {
						jqxhr.state() === 'pending' && jqxhr.reject();
						loading.remove();
					});
					
					if (Zlib) {
						req();
					} else {
						if (window.Zlib) {
							_Zlib = window.Zlib;
							delete window.Zlib;
						}
						fm.loadScript(
							[ fm.options.cdns.zlibUnzip, fm.options.cdns.zlibGunzip ],
							function() {
								if (window.Zlib && (Zlib = window.Zlib)) {
									if (_Zlib) {
										window.Zlib = _Zlib;
									} else {
										delete window.Zlib;
									}
									req();
								} else {
									error();
								}
							}
						);
					}
				}
			});
		}
	},

	/**
	 * RAR Archive preview plugin using https://github.com/43081j/rar.js
	 *
	 * @param elFinder.commands.quicklook
	 **/
	function(ql) {
				var fm      = ql.fm,
			mimes   = fm.arrayFlip(['application/x-rar']),
			preview = ql.preview,
			RAR;

		if (window.DataView) {
			preview.on(ql.evUpdate, function(e) {
				var file = e.file;
				if (mimes[file.mime] && fm.options.cdns.rar && RAR !== false) {
					var loading, url, archive, abort,
						getList = function(url) {
							if (abort) {
								loading.remove();
								return;
							}
							try {
								archive = RAR({
									file: url,
									type: 2,
									xhrHeaders: fm.customHeaders,
									xhrFields: fm.xhrFields
								}, function(err) {
									loading.remove();
									var filenames = [],
										header, doc;
									if (abort || err) {
										// An error occurred (not a rar, read error, etc)
										err && fm.debug('error', err);
										return;
									}
									jQuery.each(archive.entries, function() {
										filenames.push(this.path + (this.size? ' (' + fm.formatSize(this.size) + ')' : ''));
									});
									if (filenames.length) {
										filenames = jQuery.map(filenames, function(str) {
											return fm.decodeRawString(str);
										});
										filenames.sort();
										header = '<strong>'+fm.escape(file.mime)+'</strong> ('+fm.formatSize(file.size)+')'+'<hr/>';
										doc = jQuery('<div class="elfinder-quicklook-preview-archive-wrapper">'+header+'<pre class="elfinder-quicklook-preview-text">'+fm.escape(filenames.join("\n"))+'</pre></div>')
											.on('touchstart', function(e) {
												if (jQuery(this)['scroll' + (fm.direction === 'ltr'? 'Right' : 'Left')]() > 5) {
													e.originalEvent._preventSwipeX = true;
												}
											})
											.appendTo(preview);
										ql.hideinfo();
									}
								});
							} catch(e) {
								loading.remove();
							}
						},
						error = function() {
							RAR = false;
							loading.remove();
						},
						_RAR;

					// this is our file - stop event propagation
					e.stopImmediatePropagation();
					
					loading = jQuery('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+fm.i18n('nowLoading')+'</span><span class="elfinder-spinner"/></div>').appendTo(ql.info.find('.elfinder-quicklook-info'));
					
					// stop loading on change file if not loaded yet
					preview.one('change', function() {
						archive && (archive.abort = true);
						loading.remove();
						abort = true;
					});
					
					url = fm.openUrl(file.hash);
					if (!fm.isSameOrigin(url)) {
						url = fm.openUrl(file.hash, true);
					}
					if (RAR) {
						getList(url);
					} else {
						if (window.RarArchive) {
							_RAR = window.RarArchive;
							delete window.RarArchive;
						}
						fm.loadScript(
							[ fm.options.cdns.rar ],
							function() {
								if (fm.hasRequire) {
									require(['rar'], function(RarArchive) {
										RAR = RarArchive;
										getList(url);
									}, error);
								} else {
									if (RAR = window.RarArchive) {
										if (_RAR) {
											window.RarArchive = _RAR;
										} else {
											delete window.RarArchive;
										}
										getList(url);
									} else {
										error();
									}
								}
							},
							{
								tryRequire: true,
								error : error
							}
						);
					}
				}
			});
		}
	},

	/**
	 * CAD-Files and 3D-Models online viewer on sharecad.org
	 *
	 * @param elFinder.commands.quicklook
	 **/
	function(ql) {
				var fm      = ql.fm,
			mimes   = fm.arrayFlip(ql.options.sharecadMimes || []),
			preview = ql.preview,
			win     = ql.window,
			node;
			
		if (ql.options.sharecadMimes.length) {
			ql.addIntegration({
				title: 'ShareCAD.org CAD and 3D-Models viewer',
				link: 'https://sharecad.org/DWGOnlinePlugin'
			});
		}

		preview.on(ql.evUpdate, function(e) {
			var file = e.file;
			if (mimes[file.mime.toLowerCase()] && !fm.option('onetimeUrl', file.hash)) {
				var win     = ql.window,
					loading, url;
				
				e.stopImmediatePropagation();
				if (file.url == '1') {
					preview.hide();
					jQuery('<div class="elfinder-quicklook-info-data"><button class="elfinder-info-button">'+fm.i18n('getLink')+'</button></div>').appendTo(ql.info.find('.elfinder-quicklook-info'))
					.on('click', function() {
						var self = jQuery(this);
						self.html('<span class="elfinder-spinner">');
						fm.request({
							data : {cmd : 'url', target : file.hash},
							preventDefault : true
						})
						.always(function() {
							self.html('');
						})
						.done(function(data) {
							var rfile = fm.file(file.hash);
							file.url = rfile.url = data.url || '';
							if (file.url) {
								preview.trigger({
									type: ql.evUpdate,
									file: file,
									forceUpdate: true
								});
							}
						});
					});
				}
				if (file.url !== '' && file.url != '1') {
					preview.one('change', function() {
						loading.remove();
						node.off('load').remove();
						node = null;
					}).addClass('elfinder-overflow-auto');
					
					loading = jQuery('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+fm.i18n('nowLoading')+'</span><span class="elfinder-spinner"/></div>').appendTo(ql.info.find('.elfinder-quicklook-info'));
					
					url = fm.convAbsUrl(fm.url(file.hash));
					node = jQuery('<iframe class="elfinder-quicklook-preview-iframe" scrolling="no"/>')
						.css('background-color', 'transparent')
						.appendTo(preview)
						.on('load', function() {
							ql.hideinfo();
							loading.remove();
							ql.preview.after(ql.info);
							jQuery(this).css('background-color', '#fff').show();
						})
						.on('error', function() {
							loading.remove();
							ql.preview.after(ql.info);
						})
						.attr('src', '//sharecad.org/cadframe/load?url=' + encodeURIComponent(url));
					
					ql.info.after(ql.preview);
				}
			}
			
		});
	},

	/**
	 * KML preview with GoogleMaps API
	 *
	 * @param elFinder.commands.quicklook
	 */
	function(ql) {
				var fm      = ql.fm,
			mimes   = {
				'application/vnd.google-earth.kml+xml' : true,
				'application/vnd.google-earth.kmz' : true
			},
			preview = ql.preview,
			gMaps, loadMap, wGmfail, fail, mapScr;

		if (ql.options.googleMapsApiKey) {
			ql.addIntegration({
				title: 'Google Maps',
				link: 'https://www.google.com/intl/' + fm.lang.replace('_', '-') + '/help/terms_maps.html'
			});
			gMaps = (window.google && google.maps);
			// start load maps
			loadMap = function(file, node) {
				var mapsOpts = ql.options.googleMapsOpts.maps;
				fm.forExternalUrl(file.hash).done(function(url) {
					if (url) {
						try {
							new gMaps.KmlLayer(url, Object.assign({
								map: new gMaps.Map(node.get(0), mapsOpts)
							}, ql.options.googleMapsOpts.kml));
							ql.hideinfo();
						} catch(e) {
							fail();
						}
					} else {
						fail();
					}
				});
			};
			// keep stored error handler if exists
			wGmfail = window.gm_authFailure;
			// on error function
			fail = function() {
				mapScr = null;
			};
			// API script url
			mapScr = 'https://maps.googleapis.com/maps/api/js?key=' + ql.options.googleMapsApiKey;
			// error handler
			window.gm_authFailure = function() {
				fail();
				wGmfail && wGmfail();
			};

			preview.on(ql.evUpdate, function(e) {
				var file = e.file;
				if (mapScr && mimes[file.mime.toLowerCase()]) {
					var win     = ql.window,
						getLink = (file.url == '1' && !fm.option('onetimeUrl', file.hash)),
						loading, url, node;
				
					e.stopImmediatePropagation();
					if (getLink) {
						preview.hide();
						jQuery('<div class="elfinder-quicklook-info-data"><button class="elfinder-info-button">'+fm.i18n('getLink')+'</button></div>').appendTo(ql.info.find('.elfinder-quicklook-info'))
						.on('click', function() {
							var self = jQuery(this);
							self.html('<span class="elfinder-spinner">');
							fm.request({
								data : {cmd : 'url', target : file.hash},
								preventDefault : true
							})
							.always(function() {
								self.html('');
							})
							.done(function(data) {
								var rfile = fm.file(file.hash);
								file.url = rfile.url = data.url || '';
								if (file.url) {
									preview.trigger({
										type: ql.evUpdate,
										file: file,
										forceUpdate: true
									});
								}
							});
						});
					}
					if (file.url !== '' && !getLink) {
						node = jQuery('<div style="width:100%;height:100%;"/>').appendTo(preview);
						preview.one('change', function() {
							node.remove();
							node = null;
						});
						if (!gMaps) {
							fm.loadScript([mapScr], function() {
								gMaps = window.google && google.maps;
								gMaps && loadMap(file, node);
							});
						} else {
							loadMap(file, node);
						}
					}
				}
			});
		}
	},

	/**
	 * Any supported files preview plugin using (Google docs | MS Office) online viewer
	 *
	 * @param elFinder.commands.quicklook
	 **/
	function(ql) {
				var fm      = ql.fm,
			mimes   = Object.assign(fm.arrayFlip(ql.options.googleDocsMimes || [], 'g'), fm.arrayFlip(ql.options.officeOnlineMimes || [], 'm')),
			preview = ql.preview,
			win     = ql.window,
			navi    = ql.navbar,
			urls    = {
				g: 'docs.google.com/gview?embedded=true&url=',
				m: 'view.officeapps.live.com/op/embed.aspx?wdStartOn=0&src='
			},
			navBottom = {
				g: '56px',
				m: '24px'
			},
			mLimits = {
				xls  : 5242880, // 5MB
				xlsb : 5242880,
				xlsx : 5242880,
				xlsm : 5242880,
				other: 10485760 // 10MB
			},
			node, enable;
		
		if (ql.options.googleDocsMimes.length) {
			enable = true;
			ql.addIntegration({
				title: 'Google Docs Viewer',
				link: 'https://docs.google.com/'
			});
		}
		if (ql.options.officeOnlineMimes.length) {
			enable = true;
			ql.addIntegration({
				title: 'MS Online Doc Viewer',
				link: 'https://products.office.com/office-online/view-office-documents-online'
			});
		}

		if (enable) {
			preview.on(ql.evUpdate, function(e) {
				var file = e.file,
					type;
				// 25MB is maximum filesize of Google Docs prevew
				if (file.size <= 26214400 && (type = mimes[file.mime])) {
					var win     = ql.window,
						setNavi = function() {
							navi.css('bottom', win.hasClass('elfinder-quicklook-fullscreen')? navBottom[type] : '');
						},
						ext     = fm.mimeTypes[file.mime],
						getLink = (file.url == '1' && !fm.option('onetimeUrl', file.hash)),
						loading, url;
					
					if (type === 'm') {
						if ((mLimits[ext] && file.size > mLimits[ext]) || file.size > mLimits.other) {
							type = 'g';
						}
					}
					if (getLink) {
						preview.hide();
						jQuery('<div class="elfinder-quicklook-info-data"><button class="elfinder-info-button">'+fm.i18n('getLink')+'</button></div>').appendTo(ql.info.find('.elfinder-quicklook-info'))
						.on('click', function() {
							var self = jQuery(this);
							self.html('<span class="elfinder-spinner">');
							fm.request({
								data : {cmd : 'url', target : file.hash},
								preventDefault : true
							})
							.always(function() {
								self.html('');
							})
							.done(function(data) {
								var rfile = fm.file(file.hash);
								file.url = rfile.url = data.url || '';
								if (file.url) {
									preview.trigger({
										type: ql.evUpdate,
										file: file,
										forceUpdate: true
									});
								}
							});
						});
					}
					if (file.url !== '' && !getLink) {
						e.stopImmediatePropagation();
						preview.one('change', function() {
							win.off('viewchange.googledocs');
							loading.remove();
							node.off('load').remove();
							node = null;
						}).addClass('elfinder-overflow-auto');
						
						loading = jQuery('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+fm.i18n('nowLoading')+'</span><span class="elfinder-spinner"/></div>').appendTo(ql.info.find('.elfinder-quicklook-info'));
						
						node = jQuery('<iframe class="elfinder-quicklook-preview-iframe"/>')
							.css('background-color', 'transparent')
							.appendTo(preview);

						fm.forExternalUrl(file.hash).done(function(url) {
							if (url) {
								if (file.ts) {
									url += (url.match(/\?/)? '&' : '?') + '_t=' + file.ts;
								}
								node.on('load', function() {
									ql.hideinfo();
									loading.remove();
									ql.preview.after(ql.info);
									jQuery(this).css('background-color', '#fff').show();
								})
								.on('error', function() {
									loading.remove();
									ql.preview.after(ql.info);
								}).attr('src', 'https://' + urls[type] + encodeURIComponent(url));
							} else {
								loading.remove();
								node.remove();
							}
						});

						win.on('viewchange.googledocs', setNavi);
						setNavi();
						ql.info.after(ql.preview);
					}
				}
				
			});
		}
	},

	/**
	 * Texts preview plugin
	 *
	 * @param elFinder.commands.quicklook
	 **/
	function(ql) {
				var fm      = ql.fm,
			preview = ql.preview,
			textMaxlen = parseInt(ql.options.textMaxlen) || 2000,
			prettify = function() {
				if (fm.options.cdns.prettify) {
					fm.loadScript([fm.options.cdns.prettify + (fm.options.cdns.prettify.match(/\?/)? '&' : '?') + 'autorun=false']);
					prettify = function() { return true; };
				} else {
					prettify = function() { return false; };
				}
			},
			PRcheck = function(node, cnt) {
				if (prettify()) {
					if (typeof window.PR === 'undefined' && cnt--) {
						setTimeout(function() { PRcheck(node, cnt); }, 100);
					} else {
						if (typeof window.PR === 'object') {
							node.css('cursor', 'wait');
							requestAnimationFrame(function() {
								PR.prettyPrint && PR.prettyPrint(null, node.get(0));
								node.css('cursor', '');
							});
						} else {
							prettify = function() { return false; };
						}
					}
				}
			};
		
		preview.on(ql.evUpdate, function(e) {
			var file = e.file,
				mime = file.mime,
				jqxhr, loading;
			
			if (fm.mimeIsText(file.mime) && (!ql.options.getSizeMax || file.size <= ql.options.getSizeMax)) {
				e.stopImmediatePropagation();
				
				(typeof window.PR === 'undefined') && prettify();
				
				loading = jQuery('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+fm.i18n('nowLoading')+'</span><span class="elfinder-spinner"/></div>').appendTo(ql.info.find('.elfinder-quicklook-info'));

				// stop loading on change file if not loadin yet
				preview.one('change', function() {
					jqxhr.state() == 'pending' && jqxhr.reject();
				});
				
				jqxhr = fm.request({
					data           : {cmd : 'get', target : file.hash, conv : 1, _t : file.ts},
					options        : {type: 'get', cache : true},
					preventDefault : true
				})
				.done(function(data) {
					var reg = new RegExp('^(data:'+file.mime.replace(/([.+])/g, '\\$1')+';base64,)', 'i'),
						text = data.content,
						part, more, node, m;
					ql.hideinfo();
					if (window.atob && (m = text.match(reg))) {
						text = atob(text.substr(m[1].length));
					}
					
					more = text.length - textMaxlen;
					if (more > 100) {
						part = text.substr(0, textMaxlen) + '...';
					} else {
						more = 0;
					}
					
					node = jQuery('<div class="elfinder-quicklook-preview-text-wrapper"><pre class="elfinder-quicklook-preview-text prettyprint"></pre></div>');
					
					if (more) {
						node.append(jQuery('<div class="elfinder-quicklook-preview-charsleft"><hr/><span>' + fm.i18n('charsLeft', fm.toLocaleString(more)) + '</span></div>')
							.on('click', function() {
								var top = node.scrollTop();
								jQuery(this).remove();
								node.children('pre').removeClass('prettyprinted').text(text).scrollTop(top);
								PRcheck(node, 100);
							})
						);
					}
					node.children('pre').text(part || text);
					
					node.on('touchstart', function(e) {
						if (jQuery(this)['scroll' + (fm.direction === 'ltr'? 'Right' : 'Left')]() > 5) {
							e.originalEvent._preventSwipeX = true;
						}
					}).appendTo(preview);
					
					PRcheck(node, 100);
				})
				.always(function() {
					loading.remove();
				});
			}
		});
	}
];


/*
 * File: /js/commands/reload.js
 */

/**
 * @class  elFinder command "reload"
 * Sync files and folders
 *
 * @author Dmitry (dio) Levashov
 **/
(elFinder.prototype.commands.reload = function() {
	"use strict";
	var self   = this,
		search = false;
	
	this.alwaysEnabled = true;
	this.updateOnSelect = true;
	
	this.shortcuts = [{
		pattern     : 'ctrl+shift+r f5'
	}];
	
	this.getstate = function() {
		return 0;
	};
	
	this.init = function() {
		this.fm.bind('search searchend', function() {
			search = this.type == 'search';
		});
	};
	
	this.fm.bind('contextmenu', function(){
		var fm = self.fm;
		if (fm.options.sync >= 1000) {
			self.extra = {
				icon: 'accept',
				node: jQuery('<span/>')
					.attr({title: fm.i18n('autoSync')})
					.on('click touchstart', function(e){
						if (e.type === 'touchstart' && e.originalEvent.touches.length > 1) {
							return;
						}
						e.stopPropagation();
						e.preventDefault();
						jQuery(this).parent()
							.toggleClass('ui-state-disabled', fm.options.syncStart)
							.parent().removeClass('ui-state-hover');
						fm.options.syncStart = !fm.options.syncStart;
						fm.autoSync(fm.options.syncStart? null : 'stop');
					}).on('ready', function(){
						jQuery(this).parent().toggleClass('ui-state-disabled', !fm.options.syncStart).css('pointer-events', 'auto');
					})
			};
		}
	});
	
	this.exec = function() {
		var fm = this.fm;
		if (!search) {
			var dfrd    = fm.sync(),
				timeout = setTimeout(function() {
					fm.notify({type : 'reload', cnt : 1, hideCnt : true});
					dfrd.always(function() { fm.notify({type : 'reload', cnt  : -1}); });
				}, fm.notifyDelay);
				
			return dfrd.always(function() { 
				clearTimeout(timeout); 
				fm.trigger('reload');
			});
		} else {
			jQuery('div.elfinder-toolbar > div.'+fm.res('class', 'searchbtn') + ' > span.ui-icon-search').click();
		}
	};

}).prototype = { forceLoad : true }; // this is required command


/*
 * File: /js/commands/rename.js
 */

/**
 * @class elFinder command "rename". 
 * Rename selected file.
 *
 * @author Dmitry (dio) Levashov, dio@std42.ru
 * @author Naoki Sawada
 **/
elFinder.prototype.commands.rename = function() {
	"use strict";

	// set alwaysEnabled to allow root rename on client size
	this.alwaysEnabled = true;

	this.syncTitleOnChange = true;

	var self = this,
		fm = self.fm,
		request = function(dfrd, targtes, file, name) {
			var sel = targtes? [file.hash].concat(targtes) : [file.hash],
				cnt = sel.length,
				data = {}, rootNames;
			
			fm.lockfiles({files : sel});
			
			if (fm.isRoot(file)) {
				if (!(rootNames = fm.storage('rootNames'))) {
					rootNames = {};
				}
				if (name === '') {
					if (rootNames[file.hash]) {
						file.name = file._name;
						file.i18 = file._i18;
						delete rootNames[file.hash];
						delete file._name;
						delete file._i18;
					} else {
						dfrd && dfrd.reject();
						fm.unlockfiles({files : sel}).trigger('selectfiles', {files : sel});
						return;
					}
				} else {
					if (typeof file._name === 'undefined') {
						file._name = file.name;
						file._i18 = file.i18;
					}
					file.name = rootNames[file.hash] = name;
					delete file.i18;
				}
				fm.storage('rootNames', rootNames);
				data = { changed: [file] };
				fm.updateCache(data);
				fm.change(data);
				dfrd && dfrd.resolve(data);
				fm.unlockfiles({files : sel}).trigger('selectfiles', {files : sel});
				return;
			}

			data = {
				cmd : 'rename',
				name : name,
				target : file.hash
			};

			if (cnt > 1) {
				data['targets'] = targtes;
				if (name.match(/\*/)) {
					data['q'] = name;
				}
			}
			
			fm.request({
					data   : data,
					notify : {type : 'rename', cnt : cnt},
					navigate : {}
				})
				.fail(function(error) {
					var err = fm.parseError(error);
					dfrd && dfrd.reject();
					if (! err || ! Array.isArray(err) || err[0] !== 'errRename') {
						fm.sync();
					}
				})
				.done(function(data) {
					var cwdHash;
					if (data.added && data.added.length && cnt === 1) {
						data.undo = {
							cmd : 'rename',
							callback : function() {
								return fm.request({
									data   : {cmd : 'rename', target : data.added[0].hash, name : file.name},
									notify : {type : 'undo', cnt : 1}
								});
							}
						};
						data.redo = {
							cmd : 'rename',
							callback : function() {
								return fm.request({
									data   : {cmd : 'rename', target : file.hash, name : name},
									notify : {type : 'rename', cnt : 1}
								});
							}
						};
					}
					dfrd && dfrd.resolve(data);
					if (!(cwdHash = fm.cwd().hash) || cwdHash === file.hash) {
						fm.exec('open', jQuery.map(data.added, function(f) {
							return (f.mime === 'directory')? f.hash : null;
						})[0]);
					}
				})
				.always(function() {
					fm.unlockfiles({files : sel}).trigger('selectfiles', {files : sel});
				}
			);
		},
		getHint = function(name, target) {
			var sel = target || fm.selected(),
				splits = fm.splitFileExtention(name),
				f1 = fm.file(sel[0]),
				f2 = fm.file(sel[1]),
				ext, hint, add;
			
			ext = splits[1]? ('.' + splits[1]) : '';
			if (splits[1] && splits[0] === '*') {
				// change extention
				hint =  '"' + fm.splitFileExtention(f1.name)[0] + ext + '", ';
				hint += '"' + fm.splitFileExtention(f2.name)[0] + ext + '"';
			} else if (splits[0].length > 1) {
				if (splits[0].substr(-1) === '*') {
					// add prefix
					add = splits[0].substr(0, splits[0].length - 1);
					hint =  '"' + add + f1.name+'", ';
					hint += '"' + add + f2.name+'"';
				} else if (splits[0].substr(0, 1) === '*') {
					// add suffix
					add = splits[0].substr(1);
					hint =  '"'+fm.splitFileExtention(f1.name)[0] + add + ext + '", ';
					hint += '"'+fm.splitFileExtention(f2.name)[0] + add + ext + '"';
				}
			}
			if (!hint) {
				hint = '"'+splits[0] + '1' + ext + '", "' + splits[0] + '2' + ext + '"';
			}
			if (sel.length > 2) {
				hint += ' ...';
			}
			return hint;
		},
		batchRename = function() {
			var sel = fm.selected(),
				tplr = '<input name="type" type="radio" class="elfinder-tabstop">',
				mkChk = function(node, label) {
					return jQuery('<label class="elfinder-rename-batch-checks">' + fm.i18n(label) + '</label>').prepend(node);
				},
				name = jQuery('<input type="text" class="ui-corner-all elfinder-tabstop">'),
				num  = jQuery(tplr),
				prefix  = jQuery(tplr),
				suffix  = jQuery(tplr),
				extention  = jQuery(tplr),
				checks = jQuery('<div/>').append(
					mkChk(num, 'plusNumber'),
					mkChk(prefix, 'asPrefix'),
					mkChk(suffix, 'asSuffix'),
					mkChk(extention, 'changeExtention')
				),
				preview = jQuery('<div class="elfinder-rename-batch-preview"/>'),
				node = jQuery('<div class="elfinder-rename-batch"/>').append(
						jQuery('<div class="elfinder-rename-batch-name"/>').append(name),
						jQuery('<div class="elfinder-rename-batch-type"/>').append(checks),
						preview
					),
				opts = {
					title : fm.i18n('batchRename'),
					modal : true,
					destroyOnClose : true,
					width: Math.min(380, fm.getUI().width() - 20),
					buttons : {},
					open : function() {
						name.on('input', mkPrev).trigger('focus');
					}
				},
				getName = function() {
					var vName = name.val(),
						ext = fm.splitFileExtention(fm.file(sel[0]).name)[1];
					if (vName !== '' || num.is(':checked')) {
						if (prefix.is(':checked')) {
							vName += '*';
						} else if (suffix.is(':checked')) {
							vName = '*' + vName + '.' + ext;
						} else if (extention.is(':checked')) {
							vName = '*.' + vName;
						} else if (ext) {
							vName += '.' + ext;
						}
					}
					return vName;
				},
				mkPrev = function() {
					var vName = getName();
					if (vName !== '') {
						preview.html(fm.i18n(['renameMultiple', sel.length, getHint(vName)]));
					} else {
						preview.empty();
					}
				},
				radios = checks.find('input:radio').on('change', mkPrev),
				dialog;
			
			opts.buttons[fm.i18n('btnApply')] = function() {
				var vName = getName(),
					file, targets;
				if (vName !== '') {
					dialog.elfinderdialog('close');
					targets = sel;
					file = fm.file(targets.shift());
					request(void(0), targets, file, vName);
				}
			};
			opts.buttons[fm.i18n('btnCancel')] = function() {
				dialog.elfinderdialog('close');
			};
			if (jQuery.fn.checkboxradio) {
				radios.checkboxradio({
					create: function(e, ui) {
						if (this === num.get(0)) {
							num.prop('checked', true).change();
						}
					}
				});
			} else {
				checks.buttonset({
					create: function(e, ui) {
						num.prop('checked', true).change();
					}
				});
			}
			dialog = self.fmDialog(node, opts);
		};
	
	this.noChangeDirOnRemovedCwd = true;
	
	this.shortcuts = [{
		pattern : 'f2' + (fm.OS == 'mac' ? ' enter' : '')
	}, {
		pattern : 'shift+f2',
		description : 'batchRename',
		callback : function() {
			fm.selected().length > 1 && batchRename();
		}
	}];
	
	this.getstate = function(select) {
		var sel = this.files(select),
			cnt = sel.length,
			phash, ext, mime, brk, state, isRoot;
		
		if (!cnt) {
			return -1;
		}
		
		if (cnt > 1 && sel[0].phash) {
			phash = sel[0].phash;
			ext = fm.splitFileExtention(sel[0].name)[1].toLowerCase();
			mime = sel[0].mime;
		}
		if (cnt === 1) {
			isRoot = fm.isRoot(sel[0]);
		}

		state = (cnt === 1 && (isRoot || !sel[0].locked) || (fm.api > 2.1030 && cnt === jQuery.grep(sel, function(f) {
			if (!brk && !f.locked && f.phash === phash && !fm.isRoot(f) && (mime === f.mime || ext === fm.splitFileExtention(f.name)[1].toLowerCase())) {
				return true;
			} else {
				brk && (brk = true);
				return false;
			}
		}).length)) ? 0 : -1;
		
		// because alwaysEnabled = true, it need check disabled on connector 
		if (!isRoot && state === 0 && fm.option('disabledFlip', sel[0].hash)['rename']) {
			state = -1;
		}

		if (state !== -1 && cnt > 1) {
			self.extra = {
				icon: 'preference',
				node: jQuery('<span/>')
					.attr({title: fm.i18n('batchRename')})
					.on('click touchstart', function(e){
						if (e.type === 'touchstart' && e.originalEvent.touches.length > 1) {
							return;
						}
						e.stopPropagation();
						e.preventDefault();
						fm.getUI().trigger('click'); // to close the context menu immediately
						batchRename();
					})
			};
		} else {
			delete self.extra;
		}
			
		return state;
	};
	
	this.exec = function(hashes, cOpts) {
		var cwd      = fm.getUI('cwd'),
			sel      = hashes || (fm.selected().length? fm.selected() : false) || [fm.cwd().hash],
			cnt      = sel.length,
			file     = fm.file(sel.shift()),
			filename = '.elfinder-cwd-filename',
			opts     = cOpts || {},
			incwd    = (fm.cwd().hash == file.hash),
			type     = (opts._currentType === 'navbar' || opts._currentType === 'files')? opts._currentType : (incwd? 'navbar' : 'files'),
			navbar   = (type !== 'files'),
			target   = fm[navbar? 'navHash2Elm' : 'cwdHash2Elm'](file.hash),
			tarea    = (!navbar && fm.storage('view') != 'list'),
			split    = function(name) {
				var ext = fm.splitFileExtention(name)[1];
				return [name.substr(0, name.length - ext.length - 1), ext];
			},
			unselect = function() {
				requestAnimationFrame(function() {
					input && input.trigger('blur');
				});
			},
			rest     = function(){
				if (!overlay.is(':hidden')) {
					overlay.elfinderoverlay('hide').off('click close', cancel);
				}
				pnode.removeClass('ui-front')
					.css('position', '')
					.off('unselect.'+fm.namespace, unselect);
				if (tarea) {
					node && node.css('max-height', '');
				} else if (!navbar) {
					pnode.css('width', '')
						.parent('td').css('overflow', '');
				}
			}, colwidth,
			dfrd     = jQuery.Deferred()
				.fail(function(error) {
					var parent = input.parent(),
						name   = fm.escape(file.i18 || file.name);

					input.off();
					if (tarea) {
						name = name.replace(/([_.])/g, '&#8203;$1');
					}
					requestAnimationFrame(function() {
						if (navbar) {
							input.replaceWith(name);
						} else {
							if (parent.length) {
								input.remove();
								parent.html(name);
							} else {
								target.find(filename).html(name);
							}
						}
					});
					error && fm.error(error);
				})
				.always(function() {
					rest();
					fm.unbind('resize', resize);
					fm.enable();
				}),
			blur = function(e) {
				var name   = jQuery.trim(input.val()),
				splits = fm.splitFileExtention(name),
				valid  = true,
				req = function() {
					input.off();
					rest();
					if (navbar) {
						input.replaceWith(fm.escape(name));
					} else {
						node.html(fm.escape(name));
					}
					request(dfrd, sel, file, name);
				};

				if (!overlay.is(':hidden')) {
					pnode.css('z-index', '');
				}
				if (name === '') {
					if (!fm.isRoot(file)) {
						return cancel();
					}
					if (navbar) {
						input.replaceWith(fm.escape(file.name));
					} else {
						node.html(fm.escape(file.name));
					}
				}
				if (!inError && pnode.length) {
					
					input.off('blur');
					
					if (cnt === 1 && name === file.name) {
						return dfrd.reject();
					}
					if (fm.options.validName && fm.options.validName.test) {
						try {
							valid = fm.options.validName.test(name);
						} catch(e) {
							valid = false;
						}
					}
					if (name === '.' || name === '..' || !valid) {
						inError = true;
						fm.error(file.mime === 'directory'? 'errInvDirname' : 'errInvName', {modal: true, close: function(){setTimeout(select, 120);}});
						return false;
					}
					if (cnt === 1 && fm.fileByName(name, file.phash)) {
						inError = true;
						fm.error(['errExists', name], {modal: true, close: function(){setTimeout(select, 120);}});
						return false;
					}
					
					if (cnt === 1) {
						req();
					} else {
						fm.confirm({
							title : 'cmdrename',
							text  : ['renameMultiple', cnt, getHint(name, [file.hash].concat(sel))],
							accept : {
								label : 'btnYes',
								callback : req
							},
							cancel : {
								label : 'btnCancel',
								callback : function() {
									setTimeout(function() {
										inError = true;
										select();
									}, 120);
								}
							}
						});
						setTimeout(function() {
							fm.trigger('unselectfiles', {files: fm.selected()})
								.trigger('selectfiles', {files : [file.hash].concat(sel)});
						}, 120);
					}
				}
			},
			input = jQuery(tarea? '<textarea/>' : '<input type="text"/>')
				.on('keyup text', function(){
					if (tarea) {
						this.style.height = '1px';
						this.style.height = this.scrollHeight + 'px';
					} else if (colwidth) {
						this.style.width = colwidth + 'px';
						if (this.scrollWidth > colwidth) {
							this.style.width = this.scrollWidth + 10 + 'px';
						}
					}
				})
				.on('keydown', function(e) {
					e.stopImmediatePropagation();
					if (e.keyCode == jQuery.ui.keyCode.ESCAPE) {
						dfrd.reject();
					} else if (e.keyCode == jQuery.ui.keyCode.ENTER) {
						e.preventDefault();
						input.trigger('blur');
					}
				})
				.on('mousedown click dblclick', function(e) {
					e.stopPropagation();
					if (e.type === 'dblclick') {
						e.preventDefault();
					}
				})
				.on('blur', blur)
				.on('dragenter dragleave dragover drop', function(e) {
					// stop bubbling to prevent upload with native drop event
					e.stopPropagation();
				}),
			select = function() {
				var name = fm.splitFileExtention(input.val())[0];
				if (!inError && fm.UA.Mobile && !fm.UA.iOS) { // since iOS has a bug? (z-index not effect) so disable it
					overlay.on('click close', cancel).elfinderoverlay('show');
					pnode.css('z-index', overlay.css('z-index') + 1);
				}
				! fm.enabled() && fm.enable();
				if (inError) {
					inError = false;
					input.on('blur', blur);
				}
				input.trigger('focus').trigger('select');
				input[0].setSelectionRange && input[0].setSelectionRange(0, name.length);
			},
			node = navbar? target.contents().filter(function(){ return this.nodeType==3 && jQuery(this).parent().attr('id') === fm.navHash2Id(file.hash); })
					: target.find(filename),
			pnode = node.parent(),
			overlay = fm.getUI('overlay'),
			cancel = function(e) { 
				if (!overlay.is(':hidden')) {
					pnode.css('z-index', '');
				}
				if (! inError) {
					dfrd.reject();
					if (e) {
						e.stopPropagation();
						e.preventDefault();
					}
				}
			},
			resize = function() {
				target.trigger('scrolltoview', {blink : false});
			},
			inError = false;
		
		pnode.addClass('ui-front')
			.css('position', 'relative')
			.on('unselect.'+fm.namespace, unselect);
		fm.bind('resize', resize);
		if (navbar) {
			node.replaceWith(input.val(file.name));
		} else {
			if (tarea) {
				node.css('max-height', 'none');
			} else if (!navbar) {
				colwidth = pnode.width();
				pnode.width(colwidth - 15)
					.parent('td').css('overflow', 'visible');
			}
			node.empty().append(input.val(file.name));
		}
		
		if (cnt > 1 && fm.api <= 2.1030) {
			return dfrd.reject();
		}
		
		if (!file || !node.length) {
			return dfrd.reject('errCmdParams', this.title);
		}
		
		if (file.locked && !fm.isRoot(file)) {
			return dfrd.reject(['errLocked', file.name]);
		}
		
		fm.one('select', function() {
			input.parent().length && file && jQuery.inArray(file.hash, fm.selected()) === -1 && input.trigger('blur');
		});
		
		input.trigger('keyup');
		
		select();
		
		return dfrd;
	};

	fm.bind('select contextmenucreate closecontextmenu', function(e) {
		var sel = (e.data? (e.data.selected || e.data.targets) : null) || fm.selected(),
			file;
		if (sel && sel.length === 1 && (file = fm.file(sel[0])) && fm.isRoot(file)) {
			self.title = fm.i18n('kindAlias') + ' (' + fm.i18n('preference') + ')';
		} else {
			self.title = fm.i18n('cmdrename');
		}
		if (e.type !== 'closecontextmenu') {
			self.update(void(0), self.title);
		} else {
			requestAnimationFrame(function() {
				self.update(void(0), self.title);
			});
		}
	}).remove(function(e) {
		var rootNames;
		if (e.data && e.data.removed && (rootNames = fm.storage('rootNames'))) {
			jQuery.each(e.data.removed, function(i, h) {
				if (rootNames[h]) {
					delete rootNames[h];
				}
			});
			fm.storage('rootNames', rootNames);
		}
	});
};


/*
 * File: /js/commands/resize.js
 */

/**
 * @class  elFinder command "resize"
 * Open dialog to resize image
 *
 * @author Dmitry (dio) Levashov
 * @author Alexey Sukhotin
 * @author Naoki Sawada
 * @author Sergio Jovani
 **/
elFinder.prototype.commands.resize = function() {
	"use strict";
	var losslessRotate = 0,
		getBounceBox = function(w, h, theta) {
			var srcPts = [
					{x: w/2, y: h/2},
					{x: -w/2, y: h/2},
					{x: -w/2, y: -h/2},
					{x: w/2, y: -h/2}
				],
				dstPts = [],
				min = {x: Number.MAX_VALUE, y: Number.MAX_VALUE},
				max = {x: Number.MIN_VALUE, y: Number.MIN_VALUE};
			jQuery.each(srcPts, function(i, srcPt){
				dstPts.push({
					x: srcPt.x * Math.cos(theta) - srcPt.y * Math.sin(theta),
					y: srcPt.x * Math.sin(theta) + srcPt.y * Math.cos(theta)
				});
			});
			jQuery.each(dstPts, function(i, pt) {
				min.x = Math.min(min.x, pt.x);
				min.y = Math.min(min.y, pt.y);
				max.x = Math.max(max.x, pt.x);
				max.y = Math.max(max.y, pt.y);
			});
			return {
				width: max.x - min.x, height: max.y - min.y
			};
		};
	
	this.updateOnSelect = false;
	
	this.getstate = function() {
		var sel = this.fm.selectedFiles();
		return sel.length == 1 && sel[0].read && sel[0].write && sel[0].mime.indexOf('image/') !== -1 ? 0 : -1;
	};
	
	this.resizeRequest = function(data, f, dfrd) {
		var fm   = this.fm,
			file = f || fm.file(data.target),
			tmb  = file? file.tmb : null,
			enabled = fm.isCommandEnabled('resize', data.target);
		
		if (enabled && (! file || (file && file.read && file.write && file.mime.indexOf('image/') !== -1 ))) {
			return fm.request({
				data : Object.assign(data, {
					cmd : 'resize'
				}),
				notify : {type : 'resize', cnt : 1}
			})
			.fail(function(error) {
				if (dfrd) {
					dfrd.reject(error);
				}
			})
			.done(function() {
				if (data.quality) {
					fm.storage('jpgQuality', data.quality === fm.option('jpgQuality')? null : data.quality);
				}
				dfrd && dfrd.resolve();
			});
		} else {
			var error;
			
			if (file) {
				if (file.mime.indexOf('image/') === -1) {
					error = ['errResize', file.name, 'errUsupportType'];
				} else {
					error = ['errResize', file.name, 'errPerm'];
				}
			} else {
				error = ['errResize', data.target, 'errPerm'];
			}
			
			if (dfrd) {
				dfrd.reject(error);
			} else {
				fm.error(error);
			}
			return jQuery.Deferred().reject(error);
		}
	};
	
	this.exec = function(hashes) {
		var self  = this,
			fm    = this.fm,
			files = this.files(hashes),
			dfrd  = jQuery.Deferred(),
			api2  = (fm.api > 1),
			options = this.options,
			dialogWidth = 650,
			fmnode = fm.getUI(),
			ctrgrup = jQuery().controlgroup? 'controlgroup' : 'buttonset',
			grid8Def = typeof options.grid8px === 'undefined' || options.grid8px !== 'disable'? true : false,
			presetSize = Array.isArray(options.presetSize)? options.presetSize : [],
			clactive = 'elfinder-dialog-active',
			clsediting = fm.res('class', 'editing'),
			open = function(file, id) {
				var isJpeg   = (file.mime === 'image/jpeg'),
					dialog   = jQuery('<div class="elfinder-resize-container"/>'),
					input    = '<input type="number" class="ui-corner-all"/>',
					row      = '<div class="elfinder-resize-row"/>',
					label    = '<div class="elfinder-resize-label"/>',
					changeTm = null,
					operate  = false,
					opStart  = function() { operate = true; },
					opStop   = function() {
						if (operate) {
							operate = false;
							control.trigger('change');
						}
					},
					control  = jQuery('<div class="elfinder-resize-control"/>')
						.on('focus', 'input[type=text],input[type=number]', function() {
							jQuery(this).trigger('select');
						})
						.on('change', function() {
							changeTm && cancelAnimationFrame(changeTm);
							changeTm = requestAnimationFrame(function() {
								var panel, quty, canvas, ctx, img, sx, sy, sw, sh, deg, theta, bb;
								if (sizeImg && ! operate && (canvas = sizeImg.data('canvas'))) {
									panel = control.children('div.elfinder-resize-control-panel:visible');
									quty = panel.find('input.elfinder-resize-quality');
									if (quty.is(':visible')) {
										ctx = sizeImg.data('ctx');
										img = sizeImg.get(0);
										if (panel.hasClass('elfinder-resize-uiresize')) {
											// resize
											sw = canvas.width = width.val();
											sh = canvas.height = height.val();
											ctx.drawImage(img, 0, 0, sw, sh);
										} else if (panel.hasClass('elfinder-resize-uicrop')) {
											// crop
											sx = pointX.val();
											sy = pointY.val();
											sw = offsetX.val();
											sh = offsetY.val();
											canvas.width = sw;
											canvas.height = sh;
											ctx.drawImage(img, sx, sy, sw, sh, 0, 0, sw, sh);
										} else {
											// rotate
											deg = degree.val();
											theta = (degree.val() * Math.PI) / 180;
											bb = getBounceBox(owidth, oheight, theta);
											sw = canvas.width = bb.width;
											sh = canvas.height = bb.height;
											ctx.save();
											if (deg % 90 !== 0) {
												ctx.fillStyle = bg.val() || '#FFF';
												ctx.fillRect(0, 0, sw, sh);
											}
											ctx.translate(sw / 2, sh / 2);
											ctx.rotate(theta);
											ctx.drawImage(img, -img.width/2, -img.height/2, owidth, oheight);
											ctx.restore();
										}
										canvas.toBlob(function(blob) {
											blob && quty.next('span').text(' (' + fm.formatSize(blob.size) + ')');
										}, 'image/jpeg', Math.max(Math.min(quty.val(), 100), 1) / 100);
									}
								}
							});
						})
						.on('mouseup', 'input', function(e) {
							jQuery(e.target).trigger('change');
						}),
					preview  = jQuery('<div class="elfinder-resize-preview"/>')
						.on('touchmove', function(e) {
							if (jQuery(e.target).hasClass('touch-punch')) {
								e.stopPropagation();
								e.preventDefault();
							}
						}),
					spinner  = jQuery('<div class="elfinder-resize-loading">'+fm.i18n('ntfloadimg')+'</div>'),
					rhandle  = jQuery('<div class="elfinder-resize-handle touch-punch"/>'),
					rhandlec = jQuery('<div class="elfinder-resize-handle touch-punch"/>'),
					uiresize = jQuery('<div class="elfinder-resize-uiresize elfinder-resize-control-panel"/>'),
					uicrop   = jQuery('<div class="elfinder-resize-uicrop elfinder-resize-control-panel"/>'),
					uirotate = jQuery('<div class="elfinder-resize-rotate elfinder-resize-control-panel"/>'),
					uideg270 = jQuery('<button/>').attr('title',fm.i18n('rotate-cw')).append(jQuery('<span class="elfinder-button-icon elfinder-button-icon-rotate-l"/>')),
					uideg90  = jQuery('<button/>').attr('title',fm.i18n('rotate-ccw')).append(jQuery('<span class="elfinder-button-icon elfinder-button-icon-rotate-r"/>')),
					uiprop   = jQuery('<span />'),
					reset    = jQuery('<button class="elfinder-resize-reset">').text(fm.i18n('reset'))
						.on('click', function() {
							resetView();
						})
						.button({
							icons: {
								primary: 'ui-icon-arrowrefresh-1-n'
							},
							text: false
						}),
					uitype   = jQuery('<div class="elfinder-resize-type"/>')
						.append('<input type="radio" name="type" id="'+id+'-resize" value="resize" checked="checked" /><label for="'+id+'-resize">'+fm.i18n('resize')+'</label>',
						'<input class="api2" type="radio" name="type" id="'+id+'-crop" value="crop" /><label class="api2" for="'+id+'-crop">'+fm.i18n('crop')+'</label>',
						'<input class="api2" type="radio" name="type" id="'+id+'-rotate" value="rotate" /><label class="api2" for="'+id+'-rotate">'+fm.i18n('rotate')+'</label>'),
					mode     = 'resize',
					type     = uitype[ctrgrup]()[ctrgrup]('disable').find('input')
						.on('change', function() {
							mode = jQuery(this).val();
							
							resetView();
							resizable(true);
							croppable(true);
							rotateable(true);
							
							if (mode == 'resize') {
								uiresize.show();
								uirotate.hide();
								uicrop.hide();
								resizable();
								isJpeg && grid8px.insertAfter(uiresize.find('.elfinder-resize-grid8'));
							}
							else if (mode == 'crop') {
								uirotate.hide();
								uiresize.hide();
								uicrop.show();
								croppable();
								isJpeg && grid8px.insertAfter(uicrop.find('.elfinder-resize-grid8'));
							} else if (mode == 'rotate') {
								uiresize.hide();
								uicrop.hide();
								uirotate.show();
								rotateable();
							}
						}),
					width   = jQuery(input)
						.on('change', function() {
							var w = round(parseInt(width.val())),
								h = round(cratio ? w/ratio : parseInt(height.val()));

							if (w > 0 && h > 0) {
								resize.updateView(w, h);
								width.val(w);
								height.val(h);
							}
						}).addClass('elfinder-focus'),
					height  = jQuery(input)
						.on('change', function() {
							var h = round(parseInt(height.val())),
								w = round(cratio ? h*ratio : parseInt(width.val()));

							if (w > 0 && h > 0) {
								resize.updateView(w, h);
								width.val(w);
								height.val(h);
							}
						}),
					pointX  = jQuery(input).on('change', function(){crop.updateView();}),
					pointY  = jQuery(input).on('change', function(){crop.updateView();}),
					offsetX = jQuery(input).on('change', function(){crop.updateView('w');}),
					offsetY = jQuery(input).on('change', function(){crop.updateView('h');}),
					quality = isJpeg && api2?
						jQuery(input).val(fm.storage('jpgQuality') > 0? fm.storage('jpgQuality') : fm.option('jpgQuality'))
							.addClass('elfinder-resize-quality')
							.attr('min', '1').attr('max', '100').attr('title', '1 - 100')
							.on('blur', function(){
								var q = Math.min(100, Math.max(1, parseInt(this.value)));
								control.find('input.elfinder-resize-quality').val(q);
							})
						: null,
					degree = jQuery('<input type="number" class="ui-corner-all" maxlength="3" value="0" />')
						.on('change', function() {
							rotate.update();
						}),
					uidegslider = jQuery('<div class="elfinder-resize-rotate-slider touch-punch"/>')
						.slider({
							min: 0,
							max: 360,
							value: degree.val(),
							animate: true,
							start: opStart,
							stop: opStop,
							change: function(event, ui) {
								if (ui.value != uidegslider.slider('value')) {
									rotate.update(ui.value);
								}
							},
							slide: function(event, ui) {
								rotate.update(ui.value, false);
							}
						}).find('.ui-slider-handle')
							.addClass('elfinder-tabstop')
							.off('keydown')
							.on('keydown', function(e) {
								if (e.keyCode == jQuery.ui.keyCode.LEFT || e.keyCode == jQuery.ui.keyCode.RIGHT) {
									e.stopPropagation();
									e.preventDefault();
									rotate.update(Number(degree.val()) + (e.keyCode == jQuery.ui.keyCode.RIGHT? 1 : -1), false);
								}
							})
						.end(),
					pickimg,
					pickcanv,
					pickctx,
					pickc = {},
					pick = function(e) {
						var color, r, g, b, h, s, l;

						try {
							color = pickc[Math.round(e.offsetX)][Math.round(e.offsetY)];
						} catch(e) {}
						if (!color) return;

						r = color[0]; g = color[1]; b = color[2];
						h = color[3]; s = color[4]; l = color[5];

						setbg(r, g, b, (e.type === 'click'));
					},
					palpick = function(e) {
						setbg(jQuery(this).css('backgroundColor'), '', '', (e.type === 'click'));
					},
					setbg = function(r, g, b, off) {
						var s, m, cc;
						if (typeof r === 'string') {
							g = '';
							if (r && (s = jQuery('<span>').css('backgroundColor', r).css('backgroundColor')) && (m = s.match(/rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/i))) {
								r = Number(m[1]);
								g = Number(m[2]);
								b = Number(m[3]);
							}
						}
						cc = (g === '')? r : '#' + getColorCode(r, g, b);
						bg.val(cc).css({ backgroundColor: cc, backgroundImage: 'none', color: (r+g+b < 384? '#fff' : '#000') });
						preview.css('backgroundColor', cc);
						if (off) {
							imgr.off('.picker').removeClass('elfinder-resize-picking');
							pallet.off('.picker').removeClass('elfinder-resize-picking');
						}
					},
					getColorCode = function(r, g, b) {
						return jQuery.map([r,g,b], function(c){return ('0'+parseInt(c).toString(16)).slice(-2);}).join('');
					},
					picker = jQuery('<button>').text(fm.i18n('colorPicker'))
					.on('click', function() { 
						imgr.on('mousemove.picker click.picker', pick).addClass('elfinder-resize-picking');
						pallet.on('mousemove.picker click.picker', 'span', palpick).addClass('elfinder-resize-picking');
					})
					.button({
						icons: {
							primary: 'ui-icon-pin-s'
						},
						text: false
					}),
					reseter = jQuery('<button>').text(fm.i18n('reset'))
						.on('click', function() { 
							setbg('', '', '', true);
						})
						.button({
							icons: {
								primary: 'ui-icon-arrowrefresh-1-n'
							},
							text: false
						}),
					bg = jQuery('<input class="ui-corner-all elfinder-resize-bg" type="text">')
						.on('focus', function() {
							jQuery(this).attr('style', '');
						})
						.on('blur', function() {
							setbg(jQuery(this).val());
						}),
					pallet  = jQuery('<div class="elfinder-resize-pallet">').on('click', 'span', function() {
						setbg(jQuery(this).css('backgroundColor'));
					}),
					ratio   = 1,
					prop    = 1,
					owidth  = 0,
					oheight = 0,
					cratio  = true,
					cratioc = false,
					pwidth  = 0,
					pheight = 0,
					rwidth  = 0,
					rheight = 0,
					rdegree = 0,
					grid8   = isJpeg? grid8Def : false,
					constr  = jQuery('<button>').html(fm.i18n('aspectRatio'))
						.on('click', function() {
							cratio = ! cratio;
							constr.button('option', {
								icons : { primary: cratio? 'ui-icon-locked' : 'ui-icon-unlocked'}
							});
							resize.fixHeight();
							rhandle.resizable('option', 'aspectRatio', cratio).data('uiResizable')._aspectRatio = cratio;
						})
						.button({
							icons : {
								primary: cratio? 'ui-icon-locked' : 'ui-icon-unlocked'
							},
							text: false
						}),
					constrc = jQuery('<button>').html(fm.i18n('aspectRatio'))
						.on('click', function() {
							cratioc = ! cratioc;
							constrc.button('option', {
								icons : { primary: cratioc? 'ui-icon-locked' : 'ui-icon-unlocked'}
							});
							rhandlec.resizable('option', 'aspectRatio', cratioc).data('uiResizable')._aspectRatio = cratioc;
						})
						.button({
							icons : {
								primary: cratioc? 'ui-icon-locked' : 'ui-icon-unlocked'
							},
							text: false
						}),
					grid8px = jQuery('<button>').html(fm.i18n(grid8? 'enabled' : 'disabled')).toggleClass('ui-state-active', grid8)
						.on('click', function() {
							grid8 = ! grid8;
							grid8px.html(fm.i18n(grid8? 'enabled' : 'disabled')).toggleClass('ui-state-active', grid8);
							setStep8();
						})
						.button(),
					setStep8 = function() {
						var step = grid8? 8 : 1;
						jQuery.each([width, height, offsetX, offsetY, pointX, pointY], function() {
							this.attr('step', step);
						});
						if (grid8) {
							width.val(round(width.val()));
							height.val(round(height.val()));
							offsetX.val(round(offsetX.val()));
							offsetY.val(round(offsetY.val()));
							pointX.val(round(pointX.val()));
							pointY.val(round(pointY.val()));
							if (uiresize.is(':visible')) {
								resize.updateView(width.val(), height.val());
							} else if (uicrop.is(':visible')) {
								crop.updateView();
							}
						}
					},
					setuprimg = function() {
						var r_scale,
							fail = function() {
								bg.parent().hide();
								pallet.hide();
							};
						r_scale = Math.min(pwidth, pheight) / Math.sqrt(Math.pow(owidth, 2) + Math.pow(oheight, 2));
						rwidth = Math.ceil(owidth * r_scale);
						rheight = Math.ceil(oheight * r_scale);
						imgr.width(rwidth)
							.height(rheight)
							.css('margin-top', (pheight-rheight)/2 + 'px')
							.css('margin-left', (pwidth-rwidth)/2 + 'px');
						if (imgr.is(':visible') && bg.is(':visible')) {
							if (file.mime !== 'image/png') {
								preview.css('backgroundColor', bg.val());
								pickimg = jQuery('<img>');
								if (fm.isCORS) {
									pickimg.attr('crossorigin', 'use-credentials');
								}
								pickimg.on('load', function() {
									if (pickcanv && pickcanv.width !== rwidth) {
										setColorData();
									}
								})
								.on('error', fail)
								.attr('src', canvSrc);
							} else {
								fail();
							}
						}
					},
					setupimg = function() {
						resize.updateView(owidth, oheight);
						setuprimg();
						basec
							.width(img.width())
							.height(img.height());
						imgc
							.width(img.width())
							.height(img.height());
						crop.updateView();
						jpgCalc();
					},
					setColorData = function() {
						if (pickctx) {
							var n, w, h, r, g, b, a, s, l, hsl, hue,
								data, scale, tx1, tx2, ty1, ty2, rgb,
								domi = {},
								domic = [],
								domiv, palc,
								rgbToHsl = function (r, g, b) {
									var h, s, l,
										max = Math.max(Math.max(r, g), b),
										min = Math.min(Math.min(r, g), b);
		
									// Hue, 0 ~ 359
									if (max === min) {
										h = 0;
									} else if (r === max) {
										h = ((g - b) / (max - min) * 60 + 360) % 360;
									} else if (g === max) {
										h = (b - r) / (max - min) * 60 + 120;
									} else if (b === max) {
										h = (r - g) / (max - min) * 60 + 240;
									}
									// Saturation, 0 ~ 1
									s = (max - min) / max;
									// Lightness, 0 ~ 1
									l = (r *  0.3 + g * 0.59 + b * 0.11) / 255;
		
									return [h, s, l, 'hsl'];
								},
								rgbRound = function(c) {
									return Math.round(c / 8) * 8;
								};
							
							calc:
							try {
								w = pickcanv.width = imgr.width();
								h = pickcanv.height = imgr.height();
								scale = w / owidth;
								pickctx.scale(scale, scale);
								pickctx.drawImage(pickimg.get(0), 0, 0);
			
								data = pickctx.getImageData(0, 0, w, h).data;
			
								// Range to detect the dominant color
								tx1 = w * 0.1;
								tx2 = w * 0.9;
								ty1 = h * 0.1;
								ty2 = h * 0.9;
			
								for (var y = 0; y < h - 1; y++) {
									for (var x = 0; x < w - 1; x++) {
										n = x * 4 + y * w * 4;
										// RGB
										r = data[n]; g = data[n + 1]; b = data[n + 2]; a = data[n + 3];
										// check alpha ch
										if (a !== 255) {
											bg.parent().hide();
											pallet.hide();
											break calc;
										}
										// HSL
										hsl = rgbToHsl(r, g, b);
										hue = Math.round(hsl[0]); s = Math.round(hsl[1] * 100); l = Math.round(hsl[2] * 100);
										if (! pickc[x]) {
											pickc[x] = {};
										}
										// set pickc
										pickc[x][y] = [r, g, b, hue, s, l];
										// detect the dominant color
										if ((x < tx1 || x > tx2) && (y < ty1 || y > ty2)) {
											rgb = rgbRound(r) + ',' + rgbRound(g) + ',' + rgbRound(b);
											if (! domi[rgb]) {
												domi[rgb] = 1;
											} else {
												++domi[rgb];
											}
										}
									}
								}
								
								if (! pallet.children(':first').length) {
									palc = 1;
									jQuery.each(domi, function(c, v) {
										domic.push({c: c, v: v});
									});
									jQuery.each(domic.sort(function(a, b) {
										return (a.v > b.v)? -1 : 1;
									}), function() {
										if (this.v < 2 || palc > 10) {
											return false;
										}
										pallet.append(jQuery('<span style="width:20px;height:20px;display:inline-block;background-color:rgb('+this.c+');">'));
										++palc;
									});
								}
							} catch(e) {
								picker.hide();
								pallet.hide();
							}
						}
					},
					setupPicker = function() {
						try {
							pickcanv = document.createElement('canvas');
							pickctx = pickcanv.getContext('2d');
						} catch(e) {
							picker.hide();
							pallet.hide();
						}
					},
					setupPreset = function() {
						preset.on('click', 'span.elfinder-resize-preset', function() {
							var btn = jQuery(this),
								w = btn.data('s')[0],
								h = btn.data('s')[1],
								r = owidth / oheight;
							btn.data('s', [h, w]).text(h + 'x' + w);
							if (owidth > w || oheight > h) {
								if (owidth <= w) {
									w = round(h * r);
								} else if (oheight <= h) {
									h = round(w / r);
								} else {
									if (owidth - w > oheight - h) {
										h = round(w / r);
									} else {
										w = round(h * r);
									}
								}
							} else {
								w = owidth;
								h = oheight;
							}
							width.val(w);
							height.val(h);
							resize.updateView(w, h);
							jpgCalc();
						});
						presetc.on('click', 'span.elfinder-resize-preset', function() {
							var btn = jQuery(this),
								w = btn.data('s')[0],
								h = btn.data('s')[1],
								x = pointX.val(),
								y = pointY.val();
							
							btn.data('s', [h, w]).text(h + 'x' + w);
							if (owidth >= w && oheight >= h) {
								if (owidth - w - x < 0) {
									x = owidth - w;
								}
								if (oheight - h - y < 0) {
									y = oheight - h;
								}
								pointX.val(x);
								pointY.val(y);
								offsetX.val(w);
								offsetY.val(h);
								crop.updateView();
								jpgCalc();
							}
						});
						presetc.children('span.elfinder-resize-preset').each(function() {
							var btn = jQuery(this),
								w = btn.data('s')[0],
								h = btn.data('s')[1];
							
							btn[(owidth >= w && oheight >= h)? 'show' : 'hide']();
						});
					},
					dimreq  = null,
					inited  = false,
					setdim  = function(dim) {
						var rfile = fm.file(file.hash);
						rfile.width = dim[0];
						rfile.height = dim[1];
					},
					init    = function() {
						var elm, memSize, r_scale, imgRatio;
						
						if (inited) {
							return;
						}
						inited = true;
						dimreq && dimreq.state && dimreq.state() === 'pending' && dimreq.reject();
						
						// check lossless rotete
						if (fm.api >= 2.1030) {
							if (losslessRotate === 0) {
								fm.request({
									data: {
										cmd    : 'resize',
										target : file.hash,
										degree : 0,
										mode   : 'rotate'
									},
									preventDefault : true
								}).done(function(data) {
									losslessRotate = data.losslessRotate? 1 : -1;
									if (losslessRotate === 1 && (degree.val() % 90 === 0)) {
										uirotate.children('div.elfinder-resize-quality').hide();
									}
								}).fail(function() {
									losslessRotate = -1;
								});
							}
						} else {
							losslessRotate = -1;
						}
						
						elm = img.get(0);
						memSize = file.width && file.height? {w: file.width, h: file.height} : (elm.naturalWidth? null : {w: img.width(), h: img.height()});
					
						memSize && img.removeAttr('width').removeAttr('height');
						
						owidth  = file.width || elm.naturalWidth || elm.width || img.width();
						oheight = file.height || elm.naturalHeight || elm.height || img.height();
						if (!file.width || !file.height) {
							setdim([owidth, oheight]);
						}
						
						memSize && img.width(memSize.w).height(memSize.h);
						
						dMinBtn.show();
	
						imgRatio = oheight / owidth;
						
						if (imgRatio < 1 && preview.height() > preview.width() * imgRatio) {
							preview.height(preview.width() * imgRatio);
						}
						
						if (preview.height() > img.height() + 20) {
							preview.height(img.height() + 20);
						}
						
						pheight = preview.height() - (rhandle.outerHeight() - rhandle.height());
						
						spinner.remove();
						
						ratio = owidth/oheight;
	
						rhandle.append(img.show()).show();
						width.val(owidth);
						height.val(oheight);
	
						setupPicker();
						setupPreset();
						setupimg();
						
						uitype[ctrgrup]('enable');
						control.find('input,select').prop('disabled', false)
							.filter(':text').on('keydown', function(e) {
								var cOpts;
								if (e.keyCode == jQuery.ui.keyCode.ENTER) {
									e.stopPropagation();
									e.preventDefault();
									cOpts = {
										title  : jQuery('input:checked', uitype).val(),
										text   : 'confirmReq',
										accept : {
											label    : 'btnApply',
											callback : function() {  
												save();
											}
										},
										cancel : {
											label    : 'btnCancel',
											callback : function(){
												jQuery(this).trigger('focus');
											}
										}
									};
										
									if (useSaveAs) {
										cOpts['buttons'] = [{
											label    : 'btnSaveAs',
											callback : function() {
												requestAnimationFrame(saveAs);
											}
										}];
									}
									fm.confirm(cOpts);
									return;
								}
							})
							.on('keyup', function() {
								var $this = jQuery(this);
								if (! $this.hasClass('elfinder-resize-bg')) {
									requestAnimationFrame(function() {
										$this.val($this.val().replace(/[^0-9]/g, ''));
									});
								}
							})
							.filter(':first');
						
						setStep8();
						!fm.UA.Mobile && width.trigger('focus');
						resizable();
					},
					img     = jQuery('<img/>')
						.on('load', init)
						.on('error', function() {
							spinner.text('Unable to load image').css('background', 'transparent');
						}),
					basec = jQuery('<div/>'),
					imgc = jQuery('<img/>'),
					coverc = jQuery('<div/>'),
					imgr = jQuery('<img class="elfinder-resize-imgrotate" />'),
					round = function(v, max) {
						v = grid8? Math.round(v/8)*8 : Math.round(v);
						v = Math.max(0, v);
						if (max && v > max) {
							v = grid8? Math.floor(max/8)*8 : max;
						}
						return v;
					},
					resetView = function() {
						width.val(owidth);
						height.val(oheight);
						resize.updateView(owidth, oheight);
						pointX.val(0);
						pointY.val(0);
						offsetX.val(owidth);
						offsetY.val(oheight);
						crop.updateView();
						jpgCalc();
					},
					resize = {
						update : function() {
							width.val(round(img.width()/prop));
							height.val(round(img.height()/prop));
							jpgCalc();
						},
						
						updateView : function(w, h) {
							if (w > pwidth || h > pheight) {
								if (w / pwidth > h / pheight) {
									prop = pwidth / w;
									img.width(pwidth).height(round(h*prop));
								} else {
									prop = pheight / h;
									img.height(pheight).width(round(w*prop));
								}
							} else {
								img.width(round(w)).height(round(h));
							}
							
							prop = img.width()/w;
							uiprop.text('1 : '+(1/prop).toFixed(2));
							resize.updateHandle();
						},
						
						updateHandle : function() {
							rhandle.width(img.width()).height(img.height());
						},
						fixHeight : function() {
							var w, h;
							if (cratio) {
								w = width.val();
								h = round(w/ratio);
								resize.updateView(w, h);
								height.val(h);
							}
						}
					},
					crop = {
						update : function(change) {
							pointX.val(round(((rhandlec.data('x')||rhandlec.position().left))/prop, owidth));
							pointY.val(round(((rhandlec.data('y')||rhandlec.position().top))/prop, oheight));
							if (change !== 'xy') {
								offsetX.val(round((rhandlec.data('w')||rhandlec.width())/prop, owidth - pointX.val()));
								offsetY.val(round((rhandlec.data('h')||rhandlec.height())/prop, oheight - pointY.val()));
							}
							jpgCalc();
						},
						updateView : function(change) {
							var r, x, y, w, h;
							
							pointX.val(round(pointX.val(), owidth - (grid8? 8 : 1)));
							pointY.val(round(pointY.val(), oheight - (grid8? 8 : 1)));
							offsetX.val(round(offsetX.val(), owidth - pointX.val()));
							offsetY.val(round(offsetY.val(), oheight - pointY.val()));
							
							if (cratioc) {
								r = coverc.width() / coverc.height();
								if (change === 'w') {
									offsetY.val(round(parseInt(offsetX.val()) / r));
								} else if (change === 'h') {
									offsetX.val(round(parseInt(offsetY.val()) * r));
								}
							}
							x = Math.round(parseInt(pointX.val()) * prop);
							y = Math.round(parseInt(pointY.val()) * prop);
							if (change !== 'xy') {
								w = Math.round(parseInt(offsetX.val()) * prop);
								h = Math.round(parseInt(offsetY.val()) * prop);
							} else {
								w = rhandlec.data('w');
								h = rhandlec.data('h');
							}
							rhandlec.data({x: x, y: y, w: w, h: h})
								.width(w)
								.height(h)
								.css({left: x, top: y});
							coverc.width(w)
								.height(h);
						},
						resize_update : function(e, ui) {
							rhandlec.data({x: ui.position.left, y: ui.position.top, w: ui.size.width, h: ui.size.height});
							crop.update();
							crop.updateView();
						},
						drag_update : function(e, ui) {
							rhandlec.data({x: ui.position.left, y: ui.position.top});
							crop.update('xy');
						}
					},
					rotate = {
						mouseStartAngle : 0,
						imageStartAngle : 0,
						imageBeingRotated : false,
						
						setQuality : function() {
							uirotate.children('div.elfinder-resize-quality')[(losslessRotate > 0 && (degree.val() % 90) === 0)? 'hide' : 'show']();
						},
						
						update : function(value, animate) {
							if (typeof value == 'undefined') {
								rdegree = value = parseInt(degree.val());
							}
							if (typeof animate == 'undefined') {
								animate = true;
							}
							if (! animate || fm.UA.Opera || fm.UA.ltIE8) {
								imgr.rotate(value);
							} else {
								imgr.animate({rotate: value + 'deg'});
							}
							value = value % 360;
							if (value < 0) {
								value += 360;
							}
							degree.val(parseInt(value));

							uidegslider.slider('value', degree.val());
							
							rotate.setQuality();
						},
						
						execute : function ( e ) {
							
							if ( !rotate.imageBeingRotated ) return;
							
							var imageCentre = rotate.getCenter( imgr );
							var ev = e.originalEvent.touches? e.originalEvent.touches[0] : e;
							var mouseXFromCentre = ev.pageX - imageCentre[0];
							var mouseYFromCentre = ev.pageY - imageCentre[1];
							var mouseAngle = Math.atan2( mouseYFromCentre, mouseXFromCentre );
							
							var rotateAngle = mouseAngle - rotate.mouseStartAngle + rotate.imageStartAngle;
							rotateAngle = Math.round(parseFloat(rotateAngle) * 180 / Math.PI);
							
							if ( e.shiftKey ) {
								rotateAngle = Math.round((rotateAngle + 6)/15) * 15;
							}
							
							imgr.rotate(rotateAngle);
							
							rotateAngle = rotateAngle % 360;
							if (rotateAngle < 0) {
								rotateAngle += 360;
							}
							degree.val(rotateAngle);

							uidegslider.slider('value', degree.val());
							
							rotate.setQuality();
							
							return false;
						},
						
						start : function ( e ) {
							if (imgr.hasClass('elfinder-resize-picking')) {
								return;
							}
							
							opStart();
							rotate.imageBeingRotated = true;
							
							var imageCentre = rotate.getCenter( imgr );
							var ev = e.originalEvent.touches? e.originalEvent.touches[0] : e;
							var mouseStartXFromCentre = ev.pageX - imageCentre[0];
							var mouseStartYFromCentre = ev.pageY - imageCentre[1];
							rotate.mouseStartAngle = Math.atan2( mouseStartYFromCentre, mouseStartXFromCentre );
							
							rotate.imageStartAngle = parseFloat(imgr.rotate()) * Math.PI / 180.0;
							
							jQuery(document).on('mousemove', rotate.execute);
							imgr.on('touchmove', rotate.execute);
							
							return false;
						},
							
						stop : function ( e ) {
							
							if ( !rotate.imageBeingRotated ) return;
							
							jQuery(document).off('mousemove', rotate.execute);
							imgr.off('touchmove', rotate.execute);
							
							requestAnimationFrame(function() { rotate.imageBeingRotated = false; });
							opStop();
							
							return false;
						},
						
						getCenter : function ( image ) {
							
							var currentRotation = imgr.rotate();
							imgr.rotate(0);
							
							var imageOffset = imgr.offset();
							var imageCentreX = imageOffset.left + imgr.width() / 2;
							var imageCentreY = imageOffset.top + imgr.height() / 2;
							
							imgr.rotate(currentRotation);
							
							return Array( imageCentreX, imageCentreY );
						}
					},
					resizable = function(destroy) {
						if (destroy) {
							rhandle.filter(':ui-resizable').resizable('destroy');
							rhandle.hide();
						}
						else {
							rhandle.show();
							rhandle.resizable({
								alsoResize  : img,
								aspectRatio : cratio,
								resize      : resize.update,
								start       : opStart,
								stop        : function(e) {
									resize.fixHeight;
									resize.updateView(width.val(), height.val());
									opStop();
								}
							});
							dinit();
						}
					},
					croppable = function(destroy) {
						if (destroy) {
							rhandlec.filter(':ui-resizable').resizable('destroy')
								.filter(':ui-draggable').draggable('destroy');
							basec.hide();
						}
						else {
							basec.show();
							
							rhandlec
								.resizable({
									containment : basec,
									aspectRatio : cratioc,
									resize      : crop.resize_update,
									start       : opStart,
									stop        : opStop,
									handles     : 'all'
								})
								.draggable({
									handle      : coverc,
									containment : imgc,
									drag        : crop.drag_update,
									start       : opStart,
									stop        : function() {
										crop.updateView('xy');
										opStop();
									}
								});
							
							dinit();
							crop.update();
						}
					},
					rotateable = function(destroy) {
						if (destroy) {
							imgr.hide();
						}
						else {
							imgr.show();
							dinit();
						}
					},
					checkVals = function() {
						var w, h, x, y, d, q, b = '';
						
						if (mode == 'resize') {
							w = parseInt(width.val()) || 0;
							h = parseInt(height.val()) || 0;
						} else if (mode == 'crop') {
							w = parseInt(offsetX.val()) || 0;
							h = parseInt(offsetY.val()) || 0;
							x = parseInt(pointX.val()) || 0;
							y = parseInt(pointY.val()) || 0;
						} else if (mode == 'rotate') {
							w = owidth;
							h = oheight;
							d = parseInt(degree.val()) || 0;
							if (d < 0 || d > 360) {
								fm.error('Invalid rotate degree');
								return false;
							}
							if (d == 0 || d == 360) {
								fm.error('errResizeNoChange');
								return false;
							}
							b = bg.val();
						}
						q = quality? parseInt(quality.val()) : 0;
						
						if (mode != 'rotate') {
							if (w <= 0 || h <= 0) {
								fm.error('Invalid image size');
								return false;
							}
							if (w == owidth && h == oheight) {
								fm.error('errResizeNoChange');
								return false;
							}
						}
						
						return {w: w, h: h, x: x, y: y, d: d, q: q, b: b};
					},
					save = function() {
						var vals;
						
						if (vals = checkVals()) {
							dialog.elfinderdialog('close');
							self.resizeRequest({
								target : file.hash,
								width  : vals.w,
								height : vals.h,
								x      : vals.x,
								y      : vals.y,
								degree : vals.d,
								quality: vals.q,
								bg     : vals.b,
								mode   : mode
							}, file, dfrd);
						}
					},
					saveAs = function() {
						var fail = function() {
								dialogs.addClass(clsediting).fadeIn(function() {
									base.addClass(clactive);
								});
								fm.disable();
							},
							make = function() {
								self.mime = file.mime;
								self.prefix = file.name.replace(/ \d+(\.[^.]+)?$/, '$1');
								self.requestCmd = 'mkfile';
								self.nextAction = {};
								self.data = {target : file.phash};
								jQuery.proxy(fm.res('mixin', 'make'), self)()
									.done(function(data) {
										var hash, dfd;
										if (data.added && data.added.length) {
											hash = data.added[0].hash;
											dfd = fm.api < 2.1032? fm.url(file.hash, { async: true, temporary: true }) : null;
											jQuery.when(dfd).done(function(url) {
												fm.request({
													options : {type : 'post'},
													data : {
														cmd     : 'put',
														target  : hash,
														encoding: dfd? 'scheme' : 'hash', 
														content : dfd? fm.convAbsUrl(url) : file.hash
													},
													notify : {type : 'copy', cnt : 1},
													syncOnFail : true
												})
												.fail(fail)
												.done(function(data) {
													data = fm.normalize(data);
													fm.updateCache(data);
													file = fm.file(hash);
													data.changed && data.changed.length && fm.change(data);
													base.show().find('.elfinder-dialog-title').html(fm.escape(file.name));
													save();
													dialogs.fadeIn();
												});
											}).fail(fail);
										} else {
											fail();
										}
									})
									.fail(fail)
									.always(function() {
										delete self.mime;
										delete self.prefix;
										delete self.nextAction;
										delete self.data;
									});
								fm.trigger('unselectfiles', { files: [ file.hash ] });
							},
							reqOpen = null,
							dialogs;
						
						if (checkVals()) {
							dialogs = fmnode.children('.' + self.dialogClass + ':visible').removeClass(clsediting).fadeOut();
							base.removeClass(clactive);
							fm.enable();
							if (fm.searchStatus.state < 2 && file.phash !== fm.cwd().hash) {
								reqOpen = fm.exec('open', [file.phash], {thash: file.phash});
							}
							
							jQuery.when([reqOpen]).done(function() {
								reqOpen? fm.one('cwdrender', make) : make();
							}).fail(fail);
						}
					},
					buttons = {},
					hline   = 'elfinder-resize-handle-hline',
					vline   = 'elfinder-resize-handle-vline',
					rpoint  = 'elfinder-resize-handle-point',
					src     = fm.openUrl(file.hash),
					canvSrc = fm.openUrl(file.hash, !fm.isSameOrigin(src)),
					sizeImg = quality? jQuery('<img>').attr('crossorigin', fm.isCORS? 'use-credentials' : '').attr('src', canvSrc).on('load', function() {
						try {
							var canv = document.createElement('canvas');
							sizeImg.data('canvas', canv).data('ctx', canv.getContext('2d'));
							jpgCalc();
						} catch(e) {
							sizeImg.removeData('canvas').removeData('ctx');
						}
					}) : null,
					jpgCalc = function() {
						control.find('input.elfinder-resize-quality:visible').trigger('change');
					},
					dinit   = function(e) {
						if (base.hasClass('elfinder-dialog-minimized') || base.is(':hidden')) {
							return;
						}
						
						preset.hide();
						presetc.hide();
						
						var win   = fm.options.dialogContained? fmnode : jQuery(window),
							winH  = win.height(),
							winW  = win.width(),
							presW = 'auto',
							presIn = true,
							dw, ctrW, prvW;
						
						base.width(Math.min(dialogWidth, winW - 30));
						preview.attr('style', '');
						if (owidth && oheight) {
							pwidth  = preview.width()  - (rhandle.outerWidth()  - rhandle.width());
							pheight = preview.height() - (rhandle.outerHeight() - rhandle.height());
							resize.updateView(owidth, oheight);
						}
						ctrW  = dialog.find('div.elfinder-resize-control').width();
						prvW  = preview.width();
						
						dw = dialog.width() - 20;
						if (prvW > dw) {
							preview.width(dw);
							presIn = false;
						} else if ((dw - prvW) < ctrW) {
							if (winW > winH) {
								preview.width(dw - ctrW - 20);
							} else {
								preview.css({ float: 'none', marginLeft: 'auto', marginRight: 'auto'});
								presIn = false;
							}
						}
						if (presIn) {
							presW = ctrW;
						}
						pwidth  = preview.width()  - (rhandle.outerWidth()  - rhandle.width());
						if (fmnode.hasClass('elfinder-fullscreen')) {
							if (base.height() > winH) {
								winH -= 2;
								preview.height(winH - base.height() + preview.height());
								base.css('top', 0 - fmnode.offset().top);
							}
						} else {
							winH -= 30;
							(preview.height() > winH) && preview.height(winH);
						}
						pheight = preview.height() - (rhandle.outerHeight() - rhandle.height());
						if (owidth && oheight) {
							setupimg();
						}
						if (img.height() && preview.height() > img.height() + 20) {
							preview.height(img.height() + 20);
							pheight = preview.height() - (rhandle.outerHeight() - rhandle.height());
							setuprimg();
						}
						
						preset.css('width', presW).show();
						presetc.css('width', presW).show();
						if (!presetc.children('span.elfinder-resize-preset:visible').length) {
							presetc.hide();
						}
					},
					preset = (function() {
						var sets = jQuery('<fieldset class="elfinder-resize-preset-container">').append(jQuery('<legend>').html(fm.i18n('presets'))).hide(),
							hasC;
						jQuery.each(presetSize, function(i, s) {
							if (s.length === 2) {
								hasC = true;
								sets.append(jQuery('<span class="elfinder-resize-preset"/>')
									.data('s', s)
									.text(s[0]+'x'+s[1])
									.button()
								);
							}
						});
						if (!hasC) {
							return jQuery();
						} else {
							return sets;
						}
					})(),
					presetc = preset.clone(true),
					useSaveAs = fm.uploadMimeCheck(file.mime, file.phash),
					dMinBtn, base;
				
				uiresize.append(
					jQuery(row).append(jQuery(label).text(fm.i18n('width')), width),
					jQuery(row).append(jQuery(label).text(fm.i18n('height')), height, jQuery('<div class="elfinder-resize-whctrls">').append(constr, reset)),
					(quality? jQuery(row).append(jQuery(label).text(fm.i18n('quality')), quality, jQuery('<span/>')) : jQuery()),
					(isJpeg? jQuery(row).append(jQuery(label).text(fm.i18n('8pxgrid')).addClass('elfinder-resize-grid8'), grid8px) : jQuery()),
					jQuery(row).append(jQuery(label).text(fm.i18n('scale')), uiprop),
					jQuery(row).append(preset)
				);

				if (api2) {
					uicrop.append(
						jQuery(row).append(jQuery(label).text('X'), pointX),
						jQuery(row).append(jQuery(label).text('Y')).append(pointY),
						jQuery(row).append(jQuery(label).text(fm.i18n('width')), offsetX),
						jQuery(row).append(jQuery(label).text(fm.i18n('height')), offsetY, jQuery('<div class="elfinder-resize-whctrls">').append(constrc, reset.clone(true))),
						(quality? jQuery(row).append(jQuery(label).text(fm.i18n('quality')), quality.clone(true), jQuery('<span/>')) : jQuery()),
						(isJpeg? jQuery(row).append(jQuery(label).text(fm.i18n('8pxgrid')).addClass('elfinder-resize-grid8')) : jQuery()),
						jQuery(row).append(presetc)
					);
					
					uirotate.append(
						jQuery(row).addClass('elfinder-resize-degree').append(
							jQuery(label).text(fm.i18n('rotate')),
							degree,
							jQuery('<span/>').text(fm.i18n('degree')),
							jQuery('<div/>').append(uideg270, uideg90)[ctrgrup]()
						),
						jQuery(row).css('height', '20px').append(uidegslider),
						((quality)? jQuery(row)[losslessRotate < 1? 'show' : 'hide']().addClass('elfinder-resize-quality').append(
							jQuery(label).text(fm.i18n('quality')),
							quality.clone(true),
							jQuery('<span/>')) : jQuery()
						),
						jQuery(row).append(jQuery(label).text(fm.i18n('bgcolor')), bg, picker, reseter),
						jQuery(row).css('height', '20px').append(pallet)
					);
					uideg270.on('click', function() {
						rdegree = rdegree - 90;
						rotate.update(rdegree);
					});
					uideg90.on('click', function(){
						rdegree = rdegree + 90;
						rotate.update(rdegree);
					});
				}
				
				dialog.append(uitype).on('resize', function(e){
					e.stopPropagation();
				});

				if (api2) {
					control.append(/*jQuery(row), */uiresize, uicrop.hide(), uirotate.hide());
				} else {
					control.append(/*jQuery(row), */uiresize);
				}
				
				rhandle.append('<div class="'+hline+' '+hline+'-top"/>',
					'<div class="'+hline+' '+hline+'-bottom"/>',
					'<div class="'+vline+' '+vline+'-left"/>',
					'<div class="'+vline+' '+vline+'-right"/>',
					'<div class="'+rpoint+' '+rpoint+'-e"/>',
					'<div class="'+rpoint+' '+rpoint+'-se"/>',
					'<div class="'+rpoint+' '+rpoint+'-s"/>');
					
				preview.append(spinner).append(rhandle.hide()).append(img.hide());

				if (api2) {
					rhandlec.css('position', 'absolute')
						.append('<div class="'+hline+' '+hline+'-top"/>',
						'<div class="'+hline+' '+hline+'-bottom"/>',
						'<div class="'+vline+' '+vline+'-left"/>',
						'<div class="'+vline+' '+vline+'-right"/>',
						'<div class="'+rpoint+' '+rpoint+'-n"/>',
						'<div class="'+rpoint+' '+rpoint+'-e"/>',
						'<div class="'+rpoint+' '+rpoint+'-s"/>',
						'<div class="'+rpoint+' '+rpoint+'-w"/>',
						'<div class="'+rpoint+' '+rpoint+'-ne"/>',
						'<div class="'+rpoint+' '+rpoint+'-se"/>',
						'<div class="'+rpoint+' '+rpoint+'-sw"/>',
						'<div class="'+rpoint+' '+rpoint+'-nw"/>');

					preview.append(basec.css('position', 'absolute').hide().append(imgc, rhandlec.append(coverc)));
					
					preview.append(imgr.hide());
				}
				
				preview.css('overflow', 'hidden');
				
				dialog.append(preview, control);
				
				buttons[fm.i18n('btnApply')] = save;
				if (useSaveAs) {
					buttons[fm.i18n('btnSaveAs')] = function() { requestAnimationFrame(saveAs); };
				}
				buttons[fm.i18n('btnCancel')] = function() { dialog.elfinderdialog('close'); };
				
				dialog.find('input,button').addClass('elfinder-tabstop');
				
				base = self.fmDialog(dialog, {
					title          : fm.escape(file.name),
					width          : dialogWidth,
					resizable      : false,
					buttons        : buttons,
					open           : function() {
						var substituteImg = (fm.option('substituteImg', file.hash) && file.size > options.dimSubImgSize)? true : false,
							hasSize = (file.width && file.height)? true : false;
						dialog.parent().css('overflow', 'hidden');
						dMinBtn = base.find('.ui-dialog-titlebar .elfinder-titlebar-minimize').hide();
						fm.bind('resize', dinit);
						img.attr('src', src);
						imgc.attr('src', src);
						imgr.attr('src', src);
						if (api2) {
							imgr.on('mousedown touchstart', rotate.start)
								.on('touchend', rotate.stop);
							base.on('mouseup', rotate.stop);
						}
						if (hasSize && !substituteImg) {
							return init();
						}
						if (file.size > (options.getDimThreshold || 0)) {
							dimreq = fm.request({
								data : {cmd : 'dim', target : file.hash, substitute : (substituteImg? 400 : '')},
								preventDefault : true
							})
							.done(function(data) {
								if (data.dim) {
									var dim = data.dim.split('x');
									file.width = dim[0];
									file.height = dim[1];
									setdim(dim);
									if (data.url) {
										img.attr('src', data.url);
										imgc.attr('src', data.url);
										imgr.attr('src', data.url);
									}
									return init();
								}
							});
						} else if (hasSize) {
							return init();
						}
					},
					close          : function() {
						if (api2) {
							imgr.off('mousedown touchstart', rotate.start)
								.off('touchend', rotate.stop);
							jQuery(document).off('mouseup', rotate.stop);
						}
						fm.unbind('resize', dinit);
						jQuery(this).elfinderdialog('destroy');
					},
					resize         : function(e, data) {
						if (data && data.minimize === 'off') {
							dinit();
						}
					}
				}).attr('id', id).closest('.ui-dialog').addClass(clsediting);
				
				// for IE < 9 dialog mising at open second+ time.
				if (fm.UA.ltIE8) {
					jQuery('.elfinder-dialog').css('filter', '');
				}
				
				coverc.css({ 'opacity': 0.2, 'background-color': '#fff', 'position': 'absolute'}),
				rhandlec.css('cursor', 'move');
				rhandlec.find('.elfinder-resize-handle-point').css({
					'background-color' : '#fff',
					'opacity': 0.5,
					'border-color':'#000'
				});

				if (! api2) {
					uitype.find('.api2').remove();
				}
				
				control.find('input,select').prop('disabled', true);
				control.find('input.elfinder-resize-quality')
					.next('span').addClass('elfinder-resize-jpgsize').attr('title', fm.i18n('roughFileSize'));

			},
			
			id, dialog
			;
			

		if (!files.length || files[0].mime.indexOf('image/') === -1) {
			return dfrd.reject();
		}
		
		id = 'resize-'+fm.namespace+'-'+files[0].hash;
		dialog = fmnode.find('#'+id);
		
		if (dialog.length) {
			dialog.elfinderdialog('toTop');
			return dfrd.resolve();
		}
		
		open(files[0], id);
			
		return dfrd;
	};

};

(function ($) {
	
	var findProperty = function (styleObject, styleArgs) {
		var i = 0 ;
		for( i in styleArgs) {
	        if (typeof styleObject[styleArgs[i]] != 'undefined') 
	        	return styleArgs[i];
		}
		styleObject[styleArgs[i]] = '';
	    return styleArgs[i];
	};
	
	jQuery.cssHooks.rotate = {
		get: function(elem, computed, extra) {
			return jQuery(elem).rotate();
		},
		set: function(elem, value) {
			jQuery(elem).rotate(value);
			return value;
		}
	};
	jQuery.cssHooks.transform = {
		get: function(elem, computed, extra) {
			var name = findProperty( elem.style , 
				['WebkitTransform', 'MozTransform', 'OTransform' , 'msTransform' , 'transform'] );
			return elem.style[name];
		},
		set: function(elem, value) {
			var name = findProperty( elem.style , 
				['WebkitTransform', 'MozTransform', 'OTransform' , 'msTransform' , 'transform'] );
			elem.style[name] = value;
			return value;
		}
	};
	
	jQuery.fn.rotate = function(val) {
		var r;
		if (typeof val == 'undefined') {
			if (!!window.opera) {
				r = this.css('transform').match(/rotate\((.*?)\)/);
				return  ( r && r[1])?
					Math.round(parseFloat(r[1]) * 180 / Math.PI) : 0;
			} else {
				r = this.css('transform').match(/rotate\((.*?)\)/);
				return  ( r && r[1])? parseInt(r[1]) : 0;
			}
		}
		this.css('transform', 
			this.css('transform').replace(/none|rotate\(.*?\)/, '') + 'rotate(' + parseInt(val) + 'deg)');
		return this;
	};

	jQuery.fx.step.rotate  = function(fx) {
		if ( fx.state == 0 ) {
			fx.start = jQuery(fx.elem).rotate();
			fx.now = fx.start;
		}
		jQuery(fx.elem).rotate(fx.now);
	};

	if (typeof window.addEventListener == "undefined" && typeof document.getElementsByClassName == "undefined") { // IE & IE<9
		var GetAbsoluteXY = function(element) {
			var pnode = element;
			var x = pnode.offsetLeft;
			var y = pnode.offsetTop;
			
			while ( pnode.offsetParent ) {
				pnode = pnode.offsetParent;
				if (pnode != document.body && pnode.currentStyle['position'] != 'static') {
					break;
				}
				if (pnode != document.body && pnode != document.documentElement) {
					x -= pnode.scrollLeft;
					y -= pnode.scrollTop;
				}
				x += pnode.offsetLeft;
				y += pnode.offsetTop;
			}
			
			return { x: x, y: y };
		};
		
		var StaticToAbsolute = function (element) {
			if ( element.currentStyle['position'] != 'static') {
				return ;
			}

			var xy = GetAbsoluteXY(element);
			element.style.position = 'absolute' ;
			element.style.left = xy.x + 'px';
			element.style.top = xy.y + 'px';
		};

		var IETransform = function(element,transform){

			var r;
			var m11 = 1;
			var m12 = 1;
			var m21 = 1;
			var m22 = 1;

			if (typeof element.style['msTransform'] != 'undefined'){
				return true;
			}

			StaticToAbsolute(element);

			r = transform.match(/rotate\((.*?)\)/);
			var rotate =  ( r && r[1])	?	parseInt(r[1])	:	0;

			rotate = rotate % 360;
			if (rotate < 0) rotate = 360 + rotate;

			var radian= rotate * Math.PI / 180;
			var cosX =Math.cos(radian);
			var sinY =Math.sin(radian);

			m11 *= cosX;
			m12 *= -sinY;
			m21 *= sinY;
			m22 *= cosX;

			element.style.filter =  (element.style.filter || '').replace(/progid:DXImageTransform\.Microsoft\.Matrix\([^)]*\)/, "" ) +
				("progid:DXImageTransform.Microsoft.Matrix(" + 
					 "M11=" + m11 + 
					",M12=" + m12 + 
					",M21=" + m21 + 
					",M22=" + m22 + 
					",FilterType='bilinear',sizingMethod='auto expand')") 
				;

	  		var ow = parseInt(element.style.width || element.width || 0 );
	  		var oh = parseInt(element.style.height || element.height || 0 );

			radian = rotate * Math.PI / 180;
			var absCosX =Math.abs(Math.cos(radian));
			var absSinY =Math.abs(Math.sin(radian));

			var dx = (ow - (ow * absCosX + oh * absSinY)) / 2;
			var dy = (oh - (ow * absSinY + oh * absCosX)) / 2;

			element.style.marginLeft = Math.floor(dx) + "px";
			element.style.marginTop  = Math.floor(dy) + "px";

			return(true);
		};
		
		var transform_set = jQuery.cssHooks.transform.set;
		jQuery.cssHooks.transform.set = function(elem, value) {
			transform_set.apply(this, [elem, value] );
			IETransform(elem,value);
			return value;
		};
	}

})(jQuery);


/*
 * File: /js/commands/restore.js
 */

/**
 * @class  elFinder command "restore"
 * Restore items from the trash
 *
 * @author Naoki Sawada
 **/
(elFinder.prototype.commands.restore = function() {
	"use strict";
	var self = this,
		fm = this.fm,
		fakeCnt = 0,
		getFilesRecursively = function(files) {
			var dfd = jQuery.Deferred(),
				dirs = [],
				results = [],
				reqs = [],
				phashes = [],
				getFile;
			
			dfd._xhrReject = function() {
				jQuery.each(reqs, function() {
					this && this.reject && this.reject();
				});
				getFile && getFile._xhrReject();
			};
			
			jQuery.each(files, function(i, f) {
				f.mime === 'directory'? dirs.push(f) : results.push(f);
			});
			
			if (dirs.length) {
				jQuery.each(dirs, function(i, d) {
					reqs.push(fm.request({
						data : {cmd  : 'open', target : d.hash},
						preventDefault : true,
						asNotOpen : true
					}));
					phashes[i] = d.hash;
				});
				jQuery.when.apply($, reqs).fail(function() {
					dfd.reject();
				}).done(function() {
					var items = [];
					jQuery.each(arguments, function(i, r) {
						var files;
						if (r.files) {
							if (r.files.length) {
								items = items.concat(r.files);
							} else {
								items.push({
									hash: 'fakefile_' + (fakeCnt++),
									phash: phashes[i],
									mime: 'fakefile',
									name: 'fakefile',
									ts: 0
								});
							}
						}
					});
					fm.cache(items);
					getFile = getFilesRecursively(items).done(function(res) {
						results = results.concat(res);
						dfd.resolve(results);
					});
				});
			} else {
				dfd.resolve(results);
			}
			
			return dfd;
		},
		restore = function(dfrd, files, targets, ops) {
			var rHashes = {},
				others = [],
				found = false,
				dirs = [],
				opts = ops || {},
				id = +new Date(),
				tm, getFile;
			
			fm.lockfiles({files : targets});
			
			dirs = jQuery.map(files, function(f) {
				return f.mime === 'directory'? f.hash : null;
			});
			
			dfrd.done(function() {
				dirs && fm.exec('rm', dirs, {forceRm : true, quiet : true});
			}).always(function() {
				fm.unlockfiles({files : targets});
			});
			
			tm = setTimeout(function() {
				fm.notify({type : 'search', id : id, cnt : 1, hideCnt : true, cancel : function() {
					getFile && getFile._xhrReject();
					dfrd.reject();
				}});
			}, fm.notifyDelay);

			fakeCnt = 0;
			getFile = getFilesRecursively(files).always(function() {
				tm && clearTimeout(tm);
				fm.notify({type : 'search', id: id, cnt : -1, hideCnt : true});
			}).fail(function() {
				dfrd.reject('errRestore', 'errFileNotFound');
			}).done(function(res) {
				var errFolderNotfound = ['errRestore', 'errFolderNotFound'],
					dirTop = '';
				
				if (res.length) {
					jQuery.each(res, function(i, f) {
						var phash = f.phash,
							pfile,
							srcRoot, tPath;
						while(phash) {
							if (srcRoot = fm.trashes[phash]) {
								if (! rHashes[srcRoot]) {
									if (found) {
										// Keep items of other trash
										others.push(f.hash);
										return null; // continue jQuery.each
									}
									rHashes[srcRoot] = {};
									found = true;
								}
		
								tPath = fm.path(f.hash).substr(fm.path(phash).length).replace(/\\/g, '/');
								tPath = tPath.replace(/\/[^\/]+?$/, '');
								if (tPath === '') {
									tPath = '/';
								}
								if (!rHashes[srcRoot][tPath]) {
									rHashes[srcRoot][tPath] = [];
								}
								if (f.mime === 'fakefile') {
									fm.updateCache({removed:[f.hash]});
								} else {
									rHashes[srcRoot][tPath].push(f.hash);
								}
								if (!dirTop || dirTop.length > tPath.length) {
									dirTop = tPath;
								}
								break;
							}
							
							// Go up one level for next check
							pfile = fm.file(phash);
							
							if (!pfile) {
								phash = false;
								// Detection method for search results
								jQuery.each(fm.trashes, function(ph) {
									var file = fm.file(ph),
										filePath = fm.path(ph);
									if ((!file.volumeid || f.hash.indexOf(file.volumeid) === 0) && fm.path(f.hash).indexOf(filePath) === 0) {
										phash = ph;
										return false;
									}
								});
							} else {
								phash = pfile.phash;
							}
						}
					});
					if (found) {
						jQuery.each(rHashes, function(src, dsts) {
							var dirs = Object.keys(dsts),
								cnt = dirs.length;
							fm.request({
								data   : {cmd  : 'mkdir', target : src, dirs : dirs}, 
								notify : {type : 'chkdir', cnt : cnt},
								preventFail : true
							}).fail(function(error) {
								dfrd.reject(error);
								fm.unlockfiles({files : targets});
							}).done(function(data) {
								var cmdPaste, hashes;
								
								if (hashes = data.hashes) {
									cmdPaste = fm.getCommand('paste');
									if (cmdPaste) {
										// wait until file cache made
										fm.one('mkdirdone', function() {
											var hasErr = false;
											jQuery.each(dsts, function(dir, files) {
												if (hashes[dir]) {
													if (files.length) {
														if (fm.file(hashes[dir])) {
															fm.clipboard(files, true);
															fm.exec('paste', [ hashes[dir] ], {_cmd : 'restore', noToast : (opts.noToast || dir !== dirTop)})
															.done(function(data) {
																if (data && (data.error || data.warning)) {
																	hasErr = true;
																}
															})
															.fail(function() {
																hasErr = true;
															})
															.always(function() {
																if (--cnt < 1) {
																	dfrd[hasErr? 'reject' : 'resolve']();
																	if (others.length) {
																		// Restore items of other trash
																		fm.exec('restore', others);
																	}
																}
															});
														} else {
															dfrd.reject(errFolderNotfound);
														}
													} else {
														if (--cnt < 1) {
															dfrd.resolve();
															if (others.length) {
																// Restore items of other trash
																fm.exec('restore', others);
															}
														}
													}
												}
											});
										});
									} else {
										dfrd.reject(['errRestore', 'errCmdNoSupport', '(paste)']);
									}
								} else {
									dfrd.reject(errFolderNotfound);
								}
							});
						});
					} else {
						dfrd.reject(errFolderNotfound);
					}
				} else {
					dfrd.reject('errFileNotFound');
					dirs && fm.exec('rm', dirs, {forceRm : true, quiet : true});
				}
			});
		};
	
	// for to be able to overwrite
	this.restore = restore;

	this.linkedCmds = ['copy', 'paste', 'mkdir', 'rm'];
	this.updateOnSelect = false;
	
	this.init = function() {
		// re-assign for extended command
		self = this;
		fm = this.fm;
	};

	this.getstate = function(sel, e) {
		sel = sel || fm.selected();
		return sel.length && jQuery.grep(sel, function(h) {var f = fm.file(h); return f && ! f.locked && ! fm.isRoot(f)? true : false; }).length == sel.length
			? 0 : -1;
	};
	
	this.exec = function(hashes, opts) {
		var dfrd   = jQuery.Deferred()
				.fail(function(error) {
					error && fm.error(error);
				}),
			files  = self.files(hashes);

		if (! files.length) {
			return dfrd.reject();
		}
		
		jQuery.each(files, function(i, file) {
			if (fm.isRoot(file)) {
				return !dfrd.reject(['errRestore', file.name]);
			}
			if (file.locked) {
				return !dfrd.reject(['errLocked', file.name]);
			}
		});

		if (dfrd.state() === 'pending') {
			this.restore(dfrd, files, hashes, opts);
		}
			
		return dfrd;
	};

}).prototype = { forceLoad : true }; // this is required command


/*
 * File: /js/commands/rm.js
 */

/**
 * @class  elFinder command "rm"
 * Delete files
 *
 * @author Dmitry (dio) Levashov
 * @author Naoki Sawada
 **/
elFinder.prototype.commands.rm = function() {
	"use strict";
	var self = this,
		fm = this.fm,
		tpl = '<div class="ui-helper-clearfix elfinder-rm-title"><span class="elfinder-cwd-icon {class} ui-corner-all"/>{title}<div class="elfinder-rm-desc">{desc}</div></div>',
		confirm = function(dfrd, targets, files, tHash, addTexts) {
			var cnt = targets.length,
				cwd = fm.cwd().hash,
				descs = [],
				spinner = fm.i18n('calc') + '<span class="elfinder-spinner"/>',
				dialog, text, tmb, size, f, fname;
			
			if (cnt > 1) {
				size = 0;
				jQuery.each(files, function(h, f) { 
					if (f.size && f.size != 'unknown' && f.mime !== 'directory') {
						var s = parseInt(f.size);
						if (s >= 0 && size >= 0) {
							size += s;
						}
					} else {
						size = 'unknown';
						return false;
					}
				});
				getSize = (size === 'unknown');
				descs.push(fm.i18n('size')+': '+(getSize? spinner : fm.formatSize(size)));
				text = [jQuery(tpl.replace('{class}', 'elfinder-cwd-icon-group').replace('{title}', '<strong>' + fm.i18n('items')+ ': ' + cnt + '</strong>').replace('{desc}', descs.join('<br>')))];
			} else {
				f = files[0];
				tmb = fm.tmb(f);
				getSize = (f.mime === 'directory');
				descs.push(fm.i18n('size')+': '+(getSize? spinner : fm.formatSize(f.size)));
				descs.push(fm.i18n('modify')+': '+fm.formatDate(f));
				fname = fm.escape(f.i18 || f.name).replace(/([_.])/g, '&#8203;$1');
				text = [jQuery(tpl.replace('{class}', fm.mime2class(f.mime)).replace('{title}', '<strong>' + fname + '</strong>').replace('{desc}', descs.join('<br>')))];
			}
			
			if (addTexts) {
				text = text.concat(addTexts);
			}
			
			text.push(tHash? 'confirmTrash' : 'confirmRm');
			
			dialog = fm.confirm({
				title  : self.title,
				text   : text,
				accept : {
					label    : 'btnRm',
					callback : function() {  
						if (tHash) {
							self.toTrash(dfrd, targets, tHash);
						} else {
							remove(dfrd, targets);
						}
					}
				},
				cancel : {
					label    : 'btnCancel',
					callback : function() {
						fm.unlockfiles({files : targets});
						if (targets.length === 1 && fm.file(targets[0]).phash !== cwd) {
							fm.select({selected : targets});
						} else {
							fm.selectfiles({files : targets});
						}
						dfrd.reject();
					}
				}
			});
			// load thumbnail
			if (tmb) {
				jQuery('<img/>')
					.on('load', function() { dialog.find('.elfinder-cwd-icon').addClass(tmb.className).css('background-image', "url('"+tmb.url+"')"); })
					.attr('src', tmb.url);
			}
			
			if (getSize) {
				getSize = fm.getSize(jQuery.map(files, function(f) { return f.mime === 'directory'? f.hash : null; })).done(function(data) {
					dialog.find('span.elfinder-spinner').parent().html(fm.i18n('size')+': '+data.formated);
				}).fail(function() {
					dialog.find('span.elfinder-spinner').parent().html(fm.i18n('size')+': '+fm.i18n('unknown'));
				}).always(function() {
					getSize = false;
				});
			}
		},
		toTrash = function(dfrd, targets, tHash) {
			var dsts = {},
				itemCnt = targets.length,
				maxCnt = self.options.toTrashMaxItems,
				checkDirs = [],
				reqDfd = jQuery.Deferred(),
				req, dirs, cnt;
			
			if (itemCnt > maxCnt) {
				self.confirm(dfrd, targets, self.files(targets), null, [fm.i18n('tooManyToTrash')]);
				return;
			}
			
			// Directory preparation preparation and directory enumeration
			jQuery.each(targets, function(i, h) {
				var file = fm.file(h),
					path = fm.path(h).replace(/\\/g, '/'),
					m = path.match(/^[^\/]+?(\/(?:[^\/]+?\/)*)[^\/]+?$/);
				
				if (file) {
					if (m) {
						m[1] = m[1].replace(/(^\/.*?)\/?$/, '$1');
						if (! dsts[m[1]]) {
							dsts[m[1]] = [];
						}
						dsts[m[1]].push(h);
					}
					if (file.mime === 'directory') {
						checkDirs.push(h);
					}
				}
			});
			
			// Check directory information
			if (checkDirs.length) {
				req = fm.request({
					data : {cmd : 'size', targets : checkDirs},
					notify : {type: 'readdir', cnt: 1, hideCnt: true},
					preventDefault : true
				}).done(function(data) {
					var cnt = 0;
					data.fileCnt && (cnt += parseInt(data.fileCnt));
					data.dirCnt && (cnt += parseInt(data.dirCnt));
					reqDfd[cnt > maxCnt ? 'reject' : 'resolve']();
				}).fail(function() {
					reqDfd.reject();
				});
				setTimeout(function() {
					var xhr = (req && req.xhr)? req.xhr : null;
					if (xhr && xhr.state() == 'pending') {
						req.syncOnFail(false);
						req.reject();
						reqDfd.reject();
					}
				}, self.options.infoCheckWait * 1000);
			} else {
				reqDfd.resolve();
			}
			
			// Directory creation and paste command execution
			reqDfd.done(function() {
				dirs = Object.keys(dsts);
				cnt = dirs.length;
				if (cnt) {
					fm.request({
						data   : {cmd  : 'mkdir', target : tHash, dirs : dirs}, 
						notify : {type : 'chkdir', cnt : cnt},
						preventFail : true
					})
					.fail(function(error) {
						dfrd.reject(error);
						fm.unlockfiles({files : targets});
					})
					.done(function(data) {
						var margeRes = function(data, phash, reqData) {
								var undo, prevUndo, redo, prevRedo;
								jQuery.each(data, function(k, v) {
									if (Array.isArray(v)) {
										if (res[k]) {
											res[k] = res[k].concat(v);
										} else {
											res[k] = v;
										}
									}
								});
								if (data.sync) {
									res.sync = 1;
								}
								if (data.added && data.added.length) {
									undo = function() {
										var targets = [],
											dirs    = jQuery.map(data.added, function(f) { return f.mime === 'directory'? f.hash : null; });
										jQuery.each(data.added, function(i, f) {
											if (jQuery.inArray(f.phash, dirs) === -1) {
												targets.push(f.hash);
											}
										});
										return fm.exec('restore', targets, {noToast: true});
									};
									redo = function() {
										return fm.request({
											data   : reqData,
											notify : {type : 'redo', cnt : targets.length}
										});
									};
									if (res.undo) {
										prevUndo = res.undo;
										res.undo = function() {
											undo();
											prevUndo();
										};
									} else {
										res.undo = undo;
									}
									if (res.redo) {
										prevRedo = res.redo;
										res.redo = function() {
											redo();
											prevRedo();
										};
									} else {
										res.redo = redo;
									}
								}
							},
							err = ['errTrash'],
							res = {},
							hasNtf = function() {
								return fm.ui.notify.children('.elfinder-notify-trash').length;
							},
							hashes, tm, prg, prgSt;
						
						if (hashes = data.hashes) {
							prg = 1 / cnt * 100;
							prgSt = cnt === 1? 100 : 5;
							tm = setTimeout(function() {
								fm.notify({type : 'trash', cnt : 1, hideCnt : true, progress : prgSt});
							}, fm.notifyDelay);
							jQuery.each(dsts, function(dir, files) {
								var phash = fm.file(files[0]).phash,
									reqData;
								if (hashes[dir]) {
									reqData = {cmd : 'paste', dst : hashes[dir], targets : files, cut : 1};
									fm.request({
										data : reqData,
										preventDefault : true
									})
									.fail(function(error) {
										if (error) {
											err = err.concat(error);
										}
									})
									.done(function(data) {
										data = fm.normalize(data);
										fm.updateCache(data);
										margeRes(data, phash, reqData);
										if (data.warning) {
											err = err.concat(data.warning);
											delete data.warning;
										}
										// fire some event to update cache/ui
										data.removed && data.removed.length && fm.remove(data);
										data.added   && data.added.length   && fm.add(data);
										data.changed && data.changed.length && fm.change(data);
										// fire event with command name
										fm.trigger('paste', data);
										// fire event with command name + 'done'
										fm.trigger('pastedone');
										// force update content
										data.sync && fm.sync();
									})
									.always(function() {
										var hashes = [], addTexts, end = 2;
										if (hasNtf()) {
											fm.notify({type : 'trash', cnt : 0, hideCnt : true, progress : prg});
										} else {
											prgSt+= prg;
										}
										if (--cnt < 1) {
											tm && clearTimeout(tm);
											hasNtf() && fm.notify({type : 'trash', cnt  : -1});
											fm.unlockfiles({files : targets});
											if (Object.keys(res).length) {
												if (err.length > 1) {
													if (res.removed || res.removed.length) {
														hashes = jQuery.grep(targets, function(h) {
															return jQuery.inArray(h, res.removed) === -1? true : false;
														});
													}
													if (hashes.length) {
														if (err.length > end) {
															end = (fm.messages[err[end-1]] || '').indexOf('$') === -1? end : end + 1;
														}
														dfrd.reject();
														fm.exec('rm', hashes, { addTexts: err.slice(0, end), forceRm: true });
													} else {
														fm.error(err);
													}
												}
												res._noSound = true;
												if (res.undo && res.redo) {
													res.undo = {
														cmd : 'trash',
														callback : res.undo,
													};
													res.redo = {
														cmd : 'trash',
														callback : res.redo
													};
												}
												dfrd.resolve(res);
											} else {
												dfrd.reject(err);
											}
										}
									});
								}
							});
						} else {
							dfrd.reject('errFolderNotFound');
							fm.unlockfiles({files : targets});
						}
					});
				} else {
					dfrd.reject(['error', 'The folder hierarchy to be deleting can not be determined.']);
					fm.unlockfiles({files : targets});
				}
			}).fail(function() {
				self.confirm(dfrd, targets, self.files(targets), null, [fm.i18n('tooManyToTrash')]);
			});
		},
		remove = function(dfrd, targets, quiet) {
			var notify = quiet? {} : {type : 'rm', cnt : targets.length};
			fm.request({
				data   : {cmd  : 'rm', targets : targets}, 
				notify : notify,
				preventFail : true
			})
			.fail(function(error) {
				dfrd.reject(error);
			})
			.done(function(data) {
				if (data.error || data.warning) {
					data.sync = true;
				}
				dfrd.resolve(data);
			})
			.always(function() {
				fm.unlockfiles({files : targets});
			});
		},
		getTHash = function(targets) {
			var thash = null,
				root1st;
			
			if (targets && targets.length) {
				if (targets.length > 1 && fm.searchStatus.state === 2) {
					root1st = fm.file(fm.root(targets[0])).volumeid;
					if (!jQuery.grep(targets, function(h) { return h.indexOf(root1st) !== 0? true : false ; }).length) {
						thash = fm.option('trashHash', targets[0]);
					}
				} else {
					thash = fm.option('trashHash', targets[0]);
				}
			}
			return thash;
		},
		getSize = false;
	
	// for to be able to overwrite
	this.confirm = confirm;
	this.toTrash = toTrash;
	this.remove = remove;

	this.syncTitleOnChange = true;
	this.updateOnSelect = false;
	this.shortcuts = [{
		pattern     : 'delete ctrl+backspace shift+delete'
	}];
	this.value = 'rm';
	
	this.init = function() {
		// re-assign for extended command
		self = this;
		fm = this.fm;
		// bind function of change
		self.change(function() {
			var targets;
			delete self.extra;
			self.title = fm.i18n('cmd' + self.value);
			self.className = self.value;
			self.button && self.button.children('span.elfinder-button-icon')[self.value === 'trash'? 'addClass' : 'removeClass']('elfinder-button-icon-trash');
			if (self.value === 'trash') {
				self.extra = {
					icon: 'rm',
					node: jQuery('<span/>')
						.attr({title: fm.i18n('cmdrm')})
						.on('ready', function(e, data) {
							targets = data.targets;
						})
						.on('click touchstart', function(e){
							if (e.type === 'touchstart' && e.originalEvent.touches.length > 1) {
								return;
							}
							e.stopPropagation();
							e.preventDefault();
							fm.getUI().trigger('click'); // to close the context menu immediately
							fm.exec('rm', targets, {_userAction: true, forceRm : true});
						})
				};
			}
		});
	};
	
	this.getstate = function(select) {
		var sel   = this.hashes(select);
		
		return sel.length && jQuery.grep(sel, function(h) { var f = fm.file(h); return f && ! f.locked && ! fm.isRoot(f)? true : false; }).length == sel.length
			? 0 : -1;
	};
	
	this.exec = function(hashes, cOpts) {
		var opts   = cOpts || {},
			dfrd   = jQuery.Deferred()
				.always(function() {
					if (getSize && getSize.state && getSize.state() === 'pending') {
						getSize.reject();
					}
				})
				.fail(function(error) {
					error && fm.error(error);
				}).done(function(data) {
					!opts.quiet && !data._noSound && data.removed && data.removed.length && fm.trigger('playsound', {soundFile : 'rm.wav'});
				}),
			files  = self.files(hashes),
			cnt    = files.length,
			tHash  = null,
			addTexts = opts.addTexts? opts.addTexts : null,
			forceRm = opts.forceRm,
			quiet = opts.quiet,
			targets;

		if (! cnt) {
			return dfrd.reject();
		}
		
		jQuery.each(files, function(i, file) {
			if (fm.isRoot(file)) {
				return !dfrd.reject(['errRm', file.name, 'errPerm']);
			}
			if (file.locked) {
				return !dfrd.reject(['errLocked', file.name]);
			}
		});

		if (dfrd.state() === 'pending') {
			targets = self.hashes(hashes);
			cnt     = files.length;
			
			if (forceRm || (self.event && self.event.originalEvent && self.event.originalEvent.shiftKey)) {
				tHash = '';
				self.title = fm.i18n('cmdrm');
			}
			
			if (tHash === null) {
				tHash = getTHash(targets);
			}
			
			fm.lockfiles({files : targets});
			
			if (tHash && self.options.quickTrash) {
				self.toTrash(dfrd, targets, tHash);
			} else {
				if (quiet) {
					remove(dfrd, targets, quiet);
				} else {
					self.confirm(dfrd, targets, files, tHash, addTexts);
				}
			}
		}
			
		return dfrd;
	};

	fm.bind('select contextmenucreate closecontextmenu', function(e) {
		var targets = (e.data? (e.data.selected || e.data.targets) : null) || fm.selected();
		if (targets && targets.length) {
			self.update(void(0), (targets? getTHash(targets) : fm.option('trashHash'))? 'trash' : 'rm');
		}
	});

};


/*
 * File: /js/commands/search.js
 */

/**
 * @class  elFinder command "search"
 * Find files
 *
 * @author Dmitry (dio) Levashov
 **/
elFinder.prototype.commands.search = function() {
	"use strict";
	this.title          = 'Find files';
	this.options        = {ui : 'searchbutton'};
	this.alwaysEnabled  = true;
	this.updateOnSelect = false;
	
	/**
	 * Return command status.
	 * Search does not support old api.
	 *
	 * @return Number
	 **/
	this.getstate = function() {
		return 0;
	};
	
	/**
	 * Send search request to backend.
	 *
	 * @param  String  search string
	 * @return jQuery.Deferred
	 **/
	this.exec = function(q, target, mime, type) {
		var fm = this.fm,
			reqDef = [],
			sType = type || '',
			onlyMimes = fm.options.onlyMimes,
			phash, targetVolids = [],
			setType = function(data) {
				if (sType && sType !== 'SearchName' && sType !== 'SearchMime') {
					data.type = sType;
				}
				return data;
			};
		
		if (typeof q == 'string' && q) {
			if (typeof target == 'object') {
				mime = target.mime || '';
				target = target.target || '';
			}
			target = target? target : '';
			if (mime) {
				mime = jQuery.trim(mime).replace(',', ' ').split(' ');
				if (onlyMimes.length) {
					mime = jQuery.map(mime, function(m){ 
						m = jQuery.trim(m);
						return m && (jQuery.inArray(m, onlyMimes) !== -1
									|| jQuery.grep(onlyMimes, function(om) { return m.indexOf(om) === 0? true : false; }).length
									)? m : null;
					});
				}
			} else {
				mime = [].concat(onlyMimes);
			}

			fm.trigger('searchstart', setType({query : q, target : target, mimes : mime}));
			
			if (! onlyMimes.length || mime.length) {
				if (target === '' && fm.api >= 2.1) {
					jQuery.each(fm.roots, function(id, hash) {
						reqDef.push(fm.request({
							data   : setType({cmd : 'search', q : q, target : hash, mimes : mime}),
							notify : {type : 'search', cnt : 1, hideCnt : (reqDef.length? false : true)},
							cancel : true,
							preventDone : true
						}));
					});
				} else {
					reqDef.push(fm.request({
						data   : setType({cmd : 'search', q : q, target : target, mimes : mime}),
						notify : {type : 'search', cnt : 1, hideCnt : true},
						cancel : true,
						preventDone : true
					}));
					if (target !== '' && fm.api >= 2.1 && Object.keys(fm.leafRoots).length) {
						jQuery.each(fm.leafRoots, function(hash, roots) {
							phash = hash;
							while(phash) {
								if (target === phash) {
									jQuery.each(roots, function() {
										var f = fm.file(this);
										f && f.volumeid && targetVolids.push(f.volumeid);
										reqDef.push(fm.request({
											data   : setType({cmd : 'search', q : q, target : this, mimes : mime}),
											notify : {type : 'search', cnt : 1, hideCnt : false},
											cancel : true,
											preventDone : true
										}));
									});
								}
								phash = (fm.file(phash) || {}).phash;
							}
						});
					}
				}
			} else {
				reqDef = [jQuery.Deferred().resolve({files: []})];
			}
			
			fm.searchStatus.mixed = (reqDef.length > 1)? targetVolids : false;
			
			return jQuery.when.apply($, reqDef).done(function(data) {
				var argLen = arguments.length,
					i;
				
				data.warning && fm.error(data.warning);
				
				if (argLen > 1) {
					data.files = (data.files || []);
					for(i = 1; i < argLen; i++) {
						arguments[i].warning && fm.error(arguments[i].warning);
						
						if (arguments[i].files) {
							data.files.push.apply(data.files, arguments[i].files);
						}
					}
				}
				
				// because "preventDone : true" so update files cache
				data.files && data.files.length && fm.cache(data.files);
				
				fm.lazy(function() {
					fm.trigger('search', data);
				}).then(function() {
					// fire event with command name + 'done'
					return fm.lazy(function() {
						fm.trigger('searchdone');
					});
				}).then(function() {
					// force update content
					data.sync && fm.sync();
				});
			});
		}
		fm.getUI('toolbar').find('.'+fm.res('class', 'searchbtn')+' :text').trigger('focus');
		return jQuery.Deferred().reject();
	};

};


/*
 * File: /js/commands/selectall.js
 */

/**
 * @class  elFinder command "selectall"
 * Select ALL of cwd items
 *
 * @author Naoki Sawada
 **/
elFinder.prototype.commands.selectall = function() {
	"use strict";
	var self = this,
		state = 0;
	
	this.fm.bind('select', function(e) {
		state = (e.data && e.data.selectall)? -1 : 0;
	});
	
	this.state = 0;
	this.updateOnSelect = false;
	
	this.getstate = function() {
		return state;
	};
	
	this.exec = function() {
		jQuery(document).trigger(jQuery.Event('keydown', { keyCode: 65, ctrlKey : true, shiftKey : false, altKey : false, metaKey : false }));
		return jQuery.Deferred().resolve();
	};
};


/*
 * File: /js/commands/selectinvert.js
 */

/**
 * @class  elFinder command "selectinvert"
 * Invert Selection of cwd items
 *
 * @author Naoki Sawada
 **/
elFinder.prototype.commands.selectinvert = function() {
	"use strict";
	this.updateOnSelect = false;
	
	this.getstate = function() {
		return 0;
	};
	
	this.exec = function() {
		jQuery(document).trigger(jQuery.Event('keydown', { keyCode: 73, ctrlKey : true, shiftKey : true, altKey : false, metaKey : false }));
		return jQuery.Deferred().resolve();
	};

};


/*
 * File: /js/commands/selectnone.js
 */

/**
 * @class  elFinder command "selectnone"
 * Unselect ALL of cwd items
 *
 * @author Naoki Sawada
 **/
elFinder.prototype.commands.selectnone = function() {
	"use strict";
	var self = this,
		fm = this.fm,
		state = -1;
	
	fm.bind('select', function(e) {
		state = (e.data && e.data.unselectall)? -1 : 0;
	});
	
	this.state = -1;
	this.updateOnSelect = false;
	
	this.getstate = function() {
		return state;
	};
	
	this.exec = function() {
		fm.getUI('cwd').trigger('unselectall');
		return jQuery.Deferred().resolve();
	};
};


/*
 * File: /js/commands/sort.js
 */

/**
 * @class  elFinder command "sort"
 * Change sort files rule
 *
 * @author Dmitry (dio) Levashov
 **/
elFinder.prototype.commands.sort = function() {
	"use strict";
	var self  = this,
		fm    = self.fm,
		setVar = function() {
			self.variants = [];
			jQuery.each(fm.sortRules, function(name, value) {
				if (fm.sorters[name]) {
					var arr = (name === fm.sortType)? (fm.sortOrder === 'asc'? 'n' : 's') : '';
					self.variants.push([name, (arr? '<span class="ui-icon ui-icon-arrowthick-1-'+arr+'"></span>' : '') + '&nbsp;' + fm.i18n('sort'+name)]);
				}
			});
			self.variants.push('|');
			self.variants.push([
				'stick',
				(fm.sortStickFolders? '<span class="ui-icon ui-icon-check"/>' : '') + '&nbsp;' + fm.i18n('sortFoldersFirst')
			]);
			if (fm.ui.tree && fm.options.sortAlsoTreeview !== null) {
				self.variants.push('|');
				self.variants.push([
					'tree',
					(fm.sortAlsoTreeview? '<span class="ui-icon ui-icon-check"/>' : '') + '&nbsp;' + fm.i18n('sortAlsoTreeview')
				]);
			}
			updateContextmenu();
		},
		updateContextmenu = function() {
			var cm = fm.getUI('contextmenu'),
				icon, sub;
			if (cm.is(':visible')) {
				icon = cm.find('span.elfinder-button-icon-sort');
				sub = icon.siblings('div.elfinder-contextmenu-sub');
				sub.find('span.ui-icon').remove();
				sub.children('div.elfinder-contextsubmenu-item').each(function() {
					var tgt = jQuery(this).children('span'),
						name = tgt.text().trim(),
						arr;
					if (name === (i18Name.stick || (i18Name.stick = fm.i18n('sortFoldersFirst')))) {
						if (fm.sortStickFolders) {
							tgt.prepend('<span class="ui-icon ui-icon-check"/>');
						}
					} else if (name === (i18Name.tree || (i18Name.tree = fm.i18n('sortAlsoTreeview')))) {
						if (fm.sortAlsoTreeview) {
							tgt.prepend('<span class="ui-icon ui-icon-check"/>');
						}
					} else if (name === (i18Name[fm.sortType] || (i18Name[fm.sortType] = fm.i18n('sort' + fm.sortType)))) {
						arr = fm.sortOrder === 'asc'? 'n' : 's';
						tgt.prepend('<span class="ui-icon ui-icon-arrowthick-1-'+arr+'"></span>');
					}
				});
			}
		},
		i18Name = {};
	
	/**
	 * Command options
	 *
	 * @type  Object
	 */
	this.options = {ui : 'sortbutton'};
	
	this.keepContextmenu = true;

	fm.bind('sortchange', setVar)
	.bind('sorterupdate', function() {
		setVar();
		fm.getUI('toolbar').find('.elfiner-button-sort .elfinder-button-menu .elfinder-button-menu-item').each(function() {
			var tgt = jQuery(this),
				rel = tgt.attr('rel');
			tgt.toggle(! rel || fm.sorters[rel]);
		});
	})
	.bind('cwdrender', function() {
		var cols = jQuery(fm.cwd).find('div.elfinder-cwd-wrapper-list table');
		if (cols.length) {
			jQuery.each(fm.sortRules, function(name, value) {
				var td = cols.find('thead tr td.elfinder-cwd-view-th-'+name);
				if (td.length) {
					var current = ( name == fm.sortType),
					sort = {
						type  : name,
						order : current ? fm.sortOrder == 'asc' ? 'desc' : 'asc' : fm.sortOrder
					},arr;
					if (current) {
						td.addClass('ui-state-active');
						arr = fm.sortOrder == 'asc' ? 'n' : 's';
						jQuery('<span class="ui-icon ui-icon-triangle-1-'+arr+'"/>').appendTo(td);
					}
					jQuery(td).on('click', function(e){
						if (! jQuery(this).data('dragging')) {
							e.stopPropagation();
							if (! fm.getUI('cwd').data('longtap')) {
								fm.exec('sort', [], sort);
							}
						}
					})
					.on('mouseenter mouseleave', function(e) {
						jQuery(this).toggleClass('ui-state-hover', e.type === 'mouseenter');
					});
				}
				
			});
		}
	});
	
	this.getstate = function() {
		return 0;
	};
	
	this.exec = function(hashes, cOpt) {
		var fm = this.fm,
			sortopt = jQuery.isPlainObject(cOpt)? cOpt : (function() {
				cOpt += '';
				var sOpts = {};
				if (cOpt === 'stick') {
					sOpts.stick = !fm.sortStickFolders;
				} else if (cOpt === 'tree') {
					sOpts.tree = !fm.sortAlsoTreeview;
				} else if (fm.sorters[cOpt]) {
					if (fm.sortType === cOpt) {
						sOpts.order = fm.sortOrder === 'asc'? 'desc' : 'asc';
					} else {
						sOpts.type = cOpt;
					}
				}
				return sOpts;
			})(),
			sort = Object.assign({
				type  : fm.sortType,
				order : fm.sortOrder,
				stick : fm.sortStickFolders,
				tree  : fm.sortAlsoTreeview
			}, sortopt);

		return fm.lazy(function() {
			fm.setSort(sort.type, sort.order, sort.stick, sort.tree);
			this.resolve();
		});
	};

};


/*
 * File: /js/commands/undo.js
 */

/**
 * @class  elFinder command "undo"
 * Undo previous commands
 *
 * @author Naoki Sawada
 **/
elFinder.prototype.commands.undo = function() {
	"use strict";
	var self = this,
		fm = this.fm,
		setTitle = function(undo) {
			if (undo) {
				self.title = fm.i18n('cmdundo') + ' ' + fm.i18n('cmd'+undo.cmd);
				self.state = 0;
			} else {
				self.title = fm.i18n('cmdundo');
				self.state = -1;
			}
			self.change();
		},
		cmds = [];
	
	this.alwaysEnabled  = true;
	this.updateOnSelect = false;
	this.shortcuts      = [{
		pattern     : 'ctrl+z'
	}];
	this.syncTitleOnChange = true;
	
	this.getstate = function() {
		return cmds.length? 0 : -1;
	};
	
	this.setUndo = function(undo, redo) {
		var _undo = {};
		if (undo) {
			if (jQuery.isPlainObject(undo) && undo.cmd && undo.callback) {
				Object.assign(_undo, undo);
				if (redo) {
					delete redo.undo;
					_undo.redo = redo;
				} else {
					fm.getCommand('redo').setRedo(null);
				}
				cmds.push(_undo);
				setTitle(_undo);
			}
		}
	};
	
	this.exec = function() {
		var redo = fm.getCommand('redo'),
			dfd = jQuery.Deferred(),
			undo, res, _redo = {};
		if (cmds.length) {
			undo = cmds.pop();
			if (undo.redo) {
				Object.assign(_redo, undo.redo);
				delete undo.redo;
			} else {
				_redo = null;
			} 
			dfd.done(function() {
				if (_redo) {
					redo.setRedo(_redo, undo);
				}
			});
			
			setTitle(cmds.length? cmds[cmds.length-1] : void(0));
			
			res = undo.callback();
			
			if (res && res.done) {
				res.done(function() {
					dfd.resolve();
				}).fail(function() {
					dfd.reject();
				});
			} else {
				dfd.resolve();
			}
			if (cmds.length) {
				this.update(0, cmds[cmds.length - 1].name);
			} else {
				this.update(-1, '');
			}
		} else {
			dfd.reject();
		}
		return dfd;
	};
	
	fm.bind('exec', function(e) {
		var data = e.data || {};
		if (data.opts && data.opts._userAction) {
			if (data.dfrd && data.dfrd.done) {
				data.dfrd.done(function(res) {
					if (res && res.undo && res.redo) {
						res.undo.redo = res.redo;
						self.setUndo(res.undo);
					}
				});
			}
		}
	});
};

/**
 * @class  elFinder command "redo"
 * Redo previous commands
 *
 * @author Naoki Sawada
 **/
elFinder.prototype.commands.redo = function() {
	"use strict";
	var self = this,
		fm   = this.fm,
		setTitle = function(redo) {
			if (redo && redo.callback) {
				self.title = fm.i18n('cmdredo') + ' ' + fm.i18n('cmd'+redo.cmd);
				self.state = 0;
			} else {
				self.title = fm.i18n('cmdredo');
				self.state = -1;
			}
			self.change();
		},
		cmds = [];
	
	this.alwaysEnabled  = true;
	this.updateOnSelect = false;
	this.shortcuts      = [{
		pattern     : 'shift+ctrl+z ctrl+y'
	}];
	this.syncTitleOnChange = true;
	
	this.getstate = function() {
		return cmds.length? 0 : -1;
	};
	
	this.setRedo = function(redo, undo) {
		if (redo === null) {
			cmds = [];
			setTitle();
		} else {
			if (redo && redo.cmd && redo.callback) {
				if (undo) {
					redo.undo = undo;
				}
				cmds.push(redo);
				setTitle(redo);
			}
		}
	};
	
	this.exec = function() {
		var undo = fm.getCommand('undo'),
			dfd = jQuery.Deferred(),
			redo, res, _undo = {}, _redo = {};
		if (cmds.length) {
			redo = cmds.pop();
			if (redo.undo) {
				Object.assign(_undo, redo.undo);
				Object.assign(_redo, redo);
				delete _redo.undo;
				dfd.done(function() {
					undo.setUndo(_undo, _redo);
				});
			}
			
			setTitle(cmds.length? cmds[cmds.length-1] : void(0));
			
			res = redo.callback();
			
			if (res && res.done) {
				res.done(function() {
					dfd.resolve();
				}).fail(function() {
					dfd.reject();
				});
			} else {
				dfd.resolve();
			}
			return dfd;
		} else {
			return dfd.reject();
		}
	};
};


/*
 * File: /js/commands/up.js
 */

/**
 * @class  elFinder command "up"
 * Go into parent directory
 *
 * @author Dmitry (dio) Levashov
 **/
(elFinder.prototype.commands.up = function() {
	"use strict";
	this.alwaysEnabled = true;
	this.updateOnSelect = false;
	
	this.shortcuts = [{
		pattern     : 'ctrl+up'
	}];
	
	this.getstate = function() {
		return this.fm.cwd().phash ? 0 : -1;
	};
	
	this.exec = function() {
		var fm = this.fm,
			cwdhash = fm.cwd().hash;
		return this.fm.cwd().phash ? this.fm.exec('open', this.fm.cwd().phash).done(function() {
			fm.one('opendone', function() {
				fm.selectfiles({files : [cwdhash]});
			});
		}) : jQuery.Deferred().reject();
	};

}).prototype = { forceLoad : true }; // this is required command


/*
 * File: /js/commands/upload.js
 */

/**
 * @class elFinder command "upload"
 * Upload files using iframe or XMLHttpRequest & FormData.
 * Dialog allow to send files using drag and drop
 *
 * @type  elFinder.command
 * @author  Dmitry (dio) Levashov
 */
elFinder.prototype.commands.upload = function() {
	"use strict";
	var hover = this.fm.res('class', 'hover');
	
	this.disableOnSearch = true;
	this.updateOnSelect  = false;
	
	// Shortcut opens dialog
	this.shortcuts = [{
		pattern     : 'ctrl+u'
	}];
	
	/**
	 * Return command state
	 *
	 * @return Number
	 **/
	this.getstate = function(select) {
		var fm = this.fm, f,
		sel = (select || [fm.cwd().hash]);
		if (!this._disabled && sel.length == 1) {
			f = fm.file(sel[0]);
		}
		return (f && f.mime == 'directory' && f.write)? 0 : -1;
	};
	
	
	this.exec = function(data) {
		var fm = this.fm,
			cwdHash = fm.cwd().hash,
			getTargets = function() {
				var tgts = data && (data instanceof Array)? data : null,
					sel;
				if (! data || data instanceof Array) {
					if (! tgts && (sel = fm.selected()).length === 1 && fm.file(sel[0]).mime === 'directory') {
						tgts = sel;
					} else if (!tgts || tgts.length !== 1 || fm.file(tgts[0]).mime !== 'directory') {
						tgts = [ cwdHash ];
					}
				}
				return tgts;
			},
			targets = getTargets(),
			check = targets? targets[0] : (data && data.target? data.target : null),
			targetDir = check? fm.file(check) : fm.cwd(),
			fmUpload = function(data) {
				fm.upload(data)
					.fail(function(error) {
						dfrd.reject(error);
					})
					.done(function(data) {
						var cwd = fm.getUI('cwd'),
							node;
						dfrd.resolve(data);
						if (data && data.added && data.added[0] && ! fm.ui.notify.children('.elfinder-notify-upload').length) {
							var newItem = fm.findCwdNodes(data.added);
							if (newItem.length) {
								newItem.trigger('scrolltoview');
							} else {
								if (targetDir.hash !== cwdHash) {
									node = jQuery('<div/>').append(
										jQuery('<button type="button" class="ui-button ui-widget ui-state-default ui-corner-all elfinder-tabstop"><span class="ui-button-text">'+fm.i18n('cmdopendir')+'</span></button>')
										.on('mouseenter mouseleave', function(e) { 
											jQuery(this).toggleClass('ui-state-hover', e.type == 'mouseenter');
										}).on('click', function() {
											fm.exec('open', check).done(function() {
												fm.one('opendone', function() {
													fm.trigger('selectfiles', {files : jQuery.map(data.added, function(f) {return f.hash;})});
												});
											});
										})
									);
								} else {
									fm.trigger('selectfiles', {files : jQuery.map(data.added, function(f) {return f.hash;})});
								}
								fm.toast({msg: fm.i18n(['complete', fm.i18n('cmdupload')]), extNode: node});
							}
						}
					})
					.progress(function() {
						dfrd.notifyWith(this, Array.from(arguments));
					});
			},
			upload = function(data) {
				dialog.elfinderdialog('close');
				if (targets) {
					data.target = targets[0];
				}
				fmUpload(data);
			},
			getSelector = function() {
				var hash = targetDir.hash,
					dirs = jQuery.map(fm.files(hash), function(f) {
						return (f.mime === 'directory' && f.write)? f : null; 
					});
				
				if (! dirs.length) {
					return jQuery();
				}
				
				return jQuery('<div class="elfinder-upload-dirselect elfinder-tabstop" title="' + fm.i18n('folders') + '"/>')
				.on('click', function(e) {
					e.stopPropagation();
					e.preventDefault();
					dirs = fm.sortFiles(dirs);
					var $this  = jQuery(this),
						cwd    = fm.cwd(),
						base   = dialog.closest('div.ui-dialog'),
						getRaw = function(f, icon) {
							return {
								label    : fm.escape(f.i18 || f.name),
								icon     : icon,
								remain   : false,
								callback : function() {
									var title = base.children('.ui-dialog-titlebar:first').find('span.elfinder-upload-target');
									targets = [ f.hash ];
									title.html(' - ' + fm.escape(f.i18 || f.name));
									$this.trigger('focus');
								},
								options  : {
									className : (targets && targets.length && f.hash === targets[0])? 'ui-state-active' : '',
									iconClass : f.csscls || '',
									iconImg   : f.icon   || ''
								}
							};
						},
						raw = [ getRaw(targetDir, 'opendir'), '|' ];
					jQuery.each(dirs, function(i, f) {
						raw.push(getRaw(f, 'dir'));
					});
					$this.trigger('blur');
					fm.trigger('contextmenu', {
						raw: raw,
						x: e.pageX || jQuery(this).offset().left,
						y: e.pageY || jQuery(this).offset().top,
						prevNode: base,
						fitHeight: true
					});
				}).append('<span class="elfinder-button-icon elfinder-button-icon-dir" />');
			},
			inputButton = function(type, caption) {
				var button,
					input = jQuery('<input type="file" ' + type + '/>')
					.on('click', function() {
						// for IE's bug
						if (fm.UA.IE) {
							setTimeout(function() {
								form.css('display', 'none').css('position', 'relative');
								requestAnimationFrame(function() {
									form.css('display', '').css('position', '');
								});
							}, 100);
						}
					})
					.on('change', function() {
						upload({input : input.get(0), type : 'files'});
					})
					.on('dragover', function(e) {
						e.originalEvent.dataTransfer.dropEffect = 'copy';
					}),
					form = jQuery('<form/>').append(input).on('click', function(e) {
						e.stopPropagation();
					});

				return jQuery('<div class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only elfinder-tabstop elfinder-focus"><span class="ui-button-text">'+fm.i18n(caption)+'</span></div>')
					.append(form)
					.on('click', function(e) {
						e.stopPropagation();
						e.preventDefault();
						input.trigger('click');
					})
					.on('mouseenter mouseleave', function(e) {
						jQuery(this).toggleClass(hover, e.type === 'mouseenter');
					});
			},
			dfrd = jQuery.Deferred(),
			dialog, dropbox, pastebox, dropUpload, paste, dirs, spinner, uidialog;
		
		dropUpload = function(e) {
			e.stopPropagation();
			e.preventDefault();
			var file = false,
				type = '',
				elfFrom = null,
				mycwd = '',
				data = null,
				target = e._target || null,
				trf = e.dataTransfer || null,
				kind = (trf.items && trf.items.length && trf.items[0].kind)? trf.items[0].kind : '',
				errors;
			
			if (trf) {
				try {
					elfFrom = trf.getData('elfinderfrom');
					if (elfFrom) {
						mycwd = window.location.href + fm.cwd().hash;
						if ((!target && elfFrom === mycwd) || target === mycwd) {
							dfrd.reject();
							return;
						}
					}
				} catch(e) {}
				
				if (kind === 'file' && (trf.items[0].getAsEntry || trf.items[0].webkitGetAsEntry)) {
					file = trf;
					type = 'data';
				} else if (kind !== 'string' && trf.files && trf.files.length && jQuery.inArray('Text', trf.types) === -1) {
					file = trf.files;
					type = 'files';
				} else {
					try {
						if ((data = trf.getData('text/html')) && data.match(/<(?:img|a)/i)) {
							file = [ data ];
							type = 'html';
						}
					} catch(e) {}
					if (! file) {
						if (data = trf.getData('text')) {
							file = [ data ];
							type = 'text';
						} else if (trf && trf.files) {
							// maybe folder uploading but this UA dose not support it
							kind = 'file';
						}
					}
				}
			}
			if (file) {
				fmUpload({files : file, type : type, target : target, dropEvt : e});
			} else {
				errors = ['errUploadNoFiles'];
				if (kind === 'file') {
					errors.push('errFolderUpload');
				}
				fm.error(errors);
				dfrd.reject();
			}
		};
		
		if (!targets && data) {
			if (data.input || data.files) {
				data.type = 'files';
				fmUpload(data);
			} else if (data.dropEvt) {
				dropUpload(data.dropEvt);
			}
			return dfrd;
		}
		
		paste = function(ev) {
			var e = ev.originalEvent || ev;
			var files = [], items = [];
			var file;
			if (e.clipboardData) {
				if (e.clipboardData.items && e.clipboardData.items.length){
					items = e.clipboardData.items;
					for (var i=0; i < items.length; i++) {
						if (e.clipboardData.items[i].kind == 'file') {
							file = e.clipboardData.items[i].getAsFile();
							files.push(file);
						}
					}
				} else if (e.clipboardData.files && e.clipboardData.files.length) {
					files = e.clipboardData.files;
				}
				if (files.length) {
					upload({files : files, type : 'files', clipdata : true});
					return;
				}
			}
			var my = e.target || e.srcElement;
			requestAnimationFrame(function() {
				var type = 'text',
					src;
				if (my.innerHTML) {
					jQuery(my).find('img').each(function(i, v){
						if (v.src.match(/^webkit-fake-url:\/\//)) {
							// For Safari's bug.
							// ref. https://bugs.webkit.org/show_bug.cgi?id=49141
							//      https://dev.ckeditor.com/ticket/13029
							jQuery(v).remove();
						}
					});
					
					if (jQuery(my).find('a,img').length) {
						type = 'html';
					}
					src = my.innerHTML;
					my.innerHTML = '';
					upload({files : [ src ], type : type});
				}
			});
		};
		
		dialog = jQuery('<div class="elfinder-upload-dialog-wrapper"/>')
			.append(inputButton('multiple', 'selectForUpload'));
		
		if (! fm.UA.Mobile && (function(input) {
			return (typeof input.webkitdirectory !== 'undefined' || typeof input.directory !== 'undefined');})(document.createElement('input'))) {
			dialog.append(inputButton('multiple webkitdirectory directory', 'selectFolder'));
		}
		
		if (targetDir.dirs) {
			
			if (targetDir.hash === cwdHash || fm.navHash2Elm(targetDir.hash).hasClass('elfinder-subtree-loaded')) {
				getSelector().appendTo(dialog);
			} else {
				spinner = jQuery('<div class="elfinder-upload-dirselect" title="' + fm.i18n('nowLoading') + '"/>')
					.append('<span class="elfinder-button-icon elfinder-button-icon-spinner" />')
					.appendTo(dialog);
				fm.request({cmd : 'tree', target : targetDir.hash})
					.done(function() { 
						fm.one('treedone', function() {
							spinner.replaceWith(getSelector());
							uidialog.elfinderdialog('tabstopsInit');
						});
					})
					.fail(function() {
						spinner.remove();
					});
			}
		}
		
		if (fm.dragUpload) {
			dropbox = jQuery('<div class="ui-corner-all elfinder-upload-dropbox elfinder-tabstop" contenteditable="true" data-ph="'+fm.i18n('dropPasteFiles')+'"></div>')
				.on('paste', function(e){
					paste(e);
				})
				.on('mousedown click', function(){
					jQuery(this).trigger('focus');
				})
				.on('focus', function(){
					this.innerHTML = '';
				})
				.on('mouseover', function(){
					jQuery(this).addClass(hover);
				})
				.on('mouseout', function(){
					jQuery(this).removeClass(hover);
				})
				.on('dragenter', function(e) {
					e.stopPropagation();
				  	e.preventDefault();
				  	jQuery(this).addClass(hover);
				})
				.on('dragleave', function(e) {
					e.stopPropagation();
				  	e.preventDefault();
				  	jQuery(this).removeClass(hover);
				})
				.on('dragover', function(e) {
					e.stopPropagation();
				  	e.preventDefault();
					e.originalEvent.dataTransfer.dropEffect = 'copy';
					jQuery(this).addClass(hover);
				})
				.on('drop', function(e) {
					dialog.elfinderdialog('close');
					targets && (e.originalEvent._target = targets[0]);
					dropUpload(e.originalEvent);
				})
				.prependTo(dialog)
				.after('<div class="elfinder-upload-dialog-or">'+fm.i18n('or')+'</div>')[0];
			
		} else {
			pastebox = jQuery('<div class="ui-corner-all elfinder-upload-dropbox" contenteditable="true">'+fm.i18n('dropFilesBrowser')+'</div>')
				.on('paste drop', function(e){
					paste(e);
				})
				.on('mousedown click', function(){
					jQuery(this).trigger('focus');
				})
				.on('focus', function(){
					this.innerHTML = '';
				})
				.on('dragenter mouseover', function(){
					jQuery(this).addClass(hover);
				})
				.on('dragleave mouseout', function(){
					jQuery(this).removeClass(hover);
				})
				.prependTo(dialog)
				.after('<div class="elfinder-upload-dialog-or">'+fm.i18n('or')+'</div>')[0];
			
		}
		
		uidialog = this.fmDialog(dialog, {
			title          : this.title + '<span class="elfinder-upload-target">' + (targetDir? ' - ' + fm.escape(targetDir.i18 || targetDir.name) : '') + '</span>',
			modal          : true,
			resizable      : false,
			destroyOnClose : true,
			propagationEvents : ['mousemove', 'mouseup', 'click'],
			close          : function() {
				var cm = fm.getUI('contextmenu');
				if (cm.is(':visible')) {
					cm.click();
				}
			}
		});
		
		return dfrd;
	};

};


/*
 * File: /js/commands/view.js
 */

/**
 * @class  elFinder command "view"
 * Change current directory view (icons/list)
 *
 * @author Dmitry (dio) Levashov
 **/
elFinder.prototype.commands.view = function() {
	"use strict";
	var self = this,
		fm = this.fm,
		subMenuRaw;
	this.value          = fm.viewType;
	this.alwaysEnabled  = true;
	this.updateOnSelect = false;

	this.options = { ui : 'viewbutton'};
	
	this.getstate = function() {
		return 0;
	};
	
	this.extra = {
		icon: 'menu',
		node: jQuery('<span/>')
			.attr({title: fm.i18n('viewtype')})
			.on('click touchstart', function(e){
				if (e.type === 'touchstart' && e.originalEvent.touches.length > 1) {
					return;
				}
				var node = jQuery(this);
				e.stopPropagation();
				e.preventDefault();
				fm.trigger('contextmenu', {
					raw: getSubMenuRaw(),
					x: node.offset().left,
					y: node.offset().top
				});
			})
	};

	this.exec = function() {
		var self  = this,
			value = fm.storage('view', this.value == 'list' ? 'icons' : 'list');
		return fm.lazy(function() {
			fm.viewchange();
			self.update(void(0), value);
			this.resolve();
		});
	};

	fm.bind('init', function() {
		subMenuRaw = (function() {
			var cwd = fm.getUI('cwd'),
				raws = [],
				sizeNames = fm.options.uiOptions.cwd.iconsView.sizeNames,
				max = fm.options.uiOptions.cwd.iconsView.sizeMax,
				i, size;
			for (i = 0; i <= max; i++) {
				raws.push(
					{
						label    : fm.i18n(sizeNames[i] || ('Size-' + i + ' icons')),
						icon     : 'view',
						callback : (function(s) {
							return function() {
								cwd.trigger('iconpref', {size: s});
								fm.storage('iconsize', s);
								if (self.value === 'list') {
									self.exec();
								}
							};
						})(i)
					}
				);
			}
			raws.push('|');
			raws.push(
				{
					label    : fm.i18n('viewlist'),
					icon     : 'view-list',
					callback : function() {
						if (self.value !== 'list') {
							self.exec();
						}
					}
				}		
			);
			return raws;
		})();
	}).bind('contextmenucreate', function() {
		self.extra = {
			icon: 'menu',
			node: jQuery('<span/>')
				.attr({title: fm.i18n('cmdview')})
				.on('click touchstart', function(e){
					if (e.type === 'touchstart' && e.originalEvent.touches.length > 1) {
						return;
					}
					var node = jQuery(this),
						raw = subMenuRaw.concat(),
						idx, i;
					if (self.value === 'list') {
						idx = subMenuRaw.length - 1;
					} else {
						idx = parseInt(fm.storage('iconsize') || 0);
					}
					for (i = 0; i < subMenuRaw.length; i++) {
						if (subMenuRaw[i] !== '|') {
							subMenuRaw[i].options = (i === idx? {'className': 'ui-state-active'} : void(0))
							;
						}
					}
					e.stopPropagation();
					e.preventDefault();
					fm.trigger('contextmenu', {
						raw: subMenuRaw,
						x: node.offset().left,
						y: node.offset().top
					});
				})
		};
	});

};

return elFinder;
}));js/jquery.dialogelfinder.js000064400000006260151215013400012000 0ustar00/**
 * @class dialogelfinder - open elFinder in dialog window
 *
 * @param  Object  elFinder options with dialog options
 * @example
 * jQuery(selector).dialogelfinder({
 *     // some elfinder options
 *     title          : 'My files', // dialog title, default = "Files"
 *     width          : 850,        // dialog width, default 840
 *     autoOpen       : false,      // if false - dialog will not be opened after init, default = true
 *     destroyOnClose : true        // destroy elFinder on close dialog, default = false
 * })
 * @author Dmitry (dio) Levashov
 **/
jQuery.fn.dialogelfinder = function(opts, opts2) {
		var position = 'elfinderPosition',
		destroy  = 'elfinderDestroyOnClose',
		node, pos;

	if (jQuery.isPlainObject(opts)) {
		this.not('.elfinder').each(function() {

			opts.handlers = opts.handlers || {};

			var node    = jQuery(this),
				doc     = jQuery(document),
				toolbar = jQuery('<div class="ui-widget-header dialogelfinder-drag ui-corner-top">'+(opts.title || 'Files')+'</div>'),
				button  = jQuery('<a href="#" class="dialogelfinder-drag-close ui-corner-all"><span class="ui-icon ui-icon-closethick"> </span></a>')
					.appendTo(toolbar)
					.on('click', function(e) {
						e.preventDefault();
						node.dialogelfinder('close');
					}),
				init    = opts.handlers.init,
				elfinder;

			opts.handlers.init = function(e, fm) {
				node.prepend(toolbar);
				init && init(e, fm);
			};

			elfinder = node.addClass('elfinder dialogelfinder touch-punch')
				.css('position', 'absolute')
				.hide()
				.appendTo('body')
				.draggable({
					handle : '.dialogelfinder-drag',
					containment : 'window',
					stop : function() {
						node.trigger('resize');
						elfinder.trigger('resize');
					}
				})
				.elfinder(opts, opts2)
				.elfinder('instance');
			
			elfinder.reloadCallback = function(o, o2) {
				elfinder.destroy();
				o.handlers.init = init;
				node.dialogelfinder(o, o2).dialogelfinder('open');
			};
			
			node.width(parseInt(node.width()) || 840) // fix width if set to "auto"
				.data(destroy, !!opts.destroyOnClose)
				.find('.elfinder-toolbar').removeClass('ui-corner-top');
			
			opts.position && node.data(position, opts.position);
			
			opts.autoOpen !== false && jQuery(this).dialogelfinder('open');

		});
	} else {
		if (opts === 'open') {
			node = jQuery(this);
			pos = node.data(position) || {
				top  : parseInt(jQuery(document).scrollTop() + (jQuery(window).height() < node.height() ? 2 : (jQuery(window).height() - node.height())/2)),
				left : parseInt(jQuery(document).scrollLeft() + (jQuery(window).width() < node.width()  ? 2 : (jQuery(window).width()  - node.width())/2))
			};

			if (node.is(':hidden')) {
				node.addClass('ui-front').css(pos).show().trigger('resize');

				setTimeout(function() {
					// fix resize icon position and make elfinder active
					node.trigger('resize').trigger('mousedown');
				}, 200);
			}
		} else if (opts === 'close') {
			node = jQuery(this).removeClass('ui-front');
				
			if (node.is(':visible')) {
				!!node.data(destroy)
					? node.elfinder('destroy').remove()
					: node.elfinder('close');
			}
		} else if (opts === 'instance') {
			return jQuery(this).getElFinder();
		}
	}

	return this;
};
js/ui/tree.js000064400000121147151215013400007070 0ustar00/**
 * @class  elFinder folders tree
 *
 * @author Dmitry (dio) Levashov
 **/
 jQuery.fn.elfindertree = function(fm, opts) {
	"use strict";
	var treeclass = fm.res('class', 'tree');
	
	this.not('.'+treeclass).each(function() {

		var c = 'class', mobile = fm.UA.Mobile,
			
			/**
			 * Root directory class name
			 *
			 * @type String
			 */
			root      = fm.res(c, 'treeroot'),

			/**
			 * Open root dir if not opened yet
			 *
			 * @type Boolean
			 */
			openRoot  = opts.openRootOnLoad,

			/**
			 * Open current work dir if not opened yet
			 *
			 * @type Boolean
			 */
			openCwd   = opts.openCwdOnOpen,

			
			/**
			 * Auto loading current directory parents and do expand their node
			 *
			 * @type Boolean
			 */
			syncTree  = openCwd || opts.syncTree,
			
			/**
			 * Subtree class name
			 *
			 * @type String
			 */
			subtree   = fm.res(c, 'navsubtree'),
			
			/**
			 * Directory class name
			 *
			 * @type String
			 */
			navdir    = fm.res(c, 'treedir'),
			
			/**
			 * Directory CSS selector
			 *
			 * @type String
			 */
			selNavdir = 'span.' + navdir,
			
			/**
			 * Collapsed arrow class name
			 *
			 * @type String
			 */
			collapsed = fm.res(c, 'navcollapse'),
			
			/**
			 * Expanded arrow class name
			 *
			 * @type String
			 */
			expanded  = fm.res(c, 'navexpand'),
			
			/**
			 * Class name to mark arrow for directory with already loaded children
			 *
			 * @type String
			 */
			loaded    = 'elfinder-subtree-loaded',
			
			/**
			 * Class name to mark need subdirs request
			 *
			 * @type String
			 */
			chksubdir = 'elfinder-subtree-chksubdir',
			
			/**
			 * Arraw class name
			 *
			 * @type String
			 */
			arrow = fm.res(c, 'navarrow'),
			
			/**
			 * Current directory class name
			 *
			 * @type String
			 */
			active    = fm.res(c, 'active'),
			
			/**
			 * Droppable dirs dropover class
			 *
			 * @type String
			 */
			dropover = fm.res(c, 'adroppable'),
			
			/**
			 * Hover class name
			 *
			 * @type String
			 */
			hover    = fm.res(c, 'hover'),
			
			/**
			 * Disabled dir class name
			 *
			 * @type String
			 */
			disabled = fm.res(c, 'disabled'),
			
			/**
			 * Draggable dir class name
			 *
			 * @type String
			 */
			draggable = fm.res(c, 'draggable'),
			
			/**
			 * Droppable dir  class name
			 *
			 * @type String
			 */
			droppable = fm.res(c, 'droppable'),
			
			/**
			 * root wrapper class
			 * 
			 * @type String
			 */
			wrapperRoot = 'elfinder-navbar-wrapper-root',

			/**
			 * Un-disabled cmd `paste` volume's root wrapper class
			 * 
			 * @type String
			 */
			pastable = 'elfinder-navbar-wrapper-pastable',
			
			/**
			 * Un-disabled cmd `upload` volume's root wrapper class
			 * 
			 * @type String
			 */
			uploadable = 'elfinder-navbar-wrapper-uploadable',
			
			/**
			 * Is position x inside Navbar
			 * 
			 * @param x Numbar
			 * 
			 * @return
			 */
			insideNavbar = function(x) {
				var left = navbar.offset().left;
					
				return left <= x && x <= left + navbar.width();
			},
			
			/**
			 * To call subdirs elements queue
			 * 
			 * @type Object
			 */
			subdirsQue = {},
			
			/**
			 * To exec subdirs elements ids
			 * 
			 */
			subdirsExecQue = [],
			
			/**
			 * Request subdirs to backend
			 * 
			 * @param id String
			 * 
			 * @return Deferred
			 */
			subdirs = function(ids) {
				var targets = [];
				jQuery.each(ids, function(i, id) {
					subdirsQue[id] && targets.push(fm.navId2Hash(id));
					delete subdirsQue[id];
				});
				if (targets.length) {
					return fm.request({
						data: {
							cmd: 'subdirs',
							targets: targets,
							preventDefault : true
						}
					}).done(function(res) {
						if (res && res.subdirs) {
							jQuery.each(res.subdirs, function(hash, subdirs) {
								var elm = fm.navHash2Elm(hash);
								elm.removeClass(chksubdir);
								elm[subdirs? 'addClass' : 'removeClass'](collapsed);
							});
						}
					});
				}
			},
			
			subdirsJobRes = null,
			
			/**
			 * To check target element is in window of subdirs
			 * 
			 * @return void
			 */
			checkSubdirs = function() {
				var ids = Object.keys(subdirsQue);
				if (ids.length) {
					subdirsJobRes && subdirsJobRes._abort();
					execSubdirsTm && clearTimeout(execSubdirsTm);
					subdirsExecQue = [];
					subdirsJobRes = fm.asyncJob(function(id) {
						return fm.isInWindow(jQuery('#'+id))? id : null;
					}, ids, { numPerOnce: 200 })
					.done(function(arr) {
						if (arr.length) {
							subdirsExecQue = arr;
							execSubdirs();
						}
					});
				}
			},
			
			subdirsPending = 0,
			execSubdirsTm,
			
			/**
			 * Exec subdirs as batch request
			 * 
			 * @return void
			 */
			execSubdirs = function() {
				var cnt = opts.subdirsMaxConn - subdirsPending,
					atOnce = fm.maxTargets? Math.min(fm.maxTargets, opts.subdirsAtOnce) : opts.subdirsAtOnce,
					i, ids;
				execSubdirsTm && cancelAnimationFrame(execSubdirsTm);
				if (subdirsExecQue.length) {
					if (cnt > 0) {
						for (i = 0; i < cnt; i++) {
							if (subdirsExecQue.length) {
								subdirsPending++;
								subdirs(subdirsExecQue.splice(0, atOnce)).always(function() {
									subdirsPending--;
									execSubdirs();
								});
							}
						}
					} else {
						execSubdirsTm = requestAnimationFrame(function() {
							subdirsExecQue.length && execSubdirs();
						});
					}
				}
			},
			
			drop = fm.droppable.drop,
			
			/**
			 * Droppable options
			 *
			 * @type Object
			 */
			droppableopts = jQuery.extend(true, {}, fm.droppable, {
				// show subfolders on dropover
				over : function(e, ui) {
					var dst    = jQuery(this),
						helper = ui.helper,
						cl     = hover+' '+dropover,
						hash, status;
					e.stopPropagation();
					helper.data('dropover', helper.data('dropover') + 1);
					dst.data('dropover', true);
					if (ui.helper.data('namespace') !== fm.namespace || ! fm.insideWorkzone(e.pageX, e.pageY)) {
						dst.removeClass(cl);
						helper.removeClass('elfinder-drag-helper-move elfinder-drag-helper-plus');
						return;
					}
					if (! insideNavbar(e.clientX)) {
						dst.removeClass(cl);
						return;
					}
					helper.removeClass('elfinder-drag-helper-move elfinder-drag-helper-plus');
					dst.addClass(hover);
					if (dst.is('.'+collapsed+':not(.'+expanded+')')) {
						dst.data('expandTimer', setTimeout(function() {
							dst.is('.'+collapsed+'.'+hover) && dst.children('.'+arrow).trigger('click');
						}, 500));
					}
					if (dst.is('.elfinder-ro,.elfinder-na')) {
						dst.removeClass(dropover);
						//helper.removeClass('elfinder-drag-helper-move elfinder-drag-helper-plus');
						return;
					}
					hash = fm.navId2Hash(dst.attr('id'));
					dst.data('dropover', hash);
					jQuery.each(ui.helper.data('files'), function(i, h) {
						if (h === hash || (fm.file(h).phash === hash && !ui.helper.hasClass('elfinder-drag-helper-plus'))) {
							dst.removeClass(cl);
							return false; // break jQuery.each
						}
					});
					if (helper.data('locked')) {
						status = 'elfinder-drag-helper-plus';
					} else {
						status = 'elfinder-drag-helper-move';
						if (fm._commands.copy && (e.shiftKey || e.ctrlKey || e.metaKey)) {
							status += ' elfinder-drag-helper-plus';
						}
					}
					dst.hasClass(dropover) && helper.addClass(status);
					requestAnimationFrame(function(){ dst.hasClass(dropover) && helper.addClass(status); });
				},
				out : function(e, ui) {
					var dst    = jQuery(this),
						helper = ui.helper;
					e.stopPropagation();
					if (insideNavbar(e.clientX)) {
						helper.removeClass('elfinder-drag-helper-move elfinder-drag-helper-plus');
					}
					helper.data('dropover', Math.max(helper.data('dropover') - 1, 0));
					dst.data('expandTimer') && clearTimeout(dst.data('expandTimer'));
					dst.removeData('dropover')
					   .removeClass(hover+' '+dropover);
				},
				deactivate : function() {
					jQuery(this).removeData('dropover')
					       .removeClass(hover+' '+dropover);
				},
				drop : function(e, ui) {
					insideNavbar(e.clientX) && drop.call(this, e, ui);
				}
			}),
			
			spinner = jQuery(fm.res('tpl', 'navspinner')),
			
			/**
			 * Directory html template
			 *
			 * @type String
			 */
			tpl = fm.res('tpl', 'navdir'),
			
			/**
			 * Permissions marker html template
			 *
			 * @type String
			 */
			ptpl = fm.res('tpl', 'perms'),
			
			/**
			 * Lock marker html template
			 *
			 * @type String
			 */
			ltpl = fm.res('tpl', 'lock'),
			
			/**
			 * Symlink marker html template
			 *
			 * @type String
			 */
			stpl = fm.res('tpl', 'symlink'),
			
			/**
			 * Directory hashes that has more pages
			 * 
			 * @type Object
			 */
			hasMoreDirs = {},
			
			/**
			 * Html template replacement methods
			 *
			 * @type Object
			 */
			replace = {
				id          : function(dir) { return fm.navHash2Id(dir.hash); },
				name        : function(dir) { return fm.escape(dir.i18 || dir.name); },
				cssclass    : function(dir) {
					var cname = (dir.phash && ! dir.isroot ? '' : root)+' '+navdir+' '+fm.perms2class(dir);
					dir.dirs && !dir.link && (cname += ' ' + collapsed) && dir.dirs == -1 && (cname += ' ' + chksubdir);
					opts.getClass && (cname += ' ' + opts.getClass(dir));
					dir.csscls && (cname += ' ' + fm.escape(dir.csscls));
					return cname;
				},
				title       : function(dir) { return opts.attrTitle? (' title="' + fm.escape(fm.path(dir.hash, true) || dir.i18 || dir.name) + '"') : ''; },
				root        : function(dir) {
					var cls = '';
					if (!dir.phash || dir.isroot) {
						cls += ' '+wrapperRoot;
						if (!dir.disabled || dir.disabled.length < 1) {
							cls += ' '+pastable+' '+uploadable;
						} else {
							if (jQuery.inArray('paste', dir.disabled) === -1) {
								cls += ' '+pastable;
							}
							if (jQuery.inArray('upload', dir.disabled) === -1) {
								cls += ' '+uploadable;
							}
						}
						return cls;
					} else {
						return '';
					}
				},
				permissions : function(dir) { return !dir.read || !dir.write ? ptpl : ''; },
				symlink     : function(dir) { return dir.alias ? stpl : ''; },
				style       : function(dir) { return dir.icon ? fm.getIconStyle(dir) : ''; }
			},
			
			/**
			 * Return html for given dir
			 *
			 * @param  Object  directory
			 * @return String
			 */
			itemhtml = function(dir) {
				return tpl.replace(/(?:\{([a-z]+)\})/ig, function(m, key) {
					var res = replace[key] ? replace[key](dir) : (dir[key] || '');
					if (key === 'id' && dir.dirs == -1) {
						subdirsQue[res] = res;
					}
					return res;
				});
			},
			
			/**
			 * Return only dirs from files list
			 *
			 * @param  Array   files list
			 * @param  Boolean do check exists
			 * @return Array
			 */
			filter = function(files, checkExists) {
				return jQuery.map(files || [], function(f) {
					return (f.mime === 'directory' && (!checkExists || fm.navHash2Elm(f.hash).length)) ? f : null;
				});
			},
			
			/**
			 * Find parent subtree for required directory
			 *
			 * @param  String  dir hash
			 * @return jQuery
			 */
			findSubtree = function(hash) {
				return hash ? fm.navHash2Elm(hash).next('.'+subtree) : tree;
			},
			
			/**
			 * Find directory (wrapper) in required node
			 * before which we can insert new directory
			 *
			 * @param  jQuery  parent directory
			 * @param  Object  new directory
			 * @return jQuery
			 */
			findSibling = function(subtree, dir) {
				var node = subtree.children(':first'),
					info;

				while (node.length) {
					info = fm.file(fm.navId2Hash(node.children('[id]').attr('id')));
					
					if ((info = fm.file(fm.navId2Hash(node.children('[id]').attr('id')))) 
					&& compare(dir, info) < 0) {
						return node;
					}
					node = node.next();
				}
				return subtree.children('button.elfinder-navbar-pager-next');
			},
			
			/**
			 * Add new dirs in tree
			 *
			 * @param  Array  dirs list
			 * @return void
			 */
			updateTree = function(dirs) {
				var length  = dirs.length,
					orphans = [],
					i = length,
					tgts = jQuery(),
					done = {},
					cwd = fm.cwd(),
					append = function(parent, dirs, start, direction) {
						var hashes = {},
							curStart = 0,
							max = fm.newAPI? Math.min(10000, Math.max(10, opts.subTreeMax)) : 10000,
							setHashes = function() {
								hashes = {};
								jQuery.each(dirs, function(i, d) {
									hashes[d.hash] = i;
								});
							},
							change = function(mode) {
								if (mode === 'prepare') {
									jQuery.each(dirs, function(i, d) {
										d.node && parent.append(d.node.hide());
									});
								} else if (mode === 'done') {
									jQuery.each(dirs, function(i, d) {
										d.node && d.node.detach().show();
									});
								}
							},
							update = function(e, data) {
								var i, changed;
								e.stopPropagation();
								
								if (data.select) {
									render(getStart(data.select));
									return;
								}
								
								if (data.change) {
									change(data.change);
									return;
								}
								
								if (data.removed && data.removed.length) {
									dirs = jQuery.grep(dirs, function(d) {
										if (data.removed.indexOf(d.hash) === -1) {
											return true;
										} else {
											!changed && (changed = true);
											return false;
										}
									});
								}
								
								if (data.added && data.added.length) {
									dirs = dirs.concat(jQuery.grep(data.added, function(d) {
										if (hashes[d.hash] === void(0)) {
											!changed && (changed = true);
											return true;
										} else {
											return false;
										}
									}));
								}
								if (changed) {
									dirs.sort(compare);
									setHashes();
									render(curStart);
								}
							},
							getStart = function(target) {
								if (hashes[target] !== void(0)) {
									return Math.floor(hashes[target] / max) * max;
								}
								return void(0);
							},
							target = fm.navId2Hash(parent.prev('[id]').attr('id')),
							render = function(start, direction) {
								var html = [],
									nodes = {},
									total, page, s, parts, prev, next, prevBtn, nextBtn;
								delete hasMoreDirs[target];
								curStart = start;
								parent.off('update.'+fm.namespace, update);
								if (dirs.length > max) {
									parent.on('update.'+fm.namespace, update);
									if (start === void(0)) {
										s = 0;
										setHashes();
										start = getStart(cwd.hash);
										if (start === void(0)) {
											start = 0;
										}
									}
									parts = dirs.slice(start, start + max);
									hasMoreDirs[target] = parent;
									prev = start? Math.max(-1, start - max) : -1;
									next = (start + max >= dirs.length)? 0 : start + max;
									total = Math.ceil(dirs.length/max);
									page = Math.ceil(start/max);
								}
								jQuery.each(parts || dirs, function(i, d) {
									html.push(itemhtml(d));
									if (d.node) {
										nodes[d.hash] = d.node;
									}
								});
								if (prev > -1) {
									prevBtn = jQuery('<button class="elfinder-navbar-pager elfinder-navbar-pager-prev"></button>')
										.text(fm.i18n('btnPrevious', page, total))
										.button({
											icons: {
												primary: "ui-icon-caret-1-n"
											}
										})
										.on('click', function(e) {
											e.preventDefault();
											e.stopPropagation();
											render(prev, 'up');
										});
								} else {
									prevBtn = jQuery();
								}
								if (next) {
									nextBtn = jQuery('<button class="elfinder-navbar-pager elfinder-navbar-pager-next"></button>')
										.text(fm.i18n('btnNext', page + 2, total))
										.button({
											icons: {
												primary: "ui-icon-caret-1-s"
											}
										})
										.on('click', function(e) {
											e.preventDefault();
											e.stopPropagation();
											render(next, 'down');
										});
								} else {
									nextBtn = jQuery();
								}
								detach();
								parent.empty()[parts? 'addClass' : 'removeClass']('elfinder-navbar-hasmore').append(prevBtn, html.join(''), nextBtn);
								jQuery.each(nodes, function(h, n) {
									fm.navHash2Elm(h).parent().replaceWith(n);
								});
								if (direction) {
									autoScroll(fm.navHash2Id(parts[direction === 'up'? parts.length - 1 : 0].hash));
								}
								! mobile && fm.lazy(function() { updateDroppable(null, parent); });
							},
							detach = function() {
								jQuery.each(parent.children('.elfinder-navbar-wrapper'), function(i, elm) {
									var n = jQuery(elm),
										ch = n.children('[id]:first'),
										h, c;
									if (ch.hasClass(loaded)) {
										h = fm.navId2Hash(ch.attr('id'));
										if (h && (c = hashes[h]) !== void(0)) {
											dirs[c].node = n.detach();
										}
									}
								});
							};
						
						render();
					},
					dir, html, parent, sibling, init, atonce = {}, updates = [], base, node,
					lastKey, lastNodes = {};
				
				while (i--) {
					dir = dirs[i];

					if (done[dir.hash] || fm.navHash2Elm(dir.hash).length) {
						continue;
					}
					done[dir.hash] = true;
					
					if ((parent = findSubtree(dir.phash)).length) {
						lastKey = dir.phash || 'treeroot';
						if (typeof lastNodes[lastKey] === 'undefined') {
							lastNodes[lastKey] = parent.children(':last');
						}
						init = !lastNodes[lastKey].length;
						if (dir.phash && (init || parent.hasClass('elfinder-navbar-hasmore') || (sibling = findSibling(parent, dir)).length)) {
							if (init) {
								if (!atonce[dir.phash]) {
									atonce[dir.phash] = [];
								}
								atonce[dir.phash].push(dir);
							} else {
								if (sibling) {
									node = itemhtml(dir);
									sibling.before(node);
									! mobile && (tgts = tgts.add(node));
								} else {
									updates.push(dir);
								}
							}
						} else {
							node = itemhtml(dir);
							if (init) {
								parent.prepend(node);
							} else {
								lastNodes[lastKey].after(node);
							}
							if (!dir.phash || dir.isroot) {
								base = fm.navHash2Elm(dir.hash).parent();
							}
							! mobile && updateDroppable(null, base);
						}
					} else {
						orphans.push(dir);
					}
				}

				// When init, html append at once
				if (Object.keys(atonce).length){
					jQuery.each(atonce, function(p, dirs){
						var parent = findSubtree(p),
						    html   = [];
						dirs.sort(compare);
						append(parent, dirs);
					});
				}
				
				if (updates.length) {
					parent.trigger('update.' + fm.namespace, { added : updates });
				}
				
				if (orphans.length && orphans.length < length) {
					updateTree(orphans);
					return;
				} 
				
				! mobile && tgts.length && fm.lazy(function() { updateDroppable(tgts); });
				
			},
			
			/**
			 * sort function by dir.name
			 * 
			 */
			compare = function(dir1, dir2) {
				if (! fm.sortAlsoTreeview) {
					return fm.sortRules.name(dir1, dir2);
				} else {
					var asc   = fm.sortOrder == 'asc',
						type  = fm.sortType,
						rules = fm.sortRules,
						res;
					
					res = asc? rules[fm.sortType](dir1, dir2) : rules[fm.sortType](dir2, dir1);
					
					return type !== 'name' && res === 0
						? res = asc ? rules.name(dir1, dir2) : rules.name(dir2, dir1)
						: res;
				}
			},

			/**
			 * Timer ID of autoScroll
			 * 
			 * @type  Integer
			 */
			autoScrTm,

			/**
			 * Auto scroll to cwd
			 *
			 * @return Object  jQuery Deferred
			 */
			autoScroll = function(target) {
				var dfrd = jQuery.Deferred(),
					current, parent, top, treeH, bottom, tgtTop;
				autoScrTm && clearTimeout(autoScrTm);
				autoScrTm = setTimeout(function() {
					current = jQuery(document.getElementById((target || fm.navHash2Id(fm.cwd().hash))));
					if (current.length) {
						// expand parents directory
						(openCwd? current : current.parent()).parents('.elfinder-navbar-wrapper').children('.'+loaded).addClass(expanded).next('.'+subtree).show();
						
						parent = tree.parent().stop(false, true);
						top = parent.offset().top;
						treeH = parent.height();
						bottom = top + treeH - current.outerHeight();
						tgtTop = current.offset().top;
						
						if (tgtTop < top || tgtTop > bottom) {
							parent.animate({
								scrollTop : parent.scrollTop() + tgtTop - top - treeH / 3
							}, {
								duration : opts.durations.autoScroll,
								complete : function() {	dfrd.resolve(); }
							});
						} else {
							dfrd.resolve();
						}
					} else {
						dfrd.reject();
					}
				}, 100);
				return dfrd;
			},
			/**
			 * Get hashes array of items of the bottom of the leaf root back from the target
			 * 
			 * @param Object elFinder item(directory) object
			 * @return Array hashes
			 */
			getEnds = function(d) {
				var cur = d || fm.cwd(),
					res = cur.hash? [ cur.hash ] : [],
					phash, root, dir;
				
				root = fm.root(cur.hash);
				dir = fm.file(root);
				while (dir && (phash = dir.phash)) {
					res.unshift(phash);
					root = fm.root(phash);
					dir = fm.file(root);
					if (fm.navHash2Elm(dir.hash).hasClass(loaded)) {
						break;
					}
				}
				
				return res;
			},
			
			/**
			 * Select pages back in order to display the target
			 * 
			 * @param Object elFinder item(directory) object
			 * @return Object jQuery node object of target node
			 */
			selectPages = function(current) {
				var cur = current || fm.cwd(),
					curHash = cur.hash,
					node = fm.navHash2Elm(curHash);
			
				if (!node.length) {
					while(cur && cur.phash) {
						if (hasMoreDirs[cur.phash] && !fm.navHash2Elm(cur.hash).length) {
							hasMoreDirs[cur.phash].trigger('update.'+fm.namespace, { select : cur.hash });
						}
						cur = fm.file(cur.phash);
					}
					node = fm.navHash2Elm(curHash);
				}
				
				return node;
			},
			
			/**
			 * Flag indicating that synchronization is currently in progress
			 * 
			 * @type Boolean
			 */
			syncing,

			/**
			 * Mark current directory as active
			 * If current directory is not in tree - load it and its parents
			 *
			 * @param Array directory objects of cwd
			 * @param Boolean do auto scroll
			 * @return Object jQuery Deferred
			 */
			sync = function(cwdDirs, aScr) {
				var cwd     = fm.cwd(),
					cwdhash = cwd.hash,
					autoScr = aScr === void(0)? syncTree : aScr,
					loadParents = function(dir) {
						var dfd  = jQuery.Deferred(),
							reqs = [],
							ends = getEnds(dir),
							makeReq = function(cmd, h, until) {
								var data = {
										cmd    : cmd,
										target : h
									};
								if (until) {
									data.until = until;
								}
								return fm.request({
									data : data,
									preventFail : true
								});
							},
							baseHash, baseId;
						
						reqs = jQuery.map(ends, function(h) {
							var d = fm.file(h),
								isRoot = d? fm.isRoot(d) : false,
								node = fm.navHash2Elm(h),
								getPhash = function(h, dep) {
									var d, ph,
										depth = dep || 1;
									ph = (d = fm.file(h))? d.phash : false;
									if (ph && depth > 1) {
										return getPhash(ph, --depth);
									}
									return ph;
								},
								until,
								closest = (function() {
									var phash = getPhash(h);
									until = phash;
									while (phash) {
										if (fm.navHash2Elm(phash).hasClass(loaded)) {
											break;
										}
										until = phash;
										phash = getPhash(phash);
									}
									if (!phash) {
										until = void(0);
										phash = fm.root(h);
									}
									return phash;
								})(),
								cmd;
							
							if (!node.hasClass(loaded) && (isRoot || !d || !fm.navHash2Elm(d.phash).hasClass(loaded))) {
								if (isRoot || closest === getPhash(h) || closest === getPhash(h, 2)) {
									until = void(0);
									cmd = 'tree';
									if (!isRoot) {
										h = getPhash(h);
									}
								} else {
									cmd = 'parents';
								}
								if (!baseHash) {
									baseHash = (cmd === 'tree')? h : closest;
								}
								return makeReq(cmd, h, until);
							}
							return null;
						});
						
						if (reqs.length) {
							selectPages(fm.file(baseHash));
							baseId = fm.navHash2Id(baseHash);
							autoScr && autoScroll(baseId);
							baseNode = jQuery('#'+baseId);
							spinner = jQuery(fm.res('tpl', 'navspinner')).insertBefore(baseNode.children('.'+arrow));
							baseNode.removeClass(collapsed);
							
							jQuery.when.apply($, reqs)
							.done(function() {
								var res = {},data, treeDirs, dirs, argLen, i;
								argLen = arguments.length;
								if (argLen > 0) {
									for (i = 0; i < argLen; i++) {
										data = arguments[i].tree || [];
										res[ends[i]] = Object.assign([], filter(data));
									}
								}
								dfd.resolve(res);
							})
							.fail(function() {
								dfd.reject();
							});
							
							return dfd;
						} else {
							return dfd.resolve();
						}
					},
					done= function(res, dfrd) {
						var open = function() {
								if (openRoot && baseNode) {
									findSubtree(baseNode.hash).show().prev(selNavdir).addClass(expanded);
									openRoot = false;
								}
								if (autoScr) {
									autoScroll().done(checkSubdirs);
								} else {
									checkSubdirs();
								}
							},
							current;
						
						if (res) {
							jQuery.each(res, function(endHash, dirs) {
								dirs && updateTree(dirs);
								selectPages(fm.file(endHash));
								dirs && updateArrows(dirs, loaded);
							});
						}
						
						if (cwdDirs) {
							(fm.api < 2.1) && cwdDirs.push(cwd);
							updateTree(cwdDirs);
						}
						
						// set current node
						current = selectPages();
						
						if (!current.hasClass(active)) {
							tree.find(selNavdir+'.'+active).removeClass(active);
							current.addClass(active);
						}
						
						// mark as loaded to cwd parents
						current.parents('.elfinder-navbar-wrapper').children('.'+navdir).addClass(loaded);
						
						if (res) {
							fm.lazy(open).done(function() {
								dfrd.resolve();
							});
						} else {
							open();
							dfrd.resolve();
						}
					},
					rmSpinner = function(fail) {
						if (baseNode) {
							spinner.remove();
							baseNode.addClass(collapsed + (fail? '' : (' ' + loaded)));
						}
					},
					dfrd = jQuery.Deferred(),
					baseNode, spinner;
				
				if (!fm.navHash2Elm(cwdhash).length) {
					syncing = true;
					loadParents()
					.done(function(res) {
						done(res, dfrd);
						rmSpinner();
					})
					.fail(function() { 
						rmSpinner(true);
						dfrd.reject();
					})
					.always(function() {
						syncing = false;
					});
				} else {
					done(void(0), dfrd);
				}
				
				// trigger 'treesync' with my jQuery.Deferred
				fm.trigger('treesync', dfrd);

				return dfrd;
			},
			
			/**
			 * Make writable and not root dirs droppable
			 *
			 * @return void
			 */
			updateDroppable = function(target, node) {
				var limit = 100,
					next;
				
				if (!target) {
					if (!node || node.closest('div.'+wrapperRoot).hasClass(uploadable)) {
						(node || tree.find('div.'+uploadable)).find(selNavdir+':not(.elfinder-ro,.elfinder-na)').addClass('native-droppable');
					}
					if (!node || node.closest('div.'+wrapperRoot).hasClass(pastable)) {
						target = (node || tree.find('div.'+pastable)).find(selNavdir+':not(.'+droppable+')');
					} else {
						target = jQuery();
					}
					if (node) {
						// check leaf roots
						node.children('div.'+wrapperRoot).each(function() {
							updateDroppable(null, jQuery(this));
						});
					}
				}
				
				// make droppable on async
				if (target.length) {
					fm.asyncJob(function(elm) {
						jQuery(elm).droppable(droppableopts);
					}, jQuery.makeArray(target), {
						interval : 20,
						numPerOnce : 100
					});
				}
			},
			
			/**
			 * Check required folders for subfolders and update arrow classes
			 *
			 * @param  Array  folders to check
			 * @param  String css class 
			 * @return void
			 */
			updateArrows = function(dirs, cls) {
				var sel = cls == loaded
						? '.'+collapsed+':not(.'+loaded+')'
						: ':not(.'+collapsed+')';
				
				jQuery.each(dirs, function(i, dir) {
					fm.navHash2Elm(dir.phash).filter(sel)
						.filter(function() { return jQuery.grep(jQuery(this).next('.'+subtree).children(), function(n) {
							return (jQuery(n).children().hasClass(root))? false : true;
						}).length > 0; })
						.addClass(cls);
				});
			},
			
			
			
			/**
			 * Navigation tree
			 *
			 * @type JQuery
			 */
			tree = jQuery(this).addClass(treeclass)
				// make dirs draggable and toggle hover class
				.on('mouseenter mouseleave', selNavdir, function(e) {
					var enter = (e.type === 'mouseenter');
					if (enter && scrolling) { return; }
					var link  = jQuery(this),
						hash, dir; 
					
					if (!link.hasClass(dropover+' '+disabled)) {
						if (!mobile && enter && !link.data('dragRegisted') && !link.hasClass(root+' '+draggable+' elfinder-na elfinder-wo')) {
							link.data('dragRegisted', true);
							if (fm.isCommandEnabled('copy', (hash = fm.navId2Hash(link.attr('id'))))) {
								link.draggable(fm.draggable);
							}
						}
						link.toggleClass(hover, enter);
					}
					// update title attr if necessary
					if (enter && opts.attrTitle) {
						dir = fm.file(hash || fm.navId2Hash(link.attr('id')));
						if (!dir.isroot && link.attr('title') === (dir.i18 || dir.name)) {
							link.attr('title', fm.path(hash, true));
						}
					}
				})
				// native drag enter
				.on('dragenter', selNavdir, function(e) {
					if (e.originalEvent.dataTransfer) {
						var dst = jQuery(this);
						dst.addClass(hover);
						if (dst.is('.'+collapsed+':not(.'+expanded+')')) {
							dst.data('expandTimer', setTimeout(function() {
								dst.is('.'+collapsed+'.'+hover) && dst.children('.'+arrow).trigger('click');
							}, 500));
						}
					}
				})
				// native drag leave
				.on('dragleave', selNavdir, function(e) {
					if (e.originalEvent.dataTransfer) {
						var dst = jQuery(this);
						dst.data('expandTimer') && clearTimeout(dst.data('expandTimer'));
						dst.removeClass(hover);
					}
				})
				// open dir or open subfolders in tree
				.on('click', selNavdir, function(e) {
					var link = jQuery(this),
						hash = fm.navId2Hash(link.attr('id')),
						file = fm.file(hash);
					
					if (link.data('longtap')) {
						link.removeData('longtap');
						e.stopPropagation();
						return;
					}
					
					if (!link.hasClass(active)) {
						tree.find(selNavdir+'.'+active).removeClass(active);
						link.addClass(active);
					}
					if (hash != fm.cwd().hash && !link.hasClass(disabled)) {
						fm.exec('open', hash).done(function() {
							fm.one('opendone', function() {
								fm.select({selected: [hash], origin: 'navbar'});
							});
						});
					} else {
						if (link.hasClass(collapsed)) {
							link.children('.'+arrow).trigger('click');
						}
						fm.select({selected: [hash], origin: 'navbar'});
					}
				})
				// for touch device
				.on('touchstart', selNavdir, function(e) {
					if (e.originalEvent.touches.length > 1) {
						return;
					}
					var evt = e.originalEvent,
						p;
					
					if (e.target.nodeName === 'INPUT') {
						e.stopPropagation();
						return;
					}
					
					p = jQuery(this).addClass(hover)
					.removeData('longtap')
					.data('tmlongtap', setTimeout(function(e){
						// long tap
						p.data('longtap', true);
						fm.trigger('contextmenu', {
							'type'    : 'navbar',
							'targets' : [fm.navId2Hash(p.attr('id'))],
							'x'       : evt.touches[0].pageX,
							'y'       : evt.touches[0].pageY
						});
					}, 500));
				})
				.on('touchmove touchend', selNavdir, function(e) {
					if (e.target.nodeName === 'INPUT') {
						e.stopPropagation();
						return;
					}
					clearTimeout(jQuery(this).data('tmlongtap'));
					jQuery(this).removeData('tmlongtap');
					if (e.type == 'touchmove') {
						jQuery(this).removeClass(hover);
					}
				})
				// toggle subfolders in tree
				.on('click', selNavdir+'.'+collapsed+' .'+arrow, function(e) {
					var arrow = jQuery(this),
						link  = arrow.parent(selNavdir),
						stree = link.next('.'+subtree),
						dfrd  = jQuery.Deferred(),
						slideTH = 30, cnt;

					e.stopPropagation();

					if (link.hasClass(loaded)) {
						link.toggleClass(expanded);
						fm.lazy(function() {
							cnt = link.hasClass(expanded)? stree.children().length + stree.find('div.elfinder-navbar-subtree[style*=block]').children().length : stree.find('div:visible').length;
							if (cnt > slideTH) {
								stree.toggle();
								fm.draggingUiHelper && fm.draggingUiHelper.data('refreshPositions', 1);
								checkSubdirs();
							} else {
								stree.stop(true, true)[link.hasClass(expanded)? 'slideDown' : 'slideUp'](opts.durations.slideUpDown, function(){
									fm.draggingUiHelper && fm.draggingUiHelper.data('refreshPositions', 1);
									checkSubdirs();
								});
							}
						}).always(function() {
							dfrd.resolve();
						});
					} else {
						spinner.insertBefore(arrow);
						link.removeClass(collapsed);

						fm.request({cmd : 'tree', target : fm.navId2Hash(link.attr('id'))})
							.done(function(data) { 
								updateTree(Object.assign([], filter(data.tree))); 
								
								if (stree.children().length) {
									link.addClass(collapsed+' '+expanded);
									if (stree.children().length > slideTH) {
										stree.show();
										fm.draggingUiHelper && fm.draggingUiHelper.data('refreshPositions', 1);
										checkSubdirs();
									} else {
										stree.stop(true, true).slideDown(opts.durations.slideUpDown, function(){
											fm.draggingUiHelper && fm.draggingUiHelper.data('refreshPositions', 1);
											checkSubdirs();
										});
									}
								} 
							})
							.always(function(data) {
								spinner.remove();
								link.addClass(loaded);
								fm.one('treedone', function() {
									dfrd.resolve();
								});
							});
					}
					arrow.data('dfrd', dfrd);
				})
				.on('contextmenu', selNavdir, function(e) {
					e.stopPropagation();
					var self = jQuery(this);
					
					// now dirname editing
					if (self.find('input:text').length) {
						return;
					}
					
					e.preventDefault();

					if (!self.data('tmlongtap')) {
						fm.trigger('contextmenu', {
							'type'    : 'navbar',
							'targets' : [fm.navId2Hash(jQuery(this).attr('id'))],
							'x'       : e.pageX,
							'y'       : e.pageY
						});
					}
					self.addClass('ui-state-hover');
					
					fm.getUI('contextmenu').children().on('mouseenter', function() {
						self.addClass('ui-state-hover');
					});
					
					fm.bind('closecontextmenu', function() {
						self.removeClass('ui-state-hover');
					});
				})
				.on('scrolltoview', selNavdir, function(e, data) {
					var self = jQuery(this);
					autoScroll(self.attr('id')).done(function() {
						if (!data || data.blink === 'undefined' || data.blink) {
							fm.resources.blink(self, 'lookme');
						}
					});
				})
				// prepend fake dir
				.on('create.'+fm.namespace, function(e, item) {
					var pdir = findSubtree(item.phash),
						lock = item.move || false,
						dir  = jQuery(itemhtml(item)).addClass('elfinder-navbar-wrapper-tmp'),
						selected = fm.selected();
						
					lock && selected.length && fm.trigger('lockfiles', {files: selected});
					pdir.prepend(dir);
				}),
			scrolling = false,
			navbarScrTm,
			// move tree into navbar
			navbar = fm.getUI('navbar').append(tree).show().on('scroll', function() {
				scrolling = true;
				navbarScrTm && cancelAnimationFrame(navbarScrTm);
				navbarScrTm = requestAnimationFrame(function() {
					scrolling = false;
					checkSubdirs();
				});
			}),
			
			prevSortTreeview = fm.sortAlsoTreeview;
			
		fm.open(function(e) {
			var data = e.data,
				dirs = filter(data.files),
				contextmenu = fm.getUI('contextmenu');

			data.init && tree.empty();

			if (fm.UA.iOS) {
				navbar.removeClass('overflow-scrolling-touch').addClass('overflow-scrolling-touch');
			}

			if (dirs.length) {
				fm.lazy(function() {
					if (!contextmenu.data('cmdMaps')) {
						contextmenu.data('cmdMaps', {});
					}
					updateTree(dirs);
					updateArrows(dirs, loaded);
					sync(dirs);
				});
			} else {
				sync();
			}
		})
		// add new dirs
		.add(function(e) {
			var dirs = filter(e.data.added);

			if (dirs.length) {
				updateTree(dirs);
				updateArrows(dirs, collapsed);
			}
		})
		// update changed dirs
		.change(function(e) {
			// do ot perfome while syncing
			if (syncing) {
				return;
			}

			var dirs = filter(e.data.changed, true),
				length = dirs.length,
				l    = length,
				tgts = jQuery(),
				changed = {},
				dir, phash, node, tmp, realParent, reqParent, realSibling, reqSibling, isExpanded, isLoaded, parent, subdirs;
			
			jQuery.each(hasMoreDirs, function(h, node) {
				node.trigger('update.'+fm.namespace, { change: 'prepare' });
			});
			
			while (l--) {
				dir = dirs[l];
				phash = dir.phash;
				if ((node = fm.navHash2Elm(dir.hash)).length) {
					parent = node.parent();
					if (phash) {
						realParent  = node.closest('.'+subtree);
						reqParent   = findSubtree(phash);
						realSibling = node.parent().next();
						reqSibling  = findSibling(reqParent, dir);
						
						if (!reqParent.length) {
							continue;
						}
						
						if (reqParent[0] !== realParent[0] || realSibling.get(0) !== reqSibling.get(0)) {
							reqSibling.length ? reqSibling.before(parent) : reqParent.append(parent);
						}
					}
					isExpanded = node.hasClass(expanded);
					isLoaded   = node.hasClass(loaded);
					tmp        = jQuery(itemhtml(dir));
					node.replaceWith(tmp.children(selNavdir));
					! mobile && updateDroppable(null, parent);
					
					if (dir.dirs
					&& (isExpanded || isLoaded) 
					&& (node = fm.navHash2Elm(dir.hash))
					&& node.next('.'+subtree).children().length) {
						isExpanded && node.addClass(expanded);
						isLoaded && node.addClass(loaded);
					}
					
					subdirs |= dir.dirs == -1;
				}
			}
			
			// to check subdirs
			if (subdirs) {
				checkSubdirs();
			}
			
			jQuery.each(hasMoreDirs, function(h, node) {
				node.trigger('update.'+fm.namespace, { change: 'done' });
			});
			
			length && sync(void(0), false);
		})
		// remove dirs
		.remove(function(e) {
			var dirs = e.data.removed,
				l    = dirs.length,
				node, stree, removed;
			
			jQuery.each(hasMoreDirs, function(h, node) {
				node.trigger('update.'+fm.namespace, { removed : dirs });
				node.trigger('update.'+fm.namespace, { change: 'prepare' });
			});

			while (l--) {
				if ((node = fm.navHash2Elm(dirs[l])).length) {
					removed = true;
					stree = node.closest('.'+subtree);
					node.parent().detach();
					if (!stree.children().length) {
						stree.hide().prev(selNavdir).removeClass(collapsed+' '+expanded+' '+loaded);
					}
				}
			}
			
			removed && fm.getUI('navbar').children('.ui-resizable-handle').trigger('resize');
			
			jQuery.each(hasMoreDirs, function(h, node) {
				node.trigger('update.'+fm.namespace, { change: 'done' });
			});
		})
		// lock/unlock dirs while moving
		.bind('lockfiles unlockfiles', function(e) {
			var lock = e.type == 'lockfiles',
				helperLocked = e.data.helper? e.data.helper.data('locked') : false,
				act  = (lock && !helperLocked) ? 'disable' : 'enable',
				dirs = jQuery.grep(e.data.files||[], function(h) {  
					var dir = fm.file(h);
					return dir && dir.mime == 'directory' ? true : false;
				});
				
			jQuery.each(dirs, function(i, hash) {
				var dir = fm.navHash2Elm(hash);
				
				if (dir.length && !helperLocked) {
					dir.hasClass(draggable) && dir.draggable(act);
					dir.hasClass(droppable) && dir.droppable(act);
					dir[lock ? 'addClass' : 'removeClass'](disabled);
				}
			});
		})
		.bind('sortchange', function() {
			if (fm.sortAlsoTreeview || prevSortTreeview !== fm.sortAlsoTreeview) {
				var dirs,
					ends = [],
					endsMap = {},
					endsVid = {},
					topVid = '',
					single = false,
					current;
				
				fm.lazy(function() {
					dirs = filter(fm.files());
					prevSortTreeview = fm.sortAlsoTreeview;
					
					tree.empty();
					
					// append volume roots at first
					updateTree(jQuery.map(fm.roots, function(h) {
						var dir = fm.file(h);
						return dir && !dir.phash? dir : null;
					}));
					
					if (!Object.keys(hasMoreDirs).length) {
						updateTree(dirs);
						current = selectPages();
						updateArrows(dirs, loaded);
					} else {
						ends = getEnds();
						if (ends.length > 1) {
							jQuery.each(ends, function(i, end) {
								var vid = fm.file(fm.root(end)).volumeid; 
								if (i === 0) {
									topVid = vid;
								}
								endsVid[vid] = end;
								endsMap[end] = [];
							});
							jQuery.each(dirs, function(i, d) {
								if (!d.volumeid) {
									single = true;
									return false;
								}
								endsMap[endsVid[d.volumeid] || endsVid[topVid]].push(d);
							});
						} else {
							single = true;
						}
						if (single) {
							jQuery.each(ends, function(i, endHash) {
								updateTree(dirs);
								current = selectPages(fm.file(endHash));
								updateArrows(dirs, loaded);
							});
						} else {
							jQuery.each(endsMap, function(endHash, dirs) {
								updateTree(dirs);
								current = selectPages(fm.file(endHash));
								updateArrows(dirs, loaded);
							});
						}
					}
					
					sync();
				}, 100);
			}
		});

	});
	
	return this;
};
js/ui/button.js000064400000010173151215013400007440 0ustar00/**
 * @class  elFinder toolbar button widget.
 * If command has variants - create menu
 *
 * @author Dmitry (dio) Levashov
 **/
jQuery.fn.elfinderbutton = function(cmd) {
	"use strict";
	return this.each(function() {
		
		var c        = 'class',
			fm       = cmd.fm,
			disabled = fm.res(c, 'disabled'),
			active   = fm.res(c, 'active'),
			hover    = fm.res(c, 'hover'),
			item     = 'elfinder-button-menu-item',
			selected = 'elfinder-button-menu-item-selected',
			menu,
			text     = jQuery('<span class="elfinder-button-text">'+cmd.title+'</span>'),
			prvCname = cmd.className? cmd.className : cmd.name,
			button   = jQuery(this).addClass('ui-state-default elfinder-button tool-op-'+prvCname)
				.attr('title', cmd.title)
				.append('<span class="elfinder-button-icon elfinder-button-icon-' + prvCname + '"></span>', text)
				.on('mouseenter mouseleave', function(e) { !button.hasClass(disabled) && button[e.type == 'mouseleave' ? 'removeClass' : 'addClass'](hover);})
				.on('click', function(e) { 
					if (!button.hasClass(disabled)) {
						if (menu && cmd.variants.length >= 1) {
							// close other menus
							menu.is(':hidden') && fm.getUI().click();
							e.stopPropagation();
							menu.css(getMenuOffset()).slideToggle({
								duration: 100,
								done: function(e) {
									fm[menu.is(':visible')? 'toFront' : 'toHide'](menu);
								}
							});
						} else {
							fm.exec(cmd.name, getSelected(), {_userAction: true, _currentType: 'toolbar', _currentNode: button });
						}
						
					}
				}),
			hideMenu = function() {
				fm.toHide(menu);
			},
			getMenuOffset = function() {
				var fmNode = fm.getUI(),
					baseOffset = fmNode.offset(),
					buttonOffset = button.offset();
				return {
					top : buttonOffset.top - baseOffset.top,
					left : buttonOffset.left - baseOffset.left,
					maxHeight : fmNode.height() - 40
				};
			},
			getSelected = function() {
				var sel = fm.selected(),
					cwd;
				if (!sel.length) {
					if (cwd = fm.cwd()) {
						sel = [ fm.cwd().hash ];
					} else {
						sel = void(0);
					}
				}
				return sel;
			},
			tm;
			
		text.hide();
		
		// set self button object to cmd object
		cmd.button = button;
		
		// if command has variants create menu
		if (Array.isArray(cmd.variants)) {
			button.addClass('elfinder-menubutton');
			
			menu = jQuery('<div class="ui-front ui-widget ui-widget-content elfinder-button-menu elfinder-button-' + prvCname + '-menu ui-corner-all"></div>')
				.hide()
				.appendTo(fm.getUI())
				.on('mouseenter mouseleave', '.'+item, function() { jQuery(this).toggleClass(hover); })
				.on('click', '.'+item, function(e) {
					var opts = jQuery(this).data('value');
					e.preventDefault();
					e.stopPropagation();
					button.removeClass(hover);
					fm.toHide(menu);
					if (typeof opts === 'undefined') {
						opts = {};
					}
					if (typeof opts === 'object') {
						opts._userAction = true;
					}
					fm.exec(cmd.name, getSelected(), opts);
				})
				.on('close', hideMenu);

			fm.bind('disable select', hideMenu).getUI().on('click', hideMenu);
			
			cmd.change(function() {
				menu.html('');
				jQuery.each(cmd.variants, function(i, variant) {
					menu.append(jQuery('<div class="'+item+'">'+variant[1]+'</div>').data('value', variant[0]).addClass(variant[0] == cmd.value ? selected : ''));
				});
			});
		}	
			
		cmd.change(function() {
			var cName;
			tm && cancelAnimationFrame(tm);
			tm = requestAnimationFrame(function() {
				if (cmd.disabled()) {
					button.removeClass(active+' '+hover).addClass(disabled);
				} else {
					button.removeClass(disabled);
					button[cmd.active() ? 'addClass' : 'removeClass'](active);
				}
				if (cmd.syncTitleOnChange) {
					cName = cmd.className? cmd.className : cmd.name;
					if (prvCname !== cName) {
						button.children('.elfinder-button-icon').removeClass('elfinder-button-icon-' + prvCname).addClass('elfinder-button-icon-' + cName);
						if (menu) {
							menu.removeClass('elfinder-button-' + prvCname + '-menu').addClass('elfinder-button-' + cName + '-menu');
						}
						prvCname = cName;
					}
					text.html(cmd.title);
					button.attr('title', cmd.title);
				}
			});
		})
		.change();
	});
};
js/ui/panel.js000064400000001057151215013400007225 0ustar00jQuery.fn.elfinderpanel = function(fm) {
	"use strict";
	return this.each(function() {
		var panel = jQuery(this).addClass('elfinder-panel ui-state-default ui-corner-all'),
			margin = 'margin-'+(fm.direction == 'ltr' ? 'left' : 'right');
		
		fm.one('load', function(e) {
			var navbar = fm.getUI('navbar');
			
			panel.css(margin, parseInt(navbar.outerWidth(true)));
			navbar.on('resize', function(e) {
				e.preventDefault();
				e.stopPropagation();
				panel.is(':visible') && panel.css(margin, parseInt(navbar.outerWidth(true)));
			});
		});
	});
};
js/ui/cwd.js000064400000257233151215013400006714 0ustar00/**
 * elFinder current working directory ui.
 *
 * @author Dmitry (dio) Levashov
 **/
 jQuery.fn.elfindercwd = function(fm, options) {
	"use strict";
	this.not('.elfinder-cwd').each(function() {
		// fm.time('cwdLoad');
		
		var mobile = fm.UA.Mobile,
			list = fm.viewType == 'list',

			undef = 'undefined',
			/**
			 * Select event full name
			 *
			 * @type String
			 **/
			evtSelect = 'select.'+fm.namespace,
			
			/**
			 * Unselect event full name
			 *
			 * @type String
			 **/
			evtUnselect = 'unselect.'+fm.namespace,
			
			/**
			 * Disable event full name
			 *
			 * @type String
			 **/
			evtDisable = 'disable.'+fm.namespace,
			
			/**
			 * Disable event full name
			 *
			 * @type String
			 **/
			evtEnable = 'enable.'+fm.namespace,
			
			c = 'class',
			/**
			 * File css class
			 *
			 * @type String
			 **/
			clFile       = fm.res(c, 'cwdfile'),
			
			/**
			 * Selected css class
			 *
			 * @type String
			 **/
			fileSelector = '.'+clFile,
			
			/**
			 * Selected css class
			 *
			 * @type String
			 **/
			clSelected = 'ui-selected',
			
			/**
			 * Disabled css class
			 *
			 * @type String
			 **/
			clDisabled = fm.res(c, 'disabled'),
			
			/**
			 * Draggable css class
			 *
			 * @type String
			 **/
			clDraggable = fm.res(c, 'draggable'),
			
			/**
			 * Droppable css class
			 *
			 * @type String
			 **/
			clDroppable = fm.res(c, 'droppable'),
			
			/**
			 * Hover css class
			 *
			 * @type String
			 **/
			clHover     = fm.res(c, 'hover'),

			/**
			 * Active css class
			 *
			 * @type String
			 **/
			clActive     = fm.res(c, 'active'),

			/**
			 * Hover css class
			 *
			 * @type String
			 **/
			clDropActive = fm.res(c, 'adroppable'),

			/**
			 * Css class for temporary nodes (for mkdir/mkfile) commands
			 *
			 * @type String
			 **/
			clTmp = clFile+'-tmp',

			/**
			 * Select checkbox css class
			 * 
			 * @type String
			 */
			clSelChk = 'elfinder-cwd-selectchk',

			/**
			 * Number of thumbnails to load in one request (new api only)
			 *
			 * @type Number
			 **/
			tmbNum = fm.options.loadTmbs > 0 ? fm.options.loadTmbs : 5,
			
			/**
			 * Current search query.
			 *
			 * @type String
			 */
			query = '',

			/**
			 * Currect clipboard(cut) hashes as object key
			 * 
			 * @type Object
			 */
			clipCuts = {},

			/**
			 * Parents hashes of cwd
			 *
			 * @type Array
			 */
			cwdParents = [],
			
			/**
			 * cwd current hashes
			 * 
			 * @type Array
			 */
			cwdHashes = [],

			/**
			 * incsearch current hashes
			 * 
			 * @type Array
			 */
			incHashes = void 0,

			/**
			 * Custom columns name and order
			 *
			 * @type Array
			 */
			customCols = [],

			/**
			 * Current clicked element id of first time for dblclick
			 * 
			 * @type String
			 */
			curClickId = '',

			/**
			 * Custom columns builder
			 *
			 * @type Function
			 */
			customColsBuild = function() {
				var cols = '';
				for (var i = 0; i < customCols.length; i++) {
					cols += '<td class="elfinder-col-'+customCols[i]+'">{' + customCols[i] + '}</td>';
				}
				return cols;
			},

			/**
			 * Make template.row from customCols
			 *
			 * @type Function
			 */
			makeTemplateRow = function() {
				return '<tr id="{id}" class="'+clFile+' {permsclass} {dirclass}" title="{tooltip}"{css}><td class="elfinder-col-name"><div class="elfinder-cwd-file-wrapper"><span class="elfinder-cwd-icon {mime}"{style}></span>{marker}<span class="elfinder-cwd-filename">{name}</span></div>'+selectCheckbox+'</td>'+customColsBuild()+'</tr>';
			},
			
			selectCheckbox = (jQuery.map(options.showSelectCheckboxUA, function(t) {return (fm.UA[t] || t.match(/^all$/i))? true : null;}).length)? '<div class="elfinder-cwd-select"><input type="checkbox" class="'+clSelChk+'"></div>' : '',

			colResizing = false,
			
			colWidth = null,

			/**
			 * Table header height
			 */
			thHeight,

			/**
			 * File templates
			 *
			 * @type Object
			 **/
			templates = {
				icon : '<div id="{id}" class="'+clFile+' {permsclass} {dirclass} ui-corner-all" title="{tooltip}"><div class="elfinder-cwd-file-wrapper ui-corner-all"><div class="elfinder-cwd-icon {mime} ui-corner-all" unselectable="on"{style}></div>{marker}</div><div class="elfinder-cwd-filename" title="{nametitle}">{name}</div>'+selectCheckbox+'</div>',
				row  : ''
			},
			
			permsTpl = fm.res('tpl', 'perms'),
			
			lockTpl = fm.res('tpl', 'lock'),
			
			symlinkTpl = fm.res('tpl', 'symlink'),
			
			/**
			 * Template placeholders replacement rules
			 *
			 * @type Object
			 **/
			replacement = {
				id : function(f) {
					return fm.cwdHash2Id(f.hash);
				},
				name : function(f) {
					var name = fm.escape(f.i18 || f.name);
					!list && (name = name.replace(/([_.])/g, '&#8203;$1'));
					return name;
				},
				nametitle : function(f) {
					return fm.escape(f.i18 || f.name);
				},
				permsclass : function(f) {
					return fm.perms2class(f);
				},
				perm : function(f) {
					return fm.formatPermissions(f);
				},
				dirclass : function(f) {
					var cName = f.mime == 'directory' ? 'directory' : '';
					f.isroot && (cName += ' isroot');
					f.csscls && (cName += ' ' + fm.escape(f.csscls));
					options.getClass && (cName += ' ' + options.getClass(f));
					return cName;
				},
				style : function(f) {
					return f.icon? fm.getIconStyle(f) : '';
				},
				mime : function(f) {
					var cName = fm.mime2class(f.mime);
					f.icon && (cName += ' elfinder-cwd-bgurl');
					return cName;
				},
				size : function(f) {
					return (f.mime === 'directory' && !f.size)? '-' : fm.formatSize(f.size);
				},
				date : function(f) {
					return fm.formatDate(f);
				},
				kind : function(f) {
					return fm.mime2kind(f);
				},
				mode : function(f) {
					return f.perm? fm.formatFileMode(f.perm) : '';
				},
				modestr : function(f) {
					return f.perm? fm.formatFileMode(f.perm, 'string') : '';
				},
				modeoct : function(f) {
					return f.perm? fm.formatFileMode(f.perm, 'octal') : '';
				},
				modeboth : function(f) {
					return f.perm? fm.formatFileMode(f.perm, 'both') : '';
				},
				marker : function(f) {
					return (f.alias || f.mime == 'symlink-broken' ? symlinkTpl : '')+(!f.read || !f.write ? permsTpl : '')+(f.locked ? lockTpl : '');
				},
				tooltip : function(f) {
					var title = fm.formatDate(f) + (f.size > 0 ? ' ('+fm.formatSize(f.size)+')' : ''),
						info  = '';
					if (query && f.path) {
						info = fm.escape(f.path.replace(/\/[^\/]*$/, ''));
					} else {
						info = f.tooltip? fm.escape(f.tooltip).replace(/\r/g, '&#13;') : '';
					}
					if (list) {
						info += (info? '&#13;' : '') + fm.escape(f.i18 || f.name);
					}
					return info? info + '&#13;' + title : title;
				}
			},
			
			/**
			 * Type badge CSS added flag
			 * 
			 * @type Object
			 */
			addedBadges = {},
			
			/**
			 * Type badge style sheet element
			 * 
			 * @type Object
			 */
			addBadgeStyleSheet,
			
			/**
			 * Add type badge CSS into 'head'
			 * 
			 * @type Fundtion
			 */
			addBadgeStyle = function(mime, name) {
				var sel, ext, type;
				if (mime && ! addedBadges[mime]) {
					if (typeof addBadgeStyleSheet === 'undefined') {
						if (jQuery('#elfinderAddBadgeStyle'+fm.namespace).length) {
							jQuery('#elfinderAddBadgeStyle'+fm.namespace).remove();
						}
						addBadgeStyleSheet = jQuery('<style id="addBadgeStyle'+fm.namespace+'"></style>').insertBefore(jQuery('head').children(':first')).get(0).sheet || null;
					}
					if (addBadgeStyleSheet) {
						mime = mime.toLowerCase();
						type = mime.split('/');
						ext = fm.escape(fm.mimeTypes[mime] || (name.replace(/.bac?k$/i, '').match(/\.([^.]+)$/) || ['',''])[1]);
						if (ext) {
							sel = '.elfinder-cwd-icon-' + type[0].replace(/(\.|\+)/g, '-');
							if (typeof type[1] !== 'undefined') {
								sel += '.elfinder-cwd-icon-' + type[1].replace(/(\.|\+)/g, '-');
							}
							try {
								addBadgeStyleSheet.insertRule(sel + ':before{content:"' + ext.toLowerCase() + '"}', 0);
							} catch(e) {}
						}
						addedBadges[mime] = true;
					}
				}
			},
			
			/**
			 * Return file html
			 *
			 * @param  Object  file info
			 * @return String
			 **/
			itemhtml = function(f) {
				f.mime && f.mime !== 'directory' && !addedBadges[f.mime] && addBadgeStyle(f.mime, f.name);
				return templates[list ? 'row' : 'icon']
						.replace(/\{([a-z0-9_]+)\}/g, function(s, e) { 
							return replacement[e] ? replacement[e](f, fm) : (f[e] ? f[e] : ''); 
						});
			},
			
			/**
			 * jQueery node that will be selected next
			 * 
			 * @type Object jQuery node
			 */
			selectedNext = jQuery(),
			
			/**
			 * Flag. Required for msie to avoid unselect files on dragstart
			 *
			 * @type Boolean
			 **/
			selectLock = false,
			
			/**
			 * Move selection to prev/next file
			 *
			 * @param String  move direction
			 * @param Boolean append to current selection
			 * @return void
			 * @rise select			
			 */
			select = function(keyCode, append) {
				var code     = jQuery.ui.keyCode,
					prev     = keyCode == code.LEFT || keyCode == code.UP,
					sel      = cwd.find('[id].'+clSelected),
					selector = prev ? 'first:' : 'last',
					s, n, sib, top, left;

				function sibling(n, direction) {
					return n[direction+'All']('[id]:not(.'+clDisabled+'):not(.elfinder-cwd-parent):first');
				}
				
				if (sel.length) {
					s = sel.filter(prev ? ':first' : ':last');
					sib = sibling(s, prev ? 'prev' : 'next');
					
					if (!sib.length) {
						// there is no sibling on required side - do not move selection
						n = s;
					} else if (list || keyCode == code.LEFT || keyCode == code.RIGHT) {
						// find real prevoius file
						n = sib;
					} else {
						// find up/down side file in icons view
						top = s.position().top;
						left = s.position().left;

						n = s;
						if (prev) {
							do {
								n = n.prev('[id]');
							} while (n.length && !(n.position().top < top && n.position().left <= left));

							if (n.hasClass(clDisabled)) {
								n = sibling(n, 'next');
							}
						} else {
							do {
								n = n.next('[id]');
							} while (n.length && !(n.position().top > top && n.position().left >= left));
							
							if (n.hasClass(clDisabled)) {
								n = sibling(n, 'prev');
							}
							// there is row before last one - select last file
							if (!n.length) {
								sib = cwd.find('[id]:not(.'+clDisabled+'):last');
								if (sib.position().top > top) {
									n = sib;
								}
							}
						}
					}
					// !append && unselectAll();
				} else {
					if (selectedNext.length) {
						n = prev? selectedNext.prev() : selectedNext;
					} else {
						// there are no selected file - select first/last one
						n = cwd.find('[id]:not(.'+clDisabled+'):not(.elfinder-cwd-parent):'+(prev ? 'last' : 'first'));
					}
				}
				
				if (n && n.length && !n.hasClass('elfinder-cwd-parent')) {
					if (s && append) {
						// append new files to selected
						n = s.add(s[prev ? 'prevUntil' : 'nextUntil']('#'+n.attr('id'))).add(n);
					} else {
						// unselect selected files
						sel.trigger(evtUnselect);
					}
					// select file(s)
					n.trigger(evtSelect);
					// set its visible
					scrollToView(n.filter(prev ? ':first' : ':last'));
					// update cache/view
					trigger();
				}
			},
			
			selectedFiles = {},
			
			selectFile = function(hash) {
				fm.cwdHash2Elm(hash).trigger(evtSelect);
			},
			
			allSelected = false,
			
			selectAll = function() {
				var phash = fm.cwd().hash;

				selectCheckbox && selectAllCheckbox.find('input').prop('checked', true);
				fm.lazy(function() {
					var files;
					if (fm.maxTargets && (incHashes || cwdHashes).length > fm.maxTargets) {
						unselectAll({ notrigger: true });
						files = jQuery.map(incHashes || cwdHashes, function(hash) { return fm.file(hash) || null; });
						files = files.slice(0, fm.maxTargets);
						selectedFiles = {};
						jQuery.each(files, function(i, v) {
							selectedFiles[v.hash] = true;
							fm.cwdHash2Elm(v.hash).trigger(evtSelect);
						});
						fm.toast({mode: 'warning', msg: fm.i18n(['errMaxTargets', fm.maxTargets])});
					} else {
						cwd.find('[id]:not(.'+clSelected+'):not(.elfinder-cwd-parent)').trigger(evtSelect);
						selectedFiles = fm.arrayFlip(incHashes || cwdHashes, true);
					}
					trigger();
					selectCheckbox && selectAllCheckbox.data('pending', false);
				}, 0, {repaint: true});
			},
			
			/**
			 * Unselect all files
			 *
			 * @param  Object  options
			 * @return void
			 */
			unselectAll = function(opts) {
				var o = opts || {};
				selectCheckbox && selectAllCheckbox.find('input').prop('checked', false);
				if (Object.keys(selectedFiles).length) {
					selectLock = false;
					selectedFiles = {};
					cwd.find('[id].'+clSelected).trigger(evtUnselect);
					selectCheckbox && cwd.find('input:checkbox.'+clSelChk).prop('checked', false);
				}
				!o.notrigger && trigger();
				selectCheckbox && selectAllCheckbox.data('pending', false);
				cwd.removeClass('elfinder-cwd-allselected');
			},
			
			selectInvert = function() {
				var invHashes = {};
				if (allSelected) {
					unselectAll();
				} else if (! Object.keys(selectedFiles).length) {
					selectAll();
				} else {
					jQuery.each((incHashes || cwdHashes), function(i, h) {
						var itemNode = fm.cwdHash2Elm(h);
						if (! selectedFiles[h]) {
							invHashes[h] = true;
							itemNode.length && itemNode.trigger(evtSelect);
						} else {
							itemNode.length && itemNode.trigger(evtUnselect);
						}
					});
					selectedFiles = invHashes;
					trigger();
				}
			},
			
			/**
			 * Return selected files hashes list
			 *
			 * @return Array
			 */
			selected = function() {
				return Object.keys(selectedFiles);
			},
			
			/**
			 * Last selected node id
			 * 
			 * @type String|Void
			 */
			lastSelect = void 0,
			
			/**
			 * Fire elfinder "select" event and pass selected files to it
			 *
			 * @return void
			 */
			trigger = function() {
				var selected = Object.keys(selectedFiles),
					opts = {
						selected : selected,
						origin : 'cwd'
					};
				
				if (oldSchoolItem && (selected.length > 1 || selected[0] !== fm.cwdId2Hash(
					oldSchoolItem.attr('id'))) && oldSchoolItem.hasClass(clSelected)) {
					oldSchoolItem.trigger(evtUnselect);
				}
				allSelected = selected.length && (selected.length === (incHashes || cwdHashes).length) && (!fm.maxTargets || selected.length <= fm.maxTargets);
				if (selectCheckbox) {
					selectAllCheckbox.find('input').prop('checked', allSelected);
					cwd[allSelected? 'addClass' : 'removeClass']('elfinder-cwd-allselected');
				}
				if (allSelected) {
					opts.selectall = true;
				} else if (! selected.length) {
					opts.unselectall = true;
				}
				fm.trigger('select', opts);
			},
			
			/**
			 * Scroll file to set it visible
			 *
			 * @param DOMElement  file/dir node
			 * @return void
			 */
			scrollToView = function(o, blink) {
				if (! o.length) {
					return;
				}
				var ftop    = o.position().top,
					fheight = o.outerHeight(true),
					wtop    = wrapper.scrollTop(),
					wheight = wrapper.get(0).clientHeight,
					thheight = tableHeader? tableHeader.outerHeight(true) : 0;

				if (ftop + thheight + fheight > wtop + wheight) {
					wrapper.scrollTop(parseInt(ftop + thheight + fheight - wheight));
				} else if (ftop < wtop) {
					wrapper.scrollTop(ftop);
				}
				list && wrapper.scrollLeft(0);
				!!blink && fm.resources.blink(o, 'lookme');
			},
			
			/**
			 * Files we get from server but not show yet
			 *
			 * @type Array
			 **/
			buffer = [],
			
			/**
			 * Extra data of buffer
			 *
			 * @type Object
			 **/
			bufferExt = {},
			
			/**
			 * Return index of elements with required hash in buffer 
			 *
			 * @param String  file hash
			 * @return Number
			 */
			index = function(hash) {
				var l = buffer.length;
				
				while (l--) {
					if (buffer[l].hash == hash) {
						return l;
					}
				}
				return -1;
			},
			
			/**
			 * Scroll start event name
			 *
			 * @type String
			 **/
			scrollStartEvent = 'elfscrstart',
			
			/**
			 * Scroll stop event name
			 *
			 * @type String
			 **/
			scrollEvent = 'elfscrstop',
			
			scrolling = false,
			
			/**
			 * jQuery UI selectable option
			 * 
			 * @type Object
			 */
			selectableOption = {
				disabled   : true,
				filter     : '[id]:first',
				stop       : trigger,
				delay      : 250,
				appendTo   : 'body',
				autoRefresh: false,
				selected   : function(e, ui) { jQuery(ui.selected).trigger(evtSelect); },
				unselected : function(e, ui) { jQuery(ui.unselected).trigger(evtUnselect); }
			},
			
			/**
			 * hashes of items displayed in current view
			 * 
			 * @type Object  ItemHash => DomId
			 */
			inViewHashes = {},
			
			/**
			 * Processing when the current view is changed (On open, search, scroll, resize etc.)
			 * 
			 * @return void
			 */
			wrapperRepaint = function(init, recnt) {
				if (!bufferExt.renderd) {
					return;
				}
				var firstNode = (list? cwd.find('tbody:first') : cwd).children('[id]'+(options.oldSchool? ':not(.elfinder-cwd-parent)' : '')+':first');
				if (!firstNode.length) {
					return;
				}
				var selectable = cwd.data('selectable'),
					rec = (function() {
						var wos = wrapper.offset(),
							ww = wrapper.width(),
							w = jQuery(window),
							x = firstNode.width() / 2,
							l = Math.min(wos.left - w.scrollLeft() + (fm.direction === 'ltr'? x : ww - x), wos.left + ww - 10),
							t = wos.top - w.scrollTop() + 10 + (list? thHeight : 0);
						return {left: Math.max(0, Math.round(l)), top: Math.max(0, Math.round(t))};
					})(),
					tgt = init? firstNode : jQuery(document.elementFromPoint(rec.left , rec.top)),
					ids = {},
					tmbs = {},
					multi = 5,
					cnt = Math.ceil((bufferExt.hpi? Math.ceil((wz.data('rectangle').height / bufferExt.hpi) * 1.5) : showFiles) / multi),
					chk = function() {
						var id, hash, file, i;
						for (i = 0; i < multi; i++) {
							id = tgt.attr('id');
							if (id) {
								bufferExt.getTmbs = [];
								hash = fm.cwdId2Hash(id);
								inViewHashes[hash] = id;
								// for tmbs
								if (bufferExt.attachTmbs[hash]) {
									tmbs[hash] = bufferExt.attachTmbs[hash];
								}
								// for selectable
								selectable && (ids[id] = true);
							}
							// next node
							tgt = tgt.next();
							if (!tgt.length) {
								break;
							}
						}
					},
					done = function() {
						var idsArr;
						if (cwd.data('selectable')) {
							Object.assign(ids, selectedFiles);
							idsArr = Object.keys(ids);
							if (idsArr.length) {
								selectableOption.filter = '#'+idsArr.join(', #');
								cwd.selectable('enable').selectable('option', {filter : selectableOption.filter}).selectable('refresh');
							}
						}
						if (Object.keys(tmbs).length) {
							bufferExt.getTmbs = [];
							attachThumbnails(tmbs);
						}
					},
					setTarget = function() {
						if (!tgt.hasClass(clFile)) {
							tgt = tgt.closest(fileSelector);
						}
					},
					arr, widget;
				
				inViewHashes = {};
				selectable && cwd.selectable('option', 'disabled');
				
				if (tgt.length) {
					if (!tgt.hasClass(clFile) && !tgt.closest(fileSelector).length) {
						// dialog, serach button etc.
						widget = fm.getUI().find('.ui-dialog:visible,.ui-widget:visible');
						if (widget.length) {
							widget.hide();
							tgt = jQuery(document.elementFromPoint(rec.left , rec.top));
							widget.show();
						} else {
							widget = null;
						}
					}
					setTarget();
					if (!tgt.length) {
						// try search 5px down
						widget && widget.hide();
						tgt = jQuery(document.elementFromPoint(rec.left , rec.top + 5));
						widget && widget.show();
						setTarget();
					}
				}

				if (tgt.length) {
					if (tgt.attr('id')) {
						if (init) {
							for (var i = 0; i < cnt; i++) {
								chk();
								if (! tgt.length) {
									break;
								}
							}
							done();
						} else {
							bufferExt.repaintJob && bufferExt.repaintJob.state() === 'pending' && bufferExt.repaintJob.reject();
							arr = new Array(cnt);
							bufferExt.repaintJob = fm.asyncJob(function() {
								chk();
								if (! tgt.length) {
									done();
									bufferExt.repaintJob && bufferExt.repaintJob.state() === 'pending' && bufferExt.repaintJob.reject();
								}
							}, arr).done(done);
						}
					}
				} else if (init && bufferExt.renderd) {
					// In initial request, cwd DOM not renderd so doing lazy check
					recnt = recnt || 0;
					if (recnt < 10) { // Prevent infinite loop
						requestAnimationFrame(function() {
							wrapperRepaint(init, ++recnt);
						});
					}
				}
			},
			
			/**
			 * Item node of oldScholl ".."
			 */
			oldSchoolItem = null,

			/**
			 * display parent folder with ".." name
			 * 
			 * @param  String  phash
			 * @return void
			 */
			oldSchool = function(p) {
				var phash = fm.cwd().phash,
					pdir  = fm.file(phash) || null,
					set   = function(pdir) {
						if (pdir) {
							oldSchoolItem = jQuery(itemhtml(jQuery.extend(true, {}, pdir, {name : '..', i18 : '..', mime : 'directory'})))
								.addClass('elfinder-cwd-parent')
								.on('dblclick', function() {
									fm.trigger('select', {selected : [phash]}).exec('open', phash);
								});
							(list ? oldSchoolItem.children('td:first') : oldSchoolItem).children('.elfinder-cwd-select').remove();
							if (fm.cwdHash2Elm(phash).length) {
								fm.cwdHash2Elm(phash).replaceWith(oldSchoolItem);
							} else {
								(list ? cwd.find('tbody') : cwd).prepend(oldSchoolItem);
							}
							fm.draggingUiHelper && fm.draggingUiHelper.data('refreshPositions', 1);
						}
					};
				if (pdir) {
					set(pdir);
				} else {
					set({hash: phash, read: true, write: true});
					if (fm.getUI('tree').length) {
						fm.one('parents', function() {
							set(fm.file(phash) || null);
							wrapper.trigger(scrollEvent);
						});
					} else {
						fm.request({
							data : {cmd : 'parents', target : fm.cwd().hash},
							preventFail : true
						})
						.done(function(data) {
							set(fm.file(phash) || null);
							wrapper.trigger(scrollEvent);
						});
					}
				}
			},
			
			showFiles = fm.options.showFiles,
			
			/**
			 * Cwd scroll event handler.
			 * Lazy load - append to cwd not shown files
			 *
			 * @return void
			 */
			render = function() {
				if (bufferExt.rendering || (bufferExt.renderd && ! buffer.length)) {
					return;
				}
				var place = (list ? cwd.children('table').children('tbody') : cwd),
					phash,
					chk,
					// created document fragment for jQuery >= 1.12, 2.2, 3.0
					// see Studio-42/elFinder#1544 @ github
					docFlag = jQuery.htmlPrefilter? true : false,
					tempDom = docFlag? jQuery(document.createDocumentFragment()) : jQuery('<div></div>'),
					go      = function(o){
						var over  = o || null,
							html  = [],
							dirs  = false,
							atmb  = {},
							stmb  = (fm.option('tmbUrl') === 'self'),
							init  = bufferExt.renderd? false : true,
							files, locks, selected;
						
						files = buffer.splice(0, showFiles + (over || 0) / (bufferExt.hpi || 1));
						bufferExt.renderd += files.length;
						if (! buffer.length) {
							bottomMarker.hide();
							wrapper.off(scrollEvent, render);
						}
						
						locks = [];
						html = jQuery.map(files, function(f) {
							if (f.hash && f.name) {
								if (f.mime == 'directory') {
									dirs = true;
								}
								if ((f.tmb && (f.tmb != 1 || f.size > 0)) || (stmb && f.mime.indexOf('image/') === 0)) {
									atmb[f.hash] = f.tmb || 'self';
								}
								clipCuts[f.hash] && locks.push(f.hash);
								return itemhtml(f);
							}
							return null;
						});

						// html into temp node
						tempDom.empty().append(html.join(''));
						
						// make directory droppable
						dirs && !mobile && makeDroppable(tempDom);
						
						// check selected items
						selected = [];
						if (Object.keys(selectedFiles).length) {
							tempDom.find('[id]:not(.'+clSelected+'):not(.elfinder-cwd-parent)').each(function() {
								selectedFiles[fm.cwdId2Hash(this.id)] && selected.push(jQuery(this));
							});
						}
						
						// append to cwd
						place.append(docFlag? tempDom : tempDom.children());
						
						// trigger select
						if (selected.length) {
							jQuery.each(selected, function(i, n) { n.trigger(evtSelect); });
							trigger();
						}
						
						locks.length && fm.trigger('lockfiles', {files: locks});
						!bufferExt.hpi && bottomMarkerShow(place, files.length);
						
						if (list) {
							// show thead
							cwd.find('thead').show();
							// fixed table header
							fixTableHeader({fitWidth: ! colWidth});
						}
						
						if (Object.keys(atmb).length) {
							Object.assign(bufferExt.attachTmbs, atmb);
						}
						
						if (init) {
							if (! mobile && ! cwd.data('selectable')) {
								// make files selectable
								cwd.selectable(selectableOption).data('selectable', true);
							}
						}

						! scrolling && wrapper.trigger(scrollEvent);
					};
				
				if (! bufferExt.renderd) {
					// first time to go()
					bufferExt.rendering = true;
					// scroll top on dir load to avoid scroll after page reload
					wrapper.scrollTop(0);
					phash = fm.cwd().phash;
					go();
					if (options.oldSchool) {
						if (phash && !query) {
							oldSchool(phash);
						} else {
							oldSchoolItem = jQuery();
						}
					}
					if (list) {
						colWidth && setColwidth();
						fixTableHeader({fitWidth: true});
					}
					bufferExt.itemH = (list? place.find('tr:first') : place.find('[id]:first')).outerHeight(true);
					fm.trigger('cwdrender');
					bufferExt.rendering = false;
					wrapperRepaint(true);
				}
				if (! bufferExt.rendering && buffer.length) {
					// next go()
					if ((chk = (wrapper.height() + wrapper.scrollTop() + fm.options.showThreshold + bufferExt.row) - (bufferExt.renderd * bufferExt.hpi)) > 0) {
						bufferExt.rendering = true;
						fm.lazy(function() {
							go(chk);
							bufferExt.rendering = false;
						});
					} else {
						!fm.enabled() && resize();
					}
				} else {
					resize();
				}
			},
			
			// fixed table header jQuery object
			tableHeader = null,

			// Is UA support CSS sticky
			cssSticky = fm.UA.CSS.positionSticky && fm.UA.CSS.widthMaxContent,
			
			// To fixed table header colmun
			fixTableHeader = function(optsArg) {
				thHeight = 0;
				if (! options.listView.fixedHeader) {
					return;
				}
				var setPos = function() {
					var val, pos;
					pos = (fm.direction === 'ltr')? 'left' : 'right';
					val = ((fm.direction === 'ltr')? wrapper.scrollLeft() : table.outerWidth(true) - wrapper.width() - wrapper.scrollLeft()) * -1;
					if (base.css(pos) !== val) {
						base.css(pos, val);
					}
				},
				opts = optsArg || {},
				cnt, base, table, htable, thead, tbody, hheight, htr, btr, htd, btd, htw, btw, init;
				
				tbody = cwd.find('tbody');
				btr = tbody.children('tr:first');
				if (btr.length && btr.is(':visible')) {
					table = tbody.parent();
					if (! tableHeader) {
						init = true;
						tbody.addClass('elfinder-cwd-fixheader');
						thead = cwd.find('thead').attr('id', fm.namespace+'-cwd-thead');
						htr = thead.children('tr:first');
						hheight = htr.outerHeight(true);
						cwd.css('margin-top', hheight - parseInt(table.css('padding-top')));
						if (cssSticky) {
							tableHeader = jQuery('<div class="elfinder-table-header-sticky"></div>').addClass(cwd.attr('class')).append(jQuery('<table></table>').append(thead));
							cwd.after(tableHeader);
							wrapper.on('resize.fixheader', function(e) {
								e.stopPropagation();
								fixTableHeader({fitWidth: true});
							});
						} else {
							base = jQuery('<div></div>').addClass(cwd.attr('class')).append(jQuery('<table></table>').append(thead));
							tableHeader = jQuery('<div></div>').addClass(wrapper.attr('class') + ' elfinder-cwd-fixheader')
								.removeClass('ui-droppable native-droppable')
								.css(wrapper.position())
								.css({ height: hheight, width: cwd.outerWidth() })
								.append(base);
							if (fm.direction === 'rtl') {
								tableHeader.css('left', (wrapper.data('width') - wrapper.width()) + 'px');
							}
							setPos();
							wrapper.after(tableHeader)
								.on('scroll.fixheader resize.fixheader', function(e) {
									setPos();
									if (e.type === 'resize') {
										e.stopPropagation();
										tableHeader.css(wrapper.position());
										wrapper.data('width', wrapper.css('overflow', 'hidden').width());
										wrapper.css('overflow', 'auto');
										fixTableHeader();
									}
								});
						}
					} else {
						thead = jQuery('#'+fm.namespace+'-cwd-thead');
						htr = thead.children('tr:first');
					}
					
					if (init || opts.fitWidth || Math.abs(btr.outerWidth() - htr.outerWidth()) > 2) {
						cnt = customCols.length + 1;
						for (var i = 0; i < cnt; i++) {
							htd = htr.children('td:eq('+i+')');
							btd = btr.children('td:eq('+i+')');
							htw = htd.width();
							btw = btd.width();
							if (typeof htd.data('delta') === 'undefined') {
								htd.data('delta', (htd.outerWidth() - htw) - (btd.outerWidth() - btw));
							}
							btw -= htd.data('delta');
							if (! init && ! opts.fitWidth && htw === btw) {
								break;
							}
							htd.css('width', btw + 'px');
						}
					}
					
					if (!cssSticky) {
						tableHeader.data('widthTimer') && cancelAnimationFrame(tableHeader.data('widthTimer'));
						tableHeader.data('widthTimer', requestAnimationFrame(function() {
							if (tableHeader) {
								tableHeader.css('width', mBoard.width() + 'px');
								if (fm.direction === 'rtl') {
									tableHeader.css('left', (wrapper.data('width') - wrapper.width()) + 'px');
								}
							}
						}));
					}
					thHeight = thead.height();
				}
			},
			
			// Set colmun width
			setColwidth = function() {
				if (list && colWidth) {
					var cl = 'elfinder-cwd-colwidth',
					first = cwd.find('tr[id]:first'),
					former;
					if (! first.hasClass(cl)) {
						former = cwd.find('tr.'+cl);
						former.removeClass(cl).find('td').css('width', '');
						first.addClass(cl);
						cwd.find('table:first').css('table-layout', 'fixed');
						jQuery.each(jQuery.merge(['name'], customCols), function(i, k) {
							var w = colWidth[k] || first.find('td.elfinder-col-'+k).width();
							first.find('td.elfinder-col-'+k).width(w);
						});
					}
				}
			},
			
			/**
			 * Droppable options for cwd.
			 * Drop target is `wrapper`
			 * Do not add class on childs file over
			 *
			 * @type Object
			 */
			droppable = Object.assign({}, fm.droppable, {
				over : function(e, ui) {
					var dst    = jQuery(this),
						helper = ui.helper,
						ctr    = fm._commands.copy && (e.shiftKey || e.ctrlKey || e.metaKey),
						hash, status, inParent;
					e.stopPropagation();
					helper.data('dropover', helper.data('dropover') + 1);
					dst.data('dropover', true);
					helper.removeClass('elfinder-drag-helper-move elfinder-drag-helper-plus');
					if (helper.data('namespace') !== fm.namespace || ! fm.insideWorkzone(e.pageX, e.pageY)) {
						dst.removeClass(clDropActive);
						//helper.removeClass('elfinder-drag-helper-move elfinder-drag-helper-plus');
						return;
					}
					if (dst.hasClass(fm.res(c, 'cwdfile'))) {
						hash = fm.cwdId2Hash(dst.attr('id'));
						dst.data('dropover', hash);
					} else {
						hash = fm.cwd().hash;
						fm.cwd().write && dst.data('dropover', hash);
					}
					inParent = (fm.file(helper.data('files')[0]).phash === hash);
					if (dst.data('dropover') === hash) {
						jQuery.each(helper.data('files'), function(i, h) {
							if (h === hash || (inParent && !ctr && !helper.hasClass('elfinder-drag-helper-plus'))) {
								dst.removeClass(clDropActive);
								return false; // break jQuery.each
							}
						});
					} else {
						dst.removeClass(clDropActive);
					}
					if (helper.data('locked') || inParent) {
						status = 'elfinder-drag-helper-plus';
					} else {
						status = 'elfinder-drag-helper-move';
						if (ctr) {
							status += ' elfinder-drag-helper-plus';
						}
					}
					dst.hasClass(clDropActive) && helper.addClass(status);
					requestAnimationFrame(function(){ dst.hasClass(clDropActive) && helper.addClass(status); });
				},
				out : function(e, ui) {
					var helper = ui.helper;
					e.stopPropagation();
					helper.removeClass('elfinder-drag-helper-move elfinder-drag-helper-plus').data('dropover', Math.max(helper.data('dropover') - 1, 0));
					jQuery(this).removeData('dropover')
					       .removeClass(clDropActive);
				},
				deactivate : function() {
					jQuery(this).removeData('dropover')
					       .removeClass(clDropActive);
				},
				drop : function(e, ui) {
					unselectAll({ notrigger: true });
					fm.droppable.drop.call(this, e, ui);
				}
			}),
			
			/**
			 * Make directory droppable
			 *
			 * @return void
			 */
			makeDroppable = function(place) {
				place = place? place : (list ? cwd.find('tbody') : cwd);
				var targets = place.children('.directory:not(.'+clDroppable+',.elfinder-na,.elfinder-ro)');

				if (fm.isCommandEnabled('paste')) {
					targets.droppable(droppable);
				}
				if (fm.isCommandEnabled('upload')) {
					targets.addClass('native-droppable');
				}
				
				place.children('.isroot').each(function(i, n) {
					var $n   = jQuery(n),
						hash = fm.cwdId2Hash(n.id);
					
					if (fm.isCommandEnabled('paste', hash)) {
						if (! $n.hasClass(clDroppable+',elfinder-na,elfinder-ro')) {
							$n.droppable(droppable);
						}
					} else {
						if ($n.hasClass(clDroppable)) {
							$n.droppable('destroy');
						}
					}
					if (fm.isCommandEnabled('upload', hash)) {
						if (! $n.hasClass('native-droppable,elfinder-na,elfinder-ro')) {
							$n.addClass('native-droppable');
						}
					} else {
						if ($n.hasClass('native-droppable')) {
							$n.removeClass('native-droppable');
						}
					}
				});
			},
			
			/**
			 * Preload required thumbnails and on load add css to files.
			 * Return false if required file is not visible yet (in buffer) -
			 * required for old api to stop loading thumbnails.
			 *
			 * @param  Object  file hash -> thumbnail map
			 * @param  Bool    reload
			 * @return void
			 */
			attachThumbnails = function(tmbs, reload) {
				var attach = function(node, tmb) {
						jQuery('<img/>')
							.on('load', function() {
								node.find('.elfinder-cwd-icon').addClass(tmb.className).css('background-image', "url('"+tmb.url+"')");
							})
							.attr('src', tmb.url);
					},
					chk  = function(hash, tmb) {
						var node = fm.cwdHash2Elm(hash),
							file, tmbObj, reloads = [];
	
						if (node.length) {
							if (tmb != '1') {
								file = fm.file(hash);
								if (file.tmb !== tmb) {
									file.tmb = tmb;
								}
								tmbObj = fm.tmb(file);
								if (reload) {
									node.find('.elfinder-cwd-icon').addClass(tmbObj.className).css('background-image', "url('"+tmbObj.url+"')");
								} else {
									attach(node, tmbObj);
								}
								delete bufferExt.attachTmbs[hash];
							} else {
								if (reload) {
									loadThumbnails([hash]);
								} else if (! bufferExt.tmbLoading[hash]) {
									bufferExt.getTmbs.push(hash);
								}
							}
						}
					};

				if (jQuery.isPlainObject(tmbs) && Object.keys(tmbs).length) {
					Object.assign(bufferExt.attachTmbs, tmbs);
					jQuery.each(tmbs, chk);
					if (! reload && bufferExt.getTmbs.length && ! Object.keys(bufferExt.tmbLoading).length) {
						loadThumbnails();
					}
				}
			},
			
			/**
			 * Load thumbnails from backend.
			 *
			 * @param  Array|void reloads  hashes list for reload thumbnail items
			 * @return void
			 */
			loadThumbnails = function(reloads) {
				var tmbs = [],
					reload = false;
				
				if (fm.oldAPI) {
					fm.request({
						data : {cmd : 'tmb', current : fm.cwd().hash},
						preventFail : true
					})
					.done(function(data) {
						if (data.images && Object.keys(data.images).length) {
							attachThumbnails(data.images);
						}
						if (data.tmb) {
							loadThumbnails();
						}
					});
					return;
				} 

				if (reloads) {
					reload = true;
					tmbs = reloads.splice(0, tmbNum);
				} else {
					tmbs = bufferExt.getTmbs.splice(0, tmbNum);
				}
				if (tmbs.length) {
					if (reload || inViewHashes[tmbs[0]] || inViewHashes[tmbs[tmbs.length-1]]) {
						jQuery.each(tmbs, function(i, h) {
							bufferExt.tmbLoading[h] = true;
						});
						fm.request({
							data : {cmd : 'tmb', targets : tmbs},
							preventFail : true
						})
						.done(function(data) {
							var errs = [],
								resLen;
							if (data.images) {
								if (resLen = Object.keys(data.images).length) {
									if (resLen < tmbs.length) {
										jQuery.each(tmbs, function(i, h) {
											if (! data.images[h]) {
												errs.push(h);
											}
										});
									}
									attachThumbnails(data.images, reload);
								} else {
									errs = tmbs;
								}
								// unset error items from bufferExt.attachTmbs
								if (errs.length) {
									jQuery.each(errs, function(i, h) {
										delete bufferExt.attachTmbs[h];
									});
								}
							}
							if (reload) {
								if (reloads.length) {
									loadThumbnails(reloads);
								}
							}
						})
						.always(function() {
							bufferExt.tmbLoading = {};
							if (! reload && bufferExt.getTmbs.length) {
								loadThumbnails();
							}
						});
					}
				}
			},
			
			/**
			 * Add new files to cwd/buffer
			 *
			 * @param  Array  new files
			 * @return void
			 */
			add = function(files, mode) {
				var place    = list ? cwd.find('tbody') : cwd,
					l        = files.length, 
					atmb     = {},
					findNode = function(file) {
						var pointer = cwd.find('[id]:first'), file2;

						while (pointer.length) {
							file2 = fm.file(fm.cwdId2Hash(pointer.attr('id')));
							if (!pointer.hasClass('elfinder-cwd-parent') && file2 && fm.compare(file, file2) < 0) {
								return pointer;
							}
							pointer = pointer.next('[id]');
						}
					},
					findIndex = function(file) {
						var l = buffer.length, i;
						
						for (i =0; i < l; i++) {
							if (fm.compare(file, buffer[i]) < 0) {
								return i;
							}
						}
						return l || -1;
					},
					// created document fragment for jQuery >= 1.12, 2.2, 3.0
					// see Studio-42/elFinder#1544 @ github
					docFlag = jQuery.htmlPrefilter? true : false,
					tempDom = docFlag? jQuery(document.createDocumentFragment()) : jQuery('<div></div>'),
					file, hash, node, nodes, ndx, stmb;

				if (l > showFiles) {
					// re-render for performance tune
					content();
					selectedFiles = fm.arrayFlip(jQuery.map(files, function(f) { return f.hash; }), true);
					trigger();
				} else {
					// add the item immediately
					l && wz.removeClass('elfinder-cwd-wrapper-empty');
					
					// Self thumbnail
					stmb = (fm.option('tmbUrl') === 'self');
					
					while (l--) {
						file = files[l];
						hash = file.hash;
						
						if (fm.cwdHash2Elm(hash).length) {
							continue;
						}
						
						if ((node = findNode(file)) && ! node.length) {
							node = null;
						}
						if (! node && (ndx = findIndex(file)) >= 0) {
							buffer.splice(ndx, 0, file);
						} else {
							tempDom.empty().append(itemhtml(file));
							(file.mime === 'directory') && !mobile && makeDroppable(tempDom);
							nodes = docFlag? tempDom : tempDom.children();
							if (node) {
								node.before(nodes);
							} else {
								place.append(nodes);
							}
							++bufferExt.renderd;
						}
						
						if (fm.cwdHash2Elm(hash).length) {
							if ((file.tmb && (file.tmb != 1 || file.size > 0)) || (stmb && file.mime.indexOf('image/') === 0)) {
								atmb[hash] = file.tmb || 'self';
							}
						}
					}
	
					if (list) {
						setColwidth();
						fixTableHeader({fitWidth: ! colWidth});
					}
					bottomMarkerShow(place);
					if (Object.keys(atmb).length) {
						Object.assign(bufferExt.attachTmbs, atmb);
						if (buffer.length < 1) {
							loadThumbnails();
						}
					}
				}
			},
			
			/**
			 * Remove files from cwd/buffer
			 *
			 * @param  Array  files hashes
			 * @return void
			 */
			remove = function(files) {
				var l = files.length,
					inSearch = fm.searchStatus.state > 1,
					curCmd = fm.getCommand(fm.currentReqCmd) || {},
					hash, n, ndx, found;

				// removed cwd
				if (!fm.cwd().hash && !curCmd.noChangeDirOnRemovedCwd) {
					jQuery.each(cwdParents.reverse(), function(i, h) {
						if (fm.file(h)) {
							found = true;
							fm.one(fm.currentReqCmd + 'done', function() {
								!fm.cwd().hash && fm.exec('open', h);
							});
							return false;
						}
					});
					// fallback to fm.roots[0]
					!found && !fm.cwd().hash && fm.exec('open', fm.roots[Object.keys(fm.roots)[0]]);
					return;
				}
				
				while (l--) {
					hash = files[l];
					if ((n = fm.cwdHash2Elm(hash)).length) {
						try {
							n.remove();
							--bufferExt.renderd;
						} catch(e) {
							fm.debug('error', e);
						}
					} else if ((ndx = index(hash)) !== -1) {
						buffer.splice(ndx, 1);
					}
					selectedFiles[hash] && delete selectedFiles[hash];
					if (inSearch) {
						if ((ndx = jQuery.inArray(hash, cwdHashes)) !== -1) {
							cwdHashes.splice(ndx, 1);
						}
					}
				}
				
				inSearch && fm.trigger('cwdhasheschange', cwdHashes);
				
				if (list) {
					setColwidth();
					fixTableHeader({fitWidth: ! colWidth});
				}
			},
			
			customColsNameBuild = function() {
				var name = '',
				customColsName = '';
				for (var i = 0; i < customCols.length; i++) {
					name = fm.getColumnName(customCols[i]);
					customColsName +='<td class="elfinder-cwd-view-th-'+customCols[i]+' sortable-item">'+name+'</td>';
				}
				return customColsName;
			},
			
			setItemBoxSize = function(boxSize) {
				var place, elm;
				if (!boxSize.height) {
					place = (list ? cwd.find('tbody') : cwd);
					elm = place.find(list? 'tr:first' : '[id]:first');
					boxSize.height = elm.outerHeight(true);
					if (!list) {
						boxSize.width = elm.outerWidth(true);
					}
				}
			},

			bottomMarkerShow = function(cur, cnt) {
				var place = cur || (list ? cwd.find('tbody') : cwd),
					boxSize = itemBoxSize[fm.viewType],
					col = 1,
					row;

				if (buffer.length > 0) {
					if (!bufferExt.hpi) {
						setItemBoxSize(boxSize);
						if (! list) {
							col = Math.floor(place.width() / boxSize.width);
							bufferExt.row = boxSize.height;
							bufferExt.hpi = bufferExt.row / col;
						} else {
							bufferExt.row = bufferExt.hpi = boxSize.height;
						}
					} else if (!list) {
						col = Math.floor(place.width() / boxSize.width);
					}
					row = Math.ceil((buffer.length + (cnt || 0)) / col);
					if (list && tableHeader) {
						++row;
					}
					bottomMarker.css({top: (bufferExt.row * row) + 'px'}).show();
				}
			},
			
			wrapperContextMenu = {
				contextmenu : function(e) {
					e.preventDefault();
					if (cwd.data('longtap') !== void(0)) {
						e.stopPropagation();
						return;
					}
					fm.trigger('contextmenu', {
						'type'    : 'cwd',
						'targets' : [fm.cwd().hash],
						'x'       : e.pageX,
						'y'       : e.pageY
					});
				},
				touchstart : function(e) {
					if (e.originalEvent.touches.length > 1) {
						return;
					}
					if (cwd.data('longtap') !== false) {
						wrapper.data('touching', {x: e.originalEvent.touches[0].pageX, y: e.originalEvent.touches[0].pageY});
						cwd.data('tmlongtap', setTimeout(function(){
							// long tap
							cwd.data('longtap', true);
							fm.trigger('contextmenu', {
								'type'    : 'cwd',
								'targets' : [fm.cwd().hash],
								'x'       : wrapper.data('touching').x,
								'y'       : wrapper.data('touching').y
							});
						}, 500));
					}
					cwd.data('longtap', null);
				},
				touchend : function(e) {
					if (e.type === 'touchmove') {
						if (! wrapper.data('touching') ||
								( Math.abs(wrapper.data('touching').x - e.originalEvent.touches[0].pageX)
								+ Math.abs(wrapper.data('touching').y - e.originalEvent.touches[0].pageY)) > 4) {
							wrapper.data('touching', null);
						}
					} else {
						setTimeout(function() {
							cwd.removeData('longtap');
						}, 80);
					}
					clearTimeout(cwd.data('tmlongtap'));
				},
				click : function(e) {
					if (cwd.data('longtap')) {
						e.preventDefault();
						e.stopPropagation();
					}
				}
			},
			
			/**
			 * Update directory content
			 *
			 * @return void
			 */
			content = function() {
				fm.lazy(function() {
					var phash, emptyMethod, thtr;

					wz.append(selectAllCheckbox).removeClass('elfinder-cwd-wrapper-empty elfinder-search-result elfinder-incsearch-result elfinder-letsearch-result');
					if (fm.searchStatus.state > 1 || fm.searchStatus.ininc) {
						wz.addClass('elfinder-search-result' + (fm.searchStatus.ininc? ' elfinder-'+(query.substr(0,1) === '/' ? 'let':'inc')+'search-result' : ''));
					}
					
					// abort attachThumbJob
					bufferExt.attachThumbJob && bufferExt.attachThumbJob._abort();
					
					// destroy selectable for GC
					cwd.data('selectable') && cwd.selectable('disable').selectable('destroy').removeData('selectable');
					
					// notify cwd init
					fm.trigger('cwdinit');
					
					selectedNext = jQuery();
					try {
						// to avoid problem with draggable
						cwd.empty();
					} catch (e) {
						cwd.html('');
					}
					
					if (tableHeader) {
						wrapper.off('scroll.fixheader resize.fixheader');
						tableHeader.remove();
						tableHeader = null;
					}

					cwd.removeClass('elfinder-cwd-view-icons elfinder-cwd-view-list')
						.addClass('elfinder-cwd-view-'+(list ? 'list' :'icons'))
						.attr('style', '')
						.css('height', 'auto');
					bottomMarker.hide();

					wrapper[list ? 'addClass' : 'removeClass']('elfinder-cwd-wrapper-list')._padding = parseInt(wrapper.css('padding-top')) + parseInt(wrapper.css('padding-bottom'));
					if (fm.UA.iOS) {
						wrapper.removeClass('overflow-scrolling-touch').addClass('overflow-scrolling-touch');
					}

					if (list) {
						cwd.html('<table><thead></thead><tbody></tbody></table>');
						thtr = jQuery('<tr class="ui-state-default"><td class="elfinder-cwd-view-th-name">'+fm.getColumnName('name')+'</td>'+customColsNameBuild()+'</tr>');
						cwd.find('thead').hide().append(thtr).find('td:first').append(selectAllCheckbox);
						if (jQuery.fn.sortable) {
							thtr.addClass('touch-punch touch-punch-keep-default')
								.sortable({
								axis: 'x',
								distance: 8,
								items: '> .sortable-item',
								start: function(e, ui) {
									jQuery(ui.item[0]).data('dragging', true);
									ui.placeholder
										.width(ui.helper.removeClass('ui-state-hover').width())
										.removeClass('ui-state-active')
										.addClass('ui-state-hover')
										.css('visibility', 'visible');
								},
								update: function(e, ui){
									var target = jQuery(ui.item[0]).attr('class').split(' ')[0].replace('elfinder-cwd-view-th-', ''),
										prev, done;
									customCols = jQuery.map(jQuery(this).children(), function(n) {
										var name = jQuery(n).attr('class').split(' ')[0].replace('elfinder-cwd-view-th-', '');
										if (! done) {
											if (target === name) {
												done = true;
											} else {
												prev = name;
											}
										}
										return (name === 'name')? null : name;
									});
									templates.row = makeTemplateRow();
									fm.storage('cwdCols', customCols);
									prev = '.elfinder-col-'+prev+':first';
									target = '.elfinder-col-'+target+':first';
									fm.lazy(function() {
										cwd.find('tbody tr').each(function() {
											var $this = jQuery(this);
											$this.children(prev).after($this.children(target));
										});
									});
								},
								stop: function(e, ui) {
									setTimeout(function() {
										jQuery(ui.item[0]).removeData('dragging');
									}, 100);
								}
							});
						}

						thtr.find('td').addClass('touch-punch').resizable({
							handles: fm.direction === 'ltr'? 'e' : 'w',
							start: function(e, ui) {
								var target = cwd.find('td.elfinder-col-'
									+ ui.element.attr('class').split(' ')[0].replace('elfinder-cwd-view-th-', '')
									+ ':first');
								
								ui.element
									.data('dragging', true)
									.data('resizeTarget', target)
									.data('targetWidth', target.width());
								colResizing = true;
								if (cwd.find('table').css('table-layout') !== 'fixed') {
									cwd.find('tbody tr:first td').each(function() {
										jQuery(this).width(jQuery(this).width());
									});
									cwd.find('table').css('table-layout', 'fixed');
								}
							},
							resize: function(e, ui) {
								ui.element.data('resizeTarget').width(ui.element.data('targetWidth') - (ui.originalSize.width - ui.size.width));
							},
							stop : function(e, ui) {
								colResizing = false;
								fixTableHeader({fitWidth: true});
								colWidth = {};
								cwd.find('tbody tr:first td').each(function() {
									var name = jQuery(this).attr('class').split(' ')[0].replace('elfinder-col-', '');
									colWidth[name] = jQuery(this).width();
								});
								fm.storage('cwdColWidth', colWidth);
								setTimeout(function() {
									ui.element.removeData('dragging');
								}, 100);
							}
						})
						.find('.ui-resizable-handle').addClass('ui-icon ui-icon-grip-dotted-vertical');
					}

					buffer = jQuery.map(incHashes || cwdHashes, function(hash) { return fm.file(hash) || null; });
					
					buffer = fm.sortFiles(buffer);
					
					if (incHashes) {
						incHashes = jQuery.map(buffer, function(f) { return f.hash; });
					} else {
						cwdHashes = jQuery.map(buffer, function(f) { return f.hash; });
					}
					
					bufferExt = {
						renderd: 0,
						attachTmbs: {},
						getTmbs: [],
						tmbLoading: {},
						lazyOpts: { tm : 0 }
					};
					
					wz[(buffer.length < 1) ? 'addClass' : 'removeClass']('elfinder-cwd-wrapper-empty');
					wrapper.off(scrollEvent, render).on(scrollEvent, render).trigger(scrollEvent);
					
					// set droppable
					if (!fm.cwd().write) {
						wrapper.removeClass('native-droppable')
						       .droppable('disable')
						       .removeClass('ui-state-disabled'); // for old jQueryUI see https://bugs.jqueryui.com/ticket/5974
					} else {
						wrapper[fm.isCommandEnabled('upload')? 'addClass' : 'removeClass']('native-droppable');
						wrapper.droppable(fm.isCommandEnabled('paste')? 'enable' : 'disable');
					}
				});
			},
			
			/**
			 * CWD node itself
			 *
			 * @type JQuery
			 **/
			cwd = jQuery(this)
				.addClass('ui-helper-clearfix elfinder-cwd')
				.attr('unselectable', 'on')
				// fix ui.selectable bugs and add shift+click support 
				.on('click.'+fm.namespace, fileSelector, function(e) {
					var p    = this.id ? jQuery(this) : jQuery(this).parents('[id]:first'),
						tgt  = jQuery(e.target),
						prev,
						next,
						pl,
						nl,
						sib;

					if (selectCheckbox && (tgt.is('input:checkbox.'+clSelChk) || tgt.hasClass('elfinder-cwd-select'))) {
						e.stopPropagation();
						e.preventDefault();
						p.trigger(p.hasClass(clSelected) ? evtUnselect : evtSelect);
						trigger();
						requestAnimationFrame(function() {
							tgt.prop('checked', p.hasClass(clSelected));
						});
						return;
					}

					if (cwd.data('longtap') || tgt.hasClass('elfinder-cwd-nonselect')) {
						e.stopPropagation();
						return;
					}

					if (!curClickId) {
						curClickId = p.attr('id');
						setTimeout(function() {
							curClickId = '';
						}, 500);
					}
					
					if (e.shiftKey) {
						prev = p.prevAll(lastSelect || '.'+clSelected+':first');
						next = p.nextAll(lastSelect || '.'+clSelected+':first');
						pl   = prev.length;
						nl   = next.length;
					}
					if (e.shiftKey && (pl || nl)) {
						sib = pl ? p.prevUntil('#'+prev.attr('id')) : p.nextUntil('#'+next.attr('id'));
						sib = sib.add(p);
						if (!pl) {
							sib  = jQuery(sib.get().reverse());
						}
						sib.trigger(evtSelect);
					} else if (e.ctrlKey || e.metaKey) {
						p.trigger(p.hasClass(clSelected) ? evtUnselect : evtSelect);
					} else {
						if (wrapper.data('touching') && p.hasClass(clSelected)) {
							wrapper.data('touching', null);
							fm.dblclick({file : fm.cwdId2Hash(this.id)});
							return;
						} else {
							unselectAll({ notrigger: true });
							p.trigger(evtSelect);
						}
					}

					trigger();
				})
				// call fm.open()
				.on('dblclick.'+fm.namespace, fileSelector, function(e) {
					if (curClickId) {
						var hash = fm.cwdId2Hash(curClickId);
						e.stopPropagation();
						if (this.id !== curClickId) {
							jQuery(this).trigger(evtUnselect);
							jQuery('#'+curClickId).trigger(evtSelect);
							trigger();
						}
						fm.dblclick({file : hash});
					}
				})
				// for touch device
				.on('touchstart.'+fm.namespace, fileSelector, function(e) {
					if (e.originalEvent.touches.length > 1) {
						return;
					}
					var p   = this.id ? jQuery(this) : jQuery(this).parents('[id]:first'),
						tgt = jQuery(e.target),
						nodeName = e.target.nodeName,
						sel;
					
					if ((nodeName === 'INPUT' && e.target.type === 'text') || nodeName === 'TEXTAREA' || tgt.hasClass('elfinder-cwd-nonselect')) {
						e.stopPropagation();
						return;
					}
					
					// now name editing
					if (p.find('input:text,textarea').length) {
						e.stopPropagation();
						e.preventDefault();
						return;
					}
					
					wrapper.data('touching', {x: e.originalEvent.touches[0].pageX, y: e.originalEvent.touches[0].pageY});
					if (selectCheckbox && (tgt.is('input:checkbox.'+clSelChk) || tgt.hasClass('elfinder-cwd-select'))) {
						return;
					}
					
					sel = p.prevAll('.'+clSelected+':first').length +
					      p.nextAll('.'+clSelected+':first').length;
					cwd.data('longtap', null);
					if (Object.keys(selectedFiles).length
						||
						(list && e.target.nodeName !== 'TD')
						||
						(!list && this !== e.target)
					) {
						cwd.data('longtap', false);
						p.addClass(clHover);
						p.data('tmlongtap', setTimeout(function(){
							// long tap
							cwd.data('longtap', true);
							p.trigger(evtSelect);
							trigger();
							fm.trigger('contextmenu', {
								'type'    : 'files',
								'targets' : fm.selected(),
								'x'       : e.originalEvent.touches[0].pageX,
								'y'       : e.originalEvent.touches[0].pageY
							});
						}, 500));
					}
				})
				.on('touchmove.'+fm.namespace+' touchend.'+fm.namespace, fileSelector, function(e) {
					var tgt = jQuery(e.target),
						p;
					if (selectCheckbox && (tgt.is('input:checkbox.'+clSelChk) || tgt.hasClass('elfinder-cwd-select'))) {
						return;
					}
					if (e.target.nodeName == 'INPUT' || e.target.nodeName == 'TEXTAREA') {
						e.stopPropagation();
						return;
					}
					p = this.id ? jQuery(this) : jQuery(this).parents('[id]:first');
					clearTimeout(p.data('tmlongtap'));
					if (e.type === 'touchmove') {
						wrapper.data('touching', null);
						p.removeClass(clHover);
					} else {
						if (wrapper.data('touching') && !cwd.data('longtap') && p.hasClass(clSelected)) {
							e.preventDefault();
							wrapper.data('touching', null);
							fm.dblclick({file : fm.cwdId2Hash(this.id)});
						}
						setTimeout(function() {
							cwd.removeData('longtap');
						}, 80);
					}
				})
				// attach draggable
				.on('mouseenter.'+fm.namespace, fileSelector, function(e) {
					if (scrolling) { return; }
					var $this = jQuery(this), helper = null;

					if (!mobile && !$this.data('dragRegisted') && !$this.hasClass(clTmp) && !$this.hasClass(clDraggable) && !$this.hasClass(clDisabled)) {
						$this.data('dragRegisted', true);
						if (!fm.isCommandEnabled('copy', fm.searchStatus.state > 1 || $this.hasClass('isroot')? fm.cwdId2Hash($this.attr('id')) : void 0) &&
							!fm.isCommandEnabled('cut', fm.searchStatus.state > 1 || $this.hasClass('isroot')? fm.cwdId2Hash($this.attr('id')) : void 0)) {
							return;
						}
						$this.on('mousedown', function(e) {
							// shiftKey or altKey + drag start for HTML5 native drag function
							// Note: can no use shiftKey with the Google Chrome 
							var metaKey = options.metakeyDragout && !fm.UA.IE && (e.shiftKey || e.altKey),
								disable = false;
							if (metaKey && cwd.data('selectable')) {
								// destroy jQuery-ui selectable while trigger native drag
								cwd.selectable('disable').selectable('destroy').removeData('selectable');
								requestAnimationFrame(function(){
									cwd.selectable(selectableOption).selectable('option', {disabled: false}).selectable('refresh').data('selectable', true);
								});
							}
							$this.removeClass('ui-state-disabled');
							if (metaKey) {
								$this.draggable('option', 'disabled', true).attr('draggable', 'true');
							} else {
								if (!$this.hasClass(clSelected)) {
									if (list) {
										disable = jQuery(e.target).closest('span,tr').is('tr');
									} else {
										disable = jQuery(e.target).hasClass('elfinder-cwd-file');
									}
								}
								if (disable) {
									// removeClass('ui-state-disabled') for old version of jQueryUI
									$this.draggable('option', 'disabled', true).removeClass('ui-state-disabled');
								} else {
									$this.draggable('option', 'disabled', false)
										  .removeAttr('draggable')
									      .draggable('option', 'cursorAt', {left: 50 - parseInt(jQuery(e.currentTarget).css('margin-left')), top: 47});
								}
							}
						})
						.on('dragstart', function(e) {
							var dt = e.dataTransfer || e.originalEvent.dataTransfer || null;
							helper = null;
							if (dt && !fm.UA.IE) {
								var p = this.id ? jQuery(this) : jQuery(this).parents('[id]:first'),
									elm   = jQuery('<span>'),
									url   = '',
									durl  = null,
									murl  = null,
									files = [],
									icon  = function(f) {
										var mime = f.mime, i, tmb = fm.tmb(f);
										i = '<div class="elfinder-cwd-icon elfinder-cwd-icon-drag '+fm.mime2class(mime)+' ui-corner-all"></div>';
										if (tmb) {
											i = jQuery(i).addClass(tmb.className).css('background-image', "url('"+tmb.url+"')").get(0).outerHTML;
										}
										return i;
									}, l, geturl = [];
								p.trigger(evtSelect);
								trigger();
								jQuery.each(selectedFiles, function(v){
									var file = fm.file(v),
										furl = file.url;
									if (file && file.mime !== 'directory') {
										if (!furl) {
											furl = fm.url(file.hash);
										} else if (furl == '1') {
											geturl.push(v);
											return true;
										}
										if (furl) {
											furl = fm.convAbsUrl(furl);
											files.push(v);
											jQuery('<a>').attr('href', furl).text(furl).appendTo(elm);
											url += furl + "\n";
											if (!durl) {
												durl = file.mime + ':' + file.name + ':' + furl;
											}
											if (!murl) {
												murl = furl + "\n" + file.name;
											}
										}
									}
								});
								if (geturl.length) {
									jQuery.each(geturl, function(i, v){
										var rfile = fm.file(v);
										rfile.url = '';
										fm.request({
											data : {cmd : 'url', target : v},
											notify : {type : 'url', cnt : 1},
											preventDefault : true
										})
										.always(function(data) {
											rfile.url = data.url? data.url : '1';
										});
									});
									return false;
								} else if (url) {
									if (dt.setDragImage) {
										helper = jQuery('<div class="elfinder-drag-helper html5-native"></div>').append(icon(fm.file(files[0]))).appendTo(jQuery(document.body));
										if ((l = files.length) > 1) {
											helper.append(icon(fm.file(files[l-1])) + '<span class="elfinder-drag-num">'+l+'</span>');
										}
										dt.setDragImage(helper.get(0), 50, 47);
									}
									dt.effectAllowed = 'copyLink';
									dt.setData('DownloadURL', durl);
									dt.setData('text/x-moz-url', murl);
									dt.setData('text/uri-list', url);
									dt.setData('text/plain', url);
									dt.setData('text/html', elm.html());
									dt.setData('elfinderfrom', window.location.href + fm.cwd().hash);
									dt.setData('elfinderfrom:' + dt.getData('elfinderfrom'), '');
								} else {
									return false;
								}
							}
						})
						.on('dragend', function(e){
							unselectAll({ notrigger: true });
							helper && helper.remove();
						})
						.draggable(fm.draggable);
					}
				})
				// add hover class to selected file
				.on(evtSelect, fileSelector, function(e) {
					var $this = jQuery(this),
						id    = fm.cwdId2Hash($this.attr('id'));
					
					if (!selectLock && !$this.hasClass(clDisabled)) {
						lastSelect = '#'+ this.id;
						$this.addClass(clSelected).children().addClass(clHover).find('input:checkbox.'+clSelChk).prop('checked', true);
						if (! selectedFiles[id]) {
							selectedFiles[id] = true;
						}
						// will be selected next
						selectedNext = cwd.find('[id].'+clSelected+':last').next();
					}
				})
				// remove hover class from unselected file
				.on(evtUnselect, fileSelector, function(e) {
					var $this = jQuery(this), 
						id    = fm.cwdId2Hash($this.attr('id'));
					
					if (!selectLock) {
						$this.removeClass(clSelected).children().removeClass(clHover).find('input:checkbox.'+clSelChk).prop('checked', false);
						if (cwd.hasClass('elfinder-cwd-allselected')) {
							selectCheckbox && selectAllCheckbox.children('input').prop('checked', false);
							cwd.removeClass('elfinder-cwd-allselected');
						}
						selectedFiles[id] && delete selectedFiles[id];
					}
					
				})
				// disable files wich removing or moving
				.on(evtDisable, fileSelector, function() {
					var $this  = jQuery(this).removeClass(clHover+' '+clSelected).addClass(clDisabled), 
						child  = $this.children(),
						target = (list ? $this : child.find('div.elfinder-cwd-file-wrapper,div.elfinder-cwd-filename'));
					
					child.removeClass(clHover+' '+clSelected);
					
					$this.hasClass(clDroppable) && $this.droppable('disable');
					target.hasClass(clDraggable) && target.draggable('disable');
				})
				// if any files was not removed/moved - unlock its
				.on(evtEnable, fileSelector, function() {
					var $this  = jQuery(this).removeClass(clDisabled), 
						target = list ? $this : $this.children('div.elfinder-cwd-file-wrapper,div.elfinder-cwd-filename');
					
					$this.hasClass(clDroppable) && $this.droppable('enable');	
					target.hasClass(clDraggable) && target.draggable('enable');
				})
				.on('scrolltoview', fileSelector, function(e, data) {
					scrollToView(jQuery(this), (data && typeof data.blink !== 'undefined')? data.blink : true);
				})
				.on('mouseenter.'+fm.namespace+' mouseleave.'+fm.namespace, fileSelector, function(e) {
					var enter = (e.type === 'mouseenter');
					if (enter && (scrolling || fm.UA.Mobile)) { return; }
					fm.trigger('hover', {hash : fm.cwdId2Hash(jQuery(this).attr('id')), type : e.type});
					jQuery(this).toggleClass(clHover, (e.type == 'mouseenter'));
				})
				// for file contextmenu
				.on('mouseenter.'+fm.namespace+' mouseleave.'+fm.namespace, '.elfinder-cwd-file-wrapper,.elfinder-cwd-filename', function(e) {
					var enter = (e.type === 'mouseenter');
					if (enter && scrolling) { return; }
					jQuery(this).closest(fileSelector).children('.elfinder-cwd-file-wrapper,.elfinder-cwd-filename').toggleClass(clActive, (e.type == 'mouseenter'));
				})
				.on('contextmenu.'+fm.namespace, function(e) {
					var file = jQuery(e.target).closest(fileSelector);
					
					if (file.get(0) === e.target && !selectedFiles[fm.cwdId2Hash(file.get(0).id)]) {
						return;
					}

					// now filename editing
					if (file.find('input:text,textarea').length) {
						e.stopPropagation();
						return;
					}
					
					if (file.length && (e.target.nodeName != 'TD' || selectedFiles[fm.cwdId2Hash(file.get(0).id)])) {
						e.stopPropagation();
						e.preventDefault();
						if (!file.hasClass(clDisabled) && !wrapper.data('touching')) {
							if (!file.hasClass(clSelected)) {
								unselectAll({ notrigger: true });
								file.trigger(evtSelect);
								trigger();
							}
							fm.trigger('contextmenu', {
								'type'    : 'files',
								'targets' : fm.selected(),
								'x'       : e.pageX,
								'y'       : e.pageY
							});

						}
						
					}
				})
				// unselect all on cwd click
				.on('click.'+fm.namespace, function(e) {
					if (e.target === this && ! cwd.data('longtap')) {
						!e.shiftKey && !e.ctrlKey && !e.metaKey && unselectAll();
					}
				})
				// prepend fake file/dir
				.on('create.'+fm.namespace, function(e, f) {
					var parent = list ? cwd.find('tbody') : cwd,
						p = parent.find('.elfinder-cwd-parent'),
						lock = f.move || false,
						file = jQuery(itemhtml(f)).addClass(clTmp),
						selected = fm.selected();
						
					if (selected.length) {
						lock && fm.trigger('lockfiles', {files: selected});
					} else {
						unselectAll();
					}

					if (p.length) {
						p.after(file);
					} else {
						parent.prepend(file);
					}
					
					setColwidth();
					wrapper.scrollTop(0).scrollLeft(0);
				})
				// unselect all selected files
				.on('unselectall', unselectAll)
				.on('selectfile', function(e, id) {
					fm.cwdHash2Elm(id).trigger(evtSelect);
					trigger();
				})
				.on('colwidth', function() {
					if (list) {
						cwd.find('table').css('table-layout', '')
							.find('td').css('width', '');
						fixTableHeader({fitWidth: true});
						fm.storage('cwdColWidth', colWidth = null);
					}
				})
				.on('iconpref', function(e, data) {
					cwd.removeClass(function(i, cName) {
						return (cName.match(/\belfinder-cwd-size\S+/g) || []).join(' ');
					});
					iconSize = data? (parseInt(data.size) || 0) : 0;
					if (!list) {
						if (iconSize > 0) {
							cwd.addClass('elfinder-cwd-size' + iconSize);
						}
						if (bufferExt.renderd) {
							requestAnimationFrame(function() {
								itemBoxSize.icons = {};
								bufferExt.hpi = null;
								bottomMarkerShow(cwd, bufferExt.renderd);
								wrapperRepaint();
							});
						}
					}
				})
				// Change icon size with mouse wheel event
				.on('onwheel' in document ? 'wheel' : 'mousewheel', function(e) {
					var tm, size, delta;
					if (!list && ((e.ctrlKey && !e.metaKey) || (!e.ctrlKey && e.metaKey))) {
						e.stopPropagation();
						e.preventDefault();
						tm = cwd.data('wheelTm');
						if (typeof tm !== 'undefined') {
							clearTimeout(tm);
							cwd.data('wheelTm', setTimeout(function() {
								cwd.removeData('wheelTm');
							}, 200));
						} else {
							cwd.data('wheelTm', false);
							size = iconSize || 0;
							delta = e.originalEvent.deltaY ? e.originalEvent.deltaY : -(e.originalEvent.wheelDelta);
							if (delta > 0) {
								if (iconSize > 0) {
									size = iconSize - 1;
								}
							} else {
								if (iconSize < options.iconsView.sizeMax) {
									size = iconSize + 1;
								}
							}
							if (size !== iconSize) {
								fm.storage('iconsize', size);
								cwd.trigger('iconpref', {size: size});
							}
						}
					}
				}),
			wrapper = jQuery('<div class="elfinder-cwd-wrapper"></div>')
				// make cwd itself droppable for folders from nav panel
				.droppable(Object.assign({}, droppable, {autoDisable: false}))
				.on('contextmenu.'+fm.namespace, wrapperContextMenu.contextmenu)
				.on('touchstart.'+fm.namespace, wrapperContextMenu.touchstart)
				.on('touchmove.'+fm.namespace+' touchend.'+fm.namespace, wrapperContextMenu.touchend)
				.on('click.'+fm.namespace, wrapperContextMenu.click)
				.on('scroll.'+fm.namespace, function() {
					if (! scrolling) {
						cwd.data('selectable') && cwd.selectable('disable');
						wrapper.trigger(scrollStartEvent);
					}
					scrolling = true;
					bufferExt.scrtm && cancelAnimationFrame(bufferExt.scrtm);
					if (bufferExt.scrtm && Math.abs((bufferExt.scrolltop || 0) - (bufferExt.scrolltop = (this.scrollTop || jQuery(this).scrollTop()))) < 5) {
						bufferExt.scrtm = 0;
						wrapper.trigger(scrollEvent);
					}
					bufferExt.scrtm = requestAnimationFrame(function() {
						bufferExt.scrtm = 0;
						wrapper.trigger(scrollEvent);
					});
				})
				.on(scrollEvent, function() {
					scrolling = false;
					wrapperRepaint();
				}),
			
			bottomMarker = jQuery('<div>&nbsp;</div>')
				.css({position: 'absolute', width: '1px', height: '1px'})
				.hide(),
			
			selectAllCheckbox = selectCheckbox? jQuery('<div class="elfinder-cwd-selectall"><input type="checkbox"/></div>')
				.attr('title', fm.i18n('selectall'))
				.on('click', function(e) {
					e.stopPropagation();
					e.preventDefault();
					if (jQuery(this).data('pending')) {
						return false;
					}
					selectAllCheckbox.data('pending', true);
					if (cwd.hasClass('elfinder-cwd-allselected')) {
						selectAllCheckbox.find('input').prop('checked', false);
						requestAnimationFrame(function() {
							unselectAll();
						});
					} else {
						selectAll();
					}
				}) : jQuery(),
			
			restm = null,
			resize = function(init) {
				var initHeight = function() {
					if (typeof bufferExt.renderd !== 'undefined') {
						var h = 0;
						wrapper.siblings('div.elfinder-panel:visible').each(function() {
							h += jQuery(this).outerHeight(true);
						});
						wrapper.height(wz.height() - h - wrapper._padding);
					}
				};
				
				init && initHeight();
				
				restm && cancelAnimationFrame(restm);
				restm = requestAnimationFrame(function(){
					!init && initHeight();
					var wph, cwdoh;
					// fix cwd height if it less then wrapper
					cwd.css('height', 'auto');
					wph = wrapper[0].clientHeight - parseInt(wrapper.css('padding-top')) - parseInt(wrapper.css('padding-bottom')) - parseInt(cwd.css('margin-top')),
					cwdoh = cwd.outerHeight(true);
					if (cwdoh < wph) {
						cwd.height(wph);
					}
				});
				
				list && ! colResizing && (init? wrapper.trigger('resize.fixheader') : fixTableHeader());
				
				wrapperRepaint();
			},
			
			// elfinder node
			parent = jQuery(this).parent().on('resize', resize),
			
			// workzone node 
			wz = parent.children('.elfinder-workzone').append(wrapper.append(this).append(bottomMarker)),
			
			// message board
			mBoard = jQuery('<div class="elfinder-cwd-message-board"></div>').insertAfter(cwd),

			// Volume expires
			vExpires = jQuery('<div class="elfinder-cwd-expires" ></div>'),

			vExpiresTm,

			showVolumeExpires = function() {
				var remain, sec, int;
				vExpiresTm && clearTimeout(vExpiresTm);
				if (curVolId && fm.volumeExpires[curVolId]) {
					sec = fm.volumeExpires[curVolId] - ((+new Date()) / 1000);
					int = (sec % 60) + 0.1;
					remain = Math.floor(sec / 60);
					vExpires.html(fm.i18n(['minsLeft', remain])).show();
					if (remain) {
						vExpiresTm = setTimeout(showVolumeExpires, int * 1000);
					}
				}
			},

			// each item box size
			itemBoxSize = {
				icons : {},
				list : {}
			},

			// has UI tree
			hasUiTree,

			// Icon size of icons view
			iconSize,

			// Current volume id
			curVolId,
			
			winScrTm;

		// IE < 11 not support CSS `pointer-events: none`
		if (!fm.UA.ltIE10) {
			mBoard.append(jQuery('<div class="elfinder-cwd-trash" ></div>').html(fm.i18n('volume_Trash')))
			      .append(vExpires);
		}

		// setup by options
		replacement = Object.assign(replacement, options.replacement || {});
		
		try {
			colWidth = fm.storage('cwdColWidth')? fm.storage('cwdColWidth') : null;
		} catch(e) {
			colWidth = null;
		}
		
		// setup costomCols
		fm.bind('columnpref', function(e) {
			var opts = e.data || {};
			if (customCols = fm.storage('cwdCols')) {
				customCols = jQuery.grep(customCols, function(n) {
					return (options.listView.columns.indexOf(n) !== -1)? true : false;
				});
				if (options.listView.columns.length > customCols.length) {
					jQuery.each(options.listView.columns, function(i, n) {
						if (customCols.indexOf(n) === -1) {
							customCols.push(n);
						}
					});
				}
			} else {
				customCols = options.listView.columns;
			}
			// column names array that hidden
			var columnhides = fm.storage('columnhides') || null;
			if (columnhides && Object.keys(columnhides).length)
			customCols = jQuery.grep(customCols, function(n) {
				return columnhides[n]? false : true;
			});
			// make template with customCols
			templates.row = makeTemplateRow();
			// repaint if need it
			list && opts.repaint && content();
		}).trigger('columnpref');

		if (mobile) {
			// for iOS5 bug
			jQuery('body').on('touchstart touchmove touchend', function(e){});
		}
		
		selectCheckbox && cwd.addClass('elfinder-has-checkbox');
		
		jQuery(window).on('scroll.'+fm.namespace, function() {
			winScrTm && cancelAnimationFrame(winScrTm);
			winScrTm = requestAnimationFrame(function() {
				wrapper.trigger(scrollEvent);
			});
		});
		
		jQuery(document).on('keydown.'+fm.namespace, function(e) {
			if (e.keyCode == jQuery.ui.keyCode.ESCAPE) {
				if (! fm.getUI().find('.ui-widget:visible').length) {
					unselectAll();
				}
			}
		});
		
		fm
			.one('init', function(){
				var style = document.createElement('style'),
				sheet, node, base, resizeTm, iconSize, i = 0;
				if (document.head) {
					document.head.appendChild(style);
					sheet = style.sheet;
					sheet.insertRule('.elfinder-cwd-wrapper-empty .elfinder-cwd:not(.elfinder-table-header-sticky):after{ content:"'+fm.i18n('emptyFolder')+'" }', i++);
					sheet.insertRule('.elfinder-cwd-wrapper-empty .native-droppable .elfinder-cwd:not(.elfinder-table-header-sticky):after{ content:"'+fm.i18n('emptyFolder'+(mobile? 'LTap' : 'Drop'))+'" }', i++);
					sheet.insertRule('.elfinder-cwd-wrapper-empty .ui-droppable-disabled .elfinder-cwd:not(.elfinder-table-header-sticky):after{ content:"'+fm.i18n('emptyFolder')+'" }', i++);
					sheet.insertRule('.elfinder-cwd-wrapper-empty.elfinder-search-result .elfinder-cwd:not(.elfinder-table-header-sticky):after{ content:"'+fm.i18n('emptySearch')+'" }', i++);
					sheet.insertRule('.elfinder-cwd-wrapper-empty.elfinder-search-result.elfinder-incsearch-result .elfinder-cwd:not(.elfinder-table-header-sticky):after{ content:"'+fm.i18n('emptyIncSearch')+'" }', i++);
					sheet.insertRule('.elfinder-cwd-wrapper-empty.elfinder-search-result.elfinder-letsearch-result .elfinder-cwd:not(.elfinder-table-header-sticky):after{ content:"'+fm.i18n('emptyLetSearch')+'" }', i++);
				}
				if (iconSize = (fm.storage('iconsize') || options.iconsView.size || 0)) {
					iconSize = Math.min(iconSize, options.iconsView.sizeMax);
					cwd.trigger('iconpref', {size: iconSize});
				}
				if (! mobile) {
					fm.one('open', function() {
						sheet && fm.zIndex && sheet.insertRule('.ui-selectable-helper{z-index:'+fm.zIndex+';}', i++);
					});
					base = jQuery('<div style="position:absolute"></div>');
					node = fm.getUI();
					node.on('resize', function(e, data) {
						var offset;
						e.preventDefault();
						e.stopPropagation();
						if (data && data.fullscreen) {
							offset = node.offset();
							if (data.fullscreen === 'on') {
								base.css({top:offset.top * -1 , left:offset.left * -1 }).appendTo(node);
								selectableOption.appendTo = base;
							} else {
								base.detach();
								selectableOption.appendTo = 'body';
							}
							cwd.data('selectable') && cwd.selectable('option', {appendTo : selectableOption.appendTo});
						}
					});
				}
				hasUiTree = fm.getUI('tree').length;
			})
			.bind('enable', function() {
				resize();
			})
			.bind('request.open', function() {
				bufferExt.getTmbs = [];
			})
			.one('open', function() {
				if (fm.maxTargets) {
					tmbNum = Math.min(fm.maxTargets, tmbNum);
				}
			})
			.bind('open add remove searchend', function() {
				var phash = fm.cwd().hash,
					type = this.type;
				if (type === 'open' || type === 'searchend' || fm.searchStatus.state < 2) {
					cwdHashes = jQuery.map(fm.files(phash), function(f) { return f.hash; });
					fm.trigger('cwdhasheschange', cwdHashes);
				}
				if (type === 'open') {
					var inTrash = function() {
							var isIn = false;
							jQuery.each(cwdParents, function(i, h) {
								if (fm.trashes[h]) {
									isIn = true;
									return false;
								}
							});
							return isIn;
						},
						req = phash?
							(! fm.file(phash) || hasUiTree?
								(! hasUiTree?
									fm.request({
										data: {
											cmd    : 'parents',
											target : fm.cwd().hash
										},
										preventFail : true
									}) : (function() {
										var dfd = jQuery.Deferred();
										fm.one('treesync', function(e) {
											e.data.always(function() {
												dfd.resolve();
											});
										});
										return dfd;
									})()
								) : null
							) : null,
						cwdObj = fm.cwd();
					// add/remove volume id class
					if (cwdObj.volumeid !== curVolId) {
						vExpires.empty().hide();
						if (curVolId) {
							wrapper.removeClass('elfinder-cwd-wrapper-' + curVolId);
						}
						curVolId = cwdObj.volumeid;
						showVolumeExpires();
						wrapper.addClass('elfinder-cwd-wrapper-' + curVolId);
					}
					// add/remove trash class
					jQuery.when(req).done(function() {
						cwdParents = fm.parents(cwdObj.hash);
						wrapper[inTrash()? 'addClass':'removeClass']('elfinder-cwd-wrapper-trash');
					});
					incHashes = void 0;
					unselectAll({ notrigger: true });
					content();
				}
			})
			.bind('search', function(e) {
				cwdHashes = jQuery.map(e.data.files, function(f) { return f.hash; });
				fm.trigger('cwdhasheschange', cwdHashes);
				incHashes = void 0;
				fm.searchStatus.ininc = false;
				content();
				fm.autoSync('stop');
			})
			.bind('searchend', function(e) {
				if (query || incHashes) {
					query = '';
					if (incHashes) {
						fm.trigger('incsearchend', e.data);
					} else {
						if (!e.data || !e.data.noupdate) {
							content();
						}
					}
				}
				fm.autoSync();
			})
			.bind('searchstart', function(e) {
				unselectAll();
				query = e.data.query;
			})
			.bind('incsearchstart', function(e) {
				var q = e.data.query || '',
					type =  e.data.type || 'SearchName',
					searchTypes = fm.options.commandsOptions.search.searchTypes || {};

				if ((searchTypes[type] && searchTypes[type].incsearch) || type === 'SearchName') {
					selectedFiles = {};
					fm.lazy(function() {
						// incremental search
						var regex, incSearch, fst = '';
						query = q;
						if (q) {
							if (q.substr(0,1) === '/') {
								q = q.substr(1);
								fst = '^';
							}
							regex = new RegExp(fst + q.replace(/([\\*\;\.\?\[\]\{\}\(\)\^\$\-\|])/g, '\\$1'), 'i');
							if (type === 'SearchName') {
								incHashes = jQuery.grep(cwdHashes, function(hash) {
									var file = fm.file(hash);
									return (file && (file.name.match(regex) || (file.i18 && file.i18.match(regex))))? true : false;
								});
							} else {
								incSearch = searchTypes[type].incsearch;
								if (typeof incSearch === 'string') {
									incHashes = jQuery.grep(cwdHashes, function(hash) {
										var file = fm.file(hash);
										return (file && file[incSearch] && (file[incSearch] + '').match(regex))? true : false;
									});
								} else if (typeof incSearch === 'function') {
									try {
										incHashes = jQuery.grep(incSearch({val: q, regex: regex}, cwdHashes, fm), function(hash) {
											return fm.file(hash)? true : false;
										});
									} catch(e) {
										incHashes = [];
									}
								}
							}
							fm.trigger('incsearch', { hashes: incHashes, query: q })
								.searchStatus.ininc = true;
							content();
							fm.autoSync('stop');
						} else {
							fm.trigger('incsearchend');
						}
					});
				}
			})
			.bind('incsearchend', function(e) {
				query = '';
				fm.searchStatus.ininc = false;
				incHashes = void 0;
				if (!e.data || !e.data.noupdate) {
					content();
				}
				fm.autoSync();
			})
			.bind('sortchange', function() {
				var lastScrollLeft = wrapper.scrollLeft(),
					allsel = cwd.hasClass('elfinder-cwd-allselected');
				
				content();
				fm.one('cwdrender', function() {
					wrapper.scrollLeft(lastScrollLeft);
					if (allsel) {
						selectedFiles = fm.arrayFlip(incHashes || cwdHashes, true);
					}
					(allsel || Object.keys(selectedFiles).length) && trigger();
				});
			})
			.bind('viewchange', function() {
				var l      = fm.viewType != 'list',
					allsel = cwd.hasClass('elfinder-cwd-allselected');
				
				if (l != list) {
					list = l;
					fm.viewType = list? 'list' : 'icons';
					if (iconSize) {
						fm.one('cwdinit', function() {
							cwd.trigger('iconpref', {size: iconSize});
						});
					}
					content();
					resize();

					if (allsel) {
						cwd.addClass('elfinder-cwd-allselected');
						selectAllCheckbox.find('input').prop('checked', true);
					}
					Object.keys(selectedFiles).length && trigger();
				}
			})
			.bind('wzresize', function() {
				var place = list ? cwd.find('tbody') : cwd,
					cwdOffset;
				resize(true);
				if (bufferExt.hpi) {
					bottomMarkerShow(place, place.find('[id]').length);
				}
				
				cwdOffset = cwd.offset();
				wz.data('rectangle', Object.assign(
					{
						width: wz.width(),
						height: wz.height(),
						cwdEdge: (fm.direction === 'ltr')? cwdOffset.left : cwdOffset.left + cwd.width()
					},
					wz.offset())
				);
				
				bufferExt.itemH = (list? place.find('tr:first') : place.find('[id]:first')).outerHeight(true);
			})
			.bind('changeclipboard', function(e) {
				clipCuts = {};
				if (e.data && e.data.clipboard && e.data.clipboard.length) {
					jQuery.each(e.data.clipboard, function(i, f) {
						if (f.cut) {
							clipCuts[f.hash] = true;
						}
					});
				}
			})
			.bind('resMixinMake', function() {
				setColwidth();
			})
			.bind('tmbreload', function(e) {
				var imgs = {},
					files = (e.data && e.data.files)? e.data.files : null;
				
				jQuery.each(files, function(i, f) {
					if (f.tmb && f.tmb != '1') {
						imgs[f.hash] = f.tmb;
					}
				});
				if (Object.keys(imgs).length) {
					attachThumbnails(imgs, true);
				}
			})
			.add(function(e) {
				var regex = query? new RegExp(query.replace(/([\\*\;\.\?\[\]\{\}\(\)\^\$\-\|])/g, '\\$1'), 'i') : null,
					mime  = fm.searchStatus.mime,
					inSearch = fm.searchStatus.state > 1,
					phash = inSearch && fm.searchStatus.target? fm.searchStatus.target : fm.cwd().hash,
					curPath = fm.path(phash),
					inTarget = function(f) {
						var res, parents, path;
						res = (f.phash === phash);
						if (!res && inSearch) {
							path = f.path || fm.path(f.hash);
							res = (curPath && path.indexOf(curPath) === 0);
							if (! res && fm.searchStatus.mixed) {
								res = jQuery.grep(fm.searchStatus.mixed, function(vid) { return f.hash.indexOf(vid) === 0? true : false; }).length? true : false;
							}
						}
						if (res && inSearch) {
							if (mime) {
								res = (f.mime.indexOf(mime) === 0);
							} else {
								res = (f.name.match(regex) || (f.i18 && f.i18.match(regex)))? true : false;
							}
						}
						return res;
					},
					files = jQuery.grep(e.data.added || [], function(f) { return inTarget(f)? true : false ;});
				add(files);
				if (fm.searchStatus.state === 2) {
					jQuery.each(files, function(i, f) {
						if (jQuery.inArray(f.hash, cwdHashes) === -1) {
							cwdHashes.push(f.hash);
						}
					});
					fm.trigger('cwdhasheschange', cwdHashes);
				}
				list && resize();
				wrapper.trigger(scrollEvent);
			})
			.change(function(e) {
				var phash = fm.cwd().hash,
					sel   = fm.selected(),
					files, added;

				if (query) {
					jQuery.each(e.data.changed || [], function(i, file) {
						if (fm.cwdHash2Elm(file.hash).length) {
							remove([file.hash]);
							add([file], 'change');
							jQuery.inArray(file.hash, sel) !== -1 && selectFile(file.hash);
							added = true;
						}
					});
				} else {
					jQuery.each(jQuery.grep(e.data.changed || [], function(f) { return f.phash == phash ? true : false; }), function(i, file) {
						if (fm.cwdHash2Elm(file.hash).length) {
							remove([file.hash]);
							add([file], 'change');
							jQuery.inArray(file.hash, sel) !== -1 && selectFile(file.hash);
							added = true;
						}
					});
				}
				
				if (added) {
					fm.trigger('cwdhasheschange', cwdHashes);
					list && resize();
					wrapper.trigger(scrollEvent);
				}
				
				trigger();
			})
			.remove(function(e) {
				var place = list ? cwd.find('tbody') : cwd;
				remove(e.data.removed || []);
				trigger();
				if (buffer.length < 1 && place.children(fileSelector + (options.oldSchool? ':not(.elfinder-cwd-parent)' : '')).length < 1) {
					wz.addClass('elfinder-cwd-wrapper-empty');
					selectCheckbox && selectAllCheckbox.find('input').prop('checked', false);
					bottomMarker.hide();
					wrapper.off(scrollEvent, render);
					resize();
				} else {
					bottomMarkerShow(place);
					wrapper.trigger(scrollEvent);
				}
			})
			// select dragged file if no selected, disable selectable
			.dragstart(function(e) {
				var target = jQuery(e.data.target),
					oe     = e.data.originalEvent;

				if (target.hasClass(clFile)) {
					
					if (!target.hasClass(clSelected)) {
						!(oe.ctrlKey || oe.metaKey || oe.shiftKey) && unselectAll({ notrigger: true });
						target.trigger(evtSelect);
						trigger();
					}
				}
				
				cwd.removeClass(clDisabled).data('selectable') && cwd.selectable('disable');
				selectLock = true;
			})
			// enable selectable
			.dragstop(function() {
				cwd.data('selectable') && cwd.selectable('enable');
				selectLock = false;
			})
			.bind('lockfiles unlockfiles selectfiles unselectfiles', function(e) {
				var events = {
						lockfiles     : evtDisable ,
						unlockfiles   : evtEnable ,
						selectfiles   : evtSelect,
						unselectfiles : evtUnselect },
					event  = events[e.type],
					files  = e.data.files || [],
					l      = files.length,
					helper = e.data.helper || jQuery(),
					parents, ctr, add;

				if (l > 0) {
					parents = fm.parents(files[0]);
				}
				if (event === evtSelect || event === evtUnselect) {
					add  = (event === evtSelect),
					jQuery.each(files, function(i, hash) {
						var all = cwd.hasClass('elfinder-cwd-allselected');
						if (! selectedFiles[hash]) {
							add && (selectedFiles[hash] = true);
						} else {
							if (all) {
								selectCheckbox && selectAllCheckbox.children('input').prop('checked', false);
								cwd.removeClass('elfinder-cwd-allselected');
								all = false;
							}
							! add && delete selectedFiles[hash];
						}
					});
				}
				if (!helper.data('locked')) {
					while (l--) {
						try {
							fm.cwdHash2Elm(files[l]).trigger(event);
						} catch(e) {}
					}
					! e.data.inselect && trigger();
				}
				if (wrapper.data('dropover') && parents.indexOf(wrapper.data('dropover')) !== -1) {
					ctr = e.type !== 'lockfiles';
					helper.toggleClass('elfinder-drag-helper-plus', ctr);
					wrapper.toggleClass(clDropActive, ctr);
				}
			})
			// select new files after some actions
			.bind('mkdir mkfile duplicate upload rename archive extract paste multiupload', function(e) {
				if (e.type == 'upload' && e.data._multiupload) return;
				var phash = fm.cwd().hash, files;
				
				unselectAll({ notrigger: true });

				jQuery.each((e.data.added || []).concat(e.data.changed || []), function(i, file) { 
					file && file.phash == phash && selectFile(file.hash);
				});
				trigger();
			})
			.shortcut({
				pattern     :'ctrl+a', 
				description : 'selectall',
				callback    : selectAll
			})
			.shortcut({
				pattern     :'ctrl+shift+i', 
				description : 'selectinvert',
				callback    : selectInvert
			})
			.shortcut({
				pattern     : 'left right up down shift+left shift+right shift+up shift+down',
				description : 'selectfiles',
				type        : 'keydown' , //fm.UA.Firefox || fm.UA.Opera ? 'keypress' : 'keydown',
				callback    : function(e) { select(e.keyCode, e.shiftKey); }
			})
			.shortcut({
				pattern     : 'home',
				description : 'selectffile',
				callback    : function(e) { 
					unselectAll({ notrigger: true });
					scrollToView(cwd.find('[id]:first').trigger(evtSelect));
					trigger();
				}
			})
			.shortcut({
				pattern     : 'end',
				description : 'selectlfile',
				callback    : function(e) { 
					unselectAll({ notrigger: true });
					scrollToView(cwd.find('[id]:last').trigger(evtSelect)) ;
					trigger();
				}
			})
			.shortcut({
				pattern     : 'page_up',
				description : 'pageTurning',
				callback    : function(e) {
					if (bufferExt.itemH) {
						wrapper.scrollTop(
							Math.round(
								wrapper.scrollTop()
								- (Math.floor((wrapper.height() + (list? bufferExt.itemH * -1 : 16)) / bufferExt.itemH)) * bufferExt.itemH
							)
						);
					}
				}
			}).shortcut({
				pattern     : 'page_down',
				description : 'pageTurning',
				callback    : function(e) { 
					if (bufferExt.itemH) {
						wrapper.scrollTop(
							Math.round(
								wrapper.scrollTop()
								+ (Math.floor((wrapper.height() + (list? bufferExt.itemH * -1 : 16)) / bufferExt.itemH)) * bufferExt.itemH
							)
						);
					}
				}
			});
		
	});
	
	// fm.timeEnd('cwdLoad')
	
	return this;
};
js/ui/toast.js000064400000005201151215013400007253 0ustar00/**
 * @class  elFinder toast
 * 
 * This was created inspired by the toastr. Thanks to developers of toastr.
 * CodeSeven/toastr: http://johnpapa.net <https://github.com/CodeSeven/toastr>
 *
 * @author Naoki Sawada
 **/
jQuery.fn.elfindertoast = function(opts, fm) {
	"use strict";
	var defOpts = Object.assign({
		mode: 'success', // or 'info', 'warning' and 'error'
		msg: '',
		showMethod: 'fadeIn', //fadeIn, slideDown, and show are built into jQuery
		showDuration: 300,
		showEasing: 'swing', //swing and linear are built into jQuery
		onShown: undefined,
		hideMethod: 'fadeOut',
		hideDuration: 1500,
		hideEasing: 'swing',
		onHidden: undefined,
		timeOut: 3000,
		extNode: undefined,
		button: undefined,
		width: undefined
	}, jQuery.isPlainObject(fm.options.uiOptions.toast.defaults)? fm.options.uiOptions.toast.defaults : {});
	return this.each(function() {
		opts = Object.assign({}, defOpts, opts || {});
		
		var self = jQuery(this),
			show = function(notm) {
				self.stop();
				fm.toFront(self);
				self[opts.showMethod]({
					duration: opts.showDuration,
					easing: opts.showEasing,
					complete: function() {
						opts.onShown && opts.onShown();
						if (!notm && opts.timeOut) {
							rmTm = setTimeout(rm, opts.timeOut);
						}
					}
				});
			},
			rm = function() {
				self[opts.hideMethod]({
					duration: opts.hideDuration,
					easing: opts.hideEasing,
					complete: function() {
						opts.onHidden && opts.onHidden();
						self.remove();
					}
				});
			},
			rmTm;
		
		self.on('click', function(e) {
			e.stopPropagation();
			e.preventDefault();
			rmTm && clearTimeout(rmTm);
			opts.onHidden && opts.onHidden();
			self.stop().remove();
		}).on('mouseenter mouseleave', function(e) {
			if (opts.timeOut) {
				rmTm && clearTimeout(rmTm);
				rmTm = null;
				if (e.type === 'mouseenter') {
					show(true);
				} else {
					rmTm = setTimeout(rm, opts.timeOut);
				}
			}
		}).hide().addClass('toast-' + opts.mode).append(jQuery('<div class="elfinder-toast-msg"></div>').html(opts.msg.replace(/%([a-zA-Z0-9]+)%/g, function(m, m1) {
			return fm.i18n(m1);
		})));
		
		if (opts.extNode) {
			self.append(opts.extNode);
		}

		if (opts.button) {
			self.append(
				jQuery('<button class="ui-button ui-widget ui-state-default ui-corner-all elfinder-tabstop"></button>')
				.append(jQuery('<span class="ui-button-text"></span>').text(fm.i18n(opts.button.text)))
				.on('mouseenter mouseleave', function(e) { 
					jQuery(this).toggleClass('ui-state-hover', e.type == 'mouseenter');
				})
				.on('click', opts.button.click || function(){})
			);
		}

		if (opts.width) {
			self.css('max-width', opts.width);
		}
		
		show();
	});
};js/ui/uploadButton.js000064400000002060151215013400010601 0ustar00/**
 * @class  elFinder toolbar's button tor upload file
 *
 * @author Dmitry (dio) Levashov
 **/
jQuery.fn.elfinderuploadbutton = function(cmd) {
	"use strict";
	return this.each(function() {
		var fm = cmd.fm,
			button = jQuery(this).elfinderbutton(cmd)
				.off('click'), 
			form = jQuery('<form></form>').appendTo(button),
			input = jQuery('<input type="file" multiple="true" title="'+cmd.fm.i18n('selectForUpload')+'"/>')
				.on('change', function() {
					var _input = jQuery(this);
					if (_input.val()) {
						fm.exec('upload', {input : _input.remove()[0]}, void(0), fm.cwd().hash);
						input.clone(true).appendTo(form);
					} 
				})
				.on('dragover', function(e) {
					e.originalEvent.dataTransfer.dropEffect = 'copy';
				}),
			tm;

		form.append(input.clone(true));
				
		cmd.change(function() {
			tm && cancelAnimationFrame(tm);
			tm = requestAnimationFrame(function() {
				var toShow = cmd.disabled();
				if (form.is('visible')) {
					!toShow && form.hide();
				} else {
					toShow && form.show();
				}
			});
		})
		.change();
	});
};
js/ui/path.js000064400000012340151215013400007057 0ustar00/**
 * @class elFinder ui
 * Display current folder path in statusbar.
 * Click on folder name in path - open folder
 *
 * @author Dmitry (dio) Levashov
 **/
jQuery.fn.elfinderpath = function(fm, options) {
	"use strict";
	return this.each(function() {
		var query  = '',
			target = '',
			mimes  = [],
			place  = 'statusbar',
			clHover= fm.res('class', 'hover'),
			prefix = 'path' + (elFinder.prototype.uniqueid? elFinder.prototype.uniqueid : '') + '-',
			wzbase = jQuery('<div class="ui-widget-header ui-helper-clearfix elfinder-workzone-path"></div>'),
			path   = jQuery(this).addClass('elfinder-path').html('&nbsp;')
				.on('mousedown', 'span.elfinder-path-dir', function(e) {
					var hash = jQuery(this).attr('id').substr(prefix.length);
					e.preventDefault();
					if (hash != fm.cwd().hash) {
						jQuery(this).addClass(clHover);
						if (query) {
							fm.exec('search', query, { target: hash, mime: mimes.join(' ') });
						} else {
							fm.trigger('select', {selected : [hash]}).exec('open', hash);
						}
					}
				})
				.prependTo(fm.getUI('statusbar').show()),
			roots = jQuery('<div class="elfinder-path-roots"></div>').on('click', function(e) {
				e.stopPropagation();
				e.preventDefault();
				
				var roots = jQuery.map(fm.roots, function(h) { return fm.file(h); }),
				raw = [];

				jQuery.each(roots, function(i, f) {
					if (! f.phash && fm.root(fm.cwd().hash, true) !== f.hash) {
						raw.push({
							label    : fm.escape(f.i18 || f.name),
							icon     : 'home',
							callback : function() { fm.exec('open', f.hash); },
							options  : {
								iconClass : f.csscls || '',
								iconImg   : f.icon   || ''
							}
						});
					}
				});
				fm.trigger('contextmenu', {
					raw: raw,
					x: e.pageX,
					y: e.pageY
				});
			}).append('<span class="elfinder-button-icon elfinder-button-icon-menu" ></span>').appendTo(wzbase),
			render = function(cwd) {
				var dirs = [],
					names = [];
				jQuery.each(fm.parents(cwd), function(i, hash) {
					var c = (cwd === hash)? 'elfinder-path-dir elfinder-path-cwd' : 'elfinder-path-dir',
						f = fm.file(hash),
						name = fm.escape(f.i18 || f.name);
					names.push(name);
					dirs.push('<span id="'+prefix+hash+'" class="'+c+'" title="'+names.join(fm.option('separator'))+'">'+name+'</span>');
				});
				return dirs.join('<span class="elfinder-path-other">'+fm.option('separator')+'</span>');
			},
			toWorkzone = function() {
				var prev;
				path.children('span.elfinder-path-dir').attr('style', '');
				prev = fm.direction === 'ltr'? jQuery('#'+prefix + fm.cwd().hash).prevAll('span.elfinder-path-dir:first') : jQuery();
				path.scrollLeft(prev.length? prev.position().left : 0);
			},
			fit = function() {
				if (fm.UA.CSS.flex) {
					return;
				}
				var dirs = path.children('span.elfinder-path-dir'),
					cnt  = dirs.length,
					m, bg = 0, ids;
				
				if (place === 'workzone' || cnt < 2) {
					dirs.attr('style', '');
					return;
				}
				path.width(path.css('max-width'));
				dirs.css({maxWidth: (100/cnt)+'%', display: 'inline-block'});
				m = path.width() - 9;
				path.children('span.elfinder-path-other').each(function() {
					m -= jQuery(this).width();
				});
				ids = [];
				dirs.each(function(i) {
					var dir = jQuery(this),
						w   = dir.width();
					m -= w;
					if (w < this.scrollWidth) {
						ids.push(i);
					}
				});
				path.width('');
				if (ids.length) {
					if (m > 0) {
						m = m / ids.length;
						jQuery.each(ids, function(i, k) {
							var d = jQuery(dirs[k]);
							d.css('max-width', d.width() + m);
						});
					}
					dirs.last().attr('style', '');
				} else {
					dirs.attr('style', '');
				}
			},
			hasUiTree, hasUiStat;

		fm.one('init', function() {
			hasUiTree = fm.getUI('tree').length;
			hasUiStat = fm.getUI('stat').length;
			if (! hasUiTree && options.toWorkzoneWithoutNavbar) {
				wzbase.append(path).insertBefore(fm.getUI('workzone'));
				place = 'workzone';
				fm.bind('open', toWorkzone)
				.one('opendone', function() {
					fm.getUI().trigger('resize');
				});
			}
		})
		.bind('open searchend parents', function() {
			var dirs = [];

			query  = '';
			target = '';
			mimes  = [];
			
			path.html(render(fm.cwd().hash));
			if (Object.keys(fm.roots).length > 1) {
				path.css('margin', '');
				roots.show();
			} else {
				path.css('margin', 0);
				roots.hide();
			}
			!hasUiStat && fit();
		})
		.bind('searchstart', function(e) {
			if (e.data) {
				query  = e.data.query || '';
				target = e.data.target || '';
				mimes  = e.data.mimes || [];
			}
		})
		.bind('search', function(e) {
			var dirs = [],
				html = '';
			if (target) {
				html = render(target);
			} else {
				html = fm.i18n('btnAll');
			}
			path.html('<span class="elfinder-path-other">'+fm.i18n('searcresult') + ': </span>' + html);
			fit();
		})
		// on swipe to navbar show/hide
		.bind('navbarshow navbarhide', function() {
			var wz = fm.getUI('workzone');
			if (this.type === 'navbarshow') {
				fm.unbind('open', toWorkzone);
				path.prependTo(fm.getUI('statusbar'));
				wzbase.detach();
				place = 'statusbar';
			} else {
				wzbase.append(path).insertBefore(wz);
				place = 'workzone';
				toWorkzone();
				fm.bind('open', toWorkzone);
			}
			fm.trigger('uiresize');
		})
		.bind('resize uistatchange', fit);
	});
};
js/ui/places.js000064400000040317151215013400007377 0ustar00/**
 * @class elFinder places/favorites ui
 *
 * @author Dmitry (dio) Levashov
 * @author Naoki Sawada
 **/
jQuery.fn.elfinderplaces = function(fm, opts) {
	"use strict";
	return this.each(function() {
		var dirs      = {},
			c         = 'class',
			navdir    = fm.res(c, 'navdir'),
			collapsed = fm.res(c, 'navcollapse'),
			expanded  = fm.res(c, 'navexpand'),
			hover     = fm.res(c, 'hover'),
			clroot    = fm.res(c, 'treeroot'),
			dropover  = fm.res(c, 'adroppable'),
			tpl       = fm.res('tpl', 'placedir'),
			ptpl      = fm.res('tpl', 'perms'),
			spinner   = jQuery(fm.res('tpl', 'navspinner')),
			suffix    = opts.suffix? opts.suffix : '',
			key       = 'places' + suffix,
			menuTimer = null,
			/**
			 * Convert places dir node into dir hash
			 *
			 * @param  String  directory id
			 * @return String
			 **/
			id2hash   = function(id) { return id.substr(6);	},
			/**
			 * Convert places dir hash into dir node id
			 *
			 * @param  String  directory id
			 * @return String
			 **/
			hash2id   = function(hash) { return 'place-'+hash; },

			/**
			 * Convert places dir hash into dir node elment (jQuery object)
			 *
			 * @param  String  directory id
			 * @return Object
			 **/
			hash2elm  = function(hash) { return jQuery(document.getElementById(hash2id(hash))); },
			
			/**
			 * Save current places state
			 *
			 * @return void
			 **/
			save      = function() {
				var hashes = [], data = {};
				
				hashes = jQuery.map(subtree.children().find('[id]'), function(n) {
					return id2hash(n.id);
				});
				if (hashes.length) {
					jQuery.each(hashes.reverse(), function(i, h) {
						data[h] = dirs[h];
					});
				} else {
					data = null;
				}
				
				fm.storage(key, data);
			},
			/**
			 * Init dir at places
			 *
			 * @return void
			 **/
			init = function() {
				var dat, hashes;
				key = 'places'+(opts.suffix? opts.suffix : ''),
				dirs = {};
				dat = fm.storage(key);
				if (typeof dat === 'string') {
					// old data type elFinder <= 2.1.12
					dat = jQuery.grep(dat.split(','), function(hash) { return hash? true : false;});
					jQuery.each(dat, function(i, d) {
						var dir = d.split('#');
						dirs[dir[0]] = dir[1]? dir[1] : dir[0];
					});
				} else if (jQuery.isPlainObject(dat)) {
					dirs = dat;
				}
				// allow modify `dirs`
				/**
				 * example for preset places
				 * 
				 * elfinderInstance.bind('placesload', function(e, fm) {
				 * 	//if (fm.storage(e.data.storageKey) === null) { // for first time only
				 * 	if (!fm.storage(e.data.storageKey)) {           // for empty places
				 * 		e.data.dirs[targetHash] = fallbackName;     // preset folder
				 * 	}
				 * }
				 **/
				fm.trigger('placesload', {dirs: dirs, storageKey: key}, true);
				
				hashes = Object.keys(dirs);
				if (hashes.length) {
					root.prepend(spinner);
					
					fm.request({
						data : {cmd : 'info', targets : hashes},
						preventDefault : true
					})
					.done(function(data) {
						var exists = {};
						
						data.files && data.files.length && fm.cache(data.files);
						
						jQuery.each(data.files, function(i, f) {
							var hash = f.hash;
							exists[hash] = f;
						});
						jQuery.each(dirs, function(h, f) {
							add(exists[h] || Object.assign({notfound: true}, f));
						});
						if (fm.storage('placesState') > 0) {
							root.trigger('click');
						}
					})
					.always(function() {
						spinner.remove();
					});
				}
			},
			/**
			 * Return node for given dir object
			 *
			 * @param  Object  directory object
			 * @return jQuery
			 **/
			create    = function(dir, hash) {
				return jQuery(tpl.replace(/\{id\}/, hash2id(dir? dir.hash : hash))
						.replace(/\{name\}/, fm.escape(dir? dir.i18 || dir.name : hash))
						.replace(/\{cssclass\}/, dir? (fm.perms2class(dir) + (dir.notfound? ' elfinder-na' : '') + (dir.csscls? ' '+dir.csscls : '')) : '')
						.replace(/\{permissions\}/, (dir && (!dir.read || !dir.write || dir.notfound))? ptpl : '')
						.replace(/\{title\}/, dir? (' title="' + fm.escape(fm.path(dir.hash, true) || dir.i18 || dir.name) + '"') : '')
						.replace(/\{symlink\}/, '')
						.replace(/\{style\}/, (dir && dir.icon)? fm.getIconStyle(dir) : ''));
			},
			/**
			 * Add new node into places
			 *
			 * @param  Object  directory object
			 * @return void
			 **/
			add = function(dir) {
				var node, hash;

				if (dir.mime !== 'directory') {
					return false;
				}
				hash = dir.hash;
				if (!fm.files().hasOwnProperty(hash)) {
					// update cache
					fm.trigger('tree', {tree: [dir]});
				}
				
				node = create(dir, hash);
				
				dirs[hash] = dir;
				subtree.prepend(node);
				root.addClass(collapsed);
				sortBtn.toggle(subtree.children().length > 1);
				
				return true;
			},
			/**
			 * Remove dir from places
			 *
			 * @param  String  directory hash
			 * @return String  removed name
			 **/
			remove = function(hash) {
				var name = null, tgt, cnt;

				if (dirs[hash]) {
					delete dirs[hash];
					tgt = hash2elm(hash);
					if (tgt.length) {
						name = tgt.text();
						tgt.parent().remove();
						cnt = subtree.children().length;
						sortBtn.toggle(cnt > 1);
						if (! cnt) {
							root.removeClass(collapsed);
							places.removeClass(expanded);
							subtree.slideToggle(false);
						}
					}
				}
				
				return name;
			},
			/**
			 * Move up dir on places
			 *
			 * @param  String  directory hash
			 * @return void
			 **/
			moveup = function(hash) {
				var self = hash2elm(hash),
					tgt  = self.parent(),
					prev = tgt.prev('div'),
					cls  = 'ui-state-hover',
					ctm  = fm.getUI('contextmenu');
				
				menuTimer && clearTimeout(menuTimer);
				
				if (prev.length) {
					ctm.find(':first').data('placesHash', hash);
					self.addClass(cls);
					tgt.insertBefore(prev);
					prev = tgt.prev('div');
					menuTimer = setTimeout(function() {
						self.removeClass(cls);
						if (ctm.find(':first').data('placesHash') === hash) {
							ctm.hide().empty();
						}
					}, 1500);
				}
				
				if(!prev.length) {
					self.removeClass(cls);
					ctm.hide().empty();
				}
			},
			/**
			 * Update dir at places
			 *
			 * @param  Object   directory
			 * @param  String   previous hash
			 * @return Boolean
			 **/
			update = function(dir, preHash) {
				var hash = dir.hash,
					tgt  = hash2elm(preHash || hash),
					node = create(dir, hash);

				if (tgt.length > 0) {
					tgt.parent().replaceWith(node);
					dirs[hash] = dir;
					return true;
				} else {
					return false;
				}
			},
			/**
			 * Remove all dir from places
			 *
			 * @return void
			 **/
			clear = function() {
				subtree.empty();
				root.removeClass(collapsed);
				places.removeClass(expanded);
				subtree.slideToggle(false);
			},
			/**
			 * Sort places dirs A-Z
			 *
			 * @return void
			 **/
			sort = function() {
				jQuery.each(dirs, function(h, f) {
					var dir = fm.file(h) || f,
						node = create(dir, h),
						ret = null;
					if (!dir) {
						node.hide();
					}
					if (subtree.children().length) {
						jQuery.each(subtree.children(), function() {
							var current =  jQuery(this);
							if ((dir.i18 || dir.name).localeCompare(current.children('.'+navdir).text()) < 0) {
								ret = !node.insertBefore(current);
								return ret;
							}
						});
						if (ret !== null) {
							return true;
						}
					}
					!hash2elm(h).length && subtree.append(node);
				});
				save();
			},
			// sort button
			sortBtn = jQuery('<span class="elfinder-button-icon elfinder-button-icon-sort elfinder-places-root-icon" title="'+fm.i18n('cmdsort')+'"></span>')
				.hide()
				.on('click', function(e) {
					e.stopPropagation();
					subtree.empty();
					sort();
				}
			),
			/**
			 * Node - wrapper for places root
			 *
			 * @type jQuery
			 **/
			wrapper = create({
					hash  : 'root-'+fm.namespace, 
					name  : fm.i18n(opts.name, 'places'),
					read  : true,
					write : true
				}),
			/**
			 * Places root node
			 *
			 * @type jQuery
			 **/
			root = wrapper.children('.'+navdir)
				.addClass(clroot)
				.on('click', function(e) {
					e.stopPropagation();
					if (root.hasClass(collapsed)) {
						places.toggleClass(expanded);
						subtree.slideToggle();
						fm.storage('placesState', places.hasClass(expanded)? 1 : 0);
					}
				})
				.append(sortBtn),
			/**
			 * Container for dirs
			 *
			 * @type jQuery
			 **/
			subtree = wrapper.children('.'+fm.res(c, 'navsubtree')),
			
			/**
			 * Main places container
			 *
			 * @type jQuery
			 **/
			places = jQuery(this).addClass(fm.res(c, 'tree')+' elfinder-places ui-corner-all')
				.hide()
				.append(wrapper)
				.appendTo(fm.getUI('navbar'))
				.on('mouseenter mouseleave', '.'+navdir, function(e) {
					jQuery(this).toggleClass('ui-state-hover', (e.type == 'mouseenter'));
				})
				.on('click', '.'+navdir, function(e) {
					var p = jQuery(this);
					if (p.data('longtap')) {
						e.stopPropagation();
						return;
					}
					! p.hasClass('elfinder-na') && fm.exec('open', p.attr('id').substr(6));
				})
				.on('contextmenu', '.'+navdir+':not(.'+clroot+')', function(e) {
					var self = jQuery(this),
						hash = self.attr('id').substr(6);
					
					e.preventDefault();

					fm.trigger('contextmenu', {
						raw : [{
							label    : fm.i18n('moveUp'),
							icon     : 'up',
							remain   : true,
							callback : function() { moveup(hash); save(); }
						},'|',{
							label    : fm.i18n('rmFromPlaces'),
							icon     : 'rm',
							callback : function() { remove(hash); save(); }
						}],
						'x'       : e.pageX,
						'y'       : e.pageY
					});
					
					self.addClass('ui-state-hover');
					
					fm.getUI('contextmenu').children().on('mouseenter', function() {
						self.addClass('ui-state-hover');
					});
					
					fm.bind('closecontextmenu', function() {
						self.removeClass('ui-state-hover');
					});
				})
				.droppable({
					tolerance  : 'pointer',
					accept     : '.elfinder-cwd-file-wrapper,.elfinder-tree-dir,.elfinder-cwd-file',
					hoverClass : fm.res('class', 'adroppable'),
					classes    : { // Deprecated hoverClass jQueryUI>=1.12.0
						'ui-droppable-hover': fm.res('class', 'adroppable')
					},
					over       : function(e, ui) {
						var helper = ui.helper,
							dir    = jQuery.grep(helper.data('files'), function(h) { return (fm.file(h).mime === 'directory' && !dirs[h])? true : false; });
						e.stopPropagation();
						helper.data('dropover', helper.data('dropover') + 1);
						if (fm.insideWorkzone(e.pageX, e.pageY)) {
							if (dir.length > 0) {
								helper.addClass('elfinder-drag-helper-plus');
								fm.trigger('unlockfiles', {files : helper.data('files'), helper: helper});
							} else {
								jQuery(this).removeClass(dropover);
							}
						}
					},
					out : function(e, ui) {
						var helper = ui.helper;
						e.stopPropagation();
						helper.removeClass('elfinder-drag-helper-move elfinder-drag-helper-plus').data('dropover', Math.max(helper.data('dropover') - 1, 0));
						jQuery(this).removeData('dropover')
						       .removeClass(dropover);
					},
					drop       : function(e, ui) {
						var helper  = ui.helper,
							resolve = true;
						
						jQuery.each(helper.data('files'), function(i, hash) {
							var dir = fm.file(hash);
							
							if (dir && dir.mime == 'directory' && !dirs[dir.hash]) {
								add(dir);
							} else {
								resolve = false;
							}
						});
						save();
						resolve && helper.hide();
					}
				})
				// for touch device
				.on('touchstart', '.'+navdir+':not(.'+clroot+')', function(e) {
					if (e.originalEvent.touches.length > 1) {
						return;
					}
					var hash = jQuery(this).attr('id').substr(6),
					p = jQuery(this)
					.addClass(hover)
					.data('longtap', null)
					.data('tmlongtap', setTimeout(function(){
						// long tap
						p.data('longtap', true);
						fm.trigger('contextmenu', {
							raw : [{
								label    : fm.i18n('rmFromPlaces'),
								icon     : 'rm',
								callback : function() { remove(hash); save(); }
							}],
							'x'       : e.originalEvent.touches[0].pageX,
							'y'       : e.originalEvent.touches[0].pageY
						});
					}, 500));
				})
				.on('touchmove touchend', '.'+navdir+':not(.'+clroot+')', function(e) {
					clearTimeout(jQuery(this).data('tmlongtap'));
					if (e.type == 'touchmove') {
						jQuery(this).removeClass(hover);
					}
				});

		if (jQuery.fn.sortable) {
			subtree.addClass('touch-punch')
			.sortable({
				appendTo : fm.getUI(),
				revert   : false,
				helper   : function(e) {
					var dir = jQuery(e.target).parent();
						
					dir.children().removeClass('ui-state-hover');
					
					return jQuery('<div class="ui-widget elfinder-place-drag elfinder-'+fm.direction+'"></div>')
							.append(jQuery('<div class="elfinder-navbar"></div>').show().append(dir.clone()));

				},
				stop     : function(e, ui) {
					var target = jQuery(ui.item[0]),
						top    = places.offset().top,
						left   = places.offset().left,
						width  = places.width(),
						height = places.height(),
						x      = e.pageX,
						y      = e.pageY;
					
					if (!(x > left && x < left+width && y > top && y < y+height)) {
						remove(id2hash(target.children(':first').attr('id')));
						save();
					}
				},
				update   : function(e, ui) {
					save();
				}
			});
		}

		// "on regist" for command exec
		jQuery(this).on('regist', function(e, files){
			var added = false;
			jQuery.each(files, function(i, dir) {
				if (dir && dir.mime == 'directory' && !dirs[dir.hash]) {
					if (add(dir)) {
						added = true;
					}
				}
			});
			added && save();
		});
	

		// on fm load - show places and load files from backend
		fm.one('load', function() {
			var dat, hashes;
			
			if (fm.oldAPI) {
				return;
			}
			
			places.show().parent().show();

			init();

			fm.change(function(e) {
				var changed = false;
				jQuery.each(e.data.changed, function(i, file) {
					if (dirs[file.hash]) {
						if (file.mime !== 'directory') {
							if (remove(file.hash)) {
								changed = true;
							}
						} else {
							if (update(file)) {
								changed = true;
							}
						}
					}
				});
				changed && save();
			})
			.bind('rename', function(e) {
				var changed = false;
				if (e.data.removed) {
					jQuery.each(e.data.removed, function(i, hash) {
						if (e.data.added[i]) {
							if (update(e.data.added[i], hash)) {
								changed = true;
							}
						}
					});
				}
				changed && save();
			})
			.bind('rm paste', function(e) {
				var names = [],
					changed = false;
				if (e.data.removed) {
					jQuery.each(e.data.removed, function(i, hash) {
						var name = remove(hash);
						name && names.push(name);
					});
				}
				if (names.length) {
					changed = true;
				}
				if (e.data.added && names.length) {
					jQuery.each(e.data.added, function(i, file) {
						if (jQuery.inArray(file.name, names) !== 1) {
							file.mime == 'directory' && add(file);
						}
					});
				}
				changed && save();
			})
			.bind('sync netmount', function() {
				var ev = this,
					opSuffix = opts.suffix? opts.suffix : '',
					hashes;
				
				if (ev.type === 'sync') {
					// check is change of opts.suffix
					if (suffix !== opSuffix) {
						suffix = opSuffix;
						clear();
						init();
						return;
					}
				}
				
				hashes = Object.keys(dirs);
				if (hashes.length) {
					root.prepend(spinner);

					fm.request({
						data : {cmd : 'info', targets : hashes},
						preventDefault : true
					})
					.done(function(data) {
						var exists  = {},
							updated = false,
							cwd     = fm.cwd().hash;
						jQuery.each(data.files || [], function(i, file) {
							var hash = file.hash;
							exists[hash] = file;
							if (!fm.files().hasOwnProperty(file.hash)) {
								// update cache
								fm.updateCache({tree: [file]});
							}
						});
						jQuery.each(dirs, function(h, f) {
							if (Boolean(f.notfound) === Boolean(exists[h])) {
								if ((f.phash === cwd && ev.type !== 'netmount') || (exists[h] && exists[h].mime !== 'directory')) {
									if (remove(h)) {
										updated = true;
									}
								} else {
									if (update(exists[h] || Object.assign({notfound: true}, f))) {
										updated = true;
									}
								}
							} else if (exists[h] && exists[h].phash != cwd) {
								// update permission of except cwd
								update(exists[h]);
							}
						});
						updated && save();
					})
					.always(function() {
						spinner.remove();
					});
				}
			});
			
		});
		
	});
};
js/ui/navdock.js000064400000010566151215013400007560 0ustar00/**
 * @class elfindernavdock - elFinder container for preview etc at below the navbar
 *
 * @author Naoki Sawada
 **/
jQuery.fn.elfindernavdock = function(fm, opts) {
	"use strict";
	this.not('.elfinder-navdock').each(function() {
		var self = jQuery(this).hide().addClass('ui-state-default elfinder-navdock touch-punch'),
			node = self.parent(),
			wz   = node.children('.elfinder-workzone').append(self),
			resize = function(to, h) {
				var curH = h || self.height(),
					diff = to - curH,
					len  = Object.keys(sizeSyncs).length,
					calc = len? diff / len : 0,
					ovf;
				if (diff) {
					ovf = self.css('overflow');
					self.css('overflow', 'hidden');
					self.height(to);
					jQuery.each(sizeSyncs, function(id, n) {
						n.height(n.height() + calc).trigger('resize.' + fm.namespace);
					});
					fm.trigger('wzresize');
					self.css('overflow', ovf);
				}
			},
			handle = jQuery('<div class="ui-front ui-resizable-handle ui-resizable-n"></div>').appendTo(self),
			sizeSyncs = {},
			resizeFn = [],
			initMaxHeight = (parseInt(opts.initMaxHeight) || 50) / 100,
			maxHeight = (parseInt(opts.maxHeight) || 90) / 100,
			basicHeight, hasNode;
		
		
		self.data('addNode', function(cNode, opts) {
			var wzH = fm.getUI('workzone').height(),
				imaxH = wzH * initMaxHeight,
				curH, tH, mH;
			opts = Object.assign({
				first: false,
				sizeSync: true,
				init: false
			}, opts);
			if (!cNode.attr('id')) {
				cNode.attr('id', fm.namespace+'-navdock-' + (+new Date()));
			}
			opts.sizeSync && (sizeSyncs[cNode.attr('id')] = cNode);
			curH = self.height();
			tH = curH + cNode.outerHeight(true);
			
			if (opts.first) {
				handle.after(cNode);
			} else {
				self.append(cNode);
			}
			hasNode = true;
			self.resizable('enable').height(tH).show();
			
			fm.trigger('wzresize');
			
			if (opts.init) {
				mH = fm.storage('navdockHeight');
				if (mH) {
					tH = mH;
				} else {
					tH = tH > imaxH? imaxH : tH;
				}
				basicHeight = tH;
			}
			resize(Math.min(tH, wzH * maxHeight));
			
			return self;
		}).data('removeNode', function(nodeId, appendTo) {
			var cNode = jQuery('#'+nodeId);
			delete sizeSyncs[nodeId];
			self.height(self.height() - jQuery('#'+nodeId).outerHeight(true));
			if (appendTo) {
				if (appendTo === 'detach') {
					cNode = cNode.detach();
				} else {
					appendTo.append(cNode);
				}
			} else {
				cNode.remove();
			}
			if (self.children().length <= 1) {
				hasNode = false;
				self.resizable('disable').height(0).hide();
			}
			fm.trigger('wzresize');
			return cNode;
		});
		
		if (! opts.disabled) {
			fm.one('init', function() {
				var ovf;
				if (fm.getUI('navbar').children().not('.ui-resizable-handle').length) {
					self.data('dockEnabled', true);
					self.resizable({
						maxHeight: fm.getUI('workzone').height() * maxHeight,
						handles: { n: handle },
						start: function(e, ui) {
							ovf = self.css('overflow');
							self.css('overflow', 'hidden');
							fm.trigger('navdockresizestart', {event: e, ui: ui}, true);
						},
						resize: function(e, ui) {
							self.css('top', '');
							fm.trigger('wzresize', { inNavdockResize : true });
						},
						stop: function(e, ui) {
							fm.trigger('navdockresizestop', {event: e, ui: ui}, true);
							self.css('top', '');
							basicHeight = ui.size.height;
							fm.storage('navdockHeight', basicHeight);
							resize(basicHeight, ui.originalSize.height);
							self.css('overflow', ovf);
						}
					});
					fm.bind('wzresize', function(e) {
						var minH, maxH, h;
						if (self.is(':visible')) {
							maxH = fm.getUI('workzone').height() * maxHeight;
							if (! e.data || ! e.data.inNavdockResize) {
								h = self.height();
								if (maxH < basicHeight) {
									if (Math.abs(h - maxH) > 1) {
										resize(maxH);
									}
								} else {
									if (Math.abs(h - basicHeight) > 1) {
										resize(basicHeight);
									}
								}
							}
							self.resizable('option', 'maxHeight', maxH);
						}
					}).bind('themechange', function() {
						var oldH = Math.round(self.height());
						requestAnimationFrame(function() {
							var curH = Math.round(self.height()),
								diff = oldH - curH;
							if (diff !== 0) {
								resize(self.height(),  curH - diff);
							}
						});
					});
				}
				fm.bind('navbarshow navbarhide', function(e) {
					self[hasNode && e.type === 'navbarshow'? 'show' : 'hide']();
				});
			});
		}
	});
	return this;
};js/ui/contextmenu.js000064400000052721151215013400010503 0ustar00/**
 * @class  elFinder contextmenu
 *
 * @author Dmitry (dio) Levashov
 **/
jQuery.fn.elfindercontextmenu = function(fm) {
	"use strict";
	return this.each(function() {
		var self   = jQuery(this),
			cmItem = 'elfinder-contextmenu-item',
			smItem = 'elfinder-contextsubmenu-item',
			exIcon = 'elfinder-contextmenu-extra-icon',
			cHover = fm.res('class', 'hover'),
			dragOpt = {
				distance: 8,
				start: function() {
					menu.data('drag', true).data('touching') && menu.find('.'+cHover).removeClass(cHover);
				},
				stop: function() {
					menu.data('draged', true).removeData('drag');
				}
			},
			menu = jQuery(this).addClass('touch-punch ui-helper-reset ui-front ui-widget ui-state-default ui-corner-all elfinder-contextmenu elfinder-contextmenu-'+fm.direction)
				.hide()
				.on('touchstart', function(e) {
					menu.data('touching', true).children().removeClass(cHover);
				})
				.on('touchend', function(e) {
					menu.removeData('touching');
				})
				.on('mouseenter mouseleave', '.'+cmItem, function(e) {
					jQuery(this).toggleClass(cHover, (e.type === 'mouseenter' || (! menu.data('draged') && menu.data('submenuKeep'))? true : false));
					if (menu.data('draged') && menu.data('submenuKeep')) {
						menu.find('.elfinder-contextmenu-sub:visible').parent().addClass(cHover);
					}
				})
				.on('mouseenter mouseleave', '.'+exIcon, function(e) {
					jQuery(this).parent().toggleClass(cHover, e.type === 'mouseleave');
				})
				.on('mouseenter mouseleave', '.'+cmItem+',.'+smItem, function(e) {
					var setIndex = function(target, sub) {
						jQuery.each(sub? subnodes : nodes, function(i, n) {
							if (target[0] === n) {
								(sub? subnodes : nodes)._cur = i;
								if (sub) {
									subselected = target;
								} else {
									selected = target;
								}
								return false;
							}
						});
					};
					if (e.originalEvent) {
						var target = jQuery(this),
							unHover = function() {
								if (selected && !selected.children('div.elfinder-contextmenu-sub:visible').length) {
									selected.removeClass(cHover);
								}
							};
						if (e.type === 'mouseenter') {
							// mouseenter
							if (target.hasClass(smItem)) {
								// submenu
								if (subselected) {
									subselected.removeClass(cHover);
								}
								if (selected) {
									subnodes = selected.find('div.'+smItem);
								}
								setIndex(target, true);
							} else {
								// menu
								unHover();
								setIndex(target);
							}
						} else {
							// mouseleave
							if (target.hasClass(smItem)) {
								//submenu
								subselected = null;
								subnodes = null;
							} else {
								// menu
								unHover();
								(function(sel) {
									setTimeout(function() {
										if (sel === selected) {
											selected = null;
										}
									}, 250);
								})(selected);
							}
						}
					}
				})
				.on('contextmenu', function(){return false;})
				.on('mouseup', function() {
					setTimeout(function() {
						menu.removeData('draged');
					}, 100);
				})
				.draggable(dragOpt),
			ltr = fm.direction === 'ltr',
			subpos = ltr? 'left' : 'right',
			types = Object.assign({}, fm.options.contextmenu),
			tpl     = '<div class="'+cmItem+'{className}"><span class="elfinder-button-icon {icon} elfinder-contextmenu-icon"{style}></span><span>{label}</span></div>',
			item = function(label, icon, callback, opts) {
				var className = '',
					style = '',
					iconClass = '',
					v, pos;
				if (opts) {
					if (opts.className) {
						className = ' ' + opts.className;
					}
					if (opts.iconClass) {
						iconClass = opts.iconClass;
						icon = '';
					}
					if (opts.iconImg) {
						v = opts.iconImg.split(/ +/);
						pos = v[1] && v[2]? fm.escape(v[1] + 'px ' + v[2] + 'px') : '';
						style = ' style="background:url(\''+fm.escape(v[0])+'\') '+(pos? pos : '0 0')+' no-repeat;'+(pos? '' : 'posbackground-size:contain;')+'"';
					}
				}
				return jQuery(tpl.replace('{icon}', icon ? 'elfinder-button-icon-'+icon : (iconClass? iconClass : ''))
						.replace('{label}', label)
						.replace('{style}', style)
						.replace('{className}', className))
					.on('click', function(e) {
						e.stopPropagation();
						e.preventDefault();
						callback();
					});
			},
			urlIcon = function(iconUrl) {
				var v = iconUrl.split(/ +/),
					pos = v[1] && v[2]? (v[1] + 'px ' + v[2] + 'px') : '';
				return {
					backgroundImage: 'url("'+v[0]+'")',
					backgroundRepeat: 'no-repeat',
					backgroundPosition: pos? pos : '',
					backgroundSize: pos? '' : 'contain'
				};
			},
			base, cwd,
			nodes, selected, subnodes, subselected, autoSyncStop, subHoverTm,

			autoToggle = function() {
				var evTouchStart = 'touchstart.contextmenuAutoToggle';
				menu.data('hideTm') && clearTimeout(menu.data('hideTm'));
				if (menu.is(':visible')) {
					menu.on('touchstart', function(e) {
						if (e.originalEvent.touches.length > 1) {
							return;
						}
						menu.stop();
						fm.toFront(menu);
						menu.data('hideTm') && clearTimeout(menu.data('hideTm'));
					})
					.data('hideTm', setTimeout(function() {
						if (menu.is(':visible')) {
							cwd.find('.elfinder-cwd-file').off(evTouchStart);
							cwd.find('.elfinder-cwd-file.ui-selected')
							.one(evTouchStart, function(e) {
								if (e.originalEvent.touches.length > 1) {
									return;
								}
								var tgt = jQuery(e.target);
								if (menu.first().length && !tgt.is('input:checkbox') && !tgt.hasClass('elfinder-cwd-select')) {
									e.stopPropagation();
									//e.preventDefault();
									open(e.originalEvent.touches[0].pageX, e.originalEvent.touches[0].pageY);
									cwd.data('longtap', true)
									tgt.one('touchend', function() {
										setTimeout(function() {
											cwd.removeData('longtap');
										}, 80);
									});
									return;
								}
								cwd.find('.elfinder-cwd-file').off(evTouchStart);
							})
							.one('unselect.'+fm.namespace, function() {
								cwd.find('.elfinder-cwd-file').off(evTouchStart);
							});
							menu.fadeOut({
								duration: 300,
								fail: function() {
									menu.css('opacity', '1').show();
								},
								done: function() {
									fm.toHide(menu);
								}
							});
						}
					}, 4500));
				}
			},
			
			keyEvts = function(e) {
				var code = e.keyCode,
					ESC = jQuery.ui.keyCode.ESCAPE,
					ENT = jQuery.ui.keyCode.ENTER,
					LEFT = jQuery.ui.keyCode.LEFT,
					RIGHT = jQuery.ui.keyCode.RIGHT,
					UP = jQuery.ui.keyCode.UP,
					DOWN = jQuery.ui.keyCode.DOWN,
					subent = fm.direction === 'ltr'? RIGHT : LEFT,
					sublev = subent === RIGHT? LEFT : RIGHT;
				
				if (jQuery.inArray(code, [ESC, ENT, LEFT, RIGHT, UP, DOWN]) !== -1) {
					e.preventDefault();
					e.stopPropagation();
					e.stopImmediatePropagation();
					if (code == ESC || code === sublev) {
						if (selected && subnodes && subselected) {
							subselected.trigger('mouseleave').trigger('submenuclose');
							selected.addClass(cHover);
							subnodes = null;
							subselected = null;
						} else {
							code == ESC && close();
							fm.trigger('closecontextmenu');
						}
					} else if (code == UP || code == DOWN) {
						if (subnodes) {
							if (subselected) {
								subselected.trigger('mouseleave');
							}
							if (code == DOWN && (! subselected || subnodes.length <= ++subnodes._cur)) {
								subnodes._cur = 0;
							} else if (code == UP && (! subselected || --subnodes._cur < 0)) {
								subnodes._cur = subnodes.length - 1;
							}
							subselected = subnodes.eq(subnodes._cur).trigger('mouseenter');
						} else {
							subnodes = null;
							if (selected) {
								selected.trigger('mouseleave');
							}
							if (code == DOWN && (! selected || nodes.length <= ++nodes._cur)) {
								nodes._cur = 0;
							} else if (code == UP && (! selected || --nodes._cur < 0)) {
								nodes._cur = nodes.length - 1;
							}
							selected = nodes.eq(nodes._cur).addClass(cHover);
						}
					} else if (selected && (code == ENT || code === subent)) {
						if (selected.hasClass('elfinder-contextmenu-group')) {
							if (subselected) {
								code == ENT && subselected.click();
							} else {
								selected.trigger('mouseenter');
								subnodes = selected.find('div.'+smItem);
								subnodes._cur = 0;
								subselected = subnodes.first().addClass(cHover);
							}
						} else {
							code == ENT && selected.click();
						}
					}
				}
			},
			
			open = function(x, y, css) {
				var width      = menu.outerWidth(),
					height     = menu.outerHeight(),
					bstyle     = base.attr('style'),
					bpos       = base.offset(),
					bwidth     = base.width(),
					bheight    = base.height(),
					mw         = fm.UA.Mobile? 40 : 2,
					mh         = fm.UA.Mobile? 20 : 2,
					x          = x - (bpos? bpos.left : 0),
					y          = y - (bpos? bpos.top : 0),
					css        = Object.assign(css || {}, {
						top  : Math.max(0, y + mh + height < bheight ? y + mh : y - (y + height - bheight)),
						left : Math.max(0, (x < width + mw || x + mw + width < bwidth)? x + mw : x - mw - width),
						opacity : '1'
					}),
					evts;

				autoSyncStop = true;
				fm.autoSync('stop');
				base.width(bwidth);
				menu.stop().removeAttr('style').css(css);
				fm.toFront(menu);
				menu.show();
				base.attr('style', bstyle);
				
				css[subpos] = parseInt(menu.width());
				menu.find('.elfinder-contextmenu-sub').css(css);
				if (fm.UA.iOS) {
					jQuery('div.elfinder div.overflow-scrolling-touch').css('-webkit-overflow-scrolling', 'auto');
				}
				
				selected = null;
				subnodes = null;
				subselected = null;
				jQuery(document).on('keydown.' + fm.namespace, keyEvts);
				evts = jQuery._data(document).events;
				if (evts && evts.keydown) {
					evts.keydown.unshift(evts.keydown.pop());
				}
				
				fm.UA.Mobile && autoToggle();
				
				requestAnimationFrame(function() {
					fm.getUI().one('click.' + fm.namespace, close);
				});
			},
			
			close = function() {
				fm.getUI().off('click.' + fm.namespace, close);
				jQuery(document).off('keydown.' + fm.namespace, keyEvts);

				currentType = currentTargets = null;
				
				if (menu.is(':visible') || menu.children().length) {
					fm.toHide(menu.removeAttr('style').empty().removeData('submenuKeep'));
					try {
						if (! menu.draggable('instance')) {
							menu.draggable(dragOpt);
						}
					} catch(e) {
						if (! menu.hasClass('ui-draggable')) {
							menu.draggable(dragOpt);
						}
					}
					if (menu.data('prevNode')) {
						menu.data('prevNode').after(menu);
						menu.removeData('prevNode');
					}
					fm.trigger('closecontextmenu');
					if (fm.UA.iOS) {
						jQuery('div.elfinder div.overflow-scrolling-touch').css('-webkit-overflow-scrolling', 'touch');
					}
				}
				
				autoSyncStop && fm.searchStatus.state < 1 && ! fm.searchStatus.ininc && fm.autoSync();
				autoSyncStop = false;
			},
			
			create = function(type, targets) {
				var sep    = false,
					insSep = false,
					disabled = [],
					isCwd = type === 'cwd',
					selcnt = 0,
					cmdMap;

				currentType = type;
				currentTargets = targets;
				
				// get current uiCmdMap option
				if (!(cmdMap = fm.option('uiCmdMap', isCwd? void(0) : targets[0]))) {
					cmdMap = {};
				}
				
				if (!isCwd) {
					disabled = fm.getDisabledCmds(targets);
				}
				
				selcnt = fm.selected().length;
				if (selcnt > 1) {
					menu.append('<div class="ui-corner-top ui-widget-header elfinder-contextmenu-header"><span>'
					 + fm.i18n('selectedItems', ''+selcnt)
					 + '</span></div>');
				}
				
				nodes = jQuery();
				jQuery.each(types[type]||[], function(i, name) {
					var cmd, cmdName, useMap, node, submenu, hover;
					
					if (name === '|') {
						if (sep) {
							insSep = true;
						}
						return;
					}
					
					if (cmdMap[name]) {
						cmdName = cmdMap[name];
						useMap = true;
					} else {
						cmdName = name;
					}
					cmd = fm.getCommand(cmdName);

					if (cmd && !isCwd && (!fm.searchStatus.state || !cmd.disableOnSearch)) {
						cmd.__disabled = cmd._disabled;
						cmd._disabled = !(cmd.alwaysEnabled || (fm._commands[cmdName] ? jQuery.inArray(name, disabled) === -1 && (!useMap || !disabled[cmdName]) : false));
						jQuery.each(cmd.linkedCmds, function(i, n) {
							var c;
							if (c = fm.getCommand(n)) {
								c.__disabled = c._disabled;
								c._disabled = !(c.alwaysEnabled || (fm._commands[n] ? !disabled[n] : false));
							}
						});
					}

					if (cmd && !cmd._disabled && cmd.getstate(targets) != -1) {
						if (cmd.variants) {
							if (!cmd.variants.length) {
								return;
							}
							node = item(cmd.title, cmd.className? cmd.className : cmd.name, function(){}, cmd.contextmenuOpts);
							
							submenu = jQuery('<div class="ui-front ui-corner-all elfinder-contextmenu-sub"></div>')
								.hide()
								.css('max-height', fm.getUI().height() - 30)
								.appendTo(node.append('<span class="elfinder-contextmenu-arrow"></span>'));
							
							hover = function(show){
								if (! show) {
									submenu.hide();
								} else {
									var bstyle = base.attr('style');
									base.width(base.width());
									// top: '-1000px' to prevent visible scrollbar of window with the elFinder option `height: '100%'`
									submenu.css({ top: '-1000px', left: 'auto', right: 'auto' });
									var nodeOffset = node.offset(),
										nodeleft   = nodeOffset.left,
										nodetop    = nodeOffset.top,
										nodewidth  = node.outerWidth(),
										width      = submenu.outerWidth(true),
										height     = submenu.outerHeight(true),
										baseOffset = base.offset(),
										wwidth     = baseOffset.left + base.width(),
										wheight    = baseOffset.top + base.height(),
										cltr       = ltr, 
										x          = nodewidth,
										y, over;
	
									if (ltr) {
										over = (nodeleft + nodewidth + width) - wwidth;
										if (over > 10) {
											if (nodeleft > width - 5) {
												x = x - 5;
												cltr = false;
											} else {
												if (!fm.UA.Mobile) {
													x = nodewidth - over;
												}
											}
										}
									} else {
										over = width - nodeleft;
										if (over > 0) {
											if ((nodeleft + nodewidth + width - 15) < wwidth) {
												x = x - 5;
												cltr = true;
											} else {
												if (!fm.UA.Mobile) {
													x = nodewidth - over;
												}
											}
										}
									}
									over = (nodetop + 5 + height) - wheight;
									y = (over > 0 && nodetop < wheight)? 5 - over : (over > 0? 30 - height : 5);
	
									menu.find('.elfinder-contextmenu-sub:visible').hide();
									submenu.css({
										top : y,
										left : cltr? x : 'auto',
										right: cltr? 'auto' : x,
										overflowY: 'auto'
									}).show();
									base.attr('style', bstyle);
								}
							};
							
							node.addClass('elfinder-contextmenu-group')
								.on('mouseleave', '.elfinder-contextmenu-sub', function(e) {
									if (! menu.data('draged')) {
										menu.removeData('submenuKeep');
									}
								})
								.on('submenuclose', '.elfinder-contextmenu-sub', function(e) {
									hover(false);
								})
								.on('click', '.'+smItem, function(e){
									var opts, $this;
									e.stopPropagation();
									if (! menu.data('draged')) {
										$this = jQuery(this);
										if (!cmd.keepContextmenu) {
											menu.hide();
										} else {
											$this.removeClass(cHover);
											node.addClass(cHover);
										}
										opts = $this.data('exec');
										if (typeof opts === 'undefined') {
											opts = {};
										}
										if (typeof opts === 'object') {
											opts._userAction = true;
											opts._currentType = type;
											opts._currentNode = $this;
										}
										!cmd.keepContextmenu && close();
										fm.exec(cmd.name, targets, opts);
									}
								})
								.on('touchend', function(e) {
									if (! menu.data('drag')) {
										hover(true);
										menu.data('submenuKeep', true);
									}
								})
								.on('mouseenter mouseleave', function(e){
									if (! menu.data('touching')) {
										if (node.data('timer')) {
											clearTimeout(node.data('timer'));
											node.removeData('timer');
										}
										if (!jQuery(e.target).closest('.elfinder-contextmenu-sub', menu).length) {
											if (e.type === 'mouseleave') {
												if (! menu.data('submenuKeep')) {
													node.data('timer', setTimeout(function() {
														node.removeData('timer');
														hover(false);
													}, 250));
												}
											} else {
												node.data('timer', setTimeout(function() {
													node.removeData('timer');
													hover(true);
												}, nodes.find('div.elfinder-contextmenu-sub:visible').length? 250 : 0));
											}
										}
									}
								});
							
							jQuery.each(cmd.variants, function(i, variant) {
								var item = variant === '|' ? '<div class="elfinder-contextmenu-separator"></div>' :
									jQuery('<div class="'+cmItem+' '+smItem+'"><span>'+variant[1]+'</span></div>').data('exec', variant[0]),
									iconClass, icon;
								if (typeof variant[2] !== 'undefined') {
									icon = jQuery('<span></span>').addClass('elfinder-button-icon elfinder-contextmenu-icon');
									if (! /\//.test(variant[2])) {
										icon.addClass('elfinder-button-icon-'+variant[2]);
									} else {
										icon.css(urlIcon(variant[2]));
									}
									item.prepend(icon).addClass(smItem+'-icon');
								}
								submenu.append(item);
							});
								
						} else {
							node = item(cmd.title, cmd.className? cmd.className : cmd.name, function() {
								if (! menu.data('draged')) {
									!cmd.keepContextmenu && close();
									fm.exec(cmd.name, targets, {_userAction: true, _currentType: type, _currentNode: node});
								}
							}, cmd.contextmenuOpts);
							if (cmd.extra && cmd.extra.node) {
								jQuery('<span class="elfinder-button-icon elfinder-button-icon-'+(cmd.extra.icon || '')+' '+exIcon+'"></span>')
									.append(cmd.extra.node).appendTo(node);
								jQuery(cmd.extra.node).trigger('ready', {targets: targets});
							} else {
								node.remove('.'+exIcon);
							}
						}
						
						if (cmd.extendsCmd) {
							node.children('span.elfinder-button-icon').addClass('elfinder-button-icon-' + cmd.extendsCmd);
						}
						
						if (insSep) {
							menu.append('<div class="elfinder-contextmenu-separator"></div>');
						}
						menu.append(node);
						sep = true;
						insSep = false;
					}
					
					if (cmd && typeof cmd.__disabled !== 'undefined') {
						cmd._disabled = cmd.__disabled;
						delete cmd.__disabled;
						jQuery.each(cmd.linkedCmds, function(i, n) {
							var c;
							if (c = fm.getCommand(n)) {
								c._disabled = c.__disabled;
								delete c.__disabled;
							}
						});
					}
				});
				nodes = menu.children('div.'+cmItem);
			},
			
			createFromRaw = function(raw) {
				currentType = 'raw';
				jQuery.each(raw, function(i, data) {
					var node;
					
					if (data === '|') {
						menu.append('<div class="elfinder-contextmenu-separator"></div>');
					} else if (data.label && typeof data.callback == 'function') {
						node = item(data.label, data.icon, function() {
							if (! menu.data('draged')) {
								!data.remain && close();
								data.callback();
							}
						}, data.options || null);
						menu.append(node);
					}
				});
				nodes = menu.children('div.'+cmItem);
			},
			
			currentType = null,
			currentTargets = null;
		
		fm.one('load', function() {
			base = fm.getUI();
			cwd = fm.getUI('cwd');
			fm.bind('contextmenu', function(e) {
				var data = e.data,
					css = {},
					prevNode;

				if (data.type && data.type !== 'files') {
					cwd.trigger('unselectall');
				}
				close();

				if (data.type && data.targets) {
					fm.trigger('contextmenucreate', data);
					create(data.type, data.targets);
					fm.trigger('contextmenucreatedone', data);
				} else if (data.raw) {
					createFromRaw(data.raw);
				}

				if (menu.children().length) {
					prevNode = data.prevNode || null;
					if (prevNode) {
						menu.data('prevNode', menu.prev());
						prevNode.after(menu);
					}
					if (data.fitHeight) {
						css = {maxHeight: Math.min(fm.getUI().height(), jQuery(window).height()), overflowY: 'auto'};
						menu.draggable('destroy').removeClass('ui-draggable');
					}
					open(data.x, data.y, css);
					// call opened callback function
					if (data.opened && typeof data.opened === 'function') {
						data.opened.call(menu);
					}
				}
			})
			.one('destroy', function() { menu.remove(); })
			.bind('disable', close)
			.bind('select', function(e){
				(currentType === 'files' && (!e.data || e.data.selected.toString() !== currentTargets.toString())) && close();
			});
		})
		.shortcut({
			pattern     : fm.OS === 'mac' ? 'ctrl+m' : 'contextmenu shift+f10',
			description : 'contextmenu',
			callback    : function(e) {
				e.stopPropagation();
				e.preventDefault();
				jQuery(document).one('contextmenu.' + fm.namespace, function(e) {
					e.preventDefault();
					e.stopPropagation();
				});
				var sel = fm.selected(),
					type, targets, pos, elm;
				
				if (sel.length) {
					type = 'files';
					targets = sel;
					elm = fm.cwdHash2Elm(sel[0]);
				} else {
					type = 'cwd';
					targets = [ fm.cwd().hash ];
					pos = fm.getUI('workzone').offset();
				}
				if (! elm || ! elm.length) {
					elm = fm.getUI('workzone');
				}
				pos = elm.offset();
				pos.top += (elm.height() / 2);
				pos.left += (elm.width() / 2);
				fm.trigger('contextmenu', {
					'type'    : type,
					'targets' : targets,
					'x'       : pos.left,
					'y'       : pos.top
				});
			}
		});
		
	});
	
};
js/ui/fullscreenbutton.js000064400000001172151215013400011522 0ustar00/**
 * @class  elFinder toolbar button to switch full scrren mode.
 *
 * @author Naoki Sawada
 **/

jQuery.fn.elfinderfullscreenbutton = function(cmd) {
	"use strict";
	return this.each(function() {
		var button = jQuery(this).elfinderbutton(cmd),
			icon   = button.children('.elfinder-button-icon'),
			tm;
		cmd.change(function() {
			tm && cancelAnimationFrame(tm);
			tm = requestAnimationFrame(function() {
				var fullscreen = cmd.value;
				icon.addClass('elfinder-button-icon-fullscreen').toggleClass('elfinder-button-icon-unfullscreen', fullscreen);
				cmd.className = fullscreen? 'unfullscreen' : '';
			});
		});
	});
};
js/ui/searchbutton.js000064400000024057151215013400010634 0ustar00/**
 * @class  elFinder toolbar search button widget.
 *
 * @author Dmitry (dio) Levashov
 **/
jQuery.fn.elfindersearchbutton = function(cmd) {
	"use strict";
	return this.each(function() {
		var result = false,
			fm     = cmd.fm,
			disabled = fm.res('class', 'disabled'),
			isopts = cmd.options.incsearch || { enable: false },
			sTypes = cmd.options.searchTypes,
			id     = function(name){return fm.namespace + fm.escape(name);},
			toolbar= fm.getUI('toolbar'),
			btnCls = fm.res('class', 'searchbtn'),
			button = jQuery(this)
				.hide()
				.addClass('ui-widget-content elfinder-button '+btnCls)
				.on('click', function(e) {
					e.stopPropagation();
				}),
			getMenuOffset = function() {
				var fmNode = fm.getUI(),
					baseOffset = fmNode.offset(),
					buttonOffset = button.offset();
				return {
					top : buttonOffset.top - baseOffset.top,
					maxHeight : fmNode.height() - 40
				};
			},
			search = function() {
				input.data('inctm') && clearTimeout(input.data('inctm'));
				var val = jQuery.trim(input.val()),
					from = !jQuery('#' + id('SearchFromAll')).prop('checked'),
					mime = jQuery('#' + id('SearchMime')).prop('checked'),
					type = '';
				if (from) {
					if (jQuery('#' + id('SearchFromVol')).prop('checked')) {
						from = fm.root(fm.cwd().hash);
					} else {
						from = fm.cwd().hash;
					}
				}
				if (mime) {
					mime = val;
					val = '.';
				}
				if (typeSet) {
					type = typeSet.children('input:checked').val();
				}
				if (val) {
					input.trigger('focus');
					cmd.exec(val, from, mime, type).done(function() {
						result = true;
					}).fail(function() {
						abort();
					});
					
				} else {
					fm.trigger('searchend');
				}
			},
			abort = function() {
				input.data('inctm') && clearTimeout(input.data('inctm'));
				input.val('').trigger('blur');
				if (result || incVal) {
					result = false;
					incVal = '';
					fm.lazy(function() {
						fm.trigger('searchend');
					});
				}
			},
			incVal = '',
			input  = jQuery('<input type="text" size="42"/>')
				.on('focus', function() {
					// close other menus
					!button.hasClass('ui-state-active') && fm.getUI().click();
					inFocus = true;
					incVal = '';
					button.addClass('ui-state-active');
					fm.trigger('uiresize');
					opts && opts.css(getMenuOffset()).slideDown(function() {
						// Care for on browser window re-active
						button.addClass('ui-state-active');
						fm.toFront(opts);
					});
				})
				.on('blur', function() {
					inFocus = false;
					if (opts) {
						if (!opts.data('infocus')) {
							opts.slideUp(function() {
								button.removeClass('ui-state-active');
								fm.trigger('uiresize');
								fm.toHide(opts);
							});
						} else {
							opts.data('infocus', false);
						}
					} else {
						button.removeClass('ui-state-active');
					}
				})
				.appendTo(button)
				// to avoid fm shortcuts on arrows
				.on('keypress', function(e) {
					e.stopPropagation();
				})
				.on('keydown', function(e) {
					e.stopPropagation();
					if (e.keyCode === jQuery.ui.keyCode.ENTER) {
						search();
					} else if (e.keyCode === jQuery.ui.keyCode.ESCAPE) {
						e.preventDefault();
						abort();
					}
				}),
			opts, typeSet, cwdReady, inFocus;
		
		if (isopts.enable) {
			isopts.minlen = isopts.minlen || 2;
			isopts.wait = isopts.wait || 500;
			input
				.attr('title', fm.i18n('incSearchOnly'))
				.on('compositionstart', function() {
					input.data('composing', true);
				})
				.on('compositionend', function() {
					input.removeData('composing');
					input.trigger('input'); // for IE, edge
				})
				.on('input', function() {
					if (! input.data('composing')) {
						input.data('inctm') && clearTimeout(input.data('inctm'));
						input.data('inctm', setTimeout(function() {
							var val = input.val();
							if (val.length === 0 || val.length >= isopts.minlen) {
								(incVal !== val) && fm.trigger('incsearchstart', {
									query: val,
									type: typeSet? typeSet.children('input:checked').val() : 'searchName'
								});
								incVal = val;
								if (val === '' && fm.searchStatus.state > 1 && fm.searchStatus.query) {
									input.val(fm.searchStatus.query).trigger('select');
								} 
							}
						}, isopts.wait));
					}
				});
			
			if (fm.UA.ltIE8) {
				input.on('keydown', function(e) {
						if (e.keyCode === 229) {
							input.data('imetm') && clearTimeout(input.data('imetm'));
							input.data('composing', true);
							input.data('imetm', setTimeout(function() {
								input.removeData('composing');
							}, 100));
						}
					})
					.on('keyup', function(e) {
						input.data('imetm') && clearTimeout(input.data('imetm'));
						if (input.data('composing')) {
							e.keyCode === jQuery.ui.keyCode.ENTER && input.trigger('compositionend');
						} else {
							input.trigger('input');
						}
					});
			}
		}
		
		jQuery('<span class="ui-icon ui-icon-search" title="'+cmd.title+'"></span>')
			.appendTo(button)
			.on('mousedown', function(e) {
				e.stopPropagation();
				e.preventDefault();
				if (button.hasClass('ui-state-active')) {
					search();
				} else {
					input.trigger('focus');
				}
			});
		
		jQuery('<span class="ui-icon ui-icon-close"></span>')
			.appendTo(button)
			.on('mousedown', function(e) {
				e.stopPropagation();
				e.preventDefault();
				if (input.val() === '' && !button.hasClass('ui-state-active')) {
					input.trigger('focus');
				} else {
					abort();
				}
			});
		
		// wait when button will be added to DOM
		fm.bind('toolbarload', function(){
			var parent = button.parent();
			if (parent.length) {
				toolbar.prepend(button.show());
				parent.remove();
				// position icons for ie7
				if (fm.UA.ltIE7) {
					var icon = button.children(fm.direction == 'ltr' ? '.ui-icon-close' : '.ui-icon-search');
					icon.css({
						right : '',
						left  : parseInt(button.width())-icon.outerWidth(true)
					});
				}
			}
		});
		
		fm
			.one('init', function() {
				fm.getUI('cwd').on('touchstart click', function() {
					inFocus && input.trigger('blur');
				});
			})
			.one('open', function() {
				opts = (fm.api < 2.1)? null : jQuery('<div class="ui-front ui-widget ui-widget-content elfinder-button-menu elfinder-button-search-menu ui-corner-all"></div>')
					.append(
						jQuery('<div class="buttonset"></div>')
							.append(
								jQuery('<input id="'+id('SearchFromCwd')+'" name="serchfrom" type="radio" checked="checked"/><label for="'+id('SearchFromCwd')+'">'+fm.i18n('btnCwd')+'</label>'),
								jQuery('<input id="'+id('SearchFromVol')+'" name="serchfrom" type="radio"/><label for="'+id('SearchFromVol')+'">'+fm.i18n('btnVolume')+'</label>'),
								jQuery('<input id="'+id('SearchFromAll')+'" name="serchfrom" type="radio"/><label for="'+id('SearchFromAll')+'">'+fm.i18n('btnAll')+'</label>')
							),
						jQuery('<div class="buttonset elfinder-search-type"></div>')
							.append(
								jQuery('<input id="'+id('SearchName')+'" name="serchcol" type="radio" checked="checked" value="SearchName"/><label for="'+id('SearchName')+'">'+fm.i18n('btnFileName')+'</label>')
							)
					)
					.hide()
					.appendTo(fm.getUI());
				if (opts) {
					if (sTypes) {
						typeSet = opts.find('.elfinder-search-type');
						jQuery.each(cmd.options.searchTypes, function(i, v) {
							typeSet.append(jQuery('<input id="'+id(i)+'" name="serchcol" type="radio" value="'+fm.escape(i)+'"/><label for="'+id(i)+'">'+fm.i18n(v.name)+'</label>'));
						});
					}
					opts.find('div.buttonset').buttonset();
					jQuery('#'+id('SearchFromAll')).next('label').attr('title', fm.i18n('searchTarget', fm.i18n('btnAll')));
					if (sTypes) {
						jQuery.each(sTypes, function(i, v) {
							if (v.title) {
								jQuery('#'+id(i)).next('label').attr('title', fm.i18n(v.title));
							}
						});
					}
					opts.on('mousedown', 'div.buttonset', function(e){
							e.stopPropagation();
							opts.data('infocus', true);
						})
						.on('click', 'input', function(e) {
							e.stopPropagation();
							jQuery.trim(input.val())? search() : input.trigger('focus');
						})
						.on('close', function() {
							input.trigger('blur');
						});
				}
			})
			.bind('searchend', function() {
				input.val('');
			})
			.bind('open parents', function() {
				var dirs    = [],
					volroot = fm.file(fm.root(fm.cwd().hash));
				
				if (volroot) {
					jQuery.each(fm.parents(fm.cwd().hash), function(i, hash) {
						dirs.push(fm.file(hash).name);
					});
		
					jQuery('#'+id('SearchFromCwd')).next('label').attr('title', fm.i18n('searchTarget', dirs.join(fm.option('separator'))));
					jQuery('#'+id('SearchFromVol')).next('label').attr('title', fm.i18n('searchTarget', volroot.name));
				}
			})
			.bind('open', function() {
				incVal && abort();
			})
			.bind('cwdinit', function() {
				cwdReady = false;
			})
			.bind('cwdrender',function() {
				cwdReady = true;
			})
			.bind('keydownEsc', function() {
				if (incVal && incVal.substr(0, 1) === '/') {
					incVal = '';
					input.val('');
					fm.trigger('searchend');
				}
			})
			.shortcut({
				pattern     : 'ctrl+f f3',
				description : cmd.title,
				callback    : function() { 
					input.trigger('select').trigger('focus');
				}
			})
			.shortcut({
				pattern     : 'a b c d e f g h i j k l m n o p q r s t u v w x y z dig0 dig1 dig2 dig3 dig4 dig5 dig6 dig7 dig8 dig9 num0 num1 num2 num3 num4 num5 num6 num7 num8 num9',
				description : fm.i18n('firstLetterSearch'),
				callback    : function(e) { 
					if (! cwdReady) { return; }
					
					var code = e.originalEvent.keyCode,
						next = function() {
							var sel = fm.selected(),
								key = jQuery.ui.keyCode[(!sel.length || fm.cwdHash2Elm(sel[0]).next('[id]').length)? 'RIGHT' : 'HOME'];
							jQuery(document).trigger(jQuery.Event('keydown', { keyCode: key, ctrlKey : false, shiftKey : false, altKey : false, metaKey : false }));
						},
						val;
					if (code >= 96 && code <= 105) {
						code -= 48;
					}
					val = '/' + String.fromCharCode(code);
					if (incVal !== val) {
						input.val(val);
						incVal = val;
						fm
							.trigger('incsearchstart', { query: val })
							.one('cwdrender', next);
					} else{
						next();
					}
				}
			});

	});
};
js/ui/sortbutton.js000064400000007246151215013400010357 0ustar00/**
 * @class  elFinder toolbar button menu with sort variants.
 *
 * @author Dmitry (dio) Levashov
 **/
jQuery.fn.elfindersortbutton = function(cmd) {
	"use strict";
	return this.each(function() {
		var fm       = cmd.fm,
			name     = cmd.name,
			c        = 'class',
			disabled = fm.res(c, 'disabled'),
			hover    = fm.res(c, 'hover'),
			item     = 'elfinder-button-menu-item',
			selected = item+'-selected',
			asc      = selected+'-asc',
			desc     = selected+'-desc',
			text     = jQuery('<span class="elfinder-button-text">'+cmd.title+'</span>'),
			button   = jQuery(this).addClass('ui-state-default elfinder-button elfinder-menubutton elfiner-button-'+name)
				.attr('title', cmd.title)
				.append('<span class="elfinder-button-icon elfinder-button-icon-'+name+'"></span>', text)
				.on('mouseenter mouseleave', function(e) { !button.hasClass(disabled) && button.toggleClass(hover, e.type === 'mouseenter'); })
				.on('click', function(e) {
					if (!button.hasClass(disabled)) {
						e.stopPropagation();
						menu.is(':hidden') && fm.getUI().click();
						menu.css(getMenuOffset()).slideToggle({
							duration: 100,
							done: function(e) {
								fm[menu.is(':visible')? 'toFront' : 'toHide'](menu);
							}
						});
					}
				}),
			hide = function() { fm.toHide(menu); },
			menu = jQuery('<div class="ui-front ui-widget ui-widget-content elfinder-button-menu elfinder-button-sort-menu ui-corner-all"></div>')
				.hide()
				.appendTo(fm.getUI())
				.on('mouseenter mouseleave', '.'+item, function(e) { jQuery(this).toggleClass(hover, e.type === 'mouseenter'); })
				.on('click', function(e) {
					e.preventDefault();
					e.stopPropagation();
				})
				.on('close', hide),
			update = function() {
				menu.children('[rel]').removeClass(selected+' '+asc+' '+desc)
					.filter('[rel="'+fm.sortType+'"]')
					.addClass(selected+' '+(fm.sortOrder == 'asc' ? asc : desc));

				menu.children('.elfinder-sort-stick').toggleClass(selected, fm.sortStickFolders);
				menu.children('.elfinder-sort-tree').toggleClass(selected, fm.sortAlsoTreeview);
			},
			getMenuOffset = function() {
				var baseOffset = fm.getUI().offset(),
					buttonOffset = button.offset();
				return {
					top : buttonOffset.top - baseOffset.top,
					left : buttonOffset.left - baseOffset.left
				};
			},
			tm;
			
		text.hide();
		
		jQuery.each(fm.sortRules, function(name, value) {
			menu.append(jQuery('<div class="'+item+'" rel="'+name+'"><span class="ui-icon ui-icon-arrowthick-1-n"></span><span class="ui-icon ui-icon-arrowthick-1-s"></span>'+fm.i18n('sort'+name)+'</div>').data('type', name));
		});
		
		menu.children().on('click', function(e) {
			cmd.exec([], jQuery(this).removeClass(hover).attr('rel'));
		});
		
		jQuery('<div class="'+item+' '+item+'-separated elfinder-sort-ext elfinder-sort-stick"><span class="ui-icon ui-icon-check"></span>'+fm.i18n('sortFoldersFirst')+'</div>')
			.appendTo(menu)
			.on('click', function() {
				cmd.exec([], 'stick');
			});

		fm.one('init', function() {
			if (fm.ui.tree && fm.options.sortAlsoTreeview !== null) {
				jQuery('<div class="'+item+' '+item+'-separated elfinder-sort-ext elfinder-sort-tree"><span class="ui-icon ui-icon-check"></span>'+fm.i18n('sortAlsoTreeview')+'</div>')
				.appendTo(menu)
				.on('click', function() {
					cmd.exec([], 'tree');
				});
			}
		})
		.bind('disable select', hide)
		.bind('sortchange', update).getUI().on('click', hide);
		
		if (menu.children().length > 1) {
			cmd.change(function() {
					tm && cancelAnimationFrame(tm);
					tm = requestAnimationFrame(function() {
						button.toggleClass(disabled, cmd.disabled());
						update();
					});
				})
				.change();
		} else {
			button.addClass(disabled);
		}

	});
	
};
js/ui/overlay.js000064400000001711151215013400007604 0ustar00
jQuery.fn.elfinderoverlay = function(opts) {
	"use strict";
	var fm = this.parent().elfinder('instance'),
		o, cnt, show, hide;
	
	this.filter(':not(.elfinder-overlay)').each(function() {
		opts = Object.assign({}, opts);
		jQuery(this).addClass('ui-front ui-widget-overlay elfinder-overlay')
			.hide()
			.on('mousedown', function(e) {
				e.preventDefault();
				e.stopPropagation();
			})
			.data({
				cnt  : 0,
				show : typeof(opts.show) == 'function' ? opts.show : function() { },
				hide : typeof(opts.hide) == 'function' ? opts.hide : function() { }
			});
	});
	
	if (opts == 'show') {
		o    = this.eq(0);
		cnt  = o.data('cnt') + 1;
		show = o.data('show');

		fm.toFront(o);
		o.data('cnt', cnt);

		if (o.is(':hidden')) {
			o.show();
			show();
		}
	} 
	
	if (opts == 'hide') {
		o    = this.eq(0);
		cnt  = o.data('cnt') - 1;
		hide = o.data('hide');
		
		o.data('cnt', cnt);
			
		if (cnt <= 0) {
			o.hide();
			hide();
		}
	}
	
	return this;
};
js/ui/stat.js000064400000006626151215013400007110 0ustar00/**
 * @class elFinder ui
 * Display number of files/selected files and its size in statusbar
 *
 * @author Dmitry (dio) Levashov
 **/
jQuery.fn.elfinderstat = function(fm) {
	"use strict";
	return this.each(function() {
		var size       = jQuery(this).addClass('elfinder-stat-size'),
			sel        = jQuery('<div class="elfinder-stat-selected"></div>')
				.on('click', 'a', function(e) {
					var hash = jQuery(this).data('hash');
					e.preventDefault();
					fm.exec('opendir', [ hash ]);
				}),
			titleitems = fm.i18n('items'),
			titlesel   = fm.i18n('selected'),
			titlesize  = fm.i18n('size'),
			setstat    = function(files) {
				var c = 0, 
					s = 0,
					cwd = fm.cwd(),
					calc = true,
					hasSize = true;

				if (cwd.sizeInfo || cwd.size) {
					s = cwd.size;
					calc = false;
				}
				jQuery.each(files, function(i, file) {
					c++;
					if (calc) {
						s += parseInt(file.size) || 0;
						if (hasSize === true && file.mime === 'directory' && !file.sizeInfo) {
							hasSize = false;
						}
					}
				});
				size.html(titleitems+': <span class="elfinder-stat-incsearch"></span>'+c+',&nbsp;<span class="elfinder-stat-size'+(hasSize? ' elfinder-stat-size-recursive' : '')+'">'+fm.i18n(hasSize? 'sum' : 'size')+': '+fm.formatSize(s)+'</span>')
					.attr('title', size.text());
				fm.trigger('uistatchange');
			},
			setIncsearchStat = function(data) {
				size.find('span.elfinder-stat-incsearch').html(data? data.hashes.length + ' / ' : '');
				size.attr('title', size.text());
				fm.trigger('uistatchange');
			},
			setSelect = function(files) {
				var s = 0,
					c = 0,
					dirs = [],
					path, file;

				if (files.length === 1) {
					file = files[0];
					s = file.size;
					if (fm.searchStatus.state === 2) {
						path = fm.escape(file.path? file.path.replace(/\/[^\/]*$/, '') : '..');
						dirs.push('<a href="#elf_'+file.phash+'" data-hash="'+file.hash+'" title="'+path+'">'+path+'</a>');
					}
					dirs.push(fm.escape(file.i18 || file.name));
					sel.html(dirs.join('/') + (s > 0 ? ', '+fm.formatSize(s) : ''));
				} else if (files.length) {
					jQuery.each(files, function(i, file) {
						c++;
						s += parseInt(file.size)||0;
					});
					sel.html(c ? titlesel+': '+c+', '+titlesize+': '+fm.formatSize(s) : '&nbsp;');
				} else {
					sel.html('');
				}
				sel.attr('title', sel.text());
				fm.trigger('uistatchange');
			};

		fm.getUI('statusbar').prepend(size).append(sel).show();
		if (fm.UA.Mobile && jQuery.fn.tooltip) {
			fm.getUI('statusbar').tooltip({
				classes: {
					'ui-tooltip': 'elfinder-ui-tooltip ui-widget-shadow'
				},
				tooltipClass: 'elfinder-ui-tooltip ui-widget-shadow',
				track: true
			});
		}
		
		fm
		.bind('cwdhasheschange', function(e) {
			setstat(jQuery.map(e.data, function(h) { return fm.file(h); }));
		})
		.change(function(e) {
			var files = e.data.changed || [],
				cwdHash = fm.cwd().hash;
			jQuery.each(files, function() {
				if (this.hash === cwdHash) {
					if (this.size) {
						size.children('.elfinder-stat-size').addClass('elfinder-stat-size-recursive').html(fm.i18n('sum')+': '+fm.formatSize(this.size));
						size.attr('title', size.text());
					}
					return false;
				}
			});
		})
		.select(function() {
			setSelect(fm.selectedFiles());
		})
		.bind('open', function() {
			setSelect([]);
		})
		.bind('incsearch', function(e) {
			setIncsearchStat(e.data);
		})
		.bind('incsearchend', function() {
			setIncsearchStat();
		})
		;
	});
};
js/ui/workzone.js000064400000002657151215013400010013 0ustar00/**
 * @class elfinderworkzone - elFinder container for nav and current directory
 * @author Dmitry (dio) Levashov
 **/
jQuery.fn.elfinderworkzone = function(fm) {
	"use strict";
	var cl = 'elfinder-workzone';
	
	this.not('.'+cl).each(function() {
		var wz     = jQuery(this).addClass(cl),
			prevH  = Math.round(wz.height()),
			parent = wz.parent(),
			setDelta = function() {
				wdelta = wz.outerHeight(true) - wz.height();
			},
			fitsize = function(e) {
				var height = parent.height() - wdelta,
					style  = parent.attr('style'),
					curH   = Math.round(wz.height());
	
				if (e) {
					e.preventDefault();
					e.stopPropagation();
				}
				
				parent.css('overflow', 'hidden')
					.children(':visible:not(.'+cl+')').each(function() {
						var ch = jQuery(this);
		
						if (ch.css('position') != 'absolute' && ch.css('position') != 'fixed') {
							height -= ch.outerHeight(true);
						}
					});
				parent.attr('style', style || '');
				
				height = Math.max(0, Math.round(height));
				if (prevH !== height || curH !== height) {
					prevH  = Math.round(wz.height());
					wz.height(height);
					fm.trigger('wzresize');
				}
			},
			cssloaded = function() {
				wdelta = wz.outerHeight(true) - wz.height();
				fitsize();
			},
			wdelta;
		
		setDelta();
		parent.on('resize.' + fm.namespace, fitsize);
		fm.one('cssloaded', cssloaded)
		  .bind('uiresize', fitsize)
		  .bind('themechange', setDelta);
	});
	return this;
};
js/ui/toolbar.js000064400000023562151215013400007575 0ustar00/**
 * @class  elFinder toolbar
 *
 * @author Dmitry (dio) Levashov
 **/
jQuery.fn.elfindertoolbar = function(fm, opts) {
	"use strict";
	this.not('.elfinder-toolbar').each(function() {
		var commands = fm._commands,
			self     = jQuery(this).addClass('ui-helper-clearfix ui-widget-header elfinder-toolbar'),
			options  = {
				// default options
				displayTextLabel: false,
				labelExcludeUA: ['Mobile'],
				autoHideUA: ['Mobile'],
				showPreferenceButton: 'none'
			},
			filter   = function(opts) {
				return jQuery.grep(opts, function(v) {
					if (jQuery.isPlainObject(v)) {
						options = Object.assign(options, v);
						return false;
					}
					return true;
				});
			},
			render = function(disabled){
				var name,cmdPref;
				
				jQuery.each(buttons, function(i, b) { b.detach(); });
				self.empty();
				l = panels.length;
				while (l--) {
					if (panels[l]) {
						panel = jQuery('<div class="ui-widget-content ui-corner-all elfinder-buttonset"></div>');
						i = panels[l].length;
						while (i--) {
							name = panels[l][i];
							if ((!disabled || !disabled[name]) && (cmd = commands[name])) {
								button = 'elfinder'+cmd.options.ui;
								if (! buttons[name] && jQuery.fn[button]) {
									buttons[name] = jQuery('<div></div>')[button](cmd);
								}
								if (buttons[name]) {
									buttons[name].children('.elfinder-button-text')[textLabel? 'show' : 'hide']();
									panel.prepend(buttons[name]);
								}
							}
						}
						
						panel.children().length && self.prepend(panel);
						panel.children(':gt(0)').before('<span class="ui-widget-content elfinder-toolbar-button-separator"></span>');

					}
				}
				
				if (cmdPref = commands['preference']) {
					//cmdPref.state = !self.children().length? 0 : -1;
					if (options.showPreferenceButton === 'always' || (!self.children().length && options.showPreferenceButton === 'auto')) {
						//cmdPref.state = 0;
						panel = jQuery('<div class="ui-widget-content ui-corner-all elfinder-buttonset"></div>');
						name = 'preference';
						button = 'elfinder'+cmd.options.ui;
						buttons[name] = jQuery('<div></div>')[button](cmdPref);
						buttons[name].children('.elfinder-button-text')[textLabel? 'show' : 'hide']();
						panel.prepend(buttons[name]);
						self.append(panel);
					}
				}
				
				(! self.data('swipeClose') && self.children().length)? self.show() : self.hide();
				prevHeight = self[0].clientHeight;
				fm.trigger('toolbarload').trigger('uiresize');
			},
			buttons = {},
			panels   = filter(opts || []),
			dispre   = null,
			uiCmdMapPrev = '',
			prevHeight = 0,
			contextRaw = [],
			l, i, cmd, panel, button, swipeHandle, autoHide, textLabel, resizeTm;
		
		// normalize options
		options.showPreferenceButton = options.showPreferenceButton.toLowerCase();
		
		if (options.displayTextLabel !== 'none') {
			// correction of options.displayTextLabel
			textLabel = fm.storage('toolbarTextLabel');
			if (textLabel === null) {
				textLabel = (options.displayTextLabel && (! options.labelExcludeUA || ! options.labelExcludeUA.length || ! jQuery.grep(options.labelExcludeUA, function(v){ return fm.UA[v]? true : false; }).length));
			} else {
				textLabel = (textLabel == 1);
			}
			contextRaw.push({
				label    : fm.i18n('textLabel'),
				icon     : 'text',
				callback : function() {
					textLabel = ! textLabel;
					self.css('height', '').find('.elfinder-button-text')[textLabel? 'show':'hide']();
					fm.trigger('uiresize').storage('toolbarTextLabel', textLabel? '1' : '0');
				},
			});
		}

		if (options.preferenceInContextmenu && commands['preference']) {
			contextRaw.push({
				label    : fm.i18n('toolbarPref'),
				icon     : 'preference',
				callback : function() {
					fm.exec('preference', void(0), {tab: 'toolbar'});
				}
			});
		}

		// add contextmenu
		if (contextRaw.length) {
			self.on('contextmenu', function(e) {
					e.stopPropagation();
					e.preventDefault();
					fm.trigger('contextmenu', {
						raw: contextRaw,
						x: e.pageX,
						y: e.pageY
					});
				}).on('touchstart', function(e) {
					if (e.originalEvent.touches.length > 1) {
						return;
					}
					self.data('tmlongtap') && clearTimeout(self.data('tmlongtap'));
					self.removeData('longtap')
						.data('longtap', {x: e.originalEvent.touches[0].pageX, y: e.originalEvent.touches[0].pageY})
						.data('tmlongtap', setTimeout(function() {
							self.removeData('longtapTm')
								.trigger({
									type: 'contextmenu',
									pageX: self.data('longtap').x,
									pageY: self.data('longtap').y
								})
								.data('longtap', {longtap: true});
						}, 500));
				}).on('touchmove touchend', function(e) {
					if (self.data('tmlongtap')) {
						if (e.type === 'touchend' ||
								( Math.abs(self.data('longtap').x - e.originalEvent.touches[0].pageX)
								+ Math.abs(self.data('longtap').y - e.originalEvent.touches[0].pageY)) > 4)
						clearTimeout(self.data('tmlongtap'));
						self.removeData('longtapTm');
					}
				}).on('click', function(e) {
					if (self.data('longtap') && self.data('longtap').longtap) {
						e.stopImmediatePropagation();
						e.preventDefault();
					}
				}).on('touchend click', '.elfinder-button', function(e) {
					if (self.data('longtap') && self.data('longtap').longtap) {
						e.stopImmediatePropagation();
						e.preventDefault();
					}
				}
			);
		}

		self.prev().length && self.parent().prepend(this);
		
		render();
		
		fm.bind('open sync select toolbarpref', function() {
			var disabled = Object.assign({}, fm.option('disabledFlip')),
				userHides = fm.storage('toolbarhides'),
				doRender, sel, disabledKeys;
			
			if (! userHides && Array.isArray(options.defaultHides)) {
				userHides = {};
				jQuery.each(options.defaultHides, function() {
					userHides[this] = true;
				});
				fm.storage('toolbarhides', userHides);
			}
			if (this.type === 'select') {
				if (fm.searchStatus.state < 2) {
					return;
				}
				sel = fm.selected();
				if (sel.length) {
					disabled = fm.getDisabledCmds(sel, true);
				}
			}
			
			jQuery.each(userHides, function(n) {
				if (!disabled[n]) {
					disabled[n] = true;
				}
			});
			
			if (Object.keys(fm.commandMap).length) {
				jQuery.each(fm.commandMap, function(from, to){
					if (to === 'hidden') {
						disabled[from] = true;
					}
				});
			}
			
			disabledKeys = Object.keys(disabled);
			if (!dispre || dispre.toString() !== disabledKeys.sort().toString()) {
				render(disabledKeys.length? disabled : null);
				doRender = true;
			}
			dispre = disabledKeys.sort();

			if (doRender || uiCmdMapPrev !== JSON.stringify(fm.commandMap)) {
				uiCmdMapPrev = JSON.stringify(fm.commandMap);
				if (! doRender) {
					// reset toolbar
					jQuery.each(jQuery('div.elfinder-button'), function(){
						var origin = jQuery(this).data('origin');
						if (origin) {
							jQuery(this).after(origin).detach();
						}
					});
				}
				if (Object.keys(fm.commandMap).length) {
					jQuery.each(fm.commandMap, function(from, to){
						var cmd = fm._commands[to],
							button = cmd? 'elfinder'+cmd.options.ui : null,
							btn;
						if (button && jQuery.fn[button]) {
							btn = buttons[from];
							if (btn) {
								if (! buttons[to] && jQuery.fn[button]) {
									buttons[to] = jQuery('<div></div>')[button](cmd);
									if (buttons[to]) {
										buttons[to].children('.elfinder-button-text')[textLabel? 'show' : 'hide']();
										if (cmd.extendsCmd) {
											buttons[to].children('span.elfinder-button-icon').addClass('elfinder-button-icon-' + cmd.extendsCmd);
										}
									}
								}
								if (buttons[to]) {
									btn.after(buttons[to]);
									buttons[to].data('origin', btn.detach());
								}
							}
						}
					});
				}
			}
		}).bind('resize', function(e) {
			resizeTm && cancelAnimationFrame(resizeTm);
			resizeTm = requestAnimationFrame(function() {
				var h = self[0].clientHeight;
				if (prevHeight !== h) {
					prevHeight = h;
					fm.trigger('uiresize');
				}
			});
		});
		
		if (fm.UA.Touch) {
			autoHide = fm.storage('autoHide') || {};
			if (typeof autoHide.toolbar === 'undefined') {
				autoHide.toolbar = (options.autoHideUA && options.autoHideUA.length > 0 && jQuery.grep(options.autoHideUA, function(v){ return fm.UA[v]? true : false; }).length);
				fm.storage('autoHide', autoHide);
			}
			
			if (autoHide.toolbar) {
				fm.one('init', function() {
					fm.uiAutoHide.push(function(){ self.stop(true, true).trigger('toggle', { duration: 500, init: true }); });
				});
			}
			
			fm.bind('load', function() {
				swipeHandle = jQuery('<div class="elfinder-toolbar-swipe-handle"></div>').hide().appendTo(fm.getUI());
				if (swipeHandle.css('pointer-events') !== 'none') {
					swipeHandle.remove();
					swipeHandle = null;
				}
			});
			
			self.on('toggle', function(e, data) {
				var wz    = fm.getUI('workzone'),
					toshow= self.is(':hidden'),
					wzh   = wz.height(),
					h     = self.height(),
					tbh   = self.outerHeight(true),
					delta = tbh - h,
					opt   = Object.assign({
						step: function(now) {
							wz.height(wzh + (toshow? (now + delta) * -1 : h - now));
							fm.trigger('resize');
						},
						always: function() {
							requestAnimationFrame(function() {
								self.css('height', '');
								fm.trigger('uiresize');
								if (swipeHandle) {
									if (toshow) {
										swipeHandle.stop(true, true).hide();
									} else {
										swipeHandle.height(data.handleH? data.handleH : '');
										fm.resources.blink(swipeHandle, 'slowonce');
									}
								}
								toshow && self.scrollTop('0px');
								data.init && fm.trigger('uiautohide');
							});
						}
					}, data);
				self.data('swipeClose', ! toshow).stop(true, true).animate({height : 'toggle'}, opt);
				autoHide.toolbar = !toshow;
				fm.storage('autoHide', Object.assign(fm.storage('autoHide'), {toolbar: autoHide.toolbar}));
			}).on('touchstart', function(e) {
				if (self.scrollBottom() > 5) {
					e.originalEvent._preventSwipeY = true;
				}
			});
		}
	});
	
	return this;
};
js/ui/viewbutton.js000064400000001402151215013400010326 0ustar00/**
 * @class  elFinder toolbar button to switch current directory view.
 *
 * @author Dmitry (dio) Levashov
 **/
jQuery.fn.elfinderviewbutton = function(cmd) {
	"use strict";
	return this.each(function() {
		var button = jQuery(this).elfinderbutton(cmd),
			icon   = button.children('.elfinder-button-icon'),
			text   = button.children('.elfinder-button-text'),
			tm;

		cmd.change(function() {
			tm && cancelAnimationFrame(tm);
			tm = requestAnimationFrame(function() {
				var icons = cmd.value == 'icons';

				icon.toggleClass('elfinder-button-icon-view-list', icons);
				cmd.className = icons? 'view-list' : '';
				cmd.title = cmd.fm.i18n(icons ? 'viewlist' : 'viewicons');
				button.attr('title', cmd.title);
				text.html(cmd.title);
			});
		});
	});
};
js/ui/dialog.js000064400000064317151215013400007375 0ustar00/**
 * @class  elFinder dialog
 *
 * @author Dmitry (dio) Levashov
 **/
 jQuery.fn.elfinderdialog = function(opts, fm) {
	"use strict";
	var platformWin = (window.navigator.platform.indexOf('Win') != -1),
		delta       = {},
		syncSize    = { enabled: false, width: false, height: false, defaultSize: null },
		fitSize     = function(dialog) {
			var opts, node;
			if (syncSize.enabled) {
				node = fm.options.dialogContained? elfNode : jQuery(window);
				opts = {
					maxWidth : syncSize.width?  node.width() - delta.width  : null,
					maxHeight: syncSize.height? node.height() - delta.height : null
				};
				Object.assign(restoreStyle, opts);
				dialog.css(opts).trigger('resize');
				if (dialog.data('hasResizable') && (dialog.resizable('option', 'maxWidth') < opts.maxWidth || dialog.resizable('option', 'maxHeight') < opts.maxHeight)) {
					dialog.resizable('option', opts);
				}
			}
		},
		syncFunc    = function(e) {
			var dialog = e.data;
			syncTm && cancelAnimationFrame(syncTm);
			syncTm = requestAnimationFrame(function() {
				var opts, offset;
				if (syncSize.enabled) {
					fitSize(dialog);
				}
			});
		},
		checkEditing = function() {
			var cldialog = 'elfinder-dialog',
				dialogs = elfNode.children('.' + cldialog + '.' + fm.res('class', 'editing') + ':visible');
			fm[dialogs.length? 'disable' : 'enable']();
		},
		propagationEvents = {},
		syncTm, dialog, elfNode, restoreStyle;
	
	if (fm && fm.ui) {
		elfNode = fm.getUI();
	} else {
		elfNode = this.closest('.elfinder');
		if (! fm) {
			fm = elfNode.elfinder('instance');
		}
	}
	
	if (typeof opts  === 'string') {
		if ((dialog = this.closest('.ui-dialog')).length) {
			if (opts === 'open') {
				if (dialog.css('display') === 'none') {
					// Need dialog.show() and hide() to detect elements size in open() callbacks
					dialog.trigger('posinit').show().trigger('open').hide();
					dialog.fadeIn(120, function() {
						fm.trigger('dialogopened', {dialog: dialog});
					});
				}
			} else if (opts === 'close' || opts === 'destroy') {
				dialog.stop(true);
				if (dialog.is(':visible') || elfNode.is(':hidden')) {
					dialog.trigger('close');
					fm.trigger('dialogclosed', {dialog: dialog});
				}
				if (opts === 'destroy') {
					dialog.remove();
					fm.trigger('dialogremoved', {dialog: dialog});
				} else if (dialog.data('minimized')) {
					dialog.data('minimized').close();
				}
			} else if (opts === 'toTop') {
				dialog.trigger('totop');
				fm.trigger('dialogtotoped', {dialog: dialog});
			} else if (opts === 'posInit') {
				dialog.trigger('posinit');
				fm.trigger('dialogposinited', {dialog: dialog});
			} else if (opts === 'tabstopsInit') {
				dialog.trigger('tabstopsInit');
				fm.trigger('dialogtabstopsinited', {dialog: dialog});
			} else if (opts === 'checkEditing') {
				checkEditing();
			}
		}
		return this;
	}
	
	opts = Object.assign({}, jQuery.fn.elfinderdialog.defaults, opts);
	
	if (opts.allowMinimize && opts.allowMinimize === 'auto') {
		opts.allowMinimize = this.find('textarea,input').length? true : false; 
	}
	opts.openMaximized = opts.allowMinimize && opts.openMaximized;
	if (opts.headerBtnPos && opts.headerBtnPos === 'auto') {
		opts.headerBtnPos = platformWin? 'right' : 'left';
	}
	if (opts.headerBtnOrder && opts.headerBtnOrder === 'auto') {
		opts.headerBtnOrder = platformWin? 'close:maximize:minimize' : 'close:minimize:maximize';
	}
	
	if (opts.modal && opts.allowMinimize) {
		opts.allowMinimize = false;
	}
	
	if (fm.options.dialogContained) {
		syncSize.width = syncSize.height = syncSize.enabled = true;
	} else {
		syncSize.width = (opts.maxWidth === 'window');
		syncSize.height = (opts.maxHeight === 'window');
		if (syncSize.width || syncSize.height) {
			syncSize.enabled = true;
		}
	}

	propagationEvents = fm.arrayFlip(opts.propagationEvents, true);
	
	this.filter(':not(.ui-dialog-content)').each(function() {
		var self       = jQuery(this).addClass('ui-dialog-content ui-widget-content'),
			clactive   = 'elfinder-dialog-active',
			cldialog   = 'elfinder-dialog',
			clnotify   = 'elfinder-dialog-notify',
			clhover    = 'ui-state-hover',
			cltabstop  = 'elfinder-tabstop',
			cl1stfocus = 'elfinder-focus',
			clmodal    = 'elfinder-dialog-modal',
			id         = parseInt(Math.random()*1000000),
			titlebar   = jQuery('<div class="ui-dialog-titlebar ui-widget-header ui-corner-top ui-helper-clearfix"><span class="elfinder-dialog-title">'+opts.title+'</span></div>'),
			buttonset  = jQuery('<div class="ui-dialog-buttonset"></div>'),
			buttonpane = jQuery('<div class=" ui-helper-clearfix ui-dialog-buttonpane ui-widget-content"></div>')
				.append(buttonset),
			btnWidth   = 0,
			btnCnt     = 0,
			tabstops   = jQuery(),
			evCover    = jQuery('<div style="width:100%;height:100%;position:absolute;top:0px;left:0px;"></div>').hide(),
			numberToTel = function() {
				if (opts.optimizeNumber) {
					dialog.find('input[type=number]').each(function() {
						jQuery(this).attr('inputmode', 'numeric');
						jQuery(this).attr('pattern', '[0-9]*');
					});
				}
			},
			tabstopsInit = function() {
				tabstops = dialog.find('.'+cltabstop);
				if (tabstops.length) {
					tabstops.attr('tabindex', '-1');
					if (! tabstops.filter('.'+cl1stfocus).length) {
						buttonset.children('.'+cltabstop+':'+(platformWin? 'first' : 'last')).addClass(cl1stfocus);
					}
				}
			},
			tabstopNext = function(cur) {
				var elms = tabstops.filter(':visible:enabled'),
					node = cur? null : elms.filter('.'+cl1stfocus+':first');
					
				if (! node || ! node.length) {
					node = elms.first();
				}
				if (cur) {
					jQuery.each(elms, function(i, elm) {
						if (elm === cur && elms[i+1]) {
							node = elms.eq(i+1);
							return false;
						}
					});
				}
				return node;
			},
			tabstopPrev = function(cur) {
				var elms = tabstops.filter(':visible:enabled'),
					node = elms.last();
				jQuery.each(elms, function(i, elm) {
					if (elm === cur && elms[i-1]) {
						node = elms.eq(i-1);
						return false;
					}
				});
				return node;
			},
			makeHeaderBtn = function() {
				jQuery.each(opts.headerBtnOrder.split(':').reverse(), function(i, v) {
					headerBtns[v] && headerBtns[v]();
				});
				if (platformWin) {
					titlebar.children('.elfinder-titlebar-button').addClass('elfinder-titlebar-button-right');
				}
			},
			headerBtns = {
				close: function() {
					titlebar.prepend(jQuery('<span class="ui-widget-header ui-dialog-titlebar-close ui-corner-all elfinder-titlebar-button"><span class="ui-icon ui-icon-closethick"></span></span>')
						.on('mousedown touchstart', function(e) {
							e.preventDefault();
							e.stopPropagation();
							self.elfinderdialog('close');
						})
					);
				},
				maximize: function() {
					if (opts.allowMaximize) {
						dialog.on('resize', function(e, data) {
							var full, elm;
							e.preventDefault();
							e.stopPropagation();
							if (data && data.maximize) {
								elm = titlebar.find('.elfinder-titlebar-full');
								full = (data.maximize === 'on');
								elm.children('span.ui-icon')
									.toggleClass('ui-icon-plusthick', ! full)
									.toggleClass('ui-icon-arrowreturnthick-1-s', full);
								if (full) {
									try {
										dialog.hasClass('ui-draggable') && dialog.draggable('disable');
										dialog.hasClass('ui-resizable') && dialog.resizable('disable');
									} catch(e) {}
									self.css('width', '100%').css('height', dialog.height() - dialog.children('.ui-dialog-titlebar').outerHeight(true) - buttonpane.outerHeight(true));
								} else {
									self.attr('style', elm.data('style'));
									elm.removeData('style');
									posCheck();
									try {
										dialog.hasClass('ui-draggable') && dialog.draggable('enable');
										dialog.hasClass('ui-resizable') && dialog.resizable('enable');
									} catch(e) {}
								}
								dialog.trigger('resize', {init: true});
							}
						});
					}
					
				},
				minimize: function() {
					var btn, mnode, doffset;
					if (opts.allowMinimize) {
						btn = jQuery('<span class="ui-widget-header ui-corner-all elfinder-titlebar-button elfinder-titlebar-minimize"><span class="ui-icon ui-icon-minusthick"></span></span>')
							.on('mousedown touchstart', function(e) {
								var $this = jQuery(this),
									tray = fm.getUI('bottomtray'),
									dumStyle = { width: 70, height: 24 },
									dum = jQuery('<div></div>').css(dumStyle).addClass(dialog.get(0).className + ' elfinder-dialog-minimized'),
									close = function() {
										mnode.remove();
										dialog.removeData('minimized').show();
										self.elfinderdialog('close');
									},
									pos = {};
								
								e.preventDefault();
								e.stopPropagation();
								if (!dialog.data('minimized')) {
									// minimize
									doffset = dialog.data('minimized', {
										dialog : function() { return mnode; },
										show : function() { mnode.show(); },
										hide : function() { mnode.hide(); },
										close : close,
										title : function(v) { mnode.children('.ui-dialog-titlebar').children('.elfinder-dialog-title').text(v); }
									}).position();
									mnode = dialog.clone().on('mousedown', function() {
										$this.trigger('mousedown');
									}).removeClass('ui-draggable ui-resizable elfinder-frontmost');
									tray.append(dum);
									Object.assign(pos, dum.offset(), dumStyle);
									dum.remove();
									mnode.height(dialog.height()).children('.ui-dialog-content:first').empty();
									fm.toHide(dialog.before(mnode));
									mnode.children('.ui-dialog-content:first,.ui-dialog-buttonpane,.ui-resizable-handle').remove();
									mnode.find('.elfinder-titlebar-minimize,.elfinder-titlebar-full').remove();
									mnode.find('.ui-dialog-titlebar-close').on('mousedown', function(e) {
										e.stopPropagation();
										e.preventDefault();
										close();
									});
									mnode.animate(pos, function() {
										mnode.attr('style', '')
										.css({ maxWidth: dialog.width() })
										.addClass('elfinder-dialog-minimized')
										.appendTo(tray);
										checkEditing();
										typeof(opts.minimize) === 'function' && opts.minimize.call(self[0]);
									});
								} else {
									//restore
									dialog.removeData('minimized').before(mnode.css(Object.assign({'position': 'absolute'}, mnode.offset())));
									fm.toFront(mnode);
									mnode.animate(Object.assign({ width: dialog.width(), height: dialog.height() }, doffset), function() {
										dialog.show();
										fm.toFront(dialog);
										mnode.remove();
										posCheck();
										checkEditing();
										dialog.trigger('resize', {init: true});
										typeof(opts.minimize) === 'function' && opts.minimize.call(self[0]);
									});
								}
							});
						titlebar.on('dblclick', function(e) {
							jQuery(this).children('.elfinder-titlebar-minimize').trigger('mousedown');
						}).prepend(btn);
						dialog.on('togleminimize', function() {
							btn.trigger('mousedown');
						});
					}
				}
			},
			dialog = jQuery('<div class="ui-front ui-dialog ui-widget ui-widget-content ui-corner-all ui-draggable std42-dialog touch-punch '+cldialog+' '+opts.cssClass+'"></div>')
				.hide()
				.append(self)
				.appendTo(elfNode)
				.draggable({
					containment : fm.options.dialogContained? elfNode : null,
					handle : '.ui-dialog-titlebar',
					start : function() {
						evCover.show();
					},
					drag : function(e, ui) {
						var top = ui.offset.top,
							left = ui.offset.left;
						if (top < 0) {
							ui.position.top = ui.position.top - top;
						}
						if (left < 0) {
							ui.position.left = ui.position.left - left;
						}
						if (fm.options.dialogContained) {
							ui.position.top < 0 && (ui.position.top = 0);
							ui.position.left < 0 && (ui.position.left = 0);
						}
					},
					stop : function(e, ui) {
						evCover.hide();
						dialog.css({height : opts.height});
						self.data('draged', true);
					}
				})
				.css({
					width     : opts.width,
					height    : opts.height,
					minWidth  : opts.minWidth,
					minHeight : opts.minHeight,
					maxWidth  : opts.maxWidth,
					maxHeight : opts.maxHeight
				})
				.on('touchstart touchmove touchend click dblclick mouseup mouseenter mouseleave mouseout mouseover mousemove', function(e) {
					// stopPropagation of user action events
					!propagationEvents[e.type] && e.stopPropagation();
				})
				.on('mousedown', function(e) {
					!propagationEvents[e.type] && e.stopPropagation();
					requestAnimationFrame(function() {
						if (dialog.is(':visible') && !dialog.hasClass('elfinder-frontmost')) {
							toFocusNode = jQuery(':focus');
							if (!toFocusNode.length) {
								toFocusNode = void(0);
							}
							dialog.trigger('totop');
						}
					});
				})
				.on('open', function() {
					dialog.data('margin-y', self.outerHeight(true) - self.height());
					if (syncSize.enabled) {
						if (opts.height && opts.height !== 'auto') {
							dialog.trigger('resize', {init: true});
						}
						if (!syncSize.defaultSize) {
							syncSize.defaultSize = { width: self.width(), height: self.height() };
						}
						fitSize(dialog);
						dialog.trigger('resize').trigger('posinit');
						elfNode.on('resize.'+fm.namespace, dialog, syncFunc);
					}
					
					if (!dialog.hasClass(clnotify)) {
						elfNode.children('.'+cldialog+':visible:not(.'+clnotify+')').each(function() {
							var d     = jQuery(this),
								top   = parseInt(d.css('top')),
								left  = parseInt(d.css('left')),
								_top  = parseInt(dialog.css('top')),
								_left = parseInt(dialog.css('left')),
								ct    = Math.abs(top - _top) < 10,
								cl    = Math.abs(left - _left) < 10;

							if (d[0] != dialog[0] && (ct || cl)) {
								dialog.css({
									top  : ct ? (top + 10) : _top,
									left : cl ? (left + 10) : _left
								});
							}
						});
					} 
					
					if (dialog.data('modal')) {
						dialog.addClass(clmodal);
						fm.getUI('overlay').elfinderoverlay('show');
					}
					
					dialog.trigger('totop');
					
					opts.openMaximized && fm.toggleMaximize(dialog);

					fm.trigger('dialogopen', {dialog: dialog});

					typeof(opts.open) == 'function' && jQuery.proxy(opts.open, self[0])();
					
					if (opts.closeOnEscape) {
						jQuery(document).on('keydown.'+id, function(e) {
							if (e.keyCode == jQuery.ui.keyCode.ESCAPE && dialog.hasClass('elfinder-frontmost')) {
								self.elfinderdialog('close');
							}
						});
					}
					dialog.hasClass(fm.res('class', 'editing')) && checkEditing();
				})
				.on('close', function(e) {
					var dialogs, dfd;
					
					if (opts.beforeclose && typeof opts.beforeclose === 'function') {
						dfd = opts.beforeclose();
						if (!dfd || !dfd.promise) {
							dfd = !dfd? jQuery.Deferred().reject() : jQuery.Deferred().resolve();
						}
					} else {
						dfd = jQuery.Deferred().resolve();
					}
					
					dfd.done(function() {
						syncSize.enabled && elfNode.off('resize.'+fm.namespace, syncFunc);
						
						if (opts.closeOnEscape) {
							jQuery(document).off('keyup.'+id);
						}
						
						if (opts.allowMaximize) {
							fm.toggleMaximize(dialog, false);
						}
						
						fm.toHide(dialog);
						dialog.data('modal') && fm.getUI('overlay').elfinderoverlay('hide');
						
						if (typeof(opts.close) == 'function') {
							jQuery.proxy(opts.close, self[0])();
						}
						if (opts.destroyOnClose && dialog.parent().length) {
							dialog.hide().remove();
						}
						
						// get focus to next dialog
						dialogs = elfNode.children('.'+cldialog+':visible');
						
						dialog.hasClass(fm.res('class', 'editing')) && checkEditing();
					});
				})
				.on('totop frontmost', function() {
					var s = fm.storage('autoFocusDialog');
					
					dialog.data('focusOnMouseOver', s? (s > 0) : fm.options.uiOptions.dialog.focusOnMouseOver);
					
					if (dialog.data('minimized')) {
						titlebar.children('.elfinder-titlebar-minimize').trigger('mousedown');
					}
					
					if (!dialog.data('modal') && fm.getUI('overlay').is(':visible')) {
						fm.getUI('overlay').before(dialog);
					} else {
						fm.toFront(dialog);
					}
					elfNode.children('.'+cldialog+':not(.'+clmodal+')').removeClass(clactive);
					dialog.addClass(clactive);

					! fm.UA.Mobile && (toFocusNode || tabstopNext()).trigger('focus');

					toFocusNode = void(0);
				})
				.on('posinit', function() {
					var css = opts.position,
						nodeOffset, minTop, minLeft, outerSize, win, winSize, nodeFull;
					if (dialog.hasClass('elfinder-maximized')) {
						return;
					}
					if (! css && ! dialog.data('resizing')) {
						nodeFull = elfNode.hasClass('elfinder-fullscreen') || fm.options.enableAlways;
						dialog.css(nodeFull? {
							maxWidth  : '100%',
							maxHeight : '100%',
							overflow   : 'auto'
						} : restoreStyle);
						if (fm.UA.Mobile && !nodeFull && dialog.data('rotated') === fm.UA.Rotated) {
							return;
						}
						dialog.data('rotated', fm.UA.Rotated);
						win = jQuery(window);
						nodeOffset = elfNode.offset();
						outerSize = {
							width : dialog.outerWidth(true),
							height: dialog.outerHeight(true)
						};
						outerSize.right = nodeOffset.left + outerSize.width;
						outerSize.bottom = nodeOffset.top + outerSize.height;
						winSize = {
							scrLeft: win.scrollLeft(),
							scrTop : win.scrollTop(),
							width  : win.width(),
							height : win.height()
						};
						winSize.right = winSize.scrLeft + winSize.width;
						winSize.bottom = winSize.scrTop + winSize.height;
						
						if (fm.options.dialogContained || nodeFull) {
							minTop = 0;
							minLeft = 0;
						} else {
							minTop = nodeOffset.top * -1 + winSize.scrTop;
							minLeft = nodeOffset.left * -1 + winSize.scrLeft;
						}
						css = {
							top  : outerSize.height >= winSize.height? minTop  : Math.max(minTop, parseInt((elfNode.height() - outerSize.height)/2 - 42)),
							left : outerSize.width  >= winSize.width ? minLeft : Math.max(minLeft, parseInt((elfNode.width() - outerSize.width)/2))
						};
						if (outerSize.right + css.left > winSize.right) {
							css.left = Math.max(minLeft, winSize.right - outerSize.right);
						}
						if (outerSize.bottom + css.top > winSize.bottom) {
							css.top = Math.max(minTop, winSize.bottom - outerSize.bottom);
						}
					}
					if (opts.absolute) {
						css.position = 'absolute';
					}
					css && dialog.css(css);
				})
				.on('resize', function(e, data) {
					var oh = 0, init = data && data.init, h, minH, maxH, autoH;
					if ((data && (data.minimize || data.maxmize)) || dialog.data('minimized')) {
						return;
					}
					e.stopPropagation();
					e.preventDefault();
					dialog.children('.ui-widget-header,.ui-dialog-buttonpane').each(function() {
						oh += jQuery(this).outerHeight(true);
					});
					autoH = (opts.height === 'auto')? true : false;
					if (autoH) {
						self.css({'max-height': '', 'height': 'auto'});
					}
					if (!init && syncSize.enabled && !e.originalEvent && !dialog.hasClass('elfinder-maximized')) {
						h = dialog.height();
						minH = dialog.css('min-height') || h;
						maxH = dialog.css('max-height') || h;
						if (minH.match(/%/)) {
							minH = Math.floor((parseInt(minH) / 100) * dialog.parent().height());
						} else {
							minH = parseInt(minH);
						}
						if (maxH.match(/%/)) {
							maxH = Math.floor((parseInt(maxH) / 100) * dialog.parent().height());
						} else {
							maxH = parseInt(maxH);
						}
						h = Math.min((autoH? dialog.height() : syncSize.defaultSize.height), Math.max(maxH, minH) - oh - dialog.data('margin-y'));
					} else {
						h = dialog.height() - oh - dialog.data('margin-y');
					}
					self.css(autoH? 'max-height' : 'height', h);
					if (init) {
						return;
					}
					posCheck();
					minH = self.height();
					minH = (h < minH)? (minH + oh + dialog.data('margin-y')) : opts.minHeight;
					dialog.css('min-height', minH);
					dialog.data('hasResizable') && dialog.resizable('option', { minHeight: minH });
					if (typeof(opts.resize) === 'function') {
						jQuery.proxy(opts.resize, self[0])(e, data);
					}
				})
				.on('tabstopsInit', tabstopsInit)
				.on('focus', '.'+cltabstop, function() {
					jQuery(this).addClass(clhover).parent('label').addClass(clhover);
					this.id && jQuery(this).parent().find('label[for='+this.id+']').addClass(clhover);
				})
				.on('click', 'select.'+cltabstop, function() {
					var node = jQuery(this);
					node.data('keepFocus')? node.removeData('keepFocus') : node.data('keepFocus', true);
				})
				.on('blur', '.'+cltabstop, function() {
					jQuery(this).removeClass(clhover).removeData('keepFocus').parent('label').removeClass(clhover);
					this.id && jQuery(this).parent().find('label[for='+this.id+']').removeClass(clhover);
				})
				.on('mouseenter mouseleave', '.'+cltabstop+',label', function(e) {
					var $this = jQuery(this), labelfor;
					if (this.nodeName === 'LABEL') {
						if (!$this.children('.'+cltabstop).length && (!(labelfor = $this.attr('for')) || !jQuery('#'+labelfor).hasClass(cltabstop))) {
							return;
						}
					}
					if (opts.btnHoverFocus && dialog.data('focusOnMouseOver')) {
						if (e.type === 'mouseenter' && ! jQuery(':focus').data('keepFocus')) {
							$this.trigger('focus');
						}
					} else {
						$this.toggleClass(clhover, e.type == 'mouseenter');
					}
				})
				.on('keydown', '.'+cltabstop, function(e) {
					var $this = jQuery(this),
						esc, move, moveTo;
					if ($this.is(':focus')) {
						esc = e.keyCode === jQuery.ui.keyCode.ESCAPE;
						if (e.keyCode === jQuery.ui.keyCode.ENTER) {
							e.preventDefault();
							$this.trigger('click');
						}  else if (((e.keyCode === jQuery.ui.keyCode.TAB) && e.shiftKey) || e.keyCode === jQuery.ui.keyCode.LEFT || e.keyCode == jQuery.ui.keyCode.UP) {
							move = 'prev';
						}  else if (e.keyCode === jQuery.ui.keyCode.TAB || e.keyCode == jQuery.ui.keyCode.RIGHT || e.keyCode == jQuery.ui.keyCode.DOWN) {
							move = 'next';
						}
						if (move
								&&
							(
								($this.is('textarea') && !(e.ctrlKey || e.metaKey))
									||
								($this.is('select,span.ui-slider-handle') && e.keyCode !== jQuery.ui.keyCode.TAB)
									||
								($this.is('input:not(:checkbox,:radio)') && (!(e.ctrlKey || e.metaKey) && e.keyCode === jQuery.ui.keyCode[move === 'prev'? 'LEFT':'RIGHT']))
							)
						) {
							e.stopPropagation();
							return;
						}
						if (!esc) {
							e.stopPropagation();
						} else if ($this.is('input:not(:checkbox,:radio),textarea')) {
							if ($this.val() !== '') {
								$this.val('');
								e.stopPropagation();
							}
						}
						if (move) {
							e.preventDefault();
							(move === 'prev'? tabstopPrev : tabstopNext)(this).trigger('focus');
						}
					}
				})
				.data({modal: opts.modal}),
			posCheck = function() {
				var node = fm.getUI(),
					pos;
				if (node.hasClass('elfinder-fullscreen')) {
					pos = dialog.position();
					dialog.css('top', Math.max(Math.min(Math.max(pos.top, 0), node.height() - 100), 0));
					dialog.css('left', Math.max(Math.min(Math.max(pos.left, 0), node.width() - 200), 0));
				}
			},
			maxSize, toFocusNode;
		
		dialog.prepend(titlebar);

		makeHeaderBtn();

		jQuery.each(opts.buttons, function(name, cb) {
			var button = jQuery('<button type="button" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only '
					+'elfinder-btncnt-'+(btnCnt++)+' '
					+cltabstop
					+'"><span class="ui-button-text">'+name+'</span></button>')
				.on('click', jQuery.proxy(cb, self[0]));
			if (cb._cssClass) {
				button.addClass(cb._cssClass);
			}
			if (platformWin) {
				buttonset.append(button);
			} else {
				buttonset.prepend(button);
			}
		});
		
		if (buttonset.children().length) {
			dialog.append(buttonpane);
			
			dialog.show();
			buttonpane.find('button').each(function(i, btn) {
				btnWidth += jQuery(btn).outerWidth(true);
			});
			dialog.hide();
			btnWidth += 20;
			
			if (dialog.width() < btnWidth) {
				dialog.width(btnWidth);
			}
		}
		
		dialog.append(evCover);
		
		if (syncSize.enabled) {
			delta.width = dialog.outerWidth(true) - dialog.width() + ((dialog.outerWidth() - dialog.width()) / 2);
			delta.height = dialog.outerHeight(true) - dialog.height() + ((dialog.outerHeight() - dialog.height()) / 2);
		}
		
		if (fm.options.dialogContained) {
			maxSize = {
				maxWidth: elfNode.width() - delta.width,
				maxHeight: elfNode.height() - delta.height
			};
			opts.maxWidth = opts.maxWidth? Math.min(maxSize.maxWidth, opts.maxWidth) : maxSize.maxWidth;
			opts.maxHeight = opts.maxHeight? Math.min(maxSize.maxHeight, opts.maxHeight) : maxSize.maxHeight;
			dialog.css(maxSize);
		}
		
		restoreStyle = {
			maxWidth  : dialog.css('max-width'),
			maxHeight : dialog.css('max-height'),
			overflow   : dialog.css('overflow')
		};
		
		if (opts.resizable) {
			dialog.resizable({
				minWidth   : opts.minWidth,
				minHeight  : opts.minHeight,
				maxWidth   : opts.maxWidth,
				maxHeight  : opts.maxHeight,
				start      : function() {
					evCover.show();
					if (dialog.data('resizing') !== true && dialog.data('resizing')) {
						clearTimeout(dialog.data('resizing'));
					}
					dialog.data('resizing', true);
				},
				stop       : function(e, ui) {
					evCover.hide();
					dialog.data('resizing', setTimeout(function() {
						dialog.data('resizing', false);
					}, 200));
					if (syncSize.enabled) {
						syncSize.defaultSize = { width: self.width(), height: self.height() };
					}
				}
			}).data('hasResizable', true);
		} 
		
		numberToTel();
		
		tabstopsInit();
		
		typeof(opts.create) == 'function' && jQuery.proxy(opts.create, this)();
		
		if (opts.autoOpen) {
			if (opts.open) {
				requestAnimationFrame(function() {
					self.elfinderdialog('open');
				});
			} else {
				self.elfinderdialog('open');
			}
		}

		if (opts.resize) {
			fm.bind('themechange', function() {
				setTimeout(function() {
					dialog.data('margin-y', self.outerHeight(true) - self.height());
					dialog.trigger('resize', {init: true});
				}, 300);
			});
		}
	});
	
	return this;
};

jQuery.fn.elfinderdialog.defaults = {
	cssClass  : '',
	title     : '',
	modal     : false,
	resizable : true,
	autoOpen  : true,
	closeOnEscape : true,
	destroyOnClose : false,
	buttons   : {},
	btnHoverFocus : true,
	position  : null,
	absolute  : false,
	width     : 320,
	height    : 'auto',
	minWidth  : 200,
	minHeight : 70,
	maxWidth  : null,
	maxHeight : null,
	allowMinimize : 'auto',
	allowMaximize : false,
	openMaximized : false,
	headerBtnPos : 'auto',
	headerBtnOrder : 'auto',
	optimizeNumber : true,
	propagationEvents : ['mousemove', 'mouseup']
};js/ui/navbar.js000064400000012337151215013400007402 0ustar00/**
 * @class elfindernav - elFinder container for diretories tree and places
 *
 * @author Dmitry (dio) Levashov
 **/
jQuery.fn.elfindernavbar = function(fm, opts) {
	"use strict";
	this.not('.elfinder-navbar').each(function() {
		var nav    = jQuery(this).hide().addClass('ui-state-default elfinder-navbar'),
			parent = nav.css('overflow', 'hidden').parent(),
			wz     = parent.children('.elfinder-workzone').append(nav),
			ltr    = fm.direction == 'ltr',
			delta, deltaW, handle, swipeHandle, autoHide, setWidth, navdock,
			setWzRect = function() {
				var cwd = fm.getUI('cwd'),
					wz  = fm.getUI('workzone'),
					wzRect = wz.data('rectangle'),
					cwdOffset = cwd.offset();
				wz.data('rectangle', Object.assign(wzRect, { cwdEdge: (fm.direction === 'ltr')? cwdOffset.left : cwdOffset.left + cwd.width() }));
			},
			setDelta = function() {
				nav.css('overflow', 'hidden');
				delta  = Math.round(nav.outerHeight() - nav.height());
				deltaW = Math.round(navdock.outerWidth() - navdock.innerWidth());
				nav.css('overflow', 'auto');
			};

		fm.one('init', function() {
			navdock = fm.getUI('navdock');
			var set = function() {
					setDelta();
					fm.bind('wzresize', function() {
						var navdockH = 0;
						navdock.width(nav.outerWidth() - deltaW);
						if (navdock.children().length > 1) {
							navdockH = navdock.outerHeight(true);
						}
						nav.height(wz.height() - navdockH - delta);
					}).trigger('wzresize');
				};
			if (fm.cssloaded) {
				set();
			} else {
				fm.one('cssloaded', set);
			}
		})
		.one('opendone',function() {
			handle && handle.trigger('resize');
			nav.css('overflow', 'auto');
		}).bind('themechange', setDelta);
		
		if (fm.UA.Touch) {
			autoHide = fm.storage('autoHide') || {};
			if (typeof autoHide.navbar === 'undefined') {
				autoHide.navbar = (opts.autoHideUA && opts.autoHideUA.length > 0 && jQuery.grep(opts.autoHideUA, function(v){ return fm.UA[v]? true : false; }).length);
				fm.storage('autoHide', autoHide);
			}
			
			if (autoHide.navbar) {
				fm.one('init', function() {
					if (nav.children().length) {
						fm.uiAutoHide.push(function(){ nav.stop(true, true).trigger('navhide', { duration: 'slow', init: true }); });
					}
				});
			}
			
			fm.bind('load', function() {
				if (nav.children().length) {
					swipeHandle = jQuery('<div class="elfinder-navbar-swipe-handle"></div>').hide().appendTo(wz);
					if (swipeHandle.css('pointer-events') !== 'none') {
						swipeHandle.remove();
						swipeHandle = null;
					}
				}
			});
			
			nav.on('navshow navhide', function(e, data) {
				var mode     = (e.type === 'navshow')? 'show' : 'hide',
					duration = (data && data.duration)? data.duration : 'fast',
					handleW = (data && data.handleW)? data.handleW : Math.max(50, fm.getUI().width() / 10);
				nav.stop(true, true)[mode]({
					duration: duration,
					step    : function() {
						fm.trigger('wzresize');
					},
					complete: function() {
						if (swipeHandle) {
							if (mode === 'show') {
								swipeHandle.stop(true, true).hide();
							} else {
								swipeHandle.width(handleW? handleW : '');
								fm.resources.blink(swipeHandle, 'slowonce');
							}
						}
						fm.trigger('navbar'+ mode);
						data.init && fm.trigger('uiautohide');
						setWzRect();
					}
				});
				autoHide.navbar = (mode !== 'show');
				fm.storage('autoHide', Object.assign(fm.storage('autoHide'), {navbar: autoHide.navbar}));
			}).on('touchstart', function(e) {
				if (jQuery(this)['scroll' + (fm.direction === 'ltr'? 'Right' : 'Left')]() > 5) {
					e.originalEvent._preventSwipeX = true;
				}
			});
		}
		
		if (! fm.UA.Mobile) {
			handle = nav.resizable({
					handles : ltr ? 'e' : 'w',
					minWidth : opts.minWidth || 150,
					maxWidth : opts.maxWidth || 500,
					resize : function() {
						fm.trigger('wzresize');
					},
					stop : function(e, ui) {
						fm.storage('navbarWidth', ui.size.width);
						setWzRect();
					}
				})
				.on('resize scroll', function(e) {
					var $this = jQuery(this),
						tm = $this.data('posinit');
					e.preventDefault();
					e.stopPropagation();
					if (! ltr && e.type === 'resize') {
						nav.css('left', 0);
					}
					tm && cancelAnimationFrame(tm);
					$this.data('posinit', requestAnimationFrame(function() {
						var offset = (fm.UA.Opera && nav.scrollLeft())? 20 : 2;
						handle.css('top', 0).css({
							top  : parseInt(nav.scrollTop())+'px',
							left : ltr ? 'auto' : parseInt(nav.scrollRight() -  offset) * -1,
							right: ltr ? parseInt(nav.scrollLeft() - offset) * -1 : 'auto'
						});
						if (e.type === 'resize') {
							fm.getUI('cwd').trigger('resize');
						}
					}));
				})
				.children('.ui-resizable-handle').addClass('ui-front');
		}

		if (setWidth = fm.storage('navbarWidth')) {
			nav.width(setWidth);
		} else {
			if (fm.UA.Mobile) {
				fm.one(fm.cssloaded? 'init' : 'cssloaded', function() {
					var set = function() {
						setWidth = nav.parent().width() / 2;
						if (nav.data('defWidth') > setWidth) {
							nav.width(setWidth);
						} else {
							nav.width(nav.data('defWidth'));
						}
						nav.data('width', nav.width());
						fm.trigger('wzresize');
					};
					nav.data('defWidth', nav.width());
					jQuery(window).on('resize.' + fm.namespace, set);
					set();
				});
			}
		}

	});
	
	return this;
};
js/extras/editors.default.js000064400000244433151215013400012122 0ustar00(function(editors, elFinder) {
	if (typeof define === 'function' && define.amd) {
		define(['elfinder'], editors);
	} else if (elFinder) {
		var optEditors = elFinder.prototype._options.commandsOptions.edit.editors;
		elFinder.prototype._options.commandsOptions.edit.editors = optEditors.concat(editors(elFinder));
	}
}(function(elFinder) {
	"use strict";
	var apps = {},
		// get query of getfile
		getfile = window.location.search.match(/getfile=([a-z]+)/),
		useRequire = elFinder.prototype.hasRequire,
		ext2mime = {
			bmp: 'image/x-ms-bmp',
			dng: 'image/x-adobe-dng',
			gif: 'image/gif',
			jpeg: 'image/jpeg',
			jpg: 'image/jpeg',
			pdf: 'application/pdf',
			png: 'image/png',
			ppm: 'image/x-portable-pixmap',
			psd: 'image/vnd.adobe.photoshop',
			pxd: 'image/x-pixlr-data',
			svg: 'image/svg+xml',
			tiff: 'image/tiff',
			webp: 'image/webp',
			xcf: 'image/x-xcf',
			sketch: 'application/x-sketch',
			ico: 'image/x-icon',
			dds: 'image/vnd-ms.dds',
			emf: 'application/x-msmetafile'
		},
		mime2ext,
		getExtention = function(mime, fm, jpeg) {
			if (!mime2ext) {
				mime2ext = fm.arrayFlip(ext2mime);
			}
			var ext = mime2ext[mime] || fm.mimeTypes[mime];
			if (!jpeg) {
				if (ext === 'jpeg') {
					ext = 'jpg';
				}
			} else {
				if (ext === 'jpg') {
					ext = 'jpeg';
				}
			}
			return ext;
		},
		changeImageType = function(src, toMime) {
			var dfd = jQuery.Deferred();
			try {
				var canvas = document.createElement('canvas'),
					ctx = canvas.getContext('2d'),
					img = new Image(),
					conv = function() {
						var url = canvas.toDataURL(toMime),
							mime, m;
						if (m = url.match(/^data:([a-z0-9]+\/[a-z0-9.+-]+)/i)) {
							mime = m[1];
						} else {
							mime = '';
						}
						if (mime.toLowerCase() === toMime.toLowerCase()) {
							dfd.resolve(canvas.toDataURL(toMime), canvas);
						} else {
							dfd.reject();
						}
					};

				img.src = src;
				jQuery(img).on('load', function() {
					try {
						canvas.width = img.width;
						canvas.height = img.height;
						ctx.drawImage(img, 0, 0);
						conv();
					} catch(e) {
						dfd.reject();
					}
				}).on('error', function () {
					dfd.reject();
				});
				return dfd;
			} catch(e) {
				return dfd.reject();
			}
		},
		initImgTag = function(id, file, content, fm) {
			var node = jQuery(this).children('img:first').data('ext', getExtention(file.mime, fm)),
				spnr = jQuery('<div class="elfinder-edit-spinner elfinder-edit-image"></div>')
					.html('<span class="elfinder-spinner-text">' + fm.i18n('ntfloadimg') + '</span><span class="elfinder-spinner"></span>')
					.hide()
					.appendTo(this),
				setup = function() {
					node.attr('id', id+'-img')
						.attr('src', url || content)
						.css({'height':'', 'max-width':'100%', 'max-height':'100%', 'cursor':'pointer'})
						.data('loading', function(done) {
							var btns = node.closest('.elfinder-dialog').find('button,.elfinder-titlebar-button');
							btns.prop('disabled', !done)[done? 'removeClass' : 'addClass']('ui-state-disabled');
							node.css('opacity', done? '' : '0.3');
							spnr[done? 'hide' : 'show']();
							return node;
						});
				},
				url;
			
			if (!content.match(/^data:/)) {
				fm.openUrl(file.hash, false, function(v) {
					url = v;
					node.attr('_src', content);
					setup();
				});
			} else {
				setup();
			}
		},
		imgBase64 = function(node, mime) {
			var style = node.attr('style'),
				img, canvas, ctx, data;
			try {
				// reset css for getting image size
				node.attr('style', '');
				// img node
				img = node.get(0);
				// New Canvas
				canvas = document.createElement('canvas');
				canvas.width  = img.width;
				canvas.height = img.height;
				// restore css
				node.attr('style', style);
				// Draw Image
				canvas.getContext('2d').drawImage(img, 0, 0);
				// To Base64
				data = canvas.toDataURL(mime);
			} catch(e) {
				data = node.attr('src');
			}
			return data;
		},
		iframeClose = function(ifm) {
			var $ifm = jQuery(ifm),
				dfd = jQuery.Deferred().always(function() {
					$ifm.off('load', load);
				}),
				ab = 'about:blank',
				chk = function() {
					tm = setTimeout(function() {
						var src;
						try {
							src = base.contentWindow.location.href;
						} catch(e) {
							src = null;
						}
						if (src === ab) {
							dfd.resolve();
						} else if (--cnt > 0){
							chk();
						} else {
							dfd.reject();
						}
					}, 500);
				},
				load = function() {
					tm && clearTimeout(tm);
					dfd.resolve();
				},
				cnt = 20, // 500ms * 20 = 10sec wait
				tm;
			$ifm.one('load', load);
			ifm.src = ab;
			chk();
			return dfd;
		};
	
	// check getfile callback function
	if (getfile) {
		getfile = getfile[1];
		if (getfile === 'ckeditor') {
			elFinder.prototype._options.getFileCallback = function(file, fm) {
				window.opener.CKEDITOR.tools.callFunction((function() {
					var reParam = new RegExp('(?:[\?&]|&amp;)CKEditorFuncNum=([^&]+)', 'i'),
						match = window.location.search.match(reParam);
					return (match && match.length > 1) ? match[1] : '';
				})(), fm.convAbsUrl(file.url));
				fm.destroy();
				window.close();
			};
		}
	}
	
	// return editors Array
	return [
		{
			// tui.image-editor - https://github.com/nhnent/tui.image-editor
			info : {
				id: 'tuiimgedit',
				name: 'TUI Image Editor',
				iconImg: 'img/editor-icons.png 0 -48',
				dataScheme: true,
				schemeContent: true,
				openMaximized: true,
				canMakeEmpty: false,
				integrate: {
					title: 'TOAST UI Image Editor',
					link: 'http://ui.toast.com/tui-image-editor/'
				}
			},
			// MIME types to accept
			mimes : ['image/jpeg', 'image/png', 'image/gif', 'image/svg+xml', 'image/x-ms-bmp'],
			// HTML of this editor
			html : '<div class="elfinder-edit-imageeditor"><canvas></canvas></div>',
			// called on initialization of elFinder cmd edit (this: this editor's config object)
			setup : function(opts, fm) {
				if (fm.UA.ltIE8 || fm.UA.Mobile) {
					this.disabled = true;
				} else {
					this.opts = Object.assign({
						version: 'v3.14.3'
					}, opts.extraOptions.tuiImgEditOpts || {}, {
						iconsPath : fm.baseUrl + 'img/tui-',
						theme : {}
					});
					if (!fm.isSameOrigin(this.opts.iconsPath)) {
						this.disabled = true;
						fm.debug('warning', 'Setting `commandOptions.edit.extraOptions.tuiImgEditOpts.iconsPath` MUST follow the same origin policy.');
					}
				}
			},
			// Initialization of editing node (this: this editors HTML node)
			init : function(id, file, content, fm) {
				this.data('url', content);
			},
			load : function(base) {
				var self = this,
					fm   = this.fm,
					dfrd = jQuery.Deferred(),
					cdns = fm.options.cdns,
					ver  = self.confObj.opts.version,
					init = function(editor) {
						var $base = jQuery(base),
							bParent = $base.parent(),
							opts = self.confObj.opts,
							iconsPath = opts.iconsPath,
							tmpContainer = jQuery('<div class="tui-image-editor-container">').appendTo(bParent),
							tmpDiv = [
								jQuery('<div class="tui-image-editor-submenu"></div>').appendTo(tmpContainer),
								jQuery('<div class="tui-image-editor-controls"></div>').appendTo(tmpContainer)
							],
							iEditor = new editor(base, {
								includeUI: {
									loadImage: {
										path: $base.data('url'),
										name: self.file.name
									},
									theme: Object.assign(opts.theme, {
										'menu.normalIcon.path': iconsPath + 'icon-d.svg',
										'menu.normalIcon.name': 'icon-d',
										'menu.activeIcon.path': iconsPath + 'icon-b.svg',
										'menu.activeIcon.name': 'icon-b',
										'menu.disabledIcon.path': iconsPath + 'icon-a.svg',
										'menu.disabledIcon.name': 'icon-a',
										'menu.hoverIcon.path': iconsPath + 'icon-c.svg',
										'menu.hoverIcon.name': 'icon-c',
										'submenu.normalIcon.path': iconsPath + 'icon-d.svg',
										'submenu.normalIcon.name': 'icon-d',
										'submenu.activeIcon.path': iconsPath + 'icon-c.svg',
										'submenu.activeIcon.name': 'icon-c'
									}),
									initMenu: 'filter',
									menuBarPosition: 'bottom'
								},
								cssMaxWidth: Math.max(300, bParent.width()),
								cssMaxHeight: Math.max(200, bParent.height() - (tmpDiv[0].height() + tmpDiv[1].height() + 3 /*margin*/)),
								usageStatistics: false
							}),
							canvas = $base.find('canvas:first').get(0),
							zoom = function(v) {
								if (typeof v !== 'undefined') {
									var c = jQuery(canvas),
										w = parseInt(c.attr('width')),
										h = parseInt(c.attr('height')),
										a = w / h,
										mw, mh;
									if (v === 0) {
										mw = w;
										mh = h;
									} else {
										mw = parseInt(c.css('max-width')) + Number(v);
										mh = mw / a;
										if (mw > w && mh > h) {
											mw = w;
											mh = h;
										}
									}
									per.text(Math.round(mw / w * 100) + '%');
									iEditor.resizeCanvasDimension({width: mw, height: mh});
									// continually change more
									if (zoomMore) {
										setTimeout(function() {
											zoomMore && zoom(v);
										}, 50);
									}
								}
							},
							zup = jQuery('<span class="ui-icon ui-icon-plusthick"></span>').data('val', 10),
							zdown = jQuery('<span class="ui-icon ui-icon-minusthick"></span>').data('val', -10),
							per = jQuery('<button></button>').css('width', '4em').text('%').attr('title', '100%').data('val', 0),
							quty, qutyTm, zoomTm, zoomMore;

						tmpContainer.remove();
						$base.removeData('url').data('mime', self.file.mime);
						// jpeg quality controls
						if (self.file.mime === 'image/jpeg') {
							$base.data('quality', fm.storage('jpgQuality') || fm.option('jpgQuality'));
							quty = jQuery('<input type="number" class="ui-corner-all elfinder-resize-quality elfinder-tabstop"/>')
								.attr('min', '1')
								.attr('max', '100')
								.attr('title', '1 - 100')
								.on('change', function() {
									var q = quty.val();
									$base.data('quality', q);
									qutyTm && cancelAnimationFrame(qutyTm);
									qutyTm = requestAnimationFrame(function() {
										canvas.toBlob(function(blob) {
											blob && quty.next('span').text(' (' + fm.formatSize(blob.size) + ')');
										}, 'image/jpeg', Math.max(Math.min(q, 100), 1) / 100);
									});
								})
								.val($base.data('quality'));
							jQuery('<div class="ui-dialog-buttonset elfinder-edit-extras elfinder-edit-extras-quality"></div>')
								.append(
									jQuery('<span>').html(fm.i18n('quality') + ' : '), quty, jQuery('<span></span>')
								)
								.prependTo($base.parent().next());
						} else if (self.file.mime === 'image/svg+xml') {
							$base.closest('.ui-dialog').trigger('changeType', {
								extention: 'png',
								mime : 'image/png',
								keepEditor: true
							});
						}
						// zoom scale controls
						jQuery('<div class="ui-dialog-buttonset elfinder-edit-extras"></div>')
							.append(
								zdown, per, zup
							)
							.attr('title', fm.i18n('scale'))
							.on('click', 'span,button', function() {
								zoom(jQuery(this).data('val'));
							})
							.on('mousedown mouseup mouseleave', 'span', function(e) {
								zoomMore = false;
								zoomTm && clearTimeout(zoomTm);
								if (e.type === 'mousedown') {
									zoomTm = setTimeout(function() {
										zoomMore = true;
										zoom(jQuery(e.target).data('val'));
									}, 500);
								}
							})
							.prependTo($base.parent().next());

						// wait canvas ready
						setTimeout(function() {
							dfrd.resolve(iEditor);
							if (quty) {
								quty.trigger('change');
								iEditor.on('redoStackChanged undoStackChanged', function() {
									quty.trigger('change');
								});
							}
							// show initial scale
							zoom(null);
						}, 100);

						// show color slider (maybe TUI-Image-Editor's bug)
						// see https://github.com/nhn/tui.image-editor/issues/153
						$base.find('.tui-colorpicker-palette-container').on('click', '.tui-colorpicker-palette-preview', function() {
							jQuery(this).closest('.color-picker-control').height('auto').find('.tui-colorpicker-slider-container').toggle();
						});
						$base.on('click', function() {
							$base.find('.tui-colorpicker-slider-container').hide();
						});
					},
					loader;

				if (!self.confObj.editor) {
					loader = jQuery.Deferred();
					fm.loadCss([
						cdns.tui + '/tui-color-picker/latest/tui-color-picker.css',
						cdns.tui + '/tui-image-editor/'+ver+'/tui-image-editor.css'
					]);
					if (fm.hasRequire) {
						require.config({
							paths : {
								'fabric/dist/fabric.require' : cdns.fabric + '/fabric.require.min', // for fabric < 2.0.1
								'fabric' : cdns.fabric + '/fabric.min', // for fabric >= 2.0.1
								'tui-code-snippet' : cdns.tui + '/tui.code-snippet/latest/tui-code-snippet.min',
								'tui-color-picker' : cdns.tui + '/tui-color-picker/latest/tui-color-picker.min',
								'tui-image-editor' : cdns.tui + '/tui-image-editor/'+ver+'/tui-image-editor.min'
							}
						});
						require(['tui-image-editor'], function(ImageEditor) {
							loader.resolve(ImageEditor);
						});
					} else {
						fm.loadScript([
							cdns.fabric + '/fabric.min.js',
							cdns.tui + '/tui.code-snippet/latest/tui-code-snippet.min.js'
						], function() {
							fm.loadScript([
								cdns.tui + '/tui-color-picker/latest/tui-color-picker.min.js'
							], function() {
								fm.loadScript([
									cdns.tui + '/tui-image-editor/'+ver+'/tui-image-editor.min.js'
								], function() {
									loader.resolve(window.tui.ImageEditor);
								}, {
									loadType: 'tag'
								});
							}, {
								loadType: 'tag'
							});
						}, {
							loadType: 'tag'
						});
					}
					loader.done(function(editor) {
						self.confObj.editor = editor;
						init(editor);
					});
				} else {
					init(self.confObj.editor);
				}
				return dfrd;
			},
			getContent : function(base) {
				var editor = this.editor,
					fm = editor.fm,
					$base = jQuery(base),
					quality = $base.data('quality');
				if (editor.instance) {
					if ($base.data('mime') === 'image/jpeg') {
						quality = quality || fm.storage('jpgQuality') || fm.option('jpgQuality');
						quality = Math.max(0.1, Math.min(1, quality / 100));
					}
					return editor.instance.toDataURL({
						format: getExtention($base.data('mime'), fm, true),
						quality: quality
					});
				}
			},
			save : function(base) {
				var $base = jQuery(base),
					quality = $base.data('quality'),
					hash = $base.data('hash'),
					file;
				this.instance.deactivateAll();
				if (typeof quality !== 'undefined') {
					this.fm.storage('jpgQuality', quality);
				}
				if (hash) {
					file = this.fm.file(hash);
					$base.data('mime', file.mime);
				}
			}
		},
		{
			// Photopea advanced image editor
			info : {
				id : 'photopea',
				name : 'Photopea',
				iconImg : 'img/editor-icons.png 0 -160',
				single: true,
				noContent: true,
				arrayBufferContent: true,
				openMaximized: true,
				// Disable file types that cannot be saved on Photopea.
				canMakeEmpty: ['image/jpeg', 'image/png', 'image/gif', 'image/svg+xml', 'image/x-ms-bmp', 'image/tiff', /*'image/x-adobe-dng',*/ 'image/webp', /*'image/x-xcf',*/ 'image/vnd.adobe.photoshop', 'application/pdf', 'image/x-portable-pixmap', 'image/x-sketch', 'image/x-icon', 'image/vnd-ms.dds', /*'application/x-msmetafile'*/],
				integrate: {
					title: 'Photopea',
					link: 'https://www.photopea.com/learn/'
				}
			},
			mimes : ['image/jpeg', 'image/png', 'image/gif', 'image/svg+xml', 'image/x-ms-bmp', 'image/tiff', 'image/x-adobe-dng', 'image/webp', 'image/x-xcf', 'image/vnd.adobe.photoshop', 'application/pdf', 'image/x-portable-pixmap', 'image/x-sketch', 'image/x-icon', 'image/vnd-ms.dds', 'application/x-msmetafile'],
			html : '<iframe style="width:100%;height:100%;border:none;"></iframe>',
			// setup on elFinder bootup
			setup : function(opts, fm) {
				if (fm.UA.IE || fm.UA.Mobile) {
					this.disabled = true;
				}
			},
			// Initialization of editing node (this: this editors HTML node)
			init : function(id, file, dum, fm) {
				var orig = 'https://www.photopea.com',
					ifm = jQuery(this).hide()
						//.css('box-sizing', 'border-box')
						.on('load', function() {
							//spnr.remove();
							ifm.show();
						})
						.on('error', function() {
							spnr.remove();
							ifm.show();
						}),
					editor = this.editor,
					confObj = editor.confObj,
					spnr = jQuery('<div class="elfinder-edit-spinner elfinder-edit-photopea"></div>')
						.html('<span class="elfinder-spinner-text">' + fm.i18n('nowLoading') + '</span><span class="elfinder-spinner"></span>')
						.appendTo(ifm.parent()),
					saveMimes = fm.arrayFlip(confObj.info.canMakeEmpty),
					getType = function(mime) {
						var ext = getExtention(mime, fm),
							extmime = ext2mime[ext];

						if (!confObj.mimesFlip[extmime]) {
							ext = '';
						} else if (ext === 'jpeg') {
							ext = 'jpg';
						}
						if (!ext || !saveMimes[extmime]) {
							ext = 'psd';
							extmime = ext2mime[ext];
							ifm.closest('.ui-dialog').trigger('changeType', {
								extention: ext,
								mime : extmime,
								keepEditor: true
							});
						}
						return ext;
					},
					mime = file.mime,
					liveMsg, type, quty;
				
				if (!confObj.mimesFlip) {
					confObj.mimesFlip = fm.arrayFlip(confObj.mimes, true);
				}
				if (!confObj.liveMsg) {
					confObj.liveMsg = function(ifm, spnr, file) {
						var wnd = ifm.get(0).contentWindow,
							phase = 0,
							data = null,
							dfdIni = jQuery.Deferred().done(function() {
								spnr.remove();
								phase = 1;
								wnd.postMessage(data, orig);
							}),
							dfdGet;

						this.load = function() {
							return fm.getContents(file.hash, 'arraybuffer').done(function(d) {
								data = d;
							});
						};

						this.receive = function(e) {
							var ev = e.originalEvent,
								state;
							if (ev.origin === orig && ev.source === wnd) {
								if (ev.data === 'done') {
									if (phase === 0) {
										dfdIni.resolve();
									} else if (phase === 1) {
										phase = 2;
										ifm.trigger('contentsloaded');
									} else {
										if (dfdGet && dfdGet.state() === 'pending') {
											dfdGet.reject('errDataEmpty');
										}
									}
								} else if (ev.data === 'Save') {
									editor.doSave();
								} else {
									if (dfdGet && dfdGet.state() === 'pending') {
										if (typeof ev.data === 'object') {
											dfdGet.resolve('data:' + mime + ';base64,' + fm.arrayBufferToBase64(ev.data));
										} else {
											dfdGet.reject('errDataEmpty');
										}
									}
								}
							}
						};

						this.getContent = function() {
							var type, q;
							if (phase > 1) {
								dfdGet && dfdGet.state() === 'pending' && dfdGet.reject();
								dfdGet = null;
								dfdGet = jQuery.Deferred();
								if (phase === 2) {
									phase = 3;
									dfdGet.resolve('data:' + mime + ';base64,' + fm.arrayBufferToBase64(data));
									data = null;
									return dfdGet;
								}
								if (ifm.data('mime')) {
									mime = ifm.data('mime');
									type = getType(mime);
								}
								if (q = ifm.data('quality')) {
									type += ':' + (q / 100);
								}
								wnd.postMessage('app.activeDocument.saveToOE("' + type + '")', orig);
								return dfdGet;
							}
						};
					};
				}

				ifm.parent().css('padding', 0);
				type = getType(file.mime);
				liveMsg = editor.liveMsg = new confObj.liveMsg(ifm, spnr, file);
				jQuery(window).on('message.' + fm.namespace, liveMsg.receive);
				liveMsg.load().done(function() {
					var d = JSON.stringify({
						files : [],
						environment : {
							lang: fm.lang.replace(/_/g, '-'),
							customIO: {"save": "app.echoToOE(\"Save\");"}
						}
					});
					ifm.attr('src', orig + '/#' + encodeURI(d));
				}).fail(function(err) {
					err && fm.error(err);
					editor.initFail = true;
				});

				// jpeg quality controls
				if (file.mime === 'image/jpeg' || file.mime === 'image/webp') {
					ifm.data('quality', fm.storage('jpgQuality') || fm.option('jpgQuality'));
					quty = jQuery('<input type="number" class="ui-corner-all elfinder-resize-quality elfinder-tabstop"/>')
						.attr('min', '1')
						.attr('max', '100')
						.attr('title', '1 - 100')
						.on('change', function() {
							var q = quty.val();
							ifm.data('quality', q);
						})
						.val(ifm.data('quality'));
					jQuery('<div class="ui-dialog-buttonset elfinder-edit-extras elfinder-edit-extras-quality"></div>')
						.append(
							jQuery('<span>').html(fm.i18n('quality') + ' : '), quty, jQuery('<span></span>')
						)
						.prependTo(ifm.parent().next());
				}
			},
			load : function(base) {
				var dfd = jQuery.Deferred(),
					self = this,
					fm = this.fm,
					$base = jQuery(base);
				if (self.initFail) {
					dfd.reject();
				} else {
					$base.on('contentsloaded', function() {
						dfd.resolve(self.liveMsg);
					});
				}
				return dfd;
			},
			getContent : function() {
				return this.editor.liveMsg? this.editor.liveMsg.getContent() : void(0);
			},
			save : function(base, liveMsg) {
				var $base = jQuery(base),
					quality = $base.data('quality'),
					hash = $base.data('hash'),
					file;
				if (typeof quality !== 'undefined') {
					this.fm.storage('jpgQuality', quality);
				}
				if (hash) {
					file = this.fm.file(hash);
					$base.data('mime', file.mime);
				} else {
					$base.removeData('mime');
				}
			},
			// On dialog closed
			close : function(base, liveMsg) {
				jQuery(base).attr('src', '');
				liveMsg && jQuery(window).off('message.' + this.fm.namespace, liveMsg.receive);
			}
		},
		{
			// Pixo is cross-platform image editor
			info : {
				id : 'pixo',
				name : 'Pixo Editor',
				iconImg : 'img/editor-icons.png 0 -208',
				dataScheme: true,
				schemeContent: true,
				single: true,
				canMakeEmpty: false,
				integrate: {
					title: 'Pixo Editor',
					link: 'https://pixoeditor.com/privacy-policy/'
				}
			},
			// MIME types to accept
			mimes : ['image/jpeg', 'image/png', 'image/gif', 'image/svg+xml', 'image/x-ms-bmp'],
			// HTML of this editor
			html : '<div class="elfinder-edit-imageeditor"><img/></div>',
			// called on initialization of elFinder cmd edit (this: this editor's config object)
			setup : function(opts, fm) {
				if (fm.UA.ltIE8 || !opts.extraOptions || !opts.extraOptions.pixo || !opts.extraOptions.pixo.apikey) {
					this.disabled = true;
				} else {
					this.editorOpts = opts.extraOptions.pixo;
				}
			},
			// Initialization of editing node (this: this editors HTML node)
			init : function(id, file, content, fm) {
				initImgTag.call(this, id, file, content, fm);
			},
			// Get data uri scheme (this: this editors HTML node)
			getContent : function() {
				return jQuery(this).children('img:first').attr('src');
			},
			// Launch Pixo editor when dialog open
			load : function(base) {
				var self = this,
					fm = this.fm,
					$base = jQuery(base),
					node = $base.children('img:first'),
					dialog = $base.closest('.ui-dialog'),
					elfNode = fm.getUI(),
					dfrd = jQuery.Deferred(),
					container = jQuery('#elfinder-pixo-container'),
					init = function(onload) {
						var opts;
							
						if (!container.length) {
							container = jQuery('<div id="elfinder-pixo-container" class="ui-front"></div>').css({
								position: 'fixed',
								top: 0,
								right: 0,
								width: '100%',
								height: jQuery(window).height(),
								overflow: 'hidden'
							}).hide().appendTo(elfNode.hasClass('elfinder-fullscreen')? elfNode : 'body');
							// bind switch fullscreen event
							elfNode.on('resize.'+fm.namespace, function(e, data) {
								e.preventDefault();
								e.stopPropagation();
								data && data.fullscreen && container.appendTo(data.fullscreen === 'on'? elfNode : 'body');
							});
							fm.bind('destroy', function() {
								editor && editor.cancelEditing();
								container.remove();
							});
						} else {
							// always moves to last
							container.appendTo(container.parent());
						}
						node.on('click', launch);
						// Constructor options
						opts = Object.assign({
							type: 'child',
							parent: container.get(0),
							output: {format: 'png'},
							onSave: function(arg) {
								// Check current file.hash, all callbacks are called on multiple instances
								var mime = arg.toBlob().type,
									ext = getExtention(mime, fm),
									draw = function(url) {
										node.one('load error', function() {
												node.data('loading') && node.data('loading')(true);
											})
											.attr('crossorigin', 'anonymous')
											.attr('src', url);
									},
									url = arg.toDataURL();
								node.data('loading')();
								delete base._canvas;
								if (node.data('ext') !== ext) {
									changeImageType(url, self.file.mime).done(function(res, cv) {
										if (cv) {
											base._canvas = canvas = cv;
											quty.trigger('change');
											qBase && qBase.show();
										}
										draw(res);
									}).fail(function() {
										dialog.trigger('changeType', {
											extention: ext,
											mime : mime
										});
										draw(url);
									});
								} else {
									draw(url);
								}
							},
							onClose: function() {
								dialog.removeClass(fm.res('class', 'preventback'));
								fm.toggleMaximize(container, false);
								container.hide();
								fm.toFront(dialog);
							}
						}, self.confObj.editorOpts);
						// trigger event 'editEditorPrepare'
						self.trigger('Prepare', {
							node: base,
							editorObj: Pixo,
							instance: void(0),
							opts: opts
						});
						// make editor instance
						editor = new Pixo.Bridge(opts);
						dfrd.resolve(editor);
						$base.on('saveAsFail', launch);
						if (onload) {
							onload();
						}
					},
					launch = function() {
						dialog.addClass(fm.res('class', 'preventback'));
						fm.toggleMaximize(container, true);
						fm.toFront(container);
						container.show().data('curhash', self.file.hash);
						editor.edit(node.get(0));
						node.data('loading')(true);
					},
					qBase, quty, qutyTm, canvas, editor;

				node.data('loading')();

				// jpeg quality controls
				if (self.file.mime === 'image/jpeg') {
					quty = jQuery('<input type="number" class="ui-corner-all elfinder-resize-quality elfinder-tabstop"/>')
						.attr('min', '1')
						.attr('max', '100')
						.attr('title', '1 - 100')
						.on('change', function() {
							var q = quty.val();
							qutyTm && cancelAnimationFrame(qutyTm);
							qutyTm = requestAnimationFrame(function() {
								if (canvas) {
									canvas.toBlob(function(blob) {
										blob && quty.next('span').text(' (' + fm.formatSize(blob.size) + ')');
									}, 'image/jpeg', Math.max(Math.min(q, 100), 1) / 100);
								}
							});
						})
						.val(fm.storage('jpgQuality') || fm.option('jpgQuality'));
					qBase = jQuery('<div class="ui-dialog-buttonset elfinder-edit-extras elfinder-edit-extras-quality"></div>')
						.hide()
						.append(
							jQuery('<span>').html(fm.i18n('quality') + ' : '), quty, jQuery('<span></span>')
						)
						.prependTo($base.parent().next());
					$base.data('quty', quty);
				}

				// load script then init
				if (typeof Pixo === 'undefined') {
					fm.loadScript(['https://pixoeditor.com:8443/editor/scripts/bridge.m.js'], function() {
						init(launch);
					}, {loadType: 'tag'});
				} else {
					init();
					launch();
				}
				return dfrd;
			},
			// Convert content url to data uri scheme to save content
			save : function(base) {
				var self = this,
					$base = jQuery(base),
					node = $base.children('img:first'),
					q;
				if (base._canvas) {
					if ($base.data('quty')) {
						q = $base.data('quty').val();
						q && this.fm.storage('jpgQuality', q);
					}
					node.attr('src', base._canvas.toDataURL(self.file.mime, q? Math.max(Math.min(q, 100), 1) / 100 : void(0)));
				} else if (node.attr('src').substr(0, 5) !== 'data:') {
					node.attr('src', imgBase64(node, this.file.mime));
				}
			},
			close : function(base, editor) {
				editor && editor.destroy();
			}
		},
		{
			// ACE Editor
			// called on initialization of elFinder cmd edit (this: this editor's config object)
			setup : function(opts, fm) {
				if (fm.UA.ltIE8 || !fm.options.cdns.ace) {
					this.disabled = true;
				}
			},
			// `mimes` is not set for support everything kind of text file
			info : {
				id : 'aceeditor',
				name : 'ACE Editor',
				iconImg : 'img/editor-icons.png 0 -96'
			},
			load : function(textarea) {
				var self = this,
					fm   = this.fm,
					dfrd = jQuery.Deferred(),
					cdn  = fm.options.cdns.ace,
					start = function() {
						var editor, editorBase, mode,
						ta = jQuery(textarea),
						taBase = ta.parent(),
						dialog = taBase.parent(),
						id = textarea.id + '_ace',
						ext = self.file.name.replace(/^.+\.([^.]+)|(.+)$/, '$1$2').toLowerCase(),
						// MIME/mode map
						mimeMode = {
							'text/x-php'			  : 'php',
							'application/x-php'		  : 'php',
							'text/html'				  : 'html',
							'application/xhtml+xml'	  : 'html',
							'text/javascript'		  : 'javascript',
							'application/javascript'  : 'javascript',
							'text/css'				  : 'css',
							'text/x-c'				  : 'c_cpp',
							'text/x-csrc'			  : 'c_cpp',
							'text/x-chdr'			  : 'c_cpp',
							'text/x-c++'			  : 'c_cpp',
							'text/x-c++src'			  : 'c_cpp',
							'text/x-c++hdr'			  : 'c_cpp',
							'text/x-shellscript'	  : 'sh',
							'application/x-csh'		  : 'sh',
							'text/x-python'			  : 'python',
							'text/x-java'			  : 'java',
							'text/x-java-source'	  : 'java',
							'text/x-ruby'			  : 'ruby',
							'text/x-perl'			  : 'perl',
							'application/x-perl'	  : 'perl',
							'text/x-sql'			  : 'sql',
							'text/xml'				  : 'xml',
							'application/docbook+xml' : 'xml',
							'application/xml'		  : 'xml'
						};

						// set base height
						taBase.height(taBase.height());

						// set basePath of ace
						ace.config.set('basePath', cdn);

						// Base node of Ace editor
						editorBase = jQuery('<div id="'+id+'" style="width:100%; height:100%;"></div>').text(ta.val()).insertBefore(ta.hide());

						// Editor flag
						ta.data('ace', true);

						// Aceeditor instance
						editor = ace.edit(id);

						// Ace editor configure
						editor.$blockScrolling = Infinity;
						editor.setOptions({
							theme: 'ace/theme/monokai',
							fontSize: '14px',
							wrap: true,
						});
						ace.config.loadModule('ace/ext/modelist', function() {
							// detect mode
							mode = ace.require('ace/ext/modelist').getModeForPath('/' + self.file.name).name;
							if (mode === 'text') {
								if (mimeMode[self.file.mime]) {
									mode = mimeMode[self.file.mime];
								}
							}
							// show MIME:mode in title bar
							taBase.prev().children('.elfinder-dialog-title').append(' (' + self.file.mime + ' : ' + mode.split(/[\/\\]/).pop() + ')');
							editor.setOptions({
								mode: 'ace/mode/' + mode
							});
							if (dfrd.state() === 'resolved') {
								dialog.trigger('resize');
							}
						});
						ace.config.loadModule('ace/ext/language_tools', function() {
							ace.require('ace/ext/language_tools');
							editor.setOptions({
								enableBasicAutocompletion: true,
								enableSnippets: true,
								enableLiveAutocompletion: false
							});
						});
						ace.config.loadModule('ace/ext/settings_menu', function() {
							ace.require('ace/ext/settings_menu').init(editor);
						});
						
						// Short cuts
						editor.commands.addCommand({
							name : "saveFile",
							bindKey: {
								win : 'Ctrl-s',
								mac : 'Command-s'
							},
							exec: function(editor) {
								self.doSave();
							}
						});
						editor.commands.addCommand({
							name : "closeEditor",
							bindKey: {
								win : 'Ctrl-w|Ctrl-q',
								mac : 'Command-w|Command-q'
							},
							exec: function(editor) {
								self.doCancel();
							}
						});

						editor.resize();

						// TextArea button and Setting button
						jQuery('<div class="ui-dialog-buttonset"></div>').css('float', 'left')
						.append(
							jQuery('<button></button>').html(self.fm.i18n('TextArea'))
							.button()
							.on('click', function(){
								if (ta.data('ace')) {
									ta.removeData('ace');
									editorBase.hide();
									ta.val(editor.session.getValue()).show().trigger('focus');
									jQuery(this).text('AceEditor');
								} else {
									ta.data('ace', true);
									editorBase.show();
									editor.setValue(ta.hide().val(), -1);
									editor.focus();
									jQuery(this).html(self.fm.i18n('TextArea'));
								}
							})
						)
						.append(
							jQuery('<button>Ace editor setting</button>')
							.button({
								icons: {
									primary: 'ui-icon-gear',
									secondary: 'ui-icon-triangle-1-e'
								},
								text: false
							})
							.on('click', function(){
								editor.showSettingsMenu();
								jQuery('#ace_settingsmenu')
									.css('font-size', '80%')
									.find('div[contains="setOptions"]').hide().end()
									.parent().appendTo(jQuery('#elfinder'));
							})
						)
						.prependTo(taBase.next());

						// trigger event 'editEditorPrepare'
						self.trigger('Prepare', {
							node: textarea,
							editorObj: ace,
							instance: editor,
							opts: {}
						});
						
						//dialog.trigger('resize');
						dfrd.resolve(editor);
					};

				// check ace & start
				if (!self.confObj.loader) {
					self.confObj.loader = jQuery.Deferred();
					self.fm.loadScript([ cdn+'/ace.js' ], function() {
						self.confObj.loader.resolve();
					}, void 0, {obj: window, name: 'ace'});
				}
				self.confObj.loader.done(start);

				return dfrd;
			},
			close : function(textarea, instance) {
				instance && instance.destroy();
			},
			save : function(textarea, instance) {
				instance && jQuery(textarea).data('ace') && (textarea.value = instance.session.getValue());
			},
			focus : function(textarea, instance) {
				instance && jQuery(textarea).data('ace') && instance.focus();
			},
			resize : function(textarea, instance, e, data) {
				instance && instance.resize();
			}
		},
		{
			// CodeMirror
			// called on initialization of elFinder cmd edit (this: this editor's config object)
			setup : function(opts, fm) {
				if (fm.UA.ltIE10 || !fm.options.cdns.codemirror) {
					this.disabled = true;
				}
			},
			// `mimes` is not set for support everything kind of text file
			info : {
				id : 'codemirror',
				name : 'CodeMirror',
				iconImg : 'img/editor-icons.png 0 -176'
			},
			load : function(textarea) {
				var fm = this.fm,
					cmUrl = fm.convAbsUrl(fm.options.cdns.codemirror),
					dfrd = jQuery.Deferred(),
					self = this,
					start = function(CodeMirror) {
						var ta   = jQuery(textarea),
							base = ta.parent(),
							editor, editorBase, opts;
						
						// set base height
						base.height(base.height());
						
						// CodeMirror configure options
						opts = {
							lineNumbers: true,
							lineWrapping: true,
							extraKeys : {
								'Ctrl-S': function() { self.doSave(); },
								'Ctrl-Q': function() { self.doCancel(); },
								'Ctrl-W': function() { self.doCancel(); }
							}
						};

						// trigger event 'editEditorPrepare'
						self.trigger('Prepare', {
							node: textarea,
							editorObj: CodeMirror,
							instance: void(0),
							opts: opts
						});

						// CodeMirror configure
						editor = CodeMirror.fromTextArea(textarea, opts);
						
						// return editor instance
						dfrd.resolve(editor);
						
						// Auto mode set
						var info, m, mode, spec;
						if (! info) {
							info = CodeMirror.findModeByMIME(self.file.mime);
						}
						if (! info && (m = self.file.name.match(/.+\.([^.]+)$/))) {
							info = CodeMirror.findModeByExtension(m[1]);
						}
						if (info) {
							CodeMirror.modeURL = useRequire? 'codemirror/mode/%N/%N.min' : cmUrl + '/mode/%N/%N.min.js';
							mode = info.mode;
							spec = info.mime;
							editor.setOption('mode', spec);
							CodeMirror.autoLoadMode(editor, mode);
							// show MIME:mode in title bar
							base.prev().children('.elfinder-dialog-title').append(' (' + spec + (mode != 'null'? ' : ' + mode : '') + ')');
						}
						
						// editor base node
						editorBase = jQuery(editor.getWrapperElement()).css({
							// fix CSS conflict to SimpleMDE
							padding: 0,
							border: 'none'
						});
						ta.data('cm', true);
						
						// fit height to base
						editorBase.height('100%');
						
						// TextArea button and Setting button
						jQuery('<div class="ui-dialog-buttonset"></div>').css('float', 'left')
						.append(
							jQuery('<button></button>').html(self.fm.i18n('TextArea'))
							.button()
							.on('click', function(){
								if (ta.data('cm')) {
									ta.removeData('cm');
									editorBase.hide();
									ta.val(editor.getValue()).show().trigger('focus');
									jQuery(this).text('CodeMirror');
								} else {
									ta.data('cm', true);
									editorBase.show();
									editor.setValue(ta.hide().val());
									editor.refresh();
									editor.focus();
									jQuery(this).html(self.fm.i18n('TextArea'));
								}
							})
						)
						.prependTo(base.next());
					};
				// load script then start
				if (!self.confObj.loader) {
					self.confObj.loader = jQuery.Deferred();
					if (useRequire) {
						require.config({
							packages: [{
								name: 'codemirror',
								location: cmUrl,
								main: 'codemirror.min'
							}],
							map: {
								'codemirror': {
									'codemirror/lib/codemirror': 'codemirror'
								}
							}
						});
						require([
							'codemirror',
							'codemirror/addon/mode/loadmode.min',
							'codemirror/mode/meta.min'
						], function(CodeMirror) {
							self.confObj.loader.resolve(CodeMirror);
						});
					} else {
						self.fm.loadScript([
							cmUrl + '/codemirror.min.js'
						], function() {
							self.fm.loadScript([
								cmUrl + '/addon/mode/loadmode.min.js',
								cmUrl + '/mode/meta.min.js'
							], function() {
								self.confObj.loader.resolve(CodeMirror);
							});
						}, {loadType: 'tag'});
					}
					self.fm.loadCss(cmUrl + '/codemirror.css');
				}
				self.confObj.loader.done(start);
				return dfrd;
			},
			close : function(textarea, instance) {
				instance && instance.toTextArea();
			},
			save : function(textarea, instance) {
				instance && jQuery(textarea).data('cm') && (textarea.value = instance.getValue());
			},
			focus : function(textarea, instance) {
				instance && jQuery(textarea).data('cm') && instance.focus();
			},
			resize : function(textarea, instance, e, data) {
				instance && instance.refresh();
			}
		},
		{
			// SimpleMDE
			// called on initialization of elFinder cmd edit (this: this editor's config object)
			setup : function(opts, fm) {
				if (fm.UA.ltIE10 || !fm.options.cdns.simplemde) {
					this.disabled = true;
				}
			},
			info : {
				id : 'simplemde',
				name : 'SimpleMDE',
				iconImg : 'img/editor-icons.png 0 -80'
			},
			exts  : ['md'],
			load : function(textarea) {
				var self = this,
					fm   = this.fm,
					base = jQuery(textarea).parent(),
					dfrd = jQuery.Deferred(),
					cdn  = fm.options.cdns.simplemde,
					start = function(SimpleMDE) {
						var h	 = base.height(),
							delta = base.outerHeight(true) - h + 14,
							editor, editorBase, opts;
						
						// fit height function
						textarea._setHeight = function(height) {
							var h	= height || base.height(),
								ctrH = 0,
								areaH;
							base.children('.editor-toolbar,.editor-statusbar').each(function() {
								ctrH += jQuery(this).outerHeight(true);
							});
							areaH = h - ctrH - delta;
							editorBase.height(areaH);
							editor.codemirror.refresh();
							return areaH;
						};
						
						// set base height
						base.height(h);
						
						opts = {
							element: textarea,
							autofocus: true
						};

						// trigger event 'editEditorPrepare'
						self.trigger('Prepare', {
							node: textarea,
							editorObj: SimpleMDE,
							instance: void(0),
							opts: opts
						});

						// make editor
						editor = new SimpleMDE(opts);
						dfrd.resolve(editor);
						
						// editor base node
						editorBase = jQuery(editor.codemirror.getWrapperElement());
						
						// fit height to base
						editorBase.css('min-height', '50px')
							.children('.CodeMirror-scroll').css('min-height', '50px');
						textarea._setHeight(h);
					};

				// check SimpleMDE & start
				if (!self.confObj.loader) {
					self.confObj.loader = jQuery.Deferred();
					self.fm.loadCss(cdn+'/simplemde.min.css');
					if (useRequire) {
						require([
							cdn+'/simplemde.min.js'
						], function(SimpleMDE) {
							self.confObj.loader.resolve(SimpleMDE);
						});
					} else {
						self.fm.loadScript([cdn+'/simplemde.min.js'], function() {
							self.confObj.loader.resolve(SimpleMDE);
						}, {loadType: 'tag'});
					}
				}
				self.confObj.loader.done(start);

				return dfrd;
			},
			close : function(textarea, instance) {
				instance && instance.toTextArea();
				instance = null;
			},
			save : function(textarea, instance) {
				instance && (textarea.value = instance.value());
			},
			focus : function(textarea, instance) {
				instance && instance.codemirror.focus();
			},
			resize : function(textarea, instance, e, data) {
				instance && textarea._setHeight();
			}
		},
		{
			// CKEditor for html file
			info : {
				id : 'ckeditor',
				name : 'CKEditor',
				iconImg : 'img/editor-icons.png 0 0'
			},
			exts  : ['htm', 'html', 'xhtml'],
			setup : function(opts, fm) {
				var confObj = this;
				if (!fm.options.cdns.ckeditor) {
					confObj.disabled = true;
				} else {
					confObj.ckeOpts = {};
					if (opts.extraOptions) {
						confObj.ckeOpts = Object.assign({}, opts.extraOptions.ckeditor || {});
						if (opts.extraOptions.managerUrl) {
							confObj.managerUrl = opts.extraOptions.managerUrl;
						}
					}
				}
			},
			load : function(textarea) {
				var self = this,
					fm   = this.fm,
					dfrd = jQuery.Deferred(),
					init = function() {
						var base = jQuery(textarea).parent(),
							dlg = base.closest('.elfinder-dialog'),
							h = base.height(),
							reg = /([&?]getfile=)[^&]+/,
							loc = self.confObj.managerUrl || window.location.href.replace(/#.*$/, ''),
							name = 'ckeditor',
							opts;
						
						// make manager location
						if (reg.test(loc)) {
							loc = loc.replace(reg, '$1' + name);
						} else {
							loc += '?getfile=' + name;
						}
						// set base height
						base.height(h);

						// CKEditor configure options
						opts = {
							startupFocus : true,
							fullPage: true,
							allowedContent: true,
							filebrowserBrowseUrl : loc,
							toolbarCanCollapse: true,
							toolbarStartupExpanded: !fm.UA.Mobile,
							removePlugins: 'resize',
							extraPlugins: 'colorbutton,justify,docprops',
							on: {
								'instanceReady' : function(e) {
									var editor = e.editor;
									editor.resize('100%', h);
									// re-build on dom move
									dlg.one('beforedommove.'+fm.namespace, function() {
										editor.destroy();
									}).one('dommove.'+fm.namespace, function() {
										self.load(textarea).done(function(editor) {
											self.instance = editor;
										});
									});
									// return editor instance
									dfrd.resolve(e.editor);
								}
							}
						};

						// trigger event 'editEditorPrepare'
						self.trigger('Prepare', {
							node: textarea,
							editorObj: CKEDITOR,
							instance: void(0),
							opts: opts
						});

						// CKEditor configure
						CKEDITOR.replace(textarea.id, Object.assign(opts, self.confObj.ckeOpts));
						CKEDITOR.on('dialogDefinition', function(e) {
							var dlg = e.data.definition.dialog;
							dlg.on('show', function(e) {
								fm.getUI().append(jQuery('.cke_dialog_background_cover')).append(this.getElement().$);
							});
							dlg.on('hide', function(e) {
								jQuery('body:first').append(jQuery('.cke_dialog_background_cover')).append(this.getElement().$);
							});
						});
					};

				if (!self.confObj.loader) {
					self.confObj.loader = jQuery.Deferred();
					window.CKEDITOR_BASEPATH = fm.options.cdns.ckeditor + '/';
					jQuery.getScript(fm.options.cdns.ckeditor + '/ckeditor.js', function() {
						self.confObj.loader.resolve();
					});
				}
				self.confObj.loader.done(init);
				return dfrd;
			},
			close : function(textarea, instance) {
				instance && instance.destroy();
			},
			save : function(textarea, instance) {
				instance && (textarea.value = instance.getData());
			},
			focus : function(textarea, instance) {
				instance && instance.focus();
			},
			resize : function(textarea, instance, e, data) {
				var self;
				if (instance) {
					if (instance.status === 'ready') {
						instance.resize('100%', jQuery(textarea).parent().height());
					}
				}
			}
		},
		{
			// CKEditor5 balloon mode for html file
			info : {
				id : 'ckeditor5',
				name : 'CKEditor5',
				iconImg : 'img/editor-icons.png 0 -16'
			},
			exts : ['htm', 'html', 'xhtml'],
			html : '<div class="edit-editor-ckeditor5"></div>',
			setup : function(opts, fm) {
				var confObj = this;
				// check cdn and ES6 support
				if (!fm.options.cdns.ckeditor5 || typeof window.Symbol !== 'function' || typeof Symbol() !== 'symbol') {
					confObj.disabled = true;
				} else {
					confObj.ckeOpts = {};
					if (opts.extraOptions) {
						// @deprecated option extraOptions.ckeditor5Mode
						if (opts.extraOptions.ckeditor5Mode) {
							confObj.ckeditor5Mode = opts.extraOptions.ckeditor5Mode;
						}
						confObj.ckeOpts = Object.assign({}, opts.extraOptions.ckeditor5 || {});
						if (confObj.ckeOpts.mode) {
							confObj.ckeditor5Mode = confObj.ckeOpts.mode;
							delete confObj.ckeOpts.mode;
						}
						if (opts.extraOptions.managerUrl) {
							confObj.managerUrl = opts.extraOptions.managerUrl;
						}
					}
				}
				fm.bind('destroy', function() {
					confObj.editor = null;
				});
			},
			// Prepare on before show dialog
			prepare : function(base, dialogOpts, file) {
				jQuery(base).height(base.editor.fm.getUI().height() - 100);
			},
			init : function(id, file, data, fm) {
				var m = data.match(/^([\s\S]*<body[^>]*>)([\s\S]+)(<\/body>[\s\S]*)$/i),
					header = '',
					body = '',
					footer ='';
				this.css({
					width: '100%',
					height: '100%',
					'box-sizing': 'border-box'
				});
				if (m) {
					header = m[1];
					body = m[2];
					footer = m[3];
				} else {
					body = data;
				}
				this.data('data', {
					header: header,
					body: body,
					footer: footer
				});
				this._setupSelEncoding(data);
			},
			load : function(editnode) {
				var self = this,
					fm   = this.fm,
					dfrd = jQuery.Deferred(),
					mode = self.confObj.ckeditor5Mode || 'decoupled-document',
					lang = (function() {
						var l = fm.lang.toLowerCase().replace('_', '-');
						if (l.substr(0, 2) === 'zh' && l !== 'zh-cn') {
							l = 'zh';
						}
						return l;
					})(),
					init = function(cEditor) {
						var base = jQuery(editnode).parent(),
							opts;
						
						// set base height
						base.height(fm.getUI().height() - 100);

						// CKEditor5 configure options
						opts = Object.assign({
							toolbar: ["heading", "|", "fontSize", "fontFamily", "|", "bold", "italic", "underline", "strikethrough", "highlight", "|", "alignment", "|", "numberedList", "bulletedList", "blockQuote", "indent", "outdent", "|", "ckfinder", "link", "imageUpload", "insertTable", "mediaEmbed", "|", "undo", "redo"],
							language: lang
						}, self.confObj.ckeOpts);

						// trigger event 'editEditorPrepare'
						self.trigger('Prepare', {
							node: editnode,
							editorObj: cEditor,
							instance: void(0),
							opts: opts
						});

						cEditor
							.create(editnode, opts)
							.then(function(editor) {
								var ckf = editor.commands.get('ckfinder'),
									fileRepo = editor.plugins.get('FileRepository'),
									prevVars = {}, isImage, insertImages;
								if (editor.ui.view.toolbar && (mode === 'classic' || mode === 'decoupled-document')) {
									jQuery(editnode).closest('.elfinder-dialog').children('.ui-widget-header').append(jQuery(editor.ui.view.toolbar.element).css({marginRight:'-1em',marginLeft:'-1em'}));
								}
								if (mode === 'classic') {
									jQuery(editnode).closest('.elfinder-edit-editor').css('overflow', 'auto');
								}
								// Set up this elFinder instead of CKFinder
								if (ckf) {
									isImage = function(f) {
										return f && f.mime.match(/^image\//i);
									};
									insertImages = function(urls) {
										var imgCmd = editor.commands.get('imageUpload');
										if (!imgCmd.isEnabled) {
											var ntf = editor.plugins.get('Notification'),
												i18 = editor.locale.t;
											ntf.showWarning(i18('Could not insert image at the current position.'), {
												title: i18('Inserting image failed'),
												namespace: 'ckfinder'
											});
											return;
										}
										editor.execute('imageInsert', { source: urls });
									};
									// Take over ckfinder execute()
									ckf.execute = function() {
										var dlg = base.closest('.elfinder-dialog'),
											gf = fm.getCommand('getfile'),
											rever = function() {
												if (prevVars.hasVar) {
													dlg.off('resize close', rever);
													gf.callback = prevVars.callback;
													gf.options.folders = prevVars.folders;
													gf.options.multiple = prevVars.multi;
													fm.commandMap.open = prevVars.open;
													prevVars.hasVar = false;
												}
											};
										dlg.trigger('togleminimize').one('resize close', rever);
										prevVars.callback = gf.callback;
										prevVars.folders = gf.options.folders;
										prevVars.multi = gf.options.multiple;
										prevVars.open = fm.commandMap.open;
										prevVars.hasVar = true;
										gf.callback = function(files) {
											var imgs = [];
											if (files.length === 1 && files[0].mime === 'directory') {
												fm.one('open', function() {
													fm.commandMap.open = 'getfile';
												}).getCommand('open').exec(files[0].hash);
												return;
											}
											fm.getUI('cwd').trigger('unselectall');
											jQuery.each(files, function(i, f) {
												if (isImage(f)) {
													imgs.push(fm.convAbsUrl(f.url));
												} else {
													editor.execute('link', fm.convAbsUrl(f.url));
												}
											});
											if (imgs.length) {
												insertImages(imgs);
											}
											dlg.trigger('togleminimize');
										};
										gf.options.folders = true;
										gf.options.multiple = true;
										fm.commandMap.open = 'getfile';
										fm.toast({
											mode: 'info',
											msg: fm.i18n('dblclickToSelect')
										});
									};
								}
								// Set up image uploader
								fileRepo.createUploadAdapter = function(loader) {
									return new uploder(loader);
								};
								editor.setData(jQuery(editnode).data('data').body);
								// move .ck-body to elFinder node for fullscreen mode
								fm.getUI().append(jQuery('body > div.ck-body'));
								jQuery('div.ck-balloon-panel').css({
									'z-index': fm.getMaximizeCss().zIndex + 1
								});
								dfrd.resolve(editor);
								/*fm.log({
									defaultConfig: cEditor.defaultConfig,
									plugins: cEditor.builtinPlugins.map(function(p) { return p.pluginName; }),
									toolbars: Array.from(editor.ui.componentFactory.names())
								});*/
							})
							['catch'](function(error) { // ['cache'] instead .cache for fix error on ie8 
								fm.error(error);
							});
					},
					uploder = function(loader) {
						var upload = function(file, resolve, reject) {
							fm.exec('upload', {files: [file]}, void(0), fm.cwd().hash)
								.done(function(data){
									if (data.added && data.added.length) {
										fm.url(data.added[0].hash, { async: true }).done(function(url) {
											resolve({
												'default': fm.convAbsUrl(url)
											});
										}).fail(function() {
											reject('errFileNotFound');
										});
									} else {
										reject(fm.i18n(data.error? data.error : 'errUpload'));
									}
								})
								.fail(function(err) {
									var error = fm.parseError(err);
									reject(fm.i18n(error? (error === 'userabort'? 'errAbort' : error) : 'errUploadNoFiles'));
								})
								.progress(function(data) {
									loader.uploadTotal = data.total;
									loader.uploaded = data.progress;
								});
						};
						this.upload = function() {
							return new Promise(function(resolve, reject) {
								if (loader.file instanceof Promise || (loader.file && typeof loader.file.then === 'function')) {
									loader.file.then(function(file) {
										upload(file, resolve, reject);
									});
								} else {
									upload(loader.file, resolve, reject);
								}
							});
						};
						this.abort = function() {
							fm.getUI().trigger('uploadabort');
						};
					}, loader;

				if (!self.confObj.editor) {
					loader = jQuery.Deferred();
					self.fm.loadScript([
						fm.options.cdns.ckeditor5 + '/' + mode + '/ckeditor.js'
					], function(editor) {
						if (!editor) {
							editor = window.BalloonEditor || window.InlineEditor || window.ClassicEditor || window.DecoupledEditor;
						}
						if (fm.lang !== 'en') {
							self.fm.loadScript([
								fm.options.cdns.ckeditor5 + '/' + mode + '/translations/' + lang + '.js'
							], function(obj) {
								loader.resolve(editor);
							}, {
								tryRequire: true,
								loadType: 'tag',
								error: function(obj) {
									lang = 'en';
									loader.resolve(editor);
								}
							});
						} else {
							loader.resolve(editor);
						}
					}, {
						tryRequire: true,
						loadType: 'tag'
					});
					loader.done(function(editor) {
						self.confObj.editor = editor;
						init(editor);
					});
				} else {
					init(self.confObj.editor);
				}
				return dfrd;
			},
			getContent : function() {
				var data = jQuery(this).data('data');
				return data.header + data.body + data.footer;
			},
			close : function(editnode, instance) {
				instance && instance.destroy();
			},
			save : function(editnode, instance) {
				var elm = jQuery(editnode),
					data = elm.data('data');
				if (instance) {
					data.body = instance.getData();
					elm.data('data', data);
				}
			},
			focus : function(editnode, instance) {
				jQuery(editnode).trigger('focus');
			}
		},
		{
			// TinyMCE for html file
			info : {
				id : 'tinymce',
				name : 'TinyMCE',
				iconImg : 'img/editor-icons.png 0 -64'
			},
			exts  : ['htm', 'html', 'xhtml'],
			setup : function(opts, fm) {
				var confObj = this;
				if (!fm.options.cdns.tinymce) {
					confObj.disabled = true;
				} else {
					confObj.mceOpts = {};
					if (opts.extraOptions) {
						confObj.uploadOpts = Object.assign({}, opts.extraOptions.uploadOpts || {});
						confObj.mceOpts = Object.assign({}, opts.extraOptions.tinymce || {});
					} else {
						confObj.uploadOpts = {};
					}
				}
			},
			load : function(textarea) {
				var self = this,
					fm   = this.fm,
					dfrd = jQuery.Deferred(),
					init = function() {
						var base = jQuery(textarea).show().parent(),
							dlg = base.closest('.elfinder-dialog'),
							h = base.height(),
							delta = base.outerHeight(true) - h,
							// hide MCE dialog and modal block
							hideMceDlg = function() {
								var mceW;
								if (tinymce.activeEditor.windowManager.windows) {
									mceW = tinymce.activeEditor.windowManager.windows[0];
									mceDlg = jQuery(mceW? mceW.getEl() : void(0)).hide();
									mceCv = jQuery('#mce-modal-block').hide();
								} else {
									mceDlg = jQuery('.tox-dialog-wrap').hide();
								}
							},
							// Show MCE dialog and modal block
							showMceDlg = function() {
								mceCv && mceCv.show();
								mceDlg && mceDlg.show();
							},
							tVer = tinymce.majorVersion,
							opts, mceDlg, mceCv;

						// set base height
						base.height(h);
						// fit height function
						textarea._setHeight = function(height) {
							if (tVer < 5) {
								var base = jQuery(this).parent(),
									h = height || base.innerHeight(),
									ctrH = 0,
									areaH;
								base.find('.mce-container-body:first').children('.mce-top-part,.mce-statusbar').each(function() {
									ctrH += jQuery(this).outerHeight(true);
								});
								areaH = h - ctrH - delta;
								base.find('.mce-edit-area iframe:first').height(areaH);
							}
						};

						// TinyMCE configure options
						opts = {
							selector: '#' + textarea.id,
							resize: false,
							plugins: 'print preview fullpage searchreplace autolink directionality visualblocks visualchars fullscreen image link media template codesample table charmap hr pagebreak nonbreaking anchor toc insertdatetime advlist lists wordcount imagetools textpattern help',
							toolbar: 'formatselect | bold italic strikethrough forecolor backcolor | link image media | alignleft aligncenter alignright alignjustify | numlist bullist outdent indent | removeformat',
							image_advtab: true,
							init_instance_callback : function(editor) {
								// fit height on init
								textarea._setHeight(h);
								// re-build on dom move
								dlg.one('beforedommove.'+fm.namespace, function() {
									tinymce.execCommand('mceRemoveEditor', false, textarea.id);
								}).one('dommove.'+fm.namespace, function() {
									self.load(textarea).done(function(editor) {
										self.instance = editor;
									});
								});
								// return editor instance
								dfrd.resolve(editor);
							},
							file_picker_callback : function (callback, value, meta) {
								var gf = fm.getCommand('getfile'),
									revar = function() {
										if (prevVars.hasVar) {
											gf.callback = prevVars.callback;
											gf.options.folders = prevVars.folders;
											gf.options.multiple = prevVars.multi;
											fm.commandMap.open = prevVars.open;
											prevVars.hasVar = false;
										}
										dlg.off('resize close', revar);
										showMceDlg();
									},
									prevVars = {};
								prevVars.callback = gf.callback;
								prevVars.folders = gf.options.folders;
								prevVars.multi = gf.options.multiple;
								prevVars.open = fm.commandMap.open;
								prevVars.hasVar = true;
								gf.callback = function(file) {
									var url, info;

									if (file.mime === 'directory') {
										fm.one('open', function() {
											fm.commandMap.open = 'getfile';
										}).getCommand('open').exec(file.hash);
										return;
									}

									// URL normalization
									url = fm.convAbsUrl(file.url);
									
									// Make file info
									info = file.name + ' (' + fm.formatSize(file.size) + ')';

									// Provide file and text for the link dialog
									if (meta.filetype == 'file') {
										callback(url, {text: info, title: info});
									}

									// Provide image and alt text for the image dialog
									if (meta.filetype == 'image') {
										callback(url, {alt: info});
									}

									// Provide alternative source and posted for the media dialog
									if (meta.filetype == 'media') {
										callback(url);
									}
									dlg.trigger('togleminimize');
								};
								gf.options.folders = true;
								gf.options.multiple = false;
								fm.commandMap.open = 'getfile';
								
								hideMceDlg();
								dlg.trigger('togleminimize').one('resize close', revar);
								fm.toast({
									mode: 'info',
									msg: fm.i18n('dblclickToSelect')
								});

								return false;
							},
							images_upload_handler : function (blobInfo, success, failure) {
								var file = blobInfo.blob(),
									err = function(e) {
										var dlg = e.data.dialog || {};
		                                if (dlg.hasClass('elfinder-dialog-error') || dlg.hasClass('elfinder-confirm-upload')) {
		                                    hideMceDlg();
		                                    dlg.trigger('togleminimize').one('resize close', revert);
		                                    fm.unbind('dialogopened', err);
		                                }
									},
									revert = function() {
										dlg.off('resize close', revert);
										showMceDlg();
									},
									clipdata = true;

								// check file object
								if (file.name) {
									// file blob of client side file object
									clipdata = void(0);
								}
								fm.bind('dialogopened', err).exec('upload', Object.assign({
									files: [file],
									clipdata: clipdata // to get unique name on connector
								}, self.confObj.uploadOpts), void(0), fm.cwd().hash).done(function(data) {
									if (data.added && data.added.length) {
										fm.url(data.added[0].hash, { async: true }).done(function(url) {
											showMceDlg();
											success(fm.convAbsUrl(url));
										}).fail(function() {
											failure(fm.i18n('errFileNotFound'));
										});
									} else {
										failure(fm.i18n(data.error? data.error : 'errUpload'));
									}
								}).fail(function(err) {
									var error = fm.parseError(err);
									if (error) {
										if (error === 'errUnknownCmd') {
											error = 'errPerm';
										} else if (error === 'userabort') {
											error = 'errAbort';
										}
									}
									failure(fm.i18n(error? error : 'errUploadNoFiles'));
								});
							}
						};

						// TinyMCE 5 supports "height: 100%"
						if (tVer >= 5) {
							opts.height = '100%';
						}

						// trigger event 'editEditorPrepare'
						self.trigger('Prepare', {
							node: textarea,
							editorObj: tinymce,
							instance: void(0),
							opts: opts
						});

						// TinyMCE configure
						tinymce.init(Object.assign(opts, self.confObj.mceOpts));
					};
				
				if (!self.confObj.loader) {
					self.confObj.loader = jQuery.Deferred();
					self.fm.loadScript([fm.options.cdns.tinymce + (fm.options.cdns.tinymce.match(/\.js/)? '' : '/tinymce.min.js')], function() {
						self.confObj.loader.resolve();
					}, {
						loadType: 'tag'
					});
				}
				self.confObj.loader.done(init);
				return dfrd;
			},
			close : function(textarea, instance) {
				instance && tinymce.execCommand('mceRemoveEditor', false, textarea.id);
			},
			save : function(textarea, instance) {
				instance && instance.save();
			},
			focus : function(textarea, instance) {
				instance && instance.focus();
			},
			resize : function(textarea, instance, e, data) {
				// fit height to base node on dialog resize
				instance && textarea._setHeight();
			}
		},
		{
			info : {
				id : 'zohoeditor',
				name : 'Zoho Editor',
				iconImg : 'img/editor-icons.png 0 -32',
				cmdCheck : 'ZohoOffice',
				preventGet: true,
				hideButtons: true,
				syncInterval : 15000,
				canMakeEmpty: true,
				integrate: {
					title: 'Zoho Office API',
					link: 'https://www.zoho.com/officeapi/'
				}
			},
			mimes : [
				'application/msword',
				'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
				//'application/pdf',
				'application/vnd.oasis.opendocument.text',
				'application/rtf',
				'text/html',
				'application/vnd.ms-excel',
				'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
				'application/vnd.oasis.opendocument.spreadsheet',
				'application/vnd.sun.xml.calc',
				'text/csv',
				'text/tab-separated-values',
				'application/vnd.ms-powerpoint',
				'application/vnd.openxmlformats-officedocument.presentationml.presentation',
				'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
				'application/vnd.oasis.opendocument.presentation',
				'application/vnd.sun.xml.impress'
			],
			html : '<iframe style="width:100%;max-height:100%;border:none;"></iframe>',
			// setup on elFinder bootup
			setup : function(opts, fm) {
				if (fm.UA.Mobile || fm.UA.ltIE8) {
					this.disabled = true;
				}
			},
			// Prepare on before show dialog
			prepare : function(base, dialogOpts, file) {
				var elfNode = base.editor.fm.getUI();
				jQuery(base).height(elfNode.height());
				dialogOpts.width = Math.max(dialogOpts.width || 0, elfNode.width() * 0.8);
			},
			// Initialization of editing node (this: this editors HTML node)
			init : function(id, file, dum, fm) {
				var ta = this,
					ifm = jQuery(this).hide(),
					uiToast = fm.getUI('toast'),
					spnr = jQuery('<div class="elfinder-edit-spinner elfinder-edit-zohoeditor"></div>')
						.html('<span class="elfinder-spinner-text">' + fm.i18n('nowLoading') + '</span><span class="elfinder-spinner"></span>')
						.appendTo(ifm.parent()),
					cdata = function() {
						var data = '';
						jQuery.each(fm.customData, function(key, val) {
							data += '&' + encodeURIComponent(key) + '=' + encodeURIComponent(val);
						});
						return data;
					};
				
				jQuery(ta).data('xhr', fm.request({
					data: {
						cmd: 'editor',
						name: ta.editor.confObj.info.cmdCheck,
						method: 'init',
						'args[target]': file.hash,
						'args[lang]' : fm.lang,
						'args[cdata]' : cdata()
					},
					preventDefault : true
				}).done(function(data) {
					var opts;
					if (data.zohourl) {
						opts = {
							css: {
								height: '100%'
							}
						};
						// trigger event 'editEditorPrepare'
						ta.editor.trigger('Prepare', {
							node: ta,
							editorObj: void(0),
							instance: ifm,
							opts: opts
						});

						ifm.attr('src', data.zohourl).show().css(opts.css);
						if (data.warning) {
							uiToast.appendTo(ta.closest('.ui-dialog'));
							fm.toast({
								msg: fm.i18n(data.warning),
								mode: 'warning',
								timeOut: 0,
								onHidden: function() {
									uiToast.children().length === 1 && uiToast.appendTo(fm.getUI());
								},
								button: {
									text: 'btnYes'
								}
							});
						}
					} else {
						data.error && fm.error(data.error);
						ta.elfinderdialog('destroy');
					}
				}).fail(function(error) {
					error && fm.error(error);
					ta.elfinderdialog('destroy');
				}).always(function() {
					spnr.remove();
				}));
			},
			load : function() {},
			getContent : function() {},
			save : function() {},
			// Before dialog close
			beforeclose : iframeClose,
			// On dialog closed
			close : function(ta) {
				var fm = this.fm,
					xhr = jQuery(ta).data('xhr');
				if (xhr.state() === 'pending') {
					xhr.reject();
				}
			}
		},
		{
			// Zip Archive with FlySystem
			info : {
				id : 'ziparchive',
				name : 'btnMount',
				iconImg : 'img/toolbar.png 0 -416',
				cmdCheck : 'ZipArchive',
				edit : function(file, editor) {
					var fm = this,
						dfrd = jQuery.Deferred();
					fm.request({
						data:{
							cmd: 'netmount',
							protocol: 'ziparchive',
							host: file.hash,
							path: file.phash
						},
						preventFail: true,
						notify : {type : 'netmount', cnt : 1, hideCnt : true}
					}).done(function(data) {
						var pdir;
						if (data.added && data.added.length) {
							if (data.added[0].phash) {
								if (pdir = fm.file(data.added[0].phash)) {
									if (! pdir.dirs) {
										pdir.dirs = 1;
										fm.change({ changed: [ pdir ] });
									}
								}
							}
							fm.one('netmountdone', function() {
								fm.exec('open', data.added[0].hash);
								fm.one('opendone', function() {
									data.toast && fm.toast(data.toast);
								});
							});
						}
						dfrd.resolve();
					})
					.fail(function(error) {
						dfrd.reject(error);
					});
					return dfrd;
				}
			},
			mimes : ['application/zip'],
			load : function() {},
			save : function(){}
		},
		{
			// Simple Text (basic textarea editor)
			info : {
				id : 'textarea',
				name : 'TextArea',
				useTextAreaEvent : true
			},
			load : function(textarea) {
				// trigger event 'editEditorPrepare'
				this.trigger('Prepare', {
					node: textarea,
					editorObj: void(0),
					instance: void(0),
					opts: {}
				});
				textarea.setSelectionRange && textarea.setSelectionRange(0, 0);
				jQuery(textarea).trigger('focus').show();
			},
			save : function(){}
		},
		{
			// File converter with online-convert.com
			info : {
				id : 'onlineconvert',
				name : 'Online Convert',
				iconImg : 'img/editor-icons.png 0 -144',
				cmdCheck : 'OnlineConvert',
				preventGet: true,
				hideButtons: true,
				single: true,
				converter: true,
				canMakeEmpty: false,
				integrate: {
					title: 'ONLINE-CONVERT.COM',
					link: 'https://online-convert.com'
				}
			},
			mimes : ['*'],
			html : '<div style="width:100%;max-height:100%;"></div>',
			// setup on elFinder bootup
			setup : function(opts, fm) {
				var mOpts = opts.extraOptions.onlineConvert || {maxSize:100,showLink:true};
				if (mOpts.maxSize) {
					this.info.maxSize = mOpts.maxSize * 1048576;
				}
				this.set = Object.assign({
					url : 'https://%s.online-convert.com%s?external_url=',
					conv : {
						Archive: {'7Z':{}, 'BZ2':{ext:'bz'}, 'GZ':{}, 'ZIP':{}},
						Audio: {'MP3':{}, 'OGG':{ext:'oga'}, 'WAV':{}, 'WMA':{}, 'AAC':{}, 'AIFF':{ext:'aif'}, 'FLAC':{}, 'M4A':{}, 'MMF':{}, 'OPUS':{ext:'oga'}},
						Document: {'DOC':{}, 'DOCX':{}, 'HTML':{}, 'ODT':{}, 'PDF':{}, 'PPT':{}, 'PPTX':{}, 'RTF':{}, 'SWF':{}, 'TXT':{}},
						eBook: {'AZW3':{ext:'azw'}, 'ePub':{}, 'FB2':{ext:'xml'}, 'LIT':{}, 'LRF':{}, 'MOBI':{}, 'PDB':{}, 'PDF':{},'PDF-eBook':{ext:'pdf'}, 'TCR':{}},
						Hash: {'Adler32':{},  'Apache-htpasswd':{}, 'Blowfish':{}, 'CRC32':{}, 'CRC32B':{}, 'Gost':{}, 'Haval128':{},'MD4':{}, 'MD5':{}, 'RIPEMD128':{}, 'RIPEMD160':{}, 'SHA1':{}, 'SHA256':{}, 'SHA384':{}, 'SHA512':{}, 'Snefru':{}, 'Std-DES':{}, 'Tiger128':{}, 'Tiger128-calculator':{}, 'Tiger128-converter':{}, 'Tiger160':{}, 'Tiger192':{}, 'Whirlpool':{}},
						Image: {'BMP':{}, 'EPS':{ext:'ai'}, 'GIF':{}, 'EXR':{}, 'ICO':{}, 'JPG':{}, 'PNG':{}, 'SVG':{}, 'TGA':{}, 'TIFF':{ext:'tif'}, 'WBMP':{}, 'WebP':{}},
						Video: {'3G2':{}, '3GP':{}, 'AVI':{}, 'FLV':{}, 'HLS':{ext:'m3u8'}, 'MKV':{}, 'MOV':{}, 'MP4':{}, 'MPEG-1':{ext:'mpeg'}, 'MPEG-2':{ext:'mpeg'}, 'OGG':{ext:'ogv'}, 'OGV':{}, 'WebM':{}, 'WMV':{}, 'Android':{link:'/convert-video-for-%s',ext:'mp4'}, 'Blackberry':{link:'/convert-video-for-%s',ext:'mp4'}, 'DPG':{link:'/convert-video-for-%s',ext:'avi'}, 'iPad':{link:'/convert-video-for-%s',ext:'mp4'}, 'iPhone':{link:'/convert-video-for-%s',ext:'mp4'}, 'iPod':{link:'/convert-video-for-%s',ext:'mp4'}, 'Nintendo-3DS':{link:'/convert-video-for-%s',ext:'avi'}, 'Nintendo-DS':{link:'/convert-video-for-%s',ext:'avi'}, 'PS3':{link:'/convert-video-for-%s',ext:'mp4'}, 'Wii':{link:'/convert-video-for-%s',ext:'avi'}, 'Xbox':{link:'/convert-video-for-%s',ext:'wmv'}}
					},
					catExts : {
						Hash: 'txt'
					},
					link : '<div class="elfinder-edit-onlineconvert-link"><a href="https://www.online-convert.com" target="_blank"><span class="elfinder-button-icon"></span>ONLINE-CONVERT.COM</a></div>',
					useTabs : (jQuery.fn.tabs && !fm.UA.iOS)? true : false // Can't work on iOS, I don't know why.
				}, mOpts);
			},
			// Prepare on before show dialog
			prepare : function(base, dialogOpts, file) {
				var elfNode = base.editor.fm.getUI();
				jQuery(base).height(elfNode.height());
				dialogOpts.width = Math.max(dialogOpts.width || 0, elfNode.width() * 0.8);
			},
			// Initialization of editing node (this: this editors HTML node)
			init : function(id, file, dum, fm) {
				var ta = this,
					confObj = ta.editor.confObj,
					set = confObj.set,
					uiToast = fm.getUI('toast'),
					idxs = {},
					allowZip = fm.uploadMimeCheck('application/zip', file.phash),
					selfUrl = jQuery('base').length? document.location.href.replace(/#.*$/, '') : '',
					getExt = function(cat, con) {
						var c;
						if (set.catExts[cat]) {
							return set.catExts[cat];
						}
						if (set.conv[cat] && (c = set.conv[cat][con])) {
							return (c.ext || con).toLowerCase();
						}
						return con.toLowerCase();
					},
					setOptions = function(cat, done) {
						var type, dfdInit, dfd;
						if (typeof confObj.api === 'undefined') {
							dfdInit = fm.request({
								data: {
									cmd: 'editor',
									name: 'OnlineConvert',
									method: 'init'
								},
								preventDefault : true
							});
						} else {
							dfdInit = jQuery.Deferred().resolve({api: confObj.api});
						}
						cat = cat.toLowerCase();
						dfdInit.done(function(data) {
							confObj.api = data.api;
							if (confObj.api) {
								if (cat) {
									type = '?category=' + cat;
								} else {
									type = '';
									cat = 'all';
								}
								if (!confObj.conversions) {
									confObj.conversions = {};
								}
								if (!confObj.conversions[cat]) {
									dfd = jQuery.getJSON('https://api2.online-convert.com/conversions' + type);
								} else {
									dfd = jQuery.Deferred().resolve(confObj.conversions[cat]);
								}
								dfd.done(function(d) {
									confObj.conversions[cat] = d;
									jQuery.each(d, function(i, o) {
										btns[set.useTabs? 'children' : 'find']('.onlineconvert-category-' + o.category).children('.onlineconvert-' + o.target).trigger('makeoption', o);
									});
									done && done();
								});
							}
						});
					},
					btns = (function() {
						var btns = jQuery('<div></div>').on('click', 'button', function() {
								var b = jQuery(this),
									opts = b.data('opts') || null,
									cat = b.closest('.onlineconvert-category').data('cname'),
									con = b.data('conv');
								if (confObj.api === true) {
									api({
										category: cat,
										convert: con,
										options: opts
									});
								}
							}).on('change', function(e) {
								var t = jQuery(e.target),
									p = t.parent(), 
									b = t.closest('.elfinder-edit-onlineconvert-button').children('button:first'),
									o = b.data('opts') || {},
									v = p.data('type') === 'boolean'? t.is(':checked') : t.val();
								e.stopPropagation();
								if (v) {
									if (p.data('type') === 'integer') {
										v = parseInt(v);
									}
									if (p.data('pattern')) {
										var reg = new RegExp(p.data('pattern'));
										if (!reg.test(v)) {
											requestAnimationFrame(function() {
												fm.error('"' + fm.escape(v) + '" is not match to "/' + fm.escape(p.data('pattern')) + '/"');
											});
											v = null;
										}
									}
								}
								if (v) {
									o[t.parent().data('optkey')] = v;
								} else {
									delete o[p.data('optkey')];
								}
								b.data('opts', o);
							}),
							ul = jQuery('<ul></ul>'),
							oform = function(n, o) {
								var f = jQuery('<p></p>').data('optkey', n).data('type', o.type),
									checked = '',
									disabled = '',
									nozip = false,
									opts, btn, elm;
								if (o.description) {
									f.attr('title', fm.i18n(o.description));
								}
								if (o.pattern) {
									f.data('pattern', o.pattern);
								}
								f.append(jQuery('<span></span>').text(fm.i18n(n) + ' : '));
								if (o.type === 'boolean') {
									if (o['default'] || (nozip = (n === 'allow_multiple_outputs' && !allowZip))) {
										checked = ' checked';
										if (nozip) {
											disabled = ' disabled';
										}
										btn = this.children('button:first');
										opts = btn.data('opts') || {};
										opts[n] = true;
										btn.data('opts', opts);
									}
									f.append(jQuery('<input type="checkbox" value="true"'+checked+disabled+'/>'));
								} else if (o['enum']){
									elm = jQuery('<select></select>').append(jQuery('<option value=""></option>').text('Select...'));
									jQuery.each(o['enum'], function(i, v) {
										elm.append(jQuery('<option value="'+v+'"></option>').text(v));
									});
									f.append(elm);
								} else {
									f.append(jQuery('<input type="text" value=""/>'));
								}
								return f;
							},
							makeOption = function(o) {
								var elm = this,
									b = jQuery('<span class="elfinder-button-icon elfinder-button-icon-preference"></span>').on('click', function() {
										f.toggle();
									}),
									f = jQuery('<div class="elfinder-edit-onlinconvert-options"></div>').hide();
								if (o.options) {
									jQuery.each(o.options, function(k, v) {
										k !== 'download_password' && f.append(oform.call(elm, k, v));
									});
								}
								elm.append(b, f);
							},
							ts = (+new Date()),
							i = 0;
						
						if (!confObj.ext2mime) {
							confObj.ext2mime = Object.assign(fm.arrayFlip(fm.mimeTypes), ext2mime);
						}
						jQuery.each(set.conv, function(t, c) {
							var cname = t.toLowerCase(),
								id = 'elfinder-edit-onlineconvert-' + cname + ts,
								type = jQuery('<div id="' + id + '" class="onlineconvert-category onlineconvert-category-'+cname+'"></div>').data('cname', t),
								cext;
							jQuery.each(c, function(n, o) {
								var nl = n.toLowerCase(),
									ext = getExt(t, n);
								if (!confObj.ext2mime[ext]) {
									if (cname === 'audio' || cname === 'image' || cname === 'video') {
										confObj.ext2mime[ext] = cname + '/x-' + nl;
									} else {
										confObj.ext2mime[ext] = 'application/octet-stream';
									}
								}
								if (fm.uploadMimeCheck(confObj.ext2mime[ext], file.phash)) {
									type.append(jQuery('<div class="elfinder-edit-onlineconvert-button onlineconvert-'+nl+'"></div>').on('makeoption', function(e, data) {
										var elm = jQuery(this);
										if (!elm.children('.elfinder-button-icon-preference').length) {
											makeOption.call(elm, data);
										}
									}).append(jQuery('<button></button>').text(n).data('conv', n)));
								}
							});
							if (type.children().length) {
								ul.append(jQuery('<li></li>').append(jQuery('<a></a>').attr('href', selfUrl + '#' + id).text(t)));
								btns.append(type);
								idxs[cname] = i++;
							}
						});
						if (set.useTabs) {
							btns.prepend(ul).tabs({
								beforeActivate: function(e, ui) {
									setOptions(ui.newPanel.data('cname'));
								}
							});
						} else {
							jQuery.each(set.conv, function(t) {
								var tl = t.toLowerCase();
								btns.append(jQuery('<fieldset class="onlineconvert-fieldset-' + tl + '"></fieldset>').append(jQuery('<legend></legend>').text(t)).append(btns.children('.onlineconvert-category-' + tl)));
							});
						}
						return btns;
					})(),
					select = jQuery(this)
						.append(
							btns,
							(set.showLink? jQuery(set.link) : null)
						),
					spnr = jQuery('<div class="elfinder-edit-spinner elfinder-edit-onlineconvert"></div>')
						.hide()
						.html('<span class="elfinder-spinner-text">' + fm.i18n('nowLoading') + '</span><span class="elfinder-spinner"></span>')
						.appendTo(select.parent()),
					prog = jQuery('<div class="elfinder-quicklook-info-progress"></div>').appendTo(spnr),
					_url = null,
					url = function() {
						var onetime;
						if (_url) {
							return jQuery.Deferred().resolve(_url);
						} else {
							spnr.show();
							return fm.forExternalUrl(file.hash, { progressBar: prog }).done(function(url) {
								_url = url;
							}).fail(function(error) {
								error && fm.error(error);
								ta.elfinderdialog('destroy');
							}).always(function() {
								spnr.hide();
							});
						}
					},
					api = function(opts) {
						jQuery(ta).data('dfrd', url().done(function(url) {
							select.fadeOut();
							setStatus({info: 'Start conversion request.'});
							fm.request({
								data: {
									cmd: 'editor',
									name: 'OnlineConvert',
									method: 'api',
									'args[category]' : opts.category.toLowerCase(),
									'args[convert]'  : opts.convert.toLowerCase(),
									'args[options]'  : JSON.stringify(opts.options),
									'args[source]'   : fm.convAbsUrl(url),
									'args[filename]' : fm.splitFileExtention(file.name)[0] + '.' + getExt(opts.category, opts.convert),
									'args[mime]'     : file.mime
								},
								preventDefault : true
							}).done(function(data) {
								checkRes(data.apires, opts.category, opts.convert);
							}).fail(function(error) {
								error && fm.error(error);
								ta.elfinderdialog('destroy');
							});
						}));
					},
					checkRes = function(res, cat, con) {
						var status, err = [];
						if (res && res.id) {
							status = res.status;
							if (status.code === 'failed') {
								spnr.hide();
								if (res.errors && res.errors.length) {
									jQuery.each(res.errors, function(i, o) {
										o.message && err.push(o.message);
									});
								}
								fm.error(err.length? err : status.info);
								select.fadeIn();
							} else if (status.code === 'completed') {
								upload(res);
							} else {
								setStatus(status);
								setTimeout(function() {
									polling(res.id);
								}, 1000);
							}
						} else {
							uiToast.appendTo(ta.closest('.ui-dialog'));
							if (res.message) {
								fm.toast({
									msg: fm.i18n(res.message),
									mode: 'error',
									timeOut: 5000,
									onHidden: function() {
										uiToast.children().length === 1 && uiToast.appendTo(fm.getUI());
									}
								});
							}
							fm.toast({
								msg: fm.i18n('editorConvNoApi'),
								mode: 'error',
								timeOut: 3000,
								onHidden: function() {
									uiToast.children().length === 1 && uiToast.appendTo(fm.getUI());
								}
							});
							spnr.hide();
							select.show();
						}
					},
					setStatus = function(status) {
						spnr.show().children('.elfinder-spinner-text').text(status.info);
					},
					polling = function(jobid) {
						fm.request({
							data: {
								cmd: 'editor',
								name: 'OnlineConvert',
								method: 'api',
								'args[jobid]': jobid
							},
							preventDefault : true
						}).done(function(data) {
							checkRes(data.apires);
						}).fail(function(error) {
							error && fm.error(error);
							ta.elfinderdialog('destroy');
						});
					},
					upload = function(res) {
						var output = res.output,
							id = res.id,
							url = '';
						spnr.hide();
						if (output && output.length) {
							ta.elfinderdialog('destroy');
							jQuery.each(output, function(i, o) {
								if (o.uri) {
									url += o.uri + '\n';
								}
							});
							fm.upload({
								target: file.phash,
								files: [url],
								type: 'text',
								extraData: {
									contentSaveId: 'OnlineConvert-' + res.id
								}
							});
						}
					},
					mode = 'document',
					cl, m;
				select.parent().css({overflow: 'auto'}).addClass('overflow-scrolling-touch');
				if (m = file.mime.match(/^(audio|image|video)/)) {
					mode = m[1];
				}
				if (set.useTabs) {
					if (idxs[mode]) {
						btns.tabs('option', 'active', idxs[mode]);
					}
				} else {
					cl = Object.keys(set.conv).length;
					jQuery.each(set.conv, function(t) {
						if (t.toLowerCase() === mode) {
							setOptions(t, function() {
								jQuery.each(set.conv, function(t0) {
									t0.toLowerCase() !== mode && setOptions(t0);
								});
							});
							return false;
						}
						cl--;
					});
					if (!cl) {
						jQuery.each(set.conv, function(t) {
							setOptions(t);
						});
					}
					select.parent().scrollTop(btns.children('.onlineconvert-fieldset-' + mode).offset().top);
				}
			},
			load : function() {},
			getContent : function() {},
			save : function() {},
			// On dialog closed
			close : function(ta) {
				var fm = this.fm,
					dfrd = jQuery(ta).data('dfrd');
				if (dfrd && dfrd.state() === 'pending') {
					dfrd.reject();
				}
			}
		}
	];
}, window.elFinder));
js/extras/quicklook.googledocs.js000064400000004437151215013410013152 0ustar00(function(root, factory) {
	if (typeof define === 'function' && define.amd) {
		define(['elfinder'], factory);
	} else if (typeof exports !== 'undefined') {
		module.exports = factory(require('elfinder'));
	} else {
		factory(root.elFinder);
	}
}(this, function(elFinder) {
"use strict";
try {
	if (! elFinder.prototype.commands.quicklook.plugins) {
		elFinder.prototype.commands.quicklook.plugins = [];
	}
	elFinder.prototype.commands.quicklook.plugins.push(function(ql) {
		var fm      = ql.fm,
			preview = ql.preview;
			
		preview.on('update', function(e) {
			var win  = ql.window,
				file = e.file, node, loading;
			
			if (file.mime.indexOf('application/vnd.google-apps.') === 0) {
				if (file.url == '1') {
					preview.hide();
					jQuery('<div class="elfinder-quicklook-info-data"><button class="elfinder-info-button">'+fm.i18n('getLink')+'</button></div>').appendTo(ql.info.find('.elfinder-quicklook-info'))
					.on('click', function() {
						jQuery(this).html('<span class="elfinder-spinner">');
						fm.request({
							data : {cmd : 'url', target : file.hash},
							preventDefault : true
						})
						.always(function() {
							preview.show();
							jQuery(this).html('');
						})
						.done(function(data) {
							var rfile = fm.file(file.hash);
							ql.value.url = rfile.url = data.url || '';
							if (ql.value.url) {
								preview.trigger(jQuery.Event('update', {file : ql.value}));
							}
						});
					});
				}
				if (file.url !== '' && file.url != '1') {
					e.stopImmediatePropagation();

					loading = jQuery('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+fm.i18n('nowLoading')+'</span><span class="elfinder-spinner"></span></div>').appendTo(ql.info.find('.elfinder-quicklook-info'));

					node = jQuery('<iframe class="elfinder-quicklook-preview-iframe"></iframe>')
						.css('background-color', 'transparent')
						.on('load', function() {
							ql.hideinfo();
							loading.remove();
							node.css('background-color', '#fff');
						})
						.on('error', function() {
							loading.remove();
							node.remove();
						})
						.appendTo(preview)
						.attr('src', fm.url(file.hash));

					preview.one('change', function() {
						loading.remove();
						node.off('load').remove();
					});
				}
			}
			
		});
	});
} catch(e) {}
}));
js/extras/encoding-japanese.min.js000064400000665110151215013410013162 0ustar00/*!
 * encoding-japanese v1.0.25 - Converts character encoding.
 * Copyright (c) 2013-2016 polygon planet
 * https://github.com/polygonplanet/encoding.js
 * @license MIT
 */
!function(a,b,c){"undefined"!=typeof exports?"undefined"!=typeof module&&module.exports?module.exports=c():exports[a]=c():"function"==typeof define&&define.amd?define(c):b[a]=c()}("Encoding",this,function(){"use strict";function a(a){for(var b,c=0,d=a&&a.length;c<d;c++){if(b=a[c],b>255)return!1;if(b>=0&&b<=7||255===b)return!0}return!1}function b(a){for(var b,c=0,d=a&&a.length;c<d;c++)if(b=a[c],b>255||b>=128&&b<=255||27===b)return!1;return!0}function c(a){for(var b,c,d,e=0,f=a&&a.length;e<f;e++){if(b=a[e],b>255||b>=128&&b<=255)return!1;if(27===b){if(e+2>=f)return!1;if(c=a[e+1],d=a[e+2],36===c){if(40===d||64===d||66===d)return!0}else{if(38===c&&64===d)return!0;if(40===c&&(66===d||73===d||74===d))return!0}}}return!1}function d(a){for(var b,c=0,d=a&&a.length;c<d;c++)if(b=a[c],!(b<128)){if(b>255||b<142)return!1;if(142===b){if(c+1>=d)return!1;if(b=a[++c],b<161||223<b)return!1}else if(143===b){if(c+2>=d)return!1;if(b=a[++c],b<162||237<b)return!1;if(b=a[++c],b<161||254<b)return!1}else{if(!(161<=b&&b<=254))return!1;if(c+1>=d)return!1;if(b=a[++c],b<161||254<b)return!1}}return!0}function e(a){for(var b,c=0,d=a&&a.length;c<d&&a[c]>128;)if(a[c++]>255)return!1;for(;c<d;c++)if(b=a[c],!(b<=128||161<=b&&b<=223)){if(160===b||b>239||c+1>=d)return!1;if(b=a[++c],b<64||127===b||b>252)return!1}return!0}function f(a){for(var b,c=0,d=a&&a.length;c<d;c++){if(b=a[c],b>255)return!1;if(!(9===b||10===b||13===b||b>=32&&b<=126))if(b>=194&&b<=223){if(c+1>=d||a[c+1]<128||a[c+1]>191)return!1;c++}else if(224===b){if(c+2>=d||a[c+1]<160||a[c+1]>191||a[c+2]<128||a[c+2]>191)return!1;c+=2}else if(b>=225&&b<=236||238===b||239===b){if(c+2>=d||a[c+1]<128||a[c+1]>191||a[c+2]<128||a[c+2]>191)return!1;c+=2}else if(237===b){if(c+2>=d||a[c+1]<128||a[c+1]>159||a[c+2]<128||a[c+2]>191)return!1;c+=2}else if(240===b){if(c+3>=d||a[c+1]<144||a[c+1]>191||a[c+2]<128||a[c+2]>191||a[c+3]<128||a[c+3]>191)return!1;c+=3}else if(b>=241&&b<=243){if(c+3>=d||a[c+1]<128||a[c+1]>191||a[c+2]<128||a[c+2]>191||a[c+3]<128||a[c+3]>191)return!1;c+=3}else{if(244!==b)return!1;if(c+3>=d||a[c+1]<128||a[c+1]>143||a[c+2]<128||a[c+2]>191||a[c+3]<128||a[c+3]>191)return!1;c+=3}}return!0}function g(a){var b,c,d,e,f=0,g=a&&a.length,h=null;if(g<2){if(a[0]>255)return!1}else{if(b=a[0],c=a[1],255===b&&254===c)return!0;if(254===b&&255===c)return!0;for(;f<g;f++){if(0===a[f]){h=f;break}if(a[f]>255)return!1}if(null===h)return!1;if(d=a[h+1],void 0!==d&&d>0&&d<128)return!0;if(e=a[h-1],void 0!==e&&e>0&&e<128)return!0}return!1}function h(a){var b,c,d=0,e=a&&a.length,f=null;if(e<2){if(a[0]>255)return!1}else{if(b=a[0],c=a[1],254===b&&255===c)return!0;for(;d<e;d++){if(0===a[d]){f=d;break}if(a[d]>255)return!1}if(null===f)return!1;if(f%2===0)return!0}return!1}function i(a){var b,c,d=0,e=a&&a.length,f=null;if(e<2){if(a[0]>255)return!1}else{if(b=a[0],c=a[1],255===b&&254===c)return!0;for(;d<e;d++){if(0===a[d]){f=d;break}if(a[d]>255)return!1}if(null===f)return!1;if(f%2!==0)return!0}return!1}function j(a){var b,c,d,e,f,g,h=0,i=a&&a.length,j=null;if(i<4){for(;h<i;h++)if(a[h]>255)return!1}else{if(b=a[0],c=a[1],d=a[2],e=a[3],0===b&&0===c&&254===d&&255===e)return!0;if(255===b&&254===c&&0===d&&0===e)return!0;for(;h<i;h++){if(0===a[h]&&0===a[h+1]&&0===a[h+2]){j=h;break}if(a[h]>255)return!1}if(null===j)return!1;if(f=a[j+3],void 0!==f&&f>0&&f<=127)return 0===a[j+2]&&0===a[j+1];if(g=a[j-1],void 0!==g&&g>0&&g<=127)return 0===a[j+1]&&0===a[j+2]}return!1}function k(a){for(var b,c=0,d=a&&a.length;c<d;c++)if(b=a[c],b<0||b>1114111)return!1;return!0}function l(a){for(var b,c,d=[],e=0,f=0,g=a&&a.length;f<g;f++){for(;27===a[f];)if(36===a[f+1]&&66===a[f+2]||36===a[f+1]&&64===a[f+2]?e=1:40===a[f+1]&&73===a[f+2]?e=2:36===a[f+1]&&40===a[f+2]&&68===a[f+3]?(e=3,f++):e=0,f+=3,void 0===a[f])return d;1===e?(b=a[f],c=a[++f],1&b?(b>>=1,b<47?b+=113:b-=79,c+=c>95?32:31):(b>>=1,b<=47?b+=112:b-=80,c+=126),d[d.length]=255&b,d[d.length]=255&c):2===e?d[d.length]=a[f]+128&255:3===e?d[d.length]=Da:d[d.length]=255&a[f]}return d}function m(a){for(var b=[],c=0,d=a&&a.length,e=0;e<d;e++){for(;27===a[e];)if(36===a[e+1]&&66===a[e+2]||36===a[e+1]&&64===a[e+2]?c=1:40===a[e+1]&&73===a[e+2]?c=2:36===a[e+1]&&40===a[e+2]&&68===a[e+3]?(c=3,e++):c=0,e+=3,void 0===a[e])return b;1===c?(b[b.length]=a[e]+128&255,b[b.length]=a[++e]+128&255):2===c?(b[b.length]=142,b[b.length]=a[e]+128&255):3===c?(b[b.length]=143,b[b.length]=a[e]+128&255,b[b.length]=a[++e]+128&255):b[b.length]=255&a[e]}return b}function n(a){for(var b,c,d=[],e=0,f=a&&a.length,g=0,h=[27,40,66,27,36,66,27,40,73];g<f;g++)b=a[g],b>=161&&b<=223?(2!==e&&(e=2,d[d.length]=h[6],d[d.length]=h[7],d[d.length]=h[8]),d[d.length]=b-128&255):b>=128?(1!==e&&(e=1,d[d.length]=h[3],d[d.length]=h[4],d[d.length]=h[5]),b<<=1,c=a[++g],c<159?(b-=b<319?225:97,c-=c>126?32:31):(b-=b<319?224:96,c-=126),d[d.length]=255&b,d[d.length]=255&c):(0!==e&&(e=0,d[d.length]=h[0],d[d.length]=h[1],d[d.length]=h[2]),d[d.length]=255&b);return 0!==e&&(d[d.length]=h[0],d[d.length]=h[1],d[d.length]=h[2]),d}function o(a){for(var b,c,d=[],e=a&&a.length,f=0;f<e;f++)b=a[f],b>=161&&b<=223?(d[d.length]=142,d[d.length]=b):b>=129?(c=a[++f],b<<=1,c<159?(b-=b<319?97:225,c+=c>126?96:97):(b-=b<319?96:224,c+=2),d[d.length]=255&b,d[d.length]=255&c):d[d.length]=255&b;return d}function p(a){for(var b,c=[],d=0,e=a&&a.length,f=0,g=[27,40,66,27,36,66,27,40,73,27,36,40,68];f<e;f++)b=a[f],142===b?(2!==d&&(d=2,c[c.length]=g[6],c[c.length]=g[7],c[c.length]=g[8]),c[c.length]=a[++f]-128&255):143===b?(3!==d&&(d=3,c[c.length]=g[9],c[c.length]=g[10],c[c.length]=g[11],c[c.length]=g[12]),c[c.length]=a[++f]-128&255,c[c.length]=a[++f]-128&255):b>142?(1!==d&&(d=1,c[c.length]=g[3],c[c.length]=g[4],c[c.length]=g[5]),c[c.length]=b-128&255,c[c.length]=a[++f]-128&255):(0!==d&&(d=0,c[c.length]=g[0],c[c.length]=g[1],c[c.length]=g[2]),c[c.length]=255&b);return 0!==d&&(c[c.length]=g[0],c[c.length]=g[1],c[c.length]=g[2]),c}function q(a){for(var b,c,d=[],e=a&&a.length,f=0;f<e;f++)b=a[f],143===b?(d[d.length]=Da,f+=2):b>142?(c=a[++f],1&b?(b>>=1,b+=b<111?49:113,c-=c>223?96:97):(b>>=1,b+=b<=111?48:112,c-=2),d[d.length]=255&b,d[d.length]=255&c):142===b?d[d.length]=255&a[++f]:d[d.length]=255&b;return d}function r(a){Ca();for(var b,c,d,e,f,g,h,i=[],j=0,k=a&&a.length;j<k;j++)b=a[j],b>=161&&b<=223?(d=b-64,e=188|d>>6&3,f=128|63&d,i[i.length]=239,i[i.length]=255&e,i[i.length]=255&f):b>=128?(c=b<<1,d=a[++j],d<159?(c-=c<319?225:97,d-=d>126?32:31):(c-=c<319?224:96,d-=126),c&=255,g=(c<<8)+d,h=Ya[g],void 0===h?i[i.length]=Da:h<65535?(i[i.length]=h>>8&255,i[i.length]=255&h):(i[i.length]=h>>16&255,i[i.length]=h>>8&255,i[i.length]=255&h)):i[i.length]=255&a[j];return i}function s(a){Ca();for(var b,c,d,e,f,g,h,i,j=[],k=0,l=a&&a.length;k<l;k++)b=a[k],142===b?(c=a[++k]-64,d=188|c>>6&3,e=128|63&c,j[j.length]=239,j[j.length]=255&d,j[j.length]=255&e):143===b?(f=a[++k]-128,g=a[++k]-128,h=(f<<8)+g,i=Za[h],void 0===i?j[j.length]=Da:i<65535?(j[j.length]=i>>8&255,j[j.length]=255&i):(j[j.length]=i>>16&255,j[j.length]=i>>8&255,j[j.length]=255&i)):b>=128?(h=(b-128<<8)+(a[++k]-128),i=Ya[h],void 0===i?j[j.length]=Da:i<65535?(j[j.length]=i>>8&255,j[j.length]=255&i):(j[j.length]=i>>16&255,j[j.length]=i>>8&255,j[j.length]=255&i)):j[j.length]=255&a[k];return j}function t(a){Ca();for(var b,c,d,e,f,g=[],h=0,i=0,j=a&&a.length;i<j;i++){for(;27===a[i];)if(36===a[i+1]&&66===a[i+2]||36===a[i+1]&&64===a[i+2]?h=1:40===a[i+1]&&73===a[i+2]?h=2:36===a[i+1]&&40===a[i+2]&&68===a[i+3]?(h=3,i++):h=0,i+=3,void 0===a[i])return g;1===h?(e=(a[i]<<8)+a[++i],f=Ya[e],void 0===f?g[g.length]=Da:f<65535?(g[g.length]=f>>8&255,g[g.length]=255&f):(g[g.length]=f>>16&255,g[g.length]=f>>8&255,g[g.length]=255&f)):2===h?(b=a[i]+64,c=188|b>>6&3,d=128|63&b,g[g.length]=239,g[g.length]=255&c,g[g.length]=255&d):3===h?(e=(a[i]<<8)+a[++i],f=Za[e],void 0===f?g[g.length]=Da:f<65535?(g[g.length]=f>>8&255,g[g.length]=255&f):(g[g.length]=f>>16&255,g[g.length]=f>>8&255,g[g.length]=255&f)):g[g.length]=255&a[i]}return g}function u(a){for(var b,c,d,e,f,g=[],h=0,i=a&&a.length;h<i;h++)b=a[h],b>=128?(e=b<=223?(b<<8)+a[++h]:(b<<16)+(a[++h]<<8)+(255&a[++h]),
f=Wa[e],void 0===f?g[g.length]=Da:f<255?g[g.length]=f+128:(f>65536&&(f-=65536),c=f>>8,d=255&f,1&c?(c>>=1,c<47?c+=113:c-=79,d+=d>95?32:31):(c>>=1,c<=47?c+=112:c-=80,d+=126),g[g.length]=255&c,g[g.length]=255&d)):g[g.length]=255&a[h];return g}function v(a){for(var b,c,d,e=[],f=0,g=a&&a.length;f<g;f++)b=a[f],b>=128?(c=b<=223?(a[f++]<<8)+a[f]:(a[f++]<<16)+(a[f++]<<8)+(255&a[f]),d=Wa[c],void 0===d?(d=Xa[c],void 0===d?e[e.length]=Da:(e[e.length]=143,e[e.length]=(d>>8)-128&255,e[e.length]=(255&d)-128&255)):(d>65536&&(d-=65536),d<255?(e[e.length]=142,e[e.length]=d-128&255):(e[e.length]=(d>>8)-128&255,e[e.length]=(255&d)-128&255))):e[e.length]=255&a[f];return e}function w(a){for(var b,c,d,e=[],f=0,g=a&&a.length,h=0,i=[27,40,66,27,36,66,27,40,73,27,36,40,68];h<g;h++)b=a[h],b<128?(0!==f&&(f=0,e[e.length]=i[0],e[e.length]=i[1],e[e.length]=i[2]),e[e.length]=255&b):(c=b<=223?(a[h]<<8)+a[++h]:(a[h]<<16)+(a[++h]<<8)+a[++h],d=Wa[c],void 0===d?(d=Xa[c],void 0===d?(0!==f&&(f=0,e[e.length]=i[0],e[e.length]=i[1],e[e.length]=i[2]),e[e.length]=Da):(3!==f&&(f=3,e[e.length]=i[9],e[e.length]=i[10],e[e.length]=i[11],e[e.length]=i[12]),e[e.length]=d>>8&255,e[e.length]=255&d)):(d>65536&&(d-=65536),d<255?(2!==f&&(f=2,e[e.length]=i[6],e[e.length]=i[7],e[e.length]=i[8]),e[e.length]=255&d):(1!==f&&(f=1,e[e.length]=i[3],e[e.length]=i[4],e[e.length]=i[5]),e[e.length]=d>>8&255,e[e.length]=255&d)));return 0!==f&&(e[e.length]=i[0],e[e.length]=i[1],e[e.length]=i[2]),e}function x(a){for(var b,c,d=[],e=0,f=a&&a.length;e<f;e++)b=a[e],b>=55296&&b<=56319&&e+1<f&&(c=a[e+1],c>=56320&&c<=57343&&(b=1024*(b-55296)+c-56320+65536,e++)),b<128?d[d.length]=b:b<2048?(d[d.length]=192|b>>6&31,d[d.length]=128|63&b):b<65536?(d[d.length]=224|b>>12&15,d[d.length]=128|b>>6&63,d[d.length]=128|63&b):b<2097152&&(d[d.length]=240|b>>18&15,d[d.length]=128|b>>12&63,d[d.length]=128|b>>6&63,d[d.length]=128|63&b);return d}function y(a){for(var b,c,d,e,f,g,h=[],i=0,j=a&&a.length;i<j;)c=a[i++],b=c>>4,b>=0&&b<=7?g=c:12===b||13===b?(d=a[i++],g=(31&c)<<6|63&d):14===b?(d=a[i++],e=a[i++],g=(15&c)<<12|(63&d)<<6|63&e):15===b&&(d=a[i++],e=a[i++],f=a[i++],g=(7&c)<<18|(63&d)<<12|(63&e)<<6|63&f),g<=65535?h[h.length]=g:(g-=65536,h[h.length]=(g>>10)+55296,h[h.length]=g%1024+56320);return h}function z(a,b){var c;if(b&&b.bom){var d=b.bom;qa(d)||(d="BE");var e,f;"B"===d.charAt(0).toUpperCase()?(e=[254,255],f=A(a)):(e=[255,254],f=B(a)),c=[],c[0]=e[0],c[1]=e[1];for(var g=0,h=f.length;g<h;g++)c[c.length]=f[g]}else c=A(a);return c}function A(a){for(var b,c=[],d=0,e=a&&a.length;d<e;)b=a[d++],b<=255?(c[c.length]=0,c[c.length]=b):b<=65535&&(c[c.length]=b>>8&255,c[c.length]=255&b);return c}function B(a){for(var b,c=[],d=0,e=a&&a.length;d<e;)b=a[d++],b<=255?(c[c.length]=b,c[c.length]=0):b<=65535&&(c[c.length]=255&b,c[c.length]=b>>8&255);return c}function C(a){var b,c,d=[],e=0,f=a&&a.length;for(f>=2&&(254===a[0]&&255===a[1]||255===a[0]&&254===a[1])&&(e=2);e<f;)b=a[e++],c=a[e++],0===b?d[d.length]=c:d[d.length]=(255&b)<<8|255&c;return d}function D(a){var b,c,d=[],e=0,f=a&&a.length;for(f>=2&&(254===a[0]&&255===a[1]||255===a[0]&&254===a[1])&&(e=2);e<f;)b=a[e++],c=a[e++],0===c?d[d.length]=b:d[d.length]=(255&c)<<8|255&b;return d}function E(a){for(var b,c,d=[],e=0,f=a&&a.length,g=!1,h=!0;e<f;)b=a[e++],c=a[e++],h&&2===e?(h=!1,254===b&&255===c?g=!1:255===b&&254===c?g=!0:(g=i(a),e=0)):g?0===c?d[d.length]=b:d[d.length]=(255&c)<<8|255&b:0===b?d[d.length]=c:d[d.length]=(255&b)<<8|255&c;return d}function F(a){for(var b,c,d=[],e=0,f=a&&a.length,g=!1,h=!0;e<f;)b=a[e++],c=a[e++],h&&2===e?(h=!1,254===b&&255===c?g=!1:255===b&&254===c?g=!0:(g=i(a),e=0)):g?(d[d.length]=c,d[d.length]=b):(d[d.length]=b,d[d.length]=c);return d}function G(a,b){var c,d=!1;if(b&&b.bom){var e=b.bom;qa(e)||(e="BE"),"B"===e.charAt(0).toUpperCase()?c=[254,255]:(c=[255,254],d=!0)}var f=[],g=a&&a.length,h=0;g>=2&&(254===a[0]&&255===a[1]||255===a[0]&&254===a[1])&&(h=2),c&&(f[0]=c[0],f[1]=c[1]);for(var i,j;h<g;)i=a[h++],j=a[h++],d?(f[f.length]=j,f[f.length]=i):(f[f.length]=i,f[f.length]=j);return f}function H(a){for(var b,c,d=[],e=0,f=a&&a.length,g=!1,h=!0;e<f;)b=a[e++],c=a[e++],h&&2===e?(h=!1,254===b&&255===c?g=!1:255===b&&254===c?g=!0:(g=i(a),e=0)):g?(d[d.length]=b,d[d.length]=c):(d[d.length]=c,d[d.length]=b);return d}function I(a,b){var c,d=!1;if(b&&b.bom){var e=b.bom;qa(e)||(e="BE"),"B"===e.charAt(0).toUpperCase()?c=[254,255]:(c=[255,254],d=!0)}var f=[],g=a&&a.length,h=0;g>=2&&(254===a[0]&&255===a[1]||255===a[0]&&254===a[1])&&(h=2),c&&(f[0]=c[0],f[1]=c[1]);for(var i,j;h<g;)i=a[h++],j=a[h++],d?(f[f.length]=i,f[f.length]=j):(f[f.length]=j,f[f.length]=i);return f}function J(a){var b,c,d=[],e=0,f=a&&a.length;for(f>=2&&(254===a[0]&&255===a[1]||255===a[0]&&254===a[1])&&(e=2);e<f;)b=a[e++],c=a[e++],d[d.length]=c,d[d.length]=b;return d}function K(a){return J(a)}function L(a){return w(x(a))}function M(a){return y(t(a))}function N(a){return v(x(a))}function O(a){return y(s(a))}function P(a){return u(x(a))}function Q(a){return y(r(a))}function R(a,b){return z(y(a),b)}function S(a){return x(E(a))}function T(a){return A(y(a))}function U(a){return x(C(a))}function V(a){return B(y(a))}function W(a){return x(D(a))}function X(a,b){return R(t(a),b)}function Y(a){return w(S(a))}function Z(a){return T(t(a))}function jQuery(a){return w(U(a))}function _(a){return V(t(a))}function aa(a){return w(W(a))}function ba(a,b){return R(s(a),b)}function ca(a){return v(S(a))}function da(a){return T(s(a))}function ea(a){return v(U(a))}function fa(a){return V(s(a))}function ga(a){return v(W(a))}function ha(a,b){return R(r(a),b)}function ia(a){return u(S(a))}function ja(a){return T(r(a))}function ka(a){return u(U(a))}function la(a){return V(r(a))}function ma(a){return u(W(a))}function na(a){for(var b,c,d,e="",f=(""+a).toUpperCase().replace(/[^A-Z0-9]+/g,""),g=ra(Oa),h=g.length,i=0,j=0;j<h;j++){if(b=g[j],b===f){e=b;break}for(c=b.length,d=i;d<c;d++)b.slice(0,d)!==f.slice(0,d)&&b.slice(-d)!==f.slice(-d)||(e=b,i=d)}return Ha.call(Oa,e)?Oa[e]:e}function oa(a){var b=typeof a;return"function"===b||"object"===b&&!!a}function pa(a){return Array.isArray?Array.isArray(a):"[object Array]"===Ga.call(a)}function qa(a){return"string"==typeof a||"[object String]"===Ga.call(a)}function ra(a){if(Object.keys)return Object.keys(a);var b=[];for(var c in a)Ha.call(a,c)&&(b[b.length]=c);return b}function sa(a,b){if(!Ia)return new Array(b);switch(a){case 8:return new Uint8Array(b);case 16:return new Uint16Array(b)}}function ta(a){for(var b=a.length,c=sa(16,b),d=0;d<b;d++)c[d]=a.charCodeAt(d);return c}function ua(a){if(Ja&&Ka){var b=a&&a.length;if(b<La){if(Ma)return Ea.apply(null,a);if(null===Ma)try{var c=Ea.apply(null,a);return b>La&&(Ma=!0),c}catch(a){Ma=!1}}}return va(a)}function va(a){for(var b,c="",d=a&&a.length,e=0;e<d;){if(b=a.subarray?a.subarray(e,e+La):a.slice(e,e+La),e+=La,!Ma){if(null===Ma)try{c+=Ea.apply(null,b),b.length>La&&(Ma=!0);continue}catch(a){Ma=!1}return wa(a)}c+=Ea.apply(null,b)}return c}function wa(a){for(var b="",c=a&&a.length,d=0;d<c;d++)b+=Ea(a[d]);return b}function xa(a){for(var b=[],c=a&&a.length,d=0;d<c;d++)b[d]=a.charCodeAt(d);return b}function ya(a){if(Ia)return new Uint16Array(a);if(pa(a))return a;for(var b=a&&a.length,c=[],d=0;d<b;d++)c[d]=a[d];return c}function za(a){return pa(a)?a:Fa.call(a)}function Aa(a){var b,c,d,e,f,g;for(d=a&&a.length,c=0,b=[];c<d;){if(e=a[c++],c==d){b[b.length]=Ta[e>>2],b[b.length]=Ta[(3&e)<<4],b[b.length]=Va,b[b.length]=Va;break}if(f=a[c++],c==d){b[b.length]=Ta[e>>2],b[b.length]=Ta[(3&e)<<4|(240&f)>>4],b[b.length]=Ta[(15&f)<<2],b[b.length]=Va;break}g=a[c++],b[b.length]=Ta[e>>2],b[b.length]=Ta[(3&e)<<4|(240&f)>>4],b[b.length]=Ta[(15&f)<<2|(192&g)>>6],b[b.length]=Ta[63&g]}return ua(b)}function Ba(a){var b,c,d,e,f,g,h;for(g=a&&a.length,f=0,h=[];f<g;){do b=Ua[255&a.charCodeAt(f++)];while(f<g&&b==-1);if(b==-1)break;do c=Ua[255&a.charCodeAt(f++)];while(f<g&&c==-1);if(c==-1)break;h[h.length]=b<<2|(48&c)>>4;do{if(d=255&a.charCodeAt(f++),61==d)return h;d=Ua[d]}while(f<g&&d==-1);if(d==-1)break;h[h.length]=(15&c)<<4|(60&d)>>2;
do{if(e=255&a.charCodeAt(f++),61==e)return h;e=Ua[e]}while(f<g&&e==-1);if(e==-1)break;h[h.length]=(3&d)<<6|e}return h}function Ca(){if(null===Ya){Ya={};for(var a,b,c=ra(Wa),d=0,e=c.length;d<e;d++)a=c[d],b=Wa[a],b>95&&(Ya[b]=0|a);for(Za={},c=ra(Xa),e=c.length,d=0;d<e;d++)a=c[d],b=Xa[a],Za[b]=0|a}}var Da="?".charCodeAt(0),Ea=String.fromCharCode,Fa=Array.prototype.slice,Ga=Object.prototype.toString,Ha=Object.prototype.hasOwnProperty,Ia="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array,Ja=!1,Ka=!1;try{"a"===Ea.apply(null,[97])&&(Ja=!0)}catch(a){}if(Ia)try{"a"===Ea.apply(null,new Uint8Array([97]))&&(Ka=!0)}catch(a){}var La=65533,Ma=null,Na={UTF32:{order:0},UTF32BE:{alias:["UCS4"]},UTF32LE:null,UTF16:{order:1},UTF16BE:{alias:["UCS2"]},UTF16LE:null,BINARY:{order:2},ASCII:{order:3,alias:["ISO646","CP367"]},JIS:{order:4,alias:["ISO2022JP"]},UTF8:{order:5},EUCJP:{order:6},SJIS:{order:7,alias:["CP932","MSKANJI","WINDOWS31J"]},UNICODE:{order:8}},Oa={},Pa=function(){for(var a,b,c,d,e=Oa,f=ra(Na),g=[],h=0,i=f.length;h<i;h++)if(a=f[h],e[a]=a,b=Na[a],null!=b&&("undefined"!=typeof b.order&&(g[g.length]=a),b.alias))for(c=0,d=b.alias.length;c<d;c++)e[b.alias[c]]=a;return g.sort(function(a,b){return Na[a].order-Na[b].order}),g}(),Qa={orders:Pa,detect:function(a,b){if(null==a||0===a.length)return!1;oa(b)&&!pa(b)&&(b=b.encoding),qa(a)&&(a=ta(a)),null==b?b=Qa.orders:qa(b)&&(b=b.toUpperCase(),b="AUTO"===b?Qa.orders:~b.indexOf(",")?b.split(/\s*,\s*/):[b]);for(var c,d,e,f=b.length,g=0;g<f;g++)if(c=b[g],d=na(c)){if(e="is"+d,!Ha.call(Ra,e))throw new Error("Undefined encoding: "+c);if(Ra[e](a))return d}return!1},convert:function(a,b,c){var d,e,f={};oa(b)&&(f=b,c=f.from,b=f.to,f.type&&(e=f.type)),qa(a)?(e=e||"string",a=ta(a)):null!=a&&0!==a.length||(a=[]);var g;g=null!=c&&qa(c)&&"AUTO"!==c.toUpperCase()&&!~c.indexOf(",")?na(c):Qa.detect(a);var h=na(b),i=g+"To"+h;switch(d=Ha.call(Sa,i)?Sa[i](a,f):a,(""+e).toLowerCase()){case"string":return ua(d);case"arraybuffer":return ya(d);case"array":default:return za(d)}},urlEncode:function(a){qa(a)&&(a=ta(a));for(var b,c=xa("0123456789ABCDEF"),d=[],e=0,f=a&&a.length;e<f;e++){if(b=a[e],b>255)return encodeURIComponent(ua(a));b>=97&&b<=122||b>=65&&b<=90||b>=48&&b<=57||33===b||b>=39&&b<=42||45===b||46===b||95===b||126===b?d[d.length]=b:(d[d.length]=37,b<16?(d[d.length]=48,d[d.length]=c[b]):(d[d.length]=c[b>>4&15],d[d.length]=c[15&b]))}return ua(d)},urlDecode:function(a){for(var b,c=[],d=0,e=a&&a.length;d<e;)b=a.charCodeAt(d++),37===b?c[c.length]=parseInt(a.charAt(d++)+a.charAt(d++),16):c[c.length]=b;return c},base64Encode:function(a){return qa(a)&&(a=ta(a)),Aa(a)},base64Decode:function(a){return Ba(a)},codeToString:ua,stringToCode:xa,toHankakuCase:function(a){var b=!1;qa(a)&&(b=!0,a=ta(a));for(var c,d=[],e=a&&a.length,f=0;f<e;)c=a[f++],c>=65281&&c<=65374&&(c-=65248),d[d.length]=c;return b?ua(d):d},toZenkakuCase:function(a){var b=!1;qa(a)&&(b=!0,a=ta(a));for(var c,d=[],e=a&&a.length,f=0;f<e;)c=a[f++],c>=33&&c<=126&&(c+=65248),d[d.length]=c;return b?ua(d):d},toHiraganaCase:function(a){var b=!1;qa(a)&&(b=!0,a=ta(a));for(var c,d=[],e=a&&a.length,f=0;f<e;)c=a[f++],c>=12449&&c<=12534?c-=96:12535===c?(d[d.length]=12431,c=12443):12538===c&&(d[d.length]=12434,c=12443),d[d.length]=c;return b?ua(d):d},toKatakanaCase:function(a){var b=!1;qa(a)&&(b=!0,a=ta(a));for(var c,d=[],e=a&&a.length,f=0;f<e;)c=a[f++],c>=12353&&c<=12438&&((12431===c||12434===c)&&f<e&&12443===a[f]?(c=12431===c?12535:12538,f++):c+=96),d[d.length]=c;return b?ua(d):d},toHankanaCase:function(a){var b=!1;qa(a)&&(b=!0,a=ta(a));for(var c,d,e,f=[],g=a&&a.length,h=0;h<g;)c=a[h++],c>=12289&&c<=12540&&(e=$a[c],void 0!==e)?f[f.length]=e:12532===c||12535===c||12538===c?(f[f.length]=_a[c],f[f.length]=65438):c>=12459&&c<=12489?(f[f.length]=$a[c-1],f[f.length]=65438):c>=12495&&c<=12509?(d=c%3,f[f.length]=$a[c-d],f[f.length]=ab[d-1]):f[f.length]=c;return b?ua(f):f},toZenkanaCase:function(a){var b=!1;qa(a)&&(b=!0,a=ta(a));var c,d,e,f=[],g=a&&a.length,h=0;for(h=0;h<g;h++)c=a[h],c>65376&&c<65440&&(d=bb[c-65377],h+1<g&&(e=a[h+1],65438===e&&65395===c?(d=12532,h++):65438===e&&65436===c?(d=12535,h++):65438===e&&65382===c?(d=12538,h++):65438===e&&(c>65397&&c<65413||c>65417&&c<65423)?(d++,h++):65439===e&&c>65417&&c<65423&&(d+=2,h++)),c=d),f[f.length]=c;return b?ua(f):f},toHankakuSpace:function(a){if(qa(a))return a.replace(/\u3000/g," ");for(var b,c=[],d=a&&a.length,e=0;e<d;)b=a[e++],12288===b&&(b=32),c[c.length]=b;return c},toZenkakuSpace:function(a){if(qa(a))return a.replace(/\u0020/g,"\u3000");for(var b,c=[],d=a&&a.length,e=0;e<d;)b=a[e++],32===b&&(b=12288),c[c.length]=b;return c}},Ra={isBINARY:a,isASCII:b,isJIS:c,isEUCJP:d,isSJIS:e,isUTF8:f,isUTF16:g,isUTF16BE:h,isUTF16LE:i,isUTF32:j,isUNICODE:k},Sa={JISToEUCJP:m,EUCJPToJIS:p,JISToSJIS:l,SJISToJIS:n,EUCJPToSJIS:q,SJISToEUCJP:o,JISToUTF8:t,UTF8ToJIS:w,EUCJPToUTF8:s,UTF8ToEUCJP:v,SJISToUTF8:r,UTF8ToSJIS:u,UNICODEToUTF8:x,UTF8ToUNICODE:y,UNICODEToJIS:L,JISToUNICODE:M,UNICODEToEUCJP:N,EUCJPToUNICODE:O,UNICODEToSJIS:P,SJISToUNICODE:Q,UNICODEToUTF16:z,UTF16ToUNICODE:E,UNICODEToUTF16BE:A,UTF16BEToUNICODE:C,UNICODEToUTF16LE:B,UTF16LEToUNICODE:D,UTF8ToUTF16:R,UTF16ToUTF8:S,UTF8ToUTF16BE:T,UTF16BEToUTF8:U,UTF8ToUTF16LE:V,UTF16LEToUTF8:W,UTF16ToUTF16BE:F,UTF16BEToUTF16:G,UTF16ToUTF16LE:H,UTF16LEToUTF16:I,UTF16BEToUTF16LE:J,UTF16LEToUTF16BE:K,JISToUTF16:X,UTF16ToJIS:Y,JISToUTF16BE:Z,UTF16BEToJIS:$,JISToUTF16LE:_,UTF16LEToJIS:aa,EUCJPToUTF16:ba,UTF16ToEUCJP:ca,EUCJPToUTF16BE:da,UTF16BEToEUCJP:ea,EUCJPToUTF16LE:fa,UTF16LEToEUCJP:ga,SJISToUTF16:ha,UTF16ToSJIS:ia,SJISToUTF16BE:ja,UTF16BEToSJIS:ka,SJISToUTF16LE:la,UTF16LEToSJIS:ma},Ta=[65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,48,49,50,51,52,53,54,55,56,57,43,47],Ua=[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1],Va="=".charCodeAt(0),Wa={15711649:33,15711650:34,15711651:35,15711652:36,15711653:37,15711654:38,15711655:39,15711656:40,15711657:41,15711658:42,15711659:43,15711660:44,15711661:45,15711662:46,15711663:47,15711664:48,15711665:49,15711666:50,15711667:51,15711668:52,15711669:53,15711670:54,15711671:55,15711672:56,15711673:57,15711674:58,15711675:59,15711676:60,15711677:61,15711678:62,15711679:63,15711872:64,15711873:65,15711874:66,15711875:67,15711876:68,15711877:69,15711878:70,15711879:71,15711880:72,15711881:73,15711882:74,15711883:75,15711884:76,15711885:77,15711886:78,15711887:79,15711888:80,15711889:81,15711890:82,15711891:83,15711892:84,15711893:85,15711894:86,15711895:87,15711896:88,15711897:89,15711898:90,15711899:91,15711900:92,15711901:93,15711902:94,15711903:95,14848416:11553,14848417:11554,14848418:11555,14848419:11556,14848420:11557,14848421:11558,14848422:11559,14848423:11560,14848424:11561,14848425:11562,14848426:11563,14848427:11564,14848428:11565,14848429:11566,14848430:11567,14848431:11568,14848432:11569,14848433:11570,14848434:11571,14848435:11572,14845344:11573,14845345:11574,14845346:11575,14845347:11576,14845348:11577,14845349:11578,14845350:11579,14845351:11580,14845352:11581,14845353:11582,14912905:11584,14912660:11585,14912674:11586,14912909:11587,14912664:11588,14912679:11589,14912643:11590,14912694:11591,14912913:11592,14912919:11593,14912653:11594,14912678:11595,14912675:11596,14912683:11597,14912906:11598,14912699:11599,14913180:11600,14913181:11601,14913182:11602,14913166:11603,14913167:11604,14913412:11605,14913185:11606,14912955:11615,14909597:11616,14909599:11617,14845078:11618,14913421:11619,14845089:11620,14912164:11621,14912165:11622,14912166:11623,14912167:11624,14912168:11625,14911665:11626,14911666:11627,14911673:11628,
14912958:11629,14912957:11630,14912956:11631,14846126:11635,14846097:11636,14846111:11640,14846655:11641,14909568:8481,14909569:8482,14909570:8483,15711372:8484,15711374:8485,14910395:8486,15711386:8487,15711387:8488,15711391:8489,15711361:8490,14910107:8491,14910108:8492,49844:8493,15711616:8494,49832:8495,15711422:8496,15712163:8497,15711423:8498,14910397:8499,14910398:8500,14910109:8501,14910110:8502,14909571:8503,14990237:8504,14909573:8505,14909574:8506,14909575:8507,14910396:8508,14844053:8509,14844048:8510,15711375:8511,15711420:8512,15711646:8513,14844054:8514,15711644:8515,14844070:8516,14844069:8517,14844056:8518,14844057:8519,14844060:8520,14844061:8521,15711368:8522,15711369:8523,14909588:8524,14909589:8525,15711419:8526,15711421:8527,15711643:8528,15711645:8529,14909576:8530,14909577:8531,14909578:8532,14909579:8533,14909580:8534,14909581:8535,14909582:8536,14909583:8537,14909584:8538,14909585:8539,15711371:8540,15711373:8541,49841:8542,50071:8543,50103:8544,15711389:8545,14846368:8546,15711388:8547,15711390:8548,14846374:8549,14846375:8550,14846110:8551,14846132:8552,14850434:8553,14850432:8554,49840:8555,14844082:8556,14844083:8557,14845059:8558,15712165:8559,15711364:8560,15712160:8561,15712161:8562,15711365:8563,15711363:8564,15711366:8565,15711370:8566,15711392:8567,49831:8568,14850182:8569,14850181:8570,14849931:8571,14849935:8572,14849934:8573,14849927:8574,14849926:8737,14849697:8738,14849696:8739,14849715:8740,14849714:8741,14849725:8742,14849724:8743,14844091:8744,14909586:8745,14845586:8746,14845584:8747,14845585:8748,14845587:8749,14909587:8750,14846088:8762,14846091:8763,14846598:8764,14846599:8765,14846594:8766,14846595:8767,14846122:8768,14846121:8769,14846119:8778,14846120:8779,49836:8780,14845842:8781,14845844:8782,14846080:8783,14846083:8784,14846112:8796,14846629:8797,14847122:8798,14846082:8799,14846087:8800,14846369:8801,14846354:8802,14846378:8803,14846379:8804,14846106:8805,14846141:8806,14846109:8807,14846133:8808,14846123:8809,14846124:8810,14845099:8818,14844080:8819,14850479:8820,14850477:8821,14850474:8822,14844064:8823,14844065:8824,49846:8825,14849967:8830,15711376:9008,15711377:9009,15711378:9010,15711379:9011,15711380:9012,15711381:9013,15711382:9014,15711383:9015,15711384:9016,15711385:9017,15711393:9025,15711394:9026,15711395:9027,15711396:9028,15711397:9029,15711398:9030,15711399:9031,15711400:9032,15711401:9033,15711402:9034,15711403:9035,15711404:9036,15711405:9037,15711406:9038,15711407:9039,15711408:9040,15711409:9041,15711410:9042,15711411:9043,15711412:9044,15711413:9045,15711414:9046,15711415:9047,15711416:9048,15711417:9049,15711418:9050,15711617:9057,15711618:9058,15711619:9059,15711620:9060,15711621:9061,15711622:9062,15711623:9063,15711624:9064,15711625:9065,15711626:9066,15711627:9067,15711628:9068,15711629:9069,15711630:9070,15711631:9071,15711632:9072,15711633:9073,15711634:9074,15711635:9075,15711636:9076,15711637:9077,15711638:9078,15711639:9079,15711640:9080,15711641:9081,15711642:9082,14909825:9249,14909826:9250,14909827:9251,14909828:9252,14909829:9253,14909830:9254,14909831:9255,14909832:9256,14909833:9257,14909834:9258,14909835:9259,14909836:9260,14909837:9261,14909838:9262,14909839:9263,14909840:9264,14909841:9265,14909842:9266,14909843:9267,14909844:9268,14909845:9269,14909846:9270,14909847:9271,14909848:9272,14909849:9273,14909850:9274,14909851:9275,14909852:9276,14909853:9277,14909854:9278,14909855:9279,14909856:9280,14909857:9281,14909858:9282,14909859:9283,14909860:9284,14909861:9285,14909862:9286,14909863:9287,14909864:9288,14909865:9289,14909866:9290,14909867:9291,14909868:9292,14909869:9293,14909870:9294,14909871:9295,14909872:9296,14909873:9297,14909874:9298,14909875:9299,14909876:9300,14909877:9301,14909878:9302,14909879:9303,14909880:9304,14909881:9305,14909882:9306,14909883:9307,14909884:9308,14909885:9309,14909886:9310,14909887:9311,14910080:9312,14910081:9313,14910082:9314,14910083:9315,14910084:9316,14910085:9317,14910086:9318,14910087:9319,14910088:9320,14910089:9321,14910090:9322,14910091:9323,14910092:9324,14910093:9325,14910094:9326,14910095:9327,14910096:9328,14910097:9329,14910098:9330,14910099:9331,14910113:9505,14910114:9506,14910115:9507,14910116:9508,14910117:9509,14910118:9510,14910119:9511,14910120:9512,14910121:9513,14910122:9514,14910123:9515,14910124:9516,14910125:9517,14910126:9518,14910127:9519,14910128:9520,14910129:9521,14910130:9522,14910131:9523,14910132:9524,14910133:9525,14910134:9526,14910135:9527,14910136:9528,14910137:9529,14910138:9530,14910139:9531,14910140:9532,14910141:9533,14910142:9534,14910143:9535,14910336:9536,14910337:9537,14910338:9538,14910339:9539,14910340:9540,14910341:9541,14910342:9542,14910343:9543,14910344:9544,14910345:9545,14910346:9546,14910347:9547,14910348:9548,14910349:9549,14910350:9550,14910351:9551,14910352:9552,14910353:9553,14910354:9554,14910355:9555,14910356:9556,14910357:9557,14910358:9558,14910359:9559,14910360:9560,14910361:9561,14910362:9562,14910363:9563,14910364:9564,14910365:9565,14910366:9566,14910367:9567,14910368:9568,14910369:9569,14910370:9570,14910371:9571,14910372:9572,14910373:9573,14910374:9574,14910375:9575,14910376:9576,14910377:9577,14910378:9578,14910379:9579,14910380:9580,14910381:9581,14910382:9582,14910383:9583,14910384:9584,14910385:9585,14910386:9586,14910387:9587,14910388:9588,14910389:9589,14910390:9590,52881:9761,52882:9762,52883:9763,52884:9764,52885:9765,52886:9766,52887:9767,52888:9768,52889:9769,52890:9770,52891:9771,52892:9772,52893:9773,52894:9774,52895:9775,52896:9776,52897:9777,52899:9778,52900:9779,52901:9780,52902:9781,52903:9782,52904:9783,52905:9784,52913:9793,52914:9794,52915:9795,52916:9796,52917:9797,52918:9798,52919:9799,52920:9800,52921:9801,52922:9802,52923:9803,52924:9804,52925:9805,52926:9806,52927:9807,53120:9808,53121:9809,53123:9810,53124:9811,53125:9812,53126:9813,53127:9814,53128:9815,53129:9816,53392:10017,53393:10018,53394:10019,53395:10020,53396:10021,53397:10022,53377:10023,53398:10024,53399:10025,53400:10026,53401:10027,53402:10028,53403:10029,53404:10030,53405:10031,53406:10032,53407:10033,53408:10034,53409:10035,53410:10036,53411:10037,53412:10038,53413:10039,53414:10040,53415:10041,53416:10042,53417:10043,53418:10044,53419:10045,53420:10046,53421:10047,53422:10048,53423:10049,53424:10065,53425:10066,53426:10067,53427:10068,53428:10069,53429:10070,53649:10071,53430:10072,53431:10073,53432:10074,53433:10075,53434:10076,53435:10077,53436:10078,53437:10079,53438:10080,53439:10081,53632:10082,53633:10083,53634:10084,53635:10085,53636:10086,53637:10087,53638:10088,53639:10089,53640:10090,53641:10091,53642:10092,53643:10093,53644:10094,53645:10095,53646:10096,53647:10097,14849152:10273,14849154:10274,14849164:10275,14849168:10276,14849176:10277,14849172:10278,14849180:10279,14849196:10280,14849188:10281,14849204:10282,14849212:10283,14849153:10284,14849155:10285,14849167:10286,14849171:10287,14849179:10288,14849175:10289,14849187:10290,14849203:10291,14849195:10292,14849211:10293,14849419:10294,14849184:10295,14849199:10296,14849192:10297,14849207:10298,14849215:10299,14849181:10300,14849200:10301,14849189:10302,14849208:10303,14849410:10304,14989980:12321,15045782:12322,15050883:12323,15308991:12324,15045504:12325,15107227:12326,15109288:12327,15050678:12328,15302818:12329,15241653:12330,15240348:12331,15182224:12332,15106730:12333,15110049:12334,15120549:12335,15112109:12336,15241638:12337,15239846:12338,15314869:12339,15114899:12340,15047847:12341,15111841:12342,15108529:12343,15052443:12344,15050640:12345,15243707:12346,15311796:12347,15185314:12348,15185598:12349,15314574:12350,15108246:12351,15184543:12352,15246007:12353,15052425:12354,15055541:12355,15109257:12356,15112855:12357,15114632:12358,15308679:12359,15310477:12360,15113615:12361,14990245:12362,14990474:12363,14990733:12364,14991005:12365,15040905:12366,15047602:12367,15049911:12368,15050644:12369,15050881:12370,15052937:12371,15106975:12372,15107215:12373,15107504:12374,15112339:12375,15115397:12376,
15172282:12377,15177103:12378,15177136:12379,15181755:12380,15185581:12381,15185839:12382,15238019:12383,15241358:12384,15245731:12385,15248514:12386,15303061:12387,15303098:12388,15043771:12389,14989973:12390,14989989:12391,15048607:12392,15237810:12393,15303553:12394,15180719:12395,14989440:12396,15049649:12397,15121058:12398,15302840:12399,15182002:12400,15240360:12401,15239819:12402,15315119:12403,15041921:12404,15044016:12405,15045309:12406,15045537:12407,15047584:12408,15050683:12409,15056021:12410,15311794:12411,15120299:12412,15238052:12413,15242413:12414,15309218:12577,15309232:12578,15309472:12579,15310779:12580,15044747:12581,15044531:12582,15052423:12583,15172495:12584,15187645:12585,15253378:12586,15309736:12587,15044015:12588,15316380:12589,15182522:12590,14989457:12591,15180435:12592,15239100:12593,15120550:12594,15046808:12595,15045764:12596,15117469:12597,15242394:12598,15315131:12599,15050661:12600,15044265:12601,15119782:12602,15176604:12603,15308431:12604,15047042:12605,14989969:12606,15303051:12607,15309746:12608,15240591:12609,15312012:12610,15044513:12611,15046326:12612,15051952:12613,15056305:12614,15112352:12615,15113139:12616,15114372:12617,15118520:12618,15119283:12619,15119529:12620,15176091:12621,15178632:12622,15182222:12623,15311028:12624,15240113:12625,15245723:12626,15247776:12627,15305645:12628,15120050:12629,15177387:12630,15178634:12631,15312773:12632,15106726:12633,15248513:12634,15251082:12635,15308466:12636,15115918:12637,15044269:12638,15042182:12639,15047826:12640,15048880:12641,15050116:12642,15052468:12643,15055798:12644,15106216:12645,15109801:12646,15110068:12647,15119039:12648,15121556:12649,15172238:12650,15172756:12651,15173017:12652,15173525:12653,15174847:12654,15186049:12655,15239606:12656,15240081:12657,15242903:12658,15303072:12659,15305115:12660,15316123:12661,15049129:12662,15111868:12663,15118746:12664,15176869:12665,15042489:12666,15049902:12667,15050149:12668,15056512:12669,15056796:12670,15108796:12833,15112122:12834,15116458:12835,15117479:12836,15118004:12837,15175307:12838,15187841:12839,15246742:12840,15316140:12841,15316110:12842,15317892:12843,15053473:12844,15118998:12845,15240635:12846,15041668:12847,15053195:12848,15107766:12849,15239046:12850,15114678:12851,15174049:12852,14989721:12853,14991290:12854,15044024:12855,15106473:12856,15120553:12857,15182223:12858,15310771:12859,14989451:12860,15043734:12861,14990254:12862,14990741:12863,14990525:12864,14991009:12865,14990771:12866,15043232:12867,15044527:12868,15046793:12869,15049871:12870,15051649:12871,15052470:12872,15052705:12873,15181713:12874,15112839:12875,15113884:12876,15113910:12877,15117708:12878,15119027:12879,15172011:12880,15175554:12881,15181453:12882,15181502:12883,15182012:12884,15183495:12885,15239857:12886,15240091:12887,15240324:12888,15240631:12889,15241135:12890,15241107:12891,15244710:12892,15248050:12893,15046825:12894,15250088:12895,15253414:12896,15303054:12897,15309982:12898,15243914:12899,14991236:12900,15053736:12901,15108241:12902,15174041:12903,15176891:12904,15239077:12905,15239869:12906,15244222:12907,15250304:12908,15309701:12909,15312019:12910,15312789:12911,14990219:12912,14990490:12913,15247267:12914,15047582:12915,15049098:12916,15049610:12917,15055803:12918,15056811:12919,15106218:12920,15106708:12921,15106466:12922,15107984:12923,15108242:12924,15109008:12925,15111353:12926,15314305:13089,15112614:13090,15114928:13091,15119799:13092,15172016:13093,15177100:13094,15178374:13095,15185333:13096,15239845:13097,15245241:13098,15308427:13099,15309454:13100,15250077:13101,15042481:13102,15043262:13103,15049878:13104,15045299:13105,15052467:13106,15053974:13107,15107496:13108,15115906:13109,15120047:13110,15180429:13111,15242123:13112,15245719:13113,15247794:13114,15306407:13115,15313592:13116,15119788:13117,15312552:13118,15244185:13119,15048355:13120,15114175:13121,15244174:13122,15304846:13123,15043203:13124,15047303:13125,15044740:13126,15055763:13127,15109025:13128,15110841:13129,15114428:13130,15114424:13131,15118011:13132,15175090:13133,15180474:13134,15182251:13135,15247002:13136,15247250:13137,15250859:13138,15252611:13139,15303597:13140,15308451:13141,15309460:13142,15310249:13143,15052198:13144,15053491:13145,15115709:13146,15311245:13147,15311246:13148,15109787:13149,15183008:13150,15116459:13151,15116735:13152,15114934:13153,15315085:13154,15121823:13155,15042994:13156,15046301:13157,15106480:13158,15109036:13159,15119547:13160,15120519:13161,15121297:13162,15241627:13163,15246480:13164,15252868:13165,14989460:13166,15315129:13167,15044534:13168,15115419:13169,15116474:13170,15310468:13171,15114410:13172,15041948:13173,15182723:13174,15241906:13175,15304604:13176,15306380:13177,15047067:13178,15316136:13179,15114402:13180,15240325:13181,15241393:13182,15184549:13345,15042696:13346,15240069:13347,15176614:13348,14989758:13349,14990979:13350,15042208:13351,15052690:13352,15042698:13353,15043480:13354,15043495:13355,15054779:13356,15046298:13357,15048874:13358,15050662:13359,15052428:13360,15052440:13361,15052699:13362,15055282:13363,15055289:13364,15106723:13365,15107231:13366,15107491:13367,15107774:13368,15110043:13369,15111586:13370,15114129:13371,15114643:13372,15115194:13373,15117502:13374,15117715:13375,15118743:13376,15121570:13377,15122071:13378,15121797:13379,15176368:13380,15176856:13381,15178659:13382,15178891:13383,15182783:13384,15183521:13385,15184033:13386,15185833:13387,15187126:13388,15187888:13389,15237789:13390,15239590:13391,15240862:13392,15247027:13393,15248268:13394,15250091:13395,15303300:13396,15307153:13397,15308435:13398,15308433:13399,15308450:13400,15309221:13401,15310739:13402,15312040:13403,15239320:13404,14989496:13405,15044779:13406,15053496:13407,15054732:13408,15175337:13409,15178124:13410,15178940:13411,15053481:13412,15187883:13413,15250571:13414,15309697:13415,15310993:13416,15311252:13417,15311256:13418,14990465:13419,14990478:13420,15044017:13421,15046300:13422,15047080:13423,15048634:13424,15050119:13425,15051913:13426,15052676:13427,15053456:13428,15054988:13429,15055294:13430,15056780:13431,15110062:13432,15113402:13433,15112087:13434,15112098:13435,15113375:13436,15115147:13437,15115140:13438,15116703:13601,15055024:13602,15118213:13603,15118487:13604,15118781:13605,15177151:13606,15181192:13607,15052195:13608,15181952:13609,15185024:13610,15056573:13611,15246991:13612,15247512:13613,15250100:13614,15250871:13615,15252364:13616,15252637:13617,15311778:13618,15313038:13619,15314108:13620,14989952:13621,15040957:13622,15041664:13623,15050387:13624,15052444:13625,15108271:13626,15108736:13627,15111084:13628,15117498:13629,15174304:13630,15177361:13631,15181191:13632,15187625:13633,15245243:13634,15248060:13635,15248816:13636,15109804:13637,15241098:13638,15310496:13639,15044745:13640,15044739:13641,15046315:13642,15114644:13643,15116696:13644,15247792:13645,15179943:13646,15113653:13647,15317901:13648,15044020:13649,15052450:13650,15238298:13651,15243664:13652,15302790:13653,14989464:13654,14989701:13655,14990215:13656,14990481:13657,15044490:13658,15044792:13659,15052462:13660,15056019:13661,15106213:13662,15111569:13663,15113405:13664,15118722:13665,15118770:13666,15119267:13667,15172024:13668,15175811:13669,15182262:13670,15182510:13671,15182984:13672,15185050:13673,15184830:13674,15185318:13675,15112103:13676,15174043:13677,15044283:13678,15053189:13679,15054760:13680,15109010:13681,15109024:13682,15109273:13683,15120544:13684,15243674:13685,15247537:13686,15251357:13687,15305656:13688,15121537:13689,15181478:13690,15314330:13691,14989992:13692,14989995:13693,14989996:13694,14991003:13857,14991008:13858,15041425:13859,15041927:13860,15182774:13861,15041969:13862,15042486:13863,15043988:13864,15043745:13865,15044031:13866,15044523:13867,15046316:13868,15049347:13869,15053729:13870,15056055:13871,15056266:13872,15106223:13873,15106448:13874,15106477:13875,15109279:13876,15111577:13877,15116683:13878,15119233:13879,15174530:13880,15174573:13881,15179695:13882,
15238072:13883,15238277:13884,15239304:13885,15242638:13886,15303607:13887,15306657:13888,15310783:13889,15312279:13890,15313306:13891,14990256:13892,15042461:13893,15052973:13894,15112833:13895,15115693:13896,15053184:13897,15113138:13898,15115701:13899,15175305:13900,15114640:13901,15184513:13902,15041413:13903,15043492:13904,15048071:13905,15054782:13906,15305894:13907,15111844:13908,15117475:13909,15117501:13910,15175860:13911,15181441:13912,15181501:13913,15183243:13914,15185802:13915,15239865:13916,15241100:13917,15245759:13918,15246751:13919,15248569:13920,15253393:13921,15304593:13922,15044767:13923,15305344:13924,14989725:13925,15040694:13926,15044517:13927,15043770:13928,15174551:13929,15175318:13930,15179689:13931,15240102:13932,15252143:13933,15312774:13934,15312776:13935,15312786:13936,15041975:13937,15107226:13938,15243678:13939,15046320:13940,15182266:13941,15040950:13942,15052691:13943,15303047:13944,15309445:13945,14989490:13946,15117211:13947,15304615:13948,15053201:13949,15053192:13950,15109784:14113,15182495:14114,15118995:14115,15310260:14116,15252897:14117,15182506:14118,15173258:14119,15309448:14120,15184514:14121,15114391:14122,15186352:14123,15114641:14124,15306156:14125,15043506:14126,15044763:14127,15242923:14128,15247507:14129,15187620:14130,15252365:14131,15303585:14132,15044006:14133,15245960:14134,15181185:14135,14991234:14136,15041214:14137,15042705:14138,15041924:14139,15046035:14140,15047853:14141,15175594:14142,15048331:14143,15050129:14144,15056290:14145,15056516:14146,15106485:14147,15107510:14148,15107495:14149,15107753:14150,15109810:14151,15110330:14152,15111596:14153,15112623:14154,15114626:14155,15120531:14156,15177126:14157,15182013:14158,15184827:14159,15185292:14160,15185561:14161,15186315:14162,15187371:14163,15240334:14164,15240586:14165,15244173:14166,15247496:14167,15247779:14168,15248806:14169,15252413:14170,15311002:14171,15316623:14172,15239864:14173,15253390:14174,15314856:14175,15043207:14176,15108255:14177,15110787:14178,15122304:14179,15309465:14180,15114625:14181,15041169:14182,15117472:14183,15118778:14184,15121812:14185,15182260:14186,15185296:14187,15245696:14188,15247523:14189,15113352:14190,14990262:14191,15040697:14192,15040678:14193,15040933:14194,15041980:14195,15042744:14196,15042979:14197,15046311:14198,15047823:14199,15048837:14200,15051660:14201,15055802:14202,15107762:14203,15108024:14204,15109043:14205,15109554:14206,15115420:14369,15116457:14370,15174077:14371,15174316:14372,15174830:14373,15179924:14374,15180207:14375,15185337:14376,15178892:14377,15237801:14378,15246987:14379,15248537:14380,15250338:14381,15252370:14382,15303075:14383,15306165:14384,15309242:14385,15311253:14386,15313043:14387,15317432:14388,15041923:14389,15044255:14390,15044275:14391,15055291:14392,15056038:14393,15120539:14394,15121040:14395,15175300:14396,15175614:14397,15185283:14398,15239351:14399,15247488:14400,15248314:14401,15309200:14402,14989710:14403,15040651:14404,15044516:14405,15045052:14406,15047610:14407,15050641:14408,15052196:14409,15054769:14410,15055531:14411,15056039:14412,15108280:14413,15111557:14414,15113903:14415,15120790:14416,15174544:14417,15184778:14418,15246004:14419,15237793:14420,15238049:14421,15241136:14422,15243662:14423,15248007:14424,15251368:14425,15304887:14426,15309703:14427,15311271:14428,15318163:14429,14989972:14430,14989970:14431,14990477:14432,15043976:14433,15045001:14434,15044798:14435,15050927:14436,15056524:14437,15056545:14438,15106719:14439,15114919:14440,15116942:14441,15176090:14442,15180417:14443,15248030:14444,15248036:14445,15248823:14446,15304336:14447,14989726:14448,15314825:14449,14989988:14450,14990780:14451,14991023:14452,15040665:14453,15040662:14454,15041929:14455,15041964:14456,15043231:14457,15043257:14458,15043518:14459,15044250:14460,15044515:14461,15044753:14462,15044750:14625,15046281:14626,15048081:14627,15048354:14628,15050173:14629,15052180:14630,15052189:14631,15052431:14632,15054757:14633,15054759:14634,15054775:14635,15055288:14636,15055491:14637,15055514:14638,15055543:14639,15056024:14640,15106450:14641,15107468:14642,15108759:14643,15109016:14644,15109799:14645,15111355:14646,15112322:14647,15112579:14648,15113140:14649,15113645:14650,15114401:14651,15114903:14652,15116171:14653,15118751:14654,15119530:14655,15119785:14656,15120559:14657,15121053:14658,15176882:14659,15178375:14660,15180204:14661,15182015:14662,15184800:14663,15185029:14664,15185048:14665,15185310:14666,15185585:14667,15237269:14668,15237251:14669,15237807:14670,15237809:14671,15238548:14672,15238799:14673,15239338:14674,15240594:14675,15245708:14676,15245729:14677,15248539:14678,15250082:14679,15250364:14680,15303562:14681,15304117:14682,15305137:14683,15179967:14684,15305660:14685,15308452:14686,15309197:14687,15310981:14688,15312537:14689,15313816:14690,15316155:14691,15042971:14692,15043243:14693,15044535:14694,15044744:14695,15049621:14696,15109047:14697,15122336:14698,15249834:14699,15252895:14700,15317689:14701,15041931:14702,15042747:14703,15045002:14704,15047613:14705,15182208:14706,15304119:14707,15316384:14708,15317906:14709,15175044:14710,15121545:14711,15238576:14712,15176849:14713,15056829:14714,15106970:14715,15313576:14716,15174555:14717,15253180:14718,15117732:14881,15310979:14882,14990218:14883,15047600:14884,15048100:14885,15049406:14886,15051162:14887,15106472:14888,15107975:14889,15112335:14890,15112326:14891,15114425:14892,15114929:14893,15120311:14894,15177621:14895,15185082:14896,15239598:14897,15314306:14898,14989979:14899,14990736:14900,15044489:14901,15045766:14902,15054255:14903,15054758:14904,15054766:14905,15114171:14906,15119001:14907,15176115:14908,15179906:14909,15247760:14910,15306390:14911,15246239:14912,15048080:14913,15055527:14914,15109291:14915,15041205:14916,15041196:14917,15042189:14918,15113344:14919,15045513:14920,15049118:14921,15050427:14922,15052464:14923,15056297:14924,15108493:14925,15109793:14926,15114429:14927,15117747:14928,15120520:14929,15172029:14930,15304583:14931,15174272:14932,15179925:14933,15179942:14934,15181229:14935,15111822:14936,15185072:14937,15241116:14938,15246209:14939,15252617:14940,15309467:14941,15042980:14942,15047848:14943,15113616:14944,15187370:14945,15250081:14946,15042228:14947,15048066:14948,15308970:14949,15048890:14950,15115914:14951,15237812:14952,15045298:14953,15053966:14954,15048636:14955,15180437:14956,15316922:14957,14990748:14958,15042954:14959,15045259:14960,15110334:14961,15112360:14962,15113364:14963,15114165:14964,15182468:14965,15183254:14966,15185058:14967,15305903:14968,15114652:14969,15314605:14970,15183033:14971,15043737:14972,15042186:14973,15042743:14974,15052703:15137,15109046:15138,15110830:15139,15111078:15140,15113389:15141,15118010:15142,15242921:15143,15309713:15144,15178384:15145,15314838:15146,15109516:15147,15305862:15148,15314603:15149,15178431:15150,15112594:15151,14989449:15152,15041176:15153,15044482:15154,15053233:15155,15106984:15156,15110802:15157,15111587:15158,15114655:15159,15173542:15160,15175562:15161,15176867:15162,15183511:15163,15186562:15164,15243925:15165,15249027:15166,15250331:15167,15304120:15168,15312016:15169,15111852:15170,15112875:15171,15117963:15172,14990229:15173,14990228:15174,14990522:15175,14990783:15176,15042746:15177,15044536:15178,15044530:15179,15046563:15180,15047579:15181,15049643:15182,15050635:15183,15050633:15184,15050687:15185,15052176:15186,15053197:15187,15054978:15188,15055019:15189,15056791:15190,15106205:15191,15109255:15192,15111343:15193,15052188:15194,15111855:15195,15111869:15196,15112104:15197,15113885:15198,15117730:15199,15117755:15200,15118479:15201,15175045:15202,15181193:15203,15181697:15204,15184824:15205,15185049:15206,15185067:15207,15237794:15208,15238274:15209,15239091:15210,15246998:15211,15247774:15212,15247785:15213,15247782:15214,15248012:15215,15248302:15216,15250311:15217,15250332:15218,15309708:15219,15311804:15220,15117743:15221,14989963:15222,14990524:15223,14990989:15224,15041936:15225,15052183:15226,
15052730:15227,15107464:15228,15109249:15229,15112578:15230,15117473:15393,15121291:15394,15119035:15395,15173822:15396,15176381:15397,15177620:15398,15180673:15399,15180986:15400,15237260:15401,15237299:15402,15239082:15403,15241876:15404,15253150:15405,15118736:15406,15317439:15407,15056015:15408,15248792:15409,15316139:15410,15182778:15411,15252408:15412,15052429:15413,15309739:15414,14989443:15415,15044529:15416,15048631:15417,15049905:15418,15051657:15419,15052452:15420,15106697:15421,15120831:15422,15121542:15423,15177406:15424,15250346:15425,15052447:15426,15242368:15427,15183776:15428,15040946:15429,15114164:15430,15239837:15431,15053217:15432,15242634:15433,15186078:15434,15239310:15435,15042201:15436,15052932:15437,15109544:15438,15250854:15439,15111836:15440,15173038:15441,15180990:15442,15185047:15443,15237253:15444,15248541:15445,15252362:15446,15303086:15447,15244167:15448,15303338:15449,15040671:15450,15043514:15451,15052986:15452,15113619:15453,15172028:15454,15173813:15455,15304076:15456,15304584:15457,15305899:15458,15240101:15459,15052674:15460,15056049:15461,15107001:15462,14989499:15463,15044502:15464,15052424:15465,15108491:15466,15113393:15467,15117962:15468,15174569:15469,15175584:15470,15181998:15471,15238571:15472,15251107:15473,15304082:15474,15312534:15475,15041682:15476,15044503:15477,15045034:15478,15052735:15479,15109768:15480,15116473:15481,15185580:15482,15309952:15483,15047578:15484,15044494:15485,15045032:15486,15052439:15649,15052977:15650,15054750:15651,14991278:15652,15107201:15653,15109054:15654,15119538:15655,15181696:15656,15181707:15657,15185282:15658,15186317:15659,15187858:15660,15239085:15661,15239327:15662,15241872:15663,15245702:15664,15246770:15665,15249040:15666,15251892:15667,15252655:15668,15302833:15669,15304075:15670,15304108:15671,15309702:15672,15304348:15673,14990208:15674,14990735:15675,15041925:15676,15043969:15677,15056531:15678,15108238:15679,15114132:15680,15118721:15681,15120523:15682,15175075:15683,15186086:15684,15304589:15685,15305347:15686,15044500:15687,15049881:15688,15052479:15689,15120273:15690,15181213:15691,15186094:15692,15184539:15693,15049150:15694,15173279:15695,15042490:15696,15245715:15697,15253424:15698,14991242:15699,15053755:15700,15112357:15701,15179436:15702,15182755:15703,15239324:15704,15312831:15705,15042438:15706,15056554:15707,15112108:15708,15115695:15709,15117961:15710,15120307:15711,15121046:15712,15121828:15713,15178686:15714,15185044:15715,15054753:15716,15303093:15717,15304327:15718,15310982:15719,15042470:15720,15042717:15721,15108480:15722,15112849:15723,15113113:15724,15120538:15725,15055542:15726,15185810:15727,15187378:15728,15113144:15729,15242927:15730,15243191:15731,15248312:15732,15043241:15733,15044505:15734,15050163:15735,15055503:15736,15056528:15737,15106453:15738,15305636:15739,15309220:15740,15041207:15741,15041695:15742,15043485:15905,15043744:15906,15043975:15907,15044524:15908,15045544:15909,15046022:15910,15045809:15911,15046807:15912,15050152:15913,15050430:15914,15050940:15915,15052469:15916,15052934:15917,15052943:15918,15052945:15919,15052954:15920,15055492:15921,15055498:15922,15055776:15923,15056304:15924,15108543:15925,15108740:15926,15109019:15927,15109772:15928,15109559:15929,15112327:15930,15112332:15931,15112365:15932,15112630:15933,15113662:15934,15114914:15935,15116447:15936,15116469:15937,15119036:15938,15120008:15939,15120521:15940,15120792:15941,15172796:15942,15172774:15943,15173031:15944,15177607:15945,15178881:15946,15180189:15947,15180929:15948,15181221:15949,15181744:15950,15182752:15951,15182993:15952,15184551:15953,15185081:15954,15237782:15955,15241110:15956,15241867:15957,15242633:15958,15245725:15959,15246259:15960,15247519:15961,15247548:15962,15247764:15963,15247795:15964,15249825:15965,15250334:15966,15304356:15967,15305126:15968,15306174:15969,15306904:15970,15309468:15971,15310488:15972,14989450:15973,14989448:15974,14989470:15975,14989719:15976,15042199:15977,15042992:15978,15048590:15979,15048884:15980,15049612:15981,15051938:15982,15055032:15983,15106949:15984,15111102:15985,15113633:15986,15113622:15987,15119748:15988,15174326:15989,15177139:15990,15182243:15991,15241912:15992,15248818:15993,15304376:15994,15305888:15995,15046833:15996,15048628:15997,15311806:15998,15109037:16161,15115405:16162,15117974:16163,15173549:16164,15186324:16165,15237559:16166,15239602:16167,15247270:16168,15311775:16169,15244693:16170,15253169:16171,15052987:16172,14990520:16173,14991265:16174,14991029:16175,15045767:16176,15050912:16177,15052701:16178,15052713:16179,15056771:16180,15107470:16181,15109295:16182,15111856:16183,15112587:16184,15115182:16185,15115931:16186,15119800:16187,15120305:16188,15176883:16189,15177401:16190,15178911:16191,15181214:16192,15181734:16193,15185075:16194,15239075:16195,15239855:16196,15242922:16197,15247018:16198,15247546:16199,15252139:16200,15253147:16201,15302834:16202,15304605:16203,15309959:16204,14990010:16205,14990209:16206,15042691:16207,15049141:16208,15049644:16209,15052939:16210,15176858:16211,15052989:16212,15238542:16213,15247498:16214,15253381:16215,15309219:16216,15310253:16217,15183013:16218,15248271:16219,15310984:16220,15304098:16221,15047603:16222,15044264:16223,15302807:16224,15044793:16225,15048322:16226,15055013:16227,15109800:16228,15118516:16229,15172234:16230,15179169:16231,15184523:16232,15187872:16233,15245744:16234,15303042:16235,15304084:16236,15305872:16237,15305880:16238,15309455:16239,15176094:16240,15313796:16241,15053959:16242,15054249:16243,15111600:16244,15113890:16245,15251112:16246,15309723:16247,15109550:16248,15113609:16249,15115417:16250,15241093:16251,15310999:16252,15309696:16253,15246270:16254,15122052:16417,15110586:16418,15052728:16419,14989462:16420,15171756:16421,15177117:16422,15112367:16423,15042436:16424,15042742:16425,15043490:16426,15050643:16427,15056513:16428,15106215:16429,15108240:16430,15111359:16431,15111604:16432,15112351:16433,15112628:16434,15115186:16435,15114390:16436,15117731:16437,15120517:16438,15174066:16439,15176863:16440,15178651:16441,15184574:16442,15237526:16443,15049648:16444,15246269:16445,15246783:16446,15248032:16447,15248019:16448,15248267:16449,15302813:16450,15304338:16451,15310226:16452,15310233:16453,15111817:16454,15181966:16455,15238278:16456,15309499:16457,15055021:16458,15106972:16459,15108250:16460,15111845:16461,15112340:16462,15113872:16463,15179699:16464,15182221:16465,15184269:16466,15186110:16467,15238282:16468,15250092:16469,15250852:16470,15251361:16471,15251871:16472,15180457:16473,15042695:16474,15109017:16475,15109797:16476,15110530:16477,15108760:16478,15247533:16479,15182467:16480,15183744:16481,15248044:16482,15309738:16483,15185334:16484,15239308:16485,15244681:16486,14990233:16487,15041928:16488,15043971:16489,15044e3:16490,15052451:16491,15052930:16492,15052950:16493,15054749:16494,15108262:16495,15108487:16496,15110832:16497,15114387:16498,15114420:16499,15119241:16500,15119749:16501,15119511:16502,15114131:16503,15121820:16504,15173006:16505,15173053:16506,15112075:16507,15182271:16508,15183533:16509,15185818:16510,15186314:16673,15187624:16674,15238586:16675,15239323:16676,15239353:16677,15242918:16678,15247790:16679,15250318:16680,15251381:16681,15303096:16682,15303095:16683,15305389:16684,15305361:16685,15308419:16686,15314606:16687,15042957:16688,15046276:16689,15121592:16690,15172790:16691,15041960:16692,15181445:16693,15186325:16694,15238835:16695,15184782:16696,15047052:16697,15049105:16698,15053480:16699,15109802:16700,15113150:16701,15113149:16702,15115674:16703,15174553:16704,15177359:16705,15177358:16706,15180942:16707,15181206:16708,15181727:16709,15184535:16710,15185056:16711,15185284:16712,15243399:16713,15247540:16714,15308987:16715,15303073:16716,15318176:16717,15041447:16718,15042997:16719,15044492:16720,15044514:16721,15040649:16722,15046314:16723,15049646:16724,15050127:16725,15173821:16726,15052427:16727,15053220:16728,15043741:16729,15106979:16730,15106995:16731,15109532:16732,
15109763:16733,15109311:16734,15109819:16735,15111053:16736,15112105:16737,15113145:16738,15054755:16739,15116173:16740,15116221:16741,15121557:16742,15173541:16743,14989961:16744,15177641:16745,15178680:16746,15182483:16747,15184799:16748,15185807:16749,15185564:16750,15237537:16751,15240585:16752,15240600:16753,15241644:16754,15241916:16755,15243195:16756,15246213:16757,15250864:16758,15302785:16759,15303085:16760,15306391:16761,15309980:16762,15313042:16763,15041423:16764,15049367:16765,15107726:16766,15239059:16929,15242421:16930,15250568:16931,15302816:16932,14991235:16933,15040948:16934,15042951:16935,15044019:16936,15106479:16937,15109513:16938,15113631:16939,15120556:16940,15251123:16941,15302815:16942,14991255:16943,15053214:16944,15250314:16945,15112079:16946,15185562:16947,15043986:16948,15245974:16949,15041974:16950,15110019:16951,15052184:16952,15052203:16953,15052938:16954,15110285:16955,15113617:16956,15303068:16957,14990230:16958,15049882:16959,15049898:16960,15118768:16961,15247761:16962,15045822:16963,15048853:16964,15050405:16965,15106992:16966,15108499:16967,15114113:16968,15239349:16969,15115669:16970,15309184:16971,15312772:16972,15313064:16973,14990739:16974,15048838:16975,15052734:16976,15237264:16977,15053489:16978,15055023:16979,15056517:16980,15106208:16981,15107467:16982,15108276:16983,15113151:16984,15119280:16985,15121310:16986,15238030:16987,15238591:16988,15240084:16989,15245963:16990,15250104:16991,15302784:16992,15302830:16993,15309450:16994,15317915:16995,15314843:16996,14990243:16997,15044528:16998,15049895:16999,15183020:17e3,15304333:17001,15311244:17002,15316921:17003,15121309:17004,15171751:17005,15043987:17006,15046020:17007,15052421:17008,15108504:17009,15108766:17010,15109011:17011,15119010:17012,15122351:17013,15175842:17014,15247511:17015,15306936:17016,15122305:17017,15248318:17018,15240376:17019,15042471:17020,15244216:17021,15044522:17022,15044521:17185,14990726:17186,15303060:17187,15253168:17188,15050154:17189,15238321:17190,15054781:17191,15182762:17192,15253183:17193,15115162:17194,15249591:17195,15174584:17196,15315336:17197,15116477:17198,15248048:17199,14989497:17200,15043992:17201,15046790:17202,15048102:17203,15108997:17204,15109794:17205,15112102:17206,15117710:17207,15120289:17208,15120795:17209,15172269:17210,15179693:17211,15182767:17212,15183530:17213,15185595:17214,15237309:17215,15238022:17216,15244171:17217,15248021:17218,15306139:17219,15047587:17220,15049607:17221,15056062:17222,15111853:17223,15112854:17224,15116928:17225,15118005:17226,15176887:17227,15248263:17228,15040676:17229,15179685:17230,15047856:17231,15056027:17232,15106469:17233,15112634:17234,15118752:17235,15177652:17236,15181978:17237,15187374:17238,15239092:17239,15244440:17240,15303045:17241,15312563:17242,15183753:17243,15177116:17244,15182777:17245,15183249:17246,15242116:17247,15302800:17248,15181737:17249,15182482:17250,15240374:17251,15051681:17252,15179136:17253,14989485:17254,14990258:17255,15052441:17256,15056800:17257,15108797:17258,15112380:17259,15114161:17260,15119272:17261,15243691:17262,15245751:17263,15247547:17264,15304078:17265,15305651:17266,15312784:17267,15116439:17268,15171750:17269,15174826:17270,15240103:17271,15241623:17272,15250095:17273,14989441:17274,15041926:17275,15042443:17276,15046283:17277,15052725:17278,15054998:17441,15055027:17442,15055489:17443,15056020:17444,15056053:17445,15056299:17446,15056564:17447,15108018:17448,15109265:17449,15112866:17450,15113373:17451,15121838:17452,15174034:17453,15176890:17454,15178938:17455,15237556:17456,15238329:17457,15238584:17458,15244726:17459,15248063:17460,15248284:17461,15251077:17462,15251379:17463,15305370:17464,15308215:17465,15310978:17466,15315877:17467,15043461:17468,15109527:17469,15178676:17470,15113365:17471,15118984:17472,15175565:17473,15250307:17474,15306414:17475,15309235:17476,15119525:17477,15049372:17478,15115406:17479,15116172:17480,15253437:17481,15306394:17482,15177627:17483,15302810:17484,15049114:17485,15114370:17486,15109812:17487,15116219:17488,14990723:17489,15121580:17490,15114136:17491,15253179:17492,15242406:17493,15185588:17494,15306132:17495,15115455:17496,15121840:17497,15048106:17498,15049655:17499,15051948:17500,15185068:17501,15173802:17502,15044746:17503,15304611:17504,15316660:17505,14989997:17506,14990734:17507,15040924:17508,15040949:17509,15042947:17510,15250078:17511,15045e3:17512,15048868:17513,15052442:17514,15055005:17515,15055509:17516,15055533:17517,15055799:17518,15056031:17519,15106700:17520,15108789:17521,15109306:17522,15110032:17523,15114927:17524,15118720:17525,15180423:17526,15181454:17527,15181963:17528,15185824:17529,15239559:17530,15247490:17531,15248294:17532,15251844:17533,15302803:17534,15303352:17697,15303853:17698,15304600:17699,15318158:17700,15119269:17701,15110552:17702,15111074:17703,15111605:17704,15121332:17705,15178372:17706,15183003:17707,15303081:17708,15306641:17709,15121082:17710,15045554:17711,15056569:17712,15110820:17713,15252877:17714,15253421:17715,15305092:17716,15041976:17717,15049131:17718,15049897:17719,15053205:17720,15055511:17721,15120315:17722,15186575:17723,15176860:17724,15250108:17725,15252386:17726,15311259:17727,15172281:17728,14990493:17729,15118015:17730,15122097:17731,15176880:17732,15309755:17733,15041934:17734,15044752:17735,15048885:17736,15049111:17737,15050412:17738,15053216:17739,15056530:17740,15111831:17741,15113628:17742,15120545:17743,15178171:17744,15241119:17745,15250349:17746,15302804:17747,15303613:17748,15306125:17749,15179941:17750,15179962:17751,15043242:17752,15055526:17753,15047839:17754,15050164:17755,15106194:17756,15040658:17757,15041946:17758,15042220:17759,15042445:17760,15042688:17761,15045776:17762,15049108:17763,15049112:17764,15050135:17765,15052437:17766,15053750:17767,15054475:17768,15106748:17769,15108757:17770,15110317:17771,15113649:17772,15114627:17773,15114940:17774,15115167:17775,15178647:17776,15120280:17777,15120815:17778,15120027:17779,15172015:17780,15173512:17781,15056275:17782,15177624:17783,15181239:17784,15183241:17785,15183252:17786,15183250:17787,15184790:17788,15185329:17789,15042736:17790,15241635:17953,15242665:17954,15243172:17955,15247502:17956,15248516:17957,15249798:17958,15251599:17959,15302787:17960,15302799:17961,15306905:17962,15309238:17963,15311021:17964,15313072:17965,15308696:17966,15041421:17967,15043477:17968,15044748:17969,15048834:17970,15052942:17971,15107751:17972,15110814:17973,15119518:17974,15179443:17975,15182757:17976,15238068:17977,15241348:17978,15303059:17979,15305349:17980,15053728:17981,15316103:17982,15043775:17983,15056535:17984,15056563:17985,15120028:17986,15174073:17987,15179171:17988,15181503:17989,15183780:17990,15118226:17991,15174572:17992,15248045:17993,15114371:17994,15116705:17995,15042488:17996,15182465:17997,15115444:17998,15053194:17999,15315894:18e3,15240107:18001,15052677:18002,15304073:18003,15171742:18004,15047096:18005,15053231:18006,15106951:18007,15111590:18008,15118988:18009,15249818:18010,15303041:18011,15310995:18012,15045009:18013,15113095:18014,15304845:18015,15050120:18016,15303331:18017,15042181:18018,14989709:18019,15042474:18020,15242905:18021,15248526:18022,15171992:18023,15109562:18024,15306123:18025,15115682:18026,15312564:18027,15186052:18028,15177143:18029,15043991:18030,15115680:18031,15252383:18032,15309731:18033,15118749:18034,14989964:18035,15052988:18036,15056016:18037,15253417:18038,15043714:18039,15250321:18040,15237769:18041,15243705:18042,15055807:18043,15112101:18044,14989747:18045,15041957:18046,15050370:18209,15052991:18210,15310766:18211,14990267:18212,15050378:18213,15056781:18214,15248013:18215,15122337:18216,15181488:18217,15181218:18218,15052711:18219,15241649:18220,15174827:18221,15173297:18222,15055284:18223,15056821:18224,15109563:18225,15110810:18226,15173507:18227,15184536:18228,14989699:18229,15055804:18230,14989707:18231,15048604:18232,15047330:18233,15106729:18234,15122307:18235,15185037:18236,15238077:18237,15238323:18238,
15238847:18239,15253170:18240,15246999:18241,15243940:18242,15054772:18243,15108746:18244,15110829:18245,15246983:18246,15113655:18247,15119266:18248,15119550:18249,15175862:18250,15179956:18251,15051142:18252,15187381:18253,15239853:18254,15312556:18255,14991283:18256,15055747:18257,15109021:18258,15109778:18259,15111575:18260,15113647:18261,15178627:18262,15174028:18263,15238028:18264,15237818:18265,15252649:18266,15304077:18267,15040653:18268,15048633:18269,15051410:18270,15114885:18271,15115699:18272,15173028:18273,15174589:18274,15250103:18275,15049650:18276,15250336:18277,15309226:18278,15302809:18279,15244735:18280,15181732:18281,15179687:18282,15241385:18283,14990511:18284,15042981:18285,15043994:18286,15109005:18287,15114127:18288,15119242:18289,15178173:18290,15183508:18291,15184533:18292,15239350:18293,15242884:18294,15253419:18295,15113117:18296,15121568:18297,15173766:18298,15186075:18299,15240875:18300,15312769:18301,15317670:18302,15042493:18465,15183537:18466,15180210:18467,15183544:18468,15237767:18469,15183240:18470,15117224:18471,15055265:18472,15237772:18473,15177105:18474,15177120:18475,15041963:18476,15305122:18477,15121036:18478,15178170:18479,15304343:18480,15313834:18481,14990480:18482,15187376:18483,15108764:18484,15183247:18485,15308453:18486,15315881:18487,15047098:18488,15049113:18489,15244196:18490,15309500:18491,14990516:18492,15042724:18493,15043978:18494,15044493:18495,15044507:18496,15054982:18497,15110316:18498,15111825:18499,15113663:18500,15118526:18501,15118734:18502,15174024:18503,15174319:18504,15175597:18505,15177108:18506,15186305:18507,15239340:18508,15243177:18509,15250089:18510,15183748:18511,15304582:18512,15173033:18513,15310994:18514,15311791:18515,15109309:18516,15112617:18517,15177130:18518,15178660:18519,15180688:18520,15242627:18521,15244206:18522,15043754:18523,15043985:18524,15044774:18525,15050371:18526,15055495:18527,15056316:18528,15106738:18529,15108489:18530,15108537:18531,15108779:18532,15111824:18533,15118228:18534,15119244:18535,15177394:18536,15178414:18537,15180433:18538,15181720:18539,15185803:18540,15187383:18541,15237797:18542,15245995:18543,15248057:18544,15250107:18545,15303103:18546,15310238:18547,15311771:18548,15116427:18549,15184056:18550,15041177:18551,15052990:18552,15056558:18553,15113863:18554,15118232:18555,15175861:18556,15178889:18557,15187598:18558,15318203:18721,15114122:18722,15181975:18723,15043769:18724,15177355:18725,15313837:18726,15056294:18727,15238813:18728,15241137:18729,15237784:18730,15056060:18731,15056773:18732,15177122:18733,15183238:18734,15302844:18735,15114663:18736,15050667:18737,15051419:18738,15185040:18739,15178174:18740,15248556:18741,14991285:18742,15056298:18743,15116441:18744,15118519:18745,15121538:18746,15176610:18747,15181224:18748,15245736:18749,15247765:18750,15249849:18751,15055775:18752,15110031:18753,15177605:18754,15181714:18755,15240087:18756,15305896:18757,15305650:18758,15241884:18759,15244205:18760,15315117:18761,15045505:18762,15056300:18763,15111820:18764,15119772:18765,15171733:18766,15250087:18767,15250323:18768,15311035:18769,15111567:18770,15176630:18771,14989453:18772,14990232:18773,15048608:18774,15049899:18775,15051174:18776,15052684:18777,15042216:18778,15054979:18779,15055516:18780,15106198:18781,15108534:18782,15111607:18783,15111847:18784,15112622:18785,15119790:18786,15173814:18787,15183014:18788,15238544:18789,15238810:18790,15239833:18791,15248796:18792,15250080:18793,15250342:18794,15250868:18795,15308956:18796,15309188:18797,14991022:18798,15110827:18799,15117734:18800,15239326:18801,15241633:18802,15242666:18803,15303592:18804,15052929:18805,15115667:18806,15311528:18807,15241658:18808,15242647:18809,14990479:18810,15042991:18811,15056553:18812,15055237:18813,15113357:18814,15181455:18977,15238585:18978,15246471:18979,15246982:18980,15120309:18981,15056023:18982,15108501:18983,15119032:18984,14990223:18985,15174057:18986,15314578:18987,15042694:18988,15044795:18989,15047092:18990,15049395:18991,15107748:18992,15108526:18993,15172762:18994,15050158:18995,15184521:18996,15184798:18997,15185051:18998,15309744:18999,15111815:19e3,15237534:19001,14989465:19002,14990773:19003,15041973:19004,15049088:19005,15055267:19006,15055283:19007,15056010:19008,15114116:19009,14989478:19010,15242429:19011,15308425:19012,15309211:19013,15184307:19014,15310977:19015,15041467:19016,15049601:19017,15178134:19018,15180455:19019,15042725:19020,15179429:19021,15242385:19022,15183494:19023,15040911:19024,15049865:19025,15174023:19026,15183751:19027,15185832:19028,15253178:19029,15253396:19030,15303053:19031,14991039:19032,15043465:19033,15050921:19034,15056001:19035,15310509:19036,14991261:19037,15239319:19038,15305642:19039,15047811:19040,15109525:19041,15117737:19042,15176875:19043,15246236:19044,15252628:19045,15182210:19046,15043487:19047,15049363:19048,15107477:19049,15108234:19050,15112878:19051,15118221:19052,15184063:19053,15241129:19054,15040675:19055,14991288:19056,15043717:19057,15044998:19058,15048881:19059,15050121:19060,15052445:19061,15053744:19062,15053743:19063,15053993:19064,15055510:19065,15108785:19066,15109543:19067,15111358:19068,15111865:19069,15113355:19070,15119253:19233,15119265:19234,15172537:19235,15179954:19236,15186091:19237,15238046:19238,15239859:19239,15241356:19240,15242156:19241,15244418:19242,15246482:19243,15247530:19244,15249802:19245,15303334:19246,15305618:19247,15311805:19248,15315891:19249,15316396:19250,14989711:19251,14989985:19252,15041165:19253,15042966:19254,15048074:19255,15050408:19256,15055037:19257,15056792:19258,15056793:19259,15108287:19260,15112884:19261,15113371:19262,15114128:19263,15115154:19264,15042194:19265,15185057:19266,15237802:19267,15238824:19268,15248512:19269,15250060:19270,15250111:19271,15305150:19272,15308978:19273,15044768:19274,15311020:19275,15043735:19276,15041429:19277,15043996:19278,15049384:19279,15110834:19280,15113396:19281,15174055:19282,15179174:19283,15182214:19284,15304614:19285,15043459:19286,15119009:19287,15117958:19288,15048832:19289,15055244:19290,15050132:19291,15113388:19292,15187899:19293,15042465:19294,15178630:19295,15110569:19296,15180712:19297,15314324:19298,15317691:19299,15048587:19300,15050425:19301,15112359:19302,15113882:19303,15118222:19304,15045545:19305,15116185:19306,15055253:19307,15238812:19308,15113877:19309,15314602:19310,15114174:19311,15315346:19312,15114653:19313,14989990:19314,14991267:19315,15044488:19316,15108793:19317,15113387:19318,15119019:19319,15253380:19320,14991021:19321,15186349:19322,15317695:19323,14989447:19324,15107490:19325,15121024:19326,15121579:19489,15242387:19490,15045043:19491,15113386:19492,15314309:19493,15054771:19494,15183509:19495,15053484:19496,15052678:19497,15244444:19498,15120778:19499,15242129:19500,15181972:19501,15238280:19502,15050393:19503,15184525:19504,15118481:19505,15178912:19506,15043481:19507,15049890:19508,15172769:19509,15174047:19510,15179675:19511,15309991:19512,15316385:19513,15115403:19514,15051199:19515,15050904:19516,15042213:19517,15044749:19518,15045053:19519,15112334:19520,15178655:19521,15253431:19522,15305368:19523,15315892:19524,15050666:19525,15174045:19526,15121285:19527,15041933:19528,15115145:19529,15185599:19530,15185836:19531,15310242:19532,15317690:19533,15110584:19534,15116449:19535,15240322:19536,15050372:19537,15052191:19538,15118235:19539,15174811:19540,15178674:19541,15185586:19542,15237271:19543,15241881:19544,15041714:19545,15113384:19546,15317913:19547,15178670:19548,15113634:19549,15043519:19550,15312005:19551,15052964:19552,15108283:19553,15184318:19554,15250096:19555,15046031:19556,15106742:19557,15185035:19558,15308416:19559,15043713:19560,14989727:19561,15042230:19562,15049884:19563,15173818:19564,15237302:19565,15304590:19566,15056037:19567,15179682:19568,15044228:19569,15056313:19570,15185028:19571,15242924:19572,15247539:19573,15252109:19574,15310230:19575,15114163:19576,15242926:19577,15307155:19578,15107209:19579,15107208:19580,15119033:19581,15178130:19582,
15248301:19745,15252664:19746,15045807:19747,14990737:19748,15041706:19749,15043463:19750,15044491:19751,15052453:19752,15055293:19753,15106720:19754,15107714:19755,15110038:19756,15113353:19757,15114138:19758,15120807:19759,15120012:19760,15174838:19761,15174839:19762,15176881:19763,15181200:19764,15246229:19765,15248024:19766,15303050:19767,15303313:19768,15303605:19769,15309700:19770,15244941:19771,15049877:19772,14989960:19773,14990745:19774,14989454:19775,15248009:19776,15252671:19777,15310992:19778,15041197:19779,15055292:19780,15050390:19781,15052473:19782,15055544:19783,15110042:19784,15110074:19785,15111041:19786,15113116:19787,15115658:19788,15116184:19789,15119499:19790,15121078:19791,15173268:19792,15176872:19793,15182511:19794,15187594:19795,15237248:19796,15241609:19797,15242121:19798,15246977:19799,15248545:19800,15251594:19801,15303077:19802,15309245:19803,15312010:19804,15107518:19805,15108753:19806,15117490:19807,15118979:19808,15119796:19809,15187852:19810,15187900:19811,15120256:19812,15187589:19813,15244986:19814,15246264:19815,15113637:19816,15240881:19817,15311036:19818,15309751:19819,15119515:19820,15185313:19821,15241405:19822,15304106:19823,14989745:19824,15044021:19825,15054224:19826,15117444:19827,15122347:19828,15243149:19829,15243437:19830,15247015:19831,15042729:19832,15044751:19833,15053221:19834,15113614:19835,15114920:19836,15175814:19837,15176323:19838,15177634:20001,15246223:20002,15246241:20003,15304588:20004,15309730:20005,15309240:20006,15056523:20007,15175303:20008,15182731:20009,15241614:20010,15109792:20011,15177125:20012,15043209:20013,15119745:20014,15121052:20015,15175817:20016,15177113:20017,15180203:20018,15184530:20019,15309446:20020,15182748:20021,15318669:20022,14991030:20023,15107502:20024,15112069:20025,15243676:20026,14989958:20027,14989998:20028,15041434:20029,14989473:20030,15042444:20031,15052718:20032,15111833:20033,15114881:20034,15120060:20035,15174815:20036,15178114:20037,15179437:20038,15181980:20039,15184807:20040,15239599:20041,15248274:20042,15303100:20043,15304591:20044,15309237:20045,15311e3:20046,15043227:20047,15185809:20048,15040683:20049,15044248:20050,15113879:20051,15120267:20052,15173520:20053,15175859:20054,15239080:20055,15252650:20056,15309475:20057,15315351:20058,15317663:20059,15176096:20060,15049089:20061,15120025:20062,15185071:20063,15311262:20064,14990244:20065,14990518:20066,14990987:20067,15042231:20068,15043249:20069,15054522:20070,15106204:20071,15175346:20072,15180988:20073,15240083:20074,15304884:20075,15309495:20076,15309750:20077,15309962:20078,15317655:20079,15318434:20080,15112870:20081,15117748:20082,15042711:20083,15043235:20084,15172488:20085,15246210:20086,15055753:20087,15106443:20088,15107728:20089,15121571:20090,15173001:20091,15184062:20092,15185844:20093,15237551:20094,15242158:20257,15302819:20258,15305900:20259,15044994:20260,15314351:20261,15117203:20262,15172233:20263,15250306:20264,15251375:20265,15310002:20266,15043252:20267,15051137:20268,15055754:20269,15056004:20270,15113367:20271,15115708:20272,15115924:20273,15119786:20274,15121551:20275,15174050:20276,15174588:20277,15183789:20278,15237249:20279,15237566:20280,15244683:20281,15303566:20282,15041965:20283,15317651:20284,15181444:20285,15237771:20286,15305906:20287,15248278:20288,15040685:20289,15045260:20290,15247793:20291,15117738:20292,15250308:20293,15238279:20294,15106961:20295,15113888:20296,15316914:20297,14989977:20298,14989976:20299,15315088:20300,15247787:20301,15243137:20302,15242664:20303,15115392:20304,15120830:20305,15180439:20306,15238549:20307,15056012:20513,14989456:20514,14989461:20515,14989482:20516,14989489:20517,14989494:20518,14989500:20519,14989503:20520,14989698:20521,14989718:20522,14989720:20523,14989954:20524,14989957:20525,15249835:20526,14989962:20527,15239314:20528,15056013:20529,14989966:20530,14989982:20531,14989983:20532,14989984:20533,14989986:20534,1499e4:20535,14990003:20536,14990006:20537,14990222:20538,14990221:20539,14990212:20540,14990214:20541,14990210:20542,14990231:20543,14990238:20544,14990253:20545,14990239:20546,14990263:20547,14990473:20548,14990746:20549,14990512:20550,14990747:20551,14990749:20552,14990743:20553,14990727:20554,14990774:20555,14990984:20556,14990991:20557,14991e3:20558,14990779:20559,14990761:20560,14990768:20561,14990993:20562,14990767:20563,14990982:20564,14990998:20565,15041688:20566,14991252:20567,14991263:20568,14991246:20569,14991256:20570,14991259:20571,14991249:20572,14991258:20573,14991248:20574,14991268:20575,14991269:20576,15040666:20577,15040680:20578,15040660:20579,15040682:20580,15040677:20581,15040645:20582,14990492:20583,14991286:20584,15040673:20585,15040681:20586,15040684:20587,14991294:20588,14991279:20589,15040657:20590,15040646:20591,15040899:20592,15040903:20593,15113347:20594,15040917:20595,15040912:20596,15040904:20597,15040922:20598,15040918:20599,15040940:20600,15040952:20601,15041152:20602,15041178:20603,15041157:20604,15041204:20605,15041202:20606,15041417:20769,15041418:20770,15041203:20771,15041410:20772,15041430:20773,15041438:20774,15041445:20775,15041453:20776,15041443:20777,15041454:20778,15041465:20779,15041461:20780,15041673:20781,15041665:20782,15041666:20783,15041686:20784,15041685:20785,15041684:20786,15041690:20787,15041697:20788,15041722:20789,15041719:20790,15041724:20791,15041723:20792,15041727:20793,15041920:20794,15041938:20795,15041932:20796,15041940:20797,15041954:20798,15182776:20799,15041961:20800,15041962:20801,15041966:20802,15042176:20803,15042178:20804,15047576:20805,15042188:20806,15042185:20807,15042191:20808,15042193:20809,15042195:20810,15042197:20811,15042198:20812,15042212:20813,15042214:20814,15042210:20815,15042217:20816,15042218:20817,15042219:20818,15042227:20819,15042225:20820,15042226:20821,15042224:20822,15042229:20823,15042237:20824,15042437:20825,15042441:20826,15042459:20827,15042464:20828,15243669:20829,15042473:20830,15042477:20831,15042480:20832,15042485:20833,15042494:20834,15042692:20835,15042699:20836,15042708:20837,15042702:20838,15042727:20839,15042730:20840,15042734:20841,15042739:20842,15042745:20843,15042959:20844,15042948:20845,15042955:20846,15042956:20847,15042974:20848,15042964:20849,15042986:20850,15042996:20851,15042985:20852,15042995:20853,15043007:20854,15043005:20855,15043213:20856,15043220:20857,15043218:20858,15042993:20859,15043208:20860,15043217:20861,15253160:20862,15253159:21025,15043244:21026,15043245:21027,15043260:21028,15043253:21029,15043457:21030,15043469:21031,15043479:21032,15043486:21033,15043491:21034,15043494:21035,15311789:21036,15043488:21037,15043507:21038,15043509:21039,15043512:21040,15043513:21041,15043718:21042,15043720:21043,15176888:21044,15043725:21045,15043728:21046,15043727:21047,15043733:21048,15043738:21049,15043747:21050,15043759:21051,15043761:21052,15043763:21053,15043768:21054,15043968:21055,15043974:21056,15043973:21057,14989463:21058,15043977:21059,15043981:21060,15042454:21061,15043998:21062,15044009:21063,15044014:21064,15049880:21065,15044027:21066,15044023:21067,15044226:21068,15044246:21069,15044256:21070,15044262:21071,15044261:21072,15044270:21073,15044272:21074,15044278:21075,15044483:21076,15184018:21077,15309721:21078,15044511:21079,15113148:21080,15173550:21081,15044526:21082,15044520:21083,15044525:21084,15044538:21085,15044737:21086,15044797:21087,15044992:21088,15044780:21089,15044781:21090,15044796:21091,15044782:21092,15044790:21093,15044777:21094,15044765:21095,15045006:21096,15045263:21097,15045045:21098,15045262:21099,15045023:21100,15045041:21101,15045047:21102,15045040:21103,15045266:21104,15045051:21105,15045248:21106,15045046:21107,15045252:21108,15045264:21109,15045254:21110,15045511:21111,15045282:21112,15045304:21113,15045285:21114,15045292:21115,15045508:21116,15045512:21117,15045288:21118,15045291:21281,15045506:21282,15045284:21283,15045310:21284,15045308:21285,15045528:21286,15045541:21287,15045542:21288,15045775:21289,15045780:21290,15045565:21291,15045550:21292,15045549:21293,
15045562:21294,15045538:21295,15045817:21296,15046016:21297,15046051:21298,15046028:21299,15045806:21300,15046044:21301,15046021:21302,15046038:21303,15046039:21304,15045816:21305,15045811:21306,15046045:21307,15046297:21308,15046272:21309,15045295:21310,15046282:21311,15046303:21312,15046075:21313,15046078:21314,15046296:21315,15046302:21316,15046318:21317,15046076:21318,15046275:21319,15046313:21320,15046279:21321,15046312:21322,15046554:21323,15046533:21324,15046559:21325,15046532:21326,15046556:21327,15046564:21328,15046548:21329,15046804:21330,15046583:21331,15046806:21332,15046590:21333,15046589:21334,15046811:21335,15046585:21336,15047054:21337,15047056:21338,15173535:21339,15046836:21340,15046838:21341,15046834:21342,15046840:21343,15047083:21344,15047076:21345,15046831:21346,15047084:21347,15047082:21348,15047302:21349,15047296:21350,15047306:21351,15047328:21352,15047316:21353,15047311:21354,15047333:21355,15047342:21356,15047350:21357,15047348:21358,15047554:21359,15047356:21360,15047553:21361,15047555:21362,15047552:21363,15047560:21364,15047566:21365,15047569:21366,15047571:21367,15047575:21368,15047598:21369,15047609:21370,15047808:21371,15047615:21372,15047812:21373,15047817:21374,15047816:21537,15047819:21538,15047821:21539,15047827:21540,15047832:21541,15047830:21542,15046535:21543,15047836:21544,15047846:21545,15047863:21546,15047864:21547,15048078:21548,15047867:21549,15048064:21550,15048079:21551,15048105:21552,15048576:21553,15048328:21554,15048097:21555,15048127:21556,15048329:21557,15048339:21558,15048352:21559,15048371:21560,15048356:21561,15048362:21562,15048368:21563,15048579:21564,15048582:21565,15048596:21566,15048594:21567,15048595:21568,15048842:21569,15048598:21570,15048611:21571,15048843:21572,15048857:21573,15048861:21574,15049138:21575,15048865:21576,15049122:21577,15049099:21578,15049136:21579,15118208:21580,15049106:21581,15048893:21582,15049145:21583,15049349:21584,15049401:21585,15049375:21586,15049387:21587,15049402:21588,15049630:21589,15049403:21590,15049400:21591,15049390:21592,15049605:21593,15049619:21594,15049617:21595,15049623:21596,15049625:21597,15049624:21598,15049637:21599,15049628:21600,15049636:21601,15049631:21602,15049647:21603,15049658:21604,15049657:21605,15049659:21606,15049660:21607,15049661:21608,15049858:21609,15049866:21610,15049872:21611,15049883:21612,15114918:21613,15049893:21614,15049900:21615,15049901:21616,15049906:21617,15049912:21618,15049918:21619,15182738:21620,15050133:21621,15050128:21622,15050126:21623,15050138:21624,15050136:21625,15050146:21626,15050144:21627,15050151:21628,15050156:21629,15050153:21630,15050168:21793,15050369:21794,15050397:21795,14990750:21796,14991019:21797,15050403:21798,15050418:21799,15050630:21800,15050664:21801,15050652:21802,15050381:21803,15050649:21804,15050650:21805,15050917:21806,15050911:21807,15050897:21808,15050908:21809,15050889:21810,15050906:21811,15051136:21812,15051180:21813,15051145:21814,15050933:21815,15050934:21816,15051170:21817,15051178:21818,15051418:21819,15051452:21820,15051454:21821,15051659:21822,15051650:21823,15051453:21824,15051683:21825,15051671:21826,15051686:21827,15051689:21828,15051670:21829,15051706:21830,15051707:21831,15051916:21832,15051915:21833,15051926:21834,15051954:21835,15051664:21836,15051946:21837,15051958:21838,15051966:21839,15052163:21840,15052165:21841,15052160:21842,15052177:21843,15052181:21844,15052186:21845,15052187:21846,15052197:21847,15052201:21848,15052208:21849,15052211:21850,15052213:21851,15052216:21852,15111816:21853,15052218:21854,15052416:21855,15052419:21856,15052454:21857,15052472:21858,15052675:21859,15052679:21860,15052681:21861,15052692:21862,15052688:21863,15052708:21864,15052710:21865,15052706:21866,15052702:21867,15052709:21868,15052715:21869,15052720:21870,15052726:21871,15052723:21872,15052933:21873,15052935:21874,15052936:21875,15052941:21876,15052947:21877,15052960:21878,15052962:21879,15052968:21880,15052984:21881,15052985:21882,15053185:21883,15053190:21884,15053198:21885,15053203:21886,15053200:22049,15053199:22050,15052209:22051,15053228:22052,15053230:22053,14989730:22054,15053238:22055,15053241:22056,15053452:22057,15053457:22058,15053460:22059,15050395:22060,15053483:22061,15053499:22062,15053494:22063,15053500:22064,15053495:22065,15053701:22066,15053502:22067,15053703:22068,15053721:22069,15053737:22070,15053757:22071,15053754:22072,15053741:22073,15054476:22074,15053738:22075,15053963:22076,15053973:22077,15053975:22078,15054236:22079,15053983:22080,15053979:22081,15053969:22082,15053972:22083,15053986:22084,15053978:22085,15053977:22086,15053976:22087,15054220:22088,15054226:22089,15054222:22090,15054219:22091,15054252:22092,15054259:22093,15054262:22094,15054471:22095,15054468:22096,15054466:22097,15054498:22098,15054493:22099,15054508:22100,15054510:22101,15054525:22102,15054480:22103,15054519:22104,15054524:22105,15054729:22106,15054733:22107,15054739:22108,15054738:22109,15054742:22110,15054747:22111,15054763:22112,15054770:22113,15054773:22114,15054987:22115,15055002:22116,15055001:22117,15054993:22118,15055003:22119,15055030:22120,15055031:22121,15055236:22122,15055235:22123,15055232:22124,15055246:22125,15055255:22126,15055252:22127,15055263:22128,15055266:22129,15055268:22130,15055239:22131,15055285:22132,15055286:22133,15055290:22134,15317692:22135,15055295:22136,15055520:22137,15055745:22138,15055746:22139,15055752:22140,15055760:22141,15055759:22142,15055766:22305,15055779:22306,15055773:22307,15055770:22308,15055771:22309,15055778:22310,15055777:22311,15055784:22312,15055785:22313,15055788:22314,15055793:22315,15055795:22316,15055792:22317,15055796:22318,15055800:22319,15055806:22320,15056003:22321,15056009:22322,15056285:22323,15056284:22324,15056011:22325,15056017:22326,15056022:22327,15056041:22328,15056045:22329,15056056:22330,15056257:22331,15056264:22332,15056268:22333,15056270:22334,15056047:22335,15056273:22336,15056278:22337,15056279:22338,15056281:22339,15056289:22340,15056301:22341,15056307:22342,15056311:22343,15056515:22344,15056514:22345,15056319:22346,15056522:22347,15056520:22348,15056529:22349,15056519:22350,15056542:22351,15056537:22352,15056536:22353,15056544:22354,15056552:22355,15056557:22356,15056572:22357,15056790:22358,15056827:22359,15056804:22360,15056824:22361,15056817:22362,15056797:22363,15106739:22364,15056831:22365,15106209:22366,15106464:22367,15106201:22368,15106192:22369,15106217:22370,15106190:22371,15106225:22372,15106203:22373,15106197:22374,15106219:22375,15106214:22376,15106191:22377,15106234:22378,15106458:22379,15106433:22380,15106474:22381,15106487:22382,15106463:22383,15106442:22384,15106438:22385,15106445:22386,15106467:22387,15106435:22388,15106468:22389,15106434:22390,15106476:22391,15106475:22392,15106457:22393,15106689:22394,15106701:22395,15106983:22396,15106691:22397,15106714:22398,15106692:22561,15106715:22562,15106710:22563,15106711:22564,15106706:22565,15106727:22566,15106699:22567,15106977:22568,15106744:22569,15106976:22570,15106963:22571,15106740:22572,15056816:22573,15106749:22574,15106950:22575,15106741:22576,15106968:22577,15107469:22578,15107221:22579,15107206:22580,15106998:22581,15106999:22582,15107200:22583,15106996:22584,15107002:22585,15107203:22586,15107233:22587,15107003:22588,15106993:22589,15107213:22590,15107214:22591,15107463:22592,15107262:22593,15107240:22594,15107239:22595,15107466:22596,15107263:22597,15107260:22598,15107244:22599,15107252:22600,15107261:22601,15107458:22602,15107460:22603,15107507:22604,15107511:22605,15107480:22606,15107481:22607,15107482:22608,15107499:22609,15107508:22610,15107503:22611,15107493:22612,15107505:22613,15107487:22614,15107485:22615,15107475:22616,15107509:22617,15107737:22618,15107734:22619,15107719:22620,15107756:22621,15107732:22622,15107738:22623,15107722:22624,15107729:22625,15107755:22626,15107758:22627,15107980:22628,15107978:22629,15107977:22630,15108023:22631,15107976:22632,15107971:22633,15107974:22634,15107770:22635,15107979:22636,15187385:22637,
15107981:22638,15108006:22639,15108003:22640,15108022:22641,15108026:22642,15108020:22643,15108031:22644,15108029:22645,15108028:22646,15108030:22647,15108224:22648,15108232:22649,15108233:22650,15108237:22651,15108236:22652,15108244:22653,15108251:22654,15108254:22817,15108257:22818,15108266:22819,15108270:22820,15108272:22821,15108274:22822,15108275:22823,15108481:22824,15108494:22825,15108510:22826,15108515:22827,15108507:22828,15108512:22829,15108520:22830,15108540:22831,15108738:22832,15108745:22833,15108542:22834,15108754:22835,15108755:22836,15108758:22837,15109012:22838,15108739:22839,15108756:22840,15109015:22841,15109009:22842,15108795:22843,15109007:22844,15109055:22845,15108998:22846,15111060:22847,15109e3:22848,15109020:22849,15109004:22850,15109002:22851,15108994:22852,15108999:22853,15108763:22854,15109001:22855,15109260:22856,15109038:22857,15109041:22858,15109287:22859,15109250:22860,15109256:22861,15109039:22862,15109045:22863,15109520:22864,15109310:22865,15109517:22866,15110300:22867,15109519:22868,15109782:22869,15109774:22870,15109760:22871,15109803:22872,15109558:22873,15109795:22874,15109775:22875,15109769:22876,15109791:22877,15109813:22878,15109547:22879,15109545:22880,15109822:22881,15110057:22882,15110016:22883,15110022:22884,15110051:22885,15110025:22886,15110034:22887,15110070:22888,15110020:22889,15110294:22890,15110324:22891,15110278:22892,15110291:22893,15110310:22894,15110326:22895,15111325:22896,15110295:22897,15110312:22898,15110287:22899,15110567:22900,15110575:22901,15110582:22902,15110542:22903,15111338:22904,15110805:22905,15110803:22906,15110821:22907,15110825:22908,15110792:22909,15110844:22910,15111066:23073,15111058:23074,15111045:23075,15111047:23076,15110843:23077,15111064:23078,15111042:23079,15111089:23080,15111079:23081,15239305:23082,15111072:23083,15111073:23084,15108780:23085,15111075:23086,15111087:23087,15111340:23088,15111094:23089,15111092:23090,15111090:23091,15111098:23092,15111296:23093,15111101:23094,15111320:23095,15111324:23096,15111301:23097,15111332:23098,15111331:23099,15111339:23100,15111348:23101,15111349:23102,15111351:23103,15111350:23104,15111352:23105,15177099:23106,15111560:23107,15111574:23108,15111573:23109,15111565:23110,15111576:23111,15111582:23112,15111581:23113,15111602:23114,15111608:23115,15111810:23116,15111811:23117,15249034:23118,15111835:23119,15111839:23120,15111851:23121,15111863:23122,15112067:23123,15112070:23124,15112065:23125,15112068:23126,15112076:23127,15112082:23128,15112091:23129,15112089:23130,15112096:23131,15112097:23132,15112113:23133,15113650:23134,15112330:23135,15112323:23136,15112123:23137,15113651:23138,15112373:23139,15112374:23140,15112372:23141,15112348:23142,15112591:23143,15112580:23144,15112585:23145,15112577:23146,15112606:23147,15112605:23148,15112612:23149,15112615:23150,15112616:23151,15112607:23152,15112610:23153,15112624:23154,15112835:23155,15112840:23156,15112846:23157,15112841:23158,15112836:23159,15112856:23160,15112861:23161,15113089:23162,15112889:23163,15113097:23164,15112894:23165,15112892:23166,15113092:23329,15112888:23330,15113110:23331,15113114:23332,15113120:23333,15112383:23334,15113126:23335,15113129:23336,15113136:23337,15113141:23338,15113143:23339,15113359:23340,15113366:23341,15113374:23342,15113382:23343,15113383:23344,15310008:23345,15113390:23346,15113407:23347,15113398:23348,15113601:23349,15113400:23350,15113399:23351,15113606:23352,15113630:23353,15113632:23354,15113625:23355,15113635:23356,15113636:23357,15113865:23358,15113648:23359,15113897:23360,15113660:23361,15113642:23362,15113868:23363,15113867:23364,15113894:23365,15113889:23366,15113861:23367,15113911:23368,15114159:23369,15113908:23370,15114156:23371,15113907:23372,15114153:23373,15113912:23374,15114148:23375,15114142:23376,15114141:23377,15114146:23378,15114158:23379,15113913:23380,15114126:23381,15114118:23382,15114151:23383,15116956:23384,15114398:23385,15114630:23386,15114409:23387,15114624:23388,15114637:23389,15114418:23390,15114638:23391,15114931:23392,15114411:23393,15114649:23394,15114659:23395,15114679:23396,15114687:23397,15114911:23398,15114895:23399,15114925:23400,15114900:23401,15114909:23402,15114907:23403,15114883:23404,15116974:23405,15114937:23406,15114676:23407,15114933:23408,15114912:23409,15114938:23410,15115407:23411,15114893:23412,15114686:23413,15115393:23414,15115146:23415,15115400:23416,15115160:23417,15115426:23418,15115430:23419,15115169:23420,15115404:23421,15115149:23422,15115156:23585,15115175:23586,15115157:23587,15115446:23588,15115410:23589,15115396:23590,15115159:23591,15115171:23592,15115429:23593,15115193:23594,15115168:23595,15115183:23596,15115432:23597,15115434:23598,15115418:23599,15115427:23600,15115425:23601,15115142:23602,15115705:23603,15115703:23604,15115676:23605,15115704:23606,15115691:23607,15115668:23608,15115710:23609,15115694:23610,15115449:23611,15115700:23612,15115453:23613,15115673:23614,15115440:23615,15115681:23616,15115678:23617,15115677:23618,15115905:23619,15115690:23620,15115954:23621,15115950:23622,15116176:23623,15115967:23624,15116161:23625,15116179:23626,15115966:23627,15116174:23628,15052712:23629,15116170:23630,15116189:23631,15115963:23632,15116163:23633,15115943:23634,15116462:23635,15115921:23636,15115936:23637,15115932:23638,15115925:23639,15115956:23640,15116190:23641,15116200:23642,15116418:23643,15116443:23644,15116223:23645,15117450:23646,15116217:23647,15116210:23648,15116199:23649,15116421:23650,15115953:23651,15116446:23652,15116205:23653,15116436:23654,15116203:23655,15116426:23656,15116434:23657,15117185:23658,15116451:23659,15116435:23660,15116676:23661,15116428:23662,15116722:23663,15116470:23664,15116728:23665,15116679:23666,15116706:23667,15116697:23668,15116710:23669,15116680:23670,15116472:23671,15116450:23672,15116944:23673,15116941:23674,15116960:23675,15116932:23676,15116962:23677,15116963:23678,15116951:23841,15243415:23842,15116987:23843,15117187:23844,15117186:23845,15116984:23846,15116979:23847,15116972:23848,15117214:23849,15117201:23850,15117215:23851,15116970:23852,15117210:23853,15117226:23854,15117243:23855,15117445:23856,15243414:23857,15117242:23858,15117458:23859,15117462:23860,15314097:23861,15117471:23862,15117496:23863,15117495:23864,15178652:23865,15117497:23866,15311790:23867,15117703:23868,15117699:23869,15117705:23870,15117712:23871,15117721:23872,15117716:23873,15117723:23874,15117727:23875,15117729:23876,15117752:23877,15117753:23878,15117759:23879,15117952:23880,15117956:23881,15117955:23882,15117965:23883,15117976:23884,15117973:23885,15117982:23886,15117988:23887,15117994:23888,15117995:23889,15117999:23890,15118002:23891,15118001:23892,15118003:23893,15118007:23894,15118012:23895,15118214:23896,15118219:23897,15118227:23898,15118239:23899,15118252:23900,15118251:23901,15118259:23902,15118255:23903,15317694:23904,15118472:23905,15118483:23906,15118484:23907,15118491:23908,15118500:23909,15118499:23910,15118750:23911,15118741:23912,15118754:23913,15118762:23914,15118978:23915,15118989:23916,15119002:23917,15118977:23918,15119003:23919,15118782:23920,15118760:23921,15118771:23922,15118994:23923,15118992:23924,15119236:23925,15119281:23926,15119251:23927,15119037:23928,15119255:23929,15119237:23930,15119261:23931,15119022:23932,15119025:23933,15119038:23934,15119034:24097,15119259:24098,15119279:24099,15119257:24100,15119274:24101,15119519:24102,15245709:24103,15119542:24104,15119531:24105,15119549:24106,15119544:24107,15119513:24108,15119541:24109,15119539:24110,15119506:24111,15119500:24112,15119779:24113,15120019:24114,15119780:24115,15119770:24116,15119801:24117,15119769:24118,15120014:24119,15120021:24120,15122340:24121,15120005:24122,15120313:24123,15120533:24124,15120522:24125,15120053:24126,15120263:24127,15120294:24128,15120056:24129,15120262:24130,15120300:24131,15120286:24132,15120268:24133,15120296:24134,15120274:24135,15120261:24136,15120314:24137,15120281:24138,15120292:24139,15120277:24140,15120298:24141,15120302:24142,15120557:24143,
15120814:24144,15120558:24145,15120537:24146,15120818:24147,15120799:24148,15120574:24149,15120547:24150,15120811:24151,15120555:24152,15120822:24153,15120781:24154,15120543:24155,15120771:24156,15120570:24157,15120782:24158,15120548:24159,15121343:24160,15120541:24161,15120568:24162,15121026:24163,15121066:24164,15121048:24165,15121289:24166,15121079:24167,15121299:24168,15121085:24169,15121071:24170,15121284:24171,15121074:24172,15121300:24173,15121301:24174,15121039:24175,15121061:24176,15121282:24177,15121055:24178,15121793:24179,15121553:24180,15171980:24181,15121324:24182,15121336:24183,15121342:24184,15121599:24185,15121330:24186,15121585:24187,15121327:24188,15121586:24189,15121292:24190,15121598:24353,15121555:24354,15121335:24355,15122054:24356,15121850:24357,15121848:24358,15122049:24359,15122048:24360,15121839:24361,15121819:24362,15122355:24363,15121837:24364,15122050:24365,15121852:24366,15121816:24367,15122062:24368,15122065:24369,15122306:24370,15121830:24371,15122099:24372,15122083:24373,15122081:24374,15122084:24375,15122105:24376,15122310:24377,15122090:24378,15122335:24379,15122325:24380,15122348:24381,15122324:24382,15122328:24383,15122353:24384,15122350:24385,15122331:24386,15171721:24387,15171723:24388,15122362:24389,15171729:24390,15171713:24391,15171727:24392,15122366:24393,15171739:24394,15171738:24395,15121844:24396,15171741:24397,15171736:24398,15171743:24399,15171760:24400,15171774:24401,15171762:24402,15171985:24403,15172003:24404,15172249:24405,15172242:24406,15172271:24407,15172529:24408,15172268:24409,15172280:24410,15172275:24411,15172270:24412,15172511:24413,15172491:24414,15172509:24415,15172505:24416,15172745:24417,15172541:24418,15172764:24419,15172761:24420,15173029:24421,15173013:24422,15173256:24423,15173030:24424,15173026:24425,15173004:24426,15173014:24427,15173036:24428,15173263:24429,15173563:24430,15173252:24431,15173269:24432,15173288:24433,15173292:24434,15173527:24435,15173305:24436,15173310:24437,15173522:24438,15173513:24439,15173524:24440,15173518:24441,15173536:24442,15173548:24443,15173543:24444,15173557:24445,15173564:24446,15173561:24609,15173567:24610,15173773:24611,15173776:24612,15173787:24613,15173800:24614,15173805:24615,15173804:24616,15173808:24617,15173810:24618,15173819:24619,15173820:24620,15173823:24621,15174016:24622,15174022:24623,15174027:24624,15174040:24625,15174068:24626,15174078:24627,15174274:24628,15174273:24629,15174279:24630,15174290:24631,15174294:24632,15174306:24633,15174311:24634,15174329:24635,15174322:24636,15174531:24637,15174534:24638,15174532:24639,15174542:24640,15174546:24641,15174562:24642,15174560:24643,15174561:24644,15174585:24645,15174583:24646,15040655:24647,15174807:24648,15174794:24649,15174812:24650,15174806:24651,15174813:24652,15174836:24653,15174831:24654,15174825:24655,15174821:24656,15174846:24657,15175054:24658,15175055:24659,15317912:24660,15175063:24661,15175082:24662,15175080:24663,15175088:24664,15175096:24665,15175093:24666,15175099:24667,15175098:24668,15175560:24669,15175347:24670,15175566:24671,15175355:24672,15175552:24673,15175589:24674,15175598:24675,15175582:24676,15176354:24677,15175813:24678,15176111:24679,15175845:24680,15175608:24681,15175858:24682,15175866:24683,15176085:24684,15175871:24685,15176095:24686,15176089:24687,15176065:24688,15176092:24689,15176105:24690,15176112:24691,15176099:24692,15176106:24693,15176118:24694,15176126:24695,15176331:24696,15176350:24697,15176359:24698,15176586:24699,15176591:24700,15176596:24701,15175601:24702,15176608:24865,15176611:24866,15176615:24867,15176617:24868,15176622:24869,15176626:24870,15176624:24871,15176625:24872,15176632:24873,15176631:24874,15176836:24875,15176835:24876,15176837:24877,15176844:24878,15176846:24879,15176845:24880,15176853:24881,15176851:24882,15176862:24883,15176870:24884,15176876:24885,15176892:24886,15177092:24887,15177101:24888,15177098:24889,15177097:24890,15177115:24891,15177094:24892,15177114:24893,15177129:24894,15177124:24895,15177127:24896,15177131:24897,15177133:24898,15177144:24899,15177142:24900,15177350:24901,15177351:24902,15177140:24903,15177354:24904,15177353:24905,15177346:24906,15177364:24907,15177370:24908,15177373:24909,15177381:24910,15177379:24911,15177602:24912,15177395:24913,15177603:24914,15177397:24915,15177405:24916,15177400:24917,15177404:24918,15177393:24919,15177613:24920,15177610:24921,15177618:24922,15177625:24923,15177635:24924,15177630:24925,15177662:24926,15177663:24927,15177660:24928,15177857:24929,15177648:24930,15177658:24931,15177650:24932,15177651:24933,15177867:24934,15177869:24935,15177865:24936,15177887:24937,15177895:24938,15177888:24939,15177889:24940,15177890:24941,15177892:24942,15177908:24943,15177904:24944,15177915:24945,15178119:24946,15178120:24947,15178118:24948,15178140:24949,15178136:24950,15178145:24951,15178146:24952,15178152:24953,15178153:24954,15178154:24955,15178151:24956,15178156:24957,15178160:24958,15178162:25121,15178166:25122,15178168:25123,15178172:25124,15178368:25125,15178371:25126,15178376:25127,15178379:25128,15178382:25129,15178390:25130,15178387:25131,15178393:25132,15178394:25133,15178416:25134,15178420:25135,15178424:25136,15178425:25137,15178426:25138,15178626:25139,15178637:25140,15178646:25141,15178642:25142,15178654:25143,15178657:25144,15178661:25145,15178663:25146,15178666:25147,15243439:25148,15178683:25149,15178888:25150,15178887:25151,15178884:25152,15178921:25153,15178916:25154,15178910:25155,15178917:25156,15178918:25157,15178907:25158,15178935:25159,15178936:25160,15179143:25161,15179162:25162,15179176:25163,15179179:25164,15179163:25165,15179173:25166,15179199:25167,15179198:25168,15179193:25169,15179406:25170,15179403:25171,15179409:25172,15179424:25173,15179422:25174,15179440:25175,15179446:25176,15179449:25177,15179455:25178,15179452:25179,15179453:25180,15179451:25181,15179655:25182,15179661:25183,15179671:25184,15179674:25185,15179676:25186,15179683:25187,15179694:25188,15179708:25189,15179916:25190,15179922:25191,15180966:25192,15179936:25193,15180970:25194,15180165:25195,15180430:25196,15180212:25197,15180422:25198,15180220:25199,15180442:25200,15180428:25201,15180451:25202,15180469:25203,15180458:25204,15180463:25205,15180689:25206,15180678:25207,15180683:25208,15180692:25209,15180478:25210,15180476:25211,15180677:25212,15180682:25213,15180716:25214,15180711:25377,15180698:25378,15180733:25379,15180724:25380,15180935:25381,15180946:25382,15180945:25383,15180953:25384,15180972:25385,15180971:25386,15181184:25387,15181216:25388,15181207:25389,15181215:25390,15181210:25391,15181205:25392,15181203:25393,15181242:25394,15181247:25395,15181450:25396,15181469:25397,15181479:25398,15318411:25399,15181482:25400,15181486:25401,15181491:25402,15181497:25403,15181498:25404,15181705:25405,15181717:25406,15181735:25407,15181740:25408,15181729:25409,15181731:25410,15181960:25411,15181965:25412,15181976:25413,15181977:25414,15181984:25415,15181983:25416,15181440:25417,15182001:25418,15182011:25419,15182014:25420,15182007:25421,15182211:25422,15182231:25423,15182217:25424,15182241:25425,15182242:25426,15182249:25427,15318685:25428,15182256:25429,15182265:25430,15182269:25431,15182472:25432,15182487:25433,15182485:25434,15182488:25435,15182486:25436,15182505:25437,15182728:25438,15182512:25439,15182518:25440,15182725:25441,15182724:25442,15182527:25443,15303299:25444,15182727:25445,15182730:25446,15182733:25447,15182735:25448,15182741:25449,15182739:25450,15182745:25451,15182746:25452,15182749:25453,15182753:25454,15182754:25455,15182758:25456,15182765:25457,15182768:25458,15182978:25459,15182991:25460,15182986:25461,15182982:25462,15183027:25463,15183e3:25464,15183001:25465,15183006:25466,15183029:25467,15183016:25468,15183030:25469,15183248:25470,15183290:25633,15182980:25634,15183245:25635,15182987:25636,15183244:25637,15183237:25638,15183285:25639,15183269:25640,15183284:25641,15183271:25642,15183280:25643,15183281:25644,15183276:25645,15183278:25646,15183517:25647,15183512:25648,15183519:25649,
15183501:25650,15183516:25651,15183514:25652,15183499:25653,15183506:25654,15183503:25655,15183261:25656,15183513:25657,15183755:25658,15183745:25659,15183756:25660,15183759:25661,15183540:25662,15183750:25663,15183773:25664,15183785:25665,15184017:25666,15184020:25667,15183782:25668,15183781:25669,15184288:25670,15184e3:25671,15184007:25672,15184019:25673,15183795:25674,15183799:25675,15184023:25676,15184013:25677,15183798:25678,15184035:25679,15184039:25680,15184042:25681,15184031:25682,15184055:25683,15184043:25684,15184061:25685,15184268:25686,15184259:25687,15184276:25688,15184271:25689,15184256:25690,15184272:25691,15184280:25692,15184287:25693,15184292:25694,15184278:25695,15184293:25696,15184300:25697,15184309:25698,15184515:25699,15184528:25700,15184548:25701,15184557:25702,15184546:25703,15184555:25704,15184545:25705,15184552:25706,15184563:25707,15184562:25708,15184561:25709,15184558:25710,15184569:25711,15184573:25712,15184768:25713,15184773:25714,15184770:25715,15184792:25716,15184786:25717,15184796:25718,15184802:25719,15314107:25720,15184815:25721,15184818:25722,15184820:25723,15184822:25724,15184826:25725,15185030:25726,15185026:25889,15185052:25890,15185045:25891,15185034:25892,15185285:25893,15185291:25894,15185070:25895,15185074:25896,15185087:25897,15185077:25898,15185286:25899,15185331:25900,15185302:25901,15185294:25902,15185330:25903,15185320:25904,15185326:25905,15185295:25906,15185315:25907,15185555:25908,15185545:25909,15185307:25910,15185551:25911,15185341:25912,15185563:25913,15185594:25914,15185582:25915,15185571:25916,15185589:25917,15185799:25918,15185597:25919,15185579:25920,15186109:25921,15185570:25922,15185583:25923,15185820:25924,15185592:25925,15185567:25926,15185584:25927,15185816:25928,15185821:25929,15185828:25930,15185822:25931,15185851:25932,15185842:25933,15185825:25934,15186053:25935,15186058:25936,15186083:25937,15186081:25938,15186066:25939,15186097:25940,15186079:25941,15186057:25942,15186059:25943,15186082:25944,15186310:25945,15186342:25946,15186107:25947,15186101:25948,15186105:25949,15186307:25950,15186103:25951,15186098:25952,15186106:25953,15186343:25954,15186333:25955,15186326:25956,15186334:25957,15186329:25958,15186330:25959,15186361:25960,15186346:25961,15186345:25962,15186364:25963,15186363:25964,15186563:25965,15185813:25966,15186365:25967,15253166:25968,15186367:25969,15186568:25970,15186569:25971,15186572:25972,15186578:25973,15186576:25974,15186579:25975,15186580:25976,15186582:25977,15186574:25978,15186587:25979,15186588:25980,15187128:25981,15187130:25982,15187333:26145,15187340:26146,15187341:26147,15187342:26148,15187344:26149,15187345:26150,15187349:26151,15187348:26152,15187352:26153,15187359:26154,15187360:26155,15187368:26156,15187369:26157,15187367:26158,15187384:26159,15187586:26160,15187590:26161,15187587:26162,15187592:26163,15187591:26164,15187596:26165,15187604:26166,15187614:26167,15187613:26168,15187610:26169,15187619:26170,15187631:26171,15187634:26172,15187641:26173,15187630:26174,15187638:26175,15187640:26176,15248817:26177,15187845:26178,15187846:26179,15187850:26180,15187861:26181,15187860:26182,15187873:26183,15187878:26184,15187881:26185,15187891:26186,15187897:26187,15311772:26188,15237254:26189,15237252:26190,15237259:26191,15237266:26192,15237272:26193,15237273:26194,15237276:26195,15237281:26196,15237288:26197,15237311:26198,15237307:26199,15237514:26200,15237510:26201,15237522:26202,15237528:26203,15237530:26204,15237535:26205,15237538:26206,15237544:26207,15237555:26208,15237554:26209,15237552:26210,15237558:26211,15237561:26212,15237565:26213,15237567:26214,15237764:26215,15237766:26216,15237765:26217,15237787:26218,15237779:26219,15237786:26220,15237805:26221,15042192:26222,15237804:26223,15238043:26224,15238053:26225,15238041:26226,15238045:26227,15238020:26228,15238042:26229,15238038:26230,15238281:26231,15238063:26232,15238065:26233,15238299:26234,15238313:26235,15238307:26236,15238319:26237,15238539:26238,15309451:26401,15238534:26402,15238334:26403,15238547:26404,15238545:26405,15238076:26406,15238577:26407,15238574:26408,15238565:26409,15238566:26410,15238580:26411,15238787:26412,15238792:26413,15238794:26414,15238784:26415,15238786:26416,15238816:26417,15238805:26418,15238820:26419,15238819:26420,15238559:26421,15238803:26422,15238825:26423,15238832:26424,15238837:26425,15238846:26426,15238840:26427,15238845:26428,15239040:26429,15239042:26430,15238842:26431,15239049:26432,15239053:26433,15239057:26434,15239065:26435,15239064:26436,15239048:26437,15239066:26438,15239071:26439,15239072:26440,15239079:26441,15239098:26442,15239099:26443,15239102:26444,15239297:26445,15239298:26446,15239301:26447,15239303:26448,15239306:26449,15239309:26450,15239312:26451,15239318:26452,15239337:26453,15239339:26454,15239352:26455,15239347:26456,15239552:26457,15239577:26458,15239576:26459,15239581:26460,15239578:26461,15239583:26462,15239588:26463,15239586:26464,15239592:26465,15239594:26466,15239595:26467,15239342:26468,15239601:26469,15239607:26470,15239608:26471,15239614:26472,15239821:26473,15239826:26474,15239851:26475,15239839:26476,15239867:26477,15239852:26478,15240097:26479,15240099:26480,15240095:26481,15240082:26482,15240116:26483,15240115:26484,15240122:26485,15240851:26486,15240323:26487,15240123:26488,15240121:26489,15240094:26490,15240326:26491,15240092:26492,15240329:26493,15240089:26494,15240373:26657,15240372:26658,15240342:26659,15240370:26660,15240369:26661,15240576:26662,15240377:26663,15240592:26664,15240581:26665,15240367:26666,15240363:26667,15240343:26668,15240344:26669,15240837:26670,15240858:26671,15240874:26672,15240863:26673,15240866:26674,15240854:26675,15240355:26676,15240846:26677,15240839:26678,15240842:26679,15240636:26680,15240885:26681,15240627:26682,15240629:26683,15240864:26684,15240841:26685,15240872:26686,15241140:26687,15241363:26688,15241131:26689,15241102:26690,15241149:26691,15241347:26692,15241112:26693,15241355:26694,15241089:26695,15241143:26696,15241351:26697,15241120:26698,15241138:26699,15241357:26700,15241378:26701,15241376:26702,15240893:26703,15241400:26704,15242374:26705,15241147:26706,15241645:26707,15241386:26708,15241404:26709,15242650:26710,15241860:26711,15241655:26712,15241643:26713,15241901:26714,15241646:26715,15241858:26716,15241641:26717,15241606:26718,15241388:26719,15241647:26720,15241657:26721,15241397:26722,15242122:26723,15241634:26724,15241913:26725,15241919:26726,15241887:26727,15242137:26728,15242125:26729,15241915:26730,15242138:26731,15242128:26732,15242113:26733,15242118:26734,15242134:26735,15241889:26736,15242401:26737,15242175:26738,15242164:26739,15242391:26740,15242392:26741,15242412:26742,15242399:26743,15242389:26744,15242388:26745,15242172:26746,15242624:26747,15242659:26748,15242648:26749,15242632:26750,15242625:26913,15243394:26914,15242635:26915,15242645:26916,15242880:26917,15242916:26918,15242888:26919,15242897:26920,15242890:26921,15242920:26922,15242669:26923,15242900:26924,15242907:26925,15243178:26926,15242887:26927,15242908:26928,15242679:26929,15242686:26930,15242896:26931,15243145:26932,15242938:26933,15243151:26934,15242937:26935,15243152:26936,15243157:26937,15243165:26938,15243173:26939,15243164:26940,15243193:26941,15243402:26942,15243411:26943,15243403:26944,15243198:26945,15243194:26946,15243398:26947,15243426:26948,15243418:26949,15243440:26950,15243455:26951,15243661:26952,14989717:26953,15243668:26954,15243679:26955,15243687:26956,15243697:26957,15243923:26958,15243939:26959,15243945:26960,15243946:26961,15243915:26962,15243916:26963,15243958:26964,15243951:26965,15244164:26966,15244166:26967,15243952:26968,15244169:26969,15245475:26970,15243947:26971,15244180:26972,15244190:26973,15244201:26974,15244204:26975,15244191:26976,15244187:26977,15244207:26978,15244434:26979,15244422:26980,15244424:26981,15244416:26982,15244419:26983,15244219:26984,15244433:26985,15244425:26986,15244429:26987,15244217:26988,15244426:26989,15244468:26990,15244479:26991,15244471:26992,15244475:26993,
15244453:26994,15244457:26995,15244442:26996,15244704:26997,15244703:26998,15244728:26999,15244684:27e3,15244686:27001,15244724:27002,15244695:27003,15244712:27004,15244718:27005,15244697:27006,15244691:27169,15244707:27170,15244714:27171,15245445:27172,15244962:27173,15244959:27174,15244930:27175,15244975:27176,15245195:27177,15244989:27178,15245184:27179,15245200:27180,15309718:27181,15244971:27182,15245188:27183,15244979:27184,15245191:27185,15245190:27186,15244987:27187,15245231:27188,15245234:27189,15245216:27190,15245455:27191,15245453:27192,15245246:27193,15245238:27194,15245239:27195,15245454:27196,15245202:27197,15245457:27198,15245462:27199,15245461:27200,15245474:27201,15245473:27202,15245489:27203,15245494:27204,15245497:27205,15245479:27206,15245499:27207,15245700:27208,15245698:27209,15245714:27210,15245721:27211,15245726:27212,15245730:27213,15245739:27214,15245953:27215,15245758:27216,15245982:27217,15245749:27218,15245757:27219,15246005:27220,15245746:27221,15245954:27222,15245975:27223,15245970:27224,15245998:27225,15245977:27226,15245986:27227,15245965:27228,15245988:27229,15246e3:27230,15246015:27231,15246001:27232,15246211:27233,15246212:27234,15246228:27235,15246232:27236,15246233:27237,15246237:27238,15246265:27239,15246466:27240,15246268:27241,15246260:27242,15246248:27243,15246258:27244,15246468:27245,15246476:27246,15246474:27247,15246483:27248,15246723:27249,15246494:27250,15246501:27251,15246506:27252,15246507:27253,15246721:27254,15246724:27255,15246523:27256,15246518:27257,15246520:27258,15246732:27259,15246493:27260,15246752:27261,15246750:27262,15246758:27425,15246756:27426,15246765:27427,15246762:27428,15246767:27429,15246772:27430,15246775:27431,15246782:27432,15246979:27433,15246984:27434,15246986:27435,15246995:27436,15247e3:27437,15247009:27438,15247017:27439,15247014:27440,15247020:27441,15247023:27442,15247026:27443,15247034:27444,15247037:27445,15247039:27446,15247232:27447,15247258:27448,15247260:27449,15247261:27450,15247271:27451,15247284:27452,15247288:27453,15247491:27454,15247510:27455,15247504:27456,15247500:27457,15247515:27458,15247517:27459,15247525:27460,15247542:27461,15247745:27462,15247771:27463,15247762:27464,15247750:27465,15247752:27466,15247804:27467,15247789:27468,15247788:27469,15247778:27470,15248005:27471,15248002:27472,15248004:27473,15248040:27474,15248033:27475,15248017:27476,15248037:27477,15248038:27478,15248026:27479,15248035:27480,15248260:27481,15248269:27482,15248258:27483,15248282:27484,15248299:27485,15248307:27486,15248295:27487,15248292:27488,15248305:27489,15248532:27490,15248288:27491,15248290:27492,15248311:27493,15248286:27494,15248283:27495,15248524:27496,15248519:27497,15248538:27498,15248289:27499,15248534:27500,15248528:27501,15248535:27502,15248544:27503,15248563:27504,15310507:27505,15248550:27506,15248555:27507,15248574:27508,15248552:27509,15248769:27510,15248780:27511,15248783:27512,15248782:27513,15248777:27514,15248790:27515,15248795:27516,15248794:27517,15248811:27518,15248799:27681,15248812:27682,15248815:27683,15248820:27684,15248829:27685,15249024:27686,15249036:27687,15249038:27688,15249042:27689,15249043:27690,15249046:27691,15249049:27692,15249050:27693,15249594:27694,15249793:27695,15249599:27696,15249800:27697,15249804:27698,15249806:27699,15249808:27700,15249813:27701,15249826:27702,15249836:27703,15249848:27704,15249850:27705,15250050:27706,15250057:27707,15250053:27708,15250058:27709,15250061:27710,15250062:27711,15250068:27712,15249852:27713,15250072:27714,15108253:27715,15250093:27716,15250090:27717,15250109:27718,15250098:27719,15250099:27720,15250094:27721,15250102:27722,15250312:27723,15250305:27724,15250340:27725,15250339:27726,15250330:27727,15250365:27728,15250362:27729,15250363:27730,15250564:27731,15250565:27732,15250570:27733,15250567:27734,15250575:27735,15250573:27736,15250576:27737,15318414:27738,15250579:27739,15250317:27740,15250580:27741,15250582:27742,15250855:27743,15250861:27744,15250865:27745,15250867:27746,15251073:27747,15251097:27748,15251330:27749,15251134:27750,15251130:27751,15251343:27752,15251354:27753,15251350:27754,15251340:27755,15251355:27756,15251339:27757,15251370:27758,15251371:27759,15251359:27760,15251363:27761,15251388:27762,15251592:27763,15251593:27764,15251391:27765,15251613:27766,15251614:27767,15251600:27768,15251615:27769,15251842:27770,15251637:27771,15251632:27772,15251636:27773,15251850:27774,15251847:27937,15251849:27938,15251852:27939,15251856:27940,15251848:27941,15251865:27942,15251876:27943,15251872:27944,15251626:27945,15251875:27946,15251861:27947,15251894:27948,15251890:27949,15251900:27950,15252097:27951,15252103:27952,15252101:27953,15252100:27954,15252107:27955,15252106:27956,15252115:27957,15252113:27958,15252116:27959,15252121:27960,15252138:27961,15252129:27962,15252140:27963,15252144:27964,15252358:27965,15252145:27966,15252158:27967,15252357:27968,15252360:27969,15252363:27970,15252379:27971,15252387:27972,15252412:27973,15252411:27974,15252395:27975,15252414:27976,15252618:27977,15252613:27978,15252629:27979,15252626:27980,15252633:27981,15252627:27982,15252636:27983,15252639:27984,15252635:27985,15252620:27986,15252646:27987,15252659:27988,15252667:27989,15252665:27990,15252869:27991,15252866:27992,15252670:27993,15252876:27994,15252873:27995,15252870:27996,15252878:27997,15252887:27998,15252892:27999,15252898:28e3,15252899:28001,15252900:28002,15253148:28003,15253151:28004,15253155:28005,15253165:28006,15253167:28007,15253175:28008,15253402:28009,15253413:28010,15253410:28011,15253418:28012,15253423:28013,15303303:28014,15253428:28015,15302789:28016,15253433:28017,15253434:28018,15302801:28019,15302805:28020,15302817:28021,15302797:28022,15302814:28023,15302806:28024,15302795:28025,15302823:28026,15302838:28027,15302837:28028,15302841:28029,15253432:28030,15303055:28193,15303056:28194,15303057:28195,15303058:28196,15302798:28197,15303049:28198,15302846:28199,15303062:28200,15303064:28201,15303070:28202,15303080:28203,15303087:28204,15303094:28205,15309480:28206,15303090:28207,15303298:28208,15303101:28209,15303297:28210,15303296:28211,15303306:28212,15303305:28213,15303311:28214,15303336:28215,15303343:28216,15303345:28217,15303349:28218,15303586:28219,15303588:28220,15108488:28221,15303579:28222,15303810:28223,15303826:28224,15303833:28225,15303858:28226,15303856:28227,15304074:28228,15304086:28229,15304088:28230,15304099:28231,15304101:28232,15304105:28233,15304115:28234,15304114:28235,15304331:28236,15304329:28237,15304322:28238,15304354:28239,15304363:28240,15304367:28241,15304362:28242,15304373:28243,15304372:28244,15304378:28245,15304576:28246,15304577:28247,15304585:28248,15304587:28249,15304592:28250,15304598:28251,15304607:28252,15304609:28253,15304603:28254,15304636:28255,15304629:28256,15304630:28257,15304862:28258,15304639:28259,15304852:28260,15304876:28261,15304853:28262,15304849:28263,15305118:28264,15305111:28265,15305093:28266,15305097:28267,15305124:28268,15305096:28269,15305365:28270,15304895:28271,15305099:28272,15305104:28273,15305372:28274,15305366:28275,15305363:28276,15305371:28277,15305114:28278,15305615:28279,15305401:28280,15305399:28281,15305641:28282,15305871:28283,15305658:28284,15306116:28285,15305902:28286,15305881:28449,15305890:28450,15305882:28451,15305891:28452,15305914:28453,15305909:28454,15305915:28455,15306140:28456,15306144:28457,15306172:28458,15306158:28459,15306134:28460,15306416:28461,15306412:28462,15306413:28463,15306388:28464,15306425:28465,15306646:28466,15306647:28467,15306664:28468,15306661:28469,15306648:28470,15306627:28471,15306653:28472,15306640:28473,15306632:28474,15306660:28475,15306906:28476,15306900:28477,15306899:28478,15306883:28479,15306887:28480,15306896:28481,15306934:28482,15306923:28483,15306933:28484,15306913:28485,15306938:28486,15307137:28487,15307154:28488,15307140:28489,15307163:28490,15307168:28491,15307170:28492,15307166:28493,15307178:28494,15304873:28495,15307184:28496,15307189:28497,15307191:28498,15307197:28499,
15307162:28500,15307196:28501,15307198:28502,15307393:28503,15307199:28504,15308418:28505,15308423:28506,15308426:28507,15308436:28508,15308438:28509,15308440:28510,15308441:28511,15308448:28512,15308456:28513,15308455:28514,15308461:28515,15308476:28516,15308475:28517,15308473:28518,15308478:28519,15308682:28520,15122358:28521,15308675:28522,15308685:28523,15308684:28524,15308693:28525,15308692:28526,15308694:28527,15308700:28528,15308705:28529,15308709:28530,15308706:28531,15308961:28532,15308968:28533,15308974:28534,15308975:28535,15309186:28536,15309196:28537,15309199:28538,15309195:28539,15309239:28540,15309212:28541,15309214:28542,15309213:28705,15309215:28706,15309222:28707,15309234:28708,15309228:28709,15309453:28710,15309464:28711,15309461:28712,15309463:28713,15309482:28714,15309479:28715,15309489:28716,15309490:28717,15309488:28718,15309492:28719,15309494:28720,15309496:28721,15309497:28722,15309710:28723,15309707:28724,15309705:28725,15309709:28726,15246733:28727,15309724:28728,15309965:28729,15309717:28730,15309753:28731,15309956:28732,15309958:28733,15309960:28734,15309971:28735,15309966:28736,15309969:28737,15309967:28738,15309974:28739,15309977:28740,15309988:28741,15309994:28742,1531e4:28743,15310009:28744,15310013:28745,15310014:28746,15310212:28747,15310214:28748,15310216:28749,15310210:28750,15310217:28751,15310236:28752,15310240:28753,15310244:28754,15310246:28755,15310248:28756,15043474:28757,15310251:28758,15310257:28759,15310265:28760,15310469:28761,15310268:28762,15310465:28763,15310266:28764,15310470:28765,15310475:28766,15310479:28767,15310480:28768,15310492:28769,15310504:28770,15310502:28771,15310499:28772,15310515:28773,15310516:28774,15310723:28775,15310726:28776,15310728:28777,15310731:28778,15310748:28779,15310765:28780,15318415:28781,15310770:28782,15182751:28783,15310774:28784,15310773:28785,15310991:28786,15310988:28787,15311032:28788,15311012:28789,15311009:28790,15311031:28791,15311037:28792,15311238:28793,15311247:28794,15311243:28795,15311275:28796,15311279:28797,15311280:28798,15311281:28961,15311284:28962,15311283:28963,15311530:28964,15311535:28965,15311537:28966,15311542:28967,15311748:28968,15311747:28969,15311750:28970,15311785:28971,15311787:28972,15312003:28973,15312009:28974,15312018:28975,15312020:28976,15312024:28977,15312033:28978,15312029:28979,15312030:28980,15312036:28981,15312032:28982,15312044:28983,15312046:28984,15312061:28985,15312062:28986,15312258:28987,15312265:28988,15312261:28989,15312272:28990,15312267:28991,15312273:28992,15312274:28993,15312268:28994,15312277:28995,15312535:28996,15312536:28997,15312549:28998,15312557:28999,15312558:29e3,15312572:29001,15312799:29002,15312795:29003,15312797:29004,15312792:29005,15312785:29006,15312813:29007,15312814:29008,15312817:29009,15312818:29010,15312827:29011,15312824:29012,15313025:29013,15313039:29014,15313029:29015,15312802:29016,15313049:29017,15313067:29018,15313079:29019,15313285:29020,15313282:29021,15313280:29022,15313283:29023,15313086:29024,15313301:29025,15313293:29026,15313307:29027,15313303:29028,15313311:29029,15313314:29030,15313317:29031,15313316:29032,15313321:29033,15313323:29034,15313322:29035,15313581:29036,15313584:29037,15313596:29038,15313792:29039,15313807:29040,15313809:29041,15313811:29042,15313812:29043,15313822:29044,15313823:29045,15313826:29046,15313827:29047,15313830:29048,15313839:29049,15313835:29050,15313838:29051,15313844:29052,15313841:29053,15313847:29054,15313851:29217,15314054:29218,15314072:29219,15314074:29220,15314079:29221,15314082:29222,15314083:29223,15314085:29224,15314087:29225,15314088:29226,15314089:29227,15314090:29228,15314094:29229,15314095:29230,15314098:29231,15314308:29232,15314307:29233,15314319:29234,15314317:29235,15314318:29236,15314321:29237,15314328:29238,15314356:29239,15314579:29240,15314563:29241,15314577:29242,15314582:29243,15314583:29244,15314591:29245,15314592:29246,15314600:29247,15314612:29248,15314816:29249,15314826:29250,15314617:29251,15314822:29252,15314831:29253,15314833:29254,15314834:29255,15314851:29256,15314850:29257,15314852:29258,15314836:29259,15314849:29260,15315130:29261,15314866:29262,15314865:29263,15314864:29264,15315093:29265,15315092:29266,15315081:29267,15315091:29268,15315084:29269,15315078:29270,15315080:29271,15315090:29272,15315082:29273,15315076:29274,15315118:29275,15315099:29276,15315109:29277,15315108:29278,15315105:29279,15315120:29280,15315335:29281,15315122:29282,15315334:29283,15315134:29284,15315354:29285,15315360:29286,15315367:29287,15315382:29288,15315384:29289,15315879:29290,15315884:29291,15315888:29292,15316105:29293,15316104:29294,15315883:29295,15316099:29296,15316102:29297,15316138:29298,15316134:29299,15316655:29300,15316131:29301,15316127:29302,15316356:29303,15316117:29304,15316114:29305,15316353:29306,15316159:29307,15316158:29308,15316358:29309,15316360:29310,15316381:29473,15316382:29474,15316388:29475,15316369:29476,15316368:29477,15316377:29478,15316402:29479,15316617:29480,15316615:29481,15316651:29482,15316399:29483,15316410:29484,15316634:29485,15316644:29486,15316649:29487,15316658:29488,15316868:29489,15316865:29490,15316667:29491,15316664:29492,15316666:29493,15316870:29494,15316879:29495,15316866:29496,15316889:29497,15316883:29498,15316920:29499,15316902:29500,15316909:29501,15316911:29502,15316925:29503,15317146:29504,15317147:29505,15317150:29506,15317429:29507,15317433:29508,15317437:29509,15317633:29510,15317640:29511,15317643:29512,15317644:29513,15317650:29514,15317653:29515,15317649:29516,15317661:29517,15317669:29518,15317673:29519,15317688:29520,15317674:29521,15317677:29522,15310241:29523,15317900:29524,15317902:29525,15317903:29526,15317904:29527,15317908:29528,15317916:29529,15317918:29530,15317917:29531,15317920:29532,15317925:29533,15317928:29534,15317935:29535,15317940:29536,15317942:29537,15317943:29538,15317945:29539,15317947:29540,15317948:29541,15317949:29542,15318151:29543,15318152:29544,15178423:29545,15318165:29546,15318177:29547,15318188:29548,15318206:29549,15318410:29550,15318418:29551,15318420:29552,15318435:29553,15318431:29554,15318432:29555,15318433:29556,15318438:29557,15318439:29558,15318444:29559,15318442:29560,15318455:29561,15318450:29562,15318454:29563,15318677:29564,15318684:29565,15318688:29566,15048879:29729,15116167:29730,15303065:29731,15176100:29732,15042460:29733,15173273:29734,15186570:31009,15246492:31010,15306120:31011,15305352:31012,15242140:31013,14991241:31014,15172283:31015,15112369:31016,15115144:31017,15305657:31018,15113147:31019,15056261:31020,14989480:31021,14990241:31022,14990268:31023,14990464:31024,14990467:31025,14990521:31026,14990742:31027,14990994:31028,14990986:31029,14991002:31030,14990996:31031,14991245:31032,15040896:31033,15040674:31034,14991295:31035,15040670:31036,15040902:31037,15040944:31038,15040898:31039,15041172:31040,15041460:31041,15041432:31042,15041930:31043,15041956:31044,15042205:31045,15042238:31046,15042476:31047,15042709:31048,15043228:31049,15043238:31050,15043456:31051,15043483:31052,15043712:31053,15043719:31054,15043748:31055,15044018:31056,15044243:31057,15044274:31058,15044509:31059,15706254:31060,15045276:31061,15045258:31062,15045289:31063,15045567:31064,15046278:31065,15048089:31066,15048101:31067,15048364:31068,15048584:31069,15048583:31070,15706255:31071,15706256:31072,15049374:31073,15049394:31074,15049867:31075,15050131:31076,15050139:31077,15050141:31078,15050147:31079,15050404:31080,15050426:31081,15052182:31082,15052672:31083,15176879:31084,15052696:31085,15052716:31086,15052958:31087,15053478:31088,15053498:31089,15053749:31090,15053991:31091,15054227:31092,15706257:31093,15054210:31094,15054253:31095,15054520:31096,15054521:31097,15054736:31098,15056033:31099,15056052:31100,15056295:31101,15056567:31102,15056798:31265,15106461:31266,15106693:31267,15106698:31268,15106974:31269,15106965:31270,15107232:31271,15106994:31272,15107217:31273,15107255:31274,15107248:31275,15107736:31276,15108243:31277,15108774:31278,15110069:31279,
15110560:31280,15110813:31281,15111054:31282,15111566:31283,15112320:31284,15112341:31285,15112379:31286,15112329:31287,15112366:31288,15112350:31289,15112356:31290,15112613:31291,15112599:31292,15112601:31293,15706258:31294,15112627:31295,15112857:31296,15112864:31297,15112882:31298,15112895:31299,15113146:31300,15113358:31301,15705257:31302,15113638:31303,15113915:31304,15114642:31305,15114112:31306,15114369:31307,15114628:31308,15115151:31309,15706259:31310,15115688:31311,15706260:31312,15115928:31313,15116194:31314,15116464:31315,15116715:31316,15116678:31317,15116723:31318,15116734:31319,15117218:31320,15117220:31321,15118230:31322,15118527:31323,15118748:31324,15118982:31325,15118767:31326,15119258:31327,15119492:31328,15120007:31329,15119791:31330,15120022:31331,15120044:31332,15120271:31333,15120312:31334,15120306:31335,15120316:31336,15120569:31337,15120796:31338,15120551:31339,15120572:31340,15121087:31341,15122056:31342,15122101:31343,15122357:31344,15171717:31345,15171719:31346,15171752:31347,15172229:31348,15172267:31349,15172751:31350,15172740:31351,15173020:31352,15172998:31353,15172999:31354,15706261:31355,15173505:31356,15173566:31357,15174321:31358,15174334:31521,15174820:31522,15706262:31523,15175095:31524,15175357:31525,15175561:31526,15175574:31527,15175587:31528,15175570:31529,15175815:31530,15175605:31531,15175846:31532,15175850:31533,15175849:31534,15175854:31535,15176098:31536,15176329:31537,15176351:31538,15176833:31539,15177135:31540,15178370:31541,15178396:31542,15178398:31543,15178395:31544,15178406:31545,15706263:31546,15179142:31547,15043247:31548,15179937:31549,15180174:31550,15180196:31551,15180218:31552,15180976:31553,15706264:31554,15706265:31555,15706266:31556,15181460:31557,15706267:31558,15181467:31559,15182737:31560,15182759:31561,15706268:31562,15182763:31563,15183518:31564,15706269:31565,15185288:31566,15185308:31567,15185591:31568,15185568:31569,15185814:31570,15186322:31571,15187335:31572,15187617:31573,15706270:31574,15240321:31575,15240610:31576,15240639:31577,15241095:31578,15241142:31579,15241608:31580,15241908:31581,15242643:31582,15242649:31583,15242667:31584,15706271:31585,15242928:31586,15706272:31587,15706273:31588,15245447:31589,15246261:31590,15247506:31591,15247543:31592,15247801:31593,15248039:31594,15248062:31595,15248287:31596,15706274:31597,15248310:31598,15248787:31599,15248831:31600,15250352:31601,15250356:31602,15250578:31603,15250870:31604,15706275:31605,15252367:31606,15706276:31607,15706277:31608,15303079:31609,15303582:31610,15706278:31611,15303829:31612,15303847:31613,15304602:31614,15304599:31777,15304606:31778,15304621:31779,15304622:31780,15304612:31781,15304613:31782,15304838:31783,15304848:31784,15304842:31785,15304890:31786,15305088:31787,15304892:31788,15305102:31789,15305113:31790,15305105:31791,15304889:31792,15305127:31793,15305383:31794,15305143:31795,15305144:31796,15305639:31797,15305623:31798,15305625:31799,15305616:31800,15706279:31801,15305621:31802,15305632:31803,15305619:31804,15305893:31805,15305889:31806,15305659:31807,15706280:31808,15305886:31809,15305663:31810,15305885:31811,15305858:31812,15306160:31813,15306135:31814,15306404:31815,15306630:31816,15306654:31817,15306680:31818,15306929:31819,15307141:31820,15307144:31821,15308434:31822,15706012:31823,15706281:31824,15309469:31825,15309487:31826,15310003:31827,15310011:31828,15310211:31829,15310221:31830,15310223:31831,15310225:31832,15310229:31833,15311255:31834,15311269:31835,15706282:31836,15706283:31837,15312039:31838,15706284:31839,15312542:31840,15313294:31841,15313817:31842,15313820:31843,15314357:31844,15314354:31845,15314575:31846,15314609:31847,15314619:31848,15315072:31849,15316400:31850,15316395:31851,15706285:31852,15317145:31853,15317905:31854,14845360:31857,14845361:31858,14845362:31859,14845363:31860,14845364:31861,14845365:31862,14845366:31863,14845367:31864,14845368:31865,14845369:31866,15712164:31868,15711367:31869,15711362:31870,14846117:8514,15712162:8780,14846098:74077},Xa={52120:8751,52103:8752,49848:8753,52121:8754,52125:8755,49839:8756,52123:8757,52122:8758,126:8759,52868:8760,52869:8761,49825:8770,49830:8771,49855:8772,49850:8811,49834:8812,49833:8813,49838:8814,14845090:8815,49828:8816,14845078:8817,52870:9825,52872:9826,52873:9827,52874:9828,52906:9829,52876:9831,52878:9833,52907:9834,52879:9836,52908:9841,52909:9842,52910:9843,52911:9844,53130:9845,52880:9846,53132:9847,53122:9848,53133:9849,53131:9850,52912:9851,53134:9852,53378:10050,53379:10051,53380:10052,53381:10053,53382:10054,53383:10055,53384:10056,53385:10057,53386:10058,53387:10059,53388:10060,53390:10061,53391:10062,53650:10098,53651:10099,53652:10100,53653:10101,53654:10102,53655:10103,53656:10104,53657:10105,53658:10106,53659:10107,53660:10108,53662:10109,53663:10110,50054:10529,50320:10530,50342:10532,50354:10534,50561:10536,50367:10537,50570:10539,50072:10540,50578:10541,50598:10543,50078:10544,50086:10561,50321:10562,50096:10563,50343:10564,50353:10565,50355:10566,50360:10567,50562:10568,50560:10569,50569:10570,50571:10571,50104:10572,50579:10573,50079:10574,50599:10575,50110:10576,50049:10785,50048:10786,50052:10787,50050:10788,50306:10789,51085:10790,50304:10791,50308:10792,50053:10793,50051:10794,50310:10795,50312:10796,50316:10797,50055:10798,50314:10799,50318:10800,50057:10801,50056:10802,50059:10803,50058:10804,50330:10805,50326:10806,50322:10807,50328:10808,50332:10810,50334:10811,50338:10812,50336:10813,50340:10814,50061:10815,50060:10816,50063:10817,50062:10818,51087:10819,50352:10820,50346:10821,50350:10822,50344:10823,50356:10824,50358:10825,50361:10826,50365:10827,50363:10828,50563:10829,50567:10830,50565:10831,50065:10832,50067:10833,50066:10834,50070:10835,50068:10836,51089:10837,50576:10838,50572:10839,50069:10840,50580:10841,50584:10842,50582:10843,50586:10844,50588:10845,50592:10846,50590:10847,50596:10848,50594:10849,50074:10850,50073:10851,50076:10852,50075:10853,50604:10854,51091:10855,50608:10856,50602:10857,50610:10858,50606:10859,50600:10860,51095:10861,51099:10862,51097:10863,51093:10864,50612:10865,50077:10866,50616:10867,50614:10868,50617:10869,50621:10870,50619:10871,50081:11041,50080:11042,50084:11043,50082:11044,50307:11045,51086:11046,50305:11047,50309:11048,50085:11049,50083:11050,50311:11051,50313:11052,50317:11053,50087:11054,50315:11055,50319:11056,50089:11057,50088:11058,50091:11059,50090:11060,50331:11061,50327:11062,50323:11063,50329:11064,51125:11065,50333:11066,50335:11067,50337:11069,50341:11070,50093:11071,50092:11072,50095:11073,50094:11074,51088:11075,50347:11077,50351:11078,50345:11079,50357:11080,50359:11081,50362:11082,50366:11083,50364:11084,50564:11085,50568:11086,50566:11087,50097:11088,50099:11089,50098:11090,50102:11091,50100:11092,51090:11093,50577:11094,50573:11095,50101:11096,50581:11097,50585:11098,50583:11099,50587:11100,50589:11101,50593:11102,50591:11103,50597:11104,50595:11105,50106:11106,50105:11107,50108:11108,50107:11109,50605:11110,51092:11111,50609:11112,50603:11113,50611:11114,50607:11115,50601:11116,51096:11117,51100:11118,51098:11119,51094:11120,50613:11121,50109:11122,50111:11123,50615:11124,50618:11125,50622:11126,50620:11127,14989442:12321,14989444:12322,14989445:12323,14989452:12324,14989458:12325,14989471:12326,14989475:12327,14989476:12328,14989480:12329,14989483:12330,14989486:12331,14989487:12332,14989488:12333,14989493:12334,14989696:12335,14989697:12336,14989700:12337,14989703:12338,14989713:12339,14989722:12340,14989724:12341,14989731:12342,14989736:12343,14989737:12344,14989748:12345,14989749:12346,14989753:12347,14989759:12348,14989965:12349,14989974:12350,14989975:12351,14989981:12352,14989999:12353,14990009:12354,14990211:12355,14990224:12356,14990234:12357,14990235:12358,14990240:12359,14990241:12360,14990242:12361,14990248:12362,14990255:12363,14990257:12364,14990259:12365,14990261:12366,14990269:12367,14990270:12368,14990271:12369,14990464:12370,14990466:12371,14990467:12372,14990472:12373,14990475:12374,14990476:12375,14990482:12376,
14990485:12377,14990486:12378,14990487:12379,14990489:12380,14990510:12381,14990513:12382,14990752:12383,14990515:12384,14990517:12385,14990519:12386,14990521:12387,14990523:12388,14990526:12389,14990720:12390,14990722:12391,14990728:12392,14990729:12393,14990731:12394,14990732:12395,14990738:12396,14990740:12397,14990742:12398,14990744:12399,14990751:12400,14990755:12401,14990762:12402,14990764:12403,14990766:12404,14990769:12405,14990775:12406,14990776:12407,14990777:12408,14990778:12409,14990781:12410,14990782:12411,14990977:12412,14990978:12413,14990980:12414,14990981:12577,14990985:12578,14990986:12579,14990988:12580,14990990:12581,14990992:12582,14990994:12583,14990995:12584,14990996:12585,14990999:12586,14991001:12587,14991002:12588,14991006:12589,14991007:12590,14991026:12591,14991031:12592,14991033:12593,14991035:12594,14991036:12595,14991037:12596,14991038:12597,14991232:12598,14991233:12599,14991237:12600,14991238:12601,14991240:12602,14991241:12603,14991243:12604,14991244:12605,14991245:12606,14991247:12607,14991250:12608,14991260:12609,14991264:12610,14991266:12611,14991280:12612,14991282:12613,14991292:12614,14991293:12615,14991295:12616,15040640:12617,15040641:12618,15040644:12619,15040647:12620,15040650:12621,15040652:12622,15040654:12623,15040656:12624,15040659:12625,15040663:12626,15040664:12627,15040667:12628,15040668:12629,15040669:12630,15040670:12631,15040674:12632,15040679:12633,15040686:12634,15040688:12635,15040690:12636,15040691:12637,15040693:12638,15040896:12639,15040897:12640,15040898:12641,15040901:12642,15040902:12643,15040906:12644,15040908:12645,15040910:12646,15040913:12647,15040914:12648,15040915:12649,15040919:12650,15040921:12651,15040927:12652,15040928:12653,15040930:12654,15040931:12655,15040934:12656,15040935:12657,15040938:12658,15040941:12659,15040944:12660,15040945:12661,15040699:12662,15041153:12663,15041155:12664,15041156:12665,15041158:12666,15041162:12667,15041166:12668,15041167:12669,15041168:12670,15041170:12833,15041171:12834,15041172:12835,15041174:12836,15041179:12837,15041180:12838,15041182:12839,15041183:12840,15041184:12841,15041185:12842,15041186:12843,15041194:12844,15041199:12845,15041200:12846,15041209:12847,15041210:12848,15041213:12849,15041408:12850,15041411:12851,15041412:12852,15041415:12853,15041420:12854,15041422:12855,15041424:12856,15041427:12857,15041428:12858,15041432:12859,15041436:12860,15041437:12861,15041439:12862,15041442:12863,15041444:12864,15041446:12865,15041448:12866,15041449:12867,15041455:12868,15041457:12869,15041462:12870,15041466:12871,15041470:12872,15041667:12873,15041670:12874,15041671:12875,15041672:12876,15041675:12877,15041676:12878,15041677:12879,15041678:12880,15041458:12881,15041680:12882,15041687:12883,15041689:12884,15041691:12885,15041692:12886,15041693:12887,15041694:12888,15041699:12889,15041703:12890,15041704:12891,15041708:12892,15041709:12893,15041711:12894,15041713:12895,15041715:12896,15041716:12897,15041717:12898,15041720:12899,15041721:12900,15041922:12901,15041930:12902,15041935:12903,15041939:12904,15041941:12905,15041943:12906,15041944:12907,15041951:12908,15041956:12909,15041958:12910,15041982:12911,15042179:12912,15042180:12913,15042187:12914,15042190:12915,15042200:12916,15042205:12917,15042209:12918,15042211:12919,15042221:12920,15042232:12921,15042234:12922,15042236:12923,15042238:12924,15042239:12925,15042434:12926,15042440:13089,15042447:13090,15042449:13091,15042450:13092,15042451:13093,15042453:13094,15042456:13095,15042462:13096,15042466:13097,15042469:13098,15042478:13099,15042482:13100,15042483:13101,15042484:13102,15042487:13103,15042689:13104,15042690:13105,15042693:13106,15042706:13107,15042707:13108,15042709:13109,15042710:13110,15042712:13111,15042722:13112,15042728:13113,15042737:13114,15042738:13115,15042741:13116,15042748:13117,15042949:13118,15042953:13119,15042965:13120,15042967:13121,15042968:13122,15042970:13123,15042972:13124,15042975:13125,15042976:13126,15042977:13127,15042982:13128,15042990:13129,15042999:13130,15043e3:13131,15043001:13132,15043200:13133,15043202:13134,15043205:13135,15043210:13136,15043212:13137,15043219:13138,15043221:13139,15043222:13140,15043223:13141,15043224:13142,15043226:13143,15043228:13144,15043236:13145,15043237:13146,15043238:13147,15043239:13148,15043247:13149,15043248:13150,15043254:13151,15043255:13152,15043256:13153,15043258:13154,15043259:13155,15043261:13156,15043456:13157,15043460:13158,15043462:13159,15043464:13160,15043468:13161,15043471:13162,15043473:13163,15043476:13164,15043478:13165,15043483:13166,15043484:13167,15043489:13168,15043493:13169,15043496:13170,15043497:13171,15043498:13172,15043500:13173,15043504:13174,15043505:13175,15043508:13176,15043510:13177,15043511:13178,15043712:13179,15043715:13180,15043722:13181,15043723:13182,15043724:13345,15043729:13346,15043731:13347,15043736:13348,15043739:13349,15043740:13350,15043742:13351,15043743:13352,15043749:13353,15043751:13354,15043752:13355,15043753:13356,15043755:13357,15043756:13358,15043757:13359,15043760:13360,15043762:13361,15043765:13362,15043772:13363,15043773:13364,15043774:13365,15043970:13366,15043980:13367,15043979:13368,15043993:13369,15043995:13370,15044001:13371,15044003:13372,15044005:13373,15044012:13374,15044013:13375,15044018:13376,15044025:13377,15044030:13378,15044227:13379,15044231:13380,15044232:13381,15044238:13382,15044243:13383,15044244:13384,15044249:13385,15044253:13386,15044257:13387,15044260:13388,15044266:13389,15044267:13390,15044271:13391,15044274:13392,15044276:13393,15044277:13394,15044279:13395,15044280:13396,15044282:13397,15044285:13398,15044480:13399,15044485:13400,15044495:13401,15044498:13402,15044499:13403,15044501:13404,15044506:13405,15044509:13406,15044510:13407,15044512:13408,15044518:13409,15044519:13410,15044533:13411,15044738:13412,15044755:13413,15044762:13414,15044769:13415,15044775:13416,15044776:13417,15044778:13418,15044783:13419,15044785:13420,15044788:13421,15044789:13422,15044995:13423,15044996:13424,15044999:13425,15045005:13426,15045007:13427,15045022:13428,15045026:13429,15045028:13430,15045030:13431,15045031:13432,15045033:13433,15045035:13434,15045037:13435,15045038:13436,15045044:13437,15045055:13438,15045249:13601,15045251:13602,15045253:13603,15045256:13604,15045257:13605,15045261:13606,15045265:13607,15045269:13608,15045270:13609,15045276:13610,15045279:13611,15045281:13612,15045286:13613,15045287:13614,15045289:13615,15045290:13616,15045293:13617,15045294:13618,15045297:13619,15045303:13620,15045305:13621,15045306:13622,15045307:13623,15045311:13624,15045510:13625,15045514:13626,15045517:13627,15045518:13628,15045536:13629,15045546:13630,15045548:13631,15045551:13632,15045558:13633,15045564:13634,15045566:13635,15045567:13636,15045760:13637,15045761:13638,15045765:13639,15045768:13640,15045769:13641,15045772:13642,15045773:13643,15045774:13644,15045781:13645,15045802:13646,15045803:13647,15045810:13648,15045813:13649,15045814:13650,15045819:13651,15045820:13652,15045821:13653,15046017:13654,15046023:13655,15046025:13656,15046026:13657,15046029:13658,15046032:13659,15046033:13660,15046040:13661,15046042:13662,15046043:13663,15046046:13664,15046048:13665,15046049:13666,15046052:13667,15046054:13668,15046079:13669,15046273:13670,15046274:13671,15046278:13672,15046280:13673,15046286:13674,15046287:13675,15046289:13676,15046290:13677,15046291:13678,15046292:13679,15046295:13680,15046307:13681,15046308:13682,15046317:13683,15046322:13684,15046335:13685,15046529:13686,15046531:13687,15046534:13688,15046537:13689,15046539:13690,15046540:13691,15046542:13692,15046545:13693,15046546:13694,15046547:13857,15046551:13858,15046552:13859,15046555:13860,15046558:13861,15046562:13862,15046569:13863,15046582:13864,15046591:13865,15046789:13866,15046792:13867,15046794:13868,15046797:13869,15046798:13870,15046799:13871,15046800:13872,15046801:13873,15046802:13874,15046809:13875,15046828:13876,15046832:13877,15046835:13878,15046837:13879,15046839:13880,15046841:13881,15046843:13882,
15046844:13883,15046845:13884,15046847:13885,15047040:13886,15047041:13887,15047043:13888,15047044:13889,15047046:13890,15047049:13891,15047051:13892,15047053:13893,15047055:13894,15047060:13895,15047070:13896,15047072:13897,15047073:13898,15047074:13899,15047075:13900,15047078:13901,15047081:13902,15047085:13903,15047087:13904,15047089:13905,15047090:13906,15047093:13907,15047300:13908,15047301:13909,15047304:13910,15047307:13911,15047308:13912,15047317:13913,15047321:13914,15047322:13915,15047325:13916,15047326:13917,15047327:13918,15047334:13919,15047335:13920,15047336:13921,15047337:13922,15047339:13923,15047340:13924,15047341:13925,15047345:13926,15047347:13927,15047351:13928,15047358:13929,15047557:13930,15047561:13931,15047562:13932,15047563:13933,15047567:13934,15047568:13935,15047564:13936,15047565:13937,15047577:13938,15047580:13939,15047581:13940,15047583:13941,15047585:13942,15047588:13943,15047589:13944,15047590:13945,15047591:13946,15047592:13947,15047601:13948,15047595:13949,15047597:13950,15047606:14113,15047607:14114,15047809:14115,15047810:14116,15047815:14117,15047818:14118,15047820:14119,15047825:14120,15047829:14121,15047834:14122,15047835:14123,15047837:14124,15047840:14125,15047842:14126,15047843:14127,15047844:14128,15047845:14129,15047849:14130,15047850:14131,15047852:14132,15047854:14133,15047855:14134,15047859:14135,15047860:14136,15047869:14137,15047870:14138,15047871:14139,15048069:14140,15048070:14141,15048076:14142,15048077:14143,15048082:14144,15048098:14145,15048101:14146,15048103:14147,15048104:14148,15048107:14149,15048109:14150,15048110:14151,15048111:14152,15048112:14153,15048113:14154,15048115:14155,15048116:14156,15048117:14157,15048119:14158,15048121:14159,15048122:14160,15048123:14161,15048124:14162,15048126:14163,15048321:14164,15048323:14165,15048332:14166,15048340:14167,15048343:14168,15048345:14169,15048346:14170,15048348:14171,15048349:14172,15048350:14173,15048351:14174,15048353:14175,15048341:14176,15048359:14177,15048360:14178,15048361:14179,15048364:14180,15048376:14181,15048381:14182,15048583:14183,15048584:14184,15048588:14185,15048591:14186,15048597:14187,15048605:14188,15048606:14189,15048612:14190,15048614:14191,15048615:14192,15048617:14193,15048621:14194,15048624:14195,15048629:14196,15048630:14197,15048632:14198,15048637:14199,15048638:14200,15048639:14201,15048835:14202,15048836:14203,15048840:14204,15048841:14205,15048609:14206,15048844:14369,15048845:14370,15048859:14371,15048862:14372,15048863:14373,15048864:14374,15048870:14375,15048871:14376,15048877:14377,15048882:14378,15048889:14379,15048895:14380,15049097:14381,15049100:14382,15049101:14383,15049103:14384,15049104:14385,15049109:14386,15049119:14387,15049121:14388,15049124:14389,15049127:14390,15049128:14391,15049144:14392,15049148:14393,15049151:14394,15049344:14395,15049345:14396,15049351:14397,15049352:14398,15049353:14399,15049354:14400,15049356:14401,15049357:14402,15049359:14403,15049360:14404,15049364:14405,15049366:14406,15049373:14407,15049376:14408,15049377:14409,15049378:14410,15049382:14411,15049385:14412,15049393:14413,15049394:14414,15049604:14415,15049404:14416,15049602:14417,15049608:14418,15049613:14419,15049614:14420,15049616:14421,15049618:14422,15049620:14423,15049622:14424,15049626:14425,15049629:14426,15049633:14427,15049634:14428,15049641:14429,15049651:14430,15049861:14431,15049862:14432,15049867:14433,15049868:14434,15049874:14435,15049875:14436,15049876:14437,15243649:14438,15049885:14439,15049889:14440,15049891:14441,15049892:14442,15049896:14443,15049903:14444,15049904:14445,15049907:14446,15049909:14447,15049910:14448,15049919:14449,15050115:14450,15050118:14451,15050130:14452,15050131:14453,15050137:14454,15050139:14455,15050141:14456,15050142:14457,15050143:14458,15050145:14459,15050147:14460,15050155:14461,15050157:14462,15050159:14625,15050162:14626,15050165:14627,15050166:14628,15050169:14629,15050171:14630,15050172:14631,15050379:14632,15050380:14633,15050382:14634,15050386:14635,15050389:14636,15050391:14637,15050399:14638,15050404:14639,15050407:14640,15050413:14641,15050414:14642,15050415:14643,15050416:14644,15050419:14645,15050423:14646,15050426:14647,15050428:14648,15050625:14649,15050627:14650,15050628:14651,15050632:14652,15050634:14653,15050637:14654,15050642:14655,15050653:14656,15050654:14657,15050655:14658,15050659:14659,15050660:14660,15050663:14661,15050670:14662,15050671:14663,15050673:14664,15050674:14665,15050676:14666,15050679:14667,15050880:14668,15050884:14669,15050892:14670,15050893:14671,15050894:14672,15050898:14673,15050899:14674,15050910:14675,15050915:14676,15050916:14677,15050919:14678,15050920:14679,15050922:14680,15050925:14681,15050928:14682,15051140:14683,15051141:14684,15051143:14685,15051144:14686,15051148:14687,15051152:14688,15051157:14689,15051166:14690,15051171:14691,15051173:14692,15051175:14693,15051181:14694,15051191:14695,15051194:14696,15051195:14697,15051198:14698,15051403:14699,15051408:14700,15051411:14701,15051414:14702,15051417:14703,15051420:14704,15051422:14705,15051423:14706,15051424:14707,15051426:14708,15051431:14709,15051436:14710,15051441:14711,15051442:14712,15051443:14713,15051445:14714,15051448:14715,15051450:14716,15051451:14717,15051455:14718,15051652:14881,15051654:14882,15051656:14883,15051663:14884,15051674:14885,15051676:14886,15051680:14887,15051685:14888,15051690:14889,15051694:14890,15051701:14891,15051702:14892,15051709:14893,15051904:14894,15051905:14895,15051912:14896,15051927:14897,15051956:14898,15051929:14899,15051931:14900,15051933:14901,15051937:14902,15051941:14903,15051949:14904,15051960:14905,15052161:14906,15052171:14907,15052172:14908,15052178:14909,15052182:14910,15052190:14911,15052200:14912,15052206:14913,15052207:14914,15052220:14915,15052221:14916,15052222:14917,15052223:14918,15052417:14919,15052420:14920,15052422:14921,15052426:14922,15052430:14923,15052432:14924,15052433:14925,15052435:14926,15052436:14927,15052438:14928,15052456:14929,15052457:14930,15052460:14931,15052461:14932,15052463:14933,15052465:14934,15052466:14935,15052471:14936,15052474:14937,15052476:14938,15052672:14939,15052673:14940,15052685:14941,15052687:14942,15052694:14943,15052695:14944,15052696:14945,15052697:14946,15052698:14947,15052704:14948,15052719:14949,15052721:14950,15052724:14951,15052733:14952,15052940:14953,15052951:14954,15052958:14955,15052959:14956,15052963:14957,15052966:14958,15052969:14959,15052971:14960,15052972:14961,15052974:14962,15052976:14963,15052978:14964,15052981:14965,15052982:14966,15053209:14967,15053210:14968,15053212:14969,15053218:14970,15053219:14971,15053223:14972,15053224:14973,15053225:14974,15053229:15137,15053232:15138,15053236:15139,15053237:15140,15053242:15141,15053243:15142,15053244:15143,15053245:15144,15053447:15145,15053448:15146,15053450:15147,15053455:15148,15053458:15149,15053469:15150,15053471:15151,15053472:15152,15053474:15153,15053475:15154,15053478:15155,15053482:15156,15053490:15157,15053492:15158,15053493:15159,15053498:15160,15053705:15161,15053707:15162,15053714:15163,15053725:15164,15053719:15165,15053742:15166,15053745:15167,15053746:15168,15053748:15169,15053953:15170,15053958:15171,15053965:15172,15053970:15173,15053995:15174,15053987:15175,15053988:15176,15053990:15177,15053991:15178,15054001:15179,15054004:15180,15054009:15181,15054013:15182,15054015:15183,15054210:15184,15054211:15185,15054214:15186,15054216:15187,15054229:15188,15054225:15189,15054233:15190,15054218:15191,15054239:15192,15054240:15193,15054241:15194,15054242:15195,15054244:15196,15054250:15197,15054253:15198,15054256:15199,15054265:15200,15054266:15201,15054270:15202,15054271:15203,15054465:15204,15054467:15205,15054472:15206,15054474:15207,15054482:15208,15054483:15209,15054484:15210,15054485:15211,15054489:15212,15054491:15213,15054495:15214,15054496:15215,15054503:15216,15054507:15217,15054512:15218,15054516:15219,15054520:15220,15054521:15221,15054723:15222,15054727:15223,15054731:15224,15054736:15225,15054734:15226,
15054744:15227,15054745:15228,15054752:15229,15054756:15230,15054761:15393,15054776:15394,15054777:15395,15054976:15396,15054983:15397,15054989:15398,15054994:15399,15054996:15400,15054997:15401,15055e3:15402,15055007:15403,15055008:15404,15055022:15405,15055016:15406,15055026:15407,15055029:15408,15055038:15409,15055243:15410,15055248:15411,15055241:15412,15055249:15413,15055254:15414,15055256:15415,15055259:15416,15055260:15417,15055262:15418,15055272:15419,15055274:15420,15055275:15421,15055276:15422,15055277:15423,15055278:15424,15055280:15425,15055488:15426,15055499:15427,15055502:15428,15055522:15429,15055524:15430,15055525:15431,15055528:15432,15055530:15433,15055532:15434,15055537:15435,15055539:15436,15055549:15437,15055550:15438,15055551:15439,15055750:15440,15055756:15441,15055755:15442,15055758:15443,15055761:15444,15055762:15445,15055764:15446,15055765:15447,15055772:15448,15055774:15449,15055781:15450,15055787:15451,15056002:15452,15056006:15453,15056007:15454,15056008:15455,15056014:15456,15056025:15457,15056028:15458,15056029:15459,15056033:15460,15056034:15461,15056035:15462,15056036:15463,15056040:15464,15056043:15465,15056044:15466,15056046:15467,15056048:15468,15056052:15469,15056054:15470,15056059:15471,15056061:15472,15056063:15473,15056256:15474,15056260:15475,15056261:15476,15056263:15477,15056269:15478,15056272:15479,15056276:15480,15056280:15481,15056283:15482,15056288:15483,15056291:15484,15056292:15485,15056295:15486,15056303:15649,15056306:15650,15056308:15651,15056309:15652,15056312:15653,15056314:15654,15056317:15655,15056318:15656,15056521:15657,15056525:15658,15056527:15659,15056534:15660,15056540:15661,15056541:15662,15056546:15663,15056551:15664,15056555:15665,15056548:15666,15056556:15667,15056559:15668,15056560:15669,15056561:15670,15056568:15671,15056772:15672,15056775:15673,15056776:15674,15056777:15675,15056779:15676,15056784:15677,15056785:15678,15056786:15679,15056787:15680,15056788:15681,15056798:15682,15056801:15683,15056802:15684,15056808:15685,15056809:15686,15056810:15687,15056812:15688,15056813:15689,15056814:15690,15056815:15691,15056818:15692,15056819:15693,15056822:15694,15056826:15695,15056828:15696,15106183:15697,15106186:15698,15106189:15699,15106195:15700,15106196:15701,15106199:15702,15106200:15703,15106202:15704,15106207:15705,15106212:15706,15106221:15707,15106227:15708,15106229:15709,15106432:15710,15106439:15711,15106440:15712,15106441:15713,15106444:15714,15106449:15715,15106452:15716,15106454:15717,15106455:15718,15106461:15719,15106465:15720,15106471:15721,15106481:15722,15106494:15723,15106495:15724,15106690:15725,15106694:15726,15106696:15727,15106698:15728,15106702:15729,15106705:15730,15106707:15731,15106709:15732,15106712:15733,15106717:15734,15106718:15735,15106722:15736,15106724:15737,15106725:15738,15106728:15739,15106736:15740,15106737:15741,15106743:15742,15106747:15905,15106750:15906,15106946:15907,15106948:15908,15106952:15909,15106953:15910,15106954:15911,15106955:15912,15106958:15913,15106959:15914,15106964:15915,15106965:15916,15106969:15917,15106971:15918,15106973:15919,15106974:15920,15106978:15921,15106981:15922,15106994:15923,15106997:15924,15107e3:15925,15107004:15926,15107005:15927,15107202:15928,15107207:15929,15107210:15930,15107212:15931,15107216:15932,15107217:15933,15107218:15934,15107219:15935,15107220:15936,15107222:15937,15107223:15938,15107225:15939,15107228:15940,15107230:15941,15107234:15942,15107242:15943,15107243:15944,15107248:15945,15107249:15946,15107253:15947,15107254:15948,15107255:15949,15107257:15950,15107457:15951,15107461:15952,15107462:15953,15107465:15954,15107486:15955,15107488:15956,15107500:15957,15107506:15958,15107512:15959,15107515:15960,15107516:15961,15107519:15962,15107712:15963,15107713:15964,15107715:15965,15107716:15966,15107723:15967,15107725:15968,15107730:15969,15107731:15970,15107735:15971,15107736:15972,15107740:15973,15107741:15974,15107743:15975,15107744:15976,15107749:15977,15107752:15978,15107754:15979,15107757:15980,15107768:15981,15107769:15982,15107772:15983,15107968:15984,15107969:15985,15107970:15986,15107982:15987,15107983:15988,15107989:15989,15107996:15990,15107997:15991,15107998:15992,15107999:15993,15108001:15994,15108002:15995,15108007:15996,15108009:15997,15108005:15998,15108012:16161,15108013:16162,15108015:16163,15108225:16164,15108227:16165,15108228:16166,15108231:16167,15108243:16168,15108245:16169,15108252:16170,15108256:16171,15108258:16172,15108259:16173,15108263:16174,15108265:16175,15108267:16176,15108281:16177,15108285:16178,15108482:16179,15108483:16180,15108484:16181,15108486:16182,15108492:16183,15108496:16184,15108497:16185,15108498:16186,15108500:16187,15108502:16188,15108506:16189,15108508:16190,15108516:16191,15108525:16192,15108527:16193,15108531:16194,15108538:16195,15108541:16196,15108749:16197,15108750:16198,15108751:16199,15108752:16200,15108774:16201,15108776:16202,15108787:16203,15108790:16204,15108791:16205,15108794:16206,15108798:16207,15108799:16208,15108996:16209,15109006:16210,15109013:16211,15109014:16212,15109018:16213,15109034:16214,15109042:16215,15109044:16216,15109052:16217,15109053:16218,15109251:16219,15109252:16220,15109258:16221,15109259:16222,15109261:16223,15109264:16224,15109267:16225,15109270:16226,15109272:16227,15109289:16228,15109290:16229,15109293:16230,15109301:16231,15109302:16232,15109305:16233,15109308:16234,15109505:16235,15109506:16236,15109507:16237,15109508:16238,15109510:16239,15109514:16240,15109515:16241,15109518:16242,15109522:16243,15109523:16244,15109524:16245,15109528:16246,15109531:16247,15109541:16248,15109542:16249,15109548:16250,15109549:16251,15109553:16252,15109556:16253,15109557:16254,15109560:16417,15109564:16418,15109565:16419,15109567:16420,15109762:16421,15109764:16422,15109767:16423,15109770:16424,15109776:16425,15109780:16426,15109781:16427,15109785:16428,15109786:16429,15109790:16430,15109796:16431,15109798:16432,15109805:16433,15109806:16434,15109807:16435,15109821:16436,15110017:16437,15110021:16438,15110024:16439,15110030:16440,15110033:16441,15110035:16442,15110036:16443,15110037:16444,15110044:16445,15110048:16446,15110053:16447,15110058:16448,15110060:16449,15110066:16450,15110067:16451,15110069:16452,15110072:16453,15110073:16454,15110281:16455,15110282:16456,15110288:16457,15110290:16458,15110292:16459,15110296:16460,15110302:16461,15110304:16462,15110306:16463,15110308:16464,15110309:16465,15110313:16466,15110314:16467,15110319:16468,15110320:16469,15110325:16470,15110333:16471,15110335:16472,15110539:16473,15110543:16474,15110545:16475,15110546:16476,15110547:16477,15110548:16478,15110554:16479,15110555:16480,15110556:16481,15110557:16482,15110559:16483,15110560:16484,15110561:16485,15110563:16486,15110573:16487,15110579:16488,15110580:16489,15110587:16490,15110589:16491,15110789:16492,15110791:16493,15110799:16494,15110800:16495,15110801:16496,15110808:16497,15110809:16498,15110811:16499,15110813:16500,15110815:16501,15110817:16502,15110819:16503,15110822:16504,15110824:16505,15110828:16506,15110835:16507,15110845:16508,15110846:16509,15110847:16510,15111044:16673,15111049:16674,15111050:16675,15111051:16676,15111052:16677,15111054:16678,15111056:16679,15111057:16680,15111061:16681,15111063:16682,15111076:16683,15111077:16684,15111081:16685,15111082:16686,15111085:16687,15111088:16688,15111093:16689,15111095:16690,15111099:16691,15111103:16692,15111297:16693,15111300:16694,15111304:16695,15111305:16696,15111306:16697,15111311:16698,15111315:16699,15111316:16700,15111318:16701,15111321:16702,15111323:16703,15111326:16704,15111327:16705,15111330:16706,15111334:16707,15111337:16708,15111342:16709,15111345:16710,15111354:16711,15111356:16712,15111357:16713,15111555:16714,15111559:16715,15111561:16716,15111568:16717,15111570:16718,15111572:16719,15111583:16720,15111584:16721,15111591:16722,15111595:16723,15111610:16724,15111613:16725,15111809:16726,15111813:16727,15111818:16728,15111826:16729,15111829:16730,15111832:16731,15111837:16732,
15111840:16733,15111843:16734,15111846:16735,15111854:16736,15111858:16737,15111859:16738,15111860:16739,15111871:16740,15112066:16741,15112072:16742,15112073:16743,15112078:16744,15112080:16745,15112084:16746,15112086:16747,15112088:16748,15112095:16749,15112112:16750,15112114:16751,15112116:16752,15112117:16753,15112121:16754,15112126:16755,15112127:16756,15112320:16757,15112324:16758,15112328:16759,15112329:16760,15112333:16761,15112337:16762,15112338:16763,15112341:16764,15112342:16765,15112349:16766,15112350:16929,15112353:16930,15112354:16931,15112355:16932,15112356:16933,15112358:16934,15112361:16935,15112362:16936,15112363:16937,15112364:16938,15112366:16939,15112368:16940,15112369:16941,15112371:16942,15112377:16943,15112375:16944,15112576:16945,15112581:16946,15112582:16947,15112586:16948,15112588:16949,15112593:16950,15112590:16951,15112599:16952,15112600:16953,15112601:16954,15112603:16955,15112604:16956,15112608:16957,15112609:16958,15113147:16959,15112618:16960,15112619:16961,15112620:16962,15112638:16963,15112627:16964,15112629:16965,15112639:16966,15112631:16967,15112632:16968,15112633:16969,15112635:16970,15112832:16971,15112636:16972,15112843:16973,15112844:16974,15112845:16975,15112848:16976,15112850:16977,15112857:16978,15112858:16979,15112859:16980,15112860:16981,15112863:16982,15112864:16983,15112868:16984,15112877:16985,15112881:16986,15112882:16987,15112885:16988,15112891:16989,15112895:16990,15113088:16991,15113090:16992,15113091:16993,15113096:16994,15113100:16995,15113102:16996,15113103:16997,15113108:16998,15113115:16999,15113119:17e3,15113128:17001,15113131:17002,15113132:17003,15113134:17004,15113146:17005,15113349:17006,15113351:17007,15113358:17008,15113363:17009,15113369:17010,15113372:17011,15113376:17012,15113378:17013,15113395:17014,15113406:17015,15113605:17016,15113607:17017,15113608:17018,15113612:17019,15113620:17020,15113621:17021,15113629:17022,15113638:17185,15113644:17186,15113646:17187,15113652:17188,15113654:17189,15113659:17190,15113857:17191,15113860:17192,15113870:17193,15113871:17194,15113873:17195,15113875:17196,15113878:17197,15113880:17198,15113881:17199,15113883:17200,15113904:17201,15113905:17202,15113906:17203,15113909:17204,15113915:17205,15113916:17206,15113917:17207,15114169:17208,15114112:17209,15114114:17210,15114115:17211,15114117:17212,15114120:17213,15114121:17214,15114130:17215,15114135:17216,15114137:17217,15114140:17218,15114145:17219,15114150:17220,15114160:17221,15114162:17222,15114166:17223,15114167:17224,15114642:17225,15114388:17226,15114393:17227,15114397:17228,15114399:17229,15114408:17230,15114407:17231,15114412:17232,15114413:17233,15114415:17234,15114416:17235,15114417:17236,15114419:17237,15114427:17238,15114431:17239,15114628:17240,15114629:17241,15114634:17242,15114636:17243,15114645:17244,15114647:17245,15114648:17246,15114651:17247,15114667:17248,15114670:17249,15114671:17250,15114672:17251,15114673:17252,15114674:17253,15114677:17254,15114681:17255,15114682:17256,15114683:17257,15114684:17258,15114882:17259,15114884:17260,15114886:17261,15114888:17262,15114902:17263,15114904:17264,15114906:17265,15114908:17266,15114913:17267,15114915:17268,15114917:17269,15114921:17270,15114922:17271,15114926:17272,15114930:17273,15114939:17274,15115141:17275,15115144:17276,15115148:17277,15115151:17278,15115152:17441,15115153:17442,15115155:17443,15115158:17444,15115161:17445,15115164:17446,15115165:17447,15115173:17448,15115176:17449,15115178:17450,15115179:17451,15115180:17452,15115181:17453,15115184:17454,15115185:17455,15115189:17456,15115190:17457,15115195:17458,15115196:17459,15115197:17460,15115398:17461,15115401:17462,15115402:17463,15115408:17464,15115409:17465,15115411:17466,15115414:17467,15115415:17468,15115441:17469,15115443:17470,15115445:17471,15115448:17472,15115451:17473,15115650:17474,15115653:17475,15115657:17476,15115662:17477,15115671:17478,15115675:17479,15115683:17480,15115684:17481,15115685:17482,15115686:17483,15115688:17484,15115689:17485,15115692:17486,15115696:17487,15115697:17488,15115698:17489,15115706:17490,15115707:17491,15115711:17492,15115904:17493,15115917:17494,15115922:17495,15115926:17496,15115928:17497,15115937:17498,15115941:17499,15115942:17500,15115944:17501,15115947:17502,15115949:17503,15115951:17504,15115959:17505,15115960:17506,15115962:17507,15115964:17508,15116165:17509,15116168:17510,15116177:17511,15116182:17512,15116183:17513,15116194:17514,15116197:17515,15116206:17516,15116207:17517,15116209:17518,15116211:17519,15116213:17520,15116222:17521,15116416:17522,15116417:17523,15116419:17524,15116431:17525,15116433:17526,15116437:17527,15116442:17528,15116445:17529,15116448:17530,15116452:17531,15116456:17532,15116464:17533,15116466:17534,15116468:17697,15116471:17698,15116475:17699,15116478:17700,15116479:17701,15116677:17702,15116678:17703,15116681:17704,15116682:17705,15116686:17706,15116688:17707,15116689:17708,15116690:17709,15116693:17710,15116694:17711,15116699:17712,15116708:17713,15116711:17714,15116714:17715,15116721:17716,15116723:17717,15116734:17718,15116929:17719,15116931:17720,15116934:17721,15116935:17722,15116937:17723,15116939:17724,15116945:17725,15116955:17726,15116957:17727,15116958:17728,15116959:17729,15116965:17730,15116971:17731,15116975:17732,15116976:17733,15116977:17734,15116980:17735,15116989:17736,15116990:17737,15116991:17738,15117190:17739,15117193:17740,15117192:17741,15117196:17742,15117200:17743,15117204:17744,15117205:17745,15117206:17746,15117212:17747,15117213:17748,15117220:17749,15117223:17750,15117228:17751,15117232:17752,15117233:17753,15117234:17754,15117244:17755,15117245:17756,15117442:17757,15117443:17758,15117446:17759,15117447:17760,15117449:17761,15117455:17762,15117456:17763,15117457:17764,15117463:17765,15117467:17766,15117470:17767,15117476:17768,15117480:17769,15117483:17770,15117484:17771,15117487:17772,15117493:17773,15117494:17774,15117499:17775,15117503:17776,15117702:17777,15117706:17778,15117709:17779,15117714:17780,15117718:17781,15117720:17782,15117725:17783,15117728:17784,15117735:17785,15117739:17786,15117742:17787,15117744:17788,15117749:17789,15117757:17790,15117758:17953,15117954:17954,15117957:17955,15117975:17956,15117979:17957,15117983:17958,15117984:17959,15117986:17960,15117987:17961,15117992:17962,15117993:17963,15117996:17964,15117997:17965,15117998:17966,15118e3:17967,15118008:17968,15118009:17969,15118013:17970,15118014:17971,15118211:17972,15118212:17973,15118217:17974,15118220:17975,15118230:17976,15118234:17977,15118241:17978,15118243:17979,15118246:17980,15118247:17981,15118254:17982,15118257:17983,15118263:17984,15118265:17985,15118271:17986,15118466:17987,15118468:17988,15118469:17989,15118473:17990,15118477:17991,15118478:17992,15118480:17993,15118482:17994,15118489:17995,15118495:17996,15118502:17997,15118503:17998,15118504:17999,15118508:18e3,15118510:18001,15118515:18002,15118517:18003,15118518:18004,15118522:18005,15118523:18006,15118527:18007,15118730:18008,15118731:18009,15118733:18010,15118735:18011,15118738:18012,15118740:18013,15118745:18014,15118747:18015,15118748:18016,15118763:18017,15118765:18018,15118767:18019,15118772:18020,15118774:18021,15118776:18022,15118777:18023,15118779:18024,15118981:18025,15118982:18026,15118983:18027,15118985:18028,15118996:18029,15118997:18030,15118999:18031,15119e3:18032,15119004:18033,15119007:18034,15119024:18035,15119026:18036,15119028:18037,15119234:18038,15119238:18039,15119245:18040,15119247:18041,15119248:18042,15119249:18043,15119250:18044,15119252:18045,15119254:18046,15119258:18209,15119260:18210,15119264:18211,15119271:18212,15119273:18213,15119275:18214,15119276:18215,15119278:18216,15119282:18217,15119284:18218,15119492:18219,15119495:18220,15119498:18221,15119502:18222,15119503:18223,15119505:18224,15119507:18225,15119514:18226,15119526:18227,15119527:18228,15119528:18229,15118759:18230,15119534:18231,15119535:18232,15119537:18233,15119545:18234,15119548:18235,15119551:18236,15119767:18237,15119774:18238,
15119775:18239,15119777:18240,15119781:18241,15119783:18242,15119791:18243,15119792:18244,15119804:18245,15120002:18246,15120007:18247,15120017:18248,15120018:18249,15120020:18250,15120022:18251,15120023:18252,15120024:18253,15120042:18254,15120044:18255,15120052:18256,15120055:18257,15120057:18258,15120061:18259,15120063:18260,15120260:18261,15120264:18262,15120266:18263,15120270:18264,15120271:18265,15120278:18266,15120283:18267,15120285:18268,15120287:18269,15120288:18270,15120290:18271,15120293:18272,15120297:18273,15120303:18274,15120304:18275,15120308:18276,15120310:18277,15120316:18278,15120512:18279,15120516:18280,15120542:18281,15120546:18282,15120551:18283,15120562:18284,15120566:18285,15120569:18286,15120571:18287,15120572:18288,15120772:18289,15120773:18290,15120776:18291,15120777:18292,15120779:18293,15120783:18294,15120785:18295,15120786:18296,15120787:18297,15120788:18298,15120791:18299,15120796:18300,15120797:18301,15120798:18302,15120802:18465,15120803:18466,15120808:18467,15120819:18468,15120827:18469,15120829:18470,15121037:18471,15121043:18472,15121049:18473,15121056:18474,15121063:18475,15121069:18476,15121070:18477,15121073:18478,15121075:18479,15121083:18480,15121087:18481,15121280:18482,15121281:18483,15121283:18484,15121287:18485,15121288:18486,15121290:18487,15121293:18488,15121294:18489,15121295:18490,15121323:18491,15121325:18492,15121326:18493,15121337:18494,15121339:18495,15121341:18496,15121540:18497,15121544:18498,15121546:18499,15121548:18500,15121549:18501,15121558:18502,15121560:18503,15121562:18504,15121563:18505,15121574:18506,15121577:18507,15121578:18508,15121583:18509,15121584:18510,15121587:18511,15121590:18512,15121595:18513,15121596:18514,15121581:18515,15121807:18516,15121809:18517,15121810:18518,15121811:18519,15121815:18520,15121817:18521,15121818:18522,15121821:18523,15121822:18524,15121825:18525,15121826:18526,15121832:18527,15121836:18528,15121853:18529,15121854:18530,15122051:18531,15122055:18532,15122056:18533,15122059:18534,15122060:18535,15122061:18536,15122064:18537,15122066:18538,15122067:18539,15122068:18540,15122070:18541,15122074:18542,15122079:18543,15122080:18544,15122085:18545,15122086:18546,15122087:18547,15122088:18548,15122094:18549,15122095:18550,15122096:18551,15122101:18552,15122102:18553,15122108:18554,15122309:18555,15122311:18556,15122312:18557,15122314:18558,15122330:18721,15122334:18722,15122344:18723,15122345:18724,15122352:18725,15122357:18726,15122361:18727,15122364:18728,15122365:18729,15171712:18730,15171717:18731,15171718:18732,15171719:18733,15171725:18734,15171735:18735,15171744:18736,15171747:18737,15171759:18738,15171764:18739,15171767:18740,15171769:18741,15171772:18742,15171971:18743,15171972:18744,15171976:18745,15171977:18746,15171978:18747,15171979:18748,15171988:18749,15171989:18750,15171997:18751,15171998:18752,15171982:18753,15172004:18754,15172005:18755,15172012:18756,15172014:18757,15172021:18758,15172022:18759,15172030:18760,15172225:18761,15172229:18762,15172230:18763,15172244:18764,15172245:18765,15172246:18766,15172247:18767,15172248:18768,15172251:18769,15172260:18770,15172267:18771,15172272:18772,15172273:18773,15172276:18774,15172279:18775,15172490:18776,15172497:18777,15172499:18778,15172500:18779,15172501:18780,15172502:18781,15172504:18782,15172508:18783,15172516:18784,15172538:18785,15172739:18786,15172740:18787,15172741:18788,15172742:18789,15172743:18790,15172747:18791,15172748:18792,15172751:18793,15172766:18794,15172768:18795,15172779:18796,15172781:18797,15172783:18798,15172784:18799,15172785:18800,15172792:18801,15172993:18802,15172997:18803,15172998:18804,15172999:18805,15173002:18806,15173003:18807,15173008:18808,15173010:18809,15173015:18810,15173018:18811,15173020:18812,15173022:18813,15173024:18814,15173032:18977,15173049:18978,15173248:18979,15173253:18980,15173255:18981,15173260:18982,15173266:18983,15173274:18984,15173275:18985,15173280:18986,15173282:18987,15173295:18988,15173296:18989,15173298:18990,15173299:18991,15173306:18992,15173311:18993,15173504:18994,15173505:18995,15173508:18996,15173515:18997,15173516:18998,15173523:18999,15173526:19e3,15173529:19001,15173530:19002,15173532:19003,15173560:19004,15173566:19005,15173760:19006,15173767:19007,15173768:19008,15173769:19009,15173779:19010,15173783:19011,15173786:19012,15173789:19013,15173791:19014,15173796:19015,15173803:19016,15173807:19017,15173812:19018,15173816:19019,15173817:19020,15174017:19021,15174018:19022,15174019:19023,15174021:19024,15174030:19025,15174031:19026,15174032:19027,15174035:19028,15174037:19029,15174038:19030,15174042:19031,15174044:19032,15174046:19033,15174048:19034,15174051:19035,15174056:19036,15174059:19037,15174062:19038,15174063:19039,15174065:19040,15174071:19041,15174072:19042,15174075:19043,15174076:19044,15174079:19045,15174276:19046,15174281:19047,15174285:19048,15174286:19049,15174291:19050,15174299:19051,15174312:19052,15174317:19053,15174318:19054,15174321:19055,15174324:19056,15174334:19057,15174529:19058,15174535:19059,15174537:19060,15174540:19061,15174549:19062,15174550:19063,15174552:19064,15174559:19065,15174565:19066,15174579:19067,15174580:19068,15174586:19069,15174587:19070,15174590:19233,15174786:19234,15174788:19235,15174789:19236,15174791:19237,15174795:19238,15174797:19239,15174802:19240,15174803:19241,15174808:19242,15174809:19243,15174814:19244,15174818:19245,15174820:19246,15174823:19247,15174824:19248,15174828:19249,15174833:19250,15174834:19251,15174837:19252,15174842:19253,15174843:19254,15174845:19255,15175043:19256,15175053:19257,15175056:19258,15175058:19259,15175062:19260,15175064:19261,15175069:19262,15175070:19263,15175071:19264,15175072:19265,15175078:19266,15175079:19267,15175081:19268,15175083:19269,15175084:19270,15175086:19271,15175087:19272,15175089:19273,15175095:19274,15175097:19275,15175100:19276,15175296:19277,15175297:19278,15175299:19279,15175301:19280,15175302:19281,15175310:19282,15175312:19283,15175315:19284,15175317:19285,15175319:19286,15175320:19287,15175324:19288,15175326:19289,15175327:19290,15175328:19291,15175330:19292,15175333:19293,15175334:19294,15175338:19295,15175339:19296,15175341:19297,15175349:19298,15175351:19299,15175353:19300,15175356:19301,15175357:19302,15175359:19303,15175557:19304,15175558:19305,15175561:19306,15175563:19307,15175564:19308,15175567:19309,15175570:19310,15175571:19311,15175574:19312,15175577:19313,15175581:19314,15175585:19315,15175587:19316,15175590:19317,15175591:19318,15175593:19319,15175604:19320,15175605:19321,15175607:19322,15175609:19323,15175610:19324,15175611:19325,15175613:19326,15175615:19489,15175808:19490,15175809:19491,15175812:19492,15175815:19493,15175818:19494,15175825:19495,15175834:19496,15175835:19497,15175844:19498,15175846:19499,15175848:19500,15175849:19501,15175850:19502,15175851:19503,15175852:19504,15175853:19505,15175854:19506,15175855:19507,15175856:19508,15175857:19509,15175865:19510,15176064:19511,15176067:19512,15176068:19513,15176070:19514,15176071:19515,15176075:19516,15176077:19517,15176081:19518,15176082:19519,15176087:19520,15176093:19521,15176098:19522,15176102:19523,15176103:19524,15176104:19525,15176107:19526,15176109:19527,15176110:19528,15176113:19529,15176114:19530,15176320:19531,15176321:19532,15176325:19533,15176326:19534,15176327:19535,15176329:19536,15176335:19537,15176336:19538,15176337:19539,15176338:19540,15176344:19541,15176345:19542,15176346:19543,15176348:19544,15176351:19545,15176352:19546,15176353:19547,15176355:19548,15176358:19549,15176360:19550,15176361:19551,15176362:19552,15176363:19553,15176366:19554,15176367:19555,15176369:19556,15176370:19557,15176373:19558,15176377:19559,15176379:19560,15176383:19561,15176584:19562,15176585:19563,15176588:19564,15176592:19565,15176595:19566,15176600:19567,15176602:19568,15176603:19569,15176606:19570,15176607:19571,15176612:19572,15176616:19573,15176618:19574,15176619:19575,15176623:19576,15176628:19577,15176634:19578,15176635:19579,15176636:19580,15176639:19581,15176838:19582,
15176850:19745,15176854:19746,15176855:19747,15176864:19748,15176865:19749,15176868:19750,15176871:19751,15176873:19752,15176874:19753,15176879:19754,15176886:19755,15176889:19756,15176893:19757,15176894:19758,15176895:19759,15177088:19760,15177091:19761,15177095:19762,15177096:19763,15177102:19764,15177104:19765,15177106:19766,15177111:19767,15177118:19768,15177119:19769,15177121:19770,15177135:19771,15177137:19772,15177145:19773,15177146:19774,15177147:19775,15177148:19776,15177149:19777,15177150:19778,15177345:19779,15177349:19780,15177360:19781,15177362:19782,15177363:19783,15177365:19784,15177369:19785,15177372:19786,15177378:19787,15177380:19788,15177396:19789,15177402:19790,15177407:19791,15177600:19792,15177601:19793,15177604:19794,15177606:19795,15177612:19796,15177614:19797,15177615:19798,15177623:19799,15177628:19800,15177631:19801,15177632:19802,15177633:19803,15177636:19804,15177639:19805,15177644:19806,15177646:19807,15177647:19808,15177649:19809,15177657:19810,15177856:19811,15177858:19812,15177859:19813,15177860:19814,15177863:19815,15177864:19816,15177866:19817,15177868:19818,15177871:19819,15177874:19820,15177875:19821,15177877:19822,15177878:19823,15177881:19824,15177883:19825,15177884:19826,15177885:19827,15177886:19828,15177891:19829,15177893:19830,15177894:19831,15177897:19832,15177901:19833,15177906:19834,15177907:19835,15177909:19836,15177912:19837,15177913:19838,15177914:20001,15177916:20002,15178122:20003,15178112:20004,15178113:20005,15178115:20006,15178116:20007,15178117:20008,15178121:20009,15178123:20010,15178133:20011,15178137:20012,15178143:20013,15178148:20014,15178149:20015,15178157:20016,15178158:20017,15178159:20018,15178161:20019,15178164:20020,15178369:20021,15178373:20022,15178380:20023,15178381:20024,15178389:20025,15178395:20026,15178396:20027,15178397:20028,15178399:20029,15178400:20030,15178402:20031,15178403:20032,15178404:20033,15178405:20034,15178406:20035,15178407:20036,15178408:20037,15178410:20038,15178413:20039,15178429:20040,15178625:20041,15178629:20042,15178633:20043,15178635:20044,15178636:20045,15178638:20046,15178644:20047,15178649:20048,15178656:20049,15178662:20050,15178664:20051,15178668:20052,15178672:20053,15178673:20054,15178678:20055,15178681:20056,15178684:20057,15178880:20058,15178886:20059,15178890:20060,15178894:20061,15178898:20062,15178900:20063,15178901:20064,15178903:20065,15178905:20066,15178906:20067,15178908:20068,15178914:20069,15178920:20070,15178925:20071,15178926:20072,15178927:20073,15178932:20074,15178933:20075,15178934:20076,15178937:20077,15178941:20078,15178942:20079,15179138:20080,15179141:20081,15179142:20082,15179146:20083,15179149:20084,15179150:20085,15179151:20086,15179154:20087,15179158:20088,15179159:20089,15179164:20090,15179166:20091,15179167:20092,15179168:20093,15179170:20094,15179172:20257,15179175:20258,15179178:20259,15179180:20260,15179184:20261,15179186:20262,15179187:20263,15179188:20264,15179194:20265,15179197:20266,15179392:20267,15179396:20268,15179404:20269,15179405:20270,15179412:20271,15179413:20272,15179414:20273,15179418:20274,15179423:20275,15179426:20276,15179431:20277,15179434:20278,15179438:20279,15179439:20280,15179441:20281,15179445:20282,15179454:20283,15179651:20284,15179657:20285,15179665:20286,15179666:20287,15179669:20288,15179673:20289,15179678:20290,15179679:20291,15179680:20292,15179684:20293,15179686:20294,15179690:20295,15179692:20296,15179696:20297,15179697:20298,15179700:20299,15179704:20300,15179707:20301,15179909:20302,15179910:20303,15179913:20304,15179917:20305,15179918:20306,15179921:20307,15179933:20308,15179937:20309,15179938:20310,15179939:20311,15179949:20312,15179950:20313,15179952:20314,15179957:20315,15179959:20316,15180163:20317,15180164:20318,15180167:20319,15180168:20320,15180172:20321,15180174:20322,15180178:20323,15180188:20324,15180190:20325,15180192:20326,15180193:20327,15180195:20328,15180196:20329,15180200:20330,15180202:20331,15180206:20332,15180218:20333,15180222:20334,15180426:20335,15180431:20336,15180436:20337,15180440:20338,15180449:20339,15180445:20340,15180446:20341,15180447:20342,15180452:20343,15180456:20344,15180460:20345,15180461:20346,15180464:20347,15180465:20348,15180466:20349,15180467:20350,15180475:20513,15180477:20514,15180479:20515,15180679:20516,15180680:20517,15180681:20518,15180684:20519,15180686:20520,15180690:20521,15180691:20522,15180693:20523,15180694:20524,15180708:20525,15180699:20526,15180703:20527,15180704:20528,15180705:20529,15180710:20530,15180714:20531,15180722:20532,15180723:20533,15180928:20534,15180726:20535,15180727:20536,15180730:20537,15180731:20538,15180735:20539,15180934:20540,15180940:20541,15180944:20542,15180954:20543,15180956:20544,15180958:20545,15180959:20546,15180960:20547,15180965:20548,15180967:20549,15180969:20550,15180973:20551,15180977:20552,15180980:20553,15180981:20554,15180987:20555,15180989:20556,15180991:20557,15181188:20558,15181189:20559,15181190:20560,15181194:20561,15181195:20562,15181199:20563,15181201:20564,15181204:20565,15181208:20566,15181211:20567,15181212:20568,15181223:20569,15181225:20570,15181227:20571,15181234:20572,15181241:20573,15181243:20574,15181244:20575,15181246:20576,15181451:20577,15181452:20578,15181457:20579,15181459:20580,15181460:20581,15181461:20582,15181462:20583,15181464:20584,15181467:20585,15181468:20586,15181473:20587,15181480:20588,15181481:20589,15181483:20590,15181487:20591,15181489:20592,15181492:20593,15181496:20594,15181499:20595,15181698:20596,15181700:20597,15181703:20598,15181704:20599,15181706:20600,15181711:20601,15181716:20602,15181718:20603,15181722:20604,15181725:20605,15181726:20606,15181728:20769,15181730:20770,15181733:20771,15181738:20772,15181739:20773,15181741:20774,15181745:20775,15181752:20776,15181756:20777,15181954:20778,15181955:20779,15181959:20780,15181961:20781,15181962:20782,15181964:20783,15181969:20784,15181973:20785,15181979:20786,15181982:20787,15181985:20788,15181991:20789,15181995:20790,15181997:20791,15181999:20792,15182e3:20793,15182004:20794,15182005:20795,15182008:20796,15182009:20797,15182010:20798,15182212:20799,15182213:20800,15182215:20801,15182216:20802,15182220:20803,15182229:20804,15182230:20805,15182233:20806,15182236:20807,15182237:20808,15182239:20809,15182240:20810,15182245:20811,15182247:20812,15182250:20813,15182253:20814,15182261:20815,15182264:20816,15182270:20817,15182464:20818,15182466:20819,15182469:20820,15182470:20821,15182474:20822,15182475:20823,15182480:20824,15182481:20825,15182484:20826,15182494:20827,15182496:20828,15182499:20829,15182508:20830,15182515:20831,15182517:20832,15182521:20833,15182523:20834,15182524:20835,15182726:20836,15182729:20837,15182732:20838,15182734:20839,15182737:20840,15182747:20841,15182760:20842,15182761:20843,15182763:20844,15182764:20845,15182769:20846,15182772:20847,15182779:20848,15182781:20849,15182782:20850,15182983:20851,15182996:20852,15183007:20853,15183011:20854,15183015:20855,15183017:20856,15183018:20857,15183019:20858,15183021:20859,15183022:20860,15183023:20861,15183024:20862,15183025:21025,15183028:21026,15183037:21027,15183039:21028,15183232:21029,15183233:21030,15183239:21031,15183246:21032,15183253:21033,15183264:21034,15183268:21035,15183270:21036,15183273:21037,15183274:21038,15183277:21039,15183279:21040,15183282:21041,15183283:21042,15183287:21043,15183492:21044,15183497:21045,15183502:21046,15183504:21047,15183505:21048,15183510:21049,15183515:21050,15183518:21051,15183520:21052,15183525:21053,15183532:21054,15183535:21055,15183536:21056,15183538:21057,15183541:21058,15183542:21059,15183546:21060,15183547:21061,15183548:21062,15183549:21063,15183746:21064,15183749:21065,15183752:21066,15183754:21067,15183764:21068,15183766:21069,15183767:21070,15183769:21071,15183770:21072,15183771:21073,15183784:21074,15183786:21075,15183794:21076,15183796:21077,15183797:21078,15183800:21079,15183801:21080,15183802:21081,15183804:21082,15183806:21083,15184001:21084,15184002:21085,15184003:21086,15184004:21087,15184006:21088,
15184009:21089,15184011:21090,15184012:21091,15184014:21092,15184015:21093,15184025:21094,15184027:21095,15184032:21096,15184037:21097,15184038:21098,15184040:21099,15184044:21100,15184049:21101,15184051:21102,15184052:21103,15184054:21104,15184057:21105,15184058:21106,15184262:21107,15184266:21108,15184277:21109,15184273:21110,15184274:21111,15184275:21112,15184281:21113,15184282:21114,15184283:21115,15184284:21116,15184285:21117,15184286:21118,15184289:21281,15184291:21282,15184295:21283,15184297:21284,15184301:21285,15184302:21286,15184304:21287,15184306:21288,15184313:21289,15184316:21290,15184317:21291,15184518:21292,15184519:21293,15184527:21294,15184532:21295,15184542:21296,15184544:21297,15184550:21298,15184560:21299,15184566:21300,15184567:21301,15184570:21302,15184571:21303,15184572:21304,15184575:21305,15184772:21306,15184775:21307,15184776:21308,15184777:21309,15184781:21310,15184783:21311,15184787:21312,15184788:21313,15184789:21314,15184791:21315,15184793:21316,15184794:21317,15184797:21318,15184806:21319,15184809:21320,15184811:21321,15184821:21322,15185027:21323,15185031:21324,15185032:21325,15185033:21326,15185039:21327,15185041:21328,15185042:21329,15185043:21330,15185046:21331,15185053:21332,15185054:21333,15185059:21334,15185062:21335,15185066:21336,15185069:21337,15185073:21338,15185084:21339,15185085:21340,15185086:21341,15185280:21342,15185281:21343,15185287:21344,15185288:21345,15185293:21346,15185297:21347,15185299:21348,15185303:21349,15185305:21350,15185306:21351,15185308:21352,15185309:21353,15185317:21354,15185319:21355,15185322:21356,15185328:21357,15185336:21358,15185338:21359,15185339:21360,15185343:21361,15185537:21362,15185538:21363,15185539:21364,15185541:21365,15185542:21366,15185544:21367,15185547:21368,15185548:21369,15185549:21370,15185553:21371,15185558:21372,15185559:21373,15185565:21374,15185566:21537,15185574:21538,15185575:21539,15185578:21540,15185587:21541,15185590:21542,15185591:21543,15185593:21544,15185794:21545,15185795:21546,15185796:21547,15185797:21548,15185798:21549,15185804:21550,15185805:21551,15185806:21552,15185815:21553,15185817:21554,15186048:21555,15185826:21556,15185829:21557,15185830:21558,15185834:21559,15185835:21560,15185837:21561,15185841:21562,15185845:21563,15185846:21564,15185849:21565,15185850:21566,15186056:21567,15186064:21568,15186065:21569,15186069:21570,15186071:21571,15186076:21572,15186077:21573,15186080:21574,15186087:21575,15186088:21576,15186092:21577,15186093:21578,15186095:21579,15186099:21580,15186102:21581,15186111:21582,15186308:21583,15186309:21584,15186311:21585,15186318:21586,15186320:21587,15186322:21588,15186328:21589,15186335:21590,15186337:21591,15186338:21592,15186341:21593,15186347:21594,15186350:21595,15186351:21596,15186355:21597,15186360:21598,15186366:21599,15186561:21600,15186566:21601,15186567:21602,15186570:21603,15186573:21604,15186577:21605,15186581:21606,15186584:21607,15186586:21608,15186589:21609,15186590:21610,15187132:21611,15187131:21612,15187133:21613,15187134:21614,15187135:21615,15187331:21616,15187332:21617,15187335:21618,15187343:21619,15187346:21620,15187347:21621,15187355:21622,15187356:21623,15187357:21624,15187361:21625,15187363:21626,15187364:21627,15187365:21628,15187366:21629,15187373:21630,15187377:21793,15187389:21794,15187390:21795,15187391:21796,15187584:21797,15187595:21798,15187597:21799,15187599:21800,15187600:21801,15187601:21802,15187606:21803,15187607:21804,15187612:21805,15187617:21806,15187618:21807,15187622:21808,15187626:21809,15187629:21810,15187636:21811,15187644:21812,15187647:21813,15187840:21814,15187843:21815,15187848:21816,15187854:21817,15187855:21818,15187867:21819,15187871:21820,15187875:21821,15187877:21822,15187880:21823,15187884:21824,15187886:21825,15187887:21826,15187890:21827,15187898:21828,15187901:21829,15187902:21830,15187903:21831,15237255:21832,15237256:21833,15237258:21834,15237261:21835,15237262:21836,15237263:21837,15237265:21838,15237267:21839,15237268:21840,15237270:21841,15237277:21842,15237278:21843,15237279:21844,15237280:21845,15237284:21846,15237286:21847,15237292:21848,15237294:21849,15237296:21850,15237300:21851,15237301:21852,15237303:21853,15237305:21854,15237306:21855,15237308:21856,15237310:21857,15237504:21858,15237508:21859,15237536:21860,15237540:21861,15237542:21862,15237549:21863,15237553:21864,15237557:21865,15237761:21866,15237768:21867,15237774:21868,15237788:21869,15237790:21870,15237798:21871,15237799:21872,15237803:21873,15237816:21874,15237817:21875,15238024:21876,15238029:21877,15238031:21878,15238034:21879,15238036:21880,15238037:21881,15238039:21882,15238040:21883,15238048:21884,15238061:21885,15238062:21886,15238064:22049,15238066:22050,15238067:22051,15238070:22052,15238073:22053,15238074:22054,15238078:22055,15238275:22056,15238283:22057,15238294:22058,15238295:22059,15238296:22060,15238300:22061,15238302:22062,15238304:22063,15238308:22064,15238311:22065,15238316:22066,15238320:22067,15238325:22068,15238330:22069,15238332:22070,15238533:22071,15238535:22072,15238538:22073,15238540:22074,15238546:22075,15238551:22076,15238560:22077,15238561:22078,15238567:22079,15238568:22080,15238569:22081,15238573:22082,15238575:22083,15238583:22084,15238785:22085,15238800:22086,15238788:22087,15238789:22088,15238790:22089,15238795:22090,15238798:22091,15238806:22092,15238808:22093,15238811:22094,15238814:22095,15238818:22096,15238830:22097,15238834:22098,15238836:22099,15238843:22100,15239051:22101,15239043:22102,15239045:22103,15239050:22104,15239054:22105,15239055:22106,15239061:22107,15239063:22108,15239067:22109,15239069:22110,15239070:22111,15239073:22112,15239076:22113,15239083:22114,15239084:22115,15239088:22116,15239089:22117,15239090:22118,15239093:22119,15239094:22120,15239096:22121,15239097:22122,15239101:22123,15239103:22124,15239296:22125,15239299:22126,15239311:22127,15239315:22128,15239316:22129,15239321:22130,15239322:22131,15239325:22132,15239329:22133,15239330:22134,15239336:22135,15239346:22136,15239348:22137,15239354:22138,15239555:22139,15239556:22140,15239557:22141,15239558:22142,15239563:22305,15239566:22306,15239567:22307,15239569:22308,15239574:22309,15239580:22310,15239584:22311,15239587:22312,15239591:22313,15239597:22314,15239604:22315,15239611:22316,15239613:22317,15239615:22318,15239808:22319,15239809:22320,15239811:22321,15239812:22322,15239815:22323,15239817:22324,15239818:22325,15239822:22326,15239825:22327,15239828:22328,15239830:22329,15239832:22330,15239834:22331,15239835:22332,15239840:22333,15239841:22334,15239843:22335,15239844:22336,15239847:22337,15239848:22338,15239849:22339,15239850:22340,15239854:22341,15239856:22342,15239858:22343,15239860:22344,15239863:22345,15239866:22346,15239868:22347,15239870:22348,15239871:22349,15240070:22350,15240080:22351,15240085:22352,15240090:22353,15240096:22354,15240098:22355,15240100:22356,15240104:22357,15240106:22358,15240109:22359,15240111:22360,15240118:22361,15240119:22362,15240125:22363,15240126:22364,15240320:22365,15240321:22366,15240327:22367,15240328:22368,15240330:22369,15240331:22370,15240596:22371,15240347:22372,15240349:22373,15240350:22374,15240351:22375,15240353:22376,15240354:22377,15240364:22378,15240365:22379,15240366:22380,15240368:22381,15240371:22382,15240375:22383,15240378:22384,15240380:22385,15240381:22386,15240578:22387,15240579:22388,15240580:22389,15240583:22390,15240589:22391,15240590:22392,15240593:22393,15240597:22394,15240598:22395,15240599:22396,15240624:22397,15240632:22398,15240637:22561,15240639:22562,15240832:22563,15240834:22564,15240836:22565,15240838:22566,15240845:22567,15240850:22568,15240852:22569,15240853:22570,15240856:22571,15240857:22572,15240859:22573,15240860:22574,15240861:22575,15240870:22576,15240871:22577,15240873:22578,15240876:22579,15240894:22580,15240895:22581,15241088:22582,15241095:22583,15241097:22584,15241103:22585,15241104:22586,15241105:22587,15241108:22588,15241117:22589,15240595:22590,15241128:22591,15241130:22592,15241142:22593,15241144:22594,
15241145:22595,15241148:22596,15241345:22597,15241350:22598,15241354:22599,15241359:22600,15241361:22601,15241365:22602,15241369:22603,15240877:22604,15241391:22605,15241401:22606,15241605:22607,15241607:22608,15241608:22609,15241610:22610,15241613:22611,15241615:22612,15241617:22613,15241618:22614,15241622:22615,15241624:22616,15241625:22617,15241626:22618,15241628:22619,15241632:22620,15241636:22621,15241637:22622,15241639:22623,15241642:22624,15241648:22625,15241651:22626,15241652:22627,15241654:22628,15241656:22629,15241660:22630,15241661:22631,15241857:22632,15241861:22633,15241874:22634,15241875:22635,15241877:22636,15241886:22637,15241894:22638,15241896:22639,15241897:22640,15241898:22641,15241903:22642,15241905:22643,15241908:22644,15241914:22645,15241917:22646,15241918:22647,15242112:22648,15242114:22649,15242119:22650,15242120:22651,15242124:22652,15242127:22653,15242131:22654,15242140:22817,15242151:22818,15242154:22819,15242159:22820,15242160:22821,15242161:22822,15242162:22823,15242167:22824,15242418:22825,15242170:22826,15242171:22827,15242173:22828,15242370:22829,15242371:22830,15242375:22831,15242380:22832,15242382:22833,15242384:22834,15242396:22835,15242398:22836,15242402:22837,15242403:22838,15242404:22839,15242405:22840,15242407:22841,15242410:22842,15242411:22843,15242415:22844,15242419:22845,15242420:22846,15242422:22847,15242431:22848,15242630:22849,15242639:22850,15242640:22851,15242641:22852,15242642:22853,15242643:22854,15242646:22855,15242649:22856,15242652:22857,15242653:22858,15242654:22859,15242655:22860,15242656:22861,15242657:22862,15242658:22863,15242660:22864,15242667:22865,15242671:22866,15242681:22867,15242682:22868,15242683:22869,15242685:22870,15242687:22871,15242881:22872,15242885:22873,15242886:22874,15242889:22875,15242891:22876,15242892:22877,15242895:22878,15242899:22879,15242904:22880,15242909:22881,15242911:22882,15242912:22883,15242914:22884,15242917:22885,15242919:22886,15242932:22887,15242934:22888,15242935:22889,15242936:22890,15242940:22891,15242941:22892,15242942:22893,15242943:22894,15243138:22895,15243143:22896,15243146:22897,15243147:22898,15243150:22899,15242925:22900,15243160:22901,15243162:22902,15243167:22903,15243168:22904,15243174:22905,15243176:22906,15243181:22907,15243187:22908,15243190:22909,15243196:22910,15243199:23073,15243392:23074,15243396:23075,15243397:23076,15243405:23077,15243406:23078,15243408:23079,15243409:23080,15243410:23081,15243416:23082,15243417:23083,15243419:23084,15243422:23085,15243425:23086,15243431:23087,15243433:23088,15243446:23089,15243448:23090,15243450:23091,15243452:23092,15243453:23093,15243648:23094,15243650:23095,15243654:23096,15243666:23097,15243667:23098,15243670:23099,15243671:23100,15243672:23101,15243673:23102,15243677:23103,15243680:23104,15243681:23105,15243682:23106,15243683:23107,15243684:23108,15243689:23109,15243692:23110,15243695:23111,15243701:23112,15243702:23113,15243703:23114,15243706:23115,15243917:23116,15243921:23117,15243926:23118,15243928:23119,15243930:23120,15243932:23121,15243937:23122,15243942:23123,15243943:23124,15243944:23125,15243949:23126,15243953:23127,15243955:23128,15243956:23129,15243957:23130,15243959:23131,15243960:23132,15243961:23133,15243967:23134,15244160:23135,15244161:23136,15244163:23137,15244165:23138,15244177:23139,15244178:23140,15244181:23141,15244183:23142,15244186:23143,15244188:23144,15244192:23145,15244195:23146,15244197:23147,15244199:23148,15243912:23149,15244218:23150,15244220:23151,15244221:23152,15244420:23153,15244421:23154,15244423:23155,15244427:23156,15244430:23157,15244431:23158,15244432:23159,15244435:23160,15244436:23161,15244441:23162,15244446:23163,15244447:23164,15244449:23165,15244451:23166,15244456:23329,15244462:23330,15244463:23331,15244465:23332,15244466:23333,15244473:23334,15244474:23335,15244476:23336,15244477:23337,15244478:23338,15244672:23339,15244675:23340,15244677:23341,15244685:23342,15244696:23343,15244701:23344,15244705:23345,15244708:23346,15244709:23347,15244719:23348,15244721:23349,15244722:23350,15244731:23351,15244931:23352,15244932:23353,15244933:23354,15244934:23355,15244935:23356,15244936:23357,15244937:23358,15244939:23359,15244940:23360,15244944:23361,15244947:23362,15244949:23363,15244951:23364,15244952:23365,15244953:23366,15244958:23367,15244960:23368,15244963:23369,15244967:23370,15244972:23371,15244973:23372,15244974:23373,15244977:23374,15244981:23375,15244990:23376,15244991:23377,15245185:23378,15245192:23379,15245193:23380,15245194:23381,15245198:23382,15245205:23383,15245206:23384,15245209:23385,15245210:23386,15245212:23387,15245215:23388,15245218:23389,15245219:23390,15245220:23391,15245226:23392,15245227:23393,15245229:23394,15245233:23395,15245235:23396,15245240:23397,15245242:23398,15245247:23399,15245441:23400,15245443:23401,15245446:23402,15245449:23403,15245450:23404,15245451:23405,15245456:23406,15245465:23407,15245458:23408,15245459:23409,15245460:23410,15245464:23411,15245466:23412,15245467:23413,15245468:23414,15245470:23415,15245471:23416,15245480:23417,15245485:23418,15245486:23419,15245488:23420,15245490:23421,15245493:23422,15245498:23585,15245500:23586,15245697:23587,15245699:23588,15245701:23589,15245704:23590,15245705:23591,15245706:23592,15245707:23593,15245710:23594,15245713:23595,15245717:23596,15245718:23597,15245720:23598,15245722:23599,15245724:23600,15245727:23601,15245728:23602,15245732:23603,15245737:23604,15245745:23605,15245753:23606,15245755:23607,15245952:23608,15245976:23609,15245978:23610,15245979:23611,15245980:23612,15245983:23613,15245984:23614,15245992:23615,15245994:23616,15246010:23617,15246013:23618,15246014:23619,15246208:23620,15246218:23621,15246219:23622,15246220:23623,15246221:23624,15246222:23625,15246225:23626,15246226:23627,15246227:23628,15246235:23629,15246238:23630,15246247:23631,15246255:23632,15246256:23633,15246257:23634,15246261:23635,15246263:23636,15246465:23637,15246470:23638,15246477:23639,15246478:23640,15246479:23641,15246485:23642,15246486:23643,15246488:23644,15246489:23645,15246490:23646,15246492:23647,15246496:23648,15246502:23649,15246503:23650,15246504:23651,15246512:23652,15246513:23653,15246514:23654,15246517:23655,15246521:23656,15246522:23657,15246526:23658,15246720:23659,15246722:23660,15246725:23661,15246726:23662,15246729:23663,15246735:23664,15246738:23665,15246743:23666,15246746:23667,15246747:23668,15246748:23669,15246753:23670,15246754:23671,15246755:23672,15246763:23673,15246766:23674,15246768:23675,15246771:23676,15246773:23677,15246778:23678,15246779:23841,15246780:23842,15246781:23843,15246985:23844,15246989:23845,15246992:23846,15246996:23847,15246997:23848,15247003:23849,15247004:23850,15247007:23851,15247008:23852,15247013:23853,15247024:23854,15247028:23855,15247029:23856,15247030:23857,15247031:23858,15247036:23859,15247252:23860,15247253:23861,15247254:23862,15247255:23863,15247256:23864,15247269:23865,15247273:23866,15247275:23867,15247277:23868,15247281:23869,15247283:23870,15247286:23871,15247289:23872,15247293:23873,15247295:23874,15247492:23875,15247493:23876,15247495:23877,15247503:23878,15247505:23879,15247506:23880,15247508:23881,15247509:23882,15247518:23883,15247520:23884,15247522:23885,15247524:23886,15247526:23887,15247531:23888,15247532:23889,15247535:23890,15247541:23891,15247543:23892,15247549:23893,15247550:23894,15247744:23895,15247747:23896,15247749:23897,15247751:23898,15247753:23899,15247757:23900,15247758:23901,15247763:23902,15247766:23903,15247767:23904,15247768:23905,15247772:23906,15247773:23907,15247777:23908,15247781:23909,15247783:23910,15247797:23911,15247798:23912,15247799:23913,15247801:23914,15247802:23915,15247803:23916,15247806:23917,15247807:23918,15248e3:23919,15248003:23920,15248006:23921,15248011:23922,15248015:23923,15248016:23924,15248018:23925,15248022:23926,15248023:23927,15248025:23928,15248031:23929,15248039:23930,15248041:23931,15248046:23932,15248047:23933,15248051:23934,15248054:24097,15248055:24098,15248059:24099,15248062:24100,
15248259:24101,15248262:24102,15248264:24103,15248265:24104,15248266:24105,15248273:24106,15248275:24107,15248276:24108,15248277:24109,15248279:24110,15248285:24111,15248287:24112,15248300:24113,15248304:24114,15248308:24115,15248309:24116,15248310:24117,15248316:24118,15248319:24119,15248517:24120,15248518:24121,15248523:24122,15248529:24123,15248540:24124,15248542:24125,15248543:24126,15248522:24127,15248557:24128,15248560:24129,15248567:24130,15248572:24131,15248770:24132,15248771:24133,15248772:24134,15248773:24135,15248774:24136,15248776:24137,15248786:24138,15248787:24139,15248788:24140,15248793:24141,15248781:24142,15248798:24143,15248803:24144,15248813:24145,15248822:24146,15248824:24147,15248825:24148,15248828:24149,15248830:24150,15249025:24151,15249028:24152,15249029:24153,15249035:24154,15249037:24155,15249039:24156,15249044:24157,15249045:24158,15249052:24159,15249054:24160,15249055:24161,15249592:24162,15249593:24163,15249597:24164,15249598:24165,15249797:24166,15249799:24167,15249801:24168,15249803:24169,15249807:24170,15249809:24171,15249811:24172,15249812:24173,15249815:24174,15249816:24175,15249819:24176,15249821:24177,15249817:24178,15249827:24179,15249828:24180,15249830:24181,15249832:24182,15249833:24183,15249837:24184,15249843:24185,15249845:24186,15249846:24187,15249851:24188,15249854:24189,15250054:24190,15250055:24353,15250059:24354,15250064:24355,15250066:24356,15250067:24357,15250073:24358,15250075:24359,15250076:24360,15250084:24361,15250105:24362,15250106:24363,15250309:24364,15250310:24365,15250313:24366,15250315:24367,15250319:24368,15250326:24369,15250325:24370,15250329:24371,15250333:24372,15250337:24373,15250344:24374,15250348:24375,15250351:24376,15250352:24377,15250354:24378,15250357:24379,15250359:24380,15250360:24381,15250366:24382,15250367:24383,15250561:24384,15250563:24385,15250569:24386,15250578:24387,15250583:24388,15250587:24389,15250853:24390,15250857:24391,15250860:24392,15250862:24393,15250879:24394,15251074:24395,15251076:24396,15251080:24397,15251085:24398,15251088:24399,15251089:24400,15251093:24401,15251102:24402,15251103:24403,15251104:24404,15251110:24405,15251115:24406,15251116:24407,15251119:24408,15251122:24409,15251125:24410,15251127:24411,15251129:24412,15251131:24413,15251328:24414,15251333:24415,15251334:24416,15251335:24417,15251336:24418,15251338:24419,15251342:24420,15251345:24421,15251348:24422,15251349:24423,15251351:24424,15251353:24425,15251364:24426,15251365:24427,15251367:24428,15251372:24429,15251376:24430,15251132:24431,15251377:24432,15251378:24433,15251380:24434,15251389:24435,15251585:24436,15251588:24437,15251589:24438,15251590:24439,15251595:24440,15251601:24441,15251604:24442,15251606:24443,15251616:24444,15251617:24445,15251618:24446,15251619:24609,15251622:24610,15251623:24611,15251633:24612,15251635:24613,15251638:24614,15251639:24615,15251640:24616,15251641:24617,15251645:24618,15251840:24619,15251841:24620,15251851:24621,15251853:24622,15251854:24623,15251855:24624,15251860:24625,15251867:24626,15251868:24627,15251869:24628,15251870:24629,15251873:24630,15251874:24631,15251881:24632,15251884:24633,15251885:24634,15251887:24635,15251888:24636,15251889:24637,15251897:24638,15251898:24639,15251899:24640,15252098:24641,15252099:24642,15252105:24643,15252112:24644,15252114:24645,15252117:24646,15252122:24647,15252123:24648,15252125:24649,15252126:24650,15252130:24651,15252135:24652,15252137:24653,15252141:24654,15252142:24655,15252147:24656,15252149:24657,15252154:24658,15252155:24659,15252352:24660,15252353:24661,15252355:24662,15252356:24663,15252359:24664,15252367:24665,15252369:24666,15252372:24667,15252380:24668,15252392:24669,15252398:24670,15252400:24671,15252401:24672,15252407:24673,15252409:24674,15252410:24675,15252397:24676,15252608:24677,15252610:24678,15252615:24679,15252616:24680,15252623:24681,15252624:24682,15252630:24683,15252631:24684,15252632:24685,15252638:24686,15252640:24687,15252641:24688,15252643:24689,15252645:24690,15252647:24691,15252648:24692,15252652:24693,15252653:24694,15252654:24695,15252660:24696,15252661:24697,15252662:24698,15252663:24699,15252666:24700,15252864:24701,15252865:24702,15252867:24865,15252871:24866,15252879:24867,15252881:24868,15252882:24869,15252883:24870,15252884:24871,15252885:24872,15252888:24873,15252893:24874,15252894:24875,15252901:24876,15253149:24877,15253152:24878,15253153:24879,15253156:24880,15253157:24881,15253158:24882,15253173:24883,15253174:24884,15253176:24885,15253182:24886,15253376:24887,15253377:24888,15253382:24889,15253386:24890,15253387:24891,15253389:24892,15253392:24893,15253394:24894,15253395:24895,15253397:24896,15253408:24897,15253411:24898,15253412:24899,15253416:24900,15253422:24901,15253425:24902,15253429:24903,15253430:24904,15253435:24905,15253438:24906,15302786:24907,15302788:24908,15302792:24909,15302796:24910,15302808:24911,15302811:24912,15302824:24913,15302825:24914,15302831:24915,15302826:24916,15302828:24917,15302829:24918,15302835:24919,15302836:24920,15302839:24921,15302847:24922,15303043:24923,15303044:24924,15303052:24925,15303067:24926,15303069:24927,15303074:24928,15303078:24929,15303079:24930,15303084:24931,15303088:24932,15303092:24933,15303097:24934,15303301:24935,15303304:24936,15303307:24937,15303308:24938,15303310:24939,15303312:24940,15303317:24941,15303319:24942,15303320:24943,15303321:24944,15303323:24945,15303328:24946,15303329:24947,15303330:24948,15303333:24949,15303344:24950,15303346:24951,15303347:24952,15303348:24953,15303350:24954,15303357:24955,15303564:24956,15303358:24957,15303555:24958,15303556:25121,15303557:25122,15303559:25123,15303560:25124,15303573:25125,15303575:25126,15303576:25127,15303577:25128,15303580:25129,15303581:25130,15303583:25131,15303589:25132,15303570:25133,15303606:25134,15303595:25135,15303599:25136,15303600:25137,15303604:25138,15303614:25139,15303615:25140,15303808:25141,15303812:25142,15303813:25143,15303814:25144,15303816:25145,15303821:25146,15303824:25147,15303828:25148,15303830:25149,15303831:25150,15303832:25151,15303834:25152,15303836:25153,15303838:25154,15303840:25155,15303845:25156,15303842:25157,15303843:25158,15303847:25159,15303849:25160,15303854:25161,15303855:25162,15303857:25163,15303860:25164,15303862:25165,15303863:25166,15303865:25167,15303866:25168,15303868:25169,15303869:25170,15304067:25171,15304071:25172,15304072:25173,15304079:25174,15304083:25175,15304087:25176,15304089:25177,15304090:25178,15304091:25179,15304097:25180,15304100:25181,15304103:25182,15304109:25183,15304116:25184,15304121:25185,15304122:25186,15304123:25187,15304321:25188,15304323:25189,15304325:25190,15304326:25191,15304330:25192,15304334:25193,15304337:25194,15304339:25195,15304340:25196,15304341:25197,15304344:25198,15304350:25199,15304353:25200,15304358:25201,15304360:25202,15304364:25203,15304365:25204,15304366:25205,15304368:25206,15304369:25207,15304370:25208,15304371:25209,15304374:25210,15304379:25211,15304380:25212,15304381:25213,15304383:25214,15304578:25377,15304579:25378,15304581:25379,15304595:25380,15304596:25381,15304599:25382,15304601:25383,15304602:25384,15304606:25385,15304612:25386,15304613:25387,15304617:25388,15304618:25389,15304620:25390,15304621:25391,15304622:25392,15304623:25393,15304624:25394,15304625:25395,15304631:25396,15304633:25397,15304635:25398,15304637:25399,15304832:25400,15304833:25401,15304836:25402,15304837:25403,15304838:25404,15304839:25405,15304841:25406,15304842:25407,15304844:25408,15304848:25409,15304850:25410,15304851:25411,15304854:25412,15304856:25413,15304860:25414,15304861:25415,15304867:25416,15304868:25417,15304869:25418,15304870:25419,15304872:25420,15304878:25421,15304879:25422,15304880:25423,15304883:25424,15304885:25425,15304886:25426,15304888:25427,15304889:25428,15304890:25429,15304892:25430,15304894:25431,15305088:25432,15305090:25433,15305091:25434,15305094:25435,15305095:25436,15305098:25437,15305101:25438,15305102:25439,15305103:25440,15305105:25441,15305112:25442,15305113:25443,15305116:25444,
15305117:25445,15305120:25446,15305121:25447,15305125:25448,15305127:25449,15305128:25450,15305129:25451,15305134:25452,15305135:25453,15305136:25454,15305141:25455,15305142:25456,15305143:25457,15305144:25458,15305145:25459,15305147:25460,15305148:25461,15305149:25462,15305151:25463,15305352:25464,15305353:25465,15305354:25466,15305357:25467,15305358:25468,15305362:25469,15305367:25470,15305369:25633,15305375:25634,15305376:25635,15305380:25636,15305381:25637,15305383:25638,15305384:25639,15305387:25640,15305391:25641,15305394:25642,15305398:25643,15305400:25644,15305402:25645,15305403:25646,15305404:25647,15305405:25648,15305407:25649,15305600:25650,15305601:25651,15305602:25652,15305603:25653,15305605:25654,15305606:25655,15305607:25656,15305608:25657,15305611:25658,15305612:25659,15305613:25660,15305614:25661,15305616:25662,15305619:25663,15305621:25664,15305623:25665,15305624:25666,15305625:25667,15305628:25668,15305629:25669,15305631:25670,15305632:25671,15305633:25672,15305635:25673,15305637:25674,15305639:25675,15305640:25676,15305644:25677,15305646:25678,15305648:25679,15305657:25680,15305659:25681,15305663:25682,15305856:25683,15305858:25684,15305864:25685,15305869:25686,15305873:25687,15305876:25688,15305877:25689,15305884:25690,15305885:25691,15305886:25692,15305887:25693,15305889:25694,15305892:25695,15305893:25696,15305895:25697,15305897:25698,15305898:25699,15305907:25700,15305908:25701,15305910:25702,15305911:25703,15306119:25704,15306120:25705,15306121:25706,15306128:25707,15306129:25708,15306130:25709,15306133:25710,15306135:25711,15306136:25712,15306138:25713,15306142:25714,15306148:25715,15306149:25716,15306151:25717,15306153:25718,15306154:25719,15306157:25720,15306159:25721,15306160:25722,15306161:25723,15306163:25724,15306164:25725,15306166:25726,15306170:25889,15306173:25890,15306175:25891,15306368:25892,15306369:25893,15306370:25894,15306376:25895,15306378:25896,15306379:25897,15306381:25898,15306383:25899,15306386:25900,15306389:25901,15306392:25902,15306395:25903,15306398:25904,15306401:25905,15306403:25906,15306404:25907,15306406:25908,15306408:25909,15306411:25910,15306420:25911,15306421:25912,15306422:25913,15306426:25914,15306409:25915,15306625:25916,15306628:25917,15306629:25918,15306630:25919,15306631:25920,15306633:25921,15306634:25922,15306635:25923,15306636:25924,15306637:25925,15306643:25926,15306649:25927,15306652:25928,15306654:25929,15306655:25930,15306658:25931,15306662:25932,15306663:25933,15306681:25934,15306679:25935,15306680:25936,15306682:25937,15306683:25938,15306685:25939,15306881:25940,15306882:25941,15306884:25942,15306888:25943,15306889:25944,15306893:25945,15306894:25946,15306895:25947,15306901:25948,15306902:25949,15306903:25950,15306911:25951,15306926:25952,15306927:25953,15306929:25954,15306930:25955,15306931:25956,15306932:25957,15306939:25958,15306943:25959,15306941:25960,15307139:25961,15307141:25962,15307144:25963,15307146:25964,15307148:25965,15307157:25966,15307161:25967,15307164:25968,15307167:25969,15307169:25970,15307171:25971,15307176:25972,15307179:25973,15307181:25974,15307182:25975,15307183:25976,15307185:25977,15307186:25978,15307396:25979,15307395:25980,15308216:25981,15308217:25982,15308222:26145,15308420:26146,15308424:26147,15308428:26148,15308429:26149,15308430:26150,15308445:26151,15308446:26152,15308447:26153,15308449:26154,15308454:26155,15308457:26156,15308459:26157,15308460:26158,15308468:26159,15308470:26160,15308474:26161,15308477:26162,15308479:26163,15308678:26164,15308680:26165,15308681:26166,15308683:26167,15308688:26168,15308689:26169,15308690:26170,15308691:26171,15308697:26172,15308698:26173,15308701:26174,15308702:26175,15308703:26176,15308704:26177,15308708:26178,15308710:26179,15308957:26180,15308958:26181,15308962:26182,15308964:26183,15308965:26184,15308966:26185,15308972:26186,15308977:26187,15308979:26188,15308983:26189,15308984:26190,15308985:26191,15308986:26192,15308988:26193,15308989:26194,15309185:26195,15309202:26196,15309204:26197,15309206:26198,15309207:26199,15309208:26200,15309217:26201,15309230:26202,15309236:26203,15309243:26204,15309244:26205,15309246:26206,15309247:26207,15309441:26208,15309442:26209,15309443:26210,15309444:26211,15309449:26212,15309457:26213,15309462:26214,15309466:26215,15309469:26216,15309471:26217,15309476:26218,15309477:26219,15309478:26220,15309481:26221,15309486:26222,15309487:26223,15309491:26224,15309498:26225,15309706:26226,15309714:26227,15054514:26228,15309720:26229,15309722:26230,15309725:26231,15309726:26232,15309727:26233,15309737:26234,15309743:26235,15309745:26236,15309754:26237,15309954:26238,15309955:26401,15309957:26402,15309961:26403,15309978:26404,15309979:26405,15309981:26406,15309985:26407,15309986:26408,15309987:26409,15309992:26410,15310001:26411,15310003:26412,15310209:26413,15310211:26414,15310218:26415,15310222:26416,15310223:26417,15310229:26418,15310231:26419,15310232:26420,15310234:26421,15310235:26422,15310243:26423,15310247:26424,15310250:26425,15310254:26426,15310259:26427,15310262:26428,15310263:26429,15310264:26430,15310267:26431,15310269:26432,15310271:26433,15310464:26434,15310473:26435,15310485:26436,15310486:26437,15310487:26438,15310489:26439,15310490:26440,15310494:26441,15310495:26442,15310498:26443,15310508:26444,15310510:26445,15310513:26446,15310514:26447,15310517:26448,15310518:26449,15310520:26450,15310521:26451,15310522:26452,15310524:26453,15310526:26454,15310527:26455,15310721:26456,15310724:26457,15310725:26458,15310727:26459,15310729:26460,15310730:26461,15310732:26462,15310733:26463,15310734:26464,15310736:26465,15310737:26466,15310740:26467,15310743:26468,15310744:26469,15310745:26470,15310749:26471,15310750:26472,15310752:26473,15310747:26474,15310753:26475,15310756:26476,15310767:26477,15310769:26478,15310772:26479,15310775:26480,15310776:26481,15310778:26482,15310983:26483,15310986:26484,15311001:26485,15310989:26486,15310990:26487,15310996:26488,15310998:26489,15311004:26490,15311006:26491,15311008:26492,15311011:26493,15311014:26494,15311019:26657,15311022:26658,15311023:26659,15311024:26660,15311026:26661,15311027:26662,15311029:26663,15311013:26664,15311038:26665,15311236:26666,15311239:26667,15311242:26668,15311249:26669,15311250:26670,15311251:26671,15311254:26672,15311255:26673,15311257:26674,15311258:26675,15311266:26676,15311267:26677,15311269:26678,15311270:26679,15311274:26680,15311276:26681,15311531:26682,15311533:26683,15311534:26684,15311536:26685,15311540:26686,15311543:26687,15311544:26688,15311546:26689,15311547:26690,15311551:26691,15311746:26692,15311749:26693,15311752:26694,15311756:26695,15311777:26696,15311779:26697,15311781:26698,15311782:26699,15311783:26700,15311786:26701,15311795:26702,15311798:26703,15312002:26704,15312007:26705,15312008:26706,15312017:26707,15312021:26708,15312022:26709,15312023:26710,15312026:26711,15312027:26712,15312028:26713,15312031:26714,15312034:26715,15312038:26716,15312039:26717,15312043:26718,15312049:26719,15312050:26720,15312051:26721,15312052:26722,15312053:26723,15312057:26724,15312058:26725,15312059:26726,15312060:26727,15312256:26728,15312257:26729,15312262:26730,15312263:26731,15312264:26732,15312269:26733,15312270:26734,15312276:26735,15312280:26736,15312281:26737,15312283:26738,15312284:26739,15312286:26740,15312287:26741,15312288:26742,15312539:26743,15312541:26744,15312543:26745,15312550:26746,15312560:26747,15312561:26748,15312562:26749,15312565:26750,15312569:26913,15312570:26914,15312573:26915,15312575:26916,15312771:26917,15312777:26918,15312787:26919,15312788:26920,15312793:26921,15312794:26922,15312796:26923,15312798:26924,15312807:26925,15312810:26926,15312811:26927,15312812:26928,15312816:26929,15312820:26930,15312821:26931,15312825:26932,15312829:26933,15312830:26934,15313026:26935,15313027:26936,15313028:26937,15313035:26938,15313036:26939,15313040:26940,15313041:26941,15313046:26942,15313054:26943,15313056:26944,15313058:26945,15313059:26946,15313060:26947,15313063:26948,15313069:26949,15313070:26950,
15313075:26951,15313077:26952,15313078:26953,15313080:26954,15313287:26955,15313281:26956,15313284:26957,15313290:26958,15313291:26959,15313292:26960,15313294:26961,15313297:26962,15313300:26963,15313302:26964,15313309:26965,15313578:26966,15313580:26967,15313582:26968,15313583:26969,15313586:26970,15313588:26971,15313589:26972,15313590:26973,15313593:26974,15313595:26975,15313598:26976,15313599:26977,15313793:26978,15313795:26979,15313798:26980,15313800:26981,15313806:26982,15313808:26983,15313810:26984,15313813:26985,15313814:26986,15313815:26987,15313819:26988,15313820:26989,15313824:26990,15313828:26991,15313829:26992,15313831:26993,15313833:26994,15313836:26995,15313842:26996,15313843:26997,15313845:26998,15313849:26999,15313850:27e3,15313853:27001,15313855:27002,15314048:27003,15314049:27004,15314050:27005,15314051:27006,15314052:27169,15314053:27170,15314056:27171,15314057:27172,15314059:27173,15314060:27174,15314061:27175,15314062:27176,15314064:27177,15314066:27178,15314070:27179,15314073:27180,15314075:27181,15314076:27182,15314080:27183,15314086:27184,15314091:27185,15314093:27186,15314099:27187,15314100:27188,15314101:27189,15314103:27190,15314105:27191,15314106:27192,15314109:27193,15314312:27194,15314315:27195,15314316:27196,15314325:27197,15314326:27198,15314327:27199,15314331:27200,15314334:27201,15314337:27202,15314339:27203,15314341:27204,15314342:27205,15314344:27206,15314346:27207,15314347:27208,15314348:27209,15314349:27210,15314350:27211,15314355:27212,15314357:27213,15314359:27214,15314360:27215,15314361:27216,15314367:27217,15314560:27218,15314564:27219,15314565:27220,15314566:27221,15314567:27222,15314569:27223,15314570:27224,15314571:27225,15314573:27226,15314575:27227,15314576:27228,15314580:27229,15314586:27230,15314589:27231,15314590:27232,15314598:27233,15314599:27234,15314601:27235,15314604:27236,15314608:27237,15314609:27238,15314610:27239,15314615:27240,15314616:27241,15314619:27242,15314620:27243,15314622:27244,15314623:27245,15314817:27246,15314823:27247,15314824:27248,15314830:27249,15314832:27250,15314839:27251,15314840:27252,15314845:27253,15314847:27254,15314853:27255,15314855:27256,15314858:27257,15314859:27258,15314863:27259,15314867:27260,15314871:27261,15314872:27262,15314873:27425,15314874:27426,15314877:27427,15314879:27428,15315072:27429,15315074:27430,15315083:27431,15315087:27432,15315089:27433,15315094:27434,15315096:27435,15315097:27436,15315098:27437,15315100:27438,15315102:27439,15315106:27440,15315107:27441,15315110:27442,15315111:27443,15315112:27444,15315113:27445,15315114:27446,15315121:27447,15315125:27448,15315126:27449,15315127:27450,15315133:27451,15315329:27452,15315331:27453,15315332:27454,15315333:27455,15315337:27456,15315338:27457,15315342:27458,15315343:27459,15315344:27460,15315347:27461,15315348:27462,15315350:27463,15315352:27464,15315355:27465,15315357:27466,15315358:27467,15315359:27468,15315363:27469,15315369:27470,15315370:27471,15315356:27472,15315371:27473,15315368:27474,15315374:27475,15315376:27476,15315378:27477,15315381:27478,15315383:27479,15315387:27480,15315878:27481,15315890:27482,15315895:27483,15315897:27484,15316107:27485,15316098:27486,15316113:27487,15316119:27488,15316120:27489,15316124:27490,15316125:27491,15316126:27492,15316143:27493,15316144:27494,15316146:27495,15316147:27496,15316148:27497,15316154:27498,15316156:27499,15316357:27500,15316157:27501,15316354:27502,15316355:27503,15316359:27504,15316362:27505,15316371:27506,15316372:27507,15316383:27508,15316387:27509,15316386:27510,15316389:27511,15316393:27512,15316394:27513,15316395:27514,15316400:27515,15316406:27516,15316407:27517,15316411:27518,15316412:27681,15316414:27682,15316611:27683,15316612:27684,15316614:27685,15316618:27686,15316621:27687,15316622:27688,15316626:27689,15316627:27690,15316629:27691,15316630:27692,15316631:27693,15316632:27694,15316641:27695,15316650:27696,15316652:27697,15316654:27698,15316657:27699,15316661:27700,15316665:27701,15316668:27702,15316671:27703,15316867:27704,15316871:27705,15316873:27706,15316874:27707,15316884:27708,15316885:27709,15316886:27710,15316887:27711,15316890:27712,15316894:27713,15316895:27714,15316896:27715,15316901:27716,15316903:27717,15316905:27718,15316907:27719,15316910:27720,15316912:27721,15316915:27722,15316916:27723,15316926:27724,15317130:27725,15317122:27726,15317127:27727,15317134:27728,15317136:27729,15317137:27730,15317138:27731,15317141:27732,15317142:27733,15317145:27734,15317148:27735,15317149:27736,15317434:27737,15317435:27738,15317436:27739,15317632:27740,15317634:27741,15317635:27742,15317636:27743,15317637:27744,15317639:27745,15317646:27746,15317647:27747,15317654:27748,15317656:27749,15317659:27750,15317662:27751,15317668:27752,15317672:27753,15317676:27754,15317678:27755,15317679:27756,15317680:27757,15317683:27758,15317684:27759,15317685:27760,15317894:27761,15317896:27762,15317899:27763,15317909:27764,15317919:27765,15317924:27766,15317927:27767,15317932:27768,15317933:27769,15317934:27770,15317936:27771,15317937:27772,15317938:27773,15317941:27774,15317944:27937,15317951:27938,15318146:27939,15318147:27940,15318153:27941,15318159:27942,15318160:27943,15318161:27944,15318162:27945,15318164:27946,15318166:27947,15318167:27948,15318169:27949,15318170:27950,15318171:27951,15318175:27952,15318178:27953,15318182:27954,15318186:27955,15318187:27956,15318191:27957,15318193:27958,15318194:27959,15318196:27960,15318199:27961,15318201:27962,15318202:27963,15318204:27964,15318205:27965,15318207:27966,15318401:27967,15318403:27968,15318404:27969,15318405:27970,15318406:27971,15318407:27972,15318419:27973,15318421:27974,15318422:27975,15318423:27976,15318424:27977,15318426:27978,15318429:27979,15318430:27980,15318440:27981,15318441:27982,15318445:27983,15318446:27984,15318447:27985,15318448:27986,15318449:27987,15318451:27988,15318453:27989,15318458:27990,15318461:27991,15318671:27992,15318672:27993,15318673:27994,15318674:27995,15318676:27996,15318678:27997,15318679:27998,15318686:27999,15318689:28e3,15318690:28001,15318691:28002,15318693:28003,14909596:8513},Ya=null,Za=null,$a={12289:65380,12290:65377,12300:65378,12301:65379,12443:65438,12444:65439,12449:65383,12450:65393,12451:65384,12452:65394,12453:65385,12454:65395,12455:65386,12456:65396,12457:65387,12458:65397,12459:65398,12461:65399,12463:65400,12465:65401,12467:65402,12469:65403,12471:65404,12473:65405,12475:65406,12477:65407,12479:65408,12481:65409,12483:65391,12484:65410,12486:65411,12488:65412,12490:65413,12491:65414,12492:65415,12493:65416,12494:65417,12495:65418,12498:65419,12501:65420,12504:65421,12507:65422,12510:65423,12511:65424,12512:65425,12513:65426,12514:65427,12515:65388,12516:65428,12517:65389,12518:65429,12519:65390,12520:65430,12521:65431,12522:65432,12523:65433,12524:65434,12525:65435,12527:65436,12530:65382,12531:65437,12539:65381,12540:65392},_a={12532:65395,12535:65436,12538:65382},ab=[65438,65439],bb=[12290,12300,12301,12289,12539,12530,12449,12451,12453,12455,12457,12515,12517,12519,12483,12540,12450,12452,12454,12456,12458,12459,12461,12463,12465,12467,12469,12471,12473,12475,12477,12479,12481,12484,12486,12488,12490,12491,12492,12493,12494,12495,12498,12501,12504,12507,12510,12511,12512,12513,12514,12516,12518,12520,12521,12522,12523,12524,12525,12527,12531,12443,12444];return Qa});
//# sourceMappingURL=encoding.mapjs/extras/quicklook.googledocs.min.js000064400000003047151215013410013730 0ustar00!function(e,n){"function"==typeof define&&define.amd?define(["elfinder"],n):"undefined"!=typeof exports?module.exports=n(require("elfinder")):n(e.elFinder)}(this,function(e){"use strict";try{e.prototype.commands.quicklook.plugins||(e.prototype.commands.quicklook.plugins=[]),e.prototype.commands.quicklook.plugins.push(function(e){var n=e.fm,o=e.preview;o.on("update",function(i){var r,a,t=(e.window,i.file);0===t.mime.indexOf("application/vnd.google-apps.")&&("1"==t.url&&(o.hide(),$('<div class="elfinder-quicklook-info-data"><button class="elfinder-info-button">'+n.i18n("getLink")+"</button></div>").appendTo(e.info.find(".elfinder-quicklook-info")).on("click",function(){$(this).html('<span class="elfinder-spinner">'),n.request({data:{cmd:"url",target:t.hash},preventDefault:!0}).always(function(){o.show(),$(this).html("")}).done(function(i){var r=n.file(t.hash);e.value.url=r.url=i.url||"",e.value.url&&o.trigger($.Event("update",{file:e.value}))})})),""!==t.url&&"1"!=t.url&&(i.stopImmediatePropagation(),a=$('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+n.i18n("nowLoading")+'</span><span class="elfinder-spinner"></span></div>').appendTo(e.info.find(".elfinder-quicklook-info")),r=$('<iframe class="elfinder-quicklook-preview-iframe"></iframe>').css("background-color","transparent").on("load",function(){e.hideinfo(),a.remove(),r.css("background-color","#fff")}).on("error",function(){a.remove(),r.remove()}).appendTo(o).attr("src",n.url(t.hash)),o.one("change",function(){a.remove(),r.off("load").remove()})))})})}catch(n){}});js/extras/editors.default.min.js000064400000131667151215013410012711 0ustar00!function(e,t){if("function"==typeof define&&define.amd)define(["elfinder"],e);else if(t){var i=t.prototype._options.commandsOptions.edit.editors;t.prototype._options.commandsOptions.edit.editors=i.concat(e(t))}}(function(e){"use strict";var t,i=window.location.search.match(/getfile=([a-z]+)/),n=e.prototype.hasRequire,o={bmp:"image/x-ms-bmp",dng:"image/x-adobe-dng",gif:"image/gif",jpeg:"image/jpeg",jpg:"image/jpeg",pdf:"application/pdf",png:"image/png",ppm:"image/x-portable-pixmap",psd:"image/vnd.adobe.photoshop",pxd:"image/x-pixlr-data",svg:"image/svg+xml",tiff:"image/tiff",webp:"image/webp",xcf:"image/x-xcf",sketch:"application/x-sketch",ico:"image/x-icon",dds:"image/vnd-ms.dds",emf:"application/x-msmetafile"},a=function(e,i,n){t||(t=i.arrayFlip(o));var a=t[e]||i.mimeTypes[e];return n?"jpg"===a&&(a="jpeg"):"jpeg"===a&&(a="jpg"),a},r=function(e,t){var i=$.Deferred();try{var n=document.createElement("canvas"),o=n.getContext("2d"),a=new Image,r=function(){var e,o,a=n.toDataURL(t);e=(o=a.match(/^data:([a-z0-9]+\/[a-z0-9.+-]+)/i))?o[1]:"",e.toLowerCase()===t.toLowerCase()?i.resolve(n.toDataURL(t),n):i.reject()};return a.src=e,$(a).on("load",function(){try{n.width=a.width,n.height=a.height,o.drawImage(a,0,0),r()}catch(e){i.reject()}}).on("error",function(){i.reject()}),i}catch(s){return i.reject()}},s=function(e,t,i,n){var o,r=$(this).children("img:first").data("ext",a(t.mime,n)),s=$('<div class="elfinder-edit-spinner elfinder-edit-image"></div>').html('<span class="elfinder-spinner-text">'+n.i18n("ntfloadimg")+'</span><span class="elfinder-spinner"></span>').hide().appendTo(this),c=function(){r.attr("id",e+"-img").attr("src",o||i).css({height:"","max-width":"100%","max-height":"100%",cursor:"pointer"}).data("loading",function(e){var t=r.closest(".elfinder-dialog").find("button,.elfinder-titlebar-button");return t.prop("disabled",!e)[e?"removeClass":"addClass"]("ui-state-disabled"),r.css("opacity",e?"":"0.3"),s[e?"hide":"show"](),r})};i.match(/^data:/)?c():n.openUrl(t.hash,!1,function(e){o=e,r.attr("_src",i),c()})},c=function(e,t){var i,n,o,a=e.attr("style");try{e.attr("style",""),i=e.get(0),n=document.createElement("canvas"),n.width=i.width,n.height=i.height,e.attr("style",a),n.getContext("2d").drawImage(i,0,0),o=n.toDataURL(t)}catch(r){o=e.attr("src")}return o},d=function(e){var t,i=$(e),n=$.Deferred().always(function(){i.off("load",r)}),o="about:blank",a=function(){t=setTimeout(function(){var e;try{e=base.contentWindow.location.href}catch(t){e=null}e===o?n.resolve():--s>0?a():n.reject()},500)},r=function(){t&&clearTimeout(t),n.resolve()},s=20;return i.one("load",r),e.src=o,a(),n};return i&&(i=i[1],"ckeditor"===i&&(e.prototype._options.getFileCallback=function(e,t){window.opener.CKEDITOR.tools.callFunction(function(){var e=new RegExp("(?:[?&]|&amp;)CKEditorFuncNum=([^&]+)","i"),t=window.location.search.match(e);return t&&t.length>1?t[1]:""}(),t.convAbsUrl(e.url)),t.destroy(),window.close()})),[{info:{id:"tuiimgedit",name:"TUI Image Editor",iconImg:"img/editor-icons.png 0 -48",dataScheme:!0,schemeContent:!0,openMaximized:!0,canMakeEmpty:!1,integrate:{title:"TOAST UI Image Editor",link:"http://ui.toast.com/tui-image-editor/"}},mimes:["image/jpeg","image/png","image/gif","image/svg+xml","image/x-ms-bmp"],html:'<div class="elfinder-edit-imageeditor"><canvas></canvas></div>',setup:function(e,t){t.UA.ltIE8||t.UA.Mobile?this.disabled=!0:(this.opts=Object.assign({version:"v3.14.3"},e.extraOptions.tuiImgEditOpts||{},{iconsPath:t.baseUrl+"img/tui-",theme:{}}),t.isSameOrigin(this.opts.iconsPath)||(this.disabled=!0,t.debug("warning","Setting `commandOptions.edit.extraOptions.tuiImgEditOpts.iconsPath` MUST follow the same origin policy.")))},init:function(e,t,i,n){this.data("url",i)},load:function(e){var t,i=this,n=this.fm,o=$.Deferred(),a=n.options.cdns,r=i.confObj.opts.version,s=function(t){var a,r,s,c,d=$(e),l=d.parent(),p=i.confObj.opts,m=p.iconsPath,u=$('<div class="tui-image-editor-container">').appendTo(l),f=[$('<div class="tui-image-editor-submenu"></div>').appendTo(u),$('<div class="tui-image-editor-controls"></div>').appendTo(u)],g=new t(e,{includeUI:{loadImage:{path:d.data("url"),name:i.file.name},theme:Object.assign(p.theme,{"menu.normalIcon.path":m+"icon-d.svg","menu.normalIcon.name":"icon-d","menu.activeIcon.path":m+"icon-b.svg","menu.activeIcon.name":"icon-b","menu.disabledIcon.path":m+"icon-a.svg","menu.disabledIcon.name":"icon-a","menu.hoverIcon.path":m+"icon-c.svg","menu.hoverIcon.name":"icon-c","submenu.normalIcon.path":m+"icon-d.svg","submenu.normalIcon.name":"icon-d","submenu.activeIcon.path":m+"icon-c.svg","submenu.activeIcon.name":"icon-c"}),initMenu:"filter",menuBarPosition:"bottom"},cssMaxWidth:Math.max(300,l.width()),cssMaxHeight:Math.max(200,l.height()-(f[0].height()+f[1].height()+3)),usageStatistics:!1}),h=d.find("canvas:first").get(0),v=function(e){if("undefined"!=typeof e){var t,i,n=$(h),o=parseInt(n.attr("width")),a=parseInt(n.attr("height")),r=o/a;0===e?(t=o,i=a):(t=parseInt(n.css("max-width"))+Number(e),i=t/r,t>o&&i>a&&(t=o,i=a)),y.text(Math.round(t/o*100)+"%"),g.resizeCanvasDimension({width:t,height:i}),c&&setTimeout(function(){c&&v(e)},50)}},b=$('<span class="ui-icon ui-icon-plusthick"></span>').data("val",10),x=$('<span class="ui-icon ui-icon-minusthick"></span>').data("val",-10),y=$("<button></button>").css("width","4em").text("%").attr("title","100%").data("val",0);u.remove(),d.removeData("url").data("mime",i.file.mime),"image/jpeg"===i.file.mime?(d.data("quality",n.storage("jpgQuality")||n.option("jpgQuality")),a=$('<input type="number" class="ui-corner-all elfinder-resize-quality elfinder-tabstop"/>').attr("min","1").attr("max","100").attr("title","1 - 100").on("change",function(){var e=a.val();d.data("quality",e),r&&cancelAnimationFrame(r),r=requestAnimationFrame(function(){h.toBlob(function(e){e&&a.next("span").text(" ("+n.formatSize(e.size)+")")},"image/jpeg",Math.max(Math.min(e,100),1)/100)})}).val(d.data("quality")),$('<div class="ui-dialog-buttonset elfinder-edit-extras elfinder-edit-extras-quality"></div>').append($("<span>").html(n.i18n("quality")+" : "),a,$("<span></span>")).prependTo(d.parent().next())):"image/svg+xml"===i.file.mime&&d.closest(".ui-dialog").trigger("changeType",{extention:"png",mime:"image/png",keepEditor:!0}),$('<div class="ui-dialog-buttonset elfinder-edit-extras"></div>').append(x,y,b).attr("title",n.i18n("scale")).on("click","span,button",function(){v($(this).data("val"))}).on("mousedown mouseup mouseleave","span",function(e){c=!1,s&&clearTimeout(s),"mousedown"===e.type&&(s=setTimeout(function(){c=!0,v($(e.target).data("val"))},500))}).prependTo(d.parent().next()),setTimeout(function(){o.resolve(g),a&&(a.trigger("change"),g.on("redoStackChanged undoStackChanged",function(){a.trigger("change")})),v(null)},100),d.find(".tui-colorpicker-palette-container").on("click",".tui-colorpicker-palette-preview",function(){$(this).closest(".color-picker-control").height("auto").find(".tui-colorpicker-slider-container").toggle()}),d.on("click",function(){d.find(".tui-colorpicker-slider-container").hide()})};return i.confObj.editor?s(i.confObj.editor):(t=$.Deferred(),n.loadCss([a.tui+"/tui-color-picker/latest/tui-color-picker.css",a.tui+"/tui-image-editor/"+r+"/tui-image-editor.css"]),n.hasRequire?(require.config({paths:{"fabric/dist/fabric.require":a.fabric+"/fabric.require.min",fabric:a.fabric+"/fabric.min","tui-code-snippet":a.tui+"/tui.code-snippet/latest/tui-code-snippet.min","tui-color-picker":a.tui+"/tui-color-picker/latest/tui-color-picker.min","tui-image-editor":a.tui+"/tui-image-editor/"+r+"/tui-image-editor.min"}}),require(["tui-image-editor"],function(e){t.resolve(e)})):n.loadScript([a.fabric+"/fabric.min.js",a.tui+"/tui.code-snippet/latest/tui-code-snippet.min.js"],function(){n.loadScript([a.tui+"/tui-color-picker/latest/tui-color-picker.min.js"],function(){n.loadScript([a.tui+"/tui-image-editor/"+r+"/tui-image-editor.min.js"],function(){t.resolve(window.tui.ImageEditor)},{loadType:"tag"})},{loadType:"tag"})},{loadType:"tag"}),t.done(function(e){i.confObj.editor=e,s(e)})),o},getContent:function(e){var t=this.editor,i=t.fm,n=$(e),o=n.data("quality");if(t.instance)return"image/jpeg"===n.data("mime")&&(o=o||i.storage("jpgQuality")||i.option("jpgQuality"),o=Math.max(.1,Math.min(1,o/100))),t.instance.toDataURL({format:a(n.data("mime"),i,!0),quality:o})},save:function(e){var t,i=$(e),n=i.data("quality"),o=i.data("hash");this.instance.deactivateAll(),"undefined"!=typeof n&&this.fm.storage("jpgQuality",n),o&&(t=this.fm.file(o),i.data("mime",t.mime))}},{info:{id:"photopea",name:"Photopea",iconImg:"img/editor-icons.png 0 -160",single:!0,noContent:!0,arrayBufferContent:!0,openMaximized:!0,canMakeEmpty:["image/jpeg","image/png","image/gif","image/svg+xml","image/x-ms-bmp","image/tiff","image/webp","image/vnd.adobe.photoshop","application/pdf","image/x-portable-pixmap","image/x-sketch","image/x-icon","image/vnd-ms.dds"],integrate:{title:"Photopea",link:"https://www.photopea.com/learn/"}},mimes:["image/jpeg","image/png","image/gif","image/svg+xml","image/x-ms-bmp","image/tiff","image/x-adobe-dng","image/webp","image/x-xcf","image/vnd.adobe.photoshop","application/pdf","image/x-portable-pixmap","image/x-sketch","image/x-icon","image/vnd-ms.dds","application/x-msmetafile"],html:'<iframe style="width:100%;height:100%;border:none;"></iframe>',setup:function(e,t){(t.UA.IE||t.UA.Mobile)&&(this.disabled=!0)},init:function(e,t,i,n){var r,s,c,d="https://www.photopea.com",l=$(this).hide().on("load",function(){l.show()}).on("error",function(){u.remove(),l.show()}),p=this.editor,m=p.confObj,u=$('<div class="elfinder-edit-spinner elfinder-edit-photopea"></div>').html('<span class="elfinder-spinner-text">'+n.i18n("nowLoading")+'</span><span class="elfinder-spinner"></span>').appendTo(l.parent()),f=n.arrayFlip(m.info.canMakeEmpty),g=function(e){var t=a(e,n),i=o[t];return m.mimesFlip[i]?"jpeg"===t&&(t="jpg"):t="",t&&f[i]||(t="psd",i=o[t],l.closest(".ui-dialog").trigger("changeType",{extention:t,mime:i,keepEditor:!0})),t},h=t.mime;m.mimesFlip||(m.mimesFlip=n.arrayFlip(m.mimes,!0)),m.liveMsg||(m.liveMsg=function(e,t,i){var o,a=e.get(0).contentWindow,r=0,s=null,c=$.Deferred().done(function(){t.remove(),r=1,a.postMessage(s,d)});this.load=function(){return n.getContents(i.hash,"arraybuffer").done(function(e){s=e})},this.receive=function(t){var i=t.originalEvent;i.origin===d&&i.source===a&&("done"===i.data?0===r?c.resolve():1===r?(r=2,e.trigger("contentsloaded")):o&&"pending"===o.state()&&o.reject("errDataEmpty"):"Save"===i.data?p.doSave():o&&"pending"===o.state()&&("object"==typeof i.data?o.resolve("data:"+h+";base64,"+n.arrayBufferToBase64(i.data)):o.reject("errDataEmpty")))},this.getContent=function(){var t,i;if(r>1)return o&&"pending"===o.state()&&o.reject(),o=null,o=$.Deferred(),2===r?(r=3,o.resolve("data:"+h+";base64,"+n.arrayBufferToBase64(s)),s=null,o):(e.data("mime")&&(h=e.data("mime"),t=g(h)),(i=e.data("quality"))&&(t+=":"+i/100),a.postMessage('app.activeDocument.saveToOE("'+t+'")',d),o)}}),l.parent().css("padding",0),s=g(t.mime),r=p.liveMsg=new m.liveMsg(l,u,t),$(window).on("message."+n.namespace,r.receive),r.load().done(function(){var e=JSON.stringify({files:[],environment:{lang:n.lang.replace(/_/g,"-"),customIO:{save:'app.echoToOE("Save");'}}});l.attr("src",d+"/#"+encodeURI(e))}).fail(function(e){e&&n.error(e),p.initFail=!0}),"image/jpeg"!==t.mime&&"image/webp"!==t.mime||(l.data("quality",n.storage("jpgQuality")||n.option("jpgQuality")),c=$('<input type="number" class="ui-corner-all elfinder-resize-quality elfinder-tabstop"/>').attr("min","1").attr("max","100").attr("title","1 - 100").on("change",function(){var e=c.val();l.data("quality",e)}).val(l.data("quality")),$('<div class="ui-dialog-buttonset elfinder-edit-extras elfinder-edit-extras-quality"></div>').append($("<span>").html(n.i18n("quality")+" : "),c,$("<span></span>")).prependTo(l.parent().next()))},load:function(e){var t=$.Deferred(),i=this,n=(this.fm,$(e));return i.initFail?t.reject():n.on("contentsloaded",function(){t.resolve(i.liveMsg)}),t},getContent:function(){return this.editor.liveMsg?this.editor.liveMsg.getContent():void 0},save:function(e,t){var i,n=$(e),o=n.data("quality"),a=n.data("hash");"undefined"!=typeof o&&this.fm.storage("jpgQuality",o),a?(i=this.fm.file(a),n.data("mime",i.mime)):n.removeData("mime")},close:function(e,t){$(e).attr("src",""),t&&$(window).off("message."+this.fm.namespace,t.receive)}},{info:{id:"pixo",name:"Pixo Editor",iconImg:"img/editor-icons.png 0 -208",dataScheme:!0,schemeContent:!0,single:!0,canMakeEmpty:!1,integrate:{title:"Pixo Editor",link:"https://pixoeditor.com/privacy-policy/"}},mimes:["image/jpeg","image/png","image/gif","image/svg+xml","image/x-ms-bmp"],html:'<div class="elfinder-edit-imageeditor"><img/></div>',setup:function(e,t){!t.UA.ltIE8&&e.extraOptions&&e.extraOptions.pixo&&e.extraOptions.pixo.apikey?this.editorOpts=e.extraOptions.pixo:this.disabled=!0},init:function(e,t,i,n){s.call(this,e,t,i,n)},getContent:function(){return $(this).children("img:first").attr("src")},load:function(e){var t,i,n,o,s,c=this,d=this.fm,l=$(e),p=l.children("img:first"),m=l.closest(".ui-dialog"),u=d.getUI(),f=$.Deferred(),g=$("#elfinder-pixo-container"),h=function(n){var h;g.length?g.appendTo(g.parent()):(g=$('<div id="elfinder-pixo-container" class="ui-front"></div>').css({position:"fixed",top:0,right:0,width:"100%",height:$(window).height(),overflow:"hidden"}).hide().appendTo(u.hasClass("elfinder-fullscreen")?u:"body"),u.on("resize."+d.namespace,function(e,t){e.preventDefault(),e.stopPropagation(),t&&t.fullscreen&&g.appendTo("on"===t.fullscreen?u:"body")}),d.bind("destroy",function(){s&&s.cancelEditing(),g.remove()})),p.on("click",v),h=Object.assign({type:"child",parent:g.get(0),output:{format:"png"},onSave:function(n){var s=n.toBlob().type,l=a(s,d),u=function(e){p.one("load error",function(){p.data("loading")&&p.data("loading")(!0)}).attr("crossorigin","anonymous").attr("src",e)},f=n.toDataURL();p.data("loading")(),delete e._canvas,p.data("ext")!==l?r(f,c.file.mime).done(function(n,a){a&&(e._canvas=o=a,i.trigger("change"),t&&t.show()),u(n)}).fail(function(){m.trigger("changeType",{extention:l,mime:s}),u(f)}):u(f)},onClose:function(){m.removeClass(d.res("class","preventback")),d.toggleMaximize(g,!1),g.hide(),d.toFront(m)}},c.confObj.editorOpts),c.trigger("Prepare",{node:e,editorObj:Pixo,instance:void 0,opts:h}),s=new Pixo.Bridge(h),f.resolve(s),l.on("saveAsFail",v),n&&n()},v=function(){m.addClass(d.res("class","preventback")),d.toggleMaximize(g,!0),d.toFront(g),g.show().data("curhash",c.file.hash),s.edit(p.get(0)),p.data("loading")(!0)};return p.data("loading")(),"image/jpeg"===c.file.mime&&(i=$('<input type="number" class="ui-corner-all elfinder-resize-quality elfinder-tabstop"/>').attr("min","1").attr("max","100").attr("title","1 - 100").on("change",function(){var e=i.val();n&&cancelAnimationFrame(n),n=requestAnimationFrame(function(){o&&o.toBlob(function(e){e&&i.next("span").text(" ("+d.formatSize(e.size)+")")},"image/jpeg",Math.max(Math.min(e,100),1)/100)})}).val(d.storage("jpgQuality")||d.option("jpgQuality")),t=$('<div class="ui-dialog-buttonset elfinder-edit-extras elfinder-edit-extras-quality"></div>').hide().append($("<span>").html(d.i18n("quality")+" : "),i,$("<span></span>")).prependTo(l.parent().next()),l.data("quty",i)),"undefined"==typeof Pixo?d.loadScript(["https://pixoeditor.com:8443/editor/scripts/bridge.m.js"],function(){h(v)},{loadType:"tag"}):(h(),v()),f},save:function(e){var t,i=this,n=$(e),o=n.children("img:first");e._canvas?(n.data("quty")&&(t=n.data("quty").val(),t&&this.fm.storage("jpgQuality",t)),o.attr("src",e._canvas.toDataURL(i.file.mime,t?Math.max(Math.min(t,100),1)/100:void 0))):"data:"!==o.attr("src").substr(0,5)&&o.attr("src",c(o,this.file.mime))},close:function(e,t){t&&t.destroy()}},{setup:function(e,t){!t.UA.ltIE8&&t.options.cdns.ace||(this.disabled=!0)},info:{id:"aceeditor",name:"ACE Editor",iconImg:"img/editor-icons.png 0 -96"},load:function(e){var t=this,i=this.fm,n=$.Deferred(),o=i.options.cdns.ace,a=function(){var i,a,r,s=$(e),c=s.parent(),d=c.parent(),l=e.id+"_ace",p=(t.file.name.replace(/^.+\.([^.]+)|(.+)$/,"$1$2").toLowerCase(),{"text/x-php":"php","application/x-php":"php","text/html":"html","application/xhtml+xml":"html","text/javascript":"javascript","application/javascript":"javascript","text/css":"css","text/x-c":"c_cpp","text/x-csrc":"c_cpp","text/x-chdr":"c_cpp","text/x-c++":"c_cpp","text/x-c++src":"c_cpp","text/x-c++hdr":"c_cpp","text/x-shellscript":"sh","application/x-csh":"sh","text/x-python":"python","text/x-java":"java","text/x-java-source":"java","text/x-ruby":"ruby","text/x-perl":"perl","application/x-perl":"perl","text/x-sql":"sql","text/xml":"xml","application/docbook+xml":"xml","application/xml":"xml"});c.height(c.height()),ace.config.set("basePath",o),a=$('<div id="'+l+'" style="width:100%; height:100%;"></div>').text(s.val()).insertBefore(s.hide()),s.data("ace",!0),i=ace.edit(l),i.$blockScrolling=1/0,i.setOptions({theme:"ace/theme/monokai",fontSize:"14px",wrap:!0}),ace.config.loadModule("ace/ext/modelist",function(){r=ace.require("ace/ext/modelist").getModeForPath("/"+t.file.name).name,"text"===r&&p[t.file.mime]&&(r=p[t.file.mime]),c.prev().children(".elfinder-dialog-title").append(" ("+t.file.mime+" : "+r.split(/[\/\\]/).pop()+")"),i.setOptions({mode:"ace/mode/"+r}),"resolved"===n.state()&&d.trigger("resize")}),ace.config.loadModule("ace/ext/language_tools",function(){ace.require("ace/ext/language_tools"),i.setOptions({enableBasicAutocompletion:!0,enableSnippets:!0,enableLiveAutocompletion:!1})}),ace.config.loadModule("ace/ext/settings_menu",function(){ace.require("ace/ext/settings_menu").init(i)}),i.commands.addCommand({name:"saveFile",bindKey:{win:"Ctrl-s",mac:"Command-s"},exec:function(e){t.doSave()}}),i.commands.addCommand({name:"closeEditor",bindKey:{win:"Ctrl-w|Ctrl-q",mac:"Command-w|Command-q"},exec:function(e){t.doCancel()}}),i.resize(),$('<div class="ui-dialog-buttonset"></div>').css("float","left").append($("<button></button>").html(t.fm.i18n("TextArea")).button().on("click",function(){s.data("ace")?(s.removeData("ace"),a.hide(),s.val(i.session.getValue()).show().trigger("focus"),$(this).text("AceEditor")):(s.data("ace",!0),a.show(),i.setValue(s.hide().val(),-1),i.focus(),$(this).html(t.fm.i18n("TextArea")))})).append($("<button>Ace editor setting</button>").button({icons:{primary:"ui-icon-gear",secondary:"ui-icon-triangle-1-e"},text:!1}).on("click",function(){i.showSettingsMenu(),$("#ace_settingsmenu").css("font-size","80%").find('div[contains="setOptions"]').hide().end().parent().appendTo($("#elfinder"))})).prependTo(c.next()),t.trigger("Prepare",{node:e,editorObj:ace,instance:i,opts:{}}),n.resolve(i)};return t.confObj.loader||(t.confObj.loader=$.Deferred(),t.fm.loadScript([o+"/ace.js"],function(){t.confObj.loader.resolve()},void 0,{obj:window,name:"ace"})),t.confObj.loader.done(a),n},close:function(e,t){t&&t.destroy()},save:function(e,t){t&&$(e).data("ace")&&(e.value=t.session.getValue())},focus:function(e,t){t&&$(e).data("ace")&&t.focus()},resize:function(e,t,i,n){t&&t.resize()}},{setup:function(e,t){!t.UA.ltIE10&&t.options.cdns.codemirror||(this.disabled=!0)},info:{id:"codemirror",name:"CodeMirror",iconImg:"img/editor-icons.png 0 -176"},load:function(e){var t=this.fm,i=t.convAbsUrl(t.options.cdns.codemirror),o=$.Deferred(),a=this,r=function(t){var r,s,c,d=$(e),l=d.parent();l.height(l.height()),c={lineNumbers:!0,lineWrapping:!0,extraKeys:{"Ctrl-S":function(){a.doSave()},"Ctrl-Q":function(){a.doCancel()},"Ctrl-W":function(){a.doCancel()}}},a.trigger("Prepare",{node:e,editorObj:t,instance:void 0,opts:c}),r=t.fromTextArea(e,c),o.resolve(r);var p,m,u,f;p||(p=t.findModeByMIME(a.file.mime)),!p&&(m=a.file.name.match(/.+\.([^.]+)$/))&&(p=t.findModeByExtension(m[1])),p&&(t.modeURL=n?"codemirror/mode/%N/%N.min":i+"/mode/%N/%N.min.js",u=p.mode,f=p.mime,r.setOption("mode",f),t.autoLoadMode(r,u),l.prev().children(".elfinder-dialog-title").append(" ("+f+("null"!=u?" : "+u:"")+")")),s=$(r.getWrapperElement()).css({padding:0,border:"none"}),d.data("cm",!0),s.height("100%"),$('<div class="ui-dialog-buttonset"></div>').css("float","left").append($("<button></button>").html(a.fm.i18n("TextArea")).button().on("click",function(){d.data("cm")?(d.removeData("cm"),s.hide(),d.val(r.getValue()).show().trigger("focus"),$(this).text("CodeMirror")):(d.data("cm",!0),s.show(),r.setValue(d.hide().val()),r.refresh(),r.focus(),$(this).html(a.fm.i18n("TextArea")))})).prependTo(l.next())};return a.confObj.loader||(a.confObj.loader=$.Deferred(),n?(require.config({packages:[{name:"codemirror",location:i,main:"codemirror.min"}],map:{codemirror:{"codemirror/lib/codemirror":"codemirror"}}}),require(["codemirror","codemirror/addon/mode/loadmode.min","codemirror/mode/meta.min"],function(e){a.confObj.loader.resolve(e)})):a.fm.loadScript([i+"/codemirror.min.js"],function(){a.fm.loadScript([i+"/addon/mode/loadmode.min.js",i+"/mode/meta.min.js"],function(){a.confObj.loader.resolve(CodeMirror)})},{loadType:"tag"}),a.fm.loadCss(i+"/codemirror.css")),a.confObj.loader.done(r),o},close:function(e,t){t&&t.toTextArea()},save:function(e,t){t&&$(e).data("cm")&&(e.value=t.getValue())},focus:function(e,t){t&&$(e).data("cm")&&t.focus()},resize:function(e,t,i,n){t&&t.refresh()}},{setup:function(e,t){!t.UA.ltIE10&&t.options.cdns.simplemde||(this.disabled=!0)},info:{id:"simplemde",name:"SimpleMDE",iconImg:"img/editor-icons.png 0 -80"},exts:["md"],load:function(e){var t=this,i=this.fm,o=$(e).parent(),a=$.Deferred(),r=i.options.cdns.simplemde,s=function(i){var n,r,s,c=o.height(),d=o.outerHeight(!0)-c+14;e._setHeight=function(e){var t,i=e||o.height(),a=0;return o.children(".editor-toolbar,.editor-statusbar").each(function(){a+=$(this).outerHeight(!0)}),t=i-a-d,r.height(t),n.codemirror.refresh(),t},o.height(c),s={element:e,autofocus:!0},t.trigger("Prepare",{node:e,editorObj:i,instance:void 0,opts:s}),n=new i(s),a.resolve(n),r=$(n.codemirror.getWrapperElement()),r.css("min-height","50px").children(".CodeMirror-scroll").css("min-height","50px"),e._setHeight(c)};return t.confObj.loader||(t.confObj.loader=$.Deferred(),t.fm.loadCss(r+"/simplemde.min.css"),n?require([r+"/simplemde.min.js"],function(e){t.confObj.loader.resolve(e)}):t.fm.loadScript([r+"/simplemde.min.js"],function(){t.confObj.loader.resolve(SimpleMDE)},{loadType:"tag"})),t.confObj.loader.done(s),a},close:function(e,t){t&&t.toTextArea(),t=null},save:function(e,t){t&&(e.value=t.value())},focus:function(e,t){t&&t.codemirror.focus()},resize:function(e,t,i,n){t&&e._setHeight()}},{info:{id:"ckeditor",name:"CKEditor",iconImg:"img/editor-icons.png 0 0"},exts:["htm","html","xhtml"],setup:function(e,t){var i=this;t.options.cdns.ckeditor?(i.ckeOpts={},e.extraOptions&&(i.ckeOpts=Object.assign({},e.extraOptions.ckeditor||{}),e.extraOptions.managerUrl&&(i.managerUrl=e.extraOptions.managerUrl))):i.disabled=!0},load:function(e){var t=this,i=this.fm,n=$.Deferred(),o=function(){var o,a=$(e).parent(),r=a.closest(".elfinder-dialog"),s=a.height(),c=/([&?]getfile=)[^&]+/,d=t.confObj.managerUrl||window.location.href.replace(/#.*$/,""),l="ckeditor";c.test(d)?d=d.replace(c,"$1"+l):d+="?getfile="+l,a.height(s),o={startupFocus:!0,fullPage:!0,allowedContent:!0,filebrowserBrowseUrl:d,toolbarCanCollapse:!0,toolbarStartupExpanded:!i.UA.Mobile,removePlugins:"resize",extraPlugins:"colorbutton,justify,docprops",on:{instanceReady:function(o){var a=o.editor;a.resize("100%",s),r.one("beforedommove."+i.namespace,function(){a.destroy()}).one("dommove."+i.namespace,function(){t.load(e).done(function(e){t.instance=e})}),n.resolve(o.editor)}}},t.trigger("Prepare",{node:e,editorObj:CKEDITOR,instance:void 0,opts:o}),CKEDITOR.replace(e.id,Object.assign(o,t.confObj.ckeOpts)),CKEDITOR.on("dialogDefinition",function(e){var t=e.data.definition.dialog;t.on("show",function(e){i.getUI().append($(".cke_dialog_background_cover")).append(this.getElement().$)}),t.on("hide",function(e){$("body:first").append($(".cke_dialog_background_cover")).append(this.getElement().$)})})};return t.confObj.loader||(t.confObj.loader=$.Deferred(),window.CKEDITOR_BASEPATH=i.options.cdns.ckeditor+"/",$.getScript(i.options.cdns.ckeditor+"/ckeditor.js",function(){t.confObj.loader.resolve()})),t.confObj.loader.done(o),n},close:function(e,t){t&&t.destroy()},save:function(e,t){t&&(e.value=t.getData())},focus:function(e,t){t&&t.focus()},resize:function(e,t,i,n){t&&"ready"===t.status&&t.resize("100%",$(e).parent().height())}},{info:{id:"ckeditor5",name:"CKEditor5",iconImg:"img/editor-icons.png 0 -16"},exts:["htm","html","xhtml"],html:'<div class="edit-editor-ckeditor5"></div>',setup:function(e,t){var i=this;t.options.cdns.ckeditor5&&"function"==typeof window.Symbol&&"symbol"==typeof Symbol()?(i.ckeOpts={},e.extraOptions&&(e.extraOptions.ckeditor5Mode&&(i.ckeditor5Mode=e.extraOptions.ckeditor5Mode),i.ckeOpts=Object.assign({},e.extraOptions.ckeditor5||{}),i.ckeOpts.mode&&(i.ckeditor5Mode=i.ckeOpts.mode,delete i.ckeOpts.mode),e.extraOptions.managerUrl&&(i.managerUrl=e.extraOptions.managerUrl))):i.disabled=!0,t.bind("destroy",function(){i.editor=null})},prepare:function(e,t,i){$(e).height(e.editor.fm.getUI().height()-100)},init:function(e,t,i,n){var o=i.match(/^([\s\S]*<body[^>]*>)([\s\S]+)(<\/body>[\s\S]*)$/i),a="",r="",s="";this.css({width:"100%",height:"100%","box-sizing":"border-box"}),o?(a=o[1],r=o[2],s=o[3]):r=i,this.data("data",{header:a,body:r,footer:s}),this._setupSelEncoding(i)},load:function(e){var t,i=this,n=this.fm,o=$.Deferred(),a=i.confObj.ckeditor5Mode||"decoupled-document",r=function(){var e=n.lang.toLowerCase().replace("_","-");return"zh"===e.substr(0,2)&&"zh-cn"!==e&&(e="zh"),e}(),s=function(t){var s,d=$(e).parent();d.height(n.getUI().height()-100),s=Object.assign({toolbar:["heading","|","fontSize","fontFamily","|","bold","italic","underline","strikethrough","highlight","|","alignment","|","numberedList","bulletedList","blockQuote","indent","outdent","|","ckfinder","link","imageUpload","insertTable","mediaEmbed","|","undo","redo"],language:r},i.confObj.ckeOpts),i.trigger("Prepare",{node:e,editorObj:t,instance:void 0,opts:s}),t.create(e,s).then(function(t){var i,r,s=t.commands.get("ckfinder"),l=t.plugins.get("FileRepository"),p={};!t.ui.view.toolbar||"classic"!==a&&"decoupled-document"!==a||$(e).closest(".elfinder-dialog").children(".ui-widget-header").append($(t.ui.view.toolbar.element).css({marginRight:"-1em",marginLeft:"-1em"})),"classic"===a&&$(e).closest(".elfinder-edit-editor").css("overflow","auto"),s&&(i=function(e){return e&&e.mime.match(/^image\//i)},r=function(e){var i=t.commands.get("imageUpload");if(!i.isEnabled){var n=t.plugins.get("Notification"),o=t.locale.t;return void n.showWarning(o("Could not insert image at the current position."),{title:o("Inserting image failed"),namespace:"ckfinder"})}t.execute("imageInsert",{source:e})},s.execute=function(){var e=d.closest(".elfinder-dialog"),o=n.getCommand("getfile"),a=function(){p.hasVar&&(e.off("resize close",a),o.callback=p.callback,o.options.folders=p.folders,o.options.multiple=p.multi,n.commandMap.open=p.open,p.hasVar=!1)};e.trigger("togleminimize").one("resize close",a),p.callback=o.callback,p.folders=o.options.folders,p.multi=o.options.multiple,p.open=n.commandMap.open,p.hasVar=!0,o.callback=function(o){var a=[];return 1===o.length&&"directory"===o[0].mime?void n.one("open",function(){n.commandMap.open="getfile"}).getCommand("open").exec(o[0].hash):(n.getUI("cwd").trigger("unselectall"),$.each(o,function(e,o){i(o)?a.push(n.convAbsUrl(o.url)):t.execute("link",n.convAbsUrl(o.url))}),a.length&&r(a),void e.trigger("togleminimize"))},o.options.folders=!0,o.options.multiple=!0,n.commandMap.open="getfile",n.toast({mode:"info",msg:n.i18n("dblclickToSelect")})}),l.createUploadAdapter=function(e){return new c(e)},t.setData($(e).data("data").body),n.getUI().append($("body > div.ck-body")),$("div.ck-balloon-panel").css({"z-index":n.getMaximizeCss().zIndex+1}),o.resolve(t)})["catch"](function(e){n.error(e)})},c=function(e){var t=function(t,i,o){n.exec("upload",{files:[t]},void 0,n.cwd().hash).done(function(e){e.added&&e.added.length?n.url(e.added[0].hash,{async:!0}).done(function(e){i({"default":n.convAbsUrl(e)})}).fail(function(){o("errFileNotFound")}):o(n.i18n(e.error?e.error:"errUpload"))}).fail(function(e){var t=n.parseError(e);o(n.i18n(t?"userabort"===t?"errAbort":t:"errUploadNoFiles"))}).progress(function(t){e.uploadTotal=t.total,e.uploaded=t.progress})};this.upload=function(){return new Promise(function(i,n){e.file instanceof Promise||e.file&&"function"==typeof e.file.then?e.file.then(function(e){t(e,i,n)}):t(e.file,i,n)})},this.abort=function(){n.getUI().trigger("uploadabort")}};return i.confObj.editor?s(i.confObj.editor):(t=$.Deferred(),i.fm.loadScript([n.options.cdns.ckeditor5+"/"+a+"/ckeditor.js"],function(e){e||(e=window.BalloonEditor||window.InlineEditor||window.ClassicEditor||window.DecoupledEditor),"en"!==n.lang?i.fm.loadScript([n.options.cdns.ckeditor5+"/"+a+"/translations/"+r+".js"],function(i){t.resolve(e)},{tryRequire:!0,loadType:"tag",error:function(i){r="en",t.resolve(e)}}):t.resolve(e)},{tryRequire:!0,loadType:"tag"}),t.done(function(e){i.confObj.editor=e,s(e)})),o},getContent:function(){var e=$(this).data("data");return e.header+e.body+e.footer},close:function(e,t){t&&t.destroy()},save:function(e,t){var i=$(e),n=i.data("data");t&&(n.body=t.getData(),i.data("data",n))},focus:function(e,t){$(e).trigger("focus")}},{info:{id:"tinymce",name:"TinyMCE",iconImg:"img/editor-icons.png 0 -64"},exts:["htm","html","xhtml"],setup:function(e,t){var i=this;t.options.cdns.tinymce?(i.mceOpts={},e.extraOptions?(i.uploadOpts=Object.assign({},e.extraOptions.uploadOpts||{}),i.mceOpts=Object.assign({},e.extraOptions.tinymce||{})):i.uploadOpts={}):i.disabled=!0},load:function(e){var t=this,i=this.fm,n=$.Deferred(),o=function(){var o,a,r,s=$(e).show().parent(),c=s.closest(".elfinder-dialog"),d=s.height(),l=s.outerHeight(!0)-d,p=function(){var e;tinymce.activeEditor.windowManager.windows?(e=tinymce.activeEditor.windowManager.windows[0],a=$(e?e.getEl():void 0).hide(),r=$("#mce-modal-block").hide()):a=$(".tox-dialog-wrap").hide()},m=function(){r&&r.show(),a&&a.show()},u=tinymce.majorVersion;s.height(d),e._setHeight=function(e){if(u<5){var t,i=$(this).parent(),n=e||i.innerHeight(),o=0;i.find(".mce-container-body:first").children(".mce-top-part,.mce-statusbar").each(function(){o+=$(this).outerHeight(!0)}),t=n-o-l,i.find(".mce-edit-area iframe:first").height(t)}},o={selector:"#"+e.id,resize:!1,plugins:"print preview fullpage searchreplace autolink directionality visualblocks visualchars fullscreen image link media template codesample table charmap hr pagebreak nonbreaking anchor toc insertdatetime advlist lists wordcount imagetools textpattern help",toolbar:"formatselect | bold italic strikethrough forecolor backcolor | link image media | alignleft aligncenter alignright alignjustify | numlist bullist outdent indent | removeformat",image_advtab:!0,init_instance_callback:function(o){e._setHeight(d),c.one("beforedommove."+i.namespace,function(){tinymce.execCommand("mceRemoveEditor",!1,e.id)}).one("dommove."+i.namespace,function(){t.load(e).done(function(e){t.instance=e})}),n.resolve(o)},file_picker_callback:function(e,t,n){var o=i.getCommand("getfile"),a=function(){r.hasVar&&(o.callback=r.callback,o.options.folders=r.folders,o.options.multiple=r.multi,i.commandMap.open=r.open,r.hasVar=!1),c.off("resize close",a),m()},r={};return r.callback=o.callback,r.folders=o.options.folders,r.multi=o.options.multiple,r.open=i.commandMap.open,r.hasVar=!0,o.callback=function(t){var o,a;return"directory"===t.mime?void i.one("open",function(){i.commandMap.open="getfile"}).getCommand("open").exec(t.hash):(o=i.convAbsUrl(t.url),a=t.name+" ("+i.formatSize(t.size)+")","file"==n.filetype&&e(o,{text:a,title:a}),"image"==n.filetype&&e(o,{alt:a}),"media"==n.filetype&&e(o),void c.trigger("togleminimize"))},o.options.folders=!0,o.options.multiple=!1,
i.commandMap.open="getfile",p(),c.trigger("togleminimize").one("resize close",a),i.toast({mode:"info",msg:i.i18n("dblclickToSelect")}),!1},images_upload_handler:function(e,n,o){var a=e.blob(),r=function(e){var t=e.data.dialog||{};(t.hasClass("elfinder-dialog-error")||t.hasClass("elfinder-confirm-upload"))&&(p(),t.trigger("togleminimize").one("resize close",s),i.unbind("dialogopened",r))},s=function(){c.off("resize close",s),m()},d=!0;a.name&&(d=void 0),i.bind("dialogopened",r).exec("upload",Object.assign({files:[a],clipdata:d},t.confObj.uploadOpts),void 0,i.cwd().hash).done(function(e){e.added&&e.added.length?i.url(e.added[0].hash,{async:!0}).done(function(e){m(),n(i.convAbsUrl(e))}).fail(function(){o(i.i18n("errFileNotFound"))}):o(i.i18n(e.error?e.error:"errUpload"))}).fail(function(e){var t=i.parseError(e);t&&("errUnknownCmd"===t?t="errPerm":"userabort"===t&&(t="errAbort")),o(i.i18n(t?t:"errUploadNoFiles"))})}},u>=5&&(o.height="100%"),t.trigger("Prepare",{node:e,editorObj:tinymce,instance:void 0,opts:o}),tinymce.init(Object.assign(o,t.confObj.mceOpts))};return t.confObj.loader||(t.confObj.loader=$.Deferred(),t.fm.loadScript([i.options.cdns.tinymce+(i.options.cdns.tinymce.match(/\.js/)?"":"/tinymce.min.js")],function(){t.confObj.loader.resolve()},{loadType:"tag"})),t.confObj.loader.done(o),n},close:function(e,t){t&&tinymce.execCommand("mceRemoveEditor",!1,e.id)},save:function(e,t){t&&t.save()},focus:function(e,t){t&&t.focus()},resize:function(e,t,i,n){t&&e._setHeight()}},{info:{id:"zohoeditor",name:"Zoho Editor",iconImg:"img/editor-icons.png 0 -32",cmdCheck:"ZohoOffice",preventGet:!0,hideButtons:!0,syncInterval:15e3,canMakeEmpty:!0,integrate:{title:"Zoho Office API",link:"https://www.zoho.com/officeapi/"}},mimes:["application/msword","application/vnd.openxmlformats-officedocument.wordprocessingml.document","application/vnd.oasis.opendocument.text","application/rtf","text/html","application/vnd.ms-excel","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","application/vnd.oasis.opendocument.spreadsheet","application/vnd.sun.xml.calc","text/csv","text/tab-separated-values","application/vnd.ms-powerpoint","application/vnd.openxmlformats-officedocument.presentationml.presentation","application/vnd.openxmlformats-officedocument.presentationml.slideshow","application/vnd.oasis.opendocument.presentation","application/vnd.sun.xml.impress"],html:'<iframe style="width:100%;max-height:100%;border:none;"></iframe>',setup:function(e,t){(t.UA.Mobile||t.UA.ltIE8)&&(this.disabled=!0)},prepare:function(e,t,i){var n=e.editor.fm.getUI();$(e).height(n.height()),t.width=Math.max(t.width||0,.8*n.width())},init:function(e,t,i,n){var o=this,a=$(this).hide(),r=n.getUI("toast"),s=$('<div class="elfinder-edit-spinner elfinder-edit-zohoeditor"></div>').html('<span class="elfinder-spinner-text">'+n.i18n("nowLoading")+'</span><span class="elfinder-spinner"></span>').appendTo(a.parent()),c=function(){var e="";return $.each(n.customData,function(t,i){e+="&"+encodeURIComponent(t)+"="+encodeURIComponent(i)}),e};$(o).data("xhr",n.request({data:{cmd:"editor",name:o.editor.confObj.info.cmdCheck,method:"init","args[target]":t.hash,"args[lang]":n.lang,"args[cdata]":c()},preventDefault:!0}).done(function(e){var t;e.zohourl?(t={css:{height:"100%"}},o.editor.trigger("Prepare",{node:o,editorObj:void 0,instance:a,opts:t}),a.attr("src",e.zohourl).show().css(t.css),e.warning&&(r.appendTo(o.closest(".ui-dialog")),n.toast({msg:n.i18n(e.warning),mode:"warning",timeOut:0,onHidden:function(){1===r.children().length&&r.appendTo(n.getUI())},button:{text:"btnYes"}}))):(e.error&&n.error(e.error),o.elfinderdialog("destroy"))}).fail(function(e){e&&n.error(e),o.elfinderdialog("destroy")}).always(function(){s.remove()}))},load:function(){},getContent:function(){},save:function(){},beforeclose:d,close:function(e){var t=(this.fm,$(e).data("xhr"));"pending"===t.state()&&t.reject()}},{info:{id:"ziparchive",name:"btnMount",iconImg:"img/toolbar.png 0 -416",cmdCheck:"ZipArchive",edit:function(e,t){var i=this,n=$.Deferred();return i.request({data:{cmd:"netmount",protocol:"ziparchive",host:e.hash,path:e.phash},preventFail:!0,notify:{type:"netmount",cnt:1,hideCnt:!0}}).done(function(e){var t;e.added&&e.added.length&&(e.added[0].phash&&(t=i.file(e.added[0].phash))&&(t.dirs||(t.dirs=1,i.change({changed:[t]}))),i.one("netmountdone",function(){i.exec("open",e.added[0].hash),i.one("opendone",function(){e.toast&&i.toast(e.toast)})})),n.resolve()}).fail(function(e){n.reject(e)}),n}},mimes:["application/zip"],load:function(){},save:function(){}},{info:{id:"textarea",name:"TextArea",useTextAreaEvent:!0},load:function(e){this.trigger("Prepare",{node:e,editorObj:void 0,instance:void 0,opts:{}}),e.setSelectionRange&&e.setSelectionRange(0,0),$(e).trigger("focus").show()},save:function(){}},{info:{id:"onlineconvert",name:"Online Convert",iconImg:"img/editor-icons.png 0 -144",cmdCheck:"OnlineConvert",preventGet:!0,hideButtons:!0,single:!0,converter:!0,canMakeEmpty:!1,integrate:{title:"ONLINE-CONVERT.COM",link:"https://online-convert.com"}},mimes:["*"],html:'<div style="width:100%;max-height:100%;"></div>',setup:function(e,t){var i=e.extraOptions.onlineConvert||{maxSize:100,showLink:!0};i.maxSize&&(this.info.maxSize=1048576*i.maxSize),this.set=Object.assign({url:"https://%s.online-convert.com%s?external_url=",conv:{Archive:{"7Z":{},BZ2:{ext:"bz"},GZ:{},ZIP:{}},Audio:{MP3:{},OGG:{ext:"oga"},WAV:{},WMA:{},AAC:{},AIFF:{ext:"aif"},FLAC:{},M4A:{},MMF:{},OPUS:{ext:"oga"}},Document:{DOC:{},DOCX:{},HTML:{},ODT:{},PDF:{},PPT:{},PPTX:{},RTF:{},SWF:{},TXT:{}},eBook:{AZW3:{ext:"azw"},ePub:{},FB2:{ext:"xml"},LIT:{},LRF:{},MOBI:{},PDB:{},PDF:{},"PDF-eBook":{ext:"pdf"},TCR:{}},Hash:{Adler32:{},"Apache-htpasswd":{},Blowfish:{},CRC32:{},CRC32B:{},Gost:{},Haval128:{},MD4:{},MD5:{},RIPEMD128:{},RIPEMD160:{},SHA1:{},SHA256:{},SHA384:{},SHA512:{},Snefru:{},"Std-DES":{},Tiger128:{},"Tiger128-calculator":{},"Tiger128-converter":{},Tiger160:{},Tiger192:{},Whirlpool:{}},Image:{BMP:{},EPS:{ext:"ai"},GIF:{},EXR:{},ICO:{},JPG:{},PNG:{},SVG:{},TGA:{},TIFF:{ext:"tif"},WBMP:{},WebP:{}},Video:{"3G2":{},"3GP":{},AVI:{},FLV:{},HLS:{ext:"m3u8"},MKV:{},MOV:{},MP4:{},"MPEG-1":{ext:"mpeg"},"MPEG-2":{ext:"mpeg"},OGG:{ext:"ogv"},OGV:{},WebM:{},WMV:{},Android:{link:"/convert-video-for-%s",ext:"mp4"},Blackberry:{link:"/convert-video-for-%s",ext:"mp4"},DPG:{link:"/convert-video-for-%s",ext:"avi"},iPad:{link:"/convert-video-for-%s",ext:"mp4"},iPhone:{link:"/convert-video-for-%s",ext:"mp4"},iPod:{link:"/convert-video-for-%s",ext:"mp4"},"Nintendo-3DS":{link:"/convert-video-for-%s",ext:"avi"},"Nintendo-DS":{link:"/convert-video-for-%s",ext:"avi"},PS3:{link:"/convert-video-for-%s",ext:"mp4"},Wii:{link:"/convert-video-for-%s",ext:"avi"},Xbox:{link:"/convert-video-for-%s",ext:"wmv"}}},catExts:{Hash:"txt"},link:'<div class="elfinder-edit-onlineconvert-link"><a href="https://www.online-convert.com" target="_blank"><span class="elfinder-button-icon"></span>ONLINE-CONVERT.COM</a></div>',useTabs:!(!$.fn.tabs||t.UA.iOS)},i)},prepare:function(e,t,i){var n=e.editor.fm.getUI();$(e).height(n.height()),t.width=Math.max(t.width||0,.8*n.width())},init:function(e,t,i,n){var a,r,s=this,c=s.editor.confObj,d=c.set,l=n.getUI("toast"),p={},m=n.uploadMimeCheck("application/zip",t.phash),u=$("base").length?document.location.href.replace(/#.*$/,""):"",f=function(e,t){var i;return d.catExts[e]?d.catExts[e]:d.conv[e]&&(i=d.conv[e][t])?(i.ext||t).toLowerCase():t.toLowerCase()},g=function(e,t){var i,o,a;o="undefined"==typeof c.api?n.request({data:{cmd:"editor",name:"OnlineConvert",method:"init"},preventDefault:!0}):$.Deferred().resolve({api:c.api}),e=e.toLowerCase(),o.done(function(n){c.api=n.api,c.api&&(e?i="?category="+e:(i="",e="all"),c.conversions||(c.conversions={}),a=c.conversions[e]?$.Deferred().resolve(c.conversions[e]):$.getJSON("https://api2.online-convert.com/conversions"+i),a.done(function(i){c.conversions[e]=i,$.each(i,function(e,t){h[d.useTabs?"children":"find"](".onlineconvert-category-"+t.category).children(".onlineconvert-"+t.target).trigger("makeoption",t)}),t&&t()}))})},h=function(){var e=$("<div></div>").on("click","button",function(){var e=$(this),t=e.data("opts")||null,i=e.closest(".onlineconvert-category").data("cname"),n=e.data("conv");c.api===!0&&k({category:i,convert:n,options:t})}).on("change",function(e){var t=$(e.target),i=t.parent(),o=t.closest(".elfinder-edit-onlineconvert-button").children("button:first"),a=o.data("opts")||{},r="boolean"===i.data("type")?t.is(":checked"):t.val();if(e.stopPropagation(),r&&("integer"===i.data("type")&&(r=parseInt(r)),i.data("pattern"))){var s=new RegExp(i.data("pattern"));s.test(r)||(requestAnimationFrame(function(){n.error('"'+n.escape(r)+'" is not match to "/'+n.escape(i.data("pattern"))+'/"')}),r=null)}r?a[t.parent().data("optkey")]=r:delete a[i.data("optkey")],o.data("opts",a)}),i=$("<ul></ul>"),a=function(e,t){var i,o,a,r=$("<p></p>").data("optkey",e).data("type",t.type),s="",c="",d=!1;return t.description&&r.attr("title",n.i18n(t.description)),t.pattern&&r.data("pattern",t.pattern),r.append($("<span></span>").text(n.i18n(e)+" : ")),"boolean"===t.type?((t["default"]||(d="allow_multiple_outputs"===e&&!m))&&(s=" checked",d&&(c=" disabled"),o=this.children("button:first"),i=o.data("opts")||{},i[e]=!0,o.data("opts",i)),r.append($('<input type="checkbox" value="true"'+s+c+"/>"))):t["enum"]?(a=$("<select></select>").append($('<option value=""></option>').text("Select...")),$.each(t["enum"],function(e,t){a.append($('<option value="'+t+'"></option>').text(t))}),r.append(a)):r.append($('<input type="text" value=""/>')),r},r=function(e){var t=this,i=$('<span class="elfinder-button-icon elfinder-button-icon-preference"></span>').on("click",function(){n.toggle()}),n=$('<div class="elfinder-edit-onlinconvert-options"></div>').hide();e.options&&$.each(e.options,function(e,i){"download_password"!==e&&n.append(a.call(t,e,i))}),t.append(i,n)},s=+new Date,l=0;return c.ext2mime||(c.ext2mime=Object.assign(n.arrayFlip(n.mimeTypes),o)),$.each(d.conv,function(o,a){var d=o.toLowerCase(),m="elfinder-edit-onlineconvert-"+d+s,g=$('<div id="'+m+'" class="onlineconvert-category onlineconvert-category-'+d+'"></div>').data("cname",o);$.each(a,function(e,i){var a=e.toLowerCase(),s=f(o,e);c.ext2mime[s]||("audio"===d||"image"===d||"video"===d?c.ext2mime[s]=d+"/x-"+a:c.ext2mime[s]="application/octet-stream"),n.uploadMimeCheck(c.ext2mime[s],t.phash)&&g.append($('<div class="elfinder-edit-onlineconvert-button onlineconvert-'+a+'"></div>').on("makeoption",function(e,t){var i=$(this);i.children(".elfinder-button-icon-preference").length||r.call(i,t)}).append($("<button></button>").text(e).data("conv",e)))}),g.children().length&&(i.append($("<li></li>").append($("<a></a>").attr("href",u+"#"+m).text(o))),e.append(g),p[d]=l++)}),d.useTabs?e.prepend(i).tabs({beforeActivate:function(e,t){g(t.newPanel.data("cname"))}}):$.each(d.conv,function(t){var i=t.toLowerCase();e.append($('<fieldset class="onlineconvert-fieldset-'+i+'"></fieldset>').append($("<legend></legend>").text(t)).append(e.children(".onlineconvert-category-"+i)))}),e}(),v=$(this).append(h,d.showLink?$(d.link):null),b=$('<div class="elfinder-edit-spinner elfinder-edit-onlineconvert"></div>').hide().html('<span class="elfinder-spinner-text">'+n.i18n("nowLoading")+'</span><span class="elfinder-spinner"></span>').appendTo(v.parent()),x=$('<div class="elfinder-quicklook-info-progress"></div>').appendTo(b),y=null,w=function(){return y?$.Deferred().resolve(y):(b.show(),n.forExternalUrl(t.hash,{progressBar:x}).done(function(e){y=e}).fail(function(e){e&&n.error(e),s.elfinderdialog("destroy")}).always(function(){b.hide()}))},k=function(e){$(s).data("dfrd",w().done(function(i){v.fadeOut(),j({info:"Start conversion request."}),n.request({data:{cmd:"editor",name:"OnlineConvert",method:"api","args[category]":e.category.toLowerCase(),"args[convert]":e.convert.toLowerCase(),"args[options]":JSON.stringify(e.options),"args[source]":n.convAbsUrl(i),"args[filename]":n.splitFileExtention(t.name)[0]+"."+f(e.category,e.convert),"args[mime]":t.mime},preventDefault:!0}).done(function(t){O(t.apires,e.category,e.convert)}).fail(function(e){e&&n.error(e),s.elfinderdialog("destroy")})}))},O=function(e,t,i){var o,a=[];e&&e.id?(o=e.status,"failed"===o.code?(b.hide(),e.errors&&e.errors.length&&$.each(e.errors,function(e,t){t.message&&a.push(t.message)}),n.error(a.length?a:o.info),v.fadeIn()):"completed"===o.code?M(e):(j(o),setTimeout(function(){C(e.id)},1e3))):(l.appendTo(s.closest(".ui-dialog")),e.message&&n.toast({msg:n.i18n(e.message),mode:"error",timeOut:5e3,onHidden:function(){1===l.children().length&&l.appendTo(n.getUI())}}),n.toast({msg:n.i18n("editorConvNoApi"),mode:"error",timeOut:3e3,onHidden:function(){1===l.children().length&&l.appendTo(n.getUI())}}),b.hide(),v.show())},j=function(e){b.show().children(".elfinder-spinner-text").text(e.info)},C=function(e){n.request({data:{cmd:"editor",name:"OnlineConvert",method:"api","args[jobid]":e},preventDefault:!0}).done(function(e){O(e.apires)}).fail(function(e){e&&n.error(e),s.elfinderdialog("destroy")})},M=function(e){var i=e.output,o=(e.id,"");b.hide(),i&&i.length&&(s.elfinderdialog("destroy"),$.each(i,function(e,t){t.uri&&(o+=t.uri+"\n")}),n.upload({target:t.phash,files:[o],type:"text",extraData:{contentSaveId:"OnlineConvert-"+e.id}}))},T="document";v.parent().css({overflow:"auto"}).addClass("overflow-scrolling-touch"),(r=t.mime.match(/^(audio|image|video)/))&&(T=r[1]),d.useTabs?p[T]&&h.tabs("option","active",p[T]):(a=Object.keys(d.conv).length,$.each(d.conv,function(e){return e.toLowerCase()===T?(g(e,function(){$.each(d.conv,function(e){e.toLowerCase()!==T&&g(e)})}),!1):void a--}),a||$.each(d.conv,function(e){g(e)}),v.parent().scrollTop(h.children(".onlineconvert-fieldset-"+T).offset().top))},load:function(){},getContent:function(){},save:function(){},close:function(e){var t=(this.fm,$(e).data("dfrd"));t&&"pending"===t.state()&&t.reject()}}]},window.elFinder);js/elFinder.command.js000064400000020113151215013410010651 0ustar00/**
 * elFinder command prototype
 *
 * @type  elFinder.command
 * @author  Dmitry (dio) Levashov
 */
elFinder.prototype.command = function(fm) {
	"use strict";
	/**
	 * elFinder instance
	 *
	 * @type  elFinder
	 */
	this.fm = fm;
	
	/**
	 * Command name, same as class name
	 *
	 * @type  String
	 */
	this.name = '';
	
	/**
	 * Dialog class name
	 *
	 * @type  String
	 */
	this.dialogClass = '';

	/**
	 * Command icon class name with out 'elfinder-button-icon-'
	 * Use this.name if it is empty
	 *
	 * @type  String
	 */
	this.className = '';

	/**
	 * Short command description
	 *
	 * @type  String
	 */
	this.title = '';
	
	/**
	 * Linked(Child) commands name
	 * They are loaded together when tthis command is loaded.
	 * 
	 * @type  Array
	 */
	this.linkedCmds = [];
	
	/**
	 * Current command state
	 *
	 * @example
	 * this.state = -1; // command disabled
	 * this.state = 0;  // command enabled
	 * this.state = 1;  // command active (for example "fullscreen" command while elfinder in fullscreen mode)
	 * @default -1
	 * @type  Number
	 */
	this.state = -1;
	
	/**
	 * If true, command can not be disabled by connector.
	 * @see this.update()
	 *
	 * @type  Boolen
	 */
	this.alwaysEnabled = false;
	
	/**
	 * Do not change dirctory on removed current work directory
	 * 
	 * @type  Boolen
	 */
	this.noChangeDirOnRemovedCwd = false;
	
	/**
	 * If true, this means command was disabled by connector.
	 * @see this.update()
	 *
	 * @type  Boolen
	 */
	this._disabled = false;
	
	/**
	 * If true, this command is disabled on serach results
	 * 
	 * @type  Boolean
	 */
	this.disableOnSearch = false;
	
	/**
	 * Call update() when event select fired
	 * 
	 * @type  Boolean
	 */
	this.updateOnSelect = true;
	
	/**
	 * Sync toolbar button title on change
	 * 
	 * @type  Boolean
	 */
	this.syncTitleOnChange = false;

	/**
	 * Keep display of the context menu when command execution
	 * 
	 * @type  Boolean
	 */
	this.keepContextmenu = false;
	
	/**
	 * elFinder events defaults handlers.
	 * Inside handlers "this" is current command object
	 *
	 * @type  Object
	 */
	this._handlers = {
		enable  : function() { this.update(void(0), this.value); },
		disable : function() { this.update(-1, this.value); },
		'open reload load sync'    : function() { 
			this._disabled = !(this.alwaysEnabled || this.fm.isCommandEnabled(this.name));
			this.update(void(0), this.value);
			this.change(); 
		}
	};
	
	/**
	 * elFinder events handlers.
	 * Inside handlers "this" is current command object
	 *
	 * @type  Object
	 */
	this.handlers = {};
	
	/**
	 * Shortcuts
	 *
	 * @type  Array
	 */
	this.shortcuts = [];
	
	/**
	 * Command options
	 *
	 * @type  Object
	 */
	this.options = {ui : 'button'};
	
	/**
	 * Callback functions on `change` event
	 * 
	 * @type  Array
	 */
	this.listeners = [];

	/**
	 * Prepare object -
	 * bind events and shortcuts
	 *
	 * @return void
	 */
	this.setup = function(name, opts) {
		var self = this,
			fm   = this.fm,
			setCallback = function(s) {
				var cb = s.callback || function(e) {
							fm.exec(self.name, void(0), {
							_userAction: true,
							_currentType: 'shortcut'
						});
					};
				s.callback = function(e) {
					var enabled, checks = {};
					if (self.enabled()) {
						if (fm.searchStatus.state < 2) {
							enabled = fm.isCommandEnabled(self.name);
						} else {
							jQuery.each(fm.selected(), function(i, h) {
								if (fm.optionsByHashes[h]) {
									checks[h] = true;
								} else {
									jQuery.each(fm.volOptions, function(id) {
										if (!checks[id] && h.indexOf(id) === 0) {
											checks[id] = true;
											return false;
										}
									});
								}
							});
							jQuery.each(checks, function(h) {
								enabled = fm.isCommandEnabled(self.name, h);
								if (! enabled) {
									return false;
								}
							});
						}
						if (enabled) {
							self.event = e;
							cb.call(self);
							delete self.event;
						}
					}
				};
			},
			i, s, sc;

		this.name      = name;
		this.title     = fm.messages['cmd'+name] ? fm.i18n('cmd'+name)
		               : ((this.extendsCmd && fm.messages['cmd'+this.extendsCmd]) ? fm.i18n('cmd'+this.extendsCmd) : name);
		this.options   = Object.assign({}, this.options, opts);
		this.listeners = [];
		this.dialogClass = 'elfinder-dialog-' + name;

		if (opts.shortcuts) {
			if (typeof opts.shortcuts === 'function') {
				sc = opts.shortcuts(this.fm, this.shortcuts);
			} else if (Array.isArray(opts.shortcuts)) {
				sc = opts.shortcuts;
			}
			this.shortcuts = sc || [];
		}

		if (this.updateOnSelect) {
			this._handlers.select = function() { this.update(void(0), this.value); };
		}

		jQuery.each(Object.assign({}, self._handlers, self.handlers), function(cmd, handler) {
			fm.bind(cmd, jQuery.proxy(handler, self));
		});

		for (i = 0; i < this.shortcuts.length; i++) {
			s = this.shortcuts[i];
			setCallback(s);
			!s.description && (s.description = this.title);
			fm.shortcut(s);
		}

		if (this.disableOnSearch) {
			fm.bind('search searchend', function() {
				self._disabled = this.type === 'search'? true : ! (this.alwaysEnabled || fm.isCommandEnabled(name));
				self.update(void(0), self.value);
			});
		}

		this.init();
	};

	/**
	 * Command specific init stuffs
	 *
	 * @return void
	 */
	this.init = function() {};

	/**
	 * Exec command
	 *
	 * @param  Array         target files hashes
	 * @param  Array|Object  command value
	 * @return jQuery.Deferred
	 */
	this.exec = function(files, opts) { 
		return jQuery.Deferred().reject(); 
	};
	
	this.getUndo = function(opts, resData) {
		return false;
	};
	
	/**
	 * Return true if command disabled.
	 *
	 * @return Boolen
	 */
	this.disabled = function() {
		return this.state < 0;
	};
	
	/**
	 * Return true if command enabled.
	 *
	 * @return Boolen
	 */
	this.enabled = function() {
		return this.state > -1;
	};
	
	/**
	 * Return true if command active.
	 *
	 * @return Boolen
	 */
	this.active = function() {
		return this.state > 0;
	};
	
	/**
	 * Return current command state.
	 * Must be overloaded in most commands
	 *
	 * @return Number
	 */
	this.getstate = function() {
		return -1;
	};
	
	/**
	 * Update command state/value
	 * and rize 'change' event if smth changed
	 *
	 * @param  Number  new state or undefined to auto update state
	 * @param  mixed   new value
	 * @return void
	 */
	this.update = function(s, v) {
		var state = this.state,
			value = this.value;

		if (this._disabled && this.fm.searchStatus === 0) {
			this.state = -1;
		} else {
			this.state = s !== void(0) ? s : this.getstate();
		}

		this.value = v;
		
		if (state != this.state || value != this.value) {
			this.change();
		}
	};
	
	/**
	 * Bind handler / fire 'change' event.
	 *
	 * @param  Function|undefined  event callback
	 * @return void
	 */
	this.change = function(c) {
		var cmd, i;
		
		if (typeof(c) === 'function') {
			this.listeners.push(c);			
		} else {
			for (i = 0; i < this.listeners.length; i++) {
				cmd = this.listeners[i];
				try {
					cmd(this.state, this.value);
				} catch (e) {
					this.fm.debug('error', e);
				}
			}
		}
		return this;
	};
	

	/**
	 * With argument check given files hashes and return list of existed files hashes.
	 * Without argument return selected files hashes.
	 *
	 * @param  Array|String|void  hashes
	 * @return Array
	 */
	this.hashes = function(hashes) {
		return hashes
			? jQuery.grep(Array.isArray(hashes) ? hashes : [hashes], function(hash) { return fm.file(hash) ? true : false; })
			: fm.selected();
	};
	
	/**
	 * Return only existed files from given fils hashes | selected files
	 *
	 * @param  Array|String|void  hashes
	 * @return Array
	 */
	this.files = function(hashes) {
		var fm = this.fm;
		
		return hashes
			? jQuery.map(Array.isArray(hashes) ? hashes : [hashes], function(hash) { return fm.file(hash) || null; })
			: fm.selectedFiles();
	};

	/**
	 * Wrapper to fm.dialog()
	 *
	 * @param  String|DOMElement  content
	 * @param  Object             options
	 * @return Object             jQuery element object
	 */
	this.fmDialog = function(content, options) {
		if (options.cssClass) {
			options.cssClass += ' ' + this.dialogClass;
		} else {
			options.cssClass = this.dialogClass;
		}
		return this.fm.dialog(content, options);
	};
};
js/elfinder.min.js000064400001767643151215013410010111 0ustar00/*!
 * elFinder - file manager for web
 * Version 2.1.49 (2019-04-14)
 * http://elfinder.org
 * 
 * Copyright 2009-2019, Studio 42
 * Licensed under a 3-clauses BSD license
 */
!function(e,t){if("function"==typeof define&&define.amd)define(["jquery","jquery-ui"],t);else if("undefined"!=typeof exports){var n,i;try{n=require("jquery"),i=require("jquery-ui")}catch(a){}module.exports=t(n,i)}else t(e.jQuery,e.jQuery.ui,!0)}(this,function(e,t,n){n=n||!1;var i=function(t,n,a){var o,r,s,l,c,d,p,u=this,h=[],f=["button","tooltip"],m=e(t),g=e.extend(!0,{},e._data(m.get(0),"events")),v=e("<div/>").append(m.contents()).attr("class",m.attr("class")||"").attr("style",m.attr("style")||""),b=m.attr("id")||"",y="elfinder-"+(b?b:Math.random().toString().substr(2,7)),w="mousedown."+y,x="keydown."+y,k="keypress."+y,C="keyup."+y,z=!1,T=!1,A=["enable","disable","load","open","reload","select","add","remove","change","dblclick","getfile","lockfiles","unlockfiles","selectfiles","unselectfiles","dragstart","dragstop","search","searchend","viewchange"],S="",I={path:"",url:"",tmbUrl:"",disabled:[],separator:"/",archives:[],extract:[],copyOverwrite:!0,uploadOverwrite:!0,uploadMaxSize:0,jpgQuality:100,tmbCrop:!1,tmb:!1},O={},j={},M={},D={},F=[],E={},U={},P=[],R={},q=[],H=[],_=new u.command(u),N="auto",L=400,W=null,B="sounds/",$="",K=e(document.createElement("audio")).hide().appendTo("body")[0],V=0,X="",G=null,J=function(t){var n,i,a,o,r,s,l,c={},d={};u.api>=2.1?(u.commandMap=t.options.uiCmdMap&&Object.keys(t.options.uiCmdMap).length?t.options.uiCmdMap:{},X!==JSON.stringify(u.commandMap)&&(X=JSON.stringify(u.commandMap))):u.options.sync=0,t.init?(j={},D={}):(s=S,n="elfinder-subtree-loaded "+u.res("class","navexpand"),r=u.res("class","navcollapse"),i=Object.keys(j),a=function(e){if(!j[e])return!0;var t="directory"===j[e].mime,i=j[e].phash;!(!t||c[i]||!d[i]&&u.navHash2Elm(j[e].hash).is(":hidden")&&u.navHash2Elm(i).next(".elfinder-navbar-subtree").children().length>100)||!t&&i===S||R[e]?t&&(d[i]=!0):(t&&!c[i]&&(c[i]=!0,u.navHash2Elm(i).removeClass(n).next(".elfinder-navbar-subtree").empty()),ee(j[e]))},o=function(){i.length&&(G&&G._abort(),G=u.asyncJob(a,i,{interval:20,numPerOnce:100}).done(function(){var t=u.storage("hide")||{items:{}};Object.keys(M).length&&e.each(M,function(e){t.items[e]||delete M[e]})}))},u.trigger("filesgc").one("filesgc",function(){i=[]}),u.one("opendone",function(){s!==S&&(m.data("lazycnt")?u.one("lazydone",o):o())})),u.sorters={},S=t.cwd.hash,Y(t.files),j[S]||Y([t.cwd]),l=JSON.stringify(u.sorters),$!==l&&(u.trigger("sorterupdate"),$=l),u.lastDir(S),u.autoSync()},Y=function(t,n){var i,a,o,r,s={name:!0,perm:!0,date:!0,size:!0,kind:!0},l=!u.sorters._checked,c=t.length,d=function(t){var n=t||{},i=[];e.each(u.sortRules,function(e){(s[e]||"undefined"!=typeof n[e]||"mode"===e&&"undefined"!=typeof n.perm)&&i.push(e)}),u.sorters=u.arrayFlip(i,!0),u.sorters._checked=!0},p=["sizeInfo"],h={},f=u.storage("hide")||{},m=f.items||{};for(a=0;a<c;a++)i=Object.assign({},t[a]),r=!(f.show||!m[i.hash]),i.name&&i.hash&&i.mime&&(r||(l&&i.phash===S&&(d(i),l=!1),!i.phash||"add"!==n&&"change"!==n||(o=u.parents(i.phash))&&e.each(o,function(){h[this]=!0})),j[i.hash]&&(e.each(p,function(){j[i.hash][this]&&!i[this]&&(i[this]=j[i.hash][this])}),i.sizeInfo&&!i.size&&(i.size=i.sizeInfo.size),ee(j[i.hash],!0)),m[i.hash]&&(M[i.hash]=i),r?(c--,t.splice(a--,1)):(j[i.hash]=i,"directory"!==i.mime||D[i.hash]||(D[i.hash]={}),i.phash&&(D[i.phash]||(D[i.phash]={}),D[i.phash][i.hash]=!0)));e.each(Object.keys(h),function(){var e=j[this];e&&e.sizeInfo&&delete e.sizeInfo}),l&&d()},Q=function(t){var n,i=t.length,a={},o=function(t){var i=j[t];i&&("directory"===i.mime&&(a[t]&&delete u.roots[a[t]],e.each(u.leafRoots,function(n,i){var a,o;(a=e.inArray(t,i))!==-1&&(1===i.length?((o=Object.assign({},j[n]))&&o._realStats&&(e.each(o._realStats,function(e,t){o[e]=t}),Q(j[n]._realStats),u.change({changed:[o]})),delete u.leafRoots[n]):u.leafRoots[n].splice(a,1))}),u.searchStatus.state<2&&e.each(j,function(e,n){n.phash==t&&o(e)})),i.phash&&(n=u.parents(i.phash))&&e.each(n,function(){r[this]=!0}),ee(j[t]))},r={};for(e.each(u.roots,function(e,t){a[t]=e});i--;)o(t[i]);e.each(Object.keys(r),function(){var e=j[this];e&&e.sizeInfo&&delete e.sizeInfo})},Z=function(t){e.each(t,function(t,n){var i=n.hash;j[i]&&e.each(Object.keys(j[i]),function(e,t){"undefined"==typeof n[t]&&delete j[i][t]}),j[i]=j[i]?Object.assign(j[i],n):n})},ee=function(e,t){var n=e.hash,i=e.phash;i&&D[i]&&delete D[i][n],t||(D[n]&&delete D[n],u.optionsByHashes[n]&&delete u.optionsByHashes[n]),delete j[n]},te=0,ne=[],ie=!1,ae=function(t){var n,i=t.keyCode,a=!(!t.ctrlKey&&!t.metaKey),o="mousedown"===t.type;if(!o&&(u.keyState.keyCode=i),u.keyState.ctrlKey=a,u.keyState.shiftKey=t.shiftKey,u.keyState.metaKey=t.metaKey,u.keyState.altKey=t.altKey,!o)return"keyup"===t.type?void(u.keyState.keyCode=null):void(z&&(e.each(U,function(e,n){n.type==t.type&&n.keyCode==i&&n.shiftKey==t.shiftKey&&n.ctrlKey==a&&n.altKey==t.altKey&&(t.preventDefault(),t.stopPropagation(),n.callback(t,u),u.debug("shortcut-exec",e+" : "+n.description))}),i!=e.ui.keyCode.TAB||e(t.target).is(":input")||t.preventDefault(),"keydown"===t.type&&i==e.ui.keyCode.ESCAPE&&(m.find(".ui-widget:visible").length||u.clipboard().length&&u.clipboard([]),e.ui.ddmanager&&(n=e.ui.ddmanager.current,n&&n.helper&&n.cancel()),u.toHide(m.find(".ui-widget.elfinder-button-menu.elfinder-frontmost:visible")),u.trigger("keydownEsc",t))))},oe=new Date,re=window.parent!==window,se=function(){var t,n;if(re)try{n=e("iframe",window.parent.document),n.length&&e.each(n,function(n,i){if(i.contentWindow===window)return t=e(i),!1})}catch(i){}return t}();n||(n={}),u.UA.Mobile&&e(window).on("orientationchange."+y,function(){var e=(screen&&screen.orientation&&screen.orientation.angle||window.orientation||0)+0;e===-90&&(e=270),u.UA.Angle=e,u.UA.Rotated=e%180!==0}).trigger("orientationchange."+y),n.bootCallback&&"function"==typeof n.bootCallback&&!function(){var e=a,t=n.bootCallback;a=function(n,i){e&&"function"==typeof e&&e.call(this,n,i),t.call(this,n,i)}}(),delete n.bootCallback,this.api=null,this.newAPI=!1,this.oldAPI=!1,this.netDrivers=[],this.baseUrl="",this.i18nBaseUrl="",this.cssloaded=!1,this.theme=null,this.mimesCanMakeEmpty={},this.bootCallback,this.id=b,this.storage=function(){try{return"localStorage"in window&&null!==window.localStorage?(u.UA.Safari&&(window.localStorage.setItem("elfstoragecheck",1),window.localStorage.removeItem("elfstoragecheck")),u.localStorage):u.cookie}catch(e){return u.cookie}}(),this.options=Object.assign({},this._options),n.uiOptions&&n.uiOptions.toolbar&&Array.isArray(n.uiOptions.toolbar)&&e.isPlainObject(n.uiOptions.toolbar[n.uiOptions.toolbar.length-1])&&(u.options.uiOptions.toolbarExtra=Object.assign(u.options.uiOptions.toolbarExtra||{},n.uiOptions.toolbar.pop())),function(){var t=function(n,i){e.isPlainObject(n)&&e.each(n,function(n,a){e.isPlainObject(a)?(i[n]||(i[n]={}),t(a,i[n])):i[n]=a})};t(n,u.options)}(),this.options.uiOptions.toolbar.push(this.options.uiOptions.toolbarExtra),delete this.options.uiOptions.toolbarExtra,this.toUnbindEvents={},this.bind=function(e,t,n){var i,a;if(t&&("function"==typeof t||"function"==typeof t.done))for(e=(""+e).toLowerCase().replace(/^\s+|\s+$/g,"").split(/\s+/),a=e.length,i=0;i<a;i++)void 0===E[e[i]]&&(E[e[i]]=[]),E[e[i]][n?"unshift":"push"](t);return this},this.unbind=function(t,n){var i,a,o,r;for(t=(""+t).toLowerCase().split(/\s+/),a=t.length,i=0;i<a;i++)(o=E[t[i]])&&(r=e.inArray(n,o),r>-1&&o.splice(r,1));return n=null,this},this.trigger=function(t,n,i){var a,o,r,s,l=t.toLowerCase(),c="object"==typeof n,d=E[l]||[],p=[];if(this.debug("event-"+l,n),c&&"undefined"!=typeof i||(i=!0),o=d.length){for(s=e.Event(l),n&&(n._event=s),i&&(s.data=n),a=0;a<o;a++)if(d[a])if(d[a].done)p.push(d[a].done);else{if(d[a].length&&!i){if("undefined"==typeof r)try{r=JSON.stringify(n)}catch(h){r=!1}s.data=r?JSON.parse(r):n}try{if(d[a].call(s,s,this)===!1||s.isDefaultPrevented()){this.debug("event-stoped",s.type);break}}catch(f){window.console&&window.console.log&&window.console.log(f)}}if(o=p.length)for(a=0;a<o;a++)try{if(p[a].call(s,s,this)===!1||s.isDefaultPrevented()){this.debug("event-stoped",s.type+"(done)");break}}catch(f){window.console&&window.console.log&&window.console.log(f)}this.toUnbindEvents[l]&&this.toUnbindEvents[l].length&&(e.each(this.toUnbindEvents[l],function(e,t){u.unbind(t.type,t.callback)}),delete this.toUnbindEvents[l])}return this},this.getListeners=function(e){return e?E[e.toLowerCase()]:E},this.baseUrl=function(){var t,n,i,a;return u.options.baseUrl?u.options.baseUrl:(a="",t=null,e("head > script").each(function(){if(this.src&&this.src.match(/js\/elfinder(?:-[a-z0-9_-]+)?\.(?:min|full)\.js$/i))return t=e(this),!1}),t&&(n=e('head > link[href$="css/elfinder.min.css"],link[href$="css/elfinder.full.css"]:first').length,n||(u.cssloaded=null),a=t.attr("src").replace(/js\/[^\/]+$/,""),a.match(/^(https?\/\/|\/)/)||(i=e("head > base[href]").attr("href"))&&(a=i.replace(/\/$/,"")+"/"+a)),""!==a?u.options.baseUrl=a:(u.options.baseUrl||(u.options.baseUrl="./"),a=u.options.baseUrl),a)}(),this.i18nBaseUrl=(this.options.i18nBaseUrl||this.baseUrl+"js/i18n").replace(/\/$/,"")+"/",this.options.maxErrorDialogs=Math.max(1,parseInt(this.options.maxErrorDialogs||5)),I.dispInlineRegex=this.options.dispInlineRegex,this.options.cssAutoLoad&&!function(){var t=u.baseUrl;Array.isArray(u.options.cssAutoLoad)&&(u.cssloaded===!0?u.loadCss(u.options.cssAutoLoad):u.bind("cssloaded",function(){u.loadCss(u.options.cssAutoLoad)})),null===u.cssloaded&&(m.data("cssautoloadHide",e("<style>.elfinder{visibility:hidden;overflow:hidden}</style>")),e("head").append(m.data("cssautoloadHide")),u.options.themes["default"]||(u.options.themes=Object.assign({"default":{name:"default",cssurls:"css/theme.css",author:"elFinder Project",license:"3-clauses BSD"}},u.options.themes),u.options.theme||(u.options.theme="default")),u.loadCss([t+"css/elfinder.min.css"],{dfd:e.Deferred().always(function(){m.data("cssautoloadHide")&&(m.data("cssautoloadHide").remove(),m.removeData("cssautoloadHide"))}).done(function(){u.cssloaded||(u.cssloaded=!0,u.trigger("cssloaded"))}).fail(function(){u.cssloaded=!1,u.error(["errRead","CSS (elfinder or theme)"])})})),u.options.cssAutoLoad=!1}(),this.changeTheme(this.storage("theme")||this.options.theme),this.optionProperties={icon:void 0,csscls:void 0,tmbUrl:void 0,uiCmdMap:{},netkey:void 0,disabled:[]},re||this.options.enableAlways||2!==e("body").children().length||(this.options.enableAlways=!0),this.options.debug===!0?this.options.debug="all":Array.isArray(this.options.debug)?!function(){var t={};e.each(u.options.debug,function(){t[this]=!0}),u.options.debug=t}():this.options.debug=!1,this.noConflicts={},this.noConflict=function(){e.each(f,function(t,n){e.fn[n]&&"function"==typeof e.fn[n].noConflict&&(u.noConflicts[n]=e.fn[n].noConflict())})},this.noConflict(),this.isCORS=!1,function(){if("undefined"!=typeof u.options.cors&&null!==u.options.cors)u.isCORS=!!u.options.cors;else{var t,i=document.createElement("a"),a=window.location.protocol,o=function(e){return e=e&&":"!==e?e:a,"https:"===e?/\:443$/:/\:80$/},r=window.location.host.replace(o(a),"");i.href=n.url,n.urlUpload&&n.urlUpload!==n.url&&(t=document.createElement("a"),t.href=n.urlUpload),(r!==i.host.replace(o(i.protocol),"")||":"!==i.protocol&&""!==i.protocol&&a!==i.protocol||t&&(r!==t.host.replace(o(t.protocol),"")||":"!==t.protocol&&""!==t.protocol&&a!==t.protocol))&&(u.isCORS=!0)}u.isCORS&&(e.isPlainObject(u.options.customHeaders)||(u.options.customHeaders={}),e.isPlainObject(u.options.xhrFields)||(u.options.xhrFields={}),u.options.requestType="post",u.options.customHeaders["X-Requested-With"]="XMLHttpRequest",u.options.xhrFields.withCredentials=!0)}(),this.requestType=/^(get|post)$/i.test(this.options.requestType)?this.options.requestType.toLowerCase():"get",s=Math.max(parseInt(this.options.requestMaxConn),1),this.optsCustomData=e.isPlainObject(this.options.customData)?this.options.customData:{},this.customData=Object.assign({},this.optsCustomData),this.prevCustomData=null,this.customHeaders=e.isPlainObject(this.options.customHeaders)?this.options.customHeaders:{},this.xhrFields=e.isPlainObject(this.options.xhrFields)?this.options.xhrFields:{},this.replaceXhrSend=function(){p||(p=XMLHttpRequest.prototype.send),XMLHttpRequest.prototype.send=function(){var t=this;return u.customHeaders&&e.each(u.customHeaders,function(e){t.setRequestHeader(e,this)}),u.xhrFields&&e.each(u.xhrFields,function(e){e in t&&(t[e]=this)}),p.apply(this,arguments)}},this.restoreXhrSend=function(){p&&(XMLHttpRequest.prototype.send=p)},this.abortCmdsOnOpen=this.options.abortCmdsOnOpen||["tmb","parents"],this.navPrefix="nav"+(i.prototype.uniqueid?i.prototype.uniqueid:"")+"-",this.cwdPrefix=i.prototype.uniqueid?"cwd"+i.prototype.uniqueid+"-":"",++i.prototype.uniqueid,this.uploadURL=n.urlUpload||n.url,this.namespace=y,this.today=new Date(oe.getFullYear(),oe.getMonth(),oe.getDate()).getTime()/1e3,this.yesterday=this.today-86400,l=this.options.UTCDate?"UTC":"",this.getHours="get"+l+"Hours",this.getMinutes="get"+l+"Minutes",this.getSeconds="get"+l+"Seconds",this.getDate="get"+l+"Date",this.getDay="get"+l+"Day",this.getMonth="get"+l+"Month",this.getFullYear="get"+l+"FullYear",this.zIndex,this.searchStatus={state:0,query:"",target:"",mime:"",mixed:!1,ininc:!1},this.lang=this.storage("lang")||this.options.lang,"jp"===this.lang&&(this.lang=this.options.lang="ja"),this.viewType=this.storage("view")||this.options.defaultView||"icons",this.sortType=this.storage("sortType")||this.options.sortType||"name",this.sortOrder=this.storage("sortOrder")||this.options.sortOrder||"asc",this.sortStickFolders=this.storage("sortStickFolders"),null===this.sortStickFolders?this.sortStickFolders=!!this.options.sortStickFolders:this.sortStickFolders=!!this.sortStickFolders,this.sortAlsoTreeview=this.storage("sortAlsoTreeview"),null===this.sortAlsoTreeview||null===this.options.sortAlsoTreeview?this.sortAlsoTreeview=!!this.options.sortAlsoTreeview:this.sortAlsoTreeview=!!this.sortAlsoTreeview,this.sortRules=e.extend(!0,{},this._sortRules,this.options.sortRules),e.each(this.sortRules,function(e,t){"function"!=typeof t&&delete u.sortRules[e]}),this.compare=e.proxy(this.compare,this),this.notifyDelay=this.options.notifyDelay>0?parseInt(this.options.notifyDelay):500,this.draggingUiHelper=null,this.droppable={greedy:!0,tolerance:"pointer",accept:".elfinder-cwd-file-wrapper,.elfinder-navbar-dir,.elfinder-cwd-file,.elfinder-cwd-filename",hoverClass:this.res("class","adroppable"),classes:{"ui-droppable-hover":this.res("class","adroppable")},autoDisable:!0,drop:function(t,n){var i,a,o,r=e(this),s=e.grep(n.helper.data("files")||[],function(e){return!!e}),l=[],c=[],d=[],p=n.helper.hasClass("elfinder-drag-helper-plus"),h="class";if("undefined"==typeof t.button||n.helper.data("namespace")!==y||!u.insideWorkzone(t.pageX,t.pageY))return!1;for(a=r.hasClass(u.res(h,"cwdfile"))?u.cwdId2Hash(r.attr("id")):r.hasClass(u.res(h,"navdir"))?u.navId2Hash(r.attr("id")):S,i=s.length;i--;)o=s[i],o!=a&&j[o].phash!=a?l.push(o):(p&&o!==a&&j[a].write?c:d).push(o);return!d.length&&(n.helper.data("droped",!0),c.length&&(n.helper.hide(),u.exec("duplicate",c,{_userAction:!0})),void(l.length&&(n.helper.hide(),u.clipboard(l,!p),u.exec("paste",a,{_userAction:!0},a).always(function(){u.clipboard([]),u.trigger("unlockfiles",{files:s})}),u.trigger("drop",{files:s}))))}},this.enabled=function(){return z&&this.visible()},this.visible=function(){return m[0].elfinder&&m.is(":visible")},this.isRoot=function(e){return!(!e.isroot&&e.phash)},this.root=function(t,n){t=t||S;var i,a;if(!n&&(e.each(u.roots,function(e,n){if(0===t.indexOf(e))return i=n,!1}),i))return i;for(i=j[t];i&&i.phash&&(n||!i.isroot);)i=j[i.phash];if(i)return i.hash;for(;a in j&&j.hasOwnProperty(a);)if(i=j[a],"directory"===i.mime&&!i.phash&&i.read)return i.hash;return""},this.cwd=function(){return j[S]||{}},this.option=function(t,n){var i,a;return n=n||S,u.optionsByHashes[n]&&"undefined"!=typeof u.optionsByHashes[n][t]?u.optionsByHashes[n][t]:!u.hasVolOptions||S===n||(a=u.file(n))&&a.phash===S?O[t]||"":(i="",e.each(u.volOptions,function(e,a){if(0===n.indexOf(e))return i=a[t]||"",!1}),i)},this.getDisabledCmds=function(t,n){var i={hidden:!0};return Array.isArray(t)||(t=[t]),e.each(t,function(e,t){var n=u.option("disabledFlip",t);n&&Object.assign(i,n)}),n?i:Object.keys(i)},this.file=function(e,t){return e?j[e]||(t?M[e]:void 0):void 0},this.files=function(t){var n={};return t?D[t]?(e.each(D[t],function(e){j[e]?n[e]=j[e]:delete D[t][e]}),Object.assign({},n)):{}:Object.assign({},j)},this.parents=function(e){for(var t,n=[];e&&(t=this.file(e));)n.unshift(t.hash),e=t.phash;return n},this.path2array=function(e,t){for(var n,i=[];e;){if(!(n=j[e])||!n.hash){i=[];break}i.unshift(t&&n.i18?n.i18:n.name),e=n.isroot?null:n.phash}return i},this.path=function(t,n,i){var a=j[t]&&j[t].path?j[t].path:this.path2array(t,n).join(O.separator);if(i&&j[t]){i=Object.assign({notify:{type:"parents",cnt:1,hideCnt:!0}},i);var o,r=e.Deferred(),s=i.notify,l=!1,c=function(){u.request({data:{cmd:"parents",target:j[t].phash},notify:s,preventFail:!0}).done(d).fail(function(){r.reject()})},d=function(){u.one("parentsdone",function(){a=u.path(t,n),""===a&&l?(l=!1,c()):(s&&(clearTimeout(o),s.cnt=-parseInt(s.cnt||0),u.notify(s)),r.resolve(a))})};return a?r.resolve(a):(u.ui.tree?(s&&(o=setTimeout(function(){u.notify(s)},u.notifyDelay)),l=!0,d(!0)):c(),r)}return a},this.url=function(t,n){var i,a=j[t],o=n||{},r=o.async||!1,s=o.temporary||!1,l=o.onetime&&u.option("onetimeUrl",t)||!1,c=o.absurl||!1,d=r||l?e.Deferred():null,p=function(e){return e&&c&&(e=u.convAbsUrl(e)),e},h=function(n){if(n)return p(n);if(a.url)return p(a.url);if("undefined"==typeof i&&(i=u.option("url",!u.isRoot(a)&&a.phash||a.hash)),i)return p(i+e.map(u.path2array(t),function(e){return encodeURIComponent(e)}).slice(1).join("/"));var o=Object.assign({},u.customData,{cmd:"file",target:a.hash});return u.oldAPI&&(o.cmd="open",o.current=a.phash),p(u.options.url+(u.options.url.indexOf("?")===-1?"?":"&")+e.param(o,!0))};if(!a||!a.read)return r?d.resolve(""):"";if(l)r=!0,this.request({data:{cmd:"url",target:t,options:{onetime:1}},preventDefault:!0,options:{async:r},notify:{type:"file",cnt:1,hideCnt:!0}}).done(function(e){d.resolve(p(e.url||""))}).fail(function(){d.resolve("")});else if("1"==a.url||s&&!a.url&&!(i=u.option("url",!u.isRoot(a)&&a.phash||a.hash)))this.request({data:{cmd:"url",target:t,options:{temporary:s?1:0}},preventDefault:!0,options:{async:r},notify:r?{type:s?"file":"url",cnt:1,hideCnt:!0}:{}}).done(function(e){a.url=e.url||""}).fail(function(){a.url=""}).always(function(){var e;return a.url&&s&&(e=a.url,a.url="1"),r?void d.resolve(h(e)):h(e)});else{if(!r)return h();d.resolve(h())}return r?d:void 0},this.forExternalUrl=function(e,t){var n=u.option("onetimeUrl",e),i={async:!0,absurl:!0};return i[n?"onetime":"temporary"]=!0,u.url(e,Object.assign({},t,i))},this.openUrl=function(t,n){var i=j[t],a="";return i&&i.read?!n&&(i.url?1!=i.url&&(a=i.url):O.url&&0===i.hash.indexOf(u.cwd().volumeid)&&(a=O.url+e.map(this.path2array(t),function(e){return encodeURIComponent(e)}).slice(1).join("/")),a)?a+=(a.match(/\?/)?"&":"?")+"_".repeat((a.match(/[\?&](_+)t=/g)||["&t="]).sort().shift().match(/[\?&](_*)t=/)[1].length+1)+"t="+(i.ts||parseInt(+new Date/1e3)):(a=this.options.url,a=a+(a.indexOf("?")===-1?"?":"&")+(this.oldAPI?"cmd=open&current="+i.phash:"cmd=file")+"&target="+i.hash+"&_t="+(i.ts||parseInt(+new Date/1e3)),n&&(a+="&download=1"),e.each(this.customData,function(e,t){a+="&"+encodeURIComponent(e)+"="+encodeURIComponent(t)}),a):""},this.tmb=function(t){var n,i,a="elfinder-cwd-bgurl",o="";return!(!e.isPlainObject(t)||(u.searchStatus.state&&0!==t.hash.indexOf(u.cwd().volumeid)?(n=u.option("tmbUrl",t.hash),i=u.option("tmbCrop",t.hash)):(n=O.tmbUrl,i=O.tmbCrop),i&&(a+=" elfinder-cwd-bgurl-crop"),"self"===n&&0===t.mime.indexOf("image/")?(o=u.openUrl(t.hash),a+=" elfinder-cwd-bgself"):(u.oldAPI||n)&&t&&t.tmb&&1!=t.tmb?o=n+t.tmb:u.newAPI&&t&&t.tmb&&1!=t.tmb&&(o=t.tmb),!o))&&(t.ts&&"self"!==n&&(o+=(o.match(/\?/)?"&":"?")+"_t="+t.ts),{url:o,className:a})},this.selected=function(){return F.slice(0)},this.selectedFiles=function(){return e.map(F,function(e){return j[e]?Object.assign({},j[e]):null})},this.fileByName=function(e,t){var n;for(n in j)if(j.hasOwnProperty(n)&&j[n].phash==t&&j[n].name==e)return j[n]},this.validResponse=function(e,t){return t.error||this.rules[this.rules[e]?e:"defaults"](t)},this.returnBytes=function(e){var t;return isNaN(e)?(e||(e=""),e=e.replace(/b$/i,""),t=e.charAt(e.length-1).toLowerCase(),e=e.replace(/[tgmk]$/i,""),"t"==t?e=1024*e*1024*1024*1024:"g"==t?e=1024*e*1024*1024:"m"==t?e=1024*e*1024:"k"==t&&(e=1024*e),e=isNaN(e)?0:parseInt(e)):(e=parseInt(e),e<1&&(e=0)),e},this.request=function(t){var n,i,a,o,r=this,l=this.options,c=e.Deferred(),d=(+new Date).toString(16)+Math.floor(1e3*Math.random()).toString(16),p=Object.assign({},r.customData,{mimes:l.onlyMimes},t.data||t),u=p.cmd,h="binary"===(t.options||{}).dataType,f=!t.asNotOpen&&"open"===u,m=!(h||t.preventDefault||t.preventFail),g=!(h||t.preventDefault||t.preventDone),v=Object.assign({},t.notify),b=!!t.cancel,y=h||!!t.raw,w=t.syncOnFail,x=!!t.lazy,k=t.prepare,C=t.navigate,z=(t.options||{}).cache,T=Object.assign({url:l.url,async:!0,type:this.requestType,dataType:"json",cache:r.api>=2.1029,data:p,headers:this.customHeaders,xhrFields:this.xhrFields},t.options||{}),A=function(t){t.warning&&r.error(t.warning),f?J(t):r.updateCache(t),t.changed&&t.changed.length&&Z(t.changed),r.lazy(function(){t.removed&&t.removed.length&&r.remove(t),t.added&&t.added.length&&r.add(t),t.changed&&t.changed.length&&r.change(t)}).then(function(){return r.lazy(function(){r.trigger(u,t,!1)})}).then(function(){return r.lazy(function(){r.trigger(u+"done")})}).then(function(){t.toasts&&Array.isArray(t.toasts)&&e.each(t.toasts,function(){this.msg&&r.toast(this)}),t.sync&&r.sync()})},j=function(e,t){var n,i,a=r.options.debug;switch(t){case"abort":n=e.quiet?"":["errConnect","errAbort"];break;case"timeout":n=["errConnect","errTimeout"];break;case"parsererror":n=["errResponse","errDataNotJSON"],e.responseText&&(!S||a&&("all"===a||a["backend-error"]))&&n.push(e.responseText);break;default:if(e.responseText)try{i=JSON.parse(e.responseText),i&&i.error&&(n=i.error)}catch(o){}if(!n)if(403==e.status)n=["errConnect","errAccess","HTTP error "+e.status];else if(404==e.status)n=["errConnect","errNotFound","HTTP error "+e.status];else if(e.status>=500)n=["errResponse","errServerError","HTTP error "+e.status];else{if(414==e.status&&"get"===T.type)return T.type="post",r.abortXHR(e),void(c.xhr=e=r.transport.send(T).fail(n).done(M));n=e.quiet?"":["errConnect","HTTP error "+e.status]}}r.trigger(u+"done"),c.reject({error:n},e,t)},M=function(t){var n=r.options.debug;if(r.currentReqCmd=u,!t.debug||n&&"all"===n||(n||(n=r.options.debug={}),n["backend-error"]=!0,n.warning=!0),y)return r.abortXHR(i),t&&t.debug&&r.debug("backend-debug",t),c.resolve(t);if(!t)return c.reject({error:["errResponse","errDataEmpty"]},i,t);if(!e.isPlainObject(t))return c.reject({error:["errResponse","errDataNotJSON"]},i,t);if(t.error)return f&&e.each(r.leafRoots,function(t,n){r.leafRoots[t]=e.grep(n,function(e){return e!==p.target})}),c.reject({error:t.error},i,t);var a=function(){var n,a=function(n){r.leafRoots[p.target]&&t[n]&&e.each(r.leafRoots[p.target],function(e,i){var a;(a=r.file(i))&&t[n].push(a)})},o=function(){r.textMimes={},e.each(r.res("mimes","text"),function(){r.textMimes[this.toLowerCase()]=!0})};return f?a("files"):"tree"===u&&a("tree"),t=r.normalize(t),r.validResponse(u,t)?(f&&(r.api||(r.api=t.api||1,"2.0"==r.api&&"undefined"!=typeof t.options.uploadMaxSize&&(r.api="2.1"),r.newAPI=r.api>=2,r.oldAPI=!r.newAPI),t.textMimes&&Array.isArray(t.textMimes)&&(r.resources.mimes.text=t.textMimes,o()),!r.textMimes&&o(),t.options&&(O=Object.assign({},I,t.options)),t.netDrivers&&(r.netDrivers=t.netDrivers),t.maxTargets&&(r.maxTargets=t.maxTargets),p.init&&(r.uplMaxSize=r.returnBytes(t.uplMaxSize),r.uplMaxFile=t.uplMaxFile?Math.min(parseInt(t.uplMaxFile),50):20)),"function"==typeof k&&k(t),C&&(n=C.target||"added",t[n]&&t[n].length&&r.one(u+"done",function(){var i=t[n],a=r.findCwdNodes(i),o=function(){var t=r.cwd().hash;return e.map(i,function(e){return e.phash&&t===e.phash?e.hash:null})},s=o(),l=function(t){var n,i,a,l=void 0,c=t.action?t.action.data:void 0;return(c||s.length)&&t.action&&(i=t.action.msg)&&(n=t.action.cmd)&&(!t.action.cwdNot||t.action.cwdNot!==r.cwd().hash)&&(a=t.action.done,c=t.action.data,l=e("<div/>").append(e('<button type="button" class="ui-button ui-widget ui-state-default ui-corner-all elfinder-tabstop"><span class="ui-button-text">'+r.i18n(i)+"</span></button>").on("mouseenter mouseleave",function(t){e(this).toggleClass("ui-state-hover","mouseenter"==t.type)}).on("click",function(){r.exec(n,c||s,{_userAction:!0,_currentType:"toast",_currentNode:e(this)}),a&&r.one(n+"done",function(){"function"==typeof a?a():"select"===a&&r.trigger("selectfiles",{files:o()})})}))),delete t.action,t.extNode=l,t};C.toast||(C.toast={}),!C.noselect&&r.trigger("selectfiles",{files:r.searchStatus.state>1?e.map(i,function(e){return e.hash}):s}),a.length?(C.noscroll||(a.first().trigger("scrolltoview",{blink:!1}),r.resources.blink(a,"lookme")),e.isPlainObject(C.toast.incwd)&&r.toast(l(C.toast.incwd))):e.isPlainObject(C.toast.inbuffer)&&r.toast(l(C.toast.inbuffer))})),c.resolve(t),void(t.debug&&r.debug("backend-debug",t))):c.reject({error:t.norError||"errResponse"},i,t)};r.abortXHR(i),x?r.lazy(a):a()},D=function(e){i&&"pending"===i.state()&&(r.abortXHR(i,{quiet:!0,abort:!0}),(!e||"unload"!==e.type&&"destroy"!==e.type)&&r.autoSync())},F=function(e){if(r.trigger(u+"done"),"autosync"==e.type){if("stop"!=e.data.action)return}else if(!("unload"==e.type||"destroy"==e.type||"openxhrabort"==e.type||e.data.added&&e.data.added.length))return;D(e)},E=function(t){var n=function(){w=!1,c.reject()};if(t&&"cmd"===t)return u;if(f){if(ie)return c.reject();ie=!0}if(c.always(function(){delete T.headers["X-elFinderReqid"]}).fail(function(t,n,i){var a={cmd:u,err:t,xhr:n,rc:i};0===t&&ne.length&&(ne=e.grep(ne,function(e){return e("cmd")!==u})),r.trigger("requestError",a),a._event&&a._event.isDefaultPrevented()&&(m=!1,w=!1,t&&(t.error="")),D(),f&&(o=r.file(p.target),o&&o.volumeid&&r.isRoot(o)&&delete r.volumeExpires[o.volumeid]),r.trigger(u+"fail",i),t&&(m?r.error(t):r.debug("error",r.i18n(t))),w&&r.sync()}),!u)return w=!1,c.reject({error:"errCmdReq"});if(r.maxTargets&&p.targets&&p.targets.length>r.maxTargets)return w=!1,c.reject({error:["errMaxTargets",r.maxTargets]});if(g&&c.done(A),f){for(;a=q.pop();)a.queueAbort();if(S!==p.target)for(;a=H.pop();)a.queueAbort()}return e.inArray(u,(r.cmdsToAdd+" autosync").split(" "))!==-1&&("autosync"!==u&&(r.autoSync("stop"),c.always(function(){r.autoSync()})),r.trigger("openxhrabort")),delete T.preventFail,r.api>=2.1029&&(z?T.headers["X-elFinderReqid"]=d:Object.assign(T.data,{reqid:d})),c.syncOnFail=function(e){w=!!e},te++,c.xhr=i=r.transport.send(T).always(function(){T._xhr&&"undefined"!=typeof T._xhr.responseURL&&(i.responseURL=T._xhr.responseURL||""),--te,ne.length?ne.shift()():ie=!1}).fail(j).done(M),r.api>=2.1029&&(i._requestId=d),f||p.compare&&"info"===u?(i.queueAbort=n,q.unshift(i),p.compare&&r.bind(r.cmdsToAdd+" autosync openxhrabort",F),c.always(function(){var t=e.inArray(i,q);p.compare&&r.unbind(r.cmdsToAdd+" autosync openxhrabort",F),t!==-1&&q.splice(t,1)})):e.inArray(u,r.abortCmdsOnOpen)!==-1&&(i.queueAbort=n,H.unshift(i),c.always(function(){var t=e.inArray(i,H);t!==-1&&H.splice(t,1)})),r.bind("unload destroy",F),c.always(function(){r.unbind("unload destroy",F)}),c},U=function(){return v.type&&v.cnt&&(b&&(v.cancel=c,t.eachCancel&&(v.id=+new Date)),n=setTimeout(function(){r.notify(v),c.always(function(){v.cnt=-(parseInt(v.cnt)||0),r.notify(v)})},r.notifyDelay),c.always(function(){clearTimeout(n)})),f&&(ie=!1),te<s?E():(f?ne.unshift(E):ne.push(E),c)},P={opts:t,result:!0};return r.api||p.init?(r.trigger("request."+u,P,!0),P.result?"object"==typeof P.result&&P.result.promise?(P.result.done(U).fail(function(){r.trigger(u+"done"),c.reject()}),c):U():(r.trigger(u+"done"),c.reject())):(w=!1,c.reject())},this.cache=function(e){Array.isArray(e)||(e=[e]),Y(e)},this.updateCache=function(t){e.isPlainObject(t)&&(t.files&&t.files.length&&Y(t.files,"files"),t.tree&&t.tree.length&&Y(t.tree,"tree"),t.removed&&t.removed.length&&Q(t.removed),t.added&&t.added.length&&Y(t.added,"add"),t.changed&&t.changed.length&&Z(t.changed,"change"))},this.diff=function(t,n,i){var a={},o=[],r=[],s=[],l=null,c=function(e){for(var t=s.length;t--;)if(s[t].hash==e)return!0};return e.each(t,function(e,t){a[t.hash]=t}),i&&i.length&&(l={},e.each(i,function(){l[this]=!0})),e.each(j,function(e,t){a[e]||n&&t.phash!==n||r.push(e)}),e.each(a,function(t,n){var i,a=j[t],r={};a?(e.each(Object.keys(a),function(){r[this]=!0}),e.each(n,function(e){if(delete r[e],!(l&&l[e]||n[e]===a[e]))return s.push(n),r={},!1}),i=Object.keys(r).length,0!==i&&(l&&e.each(r,function(e){l[e]&&--i}),0!==i&&s.push(n))):o.push(n)}),e.each(r,function(t,n){var i=j[n],o=i.phash;o&&"directory"==i.mime&&e.inArray(o,r)===-1&&a[o]&&!c(o)&&s.push(a[o])}),{added:o,removed:r,changed:s}},this.sync=function(t,n){this.autoSync("stop");var i=this,a=function(){var i="",a=0,o=0;return t&&n&&e.each(j,function(e,n){n.phash&&n.phash===t&&(++a,o=Math.max(o,n.ts)),i=a+":"+o}),i},o=a(),r=e.Deferred().done(function(){i.trigger("sync")}),s=[this.request({data:{cmd:"open",reload:1,target:S,tree:!t&&this.ui.tree?1:0,compare:o},preventDefault:!0})],l=function(){for(var e,t=[],n=i.file(i.root(S)),a=n?n.volumeid:null,o=i.cwd().phash;o;)(e=i.file(o))?(0!==o.indexOf(a)&&(t.push({target:o,cmd:"tree"}),i.isRoot(e)||t.push({target:o,cmd:"parents"}),n=i.file(i.root(o)),a=n?n.volumeid:null),o=e.phash):o=null;return t};return!t&&i.api>=2&&(S!==this.root()&&s.push(this.request({data:{cmd:"parents",target:S},preventDefault:!0})),e.each(l(),function(e,t){s.push(i.request({data:{cmd:t.cmd,target:t.target},preventDefault:!0}))})),e.when.apply(e,s).fail(function(t,a){n&&e.inArray("errOpen",t)===-1?r.reject(t&&0!=a.status?t:void 0):(r.reject(t),i.parseError(t)&&i.request({data:{cmd:"open",target:i.lastDir("")||i.root(),tree:1,init:1},notify:{type:"open",cnt:1,hideCnt:!0}}))}).done(function(e){var n,a,s;if(e.cwd.compare&&o===e.cwd.compare)return r.reject();if(n={tree:[]},a=arguments.length,a>1)for(s=1;s<a;s++)arguments[s].tree&&arguments[s].tree.length&&n.tree.push.apply(n.tree,arguments[s].tree);if(i.api<2.1&&(n.tree||(n.tree=[]),n.tree.push(e.cwd)),e=i.normalize(e),!i.validResponse("open",e))return r.reject(e.norError||"errResponse");if(n=i.normalize(n),!i.validResponse("tree",n))return r.reject(n.norError||"errResponse");var l=i.diff(e.files.concat(n&&n.tree?n.tree:[]),t);return l.added.push(e.cwd),i.updateCache(l),l.removed.length&&i.remove(l),l.added.length&&i.add(l),l.changed.length&&i.change(l),r.resolve(l)}).always(function(){i.autoSync()}),r},this.upload=function(e){return this.transport.upload(e,this)},this.shortcut=function(t){var n,i,a,o,r;if(this.options.allowShortcuts&&t.pattern&&e.isFunction(t.callback))for(n=t.pattern.toUpperCase().split(/\s+/),o=0;o<n.length;o++)i=n[o],r=i.split("+"),a=1==(a=r.pop()).length?a>0?a:a.charCodeAt(0):a>0?a:e.ui.keyCode[a],a&&!U[i]&&(U[i]={keyCode:a,altKey:e.inArray("ALT",r)!=-1,ctrlKey:e.inArray("CTRL",r)!=-1,shiftKey:e.inArray("SHIFT",r)!=-1,type:t.type||"keydown",callback:t.callback,description:t.description,pattern:i});return this},this.shortcuts=function(){var t=[];return e.each(U,function(e,n){t.push([n.pattern,u.i18n(n.description)])}),t},this.clipboard=function(t,n){var i=function(){return e.map(P,function(e){return e.hash})};return void 0!==t&&(P.length&&this.trigger("unlockfiles",{files:i()}),R={},P=e.map(t||[],function(e){var t=j[e];return t?(R[e]=!0,{hash:e,phash:t.phash,name:t.name,mime:t.mime,read:t.read,locked:t.locked,cut:!!n}):null}),this.trigger("changeclipboard",{clipboard:P.slice(0,P.length)}),n&&this.trigger("lockfiles",{
files:i()})),P.slice(0,P.length)},this.isCommandEnabled=function(e,t){var n,i,a=u.cwd().volumeid||"";return!t&&u.searchStatus.state>1&&u.selected().length&&(t=u.selected()[0]),n=!t||a&&0===t.indexOf(a)?O.disabledFlip:u.option("disabledFlip",t),i=this._commands[e],!!i&&(i.alwaysEnabled||!n[e])},this.exec=function(t,n,i,a){var o,r;return!a&&this.commandMap[t]&&"hidden"!==this.commandMap[t]&&(t=this.commandMap[t]),"open"===t&&((this.searchStatus.state||this.searchStatus.ininc)&&this.trigger("searchend",{noupdate:!0}),this.autoSync("stop")),!a&&n&&(e.isArray(n)?n.length&&(a=n[0]):a=n),o=this._commands[t]&&this.isCommandEnabled(t,a)?this._commands[t].exec(n,i):e.Deferred().reject("No such command"),r=typeof o,"object"===r&&o.promise||(u.debug("warning",'"cmd.exec()" should be returned "jQuery.Deferred" but cmd "'+t+'" returned "'+r+'"'),o=e.Deferred().resolve()),this.trigger("exec",{dfrd:o,cmd:t,files:n,opts:i,dstHash:a}),o},this.dialog=function(t,n){var i=e("<div/>").append(t).appendTo(m).elfinderdialog(n,u),a=i.closest(".ui-dialog"),o=function(){!i.data("draged")&&i.is(":visible")&&i.elfinderdialog("posInit")};return a.length&&(u.bind("resize",o),a.on("remove",function(){u.unbind("resize",o)})),i},this.toast=function(t){return e('<div class="ui-front"/>').appendTo(this.ui.toast).elfindertoast(t||{},this)},this.getUI=function(t){return this.ui[t]||(t?e():m)},this.getCommand=function(e){return void 0===e?this._commands:this._commands[e]},this.resize=function(t,n){var i,a=function(){for(var e=m.outerHeight(!0)-m.innerHeight(),t=m;t.get(0)!==W.get(0)&&(t=t.parent(),e+=t.outerHeight(!0)-t.innerHeight(),t.parent().length););return e},o=!m.hasClass("ui-resizable"),r=m.data("resizeSize")||{w:0,h:0},s={};W&&W.data("resizeTm")&&clearTimeout(W.data("resizeTm")),"string"==typeof n&&(i=n.match(/^([0-9.]+)%$/))&&(W&&W.length||(W=e(window)),W.data("marginToMyNode")||W.data("marginToMyNode",a()),W.data("fitToBaseFunc")||W.data("fitToBaseFunc",function(e){var t=W.data("resizeTm");e.preventDefault(),e.stopPropagation(),t&&cancelAnimationFrame(t),m.hasClass("elfinder-fullscreen")||u.UA.Mobile&&W.data("rotated")===u.UA.Rotated||(W.data("rotated",u.UA.Rotated),W.data("resizeTm",requestAnimationFrame(function(){u.restoreSize()})))}),"undefined"==typeof W.data("rotated")&&W.data("rotated",u.UA.Rotated),n=W.height()*(i[1]/100)-W.data("marginToMyNode"),W.off("resize."+u.namespace,W.data("fitToBaseFunc")),o&&W.on("resize."+u.namespace,W.data("fitToBaseFunc"))),m.css({width:t,height:parseInt(n)}),s.w=Math.round(m.width()),s.h=Math.round(m.height()),m.data("resizeSize",s),s.w===r.w&&s.h===r.h||(m.trigger("resize"),this.trigger("resize",{width:s.w,height:s.h}))},this.restoreSize=function(){this.resize(N,L)},this.show=function(){m.show(),this.enable().trigger("show")},this.hide=function(){this.options.enableAlways&&(T=z,z=!1),this.disable(),this.trigger("hide"),m.hide()},this.lazy=function(t,n,i){var a=function(e){var t,n=m.data("lazycnt");e?(t=!m.data("lazyrepaint")&&i.repaint,n?m.data("lazycnt",++n):m.data("lazycnt",1).addClass("elfinder-processing"),t&&m.data("lazyrepaint",!0).css("display")):n&&n>1?m.data("lazycnt",--n):(t=m.data("lazyrepaint"),m.data("lazycnt",0).removeData("lazyrepaint").removeClass("elfinder-processing"),t&&m.css("display"),u.trigger("lazydone"))},o=e.Deferred(),r=function(){o.resolve(t.call(o)),a(!1)};return n=n||0,i=i||{},a(!0),n?setTimeout(r,n):requestAnimationFrame(r),o},this.destroy=function(){m&&m[0].elfinder&&(m.hasClass("elfinder-fullscreen")&&u.toggleFullscreen(m),this.options.syncStart=!1,this.autoSync("forcestop"),this.trigger("destroy").disable(),P=[],F=[],E={},U={},e(window).off("."+y),e(document).off("."+y),u.trigger=function(){},e(K).remove(),m.off().removeData().empty().append(v.contents()).attr("class",v.attr("class")).attr("style",v.attr("style")),delete m[0].elfinder,e.each(g,function(t,n){e.each(n,function(e,t){m.on(t.type+(t.namespace?"."+t.namespace:""),t.selector,t.handler)})}))},this.autoSync=function(t){var n;if(u.options.sync>=1e3){if(r&&(clearTimeout(r),r=null,u.trigger("autosync",{action:"stop"})),"stop"===t?++V:V=Math.max(0,--V),V||"forcestop"===t||!u.options.syncStart)return;n=function(t){var i;O.syncMinMs&&(t||r)&&(t&&u.trigger("autosync",{action:"start"}),i=Math.max(u.options.sync,O.syncMinMs),r&&clearTimeout(r),r=setTimeout(function(){var t,a=!0,o=S;O.syncChkAsTs&&j[o]&&(t=j[o].ts)?u.request({data:{cmd:"info",targets:[o],compare:t,reload:1},preventDefault:!0}).done(function(e){var i;a=!0,e.compare&&(i=e.compare,i==t&&(a=!1)),a?u.sync(o).always(function(){i&&(j[o].ts=i),n()}):n()}).fail(function(t,a){var o=u.parseError(t);o&&0!=a.status?(u.error(o),Array.isArray(o)&&e.inArray("errOpen",o)!==-1&&u.request({data:{cmd:"open",target:u.lastDir("")||u.root(),tree:1,init:1},notify:{type:"open",cnt:1,hideCnt:!0}})):r=setTimeout(function(){n()},i)}):u.sync(S,!0).always(function(){n()})},i))},n(!0)}},this.insideWorkzone=function(e,t,n){var i=this.getUI("workzone").data("rectangle");return n=n||1,!(e<i.left+n||e>i.left+i.width+n||t<i.top+n||t>i.top+i.height+n)},this.toFront=function(t){var n=m.children(".ui-front").removeClass("elfinder-frontmost"),i=n.last();n.css("z-index",""),e(t).addClass("ui-front elfinder-frontmost").css("z-index",i.css("z-index")+1)},this.toHide=function(t,n){var i,a=e(t);!n&&a.hide(),a.hasClass("elfinder-frontmost")&&(a.removeClass("elfinder-frontmost"),i=m.children(".ui-front:visible:not(.elfinder-frontmost)").last(),i.length&&requestAnimationFrame(function(){m.children(".elfinder-frontmost:visible").length||(u.toFront(i),i.trigger("frontmost"))}))},this.getMaximizeCss=function(){return{width:"100%",height:"100%",margin:0,top:0,left:0,display:"block",position:"fixed",zIndex:Math.max(u.zIndex?u.zIndex+1:0,1e3),maxWidth:"",maxHeight:""}},function(){re&&u.UA.Fullscreen&&(u.UA.Fullscreen=!1,se&&"undefined"!=typeof se.attr("allowfullscreen")&&(u.UA.Fullscreen=!0));var t,n,i,a="elfinder-fullscreen",o="elfinder-fullscreen-native",r=function(){var t=0,n=0;e.each(m.children(".ui-dialog,.ui-draggable"),function(i,a){var o=e(a),r=o.position();r.top<0&&(o.css("top",t),t+=20),r.left<0&&(o.css("left",n),n+=20)})},s=u.UA.Fullscreen?{fullElm:function(){return document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement||null},exitFull:function(){return document.exitFullscreen?document.exitFullscreen():document.webkitExitFullscreen?document.webkitExitFullscreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.msExitFullscreen?document.msExitFullscreen():void 0},toFull:function(e){return e.requestFullscreen?e.requestFullscreen():e.webkitRequestFullscreen?e.webkitRequestFullscreen():e.mozRequestFullScreen?e.mozRequestFullScreen():!!e.msRequestFullscreen&&e.msRequestFullscreen()}}:{fullElm:function(){var e;return m.hasClass(a)?m.get(0):(e=m.find("."+a),e.length?e.get(0):null)},exitFull:function(){var i;e(window).off("resize."+y,c),void 0!==n&&e("body").css("overflow",n),n=void 0,t&&(i=t.elm,l(i),e(i).trigger("resize",{fullscreen:"off"})),e(window).trigger("resize")},toFull:function(t){return n=e("body").css("overflow")||"",e("body").css("overflow","hidden"),e(t).css(u.getMaximizeCss()).addClass(a).trigger("resize",{fullscreen:"on"}),r(),e(window).on("resize."+y,c).trigger("resize"),!0}},l=function(n){t&&t.elm==n&&(e(n).removeClass(a+" "+o).attr("style",t.style),t=null)},c=function(t){var n;t.target===window&&(i&&cancelAnimationFrame(i),i=requestAnimationFrame(function(){(n=s.fullElm())&&e(n).trigger("resize",{fullscreen:"on"})}))};e(document).on("fullscreenchange."+y+" webkitfullscreenchange."+y+" mozfullscreenchange."+y+" MSFullscreenChange."+y,function(n){if(u.UA.Fullscreen){var d=s.fullElm(),p=e(window);i&&cancelAnimationFrame(i),null===d?(p.off("resize."+y,c),t&&(d=t.elm,l(d),e(d).trigger("resize",{fullscreen:"off"}))):(e(d).addClass(a+" "+o).attr("style","width:100%; height:100%; margin:0; padding:0;").trigger("resize",{fullscreen:"on"}),p.on("resize."+y,c),r()),p.trigger("resize")}}),u.toggleFullscreen=function(n,i){var a=e(n).get(0),o=null;if(o=s.fullElm()){if(o==a){if(i===!0)return o}else if(i===!1)return o;return s.exitFull(),null}return i===!1?null:(t={elm:a,style:e(a).attr("style")},s.toFull(a)!==!1?a:(t=null,null))}}(),function(){var t,n="elfinder-maximized",i=function(e){if(e.target===window&&e.data&&e.data.elm){var n=e.data.elm;t&&cancelAnimationFrame(t),t=requestAnimationFrame(function(){n.trigger("resize",{maximize:"on"})})}},a=function(t){e(window).off("resize."+y,i),e("body").css("overflow",t.data("bodyOvf")),t.removeClass(n).attr("style",t.data("orgStyle")).removeData("bodyOvf").removeData("orgStyle"),t.trigger("resize",{maximize:"off"})},o=function(t){t.data("bodyOvf",e("body").css("overflow")||"").data("orgStyle",t.attr("style")).addClass(n).css(u.getMaximizeCss()),e("body").css("overflow","hidden"),e(window).on("resize."+y,{elm:t},i),t.trigger("resize",{maximize:"on"})};u.toggleMaximize=function(t,i){var r=e(t),s=r.hasClass(n);if(s){if(i===!0)return;a(r)}else{if(i===!1)return;o(r)}}}(),Object.assign(e.ui.keyCode,{F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,DIG0:48,DIG1:49,DIG2:50,DIG3:51,DIG4:52,DIG5:53,DIG6:54,DIG7:55,DIG8:56,DIG9:57,NUM0:96,NUM1:97,NUM2:98,NUM3:99,NUM4:100,NUM5:101,NUM6:102,NUM7:103,NUM8:104,NUM9:105,CONTEXTMENU:93,DOT:190}),this.dragUpload=!1,this.xhrUpload=("undefined"!=typeof XMLHttpRequestUpload||"undefined"!=typeof XMLHttpRequestEventTarget)&&"undefined"!=typeof File&&"undefined"!=typeof FormData,this.transport={},"object"==typeof this.options.transport&&(this.transport=this.options.transport,"function"==typeof this.transport.init&&this.transport.init(this)),"function"!=typeof this.transport.send&&(this.transport.send=function(t){return u.UA.IE||(t._xhr=new XMLHttpRequest,t.xhr=function(){return t._xhr}),e.ajax(t)}),"iframe"==this.transport.upload?this.transport.upload=e.proxy(this.uploads.iframe,this):"function"==typeof this.transport.upload?this.dragUpload=!!this.options.dragUploadAllow:this.xhrUpload&&this.options.dragUploadAllow?(this.transport.upload=e.proxy(this.uploads.xhr,this),this.dragUpload=!0):this.transport.upload=e.proxy(this.uploads.iframe,this),this.decodeRawString=function(e){var t=function(e){var t,n,i;for(t=0,n=e.length,i=[];t<n;t++)i.push(e.charCodeAt(t));return i},n=function(e){var n,i,a,o=[];for("string"==typeof e&&(e=t(e)),n=0,i=e.length;a=e[n],n<i;n++)a>=55296&&a<=56319?o.push((1023&a)+64<<10|1023&e[++n]):o.push(a);return o},i=function(e){var t,n,i,a,o=String.fromCharCode;for(t=0,n=e.length,a="";i=e[t],t<n;t++)a+=i<=127?o(i):i<=223&&i>=194?o((31&i)<<6|63&e[++t]):i<=239&&i>=224?o((15&i)<<12|(63&e[++t])<<6|63&e[++t]):i<=247&&i>=240?o(55296|((7&i)<<8|(63&e[++t])<<2|e[++t]>>>4&3)-64,56320|(15&e[t++])<<6|63&e[t]):o(65533);return a};return i(n(e))},this.getContents=function(t,n){var i,a,o=this,r=e.Deferred(),s=n||"arraybuffer";return r.fail(function(){a&&"pending"===a.state()&&a.reject()}),i=o.openUrl(t),o.isSameOrigin(i)||(i=o.openUrl(t,!0)),a=o.request({data:{cmd:"get"},options:{url:i,type:"get",cache:!0,dataType:"binary",responseType:s,processData:!1}}).fail(function(){r.reject()}).done(function(e){r.resolve(e)}),r},this.getMimetype=function(e,t){var n,i,a=t;return i=(e+"").match(/\.([^.]+)$/),i&&(n=i[1])&&(o||(o=u.arrayFlip(u.mimeTypes)),(a=o[n.toLowerCase()])||(a=t)),a},u.hashCheckers=[],function(t){var n={check:!0},i=function(e){var i,a=new n.SparkMD5.ArrayBuffer;return i=t.asyncJob(function(e){a.append(e)},e).done(function(){i._md5=a.end()})},a=function(i,a){var o,r;try{o=new n.jsSHA("SHA"+("3"===a.substr(0,1)?a:"-"+a),"ARRAYBUFFER"),r=t.asyncJob(function(e){o.update(e)},i).done(function(){r._sha=o.getHash("HEX")})}catch(s){r=e.Deferred.reject()}return r};t.options.cdns.sparkmd5&&t.hashCheckers.push("md5"),t.options.cdns.jssha&&(t.hashCheckers=t.hashCheckers.concat(["sha1","sha224","sha256","sha384","sha512","sha3-224","sha3-256","sha3-384","sha3-512","shake128","shake256"])),t.getContentsHashes=function(o,r){var s,l=e.Deferred(),c=t.arrayFlip(r||["md5"],!0),d=[],p=[],u={};if(l.fail(function(){s&&s.reject()}),n.check){delete n.check;var h=e.Deferred();window.ArrayBuffer&&t.options.cdns.sparkmd5&&(d.push(h),t.loadScript([t.options.cdns.sparkmd5],function(e){var t=e||window.SparkMD5;window.SparkMD5&&delete window.SparkMD5,h.resolve(),t&&(n.SparkMD5=t)},{tryRequire:!0,error:function(){h.reject()}}));var f=e.Deferred();window.ArrayBuffer&&t.options.cdns.jssha&&(d.push(f),t.loadScript([t.options.cdns.jssha],function(e){var t=e||window.jsSHA;window.jsSHA&&delete window.jsSHA,f.resolve(),t&&(n.jsSHA=t)},{tryRequire:!0,error:function(){f.reject()}}))}return e.when.apply(null,d).always(function(){Object.keys(n).length?s=t.getContents(o).done(function(r){var s=r instanceof ArrayBuffer&&r.byteLength>0&&t.sliceArrayBuffer(r,1048576);c.md5&&n.SparkMD5&&p.push(function(){var e=i(s).done(function(){var n;u.md5=e._md5,(n=t.file(o))&&(n.md5=e._md5),l.notify(u)});return l.fail(function(){e.reject()}),e}),n.jsSHA&&e.each(["1","224","256","384","512","3-224","3-256","3-384","3-512","ke128","ke256"],function(e,n){c["sha"+n]&&p.push(function(){var e=a(s,n).done(function(){var i;u["sha"+n]=e._sha,(i=t.file(o))&&(i["sha"+n]=e._sha),l.notify(u)});return e})}),p.length?t.sequence(p).always(function(){l.resolve(u)}):l.reject()}).fail(function(){l.reject()}):l.reject()}),l}}(this),this.parseError=function(t){var n=t;return e.isPlainObject(n)&&(n=n.error),n},this.error=function(){var e,t=arguments[0],n=arguments[1]||null;return 1==arguments.length&&"function"==typeof t?u.bind("error",t):(e=this.parseError(t),e!==!0&&e?u.trigger("error",{error:e,opts:n}):this)},e.each(A,function(t,n){u[n]=function(){var t=arguments[0];return 1==arguments.length&&"function"==typeof t?u.bind(n,t):u.trigger(n,e.isPlainObject(t)?t:{})}}),this.enable(function(){!z&&u.api&&u.visible()&&u.ui.overlay.is(":hidden")&&!m.children(".elfinder-dialog."+u.res("class","editing")+":visible").length&&(z=!0,document.activeElement&&document.activeElement.blur(),m.removeClass("elfinder-disabled"))}).disable(function(){T=z,z=!1,m.addClass("elfinder-disabled")}).open(function(){F=[]}).select(function(t){var n=0,i=[];F=e.grep(t.data.selected||t.data.value||[],function(e){return i.length||u.maxTargets&&++n>u.maxTargets?(i.push(e),!1):!!j[e]}),i.length&&(u.trigger("unselectfiles",{files:i,inselect:!0}),u.toast({mode:"warning",msg:u.i18n(["errMaxTargets",u.maxTargets])}))}).error(function(t){var n,i,a={cssClass:"elfinder-dialog-error",title:u.i18n("error"),resizable:!1,destroyOnClose:!0,buttons:{}},o=u.getUI(),r=o.children(".elfinder-dialog-error").length;r<u.options.maxErrorDialogs?(a.buttons[u.i18n(u.i18n("btnClose"))]=function(){e(this).elfinderdialog("close")},t.data.opts&&e.isPlainObject(t.data.opts)&&Object.assign(a,t.data.opts),u.dialog('<span class="elfinder-dialog-icon elfinder-dialog-icon-error"/>'+u.i18n(t.data.error),a)):(n=o.children(".elfinder-dialog-error:last").children(".ui-dialog-content:first"),i=n.children(".elfinder-error-counter"),i.length?i.data("cnt",parseInt(i.data("cnt"))+1).html(u.i18n(["moreErrors",i.data("cnt")])):(i=e('<span class="elfinder-error-counter">'+u.i18n(["moreErrors",1])+"</span>").data("cnt",1),n.append("<br/>",i)))}).bind("tmb",function(t){e.each(t.data.images||[],function(e,t){j[e]&&(j[e].tmb=t)})}).bind("searchstart",function(e){Object.assign(u.searchStatus,e.data),u.searchStatus.state=1}).bind("search",function(e){u.searchStatus.state=2}).bind("searchend",function(){u.searchStatus.state=0,u.searchStatus.ininc=!1,u.searchStatus.mixed=!1}).bind("canMakeEmptyFile",function(t){var n=t.data,i={};n&&Array.isArray(n.mimes)&&(n.unshift||(i=u.mimesCanMakeEmpty),e.each(n.mimes,function(){i[this]||(i[this]=u.mimeTypes[this])}),n.unshift&&(u.mimesCanMakeEmpty=Object.assign(i,u.mimesCanMakeEmpty)))}).bind("themechange",function(){requestAnimationFrame(function(){u.trigger("uiresize")})}),!0===this.options.sound&&this.bind("playsound",function(t){var n=K.canPlayType&&K.canPlayType('audio/wav; codecs="1"'),i=t.data&&t.data.soundFile;n&&i&&""!=n&&"no"!=n&&e(K).html('<source src="'+B+i+'" type="audio/wav">')[0].play()}),e.each(this.options.handlers,function(e,t){u.bind(e,t)}),this.history=new this.history(this),this.roots={},this.leafRoots={},this.volumeExpires={},this._commands={},Array.isArray(this.options.commands)||(this.options.commands=[]),e.inArray("*",this.options.commands)!==-1&&(this.options.commands=Object.keys(this.commands)),this.commandMap={},this.volOptions={},this.hasVolOptions=!1,this.trashes={},this.optionsByHashes={},this.uiAutoHide=[],this.one("open",function(){u.uiAutoHide.length&&setTimeout(function(){u.trigger("uiautohide")},500)}),this.bind("uiautohide",function(){u.uiAutoHide.length&&u.uiAutoHide.shift()()}),this.options.width&&(N=this.options.width),this.options.height&&(L=this.options.height),this.options.heightBase&&(W=e(this.options.heightBase)),B=this.options.soundPath?this.options.soundPath.replace(/\/+$/,"")+"/":this.baseUrl+B,u.one("opendone",function(){var t;e(document).on("click."+y,function(t){z&&!u.options.enableAlways&&!e(t.target).closest(m).length&&u.disable()}).on(x+" "+k+" "+C+" "+w,ae),u.options.useBrowserHistory&&e(window).on("popstate."+y,function(t){var n,i,a=t.originalEvent.state||{},o=!!a.thash,r=m.find(".elfinder-frontmost:visible"),s=m.find(".elfinder-navbar-dir,.elfinder-cwd-filename").find("input,textarea");o||(a={thash:u.cwd().hash},e("html,body").animate({scrollTop:m.offset().top})),r.length||s.length?(history.pushState(a,null,location.pathname+location.search+"#elf_"+a.thash),r.length?r.hasClass(u.res("class","preventback"))||(r.hasClass("elfinder-contextmenu")?e(document).trigger(e.Event("keydown",{keyCode:e.ui.keyCode.ESCAPE,ctrlKey:!1,shiftKey:!1,altKey:!1,metaKey:!1})):r.hasClass("elfinder-dialog")?r.elfinderdialog("close"):r.trigger("close")):s.trigger(e.Event("keydown",{keyCode:e.ui.keyCode.ESCAPE,ctrlKey:!1,shiftKey:!1,altKey:!1,metaKey:!1}))):o?!e.isEmptyObject(u.files())&&u.request({data:{cmd:"open",target:a.thash,onhistory:1},notify:{type:"open",cnt:1,hideCnt:!0},syncOnFail:!0}):(n=function(){i.trigger("click")},u.one("open",n,!0),i=u.toast({msg:u.i18n("pressAgainToExit"),onHidden:function(){u.unbind("open",n),history.pushState(a,null,location.pathname+location.search+"#elf_"+a.thash)}}))}),e(window).on("resize."+y,function(e){e.target===this&&(t&&cancelAnimationFrame(t),t=requestAnimationFrame(function(){var e=m.data("resizeSize")||{w:0,h:0},t={w:Math.round(m.width()),h:Math.round(m.height())};m.data("resizeSize",t),t.w===e.w&&t.h===e.h||(m.trigger("resize"),u.trigger("resize",{width:t.w,height:t.h}))}))}).on("beforeunload."+y,function(t){var n,i;return m.is(":visible")&&(u.ui.notify.children().length&&e.inArray("hasNotifyDialog",u.options.windowCloseConfirm)!==-1?n=u.i18n("ntfsmth"):m.find("."+u.res("class","editing")).length&&e.inArray("editingFile",u.options.windowCloseConfirm)!==-1?n=u.i18n("editingFile"):(i=Object.keys(u.selected()).length)&&e.inArray("hasSelectedItem",u.options.windowCloseConfirm)!==-1?n=u.i18n("hasSelected",""+i):(i=Object.keys(u.clipboard()).length)&&e.inArray("hasClipboardData",u.options.windowCloseConfirm)!==-1&&(n=u.i18n("hasClipboard",""+i)),n)?(t.returnValue=n,n):void u.trigger("unload")}),e(window).on("message."+y,function(e){var t,n,i=e.originalEvent||null;if(i&&0===u.uploadURL.indexOf(i.origin))try{t=JSON.parse(i.data),n=t.data||null,n&&(n.error?(t.bind&&u.trigger(t.bind+"fail",n),u.error(n.error)):(n.warning&&u.error(n.warning),u.updateCache(n),n.removed&&n.removed.length&&u.remove(n),n.added&&n.added.length&&u.add(n),n.changed&&n.changed.length&&u.change(n),t.bind&&(u.trigger(t.bind,n),u.trigger(t.bind+"done")),n.sync&&u.sync()))}catch(e){u.sync()}}),u.options.enableAlways?(e(window).on("focus."+y,function(e){e.target===this&&u.enable()}),re&&e(window.top).on("focus."+y,function(){!u.enable()||se&&!se.is(":visible")||requestAnimationFrame(function(){e(window).trigger("focus")})})):re&&e(window).on("blur."+y,function(e){z&&e.target===this&&u.disable()}),re&&m.on("click",function(t){e(window).trigger("focus")}),u.options.enableByMouseOver&&m.on("mouseenter touchstart",function(t){re&&e(window).trigger("focus"),!u.enabled()&&u.enable()})}),m[0].elfinder=this,h.push(function(){var t=u.lang,n=u.i18nBaseUrl+"elfinder."+t+".js",i=e.Deferred().done(function(){u.i18[t]&&(u.lang=t),u.trigger("i18load"),c="en"===u.lang?u.i18.en:e.extend(!0,{},u.i18.en,u.i18[u.lang])});return u.i18[t]?i.resolve():(u.lang="en",u.hasRequire?require([n],function(){i.resolve()},function(){i.resolve()}):u.loadScript([n],function(){i.resolve()},{loadType:"tag",error:function(){i.resolve()}})),i}()),d=function(){var t;return u.messages=c.messages,e.fn.selectable&&e.fn.draggable&&e.fn.droppable&&e.fn.resizable&&e.fn.slider?m.length?u.options.url?(t=Object.assign({name:u.i18n("name"),perm:u.i18n("perms"),date:u.i18n("modify"),size:u.i18n("size"),kind:u.i18n("kind"),modestr:u.i18n("mode"),modeoct:u.i18n("mode"),modeboth:u.i18n("mode")},u.options.uiOptions.cwd.listView.columnsCustomName),u.getColumnName=function(e){return t[e]||u.i18n(e)},u.direction=c.direction,u.dateFormat=u.options.dateFormat||c.dateFormat,u.fancyFormat=u.options.fancyDateFormat||c.fancyDateFormat,u.nonameDateFormat=(u.options.nonameDateFormat||c.nonameDateFormat).replace(/[\/\\]/g,"_"),u.cssClass="ui-helper-reset ui-helper-clearfix ui-widget ui-widget-content ui-corner-all elfinder elfinder-"+("rtl"==u.direction?"rtl":"ltr")+(u.UA.Touch?" elfinder-touch"+(u.options.resizable?" touch-punch":""):"")+(u.UA.Mobile?" elfinder-mobile":"")+(u.UA.iOS?" elfinder-ios":"")+" "+u.options.cssClass,m.addClass(u.cssClass).on(w,function(){!z&&u.enable()}),function(){var t,n,i,a,o,r=x+"draggable keyup."+y+"draggable";u.draggable={appendTo:m,addClasses:!1,distance:4,revert:!0,refreshPositions:!1,cursor:"crosshair",cursorAt:{left:50,top:47},scroll:!1,start:function(r,s){var l,c,d=s.helper,p=e.grep(d.data("files")||[],function(e){return!!e&&(R[e]=!0,!0)}),h=!1;for(o=m.attr("style"),m.width(m.width()).height(m.height()),t="ltr"===u.direction,n=u.getUI("workzone").data("rectangle"),i=n.top+n.height,a=i-u.getUI("navdock").outerHeight(!0),u.draggingUiHelper=d,l=p.length;l--;)if(c=p[l],j[c].locked){h=!0,d.data("locked",!0);break}!h&&u.trigger("lockfiles",{files:p}),d.data("autoScrTm",setInterval(function(){d.data("autoScr")&&u.autoScroll[d.data("autoScr")](d.data("autoScrVal"))},50))},drag:function(o,r){var s,l,c,d=r.helper;((l=n.top>o.pageY)||a<o.pageY)&&(s=n.cwdEdge>o.pageX?(t?"navbar":"cwd")+(l?"Up":"Down"):(t?"cwd":"navbar")+(l?"Up":"Down"),l||("cwd"===s.substr(0,3)?i<o.pageY?c=i:s=null:c=a),s&&(d.data("autoScr",s),d.data("autoScrVal",Math.pow(l?n.top-o.pageY:o.pageY-c,1.3)))),s||d.data("autoScr")&&d.data("refreshPositions",1).data("autoScr",null),d.data("refreshPositions")&&e(this).elfUiWidgetInstance("draggable")&&(d.data("refreshPositions")>0?(e(this).draggable("option",{refreshPositions:!0,elfRefresh:!0}),d.data("refreshPositions",-1)):(e(this).draggable("option",{refreshPositions:!1,elfRefresh:!1}),d.data("refreshPositions",null)))},stop:function(t,n){var i,a=n.helper;e(document).off(r),e(this).elfUiWidgetInstance("draggable")&&e(this).draggable("option",{refreshPositions:!1}),u.draggingUiHelper=null,u.trigger("focus").trigger("dragstop"),a.data("droped")||(i=e.grep(a.data("files")||[],function(e){return!!e}),u.trigger("unlockfiles",{files:i}),u.trigger("selectfiles",{files:u.selected()})),u.enable(),m.attr("style",o),a.data("autoScrTm")&&clearInterval(a.data("autoScrTm"))},helper:function(t,n){var i,a,o,s=this.id?e(this):e(this).parents("[id]:first"),l=e('<div class="elfinder-drag-helper"><span class="elfinder-drag-helper-icon-status"/></div>'),c=function(t){var n,i=t.mime,a=u.tmb(t);return n='<div class="elfinder-cwd-icon elfinder-cwd-icon-drag '+u.mime2class(i)+' ui-corner-all"/>',a?n=e(n).addClass(a.className).css("background-image","url('"+a.url+"')").get(0).outerHTML:t.icon&&(n=e(n).css(u.getIconStyle(t,!0)).get(0).outerHTML),t.csscls&&(n='<div class="'+t.csscls+'">'+n+"</div>"),n};return u.draggingUiHelper&&u.draggingUiHelper.stop(!0,!0),u.trigger("dragstart",{target:s[0],originalEvent:t},!0),i=s.hasClass(u.res("class","cwdfile"))?u.selected():[u.navId2Hash(s.attr("id"))],l.append(c(j[i[0]])).data("files",i).data("locked",!1).data("droped",!1).data("namespace",y).data("dropover",0),(a=i.length)>1&&l.append(c(j[i[a-1]])+'<span class="elfinder-drag-num">'+a+"</span>"),e(document).on(r,function(e){var t=e.shiftKey||e.ctrlKey||e.metaKey;o!==t&&(o=t,l.is(":visible")&&l.data("dropover")&&!l.data("droped")&&(l.toggleClass("elfinder-drag-helper-plus",!!l.data("locked")||o),u.trigger(o?"unlockfiles":"lockfiles",{files:i,helper:l})))}),l}}}(),u.commands.getfile&&("function"==typeof u.options.getFileCallback?(u.bind("dblclick",function(e){e.preventDefault(),u.exec("getfile").fail(function(){u.exec("open",e.data&&e.data.file?[e.data.file]:void 0)})}),u.shortcut({pattern:"enter",description:u.i18n("cmdgetfile"),callback:function(){u.exec("getfile").fail(function(){u.exec("mac"==u.OS?"rename":"open")})}}).shortcut({pattern:"ctrl+enter",description:u.i18n("mac"==u.OS?"cmdrename":"cmdopen"),callback:function(){u.exec("mac"==u.OS?"rename":"open")}})):u.options.getFileCallback=null),e.each(u.commands,function(t,n){var i,a,o=Object.assign({},n.prototype);if(e.isFunction(n)&&!u._commands[t]&&(n.prototype.forceLoad||e.inArray(t,u.options.commands)!==-1)){if(i=n.prototype.extendsCmd||""){if(!e.isFunction(u.commands[i]))return!0;n.prototype=Object.assign({},_,new u.commands[i],n.prototype)}else n.prototype=Object.assign({},_,n.prototype);u._commands[t]=new n,n.prototype=o,a=u.options.commandsOptions[t]||{},i&&u.options.commandsOptions[i]&&(a=e.extend(!0,{},u.options.commandsOptions[i],a)),u._commands[t].setup(t,a),u._commands[t].linkedCmds.length&&e.each(u._commands[t].linkedCmds,function(t,n){var i=u.commands[n];e.isFunction(i)&&!u._commands[n]&&(i.prototype=_,u._commands[n]=new i,u._commands[n].setup(n,u.options.commandsOptions[n]||{}))})}}),u.ui={workzone:e("<div/>").appendTo(m).elfinderworkzone(u),navbar:e("<div/>").appendTo(m).elfindernavbar(u,u.options.uiOptions.navbar||{}),navdock:e("<div/>").appendTo(m).elfindernavdock(u,u.options.uiOptions.navdock||{}),contextmenu:e("<div/>").appendTo(m).elfindercontextmenu(u),overlay:e("<div/>").appendTo(m).elfinderoverlay({show:function(){u.disable()},hide:function(){T&&u.enable()}}),cwd:e("<div/>").appendTo(m).elfindercwd(u,u.options.uiOptions.cwd||{}),notify:u.dialog("",{cssClass:"elfinder-dialog-notify",position:u.options.notifyDialog.position,absolute:!0,resizable:!1,autoOpen:!1,closeOnEscape:!1,title:"&nbsp;",width:u.options.notifyDialog.width?parseInt(u.options.notifyDialog.width):null,minHeight:null}),statusbar:e('<div class="ui-widget-header ui-helper-clearfix ui-corner-bottom elfinder-statusbar"/>').hide().appendTo(m),toast:e('<div class="elfinder-toast"/>').appendTo(m),bottomtray:e('<div class="elfinder-bottomtray">').appendTo(m)},u.trigger("uiready"),e.each(u.options.ui||[],function(t,n){var i="elfinder"+n,a=u.options.uiOptions[n]||{};!u.ui[n]&&e.fn[i]&&(u.ui[n]=e("<"+(a.tag||"div")+"/>").appendTo(m),u.ui[n][i](u,a))}),u.resize(N,L),u.options.resizable&&(m.resizable({resize:function(e,t){u.resize(t.size.width,t.size.height)},handles:"se",minWidth:300,minHeight:200}),u.UA.Touch&&m.addClass("touch-punch")),function(){var e=u.getUI("navbar"),t=u.getUI("cwd").parent();u.autoScroll={navbarUp:function(t){e.scrollTop(Math.max(0,e.scrollTop()-t))},navbarDown:function(t){e.scrollTop(e.scrollTop()+t)},cwdUp:function(e){t.scrollTop(Math.max(0,t.scrollTop()-e))},cwdDown:function(e){t.scrollTop(t.scrollTop()+e)}}}(),u.UA.Touch&&!function(){var e,t,n,i,a,o,r,s,l,c=u.getUI("navbar"),d=u.getUI("toolbar"),p="touchmove.stopscroll",h=function(e){var n=e.originalEvent.touches||[{}],i=n[0].pageY||null;(!t||i<t)&&(e.preventDefault(),s&&clearTimeout(s))},f=function(e){e.preventDefault(),s&&clearTimeout(s)},g=function(){s=setTimeout(function(){m.off(p)},100)},v=50;c=c.children().length?c:null,d=d.length?d:null,m.on("touchstart touchmove touchend",function(s){if("touchend"===s.type)return e=!1,t=!1,void g();var b,y,w,x,k,C=s.originalEvent.touches||[{}],z=C[0].pageX||null,T=C[0].pageY||null,A="ltr"===u.direction;null===z||null===T||"touchstart"===s.type&&C.length>1||("touchstart"===s.type?(n=m.offset(),i=m.width(),c&&(e=!1,c.is(":hidden")?(l||(l=Math.max(50,i/10)),(A?z-n.left:i+n.left-z)<l&&(e=z)):s.originalEvent._preventSwipeX||(o=c.width(),y=A?z<n.left+o:z>n.left+i-o,y?(l=Math.max(50,i/10),e=z):e=!1)),d&&(t=!1,s.originalEvent._preventSwipeY||(r=d.height(),a=n.top,T-a<(d.is(":hidden")?v:r+30)&&(t=T,m.on(p,d.is(":hidden")?f:h))))):(c&&e!==!1&&(b=(A?e>z:e<z)?"navhide":"navshow",w=Math.abs(e-z),("navhide"===b&&w>.6*o||w>("navhide"===b?o/3:45)&&("navshow"===b||(A?z<n.left+20:z>n.left+i-20)))&&(u.getUI("navbar").trigger(b,{handleW:l}),e=!1)),d&&t!==!1&&(x=d.offset().top,Math.abs(t-T)>Math.min(45,r/3)&&(k=t>T?"slideUp":"slideDown",("slideDown"===k||x+20>T)&&(d.is("slideDown"===k?":hidden":":visible")&&d.stop(!0,!0).trigger("toggle",{duration:100,handleH:v}),t=!1)))))})}(),u.dragUpload&&!function(){var t,n,i=function(t){return"TEXTAREA"!==t.target.nodeName&&"INPUT"!==t.target.nodeName&&0===e(t.target).closest("div.ui-dialog-content").length},a="native-drag-enter",o="native-drag-disable",r="class",s=u.res(r,"navdir"),l=(u.res(r,"droppable"),u.res(r,"adroppable"),u.res(r,"navarrow"),u.res(r,"adroppable")),c=u.getUI("workzone"),d="ltr"===u.direction,p=function(){n&&cancelAnimationFrame(n),n=null};m.on("dragenter",function(e){p(),i(e)&&(e.preventDefault(),e.stopPropagation(),t=c.data("rectangle"))}).on("dragleave",function(e){p(),i(e)&&(e.preventDefault(),e.stopPropagation())}).on("dragover",function(e){var a;i(e)?(e.preventDefault(),e.stopPropagation(),e.originalEvent.dataTransfer.dropEffect="none",n||(n=requestAnimationFrame(function(){var i,o=t.top+t.height,r=o-u.getUI("navdock").outerHeight(!0);((a=e.pageY<t.top)||e.pageY>r)&&(i=t.cwdEdge>e.pageX?(d?"navbar":"cwd")+(a?"Up":"Down"):(d?"cwd":"navbar")+(a?"Up":"Down"),a||"cwd"===i.substr(0,3)&&(o<e.pageY?r=o:i=""),i&&u.autoScroll[i](Math.pow(a?t.top-e.pageY:e.pageY-r,1.3))),n=null}))):p()}).on("drop",function(e){p(),i(e)&&(e.stopPropagation(),e.preventDefault())}),m.on("dragenter",".native-droppable",function(t){if(t.originalEvent.dataTransfer){var n,i=e(t.currentTarget),r=t.currentTarget.id||null,s=null;if(!r){s=u.cwd(),i.data(o,!1);try{e.each(t.originalEvent.dataTransfer.types,function(e,t){"elfinderfrom:"===t.substr(0,13)&&(n=t.substr(13).toLowerCase())})}catch(t){}}s&&(!s.write||n&&n===(window.location.href+s.hash).toLowerCase())?i.data(o,!0):(t.preventDefault(),t.stopPropagation(),i.data(a,!0),i.addClass(l))}}).on("dragleave",".native-droppable",function(t){if(t.originalEvent.dataTransfer){var n=e(t.currentTarget);t.preventDefault(),t.stopPropagation(),n.data(a)?n.data(a,!1):n.removeClass(l)}}).on("dragover",".native-droppable",function(t){if(t.originalEvent.dataTransfer){var n=e(t.currentTarget);t.preventDefault(),t.stopPropagation(),t.originalEvent.dataTransfer.dropEffect=n.data(o)?"none":"copy",n.data(a,!1)}}).on("drop",".native-droppable",function(t){if(t.originalEvent&&t.originalEvent.dataTransfer){var n,i=e(t.currentTarget);t.preventDefault(),t.stopPropagation(),i.removeClass(l),n=t.currentTarget.id?i.hasClass(s)?u.navId2Hash(t.currentTarget.id):u.cwdId2Hash(t.currentTarget.id):u.cwd().hash,t.originalEvent._target=n,u.exec("upload",{dropEvt:t.originalEvent,target:n},void 0,n)}})}(),null===u.cssloaded?!function(){var e,t,n=function(){m.data("cssautoloadHide")&&(m.data("cssautoloadHide").remove(),m.removeData("cssautoloadHide")),u.cssloaded=!0,requestAnimationFrame(function(){u.trigger("cssloaded")})};"hidden"===m.css("visibility")?(e=1e3,t=setInterval(function(){(--e<0||"hidden"!==m.css("visibility"))&&(clearInterval(t),n())},10)):n()}():(u.cssloaded=!0,
u.trigger("cssloaded")),u.zIndexCalc(),void u.trigger("init").request({data:{cmd:"open",target:u.startDir(),init:1,tree:1},preventDone:!0,notify:{type:"open",cnt:1,hideCnt:!0},freeze:!0}).fail(function(){u.trigger("fail").disable().lastDir(""),E={},U={},e(document).add(m).off("."+y),u.trigger=function(){}}).done(function(t){var n=function(e){var t=u.file(u.trashes[e]);u.options.debug;t&&t.volumeid&&delete u.volOptions[t.volumeid].trashHash,u.trashes[e]=!1,u.debug("backend-error",'Trash hash "'+e+'" was not found or not writable.')},i={};u.options.rawStringDecoder&&u.registRawStringDecoder(u.options.rawStringDecoder),u.zIndexCalc(),u.load().debug("api",u.api),m.trigger("resize"),J(t),u.trigger("open",t,!1),u.trigger("opendone"),re&&u.options.enableAlways&&e(window).trigger("focus"),e.each(u.trashes,function(e){var t=u.file(e);t?"directory"===t.mime&&t.write||n(e):i[e]=!0}),Object.keys(i).length&&u.request({data:{cmd:"info",targets:Object.keys(i)},preventDefault:!0}).done(function(t){t&&t.files&&e.each(t.files,function(e,t){"directory"===t.mime&&t.write&&delete i[t.hash]})}).always(function(){e.each(i,n)}),u[u.options.enableAlways?"enable":"disable"]()})):alert(u.i18n("errURL")):alert(u.i18n("errNode")):alert(u.i18n("errJqui"))},a&&"function"==typeof a&&(u.bootCallback=a,a.call(m.get(0),u,{dfrdsBeforeBootup:h})),e.when.apply(null,h).done(function(){d()}).fail(function(e){u.error(e)})};return("undefined"==typeof n||n)&&(window.elFinder=i),i.prototype={uniqueid:0,res:function(e,t){return this.resources[e]&&this.resources[e][t]},OS:navigator.userAgent.indexOf("Mac")!==-1?"mac":navigator.userAgent.indexOf("Win")!==-1?"win":"other",UA:function(){var e=!document.unqueID&&!window.opera&&!window.sidebar&&window.localStorage&&"WebkitAppearance"in document.documentElement.style,t=e&&window.chrome,n={ltIE6:"undefined"==typeof window.addEventListener&&"undefined"==typeof document.documentElement.style.maxHeight,ltIE7:"undefined"==typeof window.addEventListener&&"undefined"==typeof document.querySelectorAll,ltIE8:"undefined"==typeof window.addEventListener&&"undefined"==typeof document.getElementsByClassName,ltIE9:document.uniqueID&&document.documentMode<=9,ltIE10:document.uniqueID&&document.documentMode<=10,gtIE11:document.uniqueID&&document.documentMode>=11,IE:document.uniqueID,Firefox:window.sidebar,Opera:window.opera,Webkit:e,Chrome:t,Edge:!(!t||!window.msCredentials),Safari:e&&!window.chrome,Mobile:"undefined"!=typeof window.orientation,Touch:"undefined"!=typeof window.ontouchstart,iOS:navigator.platform.match(/^iP(?:[ao]d|hone)/),Fullscreen:"undefined"!=typeof(document.exitFullscreen||document.webkitExitFullscreen||document.mozCancelFullScreen||document.msExitFullscreen),Angle:0,Rotated:!1,CSS:function(){var e,t=document.createElement("a").style,n=document.createElement("p").style;return e="position:sticky;position:-webkit-sticky;",e+="width:-webkit-max-content;width:-moz-max-content;width:-ms-max-content;width:max-content;",t.cssText=e,{positionSticky:t.position.indexOf("sticky")!==-1,widthMaxContent:t.width.indexOf("max-content")!==-1,flex:"undefined"!=typeof n.flex}}()};return n}(),hasRequire:"function"==typeof define&&define.amd,currentReqCmd:"",keyState:{},i18:{en:{translator:"",language:"English",direction:"ltr",dateFormat:"d.m.Y H:i",fancyDateFormat:"$1 H:i",nonameDateFormat:"ymd-His",messages:{}},months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["msJan","msFeb","msMar","msApr","msMay","msJun","msJul","msAug","msSep","msOct","msNov","msDec"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]},kinds:{unknown:"Unknown",directory:"Folder",group:"Selects",symlink:"Alias","symlink-broken":"AliasBroken","application/x-empty":"TextPlain","application/postscript":"Postscript","application/vnd.ms-office":"MsOffice","application/msword":"MsWord","application/vnd.ms-word":"MsWord","application/vnd.openxmlformats-officedocument.wordprocessingml.document":"MsWord","application/vnd.ms-word.document.macroEnabled.12":"MsWord","application/vnd.openxmlformats-officedocument.wordprocessingml.template":"MsWord","application/vnd.ms-word.template.macroEnabled.12":"MsWord","application/vnd.ms-excel":"MsExcel","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":"MsExcel","application/vnd.ms-excel.sheet.macroEnabled.12":"MsExcel","application/vnd.openxmlformats-officedocument.spreadsheetml.template":"MsExcel","application/vnd.ms-excel.template.macroEnabled.12":"MsExcel","application/vnd.ms-excel.sheet.binary.macroEnabled.12":"MsExcel","application/vnd.ms-excel.addin.macroEnabled.12":"MsExcel","application/vnd.ms-powerpoint":"MsPP","application/vnd.openxmlformats-officedocument.presentationml.presentation":"MsPP","application/vnd.ms-powerpoint.presentation.macroEnabled.12":"MsPP","application/vnd.openxmlformats-officedocument.presentationml.slideshow":"MsPP","application/vnd.ms-powerpoint.slideshow.macroEnabled.12":"MsPP","application/vnd.openxmlformats-officedocument.presentationml.template":"MsPP","application/vnd.ms-powerpoint.template.macroEnabled.12":"MsPP","application/vnd.ms-powerpoint.addin.macroEnabled.12":"MsPP","application/vnd.openxmlformats-officedocument.presentationml.slide":"MsPP","application/vnd.ms-powerpoint.slide.macroEnabled.12":"MsPP","application/pdf":"PDF","application/xml":"XML","application/vnd.oasis.opendocument.text":"OO","application/vnd.oasis.opendocument.text-template":"OO","application/vnd.oasis.opendocument.text-web":"OO","application/vnd.oasis.opendocument.text-master":"OO","application/vnd.oasis.opendocument.graphics":"OO","application/vnd.oasis.opendocument.graphics-template":"OO","application/vnd.oasis.opendocument.presentation":"OO","application/vnd.oasis.opendocument.presentation-template":"OO","application/vnd.oasis.opendocument.spreadsheet":"OO","application/vnd.oasis.opendocument.spreadsheet-template":"OO","application/vnd.oasis.opendocument.chart":"OO","application/vnd.oasis.opendocument.formula":"OO","application/vnd.oasis.opendocument.database":"OO","application/vnd.oasis.opendocument.image":"OO","application/vnd.openofficeorg.extension":"OO","application/x-shockwave-flash":"AppFlash","application/flash-video":"Flash video","application/x-bittorrent":"Torrent","application/javascript":"JS","application/rtf":"RTF","application/rtfd":"RTF","application/x-font-ttf":"TTF","application/x-font-otf":"OTF","application/x-rpm":"RPM","application/x-web-config":"TextPlain","application/xhtml+xml":"HTML","application/docbook+xml":"DOCBOOK","application/x-awk":"AWK","application/x-gzip":"GZIP","application/x-bzip2":"BZIP","application/x-xz":"XZ","application/zip":"ZIP","application/x-zip":"ZIP","application/x-rar":"RAR","application/x-tar":"TAR","application/x-7z-compressed":"7z","application/x-jar":"JAR","text/plain":"TextPlain","text/x-php":"PHP","text/html":"HTML","text/javascript":"JS","text/css":"CSS","text/rtf":"RTF","text/rtfd":"RTF","text/x-c":"C","text/x-csrc":"C","text/x-chdr":"CHeader","text/x-c++":"CPP","text/x-c++src":"CPP","text/x-c++hdr":"CPPHeader","text/x-shellscript":"Shell","application/x-csh":"Shell","text/x-python":"Python","text/x-java":"Java","text/x-java-source":"Java","text/x-ruby":"Ruby","text/x-perl":"Perl","text/x-sql":"SQL","text/xml":"XML","text/x-comma-separated-values":"CSV","text/x-markdown":"Markdown","image/x-ms-bmp":"BMP","image/jpeg":"JPEG","image/gif":"GIF","image/png":"PNG","image/tiff":"TIFF","image/x-targa":"TGA","image/vnd.adobe.photoshop":"PSD","image/xbm":"XBITMAP","image/pxm":"PXM","audio/mpeg":"AudioMPEG","audio/midi":"AudioMIDI","audio/ogg":"AudioOGG","audio/mp4":"AudioMPEG4","audio/x-m4a":"AudioMPEG4","audio/wav":"AudioWAV","audio/x-mp3-playlist":"AudioPlaylist","video/x-dv":"VideoDV","video/mp4":"VideoMPEG4","video/mpeg":"VideoMPEG","video/x-msvideo":"VideoAVI","video/quicktime":"VideoMOV","video/x-ms-wmv":"VideoWM","video/x-flv":"VideoFlash","video/x-matroska":"VideoMKV","video/ogg":"VideoOGG"},mimeTypes:{},rules:{defaults:function(e){return!(!e||e.added&&!Array.isArray(e.added)||e.removed&&!Array.isArray(e.removed)||e.changed&&!Array.isArray(e.changed))},open:function(t){return t&&t.cwd&&t.files&&e.isPlainObject(t.cwd)&&Array.isArray(t.files)},tree:function(e){return e&&e.tree&&Array.isArray(e.tree)},parents:function(e){return e&&e.tree&&Array.isArray(e.tree)},tmb:function(t){return t&&t.images&&(e.isPlainObject(t.images)||Array.isArray(t.images))},upload:function(t){return t&&(e.isPlainObject(t.added)||Array.isArray(t.added))},search:function(e){return e&&e.files&&Array.isArray(e.files)}},commands:{},cmdsToAdd:"archive duplicate extract mkdir mkfile paste rm upload",parseUploadData:function(t){var n,i=this;if(!e.trim(t))return{error:["errResponse","errDataEmpty"]};try{n=JSON.parse(t)}catch(a){return{error:["errResponse","errDataNotJSON"]}}return n=i.normalize(n),i.validResponse("upload",n)?(n.removed=e.merge(n.removed||[],e.map(n.added||[],function(e){return i.file(e.hash)?e.hash:null})),n):{error:response.norError||["errResponse"]}},iframeCnt:0,uploads:{xhrUploading:!1,failSyncTm:null,chunkfailReq:{},checkExists:function(t,n,i,a){var o,r=e.Deferred(),s=[],l={},c=function(){for(var e=t.length;--e>-1;)t[e]._remove=!0},d=function(){r.resolve(s,l)},p=function(){var r=[],p=[],u=n!==i.cwd().hash?i.path(n,!0)+i.option("separator",n):"",h=function(e){var n=e==p.length-1,o={cssClass:"elfinder-confirm-upload",title:i.i18n("cmdupload"),text:["errExists",u+p[e].name,"confirmRepl"],all:!n,accept:{label:"btnYes",callback:function(t){n||t?d():h(++e)}},reject:{label:"btnNo",callback:function(i){var a;if(i)for(a=p.length;e<a--;)t[p[a].i]._remove=!0;else t[p[e].i]._remove=!0;n||i?d():h(++e)}},cancel:{label:"btnCancel",callback:function(){c(),d()}},buttons:[{label:"btnBackup",cssClass:"elfinder-confirm-btn-backup",callback:function(t){var i;if(t)for(i=p.length;e<i--;)s.push(p[i].name);else s.push(p[e].name);n||t?d():h(++e)}}]};a||o.buttons.push({label:"btnRename"+(n?"":"All"),cssClass:"elfinder-confirm-btn-rename",callback:function(){s=null,d()}}),i.iframeCnt>0&&delete o.reject,i.confirm(o)};return i.file(n).read?(o=e.map(t,function(e,t){return!e.name||i.UA.iOS&&"image.jpg"===e.name?null:{i:t,name:e.name}}),void i.request({data:{cmd:"ls",target:n,intersect:e.map(o,function(e){return e.name})},notify:{type:"preupload",cnt:1,hideCnt:!0},preventDefault:!0}).done(function(t){var a,s;t&&(t.error?c():i.options.overwriteUploadConfirm&&i.option("uploadOverwrite",n)&&t.list&&(Array.isArray(t.list)?r=t.list||[]:(a=[],r=e.map(t.list,function(e){return"string"==typeof e?e:(a=a.concat(e),!1)}),a.length&&(r=r.concat(a)),l=t.list),p=e.grep(o,function(t){return e.inArray(t.name,r)!==-1}),p.length&&r.length&&n==i.cwd().hash&&(s=e.map(i.files(n),function(e){return e.name}),e.grep(r,function(t){return e.inArray(t,s)===-1}).length&&i.sync()))),p.length>0?h(0):d()}).fail(function(e){c(),d(),e&&i.error(e)})):void d()};return i.api>=2.1&&"object"==typeof t[0]?p():d(),r},checkFile:function(t,n,i){if(t.checked||"files"==t.type)return t.files;if("data"==t.type){var a,o,r=e.Deferred(),s=e.Deferred(),l=[],c=[],d=0,p=[],u=!1,h=function(e){return Array.prototype.slice.call(e||[],0)},f=function(e){var t,i,a=n.options.folderUploadExclude[n.OS]||null,o=e.length,r=function(){--d<1&&"pending"===s.state()&&s.resolve()},m=function(e){a&&e.name.match(a)||(c.push(t.fullPath||""),l.push(e)),r()},i=function(e){var t=[],n=function(){e.readEntries(function(e){if(u||!e.length){for(var i=0;i<t.length;i++){if(u){s.reject();break}f([t[i]])}r()}else t=t.concat(h(e)),n()},r)};n()};d++;for(var g=0;g<o;g++){if(u){s.reject();break}t=e[g],t&&(t.isFile?(d++,t.file(m,r)):t.isDirectory&&n.api>=2.1&&(d++,p.push(t.fullPath),i(t.createReader())))}return r(),s};return a=e.map(t.files.items,function(e){return e.getAsEntry?e.getAsEntry():e.webkitGetAsEntry()}),e.each(a,function(e,t){if(t.isDirectory)return o=!0,!1}),a.length>0?(n.uploads.checkExists(a,i,n,o).done(function(o,s){var d=[];n.options.overwriteUploadConfirm&&n.option("uploadOverwrite",i)&&(null===o&&(t.overwrite=0,o=[]),a=e.grep(a,function(t){var a,r,l,c;return t.isDirectory&&o.length&&(a=e.inArray(t.name,o),a!==-1&&(o.splice(a,1),r=n.uniqueName(t.name+n.options.backupSuffix,null,""),e.each(s,function(e,n){if(t.name==n)return l=e,!1}),l||(l=n.fileByName(t.name,i).hash),n.lockfiles({files:[l]}),c=n.request({data:{cmd:"rename",target:l,name:r},notify:{type:"rename",cnt:1}}).fail(function(){t._remove=!0,n.sync()}).always(function(){n.unlockfiles({files:[l]})}),d.push(c))),!t._remove})),e.when.apply(e,d).done(function(){var e,t,i=+new Date;a.length>0?(t=n.escape(a[0].name),a.length>1&&(t+=" ... "+a.length+n.i18n("items")),e=setTimeout(function(){n.notify({type:"readdir",id:i,cnt:1,hideCnt:!0,msg:n.i18n("ntfreaddir")+" ("+t+")",cancel:function(){u=!0}})},n.options.notifyDelay),f(a).done(function(){e&&clearTimeout(e),n.notify({type:"readdir",id:i,cnt:-1}),u?r.reject():r.resolve([l,c,o,s,p])}).fail(function(){r.reject()})):r.reject()})}),r.promise()):r.reject()}var m=[],g=[],v=t.files[0];if("html"==t.type){var b,y=e("<html/>").append(e.parseHTML(v.replace(/ src=/gi," _elfsrc=")));e("img[_elfsrc]",y).each(function(){var n,i,a=e(this),o=a.closest("a");o&&o.attr("href")&&o.attr("href").match(/\.(?:jpe?g|gif|bmp|png)/i)&&(i=o.attr("href")),n=a.attr("_elfsrc"),n&&(i?(e.inArray(i,m)==-1&&m.push(i),e.inArray(n,g)==-1&&g.push(n)):e.inArray(n,m)==-1&&m.push(n)),1===m.length&&m[0].match(/^data:image\/png/)&&(t.clipdata=!0)}),b=e("a[href]",y),b.each(function(){var t,n,i=function(e){var t=document.createElement("a");return t.href=e,t};(t=e(this).text())&&(n=i(e(this).attr("href")),n.href&&n.href.match(/^(?:ht|f)tp/i)&&(1===b.length||!n.pathname.match(/(?:\.html?|\/[^\/.]*)$/i)||e.trim(t).match(/\.[a-z0-9-]{1,10}$/i))&&e.inArray(n.href,m)==-1&&e.inArray(n.href,g)==-1&&m.push(n.href))})}else{var w,x,k;for(w=/((?:ht|f)tps?:\/\/[-_.!~*\'()a-z0-9;/?:\@&=+\$,%#\*\[\]]+)/gi;x=w.exec(v);)k=x[1].replace(/&amp;/g,"&"),e.inArray(k,m)==-1&&m.push(k)}return m},xhr:function(t,n){var i=n?n:this,a=i.getUI(),o=new XMLHttpRequest,r=null,s=null,l=t.checked,c=t.isDataType||"data"==t.type,d=t.target||i.cwd().hash,p=t.dropEvt||null,u=t.extraData||null,h=i.option("uploadMaxConn",d)!=-1,f=Math.min(5,Math.max(1,i.option("uploadMaxConn",d))),m=1e4,g=30,v=0,b=function(t){var n=e.Deferred();return t.promise?t.always(function(e){n.resolve(Array.isArray(e)&&e.length?c?e[0][0]:e[0]:{})}):n.resolve(t.length?c?t[0][0]:t[0]:{}),n},y=e.Deferred().fail(function(e){var t,a=i.parseError(e);"userabort"===a&&(t=!0,a=void 0),x&&(i.uploads.xhrUploading||t)?b(x).done(function(e){t||P(a,e),e._cid?i.uploads.chunkfailReq[e._cid]||(i.uploads.chunkfailReq[e._cid]=!0,setTimeout(function(){n.request({data:{cmd:"upload",target:d,chunk:e._chunk,cid:e._cid,upload:["chunkfail"],mimes:"chunkfail"},options:{type:"post",url:i.uploadURL},preventDefault:!0}).always(function(){delete i.uploads.chunkfailReq[e._chunk]})},1e3)):(i.uploads.failSyncTm&&clearTimeout(i.uploads.failSyncTm),i.uploads.failSyncTm=setTimeout(function(){i.sync(d)},1e3))}):P(a),!t&&i.sync(),i.uploads.xhrUploading=!1,x=null}).done(function(t){i.uploads.xhrUploading=!1,x=null,t&&(i.currentReqCmd="upload",t.warning&&P(t.warning),i.updateCache(t),t.removed&&t.removed.length&&i.remove(t),t.added&&t.added.length&&i.add(t),t.changed&&t.changed.length&&i.change(t),i.trigger("upload",t,!1),i.trigger("uploaddone"),t.toasts&&Array.isArray(t.toasts)&&e.each(t.toasts,function(){this.msg&&i.toast(this)}),t.sync&&i.sync(),t.debug&&n.debug("backend-debug",t))}).always(function(){i.abortXHR(o),a.off("uploadabort",M),e(window).off("unload",M),r&&clearTimeout(r),s&&clearTimeout(s),l&&!t.multiupload&&j()&&i.notify({type:"upload",cnt:-k,progress:0,size:0}),N&&S.children(".elfinder-notify-chunkmerge").length&&i.notify({type:"chunkmerge",cnt:-1})}),w=new FormData,x=t.input?t.input.files:i.uploads.checkFile(t,i,d),k=t.checked&&c?x[0].length:x.length,C=0,z=0,T=0,A=!1,S=i.ui.notify,I=!0,O=!1,j=function(){return!A&&(L=S.children(".elfinder-notify-upload")).length&&(A=!0),A},M=function(e,t){O=!0,i.abortXHR(o,{quiet:!0,abort:!0}),y.reject(t),j()&&i.notify({type:"upload",cnt:L.data("cnt")*-1,progress:0,size:0})},D=function(e){L.children(".elfinder-notify-cancel")[e?"show":"hide"]()},F=function(e){return e||(e=T),setTimeout(function(){A=!0,i.notify({type:"upload",cnt:k,progress:C-z,size:e,cancel:function(){a.trigger("uploadabort","userabort")}}),L=S.children(".elfinder-notify-upload"),z=C,t.multiupload?I&&D(!0):D(I&&C<e)},i.options.notifyDelay)},E=function(){v++<=g?(j()&&z&&i.notify({type:"upload",cnt:0,progress:0,size:z}),i.abortXHR(o,{quiet:!0}),z=C=0,setTimeout(function(){var e;O||(o.open("POST",i.uploadURL,!0),i.api>=2.1029&&(e=(+new Date).toString(16)+Math.floor(1e3*Math.random()).toString(16),"function"==typeof w["delete"]&&w["delete"]("reqid"),w.append("reqid",e),o._requestId=e),o.send(w))},m)):a.trigger("uploadabort",["errAbort","errTimeout"])},U=function(){A&&y.notifyWith(L,[{cnt:L.data("cnt"),progress:L.data("progress"),total:L.data("total")}])},P=function(e,t,n){e&&i.trigger("xhruploadfail",{error:e,file:t}),n?e&&(q<i.options.maxErrorDialogs&&(Array.isArray(e)?R=R.concat(e):R.push(e)),q++):e?i.error(e):(R.length&&(q>=i.options.maxErrorDialogs&&(R=R.concat("moreErrors",q-i.options.maxErrorDialogs)),i.error(R)),R=[],q=0)},R=[],q=0,H=t.renames||null,_=t.hashes||null,N=!1,L=e();if(a.one("uploadabort",M),e(window).one("unload."+n.namespace,M),!N&&(z=C),!c&&!k)return y.reject(["errUploadNoFiles"]);o.addEventListener("error",function(){0==o.status?O?y.reject():!c&&t.files&&e.grep(t.files,function(e){return!e.type&&e.size===(i.UA.Safari?1802:0)}).length?y.reject(["errAbort","errFolderUpload"]):t.input&&e.grep(t.input.files,function(e){return!e.type&&e.size===(i.UA.Safari?1802:0)}).length?y.reject(["errUploadNoFiles"]):E():a.trigger("uploadabort","errConnect")},!1),o.addEventListener("load",function(e){var n,l,d=o.status,p=0,u="";if(d>=400?u=d>500?"errResponse":["errResponse","errServerError"]:o.responseText||(u=["errResponse","errDataEmpty"]),u&&(a.trigger("uploadabort"),b(x).done(function(e){return y.reject(e._cid?null:u)})),C=T,j()&&(p=C-z)&&(i.notify({type:"upload",cnt:0,progress:p,size:0}),U()),n=i.parseUploadData(o.responseText),n._chunkmerged){w=new FormData;var h=[{_chunkmerged:n._chunkmerged,_name:n._name,_mtime:n._mtime}];return N=!0,a.off("uploadabort",M),s=setTimeout(function(){i.notify({type:"chunkmerge",cnt:1})},i.options.notifyDelay),void(c?W(h,x[1]):W(h))}n._multiupload=!!t.multiupload,n.error?(l={cmd:"upload",err:n,xhr:o,rc:o.status},i.trigger("uploadfail",n),i.trigger("requestError",l),l._event&&l._event.isDefaultPrevented()&&(n.error=""),n._chunkfailure||n._multiupload?(O=!0,i.uploads.xhrUploading=!1,r&&clearTimeout(r),L.length?(i.notify({type:"upload",cnt:-k,progress:0,size:0}),y.reject(n)):y.reject()):y.reject(n)):y.resolve(n)},!1),o.upload.addEventListener("loadstart",function(e){!N&&e.lengthComputable&&(C=e.loaded,v&&(C=0),T=e.total,C||(C=parseInt(.05*T)),j()&&(i.notify({type:"upload",cnt:0,progress:C-z,size:t.multiupload?0:T}),z=C,U()))},!1),o.upload.addEventListener("progress",function(e){var n;e.lengthComputable&&!N&&o.readyState<2&&(C=e.loaded,!t.checked&&C>0&&!r&&(r=F(o._totalSize-C)),T||(T=e.total,C||(C=parseInt(.05*T))),n=C-z,j()&&n/e.total>=.05&&(i.notify({type:"upload",cnt:0,progress:n,size:0}),z=C,U()),!t.multiupload&&C>=T&&(I=!1,D(!1)))},!1);var W=function(a,s){var m,g,v,b,x,C,z,T,A,S,M,E,U,q,N=0,L=1,W=[],B=0,$=k,K=0,V=[],X=(new Date).getTime().toString().substr(-9),G=Math.min((n.uplMaxSize?n.uplMaxSize:2097152)-8190,n.options.uploadMaxChunkSize),J=!h&&"",Y=function(a,o){var s,l,u=[],h=0;if(!O){for(;a.length&&u.length<o;)u.push(a.shift());if(h=u.length){l=h;for(var f=0;f<h&&!O;f++)s=c?u[f][0][0]._cid||null:u[f][0]._cid||null,U[s]?E--:n.exec("upload",{type:t.type,isDataType:c,files:u[f],checked:!0,target:d,dropEvt:p,renames:H,hashes:_,multiupload:!0,overwrite:0===t.overwrite?0:void 0},void 0,d).fail(function(e){e&&"No such command"===e&&(O=!0,n.error(["errUpload","errPerm"])),s&&(U[s]=!0)}).always(function(t){t&&t.added&&(S=e.merge(S,t.added)),E<=++M&&(n.trigger("multiupload",{added:S}),r&&clearTimeout(r),j()&&i.notify({type:"upload",cnt:-k,progress:0,size:0})),a.length?Y(a,1):--l<=1&&(I=!1,D(!1))})}}(u.length<1||O)&&(O?(r&&clearTimeout(r),s&&(U[s]=!0),y.reject()):(y.resolve(),i.uploads.xhrUploading=!1))},Q=function(){i.uploads.xhrUploading?setTimeout(Q,100):(i.uploads.xhrUploading=!0,Y(W,f))};if(!l&&(c||"files"==t.type)){for((m=n.option("uploadMaxSize",d))||(m=0),b=0;b<a.length;b++){try{T=a[b],g=T.size,J===!1&&(J="",i.api>=2.1&&("slice"in T?J="slice":"mozSlice"in T?J="mozSlice":"webkitSlice"in T&&(J="webkitSlice")))}catch(Z){k--,$--;continue}if(m&&g>m||!J&&n.uplMaxSize&&g>n.uplMaxSize)P(["errUploadFile",T.name,"errUploadFileSize"],T,!0),k--,$--;else if(!T.type||i.uploadMimeCheck(T.type,d))if(J&&g>G){for(x=0,C=G,z=-1,$=Math.floor((g-1)/G),v=T.lastModified?Math.round(T.lastModified/1e3):0,K+=g,V[X]=0;x<g;)A=T[J](x,C),A._chunk=T.name+"."+ ++z+"_"+$+".part",A._cid=X,A._range=x+","+A.size+","+g,A._mtime=v,V[X]++,N&&B++,"undefined"==typeof W[B]&&(W[B]=[],c&&(W[B][0]=[],W[B][1]=[])),N=G,L=1,c?(W[B][0].push(A),W[B][1].push(s[b])):W[B].push(A),x=C,C=x+G;null==A?(P(["errUploadFile",T.name,"errUploadFileSize"],T,!0),k--,$--):($+=z,N=0,L=1,B++)}else(n.uplMaxSize&&N+g>n.uplMaxSize||L>n.uplMaxFile)&&(N=0,L=1,B++),"undefined"==typeof W[B]&&(W[B]=[],c&&(W[B][0]=[],W[B][1]=[])),c?(W[B][0].push(T),W[B][1].push(s[b])):W[B].push(T),N+=g,K+=g,L++;else P(["errUploadFile",T.name,"errUploadMime","("+T.type+")"],T,!0),k--,$--}if(R.length&&P(),0==W.length)return t.checked=!0,!1;if(W.length>1)return r=F(K),S=[],M=0,E=W.length,U=[],Q(),!0;c?(a=W[0][0],s=W[0][1]):a=W[0]}return l||(n.UA.Safari&&t.files?o._totalSize=K:r=F(K)),l=!0,a.length||y.reject(["errUploadNoFiles"]),o.open("POST",i.uploadURL,!0),n.customHeaders&&e.each(n.customHeaders,function(e){o.setRequestHeader(e,this)}),n.xhrFields&&e.each(n.xhrFields,function(e){e in o&&(o[e]=this)}),i.api>=2.1029&&(q=(+new Date).toString(16)+Math.floor(1e3*Math.random()).toString(16),w.append("reqid",q),o._requestId=q),w.append("cmd","upload"),w.append(i.newAPI?"target":"current",d),H&&H.length&&(e.each(H,function(e,t){w.append("renames[]",t)}),w.append("suffix",n.options.backupSuffix)),_&&e.each(_,function(e,t){w.append("hashes["+e+"]",t)}),e.each(i.customData,function(e,t){w.append(e,t)}),e.each(i.options.onlyMimes,function(e,t){w.append("mimes[]",t)}),e.each(a,function(e,i){i._chunkmerged?(w.append("chunk",i._chunkmerged),w.append("upload[]",i._name),w.append("mtime[]",i._mtime)):(i._chunkfail?(w.append("upload[]","chunkfail"),w.append("mimes","chunkfail")):(w.append("upload[]",i),t.clipdata&&(t.overwrite=0,w.append("name[]",n.date(n.nonameDateFormat)+".png")),i.name&&n.UA.iOS&&(i.name.match(/^image\.jpe?g$/i)?(t.overwrite=0,w.append("name[]",n.date(n.nonameDateFormat)+".jpg")):i.name.match(/^capturedvideo\.mov$/i)&&(t.overwrite=0,w.append("name[]",n.date(n.nonameDateFormat)+".mov")))),i._chunk?(w.append("chunk",i._chunk),w.append("cid",i._cid),w.append("range",i._range),w.append("mtime[]",i._mtime)):w.append("mtime[]",i.lastModified?Math.round(i.lastModified/1e3):0))}),c&&e.each(s,function(e,t){w.append("upload_path[]",t)}),0===t.overwrite&&w.append("overwrite",0),p&&w.append("dropWith",parseInt((p.altKey?"1":"0")+(p.ctrlKey?"1":"0")+(p.metaKey?"1":"0")+(p.shiftKey?"1":"0"),2)),u&&e.each(u,function(e,t){w.append(e,t)}),o.send(w),!0};if(c)l?W(x[0],x[1]):x.done(function(t){if(H=[],k=t[0].length){if(t[4]&&t[4].length)return void n.request({data:{cmd:"mkdir",target:d,dirs:t[4]},notify:{type:"mkdir",cnt:t[4].length},preventFail:!0}).fail(function(e){e=e||["errUnknown"],"errCmdParams"===e[0]?f=1:(f=0,y.reject(e))}).done(function(n){var i=!1;n.hashes||(n.hashes={}),t[1]=e.map(t[1],function(e,a){return e=e.replace(/\/[^\/]*$/,""),""===e?d:n.hashes[e]?n.hashes[e]:(i=!0,t[0][a]._remove=!0,null)}),i&&(t[0]=e.grep(t[0],function(e){return!e._remove}))}).always(function(e){f&&(H=t[2],_=t[3],W(t[0],t[1]))});t[1]=e.map(t[1],function(){return d}),H=t[2],_=t[3],W(t[0],t[1])}else y.reject(["errUploadNoFiles"])}).fail(function(){y.reject()});else if(x.length>0)if(t.clipdata||null!=H)W(x)||y.reject();else{var B=[],$=[],K=n.options.folderUploadExclude[n.OS]||null;e.each(x,function(t,n){var i,a,o=n.webkitRelativePath||n.relativePath||"";return!!o&&(K&&n.name.match(K)?(n._remove=!0,o=void 0):(o="/"+o.replace(/\/[^\/]*$/,"").replace(/^\//,""),o&&e.inArray(o,B)===-1&&(B.push(o),i=o.substr(1).indexOf("/"),i!==-1&&(a=o.substr(0,i+1))&&e.inArray(a,B)===-1&&B.unshift(a))),void jQuery.push(o))}),H=[],_={},B.length?!function(){var t=e.map(B,function(e){return e.substr(1).indexOf("/")===-1?{name:e.substr(1)}:null}),i=[];n.uploads.checkExists(t,d,n,!0).done(function(a,o){var r,s,l,p=[];n.options.overwriteUploadConfirm&&n.option("uploadOverwrite",d)&&(i=e.map(t,function(e){return e._remove?e.name:null}),t=e.grep(t,function(e){return!e._remove})),i.length&&e.each(jQuery.concat(),function(t,n){0===e.inArray(n,i)&&(x[t]._remove=!0,$[t]=void 0)}),x=e.grep(x,function(e){return!e._remove}),$=e.grep($,function(e){return void 0!==e}),t.length?(r=e.Deferred(),a.length?e.each(a,function(t,i){s=n.uniqueName(i+n.options.backupSuffix,null,""),e.each(o,function(e,t){if(a[0]==t)return l=e,!1}),l||(l=n.fileByName(a[0],d).hash),n.lockfiles({files:[l]}),p.push(n.request({data:{cmd:"rename",target:l,name:s},notify:{type:"rename",cnt:1}}).fail(function(e){y.reject(e),n.sync()}).always(function(){n.unlockfiles({files:[l]})}))}):p.push(null),e.when.apply(e,p).done(function(){n.request({data:{cmd:"mkdir",target:d,dirs:B},notify:{type:"mkdir",cnt:B.length},preventFail:!0}).fail(function(e){e=e||["errUnknown"],"errCmdParams"===e[0]?f=1:(f=0,y.reject(e))}).done(function(t){var n=!1;t.hashes||(t.hashes={}),$=e.map(jQuery.concat(),function(e,i){return"/"===e?d:t.hashes[e]?t.hashes[e]:(n=!0,x[i]._remove=!0,null)}),n&&(x=e.grep(x,function(e){return!e._remove}))}).always(function(e){f&&(c=!0,W(x,$)||y.reject())})})):y.reject()})}():n.uploads.checkExists(x,d,n).done(function(i,a){n.options.overwriteUploadConfirm&&n.option("uploadOverwrite",d)&&(_=a,null===i?t.overwrite=0:H=i,x=e.grep(x,function(e){return!e._remove})),k=x.length,k>0?W(x)||y.reject():y.reject()})}else y.reject();return y},iframe:function(t,n){var i,a,o,r,s=n?n:this,l=!!t.input&&t.input,c=!l&&s.uploads.checkFile(t,s),d=e.Deferred().fail(function(e){e&&s.error(e)}),p="iframe-"+n.namespace+ ++s.iframeCnt,u=e('<form action="'+s.uploadURL+'" method="post" enctype="multipart/form-data" encoding="multipart/form-data" target="'+p+'" style="display:none"><input type="hidden" name="cmd" value="upload" /></form>'),h=this.UA.IE,f=function(){r&&clearTimeout(r),o&&clearTimeout(o),a&&s.notify({type:"upload",cnt:-i}),setTimeout(function(){h&&e('<iframe src="javascript:false;"/>').appendTo(u),u.remove(),m.remove()},100)},m=e('<iframe src="'+(h?"javascript:false;":"about:blank")+'" name="'+p+'" style="position:absolute;left:-1000px;top:-1000px" />').on("load",function(){m.off("load").on("load",function(){f(),d.resolve()}),o=setTimeout(function(){a=!0,s.notify({type:"upload",cnt:i})},s.options.notifyDelay),s.options.iframeTimeout>0&&(r=setTimeout(function(){f(),d.reject(["errConnect","errTimeout"])},s.options.iframeTimeout)),u.submit()}),g=t.target||s.cwd().hash,v=[],b=[],y=[],w={};if(c&&c.length)e.each(c,function(e,t){u.append('<input type="hidden" name="upload[]" value="'+t+'"/>')}),i=1;else{if(!(l&&e(l).is(":file")&&e(l).val()))return d.reject();n.options.overwriteUploadConfirm&&n.option("uploadOverwrite",g)&&(v=l.files?l.files:[{name:e(l).val().replace(/^(?:.+[\\\/])?([^\\\/]+)$/,"$1")}],b.push(s.uploads.checkExists(v,g,s).done(function(n,a){w=a,null===n?t.overwrite=0:(y=n,i=e.grep(v,function(e){return!e._remove}).length,i!=v.length&&(i=0))}))),i=l.files?l.files.length:1,u.append(l)}return e.when.apply(e,b).done(function(){return i<1?d.reject():(u.append('<input type="hidden" name="'+(s.newAPI?"target":"current")+'" value="'+g+'"/>').append('<input type="hidden" name="html" value="1"/>').append('<input type="hidden" name="node" value="'+s.id+'"/>').append(e(l).attr("name","upload[]")),y.length>0&&(e.each(y,function(e,t){u.append('<input type="hidden" name="renames[]" value="'+s.escape(t)+'"/>')}),u.append('<input type="hidden" name="suffix" value="'+n.options.backupSuffix+'"/>')),w&&e.each(y,function(e,t){u.append('<input type="hidden" name="['+e+']" value="'+s.escape(t)+'"/>')}),0===t.overwrite&&u.append('<input type="hidden" name="overwrite" value="0"/>'),e.each(s.options.onlyMimes||[],function(e,t){u.append('<input type="hidden" name="mimes[]" value="'+s.escape(t)+'"/>')}),e.each(s.customData,function(e,t){u.append('<input type="hidden" name="'+e+'" value="'+s.escape(t)+'"/>')}),u.appendTo("body"),void m.appendTo("body"))}),d}},one:function(e,t,n){var i=this,a=e.toLowerCase(),o=function(e,n){return i.toUnbindEvents[a]||(i.toUnbindEvents[a]=[]),i.toUnbindEvents[a].push({type:a,callback:o}),(t.done?t.done:t).apply(this,arguments)};return t.done&&(o={done:o}),this.bind(a,o,n)},localStorage:function(t,n){var i,a,o,r,s,l=this,c=window.localStorage,d="elfinder-"+(t||"")+this.id,p=window.location.pathname+"-elfinder-",u=this.id,h=[];if("undefined"==typeof t)return r=p.length,s=u.length*-1,e.each(c,function(e){e.substr(0,r)===p&&e.substr(s)===u&&h.push(e)}),e.each(h,function(e,t){c.removeItem(t)}),!0;if(t=p+t+u,null===n)return c.removeItem(t);if(void 0===n&&!(i=c.getItem(t))&&(a=c.getItem(d))&&(n=a,c.removeItem(d)),void 0!==n){o=typeof n,"string"!==o&&"number"!==o&&(n=JSON.stringify(n));try{c.setItem(t,n)}catch(f){try{c.clear(),c.setItem(t,n)}catch(f){l.debug("error",f.toString())}}i=c.getItem(t)}if(i&&("{"===i.substr(0,1)||"["===i.substr(0,1)))try{return JSON.parse(i)}catch(f){}return i},cookie:function(t,n){var i,a,o,r,s,l;if(t="elfinder-"+t+this.id,void 0===n){if(document.cookie&&""!=document.cookie)for(o=document.cookie.split(";"),t+="=",r=0;r<o.length;r++)if(o[r]=e.trim(o[r]),o[r].substring(0,t.length)==t){if(s=decodeURIComponent(o[r].substring(t.length)),"{"===s.substr(0,1)||"["===s.substr(0,1))try{return JSON.parse(s)}catch(c){}return s}return null}if(a=Object.assign({},this.options.cookie),null===n?(n="",a.expires=-1):(l=typeof n,"string"!==l&&"number"!==l&&(n=JSON.stringify(n))),"number"==typeof a.expires&&(i=new Date,i.setTime(i.getTime()+864e5*a.expires),a.expires=i),document.cookie=t+"="+encodeURIComponent(n)+"; expires="+a.expires.toUTCString()+(a.path?"; path="+a.path:"")+(a.domain?"; domain="+a.domain:"")+(a.secure?"; secure":""),n&&("{"===n.substr(0,1)||"["===n.substr(0,1)))try{return JSON.parse(n)}catch(c){}return n},startDir:function(){var e=window.location.hash;return e&&e.match(/^#elf_/)?e.replace(/^#elf_/,""):this.options.startPathHash?this.options.startPathHash:this.lastDir()},lastDir:function(e){return this.options.rememberLastDir?this.storage("lastdir",e):""},_node:e("<span/>"),escape:function(e){return this._node.text(e).html().replace(/"/g,"&quot;").replace(/'/g,"&#039;")},normalize:function(t){var n,i,a,o,r,s=this,l=function(){var e,t;return(t=s.options.fileFilter)&&("function"==typeof t?e=function(e){return t.call(s,e)}:t instanceof RegExp&&(e=function(e){return t.test(e.name)})),e?e:null}(),c=function(t){var n;t.uiCmdMap&&(e.isPlainObject(t.uiCmdMap)&&Object.keys(t.uiCmdMap).length?(t.disabledFlip||(t.disabledFlip={}),n=t.disabledFlip,e.each(t.uiCmdMap,function(e,i){"hidden"!==i||n[e]||(t.disabled.push(e),t.disabledFlip[e]=!0)})):delete t.uiCmdMap)},d=function(t){var n=function(e){var t=typeof e;return"object"===t&&Array.isArray(e)&&(t="array"),t};return e.each(s.optionProperties,function(e,i){void 0!==i&&t[e]&&n(t[e])!==n(i)&&(t[e]=i)}),t.disabled?t.disabledFlip=s.arrayFlip(t.disabled,!0):t.disabledFlip={},t},p=function(t,r,p){var u,h,m,g,v=!r||t,b=!!r&&null;
if(t&&t.hash&&t.name&&t.mime){if("application/x-empty"===t.mime&&(t.mime="text/plain"),m=s.isRoot(t),m&&!t.volumeid&&s.debug("warning","The volume root statuses requires `volumeid` property."),m||"directory"===t.mime){if(t.phash){if(t.phash===t.hash)return f=f.concat(['Parent folder of "$1" is itself.',t.name]),b;if(m&&t.volumeid&&0===t.phash.indexOf(t.volumeid))return f=f.concat(['Parent folder of "$1" is inner itself.',t.name]),b}t.volumeid&&(u=t.volumeid,m&&(t.phash&&(s.leafRoots[t.phash]?e.inArray(t.hash,s.leafRoots[t.phash])===-1&&s.leafRoots[t.phash].push(t.hash):s.leafRoots[t.phash]=[t.hash]),s.hasVolOptions=!0,s.volOptions[u]||(s.volOptions[u]={dispInlineRegex:s.options.dispInlineRegex}),h=s.volOptions[u],t.options&&Object.assign(h,t.options),t.disabled&&(h.disabled=t.disabled,h.disabledFlip=s.arrayFlip(t.disabled,!0)),t.tmbUrl&&(h.tmbUrl=t.tmbUrl),h.url&&"/"!==h.url.substr(-1)&&(h.url+="/"),c(h),h.trashHash&&(s.trashes[h.trashHash]===!1?delete h.trashHash:s.trashes[h.trashHash]=t.hash),e.each(s.optionProperties,function(e){h[e]&&(t[e]=h[e])}),"cwd"!==p&&(s.roots[u]=t.hash),t.expires&&(s.volumeExpires[u]=t.expires)),o!==u&&(o=u,a=s.option("i18nFolderName",u))),m&&!t.i18&&(n="volume_"+t.name,i=s.i18n(!1,n),n!==i&&(t.i18=i)),a&&!t.i18&&(n="folder_"+t.name,i=s.i18n(!1,n),n!==i&&(t.i18=i)),m&&(g=s.storage("rootNames"))&&(g[t.hash]&&(t._name=t.name,t._i18=t.i18,t.name=g[t.hash]=g[t.hash],delete t.i18),s.storage("rootNames",g)),s.trashes[t.hash]&&(t.locked=!0)}else{if(l)try{if(!l(t))return b}catch(y){s.debug(y)}0==t.size&&(t.mime=s.getMimetype(t.name,t.mime))}return t.options&&(s.optionsByHashes[t.hash]=d(t.options)),delete t.options,v}return b},u=function(t){var n=[];return e.each(s.files(),function(i,a){e.each(s.parents(i),function(a,o){if(e.inArray(o,t)!==-1&&e.inArray(i,t)===-1)return n.push(i),!1})}),n},h=function(n,i){e.each(n,function(n,a){var o,r;s.leafRoots[a.hash]&&s.applyLeafRootStats(a),"change"!==i&&a.phash&&s.isRoot(a)&&(o=s.file(a.phash))&&(s.applyLeafRootStats(o),t.changed?(e.each(t.changed,function(e,n){if(n.hash===o.hash)return t.changed[e]=o,r=!0,!1}),r||t.changed.push(o)):t.changed=[o])})},f=[];if(t.customData&&t.customData!==s.prevCustomData){s.prevCustomData=t.customData;try{r=JSON.parse(t.customData),e.isPlainObject(r)&&(s.prevCustomData=r,e.each(Object.keys(r),function(e,t){null===r[t]&&(delete r[t],delete s.optsCustomData[t])}),s.customData=Object.assign({},s.optsCustomData,r))}catch(m){}}return t.options&&d(t.options),t.cwd&&(t.cwd.volumeid&&t.options&&Object.keys(t.options).length&&s.isRoot(t.cwd)&&(s.hasVolOptions=!0,s.volOptions[t.cwd.volumeid]=t.options),t.cwd=p(t.cwd,!0,"cwd")),t.files&&(t.files=e.grep(t.files,p)),t.tree&&(t.tree=e.grep(t.tree,p)),t.added&&(t.added=e.grep(t.added,p)),t.changed&&(t.changed=e.grep(t.changed,p)),t.removed&&t.removed.length&&2===s.searchStatus.state&&(t.removed=t.removed.concat(u(t.removed))),t.api&&(t.init=!0),Object.keys(s.leafRoots).length&&(t.files&&h(t.files),t.tree&&h(t.tree),t.added&&h(t.added),t.changed&&h(t.changed,"change")),t.cwd&&t.cwd.options&&t.options&&Object.assign(t.options,d(t.cwd.options)),t.options&&t.options.url&&"/"!==t.options.url.substr(-1)&&(t.options.url+="/"),f.length&&(t.norError=["errResponse"].concat(f)),t},setSort:function(e,t,n,i){this.storage("sortType",this.sortType=this.sortRules[e]?e:"name"),this.storage("sortOrder",this.sortOrder=/asc|desc/.test(t)?t:"asc"),this.storage("sortStickFolders",(this.sortStickFolders=!!n)?1:""),this.storage("sortAlsoTreeview",(this.sortAlsoTreeview=!!i)?1:""),this.trigger("sortchange")},_sortRules:{name:function(e,t){return i.prototype.naturalCompare(e.i18||e.name,t.i18||t.name)},size:function(e,t){var n=parseInt(e.size)||0,i=parseInt(t.size)||0;return n===i?0:n>i?1:-1},kind:function(e,t){return i.prototype.naturalCompare(e.mime,t.mime)},date:function(e,t){var n=e.ts||e.date||0,i=t.ts||t.date||0;return n===i?0:n>i?1:-1},perm:function(e,t){var n=function(e){return(e.write?2:0)+(e.read?1:0)},i=n(e),a=n(t);return i===a?0:i>a?1:-1},mode:function(e,t){var n=e.mode||e.perm||"",a=t.mode||t.perm||"";return i.prototype.naturalCompare(n,a)},owner:function(e,t){var n=e.owner||"",a=t.owner||"";return i.prototype.naturalCompare(n,a)},group:function(e,t){var n=e.group||"",a=t.group||"";return i.prototype.naturalCompare(n,a)}},sorters:{},naturalCompare:function(e,t){var n=i.prototype.naturalCompare;return"undefined"==typeof n.loc&&(n.loc=navigator.userLanguage||navigator.browserLanguage||navigator.language||"en-US"),"undefined"==typeof n.sort&&("11".localeCompare("2",n.loc,{numeric:!0})>0?window.Intl&&window.Intl.Collator?n.sort=new Intl.Collator(n.loc,{numeric:!0}).compare:n.sort=function(e,t){return e.localeCompare(t,n.loc,{numeric:!0})}:(n.sort=function(e,t){var i,a,o=/(^-?[0-9]+(\.?[0-9]*)[df]?e?[0-9]?$|^0x[0-9a-f]+$|[0-9]+)/gi,r=/(^[ ]*|[ ]*$)/g,s=/(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/,l=/^0x[0-9a-f]+$/i,c=/^0/,d=/^[\x01\x21-\x2f\x3a-\x40\x5b-\x60\x7b-\x7e]/,p=function(e){return n.sort.insensitive&&(""+e).toLowerCase()||""+e},u=p(e).replace(r,"").replace(/^_/,"")||"",h=p(t).replace(r,"").replace(/^_/,"")||"",f=u.replace(o,"\0$1\0").replace(/\0$/,"").replace(/^\0/,"").split("\0"),m=h.replace(o,"\0$1\0").replace(/\0$/,"").replace(/^\0/,"").split("\0"),g=parseInt(u.match(l))||1!=f.length&&u.match(s)&&Date.parse(u),v=parseInt(h.match(l))||g&&h.match(s)&&Date.parse(h)||null,b=0;if(v){if(g<v)return-1;if(g>v)return 1}for(var y=0,w=Math.max(f.length,m.length);y<w;y++){if(i=!(f[y]||"").match(c)&&parseFloat(f[y])||f[y]||0,a=!(m[y]||"").match(c)&&parseFloat(m[y])||m[y]||0,isNaN(i)!==isNaN(a)){if(isNaN(i)&&("string"!=typeof i||!i.match(d)))return 1;if("string"!=typeof a||!a.match(d))return-1}if(0===parseInt(i,10)&&(i=0),0===parseInt(a,10)&&(a=0),typeof i!=typeof a&&(i+="",a+=""),n.sort.insensitive&&"string"==typeof i&&"string"==typeof a&&(b=i.localeCompare(a,n.loc),0!==b))return b;if(i<a)return-1;if(i>a)return 1}return 0},n.sort.insensitive=!0)),n.sort(e,t)},compare:function(e,t){var n,i=this,a=i.sortType,o="asc"==i.sortOrder,r=i.sortStickFolders,s=i.sortRules,l=s[a],c="directory"==e.mime,d="directory"==t.mime;if(r){if(c&&!d)return-1;if(!c&&d)return 1}return n=o?l(e,t):l(t,e),"name"!==a&&0===n?n=o?s.name(e,t):s.name(t,e):n},sortFiles:function(e){return e.sort(this.compare)},notify:function(t){var n,i,a,o=t.type,r=t.id?"elfinder-notify-"+t.id:"",s=this.i18n("undefined"!=typeof t.msg?t.msg:this.messages["ntf"+o]?"ntf"+o:"ntfsmth"),l=this.ui.notify,c=l.children(".elfinder-notify-"+o+(r?"."+r:"")),d=c.children("div.elfinder-notify-cancel").children("button"),p='<div class="elfinder-notify elfinder-notify-{type}'+(r?" "+r:"")+'"><span class="elfinder-dialog-icon elfinder-dialog-icon-{type}"/><span class="elfinder-notify-msg">{msg}</span> <span class="elfinder-notify-cnt"/><div class="elfinder-notify-progressbar"><div class="elfinder-notify-progress"/></div><div class="elfinder-notify-cancel"/></div>',u=t.cnt,h="undefined"!=typeof t.size?parseInt(t.size):null,f="undefined"!=typeof t.progress&&t.progress>=0?t.progress:null,m=t.cancel,g="ui-state-hover",v=function(){c._esc&&e(document).off("keydown",c._esc),c.remove(),!l.children().length&&l.elfinderdialog("close")};return o?(c.length?"undefined"!=typeof t.msg&&c.children("span.elfinder-notify-msg").html(s):(c=e(p.replace(/\{type\}/g,o).replace(/\{msg\}/g,s)).appendTo(l).data("cnt",0),null!=f&&c.data({progress:0,total:0}),m&&(d=e('<button type="button" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"><span class="ui-button-text">'+this.i18n("btnCancel")+"</span></button>").on("mouseenter mouseleave",function(t){e(this).toggleClass(g,"mouseenter"===t.type)}),c.children("div.elfinder-notify-cancel").append(d))),n=u+parseInt(c.data("cnt")),n>0?(m&&d.length&&(e.isFunction(m)||"object"==typeof m&&m.promise)&&(c._esc=function(t){"keydown"==t.type&&t.keyCode!=e.ui.keyCode.ESCAPE||(t.preventDefault(),t.stopPropagation(),v(),m.promise?m.reject(0):m(t))},d.on("click",function(e){c._esc(e)}),e(document).on("keydown."+this.namespace,c._esc)),!t.hideCnt&&c.children(".elfinder-notify-cnt").text("("+n+")"),l.is(":hidden")&&l.elfinderdialog("open",this).height("auto"),c.data("cnt",n),null!=f&&(i=c.data("total"))>=0&&(a=c.data("progress"))>=0&&(i+=null!=h?h:u,a+=f,null==h&&u<0&&(a+=100*u),c.data({progress:a,total:i}),null!=h&&(a*=100,i=Math.max(1,i)),f=parseInt(a/i),c.find(".elfinder-notify-progress").animate({width:(f<100?f:100)+"%"},20))):v(),this):this},confirm:function(t){var n,i,a=this,o=!1,r={cssClass:"elfinder-dialog-confirm",modal:!0,resizable:!1,title:this.i18n(t.title||"confirmReq"),buttons:{},close:function(){!o&&t.cancel.callback(),e(this).elfinderdialog("destroy")}},s=this.i18n("apllyAll");return t.cssClass&&(r.cssClass+=" "+t.cssClass),r.buttons[this.i18n(t.accept.label)]=function(){t.accept.callback(!(!n||!n.prop("checked"))),o=!0,e(this).elfinderdialog("close")},r.buttons[this.i18n(t.accept.label)]._cssClass="elfinder-confirm-accept",t.reject&&(r.buttons[this.i18n(t.reject.label)]=function(){t.reject.callback(!(!n||!n.prop("checked"))),o=!0,e(this).elfinderdialog("close")},r.buttons[this.i18n(t.reject.label)]._cssClass="elfinder-confirm-reject"),t.buttons&&t.buttons.length>0&&(i=1,e.each(t.buttons,function(t,s){r.buttons[a.i18n(s.label)]=function(){s.callback(!(!n||!n.prop("checked"))),o=!0,e(this).elfinderdialog("close")},r.buttons[a.i18n(s.label)]._cssClass="elfinder-confirm-extbtn"+i++,s.cssClass&&(r.buttons[a.i18n(s.label)]._cssClass+=" "+s.cssClass)})),r.buttons[this.i18n(t.cancel.label)]=function(){e(this).elfinderdialog("close")},r.buttons[this.i18n(t.cancel.label)]._cssClass="elfinder-confirm-cancel",t.all&&(r.create=function(){var t=e('<div class="elfinder-dialog-confirm-applyall"/>');n=e('<input type="checkbox" />'),e(this).next().find(".ui-dialog-buttonset").prepend(t.append(e("<label>"+s+"</label>").prepend(n)))}),t.optionsCallback&&e.isFunction(t.optionsCallback)&&t.optionsCallback(r),this.dialog('<span class="elfinder-dialog-icon elfinder-dialog-icon-confirm"/>'+this.i18n(t.text),r)},uniqueName:function(e,t,n){var i,a,o=0,r="";if(e=this.i18n(!1,e),t=t||this.cwd().hash,n="undefined"==typeof n?" ":n,(i=e.match(/^(.+)(\.[^.]+)$/))&&(r=i[2],e=i[1]),a=e+r,!this.fileByName(a,t))return a;for(;o<1e4;)if(a=e+n+ ++o+r,!this.fileByName(a,t))return a;return e+Math.random()+r},i18n:function(){var t,n,i,a,o,r=this,s=this.messages,l=[],c=[],d=function(e){var t;return 0===e.indexOf("#")&&(t=r.file(e.substr(1)))?t.name:e},p=0;for(arguments.length&&arguments[0]===!1&&(a=function(e){return e},p=1),t=p;t<arguments.length;t++)if(i=arguments[t],Array.isArray(i))for(n=0;n<i.length;n++)i[n]instanceof jQuery?l.push(i[n]):"undefined"!=typeof i[n]&&l.push(d(""+i[n]));else i instanceof jQuery?l.push(i[n]):"undefined"!=typeof i&&l.push(d(""+i));for(t=0;t<l.length;t++)e.inArray(t,c)===-1&&(i=l[t],"string"==typeof i?(o=!(!s[i]||!i.match(/^err/)),i=s[i]||(a?a(i):r.escape(i)),i=i.replace(/\$(\d+)/g,function(e,n){var i;return n=t+parseInt(n),n>0&&l[n]&&c.push(n),i=a?a(l[n]):r.escape(l[n]),o&&(i='<span class="elfinder-err-var elfinder-err-var'+n+'">'+i+"</span>"),i})):i=i.get(0).outerHTML,l[t]=i);return e.grep(l,function(t,n){return e.inArray(n,c)===-1}).join("<br>")},getIconStyle:function(t,n){var i=this,a={background:"url('{url}') 0 0 no-repeat","background-size":"contain"},o="",r={},s=0;return t.icon&&(o='style="',e.each(a,function(e,a){0===s++&&(a=a.replace("{url}",i.escape(t.icon))),n?r[e]=a:o+=e+":"+a+";"}),o+='"'),n?r:o},mime2class:function(e){var t="elfinder-cwd-icon-",n=e.toLowerCase(),i=this.textMimes[n];return n=n.split("/"),i?n[0]+=" "+t+"text":n[1]&&n[1].match(/\+xml$/)&&(n[0]+=" "+t+"xml"),t+n[0]+(n[1]?" "+t+n[1].replace(/(\.|\+)/g,"-"):"")},mime2kind:function(e){var t,n="object"==typeof e,i=n?e.mime:e;return n&&e.alias&&"symlink-broken"!=i?t="Alias":this.kinds[i]&&(t=!n||"directory"!==i||e.phash&&!e.isroot?this.kinds[i]:"Root"),t||(t=0===i.indexOf("text")?"Text":0===i.indexOf("image")?"Image":0===i.indexOf("audio")?"Audio":0===i.indexOf("video")?"Video":0===i.indexOf("application")?"App":i),this.messages["kind"+t]?this.i18n("kind"+t):i},mimeIsText:function(e){return!!(this.textMimes[e.toLowerCase()]||0===e.indexOf("text/")&&"rtf"!==e.substr(5,3)||e.match(/^application\/.+\+xml$/))},date:function(e,t){var n,i,a,o,r,s,l,c,d,p=this;return t||(t=new Date),s=t[p.getHours](),l=s>12?s-12:s,c=t[p.getMinutes](),d=t[p.getSeconds](),i=t[p.getDate](),a=t[p.getDay](),o=t[p.getMonth]()+1,r=t[p.getFullYear](),n=e.replace(/[a-z]/gi,function(e){switch(e){case"d":return i>9?i:"0"+i;case"j":return i;case"D":return p.i18n(p.i18.daysShort[a]);case"l":return p.i18n(p.i18.days[a]);case"m":return o>9?o:"0"+o;case"n":return o;case"M":return p.i18n(p.i18.monthsShort[o-1]);case"F":return p.i18n(p.i18.months[o-1]);case"Y":return r;case"y":return(""+r).substr(2);case"H":return s>9?s:"0"+s;case"G":return s;case"g":return l;case"h":return l>9?l:"0"+l;case"a":return s>=12?"pm":"am";case"A":return s>=12?"PM":"AM";case"i":return c>9?c:"0"+c;case"s":return d>9?d:"0"+d}return e})},formatDate:function(e,t){var n,i,a,o=this,r=t||e.ts;o.i18;return o.options.clientFormatDate&&r>0?(n=new Date(1e3*r),i=r>=this.yesterday?this.fancyFormat:this.dateFormat,a=o.date(i,n),r>=this.yesterday?a.replace("$1",this.i18n(r>=this.today?"Today":"Yesterday")):a):e.date?e.date.replace(/([a-z]+)\s/i,function(e,t){return o.i18n(t)+" "}):o.i18n("dateUnknown")},toLocaleString:function(e){var t=new Number(e);return t?t.toLocaleString?t.toLocaleString():String(e).replace(/(\d)(?=(\d\d\d)+(?!\d))/g,"$1,"):e},perms2class:function(e){var t="";return e.read||e.write?e.read?e.write||(t="elfinder-ro"):t="elfinder-wo":t="elfinder-na",e.type&&(t+=" elfinder-"+this.escape(e.type)),t},formatPermissions:function(e){var t=[];return e.read&&t.push(this.i18n("read")),e.write&&t.push(this.i18n("write")),t.length?t.join(" "+this.i18n("and")+" "):this.i18n("noaccess")},formatSize:function(e){var t=1,n="b";return"unknown"==e?this.i18n("unknown"):(e>1073741824?(t=1073741824,n="GB"):e>1048576?(t=1048576,n="MB"):e>1024&&(t=1024,n="KB"),e/=t,(e>0?t>=1048576?e.toFixed(2):Math.round(e):0)+" "+n)},formatFileMode:function(t,n){var i,a,o,r,s,l,c,d,p;if(n||(n=this.options.fileModeStyle.toLowerCase()),t=e.trim(t),t.match(/[rwxs-]{9}$/i)){if(d=t=t.substr(-9),"string"==n)return d;for(p="",o=0,i=0;i<7;i+=3)a=t.substr(i,3),r=0,a.match(/[r]/i)&&(r+=4),a.match(/[w]/i)&&(r+=2),a.match(/[xs]/i)&&(a.match(/[xs]/)&&(r+=1),a.match(/[s]/i)&&(0==i?o+=4:3==i&&(o+=2))),p+=r.toString(8);o&&(p=o.toString(8)+p)}else{if(t=parseInt(t,8),p=t?t.toString(8):"",!t||"octal"==n)return p;for(a=t.toString(8),o=0,a.length>3&&(a=a.substr(-4),o=parseInt(a.substr(0,1),8),a=a.substr(1)),s=1==(1&o),c=2==(2&o),l=4==(4&o),d="",i=0;i<3;i++)d+=4==(4&parseInt(a.substr(i,1),8))?"r":"-",d+=2==(2&parseInt(a.substr(i,1),8))?"w":"-",d+=1==(1&parseInt(a.substr(i,1),8))?0==i&&l||1==i&&c?"s":"x":"-"}return"both"==n?d+" ("+p+")":"string"==n?d:p},registRawStringDecoder:function(t){e.isFunction(t)&&(this.decodeRawString=this.options.rawStringDecoder=t)},uploadMimeCheck:function(t,n){n=n||this.cwd().hash;var i,a,o=!0,r=this.option("uploadMime",n),s=function(n){var i=!1;return"string"==typeof n&&"all"===n.toLowerCase()?i=!0:Array.isArray(n)&&n.length&&e.each(n,function(e,n){if(n=n.toLowerCase(),"all"===n||0===t.indexOf(n))return i=!0,!1}),i};return t&&e.isPlainObject(r)&&(t=t.toLowerCase(),i=s(r.allow),a=s(r.deny),"allow"===r.firstOrder?(o=!1,a||i!==!0||(o=!0)):(o=!0,a!==!0||i||(o=!1))),o},sequence:function(e){var t=e.length,n=function(t,i){return++i,e[i]?n(t.then(e[i]),i):t};return t>1?n(e[0](),0):e[0]()},reloadContents:function(t){var n,i=e.Deferred();try{n=e('<iframe width="1" height="1" scrolling="no" frameborder="no" style="position:absolute; top:-1px; left:-1px" crossorigin="use-credentials">').attr("src",t).one("load",function(){var n=e(this);try{this.contentDocument.location.reload(!0),n.one("load",function(){n.remove(),i.resolve()})}catch(a){n.attr("src","").attr("src",t).one("load",function(){n.remove(),i.resolve()})}}).appendTo("body")}catch(a){n&&n.remove(),i.reject()}return i},makeNetmountOptionOauth:function(t,n,i,a){var o,r="boolean"==typeof a?a:null,s=Object.assign({noOffline:!1,root:"root",pathI18n:"folderId",folders:!0},null===r?a||{}:{noOffline:r}),l=function(n,a,r){var d,p=this,u=Object.keys(e.isPlainObject(r)?r:{}).length;a.next().remove(),u&&(d=e('<select class="ui-corner-all elfinder-tabstop" style="max-width:200px;">').append(e(e.map(r,function(e,t){return'<option value="'+n.escape((t+"").trim())+'">'+n.escape(e)+"</option>"}).join(""))).on("change click",function(a){var r,d=e(this),u=d.val();p.inputs.path.val(u),!s.folders||"change"!==a.type&&d.data("current")===u||(d.next().remove(),d.data("current",u),u!=s.root&&(r=c(),o&&"pending"===o.state()&&n.abortXHR(o,{quiet:!0,abort:!0}),d.after(r),o=n.request({data:{cmd:"netmount",protocol:t,host:i,user:"init",path:u,pass:"folders"},preventDefault:!0}).done(function(e){l.call(p,n,d,e.folders)}).always(function(){n.abortXHR(o,{quiet:!0}),r.remove()}).xhr))}),a.after(e("<div/>").append(d)).closest(".ui-dialog").trigger("tabstopsInit"),d.trigger("focus"))},c=function(){return e('<div class="elfinder-netmount-spinner"/>').append('<span class="elfinder-spinner"/>')};return{vars:{},name:n,inputs:{offline:e('<input type="checkbox"/>').on("change",function(){e(this).parents("table.elfinder-netmount-tb").find("select:first").trigger("change","reset")}),host:e('<span><span class="elfinder-spinner"/></span><input type="hidden"/>'),path:e('<input type="text" value="'+s.root+'"/>'),user:e('<input type="hidden"/>'),pass:e('<input type="hidden"/>')},select:function(n,a,o){var r=this.inputs,l=r.offline,c=e(r.host[0]),d=o||null;this.vars.mbtn=r.host.closest(".ui-dialog").children(".ui-dialog-buttonpane:first").find("button.elfinder-btncnt-0"),c.data("inrequest")||!c.find("span.elfinder-spinner").length&&"reset"!==d&&("winfocus"!==d||c.siblings("span.elfinder-button-icon-reload").length)?(l.closest("tr")[s.noOffline||r.user.val()?"hide":"show"](),c.data("funcexpup")&&c.data("funcexpup")()):(1===l.parent().children().length&&(r.path.parent().prev().html(n.i18n(s.pathI18n)),l.attr("title",n.i18n("offlineAccess")),l.uniqueId().after(e("<label/>").attr("for",l.attr("id")).html(" "+n.i18n("offlineAccess")))),c.data("inrequest",!0).empty().addClass("elfinder-spinner").parent().find("span.elfinder-button-icon").remove(),n.request({data:{cmd:"netmount",protocol:t,host:i,user:"init",options:{id:n.id,offline:l.prop("checked")?1:0,pass:r.host[1].value}},preventDefault:!0}).done(function(e){c.removeClass("elfinder-spinner").html(e.body.replace(/\{msg:([^}]+)\}/g,function(e,t){return n.i18n(t,i)}))}),s.noOffline&&l.closest("tr").hide()),this.vars.mbtn[e(r.host[1]).val()?"show":"hide"]()},done:function(n,a){var o=this.inputs,r=this.protocol,c=e(o.host[0]),d=e(o.host[1]),p="&nbsp;";if(s.noOffline&&o.offline.closest("tr").hide(),"makebtn"==a.mode)c.removeClass("elfinder-spinner").removeData("expires").removeData("funcexpup"),o.host.find("input").on("mouseenter mouseleave",function(){e(this).toggleClass("ui-state-hover")}),d.val(""),o.path.val(s.root).next().remove(),o.user.val(""),o.pass.val(""),!s.noOffline&&o.offline.closest("tr").show(),this.vars.mbtn.hide();else if("folders"==a.mode)a.folders&&l.call(this,n,o.path.nextAll(":last"),a.folders);else{if(a.expires&&(p="()",c.data("expires",a.expires)),c.html(i+p).removeClass("elfinder-spinner"),a.expires&&(c.data("funcexpup",function(){var e=Math.floor((c.data("expires")-+new Date/1e3)/60);e<3?c.parent().children(".elfinder-button-icon-reload").click():(c.text(c.text().replace(/\(.*\)/,"("+n.i18n(["minsLeft",e])+")")),setTimeout(function(){c.is(":visible")&&c.data("funcexpup")()},6e4))}),c.data("funcexpup")()),a.reset)return void r.trigger("change","reset");c.parent().append(e('<span class="elfinder-button-icon elfinder-button-icon-reload" title="'+n.i18n("reAuth")+'">').on("click",function(){d.val("reauth"),r.trigger("change","reset")})),d.val(t),this.vars.mbtn.show(),a.folders&&l.call(this,n,o.path,a.folders),o.user.val("done"),o.pass.val("done"),o.offline.closest("tr").hide()}c.removeData("inrequest")},fail:function(t,n){e(this.inputs.host[0]).removeData("inrequest"),this.protocol.trigger("change","reset")},integrateInfo:s.integrate}},findCwdNodes:function(t,n){var i=this,a=(this.getUI("cwd"),this.cwd().hash),o=e();return n=n||{},e.each(t,function(e,t){if((t.phash===a||i.searchStatus.state>1)&&(o=o.add(i.cwdHash2Elm(t.hash)),n.firstOnly))return!1}),o},convAbsUrl:function(e){if(e.match(/^http/i))return e;if("//"===e.substr(0,2))return window.location.protocol+e;var t,n=window.location.protocol+"//"+window.location.host,i=/[^\/]+\/\.\.\//;for(t="/"===e.substr(0,1)?n+e:n+window.location.pathname.replace(/\/[^\/]+$/,"/")+e,t=t.replace("/./","/");i.test(t);)t=t.replace(i,"");return t},isSameOrigin:function(e){var t;if(e=this.convAbsUrl(e),location.origin&&window.URL)try{return t=new URL(e),location.origin===t.origin}catch(n){}return t=document.createElement("a"),t.href=e,location.protocol===t.protocol&&location.host===t.host&&location.port&&t.port},navHash2Id:function(e){return this.navPrefix+e},navId2Hash:function(e){return"string"==typeof e&&e.substr(this.navPrefix.length)},cwdHash2Id:function(e){return this.cwdPrefix+e},cwdId2Hash:function(e){return"string"==typeof e&&e.substr(this.cwdPrefix.length)},navHash2Elm:function(t){return e(document.getElementById(this.navHash2Id(t)))},cwdHash2Elm:function(t){return e(document.getElementById(this.cwdHash2Id(t)))},isInWindow:function(e,t){var n,i;return!!(n=e.get(0))&&(!(!t&&null===n.offsetParent)&&(i=n.getBoundingClientRect(),!!document.elementFromPoint(i.left,i.top)))},zIndexCalc:function(){var t=this,n=this.getUI(),i=n.css("z-index");i&&"auto"!==i&&"inherit"!==i?t.zIndex=i:n.parents().each(function(n,i){var a=e(i).css("z-index");if("auto"!==a&&"inherit"!==a&&(a=parseInt(a)))return t.zIndex=a,!1})},loadScript:function(t,n,i,a){var o,r,s={dataType:"script",cache:!0},l={},c={};return i=i||{},i.tryRequire&&this.hasRequire?require(t,n,i.error):(o=function(){var t,o,r;e.each(c,function(e,t){if("success"!==t&&"notmodified"!==t)return r=!0,!1}),r?i.error&&e.isFunction(i.error)&&i.error({loadResults:c}):e.isFunction(n)&&(a&&"undefined"==typeof a.obj[a.name]?(t=a.timeout?a.timeout/10:1,o=setInterval(function(){(--t<0||"undefined"!=typeof a.obj[a.name])&&(clearInterval(o),n())},10)):n())},"tag"===i.loadType?(e("head > script").each(function(){l[this.src]=this}),r=t.length,e.each(t,function(t,n){var a,s=!1;l[n]?(c[t]=l[n]._error||"success",--r<1&&o()):(a=document.createElement("script"),a.charset=i.charset||"UTF-8",e("head").append(a),a.onload=a.onreadystatechange=function(){s||this.readyState&&"loaded"!==this.readyState&&"complete"!==this.readyState||(s=!0,c[t]="success",--r<1&&o())},a.onerror=function(e){c[t]=a._error=e&&e.type?e.type:"error",--r<1&&o()},a.src=n)})):(i=e.isPlainObject(i)?Object.assign(s,i):s,r=0,function d(n,a){void 0!==n&&(c[r++]=a),t.length?e.ajax(Object.assign({},i,{url:t.shift(),success:d,error:d})):o()}())),this},loadCss:function(t,n){var i,a,o=this;return"string"==typeof t&&(t=[t]),n&&(n.className&&(i=n.className),n.dfd&&n.dfd.promise&&(a=[])),e.each(t,function(t,n){var r;n=o.convAbsUrl(n).replace(/^https?:/i,""),a&&(a[t]=e.Deferred()),e("head > link[href='+url+']").length?a&&a[t].resolve():(r=document.createElement("link"),r.type="text/css",r.rel="stylesheet",r.href=n,i&&(r.className=i),a&&(r.onload=function(){a[t].resolve()},r.onerror=function(){a[t].reject()}),e("head").append(r))}),a&&e.when.apply(null,a).done(function(){n.dfd.resolve()}).fail(function(){n.dfd.reject()}),this},asyncJob:function(t,n,i){var a,o,r=e.Deferred(),s=!1,l=Object.assign({interval:0,numPerOnce:1},i||{}),c=[],d=[],p=[];return r._abort=function(e){o&&clearTimeout(o),d=[],s=!0,"pending"===r.state()&&r[e?"resolve":"reject"](c)},r.fail(function(){r._abort()}).always(function(){r._abort=function(){}}),"function"==typeof t&&Array.isArray(n)?(d=n.concat(),a=function(){var e,n,i;if(!s){for(p=d.splice(0,l.numPerOnce),n=p.length,e=0;e<n&&!s;e++)i=t(p[e]),null!==i&&c.push(i);s||(d.length?o=setTimeout(a,l.interval):r.resolve(c))}},d.length?o=setTimeout(a,0):r.resolve(c)):r.reject(),r},getSize:function(t){var n=this,i=[],a=t.length,o=e.Deferred().fail(function(){e.each(i,function(e,t){t&&(t.syncOnFail&&t.syncOnFail(!1),t.reject())})}),r=function(t){var i=[];return"directory"===t.mime&&e.each(n.leafRoots,function(e,a){var o;if(e===t.hash)i.push.apply(i,a);else for(o=(n.file(e)||{}).phash;o;)o===t.hash&&i.push.apply(i,a),o=(n.file(o)||{}).phash}),i},s=function(t){var i=e.Deferred(),a=n.file(t),o=a?a.phash:t;return o&&!n.file(o)?n.request({data:{cmd:"parents",target:o},preventFail:!0}).done(function(){n.one("parentsdone",function(){i.resolve()})}).fail(function(){i.resolve()}):i.resolve(),i},l=function(){var t=e.Deferred(),i=Object.keys(n.leafRoots).length;return i>0?e.each(n.leafRoots,function(e){s(e).done(function(){--i,i<1&&t.resolve()})}):t.resolve(),t};return n.autoSync("stop"),l().done(function(){var s=[],l={},c=[],d=[],p={};e.each(t,function(){s.push.apply(s,r(n.file(this)))}),t.push.apply(t,s),e.each(t,function(){var t=n.root(this),i=n.file(this);i&&(i.sizeInfo||"directory"!==i.mime)?d.push(e.Deferred().resolve(i.sizeInfo?i.sizeInfo:{size:i.size,dirCnt:0,fileCnt:1})):l[t]?l[t].push(this):l[t]=[this]}),e.each(l,function(){var e=c.length;1===this.length&&(p[e]=this[0]),c.push(n.request({data:{cmd:"size",targets:this},preventDefault:!0}))}),i.push.apply(i,c),c.push.apply(c,d),e.when.apply(e,c).fail(function(){o.reject()}).done(function(){var t,i,r,s=function(t,i){var a;(a=n.file(t))&&(a.sizeInfo={isCache:!0},e.each(["size","dirCnt","fileCnt"],function(){a.sizeInfo[this]=i[this]||0}),a.size=parseInt(a.sizeInfo.size),m.push(a))},l=0,c=0,d=0,u=arguments.length,h=[],f="",m=[];for(t=0;t<u;t++)r=arguments[t],i=null,r.isCache||(p[t]&&(i=n.file(p[t]))?s(p[t],r):r.sizes&&e.isPlainObject(r.sizes)&&e.each(r.sizes,function(e,t){s(e,t)})),l+=parseInt(r.size),c!==!1&&("undefined"==typeof r.fileCnt&&(c=!1),c+=parseInt(r.fileCnt||0)),d!==!1&&("undefined"==typeof r.dirCnt&&(d=!1),d+=parseInt(r.dirCnt||0));m.length&&n.change({changed:m}),d!==!1&&h.push(n.i18n("folders")+": "+(d-(a>1?0:1))),c!==!1&&h.push(n.i18n("files")+": "+c),h.length&&(f="<br>"+h.join(", ")),o.resolve({size:l,fileCnt:c,dirCnt:d,formated:(l>=0?n.formatSize(l):n.i18n("unknown"))+f})}),n.autoSync()}),o},getTheme:function(t){var n,i,a=this,o=e.Deferred(),r=function(t,n){return n||(n=a.convAbsUrl(a.baseUrl)),Array.isArray(t)?e.map(t,function(e){return r(e,n)}):t.match(/^(?:http|\/\/)/i)?t:n+t.replace(/^(?:\.\/|\/)/,"")};return t&&(n=a.options.themes[t])?"string"==typeof n?(url=r(n),(i=url.match(/^(.+\/)[^/]+\.json$/i))?e.getJSON(url).done(function(e){n=e,n.id=t,n.cssurls&&(n.cssurls=r(n.cssurls,i[1])),o.resolve(n)}).fail(function(){o.reject()}):o.resolve({id:t,name:t,cssurls:[url]})):e.isPlainObject(n)&&n.cssurls?(n.id=t,n.cssurls=r(n.cssurls),Array.isArray(n.cssurls)||(n.cssurls=[n.cssurls]),n.name||(n.name=t),o.resolve(n)):o.reject():o.reject(),o},changeTheme:function(t){var n=this;return t&&(!n.options.themes[t]||n.theme&&n.theme.id===t?"default"===t&&n.theme&&(e("head>link.elfinder-theme-ext").remove(),n.theme=null,n.trigger&&n.trigger("themechange")):n.getTheme(t).done(function(t){t.cssurls&&(e("head>link.elfinder-theme-ext").remove(),n.loadCss(t.cssurls,{className:"elfinder-theme-ext",dfd:e.Deferred().done(function(){n.theme=t,n.trigger&&n.trigger("themechange")})}))})),this},applyLeafRootStats:function(t,n){var i=this,a=n?t:i.file(t.hash)||t,o=a.ts,r=!1;return!n&&t._realStats||(t._realStats={locked:t.locked||0,dirs:t.dirs||0,ts:t.ts}),t.locked=1,a.locked||(r=!0),t.dirs=1,a.dirs||(r=!0),e.each(i.leafRoots[t.hash],function(){var e=i.file(this);e&&e.ts&&(t.ts||0)<e.ts&&(t.ts=e.ts)}),o!==t.ts&&(r=!0),r},abortXHR:function(e,t){var n=t||{};e&&(n.quiet&&(e.quiet=!0),n.abort&&e._requestId&&this.request({data:{cmd:"abort",id:e._requestId},preventDefault:!0}),e.abort(),e=void 0)},getRequestId:function(){return(+new Date).toString(16)+Math.floor(1e3*Math.random()).toString(16)},arrayFlip:function(t,n){var i,a={},o=e.isArray(t);for(i in t)(o||t.hasOwnProperty(i))&&(a[t[i]]=n||i);return a},splitFileExtention:function(e){var t;return(t=e.match(/^(.+?)?\.((?:tar\.(?:gz|bz|bz2|z|lzo))|cpio\.gz|ps\.gz|xcf\.(?:gz|bz2)|[a-z0-9]{1,10})$/i))?("undefined"==typeof t[1]&&(t[1]=""),[t[1],t[2]]):[e,""]},sliceArrayBuffer:function(e,t){for(var n=[],i=0;i*t<e.byteLength;)n.push(e.slice(i*t,(i+1)*t)),i++;return n},arrayBufferToBase64:function(e){if(!window.btoa)return"";var t=new Uint8Array(e),n=Array.prototype.slice.call(t),i=n.map(function(e){return String.fromCharCode(e)});return window.btoa(i.join(""))},log:function(e){return window.console&&window.console.log&&window.console.log(e),this},debug:function(e,t){var n=this.options.debug;return n&&("all"===n||n[e])&&window.console&&window.console.log&&window.console.log("elfinder debug: ["+e+"] ["+this.id+"]",t),"backend-error"===e?(!this.cwd().hash||n&&("all"===n||n["backend-error"]))&&(t=Array.isArray(t)?t:[t],this.error(t)):"backend-debug"===e&&this.trigger("backenddebug",t),this},time:function(e){window.console&&window.console.time&&window.console.time(e)},timeEnd:function(e){window.console&&window.console.timeEnd&&window.console.timeEnd(e)}},Object.keys||(Object.keys=function(){var e=Object.prototype.hasOwnProperty,t=!{toString:null}.propertyIsEnumerable("toString"),n=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],i=n.length;return function(a){if("object"!=typeof a&&"function"!=typeof a||null===a)throw new TypeError("Object.keys called on non-object");var o=[];for(var r in a)e.call(a,r)&&o.push(r);if(t)for(var s=0;s<i;s++)e.call(a,n[s])&&o.push(n[s]);return o}}()),Array.isArray||(Array.isArray=function(e){return jQuery.isArray(e)}),Object.assign||(Object.assign=function(){return jQuery.extend.apply(null,arguments)}),String.prototype.repeat||(String.prototype.repeat=function(e){"use strict";if(null==this)throw new TypeError("can't convert "+this+" to object");var t=""+this;if(e=+e,e!=e&&(e=0),e<0)throw new RangeError("repeat count must be non-negative");if(e==1/0)throw new RangeError("repeat count must be less than infinity");if(e=Math.floor(e),0==t.length||0==e)return"";if(t.length*e>=1<<28)throw new RangeError("repeat count must not overflow maximum string size");for(var n="",i=0;i<e;i++)n+=t;return n}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}),function(){try{return void Array.apply(null,{})}catch(e){}var t=Object.prototype.toString,n="[object Array]",i=Function.prototype.apply,a=Array.prototype.slice;Function.prototype.apply=function(e,o){return i.call(this,e,t.call(o)===n?o:a.call(o))}}(),Array.from||(Array.from=function(e){return 1===e.length?[e[0]]:Array.apply(null,e)}),window.cancelAnimationFrame||!function(){for(var e=0,t=["ms","moz","webkit","o"],n=0;n<t.length&&!window.requestAnimationFrame;++n)window.requestAnimationFrame=window[t[n]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[t[n]+"CancelAnimationFrame"]||window[t[n]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t,n){var i=(new Date).getTime(),a=Math.max(0,16-(i-e)),o=window.setTimeout(function(){t(i+a)},a);return e=i+a,o}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(e){clearTimeout(e)})}(),i.prototype.version="2.1.49",function(){if(e.ui&&e.ui.ddmanager){var t=e.ui.ddmanager.prepareOffsets;e.ui.ddmanager.prepareOffsets=function(n,i){var a=function(e){if(e.is(":hidden"))return!0;var t=e[0].getBoundingClientRect();return!document.elementFromPoint(t.left,t.top)&&!document.elementFromPoint(t.left+t.width,t.top+t.height)};if("mousedown"===i.type||n.options.elfRefresh){
var o,r,s=e.ui.ddmanager.droppables[n.options.scope]||[],l=s.length;for(o=0;o<l;o++)r=s[o],r.options.autoDisable&&(!r.options.disabled||r.options.autoDisable>1)&&(r.options.disabled=a(r.element),r.options.autoDisable=r.options.disabled?2:1)}return t(n,i)}}}(),e.ajaxTransport("+binary",function(e,t,n){if(window.FormData&&(e.dataType&&"binary"==e.dataType||e.data&&(window.ArrayBuffer&&e.data instanceof ArrayBuffer||window.Blob&&e.data instanceof Blob))){var i;return{send:function(t,n){i=new XMLHttpRequest;var a=e.url,o=e.type,r=e.async||!0,s=e.responseType||"blob",l=e.data||null,c=e.username,d=e.password;i.addEventListener("load",function(){var t={};t[e.dataType]=i.response,n(i.status,i.statusText,t,i.getAllResponseHeaders())}),i.open(o,a,r,c,d);for(var p in t)i.setRequestHeader(p,t[p]);if(e.xhrFields)for(var u in e.xhrFields)u in i&&(i[u]=e.xhrFields[u]);i.responseType=s,i.send(l)},abort:function(){i.abort()}}}}),function(e){function t(t,n){if(!(t.originalEvent.touches.length>1)){e(t.currentTarget).hasClass("touch-punch-keep-default")||t.preventDefault();var i=t.originalEvent.changedTouches[0],a=document.createEvent("MouseEvents");a.initMouseEvent(n,!0,!0,window,1,i.screenX,i.screenY,i.clientX,i.clientY,!1,!1,!1,!1,0,null),t.target.dispatchEvent(a)}}if(e.support.touch="ontouchend"in document,e.support.touch){var n,i,a,o=e.ui.mouse.prototype,r=o._mouseInit,s=o._mouseDestroy;o._touchStart=function(e){var o=this;!n&&o._mouseCapture(e.originalEvent.changedTouches[0])&&(i=e.originalEvent.changedTouches[0].screenX.toFixed(0),a=e.originalEvent.changedTouches[0].screenY.toFixed(0),n=!0,o._touchMoved=!1,t(e,"mouseover"),t(e,"mousemove"),t(e,"mousedown"))},o._touchMove=function(e){if(n){var o=e.originalEvent.changedTouches[0].screenX.toFixed(0),r=e.originalEvent.changedTouches[0].screenY.toFixed(0);Math.abs(i-o)<=4&&Math.abs(a-r)<=4||(this._touchMoved=!0,t(e,"mousemove"))}},o._touchEnd=function(e){n&&(t(e,"mouseup"),t(e,"mouseout"),this._touchMoved||t(e,"click"),n=!1,this._touchMoved=!1)},o._mouseInit=function(){var t=this;t.element.hasClass("touch-punch")&&t.element.on({touchstart:e.proxy(t,"_touchStart"),touchmove:e.proxy(t,"_touchMove"),touchend:e.proxy(t,"_touchEnd")}),r.call(t)},o._mouseDestroy=function(){var t=this;t.element.hasClass("touch-punch")&&t.element.off({touchstart:e.proxy(t,"_touchStart"),touchmove:e.proxy(t,"_touchMove"),touchend:e.proxy(t,"_touchEnd")}),s.call(t)}}}(jQuery),e.fn.elfinder=function(t,n){return"instance"===t?this.getElFinder():this.each(function(){var a,o="string"==typeof t?t:"",r="function"==typeof n?n:void 0;if(this.elfinder)switch(o){case"close":case"hide":this.elfinder.hide();break;case"open":case"show":this.elfinder.show();break;case"destroy":this.elfinder.destroy();break;case"reload":case"restart":this.elfinder&&(a=this.elfinder.options,r=this.elfinder.bootCallback,this.elfinder.destroy(),new i(this,e.extend(!0,a,e.isPlainObject(n)?n:{}),r))}else e.isPlainObject(t)&&new i(this,t,r)})},e.fn.getElFinder=function(){var e;return this.each(function(){if(this.elfinder)return e=this.elfinder,!1}),e},e.fn.elfUiWidgetInstance=function(e){try{return this[e]("instance")}catch(t){var n=this.data("ui-"+e);return n&&"object"==typeof n&&n.widgetFullName==="ui-"+e?n:null}},e.fn.scrollRight||e.fn.extend({scrollRight:function(e){var t=this.get(0);return void 0===e?Math.max(0,t.scrollWidth-(t.scrollLeft+t.clientWidth)):this.scrollLeft(t.scrollWidth-t.clientWidth-e)}}),e.fn.scrollBottom||e.fn.extend({scrollBottom:function(e){var t=this.get(0);return void 0===e?Math.max(0,t.scrollHeight-(t.scrollTop+t.clientHeight)):this.scrollTop(t.scrollHeight-t.clientHeight-e)}}),i.prototype.mimeTypes={"application/x-executable":"exe","application/x-jar":"jar","application/x-gzip":"gz","application/x-bzip2":"tbz","application/x-rar":"rar","text/x-php":"php","text/javascript":"js","application/rtfd":"rtfd","text/x-python":"py","text/x-ruby":"rb","text/x-shellscript":"sh","text/x-perl":"pl","text/xml":"xml","text/x-csrc":"c","text/x-chdr":"h","text/x-c++src":"cpp","text/x-c++hdr":"hh","text/x-markdown":"md","text/x-yaml":"yml","image/x-ms-bmp":"bmp","image/x-targa":"tga","image/xbm":"xbm","image/pxm":"pxm","audio/wav":"wav","video/x-dv":"dv","video/x-ms-wmv":"wm","video/ogg":"ogm","video/MP2T":"m2ts","application/x-mpegURL":"m3u8","application/dash+xml":"mpd","application/andrew-inset":"ez","application/applixware":"aw","application/atom+xml":"atom","application/atomcat+xml":"atomcat","application/atomsvc+xml":"atomsvc","application/ccxml+xml":"ccxml","application/cdmi-capability":"cdmia","application/cdmi-container":"cdmic","application/cdmi-domain":"cdmid","application/cdmi-object":"cdmio","application/cdmi-queue":"cdmiq","application/cu-seeme":"cu","application/davmount+xml":"davmount","application/docbook+xml":"dbk","application/dssc+der":"dssc","application/dssc+xml":"xdssc","application/ecmascript":"ecma","application/emma+xml":"emma","application/epub+zip":"epub","application/exi":"exi","application/font-tdpfr":"pfr","application/gml+xml":"gml","application/gpx+xml":"gpx","application/gxf":"gxf","application/hyperstudio":"stk","application/inkml+xml":"ink","application/ipfix":"ipfix","application/java-serialized-object":"ser","application/java-vm":"class","application/json":"json","application/jsonml+json":"jsonml","application/lost+xml":"lostxml","application/mac-binhex40":"hqx","application/mac-compactpro":"cpt","application/mads+xml":"mads","application/marc":"mrc","application/marcxml+xml":"mrcx","application/mathematica":"ma","application/mathml+xml":"mathml","application/mbox":"mbox","application/mediaservercontrol+xml":"mscml","application/metalink+xml":"metalink","application/metalink4+xml":"meta4","application/mets+xml":"mets","application/mods+xml":"mods","application/mp21":"m21","application/mp4":"mp4s","application/msword":"doc","application/mxf":"mxf","application/octet-stream":"bin","application/oda":"oda","application/oebps-package+xml":"opf","application/ogg":"ogx","application/omdoc+xml":"omdoc","application/onenote":"onetoc","application/oxps":"oxps","application/patch-ops-error+xml":"xer","application/pdf":"pdf","application/pgp-encrypted":"pgp","application/pgp-signature":"asc","application/pics-rules":"prf","application/pkcs10":"p10","application/pkcs7-mime":"p7m","application/pkcs7-signature":"p7s","application/pkcs8":"p8","application/pkix-attr-cert":"ac","application/pkix-cert":"cer","application/pkix-crl":"crl","application/pkix-pkipath":"pkipath","application/pkixcmp":"pki","application/pls+xml":"pls","application/postscript":"ai","application/prs.cww":"cww","application/pskc+xml":"pskcxml","application/rdf+xml":"rdf","application/reginfo+xml":"rif","application/relax-ng-compact-syntax":"rnc","application/resource-lists+xml":"rl","application/resource-lists-diff+xml":"rld","application/rls-services+xml":"rs","application/rpki-ghostbusters":"gbr","application/rpki-manifest":"mft","application/rpki-roa":"roa","application/rsd+xml":"rsd","application/rss+xml":"rss","application/rtf":"rtf","application/sbml+xml":"sbml","application/scvp-cv-request":"scq","application/scvp-cv-response":"scs","application/scvp-vp-request":"spq","application/scvp-vp-response":"spp","application/sdp":"sdp","application/set-payment-initiation":"setpay","application/set-registration-initiation":"setreg","application/shf+xml":"shf","application/smil+xml":"smi","application/sparql-query":"rq","application/sparql-results+xml":"srx","application/srgs":"gram","application/srgs+xml":"grxml","application/sru+xml":"sru","application/ssdl+xml":"ssdl","application/ssml+xml":"ssml","application/tei+xml":"tei","application/thraud+xml":"tfi","application/timestamped-data":"tsd","application/vnd.3gpp.pic-bw-large":"plb","application/vnd.3gpp.pic-bw-small":"psb","application/vnd.3gpp.pic-bw-var":"pvb","application/vnd.3gpp2.tcap":"tcap","application/vnd.3m.post-it-notes":"pwn","application/vnd.accpac.simply.aso":"aso","application/vnd.accpac.simply.imp":"imp","application/vnd.acucobol":"acu","application/vnd.acucorp":"atc","application/vnd.adobe.air-application-installer-package+zip":"air","application/vnd.adobe.formscentral.fcdt":"fcdt","application/vnd.adobe.fxp":"fxp","application/vnd.adobe.xdp+xml":"xdp","application/vnd.adobe.xfdf":"xfdf","application/vnd.ahead.space":"ahead","application/vnd.airzip.filesecure.azf":"azf","application/vnd.airzip.filesecure.azs":"azs","application/vnd.amazon.ebook":"azw","application/vnd.americandynamics.acc":"acc","application/vnd.amiga.ami":"ami","application/vnd.android.package-archive":"apk","application/vnd.anser-web-certificate-issue-initiation":"cii","application/vnd.anser-web-funds-transfer-initiation":"fti","application/vnd.antix.game-component":"atx","application/vnd.apple.installer+xml":"mpkg","application/vnd.aristanetworks.swi":"swi","application/vnd.astraea-software.iota":"iota","application/vnd.audiograph":"aep","application/vnd.blueice.multipass":"mpm","application/vnd.bmi":"bmi","application/vnd.businessobjects":"rep","application/vnd.chemdraw+xml":"cdxml","application/vnd.chipnuts.karaoke-mmd":"mmd","application/vnd.cinderella":"cdy","application/vnd.claymore":"cla","application/vnd.cloanto.rp9":"rp9","application/vnd.clonk.c4group":"c4g","application/vnd.cluetrust.cartomobile-config":"c11amc","application/vnd.cluetrust.cartomobile-config-pkg":"c11amz","application/vnd.commonspace":"csp","application/vnd.contact.cmsg":"cdbcmsg","application/vnd.cosmocaller":"cmc","application/vnd.crick.clicker":"clkx","application/vnd.crick.clicker.keyboard":"clkk","application/vnd.crick.clicker.palette":"clkp","application/vnd.crick.clicker.template":"clkt","application/vnd.crick.clicker.wordbank":"clkw","application/vnd.criticaltools.wbs+xml":"wbs","application/vnd.ctc-posml":"pml","application/vnd.cups-ppd":"ppd","application/vnd.curl.car":"car","application/vnd.curl.pcurl":"pcurl","application/vnd.dart":"dart","application/vnd.data-vision.rdz":"rdz","application/vnd.dece.data":"uvf","application/vnd.dece.ttml+xml":"uvt","application/vnd.dece.unspecified":"uvx","application/vnd.dece.zip":"uvz","application/vnd.denovo.fcselayout-link":"fe_launch","application/vnd.dna":"dna","application/vnd.dolby.mlp":"mlp","application/vnd.dpgraph":"dpg","application/vnd.dreamfactory":"dfac","application/vnd.ds-keypoint":"kpxx","application/vnd.dvb.ait":"ait","application/vnd.dvb.service":"svc","application/vnd.dynageo":"geo","application/vnd.ecowin.chart":"mag","application/vnd.enliven":"nml","application/vnd.epson.esf":"esf","application/vnd.epson.msf":"msf","application/vnd.epson.quickanime":"qam","application/vnd.epson.salt":"slt","application/vnd.epson.ssf":"ssf","application/vnd.eszigno3+xml":"es3","application/vnd.ezpix-album":"ez2","application/vnd.ezpix-package":"ez3","application/vnd.fdf":"fdf","application/vnd.fdsn.mseed":"mseed","application/vnd.fdsn.seed":"seed","application/vnd.flographit":"gph","application/vnd.fluxtime.clip":"ftc","application/vnd.framemaker":"fm","application/vnd.frogans.fnc":"fnc","application/vnd.frogans.ltf":"ltf","application/vnd.fsc.weblaunch":"fsc","application/vnd.fujitsu.oasys":"oas","application/vnd.fujitsu.oasys2":"oa2","application/vnd.fujitsu.oasys3":"oa3","application/vnd.fujitsu.oasysgp":"fg5","application/vnd.fujitsu.oasysprs":"bh2","application/vnd.fujixerox.ddd":"ddd","application/vnd.fujixerox.docuworks":"xdw","application/vnd.fujixerox.docuworks.binder":"xbd","application/vnd.fuzzysheet":"fzs","application/vnd.genomatix.tuxedo":"txd","application/vnd.geogebra.file":"ggb","application/vnd.geogebra.tool":"ggt","application/vnd.geometry-explorer":"gex","application/vnd.geonext":"gxt","application/vnd.geoplan":"g2w","application/vnd.geospace":"g3w","application/vnd.gmx":"gmx","application/vnd.google-earth.kml+xml":"kml","application/vnd.google-earth.kmz":"kmz","application/vnd.grafeq":"gqf","application/vnd.groove-account":"gac","application/vnd.groove-help":"ghf","application/vnd.groove-identity-message":"gim","application/vnd.groove-injector":"grv","application/vnd.groove-tool-message":"gtm","application/vnd.groove-tool-template":"tpl","application/vnd.groove-vcard":"vcg","application/vnd.hal+xml":"hal","application/vnd.handheld-entertainment+xml":"zmm","application/vnd.hbci":"hbci","application/vnd.hhe.lesson-player":"les","application/vnd.hp-hpgl":"hpgl","application/vnd.hp-hpid":"hpid","application/vnd.hp-hps":"hps","application/vnd.hp-jlyt":"jlt","application/vnd.hp-pcl":"pcl","application/vnd.hp-pclxl":"pclxl","application/vnd.hydrostatix.sof-data":"sfd-hdstx","application/vnd.ibm.minipay":"mpy","application/vnd.ibm.modcap":"afp","application/vnd.ibm.rights-management":"irm","application/vnd.ibm.secure-container":"sc","application/vnd.iccprofile":"icc","application/vnd.igloader":"igl","application/vnd.immervision-ivp":"ivp","application/vnd.immervision-ivu":"ivu","application/vnd.insors.igm":"igm","application/vnd.intercon.formnet":"xpw","application/vnd.intergeo":"i2g","application/vnd.intu.qbo":"qbo","application/vnd.intu.qfx":"qfx","application/vnd.ipunplugged.rcprofile":"rcprofile","application/vnd.irepository.package+xml":"irp","application/vnd.is-xpr":"xpr","application/vnd.isac.fcs":"fcs","application/vnd.jam":"jam","application/vnd.jcp.javame.midlet-rms":"rms","application/vnd.jisp":"jisp","application/vnd.joost.joda-archive":"joda","application/vnd.kahootz":"ktz","application/vnd.kde.karbon":"karbon","application/vnd.kde.kchart":"chrt","application/vnd.kde.kformula":"kfo","application/vnd.kde.kivio":"flw","application/vnd.kde.kontour":"kon","application/vnd.kde.kpresenter":"kpr","application/vnd.kde.kspread":"ksp","application/vnd.kde.kword":"kwd","application/vnd.kenameaapp":"htke","application/vnd.kidspiration":"kia","application/vnd.kinar":"kne","application/vnd.koan":"skp","application/vnd.kodak-descriptor":"sse","application/vnd.las.las+xml":"lasxml","application/vnd.llamagraphics.life-balance.desktop":"lbd","application/vnd.llamagraphics.life-balance.exchange+xml":"lbe","application/vnd.lotus-1-2-3":123,"application/vnd.lotus-approach":"apr","application/vnd.lotus-freelance":"pre","application/vnd.lotus-notes":"nsf","application/vnd.lotus-organizer":"org","application/vnd.lotus-screencam":"scm","application/vnd.lotus-wordpro":"lwp","application/vnd.macports.portpkg":"portpkg","application/vnd.mcd":"mcd","application/vnd.medcalcdata":"mc1","application/vnd.mediastation.cdkey":"cdkey","application/vnd.mfer":"mwf","application/vnd.mfmp":"mfm","application/vnd.micrografx.flo":"flo","application/vnd.micrografx.igx":"igx","application/vnd.mif":"mif","application/vnd.mobius.daf":"daf","application/vnd.mobius.dis":"dis","application/vnd.mobius.mbk":"mbk","application/vnd.mobius.mqy":"mqy","application/vnd.mobius.msl":"msl","application/vnd.mobius.plc":"plc","application/vnd.mobius.txf":"txf","application/vnd.mophun.application":"mpn","application/vnd.mophun.certificate":"mpc","application/vnd.mozilla.xul+xml":"xul","application/vnd.ms-artgalry":"cil","application/vnd.ms-cab-compressed":"cab","application/vnd.ms-excel":"xls","application/vnd.ms-excel.addin.macroenabled.12":"xlam","application/vnd.ms-excel.sheet.binary.macroenabled.12":"xlsb","application/vnd.ms-excel.sheet.macroenabled.12":"xlsm","application/vnd.ms-excel.template.macroenabled.12":"xltm","application/vnd.ms-fontobject":"eot","application/vnd.ms-htmlhelp":"chm","application/vnd.ms-ims":"ims","application/vnd.ms-lrm":"lrm","application/vnd.ms-officetheme":"thmx","application/vnd.ms-pki.seccat":"cat","application/vnd.ms-pki.stl":"stl","application/vnd.ms-powerpoint":"ppt","application/vnd.ms-powerpoint.addin.macroenabled.12":"ppam","application/vnd.ms-powerpoint.presentation.macroenabled.12":"pptm","application/vnd.ms-powerpoint.slide.macroenabled.12":"sldm","application/vnd.ms-powerpoint.slideshow.macroenabled.12":"ppsm","application/vnd.ms-powerpoint.template.macroenabled.12":"potm","application/vnd.ms-project":"mpp","application/vnd.ms-word.document.macroenabled.12":"docm","application/vnd.ms-word.template.macroenabled.12":"dotm","application/vnd.ms-works":"wps","application/vnd.ms-wpl":"wpl","application/vnd.ms-xpsdocument":"xps","application/vnd.mseq":"mseq","application/vnd.musician":"mus","application/vnd.muvee.style":"msty","application/vnd.mynfc":"taglet","application/vnd.neurolanguage.nlu":"nlu","application/vnd.nitf":"ntf","application/vnd.noblenet-directory":"nnd","application/vnd.noblenet-sealer":"nns","application/vnd.noblenet-web":"nnw","application/vnd.nokia.n-gage.data":"ngdat","application/vnd.nokia.n-gage.symbian.install":"n-gage","application/vnd.nokia.radio-preset":"rpst","application/vnd.nokia.radio-presets":"rpss","application/vnd.novadigm.edm":"edm","application/vnd.novadigm.edx":"edx","application/vnd.novadigm.ext":"ext","application/vnd.oasis.opendocument.chart":"odc","application/vnd.oasis.opendocument.chart-template":"otc","application/vnd.oasis.opendocument.database":"odb","application/vnd.oasis.opendocument.formula":"odf","application/vnd.oasis.opendocument.formula-template":"odft","application/vnd.oasis.opendocument.graphics":"odg","application/vnd.oasis.opendocument.graphics-template":"otg","application/vnd.oasis.opendocument.image":"odi","application/vnd.oasis.opendocument.image-template":"oti","application/vnd.oasis.opendocument.presentation":"odp","application/vnd.oasis.opendocument.presentation-template":"otp","application/vnd.oasis.opendocument.spreadsheet":"ods","application/vnd.oasis.opendocument.spreadsheet-template":"ots","application/vnd.oasis.opendocument.text":"odt","application/vnd.oasis.opendocument.text-master":"odm","application/vnd.oasis.opendocument.text-template":"ott","application/vnd.oasis.opendocument.text-web":"oth","application/vnd.olpc-sugar":"xo","application/vnd.oma.dd2+xml":"dd2","application/vnd.openofficeorg.extension":"oxt","application/vnd.openxmlformats-officedocument.presentationml.presentation":"pptx","application/vnd.openxmlformats-officedocument.presentationml.slide":"sldx","application/vnd.openxmlformats-officedocument.presentationml.slideshow":"ppsx","application/vnd.openxmlformats-officedocument.presentationml.template":"potx","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":"xlsx","application/vnd.openxmlformats-officedocument.spreadsheetml.template":"xltx","application/vnd.openxmlformats-officedocument.wordprocessingml.document":"docx","application/vnd.openxmlformats-officedocument.wordprocessingml.template":"dotx","application/vnd.osgeo.mapguide.package":"mgp","application/vnd.osgi.dp":"dp","application/vnd.osgi.subsystem":"esa","application/vnd.palm":"pdb","application/vnd.pawaafile":"paw","application/vnd.pg.format":"str","application/vnd.pg.osasli":"ei6","application/vnd.picsel":"efif","application/vnd.pmi.widget":"wg","application/vnd.pocketlearn":"plf","application/vnd.powerbuilder6":"pbd","application/vnd.previewsystems.box":"box","application/vnd.proteus.magazine":"mgz","application/vnd.publishare-delta-tree":"qps","application/vnd.pvi.ptid1":"ptid","application/vnd.quark.quarkxpress":"qxd","application/vnd.realvnc.bed":"bed","application/vnd.recordare.musicxml":"mxl","application/vnd.recordare.musicxml+xml":"musicxml","application/vnd.rig.cryptonote":"cryptonote","application/vnd.rim.cod":"cod","application/vnd.rn-realmedia":"rm","application/vnd.rn-realmedia-vbr":"rmvb","application/vnd.route66.link66+xml":"link66","application/vnd.sailingtracker.track":"st","application/vnd.seemail":"see","application/vnd.sema":"sema","application/vnd.semd":"semd","application/vnd.semf":"semf","application/vnd.shana.informed.formdata":"ifm","application/vnd.shana.informed.formtemplate":"itp","application/vnd.shana.informed.interchange":"iif","application/vnd.shana.informed.package":"ipk","application/vnd.simtech-mindmapper":"twd","application/vnd.smaf":"mmf","application/vnd.smart.teacher":"teacher","application/vnd.solent.sdkm+xml":"sdkm","application/vnd.spotfire.dxp":"dxp","application/vnd.spotfire.sfs":"sfs","application/vnd.stardivision.calc":"sdc","application/vnd.stardivision.draw":"sda","application/vnd.stardivision.impress":"sdd","application/vnd.stardivision.math":"smf","application/vnd.stardivision.writer":"sdw","application/vnd.stardivision.writer-global":"sgl","application/vnd.stepmania.package":"smzip","application/vnd.stepmania.stepchart":"sm","application/vnd.sun.xml.calc":"sxc","application/vnd.sun.xml.calc.template":"stc","application/vnd.sun.xml.draw":"sxd","application/vnd.sun.xml.draw.template":"std","application/vnd.sun.xml.impress":"sxi","application/vnd.sun.xml.impress.template":"sti","application/vnd.sun.xml.math":"sxm","application/vnd.sun.xml.writer":"sxw","application/vnd.sun.xml.writer.global":"sxg","application/vnd.sun.xml.writer.template":"stw","application/vnd.sus-calendar":"sus","application/vnd.svd":"svd","application/vnd.symbian.install":"sis","application/vnd.syncml+xml":"xsm","application/vnd.syncml.dm+wbxml":"bdm","application/vnd.syncml.dm+xml":"xdm","application/vnd.tao.intent-module-archive":"tao","application/vnd.tcpdump.pcap":"pcap","application/vnd.tmobile-livetv":"tmo","application/vnd.trid.tpt":"tpt","application/vnd.triscape.mxs":"mxs","application/vnd.trueapp":"tra","application/vnd.ufdl":"ufd","application/vnd.uiq.theme":"utz","application/vnd.umajin":"umj","application/vnd.unity":"unityweb","application/vnd.uoml+xml":"uoml","application/vnd.vcx":"vcx","application/vnd.visio":"vsd","application/vnd.visionary":"vis","application/vnd.vsf":"vsf","application/vnd.wap.wbxml":"wbxml","application/vnd.wap.wmlc":"wmlc","application/vnd.wap.wmlscriptc":"wmlsc","application/vnd.webturbo":"wtb","application/vnd.wolfram.player":"nbp","application/vnd.wordperfect":"wpd","application/vnd.wqd":"wqd","application/vnd.wt.stf":"stf","application/vnd.xara":"xar","application/vnd.xfdl":"xfdl","application/vnd.yamaha.hv-dic":"hvd","application/vnd.yamaha.hv-script":"hvs","application/vnd.yamaha.hv-voice":"hvp","application/vnd.yamaha.openscoreformat":"osf","application/vnd.yamaha.openscoreformat.osfpvg+xml":"osfpvg","application/vnd.yamaha.smaf-audio":"saf","application/vnd.yamaha.smaf-phrase":"spf","application/vnd.yellowriver-custom-menu":"cmp","application/vnd.zul":"zir","application/vnd.zzazz.deck+xml":"zaz","application/voicexml+xml":"vxml","application/widget":"wgt","application/winhlp":"hlp","application/wsdl+xml":"wsdl","application/wspolicy+xml":"wspolicy","application/x-7z-compressed":"7z","application/x-abiword":"abw","application/x-ace-compressed":"ace","application/x-apple-diskimage":"dmg","application/x-authorware-bin":"aab","application/x-authorware-map":"aam","application/x-authorware-seg":"aas","application/x-bcpio":"bcpio","application/x-bittorrent":"torrent","application/x-blorb":"blb","application/x-bzip":"bz","application/x-cbr":"cbr","application/x-cdlink":"vcd","application/x-cfs-compressed":"cfs","application/x-chat":"chat","application/x-chess-pgn":"pgn","application/x-conference":"nsc","application/x-cpio":"cpio","application/x-csh":"csh","application/x-debian-package":"deb","application/x-dgc-compressed":"dgc","application/x-director":"dir","application/x-doom":"wad","application/x-dtbncx+xml":"ncx","application/x-dtbook+xml":"dtb","application/x-dtbresource+xml":"res","application/x-dvi":"dvi","application/x-envoy":"evy","application/x-eva":"eva","application/x-font-bdf":"bdf","application/x-font-ghostscript":"gsf","application/x-font-linux-psf":"psf","application/x-font-pcf":"pcf","application/x-font-snf":"snf","application/x-font-type1":"pfa","application/x-freearc":"arc","application/x-futuresplash":"spl","application/x-gca-compressed":"gca","application/x-glulx":"ulx","application/x-gnumeric":"gnumeric","application/x-gramps-xml":"gramps","application/x-gtar":"gtar","application/x-hdf":"hdf","application/x-install-instructions":"install","application/x-iso9660-image":"iso","application/x-java-jnlp-file":"jnlp","application/x-latex":"latex","application/x-lzh-compressed":"lzh","application/x-mie":"mie","application/x-mobipocket-ebook":"prc","application/x-ms-application":"application","application/x-ms-shortcut":"lnk","application/x-ms-wmd":"wmd","application/x-ms-wmz":"wmz","application/x-ms-xbap":"xbap","application/x-msaccess":"mdb","application/x-msbinder":"obd","application/x-mscardfile":"crd","application/x-msclip":"clp","application/x-msdownload":"dll","application/x-msmediaview":"mvb","application/x-msmetafile":"wmf","application/x-msmoney":"mny","application/x-mspublisher":"pub","application/x-msschedule":"scd","application/x-msterminal":"trm","application/x-mswrite":"wri","application/x-netcdf":"nc","application/x-nzb":"nzb","application/x-pkcs12":"p12","application/x-pkcs7-certificates":"p7b","application/x-pkcs7-certreqresp":"p7r","application/x-research-info-systems":"ris","application/x-shar":"shar","application/x-shockwave-flash":"swf","application/x-silverlight-app":"xap","application/x-sql":"sql","application/x-stuffit":"sit","application/x-stuffitx":"sitx","application/x-subrip":"srt","application/x-sv4cpio":"sv4cpio","application/x-sv4crc":"sv4crc","application/x-t3vm-image":"t3","application/x-tads":"gam","application/x-tar":"tar","application/x-tcl":"tcl","application/x-tex":"tex","application/x-tex-tfm":"tfm","application/x-texinfo":"texinfo","application/x-tgif":"obj","application/x-ustar":"ustar","application/x-wais-source":"src","application/x-x509-ca-cert":"der","application/x-xfig":"fig","application/x-xliff+xml":"xlf","application/x-xpinstall":"xpi","application/x-xz":"xz","application/x-zmachine":"z1","application/xaml+xml":"xaml","application/xcap-diff+xml":"xdf","application/xenc+xml":"xenc","application/xhtml+xml":"xhtml","application/xml":"xsl","application/xml-dtd":"dtd","application/xop+xml":"xop","application/xproc+xml":"xpl","application/xslt+xml":"xslt","application/xspf+xml":"xspf","application/xv+xml":"mxml","application/yang":"yang","application/yin+xml":"yin","application/zip":"zip","audio/adpcm":"adp","audio/basic":"au","audio/midi":"mid","audio/mp4":"m4a","audio/mpeg":"mpga","audio/ogg":"oga","audio/s3m":"s3m","audio/silk":"sil","audio/vnd.dece.audio":"uva","audio/vnd.digital-winds":"eol","audio/vnd.dra":"dra","audio/vnd.dts":"dts","audio/vnd.dts.hd":"dtshd","audio/vnd.lucent.voice":"lvp","audio/vnd.ms-playready.media.pya":"pya","audio/vnd.nuera.ecelp4800":"ecelp4800","audio/vnd.nuera.ecelp7470":"ecelp7470","audio/vnd.nuera.ecelp9600":"ecelp9600","audio/vnd.rip":"rip","audio/webm":"weba","audio/x-aac":"aac","audio/x-aiff":"aif","audio/x-caf":"caf","audio/x-flac":"flac","audio/x-matroska":"mka","audio/x-mpegurl":"m3u","audio/x-ms-wax":"wax","audio/x-ms-wma":"wma","audio/x-pn-realaudio":"ram","audio/x-pn-realaudio-plugin":"rmp","audio/xm":"xm","chemical/x-cdx":"cdx","chemical/x-cif":"cif","chemical/x-cmdf":"cmdf","chemical/x-cml":"cml","chemical/x-csml":"csml","chemical/x-xyz":"xyz","font/collection":"ttc","font/otf":"otf","font/ttf":"ttf","font/woff":"woff","font/woff2":"woff2","image/cgm":"cgm","image/g3fax":"g3","image/gif":"gif","image/ief":"ief","image/jpeg":"jpeg","image/ktx":"ktx","image/png":"png","image/prs.btif":"btif","image/sgi":"sgi","image/svg+xml":"svg","image/tiff":"tiff","image/vnd.adobe.photoshop":"psd","image/vnd.dece.graphic":"uvi","image/vnd.djvu":"djvu","image/vnd.dvb.subtitle":"sub","image/vnd.dwg":"dwg","image/vnd.dxf":"dxf","image/vnd.fastbidsheet":"fbs","image/vnd.fpx":"fpx","image/vnd.fst":"fst","image/vnd.fujixerox.edmics-mmr":"mmr","image/vnd.fujixerox.edmics-rlc":"rlc","image/vnd.ms-modi":"mdi","image/vnd.ms-photo":"wdp","image/vnd.net-fpx":"npx","image/vnd.wap.wbmp":"wbmp","image/vnd.xiff":"xif","image/webp":"webp","image/x-3ds":"3ds","image/x-cmu-raster":"ras","image/x-cmx":"cmx","image/x-freehand":"fh","image/x-icon":"ico","image/x-mrsid-image":"sid","image/x-pcx":"pcx","image/x-pict":"pic","image/x-portable-anymap":"pnm","image/x-portable-bitmap":"pbm","image/x-portable-graymap":"pgm","image/x-portable-pixmap":"ppm","image/x-rgb":"rgb","image/x-xpixmap":"xpm","image/x-xwindowdump":"xwd","message/rfc822":"eml","model/iges":"igs","model/mesh":"msh","model/vnd.collada+xml":"dae","model/vnd.dwf":"dwf","model/vnd.gdl":"gdl","model/vnd.gtw":"gtw","model/vnd.vtu":"vtu","model/vrml":"wrl","model/x3d+binary":"x3db","model/x3d+vrml":"x3dv","model/x3d+xml":"x3d","text/cache-manifest":"appcache","text/calendar":"ics","text/css":"css","text/csv":"csv","text/html":"html","text/n3":"n3","text/plain":"txt","text/prs.lines.tag":"dsc","text/richtext":"rtx","text/sgml":"sgml","text/tab-separated-values":"tsv","text/troff":"t","text/turtle":"ttl","text/uri-list":"uri","text/vcard":"vcard","text/vnd.curl":"curl","text/vnd.curl.dcurl":"dcurl","text/vnd.curl.mcurl":"mcurl","text/vnd.curl.scurl":"scurl","text/vnd.fly":"fly","text/vnd.fmi.flexstor":"flx","text/vnd.graphviz":"gv","text/vnd.in3d.3dml":"3dml","text/vnd.in3d.spot":"spot","text/vnd.sun.j2me.app-descriptor":"jad","text/vnd.wap.wml":"wml","text/vnd.wap.wmlscript":"wmls","text/x-asm":"s","text/x-c":"cc","text/x-fortran":"f","text/x-java-source":"java","text/x-nfo":"nfo","text/x-opml":"opml","text/x-pascal":"p","text/x-setext":"etx","text/x-sfv":"sfv","text/x-uuencode":"uu","text/x-vcalendar":"vcs","text/x-vcard":"vcf","video/3gpp":"3gp","video/3gpp2":"3g2","video/h261":"h261","video/h263":"h263","video/h264":"h264","video/jpeg":"jpgv","video/jpm":"jpm","video/mj2":"mj2","video/mp4":"mp4","video/mpeg":"mpeg","video/quicktime":"qt","video/vnd.dece.hd":"uvh","video/vnd.dece.mobile":"uvm","video/vnd.dece.pd":"uvp","video/vnd.dece.sd":"uvs","video/vnd.dece.video":"uvv","video/vnd.dvb.file":"dvb","video/vnd.fvt":"fvt","video/vnd.mpegurl":"mxu","video/vnd.ms-playready.media.pyv":"pyv","video/vnd.uvvu.mp4":"uvu","video/vnd.vivo":"viv","video/webm":"webm","video/x-f4v":"f4v","video/x-fli":"fli","video/x-flv":"flv","video/x-m4v":"m4v","video/x-matroska":"mkv","video/x-mng":"mng","video/x-ms-asf":"asf","video/x-ms-vob":"vob","video/x-ms-wmx":"wmx","video/x-ms-wvx":"wvx","video/x-msvideo":"avi","video/x-sgi-movie":"movie","video/x-smv":"smv","x-conference/x-cooltalk":"ice","text/x-sql":"sql","image/x-pixlr-data":"pxd","image/x-adobe-dng":"dng","image/x-sketch":"sketch","image/x-xcf":"xcf","audio/amr":"amr","application/plt":"plt","application/sat":"sat","application/step":"step","text/x-httpd-cgi":"cgi","text/x-asap":"asp","text/x-jsp":"jsp"},i.prototype._options={cdns:{ace:"https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.1",codemirror:"https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.40.2",ckeditor:"https://cdnjs.cloudflare.com/ajax/libs/ckeditor/4.10.0",ckeditor5:"https://cdn.ckeditor.com/ckeditor5/11.1.1",tinymce:"https://cdnjs.cloudflare.com/ajax/libs/tinymce/4.8.3",simplemde:"https://cdnjs.cloudflare.com/ajax/libs/simplemde/1.11.2",fabric16:"https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.6.7",tui:"https://uicdn.toast.com",hls:"https://cdnjs.cloudflare.com/ajax/libs/hls.js/0.10.1/hls.min.js",dash:"https://cdnjs.cloudflare.com/ajax/libs/dashjs/2.9.1/dash.all.min.js",flv:"https://cdnjs.cloudflare.com/ajax/libs/flv.js/1.4.2/flv.min.js",prettify:"https://cdn.jsdelivr.net/gh/google/code-prettify@453bd5f51e61245339b738b1bbdd42d7848722ba/loader/run_prettify.js",psd:"https://cdnjs.cloudflare.com/ajax/libs/psd.js/3.2.0/psd.min.js",rar:"https://cdn.jsdelivr.net/gh/nao-pon/rar.js@6cef13ec66dd67992fc7f3ea22f132d770ebaf8b/rar.min.js",zlibUnzip:"https://cdn.jsdelivr.net/gh/imaya/zlib.js@0.3.1/bin/unzip.min.js",zlibGunzip:"https://cdn.jsdelivr.net/gh/imaya/zlib.js@0.3.1/bin/gunzip.min.js",marked:"https://cdnjs.cloudflare.com/ajax/libs/marked/0.5.1/marked.min.js",sparkmd5:"https://cdnjs.cloudflare.com/ajax/libs/spark-md5/3.0.0/spark-md5.min.js",jssha:"https://cdnjs.cloudflare.com/ajax/libs/jsSHA/2.3.1/sha.js",amr:"https://cdn.jsdelivr.net/gh/yxl/opencore-amr-js@dcf3d2b5f384a1d9ded2a54e4c137a81747b222b/js/amrnb.js"},url:"",requestType:"get",cors:null,requestMaxConn:3,transport:{},urlUpload:"",dragUploadAllow:"auto",
overwriteUploadConfirm:!0,uploadMaxChunkSize:10485760,folderUploadExclude:{win:/^(?:desktop\.ini|thumbs\.db)$/i,mac:/^\.ds_store$/i},iframeTimeout:0,customData:{},handlers:{},customHeaders:{},xhrFields:{},lang:"en",baseUrl:"",i18nBaseUrl:"",cssAutoLoad:!0,themes:{},theme:null,maxErrorDialogs:5,cssClass:"",commands:["*"],commandsOptions:{getfile:{onlyURL:!1,multiple:!1,folders:!1,oncomplete:"",onerror:"",getPath:!0,getImgSize:!1},open:{method:"post",into:"window",selectAction:"open"},opennew:{url:"",useOriginQuery:!0},upload:{ui:"button"},download:{maxRequests:10,minFilesZipdl:2},quicklook:{autoplay:!0,width:450,height:300,mediaControlsList:"",pdfToolbar:!0,textMaxlen:2e3,contain:!1,docked:0,dockHeight:"auto",dockAutoplay:!1,googleMapsApiKey:"",googleMapsOpts:{maps:{},kml:{suppressInfoWindows:!1,preserveViewport:!1}},viewerjs:{url:"",mimes:["application/pdf","application/vnd.oasis.opendocument.text","application/vnd.oasis.opendocument.spreadsheet","application/vnd.oasis.opendocument.presentation"]},sharecadMimes:[],googleDocsMimes:[],officeOnlineMimes:[],getDimThreshold:2e5,mimeRegexNotEmptyCheck:/^application\/vnd\.google-apps\./},edit:{dialogWidth:void 0,mimes:[],makeTextMimes:["text/plain","text/css","text/html"],useStoredEditor:!1,editorMaximized:!1,editors:[],encodings:["Big5","Big5-HKSCS","Cp437","Cp737","Cp775","Cp850","Cp852","Cp855","Cp857","Cp858","Cp862","Cp866","Cp874","EUC-CN","EUC-JP","EUC-KR","GB18030","ISO-2022-CN","ISO-2022-JP","ISO-2022-KR","ISO-8859-1","ISO-8859-2","ISO-8859-3","ISO-8859-4","ISO-8859-5","ISO-8859-6","ISO-8859-7","ISO-8859-8","ISO-8859-9","ISO-8859-13","ISO-8859-15","KOI8-R","KOI8-U","Shift-JIS","Windows-1250","Windows-1251","Windows-1252","Windows-1253","Windows-1254","Windows-1257"],extraOptions:{tuiImgEditOpts:{iconsPath:void 0,theme:{}},pixo:{apikey:""},creativeCloudApiKey:"",managerUrl:null,ckeditor5Mode:"balloon",onlineConvert:{maxSize:100,showLink:!0}}},search:{incsearch:{enable:!0,minlen:1,wait:500},searchTypes:{SearchMime:{name:"btnMime",title:"searchMime"}}},info:{nullUrlDirLinkSelf:!0,hideItems:[],showHashMaxsize:104857600,showHashAlgorisms:["md5","sha256"],custom:{}},mkdir:{intoNewFolderToolbtn:!1},resize:{grid8px:"disable",presetSize:[[320,240],[400,400],[640,480],[800,600]],getDimThreshold:204800,dimSubImgSize:307200},rm:{quickTrash:!0,infoCheckWait:10,toTrashMaxItems:1e3},help:{view:["about","shortcuts","help","integrations","debug"],helpSource:""},preference:{width:600,height:400,categories:null,prefs:null,langs:null,selectActions:["open","edit/download","resize/edit/download","download","quicklook"]}},bootCallback:null,getFileCallback:null,defaultView:"icons",startPathHash:"",sound:!0,ui:["toolbar","tree","path","stat"],uiOptions:{toolbar:[["home","back","forward","up","reload"],["netmount"],["mkdir","mkfile","upload"],["open","download","getfile"],["undo","redo"],["copy","cut","paste","rm","empty","hide"],["duplicate","rename","edit","resize","chmod"],["selectall","selectnone","selectinvert"],["quicklook","info"],["extract","archive"],["search"],["view","sort"],["preference","help"],["fullscreen"]],toolbarExtra:{displayTextLabel:!1,labelExcludeUA:["Mobile"],autoHideUA:["Mobile"],defaultHides:["home","reload"],showPreferenceButton:"none",preferenceInContextmenu:!0},tree:{openRootOnLoad:!0,openCwdOnOpen:!0,syncTree:!0,subTreeMax:100,subdirsMaxConn:2,subdirsAtOnce:5,durations:{slideUpDown:"fast",autoScroll:"fast"}},navbar:{minWidth:150,maxWidth:500,autoHideUA:[]},navdock:{disabled:!1,initMaxHeight:"50%",maxHeight:"90%"},cwd:{oldSchool:!1,showSelectCheckboxUA:["Touch"],listView:{columns:["perm","date","size","kind"],columnsCustomName:{},fixedHeader:!0},iconsView:{size:0,sizeMax:3,sizeNames:{0:"viewSmall",1:"viewMedium",2:"viewLarge",3:"viewExtraLarge"}}},path:{toWorkzoneWithoutNavbar:!0},dialog:{focusOnMouseOver:!0},toast:{animate:{showMethod:"fadeIn",showDuration:300,showEasing:"swing",timeOut:3e3,hideMethod:"fadeOut",hideDuration:1500,hideEasing:"swing"}}},dispInlineRegex:"^(?:(?:image|video|audio)|application/(?:x-mpegURL|dash+xml)|(?:text/plain|application/pdf)$)",onlyMimes:[],sortRules:{},sortType:"name",sortOrder:"asc",sortStickFolders:!0,sortAlsoTreeview:!1,clientFormatDate:!0,UTCDate:!1,dateFormat:"",fancyDateFormat:"",fileModeStyle:"both",width:"auto",height:400,heightBase:null,resizable:!0,notifyDelay:500,notifyDialog:{position:{},width:null},dialogContained:!1,allowShortcuts:!0,rememberLastDir:!0,reloadClearHistory:!1,useBrowserHistory:!0,showFiles:50,showThreshold:50,validName:!1,fileFilter:!1,backupSuffix:"~",sync:0,syncStart:!0,loadTmbs:5,cookie:{expires:30,domain:"",path:"/",secure:!1},contextmenu:{navbar:["open","opennew","download","|","upload","mkdir","|","copy","cut","paste","duplicate","|","rm","empty","hide","|","rename","|","archive","|","places","info","chmod","netunmount"],cwd:["undo","redo","|","back","up","reload","|","upload","mkdir","mkfile","paste","|","empty","hide","|","view","sort","selectall","colwidth","|","places","info","chmod","netunmount","|","fullscreen","|","preference"],files:["getfile","|","open","opennew","download","opendir","quicklook","|","upload","mkdir","|","copy","cut","paste","duplicate","|","rm","empty","hide","|","rename","edit","resize","|","archive","extract","|","selectall","selectinvert","|","places","info","chmod","netunmount"]},enableAlways:!1,enableByMouseOver:!0,windowCloseConfirm:["hasNotifyDialog","editingFile"],rawStringDecoder:"object"==typeof Encoding&&e.isFunction(Encoding.convert)?function(e){return Encoding.convert(e,{to:"UNICODE",type:"string"})}:null,debug:["error","warning","event-destroy"]},i.prototype._options.commandsOptions.netmount={ftp:{name:"FTP",inputs:{host:e('<input type="text"/>'),port:e('<input type="number" placeholder="21" class="elfinder-input-optional"/>'),path:e('<input type="text" value="/"/>'),user:e('<input type="text"/>'),pass:e('<input type="password" autocomplete="new-password"/>'),FTPS:e('<input type="checkbox" value="1" title="File Transfer Protocol over SSL/TLS"/>'),encoding:e('<input type="text" placeholder="Optional" class="elfinder-input-optional"/>'),locale:e('<input type="text" placeholder="Optional" class="elfinder-input-optional"/>')}},dropbox2:i.prototype.makeNetmountOptionOauth("dropbox2","Dropbox","Dropbox",{noOffline:!0,root:"/",pathI18n:"path",integrate:{title:"Dropbox.com",link:"https://www.dropbox.com"}}),googledrive:i.prototype.makeNetmountOptionOauth("googledrive","Google Drive","Google",{integrate:{title:"Google Drive",link:"https://www.google.com/drive/"}}),onedrive:i.prototype.makeNetmountOptionOauth("onedrive","One Drive","OneDrive",{integrate:{title:"Microsoft OneDrive",link:"https://onedrive.live.com"}}),box:i.prototype.makeNetmountOptionOauth("box","Box","Box",{noOffline:!0,integrate:{title:"Box.com",link:"https://www.box.com"}})},i.prototype.history=function(t){var n,i=this,a=!0,o=[],r=function(){o=[t.cwd().hash],n=0,a=!0},s=t.options.useBrowserHistory&&window.history&&window.history.pushState?window.history:null,l=function(s){return s&&i.canForward()||!s&&i.canBack()?(a=!1,t.exec("open",o[s?++n:--n]).fail(r)):e.Deferred().reject()},c=function(e){!s||s.state&&s.state.thash===e||s.pushState({thash:e},null,location.pathname+location.search+(e?"#elf_"+e:""))};this.canBack=function(){return n>0},this.canForward=function(){return n<o.length-1},this.back=l,this.forward=function(){return l(!0)},t.bind("init",function(){s&&!s.state&&c(t.startDir())}).open(function(){var e=o.length,i=t.cwd().hash;a&&(n>=0&&e>n+1&&o.splice(n+1),o[o.length-1]!=i&&o.push(i),n=o.length-1),a=!0,c(i)}).reload(t.options.reloadClearHistory&&r)},i.prototype.command=function(t){this.fm=t,this.name="",this.dialogClass="",this.className="",this.title="",this.linkedCmds=[],this.state=-1,this.alwaysEnabled=!1,this.noChangeDirOnRemovedCwd=!1,this._disabled=!1,this.disableOnSearch=!1,this.updateOnSelect=!0,this.syncTitleOnChange=!1,this.keepContextmenu=!1,this._handlers={enable:function(){this.update(void 0,this.value)},disable:function(){this.update(-1,this.value)},"open reload load sync":function(){this._disabled=!(this.alwaysEnabled||this.fm.isCommandEnabled(this.name)),this.update(void 0,this.value),this.change()}},this.handlers={},this.shortcuts=[],this.options={ui:"button"},this.listeners=[],this.setup=function(t,n){var i,a,o,r=this,s=this.fm,l=function(t){var n=t.callback||function(e){s.exec(r.name,void 0,{_userAction:!0,_currentType:"shortcut"})};t.callback=function(t){var i,a={};r.enabled()&&(s.searchStatus.state<2?i=s.isCommandEnabled(r.name):(e.each(s.selected(),function(t,n){s.optionsByHashes[n]?a[n]=!0:e.each(s.volOptions,function(e){if(!a[e]&&0===n.indexOf(e))return a[e]=!0,!1})}),e.each(a,function(e){if(i=s.isCommandEnabled(r.name,e),!i)return!1})),i&&(r.event=t,n.call(r),delete r.event))}};for(this.name=t,this.title=s.messages["cmd"+t]?s.i18n("cmd"+t):this.extendsCmd&&s.messages["cmd"+this.extendsCmd]?s.i18n("cmd"+this.extendsCmd):t,this.options=Object.assign({},this.options,n),this.listeners=[],this.dialogClass="elfinder-dialog-"+t,n.shortcuts&&("function"==typeof n.shortcuts?o=n.shortcuts(this.fm,this.shortcuts):Array.isArray(n.shortcuts)&&(o=n.shortcuts),this.shortcuts=o||[]),this.updateOnSelect&&(this._handlers.select=function(){this.update(void 0,this.value)}),e.each(Object.assign({},r._handlers,r.handlers),function(t,n){s.bind(t,e.proxy(n,r))}),i=0;i<this.shortcuts.length;i++)a=this.shortcuts[i],l(a),!a.description&&(a.description=this.title),s.shortcut(a);this.disableOnSearch&&s.bind("search searchend",function(){r._disabled="search"===this.type||!(this.alwaysEnabled||s.isCommandEnabled(t)),r.update(void 0,r.value)}),this.init()},this.init=function(){},this.exec=function(t,n){return e.Deferred().reject()},this.getUndo=function(e,t){return!1},this.disabled=function(){return this.state<0},this.enabled=function(){return this.state>-1},this.active=function(){return this.state>0},this.getstate=function(){return-1},this.update=function(e,t){var n=this.state,i=this.value;this._disabled&&0===this.fm.searchStatus?this.state=-1:this.state=void 0!==e?e:this.getstate(),this.value=t,n==this.state&&i==this.value||this.change()},this.change=function(e){var t,n;if("function"==typeof e)this.listeners.push(e);else for(n=0;n<this.listeners.length;n++){t=this.listeners[n];try{t(this.state,this.value)}catch(i){this.fm.debug("error",i)}}return this},this.hashes=function(n){return n?e.grep(Array.isArray(n)?n:[n],function(e){return!!t.file(e)}):t.selected()},this.files=function(t){var n=this.fm;return t?e.map(Array.isArray(t)?t:[t],function(e){return n.file(e)||null}):n.selectedFiles()},this.fmDialog=function(e,t){return t.cssClass?t.cssClass+=" "+this.dialogClass:t.cssClass=this.dialogClass,this.fm.dialog(e,t)}},i.prototype.resources={"class":{hover:"ui-state-hover",active:"ui-state-active",disabled:"ui-state-disabled",draggable:"ui-draggable",droppable:"ui-droppable",adroppable:"elfinder-droppable-active",cwdfile:"elfinder-cwd-file",cwd:"elfinder-cwd",tree:"elfinder-tree",treeroot:"elfinder-navbar-root",navdir:"elfinder-navbar-dir",navdirwrap:"elfinder-navbar-dir-wrapper",navarrow:"elfinder-navbar-arrow",navsubtree:"elfinder-navbar-subtree",navcollapse:"elfinder-navbar-collapsed",navexpand:"elfinder-navbar-expanded",treedir:"elfinder-tree-dir",placedir:"elfinder-place-dir",searchbtn:"elfinder-button-search",editing:"elfinder-to-editing",preventback:"elfinder-prevent-back",tabstab:"ui-state-default ui-tabs-tab ui-corner-top ui-tab",tabsactive:"ui-tabs-active ui-state-active"},tpl:{perms:'<span class="elfinder-perms"/>',lock:'<span class="elfinder-lock"/>',symlink:'<span class="elfinder-symlink"/>',navicon:'<span class="elfinder-nav-icon"/>',navspinner:'<span class="elfinder-spinner elfinder-navbar-spinner"/>',navdir:'<div class="elfinder-navbar-wrapper{root}"><span id="{id}" class="ui-corner-all elfinder-navbar-dir {cssclass}"><span class="elfinder-navbar-arrow"/><span class="elfinder-navbar-icon" {style}/>{symlink}{permissions}{name}</span><div class="elfinder-navbar-subtree" style="display:none"/></div>',placedir:'<div class="elfinder-navbar-wrapper"><span id="{id}" class="ui-corner-all elfinder-navbar-dir {cssclass}" title="{title}"><span class="elfinder-navbar-arrow"/><span class="elfinder-navbar-icon" {style}/>{symlink}{permissions}{name}</span><div class="elfinder-navbar-subtree" style="display:none"/></div>'},mimes:{text:["application/dash+xml","application/docbook+xml","application/javascript","application/json","application/plt","application/sat","application/sql","application/step","application/vnd.hp-hpgl","application/x-awk","application/x-config","application/x-csh","application/x-empty","application/x-mpegurl","application/x-perl","application/x-php","application/x-web-config","application/xhtml+xml","application/xml","audio/x-mp3-playlist","image/cgm","image/svg+xml","image/vnd.dxf","model/iges"]},mixin:{make:function(){var t,n,i,a,o,r,s,l,c,d,p=this,u=this.fm,h=this.name,f=this.requestCmd||h,m=u.getUI("workzone"),g=this.origin&&"navbar"===this.origin?"tree":"cwd",v="tree"===g,b=v?"navHash2Elm":"cwdHash2Elm",y=!v&&"list"!=u.storage("view"),w=u.selected(),x=this.move||!1,k=m.hasClass("elfinder-cwd-wrapper-empty"),C=function(){requestAnimationFrame(function(){U&&U.trigger("blur")})},z=function(){D.is(":hidden")||D.elfinderoverlay("hide").off("click close",E),i.removeClass("ui-front").css("position","").off("unselect."+u.namespace,C),y?n&&n.css("max-height",""):v||i.css("width","").parent("td").css("overflow","")},T=e.Deferred().fail(function(e){r&&o.attr("class",r),k&&m.addClass("elfinder-cwd-wrapper-empty"),w&&(x&&u.trigger("unlockfiles",{files:w}),u.clipboard([]),u.trigger("selectfiles",{files:w})),e&&u.error(e)}).always(function(){z(),F(),u.enable().unbind("open",q).trigger("resMixinMake")}),A="tmp_"+parseInt(1e5*Math.random()),S=this.data&&this.data.target?this.data.target:v?u.file(w[0]).hash:u.cwd().hash,I=new Date,O={hash:A,phash:S,name:u.uniqueName(this.prefix,S),mime:this.mime,read:!0,write:!0,date:"Today "+I.getHours()+":"+I.getMinutes(),move:x},j=(u.getUI(g).trigger("create."+u.namespace,O),this.data||{}),M=u[b](A),D=u.getUI("overlay"),F=function(){M&&M.length&&(U.off(),M.hide(),u.unselectfiles({files:[A]}).unbind("resize",R),requestAnimationFrame(function(){v?M.closest(".elfinder-navbar-wrapper").remove():M.remove()}))},E=function(e){D.is(":hidden")||i.css("z-index",""),H||(F(),T.reject(),e&&(e.stopPropagation(),e.preventDefault()))},U=e(y?"<textarea/>":'<input type="text"/>').on("keyup text",function(){y?(this.style.height="1px",this.style.height=this.scrollHeight+"px"):t&&(this.style.width=t+"px",this.scrollWidth>t&&(this.style.width=this.scrollWidth+10+"px"))}).on("keydown",function(t){t.stopImmediatePropagation(),t.keyCode==e.ui.keyCode.ESCAPE?T.reject():t.keyCode==e.ui.keyCode.ENTER&&(t.preventDefault(),U.trigger("blur"))}).on("mousedown click dblclick",function(e){e.stopPropagation(),"dblclick"===e.type&&e.preventDefault()}).on("blur",function(){var t,n=e.trim(U.val()),o=U.parent(),r=!0;if(D.is(":hidden")||i.css("z-index",""),""===n)return E();if(!H&&o.length){if(u.options.validName&&u.options.validName.test)try{r=u.options.validName.test(n)}catch(s){r=!1}if(!n||"."===n||".."===n||!r)return H=!0,u.error("directory"===O.mime?"errInvDirname":"errInvName",{modal:!0,close:function(){setTimeout(P,120)}}),!1;if(u.fileByName(n,S))return H=!0,u.error(["errExists",n],{modal:!0,close:function(){setTimeout(P,120)}}),!1;t=w&&x?u.exec("cut",w):null,e.when(t).done(function(){var t={},i={};z(),U.hide().before(e("<span>").text(n)),u.lockfiles({files:[A]}),u.request({data:Object.assign({cmd:f,name:n,target:S},j||{}),notify:{type:f,cnt:1},preventFail:!0,syncOnFail:!0,navigate:{toast:t}}).fail(function(t){u.unlockfiles({files:[A]}),H=!0,U.show().prev().remove(),u.error(t,{modal:!0,close:function(){Array.isArray(t)&&e.inArray("errUploadMime",t)!==-1?T.notify("errUploadMime").reject():setTimeout(P,120)}})}).done(function(n){if(n&&n.added&&n.added[0]){var o,r=n.added[0],s=r.hash,l=(u[b](s),{directory:{cmd:"open",msg:"cmdopendir"},text:{cmd:"edit",msg:"cmdedit"},"default":{cmd:"open",msg:"cmdopen"}});w&&x&&u.one(f+"done",function(){u.exec("paste",s)}),x||(u.mimeIsText(r.mime)&&!u.mimesCanMakeEmpty[r.mime]&&u.mimeTypes[r.mime]&&(u.trigger("canMakeEmptyFile",{mimes:[r.mime],unshift:!0}),o={},o[r.mime]=u.mimeTypes[r.mime],u.storage("mkfileTextMimes",Object.assign(o,u.storage("mkfileTextMimes")||{}))),Object.assign(i,a||l[r.mime]||l[r.mime.split("/")[0]]||l[u.mimesCanMakeEmpty[r.mime]||e.inArray(r.mime,u.resources.mimes.text)!==-1?"text":"none"]||l["default"]),Object.assign(t,i.cmd?{incwd:{msg:u.i18n(["complete",u.i18n("cmd"+h)]),action:i},inbuffer:{msg:u.i18n(["complete",u.i18n("cmd"+h)]),action:i}}:{inbuffer:{msg:u.i18n(["complete",u.i18n("cmd"+h)])}}))}T.resolve(n)})}).fail(function(){T.reject()})}}).on("dragenter dragleave dragover drop",function(e){e.stopPropagation()}),P=function(){var e=u.splitFileExtention(U.val())[0];H||!u.UA.Mobile||u.UA.iOS||(D.on("click close",E).elfinderoverlay("show"),i.css("z-index",D.css("z-index")+1)),H=!1,!u.enabled()&&u.enable(),U.trigger("focus").trigger("select"),U[0].setSelectionRange&&U[0].setSelectionRange(0,e.length)},R=function(){M.trigger("scrolltoview",{blink:!1})},q=function(){T&&"pending"===T.state()&&T.reject()},H=!1;return u.isCommandEnabled(f,S)&&M.length?(e.isPlainObject(p.nextAction)&&(a=Object.assign({},p.nextAction)),v?(o=u[b](S),s=u.res("class","navcollapse"),l=u.res("class","navexpand"),c=u.res("class","navarrow"),d=u.res("class","navsubtree"),M.closest("."+d).show(),o.hasClass(s)||(r=o.attr("class"),o.addClass(s+" "+l+" elfinder-subtree-loaded")),o.is("."+s+":not(."+l+")")&&o.children("."+c).trigger("click").data("dfrd").done(function(){U.val()===O.name&&U.val(u.uniqueName(p.prefix,S)).trigger("select").trigger("focus")}),n=M.contents().filter(function(){return 3==this.nodeType&&e(this).parent().attr("id")===u.navHash2Id(O.hash)}),i=n.parent(),n.replaceWith(U.val(O.name))):(k&&m.removeClass("elfinder-cwd-wrapper-empty"),n=M.find(".elfinder-cwd-filename"),i=n.parent(),y?n.css("max-height","none"):(t=i.width(),i.width(t-15).parent("td").css("overflow","visible")),n.empty().append(U.val(O.name))),i.addClass("ui-front").css("position","relative").on("unselect."+u.namespace,C),u.bind("resize",R).one("open",q),U.trigger("keyup"),P(),T):T.reject()}},blink:function(e,t){var n,i={slowonce:function(){e.hide().delay(250).fadeIn(750).delay(500).fadeOut(3500)},lookme:function(){e.show().fadeOut(500).fadeIn(750)}};t=t||"slowonce",n=i[t]||i.lookme,e.stop(!0,!0),n()}},e.fn.dialogelfinder=function(t){var n,i="elfinderPosition",a="elfinderDestroyOnClose";if(this.not(".elfinder").each(function(){var n=(e(document),e('<div class="ui-widget-header dialogelfinder-drag ui-corner-top">'+(t.title||"Files")+"</div>")),o=(e('<a href="#" class="dialogelfinder-drag-close ui-corner-all"><span class="ui-icon ui-icon-closethick"> </span></a>').appendTo(n).on("click",function(e){e.preventDefault(),o.dialogelfinder("close")}),e(this).addClass("dialogelfinder").css("position","absolute").hide().appendTo("body").draggable({handle:".dialogelfinder-drag",containment:"window",stop:function(){o.trigger("resize"),r.trigger("resize")}}).elfinder(t).prepend(n)),r=o.elfinder("instance");o.width(parseInt(o.width())||840).data(a,!!t.destroyOnClose).find(".elfinder-toolbar").removeClass("ui-corner-top"),t.position&&o.data(i,t.position),t.autoOpen!==!1&&e(this).dialogelfinder("open")}),"open"==t){var n=e(this),o=n.data(i)||{top:parseInt(e(document).scrollTop()+(e(window).height()<n.height()?2:(e(window).height()-n.height())/2)),left:parseInt(e(document).scrollLeft()+(e(window).width()<n.width()?2:(e(window).width()-n.width())/2))};n.is(":hidden")&&(n.addClass("ui-front").css(o).show().trigger("resize"),setTimeout(function(){n.trigger("resize").trigger("mousedown")},200))}else if("close"==t)n=e(this).removeClass("ui-front"),n.is(":visible")&&(n.data(a)?n.elfinder("destroy").remove():n.elfinder("close"));else if("instance"==t)return e(this).getElFinder();return this},"function"==typeof i&&i.prototype.i18&&(i.prototype.i18.en={translator:"Troex Nevelin &lt;troex@fury.scancode.ru&gt;, Naoki Sawada &lt;hypweb+elfinder@gmail.com&gt;",language:"English",direction:"ltr",dateFormat:"M d, Y h:i A",fancyDateFormat:"$1 h:i A",nonameDateFormat:"ymd-His",messages:{error:"Error",errUnknown:"Unknown error.",errUnknownCmd:"Unknown command.",errJqui:"Invalid jQuery UI configuration. Selectable, draggable and droppable components must be included.",errNode:"elFinder requires DOM Element to be created.",errURL:"Invalid elFinder configuration! URL option is not set.",errAccess:"Access denied.",errConnect:"Unable to connect to backend.",errAbort:"Connection aborted.",errTimeout:"Connection timeout.",errNotFound:"Backend not found.",errResponse:"Invalid backend response.",errConf:"Invalid backend configuration.",errJSON:"PHP JSON module not installed.",errNoVolumes:"Readable volumes not available.",errCmdParams:'Invalid parameters for command "$1".',errDataNotJSON:"Data is not JSON.",errDataEmpty:"Data is empty.",errCmdReq:"Backend request requires command name.",errOpen:'Unable to open "$1".',errNotFolder:"Object is not a folder.",errNotFile:"Object is not a file.",errRead:'Unable to read "$1".',errWrite:'Unable to write into "$1".',errPerm:"Permission denied.",errLocked:'"$1" is locked and can not be renamed, moved or removed.',errExists:'Item named "$1" already exists.',errInvName:"Invalid file name.",errInvDirname:"Invalid folder name.",errFolderNotFound:"Folder not found.",errFileNotFound:"File not found.",errTrgFolderNotFound:'Target folder "$1" not found.',errPopup:"Browser prevented opening popup window. To open file enable it in browser options.",errMkdir:'Unable to create folder "$1".',errMkfile:'Unable to create file "$1".',errRename:'Unable to rename "$1".',errCopyFrom:'Copying files from volume "$1" not allowed.',errCopyTo:'Copying files to volume "$1" not allowed.',errMkOutLink:"Unable to create a link to outside the volume root.",errUpload:"Upload error.",errUploadFile:'Unable to upload "$1".',errUploadNoFiles:"No files found for upload.",errUploadTotalSize:"Data exceeds the maximum allowed size.",errUploadFileSize:"File exceeds maximum allowed size.",errUploadMime:"File type not allowed.",errUploadTransfer:'"$1" transfer error.',errUploadTemp:"Unable to make temporary file for upload.",errNotReplace:'Object "$1" already exists at this location and can not be replaced by object with another type.',errReplace:'Unable to replace "$1".',errSave:'Unable to save "$1".',errCopy:'Unable to copy "$1".',errMove:'Unable to move "$1".',errCopyInItself:'Unable to copy "$1" into itself.',errRm:'Unable to remove "$1".',errTrash:"Unable into trash.",errRmSrc:"Unable remove source file(s).",errExtract:'Unable to extract files from "$1".',errArchive:"Unable to create archive.",errArcType:"Unsupported archive type.",errNoArchive:"File is not archive or has unsupported archive type.",errCmdNoSupport:"Backend does not support this command.",errReplByChild:'The folder "$1" can\'t be replaced by an item it contains.',errArcSymlinks:"For security reason denied to unpack archives contains symlinks or files with not allowed names.",errArcMaxSize:"Archive files exceeds maximum allowed size.",errResize:'Unable to resize "$1".',errResizeDegree:"Invalid rotate degree.",errResizeRotate:"Unable to rotate image.",errResizeSize:"Invalid image size.",errResizeNoChange:"Image size not changed.",errUsupportType:"Unsupported file type.",errNotUTF8Content:'File "$1" is not in UTF-8 and cannot be edited.',errNetMount:'Unable to mount "$1".',errNetMountNoDriver:"Unsupported protocol.",errNetMountFailed:"Mount failed.",errNetMountHostReq:"Host required.",errSessionExpires:"Your session has expired due to inactivity.",errCreatingTempDir:'Unable to create temporary directory: "$1"',errFtpDownloadFile:'Unable to download file from FTP: "$1"',errFtpUploadFile:'Unable to upload file to FTP: "$1"',errFtpMkdir:'Unable to create remote directory on FTP: "$1"',errArchiveExec:'Error while archiving files: "$1"',errExtractExec:'Error while extracting files: "$1"',errNetUnMount:"Unable to unmount.",errConvUTF8:"Not convertible to UTF-8",errFolderUpload:"Try the modern browser, If you'd like to upload the folder.",errSearchTimeout:'Timed out while searching "$1". Search result is partial.',errReauthRequire:"Re-authorization is required.",errMaxTargets:"Max number of selectable items is $1.",errRestore:"Unable to restore from the trash. Can't identify the restore destination.",errEditorNotFound:"Editor not found to this file type.",errServerError:"Error occurred on the server side.",errEmpty:'Unable to empty folder "$1".',moreErrors:"There are $1 more errors.",cmdarchive:"Create archive",cmdback:"Back",cmdcopy:"Copy",cmdcut:"Cut",cmddownload:"Download",cmdduplicate:"Duplicate",cmdedit:"Edit file",cmdextract:"Extract files from archive",cmdforward:"Forward",cmdgetfile:"Select files",cmdhelp:"About this software",cmdhome:"Root",cmdinfo:"Get info",cmdmkdir:"New folder",cmdmkdirin:"Into New Folder",cmdmkfile:"New file",cmdopen:"Open",cmdpaste:"Paste",cmdquicklook:"Preview",cmdreload:"Reload",cmdrename:"Rename",cmdrm:"Delete",cmdtrash:"Into trash",cmdrestore:"Restore",cmdsearch:"Find files",cmdup:"Go to parent folder",cmdupload:"Upload files",cmdview:"View",cmdresize:"Resize & Rotate",cmdsort:"Sort",cmdnetmount:"Mount network volume",cmdnetunmount:"Unmount",cmdplaces:"To Places",cmdchmod:"Change mode",cmdopendir:"Open a folder",cmdcolwidth:"Reset column width",cmdfullscreen:"Full Screen",cmdmove:"Move",cmdempty:"Empty the folder",cmdundo:"Undo",cmdredo:"Redo",cmdpreference:"Preferences",cmdselectall:"Select all",cmdselectnone:"Select none",cmdselectinvert:"Invert selection",cmdopennew:"Open in new window",cmdhide:"Hide (Preference)",btnClose:"Close",btnSave:"Save",btnRm:"Remove",btnApply:"Apply",btnCancel:"Cancel",btnNo:"No",btnYes:"Yes",btnMount:"Mount",btnApprove:"Goto $1 & approve",btnUnmount:"Unmount",btnConv:"Convert",btnCwd:"Here",btnVolume:"Volume",btnAll:"All",btnMime:"MIME Type",btnFileName:"Filename",btnSaveClose:"Save & Close",btnBackup:"Backup",btnRename:"Rename",btnRenameAll:"Rename(All)",btnPrevious:"Prev ($1/$2)",btnNext:"Next ($1/$2)",btnSaveAs:"Save As",ntfopen:"Open folder",ntffile:"Open file",ntfreload:"Reload folder content",ntfmkdir:"Creating folder",ntfmkfile:"Creating files",ntfrm:"Delete items",ntfcopy:"Copy items",ntfmove:"Move items",ntfprepare:"Checking existing items",ntfrename:"Rename files",ntfupload:"Uploading files",ntfdownload:"Downloading files",ntfsave:"Save files",ntfarchive:"Creating archive",ntfextract:"Extracting files from archive",ntfsearch:"Searching files",ntfresize:"Resizing images",ntfsmth:"Doing something",ntfloadimg:"Loading image",ntfnetmount:"Mounting network volume",ntfnetunmount:"Unmounting network volume",ntfdim:"Acquiring image dimension",ntfreaddir:"Reading folder infomation",ntfurl:"Getting URL of link",ntfchmod:"Changing file mode",ntfpreupload:"Verifying upload file name",ntfzipdl:"Creating a file for download",ntfparents:"Getting path infomation",ntfchunkmerge:"Processing the uploaded file",ntftrash:"Doing throw in the trash",ntfrestore:"Doing restore from the trash",ntfchkdir:"Checking destination folder",ntfundo:"Undoing previous operation",ntfredo:"Redoing previous undone",ntfchkcontent:"Checking contents",volume_Trash:"Trash",dateUnknown:"unknown",Today:"Today",Yesterday:"Yesterday",msJan:"Jan",msFeb:"Feb",msMar:"Mar",msApr:"Apr",msMay:"May",msJun:"Jun",msJul:"Jul",msAug:"Aug",msSep:"Sep",msOct:"Oct",msNov:"Nov",msDec:"Dec",January:"January",February:"February",March:"March",April:"April",May:"May",June:"June",July:"July",August:"August",September:"September",October:"October",November:"November",December:"December",Sunday:"Sunday",Monday:"Monday",Tuesday:"Tuesday",Wednesday:"Wednesday",Thursday:"Thursday",Friday:"Friday",Saturday:"Saturday",Sun:"Sun",Mon:"Mon",Tue:"Tue",Wed:"Wed",Thu:"Thu",Fri:"Fri",Sat:"Sat",sortname:"by name",sortkind:"by kind",sortsize:"by size",sortdate:"by date",sortFoldersFirst:"Folders first",sortperm:"by permission",sortmode:"by mode",sortowner:"by owner",sortgroup:"by group",sortAlsoTreeview:"Also Treeview","untitled file.txt":"NewFile.txt","untitled folder":"NewFolder",Archive:"NewArchive","untitled file":"NewFile.$1",extentionfile:"$1: File",extentiontype:"$1: $2",confirmReq:"Confirmation required",confirmRm:"Are you sure you want to permanently remove items?<br/>This cannot be undone!",confirmRepl:"Replace old file with new one? (If it contains folders, it will be merged. To backup and replace, select Backup.)",confirmRest:"Replace existing item with the item in trash?",confirmConvUTF8:"Not in UTF-8<br/>Convert to UTF-8?<br/>Contents become UTF-8 by saving after conversion.",confirmNonUTF8:"Character encoding of this file couldn't be detected. It need to temporarily convert to UTF-8 for editting.<br/>Please select character encoding of this file.",confirmNotSave:"It has been modified.<br/>Losing work if you do not save changes.",confirmTrash:"Are you sure you want to move items to trash bin?",apllyAll:"Apply to all",name:"Name",size:"Size",perms:"Permissions",modify:"Modified",kind:"Kind",read:"read",write:"write",noaccess:"no access",and:"and",unknown:"unknown",selectall:"Select all items",selectfiles:"Select item(s)",selectffile:"Select first item",selectlfile:"Select last item",viewlist:"List view",viewicons:"Icons view",viewSmall:"Small icons",viewMedium:"Medium icons",viewLarge:"Large icons",viewExtraLarge:"Extra large icons",places:"Places",calc:"Calculate",path:"Path",aliasfor:"Alias for",locked:"Locked",dim:"Dimensions",files:"Files",folders:"Folders",items:"Items",yes:"yes",no:"no",link:"Link",searcresult:"Search results",selected:"selected items",about:"About",shortcuts:"Shortcuts",help:"Help",webfm:"Web file manager",ver:"Version",protocolver:"protocol version",homepage:"Project home",docs:"Documentation",github:"Fork us on GitHub",twitter:"Follow us on Twitter",facebook:"Join us on Facebook",team:"Team",chiefdev:"chief developer",developer:"developer",contributor:"contributor",maintainer:"maintainer",translator:"translator",icons:"Icons",dontforget:"and don't forget to take your towel",shortcutsof:"Shortcuts disabled",dropFiles:"Drop files here",or:"or",selectForUpload:"Select files",moveFiles:"Move items",copyFiles:"Copy items",restoreFiles:"Restore items",rmFromPlaces:"Remove from places",aspectRatio:"Aspect ratio",scale:"Scale",width:"Width",height:"Height",resize:"Resize",crop:"Crop",rotate:"Rotate","rotate-cw":"Rotate 90 degrees CW","rotate-ccw":"Rotate 90 degrees CCW",degree:"°",netMountDialogTitle:"Mount network volume",protocol:"Protocol",host:"Host",port:"Port",user:"User",pass:"Password",confirmUnmount:"Are you sure to unmount $1?",dropFilesBrowser:"Drop or Paste files from browser",dropPasteFiles:"Drop files, Paste URLs or images(clipboard) here",encoding:"Encoding",locale:"Locale",searchTarget:"Target: $1",searchMime:"Search by input MIME Type",owner:"Owner",group:"Group",other:"Other",execute:"Execute",perm:"Permission",mode:"Mode",emptyFolder:"Folder is empty",emptyFolderDrop:"Folder is empty\\A Drop to add items",emptyFolderLTap:"Folder is empty\\A Long tap to add items",quality:"Quality",autoSync:"Auto sync",moveUp:"Move up",getLink:"Get URL link",selectedItems:"Selected items ($1)",folderId:"Folder ID",offlineAccess:"Allow offline access",reAuth:"To re-authenticate",nowLoading:"Now loading...",openMulti:"Open multiple files",openMultiConfirm:"You are trying to open the $1 files. Are you sure you want to open in browser?",emptySearch:"Search results is empty in search target.",editingFile:"It is editing a file.",hasSelected:"You have selected $1 items.",hasClipboard:"You have $1 items in the clipboard.",incSearchOnly:"Incremental search is only from the current view.",reinstate:"Reinstate",complete:"$1 complete",
contextmenu:"Context menu",pageTurning:"Page turning",volumeRoots:"Volume roots",reset:"Reset",bgcolor:"Background color",colorPicker:"Color picker","8pxgrid":"8px Grid",enabled:"Enabled",disabled:"Disabled",emptyIncSearch:"Search results is empty in current view.\\A Press [Enter] to expand search target.",emptyLetSearch:"First letter search results is empty in current view.",textLabel:"Text label",minsLeft:"$1 mins left",openAsEncoding:"Reopen with selected encoding",saveAsEncoding:"Save with the selected encoding",selectFolder:"Select folder",firstLetterSearch:"First letter search",presets:"Presets",tooManyToTrash:"It's too many items so it can't into trash.",TextArea:"TextArea",folderToEmpty:'Empty the folder "$1".',filderIsEmpty:'There are no items in a folder "$1".',preference:"Preference",language:"Language",clearBrowserData:"Initialize the settings saved in this browser",toolbarPref:"Toolbar settings",charsLeft:"... $1 chars left.",sum:"Sum",roughFileSize:"Rough file size",autoFocusDialog:"Focus on the element of dialog with mouseover",select:"Select",selectAction:"Action when select file",useStoredEditor:"Open with the editor used last time",selectinvert:"Invert selection",renameMultiple:"Are you sure you want to rename $1 selected items like $2?<br/>This cannot be undone!",batchRename:"Batch rename",plusNumber:"+ Number",asPrefix:"Add prefix",asSuffix:"Add suffix",changeExtention:"Change extention",columnPref:"Columns settings (List view)",reflectOnImmediate:"All changes will reflect immediately to the archive.",reflectOnUnmount:"Any changes will not reflect until un-mount this volume.",unmountChildren:"The following volume(s) mounted on this volume also unmounted. Are you sure to unmount it?",selectionInfo:"Selection Info",hashChecker:"Algorithms to show the file hash",infoItems:"Info Items (Selection Info Panel)",pressAgainToExit:"Press again to exit.",toolbar:"Toolbar",workspace:"Work Space",dialog:"Dialog",all:"All",iconSize:"Icon Size (Icons view)",editorMaximized:"Open the maximized editor window",editorConvNoApi:"Because conversion by API is not currently available, please convert on the website.",editorConvNeedUpload:"After conversion, you must be upload with the item URL or a downloaded file to save the converted file.",convertOn:"Convert on the site of $1",integrations:"Integrations",integrationWith:"This elFinder has the following external services integrated. Please check the terms of use, privacy policy, etc. before using it.",showHidden:"Show hidden items",hideHidden:"Hide hidden items",toggleHidden:"Show/Hide hidden items",makefileTypes:'File types to enable with "New file"',typeOfTextfile:"Type of the Text file",add:"Add",theme:"Theme","default":"Default",description:"Description",website:"Website",author:"Author",email:"Email",license:"License",exportToSave:"This item can't be saved. To avoid losing the edits you need to export to your PC.",kindUnknown:"Unknown",kindRoot:"Volume Root",kindFolder:"Folder",kindSelects:"Selections",kindAlias:"Alias",kindAliasBroken:"Broken alias",kindApp:"Application",kindPostscript:"Postscript document",kindMsOffice:"Microsoft Office document",kindMsWord:"Microsoft Word document",kindMsExcel:"Microsoft Excel document",kindMsPP:"Microsoft Powerpoint presentation",kindOO:"Open Office document",kindAppFlash:"Flash application",kindPDF:"Portable Document Format (PDF)",kindTorrent:"Bittorrent file",kind7z:"7z archive",kindTAR:"TAR archive",kindGZIP:"GZIP archive",kindBZIP:"BZIP archive",kindXZ:"XZ archive",kindZIP:"ZIP archive",kindRAR:"RAR archive",kindJAR:"Java JAR file",kindTTF:"True Type font",kindOTF:"Open Type font",kindRPM:"RPM package",kindText:"Text document",kindTextPlain:"Plain text",kindPHP:"PHP source",kindCSS:"Cascading style sheet",kindHTML:"HTML document",kindJS:"Javascript source",kindRTF:"Rich Text Format",kindC:"C source",kindCHeader:"C header source",kindCPP:"C++ source",kindCPPHeader:"C++ header source",kindShell:"Unix shell script",kindPython:"Python source",kindJava:"Java source",kindRuby:"Ruby source",kindPerl:"Perl script",kindSQL:"SQL source",kindXML:"XML document",kindAWK:"AWK source",kindCSV:"Comma separated values",kindDOCBOOK:"Docbook XML document",kindMarkdown:"Markdown text",kindImage:"Image",kindBMP:"BMP image",kindJPEG:"JPEG image",kindGIF:"GIF Image",kindPNG:"PNG Image",kindTIFF:"TIFF image",kindTGA:"TGA image",kindPSD:"Adobe Photoshop image",kindXBITMAP:"X bitmap image",kindPXM:"Pixelmator image",kindAudio:"Audio media",kindAudioMPEG:"MPEG audio",kindAudioMPEG4:"MPEG-4 audio",kindAudioMIDI:"MIDI audio",kindAudioOGG:"Ogg Vorbis audio",kindAudioWAV:"WAV audio",AudioPlaylist:"MP3 playlist",kindVideo:"Video media",kindVideoDV:"DV movie",kindVideoMPEG:"MPEG movie",kindVideoMPEG4:"MPEG-4 movie",kindVideoAVI:"AVI movie",kindVideoMOV:"Quick Time movie",kindVideoWM:"Windows Media movie",kindVideoFlash:"Flash movie",kindVideoMKV:"Matroska movie",kindVideoOGG:"Ogg movie"}}),e.fn.elfinderbutton=function(t){return this.each(function(){var n,i,a="class",o=t.fm,r=o.res(a,"disabled"),s=o.res(a,"active"),l=o.res(a,"hover"),c="elfinder-button-menu-item",d="elfinder-button-menu-item-selected",p=e('<span class="elfinder-button-text">'+t.title+"</span>"),u="elfinder-button-icon-"+(t.className?t.className:t.name),h=e(this).addClass("ui-state-default elfinder-button").attr("title",t.title).append('<span class="elfinder-button-icon '+u+'"/>',p).on("mouseenter mouseleave",function(e){!h.hasClass(r)&&h["mouseleave"==e.type?"removeClass":"addClass"](l)}).on("click",function(e){h.hasClass(r)||(n&&t.variants.length>=1?(n.is(":hidden")&&o.getUI().click(),e.stopPropagation(),n.css(m()).slideToggle({duration:100,done:function(e){o[n.is(":visible")?"toFront":"toHide"](n)}})):o.exec(t.name,g(),{_userAction:!0,_currentType:"toolbar",_currentNode:h}))}),f=function(){o.toHide(n)},m=function(){var e=o.getUI(),t=e.offset(),n=h.offset();return{top:n.top-t.top,left:n.left-t.left,maxHeight:e.height()-40}},g=function(){var e,t=o.selected();return t.length||(t=(e=o.cwd())?[o.cwd().hash]:void 0),t};p.hide(),t.button=h,Array.isArray(t.variants)&&(h.addClass("elfinder-menubutton"),n=e('<div class="ui-front ui-widget ui-widget-content elfinder-button-menu ui-corner-all"/>').hide().appendTo(o.getUI()).on("mouseenter mouseleave","."+c,function(){e(this).toggleClass(l)}).on("click","."+c,function(i){var a=e(this).data("value");i.preventDefault(),i.stopPropagation(),h.removeClass(l),o.toHide(n),"undefined"==typeof a&&(a={}),"object"==typeof a&&(a._userAction=!0),o.exec(t.name,g(),a)}).on("close",f),o.bind("disable select",f).getUI().on("click",f),t.change(function(){n.html(""),e.each(t.variants,function(i,a){n.append(e('<div class="'+c+'">'+a[1]+"</div>").data("value",a[0]).addClass(a[0]==t.value?d:""))})})),t.change(function(){var e;i&&cancelAnimationFrame(i),i=requestAnimationFrame(function(){t.disabled()?h.removeClass(s+" "+l).addClass(r):(h.removeClass(r),h[t.active()?"addClass":"removeClass"](s)),t.syncTitleOnChange&&(e="elfinder-button-icon-"+(t.className?t.className:t.name),u!==e&&(h.children(".elfinder-button-icon").removeClass(u).addClass(e),u=e),p.html(t.title),h.attr("title",t.title))})}).change()})},e.fn.elfindercontextmenu=function(t){return this.each(function(){var n,i,a,o,r,s,l,c=(e(this),"elfinder-contextmenu-item"),d="elfinder-contextsubmenu-item",p="elfinder-contextmenu-extra-icon",u=t.res("class","hover"),h={distance:8,start:function(){f.data("drag",!0).data("touching")&&f.find("."+u).removeClass(u)},stop:function(){f.data("draged",!0).removeData("drag")}},f=e(this).addClass("touch-punch ui-helper-reset ui-front ui-widget ui-state-default ui-corner-all elfinder-contextmenu elfinder-contextmenu-"+t.direction).hide().on("touchstart",function(e){f.data("touching",!0).children().removeClass(u)}).on("touchend",function(e){f.removeData("touching")}).on("mouseenter mouseleave","."+c,function(t){e(this).toggleClass(u,!("mouseenter"!==t.type&&(f.data("draged")||!f.data("submenuKeep")))),f.data("draged")&&f.data("submenuKeep")&&f.find(".elfinder-contextmenu-sub:visible").parent().addClass(u)}).on("mouseenter mouseleave","."+p,function(t){e(this).parent().toggleClass(u,"mouseleave"===t.type)}).on("mouseenter mouseleave","."+c+",."+d,function(t){var n=function(t,n){e.each(n?r:a,function(e,i){if(t[0]===i)return(n?r:a)._cur=e,n?s=t:o=t,!1})};if(t.originalEvent){var i=e(this),l=function(){o&&!o.children("div.elfinder-contextmenu-sub:visible").length&&o.removeClass(u)};"mouseenter"===t.type?i.hasClass(d)?(s&&s.removeClass(u),o&&(r=o.find("div."+d)),n(i,!0)):(l(),n(i)):i.hasClass(d)?(s=null,r=null):(l(),function(e){setTimeout(function(){e===o&&(o=null)},250)}(o))}}).on("contextmenu",function(){return!1}).on("mouseup",function(){setTimeout(function(){f.removeData("draged")},100)}).draggable(h),m="ltr"===t.direction,g=m?"left":"right",v=Object.assign({},t.options.contextmenu),b='<div class="'+c+'{className}"><span class="elfinder-button-icon {icon} elfinder-contextmenu-icon"{style}/><span>{label}</span></div>',y=function(n,i,a,o){var r,s,l="",c="",d="";return o&&(o.className&&(l=" "+o.className),o.iconClass&&(d=o.iconClass,i=""),o.iconImg&&(r=o.iconImg.split(/ +/),s=r[1]&&r[2]?t.escape(r[1]+"px "+r[2]+"px"):"",c=" style=\"background:url('"+t.escape(r[0])+"') "+(s?s:"0 0")+" no-repeat;"+(s?"":"posbackground-size:contain;")+'"')),e(b.replace("{icon}",i?"elfinder-button-icon-"+i:d?d:"").replace("{label}",n).replace("{style}",c).replace("{className}",l)).on("click",function(e){e.stopPropagation(),e.preventDefault(),a()})},w=function(e){var t=e.split(/ +/),n=t[1]&&t[2]?t[1]+"px "+t[2]+"px":"";return{backgroundImage:'url("'+t[0]+'")',backgroundRepeat:"no-repeat",backgroundPosition:n?n:"",backgroundSize:n?"":"contain"}},x=function(){var n="touchstart.contextmenuAutoToggle";f.data("hideTm")&&clearTimeout(f.data("hideTm")),f.is(":visible")&&f.on("touchstart",function(e){e.originalEvent.touches.length>1||(f.stop(),t.toFront(f),f.data("hideTm")&&clearTimeout(f.data("hideTm")))}).data("hideTm",setTimeout(function(){f.is(":visible")&&(i.find(".elfinder-cwd-file").off(n),i.find(".elfinder-cwd-file.ui-selected").one(n,function(t){if(!(t.originalEvent.touches.length>1)){var a=e(t.target);return!f.first().length||a.is("input:checkbox")||a.hasClass("elfinder-cwd-select")?void i.find(".elfinder-cwd-file").off(n):(t.stopPropagation(),C(t.originalEvent.touches[0].pageX,t.originalEvent.touches[0].pageY),i.data("longtap",!0),void a.one("touchend",function(){setTimeout(function(){i.removeData("longtap")},80)}))}}).one("unselect."+t.namespace,function(){i.find(".elfinder-cwd-file").off(n)}),f.fadeOut({duration:300,fail:function(){f.css("opacity","1").show()},done:function(){t.toHide(f)}}))},4500))},k=function(n){var i=n.keyCode,l=e.ui.keyCode.ESCAPE,c=e.ui.keyCode.ENTER,p=e.ui.keyCode.LEFT,h=e.ui.keyCode.RIGHT,f=e.ui.keyCode.UP,m=e.ui.keyCode.DOWN,g="ltr"===t.direction?h:p,v=g===h?p:h;e.inArray(i,[l,c,p,h,f,m])!==-1&&(n.preventDefault(),n.stopPropagation(),n.stopImmediatePropagation(),i==l||i===v?o&&r&&s?(s.trigger("mouseleave").trigger("submenuclose"),o.addClass(u),r=null,s=null):i==l&&z():i==f||i==m?r?(s&&s.trigger("mouseleave"),i==m&&(!s||r.length<=++r._cur)?r._cur=0:i==f&&(!s||--r._cur<0)&&(r._cur=r.length-1),s=r.eq(r._cur).trigger("mouseenter")):(r=null,o&&o.trigger("mouseleave"),i==m&&(!o||a.length<=++a._cur)?a._cur=0:i==f&&(!o||--a._cur<0)&&(a._cur=a.length-1),o=a.eq(a._cur).addClass(u)):!o||i!=c&&i!==g||(o.hasClass("elfinder-contextmenu-group")?s?i==c&&s.click():(o.trigger("mouseenter"),r=o.find("div."+d),r._cur=0,s=r.first().addClass(u)):i==c&&o.click()))},C=function(i,a,c){var d,p=f.outerWidth(),u=f.outerHeight(),h=n.attr("style"),m=n.offset(),v=n.width(),b=n.height(),y=t.UA.Mobile?40:2,w=t.UA.Mobile?20:2,i=i-(m?m.left:0),a=a-(m?m.top:0),c=Object.assign(c||{},{top:Math.max(0,a+w+u<b?a+w:a-(a+u-b)),left:Math.max(0,i<p+y||i+y+p<v?i+y:i-y-p),opacity:"1"});l=!0,t.autoSync("stop"),n.width(v),f.stop().removeAttr("style").css(c),t.toFront(f),f.show(),n.attr("style",h),c[g]=parseInt(f.width()),f.find(".elfinder-contextmenu-sub").css(c),t.UA.iOS&&e("div.elfinder div.overflow-scrolling-touch").css("-webkit-overflow-scrolling","auto"),o=null,r=null,s=null,e(document).on("keydown."+t.namespace,k),d=e._data(document).events,d&&d.keydown&&d.keydown.unshift(d.keydown.pop()),t.UA.Mobile&&x(),requestAnimationFrame(function(){t.getUI().one("click."+t.namespace,z)})},z=function(){if(t.getUI().off("click."+t.namespace,z),e(document).off("keydown."+t.namespace,k),S=I=null,f.is(":visible")||f.children().length){t.toHide(f.removeAttr("style").empty().removeData("submenuKeep"));try{f.draggable("instance")||f.draggable(h)}catch(n){f.hasClass("ui-draggable")||f.draggable(h)}f.data("prevNode")&&(f.data("prevNode").after(f),f.removeData("prevNode")),t.trigger("closecontextmenu"),t.UA.iOS&&e("div.elfinder div.overflow-scrolling-touch").css("-webkit-overflow-scrolling","touch")}l&&t.searchStatus.state<1&&!t.searchStatus.ininc&&t.autoSync(),l=!1},T=function(i,o){var r,s=!1,l=!1,h=[],g="cwd"===i,b=0;S=i,I=o,(r=t.option("uiCmdMap",g?void 0:o[0]))||(r={}),g||(h=t.getDisabledCmds(o)),b=t.selected().length,b>1&&f.append('<div class="ui-corner-top ui-widget-header elfinder-contextmenu-header"><span>'+t.i18n("selectedItems",""+b)+"</span></div>"),a=e(),e.each(v[i]||[],function(v,b){var x,k,C,T,A,S;if("|"===b)return void(s&&(l=!0));if(r[b]?(k=r[b],C=!0):k=b,x=t.getCommand(k),!x||g||t.searchStatus.state&&x.disableOnSearch||(x.__disabled=x._disabled,x._disabled=!(x.alwaysEnabled||!!t._commands[k]&&!(e.inArray(b,h)!==-1||C&&h[k])),e.each(x.linkedCmds,function(e,n){var i;(i=t.getCommand(n))&&(i.__disabled=i._disabled,i._disabled=!(i.alwaysEnabled||!!t._commands[n]&&!h[n]))})),x&&!x._disabled&&x.getstate(o)!=-1){if(x.variants){if(!x.variants.length)return;T=y(x.title,x.className?x.className:x.name,function(){},x.contextmenuOpts),A=e('<div class="ui-front ui-corner-all elfinder-contextmenu-sub"/>').hide().css("max-height",t.getUI().height()-30).appendTo(T.append('<span class="elfinder-contextmenu-arrow"/>')),S=function(e){if(e){var i=n.attr("style");n.width(n.width()),A.css({top:"-1000px",left:"auto",right:"auto"});var a,o,r=T.offset(),s=r.left,l=r.top,c=T.outerWidth(),d=A.outerWidth(!0),p=A.outerHeight(!0),u=n.offset(),h=u.left+n.width(),g=u.top+n.height(),v=m,b=c;m?(o=s+c+d-h,o>10&&(s>d-5?(b-=5,v=!1):t.UA.Mobile||(b=c-o))):(o=d-s,o>0&&(s+c+d-15<h?(b-=5,v=!0):t.UA.Mobile||(b=c-o))),o=l+5+p-g,a=o>0&&l<g?5-o:o>0?30-p:5,f.find(".elfinder-contextmenu-sub:visible").hide(),A.css({top:a,left:v?b:"auto",right:v?"auto":b,overflowY:"auto"}).show(),n.attr("style",i)}else A.hide()},T.addClass("elfinder-contextmenu-group").on("mouseleave",".elfinder-contextmenu-sub",function(e){f.data("draged")||f.removeData("submenuKeep")}).on("submenuclose",".elfinder-contextmenu-sub",function(e){S(!1)}).on("click","."+d,function(n){var a,r;n.stopPropagation(),f.data("draged")||(r=e(this),x.keepContextmenu?(r.removeClass(u),T.addClass(u)):f.hide(),a=r.data("exec"),"undefined"==typeof a&&(a={}),"object"==typeof a&&(a._userAction=!0,a._currentType=i,a._currentNode=r),!x.keepContextmenu&&z(),t.exec(x.name,o,a))}).on("touchend",function(e){f.data("drag")||(S(!0),f.data("submenuKeep",!0))}).on("mouseenter mouseleave",function(t){f.data("touching")||(T.data("timer")&&(clearTimeout(T.data("timer")),T.removeData("timer")),e(t.target).closest(".elfinder-contextmenu-sub",f).length||("mouseleave"===t.type?f.data("submenuKeep")||T.data("timer",setTimeout(function(){T.removeData("timer"),S(!1)},250)):T.data("timer",setTimeout(function(){T.removeData("timer"),S(!0)},a.find("div.elfinder-contextmenu-sub:visible").length?250:0))))}),e.each(x.variants,function(t,n){var i,a="|"===n?'<div class="elfinder-contextmenu-separator"/>':e('<div class="'+c+" "+d+'"><span>'+n[1]+"</span></div>").data("exec",n[0]);"undefined"!=typeof n[2]&&(i=e("<span/>").addClass("elfinder-button-icon elfinder-contextmenu-icon"),/\//.test(n[2])?i.css(w(n[2])):i.addClass("elfinder-button-icon-"+n[2]),a.prepend(i).addClass(d+"-icon")),A.append(a)})}else T=y(x.title,x.className?x.className:x.name,function(){f.data("draged")||(!x.keepContextmenu&&z(),t.exec(x.name,o,{_userAction:!0,_currentType:i,_currentNode:T}))},x.contextmenuOpts),x.extra&&x.extra.node?(e('<span class="elfinder-button-icon elfinder-button-icon-'+(x.extra.icon||"")+" "+p+'"/>').append(x.extra.node).appendTo(T),e(x.extra.node).trigger("ready",{targets:o})):T.remove("."+p);x.extendsCmd&&T.children("span.elfinder-button-icon").addClass("elfinder-button-icon-"+x.extendsCmd),l&&f.append('<div class="elfinder-contextmenu-separator"/>'),f.append(T),s=!0,l=!1}x&&"undefined"!=typeof x.__disabled&&(x._disabled=x.__disabled,delete x.__disabled,e.each(x.linkedCmds,function(e,n){var i;(i=t.getCommand(n))&&(i._disabled=i.__disabled,delete i.__disabled)}))}),a=f.children("div."+c)},A=function(t){S="raw",e.each(t,function(e,t){var n;"|"===t?f.append('<div class="elfinder-contextmenu-separator"/>'):t.label&&"function"==typeof t.callback&&(n=y(t.label,t.icon,function(){f.data("draged")||(!t.remain&&z(),t.callback())},t.options||null),f.append(n))}),a=f.children("div."+c)},S=null,I=null;t.one("load",function(){n=t.getUI(),i=t.getUI("cwd"),t.bind("contextmenu",function(n){var a,o=n.data,r={};o.type&&"files"!==o.type&&i.trigger("unselectall"),z(),o.type&&o.targets?(t.trigger("contextmenucreate",o),T(o.type,o.targets),t.trigger("contextmenucreatedone",o)):o.raw&&A(o.raw),f.children().length&&(a=o.prevNode||null,a&&(f.data("prevNode",f.prev()),a.after(f)),o.fitHeight&&(r={maxHeight:Math.min(t.getUI().height(),e(window).height()),overflowY:"auto"},f.draggable("destroy").removeClass("ui-draggable")),C(o.x,o.y,r),o.opened&&"function"==typeof o.opened&&o.opened.call(f))}).one("destroy",function(){f.remove()}).bind("disable",z).bind("select",function(e){"files"===S&&(!e.data||e.data.selected.toString()!==I.toString())&&z()})}).shortcut({pattern:"mac"===t.OS?"ctrl+m":"contextmenu shift+f10",description:"contextmenu",callback:function(n){n.stopPropagation(),n.preventDefault(),e(document).one("contextmenu."+t.namespace,function(e){e.preventDefault(),e.stopPropagation()});var i,a,o,r,s=t.selected();s.length?(i="files",a=s,r=t.cwdHash2Elm(s[0])):(i="cwd",a=[t.cwd().hash],o=t.getUI("workzone").offset()),r&&r.length||(r=t.getUI("workzone")),o=r.offset(),o.top+=r.height()/2,o.left+=r.width()/2,t.trigger("contextmenu",{type:i,targets:a,x:o.left,y:o.top})}})})},e.fn.elfindercwd=function(t,n){return this.not(".elfinder-cwd").each(function(){var i,a,o,r,s,l,c,d=t.UA.Mobile,p="list"==t.viewType,u="select."+t.namespace,h="unselect."+t.namespace,f="disable."+t.namespace,m="enable."+t.namespace,g="class",v=t.res(g,"cwdfile"),b="."+v,y="ui-selected",w=t.res(g,"disabled"),x=t.res(g,"draggable"),k=t.res(g,"droppable"),C=t.res(g,"hover"),z=t.res(g,"active"),T=t.res(g,"adroppable"),A=v+"-tmp",S="elfinder-cwd-selectchk",I=t.options.loadTmbs>0?t.options.loadTmbs:5,O="",j={},M=[],D=[],F=void 0,E=[],U="",P=function(){for(var e="",t=0;t<E.length;t++)e+='<td class="elfinder-col-'+E[t]+'">{'+E[t]+"}</td>";return e},R=function(){return'<tr id="{id}" class="'+v+' {permsclass} {dirclass}" title="{tooltip}"{css}><td class="elfinder-col-name"><div class="elfinder-cwd-file-wrapper"><span class="elfinder-cwd-icon {mime}"{style}/>{marker}<span class="elfinder-cwd-filename">{name}</span></div>'+q+"</td>"+P()+"</tr>"},q=e.map(n.showSelectCheckboxUA,function(e){return!(!t.UA[e]&&!e.match(/^all$/i))||null}).length?'<div class="elfinder-cwd-select"><input type="checkbox" class="'+S+'"></div>':"",H=!1,_=null,N={icon:'<div id="{id}" class="'+v+' {permsclass} {dirclass} ui-corner-all" title="{tooltip}"><div class="elfinder-cwd-file-wrapper ui-corner-all"><div class="elfinder-cwd-icon {mime} ui-corner-all" unselectable="on"{style}/>{marker}</div><div class="elfinder-cwd-filename" title="{nametitle}">{name}</div>'+q+"</div>",row:""},L=t.res("tpl","perms"),W=t.res("tpl","lock"),B=t.res("tpl","symlink"),$={id:function(e){return t.cwdHash2Id(e.hash)},name:function(e){var n=t.escape(e.i18||e.name);return!p&&(n=n.replace(/([_.])/g,"&#8203;$1")),n},nametitle:function(e){return t.escape(e.i18||e.name)},permsclass:function(e){return t.perms2class(e)},perm:function(e){return t.formatPermissions(e)},dirclass:function(e){var i="directory"==e.mime?"directory":"";return e.isroot&&(i+=" isroot"),e.csscls&&(i+=" "+t.escape(e.csscls)),n.getClass&&(i+=" "+n.getClass(e)),i},style:function(e){return e.icon?t.getIconStyle(e):""},mime:function(e){var n=t.mime2class(e.mime);return e.icon&&(n+=" elfinder-cwd-bgurl"),n},size:function(e){return"directory"!==e.mime||e.size?t.formatSize(e.size):"-"},date:function(e){return t.formatDate(e)},kind:function(e){return t.mime2kind(e)},mode:function(e){return e.perm?t.formatFileMode(e.perm):""},modestr:function(e){return e.perm?t.formatFileMode(e.perm,"string"):""},modeoct:function(e){return e.perm?t.formatFileMode(e.perm,"octal"):""},modeboth:function(e){return e.perm?t.formatFileMode(e.perm,"both"):""},marker:function(e){return(e.alias||"symlink-broken"==e.mime?B:"")+(e.read&&e.write?"":L)+(e.locked?W:"")},tooltip:function(e){var n=t.formatDate(e)+(e.size>0?" ("+t.formatSize(e.size)+")":""),i="";return i=O&&e.path?t.escape(e.path.replace(/\/[^\/]*$/,"")):e.tooltip?t.escape(e.tooltip).replace(/\r/g,"&#13;"):"",p&&(i+=(i?"&#13;":"")+t.escape(e.i18||e.name)),i?i+"&#13;"+n:n}},K={},V=function(n,i){var o,r,s;if(n&&!K[n]&&("undefined"==typeof a&&(e("#elfinderAddBadgeStyle"+t.namespace).length&&e("#elfinderAddBadgeStyle"+t.namespace).remove(),a=e('<style id="addBadgeStyle'+t.namespace+'"/>').insertBefore(e("head").children(":first")).get(0).sheet||null),a)){if(n=n.toLowerCase(),s=n.split("/"),r=t.escape(t.mimeTypes[n]||(i.replace(/.bac?k$/i,"").match(/\.([^.]+)$/)||["",""])[1])){o=".elfinder-cwd-icon-"+s[0].replace(/(\.|\+)/g,"-"),"undefined"!=typeof s[1]&&(o+=".elfinder-cwd-icon-"+s[1].replace(/(\.|\+)/g,"-"));try{a.insertRule(o+':before{content:"'+r.toLowerCase()+'"}',0)}catch(l){}}K[n]=!0}},X=function(e){return e.mime&&"directory"!==e.mime&&!K[e.mime]&&V(e.mime,e.name),N[p?"row":"icon"].replace(/\{([a-z0-9_]+)\}/g,function(n,i){return $[i]?$[i](e,t):e[i]?e[i]:""})},G=e(),J=!1,Y=function(t,n){function i(e,t){return e[t+"All"]("[id]:not(."+w+"):not(.elfinder-cwd-parent):first")}var a,o,r,s,l,c=e.ui.keyCode,d=t==c.LEFT||t==c.UP,f=Ue.find("[id]."+y);if(f.length)if(a=f.filter(d?":first":":last"),r=i(a,d?"prev":"next"),r.length)if(p||t==c.LEFT||t==c.RIGHT)o=r;else if(s=a.position().top,l=a.position().left,o=a,d){do o=o.prev("[id]");while(o.length&&!(o.position().top<s&&o.position().left<=l));o.hasClass(w)&&(o=i(o,"next"))}else{do o=o.next("[id]");while(o.length&&!(o.position().top>s&&o.position().left>=l));o.hasClass(w)&&(o=i(o,"prev")),o.length||(r=Ue.find("[id]:not(."+w+"):last"),r.position().top>s&&(o=r))}else o=a;else o=G.length?d?G.prev():G:Ue.find("[id]:not(."+w+"):not(.elfinder-cwd-parent):"+(d?"last":"first"));o&&o.length&&!o.hasClass("elfinder-cwd-parent")&&(a&&n?o=a.add(a[d?"prevUntil":"nextUntil"]("#"+o.attr("id"))).add(o):f.trigger(h),o.trigger(u),re(o.filter(d?":first":":last")),oe())},Q={},Z=function(e){t.cwdHash2Elm(e).trigger(u)},ee=!1,te=function(){t.cwd().hash;q&&qe.find("input").prop("checked",!0),t.lazy(function(){var n;t.maxTargets&&(F||D).length>t.maxTargets?(ne({notrigger:!0}),n=e.map(F||D,function(e){return t.file(e)||null}),n=n.slice(0,t.maxTargets),Q={},e.each(n,function(e,n){Q[n.hash]=!0,t.cwdHash2Elm(n.hash).trigger(u)}),t.toast({mode:"warning",msg:t.i18n(["errMaxTargets",t.maxTargets])})):(Ue.find("[id]:not(."+y+"):not(.elfinder-cwd-parent)").trigger(u),Q=t.arrayFlip(F||D,!0)),oe(),q&&qe.data("pending",!1)},0,{repaint:!0})},ne=function(e){var t=e||{};q&&qe.find("input").prop("checked",!1),Object.keys(Q).length&&(J=!1,Q={},Ue.find("[id]."+y).trigger(h),q&&Ue.find("input:checkbox."+S).prop("checked",!1)),!t.notrigger&&oe(),q&&qe.data("pending",!1),Ue.removeClass("elfinder-cwd-allselected")},ie=function(){var n={};ee?ne():Object.keys(Q).length?(e.each(F||D,function(e,i){var a=t.cwdHash2Elm(i);Q[i]?a.length&&a.trigger(h):(n[i]=!0,a.length&&a.trigger(u))}),Q=n,oe()):te()},ae=void 0,oe=function(){var e=Object.keys(Q),n={selected:e,origin:"cwd"};ge&&(e.length>1||e[0]!==t.cwdId2Hash(ge.attr("id")))&&ge.hasClass(y)&&ge.trigger(h),ee=e.length&&e.length===(F||D).length&&(!t.maxTargets||e.length<=t.maxTargets),q&&(qe.find("input").prop("checked",ee),Ue[ee?"addClass":"removeClass"]("elfinder-cwd-allselected")),ee?n.selectall=!0:e.length||(n.unselectall=!0),t.trigger("select",n)},re=function(e,n){if(e.length){var i=e.position().top,a=e.outerHeight(!0),o=Pe.scrollTop(),r=Pe.get(0).clientHeight,s=we?we.outerHeight(!0):0;i+s+a>o+r?Pe.scrollTop(parseInt(i+s+a-r)):i<o&&Pe.scrollTop(i),p&&Pe.scrollLeft(0),!!n&&t.resources.blink(e,"lookme")}},se=[],le={},ce=function(e){for(var t=se.length;t--;)if(se[t].hash==e)return t;return-1},de="elfscrstart",pe="elfscrstop",ue=!1,he={disabled:!0,filter:"[id]:first",stop:oe,delay:250,appendTo:"body",autoRefresh:!1,selected:function(t,n){e(n.selected).trigger(u)},unselected:function(t,n){e(n.unselected).trigger(h)}},fe={},me=function(a,o){if(le.renderd){var r=(p?Ue.find("tbody:first"):Ue).children("[id]"+(n.oldSchool?":not(.elfinder-cwd-parent)":"")+":first");if(r.length){var s,l,c=Ue.data("selectable"),d=function(){var n=Pe.offset(),a=Pe.width(),o=e(window),s=r.width()/2,l=Math.min(n.left-o.scrollLeft()+("ltr"===t.direction?s:a-s),n.left+a-10),c=n.top-o.scrollTop()+10+(p?i:0);return{left:Math.max(0,Math.round(l)),top:Math.max(0,Math.round(c))}}(),u=a?r:e(document.elementFromPoint(d.left,d.top)),h={},f={},m=5,g=Math.ceil((le.hpi?Math.ceil(Le.data("rectangle").height/le.hpi*1.5):be)/m),y=function(){var e,n,i;for(i=0;i<m&&(e=u.attr("id"),e&&(le.getTmbs=[],n=t.cwdId2Hash(e),fe[n]=e,le.attachTmbs[n]&&(f[n]=le.attachTmbs[n]),c&&(h[e]=!0)),u=u.next(),u.length);i++);},w=function(){var e;Ue.data("selectable")&&(Object.assign(h,Q),e=Object.keys(h),e.length&&(he.filter="#"+e.join(", #"),Ue.selectable("enable").selectable("option",{filter:he.filter}).selectable("refresh"))),Object.keys(f).length&&(le.getTmbs=[],Ae(f))},x=function(){u.hasClass(v)||(u=u.closest(b))};if(fe={},c&&Ue.selectable("option","disabled"),u.length&&(u.hasClass(v)||u.closest(b).length||(l=t.getUI().find(".ui-dialog:visible,.ui-widget:visible"),l.length?(l.hide(),u=e(document.elementFromPoint(d.left,d.top)),l.show()):l=null),x(),u.length||(l&&l.hide(),u=e(document.elementFromPoint(d.left,d.top+5)),l&&l.show(),x())),u.length){if(u.attr("id"))if(a){for(var k=0;k<g&&(y(),u.length);k++);w()}else le.repaintJob&&"pending"===le.repaintJob.state()&&le.repaintJob.reject(),s=new Array(g),le.repaintJob=t.asyncJob(function(){y(),u.length||(w(),le.repaintJob&&"pending"===le.repaintJob.state()&&le.repaintJob.reject())},s).done(w)}else a&&le.renderd&&(o=o||0,o<10&&requestAnimationFrame(function(){me(a,++o)}))}}},ge=null,ve=function(n){var i=t.cwd().phash,a=t.file(i)||null,o=function(n){n&&(ge=e(X(e.extend(!0,{},n,{name:"..",i18:"..",mime:"directory"}))).addClass("elfinder-cwd-parent").on("dblclick",function(){var e=t.cwdId2Hash(this.id);t.trigger("select",{selected:[e]}).exec("open",e)}),(p?ge.children("td:first"):ge).children(".elfinder-cwd-select").remove(),(p?Ue.find("tbody"):Ue).prepend(ge),t.draggingUiHelper&&t.draggingUiHelper.data("refreshPositions",1))};a?o(a):t.getUI("tree").length?t.one("parents",function(){o(t.file(i)||null),Pe.trigger(pe)}):t.request({data:{cmd:"parents",target:t.cwd().hash},preventFail:!0}).done(function(e){o(t.file(i)||null),Pe.trigger(pe)})},be=t.options.showFiles,ye=function(){if(!(le.rendering||le.renderd&&!se.length)){var i,a,o=p?Ue.children("table").children("tbody"):Ue,r=!!e.htmlPrefilter,s=e(r?document.createDocumentFragment():"<div/>"),l=function(n){var i,a,l,c=n||null,h=[],f=!1,m={},g="self"===t.option("tmbUrl"),v=!le.renderd;i=se.splice(0,be+(c||0)/(le.hpi||1)),le.renderd+=i.length,se.length||(Re.hide(),Pe.off(pe,ye)),a=[],h=e.map(i,function(e){return e.hash&&e.name?("directory"==e.mime&&(f=!0),(e.tmb&&(1!=e.tmb||e.size>0)||g&&0===e.mime.indexOf("image/"))&&(m[e.hash]=e.tmb||"self"),j[e.hash]&&a.push(e.hash),X(e)):null}),s.empty().append(h.join("")),f&&!d&&Te(s),l=[],Object.keys(Q).length&&s.find("[id]:not(."+y+"):not(.elfinder-cwd-parent)").each(function(){Q[t.cwdId2Hash(this.id)]&&l.push(e(this))}),o.append(r?s:s.children()),l.length&&(e.each(l,function(e,t){t.trigger(u)}),oe()),a.length&&t.trigger("lockfiles",{files:a}),!le.hpi&&De(o,i.length),p&&(Ue.find("thead").show(),ke({fitWidth:!_})),Object.keys(m).length&&Object.assign(le.attachTmbs,m),v&&(d||Ue.data("selectable")||Ue.selectable(he).data("selectable",!0)),!ue&&Pe.trigger(pe)};le.renderd||(le.rendering=!0,Pe.scrollTop(0),i=t.cwd().phash,l(),n.oldSchool&&(i&&!O?ve(i):ge=e()),p&&(_&&Ce(),ke({fitWidth:!0})),le.itemH=(p?o.find("tr:first"):o.find("[id]:first")).outerHeight(!0),t.trigger("cwdrender"),le.rendering=!1,me(!0)),!le.rendering&&se.length?(a=Pe.height()+Pe.scrollTop()+t.options.showThreshold+le.row-le.renderd*le.hpi)>0?(le.rendering=!0,t.lazy(function(){l(a),le.rendering=!1})):!t.enabled()&&_e():_e()}},we=null,xe=t.UA.CSS.positionSticky&&t.UA.CSS.widthMaxContent,ke=function(a){if(i=0,n.listView.fixedHeader){var o,r,s,l,c,d,p,u,h,f,m,g,v,b=function(){var e,n;n="ltr"===t.direction?"left":"right",e=("ltr"===t.direction?Pe.scrollLeft():s.outerWidth(!0)-Pe.width()-Pe.scrollLeft())*-1,r.css(n)!==e&&r.css(n,e)},y=a||{};if(c=Ue.find("tbody"),u=c.children("tr:first"),u.length&&u.is(":visible")){if(s=c.parent(),we?(l=e("#"+t.namespace+"-cwd-thead"),p=l.children("tr:first")):(v=!0,c.addClass("elfinder-cwd-fixheader"),l=Ue.find("thead").attr("id",t.namespace+"-cwd-thead"),p=l.children("tr:first"),d=p.outerHeight(!0),Ue.css("margin-top",d-parseInt(s.css("padding-top"))),xe?(we=e('<div class="elfinder-table-header-sticky"/>').addClass(Ue.attr("class")).append(e("<table/>").append(l)),Ue.after(we),Pe.on("resize.fixheader",function(e){e.stopPropagation(),ke({fitWidth:!0})})):(r=e("<div/>").addClass(Ue.attr("class")).append(e("<table/>").append(l)),we=e("<div/>").addClass(Pe.attr("class")+" elfinder-cwd-fixheader").removeClass("ui-droppable native-droppable").css(Pe.position()).css({height:d,width:Ue.outerWidth()}).append(r),"rtl"===t.direction&&we.css("left",Pe.data("width")-Pe.width()+"px"),b(),Pe.after(we).on("scroll.fixheader resize.fixheader",function(e){b(),"resize"===e.type&&(e.stopPropagation(),we.css(Pe.position()),Pe.data("width",Pe.css("overflow","hidden").width()),Pe.css("overflow","auto"),ke())}))),v||y.fitWidth||Math.abs(u.outerWidth()-p.outerWidth())>2){o=E.length+1;for(var w=0;w<o&&(h=p.children("td:eq("+w+")"),f=u.children("td:eq("+w+")"),m=h.width(),g=f.width(),"undefined"==typeof h.data("delta")&&h.data("delta",h.outerWidth()-m-(f.outerWidth()-g)),g-=h.data("delta"),v||y.fitWidth||m!==g);w++)h.css("width",g+"px")}xe||(we.data("widthTimer")&&cancelAnimationFrame(we.data("widthTimer")),we.data("widthTimer",requestAnimationFrame(function(){we&&(we.css("width",We.width()+"px"),"rtl"===t.direction&&we.css("left",Pe.data("width")-Pe.width()+"px"))}))),i=l.height()}}},Ce=function(){if(p&&_){var t,n="elfinder-cwd-colwidth",i=Ue.find("tr[id]:first");i.hasClass(n)||(t=Ue.find("tr."+n),t.removeClass(n).find("td").css("width",""),i.addClass(n),Ue.find("table:first").css("table-layout","fixed"),e.each(e.merge(["name"],E),function(e,t){var n=_[t]||i.find("td.elfinder-col-"+t).width();i.find("td.elfinder-col-"+t).width(n)}))}},ze=Object.assign({},t.droppable,{over:function(n,i){var a,o,r,s=e(this),l=i.helper,c=n.shiftKey||n.ctrlKey||n.metaKey;return n.stopPropagation(),l.data("dropover",l.data("dropover")+1),s.data("dropover",!0),l.removeClass("elfinder-drag-helper-move elfinder-drag-helper-plus"),l.data("namespace")===t.namespace&&t.insideWorkzone(n.pageX,n.pageY)?(s.hasClass(t.res(g,"cwdfile"))?(a=t.cwdId2Hash(s.attr("id")),s.data("dropover",a)):(a=t.cwd().hash,t.cwd().write&&s.data("dropover",a)),
r=t.file(l.data("files")[0]).phash===a,s.data("dropover")===a?e.each(l.data("files"),function(e,t){if(t===a||r&&!c&&!l.hasClass("elfinder-drag-helper-plus"))return s.removeClass(T),!1}):s.removeClass(T),l.data("locked")||r?o="elfinder-drag-helper-plus":(o="elfinder-drag-helper-move",c&&(o+=" elfinder-drag-helper-plus")),s.hasClass(T)&&l.addClass(o),void requestAnimationFrame(function(){s.hasClass(T)&&l.addClass(o)})):void s.removeClass(T)},out:function(t,n){var i=n.helper;t.stopPropagation(),i.removeClass("elfinder-drag-helper-move elfinder-drag-helper-plus").data("dropover",Math.max(i.data("dropover")-1,0)),e(this).removeData("dropover").removeClass(T)},deactivate:function(){e(this).removeData("dropover").removeClass(T)},drop:function(e,n){ne({notrigger:!0}),t.droppable.drop.call(this,e,n)}}),Te=function(n){n=n?n:p?Ue.find("tbody"):Ue;var i=n.children(".directory:not(."+k+",.elfinder-na,.elfinder-ro)");t.isCommandEnabled("paste")&&i.droppable(ze),t.isCommandEnabled("upload")&&i.addClass("native-droppable"),n.children(".isroot").each(function(n,i){var a=e(i),o=t.cwdId2Hash(i.id);t.isCommandEnabled("paste",o)?a.hasClass(k+",elfinder-na,elfinder-ro")||a.droppable(ze):a.hasClass(k)&&a.droppable("destroy"),t.isCommandEnabled("upload",o)?a.hasClass("native-droppable,elfinder-na,elfinder-ro")||a.addClass("native-droppable"):a.hasClass("native-droppable")&&a.removeClass("native-droppable")})},Ae=function(n,i){var a=function(t,n){e("<img/>").on("load",function(){t.find(".elfinder-cwd-icon").addClass(n.className).css("background-image","url('"+n.url+"')")}).attr("src",n.url)},o=function(e,n){var o,r,s=t.cwdHash2Elm(e);s.length&&("1"!=n?(o=t.file(e),o.tmb!==n&&(o.tmb=n),r=t.tmb(o),i?s.find(".elfinder-cwd-icon").addClass(r.className).css("background-image","url('"+r.url+"')"):a(s,r),delete le.attachTmbs[e]):i?Se([e]):le.tmbLoading[e]||le.getTmbs.push(e))};e.isPlainObject(n)&&Object.keys(n).length&&(Object.assign(le.attachTmbs,n),e.each(n,o),i||!le.getTmbs.length||Object.keys(le.tmbLoading).length||Se())},Se=function(n){var i=[],a=!1;return t.oldAPI?void t.request({data:{cmd:"tmb",current:t.cwd().hash},preventFail:!0}).done(function(e){e.images&&Object.keys(e.images).length&&Ae(e.images),e.tmb&&Se()}):(n?(a=!0,i=n.splice(0,I)):i=le.getTmbs.splice(0,I),void(i.length&&(a||fe[i[0]]||fe[i[i.length-1]])&&(e.each(i,function(e,t){le.tmbLoading[t]=!0}),t.request({data:{cmd:"tmb",targets:i},preventFail:!0}).done(function(t){var o,r=[];t.images&&((o=Object.keys(t.images).length)?(o<i.length&&e.each(i,function(e,n){t.images[n]||r.push(n)}),Ae(t.images,a)):r=i,r.length&&e.each(r,function(e,t){delete le.attachTmbs[t]})),a&&n.length&&Se(n)}).always(function(){le.tmbLoading={},!a&&le.getTmbs.length&&Se()}))))},Ie=function(n,i){var a,o,r,s,l,c,u=p?Ue.find("tbody"):Ue,h=n.length,f={},m=function(e){for(var n,i=Ue.find("[id]:first");i.length;){if(n=t.file(t.cwdId2Hash(i.attr("id"))),!i.hasClass("elfinder-cwd-parent")&&n&&t.compare(e,n)<0)return i;i=i.next("[id]")}},g=function(e){var n,i=se.length;for(n=0;n<i;n++)if(t.compare(e,se[n])<0)return n;return i||-1},v=!!e.htmlPrefilter,b=e(v?document.createDocumentFragment():"<div/>");if(h>be)Ee(),Q=t.arrayFlip(e.map(n,function(e){return e.hash}),!0),oe();else{for(h&&Le.removeClass("elfinder-cwd-wrapper-empty"),c="self"===t.option("tmbUrl");h--;)a=n[h],o=a.hash,t.cwdHash2Elm(o).length||((r=m(a))&&!r.length&&(r=null),!r&&(l=g(a))>=0?se.splice(l,0,a):(b.empty().append(X(a)),"directory"===a.mime&&!d&&Te(b),s=v?b:b.children(),r?r.before(s):u.append(s)),t.cwdHash2Elm(o).length&&(a.tmb&&(1!=a.tmb||a.size>0)||c&&0===a.mime.indexOf("image/"))&&(f[o]=a.tmb||"self"));p&&(Ce(),ke({fitWidth:!_})),De(u),Object.keys(f).length&&Object.assign(le.attachTmbs,f)}},Oe=function(n){var i,a,o,r,s=n.length,l=t.searchStatus.state>1,c=t.getCommand(t.currentReqCmd)||{};if(!t.cwd().hash&&!c.noChangeDirOnRemovedCwd)return e.each(M.reverse(),function(e,n){if(t.file(n))return r=!0,t.one(t.currentReqCmd+"done",function(){!t.cwd().hash&&t.exec("open",n)}),!1}),void(!r&&!t.cwd().hash&&t.exec("open",t.roots[Object.keys(t.roots)[0]]));for(;s--;){if(i=n[s],(a=t.cwdHash2Elm(i)).length)try{a.remove(),--le.renderd}catch(d){t.debug("error",d)}else(o=ce(i))!==-1&&se.splice(o,1);Q[i]&&delete Q[i],l&&(o=e.inArray(i,D))!==-1&&D.splice(o,1)}l&&t.trigger("cwdhasheschange",D),p&&(Ce(),ke({fitWidth:!_}))},je=function(){for(var e="",n="",i=0;i<E.length;i++)e=t.getColumnName(E[i]),n+='<td class="elfinder-cwd-view-th-'+E[i]+' sortable-item">'+e+"</td>";return n},Me=function(e){var t,n;e.height||(t=p?Ue.find("tbody"):Ue,n=t.find(p?"tr:first":"[id]:first"),e.height=n.outerHeight(!0),p||(e.width=n.outerWidth(!0)))},De=function(e,n){var i,a=e||(p?Ue.find("tbody"):Ue),o=Ke[t.viewType],r=1;se.length>0&&(le.hpi?p||(r=Math.floor(a.width()/o.width)):(Me(o),p?le.row=le.hpi=o.height:(r=Math.floor(a.width()/o.width),le.row=o.height,le.hpi=le.row/r)),i=Math.ceil((se.length+(n||0))/r),p&&we&&++i,Re.css({top:le.row*i+"px"}).show())},Fe={contextmenu:function(e){return e.preventDefault(),void 0!==Ue.data("longtap")?void e.stopPropagation():void t.trigger("contextmenu",{type:"cwd",targets:[t.cwd().hash],x:e.pageX,y:e.pageY})},touchstart:function(e){e.originalEvent.touches.length>1||(Ue.data("longtap")!==!1&&(Pe.data("touching",{x:e.originalEvent.touches[0].pageX,y:e.originalEvent.touches[0].pageY}),Ue.data("tmlongtap",setTimeout(function(){Ue.data("longtap",!0),t.trigger("contextmenu",{type:"cwd",targets:[t.cwd().hash],x:Pe.data("touching").x,y:Pe.data("touching").y})},500))),Ue.data("longtap",null))},touchend:function(e){"touchmove"===e.type?(!Pe.data("touching")||Math.abs(Pe.data("touching").x-e.originalEvent.touches[0].pageX)+Math.abs(Pe.data("touching").y-e.originalEvent.touches[0].pageY)>4)&&Pe.data("touching",null):setTimeout(function(){Ue.removeData("longtap")},80),clearTimeout(Ue.data("tmlongtap"))},click:function(e){Ue.data("longtap")&&(e.preventDefault(),e.stopPropagation())}},Ee=function(){t.lazy(function(){var n;Le.append(qe).removeClass("elfinder-cwd-wrapper-empty elfinder-search-result elfinder-incsearch-result elfinder-letsearch-result"),(t.searchStatus.state>1||t.searchStatus.ininc)&&Le.addClass("elfinder-search-result"+(t.searchStatus.ininc?" elfinder-"+("/"===O.substr(0,1)?"let":"inc")+"search-result":"")),le.attachThumbJob&&le.attachThumbJob._abort(),Ue.data("selectable")&&Ue.selectable("disable").selectable("destroy").removeData("selectable"),t.trigger("cwdinit"),G=e();try{Ue.empty()}catch(i){Ue.html("")}we&&(Pe.off("scroll.fixheader resize.fixheader"),we.remove(),we=null),Ue.removeClass("elfinder-cwd-view-icons elfinder-cwd-view-list").addClass("elfinder-cwd-view-"+(p?"list":"icons")).attr("style","").css("height","auto"),Re.hide(),Pe[p?"addClass":"removeClass"]("elfinder-cwd-wrapper-list")._padding=parseInt(Pe.css("padding-top"))+parseInt(Pe.css("padding-bottom")),t.UA.iOS&&Pe.removeClass("overflow-scrolling-touch").addClass("overflow-scrolling-touch"),p&&(Ue.html("<table><thead/><tbody/></table>"),n=e('<tr class="ui-state-default"><td class="elfinder-cwd-view-th-name">'+t.getColumnName("name")+"</td>"+je()+"</tr>"),Ue.find("thead").hide().append(n).find("td:first").append(qe),e.fn.sortable&&n.addClass("touch-punch touch-punch-keep-default").sortable({axis:"x",distance:8,items:"> .sortable-item",start:function(t,n){e(n.item[0]).data("dragging",!0),n.placeholder.width(n.helper.removeClass("ui-state-hover").width()).removeClass("ui-state-active").addClass("ui-state-hover").css("visibility","visible")},update:function(n,i){var a,o,r=e(i.item[0]).attr("class").split(" ")[0].replace("elfinder-cwd-view-th-","");E=e.map(e(this).children(),function(t){var n=e(t).attr("class").split(" ")[0].replace("elfinder-cwd-view-th-","");return o||(r===n?o=!0:a=n),"name"===n?null:n}),N.row=R(),t.storage("cwdCols",E),a=".elfinder-col-"+a+":first",r=".elfinder-col-"+r+":first",t.lazy(function(){Ue.find("tbody tr").each(function(){var t=e(this);t.children(a).after(t.children(r))})})},stop:function(t,n){setTimeout(function(){e(n.item[0]).removeData("dragging")},100)}}),n.find("td").addClass("touch-punch").resizable({handles:"ltr"===t.direction?"e":"w",start:function(t,n){var i=Ue.find("td.elfinder-col-"+n.element.attr("class").split(" ")[0].replace("elfinder-cwd-view-th-","")+":first");n.element.data("dragging",!0).data("resizeTarget",i).data("targetWidth",i.width()),H=!0,"fixed"!==Ue.find("table").css("table-layout")&&(Ue.find("tbody tr:first td").each(function(){e(this).width(e(this).width())}),Ue.find("table").css("table-layout","fixed"))},resize:function(e,t){t.element.data("resizeTarget").width(t.element.data("targetWidth")-(t.originalSize.width-t.size.width))},stop:function(n,i){H=!1,ke({fitWidth:!0}),_={},Ue.find("tbody tr:first td").each(function(){var t=e(this).attr("class").split(" ")[0].replace("elfinder-col-","");_[t]=e(this).width()}),t.storage("cwdColWidth",_),setTimeout(function(){i.element.removeData("dragging")},100)}}).find(".ui-resizable-handle").addClass("ui-icon ui-icon-grip-dotted-vertical")),se=e.map(F||D,function(e){return t.file(e)||null}),se=t.sortFiles(se),F?F=e.map(se,function(e){return e.hash}):D=e.map(se,function(e){return e.hash}),le={renderd:0,attachTmbs:{},getTmbs:[],tmbLoading:{},lazyOpts:{tm:0}},Le[se.length<1?"addClass":"removeClass"]("elfinder-cwd-wrapper-empty"),Pe.off(pe,ye).on(pe,ye).trigger(pe),t.cwd().write?(Pe[t.isCommandEnabled("upload")?"addClass":"removeClass"]("native-droppable"),Pe.droppable(t.isCommandEnabled("paste")?"enable":"disable")):Pe.removeClass("native-droppable").droppable("disable").removeClass("ui-state-disabled")})},Ue=e(this).addClass("ui-helper-clearfix elfinder-cwd").attr("unselectable","on").on("click."+t.namespace,b,function(n){var i,a,o,r,s,l=this.id?e(this):e(this).parents("[id]:first"),c=e(n.target);if(q&&(c.is("input:checkbox."+S)||c.hasClass("elfinder-cwd-select")))return n.stopPropagation(),n.preventDefault(),l.trigger(l.hasClass(y)?h:u),oe(),void requestAnimationFrame(function(){c.prop("checked",l.hasClass(y))});if(Ue.data("longtap")||c.hasClass("elfinder-cwd-nonselect"))return void n.stopPropagation();if(U||(U=l.attr("id"),setTimeout(function(){U=""},500)),n.shiftKey&&(i=l.prevAll(ae||"."+y+":first"),a=l.nextAll(ae||"."+y+":first"),o=i.length,r=a.length),n.shiftKey&&(o||r))s=o?l.prevUntil("#"+i.attr("id")):l.nextUntil("#"+a.attr("id")),s.add(l).trigger(u);else if(n.ctrlKey||n.metaKey)l.trigger(l.hasClass(y)?h:u);else{if(Pe.data("touching")&&l.hasClass(y))return Pe.data("touching",null),void t.dblclick({file:t.cwdId2Hash(this.id)});ne({notrigger:!0}),l.trigger(u)}oe()}).on("dblclick."+t.namespace,b,function(n){if(U){var i=t.cwdId2Hash(U);n.stopPropagation(),this.id!==U&&(e(this).trigger(h),e("#"+U).trigger(u),oe()),t.dblclick({file:i})}}).on("touchstart."+t.namespace,b,function(n){if(!(n.originalEvent.touches.length>1)){var i,a=this.id?e(this):e(this).parents("[id]:first"),o=e(n.target),r=n.target.nodeName;if("INPUT"===r&&"text"===n.target.type||"TEXTAREA"===r||o.hasClass("elfinder-cwd-nonselect"))return void n.stopPropagation();if(a.find("input:text,textarea").length)return n.stopPropagation(),void n.preventDefault();Pe.data("touching",{x:n.originalEvent.touches[0].pageX,y:n.originalEvent.touches[0].pageY}),q&&(o.is("input:checkbox."+S)||o.hasClass("elfinder-cwd-select"))||(i=a.prevAll("."+y+":first").length+a.nextAll("."+y+":first").length,Ue.data("longtap",null),(Object.keys(Q).length||p&&"TD"!==n.target.nodeName||!p&&this!==n.target)&&(Ue.data("longtap",!1),a.addClass(C),a.data("tmlongtap",setTimeout(function(){Ue.data("longtap",!0),a.trigger(u),oe(),t.trigger("contextmenu",{type:"files",targets:t.selected(),x:n.originalEvent.touches[0].pageX,y:n.originalEvent.touches[0].pageY})},500))))}}).on("touchmove."+t.namespace+" touchend."+t.namespace,b,function(n){var i,a=e(n.target);if(!q||!a.is("input:checkbox."+S)&&!a.hasClass("elfinder-cwd-select")){if("INPUT"==n.target.nodeName||"TEXTAREA"==n.target.nodeName)return void n.stopPropagation();i=this.id?e(this):e(this).parents("[id]:first"),clearTimeout(i.data("tmlongtap")),"touchmove"===n.type?(Pe.data("touching",null),i.removeClass(C)):(Pe.data("touching")&&!Ue.data("longtap")&&i.hasClass(y)&&(n.preventDefault(),Pe.data("touching",null),t.dblclick({file:t.cwdId2Hash(this.id)})),setTimeout(function(){Ue.removeData("longtap")},80))}}).on("mouseenter."+t.namespace,b,function(n){if(!ue){var i=e(this),a=null;if(!(d||i.data("dragRegisted")||i.hasClass(A)||i.hasClass(x)||i.hasClass(w))){if(i.data("dragRegisted",!0),!t.isCommandEnabled("copy",t.searchStatus.state>1||i.hasClass("isroot")?t.cwdId2Hash(i.attr("id")):void 0))return;i.on("mousedown",function(n){var a=n.shiftKey||n.altKey,o=!1;a&&!t.UA.IE&&Ue.data("selectable")&&(Ue.selectable("disable").selectable("destroy").removeData("selectable"),requestAnimationFrame(function(){Ue.selectable(he).selectable("option",{disabled:!1}).selectable("refresh").data("selectable",!0)})),i.removeClass("ui-state-disabled"),a?i.draggable("option","disabled",!0).attr("draggable","true"):(i.hasClass(y)||(o=p?e(n.target).closest("span,tr").is("tr"):e(n.target).hasClass("elfinder-cwd-file")),o?i.draggable("option","disabled",!0):i.draggable("option","disabled",!1).removeAttr("draggable").draggable("option","cursorAt",{left:50-parseInt(e(n.currentTarget).css("margin-left")),top:47}))}).on("dragstart",function(n){var i=n.dataTransfer||n.originalEvent.dataTransfer||null;if(a=null,i&&!t.UA.IE){var o,r=this.id?e(this):e(this).parents("[id]:first"),s=e("<span>"),l="",c=null,d=null,p=[],h=function(n){var i,a=n.mime,o=t.tmb(n);return i='<div class="elfinder-cwd-icon elfinder-cwd-icon-drag '+t.mime2class(a)+' ui-corner-all"/>',o&&(i=e(i).addClass(o.className).css("background-image","url('"+o.url+"')").get(0).outerHTML),i},f=[];if(r.trigger(u),oe(),e.each(Q,function(n){var i=t.file(n),a=i.url;if(i&&"directory"!==i.mime){if(a){if("1"==a)return f.push(n),!0}else a=t.url(i.hash);a&&(a=t.convAbsUrl(a),p.push(n),e("<a>").attr("href",a).text(a).appendTo(s),l+=a+"\n",c||(c=i.mime+":"+i.name+":"+a),d||(d=a+"\n"+i.name))}}),f.length)return e.each(f,function(e,n){var i=t.file(n);i.url="",t.request({data:{cmd:"url",target:n},notify:{type:"url",cnt:1},preventDefault:!0}).always(function(e){i.url=e.url?e.url:"1"})}),!1;if(!l)return!1;i.setDragImage&&(a=e('<div class="elfinder-drag-helper html5-native"></div>').append(h(t.file(p[0]))).appendTo(e(document.body)),(o=p.length)>1&&a.append(h(t.file(p[o-1]))+'<span class="elfinder-drag-num">'+o+"</span>"),i.setDragImage(a.get(0),50,47)),i.effectAllowed="copyLink",i.setData("DownloadURL",c),i.setData("text/x-moz-url",d),i.setData("text/uri-list",l),i.setData("text/plain",l),i.setData("text/html",s.html()),i.setData("elfinderfrom",window.location.href+t.cwd().hash),i.setData("elfinderfrom:"+i.getData("elfinderfrom"),"")}}).on("dragend",function(e){ne({notrigger:!0}),a&&a.remove()}).draggable(t.draggable)}}}).on(u,b,function(n){var i=e(this),a=t.cwdId2Hash(i.attr("id"));J||i.hasClass(w)||(ae="#"+this.id,i.addClass(y).children().addClass(C).find("input:checkbox."+S).prop("checked",!0),Q[a]||(Q[a]=!0),G=Ue.find("[id]."+y+":last").next())}).on(h,b,function(n){var i=e(this),a=t.cwdId2Hash(i.attr("id"));J||(i.removeClass(y).children().removeClass(C).find("input:checkbox."+S).prop("checked",!1),Ue.hasClass("elfinder-cwd-allselected")&&(q&&qe.children("input").prop("checked",!1),Ue.removeClass("elfinder-cwd-allselected")),Q[a]&&delete Q[a])}).on(f,b,function(){var t=e(this).removeClass(C+" "+y).addClass(w),n=t.children(),i=p?t:n.find("div.elfinder-cwd-file-wrapper,div.elfinder-cwd-filename");n.removeClass(C+" "+y),t.hasClass(k)&&t.droppable("disable"),i.hasClass(x)&&i.draggable("disable")}).on(m,b,function(){var t=e(this).removeClass(w),n=p?t:t.children("div.elfinder-cwd-file-wrapper,div.elfinder-cwd-filename");t.hasClass(k)&&t.droppable("enable"),n.hasClass(x)&&n.draggable("enable")}).on("scrolltoview",b,function(t,n){re(e(this),!n||"undefined"==typeof n.blink||n.blink)}).on("mouseenter."+t.namespace+" mouseleave."+t.namespace,b,function(n){var i="mouseenter"===n.type;i&&(ue||t.UA.Mobile)||(t.trigger("hover",{hash:t.cwdId2Hash(e(this).attr("id")),type:n.type}),e(this).toggleClass(C,"mouseenter"==n.type))}).on("mouseenter."+t.namespace+" mouseleave."+t.namespace,".elfinder-cwd-file-wrapper,.elfinder-cwd-filename",function(t){var n="mouseenter"===t.type;n&&ue||e(this).closest(b).children(".elfinder-cwd-file-wrapper,.elfinder-cwd-filename").toggleClass(z,"mouseenter"==t.type)}).on("contextmenu."+t.namespace,function(n){var i=e(n.target).closest(b);if(i.get(0)!==n.target||Q[t.cwdId2Hash(i.get(0).id)])return i.find("input:text,textarea").length?void n.stopPropagation():void(i.length&&("TD"!=n.target.nodeName||Q[t.cwdId2Hash(i.get(0).id)])&&(n.stopPropagation(),n.preventDefault(),i.hasClass(w)||Pe.data("touching")||(i.hasClass(y)||(ne({notrigger:!0}),i.trigger(u),oe()),t.trigger("contextmenu",{type:"files",targets:t.selected(),x:n.pageX,y:n.pageY}))))}).on("click."+t.namespace,function(e){e.target!==this||Ue.data("longtap")||!e.shiftKey&&!e.ctrlKey&&!e.metaKey&&ne()}).on("create."+t.namespace,function(n,i){var a=p?Ue.find("tbody"):Ue,o=a.find(".elfinder-cwd-parent"),r=i.move||!1,s=e(X(i)).addClass(A),l=t.selected();l.length?r&&t.trigger("lockfiles",{files:l}):ne(),o.length?o.after(s):a.prepend(s),Ce(),Pe.scrollTop(0).scrollLeft(0)}).on("unselectall",ne).on("selectfile",function(e,n){t.cwdHash2Elm(n).trigger(u),oe()}).on("colwidth",function(){p&&(Ue.find("table").css("table-layout","").find("td").css("width",""),ke({fitWidth:!0}),t.storage("cwdColWidth",_=null))}).on("iconpref",function(e,t){Ue.removeClass(function(e,t){return(t.match(/\belfinder-cwd-size\S+/g)||[]).join(" ")}),s=t?parseInt(t.size)||0:0,p||(s>0&&Ue.addClass("elfinder-cwd-size"+s),le.renderd&&requestAnimationFrame(function(){Ke.icons={},le.hpi=null,De(Ue,le.renderd),me()}))}).on("onwheel"in document?"wheel":"mousewheel",function(e){var i,a,o;!p&&(e.ctrlKey&&!e.metaKey||!e.ctrlKey&&e.metaKey)&&(e.stopPropagation(),e.preventDefault(),i=Ue.data("wheelTm"),"undefined"!=typeof i?(clearTimeout(i),Ue.data("wheelTm",setTimeout(function(){Ue.removeData("wheelTm")},200))):(Ue.data("wheelTm",!1),a=s||0,o=e.originalEvent.deltaY?e.originalEvent.deltaY:-e.originalEvent.wheelDelta,o>0?s>0&&(a=s-1):s<n.iconsView.sizeMax&&(a=s+1),a!==s&&(t.storage("iconsize",a),Ue.trigger("iconpref",{size:a}))))}),Pe=e('<div class="elfinder-cwd-wrapper"/>').droppable(Object.assign({},ze,{autoDisable:!1})).on("contextmenu."+t.namespace,Fe.contextmenu).on("touchstart."+t.namespace,Fe.touchstart).on("touchmove."+t.namespace+" touchend."+t.namespace,Fe.touchend).on("click."+t.namespace,Fe.click).on("scroll."+t.namespace,function(){ue||(Ue.data("selectable")&&Ue.selectable("disable"),Pe.trigger(de)),ue=!0,le.scrtm&&cancelAnimationFrame(le.scrtm),le.scrtm&&Math.abs((le.scrolltop||0)-(le.scrolltop=this.scrollTop||e(this).scrollTop()))<5&&(le.scrtm=0,Pe.trigger(pe)),le.scrtm=requestAnimationFrame(function(){le.scrtm=0,Pe.trigger(pe)})}).on(pe,function(){ue=!1,me()}),Re=e("<div>&nbsp;</div>").css({position:"absolute",width:"1px",height:"1px"}).hide(),qe=q?e('<div class="elfinder-cwd-selectall"><input type="checkbox"/></div>').attr("title",t.i18n("selectall")).on("touchstart mousedown click",function(t){return t.stopPropagation(),t.preventDefault(),!e(this).data("pending")&&"click"!==t.type&&(qe.data("pending",!0),void(Ue.hasClass("elfinder-cwd-allselected")?(qe.find("input").prop("checked",!1),requestAnimationFrame(function(){ne()})):te()))}):e(),He=null,_e=function(t){var n=function(){if("undefined"!=typeof le.renderd){var t=0;Pe.siblings("div.elfinder-panel:visible").each(function(){t+=e(this).outerHeight(!0)}),Pe.height(Le.height()-t-Pe._padding)}};t&&n(),He&&cancelAnimationFrame(He),He=requestAnimationFrame(function(){!t&&n();var e,i;Ue.css("height","auto"),e=Pe[0].clientHeight-parseInt(Pe.css("padding-top"))-parseInt(Pe.css("padding-bottom"))-parseInt(Ue.css("margin-top")),i=Ue.outerHeight(!0),i<e&&Ue.height(e)}),p&&!H&&(t?Pe.trigger("resize.fixheader"):ke()),me()},Ne=e(this).parent().on("resize",_e),Le=Ne.children(".elfinder-workzone").append(Pe.append(this).append(Re)),We=e('<div class="elfinder-cwd-message-board"/>').insertAfter(Ue),Be=e('<div class="elfinder-cwd-expires" />'),$e=function(){var e,n,i;o&&clearTimeout(o),l&&t.volumeExpires[l]&&(n=t.volumeExpires[l]-+new Date/1e3,i=n%60+.1,e=Math.floor(n/60),Be.html(t.i18n(["minsLeft",e])).show(),e&&(o=setTimeout($e,1e3*i)))},Ke={icons:{},list:{}};t.UA.ltIE10||We.append(e('<div class="elfinder-cwd-trash" />').html(t.i18n("volume_Trash"))).append(Be),$=Object.assign($,n.replacement||{});try{_=t.storage("cwdColWidth")?t.storage("cwdColWidth"):null}catch(Ve){_=null}t.bind("columnpref",function(i){var a=i.data||{};(E=t.storage("cwdCols"))?(E=e.grep(E,function(e){return n.listView.columns.indexOf(e)!==-1}),n.listView.columns.length>E.length&&e.each(n.listView.columns,function(e,t){E.indexOf(t)===-1&&E.push(t)})):E=n.listView.columns;var o=t.storage("columnhides")||null;o&&Object.keys(o).length&&(E=e.grep(E,function(e){return!o[e]})),N.row=R(),p&&a.repaint&&Ee()}).trigger("columnpref"),d&&e("body").on("touchstart touchmove touchend",function(e){}),q&&Ue.addClass("elfinder-has-checkbox"),e(window).on("scroll."+t.namespace,function(){c&&cancelAnimationFrame(c),c=requestAnimationFrame(function(){Pe.trigger(pe)})}),e(document).on("keydown."+t.namespace,function(n){n.keyCode==e.ui.keyCode.ESCAPE&&(t.getUI().find(".ui-widget:visible").length||ne())}),t.one("init",function(){var n,i,a,o,s=document.createElement("style"),l=0;document.head&&(document.head.appendChild(s),n=s.sheet,n.insertRule('.elfinder-cwd-wrapper-empty .elfinder-cwd:not(.elfinder-table-header-sticky):after{ content:"'+t.i18n("emptyFolder")+'" }',l++),n.insertRule('.elfinder-cwd-wrapper-empty .native-droppable .elfinder-cwd:not(.elfinder-table-header-sticky):after{ content:"'+t.i18n("emptyFolder"+(d?"LTap":"Drop"))+'" }',l++),n.insertRule('.elfinder-cwd-wrapper-empty .ui-droppable-disabled .elfinder-cwd:not(.elfinder-table-header-sticky):after{ content:"'+t.i18n("emptyFolder")+'" }',l++),n.insertRule('.elfinder-cwd-wrapper-empty.elfinder-search-result .elfinder-cwd:not(.elfinder-table-header-sticky):after{ content:"'+t.i18n("emptySearch")+'" }',l++),n.insertRule('.elfinder-cwd-wrapper-empty.elfinder-search-result.elfinder-incsearch-result .elfinder-cwd:not(.elfinder-table-header-sticky):after{ content:"'+t.i18n("emptyIncSearch")+'" }',l++),n.insertRule('.elfinder-cwd-wrapper-empty.elfinder-search-result.elfinder-letsearch-result .elfinder-cwd:not(.elfinder-table-header-sticky):after{ content:"'+t.i18n("emptyLetSearch")+'" }',l++)),(o=t.storage("iconsize")||0)&&Ue.trigger("iconpref",{size:o}),d||(t.one("open",function(){n&&t.zIndex&&n.insertRule(".ui-selectable-helper{z-index:"+t.zIndex+";}",l++)}),a=e('<div style="position:absolute"/>'),i=t.getUI(),i.on("resize",function(e,t){var n;e.preventDefault(),e.stopPropagation(),t&&t.fullscreen&&(n=i.offset(),"on"===t.fullscreen?(a.css({top:n.top*-1,left:n.left*-1}).appendTo(i),he.appendTo=a):(a.detach(),he.appendTo="body"),Ue.data("selectable")&&Ue.selectable("option",{appendTo:he.appendTo}))})),r=t.getUI("tree").length}).bind("enable",function(){_e()}).bind("request.open",function(){le.getTmbs=[]}).one("open",function(){t.maxTargets&&(I=Math.min(t.maxTargets,I))}).bind("open add remove searchend",function(){var n=t.cwd().hash,i=this.type;if(("open"===i||"searchend"===i||t.searchStatus.state<2)&&(D=e.map(t.files(n),function(e){return e.hash}),t.trigger("cwdhasheschange",D)),"open"===i){var a=function(){var n=!1;return e.each(M,function(e,i){if(t.trashes[i])return n=!0,!1}),n},o=n&&(!t.file(n)||r)?r?function(){var n=e.Deferred();return t.one("treesync",function(e){e.data.always(function(){n.resolve()})}),n}():t.request({data:{cmd:"parents",target:t.cwd().hash},preventFail:!0}):null,s=t.cwd();s.volumeid!==l&&(Be.empty().hide(),l&&Pe.removeClass("elfinder-cwd-wrapper-"+l),l=s.volumeid,$e(),Pe.addClass("elfinder-cwd-wrapper-"+l)),e.when(o).done(function(){M=t.parents(s.hash),Pe[a()?"addClass":"removeClass"]("elfinder-cwd-wrapper-trash")}),F=void 0,ne({notrigger:!0}),Ee()}}).bind("search",function(n){D=e.map(n.data.files,function(e){return e.hash}),t.trigger("cwdhasheschange",D),F=void 0,t.searchStatus.ininc=!1,Ee(),t.autoSync("stop")}).bind("searchend",function(e){(O||F)&&(O="",F?t.trigger("incsearchend",e.data):e.data&&e.data.noupdate||Ee()),t.autoSync()}).bind("searchstart",function(e){ne(),O=e.data.query}).bind("incsearchstart",function(n){Q={},t.lazy(function(){var i,a,o="";a=O=n.data.query||"",a?("/"===a.substr(0,1)&&(a=a.substr(1),o="^"),i=new RegExp(o+a.replace(/([\\*\;\.\?\[\]\{\}\(\)\^\$\-\|])/g,"\\$1"),"i"),F=e.grep(D,function(e){var n=t.file(e);return!(!n||!(n.name.match(i)||n.i18&&n.i18.match(i)))}),t.trigger("incsearch",{hashes:F,query:a}).searchStatus.ininc=!0,Ee(),t.autoSync("stop")):t.trigger("incsearchend")})}).bind("incsearchend",function(e){O="",t.searchStatus.ininc=!1,F=void 0,e.data&&e.data.noupdate||Ee(),t.autoSync()}).bind("sortchange",function(){var e=Pe.scrollLeft(),n=Ue.hasClass("elfinder-cwd-allselected");Ee(),t.one("cwdrender",function(){Pe.scrollLeft(e),n&&(Q=t.arrayFlip(F||D,!0)),(n||Object.keys(Q).length)&&oe()})}).bind("viewchange",function(){var e="list"==t.storage("view"),n=Ue.hasClass("elfinder-cwd-allselected");e!=p&&(p=e,t.viewType=p?"list":"icons",s&&t.one("cwdinit",function(){Ue.trigger("iconpref",{size:s})}),Ee(),_e(),n&&(Ue.addClass("elfinder-cwd-allselected"),qe.find("input").prop("checked",!0)),Object.keys(Q).length&&oe())}).bind("wzresize",function(){var e,n=p?Ue.find("tbody"):Ue;_e(!0),le.hpi&&De(n,n.find("[id]").length),e=Ue.offset(),Le.data("rectangle",Object.assign({width:Le.width(),height:Le.height(),cwdEdge:"ltr"===t.direction?e.left:e.left+Ue.width()},Le.offset())),le.itemH=(p?n.find("tr:first"):n.find("[id]:first")).outerHeight(!0)}).bind("changeclipboard",function(t){j={},t.data&&t.data.clipboard&&t.data.clipboard.length&&e.each(t.data.clipboard,function(e,t){t.cut&&(j[t.hash]=!0)})}).bind("resMixinMake",function(){Ce()}).bind("tmbreload",function(t){var n={},i=t.data&&t.data.files?t.data.files:null;e.each(i,function(e,t){t.tmb&&"1"!=t.tmb&&(n[t.hash]=t.tmb)}),Object.keys(n).length&&Ae(n,!0)}).add(function(n){var i=O?new RegExp(O.replace(/([\\*\;\.\?\[\]\{\}\(\)\^\$\-\|])/g,"\\$1"),"i"):null,a=t.searchStatus.mime,o=t.searchStatus.state>1,r=o&&t.searchStatus.target?t.searchStatus.target:t.cwd().hash,s=t.path(r),l=function(n){var l,c;return l=n.phash===r,!l&&o&&(c=n.path||t.path(n.hash),l=s&&0===c.indexOf(s),!l&&t.searchStatus.mixed&&(l=!!e.grep(t.searchStatus.mixed,function(e){return 0===n.hash.indexOf(e)}).length)),l&&o&&(l=a?0===n.mime.indexOf(a):!!(n.name.match(i)||n.i18&&n.i18.match(i))),l},c=e.grep(n.data.added||[],function(e){return!!l(e)});Ie(c),2===t.searchStatus.state&&(e.each(c,function(t,n){e.inArray(n.hash,D)===-1&&D.push(n.hash)}),t.trigger("cwdhasheschange",D)),p&&_e(),Pe.trigger(pe)}).change(function(n){var i,a=t.cwd().hash,o=t.selected();O?e.each(n.data.changed||[],function(n,a){t.cwdHash2Elm(a.hash).length&&(Oe([a.hash]),Ie([a],"change"),e.inArray(a.hash,o)!==-1&&Z(a.hash),i=!0)}):e.each(e.grep(n.data.changed||[],function(e){return e.phash==a}),function(n,a){t.cwdHash2Elm(a.hash).length&&(Oe([a.hash]),Ie([a],"change"),e.inArray(a.hash,o)!==-1&&Z(a.hash),i=!0)}),i&&(t.trigger("cwdhasheschange",D),p&&_e(),Pe.trigger(pe)),oe()}).remove(function(e){var t=p?Ue.find("tbody"):Ue;Oe(e.data.removed||[]),oe(),se.length<1&&t.children(b).length<1?(Le.addClass("elfinder-cwd-wrapper-empty"),q&&qe.find("input").prop("checked",!1),Re.hide(),Pe.off(pe,ye),_e()):(De(t),Pe.trigger(pe))}).dragstart(function(t){var n=e(t.data.target),i=t.data.originalEvent;n.hasClass(v)&&(n.hasClass(y)||(!(i.ctrlKey||i.metaKey||i.shiftKey)&&ne({notrigger:!0}),n.trigger(u),oe())),Ue.removeClass(w).data("selectable")&&Ue.selectable("disable"),J=!0}).dragstop(function(){Ue.data("selectable")&&Ue.selectable("enable"),J=!1}).bind("lockfiles unlockfiles selectfiles unselectfiles",function(n){var i,a,o,r={lockfiles:f,unlockfiles:m,selectfiles:u,unselectfiles:h},s=r[n.type],l=n.data.files||[],c=l.length,d=n.data.helper||e();if(c>0&&(i=t.parents(l[0])),s!==u&&s!==h||(o=s===u,e.each(l,function(e,t){var n=Ue.hasClass("elfinder-cwd-allselected");Q[t]?(n&&(q&&qe.children("input").prop("checked",!1),Ue.removeClass("elfinder-cwd-allselected"),n=!1),!o&&delete Q[t]):o&&(Q[t]=!0)})),!d.data("locked")){for(;c--;)try{t.cwdHash2Elm(l[c]).trigger(s)}catch(n){}!n.data.inselect&&oe()}Pe.data("dropover")&&i.indexOf(Pe.data("dropover"))!==-1&&(a="lockfiles"!==n.type,d.toggleClass("elfinder-drag-helper-plus",a),Pe.toggleClass(T,a))}).bind("mkdir mkfile duplicate upload rename archive extract paste multiupload",function(n){if("upload"!=n.type||!n.data._multiupload){var i=t.cwd().hash;ne({notrigger:!0}),e.each((n.data.added||[]).concat(n.data.changed||[]),function(e,t){t&&t.phash==i&&Z(t.hash)}),oe()}}).shortcut({pattern:"ctrl+a",description:"selectall",callback:te}).shortcut({pattern:"ctrl+shift+i",description:"selectinvert",callback:ie}).shortcut({pattern:"left right up down shift+left shift+right shift+up shift+down",description:"selectfiles",type:"keydown",callback:function(e){Y(e.keyCode,e.shiftKey)}}).shortcut({pattern:"home",description:"selectffile",callback:function(e){ne({notrigger:!0}),re(Ue.find("[id]:first").trigger(u)),oe()}}).shortcut({pattern:"end",description:"selectlfile",callback:function(e){ne({notrigger:!0}),re(Ue.find("[id]:last").trigger(u)),oe()}}).shortcut({pattern:"page_up",description:"pageTurning",callback:function(e){le.itemH&&Pe.scrollTop(Math.round(Pe.scrollTop()-Math.floor((Pe.height()+(p?le.itemH*-1:16))/le.itemH)*le.itemH))}}).shortcut({pattern:"page_down",description:"pageTurning",callback:function(e){le.itemH&&Pe.scrollTop(Math.round(Pe.scrollTop()+Math.floor((Pe.height()+(p?le.itemH*-1:16))/le.itemH)*le.itemH))}})}),this},e.fn.elfinderdialog=function(t,n){var i,a,o,r,s=window.navigator.platform.indexOf("Win")!=-1,l={},c={enabled:!1,width:!1,height:!1,defaultSize:null},d=function(t){var i,a;c.enabled&&(a=n.options.dialogContained?o:e(window),i={maxWidth:c.width?a.width()-l.width:null,maxHeight:c.height?a.height()-l.height:null},Object.assign(r,i),t.css(i).trigger("resize"),t.data("hasResizable")&&(t.resizable("option","maxWidth")<i.maxWidth||t.resizable("option","maxHeight")<i.maxHeight)&&t.resizable("option",i))},p=function(e){var t=e.data;i&&cancelAnimationFrame(i),i=requestAnimationFrame(function(){c.enabled&&d(t)})},u=function(){var e="elfinder-dialog",t=o.children("."+e+"."+n.res("class","editing")+":visible");n[t.length?"disable":"enable"]()},h={};return n&&n.ui?o=n.getUI():(o=this.closest(".elfinder"),n||(n=o.elfinder("instance"))),"string"==typeof t?((a=this.closest(".ui-dialog")).length&&("open"===t?"none"===a.css("display")&&(a.trigger("posinit").show().trigger("open").hide(),a.fadeIn(120,function(){n.trigger("dialogopened",{dialog:a})})):"close"===t||"destroy"===t?(a.stop(!0),(a.is(":visible")||o.is(":hidden"))&&(a.trigger("close"),n.trigger("dialogclosed",{dialog:a})),"destroy"===t&&(a.remove(),n.trigger("dialogremoved",{dialog:a}))):"toTop"===t?(a.trigger("totop"),n.trigger("dialogtotoped",{dialog:a})):"posInit"===t?(a.trigger("posinit"),n.trigger("dialogposinited",{dialog:a})):"tabstopsInit"===t?(a.trigger("tabstopsInit"),n.trigger("dialogtabstopsinited",{dialog:a})):"checkEditing"===t&&u()),this):(t=Object.assign({},e.fn.elfinderdialog.defaults,t),t.allowMinimize&&"auto"===t.allowMinimize&&(t.allowMinimize=!!this.find("textarea,input").length),t.openMaximized=t.allowMinimize&&t.openMaximized,t.headerBtnPos&&"auto"===t.headerBtnPos&&(t.headerBtnPos=s?"right":"left"),t.headerBtnOrder&&"auto"===t.headerBtnOrder&&(t.headerBtnOrder=s?"close:maximize:minimize":"close:minimize:maximize"),t.modal&&t.allowMinimize&&(t.allowMinimize=!1),n.options.dialogContained?c.width=c.height=c.enabled=!0:(c.width="window"===t.maxWidth,
c.height="window"===t.maxHeight,(c.width||c.height)&&(c.enabled=!0)),h=n.arrayFlip(t.propagationEvents,!0),this.filter(":not(.ui-dialog-content)").each(function(){var i,a,f=e(this).addClass("ui-dialog-content ui-widget-content"),m="elfinder-dialog-active",g="elfinder-dialog",v="elfinder-dialog-notify",b="ui-state-hover",y="elfinder-tabstop",w="elfinder-focus",x="elfinder-dialog-modal",k=parseInt(1e6*Math.random()),C=e('<div class="ui-dialog-titlebar ui-widget-header ui-corner-top ui-helper-clearfix"><span class="elfinder-dialog-title">'+t.title+"</span></div>"),z=e('<div class="ui-dialog-buttonset"/>'),T=e('<div class=" ui-helper-clearfix ui-dialog-buttonpane ui-widget-content"/>').append(z),A=0,S=0,I=e(),O=e('<div style="width:100%;height:100%;position:absolute;top:0px;left:0px;"/>').hide(),j=function(){t.optimizeNumber&&P.find("input[type=number]").each(function(){e(this).attr("inputmode","numeric"),e(this).attr("pattern","[0-9]*")})},M=function(){I=P.find("."+y),I.length&&(I.attr("tabindex","-1"),I.filter("."+w).length||z.children("."+y+":"+(s?"first":"last")).addClass(w))},D=function(t){var n=I.filter(":visible:enabled"),i=t?null:n.filter("."+w+":first");return i&&i.length||(i=n.first()),t&&e.each(n,function(e,a){if(a===t&&n[e+1])return i=n.eq(e+1),!1}),i},F=function(t){var n=I.filter(":visible:enabled"),i=n.last();return e.each(n,function(e,a){if(a===t&&n[e-1])return i=n.eq(e-1),!1}),i},E=function(){e.each(t.headerBtnOrder.split(":").reverse(),function(e,t){U[t]&&U[t]()}),s&&C.children(".elfinder-titlebar-button").addClass("elfinder-titlebar-button-right")},U={close:function(){C.prepend(e('<span class="ui-widget-header ui-dialog-titlebar-close ui-corner-all elfinder-titlebar-button"><span class="ui-icon ui-icon-closethick"/></span>').on("mousedown",function(e){e.preventDefault(),e.stopPropagation(),f.elfinderdialog("close")}))},maximize:function(){t.allowMaximize&&(P.on("resize",function(e,t){var n,i;if(e.preventDefault(),e.stopPropagation(),t&&t.maximize){if(i=C.find(".elfinder-titlebar-full"),n="on"===t.maximize,i.children("span.ui-icon").toggleClass("ui-icon-plusthick",!n).toggleClass("ui-icon-arrowreturnthick-1-s",n),n){try{P.hasClass("ui-draggable")&&P.draggable("disable"),P.hasClass("ui-resizable")&&P.resizable("disable")}catch(e){}f.css("width","100%").css("height",P.height()-P.children(".ui-dialog-titlebar").outerHeight(!0)-T.outerHeight(!0))}else{f.attr("style",i.data("style")),i.removeData("style"),R();try{P.hasClass("ui-draggable")&&P.draggable("enable"),P.hasClass("ui-resizable")&&P.resizable("enable")}catch(e){}}P.trigger("resize",{init:!0})}}),C.prepend(e('<span class="ui-widget-header ui-corner-all elfinder-titlebar-button elfinder-titlebar-full"><span class="ui-icon ui-icon-plusthick"/></span>').on("mousedown",function(i){var a=e(this);i.preventDefault(),i.stopPropagation(),P.hasClass("elfinder-maximized")||"undefined"!=typeof a.data("style")||(f.height(f.height()),a.data("style",f.attr("style")||"")),n.toggleMaximize(P),"function"==typeof t.maximize&&t.maximize.call(f[0])})))},minimize:function(){var i,a,o;t.allowMinimize&&(i=e('<span class="ui-widget-header ui-corner-all elfinder-titlebar-button elfinder-titlebar-minimize"><span class="ui-icon ui-icon-minusthick"/></span>').on("mousedown",function(i){var r=e(this),s=n.getUI("bottomtray"),l={width:70,height:24},c=e("<div/>").css(l).addClass(P.get(0).className+" elfinder-dialog-minimized"),d={};i.preventDefault(),i.stopPropagation(),P.data("minimized")?(P.removeData("minimized").before(a.css(Object.assign({position:"absolute"},a.offset()))),n.toFront(a),a.animate(Object.assign({width:P.width(),height:P.height()},o),function(){P.show(),n.toFront(P),a.remove(),R(),u(),P.trigger("resize",{init:!0}),"function"==typeof t.minimize&&t.minimize.call(f[0])})):(o=P.data("minimized",!0).position(),a=P.clone().on("mousedown",function(){r.trigger("mousedown")}).removeClass("ui-draggable ui-resizable elfinder-frontmost"),s.append(c),Object.assign(d,c.offset(),l),c.remove(),a.height(P.height()).children(".ui-dialog-content:first").empty(),n.toHide(P.before(a)),a.children(".ui-dialog-content:first,.ui-dialog-buttonpane,.ui-resizable-handle").remove(),a.find(".elfinder-titlebar-minimize,.elfinder-titlebar-full").remove(),a.find(".ui-dialog-titlebar-close").on("mousedown",function(e){e.stopPropagation(),e.preventDefault(),a.remove(),P.show(),f.elfinderdialog("close")}),a.animate(d,function(){a.attr("style","").css({maxWidth:P.width()}).addClass("elfinder-dialog-minimized").appendTo(s),u(),"function"==typeof t.minimize&&t.minimize.call(f[0])}))}),C.on("dblclick",function(t){e(this).children(".elfinder-titlebar-minimize").trigger("mousedown")}).prepend(i),P.on("togleminimize",function(){i.trigger("mousedown")}))}},P=e('<div class="ui-front ui-dialog ui-widget ui-widget-content ui-corner-all ui-draggable std42-dialog touch-punch '+g+" "+t.cssClass+'"/>').hide().append(f).appendTo(o).draggable({containment:n.options.dialogContained?o:null,handle:".ui-dialog-titlebar",start:function(){O.show()},drag:function(e,t){var i=t.offset.top,a=t.offset.left;i<0&&(t.position.top=t.position.top-i),a<0&&(t.position.left=t.position.left-a),n.options.dialogContained&&(t.position.top<0&&(t.position.top=0),t.position.left<0&&(t.position.left=0))},stop:function(e,n){O.hide(),P.css({height:t.height}),f.data("draged",!0)}}).css({width:t.width,height:t.height,minWidth:t.minWidth,minHeight:t.minHeight,maxWidth:t.maxWidth,maxHeight:t.maxHeight}).on("touchstart touchmove touchend click dblclick mouseup mouseenter mouseleave mouseout mouseover mousemove",function(e){!h[e.type]&&e.stopPropagation()}).on("mousedown",function(t){!h[t.type]&&t.stopPropagation(),requestAnimationFrame(function(){P.is(":visible")&&!P.hasClass("elfinder-frontmost")&&(a=e(":focus"),a.length||(a=void 0),P.trigger("totop"))})}).on("open",function(){P.data("margin-y",f.outerHeight(!0)-f.height()),c.enabled&&(t.height&&"auto"!==t.height&&P.trigger("resize",{init:!0}),c.defaultSize||(c.defaultSize={width:f.width(),height:f.height()}),d(P),P.trigger("resize").trigger("posinit"),o.on("resize."+n.namespace,P,p)),P.hasClass(v)||o.children("."+g+":visible:not(."+v+")").each(function(){var t=e(this),n=parseInt(t.css("top")),i=parseInt(t.css("left")),a=parseInt(P.css("top")),o=parseInt(P.css("left")),r=Math.abs(n-a)<10,s=Math.abs(i-o)<10;t[0]!=P[0]&&(r||s)&&P.css({top:r?n+10:a,left:s?i+10:o})}),P.data("modal")&&(P.addClass(x),n.getUI("overlay").elfinderoverlay("show")),P.trigger("totop"),t.openMaximized&&n.toggleMaximize(P),n.trigger("dialogopen",{dialog:P}),"function"==typeof t.open&&e.proxy(t.open,f[0])(),t.closeOnEscape&&e(document).on("keydown."+k,function(t){t.keyCode==e.ui.keyCode.ESCAPE&&P.hasClass("elfinder-frontmost")&&f.elfinderdialog("close")}),P.hasClass(n.res("class","editing"))&&u()}).on("close",function(i){var a,r;t.beforeclose&&"function"==typeof t.beforeclose?(r=t.beforeclose(),r&&r.promise||(r=r?e.Deferred().resolve():e.Deferred().reject())):r=e.Deferred().resolve(),r.done(function(){c.enabled&&o.off("resize."+n.namespace,p),t.closeOnEscape&&e(document).off("keyup."+k),t.allowMaximize&&n.toggleMaximize(P,!1),n.toHide(P),P.data("modal")&&n.getUI("overlay").elfinderoverlay("hide"),"function"==typeof t.close&&e.proxy(t.close,f[0])(),t.destroyOnClose&&P.parent().length&&P.hide().remove(),a=o.children("."+g+":visible"),P.hasClass(n.res("class","editing"))&&u()})}).on("totop frontmost",function(){var e=n.storage("autoFocusDialog");P.data("focusOnMouseOver",e?e>0:n.options.uiOptions.dialog.focusOnMouseOver),P.data("minimized")&&C.children(".elfinder-titlebar-minimize").trigger("mousedown"),!P.data("modal")&&n.getUI("overlay").is(":visible")?n.getUI("overlay").before(P):n.toFront(P),o.children("."+g+":not(."+x+")").removeClass(m),P.addClass(m),!n.UA.Mobile&&(a||D()).trigger("focus"),a=void 0}).on("posinit",function(){var i,a,s,l,c,d,p,u=t.position;if(!P.hasClass("elfinder-maximized")){if(!u&&!P.data("resizing")){if(p=o.hasClass("elfinder-fullscreen"),P.css(p?{maxWidth:"100%",maxHeight:"100%",overflow:"auto"}:r),n.UA.Mobile&&!p&&P.data("rotated")===n.UA.Rotated)return;P.data("rotated",n.UA.Rotated),c=e(window),i=o.offset(),l={width:P.outerWidth(!0),height:P.outerHeight(!0)},l.right=i.left+l.width,l.bottom=i.top+l.height,d={scrLeft:c.scrollLeft(),scrTop:c.scrollTop(),width:c.width(),height:c.height()},d.right=d.scrLeft+d.width,d.bottom=d.scrTop+d.height,n.options.dialogContained||p?(a=0,s=0):(a=i.top*-1+d.scrTop,s=i.left*-1+d.scrLeft),u={top:l.height>=d.height?a:Math.max(a,parseInt((o.height()-l.height)/2-42)),left:l.width>=d.width?s:Math.max(s,parseInt((o.width()-l.width)/2))},l.right+u.left>d.right&&(u.left=Math.max(s,d.right-l.right)),l.bottom+u.top>d.bottom&&(u.top=Math.max(a,d.bottom-l.bottom))}t.absolute&&(u.position="absolute"),u&&P.css(u)}}).on("resize",function(n,i){var a,o,r=0,s=i&&i.init;i&&(i.minimize||i.maxmize)||P.data("minimized")||(n.stopPropagation(),n.preventDefault(),P.children(".ui-widget-header,.ui-dialog-buttonpane").each(function(){r+=e(this).outerHeight(!0)}),a=s||!c.enabled||n.originalEvent||P.hasClass("elfinder-maximized")?P.height()-r-P.data("margin-y"):Math.min(c.defaultSize.height,Math.max(parseInt(P.css("max-height")),parseInt(P.css("min-height")))-r-P.data("margin-y")),f.height(a),s||(R(),o=f.height(),o=a<o?o+r+P.data("margin-y"):t.minHeight,P.css("min-height",o),P.data("hasResizable")&&P.resizable("option",{minHeight:o}),"function"==typeof t.resize&&e.proxy(t.resize,f[0])(n,i)))}).on("tabstopsInit",M).on("focus","."+y,function(){e(this).addClass(b).parent("label").addClass(b),this.id&&e(this).parent().find("label[for="+this.id+"]").addClass(b)}).on("click","select."+y,function(){var t=e(this);t.data("keepFocus")?t.removeData("keepFocus"):t.data("keepFocus",!0)}).on("blur","."+y,function(){e(this).removeClass(b).removeData("keepFocus").parent("label").removeClass(b),this.id&&e(this).parent().find("label[for="+this.id+"]").removeClass(b)}).on("mouseenter mouseleave","."+y+",label",function(n){var i,a=e(this);("LABEL"!==this.nodeName||a.children("."+y).length||(i=a.attr("for"))&&e("#"+i).hasClass(y))&&(t.btnHoverFocus&&P.data("focusOnMouseOver")?"mouseenter"!==n.type||e(":focus").data("keepFocus")||a.trigger("focus"):a.toggleClass(b,"mouseenter"==n.type))}).on("keydown","."+y,function(t){var n,i,a=e(this);if(a.is(":focus")){if(n=t.keyCode===e.ui.keyCode.ESCAPE,t.keyCode===e.ui.keyCode.ENTER?(t.preventDefault(),a.trigger("click")):t.keyCode===e.ui.keyCode.TAB&&t.shiftKey||t.keyCode===e.ui.keyCode.LEFT||t.keyCode==e.ui.keyCode.UP?i="prev":t.keyCode!==e.ui.keyCode.TAB&&t.keyCode!=e.ui.keyCode.RIGHT&&t.keyCode!=e.ui.keyCode.DOWN||(i="next"),i&&(a.is("textarea")&&!t.ctrlKey&&!t.metaKey||a.is("select,span.ui-slider-handle")&&t.keyCode!==e.ui.keyCode.TAB||a.is("input:not(:checkbox,:radio)")&&!t.ctrlKey&&!t.metaKey&&t.keyCode===e.ui.keyCode["prev"===i?"LEFT":"RIGHT"]))return void t.stopPropagation();n?a.is("input:not(:checkbox,:radio),textarea")&&""!==a.val()&&(a.val(""),t.stopPropagation()):t.stopPropagation(),i&&(t.preventDefault(),("prev"===i?F:D)(this).trigger("focus"))}}).data({modal:t.modal}),R=function(){var e,t=n.getUI();t.hasClass("elfinder-fullscreen")&&(e=P.position(),P.css("top",Math.max(Math.min(Math.max(e.top,0),t.height()-100),0)),P.css("left",Math.max(Math.min(Math.max(e.left,0),t.width()-200),0)))};P.prepend(C),E(),e.each(t.buttons,function(t,n){var i=e('<button type="button" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only elfinder-btncnt-'+S++ +" "+y+'"><span class="ui-button-text">'+t+"</span></button>").on("click",e.proxy(n,f[0]));n._cssClass&&i.addClass(n._cssClass),s?z.append(i):z.prepend(i)}),z.children().length&&(P.append(T),P.show(),T.find("button").each(function(t,n){A+=e(n).outerWidth(!0)}),P.hide(),A+=20,P.width()<A&&P.width(A)),P.append(O),c.enabled&&(l.width=P.outerWidth(!0)-P.width()+(P.outerWidth()-P.width())/2,l.height=P.outerHeight(!0)-P.height()+(P.outerHeight()-P.height())/2),n.options.dialogContained&&(i={maxWidth:o.width()-l.width,maxHeight:o.height()-l.height},t.maxWidth=t.maxWidth?Math.min(i.maxWidth,t.maxWidth):i.maxWidth,t.maxHeight=t.maxHeight?Math.min(i.maxHeight,t.maxHeight):i.maxHeight,P.css(i)),r={maxWidth:P.css("max-width"),maxHeight:P.css("max-height"),overflow:P.css("overflow")},t.resizable&&P.resizable({minWidth:t.minWidth,minHeight:t.minHeight,maxWidth:t.maxWidth,maxHeight:t.maxHeight,start:function(){O.show(),P.data("resizing")!==!0&&P.data("resizing")&&clearTimeout(P.data("resizing")),P.data("resizing",!0)},stop:function(e,t){O.hide(),P.data("resizing",setTimeout(function(){P.data("resizing",!1)},200)),c.enabled&&(c.defaultSize={width:f.width(),height:f.height()})}}).data("hasResizable",!0),j(),M(),"function"==typeof t.create&&e.proxy(t.create,this)(),t.autoOpen&&(t.open?requestAnimationFrame(function(){f.elfinderdialog("open")}):f.elfinderdialog("open")),t.resize&&n.bind("themechange",function(){setTimeout(function(){P.data("margin-y",f.outerHeight(!0)-f.height()),P.trigger("resize",{init:!0})},300)})}),this)},e.fn.elfinderdialog.defaults={cssClass:"",title:"",modal:!1,resizable:!0,autoOpen:!0,closeOnEscape:!0,destroyOnClose:!1,buttons:{},btnHoverFocus:!0,position:null,absolute:!1,width:320,height:"auto",minWidth:200,minHeight:70,maxWidth:null,maxHeight:null,allowMinimize:"auto",allowMaximize:!1,openMaximized:!1,headerBtnPos:"auto",headerBtnOrder:"auto",optimizeNumber:!0,propagationEvents:["mousemove","mouseup"]},e.fn.elfinderfullscreenbutton=function(t){return this.each(function(){var n,i=e(this).elfinderbutton(t),a=i.children(".elfinder-button-icon");t.change(function(){n&&cancelAnimationFrame(n),n=requestAnimationFrame(function(){var e=t.value;a.addClass("elfinder-button-icon-fullscreen").toggleClass("elfinder-button-icon-unfullscreen",e),t.className=e?"unfullscreen":""})})})},e.fn.elfindernavbar=function(t,n){return this.not(".elfinder-navbar").each(function(){var i,a,o,r,s,l,c,d=e(this).hide().addClass("ui-state-default elfinder-navbar"),p=d.css("overflow","hidden").parent(),u=p.children(".elfinder-workzone").append(d),h="ltr"==t.direction,f=function(){var e=t.getUI("cwd"),n=t.getUI("workzone"),i=n.data("rectangle"),a=e.offset();n.data("rectangle",Object.assign(i,{cwdEdge:"ltr"===t.direction?a.left:a.left+e.width()}))},m=function(){d.css("overflow","hidden"),i=Math.round(d.outerHeight()-d.height()),a=Math.round(c.outerWidth()-c.innerWidth()),d.css("overflow","auto")};t.one("init",function(){c=t.getUI("navdock");var e=function(){m(),t.bind("wzresize",function(){var e=0;c.width(d.outerWidth()-a),c.children().length>1&&(e=c.outerHeight(!0)),d.height(u.height()-e-i)}).trigger("wzresize")};t.cssloaded?e():t.one("cssloaded",e)}).one("opendone",function(){o&&o.trigger("resize"),d.css("overflow","auto")}).bind("themechange",m),t.UA.Touch&&(s=t.storage("autoHide")||{},"undefined"==typeof s.navbar&&(s.navbar=n.autoHideUA&&n.autoHideUA.length>0&&e.grep(n.autoHideUA,function(e){return!!t.UA[e]}).length,t.storage("autoHide",s)),s.navbar&&t.one("init",function(){d.children().length&&t.uiAutoHide.push(function(){d.stop(!0,!0).trigger("navhide",{duration:"slow",init:!0})})}),t.bind("load",function(){d.children().length&&(r=e('<div class="elfinder-navbar-swipe-handle"/>').hide().appendTo(u),"none"!==r.css("pointer-events")&&(r.remove(),r=null))}),d.on("navshow navhide",function(e,n){var i="navshow"===e.type?"show":"hide",a=n&&n.duration?n.duration:"fast",o=n&&n.handleW?n.handleW:Math.max(50,t.getUI().width()/10);d.stop(!0,!0)[i]({duration:a,step:function(){t.trigger("wzresize")},complete:function(){r&&("show"===i?r.stop(!0,!0).hide():(r.width(o?o:""),t.resources.blink(r,"slowonce"))),t.trigger("navbar"+i),n.init&&t.trigger("uiautohide"),f()}}),s.navbar="show"!==i,t.storage("autoHide",Object.assign(t.storage("autoHide"),{navbar:s.navbar}))}).on("touchstart",function(n){e(this)["scroll"+("ltr"===t.direction?"Right":"Left")]()>5&&(n.originalEvent._preventSwipeX=!0)})),t.UA.Mobile||(o=d.resizable({handles:h?"e":"w",minWidth:n.minWidth||150,maxWidth:n.maxWidth||500,resize:function(){t.trigger("wzresize")},stop:function(e,n){t.storage("navbarWidth",n.size.width),f()}}).on("resize scroll",function(n){var i=e(this),a=i.data("posinit");n.preventDefault(),n.stopPropagation(),h||"resize"!==n.type||d.css("left",0),a&&cancelAnimationFrame(a),i.data("posinit",requestAnimationFrame(function(){var e=t.UA.Opera&&d.scrollLeft()?20:2;o.css("top",0).css({top:parseInt(d.scrollTop())+"px",left:h?"auto":parseInt(d.scrollRight()-e)*-1,right:h?parseInt(d.scrollLeft()-e)*-1:"auto"}),"resize"===n.type&&t.getUI("cwd").trigger("resize")}))}).children(".ui-resizable-handle").addClass("ui-front")),(l=t.storage("navbarWidth"))?d.width(l):t.UA.Mobile&&t.one("cssloaded",function(){var n=function(){l=d.parent().width()/2,d.data("defWidth")>l?d.width(l):d.width(d.data("defWidth")),d.data("width",d.width()),t.trigger("wzresize")};d.data("defWidth",d.width()),e(window).on("resize."+t.namespace,n),n()})}),this},e.fn.elfindernavdock=function(t,n){return this.not(".elfinder-navdock").each(function(){var i,a,o=e(this).hide().addClass("ui-state-default elfinder-navdock touch-punch"),r=o.parent(),s=(r.children(".elfinder-workzone").append(o),function(n,i){var a,r=i||o.height(),s=n-r,l=Object.keys(c).length,d=l?s/l:0;s&&(a=o.css("overflow"),o.css("overflow","hidden"),o.height(n),e.each(c,function(e,n){n.height(n.height()+d).trigger("resize."+t.namespace)}),t.trigger("wzresize"),o.css("overflow",a))}),l=e('<div class="ui-front ui-resizable-handle ui-resizable-n"/>').appendTo(o),c={},d=(parseInt(n.initMaxHeight)||50)/100,p=(parseInt(n.maxHeight)||90)/100;o.data("addNode",function(e,n){var r,u,h,f=t.getUI("workzone").height(),m=f*d;return n=Object.assign({first:!1,sizeSync:!0,init:!1},n),e.attr("id")||e.attr("id",t.namespace+"-navdock-"+ +new Date),n.sizeSync&&(c[e.attr("id")]=e),r=o.height(),u=r+e.outerHeight(!0),n.first?l.after(e):o.append(e),a=!0,o.resizable("enable").height(u).show(),t.trigger("wzresize"),n.init&&(h=t.storage("navdockHeight"),u=h?h:u>m?m:u,i=u),s(Math.min(u,f*p)),o}).data("removeNode",function(n,i){var r=e("#"+n);return delete c[n],o.height(o.height()-e("#"+n).outerHeight(!0)),i?"detach"===i?r=r.detach():i.append(r):r.remove(),o.children().length<=1&&(a=!1,o.resizable("disable").height(0).hide()),t.trigger("wzresize"),r}),n.disabled||t.one("init",function(){var e;t.getUI("navbar").children().not(".ui-resizable-handle").length&&(o.data("dockEnabled",!0),o.resizable({maxHeight:t.getUI("workzone").height()*p,handles:{n:l},start:function(n,i){e=o.css("overflow"),o.css("overflow","hidden"),t.trigger("navdockresizestart",{event:n,ui:i},!0)},resize:function(e,n){o.css("top",""),t.trigger("wzresize",{inNavdockResize:!0})},stop:function(n,a){t.trigger("navdockresizestop",{event:n,ui:a},!0),o.css("top",""),i=a.size.height,t.storage("navdockHeight",i),s(i,a.originalSize.height),o.css("overflow",e)}}),t.bind("wzresize",function(e){var n,a;o.is(":visible")&&(n=t.getUI("workzone").height()*p,e.data&&e.data.inNavdockResize||(a=o.height(),n<i?Math.abs(a-n)>1&&s(n):Math.abs(a-i)>1&&s(i)),o.resizable("option","maxHeight",n))}).bind("themechange",function(){var e=Math.round(o.height());requestAnimationFrame(function(){var t=Math.round(o.height()),n=e-t;0!==n&&s(o.height(),t-n)})})),t.bind("navbarshow navbarhide",function(e){o[a&&"navbarshow"===e.type?"show":"hide"]()})})}),this},e.fn.elfinderoverlay=function(t){var n,i,a,o,r=this.parent().elfinder("instance");return this.filter(":not(.elfinder-overlay)").each(function(){t=Object.assign({},t),e(this).addClass("ui-front ui-widget-overlay elfinder-overlay").hide().on("mousedown",function(e){e.preventDefault(),e.stopPropagation()}).data({cnt:0,show:"function"==typeof t.show?t.show:function(){},hide:"function"==typeof t.hide?t.hide:function(){}})}),"show"==t&&(n=this.eq(0),i=n.data("cnt")+1,a=n.data("show"),r.toFront(n),n.data("cnt",i),n.is(":hidden")&&(n.show(),a())),"hide"==t&&(n=this.eq(0),i=n.data("cnt")-1,o=n.data("hide"),n.data("cnt",i),i<=0&&(n.hide(),o())),this},e.fn.elfinderpanel=function(t){return this.each(function(){var n=e(this).addClass("elfinder-panel ui-state-default ui-corner-all"),i="margin-"+("ltr"==t.direction?"left":"right");t.one("load",function(e){var a=t.getUI("navbar");n.css(i,parseInt(a.outerWidth(!0))),a.on("resize",function(e){e.preventDefault(),e.stopPropagation(),n.is(":visible")&&n.css(i,parseInt(a.outerWidth(!0)))})})})},e.fn.elfinderpath=function(t,n){return this.each(function(){var a,o,r="",s="",l=[],c="statusbar",d=t.res("class","hover"),p="path"+(i.prototype.uniqueid?i.prototype.uniqueid:"")+"-",u=e('<div class="ui-widget-header ui-helper-clearfix elfinder-workzone-path"/>'),h=e(this).addClass("elfinder-path").html("&nbsp;").on("mousedown","span.elfinder-path-dir",function(n){var i=e(this).attr("id").substr(p.length);n.preventDefault(),i!=t.cwd().hash&&(e(this).addClass(d),r?t.exec("search",r,{target:i,mime:l.join(" ")}):t.trigger("select",{selected:[i]}).exec("open",i))}).prependTo(t.getUI("statusbar").show()),f=e('<div class="elfinder-path-roots"/>').on("click",function(n){n.stopPropagation(),n.preventDefault();var i=e.map(t.roots,function(e){return t.file(e)}),a=[];e.each(i,function(e,n){n.phash||t.root(t.cwd().hash,!0)===n.hash||a.push({label:t.escape(n.i18||n.name),icon:"home",callback:function(){t.exec("open",n.hash)},options:{iconClass:n.csscls||"",iconImg:n.icon||""}})}),t.trigger("contextmenu",{raw:a,x:n.pageX,y:n.pageY})}).append('<span class="elfinder-button-icon elfinder-button-icon-menu" />').appendTo(u),m=function(n){var i=[],a=[];return e.each(t.parents(n),function(e,o){var r=n===o?"elfinder-path-dir elfinder-path-cwd":"elfinder-path-dir",s=t.file(o),l=t.escape(s.i18||s.name);a.push(l),i.push('<span id="'+p+o+'" class="'+r+'" title="'+a.join(t.option("separator"))+'">'+l+"</span>")}),i.join('<span class="elfinder-path-other">'+t.option("separator")+"</span>")},g=function(){var n;h.children("span.elfinder-path-dir").attr("style",""),n="ltr"===t.direction?e("#"+p+t.cwd().hash).prevAll("span.elfinder-path-dir:first"):e(),h.scrollLeft(n.length?n.position().left:0)},v=function(){if(!t.UA.CSS.flex){var n,i,a=h.children("span.elfinder-path-dir"),o=a.length;if("workzone"===c||o<2)return void a.attr("style","");h.width(h.css("max-width")),a.css({maxWidth:100/o+"%",display:"inline-block"}),n=h.width()-9,h.children("span.elfinder-path-other").each(function(){n-=e(this).width()}),i=[],a.each(function(t){var a=e(this),o=a.width();n-=o,o<this.scrollWidth&&i.push(t)}),h.width(""),i.length?(n>0&&(n/=i.length,e.each(i,function(t,i){var o=e(a[i]);o.css("max-width",o.width()+n)})),a.last().attr("style","")):a.attr("style","")}};t.one("init",function(){a=t.getUI("tree").length,o=t.getUI("stat").length,!a&&n.toWorkzoneWithoutNavbar&&(u.append(h).insertBefore(t.getUI("workzone")),c="workzone",t.bind("open",g).one("opendone",function(){t.getUI().trigger("resize")}))}).bind("open searchend parents",function(){r="",s="",l=[],h.html(m(t.cwd().hash)),Object.keys(t.roots).length>1?(h.css("margin",""),f.show()):(h.css("margin",0),f.hide()),!o&&v()}).bind("searchstart",function(e){e.data&&(r=e.data.query||"",s=e.data.target||"",l=e.data.mimes||[])}).bind("search",function(e){var n="";n=s?m(s):t.i18n("btnAll"),h.html('<span class="elfinder-path-other">'+t.i18n("searcresult")+": </span>"+n),v()}).bind("navbarshow navbarhide",function(){var e=t.getUI("workzone");"navbarshow"===this.type?(t.unbind("open",g),h.prependTo(t.getUI("statusbar")),u.detach(),c="statusbar"):(u.append(h).insertBefore(e),c="workzone",g(),t.bind("open",g)),t.trigger("uiresize")}).bind("resize uistatchange",v)})},e.fn.elfinderplaces=function(t,n){return this.each(function(){var i={},a="class",o=t.res(a,"navdir"),r=t.res(a,"navcollapse"),s=t.res(a,"navexpand"),l=t.res(a,"hover"),c=t.res(a,"treeroot"),d=t.res(a,"adroppable"),p=t.res("tpl","placedir"),u=t.res("tpl","perms"),h=e(t.res("tpl","navspinner")),f=n.suffix?n.suffix:"",m="places"+f,g=null,v=function(e){return e.substr(6)},b=function(e){return"place-"+e},y=function(t){return e(document.getElementById(b(t)))},w=function(){var n=[],a={};n=e.map(D.children().find("[id]"),function(e){return v(e.id)}),n.length?e.each(n.reverse(),function(e,t){a[t]=i[t]}):a=null,t.storage(m,a)},x=function(){var a,o;m="places"+(n.suffix?n.suffix:""),i={},a=t.storage(m),"string"==typeof a?(a=e.grep(a.split(","),function(e){return!!e}),e.each(a,function(e,t){var n=t.split("#");i[n[0]]=n[1]?n[1]:n[0]})):e.isPlainObject(a)&&(i=a),t.trigger("placesload",{dirs:i,storageKey:m},!0),o=Object.keys(i),o.length&&(M.prepend(h),t.request({data:{cmd:"info",targets:o},preventDefault:!0}).done(function(n){var a={};n.files&&n.files.length&&t.cache(n.files),e.each(n.files,function(e,t){var n=t.hash;a[n]=t}),e.each(i,function(e,t){C(a[e]||Object.assign({notfound:!0},t))}),t.storage("placesState")>0&&M.trigger("click")}).always(function(){h.remove()}))},k=function(n,i){return e(p.replace(/\{id\}/,b(n?n.hash:i)).replace(/\{name\}/,t.escape(n?n.i18||n.name:i)).replace(/\{cssclass\}/,n?t.perms2class(n)+(n.notfound?" elfinder-na":"")+(n.csscls?" "+n.csscls:""):"").replace(/\{permissions\}/,!n||n.read&&n.write&&!n.notfound?"":u).replace(/\{title\}/,n&&n.path?t.escape(n.path):"").replace(/\{symlink\}/,"").replace(/\{style\}/,n&&n.icon?t.getIconStyle(n):""))},C=function(e){var n,a;return"directory"===e.mime&&(a=e.hash,t.files().hasOwnProperty(a)||t.trigger("tree",{tree:[e]}),n=k(e,a),i[a]=e,D.prepend(n),M.addClass(r),O.toggle(D.children().length>1),!0)},z=function(e){var t,n,a=null;return i[e]&&(delete i[e],t=y(e),t.length&&(a=t.text(),t.parent().remove(),n=D.children().length,O.toggle(n>1),n||(M.removeClass(r),F.removeClass(s),D.slideToggle(!1)))),a},T=function(e){var n=y(e),i=n.parent(),a=i.prev("div"),o="ui-state-hover",r=t.getUI("contextmenu");g&&clearTimeout(g),a.length&&(r.find(":first").data("placesHash",e),n.addClass(o),i.insertBefore(a),a=i.prev("div"),g=setTimeout(function(){n.removeClass(o),r.find(":first").data("placesHash")===e&&r.hide().empty()},1500)),a.length||(n.removeClass(o),r.hide().empty())},A=function(e,t){var n=e.hash,a=y(t||n),o=k(e,n);return a.length>0&&(a.parent().replaceWith(o),i[n]=e,!0)},S=function(){D.empty(),M.removeClass(r),F.removeClass(s),D.slideToggle(!1)},I=function(){e.each(i,function(n,i){var a=t.file(n)||i,r=k(a,n),s=null;return a||r.hide(),!(!D.children().length||(e.each(D.children(),function(){var t=e(this);if((a.i18||a.name).localeCompare(t.children("."+o).text())<0)return s=!r.insertBefore(t)}),null===s))||void(!y(n).length&&D.append(r))}),w()},O=e('<span class="elfinder-button-icon elfinder-button-icon-sort elfinder-places-root-icon" title="'+t.i18n("cmdsort")+'"/>').hide().on("click",function(e){e.stopPropagation(),D.empty(),I()}),j=k({hash:"root-"+t.namespace,name:t.i18n(n.name,"places"),read:!0,write:!0}),M=j.children("."+o).addClass(c).on("click",function(e){e.stopPropagation(),M.hasClass(r)&&(F.toggleClass(s),D.slideToggle(),t.storage("placesState",F.hasClass(s)?1:0))}).append(O),D=j.children("."+t.res(a,"navsubtree")),F=e(this).addClass(t.res(a,"tree")+" elfinder-places ui-corner-all").hide().append(j).appendTo(t.getUI("navbar")).on("mouseenter mouseleave","."+o,function(t){e(this).toggleClass("ui-state-hover","mouseenter"==t.type)}).on("click","."+o,function(n){var i=e(this);return i.data("longtap")?void n.stopPropagation():void(!i.hasClass("elfinder-na")&&t.exec("open",i.attr("id").substr(6)))}).on("contextmenu","."+o+":not(."+c+")",function(n){var i=e(this),a=i.attr("id").substr(6);n.preventDefault(),t.trigger("contextmenu",{raw:[{label:t.i18n("moveUp"),icon:"up",remain:!0,callback:function(){T(a),w()}},"|",{label:t.i18n("rmFromPlaces"),icon:"rm",callback:function(){z(a),w()}}],x:n.pageX,y:n.pageY}),i.addClass("ui-state-hover"),t.getUI("contextmenu").children().on("mouseenter",function(){i.addClass("ui-state-hover")}),t.bind("closecontextmenu",function(){i.removeClass("ui-state-hover")})}).droppable({tolerance:"pointer",accept:".elfinder-cwd-file-wrapper,.elfinder-tree-dir,.elfinder-cwd-file",hoverClass:t.res("class","adroppable"),classes:{"ui-droppable-hover":t.res("class","adroppable")},over:function(n,a){var o=a.helper,r=e.grep(o.data("files"),function(e){return"directory"===t.file(e).mime&&!i[e]});n.stopPropagation(),o.data("dropover",o.data("dropover")+1),t.insideWorkzone(n.pageX,n.pageY)&&(r.length>0?(o.addClass("elfinder-drag-helper-plus"),t.trigger("unlockfiles",{files:o.data("files"),helper:o})):e(this).removeClass(d))},out:function(t,n){var i=n.helper;t.stopPropagation(),i.removeClass("elfinder-drag-helper-move elfinder-drag-helper-plus").data("dropover",Math.max(i.data("dropover")-1,0)),e(this).removeData("dropover").removeClass(d)},drop:function(n,a){var o=a.helper,r=!0;e.each(o.data("files"),function(e,n){var a=t.file(n);a&&"directory"==a.mime&&!i[a.hash]?C(a):r=!1}),w(),r&&o.hide()}}).on("touchstart","."+o+":not(."+c+")",function(n){if(!(n.originalEvent.touches.length>1))var i=e(this).attr("id").substr(6),a=e(this).addClass(l).data("longtap",null).data("tmlongtap",setTimeout(function(){a.data("longtap",!0),t.trigger("contextmenu",{raw:[{label:t.i18n("rmFromPlaces"),icon:"rm",callback:function(){z(i),w()}}],x:n.originalEvent.touches[0].pageX,y:n.originalEvent.touches[0].pageY})},500))}).on("touchmove touchend","."+o+":not(."+c+")",function(t){clearTimeout(e(this).data("tmlongtap")),"touchmove"==t.type&&e(this).removeClass(l)});e.fn.sortable&&D.addClass("touch-punch").sortable({appendTo:t.getUI(),revert:!1,helper:function(n){var i=e(n.target).parent();return i.children().removeClass("ui-state-hover"),e('<div class="ui-widget elfinder-place-drag elfinder-'+t.direction+'"/>').append(e('<div class="elfinder-navbar"/>').show().append(i.clone()))},stop:function(t,n){var i=e(n.item[0]),a=F.offset().top,o=F.offset().left,r=F.width(),s=F.height(),l=t.pageX,c=t.pageY;l>o&&l<o+r&&c>a&&c<c+s||(z(v(i.children(":first").attr("id"))),w())},update:function(e,t){w()}}),e(this).on("regist",function(t,n){var a=!1;e.each(n,function(e,t){t&&"directory"==t.mime&&!i[t.hash]&&C(t)&&(a=!0)}),a&&w()}),t.one("load",function(){t.oldAPI||(F.show().parent().show(),x(),t.change(function(t){var n=!1;e.each(t.data.changed,function(e,t){i[t.hash]&&("directory"!==t.mime?z(t.hash)&&(n=!0):A(t)&&(n=!0))}),n&&w()}).bind("rename",function(t){var n=!1;t.data.removed&&e.each(t.data.removed,function(e,i){t.data.added[e]&&A(t.data.added[e],i)&&(n=!0)}),n&&w()}).bind("rm paste",function(t){var n=[],i=!1;t.data.removed&&e.each(t.data.removed,function(e,t){var i=z(t);i&&n.push(i)}),n.length&&(i=!0),t.data.added&&n.length&&e.each(t.data.added,function(t,i){1!==e.inArray(i.name,n)&&"directory"==i.mime&&C(i)}),i&&w()}).bind("sync netmount",function(){var a,o=this,r=n.suffix?n.suffix:"";return"sync"===o.type&&f!==r?(f=r,S(),void x()):(a=Object.keys(i),void(a.length&&(M.prepend(h),t.request({data:{cmd:"info",targets:a},preventDefault:!0}).done(function(n){var a={},r=!1,s=t.cwd().hash;e.each(n.files||[],function(e,n){var i=n.hash;a[i]=n,t.files().hasOwnProperty(n.hash)||t.trigger("tree",{tree:[n]})}),e.each(i,function(e,t){t.notfound===Boolean(a[e])?t.phash===s&&"netmount"!==o.type||a[e]&&"directory"!==a[e].mime?z(e)&&(r=!0):A(a[e]||Object.assign({notfound:!0},t))&&(r=!0):a[e]&&a[e].phash!=s&&A(a[e])}),r&&w()}).always(function(){h.remove()}))))}))})})},e.fn.elfindersearchbutton=function(t){return this.each(function(){var n,i,a,o,r=!1,s=t.fm,l=(s.res("class","disabled"),t.options.incsearch||{enable:!1}),c=t.options.searchTypes,d=function(e){return s.namespace+s.escape(e)},p=s.getUI("toolbar"),u=s.res("class","searchbtn"),h=e(this).hide().addClass("ui-widget-content elfinder-button "+u).on("click",function(e){e.stopPropagation()}),f=function(){var e=s.getUI(),t=e.offset(),n=h.offset();return{top:n.top-t.top,maxHeight:e.height()-40}},m=function(){b.data("inctm")&&clearTimeout(b.data("inctm"));var n=e.trim(b.val()),a=!e("#"+d("SearchFromAll")).prop("checked"),o=e("#"+d("SearchMime")).prop("checked"),l="";
a&&(a=e("#"+d("SearchFromVol")).prop("checked")?s.root(s.cwd().hash):s.cwd().hash),o&&(o=n,n="."),i&&(l=i.children("input:checked").val()),n?(b.trigger("focus"),t.exec(n,a,o,l).done(function(){r=!0}).fail(function(){g()})):s.trigger("searchend")},g=function(){b.data("inctm")&&clearTimeout(b.data("inctm")),b.val("").trigger("blur"),(r||v)&&(r=!1,v="",s.lazy(function(){s.trigger("searchend")}))},v="",b=e('<input type="text" size="42"/>').on("focus",function(){!h.hasClass("ui-state-active")&&s.getUI().click(),o=!0,v="",h.addClass("ui-state-active"),s.trigger("uiresize"),n&&n.css(f()).slideDown(function(){h.addClass("ui-state-active"),s.toFront(n)})}).on("blur",function(){o=!1,n?n.data("infocus")?n.data("infocus",!1):n.slideUp(function(){h.removeClass("ui-state-active"),s.trigger("uiresize"),s.toHide(n)}):h.removeClass("ui-state-active")}).appendTo(h).on("keypress",function(e){e.stopPropagation()}).on("keydown",function(t){t.stopPropagation(),t.keyCode===e.ui.keyCode.ENTER?m():t.keyCode===e.ui.keyCode.ESCAPE&&(t.preventDefault(),g())});l.enable&&(l.minlen=l.minlen||2,l.wait=l.wait||500,b.attr("title",s.i18n("incSearchOnly")).on("compositionstart",function(){b.data("composing",!0)}).on("compositionend",function(){b.removeData("composing"),b.trigger("input")}).on("input",function(){b.data("composing")||(b.data("inctm")&&clearTimeout(b.data("inctm")),b.data("inctm",setTimeout(function(){var e=b.val();(0===e.length||e.length>=l.minlen)&&(v!==e&&s.trigger("incsearchstart",{query:e}),v=e,""===e&&s.searchStatus.state>1&&s.searchStatus.query&&b.val(s.searchStatus.query).trigger("select"))},l.wait)))}),s.UA.ltIE8&&b.on("keydown",function(e){229===e.keyCode&&(b.data("imetm")&&clearTimeout(b.data("imetm")),b.data("composing",!0),b.data("imetm",setTimeout(function(){b.removeData("composing")},100)))}).on("keyup",function(t){b.data("imetm")&&clearTimeout(b.data("imetm")),b.data("composing")?t.keyCode===e.ui.keyCode.ENTER&&b.trigger("compositionend"):b.trigger("input")})),e('<span class="ui-icon ui-icon-search" title="'+t.title+'"/>').appendTo(h).on("mousedown",function(e){e.stopPropagation(),e.preventDefault(),h.hasClass("ui-state-active")?m():b.trigger("focus")}),e('<span class="ui-icon ui-icon-close"/>').appendTo(h).on("mousedown",function(e){e.stopPropagation(),e.preventDefault(),""!==b.val()||h.hasClass("ui-state-active")?g():b.trigger("focus")}),s.bind("toolbarload",function(){var e=h.parent();if(e.length&&(p.prepend(h.show()),e.remove(),s.UA.ltIE7)){var t=h.children("ltr"==s.direction?".ui-icon-close":".ui-icon-search");t.css({right:"",left:parseInt(h.width())-t.outerWidth(!0)})}}),s.one("init",function(){s.getUI("cwd").on("touchstart click",function(){o&&b.trigger("blur")})}).one("open",function(){n=s.api<2.1?null:e('<div class="ui-front ui-widget ui-widget-content elfinder-button-menu elfinder-button-search-menu ui-corner-all"/>').append(e('<div class="buttonset"/>').append(e('<input id="'+d("SearchFromCwd")+'" name="serchfrom" type="radio" checked="checked"/><label for="'+d("SearchFromCwd")+'">'+s.i18n("btnCwd")+"</label>"),e('<input id="'+d("SearchFromVol")+'" name="serchfrom" type="radio"/><label for="'+d("SearchFromVol")+'">'+s.i18n("btnVolume")+"</label>"),e('<input id="'+d("SearchFromAll")+'" name="serchfrom" type="radio"/><label for="'+d("SearchFromAll")+'">'+s.i18n("btnAll")+"</label>")),e('<div class="buttonset elfinder-search-type"/>').append(e('<input id="'+d("SearchName")+'" name="serchcol" type="radio" checked="checked" value="SearchName"/><label for="'+d("SearchName")+'">'+s.i18n("btnFileName")+"</label>"))).hide().appendTo(s.getUI()),n&&(c&&(i=n.find(".elfinder-search-type"),e.each(t.options.searchTypes,function(t,n){i.append(e('<input id="'+d(t)+'" name="serchcol" type="radio" value="'+s.escape(t)+'"/><label for="'+d(t)+'">'+s.i18n(n.name)+"</label>"))})),n.find("div.buttonset").buttonset(),e("#"+d("SearchFromAll")).next("label").attr("title",s.i18n("searchTarget",s.i18n("btnAll"))),c&&e.each(c,function(t,n){n.title&&e("#"+d(t)).next("label").attr("title",s.i18n(n.title))}),n.on("mousedown","div.buttonset",function(e){e.stopPropagation(),n.data("infocus",!0)}).on("click","input",function(t){t.stopPropagation(),e.trim(b.val())?m():b.trigger("focus")}).on("close",function(){b.trigger("blur")}))}).bind("searchend",function(){b.val("")}).bind("open parents",function(){var t=[],n=s.file(s.root(s.cwd().hash));n&&(e.each(s.parents(s.cwd().hash),function(e,n){t.push(s.file(n).name)}),e("#"+d("SearchFromCwd")).next("label").attr("title",s.i18n("searchTarget",t.join(s.option("separator")))),e("#"+d("SearchFromVol")).next("label").attr("title",s.i18n("searchTarget",n.name)))}).bind("open",function(){v&&g()}).bind("cwdinit",function(){a=!1}).bind("cwdrender",function(){a=!0}).bind("keydownEsc",function(){v&&"/"===v.substr(0,1)&&(v="",b.val(""),s.trigger("searchend"))}).shortcut({pattern:"ctrl+f f3",description:t.title,callback:function(){b.trigger("select").trigger("focus")}}).shortcut({pattern:"a b c d e f g h i j k l m n o p q r s t u v w x y z dig0 dig1 dig2 dig3 dig4 dig5 dig6 dig7 dig8 dig9 num0 num1 num2 num3 num4 num5 num6 num7 num8 num9",description:s.i18n("firstLetterSearch"),callback:function(t){if(a){var n,i=t.originalEvent.keyCode,o=function(){var t=s.selected(),n=e.ui.keyCode[!t.length||s.cwdHash2Elm(t[0]).next("[id]").length?"RIGHT":"HOME"];e(document).trigger(e.Event("keydown",{keyCode:n,ctrlKey:!1,shiftKey:!1,altKey:!1,metaKey:!1}))};i>=96&&i<=105&&(i-=48),n="/"+String.fromCharCode(i),v!==n?(b.val(n),v=n,s.trigger("incsearchstart",{query:n}).one("cwdrender",o)):o()}}})})},e.fn.elfindersortbutton=function(t){return this.each(function(){var n,i=t.fm,a=t.name,o="class",r=i.res(o,"disabled"),s=i.res(o,"hover"),l="elfinder-button-menu-item",c=l+"-selected",d=c+"-asc",p=c+"-desc",u=e('<span class="elfinder-button-text">'+t.title+"</span>"),h=e(this).addClass("ui-state-default elfinder-button elfinder-menubutton elfiner-button-"+a).attr("title",t.title).append('<span class="elfinder-button-icon elfinder-button-icon-'+a+'"/>',u).on("mouseenter mouseleave",function(e){!h.hasClass(r)&&h.toggleClass(s,"mouseenter"===e.type)}).on("click",function(e){h.hasClass(r)||(e.stopPropagation(),m.is(":hidden")&&i.getUI().click(),m.css(v()).slideToggle({duration:100,done:function(e){i[m.is(":visible")?"toFront":"toHide"](m)}}))}),f=function(){i.toHide(m)},m=e('<div class="ui-front ui-widget ui-widget-content elfinder-button-menu ui-corner-all"/>').hide().appendTo(i.getUI()).on("mouseenter mouseleave","."+l,function(t){e(this).toggleClass(s,"mouseenter"===t.type)}).on("click",function(e){e.preventDefault(),e.stopPropagation()}).on("close",f),g=function(){m.children("[rel]").removeClass(c+" "+d+" "+p).filter('[rel="'+i.sortType+'"]').addClass(c+" "+("asc"==i.sortOrder?d:p)),m.children(".elfinder-sort-stick").toggleClass(c,i.sortStickFolders),m.children(".elfinder-sort-tree").toggleClass(c,i.sortAlsoTreeview)},v=function(){var e=i.getUI().offset(),t=h.offset();return{top:t.top-e.top,left:t.left-e.left}};u.hide(),e.each(i.sortRules,function(t,n){m.append(e('<div class="'+l+'" rel="'+t+'"><span class="ui-icon ui-icon-arrowthick-1-n"/><span class="ui-icon ui-icon-arrowthick-1-s"/>'+i.i18n("sort"+t)+"</div>").data("type",t))}),m.children().on("click",function(n){t.exec([],e(this).removeClass(s).attr("rel"))}),e('<div class="'+l+" "+l+'-separated elfinder-sort-ext elfinder-sort-stick"><span class="ui-icon ui-icon-check"/>'+i.i18n("sortFoldersFirst")+"</div>").appendTo(m).on("click",function(){t.exec([],"stick")}),i.one("init",function(){i.ui.tree&&null!==i.options.sortAlsoTreeview&&e('<div class="'+l+" "+l+'-separated elfinder-sort-ext elfinder-sort-tree"><span class="ui-icon ui-icon-check"/>'+i.i18n("sortAlsoTreeview")+"</div>").appendTo(m).on("click",function(){t.exec([],"tree")})}).bind("disable select",f).bind("open",function(){m.children("[rel]").each(function(){var t=e(this);t.toggle(i.sorters[t.attr("rel")])})}).bind("sortchange",g).getUI().on("click",f),m.children().length>1?t.change(function(){n&&cancelAnimationFrame(n),n=requestAnimationFrame(function(){h.toggleClass(r,t.disabled()),g()})}).change():h.addClass(r)})},e.fn.elfinderstat=function(t){return this.each(function(){var n=e(this).addClass("elfinder-stat-size"),i=e('<div class="elfinder-stat-selected"/>').on("click","a",function(n){var i=e(this).data("hash");n.preventDefault(),t.exec("opendir",[i])}),a=t.i18n("items"),o=t.i18n("selected"),r=t.i18n("size"),s=function(i){var o=0,r=0,s=t.cwd(),l=!0,c=!0;(s.sizeInfo||s.size)&&(r=s.size,l=!1),e.each(i,function(e,t){o++,l&&(r+=parseInt(t.size)||0,c!==!0||"directory"!==t.mime||t.sizeInfo||(c=!1))}),n.html(a+': <span class="elfinder-stat-incsearch"></span>'+o+',&nbsp;<span class="elfinder-stat-size'+(c?" elfinder-stat-size-recursive":"")+'">'+t.i18n(c?"sum":"size")+": "+t.formatSize(r)+"</span>").attr("title",n.text()),t.trigger("uistatchange")},l=function(e){n.find("span.elfinder-stat-incsearch").html(e?e.hashes.length+" / ":""),n.attr("title",n.text()),t.trigger("uistatchange")},c=function(n){var a,s,l=0,c=0,d=[];1===n.length?(s=n[0],l=s.size,2===t.searchStatus.state&&(a=t.escape(s.path?s.path.replace(/\/[^\/]*$/,""):".."),d.push('<a href="#elf_'+s.phash+'" data-hash="'+s.hash+'" title="'+a+'">'+a+"</a>")),d.push(t.escape(s.i18||s.name)),i.html(d.join("/")+(l>0?", "+t.formatSize(l):""))):n.length?(e.each(n,function(e,t){c++,l+=parseInt(t.size)||0}),i.html(c?o+": "+c+", "+r+": "+t.formatSize(l):"&nbsp;")):i.html(""),i.attr("title",i.text()),t.trigger("uistatchange")};t.getUI("statusbar").prepend(n).append(i).show(),t.UA.Mobile&&e.fn.tooltip&&t.getUI("statusbar").tooltip({classes:{"ui-tooltip":"elfinder-ui-tooltip ui-widget-shadow"},tooltipClass:"elfinder-ui-tooltip ui-widget-shadow",track:!0}),t.bind("cwdhasheschange",function(n){s(e.map(n.data,function(e){return t.file(e)}))}).change(function(i){var a=i.data.changed||[],o=t.cwd().hash;e.each(a,function(){if(this.hash===o)return this.size&&(n.children(".elfinder-stat-size").addClass("elfinder-stat-size-recursive").html(t.i18n("sum")+": "+t.formatSize(this.size)),n.attr("title",n.text())),!1})}).select(function(){c(t.selectedFiles())}).bind("open",function(){c([])}).bind("incsearch",function(e){l(e.data)}).bind("incsearchend",function(){l()})})},e.fn.elfindertoast=function(t,n){var i=Object.assign({mode:"success",msg:"",showMethod:"fadeIn",showDuration:300,showEasing:"swing",onShown:void 0,hideMethod:"fadeOut",hideDuration:1500,hideEasing:"swing",onHidden:void 0,timeOut:3e3,extNode:void 0,button:void 0,width:void 0},e.isPlainObject(n.options.uiOptions.toast.defaults)?n.options.uiOptions.toast.defaults:{});return this.each(function(){t=Object.assign({},i,t||{});var a,o=e(this),r=function(e){o.stop(),n.toFront(o),o[t.showMethod]({duration:t.showDuration,easing:t.showEasing,complete:function(){t.onShown&&t.onShown(),!e&&t.timeOut&&(a=setTimeout(s,t.timeOut))}})},s=function(){o[t.hideMethod]({duration:t.hideDuration,easing:t.hideEasing,complete:function(){t.onHidden&&t.onHidden(),o.remove()}})};o.on("click",function(e){e.stopPropagation(),e.preventDefault(),a&&clearTimeout(a),t.onHidden&&t.onHidden(),o.stop().remove()}).on("mouseenter mouseleave",function(e){t.timeOut&&(a&&clearTimeout(a),a=null,"mouseenter"===e.type?r(!0):a=setTimeout(s,t.timeOut))}).hide().addClass("toast-"+t.mode).append(e('<div class="elfinder-toast-msg"/>').html(t.msg.replace(/%([a-zA-Z0-9]+)%/g,function(e,t){return n.i18n(t)}))),t.extNode&&o.append(t.extNode),t.button&&o.append(e('<button class="ui-button ui-widget ui-state-default ui-corner-all elfinder-tabstop"/>').append(e('<span class="ui-button-text"/>').text(n.i18n(t.button.text))).on("mouseenter mouseleave",function(t){e(this).toggleClass("ui-state-hover","mouseenter"==t.type)}).on("click",t.button.click||function(){})),t.width&&o.css("max-width",t.width),r()})},e.fn.elfindertoolbar=function(t,n){return this.not(".elfinder-toolbar").each(function(){var i,a,o,r,s,l,c,d,p,u=t._commands,h=e(this).addClass("ui-helper-clearfix ui-widget-header elfinder-toolbar"),f={displayTextLabel:!1,labelExcludeUA:["Mobile"],autoHideUA:["Mobile"],showPreferenceButton:"none"},m=function(t){return e.grep(t,function(t){return!e.isPlainObject(t)||(f=Object.assign(f,t),!1)})},g=function(n){var l,c;for(e.each(v,function(e,t){t.detach()}),h.empty(),i=b.length;i--;)if(b[i]){for(r=e('<div class="ui-widget-content ui-corner-all elfinder-buttonset"/>'),a=b[i].length;a--;)l=b[i][a],n&&n[l]||!(o=u[l])||(s="elfinder"+o.options.ui,!v[l]&&e.fn[s]&&(v[l]=e("<div/>")[s](o)),v[l]&&(v[l].children(".elfinder-button-text")[d?"show":"hide"](),r.prepend(v[l])));r.children().length&&h.prepend(r),r.children(":gt(0)").before('<span class="ui-widget-content elfinder-toolbar-button-separator"/>')}(c=u.preference)&&("always"===f.showPreferenceButton||!h.children().length&&"auto"===f.showPreferenceButton)&&(r=e('<div class="ui-widget-content ui-corner-all elfinder-buttonset"/>'),l="preference",s="elfinder"+o.options.ui,v[l]=e("<div/>")[s](c),v[l].children(".elfinder-button-text")[d?"show":"hide"](),r.prepend(v[l]),h.append(r)),!h.data("swipeClose")&&h.children().length?h.show():h.hide(),x=h[0].clientHeight,t.trigger("toolbarload").trigger("uiresize")},v={},b=m(n||[]),y=null,w="",x=0,k=[];f.showPreferenceButton=f.showPreferenceButton.toLowerCase(),"none"!==f.displayTextLabel&&(d=t.storage("toolbarTextLabel"),d=null===d?f.displayTextLabel&&(!f.labelExcludeUA||!f.labelExcludeUA.length||!e.grep(f.labelExcludeUA,function(e){return!!t.UA[e]}).length):1==d,k.push({label:t.i18n("textLabel"),icon:"text",callback:function(){d=!d,h.css("height","").find(".elfinder-button-text")[d?"show":"hide"](),t.trigger("uiresize").storage("toolbarTextLabel",d?"1":"0")}})),f.preferenceInContextmenu&&u.preference&&k.push({label:t.i18n("toolbarPref"),icon:"preference",callback:function(){t.exec("preference",void 0,{tab:"toolbar"})}}),k.length&&h.on("contextmenu",function(e){e.stopPropagation(),e.preventDefault(),t.trigger("contextmenu",{raw:k,x:e.pageX,y:e.pageY})}).on("touchstart",function(e){e.originalEvent.touches.length>1||(h.data("tmlongtap")&&clearTimeout(h.data("tmlongtap")),h.removeData("longtap").data("longtap",{x:e.originalEvent.touches[0].pageX,y:e.originalEvent.touches[0].pageY}).data("tmlongtap",setTimeout(function(){h.removeData("longtapTm").trigger({type:"contextmenu",pageX:h.data("longtap").x,pageY:h.data("longtap").y}).data("longtap",{longtap:!0})},500)))}).on("touchmove touchend",function(e){h.data("tmlongtap")&&(("touchend"===e.type||Math.abs(h.data("longtap").x-e.originalEvent.touches[0].pageX)+Math.abs(h.data("longtap").y-e.originalEvent.touches[0].pageY)>4)&&clearTimeout(h.data("tmlongtap")),h.removeData("longtapTm"))}).on("click",function(e){h.data("longtap")&&h.data("longtap").longtap&&(e.stopImmediatePropagation(),e.preventDefault())}).on("touchend click",".elfinder-button",function(e){h.data("longtap")&&h.data("longtap").longtap&&(e.stopImmediatePropagation(),e.preventDefault())}),h.prev().length&&h.parent().prepend(this),g(),t.bind("open sync select toolbarpref",function(){var n,i,a,o=Object.assign({},t.option("disabledFlip")),r=t.storage("toolbarhides");if(!r&&Array.isArray(f.defaultHides)&&(r={},e.each(f.defaultHides,function(){r[this]=!0}),t.storage("toolbarhides",r)),"select"===this.type){if(t.searchStatus.state<2)return;i=t.selected(),i.length&&(o=t.getDisabledCmds(i,!0))}e.each(r,function(e){o[e]||(o[e]=!0)}),Object.keys(t.commandMap).length&&e.each(t.commandMap,function(e,t){"hidden"===t&&(o[e]=!0)}),a=Object.keys(o),y&&y.toString()===a.sort().toString()||(g(a.length?o:null),n=!0),y=a.sort(),(n||w!==JSON.stringify(t.commandMap))&&(w=JSON.stringify(t.commandMap),n||e.each(e("div.elfinder-button"),function(){var t=e(this).data("origin");t&&e(this).after(t).detach()}),Object.keys(t.commandMap).length&&e.each(t.commandMap,function(n,i){var a,o=t._commands[i],r=o?"elfinder"+o.options.ui:null;r&&e.fn[r]&&(a=v[n],a&&(!v[i]&&e.fn[r]&&(v[i]=e("<div/>")[r](o),v[i]&&(v[i].children(".elfinder-button-text")[d?"show":"hide"](),o.extendsCmd&&v[i].children("span.elfinder-button-icon").addClass("elfinder-button-icon-"+o.extendsCmd))),v[i]&&(a.after(v[i]),v[i].data("origin",a.detach()))))}))}).bind("resize",function(e){p&&cancelAnimationFrame(p),p=requestAnimationFrame(function(){var e=h[0].clientHeight;x!==e&&(x=e,t.trigger("uiresize"))})}),t.UA.Touch&&(c=t.storage("autoHide")||{},"undefined"==typeof c.toolbar&&(c.toolbar=f.autoHideUA&&f.autoHideUA.length>0&&e.grep(f.autoHideUA,function(e){return!!t.UA[e]}).length,t.storage("autoHide",c)),c.toolbar&&t.one("init",function(){t.uiAutoHide.push(function(){h.stop(!0,!0).trigger("toggle",{duration:500,init:!0})})}),t.bind("load",function(){l=e('<div class="elfinder-toolbar-swipe-handle"/>').hide().appendTo(t.getUI()),"none"!==l.css("pointer-events")&&(l.remove(),l=null)}),h.on("toggle",function(e,n){var i=t.getUI("workzone"),a=h.is(":hidden"),o=i.height(),r=h.height(),s=h.outerHeight(!0),d=s-r,p=Object.assign({step:function(e){i.height(o+(a?(e+d)*-1:r-e)),t.trigger("resize")},always:function(){requestAnimationFrame(function(){h.css("height",""),t.trigger("uiresize"),l&&(a?l.stop(!0,!0).hide():(l.height(n.handleH?n.handleH:""),t.resources.blink(l,"slowonce"))),a&&h.scrollTop("0px"),n.init&&t.trigger("uiautohide")})}},n);h.data("swipeClose",!a).stop(!0,!0).animate({height:"toggle"},p),c.toolbar=!a,t.storage("autoHide",Object.assign(t.storage("autoHide"),{toolbar:c.toolbar}))}).on("touchstart",function(e){h.scrollBottom()>5&&(e.originalEvent._preventSwipeY=!0)}))}),this},e.fn.elfindertree=function(t,n){var i=t.res("class","tree");return this.not("."+i).each(function(){var a,o,r,s,l="class",c=t.UA.Mobile,d=t.res(l,"treeroot"),p=n.openRootOnLoad,u=n.openCwdOnOpen,h=u||n.syncTree,f=t.res(l,"navsubtree"),m=t.res(l,"treedir"),g="span."+m,v=t.res(l,"navcollapse"),b=t.res(l,"navexpand"),y="elfinder-subtree-loaded",w="elfinder-subtree-chksubdir",x=t.res(l,"navarrow"),k=t.res(l,"active"),C=t.res(l,"adroppable"),z=t.res(l,"hover"),T=t.res(l,"disabled"),A=t.res(l,"draggable"),S=t.res(l,"droppable"),I="elfinder-navbar-wrapper-root",O="elfinder-navbar-wrapper-pastable",j="elfinder-navbar-wrapper-uploadable",M=function(e){var t=se.offset().left;return t<=e&&e<=t+se.width()},D={},F=[],E=function(n){var i=[];if(e.each(n,function(e,n){D[n]&&i.push(t.navId2Hash(n)),delete D[n]}),i.length)return t.request({data:{cmd:"subdirs",targets:i,preventDefault:!0}}).done(function(n){n&&n.subdirs&&e.each(n.subdirs,function(e,n){var i=t.navHash2Elm(e);i.removeClass(w),i[n?"addClass":"removeClass"](v)})})},U=null,P=function(){var n=Object.keys(D);n.length&&(U&&U._abort(),a&&clearTimeout(a),F=[],U=t.asyncJob(function(n){return t.isInWindow(e("#"+n))?n:null},n,{numPerOnce:200}).done(function(e){e.length&&(F=e,q())}))},R=0,q=function(){var e,i=n.subdirsMaxConn-R,o=t.maxTargets?Math.min(t.maxTargets,n.subdirsAtOnce):n.subdirsAtOnce;if(a&&cancelAnimationFrame(a),F.length)if(i>0)for(e=0;e<i;e++)F.length&&(R++,E(F.splice(0,o)).always(function(){R--,q()}));else a=requestAnimationFrame(function(){F.length&&q()})},H=t.droppable.drop,_=e.extend(!0,{},t.droppable,{over:function(n,i){var a,o,r=e(this),s=i.helper,l=z+" "+C;return n.stopPropagation(),s.data("dropover",s.data("dropover")+1),r.data("dropover",!0),i.helper.data("namespace")===t.namespace&&t.insideWorkzone(n.pageX,n.pageY)?M(n.clientX)?(s.removeClass("elfinder-drag-helper-move elfinder-drag-helper-plus"),r.addClass(z),r.is("."+v+":not(."+b+")")&&r.data("expandTimer",setTimeout(function(){r.is("."+v+"."+z)&&r.children("."+x).trigger("click")},500)),r.is(".elfinder-ro,.elfinder-na")?void r.removeClass(C):(a=t.navId2Hash(r.attr("id")),r.data("dropover",a),e.each(i.helper.data("files"),function(e,n){if(n===a||t.file(n).phash===a&&!i.helper.hasClass("elfinder-drag-helper-plus"))return r.removeClass(l),!1}),s.data("locked")?o="elfinder-drag-helper-plus":(o="elfinder-drag-helper-move",(n.shiftKey||n.ctrlKey||n.metaKey)&&(o+=" elfinder-drag-helper-plus")),r.hasClass(C)&&s.addClass(o),void requestAnimationFrame(function(){r.hasClass(C)&&s.addClass(o)}))):void r.removeClass(l):(r.removeClass(l),void s.removeClass("elfinder-drag-helper-move elfinder-drag-helper-plus"))},out:function(t,n){var i=e(this),a=n.helper;t.stopPropagation(),M(t.clientX)&&a.removeClass("elfinder-drag-helper-move elfinder-drag-helper-plus"),a.data("dropover",Math.max(a.data("dropover")-1,0)),i.data("expandTimer")&&clearTimeout(i.data("expandTimer")),i.removeData("dropover").removeClass(z+" "+C)},deactivate:function(){e(this).removeData("dropover").removeClass(z+" "+C)},drop:function(e,t){M(e.clientX)&&H.call(this,e,t)}}),N=e(t.res("tpl","navspinner")),L=t.res("tpl","navdir"),W=t.res("tpl","perms"),B=(t.res("tpl","lock"),t.res("tpl","symlink")),$={},K={id:function(e){return t.navHash2Id(e.hash)},name:function(e){return t.escape(e.i18||e.name)},cssclass:function(e){var i=(e.phash&&!e.isroot?"":d)+" "+m+" "+t.perms2class(e);return e.dirs&&!e.link&&(i+=" "+v)&&e.dirs==-1&&(i+=" "+w),n.getClass&&(i+=" "+n.getClass(e)),e.csscls&&(i+=" "+t.escape(e.csscls)),i},root:function(t){var n="";return!t.phash||t.isroot?(n+=" "+I,!t.disabled||t.disabled.length<1?n+=" "+O+" "+j:(e.inArray("paste",t.disabled)===-1&&(n+=" "+O),e.inArray("upload",t.disabled)===-1&&(n+=" "+j)),n):""},permissions:function(e){return e.read&&e.write?"":W},symlink:function(e){return e.alias?B:""},style:function(e){return e.icon?t.getIconStyle(e):""}},V=function(e){return L.replace(/(?:\{([a-z]+)\})/gi,function(t,n){var i=K[n]?K[n](e):e[n]||"";return"id"===n&&e.dirs==-1&&(D[i]=i),i})},X=function(n,i){return e.map(n||[],function(e){return"directory"!==e.mime||i&&!t.navHash2Elm(e.hash).length?null:e})},G=function(e){return e?t.navHash2Elm(e).next("."+f):oe},J=function(e,n){for(var i,a=e.children(":first");a.length;){if(i=t.file(t.navId2Hash(a.children("[id]").attr("id"))),(i=t.file(t.navId2Hash(a.children("[id]").attr("id"))))&&Q(n,i)<0)return a;a=a.next()}return e.children("button.elfinder-navbar-pager-next")},Y=function(i){for(var a,o,r,s,l,d,p=i.length,u=[],h=p,f=e(),m={},g=t.cwd(),v=function(i,a,o,r){var s={},l=0,d=t.newAPI?Math.min(1e4,Math.max(10,n.subTreeMax)):1e4,p=function(){s={},e.each(a,function(e,t){s[t.hash]=e})},u=function(t){"prepare"===t?e.each(a,function(e,t){t.node&&i.append(t.node.hide())}):"done"===t&&e.each(a,function(e,t){t.node&&t.node.detach().show()})},h=function(t,n){var i;return t.stopPropagation(),n.select?void v(f(n.select)):n.change?void u(n.change):(n.removed&&n.removed.length&&(a=e.grep(a,function(e){return n.removed.indexOf(e.hash)===-1||(!i&&(i=!0),!1)})),n.added&&n.added.length&&(a=a.concat(e.grep(n.added,function(e){return void 0===s[e.hash]&&(!i&&(i=!0),!0)}))),void(i&&(a.sort(Q),p(),v(l))))},f=function(e){if(void 0!==s[e])return Math.floor(s[e]/d)*d},m=t.navId2Hash(i.prev("[id]").attr("id")),v=function(n,o){var r,s,u,y,w,x,k,C,z=[],T={};delete $[m],l=n,i.off("update."+t.namespace,h),a.length>d&&(i.on("update."+t.namespace,h),void 0===n&&(u=0,p(),n=f(g.hash),void 0===n&&(n=0)),y=a.slice(n,n+d),$[m]=i,w=n?Math.max(-1,n-d):-1,x=n+d>=a.length?0:n+d,r=Math.ceil(a.length/d),s=Math.ceil(n/d)),e.each(y||a,function(e,t){z.push(V(t)),t.node&&(T[t.hash]=t.node)}),k=w>-1?e('<button class="elfinder-navbar-pager elfinder-navbar-pager-prev"/>').text(t.i18n("btnPrevious",s,r)).button({icons:{primary:"ui-icon-caret-1-n"}}).on("click",function(e){e.preventDefault(),e.stopPropagation(),v(w,"up")}):e(),C=x?e('<button class="elfinder-navbar-pager elfinder-navbar-pager-next"/>').text(t.i18n("btnNext",s+2,r)).button({icons:{primary:"ui-icon-caret-1-s"}}).on("click",function(e){e.preventDefault(),e.stopPropagation(),v(x,"down")}):e(),b(),i.empty()[y?"addClass":"removeClass"]("elfinder-navbar-hasmore").append(k,z.join(""),C),e.each(T,function(e,n){t.navHash2Elm(e).parent().replaceWith(n)}),o&&Z(t.navHash2Id(y["up"===o?y.length-1:0].hash)),!c&&t.lazy(function(){ie(null,i)})},b=function(){e.each(i.children(".elfinder-navbar-wrapper"),function(n,i){var o,r,l=e(i),c=l.children("[id]:first");c.hasClass(y)&&(o=t.navId2Hash(c.attr("id")),o&&void 0!==(r=s[o])&&(a[r].node=l.detach()))})};v()},b={},w=[],x=!0;h--;)a=i[h],m[a.hash]||t.navHash2Elm(a.hash).length||(m[a.hash]=!0,(o=G(a.phash)).length?a.phash&&((s=!o.children().length)||o.hasClass("elfinder-navbar-hasmore")||(r=J(o,a)).length)?s?(b[a.phash]||(b[a.phash]=[]),b[a.phash].push(a)):r?(d=V(a),r.before(d),!c&&(f=f.add(d))):w.push(a):(d=V(a),o[x||a.phash?"append":"prepend"](d),x=!1,a.phash&&!a.isroot||(l=t.navHash2Elm(a.hash).parent()),!c&&ie(null,l)):u.push(a));return Object.keys(b).length&&e.each(b,function(e,t){var n=G(e);t.sort(Q),v(n,t)}),w.length&&o.trigger("update."+t.namespace,{added:w}),u.length&&u.length<p?void Y(u):void(!c&&f.length&&t.lazy(function(){ie(f)}))},Q=function(e,n){if(t.sortAlsoTreeview){var i,a="asc"==t.sortOrder,o=t.sortType,r=t.sortRules;return i=a?r[t.sortType](e,n):r[t.sortType](n,e),"name"!==o&&0===i?i=a?r.name(e,n):r.name(n,e):i}return t.sortRules.name(e,n)},Z=function(i){var a,r,s,l,c,d,p=e.Deferred();return o&&clearTimeout(o),o=setTimeout(function(){a=e(document.getElementById(i||t.navHash2Id(t.cwd().hash))),a.length?((u?a:a.parent()).parents(".elfinder-navbar-wrapper").children("."+y).addClass(b).next("."+f).show(),r=oe.parent().stop(!1,!0),s=r.offset().top,l=r.height(),c=s+l-a.outerHeight(),d=a.offset().top,d<s||d>c?r.animate({scrollTop:r.scrollTop()+d-s-l/3},{duration:n.durations.autoScroll,complete:function(){p.resolve()}}):p.resolve()):p.reject()},100),p},ee=function(e){var n,i,a,o=e||t.cwd(),r=o.hash?[o.hash]:[];for(i=t.root(o.hash),a=t.file(i);a&&(n=a.phash)&&(r.unshift(n),i=t.root(n),a=t.file(i),!t.navHash2Elm(a.hash).hasClass(y)););return r},te=function(e){var n=e||t.cwd(),i=n.hash,a=t.navHash2Elm(i);if(!a.length){for(;n&&n.phash;)$[n.phash]&&!t.navHash2Elm(n.hash).length&&$[n.phash].trigger("update."+t.namespace,{select:n.hash}),n=t.file(n.phash);a=t.navHash2Elm(i)}return a},ne=function(n,i){var a,o,s=t.cwd(),l=s.hash,c=void 0===i?h:i,d=function(n){var i,r,s=e.Deferred(),l=[],d=ee(n),p=function(e,n,i){var a={cmd:e,target:n};return i&&(a.until=i),t.request({data:a,preventFail:!0})};return l=e.map(d,function(e){var n,a,o=t.file(e),r=!!o&&t.isRoot(o),s=t.navHash2Elm(e),l=function(e,n){var i,a,o=n||1;return a=!!(i=t.file(e))&&i.phash,a&&o>1?l(a,--o):a},c=function(){var i=l(e);for(n=i;i&&!t.navHash2Elm(i).hasClass(y);)n=i,i=l(i);return i||(n=void 0,i=t.root(e)),i}();return s.hasClass(y)||!r&&o&&t.navHash2Elm(o.phash).hasClass(y)?null:(r||c===l(e)||c===l(e,2)?(n=void 0,a="tree",r||(e=l(e))):a="parents",i||(i="tree"===a?e:c),p(a,e,n))}),l.length?(te(t.file(i)),r=t.navHash2Id(i),c&&Z(r),a=e("#"+r),o=e(t.res("tpl","navspinner")).insertBefore(a.children("."+x)),a.removeClass(v),e.when.apply(e,l).done(function(){var e,t,n,i={};if(t=arguments.length,t>0)for(n=0;n<t;n++)e=arguments[n].tree||[],i[d[n]]=Object.assign([],X(e));s.resolve(i)}).fail(function(){s.reject()}),s):s.resolve()},u=function(i,o){var r,l=function(){p&&a&&(G(a.hash).show().prev(g).addClass(b),p=!1),c?Z().done(P):P()};i&&e.each(i,function(e,n){n&&Y(n),te(t.file(e)),n&&ae(n,y)}),n&&(t.api<2.1&&n.push(s),Y(n)),r=te(),r.hasClass(k)||(oe.find(g+"."+k).removeClass(k),r.addClass(k)),r.parents(".elfinder-navbar-wrapper").children("."+m).addClass(y),i?t.lazy(l).done(function(){o.resolve()}):(l(),o.resolve())},f=function(e){a&&(o.remove(),a.addClass(v+(e?"":" "+y)))},w=e.Deferred();return t.navHash2Elm(l).length?u(void 0,w):(r=!0,d().done(function(e){u(e,w),f()}).fail(function(){f(!0),w.reject()}).always(function(){r=!1})),t.trigger("treesync",w),w},ie=function(n,i){n||(i&&!i.closest("div."+I).hasClass(j)||(i||oe.find("div."+j)).find(g+":not(.elfinder-ro,.elfinder-na)").addClass("native-droppable"),n=!i||i.closest("div."+I).hasClass(O)?(i||oe.find("div."+O)).find(g+":not(."+S+")"):e(),i&&i.children("div."+I).each(function(){ie(null,e(this))})),n.length&&t.asyncJob(function(t){e(t).droppable(_)},e.makeArray(n),{interval:20,numPerOnce:100})},ae=function(n,i){var a=i==y?"."+v+":not(."+y+")":":not(."+v+")";e.each(n,function(n,o){t.navHash2Elm(o.phash).filter(a).filter(function(){return e.grep(e(this).next("."+f).children(),function(t){return!e(t).children().hasClass(d)}).length>0}).addClass(i)})},oe=e(this).addClass(i).on("mouseenter mouseleave",g,function(n){var i="mouseenter"===n.type;if(!i||!re){var a=e(this);a.hasClass(C+" "+T)||(c||!i||a.data("dragRegisted")||a.hasClass(d+" "+A+" elfinder-na elfinder-wo")||(a.data("dragRegisted",!0),t.isCommandEnabled("copy",t.navId2Hash(a.attr("id")))&&a.draggable(t.draggable)),a.toggleClass(z,i))}}).on("dragenter",g,function(t){if(t.originalEvent.dataTransfer){var n=e(this);n.addClass(z),n.is("."+v+":not(."+b+")")&&n.data("expandTimer",setTimeout(function(){n.is("."+v+"."+z)&&n.children("."+x).trigger("click")},500))}}).on("dragleave",g,function(t){if(t.originalEvent.dataTransfer){var n=e(this);n.data("expandTimer")&&clearTimeout(n.data("expandTimer")),n.removeClass(z)}}).on("click",g,function(n){var i=e(this),a=t.navId2Hash(i.attr("id"));t.file(a);return i.data("longtap")?(i.removeData("longtap"),void n.stopPropagation()):(i.hasClass(k)||(oe.find(g+"."+k).removeClass(k),i.addClass(k)),void(a==t.cwd().hash||i.hasClass(T)?(i.hasClass(v)&&i.children("."+x).trigger("click"),t.select({selected:[a],origin:"navbar"})):t.exec("open",a).done(function(){t.one("opendone",function(){t.select({selected:[a],origin:"navbar"})})})))}).on("touchstart",g,function(n){if(!(n.originalEvent.touches.length>1)){var i,a=n.originalEvent;return"INPUT"===n.target.nodeName?void n.stopPropagation():void(i=e(this).addClass(z).removeData("longtap").data("tmlongtap",setTimeout(function(e){i.data("longtap",!0),t.trigger("contextmenu",{type:"navbar",targets:[t.navId2Hash(i.attr("id"))],x:a.touches[0].pageX,y:a.touches[0].pageY})},500)))}}).on("touchmove touchend",g,function(t){return"INPUT"===t.target.nodeName?void t.stopPropagation():(clearTimeout(e(this).data("tmlongtap")),void("touchmove"==t.type&&e(this).removeClass(z)))}).on("click",g+"."+v+" ."+x,function(i){var a,o=e(this),r=o.parent(g),s=r.next("."+f),l=e.Deferred(),c=30;i.stopPropagation(),r.hasClass(y)?(r.toggleClass(b),t.lazy(function(){a=r.hasClass(b)?s.children().length+s.find("div.elfinder-navbar-subtree[style*=block]").children().length:s.find("div:visible").length,a>c?(s.toggle(),t.draggingUiHelper&&t.draggingUiHelper.data("refreshPositions",1),P()):s.stop(!0,!0)[r.hasClass(b)?"slideDown":"slideUp"](n.durations.slideUpDown,function(){t.draggingUiHelper&&t.draggingUiHelper.data("refreshPositions",1),P()})}).always(function(){l.resolve()})):(N.insertBefore(o),r.removeClass(v),t.request({cmd:"tree",target:t.navId2Hash(r.attr("id"))}).done(function(e){Y(Object.assign([],X(e.tree))),s.children().length&&(r.addClass(v+" "+b),s.children().length>c?(s.show(),t.draggingUiHelper&&t.draggingUiHelper.data("refreshPositions",1),P()):s.stop(!0,!0).slideDown(n.durations.slideUpDown,function(){t.draggingUiHelper&&t.draggingUiHelper.data("refreshPositions",1),P()}))}).always(function(e){N.remove(),r.addClass(y),t.one("treedone",function(){l.resolve()})})),o.data("dfrd",l)}).on("contextmenu",g,function(n){var i=e(this);return i.find("input:text").length?void n.stopPropagation():(n.preventDefault(),t.trigger("contextmenu",{type:"navbar",targets:[t.navId2Hash(e(this).attr("id"))],x:n.pageX,y:n.pageY}),i.addClass("ui-state-hover"),t.getUI("contextmenu").children().on("mouseenter",function(){i.addClass("ui-state-hover")}),void t.bind("closecontextmenu",function(){i.removeClass("ui-state-hover")}))}).on("scrolltoview",g,function(n,i){var a=e(this);Z(a.attr("id")).done(function(){i&&"undefined"!==i.blink&&!i.blink||t.resources.blink(a,"lookme")})}).on("create."+t.namespace,function(n,i){var a=G(i.phash),o=i.move||!1,r=e(V(i)).addClass("elfinder-navbar-wrapper-tmp"),s=t.selected();o&&s.length&&t.trigger("lockfiles",{files:s}),a.prepend(r)}),re=!1,se=t.getUI("navbar").append(oe).show().on("scroll",function(){re=!0,
s&&cancelAnimationFrame(s),s=requestAnimationFrame(function(){re=!1,P()})}),le=t.sortAlsoTreeview;t.open(function(e){var n=e.data,i=X(n.files),a=t.getUI("contextmenu");n.init&&oe.empty(),t.UA.iOS&&se.removeClass("overflow-scrolling-touch").addClass("overflow-scrolling-touch"),i.length?t.lazy(function(){a.data("cmdMaps")||a.data("cmdMaps",{}),Y(i),ae(i,y),ne(i)}):ne()}).add(function(e){var t=X(e.data.added);t.length&&(Y(t),ae(t,v))}).change(function(n){if(!r){var i,a,o,s,l,d,p,u,h,m,v,w,x=X(n.data.changed,!0),k=x.length,C=k;e();for(e.each($,function(e,n){n.trigger("update."+t.namespace,{change:"prepare"})});C--;)if(i=x[C],a=i.phash,(o=t.navHash2Elm(i.hash)).length){if(v=o.parent(),a){if(l=o.closest("."+f),d=G(a),p=o.parent().next(),u=J(d,i),!d.length)continue;d[0]===l[0]&&p.get(0)===u.get(0)||(u.length?u.before(v):d.append(v))}h=o.hasClass(b),m=o.hasClass(y),s=e(V(i)),o.replaceWith(s.children(g)),!c&&ie(null,v),i.dirs&&(h||m)&&(o=t.navHash2Elm(i.hash))&&o.next("."+f).children().length&&(h&&o.addClass(b),m&&o.addClass(y)),w|=i.dirs==-1}w&&P(),e.each($,function(e,n){n.trigger("update."+t.namespace,{change:"done"})}),k&&ne(void 0,!1)}}).remove(function(n){var i,a,o,r=n.data.removed,s=r.length;for(e.each($,function(e,n){n.trigger("update."+t.namespace,{removed:r}),n.trigger("update."+t.namespace,{change:"prepare"})});s--;)(i=t.navHash2Elm(r[s])).length&&(o=!0,a=i.closest("."+f),i.parent().detach(),a.children().length||a.hide().prev(g).removeClass(v+" "+b+" "+y));o&&t.getUI("navbar").children(".ui-resizable-handle").trigger("resize"),e.each($,function(e,n){n.trigger("update."+t.namespace,{change:"done"})})}).bind("lockfiles unlockfiles",function(n){var i="lockfiles"==n.type,a=!!n.data.helper&&n.data.helper.data("locked"),o=i&&!a?"disable":"enable",r=e.grep(n.data.files||[],function(e){var n=t.file(e);return!(!n||"directory"!=n.mime)});e.each(r,function(e,n){var r=t.navHash2Elm(n);r.length&&!a&&(r.hasClass(A)&&r.draggable(o),r.hasClass(S)&&r.droppable(o),r[i?"addClass":"removeClass"](T))})}).bind("sortchange",function(){if(t.sortAlsoTreeview||le!==t.sortAlsoTreeview){var n,i,a=[],o={},r={},s="",l=!1;t.lazy(function(){n=X(t.files()),le=t.sortAlsoTreeview,oe.empty(),Y(e.map(t.roots,function(e){var n=t.file(e);return n&&!n.phash?n:null})),Object.keys($).length?(a=ee(),a.length>1?(e.each(a,function(e,n){var i=t.file(t.root(n)).volumeid;0===e&&(s=i),r[i]=n,o[n]=[]}),e.each(n,function(e,t){return t.volumeid?void o[r[t.volumeid]||r[s]].push(t):(l=!0,!1)})):l=!0,l?e.each(a,function(e,a){Y(n),i=te(t.file(a)),ae(n,y)}):e.each(o,function(e,n){Y(n),i=te(t.file(e)),ae(n,y)})):(Y(n),i=te(),ae(n,y)),ne()},100)}})}),this},e.fn.elfinderuploadbutton=function(t){return this.each(function(){var n,i=t.fm,a=e(this).elfinderbutton(t).off("click"),o=e("<form/>").appendTo(a),r=e('<input type="file" multiple="true" title="'+t.fm.i18n("selectForUpload")+'"/>').on("change",function(){var t=e(this);t.val()&&(i.exec("upload",{input:t.remove()[0]},void 0,i.cwd().hash),r.clone(!0).appendTo(o))}).on("dragover",function(e){e.originalEvent.dataTransfer.dropEffect="copy"});o.append(r.clone(!0)),t.change(function(){n&&cancelAnimationFrame(n),n=requestAnimationFrame(function(){var e=t.disabled();o.is("visible")?!e&&o.hide():e&&o.show()})}).change()})},e.fn.elfinderviewbutton=function(t){return this.each(function(){var n,i=e(this).elfinderbutton(t),a=i.children(".elfinder-button-icon"),o=i.children(".elfinder-button-text");t.change(function(){n&&cancelAnimationFrame(n),n=requestAnimationFrame(function(){var e="icons"==t.value;a.toggleClass("elfinder-button-icon-view-list",e),t.className=e?"view-list":"",t.title=t.fm.i18n(e?"viewlist":"viewicons"),i.attr("title",t.title),o.html(t.title)})})})},e.fn.elfinderworkzone=function(t){var n="elfinder-workzone";return this.not("."+n).each(function(){var i,a=e(this).addClass(n),o=Math.round(a.height()),r=a.parent(),s=function(){i=a.outerHeight(!0)-a.height()},l=function(s){var l=r.height()-i,c=r.attr("style"),d=Math.round(a.height());s&&(s.preventDefault(),s.stopPropagation()),r.css("overflow","hidden").children(":visible:not(."+n+")").each(function(){var t=e(this);"absolute"!=t.css("position")&&"fixed"!=t.css("position")&&(l-=t.outerHeight(!0))}),r.attr("style",c||""),l=Math.max(0,Math.round(l)),o===l&&d===l||(o=Math.round(a.height()),a.height(l),t.trigger("wzresize"))},c=function(){i=a.outerHeight(!0)-a.height(),l()};s(),r.on("resize."+t.namespace,l),t.one("cssloaded",c).bind("uiresize",l).bind("themechange",s)}),this},i.prototype.commands.archive=function(){var t,n=this,i=n.fm,a=[];this.variants=[],this.disableOnSearch=!1,this.nextAction={},i.bind("open reload",function(){n.variants=[],e.each(a=i.option("archivers").create||[],function(e,t){n.variants.push([t,i.mime2kind(t)])}),n.change()}),this.getstate=function(n){var o,r=this.files(n),s=r.length,l=s&&!i.isRoot(r[0])&&(i.file(r[0].phash)||{}).write&&!e.grep(r,function(e){return!e.read}).length;return l&&i.searchStatus.state>1&&(o=i.cwd().volumeid,l=s===e.grep(r,function(e){return!(!e.read||0!==e.hash.indexOf(o))}).length),l&&!this._disabled&&a.length&&(s||t&&"pending"==t.state())?0:-1},this.exec=function(o,r){var s,l,c=this.files(o),d=c.length,p=r||a[0],u=i.file(c[0].phash)||null,h=["errArchive","errPerm","errCreatingTempDir","errFtpDownloadFile","errFtpUploadFile","errFtpMkdir","errArchiveExec","errExtractExec","errRm"];if(t=e.Deferred().fail(function(e){e&&i.error(e)}),!d||!a.length||e.inArray(p,a)===-1)return t.reject();if(!u.write)return t.reject(h);for(s=0;s<d;s++)if(!c[s].read)return t.reject(h);return n.mime=p,n.prefix=(d>1?"Archive":c[0].name)+(i.option("archivers").createext?"."+i.option("archivers").createext[p]:""),n.data={targets:n.hashes(o),type:p},i.cwd().hash!==u.hash?l=i.exec("open",u.hash).done(function(){i.one("cwdrender",function(){i.selectfiles({files:o}),t=e.proxy(i.res("mixin","make"),n)()})}):(i.selectfiles({files:o}),t=e.proxy(i.res("mixin","make"),n)()),t}},(i.prototype.commands.back=function(){this.alwaysEnabled=!0,this.updateOnSelect=!1,this.shortcuts=[{pattern:"ctrl+left backspace"}],this.getstate=function(){return this.fm.history.canBack()?0:-1},this.exec=function(){return this.fm.history.back()}}).prototype={forceLoad:!0},i.prototype.commands.chmod=function(){this.updateOnSelect=!1;var t=this.fm,n={0:"owner",1:"group",2:"other"},i={read:t.i18n("read"),write:t.i18n("write"),execute:t.i18n("execute"),perm:t.i18n("perm"),kind:t.i18n("kind"),files:t.i18n("files")},a=function(e){return!isNaN(parseInt(e,8)&&parseInt(e,8)<=511)||e.match(/^([r-][w-][x-]){3}$/i)};this.tpl={main:'<div class="ui-helper-clearfix elfinder-info-title"><span class="elfinder-cwd-icon {class} ui-corner-all"/>{title}</div>{dataTable}',itemTitle:'<strong>{name}</strong><span id="elfinder-info-kind">{kind}</span>',groupTitle:"<strong>{items}: {num}</strong>",dataTable:'<table id="{id}-table-perm"><tr><td>{0}</td><td>{1}</td><td>{2}</td></tr></table><div class="">'+i.perm+': <input class="elfinder-tabstop elfinder-focus" id="{id}-perm" type="text" size="4" maxlength="3" value="{value}"></div>',fieldset:'<fieldset id="{id}-fieldset-{level}"><legend>{f_title}{name}</legend><input type="checkbox" value="4" class="elfinder-tabstop" id="{id}-read-{level}-perm"{checked-r}> <label for="{id}-read-{level}-perm">'+i.read+'</label><br><input type="checkbox" value="6" class="elfinder-tabstop" id="{id}-write-{level}-perm"{checked-w}> <label for="{id}-write-{level}-perm">'+i.write+'</label><br><input type="checkbox" value="5" class="elfinder-tabstop" id="{id}-execute-{level}-perm"{checked-x}> <label for="{id}-execute-{level}-perm">'+i.execute+"</label><br>"},this.shortcuts=[{}],this.getstate=function(e){var t=this.fm;return e=e||t.selected(),0==e.length&&(e=[t.cwd().hash]),this.checkstate(this.files(e))?0:-1},this.checkstate=function(t){var n=t.length;if(!n)return!1;var i=e.grep(t,function(e){return!(!(e.isowner&&e.perm&&a(e.perm))||1!=n&&"directory"==e.mime)}).length;return n==i},this.exec=function(t){var o=this.hashes(t),r=this.files(o);r.length||(o=[this.fm.cwd().hash],r=this.files(o));var s,l,c=this.fm,d=e.Deferred().always(function(){c.enable()}),p=this.tpl,u=r.length,h=r[0],f=c.namespace+"-perm-"+h.hash,m=p.main,g=' checked="checked"',v=function(){var e={};return e[c.i18n("btnApply")]=b,e[c.i18n("btnCancel")]=function(){A.elfinderdialog("close")},e},b=function(){var t,n=e.trim(e("#"+f+"-perm").val());return!!a(n)&&(A.elfinderdialog("close"),t={cmd:"chmod",targets:o,mode:n},void c.request({data:t,notify:{type:"chmod",cnt:u}}).fail(function(e){d.reject(e)}).done(function(n){n.changed&&n.changed.length&&(n.undo={cmd:"chmod",callback:function(){var t=[];return e.each(S,function(e,n){t.push(c.request({data:{cmd:"chmod",targets:n,mode:e},notify:{type:"undo",cnt:n.length}}))}),e.when.apply(null,t)}},n.redo={cmd:"chmod",callback:function(){return c.request({data:t,notify:{type:"redo",cnt:o.length}})}}),d.resolve(n)}))},y=function(){for(var t,i="",a=0;a<3;a++)t=0,e("#"+f+"-read-"+n[a]+"-perm").is(":checked")&&(t=4|t),e("#"+f+"-write-"+n[a]+"-perm").is(":checked")&&(t=2|t),e("#"+f+"-execute-"+n[a]+"-perm").is(":checked")&&(t=1|t),i+=t.toString(8);e("#"+f+"-perm").val(i)},w=function(t){for(var i,a=0;a<3;a++)i=parseInt(t.slice(a,a+1),8),e("#"+f+"-read-"+n[a]+"-perm").prop("checked",!1),e("#"+f+"-write-"+n[a]+"-perm").prop("checked",!1),e("#"+f+"-execute-"+n[a]+"-perm").prop("checked",!1),4==(4&i)&&e("#"+f+"-read-"+n[a]+"-perm").prop("checked",!0),2==(2&i)&&e("#"+f+"-write-"+n[a]+"-perm").prop("checked",!0),1==(1&i)&&e("#"+f+"-execute-"+n[a]+"-perm").prop("checked",!0);y()},x=function(e){for(var t,n,i,a="777",o="",r=e.length,s=0;s<r;s++){t=z(e[s].perm),S[t]||(S[t]=[]),S[t].push(e[s].hash),o="";for(var l=0;l<3;l++)n=parseInt(t.slice(l,l+1),8),i=parseInt(a.slice(l,l+1),8),4!=(4&n)&&4==(4&i)&&(i-=4),2!=(2&n)&&2==(2&i)&&(i-=2),1!=(1&n)&&1==(1&i)&&(i-=1),o+=i.toString(8);a=o}return a},k=function(e){return e?":"+e:""},C=function(e,t){for(var a,o,r="",s=p.dataTable,l=0;l<3;l++)a=parseInt(e.slice(l,l+1),8),r+=a.toString(8),o=p.fieldset.replace("{f_title}",c.i18n(n[l])).replace("{name}",k(t[n[l]])).replace(/\{level\}/g,n[l]),s=s.replace("{"+l+"}",o).replace("{checked-r}",4==(4&a)?g:"").replace("{checked-w}",2==(2&a)?g:"").replace("{checked-x}",1==(1&a)?g:"");return s=s.replace("{value}",r).replace("{valueCaption}",i.perm)},z=function(e){if(isNaN(parseInt(e,8))){for(var t=e.split(""),n=[],i=0,a=t.length;i<a;i++)0===i||3===i||6===i?t[i].match(/[r]/i)?n.push(1):t[i].match(/[-]/)&&n.push(0):1===i||4===i||7===i?t[i].match(/[w]/i)?n.push(1):t[i].match(/[-]/)&&n.push(0):t[i].match(/[x]/i)?n.push(1):t[i].match(/[-]/)&&n.push(0);n.splice(3,0,","),n.splice(7,0,",");for(var o=n.join(""),r=o.split(","),s=[],l=0,c=r.length;l<c;l++){var d=parseInt(r[l],2).toString(8);s.push(d)}e=s.join("")}else e=parseInt(e,8).toString(8);return e},T={title:this.title,width:"auto",buttons:v(),close:function(){e(this).elfinderdialog("destroy")}},A=c.getUI().find("#"+f),S={},I="";return A.length?(A.elfinderdialog("toTop"),e.Deferred().resolve()):(m=m.replace("{class}",u>1?"elfinder-cwd-icon-group":c.mime2class(h.mime)),u>1?s=p.groupTitle.replace("{items}",c.i18n("items")).replace("{num}",u):(s=p.itemTitle.replace("{name}",h.name).replace("{kind}",c.mime2kind(h)),I=c.tmb(h)),l=C(x(r),1==r.length?r[0]:{}),m=m.replace("{title}",s).replace("{dataTable}",l).replace(/{id}/g,f),A=this.fmDialog(m,T),A.attr("id",f),I&&e("<img/>").on("load",function(){A.find(".elfinder-cwd-icon").addClass(I.className).css("background-image","url('"+I.url+"')")}).attr("src",I.url),e("#"+f+"-table-perm :checkbox").on("click",function(){y("perm")}),e("#"+f+"-perm").on("keydown",function(t){var n=t.keyCode;if(n==e.ui.keyCode.ENTER)return t.stopPropagation(),void b()}).on("focus",function(t){e(this).trigger("select")}).on("keyup",function(t){3==e(this).val().length&&(e(this).trigger("select"),w(e(this).val()))}),d)}},i.prototype.commands.colwidth=function(){this.alwaysEnabled=!0,this.updateOnSelect=!1,this.getstate=function(){return"fixed"===this.fm.getUI("cwd").find("table").css("table-layout")?0:-1},this.exec=function(){return this.fm.getUI("cwd").trigger("colwidth"),e.Deferred().resolve()}},i.prototype.commands.copy=function(){this.shortcuts=[{pattern:"ctrl+c ctrl+insert"}],this.getstate=function(t){var n=this.files(t),i=n.length;return i&&e.grep(n,function(e){return!!e.read}).length==i?0:-1},this.exec=function(t){var n=this.fm,i=e.Deferred().fail(function(e){n.error(e)});return e.each(this.files(t),function(e,t){if(!t.read)return!i.reject(["errCopy",t.name,"errPerm"])}),"rejected"==i.state()?i:i.resolve(n.clipboard(this.hashes(t)))}},i.prototype.commands.cut=function(){var t=this.fm;this.shortcuts=[{pattern:"ctrl+x shift+insert"}],this.getstate=function(n){var i=this.files(n),a=i.length;return a&&e.grep(i,function(e){return!(!e.read||e.locked||t.isRoot(e))}).length==a?0:-1},this.exec=function(n){var i=e.Deferred().fail(function(e){t.error(e)});return e.each(this.files(n),function(e,n){return!n.read||n.locked||t.isRoot(n)?!i.reject(["errCopy",n.name,"errPerm"]):n.locked?!i.reject(["errLocked",n.name]):void 0}),"rejected"==i.state()?i:i.resolve(t.clipboard(this.hashes(n),!0))}},i.prototype.commands.zipdl=function(){},i.prototype.commands.download=function(){var t=this,n=this.fm,i=null,a=!1,o=!1,r=!1,s=window.location.pathname||"/",l=function(r,s){var l,c;if(null!==i&&(n.searchStatus.state>1?o=n.searchStatus.mixed:n.leafRoots[n.cwd().hash]&&(l=n.cwd().volumeid,e.each(r,function(e,t){if(0!==t.indexOf(l))return o=!0,!1})),a=n.isCommandEnabled("zipdl",r[0])),o){if(c=i?"zipdl":"download",r=e.grep(r,function(e){var t=n.file(e),a=!(!t||!i&&"directory"===t.mime||!n.isCommandEnabled(c,e));return t&&s&&!a&&n.cwdHash2Elm(t.hash).trigger("unselect"),a}),!r.length)return[]}else if(!n.isCommandEnabled("download",r[0]))return[];return e.grep(t.files(r),function(e){var t=!(!e.read||!a&&"directory"==e.mime);return s&&!t&&n.cwdHash2Elm(e.hash).trigger("unselect"),t})};this.linkedCmds=["zipdl"],this.shortcuts=[{pattern:"shift+enter"}],this.getstate=function(e){var t=this.hashes(e),i=t.length,o=this.options.maxRequests||10;return i<1?-1:(i=l(t).length,i&&(a||i<=o&&(!n.UA.IE&&!n.UA.Mobile||1==i))?0:-1)},n.bind("contextmenu",function(n){var i,a,o=t.fm,r=null,s=function(t){var n=t.url||o.url(t.hash);return{icon:"link",node:e("<a/>").attr({href:n,target:"_blank",title:o.i18n("link")}).text(t.name).on("mousedown click touchstart touchmove touchend contextmenu",function(e){e.stopPropagation()}).on("dragstart",function(n){var i=n.dataTransfer||n.originalEvent.dataTransfer||null;if(r=null,i){var a=function(t){var n,i=t.mime,a=o.tmb(t);return n='<div class="elfinder-cwd-icon '+o.mime2class(i)+' ui-corner-all"/>',a&&(n=e(n).addClass(a.className).css("background-image","url('"+a.url+"')").get(0).outerHTML),n};i.effectAllowed="copyLink",i.setDragImage&&(r=e('<div class="elfinder-drag-helper html5-native">').append(a(t)).appendTo(e(document.body)),i.setDragImage(r.get(0),50,47)),o.UA.IE||(i.setData("elfinderfrom",window.location.href+t.phash),i.setData("elfinderfrom:"+i.getData("elfinderfrom"),""))}}).on("dragend",function(e){r&&r.remove()})}};if(t.extra=null,n.data&&(i=n.data.targets||[],1===i.length&&(a=o.file(i[0]))&&"directory"!==a.mime))if("1"!=a.url)t.extra=s(a);else{var l;t.extra={icon:"link",node:e("<a/>").attr({href:"#",title:o.i18n("getLink"),draggable:"false"}).text(a.name).on("click touchstart",function(e){if(!("touchstart"===e.type&&e.originalEvent.touches.length>1)){var t=l.parent();e.stopPropagation(),e.preventDefault(),t.removeClass("ui-state-disabled").addClass("elfinder-button-icon-spinner"),o.request({data:{cmd:"url",target:a.hash},preventDefault:!0}).always(function(e){if(t.removeClass("elfinder-button-icon-spinner"),e.url){var n=o.file(a.hash);n.url=e.url,l.replaceWith(s(a).node)}else t.addClass("ui-state-disabled")})}})},l=t.extra.node,l.ready(function(){requestAnimationFrame(function(){l.parent().addClass("ui-state-disabled").css("pointer-events","auto")})})}}).one("open",function(){n.api>=2.1012&&(i=n.getCommand("zipdl")),r=n.api>2.1038&&!n.isCORS}),this.exec=function(n){var i,c,d,p,u,h,f,m=this.hashes(n),g=this.fm,v=(g.options.url,l(m,!0)),b=e.Deferred(),y="",w={},x=!1,k=function(n){return function(){var i,a,o,r=e.Deferred(),s=g.file(g.root(n[0])),l=1===n.length,d=s?s.i18||s.name:null;return l?(i=g.file(n[0]))&&(a=i.i18||i.name):(e.each(n,function(){var e=g.file(this);return!e||o&&o!==e.phash?(o=null,!1):void(o=e.phash)}),o&&(i=g.file(o))&&(a=(i.i18||i.name)+"-"+n.length)),a&&(d=a),d&&(d=" ("+d+")"),g.request({data:{cmd:"zipdl",targets:n},notify:{type:"zipdl",cnt:1,hideCnt:!0,msg:g.i18n("ntfzipdl")+d},cancel:!0,eachCancel:!0,preventDefault:!0}).done(function(i){var o,s,l,d,u,h,f={},m="dlw"+ +new Date;i.error?(g.error(i.error),r.resolve()):i.zipdl&&(o=i.zipdl,a?(h=g.splitFileExtention(o.name||""),a+=h[1]?"."+h[1]:".zip"):a=o.name,p&&(!g.UA.Safari||g.isSameOrigin(g.options.url))||x?(c=g.options.url+(g.options.url.indexOf("?")===-1?"?":"&")+"cmd=zipdl&download=1",e.each([n[0],o.file,a,o.mime],function(e,t){c+="&targets%5B%5D="+encodeURIComponent(t)}),e.each(g.customData,function(e,t){c+="&"+encodeURIComponent(e)+"="+encodeURIComponent(t)}),c+="&"+encodeURIComponent(a),l=e("<a/>").attr("href",c).attr("download",g.escape(a)).on("click",function(){r.resolve(),s&&s.elfinderdialog("destroy")}),x?(l.attr("target","_blank").append('<span class="elfinder-button-icon elfinder-button-icon-download"></span>'+g.escape(a)),f[g.i18n("btnCancel")]=function(){s.elfinderdialog("destroy")},s=t.fmDialog(l,{title:g.i18n("link"),buttons:f,width:"200px",destroyOnClose:!0,close:function(){"resolved"!==r.state()&&r.resolve()}})):(C(l.hide().appendTo("body").get(0)),l.remove())):(d=e('<form action="'+g.options.url+'" method="post" target="'+m+'" style="display:none"/>').append('<input type="hidden" name="cmd" value="zipdl"/>').append('<input type="hidden" name="download" value="1"/>'),e.each([n[0],o.file,a,o.mime],function(e,t){d.append('<input type="hidden" name="targets[]" value="'+g.escape(t)+'"/>')}),e.each(g.customData,function(e,t){d.append('<input type="hidden" name="'+e+'" value="'+g.escape(t)+'"/>')}),d.attr("target",m).appendTo("body"),u=e('<iframe style="display:none" name="'+m+'">').appendTo("body").ready(function(){d.submit().remove(),r.resolve(),setTimeout(function(){u.remove()},2e4)})))}).fail(function(e){e&&g.error(e),r.resolve()}),r.promise()}},C=function(e){var t;"function"==typeof MouseEvent?t=new MouseEvent("click"):(t=document.createEvent("MouseEvents"),t.initMouseEvent("click",!0,!0,window,0,0,0,0,0,!1,!1,!1,!1,0,null)),e.dispatchEvent(t)},z=function(e){var t,n="elfdl"+e;t=document.cookie.split(n+"="),2===t.length?(h&&clearTimeout(h),document.cookie=n+"=; path="+s+"; max-age=0",T()):setTimeout(function(){z(e)},200)},T=function(){g.ui.notify.children(".elfinder-notify-download").length&&g.notify({type:"download",cnt:-1})},A=[];if(!v.length)return b.reject();if(u=e.grep(v,function(e){return"directory"!==e.mime}).length,d=e("<a>").hide().appendTo("body"),p="string"==typeof d.get(0).download,a&&(u!==v.length||u>=(this.options.minFilesZipdl||1)))return d.remove(),x=!p&&g.UA.Mobile,o?(w={},e.each(v,function(e,t){var n=t.hash.split("_",2);w[n[0]]?w[n[0]].push(t.hash):w[n[0]]=[t.hash]}),!x&&g.UA.Mobile&&Object.keys(w).length>1&&(x=!0)):w=[e.map(v,function(e){return e.hash})],b=g.sequence(e.map(w,function(e){return k(e)})).always(function(){g.trigger("download",{files:v})});for(A=[],i=0;i<v.length;i++)c=g.openUrl(v[i].hash,!0),r&&c.substr(0,g.options.url.length)===g.options.url&&(f=g.getRequestId(),A.push(f),c+="&cpath="+s+"&reqid="+f,h=setTimeout(function(){g.notify({type:"download",cnt:1,cancel:g.UA.IE||g.UA.Edge?void 0:function(){A.length&&e.each(A,function(){g.request({data:{cmd:"abort",id:this},preventDefault:!0})}),A=[]}})},g.notifyDelay),z(f)),!p||g.UA.Safari&&!g.isSameOrigin(c)?g.UA.Mobile?setTimeout(function(){window.open(c)||(g.error("errPopup"),h&&cleaerTimeout(h),T())},100):y+='<iframe class="downloader" id="downloader-'+v[i].hash+'" style="display:none" src="'+c+'"/>':C(d.attr("href",c).attr("download",g.escape(v[i].name)).get(0));return d.remove(),e(y).appendTo("body").ready(function(){setTimeout(function(){e(y).each(function(){e("#"+e(this).attr("id")).remove()})},2e4+1e4*i)}),g.trigger("download",{files:v}),b.resolve()}},i.prototype.commands.duplicate=function(){var t=this.fm;this.getstate=function(n){var i=this.files(n),a=i.length;return a&&t.cwd().write&&e.grep(i,function(e){return!(!e.read||e.phash!==t.cwd().hash||t.isRoot(e))}).length==a?0:-1},this.exec=function(t){var n=this.fm,i=this.files(t),a=i.length,o=e.Deferred().fail(function(e){e&&n.error(e)});return a?(e.each(i,function(e,t){if(!t.read||!n.file(t.phash).write)return!o.reject(["errCopy",t.name,"errPerm"])}),"rejected"==o.state()?o:n.request({data:{cmd:"duplicate",targets:this.hashes(t)},notify:{type:"copy",cnt:a},navigate:{toast:{inbuffer:{msg:n.i18n(["complete",n.i18n("cmdduplicate")])}}}})):o.reject()}},i.prototype.commands.edit=function(){var t,n=this,i=this.fm,a=i.res("class","editing"),o=[],r=[],s=!1,l=function(e){return e.replace(/\s+$/,"")},c=function(t){var a,o=e('<select class="ui-corner-all"/>');return t&&e.each(t,function(e,t){a=i.escape(t.value),o.append('<option value="'+a+'">'+(t.caption?i.escape(t.caption):a)+"</option>")}),e.each(n.options.encodings,function(e,t){o.append('<option value="'+t+'">'+t+"</option>")}),o},d=function(){var t,a;return a="string"==typeof n.options.dialogWidth&&(t=n.options.dialogWidth.match(/(\d+)%/))?parseInt(i.getUI().width()*(t[1]/100)):parseInt(n.options.dialogWidth||650),Math.min(a,e(window).width())},p=function(t){var a,l,c,d=t.length;return d>1&&(a=t[0].mime,l=t[0].name.replace(/^.*(\.[^.]+)$/,"$1")),e.grep(t,function(t){var p;return!c&&"directory"!==t.mime&&(p=t.read&&(s||i.mimeIsText(t.mime)||e.inArray(t.mime,1===d?o:r)!==-1)&&(!n.onlyMimes.length||e.inArray(t.mime,n.onlyMimes)!==-1)&&(1===d||t.mime===a&&t.name.substr(l.length*-1)===l)&&!!i.uploadMimeCheck(t.mime,t.phash)&&v(t,d)&&Object.keys(m).length,p||(c=!0),p)})},u=function(e){var t,n=i.file(e);i.request({cmd:"info",targets:[e],preventDefault:!0}).done(function(e){var a;e&&e.files&&e.files.length&&(t=e.files[0],n.ts==t.ts&&n.size==t.size||(a={changed:[t]},i.updateCache(a),i.change(a)))})},h=function(t,o,r,s,p){var h,m,g,v,b,y,x=e.Deferred(),k=!1,C=function(){return!!k||(i.toast({mode:"warning",msg:i.i18n("nowLoading")}),!1)},z=function(){var t,n,i=v?v.val():void 0,a=e.Deferred().fail(function(e){g.show().find("button.elfinder-btncnt-0,button.elfinder-btncnt-1").hide()});return C()?(h.editor&&(h.editor.save(h[0],h.editor.instance),t=h.editor.confObj,t.info&&(t.info.schemeContent||t.info.arrayBufferContent)&&(i="scheme")),n=M(),D(n),n.promise?n.done(function(e){x.notifyWith(h,[i,h.data("hash"),m,a])}).fail(function(e){a.reject(e)}):x.notifyWith(h,[i,h.data("hash"),m,a]),a):a.resolve()},T=function(){C()&&z().fail(function(e){e&&i.error(e)})},A=function(){h.elfinderdialog("close")},S=function(){C()&&(z().done(function(){k=!1,g.show(),A()}).fail(function(e){g.show(),e&&i.error(e)}),g.hide())},I=function(){if(C()){var t=m,r=i.file(o.phash)?o.phash:i.cwd().hash,s=function(e){d.addClass(a).fadeIn(function(){e&&i.error(e)}),m=t,i.disable()},l=function(){n.mime=E.mime||o.mime,n.prefix=(E.name||o.name).replace(/ \d+(\.[^.]+)?$/,"$1"),n.requestCmd="mkfile",n.nextAction={},n.data={target:r},e.proxy(i.res("mixin","make"),n)().done(function(e){e.added&&e.added.length?(h.data("hash",e.added[0].hash),z().done(function(){k=!1,g.show(),A(),d.fadeIn()}).fail(s)):s()}).progress(function(e){e&&"errUploadMime"===e&&h.trigger("saveAsFail")}).fail(s).always(function(){delete n.mime,delete n.prefix,delete n.nextAction,delete n.data}),i.trigger("unselectfiles",{files:[o.hash]})},c=null,d=i.getUI().children("."+n.dialogClass+":visible");g.is(":hidden")&&(d=d.add(g)),d.removeClass(a).fadeOut(),i.enable(),i.searchStatus.state<2&&r!==i.cwd().hash&&(c=i.exec("open",[r],{thash:r})),e.when([c]).done(function(){c?i.one("cwdrender",l):l()}).fail(s)}},O=function(){var t,n,a=e.Deferred();return k?(h.editor&&h.editor.save(h[0],h.editor.instance),t=M(),t&&t.promise?(n=setTimeout(function(){i.notify({type:"chkcontent",cnt:1,hideCnt:!0})},100),t.always(function(){n&&clearTimeout(n),i.notify({type:"chkcontent",cnt:-1})}).done(function(e){a.resolve(m!==e)}).fail(function(e){a.resolve(e||!0)})):a.resolve(m!==t),a):a.resolve(!1)},j={title:i.escape(o.name),width:d(),buttons:{},cssClass:a,maxWidth:"window",maxHeight:"window",allowMinimize:!0,allowMaximize:!0,openMaximized:w()||p&&p.info&&p.info.openMaximized,btnHoverFocus:!1,closeOnEscape:!1,propagationEvents:["mousemove","mouseup","click"],minimize:function(){var e;h.editor&&g.closest(".ui-dialog").is(":hidden")&&(e=h.editor.confObj,e.info&&e.info.syncInterval&&u(o.hash))},close:function(){var e=function(){var e;x.resolve(),h.editor&&(h.editor.close(h[0],h.editor.instance),e=h.editor.confObj,e.info&&e.info.syncInterval&&u(o.hash)),h.elfinderdialog("destroy")},t="undefined"!=typeof E.name,a=t?{label:"btnSaveAs",callback:function(){requestAnimationFrame(I)}}:{label:"btnSaveClose",callback:function(){z().done(function(){e()})}};O().done(function(o){var r=["confirmNotSave"];o?("string"==typeof o&&r.unshift(o),i.confirm({title:n.title,text:r,accept:a,cancel:{label:"btnClose",callback:e},buttons:t?null:[{label:"btnSaveAs",callback:function(){requestAnimationFrame(I)}}]})):e()})},open:function(){var e,n,a;if(h.initEditArea.call(h,t,o,r,i),h.editor){if(e=h.editor.load(h[0])||null,e&&e.done)e.always(function(){k=!0}).done(function(e){h.editor.instance=e,h.editor.focus(h[0],h.editor.instance),D(M()),requestAnimationFrame(function(){g.trigger("resize")})}).fail(function(e){e&&i.error(e),h.elfinderdialog("destroy")});else{if(k=!0,e&&("string"==typeof e||Array.isArray(e)))return i.error(e),void h.elfinderdialog("destroy");h.editor.instance=e,h.editor.focus(h[0],h.editor.instance),D(M()),requestAnimationFrame(function(){g.trigger("resize")})}n=h.editor.confObj,n.info&&n.info.syncInterval&&(a=parseInt(n.info.syncInterval))&&setTimeout(function(){F(a)},a)}else k=!0,D(M())},resize:function(e,t){h.editor&&h.editor.resize(h[0],h.editor.instance,e,t||{})}},M=function(){return h.getContent.call(h,h[0])},D=function(e){e&&e.promise?e.done(function(e){m=e}):m=e},F=function(e){g.is(":visible")&&(u(o.hash),setTimeout(function(){F(e)},e))},E={};if(p&&(p.html&&(h=e(p.html)),b={init:p.init||null,load:p.load,getContent:p.getContent||null,save:p.save,beforeclose:"function"==typeof p.beforeclose?p.beforeclose:void 0,close:"function"==typeof p.close?p.close:function(){},focus:"function"==typeof p.focus?p.focus:function(){},resize:"function"==typeof p.resize?p.resize:function(){},instance:null,doSave:T,doCancel:A,doClose:S,file:o,fm:i,confObj:p,trigger:function(e,t){i.trigger("editEditor"+e,Object.assign({},p.info||{},t))}}),!h){if(!i.mimeIsText(o.mime))return x.reject("errEditorNotFound");!function(){var n=function(){v&&O().done(function(e){e?v.attr("title",i.i18n("saveAsEncoding")).addClass("elfinder-edit-changed"):v.attr("title",i.i18n("openAsEncoding")).removeClass("elfinder-edit-changed")})};h=e('<textarea class="elfinder-file-edit" rows="20" id="'+t+'-ta"></textarea>').on("input propertychange",n),h.editor&&h.editor.info&&!h.editor.info.useTextAreaEvent||h.on("keydown",function(t){var n,i,a=t.keyCode;t.stopPropagation(),a==e.ui.keyCode.TAB&&(t.preventDefault(),this.setSelectionRange&&(n=this.value,i=this.selectionStart,this.value=n.substr(0,i)+"\t"+n.substr(this.selectionEnd),i+=1,this.setSelectionRange(i,i))),(t.ctrlKey||t.metaKey)&&(a!="Q".charCodeAt(0)&&a!="W".charCodeAt(0)||(t.preventDefault(),A()),a=="S".charCodeAt(0)&&(t.preventDefault(),T()))}).on("mouseenter",function(){this.focus()}),h.initEditArea=function(t,a,o){var r=s&&"unknown"!==s?[{value:s}]:[],l=e("<select/>").hide(),d=function(t){t&&l.appendTo(v.parent()),l.empty().append(e("<option/>").text(v.val())),v.width(l.width())};h.hide().val(o),""!==o&&s&&"UTF-8"===s||r.push({value:"UTF-8"}),v=c(r).on("touchstart",function(e){e.stopPropagation()}).on("change",function(){O().done(function(e){e||""===M()||(A(),f(a,v.val(),p).fail(function(e){e&&i.error(e)}))}),d()}).on("mouseover",n),h.parent().next().prepend(e('<div class="ui-dialog-buttonset elfinder-edit-extras"/>').append(v)),d(!0)}}()}return h.data("hash",o.hash),b&&(h.editor=b,"function"==typeof b.beforeclose&&(j.beforeclose=function(){return b.beforeclose(h[0],b.instance)}),"function"==typeof b.init&&(h.initEditArea=b.init),"function"==typeof b.getContent&&(h.getContent=b.getContent)),h.initEditArea||(h.initEditArea=function(){}),h.getContent||(h.getContent=function(){return l(h.val())}),p&&p.info&&p.info.preventGet||(j.buttons[i.i18n("btnSave")]=T,j.buttons[i.i18n("btnSaveClose")]=S,j.buttons[i.i18n("btnSaveAs")]=I,j.buttons[i.i18n("btnCancel")]=A),p&&"function"==typeof p.prepare&&p.prepare(h,j,o),g=n.fmDialog(h,j).attr("id",t).on("keydown keyup keypress",function(e){e.stopPropagation()}).css({overflow:"hidden",minHeight:"7em"}).addClass("elfinder-edit-editor").closest(".ui-dialog").on("changeType",function(t,n){if(n.extention&&n.mime){var a=(n.extention,n.mime,e(this).children(".ui-dialog-buttonpane").children(".ui-dialog-buttonset"));a.children(".elfinder-btncnt-0,.elfinder-btncnt-1").hide(),E.name=i.splitFileExtention(o.name)[0]+"."+n.extention,E.mime=n.mime,n.keepEditor||a.children(".elfinder-btncnt-2").trigger("click")}}),y=(i.options.dialogContained?elfNode:e(window)).width(),g.width()>y&&g.width(y),x.promise()},f=function(t,a,o){var r,s,l,d=t.hash,p=(i.options,e.Deferred()),u="edit-"+i.namespace+"-"+t.hash,m=i.getUI().find("#"+u),g=a?a:0;if(m.length)return m.elfinderdialog("toTop"),p.resolve();if(!(t.read&&(t.write||o.info&&o.info.converter)))return s=["errOpen",t.name,"errPerm"],p.reject(s);if(o&&o.info){if("function"==typeof o.info.edit)return l=o.info.edit.call(i,t,o),l.promise?l.done(function(){p.resolve()}).fail(function(e){p.reject(e)}):l?p.resolve():p.reject(),p;o.info.urlAsContent||o.info.preventGet||o.info.noContent?(r=e.Deferred(),o.info.urlAsContent?i.url(d,{async:!0,onetime:!0,temporary:!0}).done(function(e){r.resolve({content:e})}):r.resolve({})):r=i.request({data:{cmd:"get",target:d,conv:g,_t:t.ts},options:{type:"get",cache:!0},notify:{type:"file",cnt:1},preventDefault:!0}),r.done(function(a){var r,s,l;a.doconv?i.confirm({title:n.title,text:"unknown"===a.doconv?"confirmNonUTF8":"confirmConvUTF8",accept:{label:"btnConv",callback:function(){p=f(t,r.val(),o)}},cancel:{label:"btnCancel",callback:function(){p.reject()}},optionsCallback:function(t){t.create=function(){var t=e('<div class="elfinder-dialog-confirm-encoding"/>'),n={value:a.doconv};"unknown"===a.doconv&&(n.caption="-"),r=c([n]),e(this).next().find(".ui-dialog-buttonset").prepend(t.append(e("<label>"+i.i18n("encoding")+" </label>").append(r)))}}}):(o&&o.info&&o.info.preventGet||!i.mimeIsText(t.mime)||(s=new RegExp("^(data:"+t.mime.replace(/([.+])/g,"\\$1")+";base64,)","i"),o.info.dataScheme?window.btoa&&!a.content.match(s)&&(a.content="data:"+t.mime+";base64,"+btoa(a.content)):window.atob&&(l=a.content.match(s))&&(a.content=atob(a.content.substr(l[1].length)))),h(u,t,a.content,a.encoding,o).done(function(e){p.resolve(e)}).progress(function(e,t,n,a){var o=this;t&&(d=t),i.request({options:{type:"post"},data:{cmd:"put",target:d,encoding:e||n.encoding,content:n},notify:{type:"save",cnt:1},syncOnFail:!0,preventFail:!0,navigate:{target:"changed",toast:{inbuffer:{msg:i.i18n(["complete",i.i18n("btnSave")])}}}}).fail(function(e){p.reject(e),a.reject()}).done(function(e){requestAnimationFrame(function(){o.trigger("focus"),o.editor&&o.editor.focus(o[0],o.editor.instance)}),a.resolve()})}).fail(function(e){p.reject(e)}))}).fail(function(e){var t=i.parseError(e);t=Array.isArray(t)?t[0]:t,"errConvUTF8"!==t&&i.sync(),p.reject(e)})}return p.promise()},m={},g={info:{id:"textarea",name:"TextArea",useTextAreaEvent:!0},
load:function(t){this.trigger("Prepare",{node:t,editorObj:void 0,instance:void 0,opts:{}}),t.setSelectionRange&&t.setSelectionRange(0,0),e(t).trigger("focus").show()},save:function(){}},v=function(a,o){var r=function(t,n){if(n){if("*"===n[0]||e.inArray(t,n)!==-1)return!0;var a,o;for(o=n.length,a=0;a<o;a++)if(0===t.indexOf(n[a]))return!0;return!1}return i.mimeIsText(t)},s=function(e,t){if(!t||!t.length)return!0;var n,i,a=e.replace(/^.+\.([^.]+)|(.+)$/,"$1$2").toLowerCase();for(i=t.length,n=0;n<i;n++)if(a===t[n].toLowerCase())return!0;return!1},l=n.options.editors||[],c=i.cwd().write;return t=i.storage("storedEditors")||{},m={},l.length||(l=[g]),e.each(l,function(e,t){var n;(1===o||!t.info.single)&&(t.info&&t.info.converter?c:a.write)&&(a.size>0||!t.info.converter&&(t.info.canMakeEmpty||t.info.canMakeEmpty!==!1&&i.mimeIsText(a.mime)))&&(!t.info.maxSize||a.size<=t.info.maxSize)&&r(a.mime,t.mimes||null)&&s(a.name,t.exts||null)&&"function"==typeof t.load&&"function"==typeof t.save&&(n=t.info.name?t.info.name:"Editor "+e,t.id=t.info.id?t.info.id:"editor"+e,t.name=n,t.i18n=i.i18n(n),m[t.id]=t)}),!!Object.keys(m).length},b=function(n,a){n&&a&&(e.isPlainObject(t)||(t={}),t[n]=a.id,i.storage("storedEditors",t),i.trigger("selectfiles",{files:i.selected()}))},y=function(){var e=i.storage("useStoredEditor");return e?e>0:n.options.useStoredEditor},w=function(){var e=i.storage("editorMaximized");return e?e>0:n.options.editorMaximized},x=function(t,n){var a=[];return e.each(m,function(e,o){a.push({label:i.escape(o.i18n),icon:o.info&&o.info.icon?o.info.icon:"edit",options:{iconImg:o.info&&o.info.iconImg?i.baseUrl+o.info.iconImg:void 0},callback:function(){b(t[0].mime,o),n&&n.call(o)}})}),a},k=function(e){return e.toLowerCase().replace(/ +/g,"")},C=function(e){var n=t[e];return n&&Object.keys(m).length?m[k(n)]:void 0};this.shortcuts=[{pattern:"ctrl+e"}],this.init=function(){var t,n,i=this,a=this.fm,l=this.options,c=[];this.onlyMimes=this.options.mimes||[],a.one("open",function(){l.editors&&Array.isArray(l.editors)&&(a.trigger("canMakeEmptyFile",{mimes:Object.keys(a.storage("mkfileTextMimes")||{}).concat(l.makeTextMimes||["text/plain"])}),e.each(l.editors,function(e,t){t.info&&t.info.cmdCheck&&c.push(t.info.cmdCheck)}),c.length?a.api>=2.103?n=a.request({data:{cmd:"editor",name:c,method:"enabled"},preventDefault:!0}).done(function(e){t=e}).fail(function(){t={}}):(t={},n=e.Deferred().resolve()):n=e.Deferred().resolve(),n.always(function(){t&&(l.editors=e.grep(l.editors,function(e){return!e.info||!e.info.cmdCheck||!!t[e.info.cmdCheck]})),e.each(l.editors,function(e,t){t.setup&&"function"==typeof t.setup&&t.setup.call(t,l,a),t.disabled||(t.mimes&&Array.isArray(t.mimes)&&(o=o.concat(t.mimes),t.info&&t.info.single||(r=r.concat(t.mimes))),!s&&t.mimes&&"*"===t.mimes[0]&&(s=!0),t.info||(t.info={}),t.info.integrate&&a.trigger("helpIntegration",Object.assign({cmd:"edit"},t.info.integrate)),t.info.canMakeEmpty&&a.trigger("canMakeEmptyFile",{mimes:t.mimes}))}),o=(e.uniqueSort||e.unique)(o),r=(e.uniqueSort||e.unique)(r),l.editors=e.grep(l.editors,function(e){return!e.disabled})}))}).bind("select",function(){m=null}).bind("contextmenucreate",function(t){var n,o,r=function(e){var t=i.title;a.one("contextmenucreatedone",function(){i.title=t}),i.title=a.escape(e.i18n),e.info&&e.info.iconImg&&(i.contextmenuOpts={iconImg:a.baseUrl+e.info.iconImg}),delete i.variants};i.contextmenuOpts=void 0,"files"===t.data.type&&i.enabled()&&(n=a.file(t.data.targets[0]),v(n,t.data.targets.length)&&(Object.keys(m).length>1?y()&&(o=C(n.mime))?(r(o),i.extra={icon:"menu",node:e("<span/>").attr({title:a.i18n("select")}).on("click touchstart",function(t){if(!("touchstart"===t.type&&t.originalEvent.touches.length>1)){var n=e(this);t.stopPropagation(),t.preventDefault(),a.trigger("contextmenu",{raw:x(a.selectedFiles(),function(){var e=a.selected();a.exec("edit",e,{editor:this}),a.trigger("selectfiles",{files:e})}),x:n.offset().left,y:n.offset().top})}})}):(delete i.extra,i.variants=[],e.each(m,function(e,t){i.variants.push([{editor:t},t.i18n,t.info&&t.info.iconImg?a.baseUrl+t.info.iconImg:"edit"])})):(r(m[Object.keys(m)[0]]),delete i.extra)))}).bind("canMakeEmptyFile",function(t){if(t.data&&t.data.resetTexts){var n=a.arrayFlip(i.options.makeTextMimes||["text/plain"]),o=a.storage("mkfileHides")||{};e.each(a.storage("mkfileTextMimes")||{},function(e,t){n[e]||(delete a.mimesCanMakeEmpty[e],delete o[e])}),a.storage("mkfileTextMimes",null),Object.keys(o).length?a.storage("mkfileHides",o):a.storage("mkfileHides",null)}})},this.getstate=function(e){var t=this.files(e),n=t.length;return n&&p(t).length==n?0:-1},this.exec=function(t,n){var i,a=this.fm,o=p(this.files(t)),r=e.map(o,function(e){return e.hash}),s=[],l=n&&n.editor?n.editor:null,c=e(n&&n._currentNode?n._currentNode:a.cwdHash2Elm(r[0])),d=function(){var t=e.Deferred();return!l&&Object.keys(m).length>1?y()&&(l=C(o[0].mime))?t.resolve(l):(a.trigger("contextmenu",{raw:x(o,function(){t.resolve(this)}),x:c.offset().left,y:c.offset().top+22,opened:function(){a.one("closecontextmenu",function(){requestAnimationFrame(function(){"pending"===t.state()&&t.reject()})})}}),a.trigger("selectfiles",{files:r}),t):(Object.keys(m).length>1&&l&&b(o[0].mime,l),t.resolve(l?l:Object.keys(m).length?m[Object.keys(m)[0]]:null))},u=e.Deferred();return null===m&&v(o[0],r.length),c.length||(c=a.getUI("cwd")),d().done(function(t){for(;i=o.shift();)s.push(f(i,void 0,t).fail(function(e){e&&a.error(e)}));s.length?e.when.apply(null,s).done(function(){u.resolve()}).fail(function(){u.reject()}):u.reject()}).fail(function(){u.reject()}),u}},i.prototype.commands.empty=function(){var t,n,i=function(e){var i=t.files(e);return i.length||(i=[n.cwd()]),i};this.linkedCmds=["rm"],this.init=function(){t=this,n=this.fm},this.getstate=function(t){var n,a=i(t);return n=a.length,e.grep(a,function(e){return!(!e.read||!e.write||"directory"!==e.mime)}).length==n?0:-1},this.exec=function(t){var a=i(t),o=a.length,r=e.Deferred().done(function(){var t={changed:{}};n.toast({msg:n.i18n(['"'+s.join('", ')+'"',"complete",n.i18n("cmdempty")])}),e.each(a,function(e,n){t.changed[n.hash]=n}),n.change(t)}).always(function(){var t=n.cwd().hash;n.trigger("selectfiles",{files:e.map(a,function(e){return t===e.phash?e.hash:null})})}),s=[],l=function(e){"number"==typeof e?(s.push(a[e].name),delete a[e].dirs):e&&n.error(e),--o<1&&r[s.length?"resolve":"reject"]()};return e.each(a,function(t,i){var a;return i.write&&"directory"===i.mime?n.isCommandEnabled("rm",i.hash)?(a=setTimeout(function(){n.notify({type:"search",cnt:1,hideCnt:!(o>1)})},n.notifyDelay),void n.request({data:{cmd:"open",target:i.hash},preventDefault:!0,asNotOpen:!0}).done(function(r){var s=[];a&&clearTimeout(a),n.ui.notify.children(".elfinder-notify-search").length&&n.notify({type:"search",cnt:-1,hideCnt:!(o>1)}),r&&r.files&&r.files.length?r.files.length>n.maxTargets?l(["errEmpty",i.name,"errMaxTargets",n.maxTargets]):(n.updateCache(r),e.each(r.files,function(e,t){return!t.write||t.locked?(l(["errEmpty",i.name,"errRm",t.name,"errPerm"]),s=[],!1):void s.push(t.hash)}),s.length&&n.exec("rm",s,{_userAction:!0,addTexts:[n.i18n("folderToEmpty",i.name)]}).fail(function(e){n.trigger("unselectfiles",{files:n.selected()}),l(n.parseError(e)||"")}).done(function(){l(t)})):(n.toast({mode:"warning",msg:n.i18n("filderIsEmpty",i.name)}),l(""))}).fail(function(e){l(n.parseError(e)||"")})):(l(["errCmdNoSupport",'"rm"']),null):(l(["errEmpty",i.name,"errPerm"]),null)}),r}},i.prototype.commands.extract=function(){var t=this,n=t.fm,i=[],a=function(t){return e.grep(t,function(t){return!(!t.read||e.inArray(t.mime,i)===-1)})};this.variants=[],this.disableOnSearch=!0,n.bind("open reload",function(){i=n.option("archivers").extract||[],n.api>2?t.variants=[[{makedir:!0},n.i18n("cmdmkdir")],[{},n.i18n("btnCwd")]]:t.variants=[[{},n.i18n("btnCwd")]],t.change()}),this.getstate=function(e){var t=this.files(e),n=t.length;return n&&this.fm.cwd().write&&a(t).length==n?0:-1},this.exec=function(t,a){var o,r,s,l=this.files(t),c=e.Deferred(),d=l.length,p=a&&a.makedir?1:0,u=!1,h=!1,f=0,m=e.map(n.files(t),function(e){return e.name}),g={};e.grep(n.files(t),function(e){return g[e.name]=e,!1});var v=function(e){switch(e){case"overwrite_all":u=!0;break;case"omit_all":h=!0}},b=function(t){t.read&&n.file(t.phash).write?e.inArray(t.mime,i)===-1?(r=["errExtract",t.name,"errNoArchive"],n.error(r),c.reject(r)):n.request({data:{cmd:"extract",target:t.hash,makedir:p},notify:{type:"extract",cnt:1},syncOnFail:!0,navigate:{toast:p?{incwd:{msg:n.i18n(["complete",n.i18n("cmdextract")]),action:{cmd:"open",msg:"cmdopen"}},inbuffer:{msg:n.i18n(["complete",n.i18n("cmdextract")]),action:{cmd:"open",msg:"cmdopen"}}}:{inbuffer:{msg:n.i18n(["complete",n.i18n("cmdextract")])}}}}).fail(function(e){"rejected"!=c.state()&&c.reject(e)}).done(function(){}):(r=["errExtract",t.name,"errPerm"],n.error(r),c.reject(r))},y=function(t,i){var a=t[i],r=n.splitFileExtention(a.name)[0],l=e.inArray(r,m)>=0,w=function(){i+1<d?y(t,i+1):c.resolve()};!p&&l&&"directory"!=g[r].mime?n.confirm({title:n.i18n("ntfextract"),text:["errExists",r,"confirmRepl"],accept:{label:"btnYes",callback:function(e){if(s=e?"overwrite_all":"overwrite",v(s),u||h){if(u){for(o=i;o<d;o++)b(t[o]);c.resolve()}}else"overwrite"==s&&b(a),i+1<d?y(t,i+1):c.resolve()}},reject:{label:"btnNo",callback:function(e){s=e?"omit_all":"omit",v(s),!u&&!h&&i+1<d?y(t,i+1):h&&c.resolve()}},cancel:{label:"btnCancel",callback:function(){c.resolve()}},all:i+1<d}):p?(b(a),w()):0==f?n.confirm({title:n.i18n("cmdextract"),text:[n.i18n("cmdextract")+' "'+a.name+'"',"confirmRepl"],accept:{label:"btnYes",callback:function(e){e&&(f=1),b(a),w()}},reject:{label:"btnNo",callback:function(e){e&&(f=-1),w()}},cancel:{label:"btnCancel",callback:function(){c.resolve()}},all:i+1<d}):(f>0&&b(a),w())};return this.enabled()&&d&&i.length?(d>0&&y(l,0),c):c.reject()}},(i.prototype.commands.forward=function(){this.alwaysEnabled=!0,this.updateOnSelect=!0,this.shortcuts=[{pattern:"ctrl+right"}],this.getstate=function(){return this.fm.history.canForward()?0:-1},this.exec=function(){return this.fm.history.forward()}}).prototype={forceLoad:!0},i.prototype.commands.fullscreen=function(){var t=this,n=this.fm,i=function(e,n){e.preventDefault(),e.stopPropagation(),n&&n.fullscreen&&t.update(void 0,"on"===n.fullscreen)};this.alwaysEnabled=!0,this.updateOnSelect=!1,this.syncTitleOnChange=!0,this.value=!1,this.options={ui:"fullscreenbutton"},this.getstate=function(){return 0},this.exec=function(){var i=n.getUI().get(0),a=i===n.toggleFullscreen(i);return t.title=n.i18n(a?"reinstate":"cmdfullscreen"),t.update(void 0,a),e.Deferred().resolve()},n.bind("init",function(){n.getUI().off("resize."+n.namespace,i).on("resize."+n.namespace,i)})},(i.prototype.commands.getfile=function(){var t=this,n=this.fm,i=function(n){var i=t.options;return n=e.grep(n,function(e){return!("directory"==e.mime&&!i.folders||!e.read)}),i.multiple||1==n.length?n:[]};this.alwaysEnabled=!0,this.callback=n.options.getFileCallback,this._disabled="function"==typeof this.callback,this.getstate=function(e){var t=this.files(e),n=t.length;return this.callback&&n&&i(t).length==n?0:-1},this.exec=function(n){var i,a,o,r=this.fm,s=this.options,l=this.files(n),c=l.length,d=r.option("url"),p=r.option("tmbUrl"),u=e.Deferred().done(function(e){var n,i=function(){"close"==s.oncomplete?r.hide():"destroy"==s.oncomplete&&r.destroy()},a=function(e){"close"==s.onerror?r.hide():"destroy"==s.onerror?r.destroy():e&&r.error(e)};r.trigger("getfile",{files:e});try{n=t.callback(e,r)}catch(o){return void a(["Error in `getFileCallback`.",o.message])}"object"==typeof n&&"function"==typeof n.done?n.done(i).fail(a):i()}),h=function(t){return s.onlyURL?s.multiple?e.map(l,function(e){return e.url}):l[0].url:s.multiple?l:l[0]},f=[];for(i=0;i<c;i++){if(a=l[i],"directory"==a.mime&&!s.folders)return u.reject();a.baseUrl=d,"1"==a.url?f.push(r.request({data:{cmd:"url",target:a.hash},notify:{type:"url",cnt:1,hideCnt:!0},preventDefault:!0}).done(function(e){if(e.url){var t=r.file(this.hash);t.url=this.url=e.url}}.bind(a))):a.url=r.url(a.hash),s.onlyURL||(s.getPath&&(a.path=r.path(a.hash),""===a.path&&a.phash&&!function(){var t=e.Deferred();f.push(t),r.path(a.hash,!1,{}).done(function(e){a.path=e}).fail(function(){a.path=""}).always(function(){t.resolve()})}()),a.tmb&&1!=a.tmb&&(a.tmb=p+a.tmb),a.width||a.height||(a.dim?(o=a.dim.split("x"),a.width=o[0],a.height=o[1]):s.getImgSize&&a.mime.indexOf("image")!==-1&&f.push(r.request({data:{cmd:"dim",target:a.hash},notify:{type:"dim",cnt:1,hideCnt:!0},preventDefault:!0}).done(function(e){if(e.dim){var t=e.dim.split("x"),n=r.file(this.hash);n.width=this.width=t[0],n.height=this.height=t[1]}}.bind(a)))))}return f.length?(e.when.apply(null,f).always(function(){u.resolve(h(l))}),u):u.resolve(h(l))}}).prototype={forceLoad:!0},(i.prototype.commands.help=function(){var t,n,i,a,o,r,s=this.fm,l=this,c='<div class="elfinder-help-link"> <a href="{url}" target="_blank">{link}</a></div>',d='<div class="elfinder-help-team"><div>{author}</div>{work}</div>',p=/\{url\}/,u=/\{link\}/,h=/\{author\}/,f=/\{work\}/,m="replace",g="ui-priority-primary",v="ui-priority-secondary",b="elfinder-help-license",y='<li class="'+s.res("class","tabstab")+' elfinder-help-tab-{id}"><a href="#'+s.namespace+'-help-{id}" class="ui-tabs-anchor">{title}</a></li>',w=['<div class="ui-tabs ui-widget ui-widget-content ui-corner-all elfinder-help">','<ul class="ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-top">'],x='<div class="elfinder-help-shortcut"><div class="elfinder-help-shortcut-pattern">{pattern}</div> {descrip}</div>',k='<div class="elfinder-help-separator"/>',C=e("base").length?document.location.href.replace(/#.*$/,""):"",z=s.res("class","tabsactive"),T=function(){var e;return e=s.theme&&s.theme.author?d[m]("elfinder-help-team","elfinder-help-team elfinder-help-term-theme")[m](h,s.i18n(s.theme.author)+(s.theme.email?" &lt;"+s.theme.email+"&gt;":""))[m](f,s.i18n("theme")+" ("+s.i18n(s.theme.name)+")"):'<div class="elfinder-help-team elfinder-help-term-theme" style="display:none"></div>'},A=function(){w.push('<div id="'+s.namespace+'-help-about" class="ui-tabs-panel ui-widget-content ui-corner-bottom"><div class="elfinder-help-logo"/>'),w.push("<h3>elFinder</h3>"),w.push('<div class="'+g+'">'+s.i18n("webfm")+"</div>"),w.push('<div class="'+v+'">'+s.i18n("ver")+": "+s.version+"</div>"),w.push('<div class="'+v+'">'+s.i18n("protocolver")+': <span class="apiver"></span></div>'),w.push('<div class="'+v+'">jQuery/jQuery UI: '+e().jquery+"/"+e.ui.version+"</div>"),w.push(k),w.push(c[m](p,"https://studio-42.github.io/elFinder/")[m](u,s.i18n("homepage"))),w.push(c[m](p,"https://github.com/Studio-42/elFinder/wiki")[m](u,s.i18n("docs"))),w.push(c[m](p,"https://github.com/Studio-42/elFinder")[m](u,s.i18n("github"))),w.push(k),w.push('<div class="'+g+'">'+s.i18n("team")+"</div>"),w.push(d[m](h,'Dmitry "dio" Levashov &lt;dio@std42.ru&gt;')[m](f,s.i18n("chiefdev"))),w.push(d[m](h,"Naoki Sawada &lt;hypweb+elfinder@gmail.com&gt;")[m](f,s.i18n("developer"))),w.push(d[m](h,"Troex Nevelin &lt;troex@fury.scancode.ru&gt;")[m](f,s.i18n("maintainer"))),w.push(d[m](h,"Alexey Sukhotin &lt;strogg@yandex.ru&gt;")[m](f,s.i18n("contributor"))),s.i18[s.lang].translator&&e.each(s.i18[s.lang].translator.split(", "),function(){w.push(d[m](h,e.trim(this))[m](f,s.i18n("translator")+" ("+s.i18[s.lang].language+")"))}),w.push(T()),w.push(k),w.push('<div class="'+b+'">'+s.i18n("icons")+': Pixelmixer, <a href="http://p.yusukekamiyamane.com" target="_blank">Fugue</a>, <a href="https://icons8.com" target="_blank">Icons8</a></div>'),w.push(k),w.push('<div class="'+b+'">Licence: 3-clauses BSD Licence</div>'),w.push('<div class="'+b+'">Copyright © 2009-2019, Studio 42</div>'),w.push('<div class="'+b+'">„ …'+s.i18n("dontforget")+" ”</div>"),w.push("</div>")},S=function(){var t=s.shortcuts();w.push('<div id="'+s.namespace+'-help-shortcuts" class="ui-tabs-panel ui-widget-content ui-corner-bottom">'),t.length?(w.push('<div class="ui-widget-content elfinder-help-shortcuts">'),e.each(t,function(e,t){w.push(x.replace(/\{pattern\}/,t[0]).replace(/\{descrip\}/,t[1]))}),w.push("</div>")):w.push('<div class="elfinder-help-disabled">'+s.i18n("shortcutsof")+"</div>"),w.push("</div>")},I=function(){w.push('<div id="'+s.namespace+'-help-help" class="ui-tabs-panel ui-widget-content ui-corner-bottom">'),w.push('<a href="https://github.com/Studio-42/elFinder/wiki" target="_blank" class="elfinder-dont-panic"><span>DON\'T PANIC</span></a>'),w.push("</div>")},O=!1,j=function(){O=!0,w.push('<div id="'+s.namespace+'-help-integrations" class="ui-tabs-panel ui-widget-content ui-corner-bottom"/>')},M=!1,D=function(){M=!0,w.push('<div id="'+s.namespace+'-help-debug" class="ui-tabs-panel ui-widget-content ui-corner-bottom">'),w.push('<div class="ui-widget-content elfinder-help-debug"><ul></ul></div>'),w.push("</div>")},F=function(){var n,i,a,c,d,p,u=function(t,n){return e.each(n,function(n,i){t.append(e("<dt/>").text(n)),"undefined"==typeof i?t.append(e("<dd/>").append(e("<span/>").text("undfined"))):"object"!=typeof i||i?"object"==typeof i&&(e.isPlainObject(i)||i.length)?t.append(e("<dd/>").append(u(e("<dl/>"),i))):t.append(e("<dd/>").append(e("<span/>").text(i&&"object"==typeof i?"[]":i?i:'""'))):t.append(e("<dd/>").append(e("<span/>").text("null")))}),t},h=r.children("li").length;(l.debug.options||l.debug.debug)&&(h>=5&&(d=r.children("li:last"),p=o.children("div:last"),p.is(":hidden")?(d.remove(),p.remove()):(d.prev().remove(),p.prev().remove())),a=s.namespace+"-help-debug-"+ +new Date,n=e("<li/>").html('<a href="'+C+"#"+a+'">'+l.debug.debug.cmd+"</a>").prependTo(r),i=e('<div id="'+a+'"/>').data("debug",l.debug),n.on("click.debugrender",function(){var t=i.data("debug");i.removeData("debug"),t&&(i.hide(),t.debug&&(c=e("<fieldset>").append(e("<legend/>").text("debug"),u(e("<dl/>"),t.debug)),i.append(c)),t.options&&(c=e("<fieldset>").append(e("<legend/>").text("options"),u(e("<dl/>"),t.options)),i.append(c)),i.show()),n.off("click.debugrender")}),r.after(i),t&&o.tabs("refresh"))},E="";this.alwaysEnabled=!0,this.updateOnSelect=!1,this.state=-1,this.shortcuts=[{pattern:"f1",description:this.title}],s.bind("load",function(){var c,d,p,u,h,f,g=l.options.view||["about","shortcuts","help","integrations","debug"];(c=e.inArray("preference",g))!==-1&&g.splice(c,1),e.fn.tabs||(c=e.inArray(g,"debug"))!==-1&&g.splice(c,1),e.each(g,function(e,t){w.push(y[m](/\{id\}/g,t)[m](/\{title\}/,s.i18n(t)))}),w.push("</ul>"),e.inArray("about",g)!==-1&&A(),e.inArray("shortcuts",g)!==-1&&S(),e.inArray("help",g)!==-1&&(d=s.i18nBaseUrl+"help/%s.html.js",I()),e.inArray("integrations",g)!==-1&&j(),e.inArray("debug",g)!==-1&&D(),w.push("</div>"),E=e(w.join("")),E.find(".ui-tabs-nav li").on("mouseenter mouseleave",function(t){e(this).toggleClass("ui-state-hover","mouseenter"===t.type)}).on("focus blur","a",function(t){e(t.delegateTarget).toggleClass("ui-state-focus","focusin"===t.type)}).children().on("click",function(t){var n=e(this);t.preventDefault(),t.stopPropagation(),n.parent().addClass(z).siblings().removeClass(z),E.children(".ui-tabs-panel").hide().filter(n.attr("href")).show()}).filter(":first").trigger("click"),O&&(n=E.find(".elfinder-help-tab-integrations").hide(),i=E.find("#"+s.namespace+"-help-integrations").hide().append(e('<div class="elfinder-help-integrations-desc"/>').html(s.i18n("integrationWith"))),s.bind("helpIntegration",function(t){var a,o,r,l,c=i.children("ul:first");t.data&&(e.isPlainObject(t.data)?(a=Object.assign({link:"",title:"",banner:""},t.data),(a.title||a.link)&&(a.title||(a.title=a.link),o=a.link?e("<a/>").attr("href",a.link).attr("target","_blank").text(a.title):e("<span/>").text(a.title),a.banner&&(o=e("<span/>").append(e("<img/>").attr(a.banner),o)))):(o=e(t.data),o.filter("a").each(function(){var t=e(this);t.attr("target")||t.attr("target","_blank")})),o&&(n.show(),c.length||(c=e('<ul class="elfinder-help-integrations"/>').appendTo(i)),a&&a.cmd?(l="elfinder-help-integration-"+a.cmd,r=c.find("ul."+l),r.length||(r=e('<ul class="'+l+'"/>'),c.append(e("<li/>").append(e("<span/>").html(s.i18n("cmd"+a.cmd))).append(r))),o=r.append(e("<li/>").append(o))):c.append(e("<li/>").append(o))))}).bind("themechange",function(){E.find("div.elfinder-help-term-theme").replaceWith(T())})),M&&(a=E.find(".elfinder-help-tab-debug").hide(),o=E.find("#"+s.namespace+"-help-debug").children("div:first"),r=o.children("ul:first").on("click",function(e){e.preventDefault(),e.stopPropagation()}),l.debug={},s.bind("backenddebug",function(e){M&&e.data&&e.data.debug&&(l.debug={options:e.data.options,debug:Object.assign({cmd:s.currentReqCmd},e.data.debug)},l.dialog&&F())})),E.find("#"+s.namespace+"-help-about").find(".apiver").text(s.api),l.dialog=l.fmDialog(E,{title:l.title,width:530,maxWidth:"window",maxHeight:"window",autoOpen:!1,destroyOnClose:!1,close:function(){M&&(a.hide(),o.tabs("destroy")),t=!1}}).on("click",function(e){e.stopPropagation()}).css({overflow:"hidden"}),p=l.dialog.children(".ui-tabs"),u=p.children(".ui-tabs-nav:first"),h=p.children(".ui-tabs-panel"),f=l.dialog.outerHeight(!0)-l.dialog.height(),l.dialog.closest(".ui-dialog").on("resize",function(){h.height(l.dialog.height()-f-u.outerHeight(!0)-20)}),d&&l.dialog.one("initContents",function(){e.ajax({url:l.options.helpSource?l.options.helpSource:d.replace("%s",s.lang),dataType:"html"}).done(function(t){e("#"+s.namespace+"-help-help").html(t)}).fail(function(){e.ajax({url:d.replace("%s","en"),dataType:"html"}).done(function(t){e("#"+s.namespace+"-help-help").html(t)})})}),l.state=0,s.trigger("helpBuilded",l.dialog)}).one("open",function(){var e=!1;s.one("backenddebug",function(){e=!0}).one("opendone",function(){requestAnimationFrame(function(){!e&&M&&(M=!1,a.hide(),o.hide(),r.hide())})})}),this.getstate=function(){return 0},this.exec=function(n,i){var s=i?i.tab:void 0,l=function(){M&&(o.tabs(),r.find("a:first").trigger("click"),a.show(),t=!0)};return l(),this.dialog.trigger("initContents").elfinderdialog("open").find((s?".elfinder-help-tab-"+s:".ui-tabs-nav li")+" a:first").trigger("click"),e.Deferred().resolve()}}).prototype={forceLoad:!0},i.prototype.commands.hidden=function(){this.hidden=!0,this.updateOnSelect=!1,this.getstate=function(){return-1}},i.prototype.commands.hide=function(){var t,n,i,a,o=this,r={};this.syncTitleOnChange=!0,this.shortcuts=[{pattern:"ctrl+shift+dot",description:this.fm.i18n("toggleHidden")}],this.init=function(){var e=this.fm;t=e.storage("hide")||{items:{}},n=Object.keys(t.items).length,this.title=e.i18n(t.show?"hideHidden":"showHidden"),o.update(void 0,o.title)},this.fm.bind("select contextmenucreate closecontextmenu",function(e,r){var s=(e.data?e.data.selected||e.data.targets:null)||r.selected();"select"===e.type&&e.data?a=e.data.origin:"contextmenucreate"===e.type&&(i=e.data.type),!s.length||("contextmenucreate"!==e.type&&"navbar"!==a||"cwd"===i)&&s[0]===r.cwd().hash?o.title=r.i18n(t.show?"hideHidden":"showHidden"):o.title=r.i18n("cmdhide"),"closecontextmenu"!==e.type?o.update("cwd"===i?n?0:-1:void 0,o.title):(i="",requestAnimationFrame(function(){o.update(void 0,o.title)}))}),this.getstate=function(e){return"cwd"!==i&&(e||this.fm.selected()).length||n?0:-1},this.exec=function(i,s){var l,c,d=this.fm,p=e.Deferred().done(function(){d.trigger("hide",{items:h,opts:s})}).fail(function(e){d.error(e)}),u=s||{},h=u.targets?u.targets:i||d.selected(),f=[];if(t=d.storage("hide")||{},e.isPlainObject(t)||(t={}),e.isPlainObject(t.items)||(t.items={}),("shortcut"===s._currentType||!h.length||"navbar"!==s._currentType&&"navbar"!==a&&h[0]===d.cwd().hash)&&(t.show?u.hide=!0:Object.keys(t.items).length&&(u.show=!0)),u.reset&&(u.show=!0,n=0),u.show||u.hide){if(u.show?t.show=!0:delete t.show,u.show)return d.storage("hide",u.reset?null:t),o.title=d.i18n("hideHidden"),o.update(u.reset?-1:void 0,o.title),e.each(t.items,function(e){var t=d.file(e,!0);t&&(d.searchStatus.state||!t.phash||d.file(t.phash))&&f.push(t)}),f.length&&(d.updateCache({added:f}),d.add({added:f})),u.reset&&(t={items:{}}),p.resolve();h=Object.keys(t.items)}return h.length&&(e.each(h,function(e,n){var i;t.items[n]||(i=d.file(n),i&&(r[n]=i.i18||i.name),t.items[n]=r[n]?r[n]:n)}),n=Object.keys(t.items).length,l=this.files(h),d.storage("hide",t),d.remove({removed:h}),t.show&&this.exec(void 0,{hide:!0}),u.hide||(c={},c.undo={cmd:"hide",callback:function(){var t=d.storage("hide");t&&(e.each(h,function(e,n){delete t.items[n]}),n=Object.keys(t.items).length,d.storage("hide",t),d.trigger("hide",{items:h,opts:{}}),o.update(n?0:-1)),d.updateCache({added:l}),d.add({added:l})}},c.redo={cmd:"hide",callback:function(){return d.exec("hide",void 0,{targets:h})}})),"rejected"==p.state()?p:p.resolve(c)}},(i.prototype.commands.home=function(){this.title="Home",this.alwaysEnabled=!0,this.updateOnSelect=!1,this.shortcuts=[{pattern:"ctrl+home ctrl+shift+up",description:"Home"}],this.getstate=function(){var e=this.fm.root(),t=this.fm.cwd().hash;return e&&t&&e!=t?0:-1},this.exec=function(){return this.fm.exec("open",this.fm.root())}}).prototype={forceLoad:!0},(i.prototype.commands.info=function(){var t=this.fm,n="elfinder-spinner",i="elfinder-info-button",a={calc:t.i18n("calc"),size:t.i18n("size"),unknown:t.i18n("unknown"),path:t.i18n("path"),aliasfor:t.i18n("aliasfor"),modify:t.i18n("modify"),perms:t.i18n("perms"),locked:t.i18n("locked"),dim:t.i18n("dim"),kind:t.i18n("kind"),files:t.i18n("files"),folders:t.i18n("folders"),roots:t.i18n("volumeRoots"),items:t.i18n("items"),yes:t.i18n("yes"),no:t.i18n("no"),link:t.i18n("link"),owner:t.i18n("owner"),group:t.i18n("group"),perm:t.i18n("perm"),getlink:t.i18n("getLink")},o=function(e,t){return t?e.replace(/\u200B/g,""):e.replace(/(\/|\\)/g,"$1​")};this.items=["size","aliasfor","path","link","dim","modify","perms","locked","owner","group","perm"],this.options.custom&&Object.keys(this.options.custom).length&&e.each(this.options.custom,function(e,t){t.label&&this.items.push(t.label)}),this.tpl={main:'<div class="ui-helper-clearfix elfinder-info-title {dirclass}"><span class="elfinder-cwd-icon {class} ui-corner-all"{style}/>{title}</div><table class="elfinder-info-tb">{content}</table>',itemTitle:'<strong>{name}</strong><span class="elfinder-info-kind">{kind}</span>',groupTitle:"<strong>{items}: {num}</strong>",row:'<tr><td class="elfinder-info-label">{label} : </td><td class="{class}">{value}</td></tr>',spinner:'<span>{text}</span> <span class="'+n+" "+n+'-{name}"/>'},this.alwaysEnabled=!0,this.updateOnSelect=!1,this.shortcuts=[{pattern:"ctrl+i"}],this.init=function(){e.each(a,function(e,n){a[e]=t.i18n(n)})},this.getstate=function(){return 0},this.exec=function(t){var r=this.files(t);r.length||(r=this.files([this.fm.cwd().hash]));var s,l,c,d,p,u,h,f,m,g=this,v=this.fm,b=this.options,y=this.tpl,w=y.row,x=r.length,k=[],C=y.main,z="{label}",T="{value}",A=[],S=null,I={title:v.i18n("selectionInfo"),width:"auto",close:function(){e(this).elfinderdialog("destroy"),S&&"pending"===S.state()&&S.reject(),e.grep(A,function(e){e&&"pending"===e.state()&&e.reject()})}},O=[],j=function(e,t,i){D.find("."+n+"-"+t).parent().html(e).addClass(i||"")},M=v.namespace+"-info-"+e.map(r,function(e){return e.hash}).join("-"),D=v.getUI().find("#"+M),F=[],E="",U="elfinder-font-mono elfinder-info-hash";if(!x)return e.Deferred().reject();if(D.length)return D.elfinderdialog("toTop"),e.Deferred().resolve();if(m=v.storage("infohides")||v.arrayFlip(b.hideItems,!0),1===x){if(c=r[0],c.icon&&(E=" "+v.getIconStyle(c)),C=C.replace("{dirclass}",c.csscls?v.escape(c.csscls):"").replace("{class}",v.mime2class(c.mime)).replace("{style}",E),d=y.itemTitle.replace("{name}",v.escape(c.i18||c.name)).replace("{kind}",'<span title="'+v.escape(c.mime)+'">'+v.mime2kind(c)+"</span>"),l=v.tmb(c),c.read?"directory"!=c.mime||c.alias?s=v.formatSize(c.size):(s=y.spinner.replace("{text}",a.calc).replace("{name}","size"),O.push(c.hash)):s=a.unknown,!m.size&&k.push(w.replace(z,a.size).replace(T,s)),!m.aleasfor&&c.alias&&k.push(w.replace(z,a.aliasfor).replace(T,c.alias)),m.path||((h=v.path(c.hash,!0))?k.push(w.replace(z,a.path).replace(T,o(v.escape(h))).replace("{class}","elfinder-info-path")):(k.push(w.replace(z,a.path).replace(T,y.spinner.replace("{text}",a.calc).replace("{name}","path")).replace("{class}","elfinder-info-path")),A.push(v.path(c.hash,!0,{notify:null}).fail(function(){j(a.unknown,"path")}).done(function(e){j(o(e),"path")})))),!m.link&&c.read){var P,R=v.escape(c.name);if("1"==c.url)k.push(w.replace(z,a.link).replace(T,'<button class="'+i+" "+n+'-url">'+a.getlink+"</button>"));else{if(c.url)P=c.url;else if("directory"===c.mime)if(b.nullUrlDirLinkSelf&&null===c.url){var q=window.location;P=q.pathname+q.search+"#elf_"+c.hash}else""!==c.url&&v.option("url",!v.isRoot(c)&&c.phash||c.hash)&&(P=v.url(c.hash));else P=v.url(c.hash);P&&k.push(w.replace(z,a.link).replace(T,'<a href="'+P+'" target="_blank">'+R+"</a>"))}}m.dim||(c.dim?k.push(w.replace(z,a.dim).replace(T,c.dim)):c.mime.indexOf("image")!==-1&&(c.width&&c.height?k.push(w.replace(z,a.dim).replace(T,c.width+"x"+c.height)):(k.push(w.replace(z,a.dim).replace(T,y.spinner.replace("{text}",a.calc).replace("{name}","dim"))),A.push(v.request({data:{cmd:"dim",target:c.hash},preventDefault:!0}).fail(function(){j(a.unknown,"dim")}).done(function(e){if(j(e.dim||a.unknown,"dim"),e.dim){var t=e.dim.split("x"),n=v.file(c.hash);n.width=t[0],n.height=t[1]}}))))),!m.modify&&k.push(w.replace(z,a.modify).replace(T,v.formatDate(c))),!m.perms&&k.push(w.replace(z,a.perms).replace(T,v.formatPermissions(c))),!m.locked&&k.push(w.replace(z,a.locked).replace(T,c.locked?a.yes:a.no)),!m.owner&&c.owner&&k.push(w.replace(z,a.owner).replace(T,c.owner)),!m.group&&c.group&&k.push(w.replace(z,a.group).replace(T,c.group)),!m.perm&&c.perm&&k.push(w.replace(z,a.perm).replace(T,v.formatFileMode(c.perm))),window.ArrayBuffer&&(v.options.cdns.sparkmd5||v.options.cdns.jssha)&&"directory"!==c.mime&&c.size>0&&(!b.showHashMaxsize||c.size<=b.showHashMaxsize)&&(f=[],e.each(v.storage("hashchekcer")||b.showHashAlgorisms,function(e,t){c[t]?k.push(w.replace(z,v.i18n(t)).replace(T,c[t]).replace("{class}",U)):(k.push(w.replace(z,v.i18n(t)).replace(T,y.spinner.replace("{text}",a.calc).replace("{name}",t))),f.push(t))}),A.push(v.getContentsHashes(c.hash,f).progress(function(t){e.each(f,function(e,n){t[n]&&j(t[n],n,U)})}).always(function(){e.each(f,function(e,t){j(a.unknown,t)})}))),b.custom&&e.each(b.custom,function(t,n){m[n.label]||n.mimes&&!e.grep(n.mimes,function(e){return c.mime===e||0===c.mime.indexOf(e+"/")}).length||n.hashRegex&&!c.hash.match(n.hashRegex)||(k.push(w.replace(z,v.i18n(n.label)).replace(T,n.tpl.replace("{id}",M))),n.action&&"function"==typeof n.action&&F.push(n.action))})}else C=C.replace("{class}","elfinder-cwd-icon-group"),d=y.groupTitle.replace("{items}",a.items).replace("{num}",x),p=e.grep(r,function(e){return"directory"==e.mime}).length,p?(u=e.grep(r,function(e){return!("directory"!==e.mime||e.phash&&!e.isroot)}).length,p-=u,k.push(w.replace(z,a.kind).replace(T,u===x||p===x?a[u?"roots":"folders"]:e.map({roots:u,folders:p,files:x-u-p},function(e,t){return e?a[t]+" "+e:null}).join(", "))),!m.size&&k.push(w.replace(z,a.size).replace(T,y.spinner.replace("{text}",a.calc).replace("{name}","size"))),O=e.map(r,function(e){return e.hash})):(s=0,e.each(r,function(e,t){var n=parseInt(t.size);n>=0&&s>=0?s+=n:s="unknown"}),k.push(w.replace(z,a.kind).replace(T,a.files)),!m.size&&k.push(w.replace(z,a.size).replace(T,v.formatSize(s))));return C=C.replace("{title}",d).replace("{content}",k.join("").replace(/{class}/g,"")),D=g.fmDialog(C,I),D.attr("id",M).one("mousedown",".elfinder-info-path",function(){e(this).html(o(e(this).html(),!0))}),v.UA.Mobile&&e.fn.tooltip&&D.children(".ui-dialog-content .elfinder-info-title").tooltip({classes:{"ui-tooltip":"elfinder-ui-tooltip ui-widget-shadow"},tooltipClass:"elfinder-ui-tooltip ui-widget-shadow",track:!0}),c&&"1"==c.url&&D.on("click","."+n+"-url",function(){e(this).parent().html(y.spinner.replace("{text}",v.i18n("ntfurl")).replace("{name}","url")),
v.request({data:{cmd:"url",target:c.hash},preventDefault:!0}).fail(function(){j(R,"url")}).done(function(e){if(e.url){j('<a href="'+e.url+'" target="_blank">'+R+"</a>"||R,"url");var t=v.file(c.hash);t.url=e.url}else j(R,"url")})}),l&&e("<img/>").on("load",function(){D.find(".elfinder-cwd-icon").addClass(l.className).css("background-image","url('"+l.url+"')")}).attr("src",l.url),O.length&&(S=v.getSize(O).done(function(e){j(e.formated,"size")}).fail(function(){j(a.unknown,"size")})),F.length&&e.each(F,function(e,t){try{t(c,v,D)}catch(n){v.debug("error",n)}}),e.Deferred().resolve()}}).prototype={forceLoad:!0},i.prototype.commands.mkdir=function(){var t,n=this.fm,i=this;this.value="",this.disableOnSearch=!0,this.updateOnSelect=!1,this.syncTitleOnChange=!0,this.mime="directory",this.prefix="untitled folder",this.exec=function(a,o){var r;return a&&a.length&&o&&o._currentType&&"navbar"===o._currentType?(this.origin=o._currentType,this.data={target:a[0]}):(r=n.cwd().hash===a[0],this.origin=t&&!r?t:"cwd",delete this.data),a||this.options.intoNewFolderToolbtn||n.getUI("cwd").trigger("unselectall"),this.move=this.value===n.i18n("cmdmkdirin"),e.proxy(n.res("mixin","make"),i)()},this.shortcuts=[{pattern:"ctrl+shift+n"}],this.init=function(){this.options.intoNewFolderToolbtn&&(this.syncTitleOnChange=!0)},n.bind("select contextmenucreate closecontextmenu",function(e){var a=(e.data?e.data.selected||e.data.targets:null)||n.selected();i.className="mkdir",t=e.data&&a.length?e.data.origin||e.data.type||"":"",i.options.intoNewFolderToolbtn||""!==t||(t="cwd"),a.length&&"navbar"!==t&&"cwd"!==t&&n.cwd().hash!==a[0]?(i.title=n.i18n("cmdmkdirin"),i.className+=" elfinder-button-icon-mkdirin"):i.title=n.i18n("cmdmkdir"),"closecontextmenu"!==e.type?i.update(void 0,i.title):requestAnimationFrame(function(){i.update(void 0,i.title)})}),this.getstate=function(i){var a=n.cwd(),o="navbar"===t||i&&i[0]!==a.hash?this.files(i||n.selected()):[],r=o.length;return"navbar"===t?r&&o[0].write&&o[0].read?0:-1:!a.write||r&&e.grep(o,function(e){return!(!e.read||e.locked)}).length!=r?-1:0}},i.prototype.commands.mkfile=function(){var t=this;this.disableOnSearch=!0,this.updateOnSelect=!1,this.mime="text/plain",this.prefix="untitled file.txt",this.variants=[],this.getTypeName=function(e,n){var i,a=t.fm;return i=(i=a.messages["kind"+a.kinds[e]])?a.i18n(["extentiontype",n.toUpperCase(),i]):a.i18n(["extentionfile",n.toUpperCase()])},this.fm.bind("open reload canMakeEmptyFile",function(){var n=t.fm,i=n.storage("mkfileHides")||{};t.variants=[],n.mimesCanMakeEmpty&&e.each(n.mimesCanMakeEmpty,function(e,a){a&&!i[e]&&n.uploadMimeCheck(e)&&t.variants.push([e,t.getTypeName(e,a)])}),t.change()}),this.getstate=function(){return this.fm.cwd().write?0:-1},this.exec=function(n,i){var a,o,r=t.fm;if(a=r.mimesCanMakeEmpty[i]){if(r.uploadMimeCheck(i))return this.mime=i,this.prefix=r.i18n(["untitled file",a]),e.proxy(r.res("mixin","make"),t)();o=["errMkfile",t.getTypeName(i,a)]}return e.Deferred().reject(o)}},i.prototype.commands.netmount=function(){var t,n=this,i=!1;this.alwaysEnabled=!0,this.updateOnSelect=!1,this.drivers=[],this.handlers={load:function(){var t=n.fm;n.drivers=t.netDrivers,n.drivers.length&&requestAnimationFrame(function(){e.each(n.drivers,function(){var e=n.options[this];e&&(i=!0,e.integrateInfo&&t.trigger("helpIntegration",Object.assign({cmd:"netmount"},e.integrateInfo)))})})}},this.getstate=function(){return i?0:-1},this.exec=function(){var i,a=n.fm,o=e.Deferred(),r=n.options,s=function(){var s,l=function(){c.protocol.trigger("change","winfocus")},c={protocol:e("<select/>").on("change",function(e,n){var o=this.value;t.find(".elfinder-netmount-tr").hide(),t.find(".elfinder-netmount-tr-"+o).show(),i&&i.children(".ui-dialog-buttonpane:first").find("button").show(),"function"==typeof r[o].select&&r[o].select(a,e,n),requestAnimationFrame(function(){t.find("input:text.elfinder-tabstop:visible:first").trigger("focus")})}).addClass("ui-corner-all")},d={title:a.i18n("netMountDialogTitle"),resizable:!1,modal:!0,destroyOnClose:!1,open:function(){e(window).on("focus."+a.namespace,l),c.protocol.trigger("change")},close:function(){"pending"==o.state()&&o.reject(),e(window).off("focus."+a.namespace,l)},buttons:{}},p=function(){var i=c.protocol.val(),s={cmd:"netmount",protocol:i},l=r[i];return e.each(t.find("input.elfinder-netmount-inputs-"+i),function(t,n){var i,a;a=e(n),a.is(":radio,:checkbox")?a.is(":checked")&&(i=e.trim(a.val())):i=e.trim(a.val()),i&&(s[n.name]=i)}),s.host?(a.request({data:s,notify:{type:"netmount",cnt:1,hideCnt:!0}}).done(function(e){var t;e.added&&e.added.length&&(e.added[0].phash&&(t=a.file(e.added[0].phash))&&(t.dirs||(t.dirs=1,a.change({changed:[t]}))),a.one("netmountdone",function(){a.exec("open",e.added[0].hash)})),o.resolve()}).fail(function(e){l.fail&&"function"==typeof l.fail&&l.fail(a,a.parseError(e)),o.reject(e)}),void n.dialog.elfinderdialog("close")):a.trigger("error",{error:"errNetMountHostReq",opts:{modal:!0}})},u=e('<form autocomplete="off"/>').on("keydown","input",function(t){var n,i=!0;t.keyCode===e.ui.keyCode.ENTER&&(e.each(u.find("input:visible:not(.elfinder-input-optional)"),function(){if(""===e(this).val())return i=!1,n=e(this),!1}),i?p():n.trigger("focus"))}),h=e("<div/>");return t=e('<table class="elfinder-info-tb elfinder-netmount-tb"/>').append(e("<tr/>").append(e("<td>"+a.i18n("protocol")+"</td>")).append(e("<td/>").append(c.protocol))),e.each(n.drivers,function(n,i){r[i]&&(c.protocol.append('<option value="'+i+'">'+a.i18n(r[i].name||i)+"</option>"),e.each(r[i].inputs,function(n,o){o.attr("name",n),"hidden"!=o.attr("type")?(o.addClass("ui-corner-all elfinder-netmount-inputs-"+i),t.append(e("<tr/>").addClass("elfinder-netmount-tr elfinder-netmount-tr-"+i).append(e("<td>"+a.i18n(n)+"</td>")).append(e("<td/>").append(o)))):(o.addClass("elfinder-netmount-inputs-"+i),h.append(o))}),r[i].protocol=c.protocol)}),t.append(h),t.find(".elfinder-netmount-tr").hide(),d.buttons[a.i18n("btnMount")]=p,d.buttons[a.i18n("btnCancel")]=function(){n.dialog.elfinderdialog("close")},t.find("select,input").addClass("elfinder-tabstop"),s=n.fmDialog(u.append(t),d),i=s.closest(".ui-dialog"),s.ready(function(){c.protocol.trigger("change"),s.elfinderdialog("posInit")}),s};return n.dialog?n.dialog.elfinderdialog("open"):n.dialog=s(),o.promise()},n.fm.bind("netmount",function(e){var i=e.data||null,a=n.options;i&&i.protocol&&a[i.protocol]&&"function"==typeof a[i.protocol].done&&(a[i.protocol].done(n.fm,i),t.find("select,input").addClass("elfinder-tabstop"),n.dialog.elfinderdialog("tabstopsInit"))})},i.prototype.commands.netunmount=function(){this.alwaysEnabled=!0,this.updateOnSelect=!1,this.drivers=[],this.handlers={load:function(){this.drivers=this.fm.netDrivers}},this.getstate=function(e){var t,n=this.fm;return e&&this.drivers.length&&!this._disabled&&(t=n.file(e[0]))&&t.netkey?0:-1},this.exec=function(t){var n=this,i=this.fm,a=e.Deferred().fail(function(e){e&&i.error(e)}),o=i.file(t[0]),r=function(t){var n,a=[];return i.leafRoots&&(n=[],e.each(i.leafRoots,function(a,o){var r,s=i.parents(a);(r=e.inArray(t,s))!==-1&&(r=s.length-r,e.each(o,function(e,t){n.push({i:r,hash:t})}))}),n.length&&(n.sort(function(e,t){return e.i<t.i}),e.each(n,function(e,t){a.push(t.hash)}))),a};return this._disabled?a.reject():("pending"==a.state()&&i.confirm({title:n.title,text:i.i18n("confirmUnmount",o.name),accept:{label:"btnUnmount",callback:function(){var t=o.hash,s=r(t),l=[],c=[],d=function(){e.when(l).done(function(){i.request({data:{cmd:"netmount",protocol:"netunmount",host:o.netkey,user:t,pass:"dum"},notify:{type:"netunmount",cnt:1,hideCnt:!0},preventFail:!0}).fail(function(e){a.reject(e)}).done(function(e){o.volumeid&&delete i.volumeExpires[o.volumeid],a.resolve()})}).fail(function(e){c.length&&i.remove({removed:c}),a.reject(e)})};s.length?i.confirm({title:n.title,text:function(){var t=["unmountChildren"];return e.each(s,function(e,n){t.push([i.file(n).name])}),t}(),accept:{label:"btnUnmount",callback:function(){e.each(s,function(e,t){var n=i.file(t);n.netkey&&l.push(i.request({data:{cmd:"netmount",protocol:"netunmount",host:n.netkey,user:n.hash,pass:"dum"},notify:{type:"netunmount",cnt:1,hideCnt:!0},preventDefault:!0}).done(function(e){e.removed&&(n.volumeid&&delete i.volumeExpires[n.volumeid],c=c.concat(e.removed))}))}),d()}},cancel:{label:"btnCancel",callback:function(){a.reject()}}}):(l=null,d())}},cancel:{label:"btnCancel",callback:function(){a.reject()}}}),a)}},(i.prototype.commands.open=function(){var t=this.fm;this.alwaysEnabled=!0,this.noChangeDirOnRemovedCwd=!0,this._handlers={dblclick:function(e){e.preventDefault(),t.exec("open",e.data&&e.data.file?[e.data.file]:void 0)},"select enable disable reload":function(e){this.update("disable"==e.type?-1:void 0)}},this.shortcuts=[{pattern:"ctrl+down numpad_enter"+("mac"!=t.OS&&" enter")}],this.getstate=function(n){var i=this.files(n),a=i.length;return 1==a?i[0].read?0:-1:a&&!t.UA.Mobile&&e.grep(i,function(e){return!("directory"==e.mime||!e.read)}).length==a?0:-1},this.exec=function(n,i){var a,o,r,s,l,c,d,p,u,h,f,m,g,v,b=e.Deferred().fail(function(e){e&&t.error(e)}),y=this.files(n),w=y.length,x="object"==typeof i&&i.thash,k=this.options,C=k.into||"window";if(!w&&!x)return b.reject();if(x||1==w&&(a=y[0])&&"directory"==a.mime)return x||!a||a.read?t.keyState.ctrlKey&&(t.keyState.shiftKey||"function"!=typeof t.options.getFileCallback)&&t.getCommand("opennew")?t.exec("opennew",[x?x:a.hash]):t.request({data:{cmd:"open",target:x||a.hash},notify:{type:"open",cnt:1,hideCnt:!0},syncOnFail:!0,lazy:!1}):b.reject(["errOpen",a.name,"errPerm"]);if(y=e.grep(y,function(e){return"directory"!=e.mime}),w!=y.length)return b.reject();var z=function(){var i,g,v;try{u=new RegExp(t.option("dispInlineRegex"),"i")}catch(x){u=!1}for(h=e("<a>").hide().appendTo(e("body")),f="string"==typeof h.get(0).download,w=y.length;w--;){if(g="elf_open_window",a=y[w],!a.read)return b.reject(["errOpen",a.name,"errPerm"]);if(m=u&&a.mime.match(u),o=t.openUrl(a.hash,!m),t.UA.Mobile||!m){if(f)m?h.attr("target","_blank"):h.attr("download",a.name),h.attr("href",o).get(0).click();else if(i=window.open(o),!i)return b.reject("errPopup")}else{if(v="string"==typeof k.method&&"get"===k.method.toLowerCase(),!v&&0===o.indexOf(t.options.url)&&t.customData&&Object.keys(t.customData).length&&!a.mime.match(/^(?:video|audio)/)&&(o=""),"window"===C?(l=d=Math.round(2*screen.availWidth/3),c=p=Math.round(2*screen.availHeight/3),parseInt(a.width)&&parseInt(a.height)?(l=parseInt(a.width),c=parseInt(a.height)):a.dim&&(r=a.dim.split("x"),l=parseInt(r[0]),c=parseInt(r[1])),d>=l&&p>=c?(d=l,p=c):l-d>c-p?p=Math.round(c*(d/l)):d=Math.round(l*(p/c)),s="width="+d+",height="+p,i=window.open(o,g,s+",top=50,left=50,scrollbars=yes,resizable=yes,titlebar=no")):("tabs"===C&&(g=a.hash),i=window.open("about:blank",g)),!i)return b.reject("errPopup");if(""===o){var z=document.createElement("form");z.action=t.options.url,z.method="POST",z.target=g,z.style.display="none";var T=Object.assign({},t.customData,{cmd:"file",target:a.hash,_t:a.ts||parseInt(+new Date/1e3)});e.each(T,function(e,t){var n=document.createElement("input");n.name=e,n.value=t,z.appendChild(n)}),document.body.appendChild(z),z.submit()}else"window"!==C&&(i.location=o);e(i).trigger("focus")}}return h.remove(),b.resolve(n)};if(w>1)t.confirm({title:"openMulti",text:["openMultiConfirm",w+""],accept:{label:"cmdopen",callback:function(){z()}},cancel:{label:"btnCancel",callback:function(){b.reject()}},buttons:t.getCommand("zipdl")&&t.isCommandEnabled("zipdl",t.cwd().hash)?[{label:"cmddownload",callback:function(){t.exec("download",n),b.reject()}}]:[]});else{if(g=t.storage("selectAction")||k.selectAction,g&&(e.each(g.split("/"),function(){var e=this.valueOf();return("open"===e||!(v=t.getCommand(e))||!v.enabled())&&void(v=null)}),v))return t.exec(v.name);z()}return b}}).prototype={forceLoad:!0},i.prototype.commands.opendir=function(){this.alwaysEnabled=!0,this.getstate=function(){var e,t=this.fm.selected(),n=t.length;return 1!==n?-1:(e=this.fm.getUI("workzone"),e.hasClass("elfinder-search-result")?0:-1)},this.exec=function(t){var n,i=this.fm,a=e.Deferred(),o=this.files(t),r=o.length;return r&&o[0].phash?(n=o[0].phash,i.trigger("searchend",{noupdate:!0}),i.request({data:{cmd:"open",target:n},notify:{type:"open",cnt:1,hideCnt:!0},syncOnFail:!1}),a):a.reject()}},i.prototype.commands.opennew=function(){var t=this.fm;this.shortcuts=[{pattern:("function"==typeof t.options.getFileCallback?"shift+":"")+"ctrl+enter"}],this.getstate=function(e){var t=this.files(e),n=t.length;return 1===n&&"directory"===t[0].mime&&t[0].read?0:-1},this.exec=function(t){var n,i,a,o,r=e.Deferred(),s=this.files(t),l=s.length,c=this.options;return 1===l&&(n=s[0])&&"directory"===n.mime?(i=window.location,a=c.url?c.url:i.pathname,c.useOriginQuery&&(a.match(/\?/)?i.search&&(a+="&"+i.search.substr(1)):a+=i.search),a+="#elf_"+n.hash,o=window.open(a,"_blank"),setTimeout(function(){o.focus()},1e3),r.resolve()):r.reject()}},i.prototype.commands.paste=function(){this.updateOnSelect=!1,this.handlers={changeclipboard:function(){this.update()}},this.shortcuts=[{pattern:"ctrl+v shift+insert"}],this.getstate=function(e){if(this._disabled)return-1;if(e){if(Array.isArray(e)){if(1!=e.length)return-1;e=this.fm.file(e[0])}}else e=this.fm.cwd();return this.fm.clipboard().length&&"directory"==e.mime&&e.write?0:-1},this.exec=function(t,n){var i,a,o=this,r=o.fm,s=n||{},l=t?this.files(t)[0]:r.cwd(),c=r.clipboard(),d=c.length,p=!!d&&c[0].cut,u=s._cmd?s._cmd:p?"move":"copy",h="err"+u.charAt(0).toUpperCase()+u.substr(1),f=[],m=[],g=e.Deferred().fail(function(e){e&&r.error(e)}).always(function(){r.unlockfiles({files:e.map(c,function(e){return e.hash})})}),v=function(t){return t.length&&r._commands.duplicate?r.exec("duplicate",t):e.Deferred().resolve()},b=function(t){var n,i=e.Deferred(),a=[],c={},d=function(t,n){for(var i=[],a=t.length;a--;)e.inArray(t[a].name,n)!==-1&&i.unshift(a);return i},h=function(e){var n=a[e],o=t[n],s=e==a.length-1;o&&r.confirm({title:r.i18n(u+"Files"),text:["errExists",o.name,"restore"===u?"confirmRest":"confirmRepl"],all:!s,accept:{label:"btnYes",callback:function(n){s||n?m(t):h(++e)}},reject:{label:"btnNo",callback:function(n){var i;if(n)for(i=a.length;e<i--;)t[a[i]].remove=!0;else t[a[e]].remove=!0;s||n?m(t):h(++e)}},cancel:{label:"btnCancel",callback:function(){i.resolve()}},buttons:[{label:"btnBackup",callback:function(n){var i;if(n)for(i=a.length;e<i--;)t[a[i]].rename=!0;else t[a[e]].rename=!0;s||n?m(t):h(++e)}}]})},f=function(n){var i,o={};n&&(Array.isArray(n)?n.length&&("string"==typeof n[0]?a=d(t,n):(e.each(n,function(e,t){o[t.name]=t.hash}),a=d(t,e.map(o,function(e,t){return t})),e.each(t,function(e,t){o[t.name]&&(c[o[t.name]]=t.name)}))):(i=[],a=e.map(n,function(e){return"string"==typeof e?e:(i=i.concat(e),!1)}),i.length&&(a=a.concat(i)),a=d(t,a),c=n)),a.length?h(0):m(t)},m=function(t){var n,a,o=[],d=e.grep(t,function(e){return e.rename&&o.push(e.name),!e.remove}),h=d.length;return h?(n=e.map(d,function(e){return e.hash}),a={cmd:"paste",dst:l.hash,targets:n,cut:p?1:0,renames:o,hashes:c,suffix:r.options.backupSuffix},r.api<2.1&&(a.src=d[0].phash),void r.request({data:a,notify:{type:u,cnt:h},navigate:{toast:s.noToast?{}:{inbuffer:{msg:r.i18n(["complete",r.i18n("cmd"+u)]),action:{cmd:"open",msg:"cmdopendir",data:[l.hash],done:"select",cwdNot:l.hash}}}}}).done(function(t){var n={},o=t.added&&t.added.length?t.added:null;p&&o&&(e.each(d,function(t,i){var a=i.phash,r=function(t){var n;return e.each(o,function(e,i){if(i.name===t)return n=i.hash,!1}),n},s=r(i.name);s&&(n[a]?n[a].push(s):n[a]=[s])}),Object.keys(n).length&&(t.undo={cmd:"move",callback:function(){var t=[];return e.each(n,function(e,n){t.push(r.request({data:{cmd:"paste",dst:e,targets:n,cut:1},notify:{type:"undo",cnt:n.length}}))}),e.when.apply(null,t)}},t.redo={cmd:"move",callback:function(){return r.request({data:a,notify:{type:"redo",cnt:h}})}})),i.resolve(t)}).fail(function(){i.reject()}).always(function(){r.unlockfiles({files:d})})):i.resolve()};return r.isCommandEnabled(o.name,l.hash)&&t.length?(r.oldAPI?m(t):r.option("copyOverwrite",l.hash)?(n=e.map(t,function(e){return e.name}),l.hash==r.cwd().hash?f(e.map(r.files(),function(e){return e.phash==l.hash?{hash:e.hash,name:e.name}:null})):r.request({data:{cmd:"ls",target:l.hash,intersect:n},notify:{type:"prepare",cnt:1,hideCnt:!0},preventFail:!0}).always(function(e){f(e.list)})):m(t),i):i.resolve()};return d&&l&&"directory"==l.mime?l.write?(i=r.parents(l.hash),e.each(c,function(t,n){return n.read?p&&n.locked?!g.reject(["errLocked",n.name]):e.inArray(n.hash,i)!==-1?!g.reject(["errCopyInItself",n.name]):n.mime&&"directory"!==n.mime&&!r.uploadMimeCheck(n.mime,l.hash)?!g.reject([h,n.name,"errUploadMime"]):(a=r.parents(n.hash),a.pop(),e.inArray(l.hash,a)!==-1&&e.grep(a,function(e){var t=r.file(e);return t.phash==l.hash&&t.name==n.name}).length?!g.reject(["errReplByChild",n.name]):void(n.phash==l.hash?m.push(n.hash):f.push({hash:n.hash,phash:n.phash,name:n.name}))):!g.reject([h,n.name,"errPerm"])}),"rejected"==g.state()?g:(e.when(v(m),b(f)).done(function(e,t){g.resolve(t&&t.undo?t:void 0)}).fail(function(){g.reject()}).always(function(){p&&r.clipboard([])}),g)):g.reject([h,c[0].name,"errPerm"]):g.reject()}},i.prototype.commands.places=function(){var t=this,n=this.fm,i=function(n){return e.grep(t.files(n),function(e){return"directory"==e.mime})},a=null;this.getstate=function(e){var t=this.hashes(e),n=t.length;return a&&n&&n==i(t).length?0:-1},this.exec=function(t){var n=this.files(t);return a.trigger("regist",[n]),e.Deferred().resolve()},n.one("load",function(){a=n.ui.places})},i.prototype.commands.preference=function(){var t,n,i=this,a=this.fm,o="replace",r='<li class="'+a.res("class","tabstab")+' elfinder-preference-tab-{id}"><a href="#'+a.namespace+'-preference-{id}" id="'+a.namespace+'-preference-tab-{id}" class="ui-tabs-anchor {class}">{title}</a></li>',s=e('<div class="ui-tabs ui-widget ui-widget-content ui-corner-all elfinder-preference">'),l=e('<ul class="ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-top">'),c=e('<div class="elfinder-preference-tabs ui-tabs-panel ui-widget-content ui-corner-bottom"/>'),d=(e("base").length?document.location.href.replace(/#.*$/,""):"",function(t){e("#"+a.namespace+"-preference-tab-"+t).trigger("mouseover").trigger("click"),n=t}),p=a.res("class","tabsactive"),u=function(){var u=i.options.categories||{language:["language"],theme:["theme"],toolbar:["toolbarPref"],workspace:["iconSize","columnPref","selectAction","makefileTypes","useStoredEditor","editorMaximized","showHidden"],dialog:["autoFocusDialog"],selectionInfo:["infoItems","hashChecker"],reset:["clearBrowserData"],all:!0},h=i.options.prefs||["language","theme","toolbarPref","iconSize","columnPref","selectAction","makefileTypes","useStoredEditor","editorMaximized","showHidden","infoItems","hashChecker","autoFocusDialog","clearBrowserData"];h=a.arrayFlip(h,!0),a.options.getFileCallback&&delete h.selectAction,h.language&&(h.language=function(){var t=e("<select/>").on("change",function(){var t=e(this).val();a.storage("lang",t),e("#"+a.id).elfinder("reload")}),n=[],o=i.options.langs||{ar:"اللغة العربية",bg:"Български",ca:"Català",cs:"Čeština",da:"Dansk",de:"Deutsch",el:"Ελληνικά",en:"English",es:"Español",fa:"فارسی",fo:"Føroyskt",fr:"Français",he:"עברית",hr:"Hrvatski",hu:"Magyar",id:"Bahasa Indonesia",it:"Italiano",ja:"日本語",ko:"한국어",nl:"Nederlands",no:"Norsk",pl:"Polski",pt_BR:"Português",ro:"Română",ru:"Pусский",si:"සිංහල",sk:"Slovenčina",sl:"Slovenščina",sr:"Srpski",sv:"Svenska",tr:"Türkçe",ug_CN:"ئۇيغۇرچە",uk:"Український",vi:"Tiếng Việt",zh_CN:"简体中文",zh_TW:"正體中文"};return e.each(o,function(e,t){n.push('<option value="'+e+'">'+t+"</option>")}),t.append(n.join("")).val(a.lang)}()),h.theme&&(h.theme=function(){var t=a.options.themes?Object.keys(a.options.themes).length:0;if(0===t||1===t&&a.options.themes["default"])return null;var n=e("<select/>").on("change",function(){var t=e(this).val();a.changeTheme(t).storage("theme",t)}),i={image:'<img class="elfinder-preference-theme elfinder-preference-theme-image" src="$2" />',link:'<a href="$1" target="_blank" title="$3">$2</a>',data:'<dt>$1</dt><dd><span class="elfinder-preference-theme elfinder-preference-theme-$0">$2</span></dd>'},o=["image","description","author","email","license"],r=e('<button class="ui-button ui-corner-all ui-widget elfinder-preference-theme-default"/>').text(a.i18n("default")).on("click",function(e){n.val("default").trigger("change")}),s=e('<div class="elfinder-reference-hide-taball"/>').on("click","button",function(){var t=e(this).data("themeid");n.val(t).trigger("change")});return a.options.themes["default"]||n.append('<option value="default">'+a.i18n("default")+"</option>"),e.each(a.options.themes,function(t,r){var l,c=e('<option class="elfinder-theme-option-'+t+'" value="'+t+'">'+a.i18n(t)+"</option>"),d=e('<fieldset class="ui-widget ui-widget-content ui-corner-all elfinder-theme-list-'+t+'"><legend>'+a.i18n(t)+'</legend><div><span class="elfinder-spinner"/></div></fieldset>');n.append(c),s.append(d),l=setTimeout(function(){d.find("span.elfinder-spinner").replaceWith(a.i18n(["errRead",t]))},1e4),a.getTheme(t).always(function(){l&&clearTimeout(l)}).done(function(r){var s,l=e(),p=e("<dl/>");s=r.link?i.link.replace(/\$1/g,r.link).replace(/\$3/g,a.i18n("website")):"$2",r.name&&c.html(a.i18n(r.name)),d.children("legend").html(s.replace(/\$2/g,a.i18n(r.name)||t)),e.each(o,function(o,s){var l,c=i[s]||i.data;r[s]&&(l=c.replace(/\$0/g,a.escape(s)).replace(/\$1/g,a.i18n(s)).replace(/\$2/g,a.i18n(r[s])),"image"===s&&r.link&&(l=e(l).on("click",function(){n.val(t).trigger("change")}).attr("title",a.i18n("select"))),p.append(l))}),l=l.add(p),l=l.add(e('<div class="elfinder-preference-theme-btn"/>').append(e('<button class="ui-button ui-corner-all ui-widget"/>').data("themeid",t).html(a.i18n("select")))),d.find("span.elfinder-spinner").replaceWith(l)}).fail(function(){d.find("span.elfinder-spinner").replaceWith(a.i18n(["errRead",t]))})}),e("<div/>").append(n.val(a.theme&&a.theme.id?a.theme.id:"default"),r,s)}()),h.toolbarPref&&(h.toolbarPref=function(){var t=e.map(a.options.uiOptions.toolbar,function(t){return e.isArray(t)?t:null}),n=[],i=a.storage("toolbarhides")||{};return e.each(t,function(){var e=this,t=a.i18n("cmd"+e);t==="cmd"+e&&(t=a.i18n(e)),n.push('<span class="elfinder-preference-toolbar-item"><label><input type="checkbox" value="'+e+'" '+(i[e]?"":"checked")+"/>"+t+"</label></span>")}),e(n.join(" ")).on("change","input",function(){var t=e(this).val(),n=e(this).is(":checked");n||i[t]?n&&i[t]&&delete i[t]:i[t]=!0,a.storage("toolbarhides",i),a.trigger("toolbarpref")})}()),h.iconSize&&(h.iconSize=function(){var t=a.options.uiOptions.cwd.iconsView.sizeMax||3,n=a.storage("iconsize")||0,i=e('<div class="touch-punch"/>').slider({classes:{"ui-slider-handle":"elfinder-tabstop"},value:n,max:t,slide:function(e,t){a.getUI("cwd").trigger("iconpref",{size:t.value})},change:function(e,t){a.storage("iconsize",t.value)}});return a.getUI("cwd").on("iconpref",function(e,t){i.slider("option","value",t.size)}),i}()),h.columnPref&&(h.columnPref=function(){var t=a.options.uiOptions.cwd.listView.columns,n=[],i=a.storage("columnhides")||{};return e.each(t,function(){var e=this,t=a.getColumnName(e);n.push('<span class="elfinder-preference-column-item"><label><input type="checkbox" value="'+e+'" '+(i[e]?"":"checked")+"/>"+t+"</label></span>")}),e(n.join(" ")).on("change","input",function(){var t=e(this).val(),n=e(this).is(":checked");n||i[t]?n&&i[t]&&delete i[t]:i[t]=!0,a.storage("columnhides",i),a.trigger("columnpref",{repaint:!0})})}()),h.selectAction&&(h.selectAction=function(){var t=e("<select/>").on("change",function(){var t=e(this).val();a.storage("selectAction","default"===t?null:t)}),n=[],o=i.options.selectActions,r=a.getCommand("open").options.selectAction||"open";return e.inArray(r,o)===-1&&o.unshift(r),e.each(o,function(t,i){var o=e.map(i.split("/"),function(e){var t=a.i18n("cmd"+e);return t==="cmd"+e&&(t=a.i18n(e)),t});n.push('<option value="'+i+'">'+o.join("/")+"</option>")}),t.append(n.join("")).val(a.storage("selectAction")||r)}()),h.makefileTypes&&(h.makefileTypes=function(){var t=a.storage("mkfileHides")||{},n=function(){var n=[];return t=a.storage("mkfileHides")||{},e.each(a.mimesCanMakeEmpty,function(e,i){var o=a.getCommand("mkfile").getTypeName(e,i);n.push('<span class="elfinder-preference-column-item" title="'+a.escape(o)+'"><label><input type="checkbox" value="'+e+'" '+(t[e]?"":"checked")+"/>"+i+"</label></span>")}),n.join(" ")},i=e("<div/>").on("change","input",function(){var n=e(this).val(),i=e(this).is(":checked");i||t[n]?i&&t[n]&&delete t[n]:t[n]=!0,a.storage("mkfileHides",t),a.trigger("canMakeEmptyFile")}).append(n()),o=e("<div/>").append(e('<input type="text" placeholder="'+a.i18n("typeOfTextfile")+'"/>').on("keydown",function(t){t.keyCode===e.ui.keyCode.ENTER&&e(this).next().trigger("click")}),e('<button class="ui-button"/>').html(a.i18n("add")).on("click",function(){var t,n=e(this).prev(),i=n.val(),o=a.getUI("toast"),r=function(){return o.appendTo(n.closest(".ui-dialog")),a.toast({msg:a.i18n("errUsupportType"),mode:"warning",onHidden:function(){1===o.children().length&&o.appendTo(a.getUI())}}),n.trigger("focus"),!1};if(!i.match(/\//)){if(i=a.arrayFlip(a.mimeTypes)[i],!i)return r();n.val(i)}return a.mimeIsText(i)&&a.mimeTypes[i]?(a.trigger("canMakeEmptyFile",{mimes:[i],unshift:!0}),t={},t[i]=a.mimeTypes[i],a.storage("mkfileTextMimes",Object.assign(t,a.storage("mkfileTextMimes")||{})),n.val(""),o.appendTo(n.closest(".ui-dialog")),void a.toast({msg:a.i18n(["complete",i+" ("+t[i]+")"]),onHidden:function(){1===o.children().length&&o.appendTo(a.getUI())}})):r()}),e('<button class="ui-button"/>').html(a.i18n("reset")).on("click",function(){a.one("canMakeEmptyFile",{done:function(){i.empty().append(n())}}),a.trigger("canMakeEmptyFile",{resetTexts:!0})}));return a.bind("canMakeEmptyFile",{done:function(e){e.data&&e.data.mimes&&e.data.mimes.length&&i.empty().append(n())}}),e("<div/>").append(i,o)}()),h.useStoredEditor&&(h.useStoredEditor=e('<input type="checkbox"/>').prop("checked",function(){var e=a.storage("useStoredEditor");return e?e>0:a.options.commandsOptions.edit.useStoredEditor}()).on("change",function(t){a.storage("useStoredEditor",e(this).is(":checked")?1:-1)})),h.editorMaximized&&(h.editorMaximized=e('<input type="checkbox"/>').prop("checked",function(){var e=a.storage("editorMaximized");return e?e>0:a.options.commandsOptions.edit.editorMaximized}()).on("change",function(t){a.storage("editorMaximized",e(this).is(":checked")?1:-1)})),h.showHidden&&!function(){var t,n=function(){var n,i=a.storage("hide"),o=[];i&&i.items&&e.each(i.items,function(e,t){o.push(a.escape(t))}),r.prop("disabled",!o.length)[o.length?"removeClass":"addClass"]("ui-state-disabled"),n=o.length?o.join("\n"):"",h.showHidden.attr("title",n),t&&h.showHidden.tooltip("option","content",n.replace(/\n/g,"<br>")).tooltip("close")},i=e('<input type="checkbox"/>').prop("checked",function(){var e=a.storage("hide");return e&&e.show}()).on("change",function(t){var n={};n[e(this).is(":checked")?"show":"hide"]=!0,a.exec("hide",void 0,n)}),o=e('<button class="ui-button ui-corner-all ui-widget"/>').append(a.i18n("reset")).on("click",function(){a.exec("hide",void 0,{reset:!0}),e(this).parent().find("input:first").prop("checked",!1),n()}),r=e().add(i).add(o);h.showHidden=e("<div/>").append(i,o),a.bind("hide",function(e){var t=e.data;t.opts&&(t.opts.show||t.opts.hide)||n()}),a.UA.Mobile&&e.fn.tooltip&&(t=!0,h.showHidden.tooltip({classes:{"ui-tooltip":"elfinder-ui-tooltip ui-widget-shadow"},tooltipClass:"elfinder-ui-tooltip ui-widget-shadow",track:!0}).css("user-select","none"),o.css("user-select","none")),n()}(),h.infoItems&&(h.infoItems=function(){var t=a.getCommand("info").items,n=[],i=a.storage("infohides")||a.arrayFlip(a.options.commandsOptions.info.hideItems,!0);return e.each(t,function(){var e=this,t=a.i18n(e);n.push('<span class="elfinder-preference-info-item"><label><input type="checkbox" value="'+e+'" '+(i[e]?"":"checked")+"/>"+t+"</label></span>")}),e(n.join(" ")).on("change","input",function(){var t=e(this).val(),n=e(this).is(":checked");n||i[t]?n&&i[t]&&delete i[t]:i[t]=!0,a.storage("infohides",i),a.trigger("infopref",{repaint:!0})})}()),h.hashChecker&&a.hashCheckers.length&&(h.hashChecker=function(){var t=[],n=a.arrayFlip(a.storage("hashchekcer")||a.options.commandsOptions.info.showHashAlgorisms,!0);return e.each(a.hashCheckers,function(){var e=this,i=a.i18n(e);t.push('<span class="elfinder-preference-hashchecker-item"><label><input type="checkbox" value="'+e+'" '+(n[e]?"checked":"")+"/>"+i+"</label></span>")}),e(t.join(" ")).on("change","input",function(){var t=e(this).val(),i=e(this).is(":checked");i?n[t]=!0:n[t]&&delete n[t],a.storage("hashchekcer",e.grep(a.hashCheckers,function(e){return n[e]}))})}()),h.autoFocusDialog&&(h.autoFocusDialog=e('<input type="checkbox"/>').prop("checked",function(){var e=a.storage("autoFocusDialog");return e?e>0:a.options.uiOptions.dialog.focusOnMouseOver}()).on("change",function(t){a.storage("autoFocusDialog",e(this).is(":checked")?1:-1)})),h.clearBrowserData&&(h.clearBrowserData=e("<button/>").text(a.i18n("reset")).button().on("click",function(t){t.preventDefault(),a.storage(),e("#"+a.id).elfinder("reload")})),e.each(u,function(t,i){var s,d;i===!0?d=1:i&&(s=e(),e.each(i,function(t,n){var i,o,r,l="";(i=h[n])&&(d=2,o=a.i18n(n),r=e(i).filter('input[type="checkbox"]'),r.length||(r=e(i).find('input[type="checkbox"]')),1===r.length?(r.attr("id")||r.attr("id","elfinder-preference-"+n+"-checkbox"),o='<label for="'+r.attr("id")+'">'+o+"</label>"):r.length>1&&(l=" elfinder-preference-checkboxes"),s=s.add(e('<dt class="elfinder-preference-'+n+l+'">'+o+"</dt>")).add(e('<dd class="elfinder-preference-'+n+l+'"/>').append(i)))})),d&&(l.append(r[o](/\{id\}/g,t)[o](/\{title\}/,a.i18n(t))[o](/\{class\}/,n===t?"elfinder-focus":"")),2===d&&c.append(e('<div id="'+a.namespace+"-preference-"+t+'" class="elfinder-preference-content"/>').hide().append(e("<dl/>").append(s))))}),l.on("click","a",function(t){var n=e(t.target),i=n.attr("href");t.preventDefault(),t.stopPropagation(),l.children().removeClass(p),n.removeClass("ui-state-hover").parent().addClass(p),i.match(/all$/)?c.addClass("elfinder-preference-taball").children().show():(c.removeClass("elfinder-preference-taball").children().hide(),e(i).show())}).on("focus blur","a",function(t){e(this).parent().toggleClass("ui-state-focus","focusin"===t.type)}).on("mouseenter mouseleave","li",function(t){e(this).toggleClass("ui-state-hover","mouseenter"===t.type)}),c.find("a,input,select,button").addClass("elfinder-tabstop"),s.append(l,c),t=i.fmDialog(s,{title:i.title,width:i.options.width||600,height:i.options.height||400,maxWidth:"window",maxHeight:"window",autoOpen:!1,destroyOnClose:!1,allowMinimize:!1,open:function(){n&&d(n),n=null},resize:function(){c.height(t.height()-l.outerHeight(!0)-(c.outerHeight(!0)-c.height())-5)}}).on("click",function(e){e.stopPropagation()}).css({overflow:"hidden"}),t.closest(".ui-dialog").css({overflow:"hidden"}).addClass("elfinder-bg-translucent"),n="all"};this.shortcuts=[{pattern:"ctrl+comma",description:this.title}],this.alwaysEnabled=!0,this.getstate=function(){return 0},this.exec=function(n,i){return!t&&u(),i&&(i.tab?d(i.tab):"cwd"===i._currentType&&d("workspace")),t.elfinderdialog("open"),e.Deferred().resolve()}},(i.prototype.commands.quicklook=function(){var t,n,i,a,o,r,s,l,c,d,p=this,u=p.fm,h=0,f=1,m=2,g=3,v=4,b=h,y=Element.update?"quicklookupdate":"update",w="elfinder-quicklook-navbar-icon",x="elfinder-quicklook-fullscreen",k="elfinder-quicklook-info-wrapper",C=function(t){e(document).trigger(e.Event("keydown",{keyCode:t,ctrlKey:!1,shiftKey:!1,altKey:!1,metaKey:!1}))},z=function(e){var t=u.getUI().offset(),n=function(){var t=e.find(".elfinder-cwd-file-wrapper");return t.length?t:e}(),i=n.offset()||{top:0,
left:0};return{opacity:0,width:n.width(),height:n.height()-30,top:i.top-t.top,left:i.left-t.left}},T=function(){var i=p.options.contain,a=i?u.getUI():e(window),o=u.getUI().offset(),r=Math.min(t,a.width()-10),s=Math.min(n,a.height()-80);return{opacity:1,width:r,height:s,top:parseInt((a.height()-s-60)/2+(i?0:a.scrollTop()-o.top)),left:parseInt((a.width()-r)/2+(i?0:a.scrollLeft()-o.left))}},A={},S=function(e,t){var n=t||e.substr(0,e.indexOf("/")),i=A[n]?A[n]:A[n]=document.createElement(n),a=!1;try{a=i.canPlayType&&i.canPlayType(e)}catch(o){}return!(!a||""===a||"no"==a)},I=window.navigator.platform.indexOf("Win")!=-1,O=!1,j=!1,M=!1,D=null,F=e.ui.keyCode.LEFT,E=e.ui.keyCode.RIGHT,U="mousemove touchstart "+("onwheel"in document?"wheel":"onmousewheel"in document?"mousewheel":"DOMMouseScroll"),P=e('<span class="elfinder-dialog-title elfinder-quicklook-title"/>'),R=e("<div/>"),q=e('<div class="elfinder-quicklook-info"/>'),H=e('<div class="ui-front elfinder-quicklook-cover"/>'),_=e('<div class="'+w+" "+w+'-fullscreen"/>').on("click touchstart",function(t){if(!M){var n=p.window,i=n.hasClass(x),o=e(window),r=function(){p.preview.trigger("changesize")};t.stopPropagation(),t.preventDefault(),i?(J="",L(),n.toggleClass(x).css(n.data("position")),o.trigger(p.resize).off(p.resize,r),K.off("mouseenter mouseleave"),H.off(U)):(n.toggleClass(x).data("position",{left:n.css("left"),top:n.css("top"),width:n.width(),height:n.height(),display:"block"}).removeAttr("style"),e(window).on(p.resize,r).trigger(p.resize),H.on(U,function(e){j||("mousemove"!==e.type&&"touchstart"!==e.type||(L(),D=setTimeout(function(){(u.UA.Mobile||K.parent().find(".elfinder-quicklook-navbar:hover").length<1)&&K.fadeOut("slow",function(){H.show()})},3e3)),H.is(":visible")&&(W(),H.data("tm",setTimeout(function(){H.show()},3e3))))}).show().trigger("mousemove"),K.on("mouseenter mouseleave",function(e){j||("mouseenter"===e.type?L():H.trigger("mousemove"))})),u.zIndex&&n.css("z-index",u.zIndex+1),u.UA.Mobile?K.attr("style",J):K.attr("style",J).draggable(i?"destroy":{start:function(){j=!0,M=!0,H.show(),L()},stop:function(){j=!1,J=p.navbar.attr("style"),requestAnimationFrame(function(){M=!1})}}),e(this).toggleClass(w+"-fullscreen-off");var s=n;a.is(".ui-resizable")&&(s=s.add(a)),s.resizable(i?"enable":"disable").removeClass("ui-state-disabled"),n.trigger("viewchange")}}),N=function(){p.update(void 0,function(){var t=p.fm,n=t.selectedFiles(),i=n.length,a=(p.docked(),function(){var a=0;return e.each(n,function(e,t){var n=parseInt(t.ts);a>=0?n>a&&(a=n):a="unknown"}),{hash:n[0].hash+"/"+ +new Date,name:t.i18n("items")+": "+i,mime:"group",size:G,ts:a,files:e.map(n,function(e){return e.hash}),getSize:!0}});return i||(i=1,n=[t.cwd()]),1===i?n[0]:a()}())},L=function(){p.window.hasClass(x)&&(D&&clearTimeout(D),D=null,K.stop(!0,!0).css("display","block"),W())},W=function(){H.data("tm")&&clearTimeout(H.data("tm")),H.removeData("tm"),H.hide()},B=e('<div class="'+w+" "+w+'-prev"/>').on("click touchstart",function(e){return!M&&C(F),!1}),$=e('<div class="'+w+" "+w+'-next"/>').on("click touchstart",function(e){return!M&&C(E),!1}),K=e('<div class="elfinder-quicklook-navbar"/>').append(B).append(_).append($).append('<div class="elfinder-quicklook-navbar-separator"/>').append(e('<div class="'+w+" "+w+'-close"/>').on("click touchstart",function(e){return!M&&p.window.trigger("close"),!1})),V=e('<span class="ui-front ui-icon elfinder-icon-close ui-icon-closethick"/>').on("mousedown",function(e){e.stopPropagation(),p.window.trigger("close")}),X=e('<span class="ui-front ui-icon elfinder-icon-minimize ui-icon-minusthick"/>').on("mousedown",function(e){e.stopPropagation(),p.docked()?p.window.trigger("navdockout"):p.window.trigger("navdockin")}),G='<span class="elfinder-spinner-text">'+u.i18n("calc")+'</span><span class="elfinder-spinner"/>',J="",Y=!0;this.cover=H,this.evUpdate=y,(this.navbar=K)._show=L,this.resize="resize."+u.namespace,this.info=e("<div/>").addClass(k).append(R).append(q),this.autoPlay=function(){return!!p.opened()&&!!p.options[p.docked()?"dockAutoplay":"autoplay"]},this.preview=e('<div class="elfinder-quicklook-preview ui-helper-clearfix"/>').on("change",function(){L(),K.attr("style",J),p.docked()&&K.hide(),p.preview.attr("style","").removeClass("elfinder-overflow-auto"),p.info.attr("style","").hide(),p.cover.removeClass("elfinder-quicklook-coverbg"),R.removeAttr("class").attr("style",""),q.html("")}).on(y,function(t){var n,i,a=(p.preview,t.file),r='<div class="elfinder-quicklook-info-data">{value}</div>',s=function(){var s=p.window.css("overflow","hidden");i=u.escape(a.i18||a.name),!a.read&&t.stopImmediatePropagation(),p.window.data("hash",a.hash),p.preview.off("changesize").trigger("change").children().remove(),P.html(i),B.css("visibility",""),jQuery.css("visibility",""),a.hash===u.cwdId2Hash(o.find("[id]:not(.elfinder-cwd-parent):first").attr("id"))&&B.css("visibility","hidden"),a.hash===u.cwdId2Hash(o.find("[id]:last").attr("id"))&&jQuery.css("visibility","hidden"),"directory"===a.mime?c=[a.hash]:"group"===a.mime&&a.getSize&&(c=a.files),q.html(r.replace(/\{value\}/,i)+r.replace(/\{value\}/,u.mime2kind(a))+r.replace(/\{value\}/,c.length?G:u.formatSize(a.size))+r.replace(/\{value\}/,u.i18n("modify")+": "+u.formatDate(a))),c.length&&(l=u.getSize(c).done(function(e){q.find("span.elfinder-spinner").parent().html(e.formated)}).fail(function(){q.find("span.elfinder-spinner").parent().html(u.i18n("unknown"))}).always(function(){l=null}),l._hash=a.hash),R.addClass("elfinder-cwd-icon ui-corner-all "+u.mime2class(a.mime)),a.icon&&R.css(u.getIconStyle(a,!0)),p.info.attr("class",k),a.csscls&&p.info.addClass(a.csscls),a.read&&(n=u.tmb(a))&&e("<img/>").hide().appendTo(p.preview).on("load",function(){R.addClass(n.className).css("background-image","url('"+n.url+"')"),e(this).remove()}).attr("src",n.url),p.info.delay(100).fadeIn(10),p.window.hasClass(x)&&H.trigger("mousemove"),s.css("overflow","")},c=[];a&&!Object.keys(a).length&&(a=u.cwd()),a&&l&&"pending"===l.state()&&l._hash!==a.hash&&l.reject(),a&&(t.forceUpdate||p.window.data("hash")!==a.hash)?s():t.stopImmediatePropagation()}),this.window=e('<div class="ui-front ui-helper-reset ui-widget elfinder-quicklook touch-punch" style="position:absolute"/>').hide().addClass(u.UA.Touch?"elfinder-touch":"").on("click",function(e){var t=this;e.stopPropagation(),b===m&&requestAnimationFrame(function(){b===m&&u.toFront(t)})}).append(e('<div class="ui-dialog-titlebar ui-widget-header ui-corner-top ui-helper-clearfix elfinder-quicklook-titlebar"/>').append(e('<span class="ui-widget-header ui-dialog-titlebar-close ui-corner-all elfinder-titlebar-button elfinder-quicklook-titlebar-icon'+(I?" elfinder-titlebar-button-right":"")+'"/>').append(V,X),P),this.preview,p.info.hide(),H.hide(),K).draggable({handle:"div.elfinder-quicklook-titlebar"}).on("open",function(e,t){var n=p.window,i=p.value,a=u.getUI("cwd"),o=function(e){b=e,p.update(1,p.value),p.change(),n.trigger("resize."+u.namespace)};Y||b!==h?b===v&&(u.getUI("navdock").data("addNode")(c),o(g),p.preview.trigger("changesize"),u.storage("previewDocked","1"),0===u.getUI("navdock").width()&&n.trigger("navdockout")):(i&&i.hash!==r&&(a=u.cwdHash2Elm(i.hash.split("/",2)[0])),J="",K.attr("style",""),b=f,a.trigger("scrolltoview"),W(),n.css(t||z(a)).show().animate(T(),550,function(){o(m),L()}),u.toFront(n))}).on("close",function(e,t){var n,i=p.window,a=p.preview.trigger("change"),r=(p.value,(i.data("hash")||"").split("/",2)[0]),s=function(e,n){b=e,n&&u.toHide(i),a.children().remove(),p.update(0,p.value),i.data("hash",""),t&&t.resolve()};p.opened()&&(l&&"pending"===l.state()&&l.reject(),p.docked()?(c=u.getUI("navdock").data("removeNode")(p.window.attr("id"),"detach"),s(v),u.storage("previewDocked","2")):(b=f,i.hasClass(x)&&_.click(),r&&(n=o.find("#"+r)).length?i.animate(z(n),500,function(){s(h,!0)}):s(h,!0)))}).on("navdockin",function(e,t){var n=p.window,a=u.getUI("navdock"),o=s||a.width(),r=t||{};Y&&(r.init=!0),b=g,i=n.attr("style"),n.toggleClass("ui-front").removeClass("ui-widget").draggable("disable").resizable("disable").removeAttr("style").css({width:"100%",height:o,boxSizing:"border-box",paddingBottom:0,zIndex:"unset"}),K.hide(),X.toggleClass("ui-icon-plusthick ui-icon-minusthick elfinder-icon-full elfinder-icon-minimize"),u.toHide(n,!0),a.data("addNode")(n,r),p.preview.trigger("changesize"),u.storage("previewDocked","1")}).on("navdockout",function(t){var n=p.window,a=u.getUI("navdock"),o=(e.Deferred(),z(p.preview));s=n.outerHeight(),a.data("removeNode")(n.attr("id"),u.getUI()),n.toggleClass("ui-front").addClass("ui-widget").draggable("enable").resizable("enable").attr("style",i),X.toggleClass("ui-icon-plusthick ui-icon-minusthick elfinder-icon-full elfinder-icon-minimize"),b=h,n.trigger("open",o),u.storage("previewDocked","0")}).on("resize."+u.namespace,function(){p.preview.trigger("changesize")}),this.alwaysEnabled=!0,this.value=null,this.handlers={select:function(e,t){d&&cancelAnimationFrame(d),e.data&&e.data.selected&&e.data.selected.length?p.opened()&&N():d=requestAnimationFrame(function(){p.opened()&&N()})},error:function(){p.window.is(":visible")&&p.window.trigger("close")},"searchshow searchhide":function(){this.opened()&&this.window.trigger("close")},navbarshow:function(){requestAnimationFrame(function(){p.docked()&&p.preview.trigger("changesize")})},destroy:function(){p.window.remove()}},this.shortcuts=[{pattern:"space"}],this.support={audio:{ogg:S("audio/ogg;"),webm:S("audio/webm;"),mp3:S("audio/mpeg;"),wav:S("audio/wav;"),m4a:S("audio/mp4;")||S("audio/x-m4a;")||S("audio/aac;"),flac:S("audio/flac;"),amr:S("audio/amr;")},video:{ogg:S("video/ogg;"),webm:S("video/webm;"),mp4:S("video/mp4;"),mkv:S("video/x-matroska;")||S("video/webm;"),"3gp":S("video/3gpp;")||S("video/mp4;"),m3u8:S("application/x-mpegURL","video")||S("application/vnd.apple.mpegURL","video"),mpd:S("application/dash+xml","video")}},A={},this.closed=function(){return b==h||b==v},this.opened=function(){return b==m||b==g},this.docked=function(){return b==g},this.addIntegration=function(e){requestAnimationFrame(function(){u.trigger("helpIntegration",Object.assign({cmd:"quicklook"},e))})},this.init=function(){var i,l=this.options,c=this.window,d=this.preview;t=l.width>0?parseInt(l.width):450,n=l.height>0?parseInt(l.height):300,"auto"!==l.dockHeight&&(s=parseInt(l.dockHeight),s||(s=void 0)),u.one("load",function(){O=u.getUI("navdock").data("dockEnabled"),!O&&X.hide(),a=u.getUI(),o=u.getUI("cwd"),u.zIndex&&c.css("z-index",u.zIndex+1),c.appendTo(a),e(document).on("keydown."+u.namespace,function(t){t.keyCode==e.ui.keyCode.ESCAPE&&p.opened()&&!p.docked()&&c.hasClass("elfinder-frontmost")&&c.trigger("close")}),c.resizable({handles:"se",minWidth:350,minHeight:120,resize:function(){d.trigger("changesize")}}),p.change(function(){p.opened()&&p.value&&(p.value.tmb&&1==p.value.tmb&&(p.value=Object.assign({},u.file(p.value.hash))),d.trigger(e.Event(y,{file:p.value})))}),d.on(y,function(e){var t,n,a;if(t=e.file){if(n=t.hash,a=u.searchStatus.mixed&&u.searchStatus.state>1,"directory"!==t.mime)if(parseInt(t.size)||t.mime.match(l.mimeRegexNotEmptyCheck)){if(p.dispInlineRegex=i,a||u.optionsByHashes[n])try{p.dispInlineRegex=new RegExp(u.option("dispInlineRegex",n),"i")}catch(e){try{p.dispInlineRegex=new RegExp(u.isRoot(t)?u.options.dispInlineRegex:u.option("dispInlineRegex",t.phash),"i")}catch(e){p.dispInlineRegex=/^$/}}}else e.stopImmediatePropagation();else p.dispInlineRegex=/^$/;p.info.show()}else e.stopImmediatePropagation()}),e.each(u.commands.quicklook.plugins||[],function(e,t){"function"==typeof t&&new t(p)})}).one("open",function(){var e,t=Number(u.storage("previewDocked")||l.docked);O&&t>=1&&(e=p.window,p.exec(),e.trigger("navdockin",{init:!0}),2===t?e.trigger("close"):(p.update(void 0,u.cwd()),p.change())),Y=!1}).bind("open",function(){r=u.cwd().hash,p.value=u.cwd();try{i=new RegExp(u.option("dispInlineRegex"),"i")}catch(e){i=/^$/}}).bind("change",function(t){t.data&&t.data.changed&&p.opened()&&e.each(t.data.changed,function(){if(p.window.data("hash")===this.hash)return p.window.data("hash",null),p.preview.trigger(y),!1})}).bind("navdockresizestart navdockresizestop",function(e){H["navdockresizestart"===e.type?"show":"hide"]()})},this.getstate=function(){return p.opened()?1:0},this.exec=function(){return p.closed()&&N(),p.enabled()&&p.window.trigger(p.opened()?"close":"open"),e.Deferred().resolve()},this.hideinfo=function(){this.info.stop(!0,!0).hide()}}).prototype={forceLoad:!0},i.prototype.commands.quicklook.plugins=[function(t){var n,i,a=["image/jpeg","image/png","image/gif","image/svg+xml","image/x-ms-bmp"],o=t.preview;n=new Image,n.onload=n.onerror=function(){2==n.height&&a.push("image/webp")},n.src="data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA",e.each(navigator.mimeTypes,function(t,n){var i=n.type;0===i.indexOf("image/")&&e.inArray(i,a)&&a.push(i)}),o.on(t.evUpdate,function(n){var r,s,l,c=t.fm,d=n.file,p=!1,u=null,h=function(e){var t=c.file(d.hash);t.width=e[0],t.height=e[1]},f=function(){var e,t,n,i,a;u&&u.state&&"pending"===u.state()&&u.reject(),p||(p=!0,e=s.get(0),t=d.width&&d.height?{w:d.width,h:d.height}:e.naturalWidth?null:{w:s.width(),h:s.height()},t&&s.removeAttr("width").removeAttr("height"),n=d.width||e.naturalWidth||e.width||s.width(),i=d.height||e.naturalHeight||e.height||s.height(),d.width&&d.height||h([n,i]),t&&s.width(t.w).height(t.h),a=(n/i).toFixed(2),o.on("changesize",function(){var e,t,n=parseInt(o.width()),i=parseInt(o.height());a<(n/i).toFixed(2)?(t=i,e=Math.floor(t*a)):(e=n,t=Math.floor(e/a)),s.width(e).height(t).css("margin-top",t<i?Math.floor((i-t)/2):0)}).trigger("changesize"),s.fadeIn(100))},m=function(){l.remove(),t.hideinfo()};i||(i=c.arrayFlip(a)),i[d.mime]&&t.dispInlineRegex.test(d.mime)&&(n.stopImmediatePropagation(),l=e('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+c.i18n("nowLoading")+'</span><span class="elfinder-spinner"/></div>').appendTo(t.info.find(".elfinder-quicklook-info")),r=c.openUrl(d.hash),s=e("<img/>").hide().appendTo(o).on("load",function(){m(),f()}).on("error",function(){l.remove()}).attr("src",r),d.width&&d.height?f():d.size>(t.options.getDimThreshold||0)&&(u=c.request({data:{cmd:"dim",target:d.hash},preventDefault:!0}).done(function(e){if(e.dim){var t=e.dim.split("x");d.width=t[0],d.height=t[1],h(t),f()}})))})},function(t){var n,i=t.fm,a=i.arrayFlip(["image/vnd.adobe.photoshop","image/x-photoshop"]),o=t.preview,r=function(e,a,r){try{i.replaceXhrSend(),n.fromURL(e).then(function(e){var n;a.attr("src",e.image.toBase64()),requestAnimationFrame(function(){n=(a.width()/a.height()).toFixed(2),o.on("changesize",function(){var e,t,i=parseInt(o.width()),r=parseInt(o.height());n<(i/r).toFixed(2)?(t=r,e=Math.floor(t*n)):(e=i,t=Math.floor(e/n)),a.width(e).height(t).css("margin-top",t<r?Math.floor((r-t)/2):0)}).trigger("changesize"),r.remove(),t.hideinfo(),a.fadeIn(100)})},function(){r.remove(),a.remove()}),i.restoreXhrSend()}catch(s){i.restoreXhrSend(),r.remove(),a.remove()}};o.on(t.evUpdate,function(s){var l,c,d,p,u,h=s.file;a[h.mime]&&i.options.cdns.psd&&!i.UA.ltIE10&&t.dispInlineRegex.test(h.mime)&&(s.stopImmediatePropagation(),d=e('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+i.i18n("nowLoading")+'</span><span class="elfinder-spinner"/></div>').appendTo(t.info.find(".elfinder-quicklook-info")),l=i.openUrl(h.hash),i.isSameOrigin(l)||(l=i.openUrl(h.hash,!0)),c=e("<img/>").hide().appendTo(o),n?r(l,c,d):(p=window.define,u=window.require,window.require=null,window.define=null,i.loadScript([i.options.cdns.psd],function(){n=require("psd"),p?window.define=p:delete window.define,u?window.require=u:delete window.require,r(l,c,d)})))})},function(t){var n=t.fm,i=n.arrayFlip(["text/html","application/xhtml+xml"]),a=t.preview;a.on(t.evUpdate,function(o){var r,s,l=o.file;i[l.mime]&&t.dispInlineRegex.test(l.mime)&&(!t.options.getSizeMax||l.size<=t.options.getSizeMax)&&(o.stopImmediatePropagation(),s=e('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+n.i18n("nowLoading")+'</span><span class="elfinder-spinner"/></div>').appendTo(t.info.find(".elfinder-quicklook-info")),a.one("change",function(){"pending"==r.state()&&r.reject()}).addClass("elfinder-overflow-auto"),r=n.request({data:{cmd:"get",target:l.hash,conv:1,_t:l.ts},options:{type:"get",cache:!0},preventDefault:!0}).done(function(n){t.hideinfo();var i=e('<iframe class="elfinder-quicklook-preview-html"/>').appendTo(a)[0].contentWindow.document;i.open(),i.write(n.content),i.close()}).always(function(){s.remove()}))})},function(t){var n=t.fm,i=n.arrayFlip(["text/x-markdown"]),a=t.preview,o=null,r=function(n,i){t.hideinfo();var r=e('<iframe class="elfinder-quicklook-preview-html"/>').appendTo(a)[0].contentWindow.document;r.open(),r.write(o(n.content)),r.close(),i.remove()},s=function(e){o=!1,e.remove()};a.on(t.evUpdate,function(l){var c,d,p=l.file;i[p.mime]&&n.options.cdns.marked&&o!==!1&&t.dispInlineRegex.test(p.mime)&&(!t.options.getSizeMax||p.size<=t.options.getSizeMax)&&(l.stopImmediatePropagation(),d=e('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+n.i18n("nowLoading")+'</span><span class="elfinder-spinner"/></div>').appendTo(t.info.find(".elfinder-quicklook-info")),a.one("change",function(){"pending"==c.state()&&c.reject()}).addClass("elfinder-overflow-auto"),c=n.request({data:{cmd:"get",target:p.hash,conv:1,_t:p.ts},options:{type:"get",cache:!0},preventDefault:!0}).done(function(e){o||window.marked?(o||(o=window.marked),r(e,d)):n.loadScript([n.options.cdns.marked],function(t){o=t||window.marked||!1,delete window.marked,o?r(e,d):s(d)},{tryRequire:!0,error:function(){s(d)}})}).fail(function(){s(d)}))})},function(t){if(t.options.viewerjs){var n=t.fm,i=t.preview,a=t.options.viewerjs,o=a.url?n.arrayFlip(a.mimes||[]):[];a.url&&i.on("update",function(r){var s,l,c=(t.window,r.file);if(o[c.mime]){var d=n.openUrl(c.hash);d&&n.isSameOrigin(d)&&(r.stopImmediatePropagation(),l=e('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+n.i18n("nowLoading")+'</span><span class="elfinder-spinner"/></div>').appendTo(t.info.find(".elfinder-quicklook-info")),s=e('<iframe class="elfinder-quicklook-preview-iframe"/>').css("background-color","transparent").on("load",function(){t.hideinfo(),l.remove(),s.css("background-color","#fff")}).on("error",function(){l.remove(),s.remove()}).appendTo(i).attr("src",a.url+"#"+d),i.one("change",function(){l.remove(),s.off("load").remove()}))}})}},function(t){var n=t.fm,i="application/pdf",a=t.preview,o=!1,r="";n.UA.Safari&&"mac"===n.OS&&!n.UA.iOS||n.UA.IE||n.UA.Firefox?o=!0:e.each(navigator.plugins,function(t,n){e.each(n,function(e,t){if(t.type===i)return!(o=!0)})}),o&&("undefined"==typeof t.options.pdfToolbar||t.options.pdfToolbar||(r="#toolbar=0"),a.on(t.evUpdate,function(s){var l=s.file;o&&l.mime===i&&t.dispInlineRegex.test(l.mime)&&(s.stopImmediatePropagation(),t.hideinfo(),t.cover.addClass("elfinder-quicklook-coverbg"),e('<object class="elfinder-quicklook-preview-pdf" data="'+n.openUrl(l.hash)+r+'" type="application/pdf" />').on("error",function(e){o=!1,t.update(void 0,n.cwd()),t.update(void 0,l)}).appendTo(a))}))},function(t){var n=t.fm,i="application/x-shockwave-flash",a=t.preview,o=!1;e.each(navigator.plugins,function(t,n){e.each(n,function(e,t){if(t.type===i)return!(o=!0)})}),o&&a.on(t.evUpdate,function(o){var r,s=o.file;s.mime===i&&t.dispInlineRegex.test(s.mime)&&(o.stopImmediatePropagation(),t.hideinfo(),r=e('<embed class="elfinder-quicklook-preview-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" src="'+n.openUrl(s.hash)+'" quality="high" type="application/x-shockwave-flash" wmode="transparent" />').appendTo(a))})},function(t){var n,i,a,o,r=t.fm,s=t.preview,l={"audio/mpeg":"mp3","audio/mpeg3":"mp3","audio/mp3":"mp3","audio/x-mpeg3":"mp3","audio/x-mp3":"mp3","audio/x-wav":"wav","audio/wav":"wav","audio/x-m4a":"m4a","audio/aac":"m4a","audio/mp4":"m4a","audio/x-mp4":"m4a","audio/ogg":"ogg","audio/webm":"webm","audio/flac":"flac","audio/x-flac":"flac","audio/amr":"amr"},c=t.window,d=t.navbar,p="string"==typeof t.options.mediaControlsList&&t.options.mediaControlsList?' controlsList="'+r.escape(t.options.mediaControlsList)+'"':"",u=function(){d.css("bottom",c.hasClass("elfinder-quicklook-fullscreen")?"50px":"")},h=function(t,i){return e('<audio class="elfinder-quicklook-preview-audio ui-front" controls'+p+' preload="auto" autobuffer><source src="'+t+'" /></audio>').on("change",function(e){e.stopPropagation()}).on("error",function(e){n&&n.data("hash")===i&&g()}).data("hash",i).appendTo(s)},f=function(t){var n,i=e.Deferred(),o=e.Deferred().done(function(){r.getContents(t).done(function(e){try{var t=a.toWAV(new Uint8Array(e));t?i.resolve(URL.createObjectURL(new Blob([t],{type:"audio/x-wav"}))):i.reject()}catch(n){i.reject()}}).fail(function(){i.reject()})}).fail(function(){a=!1,i.reject()});return window.TextEncoder&&window.URL&&URL.createObjectURL&&"undefined"==typeof a?(n=window.AMR,delete window.AMR,r.loadScript([r.options.cdns.amr],function(){a=!!window.AMR&&window.AMR,window.AMR=n,o[a?"resolve":"reject"]()},{error:function(){o.reject()}})):o[a?"resolve":"reject"](),i},m=function(e){var t,i=n.data("hash");o&&(t=e.play()),t&&t["catch"]&&t["catch"](function(t){e.paused||n&&n.data("hash")===i&&g()})},g=function(){if(n&&n.parent().length){var e=n[0],t=n.children("source").attr("src");c.off("viewchange.audio");try{e.pause(),n.empty(),t.match(/^blob:/)&&URL.revokeObjectURL(t),e.src="",e.load()}catch(i){}n.remove(),n=null}};s.on(t.evUpdate,function(e){var s,d,p=e.file,g=l[p.mime];l[p.mime]&&t.dispInlineRegex.test(p.mime)&&((s=t.support.audio[g])||"amr"===g)&&(o=t.autoPlay(),i=p.hash,d=s?r.openUrl(i):"",s?(e.stopImmediatePropagation(),n=h(d,i),m(n[0]),c.on("viewchange.audio",u),u()):r.options.cdns.amr&&"amr"===g&&a!==!1&&(e.stopImmediatePropagation(),n=h(d,i),f(p.hash).done(function(e){if(i===p.hash){var t=n[0];try{n.children("source").attr("src",e),t.pause(),t.load(),m(t),c.on("viewchange.audio",u),u()}catch(a){URL.revokeObjectURL(e),n.remove()}}else URL.revokeObjectURL(e)}).fail(function(){n.remove()})))}).on("change",g)},function(t){var n,i,a,o,r,s,l,c=t.fm,d=t.preview,p={"video/mp4":"mp4","video/x-m4v":"mp4","video/quicktime":"mp4","video/ogg":"ogg","application/ogg":"ogg","video/webm":"webm","video/x-matroska":"mkv","video/3gpp":"3gp","application/vnd.apple.mpegurl":"m3u8","application/x-mpegurl":"m3u8","application/dash+xml":"mpd","video/x-flv":"flv"},u=t.window,h=t.navbar,f="string"==typeof t.options.mediaControlsList&&t.options.mediaControlsList?' controlsList="'+c.escape(t.options.mediaControlsList)+'"':"",m=function(){c.UA.iOS?u.hasClass("elfinder-quicklook-fullscreen")?(d.css("height","-webkit-calc(100% - 50px)"),h._show()):d.css("height",""):h.css("bottom",u.hasClass("elfinder-quicklook-fullscreen")?"50px":"")},g=function(i,a){var r,s=function(e){p>1&&(l&&clearTimeout(l),l=setTimeout(function(){!r&&x(!0)},800))},p=0;o=null,a=a||{},t.hideinfo(),n=e('<video class="elfinder-quicklook-preview-video" controls'+f+' preload="auto" autobuffer playsinline></video>').on("change",function(e){e.stopPropagation()}).on("timeupdate progress",s).on("canplay",function(){r=!0}).data("hash",i.hash),n[0].addEventListener("error",function(e){a.src&&c.convAbsUrl(a.src)===c.convAbsUrl(e.target.src)&&(++p,s())},!0),a.src&&n.append('<source src="'+a.src+'" type="'+i.mime+'"/><source src="'+a.src+'"/>'),n.appendTo(d),u.on("viewchange.video",m),m()},v=function(e){var t;g(e),t=new i,t.loadSource(c.openUrl(e.hash)),t.attachMedia(n[0]),s&&t.on(i.Events.MANIFEST_PARSED,function(){w(n[0])})},b=function(e){g(e),o=window.dashjs.MediaPlayer().create(),o.getDebug().setLogToBrowserConsole(!1),o.initialize(n[0],c.openUrl(e.hash),s),o.on("error",function(e){x(!0)})},y=function(e){if(!r.isSupported())return void(r=!1);var t=r.createPlayer({type:"flv",url:c.openUrl(e.hash)});g(e),t.on(r.Events.ERROR,function(){t.destroy(),x(!0)}),t.attachMediaElement(n[0]),t.load(),w(t)},w=function(e){var t,i=n.data("hash");s&&(t=e.play()),t&&t["catch"]&&t["catch"](function(t){e.paused||n&&n.data("hash")===i&&x(!0)})},x=function(e){if(l&&clearTimeout(l),n&&n.parent().length){var i=n[0];u.off("viewchange.video"),o&&o.reset();try{i.pause(),n.empty(),i.src="",i.load()}catch(a){}n.remove(),n=null}e&&t.info.show()};d.on(t.evUpdate,function(e){var o,l=e.file,d=l.mime.toLowerCase(),u=p[d];p[d]&&t.dispInlineRegex.test(l.mime)&&(("m3u8"===u||"mpd"===u&&!c.UA.iOS||"flv"===u)&&!c.UA.ltIE10||t.support.video[u])&&(s=t.autoPlay(),t.support.video[u]&&("m3u8"!==u||c.UA.Safari)?(e.stopImmediatePropagation(),g(l,{src:c.openUrl(l.hash)}),w(n[0])):i!==!1&&c.options.cdns.hls&&"m3u8"===u?(e.stopImmediatePropagation(),i?v(l):(o=window.Hls,delete window.Hls,c.loadScript([c.options.cdns.hls],function(e){i=e||window.Hls||!1,window.Hls=o,i&&v(l)},{tryRequire:!0,error:function(){i=!1}}))):a!==!1&&c.options.cdns.dash&&"mpd"===u?(e.stopImmediatePropagation(),a?b(l):c.loadScript([c.options.cdns.dash],function(){a=!!window.dashjs,a&&b(l)},{tryRequire:!0,error:function(){a=!1}})):r!==!1&&c.options.cdns.flv&&"flv"===u&&(e.stopImmediatePropagation(),r?y(l):(o=window.flvjs,delete window.flvjs,c.loadScript([c.options.cdns.flv],function(e){r=e||window.flvjs||!1,window.flvjs=o,r&&y(l)},{tryRequire:!0,error:function(){r=!1}}))))}).on("change",x)},function(t){var n,i=t.preview,a=[],o=t.window,r=t.navbar;e.each(navigator.plugins,function(t,n){e.each(n,function(e,t){(0===t.type.indexOf("audio/")||0===t.type.indexOf("video/"))&&a.push(t.type)})}),a=t.fm.arrayFlip(a),i.on(t.evUpdate,function(s){var l,c=s.file,d=c.mime,p=function(){r.css("bottom",o.hasClass("elfinder-quicklook-fullscreen")?"50px":"")};a[c.mime]&&t.dispInlineRegex.test(c.mime)&&(s.stopImmediatePropagation(),(l=0===d.indexOf("video/"))&&t.hideinfo(),n=e('<embed src="'+t.fm.openUrl(c.hash)+'" type="'+d+'" class="elfinder-quicklook-preview-'+(l?"video":"audio")+'"/>').appendTo(i),o.on("viewchange.embed",p),p())}).on("change",function(){n&&n.parent().length&&(o.off("viewchange.embed"),n.remove(),n=null)})},function(t){var n,i=t.fm,a=i.arrayFlip(["application/zip","application/x-gzip","application/x-tar"]),o=t.preview,r=function(){var e,t,n,a=[];for(this.Y(),n=this.i,e=0,t=n.length;e<t;++e)a[e]=n[e].filename+(n[e].J?" ("+i.formatSize(n[e].J)+")":"");return a},s=function(e){for(var t,n,a,o,r,s=[],l=e.length,c=0,d=function(e){return String.fromCharCode.apply(null,e).replace(/\0+$/,"")};c<l&&0!==e[c];)t=e.subarray(c,c+512),n=d(t.subarray(0,100)),(a=d(t.subarray(345,500)))&&(n=a+n),o=parseInt(d(t.subarray(124,136)),8),r=512*Math.ceil(o/512),"././@LongLink"===n&&(n=d(e.subarray(c+512,c+512+r))),"pax_global_header"!==n&&s.push(n+(o?" ("+i.formatSize(o)+")":"")),c=c+512+r;return s};window.Uint8Array&&window.DataView&&i.options.cdns.zlibUnzip&&i.options.cdns.zlibGunzip&&o.on(t.evUpdate,function(l){var c=l.file,d="application/x-tar"===c.mime;if(a[c.mime]&&(d||("undefined"==typeof n||n)&&("application/zip"===c.mime||"application/x-gzip"===c.mime))){var p,u,h,f,m=function(){h=i.openUrl(c.hash),i.isSameOrigin(h)||(h=i.openUrl(c.hash,!0)),p=i.request({data:{cmd:"get"},options:{url:h,type:"get",cache:!0,dataType:"binary",responseType:"arraybuffer",processData:!1}}).fail(function(){u.remove()}).done(function(e){var t,a;try{"application/zip"===c.mime?(t=new n.Unzip(new Uint8Array(e)),a=r.call(t)):"application/x-gzip"===c.mime?(t=new n.Gunzip(new Uint8Array(e)),a=s(t.decompress())):"application/x-tar"===c.mime&&(a=s(new Uint8Array(e))),g(a)}catch(o){u.remove(),i.debug("error",o)}})},g=function(n){var a,r;n&&n.length&&(n=e.map(n,function(e){return i.decodeRawString(e)}),n.sort(),u.remove(),a="<strong>"+i.escape(c.mime)+"</strong> ("+i.formatSize(c.size)+")<hr/>",r=e('<div class="elfinder-quicklook-preview-archive-wrapper">'+a+'<pre class="elfinder-quicklook-preview-text">'+i.escape(n.join("\n"))+"</pre></div>").on("touchstart",function(t){e(this)["scroll"+("ltr"===i.direction?"Right":"Left")]()>5&&(t.originalEvent._preventSwipeX=!0)}).appendTo(o),t.hideinfo())};l.stopImmediatePropagation(),u=e('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+i.i18n("nowLoading")+'</span><span class="elfinder-spinner"/></div>').appendTo(t.info.find(".elfinder-quicklook-info")),o.one("change",function(){"pending"===p.state()&&p.reject(),u.remove()}),n?m():(window.Zlib&&(f=window.Zlib,delete window.Zlib),i.loadScript([i.options.cdns.zlibUnzip,i.options.cdns.zlibGunzip],function(){window.Zlib&&(n=window.Zlib)?(f?window.Zlib=f:delete window.Zlib,m()):error()}))}})},function(t){var n,i=t.fm,a=i.arrayFlip(["application/x-rar"]),o=t.preview;window.DataView&&o.on(t.evUpdate,function(r){var s=r.file;if(a[s.mime]&&i.options.cdns.rar&&n!==!1){var l,c,d,p,u,h=function(a){if(p)return void l.remove();try{d=n({file:a,type:2,xhrHeaders:i.customHeaders,xhrFields:i.xhrFields},function(n){l.remove();var a,r,c=[];return p||n?void(n&&i.debug("error",n)):(e.each(d.entries,function(){c.push(this.path+(this.size?" ("+i.formatSize(this.size)+")":""))}),void(c.length&&(c=e.map(c,function(e){return i.decodeRawString(e)}),c.sort(),a="<strong>"+i.escape(s.mime)+"</strong> ("+i.formatSize(s.size)+")<hr/>",r=e('<div class="elfinder-quicklook-preview-archive-wrapper">'+a+'<pre class="elfinder-quicklook-preview-text">'+i.escape(c.join("\n"))+"</pre></div>").on("touchstart",function(t){e(this)["scroll"+("ltr"===i.direction?"Right":"Left")]()>5&&(t.originalEvent._preventSwipeX=!0)}).appendTo(o),t.hideinfo())))})}catch(r){l.remove()}},f=function(){n=!1,l.remove()};r.stopImmediatePropagation(),l=e('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+i.i18n("nowLoading")+'</span><span class="elfinder-spinner"/></div>').appendTo(t.info.find(".elfinder-quicklook-info")),o.one("change",function(){d&&(d.abort=!0),l.remove(),p=!0}),c=i.openUrl(s.hash),i.isSameOrigin(c)||(c=i.openUrl(s.hash,!0)),n?h(c):(window.RarArchive&&(u=window.RarArchive,delete window.RarArchive),i.loadScript([i.options.cdns.rar],function(){i.hasRequire?require(["rar"],function(e){n=e,h(c)},f):(n=window.RarArchive)?(u?window.RarArchive=u:delete window.RarArchive,h(c)):f()},{tryRequire:!0,error:f}))}})},function(t){var n,i=t.fm,a=i.arrayFlip(t.options.sharecadMimes||[]),o=t.preview;t.window;t.options.sharecadMimes.length&&t.addIntegration({title:"ShareCAD.org CAD and 3D-Models viewer",link:"https://sharecad.org/DWGOnlinePlugin"}),o.on(t.evUpdate,function(r){var s=r.file;if(a[s.mime.toLowerCase()]&&!i.option("onetimeUrl",s.hash)){var l,c;t.window;r.stopImmediatePropagation(),"1"==s.url&&(o.hide(),e('<div class="elfinder-quicklook-info-data"><button class="elfinder-info-button">'+i.i18n("getLink")+"</button></div>").appendTo(t.info.find(".elfinder-quicklook-info")).on("click",function(){var n=e(this);n.html('<span class="elfinder-spinner">'),i.request({data:{cmd:"url",target:s.hash},preventDefault:!0}).always(function(){n.html("")}).done(function(e){var n=i.file(s.hash);s.url=n.url=e.url||"",s.url&&o.trigger({type:t.evUpdate,file:s,forceUpdate:!0})})})),""!==s.url&&"1"!=s.url&&(o.one("change",function(){l.remove(),n.off("load").remove(),n=null}).addClass("elfinder-overflow-auto"),l=e('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+i.i18n("nowLoading")+'</span><span class="elfinder-spinner"/></div>').appendTo(t.info.find(".elfinder-quicklook-info")),c=i.convAbsUrl(i.url(s.hash)),n=e('<iframe class="elfinder-quicklook-preview-iframe" scrolling="no"/>').css("background-color","transparent").appendTo(o).on("load",function(){t.hideinfo(),l.remove(),t.preview.after(t.info),e(this).css("background-color","#fff").show()}).on("error",function(){l.remove(),t.preview.after(t.info)}).attr("src","//sharecad.org/cadframe/load?url="+encodeURIComponent(c)),t.info.after(t.preview))}})},function(t){var n,i,a,o,r,s=t.fm,l={"application/vnd.google-earth.kml+xml":!0,
"application/vnd.google-earth.kmz":!0},c=t.preview;t.options.googleMapsApiKey&&(t.addIntegration({title:"Google Maps",link:"https://www.google.com/intl/"+s.lang.replace("_","-")+"/help/terms_maps.html"}),n=window.google&&google.maps,i=function(e,i){var a=t.options.googleMapsOpts.maps;s.forExternalUrl(e.hash).done(function(e){if(e)try{new n.KmlLayer(e,Object.assign({map:new n.Map(i.get(0),a)},t.options.googleMapsOpts.kml)),t.hideinfo()}catch(r){o()}else o()})},a=window.gm_authFailure,o=function(){r=null},r="https://maps.googleapis.com/maps/api/js?key="+t.options.googleMapsApiKey,window.gm_authFailure=function(){o(),a&&a()},c.on(t.evUpdate,function(a){var o=a.file;if(r&&l[o.mime.toLowerCase()]){var d,p=(t.window,"1"==o.url&&!s.option("onetimeUrl",o.hash));a.stopImmediatePropagation(),p&&(c.hide(),e('<div class="elfinder-quicklook-info-data"><button class="elfinder-info-button">'+s.i18n("getLink")+"</button></div>").appendTo(t.info.find(".elfinder-quicklook-info")).on("click",function(){var n=e(this);n.html('<span class="elfinder-spinner">'),s.request({data:{cmd:"url",target:o.hash},preventDefault:!0}).always(function(){n.html("")}).done(function(e){var n=s.file(o.hash);o.url=n.url=e.url||"",o.url&&c.trigger({type:t.evUpdate,file:o,forceUpdate:!0})})})),""===o.url||p||(d=e('<div style="width:100%;height:100%;"/>').appendTo(c),c.one("change",function(){d.remove(),d=null}),n?i(o,d):s.loadScript([r],function(){n=window.google&&google.maps,n&&i(o,d)}))}}))},function(t){var n,i,a=t.fm,o=Object.assign(a.arrayFlip(t.options.googleDocsMimes||[],"g"),a.arrayFlip(t.options.officeOnlineMimes||[],"m")),r=t.preview,s=(t.window,t.navbar),l={g:"docs.google.com/gview?embedded=true&url=",m:"view.officeapps.live.com/op/embed.aspx?wdStartOn=0&src="},c={g:"56px",m:"24px"},d={xls:5242880,xlsb:5242880,xlsx:5242880,xlsm:5242880,other:10485760};t.options.googleDocsMimes.length&&(i=!0,t.addIntegration({title:"Google Docs Viewer",link:"https://docs.google.com/"})),t.options.officeOnlineMimes.length&&(i=!0,t.addIntegration({title:"MS Online Doc Viewer",link:"https://products.office.com/office-online/view-office-documents-online"})),i&&r.on(t.evUpdate,function(i){var p,u=i.file;if(u.size<=26214400&&(p=o[u.mime])){var h,f=t.window,m=function(){s.css("bottom",f.hasClass("elfinder-quicklook-fullscreen")?c[p]:"")},g=a.mimeTypes[u.mime],v="1"==u.url&&!a.option("onetimeUrl",u.hash);"m"===p&&(d[g]&&u.size>d[g]||u.size>d.other)&&(p="g"),v&&(r.hide(),e('<div class="elfinder-quicklook-info-data"><button class="elfinder-info-button">'+a.i18n("getLink")+"</button></div>").appendTo(t.info.find(".elfinder-quicklook-info")).on("click",function(){var n=e(this);n.html('<span class="elfinder-spinner">'),a.request({data:{cmd:"url",target:u.hash},preventDefault:!0}).always(function(){n.html("")}).done(function(e){var n=a.file(u.hash);u.url=n.url=e.url||"",u.url&&r.trigger({type:t.evUpdate,file:u,forceUpdate:!0})})})),""===u.url||v||(i.stopImmediatePropagation(),r.one("change",function(){f.off("viewchange.googledocs"),h.remove(),n.off("load").remove(),n=null}).addClass("elfinder-overflow-auto"),h=e('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+a.i18n("nowLoading")+'</span><span class="elfinder-spinner"/></div>').appendTo(t.info.find(".elfinder-quicklook-info")),n=e('<iframe class="elfinder-quicklook-preview-iframe"/>').css("background-color","transparent").appendTo(r),a.forExternalUrl(u.hash).done(function(i){i?(u.ts&&(i+=(i.match(/\?/)?"&":"?")+"_t="+u.ts),n.on("load",function(){t.hideinfo(),h.remove(),t.preview.after(t.info),e(this).css("background-color","#fff").show()}).on("error",function(){h.remove(),t.preview.after(t.info)}).attr("src","https://"+l[p]+encodeURIComponent(i))):(h.remove(),n.remove())}),f.on("viewchange.googledocs",m),m(),t.info.after(t.preview))}})},function(t){var n=t.fm,i=t.preview,a=parseInt(t.options.textMaxlen)||2e3,o=function(){n.options.cdns.prettify?(n.loadScript([n.options.cdns.prettify+(n.options.cdns.prettify.match(/\?/)?"&":"?")+"autorun=false"]),o=function(){return!0}):o=function(){return!1}},r=function(e,t){o()&&("undefined"==typeof window.PR&&t--?setTimeout(function(){r(e,t)},100):"object"==typeof window.PR?(e.css("cursor","wait"),requestAnimationFrame(function(){PR.prettyPrint&&PR.prettyPrint(null,e.get(0)),e.css("cursor","")})):o=function(){return!1})};i.on(t.evUpdate,function(s){var l,c,d=s.file;d.mime;n.mimeIsText(d.mime)&&(!t.options.getSizeMax||d.size<=t.options.getSizeMax)&&(s.stopImmediatePropagation(),"undefined"==typeof window.PR&&o(),c=e('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+n.i18n("nowLoading")+'</span><span class="elfinder-spinner"/></div>').appendTo(t.info.find(".elfinder-quicklook-info")),i.one("change",function(){"pending"==l.state()&&l.reject()}),l=n.request({data:{cmd:"get",target:d.hash,conv:1,_t:d.ts},options:{type:"get",cache:!0},preventDefault:!0}).done(function(o){var s,l,c,p,u=new RegExp("^(data:"+d.mime.replace(/([.+])/g,"\\$1")+";base64,)","i"),h=o.content;t.hideinfo(),window.atob&&(p=h.match(u))&&(h=atob(h.substr(p[1].length))),l=h.length-a,l>100?s=h.substr(0,a)+"...":l=0,c=e('<div class="elfinder-quicklook-preview-text-wrapper"><pre class="elfinder-quicklook-preview-text prettyprint"></pre></div>'),l&&c.append(e('<div class="elfinder-quicklook-preview-charsleft"><hr/><span>'+n.i18n("charsLeft",n.toLocaleString(l))+"</span></div>").on("click",function(){var t=c.scrollTop();e(this).remove(),c.children("pre").removeClass("prettyprinted").text(h).scrollTop(t),r(c,100)})),c.children("pre").text(s||h),c.on("touchstart",function(t){e(this)["scroll"+("ltr"===n.direction?"Right":"Left")]()>5&&(t.originalEvent._preventSwipeX=!0)}).appendTo(i),r(c,100)}).always(function(){c.remove()}))})}],(i.prototype.commands.reload=function(){"use strict";var t=this,n=!1;this.alwaysEnabled=!0,this.updateOnSelect=!0,this.shortcuts=[{pattern:"ctrl+shift+r f5"}],this.getstate=function(){return 0},this.init=function(){this.fm.bind("search searchend",function(){n="search"==this.type})},this.fm.bind("contextmenu",function(){var n=t.fm;n.options.sync>=1e3&&(t.extra={icon:"accept",node:e("<span/>").attr({title:n.i18n("autoSync")}).on("click touchstart",function(t){"touchstart"===t.type&&t.originalEvent.touches.length>1||(t.stopPropagation(),t.preventDefault(),e(this).parent().toggleClass("ui-state-disabled",n.options.syncStart).parent().removeClass("ui-state-hover"),n.options.syncStart=!n.options.syncStart,n.autoSync(n.options.syncStart?null:"stop"))}).on("ready",function(){e(this).parent().toggleClass("ui-state-disabled",!n.options.syncStart).css("pointer-events","auto")})})}),this.exec=function(){var t=this.fm;if(!n){var i=t.sync(),a=setTimeout(function(){t.notify({type:"reload",cnt:1,hideCnt:!0}),i.always(function(){t.notify({type:"reload",cnt:-1})})},t.notifyDelay);return i.always(function(){clearTimeout(a),t.trigger("reload")})}e("div.elfinder-toolbar > div."+t.res("class","searchbtn")+" > span.ui-icon-search").click()}}).prototype={forceLoad:!0},i.prototype.commands.rename=function(){"use strict";this.alwaysEnabled=!0,this.syncTitleOnChange=!0;var t=this,n=t.fm,i=function(t,i,a,o){var r,s=i?[a.hash].concat(i):[a.hash],l=s.length,c={};if(n.lockfiles({files:s}),n.isRoot(a)){if((r=n.storage("rootNames"))||(r={}),""===o){if(!r[a.hash])return t&&t.reject(),void n.unlockfiles({files:s}).trigger("selectfiles",{files:s});a.name=a._name,a.i18=a._i18,delete r[a.hash],delete a._name,delete a._i18}else"undefined"==typeof a._name&&(a._name=a.name,a._i18=a.i18),a.name=r[a.hash]=o,delete a.i18;return n.storage("rootNames",r),c={changed:[a]},n.updateCache(c),n.change(c),t&&t.resolve(c),void n.unlockfiles({files:s}).trigger("selectfiles",{files:s})}c={cmd:"rename",name:o,target:a.hash},l>1&&(c.targets=i,o.match(/\*/)&&(c.q=o)),n.request({data:c,notify:{type:"rename",cnt:l},navigate:{}}).fail(function(e){var i=n.parseError(e);t&&t.reject(),i&&Array.isArray(i)&&"errRename"===i[0]||n.sync()}).done(function(i){var r;i.added&&i.added.length&&1===l&&(i.undo={cmd:"rename",callback:function(){return n.request({data:{cmd:"rename",target:i.added[0].hash,name:a.name},notify:{type:"undo",cnt:1}})}},i.redo={cmd:"rename",callback:function(){return n.request({data:{cmd:"rename",target:a.hash,name:o},notify:{type:"rename",cnt:1}})}}),t&&t.resolve(i),(r=n.cwd().hash)&&r!==a.hash||n.exec("open",e.map(i.added,function(e){return"directory"===e.mime?e.hash:null})[0])}).always(function(){n.unlockfiles({files:s}).trigger("selectfiles",{files:s})})},a=function(e,t){var i,a,o,r=t||n.selected(),s=n.splitFileExtention(e),l=n.file(r[0]),c=n.file(r[1]);return i=s[1]?"."+s[1]:"",s[1]&&"*"===s[0]?(a='"'+n.splitFileExtention(l.name)[0]+i+'", ',a+='"'+n.splitFileExtention(c.name)[0]+i+'"'):s[0].length>1&&("*"===s[0].substr(-1)?(o=s[0].substr(0,s[0].length-1),a='"'+o+l.name+'", ',a+='"'+o+c.name+'"'):"*"===s[0].substr(0,1)&&(o=s[0].substr(1),a='"'+n.splitFileExtention(l.name)[0]+o+i+'", ',a+='"'+n.splitFileExtention(c.name)[0]+o+i+'"')),a||(a='"'+s[0]+"1"+i+'", "'+s[0]+"2"+i+'"'),r.length>2&&(a+=" ..."),a},o=function(){var o,r=n.selected(),s='<input name="type" type="radio" class="elfinder-tabstop">',l=function(t,i){return e('<label class="elfinder-rename-batch-checks">'+n.i18n(i)+"</label>").prepend(t)},c=e('<input type="text" class="ui-corner-all elfinder-tabstop">'),d=e(s),p=e(s),u=e(s),h=e(s),f=e("<div/>").append(l(d,"plusNumber"),l(p,"asPrefix"),l(u,"asSuffix"),l(h,"changeExtention")),m=e('<div class="elfinder-rename-batch-preview"/>'),g=e('<div class="elfinder-rename-batch"/>').append(e('<div class="elfinder-rename-batch-name"/>').append(c),e('<div class="elfinder-rename-batch-type"/>').append(f),m),v={title:n.i18n("batchRename"),modal:!0,destroyOnClose:!0,width:Math.min(380,n.getUI().width()-20),buttons:{},open:function(){c.on("input",y).trigger("focus")}},b=function(){var e=c.val(),t=n.splitFileExtention(n.file(r[0]).name)[1];return(""!==e||d.is(":checked"))&&(p.is(":checked")?e+="*":u.is(":checked")?e="*"+e+"."+t:h.is(":checked")?e="*."+e:t&&(e+="."+t)),e},y=function(){var e=b();""!==e?m.html(n.i18n(["renameMultiple",r.length,a(e)])):m.empty()},w=f.find("input:radio").on("change",y);v.buttons[n.i18n("btnApply")]=function(){var e,t,a=b();""!==a&&(o.elfinderdialog("close"),t=r,e=n.file(t.shift()),i(void 0,t,e,a))},v.buttons[n.i18n("btnCancel")]=function(){o.elfinderdialog("close")},e.fn.checkboxradio?w.checkboxradio({create:function(e,t){this===d.get(0)&&d.prop("checked",!0).change()}}):f.buttonset({create:function(e,t){d.prop("checked",!0).change()}}),o=t.fmDialog(g,v)};this.noChangeDirOnRemovedCwd=!0,this.shortcuts=[{pattern:"f2"+("mac"==n.OS?" enter":"")},{pattern:"shift+f2",description:"batchRename",callback:function(){n.selected().length>1&&o()}}],this.getstate=function(i){var a,r,s,l,c,d,p=this.files(i),u=p.length;return u?(u>1&&p[0].phash&&(a=p[0].phash,r=n.splitFileExtention(p[0].name)[1].toLowerCase(),s=p[0].mime),1===u&&(d=n.isRoot(p[0])),c=1===u&&(d||!p[0].locked)||n.api>2.103&&u===e.grep(p,function(e){return!(l||e.locked||e.phash!==a||n.isRoot(e)||s!==e.mime&&r!==n.splitFileExtention(e.name)[1].toLowerCase())||(l&&(l=!0),!1)}).length?0:-1,!d&&0===c&&n.option("disabledFlip",p[0].hash).rename&&(c=-1),c!==-1&&u>1?t.extra={icon:"preference",node:e("<span/>").attr({title:n.i18n("batchRename")}).on("click touchstart",function(e){"touchstart"===e.type&&e.originalEvent.touches.length>1||(e.stopPropagation(),e.preventDefault(),n.getUI().trigger("click"),o())})}:delete t.extra,c):-1},this.exec=function(t,o){var r,s=(n.getUI("cwd"),t||!!n.selected().length&&n.selected()||[n.cwd().hash]),l=s.length,c=n.file(s.shift()),d=".elfinder-cwd-filename",p=o||{},u=n.cwd().hash==c.hash,h="navbar"===p._currentType||"files"===p._currentType?p._currentType:u?"navbar":"files",f="files"!==h,m=n[f?"navHash2Elm":"cwdHash2Elm"](c.hash),g=!f&&"list"!=n.storage("view"),v=function(){requestAnimationFrame(function(){x&&x.trigger("blur")})},b=function(){T.is(":hidden")||T.elfinderoverlay("hide").off("click close",A),z.removeClass("ui-front").css("position","").off("unselect."+n.namespace,v),g?C&&C.css("max-height",""):f||z.css("width","").parent("td").css("overflow","")},y=e.Deferred().fail(function(e){var t=x.parent(),i=n.escape(c.i18||c.name);x.off(),g&&(i=i.replace(/([_.])/g,"&#8203;$1")),requestAnimationFrame(function(){f?x.replaceWith(i):t.length?(x.remove(),t.html(i)):m.find(d).html(i)}),e&&n.error(e)}).always(function(){b(),n.unbind("resize",S),n.enable()}),w=function(t){var o=e.trim(x.val()),r=(n.splitFileExtention(o),!0),d=function(){x.off(),b(),f?x.replaceWith(n.escape(o)):C.html(n.escape(o)),i(y,s,c,o)};if(T.is(":hidden")||z.css("z-index",""),""===o){if(!n.isRoot(c))return A();f?x.replaceWith(n.escape(c.name)):C.html(n.escape(c.name))}if(!I&&z.length){if(x.off("blur"),1===l&&o===c.name)return y.reject();if(n.options.validName&&n.options.validName.test)try{r=n.options.validName.test(o)}catch(t){r=!1}if("."===o||".."===o||!r)return I=!0,n.error("directory"===c.mime?"errInvDirname":"errInvName",{modal:!0,close:function(){setTimeout(k,120)}}),!1;if(1===l&&n.fileByName(o,c.phash))return I=!0,n.error(["errExists",o],{modal:!0,close:function(){setTimeout(k,120)}}),!1;1===l?d():(n.confirm({title:"cmdrename",text:["renameMultiple",l,a(o,[c.hash].concat(s))],accept:{label:"btnYes",callback:d},cancel:{label:"btnCancel",callback:function(){setTimeout(function(){I=!0,k()},120)}}}),setTimeout(function(){n.trigger("unselectfiles",{files:n.selected()}).trigger("selectfiles",{files:[c.hash].concat(s)})},120))}},x=e(g?"<textarea/>":'<input type="text"/>').on("keyup text",function(){g?(this.style.height="1px",this.style.height=this.scrollHeight+"px"):r&&(this.style.width=r+"px",this.scrollWidth>r&&(this.style.width=this.scrollWidth+10+"px"))}).on("keydown",function(t){t.stopImmediatePropagation(),t.keyCode==e.ui.keyCode.ESCAPE?y.reject():t.keyCode==e.ui.keyCode.ENTER&&(t.preventDefault(),x.trigger("blur"))}).on("mousedown click dblclick",function(e){e.stopPropagation(),"dblclick"===e.type&&e.preventDefault()}).on("blur",w).on("dragenter dragleave dragover drop",function(e){e.stopPropagation()}),k=function(){var e=n.splitFileExtention(x.val())[0];I||!n.UA.Mobile||n.UA.iOS||(T.on("click close",A).elfinderoverlay("show"),z.css("z-index",T.css("z-index")+1)),!n.enabled()&&n.enable(),I&&(I=!1,x.on("blur",w)),x.trigger("focus").trigger("select"),x[0].setSelectionRange&&x[0].setSelectionRange(0,e.length)},C=f?m.contents().filter(function(){return 3==this.nodeType&&e(this).parent().attr("id")===n.navHash2Id(c.hash)}):m.find(d),z=C.parent(),T=n.getUI("overlay"),A=function(e){T.is(":hidden")||z.css("z-index",""),I||(y.reject(),e&&(e.stopPropagation(),e.preventDefault()))},S=function(){m.trigger("scrolltoview",{blink:!1})},I=!1;return z.addClass("ui-front").css("position","relative").on("unselect."+n.namespace,v),n.bind("resize",S),f?C.replaceWith(x.val(c.name)):(g?C.css("max-height","none"):f||(r=z.width(),z.width(r-15).parent("td").css("overflow","visible")),C.empty().append(x.val(c.name))),l>1&&n.api<=2.103?y.reject():c&&C.length?c.locked&&!n.isRoot(c)?y.reject(["errLocked",c.name]):(n.one("select",function(){x.parent().length&&c&&e.inArray(c.hash,n.selected())===-1&&x.trigger("blur")}),x.trigger("keyup"),k(),y):y.reject("errCmdParams",this.title)},n.bind("select contextmenucreate closecontextmenu",function(e){var i,a=(e.data?e.data.selected||e.data.targets:null)||n.selected();a&&1===a.length&&(i=n.file(a[0]))&&n.isRoot(i)?t.title=n.i18n("kindAlias")+" ("+n.i18n("preference")+")":t.title=n.i18n("cmdrename"),"closecontextmenu"!==e.type?t.update(void 0,t.title):requestAnimationFrame(function(){t.update(void 0,t.title)})}).remove(function(t){var i;t.data&&t.data.removed&&(i=n.storage("rootNames"))&&(e.each(t.data.removed,function(e,t){i[t]&&delete i[t]}),n.storage("rootNames",i))})},i.prototype.commands.resize=function(){"use strict";var t=0,n=function(t,n,i){var a=[{x:t/2,y:n/2},{x:-t/2,y:n/2},{x:-t/2,y:-n/2},{x:t/2,y:-n/2}],o=[],r={x:Number.MAX_VALUE,y:Number.MAX_VALUE},s={x:Number.MIN_VALUE,y:Number.MIN_VALUE};return e.each(a,function(e,t){o.push({x:t.x*Math.cos(i)-t.y*Math.sin(i),y:t.x*Math.sin(i)+t.y*Math.cos(i)})}),e.each(o,function(e,t){r.x=Math.min(r.x,t.x),r.y=Math.min(r.y,t.y),s.x=Math.max(s.x,t.x),s.y=Math.max(s.y,t.y)}),{width:s.x-r.x,height:s.y-r.y}};this.updateOnSelect=!1,this.getstate=function(){var e=this.fm.selectedFiles();return 1==e.length&&e[0].read&&e[0].write&&e[0].mime.indexOf("image/")!==-1?0:-1},this.resizeRequest=function(t,n,i){var a=this.fm,o=n||a.file(t.target),r=(o?o.tmb:null,a.isCommandEnabled("resize",t.target));if(r&&(!o||o&&o.read&&o.write&&o.mime.indexOf("image/")!==-1))return a.request({data:Object.assign(t,{cmd:"resize"}),notify:{type:"resize",cnt:1}}).fail(function(e){i&&i.reject(e)}).done(function(){t.quality&&a.storage("jpgQuality",t.quality===a.option("jpgQuality")?null:t.quality),i&&i.resolve()});var s;return s=o?o.mime.indexOf("image/")===-1?["errResize",o.name,"errUsupportType"]:["errResize",o.name,"errPerm"]:["errResize",t.target,"errPerm"],i?i.reject(s):a.error(s),e.Deferred().reject(s)},this.exec=function(i){var a,o,r=this,s=this.fm,l=this.files(i),c=e.Deferred(),d=s.api>1,p=this.options,u=650,h=s.getUI(),f=e().controlgroup?"controlgroup":"buttonset",m="undefined"==typeof p.grid8px||"disable"!==p.grid8px,g=Array.isArray(p.presetSize)?p.presetSize:[],v="elfinder-dialog-active",b=s.res("class","editing"),y=function(i,a){var o,l,y,w,x,k="image/jpeg"===i.mime,C=e('<div class="elfinder-resize-container"/>'),z='<input type="number" class="ui-corner-all"/>',T='<div class="elfinder-resize-row"/>',A='<div class="elfinder-resize-label"/>',S=null,I=!1,O=function(){I=!0},j=function(){I&&(I=!1,M.trigger("change"))},M=e('<div class="elfinder-resize-control"/>').on("focus","input[type=text],input[type=number]",function(){e(this).trigger("select")}).on("change",function(){S&&cancelAnimationFrame(S),S=requestAnimationFrame(function(){var e,t,i,a,o,r,l,c,d,p,u,h;nt&&!I&&(i=nt.data("canvas"))&&(e=M.children("div.elfinder-resize-control-panel:visible"),t=e.find("input.elfinder-resize-quality"),t.is(":visible")&&(a=nt.data("ctx"),o=nt.get(0),e.hasClass("elfinder-resize-uiresize")?(c=i.width=jQuery.val(),d=i.height=K.val(),a.drawImage(o,0,0,c,d)):e.hasClass("elfinder-resize-uicrop")?(r=V.val(),l=X.val(),c=G.val(),d=J.val(),i.width=c,i.height=d,a.drawImage(o,r,l,c,d,0,0,c,d)):(p=Q.val(),u=Q.val()*Math.PI/180,h=n(pe,ue,u),c=i.width=h.width,d=i.height=h.height,a.save(),p%90!==0&&(a.fillStyle=se.val()||"#FFF",a.fillRect(0,0,c,d)),a.translate(c/2,d/2),a.rotate(u),a.drawImage(o,-o.width/2,-o.height/2,pe,ue),a.restore()),i.toBlob(function(e){e&&t.next("span").text(" ("+s.formatSize(e.size)+")")},"image/jpeg",Math.max(Math.min(t.val(),100),1)/100)))})}).on("mouseup","input",function(t){e(t.target).trigger("change")}),D=e('<div class="elfinder-resize-preview"/>').on("touchmove",function(t){e(t.target).hasClass("touch-punch")&&(t.stopPropagation(),t.preventDefault())}),F=e('<div class="elfinder-resize-loading">'+s.i18n("ntfloadimg")+"</div>"),E=e('<div class="elfinder-resize-handle touch-punch"/>'),U=e('<div class="elfinder-resize-handle touch-punch"/>'),P=e('<div class="elfinder-resize-uiresize elfinder-resize-control-panel"/>'),R=e('<div class="elfinder-resize-uicrop elfinder-resize-control-panel"/>'),q=e('<div class="elfinder-resize-rotate elfinder-resize-control-panel"/>'),H=e("<button/>").attr("title",s.i18n("rotate-cw")).append(e('<span class="elfinder-button-icon elfinder-button-icon-rotate-l"/>')),_=e("<button/>").attr("title",s.i18n("rotate-ccw")).append(e('<span class="elfinder-button-icon elfinder-button-icon-rotate-r"/>')),N=e("<span />"),L=e('<button class="elfinder-resize-reset">').text(s.i18n("reset")).on("click",function(){_e()}).button({icons:{primary:"ui-icon-arrowrefresh-1-n"},text:!1}),W=e('<div class="elfinder-resize-type"/>').append('<input type="radio" name="type" id="'+a+'-resize" value="resize" checked="checked" /><label for="'+a+'-resize">'+s.i18n("resize")+"</label>",'<input class="api2" type="radio" name="type" id="'+a+'-crop" value="crop" /><label class="api2" for="'+a+'-crop">'+s.i18n("crop")+"</label>",'<input class="api2" type="radio" name="type" id="'+a+'-rotate" value="rotate" /><label class="api2" for="'+a+'-rotate">'+s.i18n("rotate")+"</label>"),B="resize",$=(W[f]()[f]("disable").find("input").on("change",function(){B=e(this).val(),_e(),Be(!0),$e(!0),Ke(!0),"resize"==B?(P.show(),q.hide(),R.hide(),Be(),k&&Ce.insertAfter(P.find(".elfinder-resize-grid8"))):"crop"==B?(q.hide(),P.hide(),R.show(),$e(),k&&Ce.insertAfter(R.find(".elfinder-resize-grid8"))):"rotate"==B&&(P.hide(),R.hide(),q.show(),Ke())}),e(z).on("change",function(){var e=He(parseInt(jQuery.val())),t=He(he?e/ce:parseInt(K.val()));e>0&&t>0&&(Ne.updateView(e,t),jQuery.val(e),K.val(t))}).addClass("elfinder-focus")),K=e(z).on("change",function(){var e=He(parseInt(K.val())),t=He(he?e*ce:parseInt(jQuery.val()));t>0&&e>0&&(Ne.updateView(t,e),jQuery.val(t),K.val(e))}),V=e(z).on("change",function(){Le.updateView()}),X=e(z).on("change",function(){Le.updateView()}),G=e(z).on("change",function(){Le.updateView("w")}),J=e(z).on("change",function(){Le.updateView("h")}),Y=k&&d?e(z).val(s.storage("jpgQuality")>0?s.storage("jpgQuality"):s.option("jpgQuality")).addClass("elfinder-resize-quality").attr("min","1").attr("max","100").attr("title","1 - 100").on("blur",function(){var e=Math.min(100,Math.max(1,parseInt(this.value)));M.find("input.elfinder-resize-quality").val(e)}):null,Q=e('<input type="number" class="ui-corner-all" maxlength="3" value="0" />').on("change",function(){We.update()}),Z=e('<div class="elfinder-resize-rotate-slider touch-punch"/>').slider({min:0,max:360,value:Q.val(),animate:!0,start:O,stop:j,change:function(e,t){t.value!=Z.slider("value")&&We.update(t.value)},slide:function(e,t){We.update(t.value,!1)}}).find(".ui-slider-handle").addClass("elfinder-tabstop").off("keydown").on("keydown",function(t){t.keyCode!=e.ui.keyCode.LEFT&&t.keyCode!=e.ui.keyCode.RIGHT||(t.stopPropagation(),t.preventDefault(),We.update(Number(Q.val())+(t.keyCode==e.ui.keyCode.RIGHT?1:-1),!1))}).end(),ee={},te=function(e){var t,n,i,a,o,r,s;try{t=ee[Math.round(e.offsetX)][Math.round(e.offsetY)]}catch(e){}t&&(n=t[0],i=t[1],a=t[2],o=t[3],r=t[4],s=t[5],ie(n,i,a,"click"===e.type))},ne=function(t){ie(e(this).css("backgroundColor"),"","","click"===t.type)},ie=function(t,n,i,a){var o,r,s;"string"==typeof t&&(n="",t&&(o=e("<span>").css("backgroundColor",t).css("backgroundColor"))&&(r=o.match(/rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/i))&&(t=Number(r[1]),n=Number(r[2]),i=Number(r[3]))),s=""===n?t:"#"+ae(t,n,i),se.val(s).css({backgroundColor:s,backgroundImage:"none",color:t+n+i<384?"#fff":"#000"}),D.css("backgroundColor",s),a&&(qe.off(".picker").removeClass("elfinder-resize-picking"),le.off(".picker").removeClass("elfinder-resize-picking"))},ae=function(t,n,i){return e.map([t,n,i],function(e){return("0"+parseInt(e).toString(16)).slice(-2)}).join("")},oe=e("<button>").text(s.i18n("colorPicker")).on("click",function(){qe.on("mousemove.picker click.picker",te).addClass("elfinder-resize-picking"),le.on("mousemove.picker click.picker","span",ne).addClass("elfinder-resize-picking")}).button({icons:{primary:"ui-icon-pin-s"},text:!1}),re=e("<button>").text(s.i18n("reset")).on("click",function(){ie("","","",!0)}).button({icons:{primary:"ui-icon-arrowrefresh-1-n"},text:!1}),se=e('<input class="ui-corner-all elfinder-resize-bg" type="text">').on("focus",function(){e(this).attr("style","")}).on("blur",function(){ie(e(this).val())}),le=e('<div class="elfinder-resize-pallet">').on("click","span",function(){ie(e(this).css("backgroundColor"))}),ce=1,de=1,pe=0,ue=0,he=!0,fe=!1,me=0,ge=0,ve=0,be=0,ye=0,we=!!k&&m,xe=e("<button>").html(s.i18n("aspectRatio")).on("click",function(){he=!he,xe.button("option",{icons:{primary:he?"ui-icon-locked":"ui-icon-unlocked"}}),Ne.fixHeight(),E.resizable("option","aspectRatio",he).data("uiResizable")._aspectRatio=he}).button({icons:{primary:he?"ui-icon-locked":"ui-icon-unlocked"},text:!1}),ke=e("<button>").html(s.i18n("aspectRatio")).on("click",function(){fe=!fe,ke.button("option",{icons:{primary:fe?"ui-icon-locked":"ui-icon-unlocked"}}),U.resizable("option","aspectRatio",fe).data("uiResizable")._aspectRatio=fe}).button({icons:{primary:fe?"ui-icon-locked":"ui-icon-unlocked"},text:!1}),Ce=e("<button>").html(s.i18n(we?"enabled":"disabled")).toggleClass("ui-state-active",we).on("click",function(){we=!we,Ce.html(s.i18n(we?"enabled":"disabled")).toggleClass("ui-state-active",we),ze()}).button(),ze=function(){var t=we?8:1;e.each([$,K,G,J,V,X],function(){this.attr("step",t)}),we&&(jQuery.val(He(jQuery.val())),K.val(He(K.val())),G.val(He(G.val())),J.val(He(J.val())),V.val(He(V.val())),X.val(He(X.val())),P.is(":visible")?Ne.updateView(jQuery.val(),K.val()):R.is(":visible")&&Le.updateView())},Te=function(){var t,n=function(){se.parent().hide(),le.hide()};t=Math.min(me,ge)/Math.sqrt(Math.pow(pe,2)+Math.pow(ue,2)),ve=Math.ceil(pe*t),be=Math.ceil(ue*t),qe.width(ve).height(be).css("margin-top",(ge-be)/2+"px").css("margin-left",(me-ve)/2+"px"),qe.is(":visible")&&se.is(":visible")&&("image/png"!==i.mime?(D.css("backgroundColor",se.val()),o=e("<img>"),s.isCORS&&o.attr("crossorigin","use-credentials"),o.on("load",function(){l&&l.width!==ve&&Se()}).on("error",n).attr("src",tt)):n())},Ae=function(){Ne.updateView(pe,ue),Te(),Ue.width(Ee.width()).height(Ee.height()),Pe.width(Ee.width()).height(Ee.height()),Le.updateView(),it()},Se=function(){if(y){var t,n,i,a,r,s,c,d,p,u,h,f,m,g,v,b,w,x,k,C={},z=[],T=function(e,t,n){var i,a,o,r=Math.max(Math.max(e,t),n),s=Math.min(Math.min(e,t),n);return r===s?i=0:e===r?i=((t-n)/(r-s)*60+360)%360:t===r?i=(n-e)/(r-s)*60+120:n===r&&(i=(e-t)/(r-s)*60+240),a=(r-s)/r,o=(.3*e+.59*t+.11*n)/255,[i,a,o,"hsl"]},A=function(e){return 8*Math.round(e/8)};e:try{n=l.width=qe.width(),i=l.height=qe.height(),m=n/pe,y.scale(m,m),y.drawImage(o.get(0),0,0),f=y.getImageData(0,0,n,i).data,g=.1*n,v=.9*n,b=.1*i,w=.9*i;for(var S=0;S<i-1;S++)for(var I=0;I<n-1;I++){if(t=4*I+S*n*4,a=f[t],r=f[t+1],s=f[t+2],c=f[t+3],255!==c){se.parent().hide(),le.hide();break e}u=T(a,r,s),h=Math.round(u[0]),d=Math.round(100*u[1]),p=Math.round(100*u[2]),ee[I]||(ee[I]={}),ee[I][S]=[a,r,s,h,d,p],(I<g||I>v)&&(S<b||S>w)&&(x=A(a)+","+A(r)+","+A(s),C[x]?++C[x]:C[x]=1)}le.children(":first").length||(k=1,e.each(C,function(e,t){z.push({c:e,v:t})}),e.each(z.sort(function(e,t){return e.v>t.v?-1:1}),function(){return!(this.v<2||k>10)&&(le.append(e('<span style="width:20px;height:20px;display:inline-block;background-color:rgb('+this.c+');">')),void++k)}))}catch(O){oe.hide(),le.hide()}}},Ie=function(){try{l=document.createElement("canvas"),y=l.getContext("2d")}catch(e){oe.hide(),le.hide()}},Oe=function(){ot.on("click","span.elfinder-resize-preset",function(){var t=e(this),n=t.data("s")[0],i=t.data("s")[1],a=pe/ue;t.data("s",[i,n]).text(i+"x"+n),pe>n||ue>i?pe<=n?n=He(i*a):ue<=i?i=He(n/a):pe-n>ue-i?i=He(n/a):n=He(i*a):(n=pe,i=ue),jQuery.val(n),K.val(i),Ne.updateView(n,i),it()}),rt.on("click","span.elfinder-resize-preset",function(){var t=e(this),n=t.data("s")[0],i=t.data("s")[1],a=V.val(),o=X.val();t.data("s",[i,n]).text(i+"x"+n),pe>=n&&ue>=i&&(pe-n-a<0&&(a=pe-n),ue-i-o<0&&(o=ue-i),V.val(a),X.val(o),G.val(n),J.val(i),Le.updateView(),it())}),rt.children("span.elfinder-resize-preset").each(function(){var t=e(this),n=t.data("s")[0],i=t.data("s")[1];t[pe>=n&&ue>=i?"show":"hide"]()})},je=null,Me=!1,De=function(e){var t=s.file(i.hash);t.width=e[0],t.height=e[1]},Fe=function(){var n,a,o;Me||(Me=!0,je&&je.state&&"pending"===je.state()&&je.reject(),s.api>=2.103?0===t&&s.request({data:{cmd:"resize",target:i.hash,degree:0,mode:"rotate"},preventDefault:!0}).done(function(e){t=e.losslessRotate?1:-1,1===t&&Q.val()%90===0&&q.children("div.elfinder-resize-quality").hide()}).fail(function(){t=-1}):t=-1,n=Ee.get(0),a=i.width&&i.height?{w:i.width,h:i.height}:n.naturalWidth?null:{w:Ee.width(),h:Ee.height()},a&&Ee.removeAttr("width").removeAttr("height"),pe=i.width||n.naturalWidth||n.width||Ee.width(),ue=i.height||n.naturalHeight||n.height||Ee.height(),i.width&&i.height||De([pe,ue]),a&&Ee.width(a.w).height(a.h),w.show(),o=ue/pe,o<1&&D.height()>D.width()*o&&D.height(D.width()*o),D.height()>Ee.height()+20&&D.height(Ee.height()+20),ge=D.height()-(E.outerHeight()-E.height()),F.remove(),ce=pe/ue,E.append(Ee.show()).show(),jQuery.val(pe),K.val(ue),Ie(),Oe(),Ae(),W[f]("enable"),M.find("input,select").prop("disabled",!1).filter(":text").on("keydown",function(t){var n;if(t.keyCode==e.ui.keyCode.ENTER)return t.stopPropagation(),t.preventDefault(),n={title:e("input:checked",W).val(),text:"confirmReq",accept:{label:"btnApply",callback:function(){Xe()}},cancel:{label:"btnCancel",callback:function(){e(this).trigger("focus")}}},st&&(n.buttons=[{label:"btnSaveAs",callback:function(){requestAnimationFrame(Ge)}}]),void s.confirm(n)}).on("keyup",function(){var t=e(this);t.hasClass("elfinder-resize-bg")||requestAnimationFrame(function(){t.val(t.val().replace(/[^0-9]/g,""))})}).filter(":first"),ze(),!s.UA.Mobile&&jQuery.trigger("focus"),Be())},Ee=e("<img/>").on("load",Fe).on("error",function(){F.text("Unable to load image").css("background","transparent")}),Ue=e("<div/>"),Pe=e("<img/>"),Re=e("<div/>"),qe=e('<img class="elfinder-resize-imgrotate" />'),He=function(e,t){return e=we?8*Math.round(e/8):Math.round(e),e=Math.max(0,e),t&&e>t&&(e=we?8*Math.floor(t/8):t),e},_e=function(){jQuery.val(pe),K.val(ue),Ne.updateView(pe,ue),V.val(0),X.val(0),G.val(pe),J.val(ue),Le.updateView(),it()},Ne={update:function(){jQuery.val(He(Ee.width()/de)),K.val(He(Ee.height()/de)),it()},updateView:function(e,t){e>me||t>ge?e/me>t/ge?(de=me/e,Ee.width(me).height(He(t*de))):(de=ge/t,Ee.height(ge).width(He(e*de))):Ee.width(He(e)).height(He(t)),de=Ee.width()/e,N.text("1 : "+(1/de).toFixed(2)),Ne.updateHandle()},updateHandle:function(){E.width(Ee.width()).height(Ee.height())},fixHeight:function(){var e,t;he&&(e=jQuery.val(),t=He(e/ce),Ne.updateView(e,t),K.val(t))}},Le={update:function(e){V.val(He((U.data("x")||U.position().left)/de,pe)),X.val(He((U.data("y")||U.position().top)/de,ue)),"xy"!==e&&(G.val(He((U.data("w")||U.width())/de,pe-V.val())),J.val(He((U.data("h")||U.height())/de,ue-X.val()))),it()},updateView:function(e){var t,n,i,a,o;V.val(He(V.val(),pe-(we?8:1))),X.val(He(X.val(),ue-(we?8:1))),G.val(He(G.val(),pe-V.val())),J.val(He(J.val(),ue-X.val())),fe&&(t=Re.width()/Re.height(),"w"===e?J.val(He(parseInt(G.val())/t)):"h"===e&&G.val(He(parseInt(J.val())*t))),n=Math.round(parseInt(V.val())*de),i=Math.round(parseInt(X.val())*de),"xy"!==e?(a=Math.round(parseInt(G.val())*de),o=Math.round(parseInt(J.val())*de)):(a=U.data("w"),o=U.data("h")),U.data({x:n,y:i,w:a,h:o}).width(a).height(o).css({left:n,top:i}),Re.width(a).height(o)},resize_update:function(e,t){U.data({x:t.position.left,y:t.position.top,w:t.size.width,h:t.size.height}),Le.update(),Le.updateView()},drag_update:function(e,t){U.data({x:t.position.left,y:t.position.top}),Le.update("xy")}},We={mouseStartAngle:0,imageStartAngle:0,imageBeingRotated:!1,setQuality:function(){q.children("div.elfinder-resize-quality")[t>0&&Q.val()%90===0?"hide":"show"]()},update:function(e,t){"undefined"==typeof e&&(ye=e=parseInt(Q.val())),"undefined"==typeof t&&(t=!0),!t||s.UA.Opera||s.UA.ltIE8?qe.rotate(e):qe.animate({rotate:e+"deg"}),e%=360,e<0&&(e+=360),Q.val(parseInt(e)),Z.slider("value",Q.val()),We.setQuality()},execute:function(e){if(We.imageBeingRotated){var t=We.getCenter(qe),n=e.originalEvent.touches?e.originalEvent.touches[0]:e,i=n.pageX-t[0],a=n.pageY-t[1],o=Math.atan2(a,i),r=o-We.mouseStartAngle+We.imageStartAngle;return r=Math.round(180*parseFloat(r)/Math.PI),e.shiftKey&&(r=15*Math.round((r+6)/15)),qe.rotate(r),r%=360,r<0&&(r+=360),Q.val(r),Z.slider("value",Q.val()),We.setQuality(),!1}},start:function(t){if(!qe.hasClass("elfinder-resize-picking")){O(),We.imageBeingRotated=!0;var n=We.getCenter(qe),i=t.originalEvent.touches?t.originalEvent.touches[0]:t,a=i.pageX-n[0],o=i.pageY-n[1];
return We.mouseStartAngle=Math.atan2(o,a),We.imageStartAngle=parseFloat(qe.rotate())*Math.PI/180,e(document).on("mousemove",We.execute),qe.on("touchmove",We.execute),!1}},stop:function(t){if(We.imageBeingRotated)return e(document).off("mousemove",We.execute),qe.off("touchmove",We.execute),requestAnimationFrame(function(){We.imageBeingRotated=!1}),j(),!1},getCenter:function(e){var t=qe.rotate();qe.rotate(0);var n=qe.offset(),i=n.left+qe.width()/2,a=n.top+qe.height()/2;return qe.rotate(t),Array(i,a)}},Be=function(e){e?(E.filter(":ui-resizable").resizable("destroy"),E.hide()):(E.show(),E.resizable({alsoResize:Ee,aspectRatio:he,resize:Ne.update,start:O,stop:function(e){Ne.fixHeight,Ne.updateView(jQuery.val(),K.val()),j()}}),at())},$e=function(e){e?(U.filter(":ui-resizable").resizable("destroy").filter(":ui-draggable").draggable("destroy"),Ue.hide()):(Ue.show(),U.resizable({containment:Ue,aspectRatio:fe,resize:Le.resize_update,start:O,stop:j,handles:"all"}).draggable({handle:Re,containment:Pe,drag:Le.drag_update,start:O,stop:function(){Le.updateView("xy"),j()}}),at(),Le.update())},Ke=function(e){e?qe.hide():(qe.show(),at())},Ve=function(){var e,t,n,i,a,o,r="";if("resize"==B)e=parseInt(jQuery.val())||0,t=parseInt(K.val())||0;else if("crop"==B)e=parseInt(G.val())||0,t=parseInt(J.val())||0,n=parseInt(V.val())||0,i=parseInt(X.val())||0;else if("rotate"==B){if(e=pe,t=ue,a=parseInt(Q.val())||0,a<0||a>360)return s.error("Invalid rotate degree"),!1;if(0==a||360==a)return s.error("errResizeNoChange"),!1;r=se.val()}if(o=Y?parseInt(Y.val()):0,"rotate"!=B){if(e<=0||t<=0)return s.error("Invalid image size"),!1;if(e==pe&&t==ue)return s.error("errResizeNoChange"),!1}return{w:e,h:t,x:n,y:i,d:a,q:o,b:r}},Xe=function(){var e;(e=Ve())&&(C.elfinderdialog("close"),r.resizeRequest({target:i.hash,width:e.w,height:e.h,x:e.x,y:e.y,degree:e.d,quality:e.q,bg:e.b,mode:B},i,c))},Ge=function(){var t,n=function(){t.addClass(b).fadeIn(function(){x.addClass(v)}),s.disable()},a=function(){r.mime=i.mime,r.prefix=i.name.replace(/ \d+(\.[^.]+)?$/,"$1"),r.requestCmd="mkfile",r.nextAction={},r.data={target:i.phash},e.proxy(s.res("mixin","make"),r)().done(function(a){var o,r;a.added&&a.added.length?(o=a.added[0].hash,r=s.api<2.1032?s.url(i.hash,{async:!0,temporary:!0}):null,e.when(r).done(function(e){s.request({options:{type:"post"},data:{cmd:"put",target:o,encoding:r?"scheme":"hash",content:r?s.convAbsUrl(e):i.hash},notify:{type:"copy",cnt:1},syncOnFail:!0}).fail(n).done(function(e){e=s.normalize(e),s.updateCache(e),i=s.file(o),e.changed&&e.changed.length&&s.change(e),x.show().find(".elfinder-dialog-title").html(s.escape(i.name)),Xe(),t.fadeIn()})}).fail(n)):n()}).fail(n).always(function(){delete r.mime,delete r.prefix,delete r.nextAction,delete r.data}),s.trigger("unselectfiles",{files:[i.hash]})},o=null;Ve()&&(t=h.children("."+r.dialogClass+":visible").removeClass(b).fadeOut(),x.removeClass(v),s.enable(),s.searchStatus.state<2&&i.phash!==s.cwd().hash&&(o=s.exec("open",[i.phash],{thash:i.phash})),e.when([o]).done(function(){o?s.one("cwdrender",a):a()}).fail(n))},Je={},Ye="elfinder-resize-handle-hline",Qe="elfinder-resize-handle-vline",Ze="elfinder-resize-handle-point",et=s.openUrl(i.hash),tt=s.openUrl(i.hash,!s.isSameOrigin(et)),nt=Y?e("<img>").attr("crossorigin",s.isCORS?"use-credentials":"").attr("src",tt).on("load",function(){try{var e=document.createElement("canvas");nt.data("canvas",e).data("ctx",e.getContext("2d")),it()}catch(t){nt.removeData("canvas").removeData("ctx")}}):null,it=function(){M.find("input.elfinder-resize-quality:visible").trigger("change")},at=function(t){if(!x.hasClass("elfinder-dialog-minimized")&&!x.is(":hidden")){ot.hide(),rt.hide();var n,i,a,o=s.options.dialogContained?h:e(window),r=o.height(),l=o.width(),c="auto",d=!0;x.width(Math.min(u,l-30)),D.attr("style",""),pe&&ue&&(me=D.width()-(E.outerWidth()-E.width()),ge=D.height()-(E.outerHeight()-E.height()),Ne.updateView(pe,ue)),i=C.find("div.elfinder-resize-control").width(),a=D.width(),n=C.width()-20,a>n?(D.width(n),d=!1):n-a<i&&(l>r?D.width(n-i-20):(D.css({"float":"none",marginLeft:"auto",marginRight:"auto"}),d=!1)),d&&(c=i),me=D.width()-(E.outerWidth()-E.width()),h.hasClass("elfinder-fullscreen")?x.height()>r&&(r-=2,D.height(r-x.height()+D.height()),x.css("top",0-h.offset().top)):(r-=30,D.height()>r&&D.height(r)),ge=D.height()-(E.outerHeight()-E.height()),pe&&ue&&Ae(),Ee.height()&&D.height()>Ee.height()+20&&(D.height(Ee.height()+20),ge=D.height()-(E.outerHeight()-E.height()),Te()),ot.css("width",c).show(),rt.css("width",c).show(),rt.children("span.elfinder-resize-preset:visible").length||rt.hide()}},ot=function(){var t,n=e('<fieldset class="elfinder-resize-preset-container">').append(e("<legend>").html(s.i18n("presets"))).hide();return e.each(g,function(i,a){2===a.length&&(t=!0,n.append(e('<span class="elfinder-resize-preset"/>').data("s",a).text(a[0]+"x"+a[1]).button()))}),t?n:e()}(),rt=ot.clone(!0),st=s.uploadMimeCheck(i.mime,i.phash);P.append(e(T).append(e(A).text(s.i18n("width")),$),e(T).append(e(A).text(s.i18n("height")),K,e('<div class="elfinder-resize-whctrls">').append(xe,L)),Y?e(T).append(e(A).text(s.i18n("quality")),Y,e("<span/>")):e(),k?e(T).append(e(A).text(s.i18n("8pxgrid")).addClass("elfinder-resize-grid8"),Ce):e(),e(T).append(e(A).text(s.i18n("scale")),N),e(T).append(ot)),d&&(R.append(e(T).append(e(A).text("X"),V),e(T).append(e(A).text("Y")).append(X),e(T).append(e(A).text(s.i18n("width")),G),e(T).append(e(A).text(s.i18n("height")),J,e('<div class="elfinder-resize-whctrls">').append(ke,L.clone(!0))),Y?e(T).append(e(A).text(s.i18n("quality")),Y.clone(!0),e("<span/>")):e(),k?e(T).append(e(A).text(s.i18n("8pxgrid")).addClass("elfinder-resize-grid8")):e(),e(T).append(rt)),q.append(e(T).addClass("elfinder-resize-degree").append(e(A).text(s.i18n("rotate")),Q,e("<span/>").text(s.i18n("degree")),e("<div/>").append(H,_)[f]()),e(T).css("height","20px").append(Z),Y?e(T)[t<1?"show":"hide"]().addClass("elfinder-resize-quality").append(e(A).text(s.i18n("quality")),Y.clone(!0),e("<span/>")):e(),e(T).append(e(A).text(s.i18n("bgcolor")),se,oe,re),e(T).css("height","20px").append(le)),H.on("click",function(){ye-=90,We.update(ye)}),_.on("click",function(){ye+=90,We.update(ye)})),C.append(W).on("resize",function(e){e.stopPropagation()}),d?M.append(P,R.hide(),q.hide()):M.append(P),E.append('<div class="'+Ye+" "+Ye+'-top"/>','<div class="'+Ye+" "+Ye+'-bottom"/>','<div class="'+Qe+" "+Qe+'-left"/>','<div class="'+Qe+" "+Qe+'-right"/>','<div class="'+Ze+" "+Ze+'-e"/>','<div class="'+Ze+" "+Ze+'-se"/>','<div class="'+Ze+" "+Ze+'-s"/>'),D.append(F).append(E.hide()).append(Ee.hide()),d&&(U.css("position","absolute").append('<div class="'+Ye+" "+Ye+'-top"/>','<div class="'+Ye+" "+Ye+'-bottom"/>','<div class="'+Qe+" "+Qe+'-left"/>','<div class="'+Qe+" "+Qe+'-right"/>','<div class="'+Ze+" "+Ze+'-n"/>','<div class="'+Ze+" "+Ze+'-e"/>','<div class="'+Ze+" "+Ze+'-s"/>','<div class="'+Ze+" "+Ze+'-w"/>','<div class="'+Ze+" "+Ze+'-ne"/>','<div class="'+Ze+" "+Ze+'-se"/>','<div class="'+Ze+" "+Ze+'-sw"/>','<div class="'+Ze+" "+Ze+'-nw"/>'),D.append(Ue.css("position","absolute").hide().append(Pe,U.append(Re))),D.append(qe.hide())),D.css("overflow","hidden"),C.append(D,M),Je[s.i18n("btnApply")]=Xe,st&&(Je[s.i18n("btnSaveAs")]=function(){requestAnimationFrame(Ge)}),Je[s.i18n("btnCancel")]=function(){C.elfinderdialog("close")},C.find("input,button").addClass("elfinder-tabstop"),x=r.fmDialog(C,{title:s.escape(i.name),width:u,resizable:!1,buttons:Je,open:function(){var e=!!(s.option("substituteImg",i.hash)&&i.size>p.dimSubImgSize),t=!(!i.width||!i.height);if(C.parent().css("overflow","hidden"),w=x.find(".ui-dialog-titlebar .elfinder-titlebar-minimize").hide(),s.bind("resize",at),Ee.attr("src",et),Pe.attr("src",et),qe.attr("src",et),d&&(qe.on("mousedown touchstart",We.start).on("touchend",We.stop),x.on("mouseup",We.stop)),t&&!e)return Fe();if(i.size>(p.getDimThreshold||0))je=s.request({data:{cmd:"dim",target:i.hash,substitute:e?400:""},preventDefault:!0}).done(function(e){if(e.dim){var t=e.dim.split("x");return i.width=t[0],i.height=t[1],De(t),e.url&&(Ee.attr("src",e.url),Pe.attr("src",e.url),qe.attr("src",e.url)),Fe()}});else if(t)return Fe()},close:function(){d&&(qe.off("mousedown touchstart",We.start).off("touchend",We.stop),e(document).off("mouseup",We.stop)),s.unbind("resize",at),e(this).elfinderdialog("destroy")},resize:function(e,t){t&&"off"===t.minimize&&at()}}).attr("id",a).closest(".ui-dialog").addClass(b),s.UA.ltIE8&&e(".elfinder-dialog").css("filter",""),Re.css({opacity:.2,"background-color":"#fff",position:"absolute"}),U.css("cursor","move"),U.find(".elfinder-resize-handle-point").css({"background-color":"#fff",opacity:.5,"border-color":"#000"}),d||W.find(".api2").remove(),M.find("input,select").prop("disabled",!0),M.find("input.elfinder-resize-quality").next("span").addClass("elfinder-resize-jpgsize").attr("title",s.i18n("roughFileSize"))};return l.length&&l[0].mime.indexOf("image/")!==-1?(a="resize-"+s.namespace+"-"+l[0].hash,o=h.find("#"+a),o.length?(o.elfinderdialog("toTop"),c.resolve()):(y(l[0],a),c)):c.reject()}},function(e){var t=function(e,t){var n=0;for(n in t)if("undefined"!=typeof e[t[n]])return t[n];return e[t[n]]="",t[n]};if(e.cssHooks.rotate={get:function(t,n,i){return e(t).rotate()},set:function(t,n){return e(t).rotate(n),n}},e.cssHooks.transform={get:function(e,n,i){var a=t(e.style,["WebkitTransform","MozTransform","OTransform","msTransform","transform"]);return e.style[a]},set:function(e,n){var i=t(e.style,["WebkitTransform","MozTransform","OTransform","msTransform","transform"]);return e.style[i]=n,n}},e.fn.rotate=function(e){var t;return"undefined"==typeof e?window.opera?(t=this.css("transform").match(/rotate\((.*?)\)/),t&&t[1]?Math.round(180*parseFloat(t[1])/Math.PI):0):(t=this.css("transform").match(/rotate\((.*?)\)/),t&&t[1]?parseInt(t[1]):0):(this.css("transform",this.css("transform").replace(/none|rotate\(.*?\)/,"")+"rotate("+parseInt(e)+"deg)"),this)},e.fx.step.rotate=function(t){0==t.state&&(t.start=e(t.elem).rotate(),t.now=t.start),e(t.elem).rotate(t.now)},"undefined"==typeof window.addEventListener&&"undefined"==typeof document.getElementsByClassName){var n=function(e){for(var t=e,n=t.offsetLeft,i=t.offsetTop;t.offsetParent&&(t=t.offsetParent,t==document.body||"static"==t.currentStyle.position);)t!=document.body&&t!=document.documentElement&&(n-=t.scrollLeft,i-=t.scrollTop),n+=t.offsetLeft,i+=t.offsetTop;return{x:n,y:i}},i=function(e){if("static"==e.currentStyle.position){var t=n(e);e.style.position="absolute",e.style.left=t.x+"px",e.style.top=t.y+"px"}},a=function(e,t){var n,a=1,o=1,r=1,s=1;if("undefined"!=typeof e.style.msTransform)return!0;i(e),n=t.match(/rotate\((.*?)\)/);var l=n&&n[1]?parseInt(n[1]):0;l%=360,l<0&&(l=360+l);var c=l*Math.PI/180,d=Math.cos(c),p=Math.sin(c);a*=d,o*=-p,r*=p,s*=d,e.style.filter=(e.style.filter||"").replace(/progid:DXImageTransform\.Microsoft\.Matrix\([^)]*\)/,"")+("progid:DXImageTransform.Microsoft.Matrix(M11="+a+",M12="+o+",M21="+r+",M22="+s+",FilterType='bilinear',sizingMethod='auto expand')");var u=parseInt(e.style.width||e.width||0),h=parseInt(e.style.height||e.height||0);c=l*Math.PI/180;var f=Math.abs(Math.cos(c)),m=Math.abs(Math.sin(c)),g=(u-(u*f+h*m))/2,v=(h-(u*m+h*f))/2;return e.style.marginLeft=Math.floor(g)+"px",e.style.marginTop=Math.floor(v)+"px",!0},o=e.cssHooks.transform.set;e.cssHooks.transform.set=function(e,t){return o.apply(this,[e,t]),a(e,t),t}}}(jQuery),(i.prototype.commands.restore=function(){"use strict";var t=this,n=this.fm,i=0,a=function(t){var o,r=e.Deferred(),s=[],l=[],c=[],d=[];return r._xhrReject=function(){e.each(c,function(){this&&this.reject&&this.reject()}),o&&o._xhrReject()},e.each(t,function(e,t){"directory"===t.mime?s.push(t):l.push(t)}),s.length?(e.each(s,function(e,t){c.push(n.request({data:{cmd:"open",target:t.hash},preventDefault:!0,asNotOpen:!0})),d[e]=t.hash}),e.when.apply(e,c).fail(function(){r.reject()}).done(function(){var t=[];e.each(arguments,function(e,n){n.files&&(n.files.length?t=t.concat(n.files):t.push({hash:"fakefile_"+i++,phash:d[e],mime:"fakefile",name:"fakefile",ts:0}))}),n.cache(t),o=a(t).done(function(e){l=l.concat(e),r.resolve(l)})})):r.resolve(l),r},o=function(t,o,r,s){var l,c,d={},p=[],u=!1,h=[],f=s||{},m=+new Date;n.lockfiles({files:r}),h=e.map(o,function(e){return"directory"===e.mime?e.hash:null}),t.done(function(){h&&n.exec("rm",h,{forceRm:!0,quiet:!0})}).always(function(){n.unlockfiles({files:r})}),l=setTimeout(function(){n.notify({type:"search",id:m,cnt:1,hideCnt:!0,cancel:function(){c&&c._xhrReject(),t.reject()}})},n.notifyDelay),i=0,c=a(o).always(function(){l&&clearTimeout(l),n.notify({type:"search",id:m,cnt:-1,hideCnt:!0})}).fail(function(){t.reject("errRestore","errFileNotFound")}).done(function(i){var a=["errRestore","errFolderNotFound"],o="";i.length?(e.each(i,function(t,i){for(var a,r,s,l=i.phash;l;){if(r=n.trashes[l]){if(!d[r]){if(u)return p.push(i.hash),null;d[r]={},u=!0}s=n.path(i.hash).substr(n.path(l).length).replace(/\\/g,"/"),s=s.replace(/\/[^\/]+?$/,""),""===s&&(s="/"),d[r][s]||(d[r][s]=[]),"fakefile"===i.mime?n.updateCache({removed:[i.hash]}):d[r][s].push(i.hash),(!o||o.length>s.length)&&(o=s);break}a=n.file(l),a?l=a.phash:(l=!1,e.each(n.trashes,function(e){var t=n.file(e),a=n.path(e);if((!t.volumeid||0===i.hash.indexOf(t.volumeid))&&0===n.path(i.hash).indexOf(a))return l=e,!1}))}}),u?e.each(d,function(i,s){var l=Object.keys(s),c=l.length;n.request({data:{cmd:"mkdir",target:i,dirs:l},notify:{type:"chkdir",cnt:c},preventFail:!0}).fail(function(e){t.reject(e),n.unlockfiles({files:r})}).done(function(i){var r,l;(l=i.hashes)?(r=n.getCommand("paste"),r?n.one("mkdirdone",function(){var i=!1;e.each(s,function(e,r){l[e]&&(r.length?n.file(l[e])?(n.clipboard(r,!0),n.exec("paste",[l[e]],{_cmd:"restore",noToast:f.noToast||e!==o}).done(function(e){e&&(e.error||e.warning)&&(i=!0)}).fail(function(){i=!0}).always(function(){--c<1&&(t[i?"reject":"resolve"](),p.length&&n.exec("restore",p))})):t.reject(a):--c<1&&(t.resolve(),p.length&&n.exec("restore",p)))})}):t.reject(["errRestore","errCmdNoSupport","(paste)"])):t.reject(a)})}):t.reject(a)):(t.reject("errFileNotFound"),h&&n.exec("rm",h,{forceRm:!0,quiet:!0}))})};this.restore=o,this.linkedCmds=["copy","paste","mkdir","rm"],this.updateOnSelect=!1,this.init=function(){t=this,n=this.fm},this.getstate=function(t,i){return t=t||n.selected(),t.length&&e.grep(t,function(e){var t=n.file(e);return!(!t||t.locked||n.isRoot(t))}).length==t.length?0:-1},this.exec=function(i,a){var o=e.Deferred().fail(function(e){e&&n.error(e)}),r=t.files(i);return r.length?(e.each(r,function(e,t){return n.isRoot(t)?!o.reject(["errRestore",t.name]):t.locked?!o.reject(["errLocked",t.name]):void 0}),"pending"===o.state()&&this.restore(o,r,i,a),o):o.reject()}}).prototype={forceLoad:!0},i.prototype.commands.rm=function(){"use strict";var t=this,n=this.fm,i='<div class="ui-helper-clearfix elfinder-rm-title"><span class="elfinder-cwd-icon {class} ui-corner-all"/>{title}<div class="elfinder-rm-desc">{desc}</div></div>',a=function(a,o,s,c,d){var p,u,h,f,m,g,v=o.length,b=n.cwd().hash,y=[],w=n.i18n("calc")+'<span class="elfinder-spinner"/>';v>1?(f=0,e.each(s,function(e,t){if(!t.size||"unknown"==t.size||"directory"===t.mime)return f="unknown",!1;var n=parseInt(t.size);n>=0&&f>=0&&(f+=n)}),l="unknown"===f,y.push(n.i18n("size")+": "+(l?w:n.formatSize(f))),u=[e(i.replace("{class}","elfinder-cwd-icon-group").replace("{title}","<strong>"+n.i18n("items")+": "+v+"</strong>").replace("{desc}",y.join("<br>")))]):(m=s[0],h=n.tmb(m),l="directory"===m.mime,y.push(n.i18n("size")+": "+(l?w:n.formatSize(m.size))),y.push(n.i18n("modify")+": "+n.formatDate(m)),g=n.escape(m.i18||m.name).replace(/([_.])/g,"&#8203;$1"),u=[e(i.replace("{class}",n.mime2class(m.mime)).replace("{title}","<strong>"+g+"</strong>").replace("{desc}",y.join("<br>")))]),d&&(u=u.concat(d)),u.push(c?"confirmTrash":"confirmRm"),p=n.confirm({title:t.title,text:u,accept:{label:"btnRm",callback:function(){c?t.toTrash(a,o,c):r(a,o)}},cancel:{label:"btnCancel",callback:function(){n.unlockfiles({files:o}),1===o.length&&n.file(o[0]).phash!==b?n.select({selected:o}):n.selectfiles({files:o}),a.reject()}}}),h&&e("<img/>").on("load",function(){p.find(".elfinder-cwd-icon").addClass(h.className).css("background-image","url('"+h.url+"')")}).attr("src",h.url),l&&(l=n.getSize(e.map(s,function(e){return"directory"===e.mime?e.hash:null})).done(function(e){p.find("span.elfinder-spinner").parent().html(n.i18n("size")+": "+e.formated)}).fail(function(){p.find("span.elfinder-spinner").parent().html(n.i18n("size")+": "+n.i18n("unknown"))}).always(function(){l=!1}))},o=function(i,a,o){var r,s,l,c={},d=a.length,p=t.options.toTrashMaxItems,u=[],h=e.Deferred();return d>p?void t.confirm(i,a,t.files(a),null,[n.i18n("tooManyToTrash")]):(e.each(a,function(e,t){var i=n.file(t),a=n.path(t).replace(/\\/g,"/"),o=a.match(/^[^\/]+?(\/(?:[^\/]+?\/)*)[^\/]+?$/);i&&(o&&(o[1]=o[1].replace(/(^\/.*?)\/?$/,"$1"),c[o[1]]||(c[o[1]]=[]),c[o[1]].push(t)),"directory"===i.mime&&u.push(t))}),u.length?(r=n.request({data:{cmd:"size",targets:u},notify:{type:"readdir",cnt:1,hideCnt:!0},preventDefault:!0}).done(function(e){var t=0;e.fileCnt&&(t+=parseInt(e.fileCnt)),e.dirCnt&&(t+=parseInt(e.dirCnt)),h[t>p?"reject":"resolve"]()}).fail(function(){h.reject()}),setTimeout(function(){var e=r&&r.xhr?r.xhr:null;e&&"pending"==e.state()&&(r.syncOnFail(!1),r.reject(),h.reject())},1e3*t.options.infoCheckWait)):h.resolve(),void h.done(function(){s=Object.keys(c),l=s.length,l?n.request({data:{cmd:"mkdir",target:o,dirs:s},notify:{type:"chkdir",cnt:l},preventFail:!0}).fail(function(e){i.reject(e),n.unlockfiles({files:a})}).done(function(t){var o,r,s,d,p=function(t,i,o){var r,s,l,c;e.each(t,function(e,t){Array.isArray(t)&&(h[e]?h[e]=h[e].concat(t):h[e]=t)}),t.sync&&(h.sync=1),t.added&&t.added.length&&(r=function(){var i=[],a=e.map(t.added,function(e){return"directory"===e.mime?e.hash:null});return e.each(t.added,function(t,n){e.inArray(n.phash,a)===-1&&i.push(n.hash)}),n.exec("restore",i,{noToast:!0})},l=function(){return n.request({data:o,notify:{type:"redo",cnt:a.length}})},h.undo?(s=h.undo,h.undo=function(){r(),s()}):h.undo=r,h.redo?(c=h.redo,h.redo=function(){l(),c()}):h.redo=l)},u=["errTrash"],h={},f=function(){return n.ui.notify.children(".elfinder-notify-trash").length};(o=t.hashes)?(s=1/l*100,d=1===l?100:5,r=setTimeout(function(){n.notify({type:"trash",cnt:1,hideCnt:!0,progress:d})},n.notifyDelay),e.each(c,function(t,c){var m,g=n.file(c[0]).phash;o[t]&&(m={cmd:"paste",dst:o[t],targets:c,cut:1},n.request({data:m,preventDefault:!0}).fail(function(e){e&&(u=u.concat(e))}).done(function(e){e=n.normalize(e),n.updateCache(e),p(e,g,m),e.warning&&(u=u.concat(e.warning),delete e.warning),e.removed&&e.removed.length&&n.remove(e),e.added&&e.added.length&&n.add(e),e.changed&&e.changed.length&&n.change(e),n.trigger("paste",e),n.trigger("pastedone"),e.sync&&n.sync()}).always(function(){var t=[],o=2;f()?n.notify({type:"trash",cnt:0,hideCnt:!0,progress:s}):d+=s,--l<1&&(r&&clearTimeout(r),f()&&n.notify({type:"trash",cnt:-1}),n.unlockfiles({files:a}),Object.keys(h).length?(u.length>1&&((h.removed||h.removed.length)&&(t=e.grep(a,function(t){return e.inArray(t,h.removed)===-1})),t.length?(u.length>o&&(o=(n.messages[u[o-1]]||"").indexOf("$")===-1?o:o+1),i.reject(),n.exec("rm",t,{addTexts:u.slice(0,o),forceRm:!0})):n.error(u)),h._noSound=!0,h.undo&&h.redo&&(h.undo={cmd:"trash",callback:h.undo},h.redo={cmd:"trash",callback:h.redo}),i.resolve(h)):i.reject(u))}))})):(i.reject("errFolderNotFound"),n.unlockfiles({files:a}))}):(i.reject(["error","The folder hierarchy to be deleting can not be determined."]),n.unlockfiles({files:a}))}).fail(function(){t.confirm(i,a,t.files(a),null,[n.i18n("tooManyToTrash")])}))},r=function(e,t,i){var a=i?{}:{type:"rm",cnt:t.length};n.request({data:{cmd:"rm",targets:t},notify:a,preventFail:!0}).fail(function(t){e.reject(t)}).done(function(t){(t.error||t.warning)&&(t.sync=!0),e.resolve(t)}).always(function(){n.unlockfiles({files:t})})},s=function(t){var i,a=null;return t&&t.length&&(t.length>1&&2===n.searchStatus.state?(i=n.file(n.root(t[0])).volumeid,e.grep(t,function(e){return 0!==e.indexOf(i)}).length||(a=n.option("trashHash",t[0]))):a=n.option("trashHash",t[0])),a},l=!1;this.confirm=a,this.toTrash=o,this.remove=r,this.syncTitleOnChange=!0,this.updateOnSelect=!1,this.shortcuts=[{pattern:"delete ctrl+backspace shift+delete"}],this.value="rm",this.init=function(){t=this,n=this.fm,t.change(function(){var i;delete t.extra,t.title=n.i18n("cmd"+t.value),t.className=t.value,t.button&&t.button.children("span.elfinder-button-icon")["trash"===t.value?"addClass":"removeClass"]("elfinder-button-icon-trash"),"trash"===t.value&&(t.extra={icon:"rm",node:e("<span/>").attr({title:n.i18n("cmdrm")}).on("ready",function(e,t){i=t.targets}).on("click touchstart",function(e){"touchstart"===e.type&&e.originalEvent.touches.length>1||(e.stopPropagation(),e.preventDefault(),n.getUI().trigger("click"),n.exec("rm",i,{_userAction:!0,forceRm:!0}))})})})},this.getstate=function(t){var i=this.hashes(t);return i.length&&e.grep(i,function(e){var t=n.file(e);return!(!t||t.locked||n.isRoot(t))}).length==i.length?0:-1},this.exec=function(i,a){var o,c=a||{},d=e.Deferred().always(function(){l&&l.state&&"pending"===l.state()&&l.reject()}).fail(function(e){e&&n.error(e)}).done(function(e){!c.quiet&&!e._noSound&&e.removed&&e.removed.length&&n.trigger("playsound",{soundFile:"rm.wav"})}),p=t.files(i),u=p.length,h=null,f=c.addTexts?c.addTexts:null,m=c.forceRm,g=c.quiet;return u?(e.each(p,function(e,t){return n.isRoot(t)?!d.reject(["errRm",t.name,"errPerm"]):t.locked?!d.reject(["errLocked",t.name]):void 0}),"pending"===d.state()&&(o=t.hashes(i),u=p.length,(m||t.event&&t.event.originalEvent&&t.event.originalEvent.shiftKey)&&(h="",t.title=n.i18n("cmdrm")),null===h&&(h=s(o)),n.lockfiles({files:o}),h&&t.options.quickTrash?t.toTrash(d,o,h):g?r(d,o,g):t.confirm(d,o,p,h,f)),d):d.reject()},n.bind("select contextmenucreate closecontextmenu",function(e){var i=(e.data?e.data.selected||e.data.targets:null)||n.selected();i&&i.length&&t.update(void 0,(i?s(i):n.option("trashHash"))?"trash":"rm")})},i.prototype.commands.search=function(){"use strict";this.title="Find files",this.options={ui:"searchbutton"},this.alwaysEnabled=!0,this.updateOnSelect=!1,this.getstate=function(){return 0},this.exec=function(t,n,i,a){var o,r=this.fm,s=[],l=a||"",c=r.options.onlyMimes,d=[],p=function(e){return l&&"SearchName"!==l&&"SearchMime"!==l&&(e.type=l),e};return"string"==typeof t&&t?("object"==typeof n&&(i=n.mime||"",n=n.target||""),n=n?n:"",i?(i=e.trim(i).replace(","," ").split(" "),c.length&&(i=e.map(i,function(t){return t=e.trim(t),t&&(e.inArray(t,c)!==-1||e.grep(c,function(e){return 0===t.indexOf(e)}).length)?t:null}))):i=[].concat(c),r.trigger("searchstart",p({query:t,target:n,mimes:i})),!c.length||i.length?""===n&&r.api>=2.1?e.each(r.roots,function(e,n){s.push(r.request({data:p({cmd:"search",q:t,target:n,mimes:i}),notify:{type:"search",cnt:1,hideCnt:!s.length},cancel:!0,preventDone:!0}))}):(s.push(r.request({data:p({cmd:"search",q:t,target:n,mimes:i}),notify:{type:"search",cnt:1,hideCnt:!0},cancel:!0,preventDone:!0})),""!==n&&r.api>=2.1&&Object.keys(r.leafRoots).length&&e.each(r.leafRoots,function(a,l){for(o=a;o;)n===o&&e.each(l,function(){var e=r.file(this);e&&e.volumeid&&d.push(e.volumeid),s.push(r.request({data:p({cmd:"search",q:t,target:this,mimes:i}),notify:{type:"search",cnt:1,hideCnt:!1},cancel:!0,preventDone:!0}))}),o=(r.file(o)||{}).phash})):s=[e.Deferred().resolve({files:[]})],r.searchStatus.mixed=s.length>1&&d,e.when.apply(e,s).done(function(e){var t,n=arguments.length;if(e.warning&&r.error(e.warning),n>1)for(e.files=e.files||[],t=1;t<n;t++)arguments[t].warning&&r.error(arguments[t].warning),arguments[t].files&&e.files.push.apply(e.files,arguments[t].files);e.files&&e.files.length&&r.cache(e.files),r.lazy(function(){r.trigger("search",e)}).then(function(){return r.lazy(function(){r.trigger("searchdone")})}).then(function(){e.sync&&r.sync()})})):(r.getUI("toolbar").find("."+r.res("class","searchbtn")+" :text").trigger("focus"),e.Deferred().reject())}},i.prototype.commands.selectall=function(){"use strict";var t=0;this.fm.bind("select",function(e){t=e.data&&e.data.selectall?-1:0}),this.state=0,this.updateOnSelect=!1,this.getstate=function(){return t},this.exec=function(){return e(document).trigger(e.Event("keydown",{keyCode:65,ctrlKey:!0,shiftKey:!1,altKey:!1,metaKey:!1})),e.Deferred().resolve()}},i.prototype.commands.selectinvert=function(){"use strict";this.updateOnSelect=!1,this.getstate=function(){return 0},this.exec=function(){return e(document).trigger(e.Event("keydown",{keyCode:73,ctrlKey:!0,shiftKey:!0,altKey:!1,metaKey:!1})),e.Deferred().resolve()}},i.prototype.commands.selectnone=function(){"use strict";var t=this.fm,n=-1;t.bind("select",function(e){n=e.data&&e.data.unselectall?-1:0}),this.state=-1,this.updateOnSelect=!1,this.getstate=function(){return n},this.exec=function(){return t.getUI("cwd").trigger("unselectall"),e.Deferred().resolve()}},i.prototype.commands.sort=function(){"use strict";var t=this,n=t.fm,i=function(){t.variants=[],e.each(n.sortRules,function(e,i){if(n.sorters[e]){var a=e===n.sortType?"asc"===n.sortOrder?"n":"s":"";t.variants.push([e,(a?'<span class="ui-icon ui-icon-arrowthick-1-'+a+'"></span>':"")+"&nbsp;"+n.i18n("sort"+e)])}}),t.variants.push("|"),t.variants.push(["stick",(n.sortStickFolders?'<span class="ui-icon ui-icon-check"/>':"")+"&nbsp;"+n.i18n("sortFoldersFirst")]),n.ui.tree&&null!==n.options.sortAlsoTreeview&&(t.variants.push("|"),t.variants.push(["tree",(n.sortAlsoTreeview?'<span class="ui-icon ui-icon-check"/>':"")+"&nbsp;"+n.i18n("sortAlsoTreeview")])),a()},a=function(){var t,i,a=n.getUI("contextmenu");a.is(":visible")&&(t=a.find("span.elfinder-button-icon-sort"),i=t.siblings("div.elfinder-contextmenu-sub"),i.find("span.ui-icon").remove(),i.children("div.elfinder-contextsubmenu-item").each(function(){var t,i=e(this).children("span"),a=i.text().trim();a===(o.stick||(o.stick=n.i18n("sortFoldersFirst")))?n.sortStickFolders&&i.prepend('<span class="ui-icon ui-icon-check"/>'):a===(o.tree||(o.tree=n.i18n("sortAlsoTreeview")))?n.sortAlsoTreeview&&i.prepend('<span class="ui-icon ui-icon-check"/>'):a===(o[n.sortType]||(o[n.sortType]=n.i18n("sort"+n.sortType)))&&(t="asc"===n.sortOrder?"n":"s",i.prepend('<span class="ui-icon ui-icon-arrowthick-1-'+t+'"></span>'))}))},o={};this.options={ui:"sortbutton"},this.keepContextmenu=!0,n.bind("sortchange",i).bind("sorterupdate",function(){i(),n.getUI("toolbar").find(".elfiner-button-sort .elfinder-button-menu .elfinder-button-menu-item").each(function(){var t=e(this),i=t.attr("rel");t.toggle(!i||n.sorters[i])})}).bind("cwdrender",function(){var t=e(n.cwd).find("div.elfinder-cwd-wrapper-list table");t.length&&e.each(n.sortRules,function(i,a){var o=t.find("thead tr td.elfinder-cwd-view-th-"+i);if(o.length){var r,s=i==n.sortType,l={type:i,order:s?"asc"==n.sortOrder?"desc":"asc":n.sortOrder};s&&(o.addClass("ui-state-active"),r="asc"==n.sortOrder?"n":"s",e('<span class="ui-icon ui-icon-triangle-1-'+r+'"/>').appendTo(o)),e(o).on("click",function(t){e(this).data("dragging")||(t.stopPropagation(),n.getUI("cwd").data("longtap")||n.exec("sort",[],l))}).on("mouseenter mouseleave",function(t){e(this).toggleClass("ui-state-hover","mouseenter"===t.type)})}})}),this.getstate=function(){return 0},this.exec=function(t,n){var i=this.fm,a=e.isPlainObject(n)?n:function(){n+="";var e={};return"stick"===n?e.stick=!i.sortStickFolders:"tree"===n?e.tree=!i.sortAlsoTreeview:i.sorters[n]&&(i.sortType===n?e.order="asc"===i.sortOrder?"desc":"asc":e.type=n),e}(),o=Object.assign({type:i.sortType,order:i.sortOrder,stick:i.sortStickFolders,tree:i.sortAlsoTreeview},a);return i.lazy(function(){i.setSort(o.type,o.order,o.stick,o.tree),this.resolve()})}},i.prototype.commands.undo=function(){"use strict";var t=this,n=this.fm,i=function(e){e?(t.title=n.i18n("cmdundo")+" "+n.i18n("cmd"+e.cmd),t.state=0):(t.title=n.i18n("cmdundo"),t.state=-1),t.change()},a=[];this.alwaysEnabled=!0,this.updateOnSelect=!1,this.shortcuts=[{pattern:"ctrl+z"}],this.syncTitleOnChange=!0,this.getstate=function(){return a.length?0:-1},this.setUndo=function(t,o){var r={};t&&e.isPlainObject(t)&&t.cmd&&t.callback&&(Object.assign(r,t),o?(delete o.undo,r.redo=o):n.getCommand("redo").setRedo(null),a.push(r),i(r))},this.exec=function(){var t,o,r=n.getCommand("redo"),s=e.Deferred(),l={};return a.length?(t=a.pop(),t.redo?(Object.assign(l,t.redo),delete t.redo):l=null,s.done(function(){l&&r.setRedo(l,t)}),i(a.length?a[a.length-1]:void 0),o=t.callback(),o&&o.done?o.done(function(){s.resolve()}).fail(function(){s.reject()}):s.resolve(),a.length?this.update(0,a[a.length-1].name):this.update(-1,"")):s.reject(),s},n.bind("exec",function(e){var n=e.data||{};n.opts&&n.opts._userAction&&n.dfrd&&n.dfrd.done&&n.dfrd.done(function(e){e&&e.undo&&e.redo&&(e.undo.redo=e.redo,t.setUndo(e.undo))})})},i.prototype.commands.redo=function(){"use strict";var t=this,n=this.fm,i=function(e){e&&e.callback?(t.title=n.i18n("cmdredo")+" "+n.i18n("cmd"+e.cmd),t.state=0):(t.title=n.i18n("cmdredo"),t.state=-1),t.change()},a=[];this.alwaysEnabled=!0,this.updateOnSelect=!1,this.shortcuts=[{pattern:"shift+ctrl+z ctrl+y"}],this.syncTitleOnChange=!0,this.getstate=function(){return a.length?0:-1},this.setRedo=function(e,t){null===e?(a=[],i()):e&&e.cmd&&e.callback&&(t&&(e.undo=t),a.push(e),i(e))},this.exec=function(){var t,o,r=n.getCommand("undo"),s=e.Deferred(),l={},c={};return a.length?(t=a.pop(),t.undo&&(Object.assign(l,t.undo),Object.assign(c,t),delete c.undo,s.done(function(){r.setUndo(l,c)})),i(a.length?a[a.length-1]:void 0),o=t.callback(),o&&o.done?o.done(function(){s.resolve()}).fail(function(){s.reject()}):s.resolve(),s):s.reject()}},(i.prototype.commands.up=function(){"use strict";this.alwaysEnabled=!0,this.updateOnSelect=!1,this.shortcuts=[{pattern:"ctrl+up"}],this.getstate=function(){return this.fm.cwd().phash?0:-1},this.exec=function(){var t=this.fm,n=t.cwd().hash;return this.fm.cwd().phash?this.fm.exec("open",this.fm.cwd().phash).done(function(){t.one("opendone",function(){t.selectfiles({files:[n]})})}):e.Deferred().reject()}}).prototype={forceLoad:!0},i.prototype.commands.upload=function(){"use strict";var t=this.fm.res("class","hover");this.disableOnSearch=!0,this.updateOnSelect=!1,this.shortcuts=[{pattern:"ctrl+u"}],this.getstate=function(e){var t,n=this.fm,i=e||[n.cwd().hash];return this._disabled||1!=i.length||(t=n.file(i[0])),t&&"directory"==t.mime&&t.write?0:-1},this.exec=function(n){var i,a,o,r,s,l,c,d=this.fm,p=d.cwd().hash,u=function(){var e,t=n&&n instanceof Array?n:null;return(!n||n instanceof Array)&&(t||1!==(e=d.selected()).length||"directory"!==d.file(e[0]).mime?t&&1===t.length&&"directory"===d.file(t[0]).mime||(t=[p]):t=e),t},h=u(),f=h?h[0]:n&&n.target?n.target:null,m=f?d.file(f):d.cwd(),g=function(t){d.upload(t).fail(function(e){w.reject(e)}).done(function(t){var n;d.getUI("cwd");if(w.resolve(t),t&&t.added&&t.added[0]&&!d.ui.notify.children(".elfinder-notify-upload").length){var i=d.findCwdNodes(t.added);i.length?i.trigger("scrolltoview"):(m.hash!==p?n=e("<div/>").append(e('<button type="button" class="ui-button ui-widget ui-state-default ui-corner-all elfinder-tabstop"><span class="ui-button-text">'+d.i18n("cmdopendir")+"</span></button>").on("mouseenter mouseleave",function(t){e(this).toggleClass("ui-state-hover","mouseenter"==t.type)}).on("click",function(){d.exec("open",f).done(function(){d.one("opendone",function(){d.trigger("selectfiles",{files:e.map(t.added,function(e){return e.hash})})})})})):d.trigger("selectfiles",{files:e.map(t.added,function(e){return e.hash})}),d.toast({msg:d.i18n(["complete",d.i18n("cmdupload")]),extNode:n}))}}).progress(function(){w.notifyWith(this,Array.from(arguments))})},v=function(e){i.elfinderdialog("close"),h&&(e.target=h[0]),g(e)},b=function(){var t=m.hash,n=e.map(d.files(t),function(e){
return"directory"===e.mime&&e.write?e:null});return n.length?e('<div class="elfinder-upload-dirselect elfinder-tabstop" title="'+d.i18n("folders")+'"/>').on("click",function(t){t.stopPropagation(),t.preventDefault(),n=d.sortFiles(n);var a=e(this),o=(d.cwd(),i.closest("div.ui-dialog")),r=function(e,t){return{label:d.escape(e.i18||e.name),icon:t,remain:!1,callback:function(){var t=o.children(".ui-dialog-titlebar:first").find("span.elfinder-upload-target");h=[e.hash],t.html(" - "+d.escape(e.i18||e.name)),a.trigger("focus")},options:{className:h&&h.length&&e.hash===h[0]?"ui-state-active":"",iconClass:e.csscls||"",iconImg:e.icon||""}}},s=[r(m,"opendir"),"|"];e.each(n,function(e,t){s.push(r(t,"dir"))}),a.trigger("blur"),d.trigger("contextmenu",{raw:s,x:t.pageX||e(this).offset().left,y:t.pageY||e(this).offset().top,prevNode:o,fitHeight:!0})}).append('<span class="elfinder-button-icon elfinder-button-icon-dir" />'):e()},y=function(n,i){var a=e('<input type="file" '+n+"/>").on("click",function(){d.UA.IE&&setTimeout(function(){o.css("display","none").css("position","relative"),requestAnimationFrame(function(){o.css("display","").css("position","")})},100)}).on("change",function(){v({input:a.get(0),type:"files"})}).on("dragover",function(e){e.originalEvent.dataTransfer.dropEffect="copy"}),o=e("<form/>").append(a).on("click",function(e){e.stopPropagation()});return e('<div class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only elfinder-tabstop elfinder-focus"><span class="ui-button-text">'+d.i18n(i)+"</span></div>").append(o).on("click",function(e){e.stopPropagation(),e.preventDefault(),a.trigger("click")}).on("mouseenter mouseleave",function(n){e(this).toggleClass(t,"mouseenter"===n.type)})},w=e.Deferred();return r=function(t){t.stopPropagation(),t.preventDefault();var n,i=!1,a="",o=null,r="",s=null,l=t._target||null,c=t.dataTransfer||null,p=c.items&&c.items.length&&c.items[0].kind?c.items[0].kind:"";if(c){try{if(o=c.getData("elfinderfrom"),o&&(r=window.location.href+d.cwd().hash,!l&&o===r||l===r))return void w.reject()}catch(t){}if("file"===p&&(c.items[0].getAsEntry||c.items[0].webkitGetAsEntry))i=c,a="data";else if("string"!==p&&c.files&&c.files.length&&e.inArray("Text",c.types)===-1)i=c.files,a="files";else{try{(s=c.getData("text/html"))&&s.match(/<(?:img|a)/i)&&(i=[s],a="html")}catch(t){}i||((s=c.getData("text"))?(i=[s],a="text"):c&&c.files&&(p="file"))}}i?g({files:i,type:a,target:l,dropEvt:t}):(n=["errUploadNoFiles"],"file"===p&&n.push("errFolderUpload"),d.error(n),w.reject())},!h&&n?(n.input||n.files?(n.type="files",g(n)):n.dropEvt&&r(n.dropEvt),w):(s=function(t){var n,i=t.originalEvent||t,a=[],o=[];if(i.clipboardData){if(i.clipboardData.items&&i.clipboardData.items.length){o=i.clipboardData.items;for(var r=0;r<o.length;r++)"file"==i.clipboardData.items[r].kind&&(n=i.clipboardData.items[r].getAsFile(),a.push(n))}else i.clipboardData.files&&i.clipboardData.files.length&&(a=i.clipboardData.files);if(a.length)return void v({files:a,type:"files",clipdata:!0})}var s=i.target||i.srcElement;requestAnimationFrame(function(){var t,n="text";s.innerHTML&&(e(s).find("img").each(function(t,n){n.src.match(/^webkit-fake-url:\/\//)&&e(n).remove()}),e(s).find("a,img").length&&(n="html"),t=s.innerHTML,s.innerHTML="",v({files:[t],type:n}))})},i=e('<div class="elfinder-upload-dialog-wrapper"/>').append(y("multiple","selectForUpload")),!d.UA.Mobile&&function(e){return"undefined"!=typeof e.webkitdirectory||"undefined"!=typeof e.directory}(document.createElement("input"))&&i.append(y("multiple webkitdirectory directory","selectFolder")),m.dirs&&(m.hash===p||d.navHash2Elm(m.hash).hasClass("elfinder-subtree-loaded")?b().appendTo(i):(l=e('<div class="elfinder-upload-dirselect" title="'+d.i18n("nowLoading")+'"/>').append('<span class="elfinder-button-icon elfinder-button-icon-spinner" />').appendTo(i),d.request({cmd:"tree",target:m.hash}).done(function(){d.one("treedone",function(){l.replaceWith(b()),c.elfinderdialog("tabstopsInit")})}).fail(function(){l.remove()}))),d.dragUpload?a=e('<div class="ui-corner-all elfinder-upload-dropbox elfinder-tabstop" contenteditable="true" data-ph="'+d.i18n("dropPasteFiles")+'"></div>').on("paste",function(e){s(e)}).on("mousedown click",function(){e(this).trigger("focus")}).on("focus",function(){this.innerHTML=""}).on("mouseover",function(){e(this).addClass(t)}).on("mouseout",function(){e(this).removeClass(t)}).on("dragenter",function(n){n.stopPropagation(),n.preventDefault(),e(this).addClass(t)}).on("dragleave",function(n){n.stopPropagation(),n.preventDefault(),e(this).removeClass(t)}).on("dragover",function(n){n.stopPropagation(),n.preventDefault(),n.originalEvent.dataTransfer.dropEffect="copy",e(this).addClass(t)}).on("drop",function(e){i.elfinderdialog("close"),h&&(e.originalEvent._target=h[0]),r(e.originalEvent)}).prependTo(i).after('<div class="elfinder-upload-dialog-or">'+d.i18n("or")+"</div>")[0]:o=e('<div class="ui-corner-all elfinder-upload-dropbox" contenteditable="true">'+d.i18n("dropFilesBrowser")+"</div>").on("paste drop",function(e){s(e)}).on("mousedown click",function(){e(this).trigger("focus")}).on("focus",function(){this.innerHTML=""}).on("dragenter mouseover",function(){e(this).addClass(t)}).on("dragleave mouseout",function(){e(this).removeClass(t)}).prependTo(i).after('<div class="elfinder-upload-dialog-or">'+d.i18n("or")+"</div>")[0],c=this.fmDialog(i,{title:this.title+'<span class="elfinder-upload-target">'+(m?" - "+d.escape(m.i18||m.name):"")+"</span>",modal:!0,resizable:!1,destroyOnClose:!0,propagationEvents:["mousemove","mouseup","click"],close:function(){var e=d.getUI("contextmenu");e.is(":visible")&&e.click()}}),w)}},i.prototype.commands.view=function(){"use strict";var t,n=this,i=this.fm;this.value=i.viewType,this.alwaysEnabled=!0,this.updateOnSelect=!1,this.options={ui:"viewbutton"},this.getstate=function(){return 0},this.extra={icon:"menu",node:e("<span/>").attr({title:i.i18n("viewtype")}).on("click touchstart",function(t){if(!("touchstart"===t.type&&t.originalEvent.touches.length>1)){var n=e(this);t.stopPropagation(),t.preventDefault(),i.trigger("contextmenu",{raw:getSubMenuRaw(),x:n.offset().left,y:n.offset().top})}})},this.exec=function(){var e=this,t=i.storage("view","list"==this.value?"icons":"list");return i.lazy(function(){i.viewchange(),e.update(void 0,t),this.resolve()})},i.bind("init",function(){t=function(){var e,t=i.getUI("cwd"),a=[],o=i.options.uiOptions.cwd.iconsView.sizeNames,r=i.options.uiOptions.cwd.iconsView.sizeMax;for(e=0;e<=r;e++)a.push({label:i.i18n(o[e]||"Size-"+e+" icons"),icon:"view",callback:function(e){return function(){t.trigger("iconpref",{size:e}),i.storage("iconsize",e),"list"===n.value&&n.exec()}}(e)});return a.push("|"),a.push({label:i.i18n("viewlist"),icon:"view-list",callback:function(){"list"!==n.value&&n.exec()}}),a}()}).bind("contextmenucreate",function(){n.extra={icon:"menu",node:e("<span/>").attr({title:i.i18n("cmdview")}).on("click touchstart",function(a){if(!("touchstart"===a.type&&a.originalEvent.touches.length>1)){var o,r,s=e(this);t.concat();for(o="list"===n.value?t.length-1:parseInt(i.storage("iconsize")||0),r=0;r<t.length;r++)"|"!==t[r]&&(t[r].options=r===o?{className:"ui-state-active"}:void 0);a.stopPropagation(),a.preventDefault(),i.trigger("contextmenu",{raw:t,x:s.offset().left,y:s.offset().top})}})}})},i});js/elFinder.resources.js000064400000031656151215013410011263 0ustar00/**
 * elFinder resources registry.
 * Store shared data
 *
 * @type Object
 * @author Dmitry (dio) Levashov
 **/
elFinder.prototype.resources = {
	'class' : {
		hover       : 'ui-state-hover',
		active      : 'ui-state-active',
		disabled    : 'ui-state-disabled',
		draggable   : 'ui-draggable',
		droppable   : 'ui-droppable',
		adroppable  : 'elfinder-droppable-active',
		cwdfile     : 'elfinder-cwd-file',
		cwd         : 'elfinder-cwd',
		tree        : 'elfinder-tree',
		treeroot    : 'elfinder-navbar-root',
		navdir      : 'elfinder-navbar-dir',
		navdirwrap  : 'elfinder-navbar-dir-wrapper',
		navarrow    : 'elfinder-navbar-arrow',
		navsubtree  : 'elfinder-navbar-subtree',
		navcollapse : 'elfinder-navbar-collapsed',
		navexpand   : 'elfinder-navbar-expanded',
		treedir     : 'elfinder-tree-dir',
		placedir    : 'elfinder-place-dir',
		searchbtn   : 'elfinder-button-search',
		editing     : 'elfinder-to-editing',
		preventback : 'elfinder-prevent-back',
		tabstab     : 'ui-state-default ui-tabs-tab ui-corner-top ui-tab',
		tabsactive  : 'ui-tabs-active ui-state-active'
	},
	tpl : {
		perms      : '<span class="elfinder-perms"></span>',
		lock       : '<span class="elfinder-lock"></span>',
		symlink    : '<span class="elfinder-symlink"></span>',
		navicon    : '<span class="elfinder-nav-icon"></span>',
		navspinner : '<span class="elfinder-spinner elfinder-navbar-spinner"></span>',
		navdir     : '<div class="elfinder-navbar-wrapper{root}"><span id="{id}" class="ui-corner-all elfinder-navbar-dir {cssclass}"{title}><span class="elfinder-navbar-arrow"></span><span class="elfinder-navbar-icon" {style}></span>{symlink}{permissions}{name}</span><div class="elfinder-navbar-subtree" style="display:none"></div></div>',
		placedir   : '<div class="elfinder-navbar-wrapper"><span id="{id}" class="ui-corner-all elfinder-navbar-dir {cssclass}"{title}><span class="elfinder-navbar-arrow"></span><span class="elfinder-navbar-icon" {style}></span>{symlink}{permissions}{name}</span><div class="elfinder-navbar-subtree" style="display:none"></div></div>'
		
	},
	// mimes.text will be overwritten with connector config if `textMimes` is included in initial response
	// @see php/elFInder.class.php `public static $textMimes`
	mimes : {
		text : [
			'application/dash+xml',
			'application/docbook+xml',
			'application/javascript',
			'application/json',
			'application/plt',
			'application/sat',
			'application/sql',
			'application/step',
			'application/vnd.hp-hpgl',
			'application/x-awk',
			'application/x-config',
			'application/x-csh',
			'application/x-empty',
			'application/x-mpegurl',
			'application/x-perl',
			'application/x-php',
			'application/x-web-config',
			'application/xhtml+xml',
			'application/xml',
			'audio/x-mp3-playlist',
			'image/cgm',
			'image/svg+xml',
			'image/vnd.dxf',
			'model/iges'
		]
	},
	
	mixin : {
		make : function() {
			"use strict";
			var self = this,
				fm   = this.fm,
				cmd  = this.name,
				req  = this.requestCmd || cmd,
				wz   = fm.getUI('workzone'),
				org  = (this.origin && this.origin === 'navbar')? 'tree' : 'cwd',
				tree = (org === 'tree'),
				find = tree? 'navHash2Elm' : 'cwdHash2Elm',
				tarea= (! tree && fm.storage('view') != 'list'),
				sel  = fm.selected(),
				move = this.move || false,
				empty= wz.hasClass('elfinder-cwd-wrapper-empty'),
				unselect = function() {
					requestAnimationFrame(function() {
						input && input.trigger('blur');
					});
				},
				rest = function(){
					if (!overlay.is(':hidden')) {
						overlay.elfinderoverlay('hide').off('click close', cancel);
					}
					if (nnode) {
						pnode.removeClass('ui-front')
							.css('position', '')
							.off('unselect.'+fm.namespace, unselect);
						if (tarea) {
							nnode && nnode.css('max-height', '');
						} else if (!tree) {
							pnode.css('width', '')
								.parent('td').css('overflow', '');
						}
					}
				}, colwidth,
				dfrd = jQuery.Deferred()
					.fail(function(error) {
						dstCls && dst.attr('class', dstCls);
						empty && wz.addClass('elfinder-cwd-wrapper-empty');
						if (sel) {
							move && fm.trigger('unlockfiles', {files: sel});
							fm.clipboard([]);
							fm.trigger('selectfiles', { files: sel });
						}
						error && fm.error(error);
					})
					.always(function() {
						rest();
						cleanup();
						fm.enable().unbind('open', openCallback).trigger('resMixinMake');
					}),
				id    = 'tmp_'+parseInt(Math.random()*100000),
				phash = this.data && this.data.target? this.data.target : (tree? fm.file(sel[0]).hash : fm.cwd().hash),
				date = new Date(),
				file   = {
					hash  : id,
					phash : phash,
					name  : fm.uniqueName(this.prefix, phash),
					mime  : this.mime,
					read  : true,
					write : true,
					date  : 'Today '+date.getHours()+':'+date.getMinutes(),
					move  : move
				},
				dum = fm.getUI(org).trigger('create.'+fm.namespace, file),
				data = this.data || {},
				node = fm[find](id),
				nnode, pnode,
				overlay = fm.getUI('overlay'),
				cleanup = function() {
					if (node && node.length) {
						input.off();
						node.hide();
						fm.unselectfiles({files : [id]}).unbind('resize', resize);
						requestAnimationFrame(function() {
							if (tree) {
								node.closest('.elfinder-navbar-wrapper').remove();
							} else {
								node.remove();
							}
						});
					}
				},
				cancel = function(e) { 
					if (!overlay.is(':hidden')) {
						pnode.css('z-index', '');
					}
					if (! inError) {
						cleanup();
						dfrd.reject();
						if (e) {
							e.stopPropagation();
							e.preventDefault();
						}
					}
				},
				input = jQuery(tarea? '<textarea></textarea>' : '<input type="text"/>')
					.on('keyup text', function(){
						if (tarea) {
							this.style.height = '1px';
							this.style.height = this.scrollHeight + 'px';
						} else if (colwidth) {
							this.style.width = colwidth + 'px';
							if (this.scrollWidth > colwidth) {
								this.style.width = this.scrollWidth + 10 + 'px';
							}
						}
					})
					.on('keydown', function(e) {
						e.stopImmediatePropagation();
						if (e.keyCode == jQuery.ui.keyCode.ESCAPE) {
							dfrd.reject();
						} else if (e.keyCode == jQuery.ui.keyCode.ENTER) {
							e.preventDefault();
							input.trigger('blur');
						}
					})
					.on('mousedown click dblclick', function(e) {
						e.stopPropagation();
						if (e.type === 'dblclick') {
							e.preventDefault();
						}
					})
					.on('blur', function() {
						var name   = jQuery.trim(input.val()),
							parent = input.parent(),
							valid  = true,
							cut;

						if (!overlay.is(':hidden')) {
							pnode.css('z-index', '');
						}
						if (name === '') {
							return cancel();
						}
						if (!inError && parent.length) {

							if (fm.options.validName && fm.options.validName.test) {
								try {
									valid = fm.options.validName.test(name);
								} catch(e) {
									valid = false;
								}
							}
							if (!name || name === '.' || name === '..' || !valid) {
								inError = true;
								fm.error(file.mime === 'directory'? 'errInvDirname' : 'errInvName', {modal: true, close: function(){setTimeout(select, 120);}});
								return false;
							}
							if (fm.fileByName(name, phash)) {
								inError = true;
								fm.error(['errExists', name], {modal: true, close: function(){setTimeout(select, 120);}});
								return false;
							}

							cut = (sel && move)? fm.exec('cut', sel) : null;

							jQuery.when(cut)
							.done(function() {
								var toast   = {},
									nextAct = {};
								
								rest();
								input.hide().before(jQuery('<span>').text(name));

								fm.lockfiles({files : [id]});

								fm.request({
										data        : Object.assign({cmd : req, name : name, target : phash}, data || {}), 
										notify      : {type : req, cnt : 1},
										preventFail : true,
										syncOnFail  : true,
										navigate    : {toast : toast},
									})
									.fail(function(error) {
										fm.unlockfiles({files : [id]});
										inError = true;
										input.show().prev().remove();
										fm.error(error, {
											modal: true,
											close: function() {
												if (Array.isArray(error) && jQuery.inArray('errUploadMime', error) !== -1) {
													dfrd.notify('errUploadMime').reject();
												} else {
													setTimeout(select, 120);
												}
											}
										});
									})
									.done(function(data) {
										if (data && data.added && data.added[0]) {
											var item    = data.added[0],
												dirhash = item.hash,
												newItem = fm[find](dirhash),
												acts    = {
													'directory' : { cmd: 'open', msg: 'cmdopendir' },
													'text'      : { cmd: 'edit', msg: 'cmdedit' },
													'default'   : { cmd: 'open', msg: 'cmdopen' }
												},
												tmpMimes;
											if (sel && move) {
												fm.one(req+'done', function() {
													fm.exec('paste', dirhash);
												});
											}
											if (!move) {
												if (fm.mimeIsText(item.mime) && !fm.mimesCanMakeEmpty[item.mime] && fm.mimeTypes[item.mime]) {
													fm.trigger('canMakeEmptyFile', {mimes: [item.mime], unshift: true});
													tmpMimes = {};
													tmpMimes[item.mime] = fm.mimeTypes[item.mime];
													fm.storage('mkfileTextMimes', Object.assign(tmpMimes, fm.storage('mkfileTextMimes') || {}));
												}
												Object.assign(nextAct, nextAction || acts[item.mime] || acts[item.mime.split('/')[0]] || acts[(fm.mimesCanMakeEmpty[item.mime] || jQuery.inArray(item.mime, fm.resources.mimes.text) !== -1) ? 'text' : 'none'] || acts['default']);
												Object.assign(toast, nextAct.cmd ? {
													incwd    : {msg: fm.i18n(['complete', fm.i18n('cmd'+cmd)]), action: nextAct},
													inbuffer : {msg: fm.i18n(['complete', fm.i18n('cmd'+cmd)]), action: nextAct}
												} : {
													inbuffer : {msg: fm.i18n(['complete', fm.i18n('cmd'+cmd)])}
												});
											}
										}
										dfrd.resolve(data);
									});
							})
							.fail(function() {
								dfrd.reject();
							});
						}
					})
					.on('dragenter dragleave dragover drop', function(e) {
						// stop bubbling to prevent upload with native drop event
						e.stopPropagation();
					}),
				select = function() {
					var name = fm.splitFileExtention(input.val())[0];
					if (!inError && fm.UA.Mobile && !fm.UA.iOS) { // since iOS has a bug? (z-index not effect) so disable it
						overlay.on('click close', cancel).elfinderoverlay('show');
						pnode.css('z-index', overlay.css('z-index') + 1);
					}
					inError = false;
					! fm.enabled() && fm.enable();
					input.trigger('focus').trigger('select');
					input[0].setSelectionRange && input[0].setSelectionRange(0, name.length);
				},
				resize = function() {
					node.trigger('scrolltoview', {blink : false});
				},
				openCallback = function() {
					dfrd && (dfrd.state() === 'pending') && dfrd.reject();
				},
				inError = false,
				nextAction,
				// for tree
				dst, dstCls, collapsed, expanded, arrow, subtree;

			if (!fm.isCommandEnabled(req, phash) || !node.length) {
				return dfrd.reject();
			}

			if (jQuery.isPlainObject(self.nextAction)){
				nextAction = Object.assign({}, self.nextAction);
			}
			
			if (tree) {
				dst = fm[find](phash);
				collapsed = fm.res('class', 'navcollapse');
				expanded  = fm.res('class', 'navexpand');
				arrow = fm.res('class', 'navarrow');
				subtree = fm.res('class', 'navsubtree');
				
				node.closest('.'+subtree).show();
				if (! dst.hasClass(collapsed)) {
					dstCls = dst.attr('class');
					dst.addClass(collapsed+' '+expanded+' elfinder-subtree-loaded');
				}
				if (dst.is('.'+collapsed+':not(.'+expanded+')')) {
					dst.children('.'+arrow).trigger('click').data('dfrd').done(function() {
						if (input.val() === file.name) {
							input.val(fm.uniqueName(self.prefix, phash)).trigger('select').trigger('focus');
						}
					});
				}
				nnode = node.contents().filter(function(){ return this.nodeType==3 && jQuery(this).parent().attr('id') === fm.navHash2Id(file.hash); });
				pnode = nnode.parent();
				nnode.replaceWith(input.val(file.name));
			} else {
				empty && wz.removeClass('elfinder-cwd-wrapper-empty');
				nnode = node.find('.elfinder-cwd-filename');
				pnode = nnode.parent();
				if (tarea) {
					nnode.css('max-height', 'none');
				} else {
					colwidth = pnode.width();
					pnode.width(colwidth - 15)
						.parent('td').css('overflow', 'visible');
				}
				nnode.empty().append(input.val(file.name));
			}
			pnode.addClass('ui-front')
				.css('position', 'relative')
				.on('unselect.'+fm.namespace, unselect);
			
			fm.bind('resize', resize).one('open', openCallback);
			
			input.trigger('keyup');
			select();

			return dfrd;

		}
	},
	blink: function(elm, mode) {
		"use strict";
		var acts = {
			slowonce : function(){elm.hide().delay(250).fadeIn(750).delay(500).fadeOut(3500);},
			lookme   : function(){elm.show().fadeOut(500).fadeIn(750);}
		}, func;
		mode = mode || 'slowonce';
		
		func = acts[mode] || acts['lookme'];
		
		elm.stop(true, true);
		func();
	}
};
js/elFinder.mimetypes.js000064400000065712151215013410011265 0ustar00elFinder.prototype.mimeTypes = {"application\/x-executable":"exe","application\/x-jar":"jar","application\/x-gzip":"gz","application\/x-bzip2":"tbz","application\/x-rar":"rar","text\/x-php":"php","text\/javascript":"js","application\/rtfd":"rtfd","text\/x-python":"py","text\/x-ruby":"rb","text\/x-shellscript":"sh","text\/x-perl":"pl","text\/xml":"xml","text\/x-csrc":"c","text\/x-chdr":"h","text\/x-c++src":"cpp","text\/x-c++hdr":"hh","text\/x-markdown":"md","text\/x-yaml":"yml","image\/x-ms-bmp":"bmp","image\/x-targa":"tga","image\/xbm":"xbm","image\/pxm":"pxm","audio\/wav":"wav","video\/x-dv":"dv","video\/x-ms-wmv":"wm","video\/ogg":"ogm","video\/MP2T":"m2ts","application\/x-mpegURL":"m3u8","application\/dash+xml":"mpd","application\/andrew-inset":"ez","application\/applixware":"aw","application\/atom+xml":"atom","application\/atomcat+xml":"atomcat","application\/atomsvc+xml":"atomsvc","application\/ccxml+xml":"ccxml","application\/cdmi-capability":"cdmia","application\/cdmi-container":"cdmic","application\/cdmi-domain":"cdmid","application\/cdmi-object":"cdmio","application\/cdmi-queue":"cdmiq","application\/cu-seeme":"cu","application\/davmount+xml":"davmount","application\/docbook+xml":"dbk","application\/dssc+der":"dssc","application\/dssc+xml":"xdssc","application\/ecmascript":"ecma","application\/emma+xml":"emma","application\/epub+zip":"epub","application\/exi":"exi","application\/font-tdpfr":"pfr","application\/gml+xml":"gml","application\/gpx+xml":"gpx","application\/gxf":"gxf","application\/hyperstudio":"stk","application\/inkml+xml":"ink","application\/ipfix":"ipfix","application\/java-serialized-object":"ser","application\/java-vm":"class","application\/json":"json","application\/jsonml+json":"jsonml","application\/lost+xml":"lostxml","application\/mac-binhex40":"hqx","application\/mac-compactpro":"cpt","application\/mads+xml":"mads","application\/marc":"mrc","application\/marcxml+xml":"mrcx","application\/mathematica":"ma","application\/mathml+xml":"mathml","application\/mbox":"mbox","application\/mediaservercontrol+xml":"mscml","application\/metalink+xml":"metalink","application\/metalink4+xml":"meta4","application\/mets+xml":"mets","application\/mods+xml":"mods","application\/mp21":"m21","application\/mp4":"mp4s","application\/msword":"doc","application\/mxf":"mxf","application\/octet-stream":"bin","application\/oda":"oda","application\/oebps-package+xml":"opf","application\/ogg":"ogx","application\/omdoc+xml":"omdoc","application\/onenote":"onetoc","application\/oxps":"oxps","application\/patch-ops-error+xml":"xer","application\/pdf":"pdf","application\/pgp-encrypted":"pgp","application\/pgp-signature":"asc","application\/pics-rules":"prf","application\/pkcs10":"p10","application\/pkcs7-mime":"p7m","application\/pkcs7-signature":"p7s","application\/pkcs8":"p8","application\/pkix-attr-cert":"ac","application\/pkix-cert":"cer","application\/pkix-crl":"crl","application\/pkix-pkipath":"pkipath","application\/pkixcmp":"pki","application\/pls+xml":"pls","application\/postscript":"ai","application\/prs.cww":"cww","application\/pskc+xml":"pskcxml","application\/rdf+xml":"rdf","application\/reginfo+xml":"rif","application\/relax-ng-compact-syntax":"rnc","application\/resource-lists+xml":"rl","application\/resource-lists-diff+xml":"rld","application\/rls-services+xml":"rs","application\/rpki-ghostbusters":"gbr","application\/rpki-manifest":"mft","application\/rpki-roa":"roa","application\/rsd+xml":"rsd","application\/rss+xml":"rss","application\/rtf":"rtf","application\/sbml+xml":"sbml","application\/scvp-cv-request":"scq","application\/scvp-cv-response":"scs","application\/scvp-vp-request":"spq","application\/scvp-vp-response":"spp","application\/sdp":"sdp","application\/set-payment-initiation":"setpay","application\/set-registration-initiation":"setreg","application\/shf+xml":"shf","application\/smil+xml":"smi","application\/sparql-query":"rq","application\/sparql-results+xml":"srx","application\/srgs":"gram","application\/srgs+xml":"grxml","application\/sru+xml":"sru","application\/ssdl+xml":"ssdl","application\/ssml+xml":"ssml","application\/tei+xml":"tei","application\/thraud+xml":"tfi","application\/timestamped-data":"tsd","application\/vnd.3gpp.pic-bw-large":"plb","application\/vnd.3gpp.pic-bw-small":"psb","application\/vnd.3gpp.pic-bw-var":"pvb","application\/vnd.3gpp2.tcap":"tcap","application\/vnd.3m.post-it-notes":"pwn","application\/vnd.accpac.simply.aso":"aso","application\/vnd.accpac.simply.imp":"imp","application\/vnd.acucobol":"acu","application\/vnd.acucorp":"atc","application\/vnd.adobe.air-application-installer-package+zip":"air","application\/vnd.adobe.formscentral.fcdt":"fcdt","application\/vnd.adobe.fxp":"fxp","application\/vnd.adobe.xdp+xml":"xdp","application\/vnd.adobe.xfdf":"xfdf","application\/vnd.ahead.space":"ahead","application\/vnd.airzip.filesecure.azf":"azf","application\/vnd.airzip.filesecure.azs":"azs","application\/vnd.amazon.ebook":"azw","application\/vnd.americandynamics.acc":"acc","application\/vnd.amiga.ami":"ami","application\/vnd.android.package-archive":"apk","application\/vnd.anser-web-certificate-issue-initiation":"cii","application\/vnd.anser-web-funds-transfer-initiation":"fti","application\/vnd.antix.game-component":"atx","application\/vnd.apple.installer+xml":"mpkg","application\/vnd.aristanetworks.swi":"swi","application\/vnd.astraea-software.iota":"iota","application\/vnd.audiograph":"aep","application\/vnd.blueice.multipass":"mpm","application\/vnd.bmi":"bmi","application\/vnd.businessobjects":"rep","application\/vnd.chemdraw+xml":"cdxml","application\/vnd.chipnuts.karaoke-mmd":"mmd","application\/vnd.cinderella":"cdy","application\/vnd.claymore":"cla","application\/vnd.cloanto.rp9":"rp9","application\/vnd.clonk.c4group":"c4g","application\/vnd.cluetrust.cartomobile-config":"c11amc","application\/vnd.cluetrust.cartomobile-config-pkg":"c11amz","application\/vnd.commonspace":"csp","application\/vnd.contact.cmsg":"cdbcmsg","application\/vnd.cosmocaller":"cmc","application\/vnd.crick.clicker":"clkx","application\/vnd.crick.clicker.keyboard":"clkk","application\/vnd.crick.clicker.palette":"clkp","application\/vnd.crick.clicker.template":"clkt","application\/vnd.crick.clicker.wordbank":"clkw","application\/vnd.criticaltools.wbs+xml":"wbs","application\/vnd.ctc-posml":"pml","application\/vnd.cups-ppd":"ppd","application\/vnd.curl.car":"car","application\/vnd.curl.pcurl":"pcurl","application\/vnd.dart":"dart","application\/vnd.data-vision.rdz":"rdz","application\/vnd.dece.data":"uvf","application\/vnd.dece.ttml+xml":"uvt","application\/vnd.dece.unspecified":"uvx","application\/vnd.dece.zip":"uvz","application\/vnd.denovo.fcselayout-link":"fe_launch","application\/vnd.dna":"dna","application\/vnd.dolby.mlp":"mlp","application\/vnd.dpgraph":"dpg","application\/vnd.dreamfactory":"dfac","application\/vnd.ds-keypoint":"kpxx","application\/vnd.dvb.ait":"ait","application\/vnd.dvb.service":"svc","application\/vnd.dynageo":"geo","application\/vnd.ecowin.chart":"mag","application\/vnd.enliven":"nml","application\/vnd.epson.esf":"esf","application\/vnd.epson.msf":"msf","application\/vnd.epson.quickanime":"qam","application\/vnd.epson.salt":"slt","application\/vnd.epson.ssf":"ssf","application\/vnd.eszigno3+xml":"es3","application\/vnd.ezpix-album":"ez2","application\/vnd.ezpix-package":"ez3","application\/vnd.fdf":"fdf","application\/vnd.fdsn.mseed":"mseed","application\/vnd.fdsn.seed":"seed","application\/vnd.flographit":"gph","application\/vnd.fluxtime.clip":"ftc","application\/vnd.framemaker":"fm","application\/vnd.frogans.fnc":"fnc","application\/vnd.frogans.ltf":"ltf","application\/vnd.fsc.weblaunch":"fsc","application\/vnd.fujitsu.oasys":"oas","application\/vnd.fujitsu.oasys2":"oa2","application\/vnd.fujitsu.oasys3":"oa3","application\/vnd.fujitsu.oasysgp":"fg5","application\/vnd.fujitsu.oasysprs":"bh2","application\/vnd.fujixerox.ddd":"ddd","application\/vnd.fujixerox.docuworks":"xdw","application\/vnd.fujixerox.docuworks.binder":"xbd","application\/vnd.fuzzysheet":"fzs","application\/vnd.genomatix.tuxedo":"txd","application\/vnd.geogebra.file":"ggb","application\/vnd.geogebra.tool":"ggt","application\/vnd.geometry-explorer":"gex","application\/vnd.geonext":"gxt","application\/vnd.geoplan":"g2w","application\/vnd.geospace":"g3w","application\/vnd.gmx":"gmx","application\/vnd.google-earth.kml+xml":"kml","application\/vnd.google-earth.kmz":"kmz","application\/vnd.grafeq":"gqf","application\/vnd.groove-account":"gac","application\/vnd.groove-help":"ghf","application\/vnd.groove-identity-message":"gim","application\/vnd.groove-injector":"grv","application\/vnd.groove-tool-message":"gtm","application\/vnd.groove-tool-template":"tpl","application\/vnd.groove-vcard":"vcg","application\/vnd.hal+xml":"hal","application\/vnd.handheld-entertainment+xml":"zmm","application\/vnd.hbci":"hbci","application\/vnd.hhe.lesson-player":"les","application\/vnd.hp-hpgl":"hpgl","application\/vnd.hp-hpid":"hpid","application\/vnd.hp-hps":"hps","application\/vnd.hp-jlyt":"jlt","application\/vnd.hp-pcl":"pcl","application\/vnd.hp-pclxl":"pclxl","application\/vnd.hydrostatix.sof-data":"sfd-hdstx","application\/vnd.ibm.minipay":"mpy","application\/vnd.ibm.modcap":"afp","application\/vnd.ibm.rights-management":"irm","application\/vnd.ibm.secure-container":"sc","application\/vnd.iccprofile":"icc","application\/vnd.igloader":"igl","application\/vnd.immervision-ivp":"ivp","application\/vnd.immervision-ivu":"ivu","application\/vnd.insors.igm":"igm","application\/vnd.intercon.formnet":"xpw","application\/vnd.intergeo":"i2g","application\/vnd.intu.qbo":"qbo","application\/vnd.intu.qfx":"qfx","application\/vnd.ipunplugged.rcprofile":"rcprofile","application\/vnd.irepository.package+xml":"irp","application\/vnd.is-xpr":"xpr","application\/vnd.isac.fcs":"fcs","application\/vnd.jam":"jam","application\/vnd.jcp.javame.midlet-rms":"rms","application\/vnd.jisp":"jisp","application\/vnd.joost.joda-archive":"joda","application\/vnd.kahootz":"ktz","application\/vnd.kde.karbon":"karbon","application\/vnd.kde.kchart":"chrt","application\/vnd.kde.kformula":"kfo","application\/vnd.kde.kivio":"flw","application\/vnd.kde.kontour":"kon","application\/vnd.kde.kpresenter":"kpr","application\/vnd.kde.kspread":"ksp","application\/vnd.kde.kword":"kwd","application\/vnd.kenameaapp":"htke","application\/vnd.kidspiration":"kia","application\/vnd.kinar":"kne","application\/vnd.koan":"skp","application\/vnd.kodak-descriptor":"sse","application\/vnd.las.las+xml":"lasxml","application\/vnd.llamagraphics.life-balance.desktop":"lbd","application\/vnd.llamagraphics.life-balance.exchange+xml":"lbe","application\/vnd.lotus-1-2-3":123,"application\/vnd.lotus-approach":"apr","application\/vnd.lotus-freelance":"pre","application\/vnd.lotus-notes":"nsf","application\/vnd.lotus-organizer":"org","application\/vnd.lotus-screencam":"scm","application\/vnd.lotus-wordpro":"lwp","application\/vnd.macports.portpkg":"portpkg","application\/vnd.mcd":"mcd","application\/vnd.medcalcdata":"mc1","application\/vnd.mediastation.cdkey":"cdkey","application\/vnd.mfer":"mwf","application\/vnd.mfmp":"mfm","application\/vnd.micrografx.flo":"flo","application\/vnd.micrografx.igx":"igx","application\/vnd.mif":"mif","application\/vnd.mobius.daf":"daf","application\/vnd.mobius.dis":"dis","application\/vnd.mobius.mbk":"mbk","application\/vnd.mobius.mqy":"mqy","application\/vnd.mobius.msl":"msl","application\/vnd.mobius.plc":"plc","application\/vnd.mobius.txf":"txf","application\/vnd.mophun.application":"mpn","application\/vnd.mophun.certificate":"mpc","application\/vnd.mozilla.xul+xml":"xul","application\/vnd.ms-artgalry":"cil","application\/vnd.ms-cab-compressed":"cab","application\/vnd.ms-excel":"xls","application\/vnd.ms-excel.addin.macroenabled.12":"xlam","application\/vnd.ms-excel.sheet.binary.macroenabled.12":"xlsb","application\/vnd.ms-excel.sheet.macroenabled.12":"xlsm","application\/vnd.ms-excel.template.macroenabled.12":"xltm","application\/vnd.ms-fontobject":"eot","application\/vnd.ms-htmlhelp":"chm","application\/vnd.ms-ims":"ims","application\/vnd.ms-lrm":"lrm","application\/vnd.ms-officetheme":"thmx","application\/vnd.ms-pki.seccat":"cat","application\/vnd.ms-pki.stl":"stl","application\/vnd.ms-powerpoint":"ppt","application\/vnd.ms-powerpoint.addin.macroenabled.12":"ppam","application\/vnd.ms-powerpoint.presentation.macroenabled.12":"pptm","application\/vnd.ms-powerpoint.slide.macroenabled.12":"sldm","application\/vnd.ms-powerpoint.slideshow.macroenabled.12":"ppsm","application\/vnd.ms-powerpoint.template.macroenabled.12":"potm","application\/vnd.ms-project":"mpp","application\/vnd.ms-word.document.macroenabled.12":"docm","application\/vnd.ms-word.template.macroenabled.12":"dotm","application\/vnd.ms-works":"wps","application\/vnd.ms-wpl":"wpl","application\/vnd.ms-xpsdocument":"xps","application\/vnd.mseq":"mseq","application\/vnd.musician":"mus","application\/vnd.muvee.style":"msty","application\/vnd.mynfc":"taglet","application\/vnd.neurolanguage.nlu":"nlu","application\/vnd.nitf":"ntf","application\/vnd.noblenet-directory":"nnd","application\/vnd.noblenet-sealer":"nns","application\/vnd.noblenet-web":"nnw","application\/vnd.nokia.n-gage.data":"ngdat","application\/vnd.nokia.n-gage.symbian.install":"n-gage","application\/vnd.nokia.radio-preset":"rpst","application\/vnd.nokia.radio-presets":"rpss","application\/vnd.novadigm.edm":"edm","application\/vnd.novadigm.edx":"edx","application\/vnd.novadigm.ext":"ext","application\/vnd.oasis.opendocument.chart":"odc","application\/vnd.oasis.opendocument.chart-template":"otc","application\/vnd.oasis.opendocument.database":"odb","application\/vnd.oasis.opendocument.formula":"odf","application\/vnd.oasis.opendocument.formula-template":"odft","application\/vnd.oasis.opendocument.graphics":"odg","application\/vnd.oasis.opendocument.graphics-template":"otg","application\/vnd.oasis.opendocument.image":"odi","application\/vnd.oasis.opendocument.image-template":"oti","application\/vnd.oasis.opendocument.presentation":"odp","application\/vnd.oasis.opendocument.presentation-template":"otp","application\/vnd.oasis.opendocument.spreadsheet":"ods","application\/vnd.oasis.opendocument.spreadsheet-template":"ots","application\/vnd.oasis.opendocument.text":"odt","application\/vnd.oasis.opendocument.text-master":"odm","application\/vnd.oasis.opendocument.text-template":"ott","application\/vnd.oasis.opendocument.text-web":"oth","application\/vnd.olpc-sugar":"xo","application\/vnd.oma.dd2+xml":"dd2","application\/vnd.openofficeorg.extension":"oxt","application\/vnd.openxmlformats-officedocument.presentationml.presentation":"pptx","application\/vnd.openxmlformats-officedocument.presentationml.slide":"sldx","application\/vnd.openxmlformats-officedocument.presentationml.slideshow":"ppsx","application\/vnd.openxmlformats-officedocument.presentationml.template":"potx","application\/vnd.openxmlformats-officedocument.spreadsheetml.sheet":"xlsx","application\/vnd.openxmlformats-officedocument.spreadsheetml.template":"xltx","application\/vnd.openxmlformats-officedocument.wordprocessingml.document":"docx","application\/vnd.openxmlformats-officedocument.wordprocessingml.template":"dotx","application\/vnd.osgeo.mapguide.package":"mgp","application\/vnd.osgi.dp":"dp","application\/vnd.osgi.subsystem":"esa","application\/vnd.palm":"pdb","application\/vnd.pawaafile":"paw","application\/vnd.pg.format":"str","application\/vnd.pg.osasli":"ei6","application\/vnd.picsel":"efif","application\/vnd.pmi.widget":"wg","application\/vnd.pocketlearn":"plf","application\/vnd.powerbuilder6":"pbd","application\/vnd.previewsystems.box":"box","application\/vnd.proteus.magazine":"mgz","application\/vnd.publishare-delta-tree":"qps","application\/vnd.pvi.ptid1":"ptid","application\/vnd.quark.quarkxpress":"qxd","application\/vnd.realvnc.bed":"bed","application\/vnd.recordare.musicxml":"mxl","application\/vnd.recordare.musicxml+xml":"musicxml","application\/vnd.rig.cryptonote":"cryptonote","application\/vnd.rim.cod":"cod","application\/vnd.rn-realmedia":"rm","application\/vnd.rn-realmedia-vbr":"rmvb","application\/vnd.route66.link66+xml":"link66","application\/vnd.sailingtracker.track":"st","application\/vnd.seemail":"see","application\/vnd.sema":"sema","application\/vnd.semd":"semd","application\/vnd.semf":"semf","application\/vnd.shana.informed.formdata":"ifm","application\/vnd.shana.informed.formtemplate":"itp","application\/vnd.shana.informed.interchange":"iif","application\/vnd.shana.informed.package":"ipk","application\/vnd.simtech-mindmapper":"twd","application\/vnd.smaf":"mmf","application\/vnd.smart.teacher":"teacher","application\/vnd.solent.sdkm+xml":"sdkm","application\/vnd.spotfire.dxp":"dxp","application\/vnd.spotfire.sfs":"sfs","application\/vnd.stardivision.calc":"sdc","application\/vnd.stardivision.draw":"sda","application\/vnd.stardivision.impress":"sdd","application\/vnd.stardivision.math":"smf","application\/vnd.stardivision.writer":"sdw","application\/vnd.stardivision.writer-global":"sgl","application\/vnd.stepmania.package":"smzip","application\/vnd.stepmania.stepchart":"sm","application\/vnd.sun.xml.calc":"sxc","application\/vnd.sun.xml.calc.template":"stc","application\/vnd.sun.xml.draw":"sxd","application\/vnd.sun.xml.draw.template":"std","application\/vnd.sun.xml.impress":"sxi","application\/vnd.sun.xml.impress.template":"sti","application\/vnd.sun.xml.math":"sxm","application\/vnd.sun.xml.writer":"sxw","application\/vnd.sun.xml.writer.global":"sxg","application\/vnd.sun.xml.writer.template":"stw","application\/vnd.sus-calendar":"sus","application\/vnd.svd":"svd","application\/vnd.symbian.install":"sis","application\/vnd.syncml+xml":"xsm","application\/vnd.syncml.dm+wbxml":"bdm","application\/vnd.syncml.dm+xml":"xdm","application\/vnd.tao.intent-module-archive":"tao","application\/vnd.tcpdump.pcap":"pcap","application\/vnd.tmobile-livetv":"tmo","application\/vnd.trid.tpt":"tpt","application\/vnd.triscape.mxs":"mxs","application\/vnd.trueapp":"tra","application\/vnd.ufdl":"ufd","application\/vnd.uiq.theme":"utz","application\/vnd.umajin":"umj","application\/vnd.unity":"unityweb","application\/vnd.uoml+xml":"uoml","application\/vnd.vcx":"vcx","application\/vnd.visio":"vsd","application\/vnd.visionary":"vis","application\/vnd.vsf":"vsf","application\/vnd.wap.wbxml":"wbxml","application\/vnd.wap.wmlc":"wmlc","application\/vnd.wap.wmlscriptc":"wmlsc","application\/vnd.webturbo":"wtb","application\/vnd.wolfram.player":"nbp","application\/vnd.wordperfect":"wpd","application\/vnd.wqd":"wqd","application\/vnd.wt.stf":"stf","application\/vnd.xara":"xar","application\/vnd.xfdl":"xfdl","application\/vnd.yamaha.hv-dic":"hvd","application\/vnd.yamaha.hv-script":"hvs","application\/vnd.yamaha.hv-voice":"hvp","application\/vnd.yamaha.openscoreformat":"osf","application\/vnd.yamaha.openscoreformat.osfpvg+xml":"osfpvg","application\/vnd.yamaha.smaf-audio":"saf","application\/vnd.yamaha.smaf-phrase":"spf","application\/vnd.yellowriver-custom-menu":"cmp","application\/vnd.zul":"zir","application\/vnd.zzazz.deck+xml":"zaz","application\/voicexml+xml":"vxml","application\/widget":"wgt","application\/winhlp":"hlp","application\/wsdl+xml":"wsdl","application\/wspolicy+xml":"wspolicy","application\/x-7z-compressed":"7z","application\/x-abiword":"abw","application\/x-ace-compressed":"ace","application\/x-apple-diskimage":"dmg","application\/x-authorware-bin":"aab","application\/x-authorware-map":"aam","application\/x-authorware-seg":"aas","application\/x-bcpio":"bcpio","application\/x-bittorrent":"torrent","application\/x-blorb":"blb","application\/x-bzip":"bz","application\/x-cbr":"cbr","application\/x-cdlink":"vcd","application\/x-cfs-compressed":"cfs","application\/x-chat":"chat","application\/x-chess-pgn":"pgn","application\/x-conference":"nsc","application\/x-cpio":"cpio","application\/x-csh":"csh","application\/x-debian-package":"deb","application\/x-dgc-compressed":"dgc","application\/x-director":"dir","application\/x-doom":"wad","application\/x-dtbncx+xml":"ncx","application\/x-dtbook+xml":"dtb","application\/x-dtbresource+xml":"res","application\/x-dvi":"dvi","application\/x-envoy":"evy","application\/x-eva":"eva","application\/x-font-bdf":"bdf","application\/x-font-ghostscript":"gsf","application\/x-font-linux-psf":"psf","application\/x-font-pcf":"pcf","application\/x-font-snf":"snf","application\/x-font-type1":"pfa","application\/x-freearc":"arc","application\/x-futuresplash":"spl","application\/x-gca-compressed":"gca","application\/x-glulx":"ulx","application\/x-gnumeric":"gnumeric","application\/x-gramps-xml":"gramps","application\/x-gtar":"gtar","application\/x-hdf":"hdf","application\/x-install-instructions":"install","application\/x-iso9660-image":"iso","application\/x-java-jnlp-file":"jnlp","application\/x-latex":"latex","application\/x-lzh-compressed":"lzh","application\/x-mie":"mie","application\/x-mobipocket-ebook":"prc","application\/x-ms-application":"application","application\/x-ms-shortcut":"lnk","application\/x-ms-wmd":"wmd","application\/x-ms-wmz":"wmz","application\/x-ms-xbap":"xbap","application\/x-msaccess":"mdb","application\/x-msbinder":"obd","application\/x-mscardfile":"crd","application\/x-msclip":"clp","application\/x-msdownload":"dll","application\/x-msmediaview":"mvb","application\/x-msmetafile":"wmf","application\/x-msmoney":"mny","application\/x-mspublisher":"pub","application\/x-msschedule":"scd","application\/x-msterminal":"trm","application\/x-mswrite":"wri","application\/x-netcdf":"nc","application\/x-nzb":"nzb","application\/x-pkcs12":"p12","application\/x-pkcs7-certificates":"p7b","application\/x-pkcs7-certreqresp":"p7r","application\/x-research-info-systems":"ris","application\/x-shar":"shar","application\/x-shockwave-flash":"swf","application\/x-silverlight-app":"xap","application\/x-sql":"sql","application\/x-stuffit":"sit","application\/x-stuffitx":"sitx","application\/x-subrip":"srt","application\/x-sv4cpio":"sv4cpio","application\/x-sv4crc":"sv4crc","application\/x-t3vm-image":"t3","application\/x-tads":"gam","application\/x-tar":"tar","application\/x-tcl":"tcl","application\/x-tex":"tex","application\/x-tex-tfm":"tfm","application\/x-texinfo":"texinfo","application\/x-tgif":"obj","application\/x-ustar":"ustar","application\/x-wais-source":"src","application\/x-x509-ca-cert":"der","application\/x-xfig":"fig","application\/x-xliff+xml":"xlf","application\/x-xpinstall":"xpi","application\/x-xz":"xz","application\/x-zmachine":"z1","application\/xaml+xml":"xaml","application\/xcap-diff+xml":"xdf","application\/xenc+xml":"xenc","application\/xhtml+xml":"xhtml","application\/xml":"xsl","application\/xml-dtd":"dtd","application\/xop+xml":"xop","application\/xproc+xml":"xpl","application\/xslt+xml":"xslt","application\/xspf+xml":"xspf","application\/xv+xml":"mxml","application\/yang":"yang","application\/yin+xml":"yin","application\/zip":"zip","audio\/adpcm":"adp","audio\/basic":"au","audio\/midi":"mid","audio\/mp4":"m4a","audio\/mpeg":"mpga","audio\/ogg":"oga","audio\/s3m":"s3m","audio\/silk":"sil","audio\/vnd.dece.audio":"uva","audio\/vnd.digital-winds":"eol","audio\/vnd.dra":"dra","audio\/vnd.dts":"dts","audio\/vnd.dts.hd":"dtshd","audio\/vnd.lucent.voice":"lvp","audio\/vnd.ms-playready.media.pya":"pya","audio\/vnd.nuera.ecelp4800":"ecelp4800","audio\/vnd.nuera.ecelp7470":"ecelp7470","audio\/vnd.nuera.ecelp9600":"ecelp9600","audio\/vnd.rip":"rip","audio\/webm":"weba","audio\/x-aac":"aac","audio\/x-aiff":"aif","audio\/x-caf":"caf","audio\/x-flac":"flac","audio\/x-matroska":"mka","audio\/x-mpegurl":"m3u","audio\/x-ms-wax":"wax","audio\/x-ms-wma":"wma","audio\/x-pn-realaudio":"ram","audio\/x-pn-realaudio-plugin":"rmp","audio\/xm":"xm","chemical\/x-cdx":"cdx","chemical\/x-cif":"cif","chemical\/x-cmdf":"cmdf","chemical\/x-cml":"cml","chemical\/x-csml":"csml","chemical\/x-xyz":"xyz","font\/collection":"ttc","font\/otf":"otf","font\/ttf":"ttf","font\/woff":"woff","font\/woff2":"woff2","image\/cgm":"cgm","image\/g3fax":"g3","image\/gif":"gif","image\/ief":"ief","image\/jpeg":"jpeg","image\/ktx":"ktx","image\/png":"png","image\/prs.btif":"btif","image\/sgi":"sgi","image\/svg+xml":"svg","image\/tiff":"tiff","image\/vnd.adobe.photoshop":"psd","image\/vnd.dece.graphic":"uvi","image\/vnd.djvu":"djvu","image\/vnd.dvb.subtitle":"sub","image\/vnd.dwg":"dwg","image\/vnd.dxf":"dxf","image\/vnd.fastbidsheet":"fbs","image\/vnd.fpx":"fpx","image\/vnd.fst":"fst","image\/vnd.fujixerox.edmics-mmr":"mmr","image\/vnd.fujixerox.edmics-rlc":"rlc","image\/vnd.ms-modi":"mdi","image\/vnd.ms-photo":"wdp","image\/vnd.net-fpx":"npx","image\/vnd.wap.wbmp":"wbmp","image\/vnd.xiff":"xif","image\/webp":"webp","image\/x-3ds":"3ds","image\/x-cmu-raster":"ras","image\/x-cmx":"cmx","image\/x-freehand":"fh","image\/x-icon":"ico","image\/x-mrsid-image":"sid","image\/x-pcx":"pcx","image\/x-pict":"pic","image\/x-portable-anymap":"pnm","image\/x-portable-bitmap":"pbm","image\/x-portable-graymap":"pgm","image\/x-portable-pixmap":"ppm","image\/x-rgb":"rgb","image\/x-xpixmap":"xpm","image\/x-xwindowdump":"xwd","message\/rfc822":"eml","model\/iges":"igs","model\/mesh":"msh","model\/vnd.collada+xml":"dae","model\/vnd.dwf":"dwf","model\/vnd.gdl":"gdl","model\/vnd.gtw":"gtw","model\/vnd.vtu":"vtu","model\/vrml":"wrl","model\/x3d+binary":"x3db","model\/x3d+vrml":"x3dv","model\/x3d+xml":"x3d","text\/cache-manifest":"appcache","text\/calendar":"ics","text\/css":"css","text\/csv":"csv","text\/html":"html","text\/n3":"n3","text\/plain":"txt","text\/prs.lines.tag":"dsc","text\/richtext":"rtx","text\/sgml":"sgml","text\/tab-separated-values":"tsv","text\/troff":"t","text\/turtle":"ttl","text\/uri-list":"uri","text\/vcard":"vcard","text\/vnd.curl":"curl","text\/vnd.curl.dcurl":"dcurl","text\/vnd.curl.mcurl":"mcurl","text\/vnd.curl.scurl":"scurl","text\/vnd.fly":"fly","text\/vnd.fmi.flexstor":"flx","text\/vnd.graphviz":"gv","text\/vnd.in3d.3dml":"3dml","text\/vnd.in3d.spot":"spot","text\/vnd.sun.j2me.app-descriptor":"jad","text\/vnd.wap.wml":"wml","text\/vnd.wap.wmlscript":"wmls","text\/x-asm":"s","text\/x-c":"cc","text\/x-fortran":"f","text\/x-java-source":"java","text\/x-nfo":"nfo","text\/x-opml":"opml","text\/x-pascal":"p","text\/x-setext":"etx","text\/x-sfv":"sfv","text\/x-uuencode":"uu","text\/x-vcalendar":"vcs","text\/x-vcard":"vcf","video\/3gpp":"3gp","video\/3gpp2":"3g2","video\/h261":"h261","video\/h263":"h263","video\/h264":"h264","video\/jpeg":"jpgv","video\/jpm":"jpm","video\/mj2":"mj2","video\/mp4":"mp4","video\/mpeg":"mpeg","video\/quicktime":"qt","video\/vnd.dece.hd":"uvh","video\/vnd.dece.mobile":"uvm","video\/vnd.dece.pd":"uvp","video\/vnd.dece.sd":"uvs","video\/vnd.dece.video":"uvv","video\/vnd.dvb.file":"dvb","video\/vnd.fvt":"fvt","video\/vnd.mpegurl":"mxu","video\/vnd.ms-playready.media.pyv":"pyv","video\/vnd.uvvu.mp4":"uvu","video\/vnd.vivo":"viv","video\/webm":"webm","video\/x-f4v":"f4v","video\/x-fli":"fli","video\/x-flv":"flv","video\/x-m4v":"m4v","video\/x-matroska":"mkv","video\/x-mng":"mng","video\/x-ms-asf":"asf","video\/x-ms-vob":"vob","video\/x-ms-wmx":"wmx","video\/x-ms-wvx":"wvx","video\/x-msvideo":"avi","video\/x-sgi-movie":"movie","video\/x-smv":"smv","x-conference\/x-cooltalk":"ice","text\/x-sql":"sql","image\/x-pixlr-data":"pxd","image\/x-adobe-dng":"dng","image\/x-sketch":"sketch","image\/x-xcf":"xcf","audio\/amr":"amr","image\/vnd-ms.dds":"dds","application\/plt":"plt","application\/sat":"sat","application\/step":"step","text\/x-httpd-cgi":"cgi","text\/x-asap":"asp","text\/x-jsp":"jsp"};js/elFinder.version.js000064400000000133151215013410010720 0ustar00/**
 * Application version
 *
 * @type String
 **/
elFinder.prototype.version = '2.1.60';

js/elFinder.history.js000064400000004567151215013410010753 0ustar00/**
 * @class elFinder.history
 * Store visited folders
 * and provide "back" and "forward" methods
 *
 * @author Dmitry (dio) Levashov
 */
elFinder.prototype.history = function(fm) {
	"use strict";
	var self = this,
		/**
		 * Update history on "open" event?
		 *
		 * @type Boolean
		 */
		update = true,
		/**
		 * Directories hashes storage
		 *
		 * @type Array
		 */
		history = [],
		/**
		 * Current directory index in history
		 *
		 * @type Number
		 */
		current,
		/**
		 * Clear history
		 *
		 * @return void
		 */
		reset = function() {
			history = [fm.cwd().hash];
			current = 0;
			update  = true;
		},
		/**
		 * Browser native history object
		 */
		nativeHistory = (fm.options.useBrowserHistory && window.history && window.history.pushState)? window.history : null,
		/**
		 * Open prev/next folder
		 *
		 * @Boolen  open next folder?
		 * @return jQuery.Deferred
		 */
		go = function(fwd) {
			if ((fwd && self.canForward()) || (!fwd && self.canBack())) {
				update = false;
				return fm.exec('open', history[fwd ? ++current : --current]).fail(reset);
			}
			return jQuery.Deferred().reject();
		},
		/**
		 * Sets the native history.
		 *
		 * @param String thash target hash
		 */
		setNativeHistory = function(thash) {
			if (nativeHistory && (! nativeHistory.state || nativeHistory.state.thash !== thash)) {
				nativeHistory.pushState({thash: thash}, null, location.pathname + location.search + (thash? '#elf_' + thash : ''));
			}
		};
	
	/**
	 * Return true if there is previous visited directories
	 *
	 * @return Boolen
	 */
	this.canBack = function() {
		return current > 0;
	};
	
	/**
	 * Return true if can go forward
	 *
	 * @return Boolen
	 */
	this.canForward = function() {
		return current < history.length - 1;
	};
	
	/**
	 * Go back
	 *
	 * @return void
	 */
	this.back = go;
	
	/**
	 * Go forward
	 *
	 * @return void
	 */
	this.forward = function() {
		return go(true);
	};
	
	// bind to elfinder events
	fm.bind('init', function() {
		if (nativeHistory && !nativeHistory.state) {
			setNativeHistory(fm.startDir());
		}
	})
	.open(function() {
		var l = history.length,
			cwd = fm.cwd().hash;

		if (update) {
			current >= 0 && l > current + 1 && history.splice(current+1);
			history[history.length-1] != cwd && history.push(cwd);
			current = history.length - 1;
		}
		update = true;

		setNativeHistory(cwd);
	})
	.reload(fm.options.reloadClearHistory && reset);
	
};
js/elFinder.options.js000064400000115725151215013410010744 0ustar00/**
 * Default elFinder config
 *
 * @type  Object
 * @autor Dmitry (dio) Levashov
 */
 elFinder.prototype._options = {
	/**
	 * URLs of 3rd party libraries CDN
	 * 
	 * @type Object
	 */
	cdns : {
		// for editor etc.
		ace        : 'https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.12',
		codemirror : 'https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.61.1',
		ckeditor   : 'https://cdnjs.cloudflare.com/ajax/libs/ckeditor/4.16.1',
		ckeditor5  : 'https://cdn.ckeditor.com/ckeditor5/28.0.0',
		tinymce    : 'https://cdnjs.cloudflare.com/ajax/libs/tinymce/5.7.1',
		simplemde  : 'https://cdnjs.cloudflare.com/ajax/libs/simplemde/1.11.2',
		fabric     : 'https://cdnjs.cloudflare.com/ajax/libs/fabric.js/4.2.0',
		fabric16   : 'https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.6.7',
		tui        : 'https://uicdn.toast.com',
		// for quicklook etc.
		hls        : 'https://cdnjs.cloudflare.com/ajax/libs/hls.js/1.0.2/hls.min.js',
		dash       : 'https://cdnjs.cloudflare.com/ajax/libs/dashjs/3.2.2/dash.all.min.js',
		flv        : 'https://cdnjs.cloudflare.com/ajax/libs/flv.js/1.5.0/flv.min.js',
		videojs    : 'https://cdnjs.cloudflare.com/ajax/libs/video.js/7.12.1',
		prettify   : 'https://cdn.jsdelivr.net/gh/google/code-prettify@f1c3473acd1e8ea8c8c1a60c56e89f5cdd06f915/loader/run_prettify.js',
		psd        : 'https://cdnjs.cloudflare.com/ajax/libs/psd.js/3.2.0/psd.min.js',
		rar        : 'https://cdn.jsdelivr.net/gh/nao-pon/rar.js@6cef13ec66dd67992fc7f3ea22f132d770ebaf8b/rar.min.js',
		zlibUnzip  : 'https://cdn.jsdelivr.net/gh/imaya/zlib.js@0.3.1/bin/unzip.min.js', // need check unzipFiles() in quicklook.plugins.js when update
		zlibGunzip : 'https://cdn.jsdelivr.net/gh/imaya/zlib.js@0.3.1/bin/gunzip.min.js',
		bzip2      : 'https://cdn.jsdelivr.net/gh/nao-pon/bzip2.js@0.8.0/bzip2.js',
		marked     : 'https://cdnjs.cloudflare.com/ajax/libs/marked/2.0.3/marked.min.js',
		sparkmd5   : 'https://cdnjs.cloudflare.com/ajax/libs/spark-md5/3.0.0/spark-md5.min.js',
		jssha      : 'https://cdnjs.cloudflare.com/ajax/libs/jsSHA/3.2.0/sha.min.js',
		amr        : 'https://cdn.jsdelivr.net/gh/yxl/opencore-amr-js@dcf3d2b5f384a1d9ded2a54e4c137a81747b222b/js/amrnb.js',
		tiff       : 'https://cdn.jsdelivr.net/gh/seikichi/tiff.js@545ede3ee46b5a5bc5f06d65954e775aa2a64017/tiff.min.js'
	},
	
	/**
	 * Connector url. Required!
	 *
	 * @type String
	 */
	url : '',

	/**
	 * Ajax request type.
	 *
	 * @type String
	 * @default "get"
	 */
	requestType : 'get',
	
	/**
	 * Use CORS to connector url
	 * 
	 * @type Boolean|null  true|false|null(Auto detect)
	 */
	cors : null,

	/**
	 * Array of header names to return parrot out in HTTP headers received from the server
	 * 
	 * @type Array
	 */
	parrotHeaders : [],

	/**
	 * Maximum number of concurrent connections on request
	 * 
	 * @type Number
	 * @default 3
	 */
	requestMaxConn : 3,

	/**
	 * Transport to send request to backend.
	 * Required for future extensions using websockets/webdav etc.
	 * Must be an object with "send" method.
	 * transport.send must return jQuery.Deferred() object
	 *
	 * @type Object
	 * @default null
	 * @example
	 *  transport : {
	 *    init : function(elfinderInstance) { },
	 *    send : function(options) {
	 *      var dfrd = jQuery.Deferred();
	 *      // connect to backend ...
	 *      return dfrd;
	 *    },
	 *    upload : function(data) {
	 *      var dfrd = jQuery.Deferred();
	 *      // upload ...
	 *      return dfrd;
	 *    }
	 *    
	 *  }
	 **/
	transport : {},

	/**
	 * URL to upload file to.
	 * If not set - connector URL will be used
	 *
	 * @type String
	 * @default  ''
	 */
	urlUpload : '',

	/**
	 * Allow to drag and drop to upload files
	 *
	 * @type Boolean|String
	 * @default  'auto'
	 */
	dragUploadAllow : 'auto',
	
	/**
	 * Confirmation dialog displayed at the time of overwriting upload
	 * 
	 * @type Boolean
	 * @default true
	 */
	overwriteUploadConfirm : true,
	
	/**
	 * Max size of chunked data of file upload
	 * 
	 * @type Number
	 * @default  10485760(10MB)
	 */
	uploadMaxChunkSize : 10485760,
	
	/**
	 * Regular expression of file name to exclude when uploading folder
	 * 
	 * @type Object
	 * @default { win: /^(?:desktop\.ini|thumbs\.db)$/i, mac: /^\.ds_store$/i }
	 */
	folderUploadExclude : {
		win: /^(?:desktop\.ini|thumbs\.db)$/i,
		mac: /^\.ds_store$/i
	},
	
	/**
	 * Timeout for upload using iframe
	 *
	 * @type Number
	 * @default  0 - no timeout
	 */
	iframeTimeout : 0,
	
	/**
	 * Data to append to all requests and to upload files
	 *
	 * @type Object
	 * @default  {}
	 */
	customData : {},
	
	/**
	 * Event listeners to bind on elFinder init
	 *
	 * @type Object
	 * @default  {}
	 */
	handlers : {},

	/**
	 * Any custom headers to send across every ajax request
	 *
	 * @type Object
	 * @default {}
	 */
	customHeaders : {},

	/**
	 * Any custom xhrFields to send across every ajax request
	 *
	 * @type Object
	 * @default {}
	 */
	xhrFields : {},

	/**
	 * Interface language
	 *
	 * @type String
	 * @default "en"
	 */
	lang : 'en',

	/**
	 * Base URL of elfFinder library starting from Manager HTML
	 * Auto detect when empty value
	 * 
	 * @type String
	 * @default ""
	 */
	baseUrl : '',

	/**
	 * Base URL of i18n js files
	 * baseUrl + "js/i18n/" when empty value
	 * 
	 * @type String
	 * @default ""
	 */
	i18nBaseUrl : '',

	/**
	 * Base URL of worker js files
	 * baseUrl + "js/worker/" when empty value
	 * 
	 * @type String
	 * @default ""
	 */
	 workerBaseUrl : '',
	
	/**
	 * Auto load required CSS
	 * `false` to disable this function or
	 * CSS URL Array to load additional CSS files
	 * 
	 * @type Boolean|Array
	 * @default true
	 */
	cssAutoLoad : true,

	/**
	 * Theme to load
	 * {"themeid" : "Theme CSS URL"} or
	 * {"themeid" : "Theme manifesto.json URL"} or
	 * Theme manifesto.json Object
	 * {
	 *   "themeid" : {
	 *     "name":"Theme Name",
	 *     "cssurls":"Theme CSS URL",
	 *     "author":"Author Name",
	 *     "email":"Author Email",
	 *     "license":"License",
	 *     "link":"Web Site URL",
	 *     "image":"Screen Shot URL",
	 *     "description":"Description"
	 *   }
	 * }
	 * 
	 * @type Object
	 */
	themes : {},

	/**
	 * Theme id to initial theme
	 * 
	 * @type String|Null
	 */
	theme : null,

	/**
	 * Maximum value of error dialog open at the same time
	 * 
	 * @type Number
	 */
	maxErrorDialogs : 5,

	/**
	 * Additional css class for filemanager node.
	 *
	 * @type String
	 */
	cssClass : '',

	/**
	 * Active commands list. '*' means all of the commands that have been load.
	 * If some required commands will be missed here, elFinder will add its
	 *
	 * @type Array
	 */
	commands : ['*'],
	// Available commands list
	//commands : [
	//	'archive', 'back', 'chmod', 'colwidth', 'copy', 'cut', 'download', 'duplicate', 'edit', 'extract',
	//	'forward', 'fullscreen', 'getfile', 'help', 'home', 'info', 'mkdir', 'mkfile', 'netmount', 'netunmount',
	//	'open', 'opendir', 'paste', 'places', 'quicklook', 'reload', 'rename', 'resize', 'restore', 'rm',
	//	'search', 'sort', 'up', 'upload', 'view', 'zipdl'
	//],
	
	/**
	 * Commands options.
	 *
	 * @type Object
	 **/
	commandsOptions : {
		// // configure shortcuts of any command
		// // add `shortcuts` property into each command
		// any_command_name : {
		// 	shortcuts : [] // for disable this command's shortcuts
		// },
		// any_command_name : {
		// 	shortcuts : function(fm, shortcuts) {
		// 		// for add `CTRL + E` for this command action
		// 		shortcuts[0]['pattern'] += ' ctrl+e';
		// 		return shortcuts;
		// 	}
		// },
		// any_command_name : {
		// 	shortcuts : function(fm, shortcuts) {
		// 		// for full customize of this command's shortcuts
		// 		return [ { pattern: 'ctrl+e ctrl+down numpad_enter' + (fm.OS != 'mac' && ' enter') } ];
		// 	}
		// },
		// "getfile" command options.
		getfile : {
			onlyURL  : false,
			// allow to return multiple files info
			multiple : false,
			// allow to return filers info
			folders  : false,
			// action after callback (""/"close"/"destroy")
			oncomplete : '',
			// action when callback is fail (""/"close"/"destroy")
			onerror : '',
			// get path before callback call
			getPath    : true, 
			// get image sizes before callback call
			getImgSize : false
		},
		open : {
			// HTTP method that request to the connector when item URL is not valid URL.
			// If you set to "get" will be displayed request parameter in the browser's location field
			// so if you want to conceal its parameters should be given "post".
			// Nevertheless, please specify "get" if you want to enable the partial request by HTTP Range header.
			method : 'post',
			// Where to open into : 'window'(default), 'tab' or 'tabs'
			// 'tabs' opens in each tabs
			into   : 'window',
			// Default command list of action when select file
			// String value that is 'Command Name' or 'Command Name1/CommandName2...'
			selectAction : 'open'
		},
		opennew : {
			// URL of to open elFinder manager
			// Default '' : Origin URL
			url : '',
			// Use search query of origin URL
			useOriginQuery : true
		},
		// "upload" command options.
		upload : {
			// Open elFinder upload dialog: 'button' OR Open system OS upload dialog: 'uploadbutton'
			ui : 'button'
		},
		// "download" command options.
		download : {
			// max request to download files when zipdl disabled
			maxRequests : 10,
			// minimum count of files to use zipdl
			minFilesZipdl : 2
		},
		// "quicklook" command options.
		quicklook : {
			autoplay : true,
			width    : 450,
			height   : 300,
			// ControlsList of HTML5 audio/video preview
			// see https://googlechrome.github.io/samples/media/controlslist.html
			mediaControlsList : '', // e.g. 'nodownload nofullscreen noremoteplayback'
			// Show toolbar of PDF preview (with <embed> tag)
			pdfToolbar : true,
			// Maximum lines to preview at initial
			textInitialLines : 100,
			// Maximum lines to preview by prettify
			prettifyMaxLines : 300,
			// quicklook window must be contained in elFinder node on window open (true|false)
			contain : false,
			// preview window into NavDock (0 : undocked | 1 : docked(show) | 2 : docked(hide))
			docked   : 0,
			// Docked preview height ('auto' or Number of pixel) 'auto' is setted to the Navbar width
			dockHeight : 'auto',
			// media auto play when docked
			dockAutoplay : false,
			// Google Maps API key (Require Maps JavaScript API)
			googleMapsApiKey : '',
			// Google Maps API Options
			googleMapsOpts : {
				maps : {},
				kml : {
					suppressInfoWindows : false,
					preserveViewport : false
				}
			},
			// ViewerJS (https://viewerjs.org/) Options
			// To enable this you need to place ViewerJS on the same server as elFinder and specify that URL in `url`.
			viewerjs : {
				url: '', // Example '/ViewerJS/index.html'
				mimes: ['application/pdf', 'application/vnd.oasis.opendocument.text', 'application/vnd.oasis.opendocument.spreadsheet', 'application/vnd.oasis.opendocument.presentation'],
				pdfNative: true // Use Native PDF Viewer first
			},
			// MIME types to CAD-Files and 3D-Models online viewer on sharecad.org
			// Example ['image/vnd.dwg', 'image/vnd.dxf', 'model/vnd.dwf', 'application/vnd.hp-hpgl', 'application/plt', 'application/step', 'model/iges', 'application/vnd.ms-pki.stl', 'application/sat', 'image/cgm', 'application/x-msmetafile']
			sharecadMimes : [],
			// MIME types to use Google Docs online viewer
			// Example ['application/pdf', 'image/tiff', 'application/vnd.ms-office', 'application/msword', 'application/vnd.ms-word', 'application/vnd.ms-excel', 'application/vnd.ms-powerpoint', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'application/postscript', 'application/rtf']
			googleDocsMimes : [],
			// MIME types to use Microsoft Office Online viewer
			// Example ['application/msword', 'application/vnd.ms-word', 'application/vnd.ms-excel', 'application/vnd.ms-powerpoint', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'application/vnd.oasis.opendocument.text', 'application/vnd.oasis.opendocument.spreadsheet', 'application/vnd.oasis.opendocument.presentation']
			// These MIME types override "googleDocsMimes"
			officeOnlineMimes : [],
			// File size threshold when using the dim command for obtain the image size necessary to image preview
			getDimThreshold : '200K',
			// Max filesize to show filenames of the zip/tar/gzip/bzip file 
			unzipMaxSize : '50M',
			// MIME-Type regular expression that does not check empty files
			mimeRegexNotEmptyCheck : /^application\/vnd\.google-apps\./
		},
		// "edit" command options.
		edit : {
			// dialog width, integer(px) or integer+'%' (example: 650, '80%' ...)
			dialogWidth : void(0),
			// dialog height, integer(px) or integer+'%' (example: 650, '80%' ...)
			dialogHeight : void(0),
			// list of allowed mimetypes to edit of text files
			// if empty - any text files can be edited
			mimes : [],
			// MIME-types to unselected as default of "File types to enable with "New file"" in preferences
			mkfileHideMimes : [],
			// MIME-types of text file to make empty file
			makeTextMimes : ['text/plain', 'text/css', 'text/html'],
			// Use the editor stored in the browser
			// This value allowd overwrite with user preferences
			useStoredEditor : false,
			// Open the maximized editor window
			// This value allowd overwrite with user preferences
			editorMaximized : false,
			// edit files in wysisyg's
			editors : [
				// {
				// 	/**
				// 	 * editor info
				// 	 * @type  Object
				// 	 */
				// 	info : { name: 'Editor Name' },
				// 	/**
				// 	 * files mimetypes allowed to edit in current wysisyg
				// 	 * @type  Array
				// 	 */
				// 	mimes : ['text/html'], 
				// 	/**
				// 	 * HTML element for editing area (optional for text editor)
				// 	 * @type  String
				// 	 */
				// 	html : '<textarea></textarea>', 
				// 	/**
				// 	 * Initialize editing area node (optional for text editor)
				// 	 * 
				// 	 * @param  String  dialog DOM id
				// 	 * @param  Object  target file object
				// 	 * @param  String  target file content (text or Data URI Scheme(binary file))
				// 	 * @param  Object  elFinder instance
				// 	 * @type  Function
				// 	 */
				// 	init : function(id, file, content, fm) {
				// 		jQuery(this).attr('id', id + '-text').val(content);
				// 	},
				// 	/**
				// 	 * Get edited contents (optional for text editor)
				// 	 * @type  Function
				// 	 */
				// 	getContent : function() {
				// 		return jQuery(this).val();
				// 	},
				// 	/**
				// 	 * Called when "edit" dialog loaded.
				// 	 * Place to init wysisyg.
				// 	 * Can return wysisyg instance
				// 	 *
				// 	 * @param  DOMElement  textarea node
				// 	 * @return Object      editor instance|jQuery.Deferred(return instance on resolve())
				// 	 */
				// 	load : function(textarea) { },
				// 	/**
				// 	 * Called before "edit" dialog closed.
				// 	 * Place to destroy wysisyg instance.
				// 	 *
				// 	 * @param  DOMElement  textarea node
				// 	 * @param  Object      wysisyg instance (if was returned by "load" callback)
				// 	 * @return void
				// 	 */
				// 	close : function(textarea, instance) { },
				// 	/**
				// 	 * Called before file content send to backend.
				// 	 * Place to update textarea content if needed.
				// 	 *
				// 	 * @param  DOMElement  textarea node
				// 	 * @param  Object      wysisyg instance (if was returned by "load" callback)
				// 	 * @return void
				// 	 */
				// 	save : function(textarea, instance) {},
				// 	/**
				// 	 * Called after load() or save().
				// 	 * Set focus to wysisyg editor.
				// 	 *
				// 	 * @param  DOMElement  textarea node
				// 	 * @param  Object      wysisyg instance (if was returned by "load" callback)
				// 	 * @return void
				// 	 */
				// 	focus : function(textarea, instance) {}
				// 	/**
				// 	 * Called after dialog resized..
				// 	 *
				// 	 * @param  DOMElement  textarea node
				// 	 * @param  Object      wysisyg instance (if was returned by "load" callback)
				// 	 * @param  Object      resize event object
				// 	 * @param  Object      data object
				// 	 * @return void
				// 	 */
				// 	resize : function(textarea, instance, event, data) {}
				// 
				// }
			],
			// Character encodings of select box
			encodings : ['Big5', 'Big5-HKSCS', 'Cp437', 'Cp737', 'Cp775', 'Cp850', 'Cp852', 'Cp855', 'Cp857', 'Cp858', 
				'Cp862', 'Cp866', 'Cp874', 'EUC-CN', 'EUC-JP', 'EUC-KR', 'GB18030', 'ISO-2022-CN', 'ISO-2022-JP', 'ISO-2022-KR', 
				'ISO-8859-1', 'ISO-8859-2', 'ISO-8859-3', 'ISO-8859-4', 'ISO-8859-5', 'ISO-8859-6', 'ISO-8859-7', 
				'ISO-8859-8', 'ISO-8859-9', 'ISO-8859-13', 'ISO-8859-15', 'KOI8-R', 'KOI8-U', 'Shift-JIS', 
				'Windows-1250', 'Windows-1251', 'Windows-1252', 'Windows-1253', 'Windows-1254', 'Windows-1257'],
			// options for extra editors
			extraOptions : {
				// upload command options
				uploadOpts : {},
				// TUI Image Editor's options
				tuiImgEditOpts : {
					// Path prefix of icon-a.svg, icon-b.svg, icon-c.svg and icon-d.svg in the Theme. 
					// `iconsPath` MUST follow the same origin policy.
					iconsPath : void(0), // default is "./img/tui-"
					// Theme object
					theme : {}
				},
				// Pixo image editor constructor options - https://pixoeditor.com/
				// Require 'apikey' to enable it
				pixo: {
					apikey: ''
				},
				// Browsing manager URL for CKEditor, TinyMCE
				// Uses self location with the empty value or not defined.
				//managerUrl : 'elfinder.html'
				managerUrl : null,
				// CKEditor editor options
				ckeditor: {},
				// CKEditor 5 editor options
				ckeditor5: {
					// builds mode - 'classic', 'inline', 'balloon', 'balloon-block' or 'decoupled-document'
					mode: 'decoupled-document'
				},
				// TinyMCE editor options
				tinymce : {},
				// Setting for Online-Convert.com
				onlineConvert : {
					maxSize  : 100, // (MB) Max 100MB on free account
					showLink : true // It must be enabled with free account
				}
			}
		},
		fullscreen : {
			// fullscreen mode 'screen'(When the browser supports it) or 'window'
			mode: 'screen' // 'screen' or 'window'
		},
		search : {
			// Incremental search from the current view
			incsearch : {
				enable : true, // is enable true or false
				minlen : 1,    // minimum number of characters
				wait   : 500   // wait milliseconds
			},
			// Additional search types
			searchTypes : {
				// "SearchMime" is implemented in default
				SearchMime : {           // The key is search type that send to the connector
					name : 'btnMime',    // Button text to be processed in i18n()
					title : 'searchMime',// Button title to be processed in i18n()
					incsearch : 'mime'   // Incremental search target filed name of the file object
					// Or Callable function
					/* incsearch function example
					function(queryObject, cwdHashes, elFinderInstance) {
						var q = queryObject.val;
						var regex = queryObject.regex;
						var matchedHashes = jQuery.grep(cwdHashes, function(hash) {
							var file = elFinderInstance.file(hash);
							return (file && file.mime && file.mime.match(regex))? true : false;
						});
						return matchedHashes;
					}
					*/
				}
			}
		},
		// "info" command options.
		info : {
			// If the URL of the Directory is null,
			// it is assumed that the link destination is a URL to open the folder in elFinder
			nullUrlDirLinkSelf : true,
			// Information items to be hidden by default
			// These name are 'size', 'aliasfor', 'path', 'link', 'dim', 'modify', 'perms', 'locked', 'owner', 'group', 'perm' and your custom info items label
			hideItems : [],
			// Maximum file size (byte) to get file contents hash (md5, sha256 ...)
			showHashMaxsize : 104857600, // 100 MB
			// Array of hash algorisms to show on info dialog
			// These name are 'md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512', 'sha3-224', 'sha3-256', 'sha3-384', 'sha3-512', 'shake128' and 'shake256'
			showHashAlgorisms : ['md5', 'sha256'],
			// Options for fm.getContentsHashes()
			showHashOpts : {
				shake128len : 256,
				shake256len : 512
			},
			custom : {
				// /**
				//  * Example of custom info `desc`
				//  */
				// desc : {
				// 	/**
				// 	 * Lable (require)
				// 	 * It is filtered by the `fm.i18n()`
				// 	 * 
				// 	 * @type String
				// 	 */
				// 	label : 'Description',
				// 	
				// 	/**
				// 	 * Template (require)
				// 	 * `{id}` is replaced in dialog.id
				// 	 * 
				// 	 * @type String
				// 	 */
				// 	tpl : '<div class="elfinder-info-desc"><span class="elfinder-spinner"></span></div>',
				// 	
				// 	/**
				// 	 * Restricts to mimetypes (optional)
				// 	 * Exact match or category match
				// 	 * 
				// 	 * @type Array
				// 	 */
				// 	mimes : ['text', 'image/jpeg', 'directory'],
				// 	
				// 	/**
				// 	 * Restricts to file.hash (optional)
				// 	 * 
				// 	 * @ type Regex
				// 	 */
				// 	hashRegex : /^l\d+_/,
				// 
				// 	/**
				// 	 * Request that asks for the description and sets the field (optional)
				// 	 * 
				// 	 * @type Function
				// 	 */
				// 	action : function(file, fm, dialog) {
				// 		fm.request({
				// 		data : { cmd : 'desc', target: file.hash },
				// 			preventDefault: true,
				// 		})
				// 		.fail(function() {
				// 			dialog.find('div.elfinder-info-desc').html(fm.i18n('unknown'));
				// 		})
				// 		.done(function(data) {
				// 			dialog.find('div.elfinder-info-desc').html(data.desc);
				// 		});
				// 	}
				// }
			}
		},
		mkdir: {
			// Enable automatic switching function ["New Folder" / "Into New Folder"] of toolbar buttton
			intoNewFolderToolbtn: false
		},
		resize: {
			// defalt status of snap to 8px grid of the jpeg image ("enable" or "disable")
			grid8px : 'disable',
			// Preset size array [width, height]
			presetSize : [[320, 240], [400, 400], [640, 480], [800,600]],
			// File size (bytes) threshold when using the `dim` command for obtain the image size necessary to start editing
			getDimThreshold : 204800,
			// File size (bytes) to request to get substitute image (400px) with the `dim` command
			dimSubImgSize : 307200
		},
		rm: {
			// If trash is valid, items moves immediately to the trash holder without confirm.
			quickTrash : true,
			// Maximum wait seconds when checking the number of items to into the trash
			infoCheckWait : 10,
			// Maximum number of items that can be placed into the Trash at one time
			toTrashMaxItems : 1000
		},
		paste : {
			moveConfirm : false // Display confirmation dialog when moving items
		},
		help : {
			// Tabs to show
			view : ['about', 'shortcuts', 'help', 'integrations', 'debug'],
			// HTML source URL of the heip tab
			helpSource : ''
		},
		preference : {
			// dialog width
			width: 600,
			// dialog height
			height: 400,
			// tabs setting see preference.js : build()
			categories: null,
			// preference setting see preference.js : build()
			prefs: null,
			// language setting  see preference.js : build()
			langs: null,
			// Command list of action when select file
			// Array value are 'Command Name' or 'Command Name1/CommandName2...'
			selectActions : ['open', 'edit/download', 'resize/edit/download', 'download', 'quicklook']
		}
	},
	
	/**
	 * Disabled commands relationship
	 * 
	 * @type Object
	 */
	disabledCmdsRels : {
		'get'       : ['edit'],
		'rm'        : ['cut', 'empty'],
		'file&url=' : ['download', 'zipdl'] // file command and volume options url is empty
	},

	/**
	 * Callback for prepare boot up
	 * 
	 * - The this object in the function is an elFinder node
	 * - The first parameter is elFinder Instance
	 * - The second parameter is an object of other parameters
	 *   For now it can use `dfrdsBeforeBootup` Array
	 * 
	 * @type Function
	 * @default null
	 * @return void
	 */
	bootCallback : null,
	
	/**
	 * Callback for "getfile" commands.
	 * Required to use elFinder with WYSIWYG editors etc..
	 *
	 * @type Function
	 * @default null (command not active)
	 */
	getFileCallback : null,
	
	/**
	 * Default directory view. icons/list
	 *
	 * @type String
	 * @default "icons"
	 */
	defaultView : 'icons',
	
	/**
	 * Hash of default directory path to open
	 * 
	 * NOTE: This setting will be disabled if the target folder is specified in location.hash.
	 * 
	 * If you want to find the hash in Javascript
	 * can be obtained with the following code. (In the case of a standard hashing method)
	 * 
	 * var volumeId = 'l1_'; // volume id
	 * var path = 'path/to/target'; // without root path
	 * //var path = 'path\\to\\target'; // use \ on windows server
	 * var hash = volumeId + btoa(path).replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '.').replace(/\.+$/, '');
	 * 
	 * @type String
	 * @default ""
	 */
	startPathHash : '',

	/**
	 * Emit a sound when a file is deleted
	 * Sounds are in sounds/ folder
	 * 
	 * @type Boolean
	 * @default true
	 */
	sound : true,
	
	/**
	 * UI plugins to load.
	 * Current dir ui and dialogs loads always.
	 * Here set not required plugins as folders tree/toolbar/statusbar etc.
	 *
	 * @type Array
	 * @default ['toolbar', 'places', 'tree', 'path', 'stat']
	 * @full ['toolbar', 'places', 'tree', 'path', 'stat']
	 */
	ui : ['toolbar', 'tree', 'path', 'stat'],
	
	/**
	 * Some UI plugins options.
	 * @type Object
	 */
	uiOptions : {
		// toolbar configuration
		toolbar : [
			['home', 'back', 'forward', 'up', 'reload'],
			['netmount'],
			['mkdir', 'mkfile', 'upload'],
			['open', 'download', 'getfile'],
			['undo', 'redo'],
			['copy', 'cut', 'paste', 'rm', 'empty', 'hide'],
			['duplicate', 'rename', 'edit', 'resize', 'chmod'],
			['selectall', 'selectnone', 'selectinvert'],
			['quicklook', 'info'],
			['extract', 'archive'],
			['search'],
			['view', 'sort'],
			['fullscreen']
		],
		// toolbar extra options
		toolbarExtra : {
			// also displays the text label on the button (true / false / 'none')
			displayTextLabel: false,
			// Exclude `displayTextLabel` setting UA type
			labelExcludeUA: ['Mobile'],
			// auto hide on initial open
			autoHideUA: ['Mobile'],
			// Initial setting value of hide button in toolbar setting
			defaultHides: ['home', 'reload'],
			// show Preference button ('none', 'auto', 'always')
			// If you do not include 'preference' in the context menu you should specify 'auto' or 'always'
			showPreferenceButton: 'none',
			// show Preference button into contextmenu of the toolbar (true / false)
			preferenceInContextmenu: false
		},
		// directories tree options
		tree : {
			// set path info to attr title
			attrTitle : true,
			// expand current root on init
			openRootOnLoad : true,
			// expand current work directory on open
			openCwdOnOpen  : true,
			// auto loading current directory parents and do expand their node.
			syncTree : true,
			// Maximum number of display of each child trees
			// The tree of directories with children exceeding this number will be split
			subTreeMax : 100,
			// Numbar of max connctions of subdirs request
			subdirsMaxConn : 2,
			// Number of max simultaneous processing directory of subdirs
			subdirsAtOnce : 5,
			// Durations of each animations
			durations : {
				slideUpDown : 'fast',
				autoScroll : 'fast'
			}
			// ,
			// /**
			//  * Add CSS class name to navbar directories (optional)
			//  * see: https://github.com/Studio-42/elFinder/pull/1061,
			//  *      https://github.com/Studio-42/elFinder/issues/1231
			//  * 
			//  * @type Function
			//  */
			// getClass: function(dir) {
			// 	// e.g. This adds the directory's name (lowercase) with prefix as a CSS class
			// 	return 'elfinder-tree-' + dir.name.replace(/[ "]/g, '').toLowerCase();
			// }
		},
		// navbar options
		navbar : {
			minWidth : 150,
			maxWidth : 500,
			// auto hide on initial open
			autoHideUA: [] // e.g. ['Mobile']
		},
		navdock : {
			// disabled navdock ui
			disabled : false,
			// percentage of initial maximum height to work zone
			initMaxHeight : '50%',
			// percentage of maximum height to work zone by user resize action
			maxHeight : '90%'
		},
		cwd : {
			// display parent folder with ".." name :)
			oldSchool : false,
			
			// fm.UA types array to show item select checkboxes e.g. ['All'] or ['Mobile'] etc. default: ['Touch']
			showSelectCheckboxUA : ['Touch'],

			// Enable dragout by dragstart with Alt key or Shift key
			metakeyDragout : true,
			
			// file info columns displayed
			listView : {
				// name is always displayed, cols are ordered
				// e.g. ['perm', 'date', 'size', 'kind', 'owner', 'group', 'mode']
				// mode: 'mode'(by `fileModeStyle` setting), 'modestr'(rwxr-xr-x) , 'modeoct'(755), 'modeboth'(rwxr-xr-x (755))
				// 'owner', 'group' and 'mode', It's necessary set volume driver option "statOwner" to `true`
				// for custom, characters that can be used in the name is `a-z0-9_`
				columns : ['perm', 'date', 'size', 'kind'],
				// override this if you want custom columns name
				// example
				// columnsCustomName : {
				//		date : 'Last modification',
				// 		kind : 'Mime type'
				// }
				columnsCustomName : {},
				// fixed list header colmun
				fixedHeader : true
			},

			// icons view setting
			iconsView : {
				// default icon size (0-3 in default CSS (cwd.css - elfinder-cwd-size[number]))
				size: 0,
				// number of maximum size (3 in default CSS (cwd.css - elfinder-cwd-size[number]))
				// uses in preference.js
				sizeMax: 3,
				// Name of each size
				sizeNames: {
					0: 'viewSmall',
					1: 'viewMedium',
					2: 'viewLarge',
					3: 'viewExtraLarge' 
				}
			},

			// /**
			//  * Add CSS class name to cwd directories (optional)
			//  * see: https://github.com/Studio-42/elFinder/pull/1061,
			//  *      https://github.com/Studio-42/elFinder/issues/1231
			//  * 
			//  * @type Function
			//  */
			// ,
			// getClass: function(file) {
			// 	// e.g. This adds the directory's name (lowercase) with prefix as a CSS class
			// 	return 'elfinder-cwd-' + file.name.replace(/[ "]/g, '').toLowerCase();
			//}
			
			//,
			//// Template placeholders replacement rules for overwrite. see ui/cwd.js replacement
			//replacement : {
			//	tooltip : function(f, fm) {
			//		var list = fm.viewType == 'list', // current view type
			//			query = fm.searchStatus.state == 2, // is in search results
			//			title = fm.formatDate(f) + (f.size > 0 ? ' ('+fm.formatSize(f.size)+')' : ''),
			//			info  = '';
			//		if (query && f.path) {
			//			info = fm.escape(f.path.replace(/\/[^\/]*$/, ''));
			//		} else {
			//			info = f.tooltip? fm.escape(f.tooltip).replace(/\r/g, '&#13;') : '';
			//		}
			//		if (list) {
			//			info += (info? '&#13;' : '') + fm.escape(f.name);
			//		}
			//		return info? info + '&#13;' + title : title;
			//	}
			//}
		},
		path : {
			// Move to head of work zone without UI navbar
			toWorkzoneWithoutNavbar : true
		},
		dialog : {
			// Enable to auto focusing on mouse over in the target form element
			focusOnMouseOver : true
		},
		toast : {
			animate : {
				// to show
				showMethod: 'fadeIn', // fadeIn, slideDown, and show are built into jQuery
				showDuration: 300,    // milliseconds
				showEasing: 'swing',  // swing and linear are built into jQuery
				// timeout to hide
				timeOut: 3000,
				// to hide
				hideMethod: 'fadeOut',
				hideDuration: 1500,
				hideEasing: 'swing'
			}
		}
	},

	/**
	 * MIME regex of send HTTP header "Content-Disposition: inline" or allow preview in quicklook
	 * This option will overwrite by connector configuration
	 * 
	 * @type String
	 * @default '^(?:(?:image|video|audio)|text/plain|application/pdf$)'
	 * @example
	 *  dispInlineRegex : '.',  // is allow inline of all of MIME types
	 *  dispInlineRegex : '$^', // is not allow inline of all of MIME types
	 */
	dispInlineRegex : '^(?:(?:image|video|audio)|application/(?:x-mpegURL|dash\+xml)|(?:text/plain|application/pdf)$)',

	/**
	 * Display only required files by types
	 *
	 * @type Array
	 * @default []
	 * @example
	 *  onlyMimes : ["image"] - display all images
	 *  onlyMimes : ["image/png", "application/x-shockwave-flash"] - display png and flash
	 */
	onlyMimes : [],

	/**
	 * Custom files sort rules.
	 * All default rules (name/size/kind/date/perm/mode/owner/group) set in elFinder._sortRules
	 *
	 * @type {Object}
	 * @example
	 * sortRules : {
	 *   name : function(file1, file2) { return file1.name.toLowerCase().localeCompare(file2.name.toLowerCase()); }
	 * }
	 */
	sortRules : {},

	/**
	 * Default sort type.
	 *
	 * @type {String}
	 */
	sortType : 'name',
	
	/**
	 * Default sort order.
	 *
	 * @type {String}
	 * @default "asc"
	 */
	sortOrder : 'asc',
	
	/**
	 * Display folders first?
	 *
	 * @type {Boolean}
	 * @default true
	 */
	sortStickFolders : true,
	
	/**
	 * Sort also applies to the treeview (null: disable this feature)
	 *
	 * @type Boolean|null
	 * @default false
	 */
	sortAlsoTreeview : false,
	
	/**
	 * If true - elFinder will formating dates itself, 
	 * otherwise - backend date will be used.
	 *
	 * @type Boolean
	 */
	clientFormatDate : true,
	
	/**
	 * Show UTC dates.
	 * Required set clientFormatDate to true
	 *
	 * @type Boolean
	 */
	UTCDate : false,
	
	/**
	 * File modification datetime format.
	 * Value from selected language data  is used by default.
	 * Set format here to overwrite it.
	 *
	 * @type String
	 * @default  ""
	 */
	dateFormat : '',
	
	/**
	 * File modification datetime format in form "Yesterday 12:23:01".
	 * Value from selected language data is used by default.
	 * Set format here to overwrite it.
	 * Use $1 for "Today"/"Yesterday" placeholder
	 *
	 * @type String
	 * @default  ""
	 * @example "$1 H:m:i"
	 */
	fancyDateFormat : '',
	
	/**
	 * Style of file mode at cwd-list, info dialog
	 * 'string' (ex. rwxr-xr-x) or 'octal' (ex. 755) or 'both' (ex. rwxr-xr-x (755))
	 * 
	 * @type {String}
	 * @default 'both'
	 */
	fileModeStyle : 'both',
	
	/**
	 * elFinder width
	 *
	 * @type String|Number
	 * @default  "auto"
	 */
	width : 'auto',
	
	/**
	 * elFinder node height
	 * Number: pixcel or String: Number + "%"
	 *
	 * @type Number | String
	 * @default  400
	 */
	height : 400,
	
	/**
	 * Do not resize the elFinder node itself on resize parent node
	 * Specify `true` when controlling with CSS such as Flexbox
	 *
	 * @type Boolean
	 * @default false
	 */
	noResizeBySelf : false,

	/**
	 * Base node object or selector
	 * Element which is the reference of the height percentage
	 *
	 * @type Object|String
	 * @default null | jQuery(window) (if height is percentage)
	 **/
	heightBase : null,
	
	/**
	 * Make elFinder resizable if jquery ui resizable available
	 *
	 * @type Boolean
	 * @default  true
	 */
	resizable : true,
	
	/**
	 * Timeout before open notifications dialogs
	 *
	 * @type Number
	 * @default  500 (.5 sec)
	 */
	notifyDelay : 500,
	
	/**
	 * Position CSS, Width of notifications dialogs
	 *
	 * @type Object
	 * @default {position: {}, width : null} - Apply CSS definition
	 * position: CSS object | null (null: position center & middle)
	 */
	notifyDialog : {position : {}, width : null, canClose : false, hiddens : ['open']},
	
	/**
	 * Dialog contained in the elFinder node
	 * 
	 * @type Boolean
	 * @default false
	 */
	dialogContained : false,
	
	/**
	 * Allow shortcuts
	 *
	 * @type Boolean
	 * @default  true
	 */
	allowShortcuts : true,
	
	/**
	 * Remeber last opened dir to open it after reload or in next session
	 *
	 * @type Boolean
	 * @default  true
	 */
	rememberLastDir : true,
	
	/**
	 * Clear historys(elFinder) on reload(not browser) function
	 * Historys was cleared on Reload function on elFinder 2.0 (value is true)
	 * 
	 * @type Boolean
	 * @default  false
	 */
	reloadClearHistory : false,
	
	/**
	 * Use browser native history with supported browsers
	 *
	 * @type Boolean
	 * @default  true
	 */
	useBrowserHistory : true,
	
	/**
	 * Lazy load config.
	 * How many files display at once?
	 *
	 * @type Number
	 * @default  50
	 */
	showFiles : 50,
	
	/**
	 * Lazy load config.
	 * Distance in px to cwd bottom edge to start display files
	 *
	 * @type Number
	 * @default  50
	 */
	showThreshold : 50,
	
	/**
	 * Additional rule to valid new file name.
	 * By default not allowed empty names or '..'
	 * This setting does not have a sense of security.
	 *
	 * @type false|RegExp|function
	 * @default  false
	 * @example
	 *  disable names with spaces:
	 *  validName : /^[^\s]+$/,
	 */
	validName : false,
	
	/**
	 * Additional rule to filtering for browsing.
	 * This setting does not have a sense of security.
	 * 
	 * The object `this` is elFinder instance object in this function
	 *
	 * @type false|RegExp|function
	 * @default  false
	 * @example
	 *  show only png and jpg files:
	 *  fileFilter : /.*\.(png|jpg)$/i,
	 *  
	 *  show only image type files:
	 *  fileFilter : function(file) { return file.mime && file.mime.match(/^image\//i); },
	 */
	fileFilter : false,
	
	/**
	 * Backup name suffix.
	 *
	 * @type String
	 * @default  "~"
	 */
	backupSuffix : '~',
	
	/**
	 * Sync content interval
	 *
	 * @type Number
	 * @default  0 (do not sync)
	 */
	sync : 0,
	
	/**
	 * Sync start on load if sync value >= 1000
	 *
	 * @type     Bool
	 * @default  true
	 */
	syncStart : true,
	
	/**
	 * How many thumbnails create in one request
	 *
	 * @type Number
	 * @default  5
	 */
	loadTmbs : 5,
	
	/**
	 * Cookie option for browsersdoes not suppot localStorage
	 *
	 * @type Object
	 */
	cookie         : {
		expires  : 30,
		domain   : '',
		path     : '/',
		secure   : false,
		samesite : 'lax'
	},
	
	/**
	 * Contextmenu config
	 *
	 * @type Object
	 */
	contextmenu : {
		// navbarfolder menu
		navbar : ['open', 'opennew', 'download', '|', 'upload', 'mkdir', '|', 'copy', 'cut', 'paste', 'duplicate', '|', 'rm', 'empty', 'hide', '|', 'rename', '|', 'archive', '|', 'places', 'info', 'chmod', 'netunmount'],
		// current directory menu
		cwd    : ['undo', 'redo', '|', 'back', 'up', 'reload', '|', 'upload', 'mkdir', 'mkfile', 'paste', '|', 'empty', 'hide', '|', 'view', 'sort', 'selectall', 'colwidth', '|', 'places', 'info', 'chmod', 'netunmount', '|', 'fullscreen'],
		// current directory file menu
		files  : ['getfile', '|' ,'open', 'opennew', 'download', 'opendir', 'quicklook', '|', 'upload', 'mkdir', '|', 'copy', 'cut', 'paste', 'duplicate', '|', 'rm', 'empty', 'hide', '|', 'rename', 'edit', 'resize', '|', 'archive', 'extract', '|', 'selectall', 'selectinvert', '|', 'places', 'info', 'chmod', 'netunmount']
	},

	/**
	 * elFinder node enable always
	 * This value will set to `true` if <body> has elFinder node only
	 * 
	 * @type     Bool
	 * @default  false
	 */
	enableAlways : false,
	
	/**
	 * elFinder node enable by mouse over
	 * 
	 * @type     Bool
	 * @default  true
	 */
	enableByMouseOver : true,

	/**
	 * Show window close confirm dialog
	 * Value is which state to show
	 * 'hasNotifyDialog', 'editingFile', 'hasSelectedItem' and 'hasClipboardData'
	 * 
	 * @type     Array
	 * @default  ['hasNotifyDialog', 'editingFile']
	 */
	windowCloseConfirm : ['hasNotifyDialog', 'editingFile'],

	/**
	 * Function decoding 'raw' string converted to unicode
	 * It is used instead of fm.decodeRawString(str)
	 * 
	 * @type Null|Function
	 */
	rawStringDecoder : typeof Encoding === 'object' && jQuery.isFunction(Encoding.convert)? function(str) {
		return Encoding.convert(str, {
			to: 'UNICODE',
			type: 'string'
		});
	} : null,

	/**
	 * Debug config
	 *
	 * @type Array|String('auto')|Boolean(true|false)
	 */
	debug : ['error', 'warning', 'event-destroy'],

	/**
	 * Show toast messeges of backend warning (if found data `debug.backendErrors` in backend results)
	 *
	 * @type Boolean|Object (toast options)
	 */
	toastBackendWarn : true
};
files/.gitkeep000064400000000000151215013410007256 0ustar00files/.trash/.gitkeep000064400000000000151215013410010455 0ustar00wpfilemanager.php000064400000022775151215013410010104 0ustar00
<?php if (!defined('ABSPATH')) {
        exit;
    } 
     $current_user = wp_get_current_user(); 
     $wp_fm_lang = get_transient('wp_fm_lang');
     $wp_fm_theme = get_transient('wp_fm_theme');
     $opt = get_option('wp_file_manager_settings');
    ?>
    <script>
    var vle_nonce = "<?php echo wp_create_nonce('verify-filemanager-email');?>";
    </script>
    <div class="wrap wp-filemanager-wrap">
    <?php
    $this->load_custom_assets(); 
    $this->load_help_desk();
    ?>
        <div class="wp_fm_lang" style="float:left">
            <h3 class="fm_heading"><span class="fm_head_icon"><img src="<?php echo plugins_url('images/wp_file_manager.svg', dirname(__FILE__)); ?>"></span>
                <span class="fm_head_txt">
                    <?php _e('WP File Manager', 'wp-file-manager'); ?> </span> <a href="https://filemanagerpro.io/product/file-manager"
                    class="button button-primary fm_pro_btn" target="_blank" title="<?php _e('Click to Buy PRO', 'wp-file-manager'); ?>">
                    <?php _e('Buy PRO', 'wp-file-manager'); ?></a></h3>
        </div>

        <div class="wp_fm_lang" style="float:right">
            <h3 class="fm-topoption">

                <span class="switch_txt_theme"><?php _e('Change Theme Here:', 'wp-file-manager'); ?></span>

                <select name="theme" id="fm_theme">
                    <option value="default" <?php echo (isset($_GET['theme']) && sanitize_text_field(htmlentities($_GET['theme'])) == 'default') ? 'selected="selected"' : (($wp_fm_theme !== false) && $wp_fm_theme == 'default' ? 'selected="selected"' : ''); ?>>
                        <?php _e('Default', 'wp-file-manager'); ?>
                    </option>
                    <option value="dark" <?php echo (isset($_GET['theme']) && sanitize_text_field(htmlentities($_GET['theme'])) == 'dark') ?
                        'selected="selected"' : (($wp_fm_theme !== false) && $wp_fm_theme == 'dark' ? 'selected="selected"' : ''); ?>>
                        <?php _e('Dark', 'wp-file-manager'); ?>
                    </option>
                    <option value="light" <?php echo (isset($_GET['theme']) && sanitize_text_field(htmlentities($_GET['theme'])) == 'light') ?
                        'selected="selected"' : (($wp_fm_theme !== false) && $wp_fm_theme == 'light' ? 'selected="selected"' : ''); ?>>
                        <?php _e('Light', 'wp-file-manager'); ?>
                    </option>
                    <option value="gray" <?php echo (isset($_GET['theme']) && sanitize_text_field(htmlentities($_GET['theme'])) == 'gray') ?
                        'selected="selected"' : (($wp_fm_theme !== false) && $wp_fm_theme == 'gray' ? 'selected="selected"' : ''); ?>>
                        <?php _e('Gray', 'wp-file-manager'); ?>
                    </option>
                    <option value="windows - 10" <?php echo (isset($_GET['theme']) && sanitize_text_field(htmlentities($_GET['theme'])) == 'windows - 10') ?
                        'selected="selected"' : (($wp_fm_theme !== false) && $wp_fm_theme == 'windows - 10' ?
                        'selected="selected"' : ''); ?>>
                        <?php _e('Windows - 10', 'wp-file-manager'); ?>
                    </option>
                </select>
                <select name="lang" id="fm_lang">
                    <?php foreach ($this->fm_languages() as $name => $lang) {
                            ?>
                    <option value="<?php echo $lang; ?>" <?php echo (isset($_GET['lang']) && sanitize_text_field(htmlentities($_GET['lang'])) == $lang) ?
                        'selected="selected"' : (($wp_fm_lang !== false) && $wp_fm_lang == $lang ? 'selected="selected"' : ''); ?>>
                        <?php echo $name; ?>
                    </option>
                    <?php
                        }?>
                </select></h3>
        </div>
        <div style="clear:both"></div>
        <div id="wp_file_manager">
            <center><img src="<?php echo plugins_url('images/loading.gif', dirname(__FILE__)); ?>" class="wp_fm_loader" /></center>
        </div>

        <?php 
        if (false === get_option('filemanager_email_verified_'.$current_user->ID) && (false === (get_transient('filemanager_cancel_lk_popup_'.$current_user->ID)))) {
        ?>
        
        <div id="lokhal_verify_email_popup" class="lokhal_verify_email_popup">
            <div class="lokhal_verify_email_popup_overlay"></div>
            <div class="lokhal_verify_email_popup_tbl">
                <div class="lokhal_verify_email_popup_cel">
                    <div class="lokhal_verify_email_popup_content">
                        <a href="javascript:void(0)" class="lokhal_cancel"> <img src="<?php echo plugins_url('lib/img/fm_close_icon.png', dirname(__FILE__)); ?>"
                                class="wp_fm_loader" /></a>
                        <div class="popup_inner_lokhal">
                            <h3>
                                <?php _e('Welcome to File Manager', 'wp-file-manager'); ?>
                            </h3>
                            <p class="lokhal_desc">
                                <?php _e('We love making new friends! Subscribe below and we promise to
    keep you up-to-date with our latest new plugins, updates,
    awesome deals and a few special offers.', 'wp-file-manager'); ?>
                            </p>
                            <form>
                                <div class="form_grp">
                                    <div class="form_twocol">
                                        <input name="verify_lokhal_fname" id="verify_lokhal_fname" class="regular-text"
                                            type="text" value="<?php echo (null == get_option('verify_filemanager_fname_'.$current_user->ID)) ? $current_user->user_firstname : get_option('verify_filemanager_fname_'.$current_user->ID); ?>"
                                            placeholder="First Name" />
                                        <span id="fname_error" class="error_msg">
                                            <?php _e('Please Enter First Name.', 'wp-file-manager'); ?></span>
                                    </div>
                                    <div class="form_twocol">
                                        <input name="verify_lokhal_lname" id="verify_lokhal_lname" class="regular-text"
                                            type="text" value="<?php echo (null ==
            get_option('verify_filemanager_lname_'.$current_user->ID)) ? $current_user->user_lastname : get_option('verify_filemanager_lname_'.$current_user->ID); ?>"
                                            placeholder="Last Name" />
                                        <span id="lname_error" class="error_msg">
                                            <?php _e('Please Enter Last Name.', 'wp-file-manager'); ?></span>
                                    </div>
                                </div>
                                <div class="form_grp">
                                    <div class="form_onecol">
                                        <input name="verify_lokhal_email" id="verify_lokhal_email" class="regular-text"
                                            type="text" value="<?php echo (null == get_option('filemanager_email_address_'.$current_user->ID)) ? $current_user->user_email : get_option('filemanager_email_address_'.$current_user->ID); ?>"
                                            placeholder="Email Address" />
                                        <span id="email_error" class="error_msg">
                                            <?php _e('Please Enter Email Address.', 'wp-file-manager'); ?></span>
                                    </div>
                                </div>
                                <div class="btn_dv">
                                    <button class="verify verify_local_email button button-primary "><span class="btn-text"><?php _e('Verify', 'wp-file-manager'); ?>
                                        </span>
                                        <span class="btn-text-icon">
                                            <img src="<?php echo plugins_url('images/btn-arrow-icon.png', dirname(__FILE__)); ?>" />
                                        </span></button>
                                    <button class="lokhal_cancel button">
                                        <?php _e('No Thanks', 'wp-file-manager'); ?></button>
                                </div>
                            </form>
                        </div>
                        <div class="fm_bot_links">
                            <a href="http://ikon.digital/terms.html" target="_blank">
                                <?php _e('Terms of Service', 'wp-file-manager'); ?></a> <a href="http://ikon.digital/privacy.html"
                                target="_blank">
                                <?php _e('Privacy Policy', 'wp-file-manager'); ?></a>
                        </div>

                    </div>
                </div>
            </div>
        </div>

        <?php
   } ?>

    </div>

    <div class="fm_msg_popup">
        <div class="fm_msg_popup_tbl">
            <div class="fm_msg_popup_cell">
                <div class="fm_msg_popup_inner">
                    <div class="fm_msg_text">
                        <?php _e('Saving...', 'wp-file-manager'); ?>
                    </div>
                    <div class="fm_msg_btn_dv"><a href="javascript:void(0)" class="fm_close_msg button button-primary"><?php _e('OK', 'wp-file-manager'); ?></a></div>
                </div>
            </div>
        </div>
    </div>main.default.js000064400000014263151215013410007450 0ustar00/**
 * elFinder client options and main script for RequireJS
 *
 * Rename "main.default.js" to "main.js" and edit it if you need configure elFInder options or any things. And use that in elfinder.html.
 * e.g. `<script data-main="./main.js" src="./require.js"></script>`
 **/
(function(){
	"use strict";
	var // jQuery and jQueryUI version
		jqver = '3.3.1',
		uiver = '1.12.1',
		
		// Detect language (optional)
		lang = (function() {
			var locq = window.location.search,
				fullLang, locm, lang;
			if (locq && (locm = locq.match(/lang=([a-zA-Z_-]+)/))) {
				// detection by url query (?lang=xx)
				fullLang = locm[1];
			} else {
				// detection by browser language
				fullLang = (navigator.browserLanguage || navigator.language || navigator.userLanguage);
			}
			lang = fullLang.substr(0,2);
			if (lang === 'pt') lang = 'pt_BR';
			else if (lang === 'ug') lang = 'ug_CN';
			else if (lang === 'zh') lang = (fullLang.substr(0,5).toLowerCase() === 'zh-tw')? 'zh_TW' : 'zh_CN';
			return lang;
		})(),
		
		// Start elFinder (REQUIRED)
		start = function(elFinder, editors, config) {
			// load jQueryUI CSS
			elFinder.prototype.loadCss('//cdnjs.cloudflare.com/ajax/libs/jqueryui/'+uiver+'/themes/smoothness/jquery-ui.css');
			
			jQuery(function() {
				var optEditors = {
						commandsOptions: {
							edit: {
								editors: Array.isArray(editors)? editors : []
							}
						}
					},
					opts = {};
				
				// Interpretation of "elFinderConfig"
				if (config && config.managers) {
					jQuery.each(config.managers, function(id, mOpts) {
						opts = Object.assign(opts, config.defaultOpts || {});
						// editors marges to opts.commandOptions.edit
						try {
							mOpts.commandsOptions.edit.editors = mOpts.commandsOptions.edit.editors.concat(editors || []);
						} catch(e) {
							Object.assign(mOpts, optEditors);
						}
						// Make elFinder
						jQuery('#' + id).elfinder(
							// 1st Arg - options
							jQuery.extend(true, { lang: lang }, opts, mOpts || {}),
							// 2nd Arg - before boot up function
							function(fm, extraObj) {
								// `init` event callback function
								fm.bind('init', function() {
									// Optional for Japanese decoder "encoding-japanese"
									if (fm.lang === 'ja') {
										require(
											[ 'encoding-japanese' ],
											function(Encoding) {
												if (Encoding && Encoding.convert) {
													fm.registRawStringDecoder(function(s) {
														return Encoding.convert(s, {to:'UNICODE',type:'string'});
													});
												}
											}
										);
									}
								});
							}
						);
					});
				} else {
					alert('"elFinderConfig" object is wrong.');
				}
			});
		},
		
		// JavaScript loader (REQUIRED)
		load = function() {
			require(
				[
					'elfinder'
					, 'extras/editors.default.min'               // load text, image editors
					, 'elFinderConfig'
				//	, 'extras/quicklook.googledocs.min'          // optional preview for GoogleApps contents on the GoogleDrive volume
				],
				start,
				function(error) {
					alert(error.message);
				}
			);
		},
		
		// is IE8 or :? for determine the jQuery version to use (optional)
		old = (typeof window.addEventListener === 'undefined' && typeof document.getElementsByClassName === 'undefined')
		       ||
		      (!window.chrome && !document.unqueID && !window.opera && !window.sidebar && 'WebkitAppearance' in document.documentElement.style && document.body.style && typeof document.body.style.webkitFilter === 'undefined');

	// config of RequireJS (REQUIRED)
	require.config({
		baseUrl : 'js',
		paths : {
			'jquery'   : '//cdnjs.cloudflare.com/ajax/libs/jquery/'+(old? '1.12.4' : jqver)+'/jquery.min',
			'jquery-ui': '//cdnjs.cloudflare.com/ajax/libs/jqueryui/'+uiver+'/jquery-ui.min',
			'elfinder' : 'elfinder.min',
			'encoding-japanese': '//cdn.rawgit.com/polygonplanet/encoding.js/1.0.26/encoding.min'
		},
		waitSeconds : 10 // optional
	});

	// check elFinderConfig and fallback
	// This part don't used if you are using elfinder.html, see elfinder.html
	if (! require.defined('elFinderConfig')) {
		define('elFinderConfig', {
			// elFinder options (REQUIRED)
			// Documentation for client options:
			// https://github.com/Studio-42/elFinder/wiki/Client-configuration-options
			defaultOpts : {
				url : 'php/connector.minimal.php' // connector URL (REQUIRED)
				,commandsOptions : {
					edit : {
						extraOptions : {
							// set API key to enable Creative Cloud image editor
							// see https://console.adobe.io/
							creativeCloudApiKey : '',
							// browsing manager URL for CKEditor, TinyMCE
							// uses self location with the empty value
							managerUrl : ''
						}
					}
					,quicklook : {
						// to enable CAD-Files and 3D-Models preview with sharecad.org
						sharecadMimes : ['image/vnd.dwg', 'image/vnd.dxf', 'model/vnd.dwf', 'application/vnd.hp-hpgl', 'application/plt', 'application/step', 'model/iges', 'application/vnd.ms-pki.stl', 'application/sat', 'image/cgm', 'application/x-msmetafile'],
						// to enable preview with Google Docs Viewer
						googleDocsMimes : ['application/pdf', 'image/tiff', 'application/vnd.ms-office', 'application/msword', 'application/vnd.ms-word', 'application/vnd.ms-excel', 'application/vnd.ms-powerpoint', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'application/postscript', 'application/rtf'],
						// to enable preview with Microsoft Office Online Viewer
						// these MIME types override "googleDocsMimes"
						officeOnlineMimes : ['application/vnd.ms-office', 'application/msword', 'application/vnd.ms-word', 'application/vnd.ms-excel', 'application/vnd.ms-powerpoint', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'application/vnd.oasis.opendocument.text', 'application/vnd.oasis.opendocument.spreadsheet', 'application/vnd.oasis.opendocument.presentation']
					}
				}
			},
			managers : {
				'elfinder': {},
			}
		});
	}

	// load JavaScripts (REQUIRED)
	load();

})();
php/plugins/Sanitizer/plugin.php000064400000013415151215013410012770 0ustar00<?php

/**
 * elFinder Plugin Sanitizer
 * Sanitizer of file-name and file-path etc.
 * ex. binding, configure on connector options
 *    $opts = array(
 *        'bind' => array(
 *            'upload.pre mkdir.pre mkfile.pre rename.pre archive.pre ls.pre' => array(
 *                'Plugin.Sanitizer.cmdPreprocess'
 *            ),
 *            'upload.presave paste.copyfrom' => array(
 *                'Plugin.Sanitizer.onUpLoadPreSave'
 *            )
 *        ),
 *        // global configure (optional)
 *        'plugin' => array(
 *            'Sanitizer' => array(
 *                'enable' => true,
 *                'targets'  => array('\\','/',':','*','?','"','<','>','|'), // target chars
 *                'replace'  => '_', // replace to this
 *                'callBack' => null // Or @callable sanitize function
 *            )
 *        ),
 *        // each volume configure (optional)
 *        'roots' => array(
 *            array(
 *                'driver' => 'LocalFileSystem',
 *                'path'   => '/path/to/files/',
 *                'URL'    => 'http://localhost/to/files/'
 *                'plugin' => array(
 *                    'Sanitizer' => array(
 *                        'enable' => true,
 *                        'targets'  => array('\\','/',':','*','?','"','<','>','|'), // target chars
 *                        'replace'  => '_', // replace to this
 *                        'callBack' => null // Or @callable sanitize function
 *                    )
 *                )
 *            )
 *        )
 *    );
 *
 * @package elfinder
 * @author  Naoki Sawada
 * @license New BSD
 */
class elFinderPluginSanitizer extends elFinderPlugin
{
    private $replaced = array();
    private $keyMap = array(
        'ls' => 'intersect',
        'upload' => 'renames',
        'mkdir' => array('name', 'dirs')
    );

    public function __construct($opts)
    {
        $defaults = array(
            'enable' => true,  // For control by volume driver
            'targets' => array('\\', '/', ':', '*', '?', '"', '<', '>', '|'), // target chars
            'replace' => '_',   // replace to this
            'callBack' => null   // Or callable sanitize function
        );
        $this->opts = array_merge($defaults, $opts);
    }

    public function cmdPreprocess($cmd, &$args, $elfinder, $volume)
    {
        $opts = $this->getCurrentOpts($volume);
        if (!$opts['enable']) {
            return false;
        }
        $this->replaced[$cmd] = array();
        $key = (isset($this->keyMap[$cmd])) ? $this->keyMap[$cmd] : 'name';

        if (is_array($key)) {
            $keys = $key;
        } else {
            $keys = array($key);
        }
        foreach ($keys as $key) {
            if (isset($args[$key])) {
                if (is_array($args[$key])) {
                    foreach ($args[$key] as $i => $name) {
                        if ($cmd === 'mkdir' && $key === 'dirs') {
                            // $name need '/' as prefix see #2607
                            $name = '/' . ltrim($name, '/');
                            $_names = explode('/', $name);
                            $_res = array();
                            foreach ($_names as $_name) {
                                $_res[] = $this->sanitizeFileName($_name, $opts);
                            }
                            $this->replaced[$cmd][$name] = $args[$key][$i] = join('/', $_res);
                        } else {
                            $this->replaced[$cmd][$name] = $args[$key][$i] = $this->sanitizeFileName($name, $opts);
                        }
                    }
                } else if ($args[$key] !== '') {
                    $name = $args[$key];
                    $this->replaced[$cmd][$name] = $args[$key] = $this->sanitizeFileName($name, $opts);
                }
            }
        }
        if ($cmd === 'ls' || $cmd === 'mkdir') {
            if (!empty($this->replaced[$cmd])) {
                // un-regist for legacy settings
                $elfinder->unbind($cmd, array($this, 'cmdPostprocess'));
                $elfinder->bind($cmd, array($this, 'cmdPostprocess'));
            }
        }
        return true;
    }

    public function cmdPostprocess($cmd, &$result, $args, $elfinder, $volume)
    {
        if ($cmd === 'ls') {
            if (!empty($result['list']) && !empty($this->replaced['ls'])) {
                foreach ($result['list'] as $hash => $name) {
                    if ($keys = array_keys($this->replaced['ls'], $name)) {
                        if (count($keys) === 1) {
                            $result['list'][$hash] = $keys[0];
                        } else {
                            $result['list'][$hash] = $keys;
                        }
                    }
                }
            }
        } else if ($cmd === 'mkdir') {
            if (!empty($result['hashes']) && !empty($this->replaced['mkdir'])) {
                foreach ($result['hashes'] as $name => $hash) {
                    if ($keys = array_keys($this->replaced['mkdir'], $name)) {
                        $result['hashes'][$keys[0]] = $hash;
                    }
                }
            }
        }
    }

    // NOTE: $thash is directory hash so it unneed to process at here
    public function onUpLoadPreSave(&$thash, &$name, $src, $elfinder, $volume)
    {
        $opts = $this->getCurrentOpts($volume);
        if (!$opts['enable']) {
            return false;
        }
        $name = $this->sanitizeFileName($name, $opts);
        return true;
    }

    protected function sanitizeFileName($filename, $opts)
    {
        if (!empty($opts['callBack']) && is_callable($opts['callBack'])) {
            return call_user_func_array($opts['callBack'], array($filename, $opts));
        }
        return str_replace($opts['targets'], $opts['replace'], $filename);
    }
}
php/plugins/AutoResize/plugin.php000064400000015464151215013410013120 0ustar00<?php

/**
 * elFinder Plugin AutoResize
 * Auto resize on file upload.
 * ex. binding, configure on connector options
 *    $opts = array(
 *        'bind' => array(
 *            'upload.presave' => array(
 *                'Plugin.AutoResize.onUpLoadPreSave'
 *            )
 *        ),
 *        // global configure (optional)
 *        'plugin' => array(
 *            'AutoResize' => array(
 *                'enable'         => true,       // For control by volume driver
 *                'maxWidth'       => 1024,       // Path to Water mark image
 *                'maxHeight'      => 1024,       // Margin right pixel
 *                'quality'        => 95,         // JPEG image save quality
 *                'preserveExif'   => false,      // Preserve EXIF data (Imagick only)
 *                'forceEffect'    => false,      // For change quality or make progressive JPEG of small images
 *                'targetType'     => IMG_GIF|IMG_JPG|IMG_PNG|IMG_WBMP, // Target image formats ( bit-field )
 *                'offDropWith'    => null,       // Enabled by default. To disable it if it is dropped with pressing the meta key
 *                                                // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
 *                                                // In case of using any key, specify it as an array
 *                'onDropWith'     => null        // Disabled by default. To enable it if it is dropped with pressing the meta key
 *                                                // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
 *                                                // In case of using any key, specify it as an array
 *            )
 *        ),
 *        // each volume configure (optional)
 *        'roots' => array(
 *            array(
 *                'driver' => 'LocalFileSystem',
 *                'path'   => '/path/to/files/',
 *                'URL'    => 'http://localhost/to/files/'
 *                'plugin' => array(
 *                    'AutoResize' => array(
 *                        'enable'         => true,       // For control by volume driver
 *                        'maxWidth'       => 1024,       // Path to Water mark image
 *                        'maxHeight'      => 1024,       // Margin right pixel
 *                        'quality'        => 95,         // JPEG image save quality
 *                        'preserveExif'   => false,      // Preserve EXIF data (Imagick only)
 *                        'forceEffect'    => false,      // For change quality or make progressive JPEG of small images
 *                        'targetType'     => IMG_GIF|IMG_JPG|IMG_PNG|IMG_WBMP, // Target image formats ( bit-field )
 *                        'offDropWith'    => null,       // Enabled by default. To disable it if it is dropped with pressing the meta key
 *                                                        // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
 *                                                        // In case of using any key, specify it as an array
 *                        'onDropWith'     => null        // Disabled by default. To enable it if it is dropped with pressing the meta key
 *                                                        // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
 *                                                        // In case of using any key, specify it as an array
 *                    )
 *                )
 *            )
 *        )
 *    );
 *
 * @package elfinder
 * @author  Naoki Sawada
 * @license New BSD
 */
class elFinderPluginAutoResize extends elFinderPlugin
{

    public function __construct($opts)
    {
        $defaults = array(
            'enable' => true,       // For control by volume driver
            'maxWidth' => 1024,       // Path to Water mark image
            'maxHeight' => 1024,       // Margin right pixel
            'quality' => 95,         // JPEG image save quality
            'preserveExif' => false,      // Preserve EXIF data (Imagick only)
            'forceEffect' => false,      // For change quality or make progressive JPEG of small images
            'targetType' => IMG_GIF | IMG_JPG | IMG_PNG | IMG_WBMP, // Target image formats ( bit-field )
            'offDropWith' => null,       // To disable it if it is dropped with pressing the meta key
            // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
            // In case of using any key, specify it as an array
            'disableWithContentSaveId' => true // Disable on URL upload with post data "contentSaveId"
        );

        $this->opts = array_merge($defaults, $opts);

    }

    public function onUpLoadPreSave(&$thash, &$name, $src, $elfinder, $volume)
    {
        if (!$src) {
            return false;
        }

        $opts = $this->getCurrentOpts($volume);

        if (!$this->iaEnabled($opts, $elfinder)) {
            return false;
        }

        $imageType = null;
        $srcImgInfo = null;
        if (extension_loaded('fileinfo') && function_exists('mime_content_type')) {
            $mime = mime_content_type($src);
            if (substr($mime, 0, 5) !== 'image') {
                return false;
            }
        }
        if (extension_loaded('exif') && function_exists('exif_imagetype')) {
            $imageType = exif_imagetype($src);
            if ($imageType === false) {
                return false;
            }
        } else {
            $srcImgInfo = getimagesize($src);
            if ($srcImgInfo === false) {
                return false;
            }
            $imageType = $srcImgInfo[2];
        }

        // check target image type
        $imgTypes = array(
            IMAGETYPE_GIF => IMG_GIF,
            IMAGETYPE_JPEG => IMG_JPEG,
            IMAGETYPE_PNG => IMG_PNG,
            IMAGETYPE_BMP => IMG_WBMP,
            IMAGETYPE_WBMP => IMG_WBMP
        );
        if (!isset($imgTypes[$imageType]) || !($opts['targetType'] & $imgTypes[$imageType])) {
            return false;
        }

        if (!$srcImgInfo) {
            $srcImgInfo = getimagesize($src);
        }

        if ($opts['forceEffect'] || $srcImgInfo[0] > $opts['maxWidth'] || $srcImgInfo[1] > $opts['maxHeight']) {
            return $this->resize($volume, $src, $srcImgInfo, $opts['maxWidth'], $opts['maxHeight'], $opts['quality'], $opts['preserveExif']);
        }

        return false;
    }

    private function resize($volume, $src, $srcImgInfo, $maxWidth, $maxHeight, $jpgQuality, $preserveExif)
    {
        $zoom = min(($maxWidth / $srcImgInfo[0]), ($maxHeight / $srcImgInfo[1]));
        $width = round($srcImgInfo[0] * $zoom);
        $height = round($srcImgInfo[1] * $zoom);
        $unenlarge = true;
        $checkAnimated = true;

        return $volume->imageUtil('resize', $src, compact('width', 'height', 'jpgQuality', 'preserveExif', 'unenlarge', 'checkAnimated'));
    }
}
php/plugins/AutoRotate/plugin.php000064400000012752151215013410013112 0ustar00<?php

/**
 * elFinder Plugin AutoRotate
 * Auto rotation on file upload of JPEG file by EXIF Orientation.
 * ex. binding, configure on connector options
 *    $opts = array(
 *        'bind' => array(
 *            'upload.presave' => array(
 *                'Plugin.AutoRotate.onUpLoadPreSave'
 *            )
 *        ),
 *        // global configure (optional)
 *        'plugin' => array(
 *            'AutoRotate' => array(
 *                'enable'         => true,       // For control by volume driver
 *                'quality'        => 95,         // JPEG image save quality
 *                'offDropWith'    => null,       // Enabled by default. To disable it if it is dropped with pressing the meta key
 *                                                // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
 *                                                // In case of using any key, specify it as an array
 *                'onDropWith'     => null        // Disabled by default. To enable it if it is dropped with pressing the meta key
 *                                                // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
 *                                                // In case of using any key, specify it as an array
 *            )
 *        ),
 *        // each volume configure (optional)
 *        'roots' => array(
 *            array(
 *                'driver' => 'LocalFileSystem',
 *                'path'   => '/path/to/files/',
 *                'URL'    => 'http://localhost/to/files/'
 *                'plugin' => array(
 *                    'AutoRotate' => array(
 *                        'enable'         => true,       // For control by volume driver
 *                        'quality'        => 95,         // JPEG image save quality
 *                        'offDropWith'    => null,       // Enabled by default. To disable it if it is dropped with pressing the meta key
 *                                                        // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
 *                                                        // In case of using any key, specify it as an array
 *                        'onDropWith'     => null        // Disabled by default. To enable it if it is dropped with pressing the meta key
 *                                                        // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
 *                                                        // In case of using any key, specify it as an array
 *                    )
 *                )
 *            )
 *        )
 *    );
 *
 * @package elfinder
 * @author  Naoki Sawada
 * @license New BSD
 */
class elFinderPluginAutoRotate extends elFinderPlugin
{

    public function __construct($opts)
    {
        $defaults = array(
            'enable' => true,       // For control by volume driver
            'quality' => 95,         // JPEG image save quality
            'offDropWith' => null,       // To disable it if it is dropped with pressing the meta key
            // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
            // In case of using any key, specify it as an array
            'disableWithContentSaveId' => true // Disable on URL upload with post data "contentSaveId"
        );

        $this->opts = array_merge($defaults, $opts);

    }

    public function onUpLoadPreSave(&$thash, &$name, $src, $elfinder, $volume)
    {
        if (!$src) {
            return false;
        }

        $opts = $this->getCurrentOpts($volume);

        if (!$this->iaEnabled($opts, $elfinder)) {
            return false;
        }

        $imageType = null;
        $srcImgInfo = null;
        if (extension_loaded('fileinfo') && function_exists('mime_content_type')) {
            $mime = mime_content_type($src);
            if (substr($mime, 0, 5) !== 'image') {
                return false;
            }
        }
        if (extension_loaded('exif') && function_exists('exif_imagetype')) {
            $imageType = exif_imagetype($src);
            if ($imageType === false) {
                return false;
            }
        } else {
            $srcImgInfo = getimagesize($src);
            if ($srcImgInfo === false) {
                return false;
            }
            $imageType = $srcImgInfo[2];
        }

        // check target image type
        if ($imageType !== IMAGETYPE_JPEG) {
            return false;
        }

        if (!$srcImgInfo) {
            $srcImgInfo = getimagesize($src);
        }

        return $this->rotate($volume, $src, $srcImgInfo, $opts['quality']);
    }

    private function rotate($volume, $src, $srcImgInfo, $quality)
    {
        if (!function_exists('exif_read_data')) {
            return false;
        }
        $degree = 0;
        $errlev =error_reporting();
        error_reporting($errlev ^ E_WARNING);
        $exif = exif_read_data($src);
        error_reporting($errlev);
        if ($exif && !empty($exif['Orientation'])) {
            switch ($exif['Orientation']) {
                case 8:
                    $degree = 270;
                    break;
                case 3:
                    $degree = 180;
                    break;
                case 6:
                    $degree = 90;
                    break;
            }
        }
        if (!$degree)  {
            return false;
        }
        $opts = array(
            'degree' => $degree,
            'jpgQuality' => $quality,
            'checkAnimated' => true
        );
        return $volume->imageUtil('rotate', $src, $opts);
    }
}
php/plugins/Normalizer/plugin.php000064400000017533151215013410013147 0ustar00<?php

/**
 * elFinder Plugin Normalizer
 * UTF-8 Normalizer of file-name and file-path etc.
 * nfc(NFC): Canonical Decomposition followed by Canonical Composition
 * nfkc(NFKC): Compatibility Decomposition followed by Canonical
 * This plugin require Class "Normalizer" (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
 * or PEAR package "I18N_UnicodeNormalizer"
 * ex. binding, configure on connector options
 *    $opts = array(
 *        'bind' => array(
 *            'upload.pre mkdir.pre mkfile.pre rename.pre archive.pre ls.pre' => array(
 *                'Plugin.Normalizer.cmdPreprocess'
 *            ),
 *            'upload.presave paste.copyfrom' => array(
 *                'Plugin.Normalizer.onUpLoadPreSave'
 *            )
 *        ),
 *        // global configure (optional)
 *        'plugin' => array(
 *            'Normalizer' => array(
 *                'enable'    => true,
 *                'nfc'       => true,
 *                'nfkc'      => true,
 *                'umlauts'   => false,
 *                'lowercase' => false,
 *                'convmap'   => array()
 *            )
 *        ),
 *        // each volume configure (optional)
 *        'roots' => array(
 *            array(
 *                'driver' => 'LocalFileSystem',
 *                'path'   => '/path/to/files/',
 *                'URL'    => 'http://localhost/to/files/'
 *                'plugin' => array(
 *                    'Normalizer' => array(
 *                        'enable'    => true,
 *                        'nfc'       => true,
 *                        'nfkc'      => true,
 *                        'umlauts'   => false,
 *                        'lowercase' => false,
 *                        'convmap'   => array()
 *                    )
 *                )
 *            )
 *        )
 *    );
 *
 * @package elfinder
 * @author  Naoki Sawada
 * @license New BSD
 */
class elFinderPluginNormalizer extends elFinderPlugin
{
    private $replaced = array();
    private $keyMap = array(
        'ls' => 'intersect',
        'upload' => 'renames',
        'mkdir' => array('name', 'dirs')
    );

    public function __construct($opts)
    {
        $defaults = array(
            'enable' => true,  // For control by volume driver
            'nfc' => true,  // Canonical Decomposition followed by Canonical Composition
            'nfkc' => true,  // Compatibility Decomposition followed by Canonical
            'umlauts' => false, // Convert umlauts with their closest 7 bit ascii equivalent
            'lowercase' => false, // Make chars lowercase
            'convmap' => array()// Convert map ('FROM' => 'TO') array
        );

        $this->opts = array_merge($defaults, $opts);
    }

    public function cmdPreprocess($cmd, &$args, $elfinder, $volume)
    {
        $opts = $this->getCurrentOpts($volume);
        if (!$opts['enable']) {
            return false;
        }
        $this->replaced[$cmd] = array();
        $key = (isset($this->keyMap[$cmd])) ? $this->keyMap[$cmd] : 'name';

        if (is_array($key)) {
            $keys = $key;
        } else {
            $keys = array($key);
        }
        foreach ($keys as $key) {
            if (isset($args[$key])) {
                if (is_array($args[$key])) {
                    foreach ($args[$key] as $i => $name) {
                        if ($cmd === 'mkdir' && $key === 'dirs') {
                            // $name need '/' as prefix see #2607
                            $name = '/' . ltrim($name, '/');
                            $_names = explode('/', $name);
                            $_res = array();
                            foreach ($_names as $_name) {
                                $_res[] = $this->normalize($_name, $opts);
                            }
                            $this->replaced[$cmd][$name] = $args[$key][$i] = join('/', $_res);
                        } else {
                            $this->replaced[$cmd][$name] = $args[$key][$i] = $this->normalize($name, $opts);
                        }
                    }
                } else if ($args[$key] !== '') {
                    $name = $args[$key];
                    $this->replaced[$cmd][$name] = $args[$key] = $this->normalize($name, $opts);
                }
            }
        }
        if ($cmd === 'ls' || $cmd === 'mkdir') {
            if (!empty($this->replaced[$cmd])) {
                // un-regist for legacy settings
                $elfinder->unbind($cmd, array($this, 'cmdPostprocess'));
                $elfinder->bind($cmd, array($this, 'cmdPostprocess'));
            }
        }
        return true;
    }

    public function cmdPostprocess($cmd, &$result, $args, $elfinder, $volume)
    {
        if ($cmd === 'ls') {
            if (!empty($result['list']) && !empty($this->replaced['ls'])) {
                foreach ($result['list'] as $hash => $name) {
                    if ($keys = array_keys($this->replaced['ls'], $name)) {
                        if (count($keys) === 1) {
                            $result['list'][$hash] = $keys[0];
                        } else {
                            $result['list'][$hash] = $keys;
                        }
                    }
                }
            }
        } else if ($cmd === 'mkdir') {
            if (!empty($result['hashes']) && !empty($this->replaced['mkdir'])) {
                foreach ($result['hashes'] as $name => $hash) {
                    if ($keys = array_keys($this->replaced['mkdir'], $name)) {
                        $result['hashes'][$keys[0]] = $hash;
                    }
                }
            }
        }
    }

    // NOTE: $thash is directory hash so it unneed to process at here
    public function onUpLoadPreSave(&$thash, &$name, $src, $elfinder, $volume)
    {
        $opts = $this->getCurrentOpts($volume);
        if (!$opts['enable']) {
            return false;
        }

        $name = $this->normalize($name, $opts);
        return true;
    }

    protected function normalize($str, $opts)
    {
        if ($opts['nfc'] || $opts['nfkc']) {
            if (class_exists('Normalizer', false)) {
                if ($opts['nfc'] && !Normalizer::isNormalized($str, Normalizer::FORM_C))
                    $str = Normalizer::normalize($str, Normalizer::FORM_C);
                if ($opts['nfkc'] && !Normalizer::isNormalized($str, Normalizer::FORM_KC))
                    $str = Normalizer::normalize($str, Normalizer::FORM_KC);
            } else {
                if (!class_exists('I18N_UnicodeNormalizer', false)) {
                    if (is_readable('I18N/UnicodeNormalizer.php')) {
                        include_once 'I18N/UnicodeNormalizer.php';
                    } else {
                        trigger_error('Plugin Normalizer\'s options "nfc" or "nfkc" require PHP class "Normalizer" or PEAR package "I18N_UnicodeNormalizer"', E_USER_WARNING);
                    }
                }
                if (class_exists('I18N_UnicodeNormalizer', false)) {
                    $normalizer = new I18N_UnicodeNormalizer();
                    if ($opts['nfc'])
                        $str = $normalizer->normalize($str, 'NFC');
                    if ($opts['nfkc'])
                        $str = $normalizer->normalize($str, 'NFKC');
                }
            }
        }
        if ($opts['umlauts']) {
            if (strpos($str = htmlentities($str, ENT_QUOTES, 'UTF-8'), '&') !== false) {
                $str = html_entity_decode(preg_replace('~&([a-z]{1,2})(?:acute|caron|cedil|circ|grave|lig|orn|ring|slash|tilde|uml);~i', '$1', $str), ENT_QUOTES, 'utf-8');
            }
        }
        if ($opts['convmap'] && is_array($opts['convmap'])) {
            $str = strtr($str, $opts['convmap']);
        }
        if ($opts['lowercase']) {
            if (function_exists('mb_strtolower')) {
                $str = mb_strtolower($str, 'UTF-8');
            } else {
                $str = strtolower($str);
            }
        }
        return $str;
    }
}
php/plugins/Watermark/plugin.php000064400000043500151215013410012753 0ustar00<?php

/**
 * elFinder Plugin Watermark
 * Print watermark on file upload.
 * ex. binding, configure on connector options
 *    $opts = array(
 *        'bind' => array(
 *            'upload.presave' => array(
 *                'Plugin.Watermark.onUpLoadPreSave'
 *            )
 *        ),
 *        // global configure (optional)
 *        'plugin' => array(
 *            'Watermark' => array(
 *                'enable'         => true,       // For control by volume driver
 *                'source'         => 'logo.png', // Path to Water mark image
 *                'ratio'          => 0.2,        // Ratio to original image (ratio > 0 and ratio <= 1)
 *                'position'       => 'RB',       // Position L(eft)/C(enter)/R(ight) and T(op)/M(edium)/B(ottom)
 *                'marginX'        => 5,          // Margin horizontal pixel
 *                'marginY'        => 5,          // Margin vertical pixel
 *                'quality'        => 95,         // JPEG image save quality
 *                'transparency'   => 70,         // Water mark image transparency ( other than PNG )
 *                'targetType'     => IMG_GIF|IMG_JPG|IMG_PNG|IMG_WBMP, // Target image formats ( bit-field )
 *                'targetMinPixel' => 200,        // Target image minimum pixel size
 *                'interlace'      => IMG_GIF|IMG_JPG, // Set interlacebit image formats ( bit-field )
 *                'offDropWith'    => null,       // Enabled by default. To disable it if it is dropped with pressing the meta key
 *                                                // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
 *                                                // In case of using any key, specify it as an array
 *                'onDropWith'     => null        // Disabled by default. To enable it if it is dropped with pressing the meta key
 *                                                // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
 *                                                // In case of using any key, specify it as an array
 *            )
 *        ),
 *        // each volume configure (optional)
 *        'roots' => array(
 *            array(
 *                'driver' => 'LocalFileSystem',
 *                'path'   => '/path/to/files/',
 *                'URL'    => 'http://localhost/to/files/'
 *                'plugin' => array(
 *                    'Watermark' => array(
 *                        'enable'         => true,       // For control by volume driver
 *                        'source'         => 'logo.png', // Path to Water mark image
 *                        'ratio'          => 0.2,        // Ratio to original image (ratio > 0 and ratio <= 1)
 *                        'position'       => 'RB',       // Position L(eft)/C(enter)/R(ight) and T(op)/M(edium)/B(ottom)
 *                        'marginX'        => 5,          // Margin horizontal pixel
 *                        'marginY'        => 5,          // Margin vertical pixel
 *                        'quality'        => 95,         // JPEG image save quality
 *                        'transparency'   => 70,         // Water mark image transparency ( other than PNG )
 *                        'targetType'     => IMG_GIF|IMG_JPG|IMG_PNG|IMG_WBMP, // Target image formats ( bit-field )
 *                        'targetMinPixel' => 200,        // Target image minimum pixel size
 *                        'interlace'      => IMG_GIF|IMG_JPG, // Set interlacebit image formats ( bit-field )
 *                        'offDropWith'    => null,       // Enabled by default. To disable it if it is dropped with pressing the meta key
 *                                                        // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
 *                                                        // In case of using any key, specify it as an array
 *                        'onDropWith'     => null        // Disabled by default. To enable it if it is dropped with pressing the meta key
 *                                                        // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
 *                                                        // In case of using any key, specify it as an array
 *                    )
 *                )
 *            )
 *        )
 *    );
 *
 * @package elfinder
 * @author  Naoki Sawada
 * @license New BSD
 */
class elFinderPluginWatermark extends elFinderPlugin
{

    private $watermarkImgInfo = null;

    public function __construct($opts)
    {
        $defaults = array(
            'enable' => true,       // For control by volume driver
            'source' => 'logo.png', // Path to Water mark image
            'ratio' => 0.2,        // Ratio to original image (ratio > 0 and ratio <= 1)
            'position' => 'RB',       // Position L(eft)/C(enter)/R(ight) and T(op)/M(edium)/B(ottom)
            'marginX' => 5,          // Margin horizontal pixel
            'marginY' => 5,          // Margin vertical pixel
            'quality' => 95,         // JPEG image save quality
            'transparency' => 70,         // Water mark image transparency ( other than PNG )
            'targetType' => IMG_GIF | IMG_JPG | IMG_PNG | IMG_WBMP, // Target image formats ( bit-field )
            'targetMinPixel' => 200,        // Target image minimum pixel size
            'interlace' => IMG_GIF | IMG_JPG, // Set interlacebit image formats ( bit-field )
            'offDropWith' => null,       // To disable it if it is dropped with pressing the meta key
            // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
            // In case of using any key, specify it as an array
            'marginRight' => 0,          // Deprecated - marginX should be used
            'marginBottom' => 0,          // Deprecated - marginY should be used
            'disableWithContentSaveId' => true // Disable on URL upload with post data "contentSaveId"
        );

        $this->opts = array_merge($defaults, $opts);

    }

    public function onUpLoadPreSave(&$thash, &$name, $src, $elfinder, $volume)
    {
        if (!$src) {
            return false;
        }

        $opts = $this->getCurrentOpts($volume);

        if (!$this->iaEnabled($opts, $elfinder)) {
            return false;
        }

        $imageType = null;
        $srcImgInfo = null;
        if (extension_loaded('fileinfo') && function_exists('mime_content_type')) {
            $mime = mime_content_type($src);
            if (substr($mime, 0, 5) !== 'image') {
                return false;
            }
        }
        if (extension_loaded('exif') && function_exists('exif_imagetype')) {
            $imageType = exif_imagetype($src);
            if ($imageType === false) {
                return false;
            }
        } else {
            $srcImgInfo = getimagesize($src);
            if ($srcImgInfo === false) {
                return false;
            }
            $imageType = $srcImgInfo[2];
        }

        // check target image type
        $imgTypes = array(
            IMAGETYPE_GIF => IMG_GIF,
            IMAGETYPE_JPEG => IMG_JPEG,
            IMAGETYPE_PNG => IMG_PNG,
            IMAGETYPE_BMP => IMG_WBMP,
            IMAGETYPE_WBMP => IMG_WBMP
        );
        if (!isset($imgTypes[$imageType]) || !($opts['targetType'] & $imgTypes[$imageType])) {
            return false;
        }

        // check Animation Gif
        if ($imageType === IMAGETYPE_GIF && elFinder::isAnimationGif($src)) {
            return false;
        }
        // check Animation Png
        if ($imageType === IMAGETYPE_PNG && elFinder::isAnimationPng($src)) {
            return false;
        }
        // check water mark image
        if (!file_exists($opts['source'])) {
            $opts['source'] = dirname(__FILE__) . "/" . $opts['source'];
        }
        if (is_readable($opts['source'])) {
            $watermarkImgInfo = getimagesize($opts['source']);
            if (!$watermarkImgInfo) {
                return false;
            }
        } else {
            return false;
        }

        if (!$srcImgInfo) {
            $srcImgInfo = getimagesize($src);
        }

        $watermark = $opts['source'];
        $quality = $opts['quality'];
        $transparency = $opts['transparency'];

        // check target image size
        if ($opts['targetMinPixel'] > 0 && $opts['targetMinPixel'] > min($srcImgInfo[0], $srcImgInfo[1])) {
            return false;
        }

        $watermark_width = $watermarkImgInfo[0];
        $watermark_height = $watermarkImgInfo[1];

        // Specified as a ratio to the image size
        if ($opts['ratio'] && $opts['ratio'] > 0 && $opts['ratio'] <= 1) {
            $maxW = $srcImgInfo[0] * $opts['ratio'] - ($opts['marginX'] * 2);
            $maxH = $srcImgInfo[1] * $opts['ratio'] - ($opts['marginY'] * 2);
            $dx = $dy = 0;
            if (($maxW >= $watermarkImgInfo[0] && $maxH >= $watermarkImgInfo[0]) || ($maxW <= $watermarkImgInfo[0] && $maxH <= $watermarkImgInfo[0])) {
                $dx = abs($srcImgInfo[0] - $watermarkImgInfo[0]);
                $dy = abs($srcImgInfo[1] - $watermarkImgInfo[1]);
            } else if ($maxW < $watermarkImgInfo[0]) {
                $dx = -1;
            } else {
                $dy = -1;
            }
            if ($dx < $dy) {
                $ww = $maxW;
                $wh = $watermarkImgInfo[1] * ($ww / $watermarkImgInfo[0]);
            } else {
                $wh = $maxH;
                $ww = $watermarkImgInfo[0] * ($wh / $watermarkImgInfo[1]);
            }
            $watermarkImgInfo[0] = $ww;
            $watermarkImgInfo[1] = $wh;
        } else {
            $opts['ratio'] = null;
        }

        $opts['position'] = strtoupper($opts['position']);

        // Set vertical position
        if (strpos($opts['position'], 'T') !== false) {
            // Top
            $dest_x = $opts['marginX'];
        } else if (strpos($opts['position'], 'M') !== false) {
            // Middle
            $dest_x = ($srcImgInfo[0] - $watermarkImgInfo[0]) / 2;
        } else {
            // Bottom
            $dest_x = $srcImgInfo[0] - $watermarkImgInfo[0] - max($opts['marginBottom'], $opts['marginX']);
        }

        // Set horizontal position
        if (strpos($opts['position'], 'L') !== false) {
            // Left
            $dest_y = $opts['marginY'];
        } else if (strpos($opts['position'], 'C') !== false) {
            // Middle
            $dest_y = ($srcImgInfo[1] - $watermarkImgInfo[1]) / 2;
        } else {
            // Right
            $dest_y = $srcImgInfo[1] - $watermarkImgInfo[1] - max($opts['marginRight'], $opts['marginY']);
        }


        // check interlace
        $opts['interlace'] = ($opts['interlace'] & $imgTypes[$imageType]);

        // Repeated use of Imagick::compositeImage() may cause PHP to hang, so disable it
        //if (class_exists('Imagick', false)) {
        //    return $this->watermarkPrint_imagick($src, $watermark, $dest_x, $dest_y, $quality, $transparency, $watermarkImgInfo, $opts);
        //} else {
            elFinder::expandMemoryForGD(array($watermarkImgInfo, $srcImgInfo));
            return $this->watermarkPrint_gd($src, $watermark, $dest_x, $dest_y, $quality, $transparency, $watermarkImgInfo, $srcImgInfo, $opts);
        //}
    }

    private function watermarkPrint_imagick($src, $watermarkSrc, $dest_x, $dest_y, $quality, $transparency, $watermarkImgInfo, $opts)
    {

        try {

            // Open the original image
            $img = new Imagick($src);

            // Open the watermark
            $watermark = new Imagick($watermarkSrc);

            // zoom
            if ($opts['ratio']) {
                $watermark->scaleImage($watermarkImgInfo[0], $watermarkImgInfo[1]);
            }

            // Set transparency
            if (strtoupper($watermark->getImageFormat()) !== 'PNG') {
                $watermark->setImageOpacity($transparency / 100);
            }

            // Overlay the watermark on the original image
            $img->compositeImage($watermark, imagick::COMPOSITE_OVER, $dest_x, $dest_y);

            // Set quality
            if (strtoupper($img->getImageFormat()) === 'JPEG') {
                $img->setImageCompression(imagick::COMPRESSION_JPEG);
                $img->setCompressionQuality($quality);
            }

            // set interlace
            $opts['interlace'] && $img->setInterlaceScheme(Imagick::INTERLACE_PLANE);

            $result = $img->writeImage($src);

            $img->clear();
            $img->destroy();
            $watermark->clear();
            $watermark->destroy();

            return $result ? true : false;
        } catch (Exception $e) {
            $ermsg = $e->getMessage();
            $ermsg && trigger_error($ermsg);
            return false;
        }
    }

    private function watermarkPrint_gd($src, $watermark, $dest_x, $dest_y, $quality, $transparency, $watermarkImgInfo, $srcImgInfo, $opts)
    {

        $watermark_width = $watermarkImgInfo[0];
        $watermark_height = $watermarkImgInfo[1];

        $ermsg = '';
        switch ($watermarkImgInfo['mime']) {
            case 'image/gif':
                if (imagetypes() & IMG_GIF) {
                    $oWatermarkImg = imagecreatefromgif($watermark);
                } else {
                    $ermsg = 'GIF images are not supported as watermark image';
                }
                break;
            case 'image/jpeg':
                if (imagetypes() & IMG_JPG) {
                    $oWatermarkImg = imagecreatefromjpeg($watermark);
                } else {
                    $ermsg = 'JPEG images are not supported as watermark image';
                }
                break;
            case 'image/png':
                if (imagetypes() & IMG_PNG) {
                    $oWatermarkImg = imagecreatefrompng($watermark);
                } else {
                    $ermsg = 'PNG images are not supported as watermark image';
                }
                break;
            case 'image/wbmp':
                if (imagetypes() & IMG_WBMP) {
                    $oWatermarkImg = imagecreatefromwbmp($watermark);
                } else {
                    $ermsg = 'WBMP images are not supported as watermark image';
                }
                break;
            default:
                $oWatermarkImg = false;
                $ermsg = $watermarkImgInfo['mime'] . ' images are not supported as watermark image';
                break;
        }


        if (!$ermsg) {
            // zoom
            if ($opts['ratio']) {
                $tmpImg = imagecreatetruecolor($watermarkImgInfo[0], $watermarkImgInfo[1]);
                imagealphablending($tmpImg, false);
                imagesavealpha($tmpImg, true);
                imagecopyresampled($tmpImg, $oWatermarkImg, 0, 0, 0, 0, $watermarkImgInfo[0], $watermarkImgInfo[1], imagesx($oWatermarkImg), imagesy($oWatermarkImg));
                imageDestroy($oWatermarkImg);
                $oWatermarkImg = $tmpImg;
                $tmpImg = null;
            }

            switch ($srcImgInfo['mime']) {
                case 'image/gif':
                    if (imagetypes() & IMG_GIF) {
                        $oSrcImg = imagecreatefromgif($src);
                    } else {
                        $ermsg = 'GIF images are not supported as source image';
                    }
                    break;
                case 'image/jpeg':
                    if (imagetypes() & IMG_JPG) {
                        $oSrcImg = imagecreatefromjpeg($src);
                    } else {
                        $ermsg = 'JPEG images are not supported as source image';
                    }
                    break;
                case 'image/png':
                    if (imagetypes() & IMG_PNG) {
                        $oSrcImg = imagecreatefrompng($src);
                    } else {
                        $ermsg = 'PNG images are not supported as source image';
                    }
                    break;
                case 'image/wbmp':
                    if (imagetypes() & IMG_WBMP) {
                        $oSrcImg = imagecreatefromwbmp($src);
                    } else {
                        $ermsg = 'WBMP images are not supported as source image';
                    }
                    break;
                default:
                    $oSrcImg = false;
                    $ermsg = $srcImgInfo['mime'] . ' images are not supported as source image';
                    break;
            }
        }

        if ($ermsg || false === $oSrcImg || false === $oWatermarkImg) {
            $ermsg && trigger_error($ermsg);
            return false;
        }

        if ($srcImgInfo['mime'] === 'image/png') {
            if (function_exists('imagecolorallocatealpha')) {
                $bg = imagecolorallocatealpha($oSrcImg, 255, 255, 255, 127);
                imagefill($oSrcImg, 0, 0, $bg);
            }
        }

        if ($watermarkImgInfo['mime'] === 'image/png') {
            imagecopy($oSrcImg, $oWatermarkImg, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height);
        } else {
            imagecopymerge($oSrcImg, $oWatermarkImg, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, $transparency);
        }

        // set interlace
        $opts['interlace'] && imageinterlace($oSrcImg, true);

        switch ($srcImgInfo['mime']) {
            case 'image/gif':
                imagegif($oSrcImg, $src);
                break;
            case 'image/jpeg':
                imagejpeg($oSrcImg, $src, $quality);
                break;
            case 'image/png':
                if (function_exists('imagesavealpha') && function_exists('imagealphablending')) {
                    imagealphablending($oSrcImg, false);
                    imagesavealpha($oSrcImg, true);
                }
                imagepng($oSrcImg, $src);
                break;
            case 'image/wbmp':
                imagewbmp($oSrcImg, $src);
                break;
        }

        imageDestroy($oSrcImg);
        imageDestroy($oWatermarkImg);

        return true;
    }
}
php/plugins/Watermark/logo.png000064400000021343151215013410012413 0ustar00�PNG


IHDRxx9d6�"�IDATx����P@�f&��m۶-�ٶm۶m۶�g[�u����M2�7�LW�e�����;Io8+���
+���
Ub�,���&M�2�)��D�!Z'ʂ�8��E@��	e�t:��0G�����ҲU�/�v{�/�;��
\%��_�2��`�EBŐ���=�$�7x|��mx��&���ۆ�NN�8~�4Kn,l�UH�2__��F�߾}?~���ITʩ�Ŗ�6�E#��l�Y�}ц�_�_Gm_�jA��<kj&��ϟP�bY���T[�k�D m���_]f|FY��Z�˘J�E��s��(�����~�{Q$	c�"�b�R���+�;{ԩ���Χ
��aR.VT�PA��J��d����Xy	}t���
^�p��8��	Q�`N�,�—/_����>yS'M�Z=*㳆�aVg��Ts��M�aա[Ш�T}%W�$�!�bLܧ���د	NkP�e8z��&׍ϟ?Ô�4��JK���\^/7[�
0w�5 ���7!}΂��c{M���9=���7o�,p����9�t�Ɗ�Nk<2w�L�\Z���ʭ�?�uZ�b����⨮�YC�M�����1\��&Uf}#�ϟ=Ӫ�䟺��&���3�K�h��@���B���gx�
Ш�u4�8��u�R�~�*.l�m�O�q�Hyݵ�H������R'K�In��U�#�L�+p��罺w�\C޼y�z��rS��K�˔���g�Ă�7 i�.1��.�<ˋ����7d˖ҥL��H0��}h޴1�O�\��"��ׯ_�
>~���5���$�s�K��-;�I4�ϼ:A|M+4�A�2x�`�o������;�y�:,]�jT����By��*�̛Ò9.N
�-rH��M$Q�ϓr�0y�y�=�‹�lN�}•+W<
~��
|������P�׆
�L�2>#�6Ej�<;D���+œ]W�-�kf�r�d�,�@���:=	��Kr|£�W/�J�:�xQ(�r5��dk�?v,Y�-,�w�n��������
~��N����E�(đ��=.ʭJy��Ǐ°��u�i�ǎ�����n��7M��rt1�/��;�#g����t2x���>�K�j��Z56���X�2>��n�;�����TlЀ��JV8.v�;2A���7�2c
6���(�d��9�-o��s�o��)S��
~��%��	�>}��H�H�d�O,���{4ͧ�g�O���7�T?ki֧g7�f�$I��Ī�i��mg�`Ɋ��:k�[~�>��wPq,Yt�]��n����/�w�nw7���]�躻ߺ'Tg�ez��3��/��ד�S�^=�N�q�F���O�`+���,�'����~�ꥦ���?�kK��ή�5#�kp*��r�8�\y�+��'ߠ0���GЎ�/�g����_x/�ȵ������:	����8�fd�����h¨07���t�Z��d���7��Qt�
H�����}�M'�,�N�ή:��R){vށ���b55�@sgϢ�[7Sc�z��
�(��o�@����z?�p�4'8�-3�
�5����\h�]�^�D���dmm�9�o��:�����&x߾��.c����(/�6o\��)��Y񲭍�N�!<i��kaa�uU��}�i+S�;/�iŖƧ�V`���T�ֳ�Y�^�����g������r$�b۟�0ưF�l��E�w�v�k�:���n��^j�ξq�����*�9a�)�ϕ���Tg��E	k����oŁ-SQ{f��U��]�5�T��;x�٦�7i5�֬YK���/���4z��=�B-�vZ�����>��Z	���S�`�oڰ�A
E	޴aA>�?WW�/v���>������lm��R����I�2e�@\}�|+�/(�'m>�,�]u�)�9�7�\]��_�����HM�G�-�e4nݼ���0��!���~�X�|���E�V��HpCC�����竷�GL�ɦ�;��;l�0A&f�)�F#�e!ʷ��	y,�����uV�1k�1�_
X}�>9���%bÆ
2�+*H�:���
���[)���ޱc�Ree%A��{ЦM�MFp~N��N!ɸ����ޟ� C/>���δ���t�M���jI���FO"�ĉ:�=��bU����sA�����1{��m2=f�pX����Ǐ�	��Y�ѧ�����l&g�
�I�ڳ-lv�	藘��;;{����~����2I&;g�r��\�8��nt��Q�>Ű�f�{�V����Y�5S����N1[J.#���Ѥ�	�h�6ˏ�%wo\7
��򞹩^�]��D�a=��߽{dY(F0��ϟ��Vl�f�ŵgbZ��-j�mXh1��yCy��S��|�R�^�;y�Z�M��9��f4»SMc� {����_�n�"�J�m��������߫j+�><͗��ՉF#:U_�҂���p[�s=���˟��?�u���I�V�䬡�e���&j�?##�����fU��4�)[6m �(]lb=�X��&����V,���s�2؞����<�'M��WRX1gs��H��I-���Z��
>�ңw���KU=}�IA��S����K}-QG���3��Jx��ͯ�M9��z��o^�k&��X�˘������_�J뽥�� ��Pjc��y1Yق���l����R�a�i��&A���G5�ogmYj�^��`}�����o�?�xz� s�^����l����l����Y���9t� w�p�����r+K�2+Kڳg/��������?�dd������^m��~Q�h��&Z��&a���p�(���l8�2I�Q\�P�wt���gΜA�޽E���@�o~�k�宯��8Ҕƕ��L2�V5�
(��F�Y��wv
ggZ�t�B5�U��N��#"	�J�P'ŝ$�h�a"�l���������z�qU�,���);;�/^B�]�zM��Ç	>���8Z4�R����A��Q���^�eŅ���@�L �\v�Iz�g�ԓ���� ��B�8�zҜ#h#����MAU�v��	M�	+{���?�C�!)�S���O�ɉ���ɺ:\�4Z[Zh�K���b	z݌�}���0Fj���Ŧ���-���UBٌ�FMׯ_�F�ΒOĐ��d1�M�6!Y�`,�W
d��=�-�1T����-���v��m_��1[����_A�T
9S�в�6=evZ^ee	
̐��"A> ���3�����*u�SEoY���N���`)
��Z_�����"�.O�f=hP�d*�����>F�\��[/���həVZ��Y�X��ٰ:$[[;:p�V�^1�ϑ#G�����͛�%T8sn�\�sk���r��!�����-����٧G�^�~�

���Y旎FQ��};:-��z�0�DXX�D�O��ESWD�m�ԒWޢE�)""RWQ��HvS+gҤ��QQ�̻�k��`���L:q��<�S���G��ǖJx�lUU���=�N_GN6Ѣӭ&G�A��!͙S��E��>�PBC���ŋ2Y('��̔�Mسk���QÇ����=K[V"�W*Y��~4n�EZx��l����NU=p�'���QU5A���?�҇N�I�i��g���-�;�*k�)���\���"5������fpp�t���K����?�El��z��Я~�+<�
���ֲ�1-��/2SZk��`➛��t��Q0E�������S�f͖��x�Jf��������FV������=N��t�O���$_>}�N��\�dt*-fo�j�͸��i���.�����I}�	9[2`h����4u�E�7Ư�#'WO�p�r��*ٞ��B�֭�B��iS�6 4h\S�RU�y�6Ѽ��f���)ap9��:ܺuKx�]\\߻�֙��&H376���3AN``��Qr��A�{`�WG���"8-)A�0�x[�
���@g�hG�n~������]�h�%��/�;���Z���v�<���*��B=��{Bn��A��s��|��P�~#aƌ��!󶁬N#w�U�Ix2.��Jnב�0�j�+:Bo���]��sZ������b�Ԏ�_>��za蚓4�d�V[u��|q�ɐ��D.\���4y�0������&o�"xɩ6r�	j�E��t^^���;�ߩ��	���֖f<��!@]_�v��Cu+3�HHݍ�݃m,e�%�y-��v�
�Yl�ή׌1���U`��i`@KK�`�Jŀ�̊��;��Bp��Z�i5 �h��.�lii��z}��/�uDp�Wo\�x��C���q�/m?�ΤY��Z�7^��Z���E�PǏ~���p}�…ҵ�!x�I��ݻ���������;j�d�q�>r��)	��#����-Q��Y��"���ѣ")
c��
€�=�p}̘�|[r���&�}K�,U}#��}Ν;�)O��hc��ơ��˿p�S4��U#J�&~/�>8LH0܍€2��p����}6F@8�Qv��'	�C�X�x�8d�q��!�3-�3��B�q�s�E�Vע%��
֭��P55�ß�=#\>|�Y���C˪]K-X�@x������ؠv�/_�`�(.W��jg�\�%�h�V���&YYI�CXMI0Z0�=�����݌6�J)B��ץ�mٲUxS���~���2�9}� �؏�ޫ�Ȋ�_8uJ
M9Ѣ�1b룴�td%�Y�t�N�۷��LЦ�&�]�e(8Ro��݂��W�aY�}���>�U|�H�c�����Ϝ�sF�H�x�:(�&3�a��sd/��	莳c��a%u	TWϕ��pGH��|E�1�ف�t�}���Ưkht�1��'�D$B��N�5:z�լYMh�; FF0?l�&d�4n�}�t�E+*�ԓ��lB���Ø�H�xII�4�&�?m����=�,>>�����	H��՛\{����IU���O�{��}�4�����M�Q@��%4������P�uԯ`�̨0
�SK)�%�;��*i�����]^�a<,h0f�& �.��-A�&�2������s�P����D��'�ĕ��ֈ臉���&M�h��4b�
��H�
�x�b
Ǒ���C���N�*]��JO4D��C)0J�Of���!�i988��+$��P=k�A�y�xN+޼y����ls��d)�1!�*�6Qձ�.Cx\��5�3����/���
�F�_/rǬ<Ln�*	|�2r=z$������3��=�v�$�2�[[�1�:�Vu {挠�G���X�ّ1m��X%j3/RRRq]�:��(��+���KY�����3.G�
�Cv&�9X���۷4��/�P�0�t�Ln<�[��CH�:��mbD��
÷�B�|���3m�4Y�,;H�	��h28d!I�P��~�b5bْEz����gtb�!�y�݌�ձ�lDR1����b����$����
s"D�bB{њb�C��
�eؿ��p���'ۛ�@6�F`��ы�۶j�`9
jO�u����e��f�\a0ݼ)ir-�9�Dc	�B�����\#��ϝ;w:�N	�ď?�o[���\h���g]�ׯ_E��VrC�Xn�Ou�©/��n���j���ؼh4M�8�ޑ(�r%
�q��iQC��]�j� 3M)�(�4B��ُ�>D����+�g�޲�0~�(<��V�C��Hƞ�����Ń�"��o�A#m�V}�E@x���
ƈ#y��N	99��1z�h6п48`K-�!�>�f,�ʕK��p���n�3���+�F|A�7KH��A��z!GK\Su�����Ԗ�VUU!s�3�D��޸��;|�cG3�<��x�}]��5�jw��n����J6]���[$Tl�E��j6P��H@=ҍ7@8m����o��˗/G6�
Mw�ޅA5H������M_���&�������e�g�R��}��G�0K�g�&�ЈC����q�S����u1[����R%õkW�ܽs[2�pؖ�����/�a�h��	��6*B�{`$%NXK^�}��������p�8~����P[c���� n�D8z����hءf	e[��0�_"`�K�Jr�V����r��<Ä	�ŀ�O�H��H~7u%M��:w
=�" ,�@���#o� ������ևmgm]fkeI�'ۛYۍ����N�:�?���d�d���B��'Ы":g$
9�, I!���Ts�ާ�츉��
��S���".���@��'�OМ����0��k&3�Ѽ�9t�i]�m߆	�_�bam���=O��@���m����G՜�� �x�-��e�>x��V�1�Hw]�x!
��[�֠���� x����{{F��Īq,���},���(B��Q� ��2�����B
�$�k��2١�e��D-�l�X���	����q}�Z�����#~�|9Cf�̏ĸXZ0���6�aq��&n�&?K���{���i�f�S�QͮL5��y*�N�ޫ�~X����`b��d�h�!���8�s���Á�c�5dk s�Iu�9B”��~8[j�#�J�>����
��%�Ts��#�좝���'D�3H�A/,wW�	ƒ��(���	����
?���1+
b���Y>��68�Rκ+T��Y@pB����DH�A<6((X'��٣d��&�.@5I��2�̜����޼q�Г�a��oG��A��� ���J�7���ISW:!�n��~�}�~�T�� ;ei�7�N0Gո1���:
wܨ�*6�
����v�$���5���=�7�>z���u��q�P�W�]��9����.#8,����B��ռ��̞5�T��.k�1c?��r�
�5�;R( ��A�@0��ջ:ӆ�e�Xh��`խTI�C�}�lIFc��	|
������Lh���T��I����Z|�	B;$V\Ɠ�8yQ������dc�7�0��l�!��Ά�G����@�"x��
���Vt�.>���A�]�C)o�ZČ��h���Ȓ5�ّ����K���? �jkky�-Z
6����t�P�q�8P��Q��JWp��l�*�����6�E��'�޷�ۢ�T��0Y�~|4N��(���(+.���΂S}��ӥ������~�
^����7��v<��=����!��d���7�����3��'�h�c�\�H�S���e�}���	0/\ �~d���x@���l�ܓRj�R��&���"�&�ƃj4�LNH�P��#qN���2%1����Y3��P���,ŀ��K�G���ϼ�Ң�D3��V�l0+�ß��S#A�VՒ���N��Ӈʞ��>���K�m�Q��d:g'~4��j���T��0K�
h�[QV���^�͜>U�}%K�5��ʩc�aG����2w7iE��:�f����m��g2v<!�HC�uG�>��v4�P�cG��zW�� �wO֭��g�Ξ)5�v��fa^f������#QƮ&�H\{����uh��OvD�T]��f�\�;�u|��=E�ݿo R��Տ혻�k(�d�O���٭�YT'J3��ǂ۲+��4���Ei;�S#G�7? ��՜3Vv_ܲF����I�͛7�W�^ï�"��@�JAN�K�Gg��:-��~�(afO�:���y�\������0�=���Ϣ䭏(���
�f��ҙ�g�V���/�=Z����ٳg��|��]E��s��a�Ƌ���Uv�O�C?'�Tcg���nY���j�c(��&�0�:�뻭�umߵk�Z�Y}��޾m'��v���ٜ�U���k���U���Ɉ.޼�)��ٔ�M?['w�	^�j�@0��q܎9	~��!?��P������P��&�Ʀ�Y� *f�~���5(�nO�����QZ	F�ɷoߨ�qv0��˖,�i€�=	rmm��U7�m�y�_�m��5K�J=ƭы��S>lo�p�N��hhh���%,l/Wg�?{��̛K8e;9>������.�l�����)�&��t�Q���qZ8I+�I���W�*���[-p�����5�b����˗.
�2�0$�����5ཱི�D'�'��[���,�b�X�h+�?����=UKpp��6!�jj��z�W�Z�}<�	��tWGp�)�<FP�=?���X_�66h%���6�v�)�^���G�{ӣg<%l�+�;paS�*�Y�i���d3YfU3�˴�-`��ޅ&(���s�d�A����U�{�90��V_&���������1��yP
�Ƥ>�r�
y�9�h!�o;��������[5��G��1�eY!o���ca��x&���/
Xp�"i��[��*C9��lFx�6�G��{��;�t��=Q����H�_=�c�w�#zy��7:�7m��p�����ِ�j�Yi)���c-�:��,��}��x����K��x%��6����T�2Ҡ;sn��\��y[f�}M;���Cƅ��}#eW_37�>~Ի7+����[3`�3�K:��@̱�ԁ`��<��T�w���U�MGכϮ�l�{���v�2Z�-���1�=��� �)	~����S�.D,
7����#���:K6��Q�d�wr�U�c�>�a���
x��U��O��������������������_��r���IEND�B`�php/elFinderVolumeDropbox2.class.php000064400000134506151215013410013512 0ustar00<?php

use Kunnu\Dropbox\Dropbox;
use Kunnu\Dropbox\DropboxApp;
use Kunnu\Dropbox\DropboxFile;
use Kunnu\Dropbox\Exceptions\DropboxClientException;
use Kunnu\Dropbox\Models\FileMetadata;
use Kunnu\Dropbox\Models\FolderMetadata;

/**
 * Simple elFinder driver for Dropbox
 * kunalvarma05/dropbox-php-sdk:0.1.5 or above.
 *
 * @author Naoki Sawada
 **/
class elFinderVolumeDropbox2 extends elFinderVolumeDriver
{
    /**
     * Driver id
     * Must be started from letter and contains [a-z0-9]
     * Used as part of volume id.
     *
     * @var string
     **/
    protected $driverId = 'db';

    /**
     * Dropbox service object.
     *
     * @var object
     **/
    protected $service = null;

    /**
     * Fetch options.
     *
     * @var string
     */
    private $FETCH_OPTIONS = [];

    /**
     * Directory for tmp files
     * If not set driver will try to use tmbDir as tmpDir.
     *
     * @var string
     **/
    protected $tmp = '';

    /**
     * Net mount key.
     *
     * @var string
     **/
    public $netMountKey = '';

    /**
     * Constructor
     * Extend options with required fields.
     *
     * @author Naoki Sawada
     **/
    public function __construct()
    {
        $opts = [
            'app_key' => '',
            'app_secret' => '',
            'access_token' => '',
            'aliasFormat' => '%s@Dropbox',
            'path' => '/',
            'separator' => '/',
            'acceptedName' => '#^[^\\\/]+$#',
            'rootCssClass' => 'elfinder-navbar-root-dropbox',
            'publishPermission' => [
                'requested_visibility' => 'public',
                //'link_password' => '',
                //'expires' => '',
            ],
            'getThumbSize' => 'medium', // Available sizes: 'thumb', 'small', 'medium', 'large', 'huge'
        ];
        $this->options = array_merge($this->options, $opts);
        $this->options['mimeDetect'] = 'internal';
    }

    /*********************************************************************/
    /*                        ORIGINAL FUNCTIONS                         */
    /*********************************************************************/

    /**
     * Get Parent ID, Item ID, Parent Path as an array from path.
     *
     * @param string $path
     *
     * @return array
     */
    protected function _db_splitPath($path)
    {
        $path = trim($path, '/');
        if ($path === '') {
            $dirname = '/';
            $basename = '';
        } else {
            $pos = strrpos($path, '/');
            if ($pos === false) {
                $dirname = '/';
                $basename = $path;
            } else {
                $dirname = '/' . substr($path, 0, $pos);
                $basename = substr($path, $pos + 1);
            }
        }

        return [$dirname, $basename];
    }

    /**
     * Get dat(Dropbox metadata) from Dropbox.
     *
     * @param string $path
     *
     * @return boolean|object Dropbox metadata
     */
    private function _db_getFile($path)
    {
        if ($path === '/') {
            return true;
        }

        $res = false;
        try {
            $file = $this->service->getMetadata($path, $this->FETCH_OPTIONS);
            if ($file instanceof FolderMetadata || $file instanceof FileMetadata) {
                $res = $file;
            }

            return $res;
        } catch (DropboxClientException $e) {
            return false;
        }
    }

    /**
     * Parse line from Dropbox metadata output and return file stat (array).
     *
     * @param object $raw line from ftp_rawlist() output
     *
     * @return array
     * @author Naoki Sawada
     **/
    protected function _db_parseRaw($raw)
    {
        $stat = [];
        $isFolder = false;
        if ($raw === true) {
            // root folder
            $isFolder = true;
            $stat['name'] = '';
            $stat['iid'] = '0';
        }

        $data = [];
        if (is_object($raw)) {
            $isFolder = $raw instanceof FolderMetadata;
            $data = $raw->getData();
        } elseif (is_array($raw)) {
            $isFolder = $raw['.tag'] === 'folder';
            $data = $raw;
        }

        if (isset($data['path_lower'])) {
            $stat['path'] = $data['path_lower'];
        }

        if (isset($data['name'])) {
            $stat['name'] = $data['name'];
        }

        if (isset($data['id'])) {
            $stat['iid'] = substr($data['id'], 3);
        }

        if ($isFolder) {
            $stat['mime'] = 'directory';
            $stat['size'] = 0;
            $stat['ts'] = 0;
            $stat['dirs'] = -1;
        } else {
            $stat['size'] = isset($data['size']) ? (int)$data['size'] : 0;
            if (isset($data['server_modified'])) {
                $stat['ts'] = strtotime($data['server_modified']);
            } elseif (isset($data['client_modified'])) {
                $stat['ts'] = strtotime($data['client_modified']);
            } else {
                $stat['ts'] = 0;
            }
            $stat['url'] = '1';
        }

        return $stat;
    }

    /**
     * Get thumbnail from Dropbox.
     *
     * @param string $path
     * @param string $size
     *
     * @return string | boolean
     */
    protected function _db_getThumbnail($path)
    {
        try {
            return $this->service->getThumbnail($path, $this->options['getThumbSize'])->getContents();
        } catch (DropboxClientException $e) {
            return false;
        }
    }

    /**
     * Join dir name and file name(display name) and retur full path.
     *
     * @param string $dir
     * @param string $displayName
     *
     * @return string
     */
    protected function _db_joinName($dir, $displayName)
    {
        return rtrim($dir, '/') . '/' . $displayName;
    }

    /**
     * Get OAuth2 access token form OAuth1 tokens.
     *
     * @param string $app_key
     * @param string $app_secret
     * @param string $oauth1_token
     * @param string $oauth1_secret
     *
     * @return string|false
     */
    public static function getTokenFromOauth1($app_key, $app_secret, $oauth1_token, $oauth1_secret)
    {
        $data = [
            'oauth1_token' => $oauth1_token,
            'oauth1_token_secret' => $oauth1_secret,
        ];
        $auth = base64_encode($app_key . ':' . $app_secret);

        $ch = curl_init('https://api.dropboxapi.com/2/auth/token/from_oauth1');
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            'Content-Type: application/json',
            'Authorization: Basic ' . $auth,
        ]);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
        $result = curl_exec($ch);
        curl_close($ch);

        $res = $result ? json_decode($result, true) : [];

        return isset($res['oauth2_token']) ? $res['oauth2_token'] : false;
    }

    /*********************************************************************/
    /*                        EXTENDED FUNCTIONS                         */
    /*********************************************************************/

    /**
     * Prepare
     * Call from elFinder::netmout() before volume->mount().
     *
     * @return array
     * @author Naoki Sawada
     **/
    public function netmountPrepare($options)
    {
        if (empty($options['app_key']) && defined('ELFINDER_DROPBOX_APPKEY')) {
            $options['app_key'] = ELFINDER_DROPBOX_APPKEY;
        }
        if (empty($options['app_secret']) && defined('ELFINDER_DROPBOX_APPSECRET')) {
            $options['app_secret'] = ELFINDER_DROPBOX_APPSECRET;
        }

        if (!isset($options['pass'])) {
            $options['pass'] = '';
        }

        try {
            $app = new DropboxApp($options['app_key'], $options['app_secret']);
            $dropbox = new Dropbox($app);
            $authHelper = $dropbox->getAuthHelper();

            if ($options['pass'] === 'reauth') {
                $options['pass'] = '';
                $this->session->set('Dropbox2AuthParams', [])->set('Dropbox2Tokens', []);
            } elseif ($options['pass'] === 'dropbox2') {
                $options['pass'] = '';
            }

            $options = array_merge($this->session->get('Dropbox2AuthParams', []), $options);

            if (!isset($options['tokens'])) {
                $options['tokens'] = $this->session->get('Dropbox2Tokens', []);
                $this->session->remove('Dropbox2Tokens');
            }
            $aToken = $options['tokens'];
            if (!is_array($aToken) || !isset($aToken['access_token'])) {
                $aToken = [];
            }

            $service = null;
            if ($aToken) {
                try {
                    $dropbox->setAccessToken($aToken['access_token']);
                    $this->session->set('Dropbox2AuthParams', $options);
                } catch (DropboxClientException $e) {
                    $aToken = [];
                    $options['tokens'] = [];
                    if ($options['user'] !== 'init') {
                        $this->session->set('Dropbox2AuthParams', $options);

                        return ['exit' => true, 'error' => elFinder::ERROR_REAUTH_REQUIRE];
                    }
                }
            }

            if ((isset($options['user']) && $options['user'] === 'init') || (isset($_GET['host']) && $_GET['host'] == '1')) {
                if (empty($options['url'])) {
                    $options['url'] = elFinder::getConnectorUrl();
                }

                if (!empty($options['id'])) {
                    $callback = $options['url']
                            . (strpos($options['url'], '?') !== false? '&' : '?') . 'cmd=netmount&protocol=dropbox2&host=' . ($options['id'] === 'elfinder'? '1' : $options['id']);
                }

                $itpCare = isset($options['code']);
                $code = $itpCare? $options['code'] : (isset($_GET['code'])? $_GET['code'] : '');
                $state = $itpCare? $options['state'] : (isset($_GET['state'])? $_GET['state'] : '');
                if (!$aToken && empty($code)) {
                    $url = $authHelper->getAuthUrl($callback);

                    $html = '<input id="elf-volumedriver-dropbox2-host-btn" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" value="{msg:btnApprove}" type="button">';
                    $html .= '<script>
                        jQuery("#' . $options['id'] . '").elfinder("instance").trigger("netmount", {protocol: "dropbox2", mode: "makebtn", url: "' . $url . '"});
                    </script>';
                    if (empty($options['pass']) && $options['host'] !== '1') {
                        $options['pass'] = 'return';
                        $this->session->set('Dropbox2AuthParams', $options);

                        return ['exit' => true, 'body' => $html];
                    } else {
                        $out = [
                            'node' => $options['id'],
                            'json' => '{"protocol": "dropbox2", "mode": "makebtn", "body" : "' . str_replace($html, '"', '\\"') . '", "error" : "' . elFinder::ERROR_ACCESS_DENIED . '"}',
                            'bind' => 'netmount',
                        ];

                        return ['exit' => 'callback', 'out' => $out];
                    }
                } else {
                    if ($code && $state) {
                        if (!empty($options['id'])) {
                            // see https://github.com/kunalvarma05/dropbox-php-sdk/issues/115
                            $authHelper->getPersistentDataStore()->set('state', filter_var($state, FILTER_SANITIZE_STRING));
                            $tokenObj = $authHelper->getAccessToken($code, $state, $callback);
                            $options['tokens'] = [
                                'access_token' => $tokenObj->getToken(),
                                'uid' => $tokenObj->getUid(),
                            ];
                            unset($options['code'], $options['state']);
                            $this->session->set('Dropbox2Tokens', $options['tokens'])->set('Dropbox2AuthParams', $options);
                            $out = [
                                'node' => $options['id'],
                                'json' => '{"protocol": "dropbox2", "mode": "done", "reset": 1}',
                                'bind' => 'netmount',
                            ];
                        } else {
                            $nodeid = ($_GET['host'] === '1')? 'elfinder' : $_GET['host'];
                            $out = [
                                'node' => $nodeid,
                                'json' => json_encode(array(
                                    'protocol' => 'dropbox2',
                                    'host' => $nodeid,
                                    'mode' => 'redirect',
                                    'options' => array(
                                        'id' => $nodeid,
                                        'code' => $code,
                                        'state' => $state
                                    )
                                )),
                                'bind' => 'netmount'
                            ];
                        }
                        if (!$itpCare) {
                            return array('exit' => 'callback', 'out' => $out);
                        } else {
                            return array('exit' => true, 'body' => $out['json']);
                        }
                    }
                    $path = $options['path'];
                    $folders = [];
                    $listFolderContents = $dropbox->listFolder($path);
                    $items = $listFolderContents->getItems();
                    foreach ($items as $item) {
                        $data = $item->getData();
                        if ($data['.tag'] === 'folder') {
                            $folders[$data['path_lower']] = $data['name'];
                        }
                    }
                    natcasesort($folders);

                    if ($options['pass'] === 'folders') {
                        return ['exit' => true, 'folders' => $folders];
                    }

                    $folders = ['/' => '/'] + $folders;
                    $folders = json_encode($folders);
                    $json = '{"protocol": "dropbox2", "mode": "done", "folders": ' . $folders . '}';
                    $options['pass'] = 'return';
                    $html = 'Dropbox.com';
                    $html .= '<script>
                        jQuery("#' . $options['id'] . '").elfinder("instance").trigger("netmount", ' . $json . ');
                    </script>';
                    $this->session->set('Dropbox2AuthParams', $options);

                    return ['exit' => true, 'body' => $html];
                }
            }
        } catch (DropboxClientException $e) {
            $this->session->remove('Dropbox2AuthParams')->remove('Dropbox2Tokens');
            if (empty($options['pass'])) {
                return ['exit' => true, 'body' => '{msg:' . elFinder::ERROR_ACCESS_DENIED . '}' . ' ' . $e->getMessage()];
            } else {
                return ['exit' => true, 'error' => [elFinder::ERROR_ACCESS_DENIED, $e->getMessage()]];
            }
        }

        if (!$aToken) {
            return ['exit' => true, 'error' => elFinder::ERROR_REAUTH_REQUIRE];
        }

        if ($options['path'] === 'root') {
            $options['path'] = '/';
        }

        try {
            if ($options['path'] !== '/') {
                $file = $dropbox->getMetadata($options['path']);
                $name = $file->getName();
            } else {
                $name = 'root';
            }
            $options['alias'] = sprintf($this->options['aliasFormat'], $name);
        } catch (DropboxClientException $e) {
            return ['exit' => true, 'error' => $e->getMessage()];
        }

        foreach (['host', 'user', 'pass', 'id', 'offline'] as $key) {
            unset($options[$key]);
        }

        return $options;
    }

    /**
     * process of on netunmount
     * Drop `Dropbox` & rm thumbs.
     *
     * @param array $options
     *
     * @return bool
     */
    public function netunmount($netVolumes, $key)
    {
        if ($tmbs = glob(rtrim($this->options['tmbPath'], '\\/') . DIRECTORY_SEPARATOR . $this->driverId . '_' . $this->options['tokens']['uid'] . '*.png')) {
            foreach ($tmbs as $file) {
                unlink($file);
            }
        }

        return true;
    }

    /*********************************************************************/
    /*                        INIT AND CONFIGURE                         */
    /*********************************************************************/

    /**
     * Prepare Dropbox connection
     * Connect to remote server and check if credentials are correct, if so, store the connection id in $this->service.
     *
     * @return bool
     * @author Naoki Sawada
     **/
    protected function init()
    {
        if (empty($this->options['app_key'])) {
            if (defined('ELFINDER_DROPBOX_APPKEY') && ELFINDER_DROPBOX_APPKEY) {
                $this->options['app_key'] = ELFINDER_DROPBOX_APPKEY;
            } else {
                return $this->setError('Required option "app_key" is undefined.');
            }
        }
        if (empty($this->options['app_secret'])) {
            if (defined('ELFINDER_DROPBOX_APPSECRET') && ELFINDER_DROPBOX_APPSECRET) {
                $this->options['app_secret'] = ELFINDER_DROPBOX_APPSECRET;
            } else {
                return $this->setError('Required option "app_secret" is undefined.');
            }
        }
        if (isset($this->options['tokens']) && is_array($this->options['tokens']) && !empty($this->options['tokens']['access_token'])) {
            $this->options['access_token'] = $this->options['tokens']['access_token'];
        }
        if (!$this->options['access_token']) {
            return $this->setError('Required option "access_token" or "refresh_token" is undefined.');
        }

        try {
            // make net mount key for network mount
            $aToken = $this->options['access_token'];
            $this->netMountKey = md5($aToken . '-' . $this->options['path']);

            $errors = [];
            if ($this->needOnline && !$this->service) {
                $app = new DropboxApp($this->options['app_key'], $this->options['app_secret'], $aToken);
                $this->service = new Dropbox($app);
                // to check access_token
                $this->service->getCurrentAccount();
            }
        } catch (DropboxClientException $e) {
            $errors[] = 'Dropbox error: ' . $e->getMessage();
        } catch (Exception $e) {
            $errors[] = $e->getMessage();
        }

        if ($this->needOnline && !$this->service) {
            $errors[] = 'Dropbox Service could not be loaded.';
        }

        if ($errors) {
            return $this->setError($errors);
        }

        // normalize root path
        $this->options['path'] = strtolower($this->options['path']);
        if ($this->options['path'] == 'root') {
            $this->options['path'] = '/';
        }
        $this->root = $this->options['path'] = $this->_normpath($this->options['path']);

        if (empty($this->options['alias'])) {
            $this->options['alias'] = sprintf($this->options['aliasFormat'], ($this->options['path'] === '/') ? 'Root' : $this->_basename($this->options['path']));
            if (!empty($this->options['netkey'])) {
                elFinder::$instance->updateNetVolumeOption($this->options['netkey'], 'alias', $this->options['alias']);
            }
        }

        $this->rootName = $this->options['alias'];

        if (!empty($this->options['tmpPath'])) {
            if ((is_dir($this->options['tmpPath']) || mkdir($this->options['tmpPath'])) && is_writable($this->options['tmpPath'])) {
                $this->tmp = $this->options['tmpPath'];
            }
        }

        if (!$this->tmp && ($tmp = elFinder::getStaticVar('commonTempPath'))) {
            $this->tmp = $tmp;
        }

        // This driver dose not support `syncChkAsTs`
        $this->options['syncChkAsTs'] = false;

        // 'lsPlSleep' minmum 10 sec
        $this->options['lsPlSleep'] = max(10, $this->options['lsPlSleep']);

        // enable command archive
        $this->options['useRemoteArchive'] = true;

        return true;
    }

    /**
     * Configure after successfull mount.
     *
     * @author Naoki Sawada
     * @throws elFinderAbortException
     */
    protected function configure()
    {
        parent::configure();

        // fallback of $this->tmp
        if (!$this->tmp && $this->tmbPathWritable) {
            $this->tmp = $this->tmbPath;
        }

        if ($this->isMyReload()) {
            //$this->_db_getDirectoryData(false);
        }
    }

    /*********************************************************************/
    /*                               FS API                              */
    /*********************************************************************/

    /**
     * Close opened connection.
     **/
    public function umount()
    {
    }

    /**
     * Cache dir contents.
     *
     * @param string $path dir path
     *
     * @return
     * @author Naoki Sawada
     */
    protected function cacheDir($path)
    {
        $this->dirsCache[$path] = [];
        $hasDir = false;

        $res = $this->service->listFolder($path, $this->FETCH_OPTIONS);

        if ($res) {
            $items = $res->getItems()->all();
            foreach ($items as $raw) {
                if ($stat = $this->_db_parseRaw($raw)) {
                    $mountPath = $this->_joinPath($path, $stat['name']);
                    $stat = $this->updateCache($mountPath, $stat);
                    if (empty($stat['hidden']) && $path !== $mountPath) {
                        if (!$hasDir && $stat['mime'] === 'directory') {
                            $hasDir = true;
                        }
                        $this->dirsCache[$path][] = $mountPath;
                    }
                }
            }
        }

        if (isset($this->sessionCache['subdirs'])) {
            $this->sessionCache['subdirs'][$path] = $hasDir;
        }

        return $this->dirsCache[$path];
    }

    /**
     * Recursive files search.
     *
     * @param string $path dir path
     * @param string $q    search string
     * @param array  $mimes
     *
     * @return array
     * @throws elFinderAbortException
     * @author Naoki Sawada
     */
    protected function doSearch($path, $q, $mimes)
    {
        if (!empty($this->doSearchCurrentQuery['matchMethod']) || $mimes) {
            // has custom match method or mimes, use elFinderVolumeDriver::doSearch()
            return parent::doSearch($path, $q, $mimes);
        }

        $timeout = $this->options['searchTimeout'] ? $this->searchStart + $this->options['searchTimeout'] : 0;

        $searchRes = $this->service->search($path, $q, ['start' => 0, 'max_results' => 1000]);
        $items = $searchRes->getItems();
        $more = $searchRes->hasMoreItems();
        while ($more) {
            if ($timeout && $timeout < time()) {
                $this->setError(elFinder::ERROR_SEARCH_TIMEOUT, $this->_path($path));
                break;
            }
            $searchRes = $this->service->search($path, $q, ['start' => $searchRes->getCursor(), 'max_results' => 1000]);
            $more = $searchRes->hasMoreItems();
            $items = $items->merge($searchRes->getItems());
        }

        $result = [];
        foreach ($items as $raw) {
            if ($stat = $this->_db_parseRaw($raw->getMetadata())) {
                $stat = $this->updateCache($stat['path'], $stat);
                if (empty($stat['hidden'])) {
                    $result[] = $stat;
                }
            }
        }

        return $result;
    }

    /**
     * Copy file/recursive copy dir only in current volume.
     * Return new file path or false.
     *
     * @param string $src  source path
     * @param string $dst  destination dir path
     * @param string $name new file name (optionaly)
     *
     * @return string|false
     * @throws elFinderAbortException
     * @author Naoki Sawada
     */
    protected function copy($src, $dst, $name)
    {
        $srcStat = $this->stat($src);
        $target = $this->_joinPath($dst, $name);
        $tgtStat = $this->stat($target);
        if ($tgtStat) {
            if ($srcStat['mime'] === 'directory') {
                return parent::copy($src, $dst, $name);
            } else {
                $this->_unlink($target);
            }
        }
        $this->clearcache();
        if ($res = $this->_copy($src, $dst, $name)) {
            $this->added[] = $this->stat($target);
            $res = $target;
        }

        return $res;
    }

    /**
     * Remove file/ recursive remove dir.
     *
     * @param string $path  file path
     * @param bool   $force try to remove even if file locked
     * @param bool   $recursive
     *
     * @return bool
     * @throws elFinderAbortException
     * @author Naoki Sawada
     */
    protected function remove($path, $force = false, $recursive = false)
    {
        $stat = $this->stat($path);
        $stat['realpath'] = $path;
        $this->rmTmb($stat);
        $this->clearcache();

        if (empty($stat)) {
            return $this->setError(elFinder::ERROR_RM, $this->_path($path), elFinder::ERROR_FILE_NOT_FOUND);
        }

        if (!$force && !empty($stat['locked'])) {
            return $this->setError(elFinder::ERROR_LOCKED, $this->_path($path));
        }

        if ($stat['mime'] == 'directory') {
            if (!$recursive && !$this->_rmdir($path)) {
                return $this->setError(elFinder::ERROR_RM, $this->_path($path));
            }
        } else {
            if (!$recursive && !$this->_unlink($path)) {
                return $this->setError(elFinder::ERROR_RM, $this->_path($path));
            }
        }

        $this->removed[] = $stat;

        return true;
    }

    /**
     * Create thumnbnail and return it's URL on success.
     *
     * @param string $path file path
     * @param        $stat
     *
     * @return string|false
     * @throws ImagickException
     * @throws elFinderAbortException
     * @author Naoki Sawada
     */
    protected function createTmb($path, $stat)
    {
        if (!$stat || !$this->canCreateTmb($path, $stat)) {
            return false;
        }

        $name = $this->tmbname($stat);
        $tmb = $this->tmbPath . DIRECTORY_SEPARATOR . $name;

        // copy image into tmbPath so some drivers does not store files on local fs
        if (!$data = $this->_db_getThumbnail($path)) {
            return false;
        }
        if (!file_put_contents($tmb, $data)) {
            return false;
        }

        $tmbSize = $this->tmbSize;

        if (($s = getimagesize($tmb)) == false) {
            return false;
        }

        $result = true;

        /* If image smaller or equal thumbnail size - just fitting to thumbnail square */
        if ($s[0] <= $tmbSize && $s[1] <= $tmbSize) {
            $result = $this->imgSquareFit($tmb, $tmbSize, $tmbSize, 'center', 'middle', $this->options['tmbBgColor'], 'png');
        } else {
            if ($this->options['tmbCrop']) {

                /* Resize and crop if image bigger than thumbnail */
                if (!(($s[0] > $tmbSize && $s[1] <= $tmbSize) || ($s[0] <= $tmbSize && $s[1] > $tmbSize)) || ($s[0] > $tmbSize && $s[1] > $tmbSize)) {
                    $result = $this->imgResize($tmb, $tmbSize, $tmbSize, true, false, 'png');
                }

                if ($result && ($s = getimagesize($tmb)) != false) {
                    $x = $s[0] > $tmbSize ? intval(($s[0] - $tmbSize) / 2) : 0;
                    $y = $s[1] > $tmbSize ? intval(($s[1] - $tmbSize) / 2) : 0;
                    $result = $this->imgCrop($tmb, $tmbSize, $tmbSize, $x, $y, 'png');
                }
            } else {
                $result = $this->imgResize($tmb, $tmbSize, $tmbSize, true, true, 'png');
            }

            if ($result) {
                $result = $this->imgSquareFit($tmb, $tmbSize, $tmbSize, 'center', 'middle', $this->options['tmbBgColor'], 'png');

            }
        }

        if (!$result) {
            unlink($tmb);

            return false;
        }

        return $name;
    }

    /**
     * Return thumbnail file name for required file.
     *
     * @param array $stat file stat
     *
     * @return string
     * @author Naoki Sawada
     **/
    protected function tmbname($stat)
    {
        $name = $this->driverId . '_';
        if (isset($this->options['tokens']) && is_array($this->options['tokens'])) {
            $name .= $this->options['tokens']['uid'];
        }

        return $name . md5($stat['iid']) . $stat['ts'] . '.png';
    }

    /**
     * Return content URL (for netmout volume driver)
     * If file.url == 1 requests from JavaScript client with XHR.
     *
     * @param string $hash    file hash
     * @param array  $options options array
     *
     * @return bool|string
     * @author Naoki Sawada
     */
    public function getContentUrl($hash, $options = [])
    {
        if (!empty($options['onetime']) && $this->options['onetimeUrl']) {
            return parent::getContentUrl($hash, $options);
        }
        if (!empty($options['temporary'])) {
            // try make temporary file
            $url = parent::getContentUrl($hash, $options);
            if ($url) {
                return $url;
            }
        }
        $file = $this->file($hash);
        if (($file = $this->file($hash)) !== false && (!$file['url'] || $file['url'] == 1)) {
            $path = $this->decode($hash);
            $url = '';
            try {
                $res = $this->service->postToAPI('/sharing/list_shared_links', ['path' => $path, 'direct_only' => true])->getDecodedBody();
                if ($res && !empty($res['links'])) {
                    foreach ($res['links'] as $link) {
                        if (isset($link['link_permissions'])
                            && isset($link['link_permissions']['requested_visibility'])
                            && $link['link_permissions']['requested_visibility']['.tag'] === $this->options['publishPermission']['requested_visibility']) {
                            $url = $link['url'];
                            break;
                        }
                    }
                }
                if (!$url) {
                    $res = $this->service->postToAPI('/sharing/create_shared_link_with_settings', ['path' => $path, 'settings' => $this->options['publishPermission']])->getDecodedBody();
                    if (isset($res['url'])) {
                        $url = $res['url'];
                    }
                }
                if ($url) {
                    $url = str_replace('www.dropbox.com', 'dl.dropboxusercontent.com', $url);
                    $url = str_replace('?dl=0', '', $url);

                    return $url;
                }
            } catch (DropboxClientException $e) {
                return $this->setError('Dropbox error: ' . $e->getMessage());
            }
        }

        return false;
    }

    /**
     * Return debug info for client.
     *
     * @return array
     **/
    public function debug()
    {
        $res = parent::debug();
        if (!empty($this->options['netkey']) && isset($this->options['tokens']) && !empty($this->options['tokens']['uid'])) {
            $res['Dropbox uid'] = $this->options['tokens']['uid'];
            $res['access_token'] = $this->options['tokens']['access_token'];
        }

        return $res;
    }

    /*********************** paths/urls *************************/

    /**
     * Return parent directory path.
     *
     * @param string $path file path
     *
     * @return string
     * @author Naoki Sawada
     **/
    protected function _dirname($path)
    {
        list($dirname) = $this->_db_splitPath($path);

        return $dirname;
    }

    /**
     * Return file name.
     *
     * @param string $path file path
     *
     * @return string
     * @author Naoki Sawada
     **/
    protected function _basename($path)
    {
        list(, $basename) = $this->_db_splitPath($path);

        return $basename;
    }

    /**
     * Join dir name and file name and retur full path.
     *
     * @param string $dir
     * @param string $name
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _joinPath($dir, $name)
    {
        return rtrim($dir, '/') . '/' . strtolower($name);
    }

    /**
     * Return normalized path, this works the same as os.path.normpath() in Python.
     *
     * @param string $path path
     *
     * @return string
     * @author Naoki Sawada
     **/
    protected function _normpath($path)
    {
        return '/' . ltrim($path, '/');
    }

    /**
     * Return file path related to root dir.
     *
     * @param string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _relpath($path)
    {
        if ($path === $this->root) {
            return '';
        } else {
            return ltrim(substr($path, strlen($this->root)), '/');
        }
    }

    /**
     * Convert path related to root dir into real path.
     *
     * @param string $path file path
     *
     * @return string
     * @author Naoki Sawada
     **/
    protected function _abspath($path)
    {
        if ($path === '/') {
            return $this->root;
        } else {
            return $this->_joinPath($this->root, $path);
        }
    }

    /**
     * Return fake path started from root dir.
     *
     * @param string $path file path
     *
     * @return string
     * @author Naoki Sawada
     **/
    protected function _path($path)
    {
        $path = $this->_normpath(substr($path, strlen($this->root)));

        return $path;
    }

    /**
     * Return true if $path is children of $parent.
     *
     * @param string $path   path to check
     * @param string $parent parent path
     *
     * @return bool
     * @author Naoki Sawada
     **/
    protected function _inpath($path, $parent)
    {
        return $path == $parent || strpos($path, $parent . '/') === 0;
    }

    /***************** file stat ********************/
    /**
     * Return stat for given path.
     * Stat contains following fields:
     * - (int)    size    file size in b. required
     * - (int)    ts      file modification time in unix time. required
     * - (string) mime    mimetype. required for folders, others - optionally
     * - (bool)   read    read permissions. required
     * - (bool)   write   write permissions. required
     * - (bool)   locked  is object locked. optionally
     * - (bool)   hidden  is object hidden. optionally
     * - (string) alias   for symlinks - link target path relative to root path. optionally
     * - (string) target  for symlinks - link target path. optionally.
     * If file does not exists - returns empty array or false.
     *
     * @param string $path file path
     *
     * @return array|false
     * @author Dmitry (dio) Levashov
     **/
    protected function _stat($path)
    {
        if ($raw = $this->_db_getFile($path)) {
            return $this->_db_parseRaw($raw);
        }

        return false;
    }

    /**
     * Return true if path is dir and has at least one childs directory.
     *
     * @param string $path dir path
     *
     * @return bool
     * @author Naoki Sawada
     **/
    protected function _subdirs($path)
    {
        $hasdir = false;

        try {
            $res = $this->service->listFolder($path);
            if ($res) {
                $items = $res->getItems();
                foreach ($items as $raw) {
                    if ($raw instanceof FolderMetadata) {
                        $hasdir = true;
                        break;
                    }
                }
            }
        } catch (DropboxClientException $e) {
            $this->setError('Dropbox error: ' . $e->getMessage());
        }

        return $hasdir;
    }

    /**
     * Return object width and height
     * Ususaly used for images, but can be realize for video etc...
     *
     * @param string $path file path
     * @param string $mime file mime type
     *
     * @return string
     * @throws ImagickException
     * @throws elFinderAbortException
     * @author Naoki Sawada
     */
    protected function _dimensions($path, $mime)
    {
        if (strpos($mime, 'image') !== 0) {
            return '';
        }
        $ret = '';

        if ($data = $this->_getContents($path)) {
            $tmp = $this->getTempFile();
            file_put_contents($tmp, $data);
            $size = getimagesize($tmp);
            if ($size) {
                $ret = array('dim' => $size[0] . 'x' . $size[1]);
                $srcfp = fopen($tmp, 'rb');
                $target = isset(elFinder::$currentArgs['target'])? elFinder::$currentArgs['target'] : '';
                if ($subImgLink = $this->getSubstituteImgLink($target, $size, $srcfp)) {
                    $ret['url'] = $subImgLink;
                }
            }
        }

        return $ret;
    }

    /******************** file/dir content *********************/

    /**
     * Return files list in directory.
     *
     * @param string $path dir path
     *
     * @return array
     * @author Naoki Sawada
     **/
    protected function _scandir($path)
    {
        return isset($this->dirsCache[$path])
            ? $this->dirsCache[$path]
            : $this->cacheDir($path);
    }

    /**
     * Open file and return file pointer.
     *
     * @param string $path  file path
     * @param bool   $write open file for writing
     *
     * @return resource|false
     * @author Naoki Sawada
     **/
    protected function _fopen($path, $mode = 'rb')
    {
        if ($mode === 'rb' || $mode === 'r') {
            if ($link = $this->service->getTemporaryLink($path)) {
                $access_token = $this->service->getAccessToken();
                if ($access_token) {
                    $data = array(
                        'target' => $link->getLink(),
                        'headers' => array('Authorization: Bearer ' . $access_token),
                    );

                    // to support range request
                    if (func_num_args() > 2) {
                        $opts = func_get_arg(2);
                    } else {
                        $opts = array();
                    }
                    if (!empty($opts['httpheaders'])) {
                        $data['headers'] = array_merge($opts['httpheaders'], $data['headers']);
                    }

                    return elFinder::getStreamByUrl($data);
                }
            }
        }

        return false;
    }

    /**
     * Close opened file.
     *
     * @param resource $fp file pointer
     *
     * @return bool
     * @author Naoki Sawada
     **/
    protected function _fclose($fp, $path = '')
    {
        is_resource($fp) && fclose($fp);
    }

    /********************  file/dir manipulations *************************/

    /**
     * Create dir and return created dir path or false on failed.
     *
     * @param string $path parent dir path
     * @param string $name new directory name
     *
     * @return string|bool
     * @author Naoki Sawada
     **/
    protected function _mkdir($path, $name)
    {
        try {
            return $this->service->createFolder($this->_db_joinName($path, $name))->getPathLower();
        } catch (DropboxClientException $e) {
            return $this->setError('Dropbox error: ' . $e->getMessage());
        }
    }

    /**
     * Create file and return it's path or false on failed.
     *
     * @param string $path parent dir path
     * @param string $name new file name
     *
     * @return string|bool
     * @author Naoki Sawada
     **/
    protected function _mkfile($path, $name)
    {
        return $this->_save($this->tmpfile(), $path, $name, []);
    }

    /**
     * Create symlink. FTP driver does not support symlinks.
     *
     * @param string $target link target
     * @param string $path   symlink path
     *
     * @return bool
     * @author Naoki Sawada
     **/
    protected function _symlink($target, $path, $name)
    {
        return false;
    }

    /**
     * Copy file into another file.
     *
     * @param string $source    source file path
     * @param string $targetDir target directory path
     * @param string $name      new file name
     *
     * @return bool
     * @author Naoki Sawada
     **/
    protected function _copy($source, $targetDir, $name)
    {
        try {
            $this->service->copy($source, $this->_db_joinName($targetDir, $name))->getPathLower();
        } catch (DropboxClientException $e) {
            return $this->setError('Dropbox error: ' . $e->getMessage());
        }

        return true;
    }

    /**
     * Move file into another parent dir.
     * Return new file path or false.
     *
     * @param string $source source file path
     * @param string $target target dir path
     * @param string $name   file name
     *
     * @return string|bool
     * @author Naoki Sawada
     **/
    protected function _move($source, $targetDir, $name)
    {
        try {
            return $this->service->move($source, $this->_db_joinName($targetDir, $name))->getPathLower();
        } catch (DropboxClientException $e) {
            return $this->setError('Dropbox error: ' . $e->getMessage());
        }
    }

    /**
     * Remove file.
     *
     * @param string $path file path
     *
     * @return bool
     * @author Naoki Sawada
     **/
    protected function _unlink($path)
    {
        try {
            $this->service->delete($path);

            return true;
        } catch (DropboxClientException $e) {
            return $this->setError('Dropbox error: ' . $e->getMessage());
        }

        return true;
    }

    /**
     * Remove dir.
     *
     * @param string $path dir path
     *
     * @return bool
     * @author Naoki Sawada
     **/
    protected function _rmdir($path)
    {
        return $this->_unlink($path);
    }

    /**
     * Create new file and write into it from file pointer.
     * Return new file path or false on error.
     *
     * @param resource $fp   file pointer
     * @param string   $dir  target dir path
     * @param string   $name file name
     * @param array    $stat file stat (required by some virtual fs)
     *
     * @return bool|string
     * @author Naoki Sawada
     **/
    protected function _save($fp, $path, $name, $stat)
    {
        try {
            $info = stream_get_meta_data($fp);
            if (empty($info['uri']) || preg_match('#^[a-z0-9.-]+://#', $info['uri'])) {
                if ($filepath = $this->getTempFile()) {
                    $_fp = fopen($filepath, 'wb');
                    stream_copy_to_stream($fp, $_fp);
                    fclose($_fp);
                }
            } else {
                $filepath = $info['uri'];
            }
            $dropboxFile = new DropboxFile($filepath);
            if ($name === '') {
                $fullpath = $path;
            } else {
                $fullpath = $this->_db_joinName($path, $name);
            }

            return $this->service->upload($dropboxFile, $fullpath, ['mode' => 'overwrite'])->getPathLower();
        } catch (DropboxClientException $e) {
            return $this->setError('Dropbox error: ' . $e->getMessage());
        }
    }

    /**
     * Get file contents.
     *
     * @param string $path file path
     *
     * @return string|false
     * @author Naoki Sawada
     **/
    protected function _getContents($path)
    {
        $contents = '';

        try {
            $file = $this->service->download($path);
            $contents = $file->getContents();
        } catch (Exception $e) {
            return $this->setError('Dropbox error: ' . $e->getMessage());
        }

        return $contents;
    }

    /**
     * Write a string to a file.
     *
     * @param string $path    file path
     * @param string $content new file content
     *
     * @return bool
     * @author Naoki Sawada
     **/
    protected function _filePutContents($path, $content)
    {
        $res = false;

        if ($local = $this->getTempFile($path)) {
            if (file_put_contents($local, $content, LOCK_EX) !== false
                && ($fp = fopen($local, 'rb'))) {
                clearstatcache();
                $name = '';
                $stat = $this->stat($path);
                if ($stat) {
                    // keep real name
                    $path = $this->_dirname($path);
                    $name = $stat['name'];
                }
                $res = $this->_save($fp, $path, $name, []);
                fclose($fp);
            }
            file_exists($local) && unlink($local);
        }

        return $res;
    }

    /**
     * Detect available archivers.
     **/
    protected function _checkArchivers()
    {
        // die('Not yet implemented. (_checkArchivers)');
        return [];
    }

    /**
     * chmod implementation.
     *
     * @return bool
     **/
    protected function _chmod($path, $mode)
    {
        return false;
    }

    /**
     * Unpack archive.
     *
     * @param string $path archive path
     * @param array  $arc  archiver command and arguments (same as in $this->archivers)
     *
     * @return true
     * @author Dmitry (dio) Levashov
     * @author Alexey Sukhotin
     **/
    protected function _unpack($path, $arc)
    {
        die('Not yet implemented. (_unpack)');
        //return false;
    }

    /**
     * Recursive symlinks search.
     *
     * @param string $path file/dir path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _findSymlinks($path)
    {
        die('Not yet implemented. (_findSymlinks)');
    }

    /**
     * Extract files from archive.
     *
     * @param string $path archive path
     * @param array  $arc  archiver command and arguments (same as in $this->archivers)
     *
     * @return true
     * @author Dmitry (dio) Levashov,
     * @author Alexey Sukhotin
     **/
    protected function _extract($path, $arc)
    {
        die('Not yet implemented. (_extract)');
    }

    /**
     * Create archive and return its path.
     *
     * @param string $dir   target dir
     * @param array  $files files names list
     * @param string $name  archive name
     * @param array  $arc   archiver options
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov,
     * @author Alexey Sukhotin
     **/
    protected function _archive($dir, $files, $name, $arc)
    {
        die('Not yet implemented. (_archive)');
    }
} // END class
php/elFinderVolumeSFTPphpseclib.class.php000064400000065150151215013420014460 0ustar00<?php

/**
 * Simple elFinder driver for SFTP using phpseclib 1
 *
 * @author Dmitry (dio) Levashov
 * @author Cem (discofever), sitecode
 * @reference http://phpseclib.sourceforge.net/sftp/2.0/examples.html
 **/
class elFinderVolumeSFTPphpseclib extends elFinderVolumeFTP {

    /**
     * Constructor
     * Extend options with required fields
     *
     * @author Dmitry (dio) Levashov
     * @author Cem (DiscoFever)
     */
    public function __construct()
    {
        $opts = array(
            'host' => 'localhost',
            'user' => '',
            'pass' => '',
            'port' => 22,
            'path' => '/',
            'timeout' => 20,
            'owner' => true,
            'tmbPath' => '',
            'tmpPath' => '',
            'separator' => '/',
            'phpseclibDir' => '../phpseclib/',
            'connectCallback' => null, //provide your own already instantiated phpseclib $Sftp object returned by this callback
                                       //'connectCallback'=> function($options) {
                                       //     //load and instantiate phpseclib $sftp
                                       //     return $sftp;
                                       // },
            'checkSubfolders' => -1,
            'dirMode' => 0755,
            'fileMode' => 0644,
            'rootCssClass' => 'elfinder-navbar-root-ftp',
        );
        $this->options = array_merge($this->options, $opts);
        $this->options['mimeDetect'] = 'internal';
    }

    /**
     * Prepare
     * Call from elFinder::netmout() before volume->mount()
     *
     * @param $options
     *
     * @return array volume root options
     * @author Naoki Sawada
     */
    public function netmountPrepare($options)
    {
        $options['statOwner'] = true;
        $options['allowChmodReadOnly'] = true;
        $options['acceptedName'] = '#^[^/\\?*:|"<>]*[^./\\?*:|"<>]$#';
        return $options;
    }

    /*********************************************************************/
    /*                        INIT AND CONFIGURE                         */
    /*********************************************************************/

    /**
     * Prepare SFTP connection
     * Connect to remote server and check if credentials are correct, if so, store the connection
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     * @author Cem (DiscoFever)
     **/
    protected function init()
    {
        if (!$this->options['connectCallback']) {
            if (!$this->options['host']
                || !$this->options['port']) {
                return $this->setError('Required options undefined.');
            }

            if (!$this->options['path']) {
                $this->options['path'] = '/';
            }

            // make net mount key
            $this->netMountKey = md5(join('-', array('sftpphpseclib', $this->options['host'], $this->options['port'], $this->options['path'], $this->options['user'])));

            set_include_path(get_include_path() . PATH_SEPARATOR . getcwd().'/'.$this->options['phpseclibDir']);
            include_once('Net/SFTP.php');

            if (!class_exists('Net_SFTP')) {
                return $this->setError('SFTP extension not loaded. Install phpseclib version 1: http://phpseclib.sourceforge.net/ Set option "phpseclibDir" accordingly.');
            }

            // remove protocol from host
            $scheme = parse_url($this->options['host'], PHP_URL_SCHEME);

            if ($scheme) {
                $this->options['host'] = substr($this->options['host'], strlen($scheme) + 3);
            }
        } else {
            // make net mount key
            $this->netMountKey = md5(join('-', array('sftpphpseclib', $this->options['path'])));
        }

        // normalize root path
        $this->root = $this->options['path'] = $this->_normpath($this->options['path']);

        if (empty($this->options['alias'])) {
            $this->options['alias'] = $this->options['user'] . '@' . $this->options['host'];
            if (!empty($this->options['netkey'])) {
                elFinder::$instance->updateNetVolumeOption($this->options['netkey'], 'alias', $this->options['alias']);
            }
        }

        $this->rootName = $this->options['alias'];
        $this->options['separator'] = '/';

        if (is_null($this->options['syncChkAsTs'])) {
            $this->options['syncChkAsTs'] = true;
        }

        return $this->needOnline? $this->connect() : true;

    }


    /**
     * Configure after successfull mount.
     *
     * @return void
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function configure()
    {
        parent::configure();

        if (!$this->tmp) {
            $this->disabled[] = 'mkfile';
            $this->disabled[] = 'paste';
            $this->disabled[] = 'upload';
            $this->disabled[] = 'edit';
            //$this->disabled[] = 'archive';
            //$this->disabled[] = 'extract';
        }

        $this->disabled[] = 'archive';
        $this->disabled[] = 'extract';
    }

    /**
     * Connect to sftp server
     *
     * @return bool
     * @author sitecode
     **/
    protected function connect()
    {
        //use ca
        if ($this->options['connectCallback']) {
            $this->connect = $this->options['connectCallback']($this->options);
            if (!$this->connect || !$this->connect->isConnected()) {
                return $this->setError('Unable to connect successfully');
            }

            return true;
        }

        try{
            $host = $this->options['host'] . ($this->options['port'] != 22 ? ':' . $this->options['port'] : '');
            $this->connect = new Net_SFTP($host);
            //TODO check fingerprint before login, fail if no match to last time
            if (!$this->connect->login($this->options['user'], $this->options['pass'])) {
                return $this->setError('Unable to connect to SFTP server ' . $host);
            }
        } catch (Exception $e) {
            return $this->setError('Error while connecting to SFTP server '  . $host . ': ' . $e->getMessage());
        }

        if (!$this->connect->chdir($this->root)
            /*|| $this->root != $this->connect->pwd()*/) {
            //$this->umount();
            return $this->setError('Unable to open root folder.');
        }

        return true;
    }

    /**
     * Call rawlist
     *
     * @param string $path
     *
     * @return array
     */
    protected function ftpRawList($path)
    {
        return $this->connect->rawlist($path ?: '.') ?: [];
/*
        $raw = $this->connect->rawlist($path ?: '.') ?: [];
        $raw = array_map(function($key, $value) {
            $value['name'] = $key;
            return $value;
        }, array_keys($raw), $raw);
        return $raw;
*/
    }

    /*********************************************************************/
    /*                               FS API                              */
    /*********************************************************************/

    /**
     * Close opened connection
     *
     * @return void
     * @author Dmitry (dio) Levashov
     **/
    public function umount()
    {
        $this->connect && $this->connect->disconnect();
    }


    /**
     * Parse line from rawlist() output and return file stat (array)
     *
     * @param  string $raw line from rawlist() output
     * @param         $base
     * @param bool    $nameOnly
     *
     * @return array
     * @author Dmitry Levashov
     */
    protected function parseRaw($raw, $base, $nameOnly = false)
    {
        $info = $raw;
        $stat = array();

        if ($info['filename'] == '.' || $info['filename'] == '..') {
            return false;
        }

        $name = $info['filename'];

        if (preg_match('|(.+)\-\>(.+)|', $name, $m)) {
            $name = trim($m[1]);
            // check recursive processing
            if ($this->cacheDirTarget && $this->_joinPath($base, $name) !== $this->cacheDirTarget) {
                return array();
            }
            if (!$nameOnly) {
                $target = trim($m[2]);
                if (substr($target, 0, 1) !== $this->separator) {
                    $target = $this->getFullPath($target, $base);
                }
                $target = $this->_normpath($target);
                $stat['name'] = $name;
                $stat['target'] = $target;
                return $stat;
            }
        }

        if ($nameOnly) {
            return array('name' => $name);
        }

        $stat['ts'] = $info['mtime'];

        if ($this->options['statOwner']) {
            $stat['owner'] = $info['uid'];
            $stat['group'] = $info['gid'];
            $stat['perm'] = $info['permissions'];
            $stat['isowner'] = isset($stat['owner']) ? ($this->options['owner'] ? true : ($stat['owner'] == $this->options['user'])) : true;
        }

        $owner_computed = isset($stat['isowner']) ? $stat['isowner'] : $this->options['owner'];
        $perm = $this->parsePermissions($info['permissions'], $owner_computed);
        $stat['name'] = $name;
        $stat['mime'] = $info['type'] == NET_SFTP_TYPE_DIRECTORY ? 'directory' : $this->mimetype($stat['name'], true);
        $stat['size'] = $stat['mime'] == 'directory' ? 0 : $info['size'];
        $stat['read'] = $perm['read'];
        $stat['write'] = $perm['write'];

        return $stat;
    }

    /**
     * Parse permissions string. Return array(read => true/false, write => true/false)
     *
     * @param  int $perm
     *                                             The isowner parameter is computed by the caller.
     *                                             If the owner parameter in the options is true, the user is the actual owner of all objects even if the user used in the ftp Login
     *                                             is different from the file owner id.
     *                                             If the owner parameter is false to understand if the user is the file owner we compare the ftp user with the file owner id.
     * @param Boolean $isowner                     . Tell if the current user is the owner of the object.
     *
     * @return array
     * @author Dmitry (dio) Levashov
     * @author sitecode
     */
    protected function parsePermissions($permissions, $isowner = true)
    {
        $permissions = decoct($permissions);
        $perm = $isowner ? decbin($permissions[-3]) : decbin($permissions[-1]);

        return array(
            'read' => $perm[-3],
            'write' => $perm[-2]
        );
    }

    /**
     * Cache dir contents
     *
     * @param  string $path dir path
     *
     * @return void
     * @author Dmitry Levashov, sitecode
     **/
    protected function cacheDir($path)
    {
        $this->dirsCache[$path] = array();
        $hasDir = false;

        $list = array();
        $encPath = $this->convEncIn($path);
        foreach ($this->ftpRawList($encPath) as $raw) {
            if (($stat = $this->parseRaw($raw, $encPath))) {
                $list[] = $stat;
            }
        }
        $list = $this->convEncOut($list);
        $prefix = ($path === $this->separator) ? $this->separator : $path . $this->separator;
        $targets = array();
        foreach ($list as $stat) {
            $p = $prefix . $stat['name'];
            if (isset($stat['target'])) {
                // stat later
                $targets[$stat['name']] = $stat['target'];
            } else {
                $stat = $this->updateCache($p, $stat);
                if (empty($stat['hidden'])) {
                    if (!$hasDir && $stat['mime'] === 'directory') {
                        $hasDir = true;
                    }
                    $this->dirsCache[$path][] = $p;
                }
            }
        }
        // stat link targets
        foreach ($targets as $name => $target) {
            $stat = array();
            $stat['name'] = $name;
            $p = $prefix . $name;
            $cacheDirTarget = $this->cacheDirTarget;
            $this->cacheDirTarget = $this->convEncIn($target, true);
            if ($tstat = $this->stat($target)) {
                $stat['size'] = $tstat['size'];
                $stat['alias'] = $target;
                $stat['thash'] = $tstat['hash'];
                $stat['mime'] = $tstat['mime'];
                $stat['read'] = $tstat['read'];
                $stat['write'] = $tstat['write'];

                if (isset($tstat['ts'])) {
                    $stat['ts'] = $tstat['ts'];
                }
                if (isset($tstat['owner'])) {
                    $stat['owner'] = $tstat['owner'];
                }
                if (isset($tstat['group'])) {
                    $stat['group'] = $tstat['group'];
                }
                if (isset($tstat['perm'])) {
                    $stat['perm'] = $tstat['perm'];
                }
                if (isset($tstat['isowner'])) {
                    $stat['isowner'] = $tstat['isowner'];
                }
            } else {

                $stat['mime'] = 'symlink-broken';
                $stat['read'] = false;
                $stat['write'] = false;
                $stat['size'] = 0;

            }
            $this->cacheDirTarget = $cacheDirTarget;
            $stat = $this->updateCache($p, $stat);
            if (empty($stat['hidden'])) {
                if (!$hasDir && $stat['mime'] === 'directory') {
                    $hasDir = true;
                }
                $this->dirsCache[$path][] = $p;
            }
        }

        if (isset($this->sessionCache['subdirs'])) {
            $this->sessionCache['subdirs'][$path] = $hasDir;
        }
    }


    /***************** file stat ********************/

    /**
     * Return stat for given path.
     * Stat contains following fields:
     * - (int)    size    file size in b. required
     * - (int)    ts      file modification time in unix time. required
     * - (string) mime    mimetype. required for folders, others - optionally
     * - (bool)   read    read permissions. required
     * - (bool)   write   write permissions. required
     * - (bool)   locked  is object locked. optionally
     * - (bool)   hidden  is object hidden. optionally
     * - (string) alias   for symlinks - link target path relative to root path. optionally
     * - (string) target  for symlinks - link target path. optionally
     * If file does not exists - returns empty array or false.
     *
     * @param  string $path file path
     *
     * @return array|false
     * @author Dmitry (dio) Levashov
     **/
    protected function _stat($path)
    {
        $outPath = $this->convEncOut($path);
        if (isset($this->cache[$outPath])) {
            return $this->convEncIn($this->cache[$outPath]);
        } else {
            $this->convEncIn();
        }
        if ($path === $this->root) {
            $res = array(
                'name' => $this->root,
                'mime' => 'directory',
                'dirs' => -1
            );
            if ($this->needOnline && (($this->ARGS['cmd'] === 'open' && $this->ARGS['target'] === $this->encode($this->root)) || $this->isMyReload())) {
                $check = array(
                    'ts' => true,
                    'dirs' => true,
                );
                $ts = 0;
                foreach ($this->ftpRawList($path) as $str) {
                    $info = preg_split('/\s+/', $str, 9);
                    if ($info[8] === '.') {
                        $info[8] = 'root';
                        if ($stat = $this->parseRaw(join(' ', $info), $path)) {
                            unset($stat['name']);
                            $res = array_merge($res, $stat);
                            if ($res['ts']) {
                                $ts = 0;
                                unset($check['ts']);
                            }
                        }
                    }
                    if ($check && ($stat = $this->parseRaw($str, $path))) {
                        if (isset($stat['ts']) && !empty($stat['ts'])) {
                            $ts = max($ts, $stat['ts']);
                        }
                        if (isset($stat['dirs']) && $stat['mime'] === 'directory') {
                            $res['dirs'] = 1;
                            unset($stat['dirs']);
                        }
                        if (!$check) {
                            break;
                        }
                    }
                }
                if ($ts) {
                    $res['ts'] = $ts;
                }
                $this->cache[$outPath] = $res;
            }
            return $res;
        }

        $pPath = $this->_dirname($path);
        if ($this->_inPath($pPath, $this->root)) {
            $outPPpath = $this->convEncOut($pPath);
            if (!isset($this->dirsCache[$outPPpath])) {
                $parentSubdirs = null;
                if (isset($this->sessionCache['subdirs']) && isset($this->sessionCache['subdirs'][$outPPpath])) {
                    $parentSubdirs = $this->sessionCache['subdirs'][$outPPpath];
                }
                $this->cacheDir($outPPpath);
                if ($parentSubdirs) {
                    $this->sessionCache['subdirs'][$outPPpath] = $parentSubdirs;
                }
            }
        }

        $stat = $this->convEncIn(isset($this->cache[$outPath]) ? $this->cache[$outPath] : array());
        if (!$this->mounted) {
            // dispose incomplete cache made by calling `stat` by 'startPath' option
            $this->cache = array();
        }

        return $stat;
    }

    /**
     * Return true if path is dir and has at least one childs directory
     *
     * @param  string $path dir path
     *
     * @return bool
     * @author Dmitry (dio) Levashov, sitecode
     **/
    protected function _subdirs($path)
    {
        foreach ($this->ftpRawList($path) as $info) {
            $name = $info['filename'];
            if ($name && $name !== '.' && $name !== '..' && $info['type'] == NET_SFTP_TYPE_DIRECTORY) {
                return true;
            }
        }

        return false;
    }


    /******************** file/dir content *********************/

    /**
     * Open file and return file pointer
     *
     * @param  string $path file path
     * @param string  $mode
     *
     * @return false|resource
     * @throws elFinderAbortException
     * @internal param bool $write open file for writing
     * @author   Dmitry (dio) Levashov
     */
    protected function _fopen($path, $mode = 'rb')
    {
        if ($this->tmp) {
            $local = $this->getTempFile($path);
            $this->connect->get($path, $local);
            return @fopen($local, $mode);
        }

        return false;
    }

    /**
     * Close opened file
     *
     * @param  resource $fp file pointer
     * @param string    $path
     *
     * @return void
     * @author Dmitry (dio) Levashov
     */
    protected function _fclose($fp, $path = '')
    {
        is_resource($fp) && fclose($fp);
        if ($path) {
            unlink($this->getTempFile($path));
        }
    }


    /********************  file/dir manipulations *************************/

    /**
     * Create dir and return created dir path or false on failed
     *
     * @param  string $path parent dir path
     * @param string  $name new directory name
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _mkdir($path, $name)
    {
        $path = $this->_joinPath($path, $this->_basename($name));
        if ($this->connect->mkdir($path) === false) {
            return false;
        }

        $this->options['dirMode'] && $this->connect->chmod($this->options['dirMode'], $path);
        return $path;
    }

    /**
     * Create file and return it's path or false on failed
     *
     * @param  string $path parent dir path
     * @param string  $name new file name
     *
     * @return string|bool
     * @author sitecode
     **/
    protected function _mkfile($path, $name)
    {
        $path = $this->_joinPath($path, $this->_basename($name));
        return $this->connect->put($path, '') ? $path : false;
/*
        if ($this->tmp) {
            $path = $this->_joinPath($path, $name);
            $local = $this->getTempFile();
            $res = touch($local) && $this->connect->put($path, $local, NET_SFTP_LOCAL_FILE);
            unlink($local);
            return $res ? $path : false;
        }

        return false;
 */
    }

    /**
     * Copy file into another file
     *
     * @param  string $source    source file path
     * @param  string $targetDir target directory path
     * @param  string $name      new file name
     *
     * @return bool
     * @author Dmitry (dio) Levashov, sitecode
     **/
    protected function _copy($source, $targetDir, $name)
    {
        $res = false;

        $target = $this->_joinPath($targetDir, $this->_basename($name));
        if ($this->tmp) {
            $local = $this->getTempFile();

            if ($this->connect->get($source, $local)
                && $this->connect->put($target, $local, NET_SFTP_LOCAL_FILE)) {
                $res = true;
            }
            unlink($local);
        } else {
            //not memory efficient
            $res = $this->_filePutContents($target, $this->_getContents($source));
        }

        return $res;
    }

    /**
     * Move file into another parent dir.
     * Return new file path or false.
     *
     * @param  string $source source file path
     * @param         $targetDir
     * @param  string $name   file name
     *
     * @return bool|string
     * @internal param string $target target dir path
     * @author   Dmitry (dio) Levashov
     */
    protected function _move($source, $targetDir, $name)
    {
        $target = $this->_joinPath($targetDir, $this->_basename($name));
        return $this->connect->rename($source, $target) ? $target : false;
    }

    /**
     * Remove file
     *
     * @param  string $path file path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _unlink($path)
    {
        return $this->connect->delete($path, false);
    }

    /**
     * Remove dir
     *
     * @param  string $path dir path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _rmdir($path)
    {
        return $this->connect->delete($path);
    }

    /**
     * Create new file and write into it from file pointer.
     * Return new file path or false on error.
     *
     * @param  resource $fp   file pointer
     * @param  string   $dir  target dir path
     * @param  string   $name file name
     * @param  array    $stat file stat (required by some virtual fs)
     *
     * @return bool|string
     * @author Dmitry (dio) Levashov
     **/
    protected function _save($fp, $dir, $name, $stat)
    {
        //TODO optionally encrypt $fp before uploading if mime is not already encrypted type
        $path = $this->_joinPath($dir, $this->_basename($name));
        return $this->connect->put($path, $fp)
            ? $path
            : false;
    }

    /**
     * Get file contents
     *
     * @param  string $path file path
     *
     * @return string|false
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function _getContents($path)
    {
        return $this->connect->get($path);
    }

    /**
     * Write a string to a file
     *
     * @param  string $path    file path
     * @param  string $content new file content
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _filePutContents($path, $content)
    {
        return $this->connect->put($path, $content);
    }

    /**
     * chmod availability
     *
     * @param string $path
     * @param string $mode
     *
     * @return bool
     */
    protected function _chmod($path, $mode)
    {
        $modeOct = is_string($mode) ? octdec($mode) : octdec(sprintf("%04o", $mode));
        return $this->connect->chmod($modeOct, $path);
    }

    /**
     * Extract files from archive
     *
     * @param  string $path archive path
     * @param  array  $arc  archiver command and arguments (same as in $this->archivers)
     *
     * @return true
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov,
     * @author Alexey Sukhotin
     */
    protected function _extract($path, $arc)
    {
        return false; //TODO
    }

    /**
     * Create archive and return its path
     *
     * @param  string $dir   target dir
     * @param  array  $files files names list
     * @param  string $name  archive name
     * @param  array  $arc   archiver options
     *
     * @return string|bool
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov,
     * @author Alexey Sukhotin
     */
    protected function _archive($dir, $files, $name, $arc)
    {
        return false; //TODO
    }

    /**
     * Gets an array of absolute remote SFTP paths of files and
     * folders in $remote_directory omitting symbolic links.
     *
     * @param $remote_directory string remote SFTP path to scan for file and folders recursively
     * @param $targets          array  Array of target item. `null` is to get all of items
     *
     * @return array of elements each of which is an array of two elements:
     * <ul>
     * <li>$item['path'] - absolute remote SFTP path</li>
     * <li>$item['type'] - either 'f' for file or 'd' for directory</li>
     * </ul>
     */
    protected function ftp_scan_dir($remote_directory, $targets = null)
    {
        $buff = $this->ftpRawList($remote_directory);
        $items = array();
        if ($targets && is_array($targets)) {
            $targets = array_flip($targets);
        } else {
            $targets = false;
        }
        foreach ($buff as $info) {
            $name = $info['filename'];
            if ($name !== '.' && $name !== '..' && (!$targets || isset($targets[$name]))) {
                switch ($info['type']) {
                    case NET_SFTP_TYPE_SYMLINK : //omit symbolic links
                    case NET_SFTP_TYPE_DIRECTORY :
                        $remote_file_path = $this->_joinPath($remote_directory, $name);
                        $item = array();
                        $item['path'] = $remote_file_path;
                        $item['type'] = 'd'; // normal file
                        $items[] = $item;
                        $items = array_merge($items, $this->ftp_scan_dir($remote_file_path));
                        break;
                    default:
                        $remote_file_path = $this->_joinPath($remote_directory, $name);
                        $item = array();
                        $item['path'] = $remote_file_path;
                        $item['type'] = 'f'; // normal file
                        $items[] = $item;
                }
            }
        }
        return $items;
    }

} // END class
php/resources/video.png000064400000004361151215013420011157 0ustar00�PNG


IHDR00W���IDATx�ݘE�+����Y%����h5[����O����;����L��[��<�QœnԳvGODve�T��<7���+d0X�A2��~�.���ӵfvܒ�8��o��7=1�`�@��.�x�-������߳�!Zst<�����够�|�3PUlV�-\o8��(�������:�wp�>(�
Db�\���
���/;�P���hD;m8�g�ڼ�_Pl�5x�w#�=���^�R���Y���*ůq����F�Q�@�@[�����c�ul���]{H�`1��9�xH�6�K�b\
�
���d�Jb��]��,
�C���^��]��үHm�2��� �t��C�v:#��!�`+����p?�[Ȧ+�+��uL����ٻcI�,<�����+"�+S�ͬm�2��!�����H�N���(�C�`#Xn�@�a��
O�U�J�4��۝[�> N��o���1�
FPv�(a	���
��9��,!2�'5;���l��c�7�Sp&�L���
�D�D���(Q'���LL6k�6 Na��h�$@�%��
r�F�UB2	W�*��Jl�i��:Bd��ksR�B��S�u�~�(Q�hL\���H9�1�ub�[�J!���iso2>�v�Z�PB��u���`2`�H�lOj���i:�Mv�V6�N��Dܾ��k��Vq�Nu1ol�.ټ�晀���)+e�bQ�h��ѷ�qz)$�bDBJ�U�o�x�w~��P�-���R�ʉɤfs�fwo���
�x|����u���|��x���hP�+�ҵ�~{�|�$�m�rE~�J��o|6k8�>e6mi�Bq�e9K�_�4��
�:'�w����ҹc�ݥ
���z�i�������ڕ���mK��ۢ��IU&�=H�z��b4�f��K�@Ӵ�F`�v���;H�{g�44mG]g�6��|�\�t�De{��d~�op��y�fZ�D �I, �GZ�$�P�79��^�|�D��, J3��˅�����W�u��=GU�����f�?���?�{D��(���# `��8
�&���5�]>ϝ�?B.�T�����_~�K._�.&W����M��0\�0�W?;q�[���/�j�(�y ����b����9��vƟ�e�ٔ�������ޤ��9�_/�fj��i���)��=�#t�P�������?���J��P�})��D�F���/^s�G`��Pv�0��(|WaRfz|�or���П	H�9%Q���e.I�D)�T���?D��1l�`�	��$�錣�kH6J �A	0IBۖ�����G��!}p��
�v́��p�$�p����$���l�V#�*�N6 ��A@h&ȋ\�A��FZ�]-�4a��!�(,;�:���kH�� ��v+Sh�5`1ޤ��[B��*���pH��q�� ��Q�t��[�e�Ć!�c�=p}���L]��ll�qz)\^�%�M)�D�c�T��(%n`A�V,�^�Ëolq��O��ؗ�>E�)�ƥ钋�l:[�3��mƷ���{s_`��<������&<E�h�$J۴ʩM���^k�>�W,�kgJ�/���'3�,�<�2�݉R��`Y�����ڥ�2uUjM��o��?��G� �y��"(��ds����­��-���s�p�#O��������9>�Q:�,��+��J�j�V��x�闸t��]�2/�=?��yi��%5I�/��
�L����u=bk����Cb�gh���y�qvn�Ͽ�ռ<�r�L�g��o>���m�+�'����@��?�������]�-6J�?ФLʡ)E�
���/�m�0���E��O~�'�<��t�Ii�I�Α�1
� Ȩx/�Lþ����y�ǟ�Rg"b�8|�t����H����A�C��Ð���jc��c��!h���(�>!0<X��_��3/sЃ�bph��r�٬R�e�7� 
��X7q��f(_�N \�吠��
��6nN�ı'��|Z���f��	�i����p&.�vM��rJ(�B���`��:�V���f���;Qm�g ��1��?�ۀ{�WN68�76�1��V��x��������'>1�vO"IEND�B`�php/resources/image.png000064400000007052151215013420011133 0ustar00�PNG


IHDR00W��
�IDATxڴ�U��ʹ��$�Mto�9��N�D2�p���"�3v�m�v|���UU?��c��RU@�p^
A�����
e{;������Ϯ���mȘ�+��<q��xI^r��D�q��y��ZU>y��/��ǻ_}[�U۹��{Ӊ��^�q���v��+����+U����奼$���0M���d�Z�o��>x)����1@O	Q����5�FU7N�b���.᫽��� ��t(@芢���`AD���T��PU_�����#�B /�|8\�{�w]g�6cQ�\��\�"��O ^
#�7(A�2w��-s��l=6���hC��쟈��6@AB���
R$T�I@:=���w��PV�X5�ap��3U���v;{e��Zc��X��al�e���?>��ʜQ7�J,Y��S�y6��R���n���ԓ;Ͼ�x�z��@y�tw�ܱ�l�W[�8Z�X%>~�����p$J�*�!`�HJ�̻����?E��it��O�=�&�1�w���'�{���4�����'�����~;z�����U�:A(��\,K�jel̝�@)P�����!�>���w/�ZS58?9u|~�a<�M�d4�&Ae:UL-�a��0�i(g��ٮ�wV�TQ��'=Gy���5c��JI�T��}�9>���L~�]I
�(�jX$�ҵF����)>|Q�6��a=�V�����̱_b�*����u%�׏���#^�6w��o�%Kq4E'Sח�j�M�>\��{�&�}\�w·��d#�
���J+�؟�U�����8=]7q{�x��*��7_
�^%�HL-�ꦁ�!�Ve�F��n��΍��IoM���E��F�9nnnU��f�,��iaHw2p>�U͒�/�{�1Yg�o���[��9-H9��’"�ә^e���yb9]{*���D�F�����q4���vc@�6M~
/���5۶m#�cm!��m��o���\���˪�/*z�{����z��Sy2�ɾ�5���xfD�}��M�F4�-���,����[�5����!�8�!���.�U$c!ւ���0[㚝< �i5�����p������,j����#^���lWTU��,v�h�7��$n��?�aMH��#F[�&eE0f�Mi�1�VW8�2D��K
��R3�L�ˊ�8��)���J�'^���D����9����h��0G^����}>�1@�&'V[Ǫ��P>4
)�sW����)˒��0�LQ��8���f�q�~��<����G�f�U����28�u򪤨k�s`4��,kʼbT�ΣT@��G.�?�ui��]��nݦ��{*�QT%�wwɊ*�iM4b�jg�A���Z�M����Qh�AA�\�B�JB���	t��z%�.�H�#k.|�>�B(@�"ύ�>��$X=3aZ�&Im�<`��B#%w5�u�f�E� �(��rU]��[�ǣx<�(��Ak[-:i���tX]8�
ˉ����K�!����G����eM8�8Mp�'�
6��������Fc:�s�󨙰i
%%���$��j2-F��q"�}Bv�68���`��U���/�0Z��O�01��C���1�V�|�YMs�I>��l��E��-uQ7��x�C>��%+G��Zp>t��hJ>�)�9:h�<
f���1H�H�8hj�P���J�ϱ6|�����?��>�)�X;�֦EA�'����0H)�뫴��y�����l��x�+����-EVR��HҔf;�*kF�=�[lE	����l���֢���{��C�ro�O��Ftʾ<��0�(G�4I�.i�h���I�҂7���y��Dcc��9!�*5_T���Ψ����>�fB{��u R�TjL��D/^�"����8�N�&����կ�ܹ3$�'2)���8!	�CD@��գUf�m5�y8��'Gۏ�;9�y�b�rq���7.c#�yp"��h���t�ݻ���Ƅ�����gQسLz%#�;�Xjo�Z�P�f��-�F��w����t�ю
�.bD	qSC*ض�G���|�W�(����;��2�=�+�8�ٚ��$�Dӎ"�M4�D4h�N��J)JL6
��%��0��ƊX	*4#Od�䊧o'����{�;�"x�1��Qm"�(9�Sܐ���5�\#�F���y穝"<0k�(—C�f#B�83�\�PJ��v�l�K.� �������*g�(�뢜��t��!�8Y�r��Ե��1���X��P�
dQyE-
�O!h<W[{��Ѐ�B".���HYR�)m=��ǿ$t%���*�Q䕟x��r�����|!�������6��|��8��u
h����&�i��1��P+���q�y�<�
X%HUj
)ڱ������bPN�x��m�:��߽��[C6.
�����~Et��f\�Mu�Qو@+��hkI҈8�4��΂�&*`UUA�F�}��%�D1޿M=���k�[���Q��u����D�]�ِ5
�{�2cm��_^�_��ګp�(�.@)���
Kt2&?���'//��mSV�tμ{�9�ؓ
=����n�.�n��#���N.�Y��r���p����D�&���o��f=���;�N{/JM!��� Wt����+�
���
CU>����7~���E�ڬ�/���Q_��.̳p�Oz��9s�_a�>��c	�є}l�"�����E�x��[�"�o�A��/~�矅�.!
��fPd�<|�BJ�/L�6>ʾ�̭4iͷ�75S�gl޸Ly0¤��ULv&�Řc'��y�*�{W�����I�����X�5��4|�w?*�x�S���)��o���3?u�<tBX۽/z�#�r�.FW([".ewC1��XX�螌9�X�{�'?��f�m�/XN���r�_r�������o�{D��!��J?��g�D4<0fpPs��pH{X?��P՜8�d��)6��C1�p_�7��(Vs����g���
��i6��i�p�3�WZ|rp��r[k�	E>!m6��і���O���n��ԑ�NLׇe��G�1��=�\9��=Ox�
��	R�H٢��s��k��I8��&�A������tcay��O5kg[$���4���s\�0Z�M&l0��a��&>��l���`A�٘`U��L7�l�.�xe�K�N����!�U�����0:���S�
��3滖�mIR�/;�'>�I9�
ld�ˊ��s�1…��<�A�?@!�=��غ>��՚�z‰�w�V$�`�r����Y^NI�1f��O�r��}N>l�ǽt�z�y5c�D�׼����[�mO9��56.�N�9B�? �S�+m���mD�d�d_�ݟ!�	�a����f�˟~��%l���9��������14w����0V��2H��6��@�(��P�S����^���x�X�a�9�/�?��R�==U���8��IEND�B`�php/elFinderPlugin.php000064400000006403151215013420010750 0ustar00<?php

/**
 * elFinder Plugin Abstract
 *
 * @package elfinder
 * @author  Naoki Sawada
 * @license New BSD
 */
class elFinderPlugin
{

    /**
     * This plugin's options
     *
     * @var array
     */
    protected $opts = array();

    /**
     * Get current volume's options
     *
     * @param object $volume
     *
     * @return array options
     */
    protected function getCurrentOpts($volume)
    {
        $name = substr(get_class($this), 14); // remove "elFinderPlugin"
        $opts = $this->opts;
        if (is_object($volume)) {
            $volOpts = $volume->getOptionsPlugin($name);
            if (is_array($volOpts)) {
                $opts = array_merge($opts, $volOpts);
            }
        }
        return $opts;
    }

    /**
     * Is enabled with options
     *
     * @param array    $opts
     * @param elFinder $elfinder
     *
     * @return boolean
     */
    protected function iaEnabled($opts, $elfinder = null)
    {
        if (!$opts['enable']) {
            return false;
        }

        // check post var 'contentSaveId' to disable this plugin
        if ($elfinder && !empty($opts['disableWithContentSaveId'])) {
            $session = $elfinder->getSession();
            $urlContentSaveIds = $session->get('urlContentSaveIds', array());
            if (!empty(elFinder::$currentArgs['contentSaveId']) && ($contentSaveId = elFinder::$currentArgs['contentSaveId'])) {
                if (!empty($urlContentSaveIds[$contentSaveId])) {
                    $elfinder->removeUrlContentSaveId($contentSaveId);
                    return false;
                }
            }
        }

        if (isset($opts['onDropWith']) && !is_null($opts['onDropWith'])) {
            // plugin disabled by default, enabled only if given key is pressed
            if (isset($_REQUEST['dropWith']) && $_REQUEST['dropWith']) {
                $onDropWith = $opts['onDropWith'];
                $action = (int)$_REQUEST['dropWith'];
                if (!is_array($onDropWith)) {
                    $onDropWith = array($onDropWith);
                }
                foreach ($onDropWith as $key) {
                    $key = (int)$key;
                    if (($action & $key) === $key) {
                        return true;
                    }
                }
            }
            return false;
        }

        if (isset($opts['offDropWith']) && !is_null($opts['offDropWith']) && isset($_REQUEST['dropWith'])) {
            // plugin enabled by default, disabled only if given key is pressed
            $offDropWith = $opts['offDropWith'];
            $action = (int)$_REQUEST['dropWith'];
            if (!is_array($offDropWith)) {
                $offDropWith = array($offDropWith);
            }
            $res = true;
            foreach ($offDropWith as $key) {
                $key = (int)$key;
                if ($key === 0) {
                    if ($action === 0) {
                        $res = false;
                        break;
                    }
                } else {
                    if (($action & $key) === $key) {
                        $res = false;
                        break;
                    }
                }
            }
            if (!$res) {
                return false;
            }
        }

        return true;
    }
}
php/elFinderSession.php000064400000021074151215013420011136 0ustar00<?php

/**
 * elFinder - file manager for web.
 * Session Wrapper Class.
 *
 * @package elfinder
 * @author  Naoki Sawada
 **/

class elFinderSession implements elFinderSessionInterface
{
    /**
     * A flag of session started
     *
     * @var        boolean
     */
    protected $started = false;

    /**
     * To fix PHP bug that duplicate Set-Cookie header to be sent
     *
     * @var        boolean
     * @see        https://bugs.php.net/bug.php?id=75554
     */
    protected $fixCookieRegist = false;

    /**
     * Array of session keys of this instance
     *
     * @var        array
     */
    protected $keys = array();

    /**
     * Is enabled base64encode
     *
     * @var        boolean
     */
    protected $base64encode = false;

    /**
     * Default options array
     *
     * @var        array
     */
    protected $opts = array(
        'base64encode' => false,
        'keys' => array(
            'default' => 'elFinderCaches',
            'netvolume' => 'elFinderNetVolumes'
        ),
        'cookieParams' => array()
    );

    /**
     * Constractor
     *
     * @param      array $opts The options
     *
     * @return     self    Instanse of this class
     */
    public function __construct($opts)
    {
        $this->opts = array_merge($this->opts, $opts);
        $this->base64encode = !empty($this->opts['base64encode']);
        $this->keys = $this->opts['keys'];
        if (function_exists('apache_get_version') || $this->opts['cookieParams']) {
            $this->fixCookieRegist = true;
        }
    }

    /**
     * {@inheritdoc}
     */
    public function get($key, $empty = null)
    {
        $closed = false;
        if (!$this->started) {
            $closed = true;
            $this->start();
        }

        $data = null;

        if ($this->started) {
            $session =& $this->getSessionRef($key);
            $data = $session;
            if ($data && $this->base64encode) {
                $data = $this->decodeData($data);
            }
        }

        $checkFn = null;
        if (!is_null($empty)) {
            if (is_string($empty)) {
                $checkFn = 'is_string';
            } elseif (is_array($empty)) {
                $checkFn = 'is_array';
            } elseif (is_object($empty)) {
                $checkFn = 'is_object';
            } elseif (is_float($empty)) {
                $checkFn = 'is_float';
            } elseif (is_int($empty)) {
                $checkFn = 'is_int';
            }
        }

        if (is_null($data) || ($checkFn && !$checkFn($data))) {
            $session = $data = $empty;
        }

        if ($closed) {
            $this->close();
        }

        return $data;
    }

    /**
     * {@inheritdoc}
     */
    public function start()
    {
        set_error_handler(array($this, 'session_start_error'), E_NOTICE | E_WARNING);

        // apache2 SAPI has a bug of session cookie register
        // see https://bugs.php.net/bug.php?id=75554
        // see https://github.com/php/php-src/pull/3231
        if ($this->fixCookieRegist === true) {
            if ((int)ini_get('session.use_cookies') === 1) {
                if (ini_set('session.use_cookies', 0) === false) {
                    $this->fixCookieRegist = false;
                }
            }
        }

        if (version_compare(PHP_VERSION, '5.4.0', '>=')) {
            if (session_status() !== PHP_SESSION_ACTIVE) {
                session_start();
            }
        } else {
            session_start();
        }
        $this->started = session_id() ? true : false;

        restore_error_handler();

        return $this;
    }

    /**
     * Get variable reference of $_SESSION
     *
     * @param string $key key of $_SESSION array
     *
     * @return mixed|null
     */
    protected function & getSessionRef($key)
    {
        $session = null;
        if ($this->started) {
            list($cat, $name) = array_pad(explode('.', $key, 2), 2, null);
            if (is_null($name)) {
                if (!isset($this->keys[$cat])) {
                    $name = $cat;
                    $cat = 'default';
                }
            }
            if (isset($this->keys[$cat])) {
                $cat = $this->keys[$cat];
            } else {
                $name = $cat . '.' . $name;
                $cat = $this->keys['default'];
            }
            if (is_null($name)) {
                if (!isset($_SESSION[$cat])) {
                    $_SESSION[$cat] = null;
                }
                $session =& $_SESSION[$cat];
            } else {
                if (!isset($_SESSION[$cat]) || !is_array($_SESSION[$cat])) {
                    $_SESSION[$cat] = array();
                }
                if (!isset($_SESSION[$cat][$name])) {
                    $_SESSION[$cat][$name] = null;
                }
                $session =& $_SESSION[$cat][$name];
            }
        }
        return $session;
    }

    /**
     * base64 decode of session val
     *
     * @param $data
     *
     * @return bool|mixed|string|null
     */
    protected function decodeData($data)
    {
        if ($this->base64encode) {
            if (is_string($data)) {
                if (($data = base64_decode($data)) !== false) {
                    $data = unserialize($data);
                } else {
                    $data = null;
                }
            } else {
                $data = null;
            }
        }
        return $data;
    }

    /**
     * {@inheritdoc}
     */
    public function close()
    {
        if ($this->started) {
            if ($this->fixCookieRegist === true) {
                // regist cookie only once for apache2 SAPI
                $cParm = session_get_cookie_params();
                if ($this->opts['cookieParams'] && is_array($this->opts['cookieParams'])) {
                    $cParm = array_merge($cParm, $this->opts['cookieParams']);
                }
                if (version_compare(PHP_VERSION, '7.3', '<')) {
                    setcookie(session_name(), session_id(), 0, $cParm['path'] . (!empty($cParm['SameSite'])? '; SameSite=' . $cParm['SameSite'] : ''), $cParm['domain'], $cParm['secure'], $cParm['httponly']);
                } else {
                    $allows = array('expires' => true, 'path' => true, 'domain' => true, 'secure' => true, 'httponly' => true, 'samesite' => true);
                    foreach(array_keys($cParm) as $_k) {
                        if (!isset($allows[$_k])) {
                            unset($cParm[$_k]);
                        }
                    }
                    setcookie(session_name(), session_id(), $cParm);
                }
                $this->fixCookieRegist = false;
            }
            session_write_close();
        }
        $this->started = false;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function set($key, $data)
    {
        $closed = false;
        if (!$this->started) {
            $closed = true;
            $this->start();
        }
        $session =& $this->getSessionRef($key);
        if ($this->base64encode) {
            $data = $this->encodeData($data);
        }
        $session = $data;

        if ($closed) {
            $this->close();
        }

        return $this;
    }

    /**
     * base64 encode for session val
     *
     * @param $data
     *
     * @return string
     */
    protected function encodeData($data)
    {
        if ($this->base64encode) {
            $data = base64_encode(serialize($data));
        }
        return $data;
    }

    /**
     * {@inheritdoc}
     */
    public function remove($key)
    {
        $closed = false;
        if (!$this->started) {
            $closed = true;
            $this->start();
        }

        list($cat, $name) = array_pad(explode('.', $key, 2), 2, null);
        if (is_null($name)) {
            if (!isset($this->keys[$cat])) {
                $name = $cat;
                $cat = 'default';
            }
        }
        if (isset($this->keys[$cat])) {
            $cat = $this->keys[$cat];
        } else {
            $name = $cat . '.' . $name;
            $cat = $this->keys['default'];
        }
        if (is_null($name)) {
            unset($_SESSION[$cat]);
        } else {
            if (isset($_SESSION[$cat]) && is_array($_SESSION[$cat])) {
                unset($_SESSION[$cat][$name]);
            }
        }

        if ($closed) {
            $this->close();
        }

        return $this;
    }

    /**
     * sessioin error handler (Only for suppression of error at session start)
     *
     * @param $errno
     * @param $errstr
     */
    protected function session_start_error($errno, $errstr)
    {
    }
}
php/elFinderVolumeMySQL.class.php000064400000072550151215013420012761 0ustar00<?php

/**
 * Simple elFinder driver for MySQL.
 *
 * @author Dmitry (dio) Levashov
 **/
class elFinderVolumeMySQL extends elFinderVolumeDriver
{

    /**
     * Driver id
     * Must be started from letter and contains [a-z0-9]
     * Used as part of volume id
     *
     * @var string
     **/
    protected $driverId = 'm';

    /**
     * Database object
     *
     * @var mysqli
     **/
    protected $db = null;

    /**
     * Tables to store files
     *
     * @var string
     **/
    protected $tbf = '';

    /**
     * Directory for tmp files
     * If not set driver will try to use tmbDir as tmpDir
     *
     * @var string
     **/
    protected $tmpPath = '';

    /**
     * Numbers of sql requests (for debug)
     *
     * @var int
     **/
    protected $sqlCnt = 0;

    /**
     * Last db error message
     *
     * @var string
     **/
    protected $dbError = '';

    /**
     * This root has parent id
     *
     * @var        boolean
     */
    protected $rootHasParent = false;

    /**
     * Constructor
     * Extend options with required fields
     *
     * @author Dmitry (dio) Levashov
     */
    public function __construct()
    {
        $opts = array(
            'host' => 'localhost',
            'user' => '',
            'pass' => '',
            'db' => '',
            'port' => null,
            'socket' => null,
            'files_table' => 'elfinder_file',
            'tmbPath' => '',
            'tmpPath' => '',
            'rootCssClass' => 'elfinder-navbar-root-sql',
            'noSessionCache' => array('hasdirs'),
            'isLocalhost' => false
        );
        $this->options = array_merge($this->options, $opts);
        $this->options['mimeDetect'] = 'internal';
    }

    /*********************************************************************/
    /*                        INIT AND CONFIGURE                         */
    /*********************************************************************/

    /**
     * Prepare driver before mount volume.
     * Connect to db, check required tables and fetch root path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function init()
    {

        if (!($this->options['host'] || $this->options['socket'])
            || !$this->options['user']
            || !$this->options['pass']
            || !$this->options['db']
            || !$this->options['path']
            || !$this->options['files_table']) {
            return $this->setError('Required options "host", "socket", "user", "pass", "db", "path" or "files_table" are undefined.');
        }

        $err = null;
        if ($this->db = @new mysqli($this->options['host'], $this->options['user'], $this->options['pass'], $this->options['db'], $this->options['port'], $this->options['socket'])) {
            if ($this->db && $this->db->connect_error) {
                $err = $this->db->connect_error;
            }
        } else {
            $err = mysqli_connect_error();
        }
        if ($err) {
            return $this->setError(array('Unable to connect to MySQL server.', $err));
        }

        if (!$this->needOnline && empty($this->ARGS['init'])) {
            $this->db->close();
            $this->db = null;
            return true;
        }

        $this->db->set_charset('utf8');

        if ($res = $this->db->query('SHOW TABLES')) {
            while ($row = $res->fetch_array()) {
                if ($row[0] == $this->options['files_table']) {
                    $this->tbf = $this->options['files_table'];
                    break;
                }
            }
        }

        if (!$this->tbf) {
            return $this->setError('The specified database table cannot be found.');
        }

        $this->updateCache($this->options['path'], $this->_stat($this->options['path']));

        // enable command archive
        $this->options['useRemoteArchive'] = true;

        // check isLocalhost
        $this->isLocalhost = $this->options['isLocalhost'] || $this->options['host'] === 'localhost' || $this->options['host'] === '127.0.0.1' || $this->options['host'] === '::1';

        return true;
    }


    /**
     * Set tmp path
     *
     * @return void
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function configure()
    {
        parent::configure();

        if (($tmp = $this->options['tmpPath'])) {
            if (!file_exists($tmp)) {
                if (mkdir($tmp)) {
                    chmod($tmp, $this->options['tmbPathMode']);
                }
            }

            $this->tmpPath = is_dir($tmp) && is_writable($tmp) ? $tmp : false;
        }
        if (!$this->tmpPath && ($tmp = elFinder::getStaticVar('commonTempPath'))) {
            $this->tmpPath = $tmp;
        }

        // fallback of $this->tmp
        if (!$this->tmpPath && $this->tmbPathWritable) {
            $this->tmpPath = $this->tmbPath;
        }

        $this->mimeDetect = 'internal';
    }

    /**
     * Close connection
     *
     * @return void
     * @author Dmitry (dio) Levashov
     **/
    public function umount()
    {
        $this->db && $this->db->close();
    }

    /**
     * Return debug info for client
     *
     * @return array
     * @author Dmitry (dio) Levashov
     **/
    public function debug()
    {
        $debug = parent::debug();
        $debug['sqlCount'] = $this->sqlCnt;
        if ($this->dbError) {
            $debug['dbError'] = $this->dbError;
        }
        return $debug;
    }

    /**
     * Perform sql query and return result.
     * Increase sqlCnt and save error if occured
     *
     * @param  string $sql query
     *
     * @return bool|mysqli_result
     * @author Dmitry (dio) Levashov
     */
    protected function query($sql)
    {
        $this->sqlCnt++;
        $res = $this->db->query($sql);
        if (!$res) {
            $this->dbError = $this->db->error;
        }
        return $res;
    }

    /**
     * Create empty object with required mimetype
     *
     * @param  string $path parent dir path
     * @param  string $name object name
     * @param  string $mime mime type
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function make($path, $name, $mime)
    {
        $sql = 'INSERT INTO %s (`parent_id`, `name`, `size`, `mtime`, `mime`, `content`, `read`, `write`, `locked`, `hidden`, `width`, `height`) VALUES (\'%s\', \'%s\', 0, %d, \'%s\', \'\', \'%d\', \'%d\', \'%d\', \'%d\', 0, 0)';
        $sql = sprintf($sql, $this->tbf, $path, $this->db->real_escape_string($name), time(), $mime, $this->defaults['read'], $this->defaults['write'], $this->defaults['locked'], $this->defaults['hidden']);
        // echo $sql;
        return $this->query($sql) && $this->db->affected_rows > 0;
    }

    /*********************************************************************/
    /*                               FS API                              */
    /*********************************************************************/

    /**
     * Cache dir contents
     *
     * @param  string $path dir path
     *
     * @return string
     * @author Dmitry Levashov
     **/
    protected function cacheDir($path)
    {
        $this->dirsCache[$path] = array();

        $sql = 'SELECT f.id, f.parent_id, f.name, f.size, f.mtime AS ts, f.mime, f.read, f.write, f.locked, f.hidden, f.width, f.height, IF(ch.id, 1, 0) AS dirs 
                FROM ' . $this->tbf . ' AS f 
                LEFT JOIN ' . $this->tbf . ' AS ch ON ch.parent_id=f.id AND ch.mime=\'directory\'
                WHERE f.parent_id=\'' . $path . '\'
                GROUP BY f.id, ch.id';

        $res = $this->query($sql);
        if ($res) {
            while ($row = $res->fetch_assoc()) {
                $id = $row['id'];
                if ($row['parent_id'] && $id != $this->root) {
                    $row['phash'] = $this->encode($row['parent_id']);
                }

                if ($row['mime'] == 'directory') {
                    unset($row['width']);
                    unset($row['height']);
                    $row['size'] = 0;
                } else {
                    unset($row['dirs']);
                }

                unset($row['id']);
                unset($row['parent_id']);


                if (($stat = $this->updateCache($id, $row)) && empty($stat['hidden'])) {
                    $this->dirsCache[$path][] = $id;
                }
            }
        }

        return $this->dirsCache[$path];
    }

    /**
     * Return array of parents paths (ids)
     *
     * @param  int $path file path (id)
     *
     * @return array
     * @author Dmitry (dio) Levashov
     **/
    protected function getParents($path)
    {
        $parents = array();

        while ($path) {
            if ($file = $this->stat($path)) {
                array_unshift($parents, $path);
                $path = isset($file['phash']) ? $this->decode($file['phash']) : false;
            }
        }

        if (count($parents)) {
            array_pop($parents);
        }
        return $parents;
    }

    /**
     * Return correct file path for LOAD_FILE method
     *
     * @param  string $path file path (id)
     *
     * @return string
     * @author Troex Nevelin
     **/
    protected function loadFilePath($path)
    {
        $realPath = realpath($path);
        if (DIRECTORY_SEPARATOR == '\\') { // windows
            $realPath = str_replace('\\', '\\\\', $realPath);
        }
        return $this->db->real_escape_string($realPath);
    }

    /**
     * Recursive files search
     *
     * @param  string $path dir path
     * @param  string $q    search string
     * @param  array  $mimes
     *
     * @return array
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function doSearch($path, $q, $mimes)
    {
        if (!empty($this->doSearchCurrentQuery['matchMethod'])) {
            // has custom match method use elFinderVolumeDriver::doSearch()
            return parent::doSearch($path, $q, $mimes);
        }

        $dirs = array();
        $timeout = $this->options['searchTimeout'] ? $this->searchStart + $this->options['searchTimeout'] : 0;

        if ($path != $this->root || $this->rootHasParent) {
            $dirs = $inpath = array(intval($path));
            while ($inpath) {
                $in = '(' . join(',', $inpath) . ')';
                $inpath = array();
                $sql = 'SELECT f.id FROM %s AS f WHERE f.parent_id IN ' . $in . ' AND `mime` = \'directory\'';
                $sql = sprintf($sql, $this->tbf);
                if ($res = $this->query($sql)) {
                    $_dir = array();
                    while ($dat = $res->fetch_assoc()) {
                        $inpath[] = $dat['id'];
                    }
                    $dirs = array_merge($dirs, $inpath);
                }
            }
        }

        $result = array();

        if ($mimes) {
            $whrs = array();
            foreach ($mimes as $mime) {
                if (strpos($mime, '/') === false) {
                    $whrs[] = sprintf('f.mime LIKE \'%s/%%\'', $this->db->real_escape_string($mime));
                } else {
                    $whrs[] = sprintf('f.mime = \'%s\'', $this->db->real_escape_string($mime));
                }
            }
            $whr = join(' OR ', $whrs);
        } else {
            $whr = sprintf('f.name LIKE \'%%%s%%\'', $this->db->real_escape_string($q));
        }
        if ($dirs) {
            $whr = '(' . $whr . ') AND (`parent_id` IN (' . join(',', $dirs) . '))';
        }

        $sql = 'SELECT f.id, f.parent_id, f.name, f.size, f.mtime AS ts, f.mime, f.read, f.write, f.locked, f.hidden, f.width, f.height, 0 AS dirs 
                FROM %s AS f 
                WHERE %s';

        $sql = sprintf($sql, $this->tbf, $whr);

        if (($res = $this->query($sql))) {
            while ($row = $res->fetch_assoc()) {
                if ($timeout && $timeout < time()) {
                    $this->setError(elFinder::ERROR_SEARCH_TIMEOUT, $this->path($this->encode($path)));
                    break;
                }

                if (!$this->mimeAccepted($row['mime'], $mimes)) {
                    continue;
                }
                $id = $row['id'];
                if ($id == $this->root) {
                    continue;
                }
                if ($row['parent_id'] && $id != $this->root) {
                    $row['phash'] = $this->encode($row['parent_id']);
                }
                $row['path'] = $this->_path($id);

                if ($row['mime'] == 'directory') {
                    unset($row['width']);
                    unset($row['height']);
                } else {
                    unset($row['dirs']);
                }

                unset($row['id']);
                unset($row['parent_id']);

                if (($stat = $this->updateCache($id, $row)) && empty($stat['hidden'])) {
                    $result[] = $stat;
                }
            }
        }
        return $result;
    }


    /*********************** paths/urls *************************/

    /**
     * Return parent directory path
     *
     * @param  string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _dirname($path)
    {
        return ($stat = $this->stat($path)) ? (!empty($stat['phash']) ? $this->decode($stat['phash']) : $this->root) : false;
    }

    /**
     * Return file name
     *
     * @param  string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _basename($path)
    {
        return (($stat = $this->stat($path)) && isset($stat['name'])) ? $stat['name'] : false;
    }

    /**
     * Join dir name and file name and return full path
     *
     * @param  string $dir
     * @param  string $name
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _joinPath($dir, $name)
    {
        $sql = 'SELECT id FROM ' . $this->tbf . ' WHERE parent_id=\'' . $dir . '\' AND name=\'' . $this->db->real_escape_string($name) . '\'';

        if (($res = $this->query($sql)) && ($r = $res->fetch_assoc())) {
            $this->updateCache($r['id'], $this->_stat($r['id']));
            return $r['id'];
        }
        return -1;
    }

    /**
     * Return normalized path, this works the same as os.path.normpath() in Python
     *
     * @param  string $path path
     *
     * @return string
     * @author Troex Nevelin
     **/
    protected function _normpath($path)
    {
        return $path;
    }

    /**
     * Return file path related to root dir
     *
     * @param  string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _relpath($path)
    {
        return $path;
    }

    /**
     * Convert path related to root dir into real path
     *
     * @param  string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _abspath($path)
    {
        return $path;
    }

    /**
     * Return fake path started from root dir
     *
     * @param  string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _path($path)
    {
        if (($file = $this->stat($path)) == false) {
            return '';
        }

        $parentsIds = $this->getParents($path);
        $path = '';
        foreach ($parentsIds as $id) {
            $dir = $this->stat($id);
            $path .= $dir['name'] . $this->separator;
        }
        return $path . $file['name'];
    }

    /**
     * Return true if $path is children of $parent
     *
     * @param  string $path   path to check
     * @param  string $parent parent path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _inpath($path, $parent)
    {
        return $path == $parent
            ? true
            : in_array($parent, $this->getParents($path));
    }

    /***************** file stat ********************/
    /**
     * Return stat for given path.
     * Stat contains following fields:
     * - (int)    size    file size in b. required
     * - (int)    ts      file modification time in unix time. required
     * - (string) mime    mimetype. required for folders, others - optionally
     * - (bool)   read    read permissions. required
     * - (bool)   write   write permissions. required
     * - (bool)   locked  is object locked. optionally
     * - (bool)   hidden  is object hidden. optionally
     * - (string) alias   for symlinks - link target path relative to root path. optionally
     * - (string) target  for symlinks - link target path. optionally
     * If file does not exists - returns empty array or false.
     *
     * @param  string $path file path
     *
     * @return array|false
     * @author Dmitry (dio) Levashov
     **/
    protected function _stat($path)
    {
        $sql = 'SELECT f.id, f.parent_id, f.name, f.size, f.mtime AS ts, f.mime, f.read, f.write, f.locked, f.hidden, f.width, f.height, IF(ch.id, 1, 0) AS dirs
                FROM ' . $this->tbf . ' AS f 
                LEFT JOIN ' . $this->tbf . ' AS ch ON ch.parent_id=f.id AND ch.mime=\'directory\'
                WHERE f.id=\'' . $path . '\'
                GROUP BY f.id, ch.id';

        $res = $this->query($sql);

        if ($res) {
            $stat = $res->fetch_assoc();
            if ($stat['id'] == $this->root) {
                $this->rootHasParent = true;
                $stat['parent_id'] = '';
            }
            if ($stat['parent_id']) {
                $stat['phash'] = $this->encode($stat['parent_id']);
            }
            if ($stat['mime'] == 'directory') {
                unset($stat['width']);
                unset($stat['height']);
                $stat['size'] = 0;
            } else {
                if (!$stat['mime']) {
                    unset($stat['mime']);
                }
                unset($stat['dirs']);
            }
            unset($stat['id']);
            unset($stat['parent_id']);
            return $stat;

        }
        return array();
    }

    /**
     * Return true if path is dir and has at least one childs directory
     *
     * @param  string $path dir path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _subdirs($path)
    {
        return ($stat = $this->stat($path)) && isset($stat['dirs']) ? $stat['dirs'] : false;
    }

    /**
     * Return object width and height
     * Usualy used for images, but can be realize for video etc...
     *
     * @param  string $path file path
     * @param  string $mime file mime type
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _dimensions($path, $mime)
    {
        return ($stat = $this->stat($path)) && isset($stat['width']) && isset($stat['height']) ? $stat['width'] . 'x' . $stat['height'] : '';
    }

    /******************** file/dir content *********************/

    /**
     * Return files list in directory.
     *
     * @param  string $path dir path
     *
     * @return array
     * @author Dmitry (dio) Levashov
     **/
    protected function _scandir($path)
    {
        return isset($this->dirsCache[$path])
            ? $this->dirsCache[$path]
            : $this->cacheDir($path);
    }

    /**
     * Open file and return file pointer
     *
     * @param  string $path file path
     * @param  string $mode open file mode (ignored in this driver)
     *
     * @return resource|false
     * @author Dmitry (dio) Levashov
     **/
    protected function _fopen($path, $mode = 'rb')
    {
        $fp = $this->tmpPath
            ? fopen($this->getTempFile($path), 'w+')
            : $this->tmpfile();


        if ($fp) {
            if (($res = $this->query('SELECT content FROM ' . $this->tbf . ' WHERE id=\'' . $path . '\''))
                && ($r = $res->fetch_assoc())) {
                fwrite($fp, $r['content']);
                rewind($fp);
                return $fp;
            } else {
                $this->_fclose($fp, $path);
            }
        }

        return false;
    }

    /**
     * Close opened file
     *
     * @param  resource $fp file pointer
     * @param string    $path
     *
     * @return void
     * @author Dmitry (dio) Levashov
     */
    protected function _fclose($fp, $path = '')
    {
        is_resource($fp) && fclose($fp);
        if ($path) {
            $file = $this->getTempFile($path);
            is_file($file) && unlink($file);
        }
    }

    /********************  file/dir manipulations *************************/

    /**
     * Create dir and return created dir path or false on failed
     *
     * @param  string $path parent dir path
     * @param string  $name new directory name
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _mkdir($path, $name)
    {
        return $this->make($path, $name, 'directory') ? $this->_joinPath($path, $name) : false;
    }

    /**
     * Create file and return it's path or false on failed
     *
     * @param  string $path parent dir path
     * @param string  $name new file name
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _mkfile($path, $name)
    {
        return $this->make($path, $name, '') ? $this->_joinPath($path, $name) : false;
    }

    /**
     * Create symlink. FTP driver does not support symlinks.
     *
     * @param  string $target link target
     * @param  string $path   symlink path
     * @param string  $name
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     */
    protected function _symlink($target, $path, $name)
    {
        return false;
    }

    /**
     * Copy file into another file
     *
     * @param  string $source    source file path
     * @param  string $targetDir target directory path
     * @param  string $name      new file name
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _copy($source, $targetDir, $name)
    {
        $this->clearcache();
        $id = $this->_joinPath($targetDir, $name);

        $sql = $id > 0
            ? sprintf('REPLACE INTO %s (id, parent_id, name, content, size, mtime, mime, width, height, `read`, `write`, `locked`, `hidden`) (SELECT %d, %d, name, content, size, mtime, mime, width, height, `read`, `write`, `locked`, `hidden` FROM %s WHERE id=%d)', $this->tbf, $id, $this->_dirname($id), $this->tbf, $source)
            : sprintf('INSERT INTO %s (parent_id, name, content, size, mtime, mime, width, height, `read`, `write`, `locked`, `hidden`) SELECT %d, \'%s\', content, size, %d, mime, width, height, `read`, `write`, `locked`, `hidden` FROM %s WHERE id=%d', $this->tbf, $targetDir, $this->db->real_escape_string($name), time(), $this->tbf, $source);

        return $this->query($sql);
    }

    /**
     * Move file into another parent dir.
     * Return new file path or false.
     *
     * @param  string $source source file path
     * @param         $targetDir
     * @param  string $name   file name
     *
     * @return bool|string
     * @internal param string $target target dir path
     * @author   Dmitry (dio) Levashov
     */
    protected function _move($source, $targetDir, $name)
    {
        $sql = 'UPDATE %s SET parent_id=%d, name=\'%s\' WHERE id=%d LIMIT 1';
        $sql = sprintf($sql, $this->tbf, $targetDir, $this->db->real_escape_string($name), $source);
        return $this->query($sql) && $this->db->affected_rows > 0 ? $source : false;
    }

    /**
     * Remove file
     *
     * @param  string $path file path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _unlink($path)
    {
        return $this->query(sprintf('DELETE FROM %s WHERE id=%d AND mime!=\'directory\' LIMIT 1', $this->tbf, $path)) && $this->db->affected_rows;
    }

    /**
     * Remove dir
     *
     * @param  string $path dir path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _rmdir($path)
    {
        return $this->query(sprintf('DELETE FROM %s WHERE id=%d AND mime=\'directory\' LIMIT 1', $this->tbf, $path)) && $this->db->affected_rows;
    }

    /**
     * undocumented function
     *
     * @param $path
     * @param $fp
     *
     * @author Dmitry Levashov
     */
    protected function _setContent($path, $fp)
    {
        elFinder::rewind($fp);
        $fstat = fstat($fp);
        $size = $fstat['size'];


    }

    /**
     * Create new file and write into it from file pointer.
     * Return new file path or false on error.
     *
     * @param  resource $fp   file pointer
     * @param  string   $dir  target dir path
     * @param  string   $name file name
     * @param  array    $stat file stat (required by some virtual fs)
     *
     * @return bool|string
     * @author Dmitry (dio) Levashov
     **/
    protected function _save($fp, $dir, $name, $stat)
    {
        $this->clearcache();

        $mime = !empty($stat['mime']) ? $stat['mime'] : $this->mimetype($name, true);
        $w = !empty($stat['width']) ? $stat['width'] : 0;
        $h = !empty($stat['height']) ? $stat['height'] : 0;
        $ts = !empty($stat['ts']) ? $stat['ts'] : time();

        $id = $this->_joinPath($dir, $name);
        if (!isset($stat['size'])) {
            $stat = fstat($fp);
            $size = $stat['size'];
        } else {
            $size = $stat['size'];
        }

        if ($this->isLocalhost && ($tmpfile = tempnam($this->tmpPath, $this->id))) {
            if (($trgfp = fopen($tmpfile, 'wb')) == false) {
                unlink($tmpfile);
            } else {
                elFinder::rewind($fp);
                stream_copy_to_stream($fp, $trgfp);
                fclose($trgfp);
                chmod($tmpfile, 0644);

                $sql = $id > 0
                    ? 'REPLACE INTO %s (id, parent_id, name, content, size, mtime, mime, width, height) VALUES (' . $id . ', %d, \'%s\', LOAD_FILE(\'%s\'), %d, %d, \'%s\', %d, %d)'
                    : 'INSERT INTO %s (parent_id, name, content, size, mtime, mime, width, height) VALUES (%d, \'%s\', LOAD_FILE(\'%s\'), %d, %d, \'%s\', %d, %d)';
                $sql = sprintf($sql, $this->tbf, $dir, $this->db->real_escape_string($name), $this->loadFilePath($tmpfile), $size, $ts, $mime, $w, $h);

                $res = $this->query($sql);
                unlink($tmpfile);

                if ($res) {
                    return $id > 0 ? $id : $this->db->insert_id;
                }
            }
        }


        $content = '';
        elFinder::rewind($fp);
        while (!feof($fp)) {
            $content .= fread($fp, 8192);
        }

        $sql = $id > 0
            ? 'REPLACE INTO %s (id, parent_id, name, content, size, mtime, mime, width, height) VALUES (' . $id . ', %d, \'%s\', \'%s\', %d, %d, \'%s\', %d, %d)'
            : 'INSERT INTO %s (parent_id, name, content, size, mtime, mime, width, height) VALUES (%d, \'%s\', \'%s\', %d, %d, \'%s\', %d, %d)';
        $sql = sprintf($sql, $this->tbf, $dir, $this->db->real_escape_string($name), $this->db->real_escape_string($content), $size, $ts, $mime, $w, $h);

        unset($content);

        if ($this->query($sql)) {
            return $id > 0 ? $id : $this->db->insert_id;
        }

        return false;
    }

    /**
     * Get file contents
     *
     * @param  string $path file path
     *
     * @return string|false
     * @author Dmitry (dio) Levashov
     **/
    protected function _getContents($path)
    {
        return ($res = $this->query(sprintf('SELECT content FROM %s WHERE id=%d', $this->tbf, $path))) && ($r = $res->fetch_assoc()) ? $r['content'] : false;
    }

    /**
     * Write a string to a file
     *
     * @param  string $path    file path
     * @param  string $content new file content
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _filePutContents($path, $content)
    {
        return $this->query(sprintf('UPDATE %s SET content=\'%s\', size=%d, mtime=%d WHERE id=%d LIMIT 1', $this->tbf, $this->db->real_escape_string($content), strlen($content), time(), $path));
    }

    /**
     * Detect available archivers
     *
     * @return void
     **/
    protected function _checkArchivers()
    {
        return;
    }

    /**
     * chmod implementation
     *
     * @param string $path
     * @param string $mode
     *
     * @return bool
     */
    protected function _chmod($path, $mode)
    {
        return false;
    }

    /**
     * Unpack archive
     *
     * @param  string $path archive path
     * @param  array  $arc  archiver command and arguments (same as in $this->archivers)
     *
     * @return void
     * @author Dmitry (dio) Levashov
     * @author Alexey Sukhotin
     **/
    protected function _unpack($path, $arc)
    {
        return;
    }

    /**
     * Extract files from archive
     *
     * @param  string $path archive path
     * @param  array  $arc  archiver command and arguments (same as in $this->archivers)
     *
     * @return true
     * @author Dmitry (dio) Levashov,
     * @author Alexey Sukhotin
     **/
    protected function _extract($path, $arc)
    {
        return false;
    }

    /**
     * Create archive and return its path
     *
     * @param  string $dir   target dir
     * @param  array  $files files names list
     * @param  string $name  archive name
     * @param  array  $arc   archiver options
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov,
     * @author Alexey Sukhotin
     **/
    protected function _archive($dir, $files, $name, $arc)
    {
        return false;
    }

} // END class 
php/elFinder.class.php000064400000555007151215013420010706 0ustar00<?php

/**
 * elFinder - file manager for web.
 * Core class.
 *
 * @package elfinder
 * @author  Dmitry (dio) Levashov
 * @author  Troex Nevelin
 * @author  Alexey Sukhotin
 **/
class elFinder
{

    /**
     * API version number
     *
     * @var float
     **/
    protected static $ApiVersion = 2.1;

    /**
     * API version number
     *
     * @deprecated
     * @var string
     **/
    protected $version;

    /**
     * API revision that this connector supports all functions
     *
     * @var integer
     */
    protected static $ApiRevision = 60;

    /**
     * Storages (root dirs)
     *
     * @var array
     **/
    protected $volumes = array();

    /**
     * elFinder instance
     *
     * @var object
     */
    public static $instance = null;

    /**
     * Current request args
     *
     * @var array
     */
    public static $currentArgs = array();

    /**
     * Network mount drivers
     *
     * @var array
     */
    public static $netDrivers = array();

    /**
     * elFinder global locale
     *
     * @var string
     */
    public static $locale = '';

    /**
     * elFinderVolumeDriver default mime.type file path
     *
     * @var string
     */
    public static $defaultMimefile = '';

    /**
     * A file save destination path when a temporary content URL is required
     * on a network volume or the like
     * It can be overwritten by volume route setting
     *
     * @var string
     */
    public static $tmpLinkPath = '';

    /**
     * A file save destination URL when a temporary content URL is required
     * on a network volume or the like
     * It can be overwritten by volume route setting
     *
     * @var string
     */
    public static $tmpLinkUrl = '';

    /**
     * Temporary content URL lifetime (seconds)
     *
     * @var integer
     */
    public static $tmpLinkLifeTime = 3600;

    /**
     * MIME type list handled as a text file
     *
     * @var array
     */
    public static $textMimes = array(
        'application/dash+xml',
        'application/docbook+xml',
        'application/javascript',
        'application/json',
        'application/plt',
        'application/sat',
        'application/sql',
        'application/step',
        'application/vnd.hp-hpgl',
        'application/x-awk',
        'application/x-config',
        'application/x-csh',
        'application/x-empty',
        'application/x-mpegurl',
        'application/x-perl',
        'application/x-php',
        'application/x-web-config',
        'application/xhtml+xml',
        'application/xml',
        'audio/x-mp3-playlist',
        'image/cgm',
        'image/svg+xml',
        'image/vnd.dxf',
        'model/iges'
    );

    /**
     * Maximum memory size to be extended during GD processing
     * (0: not expanded, -1: unlimited or memory size notation)
     *
     * @var integer|string
     */
    public static $memoryLimitGD = 0;

    /**
     * Path of current request flag file for abort check
     *
     * @var string
     */
    protected static $abortCheckFile = null;

    /**
     * elFinder session wrapper object
     *
     * @var elFinderSessionInterface
     */
    protected $session;

    /**
     * elFinder global sessionCacheKey
     *
     * @deprecated
     * @var string
     */
    public static $sessionCacheKey = '';

    /**
     * Is session closed
     *
     * @deprecated
     * @var bool
     */
    private static $sessionClosed = false;

    /**
     * elFinder base64encodeSessionData
     * elFinder save session data as `UTF-8`
     * If the session storage mechanism of the system does not allow `UTF-8`
     * And it must be `true` option 'base64encodeSessionData' of elFinder
     * WARNING: When enabling this option, if saving the data passed from the user directly to the session variable,
     * it make vulnerable to the object injection attack, so use it carefully.
     * see https://github.com/Studio-42/elFinder/issues/2345
     *
     * @var bool
     */
    protected static $base64encodeSessionData = false;

    /**
     * elFinder common tempraly path
     *
     * @var string
     * @default "./.tmp" or sys_get_temp_dir()
     **/
    protected static $commonTempPath = '';

    /**
     * Callable function for URL upload filter
     * The first argument is a URL and the second argument is an instance of the elFinder class
     * A filter should be return true (to allow) / false (to disallow)
     *
     * @var callable
     * @default null
     */
    protected $urlUploadFilter = null;

    /**
     * Connection flag files path that connection check of current request
     *
     * @var string
     * @default value of $commonTempPath
     */
    protected static $connectionFlagsPath = '';

    /**
     * Additional volume root options for network mounting volume
     *
     * @var array
     */
    protected $optionsNetVolumes = array();

    /**
     * Session key of net mount volumes
     *
     * @deprecated
     * @var string
     */
    protected $netVolumesSessionKey = '';

    /**
     * Mounted volumes count
     * Required to create unique volume id
     *
     * @var int
     **/
    public static $volumesCnt = 1;

    /**
     * Default root (storage)
     *
     * @var elFinderVolumeDriver
     **/
    protected $default = null;

    /**
     * Commands and required arguments list
     *
     * @var array
     **/
    protected $commands = array(
        'abort' => array('id' => true),
        'archive' => array('targets' => true, 'type' => true, 'mimes' => false, 'name' => false),
        'callback' => array('node' => true, 'json' => false, 'bind' => false, 'done' => false),
        'chmod' => array('targets' => true, 'mode' => true),
        'dim' => array('target' => true, 'substitute' => false),
        'duplicate' => array('targets' => true, 'suffix' => false),
        'editor' => array('name' => true, 'method' => true, 'args' => false),
        'extract' => array('target' => true, 'mimes' => false, 'makedir' => false),
        'file' => array('target' => true, 'download' => false, 'cpath' => false, 'onetime' => false),
        'get' => array('target' => true, 'conv' => false),
        'info' => array('targets' => true, 'compare' => false),
        'ls' => array('target' => true, 'mimes' => false, 'intersect' => false),
        'mkdir' => array('target' => true, 'name' => false, 'dirs' => false),
        'mkfile' => array('target' => true, 'name' => true, 'mimes' => false),
        'netmount' => array('protocol' => true, 'host' => true, 'path' => false, 'port' => false, 'user' => false, 'pass' => false, 'alias' => false, 'options' => false),
        'open' => array('target' => false, 'tree' => false, 'init' => false, 'mimes' => false, 'compare' => false),
        'parents' => array('target' => true, 'until' => false),
        'paste' => array('dst' => true, 'targets' => true, 'cut' => false, 'mimes' => false, 'renames' => false, 'hashes' => false, 'suffix' => false),
        'put' => array('target' => true, 'content' => '', 'mimes' => false, 'encoding' => false),
        'rename' => array('target' => true, 'name' => true, 'mimes' => false, 'targets' => false, 'q' => false),
        'resize' => array('target' => true, 'width' => false, 'height' => false, 'mode' => false, 'x' => false, 'y' => false, 'degree' => false, 'quality' => false, 'bg' => false),
        'rm' => array('targets' => true),
        'search' => array('q' => true, 'mimes' => false, 'target' => false, 'type' => false),
        'size' => array('targets' => true),
        'subdirs' => array('targets' => true),
        'tmb' => array('targets' => true),
        'tree' => array('target' => true),
        'upload' => array('target' => true, 'FILES' => true, 'mimes' => false, 'html' => false, 'upload' => false, 'name' => false, 'upload_path' => false, 'chunk' => false, 'cid' => false, 'node' => false, 'renames' => false, 'hashes' => false, 'suffix' => false, 'mtime' => false, 'overwrite' => false, 'contentSaveId' => false),
        'url' => array('target' => true, 'options' => false),
        'zipdl' => array('targets' => true, 'download' => false)
    );

    /**
     * Plugins instance
     *
     * @var array
     **/
    protected $plugins = array();

    /**
     * Commands listeners
     *
     * @var array
     **/
    protected $listeners = array();

    /**
     * script work time for debug
     *
     * @var string
     **/
    protected $time = 0;
    /**
     * Is elFinder init correctly?
     *
     * @var bool
     **/
    protected $loaded = false;
    /**
     * Send debug to client?
     *
     * @var string
     **/
    protected $debug = false;

    /**
     * Call `session_write_close()` before exec command?
     *
     * @var bool
     */
    protected $sessionCloseEarlier = true;

    /**
     * SESSION use commands @see __construct()
     *
     * @var array
     */
    protected $sessionUseCmds = array();

    /**
     * session expires timeout
     *
     * @var int
     **/
    protected $timeout = 0;

    /**
     * Temp dir path for Upload
     *
     * @var string
     */
    protected $uploadTempPath = '';

    /**
     * Max allowed archive files size (0 - no limit)
     *
     * @var integer
     */
    protected $maxArcFilesSize = 0;

    /**
     * undocumented class variable
     *
     * @var string
     **/
    protected $uploadDebug = '';

    /**
     * Max allowed numbar of targets (0 - no limit)
     *
     * @var integer
     */
    public $maxTargets = 1000;

    /**
     * Errors from PHP
     *
     * @var array
     **/
    public static $phpErrors = array();

    /**
     * Errors from not mounted volumes
     *
     * @var array
     **/
    public $mountErrors = array();


    /**
     * Archivers cache
     *
     * @var array
     */
    public static $archivers = array();

    /**
     * URL for callback output window for CORS
     * redirect to this URL when callback output
     *
     * @var string URL
     */
    protected $callbackWindowURL = '';

    /**
     * hash of items to unlock on command completion
     *
     * @var array hashes
     */
    protected $autoUnlocks = array();

    /**
     * Item locking expiration (seconds)
     * Default: 3600 secs
     *
     * @var integer
     */
    protected $itemLockExpire = 3600;

    /**
     * Additional request querys
     *
     * @var array|null
     */
    protected $customData = null;

    /**
     * Ids to remove of session var "urlContentSaveIds" for contents uploading by URL
     *
     * @var array
     */
    protected $removeContentSaveIds = array();

    /**
     * LAN class allowed when uploading via URL
     * 
     * Array keys are 'local', 'private_a', 'private_b', 'private_c' and 'link'
     * 
     * local:     127.0.0.0/8
     * private_a: 10.0.0.0/8
     * private_b: 172.16.0.0/12
     * private_c: 192.168.0.0/16
     * link:      169.254.0.0/16
     *
     * @var        array
     */
    protected $uploadAllowedLanIpClasses = array();

    /**
     * Flag of throw Error on exec()
     *
     * @var boolean
     */
    protected $throwErrorOnExec = false;

    /**
     * Default params of toastParams
     *
     * @var        array
     */
    protected $toastParamsDefault = array(
        'mode'   => 'warning',
        'prefix' => ''
    );

    /**
     * Toast params of runtime notification
     *
     * @var        array
     */
    private $toastParams = array();

    /**
     * Toast messages of runtime notification
     *
     * @var        array
     */
    private $toastMessages = array();

    /**
     * Optional UTF-8 encoder
     *
     * @var        callable || null
     */
    private $utf8Encoder = null;

    /**
     * Seekable URL file pointer ids -  for getStreamByUrl()
     *
     * @var        array
     */
    private static $seekableUrlFps = array();

    // Errors messages
    const ERROR_ACCESS_DENIED = 'errAccess';
    const ERROR_ARC_MAXSIZE = 'errArcMaxSize';
    const ERROR_ARC_SYMLINKS = 'errArcSymlinks';
    const ERROR_ARCHIVE = 'errArchive';
    const ERROR_ARCHIVE_EXEC = 'errArchiveExec';
    const ERROR_ARCHIVE_TYPE = 'errArcType';
    const ERROR_CONF = 'errConf';
    const ERROR_CONF_NO_JSON = 'errJSON';
    const ERROR_CONF_NO_VOL = 'errNoVolumes';
    const ERROR_CONV_UTF8 = 'errConvUTF8';
    const ERROR_COPY = 'errCopy';
    const ERROR_COPY_FROM = 'errCopyFrom';
    const ERROR_COPY_ITSELF = 'errCopyInItself';
    const ERROR_COPY_TO = 'errCopyTo';
    const ERROR_CREATING_TEMP_DIR = 'errCreatingTempDir';
    const ERROR_DIR_NOT_FOUND = 'errFolderNotFound';
    const ERROR_EXISTS = 'errExists';        // 'File named "$1" already exists.'
    const ERROR_EXTRACT = 'errExtract';
    const ERROR_EXTRACT_EXEC = 'errExtractExec';
    const ERROR_FILE_NOT_FOUND = 'errFileNotFound';     // 'File not found.'
    const ERROR_FTP_DOWNLOAD_FILE = 'errFtpDownloadFile';
    const ERROR_FTP_MKDIR = 'errFtpMkdir';
    const ERROR_FTP_UPLOAD_FILE = 'errFtpUploadFile';
    const ERROR_INV_PARAMS = 'errCmdParams';
    const ERROR_INVALID_DIRNAME = 'errInvDirname';    // 'Invalid folder name.'
    const ERROR_INVALID_NAME = 'errInvName';       // 'Invalid file name.'
    const ERROR_LOCKED = 'errLocked';        // '"$1" is locked and can not be renamed, moved or removed.'
    const ERROR_MAX_TARGTES = 'errMaxTargets'; // 'Max number of selectable items is $1.'
    const ERROR_MKDIR = 'errMkdir';
    const ERROR_MKFILE = 'errMkfile';
    const ERROR_MKOUTLINK = 'errMkOutLink';        // 'Unable to create a link to outside the volume root.'
    const ERROR_MOVE = 'errMove';
    const ERROR_NETMOUNT = 'errNetMount';
    const ERROR_NETMOUNT_FAILED = 'errNetMountFailed';
    const ERROR_NETMOUNT_NO_DRIVER = 'errNetMountNoDriver';
    const ERROR_NETUNMOUNT = 'errNetUnMount';
    const ERROR_NOT_ARCHIVE = 'errNoArchive';
    const ERROR_NOT_DIR = 'errNotFolder';
    const ERROR_NOT_FILE = 'errNotFile';
    const ERROR_NOT_REPLACE = 'errNotReplace';       // Object "$1" already exists at this location and can not be replaced with object of another type.
    const ERROR_NOT_UTF8_CONTENT = 'errNotUTF8Content';
    const ERROR_OPEN = 'errOpen';
    const ERROR_PERM_DENIED = 'errPerm';
    const ERROR_REAUTH_REQUIRE = 'errReauthRequire';  // 'Re-authorization is required.'
    const ERROR_RENAME = 'errRename';
    const ERROR_REPLACE = 'errReplace';          // 'Unable to replace "$1".'
    const ERROR_RESIZE = 'errResize';
    const ERROR_RESIZESIZE = 'errResizeSize';
    const ERROR_RM = 'errRm';               // 'Unable to remove "$1".'
    const ERROR_RM_SRC = 'errRmSrc';            // 'Unable remove source file(s)'
    const ERROR_SAVE = 'errSave';
    const ERROR_SEARCH_TIMEOUT = 'errSearchTimeout';    // 'Timed out while searching "$1". Search result is partial.'
    const ERROR_SESSION_EXPIRES = 'errSessionExpires';
    const ERROR_TRGDIR_NOT_FOUND = 'errTrgFolderNotFound'; // 'Target folder "$1" not found.'
    const ERROR_UNKNOWN = 'errUnknown';
    const ERROR_UNKNOWN_CMD = 'errUnknownCmd';
    const ERROR_UNSUPPORT_TYPE = 'errUsupportType';
    const ERROR_UPLOAD = 'errUpload';           // 'Upload error.'
    const ERROR_UPLOAD_FILE = 'errUploadFile';       // 'Unable to upload "$1".'
    const ERROR_UPLOAD_FILE_MIME = 'errUploadMime';       // 'File type not allowed.'
    const ERROR_UPLOAD_FILE_SIZE = 'errUploadFileSize';   // 'File exceeds maximum allowed size.'
    const ERROR_UPLOAD_NO_FILES = 'errUploadNoFiles';    // 'No files found for upload.'
    const ERROR_UPLOAD_TEMP = 'errUploadTemp';       // 'Unable to make temporary file for upload.'
    const ERROR_UPLOAD_TOTAL_SIZE = 'errUploadTotalSize';  // 'Data exceeds the maximum allowed size.'
    const ERROR_UPLOAD_TRANSFER = 'errUploadTransfer';   // '"$1" transfer error.'
    const ERROR_MAX_MKDIRS = 'errMaxMkdirs'; // 'You can create up to $1 folders at one time.'

    /**
     * Constructor
     *
     * @param  array  elFinder and roots configurations
     *
     * @author Dmitry (dio) Levashov
     */
    public function __construct($opts)
    {
        // set default_charset
        if (version_compare(PHP_VERSION, '5.6', '>=')) {
            if (($_val = ini_get('iconv.internal_encoding')) && strtoupper($_val) !== 'UTF-8') {
                ini_set('iconv.internal_encoding', '');
            }
            if (($_val = ini_get('mbstring.internal_encoding')) && strtoupper($_val) !== 'UTF-8') {
                ini_set('mbstring.internal_encoding', '');
            }
            if (($_val = ini_get('internal_encoding')) && strtoupper($_val) !== 'UTF-8') {
                ini_set('internal_encoding', '');
            }
        } else {
            if (function_exists('iconv_set_encoding') && strtoupper(iconv_get_encoding('internal_encoding')) !== 'UTF-8') {
                iconv_set_encoding('internal_encoding', 'UTF-8');
            }
            if (function_exists('mb_internal_encoding') && strtoupper(mb_internal_encoding()) !== 'UTF-8') {
                mb_internal_encoding('UTF-8');
            }
        }
        ini_set('default_charset', 'UTF-8');

        // define accept constant of server commands path
        !defined('ELFINDER_TAR_PATH') && define('ELFINDER_TAR_PATH', 'tar');
        !defined('ELFINDER_GZIP_PATH') && define('ELFINDER_GZIP_PATH', 'gzip');
        !defined('ELFINDER_BZIP2_PATH') && define('ELFINDER_BZIP2_PATH', 'bzip2');
        !defined('ELFINDER_XZ_PATH') && define('ELFINDER_XZ_PATH', 'xz');
        !defined('ELFINDER_ZIP_PATH') && define('ELFINDER_ZIP_PATH', 'zip');
        !defined('ELFINDER_UNZIP_PATH') && define('ELFINDER_UNZIP_PATH', 'unzip');
        !defined('ELFINDER_RAR_PATH') && define('ELFINDER_RAR_PATH', 'rar');
        // Create archive in RAR4 format even when using RAR5 library (true or false)
        !defined('ELFINDER_RAR_MA4') && define('ELFINDER_RAR_MA4', false);
        !defined('ELFINDER_UNRAR_PATH') && define('ELFINDER_UNRAR_PATH', 'unrar');
        !defined('ELFINDER_7Z_PATH') && define('ELFINDER_7Z_PATH', (substr(PHP_OS, 0, 3) === 'WIN') ? '7z' : '7za');
        !defined('ELFINDER_CONVERT_PATH') && define('ELFINDER_CONVERT_PATH', 'convert');
        !defined('ELFINDER_IDENTIFY_PATH') && define('ELFINDER_IDENTIFY_PATH', 'identify');
        !defined('ELFINDER_EXIFTRAN_PATH') && define('ELFINDER_EXIFTRAN_PATH', 'exiftran');
        !defined('ELFINDER_JPEGTRAN_PATH') && define('ELFINDER_JPEGTRAN_PATH', 'jpegtran');
        !defined('ELFINDER_FFMPEG_PATH') && define('ELFINDER_FFMPEG_PATH', 'ffmpeg');

        !defined('ELFINDER_DISABLE_ZIPEDITOR') && define('ELFINDER_DISABLE_ZIPEDITOR', false);

        // enable(true)/disable(false) handling postscript on ImageMagick
        // Should be `false` as long as there is a Ghostscript vulnerability
        // see https://artifex.com/news/ghostscript-security-resolved/
        !defined('ELFINDER_IMAGEMAGICK_PS') && define('ELFINDER_IMAGEMAGICK_PS', false);

        // for backward compat
        $this->version = (string)self::$ApiVersion;

        // set error handler of WARNING, NOTICE
        $errLevel = E_WARNING | E_NOTICE | E_USER_WARNING | E_USER_NOTICE | E_STRICT | E_RECOVERABLE_ERROR;
        if (defined('E_DEPRECATED')) {
            $errLevel |= E_DEPRECATED | E_USER_DEPRECATED;
        }
        set_error_handler('elFinder::phpErrorHandler', $errLevel);

        // Associative array of file pointers to close at the end of script: ['temp file pointer' => true]
        $GLOBALS['elFinderTempFps'] = array();
        // Associative array of files to delete at the end of script: ['temp file path' => true]
        $GLOBALS['elFinderTempFiles'] = array();
        // regist Shutdown function
        register_shutdown_function(array('elFinder', 'onShutdown'));

        // convert PATH_INFO to GET query
        if (!empty($_SERVER['PATH_INFO'])) {
            $_ps = explode('/', trim($_SERVER['PATH_INFO'], '/'));
            if (!isset($_GET['cmd'])) {
                $_cmd = $_ps[0];
                if (isset($this->commands[$_cmd])) {
                    $_GET['cmd'] = $_cmd;
                    $_i = 1;
                    foreach (array_keys($this->commands[$_cmd]) as $_k) {
                        if (isset($_ps[$_i])) {
                            if (!isset($_GET[$_k])) {
                                $_GET[$_k] = $_ps[$_i++];
                            }
                        } else {
                            break;
                        }
                    }
                }
            }
        }

        // set elFinder instance
        elFinder::$instance = $this;

        // setup debug mode
        $this->debug = (isset($opts['debug']) && $opts['debug'] ? true : false);
        if ($this->debug) {
            error_reporting(defined('ELFINDER_DEBUG_ERRORLEVEL') ? ELFINDER_DEBUG_ERRORLEVEL : -1);
            ini_set('display_errors', '1');
            // clear output buffer and stop output filters
            while (ob_get_level() && ob_end_clean()) {
            }
        }

        if (!interface_exists('elFinderSessionInterface')) {
            include_once dirname(__FILE__) . '/elFinderSessionInterface.php';
        }

        // session handler
        if (!empty($opts['session']) && $opts['session'] instanceof elFinderSessionInterface) {
            $this->session = $opts['session'];
        } else {
            $sessionOpts = array(
                'base64encode' => !empty($opts['base64encodeSessionData']),
                'keys' => array(
                    'default' => !empty($opts['sessionCacheKey']) ? $opts['sessionCacheKey'] : 'elFinderCaches',
                    'netvolume' => !empty($opts['netVolumesSessionKey']) ? $opts['netVolumesSessionKey'] : 'elFinderNetVolumes'
                )
            );
            if (!class_exists('elFinderSession')) {
                include_once dirname(__FILE__) . '/elFinderSession.php';
            }
            $this->session = new elFinderSession($sessionOpts);
        }
        // try session start | restart
        $this->session->start();

        // 'netmount' added to handle requests synchronously on unmount
        $sessionUseCmds = array('netmount');
        if (isset($opts['sessionUseCmds']) && is_array($opts['sessionUseCmds'])) {
            $sessionUseCmds = array_merge($sessionUseCmds, $opts['sessionUseCmds']);
        }

        // set self::$volumesCnt by HTTP header "X-elFinder-VolumesCntStart"
        if (isset($_SERVER['HTTP_X_ELFINDER_VOLUMESCNTSTART']) && ($volumesCntStart = intval($_SERVER['HTTP_X_ELFINDER_VOLUMESCNTSTART']))) {
            self::$volumesCnt = $volumesCntStart;
        }

        $this->time = $this->utime();
        $this->sessionCloseEarlier = isset($opts['sessionCloseEarlier']) ? (bool)$opts['sessionCloseEarlier'] : true;
        $this->sessionUseCmds = array_flip($sessionUseCmds);
        $this->timeout = (isset($opts['timeout']) ? $opts['timeout'] : 0);
        $this->uploadTempPath = (isset($opts['uploadTempPath']) ? $opts['uploadTempPath'] : '');
        $this->callbackWindowURL = (isset($opts['callbackWindowURL']) ? $opts['callbackWindowURL'] : '');
        $this->maxTargets = (isset($opts['maxTargets']) ? intval($opts['maxTargets']) : $this->maxTargets);
        elFinder::$commonTempPath = (isset($opts['commonTempPath']) ? realpath($opts['commonTempPath']) : dirname(__FILE__) . '/.tmp');
        if (!is_writable(elFinder::$commonTempPath)) {
            elFinder::$commonTempPath = sys_get_temp_dir();
            if (!is_writable(elFinder::$commonTempPath)) {
                elFinder::$commonTempPath = '';
            }
        }
        if (isset($opts['connectionFlagsPath']) && is_writable($opts['connectionFlagsPath'] = realpath($opts['connectionFlagsPath']))) {
            elFinder::$connectionFlagsPath = $opts['connectionFlagsPath'];
        } else {
            elFinder::$connectionFlagsPath = elFinder::$commonTempPath;
        }

        if (!empty($opts['tmpLinkPath'])) {
            elFinder::$tmpLinkPath = realpath($opts['tmpLinkPath']);
        }
        if (!empty($opts['tmpLinkUrl'])) {
            elFinder::$tmpLinkUrl = $opts['tmpLinkUrl'];
        }
        if (!empty($opts['tmpLinkLifeTime'])) {
            elFinder::$tmpLinkLifeTime = $opts['tmpLinkLifeTime'];
        }
        if (!empty($opts['textMimes']) && is_array($opts['textMimes'])) {
            elfinder::$textMimes = $opts['textMimes'];
        }
        if (!empty($opts['urlUploadFilter'])) {
            $this->urlUploadFilter = $opts['urlUploadFilter'];
        }
        $this->maxArcFilesSize = isset($opts['maxArcFilesSize']) ? intval($opts['maxArcFilesSize']) : 0;
        $this->optionsNetVolumes = (isset($opts['optionsNetVolumes']) && is_array($opts['optionsNetVolumes'])) ? $opts['optionsNetVolumes'] : array();
        if (isset($opts['itemLockExpire'])) {
            $this->itemLockExpire = intval($opts['itemLockExpire']);
        }

        if (!empty($opts['uploadAllowedLanIpClasses'])) {
            $this->uploadAllowedLanIpClasses = array_flip($opts['uploadAllowedLanIpClasses']);
        }

        // deprecated settings
        $this->netVolumesSessionKey = !empty($opts['netVolumesSessionKey']) ? $opts['netVolumesSessionKey'] : 'elFinderNetVolumes';
        self::$sessionCacheKey = !empty($opts['sessionCacheKey']) ? $opts['sessionCacheKey'] : 'elFinderCaches';

        // check session cache
        $_optsMD5 = md5(json_encode($opts['roots']));
        if ($this->session->get('_optsMD5') !== $_optsMD5) {
            $this->session->set('_optsMD5', $_optsMD5);
        }

        // setlocale and global locale regists to elFinder::locale
        self::$locale = !empty($opts['locale']) ? $opts['locale'] : (substr(PHP_OS, 0, 3) === 'WIN' ? 'C' : 'en_US.UTF-8');
        if (false === setlocale(LC_ALL, self::$locale)) {
            self::$locale = setlocale(LC_ALL, '0');
        }

        // set defaultMimefile
        elFinder::$defaultMimefile = isset($opts['defaultMimefile']) ? $opts['defaultMimefile'] : '';

        // set memoryLimitGD
        elFinder::$memoryLimitGD = isset($opts['memoryLimitGD']) ? $opts['memoryLimitGD'] : 0;

        // set flag of throwErrorOnExec
        // `true` need `try{}` block for `$connector->run();`
        $this->throwErrorOnExec = !empty($opts['throwErrorOnExec']);

        // set archivers
        elFinder::$archivers = isset($opts['archivers']) && is_array($opts['archivers']) ? $opts['archivers'] : array();

        // set utf8Encoder
        if (isset($opts['utf8Encoder']) && is_callable($opts['utf8Encoder'])) {
            $this->utf8Encoder = $opts['utf8Encoder'];
        }

        // bind events listeners
        if (!empty($opts['bind']) && is_array($opts['bind'])) {
            $_req = $_SERVER["REQUEST_METHOD"] == 'POST' ? $_POST : $_GET;
            $_reqCmd = isset($_req['cmd']) ? $_req['cmd'] : '';
            foreach ($opts['bind'] as $cmd => $handlers) {
                $doRegist = (strpos($cmd, '*') !== false);
                if (!$doRegist) {
                    $doRegist = ($_reqCmd && in_array($_reqCmd, array_map('self::getCmdOfBind', explode(' ', $cmd))));
                }
                if ($doRegist) {
                    // for backward compatibility
                    if (!is_array($handlers)) {
                        $handlers = array($handlers);
                    } else {
                        if (count($handlers) === 2 && is_callable($handlers)) {
                            $handlers = array($handlers);
                        }
                    }
                    foreach ($handlers as $handler) {
                        if ($handler) {
                            if (is_string($handler) && strpos($handler, '.')) {
                                list($_domain, $_name, $_method) = array_pad(explode('.', $handler), 3, '');
                                if (strcasecmp($_domain, 'plugin') === 0) {
                                    if ($plugin = $this->getPluginInstance($_name, isset($opts['plugin'][$_name]) ? $opts['plugin'][$_name] : array())
                                        and method_exists($plugin, $_method)) {
                                        $this->bind($cmd, array($plugin, $_method));
                                    }
                                }
                            } else {
                                $this->bind($cmd, $handler);
                            }
                        }
                    }
                }
            }
        }

        if (!isset($opts['roots']) || !is_array($opts['roots'])) {
            $opts['roots'] = array();
        }

        // try to enable elFinderVolumeFlysystemZipArchiveNetmount to zip editing
        if (empty(elFinder::$netDrivers['ziparchive'])) {
            elFinder::$netDrivers['ziparchive'] = 'FlysystemZipArchiveNetmount';
        }

        // check for net volumes stored in session
        $netVolumes = $this->getNetVolumes();
        foreach ($netVolumes as $key => $root) {
            if (!isset($root['id'])) {
                // given fixed unique id
                if (!$root['id'] = $this->getNetVolumeUniqueId($netVolumes)) {
                    $this->mountErrors[] = 'Netmount Driver "' . $root['driver'] . '" : Could\'t given volume id.';
                    continue;
                }
            }
            $root['_isNetVolume'] = true;
            $opts['roots'][$key] = $root;
        }

        // "mount" volumes
        foreach ($opts['roots'] as $i => $o) {
            $class = 'elFinderVolume' . (isset($o['driver']) ? $o['driver'] : '');

            if (class_exists($class)) {
                /* @var elFinderVolumeDriver $volume */
                $volume = new $class();

                try {
                    if ($this->maxArcFilesSize && (empty($o['maxArcFilesSize']) || $this->maxArcFilesSize < $o['maxArcFilesSize'])) {
                        $o['maxArcFilesSize'] = $this->maxArcFilesSize;
                    }
                    // pass session handler
                    $volume->setSession($this->session);
                    if (!$this->default) {
                        $volume->setNeedOnline(true);
                    }
                    if ($volume->mount($o)) {
                        // unique volume id (ends on "_") - used as prefix to files hash
                        $id = $volume->id();

                        $this->volumes[$id] = $volume;
                        if ((!$this->default || $volume->root() !== $volume->defaultPath()) && $volume->isReadable()) {
                            $this->default = $volume;
                        }
                    } else {
                        if (!empty($o['_isNetVolume'])) {
                            $this->removeNetVolume($i, $volume);
                        }
                        $this->mountErrors[] = 'Driver "' . $class . '" : ' . implode(' ', $volume->error());
                    }
                } catch (Exception $e) {
                    if (!empty($o['_isNetVolume'])) {
                        $this->removeNetVolume($i, $volume);
                    }
                    $this->mountErrors[] = 'Driver "' . $class . '" : ' . $e->getMessage();
                }
            } else {
                if (!empty($o['_isNetVolume'])) {
                    $this->removeNetVolume($i, $volume);
                }
                $this->mountErrors[] = 'Driver "' . $class . '" does not exist';
            }
        }

        // if at least one readable volume - ii desu >_<
        $this->loaded = !empty($this->default);

        // restore error handler for now
        restore_error_handler();
    }

    /**
     * Return elFinder session wrapper instance
     *
     * @return  elFinderSessionInterface
     **/
    public function getSession()
    {
        return $this->session;
    }

    /**
     * Return true if fm init correctly
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    public function loaded()
    {
        return $this->loaded;
    }

    /**
     * Return version (api) number
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    public function version()
    {
        return self::$ApiVersion;
    }

    /**
     * Return revision (api) number
     *
     * @return string
     * @author Naoki Sawada
     **/
    public function revision()
    {
        return self::$ApiRevision;
    }

    /**
     * Add handler to elFinder command
     *
     * @param  string  command name
     * @param  string|array  callback name or array(object, method)
     *
     * @return elFinder
     * @author Dmitry (dio) Levashov
     **/
    public function bind($cmd, $handler)
    {
        $allCmds = array_keys($this->commands);
        $cmds = array();
        foreach (explode(' ', $cmd) as $_cmd) {
            if ($_cmd !== '') {
                if ($all = strpos($_cmd, '*') !== false) {
                    list(, $sub) = array_pad(explode('.', $_cmd), 2, '');
                    if ($sub) {
                        $sub = str_replace('\'', '\\\'', $sub);
                        $subs = array_fill(0, count($allCmds), $sub);
                        $cmds = array_merge($cmds, array_map(array('elFinder', 'addSubToBindName'), $allCmds, $subs));
                    } else {
                        $cmds = array_merge($cmds, $allCmds);
                    }
                } else {
                    $cmds[] = $_cmd;
                }
            }
        }
        $cmds = array_unique($cmds);

        foreach ($cmds as $cmd) {
            if (!isset($this->listeners[$cmd])) {
                $this->listeners[$cmd] = array();
            }

            if (is_callable($handler)) {
                $this->listeners[$cmd][] = $handler;
            }
        }

        return $this;
    }

    /**
     * Remove event (command exec) handler
     *
     * @param  string  command name
     * @param  string|array  callback name or array(object, method)
     *
     * @return elFinder
     * @author Dmitry (dio) Levashov
     **/
    public function unbind($cmd, $handler)
    {
        if (!empty($this->listeners[$cmd])) {
            foreach ($this->listeners[$cmd] as $i => $h) {
                if ($h === $handler) {
                    unset($this->listeners[$cmd][$i]);
                    return $this;
                }
            }
        }
        return $this;
    }

    /**
     * Trigger binded functions
     *
     * @param      string  $cmd     binded command name
     * @param      array   $vars    variables to pass to listeners
     * @param      array   $errors  array into which the error is written
     */
    public function trigger($cmd, $vars, &$errors)
    {
        if (!empty($this->listeners[$cmd])) {
            foreach ($this->listeners[$cmd] as $handler) {
                $_res = call_user_func_array($handler, $vars);
                if ($_res && is_array($_res)) {
                    $_err = !empty($_res['error'])? $_res['error'] : (!empty($_res['warning'])? $_res['warning'] : null);
                    if ($_err) {
                        if (is_array($_err)) {
                            $errors = array_merge($errors, $_err);
                        } else {
                            $errors[] = (string)$_err;
                        }
                        if ($_res['error']) {
                            throw new elFinderTriggerException();
                        }
                    }
                }
            }
        }
    }

    /**
     * Return true if command exists
     *
     * @param  string  command name
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    public function commandExists($cmd)
    {
        return $this->loaded && isset($this->commands[$cmd]) && method_exists($this, $cmd);
    }

    /**
     * Return root - file's owner (public func of volume())
     *
     * @param  string  file hash
     *
     * @return elFinderVolumeDriver
     * @author Naoki Sawada
     */
    public function getVolume($hash)
    {
        return $this->volume($hash);
    }

    /**
     * Return command required arguments info
     *
     * @param  string  command name
     *
     * @return array
     * @author Dmitry (dio) Levashov
     **/
    public function commandArgsList($cmd)
    {
        if ($this->commandExists($cmd)) {
            $list = $this->commands[$cmd];
            $list['reqid'] = false;
        } else {
            $list = array();
        }
        return $list;
    }

    private function session_expires()
    {

        if (!$last = $this->session->get(':LAST_ACTIVITY')) {
            $this->session->set(':LAST_ACTIVITY', time());
            return false;
        }

        if (($this->timeout > 0) && (time() - $last > $this->timeout)) {
            return true;
        }

        $this->session->set(':LAST_ACTIVITY', time());
        return false;
    }

    /**
     * Exec command and return result
     *
     * @param  string $cmd  command name
     * @param  array  $args command arguments
     *
     * @return array
     * @throws elFinderAbortException|Exception
     * @author Dmitry (dio) Levashov
     **/
    public function exec($cmd, $args)
    {
        // set error handler of WARNING, NOTICE
        set_error_handler('elFinder::phpErrorHandler', E_WARNING | E_NOTICE | E_USER_WARNING | E_USER_NOTICE);

        // set current request args
        self::$currentArgs = $args;

        if (!$this->loaded) {
            return array('error' => $this->error(self::ERROR_CONF, self::ERROR_CONF_NO_VOL));
        }

        if ($this->session_expires()) {
            return array('error' => $this->error(self::ERROR_SESSION_EXPIRES));
        }

        if (!$this->commandExists($cmd)) {
            return array('error' => $this->error(self::ERROR_UNKNOWN_CMD));
        }

        // check request id
        $args['reqid'] = preg_replace('[^0-9a-fA-F]', '', !empty($args['reqid']) ? $args['reqid'] : (!empty($_SERVER['HTTP_X_ELFINDERREQID']) ? $_SERVER['HTTP_X_ELFINDERREQID'] : ''));

        // to abort this request
        if ($cmd === 'abort') {
            $this->abort($args);
            return array('error' => 0);
        }

        // make flag file and set self::$abortCheckFile
        if ($args['reqid']) {
            $this->abort(array('makeFile' => $args['reqid']));
        }

        if (!empty($args['mimes']) && is_array($args['mimes'])) {
            foreach ($this->volumes as $id => $v) {
                $this->volumes[$id]->setMimesFilter($args['mimes']);
            }
        }

        // regist shutdown function as fallback
        register_shutdown_function(array($this, 'itemAutoUnlock'));

        // detect destination dirHash and volume
        $dstVolume = false;
        $dst = !empty($args['target']) ? $args['target'] : (!empty($args['dst']) ? $args['dst'] : '');
        if ($dst) {
            $dstVolume = $this->volume($dst);
        } else if (isset($args['targets']) && is_array($args['targets']) && isset($args['targets'][0])) {
            $dst = $args['targets'][0];
            $dstVolume = $this->volume($dst);
            if ($dstVolume && ($_stat = $dstVolume->file($dst)) && !empty($_stat['phash'])) {
                $dst = $_stat['phash'];
            } else {
                $dst = '';
            }
        } else if ($cmd === 'open') {
            // for initial open without args `target`
            $dstVolume = $this->default;
            $dst = $dstVolume->defaultPath();
        }

        $result = null;

        // call pre handlers for this command
        $args['sessionCloseEarlier'] = isset($this->sessionUseCmds[$cmd]) ? false : $this->sessionCloseEarlier;
        if (!empty($this->listeners[$cmd . '.pre'])) {
            foreach ($this->listeners[$cmd . '.pre'] as $handler) {
                $_res = call_user_func_array($handler, array($cmd, &$args, $this, $dstVolume));
                if (is_array($_res)) {
                    if (!empty($_res['preventexec'])) {
                        $result = array('error' => true);
                        if ($cmd === 'upload' && !empty($args['node'])) {
                            $result['callback'] = array(
                                'node' => $args['node'],
                                'bind' => $cmd
                            );
                        }
                        if (!empty($_res['results']) && is_array($_res['results'])) {
                            $result = array_merge($result, $_res['results']);
                        }
                        break;
                    }
                }
            }
        }

        // unlock session data for multiple access
        if ($this->sessionCloseEarlier && $args['sessionCloseEarlier']) {
            $this->session->close();
            // deprecated property
            elFinder::$sessionClosed = true;
        }

        if (substr(PHP_OS, 0, 3) === 'WIN') {
            // set time out
            elFinder::extendTimeLimit(300);
        }

        if (!is_array($result)) {
            try {
                $result = $this->$cmd($args);
            } catch (elFinderAbortException $e) {
                throw $e;
            } catch (Exception $e) {
                $error_res = json_decode($e->getMessage());
                $message = isset($error_res->error->message) ? $error_res->error->message : $e->getMessage();
                $result = array(
                    'error' => htmlspecialchars($message),
                    'sync' => true
                );
                if ($this->throwErrorOnExec) {
                    throw $e;
                }
            }
        }

        // check change dstDir
        $changeDst = false;
        if ($dst && $dstVolume && (!empty($result['added']) || !empty($result['removed']))) {
            $changeDst = true;
        }

        foreach ($this->volumes as $volume) {
            $removed = $volume->removed();
            if (!empty($removed)) {
                if (!isset($result['removed'])) {
                    $result['removed'] = array();
                }
                $result['removed'] = array_merge($result['removed'], $removed);
                if (!$changeDst && $dst && $dstVolume && $volume === $dstVolume) {
                    $changeDst = true;
                }
            }
            $added = $volume->added();
            if (!empty($added)) {
                if (!isset($result['added'])) {
                    $result['added'] = array();
                }
                $result['added'] = array_merge($result['added'], $added);
                if (!$changeDst && $dst && $dstVolume && $volume === $dstVolume) {
                    $changeDst = true;
                }
            }
            $volume->resetResultStat();
        }

        // dstDir is changed
        if ($changeDst) {
            if ($dstDir = $dstVolume->dir($dst)) {
                if (!isset($result['changed'])) {
                    $result['changed'] = array();
                }
                $result['changed'][] = $dstDir;
            }
        }

        // call handlers for this command
        if (!empty($this->listeners[$cmd])) {
            foreach ($this->listeners[$cmd] as $handler) {
                if (call_user_func_array($handler, array($cmd, &$result, $args, $this, $dstVolume))) {
                    // handler return true to force sync client after command completed
                    $result['sync'] = true;
                }
            }
        }

        // replace removed files info with removed files hashes
        if (!empty($result['removed'])) {
            $removed = array();
            foreach ($result['removed'] as $file) {
                $removed[] = $file['hash'];
            }
            $result['removed'] = array_unique($removed);
        }
        // remove hidden files and filter files by mimetypes
        if (!empty($result['added'])) {
            $result['added'] = $this->filter($result['added']);
        }
        // remove hidden files and filter files by mimetypes
        if (!empty($result['changed'])) {
            $result['changed'] = $this->filter($result['changed']);
        }
        // add toasts
        if ($this->toastMessages) {
            $result['toasts'] = array_merge(((isset($result['toasts']) && is_array($result['toasts']))? $result['toasts'] : array()), $this->toastMessages);
        }

        if ($this->debug || !empty($args['debug'])) {
            $result['debug'] = array(
                'connector' => 'php',
                'phpver' => PHP_VERSION,
                'time' => $this->utime() - $this->time,
                'memory' => (function_exists('memory_get_peak_usage') ? ceil(memory_get_peak_usage() / 1024) . 'Kb / ' : '') . ceil(memory_get_usage() / 1024) . 'Kb / ' . ini_get('memory_limit'),
                'upload' => $this->uploadDebug,
                'volumes' => array(),
                'mountErrors' => $this->mountErrors
            );

            foreach ($this->volumes as $id => $volume) {
                $result['debug']['volumes'][] = $volume->debug();
            }
        }

        // remove sesstion var 'urlContentSaveIds'
        if ($this->removeContentSaveIds) {
            $urlContentSaveIds = $this->session->get('urlContentSaveIds', array());
            foreach (array_keys($this->removeContentSaveIds) as $contentSaveId) {
                if (isset($urlContentSaveIds[$contentSaveId])) {
                    unset($urlContentSaveIds[$contentSaveId]);
                }
            }
            if ($urlContentSaveIds) {
                $this->session->set('urlContentSaveIds', $urlContentSaveIds);
            } else {
                $this->session->remove('urlContentSaveIds');
            }
        }

        foreach ($this->volumes as $volume) {
            $volume->saveSessionCache();
            $volume->umount();
        }

        // unlock locked items
        $this->itemAutoUnlock();

        // custom data
        if ($this->customData !== null) {
            $result['customData'] = $this->customData ? json_encode($this->customData) : '';
        }

        if (!empty($result['debug'])) {
            $result['debug']['backendErrors'] = elFinder::$phpErrors;
        }
        elFinder::$phpErrors = array();
        restore_error_handler();

        if (!empty($result['callback'])) {
            $result['callback']['json'] = json_encode($result);
            $this->callback($result['callback']);
            return array();
        } else {
            return $result;
        }
    }

    /**
     * Return file real path
     *
     * @param  string $hash file hash
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    public function realpath($hash)
    {
        if (($volume = $this->volume($hash)) == false) {
            return false;
        }
        return $volume->realpath($hash);
    }

    /**
     * Sets custom data(s).
     *
     * @param  string|array $key The key or data array
     * @param  mixed        $val The value
     *
     * @return self    ( elFinder instance )
     */
    public function setCustomData($key, $val = null)
    {
        if (is_array($key)) {
            foreach ($key as $k => $v) {
                $this->customData[$k] = $v;
            }
        } else {
            $this->customData[$key] = $val;
        }
        return $this;
    }

    /**
     * Removes a custom data.
     *
     * @param  string $key The key
     *
     * @return self    ( elFinder instance )
     */
    public function removeCustomData($key)
    {
        $this->customData[$key] = null;
        return $this;
    }

    /**
     * Update sesstion value of a NetVolume option
     *
     * @param string $netKey
     * @param string $optionKey
     * @param mixed  $val
     *
     * @return bool
     */
    public function updateNetVolumeOption($netKey, $optionKey, $val)
    {
        $netVolumes = $this->getNetVolumes();
        if (is_string($netKey) && isset($netVolumes[$netKey]) && is_string($optionKey)) {
            $netVolumes[$netKey][$optionKey] = $val;
            $this->saveNetVolumes($netVolumes);
            return true;
        }
        return false;
    }

    /**
     * remove of session var "urlContentSaveIds"
     *
     * @param string $id
     */
    public function removeUrlContentSaveId($id)
    {
        $this->removeContentSaveIds[$id] = true;
    }

    /**
     * Return network volumes config.
     *
     * @return array
     * @author Dmitry (dio) Levashov
     */
    protected function getNetVolumes()
    {
        if ($data = $this->session->get('netvolume', array())) {
            return $data;
        }
        return array();
    }

    /**
     * Save network volumes config.
     *
     * @param  array $volumes volumes config
     *
     * @return void
     * @author Dmitry (dio) Levashov
     */
    protected function saveNetVolumes($volumes)
    {
        $this->session->set('netvolume', $volumes);
    }

    /**
     * Remove netmount volume
     *
     * @param string $key    netvolume key
     * @param object $volume volume driver instance
     *
     * @return bool
     */
    protected function removeNetVolume($key, $volume)
    {
        $netVolumes = $this->getNetVolumes();
        $res = true;
        if (is_object($volume) && method_exists($volume, 'netunmount')) {
            $res = $volume->netunmount($netVolumes, $key);
            $volume->clearSessionCache();
        }
        if ($res) {
            if (is_string($key) && isset($netVolumes[$key])) {
                unset($netVolumes[$key]);
                $this->saveNetVolumes($netVolumes);
                return true;
            }
        }
        return false;
    }

    /**
     * Get plugin instance & set to $this->plugins
     *
     * @param  string $name Plugin name (dirctory name)
     * @param  array  $opts Plugin options (optional)
     *
     * @return object | bool Plugin object instance Or false
     * @author Naoki Sawada
     */
    protected function getPluginInstance($name, $opts = array())
    {
        $key = strtolower($name);
        if (!isset($this->plugins[$key])) {
            $class = 'elFinderPlugin' . $name;
            // to try auto load
            if (!class_exists($class)) {
                $p_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'plugins' . DIRECTORY_SEPARATOR . $name . DIRECTORY_SEPARATOR . 'plugin.php';
                if (is_file($p_file)) {
                    include_once $p_file;
                }
            }
            if (class_exists($class, false)) {
                $this->plugins[$key] = new $class($opts);
            } else {
                $this->plugins[$key] = false;
            }
        }
        return $this->plugins[$key];
    }

    /***************************************************************************/
    /*                                 commands                                */
    /***************************************************************************/

    /**
     * Normalize error messages
     *
     * @return array
     * @author Dmitry (dio) Levashov
     **/
    public function error()
    {
        $errors = array();

        foreach (func_get_args() as $msg) {
            if (is_array($msg)) {
                $errors = array_merge($errors, $msg);
            } else {
                $errors[] = $msg;
            }
        }

        return count($errors) ? $errors : array(self::ERROR_UNKNOWN);
    }

    /**
     * @param $args
     *
     * @return array
     * @throws elFinderAbortException
     */
    protected function netmount($args)
    {
        $options = array();
        $protocol = $args['protocol'];
        $toast = '';

        if ($protocol === 'netunmount') {
            if (!empty($args['user']) && $volume = $this->volume($args['user'])) {
                if ($this->removeNetVolume($args['host'], $volume)) {
                    return array('removed' => array(array('hash' => $volume->root())));
                }
            }
            return array('sync' => true, 'error' => $this->error(self::ERROR_NETUNMOUNT));
        }

        $driver = isset(self::$netDrivers[$protocol]) ? self::$netDrivers[$protocol] : '';
        $class = 'elFinderVolume' . $driver;

        if (!class_exists($class)) {
            return array('error' => $this->error(self::ERROR_NETMOUNT, $args['host'], self::ERROR_NETMOUNT_NO_DRIVER));
        }

        if (!$args['path']) {
            $args['path'] = '/';
        }

        foreach ($args as $k => $v) {
            if ($k != 'options' && $k != 'protocol' && $v) {
                $options[$k] = $v;
            }
        }

        if (is_array($args['options'])) {
            foreach ($args['options'] as $key => $value) {
                $options[$key] = $value;
            }
        }

        /* @var elFinderVolumeDriver $volume */
        $volume = new $class();

        // pass session handler
        $volume->setSession($this->session);

        $volume->setNeedOnline(true);

        if (is_callable(array($volume, 'netmountPrepare'))) {
            $options = $volume->netmountPrepare($options);
            if (isset($options['exit'])) {
                if ($options['exit'] === 'callback') {
                    $this->callback($options['out']);
                }
                return $options;
            }
            if (!empty($options['toast'])) {
                $toast = $options['toast'];
                unset($options['toast']);
            }
        }

        $netVolumes = $this->getNetVolumes();

        if (!isset($options['id'])) {
            // given fixed unique id
            if (!$options['id'] = $this->getNetVolumeUniqueId($netVolumes)) {
                return array('error' => $this->error(self::ERROR_NETMOUNT, $args['host'], 'Could\'t given volume id.'));
            }
        }

        // load additional volume root options
        if (!empty($this->optionsNetVolumes['*'])) {
            $options = array_merge($this->optionsNetVolumes['*'], $options);
        }
        if (!empty($this->optionsNetVolumes[$protocol])) {
            $options = array_merge($this->optionsNetVolumes[$protocol], $options);
        }

        if (!$key = $volume->netMountKey) {
            $key = md5($protocol . '-' . serialize($options));
        }
        $options['netkey'] = $key;

        if (!isset($netVolumes[$key]) && $volume->mount($options)) {
            // call post-process function of netmount
            if (is_callable(array($volume, 'postNetmount'))) {
                $volume->postNetmount($options);
            }
            $options['driver'] = $driver;
            $netVolumes[$key] = $options;
            $this->saveNetVolumes($netVolumes);
            $rootstat = $volume->file($volume->root());
            $res = array('added' => array($rootstat));
            if ($toast) {
                $res['toast'] = $toast;
            }
            return $res;
        } else {
            $this->removeNetVolume(null, $volume);
            return array('error' => $this->error(self::ERROR_NETMOUNT, $args['host'], implode(' ', $volume->error())));
        }
    }

    /**
     * "Open" directory
     * Return array with following elements
     *  - cwd          - opened dir info
     *  - files        - opened dir content [and dirs tree if $args[tree]]
     *  - api          - api version (if $args[init])
     *  - uplMaxSize   - if $args[init]
     *  - error        - on failed
     *
     * @param  array  command arguments
     *
     * @return array
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function open($args)
    {
        $target = $args['target'];
        $init = !empty($args['init']);
        $tree = !empty($args['tree']);
        $volume = $this->volume($target);
        $cwd = $volume ? $volume->dir($target) : false;
        $hash = $init ? 'default folder' : '#' . $target;
        $compare = '';

        // on init request we can get invalid dir hash -
        // dir which can not be opened now, but remembered by client,
        // so open default dir
        if ((!$cwd || !$cwd['read']) && $init) {
            $volume = $this->default;
            $target = $volume->defaultPath();
            $cwd = $volume->dir($target);
        }

        if (!$cwd) {
            return array('error' => $this->error(self::ERROR_OPEN, $hash, self::ERROR_DIR_NOT_FOUND));
        }
        if (!$cwd['read']) {
            return array('error' => $this->error(self::ERROR_OPEN, $hash, self::ERROR_PERM_DENIED));
        }

        $files = array();

        // get current working directory files list
        if (($ls = $volume->scandir($cwd['hash'])) === false) {
            return array('error' => $this->error(self::ERROR_OPEN, $cwd['name'], $volume->error()));
        }

        if (isset($cwd['dirs']) && $cwd['dirs'] != 1) {
            $cwd = $volume->dir($target);
        }

        // get other volume root
        if ($tree) {
            foreach ($this->volumes as $id => $v) {
                $files[] = $v->file($v->root());
            }
        }

        // long polling mode
        if ($args['compare']) {
            $sleep = max(1, (int)$volume->getOption('lsPlSleep'));
            $standby = (int)$volume->getOption('plStandby');
            if ($standby > 0 && $sleep > $standby) {
                $standby = $sleep;
            }
            $limit = max(0, floor($standby / $sleep)) + 1;
            do {
                elFinder::extendTimeLimit(30 + $sleep);
                $_mtime = 0;
                foreach ($ls as $_f) {
                    if (isset($_f['ts'])) {
                        $_mtime = max($_mtime, $_f['ts']);
                    }
                }
                $compare = strval(count($ls)) . ':' . strval($_mtime);
                if ($compare !== $args['compare']) {
                    break;
                }
                if (--$limit) {
                    sleep($sleep);
                    $volume->clearstatcache();
                    if (($ls = $volume->scandir($cwd['hash'])) === false) {
                        break;
                    }
                }
            } while ($limit);
            if ($ls === false) {
                return array('error' => $this->error(self::ERROR_OPEN, $cwd['name'], $volume->error()));
            }
        }

        if ($ls) {
            if ($files) {
                $files = array_merge($files, $ls);
            } else {
                $files = $ls;
            }
        }

        $result = array(
            'cwd' => $cwd,
            'options' => $volume->options($cwd['hash']),
            'files' => $files
        );

        if ($compare) {
            $result['cwd']['compare'] = $compare;
        }

        if (!empty($args['init'])) {
            $result['api'] = sprintf('%.1F%03d', self::$ApiVersion, self::$ApiRevision);
            $result['uplMaxSize'] = ini_get('upload_max_filesize');
            $result['uplMaxFile'] = ini_get('max_file_uploads');
            $result['netDrivers'] = array_keys(self::$netDrivers);
            $result['maxTargets'] = $this->maxTargets;
            if ($volume) {
                $result['cwd']['root'] = $volume->root();
            }
            if (elfinder::$textMimes) {
                $result['textMimes'] = elfinder::$textMimes;
            }
        }

        return $result;
    }

    /**
     * Return dir files names list
     *
     * @param  array  command arguments
     *
     * @return array
     * @author Dmitry (dio) Levashov
     **/
    protected function ls($args)
    {
        $target = $args['target'];
        $intersect = isset($args['intersect']) ? $args['intersect'] : array();

        if (($volume = $this->volume($target)) == false
            || ($list = $volume->ls($target, $intersect)) === false) {
            return array('error' => $this->error(self::ERROR_OPEN, '#' . $target));
        }
        return array('list' => $list);
    }

    /**
     * Return subdirs for required directory
     *
     * @param  array  command arguments
     *
     * @return array
     * @author Dmitry (dio) Levashov
     **/
    protected function tree($args)
    {
        $target = $args['target'];

        if (($volume = $this->volume($target)) == false
            || ($tree = $volume->tree($target)) == false) {
            return array('error' => $this->error(self::ERROR_OPEN, '#' . $target));
        }

        return array('tree' => $tree);
    }

    /**
     * Return parents dir for required directory
     *
     * @param  array  command arguments
     *
     * @return array
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function parents($args)
    {
        $target = $args['target'];
        $until = $args['until'];

        if (($volume = $this->volume($target)) == false
            || ($tree = $volume->parents($target, false, $until)) == false) {
            return array('error' => $this->error(self::ERROR_OPEN, '#' . $target));
        }

        return array('tree' => $tree);
    }

    /**
     * Return new created thumbnails list
     *
     * @param  array  command arguments
     *
     * @return array
     * @throws ImagickException
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function tmb($args)
    {

        $result = array('images' => array());
        $targets = $args['targets'];

        foreach ($targets as $target) {
            elFinder::checkAborted();

            if (($volume = $this->volume($target)) != false
                && (($tmb = $volume->tmb($target)) != false)) {
                $result['images'][$target] = $tmb;
            }
        }
        return $result;
    }

    /**
     * Download files/folders as an archive file
     * 1st: Return srrsy contains download archive file info
     * 2nd: Return array contains opened file pointer, root itself and required headers
     *
     * @param  array  command arguments
     *
     * @return array
     * @throws Exception
     * @author Naoki Sawada
     */
    protected function zipdl($args)
    {
        $targets = $args['targets'];
        $download = !empty($args['download']);
        $h404 = 'HTTP/1.x 404 Not Found';
        $CriOS = isset($_SERVER['HTTP_USER_AGENT'])? (strpos($_SERVER['HTTP_USER_AGENT'], 'CriOS') !== false) : false;

        if (!$download) {
            //1st: Return array contains download archive file info
            $error = array(self::ERROR_ARCHIVE);
            if (($volume = $this->volume($targets[0])) !== false) {
                if ($dlres = $volume->zipdl($targets)) {
                    $path = $dlres['path'];
                    register_shutdown_function(array('elFinder', 'rmFileInDisconnected'), $path);
                    if (count($targets) === 1) {
                        $name = basename($volume->path($targets[0]));
                    } else {
                        $name = $dlres['prefix'] . '_Files';
                    }
                    $name .= '.' . $dlres['ext'];
                    $uniqid = uniqid();
					if(ZEND_THREAD_SAFE){
						set_transient("zipdl$uniqid", basename($path),MINUTE_IN_SECONDS);
					} else {
						$this->session->set('zipdl' . $uniqid, basename($path));
					}
                    $result = array(
                        'zipdl' => array(
                            'file' => $CriOS? basename($path) : $uniqid,
                            'name' => $name,
                            'mime' => $dlres['mime']
                        )
                    );
                    return $result;
                }
                $error = array_merge($error, $volume->error());
            }
            return array('error' => $error);
        } else {
            // 2nd: Return array contains opened file session key, root itself and required headers

            // Detect Chrome on iOS
            // It has access twice on downloading
            $CriOSinit = false;
            if ($CriOS) {
                $accept = isset($_SERVER['HTTP_ACCEPT'])? $_SERVER['HTTP_ACCEPT'] : '';
                if ($accept && $accept !== '*' && $accept !== '*/*') {
                    $CriOSinit = true;
                }
            }
            // data check
            if (count($targets) !== 4 ||
                ($volume = $this->volume($targets[0])) == false ||
                !($file = $CriOS ? $targets[1] : ( ZEND_THREAD_SAFE ? get_transient( "zipdl$targets[1]" ) : $this->session->get( 'zipdl' . $targets[1] ) ) )) {
                return array('error' => 'File not found', 'header' => $h404, 'raw' => true);
            }
            $path = $volume->getTempPath() . DIRECTORY_SEPARATOR . basename($file);
            // remove session data of "zipdl..."
	        if(ZEND_THREAD_SAFE){
		        delete_transient("zipdl$targets[1]");
	        } else {
		        $this->session->remove('zipdl' . $targets[1]);
	        }
            if (!$CriOSinit) {
                // register auto delete on shutdown
                $GLOBALS['elFinderTempFiles'][$path] = true;
            }
            if ($volume->commandDisabled('zipdl')) {
                return array('error' => 'File not found', 'header' => $h404, 'raw' => true);
            }
            if (!is_readable($path) || !is_writable($path)) {
                return array('error' => 'File not found', 'header' => $h404, 'raw' => true);
            }
            // for HTTP headers
            $name = $targets[2];
            $mime = $targets[3];

            $filenameEncoded = rawurlencode($name);
            if (strpos($filenameEncoded, '%') === false) { // ASCII only
                $filename = 'filename="' . $name . '"';
            } else {
                $ua = $_SERVER['HTTP_USER_AGENT'];
                if (preg_match('/MSIE [4-8]/', $ua)) { // IE < 9 do not support RFC 6266 (RFC 2231/RFC 5987)
                    $filename = 'filename="' . $filenameEncoded . '"';
                } elseif (strpos($ua, 'Chrome') === false && strpos($ua, 'Safari') !== false && preg_match('#Version/[3-5]#', $ua)) { // Safari < 6
                    $filename = 'filename="' . str_replace('"', '', $name) . '"';
                } else { // RFC 6266 (RFC 2231/RFC 5987)
                    $filename = 'filename*=UTF-8\'\'' . $filenameEncoded;
                }
            }

            $fp = fopen($path, 'rb');
            $file = fstat($fp);
            $result = array(
                'pointer' => $fp,
                'header' => array(
                    'Content-Type: ' . $mime,
                    'Content-Disposition: attachment; ' . $filename,
                    'Content-Transfer-Encoding: binary',
                    'Content-Length: ' . $file['size'],
                    'Accept-Ranges: none',
                    'Connection: close'
                )
            );
            // add cache control headers
            if ($cacheHeaders = $volume->getOption('cacheHeaders')) {
                $result['header'] = array_merge($result['header'], $cacheHeaders);
            }
            return $result;
        }
    }

    /**
     * Required to output file in browser when volume URL is not set
     * Return array contains opened file pointer, root itself and required headers
     *
     * @param  array  command arguments
     *
     * @return array
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function file($args)
    {
        $target = $args['target'];
        $download = !empty($args['download']);
        $onetime = !empty($args['onetime']);
        //$h304     = 'HTTP/1.1 304 Not Modified';
        $h403 = 'HTTP/1.0 403 Access Denied';
        $a403 = array('error' => 'Access Denied', 'header' => $h403, 'raw' => true);
        $h404 = 'HTTP/1.0 404 Not Found';
        $a404 = array('error' => 'File not found', 'header' => $h404, 'raw' => true);

        if ($onetime) {
            $volume = null;
            $tmpdir = elFinder::$commonTempPath;
            if (!$tmpdir || !is_file($tmpf = $tmpdir . DIRECTORY_SEPARATOR . 'ELF' . $target)) {
                return $a404;
            }
            $GLOBALS['elFinderTempFiles'][$tmpf] = true;
            if ($file = json_decode(file_get_contents($tmpf), true)) {
                $src = base64_decode($file['file']);
                if (!is_file($src) || !($fp = fopen($src, 'rb'))) {
                    return $a404;
                }
                if (strpos($src, $tmpdir) === 0) {
                    $GLOBALS['elFinderTempFiles'][$src] = true;
                }
                unset($file['file']);
                $file['read'] = true;
                $file['size'] = filesize($src);
            } else {
                return $a404;
            }
        } else {
            if (($volume = $this->volume($target)) == false) {
                return $a404;
            }

            if ($volume->commandDisabled('file')) {
                return $a403;
            }

            if (($file = $volume->file($target)) == false) {
                return $a404;
            }

            if (!$file['read']) {
                return $a404;
            }

            $opts = array();
            if (!empty($_SERVER['HTTP_RANGE'])) {
                $opts['httpheaders'] = array('Range: ' . $_SERVER['HTTP_RANGE']);
            }
            if (($fp = $volume->open($target, $opts)) == false) {
                return $a404;
            }
        }

        // check aborted by user
        elFinder::checkAborted();

        // allow change MIME type by 'file.pre' callback functions
        $mime = isset($args['mime']) ? $args['mime'] : $file['mime'];
        if ($download || $onetime) {
            $disp = 'attachment';
        } else {
            $dispInlineRegex = $volume->getOption('dispInlineRegex');
            $inlineRegex = false;
            if ($dispInlineRegex) {
                $inlineRegex = '#' . str_replace('#', '\\#', $dispInlineRegex) . '#';
                try {
                    preg_match($inlineRegex, '');
                } catch (Exception $e) {
                    $inlineRegex = false;
                }
            }
            if (!$inlineRegex) {
                $inlineRegex = '#^(?:(?:image|text)|application/x-shockwave-flash$)#';
            }
            $disp = preg_match($inlineRegex, $mime) ? 'inline' : 'attachment';
        }

        $filenameEncoded = rawurlencode($file['name']);
        if (strpos($filenameEncoded, '%') === false) { // ASCII only
            $filename = 'filename="' . $file['name'] . '"';
        } else {
            $ua = isset($_SERVER['HTTP_USER_AGENT'])? $_SERVER['HTTP_USER_AGENT'] : '';
            if (preg_match('/MSIE [4-8]/', $ua)) { // IE < 9 do not support RFC 6266 (RFC 2231/RFC 5987)
                $filename = 'filename="' . $filenameEncoded . '"';
            } elseif (strpos($ua, 'Chrome') === false && strpos($ua, 'Safari') !== false && preg_match('#Version/[3-5]#', $ua)) { // Safari < 6
                $filename = 'filename="' . str_replace('"', '', $file['name']) . '"';
            } else { // RFC 6266 (RFC 2231/RFC 5987)
                $filename = 'filename*=UTF-8\'\'' . $filenameEncoded;
            }
        }

        if ($args['cpath'] && $args['reqid']) {
            setcookie('elfdl' . $args['reqid'], '1', 0, $args['cpath']);
        }

        $result = array(
            'volume' => $volume,
            'pointer' => $fp,
            'info' => $file,
            'header' => array(
                'Content-Type: ' . $mime,
                'Content-Disposition: ' . $disp . '; ' . $filename,
                'Content-Transfer-Encoding: binary',
                'Content-Length: ' . $file['size'],
                'Last-Modified: ' . gmdate('D, d M Y H:i:s T', $file['ts']),
                'Connection: close'
            )
        );

        if (!$onetime) {
            // add cache control headers
            if ($cacheHeaders = $volume->getOption('cacheHeaders')) {
                $result['header'] = array_merge($result['header'], $cacheHeaders);
            }

            // check 'xsendfile'
            $xsendfile = $volume->getOption('xsendfile');
            $path = null;
            if ($xsendfile) {
                $info = stream_get_meta_data($fp);
                if ($path = empty($info['uri']) ? null : $info['uri']) {
                    $basePath = rtrim($volume->getOption('xsendfilePath'), DIRECTORY_SEPARATOR);
                    if ($basePath) {
                        $root = rtrim($volume->getRootPath(), DIRECTORY_SEPARATOR);
                        if (strpos($path, $root) === 0) {
                            $path = $basePath . substr($path, strlen($root));
                        } else {
                            $path = null;
                        }
                    }
                }
            }
            if ($path) {
                $result['header'][] = $xsendfile . ': ' . $path;
                $result['info']['xsendfile'] = $xsendfile;
            }
        }

        // add "Content-Location" if file has url data
        if (isset($file['url']) && $file['url'] && $file['url'] != 1) {
            $result['header'][] = 'Content-Location: ' . $file['url'];
        }
        return $result;
    }

    /**
     * Count total files size
     *
     * @param  array  command arguments
     *
     * @return array
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function size($args)
    {
        $size = 0;
        $files = 0;
        $dirs = 0;
        $itemCount = true;
        $sizes = array();

        foreach ($args['targets'] as $target) {
            elFinder::checkAborted();
            if (($volume = $this->volume($target)) == false
                || ($file = $volume->file($target)) == false
                || !$file['read']) {
                return array('error' => $this->error(self::ERROR_OPEN, '#' . $target));
            }

            $volRes = $volume->size($target);
            if (is_array($volRes)) {
                $sizeInfo = array('size' => 0, 'fileCnt' => 0, 'dirCnt' => 0);
                if (!empty($volRes['size'])) {
                    $sizeInfo['size'] = $volRes['size'];
                    $size += $volRes['size'];
                }
                if (!empty($volRes['files'])) {
                    $sizeInfo['fileCnt'] = $volRes['files'];
                }
                if (!empty($volRes['dirs'])) {
                    $sizeInfo['dirCnt'] = $volRes['dirs'];
                }
                if ($itemCount) {
                    $files += $sizeInfo['fileCnt'];
                    $dirs += $sizeInfo['dirCnt'];
                }
                $sizes[$target] = $sizeInfo;
            } else if (is_numeric($volRes)) {
                $size += $volRes;
                $files = $dirs = 'unknown';
                $itemCount = false;
            }
        }
        return array('size' => $size, 'fileCnt' => $files, 'dirCnt' => $dirs, 'sizes' => $sizes);
    }

    /**
     * Create directory
     *
     * @param  array  command arguments
     *
     * @return array
     * @author Dmitry (dio) Levashov
     **/
    protected function mkdir($args)
    {
        $target = $args['target'];
        $name = $args['name'];
        $dirs = $args['dirs'];
        if ($name === '' && !$dirs) {
            return array('error' => $this->error(self::ERROR_INV_PARAMS, 'mkdir'));
        }

        if (strpos($name,'..') !== false) {
            return array('error' => $this->error('Invalid request', 'mkdir'));
        }

        if (($volume = $this->volume($target)) == false) {
            return array('error' => $this->error(self::ERROR_MKDIR, $name, self::ERROR_TRGDIR_NOT_FOUND, '#' . $target));
        }
        if ($dirs) {
            $maxDirs = $volume->getOption('uploadMaxMkdirs');
            if ($maxDirs && $maxDirs < count($dirs)) {
                return array('error' => $this->error(self::ERROR_MAX_MKDIRS, $maxDirs));
            }
            sort($dirs);
            $reset = null;
            $mkdirs = array();
            foreach ($dirs as $dir) {
                if(strpos($dir,'..') !== false){
                    return array('error' => $this->error('Invalid request', 'mkdir'));
                }
                $tgt =& $mkdirs;
                $_names = explode('/', trim($dir, '/'));
                foreach ($_names as $_key => $_name) {
                    if (!isset($tgt[$_name])) {
                        $tgt[$_name] = array();
                    }
                    $tgt =& $tgt[$_name];
                }
                $tgt =& $reset;
            }
            $res = $this->ensureDirsRecursively($volume, $target, $mkdirs);
            $ret = array(
                'added' => $res['stats'],
                'hashes' => $res['hashes']
            );
            if ($res['error']) {
                $ret['warning'] = $this->error(self::ERROR_MKDIR, $res['error'][0], $volume->error());
            }
            return $ret;
        } else {
            return ($dir = $volume->mkdir($target, $name)) == false
                ? array('error' => $this->error(self::ERROR_MKDIR, $name, $volume->error()))
                : array('added' => array($dir));
        }
    }

    /**
     * Create empty file
     *
     * @param  array  command arguments
     *
     * @return array
     * @author Dmitry (dio) Levashov
     **/
    protected function mkfile($args)
    {
        $target = $args['target'];
        $name = str_replace('..', '', $args['name']);

        if (($volume = $this->volume($target)) == false) {
            return array('error' => $this->error(self::ERROR_MKFILE, $name, self::ERROR_TRGDIR_NOT_FOUND, '#' . $target));
        }

        return ($file = $volume->mkfile($target, $name)) == false
            ? array('error' => $this->error(self::ERROR_MKFILE, $name, $volume->error()))
            : array('added' => array($file));
    }

    /**
     * Rename file, Accept multiple items >= API 2.1031
     *
     * @param  array $args
     *
     * @return array
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     * @author Naoki Sawada
     */
    protected function rename($args)
    {
        $target = $args['target'];
        $name = $args['name'];
        $query = (!empty($args['q']) && strpos($args['q'], '*') !== false) ? $args['q'] : '';
        $targets = !empty($args['targets'])? $args['targets'] : false;
        $rms = array();
        $notfounds = array();
        $locked = array();
        $errs = array();
        $files = array();
        $removed = array();
        $res = array();
        $type = 'normal';

        if (!($volume = $this->volume($target))) {
            return array('error' => $this->error(self::ERROR_RENAME, '#' . $target, self::ERROR_FILE_NOT_FOUND));
        }

        if (strpos($name,'..') !== false) {
            return array('error' => $this->error('Invalid request', 'rename'));
        }

        if ($targets) {
            array_unshift($targets, $target);
            foreach ($targets as $h) {
                if ($rm = $volume->file($h)) {
                    if ($this->itemLocked($h)) {
                        $locked[] = $rm['name'];
                    } else {
                        $rm['realpath'] = $volume->realpath($h);
                        $rms[] = $rm;
                    }
                } else {
                    $notfounds[] = '#' . $h;
                }
            }
            if (!$rms) {
                $res['error'] = array();
                if ($notfounds) {
                    $res['error'] = array(self::ERROR_RENAME, join(', ', $notfounds), self::ERROR_FILE_NOT_FOUND);
                }
                if ($locked) {
                    array_push($res['error'], self::ERROR_LOCKED, join(', ', $locked));
                }
                return $res;
            }

            $res['warning'] = array();
            if ($notfounds) {
                array_push($res['warning'], self::ERROR_RENAME, join(', ', $notfounds), self::ERROR_FILE_NOT_FOUND);
            }
            if ($locked) {
                array_push($res['warning'], self::ERROR_LOCKED, join(', ', $locked));
            }

            if ($query) {
                // batch rename
                $splits = elFinder::splitFileExtention($query);
                if ($splits[1] && $splits[0] === '*') {
                    $type = 'extention';
                    $name = $splits[1];
                } else if (strlen($splits[0]) > 1) {
                    if (substr($splits[0], -1) === '*') {
                        $type = 'prefix';
                        $name = substr($splits[0], 0, strlen($splits[0]) - 1);
                    } else if (substr($splits[0], 0, 1) === '*') {
                        $type = 'suffix';
                        $name = substr($splits[0], 1);
                    }
                }
                if ($type !== 'normal') {
                    if (!empty($this->listeners['rename.pre'])) {
                        $_args = array('name' => $name);
                        foreach ($this->listeners['rename.pre'] as $handler) {
                            $_res = call_user_func_array($handler, array('rename', &$_args, $this, $volume));
                            if (!empty($_res['preventexec'])) {
                                break;
                            }
                        }
                        $name = $_args['name'];
                    }
                }
            }
            foreach ($rms as $rm) {
                if ($type === 'normal') {
                    $rname = $volume->uniqueName($volume->realpath($rm['phash']), $name, '', false);
                } else {
                    $rname = $name;
                    if ($type === 'extention') {
                        $splits = elFinder::splitFileExtention($rm['name']);
                        $rname = $splits[0] . '.' . $name;
                    } else if ($type === 'prefix') {
                        $rname = $name . $rm['name'];
                    } else if ($type === 'suffix') {
                        $splits = elFinder::splitFileExtention($rm['name']);
                        $rname = $splits[0] . $name . ($splits[1] ? ('.' . $splits[1]) : '');
                    }
                    $rname = $volume->uniqueName($volume->realpath($rm['phash']), $rname, '', true);
                }
                if ($file = $volume->rename($rm['hash'], $rname)) {
                    $files[] = $file;
                    $removed[] = $rm;
                } else {
                    $errs[] = $rm['name'];
                }
            }

            if (!$files) {
                $res['error'] = $this->error(self::ERROR_RENAME, join(', ', $errs), $volume->error());
                if (!$res['warning']) {
                    unset($res['warning']);
                }
                return $res;
            }
            if ($errs) {
                array_push($res['warning'], self::ERROR_RENAME, join(', ', $errs), $volume->error());
            }
            if (!$res['warning']) {
                unset($res['warning']);
            }
            $res['added'] = $files;
            $res['removed'] = $removed;
            return $res;
        } else {
            if (!($rm = $volume->file($target))) {
                return array('error' => $this->error(self::ERROR_RENAME, '#' . $target, self::ERROR_FILE_NOT_FOUND));
            }
            if ($this->itemLocked($target)) {
                return array('error' => $this->error(self::ERROR_LOCKED, $rm['name']));
            }
            $rm['realpath'] = $volume->realpath($target);

            $file = $volume->rename($target, $name);
            if ($file === false) {
                return array('error' => $this->error(self::ERROR_RENAME, $rm['name'], $volume->error()));
            } else {
                if ($file['hash'] !== $rm['hash']) {
                    return array('added' => array($file), 'removed' => array($rm));
                } else {
                    return array('changed' => array($file));
                }
            }
        }
    }

    /**
     * Duplicate file - create copy with "copy %d" suffix
     *
     * @param array $args command arguments
     *
     * @return array
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function duplicate($args)
    {
        $targets = is_array($args['targets']) ? $args['targets'] : array();
        $result = array();
        $suffix = empty($args['suffix']) ? 'copy' : $args['suffix'];

        $this->itemLock($targets);

        foreach ($targets as $target) {
            elFinder::checkAborted();

            if (($volume = $this->volume($target)) == false
                || ($src = $volume->file($target)) == false) {
                $result['warning'] = $this->error(self::ERROR_COPY, '#' . $target, self::ERROR_FILE_NOT_FOUND);
                break;
            }

            if (($file = $volume->duplicate($target, $suffix)) == false) {
                $result['warning'] = $this->error($volume->error());
                break;
            }
        }

        return $result;
    }

    /**
     * Remove dirs/files
     *
     * @param array  command arguments
     *
     * @return array
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function rm($args)
    {
        $targets = is_array($args['targets']) ? $args['targets'] : array();
        $result = array('removed' => array());

        foreach ($targets as $target) {
            elFinder::checkAborted();

            if (($volume = $this->volume($target)) == false) {
                $result['warning'] = $this->error(self::ERROR_RM, '#' . $target, self::ERROR_FILE_NOT_FOUND);
                break;
            }

            if ($this->itemLocked($target)) {
                $rm = $volume->file($target);
                $result['warning'] = $this->error(self::ERROR_LOCKED, $rm['name']);
                break;
            }

            if (!$volume->rm($target)) {
                $result['warning'] = $this->error($volume->error());
                break;
            }
        }

        return $result;
    }

    /**
     * Return has subdirs
     *
     * @param  array  command arguments
     *
     * @return array
     * @author Dmitry Naoki Sawada
     **/
    protected function subdirs($args)
    {

        $result = array('subdirs' => array());
        $targets = $args['targets'];

        foreach ($targets as $target) {
            if (($volume = $this->volume($target)) !== false) {
                $result['subdirs'][$target] = $volume->subdirs($target) ? 1 : 0;
            }
        }
        return $result;
    }

    /**
     * Gateway for custom contents editor
     *
     * @param  array $args command arguments
     *
     * @return array
     * @author Naoki Sawada
     */
    protected function editor($args = array())
    {
        /* @var elFinderEditor $editor */
        $name = $args['name'];
        if (is_array($name)) {
            $res = array();
            foreach ($name as $c) {
                $class = 'elFinderEditor' . $c;
                if (class_exists($class)) {
                    $editor = new $class($this, $args['args']);
                    $res[$c] = $editor->enabled();
                } else {
                    $res[$c] = 0;
                }
            }
            return $res;
        } else {
            $class = 'elFinderEditor' . $name;
            $method = '';
            if (class_exists($class)) {
                $editor = new $class($this, $args['args']);
                $method = $args['method'];
                if ($editor->isAllowedMethod($method) && method_exists($editor, $method)) {
                    return $editor->$method();
                }
            }
            return array('error', $this->error(self::ERROR_UNKNOWN_CMD, 'editor.' . $name . '.' . $method));
        }
    }

    /**
     * Abort current request and make flag file to running check
     *
     * @param array $args
     *
     * @return void
     */
    protected function abort($args = array())
    {
        if (!elFinder::$connectionFlagsPath || $_SERVER['REQUEST_METHOD'] === 'HEAD') {
            return;
        }
        $flagFile = elFinder::$connectionFlagsPath . DIRECTORY_SEPARATOR . 'elfreq%s';
        if (!empty($args['makeFile'])) {
            self::$abortCheckFile = sprintf($flagFile, self::filenameDecontaminate($args['makeFile']));
            touch(self::$abortCheckFile);
            $GLOBALS['elFinderTempFiles'][self::$abortCheckFile] = true;
            return;
        }

        $file = !empty($args['id']) ? sprintf($flagFile, self::filenameDecontaminate($args['id'])) : self::$abortCheckFile;
        $file && is_file($file) && unlink($file);
    }

    /**
     * Validate an URL to prevent SSRF attacks.
     *
     * To prevent any risk of DNS rebinding, always use the IP address resolved by
     * this method, as returned in the array entry `ip`.
     *
     * @param string $url
     *
     * @return false|array
     */
    protected function validate_address($url)
    {
        $info = parse_url($url);
        $host = trim(strtolower($info['host']), '.');
        // do not support IPv6 address
        if (preg_match('/^\[.*\]$/', $host)) {
            return false;
        }
        // do not support non dot host
        if (strpos($host, '.') === false) {
            return false;
        }
        // do not support URL-encoded host
        if (strpos($host, '%') !== false) {
            return false;
        }
        // disallow including "localhost" and "localdomain"
        if (preg_match('/\b(?:localhost|localdomain)\b/', $host)) {
            return false;
        }
        // check IPv4 local loopback, private network and link local
        $ip = gethostbyname($host);
        if (preg_match('/^0x[0-9a-f]+|[0-9]+(?:\.(?:0x[0-9a-f]+|[0-9]+)){1,3}$/', $ip, $m)) {
            $long = (int)sprintf('%u', ip2long($ip));
            if (!$long) {
                return false;
            }
            $local = (int)sprintf('%u', ip2long('127.255.255.255')) >> 24;
            $prv1  = (int)sprintf('%u', ip2long('10.255.255.255')) >> 24;
            $prv2  = (int)sprintf('%u', ip2long('172.31.255.255')) >> 20;
            $prv3  = (int)sprintf('%u', ip2long('192.168.255.255')) >> 16;
            $link  = (int)sprintf('%u', ip2long('169.254.255.255')) >> 16;

            if (!isset($this->uploadAllowedLanIpClasses['local']) && $long >> 24 === $local) {
                return false;
            }
            if (!isset($this->uploadAllowedLanIpClasses['private_a']) && $long >> 24 === $prv1) {
                return false;
            }
            if (!isset($this->uploadAllowedLanIpClasses['private_b']) && $long >> 20 === $prv2) {
                return false;
            }
            if (!isset($this->uploadAllowedLanIpClasses['private_c']) && $long >> 16 === $prv3) {
                return false;
            }
            if (!isset($this->uploadAllowedLanIpClasses['link']) && $long >> 16 === $link) {
                return false;
            }
            $info['ip'] = long2ip($long);
            if (!isset($info['port'])) {
                $info['port'] = $info['scheme'] === 'https' ? 443 : 80;
            }
            if (!isset($info['path'])) {
                $info['path'] = '/';
            }
            return $info;
        } else {
            return false;
        }
    }

    /**
     * Get remote contents
     *
     * @param  string   $url          target url
     * @param  int      $timeout      timeout (sec)
     * @param  int      $redirect_max redirect max count
     * @param  string   $ua
     * @param  resource $fp
     *
     * @return string, resource or bool(false)
     * @retval  string contents
     * @retval  resource conttents
     * @rettval false  error
     * @author  Naoki Sawada
     **/
    protected function get_remote_contents(&$url, $timeout = 30, $redirect_max = 5, $ua = 'Mozilla/5.0', $fp = null)
    {
        if (preg_match('~^(?:ht|f)tps?://[-_.!\~*\'()a-z0-9;/?:\@&=+\$,%#\*\[\]]+~i', $url)) {
            $info = $this->validate_address($url);
            if ($info === false) {
                return false;
            }
            // dose not support 'user' and 'pass' for security reasons
            $url = $info['scheme'].'://'.$info['host'].(!empty($info['port'])? (':'.$info['port']) : '').$info['path'].(!empty($info['query'])? ('?'.$info['query']) : '').(!empty($info['fragment'])? ('#'.$info['fragment']) : '');
            // check by URL upload filter
            if ($this->urlUploadFilter && is_callable($this->urlUploadFilter)) {
                if (!call_user_func_array($this->urlUploadFilter, array($url, $this))) {
                    return false;
                }
            }
            $method = (function_exists('curl_exec')) ? 'curl_get_contents' : 'fsock_get_contents';
            return $this->$method($url, $timeout, $redirect_max, $ua, $fp, $info);
        }
        return false;
    }

    /**
     * Get remote contents with cURL
     *
     * @param  string   $url          target url
     * @param  int      $timeout      timeout (sec)
     * @param  int      $redirect_max redirect max count
     * @param  string   $ua
     * @param  resource $outfp
     *
     * @return string, resource or bool(false)
     * @retval string contents
     * @retval resource conttents
     * @retval false  error
     * @author Naoki Sawada
     **/
    protected function curl_get_contents(&$url, $timeout, $redirect_max, $ua, $outfp, $info)
    {
        if ($redirect_max == 0) {
            return false;
        }
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HEADER, false);
        if ($outfp) {
            curl_setopt($ch, CURLOPT_FILE, $outfp);
        } else {
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
        }
        curl_setopt($ch, CURLOPT_LOW_SPEED_LIMIT, 1);
        curl_setopt($ch, CURLOPT_LOW_SPEED_TIME, $timeout);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
        curl_setopt($ch, CURLOPT_USERAGENT, $ua);
        curl_setopt($ch, CURLOPT_RESOLVE, array($info['host'] . ':' . $info['port'] . ':' . $info['ip']));
        $result = curl_exec($ch);
        $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        if ($http_code == 301 || $http_code == 302) {
            $new_url = curl_getinfo($ch, CURLINFO_REDIRECT_URL);
            $info = $this->validate_address($new_url);
            if ($info === false) {
                return false;
            }
            return $this->curl_get_contents($new_url, $timeout, $redirect_max - 1, $ua, $outfp, $info);
        }
        curl_close($ch);
        return $outfp ? $outfp : $result;
    }

    /**
     * Get remote contents with fsockopen()
     *
     * @param  string   $url          url
     * @param  int      $timeout      timeout (sec)
     * @param  int      $redirect_max redirect max count
     * @param  string   $ua
     * @param  resource $outfp
     *
     * @return string, resource or bool(false)
     * @retval string contents
     * @retval resource conttents
     * @retval false  error
     * @throws elFinderAbortException
     * @author Naoki Sawada
     */
    protected function fsock_get_contents(&$url, $timeout, $redirect_max, $ua, $outfp, $info)
    {
        $connect_timeout = 3;
        $connect_try = 3;
        $method = 'GET';
        $readsize = 4096;
        $ssl = '';

        $getSize = null;
        $headers = '';

        $arr = $info;
        if ($arr['scheme'] === 'https') {
            $ssl = 'ssl://';
        }

        // query
        $arr['query'] = isset($arr['query']) ? '?' . $arr['query'] : '';

        $url_base = $arr['scheme'] . '://' . $info['host'] . ':' . $info['port'];
        $url_path = isset($arr['path']) ? $arr['path'] : '/';
        $uri = $url_path . $arr['query'];

        $query = $method . ' ' . $uri . " HTTP/1.0\r\n";
        $query .= "Host: " . $arr['host'] . "\r\n";
        $query .= "Accept: */*\r\n";
        $query .= "Connection: close\r\n";
        if (!empty($ua)) $query .= "User-Agent: " . $ua . "\r\n";
        if (!is_null($getSize)) $query .= 'Range: bytes=0-' . ($getSize - 1) . "\r\n";

        $query .= $headers;

        $query .= "\r\n";

        $fp = $connect_try_count = 0;
        while (!$fp && $connect_try_count < $connect_try) {

            $errno = 0;
            $errstr = "";
            $fp = fsockopen(
                $ssl . $arr['host'],
                $arr['port'],
                $errno, $errstr, $connect_timeout);
            if ($fp) break;
            $connect_try_count++;
            if (connection_aborted()) {
                throw new elFinderAbortException();
            }
            sleep(1); // wait 1sec
        }

        if (!$fp) {
            return false;
        }

        $fwrite = 0;
        for ($written = 0; $written < strlen($query); $written += $fwrite) {
            $fwrite = fwrite($fp, substr($query, $written));
            if (!$fwrite) {
                break;
            }
        }

        if ($timeout) {
            socket_set_timeout($fp, $timeout);
        }

        $_response = '';
        $header = '';
        while ($_response !== "\r\n") {
            $_response = fgets($fp, $readsize);
            $header .= $_response;
        };

        $rccd = array_pad(explode(' ', $header, 2), 2, ''); // array('HTTP/1.1','200')
        $rc = (int)$rccd[1];

        $ret = false;
        // Redirect
        switch ($rc) {
            case 307: // Temporary Redirect
            case 303: // See Other
            case 302: // Moved Temporarily
            case 301: // Moved Permanently
                $matches = array();
                if (preg_match('/^Location: (.+?)(#.+)?$/im', $header, $matches) && --$redirect_max > 0) {
                    $_url = $url;
                    $url = trim($matches[1]);
                    if (!preg_match('/^https?:\//', $url)) { // no scheme
                        if ($url[0] != '/') { // Relative path
                            // to Absolute path
                            $url = substr($url_path, 0, strrpos($url_path, '/')) . '/' . $url;
                        }
                        // add sheme,host
                        $url = $url_base . $url;
                    }
                    if ($_url === $url) {
                        sleep(1);
                    }
                    fclose($fp);
                    $info = $this->validate_address($url);
                    if ($info === false) {
                        return false;
                    }
                    return $this->fsock_get_contents($url, $timeout, $redirect_max, $ua, $outfp, $info);
                }
                break;
            case 200:
                $ret = true;
        }
        if (!$ret) {
            fclose($fp);
            return false;
        }

        $body = '';
        if (!$outfp) {
            $outfp = fopen('php://temp', 'rwb');
            $body = true;
        }
        while (fwrite($outfp, fread($fp, $readsize))) {
            if ($timeout) {
                $_status = socket_get_status($fp);
                if ($_status['timed_out']) {
                    fclose($outfp);
                    fclose($fp);
                    return false; // Request Time-out
                }
            }
        }
        if ($body) {
            rewind($outfp);
            $body = stream_get_contents($outfp);
            fclose($outfp);
            $outfp = null;
        }

        fclose($fp);

        return $outfp ? $outfp : $body; // Data
    }

    /**
     * Parse Data URI scheme
     *
     * @param  string $str
     * @param  array  $extTable
     * @param  array  $args
     *
     * @return array
     * @author Naoki Sawada
     */
    protected function parse_data_scheme($str, $extTable, $args = null)
    {
        $data = $name = $mime = '';
        // Scheme 'data://' require `allow_url_fopen` and `allow_url_include`
        if ($fp = fopen('data://' . substr($str, 5), 'rb')) {
            if ($data = stream_get_contents($fp)) {
                $meta = stream_get_meta_data($fp);
                $mime = $meta['mediatype'];
            }
            fclose($fp);
        } else if (preg_match('~^data:(.+?/.+?)?(?:;charset=.+?)?;base64,~', substr($str, 0, 128), $m)) {
            $data = base64_decode(substr($str, strlen($m[0])));
            if ($m[1]) {
                $mime = $m[1];
            }
        }
        if ($data) {
            $ext = ($mime && isset($extTable[$mime])) ? '.' . $extTable[$mime] : '';
            // Set name if name eq 'image.png' and $args has 'name' array, e.g. clipboard data
            if (is_array($args['name']) && isset($args['name'][0])) {
                $name = $args['name'][0];
                if ($ext) {
                    $name = preg_replace('/\.[^.]*$/', '', $name);
                }
            } else {
                $name = substr(md5($data), 0, 8);
            }
            $name .= $ext;
        } else {
            $data = $name = '';
        }
        return array($data, $name);
    }

    /**
     * Detect file MIME Type by local path
     *
     * @param  string $path Local path
     *
     * @return string file MIME Type
     * @author Naoki Sawada
     */
    protected function detectMimeType($path)
    {
        static $type, $finfo;
        if (!$type) {
            if (class_exists('finfo', false)) {
                $tmpFileInfo = explode(';', finfo_file(finfo_open(FILEINFO_MIME), __FILE__));
            } else {
                $tmpFileInfo = false;
            }
            $regexp = '/text\/x\-(php|c\+\+)/';
            if ($tmpFileInfo && preg_match($regexp, array_shift($tmpFileInfo))) {
                $type = 'finfo';
                $finfo = finfo_open(FILEINFO_MIME);
            } elseif (function_exists('mime_content_type')
                && ($_ctypes = explode(';', mime_content_type(__FILE__)))
                && preg_match($regexp, array_shift($_ctypes))) {
                $type = 'mime_content_type';
            } elseif (function_exists('getimagesize')) {
                $type = 'getimagesize';
            } else {
                $type = 'none';
            }
        }

        $mime = '';
        if ($type === 'finfo') {
            $mime = finfo_file($finfo, $path);
        } elseif ($type === 'mime_content_type') {
            $mime = mime_content_type($path);
        } elseif ($type === 'getimagesize') {
            if ($img = getimagesize($path)) {
                $mime = $img['mime'];
            }
        }

        if ($mime) {
            $mime = explode(';', $mime);
            $mime = trim($mime[0]);

            if (in_array($mime, array('application/x-empty', 'inode/x-empty'))) {
                // finfo return this mime for empty files
                $mime = 'text/plain';
            } elseif ($mime == 'application/x-zip') {
                // http://elrte.org/redmine/issues/163
                $mime = 'application/zip';
            }
        }

        return $mime ? $mime : 'unknown';
    }

    /**
     * Detect file type extension by local path
     *
     * @param  object $volume elFinderVolumeDriver instance
     * @param  string $path   Local path
     * @param  string $name   Filename to save
     *
     * @return string file type extension with dot
     * @author Naoki Sawada
     */
    protected function detectFileExtension($volume, $path, $name)
    {
        $mime = $this->detectMimeType($path);
        if ($mime === 'unknown') {
            $mime = 'application/octet-stream';
        }
        $ext = $volume->getExtentionByMime($volume->mimeTypeNormalize($mime, $name));
        return $ext ? ('.' . $ext) : '';
    }

    /**
     * Get temporary directory path
     *
     * @param  string $volumeTempPath
     *
     * @return string
     * @author Naoki Sawada
     */
    private function getTempDir($volumeTempPath = null)
    {
        $testDirs = array();
        if ($this->uploadTempPath) {
            $testDirs[] = rtrim(realpath($this->uploadTempPath), DIRECTORY_SEPARATOR);
        }
        if ($volumeTempPath) {
            $testDirs[] = rtrim(realpath($volumeTempPath), DIRECTORY_SEPARATOR);
        }
        if (elFinder::$commonTempPath) {
            $testDirs[] = elFinder::$commonTempPath;
        }
        $tempDir = '';
        foreach ($testDirs as $testDir) {
            if (!$testDir || !is_dir($testDir)) continue;
            if (is_writable($testDir)) {
                $tempDir = $testDir;
                $gc = time() - 3600;
                foreach (glob($tempDir . DIRECTORY_SEPARATOR . 'ELF*') as $cf) {
                    if (filemtime($cf) < $gc) {
                        unlink($cf);
                    }
                }
                break;
            }
        }
        return $tempDir;
    }

    /**
     * chmod
     *
     * @param array  command arguments
     *
     * @return array
     * @throws elFinderAbortException
     * @author David Bartle
     */
    protected function chmod($args)
    {
        $targets = $args['targets'];
        $mode = intval((string)$args['mode'], 8);

        if (!is_array($targets)) {
            $targets = array($targets);
        }

        $result = array();

        if (($volume = $this->volume($targets[0])) == false) {
            $result['error'] = $this->error(self::ERROR_CONF_NO_VOL);
            return $result;
        }

        $this->itemLock($targets);

        $files = array();
        $errors = array();
        foreach ($targets as $target) {
            elFinder::checkAborted();

            $file = $volume->chmod($target, $mode);
            if ($file) {
                $files = array_merge($files, is_array($file) ? $file : array($file));
            } else {
                $errors = array_merge($errors, $volume->error());
            }
        }

        if ($files) {
            $result['changed'] = $files;
            if ($errors) {
                $result['warning'] = $this->error($errors);
            }
        } else {
            $result['error'] = $this->error($errors);
        }

        return $result;
    }

    /**
     * Check chunked upload files
     *
     * @param string $tmpname uploaded temporary file path
     * @param string $chunk   uploaded chunk file name
     * @param string $cid     uploaded chunked file id
     * @param string $tempDir temporary dirctroy path
     * @param null   $volume
     *
     * @return array|null
     * @throws elFinderAbortException
     * @author Naoki Sawada
     */
    private function checkChunkedFile($tmpname, $chunk, $cid, $tempDir, $volume = null)
    {
        /* @var elFinderVolumeDriver $volume */
        if (preg_match('/^(.+)(\.\d+_(\d+))\.part$/s', $chunk, $m)) {
            $fname = $m[1];
            $encname = md5($cid . '_' . $fname);
            $base = $tempDir . DIRECTORY_SEPARATOR . 'ELF' . $encname;
            $clast = intval($m[3]);
            if (is_null($tmpname)) {
                ignore_user_abort(true);
                // chunked file upload fail
                foreach (glob($base . '*') as $cf) {
                    unlink($cf);
                }
                ignore_user_abort(false);
                return null;
            }

            $range = isset($_POST['range']) ? trim($_POST['range']) : '';
            if ($range && preg_match('/^(\d+),(\d+),(\d+)$/', $range, $ranges)) {
                $start = $ranges[1];
                $len = $ranges[2];
                $size = $ranges[3];
                $tmp = $base . '.part';
                $csize = filesize($tmpname);

                $tmpExists = is_file($tmp);
                if (!$tmpExists) {
                    // check upload max size
                    $uploadMaxSize = $volume ? $volume->getUploadMaxSize() : 0;
                    if ($uploadMaxSize > 0 && $size > $uploadMaxSize) {
                        return array(self::ERROR_UPLOAD_FILE_SIZE, false);
                    }
                    // make temp file
                    $ok = false;
                    if ($fp = fopen($tmp, 'wb')) {
                        flock($fp, LOCK_EX);
                        $ok = ftruncate($fp, $size);
                        flock($fp, LOCK_UN);
                        fclose($fp);
                        touch($base);
                    }
                    if (!$ok) {
                        unlink($tmp);
                        return array(self::ERROR_UPLOAD_TEMP, false);
                    }
                } else {
                    // wait until makeing temp file (for anothor session)
                    $cnt = 1200; // Time limit 120 sec
                    while (!is_file($base) && --$cnt) {
                        usleep(100000); // wait 100ms
                    }
                    if (!$cnt) {
                        return array(self::ERROR_UPLOAD_TEMP, false);
                    }
                }

                // check size info
                if ($len != $csize || $start + $len > $size || ($tmpExists && $size != filesize($tmp))) {
                    return array(self::ERROR_UPLOAD_TEMP, false);
                }

                // write chunk data
                $src = fopen($tmpname, 'rb');
                $fp = fopen($tmp, 'cb');
                fseek($fp, $start);
                $writelen = stream_copy_to_stream($src, $fp, $len);
                fclose($fp);
                fclose($src);

                try {
                    // to check connection is aborted
                    elFinder::checkAborted();
                } catch (elFinderAbortException $e) {
                    unlink($tmpname);
                    is_file($tmp) && unlink($tmp);
                    is_file($base) && unlink($base);
                    throw $e;
                }

                if ($writelen != $len) {
                    return array(self::ERROR_UPLOAD_TEMP, false);
                }

                // write counts
                file_put_contents($base, "\0", FILE_APPEND | LOCK_EX);

                if (filesize($base) >= $clast + 1) {
                    // Completion
                    unlink($base);
                    return array($tmp, $fname);
                }
            } else {
                // old way
                $part = $base . $m[2];
                if (move_uploaded_file($tmpname, $part)) {
                    chmod($part, 0600);
                    if ($clast < count(glob($base . '*'))) {
                        $parts = array();
                        for ($i = 0; $i <= $clast; $i++) {
                            $name = $base . '.' . $i . '_' . $clast;
                            if (is_readable($name)) {
                                $parts[] = $name;
                            } else {
                                $parts = null;
                                break;
                            }
                        }
                        if ($parts) {
                            if (!is_file($base)) {
                                touch($base);
                                if ($resfile = tempnam($tempDir, 'ELF')) {
                                    $target = fopen($resfile, 'wb');
                                    foreach ($parts as $f) {
                                        $fp = fopen($f, 'rb');
                                        while (!feof($fp)) {
                                            fwrite($target, fread($fp, 8192));
                                        }
                                        fclose($fp);
                                        unlink($f);
                                    }
                                    fclose($target);
                                    unlink($base);
                                    return array($resfile, $fname);
                                }
                                unlink($base);
                            }
                        }
                    }
                }
            }
        }
        return array('', '');
    }

    /**
     * Save uploaded files
     *
     * @param  array
     *
     * @return array
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function upload($args)
    {
        $ngReg = '/[\/\\?*:|"<>]/';
        $target = $args['target'];
        $volume = $this->volume($target);
        $files = isset($args['FILES']['upload']) && is_array($args['FILES']['upload']) ? $args['FILES']['upload'] : array();
        $header = empty($args['html']) ? array() : array('header' => 'Content-Type: text/html; charset=utf-8');
        $result = array_merge(array('added' => array()), $header);
        $paths = $args['upload_path'] ? $args['upload_path'] : array();
        $chunk = $args['chunk'] ? $args['chunk'] : '';
        $cid = $args['cid'] ? (int)$args['cid'] : '';
        $mtimes = $args['mtime'] ? $args['mtime'] : array();
        $tmpfname = '';

        if (!$volume) {
            return array_merge(array('error' => $this->error(self::ERROR_UPLOAD, self::ERROR_TRGDIR_NOT_FOUND, '#' . $target)), $header);
        }

        // check $chunk
        if (strpos($chunk, '/') !== false || strpos($chunk, '\\') !== false) {
            return array('error' => $this->error(self::ERROR_UPLOAD));
        }

        if ($args['overwrite'] !== '') {
            $volume->setUploadOverwrite($args['overwrite']);
        }

        $renames = $hashes = array();
        $suffix = '~';
        if ($args['renames'] && is_array($args['renames'])) {
            $renames = array_flip($args['renames']);
            if (is_string($args['suffix']) && !preg_match($ngReg, $args['suffix'])) {
                $suffix = $args['suffix'];
            }
        }
        if ($args['hashes'] && is_array($args['hashes'])) {
            $hashes = array_flip($args['hashes']);
        }

        $this->itemLock($target);

        // file extentions table by MIME
        $extTable = array_flip(array_unique($volume->getMimeTable()));

        if (empty($files)) {
            if (isset($args['upload']) && is_array($args['upload']) && ($tempDir = $this->getTempDir($volume->getTempPath()))) {
                $names = array();
                foreach ($args['upload'] as $i => $url) {
                    // check chunked file upload commit
                    if ($chunk) {
                        if ($url === 'chunkfail' && $args['mimes'] === 'chunkfail') {
                            $this->checkChunkedFile(null, $chunk, $cid, $tempDir);
                            if (preg_match('/^(.+)(\.\d+_(\d+))\.part$/s', $chunk, $m)) {
                                $result['warning'] = $this->error(self::ERROR_UPLOAD_FILE, $m[1], self::ERROR_UPLOAD_TEMP);
                            }
                            return $result;
                        } else {
                            $tmpfname = $tempDir . '/' . $chunk;
                            $files['tmp_name'][$i] = $tmpfname;
                            $files['name'][$i] = $url;
                            $files['error'][$i] = 0;
                            $GLOBALS['elFinderTempFiles'][$tmpfname] = true;
                            break;
                        }
                    }

                    $tmpfname = $tempDir . DIRECTORY_SEPARATOR . 'ELF_FATCH_' . md5($url . microtime(true));
                    $GLOBALS['elFinderTempFiles'][$tmpfname] = true;

                    $_name = '';
                    // check is data:
                    if (substr($url, 0, 5) === 'data:') {
                        list($data, $args['name'][$i]) = $this->parse_data_scheme($url, $extTable, $args);
                    } else {
                        $fp = fopen($tmpfname, 'wb');
                        if ($data = $this->get_remote_contents($url, 30, 5, 'Mozilla/5.0', $fp)) {
                            // to check connection is aborted
                            try {
                                elFinder::checkAborted();
                            } catch(elFinderAbortException $e) {
                                fclose($fp);
                                throw $e;
                            }
                            $_name = preg_replace('~^.*?([^/#?]+)(?:\?.*)?(?:#.*)?$~', '$1', rawurldecode($url));
                            // Check `Content-Disposition` response header
                            if (($headers = get_headers($url, true)) && !empty($headers['Content-Disposition'])) {
                                if (preg_match('/filename\*=(?:([a-zA-Z0-9_-]+?)\'\')"?([a-z0-9_.~%-]+)"?/i', $headers['Content-Disposition'], $m)) {
                                    $_name = rawurldecode($m[2]);
                                    if ($m[1] && strtoupper($m[1]) !== 'UTF-8' && function_exists('mb_convert_encoding')) {
                                        $_name = mb_convert_encoding($_name, 'UTF-8', $m[1]);
                                    }
                                } else if (preg_match('/filename="?([ a-z0-9_.~%-]+)"?/i', $headers['Content-Disposition'], $m)) {
                                    $_name = rawurldecode($m[1]);
                                }
                            }
                        } else {
                            fclose($fp);
                        }
                    }
                    if ($data) {
                        if (isset($args['name'][$i])) {
                            $_name = $args['name'][$i];
                        }
                        if ($_name) {
                            $_ext = '';
                            if (preg_match('/(\.[a-z0-9]{1,7})$/', $_name, $_match)) {
                                $_ext = $_match[1];
                            }
                            if ((is_resource($data) && fclose($data)) || file_put_contents($tmpfname, $data)) {
                                $GLOBALS['elFinderTempFiles'][$tmpfname] = true;
                                $_name = preg_replace($ngReg, '_', $_name);
                                list($_a, $_b) = array_pad(explode('.', $_name, 2), 2, '');
                                if ($_b === '') {
                                    if ($_ext) {
                                        rename($tmpfname, $tmpfname . $_ext);
                                        $tmpfname = $tmpfname . $_ext;
                                    }
                                    $_b = $this->detectFileExtension($volume, $tmpfname, $_name);
                                    $_name = $_a . $_b;
                                } else {
                                    $_b = '.' . $_b;
                                }
                                if (isset($names[$_name])) {
                                    $_name = $_a . '_' . $names[$_name]++ . $_b;
                                } else {
                                    $names[$_name] = 1;
                                }
                                $files['tmp_name'][$i] = $tmpfname;
                                $files['name'][$i] = $_name;
                                $files['error'][$i] = 0;
                                // set to auto rename
                                $volume->setUploadOverwrite(false);
                            } else {
                                unlink($tmpfname);
                            }
                        }
                    }
                }
            }
            if (empty($files)) {
                return array_merge(array('error' => $this->error(self::ERROR_UPLOAD, self::ERROR_UPLOAD_NO_FILES)), $header);
            }
        }

        $addedDirs = array();
        $errors = array();
        foreach ($files['name'] as $i => $name) {
            if (($error = $files['error'][$i]) > 0) {
                $result['warning'] = $this->error(self::ERROR_UPLOAD_FILE, $name, $error == UPLOAD_ERR_INI_SIZE || $error == UPLOAD_ERR_FORM_SIZE ? self::ERROR_UPLOAD_FILE_SIZE : self::ERROR_UPLOAD_TRANSFER, $error);
                $this->uploadDebug = 'Upload error code: ' . $error;
                break;
            }

            $tmpname = $files['tmp_name'][$i];
            $thash = ($paths && isset($paths[$i])) ? $paths[$i] : $target;
            $mtime = isset($mtimes[$i]) ? $mtimes[$i] : 0;
            if ($name === 'blob') {
                if ($chunk) {
                    if ($tempDir = $this->getTempDir($volume->getTempPath())) {
                        list($tmpname, $name) = $this->checkChunkedFile($tmpname, $chunk, $cid, $tempDir, $volume);
                        if ($tmpname) {
                            if ($name === false) {
                                preg_match('/^(.+)(\.\d+_(\d+))\.part$/s', $chunk, $m);
                                $result['error'] = $this->error(self::ERROR_UPLOAD_FILE, $m[1], $tmpname);
                                $result['_chunkfailure'] = true;
                                $this->uploadDebug = 'Upload error: ' . $tmpname;
                            } else if ($name) {
                                $result['_chunkmerged'] = basename($tmpname);
                                $result['_name'] = $name;
                                $result['_mtime'] = $mtime;
                            }
                        }
                    } else {
                        $result['error'] = $this->error(self::ERROR_UPLOAD_FILE, $chunk, self::ERROR_UPLOAD_TEMP);
                        $this->uploadDebug = 'Upload error: unable open tmp file';
                    }
                    return $result;
                } else {
                    // for form clipboard with Google Chrome or Opera
                    $name = 'image.png';
                }
            }

            // Set name if name eq 'image.png' and $args has 'name' array, e.g. clipboard data
            if (strtolower(substr($name, 0, 5)) === 'image' && is_array($args['name']) && isset($args['name'][$i])) {
                $type = $files['type'][$i];
                $name = $args['name'][$i];
                $ext = isset($extTable[$type]) ? '.' . $extTable[$type] : '';
                if ($ext) {
                    $name = preg_replace('/\.[^.]*$/', '', $name);
                }
                $name .= $ext;
            }

            // do hook function 'upload.presave'
            try {
                $this->trigger('upload.presave', array(&$thash, &$name, $tmpname, $this, $volume), $errors);
            } catch (elFinderTriggerException $e) {
                if (!is_uploaded_file($tmpname) && unlink($tmpname) && $tmpfname) {
                    unset($GLOBALS['elFinderTempFiles'][$tmpfname]);
                }
                continue;
            }

            clearstatcache();
            if ($mtime && is_file($tmpname)) {
                // for keep timestamp option in the LocalFileSystem volume
                touch($tmpname, $mtime);
            }

            $fp = null;
            if (!is_file($tmpname) || ($fp = fopen($tmpname, 'rb')) === false) {
                $errors = array_merge($errors, array(self::ERROR_UPLOAD_FILE, $name, ($fp === false? self::ERROR_UPLOAD_TEMP : self::ERROR_UPLOAD_TRANSFER)));
                $this->uploadDebug = 'Upload error: unable open tmp file';
                if (!is_uploaded_file($tmpname)) {
                    if (unlink($tmpname) && $tmpfname) unset($GLOBALS['elFinderTempFiles'][$tmpfname]);
                    continue;
                }
                break;
            }
            $rnres = array();
            if ($thash !== '' && $thash !== $target) {
                if ($dir = $volume->dir($thash)) {
                    $_target = $thash;
                    if (!isset($addedDirs[$thash])) {
                        $addedDirs[$thash] = true;
                        $result['added'][] = $dir;
                        // to support multi-level directory creation
                        $_phash = isset($dir['phash']) ? $dir['phash'] : null;
                        while ($_phash && !isset($addedDirs[$_phash]) && $_phash !== $target) {
                            if ($_dir = $volume->dir($_phash)) {
                                $addedDirs[$_phash] = true;
                                $result['added'][] = $_dir;
                                $_phash = isset($_dir['phash']) ? $_dir['phash'] : null;
                            } else {
                                break;
                            }
                        }
                    }
                } else {
                    $result['error'] = $this->error(self::ERROR_UPLOAD, self::ERROR_TRGDIR_NOT_FOUND, 'hash@' . $thash);
                    break;
                }
            } else {
                $_target = $target;
                // file rename for backup
                if (isset($renames[$name])) {
                    $dir = $volume->realpath($_target);
                    if (isset($hashes[$name])) {
                        $hash = $hashes[$name];
                    } else {
                        $hash = $volume->getHash($dir, $name);
                    }
                    $rnres = $this->rename(array('target' => $hash, 'name' => $volume->uniqueName($dir, $name, $suffix, true, 0)));
                    if (!empty($rnres['error'])) {
                        $result['warning'] = $rnres['error'];
                        if (!is_array($rnres['error'])) {
                            $errors = array_push($errors, $rnres['error']);
                        } else {
                            $errors = array_merge($errors, $rnres['error']);
                        }
                        continue;
                    }
                }
            }
            if (!$_target || ($file = $volume->upload($fp, $_target, $name, $tmpname, ($_target === $target) ? $hashes : array())) === false) {
                $errors = array_merge($errors, $this->error(self::ERROR_UPLOAD_FILE, $name, $volume->error()));
                fclose($fp);
                if (!is_uploaded_file($tmpname) && unlink($tmpname)) {
                    unset($GLOBALS['elFinderTempFiles'][$tmpname]);
                }
                continue;
            }

            is_resource($fp) && fclose($fp);
            if (!is_uploaded_file($tmpname)) {
                clearstatcache();
                if (!is_file($tmpname) || unlink($tmpname)) {
                    unset($GLOBALS['elFinderTempFiles'][$tmpname]);
                }
            }
            $result['added'][] = $file;
            if ($rnres) {
                $result = array_merge_recursive($result, $rnres);
            }
        }

        if ($errors) {
            $result['warning'] = $errors;
        }

        if ($GLOBALS['elFinderTempFiles']) {
            foreach (array_keys($GLOBALS['elFinderTempFiles']) as $_temp) {
                is_file($_temp) && is_writable($_temp) && unlink($_temp);
            }
        }
        $result['removed'] = $volume->removed();

        if (!empty($args['node'])) {
            $result['callback'] = array(
                'node' => $args['node'],
                'bind' => 'upload'
            );
        }
        return $result;
    }

    /**
     * Copy/move files into new destination
     *
     * @param  array  command arguments
     *
     * @return array
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function paste($args)
    {
        $dst = $args['dst'];
        $targets = is_array($args['targets']) ? $args['targets'] : array();
        $cut = !empty($args['cut']);
        $error = $cut ? self::ERROR_MOVE : self::ERROR_COPY;
        $result = array('changed' => array(), 'added' => array(), 'removed' => array(), 'warning' => array());

        if (($dstVolume = $this->volume($dst)) == false) {
            return array('error' => $this->error($error, '#' . $targets[0], self::ERROR_TRGDIR_NOT_FOUND, '#' . $dst));
        }

        $this->itemLock($dst);

        $hashes = $renames = array();
        $suffix = '~';
        if (!empty($args['renames'])) {
            $renames = array_flip($args['renames']);
            if (is_string($args['suffix']) && !preg_match('/[\/\\?*:|"<>]/', $args['suffix'])) {
                $suffix = $args['suffix'];
            }
        }
        if (!empty($args['hashes'])) {
            $hashes = array_flip($args['hashes']);
        }

        foreach ($targets as $target) {
            elFinder::checkAborted();

            if (($srcVolume = $this->volume($target)) == false) {
                $result['warning'] = array_merge($result['warning'], $this->error($error, '#' . $target, self::ERROR_FILE_NOT_FOUND));
                continue;
            }

            $rnres = array();
            if ($renames) {
                $file = $srcVolume->file($target);
                if (isset($renames[$file['name']])) {
                    $dir = $dstVolume->realpath($dst);
                    $dstName = $file['name'];
                    if ($srcVolume !== $dstVolume) {
                        $errors = array();
                        try {
                            $this->trigger('paste.copyfrom', array(&$dst, &$dstName, '', $this, $dstVolume), $errors);
                        } catch (elFinderTriggerException $e) {
                            $result['warning'] = array_merge($result['warning'], $errors);
                            continue;
                        }
                    }
                    if (isset($hashes[$file['name']])) {
                        $hash = $hashes[$file['name']];
                    } else {
                        $hash = $dstVolume->getHash($dir, $dstName);
                    }
                    $rnres = $this->rename(array('target' => $hash, 'name' => $dstVolume->uniqueName($dir, $dstName, $suffix, true, 0)));
                    if (!empty($rnres['error'])) {
                        $result['warning'] = array_merge($result['warning'], $rnres['error']);
                        continue;
                    }
                }
            }

            if ($cut && $this->itemLocked($target)) {
                $rm = $srcVolume->file($target);
                $result['warning'] = array_merge($result['warning'], $this->error(self::ERROR_LOCKED, $rm['name']));
                continue;
            }

            if (($file = $dstVolume->paste($srcVolume, $target, $dst, $cut, $hashes)) == false) {
                $result['warning'] = array_merge($result['warning'], $this->error($dstVolume->error()));
                continue;
            }

            if ($error = $dstVolume->error()) {
                $result['warning'] = array_merge($result['warning'], $this->error($error));
            }

            if ($rnres) {
                $result = array_merge_recursive($result, $rnres);
            }
        }
        if (count($result['warning']) < 1) {
            unset($result['warning']);
        } else {
            $result['sync'] = true;
        }

        return $result;
    }

    /**
     * Return file content
     *
     * @param  array $args command arguments
     *
     * @return array
     * @author Dmitry (dio) Levashov
     **/
    protected function get($args)
    {
        $target = $args['target'];
        $volume = $this->volume($target);
        $enc = false;

        if (!$volume || ($file = $volume->file($target)) == false) {
            return array('error' => $this->error(self::ERROR_OPEN, '#' . $target, self::ERROR_FILE_NOT_FOUND));
        }

        if ($volume->commandDisabled('get')) {
            return array('error' => $this->error(self::ERROR_OPEN, '#' . $target, self::ERROR_ACCESS_DENIED));
        }

        if (($content = $volume->getContents($target)) === false) {
            return array('error' => $this->error(self::ERROR_OPEN, $volume->path($target), $volume->error()));
        }

        $mime = isset($file['mime']) ? $file['mime'] : '';
        if ($mime && (strtolower(substr($mime, 0, 4)) === 'text' || in_array(strtolower($mime), self::$textMimes))) {
            $enc = '';
            if ($content !== '') {
                if (!$args['conv'] || $args['conv'] == '1') {
                    // detect encoding
                    if (function_exists('mb_detect_encoding')) {
                        if ($enc = mb_detect_encoding($content, mb_detect_order(), true)) {
                            $encu = strtoupper($enc);
                            if ($encu === 'UTF-8' || $encu === 'ASCII') {
                                $enc = '';
                            }
                        } else {
                            $enc = 'unknown';
                        }
                    } else if (!preg_match('//u', $content)) {
                        $enc = 'unknown';
                    }
                    if ($enc === 'unknown') {
                        $enc = $volume->getOption('encoding');
                        if (!$enc || strtoupper($enc) === 'UTF-8') {
                            $enc = 'unknown';
                        }
                    }
                    // call callbacks 'get.detectencoding'
                    if (!empty($this->listeners['get.detectencoding'])) {
                        foreach ($this->listeners['get.detectencoding'] as $handler) {
                            call_user_func_array($handler, array('get', &$enc, array_merge($args, array('content' => $content)), $this, $volume));
                        }
                    }
                    if ($enc && $enc !== 'unknown') {
                        $errlev = error_reporting();
                        error_reporting($errlev ^ E_NOTICE);
                        $utf8 = iconv($enc, 'UTF-8', $content);
                        if ($utf8 === false && function_exists('mb_convert_encoding')) {
                            error_reporting($errlev ^ E_WARNING);
                            $utf8 = mb_convert_encoding($content, 'UTF-8', $enc);
                            if (mb_convert_encoding($utf8, $enc, 'UTF-8') !== $content) {
                                $enc = 'unknown';
                            }
                        } else {
                            if ($utf8 === false || iconv('UTF-8', $enc, $utf8) !== $content) {
                                $enc = 'unknown';
                            }
                        }
                        error_reporting($errlev);
                        if ($enc !== 'unknown') {
                            $content = $utf8;
                        }
                    }
                    if ($enc) {
                        if ($args['conv'] == '1') {
                            $args['conv'] = '';
                            if ($enc === 'unknown') {
                                $content = false;
                            }
                        } else if ($enc === 'unknown') {
                            return array('doconv' => $enc);
                        }
                    }
                    if ($args['conv'] == '1') {
                        $args['conv'] = '';
                    }
                }
                if ($args['conv']) {
                    $enc = $args['conv'];
                    if (strtoupper($enc) !== 'UTF-8') {
                        $_content = $content;
                        $errlev = error_reporting();
                        $this->setToastErrorHandler(array(
                            'prefix' => 'Notice: '
                        ));
                        error_reporting($errlev | E_NOTICE | E_WARNING);
                        $content = iconv($enc, 'UTF-8//TRANSLIT', $content);
                        if ($content === false && function_exists('mb_convert_encoding')) {
                            $content = mb_convert_encoding($_content, 'UTF-8', $enc);
                        }
                        error_reporting($errlev);
                        $this->setToastErrorHandler(false);
                    } else {
                        $enc = '';
                    }
                }
            }
        } else {
            $content = 'data:' . ($mime ? $mime : 'application/octet-stream') . ';base64,' . base64_encode($content);
        }

        if ($enc !== false) {
            $json = false;
            if ($content !== false) {
                $json = json_encode($content);
            }
            if ($content === false || $json === false || strlen($json) < strlen($content)) {
                return array('doconv' => 'unknown');
            }
        }

        $res = array(
            'header' => array(
                'Content-Type: application/json'
            ),
            'content' => $content
        );

        // add cache control headers
        if ($cacheHeaders = $volume->getOption('cacheHeaders')) {
            $res['header'] = array_merge($res['header'], $cacheHeaders);
        }

        if ($enc) {
            $res['encoding'] = $enc;
        }
        return $res;
    }

    /**
     * Save content into text file
     *
     * @param $args
     *
     * @return array
     * @author Dmitry (dio) Levashov
     */
    protected function put($args)
    {
        $target = $args['target'];
        $encoding = isset($args['encoding']) ? $args['encoding'] : '';

        if (($volume = $this->volume($target)) == false
            || ($file = $volume->file($target)) == false) {
            return array('error' => $this->error(self::ERROR_SAVE, '#' . $target, self::ERROR_FILE_NOT_FOUND));
        }

        $this->itemLock($target);

        if ($encoding === 'scheme') {
            if (preg_match('~^https?://~i', $args['content'])) {
                /** @var resource $fp */
                $fp = $this->get_remote_contents($args['content'], 30, 5, 'Mozilla/5.0', $volume->tmpfile());
                if (!$fp) {
                    return array('error' => self::ERROR_SAVE, $args['content'], self::ERROR_FILE_NOT_FOUND);
                }
                $fmeta = stream_get_meta_data($fp);
                $mime = $this->detectMimeType($fmeta['uri']);
                if ($mime === 'unknown') {
                    $mime = 'application/octet-stream';
                }
                $mime = $volume->mimeTypeNormalize($mime, $file['name']);
                $args['content'] = 'data:' . $mime . ';base64,' . base64_encode(file_get_contents($fmeta['uri']));
            }
            $encoding = '';
            $args['content'] = "\0" . $args['content'];
        } else if ($encoding === 'hash') {
            $_hash = $args['content'];
            if ($_src = $this->getVolume($_hash)) {
                if ($_file = $_src->file($_hash)) {
                    if ($_data = $_src->getContents($_hash)) {
                        $args['content'] = 'data:' . $file['mime'] . ';base64,' . base64_encode($_data);
                    }
                }
            }
            $encoding = '';
            $args['content'] = "\0" . $args['content'];
        }
        if ($encoding) {
            $content = iconv('UTF-8', $encoding, $args['content']);
            if ($content === false && function_exists('mb_detect_encoding')) {
                $content = mb_convert_encoding($args['content'], $encoding, 'UTF-8');
            }
            if ($content !== false) {
                $args['content'] = $content;
            }
        }
        if (($file = $volume->putContents($target, $args['content'])) == false) {
            return array('error' => $this->error(self::ERROR_SAVE, $volume->path($target), $volume->error()));
        }

        return array('changed' => array($file));
    }

    /**
     * Extract files from archive
     *
     * @param  array $args command arguments
     *
     * @return array
     * @author Dmitry (dio) Levashov,
     * @author Alexey Sukhotin
     **/
    protected function extract($args)
    {
        $target = $args['target'];
        $makedir = isset($args['makedir']) ? (bool)$args['makedir'] : null;

        if(strpos($target,'..') !== false){
            return array('error' => $this->error(self::ERROR_EXTRACT, '#' . $target, self::ERROR_FILE_NOT_FOUND));
        }

        if (($volume = $this->volume($target)) == false
            || ($file = $volume->file($target)) == false) {
            return array('error' => $this->error(self::ERROR_EXTRACT, '#' . $target, self::ERROR_FILE_NOT_FOUND));
        }

        $res = array();
        if ($file = $volume->extract($target, $makedir)) {
            $res['added'] = isset($file['read']) ? array($file) : $file;
            if ($err = $volume->error()) {
                $res['warning'] = $err;
            }
        } else {
            $res['error'] = $this->error(self::ERROR_EXTRACT, $volume->path($target), $volume->error());
        }
        return $res;
    }

    /**
     * Create archive
     *
     * @param  array $args command arguments
     *
     * @return array
     * @throws Exception
     * @author Dmitry (dio) Levashov,
     * @author Alexey Sukhotin
     */
    protected function archive($args)
    {
        $targets = isset($args['targets']) && is_array($args['targets']) ? $args['targets'] : array();
        $name = isset($args['name']) ? $args['name'] : '';

        if(strpos($name,'..') !== false){
            return $this->error('Invalid Request.', self::ERROR_TRGDIR_NOT_FOUND);
        }

        $targets = array_filter($targets, array($this, 'volume'));
        if (!$targets || ($volume = $this->volume($targets[0])) === false) {
            return $this->error(self::ERROR_ARCHIVE, self::ERROR_TRGDIR_NOT_FOUND);
        }

        foreach ($targets as $target) {
            $explodedStr = explode('l1_', $target);
            $targetFolderName = base64_decode($explodedStr[1]);
            if(strpos($targetFolderName,'..') !== false){
                return $this->error('Invalid Request.', self::ERROR_TRGDIR_NOT_FOUND);
            }
            $this->itemLock($target);
        }

        return ($file = $volume->archive($targets, $args['type'], $name))
            ? array('added' => array($file))
            : array('error' => $this->error(self::ERROR_ARCHIVE, $volume->error()));
    }

    /**
     * Search files
     *
     * @param  array $args command arguments
     *
     * @return array
     * @throws elFinderAbortException
     * @author Dmitry Levashov
     */
    protected function search($args)
    {
        $q = trim($args['q']);
        $mimes = !empty($args['mimes']) && is_array($args['mimes']) ? $args['mimes'] : array();
        $target = !empty($args['target']) ? $args['target'] : null;
        $type = !empty($args['type']) ? $args['type'] : null;
        $result = array();
        $errors = array();

        if ($target) {
            if ($volume = $this->volume($target)) {
                $result = $volume->search($q, $mimes, $target, $type);
                $errors = array_merge($errors, $volume->error());
            }
        } else {
            foreach ($this->volumes as $volume) {
                $result = array_merge($result, $volume->search($q, $mimes, null, $type));
                $errors = array_merge($errors, $volume->error());
            }
        }

        $result = array('files' => $result);
        if ($errors) {
            $result['warning'] = $errors;
        }
        return $result;
    }

    /**
     * Return file info (used by client "places" ui)
     *
     * @param  array $args command arguments
     *
     * @return array
     * @throws elFinderAbortException
     * @author Dmitry Levashov
     */
    protected function info($args)
    {
        $files = array();
        $compare = null;
        // long polling mode
        if ($args['compare'] && count($args['targets']) === 1) {
            $compare = intval($args['compare']);
            $hash = $args['targets'][0];
            if ($volume = $this->volume($hash)) {
                $standby = (int)$volume->getOption('plStandby');
                $_compare = false;
                if (($syncCheckFunc = $volume->getOption('syncCheckFunc')) && is_callable($syncCheckFunc)) {
                    $_compare = call_user_func_array($syncCheckFunc, array($volume->realpath($hash), $standby, $compare, $volume, $this));
                }
                if ($_compare !== false) {
                    $compare = $_compare;
                } else {
                    $sleep = max(1, (int)$volume->getOption('tsPlSleep'));
                    $limit = max(1, $standby / $sleep) + 1;
                    do {
                        elFinder::extendTimeLimit(30 + $sleep);
                        $volume->clearstatcache();
                        if (($info = $volume->file($hash)) != false) {
                            if ($info['ts'] != $compare) {
                                $compare = $info['ts'];
                                break;
                            }
                        } else {
                            $compare = 0;
                            break;
                        }
                        if (--$limit) {
                            sleep($sleep);
                        }
                    } while ($limit);
                }
            }
        } else {
            foreach ($args['targets'] as $hash) {
                elFinder::checkAborted();
                if (($volume = $this->volume($hash)) != false
                    && ($info = $volume->file($hash)) != false) {
                    $info['path'] = $volume->path($hash);
                    $files[] = $info;
                }
            }
        }

        $result = array('files' => $files);
        if (!is_null($compare)) {
            $result['compare'] = strval($compare);
        }
        return $result;
    }

    /**
     * Return image dimensions
     *
     * @param  array $args command arguments
     *
     * @return array
     * @throws ImagickException
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function dim($args)
    {
        $res = array();
        $target = $args['target'];

        if (($volume = $this->volume($target)) != false) {
            if ($dim = $volume->dimensions($target, $args)) {
                if (is_array($dim) && isset($dim['dim'])) {
                    $res = $dim;
                } else {
                    $res = array('dim' => $dim);
                    if ($subImgLink = $volume->getSubstituteImgLink($target, explode('x', $dim))) {
                        $res['url'] = $subImgLink;
                    }
                }
            }
        }

        return $res;
    }

    /**
     * Resize image
     *
     * @param  array  command arguments
     *
     * @return array
     * @throws ImagickException
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     * @author Alexey Sukhotin
     */
    protected function resize($args)
    {
        $target = $args['target'];
        $width = (int)$args['width'];
        $height = (int)$args['height'];
        $x = (int)$args['x'];
        $y = (int)$args['y'];
        $mode = $args['mode'];
        $bg = $args['bg'];
        $degree = (int)$args['degree'];
        $quality = (int)$args['quality'];

        if (($volume = $this->volume($target)) == false
            || ($file = $volume->file($target)) == false) {
            return array('error' => $this->error(self::ERROR_RESIZE, '#' . $target, self::ERROR_FILE_NOT_FOUND));
        }

        if ($mode !== 'rotate' && ($width < 1 || $height < 1)) {
            return array('error' => $this->error(self::ERROR_RESIZESIZE));
        }
        return ($file = $volume->resize($target, $width, $height, $x, $y, $mode, $bg, $degree, $quality))
            ? (!empty($file['losslessRotate']) ? $file : array('changed' => array($file)))
            : array('error' => $this->error(self::ERROR_RESIZE, $volume->path($target), $volume->error()));
    }

    /**
     * Return content URL
     *
     * @param  array $args command arguments
     *
     * @return array
     * @author Naoki Sawada
     **/
    protected function url($args)
    {
        $target = $args['target'];
        $options = isset($args['options']) ? $args['options'] : array();
        if (($volume = $this->volume($target)) != false) {
            if (!$volume->commandDisabled('url')) {
                $url = $volume->getContentUrl($target, $options);
                return $url ? array('url' => $url) : array();
            }
        }
        return array();
    }

    /**
     * Output callback result with JavaScript that control elFinder
     * or HTTP redirect to callbackWindowURL
     *
     * @param  array  command arguments
     *
     * @throws elFinderAbortException
     * @author Naoki Sawada
     */
    protected function callback($args)
    {
        $checkReg = '/[^a-zA-Z0-9;._-]/';
        $node = (isset($args['node']) && !preg_match($checkReg, $args['node'])) ? $args['node'] : '';
        $json = (isset($args['json']) && json_decode($args['json'])) ? $args['json'] : '{}';
        $bind = (isset($args['bind']) && !preg_match($checkReg, $args['bind'])) ? $args['bind'] : '';
        $done = (!empty($args['done']));

        while (ob_get_level()) {
            if (!ob_end_clean()) {
                break;
            }
        }

        if ($done || !$this->callbackWindowURL) {
            $script = '';
            if ($node) {
                if ($bind) {
                    $trigger = 'elf.trigger(\'' . $bind . '\', data);';
                    $triggerdone = 'elf.trigger(\'' . $bind . 'done\');';
                    $triggerfail = 'elf.trigger(\'' . $bind . 'fail\', data);';
                } else {
                    $trigger = $triggerdone = $triggerfail = '';
                }
                $origin = isset($_SERVER['HTTP_ORIGIN'])? str_replace('\'', '\\\'', $_SERVER['HTTP_ORIGIN']) : '*';
                $script .= '
var go = function() {
    var w = window.opener || window.parent || window,
        close = function(){
            window.open("about:blank","_self").close();
            return false;
        };
    try {
        var elf = w.document.getElementById(\'' . $node . '\').elfinder;
        if (elf) {
            var data = ' . $json . ';
            if (data.error) {
                ' . $triggerfail . '
                elf.error(data.error);
            } else {
                data.warning && elf.error(data.warning);
                data.removed && data.removed.length && elf.remove(data);
                data.added   && data.added.length   && elf.add(data);
                data.changed && data.changed.length && elf.change(data);
                ' . $trigger . '
                ' . $triggerdone . '
                data.sync && elf.sync();
            }
        }
    } catch(e) {
        // for CORS
        w.postMessage && w.postMessage(JSON.stringify({bind:\'' . $bind . '\',data:' . $json . '}), \'' . $origin . '\');
    }
    close();
    setTimeout(function() {
        var msg = document.getElementById(\'msg\');
        msg.style.display = \'inline\';
        msg.onclick = close;
    }, 100);
};
';
            }

            $out = '<!DOCTYPE html><html lang="en"><head><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2"><script>' . $script . '</script></head><body><h2 id="msg" style="display:none;"><a href="#">Please close this tab.</a></h2><script>go();</script></body></html>';

            header('Content-Type: text/html; charset=utf-8');
            header('Content-Length: ' . strlen($out));
            header('Cache-Control: private');
            header('Pragma: no-cache');

            echo $out;

        } else {
            $url = $this->callbackWindowURL;
            $url .= ((strpos($url, '?') === false) ? '?' : '&')
                . '&node=' . rawurlencode($node)
                . (($json !== '{}') ? ('&json=' . rawurlencode($json)) : '')
                . ($bind ? ('&bind=' . rawurlencode($bind)) : '')
                . '&done=1';

            header('Location: ' . $url);

        }
        throw new elFinderAbortException();
    }

    /**
     * Error handler for send toast message to client side
     *
     * @param int    $errno
     * @param string $errstr
     * @param string $errfile
     * @param int    $errline
     *
     * @return boolean
     */
    protected function toastErrorHandler($errno, $errstr, $errfile, $errline)
    {
        $proc = false;
        if (!(error_reporting() & $errno)) {
            return $proc;
        }
        $toast = array();
        $toast['mode'] = $this->toastParams['mode'];
        $toast['msg'] = $this->toastParams['prefix'] . $errstr;
        $this->toastMessages[] = $toast;
        return true;
    }

    /**
     * PHP error handler, catch error types only E_WARNING | E_NOTICE | E_USER_WARNING | E_USER_NOTICE
     *
     * @param int    $errno
     * @param string $errstr
     * @param string $errfile
     * @param int    $errline
     *
     * @return boolean
     */
    public static function phpErrorHandler($errno, $errstr, $errfile, $errline)
    {
        static $base = null;

        $proc = false;

        if (is_null($base)) {
            $base = dirname(__FILE__) . DIRECTORY_SEPARATOR;
        }

        if (!(error_reporting() & $errno)) {
            return $proc;
        }

        // Do not report real path
        if (strpos($errfile, $base) === 0) {
            $errfile = str_replace($base, '', $errfile);
        } else if ($pos = strrpos($errfile, '/vendor/')) {
            $errfile = substr($errfile, $pos + 1);
        } else {
            $errfile = basename($errfile);
        }

        switch ($errno) {
            case E_WARNING:
            case E_USER_WARNING:
                elFinder::$phpErrors[] = "WARNING: $errstr in $errfile line $errline.";
                $proc = true;
                break;

            case E_NOTICE:
            case E_USER_NOTICE:
                elFinder::$phpErrors[] = "NOTICE: $errstr in $errfile line $errline.";
                $proc = true;
                break;

            case E_STRICT:
                elFinder::$phpErrors[] = "STRICT: $errstr in $errfile line $errline.";
                $proc = true;
                break;

            case E_RECOVERABLE_ERROR:
                elFinder::$phpErrors[] = "RECOVERABLE_ERROR: $errstr in $errfile line $errline.";
                $proc = true;
                break;
        }

        if (defined('E_DEPRECATED')) {
            switch ($errno) {
                case E_DEPRECATED:
                case E_USER_DEPRECATED:
                    elFinder::$phpErrors[] = "DEPRECATED: $errstr in $errfile line $errline.";
                    $proc = true;
                    break;
            }
        }

        return $proc;
    }

    /***************************************************************************/
    /*                                   utils                                 */
    /***************************************************************************/

    /**
     * Return root - file's owner
     *
     * @param  string  file hash
     *
     * @return elFinderVolumeDriver|boolean (false)
     * @author Dmitry (dio) Levashov
     **/
    protected function volume($hash)
    {
        foreach ($this->volumes as $id => $v) {
            if (strpos('' . $hash, $id) === 0) {
                return $this->volumes[$id];
            }
        }
        return false;
    }

    /**
     * Return files info array
     *
     * @param  array $data one file info or files info
     *
     * @return array
     * @author Dmitry (dio) Levashov
     **/
    protected function toArray($data)
    {
        return isset($data['hash']) || !is_array($data) ? array($data) : $data;
    }

    /**
     * Return fils hashes list
     *
     * @param  array $files files info
     *
     * @return array
     * @author Dmitry (dio) Levashov
     **/
    protected function hashes($files)
    {
        $ret = array();
        foreach ($files as $file) {
            $ret[] = $file['hash'];
        }
        return $ret;
    }

    /**
     * Remove from files list hidden files and files with required mime types
     *
     * @param  array $files files info
     *
     * @return array
     * @author Dmitry (dio) Levashov
     **/
    protected function filter($files)
    {
        $exists = array();
        foreach ($files as $i => $file) {
            if (isset($file['hash'])) {
                if (isset($exists[$file['hash']]) || !empty($file['hidden']) || !$this->default->mimeAccepted($file['mime'])) {
                    unset($files[$i]);
                }
                $exists[$file['hash']] = true;
            }
        }
        return array_values($files);
    }

    protected function utime()
    {
        $time = explode(" ", microtime());
        return (double)$time[1] + (double)$time[0];
    }

    /**
     * Return Network mount volume unique ID
     *
     * @param  array  $netVolumes Saved netvolumes array
     * @param  string $prefix     Id prefix
     *
     * @return string|false
     * @author Naoki Sawada
     **/
    protected function getNetVolumeUniqueId($netVolumes = null, $prefix = 'nm')
    {
        if (is_null($netVolumes)) {
            $netVolumes = $this->getNetVolumes();
        }
        $ids = array();
        foreach ($netVolumes as $vOps) {
            if (isset($vOps['id']) && strpos($vOps['id'], $prefix) === 0) {
                $ids[$vOps['id']] = true;
            }
        }
        if (!$ids) {
            $id = $prefix . '1';
        } else {
            $i = 0;
            while (isset($ids[$prefix . ++$i]) && $i < 10000) ;
            $id = $prefix . $i;
            if (isset($ids[$id])) {
                $id = false;
            }
        }
        return $id;
    }

    /**
     * Is item locked?
     *
     * @param string $hash
     *
     * @return boolean
     */
    protected function itemLocked($hash)
    {
        if (!elFinder::$commonTempPath) {
            return false;
        }
        $lock = elFinder::$commonTempPath . DIRECTORY_SEPARATOR . self::filenameDecontaminate($hash) . '.lock';
        if (file_exists($lock)) {
            if (filemtime($lock) + $this->itemLockExpire < time()) {
                unlink($lock);
                return false;
            }
            return true;
        }

        return false;
    }

    /**
     * Do lock target item
     *
     * @param array|string $hashes
     * @param boolean      $autoUnlock
     *
     * @return void
     */
    protected function itemLock($hashes, $autoUnlock = true)
    {
        if (!elFinder::$commonTempPath) {
            return;
        }
        if (!is_array($hashes)) {
            $hashes = array($hashes);
        }
        foreach ($hashes as $hash) {
            $lock = elFinder::$commonTempPath . DIRECTORY_SEPARATOR . self::filenameDecontaminate($hash) . '.lock';
            if ($this->itemLocked($hash)) {
                $cnt = file_get_contents($lock) + 1;
            } else {
                $cnt = 1;
            }
            if (file_put_contents($lock, $cnt, LOCK_EX)) {
                if ($autoUnlock) {
                    $this->autoUnlocks[] = $hash;
                }
            }
        }
    }

    /**
     * Do unlock target item
     *
     * @param string $hash
     *
     * @return boolean
     */
    protected function itemUnlock($hash)
    {
        if (!$this->itemLocked($hash)) {
            return true;
        }
        $lock = elFinder::$commonTempPath . DIRECTORY_SEPARATOR . $hash . '.lock';
        $cnt = file_get_contents($lock);
        if (--$cnt < 1) {
            unlink($lock);
            return true;
        } else {
            file_put_contents($lock, $cnt, LOCK_EX);
            return false;
        }
    }

    /**
     * unlock locked items on command completion
     *
     * @return void
     */
    public function itemAutoUnlock()
    {
        if ($this->autoUnlocks) {
            foreach ($this->autoUnlocks as $hash) {
                $this->itemUnlock($hash);
            }
            $this->autoUnlocks = array();
        }
    }

    /**
     * Ensure directories recursively
     *
     * @param  object $volume Volume object
     * @param  string $target Target hash
     * @param  array  $dirs   Array of directory tree to ensure
     * @param  string $path   Relative path form target hash
     *
     * @return array|false      array('stats' => array([stat of maked directory]), 'hashes' => array('[path]' => '[hash]'), 'makes' => array([New directory hashes]), 'error' => array([Error name]))
     * @author Naoki Sawada
     **/
    protected function ensureDirsRecursively($volume, $target, $dirs, $path = '')
    {
        $res = array('stats' => array(), 'hashes' => array(), 'makes' => array(), 'error' => array());
        foreach ($dirs as $name => $sub) {
            $name = (string)$name;
            $dir = $newDir = null;
            if ((($parent = $volume->realpath($target)) && ($dir = $volume->dir($volume->getHash($parent, $name)))) || ($newDir = $volume->mkdir($target, $name))) {
                $_path = $path . '/' . $name;
                if ($newDir) {
                    $res['makes'][] = $newDir['hash'];
                    $dir = $newDir;
                }
                $res['stats'][] = $dir;
                $res['hashes'][$_path] = $dir['hash'];
                if (count($sub)) {
                    $res = array_merge_recursive($res, $this->ensureDirsRecursively($volume, $dir['hash'], $sub, $_path));
                }
            } else {
                $res['error'][] = $name;
            }
        }
        return $res;
    }

    /**
     * Sets the toast error handler.
     *
     * @param array $opts The options
     */
    public function setToastErrorHandler($opts)
    {
        $this->toastParams = $this->toastParamsDefault;
        if (!$opts) {
            restore_error_handler();
        } else {
            $this->toastParams = array_merge($this->toastParams, $opts);
            set_error_handler(array($this, 'toastErrorHandler'));
        }
    }

    /**
     * String encode convert to UTF-8
     *
     * @param      string  $str  Input string
     *
     * @return     string  UTF-8 string
     */
    public function utf8Encode($str)
    {
        static $mbencode = null;
        $str = (string) $str;
        if (@iconv('utf-8', 'utf-8//IGNORE', $str) === $str) {
            return $str;
        }

        if ($this->utf8Encoder) {
            return $this->utf8Encoder($str);
        }

        if ($mbencode === null) {
            $mbencode = function_exists('mb_convert_encoding') && function_exists('mb_detect_encoding');
        }

        if ($mbencode) {
            if ($enc = mb_detect_encoding($str, mb_detect_order(), true)) {
                $_str = mb_convert_encoding($str, 'UTF-8', $enc);
                if (@iconv('utf-8', 'utf-8//IGNORE', $_str) === $_str) {
                    return $_str;
                }
            }
        }
        return utf8_encode($str);
    }

    /***************************************************************************/
    /*                           static  utils                                 */
    /***************************************************************************/

    /**
     * Return full version of API that this connector supports all functions
     *
     * @return string
     */
    public static function getApiFullVersion()
    {
        return (string)self::$ApiVersion . '.' . (string)self::$ApiRevision;
    }

    /**
     * Return self::$commonTempPath
     *
     * @return     string  The common temporary path.
     */
    public static function getCommonTempPath()
    {
        return self::$commonTempPath;
    }

    /**
     * Return Is Animation Gif
     *
     * @param  string $path server local path of target image
     *
     * @return bool
     */
    public static function isAnimationGif($path)
    {
        list(, , $type) = getimagesize($path);
        switch ($type) {
            case IMAGETYPE_GIF:
                break;
            default:
                return false;
        }

        $imgcnt = 0;
        $fp = fopen($path, 'rb');
        fread($fp, 4);
        $c = fread($fp, 1);
        if (ord($c) != 0x39) {  // GIF89a
            return false;
        }

        while (!feof($fp)) {
            do {
                $c = fread($fp, 1);
            } while (ord($c) != 0x21 && !feof($fp));

            if (feof($fp)) {
                break;
            }

            $c2 = fread($fp, 2);
            if (bin2hex($c2) == "f904") {
                $imgcnt++;
                if ($imgcnt === 2) {
                    break;
                }
            }

            if (feof($fp)) {
                break;
            }
        }

        if ($imgcnt > 1) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Return Is Animation Png
     *
     * @param  string $path server local path of target image
     *
     * @return bool
     */
    public static function isAnimationPng($path)
    {
        list(, , $type) = getimagesize($path);
        switch ($type) {
            case IMAGETYPE_PNG:
                break;
            default:
                return false;
        }

        $fp = fopen($path, 'rb');
        $img_bytes = fread($fp, 1024);
        fclose($fp);
        if ($img_bytes) {
            if (strpos(substr($img_bytes, 0, strpos($img_bytes, 'IDAT')), 'acTL') !== false) {
                return true;
            }
        }
        return false;
    }

    /**
     * Return Is seekable stream resource
     *
     * @param resource $resource
     *
     * @return bool
     */
    public static function isSeekableStream($resource)
    {
        $metadata = stream_get_meta_data($resource);
        return $metadata['seekable'];
    }

    /**
     * Rewind stream resource
     *
     * @param resource $resource
     *
     * @return void
     */
    public static function rewind($resource)
    {
        self::isSeekableStream($resource) && rewind($resource);
    }

    /**
     * Determines whether the specified resource is seekable url.
     *
     * @param      <type>   $resource  The resource
     *
     * @return     boolean  True if the specified resource is seekable url, False otherwise.
     */
    public static function isSeekableUrl($resource)
    {
        $id = (int)$resource;
        if (isset(elFinder::$seekableUrlFps[$id])) {
            return elFinder::$seekableUrlFps[$id];
        }
        return null;
    }

    /**
     * serialize and base64_encode of session data (If needed)
     *
     * @deprecated
     *
     * @param  mixed $var target variable
     *
     * @author Naoki Sawada
     * @return mixed|string
     */
    public static function sessionDataEncode($var)
    {
        if (self::$base64encodeSessionData) {
            $var = base64_encode(serialize($var));
        }
        return $var;
    }

    /**
     * base64_decode and unserialize of session data  (If needed)
     *
     * @deprecated
     *
     * @param  mixed $var     target variable
     * @param  bool  $checkIs data type for check (array|string|object|int)
     *
     * @author Naoki Sawada
     * @return bool|mixed
     */
    public static function sessionDataDecode(&$var, $checkIs = null)
    {
        if (self::$base64encodeSessionData) {
            $data = unserialize(base64_decode($var));
        } else {
            $data = $var;
        }
        $chk = true;
        if ($checkIs) {
            switch ($checkIs) {
                case 'array':
                    $chk = is_array($data);
                    break;
                case 'string':
                    $chk = is_string($data);
                    break;
                case 'object':
                    $chk = is_object($data);
                    break;
                case 'int':
                    $chk = is_int($data);
                    break;
            }
        }
        if (!$chk) {
            unset($var);
            return false;
        }
        return $data;
    }

    /**
     * Call session_write_close() if session is restarted
     *
     * @deprecated
     * @return void
     */
    public static function sessionWrite()
    {
        if (session_id()) {
            session_write_close();
        }
    }

    /**
     * Return elFinder static variable
     *
     * @param $key
     *
     * @return mixed|null
     */
    public static function getStaticVar($key)
    {
        return isset(elFinder::$$key) ? elFinder::$$key : null;
    }

    /**
     * Extend PHP execution time limit and also check connection is aborted
     *
     * @param Int $time
     *
     * @return void
     * @throws elFinderAbortException
     */
    public static function extendTimeLimit($time = null)
    {
        static $defLimit = null;
        if (!self::aborted()) {
            if (is_null($defLimit)) {
                $defLimit = ini_get('max_execution_time');
            }
            if ($defLimit != 0) {
                $time = is_null($time) ? $defLimit : max($defLimit, $time);
                set_time_limit($time);
            }
        } else {
            throw new elFinderAbortException();
        }
    }

    /**
     * Check connection is aborted
     * Script stop immediately if connection aborted
     *
     * @return void
     * @throws elFinderAbortException
     */
    public static function checkAborted()
    {
        elFinder::extendTimeLimit();
    }

    /**
     * Return bytes from php.ini value
     *
     * @param string $iniName
     * @param string $val
     *
     * @return number
     */
    public static function getIniBytes($iniName = '', $val = '')
    {
        if ($iniName !== '') {
            $val = ini_get($iniName);
            if ($val === false) {
                return 0;
            }
        }
        $val = trim($val, "bB \t\n\r\0\x0B");
        $last = strtolower($val[strlen($val) - 1]);
        $val = sprintf('%u', $val);
        switch ($last) {
            case 'y':
                $val = elFinder::xKilobyte($val);
            case 'z':
                $val = elFinder::xKilobyte($val);
            case 'e':
                $val = elFinder::xKilobyte($val);
            case 'p':
                $val = elFinder::xKilobyte($val);
            case 't':
                $val = elFinder::xKilobyte($val);
            case 'g':
                $val = elFinder::xKilobyte($val);
            case 'm':
                $val = elFinder::xKilobyte($val);
            case 'k':
                $val = elFinder::xKilobyte($val);
        }
        return $val;
    }

    /**
     * Return X 1KByte
     *
     * @param      integer|string  $val    The value
     *
     * @return     number
     */
    public static function xKilobyte($val)
    {
        if (strpos((string)$val * 1024, 'E') !== false) {
            if (strpos((string)$val * 1.024, 'E') === false) {
                $val *= 1.024;
            }
            $val .= '000';
        } else {
            $val *= 1024;
        }
        return $val;
    }

    /**
     * Get script url.
     *
     * @return string full URL
     * @author Naoki Sawada
     */
    public static function getConnectorUrl()
    {
        if (defined('ELFINDER_CONNECTOR_URL')) {
            return ELFINDER_CONNECTOR_URL;
        }

        $https = (!empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off');
        $url = ($https ? 'https://' : 'http://')
            . $_SERVER['SERVER_NAME']                                              // host
            . ((empty($_SERVER['SERVER_PORT']) || (!$https && $_SERVER['SERVER_PORT'] == 80) || ($https && $_SERVER['SERVER_PORT'] == 443)) ? '' : (':' . $_SERVER['SERVER_PORT']))  // port
            . $_SERVER['REQUEST_URI'];                                             // path & query
        list($url) = explode('?', $url);

        return $url;
    }

    /**
     * Get stream resource pointer by URL
     *
     * @param array $data array('target'=>'URL', 'headers' => array())
     * @param int   $redirectLimit
     *
     * @return resource|boolean
     * @author Naoki Sawada
     */
    public static function getStreamByUrl($data, $redirectLimit = 5)
    {
        if (isset($data['target'])) {
            $data = array(
                'cnt' => 0,
                'url' => $data['target'],
                'headers' => isset($data['headers']) ? $data['headers'] : array(),
                'postData' => isset($data['postData']) ? $data['postData'] : array(),
                'cookies' => array(),
            );
        }
        if ($data['cnt'] > $redirectLimit) {
            return false;
        }
        $dlurl = $data['url'];
        $data['url'] = '';
        $headers = $data['headers'];

        if ($dlurl) {
            $url = parse_url($dlurl);
            $ports = array(
                'http' => '80',
                'https' => '443',
                'ftp' => '21'
            );
            $url['scheme'] = strtolower($url['scheme']);
            if (!isset($url['port']) && isset($ports[$url['scheme']])) {
                $url['port'] = $ports[$url['scheme']];
            }
            if (!isset($url['port'])) {
                return false;
            }
            $cookies = array();
            if ($data['cookies']) {
                foreach ($data['cookies'] as $d => $c) {
                    if (strpos($url['host'], $d) !== false) {
                        $cookies[] = $c;
                    }
                }
            }

            $transport = ($url['scheme'] === 'https') ? 'ssl' : 'tcp';
            $query = isset($url['query']) ? '?' . $url['query'] : '';
            if (!($stream = stream_socket_client($transport . '://' . $url['host'] . ':' . $url['port']))) {
                return false;
            }

            $body = '';
            if (!empty($data['postData'])) {
                $method = 'POST';
                if (is_array($data['postData'])) {
                    $body = http_build_query($data['postData']);
                } else {
                    $body = $data['postData'];
                }
            } else {
                $method = 'GET';
            }

            $sends = array();
            $sends[] = "$method {$url['path']}{$query} HTTP/1.1";
            $sends[] = "Host: {$url['host']}";
            foreach ($headers as $header) {
                $sends[] = trim($header, "\r\n");
            }
            $sends[] = 'Connection: Close';
            if ($cookies) {
                $sends[] = 'Cookie: ' . implode('; ', $cookies);
            }
            if ($method === 'POST') {
                $sends[] = 'Content-Type: application/x-www-form-urlencoded';
                $sends[] = 'Content-Length: ' . strlen($body);
            }
            $sends[] = "\r\n" . $body;

            stream_set_timeout($stream, 300);
            fputs($stream, join("\r\n", $sends) . "\r\n");

            while (($res = trim(fgets($stream))) !== '') {
                // find redirect
                if (preg_match('/^Location: (.+)$/i', $res, $m)) {
                    $data['url'] = $m[1];
                }
                // fetch cookie
                if (strpos($res, 'Set-Cookie:') === 0) {
                    $domain = $url['host'];
                    if (preg_match('/^Set-Cookie:(.+)(?:domain=\s*([^ ;]+))?/i', $res, $c1)) {
                        if (!empty($c1[2])) {
                            $domain = trim($c1[2]);
                        }
                        if (preg_match('/([^ ]+=[^;]+)/', $c1[1], $c2)) {
                            $data['cookies'][$domain] = $c2[1];
                        }
                    }
                }
                // is seekable url
                if (preg_match('/^(Accept-Ranges|Content-Range): bytes/i', $res)) {
                    elFinder::$seekableUrlFps[(int)$stream] = true;
                }
            }
            if ($data['url']) {
                ++$data['cnt'];
                fclose($stream);

                return self::getStreamByUrl($data, $redirectLimit);
            }

            return $stream;
        }

        return false;
    }

    /**
     * Gets the fetch cookie file for curl.
     *
     * @return string  The fetch cookie file.
     */
    public function getFetchCookieFile()
    {
        $file = '';
        if ($tmpDir = $this->getTempDir()) {
            $file = $tmpDir . '/.elFinderAnonymousCookie';
        }
        return $file;
    }

    /**
     * Call curl_exec() with supported redirect on `safe_mode` or `open_basedir`
     *
     * @param resource $curl
     * @param array    $options
     * @param array    $headers
     * @param array    $postData
     *
     * @throws \Exception
     * @return mixed
     * @author Naoki Sawada
     */
    public static function curlExec($curl, $options = array(), $headers = array(), $postData = array())
    {
        $followLocation = (!ini_get('safe_mode') && !ini_get('open_basedir'));
        if ($followLocation) {
            curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
        }

        if ($options) {
            curl_setopt_array($curl, $options);
        }

        if ($headers) {
            curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
        }

        $result = curl_exec($curl);

        if (!$followLocation && $redirect = curl_getinfo($curl, CURLINFO_REDIRECT_URL)) {
            if ($stream = self::getStreamByUrl(array('target' => $redirect, 'headers' => $headers, 'postData' => $postData))) {
                $result = stream_get_contents($stream);
            }
        }

        if ($result === false) {
            if (curl_errno($curl)) {
                throw new \Exception('curl_exec() failed: ' . curl_error($curl));
            } else {
                throw new \Exception('curl_exec(): empty response');
            }
        }

        curl_close($curl);

        return $result;
    }

    /**
     * Return bool that current request was aborted by client side
     *
     * @return boolean
     */
    public static function aborted()
    {
        if ($file = self::$abortCheckFile) {
            (version_compare(PHP_VERSION, '5.3.0') >= 0) ? clearstatcache(true, $file) : clearstatcache();
            if (!is_file($file)) {
                // GC (expire 12h)
                list($ptn) = explode('elfreq', $file);
                self::GlobGC($ptn . 'elfreq*', 43200);
                return true;
            }
        }
        return false;
    }

    /**
     * Return array ["name without extention", "extention"] by filename
     *
     * @param string $name
     *
     * @return array
     */
    public static function splitFileExtention($name)
    {
        if (preg_match('/^(.+?)?\.((?:tar\.(?:gz|bz|bz2|z|lzo))|cpio\.gz|ps\.gz|xcf\.(?:gz|bz2)|[a-z0-9]{1,10})$/i', $name, $m)) {
            return array((string)$m[1], $m[2]);
        } else {
            return array($name, '');
        }
    }

    /**
     * Gets the memory size by imageinfo.
     *
     * @param      array $imgInfo array that result of getimagesize()
     *
     * @return     integer  The memory size by imageinfo.
     */
    public static function getMemorySizeByImageInfo($imgInfo)
    {
        $width = $imgInfo[0];
        $height = $imgInfo[1];
        $bits = isset($imgInfo['bits']) ? $imgInfo['bits'] : 24;
        $channels = isset($imgInfo['channels']) ? $imgInfo['channels'] : 3;
        return round(($width * $height * $bits * $channels / 8 + Pow(2, 16)) * 1.65);
    }

    /**
     * Auto expand memory for GD processing
     *
     * @param      array $imgInfos The image infos
     */
    public static function expandMemoryForGD($imgInfos)
    {
        if (elFinder::$memoryLimitGD != 0 && $imgInfos && is_array($imgInfos)) {
            if (!is_array($imgInfos[0])) {
                $imgInfos = array($imgInfos);
            }
            $limit = self::getIniBytes('', elFinder::$memoryLimitGD);
            $memLimit = self::getIniBytes('memory_limit');
            $needs = 0;
            foreach ($imgInfos as $info) {
                $needs += self::getMemorySizeByImageInfo($info);
            }
            $needs += memory_get_usage();
            if ($needs > $memLimit && ($limit == -1 || $limit > $needs)) {
                ini_set('memory_limit', $needs);
            }
        }
    }

    /**
     * Decontaminate of filename
     *
     * @param      String  $name   The name
     *
     * @return     String  Decontaminated filename
     */
    public static function filenameDecontaminate($name)
    {
        // Directory traversal defense
        if (DIRECTORY_SEPARATOR === '\\') {
            $name = str_replace('\\', '/', $name);
        }
        $parts = explode('/', trim($name, '/'));
        $name = array_pop($parts); 
        return $name;
    }

    /**
     * Execute shell command
     *
     * @param  string $command      command line
     * @param  string $output       stdout strings
     * @param  int    $return_var   process exit code
     * @param  string $error_output stderr strings
     * @param  null   $cwd          cwd
     *
     * @return int exit code
     * @throws elFinderAbortException
     * @author Alexey Sukhotin
     */
    public static function procExec($command, &$output = '', &$return_var = -1, &$error_output = '', $cwd = null)
    {

        static $allowed = null;

        if ($allowed === null) {
            if ($allowed = function_exists('proc_open')) {
                if ($disabled = ini_get('disable_functions')) {
                    $funcs = array_map('trim', explode(',', $disabled));
                    $allowed = !in_array('proc_open', $funcs);
                }
            }
        }

        if (!$allowed) {
            $return_var = -1;
            return $return_var;
        }

        if (!$command) {
            $return_var = 0;
            return $return_var;
        }

        $descriptorspec = array(
            0 => array("pipe", "r"),  // stdin
            1 => array("pipe", "w"),  // stdout
            2 => array("pipe", "w")   // stderr
        );

        $process = proc_open($command, $descriptorspec, $pipes, $cwd, null);

        if (is_resource($process)) {
            stream_set_blocking($pipes[1], 0);
            stream_set_blocking($pipes[2], 0);

            fclose($pipes[0]);

            $tmpout = '';
            $tmperr = '';
            while (feof($pipes[1]) === false || feof($pipes[2]) === false) {
                elFinder::extendTimeLimit();
                $read = array($pipes[1], $pipes[2]);
                $write = null;
                $except = null;
                $ret = stream_select($read, $write, $except, 1);
                if ($ret === false) {
                    // error
                    break;
                } else if ($ret === 0) {
                    // timeout
                    continue;
                } else {
                    foreach ($read as $sock) {
                        if ($sock === $pipes[1]) {
                            $tmpout .= fread($sock, 4096);
                        } else if ($sock === $pipes[2]) {
                            $tmperr .= fread($sock, 4096);
                        }
                    }
                }
            }

            fclose($pipes[1]);
            fclose($pipes[2]);

            $output = $tmpout;
            $error_output = $tmperr;
            $return_var = proc_close($process);

        } else {
            $return_var = -1;
        }

        return $return_var;

    }

    /***************************************************************************/
    /*                                 callbacks                               */
    /***************************************************************************/

    /**
     * Get command name of binded "commandName.subName"
     *
     * @param string $cmd
     *
     * @return string
     */
    protected static function getCmdOfBind($cmd)
    {
        list($ret) = explode('.', $cmd);
        return trim($ret);
    }

    /**
     * Add subName to commandName
     *
     * @param string $cmd
     * @param string $sub
     *
     * @return string
     */
    protected static function addSubToBindName($cmd, $sub)
    {
        return $cmd . '.' . trim($sub);
    }

    /**
     * Remove a file if connection is disconnected
     *
     * @param string $file
     */
    public static function rmFileInDisconnected($file)
    {
        (connection_aborted() || connection_status() !== CONNECTION_NORMAL) && is_file($file) && unlink($file);
    }

    /**
     * Call back function on shutdown
     *  - delete files in $GLOBALS['elFinderTempFiles']
     */
    public static function onShutdown()
    {
        self::$abortCheckFile = null;
        if (!empty($GLOBALS['elFinderTempFps'])) {
            foreach (array_keys($GLOBALS['elFinderTempFps']) as $fp) {
                is_resource($fp) && fclose($fp);
            }
        }
        if (!empty($GLOBALS['elFinderTempFiles'])) {
            foreach (array_keys($GLOBALS['elFinderTempFiles']) as $f) {
                is_file($f) && is_writable($f) && unlink($f);
            }
        }
    }

    /**
     * Garbage collection with glob
     *
     * @param string  $pattern
     * @param integer $time
     */
    public static function GlobGC($pattern, $time)
    {
        $now = time();
        foreach (glob($pattern) as $file) {
            (filemtime($file) < ($now - $time)) && unlink($file);
        }
    }

} // END class

/**
 * Custom exception class for aborting request
 */
class elFinderAbortException extends Exception
{
}

class elFinderTriggerException extends Exception
{
}
php/elFinderVolumeTrashMySQL.class.php000064400000003050151215013420013750 0ustar00<?php

/**
 * elFinder driver for trash bin at MySQL Database
 *
 * @author NaokiSawada
 **/
class elFinderVolumeTrashMySQL extends elFinderVolumeMySQL
{
    /**
     * Driver id
     * Must be started from letter and contains [a-z0-9]
     * Used as part of volume id.
     *
     * @var string
     **/
    protected $driverId = 'tm';

    public function __construct()
    {
        parent::__construct();
        // original option of the Trash
        $this->options['lockEverything'] = false; // Lock all items in the trash to disable delete, move, rename.

        // common options as the volume driver
        $this->options['alias'] = 'Trash';
        $this->options['quarantine'] = '';
        $this->options['rootCssClass'] = 'elfinder-navbar-root-trash';
        $this->options['copyOverwrite'] = false;
        $this->options['uiCmdMap'] = array('paste' => 'hidden', 'mkdir' => 'hidden', 'copy' => 'restore');
        $this->options['disabled'] = array('archive', 'duplicate', 'edit', 'extract', 'mkfile', 'places', 'put', 'rename', 'resize', 'upload');
    }

    public function mount(array $opts)
    {
        if ($this->options['lockEverything']) {
            if (!is_array($opts['attributes'])) {
                $opts['attributes'] = array();
            }
            $attr = array(
                'pattern' => '/./',
                'locked' => true,
            );
            array_unshift($opts['attributes'], $attr);
        }
        // force set `copyJoin` to true
        $opts['copyJoin'] = true;

        return parent::mount($opts);
    }
}
php/elFinderSessionInterface.php000064400000002106151215013420012752 0ustar00<?php

/**
 * elFinder - file manager for web.
 * Session Wrapper Interface.
 *
 * @package elfinder
 * @author  Naoki Sawada
 **/

interface elFinderSessionInterface
{
    /**
     * Session start
     *
     * @return  self
     **/
    public function start();

    /**
     * Session write & close
     *
     * @return  self
     **/
    public function close();

    /**
     * Get session data
     * This method must be equipped with an automatic start / close.
     *
     * @param   string $key   Target key
     * @param   mixed  $empty Return value of if session target key does not exist
     *
     * @return  mixed
     **/
    public function get($key, $empty = '');

    /**
     * Set session data
     * This method must be equipped with an automatic start / close.
     *
     * @param   string $key  Target key
     * @param   mixed  $data Value
     *
     * @return  self
     **/
    public function set($key, $data);

    /**
     * Get session data
     *
     * @param   string $key Target key
     *
     * @return  self
     **/
    public function remove($key);
}
php/elFinderVolumeLocalFileSystem.class.php000064400000136366151215013420015061 0ustar00<?php

// Implement similar functionality in PHP 5.2 or 5.3
// http://php.net/manual/class.recursivecallbackfilteriterator.php#110974
if (!class_exists('RecursiveCallbackFilterIterator', false)) {
    class RecursiveCallbackFilterIterator extends RecursiveFilterIterator
    {
        private $callback;

        public function __construct(RecursiveIterator $iterator, $callback)
        {
            $this->callback = $callback;
            parent::__construct($iterator);
        }

        public function accept()
        {
            return call_user_func($this->callback, parent::current(), parent::key(), parent::getInnerIterator());
        }

        public function getChildren()
        {
            return new self($this->getInnerIterator()->getChildren(), $this->callback);
        }
    }
}

/**
 * elFinder driver for local filesystem.
 *
 * @author Dmitry (dio) Levashov
 * @author Troex Nevelin
 **/
class elFinderVolumeLocalFileSystem extends elFinderVolumeDriver
{

    /**
     * Driver id
     * Must be started from letter and contains [a-z0-9]
     * Used as part of volume id
     *
     * @var string
     **/
    protected $driverId = 'l';

    /**
     * Required to count total archive files size
     *
     * @var int
     **/
    protected $archiveSize = 0;

    /**
     * Is checking stat owner
     *
     * @var        boolean
     */
    protected $statOwner = false;

    /**
     * Path to quarantine directory
     *
     * @var string
     */
    private $quarantine;

    /**
     * Constructor
     * Extend options with required fields
     *
     * @author Dmitry (dio) Levashov
     */
    public function __construct()
    {
        $this->options['alias'] = '';              // alias to replace root dir name
        $this->options['dirMode'] = 0755;            // new dirs mode
        $this->options['fileMode'] = 0644;            // new files mode
        $this->options['rootCssClass'] = 'elfinder-navbar-root-local';
        $this->options['followSymLinks'] = true;
        $this->options['detectDirIcon'] = '';         // file name that is detected as a folder icon e.g. '.diricon.png'
        $this->options['keepTimestamp'] = array('copy', 'move'); // keep timestamp at inner filesystem allowed 'copy', 'move' and 'upload'
        $this->options['substituteImg'] = true;       // support substitute image with dim command
        $this->options['statCorrector'] = null;       // callable to correct stat data `function(&$stat, $path, $statOwner, $volumeDriveInstance){}`
        if (DIRECTORY_SEPARATOR === '/') {
            // Linux
            $this->options['acceptedName'] = '/^[^\.\/\x00][^\/\x00]*$/';
        } else {
            // Windows
            $this->options['acceptedName'] = '/^[^\.\/\x00\\\:*?"<>|][^\/\x00\\\:*?"<>|]*$/';
        }
    }

    /*********************************************************************/
    /*                        INIT AND CONFIGURE                         */
    /*********************************************************************/

    /**
     * Prepare driver before mount volume.
     * Return true if volume is ready.
     *
     * @return bool
     **/
    protected function init()
    {
        // Normalize directory separator for windows
        if (DIRECTORY_SEPARATOR !== '/') {
            foreach (array('path', 'tmbPath', 'tmpPath', 'quarantine') as $key) {
                if (!empty($this->options[$key])) {
                    $this->options[$key] = str_replace('/', DIRECTORY_SEPARATOR, $this->options[$key]);
                }
            }
            // PHP >= 7.1 Supports UTF-8 path on Windows
            if (version_compare(PHP_VERSION, '7.1', '>=')) {
                $this->options['encoding'] = '';
                $this->options['locale'] = '';
            }
        }
        if (!$cwd = getcwd()) {
            return $this->setError('elFinder LocalVolumeDriver requires a result of getcwd().');
        }
        // detect systemRoot
        if (!isset($this->options['systemRoot'])) {
            if ($cwd[0] === DIRECTORY_SEPARATOR || $this->root[0] === DIRECTORY_SEPARATOR) {
                $this->systemRoot = DIRECTORY_SEPARATOR;
            } else if (preg_match('/^([a-zA-Z]:' . preg_quote(DIRECTORY_SEPARATOR, '/') . ')/', $this->root, $m)) {
                $this->systemRoot = $m[1];
            } else if (preg_match('/^([a-zA-Z]:' . preg_quote(DIRECTORY_SEPARATOR, '/') . ')/', $cwd, $m)) {
                $this->systemRoot = $m[1];
            }
        }
        $this->root = $this->getFullPath($this->root, $cwd);
        if (!empty($this->options['startPath'])) {
            $this->options['startPath'] = $this->getFullPath($this->options['startPath'], $this->root);
        }

        if (is_null($this->options['syncChkAsTs'])) {
            $this->options['syncChkAsTs'] = true;
        }
        if (is_null($this->options['syncCheckFunc'])) {
            $this->options['syncCheckFunc'] = array($this, 'localFileSystemInotify');
        }
        // check 'statCorrector'
        if (empty($this->options['statCorrector']) || !is_callable($this->options['statCorrector'])) {
            $this->options['statCorrector'] = null;
        }

        return true;
    }

    /**
     * Configure after successfull mount.
     *
     * @return void
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function configure()
    {
        $hiddens = array();
        $root = $this->stat($this->root);

        // check thumbnails path
        if (!empty($this->options['tmbPath'])) {
            if (strpos($this->options['tmbPath'], DIRECTORY_SEPARATOR) === false) {
                $hiddens['tmb'] = $this->options['tmbPath'];
                $this->options['tmbPath'] = $this->_abspath($this->options['tmbPath']);
            } else {
                $this->options['tmbPath'] = $this->_normpath($this->options['tmbPath']);
            }
        }
        // check temp path
        if (!empty($this->options['tmpPath'])) {
            if (strpos($this->options['tmpPath'], DIRECTORY_SEPARATOR) === false) {
                $hiddens['temp'] = $this->options['tmpPath'];
                $this->options['tmpPath'] = $this->_abspath($this->options['tmpPath']);
            } else {
                $this->options['tmpPath'] = $this->_normpath($this->options['tmpPath']);
            }
        }
        // check quarantine path
        $_quarantine = '';
        if (!empty($this->options['quarantine'])) {
            if (strpos($this->options['quarantine'], DIRECTORY_SEPARATOR) === false) {
                $_quarantine = $this->_abspath($this->options['quarantine']);
                $this->options['quarantine'] = '';
            } else {
                $this->options['quarantine'] = $this->_normpath($this->options['quarantine']);
            }
        } else {
            $_quarantine = $this->_abspath('.quarantine');
        }
        is_dir($_quarantine) && self::localRmdirRecursive($_quarantine);

        parent::configure();

        // check tmbPath
        if (!$this->tmbPath && isset($hiddens['tmb'])) {
            unset($hiddens['tmb']);
        }

        // if no thumbnails url - try detect it
        if ($root['read'] && !$this->tmbURL && $this->URL) {
            if (strpos($this->tmbPath, $this->root) === 0) {
                $this->tmbURL = $this->URL . str_replace(DIRECTORY_SEPARATOR, '/', substr($this->tmbPath, strlen($this->root) + 1));
                if (preg_match("|[^/?&=]$|", $this->tmbURL)) {
                    $this->tmbURL .= '/';
                }
            }
        }

        // set $this->tmp by options['tmpPath']
        $this->tmp = '';
        if (!empty($this->options['tmpPath'])) {
            if ((is_dir($this->options['tmpPath']) || mkdir($this->options['tmpPath'], $this->options['dirMode'], true)) && is_writable($this->options['tmpPath'])) {
                $this->tmp = $this->options['tmpPath'];
            } else {
                if (isset($hiddens['temp'])) {
                    unset($hiddens['temp']);
                }
            }
        }
        if (!$this->tmp && ($tmp = elFinder::getStaticVar('commonTempPath'))) {
            $this->tmp = $tmp;
        }

        // check quarantine dir
        $this->quarantine = '';
        if (!empty($this->options['quarantine'])) {
            if ((is_dir($this->options['quarantine']) || mkdir($this->options['quarantine'], $this->options['dirMode'], true)) && is_writable($this->options['quarantine'])) {
                $this->quarantine = $this->options['quarantine'];
            } else {
                if (isset($hiddens['quarantine'])) {
                    unset($hiddens['quarantine']);
                }
            }
        } else if ($_path = elFinder::getCommonTempPath()) {
            $this->quarantine = $_path;
        }

        if (!$this->quarantine) {
            if (!$this->tmp) {
                $this->archivers['extract'] = array();
                $this->disabled[] = 'extract';
            } else {
                $this->quarantine = $this->tmp;
            }
        }

        if ($hiddens) {
            foreach ($hiddens as $hidden) {
                $this->attributes[] = array(
                    'pattern' => '~^' . preg_quote(DIRECTORY_SEPARATOR . $hidden, '~') . '$~',
                    'read' => false,
                    'write' => false,
                    'locked' => true,
                    'hidden' => true
                );
            }
        }

        if (!empty($this->options['keepTimestamp'])) {
            $this->options['keepTimestamp'] = array_flip($this->options['keepTimestamp']);
        }

        $this->statOwner = (!empty($this->options['statOwner']));

        // enable WinRemoveTailDots plugin on Windows server
        if (DIRECTORY_SEPARATOR !== '/') {
            if (!isset($this->options['plugin'])) {
                $this->options['plugin'] = array();
            }
            $this->options['plugin']['WinRemoveTailDots'] = array('enable' => true);
        }
    }

    /**
     * Long pooling sync checker
     * This function require server command `inotifywait`
     * If `inotifywait` need full path, Please add `define('ELFINER_INOTIFYWAIT_PATH', '/PATH_TO/inotifywait');` into connector.php
     *
     * @param string $path
     * @param int    $standby
     * @param number $compare
     *
     * @return number|bool
     * @throws elFinderAbortException
     */
    public function localFileSystemInotify($path, $standby, $compare)
    {
        if (isset($this->sessionCache['localFileSystemInotify_disable'])) {
            return false;
        }
        $path = realpath($path);
        $mtime = filemtime($path);
        if (!$mtime) {
            return false;
        }
        if ($mtime != $compare) {
            return $mtime;
        }
        $inotifywait = defined('ELFINER_INOTIFYWAIT_PATH') ? ELFINER_INOTIFYWAIT_PATH : 'inotifywait';
        $standby = max(1, intval($standby));
        $cmd = $inotifywait . ' ' . escapeshellarg($path) . ' -t ' . $standby . ' -e moved_to,moved_from,move,close_write,delete,delete_self';
        $this->procExec($cmd, $o, $r);
        if ($r === 0) {
            // changed
            clearstatcache();
            if (file_exists($path)) {
                $mtime = filemtime($path); // error on busy?
                return $mtime ? $mtime : time();
            } else {
                // target was removed
                return 0;
            }
        } else if ($r === 2) {
            // not changed (timeout)
            return $compare;
        }
        // error
        // cache to $_SESSION
        $this->sessionCache['localFileSystemInotify_disable'] = true;
        $this->session->set($this->id, $this->sessionCache);
        return false;
    }

    /*********************************************************************/
    /*                               FS API                              */
    /*********************************************************************/

    /*********************** paths/urls *************************/

    /**
     * Return parent directory path
     *
     * @param  string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _dirname($path)
    {
        return dirname($path);
    }

    /**
     * Return file name
     *
     * @param  string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _basename($path)
    {
        return basename($path);
    }

    /**
     * Join dir name and file name and retur full path
     *
     * @param  string $dir
     * @param  string $name
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _joinPath($dir, $name)
    {
        $dir = rtrim($dir, DIRECTORY_SEPARATOR);
        $path = realpath($dir . DIRECTORY_SEPARATOR . $name);
        // realpath() returns FALSE if the file does not exist
        if ($path === false || strpos($path, $this->root) !== 0) {
            if (DIRECTORY_SEPARATOR !== '/') {
                $dir = str_replace('/', DIRECTORY_SEPARATOR, $dir);
                $name = str_replace('/', DIRECTORY_SEPARATOR, $name);
            }
            // Directory traversal measures
            if (strpos($dir, '..' . DIRECTORY_SEPARATOR) !== false || substr($dir, -2) == '..') {
                $dir = $this->root;
            }
            if (strpos($name, '..' . DIRECTORY_SEPARATOR) !== false) {
                $name = basename($name);
            }
            $path = $dir . DIRECTORY_SEPARATOR . $name;
        }
        return $path; 
    }

    /**
     * Return normalized path, this works the same as os.path.normpath() in Python
     *
     * @param  string $path path
     *
     * @return string
     * @author Troex Nevelin
     **/
    protected function _normpath($path)
    {
        if (empty($path)) {
            return '.';
        }

        $changeSep = (DIRECTORY_SEPARATOR !== '/');
        if ($changeSep) {
            $drive = '';
            if (preg_match('/^([a-zA-Z]:)(.*)/', $path, $m)) {
                $drive = $m[1];
                $path = $m[2] ? $m[2] : '/';
            }
            $path = str_replace(DIRECTORY_SEPARATOR, '/', $path);
        }

        if (strpos($path, '/') === 0) {
            $initial_slashes = true;
        } else {
            $initial_slashes = false;
        }

        if (($initial_slashes)
            && (strpos($path, '//') === 0)
            && (strpos($path, '///') === false)) {
            $initial_slashes = 2;
        }

        $initial_slashes = (int)$initial_slashes;

        $comps = explode('/', $path);
        $new_comps = array();
        foreach ($comps as $comp) {
            if (in_array($comp, array('', '.'))) {
                continue;
            }

            if (($comp != '..')
                || (!$initial_slashes && !$new_comps)
                || ($new_comps && (end($new_comps) == '..'))) {
                array_push($new_comps, $comp);
            } elseif ($new_comps) {
                array_pop($new_comps);
            }
        }
        $comps = $new_comps;
        $path = implode('/', $comps);
        if ($initial_slashes) {
            $path = str_repeat('/', $initial_slashes) . $path;
        }

        if ($changeSep) {
            $path = $drive . str_replace('/', DIRECTORY_SEPARATOR, $path);
        }

        return $path ? $path : '.';
    }

    /**
     * Return file path related to root dir
     *
     * @param  string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _relpath($path)
    {
        if ($path === $this->root) {
            return '';
        } else {
            if (strpos($path, $this->root) === 0) {
                return ltrim(substr($path, strlen($this->root)), DIRECTORY_SEPARATOR);
            } else {
                // for link
                return $path;
            }
        }
    }

    /**
     * Convert path related to root dir into real path
     *
     * @param  string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _abspath($path)
    {
        if ($path === DIRECTORY_SEPARATOR) {
            return $this->root;
        } else {
            $path = $this->_normpath($path);
            if (strpos($path, $this->systemRoot) === 0) {
                return $path;
            } else if (DIRECTORY_SEPARATOR !== '/' && preg_match('/^[a-zA-Z]:' . preg_quote(DIRECTORY_SEPARATOR, '/') . '/', $path)) {
                return $path;
            } else {
                return $this->_joinPath($this->root, $path);
            }
        }
    }

    /**
     * Return fake path started from root dir
     *
     * @param  string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _path($path)
    {
        return $this->rootName . ($path == $this->root ? '' : $this->separator . $this->_relpath($path));
    }

    /**
     * Return true if $path is children of $parent
     *
     * @param  string $path   path to check
     * @param  string $parent parent path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _inpath($path, $parent)
    {
        $cwd = getcwd();
        $real_path = $this->getFullPath($path, $cwd);
        $real_parent = $this->getFullPath($parent, $cwd);
        if ($real_path && $real_parent) {
            return $real_path === $real_parent || strpos($real_path, rtrim($real_parent, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR) === 0;
        }
        return false;
    }



    /***************** file stat ********************/

    /**
     * Return stat for given path.
     * Stat contains following fields:
     * - (int)    size    file size in b. required
     * - (int)    ts      file modification time in unix time. required
     * - (string) mime    mimetype. required for folders, others - optionally
     * - (bool)   read    read permissions. required
     * - (bool)   write   write permissions. required
     * - (bool)   locked  is object locked. optionally
     * - (bool)   hidden  is object hidden. optionally
     * - (string) alias   for symlinks - link target path relative to root path. optionally
     * - (string) target  for symlinks - link target path. optionally
     * If file does not exists - returns empty array or false.
     *
     * @param  string $path file path
     *
     * @return array|false
     * @author Dmitry (dio) Levashov
     **/
    protected function _stat($path)
    {
        $stat = array();

        if (!file_exists($path) && !is_link($path)) {
            return $stat;
        }

        //Verifies the given path is the root or is inside the root. Prevents directory traveral.
        if (!$this->_inpath($path, $this->root)) {
            return $stat;
        }

        $stat['isowner'] = false;
        $linkreadable = false;
        if ($path != $this->root && is_link($path)) {
            if (!$this->options['followSymLinks']) {
                return array();
            }
            if (!($target = $this->readlink($path))
                || $target == $path) {
                if (is_null($target)) {
                    $stat = array();
                    return $stat;
                } else {
                    $stat['mime'] = 'symlink-broken';
                    $target = readlink($path);
                    $lstat = lstat($path);
                    $ostat = $this->getOwnerStat($lstat['uid'], $lstat['gid']);
                    $linkreadable = !empty($ostat['isowner']);
                }
            }
            $stat['alias'] = $this->_path($target);
            $stat['target'] = $target;
        }

        $readable = is_readable($path);

        if ($readable) {
            $size = sprintf('%u', filesize($path));
            $stat['ts'] = filemtime($path);
            if ($this->statOwner) {
                $fstat = stat($path);
                $uid = $fstat['uid'];
                $gid = $fstat['gid'];
                $stat['perm'] = substr((string)decoct($fstat['mode']), -4);
                $stat = array_merge($stat, $this->getOwnerStat($uid, $gid));
            }
        }

        if (($dir = is_dir($path)) && $this->options['detectDirIcon']) {
            $favicon = $path . DIRECTORY_SEPARATOR . $this->options['detectDirIcon'];
            if ($this->URL && file_exists($favicon)) {
                $stat['icon'] = $this->URL . str_replace(DIRECTORY_SEPARATOR, '/', substr($favicon, strlen($this->root) + 1));
            }
        }

        if (!isset($stat['mime'])) {
            $stat['mime'] = $dir ? 'directory' : $this->mimetype($path);
        }
        //logical rights first
        $stat['read'] = ($linkreadable || $readable) ? null : false;
        $stat['write'] = is_writable($path) ? null : false;

        if (is_null($stat['read'])) {
            if ($dir) {
                $stat['size'] = 0;
            } else if (isset($size)) {
                $stat['size'] = $size;
            }
        }

        if ($this->options['statCorrector']) {
            call_user_func_array($this->options['statCorrector'], array(&$stat, $path, $this->statOwner, $this));
        }

        return $stat;
    }

    /**
     * Get stat `owner`, `group` and `isowner` by `uid` and `gid`
     * Sub-fuction of _stat() and _scandir()
     *
     * @param integer $uid
     * @param integer $gid
     *
     * @return array  stat
     */
    protected function getOwnerStat($uid, $gid)
    {
        static $names = null;
        static $phpuid = null;

        if (is_null($names)) {
            $names = array('uid' => array(), 'gid' => array());
        }
        if (is_null($phpuid)) {
            if (is_callable('posix_getuid')) {
                $phpuid = posix_getuid();
            } else {
                $phpuid = 0;
            }
        }

        $stat = array();

        if ($uid) {
            $stat['isowner'] = ($phpuid == $uid);
            if (isset($names['uid'][$uid])) {
                $stat['owner'] = $names['uid'][$uid];
            } else if (is_callable('posix_getpwuid')) {
                $pwuid = posix_getpwuid($uid);
                $stat['owner'] = $names['uid'][$uid] = $pwuid['name'];
            } else {
                $stat['owner'] = $names['uid'][$uid] = $uid;
            }
        }
        if ($gid) {
            if (isset($names['gid'][$gid])) {
                $stat['group'] = $names['gid'][$gid];
            } else if (is_callable('posix_getgrgid')) {
                $grgid = posix_getgrgid($gid);
                $stat['group'] = $names['gid'][$gid] = $grgid['name'];
            } else {
                $stat['group'] = $names['gid'][$gid] = $gid;
            }
        }

        return $stat;
    }

    /**
     * Return true if path is dir and has at least one childs directory
     *
     * @param  string $path dir path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _subdirs($path)
    {

        $dirs = false;
        if (is_dir($path) && is_readable($path)) {
            if (class_exists('FilesystemIterator', false)) {
                $dirItr = new ParentIterator(
                    new RecursiveDirectoryIterator($path,
                        FilesystemIterator::SKIP_DOTS |
                        FilesystemIterator::CURRENT_AS_SELF |
                        (defined('RecursiveDirectoryIterator::FOLLOW_SYMLINKS') ?
                            RecursiveDirectoryIterator::FOLLOW_SYMLINKS : 0)
                    )
                );
                $dirItr->rewind();
                if ($dirItr->hasChildren()) {
                    $dirs = true;
                    $name = $dirItr->getSubPathName();
                    while ($dirItr->valid()) {
                        if (!$this->attr($path . DIRECTORY_SEPARATOR . $name, 'read', null, true)) {
                            $dirs = false;
                            $dirItr->next();
                            $name = $dirItr->getSubPathName();
                            continue;
                        }
                        $dirs = true;
                        break;
                    }
                }
            } else {
                $path = strtr($path, array('[' => '\\[', ']' => '\\]', '*' => '\\*', '?' => '\\?'));
                return (bool)glob(rtrim($path, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . '*', GLOB_ONLYDIR);
            }
        }
        return $dirs;
    }

    /**
     * Return object width and height
     * Usualy used for images, but can be realize for video etc...
     *
     * @param  string $path file path
     * @param  string $mime file mime type
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _dimensions($path, $mime)
    {
        clearstatcache();
        return strpos($mime, 'image') === 0 && is_readable($path) && filesize($path) && ($s = getimagesize($path)) !== false
            ? $s[0] . 'x' . $s[1]
            : false;
    }
    /******************** file/dir content *********************/

    /**
     * Return symlink target file
     *
     * @param  string $path link path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function readlink($path)
    {
        if (!($target = readlink($path))) {
            return null;
        }

        if (strpos($target, $this->systemRoot) !== 0) {
            $target = $this->_joinPath(dirname($path), $target);
        }

        if (!file_exists($target)) {
            return false;
        }

        return $target;
    }

    /**
     * Return files list in directory.
     *
     * @param  string $path dir path
     *
     * @return array
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function _scandir($path)
    {
        elFinder::checkAborted();
        $files = array();
        $cache = array();
        $dirWritable = is_writable($path);
        $dirItr = array();
        $followSymLinks = $this->options['followSymLinks'];
        try {
            $dirItr = new DirectoryIterator($path);
        } catch (UnexpectedValueException $e) {
        }

        foreach ($dirItr as $file) {
            try {
                if ($file->isDot()) {
                    continue;
                }

                $files[] = $fpath = $file->getPathname();

                $br = false;
                $stat = array();

                $stat['isowner'] = false;
                $linkreadable = false;
                if ($file->isLink()) {
                    if (!$followSymLinks) {
                        continue;
                    }
                    if (!($target = $this->readlink($fpath))
                        || $target == $fpath) {
                        if (is_null($target)) {
                            $stat = array();
                            $br = true;
                        } else {
                            $_path = $fpath;
                            $stat['mime'] = 'symlink-broken';
                            $target = readlink($_path);
                            $lstat = lstat($_path);
                            $ostat = $this->getOwnerStat($lstat['uid'], $lstat['gid']);
                            $linkreadable = !empty($ostat['isowner']);
                            $dir = false;
                            $stat['alias'] = $this->_path($target);
                            $stat['target'] = $target;
                        }
                    } else {
                        $dir = is_dir($target);
                        $stat['alias'] = $this->_path($target);
                        $stat['target'] = $target;
                        $stat['mime'] = $dir ? 'directory' : $this->mimetype($stat['alias']);
                    }
                } else {
                    if (($dir = $file->isDir()) && $this->options['detectDirIcon']) {
                        $path = $file->getPathname();
                        $favicon = $path . DIRECTORY_SEPARATOR . $this->options['detectDirIcon'];
                        if ($this->URL && file_exists($favicon)) {
                            $stat['icon'] = $this->URL . str_replace(DIRECTORY_SEPARATOR, '/', substr($favicon, strlen($this->root) + 1));
                        }
                    }
                    $stat['mime'] = $dir ? 'directory' : $this->mimetype($fpath);
                }
                $size = sprintf('%u', $file->getSize());
                $stat['ts'] = $file->getMTime();
                if (!$br) {
                    if ($this->statOwner && !$linkreadable) {
                        $uid = $file->getOwner();
                        $gid = $file->getGroup();
                        $stat['perm'] = substr((string)decoct($file->getPerms()), -4);
                        $stat = array_merge($stat, $this->getOwnerStat($uid, $gid));
                    }

                    //logical rights first
                    $stat['read'] = ($linkreadable || $file->isReadable()) ? null : false;
                    $stat['write'] = $file->isWritable() ? null : false;
                    $stat['locked'] = $dirWritable ? null : true;

                    if (is_null($stat['read'])) {
                        $stat['size'] = $dir ? 0 : $size;
                    }

                    if ($this->options['statCorrector']) {
                        call_user_func_array($this->options['statCorrector'], array(&$stat, $fpath, $this->statOwner, $this));
                    }
                }

                $cache[] = array($fpath, $stat);
            } catch (RuntimeException $e) {
                continue;
            }
        }

        if ($cache) {
            $cache = $this->convEncOut($cache, false);
            foreach ($cache as $d) {
                $this->updateCache($d[0], $d[1]);
            }
        }

        return $files;
    }

    /**
     * Open file and return file pointer
     *
     * @param  string $path file path
     * @param string  $mode
     *
     * @return false|resource
     * @internal param bool $write open file for writing
     * @author   Dmitry (dio) Levashov
     */
    protected function _fopen($path, $mode = 'rb')
    {
        return fopen($path, $mode);
    }

    /**
     * Close opened file
     *
     * @param  resource $fp file pointer
     * @param string    $path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     */
    protected function _fclose($fp, $path = '')
    {
        return (is_resource($fp) && fclose($fp));
    }

    /********************  file/dir manipulations *************************/

    /**
     * Create dir and return created dir path or false on failed
     *
     * @param  string $path parent dir path
     * @param string  $name new directory name
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _mkdir($path, $name)
    {
        $path = $this->_joinPath($path, $name);

        if (mkdir($path)) {
            chmod($path, $this->options['dirMode']);
            return $path;
        }

        return false;
    }

    /**
     * Create file and return it's path or false on failed
     *
     * @param  string $path parent dir path
     * @param string  $name new file name
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _mkfile($path, $name)
    {
        $path = $this->_joinPath($path, $name);

        if (($fp = fopen($path, 'w'))) {
            fclose($fp);
            chmod($path, $this->options['fileMode']);
            return $path;
        }
        return false;
    }

    /**
     * Create symlink
     *
     * @param  string $source    file to link to
     * @param  string $targetDir folder to create link in
     * @param  string $name      symlink name
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _symlink($source, $targetDir, $name)
    {
        return $this->localFileSystemSymlink($source, $this->_joinPath($targetDir, $name));
    }

    /**
     * Copy file into another file
     *
     * @param  string $source    source file path
     * @param  string $targetDir target directory path
     * @param  string $name      new file name
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _copy($source, $targetDir, $name)
    {
        $mtime = filemtime($source);
        $target = $this->_joinPath($targetDir, $name);
        if ($ret = copy($source, $target)) {
            isset($this->options['keepTimestamp']['copy']) && $mtime && touch($target, $mtime);
        }
        return $ret;
    }

    /**
     * Move file into another parent dir.
     * Return new file path or false.
     *
     * @param  string $source source file path
     * @param         $targetDir
     * @param  string $name   file name
     *
     * @return bool|string
     * @internal param string $target target dir path
     * @author   Dmitry (dio) Levashov
     */
    protected function _move($source, $targetDir, $name)
    {
        $mtime = filemtime($source);
        $target = $this->_joinPath($targetDir, $name);
        if ($ret = rename($source, $target) ? $target : false) {
            isset($this->options['keepTimestamp']['move']) && $mtime && touch($target, $mtime);
        }
        return $ret;
    }

    /**
     * Remove file
     *
     * @param  string $path file path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _unlink($path)
    {
        return is_file($path) && unlink($path);
    }

    /**
     * Remove dir
     *
     * @param  string $path dir path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _rmdir($path)
    {
        return rmdir($path);
    }

    /**
     * Create new file and write into it from file pointer.
     * Return new file path or false on error.
     *
     * @param  resource $fp   file pointer
     * @param  string   $dir  target dir path
     * @param  string   $name file name
     * @param  array    $stat file stat (required by some virtual fs)
     *
     * @return bool|string
     * @author Dmitry (dio) Levashov
     **/
    protected function _save($fp, $dir, $name, $stat)
    {
        $path = $this->_joinPath($dir, $name);

        $meta = stream_get_meta_data($fp);
        $uri = isset($meta['uri']) ? $meta['uri'] : '';
        if ($uri && !preg_match('#^[a-zA-Z0-9]+://#', $uri) && !is_link($uri)) {
            fclose($fp);
            $mtime = filemtime($uri);
            $isCmdPaste = ($this->ARGS['cmd'] === 'paste');
            $isCmdCopy = ($isCmdPaste && empty($this->ARGS['cut']));
            if (($isCmdCopy || !rename($uri, $path)) && !copy($uri, $path)) {
                return false;
            }
            // keep timestamp on upload
            if ($mtime && $this->ARGS['cmd'] === 'upload') {
                touch($path, isset($this->options['keepTimestamp']['upload']) ? $mtime : time());
            }
        } else {
            if (file_put_contents($path, $fp, LOCK_EX) === false) {
                return false;
            }
        }

        chmod($path, $this->options['fileMode']);
        return $path;
    }

    /**
     * Get file contents
     *
     * @param  string $path file path
     *
     * @return string|false
     * @author Dmitry (dio) Levashov
     **/
    protected function _getContents($path)
    {
        return file_get_contents($path);
    }

    /**
     * Write a string to a file
     *
     * @param  string $path    file path
     * @param  string $content new file content
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _filePutContents($path, $content)
    {
        return (file_put_contents($path, $content, LOCK_EX) !== false);
    }

    /**
     * Detect available archivers
     *
     * @return void
     * @throws elFinderAbortException
     */
    protected function _checkArchivers()
    {
        $this->archivers = $this->getArchivers();
        return;
    }

    /**
     * chmod availability
     *
     * @param string $path
     * @param string $mode
     *
     * @return bool
     */
    protected function _chmod($path, $mode)
    {
        $modeOct = is_string($mode) ? octdec($mode) : octdec(sprintf("%04o", $mode));
        return chmod($path, $modeOct);
    }

    /**
     * Recursive symlinks search
     *
     * @param  string $path file/dir path
     *
     * @return bool
     * @throws Exception
     * @author Dmitry (dio) Levashov
     */
    protected function _findSymlinks($path)
    {
        return self::localFindSymlinks($path);
    }

    /**
     * Extract files from archive
     *
     * @param  string $path archive path
     * @param  array  $arc  archiver command and arguments (same as in $this->archivers)
     *
     * @return array|string|boolean
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov,
     * @author Alexey Sukhotin
     */
    protected function _extract($path, $arc)
    {

        if ($this->quarantine) {

            $dir = $this->quarantine . DIRECTORY_SEPARATOR . md5(basename($path) . mt_rand());
            $archive = (isset($arc['toSpec']) || $arc['cmd'] === 'phpfunction') ? '' : $dir . DIRECTORY_SEPARATOR . basename($path);

            if (!mkdir($dir)) {
                return false;
            }

            // insurance unexpected shutdown
            register_shutdown_function(array($this, 'rmdirRecursive'), realpath($dir));

            chmod($dir, 0777);

            // copy in quarantine
            if (!is_readable($path) || ($archive && !copy($path, $archive))) {
                return false;
            }

            // extract in quarantine
            try {
                $this->unpackArchive($path, $arc, $archive ? true : $dir);
            } catch(Exception $e) {
                return $this->setError($e->getMessage());
            }

            // get files list
            try {
                $ls = self::localScandir($dir);
            } catch (Exception $e) {
                return false;
            }

            // no files - extract error ?
            if (empty($ls)) {
                return false;
            }

            $this->archiveSize = 0;

            // find symlinks and check extracted items
            $checkRes = $this->checkExtractItems($dir);
            if ($checkRes['symlinks']) {
                self::localRmdirRecursive($dir);
                return $this->setError(array_merge($this->error, array(elFinder::ERROR_ARC_SYMLINKS)));
            }
            $this->archiveSize = $checkRes['totalSize'];
            if ($checkRes['rmNames']) {
                foreach ($checkRes['rmNames'] as $name) {
                    $this->addError(elFinder::ERROR_SAVE, $name);
                }
            }

            // check max files size
            if ($this->options['maxArcFilesSize'] > 0 && $this->options['maxArcFilesSize'] < $this->archiveSize) {
                $this->delTree($dir);
                return $this->setError(elFinder::ERROR_ARC_MAXSIZE);
            }

            $extractTo = $this->extractToNewdir; // 'auto', ture or false

            // archive contains one item - extract in archive dir
            $name = '';
            $src = $dir . DIRECTORY_SEPARATOR . $ls[0];
            if (($extractTo === 'auto' || !$extractTo) && count($ls) === 1 && is_file($src)) {
                $name = $ls[0];
            } else if ($extractTo === 'auto' || $extractTo) {
                // for several files - create new directory
                // create unique name for directory
                $src = $dir;
                $splits = elFinder::splitFileExtention(basename($path));
                $name = $splits[0];
                $test = dirname($path) . DIRECTORY_SEPARATOR . $name;
                if (file_exists($test) || is_link($test)) {
                    $name = $this->uniqueName(dirname($path), $name, '-', false);
                }
            }

            if ($name !== '') {
                $result = dirname($path) . DIRECTORY_SEPARATOR . $name;

                if (!rename($src, $result)) {
                    $this->delTree($dir);
                    return false;
                }
            } else {
                $dstDir = dirname($path);
                $result = array();
                foreach ($ls as $name) {
                    $target = $dstDir . DIRECTORY_SEPARATOR . $name;
                    if (self::localMoveRecursive($dir . DIRECTORY_SEPARATOR . $name, $target, true, $this->options['copyJoin'])) {
                        $result[] = $target;
                    }
                }
                if (!$result) {
                    $this->delTree($dir);
                    return false;
                }
            }

            is_dir($dir) && $this->delTree($dir);

            return (is_array($result) || file_exists($result)) ? $result : false;
        }
        //TODO: Add return statement here
        return false;
    }

    /**
     * Create archive and return its path
     *
     * @param  string $dir   target dir
     * @param  array  $files files names list
     * @param  string $name  archive name
     * @param  array  $arc   archiver options
     *
     * @return string|bool
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov,
     * @author Alexey Sukhotin
     */
    protected function _archive($dir, $files, $name, $arc)
    {
        return $this->makeArchive($dir, $files, $name, $arc);
    }

    /******************** Over write functions *************************/

    /**
     * File path of local server side work file path
     *
     * @param  string $path
     *
     * @return string
     * @author Naoki Sawada
     */
    protected function getWorkFile($path)
    {
        return $path;
    }

    /**
     * Delete dirctory trees
     *
     * @param string $localpath path need convert encoding to server encoding
     *
     * @return boolean
     * @throws elFinderAbortException
     * @author Naoki Sawada
     */
    protected function delTree($localpath)
    {
        return $this->rmdirRecursive($localpath);
    }

    /**
     * Return fileinfo based on filename
     * For item ID based path file system
     * Please override if needed on each drivers
     *
     * @param  string $path file cache
     *
     * @return array|boolean false
     */
    protected function isNameExists($path)
    {
        $exists = file_exists($this->convEncIn($path));
        // restore locale
        $this->convEncOut();
        return $exists ? $this->stat($path) : false;
    }

    /******************** Over write (Optimized) functions *************************/

    /**
     * Recursive files search
     *
     * @param  string $path dir path
     * @param  string $q    search string
     * @param  array  $mimes
     *
     * @return array
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     * @author Naoki Sawada
     */
    protected function doSearch($path, $q, $mimes)
    {
        if (!empty($this->doSearchCurrentQuery['matchMethod']) || $this->encoding || !class_exists('FilesystemIterator', false)) {
            // has custom match method or non UTF-8, use elFinderVolumeDriver::doSearch()
            return parent::doSearch($path, $q, $mimes);
        }

        $result = array();

        $timeout = $this->options['searchTimeout'] ? $this->searchStart + $this->options['searchTimeout'] : 0;
        if ($timeout && $timeout < time()) {
            $this->setError(elFinder::ERROR_SEARCH_TIMEOUT, $this->path($this->encode($path)));
            return $result;
        }
        elFinder::extendTimeLimit($this->options['searchTimeout'] + 30);

        $match = array();
        try {
            $iterator = new RecursiveIteratorIterator(
                new RecursiveCallbackFilterIterator(
                    new RecursiveDirectoryIterator($path,
                        FilesystemIterator::KEY_AS_PATHNAME |
                        FilesystemIterator::SKIP_DOTS |
                        ((defined('RecursiveDirectoryIterator::FOLLOW_SYMLINKS') && $this->options['followSymLinks']) ?
                            RecursiveDirectoryIterator::FOLLOW_SYMLINKS : 0)
                    ),
                    array($this, 'localFileSystemSearchIteratorFilter')
                ),
                RecursiveIteratorIterator::SELF_FIRST,
                RecursiveIteratorIterator::CATCH_GET_CHILD
            );
            foreach ($iterator as $key => $node) {
                if ($timeout && ($this->error || $timeout < time())) {
                    !$this->error && $this->setError(elFinder::ERROR_SEARCH_TIMEOUT, $this->path($this->encode($node->getPath)));
                    break;
                }
                if ($node->isDir()) {
                    if ($this->stripos($node->getFilename(), $q) !== false) {
                        $match[] = $key;
                    }
                } else {
                    $match[] = $key;
                }
            }
        } catch (Exception $e) {
        }

        if ($match) {
            foreach ($match as $p) {
                if ($timeout && ($this->error || $timeout < time())) {
                    !$this->error && $this->setError(elFinder::ERROR_SEARCH_TIMEOUT, $this->path($this->encode(dirname($p))));
                    break;
                }

                $stat = $this->stat($p);

                if (!$stat) { // invalid links
                    continue;
                }

                if (!empty($stat['hidden']) || !$this->mimeAccepted($stat['mime'], $mimes)) {
                    continue;
                }

                if ((!$mimes || $stat['mime'] !== 'directory')) {
                    $stat['path'] = $this->path($stat['hash']);
                    if ($this->URL && !isset($stat['url'])) {
                        $_path = str_replace(DIRECTORY_SEPARATOR, '/', substr($p, strlen($this->root) + 1));
                        $stat['url'] = $this->URL . str_replace('%2F', '/', rawurlencode($_path));
                    }

                    $result[] = $stat;
                }
            }
        }

        return $result;
    }

    /******************** Original local functions ************************
     *
     * @param $file
     * @param $key
     * @param $iterator
     *
     * @return bool
     */

    public function localFileSystemSearchIteratorFilter($file, $key, $iterator)
    {
        /* @var FilesystemIterator $file */
        /* @var RecursiveDirectoryIterator $iterator */
        $name = $file->getFilename();
        if ($this->doSearchCurrentQuery['excludes']) {
            foreach ($this->doSearchCurrentQuery['excludes'] as $exclude) {
                if ($this->stripos($name, $exclude) !== false) {
                    return false;
                }
            }
        }
        if ($iterator->hasChildren()) {
            if ($this->options['searchExDirReg'] && preg_match($this->options['searchExDirReg'], $key)) {
                return false;
            }
            return (bool)$this->attr($key, 'read', null, true);
        }
        return ($this->stripos($name, $this->doSearchCurrentQuery['q']) === false) ? false : true;
    }

    /**
     * Creates a symbolic link
     *
     * @param      string   $target  The target
     * @param      string   $link    The link
     *
     * @return     boolean  ( result of symlink() )
     */
    protected function localFileSystemSymlink($target, $link)
    {
        $res = false;
        if (function_exists('symlink') and is_callable('symlink')) {
            $errlev = error_reporting();
            error_reporting($errlev ^ E_WARNING);
            if ($res = symlink(realpath($target), $link)) {
                $res = is_readable($link);
            }
            error_reporting($errlev);
        }
        return $res;
    }
} // END class php/elFinderVolumeTrash.class.php000064400000003057151215013420013071 0ustar00<?php

/**
 * elFinder driver for trash bin at local filesystem.
 *
 * @author NaokiSawada
 **/
class elFinderVolumeTrash extends elFinderVolumeLocalFileSystem
{
    /**
     * Driver id
     * Must be started from letter and contains [a-z0-9]
     * Used as part of volume id.
     *
     * @var string
     **/
    protected $driverId = 't';

    public function __construct()
    {
        parent::__construct();
        // original option of the Trash
        $this->options['lockEverything'] = false; // Lock all items in the trash to disable delete, move, rename.

        // common options as the volume driver
        $this->options['alias'] = 'Trash';
        $this->options['quarantine'] = '';
        $this->options['rootCssClass'] = 'elfinder-navbar-root-trash';
        $this->options['copyOverwrite'] = false;
        $this->options['uiCmdMap'] = array('paste' => 'hidden', 'mkdir' => 'hidden', 'copy' => 'restore');
        $this->options['disabled'] = array('archive', 'duplicate', 'edit', 'extract', 'mkfile', 'places', 'put', 'rename', 'resize', 'upload');
    }

    public function mount(array $opts)
    {
        if ($this->options['lockEverything']) {
            if (!is_array($opts['attributes'])) {
                $opts['attributes'] = array();
            }
            $attr = array(
                'pattern' => '/./',
                'locked' => true,
            );
            array_unshift($opts['attributes'], $attr);
        }
        // force set `copyJoin` to true
        $opts['copyJoin'] = true;

        return parent::mount($opts);
    }
}
php/elFinderVolumeDriver.class.php000064400001000005151215013420013232 0ustar00<?php

/**
 * Base class for elFinder volume.
 * Provide 2 layers:
 *  1. Public API (commands)
 *  2. abstract fs API
 * All abstract methods begin with "_"
 *
 * @author Dmitry (dio) Levashov
 * @author Troex Nevelin
 * @author Alexey Sukhotin
 * @method netmountPrepare(array $options)
 * @method postNetmount(array $options)
 */
abstract class elFinderVolumeDriver
{

    /**
     * Net mount key
     *
     * @var string
     **/
    public $netMountKey = '';

    /**
     * Request args
     * $_POST or $_GET values
     *
     * @var array
     */
    protected $ARGS = array();

    /**
     * Driver id
     * Must be started from letter and contains [a-z0-9]
     * Used as part of volume id
     *
     * @var string
     **/
    protected $driverId = 'a';

    /**
     * Volume id - used as prefix for files hashes
     *
     * @var string
     **/
    protected $id = '';

    /**
     * Flag - volume "mounted" and available
     *
     * @var bool
     **/
    protected $mounted = false;

    /**
     * Root directory path
     *
     * @var string
     **/
    protected $root = '';

    /**
     * Root basename | alias
     *
     * @var string
     **/
    protected $rootName = '';

    /**
     * Default directory to open
     *
     * @var string
     **/
    protected $startPath = '';

    /**
     * Base URL
     *
     * @var string
     **/
    protected $URL = '';

    /**
     * Path to temporary directory
     *
     * @var string
     */
    protected $tmp;

    /**
     * A file save destination path when a temporary content URL is required
     * on a network volume or the like
     * If not specified, it tries to use "Connector Path/../files/.tmb".
     *
     * @var string
     */
    protected $tmpLinkPath = '';

    /**
     * A file save destination URL when a temporary content URL is required
     * on a network volume or the like
     * If not specified, it tries to use "Connector URL/../files/.tmb".
     *
     * @var string
     */
    protected $tmpLinkUrl = '';

    /**
     * Thumbnails dir path
     *
     * @var string
     **/
    protected $tmbPath = '';

    /**
     * Is thumbnails dir writable
     *
     * @var bool
     **/
    protected $tmbPathWritable = false;

    /**
     * Thumbnails base URL
     *
     * @var string
     **/
    protected $tmbURL = '';

    /**
     * Thumbnails size in px
     *
     * @var int
     **/
    protected $tmbSize = 48;

    /**
     * Image manipulation lib name
     * auto|imagick|gd|convert
     *
     * @var string
     **/
    protected $imgLib = 'auto';

    /**
     * Video to Image converter
     *
     * @var array
     */
    protected $imgConverter = array();

    /**
     * Library to crypt files name
     *
     * @var string
     **/
    protected $cryptLib = '';

    /**
     * Archivers config
     *
     * @var array
     **/
    protected $archivers = array(
        'create' => array(),
        'extract' => array()
    );

    /**
     * Static var of $this->options['maxArcFilesSize']
     * 
     * @var int|string
     */
    protected static $maxArcFilesSize;

    /**
     * Server character encoding
     *
     * @var string or null
     **/
    protected $encoding = null;

    /**
     * How many subdirs levels return for tree
     *
     * @var int
     **/
    protected $treeDeep = 1;

    /**
     * Errors from last failed action
     *
     * @var array
     **/
    protected $error = array();

    /**
     * Today 24:00 timestamp
     *
     * @var int
     **/
    protected $today = 0;

    /**
     * Yesterday 24:00 timestamp
     *
     * @var int
     **/
    protected $yesterday = 0;

    /**
     * Force make dirctory on extract
     *
     * @var int
     **/
    protected $extractToNewdir = 'auto';

    /**
     * Object configuration
     *
     * @var array
     **/
    protected $options = array(
        // Driver ID (Prefix of volume ID), Normally, the value specified for each volume driver is used.
        'driverId' => '',
        // Id (Suffix of volume ID), Normally, the number incremented according to the specified number of volumes is used.
        'id' => '',
        // revision id of root directory that uses for caching control of root stat
        'rootRev' => '',
        // driver type it uses volume root's CSS class name. e.g. 'group' -> Adds 'elfinder-group' to CSS class name.
        'type' => '',
        // root directory path
        'path' => '',
        // Folder hash value on elFinder to be the parent of this volume
        'phash' => '',
        // Folder hash value on elFinder to trash bin of this volume, it require 'copyJoin' to true
        'trashHash' => '',
        // open this path on initial request instead of root path
        'startPath' => '',
        // how many subdirs levels return per request
        'treeDeep' => 1,
        // root url, not set to URL via the connector. If you want to hide the file URL, do not set this value. (replacement for old "fileURL" option)
        'URL' => '',
        // enable onetime URL to a file - (true, false, 'auto' (true if a temporary directory is available) or callable (A function that return onetime URL))
        'onetimeUrl' => 'auto',
        // directory link url to own manager url with folder hash (`true`, `false`, `'hide'`(No show) or default `'auto'`: URL is empty then `true` else `false`)
        'dirUrlOwn' => 'auto',
        // directory separator. required by client to show paths correctly
        'separator' => DIRECTORY_SEPARATOR,
        // Use '/' as directory separator when the path hash encode/decode on the Windows server too
        'winHashFix' => false,
        // Server character encoding (default is '': UTF-8)
        'encoding' => '',
        // for convert character encoding (default is '': Not change locale)
        'locale' => '',
        // URL of volume icon image
        'icon' => '',
        // CSS Class of volume root in tree
        'rootCssClass' => '',
        // Items to disable session caching
        'noSessionCache' => array(),
        // enable i18n folder name that convert name to elFinderInstance.messages['folder_'+name]
        'i18nFolderName' => false,
        // Search timeout (sec)
        'searchTimeout' => 30,
        // Search exclusion directory regex pattern (require demiliter e.g. '#/path/to/exclude_directory#i')
        'searchExDirReg' => '',
        // library to crypt/uncrypt files names (not implemented)
        'cryptLib' => '',
        // how to detect files mimetypes. (auto/internal/finfo/mime_content_type)
        'mimeDetect' => 'auto',
        // mime.types file path (for mimeDetect==internal)
        'mimefile' => '',
        // Static extension/MIME of general server side scripts to security issues
        'staticMineMap' => array(
            'php:*' => 'text/x-php',
            'pht:*' => 'text/x-php',
            'php3:*' => 'text/x-php',
            'php4:*' => 'text/x-php',
            'php5:*' => 'text/x-php',
            'php7:*' => 'text/x-php',
            'phtml:*' => 'text/x-php',
            'phar:*' => 'text/x-php',
            'cgi:*' => 'text/x-httpd-cgi',
            'pl:*' => 'text/x-perl',
            'asp:*' => 'text/x-asap',
            'aspx:*' => 'text/x-asap',
            'py:*' => 'text/x-python',
            'rb:*' => 'text/x-ruby',
            'jsp:*' => 'text/x-jsp'
        ),
        // mime type normalize map : Array '[ext]:[detected mime type]' => '[normalized mime]'
        'mimeMap' => array(
            'md:application/x-genesis-rom' => 'text/x-markdown',
            'md:text/plain' => 'text/x-markdown',
            'markdown:text/plain' => 'text/x-markdown',
            'css:text/x-asm' => 'text/css',
            'css:text/plain' => 'text/css',
            'csv:text/plain' => 'text/csv',
            'java:text/x-c' => 'text/x-java-source',
            'json:text/plain' => 'application/json',
            'sql:text/plain' => 'text/x-sql',
            'rtf:text/rtf' => 'application/rtf',
            'rtfd:text/rtfd' => 'application/rtfd',
            'ico:image/vnd.microsoft.icon' => 'image/x-icon',
            'svg:text/plain' => 'image/svg+xml',
            'pxd:application/octet-stream' => 'image/x-pixlr-data',
            'dng:image/tiff' => 'image/x-adobe-dng',
            'sketch:application/zip' => 'image/x-sketch',
            'sketch:application/octet-stream' => 'image/x-sketch',
            'xcf:application/octet-stream' => 'image/x-xcf',
            'amr:application/octet-stream' => 'audio/amr',
            'm4a:video/mp4' => 'audio/mp4',
            'oga:application/ogg' => 'audio/ogg',
            'ogv:application/ogg' => 'video/ogg',
            'zip:application/x-zip' => 'application/zip',
            'm3u8:text/plain' => 'application/x-mpegURL',
            'mpd:text/plain' => 'application/dash+xml',
            'mpd:application/xml' => 'application/dash+xml',
            '*:application/x-dosexec' => 'application/x-executable',
            'doc:application/vnd.ms-office' => 'application/msword',
            'xls:application/vnd.ms-office' => 'application/vnd.ms-excel',
            'ppt:application/vnd.ms-office' => 'application/vnd.ms-powerpoint',
            'yml:text/plain' => 'text/x-yaml',
            'ai:application/pdf' => 'application/postscript',
            'cgm:text/plain' => 'image/cgm',
            'dxf:text/plain' => 'image/vnd.dxf',
            'dds:application/octet-stream' => 'image/vnd-ms.dds',
            'hpgl:text/plain' => 'application/vnd.hp-hpgl',
            'igs:text/plain' => 'model/iges',
            'iges:text/plain' => 'model/iges',
            'plt:application/octet-stream' => 'application/plt',
            'plt:text/plain' => 'application/plt',
            'sat:text/plain' => 'application/sat',
            'step:text/plain' => 'application/step',
            'stp:text/plain' => 'application/step'
        ),
        // An option to add MimeMap to the `mimeMap` option
        // Array '[ext]:[detected mime type]' => '[normalized mime]'
        'additionalMimeMap' => array(),
        // MIME-Type of filetype detected as unknown
        'mimeTypeUnknown' => 'application/octet-stream',
        // MIME regex of send HTTP header "Content-Disposition: inline" or allow preview in quicklook
        // '.' is allow inline of all of MIME types
        // '$^' is not allow inline of all of MIME types
        'dispInlineRegex' => '^(?:(?:video|audio)|image/(?!.+\+xml)|application/(?:ogg|x-mpegURL|dash\+xml)|(?:text/plain|application/pdf)$)',
        // temporary content URL's base path
        'tmpLinkPath' => '',
        // temporary content URL's base URL
        'tmpLinkUrl' => '',
        // directory for thumbnails
        'tmbPath' => '.tmb',
        // mode to create thumbnails dir
        'tmbPathMode' => 0777,
        // thumbnails dir URL. Set it if store thumbnails outside root directory
        'tmbURL' => '',
        // thumbnails size (px)
        'tmbSize' => 48,
        // thumbnails crop (true - crop, false - scale image to fit thumbnail size)
        'tmbCrop' => true,
        // thumbnail URL require custom data as the GET query
        'tmbReqCustomData' => false,
        // thumbnails background color (hex #rrggbb or 'transparent')
        'tmbBgColor' => 'transparent',
        // image rotate fallback background color (hex #rrggbb)
        'bgColorFb' => '#ffffff',
        // image manipulations library (imagick|gd|convert|auto|none, none - Does not check the image library at all.)
        'imgLib' => 'auto',
        // Fallback self image to thumbnail (nothing imgLib)
        'tmbFbSelf' => true,
        // Video to Image converters ['TYPE or MIME' => ['func' => function($file){ /* Converts $file to Image */ return true; }, 'maxlen' => (int)TransferLength]]
        'imgConverter' => array(),
        // Max length of transfer to image converter
        'tmbVideoConvLen' => 10000000,
        // Captre point seccond
        'tmbVideoConvSec' => 6,
        // Life time (hour) for thumbnail garbage collection ("0" means no GC)
        'tmbGcMaxlifeHour' => 0,
        // Percentage of garbage collection executed for thumbnail creation command ("1" means "1%")
        'tmbGcPercentage' => 1,
        // Resource path of fallback icon images defailt: php/resouces
        'resourcePath' => '',
        // Jpeg image saveing quality
        'jpgQuality' => 100,
        // Save as progressive JPEG on image editing
        'jpgProgressive' => true,
        // enable to get substitute image with command `dim`
        'substituteImg' => true,
        // on paste file -  if true - old file will be replaced with new one, if false new file get name - original_name-number.ext
        'copyOverwrite' => true,
        // if true - join new and old directories content on paste
        'copyJoin' => true,
        // on upload -  if true - old file will be replaced with new one, if false new file get name - original_name-number.ext
        'uploadOverwrite' => true,
        // mimetypes allowed to upload
        'uploadAllow' => array(),
        // mimetypes not allowed to upload
        'uploadDeny' => array(),
        // order to process uploadAllow and uploadDeny options
        'uploadOrder' => array('deny', 'allow'),
        // maximum upload file size. NOTE - this is size for every uploaded files
        'uploadMaxSize' => 0,
        // Maximum number of folders that can be created at one time. (0: unlimited)
        'uploadMaxMkdirs' => 0,
        // maximum number of chunked upload connection. `-1` to disable chunked upload
        'uploadMaxConn' => 3,
        // maximum get file size. NOTE - Maximum value is 50% of PHP memory_limit
        'getMaxSize' => 0,
        // files dates format
        'dateFormat' => 'j M Y H:i',
        // files time format
        'timeFormat' => 'H:i',
        // if true - every folder will be check for children folders, -1 - every folder will be check asynchronously, false -  all folders will be marked as having subfolders
        'checkSubfolders' => true, // true, false or -1
        // allow to copy from this volume to other ones?
        'copyFrom' => true,
        // allow to copy from other volumes to this one?
        'copyTo' => true,
        // cmd duplicate suffix format e.g. '_%s_' to without spaces
        'duplicateSuffix' => ' %s ',
        // unique name numbar format e.g. '(%d)' to (1), (2)...
        'uniqueNumFormat' => '%d',
        // list of commands disabled on this root
        'disabled' => array(),
        // enable file owner, group & mode info, `false` to inactivate "chmod" command.
        'statOwner' => false,
        // allow exec chmod of read-only files
        'allowChmodReadOnly' => false,
        // regexp or function name to validate new file name
        'acceptedName' => '/^[^\.].*/', // Notice: overwritten it in some volume drivers contractor
        // regexp or function name to validate new directory name
        'acceptedDirname' => '', // used `acceptedName` if empty value
        // function/class method to control files permissions
        'accessControl' => null,
        // some data required by access control
        'accessControlData' => null,
        // root stat that return without asking the system when mounted and not the current volume. Query to the system with false. array|false
        'rapidRootStat' => array(
            'read' => true,
            'write' => true,
            'locked' => false,
            'hidden' => false,
            'size' => 0,  // Unknown
            'ts' => 0,    // Unknown
            'dirs' => -1, // Check on demand for subdirectories
            'mime' => 'directory'
        ),
        // default permissions.
        'defaults' => array(
            'read' => true,
            'write' => true,
            'locked' => false,
            'hidden' => false
        ),
        // files attributes
        'attributes' => array(),
        // max allowed archive files size (0 - no limit)
        'maxArcFilesSize' => '2G',
        // Allowed archive's mimetypes to create. Leave empty for all available types.
        'archiveMimes' => array(),
        // Manual config for archivers. See example below. Leave empty for auto detect
        'archivers' => array(),
        // Use Archive function for remote volume
        'useRemoteArchive' => false,
        // plugin settings
        'plugin' => array(),
        // Is support parent directory time stamp update on add|remove|rename item
        // Default `null` is auto detection that is LocalFileSystem, FTP or Dropbox are `true`
        'syncChkAsTs' => null,
        // Long pooling sync checker function for syncChkAsTs is true
        // Calls with args (TARGET DIRCTORY PATH, STAND-BY(sec), OLD TIMESTAMP, VOLUME DRIVER INSTANCE, ELFINDER INSTANCE)
        // This function must return the following values. Changed: New Timestamp or Same: Old Timestamp or Error: false
        // Default `null` is try use elFinderVolumeLocalFileSystem::localFileSystemInotify() on LocalFileSystem driver
        // another driver use elFinder stat() checker
        'syncCheckFunc' => null,
        // Long polling sync stand-by time (sec)
        'plStandby' => 30,
        // Sleep time (sec) for elFinder stat() checker (syncChkAsTs is true)
        'tsPlSleep' => 10,
        // Sleep time (sec) for elFinder ls() checker (syncChkAsTs is false)
        'lsPlSleep' => 30,
        // Client side sync interval minimum (ms)
        // Default `null` is auto set to ('tsPlSleep' or 'lsPlSleep') * 1000
        // `0` to disable auto sync
        'syncMinMs' => null,
        // required to fix bug on macos
        // However, we recommend to use the Normalizer plugin instead this option
        'utf8fix' => false,
        //                           й                 ё              Й               Ё              Ø         Å
        'utf8patterns' => array("\u0438\u0306", "\u0435\u0308", "\u0418\u0306", "\u0415\u0308", "\u00d8A", "\u030a"),
        'utf8replace' => array("\u0439", "\u0451", "\u0419", "\u0401", "\u00d8", "\u00c5"),
        // cache control HTTP headers for commands `file` and  `get`
        'cacheHeaders' => array(
            'Cache-Control: max-age=3600',
            'Expires:',
            'Pragma:'
        ),
        // Header to use to accelerate sending local files to clients (e.g. 'X-Sendfile', 'X-Accel-Redirect')
        'xsendfile' => '',
        // Root path to xsendfile target. Probably, this is required for 'X-Accel-Redirect' on Nginx.
        'xsendfilePath' => ''
    );

    /**
     * Defaults permissions
     *
     * @var array
     **/
    protected $defaults = array(
        'read' => true,
        'write' => true,
        'locked' => false,
        'hidden' => false
    );

    /**
     * Access control function/class
     *
     * @var mixed
     **/
    protected $attributes = array();

    /**
     * Access control function/class
     *
     * @var mixed
     **/
    protected $access = null;

    /**
     * Mime types allowed to upload
     *
     * @var array
     **/
    protected $uploadAllow = array();

    /**
     * Mime types denied to upload
     *
     * @var array
     **/
    protected $uploadDeny = array();

    /**
     * Order to validate uploadAllow and uploadDeny
     *
     * @var array
     **/
    protected $uploadOrder = array();

    /**
     * Maximum allowed upload file size.
     * Set as number or string with unit - "10M", "500K", "1G"
     *
     * @var int|string
     **/
    protected $uploadMaxSize = 0;

    /**
     * Run time setting of overwrite items on upload
     *
     * @var string
     */
    protected $uploadOverwrite = true;

    /**
     * Maximum allowed get file size.
     * Set as number or string with unit - "10M", "500K", "1G"
     *
     * @var int|string
     **/
    protected $getMaxSize = -1;

    /**
     * Mimetype detect method
     *
     * @var string
     **/
    protected $mimeDetect = 'auto';

    /**
     * Flag - mimetypes from externail file was loaded
     *
     * @var bool
     **/
    private static $mimetypesLoaded = false;

    /**
     * Finfo resource for mimeDetect == 'finfo'
     *
     * @var resource
     **/
    protected $finfo = null;

    /**
     * List of disabled client's commands
     *
     * @var array
     **/
    protected $disabled = array();

    /**
     * overwrite extensions/mimetypes to mime.types
     *
     * @var array
     **/
    protected static $mimetypes = array(
        // applications
        'exe' => 'application/x-executable',
        'jar' => 'application/x-jar',
        // archives
        'gz' => 'application/x-gzip',
        'tgz' => 'application/x-gzip',
        'tbz' => 'application/x-bzip2',
        'rar' => 'application/x-rar',
        // texts
        'php' => 'text/x-php',
        'js' => 'text/javascript',
        'rtfd' => 'application/rtfd',
        'py' => 'text/x-python',
        'rb' => 'text/x-ruby',
        'sh' => 'text/x-shellscript',
        'pl' => 'text/x-perl',
        'xml' => 'text/xml',
        'c' => 'text/x-csrc',
        'h' => 'text/x-chdr',
        'cpp' => 'text/x-c++src',
        'hh' => 'text/x-c++hdr',
        'md' => 'text/x-markdown',
        'markdown' => 'text/x-markdown',
        'yml' => 'text/x-yaml',
        // images
        'bmp' => 'image/x-ms-bmp',
        'tga' => 'image/x-targa',
        'xbm' => 'image/xbm',
        'pxm' => 'image/pxm',
        //audio
        'wav' => 'audio/wav',
        // video
        'dv' => 'video/x-dv',
        'wm' => 'video/x-ms-wmv',
        'ogm' => 'video/ogg',
        'm2ts' => 'video/MP2T',
        'mts' => 'video/MP2T',
        'ts' => 'video/MP2T',
        'm3u8' => 'application/x-mpegURL',
        'mpd' => 'application/dash+xml'
    );

    /**
     * Directory separator - required by client
     *
     * @var string
     **/
    protected $separator = DIRECTORY_SEPARATOR;

    /**
     * Directory separator for decode/encode hash
     *
     * @var string
     **/
    protected $separatorForHash = '';

    /**
     * System Root path (Unix like: '/', Windows: '\', 'C:\' or 'D:\'...)
     *
     * @var string
     **/
    protected $systemRoot = DIRECTORY_SEPARATOR;

    /**
     * Mimetypes allowed to display
     *
     * @var array
     **/
    protected $onlyMimes = array();

    /**
     * Store files moved or overwrited files info
     *
     * @var array
     **/
    protected $removed = array();

    /**
     * Store files added files info
     *
     * @var array
     **/
    protected $added = array();

    /**
     * Cache storage
     *
     * @var array
     **/
    protected $cache = array();

    /**
     * Cache by folders
     *
     * @var array
     **/
    protected $dirsCache = array();

    /**
     * You should use `$this->sessionCache['subdirs']` instead
     *
     * @var array
     * @deprecated
     */
    protected $subdirsCache = array();

    /**
     * This volume session cache
     *
     * @var array
     */
    protected $sessionCache;

    /**
     * Session caching item list
     *
     * @var array
     */
    protected $sessionCaching = array('rootstat' => true, 'subdirs' => true);

    /**
     * elFinder session wrapper object
     *
     * @var elFinderSessionInterface
     */
    protected $session;

    /**
     * Search start time
     *
     * @var int
     */
    protected $searchStart;

    /**
     * Current query word on doSearch
     *
     * @var array
     **/
    protected $doSearchCurrentQuery = array();

    /**
     * Is root modified (for clear root stat cache)
     *
     * @var bool
     */
    protected $rootModified = false;

    /**
     * Is disable of command `url`
     *
     * @var string
     */
    protected $disabledGetUrl = false;

    /**
     * Accepted filename validator
     *
     * @var string | callable
     */
    protected $nameValidator;

    /**
     * Accepted dirname validator
     *
     * @var string | callable
     */
    protected $dirnameValidator;

    /**
     * This request require online state
     *
     * @var boolean
     */
    protected $needOnline;

    /*********************************************************************/
    /*                            INITIALIZATION                         */
    /*********************************************************************/

    /**
     * Sets the need online.
     *
     * @param  boolean  $state  The state
     */
    public function setNeedOnline($state = null)
    {
        if ($state !== null) {
            $this->needOnline = (bool)$state;
            return;
        }

        $need = false;
        $arg = $this->ARGS;
        $id = $this->id;

        $target = !empty($arg['target'])? $arg['target'] : (!empty($arg['dst'])? $arg['dst'] : '');
        $targets = !empty($arg['targets'])? $arg['targets'] : array();
        if (!is_array($targets)) {
            $targets = array($targets);
        }

        if ($target && strpos($target, $id) === 0) {
            $need = true;
        } else if ($targets) {
            foreach($targets as $t) {
                if ($t && strpos($t, $id) === 0) {
                    $need = true;
                    break;
                }
            }
        }

        $this->needOnline = $need;
    }

    /**
     * Prepare driver before mount volume.
     * Return true if volume is ready.
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function init()
    {
        return true;
    }

    /**
     * Configure after successfull mount.
     * By default set thumbnails path and image manipulation library.
     *
     * @return void
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function configure()
    {
        // set thumbnails path
        $path = $this->options['tmbPath'];
        if ($path) {
            if (!file_exists($path)) {
                if (mkdir($path)) {
                    chmod($path, $this->options['tmbPathMode']);
                } else {
                    $path = '';
                }
            }

            if (is_dir($path) && is_readable($path)) {
                $this->tmbPath = $path;
                $this->tmbPathWritable = is_writable($path);
            }
        }
        // set resouce path
        if (!is_dir($this->options['resourcePath'])) {
            $this->options['resourcePath'] = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'resources';
        }

        // set image manipulation library
        $type = preg_match('/^(imagick|gd|convert|auto|none)$/i', $this->options['imgLib'])
            ? strtolower($this->options['imgLib'])
            : 'auto';

        if ($type === 'none') {
            $this->imgLib = '';
        } else {
            if (($type === 'imagick' || $type === 'auto') && extension_loaded('imagick')) {
                $this->imgLib = 'imagick';
            } else if (($type === 'gd' || $type === 'auto') && function_exists('gd_info')) {
                $this->imgLib = 'gd';
            } else {
                $convertCache = 'imgLibConvert';
                if (($convertCmd = $this->session->get($convertCache, false)) !== false) {
                    $this->imgLib = $convertCmd;
                } else {
                    $this->imgLib = ($this->procExec(ELFINDER_CONVERT_PATH . ' -version') === 0) ? 'convert' : '';
                    $this->session->set($convertCache, $this->imgLib);
                }
            }
            if ($type !== 'auto' && $this->imgLib === '') {
                // fallback
                $this->imgLib = extension_loaded('imagick') ? 'imagick' : (function_exists('gd_info') ? 'gd' : '');
            }
        }

        // check video to img converter
        if (!empty($this->options['imgConverter']) && is_array($this->options['imgConverter'])) {
            foreach ($this->options['imgConverter'] as $_type => $_converter) {
                if (isset($_converter['func'])) {
                    $this->imgConverter[strtolower($_type)] = $_converter;
                }
            }
        }
        if (!isset($this->imgConverter['video'])) {
            $videoLibCache = 'videoLib';
            if (($videoLibCmd = $this->session->get($videoLibCache, false)) === false) {
                $videoLibCmd = ($this->procExec(ELFINDER_FFMPEG_PATH . ' -version') === 0) ? 'ffmpeg' : '';
                $this->session->set($videoLibCache, $videoLibCmd);
            }
            if ($videoLibCmd) {
                $this->imgConverter['video'] = array(
                    'func' => array($this, $videoLibCmd . 'ToImg'),
                    'maxlen' => $this->options['tmbVideoConvLen']
                );
            }
        }

        // check onetimeUrl
        if (strtolower($this->options['onetimeUrl']) === 'auto') {
            $this->options['onetimeUrl'] = elFinder::getStaticVar('commonTempPath')? true : false;
        }

        // check archivers
        if (empty($this->archivers['create'])) {
            $this->disabled[] = 'archive';
        }
        if (empty($this->archivers['extract'])) {
            $this->disabled[] = 'extract';
        }
        $_arc = $this->getArchivers();
        if (empty($_arc['create'])) {
            $this->disabled[] = 'zipdl';
        }

        if ($this->options['maxArcFilesSize']) {
            $this->options['maxArcFilesSize'] = elFinder::getIniBytes('', $this->options['maxArcFilesSize']);
        }
        self::$maxArcFilesSize = $this->options['maxArcFilesSize'];

        // check 'statOwner' for command `chmod`
        if (empty($this->options['statOwner'])) {
            $this->disabled[] = 'chmod';
        }

        // check 'mimeMap'
        if (!is_array($this->options['mimeMap'])) {
            $this->options['mimeMap'] = array();
        }
        if (is_array($this->options['staticMineMap']) && $this->options['staticMineMap']) {
            $this->options['mimeMap'] = array_merge($this->options['mimeMap'], $this->options['staticMineMap']);
        }
        if (is_array($this->options['additionalMimeMap']) && $this->options['additionalMimeMap']) {
            $this->options['mimeMap'] = array_merge($this->options['mimeMap'], $this->options['additionalMimeMap']);
        }

        // check 'url' in disabled commands
        if (in_array('url', $this->disabled)) {
            $this->disabledGetUrl = true;
        }

        // set run time setting uploadOverwrite
        $this->uploadOverwrite = $this->options['uploadOverwrite'];
    }

    /**
     * @deprecated
     */
    protected function sessionRestart()
    {
        $this->sessionCache = $this->session->start()->get($this->id, array());
        return true;
    }

    /*********************************************************************/
    /*                              PUBLIC API                           */
    /*********************************************************************/

    /**
     * Return driver id. Used as a part of volume id.
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    public function driverId()
    {
        return $this->driverId;
    }

    /**
     * Return volume id
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    public function id()
    {
        return $this->id;
    }

    /**
     * Assign elFinder session wrapper object
     *
     * @param  $session  elFinderSessionInterface
     */
    public function setSession($session)
    {
        $this->session = $session;
    }

    /**
     * Get elFinder sesson wrapper object
     *
     * @return object  The session object
     */
    public function getSession()
    {
        return $this->session;
    }

    /**
     * Save session cache data
     * Calls this function before umount this volume on elFinder::exec()
     *
     * @return void
     */
    public function saveSessionCache()
    {
        $this->session->set($this->id, $this->sessionCache);
    }

    /**
     * Return debug info for client
     *
     * @return array
     * @author Dmitry (dio) Levashov
     **/
    public function debug()
    {
        return array(
            'id' => $this->id(),
            'name' => strtolower(substr(get_class($this), strlen('elfinderdriver'))),
            'mimeDetect' => $this->mimeDetect,
            'imgLib' => $this->imgLib
        );
    }

    /**
     * chmod a file or folder
     *
     * @param  string $hash file or folder hash to chmod
     * @param  string $mode octal string representing new permissions
     *
     * @return array|false
     * @author David Bartle
     **/
    public function chmod($hash, $mode)
    {
        if ($this->commandDisabled('chmod')) {
            return $this->setError(elFinder::ERROR_PERM_DENIED);
        }

        if (!($file = $this->file($hash))) {
            return $this->setError(elFinder::ERROR_FILE_NOT_FOUND);
        }

        if (!$this->options['allowChmodReadOnly']) {
            if (!$this->attr($this->decode($hash), 'write', null, ($file['mime'] === 'directory'))) {
                return $this->setError(elFinder::ERROR_PERM_DENIED, $file['name']);
            }
        }

        $path = $this->decode($hash);
        $write = $file['write'];

        if ($this->convEncOut(!$this->_chmod($this->convEncIn($path), $mode))) {
            return $this->setError(elFinder::ERROR_PERM_DENIED, $file['name']);
        }

        $this->clearstatcache();
        if ($path == $this->root) {
            $this->rootModified = true;
        }

        if ($file = $this->stat($path)) {
            $files = array($file);
            if ($file['mime'] === 'directory' && $write !== $file['write']) {
                foreach ($this->getScandir($path) as $stat) {
                    if ($this->mimeAccepted($stat['mime'])) {
                        $files[] = $stat;
                    }
                }
            }
            return $files;
        } else {
            return $this->setError(elFinder::ERROR_FILE_NOT_FOUND);
        }
    }

    /**
     * stat a file or folder for elFinder cmd exec
     *
     * @param  string $hash file or folder hash to chmod
     *
     * @return array
     * @author Naoki Sawada
     **/
    public function fstat($hash)
    {
        $path = $this->decode($hash);
        return $this->stat($path);
    }

    /**
     * Clear PHP stat cache & all of inner stat caches
     */
    public function clearstatcache()
    {
        clearstatcache();
        $this->clearcache();
    }

    /**
     * Clear inner stat caches for target hash
     *
     * @param string $hash
     */
    public function clearcaches($hash = null)
    {
        if ($hash === null) {
            $this->clearcache();
        } else {
            $path = $this->decode($hash);
            unset($this->cache[$path], $this->dirsCache[$path]);
        }
    }

    /**
     * "Mount" volume.
     * Return true if volume available for read or write,
     * false - otherwise
     *
     * @param array $opts
     *
     * @return bool
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     * @author Alexey Sukhotin
     */
    public function mount(array $opts)
    {
        $this->options = array_merge($this->options, $opts);

        if (!isset($this->options['path']) || $this->options['path'] === '') {
            return $this->setError('Path undefined.');
        }

        if (!$this->session) {
            return $this->setError('Session wrapper dose not set. Need to `$volume->setSession(elFinderSessionInterface);` before mount.');
        }
        if (!($this->session instanceof elFinderSessionInterface)) {
            return $this->setError('Session wrapper instance must be "elFinderSessionInterface".');
        }

        // set driverId
        if (!empty($this->options['driverId'])) {
            $this->driverId = $this->options['driverId'];
        }

        $this->id = $this->driverId . (!empty($this->options['id']) ? $this->options['id'] : elFinder::$volumesCnt++) . '_';
        $this->root = $this->normpathCE($this->options['path']);
        $this->separator = isset($this->options['separator']) ? $this->options['separator'] : DIRECTORY_SEPARATOR;
        if (!empty($this->options['winHashFix'])) {
            $this->separatorForHash = ($this->separator !== '/') ? '/' : '';
        }
        $this->systemRoot = isset($this->options['systemRoot']) ? $this->options['systemRoot'] : $this->separator;

        // set ARGS
        $this->ARGS = $_SERVER['REQUEST_METHOD'] === 'POST' ? $_POST : $_GET;

        $argInit = !empty($this->ARGS['init']);

        // set $this->needOnline
        if (!is_bool($this->needOnline)) {
            $this->setNeedOnline();
        }

        // session cache
        if ($argInit) {
            $this->session->set($this->id, array());
        }
        $this->sessionCache = $this->session->get($this->id, array());

        // default file attribute
        $this->defaults = array(
            'read' => isset($this->options['defaults']['read']) ? !!$this->options['defaults']['read'] : true,
            'write' => isset($this->options['defaults']['write']) ? !!$this->options['defaults']['write'] : true,
            'locked' => isset($this->options['defaults']['locked']) ? !!$this->options['defaults']['locked'] : false,
            'hidden' => isset($this->options['defaults']['hidden']) ? !!$this->options['defaults']['hidden'] : false
        );

        // root attributes
        $this->attributes[] = array(
            'pattern' => '~^' . preg_quote($this->separator) . '$~',
            'locked' => true,
            'hidden' => false
        );
        // set files attributes
        if (!empty($this->options['attributes']) && is_array($this->options['attributes'])) {

            foreach ($this->options['attributes'] as $a) {
                // attributes must contain pattern and at least one rule
                if (!empty($a['pattern']) || (is_array($a) && count($a) > 1)) {
                    $this->attributes[] = $a;
                }
            }
        }

        if (!empty($this->options['accessControl']) && is_callable($this->options['accessControl'])) {
            $this->access = $this->options['accessControl'];
        }

        $this->today = mktime(0, 0, 0, date('m'), date('d'), date('Y'));
        $this->yesterday = $this->today - 86400;

        if (!$this->init()) {
            return false;
        }

        // set server encoding
        if (!empty($this->options['encoding']) && strtoupper($this->options['encoding']) !== 'UTF-8') {
            $this->encoding = $this->options['encoding'];
        } else {
            $this->encoding = null;
        }

        // check some options is arrays
        $this->uploadAllow = isset($this->options['uploadAllow']) && is_array($this->options['uploadAllow'])
            ? $this->options['uploadAllow']
            : array();

        $this->uploadDeny = isset($this->options['uploadDeny']) && is_array($this->options['uploadDeny'])
            ? $this->options['uploadDeny']
            : array();

        $this->options['uiCmdMap'] = (isset($this->options['uiCmdMap']) && is_array($this->options['uiCmdMap']))
            ? $this->options['uiCmdMap']
            : array();

        if (is_string($this->options['uploadOrder'])) { // telephat_mode on, compatibility with 1.x
            $parts = explode(',', isset($this->options['uploadOrder']) ? $this->options['uploadOrder'] : 'deny,allow');
            $this->uploadOrder = array(trim($parts[0]), trim($parts[1]));
        } else { // telephat_mode off
            $this->uploadOrder = !empty($this->options['uploadOrder']) ? $this->options['uploadOrder'] : array('deny', 'allow');
        }

        if (!empty($this->options['uploadMaxSize'])) {
            $this->uploadMaxSize = elFinder::getIniBytes('', $this->options['uploadMaxSize']);
        }
        // Set maximum to PHP_INT_MAX
        if (!defined('PHP_INT_MAX')) {
            define('PHP_INT_MAX', 2147483647);
        }
        if ($this->uploadMaxSize < 1 || $this->uploadMaxSize > PHP_INT_MAX) {
            $this->uploadMaxSize = PHP_INT_MAX;
        }

        // Set to get maximum size to 50% of memory_limit
        $memLimit = elFinder::getIniBytes('memory_limit') / 2;
        if ($memLimit > 0) {
            $this->getMaxSize = empty($this->options['getMaxSize']) ? $memLimit : min($memLimit, elFinder::getIniBytes('', $this->options['getMaxSize']));
        } else {
            $this->getMaxSize = -1;
        }

        $this->disabled = isset($this->options['disabled']) && is_array($this->options['disabled'])
            ? array_values(array_diff($this->options['disabled'], array('open'))) // 'open' is required
            : array();

        $this->cryptLib = $this->options['cryptLib'];
        $this->mimeDetect = $this->options['mimeDetect'];

        // find available mimetype detect method
        $regexp = '/text\/x\-(php|c\+\+)/';
        $auto_types = array();

        if (class_exists('finfo', false)) {
            $tmpFileInfo = explode(';', finfo_file(finfo_open(FILEINFO_MIME), __FILE__));
             if ($tmpFileInfo && preg_match($regexp, array_shift($tmpFileInfo))) {
                $auto_types[] = 'finfo';
            }
        }
        
        if (function_exists('mime_content_type')) {
            $_mimetypes = explode(';', mime_content_type(__FILE__));
            if (preg_match($regexp, array_shift($_mimetypes))) {
                $auto_types[] = 'mime_content_type';
            }
        }
            
        $auto_types[] = 'internal';

        $type = strtolower($this->options['mimeDetect']);
        if (!in_array($type, $auto_types)) {
            $type = 'auto';
        }

        if ($type == 'auto') {
            $type = array_shift($auto_types);
        }

        $this->mimeDetect = $type;

        if ($this->mimeDetect == 'finfo') {
            $this->finfo = finfo_open(FILEINFO_MIME);
        } else if ($this->mimeDetect == 'internal' && !elFinderVolumeDriver::$mimetypesLoaded) {
            // load mimes from external file for mimeDetect == 'internal'
            // based on Alexey Sukhotin idea and patch: http://elrte.org/redmine/issues/163
            // file must be in file directory or in parent one
            elFinderVolumeDriver::loadMimeTypes(!empty($this->options['mimefile']) ? $this->options['mimefile'] : '');
        }
        $this->rootName = empty($this->options['alias']) ? $this->basenameCE($this->root) : $this->options['alias'];

        // This get's triggered if $this->root == '/' and alias is empty.
        // Maybe modify _basename instead?
        if ($this->rootName === '') $this->rootName = $this->separator;

        $this->_checkArchivers();

        $root = $this->stat($this->root);

        if (!$root) {
            return $this->setError('Root folder does not exist.');
        }
        if (!$root['read'] && !$root['write']) {
            return $this->setError('Root folder has not read and write permissions.');
        }

        if ($root['read']) {
            if ($argInit) {
                // check startPath - path to open by default instead of root
                $startPath = $this->options['startPath'] ? $this->normpathCE($this->options['startPath']) : '';
                if ($startPath) {
                    $start = $this->stat($startPath);
                    if (!empty($start)
                        && $start['mime'] == 'directory'
                        && $start['read']
                        && empty($start['hidden'])
                        && $this->inpathCE($startPath, $this->root)) {
                        $this->startPath = $startPath;
                        if (substr($this->startPath, -1, 1) == $this->options['separator']) {
                            $this->startPath = substr($this->startPath, 0, -1);
                        }
                    }
                }
            }
        } else {
            $this->options['URL'] = '';
            $this->options['tmbURL'] = '';
            $this->options['tmbPath'] = '';
            // read only volume
            array_unshift($this->attributes, array(
                'pattern' => '/.*/',
                'read' => false
            ));
        }
        $this->treeDeep = $this->options['treeDeep'] > 0 ? (int)$this->options['treeDeep'] : 1;
        $this->tmbSize = $this->options['tmbSize'] > 0 ? (int)$this->options['tmbSize'] : 48;
        $this->URL = $this->options['URL'];
        if ($this->URL && preg_match("|[^/?&=]$|", $this->URL)) {
            $this->URL .= '/';
        }

        $dirUrlOwn = strtolower($this->options['dirUrlOwn']);
        if ($dirUrlOwn === 'auto') {
            $this->options['dirUrlOwn'] = $this->URL ? false : true;
        } else if ($dirUrlOwn === 'hide') {
            $this->options['dirUrlOwn'] = 'hide';
        } else {
            $this->options['dirUrlOwn'] = (bool)$this->options['dirUrlOwn'];
        }

        $this->tmbURL = !empty($this->options['tmbURL']) ? $this->options['tmbURL'] : '';
        if ($this->tmbURL && $this->tmbURL !== 'self' && preg_match("|[^/?&=]$|", $this->tmbURL)) {
            $this->tmbURL .= '/';
        }

        $this->nameValidator = !empty($this->options['acceptedName']) && (is_string($this->options['acceptedName']) || is_callable($this->options['acceptedName']))
            ? $this->options['acceptedName']
            : '';

        $this->dirnameValidator = !empty($this->options['acceptedDirname']) && (is_callable($this->options['acceptedDirname']) || (is_string($this->options['acceptedDirname']) && preg_match($this->options['acceptedDirname'], '') !== false))
            ? $this->options['acceptedDirname']
            : $this->nameValidator;

        // enabling archivers['create'] with options['useRemoteArchive']
        if ($this->options['useRemoteArchive'] && empty($this->archivers['create']) && $this->getTempPath()) {
            $_archivers = $this->getArchivers();
            $this->archivers['create'] = $_archivers['create'];
        }

        // manual control archive types to create
        if (!empty($this->options['archiveMimes']) && is_array($this->options['archiveMimes'])) {
            foreach ($this->archivers['create'] as $mime => $v) {
                if (!in_array($mime, $this->options['archiveMimes'])) {
                    unset($this->archivers['create'][$mime]);
                }
            }
        }

        // manualy add archivers
        if (!empty($this->options['archivers']['create']) && is_array($this->options['archivers']['create'])) {
            foreach ($this->options['archivers']['create'] as $mime => $conf) {
                if (strpos($mime, 'application/') === 0
                    && !empty($conf['cmd'])
                    && isset($conf['argc'])
                    && !empty($conf['ext'])
                    && !isset($this->archivers['create'][$mime])) {
                    $this->archivers['create'][$mime] = $conf;
                }
            }
        }

        if (!empty($this->options['archivers']['extract']) && is_array($this->options['archivers']['extract'])) {
            foreach ($this->options['archivers']['extract'] as $mime => $conf) {
                if (strpos($mime, 'application/') === 0
                    && !empty($conf['cmd'])
                    && isset($conf['argc'])
                    && !empty($conf['ext'])
                    && !isset($this->archivers['extract'][$mime])) {
                    $this->archivers['extract'][$mime] = $conf;
                }
            }
        }

        if (!empty($this->options['noSessionCache']) && is_array($this->options['noSessionCache'])) {
            foreach ($this->options['noSessionCache'] as $_key) {
                $this->sessionCaching[$_key] = false;
                unset($this->sessionCache[$_key]);
            }
        }
        if ($this->sessionCaching['subdirs']) {
            if (!isset($this->sessionCache['subdirs'])) {
                $this->sessionCache['subdirs'] = array();
            }
        }


        $this->configure();

        // Normalize disabled (array_merge`for type array of JSON)
        $this->disabled = array_values(array_unique($this->disabled));

        // fix sync interval
        if ($this->options['syncMinMs'] !== 0) {
            $this->options['syncMinMs'] = max($this->options[$this->options['syncChkAsTs'] ? 'tsPlSleep' : 'lsPlSleep'] * 1000, intval($this->options['syncMinMs']));
        }

        // ` copyJoin` is required for the trash function
        if ($this->options['trashHash'] && empty($this->options['copyJoin'])) {
            $this->options['trashHash'] = '';
        }

        // set tmpLinkPath
        if (elFinder::$tmpLinkPath && !$this->options['tmpLinkPath']) {
            if (is_writeable(elFinder::$tmpLinkPath)) {
                $this->options['tmpLinkPath'] = elFinder::$tmpLinkPath;
            } else {
                elFinder::$tmpLinkPath = '';
            }
        }
        if ($this->options['tmpLinkPath'] && is_writable($this->options['tmpLinkPath'])) {
            $this->tmpLinkPath = realpath($this->options['tmpLinkPath']);
        } else if (!$this->tmpLinkPath && $this->tmbURL && $this->tmbPath) {
            $this->tmpLinkPath = $this->tmbPath;
            $this->options['tmpLinkUrl'] = $this->tmbURL;
        } else if (!$this->options['URL'] && is_writable('../files/.tmb')) {
            $this->tmpLinkPath = realpath('../files/.tmb');
            $this->options['tmpLinkUrl'] = '';
            if (!elFinder::$tmpLinkPath) {
                elFinder::$tmpLinkPath = $this->tmpLinkPath;
                elFinder::$tmpLinkUrl = '';
            }
        }

        // set tmpLinkUrl
        if (elFinder::$tmpLinkUrl && !$this->options['tmpLinkUrl']) {
            $this->options['tmpLinkUrl'] = elFinder::$tmpLinkUrl;
        }
        if ($this->options['tmpLinkUrl']) {
            $this->tmpLinkUrl = $this->options['tmpLinkUrl'];
        }
        if ($this->tmpLinkPath && !$this->tmpLinkUrl) {
            $cur = realpath('./');
            $i = 0;
            while ($cur !== $this->systemRoot && strpos($this->tmpLinkPath, $cur) !== 0) {
                $i++;
                $cur = dirname($cur);
            }
            list($req) = explode('?', $_SERVER['REQUEST_URI']);
            $reqs = explode('/', dirname($req));
            $uri = join('/', array_slice($reqs, 0, count($reqs) - 1)) . substr($this->tmpLinkPath, strlen($cur));
            $https = (isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off');
            $this->tmpLinkUrl = ($https ? 'https://' : 'http://')
                . $_SERVER['SERVER_NAME'] // host
                . (((!$https && $_SERVER['SERVER_PORT'] == 80) || ($https && $_SERVER['SERVER_PORT'] == 443)) ? '' : (':' . $_SERVER['SERVER_PORT']))  // port
                . $uri;
            if (!elFinder::$tmpLinkUrl) {
                elFinder::$tmpLinkUrl = $this->tmpLinkUrl;
            }
        }

        // remove last '/'
        if ($this->tmpLinkPath) {
            $this->tmpLinkPath = rtrim($this->tmpLinkPath, '/');
        }
        if ($this->tmpLinkUrl) {
            $this->tmpLinkUrl = rtrim($this->tmpLinkUrl, '/');
        }

        // to update options cache
        if (isset($this->sessionCache['rootstat'])) {
            unset($this->sessionCache['rootstat'][$this->getRootstatCachekey()]);
        }
        $this->updateCache($this->root, $root);

        return $this->mounted = true;
    }

    /**
     * Some "unmount" stuffs - may be required by virtual fs
     *
     * @return void
     * @author Dmitry (dio) Levashov
     **/
    public function umount()
    {
    }

    /**
     * Remove session cache of this volume
     */
    public function clearSessionCache()
    {
        $this->sessionCache = array();
    }

    /**
     * Return error message from last failed action
     *
     * @return array
     * @author Dmitry (dio) Levashov
     **/
    public function error()
    {
        return $this->error;
    }

    /**
     * Return is uploadable that given file name
     *
     * @param  string $name file name
     * @param  bool   $allowUnknown
     *
     * @return bool
     * @author Naoki Sawada
     **/
    public function isUploadableByName($name, $allowUnknown = false)
    {
        $mimeByName = $this->mimetype($name, true);
        return (($allowUnknown && $mimeByName === 'unknown') || $this->allowPutMime($mimeByName));
    }

    /**
     * Return Extention/MIME Table (elFinderVolumeDriver::$mimetypes)
     *
     * @return array
     * @author Naoki Sawada
     */
    public function getMimeTable()
    {
        // load mime.types
        if (!elFinderVolumeDriver::$mimetypesLoaded) {
            elFinderVolumeDriver::loadMimeTypes();
        }
        return elFinderVolumeDriver::$mimetypes;
    }

    /**
     * Return file extention detected by MIME type
     *
     * @param  string $mime   MIME type
     * @param  string $suffix Additional suffix
     *
     * @return string
     * @author Naoki Sawada
     */
    public function getExtentionByMime($mime, $suffix = '')
    {
        static $extTable = null;

        if (is_null($extTable)) {
            $extTable = array_flip(array_unique($this->getMimeTable()));
            foreach ($this->options['mimeMap'] as $pair => $_mime) {
                list($ext) = explode(':', $pair);
                if ($ext !== '*' && !isset($extTable[$_mime])) {
                    $extTable[$_mime] = $ext;
                }
            }
        }

        if ($mime && isset($extTable[$mime])) {
            return $suffix ? ($extTable[$mime] . $suffix) : $extTable[$mime];
        }
        return '';
    }

    /**
     * Set mimetypes allowed to display to client
     *
     * @param  array $mimes
     *
     * @return void
     * @author Dmitry (dio) Levashov
     **/
    public function setMimesFilter($mimes)
    {
        if (is_array($mimes)) {
            $this->onlyMimes = $mimes;
        }
    }

    /**
     * Return root folder hash
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    public function root()
    {
        return $this->encode($this->root);
    }

    /**
     * Return root path
     *
     * @return string
     * @author Naoki Sawada
     **/
    public function getRootPath()
    {
        return $this->root;
    }

    /**
     * Return target path hash
     *
     * @param  string $path
     * @param  string $name
     *
     * @author Naoki Sawada
     * @return string
     */
    public function getHash($path, $name = '')
    {
        if ($name !== '') {
            $path = $this->joinPathCE($path, $name);
        }
        return $this->encode($path);
    }

    /**
     * Return decoded path of target hash
     * This method do not check the stat of target
     * Use method `realpath()` to do check of the stat of target
     *
     * @param  string $hash
     *
     * @author Naoki Sawada
     * @return string
     */
    public function getPath($hash)
    {
        return $this->decode($hash);
    }

    /**
     * Return root or startPath hash
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    public function defaultPath()
    {
        return $this->encode($this->startPath ? $this->startPath : $this->root);
    }

    /**
     * Return volume options required by client:
     *
     * @param $hash
     *
     * @return array
     * @author Dmitry (dio) Levashov
     */
    public function options($hash)
    {
        $create = $createext = array();
        if (isset($this->archivers['create']) && is_array($this->archivers['create'])) {
            foreach ($this->archivers['create'] as $m => $v) {
                $create[] = $m;
                $createext[$m] = $v['ext'];
            }
        }
        $opts = array(
            'path' => $hash ? $this->path($hash) : '',
            'url' => $this->URL,
            'tmbUrl' => (!$this->imgLib && $this->options['tmbFbSelf']) ? 'self' : $this->tmbURL,
            'disabled' => $this->disabled,
            'separator' => $this->separator,
            'copyOverwrite' => intval($this->options['copyOverwrite']),
            'uploadOverwrite' => intval($this->options['uploadOverwrite']),
            'uploadMaxSize' => intval($this->uploadMaxSize),
            'uploadMaxConn' => intval($this->options['uploadMaxConn']),
            'uploadMime' => array(
                'firstOrder' => isset($this->uploadOrder[0]) ? $this->uploadOrder[0] : 'deny',
                'allow' => $this->uploadAllow,
                'deny' => $this->uploadDeny
            ),
            'dispInlineRegex' => $this->options['dispInlineRegex'],
            'jpgQuality' => intval($this->options['jpgQuality']),
            'archivers' => array(
                'create' => $create,
                'extract' => isset($this->archivers['extract']) && is_array($this->archivers['extract']) ? array_keys($this->archivers['extract']) : array(),
                'createext' => $createext
            ),
            'uiCmdMap' => (isset($this->options['uiCmdMap']) && is_array($this->options['uiCmdMap'])) ? $this->options['uiCmdMap'] : array(),
            'syncChkAsTs' => intval($this->options['syncChkAsTs']),
            'syncMinMs' => intval($this->options['syncMinMs']),
            'i18nFolderName' => intval($this->options['i18nFolderName']),
            'tmbCrop' => intval($this->options['tmbCrop']),
            'tmbReqCustomData' => (bool)$this->options['tmbReqCustomData'],
            'substituteImg' => (bool)$this->options['substituteImg'],
            'onetimeUrl' => (bool)$this->options['onetimeUrl'],
        );
        if (!empty($this->options['trashHash'])) {
            $opts['trashHash'] = $this->options['trashHash'];
        }
        if ($hash === null) {
            // call from getRootStatExtra()
            if (!empty($this->options['icon'])) {
                $opts['icon'] = $this->options['icon'];
            }
            if (!empty($this->options['rootCssClass'])) {
                $opts['csscls'] = $this->options['rootCssClass'];
            }
            if (isset($this->options['netkey'])) {
                $opts['netkey'] = $this->options['netkey'];
            }
        }
        return $opts;
    }

    /**
     * Get option value of this volume
     *
     * @param string $name target option name
     *
     * @return NULL|mixed   target option value
     * @author Naoki Sawada
     */
    public function getOption($name)
    {
        return isset($this->options[$name]) ? $this->options[$name] : null;
    }

    /**
     * Get plugin values of this options
     *
     * @param string $name Plugin name
     *
     * @return NULL|array   Plugin values
     * @author Naoki Sawada
     */
    public function getOptionsPlugin($name = '')
    {
        if ($name) {
            return isset($this->options['plugin'][$name]) ? $this->options['plugin'][$name] : array();
        } else {
            return $this->options['plugin'];
        }
    }

    /**
     * Return true if command disabled in options
     *
     * @param  string $cmd command name
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    public function commandDisabled($cmd)
    {
        return in_array($cmd, $this->disabled);
    }

    /**
     * Return true if mime is required mimes list
     *
     * @param  string    $mime  mime type to check
     * @param  array     $mimes allowed mime types list or not set to use client mimes list
     * @param  bool|null $empty what to return on empty list
     *
     * @return bool|null
     * @author Dmitry (dio) Levashov
     * @author Troex Nevelin
     **/
    public function mimeAccepted($mime, $mimes = null, $empty = true)
    {
        $mimes = is_array($mimes) ? $mimes : $this->onlyMimes;
        if (empty($mimes)) {
            return $empty;
        }
        return $mime == 'directory'
            || in_array('all', $mimes)
            || in_array('All', $mimes)
            || in_array($mime, $mimes)
            || in_array(substr($mime, 0, strpos($mime, '/')), $mimes);
    }

    /**
     * Return true if voume is readable.
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    public function isReadable()
    {
        $stat = $this->stat($this->root);
        return $stat['read'];
    }

    /**
     * Return true if copy from this volume allowed
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    public function copyFromAllowed()
    {
        return !!$this->options['copyFrom'];
    }

    /**
     * Return file path related to root with convert encoging
     *
     * @param  string $hash file hash
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    public function path($hash)
    {
        return $this->convEncOut($this->_path($this->convEncIn($this->decode($hash))));
    }

    /**
     * Return file real path if file exists
     *
     * @param  string $hash file hash
     *
     * @return string | false
     * @author Dmitry (dio) Levashov
     **/
    public function realpath($hash)
    {
        $path = $this->decode($hash);
        return $this->stat($path) ? $path : false;
    }

    /**
     * Return list of moved/overwrited files
     *
     * @return array
     * @author Dmitry (dio) Levashov
     **/
    public function removed()
    {
        if ($this->removed) {
            $unsetSubdir = isset($this->sessionCache['subdirs']) ? true : false;
            foreach ($this->removed as $item) {
                if ($item['mime'] === 'directory') {
                    $path = $this->decode($item['hash']);
                    if ($unsetSubdir) {
                        unset($this->sessionCache['subdirs'][$path]);
                    }
                    if ($item['phash'] !== '') {
                        $parent = $this->decode($item['phash']);
                        unset($this->cache[$parent]);
                        if ($this->root === $parent) {
                            $this->sessionCache['rootstat'] = array();
                        }
                        if ($unsetSubdir) {
                            unset($this->sessionCache['subdirs'][$parent]);
                        }
                    }
                }
            }
            $this->removed = array_values($this->removed);
        }
        return $this->removed;
    }

    /**
     * Return list of added files
     *
     * @deprecated
     * @return array
     * @author Naoki Sawada
     **/
    public function added()
    {
        return $this->added;
    }

    /**
     * Clean removed files list
     *
     * @return void
     * @author Dmitry (dio) Levashov
     **/
    public function resetRemoved()
    {
        $this->resetResultStat();
    }

    /**
     * Clean added/removed files list
     *
     * @return void
     **/
    public function resetResultStat()
    {
        $this->removed = array();
        $this->added = array();
    }

    /**
     * Return file/dir hash or first founded child hash with required attr == $val
     *
     * @param  string $hash file hash
     * @param  string $attr attribute name
     * @param  bool   $val  attribute value
     *
     * @return string|false
     * @author Dmitry (dio) Levashov
     **/
    public function closest($hash, $attr, $val)
    {
        return ($path = $this->closestByAttr($this->decode($hash), $attr, $val)) ? $this->encode($path) : false;
    }

    /**
     * Return file info or false on error
     *
     * @param  string $hash file hash
     *
     * @return array|false
     * @internal param bool $realpath add realpath field to file info
     * @author   Dmitry (dio) Levashov
     */
    public function file($hash)
    {
        $file = $this->stat($this->decode($hash));

        return ($file) ? $file : $this->setError(elFinder::ERROR_FILE_NOT_FOUND);
    }

    /**
     * Return folder info
     *
     * @param  string $hash folder hash
     * @param bool    $resolveLink
     *
     * @return array|false
     * @internal param bool $hidden return hidden file info
     * @author   Dmitry (dio) Levashov
     */
    public function dir($hash, $resolveLink = false)
    {
        if (($dir = $this->file($hash)) == false) {
            return $this->setError(elFinder::ERROR_DIR_NOT_FOUND);
        }

        if ($resolveLink && !empty($dir['thash'])) {
            $dir = $this->file($dir['thash']);
        }

        return $dir && $dir['mime'] == 'directory' && empty($dir['hidden'])
            ? $dir
            : $this->setError(elFinder::ERROR_NOT_DIR);
    }

    /**
     * Return directory content or false on error
     *
     * @param  string $hash file hash
     *
     * @return array|false
     * @author Dmitry (dio) Levashov
     **/
    public function scandir($hash)
    {
        if (($dir = $this->dir($hash)) == false) {
            return false;
        }

        $path = $this->decode($hash);
        if ($res = $dir['read']
            ? $this->getScandir($path)
            : $this->setError(elFinder::ERROR_PERM_DENIED)) {

            $dirs = null;
            if ($this->sessionCaching['subdirs'] && isset($this->sessionCache['subdirs'][$path])) {
                $dirs = $this->sessionCache['subdirs'][$path];
            }
            if ($dirs !== null || (isset($dir['dirs']) && $dir['dirs'] != 1)) {
                $_dir = $dir;
                if ($dirs || $this->subdirs($hash)) {
                    $dir['dirs'] = 1;
                } else {
                    unset($dir['dirs']);
                }
                if ($dir !== $_dir) {
                    $this->updateCache($path, $dir);
                }
            }
        }

        return $res;
    }

    /**
     * Return dir files names list
     *
     * @param  string $hash file hash
     * @param null    $intersect
     *
     * @return array|false
     * @author Dmitry (dio) Levashov
     */
    public function ls($hash, $intersect = null)
    {
        if (($dir = $this->dir($hash)) == false || !$dir['read']) {
            return false;
        }

        $list = array();
        $path = $this->decode($hash);

        $check = array();
        if ($intersect) {
            $check = array_flip($intersect);
        }

        foreach ($this->getScandir($path) as $stat) {
            if (empty($stat['hidden']) && (!$check || isset($check[$stat['name']])) && $this->mimeAccepted($stat['mime'])) {
                $list[$stat['hash']] = $stat['name'];
            }
        }

        return $list;
    }

    /**
     * Return subfolders for required folder or false on error
     *
     * @param  string $hash    folder hash or empty string to get tree from root folder
     * @param  int    $deep    subdir deep
     * @param  string $exclude dir hash which subfolders must be exluded from result, required to not get stat twice on cwd subfolders
     *
     * @return array|false
     * @author Dmitry (dio) Levashov
     **/
    public function tree($hash = '', $deep = 0, $exclude = '')
    {
        $path = $hash ? $this->decode($hash) : $this->root;

        if (($dir = $this->stat($path)) == false || $dir['mime'] != 'directory') {
            return false;
        }

        $dirs = $this->gettree($path, $deep > 0 ? $deep - 1 : $this->treeDeep - 1, $exclude ? $this->decode($exclude) : null);
        array_unshift($dirs, $dir);
        return $dirs;
    }

    /**
     * Return part of dirs tree from required dir up to root dir
     *
     * @param  string    $hash   directory hash
     * @param  bool|null $lineal only lineal parents
     *
     * @return array|false
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    public function parents($hash, $lineal = false)
    {
        if (($current = $this->dir($hash)) == false) {
            return false;
        }

        $args = func_get_args();
        // checks 3rd param `$until` (elFinder >= 2.1.24)
        $until = '';
        if (isset($args[2])) {
            $until = $args[2];
        }

        $path = $this->decode($hash);
        $tree = array();

        while ($path && $path != $this->root) {
            elFinder::checkAborted();
            $path = $this->dirnameCE($path);
            if (!($stat = $this->stat($path)) || !empty($stat['hidden']) || !$stat['read']) {
                return false;
            }

            array_unshift($tree, $stat);
            if (!$lineal) {
                foreach ($this->gettree($path, 0) as $dir) {
                    elFinder::checkAborted();
                    if (!isset($tree[$dir['hash']])) {
                        $tree[$dir['hash']] = $dir;
                    }
                }
            }

            if ($until && $until === $this->encode($path)) {
                break;
            }
        }

        return $tree ? array_values($tree) : array($current);
    }

    /**
     * Create thumbnail for required file and return its name or false on failed
     *
     * @param $hash
     *
     * @return false|string
     * @throws ImagickException
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    public function tmb($hash)
    {
        $path = $this->decode($hash);
        $stat = $this->stat($path);

        if (isset($stat['tmb'])) {
            $res = $stat['tmb'] == "1" ? $this->createTmb($path, $stat) : $stat['tmb'];
            if (!$res) {
                list($type) = explode('/', $stat['mime']);
                $fallback = $this->options['resourcePath'] . DIRECTORY_SEPARATOR . strtolower($type) . '.png';
                if (is_file($fallback)) {
                    $res = $this->tmbname($stat);
                    if (!copy($fallback, $this->tmbPath . DIRECTORY_SEPARATOR . $res)) {
                        $res = false;
                    }
                }
            }
            // tmb garbage collection
            if ($res && $this->options['tmbGcMaxlifeHour'] && $this->options['tmbGcPercentage'] > 0) {
                $rand = mt_rand(1, 10000);
                if ($rand <= $this->options['tmbGcPercentage'] * 100) {
                    register_shutdown_function(array('elFinder', 'GlobGC'), $this->tmbPath . DIRECTORY_SEPARATOR . '*.png', $this->options['tmbGcMaxlifeHour'] * 3600);
                }
            }
            return $res;
        }
        return false;
    }

    /**
     * Return file size / total directory size
     *
     * @param  string   file hash
     *
     * @return array
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    public function size($hash)
    {
        return $this->countSize($this->decode($hash));
    }

    /**
     * Open file for reading and return file pointer
     *
     * @param  string   file hash
     *
     * @return Resource|false
     * @author Dmitry (dio) Levashov
     **/
    public function open($hash)
    {
        if (($file = $this->file($hash)) == false
            || $file['mime'] == 'directory') {
            return false;
        }
        // check extra option for network stream pointer
        if (func_num_args() > 1) {
            $opts = func_get_arg(1);
        } else {
            $opts = array();
        }
        return $this->fopenCE($this->decode($hash), 'rb', $opts);
    }

    /**
     * Close file pointer
     *
     * @param  Resource $fp   file pointer
     * @param  string   $hash file hash
     *
     * @return void
     * @author Dmitry (dio) Levashov
     **/
    public function close($fp, $hash)
    {
        $this->fcloseCE($fp, $this->decode($hash));
    }

    /**
     * Create directory and return dir info
     *
     * @param  string $dsthash destination directory hash
     * @param  string $name    directory name
     *
     * @return array|false
     * @author Dmitry (dio) Levashov
     **/
    public function mkdir($dsthash, $name)
    {
        if ($this->commandDisabled('mkdir')) {
            return $this->setError(elFinder::ERROR_PERM_DENIED);
        }

        if (!$this->nameAccepted($name, true)) {
            return $this->setError(elFinder::ERROR_INVALID_DIRNAME);
        }

        if (($dir = $this->dir($dsthash)) == false) {
            return $this->setError(elFinder::ERROR_TRGDIR_NOT_FOUND, '#' . $dsthash);
        }

        $path = $this->decode($dsthash);

        if (!$dir['write'] || !$this->allowCreate($path, $name, true)) {
            return $this->setError(elFinder::ERROR_PERM_DENIED);
        }

        if (substr($name, 0, 1) === '/' || substr($name, 0, 1) === '\\') {
            return $this->setError(elFinder::ERROR_INVALID_DIRNAME);
        }

        $dst = $this->joinPathCE($path, $name);
        $stat = $this->isNameExists($dst);
        if (!empty($stat)) {
            return $this->setError(elFinder::ERROR_EXISTS, $name);
        }
        $this->clearcache();

        $mkpath = $this->convEncOut($this->_mkdir($this->convEncIn($path), $this->convEncIn($name)));
        if ($mkpath) {
            $this->clearstatcache();
            $this->updateSubdirsCache($path, true);
            $this->updateSubdirsCache($mkpath, false);
        }

        return $mkpath ? $this->stat($mkpath) : false;
    }

    /**
     * Create empty file and return its info
     *
     * @param  string $dst  destination directory
     * @param  string $name file name
     *
     * @return array|false
     * @author Dmitry (dio) Levashov
     **/
    public function mkfile($dst, $name)
    {
        if ($this->commandDisabled('mkfile')) {
            return $this->setError(elFinder::ERROR_PERM_DENIED);
        }

        if (!$this->nameAccepted($name, false)) {
            return $this->setError(elFinder::ERROR_INVALID_NAME);
        }

        if (substr($name, 0, 1) === '/' || substr($name, 0, 1) === '\\') {
            return $this->setError(elFinder::ERROR_INVALID_DIRNAME);
        }

        $mimeByName = $this->mimetype($name, true);
        if ($mimeByName && !$this->allowPutMime($mimeByName)) {
            return $this->setError(elFinder::ERROR_UPLOAD_FILE_MIME, $name);
        }

        if (($dir = $this->dir($dst)) == false) {
            return $this->setError(elFinder::ERROR_TRGDIR_NOT_FOUND, '#' . $dst);
        }

        $path = $this->decode($dst);

        if (!$dir['write'] || !$this->allowCreate($path, $name, false)) {
            return $this->setError(elFinder::ERROR_PERM_DENIED);
        }

        if ($this->isNameExists($this->joinPathCE($path, $name))) {
            return $this->setError(elFinder::ERROR_EXISTS, $name);
        }

        $this->clearcache();
        $res = false;
        if ($path = $this->convEncOut($this->_mkfile($this->convEncIn($path), $this->convEncIn($name)))) {
            $this->clearstatcache();
            $res = $this->stat($path);
        }
        return $res;
    }

    /**
     * Rename file and return file info
     *
     * @param  string $hash file hash
     * @param  string $name new file name
     *
     * @return array|false
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    public function rename($hash, $name)
    {
        if ($this->commandDisabled('rename')) {
            return $this->setError(elFinder::ERROR_PERM_DENIED);
        }

        if (!($file = $this->file($hash))) {
            return $this->setError(elFinder::ERROR_FILE_NOT_FOUND);
        }

        if ($name === $file['name']) {
            return $file;
        }

        if (!empty($this->options['netkey']) && !empty($file['isroot'])) {
            // change alias of netmount root
            $rootKey = $this->getRootstatCachekey();
            // delete old cache data
            if ($this->sessionCaching['rootstat']) {
                unset($this->sessionCaching['rootstat'][$rootKey]);
            }
            if (elFinder::$instance->updateNetVolumeOption($this->options['netkey'], 'alias', $name)) {
                $this->clearcache();
                $this->rootName = $this->options['alias'] = $name;
                return $this->stat($this->root);
            } else {
                return $this->setError(elFinder::ERROR_TRGDIR_NOT_FOUND, $name);
            }
        }

        if (!empty($file['locked'])) {
            return $this->setError(elFinder::ERROR_LOCKED, $file['name']);
        }

        $isDir = ($file['mime'] === 'directory');

        if (!$this->nameAccepted($name, $isDir)) {
            return $this->setError($isDir ? elFinder::ERROR_INVALID_DIRNAME : elFinder::ERROR_INVALID_NAME);
        }

        if (!$isDir) {
            $mimeByName = $this->mimetype($name, true);
            if ($mimeByName && !$this->allowPutMime($mimeByName)) {
                return $this->setError(elFinder::ERROR_UPLOAD_FILE_MIME, $name);
            }
        }

        $path = $this->decode($hash);
        $dir = $this->dirnameCE($path);
        $stat = $this->isNameExists($this->joinPathCE($dir, $name));
        if ($stat) {
            return $this->setError(elFinder::ERROR_EXISTS, $name);
        }

        if (!$this->allowCreate($dir, $name, ($file['mime'] === 'directory'))) {
            return $this->setError(elFinder::ERROR_PERM_DENIED);
        }

        $this->rmTmb($file); // remove old name tmbs, we cannot do this after dir move


        if ($path = $this->convEncOut($this->_move($this->convEncIn($path), $this->convEncIn($dir), $this->convEncIn($name)))) {
            $this->clearcache();
            return $this->stat($path);
        }
        return false;
    }

    /**
     * Create file copy with suffix "copy number" and return its info
     *
     * @param  string $hash   file hash
     * @param  string $suffix suffix to add to file name
     *
     * @return array|false
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    public function duplicate($hash, $suffix = 'copy')
    {
        if ($this->commandDisabled('duplicate')) {
            return $this->setError(elFinder::ERROR_COPY, '#' . $hash, elFinder::ERROR_PERM_DENIED);
        }

        if (($file = $this->file($hash)) == false) {
            return $this->setError(elFinder::ERROR_COPY, elFinder::ERROR_FILE_NOT_FOUND);
        }

        $path = $this->decode($hash);
        $dir = $this->dirnameCE($path);
        $name = $this->uniqueName($dir, $file['name'], sprintf($this->options['duplicateSuffix'], $suffix));

        if (!$this->allowCreate($dir, $name, ($file['mime'] === 'directory'))) {
            return $this->setError(elFinder::ERROR_PERM_DENIED);
        }

        return ($path = $this->copy($path, $dir, $name)) == false
            ? false
            : $this->stat($path);
    }

    /**
     * Save uploaded file.
     * On success return array with new file stat and with removed file hash (if existed file was replaced)
     *
     * @param  Resource $fp      file pointer
     * @param  string   $dst     destination folder hash
     * @param           $name
     * @param  string   $tmpname file tmp name - required to detect mime type
     * @param  array    $hashes  exists files hash array with filename as key
     *
     * @return array|false
     * @throws elFinderAbortException
     * @internal param string $src file name
     * @author   Dmitry (dio) Levashov
     */
    public function upload($fp, $dst, $name, $tmpname, $hashes = array())
    {
        if ($this->commandDisabled('upload')) {
            return $this->setError(elFinder::ERROR_PERM_DENIED);
        }

        if (($dir = $this->dir($dst)) == false) {
            return $this->setError(elFinder::ERROR_TRGDIR_NOT_FOUND, '#' . $dst);
        }

        if (empty($dir['write'])) {
            return $this->setError(elFinder::ERROR_PERM_DENIED);
        }

        if (!$this->nameAccepted($name, false)) {
            return $this->setError(elFinder::ERROR_INVALID_NAME);
        }

        $mimeByName = '';
        if ($this->mimeDetect === 'internal') {
            $mime = $this->mimetype($tmpname, $name);
        } else {
            $mime = $this->mimetype($tmpname, $name);
            $mimeByName = $this->mimetype($name, true);
            if ($mime === 'unknown') {
                $mime = $mimeByName;
            }
        }

        if (!$this->allowPutMime($mime) || ($mimeByName && !$this->allowPutMime($mimeByName))) {
            return $this->setError(elFinder::ERROR_UPLOAD_FILE_MIME, '(' . $mime . ')');
        }

        $tmpsize = (int)sprintf('%u', filesize($tmpname));
        if ($this->uploadMaxSize > 0 && $tmpsize > $this->uploadMaxSize) {
            return $this->setError(elFinder::ERROR_UPLOAD_FILE_SIZE);
        }

        $dstpath = $this->decode($dst);
        if (isset($hashes[$name])) {
            $test = $this->decode($hashes[$name]);
            $file = $this->stat($test);
        } else {
            $test = $this->joinPathCE($dstpath, $name);
            $file = $this->isNameExists($test);
        }

        $this->clearcache();

        if ($file && $file['name'] === $name) { // file exists and check filename for item ID based filesystem
            if ($this->uploadOverwrite) {
                if (!$file['write']) {
                    return $this->setError(elFinder::ERROR_PERM_DENIED);
                } elseif ($file['mime'] == 'directory') {
                    return $this->setError(elFinder::ERROR_NOT_REPLACE, $name);
                }
                $this->remove($test);
            } else {
                $name = $this->uniqueName($dstpath, $name, '-', false);
            }
        }

        $stat = array(
            'mime' => $mime,
            'width' => 0,
            'height' => 0,
            'size' => $tmpsize);

        // $w = $h = 0;
        if (strpos($mime, 'image') === 0 && ($s = getimagesize($tmpname))) {
            $stat['width'] = $s[0];
            $stat['height'] = $s[1];
        }
        // $this->clearcache();
        if (($path = $this->saveCE($fp, $dstpath, $name, $stat)) == false) {
            return false;
        }

        $stat = $this->stat($path);
        // Try get URL
        if (empty($stat['url']) && ($url = $this->getContentUrl($stat['hash']))) {
            $stat['url'] = $url;
        }

        return $stat;
    }

    /**
     * Paste files
     *
     * @param  Object $volume source volume
     * @param         $src
     * @param  string $dst    destination dir hash
     * @param  bool   $rmSrc  remove source after copy?
     * @param array   $hashes
     *
     * @return array|false
     * @throws elFinderAbortException
     * @internal param string $source file hash
     * @author   Dmitry (dio) Levashov
     */
    public function paste($volume, $src, $dst, $rmSrc = false, $hashes = array())
    {
        $err = $rmSrc ? elFinder::ERROR_MOVE : elFinder::ERROR_COPY;

        if ($this->commandDisabled('paste')) {
            return $this->setError($err, '#' . $src, elFinder::ERROR_PERM_DENIED);
        }

        if (($file = $volume->file($src, $rmSrc)) == false) {
            return $this->setError($err, '#' . $src, elFinder::ERROR_FILE_NOT_FOUND);
        }

        $name = $file['name'];
        $errpath = $volume->path($file['hash']);

        if (($dir = $this->dir($dst)) == false) {
            return $this->setError($err, $errpath, elFinder::ERROR_TRGDIR_NOT_FOUND, '#' . $dst);
        }

        if (!$dir['write'] || !$file['read']) {
            return $this->setError($err, $errpath, elFinder::ERROR_PERM_DENIED);
        }

        $destination = $this->decode($dst);

        if (($test = $volume->closest($src, $rmSrc ? 'locked' : 'read', $rmSrc))) {
            return $rmSrc
                ? $this->setError($err, $errpath, elFinder::ERROR_LOCKED, $volume->path($test))
                : $this->setError($err, $errpath, empty($file['thash']) ? elFinder::ERROR_PERM_DENIED : elFinder::ERROR_MKOUTLINK);
        }

        if (isset($hashes[$name])) {
            $test = $this->decode($hashes[$name]);
            $stat = $this->stat($test);
        } else {
            $test = $this->joinPathCE($destination, $name);
            $stat = $this->isNameExists($test);
        }
        $this->clearcache();
        $dstDirExists = false;
        if ($stat && $stat['name'] === $name) { // file exists and check filename for item ID based filesystem
            if ($this->options['copyOverwrite']) {
                // do not replace file with dir or dir with file
                if (!$this->isSameType($file['mime'], $stat['mime'])) {
                    return $this->setError(elFinder::ERROR_NOT_REPLACE, $this->path($stat['hash']));
                }
                // existed file is not writable
                if (empty($stat['write'])) {
                    return $this->setError($err, $errpath, elFinder::ERROR_PERM_DENIED);
                }
                if ($this->options['copyJoin']) {
                    if (!empty($stat['locked'])) {
                        return $this->setError(elFinder::ERROR_LOCKED, $this->path($stat['hash']));
                    }
                } else {
                    // existed file locked or has locked child
                    if (($locked = $this->closestByAttr($test, 'locked', true))) {
                        $stat = $this->stat($locked);
                        return $this->setError(elFinder::ERROR_LOCKED, $this->path($stat['hash']));
                    }
                }
                // target is entity file of alias
                if ($volume === $this && ((isset($file['target']) && $test == $file['target']) || $test == $this->decode($src))) {
                    return $this->setError(elFinder::ERROR_REPLACE, $errpath);
                }
                // remove existed file
                if (!$this->options['copyJoin'] || $stat['mime'] !== 'directory') {
                    if (!$this->remove($test)) {
                        return $this->setError(elFinder::ERROR_REPLACE, $this->path($stat['hash']));
                    }
                } else if ($stat['mime'] === 'directory') {
                    $dstDirExists = true;
                }
            } else {
                $name = $this->uniqueName($destination, $name, ' ', false);
            }
        }

        // copy/move inside current volume
        if ($volume === $this) { //  changing == operand to === fixes issue #1285 - Paul Canning 24/03/2016
            $source = $this->decode($src);
            // do not copy into itself
            if ($this->inpathCE($destination, $source)) {
                return $this->setError(elFinder::ERROR_COPY_ITSELF, $errpath);
            }
            $rmDir = false;
            if ($rmSrc) {
                if ($dstDirExists) {
                    $rmDir = true;
                    $method = 'copy';
                } else {
                    $method = 'move';
                }
            } else {
                $method = 'copy';
            }
            $this->clearcache();
            if ($res = ($path = $this->$method($source, $destination, $name)) ? $this->stat($path) : false) {
                if ($rmDir) {
                    $this->remove($source);
                }
            } else {
                return false;
            }
        } else {
            // copy/move from another volume
            if (!$this->options['copyTo'] || !$volume->copyFromAllowed()) {
                return $this->setError(elFinder::ERROR_COPY, $errpath, elFinder::ERROR_PERM_DENIED);
            }

            $this->error = array();
            if (($path = $this->copyFrom($volume, $src, $destination, $name)) == false) {
                return false;
            }

            if ($rmSrc && !$this->error()) {
                if (!$volume->rm($src)) {
                    if ($volume->file($src)) {
                        $this->addError(elFinder::ERROR_RM_SRC);
                    } else {
                        $this->removed[] = $file;
                    }
                }
            }
            $res = $this->stat($path);
        }
        return $res;
    }

    /**
     * Return path info array to archive of target items
     *
     * @param  array $hashes
     *
     * @return array|false
     * @throws Exception
     * @author Naoki Sawada
     */
    public function zipdl($hashes)
    {
        if ($this->commandDisabled('zipdl')) {
            return $this->setError(elFinder::ERROR_PERM_DENIED);
        }

        $archivers = $this->getArchivers();
        $cmd = null;
        if (!$archivers || empty($archivers['create'])) {
            return false;
        }
        $archivers = $archivers['create'];
        if (!$archivers) {
            return false;
        }
        $file = $mime = '';
        foreach (array('zip', 'tgz') as $ext) {
            $mime = $this->mimetype('file.' . $ext, true);
            if (isset($archivers[$mime])) {
                $cmd = $archivers[$mime];
                break;
            }
        }
        if (!$cmd) {
            $cmd = array_shift($archivers);
            if (!empty($ext)) {
                $mime = $this->mimetype('file.' . $ext, true);
            }
        }
        $ext = $cmd['ext'];
        $res = false;
        $mixed = false;
        $hashes = array_values($hashes);
        $dirname = dirname(str_replace($this->separator, DIRECTORY_SEPARATOR, $this->path($hashes[0])));
        $cnt = count($hashes);
        if ($cnt > 1) {
            for ($i = 1; $i < $cnt; $i++) {
                if ($dirname !== dirname(str_replace($this->separator, DIRECTORY_SEPARATOR, $this->path($hashes[$i])))) {
                    $mixed = true;
                    break;
                }
            }
        }
        if ($mixed || $this->root == $this->dirnameCE($this->decode($hashes[0]))) {
            $prefix = $this->rootName;
        } else {
            $prefix = basename($dirname);
        }
        if ($dir = $this->getItemsInHand($hashes)) {
            $tmppre = (substr(PHP_OS, 0, 3) === 'WIN') ? 'zd-' : 'elfzdl-';
            $pdir = dirname($dir);
            // garbage collection (expire 2h)
            register_shutdown_function(array('elFinder', 'GlobGC'), $pdir . DIRECTORY_SEPARATOR . $tmppre . '*', 7200);
            $files = self::localScandir($dir);
            if ($files && ($arc = tempnam($dir, $tmppre))) {
                unlink($arc);
                $arc = $arc . '.' . $ext;
                $name = basename($arc);
                if ($arc = $this->makeArchive($dir, $files, $name, $cmd)) {
                    $file = tempnam($pdir, $tmppre);
                    unlink($file);
                    $res = rename($arc, $file);
                    $this->rmdirRecursive($dir);
                }
            }
        }
        return $res ? array('path' => $file, 'ext' => $ext, 'mime' => $mime, 'prefix' => $prefix) : false;
    }

    /**
     * Return file contents
     *
     * @param  string $hash file hash
     *
     * @return string|false
     * @author Dmitry (dio) Levashov
     **/
    public function getContents($hash)
    {
        $file = $this->file($hash);

        if (!$file) {
            return $this->setError(elFinder::ERROR_FILE_NOT_FOUND);
        }

        if ($file['mime'] == 'directory') {
            return $this->setError(elFinder::ERROR_NOT_FILE);
        }

        if (!$file['read']) {
            return $this->setError(elFinder::ERROR_PERM_DENIED);
        }

        if ($this->getMaxSize > 0 && $file['size'] > $this->getMaxSize) {
            return $this->setError(elFinder::ERROR_UPLOAD_FILE_SIZE);
        }

        return $file['size'] ? $this->_getContents($this->convEncIn($this->decode($hash), true)) : '';
    }

    /**
     * Put content in text file and return file info.
     *
     * @param  string $hash    file hash
     * @param  string $content new file content
     *
     * @return array|false
     * @author Dmitry (dio) Levashov
     **/
    public function putContents($hash, $content)
    {
        if ($this->commandDisabled('edit')) {
            return $this->setError(elFinder::ERROR_PERM_DENIED);
        }

        $path = $this->decode($hash);

        if (!($file = $this->file($hash))) {
            return $this->setError(elFinder::ERROR_FILE_NOT_FOUND);
        }

        if (!$file['write']) {
            return $this->setError(elFinder::ERROR_PERM_DENIED);
        }

        // check data cheme
        if (preg_match('~^\0data:(.+?/.+?);base64,~', $content, $m)) {
            $dMime = $m[1];
            if ($file['size'] > 0 && $dMime !== $file['mime']) {
                return $this->setError(elFinder::ERROR_PERM_DENIED);
            }
            $content = base64_decode(substr($content, strlen($m[0])));
        }

        // check MIME
        $name = $this->basenameCE($path);
        $mime = '';
        $mimeByName = $this->mimetype($name, true);
        if ($this->mimeDetect !== 'internal') {
            if ($tp = $this->tmpfile()) {
                fwrite($tp, $content);
                $info = stream_get_meta_data($tp);
                $filepath = $info['uri'];
                $mime = $this->mimetype($filepath, $name);
                fclose($tp);
            }
        }
        if (!$this->allowPutMime($mimeByName) || ($mime && !$this->allowPutMime($mime))) {
            return $this->setError(elFinder::ERROR_UPLOAD_FILE_MIME);
        }

        $this->clearcache();
        $res = false;
        if ($this->convEncOut($this->_filePutContents($this->convEncIn($path), $content))) {
            $this->rmTmb($file);
            $this->clearstatcache();
            $res = $this->stat($path);
        }
        return $res;
    }

    /**
     * Extract files from archive
     *
     * @param  string $hash archive hash
     * @param null    $makedir
     *
     * @return array|bool
     * @author Dmitry (dio) Levashov,
     * @author Alexey Sukhotin
     */
    public function extract($hash, $makedir = null)
    {
        if ($this->commandDisabled('extract')) {
            return $this->setError(elFinder::ERROR_PERM_DENIED);
        }

        if (($file = $this->file($hash)) == false) {
            return $this->setError(elFinder::ERROR_FILE_NOT_FOUND);
        }

        $archiver = isset($this->archivers['extract'][$file['mime']])
            ? $this->archivers['extract'][$file['mime']]
            : array();

        if (!$archiver) {
            return $this->setError(elFinder::ERROR_NOT_ARCHIVE);
        }

        $path = $this->decode($hash);
        $parent = $this->stat($this->dirnameCE($path));

        if (!$file['read'] || !$parent['write']) {
            return $this->setError(elFinder::ERROR_PERM_DENIED);
        }
        $this->clearcache();
        $this->extractToNewdir = is_null($makedir) ? 'auto' : (bool)$makedir;

        if ($path = $this->convEncOut($this->_extract($this->convEncIn($path), $archiver))) {
            if (is_array($path)) {
                foreach ($path as $_k => $_p) {
                    $path[$_k] = $this->stat($_p);
                }
            } else {
                $path = $this->stat($path);
            }
            return $path;
        } else {
            return false;
        }
    }

    /**
     * Add files to archive
     *
     * @param        $hashes
     * @param        $mime
     * @param string $name
     *
     * @return array|bool
     * @throws Exception
     */
    public function archive($hashes, $mime, $name = '')
    {
        if ($this->commandDisabled('archive')) {
            return $this->setError(elFinder::ERROR_PERM_DENIED);
        }

        if ($name !== '' && !$this->nameAccepted($name, false)) {
            return $this->setError(elFinder::ERROR_INVALID_NAME);
        }

        $archiver = isset($this->archivers['create'][$mime])
            ? $this->archivers['create'][$mime]
            : array();

        if (!$archiver) {
            return $this->setError(elFinder::ERROR_ARCHIVE_TYPE);
        }

        $files = array();
        $useRemoteArchive = !empty($this->options['useRemoteArchive']);

        $dir = '';
        foreach ($hashes as $hash) {
            if (($file = $this->file($hash)) == false) {
                return $this->setError(elFinder::ERROR_FILE_NOT_FOUND, '#' . $hash);
            }
            if (!$file['read']) {
                return $this->setError(elFinder::ERROR_PERM_DENIED);
            }
            $path = $this->decode($hash);
            if ($dir === '') {
                $dir = $this->dirnameCE($path);
                $stat = $this->stat($dir);
                if (!$stat['write']) {
                    return $this->setError(elFinder::ERROR_PERM_DENIED);
                }
            }

            $files[] = $useRemoteArchive ? $hash : $this->basenameCE($path);
        }

        if ($name === '') {
            $name = count($files) == 1 ? $files[0] : 'Archive';
        } else {
            $name = str_replace(array('/', '\\'), '_', preg_replace('/\.' . preg_quote($archiver['ext'], '/') . '$/i', '', $name));
        }
        $name .= '.' . $archiver['ext'];
        $name = $this->uniqueName($dir, $name, '');
        $this->clearcache();
        if ($useRemoteArchive) {
            return ($path = $this->remoteArchive($files, $name, $archiver)) ? $this->stat($path) : false;
        } else {
            return ($path = $this->convEncOut($this->_archive($this->convEncIn($dir), $this->convEncIn($files), $this->convEncIn($name), $archiver))) ? $this->stat($path) : false;
        }
    }

    /**
     * Create an archive from remote items
     *
     * @param      array  $hashes files hashes list
     * @param      string $name   archive name
     * @param      array  $arc    archiver options
     *
     * @return     string|boolean  path of created archive
     * @throws     Exception
     */
    protected function remoteArchive($hashes, $name, $arc)
    {
        $resPath = false;
        $file0 = $this->file($hashes[0]);
        if ($file0 && ($dir = $this->getItemsInHand($hashes))) {
            $files = self::localScandir($dir);
            if ($files) {
                if ($arc = $this->makeArchive($dir, $files, $name, $arc)) {
                    if ($fp = fopen($arc, 'rb')) {
                        $fstat = stat($arc);
                        $stat = array(
                            'size' => $fstat['size'],
                            'ts' => $fstat['mtime'],
                            'mime' => $this->mimetype($arc, $name)
                        );
                        $path = $this->decode($file0['phash']);
                        $resPath = $this->saveCE($fp, $path, $name, $stat);
                        fclose($fp);
                    }
                }
            }
            $this->rmdirRecursive($dir);
        }
        return $resPath;
    }

    /**
     * Resize image
     *
     * @param  string $hash       image file
     * @param  int    $width      new width
     * @param  int    $height     new height
     * @param  int    $x          X start poistion for crop
     * @param  int    $y          Y start poistion for crop
     * @param  string $mode       action how to mainpulate image
     * @param  string $bg         background color
     * @param  int    $degree     rotete degree
     * @param  int    $jpgQuality JEPG quality (1-100)
     *
     * @return array|false
     * @throws ImagickException
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     * @author Alexey Sukhotin
     * @author nao-pon
     * @author Troex Nevelin
     */
    public function resize($hash, $width, $height, $x, $y, $mode = 'resize', $bg = '', $degree = 0, $jpgQuality = null)
    {
        if ($this->commandDisabled('resize')) {
            return $this->setError(elFinder::ERROR_PERM_DENIED);
        }

        if ($mode === 'rotate' && $degree == 0) {
            return array('losslessRotate' => ($this->procExec(ELFINDER_EXIFTRAN_PATH . ' -h') === 0 || $this->procExec(ELFINDER_JPEGTRAN_PATH . ' -version') === 0));
        }

        if (($file = $this->file($hash)) == false) {
            return $this->setError(elFinder::ERROR_FILE_NOT_FOUND);
        }

        if (!$file['write'] || !$file['read']) {
            return $this->setError(elFinder::ERROR_PERM_DENIED);
        }

        $path = $this->decode($hash);

        $work_path = $this->getWorkFile($this->encoding ? $this->convEncIn($path, true) : $path);

        if (!$work_path || !is_writable($work_path)) {
            if ($work_path && $path !== $work_path && is_file($work_path)) {
                unlink($work_path);
            }
            return $this->setError(elFinder::ERROR_PERM_DENIED);
        }

        if ($this->imgLib !== 'imagick' && $this->imgLib !== 'convert') {
            if (elFinder::isAnimationGif($work_path)) {
                return $this->setError(elFinder::ERROR_UNSUPPORT_TYPE);
            }
        }

        if (elFinder::isAnimationPng($work_path)) {
            return $this->setError(elFinder::ERROR_UNSUPPORT_TYPE);
        }

        switch ($mode) {

            case 'propresize':
                $result = $this->imgResize($work_path, $width, $height, true, true, null, $jpgQuality);
                break;

            case 'crop':
                $result = $this->imgCrop($work_path, $width, $height, $x, $y, null, $jpgQuality);
                break;

            case 'fitsquare':
                $result = $this->imgSquareFit($work_path, $width, $height, 'center', 'middle', ($bg ? $bg : $this->options['tmbBgColor']), null, $jpgQuality);
                break;

            case 'rotate':
                $result = $this->imgRotate($work_path, $degree, ($bg ? $bg : $this->options['bgColorFb']), null, $jpgQuality);
                break;

            default:
                $result = $this->imgResize($work_path, $width, $height, false, true, null, $jpgQuality);
                break;
        }

        $ret = false;
        if ($result) {
            $this->rmTmb($file);
            $this->clearstatcache();
            $fstat = stat($work_path);
            $imgsize = getimagesize($work_path);
            if ($path !== $work_path) {
                $file['size'] = $fstat['size'];
                $file['ts'] = $fstat['mtime'];
                if ($imgsize) {
                    $file['width'] = $imgsize[0];
                    $file['height'] = $imgsize[1];
                }
                if ($fp = fopen($work_path, 'rb')) {
                    $ret = $this->saveCE($fp, $this->dirnameCE($path), $this->basenameCE($path), $file);
                    fclose($fp);
                }
            } else {
                $ret = true;
            }
            if ($ret) {
                $this->clearcache();
                $ret = $this->stat($path);
                if ($imgsize) {
                    $ret['width'] = $imgsize[0];
                    $ret['height'] = $imgsize[1];
                }
            }
        }
        if ($path !== $work_path) {
            is_file($work_path) && unlink($work_path);
        }

        return $ret;
    }

    /**
     * Remove file/dir
     *
     * @param  string $hash file hash
     *
     * @return bool
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    public function rm($hash)
    {
        return $this->commandDisabled('rm')
            ? $this->setError(elFinder::ERROR_PERM_DENIED)
            : $this->remove($this->decode($hash));
    }

    /**
     * Search files
     *
     * @param  string $q search string
     * @param  array  $mimes
     * @param null    $hash
     *
     * @return array
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    public function search($q, $mimes, $hash = null)
    {
        $res = array();
        $matchMethod = null;
        $args = func_get_args();
        if (!empty($args[3])) {
            $matchMethod = 'searchMatch' . $args[3];
            if (!is_callable(array($this, $matchMethod))) {
                return array();
            }
        }

        $dir = null;
        if ($hash) {
            $dir = $this->decode($hash);
            $stat = $this->stat($dir);
            if (!$stat || $stat['mime'] !== 'directory' || !$stat['read']) {
                $q = '';
            }
        }
        if ($mimes && $this->onlyMimes) {
            $mimes = array_intersect($mimes, $this->onlyMimes);
            if (!$mimes) {
                $q = '';
            }
        }
        $this->searchStart = time();

        $qs = preg_split('/"([^"]+)"| +/', $q, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
        $query = $excludes = array();
        foreach ($qs as $_q) {
            $_q = trim($_q);
            if ($_q !== '') {
                if ($_q[0] === '-') {
                    if (isset($_q[1])) {
                        $excludes[] = substr($_q, 1);
                    }
                } else {
                    $query[] = $_q;
                }
            }
        }
        if (!$query) {
            $q = '';
        } else {
            $q = join(' ', $query);
            $this->doSearchCurrentQuery = array(
                'q' => $q,
                'excludes' => $excludes,
                'matchMethod' => $matchMethod
            );
        }

        if ($q === '' || $this->commandDisabled('search')) {
            return $res;
        }

        // valided regex $this->options['searchExDirReg']
        if ($this->options['searchExDirReg']) {
            if (false === preg_match($this->options['searchExDirReg'], '')) {
                $this->options['searchExDirReg'] = '';
            }
        }

        // check the leaf root too
        if (!$mimes && (is_null($dir) || $dir == $this->root)) {
            $rootStat = $this->stat($this->root);
            if (!empty($rootStat['phash'])) {
                if ($this->stripos($rootStat['name'], $q) !== false) {
                    $res = array($rootStat);
                }
            }
        }

        return array_merge($res, $this->doSearch(is_null($dir) ? $this->root : $dir, $q, $mimes));
    }

    /**
     * Return image dimensions
     *
     * @param  string $hash file hash
     *
     * @return array|string
     * @author Dmitry (dio) Levashov
     **/
    public function dimensions($hash)
    {
        if (($file = $this->file($hash)) == false) {
            return false;
        }
        // Throw additional parameters for some drivers
        if (func_num_args() > 1) {
            $args = func_get_arg(1);
        } else {
            $args = array();
        }
        return $this->convEncOut($this->_dimensions($this->convEncIn($this->decode($hash)), $file['mime'], $args));
    }

    /**
     * Return has subdirs
     *
     * @param  string $hash file hash
     *
     * @return bool
     * @author Naoki Sawada
     **/
    public function subdirs($hash)
    {
        return (bool)$this->subdirsCE($this->decode($hash));
    }

    /**
     * Return content URL (for netmout volume driver)
     * If file.url == 1 requests from JavaScript client with XHR
     *
     * @param string $hash    file hash
     * @param array  $options options array
     *
     * @return boolean|string
     * @author Naoki Sawada
     */
    public function getContentUrl($hash, $options = array())
    {
        if (($file = $this->file($hash)) === false) {
            return false;
        }
        if (!empty($options['onetime']) && $this->options['onetimeUrl']) {
            if (is_callable($this->options['onetimeUrl'])) {
                return call_user_func_array($this->options['onetimeUrl'], array($file, $options, $this));
            } else {
                $ret = false;
                if ($tmpdir = elFinder::getStaticVar('commonTempPath')) {
                    if ($source = $this->open($hash)) {
                        if ($_dat = tempnam($tmpdir, 'ELF')) {
                            $token = md5($_dat . session_id());
                            $dat = $tmpdir . DIRECTORY_SEPARATOR . 'ELF' . $token;
                            if (rename($_dat, $dat)) {
                                $info = stream_get_meta_data($source);
                                if (!empty($info['uri'])) {
                                    $tmp = $info['uri'];
                                } else {
                                    $tmp = tempnam($tmpdir, 'ELF');
                                    if ($dest = fopen($tmp, 'wb')) {
                                        if (!stream_copy_to_stream($source, $dest)) {
                                            $tmp = false;
                                        }
                                        fclose($dest);
                                    }
                                }
                                $this->close($source, $hash);
                                if ($tmp) {
                                    $info = array(
                                        'file' => base64_encode($tmp),
                                        'name' => $file['name'],
                                        'mime' => $file['mime'],
                                        'ts' => $file['ts']
                                    );
                                    if (file_put_contents($dat, json_encode($info))) {
                                        $conUrl = elFinder::getConnectorUrl();
                                        $ret = $conUrl . (strpos($conUrl, '?') !== false? '&' : '?') . 'cmd=file&onetime=1&target=' . $token;

                                    }
                                }
                                if (!$ret) {
                                    unlink($dat);
                                }
                            } else {
                                unlink($_dat);
                            }
                        }
                    }
                }
                return $ret;
            }
        }
        if (empty($file['url']) && $this->URL) {
            $path = str_replace($this->separator, '/', substr($this->decode($hash), strlen(rtrim($this->root, '/' . $this->separator)) + 1));
            if ($this->encoding) {
                $path = $this->convEncIn($path, true);
            }
            $path = str_replace('%2F', '/', rawurlencode($path));
            return $this->URL . $path;
        } else {
            $ret = false;
            if (!empty($file['url']) && $file['url'] != 1) {
                return $file['url'];
            } else if (!empty($options['temporary']) && ($tempInfo = $this->getTempLinkInfo('temp_' . md5($hash . session_id())))) {
                if (is_readable($tempInfo['path'])) {
                    touch($tempInfo['path']);
                    $ret = $tempInfo['url'] . '?' . rawurlencode($file['name']);
                } else if ($source = $this->open($hash)) {
                    if ($dest = fopen($tempInfo['path'], 'wb')) {
                        if (stream_copy_to_stream($source, $dest)) {
                            $ret = $tempInfo['url'] . '?' . rawurlencode($file['name']);
                        }
                        fclose($dest);
                    }
                    $this->close($source, $hash);
                }
            }
            return $ret;
        }
    }

    /**
     * Get temporary contents link infomation
     *
     * @param string $name
     *
     * @return boolean|array
     * @author Naoki Sawada
     */
    public function getTempLinkInfo($name = null)
    {
        if ($this->tmpLinkPath) {
            if (!$name) {
                $name = 'temp_' . md5($_SERVER['REMOTE_ADDR'] . (string)microtime(true));
            } else if (substr($name, 0, 5) !== 'temp_') {
                $name = 'temp_' . $name;
            }
            register_shutdown_function(array('elFinder', 'GlobGC'), $this->tmpLinkPath . DIRECTORY_SEPARATOR . 'temp_*', elFinder::$tmpLinkLifeTime);
            return array(
                'path' => $path = $this->tmpLinkPath . DIRECTORY_SEPARATOR . $name,
                'url' => $this->tmpLinkUrl . '/' . rawurlencode($name)
            );
        }
        return false;
    }

    /**
     * Get URL of substitute image by request args `substitute` or 4th argument $maxSize
     *
     * @param string   $target  Target hash
     * @param array    $srcSize Size info array [width, height]
     * @param resource $srcfp   Source file file pointer
     * @param integer  $maxSize Maximum pixel of substitute image
     *
     * @return boolean
     * @throws ImagickException
     * @throws elFinderAbortException
     */
    public function getSubstituteImgLink($target, $srcSize, $srcfp = null, $maxSize = null)
    {
        $url = false;
        $file = $this->file($target);
        $force = !in_array($file['mime'], array('image/jpeg', 'image/png', 'image/gif'));
        if (!$maxSize) {
            $args = elFinder::$currentArgs;
            if (!empty($args['substitute'])) {
                $maxSize = $args['substitute'];
            }
        }
        if ($maxSize && $srcSize[0] && $srcSize[1]) {
            if ($this->getOption('substituteImg')) {
                $maxSize = intval($maxSize);
                $zoom = min(($maxSize / $srcSize[0]), ($maxSize / $srcSize[1]));
                if ($force || $zoom < 1) {
                    $width = round($srcSize[0] * $zoom);
                    $height = round($srcSize[1] * $zoom);
                    $jpgQuality = 50;
                    $preserveExif = false;
                    $unenlarge = true;
                    $checkAnimated = true;
                    $destformat = $file['mime'] === 'image/jpeg'? null : 'png';
                    if (!$srcfp) {
                        elFinder::checkAborted();
                        $srcfp = $this->open($target);
                    }
                    if ($srcfp && ($tempLink = $this->getTempLinkInfo())) {
                        elFinder::checkAborted();
                        $dest = fopen($tempLink['path'], 'wb');
                        if ($dest && stream_copy_to_stream($srcfp, $dest)) {
                            fclose($dest);
                            if ($this->imageUtil('resize', $tempLink['path'], compact('width', 'height', 'jpgQuality', 'preserveExif', 'unenlarge', 'checkAnimated', 'destformat'))) {
                                $url = $tempLink['url'];
                                // set expire to 1 min left
                                touch($tempLink['path'], time() - elFinder::$tmpLinkLifeTime + 60);
                            } else {
                                unlink($tempLink['path']);
                            }
                        }
                        $this->close($srcfp, $target);
                    }
                }
            }
        }

        return $url;
    }

    /**
     * Return temp path
     *
     * @return string
     * @author Naoki Sawada
     */
    public function getTempPath()
    {
        $tempPath = null;
        if (isset($this->tmpPath) && $this->tmpPath && is_writable($this->tmpPath)) {
            $tempPath = $this->tmpPath;
        } else if (isset($this->tmp) && $this->tmp && is_writable($this->tmp)) {
            $tempPath = $this->tmp;
        } else if (elFinder::getStaticVar('commonTempPath') && is_writable(elFinder::getStaticVar('commonTempPath'))) {
            $tempPath = elFinder::getStaticVar('commonTempPath');
        } else if (function_exists('sys_get_temp_dir')) {
            $tempPath = sys_get_temp_dir();
        } else if ($this->tmbPathWritable) {
            $tempPath = $this->tmbPath;
        }
        if ($tempPath && DIRECTORY_SEPARATOR !== '/') {
            $tempPath = str_replace('/', DIRECTORY_SEPARATOR, $tempPath);
        }
		if(opendir($tempPath)){
			return $tempPath;
		} else if (defined( 'WP_TEMP_DIR' )) {
			return get_temp_dir();
		} else {
			$custom_temp_path = WP_CONTENT_DIR.'/temp';
			if (!is_dir($custom_temp_path)) {
				mkdir($custom_temp_path, 0777, true);
			}
			return $custom_temp_path;
		}
    }

    /**
     * (Make &) Get upload taget dirctory hash
     *
     * @param string $baseTargetHash
     * @param string $path
     * @param array  $result
     *
     * @return boolean|string
     * @author Naoki Sawada
     */
    public function getUploadTaget($baseTargetHash, $path, & $result)
    {
        $base = $this->decode($baseTargetHash);
        $targetHash = $baseTargetHash;
        $path = ltrim($path, $this->separator);
        $dirs = explode($this->separator, $path);
        array_pop($dirs);
        foreach ($dirs as $dir) {
            $targetPath = $this->joinPathCE($base, $dir);
            if (!$_realpath = $this->realpath($this->encode($targetPath))) {
                if ($stat = $this->mkdir($targetHash, $dir)) {
                    $result['added'][] = $stat;
                    $targetHash = $stat['hash'];
                    $base = $this->decode($targetHash);
                } else {
                    return false;
                }
            } else {
                $targetHash = $this->encode($_realpath);
                if ($this->dir($targetHash)) {
                    $base = $this->decode($targetHash);
                } else {
                    return false;
                }
            }
        }
        return $targetHash;
    }

    /**
     * Return this uploadMaxSize value
     *
     * @return integer
     * @author Naoki Sawada
     */
    public function getUploadMaxSize()
    {
        return $this->uploadMaxSize;
    }

    public function setUploadOverwrite($var)
    {
        $this->uploadOverwrite = (bool)$var;
    }

    /**
     * Image file utility
     *
     * @param string $mode    'resize', 'rotate', 'propresize', 'crop', 'fitsquare'
     * @param string $src     Image file local path
     * @param array  $options excute options
     *
     * @return bool
     * @throws ImagickException
     * @throws elFinderAbortException
     * @author Naoki Sawada
     */
    public function imageUtil($mode, $src, $options = array())
    {
        if (!isset($options['jpgQuality'])) {
            $options['jpgQuality'] = intval($this->options['jpgQuality']);
        }
        if (!isset($options['bgcolor'])) {
            $options['bgcolor'] = '#ffffff';
        }
        if (!isset($options['bgColorFb'])) {
            $options['bgColorFb'] = $this->options['bgColorFb'];
        }
        $destformat = !empty($options['destformat'])? $options['destformat'] : null;

        // check 'width' ,'height'
        if (in_array($mode, array('resize', 'propresize', 'crop', 'fitsquare'))) {
            if (empty($options['width']) || empty($options['height'])) {
                return false;
            }
        }

        if (!empty($options['checkAnimated'])) {
            if ($this->imgLib !== 'imagick' && $this->imgLib !== 'convert') {
                if (elFinder::isAnimationGif($src)) {
                    return false;
                }
            }
            if (elFinder::isAnimationPng($src)) {
                return false;
            }
        }

        switch ($mode) {
            case 'rotate':
                if (empty($options['degree'])) {
                    return true;
                }
                return (bool)$this->imgRotate($src, $options['degree'], $options['bgColorFb'], $destformat, $options['jpgQuality']);

            case 'resize':
                return (bool)$this->imgResize($src, $options['width'], $options['height'], false, true, $destformat, $options['jpgQuality'], $options);

            case 'propresize':
                return (bool)$this->imgResize($src, $options['width'], $options['height'], true, true, $destformat, $options['jpgQuality'], $options);

            case 'crop':
                if (isset($options['x']) && isset($options['y'])) {
                    return (bool)$this->imgCrop($src, $options['width'], $options['height'], $options['x'], $options['y'], $destformat, $options['jpgQuality']);
                }
                break;

            case 'fitsquare':
                return (bool)$this->imgSquareFit($src, $options['width'], $options['height'], 'center', 'middle', $options['bgcolor'], $destformat, $options['jpgQuality']);

        }
        return false;
    }

    /**
     * Convert Video To Image by ffmpeg
     *
     * @param  string $file video source file path
     * @param  array  $stat file stat array
     * @param  object $self volume driver object
     * @param  int    $ss   start seconds
     *
     * @return bool
     * @throws elFinderAbortException
     * @author Naoki Sawada
     */
    public function ffmpegToImg($file, $stat, $self, $ss = null)
    {
        $name = basename($file);
        $path = dirname($file);
        $tmp = $path . DIRECTORY_SEPARATOR . md5($name);
        // register auto delete on shutdown
        $GLOBALS['elFinderTempFiles'][$tmp] = true;
        if (rename($file, $tmp)) {
            if ($ss === null) {
                // specific start time by file name (xxx^[sec].[extention] - video^3.mp4)
                if (preg_match('/\^(\d+(?:\.\d+)?)\.[^.]+$/', $stat['name'], $_m)) {
                    $ss = $_m[1];
                } else {
                    $ss = $this->options['tmbVideoConvSec'];
                }
            }
            $cmd = sprintf(ELFINDER_FFMPEG_PATH . ' -i %s -ss 00:00:%.3f -vframes 1 -f image2 -- %s', escapeshellarg($tmp), $ss, escapeshellarg($file));
            $r = ($this->procExec($cmd) === 0);
            clearstatcache();
            if ($r && $ss > 0 && !file_exists($file)) {
                // Retry by half of $ss
                $ss = max(intval($ss / 2), 0);
                rename($tmp, $file);
                $r = $this->ffmpegToImg($file, $stat, $self, $ss);
            } else {
                unlink($tmp);
            }
            return $r;
        }
        return false;
    }

    /**
     * Creates a temporary file and return file pointer
     *
     * @return resource|boolean
     */
    public function tmpfile()
    {
        if ($tmp = $this->getTempFile()) {
            return fopen($tmp, 'wb');
        }
        return false;
    }

    /**
     * Save error message
     *
     * @param  array  error
     *
     * @return boolean false
     * @author Naoki Sawada
     **/
    protected function setError()
    {
        $this->error = array();
        $this->addError(func_get_args());
        return false;
    }

    /**
     * Add error message
     *
     * @param  array  error
     *
     * @return false
     * @author Dmitry(dio) Levashov
     **/
    protected function addError()
    {
        foreach (func_get_args() as $err) {
            if (is_array($err)) {
                foreach($err as $er) {
                    $this->addError($er);
                }
            } else {
                $this->error[] = (string)$err;
            }
        }
        return false;
    }

    /*********************************************************************/
    /*                               FS API                              */
    /*********************************************************************/

    /***************** server encoding support *******************/

    /**
     * Return parent directory path (with convert encoding)
     *
     * @param  string $path file path
     *
     * @return string
     * @author Naoki Sawada
     **/
    protected function dirnameCE($path)
    {
        $dirname = (!$this->encoding) ? $this->_dirname($path) : $this->convEncOut($this->_dirname($this->convEncIn($path)));
        // check to infinite loop prevention
        return ($dirname != $path) ? $dirname : '';
    }

    /**
     * Return file name (with convert encoding)
     *
     * @param  string $path file path
     *
     * @return string
     * @author Naoki Sawada
     **/
    protected function basenameCE($path)
    {
        return (!$this->encoding) ? $this->_basename($path) : $this->convEncOut($this->_basename($this->convEncIn($path)));
    }

    /**
     * Join dir name and file name and return full path. (with convert encoding)
     * Some drivers (db) use int as path - so we give to concat path to driver itself
     *
     * @param  string $dir  dir path
     * @param  string $name file name
     *
     * @return string
     * @author Naoki Sawada
     **/
    protected function joinPathCE($dir, $name)
    {
        return (!$this->encoding) ? $this->_joinPath($dir, $name) : $this->convEncOut($this->_joinPath($this->convEncIn($dir), $this->convEncIn($name)));
    }

    /**
     * Return normalized path (with convert encoding)
     *
     * @param  string $path file path
     *
     * @return string
     * @author Naoki Sawada
     **/
    protected function normpathCE($path)
    {
        return (!$this->encoding) ? $this->_normpath($path) : $this->convEncOut($this->_normpath($this->convEncIn($path)));
    }

    /**
     * Return file path related to root dir (with convert encoding)
     *
     * @param  string $path file path
     *
     * @return string
     * @author Naoki Sawada
     **/
    protected function relpathCE($path)
    {
        return (!$this->encoding) ? $this->_relpath($path) : $this->convEncOut($this->_relpath($this->convEncIn($path)));
    }

    /**
     * Convert path related to root dir into real path (with convert encoding)
     *
     * @param  string $path rel file path
     *
     * @return string
     * @author Naoki Sawada
     **/
    protected function abspathCE($path)
    {
        return (!$this->encoding) ? $this->_abspath($path) : $this->convEncOut($this->_abspath($this->convEncIn($path)));
    }

    /**
     * Return true if $path is children of $parent (with convert encoding)
     *
     * @param  string $path   path to check
     * @param  string $parent parent path
     *
     * @return bool
     * @author Naoki Sawada
     **/
    protected function inpathCE($path, $parent)
    {
        return (!$this->encoding) ? $this->_inpath($path, $parent) : $this->convEncOut($this->_inpath($this->convEncIn($path), $this->convEncIn($parent)));
    }

    /**
     * Open file and return file pointer (with convert encoding)
     *
     * @param  string $path file path
     * @param string  $mode
     *
     * @return false|resource
     * @internal param bool $write open file for writing
     * @author   Naoki Sawada
     */
    protected function fopenCE($path, $mode = 'rb')
    {
        // check extra option for network stream pointer
        if (func_num_args() > 2) {
            $opts = func_get_arg(2);
        } else {
            $opts = array();
        }
        return (!$this->encoding) ? $this->_fopen($path, $mode, $opts) : $this->convEncOut($this->_fopen($this->convEncIn($path), $mode, $opts));
    }

    /**
     * Close opened file (with convert encoding)
     *
     * @param  resource $fp   file pointer
     * @param  string   $path file path
     *
     * @return bool
     * @author Naoki Sawada
     **/
    protected function fcloseCE($fp, $path = '')
    {
        return (!$this->encoding) ? $this->_fclose($fp, $path) : $this->convEncOut($this->_fclose($fp, $this->convEncIn($path)));
    }

    /**
     * Create new file and write into it from file pointer. (with convert encoding)
     * Return new file path or false on error.
     *
     * @param  resource $fp   file pointer
     * @param  string   $dir  target dir path
     * @param  string   $name file name
     * @param  array    $stat file stat (required by some virtual fs)
     *
     * @return bool|string
     * @author Naoki Sawada
     **/
    protected function saveCE($fp, $dir, $name, $stat)
    {
        $res = (!$this->encoding) ? $this->_save($fp, $dir, $name, $stat) : $this->convEncOut($this->_save($fp, $this->convEncIn($dir), $this->convEncIn($name), $this->convEncIn($stat)));
        if ($res !== false) {
            $this->clearstatcache();
        }
        return $res;
    }

    /**
     * Return true if path is dir and has at least one childs directory (with convert encoding)
     *
     * @param  string $path dir path
     *
     * @return bool
     * @author Naoki Sawada
     **/
    protected function subdirsCE($path)
    {
        if ($this->sessionCaching['subdirs']) {
            if (isset($this->sessionCache['subdirs'][$path]) && !$this->isMyReload()) {
                return $this->sessionCache['subdirs'][$path];
            }
        }
        $hasdir = (bool)((!$this->encoding) ? $this->_subdirs($path) : $this->convEncOut($this->_subdirs($this->convEncIn($path))));
        $this->updateSubdirsCache($path, $hasdir);
        return $hasdir;
    }

    /**
     * Return files list in directory (with convert encoding)
     *
     * @param  string $path dir path
     *
     * @return array
     * @author Naoki Sawada
     **/
    protected function scandirCE($path)
    {
        return (!$this->encoding) ? $this->_scandir($path) : $this->convEncOut($this->_scandir($this->convEncIn($path)));
    }

    /**
     * Create symlink (with convert encoding)
     *
     * @param  string $source    file to link to
     * @param  string $targetDir folder to create link in
     * @param  string $name      symlink name
     *
     * @return bool
     * @author Naoki Sawada
     **/
    protected function symlinkCE($source, $targetDir, $name)
    {
        return (!$this->encoding) ? $this->_symlink($source, $targetDir, $name) : $this->convEncOut($this->_symlink($this->convEncIn($source), $this->convEncIn($targetDir), $this->convEncIn($name)));
    }

    /***************** paths *******************/

    /**
     * Encode path into hash
     *
     * @param  string  file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     * @author Troex Nevelin
     **/
    protected function encode($path)
    {
        if ($path !== '') {

            // cut ROOT from $path for security reason, even if hacker decodes the path he will not know the root
            $p = $this->relpathCE($path);
            // if reqesting root dir $path will be empty, then assign '/' as we cannot leave it blank for crypt
            if ($p === '') {
                $p = $this->separator;
            }
            // change separator
            if ($this->separatorForHash) {
                $p = str_replace($this->separator, $this->separatorForHash, $p);
            }
            // TODO crypt path and return hash
            $hash = $this->crypt($p);
            // hash is used as id in HTML that means it must contain vaild chars
            // make base64 html safe and append prefix in begining
            $hash = strtr(base64_encode($hash), '+/=', '-_.');
            // remove dots '.' at the end, before it was '=' in base64
            $hash = rtrim($hash, '.');
            // append volume id to make hash unique
            return $this->id . $hash;
        }
        //TODO: Add return statement here
    }

    /**
     * Decode path from hash
     *
     * @param  string  file hash
     *
     * @return string
     * @author Dmitry (dio) Levashov
     * @author Troex Nevelin
     **/
    protected function decode($hash)
    {
        if (strpos($hash, $this->id) === 0) {
            // cut volume id after it was prepended in encode
            $h = substr($hash, strlen($this->id));
            // replace HTML safe base64 to normal
            $h = base64_decode(strtr($h, '-_.', '+/='));
            // TODO uncrypt hash and return path
            $path = $this->uncrypt($h);
            // change separator
            if ($this->separatorForHash) {
                $path = str_replace($this->separatorForHash, $this->separator, $path);
            }
            // append ROOT to path after it was cut in encode
            return $this->abspathCE($path);//$this->root.($path === $this->separator ? '' : $this->separator.$path);
        }
        return '';
    }

    /**
     * Return crypted path
     * Not implemented
     *
     * @param  string  path
     *
     * @return mixed
     * @author Dmitry (dio) Levashov
     **/
    protected function crypt($path)
    {
        return $path;
    }

    /**
     * Return uncrypted path
     * Not implemented
     *
     * @param  mixed  hash
     *
     * @return mixed
     * @author Dmitry (dio) Levashov
     **/
    protected function uncrypt($hash)
    {
        return $hash;
    }

    /**
     * Validate file name based on $this->options['acceptedName'] regexp or function
     *
     * @param  string $name file name
     * @param  bool   $isDir
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     */
    protected function nameAccepted($name, $isDir = false)
    {
        if (json_encode($name) === false) {
            return false;
        }
        $nameValidator = $isDir ? $this->dirnameValidator : $this->nameValidator;
        if ($nameValidator) {
            if (is_callable($nameValidator)) {
                $res = call_user_func($nameValidator, $name);
                return $res;
            }
            if (preg_match($nameValidator, '') !== false) {
                return preg_match($nameValidator, $name);
            }
        }
        return true;
    }

    /**
     * Return session rootstat cache key
     *
     * @return string
     */
    protected function getRootstatCachekey()
    {
        return md5($this->root . (isset($this->options['alias']) ? $this->options['alias'] : ''));
    }

    /**
     * Return new unique name based on file name and suffix
     *
     * @param         $dir
     * @param         $name
     * @param  string $suffix suffix append to name
     * @param bool    $checkNum
     * @param int     $start
     *
     * @return string
     * @internal param string $path file path
     * @author   Dmitry (dio) Levashov
     */
    public function uniqueName($dir, $name, $suffix = ' copy', $checkNum = true, $start = 1)
    {
        static $lasts = null;

        if ($lasts === null) {
            $lasts = array();
        }

        $ext = '';

        $splits = elFinder::splitFileExtention($name);
        if ($splits[1]) {
            $ext = '.' . $splits[1];
            $name = $splits[0];
        }

        if ($checkNum && preg_match('/(' . preg_quote($suffix, '/') . ')(\d*)$/i', $name, $m)) {
            $i = $m[2];
            $name = substr($name, 0, strlen($name) - strlen($m[2]));
        } else {
            $i = $start;
            $name .= $suffix;
        }
        $max = (int)$i + 100000;

        if (isset($lasts[$name])) {
            $i = max($i, $lasts[$name]);
        }

        while ($i <= $max) {
            $n = $name . ($i >= 0 ? $i : '') . $ext;
            if (!$this->isNameExists($this->joinPathCE($dir, $n))) {
                $this->clearcache();
                $lasts[$name] = ++$i;
                return $n;
            }
            $i++;
        }
        return $name . md5($dir) . $ext;
    }

    /**
     * Converts character encoding from UTF-8 to server's one
     *
     * @param  mixed  $var           target string or array var
     * @param  bool   $restoreLocale do retore global locale, default is false
     * @param  string $unknown       replaces character for unknown
     *
     * @return mixed
     * @author Naoki Sawada
     */
    public function convEncIn($var = null, $restoreLocale = false, $unknown = '_')
    {
        return (!$this->encoding) ? $var : $this->convEnc($var, 'UTF-8', $this->encoding, $this->options['locale'], $restoreLocale, $unknown);
    }

    /**
     * Converts character encoding from server's one to UTF-8
     *
     * @param  mixed  $var           target string or array var
     * @param  bool   $restoreLocale do retore global locale, default is true
     * @param  string $unknown       replaces character for unknown
     *
     * @return mixed
     * @author Naoki Sawada
     */
    public function convEncOut($var = null, $restoreLocale = true, $unknown = '_')
    {
        return (!$this->encoding) ? $var : $this->convEnc($var, $this->encoding, 'UTF-8', $this->options['locale'], $restoreLocale, $unknown);
    }

    /**
     * Converts character encoding (base function)
     *
     * @param  mixed  $var     target string or array var
     * @param  string $from    from character encoding
     * @param  string $to      to character encoding
     * @param  string $locale  local locale
     * @param         $restoreLocale
     * @param  string $unknown replaces character for unknown
     *
     * @return mixed
     */
    protected function convEnc($var, $from, $to, $locale, $restoreLocale, $unknown = '_')
    {
        if (strtoupper($from) !== strtoupper($to)) {
            if ($locale) {
                setlocale(LC_ALL, $locale);
            }
            if (is_array($var)) {
                $_ret = array();
                foreach ($var as $_k => $_v) {
                    $_ret[$_k] = $this->convEnc($_v, $from, $to, '', false, $unknown = '_');
                }
                $var = $_ret;
            } else {
                $_var = false;
                if (is_string($var)) {
                    $_var = $var;
                    $errlev = error_reporting();
                    error_reporting($errlev ^ E_NOTICE);
                    if (false !== ($_var = iconv($from, $to . '//TRANSLIT', $_var))) {
                        $_var = str_replace('?', $unknown, $_var);
                    }
                    error_reporting($errlev);
                }
                if ($_var !== false) {
                    $var = $_var;
                }
            }
            if ($restoreLocale) {
                setlocale(LC_ALL, elFinder::$locale);
            }
        }
        return $var;
    }

    /**
     * Normalize MIME-Type by options['mimeMap']
     *
     * @param      string $type MIME-Type
     * @param      string $name Filename
     * @param      string $ext  File extention without first dot (optional)
     *
     * @return     string  Normalized MIME-Type
     */
    public function mimeTypeNormalize($type, $name, $ext = '')
    {
        if ($ext === '') {
            $ext = (false === $pos = strrpos($name, '.')) ? '' : substr($name, $pos + 1);
        }
        $_checkKey = strtolower($ext . ':' . $type);
        if ($type === '') {
            $_keylen = strlen($_checkKey);
            foreach ($this->options['mimeMap'] as $_key => $_type) {
                if (substr($_key, 0, $_keylen) === $_checkKey) {
                    $type = $_type;
                    break;
                }
            }
        } else if (isset($this->options['mimeMap'][$_checkKey])) {
            $type = $this->options['mimeMap'][$_checkKey];
        } else {
            $_checkKey = strtolower($ext . ':*');
            if (isset($this->options['mimeMap'][$_checkKey])) {
                $type = $this->options['mimeMap'][$_checkKey];
            } else {
                $_checkKey = strtolower('*:' . $type);
                if (isset($this->options['mimeMap'][$_checkKey])) {
                    $type = $this->options['mimeMap'][$_checkKey];
                }
            }
        }
        return $type;
    }

    /*********************** util mainly for inheritance class *********************/

    /**
     * Get temporary filename. Tempfile will be removed when after script execution finishes or exit() is called.
     * When needing the unique file to a path, give $path to parameter.
     *
     * @param  string $path for get unique file to a path
     *
     * @return string|false
     * @author Naoki Sawada
     */
    protected function getTempFile($path = '')
    {
        static $cache = array();

        $key = '';
        if ($path !== '') {
            $key = $this->id . '#' . $path;
            if (isset($cache[$key])) {
                return $cache[$key];
            }
        }

        if ($tmpdir = $this->getTempPath()) {
            $name = tempnam($tmpdir, 'ELF');
            if ($key) {
                $cache[$key] = $name;
            }
            // register auto delete on shutdown
            $GLOBALS['elFinderTempFiles'][$name] = true;
            return $name;
        }

        return false;
    }

    /**
     * File path of local server side work file path
     *
     * @param  string $path path need convert encoding to server encoding
     *
     * @return string
     * @author Naoki Sawada
     */
    protected function getWorkFile($path)
    {
        if ($wfp = $this->tmpfile()) {
            if ($fp = $this->_fopen($path)) {
                while (!feof($fp)) {
                    fwrite($wfp, fread($fp, 8192));
                }
                $info = stream_get_meta_data($wfp);
                fclose($wfp);
                if ($info && !empty($info['uri'])) {
                    return $info['uri'];
                }
            }
        }
        return false;
    }

    /**
     * Get image size array with `dimensions`
     *
     * @param string $path path need convert encoding to server encoding
     * @param string $mime file mime type
     *
     * @return array|false
     * @throws ImagickException
     * @throws elFinderAbortException
     */
    public function getImageSize($path, $mime = '')
    {
        $size = false;
        if ($mime === '' || strtolower(substr($mime, 0, 5)) === 'image') {
            if ($work = $this->getWorkFile($path)) {
                if ($size = getimagesize($work)) {
                    $size['dimensions'] = $size[0] . 'x' . $size[1];
                    $srcfp = fopen($work, 'rb');
                    $cArgs = elFinder::$currentArgs;
                    if (!empty($cArgs['target']) && $subImgLink = $this->getSubstituteImgLink($cArgs['target'], $size, $srcfp)) {
                        $size['url'] = $subImgLink;
                    }
                }
            }
            is_file($work) && unlink($work);
        }
        return $size;
    }

    /**
     * Delete dirctory trees
     *
     * @param string $localpath path need convert encoding to server encoding
     *
     * @return boolean
     * @throws elFinderAbortException
     * @author Naoki Sawada
     */
    protected function delTree($localpath)
    {
        foreach ($this->_scandir($localpath) as $p) {
            elFinder::checkAborted();
            $stat = $this->stat($this->convEncOut($p));
            $this->convEncIn();
            ($stat['mime'] === 'directory') ? $this->delTree($p) : $this->_unlink($p);
        }
        $res = $this->_rmdir($localpath);
        $res && $this->clearstatcache();
        return $res;
    }

    /**
     * Copy items to a new temporary directory on the local server
     *
     * @param  array  $hashes  target hashes
     * @param  string $dir     destination directory (for recurcive)
     * @param  string $canLink it can use link() (for recurcive)
     *
     * @return string|false    saved path name
     * @throws elFinderAbortException
     * @author Naoki Sawada
     */
    protected function getItemsInHand($hashes, $dir = null, $canLink = null)
    {
        static $banChrs = null;
        static $totalSize = 0;

        if  (is_null($banChrs)) {
            $banChrs = DIRECTORY_SEPARATOR !== '/'? array('\\', '/', ':', '*', '?', '"', '<', '>', '|') : array('\\', '/');
        }

        if (is_null($dir)) {
            $totalSize = 0;
            if (!$tmpDir = $this->getTempPath()) {
                return false;
            }
            $dir = tempnam($tmpDir, 'elf');
            if (!unlink($dir) || !mkdir($dir, 0700, true)) {
                return false;
            }
            register_shutdown_function(array($this, 'rmdirRecursive'), $dir);
        }
        if (is_null($canLink)) {
            $canLink = ($this instanceof elFinderVolumeLocalFileSystem);
        }
        elFinder::checkAborted();
        $res = true;
        $files = array();
        foreach ($hashes as $hash) {
            if (($file = $this->file($hash)) == false) {
                continue;
            }
            if (!$file['read']) {
                continue;
            }

            $name = $file['name'];
            // remove ctrl characters
            $name = preg_replace('/[[:cntrl:]]+/', '', $name);
            // replace ban characters
            $name = str_replace($banChrs, '_', $name);

            // for call from search results
            if (isset($files[$name])) {
                $name = preg_replace('/^(.*?)(\..*)?$/', '$1_' . $files[$name]++ . '$2', $name);
            } else {
                $files[$name] = 1;
            }
            $target = $dir . DIRECTORY_SEPARATOR . $name;

            if ($file['mime'] === 'directory') {
                $chashes = array();
                $_files = $this->scandir($hash);
                foreach ($_files as $_file) {
                    if ($file['read']) {
                        $chashes[] = $_file['hash'];
                    }
                }
                if (($res = mkdir($target, 0700, true)) && $chashes) {
                    $res = $this->getItemsInHand($chashes, $target, $canLink);
                }
                if (!$res) {
                    break;
                }
                !empty($file['ts']) && touch($target, $file['ts']);
            } else {
                $path = $this->decode($hash);
                if (!$canLink || !($canLink = $this->localFileSystemSymlink($path, $target))) {
                    if (file_exists($target)) {
                        unlink($target);
                    }
                    if ($fp = $this->fopenCE($path)) {
                        if ($tfp = fopen($target, 'wb')) {
                            $totalSize += stream_copy_to_stream($fp, $tfp);
                            fclose($tfp);
                        }
                        !empty($file['ts']) && touch($target, $file['ts']);
                        $this->fcloseCE($fp, $path);
                    }
                } else {
                    $totalSize += filesize($path);
                }
                if ($this->options['maxArcFilesSize'] > 0 && $this->options['maxArcFilesSize'] < $totalSize) {
                    $res = $this->setError(elFinder::ERROR_ARC_MAXSIZE);
                }
            }
        }
        return $res ? $dir : false;
    }

    /*********************** file stat *********************/

    /**
     * Check file attribute
     *
     * @param  string $path  file path
     * @param  string $name  attribute name (read|write|locked|hidden)
     * @param  bool   $val   attribute value returned by file system
     * @param  bool   $isDir path is directory (true: directory, false: file)
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function attr($path, $name, $val = null, $isDir = null)
    {
        if (!isset($this->defaults[$name])) {
            return false;
        }

        $relpath = $this->relpathCE($path);
        if ($this->separator !== '/') {
            $relpath = str_replace($this->separator, '/', $relpath);
        }
        $relpath = '/' . $relpath;

        $perm = null;

        if ($this->access) {
            $perm = call_user_func($this->access, $name, $path, $this->options['accessControlData'], $this, $isDir, $relpath);
            if ($perm !== null) {
                return !!$perm;
            }
        }

        foreach ($this->attributes as $attrs) {
            if (isset($attrs[$name]) && isset($attrs['pattern']) && preg_match($attrs['pattern'], $relpath)) {
                $perm = $attrs[$name];
                break;
            }
        }

        return $perm === null ? (is_null($val) ? $this->defaults[$name] : $val) : !!$perm;
    }

    /**
     * Return true if file with given name can be created in given folder.
     *
     * @param string $dir  parent dir path
     * @param string $name new file name
     * @param null   $isDir
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     */
    protected function allowCreate($dir, $name, $isDir = null)
    {
        return $this->attr($this->joinPathCE($dir, $name), 'write', true, $isDir);
    }

    /**
     * Return true if file MIME type can save with check uploadOrder config.
     *
     * @param string $mime
     *
     * @return boolean
     */
    protected function allowPutMime($mime)
    {
        // logic based on http://httpd.apache.org/docs/2.2/mod/mod_authz_host.html#order
        $allow = $this->mimeAccepted($mime, $this->uploadAllow, null);
        $deny = $this->mimeAccepted($mime, $this->uploadDeny, null);
        if (strtolower($this->uploadOrder[0]) == 'allow') { // array('allow', 'deny'), default is to 'deny'
            $res = false; // default is deny
            if (!$deny && ($allow === true)) { // match only allow
                $res = true;
            }// else (both match | no match | match only deny) { deny }
        } else { // array('deny', 'allow'), default is to 'allow' - this is the default rule
            $res = true; // default is allow
            if (($deny === true) && !$allow) { // match only deny
                $res = false;
            } // else (both match | no match | match only allow) { allow }
        }
        return $res;
    }

    /**
     * Return fileinfo
     *
     * @param  string $path file cache
     *
     * @return array|bool
     * @author Dmitry (dio) Levashov
     **/
    protected function stat($path)
    {
        if ($path === false || is_null($path)) {
            return false;
        }
        $is_root = ($path == $this->root);
        if ($is_root) {
            $rootKey = $this->getRootstatCachekey();
            if ($this->sessionCaching['rootstat'] && !isset($this->sessionCache['rootstat'])) {
                $this->sessionCache['rootstat'] = array();
            }
            if (!isset($this->cache[$path]) && !$this->isMyReload()) {
                // need $path as key for netmount/netunmount
                if ($this->sessionCaching['rootstat'] && isset($this->sessionCache['rootstat'][$rootKey])) {
                    if ($ret = $this->sessionCache['rootstat'][$rootKey]) {
                        if ($this->options['rootRev'] === $ret['rootRev']) {
                            if (isset($this->options['phash'])) {
                                $ret['isroot'] = 1;
                                $ret['phash'] = $this->options['phash'];
                            }
                            return $ret;
                        }
                    }
                }
            }
        }
        $rootSessCache = false;
        if (isset($this->cache[$path])) {
            $ret = $this->cache[$path];
        } else {
            if ($is_root && !empty($this->options['rapidRootStat']) && is_array($this->options['rapidRootStat']) && !$this->needOnline) {
                $ret = $this->updateCache($path, $this->options['rapidRootStat'], true);
            } else {
                $ret = $this->updateCache($path, $this->convEncOut($this->_stat($this->convEncIn($path))), true);
                if ($is_root && !empty($rootKey) && $this->sessionCaching['rootstat']) {
                    $rootSessCache = true;
                }
            }
        } 
        if ($is_root) {
            if ($ret) {
                $this->rootModified = false;
                if ($rootSessCache) {
                    $this->sessionCache['rootstat'][$rootKey] = $ret;
                }
                if (isset($this->options['phash'])) {
                    $ret['isroot'] = 1;
                    $ret['phash'] = $this->options['phash'];
                }
            } else if (!empty($rootKey) && $this->sessionCaching['rootstat']) {
                unset($this->sessionCache['rootstat'][$rootKey]);
            }
        }
        return $ret;
    }

    /**
     * Get root stat extra key values
     *
     * @return array stat extras
     * @author Naoki Sawada
     */
    protected function getRootStatExtra()
    {
        $stat = array();
        if ($this->rootName) {
            $stat['name'] = $this->rootName;
        }
        $stat['rootRev'] = $this->options['rootRev'];
        $stat['options'] = $this->options(null);
        return $stat;
    }

    /**
     * Return fileinfo based on filename
     * For item ID based path file system
     * Please override if needed on each drivers
     *
     * @param  string $path file cache
     *
     * @return array
     */
    protected function isNameExists($path)
    {
        return $this->stat($path);
    }

    /**
     * Put file stat in cache and return it
     *
     * @param  string $path file path
     * @param  array  $stat file stat
     *
     * @return array
     * @author Dmitry (dio) Levashov
     **/
    protected function updateCache($path, $stat)
    {
        if (empty($stat) || !is_array($stat)) {
            return $this->cache[$path] = array();
        }

        if (func_num_args() > 2) {
            $fromStat = func_get_arg(2);
        } else {
            $fromStat = false;
        }

        $stat['hash'] = $this->encode($path);

        $root = $path == $this->root;
        $parent = '';

        if ($root) {
            $stat = array_merge($stat, $this->getRootStatExtra());
        } else {
            if (!isset($stat['name']) || $stat['name'] === '') {
                $stat['name'] = $this->basenameCE($path);
            }
            if (empty($stat['phash'])) {
                $parent = $this->dirnameCE($path);
                $stat['phash'] = $this->encode($parent);
            } else {
                $parent = $this->decode($stat['phash']);
            }
        }

        // name check
        if (isset($stat['name']) && !$jeName = json_encode($stat['name'])) {
            return $this->cache[$path] = array();
        }
        // fix name if required
        if ($this->options['utf8fix'] && $this->options['utf8patterns'] && $this->options['utf8replace']) {
            $stat['name'] = json_decode(str_replace($this->options['utf8patterns'], $this->options['utf8replace'], $jeName));
        }

        if (!isset($stat['size'])) {
            $stat['size'] = 'unknown';
        }

        $mime = isset($stat['mime']) ? $stat['mime'] : '';
        if ($isDir = ($mime === 'directory')) {
            $stat['volumeid'] = $this->id;
        } else {
            if (empty($stat['mime']) || $stat['size'] == 0) {
                $stat['mime'] = $this->mimetype($stat['name'], true, $stat['size'], $mime);
            } else {
                $stat['mime'] = $this->mimeTypeNormalize($stat['mime'], $stat['name']);
            }
        }

        $stat['read'] = intval($this->attr($path, 'read', isset($stat['read']) ? !!$stat['read'] : null, $isDir));
        $stat['write'] = intval($this->attr($path, 'write', isset($stat['write']) ? !!$stat['write'] : null, $isDir));
        if ($root) {
            $stat['locked'] = 1;
            if ($this->options['type'] !== '') {
                $stat['type'] = $this->options['type'];
            }
        } else {
            // lock when parent directory is not writable
            if (!isset($stat['locked'])) {
                $pstat = $this->stat($parent);
                if (isset($pstat['write']) && !$pstat['write']) {
                    $stat['locked'] = true;
                }
            }
            if ($this->attr($path, 'locked', isset($stat['locked']) ? !!$stat['locked'] : null, $isDir)) {
                $stat['locked'] = 1;
            } else {
                unset($stat['locked']);
            }
        }

        if ($root) {
            unset($stat['hidden']);
        } elseif ($this->attr($path, 'hidden', isset($stat['hidden']) ? !!$stat['hidden'] : null, $isDir)
            || !$this->mimeAccepted($stat['mime'])) {
            $stat['hidden'] = 1;
        } else {
            unset($stat['hidden']);
        }

        if ($stat['read'] && empty($stat['hidden'])) {

            if ($isDir) {
                // caching parent's subdirs
                if ($parent) {
                    $this->updateSubdirsCache($parent, true);
                }
                // for dir - check for subdirs
                if ($this->options['checkSubfolders']) {
                    if (!isset($stat['dirs']) && intval($this->options['checkSubfolders']) === -1) {
                        $stat['dirs'] = -1;
                    }
                    if (isset($stat['dirs'])) {
                        if ($stat['dirs']) {
                            if ($stat['dirs'] == -1) {
                                $stat['dirs'] = ($this->sessionCaching['subdirs'] && isset($this->sessionCache['subdirs'][$path])) ? (int)$this->sessionCache['subdirs'][$path] : -1;
                            } else {
                                $stat['dirs'] = 1;
                            }
                        } else {
                            unset($stat['dirs']);
                        }
                    } elseif (!empty($stat['alias']) && !empty($stat['target'])) {
                        $stat['dirs'] = isset($this->cache[$stat['target']])
                            ? intval(isset($this->cache[$stat['target']]['dirs']))
                            : $this->subdirsCE($stat['target']);

                    } elseif ($this->subdirsCE($path)) {
                        $stat['dirs'] = 1;
                    }
                } else {
                    $stat['dirs'] = 1;
                }
                if ($this->options['dirUrlOwn'] === true) {
                    // Set `null` to use the client option `commandsOptions.info.nullUrlDirLinkSelf = true`
                    $stat['url'] = null;
                } else if ($this->options['dirUrlOwn'] === 'hide') {
                    // to hide link in info dialog of the elFinder client
                    $stat['url'] = '';
                }
            } else {
                // for files - check for thumbnails
                $p = isset($stat['target']) ? $stat['target'] : $path;
                if ($this->tmbURL && !isset($stat['tmb']) && $this->canCreateTmb($p, $stat)) {
                    $tmb = $this->gettmb($p, $stat);
                    $stat['tmb'] = $tmb ? $tmb : 1;
                }

            }
            if (!isset($stat['url']) && $this->URL && $this->encoding) {
                $_path = str_replace($this->separator, '/', substr($path, strlen($this->root) + 1));
                $stat['url'] = rtrim($this->URL, '/') . '/' . str_replace('%2F', '/', rawurlencode((substr(PHP_OS, 0, 3) === 'WIN') ? $_path : $this->convEncIn($_path, true)));
            }
        } else {
            if ($isDir) {
                unset($stat['dirs']);
            }
        }

        if (!empty($stat['alias']) && !empty($stat['target'])) {
            $stat['thash'] = $this->encode($stat['target']);
            //$this->cache[$stat['target']] = $stat;
            unset($stat['target']);
        }

        $this->cache[$path] = $stat;

        if (!$fromStat && $root && $this->sessionCaching['rootstat']) {
            // to update session cache
            $this->stat($path);
        }

        return $stat;
    }

    /**
     * Get stat for folder content and put in cache
     *
     * @param  string $path
     *
     * @return void
     * @author Dmitry (dio) Levashov
     **/
    protected function cacheDir($path)
    {
        $this->dirsCache[$path] = array();
        $hasDir = false;

        foreach ($this->scandirCE($path) as $p) {
            if (($stat = $this->stat($p)) && empty($stat['hidden'])) {
                if (!$hasDir && $stat['mime'] === 'directory') {
                    $hasDir = true;
                }
                $this->dirsCache[$path][] = $p;
            }
        }

        $this->updateSubdirsCache($path, $hasDir);
    }

    /**
     * Clean cache
     *
     * @return void
     * @author Dmitry (dio) Levashov
     **/
    protected function clearcache()
    {
        $this->cache = $this->dirsCache = array();
    }

    /**
     * Return file mimetype
     *
     * @param  string      $path file path
     * @param  string|bool $name
     * @param  integer     $size
     * @param  string      $mime was notified from the volume driver
     *
     * @return string
     * @author Dmitry (dio) Levashov
     */
    protected function mimetype($path, $name = '', $size = null, $mime = null)
    {
        $type = '';
        $nameCheck = false;

        if ($name === '') {
            $name = $path;
        } else if ($name === true) {
            $name = $path;
            $nameCheck = true;
        }
        if (!$this instanceof elFinderVolumeLocalFileSystem) {
            $nameCheck = true;
        }
        $ext = (false === $pos = strrpos($name, '.')) ? '' : strtolower(substr($name, $pos + 1));
        if (!$nameCheck && $size === null) {
            $size = file_exists($path) ? filesize($path) : -1;
        }
        if (!$nameCheck && is_readable($path) && $size > 0) {
            // detecting by contents
            if ($this->mimeDetect === 'finfo') {
                $type = finfo_file($this->finfo, $path);
            } else if ($this->mimeDetect === 'mime_content_type') {
                $type = mime_content_type($path);
            }
            if ($type) {
                $type = explode(';', $type);
                $type = trim($type[0]);
                if ($ext && preg_match('~^application/(?:octet-stream|(?:x-)?zip|xml)$~', $type)) {
                    // load default MIME table file "mime.types"
                    if (!elFinderVolumeDriver::$mimetypesLoaded) {
                        elFinderVolumeDriver::loadMimeTypes();
                    }
                    if (isset(elFinderVolumeDriver::$mimetypes[$ext])) {
                        $type = elFinderVolumeDriver::$mimetypes[$ext];
                    }
                } else if ($ext === 'js' && preg_match('~^text/~', $type)) {
                    $type = 'text/javascript';
                }
            }
        }
        if (!$type) {
            // detecting by filename
            $type = elFinderVolumeDriver::mimetypeInternalDetect($name);
            if ($type === 'unknown') {
                if ($mime) {
                    $type = $mime;
                } else {
                    $type = ($size == 0) ? 'text/plain' : $this->options['mimeTypeUnknown'];
                }
            }
        }

        // mime type normalization
        $type = $this->mimeTypeNormalize($type, $name, $ext);

        return $type;
    }

    /**
     * Load file of mime.types
     *
     * @param string $mimeTypesFile The mime types file
     */
    static protected function loadMimeTypes($mimeTypesFile = '')
    {
        if (!elFinderVolumeDriver::$mimetypesLoaded) {
            elFinderVolumeDriver::$mimetypesLoaded = true;
            $file = false;
            if (!empty($mimeTypesFile) && file_exists($mimeTypesFile)) {
                $file = $mimeTypesFile;
            } elseif (elFinder::$defaultMimefile && file_exists(elFinder::$defaultMimefile)) {
                $file = elFinder::$defaultMimefile;
            } elseif (file_exists(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mime.types')) {
                $file = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mime.types';
            } elseif (file_exists(dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR . 'mime.types')) {
                $file = dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR . 'mime.types';
            }

            if ($file && file_exists($file)) {
                $mimecf = file($file);

                foreach ($mimecf as $line_num => $line) {
                    if (!preg_match('/^\s*#/', $line)) {
                        $mime = preg_split('/\s+/', $line, -1, PREG_SPLIT_NO_EMPTY);
                        for ($i = 1, $size = count($mime); $i < $size; $i++) {
                            if (!isset(self::$mimetypes[$mime[$i]])) {
                                self::$mimetypes[$mime[$i]] = $mime[0];
                            }
                        }
                    }
                }
            }
        }
    }

    /**
     * Detect file mimetype using "internal" method or Loading mime.types with $path = ''
     *
     * @param  string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    static protected function mimetypeInternalDetect($path = '')
    {
        // load default MIME table file "mime.types"
        if (!elFinderVolumeDriver::$mimetypesLoaded) {
            elFinderVolumeDriver::loadMimeTypes();
        }
        $ext = '';
        if ($path) {
            $pinfo = pathinfo($path);
            $ext = isset($pinfo['extension']) ? strtolower($pinfo['extension']) : '';
        }
        return ($ext && isset(elFinderVolumeDriver::$mimetypes[$ext])) ? elFinderVolumeDriver::$mimetypes[$ext] : 'unknown';
    }

    /**
     * Return file/total directory size infomation
     *
     * @param  string $path file path
     *
     * @return array
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function countSize($path)
    {

        elFinder::checkAborted();

        $result = array('size' => 0, 'files' => 0, 'dirs' => 0);
        $stat = $this->stat($path);

        if (empty($stat) || !$stat['read'] || !empty($stat['hidden'])) {
            $result['size'] = 'unknown';
            return $result;
        }

        if ($stat['mime'] !== 'directory') {
            $result['size'] = intval($stat['size']);
            $result['files'] = 1;
            return $result;
        }

        $result['dirs'] = 1;
        $subdirs = $this->options['checkSubfolders'];
        $this->options['checkSubfolders'] = true;
        foreach ($this->getScandir($path) as $stat) {
            if ($isDir = ($stat['mime'] === 'directory' && $stat['read'])) {
                ++$result['dirs'];
            } else {
                ++$result['files'];
            }
            $res = $isDir
                ? $this->countSize($this->decode($stat['hash']))
                : (isset($stat['size']) ? array('size' => intval($stat['size'])) : array());
            if (!empty($res['size']) && is_numeric($res['size'])) {
                $result['size'] += $res['size'];
            }
            if (!empty($res['files']) && is_numeric($res['files'])) {
                $result['files'] += $res['files'];
            }
            if (!empty($res['dirs']) && is_numeric($res['dirs'])) {
                $result['dirs'] += $res['dirs'];
                --$result['dirs'];
            }
        }
        $this->options['checkSubfolders'] = $subdirs;
        return $result;
    }

    /**
     * Return true if all mimes is directory or files
     *
     * @param  string $mime1 mimetype
     * @param  string $mime2 mimetype
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function isSameType($mime1, $mime2)
    {
        return ($mime1 == 'directory' && $mime1 == $mime2) || ($mime1 != 'directory' && $mime2 != 'directory');
    }

    /**
     * If file has required attr == $val - return file path,
     * If dir has child with has required attr == $val - return child path
     *
     * @param  string $path file path
     * @param  string $attr attribute name
     * @param  bool   $val  attribute value
     *
     * @return string|false
     * @author Dmitry (dio) Levashov
     **/
    protected function closestByAttr($path, $attr, $val)
    {
        $stat = $this->stat($path);

        if (empty($stat)) {
            return false;
        }

        $v = isset($stat[$attr]) ? $stat[$attr] : false;

        if ($v == $val) {
            return $path;
        }

        return $stat['mime'] == 'directory'
            ? $this->childsByAttr($path, $attr, $val)
            : false;
    }

    /**
     * Return first found children with required attr == $val
     *
     * @param  string $path file path
     * @param  string $attr attribute name
     * @param  bool   $val  attribute value
     *
     * @return string|false
     * @author Dmitry (dio) Levashov
     **/
    protected function childsByAttr($path, $attr, $val)
    {
        foreach ($this->scandirCE($path) as $p) {
            if (($_p = $this->closestByAttr($p, $attr, $val)) != false) {
                return $_p;
            }
        }
        return false;
    }

    protected function isMyReload($target = '', $ARGtarget = '')
    {
        if ($this->rootModified || (!empty($this->ARGS['cmd']) && $this->ARGS['cmd'] === 'parents')) {
            return true;
        }
        if (!empty($this->ARGS['reload'])) {
            if ($ARGtarget === '') {
                $ARGtarget = isset($this->ARGS['target']) ? $this->ARGS['target']
                    : ((isset($this->ARGS['targets']) && is_array($this->ARGS['targets']) && count($this->ARGS['targets']) === 1) ?
                        $this->ARGS['targets'][0] : '');
            }
            if ($ARGtarget !== '') {
                $ARGtarget = strval($ARGtarget);
                if ($target === '') {
                    return (strpos($ARGtarget, $this->id) === 0);
                } else {
                    $target = strval($target);
                    return ($target === $ARGtarget);
                }
            }
        }
        return false;
    }

    /**
     * Update subdirs cache data
     *
     * @param string $path
     * @param bool   $subdirs
     *
     * @return void
     */
    protected function updateSubdirsCache($path, $subdirs)
    {
        if (isset($this->cache[$path])) {
            if ($subdirs) {
                $this->cache[$path]['dirs'] = 1;
            } else {
                unset($this->cache[$path]['dirs']);
            }
        }
        if ($this->sessionCaching['subdirs']) {
            $this->sessionCache['subdirs'][$path] = $subdirs;
        }
        if ($this->sessionCaching['rootstat'] && $path == $this->root) {
            unset($this->sessionCache['rootstat'][$this->getRootstatCachekey()]);
        }
    }

    /*****************  get content *******************/

    /**
     * Return required dir's files info.
     * If onlyMimes is set - return only dirs and files of required mimes
     *
     * @param  string $path dir path
     *
     * @return array
     * @author Dmitry (dio) Levashov
     **/
    protected function getScandir($path)
    {
        $files = array();

        !isset($this->dirsCache[$path]) && $this->cacheDir($path);

        foreach ($this->dirsCache[$path] as $p) {
            if (($stat = $this->stat($p)) && empty($stat['hidden'])) {
                $files[] = $stat;
            }
        }

        return $files;
    }


    /**
     * Return subdirs tree
     *
     * @param  string $path parent dir path
     * @param  int    $deep tree deep
     * @param string  $exclude
     *
     * @return array
     * @author Dmitry (dio) Levashov
     */
    protected function gettree($path, $deep, $exclude = '')
    {
        $dirs = array();

        !isset($this->dirsCache[$path]) && $this->cacheDir($path);

        foreach ($this->dirsCache[$path] as $p) {
            $stat = $this->stat($p);

            if ($stat && empty($stat['hidden']) && $p != $exclude && $stat['mime'] == 'directory') {
                $dirs[] = $stat;
                if ($deep > 0 && !empty($stat['dirs'])) {
                    $dirs = array_merge($dirs, $this->gettree($p, $deep - 1));
                }
            }
        }

        return $dirs;
    }

    /**
     * Recursive files search
     *
     * @param  string $path dir path
     * @param  string $q    search string
     * @param  array  $mimes
     *
     * @return array
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function doSearch($path, $q, $mimes)
    {
        $result = array();
        $matchMethod = empty($this->doSearchCurrentQuery['matchMethod']) ? 'searchMatchName' : $this->doSearchCurrentQuery['matchMethod'];
        $timeout = $this->options['searchTimeout'] ? $this->searchStart + $this->options['searchTimeout'] : 0;
        if ($timeout && $timeout < time()) {
            $this->setError(elFinder::ERROR_SEARCH_TIMEOUT, $this->path($this->encode($path)));
            return $result;
        }

        foreach ($this->scandirCE($path) as $p) {
            elFinder::extendTimeLimit($this->options['searchTimeout'] + 30);

            if ($timeout && ($this->error || $timeout < time())) {
                !$this->error && $this->setError(elFinder::ERROR_SEARCH_TIMEOUT, $this->path($this->encode($path)));
                break;
            }


            $stat = $this->stat($p);

            if (!$stat) { // invalid links
                continue;
            }

            if (!empty($stat['hidden']) || !$this->mimeAccepted($stat['mime'], $mimes)) {
                continue;
            }

            $name = $stat['name'];

            if ($this->doSearchCurrentQuery['excludes']) {
                foreach ($this->doSearchCurrentQuery['excludes'] as $exclude) {
                    if ($this->stripos($name, $exclude) !== false) {
                        continue 2;
                    }
                }
            }

            if ((!$mimes || $stat['mime'] !== 'directory') && $this->$matchMethod($name, $q, $p) !== false) {
                $stat['path'] = $this->path($stat['hash']);
                if ($this->URL && !isset($stat['url'])) {
                    $path = str_replace($this->separator, '/', substr($p, strlen($this->root) + 1));
                    if ($this->encoding) {
                        $path = str_replace('%2F', '/', rawurlencode($this->convEncIn($path, true)));
                    } else {
                        $path = str_replace('%2F', '/', rawurlencode($path));
                    }
                    $stat['url'] = $this->URL . $path;
                }

                $result[] = $stat;
            }
            if ($stat['mime'] == 'directory' && $stat['read'] && !isset($stat['alias'])) {
                if (!$this->options['searchExDirReg'] || !preg_match($this->options['searchExDirReg'], $p)) {
                    $result = array_merge($result, $this->doSearch($p, $q, $mimes));
                }
            }
        }

        return $result;
    }

    /**********************  manuipulations  ******************/

    /**
     * Copy file/recursive copy dir only in current volume.
     * Return new file path or false.
     *
     * @param  string $src  source path
     * @param  string $dst  destination dir path
     * @param  string $name new file name (optionaly)
     *
     * @return string|false
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function copy($src, $dst, $name)
    {

        elFinder::checkAborted();

        $srcStat = $this->stat($src);

        if (!empty($srcStat['thash'])) {
            $target = $this->decode($srcStat['thash']);
            if (!$this->inpathCE($target, $this->root)) {
                return $this->setError(elFinder::ERROR_COPY, $this->path($srcStat['hash']), elFinder::ERROR_MKOUTLINK);
            }
            $stat = $this->stat($target);
            $this->clearcache();
            return $stat && $this->symlinkCE($target, $dst, $name)
                ? $this->joinPathCE($dst, $name)
                : $this->setError(elFinder::ERROR_COPY, $this->path($srcStat['hash']));
        }

        if ($srcStat['mime'] === 'directory') {
            $testStat = $this->isNameExists($this->joinPathCE($dst, $name));
            $this->clearcache();

            if (($testStat && $testStat['mime'] !== 'directory') || (!$testStat && !$testStat = $this->mkdir($this->encode($dst), $name))) {
                return $this->setError(elFinder::ERROR_COPY, $this->path($srcStat['hash']));
            }

            $dst = $this->decode($testStat['hash']);

            // start time
            $stime = microtime(true);
            foreach ($this->getScandir($src) as $stat) {
                if (empty($stat['hidden'])) {
                    // current time
                    $ctime = microtime(true);
                    if (($ctime - $stime) > 2) {
                        $stime = $ctime;
                        elFinder::checkAborted();
                    }
                    $name = $stat['name'];
                    $_src = $this->decode($stat['hash']);
                    if (!$this->copy($_src, $dst, $name)) {
                        $this->remove($dst, true); // fall back
                        return $this->setError($this->error, elFinder::ERROR_COPY, $this->_path($src));
                    }
                }
            }

            $this->added[] = $testStat;

            return $dst;
        }

        if ($this->options['copyJoin']) {
            $test = $this->joinPathCE($dst, $name);
            if ($this->isNameExists($test)) {
                $this->remove($test);
            }
        }
        if ($res = $this->convEncOut($this->_copy($this->convEncIn($src), $this->convEncIn($dst), $this->convEncIn($name)))) {
            $path = is_string($res) ? $res : $this->joinPathCE($dst, $name);
            $this->clearstatcache();
            $this->added[] = $this->stat($path);
            return $path;
        }

        return $this->setError(elFinder::ERROR_COPY, $this->path($srcStat['hash']));
    }

    /**
     * Move file
     * Return new file path or false.
     *
     * @param  string $src  source path
     * @param  string $dst  destination dir path
     * @param  string $name new file name
     *
     * @return string|false
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function move($src, $dst, $name)
    {
        $stat = $this->stat($src);
        $stat['realpath'] = $src;
        $this->rmTmb($stat); // can not do rmTmb() after _move()
        $this->clearcache();

        if ($res = $this->convEncOut($this->_move($this->convEncIn($src), $this->convEncIn($dst), $this->convEncIn($name)))) {
            $this->clearstatcache();
            if ($stat['mime'] === 'directory') {
                $this->updateSubdirsCache($dst, true);
            }
            $path = is_string($res) ? $res : $this->joinPathCE($dst, $name);
            $this->added[] = $this->stat($path);
            $this->removed[] = $stat;
            return $path;
        }

        return $this->setError(elFinder::ERROR_MOVE, $this->path($stat['hash']));
    }

    /**
     * Copy file from another volume.
     * Return new file path or false.
     *
     * @param  Object $volume      source volume
     * @param  string $src         source file hash
     * @param  string $destination destination dir path
     * @param  string $name        file name
     *
     * @return string|false
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function copyFrom($volume, $src, $destination, $name)
    {

        elFinder::checkAborted();

        if (($source = $volume->file($src)) == false) {
            return $this->addError(elFinder::ERROR_COPY, '#' . $src, $volume->error());
        }

        $srcIsDir = ($source['mime'] === 'directory');

        $errpath = $volume->path($source['hash']);

        $errors = array();
        try {
            $thash = $this->encode($destination);
            elFinder::$instance->trigger('paste.copyfrom', array(&$thash, &$name, '', elFinder::$instance, $this), $errors);
        } catch (elFinderTriggerException $e) {
            return $this->addError(elFinder::ERROR_COPY, $name, $errors);
        }

        if (!$this->nameAccepted($name, $srcIsDir)) {
            return $this->addError(elFinder::ERROR_COPY, $name, $srcIsDir ? elFinder::ERROR_INVALID_DIRNAME : elFinder::ERROR_INVALID_NAME);
        }

        if (!$this->allowCreate($destination, $name, $srcIsDir)) {
            return $this->addError(elFinder::ERROR_COPY, $name, elFinder::ERROR_PERM_DENIED);
        }

        if (!$source['read']) {
            return $this->addError(elFinder::ERROR_COPY, $errpath, elFinder::ERROR_PERM_DENIED);
        }

        if ($srcIsDir) {
            $test = $this->isNameExists($this->joinPathCE($destination, $name));
            $this->clearcache();

            if (($test && $test['mime'] != 'directory') || (!$test && !$test = $this->mkdir($this->encode($destination), $name))) {
                return $this->addError(elFinder::ERROR_COPY, $errpath);
            }

            //$path = $this->joinPathCE($destination, $name);
            $path = $this->decode($test['hash']);

            foreach ($volume->scandir($src) as $entr) {
                $this->copyFrom($volume, $entr['hash'], $path, $entr['name']);
            }

            $this->added[] = $test;
        } else {
            // size check
            if (!isset($source['size']) || $source['size'] > $this->uploadMaxSize) {
                return $this->setError(elFinder::ERROR_UPLOAD_FILE_SIZE);
            }

            // MIME check
            $mimeByName = $this->mimetype($source['name'], true);
            if ($source['mime'] === $mimeByName) {
                $mimeByName = '';
            }
            if (!$this->allowPutMime($source['mime']) || ($mimeByName && !$this->allowPutMime($mimeByName))) {
                return $this->addError(elFinder::ERROR_UPLOAD_FILE_MIME, $errpath);
            }

            if (strpos($source['mime'], 'image') === 0 && ($dim = $volume->dimensions($src))) {
                if (is_array($dim)) {
                    $dim = isset($dim['dim']) ? $dim['dim'] : null;
                }
                if ($dim) {
                    $s = explode('x', $dim);
                    $source['width'] = $s[0];
                    $source['height'] = $s[1];
                }
            }

            if (($fp = $volume->open($src)) == false
                || ($path = $this->saveCE($fp, $destination, $name, $source)) == false) {
                $fp && $volume->close($fp, $src);
                return $this->addError(elFinder::ERROR_COPY, $errpath);
            }
            $volume->close($fp, $src);

            $this->added[] = $this->stat($path);;
        }

        return $path;
    }

    /**
     * Remove file/ recursive remove dir
     *
     * @param  string $path  file path
     * @param  bool   $force try to remove even if file locked
     *
     * @return bool
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function remove($path, $force = false)
    {
        $stat = $this->stat($path);

        if (empty($stat)) {
            return $this->setError(elFinder::ERROR_RM, $this->relpathCE($path), elFinder::ERROR_FILE_NOT_FOUND);
        }

        $stat['realpath'] = $path;
        $this->rmTmb($stat);
        $this->clearcache();

        if (!$force && !empty($stat['locked'])) {
            return $this->setError(elFinder::ERROR_LOCKED, $this->path($stat['hash']));
        }

        if ($stat['mime'] == 'directory' && empty($stat['thash'])) {
            $ret = $this->delTree($this->convEncIn($path));
            $this->convEncOut();
            if (!$ret) {
                return $this->setError(elFinder::ERROR_RM, $this->path($stat['hash']));
            }
        } else {
            if ($this->convEncOut(!$this->_unlink($this->convEncIn($path)))) {
                return $this->setError(elFinder::ERROR_RM, $this->path($stat['hash']));
            }
            $this->clearstatcache();
        }

        $this->removed[] = $stat;
        return true;
    }


    /************************* thumbnails **************************/

    /**
     * Return thumbnail file name for required file
     *
     * @param  array $stat file stat
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function tmbname($stat)
    {
        $name = $stat['hash'] . (isset($stat['ts']) ? $stat['ts'] : '') . '.png';
        if (strlen($name) > 255) {
            $name = $this->id . md5($stat['hash']) . $stat['ts'] . '.png';
        }
        return $name;
    }

    /**
     * Return thumnbnail name if exists
     *
     * @param  string $path file path
     * @param  array  $stat file stat
     *
     * @return string|false
     * @author Dmitry (dio) Levashov
     **/
    protected function gettmb($path, $stat)
    {
        if ($this->tmbURL && $this->tmbPath) {
            // file itself thumnbnail
            if (strpos($path, $this->tmbPath) === 0) {
                return basename($path);
            }

            $name = $this->tmbname($stat);
            $tmb = $this->tmbPath . DIRECTORY_SEPARATOR . $name;
            if (file_exists($tmb)) {
                if ($this->options['tmbGcMaxlifeHour'] && $this->options['tmbGcPercentage'] > 0) {
                    touch($tmb);
                }
                return $name;
            }
        }
        return false;
    }

    /**
     * Return true if thumnbnail for required file can be created
     *
     * @param  string $path thumnbnail path
     * @param  array  $stat file stat
     * @param  bool   $checkTmbPath
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov
     **/
    protected function canCreateTmb($path, $stat, $checkTmbPath = true)
    {
        static $gdMimes = null;
        static $imgmgPS = null;
        if ($gdMimes === null) {
            $_mimes = array('image/jpeg', 'image/png', 'image/gif', 'image/x-ms-bmp');
            if (function_exists('imagecreatefromwebp')) {
                $_mimes[] = 'image/webp';
            }
            $gdMimes = array_flip($_mimes);
            $imgmgPS = array_flip(array('application/postscript', 'application/pdf'));
        }
        if ((!$checkTmbPath || $this->tmbPathWritable)
            && (!$this->tmbPath || strpos($path, $this->tmbPath) === false) // do not create thumnbnail for thumnbnail
        ) {
            $mime = strtolower($stat['mime']);
            list($type) = explode('/', $mime);
            if (!empty($this->imgConverter)) {
                if (isset($this->imgConverter[$mime])) {
                    return true;
                }
                if (isset($this->imgConverter[$type])) {
                    return true;
                }
            }
            return $this->imgLib
                && (
                    ($type === 'image' && ($this->imgLib === 'gd' ? isset($gdMimes[$stat['mime']]) : true))
                    ||
                    (ELFINDER_IMAGEMAGICK_PS && isset($imgmgPS[$stat['mime']]) && $this->imgLib !== 'gd')
                );
        }
        return false;
    }

    /**
     * Return true if required file can be resized.
     * By default - the same as canCreateTmb
     *
     * @param  string $path thumnbnail path
     * @param  array  $stat file stat
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov
     **/
    protected function canResize($path, $stat)
    {
        return $this->canCreateTmb($path, $stat, false);
    }

    /**
     * Create thumnbnail and return it's URL on success
     *
     * @param  string $path file path
     * @param         $stat
     *
     * @return false|string
     * @internal param string $mime file mime type
     * @throws elFinderAbortException
     * @throws ImagickException
     * @author   Dmitry (dio) Levashov
     */
    protected function createTmb($path, $stat)
    {
        if (!$stat || !$this->canCreateTmb($path, $stat)) {
            return false;
        }

        $name = $this->tmbname($stat);
        $tmb = $this->tmbPath . DIRECTORY_SEPARATOR . $name;

        $maxlength = -1;
        $imgConverter = null;

        // check imgConverter
        $mime = strtolower($stat['mime']);
        list($type) = explode('/', $mime);
        if (isset($this->imgConverter[$mime])) {
            $imgConverter = $this->imgConverter[$mime]['func'];
            if (!empty($this->imgConverter[$mime]['maxlen'])) {
                $maxlength = intval($this->imgConverter[$mime]['maxlen']);
            }
        } else if (isset($this->imgConverter[$type])) {
            $imgConverter = $this->imgConverter[$type]['func'];
            if (!empty($this->imgConverter[$type]['maxlen'])) {
                $maxlength = intval($this->imgConverter[$type]['maxlen']);
            }
        }
        if ($imgConverter && !is_callable($imgConverter)) {
            return false;
        }

        // copy image into tmbPath so some drivers does not store files on local fs
        if (($src = $this->fopenCE($path, 'rb')) == false) {
            return false;
        }

        if (($trg = fopen($tmb, 'wb')) == false) {
            $this->fcloseCE($src, $path);
            return false;
        }

        stream_copy_to_stream($src, $trg, $maxlength);

        $this->fcloseCE($src, $path);
        fclose($trg);

        // call imgConverter
        if ($imgConverter) {
            if (!call_user_func_array($imgConverter, array($tmb, $stat, $this))) {
                file_exists($tmb) && unlink($tmb);
                return false;
            }
        }

        $result = false;

        $tmbSize = $this->tmbSize;

        if ($this->imgLib === 'imagick') {
            try {
                $imagickTest = new imagick($tmb . '[0]');
                $imagickTest->clear();
                $imagickTest = true;
            } catch (Exception $e) {
                $imagickTest = false;
            }
        }

        if (($this->imgLib === 'imagick' && !$imagickTest) || ($s = getimagesize($tmb)) === false) {
            if ($this->imgLib === 'imagick') {
                $bgcolor = $this->options['tmbBgColor'];
                if ($bgcolor === 'transparent') {
                    $bgcolor = 'rgba(255, 255, 255, 0.0)';
                }
                try {
                    $imagick = new imagick();
                    $imagick->setBackgroundColor(new ImagickPixel($bgcolor));
                    $imagick->readImage($this->getExtentionByMime($stat['mime'], ':') . $tmb . '[0]');
                    try {
                        $imagick->trimImage(0);
                    } catch (Exception $e) {
                    }
                    $imagick->setImageFormat('png');
                    $imagick->writeImage($tmb);
                    $imagick->clear();
                    if (($s = getimagesize($tmb)) !== false) {
                        $result = true;
                    }
                } catch (Exception $e) {
                }
            } else if ($this->imgLib === 'convert') {
                $convParams = $this->imageMagickConvertPrepare($tmb, 'png', 100, array(), $stat['mime']);
                $cmd = sprintf('%s -colorspace sRGB -trim -- %s %s', ELFINDER_CONVERT_PATH, $convParams['quotedPath'], $convParams['quotedDstPath']);
                $result = false;
                if ($this->procExec($cmd) === 0) {
                    if (($s = getimagesize($tmb)) !== false) {
                        $result = true;
                    }
                }
            }
            if (!$result) {
                // fallback imgLib to GD
                if (function_exists('gd_info') && ($s = getimagesize($tmb))) {
                    $this->imgLib = 'gd';
                } else {
                    file_exists($tmb) && unlink($tmb);
                    return false;
                }
            }
        }

        /* If image smaller or equal thumbnail size - just fitting to thumbnail square */
        if ($s[0] <= $tmbSize && $s[1] <= $tmbSize) {
            $result = $this->imgSquareFit($tmb, $tmbSize, $tmbSize, 'center', 'middle', $this->options['tmbBgColor'], 'png');
        } else {

            if ($this->options['tmbCrop']) {

                $result = $tmb;
                /* Resize and crop if image bigger than thumbnail */
                if (!(($s[0] > $tmbSize && $s[1] <= $tmbSize) || ($s[0] <= $tmbSize && $s[1] > $tmbSize)) || ($s[0] > $tmbSize && $s[1] > $tmbSize)) {
                    $result = $this->imgResize($tmb, $tmbSize, $tmbSize, true, false, 'png');
                }

                if ($result && ($s = getimagesize($tmb)) != false) {
                    $x = $s[0] > $tmbSize ? intval(($s[0] - $tmbSize) / 2) : 0;
                    $y = $s[1] > $tmbSize ? intval(($s[1] - $tmbSize) / 2) : 0;
                    $result = $this->imgCrop($result, $tmbSize, $tmbSize, $x, $y, 'png');
                } else {
                    $result = false;
                }

            } else {
                $result = $this->imgResize($tmb, $tmbSize, $tmbSize, true, true, 'png');
            }

            if ($result) {
                if ($s = getimagesize($tmb)) {
                    if ($s[0] !== $tmbSize || $s[1] !== $tmbSize) {
                        $result = $this->imgSquareFit($result, $tmbSize, $tmbSize, 'center', 'middle', $this->options['tmbBgColor'], 'png');
                    }
                }
            }
        }

        if (!$result) {
            unlink($tmb);
            return false;
        }

        return $name;
    }

    /**
     * Resize image
     *
     * @param  string $path               image file
     * @param  int    $width              new width
     * @param  int    $height             new height
     * @param  bool   $keepProportions    crop image
     * @param  bool   $resizeByBiggerSide resize image based on bigger side if true
     * @param  string $destformat         image destination format
     * @param  int    $jpgQuality         JEPG quality (1-100)
     * @param  array  $options            Other extra options
     *
     * @return string|false
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     * @author Alexey Sukhotin
     */
    protected function imgResize($path, $width, $height, $keepProportions = false, $resizeByBiggerSide = true, $destformat = null, $jpgQuality = null, $options = array())
    {
        if (($s = getimagesize($path)) == false) {
            return false;
        }

        if (!$jpgQuality) {
            $jpgQuality = $this->options['jpgQuality'];
        }

        list($orig_w, $orig_h) = array($s[0], $s[1]);
        list($size_w, $size_h) = array($width, $height);

        if (empty($options['unenlarge']) || $orig_w > $size_w || $orig_h > $size_h) {
            if ($keepProportions == true) {
                /* Resizing by biggest side */
                if ($resizeByBiggerSide) {
                    if ($orig_w > $orig_h) {
                        $size_h = round($orig_h * $width / $orig_w);
                        $size_w = $width;
                    } else {
                        $size_w = round($orig_w * $height / $orig_h);
                        $size_h = $height;
                    }
                } else {
                    if ($orig_w > $orig_h) {
                        $size_w = round($orig_w * $height / $orig_h);
                        $size_h = $height;
                    } else {
                        $size_h = round($orig_h * $width / $orig_w);
                        $size_w = $width;
                    }
                }
            }
        } else {
            $size_w = $orig_w;
            $size_h = $orig_h;
        }

        elFinder::extendTimeLimit(300);
        switch ($this->imgLib) {
            case 'imagick':

                try {
                    $img = new imagick($path);
                } catch (Exception $e) {
                    return false;
                }

                // Imagick::FILTER_BOX faster than FILTER_LANCZOS so use for createTmb
                // resize bench: http://app-mgng.rhcloud.com/9
                // resize sample: http://www.dylanbeattie.net/magick/filters/result.html
                $filter = ($destformat === 'png' /* createTmb */) ? Imagick::FILTER_BOX : Imagick::FILTER_LANCZOS;

                $ani = ($img->getNumberImages() > 1);
                if ($ani && is_null($destformat)) {
                    $img = $img->coalesceImages();
                    do {
                        $img->resizeImage($size_w, $size_h, $filter, 1);
                    } while ($img->nextImage());
                    $img->optimizeImageLayers();
                    $result = $img->writeImages($path, true);
                } else {
                    if ($ani) {
                        $img->setFirstIterator();
                    }
                    if (strtoupper($img->getImageFormat()) === 'JPEG') {
                        $img->setImageCompression(imagick::COMPRESSION_JPEG);
                        $img->setImageCompressionQuality($jpgQuality);
                        if (isset($options['preserveExif']) && !$options['preserveExif']) {
                            try {
                                $orientation = $img->getImageOrientation();
                            } catch (ImagickException $e) {
                                $orientation = 0;
                            }
                            $img->stripImage();
                            if ($orientation) {
                                $img->setImageOrientation($orientation);
                            }
                        }
                        if ($this->options['jpgProgressive']) {
                            $img->setInterlaceScheme(Imagick::INTERLACE_PLANE);
                        }
                    }
                    $img->resizeImage($size_w, $size_h, $filter, true);
                    if ($destformat) {
                        $result = $this->imagickImage($img, $path, $destformat, $jpgQuality);
                    } else {
                        $result = $img->writeImage($path);
                    }
                }

                $img->clear();

                return $result ? $path : false;

                break;

            case 'convert':
                extract($this->imageMagickConvertPrepare($path, $destformat, $jpgQuality, $s));
                /**
                 * @var string $ani
                 * @var string $index
                 * @var string $coalesce
                 * @var string $deconstruct
                 * @var string $jpgQuality
                 * @var string $quotedPath
                 * @var string $quotedDstPath
                 * @var string $interlace
                 */
                $filter = ($destformat === 'png' /* createTmb */) ? '-filter Box' : '-filter Lanczos';
                $strip = (isset($options['preserveExif']) && !$options['preserveExif']) ? ' -strip' : '';
                $cmd = sprintf('%s %s%s%s%s%s %s -geometry %dx%d! %s %s', ELFINDER_CONVERT_PATH, $quotedPath, $coalesce, $jpgQuality, $strip, $interlace, $filter, $size_w, $size_h, $deconstruct, $quotedDstPath);

                $result = false;
                if ($this->procExec($cmd) === 0) {
                    $result = true;
                }
                return $result ? $path : false;

                break;

            case 'gd':
                elFinder::expandMemoryForGD(array($s, array($size_w, $size_h)));
                $img = $this->gdImageCreate($path, $s['mime']);

                if ($img && false != ($tmp = imagecreatetruecolor($size_w, $size_h))) {

                    $bgNum = false;
                    if ($s[2] === IMAGETYPE_GIF && (!$destformat || $destformat === 'gif')) {
                        $bgIdx = imagecolortransparent($img);
                        if ($bgIdx !== -1) {
                            $c = imagecolorsforindex($img, $bgIdx);
                            $bgNum = imagecolorallocate($tmp, $c['red'], $c['green'], $c['blue']);
                            imagefill($tmp, 0, 0, $bgNum);
                            imagecolortransparent($tmp, $bgNum);
                        }
                    }
                    if ($bgNum === false) {
                        $this->gdImageBackground($tmp, 'transparent');
                    }

                    if (!imagecopyresampled($tmp, $img, 0, 0, 0, 0, $size_w, $size_h, $s[0], $s[1])) {
                        return false;
                    }

                    $result = $this->gdImage($tmp, $path, $destformat, $s['mime'], $jpgQuality);

                    imagedestroy($img);
                    imagedestroy($tmp);

                    return $result ? $path : false;

                }
                break;
        }

        return false;
    }

    /**
     * Crop image
     *
     * @param  string $path       image file
     * @param  int    $width      crop width
     * @param  int    $height     crop height
     * @param  bool   $x          crop left offset
     * @param  bool   $y          crop top offset
     * @param  string $destformat image destination format
     * @param  int    $jpgQuality JEPG quality (1-100)
     *
     * @return string|false
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     * @author Alexey Sukhotin
     */
    protected function imgCrop($path, $width, $height, $x, $y, $destformat = null, $jpgQuality = null)
    {
        if (($s = getimagesize($path)) == false) {
            return false;
        }

        if (!$jpgQuality) {
            $jpgQuality = $this->options['jpgQuality'];
        }

        elFinder::extendTimeLimit(300);
        switch ($this->imgLib) {
            case 'imagick':

                try {
                    $img = new imagick($path);
                } catch (Exception $e) {
                    return false;
                }

                $ani = ($img->getNumberImages() > 1);
                if ($ani && is_null($destformat)) {
                    $img = $img->coalesceImages();
                    do {
                        $img->setImagePage($s[0], $s[1], 0, 0);
                        $img->cropImage($width, $height, $x, $y);
                        $img->setImagePage($width, $height, 0, 0);
                    } while ($img->nextImage());
                    $img->optimizeImageLayers();
                    $result = $img->writeImages($path, true);
                } else {
                    if ($ani) {
                        $img->setFirstIterator();
                    }
                    $img->setImagePage($s[0], $s[1], 0, 0);
                    $img->cropImage($width, $height, $x, $y);
                    $img->setImagePage($width, $height, 0, 0);
                    $result = $this->imagickImage($img, $path, $destformat, $jpgQuality);
                }

                $img->clear();

                return $result ? $path : false;

                break;

            case 'convert':
                extract($this->imageMagickConvertPrepare($path, $destformat, $jpgQuality, $s));
                /**
                 * @var string $ani
                 * @var string $index
                 * @var string $coalesce
                 * @var string $deconstruct
                 * @var string $jpgQuality
                 * @var string $quotedPath
                 * @var string $quotedDstPath
                 * @var string $interlace
                 */
                $cmd = sprintf('%s %s%s%s%s -crop %dx%d+%d+%d%s %s', ELFINDER_CONVERT_PATH, $quotedPath, $coalesce, $jpgQuality, $interlace, $width, $height, $x, $y, $deconstruct, $quotedDstPath);

                $result = false;
                if ($this->procExec($cmd) === 0) {
                    $result = true;
                }
                return $result ? $path : false;

                break;

            case 'gd':
                elFinder::expandMemoryForGD(array($s, array($width, $height)));
                $img = $this->gdImageCreate($path, $s['mime']);

                if ($img && false != ($tmp = imagecreatetruecolor($width, $height))) {

                    $bgNum = false;
                    if ($s[2] === IMAGETYPE_GIF && (!$destformat || $destformat === 'gif')) {
                        $bgIdx = imagecolortransparent($img);
                        if ($bgIdx !== -1) {
                            $c = imagecolorsforindex($img, $bgIdx);
                            $bgNum = imagecolorallocate($tmp, $c['red'], $c['green'], $c['blue']);
                            imagefill($tmp, 0, 0, $bgNum);
                            imagecolortransparent($tmp, $bgNum);
                        }
                    }
                    if ($bgNum === false) {
                        $this->gdImageBackground($tmp, 'transparent');
                    }

                    $size_w = $width;
                    $size_h = $height;

                    if ($s[0] < $width || $s[1] < $height) {
                        $size_w = $s[0];
                        $size_h = $s[1];
                    }

                    if (!imagecopy($tmp, $img, 0, 0, $x, $y, $size_w, $size_h)) {
                        return false;
                    }

                    $result = $this->gdImage($tmp, $path, $destformat, $s['mime'], $jpgQuality);

                    imagedestroy($img);
                    imagedestroy($tmp);

                    return $result ? $path : false;

                }
                break;
        }

        return false;
    }

    /**
     * Put image to square
     *
     * @param  string    $path       image file
     * @param  int       $width      square width
     * @param  int       $height     square height
     * @param int|string $align      reserved
     * @param int|string $valign     reserved
     * @param  string    $bgcolor    square background color in #rrggbb format
     * @param  string    $destformat image destination format
     * @param  int       $jpgQuality JEPG quality (1-100)
     *
     * @return false|string
     * @throws ImagickException
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     * @author Alexey Sukhotin
     */
    protected function imgSquareFit($path, $width, $height, $align = 'center', $valign = 'middle', $bgcolor = '#0000ff', $destformat = null, $jpgQuality = null)
    {
        if (($s = getimagesize($path)) == false) {
            return false;
        }

        $result = false;

        /* Coordinates for image over square aligning */
        $y = ceil(abs($height - $s[1]) / 2);
        $x = ceil(abs($width - $s[0]) / 2);

        if (!$jpgQuality) {
            $jpgQuality = $this->options['jpgQuality'];
        }

        elFinder::extendTimeLimit(300);
        switch ($this->imgLib) {
            case 'imagick':
                try {
                    $img = new imagick($path);
                } catch (Exception $e) {
                    return false;
                }

                if ($bgcolor === 'transparent') {
                    $bgcolor = 'rgba(255, 255, 255, 0.0)';
                }
                $ani = ($img->getNumberImages() > 1);
                if ($ani && is_null($destformat)) {
                    $img1 = new Imagick();
                    $img1->setFormat('gif');
                    $img = $img->coalesceImages();
                    do {
                        $gif = new Imagick();
                        $gif->newImage($width, $height, new ImagickPixel($bgcolor));
                        $gif->setImageColorspace($img->getImageColorspace());
                        $gif->setImageFormat('gif');
                        $gif->compositeImage($img, imagick::COMPOSITE_OVER, $x, $y);
                        $gif->setImageDelay($img->getImageDelay());
                        $gif->setImageIterations($img->getImageIterations());
                        $img1->addImage($gif);
                        $gif->clear();
                    } while ($img->nextImage());
                    $img1->optimizeImageLayers();
                    $result = $img1->writeImages($path, true);
                } else {
                    if ($ani) {
                        $img->setFirstIterator();
                    }
                    $img1 = new Imagick();
                    $img1->newImage($width, $height, new ImagickPixel($bgcolor));
                    $img1->setImageColorspace($img->getImageColorspace());
                    $img1->compositeImage($img, imagick::COMPOSITE_OVER, $x, $y);
                    $result = $this->imagickImage($img1, $path, $destformat, $jpgQuality);
                }

                $img1->clear();
                $img->clear();
                return $result ? $path : false;

                break;

            case 'convert':
                extract($this->imageMagickConvertPrepare($path, $destformat, $jpgQuality, $s));
                /**
                 * @var string $ani
                 * @var string $index
                 * @var string $coalesce
                 * @var string $deconstruct
                 * @var string $jpgQuality
                 * @var string $quotedPath
                 * @var string $quotedDstPath
                 * @var string $interlace
                 */
                if ($bgcolor === 'transparent') {
                    $bgcolor = 'rgba(255, 255, 255, 0.0)';
                }
                $cmd = sprintf('%s -size %dx%d "xc:%s" png:- | convert%s%s%s png:-  %s -geometry +%d+%d -compose over -composite%s %s', ELFINDER_CONVERT_PATH, $width, $height, $bgcolor, $coalesce, $jpgQuality, $interlace, $quotedPath, $x, $y, $deconstruct, $quotedDstPath);

                $result = false;
                if ($this->procExec($cmd) === 0) {
                    $result = true;
                }
                return $result ? $path : false;

                break;

            case 'gd':
                elFinder::expandMemoryForGD(array($s, array($width, $height)));
                $img = $this->gdImageCreate($path, $s['mime']);

                if ($img && false != ($tmp = imagecreatetruecolor($width, $height))) {

                    $this->gdImageBackground($tmp, $bgcolor);
                    if ($bgcolor === 'transparent' && ($destformat === 'png' || $s[2] === IMAGETYPE_PNG)) {
                        $bgNum = imagecolorallocatealpha($tmp, 255, 255, 255, 127);
                        imagefill($tmp, 0, 0, $bgNum);
                    }

                    if (!imagecopy($tmp, $img, $x, $y, 0, 0, $s[0], $s[1])) {
                        return false;
                    }

                    $result = $this->gdImage($tmp, $path, $destformat, $s['mime'], $jpgQuality);

                    imagedestroy($img);
                    imagedestroy($tmp);

                    return $result ? $path : false;
                }
                break;
        }

        return false;
    }

    /**
     * Rotate image
     *
     * @param  string $path       image file
     * @param  int    $degree     rotete degrees
     * @param  string $bgcolor    square background color in #rrggbb format
     * @param  string $destformat image destination format
     * @param  int    $jpgQuality JEPG quality (1-100)
     *
     * @return string|false
     * @throws elFinderAbortException
     * @author nao-pon
     * @author Troex Nevelin
     */
    protected function imgRotate($path, $degree, $bgcolor = '#ffffff', $destformat = null, $jpgQuality = null)
    {
        if (($s = getimagesize($path)) == false || $degree % 360 === 0) {
            return false;
        }

        $result = false;

        // try lossless rotate
        if ($degree % 90 === 0 && in_array($s[2], array(IMAGETYPE_JPEG, IMAGETYPE_JPEG2000))) {
            $count = ($degree / 90) % 4;
            $exiftran = array(
                1 => '-9',
                2 => '-1',
                3 => '-2'
            );
            $jpegtran = array(
                1 => '90',
                2 => '180',
                3 => '270'
            );
            $quotedPath = escapeshellarg($path);
            $cmds = array();
            if ($this->procExec(ELFINDER_EXIFTRAN_PATH . ' -h') === 0) {
                $cmds[] = ELFINDER_EXIFTRAN_PATH . ' -i ' . $exiftran[$count] . ' -- ' . $quotedPath;
            }
            if ($this->procExec(ELFINDER_JPEGTRAN_PATH . ' -version') === 0) {
                $cmds[] = ELFINDER_JPEGTRAN_PATH . ' -rotate ' . $jpegtran[$count] . ' -copy all -outfile ' . $quotedPath . ' -- ' . $quotedPath;
            }
            foreach ($cmds as $cmd) {
                if ($this->procExec($cmd) === 0) {
                    $result = true;
                    break;
                }
            }
            if ($result) {
                return $path;
            }
        }

        if (!$jpgQuality) {
            $jpgQuality = $this->options['jpgQuality'];
        }

        elFinder::extendTimeLimit(300);
        switch ($this->imgLib) {
            case 'imagick':
                try {
                    $img = new imagick($path);
                } catch (Exception $e) {
                    return false;
                }

                if ($s[2] === IMAGETYPE_GIF || $s[2] === IMAGETYPE_PNG) {
                    $bgcolor = 'rgba(255, 255, 255, 0.0)';
                }
                if ($img->getNumberImages() > 1) {
                    $img = $img->coalesceImages();
                    do {
                        $img->rotateImage(new ImagickPixel($bgcolor), $degree);
                    } while ($img->nextImage());
                    $img->optimizeImageLayers();
                    $result = $img->writeImages($path, true);
                } else {
                    $img->rotateImage(new ImagickPixel($bgcolor), $degree);
                    $result = $this->imagickImage($img, $path, $destformat, $jpgQuality);
                }
                $img->clear();
                return $result ? $path : false;

                break;

            case 'convert':
                extract($this->imageMagickConvertPrepare($path, $destformat, $jpgQuality, $s));
                /**
                 * @var string $ani
                 * @var string $index
                 * @var string $coalesce
                 * @var string $deconstruct
                 * @var string $jpgQuality
                 * @var string $quotedPath
                 * @var string $quotedDstPath
                 * @var string $interlace
                 */
                if ($s[2] === IMAGETYPE_GIF || $s[2] === IMAGETYPE_PNG) {
                    $bgcolor = 'rgba(255, 255, 255, 0.0)';
                }
                $cmd = sprintf('%s%s%s%s -background "%s" -rotate %d%s -- %s %s', ELFINDER_CONVERT_PATH, $coalesce, $jpgQuality, $interlace, $bgcolor, $degree, $deconstruct, $quotedPath, $quotedDstPath);

                $result = false;
                if ($this->procExec($cmd) === 0) {
                    $result = true;
                }
                return $result ? $path : false;

                break;

            case 'gd':
                elFinder::expandMemoryForGD(array($s, $s));
                $img = $this->gdImageCreate($path, $s['mime']);

                $degree = 360 - $degree;

                $bgNum = -1;
                $bgIdx = false;
                if ($s[2] === IMAGETYPE_GIF) {
                    $bgIdx = imagecolortransparent($img);
                    if ($bgIdx !== -1) {
                        $c = imagecolorsforindex($img, $bgIdx);
                        $w = imagesx($img);
                        $h = imagesy($img);
                        $newImg = imagecreatetruecolor($w, $h);
                        imagepalettecopy($newImg, $img);
                        $bgNum = imagecolorallocate($newImg, $c['red'], $c['green'], $c['blue']);
                        imagefill($newImg, 0, 0, $bgNum);
                        imagecolortransparent($newImg, $bgNum);
                        imagecopy($newImg, $img, 0, 0, 0, 0, $w, $h);
                        imagedestroy($img);
                        $img = $newImg;
                        $newImg = null;
                    }
                } else if ($s[2] === IMAGETYPE_PNG) {
                    $bgNum = imagecolorallocatealpha($img, 255, 255, 255, 127);
                }
                if ($bgNum === -1) {
                    list($r, $g, $b) = sscanf($bgcolor, "#%02x%02x%02x");
                    $bgNum = imagecolorallocate($img, $r, $g, $b);
                }

                $tmp = imageRotate($img, $degree, $bgNum);
                if ($bgIdx !== -1) {
                    imagecolortransparent($tmp, $bgNum);
                }

                $result = $this->gdImage($tmp, $path, $destformat, $s['mime'], $jpgQuality);

                imageDestroy($img);
                imageDestroy($tmp);

                return $result ? $path : false;

                break;
        }

        return false;
    }

    /**
     * Execute shell command
     *
     * @param  string $command      command line
     * @param  string $output       stdout strings
     * @param  int    $return_var   process exit code
     * @param  string $error_output stderr strings
     *
     * @return int exit code
     * @throws elFinderAbortException
     * @author Alexey Sukhotin
     */
    protected function procExec($command, &$output = '', &$return_var = -1, &$error_output = '', $cwd = null)
    {
        return elFinder::procExec($command, $output, $return_var, $error_output);
    }

    /**
     * Remove thumbnail, also remove recursively if stat is directory
     *
     * @param  array $stat file stat
     *
     * @return void
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     * @author Naoki Sawada
     * @author Troex Nevelin
     */
    protected function rmTmb($stat)
    {
        if ($this->tmbPathWritable) {
            if ($stat['mime'] === 'directory') {
                foreach ($this->scandirCE($this->decode($stat['hash'])) as $p) {
                    elFinder::extendTimeLimit(30);
                    $name = $this->basenameCE($p);
                    $name != '.' && $name != '..' && $this->rmTmb($this->stat($p));
                }
            } else if (!empty($stat['tmb']) && $stat['tmb'] != "1") {
                $tmb = $this->tmbPath . DIRECTORY_SEPARATOR . rawurldecode($stat['tmb']);
                file_exists($tmb) && unlink($tmb);
                clearstatcache();
            }
        }
    }

    /**
     * Create an gd image according to the specified mime type
     *
     * @param string $path image file
     * @param string $mime
     *
     * @return resource|false GD image resource identifier
     */
    protected function gdImageCreate($path, $mime)
    {
        switch ($mime) {
            case 'image/jpeg':
                return imagecreatefromjpeg($path);

            case 'image/png':
                return imagecreatefrompng($path);

            case 'image/gif':
                return imagecreatefromgif($path);

            case 'image/x-ms-bmp':
                if (!function_exists('imagecreatefrombmp')) {
                    include_once dirname(__FILE__) . '/libs/GdBmp.php';
                }
                return imagecreatefrombmp($path);

            case 'image/xbm':
                return imagecreatefromxbm($path);

            case 'image/xpm':
                return imagecreatefromxpm($path);

            case 'image/webp':
                return imagecreatefromwebp($path);
        }
        return false;
    }

    /**
     * Output gd image to file
     *
     * @param resource $image      gd image resource
     * @param string   $filename   The path to save the file to.
     * @param string   $destformat The Image type to use for $filename
     * @param string   $mime       The original image mime type
     * @param int      $jpgQuality JEPG quality (1-100)
     *
     * @return bool
     */
    protected function gdImage($image, $filename, $destformat, $mime, $jpgQuality = null)
    {

        if (!$jpgQuality) {
            $jpgQuality = $this->options['jpgQuality'];
        }
        if ($destformat) {
            switch ($destformat) {
                case 'jpg':
                    $mime = 'image/jpeg';
                    break;
                case 'gif':
                    $mime = 'image/gif';
                    break;
                case 'png':
                default:
                    $mime = 'image/png';
                    break;
            }
        }
        switch ($mime) {
            case 'image/gif':
                return imagegif($image, $filename);
            case 'image/jpeg':
                if ($this->options['jpgProgressive']) {
                    imageinterlace($image, true);
                }
                return imagejpeg($image, $filename, $jpgQuality);
            case 'image/wbmp':
                return imagewbmp($image, $filename);
            case 'image/png':
            default:
                return imagepng($image, $filename);
        }
    }

    /**
     * Output imagick image to file
     *
     * @param imagick $img        imagick image resource
     * @param string  $filename   The path to save the file to.
     * @param string  $destformat The Image type to use for $filename
     * @param int     $jpgQuality JEPG quality (1-100)
     *
     * @return bool
     */
    protected function imagickImage($img, $filename, $destformat, $jpgQuality = null)
    {

        if (!$jpgQuality) {
            $jpgQuality = $this->options['jpgQuality'];
        }

        try {
            if ($destformat) {
                if ($destformat === 'gif') {
                    $img->setImageFormat('gif');
                } else if ($destformat === 'png') {
                    $img->setImageFormat('png');
                } else if ($destformat === 'jpg') {
                    $img->setImageFormat('jpeg');
                }
            }
            if (strtoupper($img->getImageFormat()) === 'JPEG') {
                $img->setImageCompression(imagick::COMPRESSION_JPEG);
                $img->setImageCompressionQuality($jpgQuality);
                if ($this->options['jpgProgressive']) {
                    $img->setInterlaceScheme(Imagick::INTERLACE_PLANE);
                }
                try {
                    $orientation = $img->getImageOrientation();
                } catch (ImagickException $e) {
                    $orientation = 0;
                }
                $img->stripImage();
                if ($orientation) {
                    $img->setImageOrientation($orientation);
                }
            }
            $result = $img->writeImage($filename);
        } catch (Exception $e) {
            $result = false;
        }

        return $result;
    }

    /**
     * Assign the proper background to a gd image
     *
     * @param resource $image   gd image resource
     * @param string   $bgcolor background color in #rrggbb format
     */
    protected function gdImageBackground($image, $bgcolor)
    {

        if ($bgcolor === 'transparent') {
            imagealphablending($image, false);
            imagesavealpha($image, true);
        } else {
            list($r, $g, $b) = sscanf($bgcolor, "#%02x%02x%02x");
            $bgcolor1 = imagecolorallocate($image, $r, $g, $b);
            imagefill($image, 0, 0, $bgcolor1);
        }
    }

    /**
     * Prepare variables for exec convert of ImageMagick
     *
     * @param  string $path
     * @param  string $destformat
     * @param  int    $jpgQuality
     * @param  array  $imageSize
     * @param null    $mime
     *
     * @return array
     * @throws elFinderAbortException
     */
    protected function imageMagickConvertPrepare($path, $destformat, $jpgQuality, $imageSize = null, $mime = null)
    {
        if (is_null($imageSize)) {
            $imageSize = getimagesize($path);
        }
        if (is_null($mime)) {
            $mime = $this->mimetype($path);
        }
        $srcType = $this->getExtentionByMime($mime, ':');
        $ani = false;
        if (preg_match('/^(?:gif|png|ico)/', $srcType)) {
            $cmd = ELFINDER_IDENTIFY_PATH . ' -- ' . escapeshellarg($srcType . $path);
            if ($this->procExec($cmd, $o) === 0) {
                $ani = preg_split('/(?:\r\n|\n|\r)/', trim($o));
                if (count($ani) < 2) {
                    $ani = false;
                }
            }
        }
        $coalesce = $index = $interlace = '';
        $deconstruct = ' +repage';
        if ($ani && $destformat !== 'png'/* not createTmb */) {
            if (is_null($destformat)) {
                $coalesce = ' -coalesce -repage 0x0';
                $deconstruct = ' +repage -deconstruct -layers optimize';
            } else if ($imageSize) {
                if ($srcType === 'ico:') {
                    $index = '[0]';
                    foreach ($ani as $_i => $_info) {
                        if (preg_match('/ (\d+)x(\d+) /', $_info, $m)) {
                            if ($m[1] == $imageSize[0] && $m[2] == $imageSize[1]) {
                                $index = '[' . $_i . ']';
                                break;
                            }
                        }
                    }
                }
            }
        } else {
            $index = '[0]';
        }
        if ($imageSize && ($imageSize[2] === IMAGETYPE_JPEG || $imageSize[2] === IMAGETYPE_JPEG2000)) {
            $jpgQuality = ' -quality ' . $jpgQuality;
            if ($this->options['jpgProgressive']) {
                $interlace = ' -interlace Plane';
            }
        } else {
            $jpgQuality = '';
        }
        $quotedPath = escapeshellarg($srcType . $path . $index);
        $quotedDstPath = escapeshellarg(($destformat ? ($destformat . ':') : $srcType) . $path);
        return compact('ani', 'index', 'coalesce', 'deconstruct', 'jpgQuality', 'quotedPath', 'quotedDstPath', 'interlace');
    }

    /*********************** misc *************************/

    /**
     * Find position of first occurrence of string in a string with multibyte support
     *
     * @param  string $haystack The string being checked.
     * @param  string $needle   The string to find in haystack.
     * @param  int    $offset   The search offset. If it is not specified, 0 is used.
     *
     * @return int|bool
     * @author Alexey Sukhotin
     **/
    protected function stripos($haystack, $needle, $offset = 0)
    {
        if (function_exists('mb_stripos')) {
            return mb_stripos($haystack, $needle, $offset, 'UTF-8');
        } else if (function_exists('mb_strtolower') && function_exists('mb_strpos')) {
            return mb_strpos(mb_strtolower($haystack, 'UTF-8'), mb_strtolower($needle, 'UTF-8'), $offset);
        }
        return stripos($haystack, $needle, $offset);
    }

    /**
     * Default serach match method (name match)
     *
     * @param  String $name  Item name
     * @param  String $query Query word
     * @param  String $path  Item path
     *
     * @return bool @return bool
     */
    protected function searchMatchName($name, $query, $path)
    {
        return $this->stripos($name, $query) !== false;
    }

    /**
     * Get server side available archivers
     *
     * @param bool $use_cache
     *
     * @return array
     * @throws elFinderAbortException
     */
    protected function getArchivers($use_cache = true)
    {
        $sessionKey = 'archivers';
        if ($use_cache) {
            if (isset($this->options['archivers']) && is_array($this->options['archivers']) && $this->options['archivers']) {
                $cache = $this->options['archivers'];
            } else {
                $cache = elFinder::$archivers;
            }
            if ($cache) {
                return $cache;
            } else {
                if ($cache = $this->session->get($sessionKey, array())) {
                    return elFinder::$archivers = $cache;
                }
            }
        }

        $arcs = array(
            'create' => array(),
            'extract' => array()
        );

        if ($this->procExec('') === 0) {

            $this->procExec(ELFINDER_TAR_PATH . ' --version', $o, $ctar);

            if ($ctar == 0) {
                $arcs['create']['application/x-tar'] = array('cmd' => ELFINDER_TAR_PATH, 'argc' => '-chf', 'ext' => 'tar');
                $arcs['extract']['application/x-tar'] = array('cmd' => ELFINDER_TAR_PATH, 'argc' => '-xf', 'ext' => 'tar', 'toSpec' => '-C ', 'getsize' => array('argc' => '-xvf', 'toSpec' => '--to-stdout|wc -c', 'regex' => '/^.+(?:\r\n|\n|\r)[^\r\n0-9]*([0-9]+)[^\r\n]*$/s', 'replace' => '$1'));
                unset($o);
                $this->procExec(ELFINDER_GZIP_PATH . ' --version', $o, $c);
                if ($c == 0) {
                    $arcs['create']['application/x-gzip'] = array('cmd' => ELFINDER_TAR_PATH, 'argc' => '-czhf', 'ext' => 'tgz');
                    $arcs['extract']['application/x-gzip'] = array('cmd' => ELFINDER_TAR_PATH, 'argc' => '-xzf', 'ext' => 'tgz', 'toSpec' => '-C ', 'getsize' => array('argc' => '-xvf', 'toSpec' => '--to-stdout|wc -c', 'regex' => '/^.+(?:\r\n|\n|\r)[^\r\n0-9]*([0-9]+)[^\r\n]*$/s', 'replace' => '$1'));
                }
                unset($o);
                $this->procExec(ELFINDER_BZIP2_PATH . ' --version', $o, $c);
                if ($c == 0) {
                    $arcs['create']['application/x-bzip2'] = array('cmd' => ELFINDER_TAR_PATH, 'argc' => '-cjhf', 'ext' => 'tbz');
                    $arcs['extract']['application/x-bzip2'] = array('cmd' => ELFINDER_TAR_PATH, 'argc' => '-xjf', 'ext' => 'tbz', 'toSpec' => '-C ', 'getsize' => array('argc' => '-xvf', 'toSpec' => '--to-stdout|wc -c', 'regex' => '/^.+(?:\r\n|\n|\r)[^\r\n0-9]*([0-9]+)[^\r\n]*$/s', 'replace' => '$1'));
                }
                unset($o);
                $this->procExec(ELFINDER_XZ_PATH . ' --version', $o, $c);
                if ($c == 0) {
                    $arcs['create']['application/x-xz'] = array('cmd' => ELFINDER_TAR_PATH, 'argc' => '-cJhf', 'ext' => 'xz');
                    $arcs['extract']['application/x-xz'] = array('cmd' => ELFINDER_TAR_PATH, 'argc' => '-xJf', 'ext' => 'xz', 'toSpec' => '-C ', 'getsize' => array('argc' => '-xvf', 'toSpec' => '--to-stdout|wc -c', 'regex' => '/^.+(?:\r\n|\n|\r)[^\r\n0-9]*([0-9]+)[^\r\n]*$/s', 'replace' => '$1'));
                }
            }
            unset($o);
            $this->procExec(ELFINDER_ZIP_PATH . ' -h', $o, $c);
            if ($c == 0) {
                $arcs['create']['application/zip'] = array('cmd' => ELFINDER_ZIP_PATH, 'argc' => '-r9 -q', 'ext' => 'zip');
            }
            unset($o);
            $this->procExec(ELFINDER_UNZIP_PATH . ' --help', $o, $c);
            if ($c == 0) {
                $arcs['extract']['application/zip'] = array('cmd' => ELFINDER_UNZIP_PATH, 'argc' => '-q', 'ext' => 'zip', 'toSpec' => '-d ', 'getsize' => array('argc' => '-Z -t', 'regex' => '/^.+?,\s?([0-9]+).+$/', 'replace' => '$1'));
            }
            unset($o);
            $this->procExec(ELFINDER_RAR_PATH, $o, $c);
            if ($c == 0 || $c == 7) {
                $arcs['create']['application/x-rar'] = array('cmd' => ELFINDER_RAR_PATH, 'argc' => 'a -inul' . (defined('ELFINDER_RAR_MA4') && ELFINDER_RAR_MA4? ' -ma4' : '') . ' --', 'ext' => 'rar');
            }
            unset($o);
            $this->procExec(ELFINDER_UNRAR_PATH, $o, $c);
            if ($c == 0 || $c == 7) {
                $arcs['extract']['application/x-rar'] = array('cmd' => ELFINDER_UNRAR_PATH, 'argc' => 'x -y', 'ext' => 'rar', 'toSpec' => '', 'getsize' => array('argc' => 'l', 'regex' => '/^.+(?:\r\n|\n|\r)(?:(?:[^\r\n0-9]+[0-9]+[^\r\n0-9]+([0-9]+)[^\r\n]+)|(?:[^\r\n0-9]+([0-9]+)[^\r\n0-9]+[0-9]+[^\r\n]*))$/s', 'replace' => '$1'));
            }
            unset($o);
            $this->procExec(ELFINDER_7Z_PATH, $o, $c);
            if ($c == 0) {
                $arcs['create']['application/x-7z-compressed'] = array('cmd' => ELFINDER_7Z_PATH, 'argc' => 'a --', 'ext' => '7z');
                $arcs['extract']['application/x-7z-compressed'] = array('cmd' => ELFINDER_7Z_PATH, 'argc' => 'x -y', 'ext' => '7z', 'toSpec' => '-o', 'getsize' => array('argc' => 'l', 'regex' => '/^.+(?:\r\n|\n|\r)[^\r\n0-9]+([0-9]+)[^\r\n]+$/s', 'replace' => '$1'));

                if (empty($arcs['create']['application/zip'])) {
                    $arcs['create']['application/zip'] = array('cmd' => ELFINDER_7Z_PATH, 'argc' => 'a -tzip --', 'ext' => 'zip');
                }
                if (empty($arcs['extract']['application/zip'])) {
                    $arcs['extract']['application/zip'] = array('cmd' => ELFINDER_7Z_PATH, 'argc' => 'x -tzip -y', 'ext' => 'zip', 'toSpec' => '-o', 'getsize' => array('argc' => 'l', 'regex' => '/^.+(?:\r\n|\n|\r)[^\r\n0-9]+([0-9]+)[^\r\n]+$/s', 'replace' => '$1'));
                }
                if (empty($arcs['create']['application/x-tar'])) {
                    $arcs['create']['application/x-tar'] = array('cmd' => ELFINDER_7Z_PATH, 'argc' => 'a -ttar --', 'ext' => 'tar');
                }
                if (empty($arcs['extract']['application/x-tar'])) {
                    $arcs['extract']['application/x-tar'] = array('cmd' => ELFINDER_7Z_PATH, 'argc' => 'x -ttar -y', 'ext' => 'tar', 'toSpec' => '-o', 'getsize' => array('argc' => 'l', 'regex' => '/^.+(?:\r\n|\n|\r)[^\r\n0-9]+([0-9]+)[^\r\n]+$/s', 'replace' => '$1'));
                }
                if (substr(PHP_OS, 0, 3) === 'WIN' && empty($arcs['extract']['application/x-rar'])) {
                    $arcs['extract']['application/x-rar'] = array('cmd' => ELFINDER_7Z_PATH, 'argc' => 'x -trar -y', 'ext' => 'rar', 'toSpec' => '-o', 'getsize' => array('argc' => 'l', 'regex' => '/^.+(?:\r\n|\n|\r)[^\r\n0-9]+([0-9]+)[^\r\n]+$/s', 'replace' => '$1'));
                }
            }

        }

        // Use PHP ZipArchive Class
        if (class_exists('ZipArchive', false)) {
            if (empty($arcs['create']['application/zip'])) {
                $arcs['create']['application/zip'] = array('cmd' => 'phpfunction', 'argc' => array('self', 'zipArchiveZip'), 'ext' => 'zip');
            }
            if (empty($arcs['extract']['application/zip'])) {
                $arcs['extract']['application/zip'] = array('cmd' => 'phpfunction', 'argc' => array('self', 'zipArchiveUnzip'), 'ext' => 'zip');
            }
        }

        $this->session->set($sessionKey, $arcs);
        return elFinder::$archivers = $arcs;
    }

    /**
     * Resolve relative / (Unix-like)absolute path
     *
     * @param string $path target path
     * @param string $base base path
     *
     * @return string
     */
    protected function getFullPath($path, $base)
    {
        $separator = $this->separator;
        $systemroot = $this->systemRoot;
        $base = (string)$base;

        if ($base[0] === $separator && substr($base, 0, strlen($systemroot)) !== $systemroot) {
            $base = $systemroot . substr($base, 1);
        }
        if ($base !== $systemroot) {
            $base = rtrim($base, $separator);
        }

        // 'Here'
        if ($path === '' || $path === '.' . $separator) return $base;

        $sepquoted = preg_quote($separator, '#');

        if (substr($path, 0, 3) === '..' . $separator) {
            $path = $base . $separator . $path;
        }
        // normalize `/../`
        $normreg = '#(' . $sepquoted . ')[^' . $sepquoted . ']+' . $sepquoted . '\.\.' . $sepquoted . '#'; // '#(/)[^\/]+/\.\./#'
        while (preg_match($normreg, $path)) {
            $path = preg_replace($normreg, '$1', $path, 1);
        }
        if ($path !== $systemroot) {
            $path = rtrim($path, $separator);
        }

        // Absolute path
        if ($path[0] === $separator || strpos($path, $systemroot) === 0) {
            return $path;
        }

        $preg_separator = '#' . $sepquoted . '#';

        // Relative path from 'Here'
        if (substr($path, 0, 2) === '.' . $separator || $path[0] !== '.') {
            $arrn = preg_split($preg_separator, $path, -1, PREG_SPLIT_NO_EMPTY);
            if ($arrn[0] !== '.') {
                array_unshift($arrn, '.');
            }
            $arrn[0] = rtrim($base, $separator);
            return join($separator, $arrn);
        }

        return $path;
    }

    /**
     * Remove directory recursive on local file system
     *
     * @param string $dir Target dirctory path
     *
     * @return boolean
     * @throws elFinderAbortException
     * @author Naoki Sawada
     */
    public function rmdirRecursive($dir)
    {
        return self::localRmdirRecursive($dir);
    }

    /**
     * Create archive and return its path
     *
     * @param  string $dir   target dir
     * @param  array  $files files names list
     * @param  string $name  archive name
     * @param  array  $arc   archiver options
     *
     * @return string|bool
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov,
     * @author Alexey Sukhotin
     * @author Naoki Sawada
     */
    protected function makeArchive($dir, $files, $name, $arc)
    {
        if ($arc['cmd'] === 'phpfunction') {
            if (is_callable($arc['argc'])) {
                call_user_func_array($arc['argc'], array($dir, $files, $name));
            }
        } else {
            $cwd = getcwd();
            if (chdir($dir)) {
                foreach ($files as $i => $file) {
                    $files[$i] = '.' . DIRECTORY_SEPARATOR . basename($file);
                }
                $files = array_map('escapeshellarg', $files);
                $prefix = $switch = '';
                // The zip command accepts the "-" at the beginning of the file name as a command switch,
                // and can't use '--' before archive name, so add "./" to name for security reasons.
                if ($arc['ext'] === 'zip' && strpos($arc['argc'], '-tzip') === false) {
                    $prefix = './';
                    $switch = '-- ';
                }
                $cmd = $arc['cmd'] . ' ' . $arc['argc'] . ' ' . $prefix . escapeshellarg($name) . ' ' . $switch . implode(' ', $files);
                $err_out = '';
                $this->procExec($cmd, $o, $c, $err_out, $dir);
                chdir($cwd);
            } else {
                return false;
            }
        }
        $path = $dir . DIRECTORY_SEPARATOR . $name;
        return file_exists($path) ? $path : false;
    }

    /**
     * Unpack archive
     *
     * @param  string      $path archive path
     * @param  array       $arc  archiver command and arguments (same as in $this->archivers)
     * @param  bool|string $mode bool: remove archive ( unlink($path) ) | string: extract to directory
     *
     * @return void
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     * @author Alexey Sukhotin
     * @author Naoki Sawada
     */
    protected function unpackArchive($path, $arc, $mode = true)
    {
        if (is_string($mode)) {
            $dir = $mode;
            $chdir = null;
            $remove = false;
        } else {
            $dir = dirname($path);
            $chdir = $dir;
            $remove = $mode;
        }
        $dir = realpath($dir);
        $path = realpath($path);
        if ($arc['cmd'] === 'phpfunction') {
            if (is_callable($arc['argc'])) {
                call_user_func_array($arc['argc'], array($path, $dir));
            }
        } else {
            $cwd = getcwd();
            if (!$chdir || chdir($dir)) {
                if (!empty($arc['getsize'])) {
                    // Check total file size after extraction
                    $getsize = $arc['getsize'];
                    if (is_array($getsize) && !empty($getsize['regex']) && !empty($getsize['replace'])) {
                        $cmd = $arc['cmd'] . ' ' . $getsize['argc'] . ' ' . escapeshellarg($path) . (!empty($getsize['toSpec'])? (' ' . $getsize['toSpec']): '');
                        $this->procExec($cmd, $o, $c);
                        if ($o) {
                            $size = preg_replace($getsize['regex'], $getsize['replace'], trim($o));
                            $comp = function_exists('bccomp')? 'bccomp' : 'strnatcmp';
                            if (!empty($this->options['maxArcFilesSize'])) {
                                if ($comp($size, (string)$this->options['maxArcFilesSize']) > 0) {
                                    throw new Exception(elFinder::ERROR_ARC_MAXSIZE);
                                }
                            }
                        }
                        unset($o, $c);
                    }
                }
                if ($chdir) {
                    $cmd = $arc['cmd'] . ' ' . $arc['argc'] . ' ' . escapeshellarg(basename($path));
                } else {
                    $cmd = $arc['cmd'] . ' ' . $arc['argc'] . ' ' . escapeshellarg($path) . ' ' . $arc['toSpec'] . escapeshellarg($dir);
                }
                $this->procExec($cmd, $o, $c);
                $chdir && chdir($cwd);
            }
        }
        $remove && unlink($path);
    }

    /**
     * Check and filter the extracted items
     *
     * @param  string $path   target local path
     * @param  array  $checks types to check default: ['symlink', 'name', 'writable', 'mime']
     *
     * @return array  ['symlinks' => [], 'names' => [], 'writables' => [], 'mimes' => [], 'rmNames' => [], 'totalSize' => 0]
     * @throws elFinderAbortException
     * @throws Exception
     * @author Naoki Sawada
     */
    protected function checkExtractItems($path, $checks = null)
    {
        if (is_null($checks) || !is_array($checks)) {
            $checks = array('symlink', 'name', 'writable', 'mime');
        }
        $chkSymlink = in_array('symlink', $checks);
        $chkName = in_array('name', $checks);
        $chkWritable = in_array('writable', $checks);
        $chkMime = in_array('mime', $checks);

        $res = array(
            'symlinks' => array(),
            'names' => array(),
            'writables' => array(),
            'mimes' => array(),
            'rmNames' => array(),
            'totalSize' => 0
        );

        if (is_dir($path)) {
            $files = self::localScandir($path);
        } else {
            $files = array(basename($path));
            $path = dirname($path);
        }

        foreach ($files as $name) {
            $p = $path . DIRECTORY_SEPARATOR . $name;
            $utf8Name = elFinder::$instance->utf8Encode($name);
            if ($name !== $utf8Name) {
                $fsSame = false;
                if ($this->encoding) {
                    // test as fs encoding
                    $_utf8 = @iconv($this->encoding, 'utf-8//IGNORE', $name);
                    if (@iconv('utf-8', $this->encoding.'//IGNORE', $_utf8) === $name) {
                        $fsSame = true;
                        $utf8Name = $_utf8;
                    } else {
                        $_name = $this->convEncIn($utf8Name, true);
                    }
                } else {
                    $_name = $utf8Name;
                }
                if (!$fsSame && rename($p, $path . DIRECTORY_SEPARATOR . $_name)) {
                    $name = $_name;
                    $p = $path . DIRECTORY_SEPARATOR . $name;
                }
            }
            if (!is_readable($p)) {
                // Perhaps a symbolic link to open_basedir restricted location
                self::localRmdirRecursive($p);
                $res['symlinks'][] = $p;
                $res['rmNames'][] = $utf8Name;
                continue;
            }
            if ($chkSymlink && is_link($p)) {
                self::localRmdirRecursive($p);
                $res['symlinks'][] = $p;
                $res['rmNames'][] = $utf8Name;
                continue;
            }
            $isDir = is_dir($p);
            if ($chkName && !$this->nameAccepted($name, $isDir)) {
                self::localRmdirRecursive($p);
                $res['names'][] = $p;
                $res['rmNames'][] = $utf8Name;
                continue;
            }
            if ($chkWritable && !$this->attr($p, 'write', null, $isDir)) {
                self::localRmdirRecursive($p);
                $res['writables'][] = $p;
                $res['rmNames'][] = $utf8Name;
                continue;
            }
            if ($isDir) {
                $cRes = $this->checkExtractItems($p, $checks);
                foreach ($cRes as $k => $v) {
                    if (is_array($v)) {
                        $res[$k] = array_merge($res[$k], $cRes[$k]);
                    } else {
                        $res[$k] += $cRes[$k];
                    }
                }
            } else {
                if ($chkMime && ($mimeByName = elFinderVolumeDriver::mimetypeInternalDetect($name)) && !$this->allowPutMime($mimeByName)) {
                    self::localRmdirRecursive($p);
                    $res['mimes'][] = $p;
                    $res['rmNames'][] = $utf8Name;
                    continue;
                }
                $res['totalSize'] += (int)sprintf('%u', filesize($p));
            }
        }
        $res['rmNames'] = array_unique($res['rmNames']);

        return $res;
    }

    /**
     * Return files of target directory that is dotfiles excludes.
     *
     * @param  string $dir target directory path
     *
     * @return array
     * @throws Exception
     * @author Naoki Sawada
     */
    protected static function localScandir($dir)
    {
        // PHP function scandir() is not work well in specific environment. I dont know why.
        // ref. https://github.com/Studio-42/elFinder/issues/1248
        $files = array();
        if ($dh = opendir($dir)) {
            while (false !== ($file = readdir($dh))) {
                if ($file !== '.' && $file !== '..') {
                    $files[] = $file;
                }
            }
            closedir($dh);
        } else {
            throw new Exception('Can not open local directory.');
        }
        return $files;
    }

    /**
     * Remove directory recursive on local file system
     *
     * @param string $dir Target dirctory path
     *
     * @return boolean
     * @throws elFinderAbortException
     * @author Naoki Sawada
     */
    protected static function localRmdirRecursive($dir)
    {
        // try system command
        if (is_callable('exec')) {
            $o = '';
            $r = 1;
            if (substr(PHP_OS, 0, 3) === 'WIN') {
                if (!is_link($dir) && is_dir($dir)) {
                    exec('rd /S /Q ' . escapeshellarg($dir), $o, $r);
                } else {
                    exec('del /F /Q ' . escapeshellarg($dir), $o, $r);
                }
            } else {
                exec('rm -rf ' . escapeshellarg($dir), $o, $r);
            }
            if ($r === 0) {
                return true;
            }
        }
        if (!is_link($dir) && is_dir($dir)) {
            chmod($dir, 0777);
            if ($handle = opendir($dir)) {
                while (false !== ($file = readdir($handle))) {
                    if ($file === '.' || $file === '..') {
                        continue;
                    }
                    elFinder::extendTimeLimit(30);
                    $path = $dir . DIRECTORY_SEPARATOR . $file;
                    if (!is_link($dir) && is_dir($path)) {
                        self::localRmdirRecursive($path);
                    } else {
                        chmod($path, 0666);
                        unlink($path);
                    }
                }
                closedir($handle);
            }
            return rmdir($dir);
        } else {
            chmod($dir, 0666);
            return unlink($dir);
        }
    }

    /**
     * Move item recursive on local file system
     *
     * @param string $src
     * @param string $target
     * @param bool   $overWrite
     * @param bool   $copyJoin
     *
     * @return boolean
     * @throws elFinderAbortException
     * @throws Exception
     * @author Naoki Sawada
     */
    protected static function localMoveRecursive($src, $target, $overWrite = true, $copyJoin = true)
    {
        $res = false;
        if (!file_exists($target)) {
            return rename($src, $target);
        }
        if (!$copyJoin || !is_dir($target)) {
            if ($overWrite) {
                if (is_dir($target)) {
                    $del = self::localRmdirRecursive($target);
                } else {
                    $del = unlink($target);
                }
                if ($del) {
                    return rename($src, $target);
                }
            }
        } else {
            foreach (self::localScandir($src) as $item) {
                $res |= self::localMoveRecursive($src . DIRECTORY_SEPARATOR . $item, $target . DIRECTORY_SEPARATOR . $item, $overWrite, $copyJoin);
            }
        }
        return (bool)$res;
    }

    /**
     * Create Zip archive using PHP class ZipArchive
     *
     * @param  string        $dir     target dir
     * @param  array         $files   files names list
     * @param  string|object $zipPath Zip archive name
     *
     * @return bool
     * @author Naoki Sawada
     */
    protected static function zipArchiveZip($dir, $files, $zipPath)
    {
        try {
            if ($start = is_string($zipPath)) {
                $zip = new ZipArchive();
                if ($zip->open($dir . DIRECTORY_SEPARATOR . $zipPath, ZipArchive::CREATE) !== true) {
                    $zip = false;
                }
            } else {
                $zip = $zipPath;
            }
            if ($zip) {
                foreach ($files as $file) {
                    $path = $dir . DIRECTORY_SEPARATOR . $file;
                    if (is_dir($path)) {
                        $zip->addEmptyDir($file);
                        $_files = array();
                        if ($handle = opendir($path)) {
                            while (false !== ($entry = readdir($handle))) {
                                if ($entry !== "." && $entry !== "..") {
                                    $_files[] = $file . DIRECTORY_SEPARATOR . $entry;
                                }
                            }
                            closedir($handle);
                        }
                        if ($_files) {
                            self::zipArchiveZip($dir, $_files, $zip);
                        }
                    } else {
                        $zip->addFile($path, $file);
                    }
                }
                $start && $zip->close();
            }
        } catch (Exception $e) {
            return false;
        }
        return true;
    }

    /**
     * Unpack Zip archive using PHP class ZipArchive
     *
     * @param  string $zipPath Zip archive name
     * @param  string $toDir   Extract to path
     *
     * @return bool
     * @author Naoki Sawada
     */
    protected static function zipArchiveUnzip($zipPath, $toDir)
    {
        try {
            $zip = new ZipArchive();
            if ($zip->open($zipPath) === true) {
                // Check total file size after extraction
                $num = $zip->numFiles;
                $size = 0;
                $maxSize = empty(self::$maxArcFilesSize)? '' : (string)self::$maxArcFilesSize;
                $comp = function_exists('bccomp')? 'bccomp' : 'strnatcmp';
                for ($i = 0; $i < $num; $i++) {
                    $stat = $zip->statIndex($i);
                    $size += $stat['size'];
                    if (strpos((string)$size, 'E') !== false) {
                        // Cannot handle values exceeding PHP_INT_MAX
                        throw new Exception(elFinder::ERROR_ARC_MAXSIZE);
                    }
                    if (!$maxSize) {
                        if ($comp($size, $maxSize) > 0) {
                            throw new Exception(elFinder::ERROR_ARC_MAXSIZE);
                        }
                    }
                }
                // do extract
                $zip->extractTo($toDir);
                $zip->close();
            }
        } catch (Exception $e) {
            throw $e;
        }
        return true;
    }

    /**
     * Recursive symlinks search
     *
     * @param  string $path file/dir path
     *
     * @return bool
     * @throws Exception
     * @author Dmitry (dio) Levashov
     */
    protected static function localFindSymlinks($path)
    {
        if (is_link($path)) {
            return true;
        }

        if (is_dir($path)) {
            foreach (self::localScandir($path) as $name) {
                $p = $path . DIRECTORY_SEPARATOR . $name;
                if (is_link($p)) {
                    return true;
                }
                if (is_dir($p) && self::localFindSymlinks($p)) {
                    return true;
                }
            }
        }

        return false;
    }

    /**==================================* abstract methods *====================================**/

    /*********************** paths/urls *************************/

    /**
     * Return parent directory path
     *
     * @param  string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    abstract protected function _dirname($path);

    /**
     * Return file name
     *
     * @param  string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    abstract protected function _basename($path);

    /**
     * Join dir name and file name and return full path.
     * Some drivers (db) use int as path - so we give to concat path to driver itself
     *
     * @param  string $dir  dir path
     * @param  string $name file name
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    abstract protected function _joinPath($dir, $name);

    /**
     * Return normalized path
     *
     * @param  string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    abstract protected function _normpath($path);

    /**
     * Return file path related to root dir
     *
     * @param  string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    abstract protected function _relpath($path);

    /**
     * Convert path related to root dir into real path
     *
     * @param  string $path rel file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    abstract protected function _abspath($path);

    /**
     * Return fake path started from root dir.
     * Required to show path on client side.
     *
     * @param  string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    abstract protected function _path($path);

    /**
     * Return true if $path is children of $parent
     *
     * @param  string $path   path to check
     * @param  string $parent parent path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    abstract protected function _inpath($path, $parent);

    /**
     * Return stat for given path.
     * Stat contains following fields:
     * - (int)    size    file size in b. required
     * - (int)    ts      file modification time in unix time. required
     * - (string) mime    mimetype. required for folders, others - optionally
     * - (bool)   read    read permissions. required
     * - (bool)   write   write permissions. required
     * - (bool)   locked  is object locked. optionally
     * - (bool)   hidden  is object hidden. optionally
     * - (string) alias   for symlinks - link target path relative to root path. optionally
     * - (string) target  for symlinks - link target path. optionally
     * If file does not exists - returns empty array or false.
     *
     * @param  string $path file path
     *
     * @return array|false
     * @author Dmitry (dio) Levashov
     **/
    abstract protected function _stat($path);


    /***************** file stat ********************/


    /**
     * Return true if path is dir and has at least one childs directory
     *
     * @param  string $path dir path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    abstract protected function _subdirs($path);

    /**
     * Return object width and height
     * Ususaly used for images, but can be realize for video etc...
     *
     * @param  string $path file path
     * @param  string $mime file mime type
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    abstract protected function _dimensions($path, $mime);

    /******************** file/dir content *********************/

    /**
     * Return files list in directory
     *
     * @param  string $path dir path
     *
     * @return array
     * @author Dmitry (dio) Levashov
     **/
    abstract protected function _scandir($path);

    /**
     * Open file and return file pointer
     *
     * @param  string $path file path
     * @param  string $mode open mode
     *
     * @return resource|false
     * @author Dmitry (dio) Levashov
     **/
    abstract protected function _fopen($path, $mode = "rb");

    /**
     * Close opened file
     *
     * @param  resource $fp   file pointer
     * @param  string   $path file path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    abstract protected function _fclose($fp, $path = '');

    /********************  file/dir manipulations *************************/

    /**
     * Create dir and return created dir path or false on failed
     *
     * @param  string $path parent dir path
     * @param string  $name new directory name
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov
     **/
    abstract protected function _mkdir($path, $name);

    /**
     * Create file and return it's path or false on failed
     *
     * @param  string $path parent dir path
     * @param string  $name new file name
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov
     **/
    abstract protected function _mkfile($path, $name);

    /**
     * Create symlink
     *
     * @param  string $source    file to link to
     * @param  string $targetDir folder to create link in
     * @param  string $name      symlink name
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    abstract protected function _symlink($source, $targetDir, $name);

    /**
     * Copy file into another file (only inside one volume)
     *
     * @param  string $source source file path
     * @param         $targetDir
     * @param  string $name   file name
     *
     * @return bool|string
     * @internal param string $target target dir path
     * @author   Dmitry (dio) Levashov
     */
    abstract protected function _copy($source, $targetDir, $name);

    /**
     * Move file into another parent dir.
     * Return new file path or false.
     *
     * @param  string $source source file path
     * @param         $targetDir
     * @param  string $name   file name
     *
     * @return bool|string
     * @internal param string $target target dir path
     * @author   Dmitry (dio) Levashov
     */
    abstract protected function _move($source, $targetDir, $name);

    /**
     * Remove file
     *
     * @param  string $path file path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    abstract protected function _unlink($path);

    /**
     * Remove dir
     *
     * @param  string $path dir path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    abstract protected function _rmdir($path);

    /**
     * Create new file and write into it from file pointer.
     * Return new file path or false on error.
     *
     * @param  resource $fp   file pointer
     * @param  string   $dir  target dir path
     * @param  string   $name file name
     * @param  array    $stat file stat (required by some virtual fs)
     *
     * @return bool|string
     * @author Dmitry (dio) Levashov
     **/
    abstract protected function _save($fp, $dir, $name, $stat);

    /**
     * Get file contents
     *
     * @param  string $path file path
     *
     * @return string|false
     * @author Dmitry (dio) Levashov
     **/
    abstract protected function _getContents($path);

    /**
     * Write a string to a file
     *
     * @param  string $path    file path
     * @param  string $content new file content
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    abstract protected function _filePutContents($path, $content);

    /**
     * Extract files from archive
     *
     * @param  string $path file path
     * @param  array  $arc  archiver options
     *
     * @return bool
     * @author Dmitry (dio) Levashov,
     * @author Alexey Sukhotin
     **/
    abstract protected function _extract($path, $arc);

    /**
     * Create archive and return its path
     *
     * @param  string $dir   target dir
     * @param  array  $files files names list
     * @param  string $name  archive name
     * @param  array  $arc   archiver options
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov,
     * @author Alexey Sukhotin
     **/
    abstract protected function _archive($dir, $files, $name, $arc);

    /**
     * Detect available archivers
     *
     * @return void
     * @author Dmitry (dio) Levashov,
     * @author Alexey Sukhotin
     **/
    abstract protected function _checkArchivers();

    /**
     * Change file mode (chmod)
     *
     * @param  string $path file path
     * @param  string $mode octal string such as '0755'
     *
     * @return bool
     * @author David Bartle,
     **/
    abstract protected function _chmod($path, $mode);


} // END class
php/mime.types000064400000060400151215013420007342 0ustar00# This file maps Internet media types to unique file extension(s).
# Although created for httpd, this file is used by many software systems
# and has been placed in the public domain for unlimited redisribution.
#
# The table below contains both registered and (common) unregistered types.
# A type that has no unique extension can be ignored -- they are listed
# here to guide configurations toward known types and to make it easier to
# identify "new" types.  File extensions are also commonly used to indicate
# content languages and encodings, so choose them carefully.
#
# Internet media types should be registered as described in RFC 4288.
# The registry is at <http://www.iana.org/assignments/media-types/>.
#
# MIME type (lowercased)			Extensions
application/andrew-inset ez
application/applixware aw
application/atom+xml atom
application/atomcat+xml atomcat
application/atomsvc+xml atomsvc
application/ccxml+xml ccxml
application/cdmi-capability cdmia
application/cdmi-container cdmic
application/cdmi-domain cdmid
application/cdmi-object cdmio
application/cdmi-queue cdmiq
application/cu-seeme cu
application/davmount+xml davmount
application/docbook+xml dbk
application/dssc+der dssc
application/dssc+xml xdssc
application/ecmascript ecma
application/emma+xml emma
application/epub+zip epub
application/exi exi
application/font-tdpfr pfr
application/gml+xml gml
application/gpx+xml gpx
application/gxf gxf
application/hyperstudio stk
application/inkml+xml ink inkml
application/ipfix ipfix
application/java-archive jar
application/java-serialized-object ser
application/java-vm class
application/javascript js
application/json json
application/jsonml+json jsonml
application/lost+xml lostxml
application/mac-binhex40 hqx
application/mac-compactpro cpt
application/mads+xml mads
application/marc mrc
application/marcxml+xml mrcx
application/mathematica ma nb mb
application/mathml+xml mathml
application/mbox mbox
application/mediaservercontrol+xml mscml
application/metalink+xml metalink
application/metalink4+xml meta4
application/mets+xml mets
application/mods+xml mods
application/mp21 m21 mp21
application/mp4 mp4s
application/msword doc dot
application/mxf mxf
application/octet-stream bin dms lrf mar so dist distz pkg bpk dump elc deploy
application/oda oda
application/oebps-package+xml opf
application/ogg ogx
application/omdoc+xml omdoc
application/onenote onetoc onetoc2 onetmp onepkg
application/oxps oxps
application/patch-ops-error+xml xer
application/pdf pdf
application/pgp-encrypted pgp
application/pgp-signature asc sig
application/pics-rules prf
application/pkcs10 p10
application/pkcs7-mime p7m p7c
application/pkcs7-signature p7s
application/pkcs8 p8
application/pkix-attr-cert ac
application/pkix-cert cer
application/pkix-crl crl
application/pkix-pkipath pkipath
application/pkixcmp pki
application/pls+xml pls
application/postscript ai eps ps
application/prs.cww cww
application/pskc+xml pskcxml
application/rdf+xml rdf
application/reginfo+xml rif
application/relax-ng-compact-syntax rnc
application/resource-lists+xml rl
application/resource-lists-diff+xml rld
application/rls-services+xml rs
application/rpki-ghostbusters gbr
application/rpki-manifest mft
application/rpki-roa roa
application/rsd+xml rsd
application/rss+xml rss
application/rtf rtf
application/sbml+xml sbml
application/scvp-cv-request scq
application/scvp-cv-response scs
application/scvp-vp-request spq
application/scvp-vp-response spp
application/sdp sdp
application/set-payment-initiation setpay
application/set-registration-initiation setreg
application/shf+xml shf
application/smil+xml smi smil
application/sparql-query rq
application/sparql-results+xml srx
application/srgs gram
application/srgs+xml grxml
application/sru+xml sru
application/ssdl+xml ssdl
application/ssml+xml ssml
application/tei+xml tei teicorpus
application/thraud+xml tfi
application/timestamped-data tsd
application/vnd.3gpp.pic-bw-large plb
application/vnd.3gpp.pic-bw-small psb
application/vnd.3gpp.pic-bw-var pvb
application/vnd.3gpp2.tcap tcap
application/vnd.3m.post-it-notes pwn
application/vnd.accpac.simply.aso aso
application/vnd.accpac.simply.imp imp
application/vnd.acucobol acu
application/vnd.acucorp atc acutc
application/vnd.adobe.air-application-installer-package+zip air
application/vnd.adobe.formscentral.fcdt fcdt
application/vnd.adobe.fxp fxp fxpl
application/vnd.adobe.xdp+xml xdp
application/vnd.adobe.xfdf xfdf
application/vnd.ahead.space ahead
application/vnd.airzip.filesecure.azf azf
application/vnd.airzip.filesecure.azs azs
application/vnd.amazon.ebook azw
application/vnd.americandynamics.acc acc
application/vnd.amiga.ami ami
application/vnd.android.package-archive apk
application/vnd.anser-web-certificate-issue-initiation cii
application/vnd.anser-web-funds-transfer-initiation fti
application/vnd.antix.game-component atx
application/vnd.apple.installer+xml mpkg
application/vnd.apple.mpegurl m3u8
application/vnd.aristanetworks.swi swi
application/vnd.astraea-software.iota iota
application/vnd.audiograph aep
application/vnd.blueice.multipass mpm
application/vnd.bmi bmi
application/vnd.businessobjects rep
application/vnd.chemdraw+xml cdxml
application/vnd.chipnuts.karaoke-mmd mmd
application/vnd.cinderella cdy
application/vnd.claymore cla
application/vnd.cloanto.rp9 rp9
application/vnd.clonk.c4group c4g c4d c4f c4p c4u
application/vnd.cluetrust.cartomobile-config c11amc
application/vnd.cluetrust.cartomobile-config-pkg c11amz
application/vnd.commonspace csp
application/vnd.contact.cmsg cdbcmsg
application/vnd.cosmocaller cmc
application/vnd.crick.clicker clkx
application/vnd.crick.clicker.keyboard clkk
application/vnd.crick.clicker.palette clkp
application/vnd.crick.clicker.template clkt
application/vnd.crick.clicker.wordbank clkw
application/vnd.criticaltools.wbs+xml wbs
application/vnd.ctc-posml pml
application/vnd.cups-ppd ppd
application/vnd.curl.car car
application/vnd.curl.pcurl pcurl
application/vnd.dart dart
application/vnd.data-vision.rdz rdz
application/vnd.dece.data uvf uvvf uvd uvvd
application/vnd.dece.ttml+xml uvt uvvt
application/vnd.dece.unspecified uvx uvvx
application/vnd.dece.zip uvz uvvz
application/vnd.denovo.fcselayout-link fe_launch
application/vnd.dna dna
application/vnd.dolby.mlp mlp
application/vnd.dpgraph dpg
application/vnd.dreamfactory dfac
application/vnd.ds-keypoint kpxx
application/vnd.dvb.ait ait
application/vnd.dvb.service svc
application/vnd.dynageo geo
application/vnd.ecowin.chart mag
application/vnd.enliven nml
application/vnd.epson.esf esf
application/vnd.epson.msf msf
application/vnd.epson.quickanime qam
application/vnd.epson.salt slt
application/vnd.epson.ssf ssf
application/vnd.eszigno3+xml es3 et3
application/vnd.ezpix-album ez2
application/vnd.ezpix-package ez3
application/vnd.fdf fdf
application/vnd.fdsn.mseed mseed
application/vnd.fdsn.seed seed dataless
application/vnd.flographit gph
application/vnd.fluxtime.clip ftc
application/vnd.framemaker fm frame maker book
application/vnd.frogans.fnc fnc
application/vnd.frogans.ltf ltf
application/vnd.fsc.weblaunch fsc
application/vnd.fujitsu.oasys oas
application/vnd.fujitsu.oasys2 oa2
application/vnd.fujitsu.oasys3 oa3
application/vnd.fujitsu.oasysgp fg5
application/vnd.fujitsu.oasysprs bh2
application/vnd.fujixerox.ddd ddd
application/vnd.fujixerox.docuworks xdw
application/vnd.fujixerox.docuworks.binder xbd
application/vnd.fuzzysheet fzs
application/vnd.genomatix.tuxedo txd
application/vnd.geogebra.file ggb
application/vnd.geogebra.tool ggt
application/vnd.geometry-explorer gex gre
application/vnd.geonext gxt
application/vnd.geoplan g2w
application/vnd.geospace g3w
application/vnd.gmx gmx
application/vnd.google-earth.kml+xml kml
application/vnd.google-earth.kmz kmz
application/vnd.grafeq gqf gqs
application/vnd.groove-account gac
application/vnd.groove-help ghf
application/vnd.groove-identity-message gim
application/vnd.groove-injector grv
application/vnd.groove-tool-message gtm
application/vnd.groove-tool-template tpl
application/vnd.groove-vcard vcg
application/vnd.hal+xml hal
application/vnd.handheld-entertainment+xml zmm
application/vnd.hbci hbci
application/vnd.hhe.lesson-player les
application/vnd.hp-hpgl hpgl
application/vnd.hp-hpid hpid
application/vnd.hp-hps hps
application/vnd.hp-jlyt jlt
application/vnd.hp-pcl pcl
application/vnd.hp-pclxl pclxl
application/vnd.hydrostatix.sof-data sfd-hdstx
application/vnd.ibm.minipay mpy
application/vnd.ibm.modcap afp listafp list3820
application/vnd.ibm.rights-management irm
application/vnd.ibm.secure-container sc
application/vnd.iccprofile icc icm
application/vnd.igloader igl
application/vnd.immervision-ivp ivp
application/vnd.immervision-ivu ivu
application/vnd.insors.igm igm
application/vnd.intercon.formnet xpw xpx
application/vnd.intergeo i2g
application/vnd.intu.qbo qbo
application/vnd.intu.qfx qfx
application/vnd.ipunplugged.rcprofile rcprofile
application/vnd.irepository.package+xml irp
application/vnd.is-xpr xpr
application/vnd.isac.fcs fcs
application/vnd.jam jam
application/vnd.jcp.javame.midlet-rms rms
application/vnd.jisp jisp
application/vnd.joost.joda-archive joda
application/vnd.kahootz ktz ktr
application/vnd.kde.karbon karbon
application/vnd.kde.kchart chrt
application/vnd.kde.kformula kfo
application/vnd.kde.kivio flw
application/vnd.kde.kontour kon
application/vnd.kde.kpresenter kpr kpt
application/vnd.kde.kspread ksp
application/vnd.kde.kword kwd kwt
application/vnd.kenameaapp htke
application/vnd.kidspiration kia
application/vnd.kinar kne knp
application/vnd.koan skp skd skt skm
application/vnd.kodak-descriptor sse
application/vnd.las.las+xml lasxml
application/vnd.llamagraphics.life-balance.desktop lbd
application/vnd.llamagraphics.life-balance.exchange+xml lbe
application/vnd.lotus-1-2-3 123
application/vnd.lotus-approach apr
application/vnd.lotus-freelance pre
application/vnd.lotus-notes nsf
application/vnd.lotus-organizer org
application/vnd.lotus-screencam scm
application/vnd.lotus-wordpro lwp
application/vnd.macports.portpkg portpkg
application/vnd.mcd mcd
application/vnd.medcalcdata mc1
application/vnd.mediastation.cdkey cdkey
application/vnd.mfer mwf
application/vnd.mfmp mfm
application/vnd.micrografx.flo flo
application/vnd.micrografx.igx igx
application/vnd.mif mif
application/vnd.mobius.daf daf
application/vnd.mobius.dis dis
application/vnd.mobius.mbk mbk
application/vnd.mobius.mqy mqy
application/vnd.mobius.msl msl
application/vnd.mobius.plc plc
application/vnd.mobius.txf txf
application/vnd.mophun.application mpn
application/vnd.mophun.certificate mpc
application/vnd.mozilla.xul+xml xul
application/vnd.ms-artgalry cil
application/vnd.ms-cab-compressed cab
application/vnd.ms-excel xls xlm xla xlc xlt xlw
application/vnd.ms-excel.addin.macroenabled.12 xlam
application/vnd.ms-excel.sheet.binary.macroenabled.12 xlsb
application/vnd.ms-excel.sheet.macroenabled.12 xlsm
application/vnd.ms-excel.template.macroenabled.12 xltm
application/vnd.ms-fontobject eot
application/vnd.ms-htmlhelp chm
application/vnd.ms-ims ims
application/vnd.ms-lrm lrm
application/vnd.ms-officetheme thmx
application/vnd.ms-pki.seccat cat
application/vnd.ms-pki.stl stl
application/vnd.ms-powerpoint ppt pps pot
application/vnd.ms-powerpoint.addin.macroenabled.12 ppam
application/vnd.ms-powerpoint.presentation.macroenabled.12 pptm
application/vnd.ms-powerpoint.slide.macroenabled.12 sldm
application/vnd.ms-powerpoint.slideshow.macroenabled.12 ppsm
application/vnd.ms-powerpoint.template.macroenabled.12 potm
application/vnd.ms-project mpp mpt
application/vnd.ms-word.document.macroenabled.12 docm
application/vnd.ms-word.template.macroenabled.12 dotm
application/vnd.ms-works wps wks wcm wdb
application/vnd.ms-wpl wpl
application/vnd.ms-xpsdocument xps
application/vnd.mseq mseq
application/vnd.musician mus
application/vnd.muvee.style msty
application/vnd.mynfc taglet
application/vnd.neurolanguage.nlu nlu
application/vnd.nitf ntf nitf
application/vnd.noblenet-directory nnd
application/vnd.noblenet-sealer nns
application/vnd.noblenet-web nnw
application/vnd.nokia.n-gage.data ngdat
application/vnd.nokia.n-gage.symbian.install n-gage
application/vnd.nokia.radio-preset rpst
application/vnd.nokia.radio-presets rpss
application/vnd.novadigm.edm edm
application/vnd.novadigm.edx edx
application/vnd.novadigm.ext ext
application/vnd.oasis.opendocument.chart odc
application/vnd.oasis.opendocument.chart-template otc
application/vnd.oasis.opendocument.database odb
application/vnd.oasis.opendocument.formula odf
application/vnd.oasis.opendocument.formula-template odft
application/vnd.oasis.opendocument.graphics odg
application/vnd.oasis.opendocument.graphics-template otg
application/vnd.oasis.opendocument.image odi
application/vnd.oasis.opendocument.image-template oti
application/vnd.oasis.opendocument.presentation odp
application/vnd.oasis.opendocument.presentation-template otp
application/vnd.oasis.opendocument.spreadsheet ods
application/vnd.oasis.opendocument.spreadsheet-template ots
application/vnd.oasis.opendocument.text odt
application/vnd.oasis.opendocument.text-master odm
application/vnd.oasis.opendocument.text-template ott
application/vnd.oasis.opendocument.text-web oth
application/vnd.olpc-sugar xo
application/vnd.oma.dd2+xml dd2
application/vnd.openofficeorg.extension oxt
application/vnd.openxmlformats-officedocument.presentationml.presentation pptx
application/vnd.openxmlformats-officedocument.presentationml.slide sldx
application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx
application/vnd.openxmlformats-officedocument.presentationml.template potx
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx
application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx
application/vnd.openxmlformats-officedocument.wordprocessingml.document docx
application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx
application/vnd.osgeo.mapguide.package mgp
application/vnd.osgi.dp dp
application/vnd.osgi.subsystem esa
application/vnd.palm pdb pqa oprc
application/vnd.pawaafile paw
application/vnd.pg.format str
application/vnd.pg.osasli ei6
application/vnd.picsel efif
application/vnd.pmi.widget wg
application/vnd.pocketlearn plf
application/vnd.powerbuilder6 pbd
application/vnd.previewsystems.box box
application/vnd.proteus.magazine mgz
application/vnd.publishare-delta-tree qps
application/vnd.pvi.ptid1 ptid
application/vnd.quark.quarkxpress qxd qxt qwd qwt qxl qxb
application/vnd.realvnc.bed bed
application/vnd.recordare.musicxml mxl
application/vnd.recordare.musicxml+xml musicxml
application/vnd.rig.cryptonote cryptonote
application/vnd.rim.cod cod
application/vnd.rn-realmedia rm
application/vnd.rn-realmedia-vbr rmvb
application/vnd.route66.link66+xml link66
application/vnd.sailingtracker.track st
application/vnd.seemail see
application/vnd.sema sema
application/vnd.semd semd
application/vnd.semf semf
application/vnd.shana.informed.formdata ifm
application/vnd.shana.informed.formtemplate itp
application/vnd.shana.informed.interchange iif
application/vnd.shana.informed.package ipk
application/vnd.simtech-mindmapper twd twds
application/vnd.smaf mmf
application/vnd.smart.teacher teacher
application/vnd.solent.sdkm+xml sdkm sdkd
application/vnd.spotfire.dxp dxp
application/vnd.spotfire.sfs sfs
application/vnd.stardivision.calc sdc
application/vnd.stardivision.draw sda
application/vnd.stardivision.impress sdd
application/vnd.stardivision.math smf
application/vnd.stardivision.writer sdw vor
application/vnd.stardivision.writer-global sgl
application/vnd.stepmania.package smzip
application/vnd.stepmania.stepchart sm
application/vnd.sun.xml.calc sxc
application/vnd.sun.xml.calc.template stc
application/vnd.sun.xml.draw sxd
application/vnd.sun.xml.draw.template std
application/vnd.sun.xml.impress sxi
application/vnd.sun.xml.impress.template sti
application/vnd.sun.xml.math sxm
application/vnd.sun.xml.writer sxw
application/vnd.sun.xml.writer.global sxg
application/vnd.sun.xml.writer.template stw
application/vnd.sus-calendar sus susp
application/vnd.svd svd
application/vnd.symbian.install sis sisx
application/vnd.syncml+xml xsm
application/vnd.syncml.dm+wbxml bdm
application/vnd.syncml.dm+xml xdm
application/vnd.tao.intent-module-archive tao
application/vnd.tcpdump.pcap pcap cap dmp
application/vnd.tmobile-livetv tmo
application/vnd.trid.tpt tpt
application/vnd.triscape.mxs mxs
application/vnd.trueapp tra
application/vnd.ufdl ufd ufdl
application/vnd.uiq.theme utz
application/vnd.umajin umj
application/vnd.unity unityweb
application/vnd.uoml+xml uoml
application/vnd.vcx vcx
application/vnd.visio vsd vst vss vsw
application/vnd.visionary vis
application/vnd.vsf vsf
application/vnd.wap.wbxml wbxml
application/vnd.wap.wmlc wmlc
application/vnd.wap.wmlscriptc wmlsc
application/vnd.webturbo wtb
application/vnd.wolfram.player nbp
application/vnd.wordperfect wpd
application/vnd.wqd wqd
application/vnd.wt.stf stf
application/vnd.xara xar
application/vnd.xfdl xfdl
application/vnd.yamaha.hv-dic hvd
application/vnd.yamaha.hv-script hvs
application/vnd.yamaha.hv-voice hvp
application/vnd.yamaha.openscoreformat osf
application/vnd.yamaha.openscoreformat.osfpvg+xml osfpvg
application/vnd.yamaha.smaf-audio saf
application/vnd.yamaha.smaf-phrase spf
application/vnd.yellowriver-custom-menu cmp
application/vnd.zul zir zirz
application/vnd.zzazz.deck+xml zaz
application/voicexml+xml vxml
application/widget wgt
application/winhlp hlp
application/wsdl+xml wsdl
application/wspolicy+xml wspolicy
application/x-7z-compressed 7z
application/x-abiword abw
application/x-ace-compressed ace
application/x-apple-diskimage dmg
application/x-authorware-bin aab x32 u32 vox
application/x-authorware-map aam
application/x-authorware-seg aas
application/x-bcpio bcpio
application/x-bittorrent torrent
application/x-blorb blb blorb
application/x-bzip bz
application/x-bzip2 bz2 boz
application/x-cbr cbr cba cbt cbz cb7
application/x-cdlink vcd
application/x-cfs-compressed cfs
application/x-chat chat
application/x-chess-pgn pgn
application/x-conference nsc
application/x-cpio cpio
application/x-csh csh
application/x-debian-package deb udeb
application/x-dgc-compressed dgc
application/x-director dir dcr dxr cst cct cxt w3d fgd swa
application/x-doom wad
application/x-dtbncx+xml ncx
application/x-dtbook+xml dtb
application/x-dtbresource+xml res
application/x-dvi dvi
application/x-envoy evy
application/x-eva eva
application/x-font-bdf bdf
application/x-font-ghostscript gsf
application/x-font-linux-psf psf
application/x-font-pcf pcf
application/x-font-snf snf
application/x-font-type1 pfa pfb pfm afm
application/x-freearc arc
application/x-futuresplash spl
application/x-gca-compressed gca
application/x-glulx ulx
application/x-gnumeric gnumeric
application/x-gramps-xml gramps
application/x-gtar gtar
application/x-hdf hdf
application/x-install-instructions install
application/x-iso9660-image iso
application/x-java-jnlp-file jnlp
application/x-latex latex
application/x-lzh-compressed lzh lha
application/x-mie mie
application/x-mobipocket-ebook prc mobi
application/x-ms-application application
application/x-ms-shortcut lnk
application/x-ms-wmd wmd
application/x-ms-wmz wmz
application/x-ms-xbap xbap
application/x-msaccess mdb
application/x-msbinder obd
application/x-mscardfile crd
application/x-msclip clp
application/x-msdownload exe dll com bat msi
application/x-msmediaview mvb m13 m14
application/x-msmetafile wmf wmz emf emz
application/x-msmoney mny
application/x-mspublisher pub
application/x-msschedule scd
application/x-msterminal trm
application/x-mswrite wri
application/x-netcdf nc cdf
application/x-nzb nzb
application/x-pkcs12 p12 pfx
application/x-pkcs7-certificates p7b spc
application/x-pkcs7-certreqresp p7r
application/x-rar-compressed rar
application/x-research-info-systems ris
application/x-sh sh
application/x-shar shar
application/x-shockwave-flash swf
application/x-silverlight-app xap
application/x-sql sql
application/x-stuffit sit
application/x-stuffitx sitx
application/x-subrip srt
application/x-sv4cpio sv4cpio
application/x-sv4crc sv4crc
application/x-t3vm-image t3
application/x-tads gam
application/x-tar tar
application/x-tcl tcl
application/x-tex tex
application/x-tex-tfm tfm
application/x-texinfo texinfo texi
application/x-tgif obj
application/x-ustar ustar
application/x-wais-source src
application/x-x509-ca-cert der crt
application/x-xfig fig
application/x-xliff+xml xlf
application/x-xpinstall xpi
application/x-xz xz
application/x-zmachine z1 z2 z3 z4 z5 z6 z7 z8
application/xaml+xml xaml
application/xcap-diff+xml xdf
application/xenc+xml xenc
application/xhtml+xml xhtml xht
application/xml xml xsl
application/xml-dtd dtd
application/xop+xml xop
application/xproc+xml xpl
application/xslt+xml xslt
application/xspf+xml xspf
application/xv+xml mxml xhvml xvml xvm
application/yang yang
application/yin+xml yin
application/zip zip
audio/adpcm adp
audio/basic au snd
audio/midi mid midi kar rmi
audio/mp4 m4a mp4a
audio/mpeg mpga mp2 mp2a mp3 m2a m3a
audio/ogg oga ogg spx
audio/s3m s3m
audio/silk sil
audio/vnd.dece.audio uva uvva
audio/vnd.digital-winds eol
audio/vnd.dra dra
audio/vnd.dts dts
audio/vnd.dts.hd dtshd
audio/vnd.lucent.voice lvp
audio/vnd.ms-playready.media.pya pya
audio/vnd.nuera.ecelp4800 ecelp4800
audio/vnd.nuera.ecelp7470 ecelp7470
audio/vnd.nuera.ecelp9600 ecelp9600
audio/vnd.rip rip
audio/webm weba
audio/x-aac aac
audio/x-aiff aif aiff aifc
audio/x-caf caf
audio/x-flac flac
audio/x-matroska mka
audio/x-mpegurl m3u
audio/x-ms-wax wax
audio/x-ms-wma wma
audio/x-pn-realaudio ram ra
audio/x-pn-realaudio-plugin rmp
audio/x-wav wav
audio/xm xm
chemical/x-cdx cdx
chemical/x-cif cif
chemical/x-cmdf cmdf
chemical/x-cml cml
chemical/x-csml csml
chemical/x-xyz xyz
font/collection ttc
font/otf otf
font/ttf ttf
font/woff woff
font/woff2 woff2
image/bmp bmp
image/cgm cgm
image/g3fax g3
image/gif gif
image/ief ief
image/jpeg jpeg jpg jpe
image/ktx ktx
image/png png
image/prs.btif btif
image/sgi sgi
image/svg+xml svg svgz
image/tiff tiff tif
image/vnd.adobe.photoshop psd
image/vnd.dece.graphic uvi uvvi uvg uvvg
image/vnd.djvu djvu djv
image/vnd.dvb.subtitle sub
image/vnd.dwg dwg
image/vnd.dxf dxf
image/vnd.fastbidsheet fbs
image/vnd.fpx fpx
image/vnd.fst fst
image/vnd.fujixerox.edmics-mmr mmr
image/vnd.fujixerox.edmics-rlc rlc
image/vnd.ms-modi mdi
image/vnd.ms-photo wdp
image/vnd.net-fpx npx
image/vnd.wap.wbmp wbmp
image/vnd.xiff xif
image/webp webp
image/x-3ds 3ds
image/x-cmu-raster ras
image/x-cmx cmx
image/x-freehand fh fhc fh4 fh5 fh7
image/x-icon ico
image/x-mrsid-image sid
image/x-pcx pcx
image/x-pict pic pct
image/x-portable-anymap pnm
image/x-portable-bitmap pbm
image/x-portable-graymap pgm
image/x-portable-pixmap ppm
image/x-rgb rgb
image/x-tga tga
image/x-xbitmap xbm
image/x-xpixmap xpm
image/x-xwindowdump xwd
message/rfc822 eml mime
model/iges igs iges
model/mesh msh mesh silo
model/vnd.collada+xml dae
model/vnd.dwf dwf
model/vnd.gdl gdl
model/vnd.gtw gtw
model/vnd.mts mts
model/vnd.vtu vtu
model/vrml wrl vrml
model/x3d+binary x3db x3dbz
model/x3d+vrml x3dv x3dvz
model/x3d+xml x3d x3dz
text/cache-manifest appcache
text/calendar ics ifb
text/css css
text/csv csv
text/html html htm
text/n3 n3
text/plain txt text conf def list log in
text/prs.lines.tag dsc
text/richtext rtx
text/sgml sgml sgm
text/tab-separated-values tsv
text/troff t tr roff man me ms
text/turtle ttl
text/uri-list uri uris urls
text/vcard vcard
text/vnd.curl curl
text/vnd.curl.dcurl dcurl
text/vnd.curl.mcurl mcurl
text/vnd.curl.scurl scurl
text/vnd.dvb.subtitle sub
text/vnd.fly fly
text/vnd.fmi.flexstor flx
text/vnd.graphviz gv
text/vnd.in3d.3dml 3dml
text/vnd.in3d.spot spot
text/vnd.sun.j2me.app-descriptor jad
text/vnd.wap.wml wml
text/vnd.wap.wmlscript wmls
text/x-asm s asm
text/x-c c cc cxx cpp h hh dic
text/x-fortran f for f77 f90
text/x-java-source java
text/x-nfo nfo
text/x-opml opml
text/x-pascal p pas
text/x-setext etx
text/x-sfv sfv
text/x-uuencode uu
text/x-vcalendar vcs
text/x-vcard vcf
video/3gpp 3gp
video/3gpp2 3g2
video/h261 h261
video/h263 h263
video/h264 h264
video/jpeg jpgv
video/jpm jpm jpgm
video/mj2 mj2 mjp2
video/mp4 mp4 mp4v mpg4
video/mpeg mpeg mpg mpe m1v m2v
video/ogg ogv
video/quicktime qt mov
video/vnd.dece.hd uvh uvvh
video/vnd.dece.mobile uvm uvvm
video/vnd.dece.pd uvp uvvp
video/vnd.dece.sd uvs uvvs
video/vnd.dece.video uvv uvvv
video/vnd.dvb.file dvb
video/vnd.fvt fvt
video/vnd.mpegurl mxu m4u
video/vnd.ms-playready.media.pyv pyv
video/vnd.uvvu.mp4 uvu uvvu
video/vnd.vivo viv
video/webm webm
video/x-f4v f4v
video/x-fli fli
video/x-flv flv
video/x-m4v m4v
video/x-matroska mkv mk3d mks
video/x-mng mng
video/x-ms-asf asf asx
video/x-ms-vob vob
video/x-ms-wm wm
video/x-ms-wmv wmv
video/x-ms-wmx wmx
video/x-ms-wvx wvx
video/x-msvideo avi
video/x-sgi-movie movie
video/x-smv smv
x-conference/x-cooltalk ice
php/elFinderVolumeGroup.class.php000064400000012373151215013420013105 0ustar00<?php

/**
 * elFinder driver for Volume Group.
 *
 * @author Naoki Sawada
 **/
class elFinderVolumeGroup extends elFinderVolumeDriver
{

    /**
     * Driver id
     * Must be started from letter and contains [a-z0-9]
     * Used as part of volume id
     *
     * @var string
     **/
    protected $driverId = 'g';


    /**
     * Constructor
     * Extend options with required fields
     */
    public function __construct()
    {
        $this->options['type'] = 'group';
        $this->options['path'] = '/';
        $this->options['dirUrlOwn'] = true;
        $this->options['syncMinMs'] = 0;
        $this->options['tmbPath'] = '';
        $this->options['disabled'] = array(
            'archive',
            'copy',
            'cut',
            'duplicate',
            'edit',
            'empty',
            'extract',
            'getfile',
            'mkdir',
            'mkfile',
            'paste',
            'resize',
            'rm',
            'upload'
        );
    }

    /*********************************************************************/
    /*                               FS API                              */
    /*********************************************************************/

    /*********************** paths/urls *************************/

    /**
     * @inheritdoc
     **/
    protected function _dirname($path)
    {
        return '/';
    }

    /**
     * {@inheritDoc}
     **/
    protected function _basename($path)
    {
        return '';
    }

    /**
     * {@inheritDoc}
     **/
    protected function _joinPath($dir, $name)
    {
        return '/' . $name;
    }

    /**
     * {@inheritDoc}
     **/
    protected function _normpath($path)
    {
        return '/';
    }

    /**
     * {@inheritDoc}
     **/
    protected function _relpath($path)
    {
        return '/';
    }

    /**
     * {@inheritDoc}
     **/
    protected function _abspath($path)
    {
        return '/';
    }

    /**
     * {@inheritDoc}
     **/
    protected function _path($path)
    {
        return '/';
    }

    /**
     * {@inheritDoc}
     **/
    protected function _inpath($path, $parent)
    {
        return false;
    }



    /***************** file stat ********************/

    /**
     * {@inheritDoc}
     **/
    protected function _stat($path)
    {
        if ($path === '/') {
            return array(
                'size' => 0,
                'ts' => 0,
                'mime' => 'directory',
                'read' => true,
                'write' => false,
                'locked' => true,
                'hidden' => false,
                'dirs' => 0
            );
        }
        return false;
    }

    /**
     * {@inheritDoc}
     **/
    protected function _subdirs($path)
    {
        return false;
    }

    /**
     * {@inheritDoc}
     **/
    protected function _dimensions($path, $mime)
    {
        return false;
    }
    /******************** file/dir content *********************/

    /**
     * {@inheritDoc}
     **/
    protected function readlink($path)
    {
        return null;
    }

    /**
     * {@inheritDoc}
     **/
    protected function _scandir($path)
    {
        return array();
    }

    /**
     * {@inheritDoc}
     **/
    protected function _fopen($path, $mode = 'rb')
    {
        return false;
    }

    /**
     * {@inheritDoc}
     **/
    protected function _fclose($fp, $path = '')
    {
        return true;
    }

    /********************  file/dir manipulations *************************/

    /**
     * {@inheritDoc}
     **/
    protected function _mkdir($path, $name)
    {
        return false;
    }

    /**
     * {@inheritDoc}
     **/
    protected function _mkfile($path, $name)
    {
        return false;
    }

    /**
     * {@inheritDoc}
     **/
    protected function _symlink($source, $targetDir, $name)
    {
        return false;
    }

    /**
     * {@inheritDoc}
     **/
    protected function _copy($source, $targetDir, $name)
    {
        return false;
    }

    /**
     * {@inheritDoc}
     **/
    protected function _move($source, $targetDir, $name)
    {
        return false;
    }

    /**
     * {@inheritDoc}
     **/
    protected function _unlink($path)
    {
        return false;
    }

    /**
     * {@inheritDoc}
     **/
    protected function _rmdir($path)
    {
        return false;
    }

    /**
     * {@inheritDoc}
     **/
    protected function _save($fp, $dir, $name, $stat)
    {
        return false;
    }

    /**
     * {@inheritDoc}
     **/
    protected function _getContents($path)
    {
        return false;
    }

    /**
     * {@inheritDoc}
     **/
    protected function _filePutContents($path, $content)
    {
        return false;
    }

    /**
     * {@inheritDoc}
     **/
    protected function _checkArchivers()
    {
        return;
    }

    /**
     * {@inheritDoc}
     **/
    protected function _chmod($path, $mode)
    {
        return false;
    }

    /**
     * {@inheritDoc}
     **/
    protected function _findSymlinks($path)
    {
        return false;
    }

    /**
     * {@inheritDoc}
     **/
    protected function _extract($path, $arc)
    {
        return false;
    }

    /**
     * {@inheritDoc}
     **/
    protected function _archive($dir, $files, $name, $arc)
    {
        return false;
    }
}

php/elFinderVolumeOneDrive.class.php000064400000203172151215013420013523 0ustar00<?php

/**
 * Simple elFinder driver for OneDrive
 * onedrive api v5.0.
 *
 * @author Dmitry (dio) Levashov
 * @author Cem (discofever)
 **/
class elFinderVolumeOneDrive extends elFinderVolumeDriver
{
    /**
     * Driver id
     * Must be started from letter and contains [a-z0-9]
     * Used as part of volume id.
     *
     * @var string
     **/
    protected $driverId = 'od';

    /**
     * @var string The base URL for API requests
     **/
    const API_URL = 'https://graph.microsoft.com/v1.0/me/drive/items/';

    /**
     * @var string The base URL for authorization requests
     */
    const AUTH_URL = 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize';

    /**
     * @var string The base URL for token requests
     */
    const TOKEN_URL = 'https://login.microsoftonline.com/common/oauth2/v2.0/token';

    /**
     * OneDrive token object.
     *
     * @var object
     **/
    protected $token = null;

    /**
     * Directory for tmp files
     * If not set driver will try to use tmbDir as tmpDir.
     *
     * @var string
     **/
    protected $tmp = '';

    /**
     * Net mount key.
     *
     * @var string
     **/
    public $netMountKey = '';

    /**
     * Thumbnail prefix.
     *
     * @var string
     **/
    protected $tmbPrefix = '';

    /**
     * hasCache by folders.
     *
     * @var array
     **/
    protected $HasdirsCache = array();

    /**
     * Query options of API call.
     *
     * @var array
     */
    protected $queryOptions = array();

    /**
     * Current token expires
     *
     * @var integer
     **/
    private $expires;

    /**
     * Path to access token file for permanent mount
     *
     * @var string
     */
    private $aTokenFile = '';

    /**
     * Constructor
     * Extend options with required fields.
     *
     * @author Dmitry (dio) Levashov
     * @author Cem (DiscoFever)
     **/
    public function __construct()
    {
        $opts = array(
            'client_id' => '',
            'client_secret' => '',
            'accessToken' => '',
            'root' => 'OneDrive.com',
            'OneDriveApiClient' => '',
            'path' => '/',
            'separator' => '/',
            'tmbPath' => '',
            'tmbURL' => '',
            'tmpPath' => '',
            'acceptedName' => '#^[^/\\?*:|"<>]*[^./\\?*:|"<>]$#',
            'rootCssClass' => 'elfinder-navbar-root-onedrive',
            'useApiThumbnail' => true,
        );
        $this->options = array_merge($this->options, $opts);
        $this->options['mimeDetect'] = 'internal';
    }

    /*********************************************************************/
    /*                        ORIGINAL FUNCTIONS                         */
    /*********************************************************************/

    /**
     * Obtains a new access token from OAuth. This token is valid for one hour.
     *
     * @param        $client_id
     * @param        $client_secret
     * @param string $code         The code returned by OneDrive after
     *                             successful log in
     *
     * @return object|string
     * @throws Exception Thrown if the redirect URI of this Client instance's
     *                    state is not set
     */
    protected function _od_obtainAccessToken($client_id, $client_secret, $code, $nodeid)
    {
        if (null === $client_id) {
            return 'The client ID must be set to call obtainAccessToken()';
        }

        if (null === $client_secret) {
            return 'The client Secret must be set to call obtainAccessToken()';
        }

        $redirect = elFinder::getConnectorUrl();
        if (strpos($redirect, '/netmount/onedrive/') === false) {
            $redirect .= '/netmount/onedrive/' . ($nodeid === 'elfinder'? '1' : $nodeid);
        }

        $url = self::TOKEN_URL;

        $curl = curl_init();

        $fields = http_build_query(
            array(
                'client_id' => $client_id,
                'redirect_uri' => $redirect,
                'client_secret' => $client_secret,
                'code' => $code,
                'grant_type' => 'authorization_code',
            )
        );

        curl_setopt_array($curl, array(
            // General options.
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => $fields,

            CURLOPT_HTTPHEADER => array(
                'Content-Length: ' . strlen($fields),
            ),

            CURLOPT_URL => $url,
        ));

        $result = elFinder::curlExec($curl);

        $decoded = json_decode($result);

        if (null === $decoded) {
            throw new \Exception('json_decode() failed');
        }

        if (!empty($decoded->error)) {
            $error = $decoded->error;
            if (!empty($decoded->error_description)) {
                $error .= ': ' . $decoded->error_description;
            }
            throw new \Exception($error);
        }

        $res = (object)array(
            'expires' => time() + $decoded->expires_in - 30,
            'initialToken' => '',
            'data' => $decoded
        );
        if (!empty($decoded->refresh_token)) {
            $res->initialToken = md5($client_id . $decoded->refresh_token);
        }
        return $res;
    }

    /**
     * Get token and auto refresh.
     *
     * @return true
     * @throws Exception
     */
    protected function _od_refreshToken()
    {
        if (!property_exists($this->token, 'expires') || $this->token->expires < time()) {
            if (!$this->options['client_id']) {
                $this->options['client_id'] = ELFINDER_ONEDRIVE_CLIENTID;
            }

            if (!$this->options['client_secret']) {
                $this->options['client_secret'] = ELFINDER_ONEDRIVE_CLIENTSECRET;
            }

            if (empty($this->token->data->refresh_token)) {
                throw new \Exception(elFinder::ERROR_REAUTH_REQUIRE);
            } else {
                $refresh_token = $this->token->data->refresh_token;
                $initialToken = $this->_od_getInitialToken();
            }

            $url = self::TOKEN_URL;

            $curl = curl_init();

            curl_setopt_array($curl, array(
                // General options.
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_POST => true, // i am sending post data
                CURLOPT_POSTFIELDS => 'client_id=' . urlencode($this->options['client_id'])
                    . '&client_secret=' . urlencode($this->options['client_secret'])
                    . '&grant_type=refresh_token'
                    . '&refresh_token=' . urlencode($this->token->data->refresh_token),

                CURLOPT_URL => $url,
            ));

            $result = elFinder::curlExec($curl);

            $decoded = json_decode($result);

            if (!$decoded) {
                throw new \Exception('json_decode() failed');
            }

            if (empty($decoded->access_token)) {
                if ($this->aTokenFile) {
                    if (is_file($this->aTokenFile)) {
                        unlink($this->aTokenFile);
                    }
                }
                $err = property_exists($decoded, 'error')? ' ' . $decoded->error : '';
                $err .= property_exists($decoded, 'error_description')? ' ' . $decoded->error_description : '';
                throw new \Exception($err? $err : elFinder::ERROR_REAUTH_REQUIRE);
            }

            $token = (object)array(
                'expires' => time() + $decoded->expires_in - 30,
                'initialToken' => $initialToken,
                'data' => $decoded,
            );

            $this->token = $token;
            $json = json_encode($token);

            if (!empty($decoded->refresh_token)) {
                if (empty($this->options['netkey']) && $this->aTokenFile) {
                    file_put_contents($this->aTokenFile, json_encode($token));
                    $this->options['accessToken'] = $json;
                } else if (!empty($this->options['netkey'])) {
                    // OAuth2 refresh token can be used only once,
                    // so update it if it is the same as the token file
                    $aTokenFile = $this->_od_getATokenFile();
                    if ($aTokenFile && is_file($aTokenFile)) {
                        if ($_token = json_decode(file_get_contents($aTokenFile))) {
                            if ($_token->data->refresh_token === $refresh_token) {
                                file_put_contents($aTokenFile, $json);
                            }
                        }
                    }
                    $this->options['accessToken'] = $json;
                    // update session value
                    elFinder::$instance->updateNetVolumeOption($this->options['netkey'], 'accessToken', $this->options['accessToken']);
                    $this->session->set('OneDriveTokens', $token);
                } else {
                    throw new \Exception(elFinder::ERROR_CREATING_TEMP_DIR);
                }
            }
        }

        return true;
    }

    /**
     * Get Parent ID, Item ID, Parent Path as an array from path.
     *
     * @param string $path
     *
     * @return array
     */
    protected function _od_splitPath($path)
    {
        $path = trim($path, '/');
        $pid = '';
        if ($path === '') {
            $id = 'root';
            $parent = '';
        } else {
            $paths = explode('/', trim($path, '/'));
            $id = array_pop($paths);
            if ($paths) {
                $parent = '/' . implode('/', $paths);
                $pid = array_pop($paths);
            } else {
                $pid = 'root';
                $parent = '/';
            }
        }

        return array($pid, $id, $parent);
    }

    /**
     * Creates a base cURL object which is compatible with the OneDrive API.
     *
     * @return resource A compatible cURL object
     */
    protected function _od_prepareCurl($url = null)
    {
        $curl = curl_init($url);

        $defaultOptions = array(
            // General options.
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_HTTPHEADER => array(
                'Content-Type: application/json',
                'Authorization: Bearer ' . $this->token->data->access_token,
            ),
        );

        curl_setopt_array($curl, $defaultOptions);

        return $curl;
    }

    /**
     * Creates a base cURL object which is compatible with the OneDrive API.
     *
     * @param string $path The path of the API call (eg. me/skydrive)
     * @param bool   $contents
     *
     * @return resource A compatible cURL object
     * @throws elFinderAbortException
     */
    protected function _od_createCurl($path, $contents = false)
    {
        elFinder::checkAborted();
        $curl = $this->_od_prepareCurl($path);

        if ($contents) {
            $res = elFinder::curlExec($curl);
        } else {
            $result = json_decode(elFinder::curlExec($curl));
            if (isset($result->value)) {
                $res = $result->value;
                unset($result->value);
                $result = (array)$result;
                if (!empty($result['@odata.nextLink'])) {
                    $nextRes = $this->_od_createCurl($result['@odata.nextLink'], false);
                    if (is_array($nextRes)) {
                        $res = array_merge($res, $nextRes);
                    }
                }
            } else {
                $res = $result;
            }
        }

        return $res;
    }

    /**
     * Drive query and fetchAll.
     *
     * @param       $itemId
     * @param bool  $fetch_self
     * @param bool  $recursive
     * @param array $options
     *
     * @return object|array
     * @throws elFinderAbortException
     */
    protected function _od_query($itemId, $fetch_self = false, $recursive = false, $options = array())
    {
        $result = array();

        if (null === $itemId) {
            $itemId = 'root';
        }

        if ($fetch_self == true) {
            $path = $itemId;
        } else {
            $path = $itemId . '/children';
        }

        if (isset($options['query'])) {
            $path .= '?' . http_build_query($options['query']);
        }

        $url = self::API_URL . $path;

        $res = $this->_od_createCurl($url);
        if (!$fetch_self && $recursive && is_array($res)) {
            foreach ($res as $file) {
                $result[] = $file;
                if (!empty($file->folder)) {
                    $result = array_merge($result, $this->_od_query($file->id, false, true, $options));
                }
            }
        } else {
            $result = $res;
        }

        return isset($result->error) ? array() : $result;
    }

    /**
     * Parse line from onedrive metadata output and return file stat (array).
     *
     * @param object $raw line from ftp_rawlist() output
     *
     * @return array
     * @author Dmitry Levashov
     **/
    protected function _od_parseRaw($raw)
    {
        $stat = array();

        $folder = isset($raw->folder) ? $raw->folder : null;

        $stat['rev'] = isset($raw->id) ? $raw->id : 'root';
        $stat['name'] = $raw->name;
        if (isset($raw->lastModifiedDateTime)) {
            $stat['ts'] = strtotime($raw->lastModifiedDateTime);
        }

        if ($folder) {
            $stat['mime'] = 'directory';
            $stat['size'] = 0;
            if (empty($folder->childCount)) {
                $stat['dirs'] = 0;
            } else {
                $stat['dirs'] = -1;
            }
        } else {
            if (isset($raw->file->mimeType)) {
                $stat['mime'] = $raw->file->mimeType;
            }
            $stat['size'] = (int)$raw->size;
            if (!$this->disabledGetUrl) {
                $stat['url'] = '1';
            }
            if (isset($raw->image) && $img = $raw->image) {
                isset($img->width) ? $stat['width'] = $img->width : $stat['width'] = 0;
                isset($img->height) ? $stat['height'] = $img->height : $stat['height'] = 0;
            }
            if (!empty($raw->thumbnails)) {
                if ($raw->thumbnails[0]->small->url) {
                    $stat['tmb'] = substr($raw->thumbnails[0]->small->url, 8); // remove "https://"
                }
            } elseif (!empty($raw->file->processingMetadata)) {
                $stat['tmb'] = '1';
            }
        }

        return $stat;
    }

    /**
     * Get raw data(onedrive metadata) from OneDrive.
     *
     * @param string $path
     *
     * @return array|object onedrive metadata
     */
    protected function _od_getFileRaw($path)
    {
        list(, $itemId) = $this->_od_splitPath($path);
        try {
            $res = $this->_od_query($itemId, true, false, $this->queryOptions);

            return $res;
        } catch (Exception $e) {
            return array();
        }
    }

    /**
     * Get thumbnail from OneDrive.com.
     *
     * @param string $path
     *
     * @return string | boolean
     */
    protected function _od_getThumbnail($path)
    {
        list(, $itemId) = $this->_od_splitPath($path);

        try {
            $url = self::API_URL . $itemId . '/thumbnails/0/medium/content';

            return $this->_od_createCurl($url, $contents = true);
        } catch (Exception $e) {
            return false;
        }
    }

    /**
     * Upload large files with an upload session.
     *
     * @param resource $fp       source file pointer
     * @param number   $size     total size
     * @param string   $name     item name
     * @param string   $itemId   item identifier
     * @param string   $parent   parent
     * @param string   $parentId parent identifier
     *
     * @return string The item path
     */
    protected function _od_uploadSession($fp, $size, $name, $itemId, $parent, $parentId)
    {
        try {
            $send = $this->_od_getChunkData($fp);
            if ($send === false) {
                throw new Exception('Data can not be acquired from the source.');
            }

            // create upload session
            if ($itemId) {
                $url = self::API_URL . $itemId . '/createUploadSession';
            } else {
                $url = self::API_URL . $parentId . ':/' . rawurlencode($name) . ':/createUploadSession';
            }
            $curl = $this->_od_prepareCurl($url);
            curl_setopt_array($curl, array(
                CURLOPT_POST => true,
                CURLOPT_POSTFIELDS => '{}',
            ));
            $sess = json_decode(elFinder::curlExec($curl));

            if ($sess) {
                if (isset($sess->error)) {
                    throw new Exception($sess->error->message);
                }
                $next = strlen($send);
                $range = '0-' . ($next - 1) . '/' . $size;
            } else {
                throw new Exception('API response can not be obtained.');
            }

            $id = null;
            $retry = 0;
            while ($sess) {
                elFinder::extendTimeLimit();
                $putFp = tmpfile();
                fwrite($putFp, $send);
                rewind($putFp);
                $_size = strlen($send);
                $url = $sess->uploadUrl;
                $curl = curl_init();
                $options = array(
                    CURLOPT_URL => $url,
                    CURLOPT_PUT => true,
                    CURLOPT_RETURNTRANSFER => true,
                    CURLOPT_INFILE => $putFp,
                    CURLOPT_INFILESIZE => $_size,
                    CURLOPT_HTTPHEADER => array(
                        'Content-Length: ' . $_size,
                        'Content-Range: bytes ' . $range,
                    ),
                );
                curl_setopt_array($curl, $options);
                $sess = json_decode(elFinder::curlExec($curl));
                if ($sess) {
                    if (isset($sess->error)) {
                        throw new Exception($sess->error->message);
                    }
                    if (isset($sess->id)) {
                        $id = $sess->id;
                        break;
                    }
                    if (isset($sess->nextExpectedRanges)) {
                        list($_next) = explode('-', $sess->nextExpectedRanges[0]);
                        if ($next == $_next) {
                            $send = $this->_od_getChunkData($fp);
                            if ($send === false) {
                                throw new Exception('Data can not be acquired from the source.');
                            }
                            $next += strlen($send);
                            $range = $_next . '-' . ($next - 1) . '/' . $size;
                            $retry = 0;
                        } else {
                            if (++$retry > 3) {
                                throw new Exception('Retry limit exceeded with uploadSession API call.');
                            }
                        }
                        $sess->uploadUrl = $url;
                    }
                } else {
                    throw new Exception('API response can not be obtained.');
                }
            }

            if ($id) {
                return $this->_joinPath($parent, $id);
            } else {
                throw new Exception('An error occurred in the uploadSession API call.');
            }
        } catch (Exception $e) {
            return $this->setError('OneDrive error: ' . $e->getMessage());
        }
    }

    /**
     * Get chunk data by file pointer to upload session.
     *
     * @param resource $fp source file pointer
     *
     * @return bool|string chunked data
     */
    protected function _od_getChunkData($fp)
    {
        static $chunkSize = null;
        if ($chunkSize === null) {
            $mem = elFinder::getIniBytes('memory_limit');
            if ($mem < 1) {
                $mem = 10485760; // 10 MiB
            } else {
                $mem -= memory_get_usage() - 1061548;
                $mem = min($mem, 10485760);
            }
            if ($mem > 327680) {
                $chunkSize = floor($mem / 327680) * 327680;
            } else {
                $chunkSize = $mem;
            }
        }
        if ($chunkSize < 8192) {
            return false;
        }

        $contents = '';
        while (!feof($fp) && strlen($contents) < $chunkSize) {
            $contents .= fread($fp, 8192);
        }

        return $contents;
    }

    /**
     * Get AccessToken file path
     *
     * @return string  ( description_of_the_return_value )
     */
    protected function _od_getATokenFile()
    {
        $tmp = $aTokenFile = '';
        if (!empty($this->token->data->refresh_token)) {
            if (!$this->tmp) {
                $tmp = elFinder::getStaticVar('commonTempPath');
                if (!$tmp) {
                    $tmp = $this->getTempPath();
                }
                $this->tmp = $tmp;
            }
            if ($tmp) {
                $aTokenFile = $tmp . DIRECTORY_SEPARATOR . $this->_od_getInitialToken() . '.otoken';
            }
        }
        return $aTokenFile;
    }

    /**
     * Get Initial Token (MD5 hash)
     *
     * @return string
     */
    protected function _od_getInitialToken()
    {
        return (empty($this->token->initialToken)? md5($this->options['client_id'] . (!empty($this->token->data->refresh_token)? $this->token->data->refresh_token : $this->token->data->access_token)) : $this->token->initialToken);
    }

    /*********************************************************************/
    /*                        OVERRIDE FUNCTIONS                         */
    /*********************************************************************/

    /**
     * Prepare
     * Call from elFinder::netmout() before volume->mount().
     *
     * @return array
     * @author Naoki Sawada
     * @author Raja Sharma updating for OneDrive
     **/
    public function netmountPrepare($options)
    {
        if (empty($options['client_id']) && defined('ELFINDER_ONEDRIVE_CLIENTID')) {
            $options['client_id'] = ELFINDER_ONEDRIVE_CLIENTID;
        }
        if (empty($options['client_secret']) && defined('ELFINDER_ONEDRIVE_CLIENTSECRET')) {
            $options['client_secret'] = ELFINDER_ONEDRIVE_CLIENTSECRET;
        }

        if (isset($options['pass']) && $options['pass'] === 'reauth') {
            $options['user'] = 'init';
            $options['pass'] = '';
            $this->session->remove('OneDriveTokens');
        }

        if (isset($options['id'])) {
            $this->session->set('nodeId', $options['id']);
        } elseif ($_id = $this->session->get('nodeId')) {
            $options['id'] = $_id;
            $this->session->set('nodeId', $_id);
        }

        if (!empty($options['tmpPath'])) {
            if ((is_dir($options['tmpPath']) || mkdir($this->options['tmpPath'])) && is_writable($options['tmpPath'])) {
                $this->tmp = $options['tmpPath'];
            }
        }

        try {
            if (empty($options['client_id']) || empty($options['client_secret'])) {
                return array('exit' => true, 'body' => '{msg:errNetMountNoDriver}');
            }

            $itpCare = isset($options['code']);
            $code = $itpCare? $options['code'] : (isset($_GET['code'])? $_GET['code'] : '');
            if ($code) {
                try {
                    if (!empty($options['id'])) {
                        // Obtain the token using the code received by the OneDrive API
                        $this->session->set('OneDriveTokens',
                            $this->_od_obtainAccessToken($options['client_id'], $options['client_secret'], $code, $options['id']));

                        $out = array(
                            'node' => $options['id'],
                            'json' => '{"protocol": "onedrive", "mode": "done", "reset": 1}',
                            'bind' => 'netmount',
                        );
                    } else {
                        $nodeid = ($_GET['host'] === '1')? 'elfinder' : $_GET['host'];
                        $out = array(
                            'node' => $nodeid,
                            'json' => json_encode(array(
                                'protocol' => 'onedrive',
                                'host' => $nodeid,
                                'mode' => 'redirect',
                                'options' => array(
                                    'id' => $nodeid,
                                    'code'=> $code
                                )
                            )),
                            'bind' => 'netmount'
                        );
                    }
                    if (!$itpCare) {
                        return array('exit' => 'callback', 'out' => $out);
                    } else {
                        return array('exit' => true, 'body' => $out['json']);
                    }
                } catch (Exception $e) {
                    $out = array(
                        'node' => $options['id'],
                        'json' => json_encode(array('error' => elFinder::ERROR_ACCESS_DENIED . ' ' . $e->getMessage())),
                    );

                    return array('exit' => 'callback', 'out' => $out);
                }
            } elseif (!empty($_GET['error'])) {
                $out = array(
                    'node' => $options['id'],
                    'json' => json_encode(array('error' => elFinder::ERROR_ACCESS_DENIED)),
                );

                return array('exit' => 'callback', 'out' => $out);
            }

            if ($options['user'] === 'init') {
                $this->token = $this->session->get('OneDriveTokens');

                if ($this->token) {
                    try {
                        $this->_od_refreshToken();
                    } catch (Exception $e) {
                        $this->setError($e->getMessage());
                        $this->token = null;
                        $this->session->remove('OneDriveTokens');
                    }
                }

                if (empty($this->token)) {
                    $result = false;
                } else {
                    $path = $options['path'];
                    if ($path === '/') {
                        $path = 'root';
                    }
                    $result = $this->_od_query($path, false, false, array(
                        'query' => array(
                            'select' => 'id,name',
                            'filter' => 'folder ne null',
                        ),
                    ));
                }

                if ($result === false) {
                    try {
                        $this->session->set('OneDriveTokens', (object)array('token' => null));

                        $offline = '';
                        // Gets a log in URL with sufficient privileges from the OneDrive API
                        if (!empty($options['offline'])) {
                            $offline = ' offline_access';
                        }

                        $redirect_uri = elFinder::getConnectorUrl() . '/netmount/onedrive/' . ($options['id'] === 'elfinder'? '1' : $options['id']);
                        $url = self::AUTH_URL
                            . '?client_id=' . urlencode($options['client_id'])
                            . '&scope=' . urlencode('files.readwrite.all' . $offline)
                            . '&response_type=code'
                            . '&redirect_uri=' . urlencode($redirect_uri);

                    } catch (Exception $e) {
                        return array('exit' => true, 'body' => '{msg:errAccess}');
                    }

                    $html = '<input id="elf-volumedriver-onedrive-host-btn" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" value="{msg:btnApprove}" type="button">';
                    $html .= '<script>
                            jQuery("#' . $options['id'] . '").elfinder("instance").trigger("netmount", {protocol: "onedrive", mode: "makebtn", url: "' . $url . '"});
                            </script>';

                    return array('exit' => true, 'body' => $html);
                } else {
                    $folders = [];

                    if ($result) {
                        foreach ($result as $res) {
                            $folders[$res->id] = $res->name;
                        }
                        natcasesort($folders);
                    }

                    if ($options['pass'] === 'folders') {
                        return ['exit' => true, 'folders' => $folders];
                    }

                    $folders = ['root' => 'My OneDrive'] + $folders;
                    $folders = json_encode($folders);

                    $expires = empty($this->token->data->refresh_token) ? (int)$this->token->expires : 0;
                    $mnt2res = empty($this->token->data->refresh_token) ? '' : ', "mnt2res": 1';
                    $json = '{"protocol": "onedrive", "mode": "done", "folders": ' . $folders . ', "expires": ' . $expires . $mnt2res .'}';
                    $html = 'OneDrive.com';
                    $html .= '<script>
                            jQuery("#' . $options['id'] . '").elfinder("instance").trigger("netmount", ' . $json . ');
                            </script>';

                    return array('exit' => true, 'body' => $html);
                }
            }
        } catch (Exception $e) {
            return array('exit' => true, 'body' => '{msg:errNetMountNoDriver}');
        }

        if ($_aToken = $this->session->get('OneDriveTokens')) {
            $options['accessToken'] = json_encode($_aToken);
            if ($this->options['path'] === 'root' || !$this->options['path']) {
                $this->options['path'] = '/';
            }
        } else {
            $this->session->remove('OneDriveTokens');
            $this->setError(elFinder::ERROR_NETMOUNT, $options['host'], implode(' ', $this->error()));

            return array('exit' => true, 'error' => $this->error());
        }

        $this->session->remove('nodeId');
        unset($options['user'], $options['pass'], $options['id']);

        return $options;
    }

    /**
     * process of on netunmount
     * Drop `onedrive` & rm thumbs.
     *
     * @param array $options
     *
     * @return bool
     */
    public function netunmount($netVolumes, $key)
    {
        if (!$this->options['useApiThumbnail'] && ($tmbs = glob(rtrim($this->options['tmbPath'], '\\/') . DIRECTORY_SEPARATOR . $this->tmbPrefix . '*.png'))) {
            foreach ($tmbs as $file) {
                unlink($file);
            }
        }

        return true;
    }

    /**
     * Return debug info for client.
     *
     * @return array
     **/
    public function debug()
    {
        $res = parent::debug();
        if (!empty($this->options['netkey']) && !empty($this->options['accessToken'])) {
            $res['accessToken'] = $this->options['accessToken'];
        }

        return $res;
    }

    /*********************************************************************/
    /*                        INIT AND CONFIGURE                         */
    /*********************************************************************/

    /**
     * Prepare FTP connection
     * Connect to remote server and check if credentials are correct, if so, store the connection id in $ftp_conn.
     *
     * @return bool
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     * @author Cem (DiscoFever)
     */
    protected function init()
    {
        if (!$this->options['accessToken']) {
            return $this->setError('Required option `accessToken` is undefined.');
        }

        if (!empty($this->options['tmpPath'])) {
            if ((is_dir($this->options['tmpPath']) || mkdir($this->options['tmpPath'])) && is_writable($this->options['tmpPath'])) {
                $this->tmp = $this->options['tmpPath'];
            }
        }

        $error = false;
        try {
            $this->token = json_decode($this->options['accessToken']);
            if (!is_object($this->token)) {
                throw new Exception('Required option `accessToken` is invalid JSON.');
            }

            // make net mount key
            if (empty($this->options['netkey'])) {
                $this->netMountKey = $this->_od_getInitialToken();
            } else {
                $this->netMountKey = $this->options['netkey'];
            }

            if ($this->aTokenFile = $this->_od_getATokenFile()) {
                if (empty($this->options['netkey'])) {
                    if ($this->aTokenFile) {
                        if (is_file($this->aTokenFile)) {
                            $this->token = json_decode(file_get_contents($this->aTokenFile));
                            if (!is_object($this->token)) {
                                unlink($this->aTokenFile);
                                throw new Exception('Required option `accessToken` is invalid JSON.');
                            }
                        } else {
                            file_put_contents($this->aTokenFile, $this->token);
                        }
                    }
                } else if (is_file($this->aTokenFile)) {
                    // If the refresh token is the same as the permanent volume
                    $this->token = json_decode(file_get_contents($this->aTokenFile));
                }
            }

            if ($this->needOnline) {
                $this->_od_refreshToken();

                $this->expires = empty($this->token->data->refresh_token) ? (int)$this->token->expires : 0;
            }
        } catch (Exception $e) {
            $this->token = null;
            $error = true;
            $this->setError($e->getMessage());
        }

        if ($this->netMountKey) {
            $this->tmbPrefix = 'onedrive' . base_convert($this->netMountKey, 16, 32);
        }

        if ($error) {
            if (empty($this->options['netkey']) && $this->tmbPrefix) {
                // for delete thumbnail 
                $this->netunmount(null, null);
            }
            return false;
        }

        // normalize root path
        if ($this->options['path'] == 'root') {
            $this->options['path'] = '/';
        }

        $this->root = $this->options['path'] = $this->_normpath($this->options['path']);

        $this->options['root'] = ($this->options['root'] == '')? 'OneDrive.com' : $this->options['root'];

        if (empty($this->options['alias'])) {
            if ($this->needOnline) {
                $this->options['alias'] = ($this->options['path'] === '/') ? $this->options['root'] :
                    $this->_od_query(basename($this->options['path']), $fetch_self = true)->name . '@OneDrive';
                if (!empty($this->options['netkey'])) {
                    elFinder::$instance->updateNetVolumeOption($this->options['netkey'], 'alias', $this->options['alias']);
                }
            } else {
                $this->options['alias'] = $this->options['root'];
            }
        }

        $this->rootName = $this->options['alias'];

        // This driver dose not support `syncChkAsTs`
        $this->options['syncChkAsTs'] = false;

        // 'lsPlSleep' minmum 10 sec
        $this->options['lsPlSleep'] = max(10, $this->options['lsPlSleep']);

        $this->queryOptions = array(
            'query' => array(
                'select' => 'id,name,lastModifiedDateTime,file,folder,size,image',
            ),
        );

        if ($this->options['useApiThumbnail']) {
            $this->options['tmbURL'] = 'https://';
            $this->options['tmbPath'] = '';
            $this->queryOptions['query']['expand'] = 'thumbnails(select=small)';
        }

        // enable command archive
        $this->options['useRemoteArchive'] = true;

        return true;
    }

    /**
     * Configure after successfull mount.
     *
     * @author Dmitry (dio) Levashov
     **/
    protected function configure()
    {
        parent::configure();

        // fallback of $this->tmp
        if (!$this->tmp && $this->tmbPathWritable) {
            $this->tmp = $this->tmbPath;
        }
    }

    /*********************************************************************/
    /*                               FS API                              */
    /*********************************************************************/

    /**
     * Close opened connection.
     *
     * @author Dmitry (dio) Levashov
     **/
    public function umount()
    {
    }

    protected function isNameExists($path)
    {
        list($pid, $name) = $this->_od_splitPath($path);

        $raw = $this->_od_query($pid . '/children/' . rawurlencode($name), true);
        return $raw ? $this->_od_parseRaw($raw) : false;
    }

    /**
     * Cache dir contents.
     *
     * @param string $path dir path
     *
     * @return array
     * @throws elFinderAbortException
     * @author Dmitry Levashov
     */
    protected function cacheDir($path)
    {
        $this->dirsCache[$path] = array();
        $hasDir = false;

        list(, $itemId) = $this->_od_splitPath($path);

        $res = $this->_od_query($itemId, false, false, $this->queryOptions);

        if ($res) {
            foreach ($res as $raw) {
                if ($stat = $this->_od_parseRaw($raw)) {
                    $itemPath = $this->_joinPath($path, $raw->id);
                    $stat = $this->updateCache($itemPath, $stat);
                    if (empty($stat['hidden'])) {
                        if (!$hasDir && $stat['mime'] === 'directory') {
                            $hasDir = true;
                        }
                        $this->dirsCache[$path][] = $itemPath;
                    }
                }
            }
        }

        if (isset($this->sessionCache['subdirs'])) {
            $this->sessionCache['subdirs'][$path] = $hasDir;
        }

        return $this->dirsCache[$path];
    }

    /**
     * Copy file/recursive copy dir only in current volume.
     * Return new file path or false.
     *
     * @param string $src  source path
     * @param string $dst  destination dir path
     * @param string $name new file name (optionaly)
     *
     * @return string|false
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     * @author Naoki Sawada
     */
    protected function copy($src, $dst, $name)
    {
        $itemId = '';
        if ($this->options['copyJoin']) {
            $test = $this->joinPathCE($dst, $name);
            if ($testStat = $this->isNameExists($test)) {
                $this->remove($test);
            }
        }

        if ($path = $this->_copy($src, $dst, $name)) {
            $this->added[] = $this->stat($path);
        } else {
            $this->setError(elFinder::ERROR_COPY, $this->_path($src));
        }

        return $path;
    }

    /**
     * Remove file/ recursive remove dir.
     *
     * @param string $path  file path
     * @param bool   $force try to remove even if file locked
     *
     * @return bool
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     * @author Naoki Sawada
     */
    protected function remove($path, $force = false)
    {
        $stat = $this->stat($path);
        $stat['realpath'] = $path;
        $this->rmTmb($stat);
        $this->clearcache();

        if (empty($stat)) {
            return $this->setError(elFinder::ERROR_RM, $this->_path($path), elFinder::ERROR_FILE_NOT_FOUND);
        }

        if (!$force && !empty($stat['locked'])) {
            return $this->setError(elFinder::ERROR_LOCKED, $this->_path($path));
        }

        if ($stat['mime'] == 'directory') {
            if (!$this->_rmdir($path)) {
                return $this->setError(elFinder::ERROR_RM, $this->_path($path));
            }
        } else {
            if (!$this->_unlink($path)) {
                return $this->setError(elFinder::ERROR_RM, $this->_path($path));
            }
        }

        $this->removed[] = $stat;

        return true;
    }

    /**
     * Create thumnbnail and return it's URL on success.
     *
     * @param string $path file path
     * @param        $stat
     *
     * @return string|false
     * @throws ImagickException
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     * @author Naoki Sawada
     */
    protected function createTmb($path, $stat)
    {
        if ($this->options['useApiThumbnail']) {
            if (func_num_args() > 2) {
                list(, , $count) = func_get_args();
            } else {
                $count = 0;
            }
            if ($count < 10) {
                if (isset($stat['tmb']) && $stat['tmb'] != '1') {
                    return $stat['tmb'];
                } else {
                    sleep(2);
                    elFinder::extendTimeLimit();
                    $this->clearcache();
                    $stat = $this->stat($path);

                    return $this->createTmb($path, $stat, ++$count);
                }
            }

            return false;
        }
        if (!$stat || !$this->canCreateTmb($path, $stat)) {
            return false;
        }

        $name = $this->tmbname($stat);
        $tmb = $this->tmbPath . DIRECTORY_SEPARATOR . $name;

        // copy image into tmbPath so some drivers does not store files on local fs
        if (!$data = $this->_od_getThumbnail($path)) {
            return false;
        }
        if (!file_put_contents($tmb, $data)) {
            return false;
        }

        $result = false;

        $tmbSize = $this->tmbSize;

        if (($s = getimagesize($tmb)) == false) {
            return false;
        }

        /* If image smaller or equal thumbnail size - just fitting to thumbnail square */
        if ($s[0] <= $tmbSize && $s[1] <= $tmbSize) {
            $result = $this->imgSquareFit($tmb, $tmbSize, $tmbSize, 'center', 'middle', $this->options['tmbBgColor'], 'png');
        } else {
            if ($this->options['tmbCrop']) {

                /* Resize and crop if image bigger than thumbnail */
                if (!(($s[0] > $tmbSize && $s[1] <= $tmbSize) || ($s[0] <= $tmbSize && $s[1] > $tmbSize)) || ($s[0] > $tmbSize && $s[1] > $tmbSize)) {
                    $result = $this->imgResize($tmb, $tmbSize, $tmbSize, true, false, 'png');
                }

                if (($s = getimagesize($tmb)) != false) {
                    $x = $s[0] > $tmbSize ? intval(($s[0] - $tmbSize) / 2) : 0;
                    $y = $s[1] > $tmbSize ? intval(($s[1] - $tmbSize) / 2) : 0;
                    $result = $this->imgCrop($tmb, $tmbSize, $tmbSize, $x, $y, 'png');
                }
            } else {
                $result = $this->imgResize($tmb, $tmbSize, $tmbSize, true, true, 'png');
            }

            $result = $this->imgSquareFit($tmb, $tmbSize, $tmbSize, 'center', 'middle', $this->options['tmbBgColor'], 'png');
        }

        if (!$result) {
            unlink($tmb);

            return false;
        }

        return $name;
    }

    /**
     * Return thumbnail file name for required file.
     *
     * @param array $stat file stat
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function tmbname($stat)
    {
        return $this->tmbPrefix . $stat['rev'] . $stat['ts'] . '.png';
    }

    /**
     * Return content URL.
     *
     * @param string $hash    file hash
     * @param array  $options options
     *
     * @return string
     * @author Naoki Sawada
     **/
    public function getContentUrl($hash, $options = array())
    {
        if (!empty($options['onetime']) && $this->options['onetimeUrl']) {
            return parent::getContentUrl($hash, $options);
        }
        if (!empty($options['temporary'])) {
            // try make temporary file
            $url = parent::getContentUrl($hash, $options);
            if ($url) {
                return $url;
            }
        }
        $res = '';
        if (($file = $this->file($hash)) == false || !$file['url'] || $file['url'] == 1) {
            $path = $this->decode($hash);

            list(, $itemId) = $this->_od_splitPath($path);
            try {
                $url = self::API_URL . $itemId . '/createLink';
                $data = (object)array(
                    'type' => 'embed',
                    'scope' => 'anonymous',
                );
                $curl = $this->_od_prepareCurl($url);
                curl_setopt_array($curl, array(
                    CURLOPT_POST => true,
                    CURLOPT_POSTFIELDS => json_encode($data),
                ));

                $result = elFinder::curlExec($curl);
                if ($result) {
                    $result = json_decode($result);
                    if (isset($result->link)) {
                        list(, $res) = explode('?', $result->link->webUrl);
                        $res = 'https://onedrive.live.com/download.aspx?' . $res;
                    }
                }
            } catch (Exception $e) {
                $res = '';
            }
        }

        return $res;
    }

    /*********************** paths/urls *************************/

    /**
     * Return parent directory path.
     *
     * @param string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _dirname($path)
    {
        list(, , $dirname) = $this->_od_splitPath($path);

        return $dirname;
    }

    /**
     * Return file name.
     *
     * @param string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _basename($path)
    {
        list(, $basename) = $this->_od_splitPath($path);

        return $basename;
    }

    /**
     * Join dir name and file name and retur full path.
     *
     * @param string $dir
     * @param string $name
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _joinPath($dir, $name)
    {
        if ($dir === 'root') {
            $dir = '';
        }

        return $this->_normpath($dir . '/' . $name);
    }

    /**
     * Return normalized path, this works the same as os.path.normpath() in Python.
     *
     * @param string $path path
     *
     * @return string
     * @author Troex Nevelin
     **/
    protected function _normpath($path)
    {
        if (DIRECTORY_SEPARATOR !== '/') {
            $path = str_replace(DIRECTORY_SEPARATOR, '/', $path);
        }
        $path = '/' . ltrim($path, '/');

        return $path;
    }

    /**
     * Return file path related to root dir.
     *
     * @param string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _relpath($path)
    {
        return $path;
    }

    /**
     * Convert path related to root dir into real path.
     *
     * @param string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _abspath($path)
    {
        return $path;
    }

    /**
     * Return fake path started from root dir.
     *
     * @param string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _path($path)
    {
        return $this->rootName . $this->_normpath(substr($path, strlen($this->root)));
    }

    /**
     * Return true if $path is children of $parent.
     *
     * @param string $path   path to check
     * @param string $parent parent path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _inpath($path, $parent)
    {
        return $path == $parent || strpos($path, $parent . '/') === 0;
    }

    /***************** file stat ********************/
    /**
     * Return stat for given path.
     * Stat contains following fields:
     * - (int)    size    file size in b. required
     * - (int)    ts      file modification time in unix time. required
     * - (string) mime    mimetype. required for folders, others - optionally
     * - (bool)   read    read permissions. required
     * - (bool)   write   write permissions. required
     * - (bool)   locked  is object locked. optionally
     * - (bool)   hidden  is object hidden. optionally
     * - (string) alias   for symlinks - link target path relative to root path. optionally
     * - (string) target  for symlinks - link target path. optionally.
     * If file does not exists - returns empty array or false.
     *
     * @param string $path file path
     *
     * @return array|false
     * @author Dmitry (dio) Levashov
     **/
    protected function _stat($path)
    {
        if ($raw = $this->_od_getFileRaw($path)) {
            $stat = $this->_od_parseRaw($raw);
            if ($path === $this->root) {
                $stat['expires'] = $this->expires;
            }
            return $stat;
        }

        return false;
    }

    /**
     * Return true if path is dir and has at least one childs directory.
     *
     * @param string $path dir path
     *
     * @return bool
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function _subdirs($path)
    {
        list(, $itemId) = $this->_od_splitPath($path);

        return (bool)$this->_od_query($itemId, false, false, array(
            'query' => array(
                'top' => 1,
                'select' => 'id',
                'filter' => 'folder ne null',
            ),
        ));
    }

    /**
     * Return object width and height
     * Ususaly used for images, but can be realize for video etc...
     *
     * @param string $path file path
     * @param string $mime file mime type
     *
     * @return string
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function _dimensions($path, $mime)
    {
        if (strpos($mime, 'image') !== 0) {
            return '';
        }

        //$cache = $this->_od_getFileRaw($path);
        if (func_num_args() > 2) {
            $args = func_get_arg(2);
        } else {
            $args = array();
        }
        if (!empty($args['substitute'])) {
            $tmbSize = intval($args['substitute']);
        } else {
            $tmbSize = null;
        }
        list(, $itemId) = $this->_od_splitPath($path);
        $options = array(
            'query' => array(
                'select' => 'id,image',
            ),
        );
        if ($tmbSize) {
            $tmb = 'c' . $tmbSize . 'x' . $tmbSize;
            $options['query']['expand'] = 'thumbnails(select=' . $tmb . ')';
        }
        $raw = $this->_od_query($itemId, true, false, $options);

        if ($raw && property_exists($raw, 'image') && $img = $raw->image) {
            if (isset($img->width) && isset($img->height)) {
                $ret = array('dim' => $img->width . 'x' . $img->height);
                if ($tmbSize) {
                    $srcSize = explode('x', $ret['dim']);
                    if (min(($tmbSize / $srcSize[0]), ($tmbSize / $srcSize[1])) < 1) {
                        if (!empty($raw->thumbnails)) {
                            $tmbArr = (array)$raw->thumbnails[0];
                            if (!empty($tmbArr[$tmb]->url)) {
                                $ret['url'] = $tmbArr[$tmb]->url;
                            }
                        }
                    }
                }

                return $ret;
            }
        }

        $ret = '';
        if ($work = $this->getWorkFile($path)) {
            if ($size = @getimagesize($work)) {
                $cache['width'] = $size[0];
                $cache['height'] = $size[1];
                $ret = $size[0] . 'x' . $size[1];
            }
        }
        is_file($work) && @unlink($work);

        return $ret;
    }

    /******************** file/dir content *********************/

    /**
     * Return files list in directory.
     *
     * @param string $path dir path
     *
     * @return array
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     * @author Cem (DiscoFever)
     */
    protected function _scandir($path)
    {
        return isset($this->dirsCache[$path])
            ? $this->dirsCache[$path]
            : $this->cacheDir($path);
    }

    /**
     * Open file and return file pointer.
     *
     * @param string $path  file path
     * @param bool   $write open file for writing
     *
     * @return resource|false
     * @author Dmitry (dio) Levashov
     **/
    protected function _fopen($path, $mode = 'rb')
    {
        if ($mode === 'rb' || $mode === 'r') {
            list(, $itemId) = $this->_od_splitPath($path);
            $data = array(
                'target' => self::API_URL . $itemId . '/content',
                'headers' => array('Authorization: Bearer ' . $this->token->data->access_token),
            );

            // to support range request
            if (func_num_args() > 2) {
                $opts = func_get_arg(2);
            } else {
                $opts = array();
            }
            if (!empty($opts['httpheaders'])) {
                $data['headers'] = array_merge($opts['httpheaders'], $data['headers']);
            }

            return elFinder::getStreamByUrl($data);
        }

        return false;
    }

    /**
     * Close opened file.
     *
     * @param resource $fp file pointer
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _fclose($fp, $path = '')
    {
        is_resource($fp) && fclose($fp);
        if ($path) {
            unlink($this->getTempFile($path));
        }
    }

    /********************  file/dir manipulations *************************/

    /**
     * Create dir and return created dir path or false on failed.
     *
     * @param string $path parent dir path
     * @param string $name new directory name
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _mkdir($path, $name)
    {
        $namePath = $this->_joinPath($path, $name);
        list($parentId) = $this->_od_splitPath($namePath);

        try {
            $properties = array(
                'name' => (string)$name,
                'folder' => (object)array(),
            );

            $data = (object)$properties;

            $url = self::API_URL . $parentId . '/children';

            $curl = $this->_od_prepareCurl($url);

            curl_setopt_array($curl, array(
                CURLOPT_POST => true,
                CURLOPT_POSTFIELDS => json_encode($data),
            ));

            //create the Folder in the Parent
            $result = elFinder::curlExec($curl);
            $folder = json_decode($result);

            return $this->_joinPath($path, $folder->id);
        } catch (Exception $e) {
            return $this->setError('OneDrive error: ' . $e->getMessage());
        }
    }

    /**
     * Create file and return it's path or false on failed.
     *
     * @param string $path parent dir path
     * @param string $name new file name
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _mkfile($path, $name)
    {
        return $this->_save($this->tmpfile(), $path, $name, array());
    }

    /**
     * Create symlink. FTP driver does not support symlinks.
     *
     * @param string $target link target
     * @param string $path   symlink path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _symlink($target, $path, $name)
    {
        return false;
    }

    /**
     * Copy file into another file.
     *
     * @param string $source    source file path
     * @param string $targetDir target directory path
     * @param string $name      new file name
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _copy($source, $targetDir, $name)
    {
        $path = $this->_joinPath($targetDir, $name);

        try {
            //Set the Parent id
            list(, $parentId) = $this->_od_splitPath($targetDir);
            list(, $itemId) = $this->_od_splitPath($source);

            $url = self::API_URL . $itemId . '/copy';

            $properties = array(
                'name' => (string)$name,
            );
            if ($parentId === 'root') {
                $properties['parentReference'] = (object)array('path' => '/drive/root:');
            } else {
                $properties['parentReference'] = (object)array('id' => (string)$parentId);
            }
            $data = (object)$properties;
            $curl = $this->_od_prepareCurl($url);
            curl_setopt_array($curl, array(
                CURLOPT_POST => true,
                CURLOPT_HEADER => true,
                CURLOPT_HTTPHEADER => array(
                    'Content-Type: application/json',
                    'Authorization: Bearer ' . $this->token->data->access_token,
                    'Prefer: respond-async',
                ),
                CURLOPT_POSTFIELDS => json_encode($data),
            ));
            $result = elFinder::curlExec($curl);

            $res = new stdClass();
            if (preg_match('/Location: (.+)/', $result, $m)) {
                $monUrl = trim($m[1]);
                while ($res) {
                    usleep(200000);
                    $curl = curl_init($monUrl);
                    curl_setopt_array($curl, array(
                        CURLOPT_RETURNTRANSFER => true,
                        CURLOPT_HTTPHEADER => array(
                            'Content-Type: application/json',
                        ),
                    ));
                    $res = json_decode(elFinder::curlExec($curl));
                    if (isset($res->status)) {
                        if ($res->status === 'completed' || $res->status === 'failed') {
                            break;
                        }
                    } elseif (isset($res->error)) {
                        return $this->setError('OneDrive error: ' . $res->error->message);
                    }
                }
            }

            if ($res && isset($res->resourceId)) {
                if (isset($res->folder) && isset($this->sessionCache['subdirs'])) {
                    $this->sessionCache['subdirs'][$targetDir] = true;
                }

                return $this->_joinPath($targetDir, $res->resourceId);
            }

            return false;
        } catch (Exception $e) {
            return $this->setError('OneDrive error: ' . $e->getMessage());
        }

        return true;
    }

    /**
     * Move file into another parent dir.
     * Return new file path or false.
     *
     * @param string $source source file path
     * @param        $targetDir
     * @param string $name   file name
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov
     */
    protected function _move($source, $targetDir, $name)
    {
        try {
            list(, $targetParentId) = $this->_od_splitPath($targetDir);
            list($sourceParentId, $itemId, $srcParent) = $this->_od_splitPath($source);

            $properties = array(
                'name' => (string)$name,
            );
            if ($targetParentId !== $sourceParentId) {
                $properties['parentReference'] = (object)array('id' => (string)$targetParentId);
            }

            $url = self::API_URL . $itemId;
            $data = (object)$properties;

            $curl = $this->_od_prepareCurl($url);

            curl_setopt_array($curl, array(
                CURLOPT_CUSTOMREQUEST => 'PATCH',
                CURLOPT_POSTFIELDS => json_encode($data),
            ));

            $result = json_decode(elFinder::curlExec($curl));
            if ($result && isset($result->id)) {
                return $targetDir . '/' . $result->id;
            } else {
                return false;
            }
        } catch (Exception $e) {
            return $this->setError('OneDrive error: ' . $e->getMessage());
        }

        return false;
    }

    /**
     * Remove file.
     *
     * @param string $path file path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _unlink($path)
    {
        $stat = $this->stat($path);
        try {
            list(, $itemId) = $this->_od_splitPath($path);

            $url = self::API_URL . $itemId;

            $curl = $this->_od_prepareCurl($url);
            curl_setopt_array($curl, array(
                CURLOPT_CUSTOMREQUEST => 'DELETE',
            ));

            //unlink or delete File or Folder in the Parent
            $result = elFinder::curlExec($curl);
        } catch (Exception $e) {
            return $this->setError('OneDrive error: ' . $e->getMessage());
        }

        return true;
    }

    /**
     * Remove dir.
     *
     * @param string $path dir path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _rmdir($path)
    {
        return $this->_unlink($path);
    }

    /**
     * Create new file and write into it from file pointer.
     * Return new file path or false on error.
     *
     * @param resource $fp   file pointer
     * @param          $path
     * @param string   $name file name
     * @param array    $stat file stat (required by some virtual fs)
     *
     * @return bool|string
     * @author Dmitry (dio) Levashov
     */
    protected function _save($fp, $path, $name, $stat)
    {
        $itemId = '';
        $size = null;
        if ($name === '') {
            list($parentId, $itemId, $parent) = $this->_od_splitPath($path);
        } else {
            if ($stat) {
                if (isset($stat['name'])) {
                    $name = $stat['name'];
                }
                if (isset($stat['rev']) && strpos($stat['hash'], $this->id) === 0) {
                    $itemId = $stat['rev'];
                }
            }
            list(, $parentId) = $this->_od_splitPath($path);
            $parent = $path;
        }

        if ($stat && isset($stat['size'])) {
            $size = $stat['size'];
        } else {
            $stats = fstat($fp);
            if (isset($stats[7])) {
                $size = $stats[7];
            }
        }

        if ($size > 4194304) {
            return $this->_od_uploadSession($fp, $size, $name, $itemId, $parent, $parentId);
        }

        try {
            // for unseekable file pointer
            if (!elFinder::isSeekableStream($fp)) {
                if ($tfp = tmpfile()) {
                    if (stream_copy_to_stream($fp, $tfp, $size? $size : -1) !== false) {
                        rewind($tfp);
                        $fp = $tfp;
                    }
                }
            }

            //Create or Update a file
            if ($itemId === '') {
                $url = self::API_URL . $parentId . ':/' . rawurlencode($name) . ':/content';
            } else {
                $url = self::API_URL . $itemId . '/content';
            }
            $curl = $this->_od_prepareCurl();

            $options = array(
                CURLOPT_URL => $url,
                CURLOPT_PUT => true,
                CURLOPT_INFILE => $fp,
            );
            // Size
            if ($size !== null) {
                $options[CURLOPT_INFILESIZE] = $size;
            }

            curl_setopt_array($curl, $options);

            //create or update File in the Target
            $file = json_decode(elFinder::curlExec($curl));

            return $this->_joinPath($parent, $file->id);
        } catch (Exception $e) {
            return $this->setError('OneDrive error: ' . $e->getMessage());
        }
    }

    /**
     * Get file contents.
     *
     * @param string $path file path
     *
     * @return string|false
     * @author Dmitry (dio) Levashov
     **/
    protected function _getContents($path)
    {
        $contents = '';

        try {
            list(, $itemId) = $this->_od_splitPath($path);
            $url = self::API_URL . $itemId . '/content';
            $contents = $this->_od_createCurl($url, $contents = true);
        } catch (Exception $e) {
            return $this->setError('OneDrive error: ' . $e->getMessage());
        }

        return $contents;
    }

    /**
     * Write a string to a file.
     *
     * @param string $path    file path
     * @param string $content new file content
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _filePutContents($path, $content)
    {
        $res = false;

        if ($local = $this->getTempFile($path)) {
            if (file_put_contents($local, $content, LOCK_EX) !== false
                && ($fp = fopen($local, 'rb'))) {
                clearstatcache();
                $res = $this->_save($fp, $path, '', array());
                fclose($fp);
            }
            file_exists($local) && unlink($local);
        }

        return $res;
    }

    /**
     * Detect available archivers.
     **/
    protected function _checkArchivers()
    {
        // die('Not yet implemented. (_checkArchivers)');
        return array();
    }

    /**
     * chmod implementation.
     *
     * @return bool
     **/
    protected function _chmod($path, $mode)
    {
        return false;
    }

    /**
     * Unpack archive.
     *
     * @param string $path archive path
     * @param array  $arc  archiver command and arguments (same as in $this->archivers)
     *
     * @return void
     * @author Dmitry (dio) Levashov
     * @author Alexey Sukhotin
     */
    protected function _unpack($path, $arc)
    {
        die('Not yet implemented. (_unpack)');
        //return false;
    }

    /**
     * Extract files from archive.
     *
     * @param string $path archive path
     * @param array  $arc  archiver command and arguments (same as in $this->archivers)
     *
     * @return void
     * @author Dmitry (dio) Levashov,
     * @author Alexey Sukhotin
     */
    protected function _extract($path, $arc)
    {
        die('Not yet implemented. (_extract)');
    }

    /**
     * Create archive and return its path.
     *
     * @param string $dir   target dir
     * @param array  $files files names list
     * @param string $name  archive name
     * @param array  $arc   archiver options
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov,
     * @author Alexey Sukhotin
     **/
    protected function _archive($dir, $files, $name, $arc)
    {
        die('Not yet implemented. (_archive)');
    }
} // END class
php/elFinderFlysystemGoogleDriveNetmount.php000064400000035523151215013420015377 0ustar00<?php

use League\Flysystem\Filesystem;
use League\Flysystem\Adapter\Local;
use League\Flysystem\Cached\CachedAdapter;
use League\Flysystem\Cached\Storage\Adapter as ACache;
use Hypweb\Flysystem\GoogleDrive\GoogleDriveAdapter;
use Hypweb\Flysystem\Cached\Extra\Hasdir;
use Hypweb\Flysystem\Cached\Extra\DisableEnsureParentDirectories;
use Hypweb\elFinderFlysystemDriverExt\Driver as ExtDriver;

elFinder::$netDrivers['googledrive'] = 'FlysystemGoogleDriveNetmount';

if (!class_exists('elFinderVolumeFlysystemGoogleDriveCache', false)) {
    class elFinderVolumeFlysystemGoogleDriveCache extends ACache
    {
        use Hasdir;
        use DisableEnsureParentDirectories;
    }
}

class elFinderVolumeFlysystemGoogleDriveNetmount extends ExtDriver
{

    public function __construct()
    {
        parent::__construct();

        $opts = array(
            'acceptedName' => '#^[^/\\?*:|"<>]*[^./\\?*:|"<>]$#',
            'rootCssClass' => 'elfinder-navbar-root-googledrive',
            'gdAlias' => '%s@GDrive',
            'gdCacheDir' => __DIR__ . '/.tmp',
            'gdCachePrefix' => 'gd-',
            'gdCacheExpire' => 600
        );

        $this->options = array_merge($this->options, $opts);
    }

    /**
     * Prepare driver before mount volume.
     * Return true if volume is ready.
     *
     * @return bool
     **/
    protected function init()
    {
        if (empty($this->options['icon'])) {
            $this->options['icon'] = true;
        }
        if ($res = parent::init()) {
            if ($this->options['icon'] === true) {
                unset($this->options['icon']);
            }
            // enable command archive
            $this->options['useRemoteArchive'] = true;
        }
        return $res;
    }

    /**
     * Prepare
     * Call from elFinder::netmout() before volume->mount()
     *
     * @param $options
     *
     * @return Array
     * @author Naoki Sawada
     */
    public function netmountPrepare($options)
    {
        if (empty($options['client_id']) && defined('ELFINDER_GOOGLEDRIVE_CLIENTID')) {
            $options['client_id'] = ELFINDER_GOOGLEDRIVE_CLIENTID;
        }
        if (empty($options['client_secret']) && defined('ELFINDER_GOOGLEDRIVE_CLIENTSECRET')) {
            $options['client_secret'] = ELFINDER_GOOGLEDRIVE_CLIENTSECRET;
        }

        if (!isset($options['pass'])) {
            $options['pass'] = '';
        }

        try {
            $client = new \Google_Client();
            $client->setClientId($options['client_id']);
            $client->setClientSecret($options['client_secret']);

            if ($options['pass'] === 'reauth') {
                $options['pass'] = '';
                $this->session->set('GoogleDriveAuthParams', [])->set('GoogleDriveTokens', []);
            } else if ($options['pass'] === 'googledrive') {
                $options['pass'] = '';
            }

            $options = array_merge($this->session->get('GoogleDriveAuthParams', []), $options);

            if (!isset($options['access_token'])) {
                $options['access_token'] = $this->session->get('GoogleDriveTokens', []);
                $this->session->remove('GoogleDriveTokens');
            }
            $aToken = $options['access_token'];

            $rootObj = $service = null;
            if ($aToken) {
                try {
                    $client->setAccessToken($aToken);
                    if ($client->isAccessTokenExpired()) {
                        $aToken = array_merge($aToken, $client->fetchAccessTokenWithRefreshToken());
                        $client->setAccessToken($aToken);
                    }
                    $service = new \Google_Service_Drive($client);
                    $rootObj = $service->files->get('root');

                    $options['access_token'] = $aToken;
                    $this->session->set('GoogleDriveAuthParams', $options);

                } catch (Exception $e) {
                    $aToken = [];
                    $options['access_token'] = [];
                    if ($options['user'] !== 'init') {
                        $this->session->set('GoogleDriveAuthParams', $options);
                        return array('exit' => true, 'error' => elFinder::ERROR_REAUTH_REQUIRE);
                    }
                }

            }

            $itpCare = isset($options['code']);
            $code = $itpCare? $options['code'] : (isset($_GET['code'])? $_GET['code'] : '');
            if ($code || $options['user'] === 'init') {
                if (empty($options['url'])) {
                    $options['url'] = elFinder::getConnectorUrl();
                }

                if (isset($options['id'])) {
                    $callback = $options['url'] . (strpos($options['url'], '?') !== false? '&' : '?') . 'cmd=netmount&protocol=googledrive&host=' . ($options['id'] === 'elfinder'? '1' : $options['id']);
                    $client->setRedirectUri($callback);
                }

                if (!$aToken && empty($code)) {
                    $client->setScopes([Google_Service_Drive::DRIVE]);
                    if (!empty($options['offline'])) {
                        $client->setApprovalPrompt('force');
                        $client->setAccessType('offline');
                    }
                    $url = $client->createAuthUrl();

                    $html = '<input id="elf-volumedriver-googledrive-host-btn" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" value="{msg:btnApprove}" type="button">';
                    $html .= '<script>
                        jQuery("#' . $options['id'] . '").elfinder("instance").trigger("netmount", {protocol: "googledrive", mode: "makebtn", url: "' . $url . '"});
                    </script>';
                    if (empty($options['pass']) && $options['host'] !== '1') {
                        $options['pass'] = 'return';
                        $this->session->set('GoogleDriveAuthParams', $options);
                        return array('exit' => true, 'body' => $html);
                    } else {
                        $out = array(
                            'node' => $options['id'],
                            'json' => '{"protocol": "googledrive", "mode": "makebtn", "body" : "' . str_replace($html, '"', '\\"') . '", "error" : "' . elFinder::ERROR_ACCESS_DENIED . '"}',
                            'bind' => 'netmount'
                        );
                        return array('exit' => 'callback', 'out' => $out);
                    }
                } else {
                    if ($code) {
                        if (!empty($options['id'])) {
                            $aToken = $client->fetchAccessTokenWithAuthCode($code);
                            $options['access_token'] = $aToken;
                            unset($options['code']);
                            $this->session->set('GoogleDriveTokens', $aToken)->set('GoogleDriveAuthParams', $options);
                            $out = array(
                                'node' => $options['id'],
                                'json' => '{"protocol": "googledrive", "mode": "done", "reset": 1}',
                                'bind' => 'netmount'
                            );
                        } else {
                            $nodeid = ($_GET['host'] === '1')? 'elfinder' : $_GET['host'];
                            $out = array(
                                'node' => $nodeid,
                                'json' => json_encode(array(
                                    'protocol' => 'googledrive',
                                    'host' => $nodeid,
                                    'mode' => 'redirect',
                                    'options' => array(
                                        'id' => $nodeid,
                                        'code'=> $code
                                    )
                                )),
                                'bind' => 'netmount'
                            );
                        }
                        if (!$itpCare) {
                            return array('exit' => 'callback', 'out' => $out);
                        } else {
                            return array('exit' => true, 'body' => $out['json']);
                        }
                    }
                    $folders = [];
                    foreach ($service->files->listFiles([
                        'pageSize' => 1000,
                        'q' => 'trashed = false and mimeType = "application/vnd.google-apps.folder"'
                    ]) as $f) {
                        $folders[$f->getId()] = $f->getName();
                    }
                    natcasesort($folders);
                    $folders = ['root' => $rootObj->getName()] + $folders;
                    $folders = json_encode($folders);
                    $json = '{"protocol": "googledrive", "mode": "done", "folders": ' . $folders . '}';
                    $options['pass'] = 'return';
                    $html = 'Google.com';
                    $html .= '<script>
                        jQuery("#' . $options['id'] . '").elfinder("instance").trigger("netmount", ' . $json . ');
                    </script>';
                    $this->session->set('GoogleDriveAuthParams', $options);
                    return array('exit' => true, 'body' => $html);
                }
            }
        } catch (Exception $e) {
            $this->session->remove('GoogleDriveAuthParams')->remove('GoogleDriveTokens');
            if (empty($options['pass'])) {
                return array('exit' => true, 'body' => '{msg:' . elFinder::ERROR_ACCESS_DENIED . '}' . ' ' . $e->getMessage());
            } else {
                return array('exit' => true, 'error' => [elFinder::ERROR_ACCESS_DENIED, $e->getMessage()]);
            }
        }

        if (!$aToken) {
            return array('exit' => true, 'error' => elFinder::ERROR_REAUTH_REQUIRE);
        }

        if ($options['path'] === '/') {
            $options['path'] = 'root';
        }

        try {
            $file = $service->files->get($options['path']);
            $options['alias'] = sprintf($this->options['gdAlias'], $file->getName());
            if (!empty($this->options['netkey'])) {
                elFinder::$instance->updateNetVolumeOption($this->options['netkey'], 'alias', $this->options['alias']);
            }
        } catch (Google_Service_Exception $e) {
            $err = json_decode($e->getMessage(), true);
            if (isset($err['error']) && $err['error']['code'] == 404) {
                return array('exit' => true, 'error' => [elFinder::ERROR_TRGDIR_NOT_FOUND, $options['path']]);
            } else {
                return array('exit' => true, 'error' => $e->getMessage());
            }
        } catch (Exception $e) {
            return array('exit' => true, 'error' => $e->getMessage());
        }

        foreach (['host', 'user', 'pass', 'id', 'offline'] as $key) {
            unset($options[$key]);
        }

        return $options;
    }

    /**
     * process of on netunmount
     * Drop table `dropbox` & rm thumbs
     *
     * @param $netVolumes
     * @param $key
     *
     * @return bool
     * @internal param array $options
     */
    public function netunmount($netVolumes, $key)
    {
        $cache = $this->options['gdCacheDir'] . DIRECTORY_SEPARATOR . $this->options['gdCachePrefix'] . $this->netMountKey;
        if (file_exists($cache) && is_writeable($cache)) {
            unlink($cache);
        }
        if ($tmbs = glob($this->tmbPath . DIRECTORY_SEPARATOR . $this->netMountKey . '*')) {
            foreach ($tmbs as $file) {
                unlink($file);
            }
        }
        return true;
    }

    /**
     * "Mount" volume.
     * Return true if volume available for read or write,
     * false - otherwise
     *
     * @param array $opts
     *
     * @return bool
     * @author Naoki Sawada
     */
    public function mount(array $opts)
    {
        $creds = null;
        if (isset($opts['access_token'])) {
            $this->netMountKey = md5(join('-', array('googledrive', $opts['path'], (isset($opts['access_token']['refresh_token']) ? $opts['access_token']['refresh_token'] : $opts['access_token']['access_token']))));
        }

        $client = new \Google_Client();
        $client->setClientId($opts['client_id']);
        $client->setClientSecret($opts['client_secret']);

        if (!empty($opts['access_token'])) {
            $client->setAccessToken($opts['access_token']);
        }
        if ($this->needOnline && $client->isAccessTokenExpired()) {
            try {
                $creds = $client->fetchAccessTokenWithRefreshToken();
            } catch (LogicException $e) {
                $this->session->remove('GoogleDriveAuthParams');
                throw $e;
            }
        }

        $service = new \Google_Service_Drive($client);

        // If path is not set, use the root
        if (!isset($opts['path']) || $opts['path'] === '') {
            $opts['path'] = 'root';
        }

        $googleDrive = new GoogleDriveAdapter($service, $opts['path'], ['useHasDir' => true]);

        $opts['fscache'] = null;
        if ($this->options['gdCacheDir'] && is_writeable($this->options['gdCacheDir'])) {
            if ($this->options['gdCacheExpire']) {
                $opts['fscache'] = new elFinderVolumeFlysystemGoogleDriveCache(new Local($this->options['gdCacheDir']), $this->options['gdCachePrefix'] . $this->netMountKey, $this->options['gdCacheExpire']);
            }
        }
        if ($opts['fscache']) {
            $filesystem = new Filesystem(new CachedAdapter($googleDrive, $opts['fscache']));
        } else {
            $filesystem = new Filesystem($googleDrive);
        }

        $opts['driver'] = 'FlysystemExt';
        $opts['filesystem'] = $filesystem;
        $opts['separator'] = '/';
        $opts['checkSubfolders'] = true;
        if (!isset($opts['alias'])) {
            $opts['alias'] = 'GoogleDrive';
        }

        if ($res = parent::mount($opts)) {
            // update access_token of session data
            if ($creds) {
                $netVolumes = $this->session->get('netvolume');
                $netVolumes[$this->netMountKey]['access_token'] = array_merge($netVolumes[$this->netMountKey]['access_token'], $creds);
                $this->session->set('netvolume', $netVolumes);
            }
        }

        return $res;
    }

    /**
     * @inheritdoc
     */
    protected function tmbname($stat)
    {
        return $this->netMountKey . substr(substr($stat['hash'], strlen($this->id)), -38) . $stat['ts'] . '.png';
    }

    /**
     * Return debug info for client.
     *
     * @return array
     **/
    public function debug()
    {
        $res = parent::debug();
        if (!empty($this->options['netkey']) && empty($this->options['refresh_token']) && $this->options['access_token'] && isset($this->options['access_token']['refresh_token'])) {
            $res['refresh_token'] = $this->options['access_token']['refresh_token'];
        }

        return $res;
    }
}
php/autoload.php000064400000005170151215013420007651 0ustar00<?php

define('ELFINDER_PHP_ROOT_PATH', dirname(__FILE__));

function elFinderAutoloader($name)
{
    $map = array(
        'elFinder' => 'elFinder.class.php',
        'elFinderConnector' => 'elFinderConnector.class.php',
        'elFinderEditor' => 'editors/editor.php',
        'elFinderLibGdBmp' => 'libs/GdBmp.php',
        'elFinderPlugin' => 'elFinderPlugin.php',
        'elFinderPluginAutoResize' => 'plugins/AutoResize/plugin.php',
        'elFinderPluginAutoRotate' => 'plugins/AutoRotate/plugin.php',
        'elFinderPluginNormalizer' => 'plugins/Normalizer/plugin.php',
        'elFinderPluginSanitizer' => 'plugins/Sanitizer/plugin.php',
        'elFinderPluginWatermark' => 'plugins/Watermark/plugin.php',
        'elFinderSession' => 'elFinderSession.php',
        'elFinderSessionInterface' => 'elFinderSessionInterface.php',
        'elFinderVolumeDriver' => 'elFinderVolumeDriver.class.php',
        'elFinderVolumeDropbox2' => 'elFinderVolumeDropbox2.class.php',
        'elFinderVolumeFTP' => 'elFinderVolumeFTP.class.php',
        'elFinderVolumeFlysystemGoogleDriveCache' => 'elFinderFlysystemGoogleDriveNetmount.php',
        'elFinderVolumeFlysystemGoogleDriveNetmount' => 'elFinderFlysystemGoogleDriveNetmount.php',
        'elFinderVolumeGoogleDrive' => 'elFinderVolumeGoogleDrive.class.php',
        'elFinderVolumeGroup' => 'elFinderVolumeGroup.class.php',
        'elFinderVolumeLocalFileSystem' => 'elFinderVolumeLocalFileSystem.class.php',
        'elFinderVolumeMySQL' => 'elFinderVolumeMySQL.class.php',
        'elFinderVolumeSFTPphpseclib' => 'elFinderVolumeSFTPphpseclib.class.php',
        'elFinderVolumeTrash' => 'elFinderVolumeTrash.class.php',
    );
    if (isset($map[$name])) {
        return include_once(ELFINDER_PHP_ROOT_PATH . '/' . $map[$name]);
    }
    $prefix = substr($name, 0, 14);
    if (substr($prefix, 0, 8) === 'elFinder') {
        if ($prefix === 'elFinderVolume') {
            $file = ELFINDER_PHP_ROOT_PATH . '/' . $name . '.class.php';
            return (is_file($file) && include_once($file));
        } else if ($prefix === 'elFinderPlugin') {
            $file = ELFINDER_PHP_ROOT_PATH . '/plugins/' . substr($name, 14) . '/plugin.php';
            return (is_file($file) && include_once($file));
        } else if ($prefix === 'elFinderEditor') {
            $file = ELFINDER_PHP_ROOT_PATH . '/editors/' . substr($name, 14) . '/editor.php';
            return (is_file($file) && include_once($file));
        }
    }
    return false;
}

if (version_compare(PHP_VERSION, '5.3', '<')) {
    spl_autoload_register('elFinderAutoloader');
} else {
    spl_autoload_register('elFinderAutoloader', true, true);
}

php/elFinderVolumeFTP.class.php000064400000162270151215013420012444 0ustar00<?php

/**
 * Simple elFinder driver for FTP
 *
 * @author Dmitry (dio) Levashov
 * @author Cem (discofever)
 **/
class elFinderVolumeFTP extends elFinderVolumeDriver
{

    /**
     * Driver id
     * Must be started from letter and contains [a-z0-9]
     * Used as part of volume id
     *
     * @var string
     **/
    protected $driverId = 'f';

    /**
     * FTP Connection Instance
     *
     * @var resource a FTP stream
     **/
    protected $connect = null;

    /**
     * Directory for tmp files
     * If not set driver will try to use tmbDir as tmpDir
     *
     * @var string
     **/
    protected $tmpPath = '';

    /**
     * Last FTP error message
     *
     * @var string
     **/
    protected $ftpError = '';

    /**
     * FTP server output list as ftp on linux
     *
     * @var bool
     **/
    protected $ftpOsUnix;

    /**
     * FTP LIST command option
     *
     * @var string
     */
    protected $ftpListOption = '-al';


    /**
     * Is connected server Pure FTPd?
     *
     * @var bool
     */
    protected $isPureFtpd = false;

    /**
     * Is connected server with FTPS?
     *
     * @var bool
     */
    protected $isFTPS = false;

    /**
     * Tmp folder path
     *
     * @var string
     **/
    protected $tmp = '';

    /**
     * FTP command `MLST` support
     *
     * @var bool
     */
    private $MLSTsupprt = false;

    /**
     * Calling cacheDir() target path with non-MLST
     *
     * @var string
     */
    private $cacheDirTarget = '';

    /**
     * Constructor
     * Extend options with required fields
     *
     * @author Dmitry (dio) Levashov
     * @author Cem (DiscoFever)
     */
    public function __construct()
    {
        $opts = array(
            'host' => 'localhost',
            'user' => '',
            'pass' => '',
            'port' => 21,
            'mode' => 'passive',
            'ssl' => false,
            'path' => '/',
            'timeout' => 20,
            'owner' => true,
            'tmbPath' => '',
            'tmpPath' => '',
            'separator' => '/',
            'checkSubfolders' => -1,
            'dirMode' => 0755,
            'fileMode' => 0644,
            'rootCssClass' => 'elfinder-navbar-root-ftp',
            'ftpListOption' => '-al',
        );
        $this->options = array_merge($this->options, $opts);
        $this->options['mimeDetect'] = 'internal';
    }

    /**
     * Prepare
     * Call from elFinder::netmout() before volume->mount()
     *
     * @param $options
     *
     * @return array volume root options
     * @author Naoki Sawada
     */
    public function netmountPrepare($options)
    {
        if (!empty($_REQUEST['encoding']) && iconv('UTF-8', $_REQUEST['encoding'], '') !== false) {
            $options['encoding'] = $_REQUEST['encoding'];
            if (!empty($_REQUEST['locale']) && setlocale(LC_ALL, $_REQUEST['locale'])) {
                setlocale(LC_ALL, elFinder::$locale);
                $options['locale'] = $_REQUEST['locale'];
            }
        }
        if (!empty($_REQUEST['FTPS'])) {
            $options['ssl'] = true;
        }
        $options['statOwner'] = true;
        $options['allowChmodReadOnly'] = true;
        $options['acceptedName'] = '#^[^/\\?*:|"<>]*[^./\\?*:|"<>]$#';
        return $options;
    }

    /*********************************************************************/
    /*                        INIT AND CONFIGURE                         */
    /*********************************************************************/

    /**
     * Prepare FTP connection
     * Connect to remote server and check if credentials are correct, if so, store the connection id in $ftp_conn
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     * @author Cem (DiscoFever)
     **/
    protected function init()
    {
        if (!$this->options['host']
            || !$this->options['port']) {
            return $this->setError('Required options undefined.');
        }

        if (!$this->options['user']) {
            $this->options['user'] = 'anonymous';
            $this->options['pass'] = '';
        }
        if (!$this->options['path']) {
            $this->options['path'] = '/';
        }

        // make ney mount key
        $this->netMountKey = md5(join('-', array('ftp', $this->options['host'], $this->options['port'], $this->options['path'], $this->options['user'])));

        if (!function_exists('ftp_connect')) {
            return $this->setError('FTP extension not loaded.');
        }

        // remove protocol from host
        $scheme = parse_url($this->options['host'], PHP_URL_SCHEME);

        if ($scheme) {
            $this->options['host'] = substr($this->options['host'], strlen($scheme) + 3);
        }

        // normalize root path
        $this->root = $this->options['path'] = $this->_normpath($this->options['path']);

        if (empty($this->options['alias'])) {
            $this->options['alias'] = $this->options['user'] . '@' . $this->options['host'];
            if (!empty($this->options['netkey'])) {
                elFinder::$instance->updateNetVolumeOption($this->options['netkey'], 'alias', $this->options['alias']);
            }
        }

        $this->rootName = $this->options['alias'];
        $this->options['separator'] = '/';

        if (is_null($this->options['syncChkAsTs'])) {
            $this->options['syncChkAsTs'] = true;
        }

        if (isset($this->options['ftpListOption'])) {
            $this->ftpListOption = $this->options['ftpListOption'];
        }

        return $this->needOnline? $this->connect() : true;

    }


    /**
     * Configure after successfull mount.
     *
     * @return void
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function configure()
    {
        parent::configure();

        if (!empty($this->options['tmpPath'])) {
            if ((is_dir($this->options['tmpPath']) || mkdir($this->options['tmpPath'], 0755, true)) && is_writable($this->options['tmpPath'])) {
                $this->tmp = $this->options['tmpPath'];
            }
        }
        if (!$this->tmp && ($tmp = elFinder::getStaticVar('commonTempPath'))) {
            $this->tmp = $tmp;
        }

        // fallback of $this->tmp
        if (!$this->tmp && $this->tmbPathWritable) {
            $this->tmp = $this->tmbPath;
        }

        if (!$this->tmp) {
            $this->disabled[] = 'mkfile';
            $this->disabled[] = 'paste';
            $this->disabled[] = 'duplicate';
            $this->disabled[] = 'upload';
            $this->disabled[] = 'edit';
            $this->disabled[] = 'archive';
            $this->disabled[] = 'extract';
        }

        // echo $this->tmp;

    }

    /**
     * Connect to ftp server
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function connect()
    {
        $withSSL = empty($this->options['ssl']) ? '' : ' with SSL';
        if ($withSSL) {
            if (!function_exists('ftp_ssl_connect') || !($this->connect = ftp_ssl_connect($this->options['host'], $this->options['port'], $this->options['timeout']))) {
                return $this->setError('Unable to connect to FTP server ' . $this->options['host'] . $withSSL);
            }
            $this->isFTPS = true;
        } else {
            if (!($this->connect = ftp_connect($this->options['host'], $this->options['port'], $this->options['timeout']))) {
                return $this->setError('Unable to connect to FTP server ' . $this->options['host']);
            }
        }
        if (!ftp_login($this->connect, $this->options['user'], $this->options['pass'])) {
            $this->umount();
            return $this->setError('Unable to login into ' . $this->options['host'] . $withSSL);
        }

        // try switch utf8 mode
        if ($this->encoding) {
            ftp_raw($this->connect, 'OPTS UTF8 OFF');
        } else {
            ftp_raw($this->connect, 'OPTS UTF8 ON');
        }

        $help = ftp_raw($this->connect, 'HELP');
        $this->isPureFtpd = stripos(implode(' ', $help), 'Pure-FTPd') !== false;

        if (!$this->isPureFtpd) {
            // switch off extended passive mode - may be usefull for some servers
            // this command, for pure-ftpd, doesn't work and takes a timeout in some pure-ftpd versions
            ftp_raw($this->connect, 'epsv4 off');
        }
        // enter passive mode if required
        $pasv = ($this->options['mode'] == 'passive');
        if (!ftp_pasv($this->connect, $pasv)) {
            if ($pasv) {
                $this->options['mode'] = 'active';
            }
        }

        // enter root folder
        if (!ftp_chdir($this->connect, $this->root)
            || $this->root != ftp_pwd($this->connect)) {
            $this->umount();
            return $this->setError('Unable to open root folder.');
        }

        // check for MLST support
        $features = ftp_raw($this->connect, 'FEAT');
        if (!is_array($features)) {
            $this->umount();
            return $this->setError('Server does not support command FEAT.');
        }

        foreach ($features as $feat) {
            if (strpos(trim($feat), 'MLST') === 0) {
                $this->MLSTsupprt = true;
                break;
            }
        }

        return true;
    }

    /**
     * Call ftp_rawlist with option prefix
     *
     * @param string $path
     *
     * @return array
     */
    protected function ftpRawList($path)
    {
        if ($this->isPureFtpd) {
            $path = str_replace(' ', '\ ', $path);
        }
        if ($this->ftpListOption) {
            $path = $this->ftpListOption . ' ' . $path;
        }
        $res = ftp_rawlist($this->connect, $path);
        if ($res === false) {
            $res = array();
        }
        return $res;
    }

    /*********************************************************************/
    /*                               FS API                              */
    /*********************************************************************/

    /**
     * Close opened connection
     *
     * @return void
     * @author Dmitry (dio) Levashov
     **/
    public function umount()
    {
        $this->connect && ftp_close($this->connect);
    }


    /**
     * Parse line from ftp_rawlist() output and return file stat (array)
     *
     * @param  string $raw line from ftp_rawlist() output
     * @param         $base
     * @param bool    $nameOnly
     *
     * @return array
     * @author Dmitry Levashov
     */
    protected function parseRaw($raw, $base, $nameOnly = false)
    {
        static $now;
        static $lastyear;

        if (!$now) {
            $now = time();
            $lastyear = date('Y') - 1;
        }

        $info = preg_split("/\s+/", $raw, 8);
        if (isset($info[7])) {
        	list($info[7], $info[8]) = explode(' ', $info[7], 2);
        }
        $stat = array();

        if (!isset($this->ftpOsUnix)) {
            $this->ftpOsUnix = !preg_match('/\d/', substr($info[0], 0, 1));
        }
        if (!$this->ftpOsUnix) {
            $info = $this->normalizeRawWindows($raw);
        }

        if (count($info) < 9 || $info[8] == '.' || $info[8] == '..') {
            return false;
        }

        $name = $info[8];

        if (preg_match('|(.+)\-\>(.+)|', $name, $m)) {
            $name = trim($m[1]);
            // check recursive processing
            if ($this->cacheDirTarget && $this->_joinPath($base, $name) !== $this->cacheDirTarget) {
                return array();
            }
            if (!$nameOnly) {
                $target = trim($m[2]);
                if (substr($target, 0, 1) !== $this->separator) {
                    $target = $this->getFullPath($target, $base);
                }
                $target = $this->_normpath($target);
                $stat['name'] = $name;
                $stat['target'] = $target;
                return $stat;
            }
        }

        if ($nameOnly) {
            return array('name' => $name);
        }

        if (is_numeric($info[5]) && !$info[6] && !$info[7]) {
            // by normalizeRawWindows()
            $stat['ts'] = $info[5];
        } else {
            $stat['ts'] = strtotime($info[5] . ' ' . $info[6] . ' ' . $info[7]);
            if ($stat['ts'] && $stat['ts'] > $now && strpos($info[7], ':') !== false) {
                $stat['ts'] = strtotime($info[5] . ' ' . $info[6] . ' ' . $lastyear . ' ' . $info[7]);
            }
            if (empty($stat['ts'])) {
                $stat['ts'] = strtotime($info[6] . ' ' . $info[5] . ' ' . $info[7]);
                if ($stat['ts'] && $stat['ts'] > $now && strpos($info[7], ':') !== false) {
                    $stat['ts'] = strtotime($info[6] . ' ' . $info[5] . ' ' . $lastyear . ' ' . $info[7]);
                }
            }
        }

        if ($this->options['statOwner']) {
            $stat['owner'] = $info[2];
            $stat['group'] = $info[3];
            $stat['perm'] = substr($info[0], 1);
            //
            // if not exists owner in LS ftp ==>                    isowner = true
            // if is defined as option : 'owner' => true            isowner = true
            //
            // if exist owner in LS ftp  and 'owner' => False       isowner =   result of    owner(file) == user(logged with ftp)
            //
            $stat['isowner'] = isset($stat['owner']) ? ($this->options['owner'] ? true : ($stat['owner'] == $this->options['user'])) : true;
        }

        $owner_computed = isset($stat['isowner']) ? $stat['isowner'] : $this->options['owner'];
        $perm = $this->parsePermissions($info[0], $owner_computed);
        $stat['name'] = $name;
        $stat['mime'] = substr(strtolower($info[0]), 0, 1) == 'd' ? 'directory' : $this->mimetype($stat['name'], true);
        $stat['size'] = $stat['mime'] == 'directory' ? 0 : $info[4];
        $stat['read'] = $perm['read'];
        $stat['write'] = $perm['write'];

        return $stat;
    }

    /**
     * Normalize MS-DOS style FTP LIST Raw line
     *
     * @param  string $raw line from FTP LIST (MS-DOS style)
     *
     * @return array
     * @author Naoki Sawada
     **/
    protected function normalizeRawWindows($raw)
    {
        $info = array_pad(array(), 9, '');
        $item = preg_replace('#\s+#', ' ', trim($raw), 3);
        list($date, $time, $size, $name) = explode(' ', $item, 4);
        $format = strlen($date) === 8 ? 'm-d-yH:iA' : 'Y-m-dH:i';
        $dateObj = DateTime::createFromFormat($format, $date . $time);
        $info[5] = strtotime($dateObj->format('Y-m-d H:i'));
        $info[8] = $name;
        if ($size === '<DIR>') {
            $info[4] = 0;
            $info[0] = 'drwxr-xr-x';
        } else {
            $info[4] = (int)$size;
            $info[0] = '-rw-r--r--';
        }
        return $info;
    }

    /**
     * Parse permissions string. Return array(read => true/false, write => true/false)
     *
     * @param  string $perm                        permissions string   'rwx' + 'rwx' + 'rwx'
     *                                             ^       ^       ^
     *                                             |       |       +->   others
     *                                             |       +--------->   group
     *                                             +----------------->   owner
     *                                             The isowner parameter is computed by the caller.
     *                                             If the owner parameter in the options is true, the user is the actual owner of all objects even if che user used in the ftp Login
     *                                             is different from the file owner id.
     *                                             If the owner parameter is false to understand if the user is the file owner we compare the ftp user with the file owner id.
     * @param Boolean $isowner                     . Tell if the current user is the owner of the object.
     *
     * @return array
     * @author Dmitry (dio) Levashov
     * @author Ugo Vierucci
     */
    protected function parsePermissions($perm, $isowner = true)
    {
        $res = array();
        $parts = array();
        for ($i = 0, $l = strlen($perm); $i < $l; $i++) {
            $parts[] = substr($perm, $i, 1);
        }

        $read = ($isowner && $parts[1] == 'r') || $parts[4] == 'r' || $parts[7] == 'r';

        return array(
            'read' => $parts[0] == 'd' ? $read && (($isowner && $parts[3] == 'x') || $parts[6] == 'x' || $parts[9] == 'x') : $read,
            'write' => ($isowner && $parts[2] == 'w') || $parts[5] == 'w' || $parts[8] == 'w'
        );
    }

    /**
     * Cache dir contents
     *
     * @param  string $path dir path
     *
     * @return void
     * @author Dmitry Levashov
     **/
    protected function cacheDir($path)
    {
        $this->dirsCache[$path] = array();
        $hasDir = false;

        $list = array();
        $encPath = $this->convEncIn($path);
        foreach ($this->ftpRawList($encPath) as $raw) {
            if (($stat = $this->parseRaw($raw, $encPath))) {
                $list[] = $stat;
            }
        }
        $list = $this->convEncOut($list);
        $prefix = ($path === $this->separator) ? $this->separator : $path . $this->separator;
        $targets = array();
        foreach ($list as $stat) {
            $p = $prefix . $stat['name'];
            if (isset($stat['target'])) {
                // stat later
                $targets[$stat['name']] = $stat['target'];
            } else {
                $stat = $this->updateCache($p, $stat);
                if (empty($stat['hidden'])) {
                    if (!$hasDir && $stat['mime'] === 'directory') {
                        $hasDir = true;
                    }
                    $this->dirsCache[$path][] = $p;
                }
            }
        }
        // stat link targets
        foreach ($targets as $name => $target) {
            $stat = array();
            $stat['name'] = $name;
            $p = $prefix . $name;
            $cacheDirTarget = $this->cacheDirTarget;
            $this->cacheDirTarget = $this->convEncIn($target, true);
            if ($tstat = $this->stat($target)) {
                $stat['size'] = $tstat['size'];
                $stat['alias'] = $target;
                $stat['thash'] = $tstat['hash'];
                $stat['mime'] = $tstat['mime'];
                $stat['read'] = $tstat['read'];
                $stat['write'] = $tstat['write'];

                if (isset($tstat['ts'])) {
                    $stat['ts'] = $tstat['ts'];
                }
                if (isset($tstat['owner'])) {
                    $stat['owner'] = $tstat['owner'];
                }
                if (isset($tstat['group'])) {
                    $stat['group'] = $tstat['group'];
                }
                if (isset($tstat['perm'])) {
                    $stat['perm'] = $tstat['perm'];
                }
                if (isset($tstat['isowner'])) {
                    $stat['isowner'] = $tstat['isowner'];
                }
            } else {

                $stat['mime'] = 'symlink-broken';
                $stat['read'] = false;
                $stat['write'] = false;
                $stat['size'] = 0;

            }
            $this->cacheDirTarget = $cacheDirTarget;
            $stat = $this->updateCache($p, $stat);
            if (empty($stat['hidden'])) {
                if (!$hasDir && $stat['mime'] === 'directory') {
                    $hasDir = true;
                }
                $this->dirsCache[$path][] = $p;
            }
        }

        if (isset($this->sessionCache['subdirs'])) {
            $this->sessionCache['subdirs'][$path] = $hasDir;
        }
    }

    /**
     * Return ftp transfer mode for file
     *
     * @param  string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function ftpMode($path)
    {
        return strpos($this->mimetype($path), 'text/') === 0 ? FTP_ASCII : FTP_BINARY;
    }

    /*********************** paths/urls *************************/

    /**
     * Return parent directory path
     *
     * @param  string $path file path
     *
     * @return string
     * @author Naoki Sawada
     **/
    protected function _dirname($path)
    {
        $parts = explode($this->separator, trim($path, $this->separator));
        array_pop($parts);
        return $this->separator . join($this->separator, $parts);
    }

    /**
     * Return file name
     *
     * @param  string $path file path
     *
     * @return string
     * @author Naoki Sawada
     **/
    protected function _basename($path)
    {
        $parts = explode($this->separator, trim($path, $this->separator));
        return array_pop($parts);
    }

    /**
     * Join dir name and file name and retur full path
     *
     * @param  string $dir
     * @param  string $name
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _joinPath($dir, $name)
    {
        return rtrim($dir, $this->separator) . $this->separator . $name;
    }

    /**
     * Return normalized path, this works the same as os.path.normpath() in Python
     *
     * @param  string $path path
     *
     * @return string
     * @author Troex Nevelin
     **/
    protected function _normpath($path)
    {
        if (empty($path)) {
            $path = '.';
        }
        // path must be start with /
        $path = preg_replace('|^\.\/?|', $this->separator, $path);
        $path = preg_replace('/^([^\/])/', "/$1", $path);

        if ($path[0] === $this->separator) {
            $initial_slashes = true;
        } else {
            $initial_slashes = false;
        }

        if (($initial_slashes)
            && (strpos($path, '//') === 0)
            && (strpos($path, '///') === false)) {
            $initial_slashes = 2;
        }

        $initial_slashes = (int)$initial_slashes;

        $comps = explode($this->separator, $path);
        $new_comps = array();
        foreach ($comps as $comp) {
            if (in_array($comp, array('', '.'))) {
                continue;
            }

            if (($comp != '..')
                || (!$initial_slashes && !$new_comps)
                || ($new_comps && (end($new_comps) == '..'))) {
                array_push($new_comps, $comp);
            } elseif ($new_comps) {
                array_pop($new_comps);
            }
        }
        $comps = $new_comps;
        $path = implode($this->separator, $comps);
        if ($initial_slashes) {
            $path = str_repeat($this->separator, $initial_slashes) . $path;
        }

        return $path ? $path : '.';
    }

    /**
     * Return file path related to root dir
     *
     * @param  string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _relpath($path)
    {
        if ($path === $this->root) {
            return '';
        } else {
            if (strpos($path, $this->root) === 0) {
                return ltrim(substr($path, strlen($this->root)), $this->separator);
            } else {
                // for link
                return $path;
            }
        }
    }

    /**
     * Convert path related to root dir into real path
     *
     * @param  string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _abspath($path)
    {
        if ($path === $this->separator) {
            return $this->root;
        } else {
            if ($path[0] === $this->separator) {
                // for link
                return $path;
            } else {
                return $this->_joinPath($this->root, $path);
            }
        }
    }

    /**
     * Return fake path started from root dir
     *
     * @param  string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _path($path)
    {
        return $this->rootName . ($path == $this->root ? '' : $this->separator . $this->_relpath($path));
    }

    /**
     * Return true if $path is children of $parent
     *
     * @param  string $path   path to check
     * @param  string $parent parent path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _inpath($path, $parent)
    {
        return $path == $parent || strpos($path, rtrim($parent, $this->separator) . $this->separator) === 0;
    }

    /***************** file stat ********************/
    /**
     * Return stat for given path.
     * Stat contains following fields:
     * - (int)    size    file size in b. required
     * - (int)    ts      file modification time in unix time. required
     * - (string) mime    mimetype. required for folders, others - optionally
     * - (bool)   read    read permissions. required
     * - (bool)   write   write permissions. required
     * - (bool)   locked  is object locked. optionally
     * - (bool)   hidden  is object hidden. optionally
     * - (string) alias   for symlinks - link target path relative to root path. optionally
     * - (string) target  for symlinks - link target path. optionally
     * If file does not exists - returns empty array or false.
     *
     * @param  string $path file path
     *
     * @return array|false
     * @author Dmitry (dio) Levashov
     **/
    protected function _stat($path)
    {
        $outPath = $this->convEncOut($path);
        if (isset($this->cache[$outPath])) {
            return $this->convEncIn($this->cache[$outPath]);
        } else {
            $this->convEncIn();
        }
        if (!$this->MLSTsupprt) {
            if ($path === $this->root) {
                $res = array(
                    'name' => $this->root,
                    'mime' => 'directory',
                    'dirs' => -1
                );
                if ($this->needOnline && (($this->ARGS['cmd'] === 'open' && $this->ARGS['target'] === $this->encode($this->root)) || $this->isMyReload())) {
                    $check = array(
                        'ts' => true,
                        'dirs' => true,
                    );
                    $ts = 0;
                    foreach ($this->ftpRawList($path) as $str) {
                        $info = preg_split('/\s+/', $str, 9);
                        if ($info[8] === '.') {
                            $info[8] = 'root';
                            if ($stat = $this->parseRaw(join(' ', $info), $path)) {
                                unset($stat['name']);
                                $res = array_merge($res, $stat);
                                if ($res['ts']) {
                                    $ts = 0;
                                    unset($check['ts']);
                                }
                            }
                        }
                        if ($check && ($stat = $this->parseRaw($str, $path))) {
                            if (isset($stat['ts']) && !empty($stat['ts'])) {
                                $ts = max($ts, $stat['ts']);
                            }
                            if (isset($stat['dirs']) && $stat['mime'] === 'directory') {
                                $res['dirs'] = 1;
                                unset($stat['dirs']);
                            }
                            if (!$check) {
                                break;
                            }
                        }
                    }
                    if ($ts) {
                        $res['ts'] = $ts;
                    }
                    $this->cache[$outPath] = $res;
                }
                return $res;
            }

            $pPath = $this->_dirname($path);
            if ($this->_inPath($pPath, $this->root)) {
                $outPPpath = $this->convEncOut($pPath);
                if (!isset($this->dirsCache[$outPPpath])) {
                    $parentSubdirs = null;
                    if (isset($this->sessionCache['subdirs']) && isset($this->sessionCache['subdirs'][$outPPpath])) {
                        $parentSubdirs = $this->sessionCache['subdirs'][$outPPpath];
                    }
                    $this->cacheDir($outPPpath);
                    if ($parentSubdirs) {
                        $this->sessionCache['subdirs'][$outPPpath] = $parentSubdirs;
                    }
                }
            }

            $stat = $this->convEncIn(isset($this->cache[$outPath]) ? $this->cache[$outPath] : array());
            if (!$this->mounted) {
                // dispose incomplete cache made by calling `stat` by 'startPath' option
                $this->cache = array();
            }
            return $stat;
        }
        $raw = ftp_raw($this->connect, 'MLST ' . $path);
        if (is_array($raw) && count($raw) > 1 && substr(trim($raw[0]), 0, 1) == 2) {
            $parts = explode(';', trim($raw[1]));
            array_pop($parts);
            $parts = array_map('strtolower', $parts);
            $stat = array();
            $mode = '';
            foreach ($parts as $part) {

                list($key, $val) = explode('=', $part, 2);

                switch ($key) {
                    case 'type':
                        if (strpos($val, 'dir') !== false) {
                            $stat['mime'] = 'directory';
                        } else if (strpos($val, 'link') !== false) {
                            $stat['mime'] = 'symlink';
                            break(2);
                        } else {
                            $stat['mime'] = $this->mimetype($path);
                        }
                        break;

                    case 'size':
                        $stat['size'] = $val;
                        break;

                    case 'modify':
                        $ts = mktime(intval(substr($val, 8, 2)), intval(substr($val, 10, 2)), intval(substr($val, 12, 2)), intval(substr($val, 4, 2)), intval(substr($val, 6, 2)), substr($val, 0, 4));
                        $stat['ts'] = $ts;
                        break;

                    case 'unix.mode':
                        $mode = strval($val);
                        break;

                    case 'unix.uid':
                        $stat['owner'] = $val;
                        break;

                    case 'unix.gid':
                        $stat['group'] = $val;
                        break;

                    case 'perm':
                        $val = strtolower($val);
                        $stat['read'] = (int)preg_match('/e|l|r/', $val);
                        $stat['write'] = (int)preg_match('/w|m|c/', $val);
                        if (!preg_match('/f|d/', $val)) {
                            $stat['locked'] = 1;
                        }
                        break;
                }
            }

            if (empty($stat['mime'])) {
                return array();
            }

            // do not use MLST to get stat of symlink
            if ($stat['mime'] === 'symlink') {
                $this->MLSTsupprt = false;
                $res = $this->_stat($path);
                $this->MLSTsupprt = true;
                return $res;
            }

            if ($stat['mime'] === 'directory') {
                $stat['size'] = 0;
            }

            if ($mode) {
                $stat['perm'] = '';
                if ($mode[0] === '0') {
                    $mode = substr($mode, 1);
                }

                $perm = array();
                for ($i = 0; $i <= 2; $i++) {
                    $perm[$i] = array(false, false, false);
                    $n = isset($mode[$i]) ? $mode[$i] : 0;

                    if ($n - 4 >= 0) {
                        $perm[$i][0] = true;
                        $n = $n - 4;
                        $stat['perm'] .= 'r';
                    } else {
                        $stat['perm'] .= '-';
                    }

                    if ($n - 2 >= 0) {
                        $perm[$i][1] = true;
                        $n = $n - 2;
                        $stat['perm'] .= 'w';
                    } else {
                        $stat['perm'] .= '-';
                    }

                    if ($n - 1 == 0) {
                        $perm[$i][2] = true;
                        $stat['perm'] .= 'x';
                    } else {
                        $stat['perm'] .= '-';
                    }
                }

                $stat['perm'] = trim($stat['perm']);
                //
                // if not exists owner in LS ftp ==>                    isowner = true
                // if is defined as option : 'owner' => true            isowner = true
                //
                // if exist owner in LS ftp  and 'owner' => False        isowner =   result of    owner(file) == user(logged with ftp)

                $owner_computed = isset($stat['owner']) ? ($this->options['owner'] ? true : ($stat['owner'] == $this->options['user'])) : true;

                $read = ($owner_computed && $perm[0][0]) || $perm[1][0] || $perm[2][0];

                $stat['read'] = $stat['mime'] == 'directory' ? $read && (($owner_computed && $perm[0][2]) || $perm[1][2] || $perm[2][2]) : $read;
                $stat['write'] = ($owner_computed && $perm[0][1]) || $perm[1][1] || $perm[2][1];

                if ($this->options['statOwner']) {
                    $stat['isowner'] = $owner_computed;
                } else {
                    unset($stat['owner'], $stat['group'], $stat['perm']);
                }
            }

            return $stat;

        }

        return array();
    }

    /**
     * Return true if path is dir and has at least one childs directory
     *
     * @param  string $path dir path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _subdirs($path)
    {

        foreach ($this->ftpRawList($path) as $str) {
            $info = preg_split('/\s+/', $str, 9);
            if (!isset($this->ftpOsUnix)) {
                $this->ftpOsUnix = !preg_match('/\d/', substr($info[0], 0, 1));
            }
            if (!$this->ftpOsUnix) {
                $info = $this->normalizeRawWindows($str);
            }
            $name = isset($info[8]) ? trim($info[8]) : '';
            if ($name && $name !== '.' && $name !== '..' && substr(strtolower($info[0]), 0, 1) === 'd') {
                return true;
            }
        }
        return false;
    }

    /**
     * Return object width and height
     * Ususaly used for images, but can be realize for video etc...
     *
     * @param  string $path file path
     * @param  string $mime file mime type
     *
     * @return string|false
     * @throws ImagickException
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function _dimensions($path, $mime)
    {
        $ret = false;
        if ($imgsize = $this->getImageSize($path, $mime)) {
            $ret = array('dim' => $imgsize['dimensions']);
            if (!empty($imgsize['url'])) {
                $ret['url'] = $imgsize['url'];
            }
        }
        return $ret;
    }

    /******************** file/dir content *********************/

    /**
     * Return files list in directory.
     *
     * @param  string $path dir path
     *
     * @return array
     * @author Dmitry (dio) Levashov
     * @author Cem (DiscoFever)
     **/
    protected function _scandir($path)
    {
        $files = array();

        foreach ($this->ftpRawList($path) as $str) {
            if (($stat = $this->parseRaw($str, $path, true))) {
                $files[] = $this->_joinPath($path, $stat['name']);
            }
        }

        return $files;
    }

    /**
     * Open file and return file pointer
     *
     * @param  string $path file path
     * @param string  $mode
     *
     * @return false|resource
     * @throws elFinderAbortException
     * @internal param bool $write open file for writing
     * @author   Dmitry (dio) Levashov
     */
    protected function _fopen($path, $mode = 'rb')
    {
        // try ftp stream wrapper
        if ($this->options['mode'] === 'passive' && ini_get('allow_url_fopen')) {
            $url = ($this->isFTPS ? 'ftps' : 'ftp') . '://' . $this->options['user'] . ':' . $this->options['pass'] . '@' . $this->options['host'] . ':' . $this->options['port'] . $path;
            if (strtolower($mode[0]) === 'w') {
                $context = stream_context_create(array('ftp' => array('overwrite' => true)));
                $fp = fopen($url, $mode, false, $context);
            } else {
                $fp = fopen($url, $mode);
            }
            if ($fp) {
                return $fp;
            }
        }

        if ($this->tmp) {
            $local = $this->getTempFile($path);
            $fp = fopen($local, 'wb');
            $ret = ftp_nb_fget($this->connect, $fp, $path, FTP_BINARY);
            while ($ret === FTP_MOREDATA) {
                elFinder::extendTimeLimit();
                $ret = ftp_nb_continue($this->connect);
            }
            if ($ret === FTP_FINISHED) {
                fclose($fp);
                $fp = fopen($local, $mode);
                return $fp;
            }
            fclose($fp);
            is_file($local) && unlink($local);
        }

        return false;
    }

    /**
     * Close opened file
     *
     * @param  resource $fp file pointer
     * @param string    $path
     *
     * @return void
     * @author Dmitry (dio) Levashov
     */
    protected function _fclose($fp, $path = '')
    {
        is_resource($fp) && fclose($fp);
        if ($path) {
            unlink($this->getTempFile($path));
        }
    }

    /********************  file/dir manipulations *************************/

    /**
     * Create dir and return created dir path or false on failed
     *
     * @param  string $path parent dir path
     * @param string  $name new directory name
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _mkdir($path, $name)
    {
        $path = $this->_joinPath($path, $name);
        if (ftp_mkdir($this->connect, $path) === false) {
            return false;
        }

        $this->options['dirMode'] && ftp_chmod($this->connect, $this->options['dirMode'], $path);
        return $path;
    }

    /**
     * Create file and return it's path or false on failed
     *
     * @param  string $path parent dir path
     * @param string  $name new file name
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _mkfile($path, $name)
    {
        if ($this->tmp) {
            $path = $this->_joinPath($path, $name);
            $local = $this->getTempFile();
            $res = touch($local) && ftp_put($this->connect, $path, $local, FTP_ASCII);
            unlink($local);
            return $res ? $path : false;
        }
        return false;
    }

    /**
     * Create symlink. FTP driver does not support symlinks.
     *
     * @param  string $target link target
     * @param  string $path   symlink path
     * @param string  $name
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     */
    protected function _symlink($target, $path, $name)
    {
        return false;
    }

    /**
     * Copy file into another file
     *
     * @param  string $source    source file path
     * @param  string $targetDir target directory path
     * @param  string $name      new file name
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _copy($source, $targetDir, $name)
    {
        $res = false;

        if ($this->tmp) {
            $local = $this->getTempFile();
            $target = $this->_joinPath($targetDir, $name);

            if (ftp_get($this->connect, $local, $source, FTP_BINARY)
                && ftp_put($this->connect, $target, $local, $this->ftpMode($target))) {
                $res = $target;
            }
            unlink($local);
        }

        return $res;
    }

    /**
     * Move file into another parent dir.
     * Return new file path or false.
     *
     * @param  string $source source file path
     * @param         $targetDir
     * @param  string $name   file name
     *
     * @return bool|string
     * @internal param string $target target dir path
     * @author   Dmitry (dio) Levashov
     */
    protected function _move($source, $targetDir, $name)
    {
        $target = $this->_joinPath($targetDir, $name);
        return ftp_rename($this->connect, $source, $target) ? $target : false;
    }

    /**
     * Remove file
     *
     * @param  string $path file path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _unlink($path)
    {
        return ftp_delete($this->connect, $path);
    }

    /**
     * Remove dir
     *
     * @param  string $path dir path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _rmdir($path)
    {
        return ftp_rmdir($this->connect, $path);
    }

    /**
     * Create new file and write into it from file pointer.
     * Return new file path or false on error.
     *
     * @param  resource $fp   file pointer
     * @param  string   $dir  target dir path
     * @param  string   $name file name
     * @param  array    $stat file stat (required by some virtual fs)
     *
     * @return bool|string
     * @author Dmitry (dio) Levashov
     **/
    protected function _save($fp, $dir, $name, $stat)
    {
        $path = $this->_joinPath($dir, $name);
        return ftp_fput($this->connect, $path, $fp, $this->ftpMode($path))
            ? $path
            : false;
    }

    /**
     * Get file contents
     *
     * @param  string $path file path
     *
     * @return string|false
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function _getContents($path)
    {
        $contents = '';
        if (($fp = $this->_fopen($path))) {
            while (!feof($fp)) {
                $contents .= fread($fp, 8192);
            }
            $this->_fclose($fp, $path);
            return $contents;
        }
        return false;
    }

    /**
     * Write a string to a file
     *
     * @param  string $path    file path
     * @param  string $content new file content
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _filePutContents($path, $content)
    {
        $res = false;

        if ($this->tmp) {
            $local = $this->getTempFile();

            if (file_put_contents($local, $content, LOCK_EX) !== false
                && ($fp = fopen($local, 'rb'))) {
                $file = $this->stat($this->convEncOut($path, false));
                if (!empty($file['thash'])) {
                    $path = $this->decode($file['thash']);
                }
                clearstatcache();
                $res = ftp_fput($this->connect, $path, $fp, $this->ftpMode($path));
                fclose($fp);
            }
            file_exists($local) && unlink($local);
        }

        return $res;
    }

    /**
     * Detect available archivers
     *
     * @return void
     * @throws elFinderAbortException
     */
    protected function _checkArchivers()
    {
        $this->archivers = $this->getArchivers();
        return;
    }

    /**
     * chmod availability
     *
     * @param string $path
     * @param string $mode
     *
     * @return bool
     */
    protected function _chmod($path, $mode)
    {
        $modeOct = is_string($mode) ? octdec($mode) : octdec(sprintf("%04o", $mode));
        return ftp_chmod($this->connect, $modeOct, $path);
    }

    /**
     * Extract files from archive
     *
     * @param  string $path archive path
     * @param  array  $arc  archiver command and arguments (same as in $this->archivers)
     *
     * @return true
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov,
     * @author Alexey Sukhotin
     */
    protected function _extract($path, $arc)
    {
        $dir = $this->tempDir();
        if (!$dir) {
            return false;
        }

        $basename = $this->_basename($path);
        $localPath = $dir . DIRECTORY_SEPARATOR . $basename;

        if (!ftp_get($this->connect, $localPath, $path, FTP_BINARY)) {
            //cleanup
            $this->rmdirRecursive($dir);
            return false;
        }

        $this->unpackArchive($localPath, $arc);

        $this->archiveSize = 0;

        // find symlinks and check extracted items
        $checkRes = $this->checkExtractItems($dir);
        if ($checkRes['symlinks']) {
            $this->rmdirRecursive($dir);
            return $this->setError(array_merge($this->error, array(elFinder::ERROR_ARC_SYMLINKS)));
        }
        $this->archiveSize = $checkRes['totalSize'];
        if ($checkRes['rmNames']) {
            foreach ($checkRes['rmNames'] as $name) {
                $this->addError(elFinder::ERROR_SAVE, $name);
            }
        }

        $filesToProcess = self::listFilesInDirectory($dir, true);

        // no files - extract error ?
        if (empty($filesToProcess)) {
            $this->rmdirRecursive($dir);
            return false;
        }

        // check max files size
        if ($this->options['maxArcFilesSize'] > 0 && $this->options['maxArcFilesSize'] < $this->archiveSize) {
            $this->rmdirRecursive($dir);
            return $this->setError(elFinder::ERROR_ARC_MAXSIZE);
        }

        $extractTo = $this->extractToNewdir; // 'auto', ture or false

        // archive contains one item - extract in archive dir
        $name = '';
        $src = $dir . DIRECTORY_SEPARATOR . $filesToProcess[0];
        if (($extractTo === 'auto' || !$extractTo) && count($filesToProcess) === 1 && is_file($src)) {
            $name = $filesToProcess[0];
        } else if ($extractTo === 'auto' || $extractTo) {
            // for several files - create new directory
            // create unique name for directory
            $src = $dir;
            $splits = elFinder::splitFileExtention(basename($path));
            $name = $splits[0];
            $test = $this->_joinPath(dirname($path), $name);
            if ($this->stat($test)) {
                $name = $this->uniqueName(dirname($path), $name, '-', false);
            }
        }

        if ($name !== '' && is_file($src)) {
            $result = $this->_joinPath(dirname($path), $name);

            if (!ftp_put($this->connect, $result, $src, FTP_BINARY)) {
                $this->rmdirRecursive($dir);
                return false;
            }
        } else {
            $dstDir = $this->_dirname($path);
            $result = array();
            if (is_dir($src) && $name) {
                $target = $this->_joinPath($dstDir, $name);
                $_stat = $this->_stat($target);
                if ($_stat) {
                    if (!$this->options['copyJoin']) {
                        if ($_stat['mime'] === 'directory') {
                            $this->delTree($target);
                        } else {
                            $this->_unlink($target);
                        }
                        $_stat = false;
                    } else {
                        $dstDir = $target;
                    }
                }
                if (!$_stat && (!$dstDir = $this->_mkdir($dstDir, $name))) {
                    $this->rmdirRecursive($dir);
                    return false;
                }
                $result[] = $dstDir;
            }
            foreach ($filesToProcess as $name) {
                $name = rtrim($name, DIRECTORY_SEPARATOR);
                $src = $dir . DIRECTORY_SEPARATOR . $name;
                if (is_dir($src)) {
                    $p = dirname($name);
                    if ($p === '.') {
                        $p = '';
                    }
                    $name = basename($name);
                    $target = $this->_joinPath($this->_joinPath($dstDir, $p), $name);
                    $_stat = $this->_stat($target);
                    if ($_stat) {
                        if (!$this->options['copyJoin']) {
                            if ($_stat['mime'] === 'directory') {
                                $this->delTree($target);
                            } else {
                                $this->_unlink($target);
                            }
                            $_stat = false;
                        }
                    }
                    if (!$_stat && (!$target = $this->_mkdir($this->_joinPath($dstDir, $p), $name))) {
                        $this->rmdirRecursive($dir);
                        return false;
                    }
                } else {
                    $target = $this->_joinPath($dstDir, $name);
                    if (!ftp_put($this->connect, $target, $src, FTP_BINARY)) {
                        $this->rmdirRecursive($dir);
                        return false;
                    }
                }
                $result[] = $target;
            }
            if (!$result) {
                $this->rmdirRecursive($dir);
                return false;
            }
        }

        is_dir($dir) && $this->rmdirRecursive($dir);

        $this->clearcache();
        return $result ? $result : false;
    }

    /**
     * Create archive and return its path
     *
     * @param  string $dir   target dir
     * @param  array  $files files names list
     * @param  string $name  archive name
     * @param  array  $arc   archiver options
     *
     * @return string|bool
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov,
     * @author Alexey Sukhotin
     */
    protected function _archive($dir, $files, $name, $arc)
    {
        // get current directory
        $cwd = getcwd();

        $tmpDir = $this->tempDir();
        if (!$tmpDir) {
            return false;
        }

        //download data
        if (!$this->ftp_download_files($dir, $files, $tmpDir)) {
            //cleanup
            $this->rmdirRecursive($tmpDir);
            return false;
        }

        $remoteArchiveFile = false;
        if ($path = $this->makeArchive($tmpDir, $files, $name, $arc)) {
            $remoteArchiveFile = $this->_joinPath($dir, $name);
            if (!ftp_put($this->connect, $remoteArchiveFile, $path, FTP_BINARY)) {
                $remoteArchiveFile = false;
            }
        }

        //cleanup
        if (!$this->rmdirRecursive($tmpDir)) {
            return false;
        }

        return $remoteArchiveFile;
    }

    /**
     * Create writable temporary directory and return path to it.
     *
     * @return string path to the new temporary directory or false in case of error.
     */
    private function tempDir()
    {
        $tempPath = tempnam($this->tmp, 'elFinder');
        if (!$tempPath) {
            $this->setError(elFinder::ERROR_CREATING_TEMP_DIR, $this->tmp);
            return false;
        }
        $success = unlink($tempPath);
        if (!$success) {
            $this->setError(elFinder::ERROR_CREATING_TEMP_DIR, $this->tmp);
            return false;
        }
        $success = mkdir($tempPath, 0700, true);
        if (!$success) {
            $this->setError(elFinder::ERROR_CREATING_TEMP_DIR, $this->tmp);
            return false;
        }
        return $tempPath;
    }

    /**
     * Gets an array of absolute remote FTP paths of files and
     * folders in $remote_directory omitting symbolic links.
     *
     * @param $remote_directory string remote FTP path to scan for file and folders recursively
     * @param $targets          array  Array of target item. `null` is to get all of items
     *
     * @return array of elements each of which is an array of two elements:
     * <ul>
     * <li>$item['path'] - absolute remote FTP path</li>
     * <li>$item['type'] - either 'f' for file or 'd' for directory</li>
     * </ul>
     */
    protected function ftp_scan_dir($remote_directory, $targets = null)
    {
        $buff = $this->ftpRawList($remote_directory);
        $items = array();
        if ($targets && is_array($targets)) {
            $targets = array_flip($targets);
        } else {
            $targets = false;
        }
        foreach ($buff as $str) {
            $info = preg_split("/\s+/", $str, 9);
            if (!isset($this->ftpOsUnix)) {
                $this->ftpOsUnix = !preg_match('/\d/', substr($info[0], 0, 1));
            }
            if (!$this->ftpOsUnix) {
                $info = $this->normalizeRawWindows($str);
            }
            $type = substr($info[0], 0, 1);
            $name = trim($info[8]);
            if ($name !== '.' && $name !== '..' && (!$targets || isset($targets[$name]))) {
                switch ($type) {
                    case 'l' : //omit symbolic links
                    case 'd' :
                        $remote_file_path = $this->_joinPath($remote_directory, $name);
                        $item = array();
                        $item['path'] = $remote_file_path;
                        $item['type'] = 'd'; // normal file
                        $items[] = $item;
                        $items = array_merge($items, $this->ftp_scan_dir($remote_file_path));
                        break;
                    default:
                        $remote_file_path = $this->_joinPath($remote_directory, $name);
                        $item = array();
                        $item['path'] = $remote_file_path;
                        $item['type'] = 'f'; // normal file
                        $items[] = $item;
                }
            }
        }
        return $items;
    }

    /**
     * Downloads specified files from remote directory
     * if there is a directory among files it is downloaded recursively (omitting symbolic links).
     *
     * @param       $remote_directory     string remote FTP path to a source directory to download from.
     * @param array $files                list of files to download from remote directory.
     * @param       $dest_local_directory string destination folder to store downloaded files.
     *
     * @return bool true on success and false on failure.
     */
    private function ftp_download_files($remote_directory, array $files, $dest_local_directory)
    {
        $contents = $this->ftp_scan_dir($remote_directory, $files);
        if (!isset($contents)) {
            $this->setError(elFinder::ERROR_FTP_DOWNLOAD_FILE, $remote_directory);
            return false;
        }
        $remoteDirLen = strlen($remote_directory);
        foreach ($contents as $item) {
            $relative_path = substr($item['path'], $remoteDirLen);
            $local_path = $dest_local_directory . DIRECTORY_SEPARATOR . $relative_path;
            switch ($item['type']) {
                case 'd':
                    $success = mkdir($local_path);
                    break;
                case 'f':
                    $success = ftp_get($this->connect, $local_path, $item['path'], FTP_BINARY);
                    break;
                default:
                    $success = true;
            }
            if (!$success) {
                $this->setError(elFinder::ERROR_FTP_DOWNLOAD_FILE, $remote_directory);
                return false;
            }
        }
        return true;
    }

    /**
     * Delete local directory recursively.
     *
     * @param $dirPath string to directory to be erased.
     *
     * @return bool true on success and false on failure.
     * @throws Exception
     */
    private function deleteDir($dirPath)
    {
        if (!is_dir($dirPath)) {
            $success = unlink($dirPath);
        } else {
            $success = true;
            foreach (array_reverse(elFinderVolumeFTP::listFilesInDirectory($dirPath, false)) as $path) {
                $path = $dirPath . DIRECTORY_SEPARATOR . $path;
                if (is_link($path)) {
                    unlink($path);
                } else if (is_dir($path)) {
                    $success = rmdir($path);
                } else {
                    $success = unlink($path);
                }
                if (!$success) {
                    break;
                }
            }
            if ($success) {
                $success = rmdir($dirPath);
            }
        }
        if (!$success) {
            $this->setError(elFinder::ERROR_RM, $dirPath);
            return false;
        }
        return $success;
    }

    /**
     * Returns array of strings containing all files and folders in the specified local directory.
     *
     * @param        $dir
     * @param        $omitSymlinks
     * @param string $prefix
     *
     * @return array array of files and folders names relative to the $path
     * or an empty array if the directory $path is empty,
     * <br />
     * false if $path is not a directory or does not exist.
     * @throws Exception
     * @internal param string $path path to directory to scan.
     */
    private static function listFilesInDirectory($dir, $omitSymlinks, $prefix = '')
    {
        if (!is_dir($dir)) {
            return false;
        }
        $excludes = array(".", "..");
        $result = array();
        $files = self::localScandir($dir);
        if (!$files) {
            return array();
        }
        foreach ($files as $file) {
            if (!in_array($file, $excludes)) {
                $path = $dir . DIRECTORY_SEPARATOR . $file;
                if (is_link($path)) {
                    if ($omitSymlinks) {
                        continue;
                    } else {
                        $result[] = $prefix . $file;
                    }
                } else if (is_dir($path)) {
                    $result[] = $prefix . $file . DIRECTORY_SEPARATOR;
                    $subs = elFinderVolumeFTP::listFilesInDirectory($path, $omitSymlinks, $prefix . $file . DIRECTORY_SEPARATOR);
                    if ($subs) {
                        $result = array_merge($result, $subs);
                    }

                } else {
                    $result[] = $prefix . $file;
                }
            }
        }
        return $result;
    }

} // END class
php/elFinderConnector.class.php000064400000030746151215013420012557 0ustar00<?php

/**
 * Default elFinder connector
 *
 * @author Dmitry (dio) Levashov
 **/
class elFinderConnector
{
    /**
     * elFinder instance
     *
     * @var elFinder
     **/
    protected $elFinder;

    /**
     * Options
     *
     * @var array
     **/
    protected $options = array();

    /**
     * Must be use output($data) $data['header']
     *
     * @var string
     * @deprecated
     **/
    protected $header = '';

    /**
     * HTTP request method
     *
     * @var string
     */
    protected $reqMethod = '';

    /**
     * Content type of output JSON
     *
     * @var string
     */
    protected static $contentType = 'Content-Type: application/json; charset=utf-8';

    /**
     * Constructor
     *
     * @param      $elFinder
     * @param bool $debug
     *
     * @author Dmitry (dio) Levashov
     */
    public function __construct($elFinder, $debug = false)
    {

        $this->elFinder = $elFinder;
        $this->reqMethod = strtoupper($_SERVER["REQUEST_METHOD"]);
        if ($debug) {
            self::$contentType = 'Content-Type: text/plain; charset=utf-8';
        }
    }

    /**
     * Execute elFinder command and output result
     *
     * @return void
     * @throws Exception
     * @author Dmitry (dio) Levashov
     */
    public function run()
    {
        $isPost = $this->reqMethod === 'POST';
        $src = $isPost ? array_merge($_GET, $_POST) : $_GET;
        $maxInputVars = (!$src || isset($src['targets'])) ? ini_get('max_input_vars') : null;
        if ((!$src || $maxInputVars) && $rawPostData = file_get_contents('php://input')) {
            // for max_input_vars and supports IE XDomainRequest()
            $parts = explode('&', $rawPostData);
            if (!$src || $maxInputVars < count($parts)) {
                $src = array();
                foreach ($parts as $part) {
                    list($key, $value) = array_pad(explode('=', $part), 2, '');
                    $key = rawurldecode($key);
                    if (preg_match('/^(.+?)\[([^\[\]]*)\]$/', $key, $m)) {
                        $key = $m[1];
                        $idx = $m[2];
                        if (!isset($src[$key])) {
                            $src[$key] = array();
                        }
                        if ($idx) {
                            $src[$key][$idx] = rawurldecode($value);
                        } else {
                            $src[$key][] = rawurldecode($value);
                        }
                    } else {
                        $src[$key] = rawurldecode($value);
                    }
                }
                $_POST = $this->input_filter($src);
                $_REQUEST = $this->input_filter(array_merge_recursive($src, $_REQUEST));
            }
        }

        if (isset($src['targets']) && $this->elFinder->maxTargets && count($src['targets']) > $this->elFinder->maxTargets) {
            $this->output(array('error' => $this->elFinder->error(elFinder::ERROR_MAX_TARGTES)));
        }

        $cmd = isset($src['cmd']) ? $src['cmd'] : '';
        $args = array();

        if (!function_exists('json_encode')) {
            $error = $this->elFinder->error(elFinder::ERROR_CONF, elFinder::ERROR_CONF_NO_JSON);
            $this->output(array('error' => '{"error":["' . implode('","', $error) . '"]}', 'raw' => true));
        }

        if (!$this->elFinder->loaded()) {
            $this->output(array('error' => $this->elFinder->error(elFinder::ERROR_CONF, elFinder::ERROR_CONF_NO_VOL), 'debug' => $this->elFinder->mountErrors));
        }

        // telepat_mode: on
        if (!$cmd && $isPost) {
            $this->output(array('error' => $this->elFinder->error(elFinder::ERROR_UPLOAD, elFinder::ERROR_UPLOAD_TOTAL_SIZE), 'header' => 'Content-Type: text/html'));
        }
        // telepat_mode: off

        if (!$this->elFinder->commandExists($cmd)) {
            $this->output(array('error' => $this->elFinder->error(elFinder::ERROR_UNKNOWN_CMD)));
        }

        // collect required arguments to exec command
        $hasFiles = false;
        foreach ($this->elFinder->commandArgsList($cmd) as $name => $req) {
            if ($name === 'FILES') {
                if (isset($_FILES)) {
                    $hasFiles = true;
                } elseif ($req) {
                    $this->output(array('error' => $this->elFinder->error(elFinder::ERROR_INV_PARAMS, $cmd)));
                }
            } else {
                $arg = isset($src[$name]) ? $src[$name] : '';

                if (!is_array($arg) && $req !== '') {
                    $arg = trim($arg);
                }
                if ($req && $arg === '') {
                    $this->output(array('error' => $this->elFinder->error(elFinder::ERROR_INV_PARAMS, $cmd)));
                }
                $args[$name] = $arg;
            }
        }

        $args['debug'] = isset($src['debug']) ? !!$src['debug'] : false;

        $args = $this->input_filter($args);
        if ($hasFiles) {
            $args['FILES'] = $_FILES;
        }

        try {
            $this->output($this->elFinder->exec($cmd, $args));
        } catch (elFinderAbortException $e) {
            // connection aborted
            // unlock session data for multiple access
            $this->elFinder->getSession()->close();
            // HTTP response code
            header('HTTP/1.0 204 No Content');
            // clear output buffer
            while (ob_get_level() && ob_end_clean()) {
            }
            exit();
        }
    }

    /**
     * Sets the header.
     *
     * @param array|string  $value HTTP header(s)
     */
    public function setHeader($value)
    {
        $this->header = $value;
    }

    /**
     * Output json
     *
     * @param  array  data to output
     *
     * @return void
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function output(array $data)
    {
        // unlock session data for multiple access
        $this->elFinder->getSession()->close();
        // client disconnect should abort
        ignore_user_abort(false);

        if ($this->header) {
            self::sendHeader($this->header);
        }

        if (isset($data['pointer'])) {
            // set time limit to 0
            elFinder::extendTimeLimit(0);

            // send optional header
            if (!empty($data['header'])) {
                self::sendHeader($data['header']);
            }

            // clear output buffer
            while (ob_get_level() && ob_end_clean()) {
            }

            $toEnd = true;
            $fp = $data['pointer'];
            $sendData = !($this->reqMethod === 'HEAD' || !empty($data['info']['xsendfile']));
            $psize = null;
            if (($this->reqMethod === 'GET' || !$sendData)
                && (elFinder::isSeekableStream($fp) || elFinder::isSeekableUrl($fp))
                && (array_search('Accept-Ranges: none', headers_list()) === false)) {
                header('Accept-Ranges: bytes');
                if (!empty($_SERVER['HTTP_RANGE'])) {
                    $size = $data['info']['size'];
                    $end = $size - 1;
                    if (preg_match('/bytes=(\d*)-(\d*)(,?)/i', $_SERVER['HTTP_RANGE'], $matches)) {
                        if (empty($matches[3])) {
                            if (empty($matches[1]) && $matches[1] !== '0') {
                                $start = $size - $matches[2];
                            } else {
                                $start = intval($matches[1]);
                                if (!empty($matches[2])) {
                                    $end = intval($matches[2]);
                                    if ($end >= $size) {
                                        $end = $size - 1;
                                    }
                                    $toEnd = ($end == ($size - 1));
                                }
                            }
                            $psize = $end - $start + 1;

                            header('HTTP/1.1 206 Partial Content');
                            header('Content-Length: ' . $psize);
                            header('Content-Range: bytes ' . $start . '-' . $end . '/' . $size);

                            // Apache mod_xsendfile dose not support range request
                            if (isset($data['info']['xsendfile']) && strtolower($data['info']['xsendfile']) === 'x-sendfile') {
                                if (function_exists('header_remove')) {
                                    header_remove($data['info']['xsendfile']);
                                } else {
                                    header($data['info']['xsendfile'] . ':');
                                }
                                unset($data['info']['xsendfile']);
                                if ($this->reqMethod !== 'HEAD') {
                                    $sendData = true;
                                }
                            }

                            $sendData && !elFinder::isSeekableUrl($fp) && fseek($fp, $start);
                        }
                    }
                }
                if ($sendData && is_null($psize)) {
                    elFinder::rewind($fp);
                }
            } else {
                header('Accept-Ranges: none');
                if (isset($data['info']) && !$data['info']['size']) {
                    if (function_exists('header_remove')) {
                        header_remove('Content-Length');
                    } else {
                        header('Content-Length:');
                    }
                }
            }

            if ($sendData) {
                if ($toEnd || elFinder::isSeekableUrl($fp)) {
                    // PHP < 5.6 has a bug of fpassthru
                    // see https://bugs.php.net/bug.php?id=66736
                    if (version_compare(PHP_VERSION, '5.6', '<')) {
                        file_put_contents('php://output', $fp);
                    } else {
                        if(function_exists('fpassthru')) {
                            fpassthru($fp);
                        } else {
                            file_put_contents('php://output', $fp);
                        }
                    }
                } else {
                    $out = fopen('php://output', 'wb');
                    stream_copy_to_stream($fp, $out, $psize);
                    fclose($out);
                }
            }

            if (!empty($data['volume'])) {
                $data['volume']->close($fp, $data['info']['hash']);
            } else {
                fclose($fp);
            }
            exit();
        } else {
            self::outputJson($data);
            exit(0);
        }
    }

    /**
     * Remove null & stripslashes applies on "magic_quotes_gpc"
     *
     * @param  mixed $args
     *
     * @return mixed
     * @author Naoki Sawada
     */
    protected function input_filter($args)
    {
        static $magic_quotes_gpc = NULL;

        if ($magic_quotes_gpc === NULL)
            $magic_quotes_gpc = (version_compare(PHP_VERSION, '5.4', '<') && get_magic_quotes_gpc());

        if (is_array($args)) {
            return array_map(array(& $this, 'input_filter'), $args);
        }
        $res = str_replace("\0", '', $args);
        $magic_quotes_gpc && ($res = stripslashes($res));
        $res = stripslashes($res);
        return $res;
    }

    /**
     * Send HTTP header
     *
     * @param string|array $header optional header
     */
    protected static function sendHeader($header = null)
    {
        if ($header) {
            if (is_array($header)) {
                foreach ($header as $h) {
                    header($h);
                }
            } else {
                header($header);
            }
        }
    }

    /**
     * Output JSON
     *
     * @param array $data
     */
    public static function outputJson($data)
    {
        // send header
        $header = isset($data['header']) ? $data['header'] : self::$contentType;
        self::sendHeader($header);

        unset($data['header']);

        if (!empty($data['raw']) && isset($data['error'])) {
            $out = $data['error'];
        } else {
            if (isset($data['debug']) && isset($data['debug']['backendErrors'])) {
                $data['debug']['backendErrors'] = array_merge($data['debug']['backendErrors'], elFinder::$phpErrors);
            }
            $out = json_encode($data);
        }

        // clear output buffer
        while (ob_get_level() && ob_end_clean()) {
        }

        header('Content-Length: ' . strlen($out));

        echo $out;

        flush();
    }
}// END class 
php/libs/GdBmp.php000064400000047332151215013420007771 0ustar00<?php
/**
 * Copyright (c) 2011, oov. All rights reserved.
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 *  - Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 *  - Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 *  - Neither the name of the oov nor the names of its contributors may be used to
 *    endorse or promote products derived from this software without specific prior
 *    written permission.
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 * bmp ファイルを GD で使えるように
 * 使用例:
 *   //ファイルから読み込む場合はGDでPNGなどを読み込むのと同じような方法で可
 *   $image = imagecreatefrombmp("test.bmp");
 *   imagedestroy($image);
 *   //文字列から読み込む場合は以下の方法で可
 *   $image = GdBmp::loadFromString(file_get_contents("test.bmp"));
 *   //自動判定されるので破損ファイルでなければこれでも上手くいく
 *   //$image = imagecreatefrombmp(file_get_contents("test.bmp"));
 *   imagedestroy($image);
 *   //その他任意のストリームからの読み込みも可能
 *   $stream = fopen("http://127.0.0.1/test.bmp");
 *   $image = GdBmp::loadFromStream($stream);
 *   //自動判定されるのでこれでもいい
 *   //$image = imagecreatefrombmp($stream);
 *   fclose($stream);
 *   imagedestroy($image);
 * 対応フォーマット
 *   1bit
 *   4bit
 *   4bitRLE
 *   8bit
 *   8bitRLE
 *   16bit(任意のビットフィールド)
 *   24bit
 *   32bit(任意のビットフィールド)
 *   BITMAPINFOHEADER の biCompression が BI_PNG / BI_JPEG の画像
 *   すべての形式でトップダウン/ボトムアップの両方をサポート
 *   特殊なビットフィールドでもビットフィールドデータが正常なら読み込み可能
 * 以下のものは非対応
 *   BITMAPV4HEADER と BITMAPV5HEADER に含まれる色空間に関する様々な機能
 *
 * @param $filename_or_stream_or_binary
 *
 * @return bool|resource
 */

if (!function_exists('imagecreatefrombmp')) {
    function imagecreatefrombmp($filename_or_stream_or_binary)
    {
        return elFinderLibGdBmp::load($filename_or_stream_or_binary);
    }
}

class elFinderLibGdBmp
{
    public static function load($filename_or_stream_or_binary)
    {
        if (is_resource($filename_or_stream_or_binary)) {
            return self::loadFromStream($filename_or_stream_or_binary);
        } else if (is_string($filename_or_stream_or_binary) && strlen($filename_or_stream_or_binary) >= 26) {
            $bfh = unpack("vtype/Vsize", $filename_or_stream_or_binary);
            if ($bfh["type"] == 0x4d42 && ($bfh["size"] == 0 || $bfh["size"] == strlen($filename_or_stream_or_binary))) {
                return self::loadFromString($filename_or_stream_or_binary);
            }
        }
        return self::loadFromFile($filename_or_stream_or_binary);
    }

    public static function loadFromFile($filename)
    {
        $fp = fopen($filename, "rb");
        if ($fp === false) {
            return false;
        }

        $bmp = self::loadFromStream($fp);

        fclose($fp);
        return $bmp;
    }

    public static function loadFromString($str)
    {
        //data scheme より古いバージョンから対応しているようなので php://memory を使う
        $fp = fopen("php://memory", "r+b");
        if ($fp === false) {
            return false;
        }

        if (fwrite($fp, $str) != strlen($str)) {
            fclose($fp);
            return false;
        }

        if (fseek($fp, 0) === -1) {
            fclose($fp);
            return false;
        }

        $bmp = self::loadFromStream($fp);

        fclose($fp);
        return $bmp;
    }

    public static function loadFromStream($stream)
    {
        $buf = fread($stream, 14); //2+4+2+2+4
        if ($buf === false) {
            return false;
        }

        //シグネチャチェック
        if ($buf[0] != 'B' || $buf[1] != 'M') {
            return false;
        }

        $bitmap_file_header = unpack(
        //BITMAPFILEHEADER構造体
            "vtype/" .
            "Vsize/" .
            "vreserved1/" .
            "vreserved2/" .
            "Voffbits", $buf
        );

        return self::loadFromStreamAndFileHeader($stream, $bitmap_file_header);
    }

    public static function loadFromStreamAndFileHeader($stream, array $bitmap_file_header)
    {
        if ($bitmap_file_header["type"] != 0x4d42) {
            return false;
        }

        //情報ヘッダサイズを元に形式を区別して読み込み
        $buf = fread($stream, 4);
        if ($buf === false) {
            return false;
        }
        list(, $header_size) = unpack("V", $buf);


        if ($header_size == 12) {
            $buf = fread($stream, $header_size - 4);
            if ($buf === false) {
                return false;
            }

            extract(unpack(
            //BITMAPCOREHEADER構造体 - OS/2 Bitmap
                "vwidth/" .
                "vheight/" .
                "vplanes/" .
                "vbit_count", $buf
            ));
            //飛んでこない分は 0 で初期化しておく
            $clr_used = $clr_important = $alpha_mask = $compression = 0;

            //マスク類は初期化されないのでここで割り当てておく
            $red_mask = 0x00ff0000;
            $green_mask = 0x0000ff00;
            $blue_mask = 0x000000ff;
        } else if (124 < $header_size || $header_size < 40) {
            //未知の形式
            return false;
        } else {
            //この時点で36バイト読めることまではわかっている
            $buf = fread($stream, 36); //既に読んだ部分は除外しつつBITMAPINFOHEADERのサイズだけ読む
            if ($buf === false) {
                return false;
            }

            //BITMAPINFOHEADER構造体 - Windows Bitmap
            extract(unpack(
                "Vwidth/" .
                "Vheight/" .
                "vplanes/" .
                "vbit_count/" .
                "Vcompression/" .
                "Vsize_image/" .
                "Vx_pels_per_meter/" .
                "Vy_pels_per_meter/" .
                "Vclr_used/" .
                "Vclr_important", $buf
            ));
            /**
             * @var integer $width
             * @var integer $height
             * @var integer $planes
             * @var integer $bit_count
             * @var integer $compression
             * @var integer $size_image
             * @var integer $x_pels_per_meter
             * @var integer $y_pels_per_meter
             * @var integer $clr_used
             * @var integer $clr_important
             */
            //負の整数を受け取る可能性があるものは自前で変換する
            if ($width & 0x80000000) {
                $width = -(~$width & 0xffffffff) - 1;
            }
            if ($height & 0x80000000) {
                $height = -(~$height & 0xffffffff) - 1;
            }
            if ($x_pels_per_meter & 0x80000000) {
                $x_pels_per_meter = -(~$x_pels_per_meter & 0xffffffff) - 1;
            }
            if ($y_pels_per_meter & 0x80000000) {
                $y_pels_per_meter = -(~$y_pels_per_meter & 0xffffffff) - 1;
            }

            //ファイルによっては BITMAPINFOHEADER のサイズがおかしい(書き込み間違い?)ケースがある
            //自分でファイルサイズを元に逆算することで回避できることもあるので再計算できそうなら正当性を調べる
            //シークできないストリームの場合全体のファイルサイズは取得できないので、$bitmap_file_headerにサイズ申告がなければやらない
            if ($bitmap_file_header["size"] != 0) {
                $colorsize = $bit_count == 1 || $bit_count == 4 || $bit_count == 8 ? ($clr_used ? $clr_used : pow(2, $bit_count)) << 2 : 0;
                $bodysize = $size_image ? $size_image : ((($width * $bit_count + 31) >> 3) & ~3) * abs($height);
                $calcsize = $bitmap_file_header["size"] - $bodysize - $colorsize - 14;

                //本来であれば一致するはずなのに合わない時は、値がおかしくなさそうなら(BITMAPV5HEADERの範囲内なら)計算して求めた値を採用する
                if ($header_size < $calcsize && 40 <= $header_size && $header_size <= 124) {
                    $header_size = $calcsize;
                }
            }

            //BITMAPV4HEADER や BITMAPV5HEADER の場合まだ読むべきデータが残っている可能性がある
            if ($header_size - 40 > 0) {
                $buf = fread($stream, $header_size - 40);
                if ($buf === false) {
                    return false;
                }

                extract(unpack(
                //BITMAPV4HEADER構造体(Windows95以降)
                //BITMAPV5HEADER構造体(Windows98/2000以降)
                    "Vred_mask/" .
                    "Vgreen_mask/" .
                    "Vblue_mask/" .
                    "Valpha_mask", $buf . str_repeat("\x00", 120)
                ));
            } else {
                $alpha_mask = $red_mask = $green_mask = $blue_mask = 0;
            }

            //パレットがないがカラーマスクもない時
            if (
                ($bit_count == 16 || $bit_count == 24 || $bit_count == 32) &&
                $compression == 0 &&
                $red_mask == 0 && $green_mask == 0 && $blue_mask == 0
            ) {
                //もしカラーマスクを所持していない場合は
                //規定のカラーマスクを適用する
                switch ($bit_count) {
                    case 16:
                        $red_mask = 0x7c00;
                        $green_mask = 0x03e0;
                        $blue_mask = 0x001f;
                        break;
                    case 24:
                    case 32:
                        $red_mask = 0x00ff0000;
                        $green_mask = 0x0000ff00;
                        $blue_mask = 0x000000ff;
                        break;
                }
            }
        }

        if (
            ($width == 0) ||
            ($height == 0) ||
            ($planes != 1) ||
            (($alpha_mask & $red_mask) != 0) ||
            (($alpha_mask & $green_mask) != 0) ||
            (($alpha_mask & $blue_mask) != 0) ||
            (($red_mask & $green_mask) != 0) ||
            (($red_mask & $blue_mask) != 0) ||
            (($green_mask & $blue_mask) != 0)
        ) {
            //不正な画像
            return false;
        }

        //BI_JPEG と BI_PNG の場合は jpeg/png がそのまま入ってるだけなのでそのまま取り出してデコードする
        if ($compression == 4 || $compression == 5) {
            $buf = stream_get_contents($stream, $size_image);
            if ($buf === false) {
                return false;
            }
            return imagecreatefromstring($buf);
        }

        //画像本体の読み出し
        //1行のバイト数
        $line_bytes = (($width * $bit_count + 31) >> 3) & ~3;
        //全体の行数
        $lines = abs($height);
        //y軸進行量(ボトムアップかトップダウンか)
        $y = $height > 0 ? $lines - 1 : 0;
        $line_step = $height > 0 ? -1 : 1;

        //256色以下の画像か?
        if ($bit_count == 1 || $bit_count == 4 || $bit_count == 8) {
            $img = imagecreate($width, $lines);

            //画像データの前にパレットデータがあるのでパレットを作成する
            $palette_size = $header_size == 12 ? 3 : 4; //OS/2形式の場合は x に相当する箇所のデータは最初から確保されていない
            $colors = $clr_used ? $clr_used : pow(2, $bit_count); //色数
            $palette = array();
            for ($i = 0; $i < $colors; ++$i) {
                $buf = fread($stream, $palette_size);
                if ($buf === false) {
                    imagedestroy($img);
                    return false;
                }
                extract(unpack("Cb/Cg/Cr/Cx", $buf . "\x00"));
                /**
                 * @var integer $b
                 * @var integer $g
                 * @var integer $r
                 * @var integer $x
                 */
                $palette[] = imagecolorallocate($img, $r, $g, $b);
            }

            $shift_base = 8 - $bit_count;
            $mask = ((1 << $bit_count) - 1) << $shift_base;

            //圧縮されている場合とされていない場合でデコード処理が大きく変わる
            if ($compression == 1 || $compression == 2) {
                $x = 0;
                $qrt_mod2 = $bit_count >> 2 & 1;
                for (; ;) {
                    //もし描写先が範囲外になっている場合デコード処理がおかしくなっているので抜ける
                    //変なデータが渡されたとしても最悪なケースで255回程度の無駄なので目を瞑る
                    if ($x < -1 || $x > $width || $y < -1 || $y > $height) {
                        imagedestroy($img);
                        return false;
                    }
                    $buf = fread($stream, 1);
                    if ($buf === false) {
                        imagedestroy($img);
                        return false;
                    }
                    switch ($buf) {
                        case "\x00":
                            $buf = fread($stream, 1);
                            if ($buf === false) {
                                imagedestroy($img);
                                return false;
                            }
                            switch ($buf) {
                                case "\x00": //EOL
                                    $y += $line_step;
                                    $x = 0;
                                    break;
                                case "\x01": //EOB
                                    $y = 0;
                                    $x = 0;
                                    break 3;
                                case "\x02": //MOV
                                    $buf = fread($stream, 2);
                                    if ($buf === false) {
                                        imagedestroy($img);
                                        return false;
                                    }
                                    list(, $xx, $yy) = unpack("C2", $buf);
                                    $x += $xx;
                                    $y += $yy * $line_step;
                                    break;
                                default:     //ABS
                                    list(, $pixels) = unpack("C", $buf);
                                    $bytes = ($pixels >> $qrt_mod2) + ($pixels & $qrt_mod2);
                                    $buf = fread($stream, ($bytes + 1) & ~1);
                                    if ($buf === false) {
                                        imagedestroy($img);
                                        return false;
                                    }
                                    for ($i = 0, $pos = 0; $i < $pixels; ++$i, ++$x, $pos += $bit_count) {
                                        list(, $c) = unpack("C", $buf[$pos >> 3]);
                                        $b = $pos & 0x07;
                                        imagesetpixel($img, $x, $y, $palette[($c & ($mask >> $b)) >> ($shift_base - $b)]);
                                    }
                                    break;
                            }
                            break;
                        default:
                            $buf2 = fread($stream, 1);
                            if ($buf2 === false) {
                                imagedestroy($img);
                                return false;
                            }
                            list(, $size, $c) = unpack("C2", $buf . $buf2);
                            for ($i = 0, $pos = 0; $i < $size; ++$i, ++$x, $pos += $bit_count) {
                                $b = $pos & 0x07;
                                imagesetpixel($img, $x, $y, $palette[($c & ($mask >> $b)) >> ($shift_base - $b)]);
                            }
                            break;
                    }
                }
            } else {
                for ($line = 0; $line < $lines; ++$line, $y += $line_step) {
                    $buf = fread($stream, $line_bytes);
                    if ($buf === false) {
                        imagedestroy($img);
                        return false;
                    }

                    $pos = 0;
                    for ($x = 0; $x < $width; ++$x, $pos += $bit_count) {
                        list(, $c) = unpack("C", $buf[$pos >> 3]);
                        $b = $pos & 0x7;
                        imagesetpixel($img, $x, $y, $palette[($c & ($mask >> $b)) >> ($shift_base - $b)]);
                    }
                }
            }
        } else {
            $img = imagecreatetruecolor($width, $lines);
            imagealphablending($img, false);
            if ($alpha_mask) {
                //αデータがあるので透過情報も保存できるように
                imagesavealpha($img, true);
            }

            //x軸進行量
            $pixel_step = $bit_count >> 3;
            $alpha_max = $alpha_mask ? 0x7f : 0x00;
            $alpha_mask_r = $alpha_mask ? 1 / $alpha_mask : 1;
            $red_mask_r = $red_mask ? 1 / $red_mask : 1;
            $green_mask_r = $green_mask ? 1 / $green_mask : 1;
            $blue_mask_r = $blue_mask ? 1 / $blue_mask : 1;

            for ($line = 0; $line < $lines; ++$line, $y += $line_step) {
                $buf = fread($stream, $line_bytes);
                if ($buf === false) {
                    imagedestroy($img);
                    return false;
                }

                $pos = 0;
                for ($x = 0; $x < $width; ++$x, $pos += $pixel_step) {
                    list(, $c) = unpack("V", substr($buf, $pos, $pixel_step) . "\x00\x00");
                    $a_masked = $c & $alpha_mask;
                    $r_masked = $c & $red_mask;
                    $g_masked = $c & $green_mask;
                    $b_masked = $c & $blue_mask;
                    $a = $alpha_max - ((($a_masked << 7) - $a_masked) * $alpha_mask_r);
                    $r = (($r_masked << 8) - $r_masked) * $red_mask_r;
                    $g = (($g_masked << 8) - $g_masked) * $green_mask_r;
                    $b = (($b_masked << 8) - $b_masked) * $blue_mask_r;
                    imagesetpixel($img, $x, $y, ($a << 24) | ($r << 16) | ($g << 8) | $b);
                }
            }
            imagealphablending($img, true); //デフォルト値に戻しておく
        }
        return $img;
    }
}
php/elFinderVolumeBox.class.php000064400000170514151215013420012543 0ustar00<?php

/**
 * Simple elFinder driver for BoxDrive
 * Box.com API v2.0.
 *
 * @author Dmitry (dio) Levashov
 * @author Cem (discofever)
 **/
class elFinderVolumeBox extends elFinderVolumeDriver
{
    /**
     * Driver id
     * Must be started from letter and contains [a-z0-9]
     * Used as part of volume id.
     *
     * @var string
     **/
    protected $driverId = 'bd';

    /**
     * @var string The base URL for API requests
     */
    const API_URL = 'https://api.box.com/2.0';

    /**
     * @var string The base URL for authorization requests
     */
    const AUTH_URL = 'https://account.box.com/api/oauth2/authorize';

    /**
     * @var string The base URL for token requests
     */
    const TOKEN_URL = 'https://api.box.com/oauth2/token';

    /**
     * @var string The base URL for upload requests
     */
    const UPLOAD_URL = 'https://upload.box.com/api/2.0';

    /**
     * Fetch fields list.
     *
     * @var string
     */
    const FETCHFIELDS = 'type,id,name,created_at,modified_at,description,size,parent,permissions,file_version,shared_link';

    /**
     * Box.com token object.
     *
     * @var object
     **/
    protected $token = null;

    /**
     * Directory for tmp files
     * If not set driver will try to use tmbDir as tmpDir.
     *
     * @var string
     **/
    protected $tmp = '';

    /**
     * Net mount key.
     *
     * @var string
     **/
    public $netMountKey = '';

    /**
     * Thumbnail prefix.
     *
     * @var string
     **/
    private $tmbPrefix = '';

    /**
     * Path to access token file for permanent mount
     *
     * @var string
     */
    private $aTokenFile = '';

    /**
     * hasCache by folders.
     *
     * @var array
     **/
    protected $HasdirsCache = array();

    /**
     * Constructor
     * Extend options with required fields.
     *
     * @author Dmitry (dio) Levashov
     * @author Cem (DiscoFever)
     **/
    public function __construct()
    {
        $opts = array(
            'client_id' => '',
            'client_secret' => '',
            'accessToken' => '',
            'root' => 'Box.com',
            'path' => '/',
            'separator' => '/',
            'tmbPath' => '',
            'tmbURL' => '',
            'tmpPath' => '',
            'acceptedName' => '#^[^\\\/]+$#',
            'rootCssClass' => 'elfinder-navbar-root-box',
        );
        $this->options = array_merge($this->options, $opts);
        $this->options['mimeDetect'] = 'internal';
    }

    /*********************************************************************/
    /*                        ORIGINAL FUNCTIONS                         */
    /*********************************************************************/

    /**
     * Get Parent ID, Item ID, Parent Path as an array from path.
     *
     * @param string $path
     *
     * @return array
     */
    protected function _bd_splitPath($path)
    {
        $path = trim($path, '/');
        $pid = '';
        if ($path === '') {
            $id = '0';
            $parent = '';
        } else {
            $paths = explode('/', trim($path, '/'));
            $id = array_pop($paths);
            if ($paths) {
                $parent = '/' . implode('/', $paths);
                $pid = array_pop($paths);
            } else {
                $pid = '0';
                $parent = '/';
            }
        }

        return array($pid, $id, $parent);
    }

    /**
     * Obtains a new access token from OAuth. This token is valid for one hour.
     *
     * @param string $clientSecret The Box client secret
     * @param string $code         The code returned by Box after
     *                             successful log in
     * @param string $redirectUri  Must be the same as the redirect URI passed
     *                             to LoginUrl
     *
     * @return bool|object
     * @throws \Exception Thrown if this Client instance's clientId is not set
     * @throws \Exception Thrown if the redirect URI of this Client instance's
     *                    state is not set
     */
    protected function _bd_obtainAccessToken($client_id, $client_secret, $code)
    {
        if (null === $client_id) {
            return $this->setError('The client ID must be set to call obtainAccessToken()');
        }

        if (null === $client_secret) {
            return $this->setError('The client Secret must be set to call obtainAccessToken()');
        }

        if (null === $code) {
            return $this->setError('Authorization code must be set to call obtainAccessToken()');
        }

        $url = self::TOKEN_URL;

        $curl = curl_init();

        $fields = http_build_query(
            array(
                'client_id' => $client_id,
                'client_secret' => $client_secret,
                'code' => $code,
                'grant_type' => 'authorization_code',
            )
        );

        curl_setopt_array($curl, array(
            // General options.
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => $fields,
            CURLOPT_URL => $url,
        ));

        $decoded = $this->_bd_curlExec($curl, true, array('Content-Length: ' . strlen($fields)));

        $res = (object)array(
            'expires' => time() + $decoded->expires_in - 30,
            'initialToken' => '',
            'data' => $decoded
        );
        if (!empty($decoded->refresh_token)) {
            $res->initialToken = md5($client_id . $decoded->refresh_token);
        }
        return $res;
    }

    /**
     * Get token and auto refresh.
     *
     * @return true|string error message
     * @throws Exception
     */
    protected function _bd_refreshToken()
    {
        if (!property_exists($this->token, 'expires') || $this->token->expires < time()) {
            if (!$this->options['client_id']) {
                $this->options['client_id'] = ELFINDER_BOX_CLIENTID;
            }

            if (!$this->options['client_secret']) {
                $this->options['client_secret'] = ELFINDER_BOX_CLIENTSECRET;
            }

            if (empty($this->token->data->refresh_token)) {
                throw new \Exception(elFinder::ERROR_REAUTH_REQUIRE);
            } else {
                $refresh_token = $this->token->data->refresh_token;
                $initialToken = $this->_bd_getInitialToken();
            }

            $lock = '';
            $aTokenFile = $this->aTokenFile? $this->aTokenFile : $this->_bd_getATokenFile();
            if ($aTokenFile && is_file($aTokenFile)) {
                $lock = $aTokenFile . '.lock';
                if (file_exists($lock)) {
                    // Probably updating on other instance
                    return true;
                }
                touch($lock);
                $GLOBALS['elFinderTempFiles'][$lock] = true;
            }

            $postData = array(
                'client_id' => $this->options['client_id'],
                'client_secret' => $this->options['client_secret'],
                'grant_type' => 'refresh_token',
                'refresh_token' => $refresh_token
            );

            $url = self::TOKEN_URL;

            $curl = curl_init();

            curl_setopt_array($curl, array(
                // General options.
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_POST => true, // i am sending post data
                CURLOPT_POSTFIELDS => http_build_query($postData),
                CURLOPT_URL => $url,
            ));

            $decoded = $error = '';
            try {
                $decoded = $this->_bd_curlExec($curl, true, array(), $postData);
            } catch (Exception $e) {
                $error = $e->getMessage();
            }
            if (!$decoded && !$error) {
                $error = 'Tried to renew the access token, but did not get a response from the Box server.';
            }
            if ($error) {
                $lock && unlink($lock);
                throw new \Exception('Box access token update failed. ('.$error.') If this message appears repeatedly, please notify the administrator.');
            }

            if (empty($decoded->access_token)) {
                if ($aTokenFile) {
                    if (is_file($aTokenFile)) {
                        unlink($aTokenFile);
                    }
                }
                $err = property_exists($decoded, 'error')? ' ' . $decoded->error : '';
                $err .= property_exists($decoded, 'error_description')? ' ' . $decoded->error_description : '';
                throw new \Exception($err? $err : elFinder::ERROR_REAUTH_REQUIRE);
            }

            $token = (object)array(
                'expires' => time() + $decoded->expires_in - 300,
                'initialToken' => $initialToken,
                'data' => $decoded,
            );

            $this->token = $token;
            $json = json_encode($token);

            if (!empty($decoded->refresh_token)) {
                if (empty($this->options['netkey']) && $aTokenFile) {
                    file_put_contents($aTokenFile, json_encode($token), LOCK_EX);
                    $this->options['accessToken'] = $json;
                } else if (!empty($this->options['netkey'])) {
                    // OAuth2 refresh token can be used only once,
                    // so update it if it is the same as the token file
                    if ($aTokenFile && is_file($aTokenFile)) {
                        if ($_token = json_decode(file_get_contents($aTokenFile))) {
                            if ($_token->data->refresh_token === $refresh_token) {
                                file_put_contents($aTokenFile, $json, LOCK_EX);
                            }
                        }
                    }
                    $this->options['accessToken'] = $json;
                    // update session value
                    elFinder::$instance->updateNetVolumeOption($this->options['netkey'], 'accessToken', $json);
                    $this->session->set('BoxTokens', $token);
                } else {
                    throw new \Exception(ERROR_CREATING_TEMP_DIR);
                }
            }
            $lock && unlink($lock);
        }

        return true;
    }

    /**
     * Creates a base cURL object which is compatible with the Box.com API.
     *
     * @param array $options cURL options
     *
     * @return resource A compatible cURL object
     */
    protected function _bd_prepareCurl($options = array())
    {
        $curl = curl_init();

        $defaultOptions = array(
            // General options.
            CURLOPT_RETURNTRANSFER => true,
        );

        curl_setopt_array($curl, $options + $defaultOptions);

        return $curl;
    }

    /**
     * Creates a base cURL object which is compatible with the Box.com API.
     *
     * @param      $url
     * @param bool $contents
     *
     * @return boolean|array
     * @throws Exception
     */
    protected function _bd_fetch($url, $contents = false)
    {
        $curl = curl_init($url);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

        if ($contents) {
            return $this->_bd_curlExec($curl, false);
        } else {
            $result = $this->_bd_curlExec($curl);

            if (isset($result->entries)) {
                $res = $result->entries;
                $cnt = count($res);
                $total = $result->total_count;
                $offset = $result->offset;
                $single = ($result->limit == 1) ? true : false;
                if (!$single && $total > ($offset + $cnt)) {
                    $offset = $offset + $cnt;
                    if (strpos($url, 'offset=') === false) {
                        $url .= '&offset=' . $offset;
                    } else {
                        $url = preg_replace('/^(.+?offset=)\d+(.*)$/', '${1}' . $offset . '$2', $url);
                    }
                    $more = $this->_bd_fetch($url);
                    if (is_array($more)) {
                        $res = array_merge($res, $more);
                    }
                }

                return $res;
            } else {
                if (isset($result->type) && $result->type === 'error') {
                    return false;
                } else {
                    return $result;
                }
            }
        }
    }

    /**
     * Call curl_exec().
     *
     * @param resource    $curl
     * @param bool|string $decodeOrParent
     * @param array       $headers
     *
     * @throws \Exception
     * @return mixed
     */
    protected function _bd_curlExec($curl, $decodeOrParent = true, $headers = array(), $postData = array())
    {
        if ($this->token) {
            $headers = array_merge(array(
                'Authorization: Bearer ' . $this->token->data->access_token,
            ), $headers);
        }

        $result = elFinder::curlExec($curl, array(), $headers, $postData);

        if (!$decodeOrParent) {
            return $result;
        }

        $decoded = json_decode($result);

        if ($error = !empty($decoded->error_code)) {
            $errmsg = $decoded->error_code;
            if (!empty($decoded->message)) {
                $errmsg .= ': ' . $decoded->message;
            }
            throw new \Exception($errmsg);
        } else if ($error = !empty($decoded->error)) {
            $errmsg = $decoded->error;
            if (!empty($decoded->error_description)) {
                $errmsg .= ': ' . $decoded->error_description;
            }
            throw new \Exception($errmsg);
        }

        // make catch
        if ($decodeOrParent && $decodeOrParent !== true) {
            $raws = null;
            if (isset($decoded->entries)) {
                $raws = $decoded->entries;
            } elseif (isset($decoded->id)) {
                $raws = array($decoded);
            }
            if ($raws) {
                foreach ($raws as $raw) {
                    if (isset($raw->id)) {
                        $stat = $this->_bd_parseRaw($raw);
                        $itemPath = $this->_joinPath($decodeOrParent, $raw->id);
                        $this->updateCache($itemPath, $stat);
                    }
                }
            }
        }

        return $decoded;
    }

    /**
     * Drive query and fetchAll.
     *
     * @param      $itemId
     * @param bool $fetch_self
     * @param bool $recursive
     *
     * @return bool|object
     * @throws Exception
     */
    protected function _bd_query($itemId, $fetch_self = false, $recursive = false)
    {
        $result = [];

        if (null === $itemId) {
            $itemId = '0';
        }

        if ($fetch_self) {
            $path = '/folders/' . $itemId . '?fields=' . self::FETCHFIELDS;
        } else {
            $path = '/folders/' . $itemId . '/items?limit=1000&fields=' . self::FETCHFIELDS;
        }

        $url = self::API_URL . $path;

        if ($recursive) {
            foreach ($this->_bd_fetch($url) as $file) {
                if ($file->type == 'folder') {
                    $result[] = $file;
                    $result = array_merge($result, $this->_bd_query($file->id, $fetch_self = false, $recursive = true));
                } elseif ($file->type == 'file') {
                    $result[] = $file;
                }
            }
        } else {
            $result = $this->_bd_fetch($url);
            if ($fetch_self && !$result) {
                $path = '/files/' . $itemId . '?fields=' . self::FETCHFIELDS;
                $url = self::API_URL . $path;
                $result = $this->_bd_fetch($url);
            }
        }

        return $result;
    }

    /**
     * Get dat(box metadata) from Box.com.
     *
     * @param string $path
     *
     * @return object box metadata
     * @throws Exception
     */
    protected function _bd_getRawItem($path)
    {
        if ($path == '/') {
            return $this->_bd_query('0', $fetch_self = true);
        }

        list(, $itemId) = $this->_bd_splitPath($path);

        try {
            return $this->_bd_query($itemId, $fetch_self = true);
        } catch (Exception $e) {
            $empty = new stdClass;
            return $empty;
        }
    }

    /**
     * Parse line from box metadata output and return file stat (array).
     *
     * @param object $raw line from ftp_rawlist() output
     *
     * @return array
     * @author Dmitry Levashov
     **/
    protected function _bd_parseRaw($raw)
    {
        $stat = array();

        $stat['rev'] = isset($raw->id) ? $raw->id : 'root';
        $stat['name'] = $raw->name;
        if (!empty($raw->modified_at)) {
            $stat['ts'] = strtotime($raw->modified_at);
        }

        if ($raw->type === 'folder') {
            $stat['mime'] = 'directory';
            $stat['size'] = 0;
            $stat['dirs'] = -1;
        } else {
            $stat['size'] = (int)$raw->size;
            if (!empty($raw->shared_link->url) && $raw->shared_link->access == 'open') {
                if ($url = $this->getSharedWebContentLink($raw)) {
                    $stat['url'] = $url;
                }
            } elseif (!$this->disabledGetUrl) {
                $stat['url'] = '1';
            }
        }

        return $stat;
    }

    /**
     * Get thumbnail from Box.com.
     *
     * @param string $path
     * @param string $size
     *
     * @return string | boolean
     */
    protected function _bd_getThumbnail($path)
    {
        list(, $itemId) = $this->_bd_splitPath($path);

        try {
            $url = self::API_URL . '/files/' . $itemId . '/thumbnail.png?min_height=' . $this->tmbSize . '&min_width=' . $this->tmbSize;

            $contents = $this->_bd_fetch($url, true);
            return $contents;
        } catch (Exception $e) {
            return false;
        }
    }

    /**
     * Remove item.
     *
     * @param string $path file path
     *
     * @return bool
     **/
    protected function _bd_unlink($path, $type = null)
    {
        try {
            list(, $itemId) = $this->_bd_splitPath($path);

            if ($type == 'folders') {
                $url = self::API_URL . '/' . $type . '/' . $itemId . '?recursive=true';
            } else {
                $url = self::API_URL . '/' . $type . '/' . $itemId;
            }

            $curl = $this->_bd_prepareCurl(array(
                CURLOPT_URL => $url,
                CURLOPT_CUSTOMREQUEST => 'DELETE',
            ));

            //unlink or delete File or Folder in the Parent
            $this->_bd_curlExec($curl);
        } catch (Exception $e) {
            return $this->setError('Box error: ' . $e->getMessage());
        }

        return true;
    }

    /**
     * Get AccessToken file path
     *
     * @return string  ( description_of_the_return_value )
     */
    protected function _bd_getATokenFile()
    {
        $tmp = $aTokenFile = '';
        if (!empty($this->token->data->refresh_token)) {
            if (!$this->tmp) {
                $tmp = elFinder::getStaticVar('commonTempPath');
                if (!$tmp) {
                    $tmp = $this->getTempPath();
                }
                $this->tmp = $tmp;
            }
            if ($tmp) {
                $aTokenFile = $tmp . DIRECTORY_SEPARATOR . $this->_bd_getInitialToken() . '.btoken';
            }
        }
        return $aTokenFile;
    }

    /**
     * Get Initial Token (MD5 hash)
     *
     * @return string
     */
    protected function _bd_getInitialToken()
    {
        return (empty($this->token->initialToken)? md5($this->options['client_id'] . (!empty($this->token->data->refresh_token)? $this->token->data->refresh_token : $this->token->data->access_token)) : $this->token->initialToken);
    }

    /*********************************************************************/
    /*                        OVERRIDE FUNCTIONS                         */
    /*********************************************************************/

    /**
     * Prepare
     * Call from elFinder::netmout() before volume->mount().
     *
     * @return array
     * @author Naoki Sawada
     * @author Raja Sharma updating for Box
     **/
    public function netmountPrepare($options)
    {
        if (empty($options['client_id']) && defined('ELFINDER_BOX_CLIENTID')) {
            $options['client_id'] = ELFINDER_BOX_CLIENTID;
        }
        if (empty($options['client_secret']) && defined('ELFINDER_BOX_CLIENTSECRET')) {
            $options['client_secret'] = ELFINDER_BOX_CLIENTSECRET;
        }

        if (isset($options['pass']) && $options['pass'] === 'reauth') {
            $options['user'] = 'init';
            $options['pass'] = '';
            $this->session->remove('BoxTokens');
        }

        if (isset($options['id'])) {
            $this->session->set('nodeId', $options['id']);
        } else if ($_id = $this->session->get('nodeId')) {
            $options['id'] = $_id;
            $this->session->set('nodeId', $_id);
        }

        if (!empty($options['tmpPath'])) {
            if ((is_dir($options['tmpPath']) || mkdir($this->options['tmpPath'])) && is_writable($options['tmpPath'])) {
                $this->tmp = $options['tmpPath'];
            }
        }

        try {
            if (empty($options['client_id']) || empty($options['client_secret'])) {
                return array('exit' => true, 'body' => '{msg:errNetMountNoDriver}');
            }

            $itpCare = isset($options['code']);
            $code = $itpCare? $options['code'] : (isset($_GET['code'])? $_GET['code'] : '');
            if ($code) {
                try {
                    if (!empty($options['id'])) {
                        // Obtain the token using the code received by the Box.com API
                        $this->session->set('BoxTokens',
                            $this->_bd_obtainAccessToken($options['client_id'], $options['client_secret'], $code));

                        $out = array(
                            'node' => $options['id'],
                            'json' => '{"protocol": "box", "mode": "done", "reset": 1}',
                            'bind' => 'netmount'
                        );
                    } else {
                        $nodeid = ($_GET['host'] === '1')? 'elfinder' : $_GET['host'];
                        $out = array(
                            'node' => $nodeid,
                            'json' => json_encode(array(
                                'protocol' => 'box',
                                'host' => $nodeid,
                                'mode' => 'redirect',
                                'options' => array(
                                    'id' => $nodeid,
                                    'code'=> $code
                                )
                            )),
                            'bind' => 'netmount'
                        );
                    }
                    if (!$itpCare) {
                        return array('exit' => 'callback', 'out' => $out);
                    } else {
                        return array('exit' => true, 'body' => $out['json']);
                    }
                } catch (Exception $e) {
                    $out = array(
                        'node' => $options['id'],
                        'json' => json_encode(array('error' => $e->getMessage())),
                    );

                    return array('exit' => 'callback', 'out' => $out);
                }
            } elseif (!empty($_GET['error'])) {
                $out = array(
                    'node' => $options['id'],
                    'json' => json_encode(array('error' => elFinder::ERROR_ACCESS_DENIED)),
                );

                return array('exit' => 'callback', 'out' => $out);
            }

            if ($options['user'] === 'init') {
                $this->token = $this->session->get('BoxTokens');

                if ($this->token) {
                    try {
                        $this->_bd_refreshToken();
                    } catch (Exception $e) {
                        $this->setError($e->getMessage());
                        $this->token = null;
                        $this->session->remove('BoxTokens');
                    }
                }

                if (empty($this->token)) {
                    $result = false;
                } else {
                    $path = $options['path'];
                    if ($path === '/' || $path === 'root') {
                        $path = '0';
                    }
                    $result = $this->_bd_query($path, $fetch_self = false, $recursive = false);
                }

                if ($result === false) {
                    $redirect = elFinder::getConnectorUrl();
                    $redirect .= (strpos($redirect, '?') !== false? '&' : '?') . 'cmd=netmount&protocol=box&host=' . ($options['id'] === 'elfinder'? '1' : $options['id']);

                    try {
                        $this->session->set('BoxTokens', (object)array('token' => null));
                        $url = self::AUTH_URL . '?' . http_build_query(array('response_type' => 'code', 'client_id' => $options['client_id'], 'redirect_uri' => $redirect));
                    } catch (Exception $e) {
                        return array('exit' => true, 'body' => '{msg:errAccess}');
                    }

                    $html = '<input id="elf-volumedriver-box-host-btn" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" value="{msg:btnApprove}" type="button">';
                    $html .= '<script>
                            jQuery("#' . $options['id'] . '").elfinder("instance").trigger("netmount", {protocol: "box", mode: "makebtn", url: "' . $url . '"});
                        </script>';

                    return array('exit' => true, 'body' => $html);
                } else {
                    $folders = [];

                    if ($result) {
                        foreach ($result as $res) {
                            if ($res->type == 'folder') {
                                $folders[$res->id . ' '] = $res->name;
                            }
                        }
                        natcasesort($folders);
                    }

                    if ($options['pass'] === 'folders') {
                        return ['exit' => true, 'folders' => $folders];
                    }

                    $folders = ['root' => 'My Box'] + $folders;
                    $folders = json_encode($folders);

                    $expires = empty($this->token->data->refresh_token) ? (int)$this->token->expires : 0;
                    $mnt2res = empty($this->token->data->refresh_token) ? '' : ', "mnt2res": 1';
                    $json = '{"protocol": "box", "mode": "done", "folders": ' . $folders . ', "expires": ' . $expires . $mnt2res . '}';
                    $html = 'Box.com';
                    $html .= '<script>
                            jQuery("#' . $options['id'] . '").elfinder("instance").trigger("netmount", ' . $json . ');
                            </script>';

                    return array('exit' => true, 'body' => $html);
                }
            }
        } catch (Exception $e) {
            return array('exit' => true, 'body' => '{msg:errNetMountNoDriver}');
        }

        if ($_aToken = $this->session->get('BoxTokens')) {
            $options['accessToken'] = json_encode($_aToken);
            if ($this->options['path'] === 'root' || !$this->options['path']) {
                $this->options['path'] = '/';
            }
        } else {
            $this->session->remove('BoxTokens');
            $this->setError(elFinder::ERROR_NETMOUNT, $options['host'], implode(' ', $this->error()));

            return array('exit' => true, 'error' => $this->error());
        }

        $this->session->remove('nodeId');
        unset($options['user'], $options['pass'], $options['id']);

        return $options;
    }

    /**
     * process of on netunmount
     * Drop `box` & rm thumbs.
     *
     * @param $netVolumes
     * @param $key
     *
     * @return bool
     */
    public function netunmount($netVolumes, $key)
    {
        if ($tmbs = glob(rtrim($this->options['tmbPath'], '\\/') . DIRECTORY_SEPARATOR . $this->tmbPrefix . '*.png')) {
            foreach ($tmbs as $file) {
                unlink($file);
            }
        }

        return true;
    }

    /**
     * Return debug info for client.
     *
     * @return array
     **/
    public function debug()
    {
        $res = parent::debug();
        if (!empty($this->options['netkey']) && !empty($this->options['accessToken'])) {
            $res['accessToken'] = $this->options['accessToken'];
        }

        return $res;
    }

    /*********************************************************************/
    /*                        INIT AND CONFIGURE                         */
    /*********************************************************************/

    /**
     * Prepare FTP connection
     * Connect to remote server and check if credentials are correct, if so, store the connection id in $ftp_conn.
     *
     * @return bool
     * @throws Exception
     * @author Dmitry (dio) Levashov
     * @author Cem (DiscoFever)
     */
    protected function init()
    {
        if (!$this->options['accessToken']) {
            return $this->setError('Required option `accessToken` is undefined.');
        }

        if (!empty($this->options['tmpPath'])) {
            if ((is_dir($this->options['tmpPath']) || mkdir($this->options['tmpPath'])) && is_writable($this->options['tmpPath'])) {
                $this->tmp = $this->options['tmpPath'];
            }
        }

        $error = false;
        try {
            $this->token = json_decode($this->options['accessToken']);
            if (!is_object($this->token)) {
                throw new Exception('Required option `accessToken` is invalid JSON.');
            }

            // make net mount key
            if (empty($this->options['netkey'])) {
                $this->netMountKey = $this->_bd_getInitialToken();
            } else {
                $this->netMountKey = $this->options['netkey'];
            }

            if ($this->aTokenFile = $this->_bd_getATokenFile()) {
                if (empty($this->options['netkey'])) {
                    if ($this->aTokenFile) {
                        if (is_file($this->aTokenFile)) {
                            $this->token = json_decode(file_get_contents($this->aTokenFile));
                            if (!is_object($this->token)) {
                                unlink($this->aTokenFile);
                                throw new Exception('Required option `accessToken` is invalid JSON.');
                            }
                        } else {
                            file_put_contents($this->aTokenFile, json_encode($this->token), LOCK_EX);
                        }
                    }
                } else if (is_file($this->aTokenFile)) {
                    // If the refresh token is the same as the permanent volume
                    $this->token = json_decode(file_get_contents($this->aTokenFile));
                }
            }

            $this->needOnline && $this->_bd_refreshToken();
        } catch (Exception $e) {
            $this->token = null;
            $error = true;
            $this->setError($e->getMessage());
        }

        if ($this->netMountKey) {
            $this->tmbPrefix = 'box' . base_convert($this->netMountKey, 16, 32);
        }

        if ($error) {
            if (empty($this->options['netkey']) && $this->tmbPrefix) {
                // for delete thumbnail 
                $this->netunmount(null, null);
            }
            return false;
        }

        // normalize root path
        if ($this->options['path'] == 'root') {
            $this->options['path'] = '/';
        }

        $this->root = $this->options['path'] = $this->_normpath($this->options['path']);

        $this->options['root'] = ($this->options['root'] == '')? 'Box.com' : $this->options['root'];

        if (empty($this->options['alias'])) {
            if ($this->needOnline) {
                list(, $itemId) = $this->_bd_splitPath($this->options['path']);
                $this->options['alias'] = ($this->options['path'] === '/') ? $this->options['root'] :
                    $this->_bd_query($itemId, $fetch_self = true)->name . '@Box';
                if (!empty($this->options['netkey'])) {
                    elFinder::$instance->updateNetVolumeOption($this->options['netkey'], 'alias', $this->options['alias']);
                }
            } else {
                $this->options['alias'] = $this->options['root'];
            }
        }

        $this->rootName = $this->options['alias'];

        // This driver dose not support `syncChkAsTs`
        $this->options['syncChkAsTs'] = false;

        // 'lsPlSleep' minmum 10 sec
        $this->options['lsPlSleep'] = max(10, $this->options['lsPlSleep']);

        // enable command archive
        $this->options['useRemoteArchive'] = true;

        return true;
    }

    /**
     * Configure after successfull mount.
     *
     * @author Dmitry (dio) Levashov
     * @throws elFinderAbortException
     */
    protected function configure()
    {
        parent::configure();

        // fallback of $this->tmp
        if (!$this->tmp && $this->tmbPathWritable) {
            $this->tmp = $this->tmbPath;
        }
    }

    /*********************************************************************/
    /*                               FS API                              */
    /*********************************************************************/

    /**
     * Close opened connection.
     *
     * @author Dmitry (dio) Levashov
     **/
    public function umount()
    {
    }

    /**
     * Return fileinfo based on filename
     * For item ID based path file system
     * Please override if needed on each drivers.
     *
     * @param string $path file cache
     *
     * @return array|boolean
     * @throws elFinderAbortException
     */
    protected function isNameExists($path)
    {
        list(, $name, $parent) = $this->_bd_splitPath($path);

        // We can not use it because the search of Box.com there is a time lag.
        // ref. https://docs.box.com/reference#searching-for-content
        // > Note: If an item is added to Box then it becomes accessible through the search endpoint after ten minutes.

        /***
         * $url = self::API_URL.'/search?limit=1&offset=0&content_types=name&ancestor_folder_ids='.rawurlencode($pid)
         * .'&query='.rawurlencode('"'.$name.'"')
         * .'fields='.self::FETCHFIELDS;
         * $raw = $this->_bd_fetch($url);
         * if (is_array($raw) && count($raw)) {
         * return $this->_bd_parseRaw($raw);
         * }
         ***/

        $phash = $this->encode($parent);

        // do not recursive search
        $searchExDirReg = $this->options['searchExDirReg'];
        $this->options['searchExDirReg'] = '/.*/';
        $search = $this->search($name, array(), $phash);
        $this->options['searchExDirReg'] = $searchExDirReg;

        if ($search) {
            $f = false;
            foreach($search as $f) {
                if ($f['name'] !== $name) {
                    $f = false;
                }
                if ($f) {
                    break;
                }
            }
            return $f;
        }

        return false;
    }

    /**
     * Cache dir contents.
     *
     * @param string $path dir path
     *
     * @return
     * @throws Exception
     * @author Dmitry Levashov
     */
    protected function cacheDir($path)
    {
        $this->dirsCache[$path] = array();
        $hasDir = false;

        if ($path == '/') {
            $items = $this->_bd_query('0', $fetch_self = true);   // get root directory with folder & files
            $itemId = $items->id;
        } else {
            list(, $itemId) = $this->_bd_splitPath($path);
        }

        $res = $this->_bd_query($itemId);

        if ($res) {
            foreach ($res as $raw) {
                if ($stat = $this->_bd_parseRaw($raw)) {
                    $itemPath = $this->_joinPath($path, $raw->id);
                    $stat = $this->updateCache($itemPath, $stat);
                    if (empty($stat['hidden'])) {
                        if (!$hasDir && $stat['mime'] === 'directory') {
                            $hasDir = true;
                        }
                        $this->dirsCache[$path][] = $itemPath;
                    }
                }
            }
        }

        if (isset($this->sessionCache['subdirs'])) {
            $this->sessionCache['subdirs'][$path] = $hasDir;
        }

        return $this->dirsCache[$path];
    }

    /**
     * Copy file/recursive copy dir only in current volume.
     * Return new file path or false.
     *
     * @param string $src  source path
     * @param string $dst  destination dir path
     * @param string $name new file name (optionaly)
     *
     * @return string|false
     * @author Dmitry (dio) Levashov
     * @author Naoki Sawada
     **/
    protected function copy($src, $dst, $name)
    {
        if ($res = $this->_copy($src, $dst, $name)) {
            $this->added[] = $this->stat($res);
            return $res;
        } else {
            return $this->setError(elFinder::ERROR_COPY, $this->_path($src));
        }
    }

    /**
     * Remove file/ recursive remove dir.
     *
     * @param string $path  file path
     * @param bool   $force try to remove even if file locked
     *
     * @return bool
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     * @author Naoki Sawada
     */
    protected function remove($path, $force = false)
    {
        $stat = $this->stat($path);
        $stat['realpath'] = $path;
        $this->rmTmb($stat);
        $this->clearcache();

        if (empty($stat)) {
            return $this->setError(elFinder::ERROR_RM, $this->_path($path), elFinder::ERROR_FILE_NOT_FOUND);
        }

        if (!$force && !empty($stat['locked'])) {
            return $this->setError(elFinder::ERROR_LOCKED, $this->_path($path));
        }

        if ($stat['mime'] == 'directory') {
            if (!$this->_rmdir($path)) {
                return $this->setError(elFinder::ERROR_RM, $this->_path($path));
            }
        } else {
            if (!$this->_unlink($path)) {
                return $this->setError(elFinder::ERROR_RM, $this->_path($path));
            }
        }

        $this->removed[] = $stat;

        return true;
    }

    /**
     * Create thumnbnail and return it's URL on success.
     *
     * @param string $path file path
     * @param        $stat
     *
     * @return string|false
     * @throws ImagickException
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     * @author Naoki Sawada
     */
    protected function createTmb($path, $stat)
    {
        if (!$stat || !$this->canCreateTmb($path, $stat)) {
            return false;
        }

        $name = $this->tmbname($stat);
        $tmb = $this->tmbPath . DIRECTORY_SEPARATOR . $name;

        // copy image into tmbPath so some drivers does not store files on local fs
        if (!$data = $this->_bd_getThumbnail($path)) {
            // try get full contents as fallback
            if (!$data = $this->_getContents($path)) {
                return false;
            }
        }
        if (!file_put_contents($tmb, $data)) {
            return false;
        }

        $tmbSize = $this->tmbSize;

        if (($s = getimagesize($tmb)) == false) {
            return false;
        }

        $result = true;
        /* If image smaller or equal thumbnail size - just fitting to thumbnail square */
        if ($s[0] <= $tmbSize && $s[1] <= $tmbSize) {
            $result = $this->imgSquareFit($tmb, $tmbSize, $tmbSize, 'center', 'middle', $this->options['tmbBgColor'], 'png');
        } else {
            if ($this->options['tmbCrop']) {

                /* Resize and crop if image bigger than thumbnail */
                if (!(($s[0] > $tmbSize && $s[1] <= $tmbSize) || ($s[0] <= $tmbSize && $s[1] > $tmbSize)) || ($s[0] > $tmbSize && $s[1] > $tmbSize)) {
                    $result = $this->imgResize($tmb, $tmbSize, $tmbSize, true, false, 'png');
                }

                if ($result && ($s = getimagesize($tmb)) != false) {
                    $x = $s[0] > $tmbSize ? intval(($s[0] - $tmbSize) / 2) : 0;
                    $y = $s[1] > $tmbSize ? intval(($s[1] - $tmbSize) / 2) : 0;
                    $result = $this->imgCrop($tmb, $tmbSize, $tmbSize, $x, $y, 'png');
                }
            } else {
                $result = $this->imgResize($tmb, $tmbSize, $tmbSize, true, true, 'png');
            }

            if ($result) {
                $result = $this->imgSquareFit($tmb, $tmbSize, $tmbSize, 'center', 'middle', $this->options['tmbBgColor'], 'png');
            }
        }

        if (!$result) {
            unlink($tmb);

            return false;
        }

        return $name;
    }

    /**
     * Return thumbnail file name for required file.
     *
     * @param array $stat file stat
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function tmbname($stat)
    {
        return $this->tmbPrefix . $stat['rev'] . $stat['ts'] . '.png';
    }

    /**
     * Return content URL.
     *
     * @param object $raw data
     *
     * @return string
     * @author Naoki Sawada
     **/
    protected function getSharedWebContentLink($raw)
    {
        if ($raw->shared_link->url) {
            return sprintf('https://app.box.com/index.php?rm=box_download_shared_file&shared_name=%s&file_id=f_%s', basename($raw->shared_link->url), $raw->id);
        } elseif ($raw->shared_link->download_url) {
            return $raw->shared_link->download_url;
        }

        return false;
    }

    /**
     * Return content URL.
     *
     * @param string $hash    file hash
     * @param array  $options options
     *
     * @return string
     * @throws Exception
     * @author Naoki Sawada
     */
    public function getContentUrl($hash, $options = array())
    {
        if (!empty($options['onetime']) && $this->options['onetimeUrl']) {
            return parent::getContentUrl($hash, $options);
        }
        if (!empty($options['temporary'])) {
            // try make temporary file
            $url = parent::getContentUrl($hash, $options);
            if ($url) {
                return $url;
            }
        }
        if (($file = $this->file($hash)) == false || !$file['url'] || $file['url'] == 1) {
            $path = $this->decode($hash);

            list(, $itemId) = $this->_bd_splitPath($path);
            $params['shared_link']['access'] = 'open'; //open|company|collaborators

            $url = self::API_URL . '/files/' . $itemId;

            $curl = $this->_bd_prepareCurl(array(
                CURLOPT_URL => $url,
                CURLOPT_CUSTOMREQUEST => 'PUT',
                CURLOPT_POSTFIELDS => json_encode($params),
            ));
            $res = $this->_bd_curlExec($curl, true, array(
                // The data is sent as JSON as per Box documentation.
                'Content-Type: application/json',
            ));

            if ($url = $this->getSharedWebContentLink($res)) {
                return $url;
            }
        }

        return '';
    }

    /*********************** paths/urls *************************/

    /**
     * Return parent directory path.
     *
     * @param string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _dirname($path)
    {
        list(, , $dirname) = $this->_bd_splitPath($path);

        return $dirname;
    }

    /**
     * Return file name.
     *
     * @param string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _basename($path)
    {
        list(, $basename) = $this->_bd_splitPath($path);

        return $basename;
    }

    /**
     * Join dir name and file name and retur full path.
     *
     * @param string $dir
     * @param string $name
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _joinPath($dir, $name)
    {
        if (strval($dir) === '0') {
            $dir = '';
        }

        return $this->_normpath($dir . '/' . $name);
    }

    /**
     * Return normalized path, this works the same as os.path.normpath() in Python.
     *
     * @param string $path path
     *
     * @return string
     * @author Troex Nevelin
     **/
    protected function _normpath($path)
    {
        if (DIRECTORY_SEPARATOR !== '/') {
            $path = str_replace(DIRECTORY_SEPARATOR, '/', $path);
        }
        $path = '/' . ltrim($path, '/');

        return $path;
    }

    /**
     * Return file path related to root dir.
     *
     * @param string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _relpath($path)
    {
        return $path;
    }

    /**
     * Convert path related to root dir into real path.
     *
     * @param string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _abspath($path)
    {
        return $path;
    }

    /**
     * Return fake path started from root dir.
     *
     * @param string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _path($path)
    {
        return $this->rootName . $this->_normpath(substr($path, strlen($this->root)));
    }

    /**
     * Return true if $path is children of $parent.
     *
     * @param string $path   path to check
     * @param string $parent parent path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _inpath($path, $parent)
    {
        return $path == $parent || strpos($path, $parent . '/') === 0;
    }

    /***************** file stat ********************/
    /**
     * Return stat for given path.
     * Stat contains following fields:
     * - (int)    size    file size in b. required
     * - (int)    ts      file modification time in unix time. required
     * - (string) mime    mimetype. required for folders, others - optionally
     * - (bool)   read    read permissions. required
     * - (bool)   write   write permissions. required
     * - (bool)   locked  is object locked. optionally
     * - (bool)   hidden  is object hidden. optionally
     * - (string) alias   for symlinks - link target path relative to root path. optionally
     * - (string) target  for symlinks - link target path. optionally.
     * If file does not exists - returns empty array or false.
     *
     * @param string $path file path
     *
     * @return array|false
     * @throws Exception
     * @author Dmitry (dio) Levashov
     */
    protected function _stat($path)
    {
        if ($raw = $this->_bd_getRawItem($path)) {
            return $this->_bd_parseRaw($raw);
        }

        return false;
    }

    /**
     * Return true if path is dir and has at least one childs directory.
     *
     * @param string $path dir path
     *
     * @return bool
     * @throws Exception
     * @author Dmitry (dio) Levashov
     */
    protected function _subdirs($path)
    {
        list(, $itemId) = $this->_bd_splitPath($path);

        $path = '/folders/' . $itemId . '/items?limit=1&offset=0&fields=' . self::FETCHFIELDS;

        $url = self::API_URL . $path;

        if ($res = $this->_bd_fetch($url)) {
            if ($res[0]->type == 'folder') {
                return true;
            }
        }

        return false;
    }

    /**
     * Return object width and height
     * Ususaly used for images, but can be realize for video etc...
     *
     * @param string $path file path
     * @param string $mime file mime type
     *
     * @return string
     * @throws ImagickException
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function _dimensions($path, $mime)
    {
        if (strpos($mime, 'image') !== 0) {
            return '';
        }

        $ret = '';
        if ($work = $this->getWorkFile($path)) {
            if ($size = @getimagesize($work)) {
                $cache['width'] = $size[0];
                $cache['height'] = $size[1];
                $ret = array('dim' => $size[0] . 'x' . $size[1]);
                $srcfp = fopen($work, 'rb');
                $target = isset(elFinder::$currentArgs['target'])? elFinder::$currentArgs['target'] : '';
                if ($subImgLink = $this->getSubstituteImgLink($target, $size, $srcfp)) {
                    $ret['url'] = $subImgLink;
                }
            }
        }
        is_file($work) && @unlink($work);

        return $ret;
    }

    /******************** file/dir content *********************/

    /**
     * Return files list in directory.
     *
     * @param string $path dir path
     *
     * @return array
     * @throws Exception
     * @author Dmitry (dio) Levashov
     * @author Cem (DiscoFever)
     */
    protected function _scandir($path)
    {
        return isset($this->dirsCache[$path])
            ? $this->dirsCache[$path]
            : $this->cacheDir($path);
    }

    /**
     * Open file and return file pointer.
     *
     * @param string $path file path
     * @param string $mode
     *
     * @return resource|false
     * @author Dmitry (dio) Levashov
     */
    protected function _fopen($path, $mode = 'rb')
    {
        if ($mode === 'rb' || $mode === 'r') {
            list(, $itemId) = $this->_bd_splitPath($path);
            $data = array(
                'target' => self::API_URL . '/files/' . $itemId . '/content',
                'headers' => array('Authorization: Bearer ' . $this->token->data->access_token),
            );

            // to support range request
            if (func_num_args() > 2) {
                $opts = func_get_arg(2);
            } else {
                $opts = array();
            }
            if (!empty($opts['httpheaders'])) {
                $data['headers'] = array_merge($opts['httpheaders'], $data['headers']);
            }

            return elFinder::getStreamByUrl($data);
        }

        return false;
    }

    /**
     * Close opened file.
     *
     * @param resource $fp file pointer
     * @param string   $path
     *
     * @return void
     * @author Dmitry (dio) Levashov
     */
    protected function _fclose($fp, $path = '')
    {
        is_resource($fp) && fclose($fp);
        if ($path) {
            unlink($this->getTempFile($path));
        }
    }

    /********************  file/dir manipulations *************************/

    /**
     * Create dir and return created dir path or false on failed.
     *
     * @param string $path parent dir path
     * @param string $name new directory name
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _mkdir($path, $name)
    {
        try {
            list(, $parentId) = $this->_bd_splitPath($path);
            $params = array('name' => $name, 'parent' => array('id' => $parentId));

            $url = self::API_URL . '/folders';

            $curl = $this->_bd_prepareCurl(array(
                CURLOPT_URL => $url,
                CURLOPT_POST => true,
                CURLOPT_POSTFIELDS => json_encode($params),
            ));

            //create the Folder in the Parent
            $folder = $this->_bd_curlExec($curl, $path);

            return $this->_joinPath($path, $folder->id);
        } catch (Exception $e) {
            return $this->setError('Box error: ' . $e->getMessage());
        }
    }

    /**
     * Create file and return it's path or false on failed.
     *
     * @param string $path parent dir path
     * @param string $name new file name
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _mkfile($path, $name)
    {
        return $this->_save($this->tmpfile(), $path, $name, array());
    }

    /**
     * Create symlink. FTP driver does not support symlinks.
     *
     * @param string $target link target
     * @param string $path   symlink path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _symlink($target, $path, $name)
    {
        return false;
    }

    /**
     * Copy file into another file.
     *
     * @param string $source    source file path
     * @param string $targetDir target directory path
     * @param string $name      new file name
     *
     * @return string|false
     * @author Dmitry (dio) Levashov
     **/
    protected function _copy($source, $targetDir, $name)
    {
        try {
            //Set the Parent id
            list(, $parentId) = $this->_bd_splitPath($targetDir);
            list(, $srcId) = $this->_bd_splitPath($source);

            $srcItem = $this->_bd_getRawItem($source);

            $properties = array('name' => $name, 'parent' => array('id' => $parentId));
            $data = (object)$properties;

            $type = ($srcItem->type === 'folder') ? 'folders' : 'files';
            $url = self::API_URL . '/' . $type . '/' . $srcId . '/copy';

            $curl = $this->_bd_prepareCurl(array(
                CURLOPT_URL => $url,
                CURLOPT_POST => true,
                CURLOPT_POSTFIELDS => json_encode($data),
            ));

            //copy File in the Parent
            $result = $this->_bd_curlExec($curl, $targetDir);

            if (isset($result->id)) {
                if ($type === 'folders' && isset($this->sessionCache['subdirs'])) {
                    $this->sessionCache['subdirs'][$targetDir] = true;
                }

                return $this->_joinPath($targetDir, $result->id);
            }

            return false;
        } catch (Exception $e) {
            return $this->setError('Box error: ' . $e->getMessage());
        }
    }

    /**
     * Move file into another parent dir.
     * Return new file path or false.
     *
     * @param string $source source file path
     * @param string $target target dir path
     * @param string $name   file name
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _move($source, $targetDir, $name)
    {
        try {
            //moving and renaming a file or directory
            //Set new Parent and remove old parent
            list(, $parentId) = $this->_bd_splitPath($targetDir);
            list(, $itemId) = $this->_bd_splitPath($source);

            $srcItem = $this->_bd_getRawItem($source);

            //rename or move file or folder in destination target
            $properties = array('name' => $name, 'parent' => array('id' => $parentId));

            $type = ($srcItem->type === 'folder') ? 'folders' : 'files';
            $url = self::API_URL . '/' . $type . '/' . $itemId;
            $data = (object)$properties;

            $curl = $this->_bd_prepareCurl(array(
                CURLOPT_URL => $url,
                CURLOPT_CUSTOMREQUEST => 'PUT',
                CURLOPT_POSTFIELDS => json_encode($data),
            ));

            $result = $this->_bd_curlExec($curl, $targetDir, array(
                // The data is sent as JSON as per Box documentation.
                'Content-Type: application/json',
            ));

            if ($result && isset($result->id)) {
                return $this->_joinPath($targetDir, $result->id);
            }

            return false;
        } catch (Exception $e) {
            return $this->setError('Box error: ' . $e->getMessage());
        }
    }

    /**
     * Remove file.
     *
     * @param string $path file path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _unlink($path)
    {
        return $this->_bd_unlink($path, 'files');
    }

    /**
     * Remove dir.
     *
     * @param string $path dir path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _rmdir($path)
    {
        return $this->_bd_unlink($path, 'folders');
    }

    /**
     * Create new file and write into it from file pointer.
     * Return new file path or false on error.
     *
     * @param resource $fp   file pointer
     * @param string   $dir  target dir path
     * @param string   $name file name
     * @param array    $stat file stat (required by some virtual fs)
     *
     * @return bool|string
     * @author Dmitry (dio) Levashov
     **/
    protected function _save($fp, $path, $name, $stat)
    {
        $itemId = '';
        if ($name === '') {
            list($parentId, $itemId, $parent) = $this->_bd_splitPath($path);
        } else {
            if ($stat) {
                if (isset($stat['name'])) {
                    $name = $stat['name'];
                }
                if (isset($stat['rev']) && strpos($stat['hash'], $this->id) === 0) {
                    $itemId = $stat['rev'];
                }
            }
            list(, $parentId) = $this->_bd_splitPath($path);
            $parent = $path;
        }

        try {
            //Create or Update a file
            $metaDatas = stream_get_meta_data($fp);
            $tmpFilePath = isset($metaDatas['uri']) ? $metaDatas['uri'] : '';
            // remote contents
            if (!$tmpFilePath || empty($metaDatas['seekable'])) {
                $tmpHandle = $this->tmpfile();
                stream_copy_to_stream($fp, $tmpHandle);
                $metaDatas = stream_get_meta_data($tmpHandle);
                $tmpFilePath = $metaDatas['uri'];
            }

            if ($itemId === '') {
                //upload or create new file in destination target
                $properties = array('name' => $name, 'parent' => array('id' => $parentId));
                $url = self::UPLOAD_URL . '/files/content';
            } else {
                //update existing file in destination target
                $properties = array('name' => $name);
                $url = self::UPLOAD_URL . '/files/' . $itemId . '/content';
            }

            if (class_exists('CURLFile')) {
                $cfile = new CURLFile($tmpFilePath);
            } else {
                $cfile = '@' . $tmpFilePath;
            }
            $params = array('attributes' => json_encode($properties), 'file' => $cfile);
            $curl = $this->_bd_prepareCurl(array(
                CURLOPT_URL => $url,
                CURLOPT_POST => true,
                CURLOPT_POSTFIELDS => $params,
            ));

            $file = $this->_bd_curlExec($curl, $parent);

            return $this->_joinPath($parent, $file->entries[0]->id);
        } catch (Exception $e) {
            return $this->setError('Box error: ' . $e->getMessage());
        }
    }

    /**
     * Get file contents.
     *
     * @param string $path file path
     *
     * @return string|false
     * @author Dmitry (dio) Levashov
     **/
    protected function _getContents($path)
    {
        try {
            list(, $itemId) = $this->_bd_splitPath($path);
            $url = self::API_URL . '/files/' . $itemId . '/content';

            $contents = $this->_bd_fetch($url, true);
        } catch (Exception $e) {
            return $this->setError('Box error: ' . $e->getMessage());
        }

        return $contents;
    }

    /**
     * Write a string to a file.
     *
     * @param string $path    file path
     * @param string $content new file content
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _filePutContents($path, $content)
    {
        $res = false;

        if ($local = $this->getTempFile($path)) {
            if (file_put_contents($local, $content, LOCK_EX) !== false
                && ($fp = fopen($local, 'rb'))) {
                clearstatcache();
                $res = $this->_save($fp, $path, '', array());
                fclose($fp);
            }
            file_exists($local) && unlink($local);
        }

        return $res;
    }

    /**
     * Detect available archivers.
     **/
    protected function _checkArchivers()
    {
        // die('Not yet implemented. (_checkArchivers)');
        return array();
    }

    /**
     * chmod implementation.
     *
     * @return bool
     **/
    protected function _chmod($path, $mode)
    {
        return false;
    }

    /**
     * Extract files from archive.
     *
     * @param string $path archive path
     * @param array  $arc  archiver command and arguments (same as in $this->archivers)
     *
     * @return true
     * @author Dmitry (dio) Levashov,
     * @author Alexey Sukhotin
     **/
    protected function _extract($path, $arc)
    {
        die('Not yet implemented. (_extract)');
    }

    /**
     * Create archive and return its path.
     *
     * @param string $dir   target dir
     * @param array  $files files names list
     * @param string $name  archive name
     * @param array  $arc   archiver options
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov,
     * @author Alexey Sukhotin
     **/
    protected function _archive($dir, $files, $name, $arc)
    {
        die('Not yet implemented. (_archive)');
    }
} // END class
php/elFinderVolumeDropbox.class.php000064400000121500151215013420013417 0ustar00<?php

elFinder::$netDrivers['dropbox'] = 'Dropbox';

/**
 * Simple elFinder driver for FTP
 *
 * @author Dmitry (dio) Levashov
 * @author Cem (discofever)
 **/
class elFinderVolumeDropbox extends elFinderVolumeDriver {

	/**
	 * Driver id
	 * Must be started from letter and contains [a-z0-9]
	 * Used as part of volume id
	 *
	 * @var string
	 **/
	protected $driverId = 'd';

	/**
	 * OAuth object
	 *
	 * @var oauth
	 **/
	protected $oauth = null;

	/**
	 * Dropbox object
	 *
	 * @var dropbox
	 **/
	protected $dropbox = null;

	/**
	 * Directory for meta data caches
	 * If not set driver not cache meta data
	 *
	 * @var string
	 **/
	protected $metaCache = '';

	/**
	 * Last API error message
	 *
	 * @var string
	 **/
	protected $apiError = '';

	/**
	 * Directory for tmp files
	 * If not set driver will try to use tmbDir as tmpDir
	 *
	 * @var string
	 **/
	protected $tmp = '';
	
	/**
	 * Dropbox.com uid
	 *
	 * @var string
	 **/
	protected $dropboxUid = '';
	
	/**
	 * Dropbox download host, replaces 'www.dropbox.com' of shares URL
	 * 
	 * @var string
	 */
	private $dropbox_dlhost = 'dl.dropboxusercontent.com';
	
	private $dropbox_phpFound = false;
	
	private $DB_TableName = '';
	
	private $tmbPrefix = '';

	/**
	 * Constructor
	 * Extend options with required fields
	 *
	 * @author Dmitry (dio) Levashov
	 * @author Cem (DiscoFever)
	 */
	public function __construct() {

		// check with composer
		$this->dropbox_phpFound = class_exists('Dropbox_API');
		
		if (! $this->dropbox_phpFound) {
			// check with pear
			if (include_once 'Dropbox/autoload.php') {
				$this->dropbox_phpFound = in_array('Dropbox_autoload', spl_autoload_functions());
			}
		}
		
		$opts = array(
			'consumerKey'       => '',
			'consumerSecret'    => '',
			'accessToken'       => '',
			'accessTokenSecret' => '',
			'dropboxUid'        => '',
			'root'              => 'dropbox',
			'path'              => '/',
			'separator'         => '/',
			'PDO_DSN'           => '', // if empty use 'sqlite:(metaCachePath|tmbPath)/elFinder_dropbox_db_(hash:dropboxUid+consumerSecret)'
			'PDO_User'          => '',
			'PDO_Pass'          => '',
			'PDO_Options'       => array(),
			'PDO_DBName'        => 'dropbox',
			'treeDeep'          => 0,
			'tmbPath'           => '',
			'tmbURL'            => '',
			'tmpPath'           => '',
			'getTmbSize'        => 'large', // small: 32x32, medium or s: 64x64, large or m: 128x128, l: 640x480, xl: 1024x768
			'metaCachePath'     => '',
			'metaCacheTime'     => '600', // 10m
			'acceptedName'      => '#^[^/\\?*:|"<>]*[^./\\?*:|"<>]$#',
			'rootCssClass'      => 'elfinder-navbar-root-dropbox'
		);
		$this->options = array_merge($this->options, $opts);
		$this->options['mimeDetect'] = 'internal';
	}

	/**
	 * Prepare
	 * Call from elFinder::netmout() before volume->mount()
	 *
	 * @param $options
	 * @return Array
	 * @author Naoki Sawada
	 */
	public function netmountPrepare($options) {
		if (empty($options['consumerKey']) && defined('ELFINDER_DROPBOX_CONSUMERKEY')) $options['consumerKey'] = ELFINDER_DROPBOX_CONSUMERKEY;
		if (empty($options['consumerSecret']) && defined('ELFINDER_DROPBOX_CONSUMERSECRET')) $options['consumerSecret'] = ELFINDER_DROPBOX_CONSUMERSECRET;
		
		if ($options['user'] === 'init') {

			if (! $this->dropbox_phpFound || empty($options['consumerKey']) || empty($options['consumerSecret']) || !class_exists('PDO', false)) {
				return array('exit' => true, 'body' => '{msg:errNetMountNoDriver}');
			}
			
			if (defined('ELFINDER_DROPBOX_USE_CURL_PUT')) {
				$this->oauth = new Dropbox_OAuth_Curl($options['consumerKey'], $options['consumerSecret']);
			} else {
				if (class_exists('OAuth', false)) {
					$this->oauth = new Dropbox_OAuth_PHP($options['consumerKey'], $options['consumerSecret']);
				} else {
					if (! class_exists('HTTP_OAuth_Consumer')) {
						// We're going to try to load in manually
						include 'HTTP/OAuth/Consumer.php';
					}
					if (class_exists('HTTP_OAuth_Consumer', false)) {
						$this->oauth = new Dropbox_OAuth_PEAR($options['consumerKey'], $options['consumerSecret']);
					}
				}
			}
			
			if (! $this->oauth) {
				return array('exit' => true, 'body' => '{msg:errNetMountNoDriver}');
			}

			if ($options['pass'] === 'init') {
				$html = '';
				if ($sessionToken = $this->session->get('DropboxTokens')) {
					// token check
					try {
						list(, $accessToken, $accessTokenSecret) = $sessionToken;
						$this->oauth->setToken($accessToken, $accessTokenSecret);
						$this->dropbox = new Dropbox_API($this->oauth, $this->options['root']);
						$this->dropbox->getAccountInfo();
						$script = '<script>
							jQuery("#'.$options['id'].'").elfinder("instance").trigger("netmount", {protocol: "dropbox", mode: "done"});
						</script>';
						$html = $script;
					} catch (Dropbox_Exception $e) {
						$this->session->remove('DropboxTokens');
					}
				}
				if (! $html) {
					// get customdata
					$cdata = '';
					$innerKeys = array('cmd', 'host', 'options', 'pass', 'protocol', 'user');
					$this->ARGS = $_SERVER['REQUEST_METHOD'] === 'POST'? $_POST : $_GET;
					foreach($this->ARGS as $k => $v) {
						if (! in_array($k, $innerKeys)) {
							$cdata .= '&' . $k . '=' . rawurlencode($v);
						}
					}
					if (strpos($options['url'], 'http') !== 0 ) {
						$options['url'] = elFinder::getConnectorUrl();
					}
					$callback  = $options['url']
					           . '?cmd=netmount&protocol=dropbox&host=dropbox.com&user=init&pass=return&node='.$options['id'].$cdata;
					
					try {
						$tokens = $this->oauth->getRequestToken();
						$url= $this->oauth->getAuthorizeUrl(rawurlencode($callback));
					} catch (Dropbox_Exception $e) {
						return array('exit' => true, 'body' => '{msg:errAccess}');
					}
					
					$this->session->set('DropboxAuthTokens', $tokens);
					$html = '<input id="elf-volumedriver-dropbox-host-btn" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" value="{msg:btnApprove}" type="button" onclick="window.open(\''.$url.'\')">';
					$html .= '<script>
						jQuery("#'.$options['id'].'").elfinder("instance").trigger("netmount", {protocol: "dropbox", mode: "makebtn"});
					</script>';
				}
				return array('exit' => true, 'body' => $html);
			} else {
				$this->oauth->setToken($this->session->get('DropboxAuthTokens'));
				$this->session->remove('DropboxAuthTokens');
				$tokens = $this->oauth->getAccessToken();
				$this->session->set('DropboxTokens', array($_GET['uid'], $tokens['token'], $tokens['token_secret']));
				
				$out = array(
					'node' => $_GET['node'],
					'json' => '{"protocol": "dropbox", "mode": "done"}',
					'bind' => 'netmount'
				);
				
				return array('exit' => 'callback', 'out' => $out);
			}
		}
		if ($sessionToken = $this->session->get('DropboxTokens')) {
			list($options['dropboxUid'], $options['accessToken'], $options['accessTokenSecret']) = $sessionToken;
		}
		unset($options['user'], $options['pass']);
		return $options;
	}

	/**
	 * process of on netunmount
	 * Drop table `dropbox` & rm thumbs
	 *
	 * @param $netVolumes
	 * @param $key
	 * @return bool
	 * @internal param array $options
	 */
	public function netunmount($netVolumes, $key) {
		$count = 0;
		$dropboxUid = '';
		if (isset($netVolumes[$key])) {
			$dropboxUid = $netVolumes[$key]['dropboxUid'];
		}
		foreach($netVolumes as $volume) {
			if ($volume['host'] === 'dropbox' && $volume['dropboxUid'] === $dropboxUid) {
				$count++;
			}
		}
		if ($count === 1) {
			$this->DB->exec('drop table '.$this->DB_TableName);
			foreach(glob(rtrim($this->options['tmbPath'], '\\/').DIRECTORY_SEPARATOR.$this->tmbPrefix.'*.png') as $tmb) {
				unlink($tmb);
			}
		}
		return true;
	}
	
	/*********************************************************************/
	/*                        INIT AND CONFIGURE                         */
	/*********************************************************************/

	/**
	 * Prepare FTP connection
	 * Connect to remote server and check if credentials are correct, if so, store the connection id in $ftp_conn
	 *
	 * @return bool
	 * @author Dmitry (dio) Levashov
	 * @author Cem (DiscoFever)
	 **/
	protected function init() {
		if (!class_exists('PDO', false)) {
			return $this->setError('PHP PDO class is require.');
		}
		
		if (!$this->options['consumerKey']
		||  !$this->options['consumerSecret']
		||  !$this->options['accessToken']
		||  !$this->options['accessTokenSecret']) {
			return $this->setError('Required options undefined.');
		}
		
		if (empty($this->options['metaCachePath']) && defined('ELFINDER_DROPBOX_META_CACHE_PATH')) {
			$this->options['metaCachePath'] = ELFINDER_DROPBOX_META_CACHE_PATH;
		}
		
		// make net mount key
		$this->netMountKey = md5(join('-', array('dropbox', $this->options['path'])));

		if (! $this->oauth) {
			if (defined('ELFINDER_DROPBOX_USE_CURL_PUT')) {
				$this->oauth = new Dropbox_OAuth_Curl($this->options['consumerKey'], $this->options['consumerSecret']);
			} else {
				if (class_exists('OAuth', false)) {
					$this->oauth = new Dropbox_OAuth_PHP($this->options['consumerKey'], $this->options['consumerSecret']);
				} else {
					if (! class_exists('HTTP_OAuth_Consumer')) {
						// We're going to try to load in manually
						include 'HTTP/OAuth/Consumer.php';
					}
					if (class_exists('HTTP_OAuth_Consumer', false)) {
						$this->oauth = new Dropbox_OAuth_PEAR($this->options['consumerKey'], $this->options['consumerSecret']);
					}
				}
			}
		}
		
		if (! $this->oauth) {
			return $this->setError('OAuth extension not loaded.');
		}

		// normalize root path
		$this->root = $this->options['path'] = $this->_normpath($this->options['path']);

		if (empty($this->options['alias'])) {
			$this->options['alias'] = ($this->options['path'] === '/')? 'Dropbox.com'  : 'Dropbox'.$this->options['path'];
		}

		$this->rootName = $this->options['alias'];

		try {
			$this->oauth->setToken($this->options['accessToken'], $this->options['accessTokenSecret']);
			$this->dropbox = new Dropbox_API($this->oauth, $this->options['root']);
		} catch (Dropbox_Exception $e) {
			$this->session->remove('DropboxTokens');
			return $this->setError('Dropbox error: '.$e->getMessage());
		}
		
		// user
		if (empty($this->options['dropboxUid'])) {
			try {
				$res = $this->dropbox->getAccountInfo();
				$this->options['dropboxUid'] = $res['uid'];
			} catch (Dropbox_Exception $e) {
				$this->session->remove('DropboxTokens');
				return $this->setError('Dropbox error: '.$e->getMessage());
			}
		}
		
		$this->dropboxUid = $this->options['dropboxUid'];
		$this->tmbPrefix = 'dropbox'.base_convert($this->dropboxUid, 10, 32);

		if (!empty($this->options['tmpPath'])) {
			if ((is_dir($this->options['tmpPath']) || mkdir($this->options['tmpPath'])) && is_writable($this->options['tmpPath'])) {
				$this->tmp = $this->options['tmpPath'];
			}
		}
		if (!$this->tmp && is_writable($this->options['tmbPath'])) {
			$this->tmp = $this->options['tmbPath'];
		}
		if (!$this->tmp && ($tmp = elFinder::getStaticVar('commonTempPath'))) {
			$this->tmp = $tmp;
		}
		
		if (!empty($this->options['metaCachePath'])) {
			if ((is_dir($this->options['metaCachePath']) || mkdir($this->options['metaCachePath'])) && is_writable($this->options['metaCachePath'])) {
				$this->metaCache = $this->options['metaCachePath'];
			}
		}
		if (!$this->metaCache && $this->tmp) {
			$this->metaCache = $this->tmp;
		}
		
		if (!$this->metaCache) {
			return $this->setError('Cache dirctory (metaCachePath or tmp) is require.');
		}
		
		// setup PDO
		if (! $this->options['PDO_DSN']) {
			$this->options['PDO_DSN'] = 'sqlite:'.$this->metaCache.DIRECTORY_SEPARATOR.'.elFinder_dropbox_db_'.md5($this->dropboxUid.$this->options['consumerSecret']);
		}
		// DataBase table name
		$this->DB_TableName = $this->options['PDO_DBName'];
		// DataBase check or make table
		try {
			$this->DB = new PDO($this->options['PDO_DSN'], $this->options['PDO_User'], $this->options['PDO_Pass'], $this->options['PDO_Options']);
			if (! $this->checkDB()) {
				return $this->setError('Can not make DB table');
			}
		} catch (PDOException $e) {
			return $this->setError('PDO connection failed: '.$e->getMessage());
		}
		
		$res = $this->deltaCheck($this->isMyReload());
		if ($res !== true) {
			if (is_string($res)) {
				return $this->setError($res);
			} else {
				return $this->setError('Could not check API "delta"');
			}
		}
		
		if (is_null($this->options['syncChkAsTs'])) {
			$this->options['syncChkAsTs'] = true;
		}
		if ($this->options['syncChkAsTs']) {
			// 'tsPlSleep' minmum 5 sec
			$this->options['tsPlSleep'] = max(5, $this->options['tsPlSleep']);
		} else {
			// 'lsPlSleep' minmum 10 sec
			$this->options['lsPlSleep'] = max(10, $this->options['lsPlSleep']);
		}
		
		return true;
	}


	/**
	 * Configure after successful mount.
	 *
	 * @return string
	 * @author Dmitry (dio) Levashov
	 **/
	protected function configure() {
		parent::configure();
		
		$this->disabled[] = 'archive';
		$this->disabled[] = 'extract';
	}
	
	/**
	 * Check DB for delta cache
	 * 
	 * @return bool
	 */
	private function checkDB() {
		$res = $this->query('SELECT * FROM sqlite_master WHERE type=\'table\' AND name=\''.$this->DB_TableName.'\'');
		if ($res && isset($_REQUEST['init'])) {
			// check is index(nameidx) UNIQUE?
			$chk = $this->query('SELECT sql FROM sqlite_master WHERE type=\'index\' and name=\'nameidx\'');
			if (!$chk || strpos(strtoupper($chk[0]), 'UNIQUE') === false) {
				// remake
				$this->DB->exec('DROP TABLE '.$this->DB_TableName);
				$res = false;
			}
		}
		if (! $res) {
			try {
				$this->DB->exec('CREATE TABLE '.$this->DB_TableName.'(path text, fname text, dat blob, isdir integer);');
				$this->DB->exec('CREATE UNIQUE INDEX nameidx ON '.$this->DB_TableName.'(path, fname)');
				$this->DB->exec('CREATE INDEX isdiridx ON '.$this->DB_TableName.'(isdir)');
			} catch (PDOException $e) {
				return $this->setError($e->getMessage());
			}
		}
		return true;
	}
	
	/**
	 * DB query and fetchAll
	 * 
	 * @param string $sql
	 * @return boolean|array
	 */
	private function query($sql) {
		if ($sth = $this->DB->query($sql)) {
			$res = $sth->fetchAll(PDO::FETCH_COLUMN);
		} else {
			$res = false;
		}
		return $res;
	}
	
	/**
	 * Get dat(dropbox metadata) from DB
	 * 
	 * @param string $path
	 * @return array dropbox metadata
	 */
	private function getDBdat($path) {
		if ($res = $this->query('select dat from '.$this->DB_TableName.' where path='.$this->DB->quote(strtolower($this->_dirname($path))).' and fname='.$this->DB->quote(strtolower($this->_basename($path))).' limit 1')) {
			return unserialize($res[0]);
		} else {
			return array();
		}
	}
	
	/**
	 * Update DB dat(dropbox metadata)
	 * 
	 * @param string $path
	 * @param array $dat
	 * @return bool|array
	 */
	private function updateDBdat($path, $dat) {
		return $this->query('update '.$this->DB_TableName.' set dat='.$this->DB->quote(serialize($dat))
				. ', isdir=' . ($dat['is_dir']? 1 : 0)
				. ' where path='.$this->DB->quote(strtolower($this->_dirname($path))).' and fname='.$this->DB->quote(strtolower($this->_basename($path))));
	}
	/*********************************************************************/
	/*                               FS API                              */
	/*********************************************************************/

	/**
	 * Close opened connection
	 *
	 * @return void
	 * @author Dmitry (dio) Levashov
	 **/
	public function umount() {

	}
	
	/**
	 * Get delta data and DB update
	 * 
	 * @param boolean $refresh force refresh
	 * @return true|string error message
	 */
	protected function deltaCheck($refresh = true) {
		$chk = false;
		if (! $refresh && $chk = $this->query('select dat from '.$this->DB_TableName.' where path=\'\' and fname=\'\' limit 1')) {
			$chk = unserialize($chk[0]);
		}
		if ($chk && ($chk['mtime'] + $this->options['metaCacheTime']) > $_SERVER['REQUEST_TIME']) {
			return true;
		}
		
		try {
			$more = true;
			$this->DB->beginTransaction();
			
			if ($res = $this->query('select dat from '.$this->DB_TableName.' where path=\'\' and fname=\'\' limit 1')) {
				$res = unserialize($res[0]);
				$cursor = $res['cursor'];
			} else {
				$cursor = '';
			}
			$delete = false;
			$reset = false;
			$ptimes = array();
			$now = time();
			do {
				 ini_set('max_execution_time', 120);
				$_info = $this->dropbox->delta($cursor);
				if (! empty($_info['reset'])) {
					$this->DB->exec('TRUNCATE table '.$this->DB_TableName);
					$this->DB->exec('insert into '.$this->DB_TableName.' values(\'\', \'\', \''.serialize(array('cursor' => '', 'mtime' => 0)).'\', 0);');
					$this->DB->exec('insert into '.$this->DB_TableName.' values(\'/\', \'\', \''.serialize(array(
						'path'      => '/',
						'is_dir'    => 1,
						'mime_type' => '',
						'bytes'     => 0
					)).'\', 0);');
					$reset = true;
				}
				$cursor = $_info['cursor'];
				
				foreach($_info['entries'] as $entry) {
					$key = strtolower($entry[0]);
					$pkey = strtolower($this->_dirname($key));
					
					$path = $this->DB->quote($pkey);
					$fname = $this->DB->quote(strtolower($this->_basename($key)));
					$where = 'where path='.$path.' and fname='.$fname;
					
					if (empty($entry[1])) {
						$ptimes[$pkey] = isset($ptimes[$pkey])? max(array($now, $ptimes[$pkey])) : $now;
						$this->DB->exec('delete from '.$this->DB_TableName.' '.$where);
						! $delete && $delete = true;
						continue;
					}

					$_itemTime = strtotime(isset($entry[1]['client_mtime'])? $entry[1]['client_mtime'] : $entry[1]['modified']);
					$ptimes[$pkey] = isset($ptimes[$pkey])? max(array($_itemTime, $ptimes[$pkey])) : $_itemTime;
					$sql = 'select path from '.$this->DB_TableName.' '.$where.' limit 1';
					if (! $reset && $this->query($sql)) {
						$this->DB->exec('update '.$this->DB_TableName.' set dat='.$this->DB->quote(serialize($entry[1])).', isdir='.($entry[1]['is_dir']? 1 : 0).' ' .$where);
					} else {
						$this->DB->exec('insert into '.$this->DB_TableName.' values ('.$path.', '.$fname.', '.$this->DB->quote(serialize($entry[1])).', '.(int)$entry[1]['is_dir'].')');
					}
				}
			} while (! empty($_info['has_more']));
			
			// update time stamp of parent holder
			foreach ($ptimes as $_p => $_t) {
				if ($praw = $this->getDBdat($_p)) {
					$_update = false;
					if (isset($praw['client_mtime']) && $_t > strtotime($praw['client_mtime'])) {
						$praw['client_mtime'] = date('r', $_t);
						$_update = true;
					}
					if (isset($praw['modified']) && $_t > strtotime($praw['modified'])) {
						$praw['modified'] = date('r', $_t);
						$_update = true;
					}
					if ($_update) {
						$pwhere = 'where path='.$this->DB->quote(strtolower($this->_dirname($_p))).' and fname='.$this->DB->quote(strtolower($this->_basename($_p)));
						$this->DB->exec('update '.$this->DB_TableName.' set dat='.$this->DB->quote(serialize($praw)).' '.$pwhere);
					}
				}
			}
			
			$this->DB->exec('update '.$this->DB_TableName.' set dat='.$this->DB->quote(serialize(array('cursor'=>$cursor, 'mtime'=>$_SERVER['REQUEST_TIME']))).' where path=\'\' and fname=\'\'');
			if (! $this->DB->commit()) {
				$e = $this->DB->errorInfo();
				return $e[2];
			}
			if ($delete) {
				$this->DB->exec('vacuum');
			}
		} catch(Dropbox_Exception $e) {
			return $e->getMessage();
		}
		return true;
	}
	
	/**
	 * Parse line from dropbox metadata output and return file stat (array)
	 *
	 * @param  string  $raw  line from ftp_rawlist() output
	 * @return array
	 * @author Dmitry Levashov
	 **/
	protected function parseRaw($raw) {
		$stat = array();

		$stat['rev']   = isset($raw['rev'])? $raw['rev'] : 'root';
		$stat['name']  = $this->_basename($raw['path']);
		$stat['mime']  = $raw['is_dir']? 'directory' : $raw['mime_type'];
		$stat['size']  = $stat['mime'] == 'directory' ? 0 : $raw['bytes'];
		$stat['ts']    = isset($raw['client_mtime'])? strtotime($raw['client_mtime']) :
		                (isset($raw['modified'])? strtotime($raw['modified']) : $_SERVER['REQUEST_TIME']);
		$stat['dirs'] = 0;
		if ($raw['is_dir']) {
			$stat['dirs'] = (int)(bool)$this->query('select path from '.$this->DB_TableName.' where isdir=1 and path='.$this->DB->quote(strtolower($raw['path'])));
		}
		
		if (!empty($raw['url'])) {
			$stat['url'] = $raw['url'];
		} else if (! $this->disabledGetUrl) {
			$stat['url'] = '1';
		}
		if (isset($raw['width'])) $stat['width'] = $raw['width'];
		if (isset($raw['height'])) $stat['height'] = $raw['height'];
		
		return $stat;
	}

	/**
	 * Cache dir contents
	 *
	 * @param  string  $path  dir path
	 * @return string
	 * @author Dmitry Levashov
	 **/
	protected function cacheDir($path) {
		$this->dirsCache[$path] = array();
		$hasDir = false;
		
		$res = $this->query('select dat from '.$this->DB_TableName.' where path='.$this->DB->quote(strtolower($path)));
		
		if ($res) {
			foreach($res as $raw) {
				$raw = unserialize($raw);
				if ($stat = $this->parseRaw($raw)) {
					$stat = $this->updateCache($raw['path'], $stat);
					if (empty($stat['hidden']) && $path !== $raw['path']) {
						if (! $hasDir && $stat['mime'] === 'directory') {
							$hasDir = true;
						}
						$this->dirsCache[$path][] = $raw['path'];
					}
				}
			}
		}
		
		if (isset($this->sessionCache['subdirs'])) {
			$this->sessionCache['subdirs'][$path] = $hasDir;
		}
		
		return $this->dirsCache[$path];
	}

	/**
	* Recursive files search
	*
	* @param  string  $path   dir path
	* @param  string  $q      search string
	* @param  array   $mimes
	* @return array
	* @author Naoki Sawada
	**/
	protected function doSearch($path, $q, $mimes) {
		$result = array();
		$sth = $this->DB->prepare('select dat from '.$this->DB_TableName.' WHERE path LIKE ? AND fname LIKE ?');
		$sth->execute(array((($path === '/')? '' : strtolower($path)).'%', '%'.strtolower($q).'%'));
		$res = $sth->fetchAll(PDO::FETCH_COLUMN);
		$timeout = $this->options['searchTimeout']? $this->searchStart + $this->options['searchTimeout'] : 0;
		
		if ($res) {
			foreach($res as $raw) {
				if ($timeout && $timeout < time()) {
					$this->setError(elFinder::ERROR_SEARCH_TIMEOUT, $this->path($this->encode($path)));
					break;
				}
				
				$raw = unserialize($raw);
				if ($stat = $this->parseRaw($raw)) {
					if (!isset($this->cache[$raw['path']])) {
						$stat = $this->updateCache($raw['path'], $stat);
					}
					if (!empty($stat['hidden']) || ($mimes && $stat['mime'] === 'directory') || !$this->mimeAccepted($stat['mime'], $mimes)) {
						continue;
					}
					$stat = $this->stat($raw['path']);
					$stat['path'] = $this->path($stat['hash']);
					$result[] = $stat;
				}
			}
		}
		return $result;
	}
	
	/**
	* Copy file/recursive copy dir only in current volume.
	* Return new file path or false.
	*
	* @param  string  $src   source path
	* @param  string  $dst   destination dir path
	* @param  string  $name  new file name (optionaly)
	* @return string|false
	* @author Dmitry (dio) Levashov
	* @author Naoki Sawada
	**/
	protected function copy($src, $dst, $name) {

		$this->clearcache();

		return $this->_copy($src, $dst, $name)
		? $this->_joinPath($dst, $name)
		: $this->setError(elFinder::ERROR_COPY, $this->_path($src));
	}

	/**
	 * Remove file/ recursive remove dir
	 *
	 * @param  string $path file path
	 * @param  bool $force try to remove even if file locked
	 * @param bool $recursive
	 * @return bool
	 * @author Dmitry (dio) Levashov
	 * @author Naoki Sawada
	 */
	protected function remove($path, $force = false, $recursive = false) {
		$stat = $this->stat($path);
		$stat['realpath'] = $path;
		$this->rmTmb($stat);
		$this->clearcache();
	
		if (empty($stat)) {
			return $this->setError(elFinder::ERROR_RM, $this->_path($path), elFinder::ERROR_FILE_NOT_FOUND);
		}
	
		if (!$force && !empty($stat['locked'])) {
			return $this->setError(elFinder::ERROR_LOCKED, $this->_path($path));
		}
	
		if ($stat['mime'] == 'directory') {
			if (!$recursive && !$this->_rmdir($path)) {
				return $this->setError(elFinder::ERROR_RM, $this->_path($path));
			}
		} else {
			if (!$recursive && !$this->_unlink($path)) {
				return $this->setError(elFinder::ERROR_RM, $this->_path($path));
			}
		}
	
		$this->removed[] = $stat;
		return true;
	}

	/**
	 * Create thumnbnail and return it's URL on success
	 *
	 * @param  string $path file path
	 * @param $stat
	 * @return false|string
	 * @internal param string $mime file mime type
	 * @author Dmitry (dio) Levashov
	 * @author Naoki Sawada
	 */
	protected function createTmb($path, $stat) {
		if (!$stat || !$this->canCreateTmb($path, $stat)) {
			return false;
		}
	
		$name = $this->tmbname($stat);
		$tmb  = $this->tmbPath.DIRECTORY_SEPARATOR.$name;
	
		// copy image into tmbPath so some drivers does not store files on local fs
		if (! $data = $this->getThumbnail($path, $this->options['getTmbSize'])) {
			return false;
		}
		if (! file_put_contents($tmb, $data)) {
			return false;
		}
	
		$result = false;
	
		$tmbSize = $this->tmbSize;
	
		if (($s = getimagesize($tmb)) == false) {
			return false;
		}
	
		/* If image smaller or equal thumbnail size - just fitting to thumbnail square */
		if ($s[0] <= $tmbSize && $s[1]  <= $tmbSize) {
			$result = $this->imgSquareFit($tmb, $tmbSize, $tmbSize, 'center', 'middle', $this->options['tmbBgColor'], 'png' );
	
		} else {
	
			if ($this->options['tmbCrop']) {
	
				/* Resize and crop if image bigger than thumbnail */
				if (!(($s[0] > $tmbSize && $s[1] <= $tmbSize) || ($s[0] <= $tmbSize && $s[1] > $tmbSize) ) || ($s[0] > $tmbSize && $s[1] > $tmbSize)) {
					$result = $this->imgResize($tmb, $tmbSize, $tmbSize, true, false, 'png');
				}
	
				if (($s = getimagesize($tmb)) != false) {
					$x = $s[0] > $tmbSize ? intval(($s[0] - $tmbSize)/2) : 0;
					$y = $s[1] > $tmbSize ? intval(($s[1] - $tmbSize)/2) : 0;
					$result = $this->imgCrop($tmb, $tmbSize, $tmbSize, $x, $y, 'png');
				}
	
			} else {
				$result = $this->imgResize($tmb, $tmbSize, $tmbSize, true, true, 'png');
			}
		
			$result = $this->imgSquareFit($tmb, $tmbSize, $tmbSize, 'center', 'middle', $this->options['tmbBgColor'], 'png' );
		}
		
		if (!$result) {
			unlink($tmb);
			return false;
		}
	
		return $name;
	}
	
	/**
	 * Return thumbnail file name for required file
	 *
	 * @param  array  $stat  file stat
	 * @return string
	 * @author Dmitry (dio) Levashov
	 **/
	protected function tmbname($stat) {
		return $this->tmbPrefix.$stat['rev'].'.png';
	}
	
	/**
	 * Get thumbnail from dropbox.com
	 * @param string $path
	 * @param string $size
	 * @return string | boolean
	 */
	protected function getThumbnail($path, $size = 'small') {
		try {
			return $this->dropbox->getThumbnail($path, $size);
		} catch (Dropbox_Exception $e) {
			return false;
		}
	}
	
	/**
	* Return content URL
	*
	* @param string  $hash  file hash
	* @param array $options options
	* @return array
	* @author Naoki Sawada
	**/
	public function getContentUrl($hash, $options = array()) {
		if (($file = $this->file($hash)) == false || !$file['url'] || $file['url'] == 1) {
			$path = $this->decode($hash);
			$cache = $this->getDBdat($path);
			$url = '';
			if (isset($cache['share']) && strpos($cache['share'], $this->dropbox_dlhost) !== false) {
				$res = $this->getHttpResponseHeader($cache['share']);
				if (preg_match("/^HTTP\/[01\.]+ ([0-9]{3})/", $res, $match)) {
					if ($match[1] < 400) {
						$url = $cache['share'];
					}
				}
			}
			if (! $url) {
				try {
					$res = $this->dropbox->share($path, null, false);
					$url = $res['url'];
					if (strpos($url, 'www.dropbox.com') === false) {
						$res = $this->getHttpResponseHeader($url);
						if (preg_match('/^location:\s*(http[^\s]+)/im', $res, $match)) {
							$url = $match[1];
						}
					}
					list($url) = explode('?', $url);
					$url = str_replace('www.dropbox.com', $this->dropbox_dlhost, $url);
					if (! isset($cache['share']) || $cache['share'] !== $url) {
						$cache['share'] = $url;
						$this->updateDBdat($path, $cache);
					}
				} catch (Dropbox_Exception $e) {
					return false;
				}
			}
			return $url;
		}
		return $file['url'];
	}
	
	/**
	 * Get HTTP request response header string
	 * 
	 * @param string $url target URL
	 * @return string
	 * @author Naoki Sawada
	 */
	private function getHttpResponseHeader($url) {
		if (function_exists('curl_exec')) {

			$c = curl_init();
			curl_setopt( $c, CURLOPT_RETURNTRANSFER, true );
			curl_setopt( $c, CURLOPT_CUSTOMREQUEST, 'HEAD' );
			curl_setopt( $c, CURLOPT_HEADER, 1 );
			curl_setopt( $c, CURLOPT_NOBODY, true );
			curl_setopt( $c, CURLOPT_URL, $url );
			$res = curl_exec( $c );
			
		} else {
			
			require_once 'HTTP/Request2.php';
			try {
				$request2 = new HTTP_Request2();
				$request2->setConfig(array(
	                'ssl_verify_peer' => false,
	                'ssl_verify_host' => false
	            ));
				$request2->setUrl($url);
				$request2->setMethod(HTTP_Request2::METHOD_HEAD);
				$result = $request2->send();
				$res = array();
				$res[] = 'HTTP/'.$result->getVersion().' '.$result->getStatus().' '.$result->getReasonPhrase();
				foreach($result->getHeader() as $key => $val) {
					$res[] = $key . ': ' . $val;
				}
				$res = join("\r\n", $res);
			} catch( HTTP_Request2_Exception $e ){
				$res = '';
			} catch (Exception $e){
				$res = '';
			}
		
		}
		return $res;
	}
	
	/*********************** paths/urls *************************/

	/**
	 * Return parent directory path
	 *
	 * @param  string  $path  file path
	 * @return string
	 * @author Dmitry (dio) Levashov
	 **/
	protected function _dirname($path) {
		return $this->_normpath(substr($path, 0, strrpos($path, '/')));
	}

	/**
	 * Return file name
	 *
	 * @param  string  $path  file path
	 * @return string
	 * @author Dmitry (dio) Levashov
	 **/
	protected function _basename($path) {
		return substr($path, strrpos($path, '/') + 1);
	}

	/**
	 * Join dir name and file name and retur full path
	 *
	 * @param  string  $dir
	 * @param  string  $name
	 * @return string
	 * @author Dmitry (dio) Levashov
	 **/
	protected function _joinPath($dir, $name) {
		return $this->_normpath($dir.'/'.$name);
	}

	/**
	 * Return normalized path, this works the same as os.path.normpath() in Python
	 *
	 * @param  string  $path  path
	 * @return string
	 * @author Troex Nevelin
	 **/
	protected function _normpath($path) {
		$path = '/' . ltrim($path, '/');
		return $path;
	}

	/**
	 * Return file path related to root dir
	 *
	 * @param  string  $path  file path
	 * @return string
	 * @author Dmitry (dio) Levashov
	 **/
	protected function _relpath($path) {
		return $path;
	}

	/**
	 * Convert path related to root dir into real path
	 *
	 * @param  string  $path  file path
	 * @return string
	 * @author Dmitry (dio) Levashov
	 **/
	protected function _abspath($path) {
		return $path;
	}

	/**
	 * Return fake path started from root dir
	 *
	 * @param  string  $path  file path
	 * @return string
	 * @author Dmitry (dio) Levashov
	 **/
	protected function _path($path) {
		return $this->rootName . $this->_normpath(substr($path, strlen($this->root)));
	}

	/**
	 * Return true if $path is children of $parent
	 *
	 * @param  string  $path    path to check
	 * @param  string  $parent  parent path
	 * @return bool
	 * @author Dmitry (dio) Levashov
	 **/
	protected function _inpath($path, $parent) {
		return $path == $parent || strpos($path, $parent.'/') === 0;
	}

	/***************** file stat ********************/
	/**
	 * Return stat for given path.
	 * Stat contains following fields:
	 * - (int)    size    file size in b. required
	 * - (int)    ts      file modification time in unix time. required
	 * - (string) mime    mimetype. required for folders, others - optionally
	 * - (bool)   read    read permissions. required
	 * - (bool)   write   write permissions. required
	 * - (bool)   locked  is object locked. optionally
	 * - (bool)   hidden  is object hidden. optionally
	 * - (string) alias   for symlinks - link target path relative to root path. optionally
	 * - (string) target  for symlinks - link target path. optionally
	 *
	 * If file does not exists - returns empty array or false.
	 *
	 * @param  string  $path    file path
	 * @return array|false
	 * @author Dmitry (dio) Levashov
	 **/
	protected function _stat($path) {
		//if (!empty($this->ARGS['reload']) && isset($this->ARGS['target']) && strpos($this->ARGS['target'], $this->id) === 0) {
		if ($this->isMyReload()) {
			$this->deltaCheck();
		}
		if ($raw = $this->getDBdat($path)) {
			return $this->parseRaw($raw);
		}
		return false;
	}

	/**
	 * Return true if path is dir and has at least one childs directory
	 *
	 * @param  string  $path  dir path
	 * @return bool
	 * @author Dmitry (dio) Levashov
	 **/
	protected function _subdirs($path) {
		return ($stat = $this->stat($path)) && isset($stat['dirs']) ? $stat['dirs'] : false;
	}

	/**
	 * Return object width and height
	 * Ususaly used for images, but can be realize for video etc...
	 *
	 * @param  string  $path  file path
	 * @param  string  $mime  file mime type
	 * @return string
	 * @author Dmitry (dio) Levashov
	 **/
	protected function _dimensions($path, $mime) {
		if (strpos($mime, 'image') !== 0) return '';
		$cache = $this->getDBdat($path);
		if (isset($cache['width']) && isset($cache['height'])) {
			return $cache['width'].'x'.$cache['height'];
		}
		$ret = '';
		if ($work = $this->getWorkFile($path)) {
			if ($size = getimagesize($work)) {
				$cache['width'] = $size[0];
				$cache['height'] = $size[1];
				$this->updateDBdat($path, $cache);
				$ret = $size[0].'x'.$size[1];
			}
		}
		is_file($work) && unlink($work);
		return $ret;
	}

	/******************** file/dir content *********************/

	/**
	 * Return files list in directory.
	 *
	 * @param  string  $path  dir path
	 * @return array
	 * @author Dmitry (dio) Levashov
	 * @author Cem (DiscoFever)
	 **/
	protected function _scandir($path) {
		return isset($this->dirsCache[$path])
			? $this->dirsCache[$path]
			: $this->cacheDir($path);
	}

	/**
	 * Open file and return file pointer
	 *
	 * @param  string $path file path
	 * @param string $mode
	 * @return false|resource
	 * @internal param bool $write open file for writing
	 * @author Dmitry (dio) Levashov
	 */
	protected function _fopen($path, $mode='rb') {

		if (($mode == 'rb' || $mode == 'r')) {
			try {
				$res = $this->dropbox->media($path);
				$url = parse_url($res['url']);
 				$fp = stream_socket_client('ssl://'.$url['host'].':443');
 				fputs($fp, "GET {$url['path']} HTTP/1.0\r\n");
 				fputs($fp, "Host: {$url['host']}\r\n");
 				fputs($fp, "\r\n");
 				while(trim(fgets($fp)) !== ''){};
 				return $fp;
			} catch (Dropbox_Exception $e) {
				return false;
			}
		}
		
		if ($this->tmp) {
			$contents = $this->_getContents($path);
			
			if ($contents === false) {
				return false;
			}
			
			if ($local = $this->getTempFile($path)) {
				if (file_put_contents($local, $contents, LOCK_EX) !== false) {
					return fopen($local, $mode);
				}
			}
		}

		return false;
	}

	/**
	 * Close opened file
	 *
	 * @param  resource $fp file pointer
	 * @param string $path
	 * @return bool
	 * @author Dmitry (dio) Levashov
	 */
	protected function _fclose($fp, $path='') {
		fclose($fp);
		if ($path) {
			unlink($this->getTempFile($path));
		}
	}

	/********************  file/dir manipulations *************************/

	/**
	 * Create dir and return created dir path or false on failed
	 *
	 * @param  string  $path  parent dir path
	 * @param string  $name  new directory name
	 * @return string|bool
	 * @author Dmitry (dio) Levashov
	 **/
	protected function _mkdir($path, $name) {
		$path = $this->_normpath($path.'/'.$name);
		try {
			$this->dropbox->createFolder($path);
		} catch (Dropbox_Exception $e) {
			$this->deltaCheck();
			if ($this->dir($this->encode($path))) {
				return $path;
			}
			return $this->setError('Dropbox error: '.$e->getMessage());
		}
		$this->deltaCheck();
		return $path;
	}

	/**
	 * Create file and return it's path or false on failed
	 *
	 * @param  string  $path  parent dir path
	 * @param string  $name  new file name
	 * @return string|bool
	 * @author Dmitry (dio) Levashov
	 **/
	protected function _mkfile($path, $name) {
		return $this->_filePutContents($path.'/'.$name, '');
	}

	/**
	 * Create symlink. FTP driver does not support symlinks.
	 *
	 * @param  string $target link target
	 * @param  string $path symlink path
	 * @param string $name
	 * @return bool
	 * @author Dmitry (dio) Levashov
	 */
	protected function _symlink($target, $path, $name) {
		return false;
	}

	/**
	 * Copy file into another file
	 *
	 * @param  string  $source     source file path
	 * @param  string  $targetDir  target directory path
	 * @param  string  $name       new file name
	 * @return bool
	 * @author Dmitry (dio) Levashov
	 **/
	protected function _copy($source, $targetDir, $name) {
		$path = $this->_normpath($targetDir.'/'.$name);
		try {
			$this->dropbox->copy($source, $path);
		} catch (Dropbox_Exception $e) {
			return $this->setError('Dropbox error: '.$e->getMessage());
		}
		$this->deltaCheck();
		return true;
	}

	/**
	 * Move file into another parent dir.
	 * Return new file path or false.
	 *
	 * @param  string $source source file path
	 * @param $targetDir
	 * @param  string $name file name
	 * @return bool|string
	 * @internal param string $target target dir path
	 * @author Dmitry (dio) Levashov
	 */
	protected function _move($source, $targetDir, $name) {
		$target = $this->_normpath($targetDir.'/'.$name);
		try {
			$this->dropbox->move($source, $target);
		} catch (Dropbox_Exception $e) {
			return $this->setError('Dropbox error: '.$e->getMessage());
		}
		$this->deltaCheck();
		return $target;
	}

	/**
	 * Remove file
	 *
	 * @param  string  $path  file path
	 * @return bool
	 * @author Dmitry (dio) Levashov
	 **/
	protected function _unlink($path) {
		try {
			$this->dropbox->delete($path);
		} catch (Dropbox_Exception $e) {
			return $this->setError('Dropbox error: '.$e->getMessage());
		}
		$this->deltaCheck();
		return true;
	}

	/**
	 * Remove dir
	 *
	 * @param  string  $path  dir path
	 * @return bool
	 * @author Dmitry (dio) Levashov
	 **/
	protected function _rmdir($path) {
		return $this->_unlink($path);
	}

	/**
	 * Create new file and write into it from file pointer.
	 * Return new file path or false on error.
	 *
	 * @param  resource $fp file pointer
	 * @param string $path
	 * @param  string $name file name
	 * @param  array $stat file stat (required by some virtual fs)
	 * @return bool|string
	 * @internal param string $dir target dir path
	 * @author Dmitry (dio) Levashov
	 */
	protected function _save($fp, $path, $name, $stat) {
		if ($name) $path .= '/'.$name;
		$path = $this->_normpath($path);
		try {
			$this->dropbox->putFile($path, $fp);
		} catch (Dropbox_Exception $e) {
			return $this->setError('Dropbox error: '.$e->getMessage());
		}
		$this->deltaCheck();
		if (is_array($stat)) {
			$raw = $this->getDBdat($path);
			if (isset($stat['width'])) $raw['width'] = $stat['width'];
			if (isset($stat['height'])) $raw['height'] = $stat['height'];
			$this->updateDBdat($path, $raw);
		}
		return $path;
	}

	/**
	 * Get file contents
	 *
	 * @param  string  $path  file path
	 * @return string|false
	 * @author Dmitry (dio) Levashov
	 **/
	protected function _getContents($path) {
		$contents = '';
		try {
			$contents = $this->dropbox->getFile($path);
		} catch (Dropbox_Exception $e) {
			return $this->setError('Dropbox error: '.$e->getMessage());
		}
		return $contents;
	}

	/**
	 * Write a string to a file
	 *
	 * @param  string  $path     file path
	 * @param  string  $content  new file content
	 * @return bool
	 * @author Dmitry (dio) Levashov
	 **/
	protected function _filePutContents($path, $content) {
		$res = false;

		if ($local = $this->getTempFile($path)) {
			if (file_put_contents($local, $content, LOCK_EX) !== false
			&& ($fp = fopen($local, 'rb'))) {
				clearstatcache();
				$res = $this->_save($fp, $path, '', array());
				fclose($fp);
			}
			file_exists($local) && unlink($local);
		}

		return $res;
	}

	/**
	 * Detect available archivers
	 *
	 * @return array
	 **/
	protected function _checkArchivers() {
		// die('Not yet implemented. (_checkArchivers)');
		return array();
	}

	/**
	 * chmod implementation
	 *
	 * @param string $path
	 * @param string $mode
	 * @return bool
	 */
	protected function _chmod($path, $mode) {
		return false;
	}

	/**
	 * Unpack archive
	 *
	 * @param  string  $path  archive path
	 * @param  array   $arc   archiver command and arguments (same as in $this->archivers)
	 * @return true
	 * @return void
	 * @author Dmitry (dio) Levashov
	 * @author Alexey Sukhotin
	 **/
	protected function _unpack($path, $arc) {
		die('Not yet implemented. (_unpack)');
	}

	/**
	 * Recursive symlinks search
	 *
	 * @param  string  $path  file/dir path
	 * @return bool
	 * @author Dmitry (dio) Levashov
	 **/
	protected function _findSymlinks($path) {
		die('Not yet implemented. (_findSymlinks)');
	}

	/**
	 * Extract files from archive
	 *
	 * @param  string  $path  archive path
	 * @param  array   $arc   archiver command and arguments (same as in $this->archivers)
	 * @return true
	 * @author Dmitry (dio) Levashov,
	 * @author Alexey Sukhotin
	 **/
	protected function _extract($path, $arc) {
		die('Not yet implemented. (_extract)');

	}

	/**
	 * Create archive and return its path
	 *
	 * @param  string  $dir    target dir
	 * @param  array   $files  files names list
	 * @param  string  $name   archive name
	 * @param  array   $arc    archiver options
	 * @return string|bool
	 * @author Dmitry (dio) Levashov,
	 * @author Alexey Sukhotin
	 **/
	protected function _archive($dir, $files, $name, $arc) {
		die('Not yet implemented. (_archive)');
	}

} // END class
php/elFinderVolumeGoogleDrive.class.php000064400000213133151215013420014214 0ustar00<?php

/**
 * Simple elFinder driver for GoogleDrive
 * google-api-php-client-2.x or above.
 *
 * @author Dmitry (dio) Levashov
 * @author Cem (discofever)
 **/
class elFinderVolumeGoogleDrive extends elFinderVolumeDriver
{
    /**
     * Driver id
     * Must be started from letter and contains [a-z0-9]
     * Used as part of volume id.
     *
     * @var string
     **/
    protected $driverId = 'gd';

    /**
     * Google API client object.
     *
     * @var object
     **/
    protected $client = null;

    /**
     * GoogleDrive service object.
     *
     * @var object
     **/
    protected $service = null;

    /**
     * Cache of parents of each directories.
     *
     * @var array
     */
    protected $parents = [];

    /**
     * Cache of chiled directories of each directories.
     *
     * @var array
     */
    protected $directories = null;

    /**
     * Cache of itemID => name of each items.
     *
     * @var array
     */
    protected $names = [];

    /**
     * MIME tyoe of directory.
     *
     * @var string
     */
    const DIRMIME = 'application/vnd.google-apps.folder';

    /**
     * Fetch fields for list.
     *
     * @var string
     */
    const FETCHFIELDS_LIST = 'files(id,name,mimeType,modifiedTime,parents,permissions,size,imageMediaMetadata(height,width),thumbnailLink,webContentLink,webViewLink),nextPageToken';

    /**
     * Fetch fields for get.
     *
     * @var string
     */
    const FETCHFIELDS_GET = 'id,name,mimeType,modifiedTime,parents,permissions,size,imageMediaMetadata(height,width),thumbnailLink,webContentLink,webViewLink';

    /**
     * Directory for tmp files
     * If not set driver will try to use tmbDir as tmpDir.
     *
     * @var string
     **/
    protected $tmp = '';

    /**
     * Net mount key.
     *
     * @var string
     **/
    public $netMountKey = '';

    /**
     * Current token expires
     *
     * @var integer
     **/
    private $expires;

    /**
     * Constructor
     * Extend options with required fields.
     *
     * @author Dmitry (dio) Levashov
     * @author Cem (DiscoFever)
     **/
    public function __construct()
    {
        $opts = [
            'client_id' => '',
            'client_secret' => '',
            'access_token' => [],
            'refresh_token' => '',
            'serviceAccountConfigFile' => '',
            'root' => 'My Drive',
            'gdAlias' => '%s@GDrive',
            'googleApiClient' => '',
            'path' => '/',
            'tmbPath' => '',
            'separator' => '/',
            'useGoogleTmb' => true,
            'acceptedName' => '#.#',
            'rootCssClass' => 'elfinder-navbar-root-googledrive',
            'publishPermission' => [
                'type' => 'anyone',
                'role' => 'reader',
                'withLink' => true,
            ],
            'appsExportMap' => [
                'application/vnd.google-apps.document' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
                'application/vnd.google-apps.spreadsheet' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
                'application/vnd.google-apps.drawing' => 'application/pdf',
                'application/vnd.google-apps.presentation' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
                'application/vnd.google-apps.script' => 'application/vnd.google-apps.script+json',
                'default' => 'application/pdf',
            ],
        ];
        $this->options = array_merge($this->options, $opts);
        $this->options['mimeDetect'] = 'internal';
    }

    /*********************************************************************/
    /*                        ORIGINAL FUNCTIONS                         */
    /*********************************************************************/

    /**
     * Get Parent ID, Item ID, Parent Path as an array from path.
     *
     * @param string $path
     *
     * @return array
     */
    protected function _gd_splitPath($path)
    {
        $path = trim($path, '/');
        $pid = '';
        if ($path === '') {
            $id = 'root';
            $parent = '';
        } else {
            $path = str_replace('\\/', chr(0), $path);
            $paths = explode('/', $path);
            $id = array_pop($paths);
            $id = str_replace(chr(0), '/', $id);
            if ($paths) {
                $parent = '/' . implode('/', $paths);
                $pid = array_pop($paths);
            } else {
                $rootid = ($this->root === '/') ? 'root' : trim($this->root, '/');
                if ($id === $rootid) {
                    $parent = '';
                } else {
                    $parent = $this->root;
                    $pid = $rootid;
                }
            }
        }

        return array($pid, $id, $parent);
    }

    /**
     * Drive query and fetchAll.
     *
     * @param string $sql
     *
     * @return bool|array
     */
    private function _gd_query($opts)
    {
        $result = [];
        $pageToken = null;
        $parameters = [
            'fields' => self::FETCHFIELDS_LIST,
            'pageSize' => 1000,
            'spaces' => 'drive',
        ];

        if (is_array($opts)) {
            $parameters = array_merge($parameters, $opts);
        }
        do {
            try {
                if ($pageToken) {
                    $parameters['pageToken'] = $pageToken;
                }
                $files = $this->service->files->listFiles($parameters);

                $result = array_merge($result, $files->getFiles());
                $pageToken = $files->getNextPageToken();
            } catch (Exception $e) {
                $pageToken = null;
            }
        } while ($pageToken);

        return $result;
    }

    /**
     * Get dat(googledrive metadata) from GoogleDrive.
     *
     * @param string $path
     *
     * @return array googledrive metadata
     */
    private function _gd_getFile($path, $fields = '')
    {
        list(, $itemId) = $this->_gd_splitPath($path);
        if (!$fields) {
            $fields = self::FETCHFIELDS_GET;
        }
        try {
            $file = $this->service->files->get($itemId, ['fields' => $fields]);
            if ($file instanceof Google_Service_Drive_DriveFile) {
                return $file;
            } else {
                return [];
            }
        } catch (Exception $e) {
            return [];
        }
    }

    /**
     * Parse line from googledrive metadata output and return file stat (array).
     *
     * @param array $raw line from ftp_rawlist() output
     *
     * @return array
     * @author Dmitry Levashov
     **/
    protected function _gd_parseRaw($raw)
    {
        $stat = [];

        $stat['iid'] = isset($raw['id']) ? $raw['id'] : 'root';
        $stat['name'] = isset($raw['name']) ? $raw['name'] : '';
        if (isset($raw['modifiedTime'])) {
            $stat['ts'] = strtotime($raw['modifiedTime']);
        }

        if ($raw['mimeType'] === self::DIRMIME) {
            $stat['mime'] = 'directory';
            $stat['size'] = 0;
        } else {
            $stat['mime'] = $raw['mimeType'] == 'image/bmp' ? 'image/x-ms-bmp' : $raw['mimeType'];
            $stat['size'] = (int)$raw['size'];
            if ($size = $raw->getImageMediaMetadata()) {
                $stat['width'] = $size['width'];
                $stat['height'] = $size['height'];
            }

            $published = $this->_gd_isPublished($raw);

            if ($this->options['useGoogleTmb']) {
                if (isset($raw['thumbnailLink'])) {
                    if ($published) {
                        $stat['tmb'] = 'drive.google.com/thumbnail?authuser=0&sz=s' . $this->options['tmbSize'] . '&id=' . $raw['id'];
                    } else {
                        $stat['tmb'] = substr($raw['thumbnailLink'], 8); // remove "https://"
                    }
                } else {
                    $stat['tmb'] = '';
                }
            }

            if ($published) {
                $stat['url'] = $this->_gd_getLink($raw);
            } elseif (!$this->disabledGetUrl) {
                $stat['url'] = '1';
            }
        }

        return $stat;
    }

    /**
     * Get dat(googledrive metadata) from GoogleDrive.
     *
     * @param string $path
     *
     * @return array googledrive metadata
     */
    private function _gd_getNameByPath($path)
    {
        list(, $itemId) = $this->_gd_splitPath($path);
        if (!$this->names) {
            $this->_gd_getDirectoryData();
        }

        return isset($this->names[$itemId]) ? $this->names[$itemId] : '';
    }

    /**
     * Make cache of $parents, $names and $directories.
     *
     * @param bool $usecache
     */
    protected function _gd_getDirectoryData($usecache = true)
    {
        if ($usecache) {
            $cache = $this->session->get($this->id . $this->netMountKey, []);
            if ($cache) {
                $this->parents = $cache['parents'];
                $this->names = $cache['names'];
                $this->directories = $cache['directories'];

                return;
            }
        }

        $root = '';
        if ($this->root === '/') {
            // get root id
            if ($res = $this->_gd_getFile('/', 'id')) {
                $root = $res->getId();
            }
        }

        $data = [];
        $opts = [
            'fields' => 'files(id, name, parents)',
            'q' => sprintf('trashed=false and mimeType="%s"', self::DIRMIME),
        ];
        $res = $this->_gd_query($opts);
        foreach ($res as $raw) {
            if ($parents = $raw->getParents()) {
                $id = $raw->getId();
                $this->parents[$id] = $parents;
                $this->names[$id] = $raw->getName();
                foreach ($parents as $p) {
                    if (isset($data[$p])) {
                        $data[$p][] = $id;
                    } else {
                        $data[$p] = [$id];
                    }
                }
            }
        }
        if ($root && isset($data[$root])) {
            $data['root'] = $data[$root];
        }
        $this->directories = $data;
        $this->session->set($this->id . $this->netMountKey, [
            'parents' => $this->parents,
            'names' => $this->names,
            'directories' => $this->directories,
        ]);
    }

    /**
     * Get descendants directories.
     *
     * @param string $itemId
     *
     * @return array
     */
    protected function _gd_getDirectories($itemId)
    {
        $ret = [];
        if ($this->directories === null) {
            $this->_gd_getDirectoryData();
        }
        $data = $this->directories;
        if (isset($data[$itemId])) {
            $ret = $data[$itemId];
            foreach ($data[$itemId] as $cid) {
                $ret = array_merge($ret, $this->_gd_getDirectories($cid));
            }
        }

        return $ret;
    }

    /**
     * Get ID based path from item ID.
     *
     * @param string $id
     *
     * @return array
     */
    protected function _gd_getMountPaths($id)
    {
        $root = false;
        if ($this->directories === null) {
            $this->_gd_getDirectoryData();
        }
        list($pid) = explode('/', $id, 2);
        $path = $id;
        if ('/' . $pid === $this->root) {
            $root = true;
        } elseif (!isset($this->parents[$pid])) {
            $root = true;
            $path = ltrim(substr($path, strlen($pid)), '/');
        }
        $res = [];
        if ($root) {
            if ($this->root === '/' || strpos('/' . $path, $this->root) === 0) {
                $res = [(strpos($path, '/') === false) ? '/' : ('/' . $path)];
            }
        } else {
            foreach ($this->parents[$pid] as $p) {
                $_p = $p . '/' . $path;
                $res = array_merge($res, $this->_gd_getMountPaths($_p));
            }
        }

        return $res;
    }

    /**
     * Return is published.
     *
     * @param object $file
     *
     * @return bool
     */
    protected function _gd_isPublished($file)
    {
        $res = false;
        $pType = $this->options['publishPermission']['type'];
        $pRole = $this->options['publishPermission']['role'];
        if ($permissions = $file->getPermissions()) {
            foreach ($permissions as $permission) {
                if ($permission->type === $pType && $permission->role === $pRole) {
                    $res = true;
                    break;
                }
            }
        }

        return $res;
    }

    /**
     * return item URL link.
     *
     * @param object $file
     *
     * @return string
     */
    protected function _gd_getLink($file)
    {
        if (strpos($file->mimeType, 'application/vnd.google-apps.') !== 0) {
            if ($url = $file->getWebContentLink()) {
                return str_replace('export=download', 'export=media', $url);
            }
        }
        if ($url = $file->getWebViewLink()) {
            return $url;
        }

        return '';
    }

    /**
     * Get download url.
     *
     * @param Google_Service_Drive_DriveFile $file
     *
     * @return string|false
     */
    protected function _gd_getDownloadUrl($file)
    {
        if (strpos($file->mimeType, 'application/vnd.google-apps.') !== 0) {
            return 'https://www.googleapis.com/drive/v3/files/' . $file->getId() . '?alt=media';
        } else {
            $mimeMap = $this->options['appsExportMap'];
            if (isset($mimeMap[$file->getMimeType()])) {
                $mime = $mimeMap[$file->getMimeType()];
            } else {
                $mime = $mimeMap['default'];
            }
            $mime = rawurlencode($mime);

            return 'https://www.googleapis.com/drive/v3/files/' . $file->getId() . '/export?mimeType=' . $mime;
        }

        return false;
    }

    /**
     * Get thumbnail from GoogleDrive.com.
     *
     * @param string $path
     *
     * @return string | boolean
     */
    protected function _gd_getThumbnail($path)
    {
        list(, $itemId) = $this->_gd_splitPath($path);

        try {
            $contents = $this->service->files->get($itemId, [
                'alt' => 'media',
            ]);
            $contents = $contents->getBody()->detach();
            rewind($contents);

            return $contents;
        } catch (Exception $e) {
            return false;
        }
    }

    /**
     * Publish permissions specified path item.
     *
     * @param string $path
     *
     * @return bool
     */
    protected function _gd_publish($path)
    {
        if ($file = $this->_gd_getFile($path)) {
            if ($this->_gd_isPublished($file)) {
                return true;
            }
            try {
                if ($this->service->permissions->create($file->getId(), new \Google_Service_Drive_Permission($this->options['publishPermission']))) {
                    return true;
                }
            } catch (Exception $e) {
                return false;
            }
        }

        return false;
    }

    /**
     * unPublish permissions specified path.
     *
     * @param string $path
     *
     * @return bool
     */
    protected function _gd_unPublish($path)
    {
        if ($file = $this->_gd_getFile($path)) {
            if (!$this->_gd_isPublished($file)) {
                return true;
            }
            $permissions = $file->getPermissions();
            $pType = $this->options['publishPermission']['type'];
            $pRole = $this->options['publishPermission']['role'];
            try {
                foreach ($permissions as $permission) {
                    if ($permission->type === $pType && $permission->role === $pRole) {
                        $this->service->permissions->delete($file->getId(), $permission->getId());

                        return true;
                        break;
                    }
                }
            } catch (Exception $e) {
                return false;
            }
        }

        return false;
    }

    /**
     * Read file chunk.
     *
     * @param resource $handle
     * @param int      $chunkSize
     *
     * @return string
     */
    protected function _gd_readFileChunk($handle, $chunkSize)
    {
        $byteCount = 0;
        $giantChunk = '';
        while (!feof($handle)) {
            // fread will never return more than 8192 bytes if the stream is read buffered and it does not represent a plain file
            $chunk = fread($handle, 8192);
            $byteCount += strlen($chunk);
            $giantChunk .= $chunk;
            if ($byteCount >= $chunkSize) {
                return $giantChunk;
            }
        }

        return $giantChunk;
    }

    /*********************************************************************/
    /*                        EXTENDED FUNCTIONS                         */
    /*********************************************************************/

    /**
     * Prepare
     * Call from elFinder::netmout() before volume->mount().
     *
     * @return array
     * @author Naoki Sawada
     * @author Raja Sharma updating for GoogleDrive
     **/
    public function netmountPrepare($options)
    {
        if (empty($options['client_id']) && defined('ELFINDER_GOOGLEDRIVE_CLIENTID')) {
            $options['client_id'] = ELFINDER_GOOGLEDRIVE_CLIENTID;
        }
        if (empty($options['client_secret']) && defined('ELFINDER_GOOGLEDRIVE_CLIENTSECRET')) {
            $options['client_secret'] = ELFINDER_GOOGLEDRIVE_CLIENTSECRET;
        }
        if (empty($options['googleApiClient']) && defined('ELFINDER_GOOGLEDRIVE_GOOGLEAPICLIENT')) {
            $options['googleApiClient'] = ELFINDER_GOOGLEDRIVE_GOOGLEAPICLIENT;
            include_once $options['googleApiClient'];
        }

        if (!isset($options['pass'])) {
            $options['pass'] = '';
        }

        try {
            $client = new \Google_Client();
            $client->setClientId($options['client_id']);
            $client->setClientSecret($options['client_secret']);

            if ($options['pass'] === 'reauth') {
                $options['pass'] = '';
                $this->session->set('GoogleDriveAuthParams', [])->set('GoogleDriveTokens', []);
            } elseif ($options['pass'] === 'googledrive') {
                $options['pass'] = '';
            }

            $options = array_merge($this->session->get('GoogleDriveAuthParams', []), $options);

            if (!isset($options['access_token'])) {
                $options['access_token'] = $this->session->get('GoogleDriveTokens', []);
                $this->session->remove('GoogleDriveTokens');
            }
            $aToken = $options['access_token'];

            $rootObj = $service = null;
            if ($aToken) {
                try {
                    $client->setAccessToken($aToken);
                    if ($client->isAccessTokenExpired()) {
                        $aToken = array_merge($aToken, $client->fetchAccessTokenWithRefreshToken());
                        $client->setAccessToken($aToken);
                    }
                    $service = new \Google_Service_Drive($client);
                    $rootObj = $service->files->get('root');

                    $options['access_token'] = $aToken;
                    $this->session->set('GoogleDriveAuthParams', $options);
                } catch (Exception $e) {
                    $aToken = [];
                    $options['access_token'] = [];
                    if ($options['user'] !== 'init') {
                        $this->session->set('GoogleDriveAuthParams', $options);

                        return ['exit' => true, 'error' => elFinder::ERROR_REAUTH_REQUIRE];
                    }
                }
            }

            $itpCare = isset($options['code']);
            $code = $itpCare? $options['code'] : (isset($_GET['code'])? $_GET['code'] : '');
            if ($code || (isset($options['user']) && $options['user'] === 'init')) {
                if (empty($options['url'])) {
                    $options['url'] = elFinder::getConnectorUrl();
                }

                if (isset($options['id'])) {
                    $callback = $options['url']
                            . (strpos($options['url'], '?') !== false? '&' : '?') . 'cmd=netmount&protocol=googledrive&host=' . ($options['id'] === 'elfinder'? '1' : $options['id']);
                    $client->setRedirectUri($callback);
                }

                if (!$aToken && empty($code)) {
                    $client->setScopes([Google_Service_Drive::DRIVE]);
                    if (!empty($options['offline'])) {
                        $client->setApprovalPrompt('force');
                        $client->setAccessType('offline');
                    }
                    $url = $client->createAuthUrl();

                    $html = '<input id="elf-volumedriver-googledrive-host-btn" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" value="{msg:btnApprove}" type="button">';
                    $html .= '<script>
                        jQuery("#' . $options['id'] . '").elfinder("instance").trigger("netmount", {protocol: "googledrive", mode: "makebtn", url: "' . $url . '"});
                    </script>';
                    if (empty($options['pass']) && $options['host'] !== '1') {
                        $options['pass'] = 'return';
                        $this->session->set('GoogleDriveAuthParams', $options);

                        return ['exit' => true, 'body' => $html];
                    } else {
                        $out = [
                            'node' => $options['id'],
                            'json' => '{"protocol": "googledrive", "mode": "makebtn", "body" : "' . str_replace($html, '"', '\\"') . '", "error" : "' . elFinder::ERROR_ACCESS_DENIED . '"}',
                            'bind' => 'netmount',
                        ];

                        return ['exit' => 'callback', 'out' => $out];
                    }
                } else {
                    if ($code) {
                        if (!empty($options['id'])) {
                            $aToken = $client->fetchAccessTokenWithAuthCode($code);
                            $options['access_token'] = $aToken;
                            unset($options['code']);
                            $this->session->set('GoogleDriveTokens', $aToken)->set('GoogleDriveAuthParams', $options);
                            $out = [
                                'node' => $options['id'],
                                'json' => '{"protocol": "googledrive", "mode": "done", "reset": 1}',
                                'bind' => 'netmount',
                            ];
                        } else {
                            $nodeid = ($_GET['host'] === '1')? 'elfinder' : $_GET['host'];
                            $out = array(
                                'node' => $nodeid,
                                'json' => json_encode(array(
                                    'protocol' => 'googledrive',
                                    'host' => $nodeid,
                                    'mode' => 'redirect',
                                    'options' => array(
                                        'id' => $nodeid,
                                        'code'=> $code
                                    )
                                )),
                                'bind' => 'netmount'
                            );
                        }
                        if (!$itpCare) {
                            return array('exit' => 'callback', 'out' => $out);
                        } else {
                            return array('exit' => true, 'body' => $out['json']);
                        }
                    }
                    $path = $options['path'];
                    if ($path === '/') {
                        $path = 'root';
                    }
                    $folders = [];
                    foreach ($service->files->listFiles([
                        'pageSize' => 1000,
                        'q' => sprintf('trashed = false and "%s" in parents and mimeType = "application/vnd.google-apps.folder"', $path),
                    ]) as $f) {
                        $folders[$f->getId()] = $f->getName();
                    }
                    natcasesort($folders);

                    if ($options['pass'] === 'folders') {
                        return ['exit' => true, 'folders' => $folders];
                    }

                    $folders = ['root' => $rootObj->getName()] + $folders;
                    $folders = json_encode($folders);
                    $expires = empty($aToken['refresh_token']) ? $aToken['created'] + $aToken['expires_in'] - 30 : 0;
                    $mnt2res = empty($aToken['refresh_token']) ? '' : ', "mnt2res": 1';
                    $json = '{"protocol": "googledrive", "mode": "done", "folders": ' . $folders . ', "expires": ' . $expires . $mnt2res . '}';
                    $options['pass'] = 'return';
                    $html = 'Google.com';
                    $html .= '<script>
                        jQuery("#' . $options['id'] . '").elfinder("instance").trigger("netmount", ' . $json . ');
                    </script>';
                    $this->session->set('GoogleDriveAuthParams', $options);

                    return ['exit' => true, 'body' => $html];
                }
            }
        } catch (Exception $e) {
            $this->session->remove('GoogleDriveAuthParams')->remove('GoogleDriveTokens');
            if (empty($options['pass'])) {
                return ['exit' => true, 'body' => '{msg:' . elFinder::ERROR_ACCESS_DENIED . '}' . ' ' . $e->getMessage()];
            } else {
                return ['exit' => true, 'error' => [elFinder::ERROR_ACCESS_DENIED, $e->getMessage()]];
            }
        }

        if (!$aToken) {
            return ['exit' => true, 'error' => elFinder::ERROR_REAUTH_REQUIRE];
        }

        if ($options['path'] === '/') {
            $options['path'] = 'root';
        }

        try {
            $file = $service->files->get($options['path']);
            $options['alias'] = sprintf($this->options['gdAlias'], $file->getName());
        } catch (Google_Service_Exception $e) {
            $err = json_decode($e->getMessage(), true);
            if (isset($err['error']) && $err['error']['code'] == 404) {
                return ['exit' => true, 'error' => [elFinder::ERROR_TRGDIR_NOT_FOUND, $options['path']]];
            } else {
                return ['exit' => true, 'error' => $e->getMessage()];
            }
        } catch (Exception $e) {
            return ['exit' => true, 'error' => $e->getMessage()];
        }

        foreach (['host', 'user', 'pass', 'id', 'offline'] as $key) {
            unset($options[$key]);
        }

        return $options;
    }

    /**
     * process of on netunmount
     * Drop `googledrive` & rm thumbs.
     *
     * @param $netVolumes
     * @param $key
     *
     * @return bool
     */
    public function netunmount($netVolumes, $key)
    {
        if (!$this->options['useGoogleTmb']) {
            if ($tmbs = glob(rtrim($this->options['tmbPath'], '\\/') . DIRECTORY_SEPARATOR . $this->netMountKey . '*.png')) {
                foreach ($tmbs as $file) {
                    unlink($file);
                }
            }
        }
        $this->session->remove($this->id . $this->netMountKey);

        return true;
    }

    /**
     * Return fileinfo based on filename
     * For item ID based path file system
     * Please override if needed on each drivers.
     *
     * @param string $path file cache
     *
     * @return array
     */
    protected function isNameExists($path)
    {
        list($parentId, $name) = $this->_gd_splitPath($path);
        $opts = [
            'q' => sprintf('trashed=false and "%s" in parents and name="%s"', $parentId, $name),
            'fields' => self::FETCHFIELDS_LIST,
        ];
        $srcFile = $this->_gd_query($opts);

        return empty($srcFile) ? false : $this->_gd_parseRaw($srcFile[0]);
    }

    /*********************************************************************/
    /*                        INIT AND CONFIGURE                         */
    /*********************************************************************/

    /**
     * Prepare FTP connection
     * Connect to remote server and check if credentials are correct, if so, store the connection id in $ftp_conn.
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     * @author Cem (DiscoFever)
     **/
    protected function init()
    {
        $serviceAccountConfig = '';
        if (empty($this->options['serviceAccountConfigFile'])) {
            if (empty($options['client_id'])) {
                if (defined('ELFINDER_GOOGLEDRIVE_CLIENTID') && ELFINDER_GOOGLEDRIVE_CLIENTID) {
                    $this->options['client_id'] = ELFINDER_GOOGLEDRIVE_CLIENTID;
                } else {
                    return $this->setError('Required option "client_id" is undefined.');
                }
            }
            if (empty($options['client_secret'])) {
                if (defined('ELFINDER_GOOGLEDRIVE_CLIENTSECRET') && ELFINDER_GOOGLEDRIVE_CLIENTSECRET) {
                    $this->options['client_secret'] = ELFINDER_GOOGLEDRIVE_CLIENTSECRET;
                } else {
                    return $this->setError('Required option "client_secret" is undefined.');
                }
            }
            if (!$this->options['access_token'] && !$this->options['refresh_token']) {
                return $this->setError('Required option "access_token" or "refresh_token" is undefined.');
            }
        } else {
            if (!is_readable($this->options['serviceAccountConfigFile'])) {
                return $this->setError('Option "serviceAccountConfigFile" file is not readable.');
            }
            $serviceAccountConfig = $this->options['serviceAccountConfigFile'];
        }

        try {
            if (!$serviceAccountConfig) {
                $aTokenFile = '';
                if ($this->options['refresh_token']) {
                    // permanent mount
                    $aToken = $this->options['refresh_token'];
                    $this->options['access_token'] = '';
                    $tmp = elFinder::getStaticVar('commonTempPath');
                    if (!$tmp) {
                        $tmp = $this->getTempPath();
                    }
                    if ($tmp) {
                        $aTokenFile = $tmp . DIRECTORY_SEPARATOR . md5($this->options['client_id'] . $this->options['refresh_token']) . '.gtoken';
                        if (is_file($aTokenFile)) {
                            $this->options['access_token'] = json_decode(file_get_contents($aTokenFile), true);
                        }
                    }
                } else {
                    // make net mount key for network mount
                    if (is_array($this->options['access_token'])) {
                        $aToken = !empty($this->options['access_token']['refresh_token'])
                            ? $this->options['access_token']['refresh_token']
                            : $this->options['access_token']['access_token'];
                    } else {
                        return $this->setError('Required option "access_token" is not Array or empty.');
                    }
                }
            }

            $errors = [];
            if ($this->needOnline && !$this->service) {
                if (($this->options['googleApiClient'] || defined('ELFINDER_GOOGLEDRIVE_GOOGLEAPICLIENT')) && !class_exists('Google_Client')) {
                    include_once $this->options['googleApiClient'] ? $this->options['googleApiClient'] : ELFINDER_GOOGLEDRIVE_GOOGLEAPICLIENT;
                }
                if (!class_exists('Google_Client')) {
                    return $this->setError('Class Google_Client not found.');
                }

                $this->client = new \Google_Client();

                $client = $this->client;

                if (!$serviceAccountConfig) {
                    if ($this->options['access_token']) {
                        $client->setAccessToken($this->options['access_token']);
                        $access_token = $this->options['access_token'];
                    }
                    if ($client->isAccessTokenExpired()) {
                        $client->setClientId($this->options['client_id']);
                        $client->setClientSecret($this->options['client_secret']);
                        $access_token = $client->fetchAccessTokenWithRefreshToken($this->options['refresh_token'] ?: null);
                        $client->setAccessToken($access_token);
                        if ($aTokenFile) {
                            file_put_contents($aTokenFile, json_encode($access_token));
                        } else {
                            $access_token['refresh_token'] = $this->options['access_token']['refresh_token'];
                        }
                        if (!empty($this->options['netkey'])) {
                            elFinder::$instance->updateNetVolumeOption($this->options['netkey'], 'access_token', $access_token);
                        }
                        $this->options['access_token'] = $access_token;
                    }
                    $this->expires = empty($access_token['refresh_token']) ? $access_token['created'] + $access_token['expires_in'] - 30 : 0;
                } else {
                    $client->setAuthConfigFile($serviceAccountConfig);
                    $client->setScopes([Google_Service_Drive::DRIVE]);
                    $aToken = $client->getClientId();
                }
                $this->service = new \Google_Service_Drive($client);
            }

            if ($this->needOnline) {
                $this->netMountKey = md5($aToken . '-' . $this->options['path']);
            }
        } catch (InvalidArgumentException $e) {
            $errors[] = $e->getMessage();
        } catch (Google_Service_Exception $e) {
            $errors[] = $e->getMessage();
        }

        if ($this->needOnline && !$this->service) {
            $this->session->remove($this->id . $this->netMountKey);
            if ($aTokenFile) {
                if (is_file($aTokenFile)) {
                    unlink($aTokenFile);
                }
            }
            $errors[] = 'Google Drive Service could not be loaded.';

            return $this->setError($errors);
        }

        // normalize root path
        if ($this->options['path'] == 'root') {
            $this->options['path'] = '/';
        }
        $this->root = $this->options['path'] = $this->_normpath($this->options['path']);

        if (empty($this->options['alias'])) {
            if ($this->needOnline) {
                $this->options['root'] = ($this->options['root'] === '')? $this->_gd_getNameByPath('root') : $this->options['root'];
                $this->options['alias'] = ($this->options['path'] === '/') ? $this->options['root'] : sprintf($this->options['gdAlias'], $this->_gd_getNameByPath($this->options['path']));
                if (!empty($this->options['netkey'])) {
                    elFinder::$instance->updateNetVolumeOption($this->options['netkey'], 'alias', $this->options['alias']);
                }
            } else {
                $this->options['root'] = ($this->options['root'] === '')? 'GoogleDrive' : $this->options['root'];
                $this->options['alias'] = $this->options['root'];
            }
        }

        $this->rootName = isset($this->options['alias'])? $this->options['alias'] : 'GoogleDrive';

        if (!empty($this->options['tmpPath'])) {
            if ((is_dir($this->options['tmpPath']) || mkdir($this->options['tmpPath'])) && is_writable($this->options['tmpPath'])) {
                $this->tmp = $this->options['tmpPath'];
            }
        }

        if (!$this->tmp && ($tmp = elFinder::getStaticVar('commonTempPath'))) {
            $this->tmp = $tmp;
        }

        // This driver dose not support `syncChkAsTs`
        $this->options['syncChkAsTs'] = false;

        // 'lsPlSleep' minmum 10 sec
        $this->options['lsPlSleep'] = max(10, $this->options['lsPlSleep']);

        if ($this->options['useGoogleTmb']) {
            $this->options['tmbURL'] = 'https://';
            $this->options['tmbPath'] = '';
        }

        // enable command archive
        $this->options['useRemoteArchive'] = true;

        return true;
    }

    /**
     * Configure after successfull mount.
     *
     * @author Dmitry (dio) Levashov
     **/
    protected function configure()
    {
        parent::configure();

        // fallback of $this->tmp
        if (!$this->tmp && $this->tmbPathWritable) {
            $this->tmp = $this->tmbPath;
        }

        if ($this->needOnline && $this->isMyReload()) {
            $this->_gd_getDirectoryData(false);
        }
    }

    /*********************************************************************/
    /*                               FS API                              */
    /*********************************************************************/

    /**
     * Close opened connection.
     *
     * @author Dmitry (dio) Levashov
     **/
    public function umount()
    {
    }

    /**
     * Cache dir contents.
     *
     * @param string $path dir path
     *
     * @return array
     * @author Dmitry Levashov
     */
    protected function cacheDir($path)
    {
        $this->dirsCache[$path] = [];
        $hasDir = false;

        list(, $pid) = $this->_gd_splitPath($path);

        $opts = [
            'fields' => self::FETCHFIELDS_LIST,
            'q' => sprintf('trashed=false and "%s" in parents', $pid),
        ];

        $res = $this->_gd_query($opts);

        $mountPath = $this->_normpath($path . '/');

        if ($res) {
            foreach ($res as $raw) {
                if ($stat = $this->_gd_parseRaw($raw)) {
                    $stat = $this->updateCache($mountPath . $raw->id, $stat);
                    if (empty($stat['hidden']) && $path !== $mountPath . $raw->id) {
                        if (!$hasDir && $stat['mime'] === 'directory') {
                            $hasDir = true;
                        }
                        $this->dirsCache[$path][] = $mountPath . $raw->id;
                    }
                }
            }
        }

        if (isset($this->sessionCache['subdirs'])) {
            $this->sessionCache['subdirs'][$path] = $hasDir;
        }

        return $this->dirsCache[$path];
    }

    /**
     * Recursive files search.
     *
     * @param string $path dir path
     * @param string $q    search string
     * @param array  $mimes
     *
     * @return array
     * @throws elFinderAbortException
     * @author Naoki Sawada
     */
    protected function doSearch($path, $q, $mimes)
    {
        if (!empty($this->doSearchCurrentQuery['matchMethod'])) {
            // has custom match method use elFinderVolumeDriver::doSearch()
            return parent::doSearch($path, $q, $mimes);
        }

        list(, $itemId) = $this->_gd_splitPath($path);

        $path = $this->_normpath($path . '/');
        $result = [];
        $query = '';

        if ($itemId !== 'root') {
            $dirs = array_merge([$itemId], $this->_gd_getDirectories($itemId));
            $query = '(\'' . implode('\' in parents or \'', $dirs) . '\' in parents)';
        }

        $tmp = [];
        if (!$mimes) {
            foreach (explode(' ', $q) as $_v) {
                $tmp[] = 'fullText contains \'' . str_replace('\'', '\\\'', $_v) . '\'';
            }
            $query .= ($query ? ' and ' : '') . implode(' and ', $tmp);
        } else {
            foreach ($mimes as $_v) {
                $tmp[] = 'mimeType contains \'' . str_replace('\'', '\\\'', $_v) . '\'';
            }
            $query .= ($query ? ' and ' : '') . '(' . implode(' or ', $tmp) . ')';
        }

        $opts = [
            'q' => sprintf('trashed=false and (%s)', $query),
        ];

        $res = $this->_gd_query($opts);

        $timeout = $this->options['searchTimeout'] ? $this->searchStart + $this->options['searchTimeout'] : 0;
        foreach ($res as $raw) {
            if ($timeout && $timeout < time()) {
                $this->setError(elFinder::ERROR_SEARCH_TIMEOUT, $this->_path($path));
                break;
            }
            if ($stat = $this->_gd_parseRaw($raw)) {
                if ($parents = $raw->getParents()) {
                    foreach ($parents as $parent) {
                        $paths = $this->_gd_getMountPaths($parent);
                        foreach ($paths as $path) {
                            $path = ($path === '') ? '/' : (rtrim($path, '/') . '/');
                            if (!isset($this->cache[$path . $raw->id])) {
                                $stat = $this->updateCache($path . $raw->id, $stat);
                            } else {
                                $stat = $this->cache[$path . $raw->id];
                            }
                            if (empty($stat['hidden'])) {
                                $stat['path'] = $this->_path($path) . $stat['name'];
                                $result[] = $stat;
                            }
                        }
                    }
                }
            }
        }

        return $result;
    }

    /**
     * Copy file/recursive copy dir only in current volume.
     * Return new file path or false.
     *
     * @param string $src  source path
     * @param string $dst  destination dir path
     * @param string $name new file name (optionaly)
     *
     * @return string|false
     * @author Dmitry (dio) Levashov
     * @author Naoki Sawada
     **/
    protected function copy($src, $dst, $name)
    {
        $this->clearcache();
        $res = $this->_gd_getFile($src);
        if ($res['mimeType'] == self::DIRMIME) {
            $newDir = $this->_mkdir($dst, $name);
            if ($newDir) {
                list(, $itemId) = $this->_gd_splitPath($newDir);
                list(, $srcId) = $this->_gd_splitPath($src);
                $path = $this->_joinPath($dst, $itemId);
                $opts = [
                    'q' => sprintf('trashed=false and "%s" in parents', $srcId),
                ];

                $res = $this->_gd_query($opts);
                foreach ($res as $raw) {
                    $raw['mimeType'] == self::DIRMIME ? $this->copy($src . '/' . $raw['id'], $path, $raw['name']) : $this->_copy($src . '/' . $raw['id'], $path, $raw['name']);
                }

                $ret = $this->_joinPath($dst, $itemId);
                $this->added[] = $this->stat($ret);
            } else {
                $ret = $this->setError(elFinder::ERROR_COPY, $this->_path($src));
            }
        } else {
            if ($itemId = $this->_copy($src, $dst, $name)) {
                $ret = $this->_joinPath($dst, $itemId);
                $this->added[] = $this->stat($ret);
            } else {
                $ret = $this->setError(elFinder::ERROR_COPY, $this->_path($src));
            }
        }
        return $ret;
    }

    /**
     * Remove file/ recursive remove dir.
     *
     * @param string $path  file path
     * @param bool   $force try to remove even if file locked
     * @param bool   $recursive
     *
     * @return bool
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     * @author Naoki Sawada
     */
    protected function remove($path, $force = false, $recursive = false)
    {
        $stat = $this->stat($path);
        $stat['realpath'] = $path;
        $this->rmTmb($stat);
        $this->clearcache();

        if (empty($stat)) {
            return $this->setError(elFinder::ERROR_RM, $this->_path($path), elFinder::ERROR_FILE_NOT_FOUND);
        }

        if (!$force && !empty($stat['locked'])) {
            return $this->setError(elFinder::ERROR_LOCKED, $this->_path($path));
        }

        if ($stat['mime'] == 'directory') {
            if (!$recursive && !$this->_rmdir($path)) {
                return $this->setError(elFinder::ERROR_RM, $this->_path($path));
            }
        } else {
            if (!$recursive && !$this->_unlink($path)) {
                return $this->setError(elFinder::ERROR_RM, $this->_path($path));
            }
        }

        $this->removed[] = $stat;

        return true;
    }

    /**
     * Create thumnbnail and return it's URL on success.
     *
     * @param string $path file path
     * @param        $stat
     *
     * @return string|false
     * @throws ImagickException
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     * @author Naoki Sawada
     */
    protected function createTmb($path, $stat)
    {
        if (!$stat || !$this->canCreateTmb($path, $stat)) {
            return false;
        }

        $name = $this->tmbname($stat);
        $tmb = $this->tmbPath . DIRECTORY_SEPARATOR . $name;

        // copy image into tmbPath so some drivers does not store files on local fs
        if (!$data = $this->_gd_getThumbnail($path)) {
            return false;
        }
        if (!file_put_contents($tmb, $data)) {
            return false;
        }

        $result = false;

        $tmbSize = $this->tmbSize;

        if (($s = getimagesize($tmb)) == false) {
            return false;
        }

        /* If image smaller or equal thumbnail size - just fitting to thumbnail square */
        if ($s[0] <= $tmbSize && $s[1] <= $tmbSize) {
            $result = $this->imgSquareFit($tmb, $tmbSize, $tmbSize, 'center', 'middle', $this->options['tmbBgColor'], 'png');
        } else {
            if ($this->options['tmbCrop']) {

                /* Resize and crop if image bigger than thumbnail */
                if (!(($s[0] > $tmbSize && $s[1] <= $tmbSize) || ($s[0] <= $tmbSize && $s[1] > $tmbSize)) || ($s[0] > $tmbSize && $s[1] > $tmbSize)) {
                    $result = $this->imgResize($tmb, $tmbSize, $tmbSize, true, false, 'png');
                }

                if (($s = getimagesize($tmb)) != false) {
                    $x = $s[0] > $tmbSize ? intval(($s[0] - $tmbSize) / 2) : 0;
                    $y = $s[1] > $tmbSize ? intval(($s[1] - $tmbSize) / 2) : 0;
                    $result = $this->imgCrop($tmb, $tmbSize, $tmbSize, $x, $y, 'png');
                }
            } else {
                $result = $this->imgResize($tmb, $tmbSize, $tmbSize, true, true, 'png');
            }

            $result = $this->imgSquareFit($tmb, $tmbSize, $tmbSize, 'center', 'middle', $this->options['tmbBgColor'], 'png');
        }

        if (!$result) {
            unlink($tmb);

            return false;
        }

        return $name;
    }

    /**
     * Return thumbnail file name for required file.
     *
     * @param array $stat file stat
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function tmbname($stat)
    {
        return $this->netMountKey . $stat['iid'] . $stat['ts'] . '.png';
    }

    /**
     * Return content URL (for netmout volume driver)
     * If file.url == 1 requests from JavaScript client with XHR.
     *
     * @param string $hash    file hash
     * @param array  $options options array
     *
     * @return bool|string
     * @author Naoki Sawada
     */
    public function getContentUrl($hash, $options = [])
    {
        if (!empty($options['onetime']) && $this->options['onetimeUrl']) {
            return parent::getContentUrl($hash, $options);
        }
        if (!empty($options['temporary'])) {
            // try make temporary file
            $url = parent::getContentUrl($hash, $options);
            if ($url) {
                return $url;
            }
        }
        if (($file = $this->file($hash)) == false || !$file['url'] || $file['url'] == 1) {
            $path = $this->decode($hash);

            if ($this->_gd_publish($path)) {
                if ($raw = $this->_gd_getFile($path)) {
                    return $this->_gd_getLink($raw);
                }
            }
        }

        return false;
    }

    /**
     * Return debug info for client.
     *
     * @return array
     **/
    public function debug()
    {
        $res = parent::debug();
        if (!empty($this->options['netkey']) && empty($this->options['refresh_token']) && $this->options['access_token'] && isset($this->options['access_token']['refresh_token'])) {
            $res['refresh_token'] = $this->options['access_token']['refresh_token'];
        }

        return $res;
    }

    /*********************** paths/urls *************************/

    /**
     * Return parent directory path.
     *
     * @param string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _dirname($path)
    {
        list(, , $parent) = $this->_gd_splitPath($path);

        return $this->_normpath($parent);
    }

    /**
     * Return file name.
     *
     * @param string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _basename($path)
    {
        list(, $basename) = $this->_gd_splitPath($path);

        return $basename;
    }

    /**
     * Join dir name and file name and retur full path.
     *
     * @param string $dir
     * @param string $name
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _joinPath($dir, $name)
    {
        return $this->_normpath($dir . '/' . str_replace('/', '\\/', $name));
    }

    /**
     * Return normalized path, this works the same as os.path.normpath() in Python.
     *
     * @param string $path path
     *
     * @return string
     * @author Troex Nevelin
     **/
    protected function _normpath($path)
    {
        if (DIRECTORY_SEPARATOR !== '/') {
            $path = str_replace(DIRECTORY_SEPARATOR, '/', $path);
        }
        $path = '/' . ltrim($path, '/');

        return $path;
    }

    /**
     * Return file path related to root dir.
     *
     * @param string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _relpath($path)
    {
        return $path;
    }

    /**
     * Convert path related to root dir into real path.
     *
     * @param string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _abspath($path)
    {
        return $path;
    }

    /**
     * Return fake path started from root dir.
     *
     * @param string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _path($path)
    {
        if (!$this->names) {
            $this->_gd_getDirectoryData();
        }
        $path = $this->_normpath(substr($path, strlen($this->root)));
        $names = [];
        $paths = explode('/', $path);
        foreach ($paths as $_p) {
            $names[] = isset($this->names[$_p]) ? $this->names[$_p] : $_p;
        }

        return $this->rootName . implode('/', $names);
    }

    /**
     * Return true if $path is children of $parent.
     *
     * @param string $path   path to check
     * @param string $parent parent path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _inpath($path, $parent)
    {
        return $path == $parent || strpos($path, $parent . '/') === 0;
    }

    /***************** file stat ********************/
    /**
     * Return stat for given path.
     * Stat contains following fields:
     * - (int)    size    file size in b. required
     * - (int)    ts      file modification time in unix time. required
     * - (string) mime    mimetype. required for folders, others - optionally
     * - (bool)   read    read permissions. required
     * - (bool)   write   write permissions. required
     * - (bool)   locked  is object locked. optionally
     * - (bool)   hidden  is object hidden. optionally
     * - (string) alias   for symlinks - link target path relative to root path. optionally
     * - (string) target  for symlinks - link target path. optionally.
     * If file does not exists - returns empty array or false.
     *
     * @param string $path file path
     *
     * @return array|false
     * @author Dmitry (dio) Levashov
     **/
    protected function _stat($path)
    {
        if ($raw = $this->_gd_getFile($path)) {
            $stat = $this->_gd_parseRaw($raw);
            if ($path === $this->root) {
                $stat['expires'] = $this->expires;
            }
            return $stat;
        }

        return false;
    }

    /**
     * Return true if path is dir and has at least one childs directory.
     *
     * @param string $path dir path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _subdirs($path)
    {
        if ($this->directories === null) {
            $this->_gd_getDirectoryData();
        }
        list(, $itemId) = $this->_gd_splitPath($path);

        return isset($this->directories[$itemId]);
    }

    /**
     * Return object width and height
     * Ususaly used for images, but can be realize for video etc...
     *
     * @param string $path file path
     * @param string $mime file mime type
     *
     * @return string
     * @throws ImagickException
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function _dimensions($path, $mime)
    {
        if (strpos($mime, 'image') !== 0) {
            return '';
        }
        $ret = '';

        if ($file = $this->_gd_getFile($path)) {
            if (isset($file['imageMediaMetadata'])) {
                $ret = array('dim' => $file['imageMediaMetadata']['width'] . 'x' . $file['imageMediaMetadata']['height']);
                if (func_num_args() > 2) {
                    $args = func_get_arg(2);
                } else {
                    $args = array();
                }
                if (!empty($args['substitute'])) {
                    $tmbSize = intval($args['substitute']);
                    $srcSize = explode('x', $ret['dim']);
                    if ($srcSize[0] && $srcSize[1]) {
                        if (min(($tmbSize / $srcSize[0]), ($tmbSize / $srcSize[1])) < 1) {
                            if ($this->_gd_isPublished($file)) {
                                $tmbSize = strval($tmbSize);
                                $ret['url'] = 'https://drive.google.com/thumbnail?authuser=0&sz=s' . $tmbSize . '&id=' . $file['id'];
                            } elseif ($subImgLink = $this->getSubstituteImgLink(elFinder::$currentArgs['target'], $srcSize)) {
                                $ret['url'] = $subImgLink;
                            }
                        }
                    }
                }
            }
        }

        return $ret;
    }

    /******************** file/dir content *********************/

    /**
     * Return files list in directory.
     *
     * @param string $path dir path
     *
     * @return array
     * @author Dmitry (dio) Levashov
     * @author Cem (DiscoFever)
     **/
    protected function _scandir($path)
    {
        return isset($this->dirsCache[$path])
            ? $this->dirsCache[$path]
            : $this->cacheDir($path);
    }

    /**
     * Open file and return file pointer.
     *
     * @param string $path  file path
     * @param bool   $write open file for writing
     *
     * @return resource|false
     * @author Dmitry (dio) Levashov
     **/
    protected function _fopen($path, $mode = 'rb')
    {
        if ($mode === 'rb' || $mode === 'r') {
            if ($file = $this->_gd_getFile($path)) {
                if ($dlurl = $this->_gd_getDownloadUrl($file)) {
                    $token = $this->client->getAccessToken();
                    if (!$token && $this->client->isUsingApplicationDefaultCredentials()) {
                        $this->client->fetchAccessTokenWithAssertion();
                        $token = $this->client->getAccessToken();
                    }
                    $access_token = '';
                    if (is_array($token)) {
                        $access_token = $token['access_token'];
                    } else {
                        if ($token = json_decode($this->client->getAccessToken())) {
                            $access_token = $token->access_token;
                        }
                    }
                    if ($access_token) {
                        $data = array(
                            'target' => $dlurl,
                            'headers' => array('Authorization: Bearer ' . $access_token),
                        );

                        // to support range request
                        if (func_num_args() > 2) {
                            $opts = func_get_arg(2);
                        } else {
                            $opts = array();
                        }
                        if (!empty($opts['httpheaders'])) {
                            $data['headers'] = array_merge($opts['httpheaders'], $data['headers']);
                        }

                        return elFinder::getStreamByUrl($data);
                    }
                }
            }
        }

        return false;
    }

    /**
     * Close opened file.
     *
     * @param resource $fp file pointer
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _fclose($fp, $path = '')
    {
        is_resource($fp) && fclose($fp);
        if ($path) {
            unlink($this->getTempFile($path));
        }
    }

    /********************  file/dir manipulations *************************/

    /**
     * Create dir and return created dir path or false on failed.
     *
     * @param string $path parent dir path
     * @param string $name new directory name
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _mkdir($path, $name)
    {
        $path = $this->_joinPath($path, $name);
        list($parentId, , $parent) = $this->_gd_splitPath($path);

        try {
            $file = new \Google_Service_Drive_DriveFile();

            $file->setName($name);
            $file->setMimeType(self::DIRMIME);
            $file->setParents([$parentId]);

            //create the Folder in the Parent
            $obj = $this->service->files->create($file);

            if ($obj instanceof Google_Service_Drive_DriveFile) {
                $path = $this->_joinPath($parent, $obj['id']);
                $this->_gd_getDirectoryData(false);

                return $path;
            } else {
                return false;
            }
        } catch (Exception $e) {
            return $this->setError('GoogleDrive error: ' . $e->getMessage());
        }
    }

    /**
     * Create file and return it's path or false on failed.
     *
     * @param string $path parent dir path
     * @param string $name new file name
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _mkfile($path, $name)
    {
        return $this->_save($this->tmpfile(), $path, $name, []);
    }

    /**
     * Create symlink. FTP driver does not support symlinks.
     *
     * @param string $target link target
     * @param string $path   symlink path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _symlink($target, $path, $name)
    {
        return false;
    }

    /**
     * Copy file into another file.
     *
     * @param string $source    source file path
     * @param string $targetDir target directory path
     * @param string $name      new file name
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _copy($source, $targetDir, $name)
    {
        $source = $this->_normpath($source);
        $targetDir = $this->_normpath($targetDir);

        try {
            $file = new \Google_Service_Drive_DriveFile();
            $file->setName($name);

            //Set the Parent id
            list(, $parentId) = $this->_gd_splitPath($targetDir);
            $file->setParents([$parentId]);

            list(, $srcId) = $this->_gd_splitPath($source);
            $file = $this->service->files->copy($srcId, $file, ['fields' => self::FETCHFIELDS_GET]);
            $itemId = $file->id;

            return $itemId;
        } catch (Exception $e) {
            return $this->setError('GoogleDrive error: ' . $e->getMessage());
        }

        return true;
    }

    /**
     * Move file into another parent dir.
     * Return new file path or false.
     *
     * @param string $source source file path
     * @param string $target target dir path
     * @param string $name   file name
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _move($source, $targetDir, $name)
    {
        list($removeParents, $itemId) = $this->_gd_splitPath($source);
        $target = $this->_normpath($targetDir . '/' . $itemId);
        try {
            //moving and renaming a file or directory
            $files = new \Google_Service_Drive_DriveFile();
            $files->setName($name);

            //Set new Parent and remove old parent
            list(, $addParents) = $this->_gd_splitPath($targetDir);
            $opts = ['addParents' => $addParents, 'removeParents' => $removeParents];

            $file = $this->service->files->update($itemId, $files, $opts);

            if ($file->getMimeType() === self::DIRMIME) {
                $this->_gd_getDirectoryData(false);
            }
        } catch (Exception $e) {
            return $this->setError('GoogleDrive error: ' . $e->getMessage());
        }

        return $target;
    }

    /**
     * Remove file.
     *
     * @param string $path file path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _unlink($path)
    {
        try {
            $files = new \Google_Service_Drive_DriveFile();
            $files->setTrashed(true);

            list($pid, $itemId) = $this->_gd_splitPath($path);
            $opts = ['removeParents' => $pid];
            $this->service->files->update($itemId, $files, $opts);
        } catch (Exception $e) {
            return $this->setError('GoogleDrive error: ' . $e->getMessage());
        }

        return true;
    }

    /**
     * Remove dir.
     *
     * @param string $path dir path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _rmdir($path)
    {
        $res = $this->_unlink($path);
        $res && $this->_gd_getDirectoryData(false);

        return $res;
    }

    /**
     * Create new file and write into it from file pointer.
     * Return new file path or false on error.
     *
     * @param resource $fp   file pointer
     * @param          $path
     * @param string   $name file name
     * @param array    $stat file stat (required by some virtual fs)
     *
     * @return bool|string
     * @author Dmitry (dio) Levashov
     */
    protected function _save($fp, $path, $name, $stat)
    {
        if ($name !== '') {
            $path .= '/' . str_replace('/', '\\/', $name);
        }
        list($parentId, $itemId, $parent) = $this->_gd_splitPath($path);
        if ($name === '') {
            $stat['iid'] = $itemId;
        }

        if (!$stat || empty($stat['iid'])) {
            $opts = [
                'q' => sprintf('trashed=false and "%s" in parents and name="%s"', $parentId, $name),
                'fields' => self::FETCHFIELDS_LIST,
            ];
            $srcFile = $this->_gd_query($opts);
            $srcFile = empty($srcFile) ? null : $srcFile[0];
        } else {
            $srcFile = $this->_gd_getFile($path);
        }

        try {
            $mode = 'update';
            $mime = isset($stat['mime']) ? $stat['mime'] : '';

            $file = new Google_Service_Drive_DriveFile();
            if ($srcFile) {
                $mime = $srcFile->getMimeType();
            } else {
                $mode = 'insert';
                $file->setName($name);
                $file->setParents([
                    $parentId,
                ]);
            }

            if (!$mime) {
                $mime = self::mimetypeInternalDetect($name);
            }
            if ($mime === 'unknown') {
                $mime = 'application/octet-stream';
            }
            $file->setMimeType($mime);

            $size = 0;
            if (isset($stat['size'])) {
                $size = $stat['size'];
            } else {
                $fstat = fstat($fp);
                if (!empty($fstat['size'])) {
                    $size = $fstat['size'];
                }
            }

            // set chunk size (max: 100MB)
            $chunkSizeBytes = 100 * 1024 * 1024;
            if ($size > 0) {
                $memory = elFinder::getIniBytes('memory_limit');
                if ($memory > 0) {
                    $chunkSizeBytes = max(262144, min([$chunkSizeBytes, (intval($memory / 4 / 256) * 256)]));
                }
            }

            if ($size > $chunkSizeBytes) {
                $client = $this->client;
                // Call the API with the media upload, defer so it doesn't immediately return.
                $client->setDefer(true);
                if ($mode === 'insert') {
                    $request = $this->service->files->create($file, [
                        'fields' => self::FETCHFIELDS_GET,
                    ]);
                } else {
                    $request = $this->service->files->update($srcFile->getId(), $file, [
                        'fields' => self::FETCHFIELDS_GET,
                    ]);
                }

                // Create a media file upload to represent our upload process.
                $media = new Google_Http_MediaFileUpload($client, $request, $mime, null, true, $chunkSizeBytes);
                $media->setFileSize($size);
                // Upload the various chunks. $status will be false until the process is
                // complete.
                $status = false;
                while (!$status && !feof($fp)) {
                    elFinder::checkAborted();
                    // read until you get $chunkSizeBytes from TESTFILE
                    // fread will never return more than 8192 bytes if the stream is read buffered and it does not represent a plain file
                    // An example of a read buffered file is when reading from a URL
                    $chunk = $this->_gd_readFileChunk($fp, $chunkSizeBytes);
                    $status = $media->nextChunk($chunk);
                }
                // The final value of $status will be the data from the API for the object
                // that has been uploaded.
                if ($status !== false) {
                    $obj = $status;
                }

                $client->setDefer(false);
            } else {
                $params = [
                    'data' => stream_get_contents($fp),
                    'uploadType' => 'media',
                    'fields' => self::FETCHFIELDS_GET,
                ];
                if ($mode === 'insert') {
                    $obj = $this->service->files->create($file, $params);
                } else {
                    $obj = $this->service->files->update($srcFile->getId(), $file, $params);
                }
            }
            if ($obj instanceof Google_Service_Drive_DriveFile) {
                return $this->_joinPath($parent, $obj->getId());
            } else {
                return false;
            }
        } catch (Exception $e) {
            return $this->setError('GoogleDrive error: ' . $e->getMessage());
        }
    }

    /**
     * Get file contents.
     *
     * @param string $path file path
     *
     * @return string|false
     * @author Dmitry (dio) Levashov
     **/
    protected function _getContents($path)
    {
        $contents = '';

        try {
            list(, $itemId) = $this->_gd_splitPath($path);

            $contents = $this->service->files->get($itemId, [
                'alt' => 'media',
            ]);
            $contents = (string)$contents->getBody();
        } catch (Exception $e) {
            return $this->setError('GoogleDrive error: ' . $e->getMessage());
        }

        return $contents;
    }

    /**
     * Write a string to a file.
     *
     * @param string $path    file path
     * @param string $content new file content
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _filePutContents($path, $content)
    {
        $res = false;

        if ($local = $this->getTempFile($path)) {
            if (file_put_contents($local, $content, LOCK_EX) !== false
                && ($fp = fopen($local, 'rb'))) {
                clearstatcache();
                $res = $this->_save($fp, $path, '', []);
                fclose($fp);
            }
            file_exists($local) && unlink($local);
        }

        return $res;
    }

    /**
     * Detect available archivers.
     **/
    protected function _checkArchivers()
    {
        // die('Not yet implemented. (_checkArchivers)');
        return [];
    }

    /**
     * chmod implementation.
     *
     * @return bool
     **/
    protected function _chmod($path, $mode)
    {
        return false;
    }

    /**
     * Unpack archive.
     *
     * @param string $path archive path
     * @param array  $arc  archiver command and arguments (same as in $this->archivers)
     *
     * @return void
     * @author Dmitry (dio) Levashov
     * @author Alexey Sukhotin
     */
    protected function _unpack($path, $arc)
    {
        die('Not yet implemented. (_unpack)');
        //return false;
    }

    /**
     * Extract files from archive.
     *
     * @param string $path archive path
     * @param array  $arc  archiver command and arguments (same as in $this->archivers)
     *
     * @return void
     * @author Dmitry (dio) Levashov,
     * @author Alexey Sukhotin
     */
    protected function _extract($path, $arc)
    {
        die('Not yet implemented. (_extract)');
    }

    /**
     * Create archive and return its path.
     *
     * @param string $dir   target dir
     * @param array  $files files names list
     * @param string $name  archive name
     * @param array  $arc   archiver options
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov,
     * @author Alexey Sukhotin
     **/
    protected function _archive($dir, $files, $name, $arc)
    {
        die('Not yet implemented. (_archive)');
    }
} // END class
php/editors/ZohoOffice/editor.php000064400000020637151215013420013040 0ustar00<?php

class elFinderEditorZohoOffice extends elFinderEditor
{
    private static $curlTimeout = 20;

    protected $allowed = array('init', 'save', 'chk');

    protected $editor_settings = array(
        'writer' => array(
            'unit' => 'mm',
            'view' => 'pageview'
        ),
        'sheet' => array(
            'country' => 'US'
        ),
        'show' => array()
    );

    private $urls = array(
        'writer' => 'https://writer.zoho.com/writer/officeapi/v1/document',
        'sheet' => 'https://sheet.zoho.com/sheet/officeapi/v1/spreadsheet',
        'show' => 'https://show.zoho.com/show/officeapi/v1/presentation',
    );

    private $srvs = array(
        'application/msword' => 'writer',
        'application/vnd.openxmlformats-officedocument.wordprocessingml.document' => 'writer',
        'application/pdf' => 'writer',
        'application/vnd.oasis.opendocument.text' => 'writer',
        'application/rtf' => 'writer',
        'text/html' => 'writer',
        'application/vnd.ms-excel' => 'sheet',
        'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' => 'sheet',
        'application/vnd.oasis.opendocument.spreadsheet' => 'sheet',
        'application/vnd.sun.xml.calc' => 'sheet',
        'text/csv' => 'sheet',
        'text/tab-separated-values' => 'sheet',
        'application/vnd.ms-powerpoint' => 'show',
        'application/vnd.openxmlformats-officedocument.presentationml.presentation' => 'show',
        'application/vnd.openxmlformats-officedocument.presentationml.slideshow' => 'show',
        'application/vnd.oasis.opendocument.presentation' => 'show',
        'application/vnd.sun.xml.impress' => 'show',
    );

    private $myName = '';

    public function __construct($elfinder, $args)
    {
        parent::__construct($elfinder, $args);
        $this->myName = preg_replace('/^elFinderEditor/i', '', get_class($this));
    }

    public function enabled()
    {
        return defined('ELFINDER_ZOHO_OFFICE_APIKEY') && ELFINDER_ZOHO_OFFICE_APIKEY && function_exists('curl_init');
    }

    public function init()
    {
        if (!defined('ELFINDER_ZOHO_OFFICE_APIKEY') || !function_exists('curl_init')) {
            return array('error', array(elFinder::ERROR_CONF, '`ELFINDER_ZOHO_OFFICE_APIKEY` or curl extension'));
        }
        if (!empty($this->args['target'])) {
            $fp = $cfile = null;
            $hash = $this->args['target'];
            /** @var elFinderVolumeDriver $srcVol */
            if (($srcVol = $this->elfinder->getVolume($hash)) && ($file = $srcVol->file($hash))) {
                $cdata = empty($this->args['cdata']) ? '' : $this->args['cdata'];
                $cookie = $this->elfinder->getFetchCookieFile();
                $save = false;
                $ch = curl_init();
                $conUrl = elFinder::getConnectorUrl();
                curl_setopt($ch, CURLOPT_URL, $conUrl . (strpos($conUrl, '?') !== false? '&' : '?') . 'cmd=editor&name=' . $this->myName . '&method=chk&args[target]=' . rawurlencode($hash) . $cdata);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                if ($cookie) {
                    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
                    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
                }
                $res = curl_exec($ch);
                curl_close($ch);
                if ($res) {
                    if ($data = json_decode($res, true)) {
                        $save = !empty($data['cansave']);
                    }
                }

                if ($size = $file['size']) {
                    $src = $srcVol->open($hash);
                    $fp = tmpfile();
                    stream_copy_to_stream($src, $fp);
                    $srcVol->close($src, $hash);
                    $info = stream_get_meta_data($fp);
                    if ($info && !empty($info['uri'])) {
                        $srcFile = $info['uri'];
                        if (class_exists('CURLFile')) {
                            $cfile = new CURLFile($srcFile);
                            $cfile->setPostFilename($file['name']);
                            $cfile->setMimeType($file['mime']);
                        } else {
                            $cfile = '@' . $srcFile;
                        }
                    }
                }
                //$srv = $this->args['service'];
                $format = $srcVol->getExtentionByMime($file['mime']);
                if (!$format) {
                    $format = substr($file['name'], strrpos($file['name'], '.') * -1);
                }
                $lang = $this->args['lang'];
                if ($lang === 'jp') {
                    $lang = 'ja';
                }
                $srvsName = $this->srvs[$file['mime']];
                $data = array(
                    'apikey' => ELFINDER_ZOHO_OFFICE_APIKEY,
                    'callback_settings' => array(
                        'save_format' => $format,
                        'context_info' => array(
                            'hash' => $hash
                        )
                    ),
                    'editor_settings' => $this->editor_settings[$srvsName],
                    'document_info' => array(
                        'document_name' => substr($file['name'], 0, strlen($file['name']) - strlen($format)- 1)
                    )
                );
                $data['editor_settings']['language'] = $lang;
                if ($save) {
                    $conUrl = elFinder::getConnectorUrl();
                    $data['callback_settings']['save_url'] = $conUrl . (strpos($conUrl, '?') !== false? '&' : '?') . 'cmd=editor&name=' . $this->myName . '&method=save' . $cdata;
                }
                foreach($data as $_k => $_v) {
                    if (is_array($_v)){
                        $data[$_k] = json_encode($_v);
                    }
                }
                if ($cfile) {
                    $data['document'] = $cfile;
                }
                $ch = curl_init();
                curl_setopt($ch, CURLOPT_URL, $this->urls[$srvsName]);
                curl_setopt($ch, CURLOPT_TIMEOUT, self::$curlTimeout);
                curl_setopt($ch, CURLOPT_HEADER, 0);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($ch, CURLOPT_POST, 1);
                curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
                $res = curl_exec($ch);
                $error = curl_error($ch);
                curl_close($ch);

                $fp && fclose($fp);

                if ($res && $res = @json_decode($res, true)) {
                    if (!empty($res['document_url'])) {
                        $ret = array('zohourl' => $res['document_url']);
                        if (!$save) {
                            $ret['warning'] = 'exportToSave';
                        }
                        return $ret;
                    } else {
                        $error = $res;
                    }
                }

                if ($error) {
                    return array('error' => is_string($error)? preg_split('/[\r\n]+/', $error) : 'Error code: ' . $error);
                }
            }
        }

        return array('error' => array('errCmdParams', 'editor.' . $this->myName . '.init'));
    }

    public function save()
    {
        if (!empty($_POST) && !empty($_POST['id']) && !empty($_FILES) && !empty($_FILES['content'])) {
            $data = @json_decode(str_replace('&quot;', '"', $_POST['id']), true);
            if (!empty($data['hash'])) {
                $hash = $data['hash'];
                /** @var elFinderVolumeDriver $volume */
                if ($volume = $this->elfinder->getVolume($hash)) {
                    if ($content = file_get_contents($_FILES['content']['tmp_name'])) {
                        if ($volume->putContents($hash, $content)) {
                            return array('raw' => true, 'error' => '', 'header' => 'HTTP/1.1 200 OK');
                        }
                    }
                }
            }
        }
        return array('raw' => true, 'error' => '', 'header' => 'HTTP/1.1 500 Internal Server Error');
    }

    public function chk()
    {
        $hash = $this->args['target'];
        $res = false;
        /** @var elFinderVolumeDriver $volume */
        if ($volume = $this->elfinder->getVolume($hash)) {
            if ($file = $volume->file($hash)) {
                $res = (bool)$file['write'];
            }
        }
        return array('cansave' => $res);
    }
}
php/editors/editor.php000064400000002612151215013420010776 0ustar00<?php

/**
 * Abstract class of editor plugins.
 *
 * @author Naoki Sawada
 */
class elFinderEditor
{
    /**
     * Array of allowed method by request from client side.
     *
     * @var array
     */
    protected $allowed = array();

    /**
     * elFinder instance
     *
     * @var object elFinder instance
     */
    protected $elfinder;

    /**
     * Arguments
     *
     * @var array argValues
     */
    protected $args;

    /**
     * Constructor.
     *
     * @param object $elfinder
     * @param array  $args
     */
    public function __construct($elfinder, $args)
    {
        $this->elfinder = $elfinder;
        $this->args = $args;
    }

    /**
     * Return boolean that this plugin is enabled.
     *
     * @return bool
     */
    public function enabled()
    {
        return true;
    }

    /**
     * Return boolean that $name method is allowed.
     *
     * @param string $name
     *
     * @return bool
     */
    public function isAllowedMethod($name)
    {
        $checker = array_flip($this->allowed);

        return isset($checker[$name]);
    }

    /**
     * Return $this->args value of the key
     *
     * @param      string $key   target key
     * @param      string $empty empty value
     *
     * @return     mixed
     */
    public function argValue($key, $empty = '')
    {
        return isset($this->args[$key]) ? $this->args[$key] : $empty;
    }
}
php/editors/OnlineConvert/editor.php000064400000010320151215013420013556 0ustar00<?php

class elFinderEditorOnlineConvert extends elFinderEditor
{
    protected $allowed = array('init', 'api');

    public function enabled()
    {
        return defined('ELFINDER_ONLINE_CONVERT_APIKEY') && ELFINDER_ONLINE_CONVERT_APIKEY && (!defined('ELFINDER_DISABLE_ONLINE_CONVERT') || !ELFINDER_DISABLE_ONLINE_CONVERT);
    }

    public function init()
    {
        return array('api' => defined('ELFINDER_ONLINE_CONVERT_APIKEY') && ELFINDER_ONLINE_CONVERT_APIKEY && function_exists('curl_init'));
    }

    public function api()
    {
        // return array('apires' => array('message' => 'Currently disabled for developping...'));
        $endpoint = 'https://api2.online-convert.com/jobs';
        $category = $this->argValue('category');
        $convert = $this->argValue('convert');
        $options = $this->argValue('options');
        $source = $this->argValue('source');
        $filename = $this->argValue('filename');
        $mime = $this->argValue('mime');
        $jobid = $this->argValue('jobid');
        $string_method = '';
        $options = array();
        // Currently these converts are make error with API call. I don't know why.
        $nonApi = array('android', 'blackberry', 'dpg', 'ipad', 'iphone', 'ipod', 'nintendo-3ds', 'nintendo-ds', 'ps3', 'psp', 'wii', 'xbox');
        if (in_array($convert, $nonApi)) {
            return array('apires' => array());
        }
        $ch = null;
        if ($convert && $source) {
            $request = array(
                'input' => array(array(
                    'type' => 'remote',
                    'source' => $source
                )),
                'conversion' => array(array(
                    'target' => $convert
                ))
            );

            if ($filename !== '') {
                $request['input'][0]['filename'] = $filename;
            }

            if ($mime !== '') {
                $request['input'][0]['content_type'] = $mime;
            }

            if ($category) {
                $request['conversion'][0]['category'] = $category;
            }

            if ($options && $options !== 'null') {
                $options = json_decode($options, true);
            }
            if (!is_array($options)) {
                $options = array();
            }
            if ($options) {
                $request['conversion'][0]['options'] = $options;
            }

            $ch = curl_init($endpoint);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
            curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($request));
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
            curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                'X-Oc-Api-Key: ' . ELFINDER_ONLINE_CONVERT_APIKEY,
                'Content-Type: application/json',
                'cache-control: no-cache'
            ));
        } else if ($jobid) {
            $ch = curl_init($endpoint . '/' . $jobid);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
            curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                'X-Oc-Api-Key: ' . ELFINDER_ONLINE_CONVERT_APIKEY,
                'cache-control: no-cache'
            ));
        }

        if ($ch) {
            $response = curl_exec($ch);
            $info = curl_getinfo($ch);
            $error = curl_error($ch);
            curl_close($ch);

            if (!empty($error)) {
                $res = array('error' => $error);
            } else {
                $data = json_decode($response, true);
                if (isset($data['status']) && isset($data['status']['code']) && $data['status']['code'] === 'completed') {
                    /** @var elFinderSession $session */
                    $session = $this->elfinder->getSession();
                    $urlContentSaveIds = $session->get('urlContentSaveIds', array());
                    $urlContentSaveIds['OnlineConvert-' . $data['id']] = true;
                    $session->set('urlContentSaveIds', $urlContentSaveIds);
                }
                $res = array('apires' => $data);
            }

            return $res;
        } else {
            return array('error' => array('errCmdParams', 'editor.OnlineConvert.api'));
        }
    }
}
php/editors/ZipArchive/editor.php000064400000000621151215013420013040 0ustar00<?php

class elFinderEditorZipArchive extends elFinderEditor
{
    public function enabled()
    {
        return (!defined('ELFINDER_DISABLE_ZIPEDITOR') || !ELFINDER_DISABLE_ZIPEDITOR) &&
            class_exists('Barryvdh\elFinderFlysystemDriver\Driver') &&
            class_exists('League\Flysystem\Filesystem') &&
            class_exists('League\Flysystem\ZipArchive\ZipArchiveAdapter');
    }
}img/volume_icon_onedrive.svg000064400000000771151215013420012252 0ustar00<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48"><path d="M40.4 36s3-.4 3.5-3.2a5 5 0 0 0 0-1.7c-.4-3.1-3.8-3.8-3.8-3.8s.6-3.4-2.5-5.2c-3.2-1.8-6 0-6 0s-1.7-3.4-6.3-3.4c-5.8 0-6.8 6.6-6.8 6.6s-5.5.3-5.5 5.2 5 5.5 5 5.5h22.4z" fill="#1565c0"/><path d="M11 30.5c0-4.4 3.3-6.3 5.9-7 .9-3 3.4-6.8 8.4-6.8a9 9 0 0 1 7 3c.6-.3 1.4-.4 2.3-.4A8 8 0 0 0 26 12c-5.5 0-7.4 4.7-7.4 4.7s-4-3-8.1 1.1c-2.1 2.1-1.6 5.4-1.6 5.4S4 23.6 4 28.8C4 33.5 9 34 9 34h2.8c-.5-1-.8-2.1-.8-3.5z" fill="#1565c0"/></svg>img/trashmesh.png000064400000000244151215013420010016 0ustar00�PNG


IHDR�RW�bKGD�������	pHYs��DIDAT�u�K
�0CуE?(������wrIZ�H�Uo�f)����`��9�7[	sG\N�����8�?IEND�B`�img/crop.gif000064400000000503151215013420006742 0ustar00GIF89a����!�NETSCAPE2.0!�	
,
��k�TL�Y�,!�	
,��j�^[С�쥵!�	
,L�`����bдXi}�!�	
,��`�z��bh�X�{�!�	
,
�	�k�TL�Y�,!�	
,D��j�^[С�쥵!�	
,�a����bдXi}�!�
,��a�z��bh�X�{�;img/tui-icon-a.svg000064400000047245151215013420010014 0ustar00<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs>
        <circle id="a" cx="16" cy="16" r="16"/>
    </defs><symbol id="icon-a-ic-apply" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h24v24H0z"/>
        <path stroke="#434343" d="M4 12.011l5 5L20.011 6"/>
    </g>
</symbol><symbol id="icon-a-ic-cancel" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h24v24H0z"/>
        <path stroke="#434343" d="M6 6l12 12M18 6L6 18"/>
    </g>
</symbol><symbol id="icon-a-ic-color-transparent-w" viewBox="0 0 32 32">
    
    <g fill="none" fill-rule="evenodd">
        <g>
            <use fill="#FFF" xlink:href="#a"/>
            <circle cx="16" cy="16" r="15.5" stroke="#D5D5D5"/>
        </g>
        <path stroke="#FF4040" stroke-width="1.5" d="M27 5L5 27"/>
    </g>
</symbol><symbol id="icon-a-ic-crop" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h24v24H0z"/>
        <path fill="#434343" d="M4 0h1v20a1 1 0 0 1-1-1V0zM20 17h-1V5h1v12zm0 2v5h-1v-5h1z"/>
        <path fill="#434343" d="M5 19h19v1H5zM4.762 4v1H0V4h4.762zM7 4h12a1 1 0 0 1 1 1H7V4z"/>
    </g>
</symbol><symbol id="icon-a-ic-delete-all" viewBox="0 0 24 24">
    <g fill="#434343" fill-rule="evenodd">
        <path d="M5 23H3a1 1 0 0 1-1-1V6h1v16h2v1zm16-10h-1V6h1v7zM9 13H8v-3h1v3zm3 0h-1v-3h1v3zm3 0h-1v-3h1v3zM14.794 3.794L13 2h-3L8.206 3.794A.963.963 0 0 1 8 2.5l.703-1.055A1 1 0 0 1 9.535 1h3.93a1 1 0 0 1 .832.445L15 2.5a.965.965 0 0 1-.206 1.294zM14.197 4H8.803h5.394z"/>
        <path d="M0 3h23v1H0zM11.286 21H8.714L8 23H7l1-2.8V20h.071L9.5 16h1l1.429 4H12v.2l1 2.8h-1l-.714-2zm-.357-1L10 17.4 9.071 20h1.858zM20 22h3v1h-4v-7h1v6zm-5 0h3v1h-4v-7h1v6z"/>
    </g>
</symbol><symbol id="icon-a-ic-delete" viewBox="0 0 24 24">
    <g fill="#434343" fill-rule="evenodd">
        <path d="M3 6v16h17V6h1v16a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V6h1zM14.794 3.794L13 2h-3L8.206 3.794A.963.963 0 0 1 8 2.5l.703-1.055A1 1 0 0 1 9.535 1h3.93a1 1 0 0 1 .832.445L15 2.5a.965.965 0 0 1-.206 1.294zM14.197 4H8.803h5.394z"/>
        <path d="M0 3h23v1H0zM8 10h1v6H8v-6zm3 0h1v6h-1v-6zm3 0h1v6h-1v-6z"/>
    </g>
</symbol><symbol id="icon-a-ic-draw-free" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#434343" d="M2.5 20.929C2.594 10.976 4.323 6 7.686 6c5.872 0 2.524 19 7.697 19s1.89-14.929 6.414-14.929 1.357 10.858 5.13 10.858c1.802 0 2.657-2.262 2.566-6.786"/>
    </g>
</symbol><symbol id="icon-a-ic-draw-line" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#434343" d="M2 15.5h28"/>
    </g>
</symbol><symbol id="icon-a-ic-draw" viewBox="0 0 24 24">
    <g fill="none">
        <path stroke="#434343" d="M2.5 21.5H5c.245 0 .48-.058.691-.168l.124-.065.14.01c.429.028.85-.127 1.16-.437L22.55 5.405a.5.5 0 0 0 0-.707l-3.246-3.245a.5.5 0 0 0-.707 0L3.162 16.888a1.495 1.495 0 0 0-.437 1.155l.01.14-.065.123c-.111.212-.17.448-.17.694v2.5z"/>
        <path fill="#434343" d="M16.414 3.707l3.89 3.89-.708.706-3.889-3.889z"/>
    </g>
</symbol><symbol id="icon-a-ic-filter" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h24v24H0z"/>
        <path fill="#434343" d="M12 7v1H2V7h10zm6 0h4v1h-4V7zM12 16v1h10v-1H12zm-6 0H2v1h4v-1z"/>
        <path fill="#434343" d="M8.5 20a3.5 3.5 0 1 1 0-7 3.5 3.5 0 0 1 0 7zm0-1a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5zM15.5 11a3.5 3.5 0 1 1 0-7 3.5 3.5 0 0 1 0 7zm0-1a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5z"/>
    </g>
</symbol><symbol id="icon-a-ic-flip-reset" viewBox="0 0 31 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M31 0H0v32h31z"/>
        <path fill="#434343" d="M28 16a8 8 0 0 1-8 8H3v-1h1v-7H3a8 8 0 0 1 8-8h17v1h-1v7h1zM11 9a7 7 0 0 0-7 7v7h16a7 7 0 0 0 7-7V9H11z"/>
        <path stroke="#434343" stroke-linecap="square" d="M24 5l3.5 3.5L24 12M7 20l-3.5 3.5L7 27"/>
    </g>
</symbol><symbol id="icon-a-ic-flip-x" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M32 32H0V0h32z"/>
        <path fill="#434343" d="M17 32h-1V0h1zM27.167 11l.5 3h-1.03l-.546-3h1.076zm-.5-3h-1.122L25 5h-5V4h5.153a1 1 0 0 1 .986.836L26.667 8zm1.5 9l.5 3h-.94l-.545-3h.985zm1 6l.639 3.836A1 1 0 0 1 28.819 28H26v-1h3l-.726-4h.894zM23 28h-3v-1h3v1zM13 4v1H7L3 27h10v1H3.18a1 1 0 0 1-.986-1.164l3.666-22A1 1 0 0 1 6.847 4H13z"/>
    </g>
</symbol><symbol id="icon-a-ic-flip-y" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0v32h32V0z"/>
        <path fill="#434343" d="M0 16v1h32v-1zM11 27.167l3 .5v-1.03l-3-.546v1.076zm-3-.5v-1.122L5 25v-5H4v5.153a1 1 0 0 0 .836.986L8 26.667zm9 1.5l3 .5v-.94l-3-.545v.985zm6 1l3.836.639A1 1 0 0 0 28 28.82V26h-1v3l-4-.727v.894zM28 23v-3h-1v3h1zM4 13h1V7l22-4v10h1V3.18a1 1 0 0 0-1.164-.986l-22 3.667A1 1 0 0 0 4 6.847V13z"/>
    </g>
</symbol><symbol id="icon-a-ic-flip" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h24v24H0z"/>
        <path fill="#434343" d="M11 0h1v24h-1zM19 21v-1h2v-2h1v2a1 1 0 0 1-1 1h-2zm-2 0h-3v-1h3v1zm5-5h-1v-3h1v3zm0-5h-1V8h1v3zm0-5h-1V4h-2V3h2a1 1 0 0 1 1 1v2zm-5-3v1h-3V3h3zM9 3v1H2v16h7v1H2a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h7z"/>
    </g>
</symbol><symbol id="icon-a-ic-icon-arrow-2" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#434343" stroke-linecap="round" stroke-linejoin="round" d="M21.793 18.5H2.5v-5h18.935l-7.6-8h5.872l10.5 10.5-10.5 10.5h-5.914l8-8z"/>
    </g>
</symbol><symbol id="icon-a-ic-icon-arrow-3" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#434343" stroke-linecap="round" stroke-linejoin="round" d="M25.288 16.42L14.208 27.5H6.792l11.291-11.291L6.826 4.5h7.381l11.661 11.661-.58.258z"/>
    </g>
</symbol><symbol id="icon-a-ic-icon-arrow" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#434343" d="M2.5 11.5v9h18v5.293L30.293 16 20.5 6.207V11.5h-18z"/>
    </g>
</symbol><symbol id="icon-a-ic-icon-bubble" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#434343" stroke-linecap="round" stroke-linejoin="round" d="M22.207 24.5L16.5 30.207V24.5H8A6.5 6.5 0 0 1 1.5 18V9A6.5 6.5 0 0 1 8 2.5h16A6.5 6.5 0 0 1 30.5 9v9a6.5 6.5 0 0 1-6.5 6.5h-1.793z"/>
    </g>
</symbol><symbol id="icon-a-ic-icon-heart" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path fill-rule="nonzero" stroke="#434343" d="M15.996 30.675l1.981-1.79c7.898-7.177 10.365-9.718 12.135-13.012.922-1.716 1.377-3.37 1.377-5.076 0-4.65-3.647-8.297-8.297-8.297-2.33 0-4.86 1.527-6.817 3.824l-.38.447-.381-.447C13.658 4.027 11.126 2.5 8.797 2.5 4.147 2.5.5 6.147.5 10.797c0 1.714.46 3.375 1.389 5.098 1.775 3.288 4.26 5.843 12.123 12.974l1.984 1.806z"/>
    </g>
</symbol><symbol id="icon-a-ic-icon-load" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#434343" stroke-linecap="round" stroke-linejoin="round" d="M17.314 18.867l1.951-2.53 4 5.184h-17l6.5-8.84 4.549 6.186z"/>
        <path fill="#434343" d="M18.01 4a11.798 11.798 0 0 0 0 1H3v24h24V14.986a8.738 8.738 0 0 0 1 0V29a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h15.01z"/>
        <path fill="#434343" d="M25 3h1v9h-1z"/>
        <path stroke="#434343" d="M22 6l3.5-3.5L29 6"/>
    </g>
</symbol><symbol id="icon-a-ic-icon-location" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <g stroke="#434343">
            <path d="M16 31.28C23.675 23.302 27.5 17.181 27.5 13c0-6.351-5.149-11.5-11.5-11.5S4.5 6.649 4.5 13c0 4.181 3.825 10.302 11.5 18.28z"/>
            <circle cx="16" cy="13" r="4.5"/>
        </g>
    </g>
</symbol><symbol id="icon-a-ic-icon-polygon" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#434343" d="M.576 16L8.29 29.5h15.42L31.424 16 23.71 2.5H8.29L.576 16z"/>
    </g>
</symbol><symbol id="icon-a-ic-icon-star-2" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#434343" d="M19.446 31.592l2.265-3.272 3.946.25.636-3.94 3.665-1.505-1.12-3.832 2.655-2.962-2.656-2.962 1.12-3.832-3.664-1.505-.636-3.941-3.946.25-2.265-3.271L16 3.024 12.554 1.07 10.289 4.34l-3.946-.25-.636 3.941-3.665 1.505 1.12 3.832L.508 16.33l2.656 2.962-1.12 3.832 3.664 1.504.636 3.942 3.946-.25 2.265 3.27L16 29.638l3.446 1.955z"/>
    </g>
</symbol><symbol id="icon-a-ic-icon-star" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#434343" d="M25.292 29.878l-1.775-10.346 7.517-7.327-10.388-1.51L16 1.282l-4.646 9.413-10.388 1.51 7.517 7.327-1.775 10.346L16 24.993l9.292 4.885z"/>
    </g>
</symbol><symbol id="icon-a-ic-icon" viewBox="0 0 24 24">
    <g fill="none">
        <path stroke="#434343" stroke-linecap="round" stroke-linejoin="round" d="M11.923 19.136L5.424 22l.715-7.065-4.731-5.296 6.94-1.503L11.923 2l3.574 6.136 6.94 1.503-4.731 5.296L18.42 22z"/>
    </g>
</symbol><symbol id="icon-a-ic-mask-load" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h32v32H0z"/>
        <path fill="#434343" d="M18.01 4a11.798 11.798 0 0 0 0 1H3v24h24V14.986a8.738 8.738 0 0 0 1 0V29a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h15.01zM15 23a6 6 0 1 1 0-12 6 6 0 0 1 0 12zm0-1a5 5 0 1 0 0-10 5 5 0 0 0 0 10z"/>
        <path fill="#434343" d="M25 3h1v9h-1z"/>
        <path stroke="#434343" d="M22 6l3.5-3.5L29 6"/>
    </g>
</symbol><symbol id="icon-a-ic-mask" viewBox="0 0 24 24">
    <g fill="none">
        <circle cx="12" cy="12" r="4.5" stroke="#434343"/>
        <path fill="#434343" d="M2 1h20a1 1 0 0 1 1 1v20a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1zm0 1v20h20V2H2z"/>
    </g>
</symbol><symbol id="icon-a-ic-redo" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h24v24H0z" opacity=".5"/>
        <path fill="#434343" d="M21 6H9a6 6 0 1 0 0 12h12v1H9A7 7 0 0 1 9 5h12v1z"/>
        <path stroke="#434343" stroke-linecap="square" d="M19 3l2.5 2.5L19 8"/>
    </g>
</symbol><symbol id="icon-a-ic-reset" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h24v24H0z" opacity=".5"/>
        <path fill="#434343" d="M2 13v-1a7 7 0 0 1 7-7h13v1h-1v5h1v1a7 7 0 0 1-7 7H2v-1h1v-5H2zm7-7a6 6 0 0 0-6 6v6h12a6 6 0 0 0 6-6V6H9z"/>
        <path stroke="#434343" stroke-linecap="square" d="M19 3l2.5 2.5L19 8M5 16l-2.5 2.5L5 21"/>
    </g>
</symbol><symbol id="icon-a-ic-rotate-clockwise" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path fill="#434343" d="M29 17h-.924c0 6.627-5.373 12-12 12-6.628 0-12-5.373-12-12C4.076 10.398 9.407 5.041 16 5V4C8.82 4 3 9.82 3 17s5.82 13 13 13 13-5.82 13-13z"/>
        <path stroke="#434343" stroke-linecap="square" d="M16 1.5l4 3-4 3"/>
        <path fill="#434343" fill-rule="nonzero" d="M16 4h4v1h-4z"/>
    </g>
</symbol><symbol id="icon-a-ic-rotate-counterclockwise" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path fill="#434343" d="M3 17h.924c0 6.627 5.373 12 12 12 6.628 0 12-5.373 12-12 0-6.602-5.331-11.96-11.924-12V4c7.18 0 13 5.82 13 13s-5.82 13-13 13S3 24.18 3 17z"/>
        <path fill="#434343" fill-rule="nonzero" d="M12 4h4v1h-4z"/>
        <path stroke="#434343" stroke-linecap="square" d="M16 1.5l-4 3 4 3"/>
    </g>
</symbol><symbol id="icon-a-ic-rotate" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h24v24H0z"/>
        <path fill="#434343" d="M8.349 22.254a10.002 10.002 0 0 1-2.778-1.719l.65-.76a9.002 9.002 0 0 0 2.495 1.548l-.367.931zm2.873.704l.078-.997a9 9 0 1 0-.557-17.852l-.14-.99A10.076 10.076 0 0 1 12.145 3c5.523 0 10 4.477 10 10s-4.477 10-10 10c-.312 0-.62-.014-.924-.042zm-7.556-4.655a9.942 9.942 0 0 1-1.253-2.996l.973-.234a8.948 8.948 0 0 0 1.124 2.693l-.844.537zm-1.502-5.91A9.949 9.949 0 0 1 2.88 9.23l.925.382a8.954 8.954 0 0 0-.644 2.844l-.998-.062zm2.21-5.686c.687-.848 1.51-1.58 2.436-2.166l.523.852a9.048 9.048 0 0 0-2.188 1.95l-.771-.636z"/>
        <path stroke="#434343" stroke-linecap="square" d="M13 1l-2.5 2.5L13 6"/>
    </g>
</symbol><symbol id="icon-a-ic-shape-circle" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <circle cx="16" cy="16" r="14.5" stroke="#434343"/>
    </g>
</symbol><symbol id="icon-a-ic-shape-rectangle" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <rect width="27" height="27" x="2.5" y="2.5" stroke="#434343" rx="1"/>
    </g>
</symbol><symbol id="icon-a-ic-shape-triangle" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#434343" stroke-linecap="round" stroke-linejoin="round" d="M16 2.5l15.5 27H.5z"/>
    </g>
</symbol><symbol id="icon-a-ic-shape" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path fill="#434343" d="M14.706 8H21a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H9a1 1 0 0 1-1-1v-4h1v4h12V9h-5.706l-.588-1z"/>
        <path stroke="#434343" stroke-linecap="round" stroke-linejoin="round" d="M8.5 1.5l7.5 13H1z"/>
    </g>
</symbol><symbol id="icon-a-ic-text-align-center" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h32v32H0z"/>
        <path fill="#434343" d="M2 5h28v1H2zM8 12h16v1H8zM2 19h28v1H2zM8 26h16v1H8z"/>
    </g>
</symbol><symbol id="icon-a-ic-text-align-left" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h32v32H0z"/>
        <path fill="#434343" d="M2 5h28v1H2zM2 12h16v1H2zM2 19h28v1H2zM2 26h16v1H2z"/>
    </g>
</symbol><symbol id="icon-a-ic-text-align-right" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h32v32H0z"/>
        <path fill="#434343" d="M2 5h28v1H2zM14 12h16v1H14zM2 19h28v1H2zM14 26h16v1H14z"/>
    </g>
</symbol><symbol id="icon-a-ic-text-bold" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h32v32H0z"/>
        <path fill="#434343" d="M7 2h2v2H7zM7 28h2v2H7z"/>
        <path stroke="#434343" stroke-width="2" d="M9 3v12h9a6 6 0 1 0 0-12H9zM9 15v14h10a7 7 0 0 0 0-14H9z"/>
    </g>
</symbol><symbol id="icon-a-ic-text-italic" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h32v32H0z"/>
        <path fill="#434343" d="M15 2h5v1h-5zM11 29h5v1h-5zM17 3h1l-4 26h-1z"/>
    </g>
</symbol><symbol id="icon-a-ic-text-underline" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h32v32H0z"/>
        <path fill="#434343" d="M8 2v14a8 8 0 1 0 16 0V2h1v14a9 9 0 0 1-18 0V2h1zM3 29h26v1H3z"/>
        <path fill="#434343" d="M5 2h5v1H5zM22 2h5v1h-5z"/>
    </g>
</symbol><symbol id="icon-a-ic-text" viewBox="0 0 24 24">
    <g fill="#434343" fill-rule="evenodd">
        <path d="M4 3h15a1 1 0 0 1 1 1H3a1 1 0 0 1 1-1zM3 4h1v1H3zM19 4h1v1h-1z"/>
        <path d="M11 3h1v18h-1z"/>
        <path d="M10 20h3v1h-3z"/>
    </g>
</symbol><symbol id="icon-a-ic-undo" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path d="M24 0H0v24h24z" opacity=".5"/>
        <path fill="#434343" d="M3 6h12a6 6 0 1 1 0 12H3v1h12a7 7 0 0 0 0-14H3v1z"/>
        <path stroke="#434343" stroke-linecap="square" d="M5 3L2.5 5.5 5 8"/>
    </g>
</symbol><symbol id="icon-a-img-bi" viewBox="0 0 257 26">
    <g fill="#FDBA3B">
        <path d="M26 5a8.001 8.001 0 0 0 0 16 8.001 8.001 0 0 0 0-16M51.893 19.812L43.676 5.396A.78.78 0 0 0 43 5a.78.78 0 0 0-.677.396l-8.218 14.418a.787.787 0 0 0 0 .792c.14.244.396.394.676.394h16.436c.28 0 .539-.15.678-.396a.796.796 0 0 0-.002-.792M15.767 5.231A.79.79 0 0 0 15.21 5H.791A.791.791 0 0 0 0 5.79v6.42a.793.793 0 0 0 .791.79h3.21v7.21c.001.21.082.408.234.56.147.148.347.23.558.23h6.416a.788.788 0 0 0 .792-.79V13h3.006c.413 0 .611-.082.762-.232.15-.149.23-.35.231-.559V5.791a.787.787 0 0 0-.233-.56M85.767 5.231A.79.79 0 0 0 85.21 5H70.791a.791.791 0 0 0-.791.79v6.42a.793.793 0 0 0 .791.79h3.21v7.21c.001.21.082.408.234.56.147.148.347.23.558.23h6.416a.788.788 0 0 0 .792-.79V13h3.006c.413 0 .611-.082.762-.232.15-.149.23-.35.231-.559V5.791a.787.787 0 0 0-.233-.56M65.942 9.948l2.17-3.76a.78.78 0 0 0 0-.792.791.791 0 0 0-.684-.396h-8.54A5.889 5.889 0 0 0 53 10.86a5.887 5.887 0 0 0 3.07 5.17l-2.184 3.782A.792.792 0 0 0 54.571 21h8.54a5.89 5.89 0 0 0 2.831-11.052M105.7 21h2.3V5h-2.3zM91 5h2.4v10.286c0 1.893 1.612 3.429 3.6 3.429s3.6-1.536 3.6-3.429V5h2.4v10.286c0 3.156-2.686 5.714-6 5.714-3.313 0-6-2.558-6-5.714V5zM252.148 21.128h-2.377V9.659h2.27v1.64c.69-1.299 1.792-1.938 3.304-1.938.497 0 .95.065 1.382.192l-.215 2.277a3.734 3.734 0 0 0-1.275-.213c-1.814 0-3.089 1.234-3.089 3.638v5.873zm-7.095-5.744a3.734 3.734 0 0 0-1.101-2.703c-.714-.766-1.6-1.149-2.658-1.149-1.058 0-1.944.383-2.679 1.149a3.803 3.803 0 0 0-1.08 2.703c0 1.063.368 1.978 1.08 2.722.735.746 1.62 1.128 2.68 1.128 1.058 0 1.943-.382 2.657-1.128.734-.744 1.101-1.659 1.101-2.722zm-9.916 0c0-1.682.583-3.086 1.729-4.256 1.166-1.17 2.635-1.767 4.428-1.767 1.793 0 3.262.597 4.407 1.767 1.167 1.17 1.75 2.574 1.75 4.256 0 1.7-.583 3.127-1.75 4.297-1.145 1.17-2.614 1.745-4.407 1.745-1.793 0-3.262-.575-4.428-1.745-1.146-1.17-1.729-2.596-1.729-4.297zm-1.5 3.233l.821 1.83c-.864.638-1.944.958-3.22.958-2.526 0-3.822-1.554-3.822-4.383V11.66h-2.01v-2h2.031V5.595h2.355v4.063h4.018v2h-4.018v5.405c0 1.469.605 2.191 1.793 2.191.626 0 1.318-.212 2.052-.638zm-12.43 2.51h2.375V9.66h-2.376v11.469zm1.23-12.977c-.929 0-1.642-.682-1.642-1.596 0-.873.713-1.554 1.643-1.554.885 0 1.576.681 1.576 1.554 0 .914-.69 1.596-1.576 1.596zm-6.49 7.234c0-1.086-.346-1.98-1.037-2.724-.692-.745-1.599-1.128-2.7-1.128-1.102 0-2.01.383-2.7 1.128-.692.744-1.037 1.638-1.037 2.724 0 1.084.345 2.02 1.036 2.766.691.744 1.6 1.105 2.7 1.105 1.102 0 2.01-.361 2.7-1.105.692-.746 1.038-1.682 1.038-2.766zm-.173-4.129V5h2.397v16.128h-2.354v-1.596c-1.015 1.255-2.333 1.873-3.91 1.873-1.663 0-3.068-.575-4.169-1.724-1.102-1.17-1.663-2.596-1.663-4.297 0-1.682.561-3.107 1.663-4.256 1.101-1.17 2.485-1.745 4.148-1.745 1.534 0 2.83.617 3.888 1.872zm-11.48 9.873h-10.218V5.405h10.195v2.318h-7.711V12h7.15v2.32h-7.15v4.489h7.733v2.319zm-23.891-9.724c-1.793 0-3.132 1.192-3.478 2.979h6.783c-.194-1.808-1.555-2.979-3.305-2.979zm5.703 3.766c0 .32-.021.703-.086 1.128h-9.095c.346 1.787 1.62 3 3.867 3 1.318 0 2.916-.49 3.953-1.234l.994 1.724c-1.189.872-3.067 1.595-5.033 1.595-4.364 0-6.243-3-6.243-6.021 0-1.724.54-3.15 1.642-4.277 1.101-1.127 2.548-1.702 4.298-1.702 1.664 0 3.046.511 4.105 1.553 1.058 1.043 1.598 2.447 1.598 4.234zm-19.949 3.894c1.08 0 1.966-.362 2.68-1.085.712-.724 1.058-1.617 1.058-2.703 0-1.084-.346-2-1.059-2.701-.713-.702-1.599-1.064-2.679-1.064-1.058 0-1.944.362-2.656 1.085-.714.702-1.059 1.596-1.059 2.68 0 1.086.345 2 1.059 2.724.712.702 1.598 1.064 2.656 1.064zm3.673-7.936V9.66h2.29v10.299c0 1.85-.584 3.32-1.728 4.404-1.146 1.085-2.68 1.638-4.58 1.638-1.945 0-3.672-.553-5.206-1.638l1.037-1.808c1.296.915 2.679 1.36 4.126 1.36 2.484 0 3.996-1.51 3.996-3.637v-.83c-1.015 1.127-2.311 1.702-3.91 1.702-1.684 0-3.089-.554-4.19-1.68-1.102-1.128-1.642-2.532-1.642-4.214 0-1.68.561-3.085 1.706-4.191 1.145-1.128 2.571-1.681 4.234-1.681 1.534 0 2.83.575 3.867 1.745zm-18.07 8.127c1.102 0 1.988-.382 2.7-1.128.714-.744 1.06-1.659 1.06-2.743 0-1.065-.346-1.98-1.06-2.724-.712-.745-1.598-1.128-2.7-1.128-1.101 0-2.008.383-2.7 1.128-.691.744-1.036 1.66-1.036 2.745 0 1.084.345 2 1.037 2.745.691.744 1.598 1.105 2.7 1.105zm3.652-8V9.66h2.29v11.469h-2.29v-1.575c-1.059 1.234-2.399 1.852-3.976 1.852-1.663 0-3.067-.575-4.168-1.745-1.102-1.17-1.642-2.617-1.642-4.34 0-1.724.54-3.128 1.642-4.256 1.1-1.128 2.505-1.681 4.168-1.681 1.577 0 2.917.617 3.976 1.872zM138.79 9.34c1.404 0 2.527.448 3.37 1.34.863.873 1.295 2.086 1.295 3.596v6.852h-2.376V14.66c0-2.021-1.036-3.128-2.657-3.128-1.727 0-2.915 1.255-2.915 3.192v6.404h-2.377v-6.426c0-1.978-1.037-3.17-2.679-3.17-1.728 0-2.937 1.277-2.937 3.234v6.362h-2.377V9.659h2.333v1.66c.692-1.212 1.988-1.979 3.522-1.979 1.533.021 2.958.767 3.586 2.107.798-1.277 2.419-2.107 4.212-2.107zm-19.517 11.788h2.484V5.405h-2.484v15.723z"/>
    </g>
</symbol></svg>img/editor-icons.png000064400000005237151215013420010426 0ustar00�PNG


IHDR�=�J�PLTE<B*;>'+��@;;S��&��J[GGG��3EK	AYPr>==�����_����
{����5@GGMV������@@@&#]�cab_��D�ȏ���o8Qwv===~��GW
!��GX��"+Z����Y��ROO����������0��\;Bbxy�����z�1Nl��,*+J��'1<���B��PiXHH?!</%'b��8U�IkkkLYD`m-$!N��B_�J�����v��Q�޲r4I�ї��֝E�����h֡?��.u�XLz���H����@3���nw`�ŏ�����a��6���D�===LYO�F��ޙ��www�������%� *� )��Φ"�!��`����¥���E��Ah���h}D�P�(+&' x��K�׹���!�!���C��R�¬��{�wb�Lx��T����M��aV6�D�28�"+,u)	)	������}��稫0�Z�PVtBKF�E�������]m[��G�@F�19�#)�"����d��H��p�����P�ڔ�]��MS!�FB�<512a#j��\��Z����ϯ�\���j,sSK�B�9A� ?��읛�洺뛹ᗟux�≍�ns�dnd�iD�`����W��Iv��ۙ�a��^v�U7�2w/���U����{�X����T�i��Dn;�(.�
��đ�Ž�����Ǘ q��wz�Pf�3f�9^_�[t�I(�8,6�����q����J��F�F՚B��OAetRNS&���ߑ]J��������\;���v��a�����Լ����yaGA>4*�����������o�����۱�����������ȼ����L�����������F@I�IDATH�Tͱ
1У1m<@n���J:�bWv�&���iI�@ꛂ1X�˥�w~��'� D���ϩ�x�HH\:<(N@	l��\��㆐˧�o�k��F�W�\�Ar}uX��
�dw%~�11�;7!h���CTP���v8�U���s�Q��������j��n߯��J����������23�("�P�"��
&�"P&���H��$n�|��BT!9�[1}�����A ��pC� �� ��+8ftU�M�C����j˔�-�q����L�UTі���_LRd���B���ҽ�ZA�߀�u	�8�L�Òf��}�zo:ĉB\k=���^� �lj�;��w
M�~aÃ)�������/�d��0D��[���r�P�r	$��U$7H�
�TiMIG�$�8Dr!�N�/��"z/vl9��E~ڵ-��<��]��o����s��ԉ�e�C�;7����2][�em*�j��d�䣓mQ�8��r����8���vA�x/DE���c!���1��x-��K��H6���<c��*�
.�Y͵̹�o��Y)�:����
42�>����Qg+�}� *|�\"M�	���/�\��9�2�-&�8��n�T���\�N��ejj���j롶�}]����&�l�Ȥ�<X�������D�-}Хy���Z�z�? ��|?�~�?���df�IA"f�	��S[�	�����Ih���Ӊ��?��c��npO&Q<?�����q�84���cO__ߘG���˄�}:��VL��v�p��Ğ�l�}�]]Y7s�������z��"Q󮳥e`�kr��ص�k��Z;��mπF����<�����3�cW.����ì��-��C�R[�h~h�hvi�E��7�N�Ӑ�x�f���e0b	-g��LD��yC����X
U>����P%S%,�3f����f�-~у2�*~W��w6Z-)**z�w���B��K�V�+?J$G��̔��@\)�O�|���\�+���NO�=W��[||~a�΃��>%�y>~᝼
��>�*�*_a�Ft*��筇3<�t�0�/%Q�A�z
��P�`���K������hjkQ��K�������LL�0mm��D�{�d�$D}�j�n��'!��
�ĄN�JĄ�͢�¤��;L
EHg�F��K�"��(,��
�nE���n+��Ww ��}K�j��`�N��;4� �	�"n��F�L7(Z��e�5�UT$!̶�؎����&*��
�Ek(Q�ry��M�Mh���ʑ�I�IuoCi4Q�+��ƅ\��&U�"�J��\���'��=>B,Q�?���✆w�0��R`k����u���
R=�"�F��!�P<��;Ȥ��A���`5}d�1�`҅t�a�6I��lhh(���~��l�Y�Z =��q��tTS��C/f��أg�w��G@c���*�R���rT�����ڪ�
0��a�?�Vb&�l�A�[iDJ��?�?4�W���X�mÃ6�~2��=dS���{���5w���G�ncL,�z���Ѹ�?�c��;k�{��.��ծFf{��k�}��Fj0f��ev����:�ƴc���P
�Ϟ�& p0�9���r����:�t|�� SEL*sH�t|����XMR�F�����SI�:<����P�r����"u�X1��/+@]���^��^�:Li�d�����s�HG���`ģ�砀�IEND�B`�img/volume_icon_zip.svg000064400000021372151215013420011241 0ustar00<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1" width="96" height="96"><defs><linearGradient id="i"><stop offset="0" stop-color="#2f2f2f"/><stop offset=".4" stop-color="#fff"/><stop offset=".6" stop-color="#979797"/><stop offset=".8" stop-color="#505050"/><stop offset="1" stop-color="#e6e6e6"/></linearGradient><linearGradient id="h"><stop offset="0" stop-color="#ededed"/><stop offset="1" stop-color="#b0b0b0"/></linearGradient><linearGradient id="g"><stop offset="0" stop-color="#a2a2a2"/><stop offset="1" stop-color="#fff"/></linearGradient><linearGradient id="e"><stop offset="0" stop-color="#b4b4b4"/><stop offset=".2" stop-color="#646464"/><stop offset=".5" stop-color="#fff"/><stop offset="1" stop-color="#3c3c3c"/></linearGradient><linearGradient id="f"><stop offset="0" stop-color="#fff"/><stop offset=".5" stop-color="#8c8c8c"/><stop offset=".5" stop-color="#cfcfcf"/><stop offset=".6" stop-color="#fff"/><stop offset=".8" stop-color="#c8c8c8"/><stop offset="1" stop-color="#505050"/></linearGradient><linearGradient id="b"><stop offset="0" stop-color="#818181"/><stop offset=".2" stop-color="#f9f9f9"/><stop offset="1" stop-color="#dcdcdc" stop-opacity="0"/></linearGradient><linearGradient id="c"><stop offset="0" stop-color="#dcdcdc"/><stop offset="1" stop-color="#fafafa"/></linearGradient><linearGradient id="a"><stop offset="0" stop-color="#fff"/><stop offset="1" stop-color="#fff" stop-opacity="0"/></linearGradient><linearGradient id="d"><stop offset="0" stop-color="#b4b4b4"/><stop offset="1" stop-color="#dcdcdc"/></linearGradient><linearGradient x1="19" y1="74" x2="87.5" y2="27.4" id="t" xlink:href="#a" gradientUnits="userSpaceOnUse"/><linearGradient x1="6" y1="73" x2="24" y2="73" id="q" xlink:href="#b" gradientUnits="userSpaceOnUse"/><linearGradient x1="6" y1="73" x2="24" y2="73" id="r" xlink:href="#b" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-1 0 0 1 96 0)"/><linearGradient x1="38.7" y1="65.6" x2="38.7" y2="5.8" id="s" xlink:href="#c" gradientUnits="userSpaceOnUse"/><radialGradient cx="90" cy="90" r="42" fx="90" fy="90" id="p" xlink:href="#d" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 -1.08503 2 0 -90 187.7)"/><clipPath id="v"><path d="M66 6v55a3 3 0 0 0 3 3h6a3 3 0 0 0 3-3V6h-4v2h-4V6h-4z" fill="#fff"/></clipPath><filter x="-.2" y="0" width="1.3" height="1.1" color-interpolation-filters="sRGB" id="w"><feGaussianBlur stdDeviation=".9"/></filter><linearGradient x1="68.8" y1="59" x2="75.3" y2="59" id="u" xlink:href="#e" gradientUnits="userSpaceOnUse" gradientTransform="translate(0 -1)"/><linearGradient x1="69" y1="54" x2="73" y2="54" id="x" xlink:href="#f" gradientUnits="userSpaceOnUse" gradientTransform="translate(0 -1)"/><linearGradient x1="63.5" y1="64.2" x2="79" y2="65" id="M" xlink:href="#g" gradientUnits="userSpaceOnUse"/><filter x="-.2" y="-.1" width="1.3" height="1.2" color-interpolation-filters="sRGB" id="N"><feGaussianBlur stdDeviation=".5"/></filter><linearGradient x1="69" y1="17.5" x2="75.1" y2="17.5" id="P" xlink:href="#h" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-1 0 0 1 144 -2)"/><linearGradient x1="68" y1="17.8" x2="76" y2="17.8" id="O" xlink:href="#h" gradientUnits="userSpaceOnUse" gradientTransform="translate(0 -2)"/><linearGradient x1="68.8" y1="59" x2="72.3" y2="59" id="Q" xlink:href="#e" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.12627 0 0 1 -7.4 -49.5)"/><linearGradient x1="69" y1="54" x2="73" y2="54" id="F" xlink:href="#i" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-1 0 0 1 144 -4)"/><linearGradient x1="45.4" y1="92.5" x2="45.4" y2="7" id="j" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.00587 0 0 .99417 100 0)"><stop offset="0"/><stop offset="1" stop-opacity=".6"/></linearGradient><linearGradient x1="32.3" y1="6.1" x2="32.3" y2="90.2" id="l" xlink:href="#j" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.0238 0 0 1.0119 -1.1 -98)"/><linearGradient x1="32.3" y1="6.1" x2="32.3" y2="90.2" id="m" xlink:href="#j" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.0238 0 0 1.0119 -1.1 -98)"/><linearGradient x1="32.3" y1="6.1" x2="32.3" y2="90.2" id="n" xlink:href="#j" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.0238 0 0 1.0119 -1.1 -98)"/><linearGradient x1="32.3" y1="6.1" x2="32.3" y2="90.2" id="o" xlink:href="#j" gradientUnits="userSpaceOnUse" gradientTransform="translate(0 -97)"/><linearGradient x1="32.3" y1="6.1" x2="32.3" y2="90.2" id="k" xlink:href="#j" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.0238 0 0 1.0119 -1.1 -98)"/></defs><g transform="scale(1 -1)"><path d="M12-95A10 10 0 0 0 2-85v71A10 10 0 0 0 12-4h72a10 10 0 0 0 10-10v-71a10 10 0 0 0-10-10H12z" opacity=".1" fill="url(#k)"/><path d="M12-94c-5 0-9 4-9 9v71c0 5 4 9 9 9h72c5 0 9-4 9-9v-71c0-5-4-9-9-9H12z" opacity=".1" fill="url(#l)"/><path d="M12-93a8 8 0 0 0-8 8v71a8 8 0 0 0 8 8h72a8 8 0 0 0 8-8v-71a8 8 0 0 0-8-8H12z" opacity=".2" fill="url(#m)"/><rect width="86" height="85" rx="7" ry="7" x="5" y="-92" opacity=".3" fill="url(#n)"/><rect width="84" height="84" rx="6" ry="6" x="6" y="-91" opacity=".5" fill="url(#o)"/></g><path d="M12 6a6 6 0 0 0-6 6v72a6 6 0 0 0 6 6h72a6 6 0 0 0 6-6V12a6 6 0 0 0-6-6h-9v3h-6V6H12z" fill="url(#p)"/><path d="M6 56v28a6 6 0 0 0 6 6h12V56H6z" fill="url(#q)"/><path d="M90 56v28a6 6 0 0 1-6 6H72V56h18z" fill="url(#r)"/><path d="M6 82v2a6 6 0 0 0 6 6h72a6 6 0 0 0 6-6v-2a6 6 0 0 1-6 6H12a6 6 0 0 1-6-6z" opacity=".1"/><path d="M6 78v2a6 6 0 0 0 6 6h72a6 6 0 0 0 6-6v-2a6 6 0 0 1-6 6H12a6 6 0 0 1-6-6z" opacity=".8" fill="#fff"/><path d="M6 76v2a6 6 0 0 0 6 6h72a6 6 0 0 0 6-6v-2a6 6 0 0 1-6 6H12a6 6 0 0 1-6-6z" opacity=".1"/><path d="M6 72v2a6 6 0 0 0 6 6h72a6 6 0 0 0 6-6v-2a6 6 0 0 1-6 6H12a6 6 0 0 1-6-6z" opacity=".8" fill="#fff"/><path d="M6 70v2a6 6 0 0 0 6 6h72a6 6 0 0 0 6-6v-2a6 6 0 0 1-6 6H12a6 6 0 0 1-6-6z" opacity=".1"/><path d="M12 6a6 6 0 0 0-6 6v56a6 6 0 0 0 6 6h72a6 6 0 0 0 6-6V12a6 6 0 0 0-6-6h-9v3h-6V6H12z" fill="url(#s)"/><path d="M12 6a6 6 0 0 0-6 6v56a6 6 0 0 0 6 6h72a6 6 0 0 0 6-6V12a6 6 0 0 0-6-6h-9v2h9a4 4 0 0 1 4 4v56a4 4 0 0 1-4 4H12a4 4 0 0 1-4-4V12a4 4 0 0 1 4-4h57V6H12z" fill="url(#t)"/><path d="M66 6v55a3 3 0 0 0 3 3h6a3 3 0 0 0 3-3V6h-4v2h-4V6h-4z" fill="#252525"/><path fill="#4d4d4d" d="M70 8h4v49h-4z"/><rect width="6" height="4" rx="1" ry="1" x="69" y="56" fill="url(#u)" stroke="#000" stroke-width=".5" stroke-linecap="square" stroke-opacity=".6"/><path d="M66 6v55a3 3 0 0 0 3 3h6a3 3 0 0 0 3-3V6h-4v2h-4V6h-4z" clip-path="url(#v)" fill="none" stroke="#000" stroke-width="2" stroke-linecap="square" filter="url(#w)"/><path d="M69.5 51c-.3 0-.5.2-.5.5v3c0 .3.2.5.5.5h1c.3 0 .5-.2.5-.5V54h1.5c.3 0 .5-.2.5-.5v-1c0-.3-.2-.5-.5-.5H71v-.5c0-.3-.2-.5-.5-.5h-1z" id="y" fill="url(#x)" stroke="#000" stroke-width=".5" stroke-linecap="square" stroke-opacity=".6"/><use transform="translate(0 -6)" id="z" width="96" height="96" xlink:href="#y"/><use transform="translate(0 -6)" id="A" width="96" height="96" xlink:href="#z"/><use transform="translate(0 -6)" id="B" width="96" height="96" xlink:href="#A"/><use transform="translate(0 -6)" id="C" width="96" height="96" xlink:href="#B"/><use transform="translate(0 -6)" id="D" width="96" height="96" xlink:href="#C"/><use transform="translate(0 -6)" id="E" width="96" height="96" xlink:href="#D"/><use transform="translate(0 -6)" width="96" height="96" xlink:href="#E"/><path d="M74.5 48c.3 0 .5.2.5.5v3c0 .3-.2.5-.5.5h-1a.5.5 0 0 1-.5-.5V51h-1.5a.5.5 0 0 1-.5-.5v-1c0-.3.2-.5.5-.5H73v-.5c0-.3.2-.5.5-.5h1z" id="G" fill="url(#F)" stroke="#000" stroke-width=".5" stroke-linecap="square" stroke-opacity=".6"/><use transform="translate(0 -6)" id="H" width="96" height="96" xlink:href="#G"/><use transform="translate(0 -6)" id="I" width="96" height="96" xlink:href="#H"/><use transform="translate(0 -6)" id="J" width="96" height="96" xlink:href="#I"/><use transform="translate(0 -6)" id="K" width="96" height="96" xlink:href="#J"/><use transform="translate(0 -6)" id="L" width="96" height="96" xlink:href="#K"/><use transform="translate(0 -6)" width="96" height="96" xlink:href="#L"/><path d="M65 6v55a4 4 0 0 0 4 4h6a4 4 0 0 0 4-4V6h-1v55a3 3 0 0 1-3 3h-6a3 3 0 0 1-3-3V6h-1z" fill="url(#M)"/><path d="M69.5 10.5c-1 0-2 .8-2 1.8v10.9c0 1 1 1.8 2 1.8h5c1 0 2-.8 2-1.8V12.3c0-1-1-1.8-2-1.8h-5zm1 9h3v1.8h-3v-1.7z" transform="translate(0 -2)" stroke="#000" stroke-width=".5" stroke-linecap="square" stroke-opacity=".6" filter="url(#N)"/><path d="M69.2 9c-.7 0-1.2.5-1.2 1.1v10.8c0 .6.5 1.1 1.2 1.1h5.6c.7 0 1.2-.5 1.2-1V10c0-.6-.5-1-1.2-1h-5.6zm.7 8H74v3h-4v-3z" fill="url(#O)"/><path d="M74.6 10c.2 0 .5.2.5.5v10c0 .3-.3.5-.5.5h-5.1a.5.5 0 0 1-.5-.5v-10c0-.3.2-.5.5-.5h5zm-.5 7H70v3h4.1v-3z" fill="url(#P)"/><rect width="3.4" height="5" rx=".6" ry=".5" x="70.3" y="7.5" fill="url(#Q)" stroke="#000" stroke-linecap="square" stroke-opacity=".6"/><path opacity=".3" d="M70 16h4v1h-4z"/></svg>img/quicklook-icons.png000064400000003104151215013420011130 0ustar00�PNG


IHDR ��7IDATx���%ЕQ�э�$hiH�"N�.ЍJ#iDC�}�C����~���>�:�i����g��&�e�D����8�M2`���X�<逭�8�O2`�Ӿl�@�]]��4�͚1҉��w�ϛD�.�e��nj��
g��9%za���N5��ZQqHGF3޲�?��Y�/�eڔ)m�ׯ����k*>d�S@���;=I*ֹ�T,q�(���"�~�y6�L��J-ʘ�/�����F�Y]ຍe���e�[[�e����t�̘U��rOW�}Ӿ��񞉟w�x�H�s��b(g�X��;kE�)q.t�լ
-Y'^O]SFǡ���ywl��L��ihjj�~mS�L���.X���,ȏi�H���Yr.YWr��X?���Y�#�m�<5�������֡n�P�a{L���4��� 0HD_��TԷ!'���l�g����O�^P�Q_���9�9�k9H�Ip �w��k��0��{���<�
|m�8G�wP����5juп�s|#|;6���ȀV%��J�
��A8�R&���8�'�k��9|m@���t�"[�>!�
�G97��CԺ2�SQ�&�T���Ȇ �9V2'N$��81�j�sԑc�5�R=;�jWQ@y&�ZЁ��s �N�`@��@`��o�
�������<�=|m��D�w����֮=�Jpq�m۶7
k7�Ֆ�JQm۶ն�x޽���t�5b��n5�g9�����`��͜�iM�߄��Z���j!˛oj=[Ҧ7�?��h�[��-iz�7^�G�kk+���-x�j��LS�,���-B��Of	4�`}��zi�{
����҄�Q�.��>�1mx��W�04n�g�4P�u���kUӥ�?4	��@OW�P��Ǥ�Sż²��F4�=�+�2����QP�LZ?8�5ܙ��~+�����)A�L���l�
|�FO�Z���
��Q��-|�8��f��3�C�V��PxcZ��N�W"�	�{Z��?����A��@�j>7�4�8�L5[�&>D߰����P�S��V"��J�4}[�	+T�ͩ�v{���g\=�Y;:�S�iJ#�xahDzaNۤ"d@�:
;g��� ���	s�G�E*肝���Duyh���Iv��"�7(�~��T0{���I�B_�̲962�cxq:t?<�`�/�=�M�{��$ރm=}E�(�M�e5b� �pR�ؗG�Ä�2���\M�.Y� v�@���ӹ	]e�|�f�щ�[-�Ի���(��g3Tv6mSʦu��Mk�4#.�M]jc#:��3��Db[��cAÚ*p)�`3	��V���vu�����Z�W��iѺBr�ۆe���"�2��L_&��E��S��*��sRW�m(��v�{�V7�養&��6fQ�{�u\+\��\eK��}iz3��i>W�H�>����h.���������Z�����3le���y6K�l�bK-(��ia��Qs2�_;����M��5��IEND�B`�img/volume_icon_box.svg000064400000001256151215013420011226 0ustar00<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48"><g fill="#0288d1"><path d="M25.6 18c-3 0-5.8 1.8-7.2 4.5a8 8 0 0 0-12.2-2.9V12c0-.8-.8-1.7-1.6-1.7-1 0-1.6.7-1.6 1.7v14.5C3 31 6.7 35 11 35c3.2 0 6-1.8 7.4-4.5 1.4 2.7 4 4.5 7.2 4.5 4.6 0 8.1-3.9 8.1-8.4 0-4.7-3.5-8.6-8-8.6M11 31.6a5 5 0 0 1-4.9-5 5 5 0 0 1 4.9-5.2c2.6 0 4.8 2.4 4.8 5.1.2 2.7-2 5-4.8 5zm14.5 0a5 5 0 0 1-4.8-5 5 5 0 0 1 4.8-5.2 5 5 0 0 1 4.9 5.1c0 2.7-2.3 5-4.9 5z"/><path d="M44.8 32.4l-4.3-6 4.3-5.8c.5-.7.3-1.9-.3-2.4-.7-.5-1.8-.3-2.3.3l-3.6 5.1-3.6-5c-.5-.7-1.7-.9-2.3-.4-.7.5-.8 1.7-.3 2.4l4.2 5.9-4.2 5.9c-.5.6-.4 1.8.3 2.3.6.5 1.8.3 2.3-.3l3.6-5 3.6 5c.5.6 1.6.8 2.3.3.6-.5.8-1.7.3-2.3"/></g></svg>img/arrows-active.png000064400000000230151215013420010601 0ustar00�PNG


IHDR"�H�L_IDATx���0��A��+E.ЛO���P��6��P«]
�� s��ɣ��C�]�3���]� 9S@M���֮���q��M�rO;�l�9yIEND�B`�img/edit_onlineconvert.png000064400000001646151215013420011721 0ustar00�PNG


IHDR(-SgAMA���asRGB���IPLTE����FN�DQ�G�E1�[���P�F|�wH�Dz�v��Қ�����
, .�Z����FL�F�FQ�G&�G �FD�<K�G/�FP�o�C �F%�Go+7�1
3�1;�AE�G:�FN�FO�F���c$`%!�A+o(�E/�[D�EF�B����3�[)v,y�uF�G�DM�B���=�a'
 �GF�F{�wN�DJ�Dk�iC�D)x,$s+6���8�EH�[���Q�FD8O�F-�:i�j'>�C)f#8�BN�E]�[1�EB�bz2��ġ��2e�i7�F:�D-q({�vO�D���G�d���c'3b�\O�E6�DW�f���u-T�f#�7\�g���0�D`�h,�E���F�]���E�U�����������[!B�:���UnSB�9P�F"3{,J�A���U�PQ�FR�I.r(���2~*AMBK�A%`!C�:]]_:���B���0D�=G�>L�BM�D9�3������"!";�4J�A.v(! !  !���R�I������" !%!������!"!-r' !!������'d!���M���R�GjNI��IDAT�c෉�j(�/�i������e���ɬ�-.(�Hv1a``����)�,�Ou5�
��2��f�4%��q�@�����-aR��L^v:jΎQI%&.U1M'N�����>��43H��@C�ڃ�KY*`������0��`i��������c�:s1�|�,,�@�ܾ)�n<�F`���mi@��I���ݿw��Њ��Z3z&�Y�e���֯[%8��a������9�{߶M�W��j�KJ���IEND�B`�img/volume_icon_trash.png000064400000001302151215013420011534 0ustar00�PNG


IHDR�a�IDATx�}��-G����~;�mEuPFUT�Qm[���ն�cc�~�J�I��~ϐ!c�}�?pߥ������li;�ҲRi!x��ދ����`�I����G/���Dp��W������N!�z�BA5;m��(D��H7-���}[o����_���<brll����Kכ�_[*�(B)��Z��sH�Ӵ���<��n��1�w磒a��u����kl|a�<8��v��eZ��~1�e ����Z{o���^�-̣X�C��XT���luP�7�lw`X�;B��\vΩ��o���j��W���r�F�A]*l��l�7ԡ�B<~�Y'7SA��Ԥ=>1�4���>���@���< }�ON�wiX2c�w���n�����R�C�3��\ſ1��!�<߇��h�B��Bp���߂�Ԝ����2yJ)�T(�q���(���i�$H��%������
$PJ�@��LHz�<��	B�s��,E"�s
Ԗ<5�����זevV._�H���J�C
����N��22���S�����TJc`J
JᚦQ�����G|�Kq���l����jժ�ȱ�f��@�G_U��^~��*?��!�7�#�X�-[IEND�B`�img/spinner-mini.gif000064400000002632151215013420010414 0ustar00GIF89a�XXXzzz������666���hhh���FFF$$$������!�NETSCAPE2.0!�
,@p�ɗ(uJ�:�S"���$�G�J�����"S�a0	���%��$R��A��d��C��-Ðד)L�XwVrP5�g��*"A`��	
:1
o!Y3�  �!�
,]�����%�<C�IE�8c�D0ap'CaF�IC�0[�֣�X��@@���7i,��O�h$���(� �U��%s!s�j#!�
,Z����X"�XJE&9@�%��TF�5�!HAр��ơ=� #
���R.��p�|���V�}�����%	���(�ā�!��9���S"!�
,\��)	�2����!�&
B��!)���%֠���!`�%����
b0p�r�a�(��a|P��D�}��BIB��&�-��!�
,EɉB�Xi���!(^G�0�QX^O��a�J��� ��C�rɔ>C�@�9N�"BkJf�PE!�
,k��鄠إ&U���%�(�ˆف�1��Ј
aE�,��@!HL����8�Ă`��U
X(���� ��C��A6O	0x0&�C�1�fJPh#il�~!�
,[��ΡX
I���x�JJ2>K�Y���H�-t�L�A�&�$��@��LcQ(N@#��<1P�x$n���x\y�ĚH�;�1(�)!�
,V��#��M�Z�@��]��$�vPN8�HɁ�A�n����� @�5��H+k�ñ�
�b:[���W� Q86����4�c!�
,]��R�X�w�v\G�T�u��a�e	��L x�/�(
'����a0���`�M��a(x�b� 0��V(�z�	#�~>Ƿ !�6J9!�
,Z���R��ji��Z�m�v��N�"\TI�2���Ba���J����r�&	D�)a��Eá8ICF,�-LSp���F`u,�5�F�E!�
,X��I_�x�S��E�R���	��M�ZFӉ�g���`��Dc��U��D�p>
���# $�D 7��7`�&H��&���!�
,Z�I1���
ò���|R����i㕰�Y+)Ų(���`����%xp��c�i(�N "0lN��d PH��N]@<̏F`}q���/)�D;img/quicklook-bg.png000064400000000107151215013430010406 0ustar00�PNG


IHDR'f�nIDATx�c`8�$09�xL�IEND�B`�img/resize.png000064400000000123151215013430007316 0ustar00�PNG


IHDR
e�t�IDATxc�̛3�̙3�`􈑤tfV�A]KpIEND�B`�img/win_10_sprite_icon.png000064400000002601151215013430011513 0ustar00�PNG


IHDR�<LꩼtEXtSoftwareAdobe ImageReadyq�e<%iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 6.0-c002 79.164460, 2020/05/12-16:04:17        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop 21.2 (Macintosh)" xmpMM:InstanceID="xmp.iid:7A59BA79476211EB8B75839F21D6E908" xmpMM:DocumentID="xmp.did:7A59BA7A476211EB8B75839F21D6E908"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:7A59BA77476211EB8B75839F21D6E908" stRef:documentID="xmp.did:7A59BA78476211EB8B75839F21D6E908"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>Z���IDATx��=K1��]�D�-��.n.�:I�
������.nn�����U��x�U�#���r�<���.yh���I��01Crrrrrrrr�!�T���7�h
S�2]�j�ߛr�h��+��F��������b�|\�g��Q��᫑����!G�r�e0ɂ~��5*%GQ�0�^�Y9��כ%'TBʰB�AB�Le�c��N0���w�~{m��T���%Ir�_KVm̥��g&�Ln�&�[���������(�~�ǧgzmZr��V�z�����=ǰ����������͕�N�Dv~i,o��f�#޷�+��m�z�w}�/Z�œ��qI-�.��;�d��xW���&�H�� E1l�*Ps9L��#rA���$>��L���QN>mI*D6�ؒO�\��Y�$G�cM>��y�*��:�8���Jp�``��t��
        Ԟo:�L!�[#IEND�B`�img/volume_icon_onedrive.png000064400000000314151215013430012231 0ustar00�PNG


IHDR�a�IDATx����0���,.�S�£:ũNu���%Nq�S\�o߭���/�w���rshТ�;9@�҄
	WȄ;�@Q2j8x����}8���vꡆG�!�:e��:z��/k>�� $8CRtd�����B����v��?�0��N�FvIEND�B`�img/volume_icon_local.png000064400000000545151215013430011516 0ustar00�PNG


IHDR�a,IDATx�ݐ�YQFﺻ����`))9
�����t0��#��!��~�}皚�G,..V�o�W=;;�x<3�z�1i<�ht�d2��T$"C��7h4zj6�̽VN�SO>�/�;�Z�x�gp�q/�K<�X,ǃ�@ �7����UN&_,�a�׀�>_8
W=���p8�r��f�{�7wv��~�g{�N�\$г���s����2P��	T�����O����=��D�!=�5�ii}��{��fcc�\.���ҫ:�M��r�.���9��^}pџ�|p<d�W�G,�hIEND�B`�img/volume_icon_dropbox.svg000064400000000470151215013430012111 0ustar00<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48"><g fill="#1e88e5"><path d="M42 14L31.4 7.3l-7.4 6 11 6.4zM6 25.6l11 6.5 7-5.5L13.5 20zM17 7.3l-11 7 7.5 5.7L24 13.3zM24 26.6l7.2 5.5L42 25.6l-7-5.9z"/><path d="M32.2 33.8l-1.2.7-1-.8-6-4.5-5.8 4.4-1.1.9-1.2-.7L13 32v2.6L24 42l11-7.2V32z"/></g></svg>img/dialogs.png000064400000013272151215013430007450 0ustar00�PNG


IHDR ��A�k�PLTEGpL

.28���!3?��\JA���UZXX��9*6BW���NUQLcdO]`��˃�֚n<o�����ő��osy%"'E|��幹�KdcDt����{�O��4'@x������z���գ�ȕ����<O���ň��kko�4&��Ԃ��v��t�Ϫu-0/,v����[T>k�ˉ�2F���K_��;������������������	{���}��ACE������9;>�FHK������a�ځ�����t�����+-/����`JU��H�Л����$&'���������w��t�0}ţ����D��YA�hR�����o\/U�5���X\`��<�ʺ������m���3]�246TVY��4�K1o��JMP�(K���t~��WZ]������<k��R9�}"���ORU�����=-��/U�����R�����\��������>p�r��o���B&��5Ce�r�*ez���|�����9��e��#p���ģ����ꐑ��H��]��Q��Qs���Jl����*�~kv��jlmm�����b�€�BV���2��U�⍊����9��0��S���Umys��h�t_ڜ7�<��Dё2`�5��x�]�YFIe�����*�����Η|{o�����f���5�ф������l�ݲc�j2�A���MstRNSB:-T�q�1`��aCD����藙N������礤͸���r�G���~��ۮ�DZ�Ԫ������������������������������������������������'�
�5IDATh޴��O���`�6a�vR5��*i�j�U��}�VݪLp��#�c!��Z	v�S�Q$�Pc�l�H����I�dU��\ RH*��@H�Q6+u���s�g�x\e��ϝ��3�9gt��Z[�`���1���B��͠
���œDZ��ǫ�Lܶa(��z�9��fVƷ�{$J�
i�A�۰���C
�\��q1"yCi�t���͉FX��?�0~t
�>�t;*l�� &�`J�
t;:���M�A�@�35�a�y�f�FO
��(D��T8�b�����ܠD�G��1Zh�W�z8��ܔ�g
�)�`"�ࠗL�Sx�S�M���DAni9��Z^Q憼t�z���EvD�m�s�!
�ߗ��ͤ���
��]���,�x.��x������`������^��^܆��]���ҟ��Q��AT�¹�J��nC�>�v���䎱m�1D�_�i~�Me�}� �¢B�e&�#݆t����'FU<�� ��������8�Ð�+"����&6�,��3UR�V�)3X�����e�eF�ެ��f��D�[��p=j�I��F�>X��X �|$i-���X�"�I��}�J�$��@v3�3@�$����`�+6C
ɜ	*�~� ��d2|E>"��`h���+bzfC2�#�H�n��q�l���xGu��	��AL��f���D|��.�>�+،�9��籗 4#�|,S����"~?�v� ���+ԇ�}�O�Ğ��m��=!�Cҽ)���o�iI��A��|�q�ۢ���Vo�ŶB�c�KM(H��,/	�z�Kt_�V_(
*�9.F���g�Pj"�a�����fޗ�����ey��'�`R�~wH�/!6�|�J�C��y>�;Q��v>�I����>�c7F���`�R��1`/��x�*�k����W�k��4�w�L��և�d�����V̟�$+��5I�W�m!=5�C����?�>=.�F}8z2՞j��N�Վ��S��SO��x~W\[�+8�PEE*���r��Q�E�P�����S���,��B���@L�@��Ǔ�H���mJCE�����
з$��x�R���);�^gɵ�	�F��b'Q�w�%/R�
��Ǡ���;ΰ"[�Ev"xJ�B��A���$g���t�#
u
-57v��-�5��[��n��и�����,��.�<�-8���~}�u_���^^���F�#tݛ�z�G���[�AAK��^�$��
����>�O*�}/@�=4.����(����Ł�Qi��Q����������(�G�O�?�3,�}"�������8RM�>���ϮC���[?k�k��G��Ǫ>b�|K@��a�P�8QH�����T�g�i�ĩc
�%�^	���3
c�c Ls��̌0��[h�a�e@�ܘl�0��iZa	��]��B��q�x��Lڂ�J��g
�GE?,*��
F�׀�5���	a���������KS۫�W�>��,	У��_��5� �vg@Q~!
m2�ګ�r}�6�rY�>�5�>���X�����+�Y�>����UևjQP�n@Q����M���p���@�+9vD]�ŀ��>�,zy�(3��f�>0���W��0�a(.SQaP%?�0�ɏ鏅����P�6ѦL{Y�����^N���v�Ҟ��Ll1�)�HE���\�sf�����krά���BsM0��J�D��n��CyM��ô_��P^
a�GyM����AY��<~R�z�J�!4M+���,d����"zMD`�
�-�&_�!)St� ��?�#=eVP��kR,���!�P_=�M���C*���%�R��t:�#.��7a��?{:�����*{
�&VW�:?���q8�:�����p�`窓
�o�qݾZ���z�{o��0111⚸V�k�p�ZK�T�w�ވ�ޕ \�ℽ���K%�*�[�n���<�€{o�6T(��D�T��r=��Ҽv�]��&������g	gA����_�|	�(��^nF.ӏ�݃���A��/����2�!��^�pp�L��p	2n�=�y󦢇��o��!
��么�E���bs���+����߂��B'9��.�|�x���Q�K�%�e�Bw�W,߼�`,a�*�|���s��_ww��vv�'����+��y��0h���,����R�.���`����A���B��/L��\ͻ�����L>��`75`�$�x"3�?J��`3�K��$p&��q?��p�E�4D�r�4_�K����O�y��s�����Y�ۭ�Y���J¯f����ˑ���Gd�|~x�cI8~��nW�]�����7w��Y>�I���0���pfp�����Ụ�WKK���i�R�.��,�u��<��O˷����w��`x2����?��O�(��7��Z[+�o�f��F����L�Ll�2�6�XO)�W��-�+=8n�iQszNJf+�H`B����g�(.R��@�Ĝ뺐��BBqcQ�$B�Zi����{�f23�q�����M��}�{�͛y��^��%ɽŠf������n���F@�	3x�}qg'&�ne����nbw��?vv^,q1�}��M�F��e�uB�����E;�;�䝀�3/%�����7��硕	�%3�;A3��DQ܄L0�6ʤgZ�����:��m0 ��&dp&S>E��|����Ձ�W/]U'���{��%�\R.�
��і�K$�����R�	�_̀�N�l+�{��)V�qI��WFQjo�?��z���՟퇏�PC����ƽ�/�;��Z~��r�^_ �k9GR�5���h��8J#�{I2W_��N��Yi:W�#W��@2��{�O?���b2������~<qt�]��Y�z�ԇN��@5��r"
�}�W����w���A��$�L�=�������TQ��r���H,�~�n��ܢD>��.���3�>2��=�j��0T����Ӵ������e�~a��f��f�i4Z�
a���`pD#��s,�����?E󇁐��0HpOU�3�ţG���&�<�E�Iӧ�C��|_�C��R@%B	~�WA���;���0J�|wt$8SO`x |��a����#^/���j!����8H��0��*���
a���_Ծ����,;"�韧��L��fk�O�Y�!�,� PNAB�dDs
"��U��hMAD��iMA��'�J�f�۷�� ����$	����&uZY�I�,
ѤvE���cz�z����3����+g��O?9��Fs�z��H�^��F�a_�,}�]��aߜ[�֯��1���.�}}b�hM����?��Cٗ��͟���t�]�\(}\:î��-�斵��oKsss��v����B���n���&�bc���'����z�QsE�<�0�DdH;#R9���,HR�3�*���;c�ސT�h�[��5�
��U@M�jt棂3/�%����*V���XZ��\:�LƆ�&_!yw6�m�M4C�
��6��4-�m,ژ;D�����(�.����Ͽ�y�U*z�
LWQ6jR�b_��>X�Ul���UܕW�	�#����Z�H�ؔ
�9��d��4]�
�u�3�V�A�H����M*kA�Pm4�x�⊊�2yAh4�gFvEE��p�����x�6W���)G
�EnZ�$_�5�(�1�C]�Z#�Vڄ���E$�Z�䡬\�1�3Ї�PV��5�{C����`/�J�1F
��'��E"h���G��d�w��l�ݦ�1+[Y+&��Z����G�$Wư�W��N��k�cc��v������k��-"��w!�ee����;אo-ށsc��4�Z��OM���X�Rk)���ͯ�k��EVta�3 
Wlb�[ĝ�9�_�@g��Q�t%�J�e�S�q�l�����o|�L#~x�O��2<�GƧE�go��0�N
f��x\���������na�h\l�=>��w>���0ꏈ���$��J�~��x*6�ӹ,[�c���>�j��mlqIJ�t���x�X:][tH��Y�r�#K�)��MKg+_�k�F����������Ѳ���+�l��ӧ�l�b�tG
v��Z�f���!"J�G����X,d�E ~�u�YqpS�F�qtp�3�q��eB����u��h骡��`h�/����Q�fŲ�>�1kkW�9�0ww�Z-u��`��Q��iw�բ�_��fs(�����J�Cfs�[:�0�V�ّ��������嶓��UB��� ��h!�~��+o���V��۲�t��qn���
�s.�D����R�eeH���^y�# �J�\�!�WB[�c��o����3����eE��\&�����z��_7
�m]�2���B��R�X���5���D�T1�ьG��dvp�w.�1��pN�6��#�5�@�Y�\b��9�Y(���4wĪ���0z���@%�0id[O�ޞᏁ}�7���6<T���[��X��h��rg��5�%R��&<Z6'�%�	n��`�:�2O�,��lFp���3!���f��(\�mn�0rB���s��.�F B�W�3|�!�K��3�v<����@�2<̹슭��v�����r��7�������8W���QU�x������EN�;��6�?LT����?�a��e�JIEND�B`�img/icons-big.svg000064400000063532151215013430007717 0ustar00<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="1800" viewBox="0 0 480 18000"><defs><linearGradient id="a"><stop offset="0" stop-color="#85b1d9"/><stop offset="1" stop-color="#dff0fe"/></linearGradient><linearGradient gradientUnits="userSpaceOnUse" y2="12.5" x2="20.2" y1="35.7" x1="20.2" id="f" xlink:href="#a" gradientTransform="translate(-1.2 27) scale(1.23846)"/><linearGradient y2="7.4" x2="21.9" y1="35.4" x1="21.7" gradientUnits="userSpaceOnUse" id="e" xlink:href="#a" gradientTransform="matrix(1.27105 0 0 1.27105 -1.2 -24.2)"/><filter id="g" color-interpolation-filters="sRGB"><feColorMatrix values="1 0 0 -0.2 -0 0 1 0 -0.2 -0 0 0 1 -0.2 -0 0 0 0 1 0"/></filter><filter id="o" color-interpolation-filters="sRGB"><feColorMatrix type="hueRotate" values="203" result="color1"/><feColorMatrix type="saturate" values=".7" result="color2"/></filter><filter id="n" color-interpolation-filters="sRGB"><feColorMatrix type="hueRotate" values="135" result="color1"/><feColorMatrix type="saturate" values=".7" result="color2"/></filter><linearGradient id="b"><stop offset="0" stop-color="#18a303"/><stop offset="1" stop-color="#43c330"/></linearGradient><linearGradient id="p" gradientTransform="matrix(2.9999 0 0 2.99917 -328 -2928.3)" gradientUnits="userSpaceOnUse" x1="123.7" x2="111.7" y1="991.7" y2="977"><stop offset="0" stop-color="#535353"/><stop offset="1" stop-color="#7e7e7e"/></linearGradient><linearGradient id="q" gradientTransform="matrix(2.9999 0 0 2.99917 -328 -2928.3)" gradientUnits="userSpaceOnUse" x1="123.7" x2="111.7" xlink:href="#c" y1="991.7" y2="977"/><linearGradient id="c"><stop offset="0" stop-color="#a33e03"/><stop offset="1" stop-color="#d36118"/></linearGradient><linearGradient id="r" gradientUnits="userSpaceOnUse" x1="41" x2="5" xlink:href="#c" y1="46" y2="2"/><linearGradient id="s" gradientTransform="matrix(2.9999 0 0 2.99917 -328 -2928.3)" gradientUnits="userSpaceOnUse" x1="123.7" x2="111.7" xlink:href="#b" y1="991.7" y2="977"/><linearGradient id="t" gradientUnits="userSpaceOnUse" x1="41" x2="7" xlink:href="#b" y1="47" y2="3"/><linearGradient id="u" gradientTransform="matrix(2.9999 0 0 2.99917 -328 -2928.3)" gradientUnits="userSpaceOnUse" x1="123.7" x2="111.7" xlink:href="#d" y1="991.7" y2="977"/><linearGradient id="d"><stop offset="0" stop-color="#0369a3"/><stop offset="1" stop-color="#1c99e0"/></linearGradient><linearGradient id="v" gradientTransform="matrix(1.55551 0 0 1.66668 -316 1319)" gradientUnits="userSpaceOnUse" x1="230.1" x2="204.4" xlink:href="#d" y1="-762.6" y2="-791.4"/></defs><g transform="translate(0 -8369.4) scale(9.93789)"><path d="M42 854.6v35.2H6V843h24.4z" fill="#fff"/><path d="M30.2 843.4l11.3 11.2V889H6.8v-45.5h23.5m.6-1.3H5.3v48.3H43v-36.3z" fill="#788b9c"/><path d="M42 854.6v.4H30v-12h.4z" fill="#eef0f2"/><path d="M30.9 844.2l10 10h-10v-10m0-2h-1.3v13.5H43v-1.3z" fill="#788b9c"/><path word-spacing="0" letter-spacing="0" font-size="8.5" font-weight="400" aria-label="?" d="M21 880h4v4h-4zm3.8-2.2h-3.6v-2.5q0-1.6.5-2.6t2.3-2.4l1.7-1.4q1-.8 1.6-1.6.5-.7.5-1.5 0-1.4-1.3-2.2-1.3-1-3.3-1-1.5 0-3.3.6-1.7.6-3.6 1.6v-3q1.9-.8 3.7-1.3 1.9-.4 3.8-.4 3.6 0 5.7 1.5 2.2 1.6 2.2 4 0 1.3-.7 2.4-.7 1-2.4 2.4l-1.8 1.4-1.3 1q-.4.5-.5.9l-.2.8v1.3z" font-family="sans-serif" fill="navy"/><path d="M.6 937.2v-39.5h13l4 3.8h30.1v35.7z" fill="#b6dcfe"/><path d="M13.5 898.3l3.8 3.8h29.8v34.4H1.3v-38.2h12m.7-1.2H0v40.7h48.3v-36.9H17.8z" fill="#4788c7"/><path d="M.7 21v-33.1h13.6l3.8-2.6h29.6V21z" fill="url(#e)" transform="translate(0 916.2)"/><path d="M47 902.1v34.4H1.4v-31.8h13l.4-.2 3.5-2.4h28.9m1.2-1.2H17.8l-3.8 2.6H0v34.2h48.3z" fill="#4788c7"/><path d="M.6 987.5V949h12.8l3.7 3.8h25.7v34.7z" fill="#b6dcfe"/><path d="M13 949.6l3.8 3.8h25.5v33.5h-41v-37.3H13m.6-1.2H0v39.7h43.3v-36H17.4z" fill="#4788c7"/><path d="M.8 71l4.7-26h13.4l3.7-2.5h25L42.9 71z" fill="url(#f)" transform="translate(0 916.5)"/><path d="M46.9 959.6l-4.5 27.2H1.5L6 962h13l.3-.2 3.3-2.2h24.2m1.5-1.4h-26l-3.7 2.5H5L0 988h43.3z" fill="#4788c7"/><path d="M6 1040.8v-47h24.5l11.6 11.7v35.1z" fill="#fff"/><path d="M30.2 994.5l11.3 11v34.5H6.8v-45.6h23.5m.6-1.3H5.3v48.3H43v-36.2z" fill="#4788c7"/><path d="M30 1006v-12h.5l11.6 11.6v.4z" fill="#dff0fe"/><path d="M30.8 995.1l10 10h-10v-10m0-2h-1.3v13.6h13.4v-1.3z" fill="#4788c7"/><path stroke-miterlimit="10" d="M15.3 1015.3h1.5v6m6.6-.6c-.7 0-1.3-.7-1.3-1.4v-2.7a1.4 1.4 0 0 1 2.7 0v2.7c0 .7-.6 1.3-1.4 1.3zm8 0c-.7 0-1.3-.7-1.3-1.4v-2.7a1.4 1.4 0 0 1 2.7 0v2.7c0 .7-.6 1.3-1.4 1.3zm0 4h1.5v6m-8.1-.6c-.8 0-1.4-.6-1.4-1.4v-2.7a1.4 1.4 0 0 1 2.7 0v2.7c0 .8-.6 1.4-1.3 1.4zm-8 0c-.9 0-1.5-.6-1.5-1.4v-2.7a1.4 1.4 0 0 1 2.7 0v2.7c0 .8-.6 1.4-1.3 1.4z" fill="none" stroke="#4788c7" stroke-width="1.3"/><g id="k"><path d="M6.5 37.5v-35h18.3l8.7 8.7v26.3z" transform="matrix(1.34766 0 0 1.34167 -2.8 1040.7)" fill="#fff"/><path d="M24.6 3l8.4 8.4V37H7V3h17.6m.4-1H6v36h28V11z" transform="matrix(1.34766 0 0 1.34167 -2.8 1040.7)" fill="#4788c7"/><path d="M24.5 11.5v-9h.3l8.7 8.7v.3z" transform="matrix(1.34766 0 0 1.34167 -2.8 1040.7)" fill="#dff2fe"/><path d="M25 3.4l7.6 7.6H25V3.4M25 2h-1v10h10v-1z" transform="matrix(1.34766 0 0 1.34167 -2.8 1040.7)" fill="#4788c7"/><path d="M27.5 17h-15a.5.5 0 0 1-.5-.5c0-.3.2-.5.5-.5h15c.3 0 .5.2.5.5s-.2.5-.5.5zm-4 3h-11a.5.5 0 0 1-.5-.5c0-.3.2-.5.5-.5h11c.3 0 .5.2.5.5s-.2.5-.5.5zm4 3h-15a.5.5 0 0 1-.5-.5c0-.3.2-.5.5-.5h15c.3 0 .5.2.5.5s-.2.5-.5.5zm-4 3h-11a.5.5 0 0 1-.5-.5c0-.3.2-.5.5-.5h11c.3 0 .5.2.5.5s-.2.5-.5.5zm4 3h-15a.5.5 0 0 1-.5-.5c0-.3.2-.5.5-.5h15c.3 0 .5.2.5.5s-.2.5-.5.5z" transform="matrix(1.34766 0 0 1.34167 -2.8 1042)" fill="#4788c7"/></g><path d="M6 1094.5h24.5l11.7 11.7v35.2H6z" fill="#fff"/><path d="M30.2 1095.2l11.3 11.1v34.4H6.8V1095h23.5m.6-1.3H5.3v48.3H43v-36.2z" fill="#2ea26c"/><path d="M30.1 1094.5h.4l11.7 11.7v.4h-12z" fill="#e8f8f1"/><path d="M30.8 1095.7l10.1 10.1h-10v-10m0-2h-1.4v13.5H43v-1.3z" fill="#2ea26c"/><g transform="matrix(1.34166 0 0 1.34166 -2.8 1093.8)" filter="url(#g)"><path d="M28 29v-3l-5-4.8-3 2.8 4.6 5z" fill="#79efa8"/><circle cx="26" cy="17" r="2" fill="#b5ffc9"/><path d="M26 29H12v-4l5-5z" fill="#b5ffc9"/></g><path d="M6 1191.8v-47h24.5l11.7 11.7v35.2z" fill="#fff"/><path d="M30.2 1145.6l11.3 11.1v34.3H6.8v-45.5h23.5m.6-1.5H5.3v48.3H43v-36.2z" fill="#7bad2a"/><path d="M42.2 1157h-12v-12.2h.3l11.7 11.7z" fill="#f2f9e7"/><path d="M30.8 1146l10.2 10.2H31v-10.1m0-2h-1.5v13.6H43v-1.4z" fill="#7bad2a"/><path d="M24.8 1177.9v-12.7c3.4 0 5.3 1.3 5.3 1.3v2.7s-2.4-1.4-4.7-1.4" fill="#c9e69a"/><path d="M25.4 1177.9h-1.3v-13.4h.7c3.7 0 5.6 1.5 5.7 1.5h.3v4.2l-1-.5s-2.4-1.2-4.4-1.2zm0-10.7c1.5 0 3.1.5 4 .9v-1.2c-.5-.3-1.8-1-4-1z" fill="#7bad2a"/><g transform="matrix(1.34166 0 0 1.34166 -2.8 1143)"><circle cx="18" cy="26" r="2.5" fill="#c4e490"/><path d="M18 24a2 2 0 0 1 2 2 2 2 0 0 1-2 2 2 2 0 0 1-2-2c0-1.1.9-2 2-2m0-1a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3z" fill="#7bad2a"/></g><path d="M30.5 1195l11.7 11.7v35.2H6V1195z" fill="#fff"/><path d="M30.2 1195.8l11.3 11.2v34.2H6.8v-45.4h23.5m.6-1.3H5.3v48.2H43v-36.2z" fill="#788b9c"/><path d="M30.5 1195l11.7 11.7v.4h-12v-12z" fill="#eef0f2"/><path d="M30.8 1196.3l10.1 10.1h-10v-10.1m0-2h-1.4v13.5H43v-1.3z" fill="#788b9c"/><path d="M18.8 1231.8l14.8-8.3-14.8-8.4z" fill="#8bb7f0"/><g><path d="M6 1443.4v-47h24.5l11.7 11.7v35.2z" fill="#fff"/><path d="M30.2 1397.1l11.3 11v34.5H6.8v-45.7h23.5m.6-1.3H5.3v48.3H43v-36.2z" fill="#4788c7"/><path d="M30.1 1408.5v-12h.4l11.7 11.6v.4z" fill="#dff0fe"/><path d="M30.8 1397.6l10.1 10h-10v-10m0-2h-1.4v13.6H43v-1.3z" fill="#4788c7"/><path d="M36.7 1426.3a12.5 12.5 0 0 1-25 0c0-6.8 5.6-12.4 12.5-12.4 7 0 12.5 5.6 12.5 12.4z" fill="#c2e8ff"/><path d="M31.5 1436l-.4-1.2a8 8 0 0 1-.6-1.8v-.5c0-.4-.2-.9-.6-1.3l-.6-.4h-.2c-.5-.3-1-.3-1.4-.3-.8 0-1.2 0-1.6-.6v-1.1l.3-.6.3-.6.4-.9.5-1.3.1-.6v-.3l.6-.3h.1l.1-.2c.1 0 .3-.1.3-.4v-.4l.1-.2 1-1a30 30 0 0 0 1.4-1.3v-.5c0-.1-.2-.3-.4-.3a3 3 0 0 0-.4-.1l-.3-.2v-.1l.4-.7.5-.8.3-.3c.1-.3.3-.5.5-.6a1 1 0 0 1 .8 0 12.4 12.4 0 0 1-1 19.3z" fill="#bae0bd"/><path d="M32.4 1417.4a12 12 0 0 1 3.9 8.9c0 3.7-1.6 7.1-4.5 9.5a2 2 0 0 1-.3-1v-.2c-.4-.6-.5-1-.6-1.7v-.4c-.2-.4-.3-1-.7-1.5-.2-.3-.6-.5-.8-.5h-.2l-1.5-.4c-.8 0-1 0-1.3-.3V1429l.3-.6.3-.6.4-.8.6-1.4V1424.7l.5-.2.2-.1c.1-.1.4-.3.4-.8v-.4l1-1 1-1c.3 0 .4-.2.5-.4v-.7a1 1 0 0 0-.6-.5l-.4-.1.7-1.3.3-.3.4-.5h.4m0-.7h-.5c-.4.2-.7.8-1 1.1l-1 1.5c0 .2-.3.5 0 .6h.2l.7.4c.1 0 .3.2.1.3v.2l-2.3 2-.3.6s.2 0 .2.3l-.3.3-.7.4c-.2.3 0 .7-.2 1 0 .8-.6 1.3-.9 2l-.7 1.4c0 .6 0 1 .2 1.4.7 1 2 .5 3 1 .3 0 .6 0 .7.3.5.5.5 1.2.6 1.6l.6 1.9c.1.7.4 1.4.6 2l.3-.2a12.9 12.9 0 0 0 1-19.9h-.3z" fill="#5e9c76"/><path d="M24.3 1419.3l-.1-1.2.1-.7c.1-.4.2-.8.1-1.3l-.1-1.2v-.3h-1.1v-.4l.2-.4a12.3 12.3 0 0 1 5 .7l-.6 1.1v.2c-.2.5-.5 1-.8 1.1l-1 1-.8.6-.7.6a2.7 2.7 0 0 0-.3.2z" fill="#bae0bd"/><path d="M24.1 1414.1c1.3 0 2.6.2 4 .6l-.5.8v.2a2 2 0 0 1-.7 1l-1 1-.8.5-.6.6v-.7l.1-.6c.1-.4.3-.8.2-1.4l-.2-1.3v-.4l-.5-.2h-.4.4m0-.8h-.8l-.4.8c-.1.7.5.6 1 .7l.2 1.3c.2.7-.3 1.2-.3 2 0 .3 0 1.2.3 1.5h.2l.5-.3 1.3-1 1.2-1 1-1.5c0-.3.5-1 .4-1.6a13 13 0 0 0-4.6-.9z" fill="#5e9c76"/><path d="M20.4 1438.4a12.5 12.5 0 0 1-2.2-1v-.5l-.2-.6-.2-.8a18.8 18.8 0 0 0-.6-1.5c-.2-.5-.5-1-.5-1.5v-.5c0-.5 0-1-.3-1.7h2.9l.3.1c.3.1.7.2.9.4v.3l.3.5c.6.7 1.3.8 2 1l.6.2c.1 0 .2 0 .2.3.2.4 0 1 0 1.1l-.2.3c0 .4-.2.8-.4 1l-.8.5-.8.9-.4.5h-.1v.2l-.5.7zm-5-8.8l-.7-.3c-.3 0-.6-.2-.8-.3-1-.6-1.7-1.5-2-2.2 0-.2-.3-.3-.4-.4 0-3.5 1.4-6.7 3.8-9a12 12 0 0 1 3.6-.8h.7c.4.2.8.4 1 .7.3.3.7.6.7 1H20l-.6-.6a1 1 0 0 0-.4 0c-1 0-2.3 1.8-2.4 2.5a2 2 0 0 0 0 1.4c.2.3.5.5.8.6.5 0 1-.4 1.5-1l.5-.2.4-.3.2-.1h.2c.9 0 1.5.8 1.7 1.6v.5c-.3.6-1.4 1-2.4 1.4h-.7c-1 .4-1.8 1.4-1.8 2.4l-.1.8a1 1 0 0 0-.6-.5c-.1-.2-.2-.2-.5-.2l-.4-.1-.6-.2a1 1 0 0 0-.5.2c-.3.2-.8.8-.8 1.4 0 .2 0 .5.3.7l.4.2h.6v.1a57.3 57.3 0 0 0 .5.7z" fill="#bae0bd"/><path d="M18.9 1417h.6l1 .6.3.4h-.5l-.5-.5H19.5l-.4-.2c-1.3 0-2.6 2-2.8 2.7-.1.5-.1 1.3.2 1.8.2.4.5.6 1 .7.6 0 1-.4 1.7-1l.5-.2.3-.3.2-.1c.7 0 1.3.7 1.5 1.4v.2c-.2.4-1 1-2.1 1.3h-.4a1 1 0 0 0-.5 0c-1 .4-2 1.5-2 2.6v.1a1 1 0 0 0-.8-.2l-.3-.1a2 2 0 0 0-.7-.2c-.3 0-.5 0-.7.2v.1c-.4.2-.9.9-.9 1.6v.2c-.5-.5-1-1-1.2-1.5a7 7 0 0 0-.2-.3 12 12 0 0 1 3.6-8.8c1.3-.3 2.5-.6 3.4-.6m.3 13.8a16.5 16.5 0 0 0 1 .3v.2l.2.5v.2c.8.7 1.6 1 2.2 1l.7.2v1h-.1l-.1.3-.3.9-.7.4h-.2l-1 1-.3.5-.2.2-.2.5-1.8-.7v-.4l-.1-.5v-.2l-.3-.7-.2-.8a8 8 0 0 0-.4-.8 3 3 0 0 1-.4-1.3v-.5l-.1-1.3H19m-.2-14.5c-1 0-2.5.2-3.8.6-2.4 2.5-3.9 5.8-3.9 9.4v.2l.3.4c.4 1 1.3 1.8 2.2 2.4.6.4 1.7.4 2.3 1.1.5.6.4 1.3.4 2 0 1 .6 1.7.9 2.5l.4 1.4.2 1.2c.8.6 1.7.9 2.5 1 .2 0 .8-.7.8-1 .4-.3.7-1 1.2-1.2l.8-.5c.3-.3.5-1 .6-1.4.2-.3.3-1 .2-1.4-.1-.2-.2-.4-.5-.5-.8-.3-1.7-.3-2.4-1l-.3-1-1.5-.5h-3c-.4-.2-.7-.7-1-1.2 0 0 0-.4-.3-.4H14.1v-.5c0-.4.2-.8.4-1.1l.4-.1 1 .2.4.2c.4.1.5.7.5 1.1v.3c0 .2.2.2.3.2l.3-2.2c0-1 .9-1.8 1.6-2h.7c1-.3 3-1.2 2.7-2.4-.3-1-1-2-2.1-2h-.4l-.7.6c-.4.3-1.3 1-1.7 1-.8 0-.8-1-.6-1.5 0-.5 1.3-2.3 2-2.3h.3l.6.6c.3.3.7.3 1.2.3l.4-.3v-.3c0-.4-.3-.8-.6-1-.3-.4-.7-.7-1.2-.8a3 3 0 0 0-.8 0z" fill="#5e9c76"/><g><path d="M24.1 1414.1a12.2 12.2 0 1 1 0 24.4 12.2 12.2 0 0 1 0-24.4m0-.7a12.9 12.9 0 1 0 0 25.8 12.9 12.9 0 0 0 0-25.8z" fill="#7496c4"/></g></g><g><path d="M6 1292.5v-47h24.5l11.7 11.6v35.3z" fill="#fff"/><path d="M30.2 1246.2l11.3 11v34.5H6.8V1246h23.5m.6-1.3H5.3v48.3H43v-36.3z" fill="#4788c7"/><path d="M30.1 1257.5v-12h.4l11.7 11.6v.4z" fill="#dff0fe"/><path d="M30.8 1246.7l10.1 10h-10v-10m0-2h-1.4v13.6H43v-1.4z" fill="#4788c7"/><path d="M34.2 1266.2H14a.7.7 0 0 1-.7-.7c0-.3.3-.6.7-.6h20.2c.4 0 .7.3.7.6 0 .4-.3.7-.7.7z" fill="purple"/><path d="M28.8 1270.2H14a.7.7 0 0 1-.7-.7c0-.3.3-.6.7-.6h15c.2 0 .5.3.5.6 0 .4-.3.7-.6.7z" fill="#f55"/><path d="M34.2 1274.3H14a.7.7 0 0 1-.7-.8c0-.3.3-.6.7-.6h20.2c.4 0 .7.3.7.6 0 .5-.3.8-.7.8z" fill="green"/><path d="M28.8 1278.3H14a.7.7 0 0 1-.7-.7c0-.3.3-.6.7-.6h15c.2 0 .5.3.5.6 0 .4-.3.7-.6.7z" fill="olive"/><path d="M34.2 1282.3H14a.7.7 0 0 1-.7-.7c0-.3.3-.6.7-.6h20.2c.4 0 .7.3.7.6 0 .4-.3.7-.7.7z" fill="#500"/></g><g><path d="M42.2 1307.4v35.2H6v-47h24.5z" fill="#fff"/><path d="M30.2 1296.3l11.3 11.3v34.4H6.8v-45.7h23.5m.6-1.3H5.3v48.3H43V1307z" fill="#c74343"/><path d="M42.2 1307.4v.4h-12v-12.1h.3z" fill="#ffd9d9"/><path d="M30.8 1296.9L41 1307H31v-10.2m0-2h-1.5v13.5H43v-1.3zm-16 40.7c-1 0-1.7-.6-1.7-1.3 0-1.9 2.4-3.3 5.6-4.4a38.2 38.2 0 0 0 3.5-8c-.8-2-1.2-3.7-1.2-5 0-.7 0-1.4.4-1.8.2-.5.8-.9 1.4-.9.6 0 1.1.3 1.4.8.2.4.2 1 .2 1.6 0 1.2-.4 3-.9 5a26.2 26.2 0 0 0 3.7 6.3 13 13 0 0 1 5.6.3c1.3.4 1.6 1.2 1.6 1.7s-.3 2-2.6 2a7 7 0 0 1-5.2-2.8c-2.4.3-5 .8-7.2 1.5-1.2 3-3 5-4.7 5zm-.3-1.3h.2c.7 0 1.9-1 2.9-2.5-1.9.8-3 1.7-3 2.5zm14.2-5a5 5 0 0 0 3.4 1.5c1.2 0 1.2-.4 1.2-.5 0-.3-.5-.4-.6-.5-1-.4-2.4-.6-4-.4zm-5.7-5.5a40.3 40.3 0 0 1-2.4 5.4c1.7-.4 3.4-.8 5-1a35.2 35.2 0 0 1-2.6-4.4zm0-8.3c-.2 0-.3 0-.3.2l-.1 1c0 .8 0 1.8.4 2.8.2-1 .4-2 .4-2.9 0-.7-.2-1-.2-1h-.2z" fill="#c74343"/></g><g id="l"><path d="M6.2 474v-46.7h24.4l11.6 11.6v35z" fill="#fff" transform="translate(-.3 916.1) scale(1.00625)"/><path d="M30.2 439.3v-12h.4l11.6 11.6v.4z" fill="#ffd5d5" transform="translate(-.3 916.1) scale(1.00625)"/><path d="M30.3 428l11.2 11v34.2H7v-45.4h23.4m.6-1.3H5.5v48H43v-36z" fill="#e64a19" transform="translate(-.3 916.1) scale(1.00625)"/><path d="M30.9 428.5l10 10H31v-10m0-2h-1.4V440H43v-1.3zM12.8 449l14.5-5.3 7.9 2v22.4l-8 2-14.4-5.3 14.5 2v-19.1l-9.3 2v13.1l-5.2 2z" fill="#e64a19" transform="translate(-.3 916.1) scale(1.00625)"/></g><g id="h"><path d="M6.5 37.5v-35h18.3l8.7 8.7v26.3z" transform="matrix(1.34766 0 0 1.34167 -2.8 1443.2)" fill="#fff"/><path d="M24.6 3l8.4 8.4V37H7V3h17.6m.4-1H6v36h28V11z" transform="matrix(1.34766 0 0 1.34167 -2.8 1443.2)" fill="#4788c7"/><path d="M24.5 11.5v-9h.3l8.7 8.7v.3z" transform="matrix(1.34766 0 0 1.34167 -2.8 1443.2)" fill="#dff0fe"/><path d="M25 3.4l7.6 7.6H25V3.4M25 2h-1v10h10v-1z" transform="matrix(1.34766 0 0 1.34167 -2.8 1443.2)" fill="#4788c7"/><path d="M25.5 19.5l2 4-2 4m-11-8l-2 4 2 4m8-11l-5 14" transform="matrix(1.34766 0 0 1.34167 -2.8 1444.5)" stroke-miterlimit="10" fill="none" stroke="#4788c7" stroke-linecap="round"/></g><g id="j" transform="matrix(1.01074 0 0 1.00625 -.3 916)"><path d="M6.5 2.5h27v35h-27z" transform="translate(-2.5 974) scale(1.33333)" fill="#ffeea3"/><path d="M33 3v34H7V3h26m1-1H6v36h28z" transform="translate(-2.5 974) scale(1.33333)" fill="#ba9b48"/><path d="M20 30.5c-2 0-3.5-1.6-3.5-3.5 0-.6.4-2.5 1-5.3.1-.7.7-1.2 1.4-1.2h2.2c.7 0 1.3.5 1.4 1.2l1 5.3c0 2-1.6 3.5-3.5 3.5z" transform="translate(-2.5 974) scale(1.33333)" fill="#fffae0"/><path d="M21 21c.5 0 1 .3 1 .8 1 4 1 5 1 5.2a3 3 0 0 1-6 0c0-.2 0-1.1 1-5.2a1 1 0 0 1 1-.8h2m0-1h-2a2 2 0 0 0-2 1.6c-.4 1.8-1 4.6-1 5.4a4 4 0 0 0 8 0c0-.8-.6-3.6-1-5.4a2 2 0 0 0-2-1.6z" transform="translate(-2.5 974) scale(1.33333)" fill="#ba9b48"/><circle cx="20" cy="27" r="1.5" transform="translate(-2.5 974) scale(1.33333)" fill="#ba9b48"/><path d="M22.5 19H20l-1-1h3.5z" transform="translate(-2.5 974) scale(1.33333)" fill="#ba9b48"/><circle cx="22.5" cy="18.5" r=".5" transform="translate(-2.5 974) scale(1.33333)" fill="#ba9b48"/><path d="M17.5 20H20l1-1h-3.5z" transform="translate(-2.5 974) scale(1.33333)" fill="#ba9b48"/><circle cx="17.5" cy="19.5" r=".5" transform="translate(-2.5 974) scale(1.33333)" fill="#ba9b48"/><path d="M22.5 17H20l-1-1h3.5z" transform="translate(-2.5 974) scale(1.33333)" fill="#ba9b48"/><circle cx="22.5" cy="16.5" r=".5" transform="translate(-2.5 974) scale(1.33333)" fill="#ba9b48"/><path d="M17.5 18H20l1-1h-3.5z" transform="translate(-2.5 974) scale(1.33333)" fill="#ba9b48"/><circle cx="17.5" cy="17.5" r=".5" transform="translate(-2.5 974) scale(1.33333)" fill="#ba9b48"/><path d="M22.5 15H20l-1-1h3.5z" transform="translate(-2.5 974) scale(1.33333)" fill="#ba9b48"/><circle cx="22.5" cy="14.5" r=".5" transform="translate(-2.5 974) scale(1.33333)" fill="#ba9b48"/><path d="M17.5 16H20l1-1h-3.5z" transform="translate(-2.5 974) scale(1.33333)" fill="#ba9b48"/><circle cx="17.5" cy="15.5" r=".5" transform="translate(-2.5 974) scale(1.33333)" fill="#ba9b48"/><path d="M22.5 13H20l-1-1h3.5z" transform="translate(-2.5 974) scale(1.33333)" fill="#ba9b48"/><circle cx="22.5" cy="12.5" r=".5" transform="translate(-2.5 974) scale(1.33333)" fill="#ba9b48"/><path d="M17.5 14H20l1-1h-3.5z" transform="translate(-2.5 974) scale(1.33333)" fill="#ba9b48"/><circle cx="17.5" cy="13.5" r=".5" transform="translate(-2.5 974) scale(1.33333)" fill="#ba9b48"/><path d="M22.5 11H20l-1-1h3.5z" transform="translate(-2.5 974) scale(1.33333)" fill="#ba9b48"/><circle cx="22.5" cy="10.5" r=".5" transform="translate(-2.5 974) scale(1.33333)" fill="#ba9b48"/><path d="M17.5 12H20l1-1h-3.5z" transform="translate(-2.5 974) scale(1.33333)" fill="#ba9b48"/><circle cx="17.5" cy="11.5" r=".5" transform="translate(-2.5 974) scale(1.33333)" fill="#ba9b48"/><path d="M22.5 9H20l-1-1h3.5z" transform="translate(-2.5 974) scale(1.33333)" fill="#ba9b48"/><circle cx="22.5" cy="8.5" r=".5" transform="translate(-2.5 974) scale(1.33333)" fill="#ba9b48"/><path d="M17.5 10H20l1-1h-3.5z" transform="translate(-2.5 974) scale(1.33333)" fill="#ba9b48"/><circle cx="17.5" cy="9.5" r=".5" transform="translate(-2.5 974) scale(1.33333)" fill="#ba9b48"/><path d="M22.5 7H20l-1-1h3.5z" transform="translate(-2.5 974) scale(1.33333)" fill="#ba9b48"/><circle cx="22.5" cy="6.5" r=".5" transform="translate(-2.5 974) scale(1.33333)" fill="#ba9b48"/><path d="M17.5 8H20l1-1h-3.5z" transform="translate(-2.5 974) scale(1.33333)" fill="#ba9b48"/><circle cx="17.5" cy="7.5" r=".5" transform="translate(-2.5 974) scale(1.33333)" fill="#ba9b48"/><path d="M22.5 5H20l-1-1h3.5z" transform="translate(-2.5 974) scale(1.33333)" fill="#ba9b48"/><circle cx="22.5" cy="4.5" r=".5" transform="translate(-2.5 974) scale(1.33333)" fill="#ba9b48"/><path d="M17.5 6H20l1-1h-3.5z" transform="translate(-2.5 974) scale(1.33333)" fill="#ba9b48"/><circle cx="17.5" cy="5.5" r=".5" transform="translate(-2.5 974) scale(1.33333)" fill="#ba9b48"/><path d="M17.5 4H20l1-1h-3.5z" transform="translate(-2.5 974) scale(1.33333)" fill="#ba9b48"/><circle cx="17.5" cy="3.5" r=".5" fill="#ba9b48" transform="translate(-2.5 974) scale(1.33333)"/></g><g><path d="M6 2147.6v-47h24.5l11.7 11.7v35.2z" fill="#fff"/><path d="M30.2 2101.4l11.3 11.2v34.3H6.8v-45.4h23.5m.6-1.4H5.3v48.2H43V2112z" fill="#f44336"/><path d="M30.1 2112.7v-12h.4l11.7 11.6v.4z" fill="#fde4e3"/><path d="M30.8 2101.9L41 2112H31v-10m0-2h-1.5v13.4H43v-1.4z" fill="#f44336"/><g><path d="M11 2121a2.9 3 0 0 1 3-2.9h20.2a2.9 3 0 0 1 3 2.9v20.4a2.9 3 0 0 1-2.9 2.9H14a2.9 3 0 0 1-3-3z" fill="#f44336"/><path d="M13.2 2120.2v22H35v-22zm12.4 7.5H22v2.6h3.3v1.7H22v4.3h-2.1V2126h5.7zm3 8.6h-1.9V2126h2z" fill="#210403"/></g></g><g><path d="M22.7 2186v-35.2h17l8 8.7v26.5z" fill="#fff"/><path d="M39.5 2151.3l7.8 8.4v25.8H23.2v-34.2h16.3m.4-1H22.2v36.2h26.1v-27z" fill="#4788c7"/><path d="M39.4 2159.8v-9.1h.3l8 8.8v.3z" fill="#dff0fe"/><path d="M39.9 2151.7l7 7.6h-7v-7.6m0-1.4h-1v10.1h9.3v-1z" fill="#4788c7"/><path d="M12 2191.5v-35.3h17.1l8 8.8v26.4z" fill="#fff"/><path d="M29 2156.7l7.7 8.5v25.8H12.6v-34.3h16.3m.4-1H11.6v36.2h26v-27.1z" fill="#4788c7"/><path d="M28.8 2165.3v-9.1h.2l8 8.8v.3z" fill="#dff0fe"/><path d="M29.2 2157l7 7.8h-7v-7.7m0-1.4h-.9v10.1h9.3v-1z" fill="#4788c7"/><g><path d="M.5 2198v-35.2h17l8 8.8v26.4z" fill="#fff"/><path d="M17.3 2163.3l7.7 8.5v25.8H.9v-34.3h16.4m.4-1H0v36.3h26v-27.2z" fill="#4788c7"/><path d="M17.2 2172v-9.2h.3l8 8.8v.3z" fill="#dff0fe"/><path d="M17.7 2163.8l7 7.6h-7v-7.6m0-1.4h-1v10H26v-1z" fill="#4788c7"/></g></g><g id="i"><path d="M6.5 37.5v-35h18.3l8.7 8.7v26.3z" transform="matrix(1.34766 0 0 1.34167 -2.8 1493.5)" fill="#fff"/><path d="M24.6 3l8.4 8.4V37H7V3h17.6m.4-1H6v36h28V11z" transform="matrix(1.34766 0 0 1.34167 -2.8 1493.5)" fill="#4788c7"/><path d="M24.5 11.5v-9h.3l8.7 8.7v.3z" transform="matrix(1.34766 0 0 1.34167 -2.8 1493.5)" fill="#dff0fe"/><path d="M25 3.4l7.6 7.6H25V3.4M25 2h-1v10h10v-1z" transform="matrix(1.34766 0 0 1.34167 -2.8 1493.5)" fill="#4788c7"/><path d="M2.5 3.5h35v33h-35z" transform="matrix(.75201 0 0 .74867 9.2 1512.7)" fill="#fff"/><path d="M37 4v32H3V4h34m1-1H2v34h36z" transform="matrix(.75201 0 0 .74867 9.2 1512.7)" fill="#4788c7"/><path d="M3 4h34v5H3z" transform="matrix(.75201 0 0 .74867 9.2 1512.7)" fill="#98ccfd"/><path d="M14.6 24.6c.5 1.1 1.3 1.9 2.2 1.9 2.1 0 3.2-2 3.2-4.5s-1.2-4.5-3.2-4.5c-1 0-1.7.8-2.2 2m10.8 5.1c-.5 1.1-1.3 1.9-2.2 1.9-2.1 0-3.2-2-3.2-4.5s1.2-4.5 3.2-4.5c1 0 1.7.8 2.2 2m3.1 9a20.6 20.6 0 0 0 0-13m-17 0a20.6 20.6 0 0 0 0 13" stroke-miterlimit="10" transform="matrix(.75201 0 0 .74867 9.2 1512.7)" fill="none" stroke="#4788c7" stroke-linecap="round"/></g><use height="100%" width="100%" transform="translate(0 402.5)" xlink:href="#h"/><use height="100%" width="100%" transform="translate(0 50.3)" xlink:href="#i"/><use height="100%" width="100%" transform="translate(0 100.6)" xlink:href="#i"/><use height="100%" width="100%" transform="translate(0 151)" xlink:href="#i"/><use height="100%" width="100%" transform="translate(0 201.2)" xlink:href="#i"/><use height="100%" width="100%" transform="translate(0 251.6)" xlink:href="#i"/><use height="100%" width="100%" transform="translate(0 301.9)" xlink:href="#i"/><use height="100%" width="100%" transform="translate(0 50.3)" xlink:href="#j"/><use height="100%" width="100%" transform="translate(0 100.6)" xlink:href="#j"/><use height="100%" width="100%" transform="translate(0 151)" xlink:href="#j"/><use height="100%" width="100%" transform="translate(0 1157.2)" xlink:href="#k"/><g transform="translate(0 -201.3)"><g transform="matrix(1.07692 0 0 1.07692 -2.2 -191.4)" id="m"><use transform="translate(2 1205.6) scale(.92857)" height="100%" width="100%" xlink:href="#l"/><path fill="#fff" stroke-width="1.1" d="M11.3 2469.7h26.2v28H11.3z"/></g><path d="M36.5 2474.2H24.9v20.3h11.6c.4 0 .7-.3.7-.7V2475c0-.4-.3-.7-.7-.7z" fill="#ff8a65"/><g fill="#fbe9e7"><path d="M24.1 2488h10.2v1.5H24.1zM24.1 2491h10.2v1.4H24.1zM28.5 2477.8a4.4 4.4 0 1 0 4.4 4.4h-4.4z"/><path d="M30 2476.4v4.3h4.3c0-2.4-2-4.3-4.3-4.3z"/></g><path fill="#e64a19" d="M26.3 2497.5l-15.2-3v-20.3l15.2-3z"/><path d="M19 2479.3h-3.6v10.2h2.2v-3.5h1.1c1.2 0 2.2-.4 3-1 .6-.6 1-1.5 1-2.5 0-2.1-1.3-3.2-3.8-3.2zm-.5 5h-.9v-3.3h1c1.1 0 1.7.6 1.7 1.6s-.6 1.6-1.8 1.6z" fill="#fff"/></g><g transform="translate(0 -201.3)"><use xlink:href="#m" width="100%" height="100%" transform="translate(0 50.3)" fill="none" filter="url(#n)"/><path d="M36.5 2524.5H24.9v20.4h11.6c.4 0 .7-.4.7-.8v-18.9c0-.4-.3-.7-.7-.7z" fill="#4caf50"/><path d="M30 2528.1h5v2.2h-5zM30 2535.4h5v2.2h-5zM30 2539h5v2.2h-5zM30 2531.8h5v2.2h-5zM24.9 2528.1h3.6v2.2H25zM24.9 2535.4h3.6v2.2H25zM24.9 2539h3.6v2.2H25zM24.9 2531.8h3.6v2.2H25z" fill="#fff"/><path d="M26.3 2547.8l-15.2-3v-20.3l15.2-2.9z" fill="#2e7d32"/><path d="M20.6 2539.8l-1.7-3.3-.2-.7-.3.7-1.8 3.3H14l3.2-5.1-3-5.1H17l1.4 3 .3.9.4-.9 1.6-3h2.5l-3 5 3.1 5.2h-2.7z" fill="#fff"/></g><g transform="translate(0 -201.3)"><use transform="translate(0 100.6)" height="100%" width="100%" xlink:href="#m" filter="url(#o)"/><path d="M36.5 2574.8H24.9v20.4h11.6c.4 0 .7-.4.7-.8v-18.9c0-.4-.3-.7-.7-.7z" fill="#2196f3"/><path d="M24.9 2578.5H35v1.4H24.9zM24.9 2581.4H35v1.4H24.9zM24.9 2584.3H35v1.4H24.9zM24.9 2587.2H35v1.4H24.9zM24.9 2590H35v1.5H24.9z" fill="#fff"/><path d="M26.3 2598l-15.2-2.8v-20.4l15.2-2.9z" fill="#0d47a1"/><path d="M22 2590h-1.9l-1.3-6.4-.1-1.2-.2 1.2-1.3 6.5h-2l-2.2-10.2h2l1.1 6.8.1 1.2.2-1.2 1.4-6.8h2l1.2 6.8.2 1.1v-1.1l1.2-6.8h1.8z" fill="#fff"/></g><g><path d="M6 2449.5v-47h24.6l11.7 11.7v35.3z" fill="#fff"/><path d="M30.3 2403.2l11.4 11.3v34.3h-35v-45.6h23.6m.6-1.3H5.3v48.3H43v-36.3z" fill="#ff5722"/><path d="M30.2 2414.6v-12h.4l11.7 11.6v.4z" fill="#ffe8e1"/><path d="M30.9 2403.7L41 2414H31v-10.2m0-1.8h-1.4v13.4H43v-1.4zM11 2422.9a3 3 0 0 1 3-3h20.3a3 3 0 0 1 3 3v20.3a3 3 0 0 1-3 3H14a3 3 0 0 1-3-3z" fill="#ff5722"/><path d="M13.2 2422.1v21.9h21.9V2422zm10.7 16l-.5-2h-2.9l-.5 2h-2.2l3.2-10.3h1.9l3.3 10.3zm5.2 0h-2v-7.6h2zm-.2-8.9a1 1 0 0 1-.8.3 1 1 0 0 1-.8-.3 1 1 0 0 1-.3-.7c0-.3.1-.6.3-.8.2-.2.5-.3.8-.3.3 0 .6.1.8.3.2.2.3.5.3.8 0 .3 0 .5-.3.7z" fill="#1c0802"/><path d="M21 2434.3h2l-1-3.7z" fill="#1c0802"/></g><g><path d="M6.4 0A3.1 3.1 0 0 0 4 3v42c0 1.6 1.4 3 3 3h34c1.6 0 3-1.4 3-3V18.8a3 3 0 0 0-.8-2.1L27.3.9a3 3 0 0 0-2.1-.9H7a3 3 0 0 0-.6 0zM33 0c-1 .3-1.3 1.9-.6 2.6l9 9c.9.9 2.6.2 2.6-1v-9c0-.9-.7-1.6-1.5-1.6H33z" fill="url(#p)" transform="translate(0 2452.2) scale(1.00625)"/><path d="M7 2455.2v42.3h34.3v-26.2l-16.1-16.1z" fill="#fff"/></g><g><path d="M6.4 0A3.1 3.1 0 0 0 4 3v42c0 1.6 1.4 3 3 3h34c1.6 0 3-1.4 3-3V18.8a3 3 0 0 0-.8-2.1L27.3.9a3 3 0 0 0-2.1-.9H7a3 3 0 0 0-.6 0zM33 0c-1 .3-1.3 1.9-.6 2.6l9 9c.9.9 2.6.2 2.6-1v-9c0-.9-.7-1.6-1.5-1.6H33z" fill="url(#q)" transform="translate(0 2502.5) scale(1.00625)"/><path d="M7 2505.5v42.3h34.3v-26.2l-16.1-16.1z" fill="#fff"/><path d="M13 20a2 2 0 0 0-2 2v16c0 1.1.9 2 2 2h22a2 2 0 0 0 2-2V22a2 2 0 0 0-2-2zm0 2h22v16H13zm2 3v2h18v-2zm2 5a1 1 0 1 0 0 2 1 1 0 0 0 0-2zm3 0v2h13v-2zm-3 4a1 1 0 1 0 0 2 1 1 0 0 0 0-2zm3 0v2h13v-2z" fill="url(#r)" transform="translate(0 2502.5) scale(1.00625)"/></g><g><path d="M6.4 0A3.1 3.1 0 0 0 4 3v42c0 1.6 1.4 3 3 3h34c1.6 0 3-1.4 3-3V18.8a3 3 0 0 0-.8-2.1L27.3.9a3 3 0 0 0-2.1-.9H7a3 3 0 0 0-.6 0zM33 0c-1 .3-1.3 1.9-.6 2.6l9 9c.9.9 2.6.2 2.6-1v-9c0-.9-.7-1.6-1.5-1.6H33z" fill="url(#s)" transform="translate(0 2552.8) scale(1.00625)"/><path d="M7 2555.8v42.3h34.3v-26.2l-16.1-16z" fill="#fff"/><path d="M12 19v21h13v1h11V30h-2V19h-1zm1 1h6v3h-6zm7 0h6v3h-6zm7 0h6v3h-6zm-14 4h6v3h-6zm7 0h6v3h-6zm7 0h6v3h-6zm-14 4h6v3h-6zm7 0h6v2h-1v1h-5zm7 0h6v2h-6zm-1 3h9v9h-9v-8zm-13 1h6v3h-6zm7 0h5v3h-5zm-7 4h6v3h-6zm7 0h5v3h-5z" fill="url(#t)" transform="translate(0 2552.8) scale(1.00625)"/><g fill="#43c330"><path d="M26.2 2588h3v5h-3zM29.2 2585h3v8h-3zM32.2 2590h3v3h-3z"/></g><g fill="#ccf4c6"><path d="M27.2 2589h1v4h-1zM30.2 2586h1v7h-1zM33.2 2591h1v2h-1z"/></g></g><g><path d="M6.4 0A3.1 3.1 0 0 0 4 3v42c0 1.6 1.4 3 3 3h34c1.6 0 3-1.4 3-3V18.8a3 3 0 0 0-.8-2.1L27.3.9a3 3 0 0 0-2.1-.9H7a3 3 0 0 0-.6 0zM33 0c-1 .3-1.3 1.9-.6 2.6l9 9c.9.9 2.6.2 2.6-1v-9c0-.9-.7-1.6-1.5-1.6H33z" fill="url(#u)" transform="translate(0 2603.1) scale(1.00625)"/><path d="M7 2606.1v42.3h34.3v-26.2l-16.1-16z" fill="#fff"/><path d="M12 18v2h8v-2zm10 0v10h14V18zm1 1h12v8-1l-2.5-3-2.5 2-3.5-4.5L23 26v-7zm-11 3v2h8v-2zm0 4v2h8v-2zm0 4v2h24v-2zm0 4v2h24v-2zm0 4v2h18v-2z" fill="url(#v)" transform="translate(0 2603.1) scale(1.00625)"/></g></g></svg>img/edit_tuiimgedit.png000064400000000275151215013430011176 0ustar00�PNG


IHDR���R'PLTE��;��.�����!��`�ۙ��A��4����S�������dmQIDAT�c@F��PPPP(��PaCH,���Ueg��x�,Z���{�!��PfL�((�b�M-(��#��
�S�,IEND�B`�img/volume_icon_local.svg000064400000037520151215013430011534 0ustar00<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64" viewBox="0 0 48 48" overflow="visible"><defs><linearGradient id="b" gradientUnits="userSpaceOnUse" x1="24" y1="39.07" x2="24" y2="8.93" gradientTransform="matrix(1.09746 0 0 1.09746 -2.44 -2.24)"><stop offset="0" stop-color="#7d7d99"/><stop offset="1" stop-color="#585868"/></linearGradient><linearGradient id="c" gradientUnits="userSpaceOnUse" x1="24" y1="41.44" x2="24" y2="6.56" gradientTransform="matrix(1.09746 0 0 1.09746 -2.44 -2.24)"><stop offset="0" stop-color="#cecedb"/><stop offset=".58" stop-color="#b1b1c5"/><stop offset="1" stop-color="#9a9ab1"/></linearGradient><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="42.8" y1="3.42" x2="18.71" y2="27.51"><stop offset="0" stop-color="#fff"/><stop offset=".07" stop-color="#f5f5f7"/><stop offset=".31" stop-color="#d7d7e1"/><stop offset=".55" stop-color="#c2c2d2"/><stop offset=".78" stop-color="#b5b5c8"/><stop offset="1" stop-color="#b1b1c5"/></linearGradient><linearGradient id="e" gradientUnits="userSpaceOnUse" x1="4.39" y1="28.4" x2="43.61" y2="28.4" gradientTransform="matrix(1.09746 0 0 1.09746 -2.44 -2.24)"><stop offset="0" stop-color="#9a9ab1"/><stop offset=".26" stop-color="#7d7d99"/><stop offset="1" stop-color="#585868"/></linearGradient><linearGradient id="f" gradientUnits="userSpaceOnUse" x1="4.39" y1="28.4" x2="43.61" y2="28.4" gradientTransform="matrix(1.09746 0 0 1.09746 -2.44 -2.24)"><stop offset="0" stop-color="#fff"/><stop offset="1" stop-color="#ccc"/></linearGradient><linearGradient id="g" gradientUnits="userSpaceOnUse" x1="24" y1="28.28" x2="24" y2="38.75" gradientTransform="matrix(1.09746 0 0 1.09746 -2.44 -2.24)"><stop offset="0" stop-color="#fff"/><stop offset="1" stop-color="#ccc"/></linearGradient><linearGradient id="h" gradientUnits="userSpaceOnUse" x1="24" y1="38.25" x2="24" y2="27.38" gradientTransform="matrix(1.09746 0 0 1.09746 -2.44 -2.24)"><stop offset="0" stop-color="#fff"/><stop offset="1" stop-color="#ccc"/></linearGradient><linearGradient id="i" gradientUnits="userSpaceOnUse" x1="39.51" y1="37.32" x2="39.51" y2="35.18" gradientTransform="matrix(1.09746 0 0 1.09746 -2.44 -2.24)"><stop offset=".01" stop-color="#fff"/><stop offset="1" stop-color="#b6b6b6"/></linearGradient><linearGradient id="j" gradientUnits="userSpaceOnUse" x1="39.51" y1="37.22" x2="39.51" y2="35.38" gradientTransform="matrix(1.09746 0 0 1.09746 -2.44 -2.24)"><stop offset=".01" stop-color="#b6b6b6"/><stop offset=".37" stop-color="#9d9d9d"/><stop offset=".74" stop-color="#898989"/><stop offset="1" stop-color="#828282"/></linearGradient><linearGradient id="k" gradientUnits="userSpaceOnUse" x1="-323.35" y1="37.99" x2="-323.35" y2="36.08" gradientTransform="matrix(-1.09746 0 0 .8231 -313.94 6.86)"><stop offset=".01" stop-color="#9f6"/><stop offset=".24" stop-color="#68de56"/><stop offset=".48" stop-color="#3bc147"/><stop offset=".7" stop-color="#1bab3c"/><stop offset=".88" stop-color="#079e35"/><stop offset="1" stop-color="#093"/></linearGradient><linearGradient id="l" gradientUnits="userSpaceOnUse" x1="39.49" y1="36.68" x2="39.54" y2="35.27" gradientTransform="matrix(1.09746 0 0 1.09746 -2.44 -2.24)"><stop offset=".01" stop-color="#3c3"/><stop offset=".36" stop-color="#1bb433"/><stop offset=".74" stop-color="#07a033"/><stop offset="1" stop-color="#093"/></linearGradient><linearGradient id="m" gradientUnits="userSpaceOnUse" x1="39.51" y1="35.48" x2="39.51" y2="36.4" gradientTransform="matrix(1.09746 0 0 1.09746 -2.44 -2.24)"><stop offset="0" stop-color="#fff"/><stop offset=".09" stop-color="#e8f7d6"/><stop offset=".23" stop-color="#c8ed9e"/><stop offset=".36" stop-color="#ade46d"/><stop offset=".5" stop-color="#97dc46"/><stop offset=".63" stop-color="#85d627"/><stop offset=".76" stop-color="#79d212"/><stop offset=".89" stop-color="#72d004"/><stop offset="1" stop-color="#6fcf00"/></linearGradient><linearGradient id="n" gradientUnits="userSpaceOnUse" x1="8.18" y1="35.36" x2="20.94" y2="35.36" gradientTransform="matrix(1.09746 0 0 1.09746 -2.44 -2.24)"><stop offset="0" stop-color="#dfdfdf"/><stop offset="1" stop-color="#a2a2a2"/></linearGradient><linearGradient id="o" gradientUnits="userSpaceOnUse" x1="14.56" y1="33.7" x2="14.56" y2="37.03" gradientTransform="matrix(1.09746 0 0 1.09746 -2.44 -2.24)"><stop offset="0" stop-color="#828282"/><stop offset="1" stop-color="#a2a2a2"/></linearGradient><linearGradient xlink:href="#a" id="d" x1="41.87" y1="9.41" x2="5.74" y2="29.21" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.09746 0 0 1.09746 -2.44 -2.24)"/></defs><path d="M8.96 7.64a3.13 3.13 0 0 0-3.13 2.85l.04-.18-.11.55.04-.2-.1.54.04-.2-.1.55.03-.19-.1.53.03-.18-.1.53.04-.18-.09.53.03-.19-.1.54.04-.19-.11.53.04-.17-.1.52.04-.17-.1.52.03-.18-.1.53.03-.18-.1.52.04-.17-.09.53.03-.18-.1.53.04-.18-.1.53.03-.18-.1.53.04-.18-.1.52.03-.18-.1.53.03-.17-.08.52.02-.17-.09.52.03-.17-.1.51.04-.16-.1.51.03-.17-.1.53.04-.18-.1.53.03-.18-.09.53.03-.18-.1.52.04-.17-.1.52.03-.17-.1.52.04-.17-.1.51.03-.16-.09.51.03-.16-.1.51.03-.16-.09.51.03-.16-.1.52.04-.18-.1.52.03-.17-.1.52.04-.17-.09.52.02-.17-.09.52.03-.17-.1.51.03-.15-.09.5.03-.16-.1.51.04-.16-.1.51.03-.16-.08.51.02-.16-.09.5.02-.15-.09.5.04-.15-.1.5.03-.15-.1.5.03-.16-.1.52.04-.17-.09.52.02-.16-.08.5.02-.15-.09.5.03-.15-.1.5.04-.16-.1.5.02-.15-.09.5.03-.15-.1.5.04-.16-.09.5.02-.15-.08.5.02-.15-.09.5.02-.15-.09.5.03-.14-.1.49.04-.15-.1.5.04-.15c-.08.3-.11.59-.11.88v6.47a3.6 3.6 0 0 0 3.6 3.6h38.02a3.6 3.6 0 0 0 3.6-3.6v-6.47a4 4 0 0 0-.1-.88l.01.15-.08-.5.02.15-.09-.5.02.16-.09-.5.03.15-.1-.5.03.15-.09-.5.02.16-.08-.5-.07-.36.03.15-.1-.5.04.16-.09-.51.02.16-.09-.51.03.16-.1-.5.03.15-.09-.5.02.16-.08-.52.02.16-.09-.5.03.16-.1-.5.04.15-.1-.5.03.15-.1-.5.04.16-.1-.52.03.16-.09-.51.02.16-.08-.51.02.16-.09-.51.02.17-.08-.51.03.15-.1-.5.03.16-.1-.52.04.17-.1-.52.03.17-.1-.52.03.18-.1-.53.04.18-.09-.52.02.16-.08-.51.02.16-.1-.51.04.16-.1-.51.04.17-.1-.52.03.17-.1-.53.03.18-.1-.52.04.17-.1-.52.03.18-.08-.53.02.17-.1-.52.03.18-.09-.53.04.17-.1-.52.03.17-.1-.52.03.18-.07-.52.03.17-.1-.52.04.17-.1-.53.03.18-.1-.53.03.19-.1-.53.04.18-.09-.53.02.18-.09-.53.03.18-.1-.53.04.19-.1-.53.04.17-.1-.52.03.17-.1-.52.03.17-.1-.52.04.17-.1-.53.03.2-.1-.55.04.19-.1-.53.03.19-.09-.55.04.2-.11-.54.04.19-.11-.54.04.19-.1-.54.04.18-.1-.53.03.2a3.12 3.12 0 0 0-3.12-2.87H8.95z" font-size="12" opacity=".2" stroke-width="1.1"/><path d="M8.75 7.23a3.13 3.13 0 0 0-3.12 2.86l.03-.19-.1.54.03-.2-.1.55.04-.2-.1.54.03-.19-.09.54.04-.19-.11.54.04-.18-.1.52.03-.17-.1.52.04-.17-.1.52.03-.18-.1.54.04-.2-.1.54.03-.18-.09.53.04-.18-.11.53.04-.19-.1.53.03-.18-.1.53.04-.18-.1.53.03-.17-.08.52.02-.17-.1.51.04-.17-.1.52.04-.17-.1.52.03-.17-.1.53.03-.18-.1.52.04-.17-.1.52.03-.17-.08.52.02-.18-.1.53.04-.18-.1.53.04-.17-.1.51.03-.16-.1.51.03-.16-.08.51.02-.17-.09.52.03-.17-.1.51.04-.16-.1.52.03-.17-.1.52.04-.17-.1.52.03-.17-.09.52.02-.18-.08.52.03-.16-.1.51.03-.16-.1.51.03-.16-.1.51.04-.16-.1.51.04-.16-.1.52.03-.17-.09.5.02-.16-.08.52.02-.17-.09.52.03-.17-.1.5.04-.14-.1.5.03-.15-.1.5.04-.16-.1.51.03-.16-.09.51.02-.16-.08.5.02-.15-.09.5.02-.15-.08.5.03-.15-.1.5.03-.16-.1.5.04-.15-.1.5.03-.15-.09.51.02-.15-.08.5.03-.15-.1.5.03-.16-.1.5.04-.15-.1.5.03-.15-.09.5.03-.15c-.08.29-.11.58-.11.88v6.47a3.6 3.6 0 0 0 3.6 3.6h38.02a3.6 3.6 0 0 0 3.6-3.6v-6.48c0-.29-.04-.58-.1-.88l.02.16-.1-.5.03.15-.09-.5.02.15-.08-.5.02.15-.09-.5.02.16-.09-.5.04.15-.1-.5-.07-.36.04.16-.1-.5.03.16-.09-.5.02.15-.08-.5.02.14-.09-.5.02.16-.09-.5.03.15-.1-.5.04.15-.1-.5.04.15-.1-.5.03.16-.1-.51.03.16-.08-.52.02.17-.09-.52.02.17-.09-.5.03.15-.1-.5.03.16-.09-.52.04.16-.1-.51.03.16-.1-.5.03.15-.1-.5.04.16-.1-.51.03.16-.09-.51.03.16-.08-.52.03.17-.1-.52.04.17-.1-.52.03.17-.1-.52.03.18-.1-.53.04.17-.09-.52.02.17-.08-.51.03.17-.1-.52.03.17-.1-.52.04.17-.1-.51.03.16-.1-.53.03.18-.1-.53.04.19-.09-.53.02.18-.08-.53.03.18-.11-.53.04.17-.1-.51.04.16-.1-.51.03.16-.1-.51.03.17-.1-.52.04.17-.1-.53.03.18-.1-.53.04.19-.1-.53.03.18-.09-.53.04.18-.11-.53.04.19-.1-.54.03.19-.1-.53.04.17-.1-.52.03.17-.1-.52.04.18-.1-.53.03.18-.1-.54.04.2-.1-.55.04.19-.1-.53.03.19-.1-.55.04.2-.11-.55.04.2a3.13 3.13 0 0 0-3.12-2.86z" font-size="12" opacity=".2" stroke-width="1.1"/><path d="M8.35 6.82A3.13 3.13 0 0 0 5.2 9.67l.03-.19-.09.55.04-.2-.11.54.04-.18-.1.52.03-.17-.1.52.04-.17-.1.53.03-.18-.1.53.04-.19-.1.54.03-.19-.09.53.04-.18-.11.53.04-.19-.1.54.04-.18-.1.53.03-.19-.1.53.03-.17-.08.52.02-.17-.09.52.03-.17-.1.51.04-.17-.1.54.03-.18-.1.52.04-.18-.1.53.03-.18-.09.53.02-.18-.08.53.02-.18-.09.52.03-.16-.1.51.04-.17-.1.52.03-.17-.1.52.04-.17-.1.52.03-.17-.09.52.02-.17-.08.52.03-.17-.1.52.03-.18-.1.52.04-.17-.1.52.03-.17-.09.52.03-.16-.1.51.04-.16-.1.51.03-.16-.1.51.04-.17-.1.51.03-.16-.09.52.03-.17-.1.52.03-.17-.09.52.03-.17-.1.5.04-.15-.1.5.03-.16-.1.52.04-.16-.1.5.03-.15-.1.5.04-.15-.1.5.03-.16-.09.51.03-.16-.1.51.03-.16-.09.52.03-.17-.1.5.04-.15-.1.5.03-.15-.08.5.02-.16-.1.52.03-.16-.09.5.03-.15-.1.5.03-.15-.09.5.03-.16-.1.5.04-.15-.09.5.02-.15-.08.5.02-.15-.1.5.03-.16-.09.5.03-.15-.1.5.03-.15c-.07.3-.11.6-.11.88v6.48a3.6 3.6 0 0 0 3.61 3.6h38.02a3.6 3.6 0 0 0 3.6-3.6V31.3c0-.3-.04-.58-.11-.88l.03.16-.1-.5.03.15-.1-.5.04.16-.1-.5.03.15-.09-.51.03.15-.1-.5.03.16-.09-.5-.06-.35.02.15-.09-.5.03.16-.1-.51.04.16-.1-.52.03.17-.1-.5.04.15-.1-.5.03.16-.09-.52.02.16-.08-.51.02.16-.09-.5.02.15-.09-.5.04.15-.1-.5.03.16-.1-.51.04.16-.1-.51.03.16-.09-.5.02.16-.1-.53.04.18-.09-.52.02.16-.09-.5.03.16-.1-.52.04.17-.1-.52.04.16-.1-.5.03.16-.1-.52.03.17-.1-.51.04.16-.09-.51.02.16-.09-.52.03.17-.1-.52.03.18-.09-.53.04.18-.1-.52.03.17-.1-.52.03.17-.1-.52.04.17-.08-.52.03.16-.1-.51.04.17-.1-.52.03.18-.1-.52.04.16-.1-.52.03.18-.1-.53.04.18-.1-.53.03.18-.09-.53.02.18-.08-.53.03.19-.11-.53.04.18-.1-.53.04.17-.1-.52.03.17-.1-.52.04.18-.1-.52.03.17-.1-.53.03.18-.1-.53.04.18-.09-.53.03.18-.1-.53.04.19-.11-.54.04.19-.1-.53.04.19-.1-.55.03.2-.1-.54.03.18-.1-.53.04.18-.09-.54.03.2-.1-.55.05.19a3.13 3.13 0 0 0-3.14-2.85z" font-size="12" fill="url(#b)" stroke-width="1.1"/><path d="M45.34 30.7a2.52 2.52 0 0 0-.06-.34 1.8 1.8 0 0 0-.07-.35 1.98 1.98 0 0 0-.06-.36 2.41 2.41 0 0 0-.07-.35c0-.1-.03-.22-.07-.34 0-.12-.03-.24-.06-.35 0-.1-.04-.23-.06-.35l-.06-.35-.07-.34a1.8 1.8 0 0 0-.06-.35l-.07-.35-.07-.35-.06-.34a2.41 2.41 0 0 0-.07-.36c0-.1-.03-.23-.05-.35l-.07-.35-.06-.34a1.8 1.8 0 0 0-.07-.35l-.07-.35a2.3 2.3 0 0 0-.06-.35c0-.11-.04-.22-.07-.34 0-.12-.03-.24-.06-.35 0-.12-.04-.24-.06-.35l-.06-.36-.07-.34a1.8 1.8 0 0 0-.07-.35 1.8 1.8 0 0 0-.06-.35l-.07-.35a2.2 2.2 0 0 0-.06-.35c0-.11-.04-.22-.07-.34 0-.12-.03-.24-.07-.35 0-.11-.03-.23-.05-.35l-.07-.35-.06-.34a1.8 1.8 0 0 0-.07-.36 1.8 1.8 0 0 0-.06-.35 2.2 2.2 0 0 0-.07-.35c0-.1-.03-.23-.07-.35 0-.1-.03-.23-.06-.34 0-.12-.03-.24-.06-.35 0-.12-.04-.24-.06-.35l-.07-.35-.06-.35-.07-.34a1.8 1.8 0 0 0-.07-.36c0-.1-.03-.23-.06-.35 0-.1-.03-.23-.07-.35 0-.1-.03-.23-.05-.34-.01-.12-.05-.24-.07-.35a1.8 1.8 0 0 0-.06-.35l-.07-.35-.07-.35a1.86 1.86 0 0 0-.06-.34c0-.12-.03-.24-.07-.35 0-.12-.03-.25-.06-.36 0-.1-.04-.23-.06-.35l-.06-.35a1.86 1.86 0 0 0-.07-.34 1.8 1.8 0 0 0-.07-.35 1.8 1.8 0 0 0-.06-.35 2.05 2.05 0 0 0-2.04-1.87H8.35c-1.08 0-1.96.83-2.04 1.87-.04.11-.06.22-.07.35l-.07.35a1.7 1.7 0 0 0-.06.34 1.7 1.7 0 0 0-.07.34 1.8 1.8 0 0 0-.06.35l-.06.36c-.03.1-.05.21-.06.35-.04.1-.06.22-.07.35a1.7 1.7 0 0 0-.07.34 1.8 1.8 0 0 0-.06.35 1.8 1.8 0 0 0-.07.35c-.03.11-.05.22-.06.35l-.06.35a1.7 1.7 0 0 0-.06.34 1.8 1.8 0 0 0-.07.35 1.8 1.8 0 0 0-.07.35c-.03.11-.05.22-.06.36a1.7 1.7 0 0 0-.07.34 1.8 1.8 0 0 0-.06.35l-.06.35a1.8 1.8 0 0 0-.06.35c-.04.11-.06.22-.07.35l-.07.34-.06.35-.06.35c-.03.11-.05.22-.06.35-.03.11-.06.22-.07.36a1.7 1.7 0 0 0-.06.34 1.8 1.8 0 0 0-.07.35l-.07.35-.06.35-.06.34a1.8 1.8 0 0 0-.06.35 1.8 1.8 0 0 0-.07.35c-.03.11-.05.22-.06.35a1.7 1.7 0 0 0-.07.34l-.07.35-.06.36-.06.35c-.03.1-.05.22-.06.35-.03.1-.06.22-.07.35-.02.1-.05.22-.06.34-.03.11-.06.23-.07.35l-.05.35c-.04.11-.06.22-.07.35a1.7 1.7 0 0 0-.07.34 1.8 1.8 0 0 0-.06.35 1.8 1.8 0 0 0-.07.36c-.02.1-.05.22-.06.35l-.07.34-.07.35-.05.35a1.7 1.7 0 0 0-.07.34 1.8 1.8 0 0 0-.06.35 1.8 1.8 0 0 0-.07.35c-.02.11-.05.23-.06.35l-.07.34-.05.36a1.8 1.8 0 0 0-.07.35c-.03.1-.06.22-.07.35a2.52 2.52 0 0 0-.07.6v6.48a2.5 2.5 0 0 0 2.5 2.5H42.9a2.5 2.5 0 0 0 2.5-2.5V31.3c0-.2-.02-.4-.07-.6z" font-size="12" fill="url(#c)" stroke-width="1.1"/><path d="M10.7 7.91L3.5 30.35c13.7-1.65 27.04-1.65 40.54-.91L37.1 7.9z" font-size="12" fill="url(#d)" stroke-width="1.1"/><path d="M2.77 29.18l-.05.34a1.8 1.8 0 0 0-.07.35c-.03.11-.05.22-.06.36a1.7 1.7 0 0 0-.07.34c-.02.1-.06.23-.07.35a2.52 2.52 0 0 0-.07.61v2.66c.47.44 1.1.7 1.79.7h39.46c.7 0 1.32-.26 1.79-.7v-2.66c0-.22-.03-.42-.08-.61a2.52 2.52 0 0 0-.06-.35 1.86 1.86 0 0 0-.07-.34 1.8 1.8 0 0 0-.06-.36 2.41 2.41 0 0 0-.07-.35c0-.1-.03-.23-.07-.35 0-.1-.03-.23-.06-.34 0-.12-.04-.24-.06-.35l-.06-.35-.07-.35a1.86 1.86 0 0 0-.06-.34 1.8 1.8 0 0 0-.07-.35 1.98 1.98 0 0 0-.07-.35l-.06-.36a2.41 2.41 0 0 0-.07-.34c0-.12-.03-.24-.05-.35a2.3 2.3 0 0 0-.07-.35l-.06-.35-.07-.34a2.3 2.3 0 0 0-.07-.35 1.8 1.8 0 0 0-.06-.35c0-.11-.04-.23-.07-.35 0-.11-.03-.23-.06-.34 0-.1-.03-.19-.05-.28H3.92a2.3 2.3 0 0 0-.04.28 1.7 1.7 0 0 0-.07.34 1.8 1.8 0 0 0-.06.35 1.8 1.8 0 0 0-.07.35c-.02.1-.05.22-.06.35-.02.11-.06.22-.07.34l-.05.35a1.8 1.8 0 0 0-.07.35l-.07.35a1.7 1.7 0 0 0-.06.34 1.8 1.8 0 0 0-.07.36c-.02.1-.05.23-.06.35l-.07.35-.06.34-.06.35a1.8 1.8 0 0 0-.07.35c-.03.11-.05.22-.06.35l-.06.34z" font-size="12" fill="url(#e)" stroke-width="1.1"/><path d="M45.28 30.36a1.8 1.8 0 0 0-.07-.35 1.8 1.8 0 0 0-.06-.36 2.41 2.41 0 0 0-.07-.35c0-.1-.03-.23-.07-.34 0-.12-.03-.24-.05-.35l-.07-.35-.06-.35a1.86 1.86 0 0 0-.07-.34 1.8 1.8 0 0 0-.06-.35 1.8 1.8 0 0 0-.07-.35l-.07-.35c0-.11-.03-.23-.06-.34a2.41 2.41 0 0 0-.06-.36l-.06-.35-.07-.35a1.86 1.86 0 0 0-.06-.34 1.8 1.8 0 0 0-.07-.35 1.98 1.98 0 0 0-.07-.35 2.3 2.3 0 0 0-.06-.35c0-.09-.02-.19-.05-.28-.33-.16-.7-.26-1.1-.26H4.9c-.4 0-.77.1-1.1.26l-.05.28c-.02.1-.06.23-.07.35l-.06.35-.06.35a1.7 1.7 0 0 0-.06.34 1.8 1.8 0 0 0-.07.35 1.8 1.8 0 0 0-.07.35c-.03.11-.05.22-.06.36-.02.1-.06.22-.07.34l-.06.35-.06.35c-.03.1-.05.22-.06.35a1.7 1.7 0 0 0-.07.34 1.8 1.8 0 0 0-.07.35 1.8 1.8 0 0 0-.06.35c-.02.11-.06.22-.07.35l-.06.34-.06.35a1.8 1.8 0 0 0-.06.36c-.04.1-.06.22-.07.35a1.7 1.7 0 0 0-.07.34c-.04.2-.07.4-.07.61v.86a2.5 2.5 0 0 0 2.5 2.51H42.9a2.5 2.5 0 0 0 2.5-2.51v-.86c0-.22-.02-.42-.08-.61 0-.11-.03-.23-.05-.34z" font-size="12" fill="url(#f)" stroke-width="1.1"/><path d="M2.39 37.79a2.5 2.5 0 0 0 2.5 2.5h38.02a2.5 2.5 0 0 0 2.5-2.5V31.3a2.5 2.5 0 0 0-2.5-2.51H4.89a2.5 2.5 0 0 0-2.51 2.51v6.48z" font-size="12" fill="url(#g)" stroke-width="1.1"/><path d="M4.89 30.12c-.66 0-1.2.53-1.2 1.2v6.47c0 .66.54 1.2 1.2 1.2h38.02c.65 0 1.2-.56 1.2-1.21V31.3a1.2 1.2 0 0 0-1.2-1.18z" font-size="12" fill="url(#h)" stroke-width="1.1"/><path d="M40.47 36.12c-.82 0-1.48.53-1.48 1.22s.66 1.23 1.5 1.23h.87c.83 0 1.5-.55 1.5-1.23 0-.68-.67-1.23-1.5-1.23h-.88z" font-size="12" fill="url(#i)" stroke-width="1.1"/><path d="M40.47 36.44c-.64 0-1.15.4-1.15.9s.51.9 1.16.9h.88c.65 0 1.16-.4 1.16-.9s-.52-.9-1.16-.9h-.88z" font-size="12" fill="url(#j)" stroke-width="1.1"/><path d="M42.41 37.34c0 .44-.47.79-1.05.79h-.88c-.58 0-1.05-.35-1.05-.8 0-.43.47-.78 1.05-.78h.88c.58 0 1.05.35 1.05.79z" font-size="12" fill="url(#k)" stroke-width="1.1"/><path d="M40.47 36.77c-.44 0-.82.27-.82.6 0 .33.38.6.83.6h.88c.45 0 .83-.28.83-.6 0-.33-.38-.6-.83-.6h-.88z" font-size="12" fill="url(#l)" stroke-width="1.1"/><path d="M40.45 36.65c-.38 0-.66.22-.66.41 0 .2.28.43.66.43h.94c.39 0 .66-.22.66-.43 0-.2-.27-.41-.66-.41z" font-size="12" fill="url(#m)" stroke-width="1.1"/><path font-size="12" d="M6.54 34.75h14v3.64h-14z" fill="url(#n)" stroke-width="1.1"/><path font-size="12" d="M6.54 34.75v.44H20.1v3.2h.44v-3.64z" fill="url(#o)" stroke-width="1.1"/><path font-size="12" d="M17.2 34.75h.87v3.64h-.88zm-4.58 0h.87v3.64h-.87zm2.28 0h.88v3.64h-.88zm-4.57 0h.88v3.64h-.88z" fill="#949494" stroke-width="1.1"/><path font-size="12" d="M16.97 34.75h.88v3.64h-.88zm-4.57 0h.87v3.64h-.87zm2.28 0h.88v3.64h-.88zm-4.57 0H11v3.64h-.88z" fill="#f0f0f0" stroke-width="1.1"/><path font-size="12" d="M-2.44 50.44V-2.24h52.68v52.68" fill="none" stroke-width="1.1"/></svg>img/volume_icon_ftp.png000064400000000563151215013430011215 0ustar00�PNG


IHDR�a:IDATxڍ�D�p�w�v�)����
"t@�s��+�@�"@����mX�7�m��?��{ϳI�&��f�I]��y�y^�n3��� �cͶm�u�����@{0�r䬼��bE�8�S����a����(�
�q��@���r)̚������L�JӴ�t:M�pV�X�6���0�l�.��\����Y�SY��j�`�5��v��ݓ������#e�m��7�"�=���څs��3|�%����]%�72����(��d�v�p&�'y�Z�7��1@:?=��])XVIEND�B`�img/progress.gif000064400000001233151215013430007645 0ustar00GIF89a�p�(a8��TS��N�� t�
Q�h�7��3��*��g�3��?��5��3��D��h�`�/�څ��p��;�H����n�0��_��g��f��Z��>��j��b��f��)y�p�4�肣�jΏ��n�w��}�]�.���!�NETSCAPE2.0!�,[��j%$O��R)p4N�U�Z��C��>
%�P
	�aXߝDzA_�a���� ������-(*�*����������A!�,P`&Vg��'�@[<B,?Nk��$�R�-��Q�GG�\24�a1�."V�Ex�^�1&7Ȓ�fc�<��|`���C!�,Y��p(�X8�$�h:���`J}8�O�4��*�MG� (�Z�r�;B$�0��b.�4����
�
�����������A!�,b@��c����e(L�t*9�X��P*Q���C��R"
C�}�\�i�{�2���

����������������A;img/edit_zohooffice.png000064400000000714151215013430011163 0ustar00�PNG


IHDR(-S�PLTEGpLLYLYLYLYLYLYJYLYLYLYLYLYLYLYLYLYLYLYLYLYKYI�ODZ��BQXJYMY,sSdU��Hg^�ja�L<�Q	TX��F��D��BGZ��Ai�J�T}VPY��A_�L��C[WlW�Va�LXY�U_X0�X\[,tSx�IgU��FB�Pp�JB�Q�k�0�tRNSN�Z�"���%�X��+�.YR�IDAT�u���0`@@"v]Jb,�a��J*\�����84�\Q�Ò��} v��h�*w0uLC��5�&�Ԛ���N���V�`�RJXհ�$p�pv	hA�?�i`߼xG*�HB����4"V���XA�W��{b�߸1�W����H���
�c%��jIEND�B`�img/ui-icons_ffffff_256x240.png000064400000007257151215013430012077 0ustar00�PNG


IHDR��IJ�PLTE�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������)[VZtRNS�3P���/"Uq@f`2�
!<BHK Z#'1S,�4���j���8E���|��������)��Q$�
��b�J��mߜGc?o�h�#�-�IDATx���v�8�a��ϼ�1�ȩ����&0���0w���7w@���VT���q�- &�j���b�[0�}+��9��fz����)d�m�^�&�����?�k0�<r�
h
����%FAP�b/��
�!�W���a�ax�;��׍�wT���P�e}�%Y@���ܯ�T��CY_q#��3��*��]ŕ��pu~f�~|=����5瀹
�0�0<=ޗ
�}_�@�vG���eA�����e��mCnj��0~ߏ�C��@l{!
�]A� �����;�;����A``9�u��%�k�f��,����j;B�q}AgHʹ�W�w��`
�0�0$E�w�+8р��W<V�
h��P��YI�t����Uzs�~��
����E*��D�}�9�������g�Yd�+XN
�{��?F~葟2��l06�A�
8)�t
/ɴ��+��h�X�!PԕC�?�+"N������$��Qs�i)�W��9��#�A����a�a�Ϥ�f�������=T�暇�L��Z6L�P�g�Ů��,�{�{aH�~ld�H�N��q͌Y��"��(�)�Bm?_���Ѣ�6�ZP�B��g\c@dD�����O��E��(��x@��!��r=���9^��>g�an�ቮ�����}��u��LlS�����^�u,����N2���a�!���hܧ{����l3�_ǀ=����r/t�v�����8�Ǭ���A�+�-�Z?�ӛɎ��s@�����p������V�����8�e�z"���a����C�m#���w7c�A�J�3MJ�1����?��9X��f�ж��z�:�@* 궹�8�>����~��k�Wb�Y�~UP�M ���{��Ÿ��-`%�_�%X P��$&d/f�M�^��;+t{��uQQTE��

f]1`r�-��u.p��;$	P���4=E�r�2P\�@qp�i��L(����H8,����`7��3r@I�C��sDw�8l8xp�N?��p�u��`x$
�0
���@���i�D9e�R�(������>�3E��"��qI��{$�Ƚ F��t4B�<?0��PN��4��$�7n��A�=� ��j�Is�s�
��9���͛Pd; N�r�.<����QŃU��u�B+x�CP�
��X��hO��Z�(r��D2N	�t�ɪ��+*�.���nj�������_lt�	0�ٓ����ۼ{��&Pk{�؜������~��50000pex�i� (H�~"Q+���H�'+��۳����,(����!�K�4i�1�	��*���	L���f���$�3��~���
\�1�	�L4� ��]�@3o�6���x������$&����^2�������a�j�ir;0i}��T�3"@$��F/�x���n�I�����^�5^�@�r�Tꅊ�_�b �z{O�&���&\ȵ�Z.	����
�&����@o�-�]��u@�J�u@C�Z�$������wd����biMi<��釫�?!��.���c<�*r��9�L�nG�?=�<E�9P���p����େ���ʧ��[�I�2�!`���&0�@�$����,ϤH�CxJ	k]�~���H����i����
�gy��Q:����u�����a����$��Ӡ�
��t�����A�Z��k������;I	���<�H����M`)iI��#hx�O?��3>Jvg���s$-㥗xl�yޢdE�ܿP�]�b\��w��@C���Xj�����_"�eI���ܸ�Sd�~!����P�f����s���K��m_}��'_��KQ7�(@���6퓾���	$�2=%��e�
#W��^P)M �?�
�3�L�
0��=@�9��)�dB�Rs�0���J�XTU��d�_Q.������^��#��{���,�a���#�d���G^ye�ʂ#��s��x{������jy�\�a���@瘟���'�|��1`�8;�Q�yY���=��/��P%,�2X�s�$���d؋tx�էk��P��b���ip�g�c��겜L�i�ZԡM��G�ʞ��i���(�`��V��%l]Q�$�<(�'6���F���)����H,��u�����$��I��������v(�D~���tu�	~��3+~�U�Q�GW������~j9jm��]6@X���뺿}�RSg�셼3��fn��l	k�W�|�P�}p���7�죠;B�Z�&������ϔ#hB��&���;@͊:���/�d�՟
 tZ�BR��"�ٌ����I�`�o�v?�!`5|���
l�V�������x9;���o[g	�I�n��z��M�.���7��;�2�x�%���wHl�k�|�x�%�"	�xB:C=g���7�|r1S����Z]G^��+�Et��v����i6=@W����6�d���Tn�4�n��8��K���+�t��ǀK{���,0\��
�}$8
W�~�⯚ ����J��?���R��-�K%�1>�ϸ�ߕ^����B���kLPm!�aQ�~��C{��u�^P`~�9�GD����3L�MG�|�ht�6�)��Ng�M�;;@�hDž%��M����~w2���0�*��.�K;V���P����[>��T??U�z����?D��������u�ݦ�׷_�`�������_�.���sH�w�~_���{s��t[�۞��;}&)u�Z�Z����K��.k����7]¹����?���: -`����q~�~w;,z�/�w~������[���L����6w�ؠ����MӷC���X�!=�B��`���5��RxWfzf��w�����5�4�׷�e�2~}��<�����ۉ��[�{�3X�;�� uPB�V@��|@H��Cc�p���нB����?ҽ�H����L�W��^�f0��L�zQ�/��n�#_?���V?���@d�*g�L�W�:��'ǀ������9�����h@IEND�B`�img/tui-icon-d.svg000064400000046440151215013430010014 0ustar00<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs/><symbol id="icon-d-ic-apply" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h24v24H0z"/>
        <path stroke="#8a8a8a" d="M4 12.011l5 5L20.011 6"/>
    </g>
</symbol><symbol id="icon-d-ic-cancel" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h24v24H0z"/>
        <path stroke="#8a8a8a" d="M6 6l12 12M18 6L6 18"/>
    </g>
</symbol><symbol id="icon-d-ic-crop" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h24v24H0z"/>
        <path fill="#8a8a8a" d="M4 0h1v20a1 1 0 0 1-1-1V0zM20 17h-1V5h1v12zm0 2v5h-1v-5h1z"/>
        <path fill="#8a8a8a" d="M5 19h19v1H5zM4.762 4v1H0V4h4.762zM7 4h12a1 1 0 0 1 1 1H7V4z"/>
    </g>
</symbol><symbol id="icon-d-ic-delete-all" viewBox="0 0 24 24">
    <g fill="#8a8a8a" fill-rule="evenodd">
        <path d="M5 23H3a1 1 0 0 1-1-1V6h1v16h2v1zm16-10h-1V6h1v7zM9 13H8v-3h1v3zm3 0h-1v-3h1v3zm3 0h-1v-3h1v3zM14.794 3.794L13 2h-3L8.206 3.794A.963.963 0 0 1 8 2.5l.703-1.055A1 1 0 0 1 9.535 1h3.93a1 1 0 0 1 .832.445L15 2.5a.965.965 0 0 1-.206 1.294zM14.197 4H8.803h5.394z"/>
        <path d="M0 3h23v1H0zM11.286 21H8.714L8 23H7l1-2.8V20h.071L9.5 16h1l1.429 4H12v.2l1 2.8h-1l-.714-2zm-.357-1L10 17.4 9.071 20h1.858zM20 22h3v1h-4v-7h1v6zm-5 0h3v1h-4v-7h1v6z"/>
    </g>
</symbol><symbol id="icon-d-ic-delete" viewBox="0 0 24 24">
    <g fill="#8a8a8a" fill-rule="evenodd">
        <path d="M3 6v16h17V6h1v16a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V6h1zM14.794 3.794L13 2h-3L8.206 3.794A.963.963 0 0 1 8 2.5l.703-1.055A1 1 0 0 1 9.535 1h3.93a1 1 0 0 1 .832.445L15 2.5a.965.965 0 0 1-.206 1.294zM14.197 4H8.803h5.394z"/>
        <path d="M0 3h23v1H0zM8 10h1v6H8v-6zm3 0h1v6h-1v-6zm3 0h1v6h-1v-6z"/>
    </g>
</symbol><symbol id="icon-d-ic-draw-free" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#8a8a8a" d="M2.5 20.929C2.594 10.976 4.323 6 7.686 6c5.872 0 2.524 19 7.697 19s1.89-14.929 6.414-14.929 1.357 10.858 5.13 10.858c1.802 0 2.657-2.262 2.566-6.786"/>
    </g>
</symbol><symbol id="icon-d-ic-draw-line" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#8a8a8a" d="M2 15.5h28"/>
    </g>
</symbol><symbol id="icon-d-ic-draw" viewBox="0 0 24 24">
    <g fill="none">
        <path stroke="#8a8a8a" d="M2.5 21.5H5c.245 0 .48-.058.691-.168l.124-.065.14.01c.429.028.85-.127 1.16-.437L22.55 5.405a.5.5 0 0 0 0-.707l-3.246-3.245a.5.5 0 0 0-.707 0L3.162 16.888a1.495 1.495 0 0 0-.437 1.155l.01.14-.065.123c-.111.212-.17.448-.17.694v2.5z"/>
        <path fill="#8a8a8a" d="M16.414 3.707l3.89 3.89-.708.706-3.889-3.889z"/>
    </g>
</symbol><symbol id="icon-d-ic-filter" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h24v24H0z"/>
        <path fill="#8a8a8a" d="M12 7v1H2V7h10zm6 0h4v1h-4V7zM12 16v1h10v-1H12zm-6 0H2v1h4v-1z"/>
        <path fill="#8a8a8a" d="M8.5 20a3.5 3.5 0 1 1 0-7 3.5 3.5 0 0 1 0 7zm0-1a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5zM15.5 11a3.5 3.5 0 1 1 0-7 3.5 3.5 0 0 1 0 7zm0-1a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5z"/>
    </g>
</symbol><symbol id="icon-d-ic-flip-reset" viewBox="0 0 31 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M31 0H0v32h31z"/>
        <path fill="#8a8a8a" d="M28 16a8 8 0 0 1-8 8H3v-1h1v-7H3a8 8 0 0 1 8-8h17v1h-1v7h1zM11 9a7 7 0 0 0-7 7v7h16a7 7 0 0 0 7-7V9H11z"/>
        <path stroke="#8a8a8a" stroke-linecap="square" d="M24 5l3.5 3.5L24 12M7 20l-3.5 3.5L7 27"/>
    </g>
</symbol><symbol id="icon-d-ic-flip-x" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M32 32H0V0h32z"/>
        <path fill="#8a8a8a" d="M17 32h-1V0h1zM27.167 11l.5 3h-1.03l-.546-3h1.076zm-.5-3h-1.122L25 5h-5V4h5.153a1 1 0 0 1 .986.836L26.667 8zm1.5 9l.5 3h-.94l-.545-3h.985zm1 6l.639 3.836A1 1 0 0 1 28.819 28H26v-1h3l-.726-4h.894zM23 28h-3v-1h3v1zM13 4v1H7L3 27h10v1H3.18a1 1 0 0 1-.986-1.164l3.666-22A1 1 0 0 1 6.847 4H13z"/>
    </g>
</symbol><symbol id="icon-d-ic-flip-y" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0v32h32V0z"/>
        <path fill="#8a8a8a" d="M0 16v1h32v-1zM11 27.167l3 .5v-1.03l-3-.546v1.076zm-3-.5v-1.122L5 25v-5H4v5.153a1 1 0 0 0 .836.986L8 26.667zm9 1.5l3 .5v-.94l-3-.545v.985zm6 1l3.836.639A1 1 0 0 0 28 28.82V26h-1v3l-4-.727v.894zM28 23v-3h-1v3h1zM4 13h1V7l22-4v10h1V3.18a1 1 0 0 0-1.164-.986l-22 3.667A1 1 0 0 0 4 6.847V13z"/>
    </g>
</symbol><symbol id="icon-d-ic-flip" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h24v24H0z"/>
        <path fill="#8a8a8a" d="M11 0h1v24h-1zM19 21v-1h2v-2h1v2a1 1 0 0 1-1 1h-2zm-2 0h-3v-1h3v1zm5-5h-1v-3h1v3zm0-5h-1V8h1v3zm0-5h-1V4h-2V3h2a1 1 0 0 1 1 1v2zm-5-3v1h-3V3h3zM9 3v1H2v16h7v1H2a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h7z"/>
    </g>
</symbol><symbol id="icon-d-ic-icon-arrow-2" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#8a8a8a" stroke-linecap="round" stroke-linejoin="round" d="M21.793 18.5H2.5v-5h18.935l-7.6-8h5.872l10.5 10.5-10.5 10.5h-5.914l8-8z"/>
    </g>
</symbol><symbol id="icon-d-ic-icon-arrow-3" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#8a8a8a" stroke-linecap="round" stroke-linejoin="round" d="M25.288 16.42L14.208 27.5H6.792l11.291-11.291L6.826 4.5h7.381l11.661 11.661-.58.258z"/>
    </g>
</symbol><symbol id="icon-d-ic-icon-arrow" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#8a8a8a" d="M2.5 11.5v9h18v5.293L30.293 16 20.5 6.207V11.5h-18z"/>
    </g>
</symbol><symbol id="icon-d-ic-icon-bubble" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#8a8a8a" stroke-linecap="round" stroke-linejoin="round" d="M22.207 24.5L16.5 30.207V24.5H8A6.5 6.5 0 0 1 1.5 18V9A6.5 6.5 0 0 1 8 2.5h16A6.5 6.5 0 0 1 30.5 9v9a6.5 6.5 0 0 1-6.5 6.5h-1.793z"/>
    </g>
</symbol><symbol id="icon-d-ic-icon-heart" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path fill-rule="nonzero" stroke="#8a8a8a" d="M15.996 30.675l1.981-1.79c7.898-7.177 10.365-9.718 12.135-13.012.922-1.716 1.377-3.37 1.377-5.076 0-4.65-3.647-8.297-8.297-8.297-2.33 0-4.86 1.527-6.817 3.824l-.38.447-.381-.447C13.658 4.027 11.126 2.5 8.797 2.5 4.147 2.5.5 6.147.5 10.797c0 1.714.46 3.375 1.389 5.098 1.775 3.288 4.26 5.843 12.123 12.974l1.984 1.806z"/>
    </g>
</symbol><symbol id="icon-d-ic-icon-load" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#8a8a8a" stroke-linecap="round" stroke-linejoin="round" d="M17.314 18.867l1.951-2.53 4 5.184h-17l6.5-8.84 4.549 6.186z"/>
        <path fill="#8a8a8a" d="M18.01 4a11.798 11.798 0 0 0 0 1H3v24h24V14.986a8.738 8.738 0 0 0 1 0V29a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h15.01z"/>
        <path fill="#8a8a8a" d="M25 3h1v9h-1z"/>
        <path stroke="#8a8a8a" d="M22 6l3.5-3.5L29 6"/>
    </g>
</symbol><symbol id="icon-d-ic-icon-location" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <g stroke="#8a8a8a">
            <path d="M16 31.28C23.675 23.302 27.5 17.181 27.5 13c0-6.351-5.149-11.5-11.5-11.5S4.5 6.649 4.5 13c0 4.181 3.825 10.302 11.5 18.28z"/>
            <circle cx="16" cy="13" r="4.5"/>
        </g>
    </g>
</symbol><symbol id="icon-d-ic-icon-polygon" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#8a8a8a" d="M.576 16L8.29 29.5h15.42L31.424 16 23.71 2.5H8.29L.576 16z"/>
    </g>
</symbol><symbol id="icon-d-ic-icon-star-2" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#8a8a8a" d="M19.446 31.592l2.265-3.272 3.946.25.636-3.94 3.665-1.505-1.12-3.832 2.655-2.962-2.656-2.962 1.12-3.832-3.664-1.505-.636-3.941-3.946.25-2.265-3.271L16 3.024 12.554 1.07 10.289 4.34l-3.946-.25-.636 3.941-3.665 1.505 1.12 3.832L.508 16.33l2.656 2.962-1.12 3.832 3.664 1.504.636 3.942 3.946-.25 2.265 3.27L16 29.638l3.446 1.955z"/>
    </g>
</symbol><symbol id="icon-d-ic-icon-star" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#8a8a8a" d="M25.292 29.878l-1.775-10.346 7.517-7.327-10.388-1.51L16 1.282l-4.646 9.413-10.388 1.51 7.517 7.327-1.775 10.346L16 24.993l9.292 4.885z"/>
    </g>
</symbol><symbol id="icon-d-ic-icon" viewBox="0 0 24 24">
    <g fill="none">
        <path stroke="#8a8a8a" stroke-linecap="round" stroke-linejoin="round" d="M11.923 19.136L5.424 22l.715-7.065-4.731-5.296 6.94-1.503L11.923 2l3.574 6.136 6.94 1.503-4.731 5.296L18.42 22z"/>
    </g>
</symbol><symbol id="icon-d-ic-mask-load" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h32v32H0z"/>
        <path fill="#8a8a8a" d="M18.01 4a11.798 11.798 0 0 0 0 1H3v24h24V14.986a8.738 8.738 0 0 0 1 0V29a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h15.01zM15 23a6 6 0 1 1 0-12 6 6 0 0 1 0 12zm0-1a5 5 0 1 0 0-10 5 5 0 0 0 0 10z"/>
        <path fill="#8a8a8a" d="M25 3h1v9h-1z"/>
        <path stroke="#8a8a8a" d="M22 6l3.5-3.5L29 6"/>
    </g>
</symbol><symbol id="icon-d-ic-mask" viewBox="0 0 24 24">
    <g fill="none">
        <circle cx="12" cy="12" r="4.5" stroke="#8a8a8a"/>
        <path fill="#8a8a8a" d="M2 1h20a1 1 0 0 1 1 1v20a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1zm0 1v20h20V2H2z"/>
    </g>
</symbol><symbol id="icon-d-ic-redo" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h24v24H0z" opacity=".5"/>
        <path fill="#8a8a8a" d="M21 6H9a6 6 0 1 0 0 12h12v1H9A7 7 0 0 1 9 5h12v1z"/>
        <path stroke="#8a8a8a" stroke-linecap="square" d="M19 3l2.5 2.5L19 8"/>
    </g>
</symbol><symbol id="icon-d-ic-reset" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h24v24H0z" opacity=".5"/>
        <path fill="#8a8a8a" d="M2 13v-1a7 7 0 0 1 7-7h13v1h-1v5h1v1a7 7 0 0 1-7 7H2v-1h1v-5H2zm7-7a6 6 0 0 0-6 6v6h12a6 6 0 0 0 6-6V6H9z"/>
        <path stroke="#8a8a8a" stroke-linecap="square" d="M19 3l2.5 2.5L19 8M5 16l-2.5 2.5L5 21"/>
    </g>
</symbol><symbol id="icon-d-ic-rotate-clockwise" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path fill="#8a8a8a" d="M29 17h-.924c0 6.627-5.373 12-12 12-6.628 0-12-5.373-12-12C4.076 10.398 9.407 5.041 16 5V4C8.82 4 3 9.82 3 17s5.82 13 13 13 13-5.82 13-13z"/>
        <path stroke="#8a8a8a" stroke-linecap="square" d="M16 1.5l4 3-4 3"/>
        <path fill="#8a8a8a" fill-rule="nonzero" d="M16 4h4v1h-4z"/>
    </g>
</symbol><symbol id="icon-d-ic-rotate-counterclockwise" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path fill="#8a8a8a" d="M3 17h.924c0 6.627 5.373 12 12 12 6.628 0 12-5.373 12-12 0-6.602-5.331-11.96-11.924-12V4c7.18 0 13 5.82 13 13s-5.82 13-13 13S3 24.18 3 17z"/>
        <path fill="#8a8a8a" fill-rule="nonzero" d="M12 4h4v1h-4z"/>
        <path stroke="#8a8a8a" stroke-linecap="square" d="M16 1.5l-4 3 4 3"/>
    </g>
</symbol><symbol id="icon-d-ic-rotate" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h24v24H0z"/>
        <path fill="#8a8a8a" d="M8.349 22.254a10.002 10.002 0 0 1-2.778-1.719l.65-.76a9.002 9.002 0 0 0 2.495 1.548l-.367.931zm2.873.704l.078-.997a9 9 0 1 0-.557-17.852l-.14-.99A10.076 10.076 0 0 1 12.145 3c5.523 0 10 4.477 10 10s-4.477 10-10 10c-.312 0-.62-.014-.924-.042zm-7.556-4.655a9.942 9.942 0 0 1-1.253-2.996l.973-.234a8.948 8.948 0 0 0 1.124 2.693l-.844.537zm-1.502-5.91A9.949 9.949 0 0 1 2.88 9.23l.925.382a8.954 8.954 0 0 0-.644 2.844l-.998-.062zm2.21-5.686c.687-.848 1.51-1.58 2.436-2.166l.523.852a9.048 9.048 0 0 0-2.188 1.95l-.771-.636z"/>
        <path stroke="#8a8a8a" stroke-linecap="square" d="M13 1l-2.5 2.5L13 6"/>
    </g>
</symbol><symbol id="icon-d-ic-shape-circle" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <circle cx="16" cy="16" r="14.5" stroke="#8a8a8a"/>
    </g>
</symbol><symbol id="icon-d-ic-shape-rectangle" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <rect width="27" height="27" x="2.5" y="2.5" stroke="#8a8a8a" rx="1"/>
    </g>
</symbol><symbol id="icon-d-ic-shape-triangle" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#8a8a8a" stroke-linecap="round" stroke-linejoin="round" d="M16 2.5l15.5 27H.5z"/>
    </g>
</symbol><symbol id="icon-d-ic-shape" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path fill="#8a8a8a" d="M14.706 8H21a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H9a1 1 0 0 1-1-1v-4h1v4h12V9h-5.706l-.588-1z"/>
        <path stroke="#8a8a8a" stroke-linecap="round" stroke-linejoin="round" d="M8.5 1.5l7.5 13H1z"/>
    </g>
</symbol><symbol id="icon-d-ic-text-align-center" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h32v32H0z"/>
        <path fill="#8a8a8a" d="M2 5h28v1H2zM8 12h16v1H8zM2 19h28v1H2zM8 26h16v1H8z"/>
    </g>
</symbol><symbol id="icon-d-ic-text-align-left" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h32v32H0z"/>
        <path fill="#8a8a8a" d="M2 5h28v1H2zM2 12h16v1H2zM2 19h28v1H2zM2 26h16v1H2z"/>
    </g>
</symbol><symbol id="icon-d-ic-text-align-right" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h32v32H0z"/>
        <path fill="#8a8a8a" d="M2 5h28v1H2zM14 12h16v1H14zM2 19h28v1H2zM14 26h16v1H14z"/>
    </g>
</symbol><symbol id="icon-d-ic-text-bold" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h32v32H0z"/>
        <path fill="#8a8a8a" d="M7 2h2v2H7zM7 28h2v2H7z"/>
        <path stroke="#8a8a8a" stroke-width="2" d="M9 3v12h9a6 6 0 1 0 0-12H9zM9 15v14h10a7 7 0 0 0 0-14H9z"/>
    </g>
</symbol><symbol id="icon-d-ic-text-italic" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h32v32H0z"/>
        <path fill="#8a8a8a" d="M15 2h5v1h-5zM11 29h5v1h-5zM17 3h1l-4 26h-1z"/>
    </g>
</symbol><symbol id="icon-d-ic-text-underline" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h32v32H0z"/>
        <path fill="#8a8a8a" d="M8 2v14a8 8 0 1 0 16 0V2h1v14a9 9 0 0 1-18 0V2h1zM3 29h26v1H3z"/>
        <path fill="#8a8a8a" d="M5 2h5v1H5zM22 2h5v1h-5z"/>
    </g>
</symbol><symbol id="icon-d-ic-text" viewBox="0 0 24 24">
    <g fill="#8a8a8a" fill-rule="evenodd">
        <path d="M4 3h15a1 1 0 0 1 1 1H3a1 1 0 0 1 1-1zM3 4h1v1H3zM19 4h1v1h-1z"/>
        <path d="M11 3h1v18h-1z"/>
        <path d="M10 20h3v1h-3z"/>
    </g>
</symbol><symbol id="icon-d-ic-undo" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path d="M24 0H0v24h24z" opacity=".5"/>
        <path fill="#8a8a8a" d="M3 6h12a6 6 0 1 1 0 12H3v1h12a7 7 0 0 0 0-14H3v1z"/>
        <path stroke="#8a8a8a" stroke-linecap="square" d="M5 3L2.5 5.5 5 8"/>
    </g>
</symbol><symbol id="icon-d-img-bi" viewBox="0 0 257 26">
    <g fill="#FDBA3B">
        <path d="M26 5a8.001 8.001 0 0 0 0 16 8.001 8.001 0 0 0 0-16M51.893 19.812L43.676 5.396A.78.78 0 0 0 43 5a.78.78 0 0 0-.677.396l-8.218 14.418a.787.787 0 0 0 0 .792c.14.244.396.394.676.394h16.436c.28 0 .539-.15.678-.396a.796.796 0 0 0-.002-.792M15.767 5.231A.79.79 0 0 0 15.21 5H.791A.791.791 0 0 0 0 5.79v6.42a.793.793 0 0 0 .791.79h3.21v7.21c.001.21.082.408.234.56.147.148.347.23.558.23h6.416a.788.788 0 0 0 .792-.79V13h3.006c.413 0 .611-.082.762-.232.15-.149.23-.35.231-.559V5.791a.787.787 0 0 0-.233-.56M85.767 5.231A.79.79 0 0 0 85.21 5H70.791a.791.791 0 0 0-.791.79v6.42a.793.793 0 0 0 .791.79h3.21v7.21c.001.21.082.408.234.56.147.148.347.23.558.23h6.416a.788.788 0 0 0 .792-.79V13h3.006c.413 0 .611-.082.762-.232.15-.149.23-.35.231-.559V5.791a.787.787 0 0 0-.233-.56M65.942 9.948l2.17-3.76a.78.78 0 0 0 0-.792.791.791 0 0 0-.684-.396h-8.54A5.889 5.889 0 0 0 53 10.86a5.887 5.887 0 0 0 3.07 5.17l-2.184 3.782A.792.792 0 0 0 54.571 21h8.54a5.89 5.89 0 0 0 2.831-11.052M105.7 21h2.3V5h-2.3zM91 5h2.4v10.286c0 1.893 1.612 3.429 3.6 3.429s3.6-1.536 3.6-3.429V5h2.4v10.286c0 3.156-2.686 5.714-6 5.714-3.313 0-6-2.558-6-5.714V5zM252.148 21.128h-2.377V9.659h2.27v1.64c.69-1.299 1.792-1.938 3.304-1.938.497 0 .95.065 1.382.192l-.215 2.277a3.734 3.734 0 0 0-1.275-.213c-1.814 0-3.089 1.234-3.089 3.638v5.873zm-7.095-5.744a3.734 3.734 0 0 0-1.101-2.703c-.714-.766-1.6-1.149-2.658-1.149-1.058 0-1.944.383-2.679 1.149a3.803 3.803 0 0 0-1.08 2.703c0 1.063.368 1.978 1.08 2.722.735.746 1.62 1.128 2.68 1.128 1.058 0 1.943-.382 2.657-1.128.734-.744 1.101-1.659 1.101-2.722zm-9.916 0c0-1.682.583-3.086 1.729-4.256 1.166-1.17 2.635-1.767 4.428-1.767 1.793 0 3.262.597 4.407 1.767 1.167 1.17 1.75 2.574 1.75 4.256 0 1.7-.583 3.127-1.75 4.297-1.145 1.17-2.614 1.745-4.407 1.745-1.793 0-3.262-.575-4.428-1.745-1.146-1.17-1.729-2.596-1.729-4.297zm-1.5 3.233l.821 1.83c-.864.638-1.944.958-3.22.958-2.526 0-3.822-1.554-3.822-4.383V11.66h-2.01v-2h2.031V5.595h2.355v4.063h4.018v2h-4.018v5.405c0 1.469.605 2.191 1.793 2.191.626 0 1.318-.212 2.052-.638zm-12.43 2.51h2.375V9.66h-2.376v11.469zm1.23-12.977c-.929 0-1.642-.682-1.642-1.596 0-.873.713-1.554 1.643-1.554.885 0 1.576.681 1.576 1.554 0 .914-.69 1.596-1.576 1.596zm-6.49 7.234c0-1.086-.346-1.98-1.037-2.724-.692-.745-1.599-1.128-2.7-1.128-1.102 0-2.01.383-2.7 1.128-.692.744-1.037 1.638-1.037 2.724 0 1.084.345 2.02 1.036 2.766.691.744 1.6 1.105 2.7 1.105 1.102 0 2.01-.361 2.7-1.105.692-.746 1.038-1.682 1.038-2.766zm-.173-4.129V5h2.397v16.128h-2.354v-1.596c-1.015 1.255-2.333 1.873-3.91 1.873-1.663 0-3.068-.575-4.169-1.724-1.102-1.17-1.663-2.596-1.663-4.297 0-1.682.561-3.107 1.663-4.256 1.101-1.17 2.485-1.745 4.148-1.745 1.534 0 2.83.617 3.888 1.872zm-11.48 9.873h-10.218V5.405h10.195v2.318h-7.711V12h7.15v2.32h-7.15v4.489h7.733v2.319zm-23.891-9.724c-1.793 0-3.132 1.192-3.478 2.979h6.783c-.194-1.808-1.555-2.979-3.305-2.979zm5.703 3.766c0 .32-.021.703-.086 1.128h-9.095c.346 1.787 1.62 3 3.867 3 1.318 0 2.916-.49 3.953-1.234l.994 1.724c-1.189.872-3.067 1.595-5.033 1.595-4.364 0-6.243-3-6.243-6.021 0-1.724.54-3.15 1.642-4.277 1.101-1.127 2.548-1.702 4.298-1.702 1.664 0 3.046.511 4.105 1.553 1.058 1.043 1.598 2.447 1.598 4.234zm-19.949 3.894c1.08 0 1.966-.362 2.68-1.085.712-.724 1.058-1.617 1.058-2.703 0-1.084-.346-2-1.059-2.701-.713-.702-1.599-1.064-2.679-1.064-1.058 0-1.944.362-2.656 1.085-.714.702-1.059 1.596-1.059 2.68 0 1.086.345 2 1.059 2.724.712.702 1.598 1.064 2.656 1.064zm3.673-7.936V9.66h2.29v10.299c0 1.85-.584 3.32-1.728 4.404-1.146 1.085-2.68 1.638-4.58 1.638-1.945 0-3.672-.553-5.206-1.638l1.037-1.808c1.296.915 2.679 1.36 4.126 1.36 2.484 0 3.996-1.51 3.996-3.637v-.83c-1.015 1.127-2.311 1.702-3.91 1.702-1.684 0-3.089-.554-4.19-1.68-1.102-1.128-1.642-2.532-1.642-4.214 0-1.68.561-3.085 1.706-4.191 1.145-1.128 2.571-1.681 4.234-1.681 1.534 0 2.83.575 3.867 1.745zm-18.07 8.127c1.102 0 1.988-.382 2.7-1.128.714-.744 1.06-1.659 1.06-2.743 0-1.065-.346-1.98-1.06-2.724-.712-.745-1.598-1.128-2.7-1.128-1.101 0-2.008.383-2.7 1.128-.691.744-1.036 1.66-1.036 2.745 0 1.084.345 2 1.037 2.745.691.744 1.598 1.105 2.7 1.105zm3.652-8V9.66h2.29v11.469h-2.29v-1.575c-1.059 1.234-2.399 1.852-3.976 1.852-1.663 0-3.067-.575-4.168-1.745-1.102-1.17-1.642-2.617-1.642-4.34 0-1.724.54-3.128 1.642-4.256 1.1-1.128 2.505-1.681 4.168-1.681 1.577 0 2.917.617 3.976 1.872zM138.79 9.34c1.404 0 2.527.448 3.37 1.34.863.873 1.295 2.086 1.295 3.596v6.852h-2.376V14.66c0-2.021-1.036-3.128-2.657-3.128-1.727 0-2.915 1.255-2.915 3.192v6.404h-2.377v-6.426c0-1.978-1.037-3.17-2.679-3.17-1.728 0-2.937 1.277-2.937 3.234v6.362h-2.377V9.659h2.333v1.66c.692-1.212 1.988-1.979 3.522-1.979 1.533.021 2.958.767 3.586 2.107.798-1.277 2.419-2.107 4.212-2.107zm-19.517 11.788h2.484V5.405h-2.484v15.723z"/>
    </g>
</symbol></svg>img/tui-icon-c.svg000064400000046440151215013430010013 0ustar00<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs/><symbol id="icon-c-ic-apply" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h24v24H0z"/>
        <path stroke="#e9e9e9" d="M4 12.011l5 5L20.011 6"/>
    </g>
</symbol><symbol id="icon-c-ic-cancel" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h24v24H0z"/>
        <path stroke="#e9e9e9" d="M6 6l12 12M18 6L6 18"/>
    </g>
</symbol><symbol id="icon-c-ic-crop" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h24v24H0z"/>
        <path fill="#e9e9e9" d="M4 0h1v20a1 1 0 0 1-1-1V0zM20 17h-1V5h1v12zm0 2v5h-1v-5h1z"/>
        <path fill="#e9e9e9" d="M5 19h19v1H5zM4.762 4v1H0V4h4.762zM7 4h12a1 1 0 0 1 1 1H7V4z"/>
    </g>
</symbol><symbol id="icon-c-ic-delete-all" viewBox="0 0 24 24">
    <g fill="#e9e9e9" fill-rule="evenodd">
        <path d="M5 23H3a1 1 0 0 1-1-1V6h1v16h2v1zm16-10h-1V6h1v7zM9 13H8v-3h1v3zm3 0h-1v-3h1v3zm3 0h-1v-3h1v3zM14.794 3.794L13 2h-3L8.206 3.794A.963.963 0 0 1 8 2.5l.703-1.055A1 1 0 0 1 9.535 1h3.93a1 1 0 0 1 .832.445L15 2.5a.965.965 0 0 1-.206 1.294zM14.197 4H8.803h5.394z"/>
        <path d="M0 3h23v1H0zM11.286 21H8.714L8 23H7l1-2.8V20h.071L9.5 16h1l1.429 4H12v.2l1 2.8h-1l-.714-2zm-.357-1L10 17.4 9.071 20h1.858zM20 22h3v1h-4v-7h1v6zm-5 0h3v1h-4v-7h1v6z"/>
    </g>
</symbol><symbol id="icon-c-ic-delete" viewBox="0 0 24 24">
    <g fill="#e9e9e9" fill-rule="evenodd">
        <path d="M3 6v16h17V6h1v16a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V6h1zM14.794 3.794L13 2h-3L8.206 3.794A.963.963 0 0 1 8 2.5l.703-1.055A1 1 0 0 1 9.535 1h3.93a1 1 0 0 1 .832.445L15 2.5a.965.965 0 0 1-.206 1.294zM14.197 4H8.803h5.394z"/>
        <path d="M0 3h23v1H0zM8 10h1v6H8v-6zm3 0h1v6h-1v-6zm3 0h1v6h-1v-6z"/>
    </g>
</symbol><symbol id="icon-c-ic-draw-free" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#e9e9e9" d="M2.5 20.929C2.594 10.976 4.323 6 7.686 6c5.872 0 2.524 19 7.697 19s1.89-14.929 6.414-14.929 1.357 10.858 5.13 10.858c1.802 0 2.657-2.262 2.566-6.786"/>
    </g>
</symbol><symbol id="icon-c-ic-draw-line" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#e9e9e9" d="M2 15.5h28"/>
    </g>
</symbol><symbol id="icon-c-ic-draw" viewBox="0 0 24 24">
    <g fill="none">
        <path stroke="#e9e9e9" d="M2.5 21.5H5c.245 0 .48-.058.691-.168l.124-.065.14.01c.429.028.85-.127 1.16-.437L22.55 5.405a.5.5 0 0 0 0-.707l-3.246-3.245a.5.5 0 0 0-.707 0L3.162 16.888a1.495 1.495 0 0 0-.437 1.155l.01.14-.065.123c-.111.212-.17.448-.17.694v2.5z"/>
        <path fill="#e9e9e9" d="M16.414 3.707l3.89 3.89-.708.706-3.889-3.889z"/>
    </g>
</symbol><symbol id="icon-c-ic-filter" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h24v24H0z"/>
        <path fill="#e9e9e9" d="M12 7v1H2V7h10zm6 0h4v1h-4V7zM12 16v1h10v-1H12zm-6 0H2v1h4v-1z"/>
        <path fill="#e9e9e9" d="M8.5 20a3.5 3.5 0 1 1 0-7 3.5 3.5 0 0 1 0 7zm0-1a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5zM15.5 11a3.5 3.5 0 1 1 0-7 3.5 3.5 0 0 1 0 7zm0-1a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5z"/>
    </g>
</symbol><symbol id="icon-c-ic-flip-reset" viewBox="0 0 31 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M31 0H0v32h31z"/>
        <path fill="#e9e9e9" d="M28 16a8 8 0 0 1-8 8H3v-1h1v-7H3a8 8 0 0 1 8-8h17v1h-1v7h1zM11 9a7 7 0 0 0-7 7v7h16a7 7 0 0 0 7-7V9H11z"/>
        <path stroke="#e9e9e9" stroke-linecap="square" d="M24 5l3.5 3.5L24 12M7 20l-3.5 3.5L7 27"/>
    </g>
</symbol><symbol id="icon-c-ic-flip-x" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M32 32H0V0h32z"/>
        <path fill="#e9e9e9" d="M17 32h-1V0h1zM27.167 11l.5 3h-1.03l-.546-3h1.076zm-.5-3h-1.122L25 5h-5V4h5.153a1 1 0 0 1 .986.836L26.667 8zm1.5 9l.5 3h-.94l-.545-3h.985zm1 6l.639 3.836A1 1 0 0 1 28.819 28H26v-1h3l-.726-4h.894zM23 28h-3v-1h3v1zM13 4v1H7L3 27h10v1H3.18a1 1 0 0 1-.986-1.164l3.666-22A1 1 0 0 1 6.847 4H13z"/>
    </g>
</symbol><symbol id="icon-c-ic-flip-y" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0v32h32V0z"/>
        <path fill="#e9e9e9" d="M0 16v1h32v-1zM11 27.167l3 .5v-1.03l-3-.546v1.076zm-3-.5v-1.122L5 25v-5H4v5.153a1 1 0 0 0 .836.986L8 26.667zm9 1.5l3 .5v-.94l-3-.545v.985zm6 1l3.836.639A1 1 0 0 0 28 28.82V26h-1v3l-4-.727v.894zM28 23v-3h-1v3h1zM4 13h1V7l22-4v10h1V3.18a1 1 0 0 0-1.164-.986l-22 3.667A1 1 0 0 0 4 6.847V13z"/>
    </g>
</symbol><symbol id="icon-c-ic-flip" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h24v24H0z"/>
        <path fill="#e9e9e9" d="M11 0h1v24h-1zM19 21v-1h2v-2h1v2a1 1 0 0 1-1 1h-2zm-2 0h-3v-1h3v1zm5-5h-1v-3h1v3zm0-5h-1V8h1v3zm0-5h-1V4h-2V3h2a1 1 0 0 1 1 1v2zm-5-3v1h-3V3h3zM9 3v1H2v16h7v1H2a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h7z"/>
    </g>
</symbol><symbol id="icon-c-ic-icon-arrow-2" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#e9e9e9" stroke-linecap="round" stroke-linejoin="round" d="M21.793 18.5H2.5v-5h18.935l-7.6-8h5.872l10.5 10.5-10.5 10.5h-5.914l8-8z"/>
    </g>
</symbol><symbol id="icon-c-ic-icon-arrow-3" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#e9e9e9" stroke-linecap="round" stroke-linejoin="round" d="M25.288 16.42L14.208 27.5H6.792l11.291-11.291L6.826 4.5h7.381l11.661 11.661-.58.258z"/>
    </g>
</symbol><symbol id="icon-c-ic-icon-arrow" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#e9e9e9" d="M2.5 11.5v9h18v5.293L30.293 16 20.5 6.207V11.5h-18z"/>
    </g>
</symbol><symbol id="icon-c-ic-icon-bubble" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#e9e9e9" stroke-linecap="round" stroke-linejoin="round" d="M22.207 24.5L16.5 30.207V24.5H8A6.5 6.5 0 0 1 1.5 18V9A6.5 6.5 0 0 1 8 2.5h16A6.5 6.5 0 0 1 30.5 9v9a6.5 6.5 0 0 1-6.5 6.5h-1.793z"/>
    </g>
</symbol><symbol id="icon-c-ic-icon-heart" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path fill-rule="nonzero" stroke="#e9e9e9" d="M15.996 30.675l1.981-1.79c7.898-7.177 10.365-9.718 12.135-13.012.922-1.716 1.377-3.37 1.377-5.076 0-4.65-3.647-8.297-8.297-8.297-2.33 0-4.86 1.527-6.817 3.824l-.38.447-.381-.447C13.658 4.027 11.126 2.5 8.797 2.5 4.147 2.5.5 6.147.5 10.797c0 1.714.46 3.375 1.389 5.098 1.775 3.288 4.26 5.843 12.123 12.974l1.984 1.806z"/>
    </g>
</symbol><symbol id="icon-c-ic-icon-load" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#e9e9e9" stroke-linecap="round" stroke-linejoin="round" d="M17.314 18.867l1.951-2.53 4 5.184h-17l6.5-8.84 4.549 6.186z"/>
        <path fill="#e9e9e9" d="M18.01 4a11.798 11.798 0 0 0 0 1H3v24h24V14.986a8.738 8.738 0 0 0 1 0V29a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h15.01z"/>
        <path fill="#e9e9e9" d="M25 3h1v9h-1z"/>
        <path stroke="#e9e9e9" d="M22 6l3.5-3.5L29 6"/>
    </g>
</symbol><symbol id="icon-c-ic-icon-location" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <g stroke="#e9e9e9">
            <path d="M16 31.28C23.675 23.302 27.5 17.181 27.5 13c0-6.351-5.149-11.5-11.5-11.5S4.5 6.649 4.5 13c0 4.181 3.825 10.302 11.5 18.28z"/>
            <circle cx="16" cy="13" r="4.5"/>
        </g>
    </g>
</symbol><symbol id="icon-c-ic-icon-polygon" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#e9e9e9" d="M.576 16L8.29 29.5h15.42L31.424 16 23.71 2.5H8.29L.576 16z"/>
    </g>
</symbol><symbol id="icon-c-ic-icon-star-2" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#e9e9e9" d="M19.446 31.592l2.265-3.272 3.946.25.636-3.94 3.665-1.505-1.12-3.832 2.655-2.962-2.656-2.962 1.12-3.832-3.664-1.505-.636-3.941-3.946.25-2.265-3.271L16 3.024 12.554 1.07 10.289 4.34l-3.946-.25-.636 3.941-3.665 1.505 1.12 3.832L.508 16.33l2.656 2.962-1.12 3.832 3.664 1.504.636 3.942 3.946-.25 2.265 3.27L16 29.638l3.446 1.955z"/>
    </g>
</symbol><symbol id="icon-c-ic-icon-star" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#e9e9e9" d="M25.292 29.878l-1.775-10.346 7.517-7.327-10.388-1.51L16 1.282l-4.646 9.413-10.388 1.51 7.517 7.327-1.775 10.346L16 24.993l9.292 4.885z"/>
    </g>
</symbol><symbol id="icon-c-ic-icon" viewBox="0 0 24 24">
    <g fill="none">
        <path stroke="#e9e9e9" stroke-linecap="round" stroke-linejoin="round" d="M11.923 19.136L5.424 22l.715-7.065-4.731-5.296 6.94-1.503L11.923 2l3.574 6.136 6.94 1.503-4.731 5.296L18.42 22z"/>
    </g>
</symbol><symbol id="icon-c-ic-mask-load" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h32v32H0z"/>
        <path fill="#e9e9e9" d="M18.01 4a11.798 11.798 0 0 0 0 1H3v24h24V14.986a8.738 8.738 0 0 0 1 0V29a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h15.01zM15 23a6 6 0 1 1 0-12 6 6 0 0 1 0 12zm0-1a5 5 0 1 0 0-10 5 5 0 0 0 0 10z"/>
        <path fill="#e9e9e9" d="M25 3h1v9h-1z"/>
        <path stroke="#e9e9e9" d="M22 6l3.5-3.5L29 6"/>
    </g>
</symbol><symbol id="icon-c-ic-mask" viewBox="0 0 24 24">
    <g fill="none">
        <circle cx="12" cy="12" r="4.5" stroke="#e9e9e9"/>
        <path fill="#e9e9e9" d="M2 1h20a1 1 0 0 1 1 1v20a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1zm0 1v20h20V2H2z"/>
    </g>
</symbol><symbol id="icon-c-ic-redo" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h24v24H0z" opacity=".5"/>
        <path fill="#e9e9e9" d="M21 6H9a6 6 0 1 0 0 12h12v1H9A7 7 0 0 1 9 5h12v1z"/>
        <path stroke="#e9e9e9" stroke-linecap="square" d="M19 3l2.5 2.5L19 8"/>
    </g>
</symbol><symbol id="icon-c-ic-reset" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h24v24H0z" opacity=".5"/>
        <path fill="#e9e9e9" d="M2 13v-1a7 7 0 0 1 7-7h13v1h-1v5h1v1a7 7 0 0 1-7 7H2v-1h1v-5H2zm7-7a6 6 0 0 0-6 6v6h12a6 6 0 0 0 6-6V6H9z"/>
        <path stroke="#e9e9e9" stroke-linecap="square" d="M19 3l2.5 2.5L19 8M5 16l-2.5 2.5L5 21"/>
    </g>
</symbol><symbol id="icon-c-ic-rotate-clockwise" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path fill="#e9e9e9" d="M29 17h-.924c0 6.627-5.373 12-12 12-6.628 0-12-5.373-12-12C4.076 10.398 9.407 5.041 16 5V4C8.82 4 3 9.82 3 17s5.82 13 13 13 13-5.82 13-13z"/>
        <path stroke="#e9e9e9" stroke-linecap="square" d="M16 1.5l4 3-4 3"/>
        <path fill="#e9e9e9" fill-rule="nonzero" d="M16 4h4v1h-4z"/>
    </g>
</symbol><symbol id="icon-c-ic-rotate-counterclockwise" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path fill="#e9e9e9" d="M3 17h.924c0 6.627 5.373 12 12 12 6.628 0 12-5.373 12-12 0-6.602-5.331-11.96-11.924-12V4c7.18 0 13 5.82 13 13s-5.82 13-13 13S3 24.18 3 17z"/>
        <path fill="#e9e9e9" fill-rule="nonzero" d="M12 4h4v1h-4z"/>
        <path stroke="#e9e9e9" stroke-linecap="square" d="M16 1.5l-4 3 4 3"/>
    </g>
</symbol><symbol id="icon-c-ic-rotate" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h24v24H0z"/>
        <path fill="#e9e9e9" d="M8.349 22.254a10.002 10.002 0 0 1-2.778-1.719l.65-.76a9.002 9.002 0 0 0 2.495 1.548l-.367.931zm2.873.704l.078-.997a9 9 0 1 0-.557-17.852l-.14-.99A10.076 10.076 0 0 1 12.145 3c5.523 0 10 4.477 10 10s-4.477 10-10 10c-.312 0-.62-.014-.924-.042zm-7.556-4.655a9.942 9.942 0 0 1-1.253-2.996l.973-.234a8.948 8.948 0 0 0 1.124 2.693l-.844.537zm-1.502-5.91A9.949 9.949 0 0 1 2.88 9.23l.925.382a8.954 8.954 0 0 0-.644 2.844l-.998-.062zm2.21-5.686c.687-.848 1.51-1.58 2.436-2.166l.523.852a9.048 9.048 0 0 0-2.188 1.95l-.771-.636z"/>
        <path stroke="#e9e9e9" stroke-linecap="square" d="M13 1l-2.5 2.5L13 6"/>
    </g>
</symbol><symbol id="icon-c-ic-shape-circle" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <circle cx="16" cy="16" r="14.5" stroke="#e9e9e9"/>
    </g>
</symbol><symbol id="icon-c-ic-shape-rectangle" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <rect width="27" height="27" x="2.5" y="2.5" stroke="#e9e9e9" rx="1"/>
    </g>
</symbol><symbol id="icon-c-ic-shape-triangle" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#e9e9e9" stroke-linecap="round" stroke-linejoin="round" d="M16 2.5l15.5 27H.5z"/>
    </g>
</symbol><symbol id="icon-c-ic-shape" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path fill="#e9e9e9" d="M14.706 8H21a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H9a1 1 0 0 1-1-1v-4h1v4h12V9h-5.706l-.588-1z"/>
        <path stroke="#e9e9e9" stroke-linecap="round" stroke-linejoin="round" d="M8.5 1.5l7.5 13H1z"/>
    </g>
</symbol><symbol id="icon-c-ic-text-align-center" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h32v32H0z"/>
        <path fill="#e9e9e9" d="M2 5h28v1H2zM8 12h16v1H8zM2 19h28v1H2zM8 26h16v1H8z"/>
    </g>
</symbol><symbol id="icon-c-ic-text-align-left" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h32v32H0z"/>
        <path fill="#e9e9e9" d="M2 5h28v1H2zM2 12h16v1H2zM2 19h28v1H2zM2 26h16v1H2z"/>
    </g>
</symbol><symbol id="icon-c-ic-text-align-right" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h32v32H0z"/>
        <path fill="#e9e9e9" d="M2 5h28v1H2zM14 12h16v1H14zM2 19h28v1H2zM14 26h16v1H14z"/>
    </g>
</symbol><symbol id="icon-c-ic-text-bold" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h32v32H0z"/>
        <path fill="#e9e9e9" d="M7 2h2v2H7zM7 28h2v2H7z"/>
        <path stroke="#e9e9e9" stroke-width="2" d="M9 3v12h9a6 6 0 1 0 0-12H9zM9 15v14h10a7 7 0 0 0 0-14H9z"/>
    </g>
</symbol><symbol id="icon-c-ic-text-italic" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h32v32H0z"/>
        <path fill="#e9e9e9" d="M15 2h5v1h-5zM11 29h5v1h-5zM17 3h1l-4 26h-1z"/>
    </g>
</symbol><symbol id="icon-c-ic-text-underline" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h32v32H0z"/>
        <path fill="#e9e9e9" d="M8 2v14a8 8 0 1 0 16 0V2h1v14a9 9 0 0 1-18 0V2h1zM3 29h26v1H3z"/>
        <path fill="#e9e9e9" d="M5 2h5v1H5zM22 2h5v1h-5z"/>
    </g>
</symbol><symbol id="icon-c-ic-text" viewBox="0 0 24 24">
    <g fill="#e9e9e9" fill-rule="evenodd">
        <path d="M4 3h15a1 1 0 0 1 1 1H3a1 1 0 0 1 1-1zM3 4h1v1H3zM19 4h1v1h-1z"/>
        <path d="M11 3h1v18h-1z"/>
        <path d="M10 20h3v1h-3z"/>
    </g>
</symbol><symbol id="icon-c-ic-undo" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path d="M24 0H0v24h24z" opacity=".5"/>
        <path fill="#e9e9e9" d="M3 6h12a6 6 0 1 1 0 12H3v1h12a7 7 0 0 0 0-14H3v1z"/>
        <path stroke="#e9e9e9" stroke-linecap="square" d="M5 3L2.5 5.5 5 8"/>
    </g>
</symbol><symbol id="icon-c-img-bi" viewBox="0 0 257 26">
    <g fill="#FDBA3B">
        <path d="M26 5a8.001 8.001 0 0 0 0 16 8.001 8.001 0 0 0 0-16M51.893 19.812L43.676 5.396A.78.78 0 0 0 43 5a.78.78 0 0 0-.677.396l-8.218 14.418a.787.787 0 0 0 0 .792c.14.244.396.394.676.394h16.436c.28 0 .539-.15.678-.396a.796.796 0 0 0-.002-.792M15.767 5.231A.79.79 0 0 0 15.21 5H.791A.791.791 0 0 0 0 5.79v6.42a.793.793 0 0 0 .791.79h3.21v7.21c.001.21.082.408.234.56.147.148.347.23.558.23h6.416a.788.788 0 0 0 .792-.79V13h3.006c.413 0 .611-.082.762-.232.15-.149.23-.35.231-.559V5.791a.787.787 0 0 0-.233-.56M85.767 5.231A.79.79 0 0 0 85.21 5H70.791a.791.791 0 0 0-.791.79v6.42a.793.793 0 0 0 .791.79h3.21v7.21c.001.21.082.408.234.56.147.148.347.23.558.23h6.416a.788.788 0 0 0 .792-.79V13h3.006c.413 0 .611-.082.762-.232.15-.149.23-.35.231-.559V5.791a.787.787 0 0 0-.233-.56M65.942 9.948l2.17-3.76a.78.78 0 0 0 0-.792.791.791 0 0 0-.684-.396h-8.54A5.889 5.889 0 0 0 53 10.86a5.887 5.887 0 0 0 3.07 5.17l-2.184 3.782A.792.792 0 0 0 54.571 21h8.54a5.89 5.89 0 0 0 2.831-11.052M105.7 21h2.3V5h-2.3zM91 5h2.4v10.286c0 1.893 1.612 3.429 3.6 3.429s3.6-1.536 3.6-3.429V5h2.4v10.286c0 3.156-2.686 5.714-6 5.714-3.313 0-6-2.558-6-5.714V5zM252.148 21.128h-2.377V9.659h2.27v1.64c.69-1.299 1.792-1.938 3.304-1.938.497 0 .95.065 1.382.192l-.215 2.277a3.734 3.734 0 0 0-1.275-.213c-1.814 0-3.089 1.234-3.089 3.638v5.873zm-7.095-5.744a3.734 3.734 0 0 0-1.101-2.703c-.714-.766-1.6-1.149-2.658-1.149-1.058 0-1.944.383-2.679 1.149a3.803 3.803 0 0 0-1.08 2.703c0 1.063.368 1.978 1.08 2.722.735.746 1.62 1.128 2.68 1.128 1.058 0 1.943-.382 2.657-1.128.734-.744 1.101-1.659 1.101-2.722zm-9.916 0c0-1.682.583-3.086 1.729-4.256 1.166-1.17 2.635-1.767 4.428-1.767 1.793 0 3.262.597 4.407 1.767 1.167 1.17 1.75 2.574 1.75 4.256 0 1.7-.583 3.127-1.75 4.297-1.145 1.17-2.614 1.745-4.407 1.745-1.793 0-3.262-.575-4.428-1.745-1.146-1.17-1.729-2.596-1.729-4.297zm-1.5 3.233l.821 1.83c-.864.638-1.944.958-3.22.958-2.526 0-3.822-1.554-3.822-4.383V11.66h-2.01v-2h2.031V5.595h2.355v4.063h4.018v2h-4.018v5.405c0 1.469.605 2.191 1.793 2.191.626 0 1.318-.212 2.052-.638zm-12.43 2.51h2.375V9.66h-2.376v11.469zm1.23-12.977c-.929 0-1.642-.682-1.642-1.596 0-.873.713-1.554 1.643-1.554.885 0 1.576.681 1.576 1.554 0 .914-.69 1.596-1.576 1.596zm-6.49 7.234c0-1.086-.346-1.98-1.037-2.724-.692-.745-1.599-1.128-2.7-1.128-1.102 0-2.01.383-2.7 1.128-.692.744-1.037 1.638-1.037 2.724 0 1.084.345 2.02 1.036 2.766.691.744 1.6 1.105 2.7 1.105 1.102 0 2.01-.361 2.7-1.105.692-.746 1.038-1.682 1.038-2.766zm-.173-4.129V5h2.397v16.128h-2.354v-1.596c-1.015 1.255-2.333 1.873-3.91 1.873-1.663 0-3.068-.575-4.169-1.724-1.102-1.17-1.663-2.596-1.663-4.297 0-1.682.561-3.107 1.663-4.256 1.101-1.17 2.485-1.745 4.148-1.745 1.534 0 2.83.617 3.888 1.872zm-11.48 9.873h-10.218V5.405h10.195v2.318h-7.711V12h7.15v2.32h-7.15v4.489h7.733v2.319zm-23.891-9.724c-1.793 0-3.132 1.192-3.478 2.979h6.783c-.194-1.808-1.555-2.979-3.305-2.979zm5.703 3.766c0 .32-.021.703-.086 1.128h-9.095c.346 1.787 1.62 3 3.867 3 1.318 0 2.916-.49 3.953-1.234l.994 1.724c-1.189.872-3.067 1.595-5.033 1.595-4.364 0-6.243-3-6.243-6.021 0-1.724.54-3.15 1.642-4.277 1.101-1.127 2.548-1.702 4.298-1.702 1.664 0 3.046.511 4.105 1.553 1.058 1.043 1.598 2.447 1.598 4.234zm-19.949 3.894c1.08 0 1.966-.362 2.68-1.085.712-.724 1.058-1.617 1.058-2.703 0-1.084-.346-2-1.059-2.701-.713-.702-1.599-1.064-2.679-1.064-1.058 0-1.944.362-2.656 1.085-.714.702-1.059 1.596-1.059 2.68 0 1.086.345 2 1.059 2.724.712.702 1.598 1.064 2.656 1.064zm3.673-7.936V9.66h2.29v10.299c0 1.85-.584 3.32-1.728 4.404-1.146 1.085-2.68 1.638-4.58 1.638-1.945 0-3.672-.553-5.206-1.638l1.037-1.808c1.296.915 2.679 1.36 4.126 1.36 2.484 0 3.996-1.51 3.996-3.637v-.83c-1.015 1.127-2.311 1.702-3.91 1.702-1.684 0-3.089-.554-4.19-1.68-1.102-1.128-1.642-2.532-1.642-4.214 0-1.68.561-3.085 1.706-4.191 1.145-1.128 2.571-1.681 4.234-1.681 1.534 0 2.83.575 3.867 1.745zm-18.07 8.127c1.102 0 1.988-.382 2.7-1.128.714-.744 1.06-1.659 1.06-2.743 0-1.065-.346-1.98-1.06-2.724-.712-.745-1.598-1.128-2.7-1.128-1.101 0-2.008.383-2.7 1.128-.691.744-1.036 1.66-1.036 2.745 0 1.084.345 2 1.037 2.745.691.744 1.598 1.105 2.7 1.105zm3.652-8V9.66h2.29v11.469h-2.29v-1.575c-1.059 1.234-2.399 1.852-3.976 1.852-1.663 0-3.067-.575-4.168-1.745-1.102-1.17-1.642-2.617-1.642-4.34 0-1.724.54-3.128 1.642-4.256 1.1-1.128 2.505-1.681 4.168-1.681 1.577 0 2.917.617 3.976 1.872zM138.79 9.34c1.404 0 2.527.448 3.37 1.34.863.873 1.295 2.086 1.295 3.596v6.852h-2.376V14.66c0-2.021-1.036-3.128-2.657-3.128-1.727 0-2.915 1.255-2.915 3.192v6.404h-2.377v-6.426c0-1.978-1.037-3.17-2.679-3.17-1.728 0-2.937 1.277-2.937 3.234v6.362h-2.377V9.659h2.333v1.66c.692-1.212 1.988-1.979 3.522-1.979 1.533.021 2.958.767 3.586 2.107.798-1.277 2.419-2.107 4.212-2.107zm-19.517 11.788h2.484V5.405h-2.484v15.723z"/>
    </g>
</symbol></svg>img/edit_codemirror.png000064400000001020151215013430011164 0ustar00�PNG


IHDR�a�IDATxڍ���QE�SE5�ֶͩm۶�pM�amĵm۸���t~��('J��E�j�k~���we��؋8�6��"a��:��Ǘ/_`1����c}�pMm]��C���?b����ֹ�U��a� �t�|o��}ƍ�7����kb�
'%$>��;r��q��EPA�%�\��g���߈���s	߾}Ç����+2�ҩ)�MĂ�޻g/4��ENV6	T���_�Ɛ~�1r������&L AlĂkׯcfi�����\�VQN��
Ũѣ���x���F�Cnb��K�;�d4��ѣ~�-[����9f!n�]d��/E��5a֌�����=���.5���u�vܡ�%�HHB�R]��@��'O� 3#�\�*�q�Q駆NGϬ|��*@����M�j[D�if��cc]_L-�#�rY�.�ۅ�իV�Jʖt�'�<D�t�Ey���{��b֜IEND�B`�img/volume_icon_sql.png000064400000001074151215013430011221 0ustar00�PNG


IHDR�aIDATxڍ��A��͸�TKqm)�m۶m�x�m_�g����җ�
��F��b�ܹS�;�T�<�`ڴi˳��III!::�����|��Ջ����K &&���
���u�aC��*�h�R�H����Z���7���cX��k���	�ʅƂ�M��lw�	�ryy��\�K��g,h߫g-" 0Q��͵��ܹöm�~(��:A��ӑe�'�?#�"7���@��c�IM�5��9�\G�߆)IIIF���J��O+0���tBCCy��.>�ԵG\������<����e#AC�B���Z9��ԣc��j�:�^�a�`�ڵk����u�.\`�޽�ܹ��r��Y˗�-L�2��'�u��ݏ�|r��_�cC�KOFk~�Ǐ_��'''~����/����>��'��݉�c�0a�
�;���k,Y�A���pD��={��b~w���{�o�
p�'֏���X1G�m�T���p]]�q���aÆ"G��j���?�|䊃˫7IEND�B`�img/volume_icon_googledrive.png000064400000001227151215013430012730 0ustar00�PNG


IHDR�a^IDATxڭ��Q���>Զm۶��m���նm��LwkG=�o����Q&G`��&GU��p���ģ��'��R�h����%���Ra���i�?�:E�r�Je\�곆�O�iY*�ΒfTH1�qZ�@(R��;[�QS��W��U�yZ��qv�ʼnx?y���M`D�|�(��H��JI�h�S��**��'B��7m7�)��'�*�Ř��)-���P���7v��W��3�`�V�3.jX%��&pzV$�(�=��p�u̶�S&,�<�ZzMւ�@L`�bs��O ��"r����UxD���ǎ��'�y������(��r9��t͖E�6�fs"Y�`J���
�V�T��|�өN����	��F!8�)U�VY�k~s�S�@B�	N{�i�ys�����̸�G-B�B��QB��=~N�,��@�uqN���tRf�vPJ���Ĉ��(�Z{�ٞ>}$����DLa�)�Ÿ$��"�.�
��bol�>�(��P�W
K����BJ�o�#�u�D�11f5��.ЈI�~���2s��1�R�o�{s��'�ZG���bol��G��J\�c�IEND�B`�img/volume_icon_sql.svg000064400000022073151215013430011236 0ustar00<svg viewBox="0 0 233.1 286.6" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><linearGradient id="a"><stop stop-color="#fff" offset="0"/><stop stop-color="#fff" stop-opacity="0" offset="1"/></linearGradient><linearGradient id="b" x1="1618.4" x2="1701.1" gradientUnits="userSpaceOnUse" spreadMethod="reflect"><stop stop-color="#497bb3" offset="0"/><stop stop-color="#a5c4e6" offset=".2"/><stop stop-color="#3b5d8b" offset="1"/></linearGradient><linearGradient id="c" x1="282.4" x2="286.6" y1="518.6" y2="527.3" gradientUnits="userSpaceOnUse"><stop stop-color="#a5c4e6" offset="0"/><stop stop-color="#497bb3" offset="1"/></linearGradient><linearGradient id="d" x1="1702.8" x2="1783.8" y1="-868.3" y2="-877.9" gradientUnits="userSpaceOnUse" xlink:href="#a" spreadMethod="reflect"/><linearGradient id="e" x1="1702.8" x2="1783.8" y1="-821.2" y2="-830.8" gradientUnits="userSpaceOnUse" xlink:href="#a" spreadMethod="reflect"/><linearGradient id="f" x1="1702.8" x2="1783.8" y1="-777" y2="-786.6" gradientUnits="userSpaceOnUse" xlink:href="#a" spreadMethod="reflect"/></defs><g class="Graphic"><path d="M183 16.4c2.3 3.9 1.5 189.2-1.6 196.5-2.4 5.8-80.6 70.8-84.7 72.5-52.9-.3-88.5-19.6-94.5-29.8C0 242.8 2 45.6 4 41.6 6 37.8 106 2 109.5 1.1c3.2-.7 70.7 10.9 73.4 15.2z" fill="#c7c7c7"/><path d="M181.9 17l.3-.2h-.1l-.3.1h.3-.1l-.1.1zm0 0l.2-.1v-.1l.3-.1-.2.2.2-.2-.2.1-.2.2zm.5-.3l.5-.3-.5.2zm.6-.2l-.6.2.6-.2zm.9-.7c0-.2-.2-.3-.3-.5l-.4-.3-1-.6-1-.5-1.5-.5c-1-.4-2.2-.8-3.6-1.1l-4.5-1.2A858.9 858.9 0 0 0 124 1.8l-9-1.3-3-.4h-1l-.5-.1h-.9l-.2.1h-.4l-.3.2-.6.1-.6.3-1.6.5-2.1.7-5.5 2-6.8 2.4a3492.8 3492.8 0 0 0-71 26.4l-6.7 2.7a210.2 210.2 0 0 0-8.8 4l-.6.4-.5.3c-.1.2-.3.3-.4.3L3 41l-.2.4v.4l-.1.5-.1.7c0 .4 0 1-.2 1.5v2a326.8 326.8 0 0 0-.6 12A6597.9 6597.9 0 0 0 .2 237l.2 6.9.2 5.4.2 4 .1 1.5v.6l.1.4v.2l.2.2a19 19 0 0 0 3.8 4.5c1.7 1.5 3.8 3.1 6.4 4.8 5 3.3 11.8 6.7 20 9.8a190.2 190.2 0 0 0 65.3 11.3h.5l.4-.3.3-.2.5-.3.6-.5 1.4-1 1.8-1.3 4.4-3.5 5.5-4.4a1569.7 1569.7 0 0 0 56.5-47.8l5.3-4.8 4.2-4 1.6-1.7 1.4-1.4.9-1 .3-.5c0-.2.2-.4.3-.5v-.4l.2-.4a19 19 0 0 0 .3-2.4l.2-1.7.3-4.2.3-5.3.9-30.7a4531.2 4531.2 0 0 0 .1-139 202.1 202.1 0 0 0-.5-11.1v-.8l-.2-.6v-.5l-.2-.2-.1-.3zm-1.7 1l.5-.6-.5.6zm-.3.4v.5l.1.7.2 1.9v2.4l.4 6.6a2727.6 2727.6 0 0 1 .5 56.4c0 27.4-.2 58.1-.7 82.5a1759.8 1759.8 0 0 1-1.5 40.1c0 .6 0 1.2-.2 1.7l-.1 1.2-.2.8v.4l-.1.2-.2.3-.8 1-1.3 1.3-1.6 1.6-4.1 3.9a1419.9 1419.9 0 0 1-61.7 52.5l-5.5 4.4-4.4 3.5c-.6.5-1.2 1-1.8 1.3l-1.3 1a4 4 0 0 1-.6.4l-.3.3-.3.1a194.1 194.1 0 0 1-64.1-11.1c-8-3-14.6-6.4-19.6-9.6a46.8 46.8 0 0 1-8.1-6.7c-.5-.5-.9-1-1.2-1.6v-.7l-.2-1.3-.3-4a724.6 724.6 0 0 1-.2-12.2A6591.7 6591.7 0 0 1 4.2 58.6c0-2.5.2-4.7.3-6.8l.2-5.1.1-2 .2-1.5v-.5l.1-.5.1-.1.3-.3.6-.3 1.4-.7 2-1 5.1-2.1 6.7-2.7a2431 2431 0 0 1 71-26.4L99 6l5.4-1.9 2.1-.7 1.7-.6.6-.1.5-.2.3-.1h.2l-.1-.5v.4h1l1 .2 3.1.3 8.9 1.3a816.2 816.2 0 0 1 47.4 9.2l4.3 1.2 3.5 1 1.3.6 1 .4.6.4v.2zm-85.6 267h.4v.7l-.4-.6.4.6v.5l-.5-1 .1-.1zM3.3 255v.2l.1.2-1.2.2 1-.5h.2-.1zM5 42v.2l-.3-.3-.8-.2.8.2h-.1.2l.2.1zm-.3 0zm-.8-.5l.7.4-.7-.4zm.7.4l-.5-.6.5.6zM109.7 2l-.1-.8V2zm-.2-.8l.2.8-.2-.8z"/><path d="M179 20.2l-2.4 1-2.5 1.2-2.4 1-2.5 1.2-2.5 1.2-2.5 1.2-2.6 1.3-2.5 1.3-2.6 1.2-2.5 1.4-2.6 1.3-2.6 1.4-2.6 1.3-2.6 1.4-5.3 2.8-5.3 2.9-5.3 2.8-5.3 3-5.4 2.8-5.4 2.8-5.4 2.8-2.7 1.4-2.7 1.3-2.8 1.4-2.7 1.3-1.2-.3-1.4-.3-2.6-.6-2.8-.7-2.8-.6-2.8-.7-2.9-.6-2.9-.7-3-.7-2.9-.6-3-.7-6-1.4-6-1.3-3-.7-3-.6-3-.6-2.9-.6-2.9-.7-2.8-.6-2.9-.6-2.7-.6-2.7-.5-1.3-.3-1.4-.3-1.2-.2-1.3-.3-1.3-.2-1.2-.2-1.3-.3-1.2-.3-1.1-.2-1.2-.2-1.1-.2-1.1-.2-1.1-.2-1-.2-1.1-.2-1-.2-1-.2-1-.2 2.5.8 2.5.8 2.5.7 2.5.7 2.6.8 2.6.7 2.7.8 2.7.7 2.7.7 2.7.7 5.5 1.5 5.6 1.4 5.6 1.5 5.6 1.5 5.5 1.4 5.5 1.4 2.7.8 2.7.7 2.7.7 2.7.8 2.6.7 2.6.8 2.6.7 2.5.7 2.4.8 2.5.7v2.9l.1 2.9v2.9l.1 3v3l.2 3v6.2l.1 3.2v3.2l.1 3.2v6.5l.1 3.3v6.7l.1 3.4v10.2l.1 7v14l.1 7 .1 14.2v14.2l.1 7v7l.1 7v7l.1 3.4v6.8l.1 3.4v6.7l.1 3.3v6.5l.1 3.2v6.4l.1 3.1v3l.1 3.2.1 3v3l.1 2.9.1 2.8v2.9l.1-2.9v-5.9l.1-3v-3l.1-3v-3.2l.1-3.2v-6.4l.1-3.2.1-3.3v-3.3l.1-3.4v-3.3l.1-3.4v-3.5l.2-3.4v-6.9l.2-7 .1-7 .1-7.2.2-7.2.3-14.3.2-14.4.1-7.1.2-7.1v-7.1l.2-7V126l.2-3.5v-6.8l.1-3.4v-3.4l.1-3.3.1-3.3v-6.6l.1-3.2v-3.2l.1-3.1V83l.1-3v-3l.1-3.1V68l.1-2.8 5.2-2.8 5.2-2.8 5.2-2.7L120 54l5.1-2.7 5.1-2.7 5-2.7 5.1-2.8 5-2.7 5-2.7 4.9-2.9 4.9-2.8 2.4-1.5 2.4-1.4 2.4-1.5 2.3-1.5 2.4-1.4 2.4-1.5 2.3-1.6 2.4-1.5z" fill="#fff" fill-opacity=".5"/><path d="M179 20.2C153 31.2 124.4 49 95.4 63a1898 1898 0 0 0-87-18.8c25.7 8 59.5 15.5 85.2 23.5 1.5 60.2.8 151.4 2.3 211.6.7-60.7 2.8-153.4 3.5-214 27.8-15 55-28.5 79.8-45z" fill="none"/><path d="M18 218.5l.4.6.5.7.5.6.6.6.6.6.5.5.7.6.6.6.7.5.7.5.7.6.7.5.8.5.8.5.7.5.8.5.9.4.8.5.9.4.8.4 1 .4.8.4 1 .4.8.3 2 .8 1.8.6 2 .6 2 .5 1.9.5 2 .4 2 .4 1.9.3 2 .3 1.9.1h1l.9.1H63l1-.1.7-.1.9-.1.8-.1.8-.2.8-.2.8-.2.7-.1.7-.2.7-.3.7-.2h-.1l-.3-.1H71l-.4-.2h-.4l-.4-.2-.5-.2-.6-.1-.6-.2-.7-.1-.7-.2-.7-.3-.8-.2-.8-.2-.9-.2-.9-.3-1-.3-.9-.2-1-.3-1-.3-1-.2-1.1-.3-1-.4-1.2-.2-2.3-.7-2.3-.6-2.4-.7-2.4-.6-2.3-.7-2.4-.6-2.3-.7-2.3-.6-1.1-.3-1.2-.3-1-.4-1-.2-1.1-.3-1-.3-1-.3-1-.2-.9-.3-.9-.2-.8-.3-.8-.2-.8-.2-.7-.2-.7-.2-.6-.2-.6-.2-.6-.1-.4-.2H19l-.3-.2h-.3l-.3-.2H18z" fill-opacity=".2"/><path d="M18 218.5c9.5 13.7 39.4 20.4 53.6 14.9-2.5-.7-50.5-13.9-53.6-15z" fill="none"/><path d="M67 193.1l-44.4-17-.4.1-.4.2-.4.2-.3.2-.3.3-.2.3-.3.3-.2.3-.2.4-.2.3-.1.3-.2.4-.1.4-.1.3-.2.7v.7l-.1.7v2.2l7 2.4v.1l.1.2h.1v.2l.2.2v.1l.2.2.2.2.1.2.2.2.2.2.2.3.2.2.5.5.5.6.6.5.6.6.7.6.7.6.8.6.8.6.9.5.9.5 1 .6 1 .4.5.2.6.3.5.2.6.1.6.2.6.1.6.2.6.1.6.1h.6l.7.2h3.5l.7-.1.7-.1.7-.1.8-.2.8-.2.7-.2.8-.2.8-.3h.4l.3.1h.3l.3.1h.4l.4.1h.5l.5.1h.6l.5.1h4.4l.6-.2h.6l.6-.2.6-.2.5-.1.5-.2.5-.3.5-.3.3-.3.4-.3.2-.2.1-.2.1-.2.1-.2.1-.2.1-.3z" fill="#fff" fill-opacity=".4"/><path d="M67 193.1l-44.4-17c-4.6 1.6-3.7 8.3-3.7 8.3l7 2.4s9.6 15.1 26.7 9.2c0 0 12.8 2.3 14.3-2.9z" fill="none"/><path d="M66.5 187.4l-44.1-11.5c-.6 2-.7 5 .2 6.6 2.3 1.1 6.8 2 9 3 6.4 6.3 12 6.8 22.3 6l12 2.2c1.2-2.4 1.5-3.4.6-6.3z" fill="#606060"/><path d="M66.5 187.4l-44.1-11.5c-.6 2-.7 5 .2 6.6 2.3 1.1 6.8 2 9 3 6.4 6.3 12 6.8 22.3 6l12 2.2c1.2-2.4 1.5-3.4.6-6.3z" fill="none"/><path d="M180.7 18.9L94.8 67.1l.4 215.4 84-70.7 1.5-192.9z" fill="#fff" fill-opacity=".4"/><path d="M180.7 18.9L94.8 67.1l.4 215.4 84-70.7 1.5-192.9z" fill="none"/><path d="M23 232.1l.4.6.5.6.5.6.5.5.5.6.6.5.5.5.6.5.6.5.5.5.6.4.6.5.6.4.6.4 1.3.8 1.4.7 1.3.7 1.3.6 1.4.5 1.4.5 1.4.4 1.4.4 1.4.4 1.4.3 1.4.2 1.4.2 1.4.1 1.5.1 1.3.1h2.8l1.3-.1 1.3-.1 1.3-.1 1.2-.3 1.2-.2 1.1-.3 1.2-.3 1-.4h-.3l-.2-.1H63l-.3-.1-.4-.1-.3-.1-.5-.1-.4-.2-.5-.1-.5-.2-.6-.1-.6-.2-.6-.1-.7-.2-.7-.2-.7-.2-.7-.2-.8-.2-.8-.3-.8-.2-.8-.2-1.7-.5-1.7-.4-1.8-.5-1.8-.5-1.8-.5-3.6-1-1.7-.5-1.8-.5-1.7-.5-.8-.2-.8-.2-.8-.2-.8-.2-.7-.3-.7-.1-.7-.2-.7-.2-.7-.2-.6-.2-.5-.1-.6-.2-.5-.1-.5-.2-.4-.1-.4-.1-.4-.2h-.6l-.2-.2h-.4z" fill-opacity=".2"/><path d="M23 232.1c9.8 13 29.6 15.3 40.7 11.3a3565 3565 0 0 1-40.8-11.3z" fill="none"/><path d="M30.3 245.5l.5.7.6.7.6.7.7.5.6.6.7.6.7.5.8.5.7.4.8.5.8.4.8.3.8.3.8.4.9.2.8.2.9.3.9.1.8.2 1 .1.8.1h4.5l.8-.2.9-.1.8-.2.9-.2.8-.2.8-.3h-.2l-.2-.1h-.2l-.2-.2h-.2l-.3-.1h-.3l-.3-.1-.3-.1-.4-.1-.4-.1-.4-.2H52l-.4-.2-1-.2-.9-.3-1-.3-1-.3-1.1-.2-1.1-.4-2.3-.6-2.3-.6-1-.3-1.2-.3-1-.3-1-.3-1-.3-1-.2-.4-.1-.4-.2h-.4l-.4-.2h-.4l-.3-.2h-.3l-.3-.2h-.3l-.2-.1H31l-.2-.1h-.2l-.1-.1h-.2z" fill-opacity=".2"/><path d="M30.3 245.5c5.7 7.7 16.8 10.1 25.5 7l-25.5-7z" fill="none"/><path d="M15 59l-4.4.5-.8 103 67.4 18.8L79 176l-64.8-17.3L15 59z" fill="#fcfcfc" fill-opacity=".4"/><path d="M15 59l-4.4.5-.8 103 67.4 18.8L79 176l-64.8-17.3L15 59z" fill="none"/><path d="M78.6 97l-.1 3L15 81.7l63.6 15.4zm.9 21l-.1 3L16 102.5 79.5 118zm-.9 19.4l-.1 2.9L15 122l63.6 15.4zm0 19l-.1 3L15 141l63.6 15.4z" fill-opacity=".2"/><path d="M15.2 61.3l63 15.8-.5 104h1l.6-104.4v-.4l-.4-.1-63.5-16-.1.6-.1.5zm63.4 15.9l-.4-.1v-.4h.6l-.2.5z" fill="#9e9e9e"/></g><path d="M1618.4-890.9v126.4h.5c-.3 1-.5 2-.5 3 0 15.3 37 27.6 82.7 27.6s82.6-12.3 82.6-27.6c0-1-.1-2-.5-3h.5v-126.4h-165.3z" fill="url(#b)" transform="matrix(.92352 0 0 .86375 -1414.3 896.3)"/><path transform="matrix(4.58315 0 0 4.28653 -1157 -2110.6)" d="M303.3 521.8c0 3-7.5 5.5-16.7 5.5s-16.6-2.5-16.6-5.5 7.4-5.6 16.6-5.6 16.7 2.5 16.7 5.6z" fill="url(#c)"/><path d="M80.2 205.2c.6 13 34.7 23.4 76.5 23.4 41.7 0 75.6-10.4 76.4-23.3-13.4 10.6-42.5 18-76.4 18-34 0-63.1-7.4-76.5-18.1z" fill="#3b5d8b"/><path d="M1618.3-891.5c.6 15 37.5 27.2 82.8 27.2 45.2 0 81.9-12 82.7-27l-3 2.2c-9.7 11.7-41.6 20.3-79.7 20.3-38.3 0-70.5-8.7-80-20.5 0 0 0-.2-.2-.2l-2.6-2z" fill="url(#d)" transform="matrix(.92352 0 0 .86375 -1414.3 896.3)"/><path d="M80.2 167c.6 13 34.7 23.5 76.5 23.5 41.7 0 75.6-10.4 76.4-23.4-13.4 10.7-42.5 18-76.4 18-34 0-63.1-7.4-76.5-18z" fill="#3b5d8b"/><path d="M1618.3-844.4c.6 15 37.5 27.2 82.8 27.2 45.2 0 81.9-12 82.7-27l-.7.5c-5.2 13.5-40 24-82 24-42.5 0-77.5-10.5-82.3-24.3l-.5-.4z" fill="url(#e)" transform="matrix(.92352 0 0 .86375 -1414.3 896.3)"/><path d="M1618.3-800.2c.6 15 37.5 27.2 82.8 27.2 45.2 0 81.9-12 82.7-27l-.7.5c-5.2 13.5-40 24-82 24-42.5 0-77.5-10.6-82.3-24.3l-.5-.4z" fill="url(#f)" transform="matrix(.92352 0 0 .86375 -1414.3 896.3)"/><path d="M80.7 244.5c4.4 11.9 36.8 21 76 21 38.8 0 71-9 75.7-20.8-13.6 10.4-42.4 17.6-75.7 17.6-33.6 0-62.5-7.3-76-17.8z" fill="#3b5d8b"/></svg>img/toolbar.png000064400000016522151215013430007471 0ustar00�PNG


IHDRߴ)��PLTE	'A��Kw%����}�ى��������
j���]��t��[\\���/.,z��U�j���J��p�Eb�Tw��7��n�6k*��h�����
C�_�n�z$��6?�����.~�r�K�yyyj��g�q��M��v��JHH=��>h�h�Ct|��U�Oޙ:���
_��iY�IZ�Ǻ��q���k͇��7��I�B��uy�X]�[\]k�֓��5�!؎%���$�ŷ�����\�P�S���0��equt9v�܌:��l�\���w|{����*���|�d�<0W����>��#R������L�n��d {�Z����;>B��;Yb��|x	1�e��S�3r�c�gh_�,���VSN~3"���J��.0o�[���>�)���W�7�-t��Am���o�������۴q��Sg�M^�;���F�4�]O7������������������쐳�������������5���۞����׌��?����������մ�����S}�������}�����������kki����΀S����nJo�Wr�eͣrN�����䷏Ƙd���Zح�����{�p����ß�ڐ�ˇ�σ4����袥Ә��ٝ�s�nu��K�r&��j��٦�޽��bbD�׵�ԔϢ[�xx�i�H5����
�h�Ƈ�㾧�{����_ږY����tRNS/��ut�jj�������lk����[?������ɤY��q�ʹ��+̿\��,�љ{F�������H͵t3���SŠ����.�TPO��ׯ�����ˋPN�����X��������˴����ki��孬��뾵?�W�����ɶ�qj���̕������}�؝��T�bIDATxڬ�_HSQǯ��r�հ�j�R*)iɰm����P�lӈ"d�%$\E!AЃ/F� 	=��[n"��M�jH6�fD�����9;���>��~�����G�����T�q���hk饞K<�b��� x�t�6��b�������296��L��B��0�O{���x��RaSsg<��F'a�l�k.�9p&>?{�Y"������R���M.n���/^bE�m&zz&�h^�����a��Qq�r��?f�jJ���"3�F"�Q�T�E��E�_�E$�Q�%+z��TP!��r�Ӷ�������?p������"h��
E���hjTBB�H�����gz9�:!1���1�S *A@�8��9+� 4�"��ܷ���t<��	�)�Ƅ~��&i�U�P�A�d�-imK&�&��
C���,a�j�D�`2���`�`��T�e�0�]RQq�*p�W��ڵ'��}�n��I�|nz�A0<ǰ"�ͩa�b�I&
�| �a	1�AO���h0����H'/�������߿=!�I�
3I&&�u]����G2�N@p�,��\X��RYiQ�2yo��H��{36`(/��*!���B�J\�Ї�إa	������G- ��<�?>�?ZE��`p����/Fa)����q�bCaa1����
<mU!���d�ª
W�,.^���
.��
�7���6׬1n��?f]�=��^=�b��nǝ��e���t:�V��l�mN�}
�$,�U&��
�l�0��c���?�n�ڱ�S�wډx�9턷��H��_۝�0��qI��f��q�=m��H;m�y��t�\�)�NϿ~=eO����ק)��<yg7��N�<��ȁRL�ҽ �t�DhtcL���Q��c���Ѓ��BHJO*©����'��rH@ʴ�f��A�dnRc�n���-0����h�̠����я��}�(��}�~��Ap|Z1M!��342Gk6k˄�%4s�2�����42܈4�ܰ��J�[���2��THD��h$�6�
�I��vb�D4��<��>}�7B.7nܸ�(�˘��1��Pi�y��*�-����7�@��<��F�oI�֭
��ýca��[�4�-�bF��aW�3�E]d��G�Yu]�
[!�R�V�V�!"5����r3a��0�Z�Π�!͚m2#p�e*�1,MW'@ՙ��RX@�Ʉ%(Sp�.R?�
*|>d�p��8�G�"�:+-9��� ,!p�1�/*�T �jRqk0XcD��{���Q�P�8��~�8�n.���T��%�iP�����J�֠�W�r�َ�W^�"5_H?:�#�P����g>|��D"��D��ul��F�wL�d����!��P����YA�G��+jI������E*�F"��o;�b��u"T|��q6+��#��3���˘;���G	c˞�B�m˶	�ӫV�^qgŊݫV��//�:����py.GV�8\��"�#��yh��r���Z--9����l�|�K8-T��������h�\�x g�2�Z���Â��2��r0�F������d�L�zg5�������|{��AW�Q1����n�e(�Dx��B��lIE-}���HVDP ��Y�<��yF�CVdl�x�%�2F����1��&�0�ov}@V�#	J��4�|Q
�{j�A<z0�����A�I���CQ�-.�j����
	9�X��VD|��ϣ��],z��M��o���~���?o����j�5Pt�<�;E
���Є�K�Z�f�2�E��x*�����X�G$}��CC���/��ì[?��<T�k��z����:m��>�"����V��Z~R~SF~};ԇ���'o�F3;�a)
�E};3���gr�qܸd.�{Ŷ���r���u�cێ��愘h���F�ٜ����mB(��-�b����R4�3Q��JL���w4a.�E��R4�@0�� \4�9��EI�=����8�FqF�H��0q��W$	LX(�)���4J(�D��2��EpY����@��O����Q4b%r�P"�Sk��4]7*���am�b�6����_��/s�*O�@.�����.�R+O!s	ʟp�{6u�!D��.�*!8oW]��#@9_�r�CܾJ(�	S3Ց�0UQ(K�2U�^JD�Fkd�K�U�}�5�8RѪ�h���@[�3��B�k���.?��=$�4׺����H�R@T�~�a�凌�^Ӥ�qu�/��].b|�����)��� �]gSĀ���0�Y3a�,�Ɲ�Ba��
�bũ��
���ֈw1�kV�&�#ÅB��bi�UJi���[��US�TlJ�g.J�J}^����ϝ�hi ���Z��,9UId��E�J񅃕1t�	:�_!a�8��5G��q�u�0Lt��5���1���u���u�.ijB��q
τUH�*�Ⱥ6��n��L͐YA_�}	����wS_���`�#����{���9��lt� ���ۗ�RPET��P�4D�oR,曡ۗ/�,盡�=���`�v��ز�%;9�Cn�b?u�qƀV�I����+�c�w)�v���R��JvF�2%�U�O�p��#���o��o���l<�q_�Œ�6f��9�M�gs��)�ŗ_]��bG���W��
�ڽ���}B4[���1T
�į1�l������b
g �</.�O��?XBF��`�4թ�_�W50(�1|�8����7O��	$8<��<�)D	�@ni ����#�8Оm`�ۅx��k.>5g��&Q6���U�J���M��Wu5�C�ޔ�T�h�(㜠�ߋ�O�6D]������g#'(�MN~��W�&���4��9'(OO?������4�$����ç/	x�D:}�<����Gc�|��yΧ�ΧPs�)����� s���dn\��̍���S�Y�����i��� ��y�T�6����@K� &��2g��2.$�И�6�m����t�m�1�ܪ�5-���F/L섨��Y�X����?L���{z/���K��~�y�]���vU��UɢρU�HI������%c��4O��f*brLi�U�,5�ڄ>�.狴f&��lAb{J=��ڙ�4+3<]lOm��۬́���ۯukm���*����1�������v�H̩����O�R�
����������{�T�E@�{�W[�ӂ�N�q�"
6C�%A����'rŀ7�(��P=�@0��wxiD	z|�|����|�����t�Ώ���G<IP��
4�������1r�{�c�<���a���G��7���Φ˗��G�P�vSS��l�&�p��e�SSSG��S"ر@��3��F�1����0WO|`
	���0�.
�5�P�j`�5 ��F��P^�qc�ۅ�r�؇���>�u�#Z�;ԫⲎ�:�{|{g����aIC��ðdyOR��%���%-˒@-Kh����Q���e���]H�}�cY:=�H����Z��t�AhE��>��\�3�q�8������J��_���Q
/z$O��f�"��EC�΅+�JϊdE�˲���KbQ�&���Bqd�.�ry�����G|.2y]�t�Aߤ�w{&=n
������p�'G�9�;d��&�H��7�G�dS7�3��H����j�Z)j�Z!���)P����0#W)�#q(��o�Y���1�XӂV%��d����æ��<��(s#��k�KD�ժ�.A���ww����"����_�s���.�Q���꟏�W�y>FJ�Vk0�RY<RR�2���G��@7>�
?[�ˎ�� �r�H^��p4K��"�ֱHdl��(�#%c���@�M%c6��䰍ELXj��4�)�l��m]�ٖ�I�����T+rj�S�@Ks`φ{������?�ae�K�+�y�<>-|?�RUU�h�z��Ǟ�H7??����-+��$���nX��J�7��ţ�N�&��F�a�x�J�y8��� �Á�K���P�{�V;
���!�
����|�}x9ee�駁��ލ��H�Ώ��c�.o���<��t�@��7�deVl�,?n��襍7e�ol�d`M��7�
�l�~sH�i�h�|h�_g�4��s�����xC�7lْ,��Wo��g/myQ��[>Q�(V���|�zIpAɔ��=J��oD^_�C������[o1�o���>|�D,��'��^O��z�:�s�������~�׀np�c����`�&���v�n�Z�(�@�j�j�2�<��|A?�2�����8��`���$���Z�|�qW����E�������X���R	Ӹ#]]G ��zxϞ�2���ׯ�>�z�����_~D=.߃b�{P.�ի�\�x�\l�z��"�G	y���W$p�<w��\�;���
���q
P�P�D��Wv������8�-�@�hٶ�RR��V��֭[�6Q�_Dz�`)�8̂ ��m�]n�
@GG�6;׭t
��7<�����q7:��?��ض����m�ӆ	�t�\����i��Â��\	��$�mD҆v6�G� ?zz����sgv��ܯ�o�>�l��]X�
�^�S����N��o�����"�_B���\|���&�����.��6_�F��
��b��C@ �C�(���.8/�-Tc��.�B
8��WU�c����p<v�����l�<��ȫ�#wz����ɨ3%�1`��o(3+��F/��`�9�^�*�c��"-�.~Ax�%�j��f!�ѩ���0�(
Ή"��{�e�&p��~Ҝ�h��}b�_�qn�a���O�`�h��G{�=�,���4�
�8����y���fVM}� �yG�ի����F�F����\@	$d1fgѣ�B%��^���L��LQbG�vL	�|n��)Ƭ;�#)g�=�/���uf=6��h�6T3F���\���f�s��1�!�AOT=�E=
��aP��V,$"!f}8\`vJ��6Bgt6D@t&l��3�B($#���Ȉ�Az�px��#�����|A|Pm�+~G:_��@~���vw1
mw�(HMta!���Fg��J �\/�����LJ�1���+W��9�i�&�;dܽ{�����C~�WS���k�g��d���/^�M9^�k�l�3��d�ѿXv�����\�h�'
O�*LN�m�
��қz�aa�]L�ׯ��CzX��A���s�j盇��U�h�=��٣W˫/���;;��2�Bg��]�	����]�����/�1��o��=!�˭��CPU��R�J�UI�2��n�H�	�	H�o������T1p&������1?�`G�'&&N<B���D'�?����})�UT� �o������Ԫ�XCdz��~,7[T����o2��#��j���IC�m5%"�Fl���k B��%6�� ����ͨ����
�n^G>��U�k�s�C@�Kv����8�l! �~��UU�-�d��ث�M��JM�#b��w�.�e�B~kZ�Gߴn{+RSMV3j~=Sk�(#��!,�!M�m�t�d�R,ɛA���'�KO��;C:�M�/zһ=��tϋ��=k=��~~��U!����W�"%
r{�ڽ�B�\�k�\.��r^����+o��������ܵ���,Ri.��;����4��ރ<��d�rZ-�k�\.�@UjUZ�6��� ~%9����#5x�q��j	��꯵GځP`���j�r�;�����GGG�r�����r���3���Ӵ��	�襠��^��~�J��R�ٳg��h��D1J���ߧ�e?(��'6۷,�G�R�b�^X�H)�eA�
��"���wc)�s�RVB}b�Xɋ����~(�O%�/�>h���_�}��e��/�N�f��������i��i��i��h$@�#�O�#���{�Ā4]�[��:'&�p;p��:H�PprB���y���	ǏO\�r��#��A�ɦ�$���3ٍ
�G����G	�`�(P���٪;��H^�P2��w������ۀ'�IoY��1p�{�\p:�/��ߝ[<-W�/ڃ��:zO�����,xス���W
x�Tw}�rpw�`�,O�2yI2��$5[,��$�4'Y���"{�-ҳ�e=¾ZZ�XZZ,
��o�����Z�˖���d�P� lg�~�
�i0��IEND�B`�img/icons-big.png000064400000015340151215013430007676 0ustar00�PNG


IHDR0MR���PLTEJ�ȼ�J�D7r���I%�wSy��]��L��G��a����^�Z'�qq,q�/�m!�S|�+�DDP��O��G��G��N�ː��.�ɗ��~�?�z~���M*(�_H��!��I�H.�R0� s�mmmx����2��R��llliii��rrr0��a$x��aaa{�){�+�Jyyyeeeh�SSS�>�CCy�������G���풹����J��Iv�֙�ջk�������Ӆ����!�����W"��������.}2���
G�����������ĵ����ʮ^���~��3�,��ȯF�Kx��z���f%���ֽQ������܂̔I
������!������Ud������K�O��鋸��CC|�+A�.��qh.�l-q�ooo"�S��t�iii�ݿ���S$������@��:�'vvvaaa8[[[����_�[���|||VVV��u��������o����A�|���T��G�v�Ĉ�հk�����ࠓ����}��x���������{���ɰ�ʝ��si!����kk�mH{�����ۅ�U��q�t����ۭ��B˗��[�!�����뻙��"�=�A)ʳm�]]��S�S ����ݖ⯏�܎�و�e;���豱R��̙�g]�<,��"00����V���}�LL��і��ZZ���+^�p�|\�`[�^ᚚ�ҟ�wE�.m�Ƅ��s&����5$i@tRNS��������t����������i��� ���xtO�s���wo�������}{qk�����ϧ����jIDATx���Ak�`��
6փH:����^��[R�hSJ�P��S%C(�m�k(Qq��d/���C�^���&�'y��8��o�>�Ϟ%��c�w�~QW+��,��B��>-�� ��{t0�P
B	@�W� D� (/n︃e���l�-��i�޿ߣ~����&�L�/=��gS9��|�7Oāl��K�e.(��`�M2�S�f�g*��g��0�&�L*�x@d0���)�$?O���������p�����g��O�	��Mi�r�>�3�E�r������J[�iD@k8�hh�d�0’lVa��2zлQ� �&�~i	��3��r�����Qt�K@O��ޝ��'>���?F�
�	h
��_�30Wx��lk�gPR��i
y	��P,0J@[н�PK@7]~f/Wx����3�@ �<��H?p��q0B��1F
q�8#g�-��`es��`[
�.�A��,\q���BQt�Xe��R�U�-�H7o���!���pĂi͢R��]#(��k�,.0W)���)��+�_?��X3�p�P�E�j�Z�����o��69��rE��g9xl���k�rD�tkZ�o�/��APw�:�1"���7��wh�M޲Dg9k���T�-�K>p�&�E�>p�
غ�4n2l�%(hr�ظG,:�A��5V9�l�|��p`�.-����2�B���yȕ\^��A0�Ֆ8����*�8�a+�M�E8�F�kѲ5�"5j]b�C�7Z���Wtr+��;�u�D-a�"�٦��A��݇��
Bp�� T�
�P*�X��ܴ��Ҫ��z��v;&��8����3��8G���d$��|�K&9�x���O�U�u��!tj�gbtM	���~q~�ύÎ_
�5ft�G~�k��G�8����8�Jz9h�ⷌ��I�@�-���F)Ot�����5LG����~��'ݖV�F��?�#�wdKb`�ºv�5����Pt� ��
� BP�L
��l-�Y�*��e��e+t�'xc��g"�=,���=�����-i�)ߑ�Z����%�!uS��}2��B���P*`AqC*��� x���>��8���P�^m婢���� G
`K�76^�=��ݓx������ю`>����`>��r����K�Q9�|TOE���@,��
"��4��A]���J���#�O��-i�9����“����o�}��s��w_�@���]:؁P
���J��B�AL �A�|e�Y�8�/��CA����
�=H,	�
�"(ZD�ZEz��S'�D9Dp.yӳ�	�������Y��>�����s~&��e�p6�9)��R*����*Y��})$D�PBWp�@�G/��5N �*hDŽ�)%�=P!�1	�E;��|��}R�l�'�c?��7;�X.Pү'�N�D��(�E~��%}��I�L�Y �&.H@�I�,�3 �,�x��`���).
r�J�lԎ�j\c�n\�������x����. ��G�:���ݢ)�	@�_,&|���?R�|���P ���	l��@��y��3؂O��KO���5�G�����D�pu�hŃx����㲦� ��Lt
/o��M x���}��i�Z�`�~�(l+$��\yX+C@��-CB2��Z-8!�``�`�`a�,�I�_g5�e�8xg��Q�Wk9W�b/������m*O�L)���
x���+�M }�lR��d���2
�Xq 
� G
�*�
�{H|)�*B��"�TΧb�Ԩ�
�v6�s6��$r����B���~PU���>0AU{~!C���TI�͵ʽ�d	�d��I�H1���1���{�@2��P���ؽ�ߌ0�qz�q� ���A�@ �� 0�������mpy{8p�8�n`����	�}�'�.Z���]����5;�r�	���m�6���B���x�?�=J�����@�H�^��@Ʒcr�!=����
���|v��#��ʛ}�sƨ
�P^�3�<-5k��v��ɢP���o]B�L���'h.����o=/-�v�PПH�?��������x\ ˔O-�e>�����?�ޔe���B�;��U쥔-�Q��KAB�/���@��D�"�[p�S@�jCmkK��X���,�?=f���c %����1�0 $x��`���R�ƒ���<��(�gc�j"N��0"�x} ��.��p��4P���0��1*\���[r�s	"�Aŀ�1`f�5���wf��-��{�C,��Č;�*-�#8z� ��<����R�Q4�)J6c�d$&�VH�Nf�ԇ�C����c���b�亙ibXN����n�ع��<�kpH���z����w�ժ��2�#��r?���3�6��ݕ���u�����v�XEB��M
���f

�B�V~@`J�����͐���$�ivu��*��`N剟̪ȥ��A�&�+��dG�8`�\ڕ�N&
�[-�����@�|E�����ȅ�:�d��C�u�P����#��F�(�����9�
Y_xQv�KrQ��BMcί��׀E��q4�
�G#�����`�C@~^B���@�)u4@3�LO���$�E��\ڋ�N��n&�
��*	�[������I�vs�u�ԝ〟�<��tK�-�
"%�Y���:�r�	C�L$�X*�=��4�3�4�X|{&Q"Z�F#����`d02�F#����`d��P`d02�F#����`dt�F#SG[�02�F#���}C����`d02�F#����v �식3�m���m5�J�K�OF��V[���q!Ch�#9�Ґ��…�ī��=�F��adFv�
F��adF��ad�ld�#c���G�>2��)7�vT�і�=9��5�1��<�y€yTS
�t�|(�t0Ϙ<�N
��	��Vz���C�>E�f��̓g��
_�F�� ��MA��;p�Pm��g�����g^��z
��o	�a�Y�KZ�Co�?
N�Н�4�A�	[|�EkϹ���P�1��ן�����	�=`dF��ad	�z�LF��`d&@�02�#��.|�s��M�aǕ�pD��"*��/st��#5�!(5���N�TH7�@�d0��{B����t��&C��{���rw��i�wh�w���m���G6�s�h�����;�د�;$�A(����PP
@!>{�X�:�a�N(��9��]l�"\�ϗ�9���s�{%O"�IB02'phk˷%
v����$�}*������`�f6����egd�֡�"�S���NXȆ���
�Z�I�6�i��7��2�e%p�� ��S$�=st��^,B�y;-g�A>%h2>e>p�3���;x��$�Ǖ�P{�@(�ߣ����<����A��l��Ԁ�J�2=��0i�3�o^�9mJ�y���J����yO�
g�*���-x�PX�o��A�3Cxf(�<P^�����ER0#n����܉�l����>�8ek̀�r��_L�~1y��(|��@4�P��U��^{��Pt�3�d���y �ar&�at��L�~q�)ͭ�.`��_�n8?s,�\A�1$�@A(� ��PP

@!4[�$@��>�Ԙ�|ш7�r ��Z��$
榵-V�*���k��I�4�1S�
S���7X��C�1o��r�oiH��m"0
Htm��tt]7�b��A��M~��t3�(ƅ a�02T�3T���޿�&L��I��6E��?߭F��4f��hQ�"@_f0T��Q��1aMh8�.��u�d���|`�}ɀ��,XBA(� ����+�
�p�C!��$@�Ӡ��2������dn����Ԫk[�Q�Uv���k6$�ZoW�
/��mMm����u���c8?�鬒z�e=��ƪ�:��g8`l�j����A5OG�`k0��P��Y��v��M(���pH�Cg���t�g�pZk�f�,q�|k�o�Q�<�>��E���0^Q�2Ya�J�;���Mx��(̱3*,� ��� H���g(�/����Q����X��ؓˏ��y LwY����,|���I71�8�g���zE]���o��
�KMݫ&E�|�}��TuH�)���:�C���L�n���8�H��n!��n��M���\(��&����y��@S��߽��is�hS�����$݂ET�����"H��)!"z�R
@QSHHx[�p�@�"�D��j��ZG6�'��`j״]�/.�"{�OS�+��x��$�,������Q:���t���mcF2���Geg�Z�>��u����*�Dׅ�6��|�=��P���J�:@	6Pm��%8c���s�-��ܳ++sW5�Ś���;����1+r����;��a��(��	�/�����/eS�4̐�%�gt4��S>pPl{����=􊋇)8�����0�[��tN����Av���ZJ��KǨ
�`�{��	t!x�ɠ+i�	4h�0
��J��/��ӇqZ����C��E߿E!ui��#�k_�y��P�/���g ;��oͼv��)A��%
 d���� �I0�� �U�}A�F���Fp�D�Icl4�S�&Wl
\%p����`��ށ��������`|�X�Q7��A��z�����o�o���>u=}NG}O��/��J����/��E�3Y2���DX
��h��Rpa� B�I(p7\�4�.D<��c�4�(��9E�*�A� YPZ�F��X��p�4;��ՊhJRf�� �{H9L���-��ۗ���H'�[��'l�A���(��^��'`���?�u�u� <�\
���ԁ�I �i7����t�a�Y����	��`�XD������R��4�'`���Nڜ��ݤ-`=��]��	t$�\kWJ۴�s�ۮ(����/��;��N^����جgoI-���?G1I���T�E����d��
X!Y@��`���^5CP)kѮB�
�� J �^L�E.=�ФM��<��h9.��$�
���/^�gu��K��8�)$I45����bg��Ă�8<�4�upOH���aR�Tā�>�c<�YU@���vi��kf8ǽ�l�bx������YYތ_�*�Tݨw����mt̝þ���g#�(8��P�	�@�����(��0������P�F (E�(K�@�`�,{@;|g\Y#��h�f��`��WY�'�u�1o?�/����N����d��z�7e��Y�"@�����A
ә��29@��O�Ɓ���heoπ��L0������m��`�o�)��tm���[Ft��m��)����E�
��Kml��IEND�B`�img/edit_ckeditor.png000064400000001331151215013430010630 0ustar00�PNG


IHDR�a�IDATx�u��,G@�`�m۶�bl���R��S�m۶�l.����t�����v���/�f������R��P3b4ʫ��=���p���מ���tV��[gL���8ZA��DW^!�ƸY�L��F#eE+jeI��]�o�/��ŵSffT�ճ!s��b�a�9�VY%�"��#���Ɖ廙&�lL)�m�NRK8p���S��O�ج���%���ѷӑ]XLX#25�d���j���R�\q�%
Qȕ���6 �7�
/�M�*�LԨ���j%F�읏Y�_�~=ɍ�L����1n�N��B1�6�Y����|���Lb��g���6k�eI�*�.A\��g�w�r/��Ve]/�����p9b�^��û��k���
�8p��LN����?�l�Y9�����+N7�㍞N���@Ӳzo��:%�7�՘m��v�W�c��
�s�P����0HE1���_��;Z㰵�\��'n�c5C���]����&[�s��_�[�����y�����qo�d#IW8����	�q�R?;��Yᡯƙ���I�:x,Op�`�p��S��犷Ȣ�N�.M^�k�G��3��ψRc�D����o���j�S��t����W�JA�{+��>���A�n��IEND�B`�img/black-close.png000064400000002072151215013430010201 0ustar00�PNG


IHDR
	��tEXtSoftwareAdobe ImageReadyq�e<%iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 6.0-c002 79.164460, 2020/05/12-16:04:17        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop 21.2 (Macintosh)" xmpMM:InstanceID="xmp.iid:527720DA467011EB9138DD03EEC09B46" xmpMM:DocumentID="xmp.did:527720DB467011EB9138DD03EEC09B46"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:527720D8467011EB9138DD03EEC09B46" stRef:documentID="xmp.did:527720D9467011EB9138DD03EEC09B46"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>��B��IDATx�l�?AQ���vv�	Mg�k��b6�f��xǻ���� %���
bT�����S�����'�c�X��*c��dz��D(+�C\-�	5��C�4V�0���t�P�y$~�[��:.x����w�`�̿�MtГ�G��.r�KM��v,a��|���#��� ��FMIEND�B`�img/arrows-normal.png000064400000000251151215013430010622 0ustar00�PNG


IHDR"�H�LpIDATx���!���"t����|��c� ���N��!el�W/F��@�1"-#���V~���h�k=4�Z���""�D�ɲ��׌��l����o�6D���m���SDALIEND�B`�img/volume_icon_trash.svg000064400000016226151215013430011563 0ustar00<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="175" height="200" viewBox="0 0 46 53" version="1"><defs><linearGradient gradientTransform="translate(643 -1191) scale(4.95289)" gradientUnits="userSpaceOnUse" y2="357" x2="482" y1="357" x1="413" id="j" xlink:href="#a"/><linearGradient id="a"><stop offset="0" stop-color="#60a016"/><stop offset="0" stop-color="#98e90d"/><stop offset="0" stop-color="#64a616"/><stop offset="1" stop-color="#99ea0c"/><stop offset="1" stop-color="#61a017"/></linearGradient><radialGradient gradientUnits="userSpaceOnUse" gradientTransform="matrix(4.9529 0 0 .83705 643 267)" r="34" fy="354" fx="448" cy="354" cx="448" id="k" xlink:href="#b"/><linearGradient id="b"><stop offset="0" stop-color="#aff637"/><stop offset="1" stop-color="#5f9f16"/></linearGradient><linearGradient gradientTransform="translate(-46 -1244) scale(4.95289)" gradientUnits="userSpaceOnUse" y2="336" x2="580" y1="288" x1="580" id="l" xlink:href="#c"/><linearGradient id="c"><stop offset="0" stop-color="#a4bcc3"/><stop offset="1" stop-color="#b9d1da" stop-opacity="0"/></linearGradient><linearGradient gradientTransform="matrix(4.9529 0 0 4.84448 -46 -1201)" gradientUnits="userSpaceOnUse" y2="284" x2="631" y1="284" x1="543" id="m" xlink:href="#d"/><linearGradient id="d"><stop offset="0" stop-color="#9beb0a"/><stop offset="0" stop-color="#90e612"/><stop offset="0" stop-color="#6fbb16"/><stop offset="1" stop-color="#8ee518"/><stop offset="1" stop-color="#89e31f"/></linearGradient><linearGradient gradientTransform="matrix(3.07055 0 0 3.13001 2739 257)" y2="141" x2="86" y1="7" x1="23" gradientUnits="userSpaceOnUse" id="n" xlink:href="#e"/><linearGradient id="e"><stop offset="0" stop-color="#6eb314"/><stop offset="1" stop-color="#97e70d" stop-opacity="0"/></linearGradient><linearGradient gradientTransform="translate(464 39)" gradientUnits="userSpaceOnUse" y2="361" x2="567" y1="275" x1="560" id="o" xlink:href="#f"/><linearGradient id="f"><stop offset="0" stop-color="#fff"/><stop offset="1" stop-color="#fff" stop-opacity="0"/></linearGradient><filter height="1" y="0" width="1" x="0" id="p" color-interpolation-filters="sRGB"><feGaussianBlur/></filter><linearGradient gradientTransform="translate(471 39)" gradientUnits="userSpaceOnUse" y2="362" x2="608" y1="275" x1="618" id="q" xlink:href="#f"/><filter height="1" y="0" width="1" x="0" id="r" color-interpolation-filters="sRGB"><feGaussianBlur/></filter><linearGradient y2="357" x2="482" y1="357" x1="413" gradientTransform="matrix(6.30935 0 0 6.17125 37 -2027)" gradientUnits="userSpaceOnUse" id="s" xlink:href="#a"/><linearGradient y2="361" x2="567" y1="275" x1="560" gradientTransform="translate(-76 -1276) scale(4.95289)" gradientUnits="userSpaceOnUse" id="t" xlink:href="#f"/><linearGradient y2="835" x2="2087" y1="1161" x1="2121" gradientTransform="matrix(.33568 0 0 .28176 2133 -120)" gradientUnits="userSpaceOnUse" id="u" xlink:href="#g"/><linearGradient id="g"><stop offset="0" stop-color="#fff"/><stop offset="1" stop-color="#89d30e"/></linearGradient><linearGradient y2="362" x2="608" y1="275" x1="618" gradientTransform="translate(-24 -1270) scale(4.95289)" gradientUnits="userSpaceOnUse" id="v" xlink:href="#f"/><linearGradient gradientTransform="matrix(4.9529 0 0 4.84448 -46 -1201)" gradientUnits="userSpaceOnUse" y2="281" x2="629" y1="281" x1="545" id="w" xlink:href="#h"/><linearGradient id="h"><stop offset="0" stop-color="#5f9d16"/><stop offset="0" stop-color="#8fdd0f"/><stop offset="1" stop-color="#65a816"/><stop offset="1" stop-color="#88d40f"/><stop offset="1" stop-color="#5f9d16"/></linearGradient><linearGradient gradientTransform="matrix(1.2687 0 0 1.12163 2134 -136)" gradientUnits="userSpaceOnUse" y2="237" x2="557" y1="374" x1="571" id="x" xlink:href="#i"/><linearGradient id="i"><stop offset="0"/><stop offset="1" stop-opacity="0"/></linearGradient><filter height="1" y="0" width="1" x="0" id="y" color-interpolation-filters="sRGB"><feGaussianBlur stdDeviation="3"/></filter></defs><g transform="matrix(.10238 0 0 .10238 -32 8.8)"><path d="M540 339a171 30 0 0 0-172 30 171 30 0 0 0 0 1l4 21v2h1a167 30 0 0 0 167 28 167 30 0 0 0 167-29l4-23a171 30 0 0 0-171-30z" fill="url(#j)"/><ellipse cx="540" cy="369" rx="171" ry="30" fill="#599714"/><ellipse ry="28" rx="166" cy="368" cx="540" fill="url(#k)"/><path d="M746-28H335l38 398c0 2 2 3 4 5l10 5c8 4 21 7 36 9a764 764 0 0 0 271-9l10-5 3-4z" fill="url(#l)"/><path d="M539-72a218 38 0 0 0-218 37 218 38 0 0 0 0 1l5 26a213 38 0 0 0 0 1l1 1a213 38 0 0 0 212 36A213 38 0 0 0 752-6h1l5-29a218 38 0 0 0-219-37z" fill="url(#m)"/><path d="M580 67h-68c14 4 23 15 31 29l21 39-16 10h56l30-49-18 9-12-23c-4-8-15-16-24-15zm-76 2c-5 0-10 2-15 6l-28 44 53 31 28-46c-8-17-23-35-38-35zm136 77l-52 32 25 48c25 1 57-8 51-33zm-162 1h-58l17 13-16 30c-7 14 6 27 14 32 9 4 22 5 34 4l21-35 17 9zm98 65l-28 50 28 50v-20h26c9 1 21-5 25-14l33-61c-11 11-25 13-41 13h-42zm-153 4l35 65c7 9 20 11 34 11h38v-62h-71c-11 1-25-2-36-14z" fill="url(#n)" fill-rule="evenodd"/><path transform="translate(-2366 -1440) scale(4.95289)" d="M553 292l7 71h9l-8-70z" fill="url(#o)" filter="url(#p)"/><path transform="translate(-2366 -1440) scale(4.95289)" d="M622 292l-7 71h-9l7-70z" fill="url(#q)" filter="url(#r)"/><path d="M321-35a218 38 0 0 0 0 1l5 26a213 38 0 0 0 0 1l1 1a213 38 0 0 0 212 36A213 38 0 0 0 752-6h1l4-24A219 37 0 0 1 541 1a219 37 0 0 1-220-36z" fill="url(#s)"/><path d="M363-14l3 28a213 38 0 0 0 44 8l-3-29a219 37 0 0 1-44-7z" fill="url(#t)" filter="url(#p)"/><path d="M321-35a218 38 0 0 0 0 1l1 4c3 5 11 9 22 13 12 3 27 7 43 9a1064 1064 0 0 0 345-7c11-4 19-7 24-11l1-4A219 37 0 0 1 541 1a219 37 0 0 1-220-36z" style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;shape-padding:0;isolation:auto;mix-blend-mode:normal" font-weight="400" overflow="visible" color="#000" font-family="sans-serif" white-space="normal" fill="url(#u)" enable-background="accumulate"/><path d="M725-16a219 37 0 0 1-44 8l-3 29a213 38 0 0 0 44-9z" fill="url(#v)" filter="url(#r)"/><ellipse cx="541" cy="-37" rx="209" ry="31" fill="url(#w)"/><path d="M321-35a218 38 0 0 0 0 1l1 1a223 37 0 0 0 1 1 219 37 0 0 1-2-3zM751-3a217 38 0 0 1-212 29A217 38 0 0 1 328-3a213 38 0 0 0 211 33A213 38 0 0 0 751-3z" fill="#5f9d16"/><ellipse ry="31" rx="209" cy="-36" cx="542" fill="url(#x)"/><path d="M541-68a209 31 0 0 0-209 31 209 31 0 0 0 0 1 209 31 0 0 1 209-30 209 31 0 0 1 209 30 209 31 0 0 0 0-1 209 31 0 0 0-209-31z" fill="#609f16"/><path d="M721-21a209 31 0 0 1-46 8l6 5a219 37 0 0 0 43-8zm-349 2l-8 5 44 7 9-5c-17-2-33-4-45-7z" fill="#fff"/><g fill="#fff"><path d="M728 0l-4-13-13 3 12-4-2-14 4 13 13-3-13 4z"/><path d="M733-7l-9-6-7 8 7-9-8-7 8 6 7-7-6 8z"/><path d="M730-4l-6-9-9 5 9-6-5-9 5 8 10-4-9 5z"/><path d="M722-3l2-10-10-3 10 2 2-11-1 11 10 2-10-1z"/></g><path d="M720-28l2 9-3-4 3 6-6-4 6 6-8-1v1l7 1-11 4h1l9-2-5 4 6-3-4 5 1 1 5-6-1 8h1l2-8 3 11h1l-3-9 4 5-3-7 6 5v-1l-6-6 8 2v-1l-7-2 10-3v-1l-9 2 5-3v-1l-7 4 5-6h-1l-5 6 1-9h-1l-2 8-3-11z" fill="#fff" filter="url(#y)"/></g></svg>img/spinner-mini-bk.gif000064400000003471151215013430011011 0ustar00GIF89a����������FFFzzzXXX$$$���������666hhh!�NETSCAPE2.0!�Created with ajaxload.info!�	
,w  	!�DB�A��H���¬��a��D���@ ^�A�X��P�@�"U���Q#	��B�\;���1�o�:2$v@
$|,3

�_#
d�53�"s5e!!�	
,v  i@e9�DA�A�����/�`ph$�Ca%@ ���pH���x�F��uS��x#�
�.�݄�Yf�L_"
p
3B�W��]|L
\6�{|z�8�7[7!!�	
,x  �e9�DE"������2r,��qP���j��`�8��@8bH, *��0-�
�mFW��9�LP�E3+
(�B"
f�{�*BW_/�
@_$��~Kr�7Ar7!!�	
,v  �4e9��!H�"�*��Q�/@���-�4�ép4�R+��-��p�ȧ`�P(�6�᠝�U/� 	*,�)(+/]"lO�/�*Ak���K���]A~66�6!!�	
,l  ie9�"���*���-�80H���=N;���T�E�����q��e��UoK2_WZ�݌V��1jgWe@tuH//w`?��f~#���6��#!!�	
,~  �,e9��"���*
�;pR�%��#0��`� �'�c�(��J@@���/1�i4��`�V��B�V
u}�"caNi/]))�-Lel	mi}
me[+!!�	
,y  Ie9��"M�6�*¨"7E͖��@G((L&�pqj@Z����� ��%@�w�Z) �pl(
���ԭ�q�u*R&c	`))(s_J��>_\'Gm7�$+!!�	
,w  Ie9�*,� (�*�(�B5[1� �Z��Iah!G��exz��J0�e�6��@V|U��4��Dm��%$͛�p
	\Gx		
}@+|=+
1�-	Ea5l)+!!�	
,y  )�䨞'A�K����ڍ,�����E\(l���&;5 ��5D���0��3�a�0-���-�����ÃpH4V	%
i
p[R"|	��#
�	6iZwcw*!!�	
,y  )�䨞,K�*�����0�a�;׋аY8�b`4�n�¨Bb�b�x�,������������(	Ƚ� %
>

2*�i*	/:�+$v*!!�	
,u  )�䨞l[�$�
�Jq[��q3�`Q[�5��:���IX!0�rAD8Cv����HPfi��iQ���AP@pC
%D
PQ46�
iciNj0w
�)#!!�	
,y  )��.q��
,G�Jr(�J�8�C��*���B�,����&<
�����h�W~-��`�,	����,�>;

8RN<,�<1T]
�c��'
qk$
@)#!;img/volume_icon_box.png000064400000001155151215013430011212 0ustar00�PNG


IHDR�a4IDATxb`
e�Y?W2�R�h�����b9�ٷ�&fI� �O8۶m۶m۶�l۶m���;yS��{���V�7�PD4A�ЀB��!�B�W^yX�.�ކwи��s��[@��C�ӑX;��c��u0��Ũ{�\@�q��Ij��>���kh�:�SD6�K6�#��5�;~���Pk�V]��5�X���E`v@�T3-��ˮ�Q"��(o�f�F���ȁ�DrӼ0��v=��K}���;'�V4�����J��c�ٿXu���b��,���a�Kԋd��"S2�r�	�b���	�Tki����92���j�2���~`�;�"<@(W���#����6^�j�0M:��QG���V��D}�>�����
����eMb��1��+��1�}�p\�鏁�~b�5:%4J����
�6���Kf����ݯ\�]�Dlj�V)�1@a���h�r��M���e*
_��c�e���ږ6��i)Qʫ��Ե��)�s��G 8oݽ�e�������7����@�w2������pe�IEND�B`�img/volume_icon_ftp.svg000064400000026101151215013430011224 0ustar00<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 48 48" overflow="visible"><path d="M36.66 41.52h-8.89a1.55 1.52 0 0 0-.75-.65v-8.8h-5.05v8.81a1.55 1.52 0 0 0-.75.64h-8.9v4.94h8.74a1.55 1.52 0 0 0 1.49 1.14h3.88c.72 0 1.32-.49 1.5-1.14h8.72v-4.94z" opacity=".2" stroke-width="1.02"/><path d="M36.47 41.34h-8.9a1.55 1.52 0 0 0-.75-.65v-8.81h-5.04v8.81a1.55 1.52 0 0 0-.76.65h-8.9v4.93h8.74a1.55 1.52 0 0 0 1.5 1.15h3.88c.72 0 1.32-.5 1.5-1.15h8.73z" opacity=".2" stroke-width="1.02"/><path d="M36.27 41.15h-8.9a1.55 1.52 0 0 0-.75-.65v-8.8H21.6v8.8a1.55 1.52 0 0 0-.77.65h-8.88v4.93h8.73a1.55 1.52 0 0 0 1.5 1.14h3.87c.73 0 1.34-.48 1.5-1.14h8.73z" opacity=".2" stroke-width="1.02"/><path d="M35.38 40.95H11.74v4.95H36.1v-4.95z" fill="#616161" stroke-width="1.02"/><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="23.72" y1="41.11" x2="23.72" y2="44.64" gradientTransform="matrix(1.0339 0 0 1.01271 -.61 0)"><stop offset="0" stop-color="#cecedb"/><stop offset=".19" stop-color="#fff"/><stop offset=".48" stop-color="#cecedb"/><stop offset=".75" stop-color="#b3b3c6"/><stop offset=".99" stop-color="#828282"/></linearGradient><path d="M12.44 41.63h22.95v3.58H12.44z" fill="url(#a)" stroke-width="1.02"/><path d="M21.4 31.88v12.64h5.04V31.5h-5.05z" fill="#616161" stroke-width="1.02"/><linearGradient id="b" gradientUnits="userSpaceOnUse" x1="291.57" y1="864.85" x2="291.57" y2="868.38" gradientTransform="matrix(0 -1.01271 1.0339 0 -872.08 333.28)"><stop offset="0" stop-color="#cecedb"/><stop offset=".19" stop-color="#fff"/><stop offset=".48" stop-color="#cecedb"/><stop offset=".75" stop-color="#b3b3c6"/><stop offset=".99" stop-color="#828282"/></linearGradient><path d="M22.08 31.88h3.65v12.26h-3.65z" fill="url(#b)" stroke-width="1.02"/><linearGradient id="c" gradientUnits="userSpaceOnUse" x1="23.72" y1="46.44" x2="23.72" y2="39.69" gradientTransform="matrix(1.0339 0 0 1.01271 -.61 0)"><stop offset="0" stop-color="#cf0000"/><stop offset=".99" stop-color="#ff6d00"/></linearGradient><path d="M27.4 45.51c0 .84-.7 1.52-1.54 1.52h-3.89a1.55 1.52 0 0 1-1.55-1.52v-3.79c0-.84.7-1.52 1.55-1.52h3.88c.86 0 1.55.68 1.55 1.52v3.8z" fill="url(#c)" stroke-width="1.02"/><linearGradient id="d" gradientUnits="userSpaceOnUse" x1="23.72" y1="37.07" x2="23.72" y2="49.63" gradientTransform="matrix(1.0339 0 0 1.01271 -.61 0)"><stop offset="0" stop-color="#fff030"/><stop offset=".99" stop-color="#ffae00"/></linearGradient><path d="M21.97 40.95a.78.76 0 0 0-.78.76v3.8c0 .43.36.76.78.76h3.88c.43 0 .77-.33.77-.76v-3.79a.78.76 0 0 0-.77-.76h-3.88z" fill="url(#d)" stroke-width="1.02"/><linearGradient id="e" gradientUnits="userSpaceOnUse" x1="23.72" y1="41" x2="23.72" y2="43.82" gradientTransform="matrix(1.0339 0 0 1.01271 -.61 0)"><stop offset="0" stop-color="#fff"/><stop offset=".5" stop-color="#ffe3a9"/><stop offset=".99" stop-color="#ffc957"/></linearGradient><path d="M21.97 41.52c-.1 0-.19.1-.19.2v3.8c0 .1.09.18.19.18h3.88c.1 0 .2-.08.2-.19v-3.79c0-.1-.1-.19-.2-.19h-3.88z" fill="url(#e)" stroke-width="1.02"/><path d="M25.5 1.3L11.94 10l-.04.02-.05.04-.04.03-.18.2-.02.04-.04.08-.02.04-.03.1-.02.03-.02.08v.05l-.02.1v23.13c0 .44.3.84.72.98l10.1 3.3c.33.1.7.05.97-.15l13.46-9.9c.27-.2.43-.5.43-.83V4.15l-.01-.06v-.04l-.02-.03-.02-.08-.02-.06-.05-.07-.03-.06-.04-.07-.04-.05-.04-.06-.02-.02-.03-.04-.05-.04-.07-.05-.06-.03-.07-.05-.07-.03-.07-.02a7.24 7.09 0 0 0-.08-.03h-.05l-10-2.12c-.28-.06-.57 0-.8.16zm-14.02 9.36" opacity=".2" stroke-width="1.02"/><path d="M36.75 4.25V4.13l-.02-.02a.9.88 0 0 0-.05-.13l-.02-.04-.03-.04-.02-.05-.03-.03-.03-.03-.04-.03-.03-.03a.86.84 0 0 0-.05-.03l-.04-.02-.04-.02-.05-.02-.05-.01-.03-.01-10-2.11a.68.67 0 0 0-.52.1L12.16 10.3h-.01l-.02.02-.03.02-.02.02a.73.72 0 0 0-.12.13l-.02.02c0 .02-.02.04-.03.05v.03l-.03.05v.03l-.02.06v.04l-.01.06v23.1c0 .28.18.53.46.62l10.1 3.3c.2.07.44.04.61-.1l13.47-9.89a.68.67 0 0 0 .26-.53V4.25z" opacity=".2" stroke-width="1.02"/><path d="M25.3 1.1L11.76 9.8l-.06.02-.05.04-.03.03-.19.2-.02.05-.04.08-.02.04-.03.09v.04l-.04.1v.04l-.01.1v23.11c0 .45.29.84.72 1l10.1 3.29c.32.1.7.05.98-.15l13.46-9.9c.26-.2.41-.5.41-.83V3.85l-.03-.03-.02-.08-.02-.06-.03-.07-.03-.07-.06-.06-.04-.06-.04-.05-.05-.05-.05-.05-.06-.04-.07-.04-.07-.04-.06-.03-.07-.03a7.24 7.09 0 0 0-.08-.02l-.06-.02-10-2.1c-.27-.05-.56 0-.8.15zm-14.01 9.38" opacity=".2" stroke-width="1.02"/><path d="M36.56 4.05v-.04l-.01-.05v-.01l-.01-.02-.01-.05-.02-.04a.35.34 0 0 0-.02-.04l-.02-.04-.04-.04-.02-.04-.03-.03-.03-.03-.04-.04-.03-.03a.86.84 0 0 0-.12-.07l-.05-.02h-.05l-.03-.02-10-2.1a.68.67 0 0 0-.52.1l-13.55 8.69-.03.02-.03.02-.02.02a.73.72 0 0 0-.11.13l-.03.02-.02.05-.02.03-.02.05v.03l-.02.06V33.75c0 .29.18.54.46.63l10.09 3.3c.2.06.44.03.62-.1l13.46-9.9a.68.67 0 0 0 .27-.52V4.06z" opacity=".2" stroke-width="1.02"/><linearGradient id="f" gradientUnits="userSpaceOnUse" x1="32.27" y1="26.92" x2="14.03" y2="8.67" gradientTransform="matrix(1.0339 0 0 1.01271 -.61 0)"><stop offset="0" stop-color="#585868"/><stop offset="1" stop-color="#494949"/></linearGradient><path d="M25.1.78l-13.54 8.7-.05.03-.05.04-.04.03-.17.2-.03.04-.04.08-.02.04-.04.09v.04l-.03.1v.04l-.02.1v23.12c0 .45.3.84.73.98l10.1 3.3c.33.1.69.05.97-.15l13.46-9.9c.27-.2.42-.5.42-.82V3.64l-.02-.08V3.5l-.04-.07-.02-.06a14.7 14.4 0 0 0-.06-.13l-.04-.07-.04-.05-.04-.05-.02-.02-.05-.04-.05-.04-.06-.05-.06-.04-.07-.04-.07-.03-.07-.04-.07-.02h-.06L25.9.63c-.28-.06-.57 0-.8.14zm-14 9.38" fill="url(#f)" stroke-width="1.02"/><linearGradient id="g" gradientUnits="userSpaceOnUse" x1="15.17" y1="9.81" x2="33.41" y2="28.05" gradientTransform="matrix(1.0339 0 0 1.01271 -.61 0)"><stop offset="0" stop-color="#7d7d99"/><stop offset="1" stop-color="#494949"/></linearGradient><path d="M36.36 3.75V3.6l-.03-.06-.02-.04a.35.34 0 0 0-.02-.05l-.02-.03-.02-.04-.03-.04-.03-.03c0-.02-.02-.03-.03-.04a1.13 1.1 0 0 0-.04-.03l-.04-.02-.04-.03-.04-.02-.04-.02-.04-.02-.05-.01-.04-.01-10-2.1a.68.67 0 0 0-.52.08L11.77 9.8h-.01l-.03.01-.03.03-.02.02a.73.72 0 0 0-.11.14l-.01.02-.03.05-.02.03-.01.05-.01.03-.02.05v23.19c0 .3.17.55.45.64l10.1 3.29c.2.07.44.03.61-.1l13.46-9.89a.68.67 0 0 0 .27-.52z" fill="url(#g)" stroke-width="1.02"/><radialGradient id="h" cx="105.2" cy="47.28" r="139.09" fx="105.2" fy="47.28" gradientTransform="matrix(.19386 0 0 .18988 19.55 19.75)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#fff"/><stop offset=".28" stop-color="#cecedb"/><stop offset=".64" stop-color="#bdbdcf"/><stop offset="1" stop-color="#9a9ab1"/></radialGradient><path d="M12.14 10.35l10.09 3.3 13.46-9.9v23.09l-13.46 9.88-10.1-3.29z" fill="url(#h)" stroke-width="1.02"/><linearGradient id="i" gradientUnits="userSpaceOnUse" x1="23.72" y1="13.22" x2="23.72" y2="3.36" gradientTransform="matrix(1.0339 0 0 1.01271 -.61 0)"><stop offset="0" stop-color="#cecedb"/><stop offset="1" stop-color="#eee"/></linearGradient><path d="M25.7 1.66l-13.56 8.69 10.09 3.3 13.46-9.9z" fill="url(#i)" stroke-width="1.02"/><linearGradient id="j" gradientUnits="userSpaceOnUse" x1="15.04" y1="16.69" x2="22.17" y2="38.24" gradientTransform="matrix(1.0339 0 0 1.01271 -.61 0)"><stop offset="0" stop-color="#fff"/><stop offset="1" stop-color="#cecedb"/></linearGradient><path d="M12.14 33.42l10.09 3.3V13.65l-10.1-3.3z" fill="url(#j)" stroke-width="1.02"/><linearGradient id="k" gradientUnits="userSpaceOnUse" x1="16.64" y1="35.2" x2="17.78" y2="28.48" gradientTransform="matrix(1.0339 0 0 1.01271 -.61 0)"><stop offset="0" stop-color="#fff"/><stop offset="1" stop-color="#bdbdcf"/></linearGradient><path d="M12.14 27.75v5.67l10.09 3.3V30.9z" fill="url(#k)" stroke-width="1.02"/><linearGradient id="l" gradientUnits="userSpaceOnUse" x1="13.81" y1="16.36" x2="20.09" y2="16.36" gradientTransform="matrix(1.0339 0 0 1.01271 -.61 0)"><stop offset="0" stop-color="#7d7d99"/><stop offset="1" stop-color="#cecedb"/></linearGradient><path d="M13.66 16.37l6.51 2.12v-1.73l-6.51-2.13z" fill="url(#l)" stroke-width="1.02"/><linearGradient id="m" gradientUnits="userSpaceOnUse" x1="13.81" y1="18.78" x2="20.09" y2="18.78" gradientTransform="matrix(1.0339 0 0 1.01271 -.61 0)"><stop offset="0" stop-color="#7d7d99"/><stop offset="1" stop-color="#cecedb"/></linearGradient><path d="M13.66 18.84l6.51 2.11v-1.74l-6.51-2.13z" fill="url(#m)" stroke-width="1.02"/><linearGradient id="n" gradientUnits="userSpaceOnUse" x1="14.63" y1="18.9" x2="18.67" y2="22.93" gradientTransform="matrix(1.0339 0 0 1.01271 -.61 0)"><stop offset="0" stop-color="#7d7d99"/><stop offset="1" stop-color="#cecedb"/></linearGradient><path d="M13.66 21.29l6.51 2.12v-1.74l-6.51-2.12z" fill="url(#n)" stroke-width="1.02"/><linearGradient id="o" gradientUnits="userSpaceOnUse" x1="271.32" y1="478.92" x2="271.32" y2="477.59" gradientTransform="matrix(.99864 .26209 0 1.04846 -250.87 -537.8)"><stop offset=".01" stop-color="#fff"/><stop offset="1" stop-color="#b6b6b6"/></linearGradient><path d="M19.84 33.83c-.48-.12-.84.1-.84.51 0 .4.36.81.83.94l.5.13c.47.13.83-.1.83-.5s-.36-.81-.82-.94z" fill="url(#o)" stroke-width="1.02"/><linearGradient id="p" gradientUnits="userSpaceOnUse" x1="271.32" y1="478.86" x2="271.32" y2="477.72" gradientTransform="matrix(.99864 .26209 0 1.04846 -250.87 -537.8)"><stop offset=".01" stop-color="#b6b6b6"/><stop offset=".37" stop-color="#9d9d9d"/><stop offset=".74" stop-color="#898989"/><stop offset="1" stop-color="#828282"/></linearGradient><path d="M19.84 34.03c-.36-.1-.65.07-.65.36 0 .3.29.6.65.7l.5.13c.35.1.65-.07.65-.36 0-.3-.3-.61-.65-.7z" fill="url(#p)" stroke-width="1.02"/><linearGradient id="q" gradientUnits="userSpaceOnUse" x1="-890.74" y1="529.26" x2="-890.74" y2="528.08" gradientTransform="matrix(-.99864 -.26209 0 .78637 -869.45 -614.56)"><stop offset=".01" stop-color="#9f6"/><stop offset=".24" stop-color="#68de56"/><stop offset=".48" stop-color="#3bc147"/><stop offset=".7" stop-color="#1bab3c"/><stop offset=".88" stop-color="#079e35"/><stop offset="1" stop-color="#093"/></linearGradient><path d="M20.93 34.84c0 .26-.27.4-.6.31l-.49-.13c-.33-.08-.59-.35-.59-.6 0-.27.26-.41.59-.32l.5.12c.32.1.59.36.59.63z" fill="url(#q)" stroke-width="1.02"/><linearGradient id="r" gradientUnits="userSpaceOnUse" x1="271.31" y1="478.52" x2="271.34" y2="477.65" gradientTransform="matrix(.99864 .26209 0 1.04846 -250.87 -537.8)"><stop offset=".01" stop-color="#3c3"/><stop offset=".36" stop-color="#1bb433"/><stop offset=".74" stop-color="#07a033"/><stop offset="1" stop-color="#093"/></linearGradient><path d="M19.84 34.23c-.26-.07-.48.03-.48.22 0 .2.22.4.48.48l.5.13c.24.06.46-.04.46-.23 0-.2-.2-.4-.46-.48l-.5-.13z" fill="url(#r)" stroke-width="1.02"/><linearGradient id="s" gradientUnits="userSpaceOnUse" x1="271.32" y1="477.78" x2="271.32" y2="478.35" gradientTransform="matrix(.99864 .26209 0 1.04846 -250.87 -537.8)"><stop offset="0" stop-color="#fff"/><stop offset=".09" stop-color="#e8f7d6"/><stop offset=".23" stop-color="#c8ed9e"/><stop offset=".36" stop-color="#ade46d"/><stop offset=".5" stop-color="#97dc46"/><stop offset=".63" stop-color="#85d627"/><stop offset=".76" stop-color="#79d212"/><stop offset=".89" stop-color="#72d004"/><stop offset="1" stop-color="#6fcf00"/></linearGradient><path d="M19.82 34.14c-.2-.05-.37.04-.37.15 0 .11.16.3.37.35l.54.15c.2.05.36-.04.36-.16 0-.1-.16-.3-.36-.35z" fill="url(#s)" stroke-width="1.02"/><path d="M-.61 48.61V0h49.63v48.61" fill="none" stroke-width="1.02"/></svg>img/edit_creativecloud.png000064400000001223151215013430011655 0ustar00�PNG


IHDR��h6ZIDATx�e�Э9����oֶۖ4��V��m۶m۶-\��AO��_�����<�w��BP�@ p��<c"�iW7�<"�C�g�k��#�
J�
�1T^�剜֎�+IXS8� ��� ����.����
T(`:
�K�|��
�F����f@���`��*w���<�W�?���n�z���Z�YQWW62T������I�6�?�"��᧟ӓe[m�W�0ahJ���BVM�5��I��~04��Fι�5��ҫ״_��w�/D"�+ZʆU_�#���Sw���wܸM"A
���?��{w��BX�(��K~�i��{n��q��˯F���UUrː�QO�wD�Y$��V���2��o
^sy�&ӱ����D[������Xkص��XL��c�Q�
^p�tR��z?�?�,��{=P�3���a�I)���l�[��G��މ�&�8�����=㔮c�.[����HD�V ��;�'[��TW��YUe��fCYWk�����dJaH�rD�t�(���P����{r%�IJ�x|lN@����o��D���\`v-��,?���:,�t%��zIEND�B`�img/edit_aceeditor.png000064400000001002151215013430010756 0ustar00�PNG


IHDR�a�IDATx�ݏ��|��ݜm�>�ư�Y�ڶm۶m۶m[�='����
�0$%%����SqTbb�p~*�bE~c��4�9
.\w�����|����-�� &�,�R6��0	h�Հ����%ڵ���T(x�*���9�
Sw�)D �2G�y���\]];�����J�kaU(6��Mse\����"����K�;��\L#Mpd��t8����˗>��c�\�k�`����P
���R6�Ko��*LoZ��]�i��>���͈�\��4-6KK��,]}�K���J��K�I|�5����!1�~j�6�T���x�~�X�BӐS�[�Ğ{$���i�L����+��%[��s�	��'w�}�;�+�����7��d��68v/P��j��٠xZ�_|½lv;(Q`���"�������>�#o�[�-�J�|�{IEND�B`�img/volume_icon_network.png000064400000001550151215013430012112 0ustar00�PNG


IHDR�asBIT|d�	pHYszz2��tEXtSoftwarewww.inkscape.org��<�IDAT8�}�KHTQ���s�Ν��5�1LgLō-j1FXF/�E��0saJO�PȠ'-"�ME�Z�b(�\�B&*�H)(�$��dN��{Ϝ���p����s~ߏ�;����:�VZ������M�F�ͻ�o��@ ��d�JO�پ/_>'��rvvV��ݓ��e0�<6;;ϼ��a颣�pCs�����'O�9���
��`��D�q5/��&S@��ڢ�}ފ
������/�׻ɤ�H���q$���*����w���.46n�s:s����O	!����ӧi�v�����ۺu��]�|�������������FH�R��ͦ!7w�v;l6
YY*(�8���)+�:���}�Pۑ
B�"�X,�x|�iY`Lc
��pL���`���t�@��uC�4�P
EY�?���R���P�|�s]�A׳!���(
 ��r��SQ�NÑ𳩩I$	��	M�ar2Ø����##/�r��eY�,�x�2�2�l(��]���t�;N(,̇�B�����DMM������B�Iz�sgN�].W��<_KXU>��eڜ��߼-��oP(�i�g4:�uj����7�f~�%yx���[��cH�[}/}��Z�M��; ����d�z>v����
|>�,�VPPЫ�z�"�V��so7�O1&fff^�qVU����0_"����1���1K�㔚T�S�SK�Lp��H�i�@`4�|�"�c�,IEND�B`�img/icons-small.png000064400000007132151215013430010245 0ustar00�PNG


IHDR�+�PLTEI��Hm�]{}Ht��S4H{����%%$$���@z�*IKSSSBbdOki5!C���P;�>\ty���BY��U1GFG<�)J����v�Ү��kkk&��=EE  ��v�ӏ��U�������J�N,��,Y�x�B��~��%T������e\mmR��ev�}��}��1GKr���ʬ������Md��#]�4|�/�!j�6�7��T��/�$Yc�7t����Fp�-m��L�TY�${�h��X�f�ľR�Ծ��y����G�.���I�H�mmm!Eyiii�:GvJ0���L�wOdm�.}1����J���SSSg�ښ��Q���������������������������������;"�Jwww�������.}2
G������܊����э����XX[.�``c"�������ɱ�׈������򫮮��ϲH	������y��������S!���LLO�P
����֪���e���QRV���A�͒�ʖ�����H:M���ˇdesP�R'���\�3��l������u������U�ۥ�Ӏ��p��o��ѧ�(c��f�ʛ��P|�k�i�9M��`��U��I�����V�A���r�޷0�#
2��y���Ϋ8����eA??@����Е����ŵڶ����+���Iq��ܗp�nKxl-XR��E88:ऑ�skA�Ex�����Ɛ;�qv��_�t#���ttRNSk��g���gt�$fdh'��F��<��K��������qH��������c��RF��̮����é�����4���ȝ]��?������¿��p����͹��\@*��Ɏ{a ����yq����e��
�IDATx��kHSa�_�Ȗi�A��Z:$X�Zf���t�nч��ͭ�&,oc��,L��N]�i(�i�3�R�>��4!�|�y�y�񌂂n�OD��y����<{BHDCA:�V
��&H�h��ϿV���ף"BM�jb�xA/tjb���C�|���|^3+���"��t,z�.����(�ߎl3�*A$*.�C���@�7�H��HFq�r����9Q�Q����X��Q)��:��(�������@��B�;m	^."x1�P�:��E"��N�g����ԕ�0����.T��l�1?<��8
��rݕ�<��(�'/�MX����*6#ԕQyY`x=<G��l��U�?T�X,�g�D������,,|���juu�ի��Q�%�
��.A�L� L"�0����&t�M�
��E"B� I��|+�`!�P�0�m����msT)0G5�m6[��G���Fܓo煮�z�6-/�&l�0G�K���`�$<v�Qv{���Q��̲���&��9��
�Ӈn�\����"L-��G�Uz�)E�''{�z������f,޽�����ז��MXhށ�ܵ����Q�֮ׯ{t��]��*�h��=['w9�h�
"�t�������$Y�#!Yv��&�òm�x� �;A<G(;�@���\C,d;�^�X(��m;ĝ9II��D������NM�y���#��l��W���Q(��$R*)�.m!H�#�����tH#Y�Ί{�v
E/`q���Z�(�W���ӱi�-pRO�=�cEzjttj
&5}+R;;�0����J��eI��:@`b����Nh��:kSHG
�͍{�2��F��/(剉����9����B�+��*�7�J��(p�&��G?V��/_F?�m
��T0|	�^Z_�g/:XQ~�_KЉV��O|�ZaZ�������4f`�Q�33#c��������3ݐDNL<}?6������&�8ϊ�8>�-^ʜ�G�:���̠�I���}b����$jۃ�#c̰/GK���s�q1�z^<��d���ӑD;�0���%
Z���޾�e�Dqb��b�0
�(N|�bn=�c�u�h.z�(ʜBs���_���+�ي1a\�7Y��P�u�Ľ��J�W����ΖgA��98���Uq�*���VP�gf(�+:2�lV���J��B�{�T��ͪf�7ǯ:*0��ot�́��7����J�F�n���E��w��̤�����>e;4a{Tii�EZF���Y�iPgfA͑����ެD���3_�/��V�'�!&
��ka�@0D N��X<+!�"������b^,�^�
��X�Y�	�Ps�̋<�%��5���bK^�����		lf��K7¦ta�PM��,bx��b1o���B������yh�h�(4@4@�9MM�[����N�33>==>
�Y�xq�j��):�������j�8�l�8%hMt�Eku#�-kMp؉[��Ya�4A��۷- ƛ��n(Y!w��� �����;`��>��Bר��_�LQ�/�%<��S��6j&L��Mj�4K"E�I�,ƿ�;f���Ϳ��ic��
����(FI�,�Ͼ�g�|g�-vVM�~wv��w�{眇��霏�����+ʱ���9kU�<���R���������W����j.W�Xg�%�͗�0T3���ښ����T*J@E��EE��	i�Ĺ�&�d$�n��7ԍ��.C���`��["IC�ܒ�k��["FR��F���ڹE��be[�4�A<tR��	imB"�������*�*���Q+8�N�Ý��S��܍�Sq��u�����R�����l��-� F���u�/0N\����`��S޻{���ޮ1�H/�i��l�����,�=\H!�sD�����.�s��%�AB&��Eǧ \<�����O�{����-�7������S��Ò-NmzY<����̏ץBD��L8��fK��Пg���E�#�Q*�"Z|�E%�
�RD���E�PIoP�@ئ�g[>A�"SMA���b��7�$�9��Ʋ��i��|_���	;�����ח�s����2>
�%�c>�^|��K�%�r����k��m�xq��ÙU�̝���Xb��<.3%+�06i3��-Ƭ��y��p�H���W7��z�<x�p��a�
�>L�O���$-\8ڊn)t�>�cʇ�?�61������'��[_���o}@��!�J����pJ��$�&f_�朎����Yh�7�u�ׂ0t����ۍ����PE��8��d84$�O�)X��\ N�p��892q
�+ ֟b��\١D����7s�� n낯�-�{z��n�E��Ζ z1ע!�^�DN��5(D.���sR�Q�*B��a\
H��>�����9�%L��NP#�j�������K��x	�Ic@Qע���+�!Ƨ
��R��K�`'����@���	5Fq��0Ÿ@�5���U�9�V4�x�񂸯^.m�x<H��f5xq�ꘆ�X�!O���-{'��^03Wr����{������)�0�x�f�D�a�J��H�D#��P���W�gIEND�B`�img/tui-icon-b.svg000064400000046440151215013430010012 0ustar00<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs/><symbol id="icon-b-ic-apply" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h24v24H0z"/>
        <path stroke="#555555" d="M4 12.011l5 5L20.011 6"/>
    </g>
</symbol><symbol id="icon-b-ic-cancel" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h24v24H0z"/>
        <path stroke="#555555" d="M6 6l12 12M18 6L6 18"/>
    </g>
</symbol><symbol id="icon-b-ic-crop" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h24v24H0z"/>
        <path fill="#555555" d="M4 0h1v20a1 1 0 0 1-1-1V0zM20 17h-1V5h1v12zm0 2v5h-1v-5h1z"/>
        <path fill="#555555" d="M5 19h19v1H5zM4.762 4v1H0V4h4.762zM7 4h12a1 1 0 0 1 1 1H7V4z"/>
    </g>
</symbol><symbol id="icon-b-ic-delete-all" viewBox="0 0 24 24">
    <g fill="#555555" fill-rule="evenodd">
        <path d="M5 23H3a1 1 0 0 1-1-1V6h1v16h2v1zm16-10h-1V6h1v7zM9 13H8v-3h1v3zm3 0h-1v-3h1v3zm3 0h-1v-3h1v3zM14.794 3.794L13 2h-3L8.206 3.794A.963.963 0 0 1 8 2.5l.703-1.055A1 1 0 0 1 9.535 1h3.93a1 1 0 0 1 .832.445L15 2.5a.965.965 0 0 1-.206 1.294zM14.197 4H8.803h5.394z"/>
        <path d="M0 3h23v1H0zM11.286 21H8.714L8 23H7l1-2.8V20h.071L9.5 16h1l1.429 4H12v.2l1 2.8h-1l-.714-2zm-.357-1L10 17.4 9.071 20h1.858zM20 22h3v1h-4v-7h1v6zm-5 0h3v1h-4v-7h1v6z"/>
    </g>
</symbol><symbol id="icon-b-ic-delete" viewBox="0 0 24 24">
    <g fill="#555555" fill-rule="evenodd">
        <path d="M3 6v16h17V6h1v16a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V6h1zM14.794 3.794L13 2h-3L8.206 3.794A.963.963 0 0 1 8 2.5l.703-1.055A1 1 0 0 1 9.535 1h3.93a1 1 0 0 1 .832.445L15 2.5a.965.965 0 0 1-.206 1.294zM14.197 4H8.803h5.394z"/>
        <path d="M0 3h23v1H0zM8 10h1v6H8v-6zm3 0h1v6h-1v-6zm3 0h1v6h-1v-6z"/>
    </g>
</symbol><symbol id="icon-b-ic-draw-free" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#555555" d="M2.5 20.929C2.594 10.976 4.323 6 7.686 6c5.872 0 2.524 19 7.697 19s1.89-14.929 6.414-14.929 1.357 10.858 5.13 10.858c1.802 0 2.657-2.262 2.566-6.786"/>
    </g>
</symbol><symbol id="icon-b-ic-draw-line" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#555555" d="M2 15.5h28"/>
    </g>
</symbol><symbol id="icon-b-ic-draw" viewBox="0 0 24 24">
    <g fill="none">
        <path stroke="#555555" d="M2.5 21.5H5c.245 0 .48-.058.691-.168l.124-.065.14.01c.429.028.85-.127 1.16-.437L22.55 5.405a.5.5 0 0 0 0-.707l-3.246-3.245a.5.5 0 0 0-.707 0L3.162 16.888a1.495 1.495 0 0 0-.437 1.155l.01.14-.065.123c-.111.212-.17.448-.17.694v2.5z"/>
        <path fill="#555555" d="M16.414 3.707l3.89 3.89-.708.706-3.889-3.889z"/>
    </g>
</symbol><symbol id="icon-b-ic-filter" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h24v24H0z"/>
        <path fill="#555555" d="M12 7v1H2V7h10zm6 0h4v1h-4V7zM12 16v1h10v-1H12zm-6 0H2v1h4v-1z"/>
        <path fill="#555555" d="M8.5 20a3.5 3.5 0 1 1 0-7 3.5 3.5 0 0 1 0 7zm0-1a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5zM15.5 11a3.5 3.5 0 1 1 0-7 3.5 3.5 0 0 1 0 7zm0-1a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5z"/>
    </g>
</symbol><symbol id="icon-b-ic-flip-reset" viewBox="0 0 31 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M31 0H0v32h31z"/>
        <path fill="#555555" d="M28 16a8 8 0 0 1-8 8H3v-1h1v-7H3a8 8 0 0 1 8-8h17v1h-1v7h1zM11 9a7 7 0 0 0-7 7v7h16a7 7 0 0 0 7-7V9H11z"/>
        <path stroke="#555555" stroke-linecap="square" d="M24 5l3.5 3.5L24 12M7 20l-3.5 3.5L7 27"/>
    </g>
</symbol><symbol id="icon-b-ic-flip-x" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M32 32H0V0h32z"/>
        <path fill="#555555" d="M17 32h-1V0h1zM27.167 11l.5 3h-1.03l-.546-3h1.076zm-.5-3h-1.122L25 5h-5V4h5.153a1 1 0 0 1 .986.836L26.667 8zm1.5 9l.5 3h-.94l-.545-3h.985zm1 6l.639 3.836A1 1 0 0 1 28.819 28H26v-1h3l-.726-4h.894zM23 28h-3v-1h3v1zM13 4v1H7L3 27h10v1H3.18a1 1 0 0 1-.986-1.164l3.666-22A1 1 0 0 1 6.847 4H13z"/>
    </g>
</symbol><symbol id="icon-b-ic-flip-y" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0v32h32V0z"/>
        <path fill="#555555" d="M0 16v1h32v-1zM11 27.167l3 .5v-1.03l-3-.546v1.076zm-3-.5v-1.122L5 25v-5H4v5.153a1 1 0 0 0 .836.986L8 26.667zm9 1.5l3 .5v-.94l-3-.545v.985zm6 1l3.836.639A1 1 0 0 0 28 28.82V26h-1v3l-4-.727v.894zM28 23v-3h-1v3h1zM4 13h1V7l22-4v10h1V3.18a1 1 0 0 0-1.164-.986l-22 3.667A1 1 0 0 0 4 6.847V13z"/>
    </g>
</symbol><symbol id="icon-b-ic-flip" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h24v24H0z"/>
        <path fill="#555555" d="M11 0h1v24h-1zM19 21v-1h2v-2h1v2a1 1 0 0 1-1 1h-2zm-2 0h-3v-1h3v1zm5-5h-1v-3h1v3zm0-5h-1V8h1v3zm0-5h-1V4h-2V3h2a1 1 0 0 1 1 1v2zm-5-3v1h-3V3h3zM9 3v1H2v16h7v1H2a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h7z"/>
    </g>
</symbol><symbol id="icon-b-ic-icon-arrow-2" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#555555" stroke-linecap="round" stroke-linejoin="round" d="M21.793 18.5H2.5v-5h18.935l-7.6-8h5.872l10.5 10.5-10.5 10.5h-5.914l8-8z"/>
    </g>
</symbol><symbol id="icon-b-ic-icon-arrow-3" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#555555" stroke-linecap="round" stroke-linejoin="round" d="M25.288 16.42L14.208 27.5H6.792l11.291-11.291L6.826 4.5h7.381l11.661 11.661-.58.258z"/>
    </g>
</symbol><symbol id="icon-b-ic-icon-arrow" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#555555" d="M2.5 11.5v9h18v5.293L30.293 16 20.5 6.207V11.5h-18z"/>
    </g>
</symbol><symbol id="icon-b-ic-icon-bubble" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#555555" stroke-linecap="round" stroke-linejoin="round" d="M22.207 24.5L16.5 30.207V24.5H8A6.5 6.5 0 0 1 1.5 18V9A6.5 6.5 0 0 1 8 2.5h16A6.5 6.5 0 0 1 30.5 9v9a6.5 6.5 0 0 1-6.5 6.5h-1.793z"/>
    </g>
</symbol><symbol id="icon-b-ic-icon-heart" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path fill-rule="nonzero" stroke="#555555" d="M15.996 30.675l1.981-1.79c7.898-7.177 10.365-9.718 12.135-13.012.922-1.716 1.377-3.37 1.377-5.076 0-4.65-3.647-8.297-8.297-8.297-2.33 0-4.86 1.527-6.817 3.824l-.38.447-.381-.447C13.658 4.027 11.126 2.5 8.797 2.5 4.147 2.5.5 6.147.5 10.797c0 1.714.46 3.375 1.389 5.098 1.775 3.288 4.26 5.843 12.123 12.974l1.984 1.806z"/>
    </g>
</symbol><symbol id="icon-b-ic-icon-load" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#555555" stroke-linecap="round" stroke-linejoin="round" d="M17.314 18.867l1.951-2.53 4 5.184h-17l6.5-8.84 4.549 6.186z"/>
        <path fill="#555555" d="M18.01 4a11.798 11.798 0 0 0 0 1H3v24h24V14.986a8.738 8.738 0 0 0 1 0V29a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h15.01z"/>
        <path fill="#555555" d="M25 3h1v9h-1z"/>
        <path stroke="#555555" d="M22 6l3.5-3.5L29 6"/>
    </g>
</symbol><symbol id="icon-b-ic-icon-location" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <g stroke="#555555">
            <path d="M16 31.28C23.675 23.302 27.5 17.181 27.5 13c0-6.351-5.149-11.5-11.5-11.5S4.5 6.649 4.5 13c0 4.181 3.825 10.302 11.5 18.28z"/>
            <circle cx="16" cy="13" r="4.5"/>
        </g>
    </g>
</symbol><symbol id="icon-b-ic-icon-polygon" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#555555" d="M.576 16L8.29 29.5h15.42L31.424 16 23.71 2.5H8.29L.576 16z"/>
    </g>
</symbol><symbol id="icon-b-ic-icon-star-2" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#555555" d="M19.446 31.592l2.265-3.272 3.946.25.636-3.94 3.665-1.505-1.12-3.832 2.655-2.962-2.656-2.962 1.12-3.832-3.664-1.505-.636-3.941-3.946.25-2.265-3.271L16 3.024 12.554 1.07 10.289 4.34l-3.946-.25-.636 3.941-3.665 1.505 1.12 3.832L.508 16.33l2.656 2.962-1.12 3.832 3.664 1.504.636 3.942 3.946-.25 2.265 3.27L16 29.638l3.446 1.955z"/>
    </g>
</symbol><symbol id="icon-b-ic-icon-star" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#555555" d="M25.292 29.878l-1.775-10.346 7.517-7.327-10.388-1.51L16 1.282l-4.646 9.413-10.388 1.51 7.517 7.327-1.775 10.346L16 24.993l9.292 4.885z"/>
    </g>
</symbol><symbol id="icon-b-ic-icon" viewBox="0 0 24 24">
    <g fill="none">
        <path stroke="#555555" stroke-linecap="round" stroke-linejoin="round" d="M11.923 19.136L5.424 22l.715-7.065-4.731-5.296 6.94-1.503L11.923 2l3.574 6.136 6.94 1.503-4.731 5.296L18.42 22z"/>
    </g>
</symbol><symbol id="icon-b-ic-mask-load" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h32v32H0z"/>
        <path fill="#555555" d="M18.01 4a11.798 11.798 0 0 0 0 1H3v24h24V14.986a8.738 8.738 0 0 0 1 0V29a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h15.01zM15 23a6 6 0 1 1 0-12 6 6 0 0 1 0 12zm0-1a5 5 0 1 0 0-10 5 5 0 0 0 0 10z"/>
        <path fill="#555555" d="M25 3h1v9h-1z"/>
        <path stroke="#555555" d="M22 6l3.5-3.5L29 6"/>
    </g>
</symbol><symbol id="icon-b-ic-mask" viewBox="0 0 24 24">
    <g fill="none">
        <circle cx="12" cy="12" r="4.5" stroke="#555555"/>
        <path fill="#555555" d="M2 1h20a1 1 0 0 1 1 1v20a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1zm0 1v20h20V2H2z"/>
    </g>
</symbol><symbol id="icon-b-ic-redo" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h24v24H0z" opacity=".5"/>
        <path fill="#555555" d="M21 6H9a6 6 0 1 0 0 12h12v1H9A7 7 0 0 1 9 5h12v1z"/>
        <path stroke="#555555" stroke-linecap="square" d="M19 3l2.5 2.5L19 8"/>
    </g>
</symbol><symbol id="icon-b-ic-reset" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h24v24H0z" opacity=".5"/>
        <path fill="#555555" d="M2 13v-1a7 7 0 0 1 7-7h13v1h-1v5h1v1a7 7 0 0 1-7 7H2v-1h1v-5H2zm7-7a6 6 0 0 0-6 6v6h12a6 6 0 0 0 6-6V6H9z"/>
        <path stroke="#555555" stroke-linecap="square" d="M19 3l2.5 2.5L19 8M5 16l-2.5 2.5L5 21"/>
    </g>
</symbol><symbol id="icon-b-ic-rotate-clockwise" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path fill="#555555" d="M29 17h-.924c0 6.627-5.373 12-12 12-6.628 0-12-5.373-12-12C4.076 10.398 9.407 5.041 16 5V4C8.82 4 3 9.82 3 17s5.82 13 13 13 13-5.82 13-13z"/>
        <path stroke="#555555" stroke-linecap="square" d="M16 1.5l4 3-4 3"/>
        <path fill="#555555" fill-rule="nonzero" d="M16 4h4v1h-4z"/>
    </g>
</symbol><symbol id="icon-b-ic-rotate-counterclockwise" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path fill="#555555" d="M3 17h.924c0 6.627 5.373 12 12 12 6.628 0 12-5.373 12-12 0-6.602-5.331-11.96-11.924-12V4c7.18 0 13 5.82 13 13s-5.82 13-13 13S3 24.18 3 17z"/>
        <path fill="#555555" fill-rule="nonzero" d="M12 4h4v1h-4z"/>
        <path stroke="#555555" stroke-linecap="square" d="M16 1.5l-4 3 4 3"/>
    </g>
</symbol><symbol id="icon-b-ic-rotate" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h24v24H0z"/>
        <path fill="#555555" d="M8.349 22.254a10.002 10.002 0 0 1-2.778-1.719l.65-.76a9.002 9.002 0 0 0 2.495 1.548l-.367.931zm2.873.704l.078-.997a9 9 0 1 0-.557-17.852l-.14-.99A10.076 10.076 0 0 1 12.145 3c5.523 0 10 4.477 10 10s-4.477 10-10 10c-.312 0-.62-.014-.924-.042zm-7.556-4.655a9.942 9.942 0 0 1-1.253-2.996l.973-.234a8.948 8.948 0 0 0 1.124 2.693l-.844.537zm-1.502-5.91A9.949 9.949 0 0 1 2.88 9.23l.925.382a8.954 8.954 0 0 0-.644 2.844l-.998-.062zm2.21-5.686c.687-.848 1.51-1.58 2.436-2.166l.523.852a9.048 9.048 0 0 0-2.188 1.95l-.771-.636z"/>
        <path stroke="#555555" stroke-linecap="square" d="M13 1l-2.5 2.5L13 6"/>
    </g>
</symbol><symbol id="icon-b-ic-shape-circle" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <circle cx="16" cy="16" r="14.5" stroke="#555555"/>
    </g>
</symbol><symbol id="icon-b-ic-shape-rectangle" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <rect width="27" height="27" x="2.5" y="2.5" stroke="#555555" rx="1"/>
    </g>
</symbol><symbol id="icon-b-ic-shape-triangle" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path stroke="#555555" stroke-linecap="round" stroke-linejoin="round" d="M16 2.5l15.5 27H.5z"/>
    </g>
</symbol><symbol id="icon-b-ic-shape" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path fill="#555555" d="M14.706 8H21a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H9a1 1 0 0 1-1-1v-4h1v4h12V9h-5.706l-.588-1z"/>
        <path stroke="#555555" stroke-linecap="round" stroke-linejoin="round" d="M8.5 1.5l7.5 13H1z"/>
    </g>
</symbol><symbol id="icon-b-ic-text-align-center" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h32v32H0z"/>
        <path fill="#555555" d="M2 5h28v1H2zM8 12h16v1H8zM2 19h28v1H2zM8 26h16v1H8z"/>
    </g>
</symbol><symbol id="icon-b-ic-text-align-left" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h32v32H0z"/>
        <path fill="#555555" d="M2 5h28v1H2zM2 12h16v1H2zM2 19h28v1H2zM2 26h16v1H2z"/>
    </g>
</symbol><symbol id="icon-b-ic-text-align-right" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h32v32H0z"/>
        <path fill="#555555" d="M2 5h28v1H2zM14 12h16v1H14zM2 19h28v1H2zM14 26h16v1H14z"/>
    </g>
</symbol><symbol id="icon-b-ic-text-bold" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h32v32H0z"/>
        <path fill="#555555" d="M7 2h2v2H7zM7 28h2v2H7z"/>
        <path stroke="#555555" stroke-width="2" d="M9 3v12h9a6 6 0 1 0 0-12H9zM9 15v14h10a7 7 0 0 0 0-14H9z"/>
    </g>
</symbol><symbol id="icon-b-ic-text-italic" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h32v32H0z"/>
        <path fill="#555555" d="M15 2h5v1h-5zM11 29h5v1h-5zM17 3h1l-4 26h-1z"/>
    </g>
</symbol><symbol id="icon-b-ic-text-underline" viewBox="0 0 32 32">
    <g fill="none" fill-rule="evenodd">
        <path d="M0 0h32v32H0z"/>
        <path fill="#555555" d="M8 2v14a8 8 0 1 0 16 0V2h1v14a9 9 0 0 1-18 0V2h1zM3 29h26v1H3z"/>
        <path fill="#555555" d="M5 2h5v1H5zM22 2h5v1h-5z"/>
    </g>
</symbol><symbol id="icon-b-ic-text" viewBox="0 0 24 24">
    <g fill="#555555" fill-rule="evenodd">
        <path d="M4 3h15a1 1 0 0 1 1 1H3a1 1 0 0 1 1-1zM3 4h1v1H3zM19 4h1v1h-1z"/>
        <path d="M11 3h1v18h-1z"/>
        <path d="M10 20h3v1h-3z"/>
    </g>
</symbol><symbol id="icon-b-ic-undo" viewBox="0 0 24 24">
    <g fill="none" fill-rule="evenodd">
        <path d="M24 0H0v24h24z" opacity=".5"/>
        <path fill="#555555" d="M3 6h12a6 6 0 1 1 0 12H3v1h12a7 7 0 0 0 0-14H3v1z"/>
        <path stroke="#555555" stroke-linecap="square" d="M5 3L2.5 5.5 5 8"/>
    </g>
</symbol><symbol id="icon-b-img-bi" viewBox="0 0 257 26">
    <g fill="#FDBA3B">
        <path d="M26 5a8.001 8.001 0 0 0 0 16 8.001 8.001 0 0 0 0-16M51.893 19.812L43.676 5.396A.78.78 0 0 0 43 5a.78.78 0 0 0-.677.396l-8.218 14.418a.787.787 0 0 0 0 .792c.14.244.396.394.676.394h16.436c.28 0 .539-.15.678-.396a.796.796 0 0 0-.002-.792M15.767 5.231A.79.79 0 0 0 15.21 5H.791A.791.791 0 0 0 0 5.79v6.42a.793.793 0 0 0 .791.79h3.21v7.21c.001.21.082.408.234.56.147.148.347.23.558.23h6.416a.788.788 0 0 0 .792-.79V13h3.006c.413 0 .611-.082.762-.232.15-.149.23-.35.231-.559V5.791a.787.787 0 0 0-.233-.56M85.767 5.231A.79.79 0 0 0 85.21 5H70.791a.791.791 0 0 0-.791.79v6.42a.793.793 0 0 0 .791.79h3.21v7.21c.001.21.082.408.234.56.147.148.347.23.558.23h6.416a.788.788 0 0 0 .792-.79V13h3.006c.413 0 .611-.082.762-.232.15-.149.23-.35.231-.559V5.791a.787.787 0 0 0-.233-.56M65.942 9.948l2.17-3.76a.78.78 0 0 0 0-.792.791.791 0 0 0-.684-.396h-8.54A5.889 5.889 0 0 0 53 10.86a5.887 5.887 0 0 0 3.07 5.17l-2.184 3.782A.792.792 0 0 0 54.571 21h8.54a5.89 5.89 0 0 0 2.831-11.052M105.7 21h2.3V5h-2.3zM91 5h2.4v10.286c0 1.893 1.612 3.429 3.6 3.429s3.6-1.536 3.6-3.429V5h2.4v10.286c0 3.156-2.686 5.714-6 5.714-3.313 0-6-2.558-6-5.714V5zM252.148 21.128h-2.377V9.659h2.27v1.64c.69-1.299 1.792-1.938 3.304-1.938.497 0 .95.065 1.382.192l-.215 2.277a3.734 3.734 0 0 0-1.275-.213c-1.814 0-3.089 1.234-3.089 3.638v5.873zm-7.095-5.744a3.734 3.734 0 0 0-1.101-2.703c-.714-.766-1.6-1.149-2.658-1.149-1.058 0-1.944.383-2.679 1.149a3.803 3.803 0 0 0-1.08 2.703c0 1.063.368 1.978 1.08 2.722.735.746 1.62 1.128 2.68 1.128 1.058 0 1.943-.382 2.657-1.128.734-.744 1.101-1.659 1.101-2.722zm-9.916 0c0-1.682.583-3.086 1.729-4.256 1.166-1.17 2.635-1.767 4.428-1.767 1.793 0 3.262.597 4.407 1.767 1.167 1.17 1.75 2.574 1.75 4.256 0 1.7-.583 3.127-1.75 4.297-1.145 1.17-2.614 1.745-4.407 1.745-1.793 0-3.262-.575-4.428-1.745-1.146-1.17-1.729-2.596-1.729-4.297zm-1.5 3.233l.821 1.83c-.864.638-1.944.958-3.22.958-2.526 0-3.822-1.554-3.822-4.383V11.66h-2.01v-2h2.031V5.595h2.355v4.063h4.018v2h-4.018v5.405c0 1.469.605 2.191 1.793 2.191.626 0 1.318-.212 2.052-.638zm-12.43 2.51h2.375V9.66h-2.376v11.469zm1.23-12.977c-.929 0-1.642-.682-1.642-1.596 0-.873.713-1.554 1.643-1.554.885 0 1.576.681 1.576 1.554 0 .914-.69 1.596-1.576 1.596zm-6.49 7.234c0-1.086-.346-1.98-1.037-2.724-.692-.745-1.599-1.128-2.7-1.128-1.102 0-2.01.383-2.7 1.128-.692.744-1.037 1.638-1.037 2.724 0 1.084.345 2.02 1.036 2.766.691.744 1.6 1.105 2.7 1.105 1.102 0 2.01-.361 2.7-1.105.692-.746 1.038-1.682 1.038-2.766zm-.173-4.129V5h2.397v16.128h-2.354v-1.596c-1.015 1.255-2.333 1.873-3.91 1.873-1.663 0-3.068-.575-4.169-1.724-1.102-1.17-1.663-2.596-1.663-4.297 0-1.682.561-3.107 1.663-4.256 1.101-1.17 2.485-1.745 4.148-1.745 1.534 0 2.83.617 3.888 1.872zm-11.48 9.873h-10.218V5.405h10.195v2.318h-7.711V12h7.15v2.32h-7.15v4.489h7.733v2.319zm-23.891-9.724c-1.793 0-3.132 1.192-3.478 2.979h6.783c-.194-1.808-1.555-2.979-3.305-2.979zm5.703 3.766c0 .32-.021.703-.086 1.128h-9.095c.346 1.787 1.62 3 3.867 3 1.318 0 2.916-.49 3.953-1.234l.994 1.724c-1.189.872-3.067 1.595-5.033 1.595-4.364 0-6.243-3-6.243-6.021 0-1.724.54-3.15 1.642-4.277 1.101-1.127 2.548-1.702 4.298-1.702 1.664 0 3.046.511 4.105 1.553 1.058 1.043 1.598 2.447 1.598 4.234zm-19.949 3.894c1.08 0 1.966-.362 2.68-1.085.712-.724 1.058-1.617 1.058-2.703 0-1.084-.346-2-1.059-2.701-.713-.702-1.599-1.064-2.679-1.064-1.058 0-1.944.362-2.656 1.085-.714.702-1.059 1.596-1.059 2.68 0 1.086.345 2 1.059 2.724.712.702 1.598 1.064 2.656 1.064zm3.673-7.936V9.66h2.29v10.299c0 1.85-.584 3.32-1.728 4.404-1.146 1.085-2.68 1.638-4.58 1.638-1.945 0-3.672-.553-5.206-1.638l1.037-1.808c1.296.915 2.679 1.36 4.126 1.36 2.484 0 3.996-1.51 3.996-3.637v-.83c-1.015 1.127-2.311 1.702-3.91 1.702-1.684 0-3.089-.554-4.19-1.68-1.102-1.128-1.642-2.532-1.642-4.214 0-1.68.561-3.085 1.706-4.191 1.145-1.128 2.571-1.681 4.234-1.681 1.534 0 2.83.575 3.867 1.745zm-18.07 8.127c1.102 0 1.988-.382 2.7-1.128.714-.744 1.06-1.659 1.06-2.743 0-1.065-.346-1.98-1.06-2.724-.712-.745-1.598-1.128-2.7-1.128-1.101 0-2.008.383-2.7 1.128-.691.744-1.036 1.66-1.036 2.745 0 1.084.345 2 1.037 2.745.691.744 1.598 1.105 2.7 1.105zm3.652-8V9.66h2.29v11.469h-2.29v-1.575c-1.059 1.234-2.399 1.852-3.976 1.852-1.663 0-3.067-.575-4.168-1.745-1.102-1.17-1.642-2.617-1.642-4.34 0-1.724.54-3.128 1.642-4.256 1.1-1.128 2.505-1.681 4.168-1.681 1.577 0 2.917.617 3.976 1.872zM138.79 9.34c1.404 0 2.527.448 3.37 1.34.863.873 1.295 2.086 1.295 3.596v6.852h-2.376V14.66c0-2.021-1.036-3.128-2.657-3.128-1.727 0-2.915 1.255-2.915 3.192v6.404h-2.377v-6.426c0-1.978-1.037-3.17-2.679-3.17-1.728 0-2.937 1.277-2.937 3.234v6.362h-2.377V9.659h2.333v1.66c.692-1.212 1.988-1.979 3.522-1.979 1.533.021 2.958.767 3.586 2.107.798-1.277 2.419-2.107 4.212-2.107zm-19.517 11.788h2.484V5.405h-2.484v15.723z"/>
    </g>
</symbol></svg>img/black-search.png000064400000002067151215013430010345 0ustar00�PNG


IHDR
	��tEXtSoftwareAdobe ImageReadyq�e<%iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 6.0-c002 79.164460, 2020/05/12-16:04:17        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop 21.2 (Macintosh)" xmpMM:InstanceID="xmp.iid:527720D6467011EB9138DD03EEC09B46" xmpMM:DocumentID="xmp.did:527720D7467011EB9138DD03EEC09B46"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:00E09FFF466E11EB9138DD03EEC09B46" stRef:documentID="xmp.did:00E0A000466E11EB9138DD03EEC09B46"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>��}=�IDATx�t��	1�����d�V��<l���_5X�G��s:�.<�%��!�1K�2�Ą�97�
�x��?KV�1}�:�G�9U;�qӵ���k�['}�-��N��3
䷆�.yp�J41�	�<h��3������R��`]lȇ�:5�JU��4�ݯ��'��Ϡ&IEND�B`�img/edit_pixlrexpress.png000064400000001637151215013430011605 0ustar00�PNG


IHDR�afIDATx�M���V�T�Nǿm۶m۶�m�6��m[y��wS~1�	�x�$
�+�:qW3��)�u`D��h������3O��C���z���)�C�a�O�c�R���A������_��]���,�z�:�U—�����U�-��R�r��썤|�F���"|U�\��0����U��WɅ���ʚ�VP_X�x����}-��:��rO���u�(Y�X�U�������N.b���Q�+�-X��ϋQrZ��0�z�c 2}�p��O~�Gg�X�Y��E��N��S���Ω.ƕ���CJt��9)5f~赋F�.
g��Η�S�M@r^,Y����sT�2��I����nFO{'F�s6`����KTX�0;�6a0ڱRac&�>~��x�&�C����Gɽ����hM
������qX^~����I�]��ѨII[^(��2���Q��_$��<�u#�O�
�G�o�ҥ���d�>E�I�wL�Z.�ƳOo����(kk��̶�Ȯ�C����"r��t�(a��I�
Y8�F������]}b^��w,�/��X��JN=��Mps�6O��
�Z��[��RA�3�0w�c�(7��XPfz�i<�my���Y�����:V	�����[zu����/�y�A.X���r�xe5�JeZ����P7Z�1�o����0:LM��&{o;L�3o�����qþS�m��[YC��C��~�gzy�	kk.�Q�����y�c��
�*"5�f)�����`��o��<��D���$BY.������wySf��P�޿�������?;~Z�y۱�w�=x���ۗ�g�_	_�z���cu����5�u��r-iIEND�B`�img/logo.png000064400000011435151215013430006765 0ustar00�PNG


IHDRd`ܭ'p4PLTEGpL#)"&##'!'"*'!"'''%"("!'"!$ "  !!  ## # %" !!" $"##  !&!  %!#   !���)"�����������������������������  " ���+$ ���"#%��������
�����吷����������$[WU!���AHP���tsr'')�����������������Ֆ��&	58;^\[���������ڹ�䜾�URQ���jhh��Ţ�������=DLMWa+,.���B?=/03�����Ǟ�������㚘����/)%���HFE5/+���pnm842��蓒�HPW���>85���KLN}|6=C'!`t���䏎����zxxOJGw�������ݔ������混����dbah~������篮�Ufv��܂�����z�����}����҉����Ⱦ��MZgW`g�����p��lv����~��akrs}�@JT��–��mz�er~���!��?�&tRNS��fw
�Uq�;����ȀK)0�#���A�_���k0b��rIDATh�͚W��5���c��"f(����K$r%���`��b�����M[�˽sf@g�g޻k�W���c��9��AAG���A���d��!g��BNGFF�����c'�K�M���7㝈M9��t�Fz�����/����p���0
ҳ:�}�l�=�����DD�%�=<�AC:x�t�Gɩ���e���V���b�>�O���������XiGeςKud��dL���Ѭ
fO�P��tDS�%&oV'�U�w�MG�,,#
�^Ȑ3�_$� �����gL�tr�\��>�'!�n~�PRR�O�[za�c��<
����QT�!du*�h�S�X񥏐Q�KL�qxVhvb�!H�
qJ�r��s��"`�zS�)�H�G��������`LVm����w`�>�2X	�ʾ�#%�s	bه*�QRR5!K�Fh4�u���t�:�q�vD.����qQ�Dħc*�Sɞ5<-�#�a���%:�!�G�}RkL�����d]߼n44�
�3|��z�g:���@gr�vk�Q��$pZ����ȷ��
�%�:�}�r�"7���+�=�<�O)Y�X��GȨ��)���X�c��!"y�]�Y��D�g�3iԴ*/�*)o�8Auf���`��C��Q)2L�C�yCV���������e8�Jʫ�ʫ��q8j�
��'�IA�I��\�N��u��zM�G��$bçr
QR�� ��)zZR�e䘐��JMCSճ�6��Ꮔ煊
kY������
Zy�ߤLW���-��vd���ϛ4
혧^��^��ɇ%�D��f9E�@�P��	+�*٥� �� ���0WR�6]�4���dV����|4�!�]���
(��+�KΆ�h�z$\�I��ܟ��d��3T�%Qi8\��'UU=�P�G}���|�h����"b~�R��peq�����f�!��������q"�m	����T�_�^�}�H�r��Jz���U�?#�X���A4�^!R?�[#�#�Aqo�|EU���C=�h���	W����ڔ��1��&RJzR`�ұ�o/n<�B ���`�
p�N�v�՚�b��b�q,+�YrRcB�s�cS�K��1��lߠ`�0���Wv��=��¤5��r��I�C
���m�t��ȹ�
Z0F��x����IJ���ܥ��NUo�M�Wm�@%y�rR|�u�����;(ؾQ�����?�z@
�n�Dȸ�P'�"��h6g�]P�lcqc�H���퍗f�&3�_�����/r�t\�/DƱ@5L6��7�;K0����]F�8N��y�(�g�;�$�
P_�*�
��w�W�uʘ1���5b٪1�t�Dl�t��M��4��+>$55�[3�xpuc
c
��]K�|H,��aGA[6Ƙ����ex'�W���A9u6:
��^ӫ^l\���D&W9�f��r�Ƞx �M�M�BI�'?�Y���% $�/�3���U�`���aZ]�nI��DB����3�탬.�楇�2��v�a�.<����CW�LO.�
��1��������<(��]y٬cGd�X=�V��*�.{��Q[wgd��K;E�P�rA@�Tf
��`��H�#_~p��]�
�7�1Q����ʇ�f|�ΰ�t�#-t���v�(W���x���={PЮ��`�q0"�ٰ������q��3�������-l@B�7�w����b�C@� ��f���4��lz{�ۦC�,����}�
_�wpiȰ�qt�I�ߔ�]�Vv�2ˮ���Q�7刵���Ϛv�8�K�� `�;�潵���
Ja�&78=42�4<@NJ�^F�岲�����م+�fP��noV>�gʏRK+��I�"O(�h������n-O
���A!i�ځ����m��>m�G����se���=`ww�3BO���KS��G ��:�'�2�R��}ȸ���&������1�	Pk��;�@��<
��	d�+�b@�\��6�7�_�v���������	&�R��
i��L='="�M����0�@�΋q��r+�SO(�:�k~�O͵����A4��AD ��ڵ�9�^�N����Z��Yi���"�:,HO2Ts�r�br\~�A��6����s��p�2B��\�L�@cr)�z���`$�r�2mia�����`�N7O���D/��s�#�pv���fװW.p���kp(8�TB�����?3���R��p����
$+(Mϔpf;q�!����d>�)��օ%j�H��Ts�)J���o��R�����p�巌e�.3�3�T�PTh�2yW��M�th�r����]2|�v�b�F�]��޳	Pɠ^���e>_��;K��#�	f0���j�!����'��px�ذs�������a�E��k(��|S��v̥.�/(�Z`H�e/�}"�@Ey�����ָCU_�����,��l�����y�w-��s���%_�M��D��e��0�y'0�z'UG�	G%�Q����	���ٽ �32�t���1�,wS^�{g�H����?���^Q.A
�6����͘#�2f�k��j/��{�rBY���lL���z�:�cg��'<<zq��Z�6;Av��‏^Co3�P��U�&:��1�?�������?���,�	�f+#H��8i.D}��e-��r��.E0����N��JE�&+~�x}_,��ëw��ֺj!H�\�7$��sȤqy�O�6��+�Թ����y�����B���	�ev�:�d7(e2�V�eתPr�Ox���]H���@x�O(�sjR�c����qҾ��P���?���h���[\����w�b�/��{�E� �!���|.�o�����[t
��w���}j���$"K�<+u�u-
xh �+M��l��b���A��!w[
��KD��S.�Y}FAAX'������܀�Lox���fV'�>őr�C��ƭ�.��ejX�`�z�Z�#��=�W���E �l��
�J+}�}(�G4�}|�E=ygB3r��{��@��F[[%�L��3�z[����H�+�D�kPs�nHDG�l�����o�݂3Kf�w�^��ڞ�G_mtfoE;5���;��Ϳ�aI��=`@���h_�i����މ/X]"�i���7��r��]"�Yyĺ�����&D��x��]����!�`��J�Y��<��]i{Oq��
2-8��;+��*�hR)�?΀̷�M0<����n�{r�
���a���.b�g���/&FƝ���bh����.h�z���;��a1�E�.�[W��]ID������(4�������FځD����!IE6�:+�\��HD���
�*4��K�6&���Hf�aw3�X�XSs��H�]�O�k����EM��%�������v�v�/_
%�z�$V?�����'nj`����+�ݐ�p�՜�]N��L(:8�2��}���ߗ�n��~��*�����k�G�ݻJ����E��Sk����
�Iml��n����i����b뽊Z"�ixL��@��X^����$��*�`R����L�~�_���'W*j�ϩ|�3��܃t�Х�>2<Na������12
a�)JE
�ϗO@��7�'�ȣ���\r.b4?��ך1��
ٮ��Z���u>u��y/l���>�	����}t�puz:ӓ+|�/괌xɨ7���i�!��֥��W�K�_��}� n���S�D���S�	����]�=B��&ENR���gUd�Z6�,��_J��.1��@>@���=Ha_^TLHP����s(��7��$�����:!�{��@~�ب� ��?��l��·'��& ǐ]�ߓX�/���#���	�B���hǁ+<~�r�W7�*��*ѷ��LI�`�Wҳ�{�>�'��pm�iD�o|�=��w�1��3B��׻��x\�ܳ��
�c�l��'B1�	�c�WI��k�����JB�4�m!<%96;*蜴~w�&��٬���8g��='͏���O�����e��p�(�?O%IEND�B`�img/src/icons-big.xcf000064400000440753151215013430010473 0ustar00gimp xcf file0x�xF~L���R���X&���^,�����d2B�B�A
exif-data�ExifMM*bj(1r2��i�
��'
��'Adobe Photoshop CS5 Macintosh2011:04:22 18:30:18�0210�0100��0��gimp-image-grid(style solid)
(fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000))
(bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000))
(xspacing 10.000000)
(yspacing 10.000000)
(spacing-unit inches)
(xoffset 0.000000)
(yoffset 0.000000)
(offset-unit inches)
gimp-metadatalGIMP_XMP_1<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
<x:xmpmeta xmlns:x='adobe:ns:meta/'>
<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>

 <rdf:Description xmlns:xmp='http://ns.adobe.com/xap/1.0/'>
  <xmp:CreatorTool>Adobe Photoshop CS5 Macintosh</xmp:CreatorTool>
  <xmp:CreateDate>2010-09-19T17:17:49+04:00</xmp:CreateDate>
  <xmp:MetadataDate>2011-04-22T18:30:18+04:00</xmp:MetadataDate>
  <xmp:ModifyDate>2011-04-22T18:30:18+04:00</xmp:ModifyDate>
 </rdf:Description>

 <rdf:Description xmlns:dc='http://purl.org/dc/elements/1.1/'>
  <dc:format>application/vnd.adobe.photoshop</dc:format>
 </rdf:Description>

 <rdf:Description xmlns:xmpMM='http://ns.adobe.com/xap/1.0/mm/'>
  <xmpMM:InstanceID>xmp.iid:FD7F117407206811B1BA95E37140A3C2</xmpMM:InstanceID>
  <xmpMM:DocumentID rdf:resource='xmp.did:01801174072068119109C4A19543BAD1' />
  <xmpMM:OriginalDocumentID>xmp.did:01801174072068119109C4A19543BAD1</xmpMM:OriginalDocumentID>
 </rdf:Description>

 <rdf:Description xmlns:photoshop='http://ns.adobe.com/photoshop/1.0/'>
  <photoshop:ColorMode>3</photoshop:ColorMode>
  <photoshop:ICCProfile>sRGB IEC61966-2.1</photoshop:ICCProfile>
  <photoshop:DocumentAncestors>
   <rdf:Seq>
    <rdf:li>xmp.did:F77F117407206811B1BA95E37140A3C2</rdf:li>
   </rdf:Seq>
  </photoshop:DocumentAncestors>
 </rdf:Description>

</rdf:RDF>
</x:xmpmeta>
<?xpacket end='r'?>
icc-profileHHLinomntrRGB XYZ �	1acspMSFTIEC sRGB���-HP  cprtP3desc�lwtpt�bkptrXYZgXYZ,bXYZ@dmndTpdmdd��vuedL�view�$lumi�meas$tech0rTRC<gTRC<bTRC<textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ �Q�XYZ XYZ o�8��XYZ b����XYZ $����descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view��_.���\�XYZ L	VPW�meas�sig CRT curv
#(-27;@EJOTY^chmrw|�������������������������
%+28>ELRY`gnu|����������������&/8AKT]gqz������������!-8COZfr~���������� -;HUcq~���������
+:IXgw��������'7HYj{�������+=Oat�������2FZn�������		%	:	O	d	y	�	�	�	�	�	�

'
=
T
j
�
�
�
�
�
�"9Qi������*C\u�����


&
@
Z
t
�
�
�
�
�.Id����	%A^z����	&Ca~����1Om����&Ed����#Cc����'Ij����4Vx���&Il����Ae����@e���� Ek���*Qw���;c���*R{���Gp���@j���>i���  A l � � �!!H!u!�!�!�"'"U"�"�"�#
#8#f#�#�#�$$M$|$�$�%	%8%h%�%�%�&'&W&�&�&�''I'z'�'�(
(?(q(�(�))8)k)�)�**5*h*�*�++6+i+�+�,,9,n,�,�--A-v-�-�..L.�.�.�/$/Z/�/�/�050l0�0�11J1�1�1�2*2c2�2�3
3F33�3�4+4e4�4�55M5�5�5�676r6�6�7$7`7�7�88P8�8�99B99�9�:6:t:�:�;-;k;�;�<'<e<�<�="=a=�=�> >`>�>�?!?a?�?�@#@d@�@�A)AjA�A�B0BrB�B�C:C}C�DDGD�D�EEUE�E�F"FgF�F�G5G{G�HHKH�H�IIcI�I�J7J}J�KKSK�K�L*LrL�MMJM�M�N%NnN�OOIO�O�P'PqP�QQPQ�Q�R1R|R�SS_S�S�TBT�T�U(UuU�VV\V�V�WDW�W�X/X}X�YYiY�ZZVZ�Z�[E[�[�\5\�\�]']x]�^^l^�__a_�``W`�`�aOa�a�bIb�b�cCc�c�d@d�d�e=e�e�f=f�f�g=g�g�h?h�h�iCi�i�jHj�j�kOk�k�lWl�mm`m�nnkn�ooxo�p+p�p�q:q�q�rKr�ss]s�ttpt�u(u�u�v>v�v�wVw�xxnx�y*y�y�zFz�{{c{�|!|�|�}A}�~~b~�#��G���
�k�͂0����W�������G����r�ׇ;����i�Ή3�����d�ʋ0�����c�ʍ1�����f�Ώ6����n�֑?����z��M��� ����_�ɖ4���
�u��L���$�����h�՛B��������d�Ҟ@��������i�ءG���&����v��V�ǥ8��������n��R�ĩ7�������u��\�ЭD���-�������u��`�ֲK�³8���%�������y��h��Y�ѹJ�º;���.���!������
�����z���p��g���_���X���Q���K���F���Aǿ�=ȼ�:ɹ�8ʷ�6˶�5̵�5͵�6ζ�7ϸ�9к�<Ѿ�?��D���I���N���U���\���d���l���v�ۀ�܊�ݖ�ޢ�)߯�6��D���S���c���s���
����2��F���[���p�����(��@���X���r�����4��P��m��������8��W��w����)���K��m��w&:;�I�]dr��D����������Y����H)9<�Q�c�v+������ʀ����U�/h&0text�	

	F"$&08&0H	�������ÿ��������ͯ����������˺�������
���ƹ�����������������´�����������������ƴ����^	�����������������ó�ƺ��g����������ͨ����Ù�ξ���g���������������ž���Ŀ���^�������������������û��������^�����ˤ���ˣ�𤢢��������������������¹�������������������������������������½�c���������������—���������þ�q�������������ú����������Ŀ�q���������������û�����������ſ���������ț�暘�������������ٿ���������������¾����𖗘�����ƽ������������þ�����������������������Ɨ��Ɨ������������������������
���¼���������������������¾��������������������Ĕ��ђ������������������������������������¿���������������
�����������񿽽�������‘�Ñ	���������������������������������������������������������������������	�������������������������򽼘��������������������������������ÿ����
������������������������������������������������������������������������������������
��������������꼽���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ��������������������%��
�
������������������������������������������������������������������������������������������������^	�������������������������֩������������ܴ�����ة����������������������^�������������������������^�����������򾺶���������������������������Ƿ�����������������������������ȴ��������օ�����㼻�����������ಭ����������ՙ�����������������ɼ�����������q����
������������������ӭ�����������෵���������������Ю�������������������ѹ��������������������������������������������嵴���崲��������컶�������������������������������������������
������������������������ʲ����������������ժ����������������������������������������������������������������������ݼ�������	����ެ���������������������������������ߺ������������������������ݹ����	����������ݹ������������������޸��������������������޸������
�������������������������������ู�������������������������
�����ḷ�������������������������ḷ����������������෷������੨��������෷�������������������	���߷�������������������������������߷�����ߨ�����ߨ�����෷���������
�������������߷����������������߷��� �߷������߷������%��
���������������������������������
�������������������������	������������������������	������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������	�������������������������������������������������������������������������������������������������������	������������������������
�������������������������������������������������	����������������������������������������������������� ���������������%���""�#%'$��������������	��������r��G��"������� ���!����!����"����#���'��DHH�LHKHH�D..0image�	

�
&�.0&�.0'������ͯ������������˺����������
����ƹ�����������������������������������������Ų������������������������������������������Ŀ��þ�����������������������Ŀ����������������������Ž������������������������ļ�����������u�����������Ž�����������u��������������������Ž���������½�u���������������ƿ����������þ�u���������������������������Ŀ�u������������������������������ſ�u����������������������ƿ�v��������������������������������ƽ���������������º�����������������������	������¼�������������������������
��þ�����������������������������¾�����������������£����������¿������������������¢��������������������¿��������������������������
�����
�������������������������������à��������������������������Ÿ���������������������������������򜜝�����������������򶧭���������񢣤�����������������񴧭����ؿ�����������響��������������̯���zﱧ�����������e����ε��������ԭ��������������������~N������lx����Ʀ��ý�������������ս�����됡�������\������������뫦������������߾������Ŭ�����߯������������骦�������ڼ��������蝽�=��ym�˓�����������試��������������������rO��K�Ԕ����������姦�������ۺ������Ʀ��Ё�z����}~�䥦�������ۼ����������������Ƨilpx}���oim}⤥���������޶������i�� c���kafih{�o���u{ࣥ�������ܵ������c:u��«yf[Y]d{�u�t�`�_ޢ��������ݴ������ba[H9@ETn_STofg���lpmܡ������ڻ����������\;;9<;?HO\Viha^qv��lW}۠����ߺ�����YGFBqhILQXQr~��e���~^ؠ����������������������������@����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������μ������������������������ͻ����������	w������������������ͻ����������	w��������������������Ͻ����������	w���������������������п�����������w�������������������������������w�����
������ý������������w�������������������������������������z����������������������ɰ�������������ϵ��������������������������������������������ź��������������������������������������Ǽ�����������������
������������½�������Į��������������������������������ϳ����������������������������������������׵������������������������������㿿�������������������������������������������㽽��������������㽽�������������������������������Ŀ��Ū����
���������������������ɶ�������������ỻ�����������������˵�����������������⹹���f�����̛�������ڿ�Ե��������
�����K������i~ѵ��ɭ���ս������������멱�������Z���������������������������Ḹ�����������߲��������������������������ͺ>��ym�̝�����������������������෷�����pN��I�Ӣ�����������������������෷���ҭ���ύ�����������������	���߷�����������ť�������ņ{�������������߷����� a���hv������������������������෷���}5���¯�vXi�����������ޢ����������������߷����zoUFDA\�gbt����������ܡ������������߷����xHA5HR>EJ`g���������z�ۡ�����߷����pPMB��JHMUk�����������٠�����߷�������������������@��������������������������
������������������������������	���������������������������������������ﵵ���������������������������������������������������������������������������������������������G::����������������������������G::������������������������������G::������������������������������::������������������������������:���������������������������������������������������������������������������������������������������������������������������������������	�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������l����������㿿�����������/D��������������㿿�����������n4[-���������������⽽��{������������ܡ��y������������T������w���͸����������
������������m�������~rLXC������������������c������ïf���m���D0q�������Ḹ�h��F��u�Է�al����12=�����������ᶶ��{Y�׳W�ז���[qc[]�\��������ᵵ�z����虿ԙ���vx;����������������ᴴ�]�������ȯ9EDA>25(PbeG������ᳳ�!k�ĥk���y9��������ᱱ�#>W��Ģ0Dk?ޢ��������ᱱ�#*3,>NEP>�ܡ��
����ᮮ�#47=,!CR[T7۠������ᮮ�2<=A !FU]d)' "!"##!!ٟ�����᭭�����	���������������@����������������������r��G
��"
�������
 ���	!���"���#���$���%��%��%�%�%�%�%�%�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+��*��@2�@AABCE@@�20#folder_open�	

����l<�0#<�0#<����ss��}}���������~}|���m������������������}}���������~}|���m����������¾����ٌ������������~}|���m������
����������������~}|���m���������������������~}|���m����������������������������������������m��H������������������������m��_T����������������������������&
mm��[~������������������������������������{&
mm��]}����������������������xuR
mm��_}������������������������������pmjimm��k}��������������������������������Ʊ|}�~~}~}}���������ƒ~�{{�z{~�������s�~�xx���������|���vuvv�x�������v|��~�tssts�������y|��~�qqpqq�������x||��~�llnn|�������v||��|�deik�������z{{B�|�]`do���������shh��z�Y[_��������|xhh��z�VW]���������ryy��z�UTy��������}uyy��z�TT�����~�sxx��z�Tj��y~�~y{rxx��z�S��yw}}�xzrvvz��`�qy||�{tzohhz��ȗwn{{v�rshh�{{����oityyz{�zpyktt�zz���{htt�qrtpttv���ztkjjkklmnop�qxmqq�l}qwy{{�ol�Ij!j�i6���������������������������������������������������������������������������������櫨���������������������������ÿ
��ı����������������������������ÿ��ϲ��������������������������̽�����������հ�������������������̼������������������ਢ����_x�˻�����������������������������(#���t�˸�������������������������(#���s�˴����������������������q#�����ɫ��������������������������ɨ����������������������������������΍�ȥ��������О�ȣ�������ÿ�����ụǟ���;���﫣�Ѧǜ������Ľ���������ƙ���ν���ﯠ����Ɩ�����Ź�������Œ����λ����ﱛ���٤Ŋ����ƶ�������j��Ă���̹��������������}��ȱ��������������{{�ù��������������yx�ƭ���������������xw���������������x�����������������w��������������Ά����������������ڽ����������������������������������������������������������������������������������a�!���(6�����������������������������������������������������������������������
������������������������������������������������������������������������������̠�������������������������}����������������������������������������������������������������������������������������������Կ������������������������������������������Ӷ�����������	�
��������߻���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������!��:6�	������%���
��������������`*����"������#��*���#��i���#��i���#��k���#��|�	��*�����+����*�����*�����)���$��)�����)��Z��(������(������'������'������&������&������%���M���%������%������$������$������#������#������#��e$����Q�!���0 �$99:;;=99�=;;:99$&./js�	

�J[./Jo./J����������ͯ��������������˺������������
����ƹ�������������������������������������Ų�����	����������������������������Ŀ��þ�������ぁ���������Ŀ�����~��~󐽳���������	|��||��||퐼�����������u��{z{z�{�{{����z{zz�{z{�������������u��{z{z�{�{{�z�z{zz�{z{�����������½�u��xyx��xx���xx푿����������þ�u��w���ww�x�������������Ŀ�u��
v�uv
v�z��������������ſ�u��v��������
���������������ƿ�v��vv�����������{uu�y�~|uromkkmq����ƽ���vv�������������º������o��s��������vv�������������¼�����n���n��������vv�����������þ�����i���k��������vv���������ń���¾�����n���o��������v��������ń�ꃂ�~{z��x�����������������������Ä��������¿�����zy|���������������������������������������„�Ä��������������à���������„���������������Ÿ���������������������������	������������	�����������������������
�������	������������������������������������ÿ��������	���������	������������������������������������������������������������������������������������������������������������������������񾻽����������������������������	���������
���������������������������������������������������������������������������������������������������
�������������������������������������������������������������� �����������������������%�.�p�����������������p��������������������������p�����������������p������������op�opoppopp�opoop�o���������	m��mm�����������i�jiij�ijiiji�����������f���ff����ff�����������d�cdd�dd�ddcdd��μ���������a``aa��a`��`aa�`��ͻ����������	w��_^_^�_�__�~��^_^^�_^_��ͻ����������	w��_^_^�_�__�^�^_^^�_^_��Ͻ����������	w��\]\��\\���{\\��п�����������w��[���{[[�\���������������w��
Z�YZ
Z�d���ý������������w��Z�������������杞��������������������z��ZZ�󼹹�����������ꐟ����������������ϵ�ZZ����֪������������������������ZZ���������������ź���������������ZZ���������������������Ǽ�����􄰴������ZZ������������������½����������Į�Z������������ꢡ�����ɕ��ϝ�����ϳ��������������������������Η���������׵�������������������������������������������������������������������������������������������������㽽�����������	��������������������������������������������������ỻ�������������	�����������⹹�����������������������	�����������	������	����������������������������Ḹ���������������������Ḹ��������������������������������ߣ������������������������������������߷�������ҩ��������������Ҫ�ߪ������߷��������ҩ�
������������������������
������������߷�����������������߷���� �߷�������߷��������%�.��������������������������������
����������������������������������������������������������������	����������ﵵ����������������������������ぁ������������������~��~�������������	|��||��||�������������G::���{z{z�{�{{����z{zz�{z{������������G::���{z{z�{�{{�z�z{zz�{z{������������G::���xyx��xx���xx��������������::���w���ww�x���������������:���
v�uv
v������������������v�������������������������������vv��������ʯ��갽������������������vv�����������������������ȿ��ȯ�������vv���������������˨��ʨ�������vv�������������������̣��ɦ�������vv�����������������������ת��Ӫ�������v���������������꿾���������������������������������������嵴������������������������������������������������������������������������������������������������������������������������	�������������������������	����������������������������������������������������������������������������������������	��������������������������������������	����������������������������
����������������������������������������������	�����������������������
��������������������������������������������������������������ſ
���������������������������� ������������������%�.�����������������
 ���	!���"��r#��G$��"%��&��&���'�����&���"���#���$���%��%��%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%��!�$��*�2@AABCE@@2.0zip�	

^.0^$.0^4����������ͯ��������������˺������������
����ƹ�������������������������������������Ų�����
����������������������������Ŀ��þ��������������Ŀ��������񘘗��󐽳������������������퐼�����������u��������𕔕��ꕔ��������������u������𧒒����퐽���������½�u�������쒑�����������þ�u��
������쒑������������Ŀ�u��
����
�쒐�������������ſ�u�����������
���������������ƿ�v��������������������������������ƽ����������������º������������������������	������¼��������������������������
��þ����������������Đ������������¾����������������������������¿����������������������������������������¿������������������������
�����
������������������������������à������������������������Ÿ������������������������������������������ș�������������������������ə���������������ٔ����ș����������ᨬ�����Ǚ���������������ߴ������ƙ�������������������ݴ�������������ř��������������������ߴ�������������Ù�������򼽽�������������������Ù�����������������ߵ���������������������������ݷ�����������������������������޷����������˿����������𶻗�����ݸ��������������ʾ��������������ݸ�������������ɼ�����������������ܹ�����������Ȼ������񻺺���������ܹ����������Ǻ����������ϔ���ϔǹ�������������������������������������������ŷ��������������������@�q�����������������q��������������������������q�����������������q������������pq�pqpqqpqq�pqppq�p���������
n��nn�����������j�kjjk�jkjjkj�����������g�g�g��gg�����������d�cd�d�d�ddc�dd��μ���������a``aa��a�`�a``�aa�`��ͻ����������	w��_^_�}�_^�_�_^_�_^^�_^_��ͻ����������	w��\]�{�{\\�\��{\\��Ͻ����������	w��[��\�[�[[�\��п�����������w��
Y�XY�YY�c���������������w��
Y�XY
Y�c���ý������������w��Y�������������杞��������������������z��YY�������������������ɰ�������������ϵ�YY�������������������������YY����������������ź���������������YY����������������������Ǽ�������������YY����
������������½�������Į�ll�����������������������������ϳ�ll�����������������������������������׵�ll������������������������㿿ll������������l��������������������������㽽ll�������������㽽llk���w���������������k������
��j�~z�����~}}|�{yy��~~j���������ỻii~j~~�j~i������������⹹hh||�LQQ�T�||h������
��g���Ucc�[�uug��������e�~�Uss�����ss�c�ssf��������������Ḹee}}�U������j�rqe���������Ḹcc||�Unn����oo�b�ppc�����������෷aa{y�U������m�ooa�����������෷``xx�W{{�{�j�ll`�����	���߷�^^xx�W{||�������}}�l�kk_�����������߷�^^wv�Xggil�����lii�a�ji^������������෷\\uu�Xxyyz����Ӄ{{�n�hh\����������������߷�[[ss�Xqqr����́rr�i�ggZ������������߷�ZZrq�Xll����ll�f�feZ����߷�YYqjq���qjfY�����߷�XXllkj�ihhgg�fee�daa�W������WWmkmjihhgg�feedc�ac``W���UVWVUVVUWVVUUVU�WUWVUVVU?��������������������������������
����������������������������������������������������������������
����������ﵵ������������������������������������������������������������������������������������G::��������������������������G::��������������������������G::�����������������������::���
�����������������������:���
����
��������������������������������������������������†�����������������������������†������������������������������������������	�������������������������������������������������������������������������������������������66�������������������������������������66�������������������������������66��������������������������������66�����������������������������66����������������������������������66�a���������������66X�=��������������55XX�`����������44C@FHFFDCBA@�?FCC4���������������44CQCC�QC4��������������22BBJ##�$JBB4��������1D�I%//�)I==2��
��0C�I%;;�����;;�/I;;0��������������0B�I%FF�F�4I::/��������//AAJ%88����88�/J99/��������..@@I%FF��FF�6I88.��������-->>H&AA�����AA�5H66-������������,,>>H&AA�����AA�5H66-������++>>H&1148���ϼ844�.H55+�������))==G&>>�@K����LAA�7G44)����������((;;G&::�Q���Q::�4G22(��
�����((::F&66�^�^66�1F11(������'':Q:XX�:Q1'������''665421�0//�'��	����&&:6:55442210/�.2..&��%�&%%&%%&%%�&%&&%?�����������������
 ���	!���"��r#��G$��"%��&��&�����%�����&���"���#���$���%��%��%�%�%�%�%�%��8�'��8�(���)�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+��*��@2�@AABCE@@�2./xml�	

�sM./sa./sq�~��������ͯ���~�����������˺������~������
����ƹ������~�����������}~�}~}~~}~~�}~}}~�}��Ų�����{��{{���Ļ������w�xwwx�wxwwx��xxww����þ����t��t��t�����t�tt����Ŀ����r���r�ύ�r��r�rr󋽶����������onnoo��oo�on�on�o�oo�n�������������u���onnoo��oo�on�on�o�oo�n�������������u��ml�ߟ�m�mm�ml�l�ll�mlm�����������½�u��j�އj��j�jj�kj�j�jj틿����������þ�u��iji�j�������������Ŀ�u��
h�gh
h�m��������������ſ�u��h��������
���������������ƿ�v��hh�����������������������������ƽ���hh�����������º�v����������������hh����	������¼������������������hh������
��øj����������������hh�����������™z���������������h������ž�����~������������������������������ij������±t���t{���������������������q�����‘�����q�������������÷�q�������u�����¨|q������à���������q������������|q����Ÿ�������|q���������������vq���	����䶑qv���������q����������q�����������������qv��������q����	�����������q|����v�������q����������������ÿ����������������������	����������������������������������������������������������������������������������������������������������������񾻽����������������������������	���������������������������������������������������������������������������������������������������������������������������������������� �����������������������%�.�~�����������������~��������������������������~�����������������~������������}~�}~}~~}~~�}~}}~�}���������{��{{�����������w�xwwx�wxwwx��xxww�����������t��t��t�����t�tt������������r���r�ύ�r��r�rr���Ļ���������onnoo��oo�on�on�o�oo�n���õ���������	w���onnoo��oo�on�on�o�oo�n���Į���������	w��ml�ߟ�m�mm�ml�l�ll�mlm���Ŭ���������	w��j�އj��j�jj�kj�j�jj���ǰ����������w��iji�j���ɴ�����������w��
h�gh
h�p���ʽ������������w��h�������������棤��������������������z��hh�������������������̰�������������ϵ�hh�������ظ�����������������hh��������������ښ�����������������hh������������������������������������hh����
�������᳑��½�������Į�h������������������ᕶ������������ϳ�������������Ѡ������ω��Պ�����������׵��������צ���������ʙ����������������׬�����݌���ē������������ܲ��������쾘�������㾓������������Ⓡ������������������Ѝ����㽽������֫���������Ї��������׫�����������ܱ������⫫��ܫ������������ܫ�����܍�����⾇���������ỻ������������֥��ᾙ��������������⹹������������������
�	���������ə�����	�������������������������Ḹ����������������������������Ḹ���������������������������������������������������������	��߷�������������������������������߷�����������������������������������������
������������߷�����������������߷���� �߷�������߷��������%�.�~���������������������������~���
������������~���������������~�����������}~�}~}~~}~~�}~}}~�}���������{��{{������ﵵ�w�xwwx�wxwwx��xxww�����������t��t��t�����t�tt������������r���r�ύ�r��r�rr��������������onnoo��oo�on�on�o�oo�n�������������G::����onnoo��oo�on�on�o�oo�n������������G::���ml�ߟ�m�mm�ml�l�ll�mlm������������G::���j�އj��j�jj�kj�j�jj��������������::���iji�j���������������:���
h�gh
h�s������������������h������������������������������hh�����������������������������hh���������������������Ѧ���������������hh��	�����ﱷ���������������hh�������������������������������hh���������������Ǧ����������������h������������������������������������������������������럨����������������������캛���������߮���������������������������ڧ���������������ƛ��������ӭ��������ӧ�����������������������桛������������������������������������ƛ����������������������������������ӛ�����������������Ӯ������������������������������������	�	�����߮����������
���������������������������������������������������������	���������������������������������������������� ������������������%�.�����������������
 ���	!���"��r#��G$��"%��&��&���'�����&���"���#���$���%��%��%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%��!�$��*�2@AABCE@@2	php�	

���	�	��������w��w�����"w��w���"�w��w�D��w���"f�w�"��"f��w��w�"��w�����w�"�����"��"��"��"	Layer 2�	

��F	�Z	�j�������|z{z{xy�xwwm�ijiifd�`aa^_^_\]�\[[�������|z{z{xy�xww,�	Layer 1�	

��|	��	���������|z{z{xy�xwwm�ijiifd�`aa^_^_\]�\[[�������|z{z{xy�xww,�./pl #1�	

���./��./������������ͯ��������������˺������������
����ƹ�������������������������������������Ų������������������������������������Ŀ��þ����	��������Ŀ�����~����󐽳���������	|��||��|�||퐼�����������u��{z{z�{�{{��z�z{zz�{z{�������������u��{z{z�{���z�z{zz�{z{�����������½�u��xyx��xxyyx�xx푿����������þ�u��w�x�ww�x�������������Ŀ�u��
v�uv
v�z��������������ſ�u��v��������
���������������ƿ�v��vv�����������{uu�y�~|uromkkmq����ƽ���vv�������������º������o��s��������vv�������������¼�����n���n��������vv�����������þ�����i���k��������vv���������ń���¾�����n���o��������v��������ń�ꃂ�~{z��x�����������������������Ä��������¿�����zy|���������������������������������������„�Ä��������������à���������„���������������Ÿ���������������������������	������������	�����������������������
�������	������������������������������������ÿ��������	���������	������������������������������������������������������������������������������������������������������������������������񾻽����������������������������	���������
���������������������������������������������������������������������������������������������������
�������������������������������������������������������������� �����������������������%�.�p�����������������p��������������������������p�����������������p������������op�opoppopp�opoop�o���������m��mm�����������i�jiij�ijii�j�jji�����������	f��f�ff�����������d�cdd�dd��d�dd��μ���������a``aa��a`a�`�aa�`��ͻ����������	w��_^_^�_�__��^�^_^^�_^_��ͻ����������	w��_^_^�_����^�^_^^�_^_��Ͻ����������	w��\]\��\\]]\�\\��п�����������w��[�\�[[�\���������������w��
Z�YZ
Z�d���ý������������w��Z�������������杞��������������������z��ZZ�󼹹�����������ꐟ����������������ϵ�ZZ����֪������������������������ZZ���������������ź���������������ZZ���������������������Ǽ�����􄰴������ZZ������������������½����������Į�Z������������ꢡ�����ɕ��ϝ�����ϳ��������������������������Η���������׵�������������������������������������������������������������������������������������������������㽽�����������	��������������������������������������������������ỻ�������������	�����������⹹�����������������������	�����������	������	����������������������������Ḹ���������������������Ḹ��������������������������������ߣ������������������������������������߷�������ҩ��������������Ҫ�ߪ������߷��������ҩ�
������������������������
������������߷�����������������߷���� �߷�������߷��������%�.��������������������������������
��������������������������������������������������������������������������ﵵ����������������������������	�����������������~�����������������	|��||��|�||�������������G::���{z{z�{�{{��z�z{zz�{z{������������G::���{z{z�{���z�z{zz�{z{������������G::���xyx��xxyyx�xx��������������::���w�x�ww�x���������������:���
v�uv
v������������������v�������������������������������vv��������ʯ��갽������������������vv�����������������������ȿ��ȯ�������vv���������������˨��ʨ�������vv�������������������̣��ɦ�������vv�����������������������ת��Ӫ�������v���������������꿾���������������������������������������嵴������������������������������������������������������������������������������������������������������������������������	�������������������������	����������������������������������������������������������������������������������������	��������������������������������������	����������������������������
����������������������������������������������	�����������������������
��������������������������������������������������������������ſ
���������������������������� ������������������%�.�����������������
 ���	!���"��r#��G$��"%��&��&���'�����&���"���#���$���%��%��%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%��!�$��*�2@AABCE@@2./c++�	

��q./��./������������ͯ��������������˺������������
����ƹ�������������������������������������Ų������������������������������Ŀ��þ��������ᇁ���������������Ŀ������~���~�󐽳���������|��||��|��|퐼�����������u��{z�{zz{z{{�{z{z{�zz{z{�������������u��{z��{zz�z{{�{z{z{�zz{z{�����������½�u��x�y��~xxy	x푿����������þ�u��wxw�x�������������Ŀ�u��
v�uv
v�z��������������ſ�u��v��������
���������������ƿ�v��vv�����������{uu�y�~|uromkkmq����ƽ���vv�������������º������o��s��������vv�������������¼�����n���n��������vv�����������þ�����i���k��������vv���������ń���¾�����n���o��������v��������ń�ꃂ�~{z��x�����������������������Ä��������¿�����zy|���������������������������������������„�Ä��������������à���������„���������������Ÿ���������������������������	������������	�����������������������
�������	������������������������������������ÿ��������	���������	������������������������������������������������������������������������������������������������������������������������񾻽����������������������������	���������
���������������������������������������������������������������������������������������������������
�������������������������������������������������������������� �����������������������%�.�p�����������������p��������������������������p�����������������p������������op�opoppopp�opoop�o���������m�����������i�jiij�ijiiji�����������f�m��mff��ffgff�ff�����������d��dcd�dd��ddcdd�dd��μ���������a``aa�aa��`��a�`��ͻ����������	w��_^�_^^_^__�_^_^_�^^_^_��ͻ����������	w��_^��_^^�^__�_^_^_�^^_^_��Ͻ����������	w��\�]e��d\\]	\��п�����������w��[\[�\���������������w��
Z�YZ
Z�d���ý������������w��Z�������������杞��������������������z��ZZ�󼹹�����������ꐟ����������������ϵ�ZZ����֪������������������������ZZ���������������ź���������������ZZ���������������������Ǽ�����􄰴������ZZ������������������½����������Į�Z������������ꢡ�����ɕ��ϝ�����ϳ��������������������������Η���������׵�������������������������������������������������������������������������������������������������㽽�����������	��������������������������������������������������ỻ�������������	�����������⹹�����������������������	�����������	������	����������������������������Ḹ���������������������Ḹ��������������������������������ߣ������������������������������������߷�������ҩ��������������Ҫ�ߪ������߷��������ҩ�
������������������������
������������߷�����������������߷���� �߷�������߷��������%�.��������������������������������
�����������������������������������������������������������������������ﵵ�����������������������������ᇁ�������������������������~���~��������������|��||��|��|�������������G::���{z�{zz{z{{�{z{z{�zz{z{������������G::���{z��{zz�z{{�{z{z{�zz{z{������������G::���x�y��~xxy	x��������������::���wxw�x���������������:���
v�uv
v������������������v�������������������������������vv��������ʯ��갽������������������vv�����������������������ȿ��ȯ�������vv���������������˨��ʨ�������vv�������������������̣��ɦ�������vv�����������������������ת��Ӫ�������v���������������꿾���������������������������������������嵴������������������������������������������������������������������������������������������������������������������������	�������������������������	����������������������������������������������������������������������������������������	��������������������������������������	����������������������������
����������������������������������������������	�����������������������
��������������������������������������������������������������ſ
���������������������������� ������������������%�.�����������������
 ���	!���"��r#��G$��"%��&��&���'�����&���"���#���$���%��%��%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%��!�$��*�2@AABCE@@2./sh�	

S�4./�H./�X����������ͯ��������������˺������������
����ƹ�������������������������������������Ų��������	������������������������Ŀ��þ������������♁�����Ŀ�����~���~�󐽳���������|�||�||��||퐼�����������u��{z{z����{�{z{�{zz�{z{�������������u��{z{z�{��{�{z{�{zz�{z{�����������½�u��xyx��xx�yxx�xx푿����������þ�u��wxw�x�������������Ŀ�u��
v�uv
v�z��������������ſ�u��v��������
���������������ƿ�v��vv�����������{uu�y�~|uromkkmq����ƽ���vv�������������º������o��s��������vv�������������¼�����n���n��������vv�����������þ�����i���k��������vv���������ń���¾�����n���o��������v��������ń�ꃂ�~{z��x�����������������������Ä��������¿�����zy|���������������������������������������„�Ä��������������à���������„���������������Ÿ���������������������������	������������	�����������������������
�������	������������������������������������ÿ��������	���������	������������������������������������������������������������������������������������������������������������������������񾻽����������������������������	���������
���������������������������������������������������������������������������������������������������
�������������������������������������������������������������� �����������������������%�.�p�����������������p��������������������������p�����������������p������������op�opoppopp�opoop�o���������m��m	m�����������i�jiij�iji�ijji�����������f�����f��܃ff�����������d�cۂdd��ddc�dd��μ���������a``aa�a`�a``�aa�`��ͻ����������	w��_^_^�~��_�_^_�_^^�_^_��ͻ����������	w��_^_^�_}�_�_^_�_^^�_^_��Ͻ����������	w��\]\��\\�]\\�\\��п�����������w��[\[�\���������������w��
Z�YZ
Z�d���ý������������w��Z�������������杞��������������������z��ZZ�󼹹�����������ꐟ����������������ϵ�ZZ����֪������������������������ZZ���������������ź���������������ZZ���������������������Ǽ�����􄰴������ZZ������������������½����������Į�Z������������ꢡ�����ɕ��ϝ�����ϳ��������������������������Η���������׵�������������������������������������������������������������������������������������������������㽽�����������	��������������������������������������������������ỻ�������������	�����������⹹�����������������������	�����������	������	����������������������������Ḹ���������������������Ḹ��������������������������������ߣ������������������������������������߷�������ҩ��������������Ҫ�ߪ������߷��������ҩ�
������������������������
������������߷�����������������߷���� �߷�������߷��������%�.��������������������������������
�������������������������������������������������������������������	�������ﵵ��������������������������������♁��������������~���~��������������|�||�||��||�������������G::���{z{z����{�{z{�{zz�{z{������������G::���{z{z�{��{�{z{�{zz�{z{������������G::���xyx��xx�yxx�xx��������������::���wxw�x���������������:���
v�uv
v������������������v�������������������������������vv��������ʯ��갽������������������vv�����������������������ȿ��ȯ�������vv���������������˨��ʨ�������vv�������������������̣��ɦ�������vv�����������������������ת��Ӫ�������v���������������꿾���������������������������������������嵴������������������������������������������������������������������������������������������������������������������������	�������������������������	����������������������������������������������������������������������������������������	��������������������������������������	����������������������������
����������������������������������������������	�����������������������
��������������������������������������������������������������ſ
���������������������������� ������������������%�.�����������������
 ���	!���"��r#��G$��"%��&��&���'�����&���"���#���$���%��%��%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%��!�$��*�2@AABCE@@2./rb�	

!�./�./�(����������ͯ��������������˺������������
����ƹ�������������������������������������Ų��������
������������������������Ŀ��þ����������⚁�����Ŀ�����~�����󐽳���������|��||�||��||퐼�����������u��{z{�z�{z{�{{z�z{zz�{z{�������������u��{z{�z�{z{��z�z{zz�{z{�����������½�u��xyx��xx����xx푿����������þ�u��wxw�x�������������Ŀ�u��
v�uv
v�z��������������ſ�u��v��������
���������������ƿ�v��vv�����������{uu�y�~|uromkkmq����ƽ���vv�������������º������o��s��������vv�������������¼�����n���n��������vv�����������þ�����i���k��������vv���������ń���¾�����n���o��������v��������ń�ꃂ�~{z��x�����������������������Ä��������¿�����zy|���������������������������������������„�Ä��������������à���������„���������������Ÿ���������������������������	������������	�����������������������
�������	������������������������������������ÿ��������	���������	������������������������������������������������������������������������������������������������������������������������񾻽����������������������������	���������
���������������������������������������������������������������������������������������������������
�������������������������������������������������������������� �����������������������%�.�p�����������������p��������������������������p�����������������p������������op�opoppopp�opoop�o���������m��m
m�����������i�jiij�ij�iijji�����������f���f��܄ff�����������d�c�ۂd�ۂd�dd��μ���������a``aa��aa�aa`�aa�`��ͻ����������	w��_^_�^�_^_�__^�^_^^�_^_��ͻ����������	w��_^_�^�_^_��~^�^_^^�_^_��Ͻ����������	w��\]\��\\��|��{\\��п�����������w��[\[�\���������������w��
Z�YZ
Z�d���ý������������w��Z�������������杞��������������������z��ZZ�󼹹�����������ꐟ����������������ϵ�ZZ����֪������������������������ZZ���������������ź���������������ZZ���������������������Ǽ�����􄰴������ZZ������������������½����������Į�Z������������ꢡ�����ɕ��ϝ�����ϳ��������������������������Η���������׵�������������������������������������������������������������������������������������������������㽽�����������	��������������������������������������������������ỻ�������������	�����������⹹�����������������������	�����������	������	����������������������������Ḹ���������������������Ḹ��������������������������������ߣ������������������������������������߷�������ҩ��������������Ҫ�ߪ������߷��������ҩ�
������������������������
������������߷�����������������߷���� �߷�������߷��������%�.��������������������������������
�������������������������������������������������������������������
�������ﵵ������������������������������⚁��������������~������������������|��||�||��||�������������G::���{z{�z�{z{�{{z�z{zz�{z{������������G::���{z{�z�{z{��z�z{zz�{z{������������G::���xyx��xx����xx��������������::���wxw�x���������������:���
v�uv
v������������������v�������������������������������vv��������ʯ��갽������������������vv�����������������������ȿ��ȯ�������vv���������������˨��ʨ�������vv�������������������̣��ɦ�������vv�����������������������ת��Ӫ�������v���������������꿾���������������������������������������嵴������������������������������������������������������������������������������������������������������������������������	�������������������������	����������������������������������������������������������������������������������������	��������������������������������������	����������������������������
����������������������������������������������	�����������������������
��������������������������������������������������������������ſ
���������������������������� ������������������%�.�����������������
 ���	!���"��r#��G$��"%��&��&���'�����&���"���#���$���%��%��%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%��!�$��*�2@AABCE@@2./py�	

���./��./������������ͯ��������������˺������������
����ƹ�������������������������������������Ų������������������������������Ŀ��þ���������������Ŀ�����~����~��󐽳���������|��||��|��|�||퐼�����������u��{z{�z�{z{�{{��{zz�{z{�������������u��{z{�z����{{��{zz�{z{�����������½�u��xyx��xxy�x�xx푿����������þ�u��w��xxww��ww�x�������������Ŀ�u��
v�uv
v�z��������������ſ�u��v��������
���������������ƿ�v��vv�����������{uu�y�~|uromkkmq����ƽ���vv�������������º������o��s��������vv�������������¼�����n���n��������vv�����������þ�����i���k��������vv���������ń���¾�����n���o��������v��������ń�ꃂ�~{z��x�����������������������Ä��������¿�����zy|���������������������������������������„�Ä��������������à���������„���������������Ÿ���������������������������	������������	�����������������������
�������	������������������������������������ÿ��������	���������	������������������������������������������������������������������������������������������������������������������������񾻽����������������������������	���������
���������������������������������������������������������������������������������������������������
�������������������������������������������������������������� �����������������������%�.�p�����������������p��������������������������p�����������������p������������op�opoppopp�opoop�o���������m�����������i�jiij�ijiiji�����������f���f�gf�ff�����������d�c�dd��d�c��dd��μ���������a``aa��aa��a��`�aa�`��ͻ����������	w��_^_�^�_^_�__��_^^�_^_��ͻ����������	w��_^_�^����__��_^^�_^_��Ͻ����������	w��\]\��\\]�\�\\��п�����������w��[��\\[[��[[�\���������������w��
Z�YZ
Z�d���ý������������w��Z�������������杞��������������������z��ZZ�󼹹�����������ꐟ����������������ϵ�ZZ����֪������������������������ZZ���������������ź���������������ZZ���������������������Ǽ�����􄰴������ZZ������������������½����������Į�Z������������ꢡ�����ɕ��ϝ�����ϳ��������������������������Η���������׵�������������������������������������������������������������������������������������������������㽽�����������	��������������������������������������������������ỻ�������������	�����������⹹�����������������������	�����������	������	����������������������������Ḹ���������������������Ḹ��������������������������������ߣ������������������������������������߷�������ҩ��������������Ҫ�ߪ������߷��������ҩ�
������������������������
������������߷�����������������߷���� �߷�������߷��������%�.��������������������������������
�����������������������������������������������������������������������ﵵ���������������������������������������������~����~���������������|��||��|��|�||�������������G::���{z{�z�{z{�{{��{zz�{z{������������G::���{z{�z����{{��{zz�{z{������������G::���xyx��xxy�x�xx��������������::���w��xxww��ww�x���������������:���
v�uv
v������������������v�������������������������������vv��������ʯ��갽������������������vv�����������������������ȿ��ȯ�������vv���������������˨��ʨ�������vv�������������������̣��ɦ�������vv�����������������������ת��Ӫ�������v���������������꿾���������������������������������������嵴������������������������������������������������������������������������������������������������������������������������	�������������������������	����������������������������������������������������������������������������������������	��������������������������������������	����������������������������
����������������������������������������������	�����������������������
��������������������������������������������������������������ſ
���������������������������� ������������������%�.�����������������
 ���	!���"��r#��G$��"%��&��&���'�����&���"���#���$���%��%��%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%��!�$��*�2@AABCE@@2./pl�	

��./�./������������ͯ��������������˺������������
����ƹ�������������������������������������Ų������������������������������������Ŀ��þ����	��������Ŀ�����~����󐽳���������	|��||��|�||퐼�����������u��{z{z�{�{{��z�z{zz�{z{�������������u��{z{z�{���z�z{zz�{z{�����������½�u��xyx��xxyyx�xx푿����������þ�u��w�x�ww�x�������������Ŀ�u��
v�uv
v�z��������������ſ�u��v��������
���������������ƿ�v��vv�����������{uu�y�~|uromkkmq����ƽ���vv�������������º������o��s��������vv�������������¼�����n���n��������vv�����������þ�����i���k��������vv���������ń���¾�����n���o��������v��������ń�ꃂ�~{z��x�����������������������Ä��������¿�����zy|���������������������������������������„�Ä��������������à���������„���������������Ÿ���������������������������	������������	�����������������������
�������	������������������������������������ÿ��������	���������	������������������������������������������������������������������������������������������������������������������������񾻽����������������������������	���������
���������������������������������������������������������������������������������������������������
�������������������������������������������������������������� �����������������������%�.�p�����������������p��������������������������p�����������������p������������op�opoppopp�opoop�o���������m��mm�����������i�jiij�ijii�j�jji�����������	f��f�ff�����������d�cdd�dd��d�dd��μ���������a``aa��a`a�`�aa�`��ͻ����������	w��_^_^�_�__��^�^_^^�_^_��ͻ����������	w��_^_^�_����^�^_^^�_^_��Ͻ����������	w��\]\��\\]]\�\\��п�����������w��[�\�[[�\���������������w��
Z�YZ
Z�d���ý������������w��Z�������������杞��������������������z��ZZ�󼹹�����������ꐟ����������������ϵ�ZZ����֪������������������������ZZ���������������ź���������������ZZ���������������������Ǽ�����􄰴������ZZ������������������½����������Į�Z������������ꢡ�����ɕ��ϝ�����ϳ��������������������������Η���������׵�������������������������������������������������������������������������������������������������㽽�����������	��������������������������������������������������ỻ�������������	�����������⹹�����������������������	�����������	������	����������������������������Ḹ���������������������Ḹ��������������������������������ߣ������������������������������������߷�������ҩ��������������Ҫ�ߪ������߷��������ҩ�
������������������������
������������߷�����������������߷���� �߷�������߷��������%�.��������������������������������
��������������������������������������������������������������������������ﵵ����������������������������	�����������������~�����������������	|��||��|�||�������������G::���{z{z�{�{{��z�z{zz�{z{������������G::���{z{z�{���z�z{zz�{z{������������G::���xyx��xxyyx�xx��������������::���w�x�ww�x���������������:���
v�uv
v������������������v�������������������������������vv��������ʯ��갽������������������vv�����������������������ȿ��ȯ�������vv���������������˨��ʨ�������vv�������������������̣��ɦ�������vv�����������������������ת��Ӫ�������v���������������꿾���������������������������������������嵴������������������������������������������������������������������������������������������������������������������������	�������������������������	����������������������������������������������������������������������������������������	��������������������������������������	����������������������������
����������������������������������������������	�����������������������
��������������������������������������������������������������ſ
���������������������������� ������������������%�.�����������������
 ���	!���"��r#��G$��"%��&��&���'�����&���"���#���$���%��%��%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%��!�$��*�2@AABCE@@2./css�	

Y`./t./��~��������ͯ���~�����������˺������~������
����ƹ������~�����������}~�}~}~~}~~�}~}}~�}��Ų�����{���Ļ������w�xwwx�wxwwxw����þ����t���ߏt����tt���ߏtt����Ŀ����r��rr��r�rr��r�rr��rr󋽶���������onno�oo����oon���oo�n�������������u��onno�oo���onno�ދoo�n�������������u��ml��mm��m�mm��l�lm��lmlm�����������½�u��j���݇j���݇j����jj틿����������þ�u��iji�j�������������Ŀ�u��
h�gh
h�m��������������ſ�u��h��������
���������������ƿ�v��hh�����������������������������ƽ���hh�����������º�v����������������hh����	������¼������������������hh������
��øj����������������hh�����������™z���������������h������ž�����~������������������������������ij������±t���t{���������������������q�����‘�����q�������������÷�q�������u�����¨|q������à���������q������������|q����Ÿ�������|q���������������vq���	����䶑qv���������q����������q�����������������qv��������q����	�����������q|����v�������q����������������ÿ����������������������	����������������������������������������������������������������������������������������������������������������񾻽����������������������������	���������������������������������������������������������������������������������������������������������������������������������������� �����������������������%�.�~�����������������~��������������������������~�����������������~������������}~�}~}~~}~~�}~}}~�}���������{�����������w�xwwx�wxwwxw�����������t���ߏt����tt���ߏtt������������r��rr��r�rr��r�rr��rr���Ļ��������onno�oo����oon���oo�n���õ���������	w��onno�oo���onno�ދoo�n���Į���������	w��ml��mm��m�mm��l�lm��lmlm���Ŭ���������	w��j���݇j���݇j����jj���ǰ����������w��iji�j���ɴ�����������w��
h�gh
h�p���ʽ������������w��h�������������棤��������������������z��hh�������������������̰�������������ϵ�hh�������ظ�����������������hh��������������ښ�����������������hh������������������������������������hh����
�������᳑��½�������Į�h������������������ᕶ������������ϳ�������������Ѡ������ω��Պ�����������׵��������צ���������ʙ����������������׬�����݌���ē������������ܲ��������쾘�������㾓������������Ⓡ������������������Ѝ����㽽������֫���������Ї��������׫�����������ܱ������⫫��ܫ������������ܫ�����܍�����⾇���������ỻ������������֥��ᾙ��������������⹹������������������
�	���������ə�����	�������������������������Ḹ����������������������������Ḹ���������������������������������������������������������	��߷�������������������������������߷�����������������������������������������
������������߷�����������������߷���� �߷�������߷��������%�.�~���������������������������~���
������������~���������������~�����������}~�}~}~~}~~�}~}}~�}���������{������ﵵ�w�xwwx�wxwwxw�����������t���ߏt����tt���ߏtt������������r��rr��r�rr��r�rr��rr�������������onno�oo����oon���oo�n�������������G::���onno�oo���onno�ދoo�n������������G::���ml��mm��m�mm��l�lm��lmlm������������G::���j���݇j���݇j����jj��������������::���iji�j���������������:���
h�gh
h�s������������������h������������������������������hh�����������������������������hh���������������������Ѧ���������������hh��	�����ﱷ���������������hh�������������������������������hh���������������Ǧ����������������h������������������������������������������������������럨����������������������캛���������߮���������������������������ڧ���������������ƛ��������ӭ��������ӧ�����������������������桛������������������������������������ƛ����������������������������������ӛ�����������������Ӯ������������������������������������	�	�����߮����������
���������������������������������������������������������	���������������������������������������������� ������������������%�.�����������������
 ���	!���"��r#��G$��"%��&��&���'�����&���"���#���$���%��%��%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%��!�$��*�2@AABCE@@20/html�	

'�0/	0/�������ͯ�������������˺�����������
����ƹ��������������������Ų������������������������������������������Ŀ��þ����������������������Ŀ��������������󋽳�����������������������������튼�����������u���������������������틽�����������u���������������������틽���������½�u��~��~~�~��~�~~�~~�~�~~�f�����������þ�u��}�h�x���������Ŀ�u��}�m�������������ſ�u��}����������od{oxqqrp��������������ƿ�v��}}���������|x���i�������{|tqqhq�����ƽ���}}������ࠌ���u���������oltrsh{���������}}�����߷���������㺙��x�|rppe���������}}������ߌ�����¿���آ�w��vpnjm��������}}������޺����������լ��}�ZZeese��������}}�����ܞ����������ѳ���s��s��x��������}}�������Ê��u}��������ѷ��y�������w�������}������ㄌ�����������̹���ϼ�����v�����	������‚������������Ĵ���ʺ�����t����à�������ރ�����������ȹ����ŷ�����s����Ÿ�����������������������������r������
����ނ������������������������y�����������������������������z}������������
���������������������󈊋{�����������ÿ����s�������������������v��������������{�����������������}�������������������w�����������􅜇x��������
����������l���艆��}{|~���w������������������l����~|zyvv|���}����������
�߾���������tq��|{yyz}���kv������������������mq}����ylm�������������
���������廥��{nojjlo|���������������
�������������������������������������
������ﺶ��������������������
��������������������������
��������������������������
���� ����
�������������������%�0�����������������������������������������������������������������������������������������������������������������������������������������������������������������������μ�����������˽�������˽����������ͻ����������	w�����������������������ͻ����������	w�����������������������Ͻ����������	w���������������������퀢�������������w���탧��������������w���퉴���������������w���؝����������������������������������z����������������������������������������ϵ��������­�����������������������������������פ��������ϴ��������������������������䰼�����¾���㻪�����������������������ڪ����զ��������|~���������Į������������©�����ȶ��������������ϳ����������䮵���������̷��������������׵��������ਮ�����������������ÿ���������
�����㦳������������˾����ÿ���������	������⦷������������ź����¿���������
������㣷�����������ǽ��������������㽽������ަ�����������ý����������������⼼�������൷��������������������������⻻������Ϥ������������򮭹�������ỻ��������☱�����������񭬶��������⹹��������������򮬪���������������������ﭬ������������������������ѐ����譪������������������Ḹ����������ᾐ�������������������������Ḹ�������仗�������������������������
�������ݼ�������������������������
�����������ı�������������������߷
��������������ҿ�������������������߷
�����������������ǿ�������������������
��������������������������������߷
�������������������߷
���� �߷
�������߷��������%�0��������������������������
�������������������������������������������������������ﵵ��������������������E�E����E��E���������������D����D�����������������D���D����������������G::������������������������G::������������������������G::��������������������������::�������������������:����������������������ع�����������s����������������������������о�ZG@FZ������Ͱ������������������������U?Jq�`������Մ��������������������^?;;TG�������û�{�����������������@=89VF8������FEMewu�����������������I?:8N>k�������ڔ<DS[mt�������������B>98R��������8H����_���������������wBIDi������P4@ABP~����������������V�����������e05:=AEe�����
������[��������.26:=@BK��������������t{���������/36:>ABB������
�����������������248<?ABA����
���������������������g69C>ABD������������������䄯�gBBQ����
���������������CBl����������������CA������
�����������������cBQ�������������������MA������	����������������������?o�����	������������������������b�������
������������������������������
������������������������������
��������������������������
�������������������������
��������������������
��
��������������
��������	�����
�� ��
����������������%�0�������� ���!���
"���	#���$��r%��G&��"'��(��(���)���*���	"���	#���$���%��%��%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%��!�$��*�2@AABCE@@2(/office�	

�)�(/)�(/*������ͯ������������˺����������
����ƹ�����������������������������������������Ų������������������������������������������Ŀ��þ�����������������������Ŀ����������������������Ž������������������������ļ�����������u�����������Ž�����������u��������������������Ž���������½�u���������������ƿ����������þ�u�����������������������������Ŀ�u������������������������������ſ�u�����������������������������ƿ�v�����������������������������������ƽ������������������º�{wrqnu��������������������������¼~yzvtmn������������������������þ~z���zl����������Ĥ������������¾������r����������ģ�������������¿������|���ٳ������������������������¿������~�����������������������Æ���������������������������»�����������à�����������������������Ÿ���������������������������������������������������������������������������������������������������ÿ��������������������������������������������������������������������������������������������������ᄑ�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� �����������������������$�(����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������μ������������������������ͻ����������	w������������������ͻ����������	w��������������������Ͻ����������	w���������������������п�����������w�������������������������������w�����������钑�����ý������������w���������揗������ܑ������������������z����������搝�����⑎��ɯ�������������ϵ����������⏎�ث����������������������������⏎�ڢ�������������������������咜������Ꮞ�ۣ���������������������������������ļ�½����������Į�����䐗�������������ɱ���������ϳ���������䑐������㛖�ޫ��ά����������׵���������������⏏�䭭�ذ���������������������������������������������������������������������������������������㽽��������������������������������������������������������������������ỻ�������������������������������⹹�������������������������������������������������������������������������������Ḹ��������������������������������Ḹ������������������������������������������������������	��߷�������������������������������߷�����������������������������������������
������������߷�����������������߷���� �߷�������߷��������$�(��������������������������
������������������������������	���������������������������������������ﵵ���������������������������������������������������������������������������������������������G::����������������������������G::������������������������������G::������������������������������::�������$�*,,+()(+��������������:�������$�*//.+*)*-������������������������$8�����+)��������������������'G����)%�������������������������,G�������$%�����������������������,F�����$$������������������������,E������$$��������������������������+B��������������������������������'8���������������������������������*'=EEBB�A9���������������������������&'('$$���$%�����������������������������������������������������������������������������������S�+&��20��&%&5��������������	�����������������������������������������������������������������������������������' ��+)����������������������������������������������������������������������������Ib`^`H���-+����������������������������������	���������������������������������������������� ������������������$�(����������
���
������
���	��r��G��"������� ���!���"���#����#����$���$���$�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%��!�$��*2@AABCE@@20/pdf�	

�=N0/=b0/=r����������ͯ���������������˺�����������
����ƹ�����������������������Ų���������������������������������������������إĿ��þ�����������������Ŀ����������������������Ջ������������������������������Ҋ������������u���������������������ҋ������������u�������������틽���������½�u�������������������Ћ�����������þ�u����������������ϋ������������Ŀ�u��������	��ȋ�������������ſ�u�����̓�����
�鎌��������������ƿ�v�����͍���������椣���Ļ�������������ƽ�����̧�������������ʺ������������������������	��������ͼ�����������������������������;��������������������������������ɾ������������������������������ſ�������������������͢��������������������¿������������������͠����
�������¿���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ÿ���������Ͽ����̿��������������������便����������ӿ�������������
������������о��������������������������󾽽�����������������ҽ��������������������������������ӽ����
��������������ƾ�������������ü�����������ʼ���������
������������Ѽ�������������������
������������Ӿ������������������
������������ɻ���������
��������������������
����������Ϻ�����������������
�����������
�������������������%�0�x�����������������x��������������������������x�����������������x������������wvv�wvv�wv	v�wvww���������s��ss��ss������������nonoonnonnonnoon�nn�nn�onn�����������j�kjj��j�j��j�����������gfgg��ggf�g�gf��gg�gg�hg��μ���������b��bb��b�bb��cb�bcbb��ͻ����������	w��b��bb��b�bb��cb�bcbb��ͻ����������	w��_�^__�_��^^��__�__^_^_^��Ͻ����������	w��\]]\[]�\]\\�]�\\�\\�]\\��п�����������w��[�YZY�Z[[�Z[[Z[[�Z[[Z���������������w��Y�XYXYXYY�i���ý������������w��Y�XYXYXY������������棤��������������������z��YY�XYXYX����������������lo��ɰ�������������ϵ�YY�XYXY������y~�������������������YY�XYX�������������~�����ź���������������YY�XY������������������}�����Ǽ�������������YY�X����
����{�����½�������Į�YY�����������xy��������������ϳ�YY����������������wz�����������������Ե�Y������������w�����������������Ե������
��wy����������������ص������������������ww�����������������ٵ�������������������xv���������������Ա������������肃�w����������������ײ�����������w��w���������ٲ������������|��v���������ٳ�����������������x����w�����������޵�����������x����߁v���������߷�����������y���ͫ~vv�z�����෷����������y�ۮ�wvvwyxvx����z����Ḹ��������������w��vw}������vw}�~{���Ḹ����������{vy���������ҧ�}������
������ߝyw�������������
���������{z|����������	��߷
�������߷v}�x������������������߷
��������vy�w������������������
�������yv�x���
������������߷
�������v�y����������߷
������}���߷
�������߷��������%�0�(hh�������������������������(hh�
������������(hh�������������(hh���������&'�&''&'&''&'&'&'&&�'&''���������$��$$��$$������ﵵ� � � � �  �����������������������������������������������������������������������G::�����������������������G::����������������������G::���

���
��
�
�

��������������::����

�









���������������:���



�


�




�,������������������



������������������������������



����������IG������������������



�����������������YDN��������������������


���	���KOoz�������������������

�������������KQ`��������������������

����������WGO��������������������

���������������kBE��������������������
����������@E������������������������������@O���������������������������������@D������������������������������A@������������������������
��D@i������������������������������TUaA���������������������������A��A]��������������������������������_I�y@������������������������Cr���OA���������������������lD���R@S�����������	����Ee����כN@@�FPi������������fD��]B@@BEC@Do��sGU����	��������BUYAALv����TABMUNI�����
�������H@Dd�����^MV�����
�������EB�������
������HHKU�����	���������
�������@LnD������
�����@E�C������
����F@�Dg���������
���@WEd������
����OT����
����������������%�0��������������!���
"���	#���$��r%��G&��"'��(��(���)�����(���	"���	#���$���%��%��%��	%��%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%��!�$��*�2@AABCE@@20/rtf�	

�
R�0/R�0/R�����������ͯ��������������˺������������
����ƹ���������������������Ų�����������������������|��||��||�Ŀ��þ����y������y��y����Ŀ����v���vv�vv��vv󋽳���������s�ߎss�ss��ss�r������������u��p��pp��pp��pp틽�����������u��p��pp��pp��pp틽���������½�u��o��oo�o��oo�r�����������þ�u��o������������Ŀ�u��o�s��������������ſ�u��o������rrsr�q��������������ƿ�v��oo�����������������������������ƽ���oo�����������º������������������oo�������¼������������������oo������
��þ�����������������oo����������¾����������������oo����������¿������������������oo�������������¼��������������o�����
�����
���	��������������������������à���������������������������Ÿ�����������������������������������������������������������������������������������������������������������������ÿ��������������������������������������������	�����������
�����������������������������������������������������
����������������������������������������
����������������������������
�������������������������������
��������������
�������������������
��������������������������
���� ����
�������������������%�0�������������������������������������������������������������������������������������������������������������궥������������������������������������韟�������μ�����������诜������튱������������	w��������������ͻ����������	w��������������Ͻ����������	w�����������튴�������������w������������������w���웡��ý������������w���؛�����������������������������������z�����������������������ɰ�������������ϵ���������������������������������嵵����������ź��������������������������������������Ǽ�����������������
������������½�������Į�������������������������������ϳ�����������􊉇������������׵����������������������������
������������	�����㮮����������������������
�������������������������㽽�����������������������	�������
���	�������������������ỻ������������������������������⹹�������������������
��������������������������������Ḹ����������������������������Ḹ������ࢡ�����������������
����������������
���������������������	��߷
�����߸��������������߷
������������������������������
�����������
������������߷
�����������������߷
���� �߷
�������߷��������%�0�������������������������������
�������������������������������������������������������������ﵵ��������������������������������������������������������������������������G::���������������������G::���������������������G::����������������������::������������������:�����ߴ�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ii�hgfee�fgg�������������������������������������
���������������������������������
�����������������
�����������������
�����������������������������
�����������
������������������������������������������������������������
���������������������>��	�����������������	����������
��������������
��������
�������	���������
����TT�7������
������
����������
�������
�� ��
����������������%�0��������������!���
"���	#���$��r%��G&��"'��(��(���)�����(���	"���	#���$���%��%��%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%��!�$��*�2@AABCE@@20/txt�	

�	dV0/dj0/dz����������ͯ��������������˺������������
����ƹ���������������������Ų��������������������|��||��||�Ŀ��þ����y����y�yy����yy����Ŀ����v��vv�ߐܐv�vv�r�����������s��ss��ϣss�ss튼�����������u��p��pp�Ρpp�pp틽�����������u��p��pp�ދދp�pp�r����������½�u��o�o�oo�o��oo틿����������þ�u��o������������Ŀ�u��o�pr�������������ſ�u��o����������������������ƿ�v��oo�����������������������������ƽ���oo�����Ǘ��Ǘ���ꖔ����zyvvwyz}~������oo����	������¼������������������oo������
��þ�����������������oo�����œ������Ŕ�������|zz��{|}������oo����������¿������������������oo���������������������¿������������������o��������Ð�������������������������	��������������������������à������������������������Ÿ����������
����������������������������������������������������������������������������ÿ��������������������������������������������	����������������������������������
�����������������������������������������������������
��������������������������������������������
����������������������������
���������������������������
��������������
�������������������
��������������������������
���� ����
�������������������%�0���������������������������������������������������������������������������������������������������������������������������󴢢������������������򟟱�江��󉱪������������񜜯�ݾ������ͻ����������	w�������ݽ������ͻ����������	w����񚚭�筚��퉲������������	w����񬙙������п�����������w������������������w���엉����������������w����������������棤��������������������z�����������������������ɰ�������������ϵ�����������嵶����ا���������������������������������ź��������������������������������������Ǽ��������������������峲�������������������Į�������������������������������ϳ���������������������������������������׵����������䯮���������������������
������������	���������������������������
��������򫬬�⫫����������⫬��㽽�����������������������	��������������	�����
������⩨�������ỻ������������������������������⹹�������������������
������ᥦ��������������������������������������������Ḹ����������������������������Ḹ���������ᢢࡢ����������
����������������
���������������������	��߷
�����ߠ��ߠ���������߷
������������������������������
�����������
������������߷
�����������������߷
���� �߷
�������߷��������%�0�������������������������������
��������������������������������������������������������������ﵵ��������������������������������������������������������������������������������G::����������������������G::�����������������������G::�������������������������::������������������:�����ܟ������������������������������������������������������������������������������������������������Ľ�������������������	���������������������������������������������������������������������������½������ӵ������������������������������������������������������������������������������������������������
���������������������������������������������������������������
�����������������������������
�������������������������������������������������
��������������������������������������������������
���������������������������������������	�����������������	����������
�������������������������
��������
�������	���������
����������������������������
������
����������
�������
�� ��
����������������%�0��������������!���
"���	#���$��r%��G&��"'��(��(���)�����(���	"���	#���$���%��%��%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%��!�$��*�2@AABCE@@200video�	

_v�00v�00v�������ͯ���	���������˺������	����
����ƹ������	���������������������	��������������Ų�����	������������������������	�������������Ŀ��þ����	�������������������Ŀ����	������������������Ž����������	��������������ļ�����������u��	���������Ž�����������u��	������������������Ž���������½�u��	�������������ƿ����������þ�u��	�������������������������Ŀ�u������������������������������ſ�u����������������������ƿ�v�������������������������������ƽ��������������º�������������������������	������¼�������������������������
��þ����������������������������¾����������������������������¿��������������������������¿������������������==VV�V�=������
���<V�FHHGHHGHH�IV��<����������������à�;;TST�
��T��;���������������Ÿ�;;TST���������TST;���������������:�SRR�
�R�S:�������������������������99SRR�
��R��9���������8O�P���������P��8����������������������88OOP�������POO8���
������7�NMN�
��NMN7����������������������6�NMM�
��M��6������������򽾘�44JIK�����������K��4�����������������������33JIIL
LI�J3���	�������������33HH�H�3���������������������1H�F����������F��1�������������00DDE��������E��0��������������󼻻����..DDC��񊉉����CDD.��������������������--BB��������BB�-����������--BBA���������A��-����������++>>?���������?��+�������������������**>>��>�*��������))==}~�}~}~}}�~==�)���������))==;>
>�;��)������''!!:~
~�:��'��!k!�&I
���������������	������������������������	��������������	�������������������	��������������������������	�������������������������	�������������������	���������������������	���������������μ���������	���������������ͻ����������	w��	����������������ͻ����������	w��	������������������Ͻ����������	w��	�������������������п�����������w��	�����������������������������w������
������ý������������w��������������������������������������z�����������������������ɰ�������������ϵ������������������������������������������������ź���������������������������������������Ǽ������������������
������������½�������Į�����	���������������������ϳ������������������������������׵�EEii�i�E������������������㿿DDiihXVWW�Xh��D�����������Ce�f�
�f��C����������������㽽AAee������ee�A������������㽽@@cc�������cc�@����������������?c�b��������b��?���������>^�`�������`��>�������������ỻ==^^�������^�=��������������������⹹<<\\]�����]\\<������������
��:\�Z������Z��:���������9W�X�������X��9�������������������Ḹ88WWZW�8�����������������Ḹ77UU�U�7������������෷66UUR���������R��6��������������෷44MNP��������P��4����������	���߷�22MNN������겳���NNM2�������������������߷�11KLL�����L�K1�����������������෷//KLI�����I��/����������������߷�..EEH�������H��.�����������߷�,,EE�����E�,����߷�++BCB���򧨨����BCB+�����߷�**BCAD
D�A��*�����))""?�
��?��)��"�"�'I	�������������������������	�
������������	������������	������	����������	��������������������	���������ﵵ�	�����������������	�������������������������	�������������������������	�������������������������G::���	�������������������������G::���	���������������������������G::���	���������������������������::���	���������������������������:���������������������������������������������������������������™������������������������������™���������������������������������������������	���������������������������������������������������������������������������������������������������	������������������������ڙ������������������������������FFjj�j�F����������������������DDjjiSPQQP�QPP�Ri�D������������������CCffh�
��h�C��������������������������CCff���������ff�C�������������AAede����edeA�����������������@@edc��������c�@�����������������>>__a���������a�>�����������������������==__�����������_�=�����������������<<\]]��������]�\<�������������:�\]Z������Z�:�����������9W�X��������X�9����������������8W[W�8��������77UU�U�7���������66UUS��������S�6��������55NOQ�
�Q�5�����	��������33NON���������NON3��������11LL����LL�1�������//LLJ�������J�/�����������..EEH����������H�.��������--EE�E�-�������++DCC���������C�D+������**DCAD
D�A�*������((!!?�
�?��(��!�!�(I����������������������r��G��"����
��� ���!���	"���	#���$���%��%��%�	%�-�-����)����)�-�-����)����)�-�-����)����)�-�-����)����)�-�-����)����)�-�-����)����)��*��@2�@AABCE@@�2,0audio�	

-��,0��,0��������ͯ������������˺����������
����ƹ�����������������������������������������Ų������������������������������������������Ŀ��þ�����������������������Ŀ����������������������Ž������������������������ļ�����������u�����������Ž�����������u��������������������Ž���������½�u���������������ƿ����������þ�u���������������������������Ŀ�u������������������������������ſ�u����������������������ƿ�v��������������������������������ƽ���������������º�����������������������	������¼�������������������������
��þ����������������Ĥ����������¾���������������ģ�����pu��������¿�������������������������p�~�����������¿������������������������p�x���������
���������p��������������������à�������p��x����������������Ÿ�������p���{���������������������p�������������������������������������p�������������������p����š���������������������������ÿ��p�x����¥����
���������p�vv�������������������������������p�{�~|��������������������������p�{���v����w���������������������쿻��p�{����v���������������������龻��p�{�����v����������������������p�뽺��p�{������|��~��������������pp�vp�����p�{������u�}�������������������pp�vp~uutrp�z������t�u�����������������pp�v{�������z������xz����������������ppt����겉��w�����~xs�����������������pt�������u�����tt���������������t����ə���w����zq��������亗�r�����”���w�����p��������䵺��q���������{z����r����������s{����xu����z���������pry���~yra�0p�trqrpX#�0����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������μ������������������������ͻ����������	w������������������ͻ����������	w��������������������Ͻ����������	w���������������������п�����������w�������������������������������w�����
������ý������������w�������������������������������������z����������������������ɰ�������������ϵ��������������������������������������������ź��������������������������������������Ǽ�����������������
������������½�������Į�������������������������������ϳ������������������������������������׵�������⪹������������������������Ӷ�������������������Ϊ���������������������������ͭ��������������㽽���������й�������������������������DZ������������������Dz�����������ỻ�������Ѭ�����˰�����������������⹹�������Ѩ������Ʋ��������
�������Ѭ����������
����������Ѭ�������ͪ��������������Ḹ�������Ѭ�ƺ����ϸ������������Ḹ�������Ь���־��Ϳ������������෷��������Ь����ڹ����������������෷��媣�����Ϭ�����ڨ����������	��߷���媣������ά�����ݦ���������������߷���窯������Ǭ�����˪�����������������෷����������ê����߯��´�����������������߷��������������Ц���������������߷�������»����֫����������߷���������­����������������߷���������µ����ǥ����������������������������������������	�F��������2	�F��������������������������
������������������������������	���������������������������������������ﵵ���������������������������������������������������������������������������������������������G::����������������������������G::������������������������������G::������������������������������::������������������������������:���������������������������������������������������������������������������������������������������������������������������������������	���������������������������������������������������������������������������������������������!=������������������������������������`1�����������������������������a)�����������������������������;E������������������������������99)�������������������������������6J-l������������������56E>�����������������������3�#b9������������������0�"Fl;�������������������������.5:@t=����������������������,&%48:C`R����������*/�I088N8����������(/�Ɂ.5*A)�������������������&/��Ъ,<���
���������#/����C`���	�������������!/����BIU�������������.����$M9x��������������F�.����$X%�����������#-&.����3BO���������#BDD�0(���FG"��������������!DD�8 ���,&�����������2DD�C

+����9 z����������CDD>

���ڎs����������


3���� w�����
�������

�.����P���������

�����������������������
��r��G��"��
��	��� ���!���"���#���$���%��%��%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%��B�$����$��3��&����'����(����(����(���(��*'������H@@�^J@@�2���J .0application�	

��{.0��.0��������ͯ������������˺����������
����ƹ�����������������������������������������Ų������������������������������������������Ŀ��þ�����������������������Ŀ����������������������Ž������������������������ļ�����������u�����������Ž�����������u��������������������Ž���������½�u���������������ƿ����������þ�u���������������������������Ŀ�u������������������������������ſ�u����������������������ƿ�v��������������������������������ƽ���������������º�����������������������	������¼�������������������������
��þ�����������������vv�����������¾����������������vv����������¿������������������vv��������������������¿������������������vv����
�����
���v��������������������������à�vv����������������������Ÿ�vv���������v�v�����������������vv���v���������v��BAA@??�>==<<;:�9�v���������������vv�Ueedcc�baa`__�^]]\[[�G�v���������v��Qb}{a`__^]]�\[[ZYYXX�D�v��������������v�M_y}x]\[[ZZYYXWWVSKHH,�v�����������罾��vv�I\[v}uYXXWWVUTKC:66��v��������������vv�FXt}srr�UTSNC866��v��������𼽽����vv�BU}qp}}�QG=66��v����������������v��?RQQ�njb86
6��v��������򺼗�vv�;ONNI=6
6��v��������񼻻����vv�7LG=66��v���������������vv�0<66��v�������������vv�66��v�������������vv�66��v������󻺺�����vv�66��v��������vv�66��v���������vv���v������vv�����v��v@����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������μ������������������������ͻ����������	w������������������ͻ����������	w��������������������Ͻ����������	w���������������������п�����������w�������������������������������w�����
������ý������������w�������������������������������������z����������������������ɰ�������������ϵ��������������������������������������������ź��������������������������������������Ǽ�����������������
������������½�������Į������������������������������ϳ������������������������������������׵�������������������������㿿��������������������������������������㽽����������㽽����������������������
����HGGFFE�DCCBBA@�?�����������ỻ�\nmmllkkjihhggffeddccN��������������⹹�Xk�ihhgffeeddcbaa``�J�������
���Tg��eddcbbaa`__^ZROO1����������Pdc��a``__^]\RJ@<<�"���������������Ḹ�L`�䂁�\�[UI><<�"�����������Ḹ�H]���XNC<<�"������������෷�EZYXX}yo><
<�"������������෷�AVUUPC<
<�"������	���߷��=SNC<<�"������������߷��5B<<�"�������������෷�"<<�"�����������������߷��"<<�"�������������߷��"<<�"�����߷��"<<�"������߷��""���������������@��������������������������
������������������������������	���������������������������������������ﵵ���������������������������������������������������������������������������������������������G::����������������������������G::������������������������������G::������������������������������::������������������������������:���������������������������������������������������������������������������������������������������������������������������������������	��������������������������������������������������������||��������������������������������||�������������������������������������||�������������������������������||��������������������������������||�����������������������������||����������������������������������||��������������||��|������������||���|����������||�HGGFEEDDCB�A@@�?�|������������||�\nnmll�kjiihgg�feedccM�|���������������||�Xk!jiihggfee�dcbba``�J�|��������|��Tgh!geedcbb�a``_^[SPP1�|��
��|��Pece!da``�_^^\SKA==�"�|��������������|��L`c!baa�]\\VJ?==�"�|������||�H^!``!!�YOD==�"�|��������||�DZYY�\XP?=
=�"�|������||�@WVVPD=
=�"�|����������||�<TND==�"�|��������||�5C==�"�|�������||�"==�"�|����������||�"==�"�|��
������||�"==�"�|������||�"==�"�|������||�""��|��	�������||������|��|@����������������������r��G
��"
�������
 ���	!���"���#���$���%��%��%�%�%�%�%�%�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+��*��@2�@AABCE@@�20/swf�	

�����$��0/��0/������������ͯ���������������˺�����������
����ƹ�����������������������Ų������������������������������������������إĿ��þ�����������������������Ŀ����������������������Ջ�������������������������������Ҋ������������u����������������������ҋ������������u������������������틽���������½�u���������������������Ћ�����������þ�u���������������ϋ������������Ŀ�u��������	��ȋ�������������ſ�u�����̓��������������������ƿ�v�����͍����������������������������ƽ�����̧�����������º������������������������	������¼��������������������������
����ļ������������������������������������������������������������������������������͢�������������������������³�������������͠����
���������������	������������������������������à�����������������������������Ÿ������������������������������������������������������������������������������������������Կ����������������ÿ������������������������������������ҿ��������	�������������ɾ�������������
�����������������������������������������������ʽ������������
��������������ѿ�������������������������������ż���������
���������������˼����������������
�������������˼���������������
��������ƻ���������
�򼴻�������ƽ�����������
�����������������������������
���� ����
�������������������%�0�x�����������������x��������������������������x�����������������x������������wvv�wvv�wv	v�wvww���������s��ss������������nonoonnonnonnoonn�nnonn�����������j�j��jj��jj��j���jj������������gfgg�ghg�f�gg�f�gg�fg�gg�hg��μ���������b�b��b�b�c�bb��bb��ͻ����������	w��b��bb��b�b�c�bb��bb��ͻ����������	w��_�^_�__^�__��^^��__�^_^_^��Ͻ����������	w��\]]\[���]\\��\\]�\\�\\]\\��п�����������w��[�YZY[Z[[�Z[[Z[[�Z[[Z���������������w��Y�XYXYXYY�i���ý������������w��Y�XYXYXY������������棤��������������������z��YY�XYXYX�������������������ɰ�������������ϵ�YY�XYXY��������������������������YY�XYX����������������͝ukkj������������YY�XY����������������������ɀpligg������������YY�X����
��������|tpmmlk��������Į�YY�������������րwvsrpoz�������ϳ�YY������������������ywtru������������׵�Y�����������yy�z{�����������
�����ށywxx�������	���������������xwwx������������
�����������������vvwx���������㽽������������vvx�y���������	��������uuvv�w�
��	���������uuv������ỻ���������������tuututuutv�������⹹���������}ss�vww�x�
���������rr���
�������������urr�t�������������Ḹ�������������ߓsrsr������������Ḹ��������ٙrr�v����������
�������{rsqqr�������������
��������rrq����������	��߷
���������ssrr�����������������߷
���������srr�w����������������
���������sr����	������������߷
�������������������߷
���� �߷
�������߷��������%�0�(hh�������������������������(hh�
������������(hh�������������(hh���������&'�&''&'&''&'&'&'&&�'&''���������$��$$������ﵵ� � �  � ��������������������������������������������������������������������������G::�����������������������G::������������������������G::���

�����

��

�

��������������::����












���������������:���



�


�




�,������������������



������������������������������



�����������������������������



�������������������������������������


���	�������\RTU�����������

����������������XGJMNN�����������

���������������I@ACFHJ�����������

������������������N@?@@ADS������������
�����������h@@??D����������������������������@@�C��������������
�������������O@@�A����������������������������@??@y����������������
����	���Z??�@�������������
����������??�@BB�D������������������x??�A�������
�������������A??�A��������������������??�A������������
��������Q??�DEE�F�������	����??�������	������E??�B���������������	��������v??��������
������>??�F���������
�������N>?>>��������
����?>�x�
���������
�������??>>�w������
����?>>�E������
����>?`��	��������
�����������
�� ��
����������������%�0��������������!���
"���	#���$��r%��G&��"'��(��(���)�����(���	"���	#���$���%��%��%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%��!�$��*�2@AABCE@@2.0rar�	

�#�,.0�@.0�P����������ͯ��������������˺������������
����ƹ�������������������������������������Ų������������������������������Ŀ��þ�������蚭����������Ŀ�������笘�������󐽳��������������������퐼�����������u������𔕔������ꕔ��������������u���������撓����퐽���������½�u����𑒒������쒑�����������þ�u��
����
�쒑������������Ŀ�u��
����
�쒐�������������ſ�u�����������
���������������ƿ�v��������������������������������ƽ����������������º������������������������	������¼��������������������������
��þ����������������Đ������������¾����������������������������¿����������������������������������������¿������������������������
�����
������������������������������à������������������������Ÿ������������������������������������������ș�������������������������ə���������������ٔ����ș����������ᨬ�����Ǚ���������������ߴ������ƙ�������������������ݴ�������������ř��������������������ߴ�������������Ù�������򼽽�������������������Ù�����������������ߵ���������������������������ݷ�����������������������������޷����������˿����������𶻗�����ݸ��������������ʾ��������������ݸ�������������ɼ�����������������ܹ�����������Ȼ������񻺺���������ܹ����������Ǻ����������ϔ���ϔǹ�������������������������������������������ŷ��������������������@�q�����������������q��������������������������q�����������������q������������pq�pqpqqpqq�pqppq�p���������n�����������j�kjjk�jkjjkj�����������g��g�g����gh�g�gg�����������d��ۂd�dd��c��dd��μ���������a``aa��aa�����`�aa�`��ͻ����������	w��_^_��^_^�__��_�_^^�_^_��ͻ����������	w��\]�\�\\��\]��\�\\��Ͻ����������	w��[��[\\{��[�[�[[�\��п�����������w��
Y�XY
Y�c���������������w��
Y�XY
Y�c���ý������������w��Y�������������杞��������������������z��YY�������������������ɰ�������������ϵ�YY�������������������������YY����������������ź���������������YY����������������������Ǽ�������������YY����
������������½�������Į�ll�����������������������������ϳ�ll�����������������������������������׵�ll������������������������㿿ll������������l��������������������������㽽ll�������������㽽llk���w���������������k������
��j�~z�����~}}|�{yy��~~j���������ỻii~j~~�j~i������������⹹hh||�LQQ�T�||h������
��g���Ucc�[�uug��������e�~�Uss�����ss�c�ssf��������������Ḹee}}�U������j�rqe���������Ḹcc||�Unn����oo�b�ppc�����������෷aa{y�U������m�ooa�����������෷``xx�W{{�{�j�ll`�����	���߷�^^xx�W{||�������}}�l�kk_�����������߷�^^wv�Xggil�����lii�a�ji^������������෷\\uu�Xxyyz����Ӄ{{�n�hh\����������������߷�[[ss�Xqqr����́rr�i�ggZ������������߷�ZZrq�Xll����ll�f�feZ����߷�YYqjq���qjfY�����߷�XXllkj�ihhgg�fee�daa�W������WWmkmjihhgg�feedc�ac``W���UVWVUVVUWVVUUVU�WUWVUVVU?��������������������������������
�����������������������������������������������������������������������ﵵ����������������������������摦���������������������奏������������������������������������������G::�����������������������������G::����������㈉�����������������G::���������������������������::���
����
������������������:���
����
��������������������������������������������������†�����������������������������†������������������������������������������	�������������������������������������������������������������������������������������������66�������������������������������������66�������������������������������66��������������������������������66�����������������������������66����������������������������������66�a���������������66X�=��������������55XX�`����������44C@FHFFDCBA@�?FCC4���������������44CQCC�QC4��������������22BBJ##�$JBB4��������1D�I%//�)I==2��
��0C�I%;;�����;;�/I;;0��������������0B�I%FF�F�4I::/��������//AAJ%88����88�/J99/��������..@@I%FF��FF�6I88.��������-->>H&AA�����AA�5H66-������������,,>>H&AA�����AA�5H66-������++>>H&1148���ϼ844�.H55+�������))==G&>>�@K����LAA�7G44)����������((;;G&::�Q���Q::�4G22(��
�����((::F&66�^�^66�1F11(������'':Q:XX�:Q1'������''665421�0//�'��	����&&:6:55442210/�.2..&��%�&%%&%%&%%�&%&&%?�����������������
 ���	!���"��r#��G$��"%��&��&�����%�����&���"���#���$���%��%��%�%�%�%�%�%��8�'��8�(���)�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+��*��p@2�@AABCE@@�2.0tar_bz�	

"�.0�.0�����������ͯ��������������˺������������
����ƹ�������������������������������������Ų�����
����������������������������Ŀ��þ����������������������Ŀ�������瘘���߬�����񘐽�����������������𩕕𩕕���𩕐������������u�����敕�����𔕔𔔩𔕐������������u�����擒��𒒓���𧒒�����������½�u���������������쒑�����������þ�u��
����
�쒑������������Ŀ�u��
����
�쒐�������������ſ�u�����������
���������������ƿ�v��������������������������������ƽ����������������º������������������������	������¼��������������������������
��þ����������������Đ������������¾����������������������������¿����������������������������������������¿������������������������
�����
������������������������������à������������������������Ÿ������������������������������������������ș�������������������������ə���������������ٔ����ș����������ᨬ�����Ǚ���������������ߴ������ƙ�������������������ݴ�������������ř��������������������ߴ�������������Ù�������򼽽�������������������Ù�����������������ߵ���������������������������ݷ�����������������������������޷����������˿����������𶻗�����ݸ��������������ʾ��������������ݸ�������������ɼ�����������������ܹ�����������Ȼ������񻺺���������ܹ����������Ǻ����������ϔ���ϔǹ�������������������������������������������ŷ��������������������@�q�����������������q��������������������������q�����������������q������������pq�pqpqqpqq�pqppq�p���������
n��nn�����������j��kjjk�jkjj�kkj�����������g������gg�g�g�g��gg���g�����������d��d�ddc�d�΂d��d�dd��d��μ����������a`�a����a�`a�`a�aa��`��ͻ����������	w��_��^�__^�_�__��^_^�^^}�^_��ͻ����������	w��\��\�]\��\�\\]��\\�\\�{\\��Ͻ����������	w��[��{��{�\�[�[�[��[[����\��п�����������w��
Y�XY
Y�c���������������w��
Y�XY
Y�c���ý������������w��Y�������������杞��������������������z��YY�������������������ɰ�������������ϵ�YY�������������������������YY����������������ź���������������YY����������������������Ǽ�������������YY����
������������½�������Į�ll�����������������������������ϳ�ll�����������������������������������׵�ll������������������������㿿ll������������l��������������������������㽽ll�������������㽽llk���w���������������k������
��j�~z�����~}}|�{yy��~~j���������ỻii~j~~�j~i������������⹹hh||�LQQ�T�||h������
��g���Ucc�[�uug��������e�~�Uss�����ss�c�ssf��������������Ḹee}}�U������j�rqe���������Ḹcc||�Unn����oo�b�ppc�����������෷aa{y�U������m�ooa�����������෷``xx�W{{�{�j�ll`�����	���߷�^^xx�W{||�������}}�l�kk_�����������߷�^^wv�Xggil�����lii�a�ji^������������෷\\uu�Xxyyz����Ӄ{{�n�hh\����������������߷�[[ss�Xqqr����́rr�i�ggZ������������߷�ZZrq�Xll����ll�f�feZ����߷�YYqjq���qjfY�����߷�XXllkj�ihhgg�fee�daa�W������WWmkmjihhgg�feedc�ac``W���UVWVUVVUWVVUUVU�WUWVUVVU?��������������������������������
����������������������������������������������������������������
����������ﵵ���������������������������������������������������叏���ܥ��줏����������������������������������������G::������䋋�������������������G::������䉈�����������������G::����������������������������::���
����
������������������:���
����
��������������������������������������������������†�����������������������������†������������������������������������������	�������������������������������������������������������������������������������������������66�������������������������������������66�������������������������������66��������������������������������66�����������������������������66����������������������������������66�a���������������66X�=��������������55XX�`����������44C@FHFFDCBA@�?FCC4���������������44CQCC�QC4��������������22BBJ##�$JBB4��������1D�I%//�)I==2��
��0C�I%;;�����;;�/I;;0��������������0B�I%FF�F�4I::/��������//AAJ%88����88�/J99/��������..@@I%FF��FF�6I88.��������-->>H&AA�����AA�5H66-������������,,>>H&AA�����AA�5H66-������++>>H&1148���ϼ844�.H55+�������))==G&>>�@K����LAA�7G44)����������((;;G&::�Q���Q::�4G22(��
�����((::F&66�^�^66�1F11(������'':Q:XX�:Q1'������''665421�0//�'��	����&&:6:55442210/�.2..&��%�&%%&%%&%%�&%&&%?�����������������
 ���	!���"��r#��G$��"%��&��&�����%�����&���"���#���$���%��%��%�%�%�%�%�%��8�'��8�(���)�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+��*��@2�@AABCE@@�2.0tar_gz�	

M!�K.0�_.0�o����������ͯ��������������˺������������
����ƹ�������������������������������������Ų�����������������������������Ŀ��þ�����������蚭����������Ŀ�������ꘘ���笘瘗����񘐽�����������������𩕕������敕�������������u�����𕕔�𩕕攕�𔔩攕�������������u�����擧��𒒓����撧������������½�u��������������쒑�����������þ�u��
�������썑������������Ŀ�u��
����
�쒐�������������ſ�u�����������
���������������ƿ�v��������������������������������ƽ����������������º������������������������	������¼��������������������������
��þ����������������Đ������������¾����������������������������¿����������������������������������������¿������������������������
�����
������������������������������à������������������������Ÿ������������������������������������������ș�������������������������ə���������������ٔ����ș����������ᨬ�����Ǚ���������������ߴ������ƙ�������������������ݴ�������������ř��������������������ߴ�������������Ù�������򼽽�������������������Ù�����������������ߵ���������������������������ݷ�����������������������������޷����������˿����������𶻗�����ݸ��������������ʾ��������������ݸ�������������ɼ�����������������ܹ�����������Ȼ������񻺺���������ܹ����������Ǻ����������ϔ���ϔǹ�������������������������������������������ŷ��������������������@�q�����������������q��������������������������q�����������������q������������pq�pqpqqpqq�pqppq�p���������n�����������j��kjjk�jkjjkj�����������g���g���gg��g����g���g�����������d��d�ddc�d�ۂd�dc��dd��d��μ����������a`�a����a�`a�``a�aa��a`��ͻ����������	w��_��^�__^�_�~__�^_��^^}�^_��ͻ����������	w��\��\�]{��\�\\]|��{�\{�\{\��Ͻ����������	w��[�{��{�\�[�[[��[���\��п�����������w��
Y�XYY�Y�X���������������w��
Y�XY
Y�c���ý������������w��Y�������������杞��������������������z��YY�������������������ɰ�������������ϵ�YY�������������������������YY����������������ź���������������YY����������������������Ǽ�������������YY����
������������½�������Į�ll�����������������������������ϳ�ll�����������������������������������׵�ll������������������������㿿ll������������l��������������������������㽽ll�������������㽽llk���w���������������k������
��j�~z�����~}}|�{yy��~~j���������ỻii~j~~�j~i������������⹹hh||�LQQ�T�||h������
��g���Ucc�[�uug��������e�~�Uss�����ss�c�ssf��������������Ḹee}}�U������j�rqe���������Ḹcc||�Unn����oo�b�ppc�����������෷aa{y�U������m�ooa�����������෷``xx�W{{�{�j�ll`�����	���߷�^^xx�W{||�������}}�l�kk_�����������߷�^^wv�Xggil�����lii�a�ji^������������෷\\uu�Xxyyz����Ӄ{{�n�hh\����������������߷�[[ss�Xqqr����́rr�i�ggZ������������߷�ZZrq�Xll����ll�f�feZ����߷�YYqjq���qjfY�����߷�XXllkj�ihhgg�fee�daa�W������WWmkmjihhgg�feedc�ac``W���UVWVUVVUWVVUUVU�WUWVUVVU?��������������������������������
�����������������������������������������������������������������������ﵵ�������������������������������摦������������������菏���奏収������������������������������䌌�������������G::���������䊋��䊋������������G::������䉟������㈟�������������G::����������������������������::���
�����������������������:���
����
��������������������������������������������������†�����������������������������†������������������������������������������	�������������������������������������������������������������������������������������������66�������������������������������������66�������������������������������66��������������������������������66�����������������������������66����������������������������������66�a���������������66X�=��������������55XX�`����������44C@FHFFDCBA@�?FCC4���������������44CQCC�QC4��������������22BBJ##�$JBB4��������1D�I%//�)I==2��
��0C�I%;;�����;;�/I;;0��������������0B�I%FF�F�4I::/��������//AAJ%88����88�/J99/��������..@@I%FF��FF�6I88.��������-->>H&AA�����AA�5H66-������������,,>>H&AA�����AA�5H66-������++>>H&1148���ϼ844�.H55+�������))==G&>>�@K����LAA�7G44)����������((;;G&::�Q���Q::�4G22(��
�����((::F&66�^�^66�1F11(������'':Q:XX�:Q1'������''665421�0//�'��	����&&:6:55442210/�.2..&��%�&%%&%%&%%�&%&&%?�����������������
 ���	!���"��r#��G$��"%��&��&������%�����&���"���#���$���%��%��%�%�%�%�%�%��8�'��8�(���)�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+��*��@2�@AABCE@@�2)#folder_closed�	

:)#)#/���ss��}}���������~}|}�����������������}}���������~}|}����p
p��������������~}|}����������¾����ًy������������~}|}������
���������ꆅ��������~}|}e�����������}e�����������������pp�S�������������������񼖀_e���������������撑������������u�n~������������������������������������t�i}��!��s�`}����������������������������r�k}������	����������������r�x}�������������p��}��������������������~oƜ~�������������������������~o�~�������������������������~n��������������������
�����~m��~����������
������������}l��~��������}l~��������������������������}j��z�����������
������������|i��z������������{i��z������������{h��z����������������	��{h��z��������������{g��z�~�~~~�~~~�~zfzz��~~}}~~�}~~�}~~�zfzz��}}�|}}�|}}|}}�{f{{��||�}||�}||�}||}}|}zezz��||{|{�|{{�|{||{�|{{yev�kkjklmnop�qxzel{!{�oz\;j!j�dW(����������������������������������������������������������������
�﫨������������������������������������櫞�������������������������ÿ
��ı��������������������������ÿ��ϲ��������ؽ�����������հ�����p�׼��������������������¦_}�ջ�����������������������򽼼���~�Ӹ����������������󻺻������z�ӻ!�����z�Һ�����������㻺�����������������������к����	�����������������Ϲ������������Δ�͸�����������������󹸸��Ц�˷�����������������������������ụɶ������������������������Ѧȶ�������𶵶����������������������Ŵ����������������ij!�������²����������������������������������������������������������������������������������������	����������������������ˡ�������������������	�����ˠ�����������������������������������������
������������������������������������	�����������������������������������𦥦��������������������������������������!�����N�!���r(�������������������������������������
������������������������������������
���������������������������������������������������̏����������������������}����������������������՘�����������������������ղ���!���Ӿ���������������������ӹ�����������������������������ӽ��������������߾����������������������������������������������������������������	���������������������������������������������������������������������������������������������������������������������������������������
���������������������������
���������������������������������������	��������������������������������������������������
�������������������������������������������������������������������������������������������������!���p�!���(�	������%����������������`*����#�����$����$����$����$��
��$���%��
��$����$��	��$����$����$����$����$���%���%����$����$����$����$����$����$����$����$����$����$����$���$���'e�!��܂$$99:;;=99�=;;:99$//Layer 5�	

,�//�//������
����Ҵ����������
������	����ü���s���������̽���%�x�������	��������x������
������������Ҽ�������x�������	�����ü�����̷����s��x����������̽�����ů������r�������	����������ª������������
�������������Ҽ�����§�������� ������	�����ü������̷�����ħ������������������̽������ů�����ũ����������������	�����������ª�����ܭ��������ڸ������������������Ҽ������§�������������������������������̷������ħ�������Ϭ��������ݸ�������޶������ů������ũ�������־����������������������������ª������ƭ��������ڶ����������������§������ӳ���������£�復��������������������ħ�������Ш���������ݸ�����������������������ũ�������ֿ����������������˹����������ƭ��������ڷ����������������������������dz���������¤��復���������������
����˷����������ݸ�ﹺ����������������������̾������������������˹�����������������÷����������������������������ƺ�����祦��������������������������ý���𹺻��������������������������������������������˹�������������ֿ����������������������������վ�������������������������������������ս�������������������������������ս������������������������ֿ���Ӿ�������������վ�����ҽ���������������������������������ս�����ѽ������������ս���н���������������������ֿ����Ӿ�����н�����������������������������վ�����ҽ���Ͻ�����ս������ѽ��׾�����ս����н���������Ӿ������н����������������������ҽ���Ͻ����������������������������ѽ��׾�������������������������н���������������������������н�������������Ͻ�
�������׾�
���������
����������
������
������������������
������������������
�t�������������������'�y�������������������������y������
���������������������y����������������������������t��y����������������������������s���������������������������ս����������
�������������������Ժ������ ����������������������������ֻ�����������������������������������ؽ������������������������������������ս��������������������������������������Ժ���������������������������������ֻ������罹������������������������������ؽ�������֪�������������������������ս�������������̱������������������������Ժ��������������׵������������	�����ֻ������軽��������������������
����ؽ�������װ��������������������
�������������͵����������������������������������ض��������������������������������̻����������������������������
�����Ҿ��������������������������������������ɻ���𲴶��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
����������
��������
�������
�������������������������������
����������4��~���������������<�������������������������������������������������������������������������~��������������������������}��������������������������:#(���������������������������������������2U����������������������������N���������������������������������������������������������������������	������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
����������������������������������������������
����������
��������
�����������
������9����������������������������������������������&�����'�����(�����)����*����+����,���,���,���,���,���,���,���,���,���,���,���,���,���,���,���,���,���,���,���,���,���,���,���%��&���%���%�������������������(/unknown�	

0(/0,(/0<������ͯ������������˺����������
����ƹ�����������������������������������������Ų������������������������������������������Ŀ��þ�����������������������Ŀ����������������������Ž������������������������ļ�����������u�����������Ž�����������u�����������������˳���~z��������½�u�������������ʛ����yw��������þ�u������������ɛ��샂�{y���������Ŀ�u������������ɭ��뛹�������������ſ�u�������ޒ�������������������ƿ�v�����������Ä���������uom��������ƽ�����������������º���pn�����������������	������¼���mk�������������������
��þ��plr��������Ĥ���������¾�zrr�����������ģ���������®~{z�������ٳ�������������������������¨�}z��������������������
����������	��������������������������������à��������������������������Ÿ�����������������������������������������������������������
��������������������������������������������ÿ��������������������������������������������������������������������������������������������������������������������������񾻽�������������������������������������������������������������������������������������������������������������������������������������������������������������������� �����������������������$�(����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������μ������������������������ͻ����������	w������������������ͻ����������	w���������������н���������������	w��������������湣�����������������w���������繣�좡���������������w������ˣ�����Ȥ�������������w��Ǯ����������氣�������ž�������������z��������������⣣�������ɰ�������������ϵ������ϣ������������������������������������������ś������������������������������������ӽ������������������
���������ɗ����������Į��������������͜�������������ϳ�������������������ǟ���������������׵�����������͢������������������
�ߧ�������������������������ţ������������������������������������������㽽����������񴣣�����������������������ⴣ������������������������ỻ�����������������������������⹹����������ڣ����
�����������٣�
��������������٣������������Ḹ���������������������������Ḹ��������������������������������������������������������	��߷�������������������������������߷�����������������������������������������
������������߷�����������������߷���� �߷�������߷��������$�(��������������������������
������������������������������	���������������������������������������ﵵ���������������������������������������������������������������������������������������������G::����������������������������G::������������������ֿ������������G::��������������������������������::�������������������������������:����������������������������������������������������������������������������������ϴ��������������������������������ڽ������������������������޻������������������������������׫�����������������������������൭��������������������������������㹶����������������������������༸��������������������������������������������������������Ŀ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������	��������������������������������������������������������������������������	���������������������������������������������� ������������������$�(����������
���
������
���	��r��G��"������� ���!���"���#����#����$���$���$�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%��!�$��*2@AABCE@@2img/src/toolbar.pxm000064400000147300151215013430010277 0ustar00PXMT_DOC�HEADER@@N�#\����METADATArp>streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_IMAGE_ZOOM_�����NSNumber��NSValue��*��f������_MASKS_VISIBLE_RECT_�����{{0, 0}, {0, 0}}�����_DOCUMENT_SLICES_�����NSMutableArray��NSArray�������_PX_VERSION_����� 1.6.5�����_DOCUMENT_WINDOW_RECT_�����{{370, 43}, {460, 821}}�����_PRINT_INFO_�����
NSMutableData��NSData���z�[378c]streamtyped���@���NSPrintInfo��NSObject�����NSMutableDictionary��NSDictionary��i����NSString��+NSHorizontallyCentered�����NSNumber��NSValue��*��������
NSRightMargin�������f�H�����NSLeftMargin�������H�����NSHorizonalPagination������������NSVerticalPagination������������NSVerticallyCentered�������NSTopMargin�������Z�����NSBottomMargin�������Z��������_LAYERS_VISIBLE_RECT_�����{{0, 0}, {239, 240}}�����_DOCUMENT_SLICES_INFO_���������PXSlicesPreviewEnabledKey�������������PXSlicesVisibleKey�������c�������__OLD_METADATA_FOR_SPOTLIGHT__���������	colorMode�������layersNames�����'����	magnifier�����plus-circle�����Untitled Layer 24�����arrow-in-out�����Untitled Layer 18�����Untitled Layer 23�����Untitled Layer 22�����Untitled Layer 21�����Untitled Layer 20�����Untitled Layer 19�����Untitled Layer 17�����Untitled Layer 16�����Untitled Layer 15�����Untitled Layer 14�����Untitled Layer 13�����Untitled Layer 12�����Untitled Layer 11�����Untitled Layer 10�����Untitled Layer 9�����cursor�����Untitled Layer 8�����Untitled Layer 7�����Untitled Layer 6�����Untitled Layer 5�����Untitled Layer 4�����open�����mkdir�����	arrow-090�����home�����Untitled Layer 3�����folder�����lock�����fwd�����back�����Untitled Layer 2�����dropbox�����astersk��Ғ���Untitled Layer������keywords����������
csProfileName�����Generic RGB Profile�����resolutionType�������
resolution�������d�H�����
canvasSize�����	{16, 576}������PXRulersMetadataKey���������PXSlicesPreviewEnabledKey�������PXGuidesArrayKey�����!��������PXGuidePositionKey������������PXGuideOrientationKey������������������ ���򆒄�������0���򆒄�������@���򆒄�������P���򆒄�������`���򆒄�������p���򆒄������������򆒄������������򆒄������������򆒄������������򆒄������������򆒄������������򆒄������������򆒄������������򆒄�����������򆒄�����������򆒄�������� ���򆒄��������0���򆒄��������@���򆒄��������P���򆒄��������`���򆒄��������o���򆒄������������򆒄������������򆒄������������򆒄������������򆒄������������򆒄������������򆒄������������򆒄������������򆒄�����������򆒄�����������򆆒���PXRulersVisibleKey�����������������_MASKS_SELECTION_�����I�[73c]streamtyped���@���NSMutableIndexSet��
NSIndexSet��NSObject��I������_ICC_PROFILE_NAME_��⒄��_ORIGINAL_EXIF_���������{TIFF}���������ResolutionUnit�������Software�����Pixelmator  1.6.5�����Compression������������DateTime�����NSMutableString��2011-07-14 21:32:17 +0400�����XResolution�������H�����Orientation�������YResolution�������H������{Exif}���������
ColorSpace�������PixelXDimension������������PixelYDimension��������@������*kCGImageDestinationLossyCompressionQuality������������PixelHeight��������@�����
PixelWidth���������F������{JFIF}���������
IsProgressive�������YDensity�������H�����XDensity�������H�����DensityUnit��������{IPTC}���������ProgramVersion�����Pixelmator  1.6.5�����ImageOrientation�������Keywords������ProfileName��⒄��DPIWidth�������H�����{PNG}���������XPixelsPerMeter�������������YPixelsPerMeter��������������	DPIHeight�������H�����
ColorModel�����RGB�����HasAlpha��4����Depth�������������_DOCUMENT_LAST_SLICE_INFO_���������PXSliceMatteColorKey�����NSColor���ffff�����transparent�������PXSliceFormatKey�����PXSliceFormatPNG24������_LAYERGROUPS_EXPANSION_STATES_�����'��������_STATE_�������_ID_�����;CD8727C2-6F67-41DA-8C2F-CE505FAB2C7A-33087-000042107C96E923����������������;073F11BF-5069-446D-96FB-EF109F02CCFA-36602-000097AE2DC51F2F����������������;C1363BFB-193E-443A-AD0B-8511BC409A6F-29548-000069B198A631CA����������������;E356DD92-C0F9-4B5D-A211-BF39349433F9-39289-0000E9437ACCF231����������������;AE2104D9-B13E-4B14-8BAB-AAC3D8FC40DC-35862-0000E8AD7D2189BE����������������;011BEE3A-A0BC-4226-8CA7-E8E364BF9B8F-39289-0000E916B841A7B5����������������;75D3E968-C599-48F5-9D1C-F977157F4291-35862-0000E8D3F98A5DCE����������������;E8447E0C-376F-4BE1-88FB-A14AC09960E3-35862-0000E8D1DEA7B30D����������������;B4F89CDE-801A-440B-969E-B64590186D69-35862-0000E8C65BD08A75����������������;1B3A2DB2-462F-4AD2-8E63-A511531582BB-35862-0000E8B73E50FC4F����������������;3FFF6F4D-C0FE-4904-98E1-7827D4FEDCF8-35862-0000E8AD3A5FD212����������������;D0DA8E89-B9D2-4998-9F23-95DD3F815B1C-35862-0000E8A6A074A808����������������;00D96706-BF0C-46D4-BEE4-2857CF789063-35862-0000E87E2F6439E3����������������;32208EAF-B655-45DF-9226-55D78F3FB892-35862-0000E87BB790E53B����������������;0B7C488D-95A8-4049-8BAA-8422C47BB507-35862-0000E8715334DD1A����������������;51CC2D6E-18E6-45EF-99A5-4FF6D23BBE55-35862-0000E86BF410B247����������������;1721C0AD-21A6-4934-9A35-C0AF5A6197E9-35862-0000E8582FC09B33����������������;67CB2F1B-C59B-4391-BFEC-460CA1DAC141-35862-0000E8437DFE65C3����������������;E49BA826-F158-444C-AFBF-1CA4D6D6540B-35862-0000E8367BC6E02E����������������;016B29D2-3E17-4160-82DC-006092961693-35862-0000E82491257109����������������;07FA941C-3EF9-4B08-844F-07C031BE3E26-35862-0000E80BBC6B937E����������������;2EE02F45-7841-41A0-A750-018CA401B0C2-35862-0000E7FB5A9FB437����������������;FBE60D08-3EA8-45EB-A97E-8900D766368B-35862-0000E7E7482B1C1C����������������;44E6515D-E251-4175-9B8F-8294CF5BCF3F-35862-0000E7E14671DFD3����������������;39BD2F4E-7D1A-40E3-B817-17E9E855E914-35862-0000E7D3E6BF9068����������������;F76A522F-9997-4CF4-A4D4-EC5F801548BF-35862-0000E7B6F42BCBA3����������������;4432BA72-5B16-43E1-8FAE-C9DB651AC51B-35862-0000E7ADCFEA1C98����������������;949F4C82-6AAC-4CDB-A190-63EB00C81A5D-35862-0000E78DF34A65F5����������������;37C2B011-5587-42AD-B6F5-E2FD07E267E8-35862-0000E6D9B27AA223����������������;50233FD7-2823-4014-A50C-15D5CED50E6C-35862-0000E77FA392AB78����������������;1D033B45-E2B1-4EFE-92B1-5DE8681F61F7-35862-0000E6DE7A0CC3B3����������������;7A84FC86-36E9-493B-B9FB-A28B63C1F9C5-35862-0000E6FDE0068401����������������;9F7F1C9B-8752-4969-ACB6-46386249F9BA-35862-0000E72809E9F8C2����������������;AEE77F80-5E50-4A57-A909-0A342561B8F1-35862-0000E71BC4FCE99A����������������;259ABD1D-DCA0-411F-85F3-2554EE05CA0B-35862-0000E71385F4E1E8����������������;79085DED-F38C-4141-B3C8-ACCE9C02F7B3-35862-0000E70831DA0DFC����������������;E6893B39-1C08-487D-BC79-EC6F986BFCA4-35862-0000E6F3C79F84A3����������������;7888F9F4-C832-4179-880A-C90CA687A5BC-35862-0000E6E7B2620386����������������;D91B76BE-DBDA-4627-9D50-7A221D5C4584-35862-0000E6C9040FDCBD�������_IMAGE_VISIBLE_RECT_�����{{-167, 0}, {429, 779}}�����_LAYERS_SELECTION_�����8�[56c]streamtyped���@���
NSIndexSet��NSObject��I�����GUIDES_INFO8! 0@P`p�������� 0@P`o��������	COLORSYNC00appl mntrRGB XYZ �acspAPPLappl���-appldscm�desc�ogXYZlwtpt�rXYZ�bXYZ�rTRC�cprt�8chad,gTRC�bTRC�mlucenUS&~esES&�daDK.�deDE,�fiFI(�frFU(*itIT(VnlNL(nbNO&ptBR&�svSE&jaJPRkoKR@zhTWlzhCN�ruRU"�plPL,�Yleinen RGB-profiiliGenerisk RGB-profilProfil G�n�rique RVBN�, RGB 0�0�0�0�0�0�u( RGB �r_icϏ�Perfil RGB Gen�ricoAllgemeines RGB-Profilfn� RGB cϏ�e�N�Generel RGB-beskrivelseAlgemeen RGB-profiel�|� RGB ��\��|Profilo RGB GenericoGeneric RGB Profile1I89 ?@>D8;L RGBUniwersalny profil RGBdescGeneric RGB ProfileGeneric RGB ProfileXYZ Zu�s4XYZ �R�XYZ tM=��XYZ (��6curv�textCopyright 2007 Apple Inc., all rights reserved.sf32B���&�������������lLAYERSvN'$
'V*�-�0�45�9';�>�@�DGMI2K�N�QCT�V�Y�\�`Tc�f�j�n:qxt�wnz�~��s�W�������q���(H1	magnifierd';CD8727C2-6F67-41DA-8C2F-CE505FAB2C7A-33087-000042107C96E923@x���Kq�o�֮坧�\��c� S�Oz(H$H�G&C�'>����F��&����͘5��R���ٔH1�����z|�u*����y}v�n撰,[(��]���)�r/�ҙ�h_��<�����xx���-�?�7�|�T�>�sC��(eOF�=�����nj�gvk����C�����"B���)�%2�I%b�4�7)ua��as�<�8�Nhl A��~zT#�9'�$��I�3���/���y�M�o�~=�v�,��A7��p�kom�U���������EɃn��f��咑��7��0�ˤ��"�$����j���Y7z�Q]�:|�������A�������~/���B7�n�{�gϗ��:��J^���;��0�Q/��.wn{<���.�4J��J�y�~mu�ۓ�w��$E�z�����cݭ(�mD��a�q�qܯ�:P�@p�R@w�}��+`�dPn:�SD ��:�h&�a��a�J�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;28AB29AE-B765-4EB6-B0A8-07613C8C6A5E-33087-000041DE5865A2E2���!plus-circled';073F11BF-5069-446D-96FB-EF109F02CCFA-36602-000097AE2DC51F2F@Q�x}��KSq���6���l&
	������mJ]�C-	r7�
� �n"VDuQ*�jEP(QPi�p7y3e7p�9w��}�∬���>���S�[v�k=x��L4���83v�q�16U��"N�c>�����HW�����:\��T!��p��O������*����ǒ�hh��^7�ZA��b�^��eH���M���~���;��/!�:Ӭ�aU��]>�īʟC�qT�ds+���O���U�*b�P�0��ć��܀���K������N�;��v����n'�>���*b�lH������:���Q:��L&C�����f)�������u�#�S�êHeȞ�-�ڞy)�JQ2����������ǽ8��𗏵/4酇���-�w]�bǠc{ح�aU��4���r�-����9�p�\��mS;�R�*Rj2X�#���OoY:G�L�k�p�Θ�
�����b�Ֆ�G�l+Rܯ�*��d�y�3h��tt�eeG��ˇ��(5����7>͹,���W����0�.Ci���f�۲vK`�7�8�*�vJ�2�����x�p8%%��(^��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;28AB29AE-B765-4EB6-B0A8-07613C8C6A5E-33087-000041DE5865A2E2���

Untitled Layer 24d';C1363BFB-193E-443A-AD0B-8511BC409A6F-29548-000069B198A631CA@y@x���k�PƓ�&%�c���:q2���$��Ip�"d�V������"+�A7ġ'�Mr�.�Bi��������wy�BA_.���N���h4��p8��xL����3h�vg�6�#�L&i�^�I"��Q�ֲ��f��u�6T6���f�E�`0�_��t���n��r-\b*��\쏃v��R�ոƇ��~�^�T*u���&�	��s�E����p�j��c~�|~B.]��+�
�{�r�s]�:�ΛeYO���<�v;�G��aHUUo�ZQ��w� ��h<���j�^F����b0C� �b�_p� ����L�|�#�_�$)c��,��K����7t|��bA�R�@(`��{�E���x�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;28AB29AE-B765-4EB6-B0A8-07613C8C6A5E-33087-000041DE5865A2E2��!arrow-in-outd';E356DD92-C0F9-4B5D-A211-BF39349433F9-39289-0000E9437ACCF231@�x͏�KTQ�]h��
�(àLiH	�4A�1��Q*�`�(�F�&"��T���Z���1
Q۸p!��$�H���g��߁;0a�x���;s��Yq����o���Dėgr����>����龠cÖti�Sf���_/e��x�Ϧb�˙�{���ذ5�����[q4�w��
�О:�!���K���f���57T<Sy&x{�6��B��
��v�j;�͍t���'b~����f�T������P8��V�6v@�E������v��Noc4YD���N��M)����͂�m��7D�^s9[;��&��x�w�?���zcB�ʰ�m��˗D��<7��>٦��t6��c��҅K�6ӹV�$\8-�&�|ǡ&�J6^�F4�a)/�B_B��/XFЩ��ڷ�
:6�~	?��~0�o���x;�tl"fb���@��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;28AB29AE-B765-4EB6-B0A8-07613C8C6A5E-33087-000041DE5865A2E2��)�Untitled Layer 18d';AE2104D9-B13E-4B14-8BAB-AAC3D8FC40DC-35862-0000E8AD7D2189BE@�x���KSq�7��w]��F�у��0�Й�_Pa��PQ
�]�$�ʼn�EV"Hk�}�=�bZ�R��z*��t�W./�|�}���{�C�n&	�^��U��|>3[�Ba�R��\.������
��Ul�����mk?�v���w��QG�fo���}��h�T�C=����y�	�V�`<�
+����!3Zٶ]�d2�FzWZ�?|���K(�J����Z�dF�G�$���q[���*5�Ë0�̢�o�חq~,���H�n�Z�6�C�z�����Bf�����Ԡ�d�B������3���H�n��N����H<E��)�^���Et�� 3Z���h�H�q"Ul�{��q�(w
��`0h���ܟ�i�a�l6[���z�=�6r���	2I�d��g�1yF����ݾ_=:�~n�W�$��~/i$�$FZI;�:�D"}ܛ$B(��7P
��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;28AB29AE-B765-4EB6-B0A8-07613C8C6A5E-33087-000041DE5865A2E2����Untitled Layer 23d';011BEE3A-A0BC-4226-8CA7-E8E364BF9B8F-39289-0000E916B841A7B5@d�xŋ�
�0��VQ��P8�j�
�$'��#	�-�fDl���-:�7����+�J_AU���
��E�s!*ݻ���"��4����\i�����streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;28AB29AE-B765-4EB6-B0A8-07613C8C6A5E-33087-000041DE5865A2E2��Z�Untitled Layer 22d';75D3E968-C599-48F5-9D1C-F977157F4291-35862-0000E8D3F98A5DCE@�x��OH�a��/u�Px(��-sA#����E6d�T�-c�?�S�F��b�Ny+��
]b˜��Q�?Lp�
FA��>=�/n��0�/x��yo��amj�N�p%��WEc��~ˍJe��C�W��_}!��d��kH=�d�O[tnT*h4�z�ͬ����w9��f�Q��{/ſ?�c��)>]=��%��X*�nT*�UIq�����+
���aUKC}�3�7*�����ROf�G�&/��� �$�I�zC�?Y��r�]<nhma������z$��qY1t��`3�fg19���1�(#���F��@��rb�ݎ��=�9+���0��&M�r�^���ʮ�z�8�Z�a��*o��&�l6�V
nT*�,����uн������3ߙq�R�o'%VBuX���{j�e|�;3nT*s�>{�ǍZ�ʹY��:lYnT*;��|[���?���U�B�M�f���Jy�뉬����l	},���[n�U��e�R
�򀾛�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;28AB29AE-B765-4EB6-B0A8-07613C8C6A5E-33087-000041DE5865A2E2����Untitled Layer 21d';E8447E0C-376F-4BE1-88FB-A14AC09960E3-35862-0000E8D1DEA7B30D@�x��AK�p��]�7���{���E��{"CEEE�"��h��O"
�(((���?�	�������\.��OA���_{�H$:�~߽��.�v��C�4(����;득
Mŗ����k�l0��T*(�ːe�R	�B�\�l�t�T
�d�x�$!�"���8�%�^dC���~��I����F��݊v�9�VdȲ����-6���Ȑ
7�����je�����j�ڟI�2d�7�[.����"C���=,l�[L�S��u��ysRֹ�j���Ȑ�z�������Vd�z<���dQ1��d�d�
�j�z�X,����Ȑu��ϴ�x<��<χ���e���u�:�3���TI��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;28AB29AE-B765-4EB6-B0A8-07613C8C6A5E-33087-000041DE5865A2E2����Untitled Layer 20d';B4F89CDE-801A-440B-969E-B64590186D69-35862-0000E8C65BD08A75@��x��MKQ���;������K�"�E�C������ ��M�dN��`��b��X���sh-؅��p���˵�l~�۽���	9�f4�5
(�:dY�s��J�I�P,Q��ýȣ���^+������zw��<r���,2���4R����8b�"���0B��� L&���.r}>��|>G㳅��
���(�c�|ꘅ��n�@�I�����l��d���#�0&��t��WKf�EQ����x���)��;t:΢�ΒC�x�C�o8.r�u�\ǣ�O�����m��8xWx~���<?�r�N��`0@�����
S�> �U��n�W�����\.3�!��p��z=�J%$�I�?�E5�%�\��~���R!�\�ټm�X��p������.ᘬ���F��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;28AB29AE-B765-4EB6-B0A8-07613C8C6A5E-33087-000041DE5865A2E2����Untitled Layer 19d';1B3A2DB2-462F-4AD2-8E63-A511531582BB-35862-0000E8B73E50FC4F@��xc��T���g@4�K2��eP�.�|3� �hPp$��Fc0N{��~���:�\�Ĺ�~��������P� �ޞ��f��>�o5A�t�K���������K�������G�7m��PL�~�{A
�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;28AB29AE-B765-4EB6-B0A8-07613C8C6A5E-33087-000041DE5865A2E2��)�Untitled Layer 17d';3FFF6F4D-C0FE-4904-98E1-7827D4FEDCF8-35862-0000E8AD3A5FD212@�x���KSq�7��w]��F�у��0�Й�_Pa��PQ
�]�$�ʼn�EV"Hk�}�=�bZ�R��z*��t�W./�|�}���{�C�n&	�^��U��|>3[�Ba�R��\.������
��Ul�����mk?�v���w��QG�fo���}��h�T�C=����y�	�V�`<�
+����!3Zٶ]�d2�FzWZ�?|���K(�J����Z�dF�G�$���q[���*5�Ë0�̢�o�חq~,���H�n�Z�6�C�z�����Bf�����Ԡ�d�B������3���H�n��N����H<E��)�^���Et�� 3Z���h�H�q"Ul�{��q�(w
��`0h���ܟ�i�a�l6[���z�=�6r���	2I�d��g�1yF����ݾ_=:�~n�W�$��~/i$�$FZI;�:�D"}ܛ$B(��7P
��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;28AB29AE-B765-4EB6-B0A8-07613C8C6A5E-33087-000041DE5865A2E2��H�Untitled Layer 16d';D0DA8E89-B9D2-4998-9F23-95DD3F815B1C-35862-0000E8A6A074A808@��x��OH�q��֡0�PХ�Ӧ��t�F �(k�+�C�ilRm� �
�0��ꚒҡV���a�^�(a�Tl���>����A���><��G–M���n
�h�nM�7�E#�"ߡq���p������6�r�~�8�uh$U�N��=��]l׈w���~��SD#�2r�f<��ڈ�2u�$�`��4��c4�*7hV���˥��R�3v��;���
'��:��ˑ��񸷖�v��g��<v�Z�<}�(��
���r;��,�Zy*����ZN&��J�x�[��}u�S�C�FR%ZGs���<���7�����_�sh�N�u��t梋�H�\��wF�/����&u&Шm6��;ӥ�ÌFRe���W���r[~�����:cg��Jx/-d��x}�c�)آm�P�;�h$U��Ћ�����z+�]�u����Kh$U��S8�̬G����s9q�hّA#)��L��J�:v��U��-�b�X%�O������\�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;28AB29AE-B765-4EB6-B0A8-07613C8C6A5E-33087-000041DE5865A2E2���yUntitled Layer 15d';00D96706-BF0C-46D4-BEE4-2857CF789063-35862-0000E87E2F6439E3@��xc��T���g@4�K2��eP�.�|3� �hPp$��Fc0N{��~���:�\�Ĺ�~��������P� �ޞ��f��>�o5A�t�K���������K�������G�7m��PL�~�{A
�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;28AB29AE-B765-4EB6-B0A8-07613C8C6A5E-33087-000041DE5865A2E2����Untitled Layer 14d';32208EAF-B655-45DF-9226-55D78F3FB892-35862-0000E87BB790E53B@X�x�ѿKa�q�V�%hh��� Zggq�3�ApDH��[""��_d"dX6x45IX�Q�����x��>�4��]���q����Nm���Z-����h4����8<��T*5�����!�l6+�rٜá��z���l
esT��%�N��y��]K��c��8�Q6ǵZM�ɤd2s.Υ�iw�+�;��e�l��jU\�]	]6��R�H�X\	]6����}YD�C����J%Y,�2��"ѡ�F�����%�Ht�Q6���,� x�D�.es���$�����9�l����z���I$:t�(��N�$�X�[]ņm\����M,���c�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;28AB29AE-B765-4EB6-B0A8-07613C8C6A5E-33087-000041DE5865A2E2���qUntitled Layer 13d';0B7C488D-95A8-4049-8BAA-8422C47BB507-35862-0000E8715334DD1A@X�x�ѿKa�q�V�%hh��� Zggq�3�ApDH��[""��_d"dX6x45IX�Q�����x��>�4��]���q����Nm���Z-����h4����8<��T*5�����!�l6+�rٜá��z���l
esT��%�N��y��]K��c��8�Q6ǵZM�ɤd2s.Υ�iw�+�;��e�l��jU\�]	]6��R�H�X\	]6����}YD�C����J%Y,�2��"ѡ�F�����%�Ht�Q6���,� x�D�.es���$�����9�l����z���I$:t�(��N�$�X�[]ņm\����M,���c�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;28AB29AE-B765-4EB6-B0A8-07613C8C6A5E-33087-000041DE5865A2E2���
cUntitled Layer 12d';51CC2D6E-18E6-45EF-99A5-4FF6D23BBE55-35862-0000E86BF410B247@h�x��1Hq�;�[j�p�/p��!jh�;
:�!(�p�hth��tj鈠���Q\���Zz}ߥC-=������ߓ�-��Gx��;ޒ�wT؎���a�\�}�V�c�4���7f�v8P�d2Ͼ�D:��4�M����xc�Yv��
M��`0�FB�nW87��Q(�f�$�eE7b�vUU�-�˯a�L�X�'�-����E;�f�aWQ#������ �Ǒ�鉜F��7b�va��M��m��ކá�Z-9�m��8���o�0���Qa=�H��_�5�^�^��m����NǍY`�3)Xv��
��r��
o�����,/��?�Yt��7�T��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;28AB29AE-B765-4EB6-B0A8-07613C8C6A5E-33087-000041DE5865A2E2�������PUntitled Layer 11d';1721C0AD-21A6-4934-9A35-C0AF5A6197E9-35862-0000E8582FC09B33@3x}�OH�q���-Hx0hY��Y
��0lcelBQ��(�СAv��E�A�u�67f8�r:WZ:K]�?9�wZ����Ź<��{>�o����;7�dJ�r���i1�R��� 1�
��>�^D�DF{��owr�

�W`ڭ���@h�A��N�y�m��e���	po�E>)��6_���~N��l�O�A��	U�y�´3��U7�=�,�%E�yϖ�Bh�@w�
��K��겭W��G~�d��ߔ��H8�O}-9���ތ���J��gkn�^��^![�Dy~]2��qoƍ!O;*�*�u�a�S]m'U����s��&���asw��������;�B=�"�ޞ�#���N��6���[q�?���\.ג��̡mwُO��ذ{?���&��Ƨ8f��	g�E���ăt�m8��`ii��
�awwI�Pc�6�?;�=��;��]t

Mx�z�c�%e�,J��������r��
_l�{�ptw���ߨ�e�®�R�/�{Tk�u,=Gё��I�/�y)ܥ�e2��?�-��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;28AB29AE-B765-4EB6-B0A8-07613C8C6A5E-33087-000041DE5865A2E2���AUntitled Layer 10d';67CB2F1B-C59B-4391-BFEC-460CA1DAC141-35862-0000E8437DFE65C3@��x���	A/�{
>./�&r��A��=��L�*��aYWƂ�g��ae���b��*�������	�;4{�#�ޢ�s�7��{��s�H���<0Â�zo�Xpޣ���=���΄|��*���bڱ;��I���$��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;28AB29AE-B765-4EB6-B0A8-07613C8C6A5E-33087-000041DE5865A2E2��&����0Untitled Layer 9d';E49BA826-F158-444C-AFBF-1CA4D6D6540B-35862-0000E8367BC6E02E@�xc����|�L�ұa)!.����T>����������??����oZ�$'-̭T�`�V���w`���;����c�[&��t������?s�<��@-(d6.{�l��¦��v�q���b�0 ��˛���;�lf��rP+�b�%`�p[�:�V0��[��=8�����_^?���]X���W�Q�j-@�`h�X������A1d�콰���X'�.�V0��ǻ;�?<9�a���[����\4'���/?������f �{zu��[�ܴ����/?>���90ܰ��l�5��z�?��`P+�������+X�@�wb�ó�`���F�s�Z���䗟��
wX�@���p3P�1�/�>=���5�f�
@~����� w��
P����^m ��� 3Af�� 5@��Ƨ5S�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;28AB29AE-B765-4EB6-B0A8-07613C8C6A5E-33087-000041DE5865A2E2���
 cursord';016B29D2-3E17-4160-82DC-006092961693-35862-0000E82491257109@jx��KKQ��qd.*i^����$��ܸk#��"B$��&R����E?@B�~���E��N�I�8��0�{��9'�N�D�Q3�&�Ba�q�sM������.ض}A�Ei%r��!�3,˺TUu�]׏h�c�f�����f;���0�>�K����Z�^+���%�T*u�ݗJ�r#�r`F2�<���r�|KF
�/�D�ۜ�d�ɝ�b��.V_��m�h4����C>�v���D����[*��8��p8|c�)�vX�Q �S�X,އ�aG�7��n��z���%��E���I����}<O��RZ��$��
f0��gFp3�̃WC�)h�P�����G�j���4�C(���[�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;28AB29AE-B765-4EB6-B0A8-07613C8C6A5E-33087-000041DE5865A2E2���Untitled Layer 8d';07FA941C-3EF9-4B08-844F-07C031BE3E26-35862-0000E80BBC6B937E@wx��kH�Qǧ���&+����Xin��%+��B��L��m��t�V���P��Vtі*�/}�"P�PA !]�P�5����yN��A?����x�Ñ�ETTtLZZ�,;Ik�ã�8g�@�Z#��	�����I iM{tF�]���X�d�}��5o�����k�85ť5�љ���]�������]y	�uWA���X��v��߂��� �����ri�.F�H(h`�cPu�	lo}�����㝒�3�������	C�ڙ���yjT��~�A���|30뙆��Aa��\��Ę��ge5�B�������0?������|��o�`���|�C.Vb�#�0�]�r�K���8
���|?��C��
��������i��Pm���(�/���
�A}xg�A��tb��m`ێ݇|Sh�=\��0���4Un��rb��X��
Zs���Z'�BA|�Q�f�:'���XE+kvc[�8����!�^�^�چQ΢�J�k���u�6�!����A3
�8��v�r�W�|���dQe���R��/))BGRR��D�e:��u�Ͽ�q68nK�o�-�e��R�C	UTL�;Z(d�#ݥ�T&��~����streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;28AB29AE-B765-4EB6-B0A8-07613C8C6A5E-33087-000041DE5865A2E2��RUntitled Layer 7d';2EE02F45-7841-41A0-A750-018CA401B0C2-35862-0000E7FB5A9FB437@�x�NKhQ}���O3i2��Z'�i�Hn�݈B�Pۺ(Ժ.�(h�GW%V\�ٹ*��"�X�X�"C! �ВՠA�n��1�k=px����	 �L��F�&��9�16a��MF"�mo��,�&b��].��av8��u��1�f<�+���d2v0�t�;u��A��7��pG��i[Q/×��>$O�LM��j�*u]��@�/w��m����p]WZ���T*y]갷D�O��(��&���C��\j�V�����TN-R���y�|�/tu~2�����oK�z�|����~T����N�9��C]X��#�������g?�?��}9'���rw�r�~�؞��K�<{������[����	�c�H���-�r�N�7>/�d�ݯ�Xz�N��|V�5C�]�1XMp���xû�i��/�`�A����a�5���s�_�N�Y��3�d�������޶����"�~�L���0
f�_`�y���-L�	P;A�����kP����^�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;28AB29AE-B765-4EB6-B0A8-07613C8C6A5E-33087-000041DE5865A2E2��#�Untitled Layer 6d';FBE60D08-3EA8-45EB-A97E-8900D766368B-35862-0000E7E7482B1C1C@�x��[(�qƿknD)��J�Y��S��BJ+�)\�q�F9J��W�H͍h� e�֖��0
�>�9���Z�o�SO��>���s�ܤ�jyVl����Cp�OUeK�?���`��;����҂Y��/&"T�cAU��鱟�����{p��������c���$Um���t
��Cư�,�ac����P���ȏ�z�&���O]AB�۳\�ZƠ���&��9΀��1�Q=	����]�U���Q��"Y���x��1�*��]�ڃ�Pg�25�$��.���"C�9�}��F��L�Ҕ	ʻ�F�Э�B`!Í7��ej�H����ޏ&�Ю
A`!Ã�B�1��Q����1h����.bz�Q��,C:ۭ���j+��<�"��>��:c���BG��\��D����6�g�&�Ì���һ|��@38+�_}�\�)��8��v�48�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;28AB29AE-B765-4EB6-B0A8-07613C8C6A5E-33087-000041DE5865A2E2���Untitled Layer 5d';44E6515D-E251-4175-9B8F-8294CF5BCF3F-35862-0000E7E14671DFD3@�x��]HSaǝDb&�ЎzQt��Vv�7EDwI��}0!���&fB]K��M]Y�3S7)?V�N.�Μ��<�pn;gskZ���@��y�E�"�ß��<��yy�y�E��ׄOx���8VRRҔ����

vu���҅������BO	yyyykYY�	@D:TI�^�YYJ�3o2�y73�l�|��i��džնŹ�,�"����+��v&�c>���Z(��\�t�}��D�ÕęgcBA���|��e_N=
n�iAi7�iշ�V+��, "A�,m���mg~&�����iF�Z��"�Ũ�r��, "�"��'F\��ί�(�%%D3|�9�J�{���q���@['9Ӱ����~��M�'��w��GA���ۍ�)J���7"RMq�2j�H �pپ���B���/�y�aԑ�mf��Y@D���6٬N���$����k�����#?�8��-�]���m��a�D$�5�Gn-��7|����:�_�D�$fu�
��̀�t�Zz�6c�4d�����f-Ia-�Z�B�e�Z�����g	j�Gj���?�oj�N��H�����Y@D��n�(
�t:��j�J�B
���r�T*I��=����h$�B������ �eY�p8Ђݎf�h�z�h�y^ϡز}�Ed�`��Rp5X&�Hn™s�߆^θ'�W��;�'�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;28AB29AE-B765-4EB6-B0A8-07613C8C6A5E-33087-000041DE5865A2E2��P�Untitled Layer 4d';39BD2F4E-7D1A-40E3-B817-17E9E855E914-35862-0000E7D3E6BF9068@x3W�2�KLJ���TpoS��_����/ϯ�����O�.����<�:��?H���*P9�5�����w�O�s����va�'g��|f�������:ian5��o����ͭ����jƁ�]p�᥷�X*}{���Ggp�r�/ �@-( �J��;�?<9���~�Z�j�\������x��)H-P
��U�����.�5/ �@-( �^��LJ{�?=���P܂����G���@��_^�iF���~�c�;�Z�jAqN�??���0��0�{E���'�
;_���D�I �_^_�0�ps��%a�=��/z�_���R�����@�`��=�ק����_43<�O�S��
L���A���"���oo`���:�ی�����]��]a�F&��h�*����<�2�A~c`����.���]��Ud����kN.
1?�[��T��"��	00!(O�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;28AB29AE-B765-4EB6-B0A8-07613C8C6A5E-33087-000041DE5865A2E2��:
�opend';F76A522F-9997-4CF4-A4D4-EC5F801548BF-35862-0000E7B6F42BCBA3@�x���KSq�G%�<�"�@�@�A�EVӴ_ԅ]T�+#(�Ғ��F%!j�,m�/�eiYs��E,
us��)���E7�O�s.|=7�������g[����<��Jdֶ�=y��P;���
?D:�ǟ�ſ�A0+�U� 9څ���x�T�����ٯ����|���{̏�r��9��X��O�>�RQp�k��?��_r~z�%o�VLO��RQ��{q�s#�
9{�'��T�!���T�t�w��%C9�V��g�߾��kvJͤX�jyc�r�TC,��₼�y���ӵ���N97_,�t�kq~��fR�ku��N9�=����'`^j&�Y�)yw4�fȹ��aL�m��u�y���׳��>>Ɣ�cȹ��&�ܷ�y��*X�M|h�d_�!熳1hUL���&�j��Lv�dVW��#��+K�~�6�
�Gt{�r�����
eέko�.��{��dB�ݲ�o��Wm߱9�BaNf�mE�l�x��`�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;28AB29AE-B765-4EB6-B0A8-07613C8C6A5E-33087-000041DE5865A2E2��"�mkdird';4432BA72-5B16-43E1-8FAE-C9DB651AC51B-35862-0000E7ADCFEA1C98@�xc�ui�Pce�Bb0H-P
0Q�)zys�Wv�� 5 �@-(�D���	P���x1H
H-P
0U�){|i�['��� 5 �@-(�L�����o[��Ԁ���s��g6��~x9^RRԂ�b5�N����R��ѹM �5@-(�\��������[�?������
������*O�m��.횇���{i'�
R��<���O_�����ց%�7ή��-UyZ���@��y�����_�:����8�J����A2Bk�R���:�E��;����yQ��m���w��zJ�m���	�ΠP`r&�N�t�0���
����9�����֪<=@���3e�Ϩ��
���߮��㦄�?�n_�>��,8�V�{2P;(g�q���߶���30���mH�Ը��2�������&�0�wj��w�T9��Æ2��������streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;28AB29AE-B765-4EB6-B0A8-07613C8C6A5E-33087-000041DE5865A2E2���
�	arrow-090d';949F4C82-6AAC-4CDB-A190-63EB00C81A5D-35862-0000E78DF34A65F5@��x��M(�q�wɅ�˼���I�2�K!�<��0��PR�8Ɋ�֒��ppP��_����"Y)ٓ���w���ԧ���ׄ�ޠ����_���./Y��+�k'��L�*jreO�A��x�A�r����T�$�+����|�O��p�w���"+^v�e���r�7_���;��\'�-z�N�ioO�C�_�Ɖ�	�vN��u��vg��=}��ה�n��z�m83���Ρ��dm�8vYp8!�;��T�f�*M\�p4U�g8S��QI'|�ո��n���V�`q����*�Eg�U�oԊ�G��R��L�j��qBٔ����x��꿈"���8=z�+/V|ș{2��!�Ajɔ_L"#�4�w�U��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;28AB29AE-B765-4EB6-B0A8-07613C8C6A5E-33087-000041DE5865A2E2��dhomed';37C2B011-5587-42AD-B6F5-E2FD07E267E8-35862-0000E6D9B27AA223@"x}�_HSq��������)���V>,�-�%F�i�3�|����p"Z$�`�A� �R�H,X)F6�Ejɔ��Ʒ�ҍ�{v~���l*����xu����O���t�w��G��b���O.m"����m^����ҳ�t��̹����y�����#���Y��2j�>��֫\�Gz>o\M�/������Jho��.�%�ۡ[
��7��swi�O�G�3trm�H6"���ƌܨo������\P�G�A��m�f��c�Oq~�Y�ד_ܹ�oP�G�Al����y'B�4�%���R-�+?~[�wS?���W�l��t��A)��U��Uz�eI����|����.O�71����d7�ٛ�T���j{%����rj��~�����k�����qA2��<1(!�Z;^'��/�H��Wz��K*�@�A�'�ޟ]7�M��u��|H�K�<2��<1H�Ju���c@�v�kQ;�5S�K`�gwy�R�?
S�L�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;28AB29AE-B765-4EB6-B0A8-07613C8C6A5E-33087-000041DE5865A2E2���Untitled Layer 3d';50233FD7-2823-4014-A50C-15D5CED50E6C-35862-0000E77FA392AB78@Ȁxc@|\�����z=k+nop935�|Y��J���P	C��\Lg��L ȉp)e�hT̪�YvbE��g�|�}s�Ǻ�^Z��xU���@��-��g@�D��%���{*#&�����º�k�O��ye����~~�����Pew��`�
X��,�E�3"r;�&��ߴ��cע|�kJ���v�������� 6H�Dx�$���R�s[s�&�y�t�h�x���"Pcʲ�3�N��|G��w�z���@)0��T��RI�5�I�ШP��1
����X̂,�3�z_�k�G{��Ā�` �Ϯ`�+g�j���@!8(�Q�9+E�:��� �Mn�x�3�$��Uq.cY{q>6(�P9�|g��������� 1
��4(�rE�+TĹk減ʇH
�����#X�̋MI�-
��jG�?�F|
P
e����E;��'&z���h��	p1K����O�̻-Q���L��j��{I���x����8�]�ʬ7�$�LH���Ց�rffb`j�:O�3_�'�џ��������M���l��l����S���1�ҙi4�N�/��a7T���a��rW���*��Y�Ǯ����~��a}�.Le���7�P
�4�i*�+~&);%ΜS�ee�Bg
�����H��r�2
���"/x�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;28AB29AE-B765-4EB6-B0A8-07613C8C6A5E-33087-000041DE5865A2E2��folderd';1D033B45-E2B1-4EFE-92B1-5DE8681F61F7-35862-0000E6DE7A0CC3B3@;�x��]H�a�
Zf�
�dwAQ�mt�PT�E7%��"!�i.���u�:0�l�}X�ln*L�,���hQ79�g{�ٴ�w�Ţ�^�q����y��:al��]�`S��Z��j���~��s���vl�-�"��C�fl�O[��Ej�1��M��/:


K�de�*K�d�{e\Y��ݻv�">Ü�NlNt�n|�x��t>�?Aȥ����aO{:�ԤV\��v�㠀1�F(�Բ�S&$��ĈD����W�g�T{�<��L~�[��z�E���		��7���:H$�k��e�:ݷ���Bvel#�ɧ�4b�#d�L��W�w�ƌX25��])��zću���ü�P���h��ozn��61�mClHM4DK4`^�\���j�������6�(
���yq@E���s���\���l٪�2W��{�����Z�����l�
�:��Z�%�}sB�o�_�
p�v�K���3�"�c���9������S�<�MFP���&v��A������5՞K��ݿ��sם>�̱Ѫ��+���f��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;28AB29AE-B765-4EB6-B0A8-07613C8C6A5E-33087-000041DE5865A2E2���@lockd';7A84FC86-36E9-493B-B9FB-A28B63C1F9C5-35862-0000E6FDE0068401@�x���+�q�7��ӌ�b�y�{7�(m�a5��"5��P�Q.�0���YQ[�9�fWRs؅B"=~�_-{m/�SO��|��}���E��n��:\�տ�չ:ʟ����펋��юE$�Rf����G�<����=�[�6\��w���=���=�����u�,��QyR�#���r�&{A��.�2�I�����UD��9��cЏ�+���n\x]\��P�UD������g4]����,�� o�>ɿC3�<�{|R�UD�&!��,�!]���	�A(�L��-~!q�	ڪ&dk�"��j��+*���,�#��
��/�w���փ��h#�
M>
�V�x>�2퇪���>$��l��JoDN��.�W�DD��il|�+s|FӢs�OʲJ89�]��E�ab�dߏ����streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;28AB29AE-B765-4EB6-B0A8-07613C8C6A5E-33087-000041DE5865A2E2���
�fwdd';9F7F1C9B-8752-4969-ACB6-46386249F9BA-35862-0000E72809E9F8C2@[@xc�:�gY���d�-�g@8�B�,36Tڞ��x��o&M��J,��:������>ƒfT��\�gz�zv�����1�?��i(�bƼ�3߁v|>�����wA����v�������`����� ��z�p3f$������m(�wY�+s��������`0�����
���|�����6��3����I�����h]�˂��]��Ϸ���w��۟� 9�+D�.�y[�k���ķS��%Z�e������ ��
/�zA��K�����A��"7IzA��U���s��"
�f��r���,��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;28AB29AE-B765-4EB6-B0A8-07613C8C6A5E-33087-000041DE5865A2E2���
rbackd';AEE77F80-5E50-4A57-A909-0A342561B8F1-35862-0000E71BC4FCE99A@q@xc����b:�g�$�@٘-�g@�%	��I�l��=�Ɋ� (D4�1��YUby����^���
<
�c�䙞��`���;7�?��W����]O4f^���_w������k���X�OG;�<���6>���� �@�`0#I���[��R
��6���,������fj0�طWe��jGM��	�jg�_������W��ď���.���5�����pU��+�?^�����c�B�|;Y��Z���w���q�I��a�F�7��_���	��	�b�I���1�^�g~����B$sy��*W�3 �Le9b"
�0��	�����streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;28AB29AE-B765-4EB6-B0A8-07613C8C6A5E-33087-000041DE5865A2E2��9aUntitled Layer 2d';259ABD1D-DCA0-411F-85F3-2554EE05CA0B-35862-0000E71385F4E1E8@�xu�kHSa�ϙ��q�m��r--�vqZ� ��a�5����*�������4�}0�K����("�T*5Mf�ι��V&Q]�N�߳��?�}.����=����
V��	(�g
��}��~�ϻ�í((g��jj�,+լM4=t�O~���Y>!��'��k�_��W[%���,+�*
��џ�FH�$�����)Bv���p	�o���{h�_�b�d� Q.�Zd���׿��hؕ����e��l~�U��[;u��1��QQID���ȚWДM���K�����kY�tG&��tK�;Z9
.����"�ܶ��*'t��@��ԺA�wϰKW;	�i�;۠�aAD��fܰP���ufq���m�1� /�Q�R����&�A��������~�l����Y
v��8�
���!Akx��)��V��}�Pd^v��Wh���~�΍@�?�	0�vWp�o���P��H�;N����k�j�"��U3�]�`R��k�<ˉ�N����6���[��j������ҽC-���b���U�e��;�C��o�wz'$��8J�‹�Ħ���H3{!ϴ ���-�8p~iu/�6X M���YT�!r��D�'��m�Sz��=�"�>;��ȡ7M�4�1�T�Z`��UF�?aI�/Q.?�'��m�lC;d;�'w�_w��fF"O����4����M�b�+�a%+H::��뎣�Hr�JI^$�a~L=S�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;28AB29AE-B765-4EB6-B0A8-07613C8C6A5E-33087-000041DE5865A2E2���Qdropboxd';79085DED-F38C-4141-B3C8-ACCE9C02F7B3-35862-0000E70831DA0DFC@=�xu�QH�Q�/&=䈰'�e�0l����#(�˴�K(5B��d��F/��!Զ�b���0�[�m�+[���6��ሆ�w~��Ѷͬ����.�لs?���p�
�/e
N}�s���Px̶��Ȧ�g÷;W]�!ܰ���x?^���v�.�wPl�J�`�0�OޅF��w*��H^�_��M���V9|��BN}�?A�BF��t�<�-r����2f�9kGZi��)���zN�2:80|���Ua0���&��k�+��no����$�b1zܤ�����O�zvΰ��Bj6�d�N&����MO�U)��t�^���C�D�f�jr��`8*ԧb�>���F�$I-���F�l*��Y�>zݮ́�PG{��qX^���EkU�]��x<��Щ#O�Z�Q!�v�x�P���=DRO-y۫Xt�����X�Q���Lyi{��>����U#����,2:��U��G��(X�5
[\�hH'�L��5����46�r�@�[�q�.�fҤ�!9��C���7l�tC�����s��=2�d�02:��?1�Ȯ{��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;28AB29AE-B765-4EB6-B0A8-07613C8C6A5E-33087-000041DE5865A2E2��)
2asterskd';E6893B39-1C08-487D-BC79-EC6F986BFCA4-35862-0000E6F3C79F84A3@�@xc@��ґ΀0�N@P� `��R` >�Ϯ�?��+:�$P�� -�4ɐ�g�<;6s�[��؁�>�w���/LD��Aj�ZP�D��3������J�ڛ ��w�V�)�ѱ]9k�M�
���}�$Ԃ�}���Yp�����7=��������-���������'�Ar 5 �@-(�ML�Nȡn�Jƪ�u��8����yŽ�v�o�i�H���+`�0�q�9c�z����k�A����J�Va
;A�2��+���yc1����wLk��z����H
H-P
�m:c5��O�7��κ�_*p�M��#_���Abf���7�r�'H-P
��=c<����s?%|&��7*خ7��O�Ew���@b 9���KX������H��*���
��k���8L��j�����ť�~�`�ݿ��.��Rˀۇ�`0L��ν���J8�����streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;28AB29AE-B765-4EB6-B0A8-07613C8C6A5E-33087-000041DE5865A2E2���#opend';7888F9F4-C832-4179-880A-C90CA687A5BC-35862-0000E6E7B2620386@Dx��\xwm�t��D�����}����p�����03P+��<2���P�|z	�X��¼��@��L��7������5���*!�o�/�o�.��%)�,��.{��ц��7畁�_�~ �
�ޘ]���r��_N,���b����?U$�����������?n�qkQxqI�1`0\�U��@w�������(�|e��4�v�k@w?�2�-�߭m&
�H}	�
 �N,��nc���w[{��Ǻ�jS5�����^��M>՝������,��@��/x���streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;28AB29AE-B765-4EB6-B0A8-07613C8C6A5E-33087-000041DE5865A2E2���XUntitled Layerd';D91B76BE-DBDA-4627-9D50-7A221D5C4584-35862-0000E6C9040FDCBD@@�x�
 ��op��r��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;28AB29AE-B765-4EB6-B0A8-07613C8C6A5E-33087-000041DE5865A2E2��MASKSPREVIEW4�@@4��x�	X�]�wi If2{�4)�2f3f�L�<���B��S%$c��T*MBBf�B�����߽k�z��=��~�y��^�Z׹�a�{����+��jj�'����k��W�7�\-@�-�w���0��m���Ura�I�H��ٺm?]��	PF�^��^a	�Tâ�NT!�����ܼ���'��ܥ?m��K&�399�4۲��"��d/ڱ��e��ֶ]o�Z���ٞ��W��,�ž��w��,L�2bhCN���Hx�4;H��n/Y�A�ߌH�����e�r��Oo�{���Y�L-���/t'��|�L�e�r���B4l=.�U݋}[ �A.[�T���%��Wz��`ӡkT��tʈ� �-J�e�j�w��ы�U�u4h�uʈ� �-J�w���|���Z���p�γ|D �lQR5�f�>e��}X�6wX�O}�����D �lQ�A}�Y/��)�}��z�'��q����J=��r��%U��h޻�z��-�u�C-'��@r٢$5�:�jZR Q��T]��q�b��\Fm�e�?E
�ְ�<e�)�q}��c���=�o���Q�V.�W�S
��ئ�ia��z�0}������E_����@Or��[]MM]_W�\�Һ����/SJ�(�W�r	-M��{�����JY�b�S��m�q{7��r��O��w�5#�䆌���ƜX�-�o���۴������n�~ɝ�Li����M�qg/e���.�(��nʹ���_���g������薗WJ;�J�LZ�.���o<�P�Y��G��d�E�)��&�~�2�`ʠﯗ7S���#�?
�H_ι��'\>���ĘT��s!3������vv
���e�1�u�|���W]�/g�S:/���ӓ�/��귚>�\E�O�f~MO�ep�"��RϬ%��)�Q�}L>��>_�,+�N,����I�Q{|�콈>x/�Œ��I�YA��&%�����E>a�@V�������?�����N���"k��(c�O��(~׬�f�knߥ�-�O�kn�#��j8�gP��c:�\�QA(�B���i|�}�>�(7j<$r�o�5�~|{O_��F��>�C���[��O��C�J�x���rw/%�~R�T�*l�SWӌ�5���x��
��1���C-�7�R�mْ�գ����{��2S�:����w΢��sD�iw��8��C!�?� ðJY�(���:��]���ĘQ��{�7�$j�,��ޙRn�Ͼ�$����ؙ�Ǽ�/���z��ta��f�[�
��|�}�]K��7��Og7ПC�{�UȦn�!Q{��m�P(�w�,UBۚ�2�M��U��m���JA)������3�A���n��3��H�1�+�CB�9��5qp��SZ��3%j6u@���/����YSđ�%U��!�q�3u�{�a8�'��W?�������֜���DL�Ӊ�?�آ�J[��Ff�=�:���:��b��%��!�u��c:��$�!�lQ�VE��e��1w���z?��G�R�1b�ڐ�\���ve�N�ۻJ-W�Hm��1�C���f9�e���{�/}��� �tw���.�Pg����A.[�T��riS�Ȍ&^�d��1��c��fz�}OD��;������EI�����^1d��aF�n�1�N=o�0��xBbhC�lQ�v�Υ,fHK�9�Y��S�]�9�>'�e1��˖<R�,%�n��
���c�Wx�N�q�)�$
}+g]�Ia�X�:�n��ڶk9u��y1� �M�����0䇆ݢ���(#�6N�W
,�z̝7��A��WD+h9��p�t7�2��y��rՂ8�rpH�6oY�xї6l\�JB,�6�<wl��W�	S�*	���dB[~9���yxl���%!�(�6��O����{,x�.N� �-JB�1z"����{ ��e��;yꠘ��xq[L��%��;H�ސ��026��|�H�#Ynj'�_i�@-�L#������ٓ��t}�Y�N&#g��O�Rj����ŏd޴e�E��j��}�I5�ē��	d1u
U?��jK$��S���ed���yo?�i��;�8.����?,��e��.\<��<�?]�Z��$�'Kv,k 9PFm�����tZ�P���Mc�֎N��cV�ϙ�qkF����Er85��8����ucR_oG/֎��}(��X����t�#�-r�rUYlU�?f��ԸN�l=��@2���—H]d��[��V��95�&.j�@
��Kpgrv�ʈ��E�訣i<lr�C�%���޴.$�sz��=�x�{ף�=�����/�Uh���B��A٘���)��Y��S�����ɓ't�w]z|��y�N9�Y����UhF=I�E�sn�kANҳ'�����r��� 3�8�2�

�)�4�>���t~��|��|�R�E��QVt��q*<ljQN2no��O#&7��	�te�E/bh;[�
[��4$U&J�m��|Fz6��i%����;�2
��U����.��K�I{��
�{c�(�б�i�A.[��HG�udu�%�6U��٤}\�&��ڐé�������dBDz�C�$7ʈ��S����JU��c7k]��ם�^w��Ԋ�NI�͇LV�.]��򑚚F��+��o�2)����#�z�L#�m���^��� ��Ff��KjjZu{3�������T{j�EՇ�R�Q����j��=ٻ~��"��di�&����7���z�G��$�iŭ�������,xK���RY�+�մ��p��N���g��j./h���,��">珙/�jaU��jN|I�Ӟ����i�,�?��[�/�jr�e��.��*7�I�բ$*3"��Gޠ2�R��I�����"Ta���]���5�r���YZC"3��L���Sc�
�Nc����x*3��g�
��]iD4-�R�{�����S{��,I�����ש�p*7�1�9�H�P�>���}L�&G�����C5&� I�؜Z��L�G���G��LW�J�=Qvp$՛M�g'P�Q�H�9�j
�,Ӫ�/���z}���Z	iTkׯd�{Tg|�Ē�S4Y�	�"�f��Y��*�+�J8�!u}���b�ŵm�Nhv�M=BH��C2LӶ�����mi��4�T��mҬ?v>����Y^�r�[��R��v�t�<"����ȟi���x��w�>�L��&;��T�>��͖o�F��Ҵ�E��oS�w�x��j�+N��k5��zL5F&-}��,%jŬ%j����x��	��\
��o��Mk8�n���"��mu'�E�R��"�G�N�結�<J�r���f]���L;iN��x�I(s�P�lU���di��|u}}�N��ǂ��ۦ�E���,�����9�OW����_ۿ�'_�\����˝u�|�
y�4�f��w���>=������|��I���wl<��V���8�
�+����M�ģ��9�xj�89�^�L	�Q±��ݟO:��*W˺���9֖~
����;�}���z~���"_���rZ٣�4��pʺԋP�p�dW��Ӓ.U�YW��*����q�߾�p�oɦzq��Vzy��0`,�����1��E��Ϙbl�P��1 #҃����+	�2��H�&Ƅ��]bL�X�6��/�y��ƻ��-�����D�	 =d��1f�U�2���(h�0Wi�Ǿ��ˈ�%9h��0�^��$���po���E�t�Y�3�*�}�t~���sL�8P�	+�V(a��NY����c�-�Y{��c��$�cW�,����N=���;�V�)W���V��|&��0~a�:��n
*:y�XK��ӗ��(;�/Bqn.P��+8�@����� '#���G;��T�rN^�X��^��t�ZB;�8]Im��8mh,���>]�K���ˣ�)|s_z�} E�Aa;�Xzv!�l�kb�����J	�F������"�g[�Z�PK�h�@���
��>�:��e��Ic�zQ�ږ��;���Bka�*�W�:����(qOGB�Å֬�����;���muZSm�K�{��o������:��	��H3N���#�(û5����I�1f��W/qx���T�3�LIF��<cP�-�_"=M���U
�p��gt~i;�qMog8��~q�?��5���q�f<wǼn�����֔�/�x{]��#���m}uV/�U��Z�1������]�O�Z�\�
p;�y��Ʌ���ݔ��A�C�ҷ�-�=|;���R��d���MH����]��m�
���fJw���\�)p��&A'f5�^���Iڃ-��J� �g�P�RZU�Z��>�g�I�&vq���pMs��]�Ihn/㭇�6��<�LIK��mWB�����+aԥi]���&��d<�����ܴ�Y{]J����J��[��7U.�]�ּF+ƾn�����5�[��ͥ�A����t��uX}in�f��*�XۚU��5�ު��V-�/m`(M�0�}]�.$���cT�
�nUk�Ў�'v���XE_ˈ�Bk�Ԓ��I/��w�	�Q�+m�&!��%�nRa͒a��#:MjnR���N�*�$��{5�'�A��zw��|pJ�'�/�b�n�I����V�0ss�Q�YU�����,�\Y�~u$a�zΑ��:P�������etO���񱅍�׎o�ֲ�ް�%�1oh^��R�ìԪ9�+^=9�a�}ӿ��w�R�4Y���p��s˗,V�-JR<Ɨ.�nвN���m��n]V:�e��^溮f��Jh��sʿD����k���€\�(����#�y��C��zi%���WJ���L�e��86�	ag)��a�qb5�4���T�e�y�g�EI6������`�����'�x��#�-Jjl�;/!�E�>&@y���,�J$<�#�EI[�\z��n��sAOztH�g��e����.~�m��P���@W�+�8!�\)
�5�]�6����х��C/��&����J��P�2�#��ߙ��k	�l�������6�-��o�C�|��լn�1�ܡg=(ogO|���q�!�mr57*�)��zx�/��Ǵ ��y��I�g�\����||a=8�E���~�C��]�܊��5f�\Vմ�`rf�O������4�a��m�J�
rْG��hvl\���~�j���p|̹�.��K���V֜ذ��RI!�}�va@.[���t��؇9�e����|��q�Or��%a��>�}� ��\�(��ɹ���r��%51ԝ�}�~A �lQ�b�Ǿ_/����1�<���H�����}��*�v��F�xh�(#�mrY��|��#�=:L��x�s���{�0]�"i���~OO����)���rӺ?Ǐ*L<�̱��_�������A0j� 1�xp|�\y��Qɵl�Ԛ�H:��\ʍ��.b����Ȇi�r3#]W�K*�4��b%5���]�)�ҵ�`�־$=�&�?]��uKna�\�X~��B-V��Ln�/�$���Dپ��n��M�
mk�U�W�S��5��!ƙ�P5�4�WѡK�c ��!��TW���3���׷Q��I�/ї���"��~��cP���w��ל��}��L0}��Eo_�ס���yJ��������7����J�e��z4�5�ۇX��p_e���3����(��]���>����|��r`]��%�iZg��OO(������lQR�f���W!��m�\�(i@�%�?�S�����\�(i`��+�'?�/I�
��-r٢$���d�?�mD�}L??���r"�Yv!lQ��6�2R�Q�;����Gף�	c�՚�oآ���o�?��<}L;3���G��%�
V�z�1c[�Fu0ݞ�����s��i�#aL�
��
��b����y��r|"u��E�$��s�>`��V��=��f��$��.ަ�\�ٶs�A#L�7Nf������e�c��a7��[�afiU;�q�-J���a���1��oU�R%}}}guuuFm���Ɵ-[�*QB˫dI��ܶ�s�V�Vmj�ʕ{�EI6&�߹�kÍc{���{��ctx���G��ݺ*�خ
7}��_�s�lr٢$�9]�ػeٽ�����=~�<�I���	�{�t�����%56�4��gtTh�s��?�x�܉��n�����G�{ܗރ�lQdž�F�޼�ދ�{_x-�z�a=w����u����lQR�J#���l��{U����W	�o��9������`�#�-J��Ƞ@��c{�Þ�
L�q���g�I�O�
	zv�ȶW�wI�G�EI���F�����������#8R���Ϥ���X���Nװk'#��%ٚVt���k��{��o��Na+F���M��fd=��}����\�(�c����}l����~�ډ^>{�&�qh"�;7.��s�DZEIvf]��Fz�.�r�F����	Ob^�F�&D��{���#���G.[�ı��z�������}E0��]�?�N��C.[����1��޴s�N���M�6�…i�ܹ�t�Rruumȩ^��x��T��X�T�				Fw�ޥ�7o҅ӧ(��(�����W�����i<q�$xx�2f�55��<��Jn���)<�x�/�/S7��.8���?�5��|��q�|��:^+�{�Z�d���7))�2�| ?棝��ǩ*�Ӷ�4q�N�y�zruE�m��ۧ�Y;�����c��q���:����>}�.P<v�_����h�/I?�w��o!,�E��v���f�}��8N|y.���w~,K�>�X�3[����c
�U�#���Fq}r��%1���l�x��>�|7���EUi�M��l���Ǽ�_�͐S��qˢ����:�UhBw���c'�#��1Ų���
֙�P�
k�ާ�u��[��ˢ����:��g�02Fw2;�e��O�>��`�9W��s�����)>��//9��Jy�G�k{q�?MU�Tq(]�t.�V�C>�jР�|�c[�}��%r�*W�2e懄�����%K��q�#�RT��e�����՛_�D	�>PG���R�/�>bcc�N�:󵵵E���r��|Ԡ\�r�q,�Q���ŋ;b�:�hg
����>����aÆ�׮]^ĹY���IJZW���h��b���Gs���k���=Mi]���z>��y�g��]�u湏l|=l���.n��:h�Zܡ�'��hG��c����V�M�l� g�c��c��/'l�Q���q���#>�S��o�o���%�LJlU�>�]E��^7��ٟ�%���8��G��%���f�3�OO�����3��:��W��Mr��x��2�G��E9�q��U�b��G�L�20����>��y�8�c�/��|�8,�.&im_CcGﺚ�k�M�9c��d�2՘:L}n��<���1�@�*L%���I�e�
Ley2��O�jU�Z�w�ڵ���|U�~��M�H�����ѓ]_?��:@1��EI�O���J�����w(*4�^>}*@1�9o{H�e���l&JG�ߣF#w�٠-Ԑ߽�w&؍�G6�vQ�!Q��^4|�]B.[�T�z�t��;�"u�uR�w�r��*g��jUn>6�-Jҵ+uZ�z,:'g�7��F�����'JK}C׃��Q��	eʔ�g+�n������.s}�������Rz�gJM�@�>��sg�de��K�2�u�*�k>B�e�&�UO�Ŕ����}�"�����G��l�1*�2��xPlC�[�=�
MNN&ed�+���HO{C�&�U���`i��>d9t;Y8m�:��Y������afZs[��
���|���y�i7d2����됙�lS���f�U����V����f��R?x���N�f�UH�V/)޳������ˁu���6�����Wq[�4�u~۱{���O֝�)ӥ?Y$U����|y��l�*j�k)��rDl��P3��r���	����0����i�<���HZ�S�QR����i�ſ%�q���ttt�V��`<op233[�}�r�H��
�Ѕ�8����EꃯOLb�\&&&K�l�B�bŊSئ$cc�e���ߊ��4����X��,8�@�1~������J�R`��h��+CC���G��!��\N��;��g�q����8U����|�QLL���ݻ{s�F�}ASS3�y*��������M����^��<�)ܬ�(�����νX�b�|�\��C�4bĈ�����9��5࢐��F��G�>}���W�{�~'5F���]����?�]�T�B�-�1�L~Rg�3ط�3�x���b/W�#���ʵ���&�O�ޜ����;�$�^
�>���b.�E��(��e��:�x�<����%���qƍ��[N8o��΅�o��Fzz�[���쏹l*�|/y��[-f��瓟�ߣ��w�mT�����ו�y�Z�]�V�^v�g�|�����d�����X�!m�ױU�sJ����ˡ8߇>kŹ3����U��Ҕס*�P���Ź�H���V!��o�:��>�+=�V���t�<�V!�΍�9��>��>�5����u\�p�uگk���P�������#���<���o�2a]��y]�=�M�(��2�|eB�� �éJ�'ks��0��@��#�I���;����Ȅ�@ӂ��~�QT�*��EE宫�b�FQ��TPNS�b���J�9��L(�f0-H�k/�☢J��g�Sa
 L�)<��7A%cCQ�^�1� 
:�w��^�벲c��9��9����|�]&���X��׆���lQ���x�{�������N}#�S�%��%����8�<n��Ǔ� �Ԭӵ�I���>^�{���$�û�����7�X��q�
���ޡ>��h�t�oht��[�M���_xt��;/�]��^�O�EI���������m]xp���%����O\�.�ә[��o�EQU�_�s��RPW�C�0X�[��0%Ȍ���}E8N��~ܧm8�2��mfLY�?MzLwf+s����C��[jL>_�oݺu���קd�iӆʈ�
9�e�3��ׯ�ʕ+�YYYt��aq�׶I���ڊڐ�\xx;5j��Jbbb�ׯ_	\�|���vs��7�n:����hȅ^>G�������L2ڶmK������`��a"�6�+�?ߵ����{�޽{G�Ϲi��)4o�Xʈ�
 xm�g__8���:))����O���]�WPFm�A.<�2�c�������	77��+W�2�@1[nC��sx�bL9�.c��ᾧ1K�5�@y���c�1�3:�U�߀��<�W?˟P��w9�mLsFQ'�3�1c���ŋ�4&:�"����:t���LKF���a�<y���I�t��
�1L�/_N�02��Y��={��9��n\����b�"F������ؠA��4��%�u!@� �1�!F��Y�f���]�@.<�L�O�N�Ǐ/ȅ���
�_;�Q�G� ��02M�0���g��=S�GQ�
�9ȅ����رc9�[Jl�ҬO��Ƴ��A.<�L��ܾO����r��t�־��}��3~`-j���`F��#G�������9��5��I��Pk}y�22�a���>O��	�S�}��/̨��	Y��A����s�I*[Vk�*�z6 �gd��>�?�Z�\xK3��M*�g ٬j@×�|E�����1د�`_Wژ���ad���Ar�ad*p�W9ȅ��I�
� F&���*��\x�T�@r�a��y&�?7�e��p%�tQ�����%%�V���7��Xm%�\�A.<l�oG��[&}K�=�I^s1��\��m[��J|�'|�{�	�w��y�n�7x�*�����;~F0���'�	e�d$��a��s�U��x����O&���j��V����k�kG���ɸ5��Gz��w��/�mE�H~i��$(z�P1���P�Pk�?)�w<��{�dmD�Uh��$��Hx��E'�?�&���cQFLƕ��[�fՕ\�۝�?��\�����QFLƝ16[��In��n/��'�.��ǏE1E�a���?$7_�k/��'�K���(#�<lYCr&vj��xǟ"x�@Y��I���a�P�Ғ�m��=��{��T���D?�Be�����H��('	�_Qr� ��\x�eJ0��Ex����!�υ����{|=ưL�2·�y��	EFFR$?'LR>����۷�9?��.6��&���w�l�6�|�t��|P^��)�͍|�z�&J�b�l}@v����#���[�6N�9s�9s���k9V�kI��[K/^�o���8E��|?ۚ�J*i6\j5l#�����, �����@W~�h��S��W5<?����W�w��p����6N)p�x����Z!_~�C���j��U;K����q�UT��l��q.�8���Qm#�q�|��ʕ�3�
Vg�l�*J蛞�g������t8kii9�5�Ϗ��=��[�l)����UQF�8ƅ��Lap�?����g�o9���"	�j�F����+����m�4S����g,e���O�rݐ��!����������eת?��~�����m�!�?���e��T���X���3��?
R�|��ΑH���Ru
��T���%��\h)^�j~RcT���������:���@�	E�_�������C���oW�wP�o��[�(�y��P~���>�􈀷V�Z�����:w��9s�N�>M'O���Ǐ?�%��8p����K�w�]�va;`Y��O�%xk׮=.''��|J���iқ/4uN��f�s�������)<���dffRr����@LSS�)2*IL3���H1MMM���h1�^�ۀ����8���ׯ����
'��ϟ?	x�����~��g��c�(�ӏϣ�c�
�c
�|���������b���K�{/VL��]�]1���{��x���ٸ'q��:q�����ȅ^>.�gŽ����|�X~�p��A���,�෸A���5��?��dgg�
�^�e��e��%��2��_�x�Q�^���������!��իJS�O?0F`��~�:����)��>|(�e�/��ۊ<�b�X�q	�
Ƈ[�]��ae����)r<�b��`L(
�1c��A������cBQ���p-���[]��u?E����ޗ[���q���Igt�G��^�<�n��ӻE(��#�����_p�W����֧s�����S��@\����'8;�T�d����(+R���vPFLx�*�ky����PFLx�*�ky�ׯ��o�Jē�%�����E[��yo� �(�Uy�w��<^�zA�T�\�*��*�rU�^�8U)��y�<Q)nʓ����W\�#nRj�*��pU��?E���x�M���@��*�6��@�wZ)�ѝ�I(�U+�qI�І�ƒ���'Qv�f
�;�5�&��Kލ�2bhCr��l#���<�1�5�
�5�5ꀭB(�a^�E��Xӳ^e�C�K�m�:��2ʎ�w�p��B(gG�'�!ux��f!�
%���7�fE���-�2��PΎ�DY�+D�V�K�ʞzՒ�@��B(#&u�[iD㊞+;W��@��B(#&u+�f-�E����S�mB��B(g^I���D�hQƳziM빭*K�M7�y}e�&ԹY�̳=(�bB��;�Y)�l�:��@�u�V!��2��r&7)'���DG���z�Q���i�Ǥ�|QFm�A.�
���<�L7��%�
Ji��-�І�N�cmD~w#]ϱ���2P�T�Brd���+�k׮��}||�.]�$��e��HJJ�wn߾}��;w�]%�7��.�_S(����<�e˖!����q���71��8Υ�����v�?r��+�r1��T`ccS����kl޼y�gLp��2��3;�liiY���_{>�],w�n�r�y�|��{�����YܦR�:u4|�p�������+���8�r�J7��w‰kܮR��2yBM�6���|���._̟6m�ϸ��{sU�x���������r]�4x�[�h޼��o���Z�!H��j�7��x·����Q%~�M6�/?�L�L����;fr���׿���i�ni0���N��	PFm���t��:T�fy�v_�DǛc�G�O��7G���횈6�pj阖u�����1_ߟ@�o��.gP�B��F}�5��r�"����W{_��ו���pjw�{~
e���8����U��]前<:&:\��{��Ց^�)�]�;��涉�U�|_�#�|��9և���&���(�Sa_5^ݜ�l&0Yӂ���K���B�FԿ��������}���߿/��Ễ�.>>^\�����on�[�*5���P�����:wUz1���"ӿ���V!��G���n��o����Vr/�"� ���tx�*TҲ��?��%68э̏u��� ��/ʈɨ9�&�
���0(����_�qނ1;�Yx��(#�����Ux�*�v�R�{`z��W��}Ȓ1��Q�209�+r�˖<�(W�A�}����X'�xwN�r�(#�6�pjni0�S5
���UJ.ձ(\�I��e���9���#�]��X���|�ϿT|(*�u�:� �1���87(��Y�F��#����c��S���9�k�Y�~�6"�vNS)�_�z��K�9����x���7/�?(��;�`
n��<N�#~V�m�7�k��'�݅O�>�����y��G|�|���'��O�%~ȓ��d
�\aD.���[o!����mk������@��?��y@�n�}v��q���W"�������y�ץ

�,ؽuݕ+~G��w�]��{/�L>���t%��&�����E����د��3>�7C�o>�?�sk��!ޥ���ׄӕ��&1���“Ǽ��+8d���~�;�����:�+2J�u��S���k�I�T)W1��������[ĝ�T�|��x���W%��|�(�jV�����8T��q;^ߕ�~�&ހ1c�C�&S��:��g4%�����gZimg/src/icons-big.pxm000064400000424246151215013430010516 0ustar00PXMT_DOC�HEADER0F@N��%1����METADATAg�3streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_IMAGE_ZOOM_�����NSNumber��NSValue��*��f������_MASKS_VISIBLE_RECT_�����{{0, 0}, {0, 0}}�����_DOCUMENT_SLICES_�����NSMutableArray��NSArray�������_PX_VERSION_����� 1.6.5�����_DOCUMENT_WINDOW_RECT_�����{{695, 4}, {200, 874}}�����_PRINT_INFO_�����
NSMutableData��NSData���}�[381c]streamtyped���@���NSPrintInfo��NSObject�����NSMutableDictionary��NSDictionary��i����NSString��+NSHorizontallyCentered�����NSNumber��NSValue��*��c������
NSRightMargin�������f�H�����NSLeftMargin�������H�����NSHorizonalPagination�������������NSVerticalPagination������������NSVerticallyCentered�������NSTopMargin�������Z�����NSBottomMargin�������Z��������_LAYERS_VISIBLE_RECT_�����{{0, 0}, {239, 240}}�����_DOCUMENT_SLICES_INFO_���������PXSlicesPreviewEnabledKey�������c������PXSlicesVisibleKey��������__OLD_METADATA_FOR_SPOTLIGHT__���������	colorMode�������������layersNames���������image�����folder_open�����js�����zip�����xml�����php�����Layer 2�����Layer 1�����pl�����c++�����sh�����rb�����py�������css�����html�����office�����pdf�����rtf�����txt�����video�����audio�����application�����Layer 4�����swf�����rar�����tar_bz�����tar_gz�����
folder_closed�����Layer 5�����unknown������keywords����������
csProfileName�����sRGB IEC61966-2.1�����resolutionType�������
resolution�������d�H�����
canvasSize�����
{48, 1350}������PXRulersMetadataKey�������������PXGuidesArrayKey�������������PXGuidePositionKey�������3�����PXGuideOrientationKey��������������撄����d���醒����撄���������醒����撄���������醒����撄���������醒����撄���������醒����撄���������醒����撄�����,���醒����撄�����^���醒����撄���������醒����撄���������醒����撄���������醒����撄�����&���醒����撄�����X���醒����撄���������醒����撄���������醒����撄���������醒����撄����� ���醒����撄�����R���醒����撄���������醒����撄���������醒����撄���������醒����撄��������醒����撄�����L���醒����撄�����~���醒����撄��������醆����PXRulersVisibleKey������������_MASKS_SELECTION_�����I�[73c]streamtyped���@���NSMutableIndexSet��
NSIndexSet��NSObject��I������_ICC_PROFILE_NAME_��ڒ���_ORIGINAL_EXIF_���������*kCGImageDestinationLossyCompressionQuality������������Depth������������{TIFF}���������ResolutionUnit�������Software�����Pixelmator  1.6.5�����Compression�������DateTime�����NSMutableString��2011-06-29 00:43:24 +0400�����XResolution�������H�����Orientation�������YResolution�������H������PixelHeight��������F��1������{Exif}���������PixelXDimension�������0�����PixelYDimension��������F�����
ColorSpace��������{JFIF}���������YDensity�������H�����
IsProgressive������������XDensity�������H�����DensityUnit��������{IPTC}���������ProgramVersion�����Pixelmator  1.6.5�����ImageOrientation�������Keywords��؆����ProfileName��ڒ���DPIWidth�������H�����{PNG}���������XPixelsPerMeter�������������YPixelsPerMeter��������������	DPIHeight�������H�����
ColorModel�����RGB�����HasAlpha�������
PixelWidth�������0������_DOCUMENT_LAST_SLICE_INFO_���������PXSliceMatteColorKey�����NSColor���ffff�����transparent�������PXSliceFormatKey�����PXSliceFormatPNG24������_LAYERGROUPS_EXPANSION_STATES_�������������_STATE_��B����_ID_�����:E79DCA12-B4EE-4736-8A6A-A627325955EA-7379-00002316C56B276C�������g�B�h����:3922FA03-A14E-4351-8F90-4D4F209DC60F-7379-00002316C56840C4�������g�B�h����:19A73FEE-6F06-496B-9B66-0A245313ADD2-7379-00002316C565ECE7�������g�B�h����:A893724F-8BC4-454E-A572-93FDDAFC24C5-7379-00002316C56334CE�������g�B�h����:4D59E174-172F-49CD-B4DB-377EB6023F59-7379-00002316C56027CF�������g�B�h����:08376F99-D214-4BC8-89DC-53E300E92EC7-7379-00002316C55D7573�������g�B�h����:B2F945CC-6F8A-487E-AFBA-B0FD7884F14F-7379-00002316C55CB926�������g�B�h����:6562DF83-49EA-4C9D-8D0B-B12C0B490733-7379-00002316C55C2533�������g�B�h����:17587334-6891-4DC1-A036-A42C0CC05C44-7379-00002316C55B76EB�������g�B�h����:ACA63C41-62AE-451F-BA69-B732F1BFF96A-7379-00002316C558BA74�������g�B�h����:2EBCE85B-E4A7-4CB9-B899-402CA4328A32-7379-00002316C555EE1D�������g�B�h����:60DC7AD0-C861-40FC-B081-42AA0BA0CB0A-7379-00002316C5530CFA�������g�B�h����:E33C04F3-412A-4A76-A66D-D95AF23D97D5-7379-00002316C55048B9�������g�B�h����:ED0B4412-A7A6-4C29-9A10-D44162B75FFF-7379-00002316C54D92D2�������g�B�h����:E5A8CC16-4FF3-4C69-99B6-A8FB275E098C-7379-00002316C54AC95B�������g�B�h����:025399F3-BC6B-4021-83FF-D387659B52E7-7379-00002316C5480746�������g�B�h����:11295678-5AE8-49D6-A613-6E33D9ABFC95-7379-00002316C54520DA�������g�B�h����:E63A58F9-684D-4FF4-9040-9E5DE0A697E3-7379-00002316C54281D1�������g�B�h����:84295360-D2E0-4633-A5EA-07D523556162-7379-00002316C53FA9D3�������g�B�h����:D5FA1E74-21AF-4747-93B2-823D14673F93-7379-00002316C53CC7A2�������g�B�h����:81E977DE-E02B-4AD1-AA6A-7675B4567DD0-7379-00002316C53A1EA2�������g�B�h����:54F1F62E-9C05-4B55-811C-C1898599B2AE-7379-00002316C536FA9C�������g�B�h����:B05FB1FD-5F2A-44FA-B5AC-17BCA248584B-7379-00002316C534334D�������g�B�h����:B49D7B18-ECA8-4770-A48E-FE64CB968BB9-7379-00002316C5317201�������g�B�h����:CE265196-51BF-4C08-BA8D-06EF79150A40-7379-00002316C52C5E22�������g�B�h����:785F9AA0-2E04-4E5D-A83E-CF741050C650-7379-00002316C5297D4A�������g�B�h����:B0B847A9-6FD0-4740-B48D-A08479CA1F3A-7379-00002316C5269294�������g�B�h����:5AF3D56F-0F22-47A2-A385-5F0264522DFA-7379-00002316C523C5C4�������g�B�h����:F05830E5-724B-4560-9AB3-C00DC08A6E6A-7379-00002316C521112D�������g�B�h����:DE846D34-473C-4162-8C9B-57AAE55E0EFD-7379-00002316C51EC013�������g�B�h����:D178F1A1-DEC4-476D-BB2F-37B457F2FB7B-7379-00002316C51B6508�������_IMAGE_VISIBLE_RECT_�����{{-61, 0}, {169, 832}}�����_LAYERS_SELECTION_�����8�[56c]streamtyped���@���
NSIndexSet��NSObject��I�����GUIDES_INFO3d�����,^���&X��� R���L~	COLORSYNCHHLinomntrRGB XYZ �	1acspMSFTIEC sRGB���-HP  ?�.�J��`�<_|}��cprtP3desc�lwtpt�bkptrXYZgXYZ,bXYZ@dmndTpdmdd��vuedL�view�$lumi�meas$tech0rTRC<gTRC<bTRC<textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ �Q�XYZ XYZ o�8��XYZ b����XYZ $����descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view��_.���\�XYZ L	VPW�meas�sig CRT curv
#(-27;@EJOTY^chmrw|�������������������������
%+28>ELRY`gnu|����������������&/8AKT]gqz������������!-8COZfr~���������� -;HUcq~���������
+:IXgw��������'7HYj{�������+=Oat�������2FZn�������		%	:	O	d	y	�	�	�	�	�	�

'
=
T
j
�
�
�
�
�
�"9Qi������*C\u�����


&
@
Z
t
�
�
�
�
�.Id����	%A^z����	&Ca~����1Om����&Ed����#Cc����'Ij����4Vx���&Il����Ae����@e���� Ek���*Qw���;c���*R{���Gp���@j���>i���  A l � � �!!H!u!�!�!�"'"U"�"�"�#
#8#f#�#�#�$$M$|$�$�%	%8%h%�%�%�&'&W&�&�&�''I'z'�'�(
(?(q(�(�))8)k)�)�**5*h*�*�++6+i+�+�,,9,n,�,�--A-v-�-�..L.�.�.�/$/Z/�/�/�050l0�0�11J1�1�1�2*2c2�2�3
3F33�3�4+4e4�4�55M5�5�5�676r6�6�7$7`7�7�88P8�8�99B99�9�:6:t:�:�;-;k;�;�<'<e<�<�="=a=�=�> >`>�>�?!?a?�?�@#@d@�@�A)AjA�A�B0BrB�B�C:C}C�DDGD�D�EEUE�E�F"FgF�F�G5G{G�HHKH�H�IIcI�I�J7J}J�KKSK�K�L*LrL�MMJM�M�N%NnN�OOIO�O�P'PqP�QQPQ�Q�R1R|R�SS_S�S�TBT�T�U(UuU�VV\V�V�WDW�W�X/X}X�YYiY�ZZVZ�Z�[E[�[�\5\�\�]']x]�^^l^�__a_�``W`�`�aOa�a�bIb�b�cCc�c�d@d�d�e=e�e�f=f�f�g=g�g�h?h�h�iCi�i�jHj�j�kOk�k�lWl�mm`m�nnkn�ooxo�p+p�p�q:q�q�rKr�ss]s�ttpt�u(u�u�v>v�v�wVw�xxnx�y*y�y�zFz�{{c{�|!|�|�}A}�~~b~�#��G���
�k�͂0����W�������G����r�ׇ;����i�Ή3�����d�ʋ0�����c�ʍ1�����f�Ώ6����n�֑?����z��M��� ����_�ɖ4���
�u��L���$�����h�՛B��������d�Ҟ@��������i�ءG���&����v��V�ǥ8��������n��R�ĩ7�������u��\�ЭD���-�������u��`�ֲK�³8���%�������y��h��Y�ѹJ�º;���.���!������
�����z���p��g���_���X���Q���K���F���Aǿ�=ȼ�:ɹ�8ʷ�6˶�5̵�5͵�6ζ�7ϸ�9к�<Ѿ�?��D���I���N���U���\���d���l���v�ۀ�܊�ݖ�ޢ�)߯�6��D���S���c���s���
����2��F���[���p�����(��@���X���r�����4��P��m��������8��W��w����)���K��m��LAYERSp�%�5�>�J�Xdff?g�i�u��c�Q�A�5��l���I��/��(7A�N�[�iLv�"��(.0�imaged':E79DCA12-B4EE-4736-8A6A-A627325955EA-7379-00002316C56B276C��$x��yp噇�YLv�j��8�c7�lm��J����s��k���]��Q�b�|߇�X�OY�}�4ݒu���ktK3��ht��d�{����X$^lo��z���V��t�3^�gGsƉ��Hd�rFA�O�������21Z���
f�j��.�����wu7��ڄW�:6�u��=���9b��	�n#���[�go���]��7e�5��`�mPg5&��0bʂ�<3�YiLu���ڃ�ǻ��k��h8�V��dL��򺙱Ua���թ<�i���FOU�8sז���7+�9܎N"���\��d�9P�k��Oٌ��,E�����3�9�x���9�5���?�n܎**XScF5j���߈�^#���w�ǘ��@���<��LGr�|�����e�A����f4ǯB���>z�ꩀ���M���o�H����=\R=L�g���OB��ݹe�ހ��?�G��ЍH���S���t�l���c����h/�EGQ�����)a�����lZ���<��a�.��M�'
�@_U��K�� �r��?�U�a>zkSђsN���6U������zx����Cߑ�k��:|�^t�0��*~��5g�V��Ŭ��ҿ���-���\�x���p
5�i`�[[{(T=L�f�Y������d��8�2s�t��d��D5�����Gw)F�פ(���@����=\�<�rw��hN���7��m-CF��OW?aG����?�c�k8y��:����ޒ��:��"`L�����[҃�kO�`-�=����4Pᶮ�ac�ڷ�K��F�˝��UdM`.q���=e�����T'��5�����3����s���=hs��Q�?��=U&�_�W%]��I�c�������D|��eptr������h�.⋩A�[���N��|��{�s���gnmH�U�V���ܧ��.n\��u���kQ�k�51����Y�aS:�ca΋�3#�bz�=�pm��=��X���87Ͱ���$yW��?�1X���G��(xr� �7���O�5e��4�L�X09�Go=�pX0�S��^�����;��w�8��A�[^�bqu�^y�x+��r�F+WA���X�8���TW!F�9�V�P���h��Ea��Da�!�Ai�q�O�)3����;����T{�2�,�����vK�@i4σ�Se�\9	�7�eD��ɝ����8�f��6�Q��~FΣq�(��#9���?��1��I���6������;�XS�#OTQ햖��(^�|��3�z��uw.�Z/�1#�4����Ry^�p%;5�3Z	~��QEg�.�\W�z�)��y�.��Π�R(�]xϽ��Kq$���� ~Bo)�!��r��%�:A�2�LsNo����4�g�
CC�9TӵJ��a�ZC�g�gu#1Ρ���p�}{?����WAy6�:���S���	��g,Ep�_�ЕL�T'��8mEQ���`�ga�V4�+n̹�j}K~8�
#�U��$_y����W���U�.�K'q1��w.�U�j�����y4]=l�ɰT&�(����ž:=�d�!C�
|�K��=K�55�����g��8{����V�\� 5���1�H��	��y'(�$��l�G�a�J:ɠ[2=
�/������L�����Ĝ��G���ﴳ��ߛ���g]Q�^N{��א�kEp��v2�����D����;�!��ni���|�9����/GY�E
9����~
%���Nr�F�5a������t�<�s>T�s�]=���=�k׏�����rL�ڶ�l��*z�XEY�ܽN��v�RXX�����JvN�Og�"Ћc�U]`.u��WF�ލlo��ٿ����w���Ltr�1��U>��gB'�\$'9���mm�7��bb��� �� LG�E��`��(B݄i��c�Ϻ����oK�0^�Q��q�Ծ��ӕ�1�n�/�y
�F�ޓs�&���|8ͥ8\y(J�$�e�,Z1Y�&��5��12�I�(�˓1Y���8�N�ſF�Q{Ծ
��_���gԐ\ܤfadM�׷uq<�+vؕ���W�EaL ��)~'�2�0�ߠƫS196�ak7,M��\�n��C�/~�kt��/!��ۑ���O�|��޸,����]��֬s7�����>fG_a4����o,EW�	]���\��pu2ϟ�M�tC&���a,F����&�Z�ho5!4?�|VN���5�����ǐ���;ő>N�%姜���V���~~�\�
���=����et47��f����c�@gG�{�f���,ԧŢ&SϞ��RY���(�Ko��-�{N�BPWk�>F���D�(/!�H��]�&����37��dgaxx'���+%g+sq���n�}�}�hi2c��E~�id_@��S�� 6+��p�(v��c�Y�"�o��y�qq�		�%��t�s�W:)O3��$r�]/�:�VV&�h-C|C)ޭN���Lt
��p`tl�]]��b�����
��H_�?�](�d!��>N���r����KAj�qqq7�_�߯T�bΗ�$'.�.$cK��33�>80�
�A��CNv6^\��LJ�����[��-�vw�TmDF���`�[lN�����8߀øpb�-��ݏg������Y���X���&��Q�3V\ϵs�峝Z�d�쟞����>Ԗ��d�?�[/�
�0��#55o��種���ф�0D݋�#{��kR���Sx��k�\܇�/��]X{~���p߽����9��ǟEε���1ӑ��|�il6��D"�ry/���015�k׮a`|g��!󬩮g}� ��~����m��/>?sO�}����D����ȨHͿ���N!��{#u�9�i������oH��b����\6_AqQFFF�c���$�_;::�QQZ]d4�ܳ�n��>�J�ϱ��<�rO$�?�ᕃ���ޮ-x���ۊ���Gj��'��ڜ�;��ӭ�*��?U���n�ވM�|����=D���7�w���\���b�Mx�uXrt=�وo߀GC�㱄�x,�<��G�G�h�Q,	�K��s����>��aT9�S-|ob>�J
�-��X��]�x���ƞO
�.Y�����l���Ǧ7��'�¢�o�#����X���̓X|�,M8������U����W�z��K���$'S-��uIhoo��m��]������_|+^x/�\�Uk_�ç��W�-V��X��kX�<��������c?�.,�݇E���(�C,�ۢ��U�t�O�_�uw?r�L�SU>�RR"��ڰ������O�'��W?�e�>��W���Z�5?�^��Z������c��<ph8�,:�_���������mo`I�������R��&���+���܂�?|O�����X��s���GXvh^��O��_��_���M|wӯ�O���;�ăX��~��!,����#X���
�.��4#����O��
�D>ۛ��s7�β8���wR�.t��ߒ���|�	�q0��w������w*��-'N��<Գ���"��,X��9�<YE�]pg�c�e������streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:11D9C4BD-00D2-4480-9DD1-85765BE112BD-7379-00002316C517DC4F��	0#����lfolder_opend':3922FA03-A14E-4351-8F90-4D4F209DC60F-7379-00002316C56840C4��@x͘kP�����$Sl1���2�L2�|h2��L?t:��th'�3ՙz�(��^"r���\8�*���Q��]v�lX����}�β�4m��}��<������[����/,Y�}Y����5��-�iW��U�Q��t�35iȧ��x�UI�E=mE���b?}]�OZ�"�hF6�U��Zt׉> �bF�F�H�C�Py������5] o�9�aj$���:����T�$ٺ��ٜKM���|2��!L@S�XM�4�^��g����p2��{���˟_�g�����?���	��R�PB�2��x�di+&��L���%4����~�����\.Ҁ�\f�l"C]6�?�tf��3�f��6�t5�5�BZ�*��*��k��KYὐ�XS(�X{��Z��՘�2t!��g�i�\���@�rHrc�`���]�~6��F�L��+�2d.h�]�T��Gc��V�?�2��l/bCLҌ�37�<�]�_�Y��ޅy ��P�m�)�ol��ͧ_h,���"��I���lH���'b��jH�s>�w���7<Zw����X��r~�ߖ�\�i��w�߽�A��:��U�E�*��e�^+�[�8@�S�d?�J��)�%��9&��e�(�r��8��?
�ϸ�/���_�(p��s�GR�ۯmR���T��k<��j�b�ۮ��z/������\�|F�Z��xG�(�#�x�<�M1<��p]N��3�gD9���f��gm�u��;��AK�	Z:��}jQ������M�����4���=$Y��Mr�H���>�l=睵瞎�1-ξNЁ��yͭ�y�p^Wp6����{���/��9xzh�xv.=
$
_%�|ER*�_�^���v�����o1 ��i-�$M��A{5y.���nT�"P���yh���2��#2�/�)�@e,Y�K�=u�qr��t+g��
�J�6����a�-��+��g>�x��p2r�~��۰��z�b&Y�� �����p�T:�z�"�v���-yB;�q��ߑ�w�Ր��J5��|�煁S��#���rs�c�f/'���%}���RJ|��rB�C�H�خ��}�L
��12�-��?���_!]�+��84���LL�V���J���b�l��:�3&���C.F1Z��9 {�0}����	��:jK^O�R7���Md��͆��gپH���ɲb(�I{>z'��
ï�7q���R���j�ZjM\��,m%dǙnA�v�-��d����L��C'�̅�i㼮 |�	�M1!ti����ޏ�\�@�	6��qd?�d����%�,��#�����G��kYs.��|�B�{>$�V�s��X��V�OFq������rB�/-�	$?b�?
��C��>5D����(1���r���ӆ�n�nq9�N�s�~��Ct�"�`Χ����]�1�K�|,���ف���_]�'ȝc���Fx\�s��wdl$���{�H���g�j�S����5Ԓ�qR4}A��%�x�,�s��ˢ�nIݯ�����H�Q�������x�\�tE����o�8��c��� ����Ƙ�����Ԛ����24}Q�䤱�����y�b� }�V�������]�v*�~#$>ֺ����ܮ�/+�^��	�I�@�B�Ai�!����If|׹h<v�
ܾ�/�˔MR�K^����?��%�����۩� ��0Y�yۛ���a��~�h�ya������a��	s�+sub/b8=m��9買<����i�1gc������'7���v�3�К�~��h�i���<�f�����"�q�lt &h� �I���jŻ�S6�Gw|p�ŋ^���@`���r�3�
��_O�&xk��.�_��s?��e�a]��c�t��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:11D9C4BD-00D2-4480-9DD1-85765BE112BD-7379-00002316C517DC4F���./�jsd':19A73FEE-6F06-496B-9B66-0A245313ADD2-7379-00002316C565ECE7�
�@#x͘YPT���D'��*w�IU*��er��I�R��\�.�S�I��R�I�q+uft�%�(AqGQvh��7�El٥�Mvd�>���~�9MCDZ��O}˿��Y�>�6s�'�`�0V�0�%����v��X&[e�v�<�˔��F���
�^�~��_A�/�M�{���~y4�)�&�Bt�>��0�!��v	����[2|�#�
9������<bMv����h��p��ޯ���"	Ԧ�Bo���s�(�k��֦��yYT��K���@�Lw��pC.����<��6
	/Ԏl;"G�zTq|ǒh�81m4�E�\�n�<쭖������C���탌���7�L̨}�{kd>P'S=����{�)��>�a��H�S>�E���v��p�/�:0vpbZ�O�}Ѵ��L_�����}<����
T���a��P��
�����������{���O5f~zbZsϢ��d��LF���]~Uz*R%<xSB�*�P�5�u���>$���}�쓕���j���ZB�$z�J�:&c�mlʕ�%i/�(��m	գ�j	����b��͟���庆=o�=�l���r\�;���wBcͯ���+xw��N~�X�~��-�ᖄjPC��0�Y ��w~i���?����"0&�	���)�q{�⌡upb�\�	^��l�ߘqR��6��;b�|
��5x���ͯm�ڸ>�^�	}B�~�>7�����T�O�����ܺ���n��۬5��FSC���?���V}�v�n�D��;���w��%��0�;Vs��s��Lu��!O:K/ICV�<�	�{�5�3��0~��P�9���9���g���o?�g196��x�����2Ӌ��N�t�]��yg���|[QC�~'Y��5�4��ųi�%��\��w�n���@ܰ���ծ����c�_.c��[yU�}��da\�̏��y<݇:�ߩa�lZ@
�
�Vz
�X��ZI�a��~^��&IՕD)�/%��p�NJ�l���~4v�}���!��h[��U�IOm�̏���H��v�L�/3��
6� ��F�NG�M󽥨;u�_�,׭6����Kk��"�XO���a����g&I�wK���Gֱ��;��^)L�#yǑ��qx�\�l���,W��O�H摿Iͥ��VxNz��������Is���u뾺�\���+�|�j@�X6�㏵JM�Q�eL�G���ݯ�ꑡ�l�,K�;7N�-��ui�Rz��\;�M��8��KC�	iʌ���X�����m��zHs�F�R�,6��{hjX��oȎE
�S����
T�<�Ouzq�⺦�]�yi�I�R?�*e�G�fz�c��~�U��ל/���9�4g��y	�SrA^_��u�[�
W^ƙ�s���V�`�X[Y���<-�c�%�8��J�?_��ڽ���)i�<)��'��'�ߐr`�4�m�K��V�Ak�)�C텃�q�76Bުm����
@�
}'G��y����/�W�Lw���-�`C�tW�JWE
΢�xG��]:��Aދ������Q�,]嗥�ꊴe��w�U*O�G�<��`�Z���1}�O��Sz�)��1Τ�R�w�F�nɏ�%MY�3]�N�Q�7��7:G<g��샖\����l@���u�t��߉��-��>j��OK��T����Z`��� �	*d��d���2v�(��,�%��N)H܃:H��j{�w�^(�dza~w~�k����q�o�b��v@L���7��GkA��3f�>-��N^��9~a
BM��
��k�kU`쏵�[�9��O��m4f�����jWkb����?�~��:� �Z�rc���G��4~(Pf�-Gf,1�3��Z��X��� �U�5�9��r]��ٱ�o��#�
������u>|Ӈq���%?�;�^�����%k8X��H����w��{bϡ�Za�Z��:�� �U�ƳX�y��]�o����:D�Y�]���Y�ot/��`q�{��$\���gJ#k��/��|7���w,�5��71|���c�8�k�E�sJ�뚁�~��+���w������>\S}��Skӏ{ʹ��������8X��~���#�>g���7���QQ�@?�/j� >@�ܟ��-��Z�屳��L�몍`�	�c������w�A��g�o|ñN?}��_��B���=�-�зlk��&Hs��1�
W����Z�;J�z�`c��u���ǯM?��Po�YO��Ϭ���W�S��"f>|+��u]{L��Xj�4W�cY{�ǣs��Fp��_s�ְ֡`k�&Hs�8�넺�`y�V1��{D��d�g�}"�c���U�>��&F����8gL�,P֥&Hs�8���w��58�vګ�^��y�>c���>�<Sb�ѧs���W
�	�\5���s�����55�����;�s-���gV}e�:�j�4W�c�����ӹ\G��]r�w`�Yp��</�"k f��:�}�i��r�l;�^�{����k%0f�]�}��������\��	�\5��ٶ�/�BM��q,�,t�~��8��� �U�X~?�N���
п%�P5A���}��2m?���7bbb~j�3�&�9x#��Bmh11������streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:11D9C4BD-00D2-4480-9DD1-85765BE112BD-7379-00002316C517DC4F��
6.0zipd':A893724F-8BC4-454E-A572-93FDDAFC24C5-7379-00002316C56334CE��$x��ipS���4�K�L��?:�Lې�
j(M
���Lg�$��J!{�$M�4$�Y0&�ٌI����U��M�mْ-`��"e��=WW��� �3~�[��9�wt�NJ��6ܘ+C`�	+�0�%����#[�3�tM��,;&c�V��쫿;k֬����).kr���g:�A�|6c�>��s�I|�Nﭗ�J�1IWU
j��/��A�I�M�?i����S%g;J��>KܖDk˒~{�%\t
�|�i�Y.�IY2��f�[!C.��T�b��e��$��O� �Z�s�Eg����[b��a�s�X�o��i+�k���9�􏷙Ğ��2.�{�y&N�e��eϗ��Ru��`�Y<����xG��a�5K��?�����^�[t�=�GY�:zL��8�3R�� ���rʑ/���eGe�]��T
�-�������_ۼ&VB1�7<	=�[#�o'��Ld��*��kϔ�i-L_W��{�QC��a�9C�Z�� �j����W�P�CY�k�q(2c���
]թҔsP����[#��
�P"��![հ�7���®�U���Oa����H��u�gTL��P�?s'���.�ץ��{k-j���5�U
g]�|�ǐV��ۄ��Ht�$�#J3}�u_���c=�����[��~k�v�rj�?�'���!G�4��o�WC�9ۻo#���U����J-�n��	E֮(lʕn[�4��ʣ�x?���fU�j5��L��H�;�}��C�%��C@#u��hÁ�3}�ϴ��&���Ru|�|>��y�54j�I��]e�Aۛ�)��į��Ż_um| J�a�);�����j�ߵY�۰�ԥKs�a�I�#_����ʃ��9��WPC�
5L�M�k����k��烦?
��r�>Cڊ��37A��/F�P�W>jG
.��k�؛�PCOU�JW����b6I��8)9�K������|���٢YB�H �>�����Ȓ��O�Ւ&���r��E���d�c�aw����d�g�><ӆ�i�-u'A��v�����D��:��k�;|;,c��*���ĭ�I2�n�~g��ˏ��v��@��'�}���Q�{ߑ������R��fqd�O�4��>O����-cw�W~}���zKc�L����'��R���>���}0�Q�=�$����*����l�]�>�"�	Q�#);���ĭR��M��EKu������1����j������w��0c>�S�V�úKd�]9؃R���H�)N�)1Z
G�J9I��
h�<�]��gK�!5�;�}m[�fiH��ּ}rլ+���s���C�Ӱ/S����9֦|����#����bOjΓ��tu�s����R�ԝ�
�5*��Z�-m���]m�i�b�~˾
2��o͆�s��ƒ��wc1���a��D�v��:e�%O�2�Su\Z���0{�~<3q`��8s������l>$�Ňő��ﵰZ���|��=�Z5�XK��gl�������i��`9�GO�w����t�'�\t�[*��)�)�N֦J_]�}��E�̻R�����Ğ
���)RZ��"���9_����z��3A���>8�d�9:]N5��v:��\�2ħ3e���8���ҏ|��y���w���+?�_��?P�|:�u�~
�`�����3O�6��
�*�3� �ia������.�X��c���}���|Z��?fX�����
�V��j1������ͅ~��X��{4=�@L���95�]��1pk�^���� V���}�i����߸��{�Z���Kɪ�b-�֑�|J�.��U��g�V�
���zo��i����xH.��d�j�w��x�]@bM�n	}@�X]Ե�ޜ��g���\NVn(�t'��$�`�3M'���0���5M�
Y��&Y����M���S���hR��?�A���ĵN��5G�e�jP,}�^����[�18.�\W��7�}�iɇՠOm�:����kv�Z?�ז�9V��V�R���94��4=Щ[#��<��>��6�wg�Nӿ�I�܊�#wm�ޝ ?Yq��=�j,�I"1���G���s�)}J3�����D�����)U���v���4�����l5�-�U,����\@k$������1����xI�sc���k����O�̇�5p,��'J&��m]�I�d_��������<q��_��C�5�~>�|����{�ۀG�C�΢ƺ����M�=^4I���JYA����]�qg�i��.R��kS�ҿ���iTW�V�f���Y�`�_��X�z�Z�9&���(�NJ	_[{�o�lg�t�sW��{��{ӱ����pwo�v�?̇b���j���Z�cB��eF��Ԯ��X�I�P�o\Y K^�+���*s�ːe�g*ΦVq4�a�|(��X<C�1I�Җ
h5�*6�<m��5g�3�!����<��ܱ�mB?�'�R�$�N���c�R�exv�,\_��Z�T���G���jR�sA�ȏ�N(?���Q�Ku��uj��ܟ)��+"ז���S� UU�I�l�*�~^gd�5�B�����1I(:x��*�HS��C���G�����/y�^��Ҡ��o:�V�&��	��V��-'�+��~�L�+��r���@�/Ц���2f�F��`M!�_�w
�hr��-��� ���7j��
g���+ިE�&$�k-j�k��=�=E?t�1�
�zx�u�*?��M�����4���[C��F�ħ�*�x&�?Q�ƚ��E�?n�~��M�a�-g)�L��}@[o��hy޽p,��8���u�I?�w�q��A�3H��^&�'t��kl��Jeު� �bO���J#~�Q����-)ϣ��s����2���B��y�K��]U"�Ν�>���R�7�`��?���4�DŽ>�s��-�0G�<}��t��i	}L�4�Ұ�҈��en��҈K纄-"��B#��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:11D9C4BD-00D2-4480-9DD1-85765BE112BD-7379-00002316C517DC4F��[./�xmld':4D59E174-172F-49CD-B4DB-377EB6023F59-7379-00002316C56027CF�@#x͘[P��i���3}�Kg:�c��>��t��O�dǎ��u�LݸMg;�ė�6�c6`b��	�&q�Z`a$��X�/�r��vW�)��&��~s.�����jE�c��h�,�� ,`�>,aLK,_���H�,�ea�Ft�����g�gϞg���-�ֱl�OW�哥q�dq�y����˜�AI�
��T��=�Bo��!�k׿4��☤��w$�NI�K��L6C��T��—�a�޽�����u��*�$�͙^Y�I���F�a�D{o-C—o���X;vL�|��O���sv�K����j�C�U�p�B�'C	4\
C�}�=*_KKKjwb9�!�n�v�n�5(��T���9Y/
�9]h�����X���j-[X1�c�%��s��HV�=1�؝�t�J2҆����	��8R��q���355%�N�R��1����LL��?}�tf�v'j��/����`�#S�2�Z"�X�$���E{X�_'���Ð��>,vrrrT��2O}~�_c���g
}+�U����
��Z�h/�`�5I�
Jj�=tHrڋ��~��?@��^}�Uy�W�$;;[�ѨZ�daaA-�v�-��T������D�-�[sY��<[��C��f:уO{X�����'��4G�ڃ�'�M=��	cZ���[v;���_�����p�o���~8b�pW��~��e��(�������Y�{�8t萐�_~Y9q℄�a���SM�9O��X>��ۭ�5O[]�-KcM��Ɏ2�+�����w��@�F�V|&�1R#����b'
����էeL��h	��f|��	�5�h���n	w�J��t%���I�0j�'q|WǺу�lZ
T���K/�$O�����\8�+!>�2�S.������[E�CHߓ���=���ֳia��s��^|������ۧv7��χL�>I���B�M%��fB>ۘG3��r=�C���ֳi=�o�]�)�}�4꯼-�������l�ͳ�.z��R[xҰ��3�9�Կ��0�r��r�FbZ��&d%6&+р�D�d-ꗍ���=�6B-j+Y��� ��h/Α!�Ml*�e������a�uhl˜5��RY�d��R���F��_O|�/�����k�JG�I�uFF�y�%x�OE;e}�I�uW��~��{ �ј븁��T'蒴	}��	��'�S�֧Z��Ȑ��g�&wk?�>\�n\�Β��t|Z㾲���9�S���);+����;��H�x���4Gc���․q
��aϛ>5�X1l�oп4�(���-uWߑ{�|��5z(�@zHه��}�����d����9��>#�\�2�\ ��y��{∷ᙆ�25P�u�`�؛���i9G�Y��g�=�����=l�&C���Z{������:���2���v]��+W�
ޖ��s���1�Z��nl�lB����l�`7�}s�U��/J�K���%r��Ϣk2�k1��S�I��@��Z��I�����>��5Gc�w]>��@�i��H�gl��u5�l��YsC��sǤ����Z|��H���L����@(����U�U2U�]޹+��x�y�xO����T�M��g����H��b/W�qp_1{d�OF[e�_)W�="s���Z�{�=*��B����{u���e1X�,���[�'F�w�D�E�c-�8�=����Z�J�$�����\>�񕞕��fԡ7�i��*^<��g�<�
����o鱜�Z��<���|'��� �ш��Iz�k�b�VX�g�D�N�����g��5[�����CM���^7�^"7>����-=��iu�g�a�:�kv��	��<�cqhW�=�YuA��2���<IG}�E�֞�h�&e�o�k�0">��Qk�Yg��s2k��Z��!4A��1�t����>mf���s_��>�P��Mx�P��#��pM��'�y>
r^�=x��	�g��8�߈�">��5#�z/s}�3�H�W�OE�����>X���
�Z�eM��ۋ�qk]Oq6��@�5��E-,5A��m�6���Y�������d��^�MK�M�Eߎ���y��k:���v��6\v��s��3���d�H�ߢ��'�?�Y��?�G��si�p��:-�3�s彣��ߪ��Q�8�x7�#�K�_׌�{	k�
�i�q�eK�)_s��x�[u�U=����T�"=��>\[}��"��v���U�\��
c}#���"G�c|�b���G�s���yb��.������oQc
�h�&܇0�F������5��m�fk��`�ݹ��ָ�8����:�Zb�Y����f�9����腾au+G��i�q�P�9�up����Y��'vߎ=O��'v_i�6��i��i�_������M������>����ȩ�؎��:b�ʖ��5ɐa�	�
ֲ��G��J�y�}Z�j
6M
�i�k�N����ׂ���XqƢui���5g�1��M��a��A6��R�9��>㵺���{�s��Ds�rfL�X>��x�ݚy��� ��`-�^��5��X���d�o�����=�>��1C5A���Z��Q��ut�G@N��=�x��Ec�\f
Ĝ#�4`�� ��`-�]�e�8�kf��"P���}����� ~��&Hs4X�c�F��P5A���Z�y��o�S�9�����9���$j�&Hs2~��o#�K��+�|VV�oM~^��g}�PFV�|�ʰ�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:11D9C4BD-00D2-4480-9DD1-85765BE112BD-7379-00002316C517DC4F���	�phpd':08376F99-D214-4BC8-89DC-53E300E92EC7-7379-00002316C55D7573@�@x��[�0DQS�`)�P0�R�R�P(�Rp���3J�I��G�j׏rA�
�_���oءD�!^���f���^m߿���Xߘ�K���U�cfRY�����*��Fޘ��t��a�*yI�%�'O,�<K�j���`=yI'm�[�y��)�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:11D9C4BD-00D2-4480-9DD1-85765BE112BD-7379-00002316C517DC4F���	�Layer 2d':B2F945CC-6F8A-487E-AFBA-B0FD7884F14F-7379-00002316C55CB926@k@x��K
� �g�P
-t�VAo��.�*^�z�ҙ���M�b��KYL�z)��߾R���nqU�bx��-KY�
X;�*����A����^�jZ�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:11D9C4BD-00D2-4480-9DD1-85765BE112BD-7379-00002316C517DC4F���	�Layer 1d':6562DF83-49EA-4C9D-8D0B-B12C0B490733-7379-00002316C55C2533@k@x��K
� �g�P
-t�VAo��.�*^�z�ҙ���M�b��KYL�z)��߾R���nqU�bx��-KY�
X;�*����A����^�jZ�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:11D9C4BD-00D2-4480-9DD1-85765BE112BD-7379-00002316C517DC4F���./�pld':17587334-6891-4DC1-A036-A42C0CC05C44-7379-00002316C55B76EB�
�@#x͘WpT���b2���d&�<�1y̓O&O�C����Ό㱝8�6el�`�'@I�t,$����ժW�
b��:�U�Bew]��ιw�R\�a�~�/�}�[�^�p��p��d���(6>�P,+\��ٹ�R�vc�F!&��2ڂol{�[�n}�Kl�⑶�.?>�;���z���=����]f���Bx�w�c�#�y���3���:}��v#:��"2֌�;���(A�!+%��GX�Cװ��s������D����p�{�0֜��_�������P��+�r�/���Z�7��G�x��/
_�݁:���a�F���!Pzz�2>�}��~<3�ޏ��z,1�_��\ރl�V�KP��A�ͷ}/�˻~�X�.n,�x~f��x�O{Ik1�Y�;|���Wְ�rS�r_1�����͵���6�0?=cvrWR��<��ޏ�S��lo%���JGu"#�ղ�
S�Ro^|���RҦjx빷�o��Mc���.�S�Ʈ�ߋⓇ1�߆��|t�/���<��7mb
uU��RS�3?���(�s
{�݃=��o�tʺ�LL�X��1�����0�]i�Y���d�gk;k���p=k�25,��;��(�S����~�+�b!_ȟ��3�ebd��I��r�.n,[��?��ߒk�d�@t�ө�&�<�"�
N
~ܽ}_��W���6�/���b!_ȗ~i33H?�n��j���˖��\wF�
p��"�_9���>D��ljc-��`5�	~t������7����4ȏG�e������F�><���
~?���"�s��B������/�[=����4�/%޷���:�4H��͢���#X�s����p��4>]��U�5���da
�m�a�l�i��27��?��گ_�v�j���a�s���0�Wa��5��*Kç+�ty�5�A��C�n
�g�
kk�ҷ�d�:��ʓ���Yԥ���R2�.&���1��G�?}�Z!?'�>�������u�o(�����0ҍ�P�v,�ڰ<�o�I��qg��@�N���'(�sk�p����(�DR���"@?@�8`�.�);�ލ�;����;Qvf/߃7Q��G����:�
.��2���tr����}𯨿x��g0Pw3������W���SC[�|y+�yj�u�x�NՓD�ן�,F}�!L�*��#|��T��a�5=���y�C\�9ژqg���WИ~����
�Y�њ}��G�KF����E�}�&J���kS�,� �{hkX��o�=���/�Qcm���:,S�\��gP>�kn�΢%/�Ԑ��˨�p�2��>C�/��}m���������h�:�[I�/?�'�ny����j>��sY�U�Ա��T[�}�[_yY�	�:K�y&��c"Ph����~�$��O��;/�)�8�[R�����m�h�ou�t�D��ν�mO}m�=��V_�~�6�jv����+�Z#�]����j,�c�V1B�9�ICou*Ϣ�|G^�t� |/n�v�ϙ������ЙuT�k��h�|<�3@Z-Q^���W,_��K���T���Ͻ�3i/J�_Mڍ��]n�еL��F�k��ot|��b�v�=�7�ݗ�a�<�\O�	�+��8�d�EB5�'�5�e�r5F��o,��	�pH��X�98���wt!�n]%EԖcj)8�E�{X�>���v��}']Ř�8�
��
�=��8���hQb,uE\K���-����F�?��G�+/_Vq�|7o�or�&�B�(�S�8��h#ת�:ܟk���s��!�x�k�+�Z��X��ܻ��2��yh����h��Z�v�q��=�V:s���+�|�llal,�s��'M��
����5���j]��sb���k�X_<ʫ���Gk�7���>��u�P����S��O�Y�]��K4T��s}�^��8sd�V��,cw3�V�(�S�~�g���4w-f=��U�ٟ�%�/���1��Na�(*M�ߗ�k�w����W�|���NY�w-�M�D��3oc�f>sʯ�q��X���A�I�߬,'�Ə���~�\�^1��9�":�v�i|�����{�����������8Z��~����3�>w��[����oRI�P?�/j�eD�(O����G�3�Ⱥ��ݵ4_�bsZ��6?T��]?��{ȹZ����Ɩ9�[ߌ�X�_�r�_��"��7{�9Y��u���!M��
%r���[�h�͢wT���1��ń{X�'��cP���?qs����J�z���욦6��挍�x;��VǛu�1�k���<5�U��~���v�M��~��XcL�ZV
�Di���j�po	���*�ub�f6}���'f5V�}Z��G4���3v�GM�;�+�u���<5��>�=W��/;M�u�VkP^���9'�O4����|������
��<5���K=�f
�Ҡ�^~^tݥ]ki��=#��'qv��j�&J��4V���3W�=d��ɻ(w?4�g��bk0V��O����}�Di���j�b�^�{����k#8f�]�1}��ü����Ů|�K�yj�9��y_�E�(�S�X�Y�e���8q�4Q�����~�7��[�c��-�AZ��Ҽ��j�j�>yP�y:!!��?!ϐ���/�Ɩ��?S����streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:11D9C4BD-00D2-4480-9DD1-85765BE112BD-7379-00002316C517DC4F���./�c++d':ACA63C41-62AE-451F-BA69-B732F1BFF96A-7379-00002316C558BA74�
�@#x͘Wp\W�ġ$���3<��<2O�=��q����č�mlK���ȲuɒV�˲��%�K�j�d�쮝��}�ܻ�Z��*Orƿ��Ӿ�-g���1m�V�b-Ql|Z�XV���'���e��*���E�ݜ�Չ6|��'��iӦǿ��-i[�)����7߇{s���/���Et���.,�\���[�Y[ɇ����w��E�vǧ���V,�4b����,��b6Xe	���g~�L^vj6uYY��Yk�B_
&[x�� �ry�>U;�����A��Vx}�Ʋ^��\��y��5`�-3�s���P��SÔ��þ��Yj�J��5_��=�Ad��԰:X���w�X�m��ya\��[ƺ(vqcY�B}^:K3�8\���*��5��H��5T�VJ����gY�m����7����{1�?�����Xy�e��?�6Vx�^�N�s�՘
�`��k3��H��5T�����⳿x��6T���v"i���ƺ��t�
w��潔�8��6�����z��!6uщ�Ѐ�h5k(35<�����|װ������|"��(����&�����J9��J���4Ħ�<[;Y�5D�YC��a����7�Ki�ڶ�o����q��7�������][��G׿-��o�>��L�S�
�x>Eǚ��q��|�+_~��ڴ��^.#�#�r�e��)��\��|�ص�i�0�[���Bܪ��k����b�m65��6[C����?��@y}�����[���6zdw<���h�����1?P��B�U]@kn2�/���1�nY�b����ͬ��M�R����_�Ð!�h^ �0�x��(B�E\/<��o��*���wRl�����ְv6����2?����|�k�z
~x����v=���Q
f��1Tw	=�`u�L��1�_f
}��ְv6�����l}+}�|dj�)���4\JC��T�\HF噣<Ϗ���k�|/NN}���.��tw)�21�T���Q,M
`q��� C�X
w`e��|�|�=g��P��X��/R���t�n�g���"IGW�6�� � ��黈��4�{2����ڂ�ӻ��@I�vf {�˸�w32���K��ۛ�s�h�p�%�1�pw�

7by��'G{�K�(�W�j���w��4!� _��Lw	3b�V�P���s�<R�34���<�U��ƕwq��hs�T�ه�^F�C&�y�oh�>����h�:�`~*���.F��P��6U��g�
1�C[CN�5�k(6�4nj�}Ɔ�B��}�<�
x]3q3pm�)����_B�����u���(2���v�u$�z^2:r��#�0n�`��,�����6Y��4��� �b���'�ڪ��a��˪O(�Y��3q����E����:��@k�q��Z��Q�%}ϋh��Q��N�VIW�	����[x�>Iym��_������9!�ʻ��HhW�}u�����Y�pk.�2�_�γ�ߑ��.�6I&ߋ��=�gMo�y�׼����>��5_m��<�M��VK��2Jb�˗~��*?��s�@���<�v����m(Jފ��\�^�B�7�m��Ɏ�F�#pr�how`�F!���0ƚ'��+8�_5�'[��h��������P��hT]�%v<�	뛠K<�z��.���+���rM-�Ƿ�8u;�܃P�՞R�蠟���a��@Q�o��Ugx��-"F����c�U�E5�>��G��h�b���*��w��&�o"�!���|��ӈM4s�Z���V�U����� ��z�k���8:Fh�vcm���J���*��硙�k൱p�����=��=�	U;sk��+�|�llal,�s��'M�櫍U���5���j]��sb���k�x���O�գ5��m�Ѻk�_Vh�X�I���O�Y�_��K,\��s}�~��8sd�V��,cw3�V�(�W���g���4w=f=��U�ٟ���sl"f���|�S�x=ʇ�����Z�]�X�*�F�Uq_嶺S��]�~�'�Q��ۘ���Ϝ�kc\�6VkoD(p��7k�*	��=0�ׯ��[�/F�3GV�F��5�O4>Tzbc�yO5W��Z[����/ߎ��X�'}^8>s�s�ۼEy��m����p��v
QAd��D�k�|�9c��Kb쮥���Ӻ�Ʊ�ђ��9��C��z���]G06����f�ƺ��3���V�����r���cm\	i�4_m�8�sx�w��:D�m���.F��<!&���r"�:���'oL?���P�]���Ϯij�o,a��8�װ��q�ذ6ެ댉Y+M��i�j��\���m^����Ƙ:���:���|5��:��RZ��U���̍����O�j��9����h���g�ꏙ؋;���u���|5��>+}W��/;K�
���ՠ�`���9'�O4����}���^����Di���j��"���kiP
z/?)��Ү��ftD����.�Z
�Di����_�Uh�j���:�3y�>�	���Ă����'��^j`�4Q�������ÿ��p��k��(8f�M���>ʼn0��gg�����Di���j�Rw��i�&J��4VsV�Y?����_�(�W�X}?��-�3��-�AZ�����h��j�yX�>y*))�G?&O�����>[��-)�^���streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:11D9C4BD-00D2-4480-9DD1-85765BE112BD-7379-00002316C517DC4F���./Sshd':2EBCE85B-E4A7-4CB9-B899-402CA4328A32-7379-00002316C555EE1D�
�@#x͘Wp\W�E�CI��fx�^yd��7z2$̄L���8�����lIV�Y��.Y�jիe�+��U�]�.��n
�w���JX�U2���/�}�[�^+�m�v�R/-Ql|Z�XV8��'��J��c�F)�Z�6ށo<��7w���Зظ�g�{���N,�]H������Ed�K#�1qÃ��"�V�1�������t":ю�f�T Ԓ���
���,�S��//����gECn."|n�F۰��D{1�)"��ۮ,R§j��?��9lp|NJd_8�l2�%�\��e�:�5a��37
��Ȑ���Ô��Ág`�,�,�šf��Z�0X��Bރ|DF�L
k���z����������?�i��b'����7V��P_2��Xn�#|�C��#j`
զ�Ձr���9��k���5܋�72�B9Y�i��[Qy�?��Ť�u�1X����5D���԰�_�g������^}�Ul��?�E�?����M�07=g�p��ߊ�G0�߆��b�y/���<b�7oc
M�kYC�����g�庆=O�����D04���5nnj.�D|7�_�!�^��ݕ�����M�x�v��눎6��:S�r�����Gi���?���]	�"uo*F#�w�M^ze�'�;8�l����G��ߑw������|����k�����W��0�ݷi}���B~�?l
��&�N,[�y}U�*����~*��o��ALt�B�|'���/��9z巯 ����i�/f�f
#}#&һy��Vx�=���~?� Ps�i�p)��A�p����ke
�lZ����Y�˿y�C���y�̣X�s����p��4>Z��U�5���ta
�]�a�l��.��2��᩟?x��/�
/��Ec�þ'wQ���LO�.��*����i�0��YC����Ϧ5�0ў�o�ȖuܭU�D�g�t9��2Pw1
�gSy����1k��d�9�)��;���
7�`����A,O`i�Ka�B�Xwau��|�|��Φա֝�H�P���r�nys�Sq�d��C�ɂ���V���]B[~&�9_�?
��Dՙ}|��<}J�2���w�y\y�Y���ɕ��E������a���`��
�

7ce�
]e��>����M6]�u�;�LZ�#_8����9�1K�X�Oȏ�9X���xg!�Y�y�]\�9ښs5g�ʁ��z�������3?����+�@���2x�W��j��Y|;�=�5l"�o/<�ʌ/�1cm���&�R�B��3���5�<g�Q�nj�~�9�^8�k������~�9t���8
7
��Up]yGq�$����Ў�������x��\�icM���s����~歯����b�%�<��1�+5�p����z�'p�і{��-Y��A�خ�t��GzJN�G�-���#�ʻo��H��ml$�G��ү��z��v��ׂ�X���r��0А���,�E�<�w�Gr�^ܢ�3�}5�_��/��wL�k��x�|0�3@Z-1^�(��W,_��K���Ԝ��^癴|����Fi�.�v x-%�_�Q>&���]ϩ}����.���~�b�5O0(>�^-�'ڌ�h��������P��hT]�%v<�	뛠�<�<��.�̭����
L-%'v�,c�܏P���
�路���a��@i�k�c5gy��-"F����c�U�E5�>��G��h�b���*N���
�MN�D\CH��jc5go�Z�\��s��V}�B���3$��]c�|��QBk�kc��U��?ZE�<�\^�d�Y���O?)����#���:�$d�
;_9[���I��j�U��~��z�Zנ���?�k�D_2ʫ���Gk�7���>��u�P���ѪS�{O�Yoܰ�C,\���s}�n�����j���Y��f,�4Q���|��b#�i�F�z��|�?�Cr_,n7c��Y�ou
oD�pe�{��L^����$ֈ�&���ttʚ�c�o�$�ϼ���1�S~}�c��j���yN�f�P5�5~����w���#+b���hM��U�ܞ~�S͕��֖���w��o��r����1/�>s�s�ۼEy��m�6�W�s��v
QEd��D�k�|�9c�����YK�e-6�u�M`��t��9��C��z���]G06�*�����u��+g�ul-�~���������q5���\�`Y����J�u���.zGe��wSL���^"�:��{y�Ӷ���hd�ҮgH�Ϯij�o,a���ױ��qI�a}�Y7>&2d�4Q�����=2�1s6�Mx7��k���X�Z\�4Q����Z'�_A�{��*��C���O_1q�IX��3G����ͷ1��1'㌩Ě4p]i�4WMc��j�YC�eg������vs.�'�gk`L>���d�
��\5���+�R���kiP
z/?)��Ү��ftD���I�]����\5��{�r����:f�
0g��������Ă����'䓕>j`�4Q�������˿��p��k&��
��`7�|B���0�C��ro���\5�՜e�i�&Js�4Vs�Y?��8�_�(�U�X}?��-�s��-)��H��i���/"�}r���hJJʏ�<F~JM�|�6����ݮ��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:11D9C4BD-00D2-4480-9DD1-85765BE112BD-7379-00002316C517DC4F���./!rbd':60DC7AD0-C861-40FC-B081-42AA0BA0CB0A-7379-00002316C5530CFA�
�@#x͘Wp\���I���-/��$�yL^�@�d���a����2�.!��l5܍,˨K��Z�jY��ʒե]�.��.%_���b�W0��o�����k%l�VnWb�����Ƨ�e��~"��S���2,�(�LK6&��G��]����B�r��ÇK��p�.����}�"8ݍ��똺�D[!k+���p�K=����t 4Ն��&�w��ߜ���r��B,�s����O��⋢>'A>7�X��T[�	�#Z�,S��jG^8��?jp|NJX_8�l,�Ţ\��m�:�7b��s7�����#���á�a',�-������o��P-�x��45l��"�f�;o��$��Ϳ�i��b'^�]4�P|7�KWyVF0�S�Q>����׳�*S�`R��࿝����Cz��H���X�'���vT�z�5���a��2�����`��5T��J�쓿y��vTÁ��^��~,�.`l`����\|,_v;�ҏa��
E��^Do�y��o 4���a
���~��_Q���=���� ?����8p�B���s�旬/8�,M���+�7K2���l�b
�ob
����R�����j{��bϟ�DQ,�K���:�PN�e���eKy�t�����ܓ�Dj��0ϧ�xs�/�ܾ�o�S�}����A����/�x���MN���d�X�<���*1�Y�ەq��d�>"��fS��j�5��N��w����?��Xv�q�A����7�A��55���"io��o���X��C1��/�-?����1�n[�b���-���MK��Q�5��Wp?�A��)���8��a�?7K0Ps	7�O��~[Xð�N
�v�0��6Ϧ���O(�5<��_���p�K�}�؝p�=���k1�]��������x}�5�����O�N
�g�k�j�շ��uܭU�F�g�x9
��P{1Ug�y�'�{:�Z!?�HN}�����lO9F�1�\���1�Nbe�+V�]X
tb}��|�|�cΦ��j֝�L�P���|�nys�]~�d��C�Ʉ���V���]Bk^�ه_���v���A��Q���Ǚ����=�������er��w�h�x=eg0�x����6X���Sc>��]��M7^�u�;�D�� _8�\O���b�V�P���s�6Z�3ԃɎ��d���p��hKv��•C/���1��O��@G^2:r��+LC���=��VJsզ2�,�#�{hk�#�o+Hb
�Ɨ氱��X#֩���3���5�<g�^�jj�z�y�\8�k9ɼ���z�yt���(7
RЙ���q�8CU��Ю�������y��\�i���Dr���B"��W^V}B�Βu���U��o�^�yt]MG[�I\x��朠~Kf�h��Y��.�V�Hwq:|��|�M<������ɺ�ԯ��B��;9!��;l�Hh7�}c�+�U��U�@[>�0P�ɳ�<ߑ�.�1�H6ߋ[���s����j��H�%��&�w�U�����tH�%�k"a���K�|i�O��7Pu�u�IQ�w�j�^���xG>Ʈ�ī�6��Tg��9uӴ3]E��Y�����)�N��_��ĩV�-��>i��/+��7U�|c�O��&��*��>��K0w�*)��|SK���(M��:�o��[���a��t6,�,Is���,��5�E����r`,��귨�'����W��|Yű󝼁��雈ki�4Wm��“-\���p�o���/��
=C���5��W'�F��6V�D�{��������5���@�����cr�{Z?诉̭eL�v��󕳱����ϱN�4Q��6^y���|�'�u
Z/��#�������;z��|3����8Zg
��
��<�^�����-k8�5Ѽݟ1ח�Id���
��e��a��J��j����,6p��nŬ���7��:��#63&��|�S�x+�*2��d�Z�]弰�:�F��Q_念S���~�'�1��ۘ~3�9�7�8vs��މ~�'��7k����c`l�_׷�[���Yۺ��4>�xy����j�􅴶�����|;��c����y�S�3��-�[ll�w��<�s����k�J"K�'�_����Kd�cg-͗�؜�56�͏����ϱ�r�����:�������o�h��/_9�obk�o��=��,��G��� M�檍��p���]�h���wT��1x�b�=��Y�1"��럲3�|F��v=C�~vMS�|c	s�FQ���Oߌ��
��ͺ�1�ak���\5�U�!���u���??>�S�����i�4WMc�Np��V�@kU�G0w3��b����g�>���#�oc�;��&��S�
i��Di���j����f
͗����ˇ7kP^���\$�O4���D}����6�7�K��j���K��!�A5���K��Қ�Q=#��'1v��j�&Js�4V���b3W�=d����;(��ϋ�s�5�O�'k}�>i�4WMc5w��/�=�|׌�u/8f�����>��0�C��jo���\5�՜՞¯�"M��i��l�~�2q�4Q�����~�7��[Η��[Ri�&Js�~��_E����~�'�ф���G�y���<���"ml		�v���streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:11D9C4BD-00D2-4480-9DD1-85765BE112BD-7379-00002316C517DC4F���./�pyd':E33C04F3-412A-4A76-A66D-D95AF23D97D5-7379-00002316C55048B9�
�@#x͘WP��ʼnc9��L��L���5N<�<%yK�'v2��v��EedY��J�H�$@u#�LK�Q���b�&@Qv�99�޽˂U>���w���r�	�i�+0Ozh�b��
Ų�����u�a�����fsV���'��-[��x�m����Gs}�h�.�����[��� 4م��1qŇ��|�V�J�]�\���^Dnv|��h��F�t�"Д���R��,�3���/���N��â.+!>7+�-��Dk�B�>[.�S�gj�^����78�Y��ƣ\<ʅx��F/�P&��1}%��
��/;>L��>�yq6�C�X4cn���y�9ݨ05���,��&��o��'��_�6֡��bY�⻡�x:K3�0\���*���h��@k�45,� y�?N���\{�Oo�~���Ƙ��Cڞ4�w��?�6��e�FY�1�_�I	j�c�6�K�YC��a��/<��W(iS5��웸;�����ngS�I5cd+7J��4���[~=e�����xkh@h��5�����FY�k����x:��
H����)�)���3�d+�	�_�"���+�W�R���l�d
�md
5��žb|����yj��b���P,��Y���.�ӳHޝl�b�q�X�����[��ߖ}���h
W�m��P���/��_��������r(�դYH��O$����[�*�x��eKS`�����^q�?<���D��ljm��@-�	~t������7���m5��-���|�${?|���@�
�Wu��I�x!��A�p����kf
�l����[��y�#^��xf�fq��#ƿ��K=��!�?W��_}W
����M~[YÐ�N�Lu�0��Φ[�y��y����s}���5x��_�j�f��6�?@�5��*�P�y�Td����,O��Q|<?����հv6�����l}+=B�Y��Ze�^4~x
�SQ.5g�Py�0��C(?~�Z!?�hN}���6��Tw)�21�T��,N`a�A?�Xv`y��|S|��Φ�*֝1O��P���t���g���IG��֗?}?�b��;���T�g;2���	rlEʼn]|v�$y
2��W���e\x�Ed&�����;/"g���xv?�KN`��n�>l��@:��F}��[(�S�l8��w��4!E�p�tw	3�c�V�P���s�t��g���y�N�Ջ��2����C�:������L����њ}�9�ўu����1�]��n�4Om�>��b"����
D�y�XC��9b��36Ѐe��+�T�뚉k��h�O65d�����ǥ�ü�����Khg_GA��%�#�:��Za2+O�-�>Fylu�L�,
�*�X��T[��D歯����b�%�<�+q�_d��z�O���1��ř�ϣ%��[�_@�؎�t��O�
��O�M�����	�{`�=K��m�'�E��	�WޱV#�]����Z,Tb�Z	�����@m:Ϣ�|G^�t��'�|/����2��Ug�_���ϡ;��~�<��3�hBg��Z"��a��X��˗V��:�OT���3iJ�_Lގ��mm��ȥ,y��F9��(�ot>|i�0I{��SW�ݗ�Q�<�\_�Q���8�b���u�'�u�e�ruF��o,��	�PP��X�98���wt��]$�Ԗkj)<��);Xg"-|W{J�����p�ΆY�E)���U��d��1�����/�~�j�}����x��˗U?��
�MN�D\CH�yjcU'o�Z�\��s��V}n!�n���Ǯ�~���(�5ڍ����*����~��f.�A��k�el���[���@utn
c�c�����-���|�u}�Di��h�q�_󹞬�5h�hl����#������hM�f>}��q�n
��
��H�<��z��5�`u,o�g��{%�{�#���&Gd�=�XZi�4O-X�>��z�������V�fZG|_$j7b�DY�ou
�G�`Y�w��T^���	T���*���t:eM�Y��<	��g����)�6�ٵ�Z{3��cF�Y3PIh�c{�*����btE�Ȋ��}����J�mN?��J_XkˏC���q����ϋ�Ϝ��|��(o���ߤ��dΡ~�_Ԯ!*�,Q�h�#��0g,�ul��Z�/k�9�kl�)I���c�=�\�ǿ�ucc+��[ߌ�X�/_9�ak�o��=\N�c�G��ƕ�&J��F��8���W��C��f�;*�0z�b�=�-'��cX~9�����

����5Mm�%�C�v>}3..6��7�FDŽ���&J��4V��}f�c�~���q��Ƙ:���D5H�yj�uB����Z����݇�9��O�j��9���G4���3v�#&�Ǎ)Ê4p]i�4OMc��r�E�����P{��k5(/�g��\4�O4����|����6�7�K�yj�������!�A5���K��Қ�zFh�O��R�� M��i����f��1{Ȯ�9�w(w?4�g��bk0V��O�z��}�Di���j�b�^�{�����^p�:��c�o���zv{
�/M��i��,v�!�i�4OMc5g���s�牻��Di����A�p�o9��oIQ�E�(�K���~�����'~�'�)�S�d�狴�%$�f���streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:11D9C4BD-00D2-4480-9DD1-85765BE112BD-7379-00002316C517DC4F���./�pld':ED0B4412-A7A6-4C29-9A10-D44162B75FFF-7379-00002316C54D92D2�
�@#x͘WpT���b2���d&�<�1y̓O&O�C����Ό㱝8�6el�`�'@I�t,$����ժW�
b��:�U�Bew]��ιw�R\�a�~�/�}�[�^�p��p��d���(6>�P,+\��ٹ�R�vc�F!&��2ڂol{�[�n}�Kl�⑶�.?>�;���z���=����]f���Bx�w�c�#�y���3���:}��v#:��"2֌�;���(A�!+%��GX�Cװ��s������D����p�{�0֜��_�������P��+�r�/���Z�7��G�x��/
_�݁:���a�F���!Pzz�2>�}��~<3�ޏ��z,1�_��\ރl�V�KP��A�ͷ}/�˻~�X�.n,�x~f��x�O{Ik1�Y�;|���Wְ�rS�r_1�����͵���6�0?=cvrWR��<��ޏ�S��lo%���JGu"#�ղ�
S�Ro^|���RҦjx빷�o��Mc���.�S�Ʈ�ߋⓇ1�߆��|t�/���<��7mb
uU��RS�3?���(�s
{�݃=��o�tʺ�LL�X��1�����0�]i�Y���d�gk;k���p=k�25,��;��(�S����~�+�b!_ȟ��3�ebd��I��r�.n,[��?��ߒk�d�@t�ө�&�<�"�
N
~ܽ}_��W���6�/���b!_ȗ~i33H?�n��j���˖��\wF�
p��"�_9���>D��ljc-��`5�	~t������7����4ȏG�e������F�><���
~?���"�s��B������/�[=����4�/%޷���:�4H��͢���#X�s����p��4>]��U�5���da
�m�a�l�i��27��?��گ_�v�j���a�s���0�Wa��5��*Kç+�ty�5�A��C�n
�g�
kk�ҷ�d�:��ʓ���Yԥ���R2�.&���1��G�?}�Z!?'�>�������u�o(�����0ҍ�P�v,�ڰ<�o�I��qg��@�N���'(�sk�p����(�DR���"@?@�8`�.�);�ލ�;����;Qvf/߃7Q��G����:�
.��2���tr����}𯨿x��g0Pw3������W���SC[�|y+�yj�u�x�NՓD�ן�,F}�!L�*��#|��T��a�5=���y�C\�9ژqg���WИ~����
�Y�њ}��G�KF����E�}�&J���kS�,� �{hkX��o�=���/�Qcm���:,S�\��gP>�kn�΢%/�Ԑ��˨�p�2��>C�/��}m���������h�:�[I�/?�'�ny����j>��sY�U�Ա��T[�}�[_yY�	�:K�y&��c"Ph����~�$��O��;/�)�8�[R�����m�h�ou�t�D��ν�mO}m�=��V_�~�6�jv����+�Z#�]����j,�c�V1B�9�ICou*Ϣ�|G^�t� |/n�v�ϙ������ЙuT�k��h�|<�3@Z-Q^���W,_��K���T���Ͻ�3i/J�_Mڍ��]n�еL��F�k��ot|��b�v�=�7�ݗ�a�<�\O�	�+��8�d�EB5�'�5�e�r5F��o,��	�pH��X�98���wt!�n]%EԖcj)8�E�{X�>���v��}']Ř�8�
��
�=��8���hQb,uE\K���-����F�?��G�+/_Vq�|7o�or�&�B�(�S�8��h#ת�:ܟk���s��!�x�k�+�Z��X��ܻ��2��yh����h��Z�v�q��=�V:s���+�|�llal,�s��'M��
����5���j]��sb���k�X_<ʫ���Gk�7���>��u�P����S��O�Y�]��K4T��s}�^��8sd�V��,cw3�V�(�S�~�g���4w-f=��U�ٟ�%�/���1��Na�(*M�ߗ�k�w����W�|���NY�w-�M�D��3oc�f>sʯ�q��X���A�I�߬,'�Ə���~�\�^1��9�":�v�i|�����{�����������8Z��~����3�>w��[����oRI�P?�/j�eD�(O����G�3�Ⱥ��ݵ4_�bsZ��6?T��]?��{ȹZ����Ɩ9�[ߌ�X�_�r�_��"��7{�9Y��u���!M��
%r���[�h�͢wT���1��ń{X�'��cP���?qs����J�z���욦6��挍�x;��VǛu�1�k���<5�U��~���v�M��~��XcL�ZV
�Di���j�po	���*�ub�f6}���'f5V�}Z��G4���3v�GM�;�+�u���<5��>�=W��/;M�u�VkP^���9'�O4����|������
��<5���K=�f
�Ҡ�^~^tݥ]ki��=#��'qv��j�&J��4V���3W�=d��ɻ(w?4�g��bk0V��O����}�Di���j�b�^�{����k#8f�]�1}��ü����Ů|�K�yj�9��y_�E�(�S�X�Y�e���8q�4Q�����~�7��[�c��-�AZ��Ҽ��j�j�>yP�y:!!��?!ϐ���/�Ɩ��?S����streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:11D9C4BD-00D2-4480-9DD1-85765BE112BD-7379-00002316C517DC4F��R./Ycssd':E5A8CC16-4FF3-4C69-99B6-A8FB275E098C-7379-00002316C54AC95B�@#x͘YP[��i�Kҙ���3�����k�f:}�'�}J��I�I�nܦ3�p��6�c6`b���I���Bd�]R������+���KSO�
�9�w��ϽWWW�<a,���X����ƴ��u�>6�Q��������17$?x���ر�oa��t,������|v����	}�{�N�$5?*����H|������g��A�#��㒹�
ܔtbPV��%9�(ў
�7J2P�F_���;wV˳��U*)�7���4��`-���"��__���4�{�=�8p�b��%v�X1���0��_���p�$�jdq�J���	4]�@�|���/Ϛ�H��G{a;ea�	נRR�-���T�4��A��x�w���w�Uk��Ši-?
�ٹ�R"�О�J�f�D{�%�@����[��+B���طo��9v�D"I&��e��<s���Al�YǼ��+�;^�;���*�j/�t�OR�N�Ц=��i�?��{!i[=�ݻW��a�$///[�Š-k�5&5�����p�Lv�K��d�%=׏�$5�EM��+���� �qo������
���E�[�ͅ�MMMiL��ȑ#��s�a�kj
�@��u2�q]n�]��B���0 ��n���V'�'?��� �Ѱ�A�S�����B�ڙ�el��j��{8�s~�u�qF2�A��[�I����fY����;/B�SǞ={����
�/cr�СllYr��a��zZ�z+�lmQ�<o��H�LuU�@��~������2z���3���`�@�S�ݻw����^Z�V�9�5Ϙy��V\���M�o�%�S.�Ug���(�7��Ø��$�]�EƳ�A��ߐ��v��%O����u.���0�?n�a�%�b�.ޭb�!��I��Q���a��to��K�|l�����믿.Nx���n���i���'� ���$�R&_l$��0+�/E���[=l>�6�Cb�ߕ����Q���⫾ ^|�Zq�6_;)�<ϓ��<��v��S�
�b���2��䌬�O�r|\�cY���j�/�q��-�3m{6���$�Q���A���YzTF��d��\��V��+��e��9��	c��w��e-��j��j�W����G����_��+8(�KWI�\?!Aw�����=�çcݲ6�"���3�?����h�w]�y�g��HƄ>y���O��i�k��x�zd�}IJsߖ[����k/�iw�qpLz?=��@�)�qZnV~,7+NJ�����q?� ����!�ј�,Ž8$\C��-��O�F/V��?�h���K�mO���=���>R��C�@���9�Y�>��uZ�7N�mW�L��;��:%x��L
�G�]��9��>�|Z��|��㙸p�-���[���B͗e���Bk?uW��~�<_���uNF�]���p�KO��ҋ�{	�:�ڋ��ߍ��M�[9œ����o̴KO�9)=�7�
V�=�L�YtYFq-F=J�6	5�x>C��t^���^s4�|W���j���L�|�v�ZW­���55�_;}@p�/��㻬N"��e��Bf��@�$��xǨ���ypw�Vn���]��}��'j�8���{b�_��c�%3���0G:e�r�!�E�G��T�]f��r��>��)�����>);�_Ƽ�m��e��w�P�ro�ܒD>d�-�u�돷���j�+m�Ğ��<�p���+?)�S��Co��Z�]�x&z1Ϙy���Wȍs��Z�q/�u���z�aBM��h��
$3׋�ڱO;,�3l2Ԡ�䱩?���<�g�l���
����n��L������-?��i
�g�a�:�ou����<Ե8�+��9���2���<��|�E��1�%�zY*��7��aD}���̳���d�엵F
�Ch�4Gc�咡��?mv��<�y\��>��:���6�Gl���5O��|}[���^�MX?�rѹ�f|�ٴ����y�!�'�OǼ�:�����j�]�l�X�B-k2�
�^܏��zJs��
y�p����i�F�	ڠ��oez������G�%�D��ߴ�}�D]��h
`_��>��s�m�m��X��=p~�9úL�-�GZ�6�W&=���ޚ�LJ~���x.��!o�Ӧ=s���C��f�e�Z������W��g�K���m ΀dЅ�+��B���o�YV���>�wM}����������6�ߞ~�s\���7}�F^}��E����8�'���T3��70�Ĉ��m�o����oQc�h�&<a>�8�)�Sck~�^Y��P���ϸ��G�q
�����>�Zb�Y�ڕ;�f�9����腾a�V�5�3�5�V�&Hs4f�b
����݇�'vߎ=O��'v_i�6�����_�����M����죘>����ȩ��؎��:b�ʦ���5��a�	�
ֲ�ԔG�_�y�}Z�j
6L
�i�k�O���4�����Xq֢u���5g�1��M2�a��I6��R�9��q�'�u���{�sz���̘>�|Z;�q�ݚy��� ��`-��6Q�{(�C�|�%��V�s�b�����f��

�i�ky���\����1h9�[0�$X�1��	r�=s��k�Ѐ9j�4G��\���x
��{f��8P��
�Y}����y�;�!�>�OM��h��kV�5���� ��`-�l�A�X�ub]j�4G��|�;��/�k@��dB-�iN�OY�M�~�6~^�����o�+��圯j������streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:11D9C4BD-00D2-4480-9DD1-85765BE112BD-7379-00002316C517DC4F���0/����'htmld':025399F3-BC6B-4021-83FF-D387659B52E7-7379-00002316C5480746�[@#x͙ip��u���r��M�If���N��?ڎ�x�ĵ%Y��v�I�6?��&i�&���Z�ŔlI�d�"�})�$H��o���/ (��N����}�!�������s.>��9�;�~��`kCf�Rk��|Vez�|/�����#���pt�p���s�㧟z��O��C�VmuЄ�֧��b���'���ER��1���A8�6�{W%l�ZƦ@��:��@%\��pݳ�?ԉ{;6&���g�ts!��
X�-�a�q1_��KN��l+V�����r�upNTb���*Q~#�ZG4>/99���mXo��C��.��w�W�ט:A��|�v7��_b�}����Z�h��tV�j1�V�{P�YŰ=f�1;����w�jS�%&~���"1��i���D�1�\��8��C��akT���3���ٟ6�[b�tg��Zg�]��O�#&e��^�~�2±<R��^=Fk�0V���]8gC��as�o�����S��^���l;�8fIW��,^L�HL�K1�&�k����6-�|6�:K1l�Ġ�6\�]ؙke�pN�0�������>5�g��ر�TU�y{�����x����/�`�0˵+�=�$�z��v3�6��61�ZÆ�����D��&�zKL�Gb�^$&^$&^$������(Q�E�p-��������LX*�}��"�c�O*/�[b�=�"1�"1�"1o�_��!X6c�R�!s&�
��|���f����a��k�����<���}xKL�Gb/�)����y��ʸ�?�}=�h����|�6���cr��|V�Z�{oZ������W��y����͹����=�<�Ӯ��=��fø:'��(�0oa��&Gw��~,��&�ea�+�5�*���p{	���,>Z�`V�{bx�7m3{{����D},�_g��k�-IB
�[s֔��p��(�U^w;�Ao#���0?D�zA'Q":M�;p�G`�$c�3ea���m�X��c�
+�ؘ�`��3�״�޴5^���U��X>[Cv�k���5�e�@W}U,,[��sU�Eh�����v����ꇿ��(��^C+s�?'K剰G`</)~�$^Dn���<��p��sBO�1+mw"1�����;p��3ӄ�Q3,)SO<����7�pdM5Q�p�I�"{]�C�ﵹx�*�T����"֘���b�S��.#�ks�0�`N���`�]E�����n1���S�y:�P뇶�(�Š�8��7ѫM�LK�*P��J4�l�!����;�GZ��X�e���K�|�.�n���::���
�v���8�5K%�e	��E}z �Q�s~�{
ע�Ah�;�]=���ptj�a)�CWI,�X�"�_���t<y�'���f����}����J�F�ӈIM(™LJMQ���j*��.�pʉW��p�����`s��<ŵ8�E>������^
;�W�b���>�s�7�H
~���А��v�Y�K��%��������S�4�>���2�/����-ڰVb0�C|�:M����p����?��#�fu	
�j��?�^#�4���X�-��&
��+����r�p����_Ǐ���D�q�I<
c�qt0�M�4��puFj�0ѐ�����\���j3�k�=@��rq_�צ"�簣��x�*�7hp��?Ȼ���}�r9�`g�1l`w��=��-���'a*7���񏑧�����@ǜF(���24��і~��K��S�s_	f�5�[�����_�s��Uq���s��?[���`��E�hE0���.��]�/2�b}��W�q�An��uƲƽ}��)�Xm���"�ف0$_��*4�u�,G��p�$�+	��w��-��{t��X�Ҁ�,��|�1?v�w��E����V�V��V�!	M�����>r̺c`��_[`�p���b�ZM&Vʢq���i�7[L̿;j
1��+�!8�Ao�Y�;5�1��~�&��d��[p͵������Ku���-�Ə1ȩ滕)

��"����:ؽ7�]���1�0����V�5�fc��ˊg�[�\K%���a�%�?S��g0�X�L*c
��o���L~��-�㧲��R�3��3�bՔ�=>��Zu�V�3�k�;�p�`���7`�2Ŧ���_ok�s��V].^�N�c���&�Ɛ![UpM3�+��|�Ys��_���*�C?�q��q�f*&�W�2�[�fl��c�s��[��N6���jNNJ.��X<�\�oܭơF-^�>�9��7�C0��Oa�"��]�A�[f�)��R�^�f�V�{4��aA�UC"V�)��6��s�Z���Z�R���b^�s�����h{Q~���j
�6
/����H�)�c�ѓr���wJ��wM�c&��d3�d�ޣ�>�d�
8J#C4�b)ƠO�}Hš1�q�q�f�eN�Je"������8�
�la��Cq�%4�\�ϴnv���d��j���Q�V�J3�$��#kFڹ���l)��˥7��D��q��~<T��I��K=�F���D��y�~�y#�o��8�̫�1�Ǯ�z�l�Ӝ7��Q�p����%7��9]�F��K�Y�����,Z*�;���a�k(�<A��!1�,s?	���|n�cR2���U��d��9'm�̃��ٚL��C�(�T��|vh��)n�#����c>���q���~�%t��<\�+�o�{��1E����6䟔��)�U�L8��v�=^K��g�|]�ڲ�b6�[YWԵq��C����y-<{�[�pNx�s�)}��+�Ⓐp�#��bw1�"�R�(�2�ޒ�p3(�i��N�1��G]�T���q/�gݗ��x;���Q��'b�R�3S%�2�O�]a"�O6�'�l��+�T�=IY��H�-�L�{��0��̭�
�d�E�������&��5y�"�r�U���A�ϜK�,�@7�g��YX���{������l��{�8�^%���.�C�g[��`0��b��_�'�8��1��F�.��c��b������&��ϢS�.m4�|���q�V�͙��qd��|2�+�;ٗ�}���<���-��"O`�qL޾ļ��{E��sm,�z���݈hϾ�ΒhX�a>�}k�~�.s�E�xa"�O&u���'�@����W���ˉ�,����5�w#����9�o�+�
�2��������N��M4db�ZNN�X"�����1��h>���-�+}H{�*��;5�\��R�V�q{tq���2':5"aݓ*��9���o�۲^�?����X&��dRW7�:Շ�P�=%�yc��=Ři�(c晫G�4dJf��b�%��;�H��y��"�v&E��ӟ��v3�|2�+s�9T��J?j�G���{�3ydNׇt��Bij�����]9��}�s.R���>e<����a2�;a"�O&u���ݒ{��n�χc=N�#^�.��T�z��!�}L��7����`�*�|2�+m6��a"�O&u��6ﵴ�"��D4�L��A�p.������lO�"LD��J�.�lC}�=K>p�=�^�^��Bu����<A�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:11D9C4BD-00D2-4480-9DD1-85765BE112BD-7379-00002316C517DC4F��
(/�officed':11295678-5AE8-49D6-A613-6E33D9ABFC95-7379-00002316C54520DA��@#x͘yl\W��Ҕ�(���@*��	T�T$������+�_�UQP�tO;M���f��%ޗ�=�oc�3�=�����s�||�}�쉻M�D�U~:�w��y�&Nc��,�4��%��V�/+�\'�S�L�b“���,D���wܹnݺ[ob�7�Mw���l�S�X�����|��.��;n��@�<ň4氶�eʿ�|Ű&�`��\͈5bn�<�ۋ�=�hƽ�q�pCk��z�F3��8�c�06,�>�㾉�/`�ۅ��\�|��]89�enX��P�ѰBBc�ȷ-u�Wܱq���M�;��>܀�~7��r0��6�c����s��&�縇��#	�50f���/����P��,�0��B��,�Abe��h_J�n�e�w}�D��w-��qh�����f>T�
�|�֝B,X��M
������X�]�6���"��i$�FdWrb�.اv1��\��=����u}U���#�a
������y��^��[r��G}�d�kb�ZM\����t�����
��\t�FG�A�x�s�5�T��Só?���\���0֜�ű��EMü���}mkn�c�IĤ-B��Z���;���ݕ���ݰF�|gZYdžϳ��a��|���s�kn�M���u�g-+z�]6N����S�{$�?3�Ƅ��Y����vXc�D
m���&j(�l�9|�/�A	��F�l��b
Zi4~����[�o��>��1�U���<t�Fé�x.��һ����!X�w��?|���k�Gc
g�ܺ�F{[g���˘�/��b!tS�������h��ĥ� o���\�0��F��5�gӔ7�2e|�F�O�QW=���&�z<�+lH��d,6�G��<�y	7[���Ӗ���c�����[�XC?�h~�G�	k�w���9�&Z�.S�g�a��$��9QGxX�'�ߐ��m]2��H�bҿa�O�~���_}eDZ���(k�Ҵ�5tc���gdz)������������~>W����Ē�owH\�6cc�ۼ�3���"����6��
�b&���^�[1j�B��EF�N'�M����4��LY)���'�8�%=���d
�R�}d�e<�'�kv|��3��3X�C�.a���xG	��Yh�چ�c�Ps�M���׾���>�&�G�A��t�
���}�
�3�[���=�[n��:JK�
���>�:Oj�&!_h�K�|�9����R����?P�3���o����h�w�����M�����+�oA�h8��g��9�=4�΀7g'B��1�+@�w/PZJm��(�"��|�v
W"��4��O�H�]�y�{�=��2����_���@�WP��o��xUo�U(��q�����9gZr3�9����mh9���y;�W~����V��6T}�g�ej1�D�
+L���ޏ_9�S��rgI�y&N����Ы�x�~����.4R�{�+��O�������󵉴��D+��^Ҟ�^�=�?������m��0���XC�9�|�t�<�;fb�85ʞrw�hU��*��c�� ��{�[}=UGy���Ѵ�%��o�>\L�Qz�\�8���k��w&Cߵ�ڠ���V��r�X�>�ia6���5�
]w��j�����+�9z�|���ԟ�����"N���!2LFZs1ږ��}gn�6�������D~��'�6Z�p5}�sƫ�_쌛}$�<Dc[��j<M�g��Ua��`��k��F��i΂��[��7���QO6��BLv&:IG!�/`ܧ8��LY�b?�?�Y�!,b�j S���[+k�zW��`���|q���<�&�����6��&y�9o#Θr����YS��B6�Di)�H�>��q�E4�Z�k���z��d�\�UX���<�%�)���u��0�U�m�G�S�.�~��f,�A����&�"9����ǂ��x�9ʳ�v�P�����N?qM�(-�.�k��x�'�y
����F�@k��ZWP�����ƶy<��o�ָ'j���5�^i�+���[�����=['�9�K����pٞ����s�ʱ���4qi�?�]�K�ݳ���xo;�|n�cqs�+qw�;����Pӝ��\�po�&c�r��X������Di)�P�܋<{��+1��wR�jP��f��]��IBuI��B��(*ٝ���ݼ|�8�
�l0Vsɯ0�ר_58:e�~c�g�$�ϸݧ�@��빬�8v5Ws_��`�.���,'��_�.�"�A��n�Z\���|����X��Lj�F�p�[�+�I�S���]W��{Nc�/���'q�η[��7k�<Z��S��Y�z��J\:�E�+�1ҼW�v�䓫�_��c�@�ʈ,a\�G�_��-�e��ލo�����(��'ϥ��J,1�*v<P�#u�̵�!�j>�]��G�O{�iM�<T��(��g�_��/3:���&#���q�r�[	k��!M��Rdru��J+�����]�u�8���w�ߠ��bL��L>�V��k�� �A9�׶�D�u��B�
3�N?�h��Ğ�y����>��u�]����㱟�P�*�X�1��V}���~�߶�Di)5�X_�{]�}��$L�kMh�&JK�)W��z�h�4mҼ��b��<K>����`���O`�~2�˖ *
�W�(-��\���}�̡�f/��YCqab�C�D_�p|�d��d��
��Rj�����f�08~���Z?�>��Z�$;�ek�&JK�)W�z�3ό�<f
�+`���$�Sl�������	�d��xM�(-��\������c�o�9W�8�s�]�+��_�5�w�:r�/M��RS���r�H�4QZJM��a��y�<i����r��A��,�-��@C��"M��J��r��P��i�	�TZZ��	�!ϒ��Si�/�	--��8�
�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:11D9C4BD-00D2-4480-9DD1-85765BE112BD-7379-00002316C517DC4F��,0/�pdfd':E63A58F9-684D-4FF4-9040-9E5DE0A697E3-7379-00002316C54281D1��@#x͙i�T���qQ˲b*�ԤR�*�_�o~��h�1Q�k4�%ZR�)7�
* �(8,32��/=���3=�ҳ��ݸ�y�s���1e�)���s�w�}�s�=�L3/�2֘�Q2�%��V�.+��ّ�l�30�Iő�L�������s�9����^�h _�w��H3�
���v�B��PB���c����,��$1���(�{�?Ґ��p�G����`����L�b�=���S��9\qǶ����}�>�3\7�=Um.DM2�?3Y�:0J)ߩ\�\�y���6���'�X�g}r2��+f8��=�o/E�+	�CF�L{|�;:(���Wϴ����3t�X����{�v�b*X���BtW'r0әkr�n�Dv�{�L���/W=Ո+W4B�j�M��-k�5ۅ�{%�n�U��-_1��ߺNq���݋��4䣓�?X�9f���!��0՚��o�+�	�_t�g��d���OX�Bu��&�������c���}h-�mE���Lw	s�79L���o�Ң���G�q�#��"k!��;u�2�n�>���<f�'}��6��&�)gٻ>�A���9�b���9d����w�(�9\���>䵑/��⫯i}����S�k�����n�s�"i�ԟ�����Mݎ�Q��:�P�POs(49L4��+.�%%��8���/�kq�;u�Z�qF������E"�H��J4�]�h�s�"�)�Sn球��4�?��������`����HK$j�W,�/�."}�G�Kh�c�`�)}�4��A���}nE��f���wY9��N�ѐ
��utѽn,���^�C��-�~}�8(F}"2�iwbfa�B�-e�����=�9�_�y�hc��~��ouos���_�הz��S��,XN{��X�w��v���jQ}��n�eI��S�廑��k��MEKA<);�������C�9'���	s8�f����į(�9\pKB��.�%��i�/����Fk�~cOlw|�:���
[!��h/���}�rz_Ne=�b��94S����i�9����t�F�*i�W�0q;�nD�g��>�򵆴=��#��Էg�ػu-�8ڐ���h+O��`&�b��	c�>��0���T/�|G�NG�MS��{�(�EYQ���PW��s�������톛��Vu��#�n�:c6l݇��L���V�`0��`e܇6�<�=��~�1���7Q��-�z�{ע��z4d�D{���.�dk.��t�}��ϡ�����8��ީ2R���|q�_F,_�_��KW6�/��)��{h�j�\o�Ǩ�>Z���#��u�^}�C��oBm�F��_�6t��1ܐ����W��By�-�Kb�]s���n��m�R��_��m��c�z^���Hs��d��~�g}
W�V+��?D��:����ͨe�;y<�[8_��_����hˋ�E/���N[���rO�L-F��-e>�nSn�'�/���W��O���o�x��.F[�pėj�p��]�K�5�Z%�7Q�E5�Wq�lC��>�O�>�/�y?��e?��Ӗ��=ԯoc	�f�N�P[$N�w��Dz9��p0�c�y8Z���Ch-އ��X�E���\��v|��&�c���w��p/:J����w��w��W���H�E��r����K��P�뼸�\�ҏ��R��q?d�ߝ��玊�!�؎�� ��x�x�^W�x��b�9������j����_e􄺋��pO1}Y�6Aߴї%�ߝX�E�Q�~~��0�}p�)���Tԧ��.���Kmҭz]uҒ>�+��$�u7�OCk�6�+�*���r�+�&�RgȁuǪ�B9�Hs��۫>���0�o���t�E�8�O� }�/�����o��~��Q櫘!�G��~�n9�;�"�)�����,k!�V���/]Y�i�-�����5eb�:���y�9�d�v�pc��]��Y?���ɥ~���0҆�-k�Ed�r��]�\��a��g��BLv�b�5��*�_j��4e`�u��8����k��v�Ԛ��������hC���f�B>u;}��`���l=������gHG&��0�<&9m<��斋�l�3+/�9�\���y�N�0z�9�p�s-S��D�.8�]u�FS���u��ڇ��k��=Ŀ���M3�cZu��)���X��L�?��\�h����(�Gy4'm�Zw��|7��P�\�DZ��E}���F�;\h��������CDVH��h��H�Xy(�L�CsR��ߝ�������Lc�Q~~��v;Y�?�vnz��{�ܩ��[�f��Rݺ���r��-�?�Ź���ߔm��ZjI���`�GF��
�Z�G�z���Xr��K���ȿEXw���<���XwtG�n'�X�crh�j�F{��3ӯ�l�����#�4[��gܓ�<|o��X�:�S��_�y��v����qΓ�oֽ����|�:;����`�Vދx��i�Kd��m��(0�������	����@�9O+�E���qn����=���u|6��P����+�A���0�����},X7V���ԯ<�xތ���{[�랓V��q	�H�5W+�ך����3k���]���0���A�(-���\5�!��4{!_D���]h���]��Ժ��[V���&����2�!-���,�W���[��5G7��s�H��p�+]я���u;�Fϲ�}��{*���<���i|5��� >����Fq'p�ZcY���cs\%��\ݺʋ���CU����P�e��Ң*�U�3mY�ړ��m�'�\>3~kbx^e���xcO��a��ZL���Ң*��}fZ2i5��}_Wy���Vo~I���خ����|Z�}�,��v�6aS�D�٘��W�(-��X=g�9��C��j-&��l̵���ԺZ��>tx�VL�++�{���e#Q����v��@_�(-��X={�9���{��\L�Z3)�%X�u�1�'���~$j;�Z#��'v��� M�UQ��z�1�\���7P��k4�o,l�!,wJ�e�Sl������d5�O�(-��X];��e�^���wq�?�.�l�&zn���g��>��h�L��/M�UQ���hH�e؟��V�q�+�XSl�WH�4QZTE��f����g���Ң*��Ag��~�0�%�H�4QZ4�����~CNW�%��͛���:��\O�A�w����streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:11D9C4BD-00D2-4480-9DD1-85765BE112BD-7379-00002316C517DC4F��=0/�rtfd':84295360-D2E0-4633-A5EA-07D523556162-7379-00002316C53FA9D3�	�@#x͘Yl\W�CI��"���G�/*�;��C[@��Ht���Y�fO�I�8��Kf���ocǎ��63�x��I]>��{�k'_��?������s�g���x�
d���(6>�P,+\���� �+0�Q�ɦ|�����>��}��=�%6≶��J|�4���x8��y�B��lR3�HNtcq����Z�X[�ǔ������Cz2�?ЎT��#
�龅hcֆna��8�>u
W����do�4K�9H�Y�7c�?�Dk1�)��Ěo,Pʧj�yoa:�3��I��[�4T�D[�;X�'��
���]_��k�a7�/��28���Q����p=V�M�#�R�k���H��am��W5���o����ݰ�<k��éQ̖�0�N�W]��p�{�1�?ڔ�d�6k�VT�����M\�+2��4�����pr��=��E�N�^:���LtU�A�ks���d��5T�V����J�UC"�/�����a�Ų.��L]8�i��ڋ�W�!z����@j��5�#9Z����~�Sގ5$��HOc&����"�Һl�3�u��G�è��/4];��T�O'khA*�¦��r|���%fl�g��L�/N�S��B��Y���Bs��n�Dz�ǩ�.�ܟR�F��J,�/�׿��g(�����v};ř(�>���*�GJp��C����|7�D�����3�RP�'�G�g��L}�.��|�w������w�/���K��b������/|W�5��7�w��R[���(�_�s�5W�Qr�+������!󝔞�&�a"�6����)����u��~��{���tw9�n_CoU��f��:��ha�5�S�[��޴��7���y��L��ܛ�C(�8�׎���as/\8� _�����7&Y���H�	4�E�Ճ�
�`ibc}��e1օ�h'�c��EX�i�޴:Tͺs(�)����Bg�ut�먺��m�"�#��#����A���
�Xc�7��|D
N���!��9g�G�{j8�m>�Q���x=Y���Y~çb
XyP�H��{�~y��j�Wy�L5�F�䋭~���/�x���r
`���5Wp��}�pm�~
9G�����%�=��<����h�;���3��c���ˇ�)�W����{�
i^C[C:JOY�N�uQL����g���+�?L1��u�\@[�i[C�{�#x�6SsK�I��/R�u
9��"7�Ž��e��}{���[�e�iܗ�[��a���'�ڌO\_V}B���U�!Lv��o��ʋ�,;�Vjm���oi)8�6)9���s�"�%g�E���ij�|�Y�۱��~H�z7�jv���r^6k$�kԾ6Z��!Lݫ@��n�`��
������d��=���l��W�g(|�uW�s��k��x�&�H�%�s�"i������
�s��V��`5���>Zf�����C����#)�;���d��SwK��W�8kV�����5�NL4=��m��w[wρ�v3^~�/�U�_�ċoT[�Q�8�_�7���[�G��W���
���o�c�x���"M��Ӻ0v��-<ﴛ�Z�x�5N���e7bb|'o�or�&�B�(�W��Bz��k�r�km��֢��>/�´�-�q�5��\��ڼ���?�?^E�f��\�٦��-�^?�{��z�o���sĬ�6k����X��w����|�x�y�_󹞬�5h=7��y��>/ʫ���Gk�7yA_yYw
��������:�e��|/�X�ּb�����
�%���k��c�|"�،'f,�4Q����{�{��k��v�9D�o��Z!_0s�X=۱:����|,xο��9�>g���Vo��2~��g������]��(}�mL�A��c\�9Vk�F4p��7kFC���������o�F��zI�n=�wM���:�;����+})�-߃]��o��2���ߚ�Ϝ��fZ��ؼ���ߥ�[�9�����]#���>StLK	a���k�!��.`���_c4���W����*�Zs7'�1�ӎ�q�Di��h�)��u��J����{������*��w�(��4R<Zqjw�y�&��v=��B��u뻘���
4N�'��9�ֵu�Mߞ3�'���&J��4V�'f��G�L�1�n�e�� M��i��Iܢ�5�Z��u
n�a9����i
n������6��e�X��+M��i����_f��_V$�8x}�Xl�X��4�5kח��܆f�:y���4Q����ҿ�_j�0p
��{��/��^�{#�Gh�O<v��j�&J��4V��3W�c�n�9�wQ.����sk0V��OV���}�Di���j�ro	���|��8�'�1[�v��Чx;�;�н��[l|i�4_Mc5g�����H��j�9k���?O��/M��i���
g~�0�%9H�4Q���]��"Bm�';����{���O��g�=�+{��/=�$�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:11D9C4BD-00D2-4480-9DD1-85765BE112BD-7379-00002316C517DC4F���0/�txtd':D5FA1E74-21AF-4747-93B2-823D14673F93-7379-00002316C53CC7A2�
b@#x͘�S[���Ğ,v��T���<N^�0�T*���s���&53��$;��0����+�E�@��f̾J�� ]����l��I<�.~uN�>�;���W�9h+�>Y+}��}���i��q@��[-�=���鑙GŲ9�.?8|�|�[h��km�}5��:!ϖ����������t����J��+�me���K��z�b,�1��D�M�ƛd��J��E�9Z%�ݮJ��5����x_��nV[�J��f�E�ksa�=�J��2�|�6W��~
�:q�z�UVG%�^&s��
��^鮾>9��9��LR����l*��g�ݏPE��T_���i{x^F�$>�S5lWH��3�(��L�I�ڂ��؂~�����X���e��Q�����֬�R�O�-��Y��P^����OTv�}A�dkiF�l.��K���YY����Jܓ��]IL>�x�5�U
�C�?��}HsTC,�I�ꂲd��Α1m���e|k)��~䦿/m���t���矐���bLwJb�54J|�5T���/~y���⯒��ye�\�YE|$$K�7U�(���Q�{R�k$��n_u�<�\c�{҅Z%mB
U��`����?�$�lS9�TP?���H�,��O�b��G�S��g�d{����?�k��D�O�h�YC��������C����uSa�?[t
��ew���O{Y�<��!�����=���x6�H�]��;���^�@�K+�TP?���Bh�OX��”��
w�)Y��-��[�V�%[+a�o���~����|��ٴ�]�H}a
\��wJVFq�<��P��t_��3l5�F�{�1�P�t5�M]�_B�s54�� �~�g�Õ)-���f:΢�����wc5D�C
��oհs6m��X�C�+���#U+�zT�Vm�%��wA*o��Y~ZQ~˴��3�1�������*k�/#�n٘����aY���H����d-���j�w�v6m��e���2�Y�[��3�Uw_:}��M鬅���e?�ƀ꛰���PS���d��Z�%TrY��gq��t	�8.���ِ.�����y�̕����w�D�Iև}x�6q�B��6�x���Th�ʳ4˸���t"N8N:<�q�\�ꕆ;'�w�T]�L�?�Ҍ�$�Xp���:��5�Y����?���t�]��9{+�[p����۸��g�k؃=n���P��Æec<(K�58�\����{gj���Y��<&�O[�/I+�����؃�L	��;[Fj���ކ�}[��g�ej�>2وz�cm��O�1�>ϒ
���C�2��Q�p}5���Qhm��L�״�|m!��³��s������C�;y����-�糱@3hs]�v�%�n_C�5�o+�^ľ^��	����JEΧ��:"�̏�e���O���Td"}�|��;(���;���k��T�<���~���L>�v�������9��?~���\O�zD;Jd�qދJ@��B.�
����4��r���Lv�J��D�]������(=�H��bD����|�Ot>��� (k8�x�����rPm%������_诔ž*�B?諔y��{���c�����J1@�G	�k)>�����>cŦU�����O昨8`���1^3�w"��&Hs�&��x��A��e
�-Ǵ��zz��,}�=�>s4�E����>�'k���硚�=�[#��f��c;��~<\g�
��:�0_ŕ�@_Y��7Ǩ	������X����ii��>i.�%��#�YV��g�Ċ%�O��j���9�_s
�A|1������q��~B�e	r���C�:k�Q����|�ra�	��H��q����Q��w+������E�<��It7�G��:�j����_��p7}NH���^zҷ�q��&�.�N��5}^S_ۯ��U�9Jb��k��m�o�+k��k���cL쾎}M懫r^M?>SΥ�צoC����Wy���z�wlj�#�1�V�5:Nt_�����ĺ~��k�J����1p\�#�X��bA���F��@�1���,`�5�|���De�s��՟!�Bg����%6�9̵b�S�z_�k��a�h�C�0���
5A��6Q��'����RrB��};�8}B��}E
��a�L`�>0���`��^M?��h�^��݅?���>���1ǟ�}�xr����i��>�b��Qm�	�5���W���}�M��~)��45P�9j��:�*X~\ֶ���'-r�gЇUXc��8}C��0N[-�Ԁu�	�5��:��j
�����Z=��3g/��r=��z/��U�S�9j̥��A�ZC�5�o��>���a�E���U>����� �Qc.���n5��k��1�`,���E�	b�5�����c�i�s9w��/�g�������@�.�ē�����5x���OM��1�s�z˾P5A���\��B���&�>j�4G��|�;����	��$ZB-�iN�O��M�~�k�w���~e�k��
x7퍒����pI�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:11D9C4BD-00D2-4480-9DD1-85765BE112BD-7379-00002316C517DC4F��
s00_videod':81E977DE-E02B-4AD1-AA6A-7675B4567DD0-7379-00002316C53A1EA2�2$x��Yp������[^R���&@���e0`��Y\��-��@�b	��
�7ɖ7I�n-�b�m�6k�f$K�#�hf�����i���6S���t�{�s���G�;�W�L�L�@"`��0g$���q�9O�sd�>S�*Sd�l���+>o޼+~�������|�l�W΍�ɹ���]�&�6��i��`�z<2P�+��i�-�ؿ�Ǜs%:�*ѡ��V"�2�S.#���[qD����HCz-\�Ʊ�9�_�����AF�:��f��L��@u:�?S�ݹ�;yh�\��XC6��Q���6>�Y�c��`
����yd��Lj�d�>U���r�!��n,uIއ��,\��ʐ��Q���戚����t�GB�J�,��(ރ	�hӝ�$oߦ
4��5z��[�˗1�^����&諔@w�7J�o�a	{O����C�#G������]��h}����~���À]�q��I��R�z+d��Hr����t�$I��J¾R�P�=۳�ŧ�
�^�F������!�5�Z�f��{�{���e2���ti�O���=8��De�-By�����������497�_�d3�}�?\�Ƴ��]���}����9�/}����̏%�o�g�z�ؾr�P�=L�e˯~��k���FjR���l���Ad�Qs���52����(����I�,��f���8��Wa��/�g��?�ѕ�pA/�'����@�G�V�i������y�[&�r�.C�$���/wH��-�@p�i�|&�ќ)�pA�Ѱ'Y��^�w����\#j�1�_!!_��w�!C�
�:u�|��y�=�5�|o�W�sooH�l|��U�����
^��ɀ�o+���������t����O�����|��h|�z��3��4z����z�:�9y���bENo1�qjy�kb�O��X�����i)H�ϧG��=��g��
k�=pM�w�7M����d>+]���P�A9g��>�Db�(�vc�x�9�Ob���Ǥ��tVdHh�W�;$��*_���d�W'�~<���vݛB]��;i�/���~
��sC��#��X=���?��\��-���<���bi�oU�ԥn�����t�R��
)���|]N�yC��ϡ��9g�t��Q<�G�	vH]����/��<X;��`�~�?S�B=j2S��	5���:����+gk�J[�>9���xp�<���'�ޑ��j�9�T'$�)J��!m����1֜-��o����z
��õ��T����Y�떦gӋ�#b�C�?ޖ�{P:���4������H9򡜄gO�f�ű��-Rtޯ��.�=i��*��w��.����5p"�ܗ�H�V����f�1œ�����e�!S��Z�ȩ��R
�'��G�o��Z�2��)|W7�ƌ����_�����U�����%	����R��v���&�#@�����	tS���S��D����ýh�4�h�ݩ4�&����z��p��'Jw�~iN~��k�j�X���>p�D?����-�����
���h�~�զJo�<�����ٺ4�4C���:�}G�=�ޖ���m���&ܓ7'8�
{��3��N�;���LP"S�����9:S���@6���g>�]�|�L���SFπ�A}��u<gns�߳j�����B�����p.��xf���`�#ڏ�S3:9Pm�h��s���]����Ŏ~��d��{d�c����ɽ`��S�ڰ~�}�1�gp-�E�X�΀�O1"�����y��>�h�&���1�+W����{D�t.p=sn�E݆�Y�[�谷H�1�+F��~x��5� ����ֱ�����+��}l�_�(����D���"��c��\��{��Ě3���Dm���a�:�=���};�+�/�g�� yf=�z	z�:�@�0��k�c�n�e�'�Z�o�u��EF��YG�'�M$Ԁ���\ľ������t�3^/SU���I�8����3��\��k�7-�Q+�F��'1�LX��}�x^�t�����:	V~*S;]Xy�N	2QǹCϜ�sQw���[��X�u�C[P�q�c�ع���%K����:�*�D&I�'�;,����&*��1f�C¹����5�*�Wt�=��e���c����!O>�V�z�Ayꩵ2Y�]�:c�q6ñ��s�<sp�|p=j��/F�Ҩ�zF4u�����3�/Zt���x�A	o�I����m�94��s�U9u{q�D�s��چ�y��0��j�1L�7g���;os�ƍH�pجLZz���۰�1��y95���ƚ�{��1L/�&F�3��PG�h���u�_�p�<����>�O��c�_8���^�Pj��
~_ita�Ӌc� ��1������裫�sޙcùb���w`�ƪ�y�ʕ�6{ot������o�����#��o+cٛt5�M�&`E�CϜ�sQ��_����s�]�a�3W���n���^�J�2�+co!;*�k�A��C�\�sQ��3���(�cTp�w�uj���nXg̓�c�7��[o����Ck�e�ڕ2������4��7���h�r�ѱ��s�{���Z
�V��&�ft�Ǻ�U�e�v���e�w˚5����e���2J�S_��yM�s��98���pM���
k_E�D������o��FG��
I~�
_�a`�U;bA
8��#���E�F��9A����������o��G�^�L���
�%È��0r�as���c��r.j���0#�u��٠n��kg�%]�����/�V-u�xy&���/�16���[v�Ts�%a��n�^��^��Nqh�?���d(�%�'�u�<F�Gd�c8�sp�K�?Ԇ�����w�
�~��_:'8���w�E���_,�oI|u���k�l�"�-�xp�#���v烸���Z�4������5�]��p���8\:w��`X�����+.�e-��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:11D9C4BD-00D2-4480-9DD1-85765BE112BD-7379-00002316C517DC4F��R,0-audiod':54F1F62E-9C05-4B55-811C-C1898599B2AE-7379-00002316C536FA9C�$x͙ypU�Ǒ�EDQhD�U��Ju�Z�B��m�ig�WG����qWKEAA�-$aK�ld__^�H^�������{	�7H�ދ˷��9�%���w~��;���{���L9�1t"��P
-%e�ӊ�,V�U=%v�:�U&�'�� �'K0��Y7̘1c�U<��=k2�V�
�a���/߫�Z�{k���P�
�f�'07ӷĿ��fx�k��*����Q��-��J���Ѧ4���L��0���)%,ZnJ�|�X�X��L�wqތ�a�΂��D�2\�f8����+v��S�B1��`tS�kKN��Z7c�����?�fé�<t�$��<N�̰��kfWW�>��S8��O�.C��J��2�*�J��Æ�vFh��i��=���%S�0ژ���-V&���{�U�b��4�$s�u�ܜ7��5COu6Z8�Qp9�2�,��H�	�7���w����$�q��b�l��quxcR/b����n���>�v,h�
���.�1搭r�O�?_y�-v{�r�-K$5��I�-"���Ȫ��K��H�]2��?՜���KQ�q5�!lS�6E�!��搮rX�����eɡ�4c=��E&�:9���y��m:&�G.ak'����s�D��
{er<�v>3́��3���t]*��r'��䣷$���<gk���bݴ�������Oƿ$^��삧��ȡ��9mV#��:��뮹z.���j~�x:(ZaT�ae��5�U�rs�e�;�0P���eI8�y��\��gKrq��|&���N.i��bԵe,�!�Y8�ERV�1}��v+F��h��!	uهP珯��o42���C����צ{�w��9tFq�+�UH�`�b�R�Fy�%��G>����T&�>'�I���p�VN���5���*�9t��{�]��*�%ʏʡ���)�DEC��mB�^|m�^K��(��P�=U�h:���p|3ڋoF��C�lfu�˛���{ǵi�9t��^i*uQytY#1���8*Z������:)�)�wu��"�hM�Ho+Nw6`��CN;�8�,�H;�"�|�}֦��l�>H��Ě�љ���r���<VL'��h��XE�lH��FIJ�����֤�Q���]��m������	�����S
ل�Ûa;��M�єw}�û��7d�,uo����fmRGg^�A��|ʪ�D����)�����<n��j���x�儢2el\G"�!?|+�%
"���-z;�cv�4vJ����'��թ0���h�::��r.��{�s8K�q�f���L��!�@]נD�k$���$a��!j;
E�;PDf[�.���,���_;Q��'�FcV0fΘ>�x?xt=̵��0��=��PFLrS>��J�Hʲ��pM��B�=Y��j2BP��b�	w�N�kٸ��PeI���NU%�N~k�\?�������C�w�1�̆��D��D��(�G[s1Ԑ���&8���p4���\�BP�{Qeޯd����V���Qo9��ca���&�I'-1&�QŪu��7�$�]�&n�*�9��������Ρ�O5f�7X���.h+�Cka4�EqT,:�_<Y�@��N��"ݕI�ţ�9K�.q��s�O�;Kx�Σ�E�_���/cװ,19+}��nO�w9eO���\�k��G'��x
�J�8r&���2��N��_���w��1����j�s��0i������"�P��#�E�DQ�~4r�Z9>�z-�a�����G��;^��oĕ諘�x
�0mRG{�~��\�y�bൄ�	�><���o!Z�{P�Dҟn�+�?Z�|ۉ/m�k�hu\�.K}{���2��P��1+��*�aYi��Y{�X��<N��aۉ>��r�װ�L9t[��Wqe�bYY��o�	�&u�e��r>�'V��܋���BI �^��R6�m*��6�Cq��������5�Wq}���^C���m�{'ϟ��� �2ϕ�E���/z�<Ϥm�Sq��]gbgi+V�~)��h�)��i�$qmE�SbYV�)ՖV��6�Ù��s�k�:WK�����ڇW�X���/����Þ-��{Ҝ"]>Sw�M��ı�s��<�lu
��r����0<;��׬�x"�#����r��8O���|��W���6^;�V��b��@ů��Ȣ��C{p[�Jܜ�%����t��?O���a����Da$��u.�c����G���i=b
I{GZ����ʹ�����O�{�)嗹	��J�㽙*���x)aZ��>diu>���3&u��Vǵt\�˺�"��v��A_C��_�_D�Fv�?�?��c?�Îx�����x<q=�f���&9d�s'X���3e�|����V���󳭾�<W�G���/�\�.�3�$�=<�xDͥ�[c�[���E���a��İo�Ƅt.�k����IJ����r��h�:ZS�y��+y�#��T*�"��Wνbdf ����XP���'M�૔�h,���hJ�2(�>�ie����Y������s�����(Ύ��OTl-���W���� ,�|�w�撝X��/G�U96��|_��%��޲҄��L��&m��h�:����j4�sE¿ė�*���n��>JۊE�by�&<���\��9!�]?�o�qd�J�!��Z��0mR������h��	���C��$������䏱,��X�e�h����<i'b[�5�򨲯$.6���'LD����/6f
�Ȳ(�
{������"�*�7��Pז~M�;��5a=��w���&��8��J�To[e}%�qf��:>?���9~���������U�6E���+ކy�[�g�)�@�0��>DѶ,�t��U�c�z${^i�S����9�"s�V�����ܣ!�K,]x�M�]���|��-��m	���	�[?�-G7�^������R�k�o��Y�.{.|%�}���(H�G��ê�H���N��*�3���R'��M�5���
�
���@�{��6cN�ǘK�`�wpN%�{F~���s�����=�k!�P��S�j�V|D�����|�7�s�&Q�����M�M��#퉊�W+F
�W��9�0;�#ܘ�?�x���m��
�{w<�q��q�M�J�\��w�~~�:���8��N�$]������s-��gP��-zj���Jw`6�f[����-��cs�ȋ٦8����~۴YŪ�����(��,Z�)���m!�=DzV��MV�*v�Vۗ�c��0N�9��ɫ�|��5e/l���d�Eנ;�6�o�	�-/�j~��S�y.߁~�Է$C��9��[_������d^_1�9�� n%
}qAka\�������
�b7�:�+��>GQ���V�lU�]n�~�c���0�u��07�c��{qC�ܜ�~�۹����2m����)���6�oW]3������c��k��ye��[�k���o|�0䍱����G�νNR��ǔ)��~�u�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:11D9C4BD-00D2-4480-9DD1-85765BE112BD-7379-00002316C517DC4F��7.0�applicationd':B05FB1FD-5F2A-44FA-B5AC-17BCA248584B-7379-00002316C534334D�
�$x՘gp\�Ǖ��ɷ|�$>f�!$C��E��6`c�168	!L��!���PmS����b�.�d5����m�zo[��?��jm�B`�$o�s�yO��ݻ�=)j�c�![F�h="`[sD�6#	�z0�e�Pm�V%KoI�x����^�E�]�9�bA���,y�)S�M254�u�y��F�ԋ��VF;��]�!�e	[ڇ�_p��	5J���
�w��w�@m���c�ۖ.�D?���cFS�_�b�S�� l�>��炌4٤�,�,��q_83�n�r�¿ABX�~��Dx"g=���{ʱv��c���B�.O���x���e�#�vt� �Ð#k�pPz-,G�
j�F�6)W�]��v�t��p�M�s���ב�c�K���1���1XM�zu�(�1\�.xc�L�Kd������Jֿ��\C��a�%M>��a?�wV%�����c��`��	�p'�w�Ps��8Ҥ�vJZ�O���T|��C��a�9U�n��qt;oc�L���d��j��U��YGN�������P��l�H�Ƭ�R�y�T�C���yC��!z�V��yCE�L�_����`^�um�����n��w�{��Ӑ%|w�^������Tc�]O�`�1�7�ʷ�������G?𹜐/����1j�^�/���P9���Կ<v���1��ż��C��5��W���k�pEG�=��%�
騹9�v@�?��|�U(Í��U�$
�G�~�U��-�w�c X{:W>�x��K(\�:���9��na<KC����5����Y,��"n��C�4��������g�t��Y�1��iؑ�oh|�1����.�r2�
��jO_}&]E2چ��&Y��NHU�;�D/ޭ�C�h<�j�Ѓ�>���4X}�C�|�1�=�O��XЦ�4�<sy�5��m�Im�������w@>���<�H;�Є��c`���7y1��X�+}|�q�����?�Q}I0��X5�c��c����ti/<-��I29���l�Q�CF]�2�N����;�7M��b�'G��yh��):%S�U��:V��b�D�Օhۂm^C����&���*����R|�9����v�y������y^
��C�g^���C�VxF���g�%[*S�v^u�AmNGO�	��SE�X�sri^LN��~����|��UqN��KM�[b�>Zr�e):�"����zQ��W�,�5��{U*b^G����;�P]�d������9k�T|�f�^�r:��ۈ��I�7eaJļ����Jy�A3���H)�yU.���_*p�2�T�;���5��}I.&�֜�r��������ǰ�`_��Hg!��Ǧ9�<G��^2�=q�9Gz�W�uD�Sސ2�^�w�k�7ر���ʤץ�j�MzC�/>��\{͗����]�G��g�yg�a-��1D/ܽ�|mɑ��i�.�����Ҝ{���gQ�qHq���Y��|c�{�l;&��OH]��|���貽'S|���!���r��s�2�Ϲ��Xk.���>���OE�8Kc�^��]�	�	�z���&	�}�ă1�ޔ��yxO�3�>~w��<�	k�֐3s=@�s� _Ʊ5f�=:Y�/��T���3	��]��`C�է+�
�>MP�c��ɯ�ٿ3�]�?�Ip!�^� h#�8��Z��1���m֙3��@s�� �߉pB'�����=��{<~Op��#ϙh`�\8\?6D����j�hꌦ��9s��d����.� <��'`�Ixm�O��\y����.s-�Z�m�<��:G'�]r��'峀N~u!�B���	r�u��zނ�{�ߞ�d�kAa|>��N�w�?8�C�0�h��ZDO��1�G�AG�;�ȳ|.�xӾ�ݙoF���j�2e�ʥr��%ʊ��Xq�DGߨ,_�8�2�t��Kbɒ��ه���s
��ƺ߉�5��
�=���M�ʾ};e�c;��vȣ�n7��.{�n�={��#���[d����-vm�]���;��M�c��}��;W�ه���3�	8sԕ9c�т׻�߈�~���m�Ӳ����0O�m�Fٶu�l[���z�
�7����p��ߕ�~�h�S'�m���n����t?���=	<C��/�͛�6�����&k�E������ǥ�$0�c�:cSw���fͭ�Jϝ�>�c���_O{x]7?x/��:��mu�,�z�q�/�뾩�f!���k6r�~�5��+�v���"��~�Ju��'�}�%[��x�����}��)�o��%7�X=#��}�1��/�1�_�mgځ���8�t��_ʖg~�y�
�~܅��
�=t������`[���ܛ��f�35�?�Ǎ�
�VW���}���=����>v�gbf��5�5��g���}�}w�� �>|�������	
m��:c�x���;���/��G�n��r�'\#�1�?<�1�B�V��M)����
ߓh<G��|�&:�F5aq�1Y�����OxOޛ}L���z��5�3��s�9�hLB��K=�4���n��kg�>Q�Mʛ2^����l����B�{��צ�ߤ����%Y�}4�?�F"�y�����ԟ}�P���g�Z5?|�K����Y,��f�4j~a_�xDE�c�QI�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:11D9C4BD-00D2-4480-9DD1-85765BE112BD-7379-00002316C517DC4F��V0_ULayer 4d':B49D7B18-ECA8-4770-A48E-FE64CB968BB9-7379-00002316C5317201�@Gx�\	x��֖�INN�����'		I$�y*��hͮ����E�j��{�(EUCKkb��UmU
UEo]5E���LHʽ���{�����q��^{�}i�����4xzx#8��f��8P�<�5s&B�(��f��U���a�Y�ςa��P��g)P`B8��깰���T}�W���70��5T���g!��k�8йSg4�oC�I�E�'Q�I_�F���ѣ[w��`<��z	
8�XƐg�B~���˭p��]\�z�W�B�6�P,<B�M��G�
��
�ɦ�ܝ�W�\An���o���!{m���������/�p�ð����SN�m�Fͅ��M�_�b�Ja���X�`ظ�S���Rc�v�V~���G����#2��җ��MѻȾ7c/Kk׬��lSv�4��UĹ�~b�q�me?��/�J�O�?Z��������Tv�{����K���ZN|��CeRF���{�{v�Fb�D�l�R�ٲ%��y����tP�B�B�Z\���[��[7o����x�"jT�I�gQesSto�:������ive�H���˖17'Ο;�ұeP�L�B˟�f��پ}l)'&O���/���dG��e�g.��C�x�J_/儢'G�:����d������̓��/����Vr��ѯ�oxԚ��E��o�U>щi��@U&;e>d��={����[x�Ys57%���.�?�V�޽��ѽ�T��Q�Nր��w��f�R�Pd���4�q�nܸ��

%��ߥ�y׬�e�Ѣ�RG��G�'���;,4kO�N�=ߺ�w��c�"��2w�q�{��
b��6En'E.�����b��3����/�/����An�e��m�8�?k焔u���I���_��<�M7�9�qH;�̅��(�1�zޘB�W2o�*V-��"_҈����O�Rg �Ѫ(~9;�ܹ�b2ɓv
B��b_=�Vr�ҥ�j�j�MY77��/���r�!��ā,g�܈_)�x ��q���Y��jC�*EWR��Ç�B^��>���'v�49�MߵV��]�C|��|͜�(��b��C;����I[ҧ�y��"���[�r�ٛ7S~A�CXhq��d�e_̎��/�%�d�`�[/�`ͼ��\�X��z���/����`�X�h���!��e?��O�_d7�Y�㦕��?�:�j�e��zN>N~�?�/6���iD��Q��)�����
�d�HY�SlD�:e�y�/�Z�xNt%6*���I�/KIa+91���Z���\��x�Q�͉k׮��:�F|���i���_�~��Wd�u(ur�I�/Y��-��իW�y�:ndf>`f�u���{�@��hSRF��ޯ�QkF�A��'�Y*/���#eE�G��4xm�k��G�<?Ȝ�P֌ؘ�(>I���y��i ��Z��-��I�w�� ��$���sت�w��۸�� �w��Q�}��U���^b���u��M���x4�j~�$��IbW�+͚4{,�w���
Y�W��mҸ���d=N�<��9q�F��߹�EiG������/���1��(>P��ș���N��8O�rù����c(~@b�E��+��QA(eŷ�F�K�߳o�^�~�$��?-��.k�ȑ�c�����չ�?-�أ��S�N�i ��g+�A��!>)��b?SI�$�2cϞBS�əL�dY[7
+�Ąr��<i2��=oOy�L}�F�R�L�rB�W��y�n��d=�����W�^#�!� ����V�2�)iҿ���z�γ������w�(�gL��B�G��濧�r��G��N��(�s<�s<�s<�k'������HNNƁ��3�I�#���?�[�n�KLʃJĶm�vԨQ�ƽ�9D��<$jժՀ���Ã�޽{����.*[�����7drT ��T�\,XD0+���z����Ƶn۶-��mhٲe��q1��R�5��{�����r�5bʔ)��Oxzzbݺu��Er�Q�z�w��%�j�!�[4m������w�[L_yUn
�ǿ h�B�*Y����=Q�x�>|�ح[���XQ��TLLLӾ:t����\��n�4b�r�`+�K��:�s��P�F�i��X~�z}��Z�m�
X��ͷ�-��!�����+Æ
;��>>>J�^zv�������\�rhժ���ӧu�/.W�P=�²����S�(Y
�%"����s�x*�OC�F��zxj�1�m�y�=X�k��>�;�`�z%ov���c�u��Q=����
`�tf�`�||	��`6��m�&�ebcc�ԯSg���?L#W���2��S}X�l�u�g��Bz�W�#d���@�?�����n�>0�f,[�:v-��'��8�o����ʲ���h������=��_2`��6��N�	�2�������8l�3�W�\(�>`RR.\��fSiN�X����+Q�9p糷�$l�w�*s!z���DQ���QQ�X�����f��dM9	k`���?#�nG��/Q��l�{���/?����|�,8A����-Q	�
Wa[p^��&�x�a4���`�|v��:a��i���DdD7K�L�G��|Z?�}�F���?������s,.0^[��(�W)��R?�|c������C��[a�~�������t�ڕ��wWw���Zc�w�t�ꖲ��X�b�J�ڧ��	���0��^!aJ6��X�f�z���v���e�F��������|?q���?�a�8�v��"v�ה8K��K�ŷ�~��e�L`��`M�:Xun��]��x�
�h��3Z��7h>�iƐ�?u��U}	j�O�M�7w����M�R�,�w8(���%ֵ?ö�kh�CT]WW7t��Æ���<�a�.;�����Q�F�;͛7�e�6Ăy�n���i�a�9��-T�9��q�"d�{�+�&��M���b3�f֬Y�8B��<z%۹��J�����q,�+`�gv��nw`{Zڙ*��Þ={��h�§t]X6eº�;h̪��Y��,�v�ok�JwR�T��Z'�>3�n�撕礔	l�E�+�y����z/�ƹs�.4"X��`�0�p�
�/��He�!��5�β��Vi����P�}�^����g��4ZΧ<�_g�=�`�t~q/���E��q,�%���dp�/չs�YS'�����%-�>��o�h��r�<�3F%�P{�ɓ'���Q��t�&�UR&;)��S�2ظ��ҝ��c洩�ڷk��N��f�#Q:.�����g��r�T	���k�Yѻ��`�<�ԛ�-�:ڋ��j�e�|�n�Z曫��i��[7m��=�w��իW#��_�:�-4�
[���S�7����Y�z���JM�i*���½�,���CXٸ����"a|�c�>���?+��N��;\�W�M��So�J��y��?��a�,
�ʍ�[�6b�V��9�!شi��+�#�\�g���M�a��$
j<��,ڷ�w5cޞo��C�Ղu��[�j�b��1��'��ڢ�6�;_�oNe�����Ǐ�s�1+�����c%��ͷa����+`��	�e#2�~3Ժ�~U��J�ULA�2����g;�o?��woƥ�`#LSӲ�H������p��M��v#��z(�*&��W��S�N�
���M����}���U|L�e��w�űc���������u��a�99���+�U�b�tG�ί��P�
����
�e�)]I�acb���1f�PL;����cG#���{h�ܹs���uDŕ�i��0o˒�I˦[J7�M�a��	���QQ�8p v�ډi�'b��Q�8ftNf��۷�_@,��ȚچZ'�p|�0��XUb%s*�SNC��ԍ���������v�Z����DW�qͯJ"w�}�S1�oo��T��⺂�q���m��!m�6܀Gd%�HY��Q%ش��y�~�Whi��Ҷ�"}�v�ڞ����������,\�P}�Q����s.ٖ�|�Ҷ�i1��|�e�:�
�O|/��;;�oS�f��];���}��0�,�ٮȸ�����Vc�_g��Q�r_yx>�����أ�V
��1�g]x)�CA///��Ջ�t�������٭�Y���Y��á�i~ˠ��Q""������_�s����!�{��1�e3�J��|f�rݱcǡ�<��MR{��7Y+vڬ����1t%���W��o���X,��'����9Y�_[�r�7p�y��3��q�f=�"�0]�����cwҼ�z�<��A�-w�)���
�wp�iMT쥖-Ǹzh���d�)��:���X�˒cІ8�v��ԩ��A����	���1ڢJcܘ���C٧lN|���wV�R�^Q�ȇb;��f������Ĕg��B��W��i;�ƿ�c٩M9�Х'9/�!�H�jY�9�WػOo\�w~�}���`>^���s�)�T�*+�����'��m[w�K�W���Y�����2f<�k���;�j�F��<`��##?6�[K��F�C�����X��if�3+��a��~k1[��˗/��K��t��
t�����2/Σu�]�<�i���e���!��"�
��p:&**I��hY�0�1c���/Q���V]Q�nY	�E���������cp��~'�����Z������
�ߠF=P4[̑��u��.g��{��ԩ�$}҄�x��"�QBBK>aχk�/[ξ]���eF:<��n�mg���LCއc7�_�94���۷/7n��[x� ~ɷj3U��eх�rSv$1���$�AtT�į繶:�Px�?��zP��3dȀ�1��oE���mU�`�.�q���
�<;�.g|�u�`R�rS������[�'ۉ0����رc�w��ڸ:�����oi�xj4�:��T�B/ʦ��꟡���zj1 q��KE�.L��P΁y��{��0*:
իU�?;=p�b�`���_�C��X���ɣ�+��r�	b;_qO�ɳos�W�fͨU�o̖�gW�a~mB���$=?�������A_-�,��jq��!uW�{*�g{×���0x!}�.ժU�)��۫���<�}��W_�=I֜Gr����ÕN�k���������:[�}mÆ
1q�D�
JJ�ƪ�26߰X�ɋ�/���5qL�=f/^}ϝ,м��w��s��<�����A��)��Yż��%����c�~@�i[�	�+�<TU}���L���eǥ_E�-TCH�aj���y.��C;�����`_��S|�e�*ɛF�y!����ZG���3�"}��Cۥ-������r0��gVUkC�c9wW�����ĉjߕ2Z_Xg�A�v�Q������%n�}�/�Ҩ{��x����M���,S(T�\�NtD�t7�X'�����6e?��j����v�yog�;��n�5j�g��;�jի�g)�W�T�S��"�|L=��L�%�,�c׽;��c6�,�+4��Z�*��Q0��X�Ab��{�W��O��J&'�L"�ҥ�z.Y���s�E�Uyv2��TuO(1���6�W����lؠ��{*8���u��vw�@�ضޅ9��:/g#:"��V\h�|}�b�+W�`ƌX�bG�[�������]�v���7�7�a�wD�m��k/‡��:�ύ5��	h���_|�]Ϻ��s�y���}�+��P:@��JK�U����
���m�h�*oΜ9���\^���|%�*{�	hJV��l��r�|wUn�ȤufC0|�6��j�o�2����猪����U�I�c��0q�l޼y���l"#c������=���$jU�$s��e�9��_��@L�H���c��)�lc��s�n�9%J�P��$��ƽuѢE���/��9,�K�ş��..^���
��L�XRǟ�fÿ��b�'O�[L��A\f���Ͽ�d	��֮���E8�<E��/�bL�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:11D9C4BD-00D2-4480-9DD1-85765BE112BD-7379-00002316C517DC4F���0/�����swfd':CE265196-51BF-4C08-BA8D-06EF79150A40-7379-00002316C52C5E22��@#x͘yl\��SJhIE�j�
�**U���[�$���J��J �PB��@U)k
Y��d��xK������K��;v'��m��~߽���N ZW��{��}�͛��gFc�هA2�DK47>��\V��Y'��C�8א����8U����՘s��[fΜy��8x�/t6���.|t���޸|!��l"M�o�ЉJ��f��*��e|L�_���,Dϵ z*�?P�H_�O�`�!ݥ�0֑��`j�-|�n{8!yɞ|Ѽ�܈q^7c=l���*��?�YW���5�Zَ�VX~�0�;k��|�'W�^��Z1��?�S���N���#F�xG��[;)�?�,;��i#���Kb���`g1F��p�ݏpe2?�$�����3����R6����m���5C�N��Z�ŭ5п�q�|��._kDq���h��1��}�SN�o�:�p&������b���=�F�2�Ƌ���b�}�	ӹ��h.����6�

Ž��X�s����@���"�[��p{�3=�?��|�J����O5b��S!�h�-;w	�5s�˹0��X��aLs��,��S>|g�l�IEK�N4eoG������]��!���?����íOq���B����/�r����)�oQz�ݕ���͈���Z�*�)a~��p�1�q���S�g��E���t�?�'���N6��o@�L��Qޟ"=�N9��|����ٔ���[����w�VC���K����+.n!fθ�|�*7u��8����@�};Qyp��m���lz}ն��~'��Je~�ut���y���Z�y���!7?Q�(f��4�Y�Õr�0&?m;����!
�y;Qud#.u�}��=4[������2�`�M�)�P�{��X
�2�Q��k5_l�P����(������Z�Bkʷ~i<�C��ԧ�x�Ԧmť�S|�
���=�@�C�=Lޛ��%L���p�/�Zg=Z
1�B;�v֣U�ubĵ�;5�u���e�~?�4CG�>4�����.��f=�8��Z���a��4����]�:rY�5�n�'�ɛ�{h���A��ռ��c8�ӱB�'�5ͥ���P&:����4
�]�o�Po��Au�a8�h/�N�;�7�v�c�e�<�v�������w�ַ����;���<`ֈ�;h������c�)��Iـ�=�h�[�o{�_�?��(�&�w����#�����8�w�H�#m>�m���Ϥ��F��}�JH)���T��X_��#�FN����5�h�ߍ��phK<6�gV���֠l�{(ۿ��֢��z�$�C͡5�$ �w�s�c�ڵ���b�E�y-V#���0
o�����i���F��[s�U���[R��xh�n�f�v���Dl]�r^��\��5)��nDm�F~^�8�>��ў�
7̼�ʻ��+��{��� }����'�ތO\_VkBs�KFyO�+��W�p��9x�/�����S;�6l^�@��
���V�@Z����MR���7�DyW'vR���E���1����	��������E܋�����}�����K#q�N4d%"H�r��^�-y��w��hB����8�߁��t�VK��2B��5���*+L�Y����Aĭ�ü5�[V��JL����󐜔��@*��)�)�'��Rq�>��}��:b⭩bן�ľ
�'.4Z�=��e�b���ї%6����",y�q/����^�ƼJ�py9^�/@�/�:�l�e�����L��fҔ��B��;=!f��y�-"J�����պE=�XRf��R#iB��MX�Jy����'���2�71��-�Di1�޼DDO��V�Ъ�T�5k-:�]+�`G!~���{e�V�0���T0g2O��Z�!�6.k�Z�͍]���y?4{y�6�[�̅7�c�O�0��V�K	�\�3��
�GLLօsc�N�Y�&J�i�Z���z��kP=w.+��Z���y��h����U����\�QM�v����jȚu��Į?g�u^�ܫ�^��q�Y?ҝO�(**��=đ{ك�B~'�n�1V�'���Lj:si���F8�^�����S1�����hmՆ�[�`��+1%�3w�S�Tgo�]�f�~ϸ/ڝ7Q#b�<�ϸӋlOc�/Z�Vȧv�ҿ��{TG��.�c
ŭeM�D��Ew�&�����%���y�h�X�����yiu0>5�@�����z��Pݙ��M??S핾�j�`�۸���<��|�.�F�u�J�z�}����=F3��c�qa�v��g�s��Q[C��,Q�A�	{�|�f�w�Y�5��N�5�cMc'���3�~�ܫz�]���+��Y��E�yϤf�{y�t1�u���"�Zs7&��Q��y.���b]�6r?7��4QG��Ӈk�̵"����D�?y�"����|��B�wel�6����;�m=��5ϵ�ⵄ
�C��l�V�!���7�ɽƺsäoϙ��;��&J�i(W���g���9�^�7���W�v��{�VO�|2ߧ�7�G����P���1G�4QZLC��3~<�V��j�:uu���Z݂�iW��
&���̜q�Q3���l6Ƥ�ױ4QZLC�:�h�QSC�e͵H��-�~+�}��9N�jL��e�(6�ٱN�h�/M��P��=ҚnjX�@�2��e��ڲ��u��u�'�{Q�J��5Bk|�#-V�4QZLC�:�#�if��cȒ{�_��?�^mtw�隝\�t��e�3��ڂs�	�d���&M��P��7�2}�oaM+��smb�q㮝��4��<�|];�M�Ɨ&J�i(W{�C)_	�E�(-��\�;���������b������o9_�$i�&J�e|O�_E��G�j�n7cƌ���d���2��¥T�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:11D9C4BD-00D2-4480-9DD1-85765BE112BD-7379-00002316C517DC4F��
E.0�rard':785F9AA0-2E04-4E5D-A83E-CF741050C650-7379-00002316C5297D4A�$x��yt���S+v����?z�sڊK+Jm� �[==��k�� �m��֊�b]�	 �J�H2Y'�>I&�I&��d!�@���}���o2I&zO~�]�=����D|A�ː>���Շ%�i��k?��u�ə�9]�$'���PG�|k��ߞ2e�U_A�%.k�s�˧g��^�|r&�y�����z�8e��F�[K���"�e�-�sȿ�{��I�EP!��29�Z =5��.����T�'�P�Eװ���YvY�rQ�*øo��%��JgY�?I�[,�)��.��xn���|~�b��%�>1c�P���a����T�6�Kgy���<����-bO��_�{�|&J.7}�2�.��&�xJ������a�)UҢ�+D���y�.1���n�&�M̘քq8�JU�a�oɓS�,i��.:*��\Ԑ�56�H��ً�wam��2}�j;��F��>󄹍O���KڮMr�![��)�h="M9���^,Þ<Ԑ�54$�SK��$]P
<)�=�
�rp�Q��ӚP�˶�%渱��X/��nh�H����L�'��J�u���|n�F
iZâ_��vȚt
�.�"�.	@?�ޓ}��#�x]��sVa??G;v\�l��t��٥�ꤝ��co�B
������pΕ,?��w~i�j�yt��w��1�.3��v�&��cbƴ�X��\��8�_�U����ŏ���-Ԑ.g�N�7����!���7J(�I�O]�&����galډHݹ^z�3�Ö(u���f��ŏw��@:ˍ�9x&p�p$	�>z�
2�]}j���~5Zk0�cm8�9ˇӘ��C���H��m�i��&�Pg�'�xW��co������~յ���2�����eпs��7c��N���CR��[>8���54�9��]PC�
5��M���>��	k���_�V9U�,͹GęqX>���Q�W>�kA
.�7kٛ�PCgY,�JW�	��2#�I��(�?�S�m�m����FI߽Ѱ�~(��S�Y��#UZ�?���D�i�s]���^/�����&��8�u�ٛ��P��>ȿ�&�
������I=���k�;|;,c���0���)/VZ���Lw�1��*��ޓ���u�:�F�랷$w�:�?���~�A){�9�c9�3��S �bK��v�_�i�j]���|�
@���'��`��>���}0К�=�"q�ʎ���l�U�>�(�׃���z�Kc6IY��8�Y*b6�=~�xp�8�H��K mR�+/�b���5�!4�٨Ōa�2���t�A	X׏��%��F
G7I1��,%�\zl�T�ϖ�M*���"��
R�)M�{�)W^y�m����a_��#�r�M}`���#���bO�kȔ��$=�9�IՉR�%���
J���[�v�»�jw������Wc*䝷u��~��4�o�s���`��}�-G�3��6E<eǥ1��4�Dc/ڇg&
�Q�6�3}���g��Ai�;$�؍|�M�uX��'�������?|ơ>��͙}nC�٦,���}��ǥ�8���t����.p�*A��q�/jfޕ�u�qN�,Q=>O�j�{s���|���x��3A���>x�ނst���=���8t&��e�Oץ�g�r�8S���8'm�����(��j!~��|&�M�~���֟�3O�6�y��x&��� mR�=k��;�0W�1�X�>��zF_(����
B�������1��3'�ߛ����X�P�z�����F�i����g����K8^�jM�e?�@5Aڸ6��7λ�=�sW�ɥd��)/2֑�|��@b��'��Za�?�{3v���^t��}r9��%�Q����w=�
ݦ%�-bt,�7}�����]��\N��)�t;��X�`�3C'1��0�I�9N��%��_����r�j�ܱک������.Ȣל�[�����ʂWkd�+�����+�U�G��,X��Ƽ�
9�?ϼaG��տ�H��x�f��sN^�п����
�ߖ�Z��ip�;u�8���,�[�~�um�ˏ�(~|O���9�l\���F��3U�j�5�F���^���zo�;�j�k�M��r.��Jӹn�k�2���d�P9���6��oK�������k�T�/_�Gk�WZZ=A3��蓛��я��u�&���������5�Lq�՟��!�Q?�[>�4�x�;���1{e��u�6��y��x<w�����z�G��㶔m���X����k]��L�8**lJy�a���2�Y�aƟ�t�_<W����zԚ�2�ko��͆mK��Rkp��]soְa��v�
҂���p�}�X�l��k��7�Lך��5YԆ��l���]�cM�L�/Y���8��Q��1�ᘃ��s�Ax�Q�U[�5�k
�i2Ԑ�Ϥ���G2U;�cm�~�O$>�^j�.G�A|�K��	eΪ"�k�S�ʍ�f�G�jR
sA���N�N�O���j���j]�i�����y��2oU����JYY�(l�*ͳ��B��4[皃w��%�k���V�#��;P��~8��?��{4��MC���kd�+�
��[�[M��F(�7��o8�]a����gJu��O+�ƈ~�z�@�r�O˘}�>�O�����5ܣ��o6B��yA��ůWJAΒ�v��_�B�2,�W�\��)�=�6F?t�1�zx�s&�V��\���7�sW��呵6�N�R�x"f>Q�s�|�Pf>^��M�a�%��_���_����<k��{)�\��5��Ѕ�"��߹Ǎ��g��9�LxO�P�8��+�K�\�=͖�C��[��.4I�<�����構T+��Jf,�2}i���;w�����/�|6�o��#�/ѰfL�#?�>��bs����3���%�q��,��8f��_�0��`�-Xqi�.a���� W�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:11D9C4BD-00D2-4480-9DD1-85765BE112BD-7379-00002316C517DC4F��
q.0tar_bzd':B0B847A9-6FD0-4740-B48D-A08479CA1F3A-7379-00002316C5269294�/$x��wpT��Ib�b2���?2�L�B���I���;��!��`ܓ�q���q�W�	0H���U]���VڕV}wUBTv]r�}��[��ň�7��)��߹��}W;�K���4�}NX�X}X˜�����G�tW%ə�9Up\�J�ۓ���ĉ��
.LqU�^g�|v�E>�qɧ�a��'�M�Ԋ��)CU��\,��i-�EmI_@�U��㰈��V��l�A���K�\s�tU%�;?J����C	�]��?�c�e��Eqt���I��*�%qX�j����h/$\ֵ��}b��雖��ČiCa.憰���b9ۘ+�r����j��=ewd\����N�U;z�d�] =
V���;8.C�iZ�`C��D~���w�צe���B��gw�o��Či��?l�"���5��iG�4�w�!w6jH��dۻ݋�wq�%;���/H��Q�Vߡ>a;1}�цƦO��\ʮ��]�)�$�������k-�!Oj������E|�.�����&�sѶֵ�%.���֗5�U�4�j�V�<�iM؏����c��ƻ��,NjS�3e��;���V�re�%5�h
��� k�5��h���p������<"^W��u�U�<-��|1�	c�=i;����.�W&��{kj(�75X��s�D���#H��'6�|�=�I�3&���oZ�l�Ok�$�#���X�3\���_�E���*ŏ����Ԑ*gkNʷ��� �׻�m�h��7��m�MK�Θ0&��=+�O�w����4i��KM�)>�	��z��ݬ5��R�w�	�?	y���yt����^e��H����~��h����𳖏����!^\���V��ύ�Fj�1�v��[P��7��c��_Z�+��p�yx����}��b�p1��\/}��*�.����O�l�A
�zN�wV��aC
�{ә��/ �5��~���J���#�L;,�v�����+��6��5�M����$�g������J߶V�EH�sh�Xl��M��7H��
�%�C	��Ƙ��b�;�Ҕ��4���@W��먗��Z��إ�]!�<6hř��t��4И���B�W!k�W��uR�%Uɇ@�TY`-�b�o�el�6�q��C7�DK�U��)�.<.�[$�����=��]+ֈ5b��d�[+�ߗ��ő�Gs����}�<�O[⮖k���DH�Ց{�g*�?}2���O��>���Y�C-�V#��H�<�1Φ[��
�wx�H
��Ӹ8j��Do��㛤,j��c��g�nG�X~Xi�:r"q/��ߡQ�(B����Z�֝+���J��u�D�-R�ͨ��F)$Q�����o�2���Jy�V|_���^��IC�^�v�5�B�����Ӱ/S���\�9֦>0}Z���K�'�֥�){��ᜩ����)��"�����_K�-~�T�]mU�;���{Wˤ�9	�.x�e�~�s4�o�s��`�}�%K��ӥ�:I<%'�>���eEb/ڇg&�Q�:�3u���f�:�Ai�9$��
|���j��O۹P��k�~��C}j�%�3�܆��
�,��I}x�NHKa�E'�qi���+�TE�tV���#^�̼+n��g��^�z|�l��fç%����O�����g�,9�}��ւst���>	��t���e���$I�3Y9S�I҅|��y����[kFֿP�?P]>Ħe�k�e���~���O�����_s<aBM�6��5c���
0V��k�e�a
8��
�+,}��~���9/�5�F�����A?�C�,� �=� &���9
ȝ��1p}	�k^�	b�l�h�&HsM��-�o�O���%r%Y��HJ�u�&�j!Ѕ���	|�i�VXm��޴]c��<�q�\
n�nԀ�@�x�]@bC�i	}@�X���M����w�s�����x�n�>
��zFc�$F<�=);�蟱�H�V�Z�\咻W9�޹�V��k��Ӊ�N��
G�y��V殨����p�Kf,+T�5xZ2`
�S���<���GV���c��Mj�$昜�п����
�ߒ�Z��i��;y��ӟɗ;�~�޵-�ˏ�,~r���1��a�Q#���O5�y#O��h�ڒ<�7�=�4�����Y��M���X���B��9F�'i�6�@���
b�[�����S�����5
��W������+M͞ ��k�X�ɭO����ƺB��d��Ѣ}�q�������pͨ��-��P�<��G�ᘱ,_Ǻ�e���M�>�=B�0��JmA�h���]�qK��1��.���ܻ�Y��~�pee6��԰��v����0�/:�/_,S8�H���f�����P�a[�ꟲ���f�?��5�C��x�4�a>��+Աf�P�p�a����µ�v��
���߲0S�fW�^� �L�y�g4��q��a�|8f��X<C�1B�jK�~�Ca�6E�񙔰��x�j'w�i֏���f�J��e��1��r�<<;��\^�c�z�X�剌���AMjCa.�9`��I���)��Z)s�^�k6��$��$G��4Of/ϓԜj)))��V�y��_(Se�X3�n���H8���h�=�>���	���c��G���6��y�J�^��\�U�U5��n�R{�����|�x�Xǚ�L��9��C'����~Z�l#�Am<�%����M�z���u��=,XY.y%8K���.XY�|yXf,�ױ�/)Pn|$e�~�
�c<����9�S?��G,���η�������56�L�P�|L{:Oǚ�t�L{*�-���òK�9b/����ac�y֢�y�J��8&k�������|�q�s��
�� �s�{��0�>�q(�>�'S��{�-~����]h��oIx
����m��V�K�J�.�
2eQ�L�;w�B��sp�+$��߷�	<oX3&�L��l1�9�X��	�������j�+�t`^��N�0a^�;�|�;0w•�s]�k„�ױKK�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:11D9C4BD-00D2-4480-9DD1-85765BE112BD-7379-00002316C517DC4F��
�.0Mtar_gzd':5AF3D56F-0F22-47A2-A385-5F0264522DFA-7379-00002316C523C5C4�G$x��yt���S+v����?z�sڊK+Jm� �[==���T����V-.Ŋ��aAI I&��g�L2�L���BY �j�>��7�$�D���w�����w��~w&�K���4��X�X}X˜�����^{��T'ə�9Ux\����{�����I���.LqE�>G�|v�U�:�|O���	}�3u��v�pg��HG�E�JcQ[�����-���)�%P.ގR9ג/����*����d��yQ�%װ��/�X�dɕ�$:Y�q�y��ϙ%�qX�n�����>H��k���d��7-	����\0�
c�<%r�)O:�b�t�	�?�d[��f�ڟÎg��J�ה/��B�m�wI>��2ܒ�55&KJ����~mY�GH�鳲���061cZơ`[0�ɑ�ߜ+��҂��UxL�]9�!]klH��c?
��W�6.�%}]��7t�O��Dic�7����\ʞ��S�)��$i�:*�ّ�m+�aw.j�����%y��R
=�C��l�RK>\�=��m��ë�iL���C����KڵAN���V'u��đr@|��m/F
y2ܚ�R����՝�5�>X�U>X�UzO�	�o��]���*f��m�˘k�>A̾�&���I;�?U<xv��*a���l�[+QC�x=��!Kk8�L����?��	]�}l��{��-j��v�G�'��v�l#�I����g{"�׿,F��Eo�i���*�a�z
�5���ړ��o�ZȻ��#��p~Zλ�o�eߪ#�#̛��=��Hq׵k���6�̛>m��
�[�&��x�M;$%Ƕ�� >����Qf����3��=A �ѻo��٧�]��>-5P�ُv,f�6���c�2p~�g�!)=�]>�w�шj
����B�`�M���A����ϯ}p�L�5�>Rk�}&�C�h�Xvo��&�?U	R�yD*����p�r��&='���j财����Le��y�^�w�S�c�O��b�q��7e���Di�9*��H�|�[>�B
���58�߬adoB
��<+].XG�+}�:�?.yGwK�uh���o�~�IR�n2,��?�6����eO��O�� ^�[�\g���I��&��J9��`�|]x���������WAք����&5J�������Z"���ئm@c?�ه n̍���,�v����XOl��#�%����d����}�J΁u�w�)�t�ؓ�ISާrgx�;_�Ě���꫿9	�&tu��:����C����������@K6�P���Lj33B�N~���6)�d��GnI��
�Dm���R~|��Gm[�Nq���cO���!mBWgn��2��34jCp��S�Q�ú�d�{��؃Ⱞ�H�%\�bw5�,E$j�Cs��mR�6k�v��َ�k�X�7JM�iL�/�L��Ȼ�Ցs{�ej�>Җ�z�?����O�6˜{� �ľ�t9eK�3�#��T��%��ZL�Q[�ߠ�k���J��m�:~�ؠ�`��|�w&C�E���C��wc.�f?��a.�����fKC�t�$���4�DJ}v��xf�>�j�8R�k{]�A��:,͹G����	]�Y�|�j5�a-���q�O��Dsf����1�R����w�����E�\t�k�ѱ���	NU�IWU<�}1�A��;�M\&ΉŪ���Q->O|Z���9������y&Ȗs�{�,8G'�隓 �N@g<�|/C|�6Iz�ʙZ�H�n�����s��2±�E����Z�� 6-�
XCp.[�X�c�<}�@�����cj��	]m���^���1��Xc-�k����`x�d��7�G�}��X#Ok�loK��~O�c?��[������$872���2���������5���Z���Q���&���97ݷ�`��R��,Y[,e��:R�W��BL_�>�Z+���aOڞq���}�'W��^�5�3P=n~Ѓ��mZB�"�@��zR�����J�xM!ާ;�FC렞�:���yw��q�g�(�o�ɼ����r�j��;ުS����t��Cn�`�k5ʼU�2�U����q��E���#CK�}jc�ۊ��3oؑ�>�!�//�9�آ�rb��9��
=�i�`|�骕>������w��?���G�Y�*?�7R~���%��bt,�IfbS�����JW}���yb�F{h�ӗ��A�~�Y��?^�-;$n|8EǺퟕ��1Z?I���s���6��oM�1N�-O����6��߾T1��V�4��0f>��c�'�<�7��/�
M��1|3G�>�}~k���
�?W�C�5�~>�|��ilvWn͇b����r�V��D�(�#�� z�F���֤���O[����g]���l�8�˭JY�a��l2�9��`��3t��<_�p��
=j�X�7��&ö&��?uIV`��]wְ~-�6�	Ќ���P�~�Hǚ�\��9F�Z.ך��5ZԆ���L���M�kM�Ly Q棞�8��^��1󡘅��c�A8�(��-��4�y��O�����G�U;�kmӈ~�O$6�N�N{�Al�S���	f��Bk��%�͏e����jRs�~��:O�J�/���*���*]�)��d��\e��|��2_Rsk���lVk����~�L]��c�»}��b��􇢅��� ��%�J�����M�|��?��j��j��sşV��Z�$��l�r��|VX�1���k�SE
���@�h3@��i���u񰖐�o���{4���O�=/�@��
�/�Y�¦v�[��W�d��kƲB冇R�臮�>�cA�_�s�8�C�Ȃ9�Z�x��?{eYH]k���J��/��'�u��O��'
�ߢ���-{�=�kq!��?h�7�Z�<�^8�d
��R�:q�_H?�w�q�A�$xy/�&��5���eڒ��cO���Z����M�-�ϣ��s����B�J�u��iK�L]�'3�Ν�>���r�7����u�֌	}��'8[La� �<}�~�5�>��vy�̋������~n�����續WX�r�Lo�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:11D9C4BD-00D2-4480-9DD1-85765BE112BD-7379-00002316C517DC4F��E)#:
folder_closedd':F05830E5-724B-4560-9AB3-C00DC08A6E6A-7379-00002316C521112D��@x͘[lTe���+��H4ʋ�����������
�@K���P�^i�VA
	b�����L�ը��i;�Lo�l���g�H93N�e���Yg�9�Lrͼzڬ��^uS�̘�w�.�u�
3n>SW,��K�sG�t��R�%�^�"z�jI(�V�?T/O̙}�mXsI.�^�R��{��R[<�U��j�[��9?&�p�$�wFg����_I������{�H��C�n6���o��X"�[��,º����S�����7���u���$�w�tV-�`�y���y�U�,��4�2��Ƚ�ޅ����ZV�O;�����2|�Q��J~?�EO>��</>�
�$&ڛ$��Z9R��b�����e��Y�0fm�������¿Ew�R�ŋ^>������]�h�+��k����,�#�+$���5
���?v�R��w���d��n&���K�X�t�f�����SC5K�㭻%zh
(�s�n�g�3�$x�G�.l���j����v����zF��9��PuA|�e�X%Cͫd����,у��2:�j/���y�~P�s��Re�1�P~wZ7�������͙�ʏ�ÿ�qy�Ͽe����M����@ƾo��F��A���s��s������SQ3�ρ*rº�0��AWm��lx��?�?�����Ǿm�C��u����՚���ZRѯ�
���3��9�8�Mm�t�d��wg�����?z���p�{+67���{�=��&���n|��U������?�J~�G�����J+�M��ns�2N�ԁU�=�1}���Ml�{m��f�|��%O�������慪
Ώ���ȧe�-S�P�K���Ԙ�:r��5�����1�%�9g4�C�߮��?䄶�O�����~��/�A� 4�)15c�u�5���'cK�����DϠZ�ΗIW5�W���W���؉1Wb�W"�T���A(�:s�}�ѣ9c��Gcw����⅌���?Z<�b�~�2�0�I��}����:���J*A���mt���y���w-z|�~�B�U��œ�c/l��ŀj��V	�M ߔg��wP�V��6�@�����H�[�T�@q��S�s�Xq�b�qa�)������o�D>[/�]�\@��wU���T�։�ї<�{�;���~��Q�hp[�|�깬�����
9��m	*�1��S��5ós�\�{֩�&��W�O�7�˹�[�jj�F@u�bc���AMՍ�p?G9c��Se�f���5r���IRg̡
��>˜48�5b�T�$g��5�5��`�_)���v@�l/��
c˜�b�-�'�8�9��<S���,}&�^���7��=�H_}���S�z/�66�sԡ�!���z(�8��AYw�g=��"�����oY0�S�]�U
p�:�)R=��AY'v��`���Eͪ�_����-o������@��r��,��T7�v�s\�-�'	n],'��߹u�D��e����|��IZ�~��S�����gNL�+��,w�.������5��,F4v�y/�1ω�*���:���;ܳ�;G�IN�������û�˙�ϧ�Z>Wa즭b���{!���/&�L'X�R!�_��k�+�Go�Se�Ʃ��$ܰ��������8^�p��sf?u�l�\.��4��=w.��[��5�����p���>����>��e�Џ�5eʟ�ڵ�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:11D9C4BD-00D2-4480-9DD1-85765BE112BD-7379-00002316C517DC4F��
�//Layer 5d':DE846D34-473C-4162-8C9B-57AAE55E0EFD-7379-00002316C51EC013�	{@#x��[S�����:��C^�ߙ����N�>��9��666`.!�� `$Fw�2쬵{Z����V��ݣ��w�	{�7����n)�R/��%���9#Ŝ�yq+P�'���z6>����Ý��wm���9�hO�'�>Μ�	�H�s��/�\�I��'�Q>����~�3��nm'��i���u����ʅϩ1��b��OHe+ �ڸ42��;���,�]Zzu�q�[�������=��v��E${�7���&�'9Jϋ��̫�g�􍵫<^�F�jQ��l~��Ϊ��s�x��H��ڃۭ��o
9���ՏRژ�vq]Z���7�n��
g]�8�F셤T�Q��,;K���MK�����0zc{�i��p�?�ť����g٘y&���[Ũ�YZwq���n���;qbJ&2-���	��N�򦸅��NH��!�lW�����8=M�rc���5��]�����=�͹W����s)�=�KNX�Ĵ�K�M�[k_N���!q����H��/�O���]i���bBZ��d�S9��l��o�k�7�y�����es���(�Bm���{���+�U�~�n��
Ծ���lJr��^����6�rz�g_�G��UL�&emr��s-�:�%��<�+?CN�*�]�_���կ�۸>[�K�^���Q�����Z{�^�E�S��b؝�w��u�;2��ԯ��D�od�"���$8�z(kc��|"��wXcFN2k"���劉���E??��'އs컨{����z<�����df�G�y����G���,=�+��?�ڻ���}&��9�~u/�����OI�g�|XQc֙�s��ǘ�7}���)����=�x+�/�����{�����ޓUh��]	��+ɉ������i6���ϓa���H�S�����ߧ�5ٚշNj���_$-��E��Hh~�8�:�S���**@��ǿ��wr��=�������[�w����4�ugyLv�dgeL�Beg��o���w��_���U��䌮�o����]�MJ���x!9+��%�%��E��3��ʟZ|�4���M0Y6+�m�j��8�6����G��m��<�,D���S9�e1&���?�4�i�`r�I�ܒ�l�o�(���'�/���w)��/�q��]��l"T�o7>+��7N#�6�͒�b��.r����C�w��7O)������%z���dv��f�g�]��ᆩ��k��`���esF�UJh�8N���\T*;�OHtbd �38���޶:�q�\p���]����~����>�O#����űV1�ߜ������HjaT�><�/�7<���zx�2����Ĕ�o̽t�ͨ�#�¼22�l��>s���G�!����Ilꩄ�.����ה�Ys�q�q�]�1��������ϝF���l��5��[�O1����l�VǙ��p���|;.�N�-x��Pw2_�����<���b����>�.�O6Y#�3�y�*����dx&K��`^
�s^r��$>_�o�)�/�����q}%>����g���o��/�q�1���nD�8�b#��>�u��^��7Y-�_���u�aU�?�	��)�?��`]rٜ��h�6�ǹ�g�h��Z���y-�+k@��X��߰��V�q�OL����3�ڌ�#�?��︉da��k���~����Z��C��Wb����ze��e����u+�)7��b�"����g�q�ZnQk�3�IL=qjx�̹����;O��t�����G��q7��y��*�	�߫�ԯ�_�z�?Ώk���^�Qݼ�8Ŝb�p�F~����V���U���;�5b�D�y^.���b���\5�c�`Ծ'���xތ�y��7ź2�+�;;���AqU�?���ة���8;#ss?�)�F����Ⱦ��c�������8Y�w�oL�]�a�/⼺��5:�$g42�4��C]5ǜ�c}�Y�D��d�]8��/�!�(>��9�]�~Y~����o��:C��Ȩg�	��
���w���\Ϻ����l_��{�Yu�����U!�{��=����Қ��Q�wɏuoK�=/�������ÎUb�b��ߥ;��yʬ��J�1�>i�¸?���F�1D��^�SO_��_ՔgA��ε!���a�`\��5R�{�c�#�s��}�q_������W��k�����ڔ�#bG��~&��^�j���y~�B~��)�ǯjZ��/���슮�{��^T���k�c�5������Z�?��{��mk_��o���ۄ޻e
���Z>�欒������^���׵�'?E��G��֠���

�I^]A�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:11D9C4BD-00D2-4480-9DD1-85765BE112BD-7379-00002316C517DC4F���(/unknownd':D178F1A1-DEC4-476D-BB2F-37B457F2FB7B-7379-00002316C51B6508�
�@#x͘�sW�E��bS�/TQ��#��HQ���9R.(*I11�.����}��K�H��m���g$�i6��X��i���}�v�Zrb�c��[��9���;ݷo��%5�,+ ���KX�%���v9䕥�,��lO�d��;~�}��7���%^iY	7ɣ�QY_���/��O�;,�In!,ٙIM�ez�Q�������r�ˡF���Ě|$7�/��]�0� ��2�Dd!X�C
�4�e�����r��� 6C�:��ž�$�de�]��kp��$;�(��,���R��GUC[c�7:�3��b�����O'��0��@��U��l�Q��3X�܇��-�a�e��֨VAL�Z'՟��K&闵X�,?h���
��B��͚C�A�x��F�{�eq��ê�I�Ư�{>;��7�x��&:e>�*��������F-���}����y$���W�je�����<�N��uh'�D��F�e�^��=r���<�&�d�d�ȡUsH߫�w��.,��rX����Q�!G�WcZ5N�q��ڳ���p�'�x7$jd�钄��g}���O��6�����/��_J�ղ>���aו����f��Ѻ�R[���xn�wF�$�g���ԝk.�gf9`l�9�k�����gX���B����l%��is���j�3�#\�ԤOy�U�?P~L�������Ht�94���[��~g$�P��W��bMXjT߶�~j�u�L
�H����^�D����S������)��b��b{Os�u��G�N �Ѽ�\��T�6Fgo����I�ᤴ]ܣP����?�S�����4��D�b��x�p>c
e�dr0g�r����s�뽉��zU/�2�@u�u�sk'���3K��������>y��ŷU9DpF�?7���{�w�ٴ8\��|�f{K1'ω}6�Ի�i���T�sY7H&�T�]�=7�wi�t�8"�3�xm9$���r�ZN\�?Φr��/�����!�~�W�	K�"���&��k��8�?���\�A&|7$�rSR�e)��I|�ƃ��
�j|P֒���3�:��"��}m�߀���L�uY�RV�[uZS��
`YwrXÞ�n�s�b�C�/��vY{%�[!��Ǥ��H��?I�����ni?�7�l�KJ�sV"�Rܿ&�Ż$}�Y�OG�m��vH+����:��ݪ��'nj�R����Fؖ�>HOv�m���*o���a���_���@{׵�J�ϥ��!����2PqD�I�����ͱ���˟�AZAe��
�b@,�C���qۧfK�S��_����&�S��zC�'?���~O��yW:��ޛ�����A���T��`M�U�~���r��D���7�o{�Y�o_ƙ�s���$}��1�>p|Z��y�p��k��`���/H�އ�?��OwIu��~���X`����]#�'$���%;w|o'�=�Lu\�~�;4��wb�179��g����"�8��?���vIف]xV�H�9pV	��6���X�E��~Y&:�J���k������w��j�p-s��ϺۧVZ�1�-f���Ҁ�𭒏4�@�1���ỨT�4���a�e���ܝZ|�UI��R��i��6|'�E=��m�b%nç%���OL?�w�5i:�[<'���U�e�n=�UBg-��_���G��� �� ��B���x�����p��΂b�Еs@ݱl70���T�L��<�H�we�Z��W�k��D��� ���l=k�x����j�f���6Cz�E:����.k�ݏ>�KX�5u�'[
ן��#�C�k�V��X�N�1gM�n�z�#֎63}	�k\��j��n�&H+�$�����h9���:-��5�m �)Q�$9P�1G�o����:sh�
�'�O���4�:�2�r�+޶9�:���ڀc�p�Q�$5�1cЗ},�ݎ%�-��h_Xj���J�{
{g��݌·�[�o���֟�4i�h�'0:��o��d�O�Z�9�8+֚�#�~��G��K�q�:� ����÷���$�DZ}9���5�P�:g����u�]��}�U=.�Ɗn^�='��N<�~�S�������o��k?X�R�-���ĉ�}9F5Ú��ĉ������P�1Џ�E����m�a�B�65vKu;8����c��960�(�3H+�����C��|�]��CPWK\>��/b��:��`�&���N�}�[�5��&H+�D�1�m»1�Oܾw�>�Oܾ�3I��Om�߅X�z��O?�h6�5�)�G�}̩��WS��u7vL���l�:��'˳�� ��¾�=��QǾxi����v������ ��¾�'{����s���U�zޢ�Y�a��A�ӷ���qZ�d��R�Tؗ묍��98�V�",�t
Ɖ�1�N�8>��8�m�j�OM�VPa_����9̡8���d�/c�{V}�i�e�	�
*��k��ձ�Gנ�bw`�i�O��/Z'���@�m�>H�Aڨ	�
*�˱��Z�?��̙_�@�Mv+�����5�wV�5�S�TؗcVC����� ��¾����1�u��j���
���p�[�k@K��j��B�O����<���UTT�k�߀��o�[E�j{J)*�? 	���streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:11D9C4BD-00D2-4480-9DD1-85765BE112BD-7379-00002316C517DC4F��MASKSPREVIEW��0F�����x�x��q˗f;��4�I��iN�؎��^�7\�ި�w�w�	!�PEH �P	��ջD;��=�{�*����;��93;��޽{��v;�X�w�H(π��KX�%��퀶tg����Kqj��(5����~�{�]v�7.B�Z�2��XE�-͔�%���'�m�wK]Q��J��=�r05R�o
���O@~��/�)�%���p�Y�,u�J�
R�!{7.���)J[U�%t�J1�Q՟��PL�	b�hmX�kq����"e�qrp�*�P�͋��-��0M�����пK5��4���B'|�m[�Xݡ$;��j_�T�&��`)L]��ks#%-j^��ס$-�0�C�r��ҨVAL�Z'I���`���O�꽛�4'N
��J�]CMN�D-����-�ۨ?C�����<�k@7����MR��^
w���{7H��uX�]Cuv����7��W�SC�(��c�
�
к8h��NP�vR�o�T�o����r(-\��JN�����,�뱆X]CU�j��?Ǵ���Uп���PG�WcZ5N�q���k�"/A
�ٰ?y��^$Q�'}�`
	R��k��5t��/b�vYCar�-�]�ds���p\͉&F렖�C�F�oq�슖}x�R����R$
�mX�ݷk��5Tf��|��1�Y����Џy��).��N[��֡��H
���)�O
R�I+�I}�Nk
���c�Fk
�R�+L����$�U9�h�CK�AK��[��O�U��z�H]%;c�K��!�`�D��/�g�uGI�b/������-�����5��{�;C��8*L\�cs_�v�s�˯#���"i�e��P���x���$|zo	��S���c�{q���5�9����ؿ	k0�Ҵ�q�k8�9�;tmV���uP�۪��S;����(3�J����`��:�k��!�h|�IX�!|�ḳ�M�ۂN@�����e��M�,�Q��L����نk)Έ���	R�'���%a�(��?E�����#X�>9V��5db.{
����j���[W�Z�bpZ�8��_���NXb���>H\9Iu�܍~��8�W䮕#;#$/�_v�	���RR�!�{pmZ�&�{�IeA�T�ǵ������X�]�W�C���І�r�p��߿Qu����u{
�8f��l
�����8)ʈ���%e�4	����,���$q�G��ۉ�&�����_��l���IY=7��K/���*�|����6�&B�8�)+U;Ɍ��6¶:U{�q���A��v	�Ce٨Oe鈏e
�o�/��N�M��$q�dٺb�$N���$-x��d�j�\<n��U�_�c1I���54��|j�Wk�a�����43�aVa��K���;�#Y2�Y�;V6L��˧�hN�&�3$e�tI
���k����(;BfH�o��e�~��,�-�9�ej�>�?�V�kS�>-��<��*�Z#��B%#f�,�)�(^���^>�
�+�KH	�)��Y��CfI�o�&�η�ym�񋠟���4[зc�1'
k�5�^�/��kd�ɡ���q����2Q�#��J�a��k��#Yq�%o���\1��kn�q>r��F������g��S+-јݶ��/HZ!���Wא�j��o^�뢕 P�z�@J0l�����#�Cp�$����x&��4�ʁ��N�g���S-����%���OL�� �~=������&K��ж:C�2ԋw�K	>3H�.�.E��d�ߡ3�ֿ?v�?>������Ug��m�n�b����0�M$7aI�mh��V\��1^aj�4��������lj�f���6CU�Y�;ҥ?7a�Ɲ��s[b���Ӛ:��q_�>\?�|��b8m}A��V�8c���K�ԟ>�8����/a���A]-��[m�in�}1�~n��h9����:-��9\m -|��'���k���1��|�i�1�݂����u_�\�8��-�wR_��q�u�_�w-��Z�ç�vR�n�A_��G��m[BТ������&Hs�D���s�n��[�7����_��1�}N��$����f��?r6��gخ~o�k�:�c>�^Z���nu��7u���ض�/�>�{#g�~s�������:�ڛZ��N�������F�:=�xM�-��ql��&����E�K�qcc��ꃾ�F5Ú��ĉ�����1�@?���1H��[p�x=���T���ހc,V������*{�׼�ؖ���f��Z��ه}+���mL������:��E���5�5BM��V�_=��uˋj��'N߉3N��'N_�9I��O>��z�]����駧�hmn�O�8��cL]}�1�.XwbŴ��J���Z}jy&Hs��/�^��۶܏���}�]����@M��Va_�S��׀c�:�U�ˢ��ӇU�6�#Nߢ^�N���j���in��<ՙa:���c�m:�Dc�U�Ol��	c��i��j�OM��Va_�]��c(C�}�%�IS�	cͱ�����a�p.�OM��Va_��]!�-��9h���mk
��4Nj�	b�1Pg��vCڨ	��*��m+3B�a��ހ1]s��4�MAܥ��� n�c�2c���in��6�;�/��� ͭ¾ܦ&������&Hs��/�x
��9�ߒ,��� ͝r�^�@�͠�r+�ܩS��,����~й���<�S<�S<�S<�.W_��k���w�.W~����f��+����Z�%�ce7�B}�����d,!#�Hفz���'o���0票v�ђ1��3&m��:u^�.��'Jvm9^/'K�@��,�)'�[q�	�ؿIN�7����	|�;�a�ߛj����H���ŋ��p��s��wU��!��SN����$;h�d��,�<�/�_}�w���叮��\}�wPo�� ��bHs��	q�����~R��L�g- x��#�zt&�Z��<��'��
���IR�f�j���Y}����,댫�3V�#V�VN�B{��;�߿Z,�p���/�4g��2��:z�0@�R����R
��1�j@k@�kb��I䉝�߀���:i.���q���$wI[�/���K.�F��'����	`"��;��
k"�I
`[
`�~5֯ց��l�u�}a�C�=��U��/��of/�w�>m�����ʈqR9����*���:r��Q�V�Vk_�#�unO��V���K-���屳c֗���/���.�v���'�B��€�?m�m��7���E��~�2�	R�}X	�1�X�5u�:a��,*�
��ĚE�ԢN��w�AΒ�6��V������O��1*#8����UF��:ảsY��c�ֆm6v��(�&6^r�����o~��P]���B�V캱��rk�R�Q��r���M��u�s�_�-�uIK���_@K�+xO�
�ئ���+� l���O]jA��lG�׎�,�/ۦ~Ҫ~?}�˾����xm�"�X=ێU[A��Ԣ^I�71�Muՠ1�>�G������G;�Qp�O�Ҷ�K.����_���#a�>�K�a�a+V3�3h��.��՗��'��1����J�"�q��Y.�9(ǧ�њM��C���h�cl�rX�����	��G�Ӈu�Q��黶ԟ2��6��zq�wߺ��yR2�e�<d����V11�q�~�@����vD�v��<��6��$�Z��9R�j����6���v?�60��v�\H�Ķ��tI>^���YR�qI!��m4Ԏ#�[1m'�+�,����9E�&��m���5�GmE�T)Y1�JWS[BHK�i��:��ښ�nl��1hK���f-�Z��{�-��_5Y���@Kl��u0�ZCk۰�x��wnk�	ޓn��)�"�1Q��A��Ph],�؇�>��u��Z'�|��66ԟ8�=���᳤h�r2�EC���E�>��c�
q�چ0F4NK�ܞu��^:�Z��`	|�>�O�n;��vZ��>�����x�ۦ~��sz֗�����o���
��B�m�X�#�m������~�D��,����Z�G��y�-���+Y9ca[����e���>�n�e��۵�`�t[�l��G����^G�q>+��'G�pl�P�5�ubb-���c|��s���}e���3�>V�|0���%_c�Sa�4��_�|Z�8-1k�O��+�Ͷ3k~����8Y�mm��Է@{!�>ۉցm�F�P���r�Z�v�d�(����ђ�e��c��N2&x
��|Ԉ�S?v�9�1Y�>iD6�Ve�3�39��O��+�(%�}/Ұ�,��J�p�k�\	~}ˍ�u�<�?r����糟���K�Z�����;�?,��u�����O�O�O�O�O�Oi��_�o���]��K�	���G}���j�W��;J��X�6g�|�[�0g�l��3��s��W�s�����~b�,��|+��"�,�l��9+�?�&���Ln�e�q�}�윥݁��L���{Ť�O�]�'Ȯ�=6V2�v���t���&�ȅ�6�_̜��g�ͅ�����K~�����].A�s�J�9��a���N�kÚ|b�"�yF�MRc�~f[X������v-%/v��}Hl��7���$��7_�V��}(\�\�j�X�e�,s���/��u11���iu_�j���c�e�>�;�ʋ���p�@f��K.��l�B	~+.�o/����3ǂ���\[b
�
b��/�0�o��a���gu`�DLam�n�6�����0���fHm�0g�93e���!�vvh�9�l�
 C�~<�|*��Ѻ2���-[�o��q`�f[�q���i9~��O��o���_��o]{��
@���R�2���~������oT�O{���,�),'qoߓ�{@��,����=|O➭'q�ГE;@>�R��x��9q��6�|����̉}qx���P����fG�
�?����䡄�����^����4G
���J?��~.*�ϕ�Gk�>i�ԭ�z^�x��@>��Kq��;^�{|���|Z�>j��w��$o��>�8��
秔i_�Gʆ�o�-��{5K)�e�|���qu\�yd�'A���
�<j��g��!�s����=,�����%e[�I����p�Ο6��y�o�H�ќ��
�d��/��?����d;؎�u��C�#d����C�\?\�����9�3�����,a��=�#7�|�?2�'��%H���պJh�>�CI#�5�1�c��o���l-C~�𪰎�E���ɟV@����x��^�Կe�۲ի���{_�M�@Jp�V�ץ�je!���u^���#�^{p
d�
v��xMj*�ϐu�_�
�^��Qoc�"%[�LJ����yh̯;pn�d$O��h���3�
�c��(q^�����CA#��	e��+p.�q�8)�1��|-�z1��g��{��}�K�
zU�P/�1���q��~^(�5��R�}v�.�1$7*8~4g�j�t��D�zV����9]���B�5�k�� ���/����rO)�����K�G�|�8)��a���t�-A��#�p���O�|rO)��9W�?&�i�q��5�/�m�q�Ct�Ἔ������?Ő�ba�Uu�|FJp��~���,��䲜�#o� �3����S���s��d���3��|����֯y,����{�|��q�Љ��FAf��9WG��KM�&���������mќ��@��ʮ��˼O����V��m�7+��~7rV��_��bx��~�-]�Cx]O���}w6p�,\qލc?8y��CHl�@�q~/�^;K��6�=ɟ��y��m��%�_*zX����fa����u�2�s��oE�;a�US�g儹V6̳r�<+'̵��s��&~$���!��œ�<�gL�{vQO���>�/�sM��Ѝr-r��b�Ӆr����	�~�	�s�Z*?7~���N�(r7`����p^��Pׯm�r)�O�O�Oi���|Aۇ%����v@�y��ϳ|ϳϬx�E�8n<�"<��y!�{�Ex��l�EH�y�W�M���1x�Q��Y$�Sp^��s�����=]r�xn:��"d_�ik�,��
R��g��|��H��9Y�.�g���PO��
x��?�C%k����̻ �EH�X�xL�Y~|aa�j�]��� �E�Š��u�w>�0gc�T�K�l)߿[.�g2�u�!�7�,x��z���|�����̻�u��E�=l�$�<�gn����E�#r�$�0k�s	��͉��y
��P��͒����,�#;¥`�J�^�'Y�Kp.Z(�x-���A�vXdD_X�"�ȉ�w�h�G��`����,�Z��8���ut(�;VCۅ�,B}��?���8}ZW�o���5� �in����q>�9۩��Բ�X�3mNx��V���賏1�Қ8����\?��Я�3�̶x.��)�F�_�jmPW�v�V5AZ��r.�&}��]���8��8��V�-ؿ�gr첊
����^\Ӛg
B_h���%�-�~����gr��+v(����"�A��G=M1:��7����DZ9�Cu��Oy��r��*��w����n�K��\�:�C�;]�{�:6�P��~�i[Ч6��i����з�grl���+���w��?�.}�|��[�ޒ>xS��7��{��{�[�}����w^���ۯ��o�,o�ex��ul�a��5z�ӶN�sv���S�s���؜��R�7��'��T��8t��7�|I�|�Ey���.y����9l�|���9oԧ�aM�`���M{�}�1���޺�wG�j^'�N���K�
^{�yy��g䙧�'�xH��oѱ9Gc�$�:�b{�o�Y��s<��ê�:��kx{�W
:	t�Z_{�9sϪ�G�*��x����5��?����9\���_c�{6�"�؜�|@5�5�K���/�A��x��}��g���G�*��s��l���7��Wj��>�3�Xo�Y��s��}J��L^�6/��ޏ�p�6whY�ѣ֮+
���o�Y��s��KOˋ/>�Z�+�>�z�G����6�us4��hi�kjWk��s�`[��s���B�
������hQ�j���h
�l�F0N��96���˳�S?�c�5��Ԥ�	c.͖��ՙa귦���$]�9�yۋ�7�}���ڳ96��\��=��s4�N����~Z��F�֞Eȱ9���	��؜�蟣:��A�MA�Z��֞Eȱ9���	��؜������g�	��[{!����#�؜���#��;)�.�&��$^����ߑȞ��v�c&&ũ~��@��U8��Su��>�
�B�s�N��D�t��Ν���)���)yU�KX�%���֓�uv�B���Zhmr�:��-~ȇHB.A��`.*����9XG��Z�xU���8^vXm[���%�Qs%��yܸ᷸E�M��`Ug�>��Ë�Z�xe���8��m����s��D���R�O�[2I}r���h�^mc�5B}Ƶ{��=�5�W�%�Ap�3�@�ZƏ�T��G}.[����q��}�$�wSg�Ù�`�����"��0p�R��"�k|4FT?l[���9Xf����:��I��o�ɱ�j�"h���ؾ9X�5���,�9rY�����')x*r�#gc������l�/�yց��HkP?��#��p
�NJh��Y8��s�8�"��@w�j���!����
�o#���USeK��¹h�9�
�=D�0�|��Z:I—�ù�K	[dYB߉c���#k����m����,>�����)���hк��CP��p��`��!7��Xƍ��#�T�	�Ir�43Sp�����%f�0��9PB&����e��`bOY5�׈�O�'�3�{r�x^��#�[s}T�\����i�FX��B�ںj�$���4�
�F�[����د�d�����V� �g
���_K��>��"
�W�S���e���jO��a�
�h�����������g�х����#�Hm	����{���@�jl<����w���8`��Z��d>��@M��V���{r������ʾ�yF?��x��y�@K蓍��Z�vn�1��m�?|�a��1�6�S;���j�0�Iߛؖ�;�G�T�8��9;ZWK�}裯���ۨ%�-��h_Xj�4�JA��8�趍���~S�m�;�m��9���zco.���R9��3l�!���oT��uj��Q.߶
��G[�qi�V_��f�X���o�,�_���ׂ1��u��]����U=�Dsk�8�sL�o.������r[�c���&����E���o'���T3��L���i?M�3�
�㻨c��-Ƶ�2׶xĈ�o�ٱx�Z#~�0�-b�Z��v�b������Ra��y
�-tj^}u�����1���߀ٯ��9�-��7y@@m�9X-�^�׌���!��w��'��W������r�Z*��hmn��]8��.�����c�Xo��ע/�����o��α���r�Z*�˵�Z�O��#mkh�/���r�Z*��qj���|l��1�b�]}Я�>�b��hq��S��i[�j��/�a��1�A
hmL��>M��a_�G��%쾪>5A�[�}����C���;-�O��Nk���Mlk9X-��jW�n�qt�F �q�Z�}"��u��k��F��r�Z*��m+3�2��ހ1]s��4�MAܥ��� n�c����
�r�]P5A�[�}�MM֏��'��OM��Va_^?��9P��-��P5A�;�&�����A[�Vй��k"]@G�6u�tzP��xJ��S�l��NKl_��'���ʅ�{�N��
��"��{�N��
�q�x�uf�s�+�/���L��W<�<����3Z��W�a��|�^y�e|��<�Wv��o�cN�`=����^�K]̻RP�-�
\�3����c�q���:Pߊ+�5�k"�A�	��*��+��̽�������%2
�A����@��5N�3N�k��v�o.�*n�Z����PV��K.�E�
Es����	41��XBТn�׾���^�����
)��#�|�\��qx�4���<EP��x[,4���2|�U�_$�b�m�<Co��~�?B�S��ˡ��H�����zco.w)66V��ˍ�u>�CI�&-|�ʍ~K�r�R)N\%�E����X
7���-ˤp���$�$ݖұCBB��-�~�&e�Om�k�H>,b�6�m)�*6+./U=
�W�EI˕*|'�J�*�
�l�*�,)�½{$g��پU�����I�W���r����>R^Z*AAA���:m�Dsj�8,����\�RLt����ʁ8_�NwY�h�LK��]钗�)�;��pk����}�R���Jej��$��=��d�/3C�3��;v��ᳲ*=Rz�N�!S���DV��3��z��B}���
&NLݴ7�?���b��_�}�q�ٵK��'E�E��ȡ��$7'Gz���L��KʷEHj�RI
ƚ&���d��%���9Xo�:\��ȴ����1�q�пġ� �D�+�к0��r��"#���P��{@����-�s7K�[RZZ&��;3䣗^AN�t��7U�fN��icei�2	�=Q��-��M�σg�?�&�QS�k���������A[��_�Iu�ߎѢ}WΔ��s�""�����R��A�mK������p�;|�r).)�=yy��J��N��x�]6Cz�G�犏����^|��?�٥����c���7���_�u�ҋ6��9�7�{��C���2%)F�"#�{��e��+{���>�H���#�[e���2t�Ty�->�#~S�d��T�4u��7D��?Ln]:T�*y��΂���.��m�
=j���}o��r��BC��6y����K�O?�B�sr$�䠬Z�J���u��HK�i�ȢуeѨA2i�yy���w����/�"��,���Wf#g���_����8�QG�p_S�ZCM+�W�!!�o�>��X�m� ��^Lߑ.UUr��19TV"3'O�g�SRe��A�p�P��#���SK���qs�k����O���/K�ӱ/Yl�o��6\Sз�\�F0N�z�UȪ`��ϗWWN��;d]|�I�������Trr�eS�	\�+wz_���t��7���3���4Nn[>Z~�0W�����}�>�#yp^?��W-Z���~�&�Nsi��g����
�={�妑�����*��c
�,���ߒeK|%&*ZR����{�=ސ�G�#?�����=��w_�i�p���O�ѓ�'���'�F�s����y�x���4��{x�����ܫ� |����/��%��v��k�W���+��+u�ɟf�n=ޑ^xY�}�E�v��Qo�u��
ˆ�u����r�CyC�0�����x��5x�3�^�p�����W=^�l�~Z��F��r��WHvv���ϛ��o�͟�,y�!��;�n����_yV~8�cy���=o>#���\7�����f�rC�p�c(���a��v҇r�O�������ޖ�������ĭ���i-�jŊ咕�%�������q��o�Cny�.���H�{�H^~�	y��W���>/7�y_~0�=�z�r�������uszȏc��
�U��}�%���{��Ɋ�����5�LhQ��ٽk���rד�ݏ=���v��M�Ln�<�����C��W{J�~���Oɯ�|.?[�_~�|���?T~2�;���1򋕣�&���は��ݻw�|���Fk�W��پ�<	��n���A�r�[��G����_222:�y�����$�\e��r.�T�;�������䇑.��r�8���(��S�>,a��ؾ�ZO���O���ɽ:��ɽ�n7�ܫ3+��+�/؈�-�O��iO��!O����<�W�a���ߓ{5ד{���|j6k����ܫY��+�#<��+�{�@��yL�h�n�k�_�W�za��9�?��T��i���3��Bɽ��7������-xA�_>���n����W.�O����_c�&��� ͭ�\���#m��6L����ك�l#���u��90���賏�̽��;�ϓ;�g�k�t��ٲ\ۘ[�}�4~G�^�T�����m�\�:e�<�4K~���|�ﶫ1>�`Չ��`���m=���	|�i�1�݂��˽j�0�Iߛؖ����O��:[�)��$G2�ч��}i	��g����B����u��/,5A�[���^Q�_��/��ɛg�A�$[���iٟ�F�M�>�`tSo���.�T�����i��m��,_y�4^>�8K�<D����kwnWgm�>rw\�Ҹ���W�6��8�z�(��1�"�cP��͑�l/?��ێDɝ%k�sY�|���m�d~�E���8��qX'�Sc�a�i-ؿ�ܥ����k�mU?Ʀ�[��W~=���1�䯇#�]CW��t�0ك<%~T
�=�b���M5Ú��ĉ�����1�@?4�1����͖?��������O{�t
��X�}�`�=�p\�H�m�o�s�i0��r�Z*�s2�!��x�A����o�g98Z~����!g�K7��}8��ֿ�������c4`�B�X�ÎѢ}��Ԯi6�����)�����J�8��m�T�\�fC_*��cfɍX�-YK���}}W�p�6Ar6�I)��c4Zрց݇yK�Ak�W-Տc�y�+�E��?t�jۃ��;CdŚ���r��)�$�Ŏ���sя_k�=j���}f��r�Z*�˵�ZyO��or��H���V���
�� ?�Z�D���W��ˎ��_	~�09Km�}�]����@M��Va_����߈c����|\�/��Сr��~�y4)�s%g���q��~}�1m4���Ӷ�{�\�������Fh��R��x����Ӡ��l�w:����yJs��K������M�d</.�о��c�U�1�f�Z��L�෥��k����Iݳ~����_l�*��
�_�,���N��6��7����?�}�~�A�'.��ິ˲>����i�I�5/��k�h���Mlk�Wv��k�râ���y�t��$�j���Ӿ`�r�(���1rݺ���U?���~s�w���A�^��%_��xo�2]��/�~���`?�Nj�	b�Zg�Z˽b��{߹��oJ��z�r��H�"~�\	�7T~�cjK���9�ԏ�צ��-8v~�cma�4ٹ��ų�Ͼ�˴O����zS���c���+��z?~M��u�*��k�f�q�L�|� �<~�|?j��niO�8@NR�7��$w�٢ϤO��o
�����߫HY:�ꑃt6���z�Oꮌ,7��T��M�)�w��)r9�.���`�\���x�����T'��[3Y��_�{i,��i�s�/LA�=�?�[ɽb���O�]7P���q=�m�\�8^���>_�8�_�}Mh_�?��ư����﹉���s��pn�7U�]�����ma�s��ѿ%Y�Z�%�?��f�Ua}�Z��	�pE� �ve/�Ò�d��9k�$������o�8RvN�D�1�e���+&�|�
���Ko���oX�I�5�z˕k�ϱ��Z|/��� ��ܰ��W��5��%?��;Y\�ë^���x�~�sǭ�r��ߺ�7�L�~�GU?��
?=z��w���m�.����x�O9�rJn����i��k;���a�]��a��<�3+�<,��q���:���Â�O֙O����<�3\�'>,�{�<yX��[>5���uX�O֬�syX;�fK��������?��u��nX�w�����Ú9s�8��ߵOn�k��f���;:��������%����XF��L�kP����ʫ"�i]u��W�k��D�8�u�������ȓ�?$O��<�'�ox������8}�ƪ�<~�{����gbn�au����;��>=�
5sl�E?�3�"5�i������N�g�3��KU�"�E��՚�
`Y�V�nco˱���Չ9�������a�����v�w�a��N��3�[O�>�{���U[�;�m̶��2��\��1`^`|��/��8,41n,�hQ�@��:�:�{���ͧq�%o�j�m
��n�m��sq,�ԯs�;-��=�m��9���zcw�1�s��.��ן��M�po������RE�E}�
5sl�E?[���j����gN�߂��W�6��p����߯=a�T&�=���9��Z�*���b���s��±�?���9����a�h~��e.�����yLw�wy����W�W_}\*�g)����m
���c�~\sp.��p>���,�
���T3��L���io���;���_z�1��m�Tج��{��ҷq��sjf.Ǣ����s>j0֦i�9.�:�b�
��3�;���_x�Q)�?�c�)�_���n�8��f�˱�S�ܘ�>��`��Z�{&yX���׿+/���ӂ����o�G����+�~�ց݇9L�AsyX��_�9�kƦ4|�i�ml8V�~��]��Ċi?bՕ��{�7��������?��R�z�R�z,�F�&l,�,�܆�9.Ǣ��Qo�G���>Ю�P�L�m�������%!^���
�jmPG;��f�ñ�~��9&�����y��n������ǻJ�QR��-��^Pv�~1��qԹ�n�18���0/�R0�j�}b��N�NkřKCߩ�������.���pϹ��RL�h�2\۹��18�K?��j	}'�5�~�&��<�?��.���C�0@;T
��Vl�}�m���-��K�@'��E�1�e�m�>h.�����{�Ȳ�`���Q7�6֏��6��q9}�����6q�>֛���;��a������qqd�����p�E��ch�QG�T��~�[���n|w��}�)G|��a��r��G�m�2�m�-��X���<��o��˿ߟ�u���6�̿�p,�����B��d��Q�����.��{�ľ�>>
�
�#��\�7�N7��&q�c�����ͯ�q;w:7�jѹ�.�l�}�1=�S���Se���uZb��h=�WgW.�+߾���f ������\�$��o�U!�#���#��u���,QkS9���U�-ʐ?��W�-����b�6G��Kq�T��"9f��w�ա���5�WKQ�d�~��M;�N�6��"�h���{Hk�(¹#O}�:�M�zk/��%�c��9_Hk�ʓ��q����kӴ��G.[����e�$����G�C�OC���]r?��O�5����i��A���q[����ꭱ�{L��_�����ꃵa��'N�-�I���g�c2B�wr�,�8�"������;�cw4y�����!o���_��"qA�e
��G-�$�K�鱰`�}b�j��v�����N�-d���h�Iš\)C�U	>[:*�j����m����=��#�k`�H
�X�S�
h݂u�!�g!�*/N<�Wg����(��"Zց��+8�x�f��˿j�>X��q�U�O��Dcv�^�����*���1[O�щ�ި-����x�>(Z��5G=J���w��ʻC�N�����
s���K-���n[���abȅ��g?��O����_c�&��� ͭ�?v>�i7a�x���1VS�6c
�ϴ9��<�
�~��ǀ�>k⴦�vg�U[��Nz����V�3X8��Ý�Ѷq�XS��>�uL�YB���6��e;|��� ͭ��}�8����:-��9\mNg;|[Ǥ�q�qZ{m�`g�U[��N|�:ǰ�G�T�8���:ZWK�}裯���ۨ%�-��h_Xj�4�Js��JX:Z���k�f-�OF�N������ø3����}��ש���wp�jܶv;�C��߂��W�6��ا�_�#�:&r�8����<#��ub�7���a�h^��u��������k�m���7�;0㛸��1�G�q�X>blSͰ&n0qb�4�G�>R<o㻨c��RpN��:��*�u2�!���w3A]-q��þv�>c�7`�+}cu;F�>�MP�8�����*�����J�q}��8��	}��h@�6���������1�֚��e�7d|�Y��}�jG��9�Yi��>3~s�Wm���k�ܧv����5���54��Va_���ZǸ�]wY�A��οj��/�a�
��φ�^N��N���u��1���:ḁٲV\5��&Hs��/�W1�c(C�}�%�IS�	c�|���m.���¾|�W�
�m9��A��4n�Xk�O�9^�Ns��:�}�\�U[�}�meF^?��0�k��@�F�)����ĭ9x�4��Va_n��j�&Hs��/��������~��	��*���^���r���$j�&Hs��ľ"�v3h��
:w2�M�8��Ν�j�O��rJN����i��k;���_�]���~��̠�|������C�~�3G~���k�o��W����Y'�o[��W��"KN%ж;�jm�֝cuD�Ս~�KhF��n��qc�?C��?��~�q��l7۱�tD����!ͱ��h#~���։�۶в��uݻ;�w��;��:h��uc�׊���п)��ȿ���4������v9v�$l�\�֮�֫5l7��>�Zo�v	�?���W����A��߮��`�S��ϸ֛��C��6Q^���1�>���q����߃��+^I��_�x%U.���Z�@�
��c�>l#�~v���}.�b!�?y<�!�^������B.�y���,�y	u�	���_���O.)�Xഄm�o�+	�����f~��$!�y�~��/n���5�]m�����7Y�/���P/%l�e	}'V�m�f���3�p����l�&��?�?	�����^�.�z�����%[pm����Q ���\�U#�q˧n��
�h������T�3=��򯮸��WB^��l��C��C^�]F-Lj���믽�G��f9p��W��.��k0 M��nn���o��7�ym��Ϳ�`�v��k���;]���|98�gDjU��M˰_�y��� P�➑`؟(p͑�u���1�
��[�s�W��di�o��1����}��J���'�E��� ��@�~h�n�nc�,8��
�u9d<�wv.�g&��'��w�x���91�C>��u$=Lsè�>-�Ÿw�Ŋ�/V�����u$�ߡ�OC���ο��n�wh�U5�W���B�#�\$h�ۧ��L<G&3���%�L����~:���N<R��9���Zu�q
5���ܡk��õ�8�ʋ���(�Wj��f�����R������8���y�ڹ��P�?��	��J�^��c��?~�+��z䭑��5R�uT��5?Ɏ��b�"+
ǙY�Y���R������돞�c�2�P�w��&�
I�7p���P
���AN�Q�u԰����ըW��~o�́Ś�qL���:2�������+�7���¶��	�yؼ$�޾N�WGl�Z����
h�%|����!Bא�?�����&��{⺓���S�8��c�u3�A}��k���3k��:j�2'J*p,e���~�_�~��<�e|�3ψ�j��]q���S�]u�?��:x�`
�ۺ�h^���zt
�8��G�:����Xֱ0.Ǧ�h6q����	�xߦˁ����|zP����d�6j�����73����[���=��?�4��|c����X��ݽp�\Ե�EFR��^�Y�����=�m�I|޽?6U��anlg�b���/�:�5��(hd.
�1���4��@w7��:�q��b3޷ۤKOj5����5�f�V�LLֵ�Y�(_LI����5���9�vl�UVJ�j�/�&�A�}���_��$��%#�}m�"p��}��c���=ܗ�����\��Ϳ2y-��1&�vp�y�q�r��=&UV�n�y�
�5�a[����+�|7�kx��]��M�$����˿�m��Di���x�z�A���}�F���ȿJ����!��~��3@���]��W�<�W���
��'$�=�&y�q�h�KKПc�|b��N�Nk�U|j�4�
�r�W	�.�v3!�+��)K�=�jW��Nk���Ml{�_=���׀��]/��q�ЯU�'�/Z'���@�m�>h�����cT��p~�{4�?��MAܥ��� n���N{�_����'��ȳ�e��:��+��� ͭ¾�Ɠu��ߒ,��� ͝�ɿ�8��S<�S��S�l��NKl_��'g��ʅ�3�N�<3�K$��3�N�<3�q�x��xf���D�/�<3�L�癉<�.�g&�r���y�I�e�	�w�7���f�q��z��=s��)m=3����O�'W���1�y�q��D�?�9cm=3��o�~9_<n���f'��&�ߎ?�sй�k뙉��pR�[�6w�:���݌�������s��Z9c�!q��O��uꧯ�J��	�
��k���sœ��e�%mv_�:��$L�\��~&qc>��I_�&?�r� ͭ�V��?��Q��P�Y�s�k6����ܳ+wa�1��$��#���������1I��Dzy�x�r���]����ه�O˾��8'2g,ק�d��ϱ����i}����7ޭ����g�3]f�j̉�Fڀ�LY��
�]�/���y�r�R��ɟK:֓�\����A�[���1�o�^/��ߌA3,a�ݯ�{v�M��_�-��f�U�ݳK�,]<�s
wϬ��� [���\
�wL��g��۷l���#i��pr������%ǻ�I]��8sK�'�� �0/�9W�b����,��3�+h�~~���n����������y@ئd�p)�l��uZ�J<Kf�H)	#u���P�뜼&*0P��U�#g���U�?�?J1����(9�?Z�!71���{vٖs����k��̷2�����F�_�jmPW�v�V5A�[ŝ��gv����u����
�O��n{��j;>#07��u�d��IR�c%%g��j��_@{[�����S;-����g��`qU�1�V�	�"◝�s~�\���1O�\��K~ �j}f�\7V�[;V-a柩���XS�&Hs���3�=h����ԷlS�����'�5��ӹ�;9cW@?�`�e��բ�Ɓ� n��-�S?_��>�m�˱OG��\A�����a��J=*߇~�3GJ�-�1���W���`���n�����`��_��8�sL�?�{^Q?�9nK}�R�p�h[��:���E�*�k�n�qW�:���6��g?;NL]����1�@�noh�<~��9a�~fb5��{�j�F�����u�X�q��b�
�x{߳�z��1T��!�ڇ}�^�\���x����	�sm�۲/}�Cњz���K��ɛ;���൝�>��i@�6�_?Q��m؇�
h��]�������8���{������!�ۀٖz��u��7���3v�p?Ҷ���v��K5A�[�}9NK9c.�ˢ�]�9c�l�9'�Ĭ:}b��N�Nk�U|j�4�
�r�9c��;-�O��Nk�(��Ml{挩mb�a�5�'�/Z'���@�m�>h��1�t�����6q�>֛��5����;�P5A�[�}��'g���ߐh	�P��S<9c�y�I9%7�a	����z�ή\�yL?9�B���tM�9tT�5��Ԃ��),��B۔�����Ɗ
mSXh݁��)q�+��-6,�o[$��+��Y���B�1���)q�+���
��u�-�[��iYh	����a����)q�+����n���',NKX�>,���i����b��6,�6,NKXh	-aqڦtĽ�X��(6,�6,NKXh	-aqڦtĽ�X���/6,�6,�e�}Z�BKX��)>ߑ�e��ي߬��p���'炀!��>�ᒵp�7z�Fܫ�=�8��`娏�8d�X>R2}Kz��s��1w��j-�okp�F#�%|����mE�p����D|�-_��+S�{y���Q�I�����M�CA�%�o��D/���9R��#x�`qv���&�{�;��Z3�k	��K^� .$�g�F���d�2o�l���9KE���8Ar�����}e嬯�o�2c�g2}�9�=����1�G.�r/y.�O�]3C	� ��J�E���K��:9\�Sqφ8_)��+VN�\<whǂ�2t�'2s܇2k�0�s9�	�b��='yL帏G΢��^�{c��?��?6�˳I��٥2��Q9Q[�-,��ܳ(d��-��u�#%jr/5u��񵌜����xM�TBw��~�:<�i�J/��s�d�;v�ܾ!D�HI���k�x�}M���.�U�8���^�%����+cg
����L��f��SzHO�j��2{�$|�G��T�)�#�a�p�߹n�ܾ%N߱G�Y2Q>�
��Ե��OԔC�^|��)X9Y2�ɔ��.������/�ˣ��G��˗������%	�PG�1��'�q�%�K�Y3K�X�Rn�_-O//s����d}�����*�˾�mR�	��
�-�~��9�塉_�Ϣ��h�N�B��������zI����c�_1Zz�N�.�G��s��n���KŞ�r��>���
������Mʶ�����ɞ%#%bNoyr�J�+�2W�Y ]��ɓAC�����8���juD������W{���?b�Tn���X9z K��3k�������oQ��!�kIi��q��)9En���o���$�G���x�J��r0y��so<�?j�4�����1�Y2X�WM��#��o,�[E/���R
}��ȑ.؉��<���o/�r�[ �[�s�T%�H9�1Q����r��-�M�пT�w��.�(H����`��&����#�)�)]=M��*}��I�
+�HՖ`}
j3��X��O��<�3j7�/	�V� e�s$0�W���&IL��m\-w��=��徨	����BvE��j�^��r~j�4�JKyL�>����q04`�j�~�k�}\�-Fjv w��&
��J��ʍ+�,�[JC�ʪ�ir��8���X�=!X��y�ޘ��?^��1Z��\v����]���|��=�rp�P�p���!��,j.ְP*��Y�1P*7c-��rS bK�v�/�g�c���C�ok����u��'r"�U��BG�������;e���<�MM��Vi)�iϪ�R�j"�0���!|&^��R5�X����!f��F�BߩR<A���ٷ|���#�>�d�� y7�h'O��}�Ɍ�/���)�y����j)��$%@�q�P�j�%��
����b��IA;���hkwRD�zĵuW7��o_I�(�8��p�.�o�7���cJ���G��0��8�Wں��L�V�;=��P��М������Q2kn��e�|nD�9��i�Q?�9n����}k�J��RL}�:U/`�x�X�$�Mt��ø�8�t���o��}��?��?F2q�>�����G �_;��h�H�̞:���2E˱�U�pջ�`ٷh�a� �=3G�!��z�zm���ګ"3\j��ȹ�y�3��p[�$N�P�#5r�:�a4U�{�w�5��_K�wُs�!�7f�|���˓eG�,9��k���ޙG�U�w���q�3�ē�O�Lb;��8�[Ǝ�x��3�86bG,�0 ����@���F�Z���j�[-�ԭ�EK�$!w���}�ի�V���Zd�=��r��^ݮ~U�U�~p����]~ӎ����N�?��aס�o\[��vi�w�t�k}�n�}�@�C����uL�������ܿN��mz}�k�Y��W�=u����Aπ&��:&�ئ��5����jگ���M5�zi�۩{��1w˿G�r�����S��nը�n�O��7�q����t�~�5c-��ρ,5���c9�Ӛ�c����W�ֿ�[��פ�h�>�+��܁)B��c�v�����9�m����4�W'Z���k]�yU;�\�烥&�VTc,��c�˶�W��
z�X�� �����+n�5���G�w���+ޠ��Q��6i�3�j'I�3Wu��@s�����k�n��q7�y^�A�[�'6��a~t�u?���=���4Ol�y��ԤҊj���RtL<�'[�=��g�����V�K��6�y�ض�E��nߚ�z~�=��o>���q����|	[m?3\����
н�1G�7G}s5F�t����М����tL<w��R8-bK\��uC�h
�N�c�s���&�VTc,��á#��j�&�VLKuL���Җ���n����1�o���z�.v��+��5i�$W)Ξ\1���s�����>���\r��_�
�*ͱ����:�V��_����hw�y��u�]fāc��/ɦE��@�wm[�ς�r�h��~�K��O���6�����d����ȑ#]��g�$Aչ�Ƶ�y�l�+ڭ����ڵ�,�1"��
�8�@n���^��v�i����?�P���v�M7�o��?t��\�W
�۹s��1�=���Lc�'aL�_��ZW���c�t���q��ha
��l!B����NK�?��/�־Z6�m��n����K�>�hÆ
�8�ǒ�Cl�_h��`�ke�_����:�j�q��<9���r���=���M3�=R�]w�;����q�o��3ߵ��Y���+�_{������p�����=F��=�ސ�a�E������$��GL�'t�5���ͬ�H����o�q;�-x�M׿�m�0fI���ۃ�F� |�T��n��ۃ*��֓��H�#�����Xv���T?�#5�ݼ����\��,����R̹�/����y.�{���}����5iO��o�V�r@.I���)��0�~k����=��ۃ*��VH���8�S�]���|�B�_��g����{����|��>}�徍3����뫫�H�{j]�֚=~��8��������rc�ݮ��0��o�{�v7��An��Izm��e�YU�{���X3y�3T�G7�)wr�b�ӹi��5���zN\�~b�۶�5���!v,}�E�A���Hs5���Z!���y����Կ_ן<�1N�Ə�Cc��bH��^;�My�^�k�'�:m������_���Uo>ok�_:��Ef56��r�(]�k��Ds�x�{����3.�פ#:_�1ڇ�I�����_a1�|�auG�G���z��� ��1��F���?���_u5͵����q���统����f�z�~����$�\��D��ڏ�yk&�qo(���+KM*��VH�V�z���<�/Ƀ��״��Tu�'�1��yxL;Tw�˅|)��B��3�/1�DkM�>{��.Z_�s�����t��~�%v�7[�J��3c��c�˩��Q�%u5����q�x����ø`�YƷ��n~��:
��m�ฒ�Kԯ=DZV?s�'��6NV9jo��8�C�+G��,������_0JǨ~��s�t!f���|�T��i����?Cb��(�9��|9�W�B�g�ƞ@/b��ș������F�a5�k���������>$}c��&c�.�t���_1���Y����$Q��A���TRU\GlO��n��5P��)F�m5F����V�|jRiE5Ʋv)�+�!�OB.�}B�����gS�Š\<�b�_�*��(�G�����T���+��OM*���X�����r�{/)�Z�I��R�U堶�������*��@���[�����޵�����^5�ѯ�veX��k�_=v�c.0���F�!�&!��\%�W�x������^�v�3\���W���{���q ��q>�KҰ`����W�!���DZ�cn�ν���_��X��>f��x���MU�¬��]!�b�Y8�u�,P;�c
1����/IU�¬��{ݽWE������Ӻ�x��g-�|!�?4�����h�~&�����>�=t�l���9@�
�;O��U������Zb�����b�_0f��Џ��hw�X��w��n?��������z��E�_�V�x�g�r��;$�i9t$���T��1OJ���}�^��w�?_�}��b���;̖���G��T��;~�G
s�f�w+��q�SF�e��w��?����±Oy�I�}�ԏ����o���j���ܖS�d�Cdk&�F���č�7E��1n����awt㍑w�E���`7Խn��ʍ�ս>�&���n�C׻i��G�����VM^U��!i+V��� �?��ꐖd���Y��%�u�>zS�����mU�_m����a��Ԍf	|,�'��:P����t�{2������N.�tL�y�����Z:�!�OK�\������)��pI����sI��䇮������2�(d���x�bӐ�ꯦ�Q?K��t�\l�������?�%/��-�𠞓�F
vsG
rs��Dž��7�ٻto��_ռ�@U�W��y�~����(��#-5����+�V�u�����v�F߫�|HW��VIEL�X�=���ÚH���������Cސo9�4P�J+����
���>��=�M���>����ϯ/?�ˬ����?���=���x�
}ԤҊj��W�k0_���q_����0'�/�i�l��~,0����@�;~�~}Ś�XL�e.�>�eVqX���R�J+��������֗
$��as�1��}���lȗ�_*F��g3ԉ�|�근0-��>�a�+G>3&��X�.�~�/�~�S:��~��-��/�+:����X�4_0�$���1�X�Cc~���q��z��y�|�������Ǿ����_�>�y�Wf6���8��9�5���_���oc��ə�������9���{
�0[��
?�؀�c,̉���v���<��)��*�����
߬P�lq�|����x�7SN�U�z%��{|n�;��r�VM�'�+�X�ub�X��|Y#�	����C����"�)���K�����-��5ȃ����E1��8�E�ώM�(o5ȧ&�VTc,k��_Q����u�v�bN��5rl����x���*��d�\���#�E�h
�N���s���&�VTc,����{9}���A-ԤҊi���rP[��V��MS|Y �B�_`S�U�Z��J�W�k�zC1���Y�~	���$}���ZE9x��3��U?�'.6������q�鯰�7�� s1�:�wZ�c�a!�^,�+j�Ý�ݴ�Y1�1�@�������@?�'��C�Pu�
Ǧ��T��R�U����P?�@��l��J�W�D��m������{8߇5�����c��LJ�!�r�i�&�VTK�W�T%_cR������V|[_6��Cs����Dd��u���!_�~)�_������Dy,s�/_�~����r,���1?��8Y�e=��<D�r��}�C��c�_b�����������ok�Vc�H�M�W��9����
���g��˷q��Ȍ�y�1���ǀ����4;��Nl˞�/k�>��>V^q���4Y�1���9��9�sy�pݩ�����>a���t�:ޣ9�
�1Y6��sQ>Z����}Ex��I����p�^N`�%EP5��bZ���Ԗ��U�u�T_��|��Tջ��R����Js1��A_���_}��1hM^z�%���k��~l>�RE]��v�#cl��|>�RE��@�G?4�4)�%&�
������>�}l�
ܨG�%fL �ؾ�_Ѩ��z��<o�O,1�!������I�|�	�5}��J�O�(��_�K�W��*�_���T�9�~��9
�T���dU�(C1�c�p�k:�����'�yC��'�@M*����<���J�Ƥ�+�ͧ׭���l ه��������gC��R����+:����X�4_0�$���1�X�Cc~���q��z��y�|�������Ǿ��S���ə�������9���{
�0�꯲��sڹ�ʙ�!��o���o�FcR��sy��iv,a��2�='_�}��}���P��i�cR�s���s���B�S;s1��}�96�_�u�Gs�kBc�l.���|�{'�_�9���S�J+�1����콜>��K��jRiŴTU9�-mi�h릩
�,c!��/����w-�_����5�Q���[
��
�>烾$}���^�� g-7�z��=ї�����/C7C.7��D_��%4&�@�5t�1��1}�����cC��@��}��
��c�۷���O$G��1�/�W]�]f�O���C{K��]?�=QӇ�+��/�K�W��*�_���T�9�~��9
�T���dU�(C1�c�p�k:�����'�yC��'�@M*����<���J�Ƥ�+�ͧ׭���l ه��������gC��R����+:����X�4_0�$���1�X�Cc~���q��z��y�|�������Ǿ��S���ə�������9���{
�0�꯲��sڹ�ʙ�!��o���o�FcR��sy��iv,a��2�='_�}��}���P��i�cR�s���s���B�S;s1��}�96�_�u�Gs�kBc�l.���|�{'�_�9���S�J+�1����콜>��K��jRiŴTU9�-mi�h릩
�,c!��/����w-�_����5�Q�R��b�_a�0a��A_���_�59l�>Ɛ/D_��W�U
��B�j���F���84?��8·��Rh��4ml�<�b��&�@��}���g��瀟���!���
�Z���&�_<��S����D9���?�_���nD�T���T%�;J�WjRiE�T�O�W�5&�_yl>�nŷ�e�>4G�\lLD�x_'�8��R�U�X]�1X0]M��2����%门_�)�R��0Xߏ��X����C�+G_8��=�=>��%֟꯼O��\�}��F�a5�k���T������
߬P�lq�|����x�7��x���L�c��Ė��9��F��c���MO�E�ꯘ��@
�?�
םڙ�9M��ȱ��J��=�3^��esQ>��8�5�;�����W�ǟ�TZQ���?pg����^R�P�J+�����AmiK[E[7MU�e���~�M�W�k��*�_�����4��*@���T[5t�P�$�;{�,1�y,��?�|�j믨��
�ub!��d>I��Wԁͅ|.�ͅ���b�d.�XH�'-y| ��+�J�1�P'6�%��V[u�����6�;����/��/��TU��N�W�O��#��T�꯺�S�U����R�����(�_y�I��R��?�_�טT���֗
$��as�1��}���lȗ�_J�W=cuE�`�t5Q˜�Ɨ�_�~=�K}�o�O��a}|?NVcY?;��}�x�������X���>9�3�s����!��|�fS�U�z~N;7|�B9�1����m\"62�m�hL���1`.�72͎�"�[Ʋ����Op���W�7=MaL��bCs5p�\^(\wjg.�4�OX#Ǧ�+����h�x�BhL��E��>�\���`�+?G_jRiE5�r��=�����{I�BM*����*��-mm�4U��b,�6�_�����Tu��>���Z��j��/��A��~�a���_�:�;�O��[4s�;���;��ie�ŅƒORm���o��j�-nò
n�kݑCGܰ����OL��5?��ORm��񁏛��x}ֹ��j���{�F8;��;?Fc����-����Ƶ�n��e�_��j�^�����߸Ώ�sb�����oۯ��׶�=�!�qݒu����3��1�%��V[E{���,PK���<���r�����6�a�5���%��¸�AE-��?��J��w-�y��+>�|~��J�W�Z��I��ߍ�B5G�P?�@��l��J�W�D��m������{8߇5�����c��LJ�!�r�i�&�VTK�W�T%_cR������V|[_6��Cs����Dd��u���!_�~)�_������Dy,s�/_�~����r,���1?��8Y�e=��<D�r��}�C��c�_b�����������ok�Vc�H�M�W��9����
���g��˷q��Ȍ�y�1���ǀ����4;��Nl˞�/k�>��>V^q���4Y�1���9��9�sy�pݩ�����>a���t�:ޣ9�
�1Y6��sQ>Z����}Ex��I����p�^N`�%EP5��bZ���Ԗ��U�u�T_��|��Tջ�q�_]q��&M��*��ٓ+����\`��F�!�&!��\%�W�IP�=j6���ݞ5������Ou�,=⮻�	�
B�
��%ٴ��_um[��[�Uu��$����'�0K��ȑ8���#G��|̙��_un�q�k�(����[ouI�q�+i�S_]]�����r�xs�p闤����Zkg�(�q�ꦛnr7�x��Çw{��5K�6˸|~��0��qz�+���9���ղ����M=Xb �2.�l.����
�Rk�e�_
0��
7�`<�裮��͍7�j"��g<~�B?��	�Mu�a�۹������ڵ�
:�|,1>�a��믏�����U��滶�3ʪ�������/�����S�r�kg�Uu�Wn���k]1\s�5fKᶛD�/�g�Y��4
��_-x�a�l��T?o��gJ�3����|��;i����$��GL��5ר���Z���ɏ����]�4���&��Ų�'�:�u��u�',� f(ޱj�{�M׿�m�0fI��[=�qW;�1�l�0�l�#nٸ�n�����WF���>YU���Ɏ=�I�U��n��Y��USG�'b��מ���ʈ|j��b�=�S��f��7��{2��53�vk!�_������+�E��1�%��.={פ=��_��n��^�z=�VSE.I��l�_�~k����=��W[�Xl��
�ֈ���_�ZO��g��+�����?;ح׾?�e�~��qmk^5�վ�o���
�U5�W�Zk���n��s$/�;�W7ˍv�i��ո�nwS��-���z]&���m���_uiΚ�#ܘ���e3�r'w�s�:7����4>zN\�~b�۶�5��!v,}�E�A���Hs5���ZO����y�&kS�~]���d8�s?���{��!9n{�T7��{m��3���y�g��~�VuB�GV�����~���N����̚�]���k��Ds�x�{����3.�פ#:_�1ڇ�I�����_a1�|�auG�G���z��� ��1��F���?���_u5͵����q���G3��u,6���l�V}�����XƘ�':��93o���:�
�C?Vce�I��z�_�T=�f=g�q�ڗ���kZ�e������y��<<��;��B��R1���5�쭎�h}��9rn\K��q�y��9s��q�X��3c��c�+��Bg��4[�o�k\4�r@}�0.X�G��mk��0]Mԏen�Ǖ�_�~�9����?����ͷq��Q{�P�q"_9��fY���<���X��Q:F�뵨��1+�G��Gնv����@�ϐ�+&�i�1>_	�U���=�^�b��3?�?|om���j��	���_�\��$�I�X(�	��K�q9�W��לvn�f�rfc��D9Qld|�7SN�U��:b{�ƨv��rꯒ�!���h\!��a����ɂ<���+ۋ����r�[.��!��$�86i��� ��TZQ����O�I���'!��>�?Ǧ�+����h�x�BhL��E��>�\���`�+?G_jRiE5�r��=�����{I�BM*����*��-mm�4U��b,�6�_��}�W7|��Y5/-�y��__PQ��7��cn�h?XH�blrI�UR5���X�:a�T*��W�����~��q ��q>�KR��z�\>�<�E��d�C�Y�����'~9��7�x�,5��d��J~�Ո�?�F\�����c���>�w���8��_
�ٳ��31�0��iV3>��K��!�V���S.ɰ�<m�4��’�`�$�䣒�5�GO�|}�X�H��[W�i����u�?
�ȕ#]1<��'�Q��b��/T���}�Յ�_
���.DU�_��!f(�Y�z��ڳv��<_�U��8��}���EU�>.��B��E��魠Ql�h^X}�,����O�\��`�<�W�.��e>V��B>�������a�~.�Lq��W�������Ph1y|l�!�r�i�&�VT�I,}�zX�%a��s|�=�q���(W���B2�Y�=}��-o6��,��>jRi�ڿ���������_�a�+'?d�۸�_Gj��ե�� �<��U�#�oQw�RT���x�U����џ��'���[�X�6^�X�|��?���լSI�zx�~�����몃�\|���l���/]�������[nw�~��췆��|`[�7�o��fw�}M1_�w��o���n��s0/\��տM��|-|.�6���y��f��_]v�[�{��1[Nœ�����Q��&1]M�ˢa2_0>�~��kW��u��;�v�O��T�߾7�W��g�\�	�i�P?:�A�B}V���{||����kV�ހ���_f��by����ms��
ƥZ#�~���l�(�׿fc|>���W����?>�����w�}�>�־7��|>8�‡/�je�~��௫j�:��Vc�H�ͯ���յ�s\3��疟�$;��=	�Z>��_ms��u�oo�s��zEV���l��^��t��W���
{���k���r��nl�Tgl����͍�+7�/���%6��ܼ�`��}=fCld|�ߓ��s?_?�q��_����F���b_L���||y�Z��+7m4X#S��� \kj7��I��W-u_�����;ݧ��羮�ɥ�e�kji�!&��/i�0��Y�[mhL���dA۳��~��j�o?�+S������mi��iJ@,�\��}]?;I�t����ׯ7��g��V�x����&!��(��?_�I�wnv_�ٮ٧0�}�Z��V��ܰ�-���6lؘE]]���g\��|��%�n��u�kd՟�>��"a{�_����s4��C���޵�}�����&W�e�۾#��Ɲ�~ݬ�J�<��~�z��k����_u
�/�ͣ�c��|ѓ��]�s4��C���=���(�7�ޭڠ{�F��Ҡ|}^.�n��u�5k����UW\q.�G����I���hMըZ��k_��oؘ��>R�&�i0K\�/�j���_�v_�z�꯱�t�j^2=҅P���\�7�ZX�w�s1'����'��g��y�놞7�~A?��e`O��k���\�>��ژ��9�n�n��˱�����K��~4_�<_��5V+�Bj��be��~��]�߹��J�`
�.*�/D�}�g�W\1������[|�(�<>h\�!�|-���p�
��%^#��J��X+m���n����1�o���z�R�U��:_CUi���:v�D7�q ��q>�KRi���qG�;�1ࣳ��8�!�%�MB��+�¾�v�,$�U�;�W�a1>6���B��+42�h��m�0M�<�>�s��Ō��K5�Wԇ^
K�;a�4��ǧ��V���+�DznR����;��m�|K>��c���BScM������㰹�<6	��TP��+?�Ψr�K��y���.�_��+�T��W]q��J�W�Z�����*�_��ɪ.�Q��`�p��r}�(4��<>6���Qސo9�4P�J+���+~����1�u�/E����H�W�8o��F���a�I��5|�|=�3�$��	yY4L����/����+��q���T�k)ך��zR���Z��*@,R�Uz��}����JZ�!���J�W^�T*��GE��ka��-�Ŝ�k�T�)T+��
����T��������E��J[�[7MU�e���~�M�W�k��*�_�����J�.��Q��$��_��ꐶ��ӇM��$䪩�
�*�*|l�6�Uw�?bL�jc����Q�/��C5�W�N���
ӏ�
1��
1�}���7S��'b���
����B𩁚�8,�?Xb��8�������R��n�R���V諂��8�_���B-�_	�T���dU�(Cq��{8�dn�>GGL��(oȷ�D��I��R��?�_�ט}��뗢�S�U��+�Q��~i�X��ڰ�$����	��l�Մ�,&����R�UwR�V��8�_A����kM�f=���k�Lw ��*��j��H�T%-ϐz�]��+�I*�B����v���bN΁5zS�����]R�U�\*B��w��^��"�_��׭��*��@���[�����޵T�����GU�j� W;E16@���TZU�G�i����YO];&��ͥ��|U=��R�c�4Z��R
����-�i������9�;.F���_��
u�K����1�c���
��|���ca���-D5�W�@?��;(��X�sm>8�&�_<��ԟ�R��j���l����S�U��J��C�%ɜ��M�W��
��HVu��2K��sH��sD�q���q,̏�|�qO�9��TZQ-�_y�S��|�ٷ��~)�=�_�@����y�6�5��
[Nœ�����Q��&1]M�ˢa2_0>�~)�_u'�_a����S���+_KA���n֓꯼��tWb��"��VM�W���7�U���R)T?�(j�^�n9`.��X�7���+O�Z�U�ߨ���~��KEh��.��+�\������u�T_��|��Tջv�믮���*͓��VL�遺�����;3�Yű/��$�*�����v�lZ���Ï�&�:֦��*����M���q���M-�a����ʁ�?Q��O��'��Z��?Q�t��i�+�_�q�f���C҇|��,��'�3�7�_}�W[�'�i[mm�'���߬b0?+�d�*G���������/I�Sf�տ�����h�>�~N���Edm���a�{s�c����+�x�:�Y�,]�J�~�g
�w*diXC�s|�~?��<���X�$�S~��}k���>�:g���}�G�:ߨ�w~R�~��u1�l���w�#�r��_V����Y��?ڤ�7�߾R��u���[`|�G��1��?��HZ���ޯs�u���������~�ʍ~�B��d��
��r"X���f�l�������c~���K��ɿ�s�c��~�(G1�����v��a�tW����E]�b��]��:Y�:�G3�X5�ߜ�j���k/�r/<�ͣϹ�G?���_��8�=�қ��w�p�����׿��87��Q�.IǤ�/V�U��e�Ժ�y���
��?_7�}���b���h���֮��a�ֻ~��s_�y��ƀ��[�o�<�s��nܘI��jo�J��]�;��nr�n[�ݺ���7-r��%n��9�W]|���{jݵ#7복&տ�}��k��v߼c�{`�r�v�[����_�\���~�>��Y��4�ojrKV�y�80?�ːo9�z�I��z��:�k��_C�����w�1{�:�Ɍ��X�r��j��uV���_�ݣ�շLc�X`<�o���/?�&�VT۷h����5�y
�1�}��~�������C�����MzN�X�aN|��O�X�`|>�U����~6u,�'y_��<��G�C\[��ם���\���~&|�:�,��Ⰶ��~դҊj{�~Q{Q�%vl66�^���B�]�mr_�c�Gu���w�~����gC>�~�P�[3F�B?g:�P���q �+�v�����w4��c����n�1���3�������]J�{j^��mNi���	�3�߬=m���5�|�l6B��6�$����ņ9��ȧ_*Ԭ~=�K}�o�O��y�c;���ݧ߳����T�/�g�htߺK��:�j���x||�K��(���Z��҅��#XFO]�߯�9�����J}�c3$抉r��l����_j{4�?�:�����m^�=g����'���ߎ���ﭭrX��� a6���P�J�3z_)��!�j[�>���
u{��=:N�O�qY��P`�1h��EO��B��׾?��m?��y��לGZ�!�׹��^j��ŷ6��[t���"s���_3��*�˹���O��1g�6v���_���Wo��O���i�˂��	���zz�_j�e��h�Њ�x�Ѽ\c�V_7�vٻ�����`~��Ǐ0=M�=�
5Ʋ���x��EY�7X�	�T�'[5&����&!��(o5ȧ&�VTc,k��}��ahC��n��^��^���:v�~�I���O�ϱ=�
5�r���6ێe[+����y�ꑍV���l��0����bP������IU�1�cO6�2�ќZko�"�-�K����q}Ĺ(�5��;=�
5�r���j�&�VTc,ǜڡ���}Ix��I����p�^N`�%EP5��b�e�ňj�q�v��w��4��R��~�����c޶���s�}�飻�NX>�!��wm8}h����l^r����'��W���O������j۳e��������qټ'�����~�q�:[\���s�B�v��G�4m՚^Wu��M������]�Y���&8�ܙC-z�q��O��;:6���_Y����@SW���/����N�VM:8��sl�c��R�������F׹e�;Ѿڝ=X�V�5�VS�����O�ѩw����{����z}f��j|��Vi�t�U��c;�:���6���z
���}px�;w����r��3��|W�יê�k�;y���g��^?�j^�>8�M�A���xS�Ρ�{��;zT�{��c{�;�V�+f��͋݇'��7�9�d�Y-��V�=���{���i���شh�۽a�Ӧ���՝���lg�;��p\%��z����=Ξ����:�}�=~�S�O��ز\��Mq���r�X���N�����5�-�;Uf�V�m�^��b���}
����m}{��^;�i�h���9�q���8׵�ul[vP��m���gu��׾9����6wP}M�����s�.�;�kc�C8�߳i�I�ۭUj�ѵ/f��^�۾�5׾q�s���a��{��g���΁��MqǷ��%ӻTrVk�_�y����9��:�:�������gt^���4��y�S���G���~>��>:u@�ȹ�9��v�V�گ���V�������_g>���g�Z���gԹ��f��Hg�ໃ���%3\����c�{��ѹ�;�;��K�f�N֯�b6�`�Gl�5]�b��I�Y�?Դح���[1��b��ާg����K�c]��]H3����&lV��������>�1��@��s���?#���7E��S��ЎUE��=�u��Ŭs��8{���;�ՋMo�(��n���;�m����[fS_��]�^,�̧~]�b���]�n�ji��ㇵ7Ι�6��s�����k�P5.���=�X{�g����{T����f�s(a�i��Ԣ���
�]�h�z\wo�q{���&�o֠��Wʹ�w��3z���ӟù�;b{6{v���wW�i'��ǻ�׺�m��s�Z׸��;�X�;���|_���yS5���n��rFu�{�����w�<퍗moz���wI��u�y�����+���u���sǵ'T��A}g��:�)�}@����?�suI���6�﹓t���\&Ωfo�Q��+���5s:�lv�y�ׅ
u�p��
|A�Y=ן�=ϑ��ڣ�J��m��۲���泇�Z��,}pt�;��_��ճ;�t*L{���
���sGZ�y�:�����o^�O/ijY��n��5{;��ǭnퟳ��ڱmV�ˣ��R�䨟�>� ��9 w��6�sn�sP�;м��\;O��e��E	�[{�7����$��?޲��߱���Ӻg����F|�,1>��U����
�~��6Ը�e��=���þ��s��?��9ۥ�r�[u>[T�������3t��Ϧ��~����v�z�|_��ݎwD����ڷ�{��K{���}Nם���s��w���W���׿4����C��<��`���cC?תY��^��g�H�=�]��s��R�~'t��<�k����T�j�p.�5�ض%V��ڙ����{��p���߻[�i=gd��"|L�A�JL_���jN�8��=���ԿU�/��]�_�w�({[�@�RW�y<�!6o^��������Xֳ��Z��o9��G��מ����߲\����1��X�?ޟ�-6�-�`A�Y�t}���~�i�S/�س��s<��U�_Ҳb�꯳�V��X+�c~���6O@9������D��a�So��[]k��f�Z���<��os�
�:�㙤�<X_�T��ԯk�=~�PC���o���٫��������~=]��&s�����Ƙ嘰?�����8���n��䞓��?����:��ů#� ���$�Q����76�����o�b�+�;5�u�|��}*�����:O�ݐ�_��ǯ��#|O�������(�z���z�mf�S+��CX�_�������uz�2k���R|��_O�>]W��g�c�bj0FV�q,5�ާ�K�d��C�K�-��ޞu:_�
�W��V��
��B�q^�h�I�/�q��>�����]��\ߟK��ʗϗ�}�#�߶/T��5�'��ɶ��xWi���=ԯy+��Ͷ��T��K�oY2�3�M`�y�+��t\�~~�[W9�	,��'}�>�19Y���>�ӹ���տ{����Ν�sc�Z�|��X�Y�ϓW.�<9�j㼨ώI�o���ZT�)]����47��(�X�y?�|c͂���� �|��{��f�_�
pFs�W��5����Wl6�rјB����Z\����i=��4%���5��to�ޫ0����Cus>:ֲDߍ����E���|�v�s[�-��}7�\�)u�-m�i�\��img/src/icons-big.psd000064400002163203151215013430010473 0ustar008BPS�0�j8BIMZ%GZ%G8BIM%�]�t�n�۾9���y\8BIM$o_<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        ">
   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <rdf:Description rdf:about=""
            xmlns:xmp="http://ns.adobe.com/xap/1.0/">
         <xmp:CreatorTool>Adobe Photoshop CS5 Macintosh</xmp:CreatorTool>
         <xmp:CreateDate>2010-09-19T17:17:49+04:00</xmp:CreateDate>
         <xmp:MetadataDate>2011-04-22T18:30:18+04:00</xmp:MetadataDate>
         <xmp:ModifyDate>2011-04-22T18:30:18+04:00</xmp:ModifyDate>
      </rdf:Description>
      <rdf:Description rdf:about=""
            xmlns:dc="http://purl.org/dc/elements/1.1/">
         <dc:format>application/vnd.adobe.photoshop</dc:format>
      </rdf:Description>
      <rdf:Description rdf:about=""
            xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
            xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#">
         <xmpMM:InstanceID>xmp.iid:FD7F117407206811B1BA95E37140A3C2</xmpMM:InstanceID>
         <xmpMM:DocumentID>xmp.did:01801174072068119109C4A19543BAD1</xmpMM:DocumentID>
         <xmpMM:OriginalDocumentID>xmp.did:01801174072068119109C4A19543BAD1</xmpMM:OriginalDocumentID>
         <xmpMM:History>
            <rdf:Seq>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>created</stEvt:action>
                  <stEvt:instanceID>xmp.iid:01801174072068119109C4A19543BAD1</stEvt:instanceID>
                  <stEvt:when>2010-09-19T17:17:49+04:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:02801174072068119109C4A19543BAD1</stEvt:instanceID>
                  <stEvt:when>2010-09-19T17:27:56+04:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:03801174072068119109C4A19543BAD1</stEvt:instanceID>
                  <stEvt:when>2010-09-19T17:41:22+04:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:04801174072068119109C4A19543BAD1</stEvt:instanceID>
                  <stEvt:when>2010-09-19T17:43:45+04:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:05801174072068119109C4A19543BAD1</stEvt:instanceID>
                  <stEvt:when>2010-09-19T17:45:17+04:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:06801174072068119109C4A19543BAD1</stEvt:instanceID>
                  <stEvt:when>2010-09-19T17:46:50+04:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:07801174072068119109C4A19543BAD1</stEvt:instanceID>
                  <stEvt:when>2010-09-19T17:54:48+04:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:08801174072068119109C4A19543BAD1</stEvt:instanceID>
                  <stEvt:when>2010-09-19T17:56:02+04:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:09801174072068119109C4A19543BAD1</stEvt:instanceID>
                  <stEvt:when>2010-09-19T18:04:23+04:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:0A801174072068119109C4A19543BAD1</stEvt:instanceID>
                  <stEvt:when>2010-09-19T18:04:51+04:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:963608160E2068119109C4A19543BAD1</stEvt:instanceID>
                  <stEvt:when>2010-09-19T18:05:17+04:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:973608160E2068119109C4A19543BAD1</stEvt:instanceID>
                  <stEvt:when>2010-09-19T18:09:57+04:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:983608160E2068119109C4A19543BAD1</stEvt:instanceID>
                  <stEvt:when>2010-09-19T18:12:55+04:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:993608160E2068119109C4A19543BAD1</stEvt:instanceID>
                  <stEvt:when>2010-09-19T18:15:16+04:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:9A3608160E2068119109C4A19543BAD1</stEvt:instanceID>
                  <stEvt:when>2010-09-19T18:18:59+04:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:9B3608160E2068119109C4A19543BAD1</stEvt:instanceID>
                  <stEvt:when>2010-09-19T18:19:05+04:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:9C3608160E2068119109C4A19543BAD1</stEvt:instanceID>
                  <stEvt:when>2010-09-19T18:22:08+04:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:9D3608160E2068119109C4A19543BAD1</stEvt:instanceID>
                  <stEvt:when>2010-09-19T18:24:50+04:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:9E3608160E2068119109C4A19543BAD1</stEvt:instanceID>
                  <stEvt:when>2010-09-19T18:27:36+04:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:9F3608160E2068119109C4A19543BAD1</stEvt:instanceID>
                  <stEvt:when>2010-09-19T18:31:59+04:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:A03608160E2068119109C4A19543BAD1</stEvt:instanceID>
                  <stEvt:when>2010-09-19T18:33:42+04:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:08D3AC5E122068119109C4A19543BAD1</stEvt:instanceID>
                  <stEvt:when>2010-09-19T18:35:57+04:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:09D3AC5E122068119109C4A19543BAD1</stEvt:instanceID>
                  <stEvt:when>2010-09-19T18:36:56+04:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:0AD3AC5E122068119109C4A19543BAD1</stEvt:instanceID>
                  <stEvt:when>2010-09-19T18:39:46+04:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:0BD3AC5E122068119109C4A19543BAD1</stEvt:instanceID>
                  <stEvt:when>2010-09-19T18:49:04+04:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:0CD3AC5E122068119109C4A19543BAD1</stEvt:instanceID>
                  <stEvt:when>2010-09-19T18:50:02+04:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:0180117407206811A3A3FC4A228C975D</stEvt:instanceID>
                  <stEvt:when>2011-02-04T14:32:54+03:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:0280117407206811A3A3FC4A228C975D</stEvt:instanceID>
                  <stEvt:when>2011-02-04T14:49:22+03:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:0380117407206811A3A3FC4A228C975D</stEvt:instanceID>
                  <stEvt:when>2011-02-04T14:50:09+03:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:C8C4172C0E206811A3A3FC4A228C975D</stEvt:instanceID>
                  <stEvt:when>2011-02-04T15:35:46+03:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:FA7F117407206811B1BA95E37140A3C2</stEvt:instanceID>
                  <stEvt:when>2011-04-22T18:20:12+04:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:FC7F117407206811B1BA95E37140A3C2</stEvt:instanceID>
                  <stEvt:when>2011-04-22T18:28:45+04:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:FD7F117407206811B1BA95E37140A3C2</stEvt:instanceID>
                  <stEvt:when>2011-04-22T18:30:18+04:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
            </rdf:Seq>
         </xmpMM:History>
      </rdf:Description>
      <rdf:Description rdf:about=""
            xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/">
         <photoshop:ColorMode>3</photoshop:ColorMode>
         <photoshop:ICCProfile>sRGB IEC61966-2.1</photoshop:ICCProfile>
         <photoshop:TextLayers>
            <rdf:Bag>
               <rdf:li rdf:parseType="Resource">
                  <photoshop:LayerName>php</photoshop:LayerName>
                  <photoshop:LayerText>php</photoshop:LayerText>
               </rdf:li>
            </rdf:Bag>
         </photoshop:TextLayers>
         <photoshop:DocumentAncestors>
            <rdf:Bag>
               <rdf:li>xmp.did:F77F117407206811B1BA95E37140A3C2</rdf:li>
            </rdf:Bag>
         </photoshop:DocumentAncestors>
      </rdf:Description>
   </rdf:RDF>
</x:xmpmeta>
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                            
<?xpacket end="w"?>8BIM:�printOutputClrSenumClrSRGBCInteenumInteClrmMpBlboolprintSixteenBitboolprinterNameTEXT8BIM;�printOutputOptionsCptnboolClbrboolRgsMboolCrnCboolCntCboolLblsboolNgtvboolEmlDboolIntrboolBckgObjcRGBCRd  doub@o�Grn doub@o�Bl  doub@o�BrdTUntF#RltBld UntF#RltRsltUntF#Pxl@R
vectorDataboolPgPsenumPgPsPgPCLeftUntF#RltTop UntF#RltScl UntF#Prc@Y8BIM�HH8BIM&?�8BIM�
Transparency8BIM
Transparency8BIM���d8BIM5��d8BIM8BIM
x8BIM8BIM�	8BIM'
8BIM�H/fflff/ff���2Z5-8BIM�p��������������������������������������������������������������������������������������������8BIM8BIM>8BIM08BIM-,8BIM�@@U����PH%�+�28:>�D�KQ@W�]�c�jFp�v�}�M������8BIM6�nullVrsnlongenabbool	numBeforelongnumAfterlongSpcnlong
minOpacitylong
maxOpacitylong2BlnMlong8BIM3null
Vrsnlong	frameStepObjcnull	numeratorlongdenominatorlongX	frameRatedoub@>timeObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongpdenominatorlongX
workInTimeObjcnull	numeratorlongdenominatorlongXworkOutTimeObjcnull	numeratorlongpdenominatorlongXLCntlongglobalTrackListVlLs	hasMotionbool8BIM4FnullVrsnlongsheetTimelineOptionsVlLs8BIM8BIM�nullbaseNameTEXTUserboundsObjcRct1Top longLeftlongBtomlong�Rghtlong0slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenumESliceOrigin
autoGeneratedTypeenum
ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlong�Rghtlong0urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT	horzAlignenumESliceHorzAligndefault	vertAlignenumESliceVertAligndefaultbgColorTypeenumESliceBGColorTypeNone	topOutsetlong
leftOutsetlongbottomOutsetlongrightOutsetlong8BIM(?�8BIMHHLinomntrRGB XYZ �	1acspMSFTIEC sRGB���-HP  cprtP3desc�lwtpt�bkptrXYZgXYZ,bXYZ@dmndTpdmdd��vuedL�view�$lumi�meas$tech0rTRC<gTRC<bTRC<textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ �Q�XYZ XYZ o�8��XYZ b����XYZ $����descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view��_.���\�XYZ L	VPW�meas�sig CRT curv
#(-27;@EJOTY^chmrw|�������������������������
%+28>ELRY`gnu|����������������&/8AKT]gqz������������!-8COZfr~���������� -;HUcq~���������
+:IXgw��������'7HYj{�������+=Oat�������2FZn�������		%	:	O	d	y	�	�	�	�	�	�

'
=
T
j
�
�
�
�
�
�"9Qi������*C\u�����


&
@
Z
t
�
�
�
�
�.Id����	%A^z����	&Ca~����1Om����&Ed����#Cc����'Ij����4Vx���&Il����Ae����@e���� Ek���*Qw���;c���*R{���Gp���@j���>i���  A l � � �!!H!u!�!�!�"'"U"�"�"�#
#8#f#�#�#�$$M$|$�$�%	%8%h%�%�%�&'&W&�&�&�''I'z'�'�(
(?(q(�(�))8)k)�)�**5*h*�*�++6+i+�+�,,9,n,�,�--A-v-�-�..L.�.�.�/$/Z/�/�/�050l0�0�11J1�1�1�2*2c2�2�3
3F33�3�4+4e4�4�55M5�5�5�676r6�6�7$7`7�7�88P8�8�99B99�9�:6:t:�:�;-;k;�;�<'<e<�<�="=a=�=�> >`>�>�?!?a?�?�@#@d@�@�A)AjA�A�B0BrB�B�C:C}C�DDGD�D�EEUE�E�F"FgF�F�G5G{G�HHKH�H�IIcI�I�J7J}J�KKSK�K�L*LrL�MMJM�M�N%NnN�OOIO�O�P'PqP�QQPQ�Q�R1R|R�SS_S�S�TBT�T�U(UuU�VV\V�V�WDW�W�X/X}X�YYiY�ZZVZ�Z�[E[�[�\5\�\�]']x]�^^l^�__a_�``W`�`�aOa�a�bIb�b�cCc�c�d@d�d�e=e�e�f=f�f�g=g�g�h?h�h�iCi�i�jHj�j�kOk�k�lWl�mm`m�nnkn�ooxo�p+p�p�q:q�q�rKr�ss]s�ttpt�u(u�u�v>v�v�wVw�xxnx�y*y�y�zFz�{{c{�|!|�|�}A}�~~b~�#��G���
�k�͂0����W�������G����r�ׇ;����i�Ή3�����d�ʋ0�����c�ʍ1�����f�Ώ6����n�֑?����z��M��� ����_�ɖ4���
�u��L���$�����h�՛B��������d�Ҟ@��������i�ءG���&����v��V�ǥ8��������n��R�ĩ7�������u��\�ЭD���-�������u��`�ֲK�³8���%�������y��h��Y�ѹJ�º;���.���!������
�����z���p��g���_���X���Q���K���F���Aǿ�=ȼ�:ɹ�8ʷ�6˶�5̵�5͵�6ζ�7ϸ�9к�<Ѿ�?��D���I���N���U���\���d���l���v�ۀ�܊�ݖ�ޢ�)߯�6��D���S���c���s���
����2��F���[���p�����(��@���X���r�����4��P��m��������8��W��w����)���K��m��8BIM,8BIMY�
=���Adobe_CM��Adobed����			



���"����?	
	
3!1AQa"q�2���B#$R�b34r��C%�S���cs5���&D�TdE£t6�U�e���u��F'������������Vfv�������7GWgw�������5!1AQaq"2����B#�R��3$b�r��CScs4�%���&5��D�T�dEU6te����u��F������������Vfv�������'7GWgw������?�E����W�N�S@}�Fͻ���$���Ҷ>чv�9�ն7M�f��nĕ�o]���?w��~-7[�������mu�@�8��څF���;M��Sg��o�����"J��0>�n��z�����ݸ��������o?����Cm�}�����W�w��?M�~g�T�/C/��7��v�Ws7�;�����{6o��II�_�����g���˙�~��=}2vS�G����n�?�^��k�i(7"��>g��3u>ٝ�mv�S�s}?��D��m?��M����8���a������F.f�>��P���F����t��=O��4��)��f?�@w������/������?��$���~����E=Ky�}^����A�cV�G���;�o�/O�2J���zE�f���h�~���k��}�o�������$�����?����^�g�j���v��ĸ3�o��~w���I;�zDz�����{�}I���v�����ǩ�vRS_�O�b�u�ؿ���?k�L��?����g�~�����7�����RA�K��_�Tm�O}�����/��Є���2|����j��8~l/�7���}G��w�ϫ������N}?�z����/K��7�������x>��,���Vm�Of���_��jU�G���_7��|���{��8��'�������x9�l�w�5���_�{��뾇��Id��7d�Q�Ȋr��o��e���z����1��/~�v��:n�!�x�
��o��8BIM!UAdobe PhotoshopAdobe Photoshop CS58BIM".MM*bj(1r2��i��
��'
��'Adobe Photoshop CS5 Macintosh2011:04:22 18:30:18��0��&(.HH8BIM��mopt������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������4TargetSettingsMttCObjc
NativeQuadBl  long�Grn long�Rd  long�Trnsbool
fileFormatenum
FileFormatPNG24
interlacedboolnoMatteColorbooltransparencyDitherAlgorithmenumDitherAlgorithmNonetransparencyDitherAmountlong8BIM��msetnullHTMLBackgroundSettingsObjcnullBackgroundColorBluelong�BackgroundColorGreenlong�BackgroundColorRedlong�BackgroundColorStatelongBackgroundImagePathTEXTUseImageAsBackgroundboolHTMLSettingsObjcnullAlwaysAddAltAttributebool
AttributeCaselongCloseAllTagsboolEncodinglongFileSavingSettingsObjcnull
CopyBackgroundboolDuplicateFileNameBehaviorlongHtmlFileNameComponentsVlLslonglonglonglonglonglongImageSubfolderNameTEXTimagesNameCompatibilityObjcnull
NameCompatMacboolNameCompatUNIXboolNameCompatWindowsboolOutputMultipleFilesboolSavingFileNameComponentsVlLs	longlonglonglonglonglonglonglonglongSliceFileNameComponentsVlLslonglonglonglonglonglongUseImageSubfolderboolUseLongExtensionsboolGoLiveCompatibleboolImageMapLocationlongImageMapTypelongIncludeCommentsboolIncludeZeroMarginsboolIndentlong����LineEndingslongOutputXHTMLboolQuoteAllAttributesboolSpacersEmptyCellslongSpacersHorizontallongSpacersVerticallongStylesFormatlong
TDWidthHeightlongTagCaselongUseCSSboolUseLongHTMLExtensionboolMetadataOutputSettingsObjcnullAddCustomIRboolAddEXIFboolAddXMPboolAddXMPSourceFileURIboolColorPolicylongMetadataPolicylongWriteMinimalXMPboolWriteXMPToSidecarFilesboolVersionlong8BIM�ms4w8BIM�maniIRFR�8BIMAnDs�nullAFStlongFrInVlLsObjcnullFrIDlonggN�FrDllong�FStsVlLsObjcnullFsIDlongAFrmlongFsFrVlLslonggN�LCntlong8BIMRoll8BIM�mfrix���0,�����b8BIMnorm�
�(��������������������unknown8BIMluniunknown8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�lc�M�r8BIMPlLdxplcL$63b0519e-047e-1173-a2a2-eaea0594271a�?�@F?�@F@H��@H�warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@H8BIMSoLdsoLDnullIdntTEXT%63b0519e-047e-1173-a2a2-eaea0594271aplacedTEXT%d5f75db0-ad79-1173-b145-c2ce92730991PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoub�doub?�doub@Fdoub?�doub@Fdoub@H�doub�doub@H�nonAffineTransformVlLsdoub�doub?�doub@Fdoub?�doub@Fdoub@H�doub�doub@H�warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@HSz  ObjcPnt Wdthdoub@HHghtdoub@HRsltUntF#Rsl@R��8BIMfxrp�?�C0������8BIMnorm�<(��������������������Layer 58BIMluniLayer 58BIMlnsrlayr8BIMlyid,8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�ld8.[>8BIMfxrp?��":]+��J���8BIMnorm�
�(��������������������
folder_closed8BIMluni 
folder_closed8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�lc�NH�8BIMPlLdxplcL$6ef1e0ad-047e-1173-a2a2-eaea0594271a@@F�@I@F�@I@W@@@W@warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@H8BIMSoLdsoLDnullIdntTEXT%6ef1e0ad-047e-1173-a2a2-eaea0594271aplacedTEXT%d5f75db3-ad79-1173-b145-c2ce92730991PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoub@doub@F�doub@Idoub@F�doub@Idoub@W@doub@doub@W@nonAffineTransformVlLsdoub@doub@F�doub@Idoub@F�doub@Idoub@W@doub@doub@W@warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@HSz  ObjcPnt Wdthdoub@HHghtdoub@HRsltUntF#Rsl@R��8BIMfxrp@@F�M}/���n��8BIMnorm�
�(��������������������tar_gz8BIMlunitar_gz8BIMlnsrrend8BIMlyid!8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�lc�Nm@8BIMPlLdxplcL$60c01c09-0488-1173-a2a2-eaea0594271a��@�4@G�@�4@G�@����@��warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@H8BIMSoLdsoLDnullIdntTEXT%60c01c09-0488-1173-a2a2-eaea0594271aplacedTEXT%d5f75db6-ad79-1173-b145-c2ce92730991PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoub��doub@�4doub@G�doub@�4doub@G�doub@��doub��doub@��nonAffineTransformVlLsdoub��doub@�4doub@G�doub@�4doub@G�doub@��doub��doub@��warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@HSz  ObjcPnt Wdthdoub@HHghtdoub@HRsltUntF#Rsl@R��8BIMfxrp��@�4�/���q��8BIMnorm�
�(��������������������tar_bz8BIMlunitar_bz8BIMlnsrrend8BIMlyid"8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�lc�N��8BIMPlLdxplcL$619aeb1b-0488-1173-a2a2-eaea0594271a��@��@G�@��@G�@����@��warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@H8BIMSoLdsoLDnullIdntTEXT%619aeb1b-0488-1173-a2a2-eaea0594271aplacedTEXT%faa87fc0-ad79-1173-b145-c2ce92730991PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoub��doub@��doub@G�doub@��doub@G�doub@��doub��doub@��nonAffineTransformVlLsdoub��doub@��doub@G�doub@��doub@G�doub@��doub��doub@��warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@HSz  ObjcPnt Wdthdoub@HHghtdoub@HRsltUntF#Rsl@R��8BIMfxrp��@����/���Hm\8BIMnorm�
�(��������������������rar8BIMlunirar8BIMlnsrrend8BIMlyid#8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�lc�N�o8BIMPlLdxplcL$6a10139e-0488-1173-a2a2-eaea0594271a�陙����@��33333@G������@��33333@G������@��33333�陙����@��33333warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@H8BIMSoLdsoLDnullIdntTEXT%6a10139e-0488-1173-a2a2-eaea0594271aplacedTEXT%faa87fc3-ad79-1173-b145-c2ce92730991PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoub�陙����doub@��33333doub@G������doub@��33333doub@G������doub@��33333doub�陙����doub@��33333nonAffineTransformVlLsdoub�陙����doub@��33333doub@G������doub@��33333doub@G������doub@��33333doub�陙����doub@��33333warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@HSz  ObjcPnt Wdthdoub@HHghtdoub@HRsltUntF#Rsl@R��8BIMfxrp�陙����@��33333���/���A8BIMnorm�
�(��������������������swf8BIMluniswf8BIMlnsrrend8BIMlyid$8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�lc�N��8BIMPlLdxplcL$53a52047-0489-1173-a2a2-eaea0594271a��@��@G�@��@G�@�L��@�Lwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@H8BIMSoLdsoLDnullIdntTEXT%53a52047-0489-1173-a2a2-eaea0594271aplacedTEXT%faa87fc6-ad79-1173-b145-c2ce92730991PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoub��doub@��doub@G�doub@��doub@G�doub@�Ldoub��doub@�LnonAffineTransformVlLsdoub��doub@��doub@G�doub@��doub@G�doub@�Ldoub��doub@�LwarpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@HSz  ObjcPnt Wdthdoub@HHghtdoub@HRsltUntF#Rsl@R��8BIMfxrp��@��U�0��gps8BIMnorm�<(��������������������Layer 48BIMluniLayer 48BIMlnsrlayr8BIMlyid&8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�lc���8BIMfxrp@X@��/����8BIMnorm�
�(��������������������application8BIMluniapplication8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�lc�OHM8BIMPlLdxplcL$20883df8-0480-1173-a2a2-eaea0594271a��@b�@G�@b�@G�@h���@h�warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@H8BIMSoLdsoLDnullIdntTEXT%20883df8-0480-1173-a2a2-eaea0594271aplacedTEXT%faaa2896-ad79-1173-b145-c2ce92730991PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoub��doub@b�doub@G�doub@b�doub@G�doub@h�doub��doub@h�nonAffineTransformVlLsdoub��doub@b�doub@G�doub@b�doub@G�doub@h�doub��doub@h�warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@HSz  ObjcPnt Wdthdoub@HHghtdoub@HRsltUntF#Rsl@R��8BIMfxrp��@b�-].������8BIMnorm�
�(��������������������audio8BIMluniaudio8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�lc�On�8BIMPlLdxplcL$928d337a-0482-1173-a2a2-eaea0594271a�@r�@G@r�@G@u��@u�warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@H8BIMSoLdsoLDnullIdntTEXT%928d337a-0482-1173-a2a2-eaea0594271aplacedTEXT%faaa2899-ad79-1173-b145-c2ce92730991PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoub�doub@r�doub@Gdoub@r�doub@Gdoub@u�doub�doub@u�nonAffineTransformVlLsdoub�doub@r�doub@Gdoub@r�doub@Gdoub@u�doub�doub@u�warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@HSz  ObjcPnt Wdthdoub@HHghtdoub@HRsltUntF#Rsl@R��8BIMfxrp�@r�_�0���dv^8BIMnorm�
�(��������������������video8BIMlunivideo8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�lc�O�8BIMPlLdxplcL$a01c1b80-0482-1173-a2a2-eaea0594271a@u�@H@u�@H@x�@x�warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@H8BIMSoLdsoLDnullIdntTEXT%a01c1b80-0482-1173-a2a2-eaea0594271aplacedTEXT%faaa289c-ad79-1173-b145-c2ce92730991PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoubdoub@u�doub@Hdoub@u�doub@Hdoub@x�doubdoub@x�nonAffineTransformVlLsdoubdoub@u�doub@Hdoub@u�doub@Hdoub@x�doubdoub@x�warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@HSz  ObjcPnt Wdthdoub@HHghtdoub@HRsltUntF#Rsl@R��8BIMfxrp@u���0���t�[8BIMnorm�
�(��������������������txt8BIMlunitxt8BIMlnsrrend8BIMlyid	8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�lc�O�38BIMPlLdxplcL$00ebdf9f-0482-1173-a2a2-eaea0594271a@i @H@i @H@o @o warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@H8BIMSoLdsoLDnullIdntTEXT%00ebdf9f-0482-1173-a2a2-eaea0594271aplacedTEXT%faaa289f-ad79-1173-b145-c2ce92730991PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoubdoub@i doub@Hdoub@i doub@Hdoub@o doubdoub@o nonAffineTransformVlLsdoubdoub@i doub@Hdoub@i doub@Hdoub@o doubdoub@o warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@HSz  ObjcPnt Wdthdoub@HHghtdoub@HRsltUntF#Rsl@R��8BIMfxrp@i ��0���Qy8BIMnorm�
�(��������������������rtf8BIMlunirtf8BIMlnsrrend8BIMlyid
8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�lc�P}8BIMPlLdxplcL$c782a35c-0482-1173-a2a2-eaea0594271a@y@H@y@H@|@|warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@H8BIMSoLdsoLDnullIdntTEXT%c782a35c-0482-1173-a2a2-eaea0594271aplacedTEXT%faabed85-ad79-1173-b145-c2ce92730991PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoubdoub@ydoub@Hdoub@ydoub@Hdoub@|doubdoub@|nonAffineTransformVlLsdoubdoub@ydoub@Hdoub@ydoub@Hdoub@|doubdoub@|warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@HSz  ObjcPnt Wdthdoub@HHghtdoub@HRsltUntF#Rsl@R��8BIMfxrp@y��0���@�V8BIMnorm�
�(��������������������pdf8BIMlunipdf8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�lc�P;~8BIMPlLdxplcL$dfc1d08c-0483-1173-a2a2-eaea0594271a@|0@H@|0@H@0@0warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@H8BIMSoLdsoLDnullIdntTEXT%dfc1d08c-0483-1173-a2a2-eaea0594271aplacedTEXT%faabed88-ad79-1173-b145-c2ce92730991PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoubdoub@|0doub@Hdoub@|0doub@Hdoub@0doubdoub@0nonAffineTransformVlLsdoubdoub@|0doub@Hdoub@|0doub@Hdoub@0doubdoub@0warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@HSz  ObjcPnt Wdthdoub@HHghtdoub@HRsltUntF#Rsl@R��8BIMfxrp@|0�%-�����8BIMnorm�
�(��������������������office8BIMlunioffice8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�lc�Pqi8BIMPlLdxplcL$fbf50e48-0483-1173-a2a2-eaea0594271a�@`@F�@`@F�@�0�@�0warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@H8BIMSoLdsoLDnullIdntTEXT%fbf50e48-0483-1173-a2a2-eaea0594271aplacedTEXT%faabed8b-ad79-1173-b145-c2ce92730991PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoub�doub@`doub@F�doub@`doub@F�doub@�0doub�doub@�0nonAffineTransformVlLsdoub�doub@`doub@F�doub@`doub@F�doub@�0doub�doub@�0warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@HSz  ObjcPnt Wdthdoub@HHghtdoub@HRsltUntF#Rsl@R��8BIMfxrp�@`'����V/���y�>8BIMnorm�
�(��������������������html8BIMlunihtml8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�lc�P��8BIMPlLdxplcL$09ed4b52-0484-1173-a2a2-eaea0594271a��@�8@G�@�8@G�@����@��warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@H8BIMSoLdsoLDnullIdntTEXT%09ed4b52-0484-1173-a2a2-eaea0594271aplacedTEXT%faabed8e-ad79-1173-b145-c2ce92730991PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoub��doub@�8doub@G�doub@�8doub@G�doub@��doub��doub@��nonAffineTransformVlLsdoub��doub@�8doub@G�doub@�8doub@G�doub@��doub��doub@��warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@HSz  ObjcPnt Wdthdoub@HHghtdoub@HRsltUntF#Rsl@R��8BIMfxrp��@�8Y�/�����8BIMnorm�
�(��������������������css8BIMlunicss8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�lc�P�}8BIMPlLdxplcL$39292081-0485-1173-a2a2-eaea0594271a��@��@G�@��@G�@�H��@�Hwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@H8BIMSoLdsoLDnullIdntTEXT%39292081-0485-1173-a2a2-eaea0594271aplacedTEXT%faadcbec-ad79-1173-b145-c2ce92730991PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoub��doub@��doub@G�doub@��doub@G�doub@�Hdoub��doub@�HnonAffineTransformVlLsdoub��doub@��doub@G�doub@��doub@G�doub@�Hdoub��doub@�HwarpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@HSz  ObjcPnt Wdthdoub@HHghtdoub@HRsltUntF#Rsl@R��8BIMfxrp��@����/������8BIMnorm�
�(��������������������pl8BIMlunipl8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�lc�P��8BIMPlLdxplcL$7d242227-0485-1173-a2a2-eaea0594271a��@��@G�@��@G�@�h��@�hwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@H8BIMSoLdsoLDnullIdntTEXT%7d242227-0485-1173-a2a2-eaea0594271aplacedTEXT%faadcbef-ad79-1173-b145-c2ce92730991PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoub��doub@��doub@G�doub@��doub@G�doub@�hdoub��doub@�hnonAffineTransformVlLsdoub��doub@��doub@G�doub@��doub@G�doub@�hdoub��doub@�hwarpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@HSz  ObjcPnt Wdthdoub@HHghtdoub@HRsltUntF#Rsl@R��8BIMfxrp��@���/����	�8BIMnorm�
�(��������������������py8BIMlunipy8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�lc�Q/8BIMPlLdxplcL$e25c83d8-0485-1173-a2a2-eaea0594271a��@�x@G�@�x@G�@����@��warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@H8BIMSoLdsoLDnullIdntTEXT%e25c83d8-0485-1173-a2a2-eaea0594271aplacedTEXT%faadcbf2-ad79-1173-b145-c2ce92730991PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoub��doub@�xdoub@G�doub@�xdoub@G�doub@��doub��doub@��nonAffineTransformVlLsdoub��doub@�xdoub@G�doub@�xdoub@G�doub@��doub��doub@��warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@HSz  ObjcPnt Wdthdoub@HHghtdoub@HRsltUntF#Rsl@R��8BIMfxrp��@�x!P/�����8BIMnorm�
�(��������������������rb8BIMlunirb8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�lc�QX\8BIMPlLdxplcL$f3bba182-0485-1173-a2a2-eaea0594271a��@�@G�@�@G�@����@��warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@H8BIMSoLdsoLDnullIdntTEXT%f3bba182-0485-1173-a2a2-eaea0594271aplacedTEXT%faaf1392-ad79-1173-b145-c2ce92730991PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoub��doub@�doub@G�doub@�doub@G�doub@��doub��doub@��nonAffineTransformVlLsdoub��doub@�doub@G�doub@�doub@G�doub@��doub��doub@��warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@HSz  ObjcPnt Wdthdoub@HHghtdoub@HRsltUntF#Rsl@R��8BIMfxrp��@�S�/�����8BIMnorm�
�(��������������������sh8BIMlunish8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�lc�Q�8BIMPlLdxplcL$bc26a07a-0486-1173-a2a2-eaea0594271a��@��@G�@��@G�@���@�warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@H8BIMSoLdsoLDnullIdntTEXT%bc26a07a-0486-1173-a2a2-eaea0594271aplacedTEXT%faaf1395-ad79-1173-b145-c2ce92730991PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoub��doub@��doub@G�doub@��doub@G�doub@�doub��doub@�nonAffineTransformVlLsdoub��doub@��doub@G�doub@��doub@G�doub@�doub��doub@�warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@HSz  ObjcPnt Wdthdoub@HHghtdoub@HRsltUntF#Rsl@R��8BIMfxrp��@����/�����8BIMnorm�
�(��������������������c++8BIMlunic++8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�lc�Q�q8BIMPlLdxplcL$bdafd78e-0486-1173-a2a2-eaea0594271a��@�(@G�@�(@G�@����@��warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@H8BIMSoLdsoLDnullIdntTEXT%bdafd78e-0486-1173-a2a2-eaea0594271aplacedTEXT%faaf1398-ad79-1173-b145-c2ce92730991PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoub��doub@�(doub@G�doub@�(doub@G�doub@��doub��doub@��nonAffineTransformVlLsdoub��doub@�(doub@G�doub@�(doub@G�doub@��doub��doub@��warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@HSz  ObjcPnt Wdthdoub@HHghtdoub@HRsltUntF#Rsl@R��8BIMfxrp��@�(��/������8BIMnorm�
�(��������������������pl8BIMlunipl8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�lc�Qٙ8BIMPlLdxplcL$ebc7ebeb-0486-1173-a2a2-eaea0594271a��@��@G�@��@G�@�8��@�8warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@H8BIMSoLdsoLDnullIdntTEXT%ebc7ebeb-0486-1173-a2a2-eaea0594271aplacedTEXT%faaf139b-ad79-1173-b145-c2ce92730991PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoub��doub@��doub@G�doub@��doub@G�doub@�8doub��doub@�8nonAffineTransformVlLsdoub��doub@��doub@G�doub@��doub@G�doub@�8doub��doub@�8warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@HSz  ObjcPnt Wdthdoub@HHghtdoub@HRsltUntF#Rsl@R��8BIMfxrp��@������////8BIMnorm�<(��������������������Layer 18BIMluniLayer 18BIMlnsrlayr8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�lc�R�8BIMfxrp�$�(����////8BIMnorm�<(��������������������Layer 28BIMluniLayer 28BIMlnsrlayr8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�lc�R:�8BIMfxrp��*�����&&&8BIMnorm�%d(��������������������php8BIMTySh$(?�?�@@�2TxLrTxt TEXTphptextGriddingenumtextGriddingNoneOrntenumOrntHrznAntAenumAnntantiAliasSharp	TextIndexlong
EngineDatatdta"\

<<
	/EngineDict
	<<
		/Editor
		<<
			/Text (��php
)
		>>
		/ParagraphRun
		<<
			/DefaultRunData
			<<
				/ParagraphSheet
				<<
					/DefaultStyleSheet 0
					/Properties
					<<
					>>
				>>
				/Adjustments
				<<
					/Axis [ 1.0 0.0 1.0 ]
					/XY [ 0.0 0.0 ]
				>>
			>>
			/RunArray [
			<<
				/ParagraphSheet
				<<
					/DefaultStyleSheet 0
					/Properties
					<<
						/Justification 0
						/FirstLineIndent 0.0
						/StartIndent 0.0
						/EndIndent 0.0
						/SpaceBefore 0.0
						/SpaceAfter 0.0
						/AutoHyphenate true
						/HyphenatedWordSize 6
						/PreHyphen 2
						/PostHyphen 2
						/ConsecutiveHyphens 8
						/Zone 36.0
						/WordSpacing [ .8 1.0 1.33 ]
						/LetterSpacing [ 0.0 0.0 0.0 ]
						/GlyphSpacing [ 1.0 1.0 1.0 ]
						/AutoLeading 1.2
						/LeadingType 0
						/Hanging false
						/Burasagari false
						/KinsokuOrder 0
						/EveryLineComposer false
					>>
				>>
				/Adjustments
				<<
					/Axis [ 1.0 0.0 1.0 ]
					/XY [ 0.0 0.0 ]
				>>
			>>
			]
			/RunLengthArray [ 4 ]
			/IsJoinable 1
		>>
		/StyleRun
		<<
			/DefaultRunData
			<<
				/StyleSheet
				<<
					/StyleSheetData
					<<
					>>
				>>
			>>
			/RunArray [
			<<
				/StyleSheet
				<<
					/StyleSheetData
					<<
						/Font 0
						/FontSize 10.0
						/FauxBold false
						/FauxItalic false
						/AutoLeading true
						/Leading .01
						/HorizontalScale 1.0
						/VerticalScale 1.0
						/Tracking -10
						/AutoKerning true
						/Kerning 0
						/BaselineShift 0.0
						/FontCaps 0
						/FontBaseline 0
						/Underline false
						/Strikethrough false
						/Ligatures true
						/DLigatures false
						/BaselineDirection 1
						/Tsume 0.0
						/StyleRunAlignment 2
						/Language 0
						/NoBreak false
						/FillColor
						<<
							/Type 1
							/Values [ 1.0 1.0 1.0 1.0 ]
						>>
						/StrokeColor
						<<
							/Type 1
							/Values [ 1.0 0.0 0.0 0.0 ]
						>>
						/FillFlag true
						/StrokeFlag false
						/FillFirst false
						/YUnderline 1
						/OutlineWidth .4
						/CharacterDirection 0
						/HindiNumbers false
						/Kashida 1
						/DiacriticPos 2
					>>
				>>
			>>
			]
			/RunLengthArray [ 4 ]
			/IsJoinable 2
		>>
		/GridInfo
		<<
			/GridIsOn false
			/ShowGrid false
			/GridSize 18.0
			/GridLeading 22.0
			/GridColor
			<<
				/Type 1
				/Values [ 0.0 0.0 0.0 1.0 ]
			>>
			/GridLeadingFillColor
			<<
				/Type 1
				/Values [ 0.0 0.0 0.0 1.0 ]
			>>
			/AlignLineHeightToGridFlags false
		>>
		/AntiAlias 4
		/UseFractionalGlyphWidths true
		/Rendered
		<<
			/Version 1
			/Shapes
			<<
				/WritingDirection 0
				/Children [
				<<
					/ShapeType 0
					/Procession 0
					/Lines
					<<
						/WritingDirection 0
						/Children [ ]
					>>
					/Cookie
					<<
						/Photoshop
						<<
							/ShapeType 0
							/PointBase [ 0.0 0.0 ]
							/Base
							<<
								/ShapeType 0
								/TransformPoint0 [ 1.0 0.0 ]
								/TransformPoint1 [ 0.0 1.0 ]
								/TransformPoint2 [ 0.0 0.0 ]
							>>
						>>
					>>
				>>
				]
			>>
		>>
	>>
	/ResourceDict
	<<
		/KinsokuSet [
		<<
			/Name (��PhotoshopKinsokuHard)
			/NoStart (��00��0�����0�   �	0�=�]0	00
000�0�0�0�00A0C0E0G0I0c0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�?!\)]},.:;!!	�� 0)
			/NoEnd (��  �0�;�[00
000\([{���� �0�)
			/Keep (��  %)
			/Hanging (��00.,)
		>>
		<<
			/Name (��PhotoshopKinsokuSoft)
			/NoStart (��00��0�����  �	0�=�]0	00
000�0�0�0�0)
			/NoEnd (��  �0�;�[00
000)
			/Keep (��  %)
			/Hanging (��00.,)
		>>
		]
		/MojiKumiSet [
		<<
			/InternalName (��Photoshop6MojiKumiSet1)
		>>
		<<
			/InternalName (��Photoshop6MojiKumiSet2)
		>>
		<<
			/InternalName (��Photoshop6MojiKumiSet3)
		>>
		<<
			/InternalName (��Photoshop6MojiKumiSet4)
		>>
		]
		/TheNormalStyleSheet 0
		/TheNormalParagraphSheet 0
		/ParagraphSheetSet [
		<<
			/Name (��Normal RGB)
			/DefaultStyleSheet 0
			/Properties
			<<
				/Justification 0
				/FirstLineIndent 0.0
				/StartIndent 0.0
				/EndIndent 0.0
				/SpaceBefore 0.0
				/SpaceAfter 0.0
				/AutoHyphenate true
				/HyphenatedWordSize 6
				/PreHyphen 2
				/PostHyphen 2
				/ConsecutiveHyphens 8
				/Zone 36.0
				/WordSpacing [ .8 1.0 1.33 ]
				/LetterSpacing [ 0.0 0.0 0.0 ]
				/GlyphSpacing [ 1.0 1.0 1.0 ]
				/AutoLeading 1.2
				/LeadingType 0
				/Hanging false
				/Burasagari false
				/KinsokuOrder 0
				/EveryLineComposer false
			>>
		>>
		]
		/StyleSheetSet [
		<<
			/Name (��Normal RGB)
			/StyleSheetData
			<<
				/Font 1
				/FontSize 12.0
				/FauxBold false
				/FauxItalic false
				/AutoLeading true
				/Leading 0.0
				/HorizontalScale 1.0
				/VerticalScale 1.0
				/Tracking 0
				/AutoKerning true
				/Kerning 0
				/BaselineShift 0.0
				/FontCaps 0
				/FontBaseline 0
				/Underline false
				/Strikethrough false
				/Ligatures true
				/DLigatures false
				/BaselineDirection 2
				/Tsume 0.0
				/StyleRunAlignment 2
				/Language 0
				/NoBreak false
				/FillColor
				<<
					/Type 1
					/Values [ 1.0 0.0 0.0 0.0 ]
				>>
				/StrokeColor
				<<
					/Type 1
					/Values [ 1.0 0.0 0.0 0.0 ]
				>>
				/FillFlag true
				/StrokeFlag false
				/FillFirst true
				/YUnderline 1
				/OutlineWidth 1.0
				/CharacterDirection 0
				/HindiNumbers false
				/Kashida 1
				/DiacriticPos 2
			>>
		>>
		]
		/FontSet [
		<<
			/Name (��ArialMT)
			/Script 0
			/FontType 1
			/Synthetic 0
		>>
		<<
			/Name (��MyriadPro-Regular)
			/Script 0
			/FontType 0
			/Synthetic 0
		>>
		<<
			/Name (��AdobeInvisFont)
			/Script 0
			/FontType 0
			/Synthetic 0
		>>
		]
		/SuperscriptSize .583
		/SuperscriptPosition .333
		/SubscriptSize .583
		/SubscriptPosition .333
		/SmallCapSize .7
	>>
	/DocumentResources
	<<
		/KinsokuSet [
		<<
			/Name (��PhotoshopKinsokuHard)
			/NoStart (��00��0�����0�   �	0�=�]0	00
000�0�0�0�00A0C0E0G0I0c0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�?!\)]},.:;!!	�� 0)
			/NoEnd (��  �0�;�[00
000\([{���� �0�)
			/Keep (��  %)
			/Hanging (��00.,)
		>>
		<<
			/Name (��PhotoshopKinsokuSoft)
			/NoStart (��00��0�����  �	0�=�]0	00
000�0�0�0�0)
			/NoEnd (��  �0�;�[00
000)
			/Keep (��  %)
			/Hanging (��00.,)
		>>
		]
		/MojiKumiSet [
		<<
			/InternalName (��Photoshop6MojiKumiSet1)
		>>
		<<
			/InternalName (��Photoshop6MojiKumiSet2)
		>>
		<<
			/InternalName (��Photoshop6MojiKumiSet3)
		>>
		<<
			/InternalName (��Photoshop6MojiKumiSet4)
		>>
		]
		/TheNormalStyleSheet 0
		/TheNormalParagraphSheet 0
		/ParagraphSheetSet [
		<<
			/Name (��Normal RGB)
			/DefaultStyleSheet 0
			/Properties
			<<
				/Justification 0
				/FirstLineIndent 0.0
				/StartIndent 0.0
				/EndIndent 0.0
				/SpaceBefore 0.0
				/SpaceAfter 0.0
				/AutoHyphenate true
				/HyphenatedWordSize 6
				/PreHyphen 2
				/PostHyphen 2
				/ConsecutiveHyphens 8
				/Zone 36.0
				/WordSpacing [ .8 1.0 1.33 ]
				/LetterSpacing [ 0.0 0.0 0.0 ]
				/GlyphSpacing [ 1.0 1.0 1.0 ]
				/AutoLeading 1.2
				/LeadingType 0
				/Hanging false
				/Burasagari false
				/KinsokuOrder 0
				/EveryLineComposer false
			>>
		>>
		]
		/StyleSheetSet [
		<<
			/Name (��Normal RGB)
			/StyleSheetData
			<<
				/Font 1
				/FontSize 12.0
				/FauxBold false
				/FauxItalic false
				/AutoLeading true
				/Leading 0.0
				/HorizontalScale 1.0
				/VerticalScale 1.0
				/Tracking 0
				/AutoKerning true
				/Kerning 0
				/BaselineShift 0.0
				/FontCaps 0
				/FontBaseline 0
				/Underline false
				/Strikethrough false
				/Ligatures true
				/DLigatures false
				/BaselineDirection 2
				/Tsume 0.0
				/StyleRunAlignment 2
				/Language 0
				/NoBreak false
				/FillColor
				<<
					/Type 1
					/Values [ 1.0 0.0 0.0 0.0 ]
				>>
				/StrokeColor
				<<
					/Type 1
					/Values [ 1.0 0.0 0.0 0.0 ]
				>>
				/FillFlag true
				/StrokeFlag false
				/FillFirst true
				/YUnderline 1
				/OutlineWidth 1.0
				/CharacterDirection 0
				/HindiNumbers false
				/Kashida 1
				/DiacriticPos 2
			>>
		>>
		]
		/FontSet [
		<<
			/Name (��ArialMT)
			/Script 0
			/FontType 1
			/Synthetic 0
		>>
		<<
			/Name (��MyriadPro-Regular)
			/Script 0
			/FontType 0
			/Synthetic 0
		>>
		<<
			/Name (��AdobeInvisFont)
			/Script 0
			/FontType 0
			/Synthetic 0
		>>
		]
		/SuperscriptSize .583
		/SuperscriptPosition .333
		/SubscriptSize .583
		/SubscriptPosition .333
		/SmallCapSize .7
	>>
>>warp	warpStyleenum	warpStylewarpNone	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrzn8BIMluniphp8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�lc�Z�8BIMfxrp@�/�����8BIMnorm�
�(��������������������xml8BIMlunixml8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�lc�Z*�8BIMPlLdxplcL$10ef980d-0488-1173-a2a2-eaea0594271a��@�H@G�@�H@G�@�d��@�dwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@H8BIMSoLdsoLDnullIdntTEXT%10ef980d-0488-1173-a2a2-eaea0594271aplacedTEXT%fac41c07-ad79-1173-b145-c2ce92730991PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoub��doub@�Hdoub@G�doub@�Hdoub@G�doub@�ddoub��doub@�dnonAffineTransformVlLsdoub��doub@�Hdoub@G�doub@�Hdoub@G�doub@�ddoub��doub@�dwarpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@HSz  ObjcPnt Wdthdoub@HHghtdoub@HRsltUntF#Rsl@R��8BIMfxrp��@�HK/���@fT8BIMnorm�
�(��������������������zip8BIMlunizip8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�lc�ZT�8BIMPlLdxplcL$16ba0847-0488-1173-a2a2-eaea0594271a��@�l@G�@�l@G�@�,��@�,warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@H8BIMSoLdsoLDnullIdntTEXT%16ba0847-0488-1173-a2a2-eaea0594271aplacedTEXT%fac41c0a-ad79-1173-b145-c2ce92730991PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoub��doub@�ldoub@G�doub@�ldoub@G�doub@�,doub��doub@�,nonAffineTransformVlLsdoub��doub@�ldoub@G�doub@�ldoub@G�doub@�,doub��doub@�,warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@HSz  ObjcPnt Wdthdoub@HHghtdoub@HRsltUntF#Rsl@R��8BIMfxrp��@�l��/������8BIMnorm�
�(��������������������js8BIMlunijs8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�lc�Z}|8BIMPlLdxplcL$4c02335c-0485-1173-a2a2-eaea0594271a��@�X@G�@�X@G�@����@��warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@H8BIMSoLdsoLDnullIdntTEXT%4c02335c-0485-1173-a2a2-eaea0594271aplacedTEXT%fac41c0d-ad79-1173-b145-c2ce92730991PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoub��doub@�Xdoub@G�doub@�Xdoub@G�doub@��doub��doub@��nonAffineTransformVlLsdoub��doub@�Xdoub@G�doub@�Xdoub@G�doub@��doub��doub@��warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@HSz  ObjcPnt Wdthdoub@HHghtdoub@HRsltUntF#Rsl@R��8BIMfxrp��@�Xl�����/������8BIMnorm�
�(��������������������folder_open8BIMlunifolder_open8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�lc�Z�78BIMPlLdxplcL$94592e07-047e-1173-a2a2-eaea0594271a��@W�@G�@W�@G�@a���@a�warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@H8BIMSoLdsoLDnullIdntTEXT%94592e07-047e-1173-a2a2-eaea0594271aplacedTEXT%fac41c10-ad79-1173-b145-c2ce92730991PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoub��doub@W�doub@G�doub@W�doub@G�doub@a�doub��doub@a�nonAffineTransformVlLsdoub��doub@W�doub@G�doub@W�doub@G�doub@a�doub��doub@a�warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@HSz  ObjcPnt Wdthdoub@HHghtdoub@HRsltUntF#Rsl@R��8BIMfxrp��@W��+/������8BIMnorm�
�(��������������������image8BIMluniimage8BIMlnsrrend8BIMlyid
8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�lc�Z��8BIMPlLdxplcL$6959b6d6-0482-1173-a2a2-eaea0594271a��@o`@G�@o`@G�@r���@r�warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@H8BIMSoLdsoLDnullIdntTEXT%6959b6d6-0482-1173-a2a2-eaea0594271aplacedTEXT%fac5ae2e-ad79-1173-b145-c2ce92730991PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoub��doub@o`doub@G�doub@o`doub@G�doub@r�doub��doub@r�nonAffineTransformVlLsdoub��doub@o`doub@G�doub@o`doub@G�doub@r�doub��doub@r�warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@HRghtUntF#Pxl@HuOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@0@@@H@0@@@H@0@@@H@0@@@HVrtcUnFl#Pxl@0@0@0@0@@@@@@@@@H@H@H@HSz  ObjcPnt Wdthdoub@HHghtdoub@HRsltUntF#Rsl@R��8BIMfxrp��@o`
									
	���������������������r��G��"����������������������������������������������!�*2@AABCE�@2  #%(&'("($   )&$ &$&&% !
�����ͯ���������˺�������������ƹ������������������������������
��������������������������������������
����Ŀ��þ���������������������Ŀ��������������������Ž���������������������ļ�����������u��������Ž�����������u�������������˳���~z��������½�u��������ʛ����yw��������þ�u���������ɛ�����{y���������Ŀ�u��������ɭ�����������������ſ�u������������������������ƿ�v����������Ä��������uom��������ƽ���������������º���pn��������������������¼���mk��������������������þ��plr�������������������¾�zrr����������������
�®~{z���������������������������������¨�}z��������������������������������������������������������à��������������������������Ÿ���������������������������������������������������������������������������������������������	������������ÿ����������������������������������������������������������������������������������������������������������������������
����������������������������������������������������������������������������������������������������������������������������������������������������������������������߲�������������������ۗ�!#!#&$''$!))#$(%(!&$!&!" %$
������������������������������������������
��������������������������������	�����������
���������������������������������������
������������������������������������������������μ����������������������ͻ����������	w����������������ͻ����������	w������������н���������������	w������������湣�����������������w���������������������������w�����������Ȥ�������������w���%����������氣�������ž�������������z����%����������⣣�������ɰ�������������ϵ�����ϣ������������������������������������ś����������������������������������ӽ������������������������ɗ���������Į�����������͜�����������ϳ����������������ǟ���������������׵���������͢�����	�������㿿�����ߧ�������������������ţ������������㽽��������������������������㽽��������
����������������������ⴣ��������������������ỻ�������������������������⹹���������������������������������������������������Ḹ������������������������Ḹ��������������෷��������������෷������������������߷�������������������������������߷�����������������������������෷������������
��������߷����������������߷������߷��������߷�������۷�!"&$'&%$)() (&)$$%' &

��������������������������������������������
�������������������
�������������������������	�������������
������ﵵ�����������������������������������������������������	������������������������������������������G::���������������������������G::����������������ֿ�����������G::���������������
����������������::��������������	����������������:�����������������������������%���������������������������������������������������ϴ���������������%������������������ڽ�������������������������޻����������������������������������׫�������������������������������൭���	��������������!���������������㹶�����������������������������༸������������������������������������������������������������	�Ŀ����������������������������������������������������������������������������������������������	����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������


����9�������������������������������������������������������������������������������������������������������������������������������� " "'(&'/--.)/0'0&+'*$0&+('-*/!'#"

����	���Ҵ�����������������ü���s��������̽���%�x�������������x����������������Ҽ������x����������ü�����̷����s��x���������̽�����ů������r���������������ª������������ �����������Ҽ�����§�������� ������ ���ü������̷�����ħ�����������������̽������ů�����ũ�������������������������ª�����ܭ��������ڸ����������!����Ҽ������§������������������������!����̷������ħ�������Ϭ��������ݸ�������#������ů������ũ�������־�����������$�����������������ª������ƭ��������ڶ���������������§������ӳ�����������������	��������������ħ�������Ш����������������������������ũ�������ֿ���������������˹��������ƭ��������ڷ��������������������������dz���������¤���������������������˷���������������������������������̾�����������������˹��������������÷��������������������������ƺ���������������������������������ý����������������������������������������������˹�����������ֿ����������������������վ�����������������������������������ս����������
���������������ս������������	��������ֿ���Ӿ������������վ�����ҽ�������������������������������ս�����ѽ�����������ս���н�������������������ֿ��	�Ӿ�����н����������������������������վ�����ҽ���Ͻ�����	ս������ѽ��׾�����ս���н�������
�Ӿ������н������������������ҽ���Ͻ���������������������������ѽ��׾��������������������н����������������������н�����������Ͻ������׾�������������� #!)%*'/+//)-/.'&')/%,-)"!.+ *$' 

	����
�����������������������
�������
�t��������
�������'�y����������������	�������y�������������������������y��������������������������t��y�������������������������s�������������������������ս��������������������������Ժ������ �������� ������������������ֻ��������������������������������ؽ����������������������������������ս����������������������������������Ժ�������������������!������������ֻ������罹���������������!������������ؽ�������֪�����������������������ս��������������������������&���������Ժ��������������׵���������������ֻ������軽���������������������ؽ�������װ������������������������������͵��
�������������������������������ض�������������������������������̻�����������������������������Ҿ����������������������������������ɻ���������������������������������������������������������������������������������������	������������������������������������������������������������������������	�������������
����������������������
���������������	�������������������������������������������������������������������������	������������������������	���������������������������������������������������������������������
��������������������������������������������������������������
����������������������������������������������������������������������������������������������������#"* $(0&).()./00-)0./'//+*,0*%)(##


���������������������������������
�����4��~���������
�����<������������������
����������������������������������������������������������~��������������������������}���������������������������:#(����%����������������������������������2U���������������������������N������������������������������������������
�������������������������� ������������������������������������������������������������������������������
����������������
����������������������������������������"��������������������������������
������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ �������������������������������	����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������



������%�������������`��*�������������
���
����	������������������������������������������'e�܂$	$99:;;=�9=;;:99$') $*
%"# "

����s��}������������~}|}�����������������}������������~}|}����p���������������~}|}���������¾����ًy��������������~}|}�����������������������~}|}e�������}e�����������������p�S���������������������
_e�����������������������������u	�n~���������������������	�������������t�i}�ޑ�s
�`}���������������������������r�k}�������������������r�x}������������p��}�������������������~oƜ~������������������������~o
�~������������������
���������~n����������������������~m��~������������������}l��~�����}l�~��������������������}j��z���������������������|i��z�������{i��z���������{h��z����������������{h��z�������������������{g��z�~�~~~�~~~�~zf�z�~~}}�~}�~}�~zf�z��}|�}|}}|�}{f�{��|}�|}�|}||}}|}ze�z��|�{�|�{|�{|{�|�{|{{ye�v��k�j�k�l�m�n�o�pqxze�l�{oz\�;�jdW�() # 
*$!%
!)

����������������������������������������������������������������������������������������������������櫞�������������������������ı���������������������������ϲ������ؽ����
���������հ���p�׼��������������¦
_}�ջ��������������������������~�Ӹ������������������������z��޻���z��������������������������������������к������������������������������Δ�����������������������Ц�˷��������������������������ụ�������������������������Ѧȶ������������������������������������������������޳�����²������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ު����Nލ�r�'
%$"# "#%

�����������������������������������������������������������������������������������������������������������������̏�����������������}������������������������������������
���������������	������������������	���������������������������ӽ������������߾�������������������������������
����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������	�����������������������������������������������������������������������������������������������������������������������������p�����
			
		�������������������������r��G��"�����������������������������������������8��8���������������������*��@22@AABCE�@2�%"(*...+ !'#""!"+'#+!((&"($&('��������ͯ��������������˺�����������������ƹ����������������������������������������Ų��������
����������������������
�Ŀ��þ��������������蚭�����������Ŀ�������ꘘ���笘瘗���񘐽�����������������𩕕��敕�������������u��(�𕕔�𩕕攕�𔔩攕�������������u��(�擧��𒒓����撧������������½�u�������������������������þ�u���������������������Ŀ�u��������������������ſ�u�������������������������ƿ�v���������������������������������ƽ�������������º���������������������������¼���������������������������þ��������������������������¾���������������������
�¿��������������������������������������¿�����������������������������������������������������à������������������������Ÿ�������������������
����������������������ș�������������������������ə������	������������ٔ����ș�����������������Ǚ��������������������ߴ��	����ƙ����������������ݴ����������ř������������������ߴ����������Ù�������������������������Ù�������������������ߵ������������������������ݷ������	������������������������޷���������˿�����������������ݸ������������ʾ���������������ݸ����������ɼ������������������ܹ���������Ȼ�������������������ܹ���������Ǻ��������ϔ���ϔǹ����������������������������������������ŷ�������������������%%"(*...+ )*&*'*"&*("%#**-( q�����������������q��������������������������q������
�����������q�������������p�qpqpqqp�qpq�p�qp������������n
������������j�k�j�kjk�j�k�j
�������������g��g���gg��g����g��g������������d�d�ddc�d�ۂd�dc��d��d��μ����������a`�a����a�`a�``a�a�a`��ͻ����������	w��_(�^�__^�_�~__�^_��^^}�^_��ͻ����������	w��\(�\�]{��\�\\]|��{�\{�\{\��Ͻ����������	w��[��{��{�\�[�[�[��\��п�����������w��YX�Y��YX���������������w��YX�Yc���ý������������w��Y	����������������������������������z���Y��	������������������ɰ�������������ϵ��Y�������������������������Y��������������ź���������������Y���������������������Ǽ�������������Y��������������½������Į�l�������������������������ϳ��l��������������������������������׵��l��������������	�������㿿�l����������l���������������������㽽�l����������㽽�lk�w��������������k�������j~z������~�}�|{�y�~~j��������ỻ�i~j�~j~i����������⹹�h�|�L�Q	T�||h�������g���U�c[�uug�������e~�U�s���s
c�ssf������������Ḹ�e�}�U������j�rqe��������Ḹ�c�|�U�n�����o	b�ppc���������෷�a{y�U�����m�ooa����������෷�`�x�W�{��{j�ll`������߷��^�x�W{||������}l�kk_���������߷��^wv�Xggil����l�ia�ji^�����������෷�\�u�Xxyyz���Ӄ�{	n�hh\������
��������߷��[�s�X�q�r���́�r	i�ggZ����������߷��Zrq�X�l����lf�feZ����߷��Yqjq�qjfY�����߷��X�l�k�jihh�gf�ed�aW������Wmkmjihh�gf�e�d�cac``W�UVWVUVVUWVV�U�V�UWUWVUVVU��%"(*.--*)'+"*(+&&%()'#$ #&!������������������������������������������������������
������������������������������������������������������
�����ﵵ�������������������������������摦�����������������菏���奏収��	��������������������䌌�������������G::�������䊋��䊋�����������G::����䉟������㈟������������G::�������������������������::����������������������:������
�����������������
����������������������
�������������������������
�������������%���������������������������������������������������������������������������������������������������������������������������������	����������6�����!����������������������������������6����������������������������������6��������������������������������6�������������������������������6����������������������������������6a���������������6�X=�������������5�X`�����������4C@FH�F�D�C�B�A�@?FCC4��������������4CQ�CQC4���������������2�BJ�#$JBB4�������������1�DI%�/)I==2����0�CI%�;���;/I;;0�������������0�BI%�F��F4I::/�������/�AJ%�8�����8/J99/����������.�@I%�F���F6I88.�������-�>H&�A���A5H66-����������,�>H&�A�����A5H66-�������+�>H&1148���ϼ8�4.H55+������)�=G&�>@K���L�A	7G44)���������(�;G&�:Q���Q�:4G22(�������(�:F&�6^�^�61F11(�������':Q:�X:Q1'��������'�6�5�4�2�10�/'���������&:6:5544�2�1�0�/.2..&���%&%%&%%&�%&%&&%��
			
		�������������������������r��G��"�����������������������������������������8��8���������������������*��@22@AABCE�@2�%#(*...-!'#""!"+'#+!((&"($&('��������ͯ��������������˺�����������������ƹ����������������������������������������Ų���������
��������������������
�Ŀ��þ��������������������������Ŀ�������瘘���߬����񘐽�����������������𩕕𩕕�𩕐������������u���敕���𔕔𔔩𔕐������������u��(�擒��𒒓���𧒒�����������½�u���������������������������þ�u�������������������Ŀ�u��������������������ſ�u�������������������������ƿ�v���������������������������������ƽ�������������º���������������������������¼���������������������������þ��������������������������¾���������������������
�¿��������������������������������������¿�����������������������������������������������������à������������������������Ÿ�������������������
����������������������ș�������������������������ə������	������������ٔ����ș�����������������Ǚ��������������������ߴ��	����ƙ����������������ݴ����������ř������������������ߴ����������Ù�������������������������Ù�������������������ߵ������������������������ݷ������	������������������������޷���������˿�����������������ݸ������������ʾ���������������ݸ����������ɼ������������������ܹ���������Ȼ�������������������ܹ���������Ǻ��������ϔ���ϔǹ����������������������������������������ŷ�������������������%%#(*....)*&*'*"&*("%#**-( q�����������������q��������������������������q������
�����������q�������������p�qpqpqqp�qpq�p�qp������������n�n
������������j�k�j�kjkjj�k�j
�������������g������gg�g�g�g��gg��g������������d�d�ddc�d�΂d��d�d��d��μ����������a`�a����a�`a�`a�a�`��ͻ����������	w��_�^�__^�_�_�^_^�^^}�^_��ͻ����������	w��\(�\�]\��\�\\]��\\�\\�{\\��Ͻ����������	w��[��{��{�\�[�[�[��[[��\��п�����������w��YX�Yc���������������w��YX�Yc���ý������������w��Y	����������������������������������z���Y��	������������������ɰ�������������ϵ��Y�������������������������Y��������������ź���������������Y���������������������Ǽ�������������Y��������������½������Į�l�������������������������ϳ��l��������������������������������׵��l��������������	�������㿿�l����������l���������������������㽽�l����������㽽�lk�w��������������k�������j~z������~�}�|{�y�~~j��������ỻ�i~j�~j~i����������⹹�h�|�L�Q	T�||h�������g���U�c[�uug�������e~�U�s���s
c�ssf������������Ḹ�e�}�U������j�rqe��������Ḹ�c�|�U�n�����o	b�ppc���������෷�a{y�U�����m�ooa����������෷�`�x�W�{��{j�ll`������߷��^�x�W{||������}l�kk_���������߷��^wv�Xggil����l�ia�ji^�����������෷�\�u�Xxyyz���Ӄ�{	n�hh\������
��������߷��[�s�X�q�r���́�r	i�ggZ����������߷��Zrq�X�l����lf�feZ����߷��Yqjq�qjfY�����߷��X�l�k�jihh�gf�ed�aW������Wmkmjihh�gf�e�d�cac``W�UVWVUVVUWVV�U�V�UWUWVUVVU��%#(*.--,)'+"*(+&&%()'#$ #&!������������������������������������������������������
�������������������������������������������������������
�����ﵵ�����������������������������������������������叏���ܥ��줏�	���������������������������������G::����䋋����������������G::����䉈����������������G::���������������������������::������	���������������:������
�����������������
����������������������
�������������������������
�������������%���������������������������������������������������������������������������������������������������������������������������������	����������6�����!����������������������������������6����������������������������������6��������������������������������6�������������������������������6����������������������������������6a���������������6�X=�������������5�X`�����������4C@FH�F�D�C�B�A�@?FCC4��������������4CQ�CQC4���������������2�BJ�#$JBB4�������������1�DI%�/)I==2����0�CI%�;���;/I;;0�������������0�BI%�F��F4I::/�������/�AJ%�8�����8/J99/����������.�@I%�F���F6I88.�������-�>H&�A���A5H66-����������,�>H&�A�����A5H66-�������+�>H&1148���ϼ8�4.H55+������)�=G&�>@K���L�A	7G44)���������(�;G&�:Q���Q�:4G22(�������(�:F&�6^�^�61F11(�������':Q:�X:Q1'��������'�6�5�4�2�10�/'���������&:6:5544�2�1�0�/.2..&���%&%%&%%&�%&%&&%��
			
		
�������������������������r��G��"�����������������������������������������8��8���������������������*�p�@22@AABCE�@2�%!"#&-(&!'#""!"+'#+!((&"($&('��������ͯ��������������˺�����������������ƹ����������������������������������������Ų��������
������������������������
�Ŀ��þ�������蚭�����
������Ŀ�������笘�������������������������������������u������𔕔�������������������u������撓��������������½�u��
𑒒������������������þ�u�������������������Ŀ�u��������������������ſ�u�������������������������ƿ�v���������������������������������ƽ�������������º���������������������������¼���������������������������þ��������������������������¾���������������������
�¿��������������������������������������¿�����������������������������������������������������à������������������������Ÿ�������������������
����������������������ș�������������������������ə������	������������ٔ����ș�����������������Ǚ��������������������ߴ��	����ƙ����������������ݴ����������ř������������������ߴ����������Ù�������������������������Ù�������������������ߵ������������������������ݷ������	������������������������޷���������˿�����������������ݸ������������ʾ���������������ݸ����������ɼ������������������ܹ���������Ȼ�������������������ܹ���������Ǻ��������ϔ���ϔǹ����������������������������������������ŷ�������������������%%!"#+-(&)*&*'*"&*("%#**-( q�����������������q��������������������������q������
�����������q�������������p�qpqpqqp�qpq�p�qp������������n
������������jk�j�kjk�j�k�j
�������������g�g�g����gh�g�g
������������d�ۂd�d�c��d��μ����������a``�a��a����`��a`��ͻ����������	w��_�^�_�^_^�_�_�_�^_^_��ͻ����������	w��\�]\�\�\]��\�\��Ͻ����������	w��[
�[\\{��[�[�[\��п�����������w��YX�Yc���������������w��YX�Yc���ý������������w��Y	����������������������������������z���Y��	������������������ɰ�������������ϵ��Y�������������������������Y��������������ź���������������Y���������������������Ǽ�������������Y��������������½������Į�l�������������������������ϳ��l��������������������������������׵��l��������������	�������㿿�l����������l���������������������㽽�l����������㽽�lk�w��������������k�������j~z������~�}�|{�y�~~j��������ỻ�i~j�~j~i����������⹹�h�|�L�Q	T�||h�������g���U�c[�uug�������e~�U�s���s
c�ssf������������Ḹ�e�}�U������j�rqe��������Ḹ�c�|�U�n�����o	b�ppc���������෷�a{y�U�����m�ooa����������෷�`�x�W�{��{j�ll`������߷��^�x�W{||������}l�kk_���������߷��^wv�Xggil����l�ia�ji^�����������෷�\�u�Xxyyz���Ӄ�{	n�hh\������
��������߷��[�s�X�q�r���́�r	i�ggZ����������߷��Zrq�X�l����lf�feZ����߷��Yqjq�qjfY�����߷��X�l�k�jihh�gf�ed�aW������Wmkmjihh�gf�e�d�cac``W�UVWVUVVUWVV�U�V�UWUWVUVVU��%!"#&,'%)'+"*(+&&%()'#$ #&!������������������������������������������������������
������������������������������������������������������
�����ﵵ��������������������������摦�����������������奏�������������������������������������G::�������������������������G::������㈉��������������G::���
�������������������::������	���������������:������
�����������������
����������������������
�������������������������
�������������%���������������������������������������������������������������������������������������������������������������������������������	����������6�����!����������������������������������6����������������������������������6��������������������������������6�������������������������������6����������������������������������6a���������������6�X=�������������5�X`�����������4C@FH�F�D�C�B�A�@?FCC4��������������4CQ�CQC4���������������2�BJ�#$JBB4�������������1�DI%�/)I==2����0�CI%�;���;/I;;0�������������0�BI%�F��F4I::/�������/�AJ%�8�����8/J99/����������.�@I%�F���F6I88.�������-�>H&�A���A5H66-����������,�>H&�A�����A5H66-�������+�>H&1148���ϼ8�4.H55+������)�=G&�>@K���L�A	7G44)���������(�;G&�:Q���Q�:4G22(�������(�:F&�6^�^�61F11(�������':Q:�X:Q1'��������'�6�5�4�2�10�/'���������&:6:5544�2�1�0�/.2..&���%&%%&%%&�%&%&&%��
		
	�������������������������r��G��"������������������������������������������������������������������������������!�*�2@AABCE�@2)&,//+/' #+%""""+'&  ("%&%!!
�������ͯ�����������˺����������������ƹ������������������������
��Ų��������������������������������������������إĿ��þ����������������������
������Ŀ�����������
�����������
�Ջ�������������������������������Ҋ������������u��������������������ҋ������������u�����������������������������½�u������������������Ћ�����������þ�u������������ϋ������������Ŀ�u�������ȋ�������������ſ�u�����̓��������������������ƿ�v�����͍������������������������������ƽ�������������º��������������������������¼���������������������������ļ�����������������������	������������������������
���������������������������������������������³����������������	��������������������������	��������������à���������������������������Ÿ������������������������������������������������������������������������������������Կ���������������ÿ�������������������������������ҿ�������������������������������������������������������������������������������������������������������ѿ�����������������������������������������������������˼���������������������������˼��������������������������������������������ƽ������������������������������������������������߲���������������������ۗ�% (&,))//* //#*.#'*$&$ '#$!$$!
x�����������������x��������������������������x������
�����������x�������������w�vw�vw�vwvww������������s��s
������������nonoonnonnonnoo�n�nnonn�������������j���j��j��j�j����j
������������gfgg�ghg�f�gg�f�gg�fg��g
hg��μ����������b���b�b�b�c��b��b��ͻ����������	w��b��b�b�b�c��b��b��ͻ����������	w��_^_�__^��_��^��_�^_^_^��Ͻ����������	w��\]]\[���]�\�\\]��\�\\]\\��п�����������w��[YZY[Z�[Z[[Z�[Z[[Z���������������w��YXYXYX�Yi���ý������������w��YXYXYXY����������������������������������z���YXYXYX��������������������ɰ�������������ϵ��YXYXY�������������������������YXYX�������������͝ukkj������������YXY�������������������ɀpligg������������YX����
������|tpmmlk�������Į�Y����������րwvsrpoz�������ϳ��Y��������������ywtru������������׵�Y����������yz{��	�������㿿�����ށywxx�����������������xwwx����������㽽�����������������vvwx��������㽽���������v�xy��������������uu�vw����������u�v������ỻ���������
���tuututuutv������⹹�������}�sv�wx�����������r�������������u�rt�����������Ḹ������������ߓsrsr����������Ḹ������ٙ�rv�������෷�������{rsqqr�����������෷�������r�q���������߷����������ss�r	���������������߷����������s�rw��������������෷���������sr������
��������߷������������������߷������߷��������߷���������۷�)+&(+(++0-/-1'.+-'%%' !
(�h�������������������������(�h������������������(�h��
������������(�h�������������&�'
&''&'&''&'&'&'�&'&''������������$��$
�����ﵵ��� ���   � ����������������������������������
���������������������
��������������������G::���
�������������������G::����������������������G::����
������
�

��
������������::���!












��������������:���

�

�



�

,����������������

�

�����������������������
�������

�
�����������������
����������



��%�����������������������������������


������������\RTU�����������

�������������������XGJMNN�����������

����������������I@ACFHJ�����������

�����!��������������N@?@@ADS������������
�������������h@@??D������������������������������@C����������������������������O�@A����������������������������@??@y�����������������������Z�?@������������������������?@�BD�������������x�?A������������������������A�?A�����������������?A�����������������Q�?D�EF���������������?�����������E�?B�����������������v�?������������>�?F����������������N>?�>������������?�>x����������������??�>w���������?�>E���������>?`���������������������������������������������
	

����������������������������������������������������������������������������������������������������������������������������������������$�"����Cri,�6�����F��k��G�4����1u�X��`��/�v����`�'����[���Z1@���y;/X����x��j��������}������{��0�������U��\�����[�����&��������T��W���8��[���I�������,������k���1�!���QR���#�����������V#���3�Q���&�3���{	�����R��!���^�����!�����!�����M��9����F��������f��A�����:������!���s���������2���ި���������������������������������$&!#&**))*$&'&(+*+*(%%#!###(***)(#)'/,&/.%-0/(/*((%)&*)*)&$!  ���.����#8����#8����#�$�#8����#"�#! �#8����#"_F!�#!?csuhH# �#8����#U��Y%"�#$h����x$#8����# !��W�#$,����)#8����#z���(�#,���!8����#5��Y�#!������f8����#"����"�#h���nRh����6����#$T����=�#!�������03����# "����#1��1##$D����D1����#{���)�#!$�����#,��P0����#6��d�#"%\�8�#1��H0����#"�����!"�#$�#P����63����#U����F�!!�#����#5���##  ��	�}��и0�#$J��9���##|���.����?�#$3���:8���#6�p!#���>�#>���#8���"����!)���>�# [��!#8���U����P$3��>�#$�����###8���#���##D����>�#$'�����#8���z���+P��
�6 ##$3���n�#8�������;�H>}��	�_DJ+!#.���F"�#8���������������j ����(�#8�����vu���$�#8�����v%���#$�#8��������������kW����b�#8���1P�ND����dJL)����bD�JL;!8����d���6!���������)4����#j���>#! ���.4����#j���># %���,4����#j���>#(���,4����#n���>#!#����˘"6����#
:����})!##" � !8����#$�"�#"!�"!"#8����#8����#8����#8����#4���+�96J������������������������=����������NR����7����#�����7-��������f0g���M�(���5n�����!B���o���Hl֏M$
T2a��4����:(��
�	��������\�F����U���
�`��������/���	
�����u���E�����C�{������(�����{��,-���\�
U����c�6�������
��h)��Il3��}>���	��LHa������$�8^��!R����4j��n��	�,v��'x��#�����BT��M��%��[y!�Z;�����Q���i ����J��������B�����&�`���`��?������c|���M�:��"�@�����Ѣ�
���R�z��֦J���t�:����)n2S^__]��V�ݷ���a��f`__\L$"���M&��������M��V/J?4���$������p%�����8��4w��4��t�������������y�{|uH"^�mk������*��+c|�{z~���z8�eC���a$u�~����2���	��l��*p‡}�~X����"�u���������4���i�8c��?m���6�'j���/Q��������2����s��,s�ľ��������0��,��<),�+�, .
g�`|������.��&$(-,�+)t����$������������O��)�����@q��������HZ���
������^��C=\O/~��_������n���	`������O�	i��ś��#������ڭ=��
�9!����+�����e���L U���	���90���	^4d�Z���������
�O���PkJ��N���*��������X��/������AH����#�YA��C��&	oM_��):X���������PN����o���Q	�)�����$����&�`W��
G�{--���m��`4��>����9����Qx���>�����$�.���+���C��9Q���Ra��F��#�/����Up����<��:?��H�����d��	�M������J�p�a��.�������n����n�����%�9"���Y����S�����m�����XC������aH��9����PQT����;+#o����%y(6�����&���|'
:�����T��������������$&!#&**))*$&'&(+*+*'!%$!###(***)'%))//*..%,0.+0*(($)&*(*)&$!  ���*����5����5���� �� �5������5����^D�=bqsgF �5����T��W"� g����v 5������V� )����&5����y���%�)���5����2��W�������e5���������g���mQg����4���� R����:��������-0��������/��/ A����B/����{���&� �����)��N-����4��c�"Z�5�/��F-���������� �N����40����T����D������2�����	�{��и-� H��5���z���*����=� 0���85���4�n ���<�<���5�������&���<�Z��5���T����N 0��<� ����� 5��� ���B����<� $�����5���y���(N��
�4 0���m�5�������9�F<}��	�]AH(*���D�5��������������h����%�5�����us��� �5�����u"��� �5������������jV����`�5���/N�LB����cHJ&����`A�HJ95����c���4���������&1����h���<���*1����h���<"���)1����h���<%���)1����m���< ����˘4����
8����|&�5���� ���5����5����5����5����1���(�54H������������������������<����������QR����7����%�����;��������jg��� 7�t(���5n�����C���Q���2n֏M$
S2a��4f���()��
�d�����\�	3�����<���
�`
|������g�/���	�������U
���E����`��0�{���^�o����l{��2����B�
=��
��c�'��r������j���6l3s�[>�����7Has�����$�8B��R����%j��Q�n	�,Wĭz��#�r�r�B=��M����[y��?=������;�s�L ��~�6z�o�����/������E�j�F›
@������c[�r�8_
)r���.�����Ѥ�
���<�{��֦L�{�U�<����!n";FGGF_��V�޹���G��J�GC6"���M��������sM��V&7/1�����������f	��q������»)��2U����$��tl����Ã	�������rW�XYV5_�nM¼����"��
!IY�XZ����W:�g1���G%x��������.�����M��)pÉ~��Z�����U���
������*�����dk�8c��AL���&�)M��� S�������,�����Q��,r���ám���"������*!� !".
g�aZĺ����#��%""� !U������$bº��������8��%f����+s��u���������1^���y�������^��B.@8)��E�������N���	D��������:�	j��Ǟ��#�y�������*���9�`�o�-�����f���7U���	���9"���	E
$I�A���������
��:�t�8kJo�9�y�c)����`�o�?�}/�������-K�����[.��C��nMD�p�*:Až������
��;N��v�Q���:	�)y�s��$�u®%�`?G�z-!���P��E6��>���{���)����QW�q�-��ā��$�����w�bC��9Q��	��;G���yF��#�0����>R��
��<��;.��3f���dd��	�Pv�����4�p�`��.�g��O����nd���n%�9"���Y�����;�����N�����XC������b2��(����99U����;+#o����$W7�����'���|'
:�����U��������������$&!#&**))*#&'&(+*+*("%%!##%*)**)'(*)/0),-#.-,&1,))&)'*)*)&$!  ���,���� 6���� 6���� !� �!� 6���� � � 6���� _F� >dsthH!� 6���� U��Y#� !h����x! 6���� ��X� !+����' 6���� z���&� +���6���� 4��Y� ������f6���� ����� h���nRh����5���� !T����<� ��������/1���� ���� 0��0  !B����D0���� |���'� !����� +��O/���� 5��d� #[�6� 0��G/���� ������ !� O����51���� U����F�� ���� 4���  ��	�|��ѹ/� !I��6���  {���,����>� !1���96��� 5�p!���=� =��� 6�������'���=� [�� 6���U����O!1��=� !�����!  6���!���  D����=� !&����� 6���z���)O��
�5  !1���n� 6�������:�H=~��	�_BI) ,���F� 6���������������i����&� 6�����vt���!� 6�����v#��� !� 6�������������kX���b� 6���0O�ND����dIL'����bB�IL:6����d���5����������'2���� i���= ���,2���� i���= #���+2���� i���= &���+2���� n���= !����̙5���� 9����}'  �6���� !�� � 6���� 6���� 6���� 6���� 2���)�65I������������������������<����������QU����7����'�����?��������ll���$
,���5n���K���	t֏M$
S2a��;/��
�
��\�	����f��/���	��
�K�{���~��5���c�
��ml3>���Ha��$�B
R��j��
�,z��#��BM��		[x

C����� !��"�����

	�

��C������c�	������	Ѥ�� }��֦N��B����!p		V������(���R��M��[-���
���v���2��t����
�

^�r����
@�l	-������)�	��)pŏ����c�����
���s�8c��J�/
Z�������%�	
��,s����Ť
��	�/
g�e�	��'"	���(����"w���b����	^��D	��������� �i��ɤ��# ����?
��2�����i�
		Y���	���;	�

���������kJ�*�����0��	�
P����#�`	C
	oM );������N�� �	�*��$�&�`G�{,~�:��B"�	����Q���!	�C��9Q�� F��#�7��<��:
d��	�Q
�p�`��.�����o*�9"���Y�
��������XC������h����
Z����;+#n����%>�����+���|'
:�����Y��������������
									
	�����������������������������r���G���"���������������������������������������������������������������*��@22@AABCE�@2�  #%($$''!  !"+'#*&.,,(& !�����ͯ���������˺�������������ƹ������������������������������
��������������������������������������
����Ŀ��þ���������������������Ŀ��������������������Ž���������������������ļ�����������u��������Ž�����������u���������������Ž���������½�u���������ƿ����������þ�u����������������������Ŀ�u������������������������ſ�u�������������������ƿ�v����������������������������ƽ�����������º�������������������������¼�������������������������þ�����������������v��������¾���������������v������
�¿������������������v��������������������¿������������������v������������v�����������������������à��v���������������������Ÿ��v����������v��	v������������������v�v����������v�BAA@�?>==�<�;�:9�v�������	�����������v�Ueed�cbaa`�_^]]\�[G�v����������v	�Qb}{a`__^�]\[[ZYY�X
D�v�������������������v�M_y}x]\[[ZZYYXWWVSKHH,�v���������������v�I\[v}uYXXWWVUTKC:�6
�v�����������������v�FXt}s�rUTSNC8�6�v���������������v�BU}qp�}QG=�6�v�����������������v�?R�Qnjb8�6�v������������v�;ONNI=�6�v�����������������v�7LG=�6�v��������������v�0<�6�v������������v��6�v���������������v��6�v����������������v��6�v�������v��6�v��������v���v�������v�����v��v��!#!#&$''$(($('*"&(-%&,&#!������������������������������������������
��������������������������������	�����������
���������������������������������������
������������������������������������������������μ����������������������ͻ����������	w����������������ͻ����������	w�����������������Ͻ����������	w�������������������п�����������w�����������������������������w����������ý������������w�����������������������������������z����	����������������ɰ�������������ϵ���������������������������������������ź�����������������������������������Ǽ���������������������������½������Į��������������������������ϳ����������������������������������׵����������������	�������㿿��������������������������������㽽��������㽽�����������������������HGG�F�EDCC�B�A�@?���������ỻ��\nmmllkkjihhggffeddccN�����������⹹��Xk�ihhgffeeddcbaa�`J���������Tg��eddcbbaa`__^ZROO1���������Pdc��a``__^]\RJ@�<"�������������Ḹ��L`����\[UI>�<"���������Ḹ��H]���XNC�<"����������෷�	�EZYXX}yo>�<"�����������෷��AVUUPC�<"�������߷���=SNC�<"����������߷���5B�<"������������෷��"�<"�������
��������߷���"�<"�����������߷���"�<"�����߷���"�<"������߷����"�����������������!"&$&%$$(%) ((+&&%((.*"+!!��������������������������������������������
�������������������
�������������������������	�������������
������ﵵ�����������������������������������������������������	������������������������������������������G::���������������������������G::����������������������������G::������������������������������::��������������	���������������:��������������
������������������	����������������������
���������������������������
�����������%�����������������������������������������������������������������������������������������������������|�����������������������	����������|�����!����������������������������������|����������������������������������|��������������������������������|�������������������������������|����������������������������������|���������������|��|�����������|�|������������|�HGGFEE�D�C�BA�@
?�|��������������|�\nnm�lkjiih�g
feedccM�|���������������|
�Xk!jiihggf�edcbba�`J�|�������������|	�Tgh!geedc�b
a``_^[SPP1�|����|�Pece!da�`_^^\SKA�="�|�������������|�L`c!b�a]\\VJ?�="�|�������|�H^!``�!YOD�="�|����������|�DZ�Y\XP?�="�|�������|�@WVVPD�="�|����������|�<TND�="�|�������|�5C�="�|������|�"�="�|���������|�"�="�|�������|�"�="�|�������|�"�="�|��������|��"�|���������|������|���|��
									
	

�����������������������������r���G���"��������������������������������������������������������������������B����3������������*'�����H�@^J�@2	���J�  #%($$''!  &)&%#((($&$'$*'%)' �����ͯ���������˺�������������ƹ������������������������������
��������������������������������������
����Ŀ��þ���������������������Ŀ��������������������Ž���������������������ļ�����������u��������Ž�����������u���������������Ž���������½�u���������ƿ����������þ�u����������������������Ŀ�u������������������������ſ�u�������������������ƿ�v����������������������������ƽ�����������º�������������������������¼�������������������������þ������������������������¾������������������pu�����
�¿�����������������������p�~�����������¿���������������������p�x��������������	����p������������������à�����p��x�����������������Ÿ�����	p���{�������������������p�����������������������������������p������������������p����š��������������	������������ÿ��p�x����¥����������������p�vv����������������������������������
p�{�~|��������������������������p�{���v����w�����������������������p�{����v�������������������������p�{�����v�����������������������p������p�{������|��~�������������pvp�����p�{������u�}�������������������pvp~uutrp�z������t�u����������������pv{�������z������xz���������������pt�������w�����~xs������������������pt������u�����tt�������������������t���ə���w����zq����������r�����”���w�����p�����������q���������{z����r����������s{����xu����z������
pry���~yra�0��ptrqrpX#�0�!#!#&$''$(($(%)"&!#''$$&$()-& ������������������������������������������
��������������������������������	�����������
���������������������������������������
������������������������������������������������μ����������������������ͻ����������	w����������������ͻ����������	w�����������������Ͻ����������	w�������������������п�����������w�����������������������������w����������ý������������w�����������������������������������z����	����������������ɰ�������������ϵ���������������������������������������ź�����������������������������������Ǽ��������������������������½������Į��������������������������ϳ��������������������������������׵������⪹���������	�������㿿�����Ӷ����������	�����Ϊ���������������㽽��������ͭ������������㽽��������й���������������������DZ����������������Dz���������ỻ������Ѭ�����˰���������������⹹������Ѩ������Ʋ���������
����Ѭ������������������Ѭ�������ͪ������������Ḹ������Ѭ�ƺ����ϸ����������Ḹ������Ь���־��Ϳ����������෷��������Ь����ڹ���������������෷���������Ϭ�����ڨ�����������߷�����������ά�����ݦ��������������߷�����������Ǭ�����˪���������������෷���������ê����߯��´������
��������߷�������������Ц�������������߷������»����֫���������߷���������­���������������߷���������µ����ǥ������������������������������
����������	�F���������2	�F�!"&$&%$$(%) (&)%'&)" &$%! %!!&  !��������������������������������������������
�������������������
�������������������������	�������������
������ﵵ�����������������������������������������������������	������������������������������������������G::���������������������������G::����������������������������G::������������������������������::��������������	���������������:��������������
������������������	����������������������
���������������������������
�����������%���������������������������������������������������������������������������������������������������������������������������	��������������!!=������������������������������������`1���������������������������
����a)�������������������������
����;E���������������������������99)�����������������������������
����6J-l�����������������56E>�����������������3�#b9��������������������0�	"Fl;��������������������.5:@t=������������������
,&%48:C`R��������������*/�I088N8����������(/�Ɂ.5*A)����������������&/��Ъ,<�������������#/����C`�����������������!/����BIU�����������.����$M9x����������F�.����$X%���������#-&.����3BO��������#B�D0(���FG"������������!�D8 ���,&����������2�DC

+����9 z����������CDD>

���ڎs�����������


3���� w������������

.����P��������


������
									
													�����������������������������r���G���"�����������������������������������������������������������������������*��@22@AABCE�@2�  #%($$))#$$##"-%('. ',!!+($+�����ͯ���������˺�������������ƹ������������������������������
��������������������������������������
����Ŀ��þ���������������������Ŀ��������������������Ž���������������������ļ�����������u��������Ž�����������u���������������Ž���������½�u���������ƿ����������þ�u����������������������Ŀ�u��������������������������ſ�u���������������������ƿ�v�����������������������������ƽ������������º���������������������������¼����������������������������þ���������������������������¾������������������������
�¿����������������������������¿������������������=�V���V=����������<�VFHHGHHG�HIV��<��������������à��;TST��T��;����������������Ÿ��;TST��������TST;��������������:SRR���RS:��������������������������9SRR��R��9���������8�OP��������P��8��������������	�����������8�OP������
�����POO8���������7NMN��NMN7��������������������������6NMM��M��6���������������4JIK���������	K��4����������������������3JII�L�IJ3���������������3�H���H3����������������������1�HF�����	����F��1�����������0�DE��������E��0����������������������.�DC��
�������CDD.������������������-�B��������B-�����������-�BA�������A��-�����������������+�>?�����������?��+���������������������*�>����>*�������)�=�}�~}~}~�}~�=)��������)�=;�>;��)�������'�!:�~:��'��!�k�!&��!#!#&$''$**(,!"" %#$(+ * &$-&%!������������������������������������������
��������������������������������	�����������
���������������������������������������
������������������������������������������������μ����������������������ͻ����������	w����������������ͻ����������	w�����������������Ͻ����������	w�������������������п�����������w�����������������������������w�����������ý������������w������������������������������������z������	����������������ɰ�������������ϵ������������������������������������������ź�������������������������������������Ǽ����������������������������½������Į������������������������ϳ���������������������������׵��E�i��iE��������	�������㿿�D�ihXV�WXh��D��������C�ef��f��C��������������㽽�A�e�������eA����������㽽�@�c�������c@��������������?�cb������	b��?���������>�^`�����`��>�����������ỻ�=�^������^
=������������������⹹�<�\]���]\\<������������:�\Z������
����Z��:��������9�WX�����X��9�����������������Ḹ�8�W�Z�W
8���������������Ḹ�7�U���U7���������෷�6�UR��������R��6������������෷�4MNP�������P��4���������߷��2MNN�����������NNM2�����������������߷��1KLL������LK1���������������෷�/KLI������I��/������
��������߷��.�EH��	����H��.����������߷��,�E������E,����߷��+BCB�����������BCB+�����߷��*BCA�DA��*������)�"?��?��)��"���"'��!"&$&%$&*'+$,*$"$.((&&+)'&  ��������������������������������������������
�������������������
�������������������������	�������������
������ﵵ�����������������������������������������������������	������������������������������������������G::���������������������������G::����������������������������G::������������������������������::��������������	���������������:��������������
������������������	����������������������
�����������������������������
�������������%��������������������������������������������������������������������������������������������������������������������������������������	������������������������������������������������������������������������F�j���jF����������������������D�jiSP�Q�PQ�PRi�D�������������������C�fh��h�C�������������������������C�f�����fC����������������Aede�����edeA������������������@edc������c�@�����������������>�_a�������a�>���������������������=�_��������_=�����������������<\]]������]\<������������������:\]Z����Z�:���������9�WX�������X�9��������������8�W�[�W8�������7�U��U7����������6�US�������S�6�������5NOQ��Q�5�������������3NON�������NON3�������1�L�����L1������/�LJ������J�/���������.�EH���������H�.�������-�E��E-�������+DCC��������CD+��������*DCA�DA�*���������(�!?��?��(���!��!(��
		
	�������������������������r��G��"������������������������������������������������������������������������������!�*�2@AABCE�@2! $#$% )("")"+'%"&&%%# 
��������ͯ��������������˺�����������������ƹ����������������������
�����������
������������|�|�|
�Ŀ��þ������y���y�yy����y
������Ŀ������v	�vv�ߐܐv�vr�������������s	�ss��ϣss�s�������������u��p�pΡpp�p�������������u��p	�pp�ދދp�pr����������½�u��o��o�oo�o��o������������þ�u���o�������������Ŀ�u���opr�������������ſ�u��o���������������������ƿ�v���o�������������������������������ƽ����o�������Ǘ����������zyvvwyz}~�������o�������¼�������������������o�������þ�����������������o�����œ������������|�z	�{|}������o������
�¿������������������o��������������������¿�����������������o�����Ð����������������������������������������������à�����������������������Ÿ����������������������������������������������������������������������������������ÿ�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������߲���������������������ۗ�#! $#$%)*'&*$'*'%&&%"" $
�������������������������������������������������
������������������������������������������
��������������
����������������󴢢����
������������	򟟱�江���������������	񜜯�ݾ�����ͻ����������	w���ݽ�����ͻ����������	w��	񚚭�筚���������������	w�����񬙙�����п�����������w������������������w���������������������w��	����������������������������������z������	������������������ɰ�������������ϵ�������������ا������������������������������ź������������������������������������Ǽ�����������������峲�����������	�������Į��������������������������ϳ�����������������������������������׵��������������������������㿿�������������������������������㽽������������⫫���������⫬��㽽������������������������������������
���⩨�������ỻ�������������������������⹹�������������������������������������������������������������Ḹ������������������������Ḹ������ᢢ��������෷��������������෷������������������߷���������������߷�����������������������������෷������������
��������߷����������������߷������߷��������߷���������۷�  $"#$)')"*()$#'& !
#!
������������������������������������������������
���������������������������
������������������
�������ﵵ����������������������������������������	���������������������	����������������������G::�����������������������G::����	�������������������G::�����������������������::�������������������:�����
ܟ����������������
�����������������������
������������������������
��������������������������Ľ����������������������������������������������������������������������������������
�����������������½������ӵ������������!���������������������������������������������������������������������������������������������������������������������������������������������������������
����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
		
	�������������������������r��G��"������������������������������������������������������������������������������!�*�2@AABCE�@2####$)# "!"%#&$&% "
��������ͯ��������������˺�����������������ƹ����������������������
������������
�����������|�|�|
�Ŀ��þ������y�����y��y
������Ŀ������v��vv�v�v��������������sߎss�s�sr������������u��p�p�p�p�������������u��p�p�p�p�����������½�u��o�o��o�or�����������þ�u���o�������������Ŀ�u���os��������������ſ�u��o������r�s�rq��������������ƿ�v���o�������������������������������ƽ����o��������º�������������������o������¼�������������������o�������þ�����������������o��������¾���������������o������
�¿������������������o��������
���¼�������������o����������������������������������à�������������������������Ÿ����������������������������������������������������������	���������������������������������������	������������ÿ����������������������������������������������������������������������������������������������������������������������	�������������������������������������������������������������������������������������������������������������������������������������������������������߲���������������������ۗ�#####****'"$!&
"" $
�������������������������������������������������
�������������������������������������������
���������������
�������������������
�������������韟����μ����������诜�����������������	w�������ͻ����������	w�������Ͻ����������	w��������������������w������������������w�������ý������������w��&������������������������������������z������	������������������ɰ�������������ϵ���������������������������������嵵�������������ź������������������������������������Ǽ���������������������������½������Į��������������������������ϳ����������
��������������׵����������������	�������㿿��������������㮮�������������������㽽�����������������������㽽��������������������������������������������ỻ�������������������������⹹��������������������������������������������Ḹ������������������������Ḹ�����ࢡ�����������������෷��������������෷������������������߷�������������������߷�����������������������������෷������������
��������߷����������������߷������߷��������߷���������۷�#""" '+)*&)&#&


������������������������������������������������
���������������������������
�����������������
�����ﵵ���������������������������������������������������������������������������������G::������������������������G::������������������������G::������������������������::�������������������:�����
ߴ��������������������������������������������������������
������������%�������������������������������������������������������������������������������������������������������������������������������	��������������!����������������������������������������ihgf�ef�g������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������>��������������������������������������������������������������������T7���������������������������������������������������������
		
	�������������������������r��G��"�����������������������������	�������������������������������������������������!�*�2@AABCE�@2!) *--&-) $+'#$#$+"&$%'$"'#&#&%"!�������ͯ�����������˺����������������ƹ������������������������
������������������
����������������������������إĿ��þ����������������
������Ŀ������������	���������
�Ջ������������������������������Ҋ������������u�������������������ҋ������������u�������������������������½�u����������������Ћ�����������þ�u��������������ϋ������������Ŀ�u�������ȋ�������������ſ�u�����̓����������������������ƿ�v����͍����������������Ļ�������������ƽ��������������ʺ����������������������������ͼ��������������������������;�������������������������
���ɾ�������������������������ſ�������������������������������������¿��������������������������¿����������������������������������������������������������	���������������������������
������������	��������������������������������������������������������
�������������������������������	������������ÿ�������������������������������������������ӿ��������������������������������	����������������������������������������������	�����������
�������ӽ����������������������ƾ��������������������������������������������Ѽ������������������������������Ӿ��������������������������������������	�������������������������������������������������������������������������������������ۗ�% *!)**..* /0%,-!'*'()&!'!"$)# %$ x�����������������x��������������������������x������
�����������x�������������w�vw�vw�vwvww������������s�s�s
������������nonoonnonnonnoon�nn�n
onn�������������j��kjj��j�j��j
������������gf�g
�ggf�g�gf��gg�g
hg��μ����������b��b�b�b�cb�bc�b��ͻ����������	w��b�b�b�b�cb�bc�b��ͻ����������	w��_^�_��_ �^^��__�__^_^_^��Ͻ����������	w��\]]\[]�\]�\��]�\\�\]\\��п�����������w��[YZY�Z�[Z[[Z�[Z[[Z���������������w��YXYXYX�Yi���ý������������w��YXYXYXY����������������������������������z��YXYXYX�����������������lo��ɰ�������������ϵ�YXYXY������y~�������������������YXYX����������~�����ź���������������YXY�����������������}�����Ǽ�������������YX������{�����½������Į��Y���������xy�������������ϳ�Y�������������wz�����������������Ե�Y��������	�w���������	�������Ե������
wy���������������ص��������������ww�����������������ٵ������������������xv��������������Ա������������w����������������ײ��������w��w��������ٲ�����
����|��v��������ٳ����������
����x����w����������޵��������x����߁v��������߷���������y���ͫ~�vz����෷��������y�ۮ�wvvwyxvx����z����Ḹ�����������	�w��vw}����
��vw}�~{���Ḹ��������{vy�������ҧ�}�����෷�����ߝyw�����������෷��������{z|���������߷��������߷v}�x�����������������߷���������vy�w����������������෷��
�����yv�x�����
��������߷��������v�y���������߷������}���߷��������߷���������۷�)+"$('&(0-/-1'.+-&'%' %"' #!$(�h�������������������������(�h������������������(�h��
������������(�h�������������&�'
&''&'&''&'&'&'�&'&''������������$�$�$
�����ﵵ��� ���  � �  �����������
������������������	�����������������������������������G::�������������������G::��������������������G::����
�
��
�
��
������������::���!

�









��������������:���

�

�



�

,����������������

�

�����������������������
�������

�
���������IG�������
����������



��%���������������YDN��������������������


������KOoz�������������������

��������������KQ`��������������������

�������������WGO��������	����������

�����!�����������kBE��������������������
������������@E������������������������������@O����������������������������������
@D�����������������������������A@��������������������������D@i�����������������������������
TUaA�����������������������A��A]��������������������������������_I�y@���������������������Cr��OA�������������������lD���R@S�������������Ee���כN�@FPi����������fD��]B@@BEC@Do��sGU���������	�BUYAALv���
�TABMUNI�������������H@Dd���^MV�������������EB������������HHKU�������������������@LnD����������@E�C��������F@�Dg�����������@WEd����������OT��������������������������
									
	���������������������r��G��"����������������������������������������������!�*2@AABCE�@2  #%($(($)&&&$$)&"#$% ($$$' !
�����ͯ���������˺�������������ƹ������������������������������
��������������������������������������
����Ŀ��þ���������������������Ŀ��������������������Ž���������������������ļ�����������u��������Ž�����������u���������������Ž���������½�u���������ƿ����������þ�u���������������������������Ŀ�u�����������������������������ſ�u������������������������ƿ�v��������������������������������ƽ���������������º�{wrqnu������������������������¼~yzvtmn����������������������þ~z���zl���������������������¾������r�������������������
�¿������|����������������������������¿������~�����������������
����������������������������
�»���������à�����������������������Ÿ��������	������������������������������������������������������������	���������������������	������������ÿ��������������������������������������������������������������������������
������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������߲�������������������ۗ�!#!#&$'''%))#&)%')(%##!(!#%( %$
������������������������������������������
��������������������������������	�����������
���������������������������������������
������������������������������������������������μ����������������������ͻ����������	w����������������ͻ����������	w�����������������Ͻ����������	w�������������������п�����������w�����������������������������w���������������ý������������w���	������揗����ܑ������������������z����	������搝���⑎��ɯ�������������ϵ���������⏎�ث��������������������������⏎�ڢ������������������%������咜������Ꮞ�ۣ�������������������������������ļ�½���������Į����䐗�����������ɱ�������ϳ���%������䑐������㛖�ޫ��ά����������׵�����������⏏�䭭�ذ����������㿿����������������������������������������㽽������������	�������������㽽���������������������������������������������������������ỻ���������������������������⹹���������������������������������������������������
���������������������Ḹ��
�������������������������Ḹ��������������෷��������������෷������������������߷�������������������������������߷�����������������������������෷������������
��������߷����������������߷������߷��������߷�������۷�!"&$&%%'(%)%(())&$'&&!'#!"#
��������������������������������������������
�������������������
�������������������������	�������������
������ﵵ�����������������������������������������������������	������������������������������������������G::���������������������������G::����������������������������G::������������������������������::���������$*,,+()(+�������������:����������$*//.+*)*-����������������	�������$8�	��+)������
�������������'G���)%�������
�����������%�������,G�������$%���������������������,F�����$$��������������������������,E������$$����������������������������+B�������������������������������!���'8���������������������������%�������*'=EEBB�A9���������������������
�������&'('�$	��$%�������������������������������������������������������������������������������������S���+&��20��&%&5��������������	�����������������������������������������������������������������������
�' ��+)����������������������������������
�����������������������������������Ib`^`H���-+������������	��������������������������������������������������������������������������������������������
			������������������������r��G��"�����������������������������������������������������������������������������!�*�2@AABCE�@2'(,,,,*+))++*+))((((%&)$'&'%'(!
�������ͯ�����������˺��������������ƹ���������
�����������
������������������
��������������������
�Ŀ��þ����������	�������
������Ŀ��������������������������������������������������������������u�����
�����������������������������u�����
���������������������������½�u��~��~
�~��~�~~�~~�~��~f�����������þ�u���}h�x���������Ŀ�u���}m�������������ſ�u��}���������od{oxqqrp��������������ƿ�v���}���������|x���i�������{|tqqhq�����ƽ����}����������u���������oltrsh{����������}��������������㺙��x�|rppe����������}�����������¿���آ�w��vpnjm��������}����� �����������լ��}�ZZeese��������}���� �����������ѳ���s��s��x���������}��%����Ê��u}��������ѷ��y�������w�������}�����������������̹���ϼ�����v������%����‚������������Ĵ���ʺ�����t����à����� ������������ȹ����ŷ�����s����Ÿ����� ������������������������r����������� �������������������������y����������� ������������������z}���������������	����������������������{����������ÿ���s������������������v����������������{����	��������������}�����������������w�������������x������������������l�������}{|~���w�����������������l����~|zyvv|���}�����������������������tq��|{yyz}���kv�������������������mq}�����ylm��������������������������{nojjlo|������������������������������������������������������������������������������������������
�������������������������������������������������߲���������������������ۗ�#'(,,,,*+(*+*++*'))(($'%!()%%'()&
���������������������������������������������
�������������
�������������
���������������������
����������������������
�������������������	���������
��������������������������������μ�����������˽�������˽����������ͻ����������	w�����
������������������ͻ����������	w�����
������������������Ͻ����������	w�����
�������������������������������w�������������������w��������������������w��&�����������������������������������z������%�����������������������������������ϵ�������­���������������������������������פ��������ϴ��������������������%�����䰼�����¾���㻪��������������������� ڪ����զ��������|~���������Į�����!����©�����ȶ��������������ϳ�����%����䮵���������̷��������������׵������ �������������������ÿ��������㿿������������������˾����ÿ���������%����⦷������������ź����¿��������㽽��%����㣷�����������ǽ��������������㽽���� ������������ý����������������⼼��������������������������������⻻����Ϥ����������������������ỻ��	�����☱������������
�����������⹹���������������������������������������������������������������ѐ������������������������Ḹ��%�������ᾐ�������������������������Ḹ�������������������������������෷�����ݼ������������������������෷��������ı�����������������߷���������������ҿ������������������߷���%���������������ǿ������������������෷����������������������������߷�����������������߷������߷��������߷���������۷�'(,+++**+)*++++)()(" #'&$" 
����������������������������������������������
�������������
�������������
�����������������
�����ﵵ�������������������E�E��	�E��E���������������D����D�����������������D���D�����������������G::�����
������������������G::�����
������������������G::�����
��������������������::������������������:����	����������������&������������s���������������������������о�ZG@FZ������Ͱ����������������%���������U?Jq�`������Մ��������������������^?;;TG�������û�{������������������ ��@=89VF8������FEMewu������������%�������I?:8N>k�������ڔ<DS[mt��������������!��B>98R��������8H����_�����������
������wBIDi�������P4@ABP~����������%������V�����������e05:=AEe�������
�������[���������.26:=@BK����������� ��t{���������/36:>ABB��������
����������������248<?ABA�������� �����������������g69C>ABD�������������䄯�gBBQ�������������������CBl������������CA��������������������cBQ�����������������MA��������������������������?o���������������������������b�����������������������������������������������������
��������������������������������������������������������������������������������������������������������������������������������������
		
	�������������������������r��G��"������������������������������������������������������������������������������!�*�2@AABCE�@2%!&'+*.*!)#""!#)!(&"))&%% !
~�������ͯ���~����������˺��������~��������ƹ��������~������������}�~}~}~~}�~}~�}�~}��Ų��������{
����������wx�w�xwx�w�x�w
����þ������t���ߏt����tt���ߏ�t
������Ŀ������r�rr��r�r�r�r�r��������������onno�o	���oon���on�������������u��onno�o��onno�ދ�on�������������u��m�l&�mm��m�mm��l�lm��lmlm�����������½�u��j���݇j���݇j����j������������þ�u��i�j�ij�������������Ŀ�u��hg�hm��������������ſ�u��h�����������������������ƿ�v���h�������������������������������ƽ����h��������º�v�����������������h�������¼�������������������h�������øj����������������h��������™z��������������h����ž��
��~����������������������������ij������±t���t{������������������q����‘�����q�������������÷�q������u�����¨|q�����à�������q��������������|q����Ÿ�����|q�������������vq�����������qv���������q����������q��������������qv���������q��������%���������q|����v�������q���������������ÿ��������������������������������������������������������������������������������������������������������������������������������
����������������������������������������������������������������������������������������������������������������������������������������������������������������������߲���������������������ۗ�%%!&'+*.*)*&**(%((%%("" %$
~�����������������~��������������������������~������
�����������~�������������}�~}~}~~}�~}~�}�~}������������{
������������wx�w�xwx�w�x�w
�������������t���ߏt����tt���ߏ�t
�������������r�rr��r�r�r�r�r���Ļ���������onno�o	���oon���on���õ���������	w��onno�o��onno�ދ�on���Į���������	w��m�l&�mm��m�mm��l�lm��lmlm���Ŭ���������	w��j���݇j���݇j����j���ǰ����������w��i�j�ij���ɴ�����������w��hg�hp���ʽ������������w��h	����������������������������������z���h��	������������������̰�������������ϵ��h�������ظ�����������������h������������ښ�����������������h�����������������������������������h���������᳑��½������Į�h��������������ᕶ�����������ϳ����������Ѡ������ω��Պ�����������׵������צ���������ʙ����������㿿����׬����݌��ē����������ܲ���������������㾓������㽽�����Ⓡ�����������������Ѝ����㽽����֫�������Ї��������׫��������ܱ������⫫��ܫ��������ܫ�����܍�����⾇��������ỻ���������֥��ᾙ������������⹹�����������������������ə��������������������������Ḹ������������������������Ḹ��������������෷��������������෷������������������߷�������������������������������߷�����������������������������෷������������
��������߷����������������߷������߷��������߷���������۷�%!&'+)-))'+"*(+(()) ("&!

~���������������������������~��������������������~����
������������~��������������}�~}~}~~}�~}~�}�~}������������{
�����ﵵ���wx�w�xwx�w�x�w���������t���ߏt����tt���ߏ�t�����������r�rr��r�r�r�r�r������������onno�o	���oon���on�������������G::���onno�o��onno�ދ�on�����������G::���m�l�mm��m�mm��l�lm��lmlm�����������G::���j���݇j���݇j����j������������::���i�j�i	j��������������:���hg�h
s����������������h
�����������������������
�������h�����������������
����������h��%��������������������Ѧ���������������h����������ﱷ����������������h������������������������������������h����������������Ǧ�����	���������h�����!�������������������������������������������������럨����������������������캛���������߮����������
�����������������ڧ�������������!�ƛ��������ӭ��������ӧ������������������������	桛��������������������������������ƛ���������������������������������ӛ������������Ӯ������������������������������������������߮��������������������������������������������������������������������������������������������������������������������������������
		
	�������������������������r��G��"������������������������������������������������������������������������������!�*�2@AABCE�@2%$ !--%!(%%&&$)%$#&&%%%(
��������ͯ��������������˺�����������������ƹ����������������������������������������Ų���������
�����������������������
�Ŀ��þ���������
������Ŀ������~�����������������|�|�|�|�������������u��{�z�{�z{�{�z�z{�z{z{�������������u��{�z�{�z{���z�z{�z{z{�����������½�u��x�y�x�xxyyx�x������������þ�u��wx��wx�������������Ŀ�u��vu�vz��������������ſ�u��v�����������������������ƿ�v���v�����������{�uy�~|uromkkmq����ƽ����v�����������º������o��s���������v����������¼�����n���n���������v����������þ�����i��k��������v�������ń���¾�����n��o��������v�����������~{z��x��������������%��������Ä��������¿�����zy|������������������������������������„��������������à�������„����������������Ÿ�����������������������������������������������������������������	����������������������������������ÿ������������������������������������������������������������������������������������������������������������������������������������
��������������������������������������������������������������������������������������������������������	�������������������������������������������������������������������������������������������߲���������������������ۗ�%%$ &--%))$&+&))"&!!!&!#'
p�����������������p��������������������������p������
�����������p�������������o�popoppo�pop�o�po������������m�m
������������ij�i�jij�ij�j�i
�������������f���f�f
������������dcdd�d�d�d��μ����������a``�a�a`a�`�a`��ͻ����������	w��_�^�_�^_�_�^�^_�^_^_��ͻ����������	w��_�^�_�^	_����^�^_�^_^_��Ͻ����������	w��\�]�\�\\]]\�\��п�����������w��[\��[\���������������w��ZY�Zd���ý������������w��Z	����������������������������������z���Z����������������������������������ϵ��Z����֪����������������������Z�������������ź���������������Z���������������	�����Ǽ��������������Z�����������������½���������Į�Z����������������ɕ��ϝ�����ϳ�����������������������Η���������׵������������������������㿿��������������������������������������㽽���������������������㽽���������������������������������������������������ỻ������������������⹹������	�������������������������������������	�������������������Ḹ��������������������Ḹ��������������������෷��������ߣ�����������෷�����������������������߷��������ҩ��������������Ҫ�ߪ�����߷���������ҩ�������������෷������������
��������߷����������������߷������߷��������߷���������۷�%$ !,,$)(+&**)('#'!&
������������������������������������������������������
�������������������������������������������������������
�����ﵵ�������������������������������������~���������������|�|�|�|�������������G::���{�z�{�z{�{�z�z{�z{z{�����������G::���{�z�{�z{���z�z{�z{z{�����������G::���x�y�x�xxyyx�x������������::���wx��w	x��������������:���vu�v
�����������������v
����������������������
�������v��������ʯ����������������������v��%����������������������ȿ��ȯ�������v����������������˨��ʨ��������v�����������������������̣��ɦ��������v����������������������ת��Ӫ�������v��������������������������������������������������������嵴����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
		
	�������������������������r��G��"������������������������������������������������������������������������������!�*�2@AABCE�@2%!"%--&#!(%%&&$)%$#&&%%%(
��������ͯ��������������˺�����������������ƹ����������������������������������������Ų��������
������������������������
�Ŀ��þ������������
������Ŀ������~����~����������������|��|�|��|�|�������������u��{�z�{z�{z{�{{��{�z{z{�������������u��{�z�{z����{{��{�z{z{�����������½�u��x�y�x��x�yx�x������������þ�u��w�xx�w�wx�������������Ŀ�u��vu�vz��������������ſ�u��v�����������������������ƿ�v���v�����������{�uy�~|uromkkmq����ƽ����v�����������º������o��s���������v����������¼�����n���n���������v����������þ�����i��k��������v�������ń���¾�����n��o��������v�����������~{z��x��������������%��������Ä��������¿�����zy|������������������������������������„��������������à�������„����������������Ÿ�����������������������������������������������������������������	����������������������������������ÿ������������������������������������������������������������������������������������������������������������������������������������
��������������������������������������������������������������������������������������������������������	�������������������������������������������������������������������������������������������߲���������������������ۗ�%%!"*--&#))$&+&))"&!!!&!#'
p�����������������p��������������������������p������
�����������p�������������o�popoppo�pop�o�po������������m
������������ij�i�jij�i�j�i
�������������f���f�gf��f
������������dc��d�d�c��d��μ����������a``�a��a�a��`�a`��ͻ����������	w��_�^�_^�_^_�__��_�^_^_��ͻ����������	w��_�^�_^����__��_�^_^_��Ͻ����������	w��\�]�\��\�]\�\��п�����������w��[�\\�[��[\���������������w��ZY�Zd���ý������������w��Z	����������������������������������z���Z����������������������������������ϵ��Z����֪����������������������Z�������������ź���������������Z���������������	�����Ǽ��������������Z�����������������½���������Į�Z����������������ɕ��ϝ�����ϳ�����������������������Η���������׵������������������������㿿��������������������������������������㽽���������������������㽽���������������������������������������������������ỻ������������������⹹������	�������������������������������������	�������������������Ḹ��������������������Ḹ��������������������෷��������ߣ�����������෷�����������������������߷��������ҩ��������������Ҫ�ߪ�����߷���������ҩ�������������෷������������
��������߷����������������߷������߷��������߷���������۷�%!"%,,%#)(+&**)('#'!&
������������������������������������������������������
������������������������������������������������������
�����ﵵ�����������������������������������������~����~��������������|��|�|��|�|�������������G::���{�z�{z�{z{�{{��{�z{z{�����������G::���{�z�{z����{{��{�z{z{�����������G::���x�y�x��x�yx�x������������::���w�xx�w�w	x��������������:���vu�v
�����������������v
����������������������
�������v��������ʯ����������������������v��%����������������������ȿ��ȯ�������v����������������˨��ʨ��������v�����������������������̣��ɦ��������v����������������������ת��Ӫ�������v��������������������������������������������������������嵴����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
		
	�������������������������r��G��"������������������������������������������������������������������������������!�*�2@AABCE�@2%" #--'!(%%&&$)%$#&&%%%(
��������ͯ��������������˺�����������������ƹ����������������������������������������Ų��������
����������������������
�Ŀ��þ������������
������Ŀ������	~�������������������|�||�|�|�������������u��{�z�{z�{z{�{{z�z{�z{z{�������������u��{�z�{z�{z{��z�z{�z{z{�����������½�u��x�y�x�x���x������������þ�u��w�x�wx�������������Ŀ�u��vu�vz��������������ſ�u��v�����������������������ƿ�v���v�����������{�uy�~|uromkkmq����ƽ����v�����������º������o��s���������v����������¼�����n���n���������v����������þ�����i��k��������v�������ń���¾�����n��o��������v�����������~{z��x��������������%��������Ä��������¿�����zy|������������������������������������„��������������à�������„����������������Ÿ�����������������������������������������������������������������	����������������������������������ÿ������������������������������������������������������������������������������������������������������������������������������������
��������������������������������������������������������������������������������������������������������	�������������������������������������������������������������������������������������������߲���������������������ۗ�%%" (--'))$&+&))"&!!!&!#'
p�����������������p��������������������������p������
�����������p�������������o�popoppo�pop�o�po�����������m�m
������������ij�i�jij�ii�j�i
�������������f��f��܄�f
������������d	c�ۂd�ۂd�d��μ����������a``�a�aa�aa`�a`��ͻ����������	w��_�^�_^�_^_�__^�^_�^_^_��ͻ����������	w��_�^�_^�_^_��~^�^_�^_^_��Ͻ����������	w��\�]�\�\�|��{�\��п�����������w��[�\�[\���������������w��ZY�Zd���ý������������w��Z	����������������������������������z���Z����������������������������������ϵ��Z����֪����������������������Z�������������ź���������������Z���������������	�����Ǽ��������������Z�����������������½���������Į�Z����������������ɕ��ϝ�����ϳ�����������������������Η���������׵������������������������㿿��������������������������������������㽽���������������������㽽���������������������������������������������������ỻ������������������⹹������	�������������������������������������	�������������������Ḹ��������������������Ḹ��������������������෷��������ߣ�����������෷�����������������������߷��������ҩ��������������Ҫ�ߪ�����߷���������ҩ�������������෷������������
��������߷����������������߷������߷��������߷���������۷�%" #,,&)(+&**)('#'!&
������������������������������������������������������
������������������������������������������������������
�����ﵵ����������������������������������������	~�����������������|�||�|�|�������������G::���{�z�{z�{z{�{{z�z{�z{z{�����������G::���{�z�{z�{z{��z�z{�z{z{�����������G::���x�y�x�x���x������������::���w�x�w	x��������������:���vu�v
�����������������v
����������������������
�������v��������ʯ����������������������v��%����������������������ȿ��ȯ�������v����������������˨��ʨ��������v�����������������������̣��ɦ��������v����������������������ת��Ӫ�������v��������������������������������������������������������嵴����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
		
	�������������������������r��G��"������������������������������������������������������������������������������!�*�2@AABCE�@2%"!$--(!(%%&&$)%$#&&%%%(
��������ͯ��������������˺�����������������ƹ����������������������������������������Ų���������
�����������������������
�Ŀ��þ�������������
������Ŀ������~��~���������������|���||�|�|�������������u��{�z�{�z	���{�{z{�{�z{z{�������������u��{�z�{�z	{��{�{z{�{�z{z{�����������½�u��x�y�x���xx�yxx�x������������þ�u��w�x�wx�������������Ŀ�u��vu�vz��������������ſ�u��v�����������������������ƿ�v���v�����������{�uy�~|uromkkmq����ƽ����v�����������º������o��s���������v����������¼�����n���n���������v����������þ�����i��k��������v�������ń���¾�����n��o��������v�����������~{z��x��������������%��������Ä��������¿�����zy|������������������������������������„��������������à�������„����������������Ÿ�����������������������������������������������������������������	����������������������������������ÿ������������������������������������������������������������������������������������������������������������������������������������
��������������������������������������������������������������������������������������������������������	�������������������������������������������������������������������������������������������߲���������������������ۗ�%%"!)--())$&+&))"&!!!&!#'
p�����������������p��������������������������p������
�����������p�������������o�popoppo�pop�o�po������������m�m
������������ij�i�jiji�i�j�i
�������������f����f��܃�f
������������dcۂ�d�ddc�d��μ����������a``�a��a`�a``�a`��ͻ����������	w��_�^�_�^	~��_�_^_�_�^_^_��ͻ����������	w��_�^�_�^	_}�_�_^_�_�^_^_��Ͻ����������	w��\�]�\���\\�]\\�\��п�����������w��[�\�[\���������������w��ZY�Zd���ý������������w��Z	����������������������������������z���Z����������������������������������ϵ��Z����֪����������������������Z�������������ź���������������Z���������������	�����Ǽ��������������Z�����������������½���������Į�Z����������������ɕ��ϝ�����ϳ�����������������������Η���������׵������������������������㿿��������������������������������������㽽���������������������㽽���������������������������������������������������ỻ������������������⹹������	�������������������������������������	�������������������Ḹ��������������������Ḹ��������������������෷��������ߣ�����������෷�����������������������߷��������ҩ��������������Ҫ�ߪ�����߷���������ҩ�������������෷������������
��������߷����������������߷������߷��������߷���������۷�%"!$,,')(+&**)('#'!&
������������������������������������������������������
�������������������������������������������������������
�����ﵵ������������������������������������������~��~�������������|���||�|�|�������������G::���{�z�{�z	���{�{z{�{�z{z{�����������G::���{�z�{�z	{��{�{z{�{�z{z{�����������G::���x�y�x���xx�yxx�x������������::���w�x�w	x��������������:���vu�v
�����������������v
����������������������
�������v��������ʯ����������������������v��%����������������������ȿ��ȯ�������v����������������˨��ʨ��������v�����������������������̣��ɦ��������v����������������������ת��Ӫ�������v��������������������������������������������������������嵴����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
		
	�������������������������r��G��"������������������������������������������������������������������������������!�*�2@AABCE�@2%!$%#--$!(%%&&$)%$#&&%%%(
��������ͯ��������������˺�����������������ƹ����������������������������������������Ų��������
������������������������
�Ŀ��þ�������������������
������Ŀ�������~��~����������������|��|��|���|�������������u��{�z%�{zz{z{{�{z{z{�zz{z{�������������u��{�z%�{zz�z{{�{z{z{�zz{z{�����������½�u��xy��~�x�y�x������������þ�u��w�x�wx�������������Ŀ�u��vu�vz��������������ſ�u��v�����������������������ƿ�v���v�����������{�uy�~|uromkkmq����ƽ����v�����������º������o��s���������v����������¼�����n���n���������v����������þ�����i��k��������v�������ń���¾�����n��o��������v�����������~{z��x��������������%��������Ä��������¿�����zy|������������������������������������„��������������à�������„����������������Ÿ�����������������������������������������������������������������	����������������������������������ÿ������������������������������������������������������������������������������������������������������������������������������������
��������������������������������������������������������������������������������������������������������	�������������������������������������������������������������������������������������������߲���������������������ۗ�%%!$%'--$))$&+&))"&!!!&!#'
p�����������������p��������������������������p������
�����������p�������������o�popoppo�pop�o�po������������m
������������ij�i�jij�i�j�i
�������������fm��m�f�ffgff��f
������������d�dcd�d�ddcdd��d��μ����������a``aa��a��`���a`��ͻ����������	w��_�^%�_^^_^__�_^_^_�^^_^_��ͻ����������	w��_�^%�_^^�^__�_^_^_�^^_^_��Ͻ����������	w��\]e��d�\�]�\��п�����������w��[�\�[\���������������w��ZY�Zd���ý������������w��Z	����������������������������������z���Z����������������������������������ϵ��Z����֪����������������������Z�������������ź���������������Z���������������	�����Ǽ��������������Z�����������������½���������Į�Z����������������ɕ��ϝ�����ϳ�����������������������Η���������׵������������������������㿿��������������������������������������㽽���������������������㽽���������������������������������������������������ỻ������������������⹹������	�������������������������������������	�������������������Ḹ��������������������Ḹ��������������������෷��������ߣ�����������෷�����������������������߷��������ҩ��������������Ҫ�ߪ�����߷���������ҩ�������������෷������������
��������߷����������������߷������߷��������߷���������۷�%!$%#,,#)(+&**)('#'!&
������������������������������������������������������
������������������������������������������������������
�����ﵵ��������������������������������������������������~��~��������������|��|��|���|�������������G::���{�z�{zz{z{{�{z{z{�zz{z{�����������G::���{�z�{zz�z{{�{z{z{�zz{z{�����������G::���xy��~�x�y�x������������::���w�x�w	x��������������:���vu�v
�����������������v
����������������������
�������v��������ʯ����������������������v��%����������������������ȿ��ȯ�������v����������������˨��ʨ��������v�����������������������̣��ɦ��������v����������������������ת��Ӫ�������v��������������������������������������������������������嵴����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
		
	�������������������������r��G��"������������������������������������������������������������������������������!�*�2@AABCE�@2%$ !--%!(%%&&$)%$#&&%%%(
��������ͯ��������������˺�����������������ƹ����������������������������������������Ų���������
�����������������������
�Ŀ��þ���������
������Ŀ������~�����������������|�|�|�|�������������u��{�z�{�z{�{�z�z{�z{z{�������������u��{�z�{�z{���z�z{�z{z{�����������½�u��x�y�x�xxyyx�x������������þ�u��wx��wx�������������Ŀ�u��vu�vz��������������ſ�u��v�����������������������ƿ�v���v�����������{�uy�~|uromkkmq����ƽ����v�����������º������o��s���������v����������¼�����n���n���������v����������þ�����i��k��������v�������ń���¾�����n��o��������v�����������~{z��x��������������%��������Ä��������¿�����zy|������������������������������������„��������������à�������„����������������Ÿ�����������������������������������������������������������������	����������������������������������ÿ������������������������������������������������������������������������������������������������������������������������������������
��������������������������������������������������������������������������������������������������������	�������������������������������������������������������������������������������������������߲���������������������ۗ�%%$ &--%))$&+&))"&!!!&!#'
p�����������������p��������������������������p������
�����������p�������������o�popoppo�pop�o�po������������m�m
������������ij�i�jij�ij�j�i
�������������f���f�f
������������dcdd�d�d�d��μ����������a``�a�a`a�`�a`��ͻ����������	w��_�^�_�^_�_�^�^_�^_^_��ͻ����������	w��_�^�_�^	_����^�^_�^_^_��Ͻ����������	w��\�]�\�\\]]\�\��п�����������w��[\��[\���������������w��ZY�Zd���ý������������w��Z	����������������������������������z���Z����������������������������������ϵ��Z����֪����������������������Z�������������ź���������������Z���������������	�����Ǽ��������������Z�����������������½���������Į�Z����������������ɕ��ϝ�����ϳ�����������������������Η���������׵������������������������㿿��������������������������������������㽽���������������������㽽���������������������������������������������������ỻ������������������⹹������	�������������������������������������	�������������������Ḹ��������������������Ḹ��������������������෷��������ߣ�����������෷�����������������������߷��������ҩ��������������Ҫ�ߪ�����߷���������ҩ�������������෷������������
��������߷����������������߷������߷��������߷���������۷�%$ !,,$)(+&**)('#'!&
������������������������������������������������������
�������������������������������������������������������
�����ﵵ�������������������������������������~���������������|�|�|�|�������������G::���{�z�{�z{�{�z�z{�z{z{�����������G::���{�z�{�z{���z�z{�z{z{�����������G::���x�y�x�xxyyx�x������������::���wx��w	x��������������:���vu�v
�����������������v
����������������������
�������v��������ʯ����������������������v��%����������������������ȿ��ȯ�������v����������������˨��ʨ��������v�����������������������̣��ɦ��������v����������������������ת��Ӫ�������v��������������������������������������������������������嵴����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������|||||zzz{{zzz{{xxyyxwwwwwmmmmmijiiifffffddddd`aaaa^^^__^^^__\\]]\[[[[[���������������|||||zzz{{zzz{{xxyyxwwwww������������������������������������������������������������|||||zzz{{zzz{{xxyyxwwwwwmmmmmijiiifffffddddd`aaaa^^^__^^^__\\]]\[[[[[���������������|||||zzz{{zzz{{xxyyxwwwwww�w����"w��w���"�w��w�D��w���"f�w�"��"f��w��w�"��w�����w�"�����"�"�"�"���������������������������
		
	�������������������������r��G��"������������������������������������������������������������������������������!�*�2@AABCE�@2%%$%,,.)!)#""!#)!(&"))&%% !
~�������ͯ���~����������˺��������~��������ƹ��������~������������}�~}~}~~}�~}~�}�~}��Ų��������{�{
����������wx�w�xwx�w�x�xx�w
����þ������t�t��t�����t�t
������Ŀ������r���r�ύ�r��r�r��������������onnoo��oo�on�on�o�on�������������u��onnoo��oo�on�on�o�on�������������u��m�l�ߟ�m�mm�ml�l�lmlm�����������½�u��jއj��j�jj�kj�j�j������������þ�u��i�j�ij�������������Ŀ�u��hg�hm��������������ſ�u��h�����������������������ƿ�v���h�������������������������������ƽ����h��������º�v�����������������h�������¼�������������������h�������øj����������������h��������™z��������������h����ž��
��~����������������������������ij������±t���t{������������������q����‘�����q�������������÷�q������u�����¨|q�����à�������q��������������|q����Ÿ�����|q�������������vq�����������qv���������q����������q��������������qv���������q��������%���������q|����v�������q���������������ÿ��������������������������������������������������������������������������������������������������������������������������������
����������������������������������������������������������������������������������������������������������������������������������������������������������������������߲���������������������ۗ�%%%$%,,.))*&**(%((%%("" %$
~�����������������~��������������������������~������
�����������~�������������}�~}~}~~}�~}~�}�~}������������{�{
������������wx�w�xwx�w�x�xx�w
�������������t�t��t�����t�t
�������������r���r�ύ�r��r�r���Ļ���������onnoo��oo�on�on�o�on���õ���������	w��onnoo��oo�on�on�o�on���Į���������	w��m�l�ߟ�m�mm�ml�l�lmlm���Ŭ���������	w��jއj��j�jj�kj�j�j���ǰ����������w��i�j�ij���ɴ�����������w��hg�hp���ʽ������������w��h	����������������������������������z���h��	������������������̰�������������ϵ��h�������ظ�����������������h������������ښ�����������������h�����������������������������������h���������᳑��½������Į�h��������������ᕶ�����������ϳ����������Ѡ������ω��Պ�����������׵������צ���������ʙ����������㿿����׬����݌��ē����������ܲ���������������㾓������㽽�����Ⓡ�����������������Ѝ����㽽����֫�������Ї��������׫��������ܱ������⫫��ܫ��������ܫ�����܍�����⾇��������ỻ���������֥��ᾙ������������⹹�����������������������ə��������������������������Ḹ������������������������Ḹ��������������෷��������������෷������������������߷�������������������������������߷�����������������������������෷������������
��������߷����������������߷������߷��������߷���������۷�%%$%,+-()'+"*(+(()) ("&!

~���������������������������~��������������������~����
������������~��������������}�~}~}~~}�~}~�}�~}������������{�{
�����ﵵ���wx�w�xwx�w�x�xx�w���������t�t��t�����t�t�����������r���r�ύ�r��r�r������������onnoo��oo�on�on�o�on�������������G::���onnoo��oo�on�on�o�on�����������G::���m�l�ߟ�m�mm�ml�l�lmlm�����������G::���jއj��j�jj�kj�j�j������������::���i�j�i	j��������������:���hg�h
s����������������h
�����������������������
�������h�����������������
����������h��%��������������������Ѧ���������������h����������ﱷ����������������h������������������������������������h����������������Ǧ�����	���������h�����!�������������������������������������������������럨����������������������캛���������߮����������
�����������������ڧ�������������!�ƛ��������ӭ��������ӧ������������������������	桛��������������������������������ƛ���������������������������������ӛ������������Ӯ������������������������������������������߮��������������������������������������������������������������������������������������������������������������������������������
			
		�������������������������r��G��"�����������������������������������������8��8���������������������*��@22@AABCE�@2�%!!$-'!!'#""!"+'#+!((&"($&('��������ͯ��������������˺�����������������ƹ����������������������������������������Ų���������
������������������������
�Ŀ��þ��������������
������Ŀ������
����񘘗��������������������������������u���������𕔕�����������������u�����𧒒����������������½�u��������������������þ�u�������������������Ŀ�u��������������������ſ�u�������������������������ƿ�v���������������������������������ƽ�������������º���������������������������¼���������������������������þ��������������������������¾���������������������
�¿��������������������������������������¿�����������������������������������������������������à������������������������Ÿ�������������������
����������������������ș�������������������������ə������	������������ٔ����ș�����������������Ǚ��������������������ߴ��	����ƙ����������������ݴ����������ř������������������ߴ����������Ù�������������������������Ù�������������������ߵ������������������������ݷ������	������������������������޷���������˿�����������������ݸ������������ʾ���������������ݸ����������ɼ������������������ܹ���������Ȼ�������������������ܹ���������Ǻ��������ϔ���ϔǹ����������������������������������������ŷ�������������������%%!!)-'")*&*'*"&*("%#**-( q�����������������q��������������������������q������
�����������q�������������p�qpqpqqp�qpq�p�qp�����������n��n
������������jk�j�kjk�j�k�j
�������������g��g�g����g
������������d
cd�d�d�ddc�d��μ����������a``�a	�a�`�a``�a`��ͻ����������	w��_�^�_}�_^�_�_^_�_�^_^_��ͻ����������	w��\�]{�{\\�\��{�\��Ͻ����������	w��[���\�[�[\��п�����������w��YXY�Yc���������������w��YX�Yc���ý������������w��Y	����������������������������������z���Y��	������������������ɰ�������������ϵ��Y�������������������������Y��������������ź���������������Y���������������������Ǽ�������������Y��������������½������Į�l�������������������������ϳ��l��������������������������������׵��l��������������	�������㿿�l����������l���������������������㽽�l����������㽽�lk�w��������������k�������j~z������~�}�|{�y�~~j��������ỻ�i~j�~j~i����������⹹�h�|�L�Q	T�||h�������g���U�c[�uug�������e~�U�s���s
c�ssf������������Ḹ�e�}�U������j�rqe��������Ḹ�c�|�U�n�����o	b�ppc���������෷�a{y�U�����m�ooa����������෷�`�x�W�{��{j�ll`������߷��^�x�W{||������}l�kk_���������߷��^wv�Xggil����l�ia�ji^�����������෷�\�u�Xxyyz���Ӄ�{	n�hh\������
��������߷��[�s�X�q�r���́�r	i�ggZ����������߷��Zrq�X�l����lf�feZ����߷��Yqjq�qjfY�����߷��X�l�k�jihh�gf�ed�aW������Wmkmjihh�gf�e�d�cac``W�UVWVUVVUWVV�U�V�UWUWVUVVU��%!!$,& )'+"*(+&&%()'#$ #&!������������������������������������������������������
�������������������������������������������������������
�����ﵵ�������������������������������������������
����������������������������������G::�������������������������G::����������������������G::��������������������::������	���������������:������
�����������������
����������������������
�������������������������
�������������%���������������������������������������������������������������������������������������������������������������������������������	����������6�����!����������������������������������6����������������������������������6��������������������������������6�������������������������������6����������������������������������6a���������������6�X=�������������5�X`�����������4C@FH�F�D�C�B�A�@?FCC4��������������4CQ�CQC4���������������2�BJ�#$JBB4�������������1�DI%�/)I==2����0�CI%�;���;/I;;0�������������0�BI%�F��F4I::/�������/�AJ%�8�����8/J99/����������.�@I%�F���F6I88.�������-�>H&�A���A5H66-����������,�>H&�A�����A5H66-�������+�>H&1148���ϼ8�4.H55+������)�=G&�>@K���L�A	7G44)���������(�;G&�:Q���Q�:4G22(�������(�:F&�6^�^�61F11(�������':Q:�X:Q1'��������'�6�5�4�2�10�/'���������&:6:5544�2�1�0�/.2..&���%&%%&%%&�%&%&&%��
		
	�������������������������r��G��"������������������������������������������������������������������������������!�*�2@AABCE�@2%!  -,%!(%%&&$)%$#&&%%%(
��������ͯ��������������˺�����������������ƹ����������������������������������������Ų���������
������������������������
�Ŀ��þ�������ぁ����
������Ŀ������	~��~���������������|�||��|�������������u��{�z�{�z{�{���z{�z{z{�������������u��{�z�{�z{�{z�z{�z{z{�����������½�u��x�y�x�xx���x������������þ�u��w���wx�������������Ŀ�u��vu�vz��������������ſ�u��v�����������������������ƿ�v���v�����������{�uy�~|uromkkmq����ƽ����v�����������º������o��s���������v����������¼�����n���n���������v����������þ�����i��k��������v�������ń���¾�����n��o��������v�����������~{z��x��������������%��������Ä��������¿�����zy|������������������������������������„��������������à�������„����������������Ÿ�����������������������������������������������������������������	����������������������������������ÿ������������������������������������������������������������������������������������������������������������������������������������
��������������������������������������������������������������������������������������������������������	�������������������������������������������������������������������������������������������߲���������������������ۗ�%%! &-,%))$&+&))"&!!!&!#'
p�����������������p��������������������������p������
�����������p�������������o�popoppo�pop�o�po�����������m��m
������������ij�i�jij�i�j�i
�������������f��ff����f
������������d	cdd�dd�ddc�d��μ����������a``�a�a`��`�a`��ͻ����������	w��_�^�_�^_�_~��^_�^_^_��ͻ����������	w��_�^�_�^_�_^�^_�^_^_��Ͻ����������	w��\�]�\�\\���{�\��п�����������w��[��{�[\���������������w��ZY�Zd���ý������������w��Z	����������������������������������z���Z����������������������������������ϵ��Z����֪����������������������Z�������������ź���������������Z���������������	�����Ǽ��������������Z�����������������½���������Į�Z����������������ɕ��ϝ�����ϳ�����������������������Η���������׵������������������������㿿��������������������������������������㽽���������������������㽽���������������������������������������������������ỻ������������������⹹������	�������������������������������������	�������������������Ḹ��������������������Ḹ��������������������෷��������ߣ�����������෷�����������������������߷��������ҩ��������������Ҫ�ߪ�����߷���������ҩ�������������෷������������
��������߷����������������߷������߷��������߷���������۷�%!  ,+$)(+&**)('#'!&
������������������������������������������������������
�������������������������������������������������������
�����ﵵ��������������������������ぁ���������������	~��~�������������|�||��|�������������G::���{�z�{�z{�{���z{�z{z{�����������G::���{�z�{�z{�{z�z{�z{z{�����������G::���x�y�x�xx���x������������::���w���w	x��������������:���vu�v
�����������������v
����������������������
�������v��������ʯ����������������������v��%����������������������ȿ��ȯ�������v����������������˨��ʨ��������v�����������������������̣��ɦ��������v����������������������ת��Ӫ�������v��������������������������������������������������������嵴����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������






			








������%��������������`��*�������*���i���i���k���|��	��������������$�����Z�����������������������M�������������������������������e�����Q��0 �	$99:;;=�9	=;;:99$&�#-.%%- *0'*)����s��}������������~}|����m������������������}������������~}|����m����������¾����ٌ��������������~}|����m�����������������������~}|����m����������������������~}|����m��������������������������	�������������m��H�����������������������m��
_T������������������������������&
�m��	�[~���������������������	�������������{&
�m���]}������������������������xuR
�m��
�_}���������������������	������pmji�m���k}���������������������������������|}�~~}~�}������ƒ~��{z{~�����s�~��x������|���vu�vx������v|��
~�tssts������y|��
~�qqpqq�����x||��
~�llnn|������v||��	|�deik�����z�{�B	|�]`do�������s�h��z�Y[_������|x�h��z�VW]�������r�y��z�UTy������}u�y��z�TT���~�s�x��z�Tj��y~�~y{r�x��z�S��yw�}xzr�v�z�`�qy�|{tzo�h�z�ȗwn�{�vrs�h�{���oit�y�z�{zpyk�t�z��{h�tqrtp�t�	vv��ztkjj�k�l�m�n�o�pqxmqq��l}qwy�{ol��I�ji��$..%%+#)&'$,�����������������������������������������������������������������������������������櫨����������������������������ı��������������������������������ϲ����������������������������̽����
���������հ�����������������������̼�������������������
_x�˻�������������������������(#�����t�˸���������������	��������(#�����s�˴�������������������������q#����������������������	�������������������������������������������������΍��������О�ȣ������ÿ���ụ���;����
�Ѧǜ������Ľ�����������ν�������
�Ɩ�����Ź�������
�Œ����λ���������	�Ŋ����ƶ������j	�Ă���̹������������}��ȱ������������{{�ù������������yx�ƭ�������������xw��������������x����������������w������������Ά��������������ڽ�����������������������������������������	��������������������������������������aލ�(��$"  + "..-!����������������������������������������������������������������������������������������������������������������������������������������̠�������������������}�����������������������������������������������������������������������������������Կ�������������������������������������
Ӷ������������������߻��������������������������������
������������������������������������������
������������������	���������������	��������������������������������������������������������������������������������������������������������������������������������������������������������������	�����������������������������������:��
									
	�����������������������������r���G���"���������������������������������������������������������������*��@22@AABCE�@2�  #%($$''!  !$-)%&.&.,-,-)-+)+,$%
�����ͯ���������˺�������������ƹ������������������������������
��������������������������������������
����Ŀ��þ���������������������Ŀ��������������������Ž���������������������ļ�����������u��������Ž�����������u���������������Ž���������½�u���������ƿ����������þ�u����������������������Ŀ�u������������������������ſ�u�������������������ƿ�v����������������������������ƽ�����������º�������������������������¼�������������������������þ��������������������������¾����������������������
�¿����������������������������������������¿���������������������������������������������������������à��������������������������Ÿ�������������������	��������������������򜜝�����������������򶧭���������񢣤�����������������񴧭�����	������������響��������������̯���zﱧ���������� �e����ε��������ԭ������������������������~N������lx����Ʀ��ý������������������#됡�������\������������뫦�������������������Ŭ�����߯������������骦���������������蝽�=��ym�˓�����������試��������������������rO��K�Ԕ����������姦�������������Ʀ��Ё�z����}~�䥦�������������������������Ƨilpx}���oim}⤥���������������i�� c���kafih{�o���u{ࣥ�������������c:u��«yf[Y]d{�u�t�`�_ޢ�����������������ba[H9@ETn_STofg���lpmܡ������������������\;;9<;?HO\Viha^qv��lW}۠���������YGFBqhILQXQr~��e���~^ؠ���������������������������!#!#&$''$(($(),$(*+%&-***'+,/+$%
������������������������������������������
��������������������������������	�����������
���������������������������������������
������������������������������������������������μ����������������������ͻ����������	w����������������ͻ����������	w�����������������Ͻ����������	w�������������������п�����������w�����������������������������w����������ý������������w�����������������������������������z����	����������������ɰ�������������ϵ���������������������������������������ź�����������������������������������Ǽ���������������������������½������Į��������������������������ϳ������������������������������������׵������������������	�������㿿�������������������������������������㽽������������㽽����������������������������Ŀ��Ū����������������
������ɶ����������ỻ���������������˵��������������⹹���f�����̛�������ڿ�Ե�����������K������i~ѵ��ɭ���ս���������멱�������Z�������������������������Ḹ�����������߲��������������������Ḹ���ͺ>��ym�̝���������������������෷�����pN��I�Ӣ���������������������෷���ҭ���ύ������������������߷�����������ť�������ņ{�����������߷����� a���hv����������������������෷���}5���¯�vXi�����������ޢ������
��������߷����zoUFDA\�gbt����������ܡ����������߷����xHA5HR>EJ`g���������z�ۡ����߷����pPMB��JHMUk�����������٠�����߷��������������������!"&$&%$$(%) ((-(('*$$'*",%(%)%%(&$%
��������������������������������������������
�������������������
�������������������������	�������������
������ﵵ�����������������������������������������������������	������������������������������������������G::���������������������������G::����������������������������G::������������������������������::��������������	���������������:��������������
������������������	����������������������
���������������������������
�����������%�����������������������������������������������������������������������������������������������������������������������������	����������������!������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������l���������������������/D�����������������������n4[-�����������������{������������ܡ��y��������������T������w���͸��������������������m�������~rLXC���������������c������ïf���m���D0q���������h��F��u�Է�al����12=�������������{Y�׳W�ז���[qc[]�\����������z����虿ԙ���vx;����������������]�������ȯ9EDA>25(PbeG���������!k�ĥk���y9�����������#>W��Ģ0Dk?ޢ���������#*3,>NEP>�ܡ�������#47=,!CR[T7۠��������2<=A !FU]d)' "!"##!!ٟ����������������������������8BIMPatt8BIMTxt2Yw /DocumentResources << /FontSet << /Resources [ << /Resource << /StreamTag /CoolTypeFont /Identifier << /Name (��ArialMT) /Type 1 >> >> >> << /Resource << /StreamTag /CoolTypeFont /Identifier << /Name (��MyriadPro-Regular) /Type 0 >> >> >> << /Resource << /StreamTag /CoolTypeFont /Identifier << /Name (��AdobeInvisFont) /Type 0 >> >> >> << /Resource << /StreamTag /CoolTypeFont /Identifier << /Name (��TimesNewRomanPSMT) /Type 1 >> >> >> ] >> /MojiKumiCodeToClassSet << /Resources [ << /Resource << /Name (��) >> >> ] /DisplayList [ << /Resource 0 >> ] >> /MojiKumiTableSet << /Resources [ << /Resource << /Name (��Photoshop6MojiKumiSet4) /Members << /CodeToClass 0 /PredefinedTag 2 >> >> >> << /Resource << /Name (��Photoshop6MojiKumiSet3) /Members << /CodeToClass 0 /PredefinedTag 4 >> >> >> << /Resource << /Name (��Photoshop6MojiKumiSet2) /Members << /CodeToClass 0 /PredefinedTag 3 >> >> >> << /Resource << /Name (��Photoshop6MojiKumiSet1) /Members << /CodeToClass 0 /PredefinedTag 1 >> >> >> << /Resource << /Name (��YakumonoHankaku) /Members << /CodeToClass 0 /PredefinedTag 1 >> >> >> << /Resource << /Name (��GyomatsuYakumonoHankaku) /Members << /CodeToClass 0 /PredefinedTag 3 >> >> >> << /Resource << /Name (��GyomatsuYakumonoZenkaku) /Members << /CodeToClass 0 /PredefinedTag 4 >> >> >> << /Resource << /Name (��YakumonoZenkaku) /Members << /CodeToClass 0 /PredefinedTag 2 >> >> >> ] /DisplayList [ << /Resource 0 >> << /Resource 1 >> << /Resource 2 >> << /Resource 3 >> << /Resource 4 >> << /Resource 5 >> << /Resource 6 >> << /Resource 7 >> ] >> /KinsokuSet << /Resources [ << /Resource << /Name (��None) /Data << /NoStart (��) /NoEnd (��) /Keep (��) /Hanging (��) /PredefinedTag 0 >> >> >> << /Resource << /Name (��PhotoshopKinsokuHard) /Data << /NoStart (��!\),.:;?]}�    0!!	0000	00
0000A0C0E0G0I0c0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0����	������=�]) /NoEnd (��\([{��  00
00000���� �;�[��) /Keep (��  % &) /Hanging (��00��) /PredefinedTag 1 >> >> >> << /Resource << /Name (��PhotoshopKinsokuSoft) /Data << /NoStart (��  0000	00
0000�0�0�0�0���	������=�]) /NoEnd (��  00
0000��;�[) /Keep (��  % &) /Hanging (��00��) /PredefinedTag 2 >> >> >> << /Resource << /Name (��Hard) /Data << /NoStart (��!\),.:;?]}�    0!!	0000	00
0000A0C0E0G0I0c0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0����	������=�]) /NoEnd (��\([{��  00
00000���� �;�[��) /Keep (��  % &) /Hanging (��00��) /PredefinedTag 1 >> >> >> << /Resource << /Name (��Soft) /Data << /NoStart (��  0000	00
0000�0�0�0�0���	������=�]) /NoEnd (��  00
0000��;�[) /Keep (��  % &) /Hanging (��00��) /PredefinedTag 2 >> >> >> ] /DisplayList [ << /Resource 0 >> << /Resource 1 >> << /Resource 2 >> << /Resource 3 >> << /Resource 4 >> ] >> /StyleSheetSet << /Resources [ << /Resource << /Name (��Normal RGB) /Features << /Font 1 /FontSize 12.0 /FauxBold false /FauxItalic false /AutoLeading true /Leading 0.0 /HorizontalScale 1.0 /VerticalScale 1.0 /Tracking 0 /BaselineShift 0.0 /CharacterRotation 0.0 /AutoKern 1 /FontCaps 0 /FontBaseline 0 /FontOTPosition 0 /StrikethroughPosition 0 /UnderlinePosition 0 /UnderlineOffset 0.0 /Ligatures true /DiscretionaryLigatures false /ContextualLigatures false /AlternateLigatures false /OldStyle false /Fractions false /Ordinals false /Swash false /Titling false /ConnectionForms false /StylisticAlternates false /Ornaments false /FigureStyle 0 /ProportionalMetrics false /Kana false /Italics false /Ruby false /BaselineDirection 2 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /JapaneseAlternateFeature 0 /EnableWariChu false /WariChuLineCount 2 /WariChuLineGap 0 /WariChuSubLineAmount << /WariChuSubLineScale .5 >> /WariChuWidowAmount 2 /WariChuOrphanAmount 2 /WariChuJustification 7 /TCYUpDownAdjustment 0 /TCYLeftRightAdjustment 0 /LeftAki -1.0 /RightAki -1.0 /JiDori 0 /NoBreak false /FillColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> >> /StrokeColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> >> /Blend << /StreamTag /SimpleBlender >> /FillFlag true /StrokeFlag false /FillFirst true /FillOverPrint false /StrokeOverPrint false /LineCap 0 /LineJoin 0 /LineWidth 1.0 /MiterLimit 4.0 /LineDashOffset 0.0 /LineDashArray [ ] /Type1EncodingNames [ ] /Kashidas 0 /DirOverride 0 /DigitSet 0 /DiacVPos 4 /DiacXOffset 0.0 /DiacYOffset 0.0 /OverlapSwash false /JustificationAlternates false /StretchedAlternates false /FillVisibleFlag true /StrokeVisibleFlag true /FillBackgroundColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 1.0 1.0 0.0 ] >> >> /FillBackgroundFlag false /UnderlineStyle 0 /DashedUnderlineGapLength 3.0 /DashedUnderlineDashLength 3.0 /SlashedZero false /StylisticSets 0 /CustomFeature << /StreamTag /SimpleCustomFeature >> >> >> >> ] /DisplayList [ << /Resource 0 >> ] >> /ParagraphSheetSet << /Resources [ << /Resource << /Name (��Normal RGB) /Features << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /DropCaps 1 /AutoLeading 1.2 /LeadingType 0 /AutoHyphenate true /HyphenatedWordSize 6 /PreHyphen 2 /PostHyphen 2 /ConsecutiveHyphens 0 /Zone 36.0 /HyphenateCapitalized true /HyphenationPreference .5 /WordSpacing [ .8 1.0 1.33 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /SingleWordJustification 6 /Hanging false /AutoTCY 0 /KeepTogether true /BurasagariType 0 /KinsokuOrder 0 /Kinsoku /nil /KurikaeshiMojiShori false /MojiKumiTable /nil /EveryLineComposer false /TabStops << >> /DefaultTabWidth 36.0 /DefaultStyle << >> /ParagraphDirection 0 /JustificationMethod 0 /ComposerEngine 0 /ListStyle /nil /ListTier 0 /ListSkip false /ListOffset 0 >> >> >> ] /DisplayList [ << /Resource 0 >> ] >> /TextFrameSet << /Resources [ << /Resource << /Bezier << /Points [ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ] >> /Data << /Type 0 /LineOrientation 0 /TextOnPathTRange [ -1.0 -1.0 ] /RowGutter 0.0 /ColumnGutter 0.0 /FirstBaselineAlignment << /Flag 1 /Min 0.0 >> /PathData << /Spacing -1 >> >> >> >> ] >> /ListStyleSet << /Resources [ << /Resource << /Name (��kPredefinedNumericListStyleTag) /PredefinedTag 1 >> >> << /Resource << /Name (��kPredefinedUppercaseAlphaListStyleTag) /PredefinedTag 2 >> >> << /Resource << /Name (��kPredefinedLowercaseAlphaListStyleTag) /PredefinedTag 3 >> >> << /Resource << /Name (��kPredefinedUppercaseRomanNumListStyleTag) /PredefinedTag 4 >> >> << /Resource << /Name (��kPredefinedLowercaseRomanNumListStyleTag) /PredefinedTag 5 >> >> << /Resource << /Name (��kPredefinedBulletListStyleTag) /PredefinedTag 6 >> >> ] /DisplayList [ << /Resource 0 >> << /Resource 1 >> << /Resource 2 >> << /Resource 3 >> << /Resource 4 >> << /Resource 5 >> ] >> >> /DocumentObjects << /DocumentSettings << /HiddenGlyphFont << /AlternateGlyphFont 2 /WhitespaceCharacterMapping [ << /WhitespaceCharacter (�� ) /AlternateCharacter (��1) >> << /WhitespaceCharacter (��
) /AlternateCharacter (��6) >> << /WhitespaceCharacter (��	) /AlternateCharacter (��0) >> << /WhitespaceCharacter (�� \)) /AlternateCharacter (��5) >> << /WhitespaceCharacter (��) /AlternateCharacter (��5) >> << /WhitespaceCharacter (��0) /AlternateCharacter (��1) >> << /WhitespaceCharacter (���) /AlternateCharacter (��3) >> ] >> /NormalStyleSheet 0 /NormalParagraphSheet 0 /SuperscriptSize .583 /SuperscriptPosition .333 /SubscriptSize .583 /SubscriptPosition .333 /SmallCapSize .7 /UseSmartQuotes true /SmartQuoteSets [ << /Language 0 /OpenDoubleQuote (�� ) /CloseDoubleQuote (�� ) /OpenSingleQuote (�� ) /CloseSingleQuote (�� ) >> << /Language 1 /OpenDoubleQuote (�� ) /CloseDoubleQuote (�� ) /OpenSingleQuote (�� ) /CloseSingleQuote (�� ) >> << /Language 2 /OpenDoubleQuote (���) /CloseDoubleQuote (���) /OpenSingleQuote (�� ) /CloseSingleQuote (�� ) >> << /Language 3 /OpenDoubleQuote (���) /CloseDoubleQuote (���) /OpenSingleQuote (�� ) /CloseSingleQuote (�� ) >> << /Language 4 /OpenDoubleQuote (�� ) /CloseDoubleQuote (�� ) /OpenSingleQuote (�� ) /CloseSingleQuote (�� ) >> << /Language 5 /OpenDoubleQuote (�� ) /CloseDoubleQuote (�� ) /OpenSingleQuote (�� ) /CloseSingleQuote (�� ) >> << /Language 6 /OpenDoubleQuote (���) /CloseDoubleQuote (���) /OpenSingleQuote (�� 9) /CloseSingleQuote (�� :) >> << /Language 7 /OpenDoubleQuote (�� ) /CloseDoubleQuote (�� ) /OpenSingleQuote (�� ) /CloseSingleQuote (�� ) >> << /Language 8 /OpenDoubleQuote (���) /CloseDoubleQuote (���) /OpenSingleQuote (�� ) /CloseSingleQuote (�� ) >> << /Language 9 /OpenDoubleQuote (���) /CloseDoubleQuote (���) /OpenSingleQuote (�� ) /CloseSingleQuote (�� ) >> << /Language 10 /OpenDoubleQuote (�� ) /CloseDoubleQuote (�� ) /OpenSingleQuote (�� ) /CloseSingleQuote (�� ) >> << /Language 11 /OpenDoubleQuote (�� ) /CloseDoubleQuote (�� ) /OpenSingleQuote (�� ) /CloseSingleQuote (�� ) >> << /Language 12 /OpenDoubleQuote (�� ) /CloseDoubleQuote (�� ) /OpenSingleQuote (�� ) /CloseSingleQuote (�� ) >> << /Language 13 /OpenDoubleQuote (�� ) /CloseDoubleQuote (�� ) /OpenSingleQuote (�� ) /CloseSingleQuote (�� ) >> << /Language 14 /OpenDoubleQuote (�� ) /CloseDoubleQuote (�� ) /OpenSingleQuote (�� ) /CloseSingleQuote (�� ) >> << /Language 15 /OpenDoubleQuote (�� ) /CloseDoubleQuote (�� ) /OpenSingleQuote (�� ) /CloseSingleQuote (�� ) >> << /Language 16 /OpenDoubleQuote (�� ) /CloseDoubleQuote (�� ) /OpenSingleQuote (�� ) /CloseSingleQuote (�� ) >> << /Language 17 /OpenDoubleQuote (�� ) /CloseDoubleQuote (�� ) /OpenSingleQuote (�� ) /CloseSingleQuote (�� ) >> << /Language 18 /OpenDoubleQuote (���) /CloseDoubleQuote (���) /OpenSingleQuote (�� ) /CloseSingleQuote (�� ) >> << /Language 19 /OpenDoubleQuote (���) /CloseDoubleQuote (���) /OpenSingleQuote (�� ) /CloseSingleQuote (�� ) >> << /Language 20 /OpenDoubleQuote (�� ) /CloseDoubleQuote (�� ) /OpenSingleQuote (�� ) /CloseSingleQuote (�� ) >> << /Language 21 /OpenDoubleQuote (�� ) /CloseDoubleQuote (�� ) /OpenSingleQuote (�� ) /CloseSingleQuote (�� ) >> << /Language 22 /OpenDoubleQuote (�� ) /CloseDoubleQuote (�� ) /OpenSingleQuote (�� ) /CloseSingleQuote (�� ) >> << /Language 23 /OpenDoubleQuote (�� ) /CloseDoubleQuote (�� ) /OpenSingleQuote (�� ) /CloseSingleQuote (�� ) >> << /Language 24 /OpenDoubleQuote (�� ) /CloseDoubleQuote (�� ) /OpenSingleQuote (�� ) /CloseSingleQuote (�� ) >> << /Language 25 /OpenDoubleQuote (���) /CloseDoubleQuote (���) /OpenSingleQuote (�� 9) /CloseSingleQuote (�� :) >> << /Language 26 /OpenDoubleQuote (�� ) /CloseDoubleQuote (�� ) /OpenSingleQuote (�� ) /CloseSingleQuote (�� ) >> << /Language 27 /OpenDoubleQuote (�� ) /CloseDoubleQuote (�� ) /OpenSingleQuote (�� ) /CloseSingleQuote (�� ) >> << /Language 28 /OpenDoubleQuote (�� ) /CloseDoubleQuote (�� ) /OpenSingleQuote (�� ) /CloseSingleQuote (�� ) >> << /Language 29 /OpenDoubleQuote (��0) /CloseDoubleQuote (��0) >> << /Language 30 /OpenDoubleQuote (��0) /CloseDoubleQuote (��0
) >> << /Language 31 /OpenDoubleQuote (�� ) /CloseDoubleQuote (�� ) /OpenSingleQuote (�� ) /CloseSingleQuote (�� ) >> << /Language 32 /OpenDoubleQuote (�� ) /CloseDoubleQuote (�� ) /OpenSingleQuote (�� ) /CloseSingleQuote (�� ) >> << /Language 33 /OpenDoubleQuote (�� ) /CloseDoubleQuote (�� ) /OpenSingleQuote (�� ) /CloseSingleQuote (�� ) >> << /Language 34 /OpenDoubleQuote (���) /CloseDoubleQuote (���) /OpenSingleQuote (�� ) /CloseSingleQuote (�� ) >> << /Language 35 /OpenDoubleQuote (�� ) /CloseDoubleQuote (�� ) /OpenSingleQuote (�� ) /CloseSingleQuote (�� ) >> << /Language 36 /OpenDoubleQuote (�� ) /CloseDoubleQuote (�� ) /OpenSingleQuote (�� ) /CloseSingleQuote (�� ) >> << /Language 37 /OpenDoubleQuote (���) /CloseDoubleQuote (���) /OpenSingleQuote (�� ) /CloseSingleQuote (�� ) >> << /Language 38 /OpenDoubleQuote (�� ) /CloseDoubleQuote (�� ) /OpenSingleQuote (�� ) /CloseSingleQuote (�� ) >> << /Language 39 /OpenDoubleQuote (���) /CloseDoubleQuote (���) /OpenSingleQuote (��<) /CloseSingleQuote (��>) >> << /Language 40 /OpenDoubleQuote (�� ) /CloseDoubleQuote (�� ) /OpenSingleQuote (�� ) /CloseSingleQuote (�� ) >> << /Language 41 /OpenDoubleQuote (���) /CloseDoubleQuote (���) /OpenSingleQuote (��<) /CloseSingleQuote (��>) >> << /Language 42 /OpenDoubleQuote (�� ) /CloseDoubleQuote (�� ) /OpenSingleQuote (�� ) /CloseSingleQuote (�� ) >> << /Language 43 /OpenDoubleQuote (�� ) /CloseDoubleQuote (�� ) /OpenSingleQuote (�� ) /CloseSingleQuote (�� ) >> << /Language 44 /OpenDoubleQuote (���) /CloseDoubleQuote (���) /OpenSingleQuote (�� 9) /CloseSingleQuote (�� :) >> << /Language 45 /OpenDoubleQuote (�� ) /CloseDoubleQuote (�� ) /OpenSingleQuote (�� ) /CloseSingleQuote (�� ) >> ] >> /TextObjects [ << /Model << /Text (��php
) /ParagraphRun << /RunArray [ << /RunData << /ParagraphSheet << /Name (��) /Features << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /DropCaps 1 /AutoLeading 1.2 /LeadingType 0 /AutoHyphenate true /HyphenatedWordSize 6 /PreHyphen 2 /PostHyphen 2 /ConsecutiveHyphens 0 /Zone 36.0 /HyphenateCapitalized true /HyphenationPreference .5 /WordSpacing [ .8 1.0 1.33 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /SingleWordJustification 6 /Hanging false /AutoTCY 1 /KeepTogether true /BurasagariType 0 /KinsokuOrder 0 /Kinsoku /nil /KurikaeshiMojiShori false /MojiKumiTable /nil /EveryLineComposer false /TabStops << >> /DefaultTabWidth 36.0 /DefaultStyle << /Font 1 /FontSize 12.0 /FauxBold false /FauxItalic false /AutoLeading true /Leading 0.0 /HorizontalScale 1.0 /VerticalScale 1.0 /Tracking 0 /BaselineShift 0.0 /CharacterRotation 0.0 /AutoKern 1 /FontCaps 0 /FontBaseline 0 /FontOTPosition 0 /StrikethroughPosition 0 /UnderlinePosition 0 /UnderlineOffset 0.0 /Ligatures true /DiscretionaryLigatures false /ContextualLigatures false /AlternateLigatures false /OldStyle false /Fractions false /Ordinals false /Swash false /Titling false /ConnectionForms false /StylisticAlternates false /Ornaments false /FigureStyle 0 /ProportionalMetrics false /Kana false /Italics false /Ruby false /BaselineDirection 2 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /EnableWariChu false /WariChuLineCount 2 /WariChuLineGap 0 /WariChuSubLineAmount << /WariChuSubLineScale .5 >> /WariChuWidowAmount 2 /WariChuOrphanAmount 2 /WariChuJustification 7 /TCYUpDownAdjustment 0 /TCYLeftRightAdjustment 0 /LeftAki -1.0 /RightAki -1.0 /JiDori 0 /NoBreak false /FillColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> >> /StrokeColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> >> /FillFlag true /StrokeFlag false /FillFirst true /FillOverPrint false /StrokeOverPrint false /LineCap 0 /LineJoin 0 /LineWidth 1.0 /MiterLimit 4.0 /LineDashOffset 0.0 /LineDashArray [ ] /Type1EncodingNames [ ] /Kashidas 0 /DirOverride 0 /DigitSet 0 /DiacVPos 4 /DiacXOffset 0.0 /DiacYOffset 0.0 /OverlapSwash false /JustificationAlternates false /StretchedAlternates false /FillVisibleFlag true /StrokeVisibleFlag true /FillBackgroundColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 1.0 1.0 0.0 ] >> >> /FillBackgroundFlag false /UnderlineStyle 0 /DashedUnderlineGapLength 3.0 /DashedUnderlineDashLength 3.0 >> /ParagraphDirection 0 /JustificationMethod 0 /ComposerEngine 0 /ListStyle /nil /ListTier 0 /ListSkip false /ListOffset 0 >> /Parent 0 >> >> /Length 4 >> ] >> /StyleRun << /RunArray [ << /RunData << /StyleSheet << /Name (��) /Parent 0 /Features << /Font 0 /FontSize 10.0 /FauxBold false /FauxItalic false /AutoLeading true /Leading .01 /HorizontalScale 1.0 /VerticalScale 1.0 /Tracking -10 /BaselineShift 0.0 /CharacterRotation 0.0 /AutoKern 1 /FontCaps 0 /FontBaseline 0 /FontOTPosition 0 /StrikethroughPosition 0 /UnderlinePosition 0 /UnderlineOffset 0.0 /Ligatures true /DiscretionaryLigatures false /ContextualLigatures true /AlternateLigatures false /OldStyle false /Fractions false /Ordinals false /Swash false /Titling false /ConnectionForms true /StylisticAlternates false /Ornaments false /FigureStyle 0 /ProportionalMetrics false /Kana false /Italics false /Ruby false /BaselineDirection 1 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /JapaneseAlternateFeature 0 /EnableWariChu false /WariChuLineCount 2 /WariChuLineGap 0 /WariChuSubLineAmount << /WariChuSubLineScale .5 >> /WariChuWidowAmount 2 /WariChuOrphanAmount 2 /WariChuJustification 7 /TCYUpDownAdjustment 0 /TCYLeftRightAdjustment 0 /LeftAki -1.0 /RightAki -1.0 /JiDori 0 /NoBreak false /FillColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 1.0 1.0 1.0 ] >> >> /StrokeColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> >> /Blend << /StreamTag /SimpleBlender >> /FillFlag true /StrokeFlag false /FillFirst false /FillOverPrint false /StrokeOverPrint false /LineCap 0 /LineJoin 0 /LineWidth .4 /MiterLimit 1.6 /LineDashOffset 0.0 /LineDashArray [ ] /Type1EncodingNames [ ] /Kashidas 0 /DirOverride 0 /DigitSet 0 /DiacVPos 4 /DiacXOffset 0.0 /DiacYOffset 0.0 /OverlapSwash false /JustificationAlternates false /StretchedAlternates false /FillVisibleFlag true /StrokeVisibleFlag true /FillBackgroundColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 1.0 1.0 0.0 ] >> >> /FillBackgroundFlag false /UnderlineStyle 0 /DashedUnderlineGapLength 3.0 /DashedUnderlineDashLength 3.0 /SlashedZero false /StylisticSets 0 /CustomFeature << /StreamTag /SimpleCustomFeature >> >> >> >> /Length 4 >> ] >> /KernRun << /RunArray [ << /RunData << >> /Length 4 >> ] >> /AlternateGlyphRun << /RunArray [ << /RunData << >> /Length 4 >> ] >> /StorySheet << /AntiAlias 4 /UseFractionalGlyphWidths true >> >> /View << /Frames [ << /Resource 0 >> ] /RenderedData << /RunArray [ << /RunData << /LineCount 1 >> /Length 4 >> ] >> /Strikes [ << /StreamTag /PathSelectGroupCharacter /Transform << /Origin [ 0.0 0.0 ] >> /Bounds [ 0.0 0.0 0.0 0.0 ] /ChildProcession 0 /Children [ << /StreamTag /FrameStrike /Frame 0 /Transform << /Origin [ 0.0 0.0 ] >> /Bounds [ 0.0 0.0 0.0 0.0 ] /ChildProcession 2 /Children [ << /StreamTag /RowColStrike /RowColIndex 0 /Transform << /Origin [ 0.0 0.0 ] >> /Bounds [ 0.0 0.0 0.0 0.0 ] /ChildProcession 1 /Children [ << /StreamTag /RowColStrike /RowColIndex 0 /Transform << /Origin [ 0.0 0.0 ] >> /Bounds [ 0.0 0.0 0.0 0.0 ] /ChildProcession 2 /Children [ << /StreamTag /LineStrike /Baseline 0.0 /Leading 12.0 /EMHeight 10.0 /DHeight 7.15988 /SelectionAscent -8.58154 /SelectionDescent 3.24707 /Transform << /Origin [ 0.0 0.0 ] >> /Bounds [ 0.0 -8.58154 0.0 3.24707 ] /ChildProcession 1 /Children [ << /StreamTag /Segment /Mapping << /CharacterCount 4 /GlyphCount 0 /WRValid false >> /FirstCharacterIndexInSegment 0 /Transform << /Origin [ 0.0 0.0 ] >> /Bounds [ 0.0 0.0 0.0 0.0 ] /ChildProcession 1 /Children [ << /StreamTag /GlyphStrike /Transform << /Origin [ 0.0 0.0 ] >> /Bounds [ 0.0 -8.58154 16.38457 3.24707 ] /Glyphs [ 83 75 83 3 ] /GlyphAdjustments << /Data [ << /BackFixed -.1 >> ] /RunLengths [ 4 ] >> /VisualBounds [ 0.0 -8.58154 16.38457 3.24707 ] /RenderedBounds [ 0.0 -8.58154 16.38457 3.24707 ] /Invalidation [ 0.0 -8.58154 21.18453 3.24707 ] /ShadowStylesRun << /Data [ << /Index 0 /Font 0 /Scale [ 1.0 1.0 ] /Orientation 0 /BaselineDirection 2 /BaselineShift 0.0 /KernType 1 /EmbeddingLevel 0 /ComplementaryFontIndex 0 >> ] /RunLengths [ 4 ] >> /EndsInCR true /SelectionAscent -8.58154 /SelectionDescent 3.24707 /MainDir 0 >> ] >> ] >> ] >> ] >> ] >> ] >> ] >> /OpticalAlignment false >> ] /OriginalNormalStyleFeatures << /Font 1 /FontSize 12.0 /FauxBold false /FauxItalic false /AutoLeading true /Leading 0.0 /HorizontalScale 1.0 /VerticalScale 1.0 /Tracking 0 /BaselineShift 0.0 /CharacterRotation 0.0 /AutoKern 1 /FontCaps 0 /FontBaseline 0 /FontOTPosition 0 /StrikethroughPosition 0 /UnderlinePosition 0 /UnderlineOffset 0.0 /Ligatures true /DiscretionaryLigatures false /ContextualLigatures false /AlternateLigatures false /OldStyle false /Fractions false /Ordinals false /Swash false /Titling false /ConnectionForms false /StylisticAlternates false /Ornaments false /FigureStyle 0 /ProportionalMetrics false /Kana false /Italics false /Ruby false /BaselineDirection 2 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /JapaneseAlternateFeature 0 /EnableWariChu false /WariChuLineCount 2 /WariChuLineGap 0 /WariChuSubLineAmount << /WariChuSubLineScale .5 >> /WariChuWidowAmount 2 /WariChuOrphanAmount 2 /WariChuJustification 7 /TCYUpDownAdjustment 0 /TCYLeftRightAdjustment 0 /LeftAki -1.0 /RightAki -1.0 /JiDori 0 /NoBreak false /FillColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> >> /StrokeColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> >> /Blend << /StreamTag /SimpleBlender >> /FillFlag true /StrokeFlag false /FillFirst true /FillOverPrint false /StrokeOverPrint false /LineCap 0 /LineJoin 0 /LineWidth 1.0 /MiterLimit 4.0 /LineDashOffset 0.0 /LineDashArray [ ] /Type1EncodingNames [ ] /Kashidas 0 /DirOverride 0 /DigitSet 0 /DiacVPos 4 /DiacXOffset 0.0 /DiacYOffset 0.0 /OverlapSwash false /JustificationAlternates false /StretchedAlternates false /FillVisibleFlag true /StrokeVisibleFlag true /FillBackgroundColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 1.0 1.0 0.0 ] >> >> /FillBackgroundFlag false /UnderlineStyle 0 /DashedUnderlineGapLength 3.0 /DashedUnderlineDashLength 3.0 /SlashedZero false /StylisticSets 0 /CustomFeature << /StreamTag /SimpleCustomFeature >> >> /OriginalNormalParagraphFeatures << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /DropCaps 1 /AutoLeading 1.2 /LeadingType 0 /AutoHyphenate true /HyphenatedWordSize 6 /PreHyphen 2 /PostHyphen 2 /ConsecutiveHyphens 0 /Zone 36.0 /HyphenateCapitalized true /HyphenationPreference .5 /WordSpacing [ .8 1.0 1.33 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /SingleWordJustification 6 /Hanging false /AutoTCY 0 /KeepTogether true /BurasagariType 0 /KinsokuOrder 0 /Kinsoku /nil /KurikaeshiMojiShori false /MojiKumiTable /nil /EveryLineComposer false /TabStops << >> /DefaultTabWidth 36.0 /DefaultStyle << >> /ParagraphDirection 0 /JustificationMethod 0 /ComposerEngine 0 /ListStyle /nil /ListTier 0 /ListSkip false /ListOffset 0 >> >>8BIMlnk2(�fliFD$6959b6d6-0482-1173-a2a2-eaea0594271a
image.png�PNG


IHDR00W��	pHYs��
OiCCPPhotoshop ICC profilexڝSgTS�=���BK���KoR RB���&*!	J�!��Q�EEȠ�����Q,�
��!��������{�kּ�����>�����H3Q5��B������.@�
$p�d!s�#�~<<+"��x��M��0���B�\���t�8K�@z�B�@F���&S�`�cb�P-`'������{[�!�� e�Dh;��V�EX0fK�9�-0IWfH�����0Q��){`�##x��F�W<�+��*x��<�$9E�[-qWW.(�I+6aa�@.�y�2�4�������x����6��_-��"bb��ϫp@�t~�,/��;�m��%�h^�u��f�@����W�p�~<<E���������J�B[a�W}�g�_�W�l�~<�����$�2]�G�����L�ϒ	�b��G�����"�Ib�X*�Qq�D���2�"�B�)�%�d��,�>�5�j>{�-�]c�K'Xt���o��(�h���w��?�G�%�fI�q^D$.Tʳ?�D��*�A�,����`6�B$��BB
d�r`)��B(�Ͱ*`/�@4�Qh��p.�U�=p�a��(��	A�a!ڈb�X#����!�H�$ ɈQ"K�5H1R�T UH�=r9�\F��;�2����G1���Q=��C��7�F��dt1�����r�=�6��Ыhڏ>C�0��3�l0.��B�8,	�c˱"����V����cϱw�E�	6wB aAHXLXN�H� $4�	7	�Q�'"��K�&���b21�XH,#��/{�C�7$�C2'��I��T��F�nR#�,��4H#���dk�9�, +ȅ����3��!�[
�b@q��S�(R�jJ��4�e�2AU��Rݨ�T5�ZB���R�Q��4u�9̓IK�����hh�i��t�ݕN��W���G���w
��Ljg(�gw��L�Ӌ�T071���oUX*�*|��
�J�&�*/T����ުU�U�T��^S}�FU3S�	Ԗ�U��P�SSg�;���g�oT?�~Y��Y�L�OC�Q��_�� c�x,!k
��u�5�&���|v*�����=���9C3J3W�R�f?�q��tN	�(���~���)�)�4L�1e\k����X�H�Q�G�6����E�Y��A�J'\'Gg����S�Sݧ
�M=:��.�k���Dw�n��^��Lo��y��}/�T�m���GX�$��<�5qo</���QC]�@C�a�a�ᄑ��<��F�F�i�\�$�m�mƣ&&!&KM�M�RM��)�;L;L���͢�֙5�=1�2��כ߷`ZxZ,����eI��Z�Yn�Z9Y�XUZ]�F���%ֻ�����N�N���gð�ɶ�����ۮ�m�}agbg�Ů��}�}��=
���Z~s�r:V:ޚΜ�?}���/gX���3��)�i�S��Ggg�s�󈋉K��.�>.���Ƚ�Jt�q]�z�������ۯ�6�i�ܟ�4�)�Y3s���C�Q��?��0k߬~OCO�g��#/c/�W�װ��w��a�>�>r��>�<7�2�Y_�7��ȷ�O�o�_��C#�d�z����%g��A�[��z|!��?:�e����A���AA�����!h�쐭!��Α�i�P~���a�a��~'���W�?�p�X�1�5w��Cs�D�D�Dޛg1O9�-J5*>�.j<�7�4�?�.fY��X�XIlK9.*�6nl�������{�/�]py�����.,:�@L�N8��A*��%�w%�
y��g"/�6ш�C\*N�H*Mz�쑼5y$�3�,幄'���L
Lݛ:��v m2=:�1����qB�!M��g�g�fvˬe����n��/��k���Y-
�B��TZ(�*�geWf�͉�9���+��̳�ې7����ᒶ��KW-X潬j9�<qy�
�+�V�<���*m�O��W��~�&zMk�^�ʂ��k�U
�}����]OX/Yߵa���>������(�x��oʿ�ܔ���Ĺd�f�f���-�[����n
�ڴ
�V��E�/��(ۻ��C���<��e����;?T�T�T�T6��ݵa�n��{��4���[���>ɾ�UUM�f�e�I���?�����m]�Nmq����#�׹���=TR��+�G�����w-
6
U����#pDy��	�
:�v�{���vg/jB��F�S��[b[�O�>����z�G��4<YyJ�T�i��ӓg�ό���}~.��`ۢ�{�c��jo�t��E���;�;�\�t���W�W��:_m�t�<���Oǻ�����\k��z��{f���7���y���՞9=ݽ�zo�����~r'��˻�w'O�_�@�A�C݇�?[�����j�w����G�������C���ˆ
��8>99�?r��C�d�&����ˮ/~�����јѡ�򗓿m|�����������x31^�V��w�w��O�| (�h���SЧ�������c3-�gAMA��|�Q� cHRMz%������u0�`:�o�_�F+IDATxڴ�[�]�U����9g�ǵ��'MLMCB���U��ԋ���JH��
x�E�����@��S��Q/i�8qB[%$6��\��Ǟ�̙9����xؗ��9�2�8�t��ξ����_k����|MAAP$�6�/g�"8u�N�#�ێ���›��?0Y߼m�p����S��>�v��휤�ܾ�N'֞���/?��S%Q"RZ�.��V����U�E��v�!�wmK�J;rl���)���	[�T|k^]�[��kc��z=�ݖ��%��-����Z0�j���@T�<K5�|��b���]�^Ø�z@�h.d���ƚ� ��CQu����<�
��n�J0���[��T�ͅL��B�(���Kw*�Sb'D�.B�+�5^�?�_��xѿ�i��
�-~>eO)�)�����E1q���<��7v��6!ԗU�b��U�
I#�DQL'���Q7$�B`�0րg��g�~i�p2�M�Z�\��R��+��.9rN��0L>�N���\����Y�z���7~g;Jl_퇏$��%G1^4��<~Tq��tC�����J�y�9��[n��-�KU�s<�›V�^eS�E0i���b�*�A���'/�o@p�E���!�,��DHA0�0�`�`��#��gvR��P��O�6����=��,7�RO)�j�"9��3���`l�?�`���T���a�6�͟>G�!�Uz%��)�=iS�I�	���Ř$e�P�2t� �_T�B�Q��'�����&�8�~ba���\-R��r`��X�P�2ĩ�)+1<\1���S�?������5�..DA͠ӗ�4P����y�E��
��찶�bc}��&��a�KF����hT*����y��rd;���/]�;MЎ��v I�<�h�ɒ׍�<)Q�m�i�mr��"�V�8�Q���X��?���2>1�P�N���޺^>sۧy0�[�	)z������*�Ry!I���ccu���mw���\j ���k���l��\�[��L��>R��}�O�o��ɒ����+
�Ȏ5���8F�K��<���,�g�8��`C�
�:!r���,�Q���L#�v%�[�B6M<�c��M�P�*�0"	L�I���;#��i�-��ߣ�����k���	r��� (�iO����^��4�"X#X�T|��#�D�8��Zb_c"I
6�`�G�k9����>�R)�$l���h�P�˂(��<? P�|�("c�gQ�36}Rb1��Ga�kY�Ý4��5�*E�)9zP�	�BY$u�&C�I�j�XK�Z:t�S��{�5�=�$M[k�j�fcgM}^m�\H
�c�)Y�঩
��>�P����m��Mj��V��v�B�D�T0�����]8��%��Nk�kec(�ܓ��Z�B������B?P�)�BM��F-��uf�v5{N*P�'N�P�A�wȇ��s[�&���V�i��QK�v{.T4�z/uH�8��[�p�=w�~��'_���eF�F��6��H�@���
���Q{)�o�w����)��wr����Xz[u�:�kԂ�@h���W����K��v�E}�ѳ��u)
	�ݸංPRh��K���~�PC���xx���6��WPm3��5�W�	�+��Rǯ}�ˀ��Y�A2&�N�e6�\�%*���-�Ge�{D�ڭ�f���&������ge�E��GX^=�s�q�v�H^��r���4�қt����:�<�/����o����[�֡%��f�Փ�"�����"���lu��g5�5�cz�<p�GԂi���)�C�B&ɂT{��+)e���lP�d�q��su��|�޽W�Ls��{'*�9�ιW�忿�$�o���‰�β�����~������1iF��I�z3�~uI�Ձ��h��,��l:�e���,������3�;��j�����|�/��s����B�0"�#fW^e~)�'_�1q[i���
.�#7�;q:@�-�6Tz�r`
���,��1!����v�+�',�̳�^N�����P�U�����+ԧ�i����Sln�h�!��:�3��a�Wڬm�e���d8�ܖT��Q��3��e3�-b��Y�̅?�]ed�_��x��q"������"���8Wecq����󗫴WnƯ-�l��Mg��[����dĮ������WߴA�w�'�c�S���;O����I���	���G?���{�׮^�V���ř�\;�q������Ⱦ�`�Y�#�>K�<�[���r��[���P��֕8y���0Sws���ejj7�J���3��e֛�A��y��a���&��>�gس�,�|��[�u��aY@�å���.Me��fҗ��̻�M��+�����L�ayi��	A��Ï<ĵ�yμ�&s�o`���T�c� �1�dq������sw�mM��'p�y�γ���G�Zh�c�l���R������px�a^�,����s/��o��vM011�����7�&6�vG�1�C��U��¾#/����W�Ř�S��ok�x�� v����0���<��e��E�F����ū�����?>�eVV�h��6a2�;�:����ࡘ���n���L�2\z+J�&�aW�"—�^�J�y�8������N���7��1�o{���͎6
7)��bDb�곱��CcX��12nJ
�_+���Q� ��bT����?�
�k��a�"��Ӽ:��w?�����arJ�tb�P�����p�!��s	�r)���E1���
�3=�\�ۣ4�U�"��&�
a�y�uc
��a�g�j#4�:Tk+3�"n�ݧ�.�j01�X[
1�'v�;_�3�8�*�W��߶����_<��[\w_ص��,�����g���x��ΐlq�1s�s��^"�K%f/]`�������
�U5���=�H�CL?o�k��ʍ��
���
uIEND�B`�1liFD$94592e07-047e-1173-a2a2-eaea0594271afolder_open.png��PNG


IHDR00W��	pHYs��
OiCCPPhotoshop ICC profilexڝSgTS�=���BK���KoR RB���&*!	J�!��Q�EEȠ�����Q,�
��!��������{�kּ�����>�����H3Q5��B������.@�
$p�d!s�#�~<<+"��x��M��0���B�\���t�8K�@z�B�@F���&S�`�cb�P-`'������{[�!�� e�Dh;��V�EX0fK�9�-0IWfH�����0Q��){`�##x��F�W<�+��*x��<�$9E�[-qWW.(�I+6aa�@.�y�2�4�������x����6��_-��"bb��ϫp@�t~�,/��;�m��%�h^�u��f�@����W�p�~<<E���������J�B[a�W}�g�_�W�l�~<�����$�2]�G�����L�ϒ	�b��G�����"�Ib�X*�Qq�D���2�"�B�)�%�d��,�>�5�j>{�-�]c�K'Xt���o��(�h���w��?�G�%�fI�q^D$.Tʳ?�D��*�A�,����`6�B$��BB
d�r`)��B(�Ͱ*`/�@4�Qh��p.�U�=p�a��(��	A�a!ڈb�X#����!�H�$ ɈQ"K�5H1R�T UH�=r9�\F��;�2����G1���Q=��C��7�F��dt1�����r�=�6��Ыhڏ>C�0��3�l0.��B�8,	�c˱"����V����cϱw�E�	6wB aAHXLXN�H� $4�	7	�Q�'"��K�&���b21�XH,#��/{�C�7$�C2'��I��T��F�nR#�,��4H#���dk�9�, +ȅ����3��!�[
�b@q��S�(R�jJ��4�e�2AU��Rݨ�T5�ZB���R�Q��4u�9̓IK�����hh�i��t�ݕN��W���G���w
��Ljg(�gw��L�Ӌ�T071���oUX*�*|��
�J�&�*/T����ުU�U�T��^S}�FU3S�	Ԗ�U��P�SSg�;���g�oT?�~Y��Y�L�OC�Q��_�� c�x,!k
��u�5�&���|v*�����=���9C3J3W�R�f?�q��tN	�(���~���)�)�4L�1e\k����X�H�Q�G�6����E�Y��A�J'\'Gg����S�Sݧ
�M=:��.�k���Dw�n��^��Lo��y��}/�T�m���GX�$��<�5qo</���QC]�@C�a�a�ᄑ��<��F�F�i�\�$�m�mƣ&&!&KM�M�RM��)�;L;L���͢�֙5�=1�2��כ߷`ZxZ,����eI��Z�Yn�Z9Y�XUZ]�F���%ֻ�����N�N���gð�ɶ�����ۮ�m�}agbg�Ů��}�}��=
���Z~s�r:V:ޚΜ�?}���/gX���3��)�i�S��Ggg�s�󈋉K��.�>.���Ƚ�Jt�q]�z�������ۯ�6�i�ܟ�4�)�Y3s���C�Q��?��0k߬~OCO�g��#/c/�W�װ��w��a�>�>r��>�<7�2�Y_�7��ȷ�O�o�_��C#�d�z����%g��A�[��z|!��?:�e����A���AA�����!h�쐭!��Α�i�P~���a�a��~'���W�?�p�X�1�5w��Cs�D�D�Dޛg1O9�-J5*>�.j<�7�4�?�.fY��X�XIlK9.*�6nl�������{�/�]py�����.,:�@L�N8��A*��%�w%�
y��g"/�6ш�C\*N�H*Mz�쑼5y$�3�,幄'���L
Lݛ:��v m2=:�1����qB�!M��g�g�fvˬe����n��/��k���Y-
�B��TZ(�*�geWf�͉�9���+��̳�ې7����ᒶ��KW-X潬j9�<qy�
�+�V�<���*m�O��W��~�&zMk�^�ʂ��k�U
�}����]OX/Yߵa���>������(�x��oʿ�ܔ���Ĺd�f�f���-�[����n
�ڴ
�V��E�/��(ۻ��C���<��e����;?T�T�T�T6��ݵa�n��{��4���[���>ɾ�UUM�f�e�I���?�����m]�Nmq����#�׹���=TR��+�G�����w-
6
U����#pDy��	�
:�v�{���vg/jB��F�S��[b[�O�>����z�G��4<YyJ�T�i��ӓg�ό���}~.��`ۢ�{�c��jo�t��E���;�;�\�t���W�W��:_m�t�<���Oǻ�����\k��z��{f���7���y���՞9=ݽ�zo�����~r'��˻�w'O�_�@�A�C݇�?[�����j�w����G�������C���ˆ
��8>99�?r��C�d�&����ˮ/~�����јѡ�򗓿m|�����������x31^�V��w�w��O�| (�h���SЧ�������c3-�gAMA��|�Q� cHRMz%������u0�`:�o�_�F�IDATx��[�]W���{�s&sOs�\;i3�c�TPD�/߼ԇ����y�D�@U��}�X�� 
�b�m�Dl�P#B��Ln�d23�̙���k}�{�3g&��Q�ca6��6{�����]��o���6��l��`��-[��+^���]�$�1��w��Z�)��g��8�d���!�S03�'`5˟�A���b+9���N_�\�x�<zx��uC���W��jyo�.�(�I[^���@�o��/g��Ԉܘ��>��I*���_���o�~|�}𝳗ubrHҕ�}�=����bKN���%�vK�,�2#�"����JӛgN�S��W^9/��} �=4"��"�H�����X��a ��plw��0+ו�_�KX��V�bn�?��C�@����#��|�����Ԩk,V1r5��-
F���w����W�­;��RNz�g�j���.��ď|�3G�zG%~�g����Nq����R���!RlUr0�*��$��Zn��Y!�:��t-�H��ap�#7=����I�K
����l�R���B*�)j��,?S+L�u	��y��N�UА�4�k��4�e���9��\2;kH�A���'�s�j�"�����
$��=:cR�/��r��`ZP��^���ܱ�.$���楇�m�ĻFT�����HA��.9���0�5=�ZX�.w\wL��R��mwAX9��BHSO�0>q`h��/-���]��S���m{�ΔGCXU���(r|�L�	�֕���%��@��W[���q�cV�_Y6���ά�'��� Ob�ZbМ�='�����������0�ج������b�p*�N�ڮ�A�)b 
�&C�(��/�!�{AD�����>c��m\9@�9�;��7v~;'F0�,˕ڹ��/,204|>>x�]_�j�Q�ޕ��:'��
�V�j8`}=���Uj���v�4��f��9���'���#�@E}Ь׉��3OL^��Ǫ]�B(<�t=�
i+�f�H+�K��+���|�'�w2�s� ���!jʭ�
�{�(B�:i��5�<1��.���yK���4E�#v�9v���:|��}�H���I��⚤��?8ff�M��e�8��fC��=h�lrӠ���n���WO�I)?��#\��]��|���x���45B0⮿�|����Ie���O�K��V��(���8��^��d��#���!x�8V��Z<q[R�u��<�U�?�AsY��'	�����JP�������3'�r�J�UM�y��=�i,)��[�<��|	��㢈���%����U���صw�j��l�N�I*�����8
����ai�{���3��>�˞v��gH����� �h-׉���^Ztخ�����k��5IWZ����ﳌJ�B���J��5��Kq��M�8>��w����N��QL�gmf˲.�H[u����?dw�N� �M�S�k>%m.��۴��=<B������([o��?h�4%r�梉��=k�f��-�_��u�4ehx�N��v_s˓��$����>5}�|�UD�s)f042Fk�ٍ{�g`edw��w+"Tj4�'�o����J��ܸr��FJex�dp���p߂��W13��y�^�(P}��<t��g�_������񗟼���-+@�̖6�0X�'�Ξwң���BW�g]�?d@���u���=%'F�w]MIEND�B`��liFD$4c02335c-0485-1173-a2a2-eaea0594271ajs.pngo�PNG


IHDR00W��	pHYs��
OiCCPPhotoshop ICC profilexڝSgTS�=���BK���KoR RB���&*!	J�!��Q�EEȠ�����Q,�
��!��������{�kּ�����>�����H3Q5��B������.@�
$p�d!s�#�~<<+"��x��M��0���B�\���t�8K�@z�B�@F���&S�`�cb�P-`'������{[�!�� e�Dh;��V�EX0fK�9�-0IWfH�����0Q��){`�##x��F�W<�+��*x��<�$9E�[-qWW.(�I+6aa�@.�y�2�4�������x����6��_-��"bb��ϫp@�t~�,/��;�m��%�h^�u��f�@����W�p�~<<E���������J�B[a�W}�g�_�W�l�~<�����$�2]�G�����L�ϒ	�b��G�����"�Ib�X*�Qq�D���2�"�B�)�%�d��,�>�5�j>{�-�]c�K'Xt���o��(�h���w��?�G�%�fI�q^D$.Tʳ?�D��*�A�,����`6�B$��BB
d�r`)��B(�Ͱ*`/�@4�Qh��p.�U�=p�a��(��	A�a!ڈb�X#����!�H�$ ɈQ"K�5H1R�T UH�=r9�\F��;�2����G1���Q=��C��7�F��dt1�����r�=�6��Ыhڏ>C�0��3�l0.��B�8,	�c˱"����V����cϱw�E�	6wB aAHXLXN�H� $4�	7	�Q�'"��K�&���b21�XH,#��/{�C�7$�C2'��I��T��F�nR#�,��4H#���dk�9�, +ȅ����3��!�[
�b@q��S�(R�jJ��4�e�2AU��Rݨ�T5�ZB���R�Q��4u�9̓IK�����hh�i��t�ݕN��W���G���w
��Ljg(�gw��L�Ӌ�T071���oUX*�*|��
�J�&�*/T����ުU�U�T��^S}�FU3S�	Ԗ�U��P�SSg�;���g�oT?�~Y��Y�L�OC�Q��_�� c�x,!k
��u�5�&���|v*�����=���9C3J3W�R�f?�q��tN	�(���~���)�)�4L�1e\k����X�H�Q�G�6����E�Y��A�J'\'Gg����S�Sݧ
�M=:��.�k���Dw�n��^��Lo��y��}/�T�m���GX�$��<�5qo</���QC]�@C�a�a�ᄑ��<��F�F�i�\�$�m�mƣ&&!&KM�M�RM��)�;L;L���͢�֙5�=1�2��כ߷`ZxZ,����eI��Z�Yn�Z9Y�XUZ]�F���%ֻ�����N�N���gð�ɶ�����ۮ�m�}agbg�Ů��}�}��=
���Z~s�r:V:ޚΜ�?}���/gX���3��)�i�S��Ggg�s�󈋉K��.�>.���Ƚ�Jt�q]�z�������ۯ�6�i�ܟ�4�)�Y3s���C�Q��?��0k߬~OCO�g��#/c/�W�װ��w��a�>�>r��>�<7�2�Y_�7��ȷ�O�o�_��C#�d�z����%g��A�[��z|!��?:�e����A���AA�����!h�쐭!��Α�i�P~���a�a��~'���W�?�p�X�1�5w��Cs�D�D�Dޛg1O9�-J5*>�.j<�7�4�?�.fY��X�XIlK9.*�6nl�������{�/�]py�����.,:�@L�N8��A*��%�w%�
y��g"/�6ш�C\*N�H*Mz�쑼5y$�3�,幄'���L
Lݛ:��v m2=:�1����qB�!M��g�g�fvˬe����n��/��k���Y-
�B��TZ(�*�geWf�͉�9���+��̳�ې7����ᒶ��KW-X潬j9�<qy�
�+�V�<���*m�O��W��~�&zMk�^�ʂ��k�U
�}����]OX/Yߵa���>������(�x��oʿ�ܔ���Ĺd�f�f���-�[����n
�ڴ
�V��E�/��(ۻ��C���<��e����;?T�T�T�T6��ݵa�n��{��4���[���>ɾ�UUM�f�e�I���?�����m]�Nmq����#�׹���=TR��+�G�����w-
6
U����#pDy��	�
:�v�{���vg/jB��F�S��[b[�O�>����z�G��4<YyJ�T�i��ӓg�ό���}~.��`ۢ�{�c��jo�t��E���;�;�\�t���W�W��:_m�t�<���Oǻ�����\k��z��{f���7���y���՞9=ݽ�zo�����~r'��˻�w'O�_�@�A�C݇�?[�����j�w����G�������C���ˆ
��8>99�?r��C�d�&����ˮ/~�����јѡ�򗓿m|�����������x31^�V��w�w��O�| (�h���SЧ�������c3-�gAMA��|�Q� cHRMz%������u0�`:�o�_�F	�IDATx�̙[�]U����3sfNgz�p�B�i�A�Zh#/ژ�B$�y�bkb4��%�T�ђ�QbPPD�F�r)���(�V*Pf�����^��a_���N�c`%;sf�u��.��]��*�Z�笂�
� 
H�����؋��a�bS%^L���&o}m��#��7�S��u�1��Za?�T��FhYm��N���O�L�TYX�y�������
�B�i�R���R����:�e��"8���5��y���]�&�k�r�+���_z����?-]sO_�u��|���f�Am("]�g>�y���U���_ʹ)�#"�_���bO�2ޞl߫\t�U�04�@Ҋ�
E��h��Wf_۽u�%izr O�!�+/k-�����o�Z~������x��uB�u)����MX�]���<U�xT��@���e������K~�_��4My��1R��Z)ij�iBd #�h�W��~� J��֞s���anf�������u�.�cM���w-����u���Lв�4NQ�@Q�B�7?�m
õ��S�Ch)�;�m�o+��i�~�ޞ��k�I��r���8H€���KG^õ�;����4�z���UUn�wk/X���P*���Uũ�'�A�(�Raa���{qc�,䴴d'��$���{�}.��3�=x��.F���(�A�l���,���D�5j!:4��|s��mg����Np�}fb�`��#
��d�I=���C5���N�������\'��~0[��{`oy<�d�4����Eg1�8���hD���l�j[���.�Ⱥ�_{����x�����߶�����O��(S�zV�#�UjA�?���h]<��4���q\U�W�(0y6�����J��`x8�M��4��Y��f��V3Xy�h6����=��}?j��e]5�B+�������a��_�uk�H���rVq��u.�t��TJog�O�0Ekq��Sgh���$��ZG�)81�j!��B��Vl��Y�y�g?\u�w��V�|I'6� �Z�	�\����y�������5�G�ǚ8kq���J�I���,�*�cÐ��_ǚ5�6�X�j�����3so$�_���]�%�OC�ӧ�яoZ�bZ`gџ533s��l�rcc�]
�s`m��b���gfO3?�H��"M-������l�8�8��	.�8���9��j�^;�Ȋ��>��+�\�gC�X����=q��1�l�d��(r+X*�d��!���a@B��w��XO
!�[�AE�������K��Y�C�~��hd�S@�-d.�Q�mafgO36��-��v���#�	�1�2a"$iB����)�:�)F ��2��[o�$
��n)�,�J����\<��q�&�fߋ!�D�a��Sj�:�f��ZXja��بP8��m:�?�r)���T$�[XE{��ކP��A[�SW_s6�4F��'4��r�8��[�AD�i�y$8UKi�=�5���JhI����ΝӥB� 
�KI��$� @�c��<�A04Tg���ԇ"E� �DV����W�E���Q����h�Ms%�j����F���(Bct�;��$���[���^d��E�h/)z�𒽅���9�lZ�FD��dI�:�X�?076����j;��S��L��a�|{�ʣ�.<�]l�Qy���=PB�(��ː%��Z�{���,EU*-�ަ�D7�d��%��.���šǟ��۾c�*Z'2�rK�y�.��ݣ�)9cm�1EE��z�%K���5Z�A>��;����Z��`�hRˌ-��(�z�`�*y�G�s�C��p�2��@�_.��^$2�I��'��m;��c§�j�A�0-���C�v�n5]�޵;�J*�gPQ/�CS<��G�C�2���!�[x��.��ʉ���ؐ2�zRr�_�х�\��(.�u��(
N�W;Ƥ��[ڶl'V�ZP�l�ἳoӛ�͵Ʂ��x���Ӈ��m�{Ke���J˖���s��]-
�wٗ����n����|��$z�χ=����dW4R
��/�W@+�Iw36gy#ե�����u�9���ɜ��{D���ٹ5�_��9�j��T��{�Z��
W%3��:|��|G^9R*Qv�E�:1�)
Ln��g�/.�G%#I��L�1��B�)j��(�]�)��e�W�y�0Q=br�d7��0�huu���h�ɕW�}�T+�~��v��V���5��\�~�c[�O<|�c0�׿�Jv���$�e	1����æ����@X>t���,���!l|XJ�������?��1���;|Ԗ�|��]�X�J1O4@�!�0��t����;���9`
IEND�B`��liFD$16ba0847-0488-1173-a2a2-eaea0594271azip.png��PNG


IHDR00W��	pHYs��
OiCCPPhotoshop ICC profilexڝSgTS�=���BK���KoR RB���&*!	J�!��Q�EEȠ�����Q,�
��!��������{�kּ�����>�����H3Q5��B������.@�
$p�d!s�#�~<<+"��x��M��0���B�\���t�8K�@z�B�@F���&S�`�cb�P-`'������{[�!�� e�Dh;��V�EX0fK�9�-0IWfH�����0Q��){`�##x��F�W<�+��*x��<�$9E�[-qWW.(�I+6aa�@.�y�2�4�������x����6��_-��"bb��ϫp@�t~�,/��;�m��%�h^�u��f�@����W�p�~<<E���������J�B[a�W}�g�_�W�l�~<�����$�2]�G�����L�ϒ	�b��G�����"�Ib�X*�Qq�D���2�"�B�)�%�d��,�>�5�j>{�-�]c�K'Xt���o��(�h���w��?�G�%�fI�q^D$.Tʳ?�D��*�A�,����`6�B$��BB
d�r`)��B(�Ͱ*`/�@4�Qh��p.�U�=p�a��(��	A�a!ڈb�X#����!�H�$ ɈQ"K�5H1R�T UH�=r9�\F��;�2����G1���Q=��C��7�F��dt1�����r�=�6��Ыhڏ>C�0��3�l0.��B�8,	�c˱"����V����cϱw�E�	6wB aAHXLXN�H� $4�	7	�Q�'"��K�&���b21�XH,#��/{�C�7$�C2'��I��T��F�nR#�,��4H#���dk�9�, +ȅ����3��!�[
�b@q��S�(R�jJ��4�e�2AU��Rݨ�T5�ZB���R�Q��4u�9̓IK�����hh�i��t�ݕN��W���G���w
��Ljg(�gw��L�Ӌ�T071���oUX*�*|��
�J�&�*/T����ުU�U�T��^S}�FU3S�	Ԗ�U��P�SSg�;���g�oT?�~Y��Y�L�OC�Q��_�� c�x,!k
��u�5�&���|v*�����=���9C3J3W�R�f?�q��tN	�(���~���)�)�4L�1e\k����X�H�Q�G�6����E�Y��A�J'\'Gg����S�Sݧ
�M=:��.�k���Dw�n��^��Lo��y��}/�T�m���GX�$��<�5qo</���QC]�@C�a�a�ᄑ��<��F�F�i�\�$�m�mƣ&&!&KM�M�RM��)�;L;L���͢�֙5�=1�2��כ߷`ZxZ,����eI��Z�Yn�Z9Y�XUZ]�F���%ֻ�����N�N���gð�ɶ�����ۮ�m�}agbg�Ů��}�}��=
���Z~s�r:V:ޚΜ�?}���/gX���3��)�i�S��Ggg�s�󈋉K��.�>.���Ƚ�Jt�q]�z�������ۯ�6�i�ܟ�4�)�Y3s���C�Q��?��0k߬~OCO�g��#/c/�W�װ��w��a�>�>r��>�<7�2�Y_�7��ȷ�O�o�_��C#�d�z����%g��A�[��z|!��?:�e����A���AA�����!h�쐭!��Α�i�P~���a�a��~'���W�?�p�X�1�5w��Cs�D�D�Dޛg1O9�-J5*>�.j<�7�4�?�.fY��X�XIlK9.*�6nl�������{�/�]py�����.,:�@L�N8��A*��%�w%�
y��g"/�6ш�C\*N�H*Mz�쑼5y$�3�,幄'���L
Lݛ:��v m2=:�1����qB�!M��g�g�fvˬe����n��/��k���Y-
�B��TZ(�*�geWf�͉�9���+��̳�ې7����ᒶ��KW-X潬j9�<qy�
�+�V�<���*m�O��W��~�&zMk�^�ʂ��k�U
�}����]OX/Yߵa���>������(�x��oʿ�ܔ���Ĺd�f�f���-�[����n
�ڴ
�V��E�/��(ۻ��C���<��e����;?T�T�T�T6��ݵa�n��{��4���[���>ɾ�UUM�f�e�I���?�����m]�Nmq����#�׹���=TR��+�G�����w-
6
U����#pDy��	�
:�v�{���vg/jB��F�S��[b[�O�>����z�G��4<YyJ�T�i��ӓg�ό���}~.��`ۢ�{�c��jo�t��E���;�;�\�t���W�W��:_m�t�<���Oǻ�����\k��z��{f���7���y���՞9=ݽ�zo�����~r'��˻�w'O�_�@�A�C݇�?[�����j�w����G�������C���ˆ
��8>99�?r��C�d�&����ˮ/~�����јѡ�򗓿m|�����������x31^�V��w�w��O�| (�h���SЧ�������c3-�gAMA��|�Q� cHRMz%������u0�`:�o�_�F
�IDATxڴ�k�%E�����̝����qXX`�5*��A֬~@��&�|#���H4��hQ1f��C@E@���	�������}tW?T?���PI��֭�>���ϣEUy�q��

*��( Ž�|��X�����2���X�v�-O=��Е��Lw�ܥ�]�D{ư_�.e���a�=����1(?4֩�ȔN�ώ�sDӻ��)��]��t,I�J7�,���+��Ƥ�Zqd��:'�=���'�@�+�n��/����#O�M�+��x�+��>���D�x,!��N{���AY@UO��g�V"%tD�<����*�4v��&�{���;�c�A�^�x,����w>>���ǯ_�e[����x���9�s���;�O�\3��u�N�L�34ˈ$��m�G�ȓ���SH�e���].��wnX��c�Sϑ����2��RV@��������%��s#�u�9��7}�zκ���\���Nv<�mїm{a+��;��sd�!�E���i�����6/N���n���矹���|�Eז������=jpJ�px��"AE<�6"��蓏Y����S�i�A.����%��m8�PU\�#���ߣy4ķ\Y��^?%2�A�T���u˃�<�$�+��ޣ.x��>��g_
�yt�����5��.��(�A�J{)��hENI$$�ؒ�M����8 (�qv�*>z����7��g_��rnp�p�1 ����{�HH��yhE �r"���L�,��O5��]�zq`(}8�O��g�_]xM��<\��K��"�&ʱb�-�8@'���J�~�N��_7�dfS���.��ק�
�����C�\{�Uy�R�/-�H��@ce�в���A��)q�+\XbYKn��Y�l��~S	s0�u\���PԘE��[�����1��-�o�|�W����e(z�q�5����1R�x�y�
�*�ֹh2���H��SN��Fz�.s���6��7B�y���� [T���z}Ǟ����~�ә~��~�
����N�wڐ)0K�x�*�L�P'�k�Y�f5�n������:�..s�w�@T��E�8I���`��+f��^6A���oOgK�������%�ӫ����W��
L���@K.��B6�ezz�$��w{dYȗ���ZXX`_��˯�Ǭ\5����ZY���.���7Xe���-Q\knDn%c�6�X�Y�B�	N��*B��g���vZ��o��t�s��4�*!U�.�%W���U���#`bLP�Z�w>g��^1�
IlOb����[I"�%����B��՜VJ����e�jPZ��Q��blb�Z!�mZ-�1&Pm�pd�#6>�w�ʥІ����0�T^P�iJ��l���'1i��RGd#�&��6DL�.K�E��]q�?E}Mt�����CGr(y��.A�`%�:��"ZQD�>6�x���"�)��(�E�!ٷE�R����G�֎���
n�[Ѐ(6��q�x�]�k�`kCt�����j��j~@	Ar��0�6Y�7�4��񠦜���K,Q�F�XS��/��J���M��%��h@y���Z�<
j��B
��d��ՠ\�'�a��;`#�9?p|~�"o�K��b�KM�|���>E�]���N"�u�!�Q��7�{��o|g�����O^�?���窡.�
%�<����h��b�~�#|GlXC��+y���ٱu[�0_D�R�F+
�!U��md�#Kp"|��~(:ד���r0�/L�[h*5�>s{�Y5;��H	U-�' K*eE�����+��a�4�؅C����ps$R��1�QD�E3�=ۧ;�%����y�.��gU)��S��d^9ef���1���`�`G�	'��S���C�j�K2���VB�Z���Y���e�-����@���{%�C0��{�ʡQ���|~�x-�]�ijzِP�_�u�"�+����c�?����H>���ٮ�s.��L�����fԻ��)���n�t:=�Pۘ��_���POl���$Ū�Ȼl�w�	�o�\}�ֲ0b@��"F��NSh�TU�+��V1����_(�2��N
	՞���2�rj���(x}�*��H���*��CN\��W�z���J�ө:�vԺ����CM�Z�C#�Ӓ]Ej�]�,b��1���y�:�w��H>w%l{�����Da(Җ�S�p��!u&�ђSm/;�ZԼ��voߝ�u�|)�?}	ݱ��,E�};���RpY�~��7��=�	�j~��"�,j_9[�U�+&+k�A��̊3/�V�:��C��˙^>>��{򮷖�Tj&���A'��p��o���5�w��o�.�ǿ�YǏй�#} K]�R_2��'� VVj�^�����p�Gj�4��E��1�:��]�m/.^�9W�8��y����vT���j6�|��?|�k�ڇ�o�U��u���g�ƒ�(ޓ=�RZ��5�TgQ�4c�y��z��5
�R��{pS�SN�i\#$�a���zۡٻ�2�D>��q�~;�^Qc1%;).�aoy䕃����c(�xu[UDh������R]�J�
����׊�|�#Oy������."'S5��>�R��1���~#�����<�};IEND�B`��liFD$10ef980d-0488-1173-a2a2-eaea0594271axml.png��PNG


IHDR00W��	pHYs��
OiCCPPhotoshop ICC profilexڝSgTS�=���BK���KoR RB���&*!	J�!��Q�EEȠ�����Q,�
��!��������{�kּ�����>�����H3Q5��B������.@�
$p�d!s�#�~<<+"��x��M��0���B�\���t�8K�@z�B�@F���&S�`�cb�P-`'������{[�!�� e�Dh;��V�EX0fK�9�-0IWfH�����0Q��){`�##x��F�W<�+��*x��<�$9E�[-qWW.(�I+6aa�@.�y�2�4�������x����6��_-��"bb��ϫp@�t~�,/��;�m��%�h^�u��f�@����W�p�~<<E���������J�B[a�W}�g�_�W�l�~<�����$�2]�G�����L�ϒ	�b��G�����"�Ib�X*�Qq�D���2�"�B�)�%�d��,�>�5�j>{�-�]c�K'Xt���o��(�h���w��?�G�%�fI�q^D$.Tʳ?�D��*�A�,����`6�B$��BB
d�r`)��B(�Ͱ*`/�@4�Qh��p.�U�=p�a��(��	A�a!ڈb�X#����!�H�$ ɈQ"K�5H1R�T UH�=r9�\F��;�2����G1���Q=��C��7�F��dt1�����r�=�6��Ыhڏ>C�0��3�l0.��B�8,	�c˱"����V����cϱw�E�	6wB aAHXLXN�H� $4�	7	�Q�'"��K�&���b21�XH,#��/{�C�7$�C2'��I��T��F�nR#�,��4H#���dk�9�, +ȅ����3��!�[
�b@q��S�(R�jJ��4�e�2AU��Rݨ�T5�ZB���R�Q��4u�9̓IK�����hh�i��t�ݕN��W���G���w
��Ljg(�gw��L�Ӌ�T071���oUX*�*|��
�J�&�*/T����ުU�U�T��^S}�FU3S�	Ԗ�U��P�SSg�;���g�oT?�~Y��Y�L�OC�Q��_�� c�x,!k
��u�5�&���|v*�����=���9C3J3W�R�f?�q��tN	�(���~���)�)�4L�1e\k����X�H�Q�G�6����E�Y��A�J'\'Gg����S�Sݧ
�M=:��.�k���Dw�n��^��Lo��y��}/�T�m���GX�$��<�5qo</���QC]�@C�a�a�ᄑ��<��F�F�i�\�$�m�mƣ&&!&KM�M�RM��)�;L;L���͢�֙5�=1�2��כ߷`ZxZ,����eI��Z�Yn�Z9Y�XUZ]�F���%ֻ�����N�N���gð�ɶ�����ۮ�m�}agbg�Ů��}�}��=
���Z~s�r:V:ޚΜ�?}���/gX���3��)�i�S��Ggg�s�󈋉K��.�>.���Ƚ�Jt�q]�z�������ۯ�6�i�ܟ�4�)�Y3s���C�Q��?��0k߬~OCO�g��#/c/�W�װ��w��a�>�>r��>�<7�2�Y_�7��ȷ�O�o�_��C#�d�z����%g��A�[��z|!��?:�e����A���AA�����!h�쐭!��Α�i�P~���a�a��~'���W�?�p�X�1�5w��Cs�D�D�Dޛg1O9�-J5*>�.j<�7�4�?�.fY��X�XIlK9.*�6nl�������{�/�]py�����.,:�@L�N8��A*��%�w%�
y��g"/�6ш�C\*N�H*Mz�쑼5y$�3�,幄'���L
Lݛ:��v m2=:�1����qB�!M��g�g�fvˬe����n��/��k���Y-
�B��TZ(�*�geWf�͉�9���+��̳�ې7����ᒶ��KW-X潬j9�<qy�
�+�V�<���*m�O��W��~�&zMk�^�ʂ��k�U
�}����]OX/Yߵa���>������(�x��oʿ�ܔ���Ĺd�f�f���-�[����n
�ڴ
�V��E�/��(ۻ��C���<��e����;?T�T�T�T6��ݵa�n��{��4���[���>ɾ�UUM�f�e�I���?�����m]�Nmq����#�׹���=TR��+�G�����w-
6
U����#pDy��	�
:�v�{���vg/jB��F�S��[b[�O�>����z�G��4<YyJ�T�i��ӓg�ό���}~.��`ۢ�{�c��jo�t��E���;�;�\�t���W�W��:_m�t�<���Oǻ�����\k��z��{f���7���y���՞9=ݽ�zo�����~r'��˻�w'O�_�@�A�C݇�?[�����j�w����G�������C���ˆ
��8>99�?r��C�d�&����ˮ/~�����јѡ�򗓿m|�����������x31^�V��w�w��O�| (�h���SЧ�������c3-�gAMA��|�Q� cHRMz%������u0�`:�o�_�F
�IDATx�̙[p]e�������47��$-M�6A�Z
E���a�b_������>��3<�X���#^`:�*�ڞBsBZ��{���˷|��s�ړ���nw����k������-�ʵ�o�]RPPD@I�ϓ�V-�U�@���*��N�Uʋ#����󺹺�rW7ư��3IU��L#���h���9(K�g�\�)���X�`pGF���іV���=(�U�1�[�_Z�Tp�_ΆKw��;{{*���JB�g�}�'ccc���w��o�Ah��E�K��0�.
E�e�⣟��_!���;v,�J$���������i�LnN4�c��@���A��G���[*����K'�e� 8�&$Ҕ�֦G��a���vm�9�Z�y�s���
B+�X:K8�[*ly�o�T��UY�A�G�+�N�k�4����C���	��W@��w���'RZ�<p�����a��͛ٿ?A099��͛9p����LNN��~	�U]ձ0y��{A����O���@A�8\��jǷ\w���B�Z���ػw/�j��{�255���]�v155�s�=����?�x�{�Z��8�5<J��N
���:�_y��q��#�$��077ǡC�x��'9x� ���iҾ���*�J���u*�J���J��D�6�
��1PA�����:���z�oۀw�B�j����VJE���
G�9$���B���Q~��?�[n�B��B]�Vy�'x��yꩧ�V�MI�J葠ؚO��TĀ#���5Q�K��:
T�{
]_���81h߾}<x�Ç��ϳo߾�:�Z�@�DUcp�,�ؒ��C�@gW�~1,��؉�~�i�6�f�v�[���;w����ҕ%�p�=�&�⇊o�^��V�C�|y�~�=��QWE@UkIb^��G�Zs[�ؙj=1"���R��y�;QB�MסR)���|e����9wᒬ@�j�ǿ�#�}M7]ׁfN~��a,�#�)Ѽ�Izk�ܱ�~�F�+��(�>����0�x����\T$��\��t��~���>k�V��ezz*x1��M��vgN�������F� ��N_���� DmH��=�18��P,��R���A_]�el��羯~��K��6���;}i�����<��r���o�ق@#wV] Xa���`~v��5���r� ��=
����`DP1X�B��M��7�	���>sݝm.h�����X��H$����\JQ2�0?7K�@���m�`C����X!��NH��Ktvu���zwѴ�fK����J��\bG�5[ũ(b �}�uj��c���.�đ���Ո�V1�+.��`��E�b�KJ%J��B���5͜H�_K�ɪ�
�wަ���ʆ
�K
ܢKP
�a؂Z_cL$3��v\<�a�':ڧPl�6e�&�H�
�A�XL֤ļ,�����Q���(��8���q�7E#�a�G�8��Z�9�5mJ$�F��g�1}����<>�'���?{�Ņ�7ވj�8o��w�::�ԧ?ˆ�܂�8I�	Alj���ȕ�-�l٨1}T��s���G�p�^g��[GDz*���'�vz���zϮ]L=ʛ~������OP�.����q�J]�k@ �I}QQeaa���4'k5n��w��?�5�S%�<���|�QQac�z�V9]�c�蛜���2:����r7��"	��-�J�.�2�7��4�gf�T���{�菦'ET%~it�|�Nww�޾�4%����:<D�V��4�qP��'��uT�6��@J�X:���?���7
s���2O~�.�8p�Vc��X�i���松�Qz��ïɩz���Uz�rE$Aw
I*䭼��G��L3{�ƙC/26>���Yզ
����r��Y�C7E2*��ĉ�xe��t��뇇�>N_�@���zK�} �>^�uw��f���S�y���G8>3�[oc��hV��.=[;���Q
qiMJo����#̞�q��0<�'Υ\�N���2#�M�*n���[ogd|�=�_�x�3�|���"�{>��f����c�ǚ*fN�D����:���tѬ\K��Z7w������E)�|��{�;r��Yz���>57K��BO�@\
������=�������)�M�`�%F�U(n�+��6oQ+J�����{ �7P���>�����Hܾ�T&O�
��05i�\ep�6^����r�܈�ir~�i�
��}^ﱂ�q��+��{ה(X�*������T_ (�����,��AI�D*�V
�7��\�޾P^N[���ɢ�r�[.��[(6ՖuN�������a��@��AG��ijl��%��U`�Am�M|.-��ID��G�z�4�}ZX	qs�VrV�2����s5��	�5m-6�ж��W��L��՗ʫ<FRdl.�RtDr��\Ť�(��I5�q�q"�����o���'-��-���
-]"����Ȓm��h�J�j��|M]YV��UVP������u�Jb玔V�ony�W�����B1Ξ6�FZ�T�������g�B�a*!�L�dW�����XӇ}��|�;�YJ����H5^�1'"[��:��y���������ۀ
������d=_[>N��pR��RIEND�B`��liFD$ebc7ebeb-0486-1173-a2a2-eaea0594271apl.png8�PNG


IHDR00W��	pHYs��
OiCCPPhotoshop ICC profilexڝSgTS�=���BK���KoR RB���&*!	J�!��Q�EEȠ�����Q,�
��!��������{�kּ�����>�����H3Q5��B������.@�
$p�d!s�#�~<<+"��x��M��0���B�\���t�8K�@z�B�@F���&S�`�cb�P-`'������{[�!�� e�Dh;��V�EX0fK�9�-0IWfH�����0Q��){`�##x��F�W<�+��*x��<�$9E�[-qWW.(�I+6aa�@.�y�2�4�������x����6��_-��"bb��ϫp@�t~�,/��;�m��%�h^�u��f�@����W�p�~<<E���������J�B[a�W}�g�_�W�l�~<�����$�2]�G�����L�ϒ	�b��G�����"�Ib�X*�Qq�D���2�"�B�)�%�d��,�>�5�j>{�-�]c�K'Xt���o��(�h���w��?�G�%�fI�q^D$.Tʳ?�D��*�A�,����`6�B$��BB
d�r`)��B(�Ͱ*`/�@4�Qh��p.�U�=p�a��(��	A�a!ڈb�X#����!�H�$ ɈQ"K�5H1R�T UH�=r9�\F��;�2����G1���Q=��C��7�F��dt1�����r�=�6��Ыhڏ>C�0��3�l0.��B�8,	�c˱"����V����cϱw�E�	6wB aAHXLXN�H� $4�	7	�Q�'"��K�&���b21�XH,#��/{�C�7$�C2'��I��T��F�nR#�,��4H#���dk�9�, +ȅ����3��!�[
�b@q��S�(R�jJ��4�e�2AU��Rݨ�T5�ZB���R�Q��4u�9̓IK�����hh�i��t�ݕN��W���G���w
��Ljg(�gw��L�Ӌ�T071���oUX*�*|��
�J�&�*/T����ުU�U�T��^S}�FU3S�	Ԗ�U��P�SSg�;���g�oT?�~Y��Y�L�OC�Q��_�� c�x,!k
��u�5�&���|v*�����=���9C3J3W�R�f?�q��tN	�(���~���)�)�4L�1e\k����X�H�Q�G�6����E�Y��A�J'\'Gg����S�Sݧ
�M=:��.�k���Dw�n��^��Lo��y��}/�T�m���GX�$��<�5qo</���QC]�@C�a�a�ᄑ��<��F�F�i�\�$�m�mƣ&&!&KM�M�RM��)�;L;L���͢�֙5�=1�2��כ߷`ZxZ,����eI��Z�Yn�Z9Y�XUZ]�F���%ֻ�����N�N���gð�ɶ�����ۮ�m�}agbg�Ů��}�}��=
���Z~s�r:V:ޚΜ�?}���/gX���3��)�i�S��Ggg�s�󈋉K��.�>.���Ƚ�Jt�q]�z�������ۯ�6�i�ܟ�4�)�Y3s���C�Q��?��0k߬~OCO�g��#/c/�W�װ��w��a�>�>r��>�<7�2�Y_�7��ȷ�O�o�_��C#�d�z����%g��A�[��z|!��?:�e����A���AA�����!h�쐭!��Α�i�P~���a�a��~'���W�?�p�X�1�5w��Cs�D�D�Dޛg1O9�-J5*>�.j<�7�4�?�.fY��X�XIlK9.*�6nl�������{�/�]py�����.,:�@L�N8��A*��%�w%�
y��g"/�6ш�C\*N�H*Mz�쑼5y$�3�,幄'���L
Lݛ:��v m2=:�1����qB�!M��g�g�fvˬe����n��/��k���Y-
�B��TZ(�*�geWf�͉�9���+��̳�ې7����ᒶ��KW-X潬j9�<qy�
�+�V�<���*m�O��W��~�&zMk�^�ʂ��k�U
�}����]OX/Yߵa���>������(�x��oʿ�ܔ���Ĺd�f�f���-�[����n
�ڴ
�V��E�/��(ۻ��C���<��e����;?T�T�T�T6��ݵa�n��{��4���[���>ɾ�UUM�f�e�I���?�����m]�Nmq����#�׹���=TR��+�G�����w-
6
U����#pDy��	�
:�v�{���vg/jB��F�S��[b[�O�>����z�G��4<YyJ�T�i��ӓg�ό���}~.��`ۢ�{�c��jo�t��E���;�;�\�t���W�W��:_m�t�<���Oǻ�����\k��z��{f���7���y���՞9=ݽ�zo�����~r'��˻�w'O�_�@�A�C݇�?[�����j�w����G�������C���ˆ
��8>99�?r��C�d�&����ˮ/~�����јѡ�򗓿m|�����������x31^�V��w�w��O�| (�h���SЧ�������c3-�gAMA��|�Q� cHRMz%������u0�`:�o�_�F	SIDATx�̙]�]U�k���;3������v��6D���6��4����XL��I�H �`��G�A�"%���bAjE[�G�
ԙ�3s�9{/��>��v�-1���{Ͼ���>����GT����XRPPD@��[�߫�N�)6W�՜O}j�7N���M�;�Neg>8�[���Dwck��,RU�>1A�j#�?���:U
%ree5�Ӌ3g��.�p��v.u���Se5w,g����2Fd+�$Q`^z߮��]73=���\� t�w�{x������2�Z�딕唥��D������_޹~�Cy@U���W�Dj�H����ִ,�)ֽʧo����z)Q'&L��G_Yz��W��<Q��s����Xk�����o���C��KWzX'�jQ��yN E܄Itկ_>�l4��\�y�ח�vྺ.�B�k�<�'�m��������P@�$�o���g�(QC�Z;��� �מx�	�9V�b�?o�f�ճ�%OsT�8D�����y|�_�������b4Z��w=�(t�A�>U��3*#Ykɲ�r�HAEda@�?r�0���k)�@?�_D�2G!"�ܮ�E-�[i��^�HD�!�U{腗��)�imEg�K��N[�h�V������՚j��� �`��BY/#0IP�)��@�ĝ�>�̛:���;￳��#�C`c�q dN�$H���"�������L����������ށ|��f�&(�bAXq��A\*Q�E7�WG���=A��3z�D6������s�=k
��SP�IzA\�Y%
��Ryb2���6��=a���0��'*�_�r�q���qα���t:U�cL�	��"�}���ak����Y��]?1�wIj��_<��o|M�l�Y�9�Y��-�ڲ��(���Uz;�|�yz��,�9O�8v�m%��:RN��) ��Bjx�R��ŕŧ����ndn��7u����V[2�Z��(qny��_�4,]�$&���Y���^��r�u8gq��Zcar�[ؼy�ɩ6Nӝ�`��s���٩Wv|�+�d2JC��g�����j^`�_4��g9����u
�ӓ
�s`m��j����α��J��#�-��+���ضm#p��w�z�,*� �"6]>��	����u�o��)
���2�Ք�8~�$�vͱ~z�2%�X��d��!�B�0 
!p�Ի��n%�䐥=�Р"N�]�ۧ�#yo�u���<9��Ц�leTi,����9���
E���tq*�0"��S(� B�gt�݂}�b�Dh�P���uq8�z�4q@<rK�VC������U<���q�&���!��$"�C�$'J�S��ka��v0�T[)��i��Ov΍�R
���)f++�“O>7�Z��`2U�ƛ��f��d��M3�&@Q6l�a�e�#e͕	�D�8M�'��YZ�C	�)���ؿ�VD��u9Y���)b�b����_":��]�w�tbE���DQ����W���h�Gx�b����4 JG�Q̺n���$Bwr�}��˜�}$'uA�t׍�/
�/��`����?>ux�ޢ��_�c6�s#
�R{�&f�u�K�gV�g���W���o�3�S�A��
�[Q\y@غ��

#{��NU:H]�������S��7"-����V�����IDp�́U�d�����,-=���m��}��A��z;�; /����y��w)k�yZ��5�\��ː\�m��|�.�G*%���X=��:cK+&��A�j���#�����b8��Qc�i`j�<�W�LDpR�C�ChϾ�;�S�J�� 
LՍ�%��n}5]�r��}�5���3���������Pj�x��,���W�]kG�rulH�E���ů�@z�\_W��qh'xɫ�1郻z�ƖMb�������޴ٴ�jtRp���
�̶��.��n��-['�vn,a�T�*Zj���/m��p�|mY?�0�9�I��{^��Uɮj�P�_����z�!.dl.�Fj@�����8rN���ԴT�� Nb�.�Rs�e��3�&��x��߫��/W�6��q<`�����k8���Z�����׉��HQ`n�/y�f�8�kF����垶�b��QmW`LNMr͵�i/��g�?}�8���97Ai%�ZCA]���095�7~��Xڕ�(Un��ڕ�y��\*�J?��m�'>r0��_�����r�>�l]B���T��as��e��b?���\� 4��(�$0�ݏJ�� �cs"��;�ߏ���m��g�<����T��>b�F:��8��
0 O�6^�ZIEND�B`��liFD$bdafd78e-0486-1173-a2a2-eaea0594271ac++.png��PNG


IHDR00W��	pHYs��
OiCCPPhotoshop ICC profilexڝSgTS�=���BK���KoR RB���&*!	J�!��Q�EEȠ�����Q,�
��!��������{�kּ�����>�����H3Q5��B������.@�
$p�d!s�#�~<<+"��x��M��0���B�\���t�8K�@z�B�@F���&S�`�cb�P-`'������{[�!�� e�Dh;��V�EX0fK�9�-0IWfH�����0Q��){`�##x��F�W<�+��*x��<�$9E�[-qWW.(�I+6aa�@.�y�2�4�������x����6��_-��"bb��ϫp@�t~�,/��;�m��%�h^�u��f�@����W�p�~<<E���������J�B[a�W}�g�_�W�l�~<�����$�2]�G�����L�ϒ	�b��G�����"�Ib�X*�Qq�D���2�"�B�)�%�d��,�>�5�j>{�-�]c�K'Xt���o��(�h���w��?�G�%�fI�q^D$.Tʳ?�D��*�A�,����`6�B$��BB
d�r`)��B(�Ͱ*`/�@4�Qh��p.�U�=p�a��(��	A�a!ڈb�X#����!�H�$ ɈQ"K�5H1R�T UH�=r9�\F��;�2����G1���Q=��C��7�F��dt1�����r�=�6��Ыhڏ>C�0��3�l0.��B�8,	�c˱"����V����cϱw�E�	6wB aAHXLXN�H� $4�	7	�Q�'"��K�&���b21�XH,#��/{�C�7$�C2'��I��T��F�nR#�,��4H#���dk�9�, +ȅ����3��!�[
�b@q��S�(R�jJ��4�e�2AU��Rݨ�T5�ZB���R�Q��4u�9̓IK�����hh�i��t�ݕN��W���G���w
��Ljg(�gw��L�Ӌ�T071���oUX*�*|��
�J�&�*/T����ުU�U�T��^S}�FU3S�	Ԗ�U��P�SSg�;���g�oT?�~Y��Y�L�OC�Q��_�� c�x,!k
��u�5�&���|v*�����=���9C3J3W�R�f?�q��tN	�(���~���)�)�4L�1e\k����X�H�Q�G�6����E�Y��A�J'\'Gg����S�Sݧ
�M=:��.�k���Dw�n��^��Lo��y��}/�T�m���GX�$��<�5qo</���QC]�@C�a�a�ᄑ��<��F�F�i�\�$�m�mƣ&&!&KM�M�RM��)�;L;L���͢�֙5�=1�2��כ߷`ZxZ,����eI��Z�Yn�Z9Y�XUZ]�F���%ֻ�����N�N���gð�ɶ�����ۮ�m�}agbg�Ů��}�}��=
���Z~s�r:V:ޚΜ�?}���/gX���3��)�i�S��Ggg�s�󈋉K��.�>.���Ƚ�Jt�q]�z�������ۯ�6�i�ܟ�4�)�Y3s���C�Q��?��0k߬~OCO�g��#/c/�W�װ��w��a�>�>r��>�<7�2�Y_�7��ȷ�O�o�_��C#�d�z����%g��A�[��z|!��?:�e����A���AA�����!h�쐭!��Α�i�P~���a�a��~'���W�?�p�X�1�5w��Cs�D�D�Dޛg1O9�-J5*>�.j<�7�4�?�.fY��X�XIlK9.*�6nl�������{�/�]py�����.,:�@L�N8��A*��%�w%�
y��g"/�6ш�C\*N�H*Mz�쑼5y$�3�,幄'���L
Lݛ:��v m2=:�1����qB�!M��g�g�fvˬe����n��/��k���Y-
�B��TZ(�*�geWf�͉�9���+��̳�ې7����ᒶ��KW-X潬j9�<qy�
�+�V�<���*m�O��W��~�&zMk�^�ʂ��k�U
�}����]OX/Yߵa���>������(�x��oʿ�ܔ���Ĺd�f�f���-�[����n
�ڴ
�V��E�/��(ۻ��C���<��e����;?T�T�T�T6��ݵa�n��{��4���[���>ɾ�UUM�f�e�I���?�����m]�Nmq����#�׹���=TR��+�G�����w-
6
U����#pDy��	�
:�v�{���vg/jB��F�S��[b[�O�>����z�G��4<YyJ�T�i��ӓg�ό���}~.��`ۢ�{�c��jo�t��E���;�;�\�t���W�W��:_m�t�<���Oǻ�����\k��z��{f���7���y���՞9=ݽ�zo�����~r'��˻�w'O�_�@�A�C݇�?[�����j�w����G�������C���ˆ
��8>99�?r��C�d�&����ˮ/~�����јѡ�򗓿m|�����������x31^�V��w�w��O�| (�h���SЧ�������c3-�gAMA��|�Q� cHRMz%������u0�`:�o�_�F	�IDATx�̙k�]U�k�ǽ�3ә�Bie��ӊAS���(���H�B��c��L4!b��A�I��`�"5��G�@�h���R�23��{�9{/?��=��[�N	�����}�9{=����GT��Ɵ�5���(���?�͗���"8uX��D��	���<�b�ʁ�
��'�>��׬f�1�1,i��,RU�>2@�j[���*�TI�H��f�['��FNN�]�������K�J3q��g���b�����<��]�ҟ]62<�g�^�!t��j���w�>
]u6l�딅�����@���4���n\>�<��;_��+�V"tD��[�+�+_S�LiM��ο�2��T nE��?��̡��7\�$'�p��~�h�����KPO�~-���/x2}��u}+Q�|�$�e��_���\[�^;x��&�VB�Xl��^-����4}D��@/!=������vs��7a<S������v�T�GO�$���$QBń�zπ�}��?m��ϑ���z#{��[��;ne�={��=��ޗ+����Q�q�	|�����a����/����M糱�{���d1w�wp���f�'=�rw;/diDUq�hE1����"����z�����c!��%+�ᴘ��fj�S{���5UX�ID��=SL�6YyFD@�����V����,k>Z��ϟ82x��ѹEc��8v�X�o�zo4$����9G�	�I�_��b"��Z=`��SA�3�h"���;����z�-߸��֝��CGy�{5�.�吏X3q
�����SM�99������%�N��ga[�Jss�Zz�����'��YW�Ӝo�8���
^<� Ƥ�)B�+���*���O���C�~���V?��J���US���r��bk;/S�g�)�a<�ƲZ�l�K�2CC5��g^������H�N7v^�5���]��Nl�g-6�8k��:M:�P*����'���l2}r��ql;�8qX�8'��|T!ʠԊ,��ӏ��g��I׷��E]���jE&T3��J�����W�Eݥ�_�
��%�V+��	�:��8�r�1�Y�v5�V�08Tg�Y�4Xh%��.�y��m�����7�cV�Lr�,�ӆ`zz��~�͛.bxx��Ap�Mh6[,̷��9�|���"I,�����7Y�n#p���\�n�sPV�3����>�KV]�gC�X����<q��a6mc�� YJ*c��1c?��}��7����o0:z.�/`�8j��sB���ڛ3,k�/��`h�S@�-d%�J��*�̜bxx(U�Ⱦ�.NEF�<cRe|D���F����S�u�S���a�,��#'=¾[J%
�B���Z�d�7��d�����#���ORKj5C��k~�So�1ƤT�+�D������P&���傊����Q��G��mU\�6��*W\y	6�4���7��b�+�^�AD�I�z��8�Ki�K�kV�H�PB
M��&&�
!�(8X�.!�c�(B��-"�����x�G�^c����!��͏�z"-G���+R��hR:�(y ��6�4�Q�0�B�5����r�v�\�f�Zc�<P����3�h��%�/��?m<u��WOl�`6-r#
�Rx� f]±
.{af���*�[l�R*���'��\2�S�A��m2(�"8��v�uJ�9��@��t��I�K	^ʼn]I����,yU*-�ަ�2�ni's`�R2j���5+-�=�Tߕ�[��С�v�q@&���w��m�hy������"A��z�Kv�k����O�ȺJ���.6�Mj������A�j���D�{�M��p�2��@��)�*Y=Od"���O��B[wl��>-Q���
Ӽ�����iW��Q�e����1^P��z-%�vhJ	�Z"ɠT90)1�߷�Zy.��ʎ%��!E-H�-�z�.�g�uDq��[
���R�jǘt�]K�-ۉU��<��p�Y���MۛfZ��B
Υ<�c�}�ٶ�ܻe�-������3��]-�w�ٗ��ز}��l9�Ѓ9;It�_���ң�˓]�H)��r	пZ�Mz����9��.m�4���q%�9UL)(������
�Z���l���\��sF��a-�d�*���+\�L�R<`�Qf���q���E�'�R'F�#E���c<��sÅ��`$�~��i;!��P�a�~h��.N��Z��>��~�Z��ƱnJ%at���U_,
�CC\zŧ�K����m'�j�+=>�*g
���Qd��I	��8��[��Jv9��ql�b��O%H6y�?.�Y_ߣ���͙y �����D�� �K(�Ddݏ~w����!"_�pWD.��H%?O4@��0#K���a���'���@IEND�B`��liFD$bc26a07a-0486-1173-a2a2-eaea0594271ash.png��PNG


IHDR00W��	pHYs��
OiCCPPhotoshop ICC profilexڝSgTS�=���BK���KoR RB���&*!	J�!��Q�EEȠ�����Q,�
��!��������{�kּ�����>�����H3Q5��B������.@�
$p�d!s�#�~<<+"��x��M��0���B�\���t�8K�@z�B�@F���&S�`�cb�P-`'������{[�!�� e�Dh;��V�EX0fK�9�-0IWfH�����0Q��){`�##x��F�W<�+��*x��<�$9E�[-qWW.(�I+6aa�@.�y�2�4�������x����6��_-��"bb��ϫp@�t~�,/��;�m��%�h^�u��f�@����W�p�~<<E���������J�B[a�W}�g�_�W�l�~<�����$�2]�G�����L�ϒ	�b��G�����"�Ib�X*�Qq�D���2�"�B�)�%�d��,�>�5�j>{�-�]c�K'Xt���o��(�h���w��?�G�%�fI�q^D$.Tʳ?�D��*�A�,����`6�B$��BB
d�r`)��B(�Ͱ*`/�@4�Qh��p.�U�=p�a��(��	A�a!ڈb�X#����!�H�$ ɈQ"K�5H1R�T UH�=r9�\F��;�2����G1���Q=��C��7�F��dt1�����r�=�6��Ыhڏ>C�0��3�l0.��B�8,	�c˱"����V����cϱw�E�	6wB aAHXLXN�H� $4�	7	�Q�'"��K�&���b21�XH,#��/{�C�7$�C2'��I��T��F�nR#�,��4H#���dk�9�, +ȅ����3��!�[
�b@q��S�(R�jJ��4�e�2AU��Rݨ�T5�ZB���R�Q��4u�9̓IK�����hh�i��t�ݕN��W���G���w
��Ljg(�gw��L�Ӌ�T071���oUX*�*|��
�J�&�*/T����ުU�U�T��^S}�FU3S�	Ԗ�U��P�SSg�;���g�oT?�~Y��Y�L�OC�Q��_�� c�x,!k
��u�5�&���|v*�����=���9C3J3W�R�f?�q��tN	�(���~���)�)�4L�1e\k����X�H�Q�G�6����E�Y��A�J'\'Gg����S�Sݧ
�M=:��.�k���Dw�n��^��Lo��y��}/�T�m���GX�$��<�5qo</���QC]�@C�a�a�ᄑ��<��F�F�i�\�$�m�mƣ&&!&KM�M�RM��)�;L;L���͢�֙5�=1�2��כ߷`ZxZ,����eI��Z�Yn�Z9Y�XUZ]�F���%ֻ�����N�N���gð�ɶ�����ۮ�m�}agbg�Ů��}�}��=
���Z~s�r:V:ޚΜ�?}���/gX���3��)�i�S��Ggg�s�󈋉K��.�>.���Ƚ�Jt�q]�z�������ۯ�6�i�ܟ�4�)�Y3s���C�Q��?��0k߬~OCO�g��#/c/�W�װ��w��a�>�>r��>�<7�2�Y_�7��ȷ�O�o�_��C#�d�z����%g��A�[��z|!��?:�e����A���AA�����!h�쐭!��Α�i�P~���a�a��~'���W�?�p�X�1�5w��Cs�D�D�Dޛg1O9�-J5*>�.j<�7�4�?�.fY��X�XIlK9.*�6nl�������{�/�]py�����.,:�@L�N8��A*��%�w%�
y��g"/�6ш�C\*N�H*Mz�쑼5y$�3�,幄'���L
Lݛ:��v m2=:�1����qB�!M��g�g�fvˬe����n��/��k���Y-
�B��TZ(�*�geWf�͉�9���+��̳�ې7����ᒶ��KW-X潬j9�<qy�
�+�V�<���*m�O��W��~�&zMk�^�ʂ��k�U
�}����]OX/Yߵa���>������(�x��oʿ�ܔ���Ĺd�f�f���-�[����n
�ڴ
�V��E�/��(ۻ��C���<��e����;?T�T�T�T6��ݵa�n��{��4���[���>ɾ�UUM�f�e�I���?�����m]�Nmq����#�׹���=TR��+�G�����w-
6
U����#pDy��	�
:�v�{���vg/jB��F�S��[b[�O�>����z�G��4<YyJ�T�i��ӓg�ό���}~.��`ۢ�{�c��jo�t��E���;�;�\�t���W�W��:_m�t�<���Oǻ�����\k��z��{f���7���y���՞9=ݽ�zo�����~r'��˻�w'O�_�@�A�C݇�?[�����j�w����G�������C���ˆ
��8>99�?r��C�d�&����ˮ/~�����јѡ�򗓿m|�����������x31^�V��w�w��O�| (�h���SЧ�������c3-�gAMA��|�Q� cHRMz%������u0�`:�o�_�F	�IDATx�̙[�]U���\z�̥z�A
,�
��І�P!�� !>O�b51} ���Qx!&�5jS�A�R$m1�Z��2����{����ok�3Ӟ3�JV�9{�������U�|�O��VPPD@��]���k�:�Sl�D	]4̱#o�ܰzhn����3�n�:�Zm�a���HU��p�����>?T֩�
�(�";3Uq	��'.e��/�*�c.^�>(�S�1hX#���Q�K��k™c�ú��J�{�r�/���}��������_�u�\���<f�E�Y'Y���n��,���^���T"tD������T4�I׽�ǯ�
���;�f��Q=�����m�$IN
d��e�sŴ�b�-�/v�Z˝_���f�g����;X'$jQ��IB �߄��ſy��3��,�$)����w>����s�{�?�9Jb\'!I,6���A�>��?�� B�֞s���m/�6|���]�N���O���,����u����ӱ�$JP� ���80X
�x�;��k���BB��o���?9��c'=fQ��Ś;���<��sr��q:�:� �"�0 ���r��0\���	a*O��~Q�{�^�^��X���s��i/	�|�f�:ut���@#H-Q$�T@��/���rZh��IT����/��ͷ������H�
Ke��g�E�E���N�%��Q��п}�x���g�k�~�ɣ'9����[�b@���s�!4iv�(-@�Ycx��l�u��Ĺ�rm�}�ݩ�~0˃�~�w�5���D����0w��b��/Zu~�����jG�~Z���o�^��!5��Eذ���s
gg�>=��Ynڽ��)�M���@� �J����̂�•7�QT�xLs$�R�T�[�=M���`L�	Z+�N���0<�0�|�W�����`Zz,���w×�y��tݚ&�U�S\�<6K���IwJ%�vV�ԞI:L�9K�8�M�'N�:"N��I!VQ�-��235?��Ͽ���~�-��/ݦ�F�2��gB5;w)���o��6Qԛ���:��a������$�8�Z�sgP�1�a�ƍ�X�f��p���Fi����$���?�xm��?{],��gϼ��ؼ��$'��?-��fx��Gض�2FG�=�s`m��B���g�g��[ Z�$���yN���6�c�?�%��Q18�Z��k�"���7_���>�L�*�(=UMf��G��u�#�mR�`���1c���Ih�'�e||=a(`�8��!pB��>����Y�j~����O-K��iD�R�*LO�2::�
��[�*NEFcRa�D���V���k�#�B���^o?E=��wI��V@(;ay-���)=���2Y5�/B`��Po��!I#��hxAR	k!�VcLr���(
���l��N��,򃊤W�L���ǟ]\���imbQU���
lli�[��#4��r��/X�AD�I�Z$8S�)꽣k��lJhA�)�������A,X��1q!&@��}�%� ��l�u��:��
A�Z"MG�V�+e٨|T�v�g��J�ifA���a�ΊV��W��b���,�h�e�gZk�V`�R�π�9`����??qhIꮗ�߽��ٴ��(�Jaɂ�u��
.{`���g�~�j�ʊp���ҁ=U:u$[^�A��sh[�T���o��S)r��x�*:v���o#R9��>T�@��zI>�n��X�F�\�u�R�'�x��Lu��TA��b;�j��[����4���d��s�$����H_���"�F�8Ⱥ|�EV�i�Ql�Mj����Z��Z%/���xn��VN�]�_(���\���@&"8I��ChǮ����S�J5� %L�>�w�=�[WN�>�v�ɂ�ūT���k��t�@2(U��3�}^+�K鮲����7��������{� =�ˋ�}� 4����U��t�]=pK��2�JU��Gs�݉xIoZn�I�?)8��x��g�썶�];W$�~�d��"PVcc�2�U�BQ}�@}�*���M����0g7���!�*��xy��)������d�26K���F������ �T1�S�ߙ�Lxo�z�����"9����1���z����9߫d�/V�*��A,`���Ė�8���B�����W�Q�HQ`b�/>�b�p�F�`$�~��i��}C��0y?���S!�N��g�=u�z��Ė�^J%`�������0W^��rc�f��d�e��f���k\e���E���x�d��\��?K!{��w�|}�"��yW��a�Ge�~ �����,���!l}XB�m���̉Ȧ>v���.�!"�<osWD�F<R���?d�e9o[>J��|q-wxImIEND�B`��liFD$f3bba182-0485-1173-a2a2-eaea0594271arb.pngp�PNG


IHDR00W��	pHYs��
OiCCPPhotoshop ICC profilexڝSgTS�=���BK���KoR RB���&*!	J�!��Q�EEȠ�����Q,�
��!��������{�kּ�����>�����H3Q5��B������.@�
$p�d!s�#�~<<+"��x��M��0���B�\���t�8K�@z�B�@F���&S�`�cb�P-`'������{[�!�� e�Dh;��V�EX0fK�9�-0IWfH�����0Q��){`�##x��F�W<�+��*x��<�$9E�[-qWW.(�I+6aa�@.�y�2�4�������x����6��_-��"bb��ϫp@�t~�,/��;�m��%�h^�u��f�@����W�p�~<<E���������J�B[a�W}�g�_�W�l�~<�����$�2]�G�����L�ϒ	�b��G�����"�Ib�X*�Qq�D���2�"�B�)�%�d��,�>�5�j>{�-�]c�K'Xt���o��(�h���w��?�G�%�fI�q^D$.Tʳ?�D��*�A�,����`6�B$��BB
d�r`)��B(�Ͱ*`/�@4�Qh��p.�U�=p�a��(��	A�a!ڈb�X#����!�H�$ ɈQ"K�5H1R�T UH�=r9�\F��;�2����G1���Q=��C��7�F��dt1�����r�=�6��Ыhڏ>C�0��3�l0.��B�8,	�c˱"����V����cϱw�E�	6wB aAHXLXN�H� $4�	7	�Q�'"��K�&���b21�XH,#��/{�C�7$�C2'��I��T��F�nR#�,��4H#���dk�9�, +ȅ����3��!�[
�b@q��S�(R�jJ��4�e�2AU��Rݨ�T5�ZB���R�Q��4u�9̓IK�����hh�i��t�ݕN��W���G���w
��Ljg(�gw��L�Ӌ�T071���oUX*�*|��
�J�&�*/T����ުU�U�T��^S}�FU3S�	Ԗ�U��P�SSg�;���g�oT?�~Y��Y�L�OC�Q��_�� c�x,!k
��u�5�&���|v*�����=���9C3J3W�R�f?�q��tN	�(���~���)�)�4L�1e\k����X�H�Q�G�6����E�Y��A�J'\'Gg����S�Sݧ
�M=:��.�k���Dw�n��^��Lo��y��}/�T�m���GX�$��<�5qo</���QC]�@C�a�a�ᄑ��<��F�F�i�\�$�m�mƣ&&!&KM�M�RM��)�;L;L���͢�֙5�=1�2��כ߷`ZxZ,����eI��Z�Yn�Z9Y�XUZ]�F���%ֻ�����N�N���gð�ɶ�����ۮ�m�}agbg�Ů��}�}��=
���Z~s�r:V:ޚΜ�?}���/gX���3��)�i�S��Ggg�s�󈋉K��.�>.���Ƚ�Jt�q]�z�������ۯ�6�i�ܟ�4�)�Y3s���C�Q��?��0k߬~OCO�g��#/c/�W�װ��w��a�>�>r��>�<7�2�Y_�7��ȷ�O�o�_��C#�d�z����%g��A�[��z|!��?:�e����A���AA�����!h�쐭!��Α�i�P~���a�a��~'���W�?�p�X�1�5w��Cs�D�D�Dޛg1O9�-J5*>�.j<�7�4�?�.fY��X�XIlK9.*�6nl�������{�/�]py�����.,:�@L�N8��A*��%�w%�
y��g"/�6ш�C\*N�H*Mz�쑼5y$�3�,幄'���L
Lݛ:��v m2=:�1����qB�!M��g�g�fvˬe����n��/��k���Y-
�B��TZ(�*�geWf�͉�9���+��̳�ې7����ᒶ��KW-X潬j9�<qy�
�+�V�<���*m�O��W��~�&zMk�^�ʂ��k�U
�}����]OX/Yߵa���>������(�x��oʿ�ܔ���Ĺd�f�f���-�[����n
�ڴ
�V��E�/��(ۻ��C���<��e����;?T�T�T�T6��ݵa�n��{��4���[���>ɾ�UUM�f�e�I���?�����m]�Nmq����#�׹���=TR��+�G�����w-
6
U����#pDy��	�
:�v�{���vg/jB��F�S��[b[�O�>����z�G��4<YyJ�T�i��ӓg�ό���}~.��`ۢ�{�c��jo�t��E���;�;�\�t���W�W��:_m�t�<���Oǻ�����\k��z��{f���7���y���՞9=ݽ�zo�����~r'��˻�w'O�_�@�A�C݇�?[�����j�w����G�������C���ˆ
��8>99�?r��C�d�&����ˮ/~�����јѡ�򗓿m|�����������x31^�V��w�w��O�| (�h���SЧ�������c3-�gAMA��|�Q� cHRMz%������u0�`:�o�_�F	�IDATx�̙]�U�kϜ9��~����Z���i�A�{i�
$�"��4�>x�� �!�A_4��1�@H�#1j���h��"�P��h�B뽷�����{�0_{�9��s��I&�̞=���������r���WPPD@)����E_���*�r�E�q��k7�Y�~�Xr��ݸi##�Q�a�#���2��:V�y�G����O�̈TYZ�y����䙹ƸK!�>����TYN�ɪ�A�B�A���"�F`^x�.].����ռW
�����v�������%�Wa���3?��i�hE����'v�O�OP������*�:"R��m>��>���d�^��k�Bp��A�NL�6��C/Ͽ��K���P�(C�9W��Z���~mw�wGO�~�🋗:X'�jQ��iJ Y܄��%�z��S�-�dU�iZ��ڞ��,�U���y��1R��:)ij�iBd #�h���0F��}���bj��9@��lؼ���/�Ά�z&�mп�8E�Z:֒�)i�B@C�����;/�UC�����̡�9W�~�r�m7��;|X%IvƝ�f ���0� �����||#B�=\^�A�� '��,�������;V��L��w���	���B���B����gϽ�
��@P�ً����T��S�u�x�D�^>�g��^��� �`�|��NB `�Bd���Z#�x���G2`5ǝ��ɦ�7��?��C`c�Q �&[�f@eD�V��ug�e0u񸪖��h���<��G�������w*=��E0A�c�l�tQB�&�_<�������O�J|��=���b6�䋰i�
\q�5�;����Ξ�};����̀�*
�b�$NI,,,,��^yK�u#���G�_���|}�O�j�)`����f�>��,��Z;��5�ϟ;��{�gN�g^z<�ұ��/��O�Ʃ�U�S������S�|jҝ�RK��U>r���e�Μ�m��/$I�:bN��� �Q-<�ز0�4��O���[_��؀��yݲi�8wo1'T�yWF�]\���$�{Sװќ�Y�K�N�MR�u8gq6�Zca�y�F��&k�v����:)���''^��O^�� x��So釶�e9-�;��
���^��Qv���ў�9�6ey���b�s�gY\\&^���%N��m�n݂8��I.ݺ�s�l4X�$#�#��}�SWL]=`A�/�
*JOU�{���c��9��(�$�X*�d��!l��a@B�ĉ�ز�B�0�$��!pB�R�<�6ͷ�Y�n}��c����JȚ�J��*�ϟebb,3�Tߪ�SQĀ����̘0�4��ng����C!j������OD��J`%��Vm�^�x����E����!0B���
�($m�4�M�c��ka#��na��t�08���l�B�,
Y���H֪��	£�>�!4O5\�d����\�M,��6��'	M�����d����D�&�G��3�d��ޛ��*-զ���A�	��7[���p`���$IH�1t�1F��3/�V���v�lE �*A�,97\Q�Te���Q�#<1P�Ms%����5�v	�Q���{��䚢]$'eB�l��^d��E�h/)x����]/_�o��ٴ�FD��dI�:Ķ
.a��ٞU�[����f���ҩ� y��ʡ�&\x@{�:��
{��N�:H��d�ŃW�c��_�ڜ���Z��W�ᓈ�ۙ�xbTM��Z�k�Z<���g�{��"R�C��k�L<mX�y��G�k��j3�i�Ͼd�.}�F�8�w�t�L%��X=��R��e_o#X�N^�E��|P�1�t�̠1��	�KU
���$���{g�k�O=*�ƒT0-��p�A���n]9]��ڽ3%��W3��'�Uh��t�@r(�6L<f��֞��6��relH��^�����{� =7�+��q�04��<�bL����Z�JX���R�����D��7�ͭ����x���ӏ��m��wS���fʕ-����9�lWE˅8
���`�^7S��/>�a�n=��ÞW��x������S��
�Zm����
_�z��n��<�9U����in�7@ԌX�_�s�i���%��Q_#�Wɡ%�V�:��a<`�����8��҈��,ثĨW�(0�c��}�d����$���1m�&��1L�Ï�r��q'^��3O&jFL����V�0@PW�(���q����z�9H�[	]=�>�q��B(�s�z~��>sݿ�Y��~ ��Ė)��(v%H6u�_������=�p��y�@30��ʈj� �C$s"����>����CD>|��]��H��O4@��0/����~:�;!}�=�BvIEND�B`��liFD$e25c83d8-0485-1173-a2a2-eaea0594271apy.png��PNG


IHDR00W��	pHYs��
OiCCPPhotoshop ICC profilexڝSgTS�=���BK���KoR RB���&*!	J�!��Q�EEȠ�����Q,�
��!��������{�kּ�����>�����H3Q5��B������.@�
$p�d!s�#�~<<+"��x��M��0���B�\���t�8K�@z�B�@F���&S�`�cb�P-`'������{[�!�� e�Dh;��V�EX0fK�9�-0IWfH�����0Q��){`�##x��F�W<�+��*x��<�$9E�[-qWW.(�I+6aa�@.�y�2�4�������x����6��_-��"bb��ϫp@�t~�,/��;�m��%�h^�u��f�@����W�p�~<<E���������J�B[a�W}�g�_�W�l�~<�����$�2]�G�����L�ϒ	�b��G�����"�Ib�X*�Qq�D���2�"�B�)�%�d��,�>�5�j>{�-�]c�K'Xt���o��(�h���w��?�G�%�fI�q^D$.Tʳ?�D��*�A�,����`6�B$��BB
d�r`)��B(�Ͱ*`/�@4�Qh��p.�U�=p�a��(��	A�a!ڈb�X#����!�H�$ ɈQ"K�5H1R�T UH�=r9�\F��;�2����G1���Q=��C��7�F��dt1�����r�=�6��Ыhڏ>C�0��3�l0.��B�8,	�c˱"����V����cϱw�E�	6wB aAHXLXN�H� $4�	7	�Q�'"��K�&���b21�XH,#��/{�C�7$�C2'��I��T��F�nR#�,��4H#���dk�9�, +ȅ����3��!�[
�b@q��S�(R�jJ��4�e�2AU��Rݨ�T5�ZB���R�Q��4u�9̓IK�����hh�i��t�ݕN��W���G���w
��Ljg(�gw��L�Ӌ�T071���oUX*�*|��
�J�&�*/T����ުU�U�T��^S}�FU3S�	Ԗ�U��P�SSg�;���g�oT?�~Y��Y�L�OC�Q��_�� c�x,!k
��u�5�&���|v*�����=���9C3J3W�R�f?�q��tN	�(���~���)�)�4L�1e\k����X�H�Q�G�6����E�Y��A�J'\'Gg����S�Sݧ
�M=:��.�k���Dw�n��^��Lo��y��}/�T�m���GX�$��<�5qo</���QC]�@C�a�a�ᄑ��<��F�F�i�\�$�m�mƣ&&!&KM�M�RM��)�;L;L���͢�֙5�=1�2��כ߷`ZxZ,����eI��Z�Yn�Z9Y�XUZ]�F���%ֻ�����N�N���gð�ɶ�����ۮ�m�}agbg�Ů��}�}��=
���Z~s�r:V:ޚΜ�?}���/gX���3��)�i�S��Ggg�s�󈋉K��.�>.���Ƚ�Jt�q]�z�������ۯ�6�i�ܟ�4�)�Y3s���C�Q��?��0k߬~OCO�g��#/c/�W�װ��w��a�>�>r��>�<7�2�Y_�7��ȷ�O�o�_��C#�d�z����%g��A�[��z|!��?:�e����A���AA�����!h�쐭!��Α�i�P~���a�a��~'���W�?�p�X�1�5w��Cs�D�D�Dޛg1O9�-J5*>�.j<�7�4�?�.fY��X�XIlK9.*�6nl�������{�/�]py�����.,:�@L�N8��A*��%�w%�
y��g"/�6ш�C\*N�H*Mz�쑼5y$�3�,幄'���L
Lݛ:��v m2=:�1����qB�!M��g�g�fvˬe����n��/��k���Y-
�B��TZ(�*�geWf�͉�9���+��̳�ې7����ᒶ��KW-X潬j9�<qy�
�+�V�<���*m�O��W��~�&zMk�^�ʂ��k�U
�}����]OX/Yߵa���>������(�x��oʿ�ܔ���Ĺd�f�f���-�[����n
�ڴ
�V��E�/��(ۻ��C���<��e����;?T�T�T�T6��ݵa�n��{��4���[���>ɾ�UUM�f�e�I���?�����m]�Nmq����#�׹���=TR��+�G�����w-
6
U����#pDy��	�
:�v�{���vg/jB��F�S��[b[�O�>����z�G��4<YyJ�T�i��ӓg�ό���}~.��`ۢ�{�c��jo�t��E���;�;�\�t���W�W��:_m�t�<���Oǻ�����\k��z��{f���7���y���՞9=ݽ�zo�����~r'��˻�w'O�_�@�A�C݇�?[�����j�w����G�������C���ˆ
��8>99�?r��C�d�&����ˮ/~�����јѡ�򗓿m|�����������x31^�V��w�w��O�| (�h���SЧ�������c3-�gAMA��|�Q� cHRMz%������u0�`:�o�_�F	�IDATx�̙k�U�k�㜞��Z���q��6D���6�E�i�ib�1&Ę�/��	A�	> ?���FE$h+�"� �h/
�/��{��{���0�3s�i{N	�I&�̞=���k�=�����?�

*��( ���x�>���:�&J��p��#�~k�9ˇ�׭�g?�Օ�d�1�1t��LRU&?5D�j[���)?T橒*�(������F]��ɵ��їN���1��:(�S�1�/�S<��v�r�ؒ�=��J���ׯ�^�v;ѡ+��M�b��0�l.`���d1������U����L�)�#"�oy��|N�2�9�7���"8|ߠq+"����p��7�om߸nM��3R�9�G}D-���E]�*x�k��~u�s���W���[�"�$)Nkm�u~��~���y`z��&�VB�Xl��^-����,�x\�����w޿��ߜm��=��!n���<���oFU�y�Nn���=���CGY�f���$Q��z��"b�`ջ�?l���}w?p�B9�o��m�؍w��=7�S<�$	k'h�6O���3q��N5OA��O{m�����S�T^�dgr��c�KG�ֲ����~�:v\�����
�Ħ�-3�SG+��Լ��')�||��G_zuu�1�N�;���NQ�8��ų�괸>0}E9o�y(�u�|>�Y�zQ��Y��[1���n%��'��k׳�>t"0�ᶟ�����;,��o�~�Z����db�`��#��)����)'�H=`d����%�?�q��9��u��[{r����Yf�gN-��#������ Nc vfJq��勻l�l�}�*���Su�{��7�Ƚ����
@1&�Lj�_
�T��*��Η��5yt�o�0��GQU	Sj:�x���nI�#;���Nf�g8��^�jS0��x�%�� �R���8���̞�[�����ה�Z�d�/~�-_���\Q'��s��X�Y��֙h�Y�R)��U>w���E�fO�0��������ȁSpbR�>��^��rlna�_ܻ��?���[����
�8g��jE&T3��J����Eݥ�_�����%�V+��	�:��8��b���}�=w%+V�3<Rg�1�C,�N[8yc�׮�2�~��?��~f�R��;���!��;�k�f��j�k[,̷8�<��"�b�$���/���c��	���wX�z�sP��=���Id_���+.볡�������d��?=Æ
���
�rHK���1#����{$���y���U�~�⨅�T�	�K8|�=j�5YҨᩙ���[�L�4�J��*4��I���v���#���1�2�"�IL��H��)6K�F���0�Y�����a�-��X�L�XN�R2z��m�jz_�^����'�%���F�5?�7�cR���|��c�y��C(�Bs�rAE����(���S�6����s)��*�]~16�4��/�7��t�8��Z�AD�I�z��
�A����eiioJhA�)����m�
�A,X��1q!�C��y�<ϣ^��a�zj�D���K=��#'k�)e�L4)mG�<��@n�yЀ(~�!K�^���!�n��r�v��!@��d�� e�(�F;xI���NO���U�6u0��Q)<Y�R��셙��=��XVۡ�Wm�jpɔNɦ�ɠX�T�����)��h��t��A�Z$�/%x;v%ųk#R�Y��T ZX�Me�`;s`�R2j���5+-�>�|߻[�nB�
B��I���rK�y�.��ݣ�U2�ڲu��e��/YإG��*�]>���}�i�Q,�%��"cK%&����`�*yi�(��f�j��3d���vS�U�z��D')~���?�6o�;|Z�R�=H��⌈:k���.s|6v�֩�ʥ�3�h)�CSJH�H���w������s)�UV,Y��
)�h)@
n)�{t!=S�#��u� 4��Jɫc�w-�[ڶl'V�ZP�l^�yg!ަ7m/�i�?)8��x���vg�^c��ě��*,[$�jn�`خvU�0T�1�g_�cӕS�e�ɇ��I������=^���FJu�K���Jo���݌�I�Hui�'���+AΩbJA�'5͔/-�B�5���9�ex9gTM�žJ�|��AKJ��U�����2�M����o�/�(:�<�:1�)
L����_..��#I��lM۱	�7�*���#�\xQ�DԊ�����#��L��솠TF������bQ��>�^X��f?Un;�U+_��W9Se~�"[�OJ����\�o�l+���@��DZ-J��=��J�8l���#__��c��͙y ����ǥD{� �s"���������v��gO��+"��%R�
�:4�ڝ�$�+J���xIEND�B`��liFD$7d242227-0485-1173-a2a2-eaea0594271apl.png8�PNG


IHDR00W��	pHYs��
OiCCPPhotoshop ICC profilexڝSgTS�=���BK���KoR RB���&*!	J�!��Q�EEȠ�����Q,�
��!��������{�kּ�����>�����H3Q5��B������.@�
$p�d!s�#�~<<+"��x��M��0���B�\���t�8K�@z�B�@F���&S�`�cb�P-`'������{[�!�� e�Dh;��V�EX0fK�9�-0IWfH�����0Q��){`�##x��F�W<�+��*x��<�$9E�[-qWW.(�I+6aa�@.�y�2�4�������x����6��_-��"bb��ϫp@�t~�,/��;�m��%�h^�u��f�@����W�p�~<<E���������J�B[a�W}�g�_�W�l�~<�����$�2]�G�����L�ϒ	�b��G�����"�Ib�X*�Qq�D���2�"�B�)�%�d��,�>�5�j>{�-�]c�K'Xt���o��(�h���w��?�G�%�fI�q^D$.Tʳ?�D��*�A�,����`6�B$��BB
d�r`)��B(�Ͱ*`/�@4�Qh��p.�U�=p�a��(��	A�a!ڈb�X#����!�H�$ ɈQ"K�5H1R�T UH�=r9�\F��;�2����G1���Q=��C��7�F��dt1�����r�=�6��Ыhڏ>C�0��3�l0.��B�8,	�c˱"����V����cϱw�E�	6wB aAHXLXN�H� $4�	7	�Q�'"��K�&���b21�XH,#��/{�C�7$�C2'��I��T��F�nR#�,��4H#���dk�9�, +ȅ����3��!�[
�b@q��S�(R�jJ��4�e�2AU��Rݨ�T5�ZB���R�Q��4u�9̓IK�����hh�i��t�ݕN��W���G���w
��Ljg(�gw��L�Ӌ�T071���oUX*�*|��
�J�&�*/T����ުU�U�T��^S}�FU3S�	Ԗ�U��P�SSg�;���g�oT?�~Y��Y�L�OC�Q��_�� c�x,!k
��u�5�&���|v*�����=���9C3J3W�R�f?�q��tN	�(���~���)�)�4L�1e\k����X�H�Q�G�6����E�Y��A�J'\'Gg����S�Sݧ
�M=:��.�k���Dw�n��^��Lo��y��}/�T�m���GX�$��<�5qo</���QC]�@C�a�a�ᄑ��<��F�F�i�\�$�m�mƣ&&!&KM�M�RM��)�;L;L���͢�֙5�=1�2��כ߷`ZxZ,����eI��Z�Yn�Z9Y�XUZ]�F���%ֻ�����N�N���gð�ɶ�����ۮ�m�}agbg�Ů��}�}��=
���Z~s�r:V:ޚΜ�?}���/gX���3��)�i�S��Ggg�s�󈋉K��.�>.���Ƚ�Jt�q]�z�������ۯ�6�i�ܟ�4�)�Y3s���C�Q��?��0k߬~OCO�g��#/c/�W�װ��w��a�>�>r��>�<7�2�Y_�7��ȷ�O�o�_��C#�d�z����%g��A�[��z|!��?:�e����A���AA�����!h�쐭!��Α�i�P~���a�a��~'���W�?�p�X�1�5w��Cs�D�D�Dޛg1O9�-J5*>�.j<�7�4�?�.fY��X�XIlK9.*�6nl�������{�/�]py�����.,:�@L�N8��A*��%�w%�
y��g"/�6ш�C\*N�H*Mz�쑼5y$�3�,幄'���L
Lݛ:��v m2=:�1����qB�!M��g�g�fvˬe����n��/��k���Y-
�B��TZ(�*�geWf�͉�9���+��̳�ې7����ᒶ��KW-X潬j9�<qy�
�+�V�<���*m�O��W��~�&zMk�^�ʂ��k�U
�}����]OX/Yߵa���>������(�x��oʿ�ܔ���Ĺd�f�f���-�[����n
�ڴ
�V��E�/��(ۻ��C���<��e����;?T�T�T�T6��ݵa�n��{��4���[���>ɾ�UUM�f�e�I���?�����m]�Nmq����#�׹���=TR��+�G�����w-
6
U����#pDy��	�
:�v�{���vg/jB��F�S��[b[�O�>����z�G��4<YyJ�T�i��ӓg�ό���}~.��`ۢ�{�c��jo�t��E���;�;�\�t���W�W��:_m�t�<���Oǻ�����\k��z��{f���7���y���՞9=ݽ�zo�����~r'��˻�w'O�_�@�A�C݇�?[�����j�w����G�������C���ˆ
��8>99�?r��C�d�&����ˮ/~�����јѡ�򗓿m|�����������x31^�V��w�w��O�| (�h���SЧ�������c3-�gAMA��|�Q� cHRMz%������u0�`:�o�_�F	SIDATx�̙]�]U�k���;3������v��6D���6��4����XL��I�H �`��G�A�"%���bAjE[�G�
ԙ�3s�9{/��>��v�-1���{Ͼ���>����GT����XRPPD@��[�߫�N�)6W�՜O}j�7N���M�;�Neg>8�[���Dwck��,RU�>1A�j#�?���:U
%ree5�Ӌ3g��.�p��v.u���Se5w,g����2Fd+�$Q`^z߮��]73=���\� t�w�{x������2�Z�딕唥��D������_޹~�Cy@U���W�Dj�H����ִ,�)ֽʧo����z)Q'&L��G_Yz��W��<Q��s����Xk�����o���C��KWzX'�jQ��yN E܄Itկ_>�l4��\�y�ח�vྺ.�B�k�<�'�m��������P@�$�o���g�(QC�Z;��� �מx�	�9V�b�?o�f�ճ�%OsT�8D�����y|�_�������b4Z��w=�(t�A�>U��3*#Ykɲ�r�HAEda@�?r�0���k)�@?�_D�2G!"�ܮ�E-�[i��^�HD�!�U{腗��)�imEg�K��N[�h�V������՚j��� �`��BY/#0IP�)��@�ĝ�>�̛:���;￳��#�C`c�q dN�$H���"�������L����������ށ|��f�&(�bAXq��A\*Q�E7�WG���=A��3z�D6������s�=k
��SP�IzA\�Y%
��Ryb2���6��=a���0��'*�_�r�q���qα���t:U�cL�	��"�}���ak����Y��]?1�wIj��_<��o|M�l�Y�9�Y��-�ڲ��(���Uz;�|�yz��,�9O�8v�m%��:RN��) ��Bjx�R��ŕŧ����ndn��7u����V[2�Z��(qny��_�4,]�$&���Y���^��r�u8gq��Zcar�[ؼy�ɩ6Nӝ�`��s���٩Wv|�+�d2JC��g�����j^`�_4��g9����u
�ӓ
�s`m��j����α��J��#�-��+���ضm#p��w�z�,*� �"6]>��	����u�o��)
���2�Ք�8~�$�vͱ~z�2%�X��d��!�B�0 
!p�Ի��n%�䐥=�Р"N�]�ۧ�#yo�u���<9��Ц�leTi,����9���
E���tq*�0"��S(� B�gt�݂}�b�Dh�P���uq8�z�4q@<rK�VC������U<���q�&���!��$"�C�$'J�S��ka��v0�T[)��i��Ov΍�R
���)f++�“O>7�Z��`2U�ƛ��f��d��M3�&@Q6l�a�e�#e͕	�D�8M�'��YZ�C	�)���ؿ�VD��u9Y���)b�b����_":��]�w�tbE���DQ����W���h�Gx�b����4 JG�Q̺n���$Bwr�}��˜�}$'uA�t׍�/
�/��`����?>ux�ޢ��_�c6�s#
�R{�&f�u�K�gV�g���W���o�3�S�A��
�[Q\y@غ��

#{��NU:H]�������S��7"-����V�����IDp�́U�d�����,-=���m��}��A��z;�; /����y��w)k�yZ��5�\��ː\�m��|�.�G*%���X=��:cK+&��A�j���#�����b8��Qc�i`j�<�W�LDpR�C�ChϾ�;�S�J�� 
LՍ�%��n}5]�r��}�5���3���������Pj�x��,���W�]kG�rulH�E���ů�@z�\_W��qh'xɫ�1郻z�ƖMb�������޴ٴ�jtRp���
�̶��.��n��-['�vn,a�T�*Zj���/m��p�|mY?�0�9�I��{^��Uɮj�P�_����z�!.dl.�Fj@�����8rN���ԴT�� Nb�.�Rs�e��3�&��x��߫��/W�6��q<`�����k8���Z�����׉��HQ`n�/y�f�8�kF����垶�b��QmW`LNMr͵�i/��g�?}�8���97Ai%�ZCA]���095�7~��Xڕ�(Un��ڕ�y��\*�J?��m�'>r0��_�����r�>�l]B���T��as��e��b?���\� 4��(�$0�ݏJ�� �cs"��;�ߏ���m��g�<����T��>b�F:��8��
0 O�6^�ZIEND�B`�liFD$39292081-0485-1173-a2a2-eaea0594271acss.png��PNG


IHDR00W��	pHYs��
OiCCPPhotoshop ICC profilexڝSgTS�=���BK���KoR RB���&*!	J�!��Q�EEȠ�����Q,�
��!��������{�kּ�����>�����H3Q5��B������.@�
$p�d!s�#�~<<+"��x��M��0���B�\���t�8K�@z�B�@F���&S�`�cb�P-`'������{[�!�� e�Dh;��V�EX0fK�9�-0IWfH�����0Q��){`�##x��F�W<�+��*x��<�$9E�[-qWW.(�I+6aa�@.�y�2�4�������x����6��_-��"bb��ϫp@�t~�,/��;�m��%�h^�u��f�@����W�p�~<<E���������J�B[a�W}�g�_�W�l�~<�����$�2]�G�����L�ϒ	�b��G�����"�Ib�X*�Qq�D���2�"�B�)�%�d��,�>�5�j>{�-�]c�K'Xt���o��(�h���w��?�G�%�fI�q^D$.Tʳ?�D��*�A�,����`6�B$��BB
d�r`)��B(�Ͱ*`/�@4�Qh��p.�U�=p�a��(��	A�a!ڈb�X#����!�H�$ ɈQ"K�5H1R�T UH�=r9�\F��;�2����G1���Q=��C��7�F��dt1�����r�=�6��Ыhڏ>C�0��3�l0.��B�8,	�c˱"����V����cϱw�E�	6wB aAHXLXN�H� $4�	7	�Q�'"��K�&���b21�XH,#��/{�C�7$�C2'��I��T��F�nR#�,��4H#���dk�9�, +ȅ����3��!�[
�b@q��S�(R�jJ��4�e�2AU��Rݨ�T5�ZB���R�Q��4u�9̓IK�����hh�i��t�ݕN��W���G���w
��Ljg(�gw��L�Ӌ�T071���oUX*�*|��
�J�&�*/T����ުU�U�T��^S}�FU3S�	Ԗ�U��P�SSg�;���g�oT?�~Y��Y�L�OC�Q��_�� c�x,!k
��u�5�&���|v*�����=���9C3J3W�R�f?�q��tN	�(���~���)�)�4L�1e\k����X�H�Q�G�6����E�Y��A�J'\'Gg����S�Sݧ
�M=:��.�k���Dw�n��^��Lo��y��}/�T�m���GX�$��<�5qo</���QC]�@C�a�a�ᄑ��<��F�F�i�\�$�m�mƣ&&!&KM�M�RM��)�;L;L���͢�֙5�=1�2��כ߷`ZxZ,����eI��Z�Yn�Z9Y�XUZ]�F���%ֻ�����N�N���gð�ɶ�����ۮ�m�}agbg�Ů��}�}��=
���Z~s�r:V:ޚΜ�?}���/gX���3��)�i�S��Ggg�s�󈋉K��.�>.���Ƚ�Jt�q]�z�������ۯ�6�i�ܟ�4�)�Y3s���C�Q��?��0k߬~OCO�g��#/c/�W�װ��w��a�>�>r��>�<7�2�Y_�7��ȷ�O�o�_��C#�d�z����%g��A�[��z|!��?:�e����A���AA�����!h�쐭!��Α�i�P~���a�a��~'���W�?�p�X�1�5w��Cs�D�D�Dޛg1O9�-J5*>�.j<�7�4�?�.fY��X�XIlK9.*�6nl�������{�/�]py�����.,:�@L�N8��A*��%�w%�
y��g"/�6ш�C\*N�H*Mz�쑼5y$�3�,幄'���L
Lݛ:��v m2=:�1����qB�!M��g�g�fvˬe����n��/��k���Y-
�B��TZ(�*�geWf�͉�9���+��̳�ې7����ᒶ��KW-X潬j9�<qy�
�+�V�<���*m�O��W��~�&zMk�^�ʂ��k�U
�}����]OX/Yߵa���>������(�x��oʿ�ܔ���Ĺd�f�f���-�[����n
�ڴ
�V��E�/��(ۻ��C���<��e����;?T�T�T�T6��ݵa�n��{��4���[���>ɾ�UUM�f�e�I���?�����m]�Nmq����#�׹���=TR��+�G�����w-
6
U����#pDy��	�
:�v�{���vg/jB��F�S��[b[�O�>����z�G��4<YyJ�T�i��ӓg�ό���}~.��`ۢ�{�c��jo�t��E���;�;�\�t���W�W��:_m�t�<���Oǻ�����\k��z��{f���7���y���՞9=ݽ�zo�����~r'��˻�w'O�_�@�A�C݇�?[�����j�w����G�������C���ˆ
��8>99�?r��C�d�&����ˮ/~�����јѡ�򗓿m|�����������x31^�V��w�w��O�| (�h���SЧ�������c3-�gAMA��|�Q� cHRMz%������u0�`:�o�_�F
�IDATx�̙[p]e��������*��-II�&^���Œ�e��3�b�‹#/�>8N��k%���舷��8�"�ڞJs-RlKO�$gߖ�~�ړ8|3_����{�_����*��<UWPPD@��ֳ��^�@�@�=�Y��0[;�[�//m���.^�V?H��c�а[٤�o/��5=gv4�r�T	��U��/c�{.].t�C�7��ђ�*�^�������A���2��e�r�_��^l���f�+�=��S?��i����t��@YYv��W0�
mE�U����,���O�:J%����$��kY����4���;�ȭ{l۠ná�V�.�_�{����y�7d�$d� H����\���ޞ�����Xm��J@{�B=K¸�K��?���?�Y6%��y��}������f��o�^��q\|ϥh�#X��~�ʝG7"D�B���}�vz�!*�
������,,,�Y��رcX�?;�>��v�x>���9>EKQ��2�j}饟�yݶ�|�w��.���g�`۶m<x�#G���:đ#Gؿ�����l��R�	��-<��Ko����-?��9ā("T*��*sss���p��q�x�	�:�<����*/����R�p���d6�5J#��l8.���� ���O�����7[��V��<O?�4Ǐ���ù���q�=��?̎;�b�(�Ap.��(YB1�
�b[���~��2
�j� �z=A�j�ʣ�>J�ﹹ9�;��}��a|�gvv���	<�C)U1 �F� (Z�mB�,R!,(���u/:>'≉	{�1������LLL�><���zLLL�����'�uҦ`��E�,[� ]�
�h�����"���~�o��\��^5?��#׌�l2�p�a��m�^V�WY��¥w��{�p�C\_Q���7P\W��oy�v��&d�0Ю>���Z{��UlO��CG{)�[a@۹u�TJ�{����կ}�\|�.k,p�q�C_�_�-h�S!<�#��Z��9d�YJ�z��ܶ�.�F�+�+|��o�|?�	 PĀ1X���p|/�\�ݱ#}��SA�l���Lww'2o|&T�s�B�d�3'���։�A�1̞�sj�<�磁���=�2X��P,�U)�Yi������2A����/|��^���}{]iş�������^V=��~3�O
�Y�@�}�������)FF�pVx^�X��F@,#��!�T(п��rW���}�-4��UPQ�T5�%�k���y_J�d�a~v���^l�³
6���"��5T+��c�ܿ)��N{G�m���,��д���fTI5_K$h|nM�8Ex�˿�~� ��m�H��(+�j�����b��;OѢ�rI����Pt�tMS!�Gkq����0��?����Uau��]��J��7Y-ԯ1&�Ƅ[6�c�gG�R�.�Bs�
#Zc�H
�A�X�kR"�f�ax�b[�b���J�"�m��m��M�B�"�﹡E,�Kw#E}��eRI�1��҅�L�<���Un����\�p��%��_���X���ה���G?NWO7v�F,�$J
��e���ȕ��JZ6j�>*)�\Y\b��	ff�5<®�����0}�7�@WOo�w�s�'O��ˮ�aFF�(w��@.z��RG�,���_ATYZZ�65��Z�탃|f�>z���~PN�q���f�'��n��j�s3�L�|���;���\�DTKB>_�$����&�F������[�U�}�Az����1��D/
o������BOo���%ÿ�
R`�V���$ӑRFF�����:���Z�@�:u��O~̕�%�r�޻R�'۱�����52�6����

�����~�
33\��JwoDb�n �}��)?���MM2}��c�32:����$������x�����4�kX���%j��s�
2�{�޾�\�L2���<�J���N>v���}�Ԧ�`��	NOM���[�94��S���kg�94L!��zc1����N�`�L������Q,e�;�3T��`4���~*v���oeht���<���3S�|�λ��5�:.��|���E~q��sf��x��?q��jt𾈺h
ג
+���n�4e���(�B��~�n�y���� ^����Y���?��T!���[oq�g�㺭�|�lS<C#��:
E�t
w�|�ZQ��N>q�ݩ3�C�G2�$����+��))Hd��� ����5wA�(�̍(���;o�C������=�xz�PY��y�b�@RЌ�&�M 1�JO_?{?�/բ�5(q�H��Z"���d9�����th�{R-7]g���<Qm�s�gg̡ʞ!q�9 VTˍ-M4��a�	.֞���j�m�ki�-9I��ܦ�h:�Z�[�>��eJ��s5��͵5�)n��y
Ɩ�K�u#�e�L�%�M҉�<�I�P�q'Ք�%M�&�h�c�j6aj"�4	�7Y��<�MhI��}9͒���:Z�S��[JS����ӂMnr][ǯu��L�*��-+�:�q�ͺPdg���n#MA�W
���g�k4�:@�~B!6�BqW/���/cC8��ز��,P��d�J��C� s"��;?��So�~"����]���d�j��2�e3_[�O�?9��v>sSIEND�B`�RliFD$09ed4b52-0484-1173-a2a2-eaea0594271a	html.png��PNG


IHDR00W��	pHYs��
OiCCPPhotoshop ICC profilexڝSgTS�=���BK���KoR RB���&*!	J�!��Q�EEȠ�����Q,�
��!��������{�kּ�����>�����H3Q5��B������.@�
$p�d!s�#�~<<+"��x��M��0���B�\���t�8K�@z�B�@F���&S�`�cb�P-`'������{[�!�� e�Dh;��V�EX0fK�9�-0IWfH�����0Q��){`�##x��F�W<�+��*x��<�$9E�[-qWW.(�I+6aa�@.�y�2�4�������x����6��_-��"bb��ϫp@�t~�,/��;�m��%�h^�u��f�@����W�p�~<<E���������J�B[a�W}�g�_�W�l�~<�����$�2]�G�����L�ϒ	�b��G�����"�Ib�X*�Qq�D���2�"�B�)�%�d��,�>�5�j>{�-�]c�K'Xt���o��(�h���w��?�G�%�fI�q^D$.Tʳ?�D��*�A�,����`6�B$��BB
d�r`)��B(�Ͱ*`/�@4�Qh��p.�U�=p�a��(��	A�a!ڈb�X#����!�H�$ ɈQ"K�5H1R�T UH�=r9�\F��;�2����G1���Q=��C��7�F��dt1�����r�=�6��Ыhڏ>C�0��3�l0.��B�8,	�c˱"����V����cϱw�E�	6wB aAHXLXN�H� $4�	7	�Q�'"��K�&���b21�XH,#��/{�C�7$�C2'��I��T��F�nR#�,��4H#���dk�9�, +ȅ����3��!�[
�b@q��S�(R�jJ��4�e�2AU��Rݨ�T5�ZB���R�Q��4u�9̓IK�����hh�i��t�ݕN��W���G���w
��Ljg(�gw��L�Ӌ�T071���oUX*�*|��
�J�&�*/T����ުU�U�T��^S}�FU3S�	Ԗ�U��P�SSg�;���g�oT?�~Y��Y�L�OC�Q��_�� c�x,!k
��u�5�&���|v*�����=���9C3J3W�R�f?�q��tN	�(���~���)�)�4L�1e\k����X�H�Q�G�6����E�Y��A�J'\'Gg����S�Sݧ
�M=:��.�k���Dw�n��^��Lo��y��}/�T�m���GX�$��<�5qo</���QC]�@C�a�a�ᄑ��<��F�F�i�\�$�m�mƣ&&!&KM�M�RM��)�;L;L���͢�֙5�=1�2��כ߷`ZxZ,����eI��Z�Yn�Z9Y�XUZ]�F���%ֻ�����N�N���gð�ɶ�����ۮ�m�}agbg�Ů��}�}��=
���Z~s�r:V:ޚΜ�?}���/gX���3��)�i�S��Ggg�s�󈋉K��.�>.���Ƚ�Jt�q]�z�������ۯ�6�i�ܟ�4�)�Y3s���C�Q��?��0k߬~OCO�g��#/c/�W�װ��w��a�>�>r��>�<7�2�Y_�7��ȷ�O�o�_��C#�d�z����%g��A�[��z|!��?:�e����A���AA�����!h�쐭!��Α�i�P~���a�a��~'���W�?�p�X�1�5w��Cs�D�D�Dޛg1O9�-J5*>�.j<�7�4�?�.fY��X�XIlK9.*�6nl�������{�/�]py�����.,:�@L�N8��A*��%�w%�
y��g"/�6ш�C\*N�H*Mz�쑼5y$�3�,幄'���L
Lݛ:��v m2=:�1����qB�!M��g�g�fvˬe����n��/��k���Y-
�B��TZ(�*�geWf�͉�9���+��̳�ې7����ᒶ��KW-X潬j9�<qy�
�+�V�<���*m�O��W��~�&zMk�^�ʂ��k�U
�}����]OX/Yߵa���>������(�x��oʿ�ܔ���Ĺd�f�f���-�[����n
�ڴ
�V��E�/��(ۻ��C���<��e����;?T�T�T�T6��ݵa�n��{��4���[���>ɾ�UUM�f�e�I���?�����m]�Nmq����#�׹���=TR��+�G�����w-
6
U����#pDy��	�
:�v�{���vg/jB��F�S��[b[�O�>����z�G��4<YyJ�T�i��ӓg�ό���}~.��`ۢ�{�c��jo�t��E���;�;�\�t���W�W��:_m�t�<���Oǻ�����\k��z��{f���7���y���՞9=ݽ�zo�����~r'��˻�w'O�_�@�A�C݇�?[�����j�w����G�������C���ˆ
��8>99�?r��C�d�&����ˮ/~�����јѡ�򗓿m|�����������x31^�V��w�w��O�| (�h���SЧ�������c3-�gAMA��|�Q� cHRMz%������u0�`:�o�_�FIDATx�̙[�]�Y�k�}9��9gn�Ǘ�Nlr#���(	�܅UoH�	���RE<@T���*"�P����ڨ��0��	�I�$N���2��93s��{]>�>gΌ�3�$KZ3{�|{�￾�����a�_�������j}�y@�"H��;��;nr���Y���]Y^��3d�1�fW#�	��p�PF�e��ѱ��B'B	�	�~��B�M���Vp;~7w:v ��w����� (��E#Q��uIc��w�����M��}�7��	�Tx�^���顳q-������ۚ�#	\��}T�s� (Q�6/�k	Q���\�©����®T{��N�`����wC��s|P8�Hp�sU�M��G�����}S�
����ؾv���о��{8���9�w�DC�@i�I�G��;O��
�C`t�d'��ɳ<��"3�	�~l��[ć0\�<��"�?y����p���~�*�yr�q����(�m4D��^x��ߋ�}�%p��<�çx��IN�s�g_��ٗ'o������=�o+�=�{�-g��F
A$�� &������;yw���_{���h�ЌҎ��?��Ǫ0""	��hH�BQ�G�@dp"/��+g�޻�n�8`�vc'47�l%(4RE;�[����"��I-{�kg.e�����km_�=��aϷ��Ai�Vh�!��
��P8�U�iN��Ǎ�ն��-�kn�m_���O��̷�o����=a�
5�Q%c�'1j�:6@R���F����O�7��6U_x���E��
��=Jn{��mZ
˯���A��`� �Px��zX[�_>�QQl��G�D��:�,��l19�,�xT�M�Dіuh6S��W^���^^����I:��_����S�z!�@g!�*�D���56��L�����M���*�:�ORXK����x��+p��-Zkt�֘8Bd 	��Z�������虰c�wgd�`���@T��o�_��u����_Bۜ+�	���c�!M3��3t�~��������>ޯ�z݃�k5#NZ͌�f�ɩqc�ܱ�ֻh��;�K?���Q:}�S�8vl��8��I�[�0�G1��9V��e��1~�3ǹ��=N>�F�b���["������y/{��)A�ɢsltd�]�&�����s��*i3�o���V��;���r"
Q��Ziwr޿���/q�-0;��k���8:�C�O�E��ʺ��e��|�V�D-S���_Ś���㩍�ca�>��j4)�&(\p�_Y$]�Po���c���,!+�ˈ�x���'����t�y����ѼvE8���X_��=	�4B)M/�R�	{��H�Y��.�!��ĵ+\x��A+�"EGԓ\��@bHv\R
�M��آ�5�Aa,�4#�H��g�q��O}��R��"I4:�E��_��;z�,낚�5���#8��Z�.��D������U�*|e����|u�����fsZ��*�ۇ�/D����2�:H)�0Z�| M5�$���(�7��0��{Kʍv��wiG�G��Op��J)���D�a%��)�GXPJ!
�
�e���2.K�sO|���(;���T�DE�@�����<�9K~���e��h�h����!�La�.�P�7vW����-	E!h�C�/pׁ?#20�l��f�'�zZ*�V
�~6(��H�
�|�Ǐ~���}��k:���4l@z����	�ɱ�U+'m�w�e�6UI��'��V�eb3FP8ae���jz�z�^�ۀu�-L��2S�ol�a�=�+��N�B%BU&|��T"�xWA�BGӬ��v�(��
�����{������E�:A��(�(|�fE�A��!���C�t�ϸc��A��=
�h���_���TE�*���ef�=�m`#��~ �B�#�3C�
4V4.���	"9C�֛R���A��+���F�i2>�)K�~��NatY�;/��_��X������p��X�&-A
�:C'(�G>�P��!�q��C���4�0h���"��n�y�)c�
�������^��4F?@��E���4iԪb_Uy��v�B�T��X�?�f[���S�MDJU	J(�+h��69_�����u���oû���;(%���PDqT��A��6w�1@ڗ��
���o6�zw$�c4�4xe{�wS��dc�6�`�ј0��A�[W�o	���&l�68���I�ۄ e��B9}���ļH�fqe��Y���'J	�	�6�D�F���vv ��D4T�G��+��P��qD�� x��aK�[����y_����hf�$����t>#���$ HUɌ8"}t��W/�vxڣӇ@a]Y��y?�����[��+E�(V�����F�53td�L`���]z!)OP+�iE��&��|h�W�^bzz?i� !�`�T�|@|�KI'1I#��2��́�)�Vd͌Z���z(�j��]F;����H6o�F/gf��{ϛ���Ygjr(x���&5Q�$1��\�8OV�en�o���ި3>5��"4�dX	��K��y{�V(��C+��u�-��cc
�z�|�Xk�H`}�ˍ�e��qh���j�����{pqc�F�����1�o6�Ĕlu�F��>BZ���
���jg�k+��֕/k
�Q43��E���m&�'�ڷc4�h�ha ����D@c���͸(�"
P�=@�j����X�/��4��FE�CQ�>�����)j�zɼ��m�_G���h21�����(Y�$M��>��~u;��9I�����5h�5��=0֊�m����-R���u8#�u���&N4QQ��	>l���Z�73����a�#׸�5��B��P�86����ǒ��Ȱ�`)_,��-`��鋳~�B��*"��w�O��Us7���ΰ��I 6�M��@l��b���C(��>��x��|҆R��N+�N���U]M��1c�쨽�I�7�π-�2�IEND�B`��liFD$fbf50e48-0483-1173-a2a2-eaea0594271aoffice.pngr�PNG


IHDR00W��	pHYs��
OiCCPPhotoshop ICC profilexڝSgTS�=���BK���KoR RB���&*!	J�!��Q�EEȠ�����Q,�
��!��������{�kּ�����>�����H3Q5��B������.@�
$p�d!s�#�~<<+"��x��M��0���B�\���t�8K�@z�B�@F���&S�`�cb�P-`'������{[�!�� e�Dh;��V�EX0fK�9�-0IWfH�����0Q��){`�##x��F�W<�+��*x��<�$9E�[-qWW.(�I+6aa�@.�y�2�4�������x����6��_-��"bb��ϫp@�t~�,/��;�m��%�h^�u��f�@����W�p�~<<E���������J�B[a�W}�g�_�W�l�~<�����$�2]�G�����L�ϒ	�b��G�����"�Ib�X*�Qq�D���2�"�B�)�%�d��,�>�5�j>{�-�]c�K'Xt���o��(�h���w��?�G�%�fI�q^D$.Tʳ?�D��*�A�,����`6�B$��BB
d�r`)��B(�Ͱ*`/�@4�Qh��p.�U�=p�a��(��	A�a!ڈb�X#����!�H�$ ɈQ"K�5H1R�T UH�=r9�\F��;�2����G1���Q=��C��7�F��dt1�����r�=�6��Ыhڏ>C�0��3�l0.��B�8,	�c˱"����V����cϱw�E�	6wB aAHXLXN�H� $4�	7	�Q�'"��K�&���b21�XH,#��/{�C�7$�C2'��I��T��F�nR#�,��4H#���dk�9�, +ȅ����3��!�[
�b@q��S�(R�jJ��4�e�2AU��Rݨ�T5�ZB���R�Q��4u�9̓IK�����hh�i��t�ݕN��W���G���w
��Ljg(�gw��L�Ӌ�T071���oUX*�*|��
�J�&�*/T����ުU�U�T��^S}�FU3S�	Ԗ�U��P�SSg�;���g�oT?�~Y��Y�L�OC�Q��_�� c�x,!k
��u�5�&���|v*�����=���9C3J3W�R�f?�q��tN	�(���~���)�)�4L�1e\k����X�H�Q�G�6����E�Y��A�J'\'Gg����S�Sݧ
�M=:��.�k���Dw�n��^��Lo��y��}/�T�m���GX�$��<�5qo</���QC]�@C�a�a�ᄑ��<��F�F�i�\�$�m�mƣ&&!&KM�M�RM��)�;L;L���͢�֙5�=1�2��כ߷`ZxZ,����eI��Z�Yn�Z9Y�XUZ]�F���%ֻ�����N�N���gð�ɶ�����ۮ�m�}agbg�Ů��}�}��=
���Z~s�r:V:ޚΜ�?}���/gX���3��)�i�S��Ggg�s�󈋉K��.�>.���Ƚ�Jt�q]�z�������ۯ�6�i�ܟ�4�)�Y3s���C�Q��?��0k߬~OCO�g��#/c/�W�װ��w��a�>�>r��>�<7�2�Y_�7��ȷ�O�o�_��C#�d�z����%g��A�[��z|!��?:�e����A���AA�����!h�쐭!��Α�i�P~���a�a��~'���W�?�p�X�1�5w��Cs�D�D�Dޛg1O9�-J5*>�.j<�7�4�?�.fY��X�XIlK9.*�6nl�������{�/�]py�����.,:�@L�N8��A*��%�w%�
y��g"/�6ш�C\*N�H*Mz�쑼5y$�3�,幄'���L
Lݛ:��v m2=:�1����qB�!M��g�g�fvˬe����n��/��k���Y-
�B��TZ(�*�geWf�͉�9���+��̳�ې7����ᒶ��KW-X潬j9�<qy�
�+�V�<���*m�O��W��~�&zMk�^�ʂ��k�U
�}����]OX/Yߵa���>������(�x��oʿ�ܔ���Ĺd�f�f���-�[����n
�ڴ
�V��E�/��(ۻ��C���<��e����;?T�T�T�T6��ݵa�n��{��4���[���>ɾ�UUM�f�e�I���?�����m]�Nmq����#�׹���=TR��+�G�����w-
6
U����#pDy��	�
:�v�{���vg/jB��F�S��[b[�O�>����z�G��4<YyJ�T�i��ӓg�ό���}~.��`ۢ�{�c��jo�t��E���;�;�\�t���W�W��:_m�t�<���Oǻ�����\k��z��{f���7���y���՞9=ݽ�zo�����~r'��˻�w'O�_�@�A�C݇�?[�����j�w����G�������C���ˆ
��8>99�?r��C�d�&����ˮ/~�����јѡ�򗓿m|�����������x31^�V��w�w��O�| (�h���SЧ�������c3-�gAMA��|�Q� cHRMz%������u0�`:�o�_�F	�IDATx�̙ϏdU�?��ޫ�Ꞟ��*
(��7FPcbbP��rcܹ2�q�[��(��E�� �f�a�iz���{��{߯�6T�x�LWW��w~|�~Ϲ����؋k

*��( �g����A>(�R&[�]�ĩ�'��`�q�CK��[+z��
1��.7�M��U��{m��^�C�>U����5��socG{W���
ܑ��d��LU���F���A�Ġ.��ܠȬ�˛~�V�����%��Δ0
1���Y��������_�*�Y�#�2�q��]��k����Y3�[�1��{���{�R%��T@8gP�r<�0(���v¹��@�O�����LR�Ў�!�=��A�A�ԣ�B�
+�3��.�ձ���.}H�sڇ���
>�L)!(�=>*_�U��UIn�	�l��׿��y��BS]e��S��!�0
JUy��SM*�IIn��B&`�g����G�3+�̬mT;�٘فUB�-=4���*�{OY����J�Dn�9�Z������fqbvt>
No���zѦ.��Q%h`<)����8�s��ܱ���b��ڥ��4=��x[�̦("1�`R��r\b�lw"��`��O��<��]��O�Pz�^C4RD"�1X##�ȭ�LT'��u�B1�Xڿ��
?/�c�{c�zjH�䑊4P��i[3�XD06��1X�F=K�䶓
Ü_��^��?*��!��I�I�w�|�5��&GŴ���]((��_~*�L
�(� 	�"Pz%�u�@D��B�ÃU�u�ɓ��hd�&�1�a�Q�L��m��b�0�b�e�Pl/b
w��ai�0�?���w��3���̧FC+9�Th!���B����l���׹�;�P��(b��0�Ƙ�
x��ɐ����h2!�X����O�����\r�����9a��e��MR���2B�h����!s��gVy�sT�'x9�Hh��<g�҈ť��/3\�˷}��'��G�r����Q�E��e5Y5UA�w)L(�D���Oy�^uTeF9	�|P�.9�aLD����7�x��*E�q������.�K�~�e��N���TS�QM�S���4\���0Xc���R��It�d�I�Pl�P�3oP����pp��N.�f.���\̄tDOMh�pBOԵ�ڎ��#W.p��W\:`id�6,Ac��b��̱�g@�����-��G�͕���o�[[�q6���-?D�$:-‘�T[ �䅣**��8��g�T�9m��1&�Zc0�`�c2�=4X�Buj��AB��6?&�<����>��(�4 "\|`��ġ�SV��,.�
�/�g�ԏAD�U3b-+Y9�P�1=�JGu�%�p�#_ �A=/�#�}���)�x���@�g�_��J��f����钍11�<#X�	Rl���LD9r~��^�LChI>�V��o�T�\yQe�~:�>���!.W��ln�eX�{�87��I�OQ+�����ˀ{~F���L|,Ԥ/�~��"�S��c�� DF�H��Ӏ�g�z
�{B�����[��Xf��;h��5�4ӌ�6�O�:�v3� 
yi��N�
!~���ZCi�h���j�;�,�D��׿�R�,���g_X����ܸz3��g�C�c'?���Уl�Ӽx�f�pf��.}"�^�kF	�m���ʡ��)�������1lbt�+�2�'H��.��S)�?�ku���5Bg��)i/n�]M�])���1A
��w����Ï���Lip��6�,��x����!D\�k���i˧����vA�x�["@��凮^���f6bjL��[�'�o�������3�-#k3�w��Ĩ�T���
��~�[W>�Z!<�F�?y}+A��T�]Խ@�G�{����ѱ�
�vEb	�rk�����,�o�/��M��f�_w�]�ۍ���3�i��9B��+>T-��E�H�A$�F��Ho�q:�RgZ�?7��F�-����s�$	2Dt��&A��j�<F'(���q��ġd����枹&�4I�kg�n��]�:cs0H@1�lBu9u�Q����!������5I&¬�k��ٷ�Q�u�r�JF�"9��>
���ܧ.�ނ[�[�.�Eۍ�J���m�I/ŏ�=;�M�iu۩T�.#�kOX���\�:��7�?�i9c�4�a�V�A�N�5	��Z9�w1�"�d�4��aj�i����ҡ���3��zv�e]�'��s_S���t���6��yz��m0dI����=��Պn?��-�X�����w���P��d���O$w(�O4�s��wLa��o$����T_>(�\�.��֙�e �PX��_N�Sw��gt@D��ᓼ���]"��w�J��
��N��Ֆ�ه���*��?3��
V(wIEND�B`��liFD$dfc1d08c-0483-1173-a2a2-eaea0594271apdf.png��PNG


IHDR00W��	pHYs��
OiCCPPhotoshop ICC profilexڝSgTS�=���BK���KoR RB���&*!	J�!��Q�EEȠ�����Q,�
��!��������{�kּ�����>�����H3Q5��B������.@�
$p�d!s�#�~<<+"��x��M��0���B�\���t�8K�@z�B�@F���&S�`�cb�P-`'������{[�!�� e�Dh;��V�EX0fK�9�-0IWfH�����0Q��){`�##x��F�W<�+��*x��<�$9E�[-qWW.(�I+6aa�@.�y�2�4�������x����6��_-��"bb��ϫp@�t~�,/��;�m��%�h^�u��f�@����W�p�~<<E���������J�B[a�W}�g�_�W�l�~<�����$�2]�G�����L�ϒ	�b��G�����"�Ib�X*�Qq�D���2�"�B�)�%�d��,�>�5�j>{�-�]c�K'Xt���o��(�h���w��?�G�%�fI�q^D$.Tʳ?�D��*�A�,����`6�B$��BB
d�r`)��B(�Ͱ*`/�@4�Qh��p.�U�=p�a��(��	A�a!ڈb�X#����!�H�$ ɈQ"K�5H1R�T UH�=r9�\F��;�2����G1���Q=��C��7�F��dt1�����r�=�6��Ыhڏ>C�0��3�l0.��B�8,	�c˱"����V����cϱw�E�	6wB aAHXLXN�H� $4�	7	�Q�'"��K�&���b21�XH,#��/{�C�7$�C2'��I��T��F�nR#�,��4H#���dk�9�, +ȅ����3��!�[
�b@q��S�(R�jJ��4�e�2AU��Rݨ�T5�ZB���R�Q��4u�9̓IK�����hh�i��t�ݕN��W���G���w
��Ljg(�gw��L�Ӌ�T071���oUX*�*|��
�J�&�*/T����ުU�U�T��^S}�FU3S�	Ԗ�U��P�SSg�;���g�oT?�~Y��Y�L�OC�Q��_�� c�x,!k
��u�5�&���|v*�����=���9C3J3W�R�f?�q��tN	�(���~���)�)�4L�1e\k����X�H�Q�G�6����E�Y��A�J'\'Gg����S�Sݧ
�M=:��.�k���Dw�n��^��Lo��y��}/�T�m���GX�$��<�5qo</���QC]�@C�a�a�ᄑ��<��F�F�i�\�$�m�mƣ&&!&KM�M�RM��)�;L;L���͢�֙5�=1�2��כ߷`ZxZ,����eI��Z�Yn�Z9Y�XUZ]�F���%ֻ�����N�N���gð�ɶ�����ۮ�m�}agbg�Ů��}�}��=
���Z~s�r:V:ޚΜ�?}���/gX���3��)�i�S��Ggg�s�󈋉K��.�>.���Ƚ�Jt�q]�z�������ۯ�6�i�ܟ�4�)�Y3s���C�Q��?��0k߬~OCO�g��#/c/�W�װ��w��a�>�>r��>�<7�2�Y_�7��ȷ�O�o�_��C#�d�z����%g��A�[��z|!��?:�e����A���AA�����!h�쐭!��Α�i�P~���a�a��~'���W�?�p�X�1�5w��Cs�D�D�Dޛg1O9�-J5*>�.j<�7�4�?�.fY��X�XIlK9.*�6nl�������{�/�]py�����.,:�@L�N8��A*��%�w%�
y��g"/�6ш�C\*N�H*Mz�쑼5y$�3�,幄'���L
Lݛ:��v m2=:�1����qB�!M��g�g�fvˬe����n��/��k���Y-
�B��TZ(�*�geWf�͉�9���+��̳�ې7����ᒶ��KW-X潬j9�<qy�
�+�V�<���*m�O��W��~�&zMk�^�ʂ��k�U
�}����]OX/Yߵa���>������(�x��oʿ�ܔ���Ĺd�f�f���-�[����n
�ڴ
�V��E�/��(ۻ��C���<��e����;?T�T�T�T6��ݵa�n��{��4���[���>ɾ�UUM�f�e�I���?�����m]�Nmq����#�׹���=TR��+�G�����w-
6
U����#pDy��	�
:�v�{���vg/jB��F�S��[b[�O�>����z�G��4<YyJ�T�i��ӓg�ό���}~.��`ۢ�{�c��jo�t��E���;�;�\�t���W�W��:_m�t�<���Oǻ�����\k��z��{f���7���y���՞9=ݽ�zo�����~r'��˻�w'O�_�@�A�C݇�?[�����j�w����G�������C���ˆ
��8>99�?r��C�d�&����ˮ/~�����јѡ�򗓿m|�����������x31^�V��w�w��O�| (�h���SЧ�������c3-�gAMA��|�Q� cHRMz%������u0�`:�o�_�F�IDATx�̙m�]Gy��̜s�޻/�up��16خ�4EX5�6���@���7!Uj�*B늈*�*�����BTBPԦ@1$��Q�R�Q�_�ǐ�Ď�����{��<�0�{��w]Q�����9g��y���rDU�R;�dGAAPd�l9_��E�	Q	^�/{6m���c?�ݰ���u�T1n^��p-��$ư��ƹIU�v}�^��>�m�a�>U�t���=��m��_Ȧ��u�+��6��ʲ�,W�!*�e�%�5�;���.L���ҫYW�x��f~�
o�'�N�v���	Q�.��t��v������^su�ܮCq��/�j�PG�Om���%=/i��~
�~?rv~�h��IP(��ϼ���̪$a���0�b��Cm>��ѹ���|��Ok��{�(x
h�XI�]#�/��nv�7eUBQ|���}��EA������X�M����A~��[	�/}�/�EZ��<���>|An�	�l#��}��W©/V[j���ё��w�4�\;��=����W�((l���i�R2���S\�i3��}���[AD��5����[�۹u�G�\aT�k�ؾ��.���c۷�m����F�9
��V=sS!B�(�/j�a�P8��{�z�s�u%&��� ��P��
e?�p���J��-i\����5�p�X���z:$U%j��/�6I"��T�Yp�?��6�R�s'�(O��%��+`�RY�ț��_~�D��*D���O�W�?�����ͧgv�spdP_o�aĀ��b��V(��#4,H	ND�f����Ŭ��Xz@_�V1���\�x�MP��=�]�����.v�{
Z�k�ԭI��KiƖFa�
�8�@!/ATv���c_�ܭ�����4��6h���G�k6cH���Vi�߳�4>��]�D�p�7�u�{U
FHc5�,�I�)Bù�'\EP2"R�)2ِ�����[]�?
�h�FEc��.U���mS��X�!�@�@��F
h��OG�E���ͼ���X���&��Mw#�05�0�����>�7��N��2N8����_ׯk�+=�/=�GB��0�����9�
�y�o�[^fa~���ܴm=����G�
QLR�̡
��ԫ�\X�.|�?=�����p��������2�)
�Q')i3;���3a#���t'��bg�S����.|@c``���5dy��T�ɩ&�s3�&�t{���g��Ol}�[~��?|�����Y���W��@N+^���wa.�@�Ztw���m�K=;YZZ����@��<�d;b-FC���2֮[C{����n�eϘ	My�*��Qg)�A_K�T�;h�M�݌]xc�.s8g����"�F0$i�6
>z�;�"�;L���OL���xt�B��OU���Kί���Y�Y^��F$��1	�s R�|�>Q��F�8'�c"πȏN�a�[L��R*�**w8��!�ʀӜ6'���H���[Ak�Y�F����S(?��|�1�j���߷̟�xn|*�\W�m�4;�Ts@l_���B��fD��R��|��k7Q�̹�M�@�!����`��tot���fP��Ru�T�( :���߲w�K��у�Z�$�{�鑹������8�3Eȳf��$���_�c�@Դ���T�Z�4���/���7���VFF,�X�5Xk���$o�4'�X�h4r�fN���9͉	���R:�3���1�*5;�RAJ`U�hP*�ab&�ro�3��QW�U���bb��QFb�8�0Ǐ>�xe��ÀnD��/�R��
�hN$z�C��&��V����U�c$�XS_[���˥��$�)m8���c����*��?bQ�5_�5`%�N�6�0�a��9��,�˰���Z���|��_MeBu�:�*��b��BT��s�w��Y4��=b������C�(�g~@UA$�AbĔQ�lh�+Tgh�񀝲S��,���-,ܾ��/�{� �b� %������&yeA����	%R�Q��V]'+�P��|�Sh������f#��{��'�|�o�ĉß� �d���H@lA�
КG֊�F�k
-�$q+�,����b�N�6P�[�"N�0q�L�����xM
�S1`$��6���f���PшD��J�6�����C:��jR^|���Y&����+�J�C(J�]���Tٜ)��n���hnkA55�сh�q���_���ZK=
��e���i�:f�,/��;XY�S��y�0���_�a��D�+�q,(D�漆R���ף�5߸Pο�n�_�}h?�'��=�\U�Cj�4�5���WQ\��=��<Ov�0�_�c^x��hX��uU8��\��A�z���O�^x��^��}��v�O��6�M���/��x~nX�j>u��G?G��A�м�fMp
�w�z��9��ܸ6�RK\tE.6H�U��s���t��s��ܶ���F���?�t�����o�t��u�4�yY�'�t����"���07���&F��C�釐Xz�[�ܶ�Ǫ���L����;���;�5�ZU15�Z����[y�#��ߗ&mN�hѹmo�X!��e������-"`ƨ�^>���4�0�ķ����8�u��8��?~��y�ZF:�6e�p�XJV�Y�ΰ�����շ�r��2�ཨ�Xx���Oa���7��8�K��%�:I��Z/ �J���������t~y/3�%��me�u@����{�z�BG��ۈ�^�
�r�S�m;g��'L]��C���̋���K
s+��8o�!)�55�+�T�\�w�bQ	>"f��1��@g�o0���>$�$?tW7g_�������
[g�@f�a
�e��!#�@D�|�����5���]y50]#���)c�U��Yn�;��K�
&IEND�B`��liFD$c782a35c-0482-1173-a2a2-eaea0594271artf.png��PNG


IHDR00W��	pHYs��
OiCCPPhotoshop ICC profilexڝSgTS�=���BK���KoR RB���&*!	J�!��Q�EEȠ�����Q,�
��!��������{�kּ�����>�����H3Q5��B������.@�
$p�d!s�#�~<<+"��x��M��0���B�\���t�8K�@z�B�@F���&S�`�cb�P-`'������{[�!�� e�Dh;��V�EX0fK�9�-0IWfH�����0Q��){`�##x��F�W<�+��*x��<�$9E�[-qWW.(�I+6aa�@.�y�2�4�������x����6��_-��"bb��ϫp@�t~�,/��;�m��%�h^�u��f�@����W�p�~<<E���������J�B[a�W}�g�_�W�l�~<�����$�2]�G�����L�ϒ	�b��G�����"�Ib�X*�Qq�D���2�"�B�)�%�d��,�>�5�j>{�-�]c�K'Xt���o��(�h���w��?�G�%�fI�q^D$.Tʳ?�D��*�A�,����`6�B$��BB
d�r`)��B(�Ͱ*`/�@4�Qh��p.�U�=p�a��(��	A�a!ڈb�X#����!�H�$ ɈQ"K�5H1R�T UH�=r9�\F��;�2����G1���Q=��C��7�F��dt1�����r�=�6��Ыhڏ>C�0��3�l0.��B�8,	�c˱"����V����cϱw�E�	6wB aAHXLXN�H� $4�	7	�Q�'"��K�&���b21�XH,#��/{�C�7$�C2'��I��T��F�nR#�,��4H#���dk�9�, +ȅ����3��!�[
�b@q��S�(R�jJ��4�e�2AU��Rݨ�T5�ZB���R�Q��4u�9̓IK�����hh�i��t�ݕN��W���G���w
��Ljg(�gw��L�Ӌ�T071���oUX*�*|��
�J�&�*/T����ުU�U�T��^S}�FU3S�	Ԗ�U��P�SSg�;���g�oT?�~Y��Y�L�OC�Q��_�� c�x,!k
��u�5�&���|v*�����=���9C3J3W�R�f?�q��tN	�(���~���)�)�4L�1e\k����X�H�Q�G�6����E�Y��A�J'\'Gg����S�Sݧ
�M=:��.�k���Dw�n��^��Lo��y��}/�T�m���GX�$��<�5qo</���QC]�@C�a�a�ᄑ��<��F�F�i�\�$�m�mƣ&&!&KM�M�RM��)�;L;L���͢�֙5�=1�2��כ߷`ZxZ,����eI��Z�Yn�Z9Y�XUZ]�F���%ֻ�����N�N���gð�ɶ�����ۮ�m�}agbg�Ů��}�}��=
���Z~s�r:V:ޚΜ�?}���/gX���3��)�i�S��Ggg�s�󈋉K��.�>.���Ƚ�Jt�q]�z�������ۯ�6�i�ܟ�4�)�Y3s���C�Q��?��0k߬~OCO�g��#/c/�W�װ��w��a�>�>r��>�<7�2�Y_�7��ȷ�O�o�_��C#�d�z����%g��A�[��z|!��?:�e����A���AA�����!h�쐭!��Α�i�P~���a�a��~'���W�?�p�X�1�5w��Cs�D�D�Dޛg1O9�-J5*>�.j<�7�4�?�.fY��X�XIlK9.*�6nl�������{�/�]py�����.,:�@L�N8��A*��%�w%�
y��g"/�6ш�C\*N�H*Mz�쑼5y$�3�,幄'���L
Lݛ:��v m2=:�1����qB�!M��g�g�fvˬe����n��/��k���Y-
�B��TZ(�*�geWf�͉�9���+��̳�ې7����ᒶ��KW-X潬j9�<qy�
�+�V�<���*m�O��W��~�&zMk�^�ʂ��k�U
�}����]OX/Yߵa���>������(�x��oʿ�ܔ���Ĺd�f�f���-�[����n
�ڴ
�V��E�/��(ۻ��C���<��e����;?T�T�T�T6��ݵa�n��{��4���[���>ɾ�UUM�f�e�I���?�����m]�Nmq����#�׹���=TR��+�G�����w-
6
U����#pDy��	�
:�v�{���vg/jB��F�S��[b[�O�>����z�G��4<YyJ�T�i��ӓg�ό���}~.��`ۢ�{�c��jo�t��E���;�;�\�t���W�W��:_m�t�<���Oǻ�����\k��z��{f���7���y���՞9=ݽ�zo�����~r'��˻�w'O�_�@�A�C݇�?[�����j�w����G�������C���ˆ
��8>99�?r��C�d�&����ˮ/~�����јѡ�򗓿m|�����������x31^�V��w�w��O�| (�h���SЧ�������c3-�gAMA��|�Q� cHRMz%������u0�`:�o�_�F�IDATx�̙[�]U��Z{�33g�Ӌ
��L�b!
�"���D}ÓO�h_����������SI�x��B"�(�Ŷ�BK[:�s��{�χ}9k�93=�Ja%{ά����������EU9W�Áy@A�rm1�_�E��q^q���2.�|�#_۰eSgy�����3zі��LMcc�h�I�ʶK;��[S~��S%W"S���S'�b;�Ϝ����mWs�m$�*�̳���{P��b�(&�.ӎ�y����-L�����y�<���>r��=�˭������r�|ә"�h����w_�n�yy@���Ȼ����(2�@�O�'ZD���/Ͽ���>�e'���2%s�__��Z��,~|��k3���㼐�C}�fVr�v|�/_x��x�2�c\
���;�y�م����!2��Y�pYJ�@$ F�������?G	㜲ֵ��M\4k�ҝ�žYP�{ߦ�����g9�s�S�:v�,s�#K2�$�e���X�X�}����E�����9�#O��ǿ?��;�s��N���9�4��~B�J�D�@Y�F�~��W�E�ȹ�',,;{f�j�BmM��F;~�/8L���R&'[Xm�<?

�%S����^�8��~���9����i��j�n��u�\��R����Y\X΃h[)(�F��?����.�
!.db�F0F��ӲBdr�-�rH�'bf6�.�S�ZJF5O��]e)��q��U�u���CG9��I���J�0e�2��S-{�Q�ڸ{�����&���={XZ�2z����~b;�WR��҂82�SR��z��7�%�~mB��>2���3�b�ej��q�� ����L��'�_��#��;�7d�r�[?|J/�ܡ�9|�Ȝ���\Yy*�Җf�<����ݔ4Mغi�]7^A�<��x�x/�����'��8�v������C��#+��׭�̐�-�����j�T���|���4ܲ���cq~���O��p�C��i��X�����b�L��	6l�ej�C�����=�{y�s��IG*�/�b���
�2-�����YV��ރs*��#֯��jY�^�,sx��䤵���R���7ߡ�lڼ�κ��r�u��]#nh
�������_	dp";���zؾ��c0F��(�d�!\
D#ro����x��۴ߞgrjb�O�FޑU[�°7��xY�@(|�b�伯�1"9L�ɕ�"�K1�yE��^1�`",�
��GOp��KFW@� T7+�.tI]UEU@k혨��3�s�s|��1y�.�Ib�}����*�P�Gu!��\
�<"B�h��b�,åY��-ޔD� "�,�=b-g�t�M} ���0񳯎�/.��ąӪ�;�&�Md#+��g�� k����+BI���}໅U5�Lٕ�Tԙ�ATh�B�<��-�%tT+BhOM�� �"H����p��kt����AM5.*
�YN��sJ�bd�Zn��{�Ž�(�+r���j�.��7߲#��������K4��*�̳��;wԳme�7�G	�UJt�.}��������6R�RJ
0��EZ-�)?���J3_��%+�^<����2TǃP�.�Y��<Pg2�o���u�͕�	�YC��s�6b)?��1i��Z�w׭eeXS�8H`Z�R0��iBL*��s4�l�����V9@%�T5k��@x���R���5�R-5)吼4kO���aPyg`�>R
j�:TI�j�RR�K4��Z[�܋w]��7��bm)���y@��"��Z<P��
�=L��tK^���+LB��A&�"��UN{�y�"B{Pm6ׅpYeT��Wi �����������~��Vwi����Cޭ��;n��Wn%ʍ��"�1K�����v�m����`S�2[������8/T��`��;P8`�!��tH�-v�� �*����`Q��|��i����}��W�i��J��,��S�Y=��ZI�㚟/=�Z�V)�����ᮠ���l*77�p}c1�9P�W�C>�j���$��aY�Qq�!є?p���|g�4uU	1~�9���~ic}�b��l#s~�-��!�z��0D��(�D��?u�W^z��[���y:-"7�,�����:̏t��~n�cn�8o�IEND�B`��liFD$00ebdf9f-0482-1173-a2a2-eaea0594271atxt.png��PNG


IHDR00W��	pHYs��
OiCCPPhotoshop ICC profilexڝSgTS�=���BK���KoR RB���&*!	J�!��Q�EEȠ�����Q,�
��!��������{�kּ�����>�����H3Q5��B������.@�
$p�d!s�#�~<<+"��x��M��0���B�\���t�8K�@z�B�@F���&S�`�cb�P-`'������{[�!�� e�Dh;��V�EX0fK�9�-0IWfH�����0Q��){`�##x��F�W<�+��*x��<�$9E�[-qWW.(�I+6aa�@.�y�2�4�������x����6��_-��"bb��ϫp@�t~�,/��;�m��%�h^�u��f�@����W�p�~<<E���������J�B[a�W}�g�_�W�l�~<�����$�2]�G�����L�ϒ	�b��G�����"�Ib�X*�Qq�D���2�"�B�)�%�d��,�>�5�j>{�-�]c�K'Xt���o��(�h���w��?�G�%�fI�q^D$.Tʳ?�D��*�A�,����`6�B$��BB
d�r`)��B(�Ͱ*`/�@4�Qh��p.�U�=p�a��(��	A�a!ڈb�X#����!�H�$ ɈQ"K�5H1R�T UH�=r9�\F��;�2����G1���Q=��C��7�F��dt1�����r�=�6��Ыhڏ>C�0��3�l0.��B�8,	�c˱"����V����cϱw�E�	6wB aAHXLXN�H� $4�	7	�Q�'"��K�&���b21�XH,#��/{�C�7$�C2'��I��T��F�nR#�,��4H#���dk�9�, +ȅ����3��!�[
�b@q��S�(R�jJ��4�e�2AU��Rݨ�T5�ZB���R�Q��4u�9̓IK�����hh�i��t�ݕN��W���G���w
��Ljg(�gw��L�Ӌ�T071���oUX*�*|��
�J�&�*/T����ުU�U�T��^S}�FU3S�	Ԗ�U��P�SSg�;���g�oT?�~Y��Y�L�OC�Q��_�� c�x,!k
��u�5�&���|v*�����=���9C3J3W�R�f?�q��tN	�(���~���)�)�4L�1e\k����X�H�Q�G�6����E�Y��A�J'\'Gg����S�Sݧ
�M=:��.�k���Dw�n��^��Lo��y��}/�T�m���GX�$��<�5qo</���QC]�@C�a�a�ᄑ��<��F�F�i�\�$�m�mƣ&&!&KM�M�RM��)�;L;L���͢�֙5�=1�2��כ߷`ZxZ,����eI��Z�Yn�Z9Y�XUZ]�F���%ֻ�����N�N���gð�ɶ�����ۮ�m�}agbg�Ů��}�}��=
���Z~s�r:V:ޚΜ�?}���/gX���3��)�i�S��Ggg�s�󈋉K��.�>.���Ƚ�Jt�q]�z�������ۯ�6�i�ܟ�4�)�Y3s���C�Q��?��0k߬~OCO�g��#/c/�W�װ��w��a�>�>r��>�<7�2�Y_�7��ȷ�O�o�_��C#�d�z����%g��A�[��z|!��?:�e����A���AA�����!h�쐭!��Α�i�P~���a�a��~'���W�?�p�X�1�5w��Cs�D�D�Dޛg1O9�-J5*>�.j<�7�4�?�.fY��X�XIlK9.*�6nl�������{�/�]py�����.,:�@L�N8��A*��%�w%�
y��g"/�6ш�C\*N�H*Mz�쑼5y$�3�,幄'���L
Lݛ:��v m2=:�1����qB�!M��g�g�fvˬe����n��/��k���Y-
�B��TZ(�*�geWf�͉�9���+��̳�ې7����ᒶ��KW-X潬j9�<qy�
�+�V�<���*m�O��W��~�&zMk�^�ʂ��k�U
�}����]OX/Yߵa���>������(�x��oʿ�ܔ���Ĺd�f�f���-�[����n
�ڴ
�V��E�/��(ۻ��C���<��e����;?T�T�T�T6��ݵa�n��{��4���[���>ɾ�UUM�f�e�I���?�����m]�Nmq����#�׹���=TR��+�G�����w-
6
U����#pDy��	�
:�v�{���vg/jB��F�S��[b[�O�>����z�G��4<YyJ�T�i��ӓg�ό���}~.��`ۢ�{�c��jo�t��E���;�;�\�t���W�W��:_m�t�<���Oǻ�����\k��z��{f���7���y���՞9=ݽ�zo�����~r'��˻�w'O�_�@�A�C݇�?[�����j�w����G�������C���ˆ
��8>99�?r��C�d�&����ˮ/~�����јѡ�򗓿m|�����������x31^�V��w�w��O�| (�h���SЧ�������c3-�gAMA��|�Q� cHRMz%������u0�`:�o�_�F	�IDATx�̙[�U�����f�aAgJŢ�̅���bj���[Ӧ�KӘ&M���&M�6M�Ф�Xjc���i�qAD
���0s�ٗo�a߾=�9/_�3{�^{�u���Z�ڢ�̷���I@A����w�<�E�j��GJP�X����G������[�^�pQo\q#�1���ߌ���s'�X=�5[(ɩ�)�z��3x��/NT����۹�ՔV�zd�	��=(�U1�_!���V�̾�qmȟZ���K���Ď���s��m|ƫ>�K��*��������J{��L|�_W��{�2���[YA���A�F@����V�~���G����3-E�D��W?~�P�5�G���痉"e�C�?��؇syb
O�Lտ�����++_��"E:O�|2�M�@gUY�f%a-���4*�����Aڪ���}��|�{�mME�ır��'����Gz�c��GzY����۶�Ƕ-�j.s����SDQL#����(�zBՃ�����w_���㾿L>��z�,(<���ı��_�[]����{x��K<��sT|�e�u|t��;�{�r��S\8�6Or#�|�C=���9��f���y!��XύO����'�F��|�X����kW33��҅)A�g�M!��������c�ہ��6���L��0�QV�߱����W���.l�Im���U����?3vbᣣ+�?U!��ͽ>�G��1>���n�\
��|��N_���j!�z���	�U"mHj��"���t_�t<d™���QM`r���.C���v�M�ѹ��<��#݉�#s�cŊX�n
�kW�j�
zz�R����zya`AG��v?W����?�T>�uK�^�la�r��S�.O��_#�J+��0V�,�Z%�aj�n�o|�����8�y(/v�S����9r�8�O�&��$�s&J������f����O�;s��d
i����_���:iD16����юH��,�6�R뭱2��~�:��0����	#K[�����U|T�H@#����M���o�<��/l����1]ySA�L'TS�#�A���w"��}!7�XAP�syr�S��S�Չ��1�&���y�J�ʢ�Nv�ӳ�������S���Ƀ}�ٶ%l��nZ�G__�(#@a���9^V���;�H��v�Tm�O�N𕵷q��q�F��!���Hb��y�1,]���J��e��\ԹJn�cl*O��ֵ}=4"w�,���%)I�5Vb��:��3�5�:6��6N��x*V���m�ʂ�vV�����
�f\�a"��Rh��Kr���Z��T4�Hc0�`|D1��*[M�j#�B�ⳠZ,�8Cգ��2�����}'/:�����r��;yk�yTTA���a!A�B�X[���+�;r<1�3�ߊd{>A�1zK��&
��yRn�g}���B��'�QT�
��d�*��8��	B�ƄQD�x����P����9!�q&�<.V�V6���
"	�d�)t$��-��H�>Q��ɤB5F<�6ϣA��X���L�$q���Gb��tk�zE�^��~;��q�.�����f�
�B��"pr%d��A)p僚���^k�X�B�<�e��)Ppo�t�,Ҕ�8FYkg�#��8�u�5$3�v�esc$�ycGfH�WsK~n��;(JTԴ
�3j������a;�{R���@���uؽ�9
�������v��S�	=!�I�*Cٽk/�됈`[��A���``hC�������拔;#��D���گ��6"�d�Ԗ��@a���Q�R �Au�/�K[��\z��Y9ҕu�T���͍dM��ߜv�ӥf0q�%y�`p�&��fq9�j�3C#�rc�n��Т"��ܼ	fS`�Y�q�.�u,PepxS*���LM[��Y(m#܈��(�x�!�R��ږו<^�ܣy�]�++�t!˰^���]9L�7
ˤh*J��;�G��y�"���H��?<:�
@�z�J�v(0t�P	
�7�x�aIws#�3�G��$��JQ�r��*�hi���U�����R��s�re�Z0X���a(��a�g�T�s!���_}}�r'Ըy�fv��:��ܿ��Wv:��6��Y�7LJ��[7���i�8���;��n
z��fJ̵�����@���876�IMS�]��z�
/�2��4��sTV���GyZ�E;a1x���WƜ
Yxdd�(㯌��U����Q���m���ƪ%��4��K`��ѫ��F�HV�2�[G�g9�&�]�JmKKBP�]���^��/�U�GQe��w�l�Y�LK�W%��U�U%����w�2k��<���0�[��s �ȑ%�,_��҇}��}�
{���T<h�~�eD�vA�B3'"����9t�4_�%"�杍��F`�C��<��l�dS��/�,�4֙��IEND�B`�tliFD$a01c1b80-0482-1173-a2a2-eaea0594271a
video.png�PNG


IHDR00W��	pHYs��
OiCCPPhotoshop ICC profilexڝSgTS�=���BK���KoR RB���&*!	J�!��Q�EEȠ�����Q,�
��!��������{�kּ�����>�����H3Q5��B������.@�
$p�d!s�#�~<<+"��x��M��0���B�\���t�8K�@z�B�@F���&S�`�cb�P-`'������{[�!�� e�Dh;��V�EX0fK�9�-0IWfH�����0Q��){`�##x��F�W<�+��*x��<�$9E�[-qWW.(�I+6aa�@.�y�2�4�������x����6��_-��"bb��ϫp@�t~�,/��;�m��%�h^�u��f�@����W�p�~<<E���������J�B[a�W}�g�_�W�l�~<�����$�2]�G�����L�ϒ	�b��G�����"�Ib�X*�Qq�D���2�"�B�)�%�d��,�>�5�j>{�-�]c�K'Xt���o��(�h���w��?�G�%�fI�q^D$.Tʳ?�D��*�A�,����`6�B$��BB
d�r`)��B(�Ͱ*`/�@4�Qh��p.�U�=p�a��(��	A�a!ڈb�X#����!�H�$ ɈQ"K�5H1R�T UH�=r9�\F��;�2����G1���Q=��C��7�F��dt1�����r�=�6��Ыhڏ>C�0��3�l0.��B�8,	�c˱"����V����cϱw�E�	6wB aAHXLXN�H� $4�	7	�Q�'"��K�&���b21�XH,#��/{�C�7$�C2'��I��T��F�nR#�,��4H#���dk�9�, +ȅ����3��!�[
�b@q��S�(R�jJ��4�e�2AU��Rݨ�T5�ZB���R�Q��4u�9̓IK�����hh�i��t�ݕN��W���G���w
��Ljg(�gw��L�Ӌ�T071���oUX*�*|��
�J�&�*/T����ުU�U�T��^S}�FU3S�	Ԗ�U��P�SSg�;���g�oT?�~Y��Y�L�OC�Q��_�� c�x,!k
��u�5�&���|v*�����=���9C3J3W�R�f?�q��tN	�(���~���)�)�4L�1e\k����X�H�Q�G�6����E�Y��A�J'\'Gg����S�Sݧ
�M=:��.�k���Dw�n��^��Lo��y��}/�T�m���GX�$��<�5qo</���QC]�@C�a�a�ᄑ��<��F�F�i�\�$�m�mƣ&&!&KM�M�RM��)�;L;L���͢�֙5�=1�2��כ߷`ZxZ,����eI��Z�Yn�Z9Y�XUZ]�F���%ֻ�����N�N���gð�ɶ�����ۮ�m�}agbg�Ů��}�}��=
���Z~s�r:V:ޚΜ�?}���/gX���3��)�i�S��Ggg�s�󈋉K��.�>.���Ƚ�Jt�q]�z�������ۯ�6�i�ܟ�4�)�Y3s���C�Q��?��0k߬~OCO�g��#/c/�W�װ��w��a�>�>r��>�<7�2�Y_�7��ȷ�O�o�_��C#�d�z����%g��A�[��z|!��?:�e����A���AA�����!h�쐭!��Α�i�P~���a�a��~'���W�?�p�X�1�5w��Cs�D�D�Dޛg1O9�-J5*>�.j<�7�4�?�.fY��X�XIlK9.*�6nl�������{�/�]py�����.,:�@L�N8��A*��%�w%�
y��g"/�6ш�C\*N�H*Mz�쑼5y$�3�,幄'���L
Lݛ:��v m2=:�1����qB�!M��g�g�fvˬe����n��/��k���Y-
�B��TZ(�*�geWf�͉�9���+��̳�ې7����ᒶ��KW-X潬j9�<qy�
�+�V�<���*m�O��W��~�&zMk�^�ʂ��k�U
�}����]OX/Yߵa���>������(�x��oʿ�ܔ���Ĺd�f�f���-�[����n
�ڴ
�V��E�/��(ۻ��C���<��e����;?T�T�T�T6��ݵa�n��{��4���[���>ɾ�UUM�f�e�I���?�����m]�Nmq����#�׹���=TR��+�G�����w-
6
U����#pDy��	�
:�v�{���vg/jB��F�S��[b[�O�>����z�G��4<YyJ�T�i��ӓg�ό���}~.��`ۢ�{�c��jo�t��E���;�;�\�t���W�W��:_m�t�<���Oǻ�����\k��z��{f���7���y���՞9=ݽ�zo�����~r'��˻�w'O�_�@�A�C݇�?[�����j�w����G�������C���ˆ
��8>99�?r��C�d�&����ˮ/~�����јѡ�򗓿m|�����������x31^�V��w�w��O�| (�h���SЧ�������c3-�gAMA��|�Q� cHRMz%������u0�`:�o�_�F
9IDATxڼYk�]U�����y�Ckx*"��$|`
���!Q��Q#!�h�1*QcD$<�dBQh)��P"��`��@���ʫ0��̽��c���g�zg(��N�=s����[k!���z�Y(� �w����)�jb�X��c���ߞ=�
����{u�8�L�O���U�rI�x������k?�]G�;Q������^/�j
O<�}�䀒X���U��€E���<z�5O���W̍M���j�;R¨>�\�,�`3	:�n�DQX��
Te��?����c{�o��1�f��-�F6x1�?�A��� @�(

0�<zպ�O�>[�˛���L���IAH�x��J�p*��@�������Ww��P�c�r����,�K�g�P%��*jWC�5���CT(#����κu%N���tj�������u��w��F=����������x�̯�
'3*�2)�hf��"��<�k���9��=�г��P�ŏv���sGqbt؅�x��	M��H녱.b��P*��!�A�D'P�m{|���|�ftI����h�7�u�l!b ���^��?���R'ʲ@�f��?���!���)��>4��Ыz#E��5c���

㻓�E�zkJL�_�����Am����R<�H��w�m͈/b���3��-ڨ����&�0��x�_��vW�?SV!�RZ�<�[�Z`&��=���b��L�"���2u���=��=uU-ub�Ыq����v::�t�iK�(�0��X����"N&wbj�g�||����\o^}mVV�!1�
t:,��\�Ĵ�2�#��p`��ٹ����y,X��?@=�a'z���d�w���_���?��(��c��I'��b�
k�O�
<<P�$Y�n��&j�0X\��y���
�j���e���eUa��&����0>9��~�s�
_xr�E�=,FUb�o�-}"i%"�(M�"KE!�΋����'PU��>��AUC���������"��}
��Ćç1�v�X9�ݏ8}ā�!!��W$�h��¬�h�d��1��,PuaPp�"���g�"�*��ƿ_x��g16�洇�9Y���q�L��g��FM�&���c�3E�c`�gP�>[J�BP�ƪ��_Ͽ�ʢ*V�it,��['b�ù���!X#��E�+QT�^
u��5_cD<c`l����̷��?��_�?���q��O�Σ[�iX�P���BEAY��5��P*�D�@D��ψ��Wۙ�;7ޘYv�y�d���T������7LJY$$����� �Z�E��RQ��HC�i�Z4���ݱ
Gm�
8�4]�X����{�y�N��u�x=@��*Q����#�&��
agS�>4����Rq��?��W��^�Ia�$H1��>��|)N9�|���ޗ06>�鷭O��4�4u�m�լ�(1�H��f}ϥW߶��y��[�������G[��&�ʦ��f�K��Sy�;�����W�N3�7cl��e"
*�����0̈́6:�Z�,I(69���Q�$��8*�C�Z`T�Qb�ԆG��, 5곅�@٘D1F~#��Lr�i�%��@莛o�m7�$�B�o��8u�j�&����n��?�/�g���
��35�L�_��ɒ�	r
�&j>�
��eۊEԤK�f�U���(sk�1$Sf�5@i�i�_+q���FI|����5���_�������*v�u=v݅l��t�&˯��k&���$�^B�n:"Q�Ǘ4�}s��d��V�]��L;�dС��Q4��5ª��ZJ`j�����[�	��2�?�N�[��zp��y����ݛ� �Z��q\ɤ[��v�g��לi�#Y
h�
jJX	���	��$�Ҳc�Je*��Cl�F<�T:4�B�-[�m���	���g���9��b۶��r�FV��+3F�B�E�2ɇ/�nE����jt������$+��+����!�(�{gf�ޙQ�q������g�P��p�U��ڭ9��TЖE��T����m �̶pN�ro���K��(Q䅛ދ�C����G:uն��2d���*6�c��'Ck a�L��#	��`\��7��pk��ɂW��Q���:C����vAQ�U5�A��F�`��\�.!�a��R�d ��r��?9�?�m�^��9U<�c�<�}��)\�w��"t�)��N	:�E�}�\w�?y0;Ocm�,�<�z���m%2�B�&
�3�(�0Ҵ�Z������s��nQK��z�ˊ����|�?"Ճ��a�ofOc\�X\x�W�T��=���@;�K����8M�V}S
��Y�I=�G�%p�9��w�|f�J�����S�x>��T@Y6����,�5��|�_�����S��Gb��P*���v���fCD6	I����ʎ�h�O/��e���O��Cxk^���&�����*�%���ƒ��R�B
_%�IEND�B`��liFD$928d337a-0482-1173-a2a2-eaea0594271a
audio.pngN�PNG


IHDR00W��	pHYs��
OiCCPPhotoshop ICC profilexڝSgTS�=���BK���KoR RB���&*!	J�!��Q�EEȠ�����Q,�
��!��������{�kּ�����>�����H3Q5��B������.@�
$p�d!s�#�~<<+"��x��M��0���B�\���t�8K�@z�B�@F���&S�`�cb�P-`'������{[�!�� e�Dh;��V�EX0fK�9�-0IWfH�����0Q��){`�##x��F�W<�+��*x��<�$9E�[-qWW.(�I+6aa�@.�y�2�4�������x����6��_-��"bb��ϫp@�t~�,/��;�m��%�h^�u��f�@����W�p�~<<E���������J�B[a�W}�g�_�W�l�~<�����$�2]�G�����L�ϒ	�b��G�����"�Ib�X*�Qq�D���2�"�B�)�%�d��,�>�5�j>{�-�]c�K'Xt���o��(�h���w��?�G�%�fI�q^D$.Tʳ?�D��*�A�,����`6�B$��BB
d�r`)��B(�Ͱ*`/�@4�Qh��p.�U�=p�a��(��	A�a!ڈb�X#����!�H�$ ɈQ"K�5H1R�T UH�=r9�\F��;�2����G1���Q=��C��7�F��dt1�����r�=�6��Ыhڏ>C�0��3�l0.��B�8,	�c˱"����V����cϱw�E�	6wB aAHXLXN�H� $4�	7	�Q�'"��K�&���b21�XH,#��/{�C�7$�C2'��I��T��F�nR#�,��4H#���dk�9�, +ȅ����3��!�[
�b@q��S�(R�jJ��4�e�2AU��Rݨ�T5�ZB���R�Q��4u�9̓IK�����hh�i��t�ݕN��W���G���w
��Ljg(�gw��L�Ӌ�T071���oUX*�*|��
�J�&�*/T����ުU�U�T��^S}�FU3S�	Ԗ�U��P�SSg�;���g�oT?�~Y��Y�L�OC�Q��_�� c�x,!k
��u�5�&���|v*�����=���9C3J3W�R�f?�q��tN	�(���~���)�)�4L�1e\k����X�H�Q�G�6����E�Y��A�J'\'Gg����S�Sݧ
�M=:��.�k���Dw�n��^��Lo��y��}/�T�m���GX�$��<�5qo</���QC]�@C�a�a�ᄑ��<��F�F�i�\�$�m�mƣ&&!&KM�M�RM��)�;L;L���͢�֙5�=1�2��כ߷`ZxZ,����eI��Z�Yn�Z9Y�XUZ]�F���%ֻ�����N�N���gð�ɶ�����ۮ�m�}agbg�Ů��}�}��=
���Z~s�r:V:ޚΜ�?}���/gX���3��)�i�S��Ggg�s�󈋉K��.�>.���Ƚ�Jt�q]�z�������ۯ�6�i�ܟ�4�)�Y3s���C�Q��?��0k߬~OCO�g��#/c/�W�װ��w��a�>�>r��>�<7�2�Y_�7��ȷ�O�o�_��C#�d�z����%g��A�[��z|!��?:�e����A���AA�����!h�쐭!��Α�i�P~���a�a��~'���W�?�p�X�1�5w��Cs�D�D�Dޛg1O9�-J5*>�.j<�7�4�?�.fY��X�XIlK9.*�6nl�������{�/�]py�����.,:�@L�N8��A*��%�w%�
y��g"/�6ш�C\*N�H*Mz�쑼5y$�3�,幄'���L
Lݛ:��v m2=:�1����qB�!M��g�g�fvˬe����n��/��k���Y-
�B��TZ(�*�geWf�͉�9���+��̳�ې7����ᒶ��KW-X潬j9�<qy�
�+�V�<���*m�O��W��~�&zMk�^�ʂ��k�U
�}����]OX/Yߵa���>������(�x��oʿ�ܔ���Ĺd�f�f���-�[����n
�ڴ
�V��E�/��(ۻ��C���<��e����;?T�T�T�T6��ݵa�n��{��4���[���>ɾ�UUM�f�e�I���?�����m]�Nmq����#�׹���=TR��+�G�����w-
6
U����#pDy��	�
:�v�{���vg/jB��F�S��[b[�O�>����z�G��4<YyJ�T�i��ӓg�ό���}~.��`ۢ�{�c��jo�t��E���;�;�\�t���W�W��:_m�t�<���Oǻ�����\k��z��{f���7���y���՞9=ݽ�zo�����~r'��˻�w'O�_�@�A�C݇�?[�����j�w����G�������C���ˆ
��8>99�?r��C�d�&����ˮ/~�����јѡ�򗓿m|�����������x31^�V��w�w��O�| (�h���SЧ�������c3-�gAMA��|�Q� cHRMz%������u0�`:�o�_�FiIDATxڼ�Y�%�Y�ߩSUw�e����o)�@@��(B�P��E�x@�PxA	��$�P!Q0"& �	�0&�x����dzz��2�w��|<�rO��o�J�VݪSU��wDUy���n)(�
"��Tϖ��j-�SG�<S�Q���s\y�����3�����;q�n��1�밳,RUΞ�2�u"�L��u�Jd�p�p��&Awq}3�w�3g���c&�*��1H�;(�SH1�
I��00߽��go���n�;�����=�����]���:U�
hE�(��)&��+�~��1�z@=Y���{ic-�7 ��CQu���֠�8)`G_��u�ڣ���g�Z��*��B=m]yߩ�Nɝ�i���2)��qx�W�_|!����=W�M�h�����✢yN�Y���Y��g)�+ F��'���?�W�QbFMe���v�n����S�,g��dIF��D�
���
>��s�?5+�̬iT����`U��Iy�׺��9%�sҴ�K�	q ��k4���+?0��+���B������E븨�G��q�<%�Vk��K/��A��F�TP�:�3)�e��T6E1�QSf/H�)����J��%ju/}����f~W�e}��J��RD"Lb�`��#
k��$�(@�
�;��v~^�e�r�$�T�r�F*RC�PN'1#E�&(~c��X=,%��ڝ�/��b|\�B�Pe"P쉂:�����A] �X/�)S���&tA��W"�^/�/��?fQ�[�=�E5��_X�Mutn��[��r`L�	:�xw�JX�Tbn.6�ҳ���?1��-��^O��3���P����x�E���D��l��s{���Ý!�8!K3��Dl
�^?�K����=]+ ��}qUZ>�(+��@��+x@Q��R׍b�˔,�IF#�����b8�g9�r�2y���0����қkq���^��8c��Jz�™�|���Z�ES&L�'^+Q�M��U���B R(/�	-��]�( �ɲ�\i ���k����ሕ��aȡ��t继��#�?1#�����2�Wx��ε�6z����1#��bm@f
�K��F0�P'd.��ֈ׶hwZ?��7{�̕���^6-<1�F���5��?T1`D
�S(cm���ƒ��S���BZ�Q8��u�( ���\m�:�k:Q�6zy�JNZ@#a@��Ȓ�.ϧ�V���H���1���$�/���S�,�珝>W��*(��˄aD�����6B���ƕ��l�F!i���9�
P����Ra1���gi� `=L���y�{$�O�N�ˢ5ElT
(UUZQz��C5G��8�	B��!A`#KԎ�[1q+"�-6��V�EԊ	���̤���^z�
I:��󋇰���cuLথ
�b�F�;�^��ц�Ԥ��~�$Ɲ��(e�	��ܼ�\o��蟋qڠ<�+j�	�d�~����?���Y�5Z�0�1�SJ�b�W����l�|���1 �����7j������^t��n���I}"^����"�Y~����嵧ٹ}�o+�-��)��J2�����TlOjvWg���E�>l� �uz�0Q-7���6Y�*�q��[
��~ç�D�2i�m��QDw��^���z�M^��%��z������bs}��X�i�jN�4��D	���y1Sy`_��t�X׎�G�ʉ��q�͏�v�J��ԝ���N�u��������&��o^�

�V���p��Ï�7�9�S|�꧹��&N��~h]��돪���&�R�	tT&�����nj�\A�e=V�,r�����;�s	��_��e^[�����E��2I�BuҔx��I��-��[�k��m�:�N�Q���U�#r���>�'�k���7W=OHs֪x�b:�5#����+�b�P�pm�	:��|�y>��/��op.gc�u��l�?�ϓ�;l�o5�6f�~�b�I�7��3iI��@5:�?p�#�q���9��M��C�6���y����I2f<66B�w{�h@�����y��9
�N�9�8��[X��'9{�i^zy�q�p��1�/�N��X�ޤ{��J��[to��
�~�)�:]�����¯p�-��?�h��!MƠJ26���ڕ��">�򰿿�z%�k~$W�^�fa����x�"M����f�4I@!�{i�G��<�<�T;@��G�s+�_�o�
���I#��T���u	\�6�2}���'�r��;�9�C	�ƨ�_��6��v
��\�򱓗8vd�\Ǭ���� n�Q�E��\���7�v��s�G	�!l�@�{m6��ܭ�i������c6���߇�.\����<s�.��*�~��f�^�c�`K	�(ĭN��"�&Q�t�\Gy=���	�>G�}x�x��H3�����nm~���H��ς���!b6�� ��V�]���di^�wT���/��it���=���+�N1Fq���%M3�q��p8��~��ms�������N��@��t�{���b������A;�Z���q�$�{�����K�'�"�SWV�\��+�:�Q�t>I����.bs0&xWּ�T%p(�o�����2��2L���QA ��vD�/q��8&�,�B��
��cΞ�8Ks���sƣ��բۛ�;?�.D�p�$�;+`���سa7e0N����P'6[��tw~�����]n�W��s�Y��\�v�����#n��{y�ȣ��S�Í�y����M�|����0d�m�J��~��?M�UϽ���W/����ʽ���֞��Y:lc��.���%�s���_Ͼ|��_����O��ݛ����
�wܠ�sa}IEND�B`�liFD$20883df8-0480-1173-a2a2-eaea0594271aapplication.png��PNG


IHDR00W��	pHYs��
OiCCPPhotoshop ICC profilexڝSgTS�=���BK���KoR RB���&*!	J�!��Q�EEȠ�����Q,�
��!��������{�kּ�����>�����H3Q5��B������.@�
$p�d!s�#�~<<+"��x��M��0���B�\���t�8K�@z�B�@F���&S�`�cb�P-`'������{[�!�� e�Dh;��V�EX0fK�9�-0IWfH�����0Q��){`�##x��F�W<�+��*x��<�$9E�[-qWW.(�I+6aa�@.�y�2�4�������x����6��_-��"bb��ϫp@�t~�,/��;�m��%�h^�u��f�@����W�p�~<<E���������J�B[a�W}�g�_�W�l�~<�����$�2]�G�����L�ϒ	�b��G�����"�Ib�X*�Qq�D���2�"�B�)�%�d��,�>�5�j>{�-�]c�K'Xt���o��(�h���w��?�G�%�fI�q^D$.Tʳ?�D��*�A�,����`6�B$��BB
d�r`)��B(�Ͱ*`/�@4�Qh��p.�U�=p�a��(��	A�a!ڈb�X#����!�H�$ ɈQ"K�5H1R�T UH�=r9�\F��;�2����G1���Q=��C��7�F��dt1�����r�=�6��Ыhڏ>C�0��3�l0.��B�8,	�c˱"����V����cϱw�E�	6wB aAHXLXN�H� $4�	7	�Q�'"��K�&���b21�XH,#��/{�C�7$�C2'��I��T��F�nR#�,��4H#���dk�9�, +ȅ����3��!�[
�b@q��S�(R�jJ��4�e�2AU��Rݨ�T5�ZB���R�Q��4u�9̓IK�����hh�i��t�ݕN��W���G���w
��Ljg(�gw��L�Ӌ�T071���oUX*�*|��
�J�&�*/T����ުU�U�T��^S}�FU3S�	Ԗ�U��P�SSg�;���g�oT?�~Y��Y�L�OC�Q��_�� c�x,!k
��u�5�&���|v*�����=���9C3J3W�R�f?�q��tN	�(���~���)�)�4L�1e\k����X�H�Q�G�6����E�Y��A�J'\'Gg����S�Sݧ
�M=:��.�k���Dw�n��^��Lo��y��}/�T�m���GX�$��<�5qo</���QC]�@C�a�a�ᄑ��<��F�F�i�\�$�m�mƣ&&!&KM�M�RM��)�;L;L���͢�֙5�=1�2��כ߷`ZxZ,����eI��Z�Yn�Z9Y�XUZ]�F���%ֻ�����N�N���gð�ɶ�����ۮ�m�}agbg�Ů��}�}��=
���Z~s�r:V:ޚΜ�?}���/gX���3��)�i�S��Ggg�s�󈋉K��.�>.���Ƚ�Jt�q]�z�������ۯ�6�i�ܟ�4�)�Y3s���C�Q��?��0k߬~OCO�g��#/c/�W�װ��w��a�>�>r��>�<7�2�Y_�7��ȷ�O�o�_��C#�d�z����%g��A�[��z|!��?:�e����A���AA�����!h�쐭!��Α�i�P~���a�a��~'���W�?�p�X�1�5w��Cs�D�D�Dޛg1O9�-J5*>�.j<�7�4�?�.fY��X�XIlK9.*�6nl�������{�/�]py�����.,:�@L�N8��A*��%�w%�
y��g"/�6ш�C\*N�H*Mz�쑼5y$�3�,幄'���L
Lݛ:��v m2=:�1����qB�!M��g�g�fvˬe����n��/��k���Y-
�B��TZ(�*�geWf�͉�9���+��̳�ې7����ᒶ��KW-X潬j9�<qy�
�+�V�<���*m�O��W��~�&zMk�^�ʂ��k�U
�}����]OX/Yߵa���>������(�x��oʿ�ܔ���Ĺd�f�f���-�[����n
�ڴ
�V��E�/��(ۻ��C���<��e����;?T�T�T�T6��ݵa�n��{��4���[���>ɾ�UUM�f�e�I���?�����m]�Nmq����#�׹���=TR��+�G�����w-
6
U����#pDy��	�
:�v�{���vg/jB��F�S��[b[�O�>����z�G��4<YyJ�T�i��ӓg�ό���}~.��`ۢ�{�c��jo�t��E���;�;�\�t���W�W��:_m�t�<���Oǻ�����\k��z��{f���7���y���՞9=ݽ�zo�����~r'��˻�w'O�_�@�A�C݇�?[�����j�w����G�������C���ˆ
��8>99�?r��C�d�&����ˮ/~�����јѡ�򗓿m|�����������x31^�V��w�w��O�| (�h���SЧ�������c3-�gAMA��|�Q� cHRMz%������u0�`:�o�_�F�IDATx�ęK�&W��֭��9ә�a�1�ѥ�� !C|���B]d��q��V4�J�D�&BL����@P��B0��1f�gz��W�{��[�[_wO���N.|�U�ݯ�<��9%��;���{UAAP��mu==��"
��x������y�̫�;8߿��b�raE�;��ư�e�٤��|�<#���隔:�T�J8e0s��Kd�K+��}�������J�����原�"��ڜrЧ�g��~�q{yvi����S9LC4�n"�V������@T�6c��y�����Z֕��L�Md�F�5^�@J���P!`�A��8 W���W�=,{��jb�F��*T�BmC�}PA���ԣ��ΑI����7����O��?*��A��ю�7���)%E�LJ��0r8��0`�Y����~��(1%�&��DL�j�Ba�<#�qc���Pd��̀;�ȩߜNf�4�Ip6b&��P�j[��!��x�)����2i�(X�����^�c%�W@'�#Q��BH�H�E��h�G���Ѹ$3$JH�����O`� ��.T��񴅷��meS�E0U��rT�	٨D�[���W|�]����5�U�@��k�B��AĀ�@��B�`Md'��V�z39����s���L�unlSO
�Pi�"
��r�ƌ� L�1�̶V�+I�,�ٹ���A_8!;�P���E`�
j+m3i�:"+�cb��gm:� @�*���BOz���(6*1�4V����a�х	&�R��r`L��2�f{��Rš���=�|�?3.�ʎ�� ZCg"Ki�nU�z�E��0W���zy���>k�����1�t�D��5,,�z�~�~���4
�4��o���~��]�nbү�������q_p���p��j����C��h�*y�̐e��(ط8��������<��c�����K7}����v�J��Lh�'	�h��R���RM!�ʋ`r���<E�1�p�B�d0���YY>w�^�s����˵z�ؔ
M���	^�x�>��+�����1#��bm���
�"��*Bo�}��۫���|��Y(���M�d�艖��4ijB�?T1`D"L���X[y�`$zP�Fo�X+�e�ȁ���E�Q��p���	�䚶J4F����I#�!3B�g�[X\����Z��1����1��2g��nfmzURhG��5��i��\��(��6/(Tȋ��9|��l��dՓ�A�"�we�H�����i��5���uJ�T�I(�T��H1$N*T=�e�clf	��E2���i:�LUC
�Y�^S�T۔I�;&N�c���V4 �-rl^0;7�kar�!:1���_Y�77�
$q@A*��v�v�N�v���.u�7uZ[�U��TO���I����^K��1 R�U�d�Bϐ֙���9�@���oY�_z�][����QK�v[*�X�M�)�a���7�u{�~zߏy��s�cz��1�*P+��NN&��$�e��N��wc�^�ġc�[�dQ�ΐ�ۍa3��_�2�8���JgO�|w�U[��6�6t���@Q�:�DdI[�D�a6z��!�����s��ևD�|����̖������,I��m�Ui'�f!��{��0G�{��x�q�ᝫ�=����}hν��V�^����9V�ڒ�V��p���[*��Oa��'�<po�&,<Q�&:6�<����疗�PcR�;��*^IF��_1���	\�����G￝7^�[
���C�>ιn�^��)Ei�1�o$�
n$�\��%�ݘѻ��_߆���
񇯟q�ԡ�Y_[c}}���T	MH� %�u��z�z�=0{�c��ꓨ��X��=���鯯3��*�����i�+T��V
���u��/~��(�??�s�a��ٳ;����o�R밈	J;��$Aq� n�^�c�}r���u���Օ8"�0L�����zo��6�S�D;�VMҒW��M
G\\Ya<�=��+CK'4�L����Ͽ+�7�Id��v2��w��hu_+��A��e�
����{�@P�����y`�+�f:�;��
b3���6A7�W s'O��������]x�5K�9s���l�(��O���{�ȇ�f-�^��?��v�V3�x]D>�K�����.밪���ƍ�?�\���I:IEND�B`��liFD$53a52047-0489-1173-a2a2-eaea0594271aswf.png��PNG


IHDR00W��	pHYs��
OiCCPPhotoshop ICC profilexڝSgTS�=���BK���KoR RB���&*!	J�!��Q�EEȠ�����Q,�
��!��������{�kּ�����>�����H3Q5��B������.@�
$p�d!s�#�~<<+"��x��M��0���B�\���t�8K�@z�B�@F���&S�`�cb�P-`'������{[�!�� e�Dh;��V�EX0fK�9�-0IWfH�����0Q��){`�##x��F�W<�+��*x��<�$9E�[-qWW.(�I+6aa�@.�y�2�4�������x����6��_-��"bb��ϫp@�t~�,/��;�m��%�h^�u��f�@����W�p�~<<E���������J�B[a�W}�g�_�W�l�~<�����$�2]�G�����L�ϒ	�b��G�����"�Ib�X*�Qq�D���2�"�B�)�%�d��,�>�5�j>{�-�]c�K'Xt���o��(�h���w��?�G�%�fI�q^D$.Tʳ?�D��*�A�,����`6�B$��BB
d�r`)��B(�Ͱ*`/�@4�Qh��p.�U�=p�a��(��	A�a!ڈb�X#����!�H�$ ɈQ"K�5H1R�T UH�=r9�\F��;�2����G1���Q=��C��7�F��dt1�����r�=�6��Ыhڏ>C�0��3�l0.��B�8,	�c˱"����V����cϱw�E�	6wB aAHXLXN�H� $4�	7	�Q�'"��K�&���b21�XH,#��/{�C�7$�C2'��I��T��F�nR#�,��4H#���dk�9�, +ȅ����3��!�[
�b@q��S�(R�jJ��4�e�2AU��Rݨ�T5�ZB���R�Q��4u�9̓IK�����hh�i��t�ݕN��W���G���w
��Ljg(�gw��L�Ӌ�T071���oUX*�*|��
�J�&�*/T����ުU�U�T��^S}�FU3S�	Ԗ�U��P�SSg�;���g�oT?�~Y��Y�L�OC�Q��_�� c�x,!k
��u�5�&���|v*�����=���9C3J3W�R�f?�q��tN	�(���~���)�)�4L�1e\k����X�H�Q�G�6����E�Y��A�J'\'Gg����S�Sݧ
�M=:��.�k���Dw�n��^��Lo��y��}/�T�m���GX�$��<�5qo</���QC]�@C�a�a�ᄑ��<��F�F�i�\�$�m�mƣ&&!&KM�M�RM��)�;L;L���͢�֙5�=1�2��כ߷`ZxZ,����eI��Z�Yn�Z9Y�XUZ]�F���%ֻ�����N�N���gð�ɶ�����ۮ�m�}agbg�Ů��}�}��=
���Z~s�r:V:ޚΜ�?}���/gX���3��)�i�S��Ggg�s�󈋉K��.�>.���Ƚ�Jt�q]�z�������ۯ�6�i�ܟ�4�)�Y3s���C�Q��?��0k߬~OCO�g��#/c/�W�װ��w��a�>�>r��>�<7�2�Y_�7��ȷ�O�o�_��C#�d�z����%g��A�[��z|!��?:�e����A���AA�����!h�쐭!��Α�i�P~���a�a��~'���W�?�p�X�1�5w��Cs�D�D�Dޛg1O9�-J5*>�.j<�7�4�?�.fY��X�XIlK9.*�6nl�������{�/�]py�����.,:�@L�N8��A*��%�w%�
y��g"/�6ш�C\*N�H*Mz�쑼5y$�3�,幄'���L
Lݛ:��v m2=:�1����qB�!M��g�g�fvˬe����n��/��k���Y-
�B��TZ(�*�geWf�͉�9���+��̳�ې7����ᒶ��KW-X潬j9�<qy�
�+�V�<���*m�O��W��~�&zMk�^�ʂ��k�U
�}����]OX/Yߵa���>������(�x��oʿ�ܔ���Ĺd�f�f���-�[����n
�ڴ
�V��E�/��(ۻ��C���<��e����;?T�T�T�T6��ݵa�n��{��4���[���>ɾ�UUM�f�e�I���?�����m]�Nmq����#�׹���=TR��+�G�����w-
6
U����#pDy��	�
:�v�{���vg/jB��F�S��[b[�O�>����z�G��4<YyJ�T�i��ӓg�ό���}~.��`ۢ�{�c��jo�t��E���;�;�\�t���W�W��:_m�t�<���Oǻ�����\k��z��{f���7���y���՞9=ݽ�zo�����~r'��˻�w'O�_�@�A�C݇�?[�����j�w����G�������C���ˆ
��8>99�?r��C�d�&����ˮ/~�����јѡ�򗓿m|�����������x31^�V��w�w��O�| (�h���SЧ�������c3-�gAMA��|�Q� cHRMz%������u0�`:�o�_�F
�IDATx�̙Y�G�_u��z{�8q��`��8!$�\&$@�<��;�� �D$b�@����0��aB�$vpHbLl6�Y�ڻ3�]UU}�8xրBI�����]��ZT�����eYAAP�|7�7�˱^=�+�*y�r�%3<x�э[ϛZ��p�X|lQ�l����4ư���3HU��x���Z�f�Z�T	 ����xd�djvq)[�-�s�r�m,^�������
�f�U�Yb�8�z�MO���0��2�������_��-L^A�;q^��,/�0S�dl?_z���g�
�.�Z�M�K4
�m��}}#���ޗ0���@�#�='W�I��iP(��߮}��S�}dM�0�z�+�Z�[���P��5�v|��x�a�A��U�z�ZK"{�Ͷ��{�=�G�&�(p6'\-��(�eQ�m�/,��a���"�aLxV�K?q��0��"�+��_��u?�X�p��c #$���~�~y- ��-,�㋂���s�����H��7ݏ�9��ha���6�ڂ����c~���SGQA�1ǎc�c�6�ؼ���2�H�7�����τ��h4��7?���q�=�8|�6v�޺��c����.��9������uam�>\]�E�僜n"���4M�$�侃��|��ب���l�[��<�/
�ي�u�/�(l}����9�gK4����E�˃jL#��W� /H
R� M��v���:����{�p����TD�]1(H���Ȳ���ԑ[<4uVR��a��҉ʜ^���>��2߶�+?����6���u�s��8���a��J��U�1 ����{:���i�	5��3�6��&�y\SJ�ӊӈ�;߸�g|e9dg����K�}+m��*����>�$1?C�aE@P
���O&;|���Φ�I�؁������A�G���O�1q��ʂ@w�eS�j���M��h��z�[f#2Ń���	!S�n�ҭ\�S�D$�)2ݕo�����ٝ�y�Q�}���"]������x�;�:�W�+�C=q��Ƣ��g��ɕҌI0I���'A��33]������[�c'�+��q��G�x�^x���Qmi�M�PR�
�E��)��~�~���&��i�RX�s�܃W�b��e)���`^��qj���o|z��o���M_;�O�h��iK��s�͖ ��n��g �nb��n%�9�����'�8rE�&1$�!�tX?3���7m`rz���r��`q��ܫ_yu1����s��m�oK&��rby�{�YT����N�I�p�|����g/�Hp���UVz}���$�,�f�Z?u�\|��9ch������3j��רm�R�%c�L��{���b18S���b0�!hCEH�`�������2�&'v�����'���
'F�L9!�#���|A@E��L�1�'Q��|��A`����$�zŤ�IH�T�x~�.��h|�M(
W���`ilz��y�c�X��#��+�,M(��ԐL�3Sq�1!��1���y��m��7�(���
�h}��^P�Q"��L�_�H��M 3��{�&��
t7oŸ^\)l�ADp�I�b-������J]��B%ږ-����$��@�|�H�d��^��+�����ɲIL5��B�M:���C�"�!W���4��
��R+$:o��~҅{P 3�%�:I8u͇���gv����7���ִ�;�����hE���ڔ�`����ô"�L����M5��/��|���4 C�q�\M*MF�T�5^�kM�"*@�E½o���=�c���G\9��<z;_�o W���͠]��22���	�JC�E��M�k���3q�w��Dr+��T&��=E���u�h��r
N�F2�Qy��n�1�y
�g�����[s�0���68����5+0����#���f����3V��dڠw�0�4^�E��}9C�Ѷ�*����K*�Uh�F���W��9�O���o��NZo��2@4l��z�u���Zgd�?��*�+I��C?�5��D|�W��Z�]�fQ�A�ʧ�P&���up����8��F5Y��fARꝗ�Ʉua�J����t[�e��V�*w'�N��V��c�yV��Vv�}�����MK/K�m/.�]��*�x�
DA�R��b��1y�7��	��^U'ņ_�c��&ј�/kq�0��Z�:
�{��>���f0�]�r܆-#�j�����*G��~->��0�a��m��L��f:GW��4��
��6�M�������R}�c����nX����O��&�@z'[��U���w���C'S��'�r��i����>i|҈;��g{��T��?x��=��6ː��Ze4ۖ*jJ���F�Nx�QLj���%,:��,]���r�:��6���k:������f��a�Ў͚uYy��Xy�k!I+�U�
S<SW�k�(mYA��ڕ�7�b�sW��R�-��N�,�HM���a'W=���,KZՉ����ɍ�IG�7��T9�y�U���(�9��z����,�>$�c[Ӈ�4Kx�[��s�@�@71��O��̜�5�9������k"�ԳV�E���H�yB��ݖ�*��?�
T�K��hIEND�B`�liFD$6a10139e-0488-1173-a2a2-eaea0594271arar.png��PNG


IHDR00W��	pHYs��
OiCCPPhotoshop ICC profilexڝSgTS�=���BK���KoR RB���&*!	J�!��Q�EEȠ�����Q,�
��!��������{�kּ�����>�����H3Q5��B������.@�
$p�d!s�#�~<<+"��x��M��0���B�\���t�8K�@z�B�@F���&S�`�cb�P-`'������{[�!�� e�Dh;��V�EX0fK�9�-0IWfH�����0Q��){`�##x��F�W<�+��*x��<�$9E�[-qWW.(�I+6aa�@.�y�2�4�������x����6��_-��"bb��ϫp@�t~�,/��;�m��%�h^�u��f�@����W�p�~<<E���������J�B[a�W}�g�_�W�l�~<�����$�2]�G�����L�ϒ	�b��G�����"�Ib�X*�Qq�D���2�"�B�)�%�d��,�>�5�j>{�-�]c�K'Xt���o��(�h���w��?�G�%�fI�q^D$.Tʳ?�D��*�A�,����`6�B$��BB
d�r`)��B(�Ͱ*`/�@4�Qh��p.�U�=p�a��(��	A�a!ڈb�X#����!�H�$ ɈQ"K�5H1R�T UH�=r9�\F��;�2����G1���Q=��C��7�F��dt1�����r�=�6��Ыhڏ>C�0��3�l0.��B�8,	�c˱"����V����cϱw�E�	6wB aAHXLXN�H� $4�	7	�Q�'"��K�&���b21�XH,#��/{�C�7$�C2'��I��T��F�nR#�,��4H#���dk�9�, +ȅ����3��!�[
�b@q��S�(R�jJ��4�e�2AU��Rݨ�T5�ZB���R�Q��4u�9̓IK�����hh�i��t�ݕN��W���G���w
��Ljg(�gw��L�Ӌ�T071���oUX*�*|��
�J�&�*/T����ުU�U�T��^S}�FU3S�	Ԗ�U��P�SSg�;���g�oT?�~Y��Y�L�OC�Q��_�� c�x,!k
��u�5�&���|v*�����=���9C3J3W�R�f?�q��tN	�(���~���)�)�4L�1e\k����X�H�Q�G�6����E�Y��A�J'\'Gg����S�Sݧ
�M=:��.�k���Dw�n��^��Lo��y��}/�T�m���GX�$��<�5qo</���QC]�@C�a�a�ᄑ��<��F�F�i�\�$�m�mƣ&&!&KM�M�RM��)�;L;L���͢�֙5�=1�2��כ߷`ZxZ,����eI��Z�Yn�Z9Y�XUZ]�F���%ֻ�����N�N���gð�ɶ�����ۮ�m�}agbg�Ů��}�}��=
���Z~s�r:V:ޚΜ�?}���/gX���3��)�i�S��Ggg�s�󈋉K��.�>.���Ƚ�Jt�q]�z�������ۯ�6�i�ܟ�4�)�Y3s���C�Q��?��0k߬~OCO�g��#/c/�W�װ��w��a�>�>r��>�<7�2�Y_�7��ȷ�O�o�_��C#�d�z����%g��A�[��z|!��?:�e����A���AA�����!h�쐭!��Α�i�P~���a�a��~'���W�?�p�X�1�5w��Cs�D�D�Dޛg1O9�-J5*>�.j<�7�4�?�.fY��X�XIlK9.*�6nl�������{�/�]py�����.,:�@L�N8��A*��%�w%�
y��g"/�6ш�C\*N�H*Mz�쑼5y$�3�,幄'���L
Lݛ:��v m2=:�1����qB�!M��g�g�fvˬe����n��/��k���Y-
�B��TZ(�*�geWf�͉�9���+��̳�ې7����ᒶ��KW-X潬j9�<qy�
�+�V�<���*m�O��W��~�&zMk�^�ʂ��k�U
�}����]OX/Yߵa���>������(�x��oʿ�ܔ���Ĺd�f�f���-�[����n
�ڴ
�V��E�/��(ۻ��C���<��e����;?T�T�T�T6��ݵa�n��{��4���[���>ɾ�UUM�f�e�I���?�����m]�Nmq����#�׹���=TR��+�G�����w-
6
U����#pDy��	�
:�v�{���vg/jB��F�S��[b[�O�>����z�G��4<YyJ�T�i��ӓg�ό���}~.��`ۢ�{�c��jo�t��E���;�;�\�t���W�W��:_m�t�<���Oǻ�����\k��z��{f���7���y���՞9=ݽ�zo�����~r'��˻�w'O�_�@�A�C݇�?[�����j�w����G�������C���ˆ
��8>99�?r��C�d�&����ˮ/~�����јѡ�򗓿m|�����������x31^�V��w�w��O�| (�h���SЧ�������c3-�gAMA��|�Q� cHRMz%������u0�`:�o�_�F
�IDATxڼ�y�U�?�3g�w�Z[���F�(b��j\c"	H
jL��!j4�`\p��`b�Ԁ\��Uk��`%P��w�サ�9����{[^[q�ɽw�3����U���߻���(��Rܛ_�/�"
��x��SN�b��Ν�fbe�IS�u���hOb�t��,RU�l��絒�~��u�dJ8�������x:8���<��=V�@P��+�q?E
)�1ig�V�;���6{x|vfJ�g_) t���)[O=�g���ͱv�V|P:+};��6�X������򀪞��?ʴ)�#"�g�Z^Ś�ejk�u��[�T ��l+�����;c�&��q)B�>����8�hp�B$�ۊ�����s��W����j%ʘ�Εg�~�wq>��k����yG�9��x���b���l���W/�x��ޗ�s��mW^�s�s.?�=3'�q�p�.��O]Z�/���=���}t�yz���OI"!� 0��������url����_�m?�E�W]�Z~�����~�{��ǿ�E�y7;����
E�4;�Z� �"R��7�󾻭]����	[�|��k<���~Ǿ�{��s��/fr~�T>�����o��\7`�,��4��DZ"��`#��?����.-Ye��}�ɒm.��;��s?.���K�ʹ�=���%s�"4�P�K��GT�ȳFlѱ��\�#��ظ�:Р���4XJ�="�;�rY�}��Cdc�I$�AqZH���"c1S�3Kq�l��ܪG
�B��!B��?�`'~������V���>u#�&ʱb��<��8�$�2o$��o'���}2�C��������lYmm4������c����X^�x�0��e�}�V�AI��H����J�������ε���:���Cs~0&�D��V�Q�$�@d�aj�en����G?�-s�Тy�hǗ��Kׯ#�J�'�,Ye�u.���4J��3߸�^���e�&pƖ�H]��@?d\�d�-��'��^�,��o��sW�U+��O������	�\�J	�:>u�uc�6k6������O����G��kv��Qd����	&�Ƙ���=9A��X>�ٝ>~���yM��rz���8m�]W�`�_5Z��p�x�PLl��� I"����4����VVVX�ty��C��5�f���8E6��v��lhr���u5�'��{Eџ{��1��-�F8k�@���|��7T�(.8{|�}����^����Ĭ�u���Q��p�]rE��[uq*�0"L�ɔ�Dr��Y9hՠk�$��'1x�=$ɪ[J͓u	�\��VJ�Fϯm�j����8"i����ZYU��Zf_cL���#K���9cK��P.�6��"Z�H嵢L�pD'$*�IL�>�D6Bk��I�A�"�wi�(�`�KS_]�2C����БJA@��K&|�%�3�T�z$�hE=���4`c�D��Ѭ��2Od���5�J�6j��8��"*�i�A��$��	��v	��ц����ϭ�j��jq@	Ar��p�6Y'4�4S!@My]��/	8c�"7�Ś��|��R"(e�+�?KR�����hE�,��Q5x���jlW�r��\���6���'g��	�A�٧�{�1N�&sn��O���u�I���0���r͖�n��/�:<rӇ8t�5�g��O�\�<P�"7��G=G�@��3��W?3�g��-��
��=�߳7��T�/	�~�u��g�!U���8��<��P�<e�z1X�T��xuY�&��Ű�����E��@QՂ|2dI������-fס9�y�K��씠�i4�9)Ok��("��Ӣγs�t��Zb_��^vpE�W�*eY�y�1����/061�_��/l�l�H8����a���rIƔ�\�J�X��P=�VU"k�&^�o1=�>!z�>!(����^��:�F��Q��c h��Nӳ�CB����F'��~�H-4�j4���ޟ�(��jW�5��P�
[&�z|z���]�o�B{fb4yvz�f.��*5��J��,�IN��� �ڿ8$��	�ֲ2b@��"FJ����%U��d�U�@C�#b 
�L��N	�^;?�el��Rph&�Q�z+Ufk�&UUL-(��X�l�1B�7�^�t:5Gg��.��f��bߡ!B��Q�iɮ"��.jA��*0�n�|9�M���H.��}����i�0�iK��b�1ΐ:�hɫ6��4�=o�C��m]7\��ş�;�|�e�������oe��|(Pd�QAp�Kͷ�U�#z T���jvn���W3w�g�U��v��u
�3��x%˰axH��)�䁺�A^G�p��H$i�5�w���i�s?��G�՗х#c��>h(�n��`�+�Nϥ~�~;<�ц�!u�R�}�͵���M�ǭ������q�/8�t;)'z�Q��{��q�)��鬣�s�'~�u�����������=�jF�G;�R��c�y�¿�|��5
�J��{�(�+g�>K#$�a�Lr��l�{D8�D����������ͳԅ��z�!"/����[5ڜ�)�=�R���Bj�뽢*�{˩���y�!0&��?g�5��9�N<��TU���b�����k�lFIEND�B`��liFD$619aeb1b-0488-1173-a2a2-eaea0594271atar_bz.pngO�PNG


IHDR00W��	pHYs��
OiCCPPhotoshop ICC profilexڝSgTS�=���BK���KoR RB���&*!	J�!��Q�EEȠ�����Q,�
��!��������{�kּ�����>�����H3Q5��B������.@�
$p�d!s�#�~<<+"��x��M��0���B�\���t�8K�@z�B�@F���&S�`�cb�P-`'������{[�!�� e�Dh;��V�EX0fK�9�-0IWfH�����0Q��){`�##x��F�W<�+��*x��<�$9E�[-qWW.(�I+6aa�@.�y�2�4�������x����6��_-��"bb��ϫp@�t~�,/��;�m��%�h^�u��f�@����W�p�~<<E���������J�B[a�W}�g�_�W�l�~<�����$�2]�G�����L�ϒ	�b��G�����"�Ib�X*�Qq�D���2�"�B�)�%�d��,�>�5�j>{�-�]c�K'Xt���o��(�h���w��?�G�%�fI�q^D$.Tʳ?�D��*�A�,����`6�B$��BB
d�r`)��B(�Ͱ*`/�@4�Qh��p.�U�=p�a��(��	A�a!ڈb�X#����!�H�$ ɈQ"K�5H1R�T UH�=r9�\F��;�2����G1���Q=��C��7�F��dt1�����r�=�6��Ыhڏ>C�0��3�l0.��B�8,	�c˱"����V����cϱw�E�	6wB aAHXLXN�H� $4�	7	�Q�'"��K�&���b21�XH,#��/{�C�7$�C2'��I��T��F�nR#�,��4H#���dk�9�, +ȅ����3��!�[
�b@q��S�(R�jJ��4�e�2AU��Rݨ�T5�ZB���R�Q��4u�9̓IK�����hh�i��t�ݕN��W���G���w
��Ljg(�gw��L�Ӌ�T071���oUX*�*|��
�J�&�*/T����ުU�U�T��^S}�FU3S�	Ԗ�U��P�SSg�;���g�oT?�~Y��Y�L�OC�Q��_�� c�x,!k
��u�5�&���|v*�����=���9C3J3W�R�f?�q��tN	�(���~���)�)�4L�1e\k����X�H�Q�G�6����E�Y��A�J'\'Gg����S�Sݧ
�M=:��.�k���Dw�n��^��Lo��y��}/�T�m���GX�$��<�5qo</���QC]�@C�a�a�ᄑ��<��F�F�i�\�$�m�mƣ&&!&KM�M�RM��)�;L;L���͢�֙5�=1�2��כ߷`ZxZ,����eI��Z�Yn�Z9Y�XUZ]�F���%ֻ�����N�N���gð�ɶ�����ۮ�m�}agbg�Ů��}�}��=
���Z~s�r:V:ޚΜ�?}���/gX���3��)�i�S��Ggg�s�󈋉K��.�>.���Ƚ�Jt�q]�z�������ۯ�6�i�ܟ�4�)�Y3s���C�Q��?��0k߬~OCO�g��#/c/�W�װ��w��a�>�>r��>�<7�2�Y_�7��ȷ�O�o�_��C#�d�z����%g��A�[��z|!��?:�e����A���AA�����!h�쐭!��Α�i�P~���a�a��~'���W�?�p�X�1�5w��Cs�D�D�Dޛg1O9�-J5*>�.j<�7�4�?�.fY��X�XIlK9.*�6nl�������{�/�]py�����.,:�@L�N8��A*��%�w%�
y��g"/�6ш�C\*N�H*Mz�쑼5y$�3�,幄'���L
Lݛ:��v m2=:�1����qB�!M��g�g�fvˬe����n��/��k���Y-
�B��TZ(�*�geWf�͉�9���+��̳�ې7����ᒶ��KW-X潬j9�<qy�
�+�V�<���*m�O��W��~�&zMk�^�ʂ��k�U
�}����]OX/Yߵa���>������(�x��oʿ�ܔ���Ĺd�f�f���-�[����n
�ڴ
�V��E�/��(ۻ��C���<��e����;?T�T�T�T6��ݵa�n��{��4���[���>ɾ�UUM�f�e�I���?�����m]�Nmq����#�׹���=TR��+�G�����w-
6
U����#pDy��	�
:�v�{���vg/jB��F�S��[b[�O�>����z�G��4<YyJ�T�i��ӓg�ό���}~.��`ۢ�{�c��jo�t��E���;�;�\�t���W�W��:_m�t�<���Oǻ�����\k��z��{f���7���y���՞9=ݽ�zo�����~r'��˻�w'O�_�@�A�C݇�?[�����j�w����G�������C���ˆ
��8>99�?r��C�d�&����ˮ/~�����јѡ�򗓿m|�����������x31^�V��w�w��O�| (�h���SЧ�������c3-�gAMA��|�Q� cHRMz%������u0�`:�o�_�FjIDATxڼ�{�]Wu�k�ǝ���xl�����S�TԮ\$£%X24H0j%�V���Z�Q��6rx�R�6m� !
	�UKh�*	E���!$�5c����{������k{l�n�螻�>笵׷��8���m|��

*��( Ž�|��X�������Z6l��Џ�Yy񪉥MMeǏ׵�e�=�1�ӈ��HUټn���J���T	JX���s��<����d�[�7m~�;���W�k=K�y�E�
����$2�;�:[��3+��|�+���K_۰咝��Fw�JVoۂ�Jg���B3�&K���U���� ����l�J��������:��5����	�eկlA�ıA�^�d,%n�+xrᙝ�m�h��s�D�2��p��+�G�ǻ?~m9?������V�-j-���[�k�{��&���R�Y����o��\��Y�w�<���5������Џ��:��Y�u8����Q+����o�E�B�9��ćP���z=���~ݛ�np�\��q������eT�Z�Λ�a|��XWn��܏s����-*B	"�8�"��h���x�ٷ8�
x��;y�m���7�ɻ��}|���8�����o�����w�� �y\fy�_�#_z�����?� ��w���������pʲpx��"AE<dq������~�k:�
�AX��r�#��5L�N�
:�PU��k���s�A�������s�޶��<����l��|C�zz���@K�R����W{�u��ˋ�RT��M׿�{?uwi��|�\s�ٗ�j���y^uɚ�uD�G���'��%�����x��k��_<���-��u�q���_Y���XwÞ7�L��y���A�!2�1���4bv�AI~@k,ajvũ��9���\a���������@j��ڻ�=��o��]{w�k�n��xG���ݠp�G�ͮ����`�+��R
�䒤Q�F	���vʽ�y����匑����S����F���|�C�m�
o����N�9�Ȏ7o���)���)
X}�d^��<��bG��?�#-�14���0QD{��8�t�CǍy��j�|�����؉����_��A]�z��)�k�B�
�u.���4Ro��ߺ�^���E��s��Ȭ�9O���bĒ����;N�w���/���n��V�w����x�~n�B&Ts�+%T�,�	���mV�[K�����/�x�N�������Ȑ�)�SLN��rv��	:=���Ρ�'On���oʖ�N��Z^�i%][�`�_�Y x΅l����	�4���am`��A#�����X�ty����Ukf���� �~�Q�Y�����2T��(�5���?��1c�8���b ��0�!XCE��`�兟�ud���>7���NYB��*��+ZȭU���#`bLP&�A$�<*{
P���c!Mb���ä�KJ̓u	�\�jN+%�M��2Y5(-Bd�(�H[	qc[!�mZ-�1&D�B�(�ߏ�3c���\
m<Z�H��\��\!NRR�4!��9�8B��D��†�Dg�`�(�x��KQ_]CDU���CGr(y��.A�`%\�
U�D�(�G�8��ꉓ�L�DQ�(
�����JU6j�Z;�f��*�inA��iB�����%�&[�$��?ߵV{�,P�J��&����:�A�A�5�_p`�"6�Ś��x��T��,h��[�j.���|@�ͣ��Z-���Kv��]
��{r�x�[���_.��ȃ��/����`�]JM�|���>E�]���N"�u�!�M��7��ƭ�|*��{��q;�՗��8W
u�V(���G=F�@��3���~:‡�~�:�G>�����r�H��� 
篒�Qx���궗�a�#Kq"|��~(:ד���r0�/L�[�
՜��_�S�]�z )�(�Z�O@�Tʊ��(��'V��al^��!^��h�9)��bcH��$)�����L7vXK�k���Zkt�J��h�b����z���y�&���o�$� �$�p��+�<��!B��%SRr+�b��ButwZU�b����x�鼱u�����b{��^�rhTo:��>���*�8M�L	������}�����‰Sx�;M?*����'#�2ەz�%#�–ɵ��`�~W�Χ�^11�<;=�P�NՋ�Uj\_�&��)"�o�j��V�G��Z<>_�B�8fi�:�n7CL����)4S�*��N����܋G��/�AfWO	�^=;`el��iB�ol����1�U���"M�����S9q��^1F��+�N�f��Q�BO5t2��5j5��OKv�9w�rT���y�k��j#λ�v	�7|��>���L��2j�6�mH��j��T�+�-j��|'���˺�}��X�sVEċG���6p�q����M�"r�r��L5��V�_Nk_9[�U3+�*k�A����WZ�h�$���3�b|��O.���8n8l�D:��1��u����@��l�{p�O�+J��&�[`{�o�A珍������d��ÕA�.��*=������6���j��;0ox���s/���s��q�8��t;:�Q��G{k�~�e���3�ڇ�5���g|�3?8�c�k�%�,�ie�i��i-�2�6�.�����M�QH�:�؃��r9O�BX�!M�V�������Z�JL�-������C\�51�d'�E����O�tA����G_���m�q���Z��V�U���ZQ�߽�+_�"o�l����tM�Oh��Wv,�����^!H=��zIEND�B`��liFD$60c01c09-0488-1173-a2a2-eaea0594271atar_gz.pngv�PNG


IHDR00W��	pHYs��
OiCCPPhotoshop ICC profilexڝSgTS�=���BK���KoR RB���&*!	J�!��Q�EEȠ�����Q,�
��!��������{�kּ�����>�����H3Q5��B������.@�
$p�d!s�#�~<<+"��x��M��0���B�\���t�8K�@z�B�@F���&S�`�cb�P-`'������{[�!�� e�Dh;��V�EX0fK�9�-0IWfH�����0Q��){`�##x��F�W<�+��*x��<�$9E�[-qWW.(�I+6aa�@.�y�2�4�������x����6��_-��"bb��ϫp@�t~�,/��;�m��%�h^�u��f�@����W�p�~<<E���������J�B[a�W}�g�_�W�l�~<�����$�2]�G�����L�ϒ	�b��G�����"�Ib�X*�Qq�D���2�"�B�)�%�d��,�>�5�j>{�-�]c�K'Xt���o��(�h���w��?�G�%�fI�q^D$.Tʳ?�D��*�A�,����`6�B$��BB
d�r`)��B(�Ͱ*`/�@4�Qh��p.�U�=p�a��(��	A�a!ڈb�X#����!�H�$ ɈQ"K�5H1R�T UH�=r9�\F��;�2����G1���Q=��C��7�F��dt1�����r�=�6��Ыhڏ>C�0��3�l0.��B�8,	�c˱"����V����cϱw�E�	6wB aAHXLXN�H� $4�	7	�Q�'"��K�&���b21�XH,#��/{�C�7$�C2'��I��T��F�nR#�,��4H#���dk�9�, +ȅ����3��!�[
�b@q��S�(R�jJ��4�e�2AU��Rݨ�T5�ZB���R�Q��4u�9̓IK�����hh�i��t�ݕN��W���G���w
��Ljg(�gw��L�Ӌ�T071���oUX*�*|��
�J�&�*/T����ުU�U�T��^S}�FU3S�	Ԗ�U��P�SSg�;���g�oT?�~Y��Y�L�OC�Q��_�� c�x,!k
��u�5�&���|v*�����=���9C3J3W�R�f?�q��tN	�(���~���)�)�4L�1e\k����X�H�Q�G�6����E�Y��A�J'\'Gg����S�Sݧ
�M=:��.�k���Dw�n��^��Lo��y��}/�T�m���GX�$��<�5qo</���QC]�@C�a�a�ᄑ��<��F�F�i�\�$�m�mƣ&&!&KM�M�RM��)�;L;L���͢�֙5�=1�2��כ߷`ZxZ,����eI��Z�Yn�Z9Y�XUZ]�F���%ֻ�����N�N���gð�ɶ�����ۮ�m�}agbg�Ů��}�}��=
���Z~s�r:V:ޚΜ�?}���/gX���3��)�i�S��Ggg�s�󈋉K��.�>.���Ƚ�Jt�q]�z�������ۯ�6�i�ܟ�4�)�Y3s���C�Q��?��0k߬~OCO�g��#/c/�W�װ��w��a�>�>r��>�<7�2�Y_�7��ȷ�O�o�_��C#�d�z����%g��A�[��z|!��?:�e����A���AA�����!h�쐭!��Α�i�P~���a�a��~'���W�?�p�X�1�5w��Cs�D�D�Dޛg1O9�-J5*>�.j<�7�4�?�.fY��X�XIlK9.*�6nl�������{�/�]py�����.,:�@L�N8��A*��%�w%�
y��g"/�6ш�C\*N�H*Mz�쑼5y$�3�,幄'���L
Lݛ:��v m2=:�1����qB�!M��g�g�fvˬe����n��/��k���Y-
�B��TZ(�*�geWf�͉�9���+��̳�ې7����ᒶ��KW-X潬j9�<qy�
�+�V�<���*m�O��W��~�&zMk�^�ʂ��k�U
�}����]OX/Yߵa���>������(�x��oʿ�ܔ���Ĺd�f�f���-�[����n
�ڴ
�V��E�/��(ۻ��C���<��e����;?T�T�T�T6��ݵa�n��{��4���[���>ɾ�UUM�f�e�I���?�����m]�Nmq����#�׹���=TR��+�G�����w-
6
U����#pDy��	�
:�v�{���vg/jB��F�S��[b[�O�>����z�G��4<YyJ�T�i��ӓg�ό���}~.��`ۢ�{�c��jo�t��E���;�;�\�t���W�W��:_m�t�<���Oǻ�����\k��z��{f���7���y���՞9=ݽ�zo�����~r'��˻�w'O�_�@�A�C݇�?[�����j�w����G�������C���ˆ
��8>99�?r��C�d�&����ˮ/~�����јѡ�򗓿m|�����������x31^�V��w�w��O�| (�h���SЧ�������c3-�gAMA��|�Q� cHRMz%������u0�`:�o�_�F�IDATxڴ�{�]�u�k�s�;ƱI�j4�6��QJ1V��x�Em���*UA*A��JH�LH		R9E$MHSJ#H�(
m��*!�P��b�ž�����{����s�3�aKG�Ι}�Y�o}�EUy����*(�
"�����W��{�z�W�Uz��c��KSkV�,l|�Xz�z�jFZ��Y�x9�T�MkG�:-嬮��Cm�*A	��;=N�!�<9��{��M��\ײ�t�g!=�^!ŠqB�^��D�{'\{s|zxrbL�幒Ch����K.���hu��X���W�=fgۘ��P���l������^���D
�H�Y�W�W��f�ʞ�� +~�OT �H������/ξt�7X{T�I�=o�굻�8��C�E"���_{����{���k��D��Z������;k��W��R�_��z���Xg�]��gSb1B�ll��g�d��r�
8���Fv�مs��w��{v�s�.��Xk����L��b�;p�1y�4��~v���Ě�b��=���������O�b����g���F$4"HLd �ny���Urvr���~���#��Qv|�&�������?�������<W�p%_��'�=�g�\����v��8�pΑ����iF��xH���~��8^���D\��uα��g���0:=V�CU�ξor�� !X�u��>�p��³�uōW��#�����Uū��K�4E(!���_���/�8��<�KE�y~�O�/�H���ܣ�]!��{D�]�� �y�B��U��DD�e���e@)=�e�$F�F���^�a�e�@n9�=3�x�~�� |�%�ȁ�8����;>z�>�A�����_��޻�j���}�XwA��Cdc�=�H�M�~3"��͡��鉹��>yCT5p��-�ʷ?�;��f��vO?���@��[��s��|��}|���9z���n����(�<p+�n���
&ʰbQ,��I&I#
�hDB�p������kLo�3f�O���,�6�&�?���c�?<�7N!��Wy�՛��k3��i�s�l��K�y%uJ�!u��C�)�WR�Ow��˷ǽ�s�T-t�t.	j)��+�g��1&�h
7q<6 �56�4_y����w}�u�]�uzr\k8�����C�N�^�$�U(�C�"��5j��w�eWo���0sr���\��m��㜧�Ox1bI�j�	��g�3���M��{�����uk��e��eB5��TB���\��o��b����:�f8|��vg�N�oLd�"C�h0>6���S��FGhw-�ۇҟ��q�5�M�UN���N޹q���	pq�_6�� x�YT��LN��hD�:]�
�d0Hkaa��v�ï���$�X5���zY����̆&3�
*J_W�y"���W����K���$&�#ll���>�1�!xCE��`��՟�y|����{��<�0�e����eT)-��L�\n-�8E�c�2q"�峀���#�B#�n$�积��XvK�Y�. �IX��R���ٽ�MV
J�!J"̈́�c����{-���(W8��"��}hn�ʤК�!�5w��QP��˔� �qҠ�B�HH�ť�(�P 6Q��`1��\i�Hq2IϦ����!���C	͠#���h� |p��&��"�QD�q��'1�����'
����5�J�6j��8��<J�i�A�č�8i0�j�]<�]Dr�3�5[�g�JPD�L0��u��5:
*x<�)�K���s#���aXϗ�#��9MV>R�р�JHm��Y�ʨ�
<}�n��@�xO&P��߶`�7��Ҽ�9���_x1��3�ڋ�Ȝ�>�S��zIUɽ��-�<��7l~�gm^y�/8���^���\U�,P�"�g�G5G@�����5‡�n�Z�o~�}�EN=�ADJ��Y�h���@HU�9tk�P�!�W�s�,Y*s���p�f9>�s3sL�Z��(�(���O@��ʊ�Ȫm�SS�u���p���2~�Wl�1$QD��W�Zdz��k��Zf��+��VݪR�%��<�^�jz���!����8I�6I$\����*?��U�PZ� c
J�a%��UR��N�*Ql��\n2>�:/���+�����Z�U:�j��%�
J���c���}����>�V��j��?�k�����
��^�q��+�'
�ڕj�%�ĖɴaѠ��|
�������b��a��T�-�T��,MB��D��|�`���N�	5r�jB�8fa�>�N'E�����)�K�2���N˜��,�Ā��A�W��	�Z9���Њ�%R���A��;�*��H���*�}A���W���s%�nWP;h_���IF�ܾ!B��V�i��"���kA��@��}��v�
8���h�;�}vo=5���eq�T�Z�!U&�ВS�%�x�94�y3��:~*k�"��}L�1:C��8���O0�����L��
��=(��U?�-3�,�_[f�ɩ��b�o�ej�ǠY��vN�� ��z!dX�}GYZ=O�Ey�*� ���?��%��k���/�K��/!n����~t�1`S���L���yq�
+�NϦ��q��Gkj��Ku�U�1�~��_�{u�nι�Ʃp8��S�wŃ�?�uW���#l����t�����U���~x���w�+� �e�i�Βp�e�y��~�@�9*R��%�b�x�\�\H#4Ê��Y����3sVb"oq&Ƹ���z���1;).�f�/���yyCD~�/�8r�l"�>�U��{*�.ZW��W�W{EU�d�EW�IM�P1^�ˁ����)o�U�~3�בV���IEND�B`��liFD$6ef1e0ad-047e-1173-a2a2-eaea0594271afolder_closed.png.�PNG


IHDR00W��	pHYs��
OiCCPPhotoshop ICC profilexڝSgTS�=���BK���KoR RB���&*!	J�!��Q�EEȠ�����Q,�
��!��������{�kּ�����>�����H3Q5��B������.@�
$p�d!s�#�~<<+"��x��M��0���B�\���t�8K�@z�B�@F���&S�`�cb�P-`'������{[�!�� e�Dh;��V�EX0fK�9�-0IWfH�����0Q��){`�##x��F�W<�+��*x��<�$9E�[-qWW.(�I+6aa�@.�y�2�4�������x����6��_-��"bb��ϫp@�t~�,/��;�m��%�h^�u��f�@����W�p�~<<E���������J�B[a�W}�g�_�W�l�~<�����$�2]�G�����L�ϒ	�b��G�����"�Ib�X*�Qq�D���2�"�B�)�%�d��,�>�5�j>{�-�]c�K'Xt���o��(�h���w��?�G�%�fI�q^D$.Tʳ?�D��*�A�,����`6�B$��BB
d�r`)��B(�Ͱ*`/�@4�Qh��p.�U�=p�a��(��	A�a!ڈb�X#����!�H�$ ɈQ"K�5H1R�T UH�=r9�\F��;�2����G1���Q=��C��7�F��dt1�����r�=�6��Ыhڏ>C�0��3�l0.��B�8,	�c˱"����V����cϱw�E�	6wB aAHXLXN�H� $4�	7	�Q�'"��K�&���b21�XH,#��/{�C�7$�C2'��I��T��F�nR#�,��4H#���dk�9�, +ȅ����3��!�[
�b@q��S�(R�jJ��4�e�2AU��Rݨ�T5�ZB���R�Q��4u�9̓IK�����hh�i��t�ݕN��W���G���w
��Ljg(�gw��L�Ӌ�T071���oUX*�*|��
�J�&�*/T����ުU�U�T��^S}�FU3S�	Ԗ�U��P�SSg�;���g�oT?�~Y��Y�L�OC�Q��_�� c�x,!k
��u�5�&���|v*�����=���9C3J3W�R�f?�q��tN	�(���~���)�)�4L�1e\k����X�H�Q�G�6����E�Y��A�J'\'Gg����S�Sݧ
�M=:��.�k���Dw�n��^��Lo��y��}/�T�m���GX�$��<�5qo</���QC]�@C�a�a�ᄑ��<��F�F�i�\�$�m�mƣ&&!&KM�M�RM��)�;L;L���͢�֙5�=1�2��כ߷`ZxZ,����eI��Z�Yn�Z9Y�XUZ]�F���%ֻ�����N�N���gð�ɶ�����ۮ�m�}agbg�Ů��}�}��=
���Z~s�r:V:ޚΜ�?}���/gX���3��)�i�S��Ggg�s�󈋉K��.�>.���Ƚ�Jt�q]�z�������ۯ�6�i�ܟ�4�)�Y3s���C�Q��?��0k߬~OCO�g��#/c/�W�װ��w��a�>�>r��>�<7�2�Y_�7��ȷ�O�o�_��C#�d�z����%g��A�[��z|!��?:�e����A���AA�����!h�쐭!��Α�i�P~���a�a��~'���W�?�p�X�1�5w��Cs�D�D�Dޛg1O9�-J5*>�.j<�7�4�?�.fY��X�XIlK9.*�6nl�������{�/�]py�����.,:�@L�N8��A*��%�w%�
y��g"/�6ш�C\*N�H*Mz�쑼5y$�3�,幄'���L
Lݛ:��v m2=:�1����qB�!M��g�g�fvˬe����n��/��k���Y-
�B��TZ(�*�geWf�͉�9���+��̳�ې7����ᒶ��KW-X潬j9�<qy�
�+�V�<���*m�O��W��~�&zMk�^�ʂ��k�U
�}����]OX/Yߵa���>������(�x��oʿ�ܔ���Ĺd�f�f���-�[����n
�ڴ
�V��E�/��(ۻ��C���<��e����;?T�T�T�T6��ݵa�n��{��4���[���>ɾ�UUM�f�e�I���?�����m]�Nmq����#�׹���=TR��+�G�����w-
6
U����#pDy��	�
:�v�{���vg/jB��F�S��[b[�O�>����z�G��4<YyJ�T�i��ӓg�ό���}~.��`ۢ�{�c��jo�t��E���;�;�\�t���W�W��:_m�t�<���Oǻ�����\k��z��{f���7���y���՞9=ݽ�zo�����~r'��˻�w'O�_�@�A�C݇�?[�����j�w����G�������C���ˆ
��8>99�?r��C�d�&����ˮ/~�����јѡ�򗓿m|�����������x31^�V��w�w��O�| (�h���SЧ�������c3-�gAMA��|�Q� cHRMz%������u0�`:�o�_�FIIDATx��YI�]E=��2v'm�F�1$f!��;A�HЕA�.t��E����>�E0��Y8�+э�$.:1�tFMw��U���1qH���O���{ާ$<ȏ�c�
�+V�X��<�:}���ӛ�<��?���ԍ>1��V�>7T`� �I�ĴJ�h�A���u��ݧ�I���>ܸ>w�@�N��mS�/Vݓ9~���ީb��1wS ��M�-�ir�Z�2#��}x'�?�k���c8���>8y��y�s��h6kw4��0ѸzWo6�%n,�̾|0嗹֓\��_(P*_K��ށ=6��M�ng���yv�sq�09�����w��=����=����aۈ��z ���W��!�U0(a�z
��F��e����Qdݺ�A����'>��wŶ�^t�J0EH+*��� �h9x�~]�K��k꾹�3f-�6��K�Uh���92�Ha̜\R��o8�@:~�����g?,v���g6E��
7���%���bo�wo�k
	@�	�@A�{݇\���rbnaF�̱�h�`nt`aځ"

&7����ˡ��-l�T��Z'R^Z~�� ��0/���y�6'��Hֻ-5'���(�¤�e��E)L�ɤ/�J�1�H��\	��+�﯌Ck744�[d2!�	�5!G�|QC�X�z����5"��>�ƶ`rb��+V�ms��	��:R-��dGçb��/w��
f}(4�k��y�� LS��������O�k/��U�Z��A��z�.�4�a\$e։�>P���T�1FȔ���I"��UA�̇���~�!ں~���]��M�OH�M�M
\�r��ɢ�z*(g]EE��1�B����jvӤH�%�B�:�,Ԇ�n��âRF3�b�T͠k��s����׶�����S�n��\PU�JQ����Q=���2 �Y ��,�캲�і�hT�\M�ɦ�[R�H7�C(��<�)�vI���c�}j	d�U�cwE��R!$yA�~XBcu<�xlۤN]��F�V5���D*8�R��V�vת#��Q�4��J0�S_���.�2̶��A��`ڨ�6f)�l�s����(P	�F7�J
N�v�^�-�	�z!�_�T�ы*�x�")�k9f 7��di�sl���#L[t�Ay�A��I����0>�lZ�����`�^�
�6�祿�c�oZ��xYa�f�2P��'w
"[-D�����p����Em7�qqn��7����.[�[�d��W�%�Y��]v����N���ck/���T�*�I�4��?Q�����N�;U���l�3
�[R��Ge�l�B
�����va$?���A����i���2�)��:x��S��Zy�ȫ������E�(vg�Ѵ��Zma~�����U�S��ǒ���1�62�k�����5�X73s_�p��?0�j���w#r-���_x�'��|�~�奾t�쭫�;��k�J:��F�0���;&����Na�
�{;��@E��IEND�B`�liFD$63b0519e-047e-1173-a2a2-eaea0594271aunknown.png��PNG


IHDR00W��	pHYs��
OiCCPPhotoshop ICC profilexڝSgTS�=���BK���KoR RB���&*!	J�!��Q�EEȠ�����Q,�
��!��������{�kּ�����>�����H3Q5��B������.@�
$p�d!s�#�~<<+"��x��M��0���B�\���t�8K�@z�B�@F���&S�`�cb�P-`'������{[�!�� e�Dh;��V�EX0fK�9�-0IWfH�����0Q��){`�##x��F�W<�+��*x��<�$9E�[-qWW.(�I+6aa�@.�y�2�4�������x����6��_-��"bb��ϫp@�t~�,/��;�m��%�h^�u��f�@����W�p�~<<E���������J�B[a�W}�g�_�W�l�~<�����$�2]�G�����L�ϒ	�b��G�����"�Ib�X*�Qq�D���2�"�B�)�%�d��,�>�5�j>{�-�]c�K'Xt���o��(�h���w��?�G�%�fI�q^D$.Tʳ?�D��*�A�,����`6�B$��BB
d�r`)��B(�Ͱ*`/�@4�Qh��p.�U�=p�a��(��	A�a!ڈb�X#����!�H�$ ɈQ"K�5H1R�T UH�=r9�\F��;�2����G1���Q=��C��7�F��dt1�����r�=�6��Ыhڏ>C�0��3�l0.��B�8,	�c˱"����V����cϱw�E�	6wB aAHXLXN�H� $4�	7	�Q�'"��K�&���b21�XH,#��/{�C�7$�C2'��I��T��F�nR#�,��4H#���dk�9�, +ȅ����3��!�[
�b@q��S�(R�jJ��4�e�2AU��Rݨ�T5�ZB���R�Q��4u�9̓IK�����hh�i��t�ݕN��W���G���w
��Ljg(�gw��L�Ӌ�T071���oUX*�*|��
�J�&�*/T����ުU�U�T��^S}�FU3S�	Ԗ�U��P�SSg�;���g�oT?�~Y��Y�L�OC�Q��_�� c�x,!k
��u�5�&���|v*�����=���9C3J3W�R�f?�q��tN	�(���~���)�)�4L�1e\k����X�H�Q�G�6����E�Y��A�J'\'Gg����S�Sݧ
�M=:��.�k���Dw�n��^��Lo��y��}/�T�m���GX�$��<�5qo</���QC]�@C�a�a�ᄑ��<��F�F�i�\�$�m�mƣ&&!&KM�M�RM��)�;L;L���͢�֙5�=1�2��כ߷`ZxZ,����eI��Z�Yn�Z9Y�XUZ]�F���%ֻ�����N�N���gð�ɶ�����ۮ�m�}agbg�Ů��}�}��=
���Z~s�r:V:ޚΜ�?}���/gX���3��)�i�S��Ggg�s�󈋉K��.�>.���Ƚ�Jt�q]�z�������ۯ�6�i�ܟ�4�)�Y3s���C�Q��?��0k߬~OCO�g��#/c/�W�װ��w��a�>�>r��>�<7�2�Y_�7��ȷ�O�o�_��C#�d�z����%g��A�[��z|!��?:�e����A���AA�����!h�쐭!��Α�i�P~���a�a��~'���W�?�p�X�1�5w��Cs�D�D�Dޛg1O9�-J5*>�.j<�7�4�?�.fY��X�XIlK9.*�6nl�������{�/�]py�����.,:�@L�N8��A*��%�w%�
y��g"/�6ш�C\*N�H*Mz�쑼5y$�3�,幄'���L
Lݛ:��v m2=:�1����qB�!M��g�g�fvˬe����n��/��k���Y-
�B��TZ(�*�geWf�͉�9���+��̳�ې7����ᒶ��KW-X潬j9�<qy�
�+�V�<���*m�O��W��~�&zMk�^�ʂ��k�U
�}����]OX/Yߵa���>������(�x��oʿ�ܔ���Ĺd�f�f���-�[����n
�ڴ
�V��E�/��(ۻ��C���<��e����;?T�T�T�T6��ݵa�n��{��4���[���>ɾ�UUM�f�e�I���?�����m]�Nmq����#�׹���=TR��+�G�����w-
6
U����#pDy��	�
:�v�{���vg/jB��F�S��[b[�O�>����z�G��4<YyJ�T�i��ӓg�ό���}~.��`ۢ�{�c��jo�t��E���;�;�\�t���W�W��:_m�t�<���Oǻ�����\k��z��{f���7���y���՞9=ݽ�zo�����~r'��˻�w'O�_�@�A�C݇�?[�����j�w����G�������C���ˆ
��8>99�?r��C�d�&����ˮ/~�����јѡ�򗓿m|�����������x31^�V��w�w��O�| (�h���SЧ�������c3-�gAMA��|�Q� cHRMz%������u0�`:�o�_�F�IDATx�̚ˏW���[�=�=���q��)�H@�Y �	���b��/ �؁ر�"A�`"�@"
�b�G�b�x�����tW�=,��֭�tAIIW�TW��w���sGT��:~{uWAAP��nu=>��E��)�R�� gcc�^��ȉ#���.e������,1��7�M����
m쌏��кO�҉\�?��y;X�w?Y�9����39�U9�={١߃"x����l�^b�_���ϻ�+Kz��Δ0�ehu�YZ[����?�'��s�~�H��|�aR��m�w��Y3��-���^�X��-H��QT=* x�3�@6�0�+��{ùu��d���E7Y�S�*Qh䭯~�UP�^ȵ@}��9V��^�_���䱋�;��6|��	��3�x�hQPxO^�QN�yFj�	�l/}��~��81#�:�ҩ�n�&�F^��QQ��s�qFj��B"`�g���o.|gV8�YiT��fF��P�j�½�<�^)��,+��GczV���,j�^�|�K�81�څ��W|%O\/�"ԏ*^=�q�5DNHp�^z��Kg�'�ڢKU	O�x�n�t6E1�QS�d�+`d҉$q���?�{��މ�o�Ԅ�R�񊊔T� �����6w�v�y��{�� �V�XkH��y%�г �s"����V�M�l�����nl4N��*�"J�s�ڥ����j�"������p�Gj�����r��&�)?��sE�v���_��A���JM�yk㠆
/3����cc���6tl���*��'���y�^�Cf@�n\G;2\"E�+�o��l|�'��;�;�x�&�T�"��9R�ҸP�igbi�g^x���>���g�����.��Z�HBhū�a)nݺ�{������XY�W�8{�$�]e�C��w�����{�?�'�ɳ1T���^��o|}�{���-�k��X����\��(�}����>g6NE�NJ�!q����s/3����5��a��ZC��,/
.�ydm�����_y�k߾��ŗ��+Ogn�N�)E���'���?lm����ךE��!��y�8VW�,/p��}O����r�������zI‘�U˃
9��+��f�@lA��+�*�֏���3Oz�,	<lLY�.q䅧(r�W�~�s��#Jy�"X/�>���w���ea���߽9L�\m	�2�%44	�.�*�0"k88�����~J/M1uA{-��#�&��4<7��$��n-�C�%���6N��W��e�j��{�\���R�r��)�K�-8�c�)�Ș2{�1[.��;;�*+�el�}���e�]�����ٹ�˥�W�}N�~���G�΢�3�zS1e,�̈��K�yX(2]ˎ��N	�A/ A'Uū%�޾���+�W�PN�\��
F�1�:�z\�k�3����5U5X�p�E}�A�7򡛔�n��U�w6�q��
�sX�8wn��Μ�aw�!ڙ�Tﯢ�[\��7u@� �1`Zσ�UA�g\��Fx��s��8�|����Z����I"�;ߒ2Zbi�#�%Z�5P��ۛ�y��cG8�q2�Z����>3m�Z��2h�4rZZ�/�C��G���A՝E���kͨ%���{���7��H�ݙWdPhg�P��w��T/���>�`8,e�(�e������:��.�c)e���hg+0g�55�ʔN�5��A=��F#��l�\��u���ħ��5��+J$EUk�)�%����X��,��'���V����bX�i��F��ɲFT�Қ��+?G�l�k����Qt4����W��p�/>"�ְ�*M��wT,3�i�N�E��P"
���nAhԴ4j�m�W�ө���s�@�6Dͫ�o�n���f��SI�Y� rљ�)���̵"�^1�AM����Qö���
69�3>���ba[�m�w�NLT��H1f)��C�	�m���dbn��g��}���+%���m��N�uZ��<D���%^PE؟o�^�з�l3��{��Tw/M�t�:3>���=����YLZFi���c�K'#mfjkҭ�?�8^t20sh��LB��c��D[��R�O����:I�s��J5��.^���:��m��T��|�l�*��P���h�F��HN)��;��dku�h�AB�
�z*A�)rχ�kc�%�7�:s��#o�[���h��b1'"g��7��;|�����_���g�� ���؇]���m>�ǿ|
���?��IEND�B`�8BIMFMsk��2#!&%')#*&##!"+(&#(&)(("# 


(.)! %& #!$  


(%,$()
#!&#$()#""!"+'$,)1..*)"#	 !# ('!!(!*'&#'(&&%! 
#!&#$()#""!"+'$)0)1./.0+/-+-.&'
	#!&#$()###!(+('&**+&(&*$)''+*"#!#!&#$(("!! !$.%)'.!(,#!+($+ !$("! !&$ '%(&!!#
')()#+("!($"#"#*!'%&(%#($'$(&#"
#!&#()%+())&&+"($&&'#*&&&*"# 

&''()**+))++*+*+****')+&)(*')*!# 
	#!'('',*!)#""!#+$*(%++ )'("# 
	#!!++%!(%%&&$+'&& ()'('* 
	#$!+,%!(%%&&$+'&& ()'('* 
	#! #"+,&$!(%%&&$+'&& ()'('* 
	#"! +,'!(%%&&$+'&& ()'('* 
	#" "!+,(!(%%&&$+'&& ()'('* 
	#!%& +,$!(%%&&$+'&& ()'('* 
	##&''+,))!(%%&&$+'&& ()'('* 
	#%%&(),)!)#""!#+$*(%++ )'("# 
	#!"!+&! !)#""!"+'$-$!**)$*&(*)#!(**+,*"!)#""!"+'$-$!**)$*&(*)#"(**+,,!)#""!"+'$-$!**)$*&(*)#!#$#+'&!)#""!"+'$-$!**)$*&(*)
'%*)*(-&  )#""""+)(#"*%!')'#!#
	&&%(0../*01(1',(+%1',)(.+0"($#
$&!#&**))*$&'&(+*+*(%%#!###(***)&!%'/,&/.%-0/(/*(%"(%***)&$  #"!%&$"*+%'+'*#(&$(#$"'& 


!'$.!'$( #,


&$"$#,
 #"!%&$)*&*'*"'*/().(%# 	 !#))&%)#&)&&'''##!%
 #"!%&$)*&*'*"'",-()/,,,)-.1-&'
	 #"!%&$)*'+'+$(#"%)! )&&&#(+/)"#! #"!%&$))%) $!%$&(, !*!&$-&%! !*)))&!%"'## !%
( (%&+,)!)*')&)&)*' "("#%*$!&%!
 #"!%&'&*+%),')+*'%&#*$&'*"'& 

&''()**+(*+*++**++**&)($*+'')*+(
	#!'('',*)*&***'!**("'*$$"'& 
	#!!"++%))$&+&)+$(### ( # %) 
	#$!"+,%))$&+&)+$(### ( # %) 
	#! #&+,&$))$&+&)+$(### ( # %) 
	#"!$+,'))$&+&)+$(### ( # %) 
	#" "%+,())$&+&)+$(### ( # %) 
	#!%&#+,$))$&+&)+$(### ( # %) 
	##&'*+,))))$&+&)+$(### ( # %) 
	#%%&(),))*&***'!**("'*$$"'& 
	#!"%+&" )*&*'*"',*$'% ,,/*# "#!(**+,*")*&*'*"',*$'% ,,/*# "#"(**+,-)*&*'*"',*$'% ,,/*# "#!#$'+'&)*&*'*"',*$'% ,,/*# $
%%*$%+,) )*&+!'*$(&#)%&#!&&#
	"%&-*00*.0/('(*0&-.*#"/,!+%(!

$&!#&**))*$&'&(+*+*'!%$!###(***)%#%)//*..%,0.+0*(%!(%*)*)&$ !""!%%%%**+#*(+&&')# (

+ )'%%"$%(


%()*
!""!$$$%)'+#*(+&&%)*0-%.##	 ")&("))*%$('!!$$
"

!""!$$$%)'+#*(+&&%)&&)-%/'*'+''*(&'
	!""!$$$%)'+#*(+')(+!$#('#(# $!#(#"#$!""!$$$%)&*")'"$%.()&&+*( '    &*))'*%$!'



%(!####&/-)&*")'*$&&(!'$("% #% 
!""!$$%()'+(**++(&)()$)&% %%
&'''()**+**+++++*++%"#"&)(&$" 	# '('&+))'+#*(+**++"*%($	# !**$)(+'**)*)%)$( !!	##!*+$)(+'**)*)%)$( !!	#  #"*+%$)(+'**)*)%)$( !!	#!! *+&)(+'**)*)%)$( !!	#! "!*+')(+'**)*)%)$( !!	# %& *+#)(+'**)*)%)$( !!	#"&''*+())(+'**)*)%)$( !!	#$%&((+()'+#*(+**++"*%($	# "!*%  )'+#*(+&&%)+ *% &"%(# # (***+)!)'+#*(+&&%)+ *% &"%(# #!(***++)'+#*(+&&%)+ *% &"%(# # #$#*&%)'+#*(+&&%)+ *% &"%(# 
%'%'&$('.+)'+#*(+&%')!##!"	"",$(/)*/011.*1/0(00,+-1+&*)$$
$&!#&**))*#&'&(+*+*("%%!##%****)%&&)/0),-#.-,&1,)&#(&***)&$ 
									
		




	



	




							


					
					
	
	
		
	
		

									
			
		
	
									
			
									
		
		

									
													
		
	
		
	
									
		

					
													
													
													
													
													
													
													
													
													
									
					
									
					
									
					
									
				
					



					
	

�������������������˺����������ƹ��������������������������������Ų��������������������������������
����Ŀ��þ��������������������Ŀ�������������������Ž���������������������
�ļ������������������Ž���������������������������˳���~z��������½�������������ʛ����yw��������þ��������������ɛ�����{y���������Ŀ�������������ɭ�����������������ſ�����������������������������ƿ�������������Ä��������uom��������ƽ�����������������º���pn���������������������¼���mk�����������������������þ��plr�����������������������¾�zrr�������������������
�®~{z�����������������������������������¨�}z������������������������������������	�������������������������à����������������������������Ÿ��������������������������������������������������������������������������������	�����������������������������������ÿ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������߲�����������������������������ۗ����Ϳ�������������������������񈌍����������������p�����������¾����ًy����������������������������������������������������p��������������������������������
��������������������������������u����	�����������������������	�������������t������~�ޑ�s����
��}���������������������������r������~�������������������r������~������������p������~�������������������~o������������������������������~o������������������������
���������~n��������������������������~m�����������������������}l����~�����}l�����~��������������������}j�����~���������������������|i�����~�������{i����~���������{h����~����������������{h����~�������������������{g����}�~�~~~�~~~�~zf����~�~~}}�~}�~}�~zf����}��}|�}|}}|�}{f����}��|}�|}�|}||}}|}ze����|��|�{�|�{|�{|{�|�{|{{ye����y��k�j�k�l�m�n�o�pqxze�����l�{oz������ر�jy�����	������������������������������������������񊏐����������������������¾����ُ��������������������������������������������������	����������������������������������	�������������������������������������������������������	�����������������~������������������������x����	�~���������������������������p����~���������������������������������~�~~}~�}�����������{z{~�����t�����x�����������vu�vx������w����tssts�����������qqpqq�����x�����llnn|������}��
���deik�����z���
���]`do�������v���	�~�Y[_������|���	�~�VW]�������s�	�~�UTy������}����~�TT���~�t���~�Tj��y~�~y{|���}�S��yw�}xzr����~�`�qy�|{tzr����}�ȗwn�{�vr����}���oit�y�z�{zpyl��|��{h�tqrt���y��ztkjj�k�l�m�n�o�pqxm���l}qwy�{om�����j����������������	�������������������������������������˺���������ƹ������������������������������Ų�����������������������������������
����Ŀ��þ�����������������������Ŀ����������������������Ž���������������������
�ļ������������������Ž�����������������������������Ž���������½��������������ƿ����������þ���������������������������Ŀ�����������������������������ſ������������������������ƿ�������������������������������ƽ�������������º��������������������������¼���������������������������þ���������������������������¾�����������������������
�¿���������������������������������������¿����������������������������������	����������������������à�������������������������Ÿ�����v������������v��	v��������������������v�v������������v�BAA@�?>==�<�;�:9�v�������
�������������v�Ueed�cbaa`�_^]]\�[G�v������������
v�Qb}{a`__^�]\[[ZYY�X
D�v���������������������v�M_y}x]\[[ZZYYXWWVSKHH,�v�����������������v�I\[v}uYXXWWVUTKC:�6
�v�������������������v�FXt}s�rUTSNC8�6�v�����������������v�BU}qp�}QG=�6�v�������������������v�?R�Qnjb8�6�v��������������v�;ONNI=�6�v�������������������v�7LG=�6�v����������������v�0<�6�v��������������v��6�v�����������������v��6�v������������������v��6�v���������v��6�v����������v���v����������v�����v�����v���Ϳ���������������������������˺���������ƹ�����������������Ų�����������	������������|�|�|
�Ŀ��þ������y���y�yy����y������Ŀ������v	�vv�ߐܐv�vr������������s	�ss��ϣss�s������������p�pΡpp�p
����������������p	�pp�ދދp�pr����������½�����o��o�oo�o��o������������þ�����o�������������Ŀ������opr�������������ſ���������������������������ƿ������������������������������������ƽ�����������Ǘ����������zyvvwyz}~�������������¼��������������������������þ�����������������������œ������������|�z	�{|}�������������
�¿��������������������������������������¿�����������������������Ð��������������������������	����������������������à������������������������Ÿ���������������������������������������������������������������������������������������ÿ�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������߲��������������������������ۗ��Ϳ���������������������������˺���������ƹ������������������������������Ų�����������������������������������
����Ŀ��þ�����������������������Ŀ����������������������Ž���������������������
�ļ������������������Ž�����������������������������Ž���������½��������������ƿ����������þ���������������������������Ŀ�����������������������������ſ������������������������ƿ�������������������������������ƽ�������������º��������������������������¼���������������������������þ���������������������������¾�����������������������
�¿���������������������������������������¿����������������������������������	����������������������à�������������������������Ÿ�����������������������	����������������������򜜝�����������������򶧭�����������񢣤�����������������񴧭�����
��������������響��������������̯���zﱧ�����������!��e����ε��������ԭ��������������������������~N������lx����Ʀ��ý�������������������$�됡�������\������������뫦���������������������Ŭ�����߯������������骦�����������������蝽�=��ym�˓�����������試����������������������rO��K�Ԕ����������姦���������������Ʀ��Ё�z����}~�䥦���������������������������Ƨilpx}���oim}⤥�����������������i�� c���kafih{�o���u{ࣥ���������������c:u��«yf[Y]d{�u�t�`�_ޢ�������������������ba[H9@ETn_STofg���lpmܡ��������������������\;;9<;?HO\Viha^qv��lW}۠�����������YGFBqhILQXQr~��e���~^ؠ������������������������������������Ϳ����������������������������˺����������ƹ������������������������������Ų��������������������������������
����Ŀ��þ�����������������������Ŀ����������������������Ž���������������������
�ļ������������������Ž�����������������������������Ž���������½��������������ƿ����������þ���������������������������Ŀ�����������������������������ſ������������������������ƿ�������������������������������ƽ�������������º��������������������������¼����������������������������þ����������������������������¾���������������������pu�����
�¿�������������������������p�~�����������¿�����������������������p�x����������������
�����p������������������à�������p��x�����������������Ÿ�������	p���{���������������������p�������������������������������������p��������������������p����š����������������������������ÿ��p�x����¥������������������p�vv������������������������������������
p�{�~|����������������������������p�{���v����w�������������������������p�{����v���������������������������p�{�����v������������������������������p�{������|��~��������������������p�{������u�}����������������������~uutrp�z������t�u�������������������|�������z������xz������������������w�������w�����~xs����������������������w������u�����tt��������������������������ə���w����zq�������������v�����”���w�����p��������������s���������{z����r���������������{����xu����z����������
�uy���~ys������������xsu{�����������������������˺���������ƹ������������������������������Ų��������������������������������������
����Ŀ��þ�����������������������Ŀ����������������������Ž���������������������
�ļ������������������Ž�����������������������������Ž���������½��������������ƿ����������þ���������������������������Ŀ�����������������������������ſ������������������������ƿ�������������������������������ƽ������������º�������������������������¼��������������������������þ��������������������������¾������������������������
�¿�����������������������������¿������������������=�V���V=�����������<��VFHHGHHG�HIV��<��������������à��;��T��T��;����������������Ÿ�	�;TST��������TST;��������������:SRR���RS:��������������������������9��R��R��9���������8��P��������P��8��������������	�����������8OOP������
�����POO8���������7NMN��NMN7��������������������������6��M��M��6���������������4��K���������	K��4����������������������3JII�L�IJ3���������������3�H���H3����������������������1��F�����	����F��1�����������0��E��������E��0����������������������.DDC��
�������CDD.������������������-�B��������B-�����������-��A�������A��-�����������������+��?�����������?��+���������������������*�>����>*�������)�=�}�~}~}~�}~�=)��������)��;�>;��)��������'��:�~:��'����!�k�!&��Ϳ���������������������������˺���������ƹ�����������������Ų������������	�����������|�|�|
�Ŀ��þ������y�����y��y������Ŀ������v��vv�v�v�������������sߎss�s�sr�����������p�p�p�p
����������������p�p�p�p�����������½�����o�o��o�or�����������þ�����o�������������Ŀ������os��������������ſ������������r�s�rq��������������ƿ������������������������������������ƽ������������º������������������������¼��������������������������þ��������������������������¾����������������������
�¿��������������������������
���¼����������������������������	����������������������à��������������������������Ÿ�������������������������������������������������������������	�������������������	���������������������	�������������ÿ���������������������������������������������������������������������������������������������������������������������������	��������������������������������������������������������������������������������������������������������������������������������������������������������������߲��������������������������ۗ��Ϳ���������������������������˺���������ƹ�������������������Ų���������������������������������������������إĿ��þ����������������������Ŀ������������	����������Ջ����������������������������
Ҋ����������������������������ҋ��������������������������������������½�������������������Ћ�����������þ�����������������ϋ������������Ŀ����������ȋ�������������ſ�����������������������������ƿ����������������������Ļ�������������ƽ��������������ʺ����������������������������ͼ���������������������������;�������������������������
���ɾ�������������������������ſ��������������������������������������¿���������������������������¿�������������������	�����������������������������������������	����������������������������
������������	����������������������������������������������������������
�������������	�������������������	�������������ÿ��������������������������������������������ӿ���������������������������������	������������������������������������������������	�����������
�������ӽ�����������������������ƾ����������������������������������������������Ѽ�������������������������������Ӿ���������������������������������������
����������������������������	�����������������������������������������������������������������ۗ��Ϳ�����������������������������˺����������ƹ�������������������������������Ų��������������������������������
����Ŀ��þ��������������������Ŀ����������������������Ž���������������������
�ļ������������������Ž�����������������������������Ž���������½��������������ƿ����������þ��������������������������������Ŀ����������������������������������ſ�����������������������������ƿ�����������������������������������ƽ�����������������º�{wrqnu�������������������������¼~yzvtmn�������������������������þ~z���zl�������������������������¾������r����������������������
�¿������|������������������������������¿������~�������������������
�������������������	������������
�»���������à�������������������������Ÿ����������	�����������������������������������������������������������������
������������������������������������ÿ������������������������������������������������������������������������������
��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������߲�����������������������������ۗ����Ϳ���������������������������˺���������ƹ���������������Ų���������������	���������������������
�Ŀ��þ�����������	�������������Ŀ������������������������������������������������������������������
����������������
��������������������
���������������������������½�����~��~
�~��~�~~�~~�~��~f�����������þ�����}h�x���������Ŀ�����}m�������������ſ���������������od{oxqqrp��������������ƿ��������������|x���i�������{|tqqhq�����ƽ���������������u���������oltrsh{�������������� ����������㺙��x�|rppe���������������� ������¿���آ�w��vpnjm���������������!�����������լ��}�ZZeese��������������!�����������ѳ���s��s��x�����������'�����Ê��u}��������ѷ��y�������w��������������������������̹���ϼ�����v��������'�����‚������������Ĵ���ʺ�����t����à�������!������������ȹ����ŷ�����s����Ÿ�������!������������������������r�������������!�������������������������y�������������!������������������z}����������������
�����������������������{������������ÿ���s������������������v������������������{����	��������������}�������������������w����������
���x��������������������l�������}{|~���w�������������������l����~|zyvv|���}�������������� �����������tq��|{yyz}���kv���������������������mq}�����ylm����������������������������{nojjlo|������������������������������������������������������������������������������������������������
�����������������������������������������������������߲�����������������������������ۗ���Ϳ���������������������������˺���������ƹ�����������������}�~}~}~~}�~}~�}�~	}��Ų��������{	��Ļ���������wx�w�xwx�w�x�w
����þ�������t���ߏt����tt���ߏ�t������Ŀ�������r�rr��r�r�r�r�r�������������onno�o	���oon���o
n�������������onno�o��onno�ދ�on���������������(�mmll�mm��m�mm��l�lm��lmlm�����������½������j���݇j���݇j����j������������þ������i�j�ij�������������Ŀ�����~�hg�hm��������������ſ�����������������������������ƿ������������������������������������ƽ�������������º�v������������������������¼���������������������������øj��������������������������™z��������������������ž��
��~������������������������������ij������±t���t{��������������������q����‘�����q����������
������÷�q������u�����¨|q�����à���������q��������������|q����Ÿ�������|q�������������vq�������������qv���������q����������q����������������qv���������q���������'����������q|����v�������q�����������������ÿ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������߲�����������������������������ۗ���Ϳ���������������������������˺���������ƹ���������������������������������	���Ų�����������	��������������������������
�Ŀ��þ���������ぁ����������Ŀ�������	~��~���������������|�||��|�������������{{�z�{�z{�{���z{�z{z{����������������{{�z�{�z{�{z�z{�z{z{�����������½������x�y�x�xx���x������������þ������w���wx�������������Ŀ�������vu�vz��������������ſ�����������������������������ƿ����������������{�uy�~|uromkkmq����ƽ����������������º������o��s�������������������¼�����n���n��������������������þ�����i��	k�����������������ń���¾�����n��	o���������������������~{z��x���������������'���������Ä��������¿�����zy|�����������������������������������������„��������������à���������„����������������Ÿ������������������������������������������������������������������������
��������������������
�����������������ÿ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������	���������������������������������������������������������������������������������������������������߲�����������������������������ۗ���Ϳ���������������������������˺���������ƹ���������������������������������	���Ų���������	�������������������������
�Ŀ��þ�����������������Ŀ�������~�����������������|�|�|�|�������������{{�z�{�z{�{�z�z{�z{z{����������������{{�z�{�z{���z�z{�z{z{�����������½������x�y�x�xxyyx�x������������þ������wx��wx�������������Ŀ�������vu�vz��������������ſ�����������������������������ƿ����������������{�uy�~|uromkkmq����ƽ����������������º������o��s�������������������¼�����n���n��������������������þ�����i��	k�����������������ń���¾�����n��	o���������������������~{z��x���������������'���������Ä��������¿�����zy|�����������������������������������������„��������������à���������„����������������Ÿ������������������������������������������������������������������������
��������������������
�����������������ÿ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������	���������������������������������������������������������������������������������������������������߲�����������������������������ۗ���Ϳ���������������������������˺���������ƹ���������������������������������	���Ų��������	��������������������������
�Ŀ��þ��������������������Ŀ�������~����~����������������|��|�|��|�|�������������{{�z�{z�{z{�{{��{�z{z{����������������{{�z�{z����{{��{�z{z{�����������½������x�y�x��x�yx�x������������þ������w�xx�w�wx�������������Ŀ�������vu�vz��������������ſ�����������������������������ƿ����������������{�uy�~|uromkkmq����ƽ����������������º������o��s�������������������¼�����n���n��������������������þ�����i��	k�����������������ń���¾�����n��	o���������������������~{z��x���������������'���������Ä��������¿�����zy|�����������������������������������������„��������������à���������„����������������Ÿ������������������������������������������������������������������������
��������������������
�����������������ÿ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������	���������������������������������������������������������������������������������������������������߲�����������������������������ۗ���Ϳ���������������������������˺���������ƹ���������������������������������	���Ų����������	������������������������
�Ŀ��þ��������������������Ŀ�������	~�������������������|�||�|�|�������������{{�z�{z�{z{�{{z�z{�z{z{����������������{{�z�{z�{z{��z�z{�z{z{�����������½������x�y�x�x���x������������þ������w�x�wx�������������Ŀ�������vu�vz��������������ſ�����������������������������ƿ����������������{�uy�~|uromkkmq����ƽ����������������º������o��s�������������������¼�����n���n��������������������þ�����i��	k�����������������ń���¾�����n��	o���������������������~{z��x���������������'���������Ä��������¿�����zy|�����������������������������������������„��������������à���������„����������������Ÿ������������������������������������������������������������������������
��������������������
�����������������ÿ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������	���������������������������������������������������������������������������������������������������߲�����������������������������ۗ���Ϳ���������������������������˺���������ƹ���������������������������������	���Ų���������	�������������������������
�Ŀ��þ���������������������Ŀ�������~��~���������������|���||�|�|�������������{{�z�{�z	���{�{z{�{�z{z{����������������{{�z�{�z	{��{�{z{�{�z{z{�����������½������x�y�x���xx�yxx�x������������þ������w�x�wx�������������Ŀ�������vu�vz��������������ſ�����������������������������ƿ����������������{�uy�~|uromkkmq����ƽ����������������º������o��s�������������������¼�����n���n��������������������þ�����i��	k�����������������ń���¾�����n��	o���������������������~{z��x���������������'���������Ä��������¿�����zy|�����������������������������������������„��������������à���������„����������������Ÿ������������������������������������������������������������������������
��������������������
�����������������ÿ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������	���������������������������������������������������������������������������������������������������߲�����������������������������ۗ���Ϳ���������������������������˺���������ƹ���������������������������������	���Ų��������	��������������������������
�Ŀ��þ���������������������������Ŀ��������~��~����������������|��|��|���|�������������{{�z!�{zz{z{{�{z{z{�zz{z{����������������{{�z"�{zz�z{{�{z{z{�zz{z{�����������½������xy��~�x�y�x������������þ������w�x�wx�������������Ŀ�������vu�vz��������������ſ�����������������������������ƿ����������������{�uy�~|uromkkmq����ƽ����������������º������o��s�������������������¼�����n���n��������������������þ�����i��	k�����������������ń���¾�����n��	o���������������������~{z��x���������������'���������Ä��������¿�����zy|�����������������������������������������„��������������à���������„����������������Ÿ������������������������������������������������������������������������
��������������������
�����������������ÿ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������	���������������������������������������������������������������������������������������������������߲�����������������������������ۗ���Ϳ���������������������������˺���������ƹ���������������������������������	���Ų������������	��������������������������
�Ŀ��þ����������撽�������������Ŀ���������~�̼�������������������|��|�ܻ���|��|��|�������������{{�z!��z���|��z��z�z{z{����������������{{�z"��䄸�z��z���z{z{�����������½������xy���x�z�{x��yy�x������������þ������w��ww�x�yxw���wx�������������Ŀ�������v�w�vz��������������ſ�����������������������������ƿ����������������{�uy�~|uromkkmq����ƽ����������������º������o��s�������������������¼�����n���n��������������������þ�����i��	k�����������������ń���¾�����n��	o���������������������~{z��x���������������'���������Ä��������¿�����zy|�����������������������������������������„��������������à���������„����������������Ÿ������������������������������������������������������������������������
��������������������
�����������������ÿ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������	���������������������������������������������������������������������������������������������������߲�����������������������������ۗ���Ϳ���������������������������˺���������ƹ�����������������}�~}~}~~}�~}~�}�~	}��Ų��������{�{	��Ļ���������wx�w�xwx�w�x�xx�w
����þ�������t�t��t�����t�t������Ŀ�������r���r�ύ�r��r�r�������������onnoo��oo�on�on�o�o
n�������������onnoo��oo�on�on�o�on����������������mmll�ߟ�m�mm�ml�l�lmlm�����������½������jއj��j�jj�kj�j�j������������þ������i�j�ij�������������Ŀ�����~�hg�hm��������������ſ�����������������������������ƿ������������������������������������ƽ�������������º�v������������������������¼���������������������������øj��������������������������™z��������������������ž��
��~������������������������������ij������±t���t{��������������������q����‘�����q����������
������÷�q������u�����¨|q�����à���������q��������������|q����Ÿ�������|q�������������vq�������������qv���������q����������q����������������qv���������q���������'����������q|����v�������q�����������������ÿ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������߲�����������������������������ۗ���Ϳ���������������������������˺���������ƹ����������������������������������	���Ų�����������	��������������������������
�Ŀ��þ����������������������Ŀ��������
����񘘗������������������������������������������𕔕�������������������������𧒒����������������½�������������������������þ�������������������������Ŀ��������������������������ſ�����������������������������ƿ������������������������������������ƽ�������������º��������������������������¼���������������������������þ���������������������������¾�����������������������
�¿���������������������������������������¿����������������������������������	����������������������à�������������������������Ÿ��������������������������
������������������������ș���������������������������ə������
��������������ٔ����ș��������������������Ǚ�����������������������ߴ��	����ƙ�������������������ݴ����������ř���������������������ߴ����������Ù����������������������������Ù���������������������ߵ��������������������������ݷ������	��������������������������޷���������˿����������������	���ݸ������������ʾ�����������������ݸ����������ɼ��������������������ܹ���������Ȼ���������������������ܹ���������Ǻ����������ϔ���ϔǹ���������������������������������������������ŷ�����������������������Ϳ���������������������������˺���������ƹ����������������������������������	���Ų��������	������������������������
�Ŀ��þ��������������蚭�����������Ŀ���������ꘘ���笘瘗���񘐽������������������𩕕��敕������������'����𕕔�𩕕攕�𔔩攕���������������(����擧��𒒓����撧������������½����
�������������������������þ���������������������������Ŀ��������������������������ſ�����������������������������ƿ������������������������������������ƽ�������������º��������������������������¼���������������������������þ���������������������������¾�����������������������
�¿���������������������������������������¿����������������������������������	����������������������à�������������������������Ÿ��������������������������
������������������������ș���������������������������ə������
��������������ٔ����ș��������������������Ǚ�����������������������ߴ��	����ƙ�������������������ݴ����������ř���������������������ߴ����������Ù����������������������������Ù���������������������ߵ��������������������������ݷ������	��������������������������޷���������˿����������������	���ݸ������������ʾ�����������������ݸ����������ɼ��������������������ܹ���������Ȼ���������������������ܹ���������Ǻ����������ϔ���ϔǹ���������������������������������������������ŷ�����������������������Ϳ���������������������������˺���������ƹ����������������������������������	���Ų���������	����������������������
�Ŀ��þ��������������������������Ŀ���������瘘���߬����񘐽������������������𩕕𩕕�𩕐���������������敕���𔕔𔔩𔕐��������������(����擒��𒒓���𧒒�����������½�������������������������������þ�������������������������Ŀ��������������������������ſ�����������������������������ƿ������������������������������������ƽ�������������º��������������������������¼���������������������������þ���������������������������¾�����������������������
�¿���������������������������������������¿����������������������������������	����������������������à�������������������������Ÿ��������������������������
������������������������ș���������������������������ə������
��������������ٔ����ș��������������������Ǚ�����������������������ߴ��	����ƙ�������������������ݴ����������ř���������������������ߴ����������Ù����������������������������Ù���������������������ߵ��������������������������ݷ������	��������������������������޷���������˿����������������	���ݸ������������ʾ�����������������ݸ����������ɼ��������������������ܹ���������Ȼ���������������������ܹ���������Ǻ����������ϔ���ϔǹ���������������������������������������������ŷ�����������������������Ϳ���������������������������˺���������ƹ����������������������������������	���Ų��������	��������������������������
�Ŀ��þ���������蚭�����������Ŀ���������笘��������������������������������������������𔕔����������������������������撓��������������½�������
𑒒������������������þ�������������������������Ŀ��������������������������ſ�����������������������������ƿ������������������������������������ƽ�������������º��������������������������¼���������������������������þ���������������������������¾�����������������������
�¿���������������������������������������¿����������������������������������	����������������������à�������������������������Ÿ��������������������������
������������������������ș���������������������������ə������
��������������ٔ����ș��������������������Ǚ�����������������������ߴ��	����ƙ�������������������ݴ����������ř���������������������ߴ����������Ù����������������������������Ù���������������������ߵ��������������������������ݷ������	��������������������������޷���������˿����������������	���ݸ������������ʾ�����������������ݸ����������ɼ��������������������ܹ���������Ȼ���������������������ܹ���������Ǻ����������ϔ���ϔǹ���������������������������������������������ŷ�������������������������Ϳ���������������������������˺���������ƹ������������������Ų�������������������������������������������إĿ��þ����������������������������Ŀ����������
������������Ջ���������������������������
Ҋ��������������������������ҋ������������������������������������������½���������������������Ћ�����������þ���������������ϋ������������Ŀ����������ȋ�������������ſ���������������������������ƿ������������������������������������ƽ�������������º��������������������������¼����������������������������ļ�������������������������	��������������������������
����������������������������������������������³������������������	�����������������	������������	��������������à�����������������������������Ÿ�����������������������������������������������������������������������	���������������������Կ�����������������ÿ���������������������������������ҿ���������������������������������������������������������������������������������������������������������������ѿ��������������������������������������������	�������������˼�����������������������������˼�������������������������������������
�����������ƽ������������������	����������������������������������߲�����������������������������ۗ���Ϳ���������������������������ü����������̽��������������������������������Ҽ�������������ü�����̷�������������̽�����ů��������������������ª�����������������������Ҽ�����§����������������ü������̷�����ħ����������������̽������ů�����ũ������������������������ª�����ܭ��������ڽ�����������!����Ҽ������§�������������������������!����̷������ħ�������Ϭ�����������������#������ů������ũ�������־�����������%������������������ª������ƭ��������ڶ����������������§������ӳ�����������������
���������������ħ�������Ш�����������������������������ũ�������ֿ���������������˹���������ƭ��������ڷ���������������������������dz���������¤����������������������˷����������������������������������̾�����������������˹���������������÷���������������������������ƺ����������������������������������ý��������������������
���������������������������˹�����������ֿ�����������������������վ������������������������������������ս�����������
���������������ս�������������	��������ֿ���Ӿ�������������վ�����ҽ��������������������������������ս�����ѽ������������ս���н��������������������ֿ��	�Ӿ�����н�����������������������������վ�����ҽ���Ͻ������	ս������ѽ��׾������ս���н��������
�Ӿ������н�������������������ҽ���Ͻ����������������������������ѽ��׾���������������������н�����������������������н������������Ͻ�������׾��������������������������������������.������#8������#8������#�$�#8������#"�#! �#8������#"_F!�#!?csuhH# �#8������#U��Y%"�#$h����x$#8������# !��W�#$,����)#8������#z���(�#,���!8������#5��Y�#!������f8������#"����"�#h���nRh����6������#$T����=�#!�������03������# "����#1��1##$D����D1������#{���)�#!$�����#,��P0������#6��d�#"%\�8�#1��H0������#"�����!"�#$�#P����63������#U����F�!!�#����#5�����##  ��	�}��и0�#$J��9�����##|���.����?�#$3���:8�����#6�p!#���>�#>���#8�����"����!)���>�# [��!#8�����U����P$3��>�#$�����###8�����#���##D����>�#$'�����#8�����z���+P��
�6 ##$3���n�#8���������;�H>}��	�_DJ+!#.���F"�#8�����������������j ����(�#8�������vu���$�#8�������v%���#$�#8����������������kW����b�#8�����1P�ND����dJL)����bD�JL;!8������d���6!���������)4������#j���>#! ���.4������#j���># %���,4������#j���>#(���,4������#n���>#!#����˘"6������#
:����})!##" � !8������#$�"�#"!�"!"#8������#8������#8������#8������#4�����+�96J���������������������=������������7��������c0/������Q.������CM�(���5n�����!V���-o���Hlءb$
T2u��4����:3���
����������\�F����U"����
����������/���	
�����u�����������C�{������(�����*�����:���\�
U����c�6�������l�����1��Il3��}>���	��LHa����e����$�b^��!R����4j��n��	�,v��'�����#�����BT��M��%��[y!�Z=�������Q���i ����J��������B�����&�`���`��?�����c|���M�:��"�@������ɇ
���R�z��֦J���t�:������)�D2S^__]��V�ݷ���a��f`__\L$o����&��������M��V/J?4���$����A����%�����8��4w��4��t������(������y�{|uH"^�mk������*��+c|�{z~���z8�eC���a$u�~����2���	��l��*p‡}�~X����"�u���������4���i�8c��?m���6�'j���/Q��������2����s��,s�ľ��������0��,��<),�+�, .
g�`|������.��&$(-,�+)t����$������������O��)�����@q��������H����#������^��C=\O/~��_������n\�����>`������O�	i��ś��#������ڭ=g�����
�{!����+�����e���L 4������	���90���	^4d�Z��������
�O���PkJ��N���*��������X��/������AH����"�YA��C��&	oM_��):X�������
��PN����o���Q	�)�����$�8���&�`W��
G�{--���m��`������.����9����Qx���>���p����$�h.���+���C��9Q���Ra�������#�_����Up����<��:?��H�����������	��������J�p�a��.�������n������������%�9"���Y����S �����m�����XC������aH��9 �����PQT����;+#o����%y(6����&���|'
:�����T������������������������������������������������������������������������������	�������������������������������
���������������
���������������������������������������������μ����������������������ͻ��������������������������ͻ�����������������������н�����������������������������湣�����������������������������������������������������������Ȥ�����������������$�����������氣�������ž�����������������%�����������⣣�������ɰ���������������������ϣ��������������������������������������ś�������������������
�������������������ӽ����������������������������ɗ���������Į���������������͜�����������ϳ������������������ǟ���������������׵�����������͢��������������������ߧ�����������������������ţ����������������
������������������������������������
��������������������������ⴣ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������߷���������������������������������߷����������������������������������������������	��������߷������������������߷��������߷����������߷��������������۷����Ϳ���������������������������������������������������������������櫞�������ı���������������ϲ��������ؽ����
���������հ��������׼��������������¦����
���ջ��������������������������������Ӹ�������������������������������޻��������������������������������������������������к��������������������������������������������������������������������˷��������������������������������������������������������������ȶ����������������������������������������������������޳��������²��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ު��������عލ������	���������������������������������������������������������������������������������ı�������ϲ���������̽����
���������հ������������������̼�����������������˻����������������������������˸���������������������������˴���������������������������������������������	��������������������������������������������������������ȣ������ÿ���������;�������ǜ������Ľ����������ν��������Ɩ�����Ź�������Œ����λ�������
��Ŋ����ƶ�����
��Ă���̹���������	���}��ȱ��������	���{{�ù���������	���yx�ƭ������������xw������������x���������������w������������Ά��������������ڽ��������������������������������������������������������������������������������ލ����������������	����������������������������������������������������������������������������������	�������������������������������
������������������
�������������������������������������������������μ����������������������ͻ��������������������������ͻ����������������������������Ͻ�������������������������������п������������������������������������������������������ý����������������	�������������������������������������
�����������������ɰ���������������������������������������������������������ź������������������
��������������������Ǽ�����������������������������½������Į����������������������������ϳ�����������������������������������׵�����������������
�������������������������������������������������������������������������������������������HGG�F�EDCC�B�A�@?��������������\nmmllkkjihhggffeddccN����������������Xk�ihhgffeeddcbaa�`J�������������Tg��eddcbbaa`__^ZROO1�������������Pdc��a``__^]\RJ@�<"������������������L`����\[UI>�<"��������������H]���XNC�<"��������������
�EZYXX}yo>�<"�����	�����������AVUUPC�<"�������߷�����=SNC�<"����������߷�����5B�<"������	�����������"�<"���������������߷�����"�<"�����������߷�����"�<"�����߷�����"�<"������߷������"�����������������������Ϳ��������������������������������������������������������������������	���������������	���������������
����������������󴢢�����������������	򟟱�江���������������	񜜯�ݾ�����ͻ�������������ݽ���
��ͻ�������������	񚚭�筚����������������������񬙙�����п�������������������������������������������������������	��������������������������������������
�������������������ɰ��������������������������ا������������������������������ź�����������������
��������������������Ǽ������������������峲�����������	�������Į���������������������������ϳ����������������������������������׵����������������������������������������������������������������������������⫫���������⫬����������������������������������������������
���⩨�����������������������������������������������������������������������������������������������������������������������������������������ᢢ��������������������������������������������߷����������������߷��������������������������������������������
��������߷�����������������߷�������߷���������߷������������۷��Ϳ������������������������������������������������������������������������	�������������������������������
������������������
�������������������������������������������������μ����������������������ͻ��������������������������ͻ����������������������������Ͻ�������������������������������п������������������������������������������������������ý����������������	�������������������������������������
�����������������ɰ���������������������������������������������������������ź������������������
��������������������Ǽ�����������������������������½������Į����������������������������ϳ�����������������������������������׵�����������������
�����������������������������������������������������������������������������������������������Ŀ��Ū��������������������
������ɶ����������������������������˵��������������������f�����̛�������ڿ�Ե���������������K������i~ѵ��ɭ���ս�������������멱�������Z���������������������������������������߲��������������������������ͺ>��ym�̝�����������������������������pN��I�Ӣ���������������	������������ҭ���ύ������������������߷�������������ť�������ņ{�����������߷������� a���hv����������������	������������}5���¯�vXi�����������ޢ��������������߷������zoUFDA\�gbt����������ܡ����������߷������xHA5HR>EJ`g���������z�ۡ����߷������pPMB��JHMUk�����������٠�����߷����������������������������Ϳ��������������������������������������������������������������������������	�������������������������������
���������������
�������������������������������������������������μ����������������������ͻ��������������������������ͻ����������������������������Ͻ�������������������������������п������������������������������������������������������ý����������������	�������������������������������������
�����������������ɰ���������������������������������������������������������ź�������������������
��������������������Ǽ������������������������������½������Į������������������������������ϳ����������������������������������׵��������⪹������������������������Ӷ�������������
�������������������������
�������ͭ�����������������������й�������������������������DZ��������������������Dz������������������Ѭ�����˰������������������������Ѩ������Ʋ�����������������Ѭ����������������������Ѭ�������ͪ���������������������Ѭ�ƺ����ϸ�������������������Ь���־��Ϳ�������������������Ь����ڹ������������������������Ϭ�����ڨ�����������߷����箨����ά�����ݦ��������������߷�����������Ǭ�����˪��������������������������ê����߯��´������	��������߷����������������Ц�������������߷���������»����֫���������߷������������­���������������߷������������µ����ǥ�������������������������������������
񨳾�����������������Ϋ�����������������������������������������������������������������������	����������������������������������
������������������
�������������������������������������������������μ����������������������ͻ��������������������������ͻ����������������������������Ͻ�������������������������������п������������������������������������������������������ý����������������	�������������������������������������
�����������������ɰ�������������������������������������������������������ź�����������������
��������������������Ǽ����������������������������½������Į������������������������ϳ����������������������������׵��E�i��iE��������	���������D��hXV�WXh��D����������C��f��f��C����������������A�e�������eA������������@�c�������c@����������������?��b������	b��?�����������>��`�����`��>�������������=�^������^
=��������������������<\\]���]\\<��������������:��Z������
����Z��:����������9��X�����X��9�������������������8�W�Z�W
8�����������������7�U���U7�����������6��R��������R��6��������������4��P�������P��4���������߷��2MNN�����������NNM2�����������������߷��1KLL������LK1�����������������/��I������I��/������
��������߷��.��H��	����H��.����������߷��,�E������E,����߷��+BCB�����������BCB+�����߷��*��A�DA��*������)��?��?��)����"���"'��Ϳ��������������������������������������������������������������������	����������������	����������������
���������������������������������韟����μ����������诜����������������������
��ͻ������������������Ͻ����������������������������������������������������������ý����������������&����������������������������������������
�������������������ɰ����������������������������������������������嵵�������������ź�����������������
��������������������Ǽ����������������������������½������Į���������������������������ϳ���������
��������������׵����������������	����������������������	����㮮����������������������
������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ࢡ�����������������������������������������������������߷��������������������߷��������������������������������������������
��������߷�����������������߷�������߷���������߷������������۷��Ϳ�����������������������������������������������������������������w�vw�vw�vwvww�����������s�s�s	�����������nonoonnonnonnoon�nn�n
onn������������j��kjj��j�j��j�����������gf�g
�ggf�g�gf��gg�ghg��μ���������b��b�b�b�cb�bc�b��ͻ�����������b�b�b�b�cb�bc�b
��ͻ������������_^�_��_�^^��__�__^_^_^��Ͻ������������\]]\[]�\]�\��]�\\�\]\\��п��������������[YZY�Z�[Z[[Z�[Z[[Z�����������������qYYXYXYX�Yi���ý����������������	��������������������������������������
����������������lo��ɰ����������������������y~�����������������������������~�����ź���������������������������������}�����Ǽ��������������������{�����½������Į�����������xy�������������ϳ���������������wz�����������������Ե����������	�w���������	�������Ե�������
wy���������������ص���������������ww�����������������ٵ�������������������xv��������������Ա�������������w����������������ײ���������w��w��������ٲ������
����|��v��������ٳ�����������
����x����w����������޵���������x����߁v��������߷����������y���ͫ~�vz��������������y�ۮ�wvvwyxvx����z�����������������	�w��vw}����
��vw}�~{�������������{vy�������ҧ�}������������ߝyw���������������������{z|���������߷���������߷v}�x�����������������߷����������vy�w�������������������������yv�x�����
��������߷���	������v�y���������߷�������}���߷���������߷������������۷��Ϳ����������������������������������������������������������������������������	�������������������������������
���������������
�����������������������������������������������μ����������������������ͻ��������������������������ͻ����������������������������Ͻ�������������������������������п�����������������������������������������������������������ý����������������
�������揗����ܑ����������������������
�������搝���⑎��ɯ�������������������������⏎�ث����������������������������⏎�ڢ���������������������&�������咜������Ꮞ�ۣ�����������������������������������ļ�½���������Į��������䐗�����������ɱ�������ϳ����%�������䑐������㛖�ޫ��ά����������׵�������������⏏�䭭�ذ�������������������������������������������������������������	�����������	�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������
����������������������������������������������������������������������������������������������������������߷���������������������������������߷����������������������������������������������	��������߷������������������߷��������߷����������߷��������������۷����Ϳ�������������������������������������������������������������������������������������	����������������������
������������������	������������������������������������������μ�����������˽�������˽����������ͻ���������������
����������������
��ͻ����������������
������������������Ͻ�����������������
��������������������������������������������������������������������������$���������������������������������������'��������������������������������������������­���������������������������������� פ��������ϴ���������������������'������䰼�����¾���㻪�����������������������!ڪ����զ��������|~���������Į�������"����©�����ȶ��������������ϳ����'�����䮵���������̷��������������׵�������!�������������������ÿ�����������������������������˾����ÿ������������'�����⦷������������ź����¿������������'�����㣷�����������ǽ���������������������!������������ý����������������������������������������������������������Ϥ������������
��������������
������☱�������������������������������������������������������������������������������������������������ѐ����������������������������'��������ᾐ�������������������������������������������������������������������ݼ�����������������������������������ı�����������������߷�����������������ҿ������������������߷����'����������������ǿ�������������������������������������������������߷�������������������߷��������߷����������߷��������������۷���Ϳ��������������������������������������������������������������������}�~}~}~~}�~}~�}�~	}�����������{	�������������wx�w�xwx�w�x�w
�������������t���ߏt����tt���ߏ�t��������������r�rr��r�r�r�r�r���Ļ��������onno�o	���oon���o
n���õ����������onno�o��onno�ދ�on���Į����������(�mmll�mm��m�mm��l�lm��lmlm���Ŭ�������������j���݇j���݇j����j���ǰ��������������i�j�ij���ɴ��������������~�hg�hp���ʽ����������������	��������������������������������������
�������������������̰������������������������ظ������������������������������ښ��������������������
���������������������������������������������᳑��½������Į�����������������ᕶ�����������ϳ������������Ѡ������ω��Պ�����������׵��������צ���������ʙ�����������������׬����݌��ē���������	�����ܲ���������������㾓����������
����Ⓡ�����������������Ѝ�����������֫�������Ї��������׫������������ܱ������⫫��ܫ������������ܫ�����܍�����⾇��������������������֥��ᾙ������������������������������������������ə�������������������������������������������������������������������������������������	���������������������������߷���������������������������������߷�������������������������	�����������������������������߷������������������߷��������߷����������߷��������������۷���Ϳ��������������������������������������������������������������������o�popoppo�pop�o�p	o�����������m��m	�������������ij�i�jij�i�j�i
�������������f��ff����f�������������d	cdd�dd�ddc�d����������a``�a�a`��`�a
`��ͻ�����������__�^�_�^_�_~��^_�^_^_��ͻ������������__�^�_�^_�_^�^_�^_^_��Ͻ��������������\�]�\�\\���{�\��п���������������[��{�[\������������������r�ZY�Zd���ý����������������	�������������������������������������������������������������������������������֪������������������������������������ź������������������
��������������	�����Ǽ�����	����������������������������½���	������Į�������������������ɕ��ϝ�����ϳ�������������������������Η���������׵���������������������������������������������������������������������������
����������������������������������������������������������������������������������������������������������������	���������������������������������������������	����������������������������������������������������������������������������ߣ�����	��������������������������������߷����������ҩ��������������Ҫ�ߪ�����߷�����������ҩ������������������������������������߷������������������߷��������߷����������߷��������������۷���Ϳ��������������������������������������������������������������������o�popoppo�pop�o�p	o�����������m�m	�������������ij�i�jij�ij�j�i
�������������f���f�f�������������dcdd�d�d�d����������a``�a�a`a�`�a
`��ͻ�����������__�^�_�^_�_�^�^_�^_^_��ͻ������������__�^�_�^	_����^�^_�^_^_��Ͻ��������������\�]�\�\\]]\�\��п���������������[\��[\������������������r�ZY�Zd���ý����������������	�������������������������������������������������������������������������������֪������������������������������������ź������������������
��������������	�����Ǽ�����	����������������������������½���	������Į�������������������ɕ��ϝ�����ϳ�������������������������Η���������׵���������������������������������������������������������������������������
����������������������������������������������������������������������������������������������������������������	���������������������������������������������	����������������������������������������������������������������������������ߣ�����	��������������������������������߷����������ҩ��������������Ҫ�ߪ�����߷�����������ҩ������������������������������������߷������������������߷��������߷����������߷��������������۷���Ϳ��������������������������������������������������������������������o�popoppo�pop�o�p	o�����������m	�������������ij�i�jij�i�j�i
�������������f���f�gf��f�������������dc��d�d�c��d����������a``�a��a�a��`�a
`��ͻ�����������__�^�_^�_^_�__��_�^_^_��ͻ������������__�^�_^����__��_�^_^_��Ͻ��������������\�]�\��\�]\�\��п���������������[�\\�[��[\������������������r�ZY�Zd���ý����������������	�������������������������������������������������������������������������������֪������������������������������������ź������������������
��������������	�����Ǽ�����	����������������������������½���	������Į�������������������ɕ��ϝ�����ϳ�������������������������Η���������׵���������������������������������������������������������������������������
����������������������������������������������������������������������������������������������������������������	���������������������������������������������	����������������������������������������������������������������������������ߣ�����	��������������������������������߷����������ҩ��������������Ҫ�ߪ�����߷�����������ҩ������������������������������������߷������������������߷��������߷����������߷��������������۷���Ϳ��������������������������������������������������������������������o�popoppo�pop�o�p	o�����������m�m	�������������ij�i�jij�ii�j�i
�������������f��f��܄�f�������������d	c�ۂd�ۂd�d��μ���������a``�a�aa�aa`�a
`��ͻ�����������__�^�_^�_^_�__^�^_�^_^_��ͻ������������__�^�_^�_^_��~^�^_�^_^_��Ͻ��������������\�]�\�\�|��{�\��п���������������[�\�[\������������������r�ZY�Zd���ý����������������	�������������������������������������������������������������������������������֪������������������������������������ź������������������
��������������	�����Ǽ�����	����������������������������½���	������Į�������������������ɕ��ϝ�����ϳ�������������������������Η���������׵���������������������������������������������������������������������������
����������������������������������������������������������������������������������������������������������������	���������������������������������������������	����������������������������������������������������������������������������ߣ�����	��������������������������������߷����������ҩ��������������Ҫ�ߪ�����߷�����������ҩ������������������������������������߷������������������߷��������߷����������߷��������������۷���Ϳ��������������������������������������������������������������������o�popoppo�pop�o�p	o�����������m�m	�������������ij�i�jiji�i�j�i
�������������f����f��܃�f�������������dcۂ�d�ddc�d��μ���������a``�a��a`�a``�a
`��ͻ�����������__�^�_�^	~��_�_^_�_�^_^_��ͻ������������__�^�_�^	_}�_�_^_�_�^_^_��Ͻ��������������\�]�\���\\�]\\�\��п���������������[�\�[\������������������r�ZY�Zd���ý����������������	�������������������������������������������������������������������������������֪������������������������������������ź������������������
��������������	�����Ǽ�����	����������������������������½���	������Į�������������������ɕ��ϝ�����ϳ�������������������������Η���������׵���������������������������������������������������������������������������
����������������������������������������������������������������������������������������������������������������	���������������������������������������������	����������������������������������������������������������������������������ߣ�����	��������������������������������߷����������ҩ��������������Ҫ�ߪ�����߷�����������ҩ������������������������������������߷������������������߷��������߷����������߷��������������۷���Ϳ��������������������������������������������������������������������o�popoppo�pop�o�p	o�����������m	�������������ij�i�jij�i�j�i
�������������fm��m�f�ffgff��f�������������d�dcd�d�ddcdd��d����������a``aa��a��`���a
`��ͻ�����������__�^!�_^^_^__�_^_^_�^^_^_��ͻ������������__�^"�_^^�^__�_^_^_�^^_^_��Ͻ��������������\]e��d�\�]�\��п���������������[�\�[\������������������r�ZY�Zd���ý����������������	�������������������������������������������������������������������������������֪������������������������������������ź������������������
��������������	�����Ǽ�����	����������������������������½���	������Į�������������������ɕ��ϝ�����ϳ�������������������������Η���������׵���������������������������������������������������������������������������
����������������������������������������������������������������������������������������������������������������	���������������������������������������������	����������������������������������������������������������������������������ߣ�����	��������������������������������߷����������ҩ��������������Ҫ�ߪ�����߷�����������ҩ������������������������������������߷������������������߷��������߷����������߷��������������۷���Ϳ��������������������������������������������������������������������o�popoppo�pop�o�p	o�����������m���m	�������������ij�i�j��mjij�i
�������������f���z���f���z�f�������������d��c���p��d��d��d��μ���������a``aa�va�լ�dy�`�va��a
`��ͻ�����������__�^!��^ɴ��av�^��^ʴ^_^_��ͻ������������__�^"���j��^t�^���j^_^_��Ͻ��������������\]�r�\�^�_\�r]]�\��п���������������[�q[[�\�]\[�q�[\������������������r�Z�[�Zd���ý����������������	�������������������������������������������������������������������������������֪������������������������������������ź������������������
��������������	�����Ǽ�����	����������������������������½���	������Į�������������������ɕ��ϝ�����ϳ�������������������������Η���������׵���������������������������������������������������������������������������
����������������������������������������������������������������������������������������������������������������	���������������������������������������������	����������������������������������������������������������������������������ߣ�����	��������������������������������߷����������ҩ��������������Ҫ�ߪ�����߷�����������ҩ������������������������������������߷������������������߷��������߷����������߷��������������۷���Ϳ��������������������������������������������������������������������}�~}~}~~}�~}~�}�~	}�����������{�{	�������������wx�w�xwx�w�x�xx�w
�������������t�t��t�����t�t��������������r���r�ύ�r��r�r���Ļ��������onnoo��oo�on�on�o�o
n���õ����������onnoo��oo�on�on�o�on���Į�����������mmll�ߟ�m�mm�ml�l�lmlm���Ŭ�������������jއj��j�jj�kj�j�j���ǰ��������������i�j�ij���ɴ��������������~�hg�hp���ʽ����������������	��������������������������������������
�������������������̰������������������������ظ������������������������������ښ��������������������
���������������������������������������������᳑��½������Į�����������������ᕶ�����������ϳ������������Ѡ������ω��Պ�����������׵��������צ���������ʙ�����������������׬����݌��ē���������	�����ܲ���������������㾓����������
����Ⓡ�����������������Ѝ�����������֫�������Ї��������׫������������ܱ������⫫��ܫ������������ܫ�����܍�����⾇��������������������֥��ᾙ������������������������������������������ə�������������������������������������������������������������������������������������	���������������������������߷���������������������������������߷�������������������������	�����������������������������߷������������������߷��������߷����������߷��������������۷���Ϳ��������������������������������������������������������������������p�qpqpqqp�qpq�p�q	p�����������n��n	�������������jk�j�kjk�j�k�j
�������������g��g�g����g�������������d
cd�d�d�ddc�d����������a``�a	�a�`�a``�a
`��ͻ�����������__�^�_}�_^�_�_^_�_�^_^_��ͻ�������������\�]{�{\\�\��{�\��Ͻ��������������[���\�[�[\��п��������������q�YXY�Yc������������������q�YX�Yc���ý����������������	��������������������������������������
�������������������ɰ���������������������������������������������������������ź������������������
��������������������Ǽ�����������������������������½������Į����������������������������ϳ�����������������������������������׵�����������������
�������������������������������������������������ߌ�l��������������ߋ�w������������������������������j~z������~�}�|{�y�~~j������������i~j�~j~i��������������h||�L�Q	T�||h�����������g���U�c[�uug�����������e~�U�s���s
c�ssf����������������e}}�U������j�rqe������������c||�U�n�����o	b�ppc�������������a{y�U�����m�ooa����	����������`xx�W�{��{j�ll`������߷����
^xx�W{||������}l�kk_���������߷����	^wv�Xggil����l�ia�ji^�����	����������
\uu�Xxyyz���Ӄ�{	n�hh\��������������߷����[ss�X�q�r���́�r	i�ggZ����������߷����Zrq�X�l����lf�feZ����߷����Yqjq�qjfY�����߷����X�l�k�jihh�gf�ed�aW��������Wmkmjihh�gf�e�d�cac``W����
UVWVUVVUWVV�U�V�UWUWVUVVU���Ϳ��������������������������������������������������������������������p�qpqpqqp�qpq�p�q	p�����������n	������������jj�k�j�kjk�j�k�j
������������g��g���gg��g����g��g������������dd�d�ddc�d�ۂd�dc��d��d��μ���������a`�a����a�`a�``a�a�a`��ͻ����������'�__�^�__^�_�~__�^_��^^}�^_��ͻ�����������(�\\�\�]{��\�\\]|��{�\{�\{\��Ͻ������������
�[[��{��{�\�[�[�[��\��п��������������\�YX�Y��YX������������������q�YX�Yc���ý����������������	��������������������������������������
�������������������ɰ���������������������������������������������������������ź������������������
��������������������Ǽ�����������������������������½������Į����������������������������ϳ�����������������������������������׵�����������������
�������������������������������������������������ߌ�l��������������ߋ�w������������������������������j~z������~�}�|{�y�~~j������������i~j�~j~i��������������h||�L�Q	T�||h�����������g���U�c[�uug�����������e~�U�s���s
c�ssf����������������e}}�U������j�rqe������������c||�U�n�����o	b�ppc�������������a{y�U�����m�ooa����	����������`xx�W�{��{j�ll`������߷����
^xx�W{||������}l�kk_���������߷����	^wv�Xggil����l�ia�ji^�����	����������
\uu�Xxyyz���Ӄ�{	n�hh\��������������߷����[ss�X�q�r���́�r	i�ggZ����������߷����Zrq�X�l����lf�feZ����߷����Yqjq�qjfY�����߷����X�l�k�jihh�gf�ed�aW��������Wmkmjihh�gf�e�d�cac``W����
UVWVUVVUWVV�U�V�UWUWVUVVU���Ϳ��������������������������������������������������������������������p�qpqpqqp�qpq�p�q	p�����������n�n	������������jj�k�j�kjkjj�k�j
������������g������gg�g�g�g��gg��g������������dd�d�ddc�d�΂d��d�d��d��μ���������a`�a����a�`a�`a�a�`��ͻ�����������__�^�__^�_�_�^_^�^^}�^_��ͻ�����������(�\\�\�]\��\�\\]��\\�\\�{\\��Ͻ�������������[[��{��{�\�[�[�[��[[��\��п��������������q�YX�Yc������������������q�YX�Yc���ý����������������	��������������������������������������
�������������������ɰ���������������������������������������������������������ź������������������
��������������������Ǽ�����������������������������½������Į����������������������������ϳ�����������������������������������׵�����������������
�������������������������������������������������ߌ�l��������������ߋ�w������������������������������j~z������~�}�|{�y�~~j������������i~j�~j~i��������������h||�L�Q	T�||h�����������g���U�c[�uug�����������e~�U�s���s
c�ssf����������������e}}�U������j�rqe������������c||�U�n�����o	b�ppc�������������a{y�U�����m�ooa����	����������`xx�W�{��{j�ll`������߷����
^xx�W{||������}l�kk_���������߷����	^wv�Xggil����l�ia�ji^�����	����������
\uu�Xxyyz���Ӄ�{	n�hh\��������������߷����[ss�X�q�r���́�r	i�ggZ����������߷����Zrq�X�l����lf�feZ����߷����Yqjq�qjfY�����߷����X�l�k�jihh�gf�ed�aW��������Wmkmjihh�gf�e�d�cac``W����
UVWVUVVUWVV�U�V�UWUWVUVVU���Ϳ��������������������������������������������������������������������p�qpqpqqp�qpq�p�q	p�����������n	�������������jk�j�kjk�j�k�j
�������������g�g�g����gh�g�g�������������d�ۂd�d�c��d��μ���������a``�a��a����`��a
`��ͻ�����������__�^�_�^_^�_�_�_�^_^_��ͻ�������������\�]\�\�\]��\�\��Ͻ��������������[
�[\\{��[�[�[\��п��������������q�YX�Yc������������������q�YX�Yc���ý����������������	��������������������������������������
�������������������ɰ���������������������������������������������������������ź������������������
��������������������Ǽ�����������������������������½������Į����������������������������ϳ�����������������������������������׵�����������������
�������������������������������������������������ߌ�l��������������ߋ�w������������������������������j~z������~�}�|{�y�~~j������������i~j�~j~i��������������h||�L�Q	T�||h�����������g���U�c[�uug�����������e~�U�s���s
c�ssf����������������e}}�U������j�rqe������������c||�U�n�����o	b�ppc�������������a{y�U�����m�ooa����	����������`xx�W�{��{j�ll`������߷����
^xx�W{||������}l�kk_���������߷����	^wv�Xggil����l�ia�ji^�����	����������
\uu�Xxyyz���Ӄ�{	n�hh\��������������߷����[ss�X�q�r���́�r	i�ggZ����������߷����Zrq�X�l����lf�feZ����߷����Yqjq�qjfY�����߷����X�l�k�jihh�gf�ed�aW��������Wmkmjihh�gf�e�d�cac``W����
UVWVUVVUWVV�U�V�U	WUWVUVVU�����Ϳ����������������������������������������������������������������vw�vw�vwvww����������s��s	�����������
onoonnonnonnoo�n�nnonn������������j���j��j��j�j����j�����������fgg�ghg�f�gg�f�gg�fg��ghg��μ���������b���b�b�b�c��b��b��ͻ�����������b��b�b�b�c��b��b
��ͻ�����������_^_�__^��_��^��_�^_^_^��Ͻ�������������]\[���]�\�\\]��\�\\]\\��п��������������[YZY[Z�[Z[[Z�[Z[[Z������������������YXYXYX�Yi���ý����������������	��������������������������������������
�������������������ɰ��������������������������������������������������������͝ukkj���������������
������������������ɀpligg������������������
������|tpmmlk�������Į�������������րwvsrpoz�������ϳ�����������������ywtru������������׵�������������yz{��
���������������ށywxx���������������������xwwx������������������������������vvwx��������������������v�xy������������������uu�vw��������������u�v������������������
���tuututuutv����������������}�sv�wx���������������r�����������������u�rt��������������������������ߓsrsr�������������������ٙ�rv�����������������{rsqqr�����	����������������r�q���������߷����	��������ss�r	���������������߷������������s�rw��������	������������������sr��������������߷��������������������߷��������߷����������߷��������������۷���Ϳ���������������������������������������������������������������������������������������������������������������������������������������������������������������ս��������������������������Ժ��������������������������������ֻ�������������������������������ؽ���������
������������������������ս�����������������������������������Ժ��������������������!������������ֻ������罹����������������!������������ؽ�������֪������������������������ս���������������������������&���������Ժ��������������׵����������������ֻ������軽����������������������ؽ�������װ�������������������������������͵��
��������������������������������ض������������� �������������������̻������������������������������Ҿ�����������������������������������ɻ��������������������� ��������������������������������������������������������������������	���������������������������������������������������������������������������	������������������������������������
���������������
����������������������������������������������������������������������������
�������������������������	�������������������������������������������������������������������������
�����������������������������������������������������������������
��������������������������������������������������������������������������������������������������������������������������������*������5������5������ �� �5��������5������^D�=bqsgF �5������T��W"� g����v 5��������V� )����&5������y���%�)���5������2��W�������e5�����������g���mQg����4������ R����:��������-0����������/��/ A����B/������{���&� �����)��N-������4��c�"Z�5�/��F-������������ �N����40������T����D������2�������	�{��и-� H��5�����z���*����=� 0���85�����4�n ���<�<���5���������&���<�Z��5�����T����N 0��<� ����� 5����� ���B����<� $�����5�����y���(N��
�4 0���m�5���������9�F<}��	�]AH(*���D�5����������������h����%�5�������us��� �5�������u"��� �5��������������jV����`�5�����/N�LB����cHJ&����`A�HJ95������c���4���������&1������h���<���*1������h���<"���)1������h���<%���)1������m���< ����˘4������
8����|&�5������ ���5������5������5������5������1�����(�54H���������������������<������������7��������f (������C(������E7�t(���5n�����W���-Q���2nءb$
S2u��4f���(4���
��d�����\�	3�����<"����
��
|������g�/���	�������U����������`��0�{���^�o����l%�����,����B�
=��
��c�'��r����i�����$���6l3s�[>�����7Has���c����$�bB��R����%j��Q�n	�,Wĭ�����#�r�r�B=��M����[y��??��������;�s�L ��~�6z�o�����/������E�j�F›
@�����c[�r�8_
)r���.������ʊ
���<�{��֦L�{�U�<������!�D";FGGF_��V�޹���G��J�GC6o������������sM��V&7/1�����������f?����������»)��2U����$��tl����Ã"������rW�XYV5_�nM¼����"��
!IY�XZ����W:�g1���G%x��������.�����M��)pÉ~��Z�����U���
������*�����dk�8c��AL���&�)M��� S�������,�����Q��,r���ám���"������*!� !".
g�aZĺ����#��%""� !U������$bº��������8��%f����+s��u���������1����!y�������^��B.@8)��E�������N\�����>D��������:�	j��Ǟ��#�y�������*g������{�`�o�-�����f���74������	���9"���	E
$I�A��������
��:�t�8kJo�9�y�c)����`�o�?�}/�������-K�����[.��C��nMD�p�*:Až�����
�
��;N��v�Q���:	�)y�s��$�8u®%�`?G�z-!���P��E������(���{���)����QW�q�-��āp����$�h����w�bC��9Q��	��;G���y
�����#�`����>R��
��<��;.��3f���d������	��v�����4�p�`��.�g��O�������d���n%�9"���Y�����; �����N�����XC������b2��("�����99U����;+#o����$W7����'���|'
:�����U������������������������������������������������������������������������������������������������������������������������������������������	��������������������������
������������������������������������������������ֿ�������������	����������
���������������������������	��������������������������������������������$�������������������������������������������������ϴ���������������%�����������������ڽ���������������������������޻����������������������������������׫�������������������������������൭����������������� ���������������㹶�����������������������������༸�����������������������������������������������������������	�Ŀ����������������������������������������������������������������������������������������������	���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Ϳ�����������������������������������������������������������������������������������������������������������������������������������������������������������������������
���������������������	���������������������	��������������������������������������������������������������������������������
��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������	��������������������������������������������������������������������������������������������������������������������������������������������������������������	�����������������������������������������������������������������������������������������������������������������������������������������������������������������������
�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
���������������
�����������������	��������������	���������������	��������������������������������������������������������������������������������	���������������������������������������������������������������������������������	���������������������������������������������������������������������������������������������������������������������������������������������������	��������������������������
��������������������������������������������������������������	������������������������������������	���������������������������
�������������������
����������������������������������������������������������'����������������������������������������������������������������������������������������������������������������������������
��������������"�������������������������������������������������������������������������������������������������������������������������������������������������������������������|����������������|��|������������|�|�������������|�HGGFEE�D�C�BA�@
?�|���������������|�\nnm�lkjiih�g
feedccM�|����������������|�Xk!jiihggf�edcbba�`J�|��������������
|�Tgh!geedc�b
a``_^[SPP1�|������|�Pece!da�`_^^\SKA�="�|��������������|�L`c!b�a]\\VJ?�="�|��������|�H^!``�!YOD�="�|�����������|�DZ�Y\XP?�="�|��������|�@WVVPD�="�|�����������|�<TND�="�|��������|�5C�="�|�������|�"�="�|����������|�"�="�|��������|�"�="�|��������|�"�="�|���������|��"�|����������|������|������|���Ϳ������������������������������������������������������������������������������������������������������������������������	��������������������	������������������������������������������	������������������������������������������������������������
ܟ�����������������
�����������������������
������������������������
�����������������������Ľ������������������������������������������������������������������������������������������������½������ӵ�����������!������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Ϳ�����������������������������������������������������������������������������������������������������������������������������������������	��������������������������
��������������������������������������������������������������	������������������������������������	���������������������������
�������������������
����������������������������������������������������������'����������������������������������������������������������������������������������������������������������������������������
��������������"��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������l�����������������������/D�������������������������n4[-�������������������{������������ܡ��y����������������T������w���͸�����������������������m�������~rLXC�����������������c������ïf���m���D0q�����������h��F��u�Է�al����12=���������������{Y�׳W�ז���[qc[]�\������������z����虿ԙ���vx;������������������]�������ȯ9EDA>25(PbeG�����������!k�ĥk���y9�������������#>W��Ģ0Dk?ޢ�����������#*3,>NEP>�ܡ���������#47=,!CR[T7۠����������2<=A !FU]d)' "!"##!!ٟ�����������������������������������Ϳ����������������������������������������������������������������������������������������������������������������������������������������	��������������������������
��������������������������������������������������������������	������������������������������������	���������������������������
�������������������
�����������������������������������������������	�����������%������������������������������������������������������������������������������������������������������������������������������������������ !=������������������������������������`1�������������������������������a)����������������������������;E��������������������������99)��������������������������������6J-l������������������56E>������������������3�#b9�������������������0�	"Fl;���������������������.5:@t=�������������������
,&%48:C`R���������������*/�I088N8����������(/�Ɂ.5*A)�����������������&/��Ъ,<������������#/����C`���������������!/����BIU������������.����$M9x������������F�.����$X%�����������:#-&.����3BO����������#B�D0(���FG"��������������!�D8 ���,&�����������Y2�DC

+����9 z�����������CDD>

���ڎs������������


3���� w�������������:�

.����P������������
�

]�����������{#*q�������������������������������������������������������������������������������������������������������������������������������������	��������������������������
��������������������������������������������������������������	������������������������������������	���������������������������
�������������������
���������������������
��������������������������
����������&�������������������������������������������������������������������������������������������������������������������������	�����������������������������������������������������������������������F�j���jF����������������������D��iSP�Q�PQ�PRi�D�������������������C��h��h�C�������������������������C�f�����fC����������������Aede�����edeA������������������@��c������c�@�����������������>��a�������a�>���������������������=�_��������_=�����������������<\]]������]\<������������������:��Z����Z�:����������9��X�������X�9��������������8�W�[�W8�������7�U��U7���������
�6��S�������S�6�������5��Q��Q�5�������������3NON�������NON3�������1�L�����L1������/��J������J�/���������.��H���������H�.�������-�E��E-������
�+DCC��������CD+��������*��A�DA�*���������(��?��?��(�����!��!(��Ϳ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
ߴ���������������������������������������������������������
����������&���������������������������������������������������������������������������������������������������������������������������	�������������!���������������������������������������ihgf�ef�g��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������>����������������������������������������������������������T7�����������������������������������������������������Ϳ���������������������������������������������������j�h��������&�'
&''&'&''&'&'&'�&'&''�������$�$�$������ ���  � �  ������������
�����������������	�������������������������������������������������������������������
�
��
�
��
�������������!

�









���������������.

�

�



�

,������������������
�����������������������
����������������IG�������
����������&��������������YDN�������������������������KOoz�������������������������������KQ`�������������������������������WGO��������	�������������!�����������kBE������������������������������@E����������������������������@O���������������������������������
@D����������������������������A@�������������������������D@i������������������������������
TUaA������������������������A��A]�������������������������������_I�y@����������������������Cr��OA��������������������lD���R@S�������������Ee���כN�@FPi��������fD��]B@@BEC@Do��sGU���������	�BUYAALv���
�TABMUNI�����������H@Dd���^MV�����������EB����������HHKU�����������������@LnD���������@E�C�������F@�Dg�������	���@WEd��������OT��������������������������Ϳ������������������������������������������������������������������������������������������������������������������������������������������	��������������������������
��������������������������������������������������������������	�������������������������������$*,,+()(+���������������������$*//.+*)*-�����������������
������$8�	��+)������������������'G���)%�������	�����������%������,G�������$%�����������������������,F�����$$��������������������������,E������$$����������������������	������+B������������������������������� ���'8����������������������������%������*'=EEBB�A9����������������������������&'('�$	��$%����������������������������������������������������������������������������������S���+&��20��&%&5���������������	������������������������������������������������������������������������
�' ��+)������������������������������������
�����������������������������������Ib`^`H���-+�����������	�����������������������������������������������������������������������������������������������Ϳ�������������������������������������������������������������������������������������������������E�E��	�E��E��������������D����D����������������D���D������������������
��������������������
���������������������
�������������������������������������	������������������$������������s���������������������������о�ZG@FZ������Ͱ���������������'��������U?Jq�`������Մ������������������� ��^?;;TG�������û�{�����������������!��@=89VF8������FEMewu������������'������I?:8N>k�������ڔ<DS[mt�������������"��B>98R��������8H����_����������������wBIDi�������P4@ABP~����������'�����V�����������e05:=AEe�������������[���������.26:=@BK����������!��t{���������/36:>ABB�����������������������248<?ABA���������!�����������������g69C>ABD��������������䄯�gBBQ������������������CBl�������������CA���������������������cBQ������������������MA�������������������������?o����������������������������b���������������������������������������������������
����������������������������������������������������������������������������������������������������������������������������������������Ϳ����������������������������������������������������������������}�~}~}~~}�~}~�}�~	}���������{���������wx�w�xwx�w�x�w�����������t���ߏt����tt���ߏ�t�����������r�rr��r�r�r�r�r�����������onno�o	���oon���o
n������������onno�o��onno�ދ�on�����������mmll�mm��m�mm��l�lm��lmlm�������������j���݇j���݇j����j��������������i�j�i	j����������������~�hg�h
s������������������
����������������������������������������������������������'�������������������Ѧ��������������������������ﱷ������������������������������������������������������������������Ǧ�����
��������������"�������������������������������������������������럨����������������������캛���������߮��������������������������ڧ������������"�ƛ��������ӭ��������ӧ�����������������������
桛����������������������������������ƛ��������������������������������ӛ�������������Ӯ��������������������������������������������߮���������������������������������������������������������������������������������������������������������������������������������Ϳ�������������������������������������������������������������������������������	�������������������������������������������������ぁ���������������	~��~�������������|�||��|������������{{�z�{�z{�{���z{�z{z{�����������{{�z�{�z{�{z�z{�z{z{�������������x�y�x�xx���x��������������w���w	x������������������vu�v
�������������������
�������������������������������������ʯ�����������������������'���������������������ȿ��ȯ������������������������˨��ʨ������������������������������̣��ɦ�����������������������������ת��Ӫ���������������������������������������������������������������嵴�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Ϳ�������������������������������������������������������������������������������	�����������������������������������������������������������~���������������|�|�|�|������������{{�z�{�z{�{�z�z{�z{z{�����������{{�z�{�z{���z�z{�z{z{�������������x�y�x�xxyyx�x��������������wx��w	x������������������vu�v
�������������������
�������������������������������������ʯ�����������������������'���������������������ȿ��ȯ������������������������˨��ʨ������������������������������̣��ɦ�����������������������������ת��Ӫ���������������������������������������������������������������嵴�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Ϳ�������������������������������������������������������������������������������	��������������������������������������������������������������~����~��������������|��|�|��|�|������������{{�z�{z�{z{�{{��{�z{z{�����������{{�z�{z����{{��{�z{z{�������������x�y�x��x�yx�x��������������w�xx�w�w	x������������������vu�v
�������������������
�������������������������������������ʯ�����������������������'���������������������ȿ��ȯ������������������������˨��ʨ������������������������������̣��ɦ�����������������������������ת��Ӫ���������������������������������������������������������������嵴�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Ϳ�������������������������������������������������������������������������������	��������������������������������������������������������������	~�����������������|�||�|�|������������{{�z�{z�{z{�{{z�z{�z{z{�����������{{�z�{z�{z{��z�z{�z{z{�������������x�y�x�x���x��������������w�x�w	x������������������vu�v
�������������������
�������������������������������������ʯ�����������������������'���������������������ȿ��ȯ������������������������˨��ʨ������������������������������̣��ɦ�����������������������������ת��Ӫ���������������������������������������������������������������嵴�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Ϳ�������������������������������������������������������������������������������	���������������������������������������������������������������~��~�������������|���||�|�|������������{{�z�{�z	���{�{z{�{�z{z{�����������{{�z�{�z	{��{�{z{�{�z{z{�������������x�y�x���xx�yxx�x��������������w�x�w	x������������������vu�v
�������������������
�������������������������������������ʯ�����������������������'���������������������ȿ��ȯ������������������������˨��ʨ������������������������������̣��ɦ�����������������������������ת��Ӫ���������������������������������������������������������������嵴�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Ϳ�������������������������������������������������������������������������������	����������������������������������������������������������������������~��~��������������|��|��|���|������������{{�z�{zz{z{{�{z{z{�zz{z{�����������{{�z�{zz�z{{�{z{z{�zz{z{�������������xy��~�x�y�x��������������w�x�w	x������������������vu�v
�������������������
�������������������������������������ʯ�����������������������'���������������������ȿ��ȯ������������������������˨��ʨ������������������������������̣��ɦ�����������������������������ת��Ӫ���������������������������������������������������������������嵴�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Ϳ�������������������������������������������������������������������������������	���������������������������������������������������撽��������������������~�̼�����������������|��|�ܻ���|��|��|������������{{�z��z���|��z��z�z{z{�����������{{�z��䄸�z��z���z{z{�������������xy���x�z�{x��yy�x��������������w��ww�x�yxw���w	x������������������v�w�v
�������������������
�������������������������������������ʯ�����������������������'���������������������ȿ��ȯ������������������������˨��ʨ������������������������������̣��ɦ�����������������������������ת��Ӫ���������������������������������������������������������������嵴�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Ϳ����������������������������������������������������������������}�~}~}~~}�~}~�}�~	}���������{�{���������wx�w�xwx�w�x�xx�w�����������t�t��t�����t�t�����������r���r�ύ�r��r�r�����������onnoo��oo�on�on�o�o
n������������onnoo��oo�on�on�o�on�����������mmll�ߟ�m�mm�ml�l�lmlm�������������jއj��j�jj�kj�j�j��������������i�j�i	j����������������~�hg�h
s������������������
����������������������������������������������������������'�������������������Ѧ��������������������������ﱷ������������������������������������������������������������������Ǧ�����
��������������"�������������������������������������������������럨����������������������캛���������߮��������������������������ڧ������������"�ƛ��������ӭ��������ӧ�����������������������
桛����������������������������������ƛ��������������������������������ӛ�������������Ӯ��������������������������������������������߮���������������������������������������������������������������������������������������������������������������������������������Ϳ�������������������������������������������������������������������������������	��������������������������������������������������������������������
�������������������������������������������������������������������������������������������������������������	�����������������������
�������������������
���������������������������������������������������������'����������������������������������������������������������������������������������������������������������������������������
��������������"�������������������������������������������������������������������������������������������������������������������������������������������������������������������b�6a�����������������a�X=��������������a�X`������������4C@FH�F�D�C�B�A�@?FCC4���������������4CQ�CQC4����������������2BBJ�#$JBB4��������������1DDI%�/)I==2������0CCI%�;���;/I;;0��������������0BBI%�F��F4I::/��������/AAJ%�8�����8/J99/�����������.@@I%�F���F6I88.��������->>H&�A���A5H66-�����������,>>H&�A�����A5H66-��������	+>>H&1148���ϼ8�4.H55+�������)==G&�>@K���L�A	7G44)����������(;;G&�:Q���Q�:4G22(��������(::F&�6^�^�61F11(��������':Q:�X:Q1'���������'�6�5�4�2�10�/'����������&:6:5544�2�1�0�/.2..&������%&%%&%%&�%&%&&%���Ϳ�������������������������������������������������������������������������������	�������������������������������������������������摦������������������菏���奏収��	���������������������䌌������������������䊋��䊋��������������䉟������㈟������������
��������������������������������������������������������
�������������������
���������������������������������������������������������'����������������������������������������������������������������������������������������������������������������������������
��������������"�������������������������������������������������������������������������������������������������������������������������������������������������������������������b�6a�����������������a�X=��������������a�X`������������4C@FH�F�D�C�B�A�@?FCC4���������������4CQ�CQC4����������������2BBJ�#$JBB4��������������1DDI%�/)I==2������0CCI%�;���;/I;;0��������������0BBI%�F��F4I::/��������/AAJ%�8�����8/J99/�����������.@@I%�F���F6I88.��������->>H&�A���A5H66-�����������,>>H&�A�����A5H66-��������	+>>H&1148���ϼ8�4.H55+�������)==G&�>@K���L�A	7G44)����������(;;G&�:Q���Q�:4G22(��������(::F&�6^�^�61F11(��������':Q:�X:Q1'���������'�6�5�4�2�10�/'����������&:6:5544�2�1�0�/.2..&������%&%%&%%&�%&%&&%���Ϳ�������������������������������������������������������������������������������	�������������������������������������������������������������������叏���ܥ��줏�	������������������������������������䋋�������������������䉈��������������������������������������������������	�����������������������
�������������������
���������������������������������������������������������'����������������������������������������������������������������������������������������������������������������������������
��������������"�������������������������������������������������������������������������������������������������������������������������������������������������������������������b�6a�����������������a�X=��������������a�X`������������4C@FH�F�D�C�B�A�@?FCC4���������������4CQ�CQC4����������������2BBJ�#$JBB4��������������1DDI%�/)I==2������0CCI%�;���;/I;;0��������������0BBI%�F��F4I::/��������/AAJ%�8�����8/J99/�����������.@@I%�F���F6I88.��������->>H&�A���A5H66-�����������,>>H&�A�����A5H66-��������	+>>H&1148���ϼ8�4.H55+�������)==G&�>@K���L�A	7G44)����������(;;G&�:Q���Q�:4G22(��������(::F&�6^�^�61F11(��������':Q:�X:Q1'���������'�6�5�4�2�10�/'����������&:6:5544�2�1�0�/.2..&������%&%%&%%&�%&%&&%���Ϳ�������������������������������������������������������������������������������	����������������������������������������������摦������������������奏��������������������������������������������������������������������㈉�����������������
��������������������������	�����������������������
�������������������
���������������������������������������������������������'����������������������������������������������������������������������������������������������������������������������������
��������������"�������������������������������������������������������������������������������������������������������������������������������������������������������������������b�6a�����������������a�X=��������������a�X`������������4C@FH�F�D�C�B�A�@?FCC4���������������4CQ�CQC4����������������2BBJ�#$JBB4��������������1DDI%�/)I==2������0CCI%�;���;/I;;0��������������0BBI%�F��F4I::/��������/AAJ%�8�����8/J99/�����������.@@I%�F���F6I88.��������->>H&�A���A5H66-�����������,>>H&�A�����A5H66-��������	+>>H&1148���ϼ8�4.H55+�������)==G&�>@K���L�A	7G44)����������(;;G&�:Q���Q�:4G22(��������(::F&�6^�^�61F11(��������':Q:�X:Q1'���������'�6�5�4�2�10�/'����������&:6:5544�2�1�0�/.2..&������%&%%&%%&�%&%&&%�����Ϳ����������������������������������������������������h��������&�'
&''&'&''&'&'&'�&'&''��������$��$������� ���   � ����������������������������������
��������������������
�������������������
���������������������������������������
������
�

��
������������"












����������������
��

�



�

,������������������
����������������������������������������������������������'���������������������έ��������������������������\RTU������������������������������XGJMNN���������������������������I@ACFHJ����������������"��������������N@?@@ADS������������������������h@@??D�����������������������������@C���������������������������O�@A���������������������������@??@y����������������������Z�?@�������������������������?@�BD��������������x�?A�����������������������A�?A������������������?A������������������Q�?D�EF����������������?�����������E�?B������������������v�?�����������>�?F���������������N>?�>�����������?�>x���������������??�>w���������?�>E���������>?`�������������������������������������������������Ϳ�����������������������������������������������������������������������������������������������������������������������������������������������������������������������(����������������������������������������������������������������������������������������������������������
��������������������������� ��������������������������������������������������������������������������������������
�����������������
��������������������������������������������"������������������������������������������������������������������������	�������������������������������������������������������������������������������������������������������������������������������������������������!��������������������������������	�����������������������������������
������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������,������ 6������ 6������ !� �!� 6������ � � 6������ _F� >dsthH!� 6������ U��Y#� !h����x! 6������ ��X� !+����' 6������ z���&� +���6������ 4��Y� ������f6������ ����� h���nRh����5������ !T����<� ��������/1������ ���� 0��0  !B����D0������ |���'� !����� +��O/������ 5��d� #[�6� 0��G/������ ������ !� O����51������ U����F�� ���� 4�����  ��	�|��ѹ/� !I��6�����  {���,����>� !1���96����� 5�p!���=� =��� 6���������'���=� [�� 6�����U����O!1��=� !�����!  6�����!���  D����=� !&����� 6�����z���)O��
�5  !1���n� 6���������:�H=~��	�_BI) ,���F� 6�����������������i����&� 6�������vt���!� 6�������v#��� !� 6���������������kX���b� 6�����0O�ND����dIL'����bB�IL:6������d���5����������'2������ i���= ���,2������ i���= #���+2������ i���= &���+2������ n���= !����̙5������ 9����}'  �6������ !�� � 6������ 6������ 6������ 6������ 2�����)�65I���������������������<������������7������������i������-������H
,���5n���^���0	tءb$
S2u��;:���
��
��\�	$��������/���	����
���{���#��������c�
f�����l3>���Ha_����$�j
R��j��
�,�����#��BM��		[x

E������� !��"�����

	�

��C�����c�	������	�ʏ� }��֦N��B������!�D		V������s������M��[-���
�;�������2��t�!��
�

^�r����
@�l	-������)�	��)pŏ����c�����
���s�8c��J�/
Z�������%�	
��,s����Ť
��	�/
g�e�	��'"	���(����"w��������	^��D	����`�����=�� �i��ɤ��# �k������
��2�����i�
		6������	���;	�

��������kJ�*�����0��	�
P����"�`	C
	oM );������N�� �	�*#��$�8&�`G�{,~�������!"�	����Qp�����j	�C��9Q�� �����#�e��<��:
������	��
�p�`��.�
�������*�9"���Y�
#��������XC������h&�����
Z����;+#n����%>����+���|'
:�����Y�����������������������������������������r���G���"����������������������������������������������������������������������������������������������������������������!�*��2@AABCE�@2�����������������%�������������`��*������������������������
�������
��������	��������������������������������������������������������������������������'e�܂$��	$99:;;=�9=;;:99$���������������������%�����������`��*�������*���i���i���k���|��	��������������$�����Z�������������������������M�������������������������e����Q��0 �$99:;;=�9	=;;:99$&��������������������������������������r���G���"��������������������������������������������������������������������������������������������������������������*���@22@AABCE�@2����������������������������r��G��"������������������������������������������������������������������������������!�*�2@AABCE�@2��������������������������������r���G���"��������������������������������������������������������������������������������������������������������������*���@22@AABCE�@2��������������������������������r���G���"�����������������������������������������������������������������������������������������B�������3����������������������*�'�����H�@^J�@2����J��������������������������������r���G���"�����������������������������������������������������������������������*��@22@AABCE�@2����������������������������r��G��"������������������������������������������������������������������������������!�*�2@AABCE�@2����������������������������r��G��"�����������������������������	�������������������������������������������������!�*�2@AABCE�@2���������������������������������r���G���"����������������������������������������������������������������������������������������������������������������!�*��2@AABCE�@2���������������������������r��G��"��������������������������������������������������������������������������������������������������������!�*�2@AABCE�@2����������������������������r��G��"���������������������������������������������������������������������������������������������������������!�*�2@AABCE�@2����������������������������r��G��"���������������������������������������������������������������������������������������������������������!�*�2@AABCE�@2����������������������������r��G��"���������������������������������������������������������������������������������������������������������!�*�2@AABCE�@2����������������������������r��G��"���������������������������������������������������������������������������������������������������������!�*�2@AABCE�@2����������������������������r��G��"���������������������������������������������������������������������������������������������������������!�*�2@AABCE�@2����������������������������r��G��"���������������������������������������������������������������������������������������������������������!�*�2@AABCE�@2����������������������������r��G��"���������������������������������������������������������������������������������������������������������!�*�2@AABCE�@2����������������������������r��G��"���������������������������������������������������������������������������������������������������������!�*�2@AABCE�@2����������������������������r��G��"���������������������������������������������������������������������������������������������������������!�*�2@AABCE�@2����������������������������r��G��"�������������������������������������������������8����8���������������������������������������������������������*���@22@AABCE�@2����������������������������r��G��"�������������������������������������������������8����8���������������������������������������������������������*���@22@AABCE�@2����������������������������r��G��"�������������������������������������������������8����8���������������������������������������������������������*���@22@AABCE�@2����������������������������r��G��"�������������������������������������������������8����8���������������������������������������������������������*��p�@22@AABCE�@2���������������������������r��G��"��������������������������������������������������������������������������������������������������������!�*�2@AABCE�@2������9������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������$�"����Cri,�6�����F��k��G�4����1u�X��`��/�v����`�'����[���Z1@���y;/X����x��j��������}������{��0�������U��\�����[�����&��������T��W���8��[���I�������,������k���1�!���QR���#�����������V#���3�Q���&�3���{	�����R��!���^�����!�����!�����M��9����F��������f��A�����:������!���s���������2���ި���������������������������������img/src/icons-small.psd000064400000630665151215013440011054 0ustar008BPS@{�8BIMZ%G8BIM%��}�Ǿ	pv���N8BIM$P�<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        ">
   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <rdf:Description rdf:about=""
            xmlns:xmp="http://ns.adobe.com/xap/1.0/">
         <xmp:CreatorTool>Adobe Photoshop CS5 Macintosh</xmp:CreatorTool>
         <xmp:CreateDate>2011-01-20T17:47+03:00</xmp:CreateDate>
         <xmp:ModifyDate>2011-02-04T15:33:45+03:00</xmp:ModifyDate>
         <xmp:MetadataDate>2011-02-04T15:33:45+03:00</xmp:MetadataDate>
      </rdf:Description>
      <rdf:Description rdf:about=""
            xmlns:dc="http://purl.org/dc/elements/1.1/">
         <dc:format>application/vnd.adobe.photoshop</dc:format>
      </rdf:Description>
      <rdf:Description rdf:about=""
            xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/">
         <photoshop:ColorMode>3</photoshop:ColorMode>
         <photoshop:ICCProfile>sRGB IEC61966-2.1</photoshop:ICCProfile>
         <photoshop:DocumentAncestors>
            <rdf:Bag>
               <rdf:li>xmp.did:018011740720681188E6C239B0A8A931</rdf:li>
            </rdf:Bag>
         </photoshop:DocumentAncestors>
      </rdf:Description>
      <rdf:Description rdf:about=""
            xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
            xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#">
         <xmpMM:InstanceID>xmp.iid:C7C4172C0E206811A3A3FC4A228C975D</xmpMM:InstanceID>
         <xmpMM:DocumentID>xmp.did:018011740720681188E6C239B0A8A931</xmpMM:DocumentID>
         <xmpMM:OriginalDocumentID>xmp.did:018011740720681188E6C239B0A8A931</xmpMM:OriginalDocumentID>
         <xmpMM:History>
            <rdf:Seq>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>created</stEvt:action>
                  <stEvt:instanceID>xmp.iid:018011740720681188E6C239B0A8A931</stEvt:instanceID>
                  <stEvt:when>2011-01-20T17:47+03:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>converted</stEvt:action>
                  <stEvt:parameters>from image/png to application/vnd.adobe.photoshop</stEvt:parameters>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:028011740720681188E6C239B0A8A931</stEvt:instanceID>
                  <stEvt:when>2011-02-03T20:28:49+03:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:038011740720681188E6C239B0A8A931</stEvt:instanceID>
                  <stEvt:when>2011-02-03T20:44:05+03:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:048011740720681188E6C239B0A8A931</stEvt:instanceID>
                  <stEvt:when>2011-02-03T20:47:19+03:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:0480117407206811A3A3FC4A228C975D</stEvt:instanceID>
                  <stEvt:when>2011-02-04T14:56:04+03:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:0580117407206811A3A3FC4A228C975D</stEvt:instanceID>
                  <stEvt:when>2011-02-04T14:56:54+03:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:0680117407206811A3A3FC4A228C975D</stEvt:instanceID>
                  <stEvt:when>2011-02-04T14:57:23+03:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:0780117407206811A3A3FC4A228C975D</stEvt:instanceID>
                  <stEvt:when>2011-02-04T14:58:19+03:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:0880117407206811A3A3FC4A228C975D</stEvt:instanceID>
                  <stEvt:when>2011-02-04T15:04:56+03:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:0980117407206811A3A3FC4A228C975D</stEvt:instanceID>
                  <stEvt:when>2011-02-04T15:06:13+03:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:0A80117407206811A3A3FC4A228C975D</stEvt:instanceID>
                  <stEvt:when>2011-02-04T15:19:11+03:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:C4C4172C0E206811A3A3FC4A228C975D</stEvt:instanceID>
                  <stEvt:when>2011-02-04T15:21+03:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:C5C4172C0E206811A3A3FC4A228C975D</stEvt:instanceID>
                  <stEvt:when>2011-02-04T15:23:53+03:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:C6C4172C0E206811A3A3FC4A228C975D</stEvt:instanceID>
                  <stEvt:when>2011-02-04T15:32:31+03:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
               <rdf:li rdf:parseType="Resource">
                  <stEvt:action>saved</stEvt:action>
                  <stEvt:instanceID>xmp.iid:C7C4172C0E206811A3A3FC4A228C975D</stEvt:instanceID>
                  <stEvt:when>2011-02-04T15:33:45+03:00</stEvt:when>
                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>
                  <stEvt:changed>/</stEvt:changed>
               </rdf:li>
            </rdf:Seq>
         </xmpMM:History>
      </rdf:Description>
   </rdf:RDF>
</x:xmpmeta>
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                            
<?xpacket end="w"?>8BIM:�printOutputClrSenumClrSRGBCInteenumInteClrmMpBlboolprintSixteenBitboolprinterNameTEXT8BIM;�printOutputOptionsCptnboolClbrboolRgsMboolCrnCboolCntCboolLblsboolNgtvboolEmlDboolIntrboolBckgObjcRGBCRd  doub@o�Grn doub@o�Bl  doub@o�BrdTUntF#RltBld UntF#RltRsltUntF#Pxl@R��
vectorDataboolPgPsenumPgPsPgPCLeftUntF#RltTop UntF#RltScl UntF#Prc@Y8BIM�HNHN8BIM&?�8BIM�
Transparency8BIM
Transparency8BIM���d8BIM5��d8BIM8BIM�
������8BIM
8BIM8BIM�	8BIM'
8BIM�H/fflff/ff���2Z5-8BIM�p��������������������������������������������������������������������������������������������8BIM8BIM>8BIM08BIM-8BIM@@X8BIM6�nullVrsnlongenabbool	numBeforelongnumAfterlongSpcnlong
minOpacitylong
maxOpacitylong2BlnMlong8BIM3null
Vrsnlong	frameStepObjcnull	numeratorlongdenominatorlongX	frameRatedoub@>timeObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongpdenominatorlongX
workInTimeObjcnull	numeratorlongdenominatorlongXworkOutTimeObjcnull	numeratorlongpdenominatorlongXLCntlongglobalTrackListVlLs	hasMotionbool8BIM4FnullVrsnlongsheetTimelineOptionsVlLs8BIM8BIM�nullbaseNameTEXTUserboundsObjcRct1Top longLeftlongBtomlong@RghtlongslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenumESliceOrigin
autoGeneratedTypeenum
ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlong@RghtlongurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT	horzAlignenumESliceHorzAligndefault	vertAlignenumESliceVertAligndefaultbgColorTypeenumESliceBGColorTypeNone	topOutsetlong
leftOutsetlongbottomOutsetlongrightOutsetlong8BIM(?�8BIMHHLinomntrRGB XYZ �	1acspMSFTIEC sRGB���-HP  cprtP3desc�lwtpt�bkptrXYZgXYZ,bXYZ@dmndTpdmdd��vuedL�view�$lumi�meas$tech0rTRC<gTRC<bTRC<textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ �Q�XYZ XYZ o�8��XYZ b����XYZ $����descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view��_.���\�XYZ L	VPW�meas�sig CRT curv
#(-27;@EJOTY^chmrw|�������������������������
%+28>ELRY`gnu|����������������&/8AKT]gqz������������!-8COZfr~���������� -;HUcq~���������
+:IXgw��������'7HYj{�������+=Oat�������2FZn�������		%	:	O	d	y	�	�	�	�	�	�

'
=
T
j
�
�
�
�
�
�"9Qi������*C\u�����


&
@
Z
t
�
�
�
�
�.Id����	%A^z����	&Ca~����1Om����&Ed����#Cc����'Ij����4Vx���&Il����Ae����@e���� Ek���*Qw���;c���*R{���Gp���@j���>i���  A l � � �!!H!u!�!�!�"'"U"�"�"�#
#8#f#�#�#�$$M$|$�$�%	%8%h%�%�%�&'&W&�&�&�''I'z'�'�(
(?(q(�(�))8)k)�)�**5*h*�*�++6+i+�+�,,9,n,�,�--A-v-�-�..L.�.�.�/$/Z/�/�/�050l0�0�11J1�1�1�2*2c2�2�3
3F33�3�4+4e4�4�55M5�5�5�676r6�6�7$7`7�7�88P8�8�99B99�9�:6:t:�:�;-;k;�;�<'<e<�<�="=a=�=�> >`>�>�?!?a?�?�@#@d@�@�A)AjA�A�B0BrB�B�C:C}C�DDGD�D�EEUE�E�F"FgF�F�G5G{G�HHKH�H�IIcI�I�J7J}J�KKSK�K�L*LrL�MMJM�M�N%NnN�OOIO�O�P'PqP�QQPQ�Q�R1R|R�SS_S�S�TBT�T�U(UuU�VV\V�V�WDW�W�X/X}X�YYiY�ZZVZ�Z�[E[�[�\5\�\�]']x]�^^l^�__a_�``W`�`�aOa�a�bIb�b�cCc�c�d@d�d�e=e�e�f=f�f�g=g�g�h?h�h�iCi�i�jHj�j�kOk�k�lWl�mm`m�nnkn�ooxo�p+p�p�q:q�q�rKr�ss]s�ttpt�u(u�u�v>v�v�wVw�xxnx�y*y�y�zFz�{{c{�|!|�|�}A}�~~b~�#��G���
�k�͂0����W�������G����r�ׇ;����i�Ή3�����d�ʋ0�����c�ʍ1�����f�Ώ6����n�֑?����z��M��� ����_�ɖ4���
�u��L���$�����h�՛B��������d�Ҟ@��������i�ءG���&����v��V�ǥ8��������n��R�ĩ7�������u��\�ЭD���-�������u��`�ֲK�³8���%�������y��h��Y�ѹJ�º;���.���!������
�����z���p��g���_���X���Q���K���F���Aǿ�=ȼ�:ɹ�8ʷ�6˶�5̵�5͵�6ζ�7ϸ�9к�<Ѿ�?��D���I���N���U���\���d���l���v�ۀ�܊�ݖ�ޢ�)߯�6��D���S���c���s���
����2��F���[���p�����(��@���X���r�����4��P��m��������8��W��w����)���K��m��8BIM,8BIM������Adobe_CM��Adobed����			



���"����?	
	
3!1AQa"q�2���B#$R�b34r��C%�S���cs5���&D�TdE£t6�U�e���u��F'������������Vfv�������7GWgw�������5!1AQaq"2����B#�R��3$b�r��CScs4�%���&5��D�T�dEU6te����u��F������������Vfv�������'7GWgw������?�~�ҿ����~o�:������ޯ�?��ԕ��s��`�v�ٍ���
��SW�Jϥ����$���sr~��-�?����R^O�'�w����~�z����X����vϥ��K3��?�I���}����_�R{����c��_u�;�7�A���=c���7?F�?����D��wП�O�?�RS���,�����M�_�"���gw����Cƞ<�ޒ��p�����������G�S�	���_�/�	+���~����"J,�c��߯��p������-�G�+)�?��w������o�=��e}	��m9��$���#���>����=�X����v�?�{�%%��n���y_���o���	#ŏ���З��v?�d_��T�I%?��T�I%?��8BIM!UAdobe PhotoshopAdobe Photoshop CS58BIM".MM*bj(1r2��i��
��'
��'Adobe Photoshop CS5 Macintosh2011:02:04 15:33:45���@&(.HH8BIM��mopt������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������4TargetSettingsMttCObjc
NativeQuadBl  long�Grn long�Rd  long�Trnsbool
fileFormatenum
FileFormatPNG24
interlacedboolnoMatteColorbooltransparencyDitherAlgorithmenumDitherAlgorithmNonetransparencyDitherAmountlong8BIM��msetnullHTMLBackgroundSettingsObjcnullBackgroundColorBluelong�BackgroundColorGreenlong�BackgroundColorRedlong�BackgroundColorStatelongBackgroundImagePathTEXTUseImageAsBackgroundboolHTMLSettingsObjcnullAlwaysAddAltAttributebool
AttributeCaselongCloseAllTagsboolEncodinglongFileSavingSettingsObjcnull
CopyBackgroundboolDuplicateFileNameBehaviorlongHtmlFileNameComponentsVlLslonglonglonglonglonglongImageSubfolderNameTEXTimagesNameCompatibilityObjcnull
NameCompatMacboolNameCompatUNIXboolNameCompatWindowsboolOutputMultipleFilesboolSavingFileNameComponentsVlLs	longlonglonglonglonglonglonglonglongSliceFileNameComponentsVlLslonglonglonglonglonglongUseImageSubfolderboolUseLongExtensionsboolGoLiveCompatibleboolImageMapLocationlongImageMapTypelongIncludeCommentsboolIncludeZeroMarginsboolIndentlong����LineEndingslongOutputXHTMLboolQuoteAllAttributesboolSpacersEmptyCellslongSpacersHorizontallongSpacersVerticallongStylesFormatlong
TDWidthHeightlongTagCaselongUseCSSboolUseLongHTMLExtensionboolMetadataOutputSettingsObjcnullAddCustomIRboolAddEXIFboolAddXMPboolAddXMPSourceFileURIboolColorPolicylongMetadataPolicylongWriteMinimalXMPboolWriteXMPToSidecarFilesboolVersionlong8BIM�ms4w8BIM�maniIRFR8BIMAnDs�nullAFStlongFrInVlLsObjcnullFrIDlonge>wFrDllong�FrGAdoub@>FStsVlLsObjcnullFsIDlongAFrmlongFsFrVlLslonge>wLCntlong8BIMRoll8BIM�mfriD�8���o��5U~[8BIMnorm�
<(��������������������Layer 08BIMluniLayer 08BIMlnsrlayr8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�R�]{�8BIMfxrp?�@a�����J���8BIMnorm�
8(��������������������application8BIMluniapplication8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�R�o��8BIMfxrp�G����Y���8BIMnorm�(��������������������file_extension_exe8BIMluni(file_extension_exe8BIMlnsrrend8BIMlyid	8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�R��ܩ�8BIMPlLdxplcL$c483e490-7049-1173-895f-b3229314356c@b�@0@b�@0@d�@d�warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@08BIMSoLdsoLDnullIdntTEXT%c483e490-7049-1173-895f-b3229314356cplacedTEXT%d6d3c99b-70e6-1173-9870-930db18117f2PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoubdoub@b�doub@0doub@b�doub@0doub@d�doubdoub@d�nonAffineTransformVlLsdoubdoub@b�doub@0doub@b�doub@0doub@d�doubdoub@d�warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@0Sz  ObjcPnt Wdthdoub@0Hghtdoub@0RsltUntF#Rsl@R8BIMfxrp@b�����Y���8BIMnorm�(��������������������file_extension_txt8BIMluni(file_extension_txt8BIMlnsrrend8BIMlyid
8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�R��ɌX8BIMPlLdxplcL$c5d8d499-7049-1173-895f-b3229314356c@i @0@i @0@k @k warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@08BIMSoLdsoLDnullIdntTEXT%c5d8d499-7049-1173-895f-b3229314356cplacedTEXT%eddf1ce2-70e4-1173-9870-930db18117f2PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoubdoub@i doub@0doub@i doub@0doub@k doubdoub@k nonAffineTransformVlLsdoubdoub@i doub@0doub@i doub@0doub@k doubdoub@k warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@0Sz  ObjcPnt Wdthdoub@0Hghtdoub@0RsltUntF#Rsl@R8BIMfxrp@i _o��Y���8BIMnorm�(��������������������file_extension_mp48BIMluni(file_extension_mp48BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�R����8BIMPlLdxplcL$14ebc9c7-704b-1173-895f-b3229314356c��@u�@.@u�@.@v���@v�warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@08BIMSoLdsoLDnullIdntTEXT%14ebc9c7-704b-1173-895f-b3229314356cplacedTEXT%40b0444b-70e9-1173-9870-930db18117f2PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoub��doub@u�doub@.doub@u�doub@.doub@v�doub��doub@v�nonAffineTransformVlLsdoub��doub@u�doub@.doub@u�doub@.doub@v�doub��doub@v�warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@0Sz  ObjcPnt Wdthdoub@0Hghtdoub@0RsltUntF#Rsl@R8BIMfxrp��@u�^n��Y���8BIMnorm�
(��������������������file_extension_mpeg8BIMluni,file_extension_mpeg8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�R���8BIMPlLdxplcL$29a1d44e-704b-1173-895f-b3229314356c@u�@0@u�@0@v�@v�warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@08BIMSoLdsoLDnullIdntTEXT%29a1d44e-704b-1173-895f-b3229314356cplacedTEXT%394b586f-70e5-1173-9870-930db18117f2PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoubdoub@u�doub@0doub@u�doub@0doub@v�doubdoub@v�nonAffineTransformVlLsdoubdoub@u�doub@0doub@u�doub@0doub@v�doubdoub@v�warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@0Sz  ObjcPnt Wdthdoub@0Hghtdoub@0RsltUntF#Rsl@R8BIMfxrp@u�����Y���8BIMnorm�(��������������������file_extension_pdf8BIMluni(file_extension_pdf8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�R���a8BIMPlLdxplcL$3b187f9a-704b-1173-895f-b3229314356c��@|0@.@|0@.@}0��@}0warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@08BIMSoLdsoLDnullIdntTEXT%3b187f9a-704b-1173-895f-b3229314356cplacedTEXT%9658e37c-70e5-1173-9870-930db18117f2PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoub��doub@|0doub@.doub@|0doub@.doub@}0doub��doub@}0nonAffineTransformVlLsdoub��doub@|0doub@.doub@|0doub@.doub@}0doub��doub@}0warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@0Sz  ObjcPnt Wdthdoub@0Hghtdoub@0RsltUntF#Rsl@R8BIMfxrp��@|0����Y���8BIMnorm�(��������������������file_extension_rtf8BIMluni(file_extension_rtf8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�R���8BIMPlLdxplcL$3d2e709b-704b-1173-895f-b3229314356c@y@0@y@0@z@zwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@08BIMSoLdsoLDnullIdntTEXT%3d2e709b-704b-1173-895f-b3229314356cplacedTEXT%9658e37f-70e5-1173-9870-930db18117f2PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoubdoub@ydoub@0doub@ydoub@0doub@zdoubdoub@znonAffineTransformVlLsdoubdoub@ydoub@0doub@ydoub@0doub@zdoubdoub@zwarpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@0Sz  ObjcPnt Wdthdoub@0Hghtdoub@0RsltUntF#Rsl@R8BIMfxrp@y����Y���8BIMnorm�(��������������������file_extension_ace8BIMluni(file_extension_ace8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�R���-�8BIMPlLdxplcL$919ca3ae-704b-1173-895f-b3229314356c@��@0@��@0@�@�warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@08BIMSoLdsoLDnullIdntTEXT%919ca3ae-704b-1173-895f-b3229314356cplacedTEXT%40b04448-70e9-1173-9870-930db18117f2PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoubdoub@��doub@0doub@��doub@0doub@�doubdoub@�nonAffineTransformVlLsdoubdoub@��doub@0doub@��doub@0doub@�doubdoub@�warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@0Sz  ObjcPnt Wdthdoub@0Hghtdoub@0RsltUntF#Rsl@R8BIMfxrp@������Y���8BIMnorm�(��������������������file_extension_ptb8BIMluni(file_extension_ptb8BIMlnsrrend8BIMlyid'8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�R�S��q8BIMPlLdxplcL$b153c44e-70e8-1173-9870-930db18117f2@�P@0@�P@0@��@��warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@08BIMSoLdsoLDnullIdntTEXT%b153c44e-70e8-1173-9870-930db18117f2placedTEXT%b153c44f-70e8-1173-9870-930db18117f2PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoubdoub@�Pdoub@0doub@�Pdoub@0doub@��doubdoub@��nonAffineTransformVlLsdoubdoub@�Pdoub@0doub@�Pdoub@0doub@��doubdoub@��warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@0Sz  ObjcPnt Wdthdoub@0Hghtdoub@0RsltUntF#Rsl@R8BIMfxrp@�P����Y���8BIMnorm�(��������������������file_extension_ptb copy8BIMluni4file_extension_ptb copy8BIMlnsrrend8BIMlyid(8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�R�a*��8BIMPlLdxplcL$b153c44e-70e8-1173-9870-930db18117f2@��@0@��@0@�h@�hwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@08BIMSoLdsoLDnullIdntTEXT%b153c44e-70e8-1173-9870-930db18117f2placedTEXT%eff5c546-70e8-1173-9870-930db18117f2PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoubdoub@��doub@0doub@��doub@0doub@�hdoubdoub@�hnonAffineTransformVlLsdoubdoub@��doub@0doub@��doub@0doub@�hdoubdoub@�hwarpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@0Sz  ObjcPnt Wdthdoub@0Hghtdoub@0RsltUntF#Rsl@R8BIMfxrp@������Y���8BIMnorm�(��������������������file_extension_ptb copy 28BIMluni8file_extension_ptb copy 28BIMlnsrrend8BIMlyid)8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�R�dL��8BIMPlLdxplcL$b153c44e-70e8-1173-9870-930db18117f2@�x@0@�x@0@��@��warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@08BIMSoLdsoLDnullIdntTEXT%b153c44e-70e8-1173-9870-930db18117f2placedTEXT%12d74bf7-70e9-1173-9870-930db18117f2PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoubdoub@�xdoub@0doub@�xdoub@0doub@��doubdoub@��nonAffineTransformVlLsdoubdoub@�xdoub@0doub@�xdoub@0doub@��doubdoub@��warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@0Sz  ObjcPnt Wdthdoub@0Hghtdoub@0RsltUntF#Rsl@R8BIMfxrp@�x 0��Y���8BIMnorm�(��������������������file_extension_ptb copy 38BIMluni8file_extension_ptb copy 38BIMlnsrrend8BIMlyid*8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�R�kaq�8BIMPlLdxplcL$b153c44e-70e8-1173-9870-930db18117f2@�@0@�@0@��@��warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@08BIMSoLdsoLDnullIdntTEXT%b153c44e-70e8-1173-9870-930db18117f2placedTEXT%23f46844-70e9-1173-9870-930db18117f2PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoubdoub@�doub@0doub@�doub@0doub@��doubdoub@��nonAffineTransformVlLsdoubdoub@�doub@0doub@�doub@0doub@��doubdoub@��warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@0Sz  ObjcPnt Wdthdoub@0Hghtdoub@0RsltUntF#Rsl@R8BIMfxrp@�����Y���8BIMnorm�(��������������������file_extension_ptb copy 48BIMluni8file_extension_ptb copy 48BIMlnsrrend8BIMlyid+8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�R�qA��8BIMPlLdxplcL$b153c44e-70e8-1173-9870-930db18117f2@� @0@� @0@��@��warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@08BIMSoLdsoLDnullIdntTEXT%b153c44e-70e8-1173-9870-930db18117f2placedTEXT%2765d4fa-70e9-1173-9870-930db18117f2PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoubdoub@� doub@0doub@� doub@0doub@��doubdoub@��nonAffineTransformVlLsdoubdoub@� doub@0doub@� doub@0doub@��doubdoub@��warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@0Sz  ObjcPnt Wdthdoub@0Hghtdoub@0RsltUntF#Rsl@R8BIMfxrp@� ����Y���8BIMnorm�(��������������������file_extension_ptb copy 58BIMluni8file_extension_ptb copy 58BIMlnsrrend8BIMlyid,8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�R�vG�8BIMPlLdxplcL$b153c44e-70e8-1173-9870-930db18117f2@��@0@��@0@�8@�8warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@08BIMSoLdsoLDnullIdntTEXT%b153c44e-70e8-1173-9870-930db18117f2placedTEXT%3655fd43-70e9-1173-9870-930db18117f2PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoubdoub@��doub@0doub@��doub@0doub@�8doubdoub@�8nonAffineTransformVlLsdoubdoub@��doub@0doub@��doub@0doub@�8doubdoub@�8warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@0Sz  ObjcPnt Wdthdoub@0Hghtdoub@0RsltUntF#Rsl@R8BIMfxrp@����Y���8BIMnorm�(��������������������file_extension_chm8BIMluni(file_extension_chm8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�R�t��8BIMPlLdxplcL$9e507f6c-704b-1173-895f-b3229314356c@0@0@0@0warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@08BIMSoLdsoLDnullIdntTEXT%9e507f6c-704b-1173-895f-b3229314356cplacedTEXT%de4c467a-704b-1173-895f-b3229314356cPgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoubdoubdoub@0doubdoub@0doub@0doubdoub@0nonAffineTransformVlLsdoubdoubdoub@0doubdoub@0doub@0doubdoub@0warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@0Sz  ObjcPnt Wdthdoub@0Hghtdoub@0RsltUntF#Rsl@R8BIMfxrp����Y���8BIMnorm�(��������������������file_extension_bin8BIMluni(file_extension_bin8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�R��38BIMPlLdxplcL$e17a80c3-704b-1173-895f-b3229314356c��@i @.@i @.@k ��@k warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@08BIMSoLdsoLDnullIdntTEXT%e17a80c3-704b-1173-895f-b3229314356cplacedTEXT%d7abbc97-70e5-1173-9870-930db18117f2PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoub��doub@i doub@.doub@i doub@.doub@k doub��doub@k nonAffineTransformVlLsdoub��doub@i doub@.doub@i doub@.doub@k doub��doub@k warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@0Sz  ObjcPnt Wdthdoub@0Hghtdoub@0RsltUntF#Rsl@R8BIMfxrp��@i Rb��Y���8BIMnorm�(��������������������file_extension_bat copy 38BIMluni8file_extension_bat copy 38BIMlnsrrend8BIMlyid 8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�R��Q�8BIMPlLdxplcL$a5667c38-70e6-1173-9870-930db18117f2@��@0@��@0@�@�warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@08BIMSoLdsoLDnullIdntTEXT%a5667c38-70e6-1173-9870-930db18117f2placedTEXT%9f59f49e-70e7-1173-9870-930db18117f2PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoubdoub@��doub@0doub@��doub@0doub@�doubdoub@�nonAffineTransformVlLsdoubdoub@��doub@0doub@��doub@0doub@�doubdoub@�warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@0Sz  ObjcPnt Wdthdoub@0Hghtdoub@0RsltUntF#Rsl@R8BIMfxrp@������Y���8BIMnorm�(��������������������file_extension_bin8BIMluni(file_extension_bin8BIMlnsrrend8BIMlyid#8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�R���8BIMPlLdxplcL$d5cca80a-70e7-1173-9870-930db18117f2��@�@@.@�@@.@����@��warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@08BIMSoLdsoLDnullIdntTEXT%d5cca80a-70e7-1173-9870-930db18117f2placedTEXT%064310a5-70e8-1173-9870-930db18117f2PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoub��doub@�@doub@.doub@�@doub@.doub@��doub��doub@��nonAffineTransformVlLsdoub��doub@�@doub@.doub@�@doub@.doub@��doub��doub@��warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@0Sz  ObjcPnt Wdthdoub@0Hghtdoub@0RsltUntF#Rsl@R8BIMfxrp��@�@^n��Y���8BIMnorm�(��������������������file_extension_html8BIMluni,file_extension_html8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�R����o8BIMPlLdxplcL$cc65cd91-70e6-1173-9870-930db18117f2@��@0@��@0@�p@�pwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@08BIMSoLdsoLDnullIdntTEXT%cc65cd91-70e6-1173-9870-930db18117f2placedTEXT%2dda0a16-70e7-1173-9870-930db18117f2PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoubdoub@��doub@0doub@��doub@0doub@�pdoubdoub@�pnonAffineTransformVlLsdoubdoub@��doub@0doub@��doub@0doub@�pdoubdoub@�pwarpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@0Sz  ObjcPnt Wdthdoub@0Hghtdoub@0RsltUntF#Rsl@R8BIMfxrp@�����Y���8BIMnorm�(��������������������file_extension_doc8BIMluni(file_extension_doc8BIMlnsrrend8BIMlyid
8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�R��R�78BIMPlLdxplcL$b8532814-704a-1173-895f-b3229314356c��@P@.@P@.@�(��@�(warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@08BIMSoLdsoLDnullIdntTEXT%b8532814-704a-1173-895f-b3229314356cplacedTEXT%b5ce6370-70e5-1173-9870-930db18117f2PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoub��doub@Pdoub@.doub@Pdoub@.doub@�(doub��doub@�(nonAffineTransformVlLsdoub��doub@Pdoub@.doub@Pdoub@.doub@�(doub��doub@�(warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@0Sz  ObjcPnt Wdthdoub@0Hghtdoub@0RsltUntF#Rsl@R8BIMfxrp��@P����Y���8BIMnorm�(��������������������file_extension_flv8BIMluni(file_extension_flv8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�R�6�h
8BIMPlLdxplcL$c718de88-704a-1173-895f-b3229314356c��@��@.@��@.@����@��warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@08BIMSoLdsoLDnullIdntTEXT%c718de88-704a-1173-895f-b3229314356cplacedTEXT%a483b5cc-70e8-1173-9870-930db18117f2PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoub��doub@��doub@.doub@��doub@.doub@��doub��doub@��nonAffineTransformVlLsdoub��doub@��doub@.doub@��doub@.doub@��doub��doub@��warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@0Sz  ObjcPnt Wdthdoub@0Hghtdoub@0RsltUntF#Rsl@R8BIMfxrp��@��M]��Y���8BIMnorm�(��������������������file_extension_gz8BIMluni(file_extension_gz8BIMlnsrrend8BIMlyid%8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�R���	8BIMPlLdxplcL$4e0ca1c0-70e8-1173-9870-930db18117f2@�4@0@�4@0@�t@�twarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@08BIMSoLdsoLDnullIdntTEXT%4e0ca1c0-70e8-1173-9870-930db18117f2placedTEXT%5dbedc4f-70e8-1173-9870-930db18117f2PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoubdoub@�4doub@0doub@�4doub@0doub@�tdoubdoub@�tnonAffineTransformVlLsdoubdoub@�4doub@0doub@�4doub@0doub@�tdoubdoub@�twarpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@0Sz  ObjcPnt Wdthdoub@0Hghtdoub@0RsltUntF#Rsl@R8BIMfxrp@�4~���Y���8BIMnorm�(��������������������file_extension_hqx8BIMluni(file_extension_hqx8BIMlnsrrend8BIMlyid&8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�R�1�J8BIMPlLdxplcL$9825338c-70e8-1173-9870-930db18117f2@��@0@��@0@�8@�8warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@08BIMSoLdsoLDnullIdntTEXT%9825338c-70e8-1173-9870-930db18117f2placedTEXT%99e5dd11-70e8-1173-9870-930db18117f2PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoubdoub@��doub@0doub@��doub@0doub@�8doubdoub@�8nonAffineTransformVlLsdoubdoub@��doub@0doub@��doub@0doub@�8doubdoub@�8warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@0Sz  ObjcPnt Wdthdoub@0Hghtdoub@0RsltUntF#Rsl@R8BIMfxrp@��+��Y���8BIMnorm�(��������������������file_extension_zip8BIMluni(file_extension_zip8BIMlnsrrend8BIMlyid$8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�R�
��8BIMPlLdxplcL$21f17c42-70e8-1173-9870-930db18117f2@�l@0@�l@0@��@��warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@08BIMSoLdsoLDnullIdntTEXT%21f17c42-70e8-1173-9870-930db18117f2placedTEXT%2f2545e7-70e8-1173-9870-930db18117f2PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoubdoub@�ldoub@0doub@�ldoub@0doub@��doubdoub@��nonAffineTransformVlLsdoubdoub@�ldoub@0doub@�ldoub@0doub@��doubdoub@��warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@0Sz  ObjcPnt Wdthdoub@0Hghtdoub@0RsltUntF#Rsl@R8BIMfxrp@�l'7��Y���8BIMnorm�(��������������������file_extension_htm8BIMluni(file_extension_htm8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�R��q28BIMPlLdxplcL$d6c29263-704a-1173-895f-b3229314356c@�8@0@�8@0@��@��warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@08BIMSoLdsoLDnullIdntTEXT%d6c29263-704a-1173-895f-b3229314356cplacedTEXT%d508738d-70e5-1173-9870-930db18117f2PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoubdoub@�8doub@0doub@�8doub@0doub@��doubdoub@��nonAffineTransformVlLsdoubdoub@�8doub@0doub@�8doub@0doub@��doubdoub@��warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@0Sz  ObjcPnt Wdthdoub@0Hghtdoub@0RsltUntF#Rsl@R8BIMfxrp@�8���Y���8BIMnorm�(��������������������file_extension_jpeg8BIMluni,file_extension_jpeg8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�R���8BIMPlLdxplcL$e6d2e6e0-704a-1173-895f-b3229314356c@o`@0@o`@0@p�@p�warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@08BIMSoLdsoLDnullIdntTEXT%e6d2e6e0-704a-1173-895f-b3229314356cplacedTEXT%6dccac23-70e9-1173-9870-930db18117f2PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoubdoub@o`doub@0doub@o`doub@0doub@p�doubdoub@p�nonAffineTransformVlLsdoubdoub@o`doub@0doub@o`doub@0doub@p�doubdoub@p�warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@0Sz  ObjcPnt Wdthdoub@0Hghtdoub@0RsltUntF#Rsl@R8BIMfxrp@o`-=��Y���8BIMnorm�(��������������������file_extension_m4b8BIMluni(file_extension_m4b8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�R��r<�8BIMPlLdxplcL$fdefcf69-704a-1173-895f-b3229314356c@r�@0@r�@0@s�@s�warp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@08BIMSoLdsoLDnullIdntTEXT%fdefcf69-704a-1173-895f-b3229314356cplacedTEXT%049e389e-70e5-1173-9870-930db18117f2PgNmlong
totalPageslong	frameStepObjcnull	numeratorlongdenominatorlongXdurationObjcnull	numeratorlongdenominatorlongX
frameCountlongAnntlongTypelongTrnfVlLsdoubdoub@r�doub@0doub@r�doub@0doub@s�doubdoub@s�nonAffineTransformVlLsdoubdoub@r�doub@0doub@r�doub@0doub@s�doubdoub@s�warpObjcwarp		warpStyleenum	warpStyle
warpCustom	warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub
warpRotateenumOrntHrznboundsObjcRctnTop UntF#PxlLeftUntF#PxlBtomUntF#Pxl@0RghtUntF#Pxl@0uOrderlongvOrderlongcustomEnvelopeWarpObjccustomEnvelopeWarp
meshPointsObAr
rationalPointHrznUnFl#Pxl@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0@UUUUUU@%UUUUUU@0VrtcUnFl#Pxl@UUUUUU@UUUUUU@UUUUUU@UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@%UUUUUU@0@0@0@0Sz  ObjcPnt Wdthdoub@0Hghtdoub@0RsltUntF#Rsl@R8BIMfxrp@r�fr��~���8BIMnorm�4(��������������������
dir-opened8BIMluni
dir-opened8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�R�h�^�8BIMfxrp�{�3A������8BIMnorm� (��������������������dir8BIMlunidir8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�R�:��8BIMfxrp�D��Y���8BIMnorm�
<(��������������������Layer 18BIMluniLayer 18BIMlnsrlayr8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata	layerTimedoubA�R�'���8BIMfxrp�V�







		
		




		

		



	

	�����������������������������#�3#����������������������#�3,����Z���:������������������
��{<3$���,�������
�!���������!�����������������M����M����2332M����M�2332�������������������������������������������������������3����#3"�"3#������������������������������������������j�
���E���#�3����������������������������������#�3#�����������������������j����s�z�v����3#�3"�������������F��F�F��F�����������������k��kk��k�3������3��1�31�����������������������������3&���!�����#�3#�������#������������33�4����s�������`����������3D�3�3���3��3��3��3��������������������������������� �3"��������������������0�����5�� ���3��������3 �������������������������������#33������#�3#�����������������������3����3������������#�3 3������������������������)������3��3�������3#�3"����������������������������������#�30�����������������������3�3��3�������#�3�3��������������������������������#�30����x���C������������_�������:������{���������?������K����������������������������������������������������������L������L�t��l��1sws1����
�����
������>���\���>�3���5�����z������������������������������������Th�fhT�����������������������������x��x�w����m����������������z�x��z�	


	

	
				


				


	
		
	

			
	




	��������������������������������������˥������������������������������������������������������������������������������������������������������PO�K�LOPN�������OJ���y~�~z�KI��҅��������KJ��Ԋ��������KK������������KK�������������KK������}~����KK�������������KK������������KK��������KJ�rv�xvr�JI�IM�M�LI�HILL�����9?IC�
BA@I[o��B�
Cr�qaSOC�
C]NKFB?@E�
E@>??B=7E�EB72
�E�E�E�E�E�
E>BAABD�
ECi||iC>BAABDCXPPXCCi||iCDDAADDCXPPXC�E�D�A�D��E������XS�SXX�XWY[[XVUUWWX�X�Z D]q��T�X�YV[6[u���UUY�Z�\Ip�~bSY�Z�\Y\Yplm]F]Y\�\�]U]v}dI]�\�_\`eda__`^\_�`�cC\p��]�`�a_d5[t���^^a�b�dHp�~bSb�b�dbeXolm]Dfbd�e�fS\u}dHg�e�gfhk�j�khfg�^j`�`j^�����������������������������������������������������������ʥ�����������������������������������A������	���D�������
����?����������������������8����������������������������-$�"$�$���������������������
���$�������p
�"���������������������������������������������������������� �������� �$��$�($ � $(������������������������������������������΁h�������������������������)����	��������F���/������u���q��������s&,	���������������������ٻ�������
���RU����������
\��š�J�{�㸝{��ir��ƞ��pg�m6���ʼ���<7�BWȵ�����e3&N{j��������@(�!M�������j0'm�Sg]����0,!i_HH��Z�F
 (9??@z�RwWHZ,131*!h���L#&&!H��`�

k.�� ������������������������������������������ʤ���������������������������� >="�����~=p%CM	��|���H)s��6��6���K/b���6?7�?MST+U��5���K Y"��[������>�:V2=<�����9;;(}�������������;I8
�������	��������A�4�I����"�V�������������	�	������
�����������
����������
����������'���${���������԰�����������ߒ����
�������������������������������������������г���������������������o�R���R��R���R���c�c�c���R���R�h�h��h�h�R���R���m�m�m���R���R��r�r�r�rrR���R�wR���d�RE����������������������������������������ʤ�������������������������������
���������������������������������������������������������ǭ�������������������������������������������������������������������������������������������������������	���������������������������������ݯ������������������������������������������������կ����������vz}����
�����������p������̾p��������ʾp�������̾p�
�����������p�������t{���p��������pƾp�p�����p����	���p���wpw�����������������������������������������Ψ���������������������������	���������	�����=��������qeK�����������������
{����������r�����Ī�M��������������������������������������������������ͨ��������������������W������������
�I������
����������
���5/l�
����
���3���������B�������
������L�	�
����������������������������������������ʤ�����������������������
�$ ��'5>����
���(*��<����
�"k�1t8�������,t�5�����
���$�2y�9?B����
��!�~�6�;���%/1232��?����
��������5=@����������������������������������������������������������������������������������������
����������������������������������������������������������������������������ݥo������f(����$���`�����j���C���L��}���ƅ��QA���U�����������
XyvjO:�l�÷��U �T���ޙ�L�s���薚U�l������S�g����ՏY�P���Ֆ�K�/\��ƚ�X/�5TnkoR4��*-*����;�����;������Ι�o��o=o��s�7�����W������ʬ������������˖�������B��������v��������������������[Z�dZ[X�����������������������������ÿ��������ʹ�������������������ݼ��ø����
	
	


		
		



	
		


				
	


	
	
	


	


	
	
	
	




	�������������������������������������̧������������������������������������������������������������������������������������������������������������������������������������������ʾ�����������خ�����������ٹ������������ݟ������������߿���������������e���������	��?��������������������������������������}������������twwz{�
wzv~����y�
z��ø���z�
z�������|�
{��~|{r`}�}xkU�}�}�}�}�}�
}|uxxu|�
}z��èz|uxxu|z����zz��èz{����{z����z5|{{|5{����{�5|{{|5�����XYS�SYX�YXXTRQPPRVWY�Y�T������Q�Y�ZUS������PUZ�[�T������R�[�]YU������UY]�]�W������X�]�_\[WSQPQUZ[_�a�\������Y�a�b_\������Y^b�c�[������Z�c�eb^������_be�f�a������a�f�hggfdccdfggh�bk`�`kb����������������������������������������������������������̧�����������������dz�������ߑ����������K�����
��¬�L������������H��f�������������Ƅ�����ۑ���F��ޚ����
���������։�����������������������~�~�����~�������q��x�~����r��܁�~�����rp���~������~������~�~�����~�~����~�~����~�~������~�~������~�����������|���|�����������������������������������������ςg����������
����������������"����	���������C���*������t���o���������^ ��������ۧ����Ժ���	����ڭ�˵����������UX���������~|�~��
|~���ګ�|�|��������Ā|���������ŀ������ެ��{��������Ħ���{���������计�����������ȥ��ɂ������夣�����²���ղ�����s�������Ͻ���v����������䲃V��������忀V�
V������Ț�V��u���r�����������������������������������������˧�������������������������u��w��������y��h�������w�r�����v����~�j�����v|w�}���|�k����u����t�y��������s������e���������{��������������y���y�z|�|�{�����u�������ߒ��������w���U�������n�
{���������p�
x������n�
u�����!p�
w������*�
���d ��c�0�~���m(���$n�5����w(��%x�6x���%��#� ��3@�~��-�,��+�4�5116�����������������������������������ѵ���������������������ki���k��k���k��ρ�������k���k����������k���k��ԋ�������k���k����������k���k��k���y�k[���������������������������������������˧�����������;1�������>c1�����+Q�����F������O>0�������(?+%�������E=Q����������2�����%3x���������+n£������������������������������������������/��������C��������L,����������������� ���������c������
���AM�	��������c��������-y�������b5���������l?�������������������������������������������������ֱ���������������
�����wxxz��������r��{͈�����rٲ��z͈����rӛ��{͈�
������x|}|��������������͈��������͈�͈�������������	��������������������������������������������������ܵ����������(AZ��������&���������
�@�����nQ����
�Y���~�Øt����
��x��ye��ȑ�������������	�����ѵ��������	�����߹��������ռԴ�����������ɣ������������������������������������������ͨ�������������������YYXZ^dio�����[��l����
�]�]�s�]nl����
��[�b�d�_�j����
��Y�c�k��f����
��X�b�jc�e�������X�Z�`���e���[��h���������fehi���������������������������������������˧���������������������������
�uyu��z������
�u��z{������	��v��~���������{�؁�����	��v�}�Ղ���������u��Ȁ�Ӄ���z������Ӈ���������������������������������������������������������׳����������begfehmpp�����b�����q�����b�ghhlnk�p�����b�o��syw�q����b�s��qz|�p������b�z��}�o������a���ʄ�o������a쌋�����o���d���q������z�oqt�����ݥo������f(����$���`�����j���C���L��}���ƅ��QA���U�����������X�����s�j�����ēu������ɹ��������ǒ�����ߓ������Ɩ������Ծ��^�����Õe�g�����h��4[Z[4����;�����;������К�k��o5o��o�_�����o�~��~�~��~��������ӝ��˪�q��ӣ�����'��Ŝ�����P��Õ��������ǒ�{������x�=/2�<2/=�����������������������������WLAED�Vs�֨jA�C��w��D�A��A�D�vvhD�VdwydME�UDADE�	

	


		
	




			


					
			
	

			


	




	����������������������������������̧����������������������������������������������������������������������������������������������������������������������������&+]���	��&)����x�����U���(������w(0(w������'-&�������"*������������luvwz��zul����0=�@BDB@=0����%�(%�������������������t�����
��������
�����٥�
����ǿ����
�������������r�����������
��������
����۪����������ܫ���۫����������ܬI����I�����I����I������[T�T[[�[YWOLKKLOWY[�Z�N��N�Z�]WM������MW]�]�M������M�]�_ZO����PZ_�a�T������U�a�b^YNGFFGNY^b�c�V��V�c�e`V������V`e�f�V������V�f�gbY����Ybg�i�^������_�i�ljhc�`achjl�bn`�`nb�������������������������������������������������������̨�����������������0���������0�5�������YlhpU�����
���DsivO5�������4bgkhg:3������\I]\[\^S9������/PQPpPQT?4���1A�HGHHIH:�����*7�9:;�����������������������������������������ϭ������������������������������������������������������������������������������������������������������������������Ѓi����������������!O������gC����	���������E���,������}���u�����������5������"#����#
���	# W��V%������X*hh3��������������
��XG2yʺ���쫰���@Aκ��ù��,�f-����QG/*��w����3"X���x���������������s���#��F��������ݽ����L�>����մ������Y�:pyIͣ������[�Z�u������A�|�
u������;��|�����������������������������������������������˧�������������������������Ǹ��������޻�ϲ���������׼��������޲����ȩ��а����޳��������������������������Ҳ��������ʻ����������������ó��������������������������������������
�����������
����������
������
��������(�
����9��9�2����H*��(I�7���gT*���(Vo8����#^^!�^c6^�����,l)��(n7�5,,6�����������������������������������ѵ������������������������������������������������������������������������ǣ��������������������������������������������������˧�����������!������{+Z�����B�����{5�������A*�������,��������,+=���������������
e��������aţ��������������������������������������>��������R
��������\>��������0���������1�������p)������
���P[�',.��������2p��,.������>��������pF���������tM������������������������������������������������ֱ����������������
����1


:�����������ٝ����
oIIpٝ����[\ٝ�
�����f
q��������������ٝ��������ٝ�ٝ�������������	��������������������������������������������������ݹ����������%����������������
���������
������߿����
��������������������	��=$�Fcj�����������`D�����M�gC:�������	�����������������������������������������̧��������������������Ĩ������������������
�Ī۵�����
������������
����������������������������������������������������������������������������������������������˧��������������������������������
���������
���2�;�������?�
����������I��������mNR
Pw����W^�����������Ƿ�����������������������������������������ݹ��������L&-/�������������.������#*-)�-�����%��,61�-�����#�� .0�-�������%��+�+�������,����-�+�������/.**./�+���	��������-������A)�*+-.�����ݥo������f(����$���`�����j���C���L��}���ƅ��QA���U������������;1�'wSE4#�b
����.I���������|�������	
����e���������;�����;������ҝ�k��o5o��k��ƴ@ �Ο�,`XTe1�5qk���ls4�?c&#sG�1G
X8�'D&#Q/�&: C,�-,+/���
������������������������������7��r-��M!@�����c�%!��������������������$�3$






��������"&�'&"��IL�MLI�
�
������������������������������	�	�	�	�





���������Ђ�ؒ���؀~ধ�����~|�|{������{{����{{����{z����zz������zz������z{�{~�~s~{�z{~s�



���������������������������������������������������������������������������������������������������#�3#��������r���h�		���m�	�?��
5�����������������������%�%'%�%��2�2>A>2�2��>�8@C@8�>��L�������L��`YWWWWWY`��uttsssttu��������������������۷���vzzzv�u����ـ�����w�����؆����՚vvՁ�Ԋ��������с�ы�����هρ�Ύ��������΁�˓��������ˁ�ʚ��������ʁ�Ǡ��������ǁ�ħ��������ā�İ��������Ă�ż��������Ńz�����������z����������������������絵����������䵷���������䷶������ͯ������������������������������������������������������������������������������������������������򸪸������������������������������������#�3#a_^^^^^]^_[[__���������[[_^�[^_^[�Q��[_^�befeb�S���_^�dfgfd�oQQ�^^�eb`_`t����^_�d����\��a�^_�ha^[[][^g�__�j�b�����i�__�ngecc`_dn�__�q���h���q�__�tjefjijmt�_`�x�����q�y�``��{xxx{}~��`Za`^^^^^__`aZxvuuuuuuuwsswv���������sswu�tvvvs�j��swv�x{|{x�l���wv�{}}|z��kk�vv�|zxwx�����vv�{����u��y�vv�~yvssusv}�vw���z������ww��}{zzwwz��ww�����~�����ww��{|~����ww�����������wx�����������xoxwvvuvvwwwxo���������������������������������~���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������"�3"-*******))$$**~~|z�$$**x&***&x��$**t+///+u ���**n,.(,.FC# j*+h-&�[)./0-h++b.%��\+01.b++]0&���\,10]+,W0&����e00W,,Q1'����;21Q,,L3(���:243L,-E3)��:2443E--@41i=35554@--:664567776:-*-----------*wtttttttturrut�������ɳrrut�ruuur�j��rut�{|�m���ut��~����pm�tt„���������tt�����������tt�����������tt�����������tt������Ŝ���tt�����Ɵ����tt����ʣ�����tt�����������tu�����������uluuuuuuuuuuul�������������������������������������������������������׾�����������������������������������������������������������������������������������������������������������������������������������������#�3#,)((((''')#$))��������[#$)(�#&'&#|�P$)({(+,+(x��S))t&#"%%p;p()m!�ԏ;2adhl))g%q�����m"f)*a'+|��`*+Z!�������-Y*+R����R++M �%(%� M+,F#�!#!�#F,,@(�������(@,-=3+'''''+3=-*-,+*****+,-*gdcccccccdaaee���������aaed�beeeb�W��aed�ilmli�X���ed�jiijj�xXW�dd�k��||����cd�q����Ɵn�dd�vojfy��p�dd�u�������}�dd�x��r�q�w�dd�}�x���x�}�dd���|���|���dd�����������df�����������f_fdcccccccdf_����������������������׳�������Գ��������ֵ�뺺����ů�괴��������贴�����Ծ贴�������紴���������崴�������䴴��������㴴��������ᴴ���������വ����������㵨�������������������������������������"�3"����������������������������������������������������������������������������������������������������������������������������������������������������������������������������)#�����$��F@
��$)#��"()%��*.)�^)..*�y04-��,340yr68/Ξf031qj;9��W����eb>C�uHU��^V��sBFHGDDZM��HMNNNNNTMRTWXXXXXXO��������������$"/*�
����%*%��JD	��+0*��)/1,��150�d0551�|7;4��3:;7|u>@7Тl8;:tlEC��_����heFL�{O]��aZ��zKOQPMM]Q��RWXXXXXWQ]^bbbbbbcS�������������������������#�3#,)((((((()$$*)|{{{{zxvR$$*)t%(((%q�G$*)n(***(k��L**g"#f:c)*`���<a_^_*+X���%&&&Z++S$T+,M������M,,F
 F,,@����� @,-:!	":-.4������!4..-%!"&-.*.-,+++,,,-.*vsrrrrrrrtpptt��������ppts�qtttq�g��pts�wzzzw�h���ts�xvtvx��hg�ss�v���x�����ss�y���{�����ss��xvz~~���ss����~������ss�����������ss�����������st�����������tt�����������tu�����������umutssssssstum����������������������齽�����������罿���������忽������ѹ������������������������������������������������������뿿�������迿����������俿���������������������������������������������������������#�3#+'%%%##$%'""('��������n""(%�"$����c"(&�+/#�����h(&�15)���E�&&�58+��H����&'�:<1��,785�&'�>@4��4@A>�''�CD7��6DFC�'({HE5��3EJH{((uLD���DMMu((pOF����GPPp()jVRJFFJRVVj)*h_^]\\]^__h*(+)))))))))+(a][[[ZZZ[]YY^]������ƛYY^[�X[U���K��Y^\�ad\���M���^\�hkc���xON�\\�mog������\\�qsk��hppn�\]�vxo��owxu�]]�{{s��r|}{�]]��t��s���]]����؀���]]�����������]^�����������^_�����������_Y_^^^^^^^^^_Y����������������������ƕ���䕗��܌�–��䝟���ێ�Ę�ᡣ��٭��ߗ�१��ʹ���ݖ�ު�������ݗ�ۮ���ԫ���ۗ�ڲ�������ڗ�ض��������ؗ�պ��踻�՗�ӿ��������ӗ���¿������ї�����������ә��������������������������������������#�3#�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������£���أ����֝�����ש����՞��ի����Ѱ��ӥ�ծ�������Ҥ�Ӯ�������Ϥ�Ѱ������̣�г�»����̤�β������ڳΤ��������̻Υ����������ͥ���������̥�����������Υ�������������&#!!!!  !###��������d#!�!"!��[#!�(-.-'���`#!�/33/)�:�!!�32*gb��z� !�5m�������} !�8��VXT��v!:�`NQK�x�v !y9�+5:7٠?z!�������|M{" k�D7:> �ZVx"!m������V^v"$td`___`cilx$$$!     !"#$$�������������������������#�3#�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������£���أ����֝�����ש����՞��ի����Ѱ��ӥ�ծ�������Ҥ�Ӯ�������Ϥ�Ѱ������̣�г�»����̤�β������ڳΤ��������̻Υ����������ͥ���������̥�����������Υ�������������&#!!!!  !###��������d#!�!"!��[#!�(-.-'���`#!�/33/)�:�!!�32*gb��z� !�5m�������} !�8��VXT��v!:�`NQK�x�v !y9�+5:7٠?z!�������|M{" k�D7:> �ZVx"!m������V^v"$td`___`cilx$$$!     !"#$$�������������������������#�3#�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������£���أ����֝�����ש����՞��ի����Ѱ��ӥ�ծ�������Ҥ�Ӯ�������Ϥ�Ѱ������̣�г�»����̤�β������ڳΤ��������̻Υ����������ͥ���������̥�����������Υ�������������&#!!!!  !###��������d#!�!"!��[#!�(-.-'���`#!�/33/)�:�!!�32*gb��z� !�5m�������} !�8��VXT��v!:�`NQK�x�v !y9�+5:7٠?z!�������|M{" k�D7:> �ZVx"!m������V^v"$td`___`cilx$$$!     !"#$$�������������������������#�3#�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������£���أ����֝�����ש����՞��ի����Ѱ��ӥ�ծ�������Ҥ�Ӯ�������Ϥ�Ѱ������̣�г�»����̤�β������ڳΤ��������̻Υ����������ͥ���������̥�����������Υ�������������&#!!!!  !###��������d#!�!"!��[#!�(-.-'���`#!�/33/)�:�!!�32*gb��z� !�5m�������} !�8��VXT��v!:�`NQK�x�v !y9�+5:7٠?z!�������|M{" k�D7:> �ZVx"!m������V^v"$td`___`cilx$$$!     !"#$$�������������������������#�3#�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������£���أ����֝�����ש����՞��ի����Ѱ��ӥ�ծ�������Ҥ�Ӯ�������Ϥ�Ѱ������̣�г�»����̤�β������ڳΤ��������̻Υ����������ͥ���������̥�����������Υ�������������&#!!!!  !###��������d#!�!"!��[#!�(-.-'���`#!�/33/)�:�!!�32*gb��z� !�5m�������} !�8��VXT��v!:�`NQK�x�v !y9�+5:7٠?z!�������|M{" k�D7:> �ZVx"!m������V^v"$td`___`cilx$$$!     !"#$$�������������������������#�3#�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������£���أ����֝�����ש����՞��ի����Ѱ��ӥ�ծ�������Ҥ�Ӯ�������Ϥ�Ѱ������̣�г�»����̤�β������ڳΤ��������̻Υ����������ͥ���������̥�����������Υ�������������&#!!!!  !###��������d#!�!"!��[#!�(-.-'���`#!�/33/)�:�!!�32*gb��z� !�5m�������} !�8��VXT��v!:�`NQK�x�v !y9�+5:7٠?z!�������|M{" k�D7:> �ZVx"!m������V^v"$td`___`cilx$$$!     !"#$$�������������������������#�3#+(&&&&&%&("#)(��������f"#)'�!%&%!��X#)(�&+,+&���[)('++)${?z()w'(#5kprs()n'"���y#m)*d' ��,��%d*+\'&/��&\++T)*'��k"'T+,K*,)�5 ))K,,A*,* o(+*A,-9*+) � )+*9-.0*+*&"&*+*0.*.....-.....*vsrrrrqqrsppss�������ͧppsr�orsro�e��psr�w{|{w�g���sr�{~zÊgf�rr�~�}yu�����rs��������{~�rs������~��ss�����|�����ss�����������ss�����������ss�����������st�����������tu�����������umuttttsttttum����������������������콽�����������轿���������追������Ҹ�����������������������������������������������������������������鿿����������濿����������������������������������������������������������"�3"edcccccccc__cd���������__cc�Z\\\Z�Z��_cd�^aaa_�]���cd�_[ZZXhjWZ�cd�]�������]�dd�c^VTV\^_c�dd�gc���ciig�dd�ihaYZahji�dd�klg���glk�dekgc^^elnmee}j����kppo}ee{pkiikprrr{eeyuuuuuuuuuye]eeeeeeeeeee]wuuuuuuuuurruu���������rruu�uwwwu�l��ruu�z}}}{�n���uu�|zxxw��kl�uu�|�������}�uu��~ywy}~���uu�����������uu���������uu�����������uu�����������uu�����������uu�����������uv�����������vmvvvvvvvvvvvm��������������������������������������������������ʼ������������������������������������������������������������������������������������������������������������������������������������������#�3#,)((((''')##))��������Y##)(�$'('$}�Q#)(~,010,{��V)({0443/x>v((w331/*Cmpqt()s4-���)0q()n4�������3n))j6#��!��#6j))e7��%1%��7e))b=*��)��*=b)*^B�������B^**\JA�2�2�AJ\*+[SQMKIKMQS[+)++**)))**++)_\[[[[[Z[\XX\\���������XX\[�X[\[W�M��X\[�_cdc_�O���\[�cggfb�rON�[\�fhfd`x����[\�hc�X�U�_e�\\�i�������h�\\�k^��]��^k�\\�m��aia��m�\\�re��d��er�\]�w������w�]]�~x�m�m�x~�]^����������^X^^]]]\]]]^^X���������������������ѳ����ф�����|�����Ί�����~�����ʎ����ɚ~}ȇ�Ȑ��������Ƈ�đ�҆��΋�Ç��������ђ�������ˊ�����������������������ϑ�������������מ������ؖ��؞������������������������������������������������������"�3"edcccccccc__cd���������__cc�Z\\\Z�Z��_cd�^aaa_�]���cd�_[ZZXhjWZ�cd�]�������]�dd�c^VTV\^_c�dd�gc���ciig�dd�ihaYZahji�dd�klg���glk�dekgc^^elnmee}j����kppo}ee{pkiikprrr{eeyuuuuuuuuuye]eeeeeeeeeee]wuuuuuuuuurruu���������rruu�uwwwu�l��ruu�z}}}{�n���uu�|zxxw��kl�uu�|�������}�uu��~ywy}~���uu�����������uu���������uu�����������uu�����������uu�����������uu�����������uv�����������vmvvvvvvvvvvvm��������������������������������������������������ʼ������������������������������������������������������������������������������������������������������������������������������������������#�3#+(&&&&&%&("#)(��������f"#)'�!%&%!��X#)(�&+,+&���[)('+,*&|@z()w'(%!=prrs()n$s��~M"l)*c������`!c*+Y��iXy��Z++Q��;H���Q+,I��V\��I,,@����mks!@,-9%����\!'9-.0)%<%()0.*...,++,-...*vsrrrrqqrsppss�������ͧppsr�orsro�e��psr�w{|{w�g���sr�{~zÊgf�rr�~�~{x�����rs��}���{~�rs�����ϩ��ss�������ق�ss�������ss��������ss����临���st�����İ���tu�����������umuttssrstttum����������������������콽�����������轿���������追������Ҹ����������������������������������������������������������鿿�������忿���������������������������������������������������������"�3"5433333332,,24ffgggfea�,,24a)+++)a'��,24^+...,^*���24Y*---,<A-*T34Q !#&#&"  Q45G���r�V���H55H&�W��Z��H55F�����,(F55A�����Y(+A56<!��U��#++<668)#$&"%+,+8662+++++++++266-*********-61677777777761|zzzzzzzzzxxzz���������xxzz�tvvvt�q��xzz�z}}}z�t���zz�}�����vt�zz�{|}}}|{�zz��������zz���������~�zz���������zz����������z{���Ѩ�Ҏ���{{�����������{{�����������{{�����������{r{{{{{{{{{{{r��������������������������������������������������Ҿ�������������������������������������������������������������������������������������������������������������������������������"�3"�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������$$$!H7��$))("F���*..*j��|$�y043'��-0yr695����16rj<=2��dm:<jcA;��y>BCBcZB���?HIIH[SS��OLNNNNTOVPQVXXXXXO��������������$$$�
����%***'L;��+00/*L�#��1551p��+�|7;:/��"47|u>A=����9>ulEF<��jsCEleIC��FJKKe^L���IQRRQ^W]��XVXXXXWRaZ[abbbbcS�������������������������#�3#���������������������ϳ����Њ���ǁ�����Α����ă��͕���ß��ˌ�˙���ƣ���Ɍ�ɝ�������Ɍ�ȡ���˛���Ȍ�Ǥ�������nj�ħ��������č�«��䨬�����������������������������������������������������CA@@?>>??@<<AA��������h<<A@�=>7��|/�`<A@�CD9��w0��eA@�GH=��tO32@@�IJ?��P}}}~@A}LLB��?IKI|@AzOOD��DOQOzAAvRQF��DQTRvAAsTPA��@QUTsAApVO���OWXpABlYP����PYZlBBj\YQMMQY]]jBCgcbaaaabccgC>CBBBBBBBBBC>{yxxwwvwxyuvyy���¾����uvyx�uwr���k��vyx�|~w���m���yx���{����om�xx���~�������xx����������xx�����������xx�����������xy�����������yy�����ݐ���yy�����������yy�����������yz�����������zrzzzzzzzzzzzr�������������������������#�3#gedddcbcce`aee���������`aed�AC<���W�|aee�KND���X���ee�QTJ���rZY�de�WYO��c����de�]^U��R[[Y�de�bdZ��Zcdb�ee�hh^��]ikh�ee�mk^��]kon�ee�qk���lrr�ee�vp����pwx�ee�}{uqqu{~~�ef�����������f_feeeeeeeeef_feddccbccd``ee���������``ed�@C<���V�`ed�JND���W���ed�QTJ���sYX�dd�WYO��f����dd�\^U��R[[Y�dd�bcZ��Zcda�dd�ij`��^jki�dd�nl`��^lpn�de�sm���ntt�ee�yr����ryz�ee��}wssw}���ee�����������e_feeeeeeeeef_fdddcbbbcd``de���������``dd�BE>���V��`dd�LPF���W���dd�SVL���tYX�cd�Z\R��h����cd�_aX��U^^\�dd�eg]��]fgd�dd�kkb��`lmk�dd�pnb��`nrp�dd�uo���pvv�dd�|u����v|}�dd���zwwz����de�����������e_eeeeeeeeeee_�������������������������#�3#����������������������纺����������庼���������强������ϵ���������������������������������������������������������������������������껻����������軼����������鼮���������������������������������࿍���ߍ���փ�����ݓ����ԅ��ۗ���Ѥ��؏�؛���ȩ���֎�՟�������ԏ�Ѣ���͝���я�Φ�������Ώ�̪��������̏�ɭ��媮�ɏ�ư��������Ə�ĵ��������Đ�ļ��������đ�������������C@?>>===>@;;@@��������s;;@?�;=6���-�i;@?�BD9���/��m@?�DF;���S20�?@�FH=��Q����?@�IJ@��=GHF�@@KK@��@KLJ@AzMMA��@MPMzAAtOL<��;MQPtABoPH���HQQoBBjRJ����JSTjBBdVSKGGKSWWdBC`ZZXXXXZZZ`C>CCCCCCCCCCC>�������������������������#�3#+(&&&&&%&("#)(��������f"#)'�!%&%!��X#)(�&+,+&���[)(',-,'|>z()w(++("9ghnr()n(*$X���k)*d(#G�����b*+\$��nn��Z++S!D������Q+,I��4k�I,,?�1����q#A,-7��#'9-.0%$'()*0.*.-,,,......*vsrrrrqqrsppss�������ͧppsr�orsro�e��psr�w{|{w�g���sr�{�{Êgf�rr����{�����rs����{����y�rs���������}�ss����������ss�����������ss����ʋ�ss�����������st����ٍ�����tu�����������umutssstttttum����������������������콽�����������轿���������追������Ҹ����������������������������������������������������������������鿿��������濿��������������������������������������������������������0�30`ZXWWXXXY\XX\[��������XX\X���x|�H��X\W������K���\X��݌�ـKI�ZX׏���������YY֜��������YYԥ���������XYЬ���������XX˲�������WNµ���������N�������|�������������������������������������������������������������Ց�����������ӑ����������Ԕ�������������������������������������ᵝ����������䢨�����������ñ�����������W���������G��������������������������������������������������������������������-%��������'3'�������#z���ػ��������������������������������v#+#w��������-3-��������{(1(|�������������- .!>-....//.->!$B;;;;;;;;;B$%$$$$$$$$$$$%�������������������������#�3#,('''''&'(#$))��������_#$)(�#&'&#��Q$)({%)*)#v��S))r&)(#a,l)*j%(!Y��Xd)*a%&�����]*+Y##�ӎB�V+,O" ��L,,E��
C,-<����
:-.2
�����3..)��
+./!"/*/.-,-//00//*vsrrrrrqrsppts�������ɥpptr�orsrn�f��ptr�vzzyu�g���tr�z~}zt��bd�ss�~�}����rs���{�����t�ss���|���x�ss���~�vxt�|�ss���{�z�����st�����{�����tt�����������tt�����������tu�����������umutssstuuuuum�������������������޾���񼽾���ھ��������������ɸ�꿿��������翿���������㿿����������������������ÿ�����������������������������������������������������������������	�®��{��	w@TPQUR�M��,?��������9�����\���u�ɸ��Į���������������������������������T�������������h]��zs��������������f�������������|�`�������������qog������������zml�����������{s��r~|||||||}yy��|����������i:LJHHHHHHHHMG�����������dz��������������������l�����������ņ}ᯢ������������׾���Ŷ������������������������������������������������������������������������ƭ�����������Ridbbbbbbbbi`���������������������������������������������������������������������������������������������������������������������������������������������y������������

9����������
����������������������������������������������^��}|{}�����������}|z|�����������������������������������������������|���������������|���������������{���������������y���������������v��������������t�}~~�t�}}~~}}}~}}}}~�t���������������|7IBBBBBBBBBBBCH+�������������ɺ��������������ƾ���������Ż�����������ˬ�ĺ������������������������������������������������������������������������������������������������������������������������������Ÿ�������������JcYYYYZZZZZZZ[a:
		
		
��������������������������������������������������������������������������������������������j�����R�������������������������#�3#��������������������������������������鬫������ʤ��������������������������������������������������������������������������������������������������������������������������������������������������������������鯮������˧�������������������������������������������������������������������������������������������������������������������������������������������������������������鯭������˧������������������������������������������������������������������������������������������������������������������������8BIMPatt8BIMlnk2>�liFD$b153c44e-70e8-1173-9870-930db18117f2file_extension_ptb.png��PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<:IDATxڌS�kA���d�i�4ml��b�`@�R�X��^z�����xz�(�=Ŋ�<� T{�C<�(5Ah
b���&���ogm�mz���̛yo��ޛ7�����:�sZ��6=����Bע#�2�<6u/T����<�N��h��>+�Z��{D`;��>/�G��a|�.��=���[(�7窕b��=��6���P��5�0@D�- =�����J���%��,(J@�&�
^ّ�p3X{2�t�2����!g����y;hy
�;(0������U?@�1�p�ӏq�8��j��/�@RH��
]��[_2<�P��<��)��r�AO;�@b�Z��v��.��6��$��A�P�Kt�A��,R���$߀H�͇����Bsi�cӱZQ݂QY䮼5�#����N�~�����>�b�n������6�.�z4��m� e�0:$���4?!}y9�	;�ɇr2����I֒�Ϗ��uQ�YX�<��'›q��?x�//.h.��+�����]����Y��u*���K��UC�`"�$��G�IEND�B`��liFD$9825338c-70e8-1173-9870-930db18117f2file_extension_hqx.png��PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<%IDATxڌS�kA}�;;��^r��b�"(�XoR���	�l�m��UZZ�(q�Ј?�"Eċ���AăG��Ao�&;��6�mc�/L��Λ7ycn�j?��EjӢ�~�Y~!���QFI����1�s�/1�$I�v�m]Džp��z(����F��\9]6�<��шc�++ĬQ�1����x��5,.`�py:����JT(�!� �z=��ڪ�4�py	�#'&ggg�X���}(��X]mbnn����c�V*���8rt�_鮓�&1	-��8<����*��'��qccgq��i����4M*ϣ��������x����f��]�	
�:�A���Z�u���
[�CL�ɂ� }	�<���D�t�t�{��
|:�� ��{V&�����.dKJ	���w���-H"�7�V�;���JV�,.�p�����g2�R*R���>���=�h�{�)�ԫ�°�u3\����{'�F�K�;:������y���ָٛ�?���=��v�����_��7F΋��0IEND�B`��liFD$4e0ca1c0-70e8-1173-9870-930db18117f2file_extension_gz.png��PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<+IDATxڌSMHUA=�s�՝�(�C^�H =D-#��-�6nڄBP;A�A��M�N&�AQ�"h�T"�
�ZX�y�;�ͼwy�뢹|3s�9s����Z�<�3ƴ��5��:!�!~=�4u�A<VsǛ�Ѣq`ĕ��!���?w+D��_
�Q�d��Dޮ����Wx���rk�ܓ~T�X[\����;�9R�XL8tj�	}�����<��!�����=tf��O��H�(��څ����=.�]��ct�<���&������[�}:Q`�@j6J*\�?@$����l���H�R��S:A��V�HK�����`�����M|/m�6$
X*0�!���>")B�LB
WK�၁R���X^$�<A�]�7ƥp�cR�@Xr�{4����*�*'�$ԕ1v�KJ���H�2=I�:o�:�K{ 8o"�A[ϩ��sJ��DW�AcU٬�rs���s�_9��QTqi�Z�z��"55��T��'�K�B4�������G6���/1��y����};<�'����|p���IEND�B`��liFD$21f17c42-70e8-1173-9870-930db18117f2file_extension_zip.png��PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<&IDATxڌS=hQ���ޑ&A�3�%�]�/H�����F0$�������0hc�S�P$����D� F""Z(B�����w���޾y��|3�̬J�O�j?]�Ȓo�R����G��hJjX��sm�o��s���!���1�������Α/O�Ml�m�ѽ�0J#�7Q���I��/�����.:3�8E��/.B>��6�y���P�J���jי���=��M�$�Ok5.�ז�1<v�,"��;�7W+xpi;��%���O��Q1�b���^������U�Tcf�����W�חo�x`�VP_z�8�\��t�1���Zl���i|��$%���PRm]�[B�]@�Q�Z��`yR:�וּ\���\�-�~�)����!k��o�^Hd�"��dC���֪�x
2��/T3���h��f�[�]P)��a��QNu�>q�s��t��T۫h[?�B� oӫ$�B�-�v��������-�j���R��(�E�������GQ�
05�)vM�8IEND�B`��liFD$d5cca80a-70e7-1173-9870-930db18117f2file_extension_bin.png-�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<�IDATxڌS=KQ=�cf��,
��D�
�}:�B[�N,E��H�&��B�I�bQDH���Bp����`f?��̛w�眙'���0��5�I�jW�Ց�dŽ:]P�����L����^vyWO�����d��38cq�Rʴ����g��w���1���,�HHRj�F{J�	����[L��G���ʠ�:�0$���В������_�q�#f��@�(Y�ś&��K���85�����(.�R��9_KH�,��S�VlA�bkq }�~��#A4�Z�T]﨩R5Nj�KX�gRD8��@ OB�rs�/ݛ�tI*�?���r�1���}��(����H_9L���!�%�����K�e�8VoL[֥\�|�&�S�xz�L@�^�04Vt.����ݿe���x779Δ|�:��G��������IEND�B`�9liFD$cc65cd91-70e6-1173-9870-930db18117f2file_extension_html.png��PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<iIDATxڌS�kA�f3�MkQjl�Ң�ZP*Ă���"�ŊQ��R�?���� ī�'���A�PJ<y�Ҟ%EAc�$V�l���{�M�6�ݙy�}�{߼����tI);l�zӠ=�!�	m%�`"�a�|%8���	�6;�d��W4:X��sgcfnv)9y�=�l�U�ç)H����g�R��8�����ǣSH4�'�̜�''�8cMz�]nK�$>M�+xve.k��=�S�y��ZHu�O��I,���+#C}��起��=��nY�
��s��?���P|/�c�\eL��
X�(�jR����D��x�k���"������qJ(���?M&ɝ�ƽ���Aᗅ���x?���e�HX!�0�}�&Q<w��5��F�*�;d��a
��(R��@[	k"
ԛ|
�u�b�D��ݳ�;�R̀n�*��,H��V\C,$ѳM�XTw�a�Xl�!"�tC��ۏ��3�x_h��B
v�F@�"@v���X�Q�ÍT/re�8�7��b��e�;��u���H�e����yW��7�0�\i���0�
7��D�`�+i��rL��k��D��h=0/��@�=/����Q��</�
0�$����NIEND�B`�liFD$a5667c38-70e6-1173-9870-930db18117f2file_extension_bat.png��PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<9IDATxڌS=hSQ��I+:dQ+�?�E���� �W����E����T���".�EQ�P0ND�C�TP��,B�Alͻ�>�9/I��y�s��9߽��(B߉�0�I��Jď� �C�u�誦���G��3{a�Hj�8�ס����ye͌ݩ��eZ�5�j�����.���d"=�7n��K�"^�1H�
@��!���%���q8b3�8z��%��φÒ�4��dO��6��U���Aj�}�fuJ��W�-c9�A�s�}[!����oـ���q�����sb4��~.���U籽g9J��x�셶Zg��� ����w��`�x���ϩ���+ӳ�+Ԃ����"d'J��(����j���#mQ�:Z�
�7i�2uV��H�X�ZD����A|���M��u�c�ZD�◸��$�n��p��nu������?(k��wT �����Z����O�v���E�Z��{IN��B4п����Z�r�X�H�@���m��Q�[�5���5nb�CK�WN�V����$�_~p^U&��f��IEND�B`��liFD$fdefcf69-704a-1173-895f-b3229314356cfile_extension_m4b.png��PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e</IDATxڌS=kQ=yM�lvE]T$�gD	(�Q�B4����*�"�!�UP��Y��E0)��BA�l%"a����;��{�ͬf������=��{�p�a���Oml�����n�>O����ڀ�ʒT�Y��tS�i��'���m6F�r�(�x��-��"��v�y�$f�-b��E\Mt]L̉��h}����}T �ReQ��G�^�:�1)n��߄c�D�4h
A`���R�&�V�Em�{�Q���T��k:`��8"pR�C�#Gv�̡*.�؅�K{���oi\��tm�:�����Û6�j��\8�
�7BL�ԍ�}����p�+�?Z��:�B���E<����&}���P$�h۫���]!J�GT�n<��'+S��{{�_zn�dEy�ޜA�?�|���ok+x�.y��)I��:
u4�>�n��T(���,X#���g�Pg���F�F�y����	0�d	�82\`�\�������EYLL��8[v�r�X���M��>' ��W�g�pM�0l��!B_ANIEND�B`�liFD$e6d2e6e0-704a-1173-895f-b3229314356cfile_extension_jpeg.png��PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<HIDATxڌSMhQ����o�i�KRL����R�
�(֞ċ�*T�ţWѳ�*�أ��E�'=��R���T0�J���6%�}���f�<��cg��|3of�PJ����5O����ǀ�0�������G��Z(ξV+�{J}#��2Q�����y鏚���I+��Њ��;��p���/��'`�p]��83��ى�$y��c�l,�eE#{L �xS���Q�0������Ccdں�&��s:V���sw��l`٘�M�8����AL�Ʃ�/q����r���G��N�̆1#o�֥u���&	���
	t���J"$Y\Z��P7mW񬸇�hxG��a�'�,�X�:�HdsD�K7��p;�$��@"�����"�؈9qD�lR��T��jN��!�$�+�+�'\؎D��_�ek�
z�+zP�ħ6��datFl_.fPx�����VEw;������P�X���_B��"���`l�<�����*tXk�VvV�4ߧ%�_+�&+n,`��ݱ��R��������|��U���GҟOGP;C`��9�V�wE���{���%-�`g���)�RIEND�B`�liFD$d6c29263-704a-1173-895f-b3229314356cfile_extension_htm.png��PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<CIDATxڌSMhA���f���KĤ�5Jl�ZS��7�D�(�#*^�P�� ^<�-�*�DoD�"Qr/9�H-D���"�P�Mvg�7��4i<��%3�����%�1t��,���;����� H,�?M���\S��⛗G��Nf�	�y/�}>���{[c����T�B{3B�6����aF�Q�yRb�p��ů�1��,Re*_��k�%,��5�$�<�!�.��4.
��n}�q�9]+"$G���׹#}d���z���dR��vM�x^P���sWp�87�\�����<]h�j]��6�k�q,k�t.���:�lG��L~��	]T��М��7`v|���w�<�ɍdpS��V��U巊o����;'����d[��B
�9ܱ��>����q�,L�Rp=�$�`,*�u?����8��܌C�X���=���nM�����
b��H3�p���@��[�,[�JW����
��Y��:�8S0�����:?���v=�
�&'%��E߇��q�:
<�O�,�8���o� E{��)
�=o�(�k�o+\Wы���87_@yIEND�B`��liFD$c718de88-704a-1173-895f-b3229314356cfile_extension_flv.pngy�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<IDATxڌS�kA�fg��]N�+���xb��JB
�И4���;�4ژXi-h��
V��w����P/�������^�;�owg�}�|��ADб�{�4I�#M18,K|�6��h��	V�:z����8=��)�6¿2����9������]D�i�R-)R�ia��A���w�V��Ge;�=4�u���(���f.a��j�oj���{D+�t]H�)R�>�?y���q�磊��R�I����G�!�D�-�Ũ��$��@�VN`g�f�&�1����l޸�y�.��첞PL ����ύH����)X;C(��1@A���|K�<y.[��A��ճ-��W�7��(.�NQ����u���
�f�~	�{��rT��Z�� ����i���f�@��RA�L�i�O�cd���NO �7 ^��*��=��hb�A05>!��Y��v�n�)�:n	83e|p\����R��Q(*~/V^�G�r�3���g~y�C�
��dl�9�҅3�0IEND�B`��liFD$b8532814-704a-1173-895f-b3229314356cfile_extension_doc.pngp�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<IDATxڌSOHTA�}�f�]���DI2�w�lF	�!�N�)̺���
^B*ʃ���!"��Y*4B�
)�ŭ�ԥڭ}of�f���[V�y��o~���͐1v���j�h�i�w���h�+Z3WF&���q0�/&��yZ�x���W�2��+�7�BD^�5N�s�{9���9T�����"2���I�%<ϋ|�4�X4��������b�F�� �3�0�xq���*����"�ؙr��I�V�h���a<�X��2&�t�V�,`k`W�|�}ڭ�~�p�<�ԍ˅���v�S3��t=*�Hf@dpx����Vp��@���_�����)�'L
pPա=r�R�Q
�����T	{�H��Q�7
���Ѷ,�sv����v#�9\��.x�����}NjOeg?Y�����p�;dqDM���ʙ���K x�f�c���^� �A�@�o��(�T�K5��'�������,Nnc"��5����Q��X�[�Dd�ފ���-�`��"�MY5IEND�B`��liFD$e17a80c3-704b-1173-895f-b3229314356cfile_extension_bin.png-�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<�IDATxڌS=KQ=�cf��,
��D�
�}:�B[�N,E��H�&��B�I�bQDH���Bp����`f?��̛w�眙'���0��5�I�jW�Ց�dŽ:]P�����L����^vyWO�����d��38cq�Rʴ����g��w���1���,�HHRj�F{J�	����[L��G���ʠ�:�0$���В������_�q�#f��@�(Y�ś&��K���85�����(.�R��9_KH�,��S�VlA�bkq }�~��#A4�Z�T]﨩R5Nj�KX�gRD8��@ OB�rs�/ݛ�tI*�?���r�1���}��(����H_9L���!�%�����K�e�8VoL[֥\�|�&�S�xz�L@�^�04Vt.����ݿe���x779Δ|�:��G��������IEND�B`�liFD$9e507f6c-704b-1173-895f-b3229314356cfile_extension_chm.png��PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<8IDATxڌS1hA}3;�c��h,�pb
�`B�H-<1��(Z�VV��pb#B���6%H�S�b!!��9�(�������mn�k�c���y��J��,���9�;�QJA+]]�=�������Kg�ᜀ� �w˝2�n�ǎFy������<�ɪm4�;��`��3J,��K�pkfk�'Q��Ty^�T&J��f��'Bh�Tb�I��@\���8�q*��<d�I��Y���g2% �
�f�C������sO08����D��z�,�c&m&1CO_.atd?F��H����@���to��.\�ڻ���f_�!�����$T[�t�`���pJ��7_����E�}����'�Ȑ�Nu?�JE���[|��@-vX�'-$yIPw6ǟ=�!�@�����`�zu��ƅǟP�1PA�\�v�A�D͖��-dI��Uɶ����q�
2o(m@@3�s_�`;��nΆ��n5����P�*����^�i�b�	��Di���)MJq֊3ˈz#�(��N�<H����c&���9O��T��UT���֙�"��P���[5IEND�B`�liFD$919ca3ae-704b-1173-895f-b3229314356cfile_extension_ace.png��PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<AIDATxڌS;hQ=�3�Y�pc
A�U?[�Z�I4�Z��ـD�X�U*Y#����B�A$ DĀH
��,,"��μ7�{��lfL���-o��s�9���9�`�[�c�4������?�=��5=g��?c�ʍ��J6�ю,����������72SO�[��	_�onG�&_BRr;4�6���4�ps�Vf��74u`Z,��\�h,P*����<x��j�()��x�8�)�����c�L+E֢P���|���aH�@u;��f�{�6�;�1�9�qЁ��I�06���x������p$52�77/��A�r[�@o�f�blp3s�����'�wY�Xπ(��ރ{��S,�D��]1��*>�C@�RPZa��#'��+\���f�Ú6r�6K�$K�B,,�BBPQ���>/C`�A��&{�\�u�^�Q[�c��#�[�U@&:�ڮ�n�̲X|҅�%��.�FEtOM�{�|yP�T��	q�˚�) i$J�xF�$�3+>9�dȤ���B���7�.Oo��|�ςǒz���l<~n�7��j�*�xIEND�B`�liFD$3d2e709b-704b-1173-895f-b3229314356cfile_extension_rtf.png��PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<:IDATxڌSKhSA=�~��"c�U		�ZMŅH�Eu!ua������T���nDq�஻,,R�*F���H5�����Lϼ|��)80/wf�=��{s�R
���Ka(�������ڹ���'�21|fѝ�pR����K��?:�$��Fb�J�r��>�iU����)<}���AzF0:'H2�L��1���0Ls�>�1�!H� {���sΕ6_�j��j<W,�
Ez�_�g����N쾔C��,:�;u�Û�A�2U|�9^�g�%>/�>���4%���k��)Q�
Ed:?��(,�P����%^ V-�n��m�m�Vˀ�'�,n�<6���#
�n��O.`y�h8u�5\��e
�1�1��y*8������`qo��5�zҞ�Ԡx5���~��裗�ҵl:&2<�\,�{�A@�L�U�=`�>R�����P�@�� IP;���{���A�)‰�_��.o�v{."���X�TѾ�Aϣ��ۜ'Ħ"���ֻ����4�dc4�}5�~�ǒ=����J�o�X`}�H�1ۇIEND�B`�liFD$3b187f9a-704b-1173-895f-b3229314356cfile_extension_pdf.png��PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<3IDATxڌS�kA}��l�4�n����K=�g��MDDR+^<x�-�x(��@=yAQУ���j��HA4MM�d���M7f%�fgg�{o޼�!�5>
���.z� �G+߆�/�K�@�?��\�C( �o�Y�x�P�!y�҃эʩH |���h}�^J��R6����uV�y��
�_�ӥT�~$�b.��t�N�;S&�5��ָd|�<
�-S��+��I�}F�
HۆL$ �Dn���g���M�k�G��u�֓�����m�e!�FP���W@�}���o5�1����R0�`u��2����R�.B�
( #��1Ё���-���V���-����q�(RH��!+e$'�Bp+%ے$Y��Á9��,���&�?	���̣��>���C�_!
A�B4H�ٗ�}��vX�w�v�(��v6N{�Xۀu�0��s�f.#X(p��2�����N.�^G`�.Ln]��P�L�;a��y邙���	r�ӱ�祂�֩��^߼=���O0�ԇ��m$����T���K����l��IEND�B`�liFD$29a1d44e-704b-1173-895f-b3229314356cfile_extension_mpeg.png��PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<@IDATxڌSAkA�fv7��6�6`!P���Ń��<�$5Hj�l�G��ڣ��V(���(�����BDr1Pb�ڂ���6�R����횸1-8�˛�}�o���5����t]�88t�/ �X����r�&�\�#�}P
�t�L+M�/��o�G�.��/1�j%G��"C�� 
�UH�����y�
"q�M��9�i&���Q��)�$	8�B��
<�~C7�u��E%C\'�r�Ȋ�%�vl%��uvD�~q���!ke���@�
>���җ"^g����2�8y�]݇aJG+�@�e5�	4C&�d�!�W:�8ы�x���x��z<�r��mr -O�?p/�#�K�#�EW&G�1��'�t���@����_o�a�Ѽ��x��m�D	e����ڮ�����ֱޮ=�`�B��AM���,���;�q`��9�4�qn*����y�q�]�2�kjR�	Tt!_)�_���k�w
�+dy��ĩ{�y�5:��u���d���G8��<"q8�<��	���|!�9���0`�r
eڒ-}~�{�����(P�2�@ �g.�!ZIEND�B`��liFD$14ebc9c7-704b-1173-895f-b3229314356cfile_extension_mp4.png[�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<�IDATxڌS=kTA=wf��qIe!�d
�J�J@H�$&��[;qQl�f+�6�����i!Db��|4��ۙ���}�Y�E�2,s�s�=3����8so囵n��H}]�M��r�5�F�3ק |D�����\u#=��.�??��/�M�#����
�{ٶ��6s�g���t�<�{�%$&���NI���' &�R(��=ܾz����#��8}C�-��`�2O�����W�qj�������,��
�G@�kYJ4�^�	g�*ȕ�l��a���R�ԯ�Y&0���7O�h��S�rYR�A93+S��΍����\�PW�CXQ,̎�r���t΂҃�(.�@�������-��T�� �0����ڛM���M�+7�/+D �2��PPK��r������=M�0!�.x�G����V���Qǖ��-c޷X�*����o�N@��PW$�?���w�?L�!��o�9Q���q��a��Q��A�.�IEND�B`��liFD$c5d8d499-7049-1173-895f-b3229314356cfile_extension_txt.png�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<!IDATxڌS�kA���]��X�1 h��B�SP��*�1��H� �HB.�]��^�4~�
F��F�	���?�/B@,�R17��7�{�W8��y�{��5Cabt��wkm��[Gȓd*�V����1֓�<�$
r�noy���ם#S��©����4�x��Z)�Q<cql�0V^�b�6����a&!&Nb�ֆ<��k[���j(&
7~�xa����<;Sy��c-��$�(
ag��ݻz04y��N����4�Kl�d�	�F��a
�{{�߻���Y��i��œr�
pfz7�sN-Tq��4�PH��t�Ɇ#��P8}iZ+d�!G�/Ʉ���ta��P�L���D��p��ۋ豗�+��9��ܝ�6F�|��=8\���̬I��ձ��x������>_~�p	�	����K����HqD����Z� ��c�5�&�Zi<�{��2n��P���RH�Y�	���Ԉ�#f񼣫Żϑ�d#%m�Ÿ_?_���q y<�3lU�b�e�'�^ Q�����>��W����bo��IEND�B`��liFD$c483e490-7049-1173-895f-b3229314356cfile_extension_exe.pnge�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<IDATxڌS1OQ�f�v�;s�АK4m$;
����P �b���N����P�Xcb���.&F���
�D�1\dw���W0�ݼ}��73߼'�Z�����j�Κn�|�_{�G�)��
~�h��h@��M�u�g�۹��c3�	�f�b`��w���э�7q��*�����sM!���D3�C��Ȑ�Uy$m�ƫ�A>�>����q.��	�
}��P�+)�"cp�^��؀<[�ȥA�x2WA�r{
>T��i��8,m�`v��B�3Q�c�#�G��LJ�:�\��M���;X�{�U|b��q����6v����An
�Q�r��Ֆ�Sq#U[h���Hq�%pp�}��w�7@���0��ߣ4����ak��J����'���2_xܨ�ו ���)�ۓ+]uP���̔��\,��i캾��ը_q�"8��
�J�x�����78���N��g}���m�Q7SmJ�ג׵�u��m��B��k:
��IEND�B`�8BIMFMsk��2
		

	


	

		
			
		
		

			
	
		
	
	
	
		
	
	

		

		
				
			
	

	
	



		
		
					

	
				
	
	

	

	

	

		

	

		
		
			
	
	


			
		
	





		

		

	
		
	
		

		

		

	


	
	
	
	
	
	
	
		

								
					

																																																																						�8(�&%&:���(��������fo���'�!%&%!��Xo���(�&+,+&���[o���('++)${?z(���)w'(#5kprs(���)n'"��y#m)���*d' ��,��%d*���+\'&/��&\+���+T)*'��k"'T+���,K*,)�5 ))K,���,A*,* o(+*A,���-9*+) � )+*9-���.0*+*&"&*+*0.���_�.-�._�������������������������������������������������������������	����������������������������������������������������������������������������������������������~�����|�}~~��|�}}~~�}~�}~�|�����������w~�}x��������������������������������������ɸ����������������������������������������������������zs��������������f�������������`��������yg��������wl�������{���r~�|}y�����|����������r�|v���������������������������������������*�*�����������rd�������hc����		���mc����	�?�����
5������������������������%�%'%�%�����2�2>A>2�2�����>�8@C@8�>�����L��L�����`Y�WY`�����utt�s�tu����S�S�������������������������������������������fd�ce���d�����r���c�Z�\Z�Z��r���d�^�a_�]���t���d�_[ZZXhjWZ�c���d�]��]�d���d�c^VTV\^_c�d���d�gc��ciig�d���d�ihaYZahji�d���d�klg��glk�d���ekgc^^elnme���e}j��kppo}e���e{pkiikp�r{e���ey�uye���g�eg��������������������������������������������jZXWW�XYi���[�������毒���X���x|�H������W��	���K�������X��݌�ـKI�Z���X׏���������Y���Y֜��������Y���Yԥ���������X���YЬ���������X���X������W���N��	�������N�������|��������������������������������������������������������������������9(�'&':���)��������_p���(�#&'&#��Qp���({%)*)#v��So���)r&)(#a,l)���*j%(!Y��Xd)���*a%&��]*���+Y##�ӎB�V+���,O" ��L,���,E��
C,���-<���
:-���.2
����3.���.)��
+.���/!"/���_/.-,-//00//_������������������������������������������E�*)C���*~�~|z�r���*x&�*&x��r���*t+�/+u ���t���*n,.(,.FC# j*���+h-&�[)./0-h+���+b.%��\+01.b+���+]0&��\,10]+���,W0&��e00W,���,Q1'���;21Q,���,L3(���:243L,���-E3)��:2443E-���-@41i=3�54@-���-:66456�76:-���d�-d������������������������������������������9)�(;���)|�{zxvRp���)t%�(%q�Gp���)n(�*(k��Lo���*g"#f:c)���*`��<a_^_*���+X��%�&Z+���+S$T+���,M����M,���,F
 F,���,@���� @,���-:!	":-���.4���!4.���.-%!"&-.���_.-,�+�,-._��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������L4�3K���4ff�gfea�w���4a)�+)a'��w���4^+�.,^*���z���4Y*�-,<A-*T3���4Q !#&#&"  Q4���5G���r�V���H5���5H&�W��Z��H5���5F�����,(F5���5A�����Y(+A5���6<!��U��#++<6���68)#$&"%+,+86���62�+26���6-�*-6���j6�76j������������������������������������������8(�&%&:���(��������fo���'�!%&%!��Xo���(�&+,+&���[o���(',-,'|>z(���)w(++("9ghnr(���)n(*$X���k)���*d(#G���b*���+\$��nn��Z+���+S!D��Q+���,I��4k�I,���,?�1���q#A,���-7��#'9-���.0%$'()*0.���_.-�,�._�����������������������������������������������8(�&%&:���(��������fo���'�!%&%!��Xo���(�&+,+&���[o���('+,*&|@z(���)w'(%!=prrs(���)n$s��~M"l)���*c������`!c*���+Y��iXy��Z+���+Q��;H���Q+���,I��V\��I,���,@����mks!@,���-9%����\!'9-���.0)%<%()0.���_�.,++,-�._����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������9)�(�';���)�������Yp���(�$'('$}�Qo���(~,010,{��Vo���({0443/x>v(���(w331/*Cmpqt(���)s4-���)0q(���)n4����3n)���)j6#��!��#6j)���)e7��%1%��7e)���)b=*��)��*=b)���*^B����B^*���*\JA�2�2�AJ\*���+[SQMKIKMQS[+���^++**�)�*�+^��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wd�cv���d���������c�Z�\Z�Z������d�^�a_�]�������d�_[ZZXhjWZ�c���d�]��]�d���d�c^VTV\^_c�d���d�gc��ciig�d���d�ihaYZahji�d���d�klg��glk�d���ekgc^^elnme���e}j��kppo}e���e{pkiikp�r{e���ey�uye�����e����������������������������������������������������������������������������������������������ϵ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ϳ�����Њ���ǁ�������Α����ă�����͕���ß��ˌ����˙���ƣ���Ɍ����ɝ�������Ɍ����ȡ���˛���Ȍ����Ǥ�������nj����ħ��������č����«��䨬�����������������������������������������������������������������������������������������������qe�dcbccr���e�������������d�AC<���W�|����e�KND���X�������e�QTJ���rZY�d���e�WYO��c����d���e�]^U��R[[Y�d���e�bdZ��Zcdb�e���e�hh^��]ikh�e���e�mk^��]kon�e���e�qk���lrr�e���e�vp��pwx�e���e�}{uqqu{~~�e���f��������f����f�ef��������������������������������������������8'�%�#$%9���'��������no���%�"$����cn���&�+/#�����hn���&�15)���E�&���&�58+��H����&���'�:<1��,785�&���'�>@4��4@A>�'���'�CD7��6DFC�'���({HE5��3EJH{(���(uLD���DMMu(���(pOF��GPPp(���)jVRJFFJRVVj)���*h_^]\\]^__h*���]+�)+]������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������s�r�qr���s�����ͧ����r�orsro�e������r�w{|{w�g�������r�{~zÊgf�r���r�~�}yu�����r���s�������{~�r���s������~��s���s�����|�����s���s�����������s���s�����������s���s�����������s���t���������t���u���������u����u�ts�tu������������������������������������������������
�����ɺ������������ƾ�������Ż��������˱����������������������������������������������������������������������������Ÿ������������������������������������������������������������������������������������������������Ż��������������������Ŷ������������������������������������í����������ƭ������������������������������������������������������������������������۷������v�zv�u�������ـ����w��������؆����՚vvՁ����Ԋ��������с����ы��هρ����Ύ���΁����˓��������ˁ����ʚ��������ʁ����Ǡ��������ǁ����ħ���ā����İ�����Ă����������Ń����������������������������������������������������x�uw���u������������u�u�wu�l������u�z�}{�n�������u�|zxxw��kl�u���u�|��}�u���u��~ywy}~���u���u����������u���u���������u���u����������u���u�����������u���u���������u���u����������u���v����v���w�vw�������������������������������������������������������������շ������������ӷ������������Է������������������������������������	�����������	ᵝ�������������䢨�����������	�ñ�����������	��W������������G�����������������������������������������������������������������������������������s�rqr���s����ɥ����r�orsrn�f������r�vzzyu�g�������r�z~}zt��bd�s���s�~�}����r���s���{��t�s���s���|���x�s���s���~�vxt�|�s���s���{�z�����s���t�����{����t���t����������t���t�����������t���u�����������u����ut�st�u���������������������������������������������t����t�����ɳ����t�r�ur�j������t�{�|�m�������t��~����pm�t���t„���������t���t�����������t���t����������t���t���������t���t�����Ŝ���t���t�����Ɵ����t���t����ʣ�����t���t����������t���u�������u�����u�������������������������������������������s�r���t����������s�q�tq�g������s�w�zw�h�������s�xvtvx��hg�s���s�v��x�����s���s�y��{�����s���s��xvz~~���s���s����~����s���s�����������s���s����������s���t�����������t���t��������t���u����������u����ut�stu�������������������������������������������0�.�����������b�������b����)#����d����$��F@
�����$)#��"()%�����*.)�^)..*����y04-��,340y���r68/Ξf031q���j;9��W����e���b>C�uHU��^���V��sBFHGDDZ���M��HM�NT���MRTW�XO���U�U��������������������������������������������z����z���������z�t�vt�q������z�z�}z�t�������z�}����vt�z���z�{|}}}|{�z���z��������z���z���������~�z���z���������z���z����������z���{���Ѩ�Ҏ���{���{�����������{���{����{���{����{�����{�������������������������������������������s�r�qr���s�����ͧ����r�orsro�e������r�w{|{w�g�������r�{�{Êgf�r���r����{�����r���s����{����y�r���s�������}�s���s����������s���s�������s���s����ʋ�s���s����������s���t����ٍ�����t���u�����������u����ut�s�tu������������������������������������������������s�r�qr���s�����ͧ����r�orsro�e������r�w{|{w�g�������r�{~zÊgf�r���r�~�~{x�����r���s��}���{~�r���s�����ϩ��s���s�������ق�s���s�������s���s��������s���s����临���s���t�����İ���t���u�����������u����uttssrs�tu������������������������������������������������������أ����֝������ש����՞�����ի����Ѱ��ӥ����ծ�������Ҥ����Ӯ���Ϥ����Ѱ�����̣����г�»����̤����β������ڳΤ��������̻Υ�������������ͥ���������̥����������Υ������������������������������������������������������������������������أ����֝������ש����՞�����ի����Ѱ��ӥ����ծ�������Ҥ����Ӯ���Ϥ����Ѱ�����̣����г�»����̤����β������ڳΤ��������̻Υ�������������ͥ���������̥����������Υ�����������������������������������������������������������������������أ����֝������ש����՞�����ի����Ѱ��ӥ����ծ�������Ҥ����Ӯ���Ϥ����Ѱ�����̣����г�»����̤����β������ڳΤ��������̻Υ�������������ͥ���������̥����������Υ����������������������������������������������������������������������أ����֝������ש����՞�����ի����Ѱ��ӥ����ծ�������Ҥ����Ӯ���Ϥ����Ѱ�����̣����г�»����̤����β������ڳΤ��������̻Υ�������������ͥ���������̥����������Υ������������������������������������������������������i\�[Z[i���\�����������[�X[\[W�M������[�_cdc_�O�������[�cggfb�rON�[���\�fhfd`x����[���\�hc�X�U�_e�\���\�i����h�\���\�k^��]��^k�\���\�m��aia��m�\���\�re��d��er�\���]�w���w�]���]�~x�m�m�x~�]���^����������^����^^�]\�]�^������������������������������������������������������������أ����֝������ש����՞�����ի����Ѱ��ӥ����ծ�������Ҥ����Ӯ���Ϥ����Ѱ�����̣����г�»����̤����β������ڳΤ��������̻Υ�������������ͥ���������̥����������Υ������������������������������������������������������������������������أ����֝������ש����՞�����ի����Ѱ��ӥ����ծ�������Ҥ����Ӯ���Ϥ����Ѱ�����̣����г�»����̤����β������ڳΤ��������̻Υ�������������ͥ���������̥����������Υ�������������������������������������������������������u����u������������u�u�wu�l������u�z�}{�n�������u�|zxxw��kl�u���u�|��}�u���u��~ywy}~���u���u����������u���u���������u���u����������u���u�����������u���u���������u���u����������u���v����v�����v���������������������������������������������������������������࿵����ߍ���փ�������ݓ����ԅ�����ۗ���Ѥ��؏����؛���ȩ���֎����՟�������ԏ����Ѣ���͝���я����Φ�������Ώ����̪��������̏����ɭ��媮�ɏ����ư������Ə����ĵ��������Đ����ļ�����đ��������������������������������������������������
�OA@@?>>??P���A��������h����@�=>7��|/�`���@�CD9��w0��e���@�GH=��tO32@���@�IJ?��P�}~@���A}LLB��?IKI|@���AzOOD��DOQOzA���AvRQF��DQTRvA���AsTPA��@QUTsA���ApVO���OWXpA���BlYP��PYZlB���Bj\YQMMQY]]jB���Cgcb�abccgC���nC�BCn����������������������������������������
�peddccbccq���e�������������d�@C<���V�����d�JND���W�������d�QTJ���sYX�d���d�WYO��f����d���d�\^U��R[[Y�d���d�bcZ��Zcda�d���d�ij`��^jki�d���d�nl`��^lpn�d���e�sm���ntt�e���e�yr��ryz�e���e��}wssw}���e���e��������e����f�ef��������������������������������������������k]�[�Z[j���]������ƛ����[�X[U���K������\�ad\���M�������\�hkc���xON�\���\�mog������\���\�qsk��hppn�\���]�vxo��owxu�]���]�{{s��r|}{�]���]��t��s���]���]����؀���]���]���������]���^�����������^���_�����������_����_�^_������������������������������������������0�.�����������b��������b���������d�����$!H7�����$))("F������*..*j��|$����y043'��-0y���r695���16r���j<=2��dm:<j���cA;��y>BCBc���ZB���?HIIH[���SS��OL�NT���OVPQV�XO���U�U������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ľ�������������������������������������������������Ҹ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ͯ������������������������������������������������������������������������������������������������������������������������������������������������������������˻��������ʺ����������̻���������ʼ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������-%����������'3'����������#z��ػ�������������������������v#+#w��������-3-��������{(1(|�����������-�	 .���!>-�.�/.->!���$B�;B$���0�$0������������������������������������������ſ�����������������񼽾�����������������������ɸ�������������������������������������������������������ÿ��������������������������������������������������������������������������������������������������������������ȿ���������������������������������������������׾����������������������������������������������������������������������������������������������������������������������������������������������������������ľ��������������������������������������������ѹ����������������������������������������������������������������������������������������������������������������������������������������������������������4�2�����������f��������f����$"/*�
���h����%*%��JD	�����+0*��)/1,�����150�d0551����|7;4��3:;7|���u>@7Тl8;:t���lEC��_����h���eFL�{O]��a���Z��zKOQPMM]���Q��RW�XW���Q]^�bcS���X�X�������������������������������������������������������������������������������������Ҿ����������������������������������������������������������������������������������������������������������������������������������������������������ľ�������������������������������������������������Ҹ������������������������������������������������������������������������������������������������������������������������������������������������������������������ľ�������������������������������������������������Ҹ������������������������������������������������������������������������������������������������������������������������������������������������������������4#�!� !5���#�������dl���!�!"!��[k���!�(-.-'���`k���!�/33/)�:�!���!�32*gb��z� ���!�5m���} ���!�8��VXT��v���!:�`NQK�x�v ���!y9�+5:7٠?z!�������|M{"��� k�D7:> �ZVx"���!m���V^v"���$td`�_`cilx$���Z$!� !"#$Z�������������������������������������������4#�!� !5���#�������dl���!�!"!��[k���!�(-.-'���`k���!�/33/)�:�!���!�32*gb��z� ���!�5m���} ���!�8��VXT��v���!:�`NQK�x�v ���!y9�+5:7٠?z!�������|M{"��� k�D7:> �ZVx"���!m���V^v"���$td`�_`cilx$���Z$!� !"#$Z������������������������������������������4#�!� !5���#�������dl���!�!"!��[k���!�(-.-'���`k���!�/33/)�:�!���!�32*gb��z� ���!�5m���} ���!�8��VXT��v���!:�`NQK�x�v ���!y9�+5:7٠?z!�������|M{"��� k�D7:> �ZVx"���!m���V^v"���$td`�_`cilx$���Z$!� !"#$Z�����������������������������������������4#�!� !5���#�������dl���!�!"!��[k���!�(-.-'���`k���!�/33/)�:�!���!�32*gb��z� ���!�5m���} ���!�8��VXT��v���!:�`NQK�x�v ���!y9�+5:7٠?z!�������|M{"��� k�D7:> �ZVx"���!m���V^v"���$td`�_`cilx$���Z$!� !"#$Z�������������������������������������������������������������ѳ�����ф�����|�������Ί�����~��������ʎ����ɚ~}ȇ����Ȑ��������Ƈ����đ�҆��΋�Ç��������ђ����������ˊ�����������������������������ϑ�������������מ���������ؖ��؞����������������������������������������������������������������������4#�!� !5���#�������dl���!�!"!��[k���!�(-.-'���`k���!�/33/)�:�!���!�32*gb��z� ���!�5m���} ���!�8��VXT��v���!:�`NQK�x�v ���!y9�+5:7٠?z!�������|M{"��� k�D7:> �ZVx"���!m���V^v"���$td`�_`cilx$���Z$!� !"#$Z�������������������������������������������4#�!� !5���#�������dl���!�!"!��[k���!�(-.-'���`k���!�/33/)�:�!���!�32*gb��z� ���!�5m���} ���!�8��VXT��v���!:�`NQK�x�v ���!y9�+5:7٠?z!�������|M{"��� k�D7:> �ZVx"���!m���V^v"���$td`�_`cilx$���Z$!� !"#$Z���������������������������������������������������������������������������������ʼ����������������������������������������������������������������������������������������������������������������������������������������������������������O@?>>�=>P���@��������s���?�;=6���-�i���?�BD9���/��m~���?�DF;���S20�?���@�FH=��Q����?���@�IJ@��=GHF�@���@KK@��@KLJ@���AzMMA��@MPMzA���AtOL<��;MQPtA���BoPH���HQQoB���BjRJ��JSTjB���BdVSKGGKSWWdB���C`ZZ�X�Z`C���n�Cn�����������������������������������������
��yxxwwvwx����y���¾��������x�uwr���k������x�|~w���m�������x���{����om�x���x���~�������x���x����������x���x�����������x���x�����������x���y�����������y���y�����ݐ���y���y���������y���y�����������y���z�����������z�����z������������������������������������������p�dc�bcq���e�������������d�BE>���V������d�LPF���W�������d�SVL���tYX�c���d�Z\R��h����c���d�_aX��U^^\�d���d�eg]��]fgd�d���d�kkb��`lmk�d���d�pnb��`nrp�d���d�uo���pvv�d���d�|u��v|}�d���d���zwwz����d���e���������e�����e����������������������������������������������������������������ƺ����䕗��܌�º����䝟���ێ�ĺ����ᡣ��٭��ߗ����१��ʹ���ݖ����ު�������ݗ����ۮ���ԫ���ۗ����ڲ�������ڗ����ض��������ؗ����պ��踻�՗����ӿ������ӗ������¿������ї���������ә��������������������������������������������������4�2�����������f��������f�����$�
���h����%�*'L;�����+00/*L�#�����1551p��+����|7;:/��"47|���u>A=���9>u���lEF<��jsCEl���eIC��FJKKe���^L���IQRRQ^���W]��XV�XW���RaZ[a�bcS���X�X��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#�3#�����������������������������������9����������
����������������������������������������������^��������������������������������������®��{��	w@TPQUR�M��,?��������9�����\���u�ɸ��Į���������������������������������������������������������������#�3#�������������������������������������������������������������@�\@�����������������������������������������������������������0�30�������������������������������������������������������������#�3#�������������������������������������������������������������"�3"�������������������������������������������������������������#�3#�������������������������������������������������������������"�3"�������������������������������������������������������������"�3"�������������������������������������������������������������#�3#������������������������������������������������������������������#�3#�������������������������������������������������������#�3#��������������������������������������������������������������#�3#�������������������������������������������������������������#�3#������������������������������������������������������������#�3#�������������������������������������������������������������#�3#�������������������������������������������������������������#�3#��������������������������������������������������������������#�3#������������������������������������������������������������"�3"��������������������������������������������������������������#�3#�������������������������������������������������������������#�3#������������������������������������������������������������#�3#��������������������������������������������������������������#�3#������������������������������������������������������������"�3"����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������img/src/icons-big.svg000064400000205207151215013440010504 0ustar00<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:xlink="http://www.w3.org/1999/xlink"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   width="48"
   height="1800"
   version="1.1"
   id="svg373"
   sodipodi:docname="icons-big.svg"
   inkscape:version="0.92.3 (2405546, 2018-03-11)"
   viewBox="0 0 480 18000"
   inkscape:export-filename="V:\osc\elFinder\img\icons-big.png"
   inkscape:export-xdpi="96"
   inkscape:export-ydpi="96">
  <metadata
     id="metadata377">
    <rdf:RDF>
      <cc:Work
         rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
        <dc:title></dc:title>
      </cc:Work>
    </rdf:RDF>
  </metadata>
  <sodipodi:namedview
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1"
     objecttolerance="10"
     gridtolerance="10"
     guidetolerance="10"
     inkscape:pageopacity="0"
     inkscape:pageshadow="2"
     inkscape:window-width="1303"
     inkscape:window-height="745"
     id="namedview375"
     showgrid="true"
     inkscape:zoom="2.5600001"
     inkscape:cx="-98.302751"
     inkscape:cy="1243.6181"
     inkscape:window-x="55"
     inkscape:window-y="-8"
     inkscape:window-maximized="1"
     inkscape:current-layer="g144"
     scale-x="10">
    <inkscape:grid
       snapvisiblegridlinesonly="false"
       type="xygrid"
       id="grid4855" />
  </sodipodi:namedview>
  <defs
     id="defs9">
    <linearGradient
       id="a">
      <stop
         offset="0"
         stop-color="#85b1d9"
         id="stop2" />
      <stop
         offset="1"
         stop-color="#dff0fe"
         id="stop4" />
    </linearGradient>
    <linearGradient
       gradientUnits="userSpaceOnUse"
       y2="12.5"
       x2="20.200001"
       y1="35.700001"
       x1="20.200001"
       id="c"
       xlink:href="#a"
       gradientTransform="matrix(1.2384623,0,0,1.2384623,-1.2075,27.023125)" />
    <linearGradient
       y2="7.4000001"
       x2="21.9"
       y1="35.400002"
       x1="21.700001"
       gradientUnits="userSpaceOnUse"
       id="b"
       xlink:href="#a"
       gradientTransform="matrix(1.2710547,0,0,1.2710547,-1.2075,-24.184375)" />
    <filter
       style="color-interpolation-filters:sRGB"
       inkscape:label="Lightness-Contrast"
       id="filter4723">
      <feColorMatrix
         values="1 0 0 -0.2 -0 0 1 0 -0.2 -0 0 0 1 -0.2 -0 0 0 0 1 0"
         id="feColorMatrix4721" />
    </filter>
    <filter
       style="color-interpolation-filters:sRGB"
       inkscape:label="Color Shift"
       id="filter6724">
      <feColorMatrix
         type="hueRotate"
         values="87"
         result="color1"
         id="feColorMatrix6720" />
      <feColorMatrix
         type="saturate"
         values="0.6"
         result="color2"
         id="feColorMatrix6722" />
    </filter>
    <filter
       style="color-interpolation-filters:sRGB"
       inkscape:label="Color Shift"
       id="filter7038">
      <feColorMatrix
         type="hueRotate"
         values="207"
         result="color1"
         id="feColorMatrix7034" />
      <feColorMatrix
         type="saturate"
         values="0.700521"
         result="color2"
         id="feColorMatrix7036" />
    </filter>
    <filter
       style="color-interpolation-filters:sRGB"
       inkscape:label="Color Shift"
       id="filter7265">
      <feColorMatrix
         type="hueRotate"
         values="203"
         result="color1"
         id="feColorMatrix7261" />
      <feColorMatrix
         type="saturate"
         values="0.7"
         result="color2"
         id="feColorMatrix7263" />
    </filter>
    <filter
       style="color-interpolation-filters:sRGB"
       inkscape:label="Color Shift"
       id="filter7301">
      <feColorMatrix
         type="hueRotate"
         values="135"
         result="color1"
         id="feColorMatrix7297" />
      <feColorMatrix
         type="saturate"
         values="0.7"
         result="color2"
         id="feColorMatrix7299" />
    </filter>
    <filter
       style="color-interpolation-filters:sRGB"
       inkscape:label="Lightness-Contrast"
       id="filter4723-7">
      <feColorMatrix
         values="1 0 0 -0.2 -0 0 1 0 -0.2 -0 0 0 1 -0.2 -0 0 0 0 1 0"
         id="feColorMatrix4721-9" />
    </filter>
    <linearGradient
       gradientTransform="matrix(1.00625,0,0,1.00625,2.9837097e-4,2476.3194)"
       id="a-5"
       gradientUnits="userSpaceOnUse"
       x1="41.000408"
       x2="7.0004101"
       xlink:href="#b-7"
       y1="47.001949"
       y2="3.0019529" />
    <linearGradient
       id="b-7">
      <stop
         offset="0"
         stop-color="#18a303"
         id="stop3" />
      <stop
         offset="1"
         stop-color="#43c330"
         id="stop5" />
    </linearGradient>
    <linearGradient
       id="a-7"
       gradientTransform="matrix(2.9999,0,0,2.9991699,-327.98767,-2928.2902)"
       gradientUnits="userSpaceOnUse"
       x1="123.66695"
       x2="111.66655"
       y1="991.70453"
       y2="977.03375">
      <stop
         offset="0"
         stop-color="#535353"
         id="stop2-2" />
      <stop
         offset="1"
         stop-color="#7e7e7e"
         id="stop4-0" />
    </linearGradient>
    <linearGradient
       id="c-4"
       gradientTransform="matrix(2.9999,0,0,2.9991699,-327.98767,-2928.2902)"
       gradientUnits="userSpaceOnUse"
       x1="123.66695"
       x2="111.66655"
       xlink:href="#b-0"
       y1="991.70453"
       y2="977.03375" />
    <linearGradient
       id="b-0">
      <stop
         offset="0"
         stop-color="#a33e03"
         id="stop3-7" />
      <stop
         offset="1"
         stop-color="#d36118"
         id="stop5-5" />
    </linearGradient>
    <linearGradient
       id="a-1"
       gradientUnits="userSpaceOnUse"
       x1="41.00082"
       x2="5.0008202"
       xlink:href="#b-0"
       y1="46"
       y2="2" />
    <linearGradient
       id="c-7"
       gradientTransform="matrix(2.9999,0,0,2.9991699,-327.98767,-2928.2902)"
       gradientUnits="userSpaceOnUse"
       x1="123.66695"
       x2="111.66655"
       xlink:href="#b-7"
       y1="991.70453"
       y2="977.03375" />
    <linearGradient
       id="a-18"
       gradientUnits="userSpaceOnUse"
       x1="41.000408"
       x2="7.0004101"
       xlink:href="#b-7"
       y1="47.001949"
       y2="3.0019529" />
    <linearGradient
       id="c-6"
       gradientTransform="matrix(2.9999,0,0,2.9991699,-327.98767,-2928.2902)"
       gradientUnits="userSpaceOnUse"
       x1="123.66695"
       x2="111.66655"
       xlink:href="#b-6"
       y1="991.70453"
       y2="977.03375" />
    <linearGradient
       id="b-6">
      <stop
         offset="0"
         stop-color="#0369a3"
         id="stop3-2" />
      <stop
         offset="1"
         stop-color="#1c99e0"
         id="stop5-7" />
    </linearGradient>
    <linearGradient
       id="a-78"
       gradientTransform="matrix(1.55551,0,0,1.66668,-315.98991,1319.0732)"
       gradientUnits="userSpaceOnUse"
       x1="230.14426"
       x2="204.42923"
       xlink:href="#b-6"
       y1="-762.63782"
       y2="-791.43756" />
  </defs>
  <g
     transform="matrix(9.9378882,0,0,9.9378884,0,-8369.388)"
     id="g371"
     inkscape:label="g-main"
     style="display:inline">
    <g
       id="g4874"
       transform="translate(-0.217187,1066.6249)">
      <path
         style="display:inline;fill:#ffffff"
         inkscape:connector-curvature="0"
         id="path11"
         d="m 42.2,-212.05533 v 35.2 h -36 v -46.7 h 24.4 z" />
      <path
         style="display:inline;fill:#788b9c;stroke-width:1.00625002"
         inkscape:connector-curvature="0"
         id="path13"
         d="m 30.454999,-223.24783 11.27,11.27 v 34.31312 H 7.009375 v -45.4825 h 23.546249 m 0.60375,-1.30812 H 5.5 v 48.3 h 37.734374 v -36.225 z" />
      <path
         style="display:inline;fill:#eef0f2;fill-opacity:1"
         inkscape:connector-curvature="0"
         id="path15"
         d="m 42.2,-212.05533 v 0.4 h -12 v -12 h 0.4 z" />
      <path
         style="display:inline;fill:#788b9c"
         inkscape:connector-curvature="0"
         id="path17"
         d="m 31.100937,-222.45644 10,10 h -9.9 v -10 m 0,-2 h -1.4 v 13.5 h 13.4 v -1.3 z" />
      <path
         style="font-weight:400;font-size:8.5px;font-family:sans-serif;letter-spacing:0;word-spacing:0;fill:#000080;stroke-width:0.2"
         inkscape:connector-curvature="0"
         id="path19"
         word-spacing="0"
         letter-spacing="0"
         font-size="8.5"
         font-weight="400"
         aria-label="?"
         d="m 21.2,-186.55533 h 4 v 4 h -4 z m 3.8,-2.3 h -3.6 v -2.5 q 0,-1.6 0.5,-2.6 0.5,-1 2.3,-2.4 l 1.7,-1.4 q 1,-0.8 1.6,-1.6 0.5,-0.7 0.5,-1.5 0,-1.4 -1.3,-2.2 -1.3,-1 -3.3,-1 -1.5,0 -3.3,0.6 -1.7,0.6 -3.6,1.6 v -3 q 1.9,-0.8 3.7,-1.3 1.9,-0.4 3.8,-0.4 3.6,0 5.7,1.5 2.2,1.6 2.2,4 0,1.3 -0.7,2.4 -0.7,1 -2.4,2.4 l -1.8,1.4 q -1,0.7 -1.3,1.1 -0.4,0.4 -0.5,0.8 l -0.2,0.8 v 1.3 z" />
    </g>
    <g
       id="g4867"
       transform="translate(0,916.1634)">
      <path
         style="fill:#b6dcfe;stroke-width:1.00625002"
         inkscape:connector-curvature="0"
         id="path21"
         d="m 0.60375,20.99625 v -39.445 H 13.685 l 3.82375,3.82375 h 30.1875 v 35.62125 z" />
      <path
         style="fill:#4788c7;stroke-width:1.00625002"
         inkscape:connector-curvature="0"
         id="path23"
         d="m 13.48375,-17.845 3.82375,3.82375 h 29.785 V 20.291875 H 1.308125 V -17.845 h 12.075 m 0.60375,-1.2075 H 0 V 21.6 H 48.3 V -15.22875 H 17.810625 Z" />
      <path
         style="fill:url(#b);stroke-width:1.27105474"
         inkscape:connector-curvature="0"
         id="path25"
         d="M 0.69908212,20.938069 V -12.109355 H 14.299368 l 3.813164,-2.542109 h 29.615576 v 35.589533 z" />
      <path
         style="fill:#4788c7;stroke-width:1.00625002"
         inkscape:connector-curvature="0"
         id="path27"
         d="M 47.0925,-14.02125 V 20.291875 H 1.308125 v -31.7975 h 13.08125 l 0.301875,-0.20125 3.521875,-2.314375 H 47.0925 M 48.3,-15.22875 H 17.810625 l -3.82375,2.515625 H 0 v 34.2125 h 48.3 z" />
    </g>
    <g
       id="g4861"
       transform="translate(0,916.4759)">
      <path
         style="fill:#b6dcfe;stroke-width:1.00625002"
         inkscape:connector-curvature="0"
         id="path29"
         d="M 0.60375,70.99625 V 32.5575 h 12.779375 l 3.723125,3.723125 H 42.765625 V 70.99625 Z" />
      <path
         style="fill:#4788c7;stroke-width:1.00625002"
         inkscape:connector-curvature="0"
         id="path31"
         d="m 13.08125,33.16125 3.723125,3.723125 H 42.2625 V 70.3925 H 1.2075 V 33.16125 H 13.08125 M 13.685,31.95375 H 0 V 71.6 H 43.26875 V 35.676875 H 17.408125 Z" />
      <path
         style="fill:url(#c);stroke-width:1.23846233"
         inkscape:connector-curvature="0"
         id="path33"
         d="M 0.7740397,70.988537 5.4801965,44.980829 H 18.855589 l 3.715387,-2.476925 h 25.016939 l -4.706157,28.484633 z" />
      <path
         style="fill:#4788c7;stroke-width:1.00625002"
         inkscape:connector-curvature="0"
         id="path35"
         d="m 46.89125,43.123125 -4.528125,27.16875 H 1.509375 L 6.0375,45.63875 H 19.018125 L 19.32,45.4375 22.640625,43.22375 h 24.15 M 48.3,41.815 H 22.33875 l -3.723125,2.515625 h -13.685 L 0,71.499375 h 43.26875 z" />
    </g>
    <g
       id="g4881"
       transform="translate(-0.217186,915.6874)">
      <path
         style="fill:#ffffff;stroke-width:1.00415802"
         inkscape:connector-curvature="0"
         id="path37"
         d="M 6.2029106,125.1172 V 78.1226 H 30.704365 l 11.648233,11.648232 v 35.145528 z" />
      <path
         style="fill:#4788c7;stroke-width:1.00625002"
         inkscape:connector-curvature="0"
         id="path39"
         d="M 30.454999,78.828441 41.724998,89.89719 v 34.41375 H 7.0093749 V 78.727816 H 30.555624 m 0.60375,-1.308125 H 5.5 v 48.299999 h 37.734372 v -36.225 z" />
      <path
         style="fill:#dff0fe;stroke-width:1.00415802"
         inkscape:connector-curvature="0"
         id="path41"
         d="M 30.302702,90.272911 V 78.223015 h 0.401663 l 11.648233,11.648233 v 0.401663 z" />
      <path
         style="fill:#4788c7;stroke-width:1.00415802"
         inkscape:connector-curvature="0"
         id="path43"
         d="m 31.005613,79.428005 10.04158,10.04158 h -9.941164 v -10.04158 m 0,-2.008316 h -1.405822 v 13.556133 h 13.455717 v -1.305406 z" />
      <path
         style="fill:none;stroke:#4788c7;stroke-width:1.33887398;stroke-miterlimit:10"
         inkscape:connector-curvature="0"
         id="path45"
         stroke-miterlimit="10"
         d="m 15.54158,99.61158 h 1.506237 v 6.02495 m 6.527027,-0.60249 c -0.702911,0 -1.305406,-0.70292 -1.305406,-1.40583 v -2.71122 a 1.3556135,1.3556135 0 0 1 2.711227,0 v 2.71122 c 0,0.70291 -0.602495,1.30541 -1.405821,1.30541 z m 8.033264,0 c -0.702911,0 -1.305406,-0.70292 -1.305406,-1.40583 v -2.71122 a 1.3556135,1.3556135 0 0 1 2.711227,0 v 2.71122 c 0,0.70291 -0.602495,1.30541 -1.405821,1.30541 z m 0,4.01663 h 1.506237 v 6.02495 m -8.13368,-0.70292 c -0.803327,0 -1.405821,-0.60249 -1.405821,-1.40582 v -2.61081 a 1.3556133,1.3556133 0 0 1 2.711226,0 v 2.61081 c 0,0.80333 -0.602495,1.40582 -1.305405,1.40582 z m -8.033264,0 c -0.803326,0 -1.405821,-0.60249 -1.405821,-1.40582 v -2.61081 a 1.3556133,1.3556133 0 0 1 2.711226,0 v 2.61081 c 0,0.80333 -0.602494,1.40582 -1.305405,1.40582 z" />
    </g>
    <g
       id="g"
       transform="matrix(1.0107447,0,0,1.0062525,-0.27626287,915.961)">
      <path
         d="m 6.5,37.5 v -35 h 18.3 l 8.7,8.7 v 26.3 z"
         transform="matrix(1.33333,0,0,1.33333,-2.5,124)"
         id="path47"
         inkscape:connector-curvature="0"
         style="fill:#ffffff" />
      <path
         d="M 24.6,3 33,11.4 V 37 H 7 V 3 H 24.6 M 25,2 H 6 V 38 H 34 V 11 Z"
         transform="matrix(1.33333,0,0,1.33333,-2.5,124)"
         id="path49"
         inkscape:connector-curvature="0"
         style="fill:#4788c7" />
      <path
         d="m 24.5,11.5 v -9 h 0.3 l 8.7,8.7 v 0.3 z"
         transform="matrix(1.33333,0,0,1.33333,-2.5,124)"
         id="path51"
         inkscape:connector-curvature="0"
         style="fill:#dff2fe;fill-opacity:1" />
      <path
         d="M 25,3.4 32.6,11 H 25 V 3.4 M 25,2 h -1 v 10 h 10 v -1 z"
         transform="matrix(1.33333,0,0,1.33333,-2.5,124)"
         id="path53"
         inkscape:connector-curvature="0"
         style="fill:#4788c7" />
      <g
         id="g57"
         style="fill:#4788c7">
        <path
           d="m 27.5,17 h -15 A 0.5,0.5 0 0 1 12,16.5 C 12,16.2 12.2,16 12.5,16 h 15 c 0.3,0 0.5,0.2 0.5,0.5 0,0.3 -0.2,0.5 -0.5,0.5 z m -4,3 h -11 A 0.5,0.5 0 0 1 12,19.5 C 12,19.2 12.2,19 12.5,19 h 11 c 0.3,0 0.5,0.2 0.5,0.5 0,0.3 -0.2,0.5 -0.5,0.5 z m 4,3 h -15 A 0.5,0.5 0 0 1 12,22.5 C 12,22.2 12.2,22 12.5,22 h 15 c 0.3,0 0.5,0.2 0.5,0.5 0,0.3 -0.2,0.5 -0.5,0.5 z m -4,3 h -11 A 0.5,0.5 0 0 1 12,25.5 C 12,25.2 12.2,25 12.5,25 h 11 c 0.3,0 0.5,0.2 0.5,0.5 0,0.3 -0.2,0.5 -0.5,0.5 z m 4,3 h -15 A 0.5,0.5 0 0 1 12,28.5 C 12,28.2 12.2,28 12.5,28 h 15 c 0.3,0 0.5,0.2 0.5,0.5 0,0.3 -0.2,0.5 -0.5,0.5 z"
           transform="matrix(1.33333,0,0,1.33333,-2.5,125.2)"
           id="path55"
           inkscape:connector-curvature="0" />
      </g>
    </g>
    <g
       id="g4891"
       transform="translate(-0.217187,915.6874)">
      <path
         style="fill:#ffffff;stroke-width:1.00625002"
         inkscape:connector-curvature="0"
         id="path60"
         d="m 6.204375,178.84969 h 24.552499 l 11.6725,11.6725 v 35.21875 H 6.204375 Z" />
      <path
         style="fill:#2ea26c;stroke-width:1.00625002"
         inkscape:connector-curvature="0"
         id="path62"
         d="m 30.454999,179.55407 11.27,11.06875 v 34.41375 H 7.009375 v -45.68375 h 23.546249 m 0.60375,-1.30813 H 5.5 v 48.3 h 37.734374 v -36.225 z" />
      <path
         style="fill:#e8f8f1;fill-opacity:1;stroke-width:1.00625002"
         inkscape:connector-curvature="0"
         id="path64"
         d="m 30.354374,178.84969 h 0.4025 l 11.6725,11.6725 v 0.4025 h -12.075 z" />
      <path
         style="fill:#2ea26c;stroke-width:1.00625002"
         inkscape:connector-curvature="0"
         id="path66"
         d="m 31.058749,180.05719 10.0625,10.0625 h -9.961875 v -10.0625 m 0,-2.0125 h -1.408749 v 13.58438 h 13.483749 v -1.30813 z" />
      <g
         id="g74"
         transform="matrix(1.3416633,0,0,1.3416633,-2.5499998,178.14532)"
         style="filter:url(#filter4723)">
        <path
           style="fill:#79efa8"
           inkscape:connector-curvature="0"
           id="path68"
           d="m 28,29 v -3 l -5,-4.8 -3,2.8 4.6,5 z" />
        <circle
           style="fill:#b5ffc9"
           id="circle70"
           cx="26"
           cy="17"
           r="2" />
        <path
           style="fill:#b5ffc9"
           inkscape:connector-curvature="0"
           id="path72"
           d="M 26,29 H 12 v -4 l 5,-5 z" />
      </g>
    </g>
    <g
       id="g96"
       transform="matrix(1.00625,0,0,1.00625,-0.2515625,916.2296)">
      <path
         d="m 6.2,273.9 v -46.7 h 24.4 l 11.6,11.6 v 35 z"
         id="path76"
         inkscape:connector-curvature="0"
         style="display:inline;fill:#ffffff;fill-opacity:1" />
      <path
         d="M 30.3,227.9 41.5,239 v 34.1 H 7 V 227.8 H 30.4 M 31,226.4 H 5.5 v 48 H 43 v -36 z"
         id="path78"
         inkscape:connector-curvature="0"
         style="fill:#7bad2a" />
      <path
         d="m 42.2,239.2 h -12 v -12 h 0.4 l 11.6,11.6 z"
         id="path80"
         inkscape:connector-curvature="0"
         style="fill:#f2f9e7;fill-opacity:1" />
      <path
         d="M 30.9,228.4 41,238.5 H 31 v -10.1 m 0,-1.9 H 29.6 V 240 H 43 v -1.4 z"
         id="path82"
         inkscape:connector-curvature="0"
         style="fill:#7bad2a" />
      <g
         id="g94">
        <path
           d="m 24.9,260 v -12.6 c 3.4,0 5.3,1.3 5.3,1.3 v 2.7 c 0,0 -2.4,-1.4 -4.7,-1.4"
           id="path84"
           inkscape:connector-curvature="0"
           style="fill:#c9e69a" />
        <path
           d="m 25.5,260 h -1.3 v -13.3 h 0.7 c 3.7,0 5.6,1.5 5.7,1.5 l 0.3,0.1 v 4.1 l -1,-0.5 c 0,0 -2.4,-1.2 -4.4,-1.2 z m 0,-10.6 c 1.5,0 3.1,0.5 4,0.9 v -1.2 c -0.5,-0.3 -1.8,-1 -4,-1 z"
           id="path86"
           inkscape:connector-curvature="0"
           style="fill:#7bad2a" />
        <g
           transform="matrix(1.33333,0,0,1.33333,-2.5,225.4)"
           id="g92">
          <circle
             cx="18"
             cy="26"
             r="2.5"
             id="circle88"
             style="fill:#c4e490" />
          <path
             d="m 18,24 a 2,2 0 0 1 2,2 2,2 0 0 1 -2,2 2,2 0 0 1 -2,-2 c 0,-1.1 0.9,-2 2,-2 m 0,-1 a 3,3 0 0 0 -3,3 3,3 0 0 0 3,3 3,3 0 0 0 3,-3 3,3 0 0 0 -3,-3 z"
             id="path90"
             inkscape:connector-curvature="0"
             style="fill:#7bad2a" />
        </g>
      </g>
    </g>
    <g
       id="g110"
       transform="matrix(1.00625,0,0,1.004158,-0.2515625,916.607)">
      <path
         d="m 30.6,277.3 11.6,11.6 v 35 h -36 v -46.6 z"
         id="path98"
         inkscape:connector-curvature="0"
         style="fill:#ffffff" />
      <path
         d="m 30.3,278 11.2,11.2 v 34 H 7 V 278 H 30.4 M 31,276.7 H 5.5 v 48 H 43 v -36 z"
         id="path100"
         inkscape:connector-curvature="0"
         style="fill:#788b9c" />
      <path
         d="m 30.6,277.3 11.6,11.6 v 0.4 h -12 v -12 z"
         id="path102"
         inkscape:connector-curvature="0"
         style="fill:#eef0f2;fill-opacity:1" />
      <path
         d="m 30.9,278.5 10,10.1 H 31 v -10.1 m 0,-1.9 H 29.6 V 290 H 43 v -1.3 z"
         id="path104"
         inkscape:connector-curvature="0"
         style="fill:#788b9c" />
      <g
         id="g108">
        <path
           d="m 18.9,313.9 14.7,-8.3 -14.7,-8.3 z"
           id="path106"
           inkscape:connector-curvature="0"
           style="fill:#8bb7f0" />
      </g>
    </g>
    <g
       id="g144"
       transform="matrix(1.00625,0,0,1.00625,-0.2515625,916.129)">
      <path
         d="m 6.2,524 v -46.7 h 24.4 l 11.6,11.6 v 35 z"
         id="path114"
         inkscape:connector-curvature="0"
         style="fill:#ffffff" />
      <path
         d="m 30.3,478 11.2,11 v 34.2 H 7 V 477.8 H 30.4 M 31,476.5 H 5.5 v 48 H 43 v -36 z"
         id="path116"
         inkscape:connector-curvature="0"
         style="fill:#4788c7" />
      <path
         d="m 30.2,489.3 v -12 h 0.4 l 11.6,11.6 v 0.4 z"
         id="path118"
         inkscape:connector-curvature="0"
         style="fill:#dff0fe" />
      <path
         d="m 30.9,478.5 10,10 H 31 v -10 m 0,-2 H 29.6 V 490 H 43 v -1.3 z"
         id="path120"
         inkscape:connector-curvature="0"
         style="fill:#4788c7" />
      <g
         id="g142">
        <path
           d="m 36.7,507 a 12.4,12.4 0 0 1 -24.8,0 c 0,-6.8 5.5,-12.3 12.4,-12.3 6.9,0 12.4,5.5 12.4,12.3 z"
           id="path122"
           inkscape:connector-curvature="0"
           style="fill:#c2e8ff" />
        <path
           d="m 31.6,516.7 -0.4,-1.3 a 8,8 0 0 1 -0.6,-1.7 v -0.5 c -0.1,-0.4 -0.2,-0.9 -0.6,-1.3 l -0.6,-0.4 h -0.2 c -0.5,-0.3 -1,-0.3 -1.4,-0.3 -0.8,0 -1.2,-0.1 -1.6,-0.6 -0.1,-0.2 -0.1,-0.4 0,-0.8 v -0.3 l 0.3,-0.6 0.3,-0.6 v -0.1 l 0.4,-0.8 0.5,-1.3 0.1,-0.6 v -0.3 l 0.6,-0.3 h 0.1 l 0.1,-0.2 c 0.1,0 0.3,-0.1 0.3,-0.4 l -0.1,-0.4 c 0,0 0,-0.2 0.2,-0.2 l 1,-1 a 29.8,29.8 0 0 0 1.4,-1.3 v -0.5 c 0,-0.1 -0.2,-0.3 -0.4,-0.3 a 3,3 0 0 0 -0.4,-0.1 l -0.3,-0.2 h -0.1 v -0.1 l 0.5,-0.7 0.5,-0.7 0.3,-0.3 c 0.1,-0.3 0.3,-0.5 0.5,-0.6 a 1,1 0 0 1 0.7,0 12.3,12.3 0 0 1 -1,19.1 z"
           id="path124"
           inkscape:connector-curvature="0"
           style="fill:#bae0bd" />
        <path
           d="m 32.4,498.2 h 0.1 a 12,12 0 0 1 3.8,8.8 c 0,3.7 -1.6,7.1 -4.4,9.4 -0.2,-0.3 -0.3,-0.7 -0.3,-1 v -0.1 l -0.1,-0.1 c -0.3,-0.5 -0.4,-1 -0.5,-1.6 l -0.1,-0.4 c -0.1,-0.4 -0.2,-1 -0.6,-1.5 -0.2,-0.3 -0.6,-0.5 -0.8,-0.5 l -0.2,-0.1 -1.5,-0.3 c -0.8,0 -1,0 -1.3,-0.3 v -0.6 -0.3 l 0.3,-0.6 0.3,-0.6 0.4,-0.8 0.6,-1.4 v -0.7 -0.1 l 0.5,-0.2 0.2,-0.1 c 0.1,-0.1 0.4,-0.3 0.4,-0.8 v -0.4 l 1,-1 1,-1 c 0.3,0 0.4,-0.2 0.5,-0.4 v -0.7 a 0.9,0.9 0 0 0 -0.6,-0.5 l -0.4,-0.1 0.7,-1.2 0.3,-0.3 0.4,-0.5 h 0.3 m 0,-0.7 H 32 c -0.4,0.2 -0.7,0.8 -1,1.1 l -1,1.4 c -0.1,0.2 -0.3,0.5 -0.1,0.6 l 0.3,0.1 0.7,0.3 c 0.1,0 0.3,0.2 0.1,0.3 l -0.1,0.2 -2.2,2 -0.3,0.6 c 0,0.1 0.2,0.1 0.2,0.3 l -0.3,0.3 -0.7,0.4 c -0.2,0.3 0,0.7 -0.2,1 -0.1,0.8 -0.6,1.3 -0.9,2 l -0.7,1.4 c 0,0.6 -0.1,1 0.2,1.4 0.7,1 2,0.5 3,1 0.3,0 0.6,0 0.7,0.3 0.5,0.5 0.5,1.2 0.6,1.6 l 0.6,1.8 c 0.1,0.7 0.4,1.4 0.6,2 l 0.3,-0.2 a 12.8,12.8 0 0 0 1,-19.7 l -0.4,-0.1 z"
           id="path126"
           inkscape:connector-curvature="0"
           style="fill:#5e9c76" />
        <path
           d="m 24.4,500 -0.1,-1.1 0.1,-0.7 c 0.1,-0.4 0.2,-0.8 0.1,-1.3 l -0.1,-1.2 v -0.3 H 24 l -0.4,-0.1 H 23.3 V 495 l 0.2,-0.4 a 12.2,12.2 0 0 1 4.9,0.7 c 0,0.1 -0.1,0.5 -0.5,1.1 v 0.2 c -0.2,0.5 -0.5,1 -0.8,1.1 -0.3,0.4 -0.7,0.8 -1.1,1 l -0.7,0.6 -0.7,0.5 a 2.7,2.7 0 0 0 -0.3,0.2 z"
           id="path128"
           inkscape:connector-curvature="0"
           style="fill:#bae0bd" />
        <path
           d="m 24.2,494.9 c 1.3,0 2.6,0.2 3.9,0.6 l -0.4,0.8 v 0.2 a 2,2 0 0 1 -0.7,1 l -1.1,1 -0.7,0.5 -0.6,0.5 v -0.6 l 0.1,-0.6 c 0.1,-0.4 0.3,-0.8 0.2,-1.4 l -0.2,-1.3 v -0.4 L 24.2,495 h -0.4 v -0.1 h 0.4 m 0,-0.7 H 23.4 L 23,495 c -0.1,0.7 0.5,0.6 1,0.7 l 0.2,1.3 c 0.2,0.7 -0.3,1.2 -0.3,1.9 0,0.4 0,1.2 0.3,1.5 h 0.2 l 0.5,-0.3 1.3,-1 1.2,-1 c 0.4,-0.4 0.7,-1 0.9,-1.4 0.1,-0.3 0.6,-1.1 0.5,-1.6 a 13,13 0 0 0 -4.6,-0.9 z"
           id="path130"
           inkscape:connector-curvature="0"
           style="fill:#5e9c76" />
        <g
           id="g136">
          <path
             d="m 20.5,519 a 12.4,12.4 0 0 1 -2.2,-1 v -0.5 l -0.2,-0.6 -0.2,-0.8 a 18.7,18.7 0 0 0 -0.6,-1.4 c -0.2,-0.5 -0.5,-1 -0.5,-1.5 v -0.5 c 0,-0.5 0,-1.1 -0.3,-1.7 h 2.9 l 0.3,0.1 c 0.3,0.1 0.7,0.2 0.9,0.4 v 0.3 l 0.3,0.5 c 0.6,0.7 1.3,0.8 2,1 l 0.6,0.2 c 0.1,0 0.2,0 0.2,0.3 0.2,0.4 0,0.9 0,1.1 l -0.2,0.3 c 0,0.3 -0.2,0.7 -0.4,1 l -0.8,0.4 -0.8,0.9 -0.4,0.5 -0.1,0.1 v 0.1 l -0.5,0.7 z m -5,-8.7 -0.6,-0.3 c -0.3,0 -0.6,-0.2 -0.8,-0.3 -1,-0.6 -1.7,-1.5 -2.1,-2.2 0,-0.2 -0.2,-0.3 -0.3,-0.4 0,-3.5 1.4,-6.7 3.8,-9 a 12,12 0 0 1 3.5,-0.7 h 0.7 c 0.4,0.2 0.8,0.4 1,0.7 0.3,0.3 0.7,0.6 0.7,1 h -1.2 l -0.6,-0.6 a 1,1 0 0 0 -0.4,-0.1 c -1,0 -2.3,1.8 -2.4,2.5 a 2,2 0 0 0 0,1.4 c 0.2,0.3 0.5,0.5 0.8,0.6 0.5,0 1,-0.4 1.5,-0.9 l 0.5,-0.3 0.4,-0.3 0.2,-0.1 h 0.2 c 0.9,0 1.5,0.8 1.7,1.6 v 0.5 c -0.3,0.6 -1.4,1.1 -2.4,1.4 H 19.6 19 c -0.9,0.4 -1.8,1.4 -1.8,2.4 l -0.1,0.8 a 1,1 0 0 0 -0.6,-0.5 c -0.1,-0.2 -0.2,-0.2 -0.4,-0.2 l -0.4,-0.1 -0.6,-0.2 a 1,1 0 0 0 -0.5,0.2 c -0.3,0.2 -0.8,0.8 -0.8,1.4 0,0.2 0,0.5 0.3,0.7 l 0.4,0.2 h 0.3 l 0.2,-0.1 h 0.1 v 0.2 a 56.9,56.9 0 0 0 0.5,0.7 z"
             id="path132"
             inkscape:connector-curvature="0"
             style="fill:#bae0bd" />
          <path
             d="m 19,497.7 h 0.6 l 1,0.7 0.3,0.4 h -0.5 l -0.5,-0.5 -0.1,-0.1 h -0.2 l -0.4,-0.1 c -1.3,0 -2.6,2 -2.8,2.6 -0.1,0.5 -0.1,1.3 0.2,1.8 0.2,0.4 0.5,0.6 1,0.7 0.6,0 1,-0.4 1.7,-1 l 0.5,-0.2 0.3,-0.3 0.2,-0.1 c 0.7,0 1.3,0.7 1.5,1.4 v 0.2 c -0.2,0.4 -1,1 -2.1,1.3 h -0.4 a 1,1 0 0 0 -0.5,0 c -1,0.4 -2,1.5 -2,2.6 v 0.1 A 0.9,0.9 0 0 0 16.1,507 l -0.3,-0.1 a 2,2 0 0 0 -0.7,-0.2 c -0.3,0 -0.5,0 -0.7,0.2 l -0.1,0.1 c -0.3,0.2 -0.8,0.9 -0.8,1.6 v 0.2 c -0.5,-0.5 -1,-1 -1.2,-1.5 a 7,7 0 0 0 -0.2,-0.3 12,12 0 0 1 3.6,-8.7 c 1.2,-0.3 2.4,-0.6 3.3,-0.6 m 0.3,13.7 a 16.4,16.4 0 0 0 1,0.3 v 0.2 l 0.2,0.5 0.1,0.1 v 0.1 c 0.7,0.7 1.5,0.9 2.1,1 l 0.7,0.2 v 0.9 h -0.1 v 0.1 l -0.1,0.3 -0.3,0.8 -0.7,0.4 H 22 l -0.9,1 -0.4,0.5 -0.2,0.2 v 0.1 l -0.2,0.4 -1.8,-0.7 v -0.4 l -0.1,-0.5 v -0.2 l -0.3,-0.7 -0.2,-0.7 a 8,8 0 0 0 -0.4,-0.8 3,3 0 0 1 -0.4,-1.3 v -0.5 L 17,511.4 h 2.2 M 19,497 c -1,0 -2.5,0.2 -3.7,0.6 -2.4,2.4 -3.9,5.7 -3.9,9.3 v 0.2 l 0.3,0.4 c 0.4,0.9 1.3,1.8 2.2,2.4 0.6,0.4 1.7,0.4 2.3,1.1 0.4,0.6 0.3,1.3 0.3,2 0,1 0.6,1.7 0.9,2.4 l 0.4,1.4 0.2,1.2 v 0.1 c 0.8,0.5 1.7,0.8 2.5,1 0.2,0 0.8,-0.8 0.8,-1 0.4,-0.4 0.7,-1 1.2,-1.3 l 0.8,-0.5 c 0.3,-0.3 0.5,-1 0.6,-1.3 0.2,-0.3 0.3,-1 0.2,-1.4 -0.1,-0.2 -0.2,-0.4 -0.5,-0.5 -0.8,-0.3 -1.7,-0.3 -2.4,-1 l -0.3,-1 -1.5,-0.5 h -2.9 c -0.4,-0.2 -0.7,-0.7 -1,-1.2 0,-0.1 0,-0.4 -0.3,-0.4 h -0.7 -0.2 l -0.1,-0.5 c 0,-0.4 0.3,-0.8 0.5,-1.1 l 0.4,-0.1 1,0.2 0.3,0.2 c 0.4,0.1 0.5,0.7 0.5,1.1 v 0.3 c 0,0.2 0.2,0.2 0.3,0.2 l 0.3,-2.2 c 0,-0.9 0.9,-1.8 1.6,-2 h 0.7 c 1,-0.3 3.1,-1.2 2.7,-2.4 -0.3,-1 -1,-1.9 -2.1,-1.9 H 20 l -0.7,0.5 c -0.4,0.3 -1.3,1.1 -1.7,1.1 -0.8,-0.1 -0.8,-1.1 -0.6,-1.6 0.1,-0.5 1.3,-2.2 2.1,-2.2 h 0.2 l 0.6,0.6 c 0.3,0.2 0.7,0.2 1.2,0.2 l 0.4,-0.2 0.1,-0.3 c 0,-0.4 -0.4,-0.8 -0.7,-1.1 -0.3,-0.3 -0.7,-0.6 -1.2,-0.7 A 3,3 0 0 0 18.9,497 Z"
             id="path134"
             inkscape:connector-curvature="0"
             style="fill:#5e9c76" />
        </g>
        <g
           id="g140">
          <path
             d="m 24.2,494.9 a 12.1,12.1 0 1 1 0,24.2 12.1,12.1 0 0 1 0,-24.2 m 0,-0.7 a 12.8,12.8 0 1 0 0,25.6 12.8,12.8 0 0 0 0,-25.6 z"
             id="path138"
             inkscape:connector-curvature="0"
             style="fill:#7496c4" />
        </g>
      </g>
    </g>
    <g
       id="g164"
       transform="matrix(1.00625,0,0,1.00625,-0.2515625,916.129)">
      <path
         d="m 6.2,374 v -46.7 h 24.4 l 11.6,11.6 v 35 z"
         id="path146"
         inkscape:connector-curvature="0"
         style="fill:#ffffff" />
      <path
         d="m 30.3,328 11.2,11 v 34.2 H 7 V 327.8 H 30.4 M 31,326.5 H 5.5 v 48 H 43 v -36 z"
         id="path148"
         inkscape:connector-curvature="0"
         style="fill:#4788c7" />
      <path
         d="m 30.2,339.3 v -12 h 0.4 l 11.6,11.6 v 0.4 z"
         id="path150"
         inkscape:connector-curvature="0"
         style="fill:#dff0fe" />
      <path
         d="m 30.9,328.5 10,10 H 31 v -10 m 0,-2 H 29.6 V 340 H 43 v -1.3 z"
         id="path152"
         inkscape:connector-curvature="0"
         style="fill:#4788c7" />
      <path
         d="m 34.2,347.9 h -20 a 0.7,0.7 0 0 1 -0.7,-0.7 c 0,-0.3 0.3,-0.6 0.7,-0.6 h 20 c 0.4,0 0.7,0.3 0.7,0.6 0,0.4 -0.3,0.7 -0.7,0.7 z"
         id="path154"
         inkscape:connector-curvature="0"
         style="fill:#800080" />
      <path
         d="M 28.9,351.9 H 14.2 a 0.7,0.7 0 0 1 -0.7,-0.7 c 0,-0.3 0.3,-0.6 0.7,-0.6 H 29 c 0.3,0 0.6,0.3 0.6,0.6 0,0.4 -0.3,0.7 -0.6,0.7 z"
         id="path156"
         inkscape:connector-curvature="0"
         style="fill:#ff5555" />
      <path
         d="m 34.2,355.9 h -20 a 0.7,0.7 0 0 1 -0.7,-0.7 c 0,-0.3 0.3,-0.6 0.7,-0.6 h 20 c 0.4,0 0.7,0.3 0.7,0.6 0,0.4 -0.3,0.7 -0.7,0.7 z"
         id="path158"
         inkscape:connector-curvature="0"
         style="fill:#008000" />
      <path
         d="M 28.9,359.9 H 14.2 a 0.7,0.7 0 0 1 -0.7,-0.7 c 0,-0.3 0.3,-0.6 0.7,-0.6 H 29 c 0.3,0 0.6,0.3 0.6,0.6 0,0.4 -0.3,0.7 -0.6,0.7 z"
         id="path160"
         inkscape:connector-curvature="0"
         style="fill:#808000" />
      <path
         d="m 34.2,363.9 h -20 a 0.7,0.7 0 0 1 -0.7,-0.7 c 0,-0.3 0.3,-0.6 0.7,-0.6 h 20 c 0.4,0 0.7,0.3 0.7,0.6 0,0.4 -0.3,0.7 -0.7,0.7 z"
         id="path162"
         inkscape:connector-curvature="0"
         style="fill:#550000" />
    </g>
    <g
       id="g174"
       transform="matrix(1.00625,0,0,1.00625,-0.2515625,916.3302)">
      <path
         d="m 42.2,388.6 v 35 H 6.2 V 377 h 24.4 z"
         id="path166"
         inkscape:connector-curvature="0"
         style="fill:#ffffff" />
      <path
         d="m 30.3,377.6 11.2,11.2 V 423 H 7 V 377.6 H 30.4 M 31,376.3 H 5.5 v 48 H 43 v -36 z"
         id="path168"
         inkscape:connector-curvature="0"
         style="fill:#c74343" />
      <path
         d="m 42.2,388.6 v 0.4 h -12 v -12 h 0.4 z"
         id="path170"
         inkscape:connector-curvature="0"
         style="fill:#ffd9d9" />
      <path
         d="M 30.9,378.2 41,388.3 H 31 v -10.1 m 0,-1.9 h -1.4 v 13.3 H 43 v -1.3 z m -15.9,40.4 c -0.9,0 -1.6,-0.6 -1.6,-1.3 0,-1.9 2.4,-3.3 5.5,-4.4 a 38,38 0 0 0 3.5,-7.9 c -0.8,-2 -1.2,-3.7 -1.2,-5 0,-0.7 0.1,-1.4 0.4,-1.8 0.2,-0.5 0.8,-0.9 1.4,-0.9 0.6,0 1.1,0.3 1.4,0.8 0.2,0.4 0.2,1 0.2,1.6 0,1.2 -0.4,3 -0.9,5 a 26,26 0 0 0 3.7,6.2 c 2.4,-0.3 4.4,-0.1 5.5,0.3 1.3,0.4 1.6,1.2 1.6,1.7 0,0.5 -0.3,1.9 -2.5,1.9 -1.9,0 -3.8,-1 -5.2,-2.7 -2.4,0.3 -5,0.8 -7.2,1.5 -1.2,3 -3,5 -4.6,5 z m -0.2,-1.3 h 0.2 c 0.7,0 1.8,-1 2.8,-2.5 -1.8,0.8 -3,1.7 -3,2.5 z m 14.1,-5 c 1,1 2.3,1.5 3.3,1.5 1.2,0 1.2,-0.4 1.2,-0.5 0,-0.3 -0.5,-0.4 -0.6,-0.5 -1,-0.4 -2.3,-0.6 -3.9,-0.4 z m -5.7,-5.5 a 40,40 0 0 1 -2.4,5.4 c 1.7,-0.4 3.4,-0.8 5,-1 a 35,35 0 0 1 -2.6,-4.4 z m 0,-8.2 c -0.2,0 -0.3,0 -0.3,0.2 l -0.1,1 c 0,0.8 0.1,1.8 0.4,2.8 0.2,-1 0.4,-2 0.4,-2.9 0,-0.7 -0.2,-1 -0.2,-1 h -0.2 z"
         id="path172"
         inkscape:connector-curvature="0"
         style="fill:#c74343" />
    </g>
    <g
       id="g184"
       transform="matrix(1.00625,0,0,1.00625,-0.2515625,916.129)">
      <path
         d="m 6.2,474 v -46.7 h 24.4 l 11.6,11.6 v 35 z"
         id="path176"
         inkscape:connector-curvature="0"
         style="fill:#ffffff" />
      <path
         d="m 30.2,439.3 v -12 h 0.4 l 11.6,11.6 v 0.4 z"
         id="path178"
         inkscape:connector-curvature="0"
         style="fill:#ffd5d5" />
      <path
         d="m 30.3,428 11.2,11 v 34.2 H 7 V 427.8 H 30.4 M 31,426.5 H 5.5 v 48 H 43 v -36 z"
         id="path180"
         inkscape:connector-curvature="0"
         style="fill:#e64a19" />
      <path
         d="m 30.9,428.5 10,10 H 31 v -10 m 0,-2 H 29.6 V 440 H 43 v -1.3 z m -18.2,22.5 14.5,-5.3 7.9,2 v 22.4 l -8,2 -14.4,-5.3 14.5,2 v -19.1 l -9.3,2 v 13.1 l -5.2,2 z"
         id="path182"
         inkscape:connector-curvature="0"
         style="fill:#e64a19" />
    </g>
    <g
       id="d"
       transform="matrix(1.0107447,0,0,1.0062525,-0.27626287,915.96)">
      <path
         d="m 6.5,37.5 v -35 h 18.3 l 8.7,8.7 v 26.3 z"
         transform="matrix(1.33333,0,0,1.33333,-2.5,524)"
         id="path186"
         inkscape:connector-curvature="0"
         style="fill:#ffffff" />
      <path
         d="M 24.6,3 33,11.4 V 37 H 7 V 3 H 24.6 M 25,2 H 6 V 38 H 34 V 11 Z"
         transform="matrix(1.33333,0,0,1.33333,-2.5,524)"
         id="path188"
         inkscape:connector-curvature="0"
         style="fill:#4788c7" />
      <path
         d="m 24.5,11.5 v -9 h 0.3 l 8.7,8.7 v 0.3 z"
         transform="matrix(1.33333,0,0,1.33333,-2.5,524)"
         id="path190"
         inkscape:connector-curvature="0"
         style="fill:#dff0fe" />
      <path
         d="M 25,3.4 32.6,11 H 25 V 3.4 M 25,2 h -1 v 10 h 10 v -1 z"
         transform="matrix(1.33333,0,0,1.33333,-2.5,524)"
         id="path192"
         inkscape:connector-curvature="0"
         style="fill:#4788c7" />
      <g
         stroke-miterlimit="10"
         id="g196"
         style="fill:none;stroke:#4788c7;stroke-linecap:round;stroke-miterlimit:10">
        <path
           d="m 25.5,19.5 2,4 -2,4 m -11,-8 -2,4 2,4 m 8,-11 -5,14"
           transform="matrix(1.33333,0,0,1.33333,-2.5,525.3)"
           id="path194"
           inkscape:connector-curvature="0" />
      </g>
    </g>
    <g
       id="f"
       transform="matrix(1.0107447,0,0,1.0062525,-0.27626287,915.9588)">
      <path
         d="m 6.5,2.5 h 27 v 35 h -27 z"
         transform="matrix(1.33333,0,0,1.33333,-2.5,974)"
         id="path199"
         inkscape:connector-curvature="0"
         style="fill:#ffeea3" />
      <path
         d="M 33,3 V 37 H 7 V 3 H 33 M 34,2 H 6 v 36 h 28 z"
         transform="matrix(1.33333,0,0,1.33333,-2.5,974)"
         id="path201"
         inkscape:connector-curvature="0"
         style="fill:#ba9b48" />
      <path
         d="m 20,30.5 c -2,0 -3.5,-1.6 -3.5,-3.5 0,-0.6 0.4,-2.5 1,-5.3 0.1,-0.7 0.7,-1.2 1.4,-1.2 h 2.2 c 0.7,0 1.3,0.5 1.4,1.2 l 1,5.3 c 0,2 -1.6,3.5 -3.5,3.5 z"
         transform="matrix(1.33333,0,0,1.33333,-2.5,974)"
         id="path203"
         inkscape:connector-curvature="0"
         style="fill:#fffae0" />
      <path
         d="m 21,21 c 0.5,0 1,0.3 1,0.8 1,4 1,5 1,5.2 a 3,3 0 0 1 -6,0 c 0,-0.2 0,-1.1 1,-5.2 A 1,1 0 0 1 19,21 h 2 m 0,-1 h -2 a 2,2 0 0 0 -2,1.6 c -0.4,1.8 -1,4.6 -1,5.4 a 4,4 0 0 0 8,0 c 0,-0.8 -0.6,-3.6 -1,-5.4 A 2,2 0 0 0 21,20 Z"
         transform="matrix(1.33333,0,0,1.33333,-2.5,974)"
         id="path205"
         inkscape:connector-curvature="0"
         style="fill:#ba9b48" />
      <circle
         cx="20"
         cy="27"
         r="1.5"
         transform="matrix(1.33333,0,0,1.33333,-2.5,974)"
         id="circle207"
         style="fill:#ba9b48" />
      <path
         d="M 22.5,19 H 20 l -1,-1 h 3.5 z"
         transform="matrix(1.33333,0,0,1.33333,-2.5,974)"
         id="path209"
         inkscape:connector-curvature="0"
         style="fill:#ba9b48" />
      <circle
         cx="22.5"
         cy="18.5"
         r="0.5"
         transform="matrix(1.33333,0,0,1.33333,-2.5,974)"
         id="circle211"
         style="fill:#ba9b48" />
      <path
         d="M 17.5,20 H 20 l 1,-1 h -3.5 z"
         transform="matrix(1.33333,0,0,1.33333,-2.5,974)"
         id="path213"
         inkscape:connector-curvature="0"
         style="fill:#ba9b48" />
      <circle
         cx="17.5"
         cy="19.5"
         r="0.5"
         transform="matrix(1.33333,0,0,1.33333,-2.5,974)"
         id="circle215"
         style="fill:#ba9b48" />
      <path
         d="M 22.5,17 H 20 l -1,-1 h 3.5 z"
         transform="matrix(1.33333,0,0,1.33333,-2.5,974)"
         id="path217"
         inkscape:connector-curvature="0"
         style="fill:#ba9b48" />
      <circle
         cx="22.5"
         cy="16.5"
         r="0.5"
         transform="matrix(1.33333,0,0,1.33333,-2.5,974)"
         id="circle219"
         style="fill:#ba9b48" />
      <path
         d="M 17.5,18 H 20 l 1,-1 h -3.5 z"
         transform="matrix(1.33333,0,0,1.33333,-2.5,974)"
         id="path221"
         inkscape:connector-curvature="0"
         style="fill:#ba9b48" />
      <circle
         cx="17.5"
         cy="17.5"
         r="0.5"
         transform="matrix(1.33333,0,0,1.33333,-2.5,974)"
         id="circle223"
         style="fill:#ba9b48" />
      <path
         d="M 22.5,15 H 20 l -1,-1 h 3.5 z"
         transform="matrix(1.33333,0,0,1.33333,-2.5,974)"
         id="path225"
         inkscape:connector-curvature="0"
         style="fill:#ba9b48" />
      <circle
         cx="22.5"
         cy="14.5"
         r="0.5"
         transform="matrix(1.33333,0,0,1.33333,-2.5,974)"
         id="circle227"
         style="fill:#ba9b48" />
      <path
         d="M 17.5,16 H 20 l 1,-1 h -3.5 z"
         transform="matrix(1.33333,0,0,1.33333,-2.5,974)"
         id="path229"
         inkscape:connector-curvature="0"
         style="fill:#ba9b48" />
      <circle
         cx="17.5"
         cy="15.5"
         r="0.5"
         transform="matrix(1.33333,0,0,1.33333,-2.5,974)"
         id="circle231"
         style="fill:#ba9b48" />
      <path
         d="M 22.5,13 H 20 l -1,-1 h 3.5 z"
         transform="matrix(1.33333,0,0,1.33333,-2.5,974)"
         id="path233"
         inkscape:connector-curvature="0"
         style="fill:#ba9b48" />
      <circle
         cx="22.5"
         cy="12.5"
         r="0.5"
         transform="matrix(1.33333,0,0,1.33333,-2.5,974)"
         id="circle235"
         style="fill:#ba9b48" />
      <path
         d="M 17.5,14 H 20 l 1,-1 h -3.5 z"
         transform="matrix(1.33333,0,0,1.33333,-2.5,974)"
         id="path237"
         inkscape:connector-curvature="0"
         style="fill:#ba9b48" />
      <circle
         cx="17.5"
         cy="13.5"
         r="0.5"
         transform="matrix(1.33333,0,0,1.33333,-2.5,974)"
         id="circle239"
         style="fill:#ba9b48" />
      <path
         d="M 22.5,11 H 20 l -1,-1 h 3.5 z"
         transform="matrix(1.33333,0,0,1.33333,-2.5,974)"
         id="path241"
         inkscape:connector-curvature="0"
         style="fill:#ba9b48" />
      <circle
         cx="22.5"
         cy="10.5"
         r="0.5"
         transform="matrix(1.33333,0,0,1.33333,-2.5,974)"
         id="circle243"
         style="fill:#ba9b48" />
      <path
         d="M 17.5,12 H 20 l 1,-1 h -3.5 z"
         transform="matrix(1.33333,0,0,1.33333,-2.5,974)"
         id="path245"
         inkscape:connector-curvature="0"
         style="fill:#ba9b48" />
      <circle
         cx="17.5"
         cy="11.5"
         r="0.5"
         transform="matrix(1.33333,0,0,1.33333,-2.5,974)"
         id="circle247"
         style="fill:#ba9b48" />
      <path
         d="M 22.5,9 H 20 L 19,8 h 3.5 z"
         transform="matrix(1.33333,0,0,1.33333,-2.5,974)"
         id="path249"
         inkscape:connector-curvature="0"
         style="fill:#ba9b48" />
      <circle
         cx="22.5"
         cy="8.5"
         r="0.5"
         transform="matrix(1.33333,0,0,1.33333,-2.5,974)"
         id="circle251"
         style="fill:#ba9b48" />
      <path
         d="M 17.5,10 H 20 l 1,-1 h -3.5 z"
         transform="matrix(1.33333,0,0,1.33333,-2.5,974)"
         id="path253"
         inkscape:connector-curvature="0"
         style="fill:#ba9b48" />
      <circle
         cx="17.5"
         cy="9.5"
         r="0.5"
         transform="matrix(1.33333,0,0,1.33333,-2.5,974)"
         id="circle255"
         style="fill:#ba9b48" />
      <path
         d="M 22.5,7 H 20 L 19,6 h 3.5 z"
         transform="matrix(1.33333,0,0,1.33333,-2.5,974)"
         id="path257"
         inkscape:connector-curvature="0"
         style="fill:#ba9b48" />
      <circle
         cx="22.5"
         cy="6.5"
         r="0.5"
         transform="matrix(1.33333,0,0,1.33333,-2.5,974)"
         id="circle259"
         style="fill:#ba9b48" />
      <path
         d="M 17.5,8 H 20 l 1,-1 h -3.5 z"
         transform="matrix(1.33333,0,0,1.33333,-2.5,974)"
         id="path261"
         inkscape:connector-curvature="0"
         style="fill:#ba9b48" />
      <circle
         cx="17.5"
         cy="7.5"
         r="0.5"
         transform="matrix(1.33333,0,0,1.33333,-2.5,974)"
         id="circle263"
         style="fill:#ba9b48" />
      <path
         d="M 22.5,5 H 20 L 19,4 h 3.5 z"
         transform="matrix(1.33333,0,0,1.33333,-2.5,974)"
         id="path265"
         inkscape:connector-curvature="0"
         style="fill:#ba9b48" />
      <circle
         cx="22.5"
         cy="4.5"
         r="0.5"
         transform="matrix(1.33333,0,0,1.33333,-2.5,974)"
         id="circle267"
         style="fill:#ba9b48" />
      <path
         d="M 17.5,6 H 20 l 1,-1 h -3.5 z"
         transform="matrix(1.33333,0,0,1.33333,-2.5,974)"
         id="path269"
         inkscape:connector-curvature="0"
         style="fill:#ba9b48" />
      <circle
         cx="17.5"
         cy="5.5"
         r="0.5"
         transform="matrix(1.33333,0,0,1.33333,-2.5,974)"
         id="circle271"
         style="fill:#ba9b48" />
      <g
         id="g275">
        <path
           d="M 17.5,4 H 20 l 1,-1 h -3.5 z"
           transform="matrix(1.33333,0,0,1.33333,-2.5,974)"
           id="path273"
           inkscape:connector-curvature="0"
           style="fill:#ba9b48" />
      </g>
      <g
         transform="matrix(1.33333,0,0,1.33333,-2.5,974)"
         id="g279">
        <circle
           cx="17.5"
           cy="3.5"
           r="0.5"
           id="circle277"
           style="fill:#ba9b48" />
      </g>
    </g>
    <g
       id="g298"
       transform="matrix(1.00625,0,0,1.004158,-0.2515625,918.5902)">
      <path
         d="m 6.2,1223.9 v -46.7 h 24.4 l 11.6,11.6 v 35 z"
         id="path282"
         inkscape:connector-curvature="0"
         style="fill:#ffffff" />
      <path
         d="m 30.3,1177.9 11.2,11.2 v 34.1 H 7 V 1178 h 23.4 m 0.6,-1.4 H 5.5 v 48 H 43 v -36 z"
         id="path284"
         inkscape:connector-curvature="0"
         style="fill:#f44336;fill-opacity:1" />
      <g
         id="g290">
        <path
           d="m 30.2,1189.2 v -12 h 0.4 l 11.6,11.6 v 0.4 z"
           id="path286"
           inkscape:connector-curvature="0"
           style="fill:#fde4e3;fill-opacity:1" />
        <path
           d="M 30.9,1178.4 41,1188.5 H 31 v -10 m 0,-2 h -1.4 v 13.4 H 43 v -1.4 z"
           id="path288"
           inkscape:connector-curvature="0"
           style="fill:#f44336;fill-opacity:1" />
      </g>
      <g
         id="g296"
         transform="matrix(0.95940958,0,0,0.96490954,1.0802584,43.498552)">
        <path
           d="m 10.6,1195.9 a 3,3 0 0 1 3,-3 h 21 a 3,3 0 0 1 3.1,3 v 21 a 3,3 0 0 1 -3,3 H 13.6 a 3,3 0 0 1 -3,-3 z"
           id="path292"
           inkscape:connector-curvature="0"
           style="fill:#f44336" />
        <path
           d="m 12.8,1195.1 v 22.6 h 22.6 v -22.6 z m 12.9,7.7 h -3.8 v 2.7 h 3.4 v 1.8 h -3.4 v 4.4 H 19.7 V 1201 h 6 z m 3.1,8.9 h -2 V 1201 h 2 z"
           id="path294"
           inkscape:connector-curvature="0"
           style="fill:#210403" />
      </g>
    </g>
    <g
       id="g328"
       transform="matrix(1.004158,0,0,1.0147059,-0.2008315,905.2505)">
      <path
         d="m 22.8,1262.2 v -34.7 h 16.9 l 8,8.6 v 26.1 z"
         id="path300"
         inkscape:connector-curvature="0"
         style="fill:#ffffff" />
      <path
         d="m 39.5,1228 7.8,8.3 v 25.4 h -24 V 1228 h 16.2 m 0.4,-1 H 22.3 v 35.7 h 26 V 1236 Z"
         id="path302"
         inkscape:connector-curvature="0"
         style="fill:#4788c7" />
      <path
         d="m 39.4,1236.4 v -9 h 0.3 l 8,8.7 v 0.3 z"
         id="path304"
         inkscape:connector-curvature="0"
         style="fill:#dff0fe" />
      <path
         d="m 39.9,1228.4 7,7.5 h -7 v -7.5 m 0,-1.4 h -1 v 10 h 9.3 v -1 z"
         id="path306"
         inkscape:connector-curvature="0"
         style="fill:#4788c7" />
      <g
         id="g316">
        <path
           d="m 12.2,1267.6 v -34.8 h 17 l 8,8.7 v 26 z"
           id="path308"
           inkscape:connector-curvature="0"
           style="fill:#ffffff" />
        <path
           d="m 29,1233.3 7.7,8.4 v 25.4 h -24 v -33.8 H 29 m 0.4,-1 H 11.8 v 35.7 h 25.8 v -26.7 z"
           id="path310"
           inkscape:connector-curvature="0"
           style="fill:#4788c7" />
        <path
           d="m 28.9,1241.8 v -9 h 0.2 l 8,8.7 v 0.3 z"
           id="path312"
           inkscape:connector-curvature="0"
           style="fill:#dff0fe" />
        <path
           d="m 29.3,1233.7 7,7.6 h -7 v -7.6 m 0,-1.4 h -0.9 v 10 h 9.2 v -1 z"
           id="path314"
           inkscape:connector-curvature="0"
           style="fill:#4788c7" />
      </g>
      <g
         id="g326">
        <path
           d="m 0.7,1274 v -34.7 h 16.9 l 8,8.7 v 26 z"
           id="path318"
           inkscape:connector-curvature="0"
           style="fill:#ffffff" />
        <path
           d="m 17.4,1239.8 7.7,8.4 v 25.4 h -24 v -33.8 h 16.3 m 0.4,-1 H 0.2 v 35.8 h 25.9 v -26.8 z"
           id="path320"
           inkscape:connector-curvature="0"
           style="fill:#4788c7" />
        <path
           d="m 17.3,1248.3 v -9 h 0.3 l 8,8.7 v 0.3 z"
           id="path322"
           inkscape:connector-curvature="0"
           style="fill:#dff0fe" />
        <path
           d="m 17.8,1240.3 7,7.5 h -7 v -7.5 m 0,-1.4 h -1 v 9.9 h 9.3 v -1 z"
           id="path324"
           inkscape:connector-curvature="0"
           style="fill:#4788c7" />
      </g>
    </g>
    <g
       id="e"
       transform="matrix(1.0107447,0,0,1.0062525,-0.27626287,915.9598)">
      <path
         d="m 6.5,37.5 v -35 h 18.3 l 8.7,8.7 v 26.3 z"
         transform="matrix(1.33333,0,0,1.33333,-2.5,574)"
         id="path330"
         inkscape:connector-curvature="0"
         style="fill:#ffffff" />
      <path
         d="M 24.6,3 33,11.4 V 37 H 7 V 3 H 24.6 M 25,2 H 6 V 38 H 34 V 11 Z"
         transform="matrix(1.33333,0,0,1.33333,-2.5,574)"
         id="path332"
         inkscape:connector-curvature="0"
         style="fill:#4788c7" />
      <path
         d="m 24.5,11.5 v -9 h 0.3 l 8.7,8.7 v 0.3 z"
         transform="matrix(1.33333,0,0,1.33333,-2.5,574)"
         id="path334"
         inkscape:connector-curvature="0"
         style="fill:#dff0fe" />
      <path
         d="M 25,3.4 32.6,11 H 25 V 3.4 M 25,2 h -1 v 10 h 10 v -1 z"
         transform="matrix(1.33333,0,0,1.33333,-2.5,574)"
         id="path336"
         inkscape:connector-curvature="0"
         style="fill:#4788c7" />
      <g
         id="g346">
        <path
           d="m 2.5,3.5 h 35 v 33 h -35 z"
           transform="matrix(0.74402,0,0,0.74402,9.4,593)"
           id="path338"
           inkscape:connector-curvature="0"
           style="fill:#ffffff" />
        <path
           d="M 37,4 V 36 H 3 V 4 H 37 M 38,3 H 2 v 34 h 36 z"
           transform="matrix(0.74402,0,0,0.74402,9.4,593)"
           id="path340"
           inkscape:connector-curvature="0"
           style="fill:#4788c7" />
        <path
           d="M 3,4 H 37 V 9 H 3 Z"
           transform="matrix(0.74402,0,0,0.74402,9.4,593)"
           id="path342"
           inkscape:connector-curvature="0"
           style="fill:#98ccfd" />
        <path
           d="m 14.6,24.6 c 0.5,1.1 1.3,1.9 2.2,1.9 2.1,0 3.2,-2 3.2,-4.5 0,-2.5 -1.2,-4.5 -3.2,-4.5 -1,0 -1.7,0.8 -2.2,2 m 10.8,5.1 c -0.5,1.1 -1.3,1.9 -2.2,1.9 -2.1,0 -3.2,-2 -3.2,-4.5 0,-2.5 1.2,-4.5 3.2,-4.5 1,0 1.7,0.8 2.2,2 m 3.1,9 a 20.6,20.6 0 0 0 0,-13 m -17,0 a 20.6,20.6 0 0 0 0,13"
           stroke-miterlimit="10"
           transform="matrix(0.74402,0,0,0.74402,9.4,593)"
           id="path344"
           inkscape:connector-curvature="0"
           style="fill:none;stroke:#4788c7;stroke-linecap:round;stroke-miterlimit:10" />
      </g>
    </g>
    <use
       height="100%"
       width="100%"
       transform="translate(0,402.49997)"
       xlink:href="#d"
       id="use349"
       x="0"
       y="0" />
    <use
       height="100%"
       width="100%"
       transform="translate(0,50.312475)"
       xlink:href="#e"
       id="use351"
       x="0"
       y="0" />
    <use
       height="100%"
       width="100%"
       transform="translate(0,100.62497)"
       xlink:href="#e"
       id="use353"
       x="0"
       y="0" />
    <use
       height="100%"
       width="100%"
       transform="translate(0,150.93747)"
       xlink:href="#e"
       id="use355"
       x="0"
       y="0" />
    <use
       height="100%"
       width="100%"
       transform="translate(0,201.24997)"
       xlink:href="#e"
       id="use357"
       x="0"
       y="0" />
    <use
       height="100%"
       width="100%"
       transform="translate(0,251.56247)"
       xlink:href="#e"
       id="use359"
       x="0"
       y="0" />
    <use
       height="100%"
       width="100%"
       transform="translate(0,301.87497)"
       xlink:href="#e"
       id="use361"
       x="0"
       y="0" />
    <use
       height="100%"
       width="100%"
       transform="translate(0,50.312475)"
       xlink:href="#f"
       id="use363"
       x="0"
       y="0" />
    <use
       height="100%"
       width="100%"
       transform="translate(0,100.62497)"
       xlink:href="#f"
       id="use365"
       x="0"
       y="0" />
    <use
       height="100%"
       width="100%"
       transform="translate(0,150.93747)"
       xlink:href="#f"
       id="use367"
       x="0"
       y="0" />
    <use
       height="100%"
       width="100%"
       transform="translate(0,1157.1875)"
       xlink:href="#g"
       id="use369"
       x="0"
       y="0" />
    <g
       id="g7085"
       inkscape:label="g-pp"
       transform="translate(0,-201.25)">
      <g
         transform="matrix(1.0769231,0,0,1.0769237,-2.1587077,-191.44614)"
         id="g6504">
        <use
           transform="matrix(0.92857141,0,0,0.92857089,2.0045142,1205.579)"
           height="100%"
           width="100%"
           id="use4677"
           xlink:href="#g184"
           y="0"
           x="0"
           style="display:inline" />
        <rect
           style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.08322811;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
           id="rect4915"
           width="26.162498"
           height="28.031126"
           x="11.348264"
           y="2469.7346" />
      </g>
      <g
         style="display:inline"
         transform="matrix(0.86666666,0,0,0.86666666,-55.209583,260.76704)"
         id="g6397">
        <g
           style="display:inline;fill:#000000"
           id="g4913"
           transform="matrix(0.83854167,0,0,0.83854165,71.44375,2545.5703)">
          <path
             id="path4881"
             d="M 41,10 H 25 v 28 h 16 c 0.553,0 1,-0.447 1,-1 V 11 c 0,-0.553 -0.447,-1 -1,-1 z"
             inkscape:connector-curvature="0"
             style="fill:#ff8a65" />
          <g
             id="g4891-7">
            <rect
               id="rect4883"
               height="2"
               width="14"
               y="29"
               x="24"
               style="fill:#fbe9e7" />
            <rect
               id="rect4885"
               height="2"
               width="14"
               y="33"
               x="24"
               style="fill:#fbe9e7" />
            <path
               id="path4887"
               d="m 30,15 c -3.313,0 -6,2.687 -6,6 0,3.313 2.687,6 6,6 3.313,0 6,-2.687 6,-6 h -6 z"
               inkscape:connector-curvature="0"
               style="fill:#fbe9e7" />
            <path
               id="path4889"
               d="m 32,13 v 6 h 6 c 0,-3.313 -2.687,-6 -6,-6 z"
               inkscape:connector-curvature="0"
               style="fill:#fbe9e7" />
          </g>
          <polygon
             id="polygon4893"
             points="27,42 6,38 6,10 27,6 "
             style="fill:#e64a19" />
          <path
             id="path4895"
             d="M 16.828,17 H 12 v 14 h 3 v -4.823 h 1.552 c 1.655,0 2.976,-0.436 3.965,-1.304 0.988,-0.869 1.484,-2.007 1.482,-3.412 C 22,18.487 20.275,17 16.828,17 Z m -0.534,6.785 H 15 v -4.364 h 1.294 c 1.641,0 2.461,0.72 2.461,2.158 0,1.472 -0.82,2.206 -2.461,2.206 z"
             inkscape:connector-curvature="0"
             style="fill:#ffffff" />
        </g>
      </g>
    </g>
    <g
       id="g6555"
       transform="translate(0.02515625,-201.25)"
       inkscape:label="g-excel">
      <use
         x="0"
         y="0"
         xlink:href="#g6504"
         id="use7040"
         width="100%"
         height="100%"
         transform="translate(-0.0251562,50.312521)"
         style="fill:none;fill-opacity:1;stroke-width:1.00625002;stroke-miterlimit:4;stroke-dasharray:none;filter:url(#filter7301)" />
      <g
         transform="matrix(0.92857143,0,0,0.92857143,-34.001055,187.54397)"
         inkscape:label="g-excel"
         id="g6497">
        <g
           style="fill:#000000"
           id="g4819"
           transform="matrix(0.78263889,0,0,0.78263887,43.84088,2508.9039)"
           inkscape:label="s-excel">
          <g
             id="surface1-4">
            <path
               id="path4776"
               d="M 41,10 H 25 v 28 h 16 c 0.554688,0 1,-0.445312 1,-1 V 11 c 0,-0.554687 -0.445312,-1 -1,-1 z"
               style="fill:#4caf50"
               inkscape:connector-curvature="0" />
            <path
               id="path4778"
               d="m 32,15 h 7 v 3 h -7 z"
               style="fill:#ffffff"
               inkscape:connector-curvature="0" />
            <path
               id="path4780"
               d="m 32,25 h 7 v 3 h -7 z"
               style="fill:#ffffff"
               inkscape:connector-curvature="0" />
            <path
               id="path4782"
               d="m 32,30 h 7 v 3 h -7 z"
               style="fill:#ffffff"
               inkscape:connector-curvature="0" />
            <path
               id="path4784"
               d="m 32,20 h 7 v 3 h -7 z"
               style="fill:#ffffff"
               inkscape:connector-curvature="0" />
            <path
               id="path4786"
               d="m 25,15 h 5 v 3 h -5 z"
               style="fill:#ffffff"
               inkscape:connector-curvature="0" />
            <path
               id="path4788"
               d="m 25,25 h 5 v 3 h -5 z"
               style="fill:#ffffff"
               inkscape:connector-curvature="0" />
            <path
               id="path4790"
               d="m 25,30 h 5 v 3 h -5 z"
               style="fill:#ffffff"
               inkscape:connector-curvature="0" />
            <path
               id="path4792"
               d="m 25,20 h 5 v 3 h -5 z"
               style="fill:#ffffff"
               inkscape:connector-curvature="0" />
            <path
               id="path4794"
               d="M 27,42 6,38 V 10 L 27,6 Z"
               style="fill:#2e7d32"
               inkscape:connector-curvature="0" />
            <path
               id="path4796"
               d="M 19.128906,31 16.71875,26.4375 C 16.625,26.269531 16.53125,25.957031 16.433594,25.5 h -0.03516 c -0.04687,0.214844 -0.15625,0.542969 -0.324219,0.980469 L 13.652344,31 H 9.894531 l 4.460938,-7 -4.082031,-7 h 3.835937 l 2.003906,4.195313 c 0.15625,0.332031 0.292969,0.726562 0.417969,1.179687 h 0.03906 c 0.07813,-0.269531 0.226562,-0.679687 0.441406,-1.21875 L 19.238281,17 h 3.515625 l -4.199218,6.9375 4.3125,7.058594 h -3.738282 z"
               style="fill:#ffffff"
               inkscape:connector-curvature="0" />
          </g>
        </g>
      </g>
    </g>
    <g
       id="g6568"
       inkscape:label="g-word"
       transform="translate(0,-201.25)">
      <use
         transform="translate(1.9241986e-8,100.62502)"
         height="100%"
         width="100%"
         id="use6508"
         xlink:href="#g6504"
         y="0"
         x="0"
         style="filter:url(#filter7265)" />
      <g
         transform="matrix(0.72673611,0,0,0.72673609,6.7083334,2567.5529)"
         id="g4774"
         style="fill:#000000"
         inkscape:label="s-word">
        <g
           id="surface1">
          <path
             inkscape:connector-curvature="0"
             style="fill:#2196f3"
             d="M 41,10 H 25 v 28 h 16 c 0.554688,0 1,-0.445312 1,-1 V 11 c 0,-0.554687 -0.445312,-1 -1,-1 z"
             id="path4740" />
          <path
             inkscape:connector-curvature="0"
             style="fill:#ffffff"
             d="m 25,15 h 14 v 2 H 25 Z"
             id="path4742" />
          <path
             inkscape:connector-curvature="0"
             style="fill:#ffffff"
             d="m 25,19 h 14 v 2 H 25 Z"
             id="path4744" />
          <path
             inkscape:connector-curvature="0"
             style="fill:#ffffff"
             d="m 25,23 h 14 v 2 H 25 Z"
             id="path4746" />
          <path
             inkscape:connector-curvature="0"
             style="fill:#ffffff"
             d="m 25,27 h 14 v 2 H 25 Z"
             id="path4748" />
          <path
             inkscape:connector-curvature="0"
             style="fill:#ffffff"
             d="m 25,31 h 14 v 2 H 25 Z"
             id="path4750" />
          <path
             inkscape:connector-curvature="0"
             style="fill:#0d47a1"
             d="M 27,42 6,38 V 10 L 27,6 Z"
             id="path4752" />
          <path
             inkscape:connector-curvature="0"
             style="fill:#ffffff"
             d="m 21.167969,31.011719 h -2.71875 l -1.800781,-8.988281 c -0.09766,-0.476563 -0.15625,-0.996094 -0.175782,-1.574219 h -0.03125 c -0.04297,0.636719 -0.109375,1.160156 -0.195312,1.574219 l -1.851563,8.988281 H 11.566406 L 8.707031,16.996094 h 2.675782 l 1.535156,9.328125 c 0.0625,0.40625 0.113281,0.941406 0.144531,1.609375 h 0.04297 c 0.01563,-0.5 0.09766,-1.050781 0.222656,-1.644531 l 1.96875,-9.292969 h 2.621094 l 1.785156,9.40625 c 0.0625,0.347656 0.121094,0.84375 0.171875,1.507812 h 0.03125 c 0.01953,-0.511718 0.07031,-1.03125 0.160156,-1.5625 l 1.5,-9.351562 h 2.46875 z"
             id="path4754" />
        </g>
      </g>
    </g>
    <g
       id="d-6"
       transform="matrix(1.0107447,0,0,1.0062525,-0.27626314,1871.8975)">
      <g
         id="g4793">
        <path
           style="fill:#ffffff"
           inkscape:connector-curvature="0"
           id="path186-8"
           transform="matrix(1.33333,0,0,1.33333,-2.5,524)"
           d="m 6.5,37.5 v -35 h 18.3 l 8.7,8.7 v 26.3 z" />
        <path
           style="fill:#ff5722;fill-opacity:1"
           inkscape:connector-curvature="0"
           id="path188-9"
           transform="matrix(1.33333,0,0,1.33333,-2.5,524)"
           d="M 24.6,3 33,11.4 V 37 H 7 V 3 H 24.6 M 25,2 H 6 V 38 H 34 V 11 Z" />
        <path
           style="fill:#ffe8e1;fill-opacity:1"
           inkscape:connector-curvature="0"
           id="path190-5"
           transform="matrix(1.33333,0,0,1.33333,-2.5,524)"
           d="m 24.5,11.5 v -9 h 0.3 l 8.7,8.7 v 0.3 z" />
        <path
           style="fill:#ff5722;fill-opacity:1"
           inkscape:connector-curvature="0"
           id="path192-5"
           transform="matrix(1.33333,0,0,1.33333,-2.5,524)"
           d="M 25,3.4 32.6,11 H 25 V 3.4 M 25,2 h -1 v 10 h 10 v -1 z" />
        <g
           transform="matrix(0.71901056,0,0,0.72222041,6.9103468,540.33326)"
           id="surface1-5">
          <path
             inkscape:connector-curvature="0"
             style="fill:#ff5722"
             d="M 6,10 C 6,7.789063 7.789063,6 10,6 h 28 c 2.210938,0 4,1.789063 4,4 v 28 c 0,2.210938 -1.789062,4 -4,4 H 10 C 7.789063,42 6,40.210938 6,38 Z"
             id="path4766" />
          <path
             inkscape:connector-curvature="0"
             style="fill:#1c0802"
             d="M 9,9 V 39 H 39 V 9 Z M 23.691406,31 22.929688,28.089844 H 19.011719 L 18.253906,31 H 15.214844 L 19.65625,16.78125 h 2.628906 L 26.757813,31 Z m 7.160157,0 H 28.078125 V 20.433594 h 2.773438 z M 30.550781,18.753906 c -0.269531,0.28125 -0.636718,0.421875 -1.097656,0.421875 -0.464844,0 -0.828125,-0.140625 -1.097656,-0.421875 -0.273438,-0.28125 -0.40625,-0.632812 -0.40625,-1.054687 0,-0.429688 0.136719,-0.78125 0.410156,-1.054688 0.273438,-0.273437 0.636719,-0.410156 1.09375,-0.410156 0.453125,0 0.820313,0.136719 1.09375,0.410156 0.273438,0.273438 0.410156,0.625 0.410156,1.054688 0,0.421875 -0.136718,0.773437 -0.40625,1.054687 z"
             id="path4768" />
          <path
             inkscape:connector-curvature="0"
             style="fill:#1c0802"
             d="m 19.640625,25.695313 h 2.65625 L 20.96875,20.628906 Z"
             id="path4770" />
        </g>
      </g>
    </g>
    <g
       transform="matrix(1.00625,0,0,1.00625,-4.1397213e-4,2452.1696)"
       id="g4497"
       inkscape:label="g-oo">
      <path
         id="path7"
         d="m 6.4379114,0.0136375 c -1.37515,0.262398 -2.46216,1.598638 -2.4375,2.998047 V 44.99997 c 1.5e-4,1.57031 1.42931,2.99985 3,3 H 41.000411 c 1.57069,-1.5e-4 2.99985,-1.42969 3,-3 V 18.81832 c 0.018,-0.79196 -0.29252,-1.587065 -0.84375,-2.156245 L 27.344161,0.8573875 c -0.56932,-0.550947 -1.3641,-0.862103 -2.15625,-0.84375 H 7.0004114 c -0.18689,-0.01799 -0.37555,-0.01799 -0.5625,0 z m 26.5507796,0.0098 c -0.99843,0.319797 -1.33417,1.839914 -0.56445,2.554688 l 9.03515,9.0820315 c 0.83473,0.795587 2.49704,0.114553 2.54102,-1.04105 V 1.5370745 c -9e-5,-0.792623 -0.71736,-1.513582 -1.50586,-1.513672 h -9.03516 c -0.15569,-0.02399 -0.31509,-0.02399 -0.4707,0 z"
         inkscape:connector-curvature="0"
         style="fill:url(#a-7)" />
      <path
         id="path9"
         d="M 7.0004114,2.9999995 V 45 H 41.000411 V 19 l -16,-16.0000005 z"
         inkscape:connector-curvature="0"
         style="fill:#ffffff" />
    </g>
    <g
       transform="matrix(1.00625,0,0,1.00625,-4.1357189e-4,2502.4821)"
       id="g4503"
       inkscape:label="g-ooi">
      <path
         id="path9-5"
         d="m 6.4379114,0.0136375 c -1.37515,0.262398 -2.46216,1.598638 -2.4375,2.998047 V 44.99997 c 1.5e-4,1.57031 1.42931,2.99985 3,3 H 41.000411 c 1.57069,-1.5e-4 2.99985,-1.42969 3,-3 V 18.81832 c 0.018,-0.79196 -0.29252,-1.587065 -0.84375,-2.156245 L 27.344161,0.8573875 c -0.56932,-0.550947 -1.3641,-0.862103 -2.15625,-0.84375 H 7.0004114 c -0.18689,-0.01799 -0.37555,-0.01799 -0.5625,0 z m 26.5507796,0.0098 c -0.99843,0.319797 -1.33417,1.839914 -0.56445,2.554688 l 9.03515,9.0820315 c 0.83473,0.795587 2.49704,0.114553 2.54102,-1.04105 V 1.5370745 c -9e-5,-0.792623 -0.71736,-1.513582 -1.50586,-1.513672 h -9.03516 c -0.15569,-0.02399 -0.31509,-0.02399 -0.4707,0 z"
         inkscape:connector-curvature="0"
         style="fill:url(#c-4)" />
      <path
         id="path11-4"
         d="M 7.0004114,2.9999995 V 45 H 41.000411 V 19 l -16,-16.0000005 z"
         inkscape:connector-curvature="0"
         style="fill:#ffffff" />
      <path
         id="path13-6"
         d="m 13.000821,20 c -1.108,0 -2,0.892 -2,2 v 16 c 0,1.108 0.892,2 2,2 h 22 c 1.108,0 2,-0.892 2,-2 V 22 c 0,-1.108 -0.892,-2 -2,-2 z m 0,2 h 22 v 16 h -22 z m 2,3 v 2 h 18 v -2 z m 2,5 c -0.55228,0 -1,0.44772 -1,1 0,0.55228 0.44772,1 1,1 0.55228,0 1,-0.44772 1,-1 0,-0.55228 -0.44772,-1 -1,-1 z m 3,0 v 2 h 13 v -2 z m -3,4 c -0.55228,0 -1,0.44772 -1,1 0,0.55228 0.44772,1 1,1 0.55228,0 1,-0.44772 1,-1 0,-0.55228 -0.44772,-1 -1,-1 z m 3,0 v 2 h 13 v -2 z"
         inkscape:connector-curvature="0"
         style="fill:url(#a-1)" />
    </g>
    <g
       transform="matrix(1.00625,0,0,1.00625,-4.1357189e-4,2552.7946)"
       id="g4546"
       inkscape:label="g-ooc">
      <path
         id="path9-9"
         d="m 6.4379114,0.0136375 c -1.37515,0.262398 -2.46216,1.598638 -2.4375,2.998047 V 44.99997 c 1.5e-4,1.57031 1.42931,2.99985 3,3 H 41.000411 c 1.57069,-1.5e-4 2.99985,-1.42969 3,-3 V 18.81832 c 0.018,-0.79196 -0.29252,-1.587065 -0.84375,-2.156245 L 27.344161,0.8573875 c -0.56932,-0.550947 -1.3641,-0.862103 -2.15625,-0.84375 H 7.0004114 c -0.18689,-0.01799 -0.37555,-0.01799 -0.5625,0 z m 26.5507796,0.0098 c -0.99843,0.319797 -1.33417,1.839914 -0.56445,2.554688 l 9.03515,9.0820315 c 0.83473,0.795587 2.49704,0.114553 2.54102,-1.04105 V 1.5370745 c -9e-5,-0.792623 -0.71736,-1.513582 -1.50586,-1.513672 h -9.03516 c -0.15569,-0.02399 -0.31509,-0.02399 -0.4707,0 z"
         inkscape:connector-curvature="0"
         style="fill:url(#c-7)" />
      <path
         id="path11-6"
         d="M 7.0004114,2.9999995 V 45 H 41.000411 V 19 l -16,-16.0000005 z"
         inkscape:connector-curvature="0"
         style="fill:#ffffff" />
      <path
         id="path13-7"
         d="m 12.000411,18.99805 v 1 2.99999 1 3 1 3 1 3 1 4 h 1 12 V 41 h 11 V 30 h -2 v -2.00196 -1 -3 -1 -2.99999 -1 h -1 z m 1,1 h 6 v 2.99999 h -6 z m 7,0 h 6 v 2.99999 h -6 z m 7,0 h 6 v 2.99999 h -6 z m -14,3.99999 h 6 v 3 h -6 z m 7,0 h 6 v 3 h -6 z m 7,0 h 6 v 3 h -6 z m -14,4 h 6 v 3 h -6 z m 7,0 h 6 V 30 h -1 v 0.99804 h -5 z m 7,0 h 6 V 30 h -6 z m -1,3.00196 h 8 1 v 9 h -9 v -0.002 -1 -3 -1 -3 z m -13,0.99804 h 6 v 3 h -6 z m 7,0 h 5 v 3 h -5 z m -7,4 h 6 v 3 h -6 z m 7,0 h 5 v 3 h -5 z"
         inkscape:connector-curvature="0"
         style="fill:url(#a-18)" />
      <g
         style="fill:#43c330"
         id="g21"
         transform="translate(-203.99959,-80)">
        <path
           inkscape:connector-curvature="0"
           id="path15-8"
           d="m 229.9993,115.00025 h 3 v 4.99992 h -3 z" />
        <path
           inkscape:connector-curvature="0"
           id="path17-4"
           d="m 232.9993,112.00025 h 3 v 7.9999 h -3 z" />
        <path
           inkscape:connector-curvature="0"
           id="path19-5"
           d="m 235.9993,117.00025 h 3 v 3 h -3 z" />
      </g>
      <g
         style="fill:#ccf4c6"
         id="g29"
         transform="translate(-203.99959,-80)">
        <path
           inkscape:connector-curvature="0"
           id="path23-7"
           d="m 230.9993,116.00025 h 1 v 3.99999 h -1 z" />
        <path
           inkscape:connector-curvature="0"
           id="path25-0"
           d="m 233.9993,113.00025 h 1 v 6.99996 h -1 z" />
        <path
           inkscape:connector-curvature="0"
           id="path27-5"
           d="m 236.9993,118.00025 h 1 v 2.00002 h -1 z" />
      </g>
    </g>
    <g
       transform="matrix(1.00625,0,0,1.00625,-4.1357189e-4,2603.1071)"
       id="g4503-9"
       inkscape:label="g-oow">
      <path
         id="path9-2"
         d="m 6.4379114,0.0136375 c -1.37515,0.262398 -2.46216,1.598638 -2.4375,2.998047 V 44.99997 c 1.5e-4,1.57031 1.42931,2.99985 3,3 H 41.000411 c 1.57069,-1.5e-4 2.99985,-1.42969 3,-3 V 18.81832 c 0.018,-0.79196 -0.29252,-1.587065 -0.84375,-2.156245 L 27.344161,0.8573875 c -0.56932,-0.550947 -1.3641,-0.862103 -2.15625,-0.84375 H 7.0004114 c -0.18689,-0.01799 -0.37555,-0.01799 -0.5625,0 z m 26.5507796,0.0098 c -0.99843,0.319797 -1.33417,1.839914 -0.56445,2.554688 l 9.03515,9.0820315 c 0.83473,0.795587 2.49704,0.114553 2.54102,-1.04105 V 1.5370745 c -9e-5,-0.792623 -0.71736,-1.513582 -1.50586,-1.513672 h -9.03516 c -0.15569,-0.02399 -0.31509,-0.02399 -0.4707,0 z"
         inkscape:connector-curvature="0"
         style="fill:url(#c-6)" />
      <path
         id="path11-9"
         d="M 7.0004114,2.9999995 V 45 H 41.000411 V 19 l -16,-16.0000005 z"
         inkscape:connector-curvature="0"
         style="fill:#ffffff" />
      <path
         id="path13-1"
         d="m 12.001791,17.99801 v 2 h 8 v -2 z m 10,0 v 10 h 13.99805 v -10 z m 1,1 h 12 v 8 h -0.002 v -1 l -2.49805,-3 -2.5,2 -3.5,-4.5 -3.5,5.5 v -7 z m -11,3 v 2 h 8 v -2 z m 0,4 v 2 h 8 v -2 z m 0,4 v 2 h 23.99805 v -2 z m 0,4 v 2 h 23.99805 v -2 z m 0,4 v 2 h 17.99805 v -2 z"
         inkscape:connector-curvature="0"
         style="fill:url(#a-78)" />
    </g>
  </g>
</svg>
img/src/quicklook-icons.pxm000064400000023453151215013440011752 0ustar00PXMT_DOC�HEADER �@N
�[!�!�METADATA
Y�
%streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_IMAGE_ZOOM_�����NSNumber��NSValue��*��f������_MASKS_VISIBLE_RECT_�����{{0, 0}, {0, 0}}�����_DOCUMENT_SLICES_�����NSMutableArray��NSArray�������_PX_VERSION_����� 1.6.5�����_DOCUMENT_WINDOW_RECT_�����{{472, 130}, {401, 696}}�����_PRINT_INFO_�����
NSMutableData��NSData���}�[381c]streamtyped���@���NSPrintInfo��NSObject�����NSMutableDictionary��NSDictionary��i����NSString��+NSHorizontallyCentered�����NSNumber��NSValue��*��c������
NSRightMargin�������f�H�����NSLeftMargin�������H�����NSHorizonalPagination�������������NSVerticalPagination������������NSVerticallyCentered�������NSTopMargin�������Z�����NSBottomMargin�������Z��������_LAYERS_VISIBLE_RECT_�����{{0, 0}, {239, 240}}�����_DOCUMENT_SLICES_INFO_���������PXSlicesPreviewEnabledKey�������c������PXSlicesVisibleKey�������������__OLD_METADATA_FOR_SPOTLIGHT__���������	colorMode�������������layersNames���������Untitled Layer 6�����Untitled Layer 5�����Untitled Layer 4�����Untitled Layer 3�����Untitled Layer 2�����Untitled Layer������keywords����������
csProfileName�����Generic RGB Profile�����resolutionType�������
resolution�������d�H�����
canvasSize�����	{32, 128}������PXRulersMetadataKey�������������PXRulersVisibleKey�������PXGuidesArrayKey�������������PXGuidePositionKey������� �����PXGuideOrientationKey��������������В�����@��Ғӆ�����В�����`��Ғӆ�����В���������Ғӆ����������_MASKS_SELECTION_�����I�[73c]streamtyped���@���NSMutableIndexSet��
NSIndexSet��NSObject��I������_ICC_PROFILE_NAME_��Ò���_ORIGINAL_EXIF_���������*kCGImageDestinationLossyCompressionQuality������������Depth������������{TIFF}���������ResolutionUnit�������Software�����Pixelmator  1.6.5�����Compression�������DateTime�����NSMutableString��2011-06-11 22:33:32 +0400�����XResolution�������H�����Orientation�������YResolution�������H������PixelHeight���������������{Exif}���������PixelXDimension������� �����PixelYDimension��������������
ColorSpace��������{JFIF}���������YDensity�������H�����
IsProgressive�������XDensity�������H�����DensityUnit��������{IPTC}���������ProgramVersion�����Pixelmator  1.6.5�����ImageOrientation�������Keywords��������ProfileName�����DPIWidth�������H�����{PNG}���������XPixelsPerMeter�������������YPixelsPerMeter��������������	DPIHeight�������H�����
ColorModel�����RGB�����HasAlpha�������
PixelWidth������� ������_DOCUMENT_LAST_SLICE_INFO_���������PXSliceMatteColorKey�����NSColor���ffff�����transparent�������PXSliceFormatKey�����PXSliceFormatPNG24������_LAYERGROUPS_EXPANSION_STATES_�������������_STATE_�������_ID_�����;2862F1CC-E29C-40CD-ACEC-4C3C2F52B266-14332-0000DD7C8ED79D78�������#���$����;1C716CD5-CB6A-4036-AA01-E604F1295CF8-14332-0000DCDFA064FDE4�������#���$����;149D0829-DE43-4377-AC40-B2887BC1CF57-14332-0000DCD72B273396�������#���$����;F643CD27-63E6-467B-8CFE-484EBF8C5E59-14332-0000DCD3C28B36D6�������#���$����;94E82950-90A4-41FD-95B0-0E9E14581547-14332-0000DCCF3AD120D4�������#���$����;DF66A535-7BA6-44E8-B005-A067A1A05212-14332-0000DCCB983B93B5�������_IMAGE_VISIBLE_RECT_�����{{-113, -7}, {385, 654}}�����_LAYERS_SELECTION_�����8�[56c]streamtyped���@���
NSIndexSet��NSObject��I�����GUIDES_INFOP @`�	COLORSYNC00appl mntrRGB XYZ �acspAPPLappl���-appldscm�desc�ogXYZlwtpt�rXYZ�bXYZ�rTRC�cprt�8chad,gTRC�bTRC�mlucenUS&~esES&�daDK.�deDE,�fiFI(�frFU(*itIT(VnlNL(nbNO&ptBR&�svSE&jaJPRkoKR@zhTWlzhCN�ruRU"�plPL,�Yleinen RGB-profiiliGenerisk RGB-profilProfil G�n�rique RVBN�, RGB 0�0�0�0�0�0�u( RGB �r_icϏ�Perfil RGB Gen�ricoAllgemeines RGB-Profilfn� RGB cϏ�e�N�Generel RGB-beskrivelseAlgemeen RGB-profiel�|� RGB ��\��|Profilo RGB GenericoGeneric RGB Profile1I89 ?@>D8;L RGBUniwersalny profil RGBdescGeneric RGB ProfileGeneric RGB ProfileXYZ Zu�s4XYZ �R�XYZ tM=��XYZ (��6curv�textCopyright 2007 Apple Inc., all rights reserved.sf32B���&�������������lLAYERS_��}�� Mf  @Untitled Layer 6d';2862F1CC-E29C-40CD-ACEC-4C3C2F52B266-14332-0000DD7C8ED79D78�x��
�0�LA��93K�3p��#�P
&imzᝊH�-HR���,B��!���M(}�+�P^�M�P��,u]�-�<{@�,^=�t6��4�i(��Zc���1�JF�n�V�������z@�-��U�8nc�f������-�l9�a����^�a����?�F�V�fqy+��=�]�B��x&9��<��������5�pi��]��vل�f���}6a�~1���*�S̕��.r{�P��I��5��Mn*��W0�Li���o�^��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;378ECF44-079F-4719-BD6E-40FB91AA949E-14332-0000DCCB983B29D6���  `Untitled Layer 5d';1C716CD5-CB6A-4036-AA01-E604F1295CF8-14332-0000DCDFA064FDE4�<x�ˍ�0E鎒!�X�fK�@t���܃�L>`^2�Y�l"�;b��~�.����j~�i��-�<���s�y~я\�d(��)C۶��k7?������e	���0�t̖as��n~����
һ���XV�w��+�w��5��I�`� }2�4wkm�-n���ou���w��]�_��-I3�<�0����ϛ���ҧ�r��GI�)��Mc��I�└T�D�*m����;�����k�*���o�e��GS]P��[͕��}4̅G�F,g^
q!�n���W]�����ϲ��6��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;378ECF44-079F-4719-BD6E-40FB91AA949E-14332-0000DCCB983B29D6��aCUntitled Layer 4d';149D0829-DE43-4377-AC40-B2887BC1CF57-14332-0000DCD72B273396��
x��
�0P�� g�93K�3p����PJLR�Jq����Pa۶��"�-b�Mh}�*��^d�M������[>Y΀�E�f@�b���{�����	�c����=Ch�6fH��j3�ݑ���n�y��ڧ��4�8��ߒ�[�fX�%[oe�������y�u��)���K��J�]���Jnf��
�yN:ÞM�T��.�gp�l�R5̐�9��L
�Į�e�jg�u53��D�(5��Hz֮�T]i6�\U����%jj�	�ޚ���^��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;378ECF44-079F-4719-BD6E-40FB91AA949E-14332-0000DCCB983B29D6��� !Untitled Layer 3d';F643CD27-63E6-467B-8CFE-484EBF8C5E59-14332-0000DCD3C28B36D6�cx��;/�Q�FH����&1���'�XmF��hS?;�A""�&T�7ui��y�7���9�-}�9O�?}oOs�����i���ѵ;��b**ѩ�1�،�X�BdO���$(Q}�3��`��*J��&�(��ϔ(S��=���k�Q�C;fq]�FZJ��d�~���(YGl�K�|���K�4�)Ӽb8g����Ӷ�3x̪�Q�m'}ۣ^1�S]�Bl��l)�;V���[�m���ӑpYRZkMY«�xK�.�Cܿ��P���W����&�vP������ʂ��(	JT���������)1�M��R�TT���,a�����#�}$��or�/�BhK�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;378ECF44-079F-4719-BD6E-40FB91AA949E-14332-0000DCCB983B29D6��� Untitled Layer 2d';94E82950-90A4-41FD-95B0-0E9E14581547-14332-0000DCCF3AD120D4�dx��=/CQ�!a&6F��h0Z���o`��6�IL������h��^/�s�4i������{�yz��7��ijvp�.�_��j��6CѬq���Q�QAdSAMq������bR�ψJ�����|lf8��y�x�F�Z�eJ)��U�uY��ζյom�(����C>1�;s\�2:K�q�Ӊ�3�6�q�埬m4}����,��;v�HUSQ�Jb�����lGE�=�F����smZt����UoXvu[cMYN\_Ӝ��#� ���7E�4�M��������-��R�,��a:���W�j%
���[����}%����h_i�H��jhK�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;378ECF44-079F-4719-BD6E-40FB91AA949E-14332-0000DCCB983B29D6��w �Untitled Layerd';DF66A535-7BA6-44E8-B005-A067A1A05212-14332-0000DCCB983B93B5�+�Bx�����mH@�XA_�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;378ECF44-079F-4719-BD6E-40FB91AA949E-14332-0000DCCB983B29D6��MASKSPREVIEWC ��/@x��?OA�qB4��H��v&������5}H*h ���ĄƂi�h4�TZ�A��!~�	���������Es�vwv~�����C��1�];&p	6���
���+��bS��)�Ad�L�,��E3�xb
���#|^4U�%�}]4WӁW�j�.�pK�8��G8�>��8q��ti��V�Ջ��P|�:/�����m���q��ނ_��w�4��ft\��gm����<">��CQ�H8$6�!6�as<����х��I�/���s�)���7ş����G�)�v��u�� �b�x���ES3=`J�&��L��G��&�n�5����h��j�*vG��{D;��>>�����/7�k�0}��%"^����_���W�	���|��r��
��NvEEt�R�gJ�
�,7�)
<�PD�D0K��MLU�R�;J�43C�%�o�@SD���U��s�b��k���?�N�X�L=d�zī�W��˯m�+�<g��K��^��Bq5x�\��%������~��((-|���Kl�W���e[����_iP}I%�7�����MA��-����JL[+,��p����)�m7os��+
>�JO�M���9J
���+���S.�3^��8��S�1�}�_p�J	�))t��n�PB���p�STѵ��9��g45AD!��mJ=43CL.J)ܥ�)�jPxM�����bJ��)1�d٣�Ϯ�����%��lF����~m
�7��t�1$���	���� ق���t�e�-�����L��/,�@�A��@�dCCC�c�۔\k��#�9M
]:�=66�����9�1�]�ͦSo���iۿU�]����dM�?�{��amm��������k~�--��kU�Y6��{��ܻ���w�7J�Iy�� ����W��C9[��B�w���+����9^�-8M���$�����1p��F�@s�c��	Y�T_kyh�.4[�\U��]��i4[p�C�4Y]]M�}����3�߶�������q��
�{��(�Ռaff&U˗ϼH�$�!$/�����%����P�ī�����lA�j����E�j�hdī��1o�/B�@�Y���t�Z�C�I~H� ^=?4[��_�l	A�j~K���&��5��"���o������t�e�-��9M�Q45AD]�c�� Vc��`2�ş�۔\k��#�9M
]:�-sy�:J�}8Uݥ�l:�� �>4SQ�]�����D��ْ7y��PT�'���ュ���fimg/src/trashmesh.xcf000064400000001650151215013440010605 0ustar00gimp xcf fileB�B�G
gimp-commentCreated with GIMPgimp-image-grid(style solid)
(fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000))
(bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000))
(xspacing 10.000000)
(yspacing 10.000000)
(spacing-unit inches)
(xoffset 0.000000)
(yoffset 0.000000)
(offset-unit inches)
��背景f	

i}�000�1 ��)�H��8%�8�$1
レイヤー�	

|��0�0�0�0�img/src/toolbar.xcf000064400000150273151215013440010257 0ustar00gimp xcf v003B�B��gimp-image-grid(style solid)
(fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000))
(bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000))
(xspacing 10.000000)
(yspacing 10.000000)
(spacing-unit inches)
(xoffset 0.000000)
(yoffset 0.000000)
(offset-unit inches)
��
��
T!�$�(�	text.png�	

�wh|���4
��7�����=�D��D��B�EE��EE��E�E=��=E�EFGF?7��7?FGF�EFGF44��44FGF�EFG>44��44>GF� ,;88���88�D<� " 00=
��
=00$� " #$��$#� " #��#���������������x;:
:�;�z@����@�|@�{MM�M�{�@�~B�C��C��C��C�B�EE�|@��@|EE�����}y<��<y}������w�;��;ww�����|ww;��;ww|���dmxyy�=��=yy�x�dfdqq{?��?{qqf_�dfdgh9B��B9hg__�dfdg11Z��Z11g__�//�a/������/a__�-�--��**\������
�������������������������������������������������������������򩻻����������못�����������쪻������������쨺�͵���������륹�������������죠��������������ޖ�������������󐥣�������������EZ
Z�Eb����bkɬ�ܬ�kt�vv��vv�t]|8k��k8|]�`��`
�[��[
�]��]
�e��e
�p��p	� {��{ �Ql����lQ��oǾ����o�mvv�]
resize_old�	

-q���vtt�v�vttv��vn�nv��vo���oillio���oee���eeee���eeaZ_���__���_ZaUS��SS��SU�KLL�KKLL�K"�FDD�FFDD�F�7=��==��=74(7X��77~�X7(411U�U1111UzU11+ujK+(--(+Kjl+"yo"#�#"il"����������������������ּ�������켴���д�����д����������̮��������訥�����������"�����������������ۑ������ٌ��۳������۱�����ױ����Я��������҂}��}}}���}zyy�z�zyyz�������������������������������������������������������������������"��������������������������¾����߽����߽����޹����������������������������������������3�3�������3��3��������������̙3�������3�3������3���������"����������3������3�3�������3�����������������3��3������3�3��̙��������resize�	

v
�
��2<FHH�E:�/4^v���rW3�,d�zYN^�S3��)Bop345;wi7s}s!Eo@'|y-Mv2L^�l;=g(FG@B7t+U|�r�DX>x|*8^#M[�kE4:?,�WG9l�o<:_6B* j�opH1c03j�oxo;oj�p{�F�;�j�kpoo�krls�l�������}�uljj�l[|^s�t�MUL�����������������İ���Ĭ���Ѫ������������������{����������x��n��yrsx~G����㕰�����pdo��uy��st��h�a�b��k��U����Z���~Z���n���\���bP����Cr�Zuv{`N�␆�s�kBBAHN�⌐����������������������������y�x�����������������������������������������������������д������®������Ǽ�������ᵲ��辴������ҫ���ٴ�������ۢ��Ħ����������������塻����������������������ſ���������ž����ط��������"~�Բm�S�����6�=�����������C\��m~����?Z\�~���뀁`3������c�����������~x��.��������!���'s\�����%����'��������7��}����������������@����x�~
��~resize-rotate�	

Q����92<FHH�E:�/4^v���rW3,d�zYN^�S3)Bop345;wi7!Eo@'�-Mv2=g& 7t+0S*8^#5:WG9	$+6B* 03����������׍������İ����Ĭ���Ѫ�������������{���������q��zstG��h��~hodo��u_s��]\Y�b��kTU���vQ���~ZNI���U���bPXDCc}Ouv{`NR?9NBBAHN�����������������������������������������������п��������ǵ��ij����辫��੨���ٴ����潞��Ħ�����������ț���������������"~�Բm�S����6=����������C\��m��?�\���#��
���!��c�x��y���~.���[�����!1\cR�����%..������	resize-crop�	

.����s}s�|yL^�l@FF�GSxU|�r����|GM[�kGJJNG�Fl�o݆N�Fj�ovyJ�Fj�oxvJ�Fj�p{�G�@j�kpoo�krlsl�������}uljj�l[|^st�MUL�������x��nrr�s|���㕴���sy��tvvxs�r��ݑx�r����v�r����v�r�␆�t�n�⌐�������������������������y�x��������������������������������������ݔ�������������������������������ſ�������ž����ط�������~���Z~���x����G����������x���h����%R�����%����7��x��������������@����x�~��~
listview_old�	

�,�������
�����������������׉������������������������������������
����������������y��
��yq�������������qm��
�mc������������cO��
�O�����
������������������ى�����������������������������������
�����������������y��
��yq������������qm��
�mc������������cO��
�O�����
�܊���������������߉����������������������j�������������
�����������������y��
��yq�������������qm��
�mc������������cO��
�O��"Yf
f�Y"[�
���[i���fg���gh���hj���jl���ln���nq���qs���sv���v{���{g���g	
�	
iconsvew_old�	

�+�������
�����������������׉������������������̐������������������������������y��
��yq����������qm�������������mc��������������cO��
�O�����
������������������ى������������������̐������������������������������y��
��yq�����������qm�������������mc��������������cO��
�O�����
�܊���������������߉�����������������������j�������������������������������y��
��yq��j������qm�������������mc��������������cO��
�O��"Yf
f�Y"[�
���[i���fg���gh���hj���jl���ln���nq���qs���sv���v{���{g���g	
�	
listview.png�	

�)	-�	�������������������xx�����ġ^	�^��׿^�^���^�^��^xx�^��׾^N	�N����N�N����N�N����Nxx�N����NN	j	�j��j�j���j�j����j���j����j�	����������������������z	�z��̸z�z����z�z����z���z��̸zz	J	�J���J�J����J�J�kc�J���JzqrgJv	�v����v�v����v�v����v���v���v�	����������ӵ�����ӵ���������	�	�	�	�
�	�	�	�	�
�	�	�	�	�
�	�	smallicons.png�	

�(�����NN�ttߡ���N��Nt��t��ˡN��Nt��t���NN�tt^����NN�^��^����N��N^��^��ˡN��N^^����NNN�tt�^^�N��Nt��t^��^N��Nt��t^��^NN�tt�^^j�zz����j��jz��z���j��jz��z����jj�zz�����jj�zzߜ��j��jz��z���j��jz��z���jj�zzz�������z��z������z��z�������zz������J�������J��J�������JohJ�������JJ������v�JJ����v��vJ��J����v��vJohJ����vv�JJ�������vvߵ������v��v�������v��v�����vv������������������������������������������������������������������������������������	hide.svg�	

�'"�"�"�����
�������
�ŭ���
���������ꮮ�������ꮮ���カ������ꮮ����ˢh}����ꮮ����^G{����ꮮ����GG�����ꮮ�����������ꮮ��ս�����ꮮ������ꮮ��
�ʮ���������
������
������
������������������������������������������ş���������ܻ������������ܶ������������ݵ�������������������������������
���������������
��	��������������������������������������������������������������������������|�
��|�������
�������
��
��
��
��
��
��
��
��
���L���Lblue-folder-export.png�	

�%�%�%�����������������������������������������������������x�󡆉�����wq���������������������vjc�������]������fX������������������O
PO�ӱ����OO��˯����OON��ɬ����NNM��ƪ����MML��ç����KIGKK������EEAJJè�þ�������AAHH�����������>GG������������;;FF������88;DD������zA>@2CC�����CC20@�����@0�;�����;�)66�)�vw
w�vww������wwv�������vv��ۿ����vvu��ڽ����uu��ټ����tsrtt�׺�����qqossۿ����ȼ����ooss�����������mssr����¶����kkqq������iikpp������nmnTpp����ppTSn����nS�k����k�Oii�O�Uqq�U�)r���r�t�	��t�v�	��v�x�	��x�z�	��|�|�	���>~�
���B-��
�����	���G�����J������������������	�����	,�����,�toolbar.png�	

)��)�ЋЗУЯ�*4k?�KX�e�n�z�]���d�����
���H�/44/����-7��7-����$6����6����#1�����Ǒծ�"/�������Ō��-�������!(���������(!+H����������H+����������ު��������������������������ۚ��������������������������nss^CFFC^ssn�������������ï���������ƿ����ʻ�����¼����������dz�¼�����������������������������������������������������������������
��������������������������l�tvv�z�W>����	�����Լ��U�ý���Ǵ�3�������zvj�������m���ȹ������¹������ƶ������������ɷ�����������KF������������������������������������������������������������������������������������������������������������������������������RZR������������������㿃˓����ˤ�}s��������v����������]����դ���]����������ww��������������񉵽�����󐮱Y�����������������������

��������������ɀ�������������������������������������������������������	������
������������������������	��������������������Ё��������m>����	���������������ԭf�����˟��������������ϱ����	��Ƚ���������������������_F��������ܡ�������؞������ԯ��͛��ל���Ѫ�Ī��Ǘ󐔫����̷��������ø��󈍫����³������–�ǖ����ļ�}�ǁ��ā�vsrqr��sqrsv�bd�gb�]kkQ��������s�w�����ھ��l�����ں{W���Z��Z�ڶt����Z��Z��ڱ�������������������EE��������c��c����w���T������w�r���^�����r�k���e|�����k�_���mttm���_ ���������������������������������������������
�����
�����	�����	������
�����	������
�������������������󢻳������>�����������������������������������	������	������������	��������������xF�GFF�'F��F'�<@@B@�~@B@@<�@�U@�v?S}�@�?qy}R�nR|yq?�18TayysyaT81�92cppc29�)0Tajjoj_O0)�1nigB^oBghg1�'d\;'\i';\d'�!`e!�
`[
�<��<>R>�>����>j�j�?�������o�A����t�C������E�	��EF�
���Fʇf���f��h���h�j���j�l���l�o���o�r���r�u���u�y���y��̀������̙�9�����������
��������������������������������������������������������^>�������������`C�
��M����.�������f��������]�	���3887�H��f�����f̳M���M��f���������������������>�������>�H����H�>�������>�������������ٷ�������f̳M����M��f�����f��H������������߼����ݼ��ݼ���ڹ���߼��Խ��Խ��ռ��ռ��ռ��ռ�������������������ϼ�������˼���������r�w����������u�t�������Ͼ��;��&�v����t���������������������o���{��{���]���p��NLLSh�{��N��M��Ob�p�������V\�x^U�����U]Q�FkhZ���Zhh$�gnn]�]nn_�ettaattc�5euue56���������������������������������������������������������������������������������������������������������������������������Y����������3�<�����lB�#	
*�����~~
�w~�~	�wt�t�loɰ�oo�qaiǧ���������idĥ�梖������dPX�����������X�NJ�t�JJ�K�=D��D
�/:�:�'((�!���������������������������������������������������������������������������������Պ��ʐ��ɚo�n�݋��ʐ���o�o��ɒ��˕�ۛ�����������u������u�|�����ë�|�|��¾�����|�z������������z~������������~{������񒐐��{x���ݓ����xv���������vs���������sl���������lRs�������sR�ds��������sd�Xd������dX�1QOPPOQ1&��������q����������󜭸���������������󢿰�������󵪰�������͵�������������������������������������󢖏��������ϓ���������Ԕ����������ų�����&�����������
H��~��,�*�������
�����	��������������������������������������Ѱ�����������Ҫ�����ڣ�����۟
���ݙ�����������������������������������������������������������������������������������������ucZ__td�Xu�bY__u^�_u�@f^;?fdu�����������������ѿ����������������������ݭ���������ҭ���������������������������������������������������������������������������������������������þ������ն����������&�7RQ:�:l��i*�KkE?>G#hu@�1d	��f�^`&S:��Ja2BKNbׂaTP#>��P>^9-��FBc �#f�?E�V�PUE���HMb��+�X���
�L�������
����	��������������������������������������������������������������
������������p��p�_����_�O�����p����__���������������������2�
��2�d����d�H����ڳH�H������H������e����e������������������������h����h������J������J�K�����K�k��åk%� ����n�G������,�_�����9�)����������������q�����������������������������������������������V�����2����z�����m�3����m6'	03-193*%�\��\��
�\��	�\����\����\�	����
���\�	����\�����\���
�\���\���\�'���~���~�~w
�t��tw�qoo����ol�i�����������iad���㢖������dX��������zz�XPKJJ��t�JN�D{�D=	�::/
(�'�!+�wvw
�lo�ol�io���oi�gh�����hg�^d�����d^�P^���������^P�UTT��v�TT�U�L�r�L	�D�l�D	�<xgv<	�1qcn1	�+ncj+	�"lik"	��'􀁃��������x����ù������z���������~�~+v����{x�����xG���rurv���vg���kin����nh��d�fee�fZ__�Z�Z��XS����SNBu��0J���JJ>I��r=B��{�gB;e�x�A�3�3�||�xx�@='�$0bv�~u_3�!
�022�0�/ŭ������/�0��˵����0�#���֔���#�*���Ԏ���*�!���҅���!� ���т��� �&�������&�!����|���!�����w�����
����s����
����p�����ſ��q����w���
�T�'��������Ŀ
����¼�������꼷�����������淴������������ٰ�����������֪������ڣ����۟�	��ۙ�
������+����
���켷�����칷������贱�����䯯���������֪������ȴƣ�����ǷŜ	��ȼǕ	����ʑ	����͇	����Ђ	�~���~	�ayy�a'������ɺ���������������������������������������������ڼ���������Ƴ��������ϴ��������������Η����ݦ����ť���٣����к�����ִ�����נU�ݗ�������֞���������ϵ��������������������������������о���������������������������������������}��������߄�����ߧ��ހ����ޣ����}���ܡ���}�y���۞���y�v���ڟ���vm�q����qrr�q�ow��q�gor'���������
���������������������������������������������������������������	����
�����+����
�������������������������������������������������������	������	������	������	������	������	������'��������������������������������������������������������������������������������������������������ޭ�����������ʀ���������ϭ�����������������������������������������������������������������������������������������������������������������������������������������ꞡ�����靛�������њ����'��\�\���\
����\�������\��	���\�
����	���\������\����\	���\
�\��\+�\�\
�\��\�\����\�\����\�\����\�\����\������������	�����	�����	�����	�����	������(3����3-���M��̦l\��"x���㿅���_��������Cm���������Nm��J�����%Tlx2\���� ?@3����������3@? ����\2xlT%���̔J��mN��������mC�����ִ�_�����Ϧx"�\l���M�Uqq�U�r���r�t���t�v���v�y���y�{���{�~���~-���	������	������	������	������	���������6�|�����|�G��֩�*l��022�0�/����/�*����*�#����#�(����(�!����!�)����)� ���ѽ �&���̻��&�g����ʰ��!�q�����ɮ��vtm�~~����ǫ��
o���z���Ť��kje�ww����ß���`�t��Ę��PMF�w~~�j�|�������||�x���������xk�~������׹��z�y����������y�{����������{�{����������{�x����������x�{����������{�|�������⟍u�}�������㉵w�w�����案��rtv}�����熤��o{�����瞃��mjk|�������쁘f�xzz�`UY�\g\�U�&Hdt��m���������m�l�������l�o��������o�q��뱝�����q�i�׸�����i�h���������h�i�������i�g���������g�b����}�����b�^���������^�^����������^�|��ž������y�@����������F�w~~�j�{������{k�w�������w|�z���ǻ���}~j�{���������{k�|����������w|}�������ڹ��zz�����������{|�����������|w�����������}}�����������z{�����������|gzz�|��������w�y��������}�{��������{�gzz�e������������������������������������������������т}��������߄���������ހ���������܀���罽������}������ڽ��~���ᴴ���ع��y��߰��ڳ�to����rr�q�������������߱��������������������������������������������������������������������������������������ʸ��������������������綹����������������˼�ᬭ��������ߥ����������U�)Hdt��������������������������������������������������������������������������ߣ����������������������������|��ž������y�@����������F�������������ߴ�������������������������������ߴ����������������������ͫ�������������������������������������������������������������������������������������������������������������������������������������������������ޤ�����������o���������`�}�������XX\�zz�������U���w�������MKR�tt��������R}s����螙�CA\����������������������������������������������������������������������������������������������������������������������h�������fXX��������U������~}�_KM�����|}Z����uPO�����U�)Hdt�������������������������������������������������������������������������������������|��ž������y�@���������F����������������������������������������������������������������޶�������������������������������������������������������������������������������������������Uqq�U�r���r�t���t�v���v�x���x�z���z�|���|�~���~-���	�����	�����	������	����������	��������7���ܦ��|�Mgg�$�i���i%�l���l&�o�����r���r�v���v�z���z����������������������������̙��
��������̙������������$f$�Mffo�����xpP�[���������[�\����������\�^���������^�_��������_�a��������a�b����������b�d�������d�f��������f�h���������h�j����������j�l���������l�e���i	k���m	,o�����o,Mgg�$�j���j&�m���m'�q����g$�v���j&�{�	��m'��
�����
��v��
��{��
�����
�����
�����������������������������������w�w���M�g�g��M�O�\�\��O�O�LL��O�R�q1q�R�R�z�R�N�1�y��������y�u�^��F�u��^���F��������x���x#�U����U󻾾����Ʋ�������������������������������¼���DZ����������բ�����������������Ѳ�������V����Ĩ�������}����ŧ�������z����������o����������f������������U���������f,.��������d||�d�{s�x�m�r��k
�p���_	�i����h�g����f�Z����^�V���~S�N���|L�M����\MM�J�=��A�+�i.�L�&a~����-�w�P�F�w~~�j�{������{k�w~�������y|�{�����ϼ���zw~���������y{�����ϼ�����{y����������|z����ݹ�����~y����������z{����������}|����������}~���������z|gz���������{�}��������z|g�}��������{�g||�g��������w�w���M�g�g��M�O�\�\��O�O�LL��O�R�q1q�R�!R�z�R!�����}�������������LJ���ӵ����ݡ�ك��ه�ܰ��ݡ��|~~|Շ�ԅ{Շ�xs�sxӇ�{k��n[�[nҦkljJ�Mjl�+����+�}~~l���l~~}�{å�������{�{����������{�v�������~�t���������݋��q����������o������������}l�������������g�������������c����������^�������������[�����������~T���������U\c=�������=�))��{s�x�m�r��k
�p���_	�i����h�g����f�Z����^�V���~S�N���|L�M����\MM�J�=��A�+�i.�L�&a~����-�w�P�F�������������ߴ�󰵶�������������������ͩ��������������������������������������������ͬ�������������������������������������������������������������������������������������������������w�w���M�g�g��M�O�\�\��O�O�LL��O�R�q1q�R�LR�z�RL���ͮ������ɢ����޷�����Ȣ��ɹ󳵳����ɹ������������������ʠ3��{�|��3�+����+�!&&���&&!�&�w������w�&��g[dmnh`i����������=�����������p�������������||w��������}�sg]}��������~a^^}���������ucc�|���������ugg�y���������tii�t������~�tmm�jff�Bbc�vsqppon�{s�x�m�r��k
�p���_	�i����h�g����f�Z����^�V���~S�N���|L�M����\MM�J�=��A�+�i.�L�&a~����-�w�P�F������������������������������������������������������������������������������޶��������������������������������������������¥�������������������¥����������������M/�/Mz�/�/zz�z�z/�/z�z�/z�z/�/z�z/�/z�z//z�z/�/z�zTz�z/�/z���z/�P����˭��Py�������yV�ν��������V��ν��WW���������Y�Y�������Z�Z��A��r-%")qƚA��RggR��������̙��������������������%��	��j&�
��|�
��n�
��q�
��s�
��v�
��{����d����	,����,�M*�h{*�i�|+
�k��}+	�m���,�o����-�q����.�s����.�u����/�x����xx�Z�z���/�~�_�o���-���1�c/S�q�	(����'_�S
�Mgg�$�j���j&�Mg����n'�j����Mg����xj�
��~n�
���s�
���x�
���~�
�����
��������"����������"������+������"�w~~�j�|�������||�x���������xk�~������׹��z�y����������y�{����������{�{����������{�x������������{���������ݙ��|����������x�}���������`�w��������̎�}���������}�{���������{�|���������|�czz���zz�cE��ΰzz�΅�h���llm��h�{���s~����{����{�``�{���}���������}�l��˕������l��ϻ���ϊg�����蝝�󰔤���ߔ�䔴󰉜���ى�މ��{�{������{���nn���������������������J�����������������NN|DC�����P\\�����NNCF	�MD��S��������������߱������������������������������������������������������������������wh����������找c�����������FP�����������x�������쿤����������������������������������������E��ΰzz�΅�h���llm��h�{���s~����{����{�aa�{���}���������}�l��˕������l��ϻ���ϊg�����蝝�󰔤���ߔ�䔴󰉜���ډ�߉��{�{������{���nn������������������������������������������뿸������������������嶮�D���D
�®���������������������������������������������������������������������������������-$���������핵����������=�������؋��������ي��������ً���������狵������������������_�����E��ΰzz�΅�h���mm���h�{���x�����{����{�ii�{���}���������}�l��˛�ƛ���l��ϻ���ϊg�����靝�󰔤���└甴󰉜���މ�㉰�{�{������{���nn���������������������z���������m�j���������xx�vie������v���G�������rr�occF�oZmF
��j����������
�����Y����������	�������������	��������d�����
�����������
�Mgg�$�i���i%�l���l&�o�����r���r�v���v�z���z������@���������	���F�����.������������������������	,���������,2�N���ȶ�N�O������شOq������qH�������H��
��РA�������AZ�����Z9�����ج�9&8Sq����qS8'
�
?����f��<������>��
�����
�����
�����
�����
�����
�����
����
����
����
����
�����������������蝝�󰔤���ߔ�䔴󰉜���ى�މ��{�{������{���nn����������������������������������������������B�a�������_��������������������������{��{�������yNHSLLSr��{ubN��MOO�c��pZVS��SVV�b��^]]Z��Z]]�d�xhh�`�`hh�xnn�f��fnn�ottat�h�nxx�n"���	��X�����������X������������ͬ�ۼ�ż۵�ͯ󰾺���Űͬ������۪�ͯ�Ը�ŸԤͬ����Ŗ�͛�||�uXP7
�qT������������ͬ��ͯ�ͬ���p���	��X�����������X������������ͬ�ۼ�ż۵�ͯ󰾺���Űͬ������۪�ͯ�Ը�ŸԤͬ����Ŗ�͛�||�uX�
�qT�����������NN|D	�P\\	��NNC�MD��S������蝝�󰔤���ߔ�䔴󰉜���ډ�߉��{�{������{���nn������������������������������������������������������	D#�t�������t������Ţ��ž�������ǹ���������€}ò����������}|���먒������|z������䒕��zv������陛��vr����������ro��������ol�����������li�������i[�������[�=PSS�P=���	��X�����������Xg||�g�y����»yͬ�r���Ŏ�r�ͯ�m������mͬ�g�����g�ͯ�^���Ŋ�^ͬ�N��}��N�͛�F))�6XP7
�qT������������ͬ��ͯ�ͬ���p���	��X�����������Xg||�g�y����»yͬ�r���Ŏ�r�ͯ�m������mͬ�g�����g�ͯ�^���Ŋ�^ͬ�N��}��N�͛�F))�6X���
�qT��������������뿪��������嶤�	����®������靝�󰔤���└甴󰉜���މ�㉰�{�{������{���nn������������������������������������������������������	F#�����ѹ�������������������������������������������������������������������������������������������������������������������̫#�������#���	��X����������X&&��������ͬ��]��]��ͯ�c\NQ`hͬ�������ͯ�~U��U~�ͬ�cTEHYd�͛�5�XP7
�qT�����������ͬ��ͯ�ͬ���p���	��X����������X&&��������ͬ��]��]��ͯ�c\NQ`hͬ�������ͯ�~U��U~�ͬ�cTEHYd�͛�5�X1*&
�qT�������g�g���xx�vF
�v�����rr�oA
	�oZm��j�����f��<������>��
�����
�����
�����
�����
�����
�����
����
����
����
����
��������
��j�����jk������k���������
�����
�����
�����
�����
����
����
����
����������p������p3������3	
�	$f	f�M$f���f����ff�M�������������3��������������3��������������3�����ff�M$g���x�%hjloqtwz~��g
������3����!)0��K$�$f	f�M$f���f����ff�M�������������3��������������3��������������3�����f���fM$g���x�%hjloq�����������	��!)0���$����
�����������������׉������������������̐������������������������������y��
��yq����������qm�������������mc��������������cO��
�O�>����
�����������������׉������������������������������������
����������������y��
��yq�������������qm��
�mc������������cO��
�O�0�a�������_��������������������󟇇����LJ�����yk��LSr�{ubR���NOOc��pZVS��UVV�b��^]]U]�d�xhh�`��`hh�xnn�f��fnn�ottat�h�nxx�nL��������������������������������������������������2����
������������������ى������������������̐������������������������������y��
��yq�����������qm�������������mc��������������cO��
�O�>����
������������������ى�����������������������������������
�����������������y��
��yq������������qm��
�mc������������cO��
�O��t�������t������Ţ��ž�������ǹ�����Ĺ�€}ò�����ղ��}|���ۨ��侐��|z�������ӓ���zv������홛���vr��������ro�����������ol�����������li�������i[�������[�=PSS�P=<��������������������������������������������������2����
�܊���������������߉�����������������������j�������������������������������y��
��yq��j������qm�������������mc��������������cO��
�O�>����
�܊���������������߉����������������������j�������������
�����������������y��
��yq�������������qm��
�mc������������cO��
�O������ѹ�������������������������������������������������������������������������������������������������������������������̫#�������#;��������������������������������������������������2�j�����jk������k���������
�����
�����
�����
�����
����
����
����
����������p������p3������3	
�	*���������������������������2�vtt�v�vttv��vn�nv��vo���oillio���oee���eeee���eeaZ_���__���_ZaUS��SS��SU�KLL�KKLL�K"�FDD�FFDD�F�7=��==��=74(7X��77~�X7(411U�U1111UzU11+ujK+(--(+Kjl+"yo"#�#"il"���"�������������;����׳�k�����i���i�j����l�c������?��������u���o�ޱ�����@��p����U��������)�bjjggjjb�ck������kc�co��������oc�bh����������hb\~����������z\]��||w��hggju]\�{��������jq\\�v��������lq\W|smml��lmmsoWPmzwws��sww�eP1Uy||v��v||uU1�LWz��tt��yWL�(Hcy��ycH(�.9;;9.*�ixtt�xi�d����佂d�iz�������zi�k������k�b����b�^������^�S�����S�I������I�Nd������V&�RY�B����C�[i�	�[v�7	�\��M
�V�^���������������������ּ�������켴���д�����д����������̮��������訥�����������"�����������������ۑ������ٌ��۳������۱�����ױ����Я��������҂}��}}}���}zyy�z�zyy�z"�������������;����׳�k�����i���i�j����l�c������?��������u���o�ޱ�����@��p����U��������)����������������̺���������ظ������������ӳ���������������������������������񱶨�ͼ�������󶸤�ſ������������������������������Ğ��������ǝ��m�����ȭ�m�`txxt`)�ixtt�xi�d�����Ƃd�i�������؀i�k������k�b����b�^������^�S�����S�I������I�Nh������V&�RY�D���C�[i�	�[v�7	�\��M
�V�_��������������������������������������������������������������������"��������������������������¾����߽����߽����޹����������������������������"�������������;����׳�k�����i���i�j����l�c������?��������u���o�ޱ�����@��p����U��������)�'IHMMHI'�FPu����uPF�FS��������SF�'L���{��{���H'@n���u��u���k@C�yooh��USSYeC>�n��������S]>>�f��������UZ>@mZUU���UU�ZU@2R`]]Z��Z]]�I29_`^[��[^^Y9�5:ZbaZZaaY:5�
-GZ``ZG-
�*�ixtt�xi�d����ɂd�i������i�k�������k�b����b�^������^�S�����S�I�����I�Nh����V&�RY�D���C�[i�	�[x�<	�\��P
�V�d�$�H�����J���
-������h������������������E����������Z����������������������:����������Y)�l��Ħl�M�����M�M������M��������l����l��������������������������l����l��������M������M�M�����M�+C���ī�C-��@ZeZ@�!b��ǵ�b!�d�����ͤd�C�����ȑC�`�����`�o������o�e�����e�I������I�${����Ѹt�s�����ũ}*�*|��*Vy�yV�8���%�K���3	�t��D	�D�k/,($%����
����������������������������~�������~x��IJ��������xp���������pm�򨜎������me��~�~�������eZ�품���oo��ZW������WA����������A"!!����!!�"��L�STTS
�P��P
�L��L
�E��E
�?{u?
�8fd8�/11�[Y11�/�*+kVMLQZ+*�!$]HHU$!�RQ	�=Q�PSSP	�KO��OK�EI�~~�IE�CA��ulv�AC�:<<�rp<<�:�5kh5
�,_],
�'US'
�!PO!
�ON
�(�?@@�?�=Cg����gC=�9F�������F9�4;�|pL44Lp|�<40Zvi0110jx_0*lj@+�+Aks*%la%�%dv%^W�[kFH,�1KT(79]H:3)&,<G$<� 
/=

�4%%B��%����
����������������������������~�������~x��IJ��������xp���������pm�򨜎������me��~�~�������eZ�품���oo��ZW������WA����������A"!!����!!�"��L�����
���ޛ
���Ж
���ƍ
�����
�|��|�qss���ss�q�ljɾ����jl�dbô��bd�Y[��[Y	�:UU:#=������	����䙖���Ἴޑ�����Ƴ��͊�������������x��x
�o��o
�g��g
�_��_
�X��X
�=SS=(�������������ҽ����������ޡ�ڏ��û������ۖ������������������􃓯��z��z�z��zs��sr�s��sk���jkkۅ��kd���dcd�d���d^b���x]]����b^�X`����W���WW�RWy��Q����QQ�NMMNNMM�N%����
����������������������������~�������~x��IJ��������xp���������pm�򨜎������me��~�~�������eZ�품���oo��ZW������WA����������A"!!����!!�"��L�����
����
�����
�����
�����������������������������������
�h��h@=������	�����������������������������������ݼ
����
����
�����
�����
�p��p(����������������������������������������������������������������������߾��������Ƶ���������௮����ͯ����忨�������������������������������������%�$f$
�$g�g$�"Zgg�g�Z"[�	���[i���ij���jk���kl���lm���mn���no���ob�	���b&fuu�u�f&�*x�x*�-3JxJ3. ��&���̙
����
����
����
����
������������\����\�\����\�\���\�n��n�03gg338H�\��\	�\���\�\����\�\����\�����������
����
����
����
�����3��̦3&���l��̦l�M������M�M����M�����������l��ZZ���l����Z�Z�������������Ι\�����ֻJ�̔���M����2����lx���x3�����"_mmk@���̄�BNT?����\�% �����?@@�?�=Cg����gC=�9F�������F9�4<�|pL44Lp|�;40_xj0110ivZ0*skA+�+@jl*%vd%�%al%k[�W^TK1�,HF3:H]97(<$G<,&)
�=/
 �B%%4��'���~,	��т.	��ҢD
����U�s�w1�E��6�%']�l�1���?�6��s9�!8yM-���]
��x
����r�o&��i\
��O3��՗g6���w�?z��j�HO���h�N<���k�M2���oJ.��p�x,����v:��¥f@���;o	��ˋa	��|fK�������}_Q�������U�Qj���������eQM����ȿ���̄MI����ȿ���̖ID��������ȭD>��������>8����ľ����82屆�}yww�f�2'����������'�&Q&�������������Ҽ����������ܠ�ڏ��Ļ������ו������������������􃒮��z��z�z��zs��srr�s��sk���kk�j���kd���d�dcd���d^b����]]x���b^W����W����`XQ�ƻ��Q��yWR�NMMNM�N'���ű����Ʊ����ϴ�����Զ�����í�����ɰ�����ۻ������γ������̷������Ƿ��̲������s�
����r�o&��l
��nI��կ�Q��Ꙭ\����e`����kN��Ғ�lE��ዂiA��x�x3����v>����fE���jM4q	�z�T-	��1*�������`8&�������U�Qj���������eQM����ȿ���̄MI����ȿ���̖ID��������ȭD>��������>8����ľ����82屆�}yww��2'����������'��++
��}}�
�L��L
�k��k��������������������������������������������������������������������������������ȶ�ڵ��ܶ���������ɯ�����򨨿��ﭩ���������������������Ģ���������'���r	���v 	��̘5	����G	�a�j%�5��(�N�_�t��1���f*�j:	���X	��y����r�o&��LF
��#���t7���CTi��3j ;���.r%%���/v$���xV!��f�x ��y�v7����f:���E)k	�\w6	��	
�������Q'}������U��Qj����������hQM����ƿ����ۋMI����ƿ����۠ID���Ⱦ�����׼D>����������>8����ý������82屆�{xx{��f�2'����������Ǥ'��
�
�	bb	
�

�l��̦l�M������M�M����M�����������l��ZZ���l����Z�Z�������������\�������ܔ��J��όl���2����M�����3x���x������@kmm_"�\����?TNB����� %'����'��ӨE	�>���p������C����Z�/����x���L�i���>�Q���~�X���_��SzS
��
���Q�@���
�Z������\�����&���0���D��$�"����+���<�����B�d�������	������g���y+$����80$�4gg�4�x���x)�����)@�����@W����Wl�
��ls�
��sv�
��v{����{V�����V�����̙�7g�������ɨt?&03��̏33*�	�����������������������������������������������������������������Һ����������������������ȼ�����ۯ���֮�����A��������.��������a�j���j�
Agsrf?
�ge_PP_eb�
dYWW��WWYZ<VNN��N�S2VGG������$'6YD���ܱ��&1U;ԧ'��'��*/B0),,��,,)/*%8550��055�8::4��4::1�6?>11>>4
� 6@@6 5�b^[TRR�N�`Yt����jBB�^U��������26�\U��zvrtuy��--Yp�zrpnnq�~�^&T��vonoo��晝 K��s��p����~�B�����q}�B��t��mr��=d�yq�ٙlnt�N6/��wspoot��+ ���}|��}�!R����L#�1210122�1//�0/	/+
+/���	
/	�			�	
	���������N}}N�����KzzK������IvvI������GrrG������DnnD����~�AjjA����~}�|�>ff>���ر�|�z�;cc;��ۮ�z�w�8dd8��׫��w�u�1::1��ԧ��u�r�,��,��Ѥ��r�n���Ξζn�d���ϐ�d@�F\\�F�/00�/�/8h����f8/�->���rr���=-�,5�{yy��yy{~4,*axpp��p�uW*'yii������FJY'%{f���ܹ��JT%#w_ԯK��K��PU# eYOTT��TTOXP Gc``Y��Y``�=!ahg_��_gg[ �$booZZoo`#�=appa=��&���½�����������ֹ�����������ȝ��¾�����Ȋ��Ė������������ߩ������������Έ�����������������͹��z�������˷���x������Ͷ��ڛw���ۼ�����ٸqq󑊾�̼��ٷlq�������Ǘnp��~zspqql"�1210122�1//�0/	/+
+/���	
/	�			�	
���	��8}}8������6zz6������3vv3������2rr2������/nn/������,jj,������*ff*����m\�(cc(���j���$dd$���g��� -- ���c���\\�`����||��Z��������L�%��������������ؽ���������꿵겸��������㷲������ֱ�ɯ��������᭰�����������贽�����ɵ����£��˼�����ļ�ş�����������������������؜�����������a���㸉a� SnrrnS &�@;91-++(�=6Y����P�;4��ww��x�94�mjhh�k�v4W�mhecbc�o�H-��idaa���㋋&�rf��c����i��ps���[g���dy�W[��L�d_uԊVX\�Ar�`\YYX[�i�m��fd��f�B����=�#�1210122�1//�0/	/+
+/���	
/	�			�	
������a���ց��a������������������������������������������u���	������	������	������	������	���
�����Q
,�����,�d����d�H����ڳH�H������H������e����e������������������������h����h������J������J�K�����K�+C��êC-��#}����}#�S����S�S����S�"����"~�
��~�
�����
�����
����
���~�
��~"����"�S����S�S����S�#}����}#"����������	��������.����������	��������.����������	�����������������}z��
��t��������|�o�����j�����d����Ԭ����_�򪬬�������ў������ڿ�ظԈ�����ҫ���ʓ���������ⶇ~ﺻ�ƥ�᜵��ՙez�����ɽ����meu�����۠ɥ�¡�mnrnhc^[Vri^��X]Y	�r\t�srq�fdb`^t��q�dg��\s���n�db~��Zru���k�a}�sYWpom��i�_usYUljh�[YD�_]�PNLc_sqY�OdgJHGa_s�tW�MaycLE_�zsWU�I^dpD\��[T�FqsBZXVTR�FECBAtsr�b`t��qon�fbyw\s���sl�dbx�zZp���k�a��yYWm��i�_��^Wmljhg�][YWU@�ca_][�QPNLJad��Y�O~yJa_w{�W�Mwh^G_w�nWU�KNbu[D\omVR�IHF`ZBXV�ECB�=Q=�i��1	�����v-�������j"�����j4%m�y��I�^K���y��Mcr�������xq`V�ӏ��|���Ǵ���������u�ʿ����������z�o�����������s�i���������~xrmhd��������|�q�gc_������{upkfb^򚓍��ztojeab[Z����������������
���������������������������������������������Ļ��ף�������ڿ�ظԈ�������ҫ���ʓ���������ⶇ����ƥ���͚ՙe������ɽ����me�������ɥ�¡�mn��������i���y]Y	�r\�����������������ɪ����󳱽�Ũ����Ǽ�Ƕ�����Ĺ���������D���������󛧨���������󙥳��������������������������������������������������������¾󳱻Ǻ����Ѽ�ǿ�����й��ê������������@������󞜙�������󛶳�������󙳩��������󖗤���������������������������ſ�	����Ѵ�������ʫ������ͪ�������Ϙ��q�¤��Θ������������ӏ��|���Ǵ���������u�ʿ����������z�o�����������s�i���������~xrmhd��������|�q�gc_������{upkfb^򚓍��ztojeab[Z���������������
����������~zv��������������������������ս��ૣ����ڿ�ظԈ������ҫ���ʓ�������ⶇ���ƥ����ՙe����ɽ����me������ɥ�¡�mn������ǟi����]Y	�r\h�gfe�\[YXVh��e�[_��Tg��~c�ZYv~�Rfk��{`�Yu�mRPedc�y_�WnlRNa`^�SRD�WU�JHGZWljR�J_bEDCXWl�nP�H]u_GAV�slPN�EZ^l@T�}TN�Bmn?SQONL�BA@?>hgf�YXh��edc�\YqoTg���ib�ZYp�sRe~��`�Y�}rRPc��_�W��WPba`^]�USRPN@�ZYWUT�KJHGEX\��R�JytEXWqt�P�HscZBVq�hPN�FJ_qW@TigOL�ECB\V?QO�A@?��$d_	�;p��U
�E|����K�KEj��A���;��հ���@�����������B;,#�ӏ��|���Ǵ���������u�ʿ����������z�o�����������s�i���������~xrmhd��������|�q�gc_������{upkfb^򚓍��ztojeab[Z�~�	����
�����
�
�
�
����
��
�����,����
����	����	�������������������������D��������������������������������������������������������������������A�������������������������������������	������������.���.����������������������R��W�U���[��#�2.0**���R�]�W�W�Z�]�x�.32/+�HR�R�Y�Y�Y�\�`��(9940[�����!���������ͤ���������㯚���������ٷ������������������~���~�~�u�̢wv�v�mn��npn�m�f��xgf�d�_ۯ_�_H�2YW�-!����������������������������������������������������������y�������v�������������r����������k����p��������d��������]�%?;6��6	�/0��00�/�()�rz���wc:)&"�hh�aTICAJ5"�fgV@;71+$)l,��
2

���Y?
;�6�66�/00��0/�&)=k~��~{qh)("I|uhVIC@@CHg"0vhL==;85* ;YW1"�
!
�

���32�tk6��7bX(	�AQ'/�13	
�"�
�
���
�;P�O����O�O����O�N����N�M����M�L����L�K����K�JǾ��˭JJ�Hú��ê��H�G��������G�F��������F�&$$G�������D^^�#�������C�%##E�������@�;������;%�)66�)$�����
����	����׊���퀁������ij��|wߴ�ధ�����wonֲ���������zmed̽dd�fny���d�\[�[]]�[l[�?TT�?T�1;�;Y�
�����ᒑ������׊��|�������ǽ�ˁ�w�����������wm�ü���������nod���|ogdd���de[n[]]�[�[\�T?T�?�;�;022�tk6��7bX(	�AQ'/�13	
�"�
�
���
�;w�w����w�v����v�v����v�u����u�u����u�t����t�s�����ss�s������s�r���ܳ��r�q���۱��q�,**S��٭��p^^�)��ة��p�+))R��ף��n�k���ڟ�kC�Oii�O$�����
����	��������������������������������������������ø�������������������������x���x��_s�sY�
���������������������������������������������������������������������������x��x�s�s]2!�H�̓�+~�f�������ϽJ�f���3�ݴ�3������3�������������c�ܶ�g��u�Ն������A����3�������s2^̼B 
8L�Uqq�U�r���r�t���t�v���v�x���x�z���z�|���|�~���~-���	������	������	������	����������	���	�����I	,�����,"�H��H��
�H��	�H����˶�5�H������y
�����yH�����5H�����������H��(G�Ͷ�H���z�
T�$).233� �H��H�H���H�5��������H�
y�����Hy�����5�����H������������H�͍G(��H��z�H��33�0,'�W

�
T�PQPQ��QPQP�Kv�aL��La�vK�G��������G�?S��������S?�899�Ԧ,,�ԡ9982̿��--�ǿ�2+Ļ��00�Ļ�+%$$�ϲ33�ϓ$$%�2ƽ���ٽ�2�Ʊ”�ʔ±��B�'��'�B�	��	�������������������������������������������������������av����y����JJr���v��-.)DB�Bl���r��#�j]]�s9���k��1/8/b���d����((d����]���MBBA@@?>>=<<;::CB������>=������9B׺����=<׺����8Aָ����<<ָ����7@Ե����<;Ե����7@ӳ����;:ӳ����6?������::������5>>=<<;::99877655>=<<;::998776554=������98������3<׺����87׺����3<ָ����77ָ����2;Ե����76Ե����1:ӳ����65ӳ����1:������55������0C98776554332110:�����¿������¿����������������������������������������������������������������������������� ����¿������¿������������������������������������������������������������������������������T�PQPQ��QPQP�Kv�aL��La�vK�G��������G�?S��������S?�899�Ԧ,,�ԡ9982̿��--�ǿ�2+Ļ��00�Ļ�+%$$�ϲ33�ϓ$$%�2ƽ���ٽ�2�Ʊ”�ʔ±��B�'��'�B�	��	�P�O����O�O����O�N����N�M����M�L����L�K����K�JǾ��˭JJ�Hú��ê��H�G����������G�F������澘��F����叢������Dy�����؃������Cljdyw�w�������@�;�mm������;%�)6GA66�)��������������읜�����욞�����윜�����욞�����뜜�����뚞�����ꜛ�����ꙝ�����ꛛ�����ꙝ�����雛�����陝���������������������욚�����옜�����욚�����옜�����뚙�����뗛�����ꙙ�����ꗛ�����ꙙ�����ꗛ�����陙�����閟���������������������������������������������������������������������������������������������������� ��������������������������������������������������������������������������������������������T�PQPQ��QPQP�Kv�aL��La�vK�G��������G�?S��������S?�899�ӥ,,�Ӡ9982˾��..�ƾ�2+Ļ��22�Ļ�+%$$�Լ66�Ԕ$$%�3������3�к̛�ԛ̺��E�)��)�E�	��	�w�w����w�v����v�v����v�u����u�u����u�t����t�s�����ss�s������s�r�����ܳ��r�q�������۱��q��������٭��p������ة��p����������ף��n�kڰ����ڟ�kC�Oi�ii�O����������������������������!����������������������������������¾������¾����������������������������������������������������������������������������� ����¾������¾�������������������������������������������������������������������������������9gg9�:ii��ii:�;��zk��kz��;�m��������m�~���~�?ss�ו���ss?v��������vy��������yE||��}}��||E� ����� �����������I����������I�J�"����"�J�+33_��_33-��Uqq�U�r���r�t���t�v���v�x���x�z���z�|���|�~���~-���	������	������	������	����������	���	�����I	,���Ǧ���,���������������������
�����
��������������������
��MA@?=<;C���¿���A������8������@׺����7�������?ָ����5��������=Ե����4��������<ӳ����3��������;������1���C875431;MA@?=<;C���A������8���¿���@׺����7������?ָ����5�������=Ե����4��������<ӳ����3��������;������1��������C875431;���壞������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������¾������������������������������������������������������������������������¾����������������������������������������������������������������������������������������������������������������������������������������|>img/src/icons-small copy.pxm000064400000145400151215013440012011 0ustar00PXMT_DOC�HEADERIN]#��m�~METADATA���streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_IMAGE_ZOOM_�����NSNumber��NSValue��*��f������_MASKS_VISIBLE_RECT_�����{{0, 0}, {0, 0}}�����_DOCUMENT_SLICES_�����NSMutableArray��NSArray�������_PX_VERSION_����� 1.6.5�����_DOCUMENT_WINDOW_RECT_�����{{712, 4}, {200, 874}}�����_PRINT_INFO_�����
NSMutableData��NSData���z�[378c]streamtyped���@���NSPrintInfo��NSObject�����NSMutableDictionary��NSDictionary��i����NSString��+NSHorizontallyCentered�����NSNumber��NSValue��*��������
NSRightMargin�������f�H�����NSLeftMargin�������H�����NSHorizonalPagination������������NSVerticalPagination������������NSVerticallyCentered�������NSTopMargin�������Z�����NSBottomMargin�������Z��������_LAYERS_VISIBLE_RECT_�����{{0, 147}, {239, 240}}�����_DOCUMENT_SLICES_INFO_���������PXSlicesPreviewEnabledKey�������������PXSlicesVisibleKey�������c�������__OLD_METADATA_FOR_SPOTLIGHT__���������	colorMode�������layersNames���������Untitled Layer 8�����Untitled Layer 7�����Untitled Layer 6�����blue-document-zipper�����blue-document-flash�����blue-document-text-image�����application-terminal�����
script-php�����Untitled Layer 5�����Untitled Layer 4�����Untitled Layer 3�����Untitled Layer 2�����Untitled Layer�����script-code�����script-code�����globe�����blue-document-office�����blue-document-pdf�����film�����
music-beam-16�����image�����blue-document-text�����application�����
blue-document�����Layer 1�����dir�����
dir-opened�����file_extension_mpeg�����file_extension_exe�����application�����Layer 0������keywords����������
csProfileName�����sRGB IEC61966-2.1�����resolutionType�������
resolution�������d����R@�����
canvasSize�����
{16, 1280}������PXRulersMetadataKey���������PXSlicesPreviewEnabledKey�������PXGuidesArrayKey�������������PXGuidePositionKey�������c�����PXGuideOrientationKey��������������PXRulersVisibleKey�����������������_MASKS_SELECTION_�����I�[73c]streamtyped���@���NSMutableIndexSet��
NSIndexSet��NSObject��I������_ICC_PROFILE_NAME_��ے���_ORIGINAL_EXIF_���������{TIFF}���������ResolutionUnit�������Software�����Pixelmator  1.6.5�����Compression������������DateTime�����NSMutableString��2011-07-02 16:15:43 +0400�����XResolution����������B�����Orientation�������YResolution����������B������{Exif}���������
ColorSpace�������PixelXDimension������������PixelYDimension��������������*kCGImageDestinationLossyCompressionQuality������������PixelHeight�������������
PixelWidth������������HasAlpha��풄��{JFIF}���������
IsProgressive�������YDensity����������B�����XDensity����������B�����DensityUnit��������{IPTC}���������ProgramVersion�����Pixelmator  1.6.5�����ImageOrientation�������Keywords��ن����ProfileName��ے���DPIWidth����������B�����{PNG}���������XPixelsPerMeter�������������YPixelsPerMeter��������������	DPIHeight����������B�����
ColorModel�����RGB���������Depth�������������_DOCUMENT_LAST_SLICE_INFO_���������PXSliceMatteColorKey�����NSColor���ffff�����transparent�������PXSliceFormatKey�����PXSliceFormatPNG24������_LAYERGROUPS_EXPANSION_STATES_�������������_STATE_�������_ID_�����;92352D33-BEFB-4A00-B68D-0F5820D3E342-34139-0000E0B12CF05B8B�������8���9����;B5A88CD4-059B-416C-8D3C-29E0248EFCD8-34139-0000E0AF0B615888�������8���9����;6F8BFC21-2EB3-48E7-B6E0-94AE9AF57B08-34139-0000E0ACB5DFA933�������8���9����;94E65854-C0A3-43CE-B5A9-193CA1076463-34139-0000E0A9F5D631B6�������8���9����;B8FDFB16-BEDA-481A-AA0B-EC14C0FC4102-34139-0000E08C1EBDE397�������8���9����;1877DB60-E816-4460-B972-EDE51DEEE0B4-34139-0000E0861C377A66�������8���9����;FBFD89FC-7050-4E67-8997-4DF17F3B4C29-34139-0000E0600B7D2A44�������8���9����;4B50D76C-C380-4B7F-9C44-F1BC0E7CCA19-34139-0000E029DA4EADC1�������8���9����;4871A4F3-8357-4229-A29B-A40DEFCF3D65-34139-0000E0149A668852�������8���9����;978681AD-3906-421D-A009-EF9632EEAFD4-34139-0000DFFC4D2F017B�������8���9����;AEEEE2D6-0935-40B3-80B2-9D5FD83AE151-34139-0000DFF8EFF6C027�������8���9����;1C8CFD11-5BC8-4921-A2C9-BFC435022388-34139-0000DFF5ED5BB5E0�������8���9����;B5E5BCC3-F31B-4396-81FA-126F4627B037-34139-0000DFF29ABF2DAF�������8���9����;D528B246-64CB-48B6-8888-A691D6D873B7-34139-0000DFE82FD68418�������8���9����;DCE88FCA-1ADB-4C55-B4A0-146CFB06E63B-34139-0000DFD44D2BE287�������8���9����;3ABE6755-1173-49C7-87E7-ADB8EE87D090-34139-0000DF64928BD4D5�������8���9����;0B88DA97-EAD9-47D2-B4AB-BACEBD348E6F-34139-0000DF3786A7F25A�������8���9����;DD69E198-0D36-4EB6-9C1B-6DA63FDAC3D3-34139-0000DF24AAA0FBA2�������8���9����;4287CBB1-6C2B-437F-A970-A3C40E157AEA-34139-0000DF0B7C478B03�������8���9����;1FFB0EDF-BEB7-4304-BA21-460EA78D0511-34139-0000DEF3D95AC235�������8���9����;D01D764B-05D3-4F17-8BF7-9904CD516B4C-34139-0000DED378FA8684�������8���9����;B870949D-8C3A-428F-906A-BCB7830D1D24-34139-0000DEB42B147D41�������8���9����;B3C032D4-132E-4F16-A7B7-729D4677FCAD-34139-0000DE9ECE3BBF03�������8���9����;DC77C90A-5C7B-471B-AEA5-1238F7E1FB7E-34139-0000DE575AE40F3C�������8���9����:B49E082D-A1FB-487E-BE17-E16F73A8F48E-7317-000022DE0376C4C3�������8���9����:2FF17678-F87E-4E6E-974D-AEA1452BD260-7317-000022DE0375EFB6�������8���9����:E171E19A-6285-43FA-A545-2E08E088286D-7317-000022DE03753825�������8���9����:006E318C-BD27-431A-AF83-E3B0BFDF3832-7317-000022DE0364379F�������8���9����:942D4059-6B5B-4B16-BBC5-36E294E422BD-7317-000022DE0361715A�������8���9����:9D4AFCE3-1E59-42D2-AB1C-D4C2B0A3214B-7317-000022DE03608265�������8���9����:C24D76FC-604F-44DD-ABC9-DE5742197FC4-7317-000022DE035EDBD5�������_IMAGE_VISIBLE_RECT_�����{{-61, 0}, {169, 832}}�����_LAYERS_SELECTION_�����8�[56c]streamtyped���@���
NSIndexSet��NSObject��I�����GUIDES_INFO8c	COLORSYNCHHLinomntrRGB XYZ �	1acspMSFTIEC sRGB���-HP  ?�.�J��`�<_|}��cprtP3desc�lwtpt�bkptrXYZgXYZ,bXYZ@dmndTpdmdd��vuedL�view�$lumi�meas$tech0rTRC<gTRC<bTRC<textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ �Q�XYZ XYZ o�8��XYZ b����XYZ $����descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view��_.���\�XYZ L	VPW�meas�sig CRT curv
#(-27;@EJOTY^chmrw|�������������������������
%+28>ELRY`gnu|����������������&/8AKT]gqz������������!-8COZfr~���������� -;HUcq~���������
+:IXgw��������'7HYj{�������+=Oat�������2FZn�������		%	:	O	d	y	�	�	�	�	�	�

'
=
T
j
�
�
�
�
�
�"9Qi������*C\u�����


&
@
Z
t
�
�
�
�
�.Id����	%A^z����	&Ca~����1Om����&Ed����#Cc����'Ij����4Vx���&Il����Ae����@e���� Ek���*Qw���;c���*R{���Gp���@j���>i���  A l � � �!!H!u!�!�!�"'"U"�"�"�#
#8#f#�#�#�$$M$|$�$�%	%8%h%�%�%�&'&W&�&�&�''I'z'�'�(
(?(q(�(�))8)k)�)�**5*h*�*�++6+i+�+�,,9,n,�,�--A-v-�-�..L.�.�.�/$/Z/�/�/�050l0�0�11J1�1�1�2*2c2�2�3
3F33�3�4+4e4�4�55M5�5�5�676r6�6�7$7`7�7�88P8�8�99B99�9�:6:t:�:�;-;k;�;�<'<e<�<�="=a=�=�> >`>�>�?!?a?�?�@#@d@�@�A)AjA�A�B0BrB�B�C:C}C�DDGD�D�EEUE�E�F"FgF�F�G5G{G�HHKH�H�IIcI�I�J7J}J�KKSK�K�L*LrL�MMJM�M�N%NnN�OOIO�O�P'PqP�QQPQ�Q�R1R|R�SS_S�S�TBT�T�U(UuU�VV\V�V�WDW�W�X/X}X�YYiY�ZZVZ�Z�[E[�[�\5\�\�]']x]�^^l^�__a_�``W`�`�aOa�a�bIb�b�cCc�c�d@d�d�e=e�e�f=f�f�g=g�g�h?h�h�iCi�i�jHj�j�kOk�k�lWl�mm`m�nnkn�ooxo�p+p�p�q:q�q�rKr�ss]s�ttpt�u(u�u�v>v�v�wVw�xxnx�y*y�y�zFz�{{c{�|!|�|�}A}�~~b~�#��G���
�k�͂0����W�������G����r�ׇ;����i�Ή3�����d�ʋ0�����c�ʍ1�����f�Ώ6����n�֑?����z��M��� ����_�ɖ4���
�u��L���$�����h�՛B��������d�Ҟ@��������i�ءG���&����v��V�ǥ8��������n��R�ĩ7�������u��\�ЭD���-�������u��`�ֲK�³8���%�������y��h��Y�ѹJ�º;���.���!������
�����z���p��g���_���X���Q���K���F���Aǿ�=ȼ�:ɹ�8ʷ�6˶�5̵�5͵�6ζ�7ϸ�9к�<Ѿ�?��D���I���N���U���\���d���l���v�ۀ�܊�ݖ�ޢ�)߯�6��D���S���c���s���
����2��F���[���p�����(��@���X���r�����4��P��m��������8��W��w����)���K��m��LAYERS��$D'�*�..1�5J8�<~@
CMF�I�MPWS�V�[^�b�fh�l+o�ruw�{~|��W��J�Untitled Layer 8d';92352D33-BEFB-4A00-B68D-0F5820D3E342-34139-0000E0B12CF05B8B@�x}�IH[Q�_����`����"�qHU�(�E�Tp@A��b��7.��]H6.*�\W�l�ԅ��(���9�g&_�@O��W�?.	��%wp�Sk�E.9��i.M�:��3&=%)���o>g~�	�u�N��U�x<�z�>X��_�NzJ��?IMI��|�̽Y
n�V�ur���G� ����N��/�sQ�ɑ�5�"�`N8���~��4=6p?�΂QF�Ԗfw�/��2�x�4���]F�ԕ�ꉛ;2�<��dm��]F�4���M0>\��ƺ�q�	�]F�4���K\�)|�$�}���<�#j,��(i���O�v)r��ā��-��(i���f>z�"��^p�a�m��(i�z��:�Gѳ�gx#�2���:o|�|M8$+�"�tQ�!�&�O� ��gxc�2���,���bC8$+�"xc�2������]� 80؋t�^p�x���ˈ�Ɗ���z��c���>tyM�J���streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;37D52CF9-EE97-4F2B-A549-2ACF3E431B92-34139-0000DE3305D98BCB��J~Untitled Layer 7d';B5A88CD4-059B-416C-8D3C-29E0248EFCD8-34139-0000E0AF0B615888@�x}�IH[Q�_����`����"�qHU�(�E�Tp@A��b��7.��]H6.*�\W�l�ԅ��(���9�g&_�@O��W�?.	��%wp�Sk�E.9��i.M�:��3&=%)���o>g~�	�u�N��U�x<�z�>X��_�NzJ��?IMI��|�̽Y
n�V�ur���G� ����N��/�sQ�ɑ�5�"�`N8���~��4=6p?�΂QF�Ԗfw�/��2�x�4���]F�ԕ�ꉛ;2�<��dm��]F�4���M0>\��ƺ�q�	�]F�4���K\�)|�$�}���<�#j,��(i���O�v)r��ā��-��(i���f>z�"��^p�a�m��(i�z��:�Gѳ�gx#�2���:o|�|M8$+�"�tQ�!�&�O� ��gxc�2���,���bC8$+�"xc�2������]� 80؋t�^p�x���ˈ�Ɗ���z��c���>tyM�J���streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;37D52CF9-EE97-4F2B-A549-2ACF3E431B92-34139-0000DE3305D98BCB��JLUntitled Layer 6d';6F8BFC21-2EB3-48E7-B6E0-94AE9AF57B08-34139-0000E0ACB5DFA933@�x}�IH[Q�_����`����"�qHU�(�E�Tp@A��b��7.��]H6.*�\W�l�ԅ��(���9�g&_�@O��W�?.	��%wp�Sk�E.9��i.M�:��3&=%)���o>g~�	�u�N��U�x<�z�>X��_�NzJ��?IMI��|�̽Y
n�V�ur���G� ����N��/�sQ�ɑ�5�"�`N8���~��4=6p?�΂QF�Ԗfw�/��2�x�4���]F�ԕ�ꉛ;2�<��dm��]F�4���M0>\��ƺ�q�	�]F�4���K\�)|�$�}���<�#j,��(i���O�v)r��ā��-��(i���f>z�"��^p�a�m��(i�z��:�Gѳ�gx#�2���:o|�|M8$+�"�tQ�!�&�O� ��gxc�2���,���bC8$+�"xc�2������]� 80؋t�^p�x���ˈ�Ɗ���z��c���>tyM�J���streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;37D52CF9-EE97-4F2B-A549-2ACF3E431B92-34139-0000DE3305D98BCB��Nblue-document-zipperd';94E65854-C0A3-43CE-B5A9-193CA1076463-34139-0000E0A9F5D631B6@�x}�IH[Q�_����`����"�qHU�(�E�Tp@A��b��7.��]H6.*�\W�l�ԅ��(���9�g&_�@O��W�?.	��%wp�Sk�E.9��i.M�:��3&=%)���o>g~�	�u�N��U�x<�z�>X��_�NzJ��?IMI��|�̽Y
n�V�ur���G� ����N��/�sQ�ɑ�5�"�`N8���~��4=6p?�΂QF�Ԗfw�/��2�x�4���]F�ԕ�ꉛ;2�<��dm��]F�4���M0>\��ƺ�q�	�]F�4���K\�)|�$�}���<�#j,��(i���O�v)r��ā��-��(i���f>z�"��^p�a�m��(i�z��:�Gѳ�gx#�2���:o|�|M8$+�"�tQ�!�&�O� ��gxc�2���,���bC8$+�"xc�2������]� 80؋t�^p�x���ˈ�Ɗ���z��c���>tyM�J���streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;37D52CF9-EE97-4F2B-A549-2ACF3E431B92-34139-0000DE3305D98BCB����blue-document-flashd';B8FDFB16-BEDA-481A-AA0B-EC14C0FC4102-34139-0000E08C1EBDE397@ux��_H�Q�}��97��$�m�e�MM#$	� ����|�z�`eI���L"S��FF�L)��4���-�ι�5׬���?�t�p/?���{�&�U�J^e4���J�l��S��2�Y��>!�0�u��.s#�ξ`�D�CqA��:�������!(� �C��AVЋ���~����"��3ΦKE��r�lj�(�J'�,s"m�8R��P�����|���qE�c~;�\��הA,���)>�o�R�m����택�T���P.��%�y�H�zh]:��t� �I^''lB㏔e6ʕ��
ya��_�&;�w��b�]x���Ok�g�'�K�}ȳ�K���l�l��dM�T���
�^�ȾH(W��{|�s�(1=4�Bg���\�۰#�|sCB���幗���P��i�c�����MR�FbV�\�BGxy'�.ʵMVcN�i�un��)�܄��k䫨?g��c:�+S8Y�6�S�47~fZ���2����.�!0?����#�u�e	���ʼ�hp!/��-:6�gYB�Tk̷0������`YB�To�?��u0��p��"¼��gl]`YB�t�\��P]�?fYBH		�t��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;37D52CF9-EE97-4F2B-A549-2ACF3E431B92-34139-0000DE3305D98BCB����blue-document-text-imaged';1877DB60-E816-4460-B972-EDE51DEEE0B4-34139-0000E0861C377A66@Ax��[H�q�w�w]d��$�"��bD�B:CQ��(򢠛.�� ���EG1b�4�Vk�ت�÷���t�y�m�mZ��4��E<<�?��S׬i�l]����JWU���}���.�"�M����|܃L̍tTV�����Ғ*�/S��s�� �aCVL��ww0�x��1~�&����K�	�_��B>B2j_�
s獢�h�:��Xў��'�3|0>��������p�A�6\�'�!���	Q�{D<o��<g	th��+���N��uX� �>�������L9K���;+�憑���T܅��C��1��C�֭셳�:�\}��A�ޥ��[F�+Yy��3�-g	t����[��F�+���|M(u,�Gn:�"�ĮM7�aT\����Ф�P��O���@d�%����,!�N�|vƇ�i��)/2ecAsq/9��"�Ԟ�3x�=�L������l�!(�#��ۢ�g	���=g��l��+���q�A���f��7�܋b�)�w��#g	t���N�A���YB�H��
���streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;37D52CF9-EE97-4F2B-A549-2ACF3E431B92-34139-0000DE3305D98BCB���
Sapplication-terminald';FBFD89FC-7050-4E67-8997-4DF17F3B4C29-34139-0000E0600B7D2A44@C@x��MkQ��)��FD"�?�&Z�F��8�Ə?�ILS��,�.�Z"�H A$Y��Z��@,
�_N�k�]�����h4�����v�]�1�+u:���r����X,xx|�|>�t:�d2�d<�7�w�~�~ŏ�_>zb��f������������~�^���������5��.����n��j�pyy	�NǺ8���8�C(B0D �������ss[N'^om������8d�l6C��@�VC�ZE�R���P1A@`gy	��#�'�˔$	c��^�C�4
Ȳ�h�]��$"aH1��>x��x��z��F#\\\@��}7�M<���.Ľ=��<r�8�t
��L^�O;��ҝx<�|>����X�}�*�1(�@�p�W�TD:[������!��"�JAE�#>-D��'PΤq�ˢZ,�T-��@�L]o6�O=���樯QL%qH�o)�TęV�9�LY�e��d:w�݈�<ll��5)�7J�XfY]1�_[[����E﻽��Gq�HF�����F���y�@�
CM�׫t~��z��_|�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;37D52CF9-EE97-4F2B-A549-2ACF3E431B92-34139-0000DE3305D98BCB����
script-phpd';4B50D76C-C380-4B7F-9C44-F1BC0E7CCA19-34139-0000E029DA4EADC1@@x��]HSa�gۈ�ڇ��VJ�}Bޔ�7Q
�����Q��,&�}*YV]$�.�HE�z��JL+��̌)L�[�8�lkn���/���y����C�^[_��ڴX�r��dyt:M����\�l��>�th��m��x5I�l޴Ɣ�p`�PA�ig���T�ekI���lE�ͦ����V�����Z\�N|{�
��Y&�
��M$˳�B���,��V;�:;����n��ΌS���^I�+���|r:�yڃ]�+�y���	*���RK�.�Q���n�K�o�6�"瞤��VU�io6�u<��lj�{6���wZZ�3�rl:�r�WjՍ��Clߥ��|����'0<Ћp�GMpa��Ӟ�L!o0���=n���؏�C�9�߸���Qh4K=�Z-=�[�	���gI"@���^XH �����gI"@��c�yD"Ar�y�b���,�őL2H�8d2�I/6��"�m4�?y?������e�'�0=5�
���</L�ϐ>
�Jr�dyH[S[��y���\.�B9X�Ze�%{H�G")�*)��X�2�x/�"��9��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;37D52CF9-EE97-4F2B-A549-2ACF3E431B92-34139-0000DE3305D98BCB��?�Untitled Layer 5d';4871A4F3-8357-4229-A29B-A40DEFCF3D65-34139-0000E0149A668852@�x���K�`���2�i�Ȉ��Swp����?��]
�a�A<��8���? ���N�"/����S[�ۙ�MӴ]M���!������<�O�B⻒����u��!)��Q���ܧ/��B�e{6�;�_�x��l�O��'cT۶`��g�M�߽N��[�H����>�j�?;�,3̒"dp�Z1Npz��Yf�%EH��nլh�N�<����w7L�?�;�{�fI�(�U�Z��B��[H$���3�x�����iWkV��������XEQϹ�3�x����Dn��z��KH&Q.��w�0K��p8������b���V�{��g�c�YR��r���E
�Z��6��(�Y�|��a�!��6�s�J��9���?�V˰�
�u���K�����m�SSϗ�m�#��ď�-��K�(�M�B�5z^��o��D(�@�r���{2����8�*�`���WI�1I��@����+����$�+�����)��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;37D52CF9-EE97-4F2B-A549-2ACF3E431B92-34139-0000DE3305D98BCB��? Untitled Layer 4d';978681AD-3906-421D-A009-EF9632EEAFD4-34139-0000DFFC4D2F017B@�x���K�`���2�i�Ȉ��Swp����?��]
�a�A<��8���? ���N�"/����S[�ۙ�MӴ]M���!������<�O�B⻒����u��!)��Q���ܧ/��B�e{6�;�_�x��l�O��'cT۶`��g�M�߽N��[�H����>�j�?;�,3̒"dp�Z1Npz��Yf�%EH��nլh�N�<����w7L�?�;�{�fI�(�U�Z��B��[H$���3�x�����iWkV��������XEQϹ�3�x����Dn��z��KH&Q.��w�0K��p8������b���V�{��g�c�YR��r���E
�Z��6��(�Y�|��a�!��6�s�J��9���?�V˰�
�u���K�����m�SSϗ�m�#��ď�-��K�(�M�B�5z^��o��D(�@�r���{2����8�*�`���WI�1I��@����+����$�+�����)��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;37D52CF9-EE97-4F2B-A549-2ACF3E431B92-34139-0000DE3305D98BCB��?�Untitled Layer 3d';AEEEE2D6-0935-40B3-80B2-9D5FD83AE151-34139-0000DFF8EFF6C027@�x���K�`���2�i�Ȉ��Swp����?��]
�a�A<��8���? ���N�"/����S[�ۙ�MӴ]M���!������<�O�B⻒����u��!)��Q���ܧ/��B�e{6�;�_�x��l�O��'cT۶`��g�M�߽N��[�H����>�j�?;�,3̒"dp�Z1Npz��Yf�%EH��nլh�N�<����w7L�?�;�{�fI�(�U�Z��B��[H$���3�x�����iWkV��������XEQϹ�3�x����Dn��z��KH&Q.��w�0K��p8������b���V�{��g�c�YR��r���E
�Z��6��(�Y�|��a�!��6�s�J��9���?�V˰�
�u���K�����m�SSϗ�m�#��ď�-��K�(�M�B�5z^��o��D(�@�r���{2����8�*�`���WI�1I��@����+����$�+�����)��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;37D52CF9-EE97-4F2B-A549-2ACF3E431B92-34139-0000DE3305D98BCB��?�Untitled Layer 2d';1C8CFD11-5BC8-4921-A2C9-BFC435022388-34139-0000DFF5ED5BB5E0@�x���K�`���2�i�Ȉ��Swp����?��]
�a�A<��8���? ���N�"/����S[�ۙ�MӴ]M���!������<�O�B⻒����u��!)��Q���ܧ/��B�e{6�;�_�x��l�O��'cT۶`��g�M�߽N��[�H����>�j�?;�,3̒"dp�Z1Npz��Yf�%EH��nլh�N�<����w7L�?�;�{�fI�(�U�Z��B��[H$���3�x�����iWkV��������XEQϹ�3�x����Dn��z��KH&Q.��w�0K��p8������b���V�{��g�c�YR��r���E
�Z��6��(�Y�|��a�!��6�s�J��9���?�V˰�
�u���K�����m�SSϗ�m�#��ď�-��K�(�M�B�5z^��o��D(�@�r���{2����8�*�`���WI�1I��@����+����$�+�����)��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;37D52CF9-EE97-4F2B-A549-2ACF3E431B92-34139-0000DE3305D98BCB��=�Untitled Layerd';B5E5BCC3-F31B-4396-81FA-126F4627B037-34139-0000DFF29ABF2DAF@�x���K�`���2�i�Ȉ��Swp����?��]
�a�A<��8���? ���N�"/����S[�ۙ�MӴ]M���!������<�O�B⻒����u��!)��Q���ܧ/��B�e{6�;�_�x��l�O��'cT۶`��g�M�߽N��[�H����>�j�?;�,3̒"dp�Z1Npz��Yf�%EH��nլh�N�<����w7L�?�;�{�fI�(�U�Z��B��[H$���3�x�����iWkV��������XEQϹ�3�x����Dn��z��KH&Q.��w�0K��p8������b���V�{��g�c�YR��r���E
�Z��6��(�Y�|��a�!��6�s�J��9���?�V˰�
�u���K�����m�SSϗ�m�#��ď�-��K�(�M�B�5z^��o��D(�@�r���{2����8�*�`���WI�1I��@����+����$�+�����)��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;37D52CF9-EE97-4F2B-A549-2ACF3E431B92-34139-0000DE3305D98BCB��:Xscript-coded';D528B246-64CB-48B6-8888-A691D6D873B7-34139-0000DFE82FD68418@�x���K�`���2�i�Ȉ��Swp����?��]
�a�A<��8���? ���N�"/����S[�ۙ�MӴ]M���!������<�O�B⻒����u��!)��Q���ܧ/��B�e{6�;�_�x��l�O��'cT۶`��g�M�߽N��[�H����>�j�?;�,3̒"dp�Z1Npz��Yf�%EH��nլh�N�<����w7L�?�;�{�fI�(�U�Z��B��[H$���3�x�����iWkV��������XEQϹ�3�x����Dn��z��KH&Q.��w�0K��p8������b���V�{��g�c�YR��r���E
�Z��6��(�Y�|��a�!��6�s�J��9���?�V˰�
�u���K�����m�SSϗ�m�#��ď�-��K�(�M�B�5z^��o��D(�@�r���{2����8�*�`���WI�1I��@����+����$�+�����)��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;37D52CF9-EE97-4F2B-A549-2ACF3E431B92-34139-0000DE3305D98BCB��:�script-coded';DCE88FCA-1ADB-4C55-B4A0-146CFB06E63B-34139-0000DFD44D2BE287@�x���K�`���2�i�Ȉ��Swp����?��]
�a�A<��8���? ���N�"/����S[�ۙ�MӴ]M���!������<�O�B⻒����u��!)��Q���ܧ/��B�e{6�;�_�x��l�O��'cT۶`��g�M�߽N��[�H����>�j�?;�,3̒"dp�Z1Npz��Yf�%EH��nլh�N�<����w7L�?�;�{�fI�(�U�Z��B��[H$���3�x�����iWkV��������XEQϹ�3�x����Dn��z��KH&Q.��w�0K��p8������b���V�{��g�c�YR��r���E
�Z��6��(�Y�|��a�!��6�s�J��9���?�V˰�
�u���K�����m�SSϗ�m�#��ď�-��K�(�M�B�5z^��o��D(�@�r���{2����8�*�`���WI�1I��@����+����$�+�����)��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;37D52CF9-EE97-4F2B-A549-2ACF3E431B92-34139-0000DE3305D98BCB��G&globed';3ABE6755-1173-49C7-87E7-ADB8EE87D090-34139-0000DF64928BD4D5@�xm�yH�a�v��GP���XEX X���䅖G���F�������y4[PyfΣ�"���n6�M��iӶ��Nܷ�~��y���|�?~��%�\ea��f�t�9�0rs�#��K��L��`��i��� �^��c}�vR�dN�j2�LvύH���T���)�G��.᮵�����X0(���t���]0��47ec�8�(���J�K����4_ZY��E�O�UA�cvB�]/L3`�ك�ڛ�S���'+NA̞�����T���
��db�u�Z,NI����*,j�1?����~��	�e���F�e���O	uC��g����s
�����m
������t�#:�s�o��jTC�ˁ���� ��}A ��;��0��Yn$�>���Gt&��N�(�1�
O�=�ҬC�e�,��r��@�CMĉ{��9��L?��΄�inM;fl���tO�2��o��xB�������X��H9�H=�3��ְO.��O��E�(�8��皫;����C�\c�te��Gtf��%7%hӠ�������*�Pi>��c�$�"�-�8Xh�`���[�Gtf�
�����!q�v�x_�����T�BSo�t�Ȟ��D���-�Gts6جtM�8�x#8������uW�k�]�
s��HY4:��h��:��<����*�8��"Q�v��
�OT&
��&��\�MM��#�����ލ�\��:���csv���v:�{�'ؒ0�o���-�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;37D52CF9-EE97-4F2B-A549-2ACF3E431B92-34139-0000DE3305D98BCB����blue-document-officed';0B88DA97-EAD9-47D2-B4AB-BACEBD348E6F-34139-0000DF3786A7F25A@mx��]HSaǽ�;�.��4�$Ȓ
qF)�����
��Ax J)�)"�‹�$�����C"3�n6�t��>�>�>��=�k!��9p���+�/����*
�w���=��O�O��#��|?߰"&�!ꚁ�6-��
�'?/��g����ΞN(��2"�<����!O�m�����ּh8Yضon	��8�1��c(�b��o[I��1��
�|�����
$�ݡ�X�8�n�zޅ�FZjD��:x/��t�*��;n���}��PM���;�:v�¾�tQ'��0�:�\v��ù����[�О�{��^v΃��ҙ�wH�Q�F	�<�X�}��6�ۆ�TY|/W��{H� U�Pk	Bo
b>�G��n��=�Zd!���5T��#-�DT���$��]��6���5���6\�)�#-�D}jg�:�ˮ~���.�����~�p?it��Q��� ��N�Em�}Hż�+K�D���q�\�cҲh�=�,]�^z���3zþ�t�sP=�PקEF�|�%%����'��]3��%p/)Y�7�3.�3�6U�vEV��
/#r`+�������'+?�Oq/)DN�aCSG�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;37D52CF9-EE97-4F2B-A549-2ACF3E431B92-34139-0000DE3305D98BCB����blue-document-pdfd';DD69E198-0D36-4EB6-9C1B-6DA63FDAC3D3-34139-0000DF24AAA0FBA2@�x��[H�a���Ĵ�m I���L�si�R`HF-��3R�/"ꢛ,K�n�PC(*�J2"3�n�\sj꜇y�暦�����{�>��*��9i�
�J�h�����&�p�9��<�CX��m3�5i౶��D�c�.YX&K�L�M�,�R�ҔfH��p��S�`l���;����8R9��@x��V��BXz?d�v�?A��-�}�h~~W�圤ZR9����3!2���?h�;�!4�#D��1cl���Y�2v��ʑ�|�;w!L��QLC\�@���w%����Y�`����RR9�{!Mm���R2�KEftv;�}���~�UGڅ
�Nu�c���'��Н7`l|�����Ĝc�7z����x����˙�[�rv���;NNm���(��!F�Q|B���!���a�}���ۤrB�ϨGQ����R��
V<EPL9Vl�†wނ��wH�l��ʂc+�G�
�?��#(�>���j�ޅa�;�,#Տ٪�?]��,��:O����� \3pM�
��K��$Tn�'�Y��w��5�Y�?
r�j��cɲ����X�?����y�`,�Yx�߱β2���Ql�m`]R�8���(9��OX�" �7�t��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;37D52CF9-EE97-4F2B-A549-2ACF3E431B92-34139-0000DE3305D98BCB��H_filmd';4287CBB1-6C2B-437F-A970-A3C40E157AEA-34139-0000DF0B7C478B03@�x���nQ�y�7�Kcz��J
"�m��X(�@���A���
J�K���ؒh�I�&��r�r�7zѕ|9�d�3P��7W�]��TU}O��a)�A12S㈘�����!pGt���;�}n���:Y/:��6�x�K��dtg�ΊY|A{?�tG'��fj��'0�9$��"�"����F�1��P-�CZC��so 9��U�]&v:�|�~7�E+�F�ۇ^!�O�<���
�M��;g�0����-����4�hg�hd#�hİQ��Wx@��db��Bg�j�N��b�Bσ���n���B�8��Qҍ��}��{�w��/�ʬ�d�v���lO�N�tG���*�ۢ�$2����0�/c�/a��t�Z��f��C2�L���iN�8�t`�_D�{�g���,�sz';pGtsD�F��8�81�qsự�󊎋V�Ty?"�e2e�ͶG�t�pcJ�Q���]�ү����.梨����������/�zC�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;37D52CF9-EE97-4F2B-A549-2ACF3E431B92-34139-0000DE3305D98BCB���
-
music-beam-16d';1FFB0EDF-BEB7-4304-BA21-460EA78D0511-34139-0000DEF3D95AC235@�xc@����e��+��UB9�Y���D��"w����Z����ԯ����@�QW�˪�]�f���Y���`�~nM��ta�E�N;٘Av��J�o@2+�6��?H���k����ߞ�uQ�#�,��	��i�Wa�N�o��i���l�we�屁���X�Af�X��}_�U�O��+������E�x���g�!갿�ԗ~����}u��0N��E��f���6%��q��׽���{�
�?�z���Xl����O���6���|P'��&E���@���OsRԟ����P����ÖZ�S/��L��V��:X_l����ߏ����#�V'��C �ݛ����GZl��ZJ�:p��)�)��/\� ��}���streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;37D52CF9-EE97-4F2B-A549-2ACF3E431B92-34139-0000DE3305D98BCB��6�imaged';D01D764B-05D3-4F17-8BF7-9904CD516B4C-34139-0000DED378FA8684@�x��]H�q��k�n]TTd�4{��^n��4�@2�
�\�A��)D��b�PB�R,j���AITk�ʢ����ε���ϫ.�s���7/��)3��&–��m̲�--ɳ뺆ty3ҕr��mH�*��Z�lE�X�o�G��P����"��%�y5MF�:�{�7.�P;��F��jCy܌��=�-Aa���֪j�����{P�OQ��F����9`�����D}<�0��έ��4��Ԟ��_����ݏ/F����(��7�q��	�v��%�%��EXlk�۰�λ-<{���p���;҉O�3���	P�#��ŎߙqvZ�a�ȧ��8����p9��n�M��F��#����<�G#l��G3�IZ����m�ֱr�ށ�B/�"�}���%�^w��؃�%�F؂�
��?�{��G�{�w�0x���;N��w�\d2Ԇ�a��͝{Rʦ����W��dʩ�?oι��dʩ�څ4�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;37D52CF9-EE97-4F2B-A549-2ACF3E431B92-34139-0000DE3305D98BCB��~�blue-document-textd';B870949D-8C3A-428F-906A-BCB7830D1D24-34139-0000DEB42B147D41@.x��]HSa�w�w]d~$�7}��#�XHBD]X^t�M�D�MA]E��02�4��v��y�N�ù��͹��6�ٴ������2��������y��Z,{�����*7Ԙ�ѱ�՗W�3�(�}X��#Q���
~�{�*+j�^��}�W��$2���A���^��=Pz�6�m�XQG����׊� 2�ѿ�|~ǨK��g�jݿ�����ߊ�}O᱿���k{p�{	t������� ��G�c+�<{	t��%����3r�?>���+������Ag��,-~G|JB,8T�Cu� �|�υ��:�Tw����2���r5����7�i�ϖ��:�\{��dx	ux�Z2�"��w�s*<�7��ٌ�c�zEz���a/!�.i��|z։T�a��ž!7�F6:�ň�v����xt�Õ���.x�N��>L��#z�Am�F+�?(����XJ�?Hx��c�%D����~��\|��My.<[ޏ���K���M
��O���O���52��^�!��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;37D52CF9-EE97-4F2B-A549-2ACF3E431B92-34139-0000DE3305D98BCB��n
�applicationd';B3C032D4-132E-4F16-A7B7-729D4677FCAD-34139-0000DE9ECE3BBF03@%@x���g�`��ޞ�[.Q�H�_ͮ�_f��e��V�R!D$�f�e�4��S
�HIHE�|�?�������i�ZJ�۽P�'2��r<�6�
~�k�a��r� �><σ7���~�/��VdeY�u]��mX��4af���)t]�d2�h4��iPU���F��\��G���ݜN'TU������,q<�"CV����(��9Wd����e�4��N��x8���"C��n?%I��n���(>�q��v��� �О(��"C�1�o6������^��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;37D52CF9-EE97-4F2B-A549-2ACF3E431B92-34139-0000DE3305D98BCB���
blue-documentd';DC77C90A-5C7B-471B-AEA5-1238F7E1FB7E-34139-0000DE575AE40F3C@�x��;H�a��s3h0�.v����T��`HB
"�������%�������$j�,M�L+/�����{):��}�=p��y���Uc�V�Z��TR&�`�M6[Hx@x��L��~�|VHz-�q�e�q=��m��	�;��� �:�����/��d>�q>�P��\܀
à�z!uB�{�g�io�{f4�]Tt5�l��>s���ʢ�0�Y����C��� ���0�t�-��O>[��E�a�[��{}�d��A{�,*�ꆕ\�RA��vKYT&zW��_��B��E�a��i=�tC:�����,*S}�
�3;�C��,*��[��2Q�_N�eQa�k�;����1ʢ�0�k9���:h�_��oJ{���}��|@YTFՊMð��?CYT~ }�K1T�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;37D52CF9-EE97-4F2B-A549-2ACF3E431B92-34139-0000DE3305D98BCB��u
Layer 1d':B49E082D-A1FB-487E-BE17-E16F73A8F48E-7317-000022DE0376C4C3@1x��Qn�PE�K��}�՘��ƿb���K�w�C�+P[%�6������'�<���1�}3��2
UO�P�:���ߧ^��p�I��yT�?�/�g���j����A�"I��G���Q�.qI�������,K��4G�{7Ԙ�s�rK��0Q�t�R�q���՘���s���3Qv�0�ƌs>�WyV���I��!��1�6�u���U%��1��_���3��(v��3��,�V~�������3xp<�ph}��1���k��z�|S��lM���W�Fu{���y�TU���streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;37D52CF9-EE97-4F2B-A549-2ACF3E431B92-34139-0000DE3305D98BCB��{3dird':2FF17678-F87E-4E6E-974D-AEA1452BD260-7317-000022DE0375EFB6@;�x��]H�a�
Zf�
�dwAQ�mt�PT�E7%��"!�i.���u�:0�l�}X�ln*L�,���hQ79�g{�ٴ�w�Ţ�^�q����y��:al��]�`S��Z��j���~��s���vl�-�"��C�fl�O[��Ej�1��M��/:


K�de�*K�d�{e\Y��ݻv�">Ü�NlNt�n|�x��t>�?Aȥ����aO{:�ԤV\��v�㠀1�F(�Բ�S&$��ĈD����W�g�T{�<��L~�[��z�E���		��7���:H$�k��e�:ݷ���Bvel#�ɧ�4b�#d�L��W�w�ƌX25��])��zću���ü�P���h��ozn��61�mClHM4DK4`^�\���j�������6�(
���yq@E���s���\���l٪�2W��{�����Z�����l�
�:��Z�%�}sB�o�_�
p�v�K���3�"�c���9������S�<�MFP���&v��A������5՞K��ݿ��sם>�̱Ѫ��+���f��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;37D52CF9-EE97-4F2B-A549-2ACF3E431B92-34139-0000DE3305D98BCB��mf
dir-openedd':E171E19A-6285-43FA-A545-2E08E088286D-7317-000022DE03753825@&x��]HSa��cW]�����F��	Z�-*hj7}@�lE])��4�؜l�ڪ55��͕-��6g��ZQb$*km;�g�#�ӻ�E%=�㼼�8��T���"{j��
�*{�����TF��><�Ә�c�/���n$�LU��Y"(�W��eޛ�-�)��Z�v��u$�ު�/��a�ӊ�S�D�)W��N�n��8sc]�Mؽ�w����Y䉄K����[&hE�GZ�-0i�70����ݫCl�����
볊vn+�4�㟌RLu� ��o`�����{l���v�k	���X�I>;�t��RlB#�G�e�FuH
���.Jk�E�u_ü��g��ם�h��I|!��"o��4�vE���J�l���NG1O���v4�~����C�=�c��(_�(�y����+G�~ò�O1��&�m9Nrjʡ���)1�Q���"�溿�J�{�1c����H�-<n��L�ž:�����N����GK��I�m���ڊ��H��*��\I�p����}UF��d��ڶ�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;37D52CF9-EE97-4F2B-A549-2ACF3E431B92-34139-0000DE3305D98BCB���
^file_extension_mpegd':006E318C-BD27-431A-AF83-E3B0BFDF3832-7317-000022DE0364379F@8x��MOQ���@�?���Y#cܘY���J[m���UAB��ݸ35�%�R�$��F&��4%��i
ƥ}9g0��҅Orr�����L�f��v�v�����>mZѕAvX�K@^�C^g��>��z����S��
�^�d����Y$�	������X#m;��n��߬��8�6z/\�"�z����]X�K�;��qh�3�iH��+��M���p�a�m�وlċ�@�z�H�+Q/�>�ip>���Z�X���'iS�&��#�Ȇ�'v,
��r�����49��ψ��d�N٤P( �D�
y0y��O�tq�Jg��o.U#��s��"����^�y�݋���[��"��I(��/�tg2�Ol��1tӁ}`~IB�\�?�i(�
���U�_ۣz�SL�煇G񮳆, �c�ۈ�[��yfx�=�)�!���-t�{d���l�:s��=�)�����H
d����c�b�����߈��D|4���>{�SL��HM��d:Wj��۔��Ǿn+��(����mR�
�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;37D52CF9-EE97-4F2B-A549-2ACF3E431B92-34139-0000DE3305D98BCB��K
�file_extension_exed':942D4059-6B5B-4B16-BBC5-36E294E422BD-7317-000022DE0361715A@�x��Kh�A�5��&�;����n�u���nܨm@�֤��u�*4��EC��[��E4ŶI#���.*�Ֆ�9�L)1�\�����\l]p;�
y�+���Q�7�4@Y|f���3����3.P4�y�:�<�סsPz�7�ί�fL&�lg'�S�y⌬��R:H���	{L׌�	��0�� աӸpls�1���2r=-,/�W���4ae"�l��.I&�=|`̢y�G��|O3r�7"ـL�z����M,���G�˅�yW�,�/���Vy�[ֳ0���M������rQ����fc
W[�'�1����W�����v�.��e�f��<��Y4/�����nZ|J��(���Y�˓ϘE�׷�(��w��;��ækڗ'�1���h7*�#��}y���e�����8�����w�˓Ϙe�k+jca̿lg�Ü������ڗ'�1K����[�Y��;k���%���S"��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;37D52CF9-EE97-4F2B-A549-2ACF3E431B92-34139-0000DE3305D98BCB��R�applicationd':9D4AFCE3-1E59-42D2-AB1C-D4C2B0A3214B-7317-000022DE03608265@
�x���J�`F�i�.E/��tv�"��R.A�n�$iuo@�T�djli���=u��9p���9!ͽ����V�%��~��7{>�S�<�=mh��+�|�Q�dM��us�mc[�NkI��A�喒�m%�;�ec[�NsAe�
�vI�(R�5D3e�h�����K�b-B:L���d�a��eʲ��l�6���%�D�x�m���[*��K�@6*v����Z�����G^�5�mKCA��,gP�o
���streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;37D52CF9-EE97-4F2B-A549-2ACF3E431B92-34139-0000DE3305D98BCB��#���Layer 0d':C24D76FC-604F-44DD-ABC9-DE5742197FC4-7317-000022DE035EDBD5@"x�ox�}XU����X���Kl�-��\�1�������^� �hb��{C�"*T���H��׻���!`��=߽7��Y̞�w�̞3�2{�8r�H���q��ْ6z'%��?�={vE*�@�_���̜9�(��W���	�=UC�,,�'.eXRbi���?��!�j(q���DEE�J׎���R��ܧ ,4�a��CC����X���r���q��N/u��� ..V
�c�����CH{)�C��S�z�j�89����HJL������M+@�)�C�Dڦ���LKK�S�))�HH��U�4�H]��.��HW����
W898"%9�V�륞��l��ٙdr����dee�m�=ezH\����U�Vᄛ��L].V�=wvrBFF�
�����g��a���L�<4������n'N��ŕ)�4W����L�;o��L�%K���4�B{{]Xe쉽b��d�����j�q�����p]��˪�p.�f�!���\q]ݗ���8��<ω%�Ȕ(v$��2(W\W}�8��h������+8�M^ҏ�e�c��Nʩ����@�s�z�[��5��_p�w{�PC�\\�����ԛj�����:�;@�/�f�VԶۉ�;���w���_i�R��P�]�ߣ��v��Xtr3[oDK��j(q��e�B�K�B������5����]�FG�g�3O��Q�R�h?��#�O�b�٭��g9>>�M�`�Y��y��C :�_���%	ؐ�@�T���*M���b����\���\݇�W`i|�VD�N��P�/v�Q���[��C�
�|r��]OoBwO](q�;��(W\M�c��o.\�Ƈ�0)!)�b'�l�n��-DG9�����\1��9W�)g�缲��I;�߻�[��'�Wޖ�ɿ���/�V6�{�-�gt	>������a�r�t��j��܏���ۍ��f�ί�Z��K��Roa�
As��e�L/$��A��<9���ɧY�8�`����/�m�ޛz��p_�	N���{�y��j�78��3M;�N�^�	VK�b���oW�7����0Ӵ���z4���I��%��'�e�4 �J>�B�"_��GdE�(�Nj�Ba�/�ϓ_�|�z��d[.���bl�u����zk~��� �k�J��4f���X���c���oC�LJ��ޞUʵ�1K�\K�R�P�%�Y*8Vr�ͻ�Ժ.*��v���mi+eJ�B��4f��R�T˥�s�sL�J���0K�%�`�,[%���O� [���Z�TH�V,ӎe�:o�o)Kʔ��r-it���h�|���-�'6b˨$}�<d(~`��?�~C��ǁ�ᧁ<h0����Øv�7���tN����˔�M��o.^����#�
��Ч�p��F�:�9^k�n�Z��a;���#�������3`8z!�}6�ίF��
d8����OCis	bK�F��v��R�:Y'g#�u:�\g ݞ�a�?�ڈ-%�4){�`ں
�/��\������^8d�j#��`�Q9|8��F��m����oz�8
���Gc谑i4bK�ƍ��^1h�8`_�X7����l�g%ל0h��xAl)1���c0��ζi�d���|��9�?��ԏ��#!��`⸱8w��Qo�Ӱ�t�?hm�{Al)1��	�1v�X9�}7��Yj�'J�ۍ��c訉���Rb�)'�~/�3��ߟeG��dk�o���LRmĖL�<	S'M��I�1n�4�?���8f�45M��Fl)1�w�}{~洩�ѣ����B��e<?����da�<��wx�wx�w���w��:}XH���Q�_XYZ��r���!�����pDFF�)���D����@}4�e���H��Ga�����=�	�p.X/��y�Ԥ8�{�����I����.����1�LK�21�ή��}�n�-P����gjj�������6�R�)��ca*�s$��4�R�>55U���d�!6>����g��(`Z�N��p�s���(Z�di����td�9���]���\"FP?<0
х#�����4����ONN�J >���b�#���j8�Ǘj(���v=Aن_}#s'?Z���.7���ȇ$�ou��{IxW�㎺.cJ�aoo�S��hjv_���Wkn�d�x����/�YȚH�F�S�ÿ�c�M��L�դ\V�6$�\W~�C��EҴ@��u�z�?U.�J�������8��L�#ɜ�	D><��?T����v
"�Dd�iD�Q����FNv*�t�0\�j��g��E^$���<S��v�Z��������c�� .�
�R��A�1��I��	�אv����ϴ���z
Ğ2=$.H��K�+�L�P){�� 9&��@I� Ğ2=$.HO#�Ɉ(�a�*\p�w�z�ᯔt�Ğ2=\Vԁ@l��ɸ��L�|��S���I]���N�+��a>J��Ğ2=�d���S�����I��+�0J�؉�b����b�/�~���ĬYo�~��:�?{��Ŋ���ܧ@֋�n�(q����`��E�b2n1�{)���/�^�u�F��ZJp���}���1ʕ.[����c,���_m\P�J~�}�JU
篦�5c~ʙ���TL:r�?Ѝ���7A�R��R�B�˺1/������߷o��	I���p��e+�hѢ�nC��{�(�=2�M���7�z��>hh޴�V�L�^/kG�r�<��|��rua�!̚�j?D�R����QB aJjm�Y���y�rmG�C����k�G֎��</��#���K� �e��Ҋi:l�GZ��3Կ���MY(s� (��0u�cp(�Ї0�)4|���~�M��܋=�S��0��&�:C�HGe�,L�&�6��Q�L��GN��4&��R���!f������..+�k��{EE�^�a����ngv�h��{=ά��!��m�Z�&�e\B���x��/Xb�|WV����-��a�!�}���p�|��`w���\^��fPB����)���ÿ��jR��)��r'c.s�{��B�hG�󙍉�����|zi�����!S�+���vt@��돍�7�/��&�F�({4}�%�l�S���P�vb�EW̦�r�aq��S������JGn�6���q���%l7~�8�G� q_#,v닒ז�u�+n�U�zi*��x�� �y*&��D�Qj�B	�
%�n�uF�ƈ�^�m��j�=\\_�'� �&d�X��k�$�A�>H���0�g*,Z��� dgԿ2^�j��3�LzD�B��H??	)�#�$�C����2X?��D���x��Y��b8����w^V-cÕ)8qa�z"��h�D[�zCǀ�<S�q�� tG<�\�ay�ʕ�����1"m�B��N���0��z˘�߇�'B��0��`,q�^,��޷�������Zx|�9ߙ��s�6;�
���"��5��~���ߡ��0�޸`VK�^�TѪA�i�qo}<;�O�7��}��G
��:��������ᷲ2>�=eyQV�pg���VwwV���+!p[Yl+��}��]���,���fzߊ�v�jg����skk���pbY��ٽ�[K>)v���W+Rl5J\��!�S��W��~~�jZ;�~)���GFF"2*
���d"�LJ�b!�~)���A�\�����l$��)��KLFL��LYF�<�q{��<pp�@�-'�\P���;�}�Ǹ��)�OHD|b��㩦���@�{��w���8��!��w��}�4�Ҳy.7#��,�YbYS��Nn�7�#��pY�A���1�:�_Cm�o�i�v�uyla;5ػ�����5��-��b,���UmX2x!Z�cf����N8���p�@��	.k�����0��̙e���@8O+G������J�Ղ���C���/4r�_ACqf�Ljy~�<�x��_�0�>V+�S;g7����*������xvd�V��%����	�	�h�W88�J�H�V��s�c��_��ׯU�Z�������쵹��v066>KY^��O�ߡ��~�ŝ_�{o/xm��K��Ÿ�����p3)w�ʨV��A_��T�,��%?�W#�b���գ�|�����.���<��2[O����?�p��o���ᳯs92��������枾�iQx����?���+Y\���bs9�R���IJ������?+~�KB������uT�g$� =1I:ʵ܇������9Qb���ϋ|t
�i�H�DVr �����e�{�#:��%��m����>CF|뺃��n�J�[��UY�Z>���M��J>�:�
�Gw����Y�N^�Թ�6H�5��4�4n�D�o�-�G9d}P��
�v�����.��ܤ+�U�{�〃�@떷�2N���e9����OP��}���@��w��]X�k"Ѹ�5�u��/��ĉ���5k��$s��X$�;�p��ƚ�Jbd��q�k������M�U���=c?b	�Q�a F��]�^��O��N5u�>P�ƭڵ�.�oS�B��2�V��	�2\����F�?
�t�Ѥy�Q��IA�f�0s��NK
J�r��m{�[�h�m�]�-�&;����`˖��]]����)64-��:<�3f��O�@�?�3�/��)C�		������2$_ k��ܼyC-C(��2=$.�=������{�� �k��Q ���!q��;�����~zcN���U^������)����_����Y�C��}A�S��e�A�k����߹�������@�ž ���z


�b����c�S��̙�$e�����jڛrR��'9�*:��?�������Nϟ���m(�C�S ϛ�4J\��g��y���Ȟ�@�7���(�ί�����I˺_=M��*T�s�3�̡������3&:�V�R374��a�R�W/�^���Z��������1��h[M/�
c��eɎ��_жG��x�uE)���Ca��z�P>�]~H@ӎ���2����CALOOen�<�P�q8�w�A�f!(��O��w��y����yn�D�o�ѬC:�':��B����?h�8S�ll9�buBP�u��v�2w^��3�i�Zmb0aq���_�7�B搴C�E���
Ν�X+������ƥ�1o�L��)�򦬫���~���o�?`o��#9%�W�1�x����Wб�=�Wt����`��XH��oi�xJ����-e�^�ަ@��*�Yy������ͣiU�^|T~&$�r��7�X��HW��k�z�S���J��x���*Ebp�8{�X�z�Sy)g�rr�p�'U�h��&&����Wi�3x�|���c�X��Á���^,�K%�J�h^=�+_{��5���Y�ޕ�
JZ׉a���9��m��B��{����1��������F�O�Q��^�$���<���H�md����i�P�C��)���Ͱ��?��wn'�1���������.]�e˖�S�o�R�����ߋuӛ��B��>�@ΏD�D�툌��[�J�'�#*2\=�!�{7���j?��A��'~/.&
��q�ߺN;���r��6��+a��½�/�O�YI�h���y��WPFh�;`��zR�BӋ�KL���O@���aƝ�):�	�.�ǃ���V�
M/�.%��.+	���� ��BU�~��rƾy�zhz�yi�y�IU�7�������~';�zhz�{�i�y9�x�>��������~(��s��U�FJUhz��ܬL��d�|8�\����nS�Ǜ�_����r��&��e����)����R�;��ؽ�y��܋F�NN�p�T�$<�q�ϫs�F
�c!i�ğ��)�*��5˵�k���?�}j���,�+��Z��?�ё���@�<�j�N��g!�d��!cU��?a4�5��ZUTj싪]�ְ44Iǩ��g�^������lonV*6��;�����{�e����4�~0'U;�ō��f�qI���=9�;}'�+��(�F��M4��?���I@��!8���x\�3�L_ބ@�/B6+�Ӻ�ޤ��i����Pg1��g^�wj��sB*�Y�A��	|)�=�V�5��?�id6�15eM�����C殰���'�?����I�r1
����Q:���z��K��[�����1.�'�O#$�g�R�օfOs`}����m��l���^ł}�}rp��EL�c�n.k�~g�B���g,Qj�x(�S�\��E&�����?~���	���S�KK��׭5�i���UXZY��Q�x~��E�2�y�g$שr%53�9��w?_�>�����ᙑT\�:VC��C��v�����0�,�L����oj�OH���œ��8��:W�75&%%!�.�z���{���[�:�#$G���3���ojL���U�V��آ�~����C�C/،ҥ;L-�׋�Ԙ���z,�o��q���Um�8�"<LZ��L�Y�������333�)���g���i�W^-+1$��,wBIu��Ϝ���b�G���h~��D/s�0X����`?�L��SΜػ��Ѽ7�'��}��C��������Bo�?�%�����z��O(q�����/ez�x�/SSd���������
�Wt4�b�M&�H�d�����^��Ƅ�x�fBYP����0�b�	J��E�u�r4��-�ɉ�\neSWO|��ď��P�6�[�5xr�WX�O��-�)��Ȧ(?Fk�i�x|�W������/E+�G������e�,m�N.��+J���k���V��B~����X���,�y�ʮ�
��vBU�"m��_<$�j�����
��c��+��Go,���̾V�!s�0(�
��l�"��PԴ5��j�b+[c�Uy{�چ�����-\�7L=�N�\:���9��Z�XbU[TX���,mx[�U��P���m�/$$�d�=���oL������֔�!�)'~O}��EbL(S��{�Ͽ�|�u<�p�5(�Cƫ@�RGJBz����c���?Ԛt5'���u&��ь��t�U4�r^���_|l�������2��Y*#�	Y�$c���ٜ��|���Ͼ�	jݢ�?��Oֱ�to|��M�]�9�X��_��'T�}��Zu���o8����5��vK��բ�8�O�ԋ�����O��cX����Pw�5|f|-�ݢ>ޠ~�yŒ�4�2���>
�o3n�f���f�^�5���I�Gg_e���hn����1M_�{�CD�����rIB�!Է�5�����t�kI�MW�2w
B����gG�RB�v����_~�'�:<������̺���#?�^�6�y�o�~�W1y����n�,�oV��HK���o0�B۶m������O>I�w*�>�D�b�`cc#�עq�С�
�VQ��+W�'�����ѣ�^a6�S�|�7ҷ'���Ê)"��&&&�:u��?���J�z%F���[�n�v;�kz�̙+nnn��&�gõbA�~v(��[������]�U�V�����,Xp�y�D�~�ХK�1��ٳ�Lz+ԬY3�}���Xͨ�~(�ϱ(/�6l�����F�[1�"/���(U�FY�v{�[���f!>�;9���V{��%�0����G���[�O/�~s�>�e�[������=�b�hU(Jh�}l���f�e~�E��'P.��*qr%�~ͷѬP|z`vz��S�ʅ���,{��3J
G�+;P�{�M�3hV(jr/�`�.�s����ԧ�d�'���%([��f����I(s�֨[T�7��=`gL�Ks�C_�/1���K���ܖ����W<נ���Ӭp�*�;�s��g��{�����E*^�Ptې\�v�޴z5ZT�_dE�0�f&��Ӹ_<E��4�2��o���[)M*�+���E��	�ʌ;f�	���pw�uws��%�ٯCщ��Yܺq
W�Wp��\��%]��BQ�F͎�\�����T�T��p	�?+r�G���:ҬPԮ�~��a��,��d�8ݒ��-��Ƶz���2�PT�f⯣�{`�:���N3/�y��]���[s4u�.OT�2ڌf��� ̹��;�?���];�}%�~5�ng��^9:�໘84��m>Ygm˪��JV}���'���^�o���=���c�7p
�']�Өn�!�����[�4+�l���~���D�҆�P~\����E��W2Zl��J}���h[�:,�¾G��v�ϭȰ�Uhn��Y�ͷ\}e��.rJ��P�x�*���j�l��8��8�ӬpT�=@��p�R������)q]�Gh��������P����t;T�˩ܢ�Y����L~#�ml���l��
�ip����V)����.R��~-�����5}���@�_�P��O��ZH���S�KT3���3��(����q{�����d,�MB���~-�4����KY���K"Qd| ����.Ro�1��e_�}*m����VQ���B{�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;37D52CF9-EE97-4F2B-A549-2ACF3E431B92-34139-0000DE3305D98BCB��MASKSPREVIEWs@_@x�T���M�$Q�k��Q�h�&���K�=�%�D�]#���XP�APD,bG���P@+b�Ы���u�(�������3sf��73ǵfg��D-T���Z�Su���J�S�im�\�
d޿��H���Ը0���t��+XSݬL})�=ZԞ�������{Q>��sGp+�0Ž8� �XW�B��Ģ�g�:��/�����پ��wk�M,:z��;5+)�q!��q�\X+}�ԛ���
���A?kŢ��g������b{�V,:�}wAv�U��	/��kŢcP��f�!��b{�޲V,:�~�:G�i�#�� ����.�I�����)��#���Q���?=!����a�Xt�����HO��o1=�c�Xt���ĉ����b{�;�Z��ԫ����x��s�$ה����ߏ��8�V,:�i��nj����#֊E�P(
��I��j�^=y��e�,��iɘ�N+-��^4��-U�ު)%��{���HpA��R}��w�6b�e�]�z��{�t��eߨZ���˿Y�U�2UK��j�k�[rD�5�;�N����"���OlC���X�e9���s�]�f��Ɋq�ɺ���m�DǺ�
�6"���V�V#�{2�W"���:���D���G�[�4�p���<ߍH����<�!��2���=��:U��%��0��㗔�S��iGW�ȶH\y���w����8����L�H=��ҿP�~�K��3�m�4ٖ!=B7�h��f��~�)����lDKa8$�T�gS��A�������X�_��/�C�ߐ�w��h�Aq�(��gm�"�X��5�
���'�,@��������=?#Ez��h��87)y�|$�H�TI"��B�N4�:�JN�1T��k2~���?!Y�qN�k�O)�[xZGM��2��QKu�W�>kT{�e�'�m�������%un���ol�O�ժTn��R(
�B�P��G��v��{�~�8w��c�-��kٷ�\�\\?�ɀHw�ێ�'�Vd�u�E?�-?|�C�6M�ujѸח-��ҺI�Ο~���%���e�_R
N�!��jd�g�}� �S��}�v�w�k�ה}�I���n�bՈ�a��*��	�Ll8�	�H=#^�$��H;!���Zd��C��=�to�����>���G�/m�J�s�����!5xE@N�3r���r�䟭"�A��(��^�\ڃ[Vbv.L�\n����"�o�[#K�&oj��l5�_�\�5X�}��s/��rYr
���e�8�H�I�X�&������0p�8����2�Ar�a��3�r��a\f9)��ę%c6Lж%��[2�&��Q�{~�m��E��b/q����{n�q{�T$I.H�>�z Jp��{N��t\�X5�
�߄�y����"q���SyIn��0�C��b����M��~h��S�1�?9R�����wXǦ��U�P(
�B�(S�L��5k�W��ŋ��"�gg�+W� :&���GHH���??���zX�YD��i�z�ԩc���
///xzz����8p�<<<���WWW�ܹ...ضm�l����C�ϱ��_�޺u������_H��+�.77���/$z�U�ք��,������W�ᤴ�4$''��衷F�S^H��[�Z�iIII�s���z�T�2����{!�C����\���ݻ/$z�}���ǔ,Y�"z�;�P(
�B�?���Q8�#��zo�E�=�u�υ�b�9��q;�$⣎#.�n^��8�g�XtpN�?����?���#���;�̾u�5e�XtpN�ܽrw.���8��Fl��v_X+��ya��8wfg�8B
�����e�XtpN�*<�����9�?��q1��"��#�Amagvi��w��b�9�'�
BB\��q�]p�����8�!{q=��B��n��c����_�P(
�B����o�hެ���"z�}\����K�q�w,
!gMW�톜�=���/r�}��̓��},r],�'?���n��ަ��G��u��\��R�yg6"��B�y���ـ<��a?
��ѝHy��z?jRwb~~6N�_&�f/�O ��qYǣ�e���"?�����ѽh<�z�mҸ����t���oύ�?��.��� �6
�n��pɠ��?�=%''m5A��c���غ�'}\{�8�‘~��Oof2��
z�}�Q�iY�ѿǻ��=��>Ӿk�ySͱx~o�Y���x���#������x}��ۨa���޲6O����n�^�G���? R~�-N~�+)x+2c�"�=8z�mРڬ�{:�ۂ�8�dNٍC��T\��!7,ƃc��q���A�u�T�)';i�w^H��kfVjL�*e��+�
�B�P(�����e�������_�WJ���ީ���|~n�`�$��"��y��ۥ�`^c��W��w8���O�b�94�����̎��|�eS�5�]+��O%ssW�n�Q�~��
�3�f~Q�K�g��%��[�ƴ���kI�������F���������4#˹�S�ɲm]����ݟ�ԣ�O��M�JN��eP�΁�9nC��:0_6?���:�����>�?�~ӑq|"ί�+��I��.:��iMSo9�E�SDٙcX��d�3��3P��Ҹ�[��O�� �g�Je����:��.�ޖ>����P�=��i����=Y�?��|~�X�=	�vms/\����~����{~Oұ�?�T3uŀZ����
�B�P(�Ƌ���<�XK����f���9�u�eW���,
�a���+�b��>��Z�0��H{C���~N�R��n�����\5���"�RFVH�}���k����Oz�n]�͋�n\f�����Q�
��"��l��v?�k�x�΃��
��g�C`�]��XKY=s�L�<�go��ʸ���:�t݁c���o�t�5��#3kM�hM���s]#�k9�\�ጣ5�o��	��8l7�7ͧ�������ӧO�/�c͛7��j׮}Q>�<ENJj׋�l*�O��B��[�連����+p�D�/���)QXK��6m{���a����c��?(t�,���ڋ�8�?��6�ÅMs��JS��❍��?�5"�"q��e������s�~@����f	������w^�՚��K��.��3"�f���i�\?�\��M�;-?�v� �a"�RF�M�<��,�^��
W�X�\m�R�탛p��Y�������#6"��{�)�ңP(
�B�E�)�?pl+��q���^[t=8�kŢ�sB8$��	��\�oܸ�q��Z�����َK�����f�>�!��Z횲V,:8'�s��8ׁ�%x=8�k2�r�^�V,:8'��Z����zo(Z��j=8��e�XtpN�:4�2_��a��T������z����SlQ�:��}�7��%H~s�靈8��G�6o�v������G<d��1\t�Ո��ۍ��C�>wa����B�P(
��Q����*��E�O�D���I*7�E�}P��~��=�?+C��j�pTk��m.�Z�HTmqU�����מݙ�2������P�E�F�(����!L�p��ه�9��i����qs �~z��G "2�~�F��O�B��0�`w���GGP��i9�/���1�d@��g��n(��Y�CxMM3D���=������ض�6��w?3慠l]��}1���ߡ���\�m������O=`��3�5t�[��r���i�(�p�ԉm+TC'��vܲ
6��wl�b��d�(Y�����q֊�~��o�[)Z�I��b��W2�ݍ=�,C���*C(
�B�P�����+!��˹��L��缋ڳ2������g�+�������c��U�e��s`�<�]�g�+H�	�r�Q���J�w���LE�I�ev:�i&�-����z�s1�V�{62M\��]��_ ��v�/pvF/m�s��4X	�_юKo�E�q��]��$�9_\<Z;��55�A�q�Nb��#�V�|*�הف=x_L������!I�{"	`��l,��١6Ȕ����{k�?���K�	ZB/�5Y)w��O�b%4^��8�Ko���ف=��?:�~^�
��L@��O�r��#[暧'��wJ��X+�B�P(����^y��g��iv�����Ξ��ys����R�T��{��U�7��upQ��]��ў��e�ܚpĺk(����T-�j�e��y:M��t��R."9�I睑u?9򻜲��⑥wX�E���K�~�T�o���g� ��i<R�1��u/y��(H�����8��.��{���K���,���I��&R�]q��r�<.<���"搵lwã�G�wk�4��O�%�5}k��5��/:����<
1���u�~�f"t�%��EV��x�Wݧ�Ě�����e=o쟛��W�#lSO�C��!x]o�I��EH96A�z����8�nP.}b/1��[�G�:��:~��d�EG���̻脳�d}�9.���8�f6G�m�Y�u}b/1��7��Y�-�������u��廸��ðsMk�\����42�>���ި�]S[΋/t�[�%�V�#ܮ��s��^��;�}/�����=
�D�ʯu]ܧ��h�d��
=k���p�q0b7D�&�K̑��U�^�O�%^�W�R#Z�u><�eB��no�;;���I��6E[�sԚo�w�
~+{%��>�kTz��z��+{��j���:��B��H>����c�ix��.U�X/6��|���/*:;�� �⚁�{{��ZP�%?;�m������d�Z��Z����ׯ�]ٿz �����/e
�B�P(�_�v����w�Z<��x�Tu�iT�^������}�(�Xݺu#��N-�V��b�h�a�����v�P�Qnn&N��\�2��1�7zۂ�S���+Ŋ5�����W�HM���KŊ5���zu+Z�޹S�X�Z��U������1�X���b�Q����ܿ��@,Z�׮Fh�:�qkX+�+����H��(̙3�OCR�-M\�6�c
kŢ�B��-��ػ�U���f����t�6�c
kŢ�|�W�����]��ѣq��Q��I���m��֊EGٲ�|������T���`��R]׹��X�Z��([��)))	���x�����C�[�dd���kLCvv�����<E,�y�՗>07o�z.�$�B}��1a�q����D��$�w�_�?M��(W��b�o��
k�^��\ ?�W��̛;�T�R��,V�W^y���٫��W�J��Ml
�B�P(�����3�3��un�>ְV,:�)�%[0c0k0s��۸�5��f
�[ff
ff����}�a�Xt0S0[0c0k0s0{P\�6�c
kŢ��B��B�P(�*���Œ¬����Bq�۸�5��f�l�&�(�*�,��6�c
kŢ������Y���م�:�qkX+�$�&�(�*�,�.׹��X�Z��`&Q�E�P(
���P�A�ffff����}�a�Xt0dK6`F`V`f0�qkX+�����
��׹��X�Z��`&`6`F`V`f`v���m��֊E3��
�B�P(�YT�P���Y���ك�:�qkX+�ْ-�1�5�9L�m��֊E3�-3�3��un�>ְV,:�)�-�1�5�9�=(�s����b�L��B�P(
�?eʔ�W�f�A��ճx�S����q��D�� 22a��		A@@������@�9Y8���`8m�Ao�:u,������OOO>|��������ꊝ;w���۶m���-ppp���=d�˸V�Z�G�����+t��
]�vE�.]йsgt��	�۷G�-Ѷuk|Ѷ->�%�u��O_pp0lll0u�TL�4	���3fF��>�{�˿����Wo�=����&=���c2~r���ְ����Q�0t�P�������=0�Oo��
z��U�����ɓ����r����l�2���=��ѷ{w����ØAa9l��Z��5�d.5����ȑ#�qp<<'���о}0J�9n�L9?����h�ݢF�S���K6D߾}�S��G��z�ˆo�c��A�n�0L�v�����,0T�B�jզu�����Go�N<�W2ޡ���ہ0^�9Q�9e�n13�K
���W�ReF���ϥ��b�`|?b8&�c�hS�fffsy���m׮����G?�1�W/�s"�f���cTo�_�dɩ����Y��WD��A�P(
����C���;���;�����m��֊E�id˻
�����0�qkX+|��{�w|�w|�Aq�۸�5����ໍ�L���8��
�B�P(�����ժ���M���y82o:�~���v��#�셹è'�G��5��O���o�������<�'j�è'�U߯�/8;"j�N��}�n���������[�̸�����-]�|'�.�ԓ�c�y���M�錳kmuKnw�3M�F=�?�V,��n��?ׂ̈́Y��ώ�"���A�zZ����m��,j����v��Ü�wR���Q��?�7�kX+���ʼn5��f
�?
�B�P(���S�a�`�`�(N�a�Xt0S0[0c'ְV,:�)�-�1�kX+���ʼn5��f
ff���;�����m��֊E3��q�]�y0oP\�6�c
k��"[��q�]������X�Z��`���;���;�
����}�a�Xt0S0[0c�]�y���un�>ְV,:�)T�P(
�B���ѲA��>�5ΨV
��ςK~�����=���ږ��ȼ	�w#�q�Fp^�)7Cq��+XSݬL})�=ZԞ�������y9�sn�F�d��jT(�Xt�lYgrV�e<������ի�?���l_�X�5�&�Zם������>�w¼�υ�b�ѷM�Y��^�A?ϝ�{Q>�{��Z����;s�şr;T�A/�����qa`�Xtl����H������e^c���`�Xtj���l�5�޽���������_4�������s�0��|
֊E��
��\Gڃ�b{�;�Z��թ�j����F��\�=2�;�Z�������7��(��bz�;�Z��׭��I�Z��x.����V,:&�j~(?=�A�\�=x_xo���K�kŢ���k�k��^zi)�O��bQ(
�B��[Q�C�>�>+{�z{�޲V,:�)T�P�C�P(
��yQ�C�>�>+{�z{�޲V,:�)T�P�C�P(
��?��/*��9��Y�؃��؃���b�L���/
�B�P(��x2C<M/�!����]>3S��ejX.���YT�4H�*��rs_T����z�ڳ��2k��G��Ѩ��2���D��Q�����Q��~�ٝ�(�Q��)��9�2�WԹ_����*6=
�ݵgw��8x.�����é��.�>r\9�W��$*49�vk����f��A�f�aHy��c��ڒ��>tC�F�ڳ����i����^���<�|9f��[��v�m�=�{�f������x�V�x�e}v��®=q(��o��N{v7��5��n�:Q�m�j�$rԎ[��f������n��d�(Y�����q֊�~��o�[)Z�I��gwc���O>�{�H�xZ������"B��2ij�Z�(���%����img/src/editor-icons.xcf000064400000033652151215013440011215 0ustar00gimp xcf file�B�B�=G
gimp-commentCreated with GIMPgimp-image-grid(style solid)
(fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000))
(bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000))
(xspacing 10.000000)
(yspacing 10.000000)
(spacing-unit inches)
(xoffset 0.000000)
(yoffset 0.000000)
(offset-unit inches)
�Z	
�s����$p(]+\.�2�6{edit_ckeditor.png�	

����m`SRlle^WSS�q�ubgfhaXSRQSS�hd�bs�Ubi�lQPSS�rh_t�cN��4�MOSS�n_|gUo[b��VNN��RkJZ�T�}Mb�NLNN�dx{~eE��SE�IKNN�pL_VUR�U�I�AKNN�pjt�TRJ��t}wIJN�pcU�ORQ�s�<�HGN�p]W�IQPH�S��CFN�pYT~yPNMY_�@GENSS�H�IE��^GFE6RR�P���w?EGFECCPP�OMHKJIHGGO�MLLMM�����������������������������ʵ�̻���̿�������ŵ���ٻ�����ͿIJ�����뻵��ι�����ҽ�Ӳ�������±��佳ޮ����ε������ާ���������»���ľ�������������٢������潽����̝�������͹����ۜ������൯��٭�����������������������������������������������������������������������������������������������������؏���������������������������������������������������������������������������������������������������������������������������������������������������������������T���h��������� ��	��n�h�	�����
����	��?���	����;�	�����	���	��[�c�	�����	�����	��������H�I���և;���Xedit_ckeditor5.png�	

)9��	�����������������������������������������������������������������	��DD	DDD��DD��LDDD��DD��DDD�DD��DD�DDD��DD�DDD�DD��DD��DDD�O�DD���DDDD	DD��	�����������������������������������������������������������������	����	��
�
�
�
�
�
�
�
���	��edit_zohooffice.png�	

 
	�	�	���	�����<,����aI,���aI,���aI,���aI,����aI,�I�_�_I<�px�0���i�B��<�i���	i�B	
�L	L�KdXJLL�LKMT�}PKLL�Jd�Q�D}�lKLLLd�s�Q�DKM��\MJ��s�Q�DKK�g�LJ��s�Q�DKK�g�LJ��s�Q�DKK�g�LJ��s�M��KK�g�LJ��t�MK��Jg�LJ��K��GQ��LLd��KP��G[�_LLLM��D[��JJLL�LKT��JTKLL�JdgKLLLY	Y�UYYY�XAUVYYY�UFXBZVTWYY�YUQSHXBZYYVT[YYLOSHXBZYY�^kYYLOSHXBZYY�^jYYLOSHXBZYY�^jYYLOSHYAFYY�^jYYLOSDYYOALY^jYYLOYQAJZXIBXjYYUBFYYJBPZWDXYYY�QAJZWFDYYY�XJBQYXYYYUY	Y���%�������X���Z�"����+����
����
����
����
����
����
����
��������N���N���������"edit_tuiimgedit.png�	

0
�
�
�����������������	����������������������۽����������ۻ���������۽�빷����������������ǹ������ǻ���������÷����������	����������������;�.;;�!�!..;�.�	��.;;�!�!..�!�.;;�.�.A�A;;�.�.;;�.�.���;4;.�.;;�.�.A�A`�4.�.;;�.�.;;`���.�.;;�.�.;`�`4̿�.;;�.�.`�`;;4�.;;�.�S�S..�!�!;;�.�	��.;;.�!�!;;�.;;tinymce-16x16.png�	

@=����������	����������������~�è�����~�����������g��k�������{��������{�������|�����}����~�	������������ï��	�¯���¯����¯������ðδ�������̬�������͜�̬�������íδ�����®������®����®��	�í�������������	�������������������������������������������������������������������������������	����������
�������������������������������������
��edit_tinymce.png�	

@,@P�!""!
"!
"!"�#��""!"�#�4=�""!"�#�4""=�""!"�#�40UU#=�""!�"#�4"UU�M"=�z"!!"��""UU�M"/�&"!!",<�"0UU#0�%""!!""�;�""�0�%""!"�;�"0�%""!"�;��%""!"�6$""!
"!
"!�uvvu
vu
vuv���vvuv�����vvuv���vv��vvuv���~��v��vvuv���v���v�ƪvuuv��vv���v~�xvuuv|��v~��v~�wvvuuvv���vv�~�wvvuv���v~�wvvuv����wvvuv��wvvu
vu
vu�����
��
����������������������������������������������������������������������������������������������������������������
��
�����
��
��
��
��
��
��
��
��
��
��
��
��
��
��
��edit_simplemde.png�	

P
g{�#�����������������������������������������������������������������������������"�#�����������������������������������������������������������������"�#a�����aa��a���aa��a�aa��a�aa��a�aa��a������aa�����a�aa��a�aa��a�aa��a�aa����a�aa����a"aedit_aceeditor.png�	

`���5�NJHMHn�mFFQ�M^^]]�^CCL�ZeeTO�TTSL?KQQM\\�^`�uUw`^g[PP<QSVV����U`��SOCK�����[�]��R�KH��\\�ֆ�^�MNH

LT[ckople]VN



�BORSSRPF/5�NIHMG�����eeQ�M������CCL������񆆅zYKQQM�������������P<������ߊ����}Cx���������ᄪxu��������~u

}�����������		

�]uxxwxvd/5�NHGMG�Ԉ�Q�M�����BBL�������װxKQQM������������P<������������C���������̮�������º�

�������		

�kvv�p/5�����	�������������������ُ���������������������
����a����М0edit_pixlrexpress.png�	

p	����a����P��ߏi������E����ї�����P�i��f���ӓ��:��w�����e��m�������홹�>���������Ř�n�����tR���Вځ������q]>���Ց������qz{�ij����hQ�ԇ�Bm�����lȿ6���(Om~���t��B�ьHTr��p��*�I�Ӿ�����?��9�����θ�-w�oAhyxe9]�v����e��ߟ}������U�����~���b�|���bS���K��d����ib��w��[�ƚ��eЎ��N������}��Ϡ��|�����yclϹ��쎷�����P>�е��싛������{�������tb�җ��ɥ���s��B������՟��s��R�ܐ����}s���5�W�߻������J��G������Ə4��zLu��pDg�����Ȱ~����������k����ۙ�����n���9F���t�شb��<���λ���֜���<��ϲ���ۗ��\���������Һ��|����z`���ǑΈ����O@���Ƒυ������㑚��˵��qv�ї�����ſы��E���������ϖ�܄a�␞��ݪ���7�c�⸚����ޣI��P�����ѻ�4��Ou��mCb�2����8�%�����3A��������Y*���������;���������7�������Q�����������������Ӿ�������Ԛ��������D��	����_���������@�������Kl����������sH�������I�	_��׻`	edit_pixlreditor.png�	

� J ^ n����E��
(��,.!'O>��& ME-|�)J�s *Wn�W*$ա�%%21Q`X(��- #$3$u�_?9=2�8
4H&7*�y		
*.+��


��

	
��b����e�i
���)#�;��/HX1��	@pWYCU"�XBc����:��[�t"Xz�΂&�؊Yk�!-Z{~��wɪ���@y EZmY\"I����Y".Tb�$6vZ�m9"P��ϕA���JH-[���C`�RwM,^an��g`cK);X�<�qKoL3�LK��R8)ń�]�E�0'�" �.'�@�%B_"[M#+K[�n%h\x4H>_�ˤ��:��sE'J6z��ݍ)����V>0F����� `����B3[2^n��{7���J0Am���%8��X0855u����I .gnB2}���m �?M�r"?p���*J�~a8W~�Q,3z�pI�$og�T-{U"@
�V�s�&8<�$(0&����ӆ*��75��3n���o��m����%e�����)Z�����.���Vu�����G�������:�������������zj�����������#a�����������+0�����D����������k�����\������NBM��(sD��9�'edit_onlineconvert.png�	

�%/%C%S����������������ЙP=BGFETW\`eik�ϖ.,06:>CFyϖ1 #78)DHzϖ1 !-$)FHzϖ1 %;FJ{ϖ1&3KLNN|ϖ1/E+DQPPN|ϖ/:OM7QPPN|ϖ38PQ)-OPPN|ϕHNQB.R3JPPN|ϙ]OQ%MQD
GQQO|ϚbQK9RRJ
;LCB{ϚU2.'-UΙA!!  !"]Ο��������������Є���������������ѡ��������������ѡ����u��������ѡ����zc�[��x���ѡ�����812�sv���ѡ�����`'c����ѡ�����o������ѡ�����o
�����ѡ�����6�����ѡ����fq'D�����ѡ����r�{"�����ѣ���`:���,�����ѣ���0����,�����ѣ�~BvMdrnѝM"%"!  !]ϡ���������������פ��������������Ҡoabd]Uffghiji�ўZCDE3-EDD�CDBuў[EFG2'7!FB,EDvў[EFFA:+,GDvў[EFFG%
$AFDwў[EFFG+1GFFDwў[EFFG(<GFFDwў[EFFB1GFFDwў[EFF#(FF�Dwў[EG:(I,AFFDwў[EG!DG=>GGDwў\FA3IGA4B:9vўP*(!'SНB ! !!�" _Ф���������������edit_photopea.png�	

�))+);5	����������������
�
�
�
�
5�	��������������������������������������������������
���
���
���
���
�5�	��������������������������������������������������
���
���
���
���
�������������������q{�������`�=���%u��G���]1�������	���5����������C������_���F����V��j���W�z����X��|h���Z�	����[������\�����[�����	pixo.ico�	

�,,
,!,1>�;c��b;>>>�;y��x;>>�<i��h<>>�<h��g<>>�;y��x;>>�;y��x;>>�;y��x;>>�;y��x;>>�;y��x;>>�;y��x;>>�;y��x;>>�;y��x;>>�;r��q;>>�=P��O=>	>�=��=>>>�;mi;>>>�<88<>>>�;33;>
>�<99<>	>�<f��e<>>�;y��x;>>�;y��x;>>�;y��x;>>�;y��x;>>�;y��x;>>�;y��x;>>�;y��x;>>�;y��x;>>�;r��q;>>�=P��O=>	>�=��=>>>�;mi;>>>�=FUUE=>>>�=JffJ=>>�=H_^G=>>�<g��f<>>�;y��x;>>�;y��x;>>�;y��x;>>�;y��x;>>�;y��x;>>�;y��x;>>�;y��x;>>�;y��x;>>�;r��q;>>�=P��O=>	>�=��=>>>�;mi;>>�G���D���������������	����G�
���A�������������������ء����C�
���=���������������������>����ט;edit_codemirror.png�	

�//�/��,AL=))--�����0--�K`�����'.�.%�����3-�1*�����%+�����+������7-����;-����_d4+-����t�|)�����e���<������9���a%���u*FS%M����7-�����8)�����TV0���q-?u�p(*����-,-+--�*?J;&'++�����.++�L^�����$,�,#�����1+�/(�����#)�����)������5+�����9+����Ya4)+����D]G*�����fZie0������*ghi>(���s(DQ#4hh�j/,�����7)ehhi`99,���p+2DMC)*%����++�*++�,@K<((,,�����/,,�M_�����%-�-$�����2,�0)�����$*�����*������6+�����:,����Zc5*,����MoQ*�����fj~y3������.|}~D(���t)ER$:~}}�1,�����8*y~}~r>?.���p,5NXK*+$����,+,+,,�&�����)�d����������*�������������������U�
���k�
��������������W�
��%�
��h����������y��=edit_creativecloud.png�	

�3q3�3�������������������������������������������������������������������������������������������������ſ��������������Ļ�������������������������Ŀ�׾�������Ȼ����˹�����ٽ�����ӽ�������������ͼ���������Ŀ��������������������������󨧦��������������������  �  ��!     !" #%$  #8BSJ;, "34<n����N1*Jn�r^I!(��H% H��d��'�v0.k�S�/R�4-�l�<J9V�2.|�W�1	�l.&J�~Z�`0;��A"2Q���=���xC+-8EOC6D=3%�! "$" �)*�+**�)((''))**��+*((*)('&())*+,*&,.-&%('&((*)%%,@JZQB3#(&')%,<=Et����T9"'($2Qt�wdP*0��N,$&)O��j��/(�z7!"6p�Z�7%X�:#"5�q�C
P@$[�8"!4��]�8�o4",P��!_�e6A��F'"% 9V���C���{H0##$ 3>JTH<IB9+#""�$"'&(*'& #!!""#"!�"#"!!"! �背景�	

7*�7F7�7��7b7n7z7�������������p8img/src/icons-small.xcf000064400000103453151215013440011034 0ustar00gimp xcf file-��@r���xB�B�gimp-image-grid(style solid)
(fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000))
(bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000))
(xspacing 10.000000)
(yspacing 10.000000)
(spacing-unit inches)
(xoffset 0.000000)
(yoffset 0.000000)
(offset-unit inches)
�"
�b�fLj0m�q0u�y�~0��
flash-old�	

�
����IJJ�G�K������ϫKL�����������IJ������Ż�����H����ù�����J�����������I����������I������������H������⟖����J�������������I�������������H�H����������H�I����������I�H����������H�H����������H�GHH�G�����������|�14554310v̷���379:8630-ͥ��t26��T�30,����14�65�1.+����}/2��P�/,)����{,/�00�,)'����z*+�,+��($����{(())((''#����z&%$$##""m����w�w����������w�v����������v�t����������t�q����������qm������������ڶ���~����������F�������������B�������������������
���

�n�����������������������������������������������Mgg�$�i���i%���	��l&�������r���v���z�������������
��������������������������������icons8-adobe-flash.svg�	

�������*
�������������������!!������!!!!�����!!��!��!�����!!�!
!�!�����!!��!��!�����!!�!!��!�����!!�!!!�!�����!!�!!!�!�����!!!!!!�����!!������������������
�**
C�C@455�4@C�C4�4C�C5�5C�C5�5C�C5HHJH5C�C5HH5C�C5HH�H5C�C5H�H5C�C5HH5C�C5HH5C�C55C�C5�5C�C4�4C�C@455�4@B
C**
6�64+
+�46�6+�+6�6+�+6�6+�+6�6+::<:+6�6+::+6�6+::�:+6�6+:�:+6�6+::+6�6+::+6�6++6�6+�+6�6+�+6�64+
+�46
6**�I�
��H�J���H�������������������������������������������������������������������������H���G�H�
��G)icons8-adobe-illustrator.svg�	

����h|�*
�����
�����
�����
������ !������!�!!��������!!�������!�!!������!!���������!���������!������
�����
�����
������
��
�**�WXX�XRB
B�RV�VC
�CV�XC
�CX�XC�
�CX�XC�
RS�CX�XCS��CX�XC�SSS�CX�XC	OSSS�CX�XCSTSSS�CX�XCS�OS�CX�XC
�CX�XC
�CX�VC
�CV�XRB
B�RWV�W)*�$"
"�!�! 
� !�"
�"�"
�"�"�"�"� !�"�"!��"�"�!!!�"�"�!!!�"�"!!!!!�"�"!�!�"�"
�"�"
�"�"
�"�! 
� "�!#""�#")*�Ow
w�N�N���M���������������������������������������������������������������������N���L�M�����L)icons-small.png�	

��btb�b�b�b�R;���#Y&K)�/�4H7�;?AD[GLhP�T�X�_Q�IJJ�G�K������ϫKL�I��������IJ�J���������H�J���������J�I���������I�I���������I�H���������H�J����������J�I����������I�H����������H�H����������H�I����������I�H����������H�H����������H�GHH�G1����||{|{{㤴����������yyu�������������������������������������������|����������|������������{��������������y���������������v���	���t�}~~��t�}}~~}}�~}}�~�t��������|�����������|�������̷����~������ͥ��t������������}����������}�{����������{�z����������z�{����������{�z����������z�w����������w�w����������w�v����������v�t����������t�q����������qm2�������	�������ɺ��������������ƾ���������Ż���������ˬ�ĺ�󸷷��������������������������������������������������������	������������������Ÿ�������������������ڶ��������������������������������������������������������������������������������������������������������������������������������������1�����������������������������������������������������	�����	�������������������������	�������	����������������������Mgg�$�i���i%�l���l&�o�����r���r�v���v�z���z���������������������������������������������������1�9�����������
��������������������������������������������������8HB	B�DH+O�������	�򤮥������������򊓒����������SSڇ������������g]��zs��������������f����������|�`��������pog�������ypml��������{rp��r~||�}yyur��|����i�:LIHH�MF

��JcYXXZ�[b9O�������	�������Ǵ��������������������mmذ����������ņ�㯢������������׾���Ŷ���������������������������������������������������ƭ�����������Sidbb�ia

��j������QO������	��������������������������������������������������������������������������������������������������y�����������������^O��®��{����w@TPQUR�
��M�
���,?�����������9�������\�
����
��u�ɸ���Į�pSUS�Q������������˷QN��������������T���TQ��
���QM��
���MG��
�GC��
��C=��
��=7��
��72��
��2%��
��%��pSUS�Q������������̸QN��������������T���TQ��
���QM��
���MG��
�GC��
��C=��
��=7��
��72��
��2%��
��%��pSUS�Q��������������QN��������������T���TQ��
���QM��
���MG��
�GC��
��C=��
��=7��
��72��
��2%��
��%��p�"Yf
f�Y"[�
���[i���fg���gh���hj���jl���ln���nq���qs���sv���v{���{d���d���IJJ�G�K������ϫKL�I��������IJ�J���������H�Jۢ��������J�Iܿ�������I�Iܦ��������I�H���������H�Jޫ��������J�I���������I�H߮��������H�H����������H�I౯�������I�H����������H�H����������H�GHH�GA�]\\�][���[U�IJOSMLYei����US�sy����������S������������|�������̷����~������ͥ��t��ż������}����������}�{�˼������{�z����������z�{���̼�ż�{�z����������z�w����������w�w����������w�v����������v�t����������t�q����������qmB�{||�{x���xu�������������up����ö��ù���p�������������ڶ���������������������������������������������������������������������������������������������������������������������������������������A~�{���{w���������wr����������r��Mgg�$�i���i%�l���l&�o�����r���r�v���v�z���z���������������������������������������������������A�Mgg�Mh���hi���ik��k�M������Ӽ�����MJ�PX�����������JF�.<K���������F@�$&.?GQ\ht����@;�>DJTap�������;5�>DJS]gr}�����5&��
��&�Tl�klf	�l-AWiklf�l,0AWjl�dQdlM,.l�I..;Nblfl�2*-.:Ki�+�*-Q�9�8�M�+�TWY[Y�3�FcumV�H�3SUGI�X�$',1�HNSWX	�8]tjM	�'PQ<=	�"(1�l�������������lg�}����������ga�Yhx�������a[�MPYjr}������[W�iov���������WS�iov���������SA��
�A.,,�.T���	��{��������{����������{|���||��������w{|������w{��������������������Ž����y�������fipw������	��ĸ�	�i����	�[^ai1�n����������nj�cm���������jc�=M^��������c]�UYas|�������]Y������������YS����������SA��
�A..U�����	�����������������������������������������������������������������������������	�����	������	�����1�m���mo���oq���qs���su���ux���x~���~d���dT���U
	�����U
��:������U
:��������U
���+������+v����������@����������������l���p��m�@���	�����	����l	�p��m1������������������{������_S���~z|�~[R�������u]��������x}��==%�����qnn�mk����yy�x���|{��}yt��uplik�����wsy��������������1��������������������������xj��������vj��������x������������==%����������������������������������������������������������1���������������������������Ľ����������ƿ��������ý�����==%��������������������������������������������������������1��h�����h����������������������������������������������������������������������������ò������Ɵ������ʴ������Ц������ݶ������ �IJJ�G�K������ϫKL�I��������IJ�J���������H�Jۡ��������J�Iܾ�������I�Iܥ��������I�H�����˸���H�J�����̟���J�I�d���μ���I�Hߐ�´ϣ���H�H���������H�I఼�������I�H����������H�H����������H�GHH�G������������|�������̷����~������ͥ��t��ĺ������}����������}�{�˼������{�z����������z�{𭭯��ĺ�{�z�H��������z�w�qw������w�w����������w�v����������v�t����������t�q����������qm�������������ڶ����������������������������������������������������������������8898������2AgW�����!%:3���������������������������������������������������Mgg�$�i���i%�l���l&�o�����r���r�v���v�z���z����������������������������������������������������"�IJJ�G�K������ϫKL�����������IJ������Ż�����H�����ù�����J�����ؿ������I������ǭ����I�����̞���H����ð�������J�������������I�������������H�H����������H�I����������I�H����������H�H����������H�GHH�G#�IJJ�G�K������ϫKL�����������IJ���������Ɋ��H�����wYAܷ��J�����Pߺ��I������i�c��I����������H�����y������J����x����I����xf����H������������H"�����������|�14554310v̷���379:8630-ͥ��t2689�@30,����145G�p1.+����}/23rm�Q,)����{,/_ߧ��|'����z*+�Y5*($����{(())((''#����z&%$$##""m����w�w����������w�v����������v�t����������t�q����������qm$�����������|��������̷����rOW�����٥��t�O��n��h�����W�����v����}��n��ޅ������{����������z�̾�������{�������z���Ϻ�����w�����������w"������������ڶ���~���������*����5�g����jd�D����Uݣ��v�����O#�����
���

�n����������������������������������������������#������������ڶ�������������I"Y������̣���0��ͽ�����"�}��������Y0}K������������������=FS�l�y�����4�F���e����-4=�yeS�������������"�Mgg�$�i���i%���	��l&�������r���v���z�������������
��������������������������������#�Mgg�$�i���i%�@����l&��
�����
��r��
��v��
��z@��	�����	������	������	����@�����I����������I�H����������H�H����������H�GHH�G$� 144�1 �0/O���ӯZ/0�(1{�Ӯ���ݙ1(${��ӭ����Α$<nw����Lj���7j[Zainwi\��qf}TGORTQn�|PF[FW>BCDBGPg3HNK;>@AA�>K[2`b�<@AEGIIGKBP^T$IIOUYZXTGkk/<U_hnqnhV�W�Dlx�xef!�3^u�u^0�!!���v����������v�t����������t�q����������qm%����������􀇞����ڨ���x�������˂xUn�����������nU]{��ؾ������x]T������������TK��������Ƽ���KE����������w��ED������ɇ��s��DGGy������������GMM`�����������mM99T���������ǛT99�Za���������cZ9�bey�����web�Uikll�kiU�����������������������������������$��������ݿ��������������������˿�������⵪�����������������������˓������������˅~������������~|����������|�������������ف��������������������������֔������������٦�������ྭ�����������������������������������$�D�����D� �����ϙ � ����� 	�����	G�	���G��	������	������	�������	������	���I�	���I	�����	"�����"�"����٤"�	I��ɹ�I	���Y]	]�XUU�������sRP����N�F����F�<����<�2����2�+����+�!��Ɇ�Ԇ���!���z���z�����������c���c���
���Z��Z��
����������T����������0����			�
���y{	{�vtt�������sn���j�g����g�]����]�S����S�I����I�A��І�݆���A�7��z����z�7�0������0�*��c���c�*�$���Z��Z��$""��������""�j��������""�!G�����!"	"���}�vtt�������sq���q�i����i�_����_�U����U�K����K�A��ц�ކ��A�7��z����z�7�0������0�*��c���c�*�$���Z��Z��$""��������""�j��������""�!G�����!"	"����9f	f�9�����zf����$�f���f�f���f�f���f�f���f�f���f�f���f�f���f�g���g�k���k�q���q�+����y'�����F"�	��J���Y]	]�XUU�������sRP����N�F����F�<����<�2����2�+����+�!��Ɇ�Ԇ���!���z���z�����������c���c���
���Z��Z��
����������T����������0����			�
5�Y]	]�XUU�������sRP����N��y{	{�vtt�������sn���j�g����g�]����]�S����S�I����I�A��І�݆���A�7��z����z�7�0������0�*��c���c�*�$���Z��Z��$""��������""�j��������""�!G�����!"	"�5�y{	{�vtt�������sn���j�}�vtt�������sq���q�i����i�_����_�U����U�K����K�A��ц�ކ��A�7��z����z�7�0������0�*��c���c�*�$���Z��Z��$""��������""�j��������""�!G�����!"	"�5}�vtt�������sq���q��9f	f�9�����zf����$�f���f�f���f�f���f�f���f�f���f�f���f�f���f�g���g�k���k�q���q�+����y'�����F"�	��J5�9f	f�9�����zf����$�F����F�<����<�2����2�+����+�!��Ɇ�Ԇ���!���z���z�����������c���c���
���Z��Z��
����������T����������0����			�
�Y]	]�XUU�������sRP����N�F����F�<����<�2����2�+����+�!��Ɇ�Ԇ���!���z���z�����������c���c���
���Z��Z��
����������T����������0����			�
!�g����g�]����]�S����S�I����I�A��І�݆���A�7��z����z�7�0������0�*��c���c�*�$���Z��Z��$""��������""�j��������""�!G�����!"	"��y{	{�vtt�������sn���j�g����g�]����]�S����S�I����I�A��І�݆���A�7��z����z�7�0������0�*��c���c�*�$���Z��Z��$""��������""�j��������""�!G�����!"	"�!�i����i�_����_�U����U�K����K�A��ц�ކ��A�7��z����z�7�0������0�*��c���c�*�$���Z��Z��$""��������""�j��������""�!G�����!"	"�}�vtt�������sq���q�i����i�_����_�U����U�K����K�A��ц�ކ��A�7��z����z�7�0������0�*��c���c�*�$���Z��Z��$""��������""�j��������""�!G�����!"	"�!�f���f�f���f�f���f�f���f�f���f�f���f�f���f�g���g�k���k�q���q�+����y'�����F"�	��J�9f	f�9�����zf����$�f���f�f���f�f���f�f���f�f���f�f���f�f���f�g���g�k���k�q���q�+����y'�����F"�	��J!�Y]	]�XUU�������sRP����N�F����F�<����<�2����2�+����+�!��Ɇ�Ԇ���!���z���z�����������c���c���
���Z��Z��
����������T����������0����			�
�y{	{�vtt�������sn���j�g����g�]����]�S����S�I����I�A��І�݆���A�7��z����z�7�0������0�*��c���c�*�$���Z��Z��$""��������""�j��������""�!G�����!"	"�}�vtt�������sq���q�i����i�_����_�U����U�K����K�A��ц�ކ��A�7��z����z�7�0������0�*��c���c�*�$���Z��Z��$""��������""�j��������""�!G�����!"	"��9f	f�9�����zf����$�f���f�f���f�f���f�f���f�f���f�f���f�f���f�g���g�k���k�q���q�+����y'�����F"�	��J0SUS��Q������������˷QN��������������T8MMLJIHFD?79=9QMˋrnid_QCFJNDML[ňfa\NDHMQVIGJ�w_��OGKOTX\NCGT`[LMJNRV[_bR=E]XSOMPUY]acfT7BUQLKSW[_beffU2@NJGMZ^adff�U%8?>>GMPRTUU�M��0SUS��Q������������̸QN��������������T8MMLJIHFD?79=9QMˋrnid_QCFJODML[ňfa\NDHNRWIGJ�w_��OGKPUY]NCGT`[LMJOSW\`cR=E]XSOMQVZ^bdgU7BUQLKTX\`cfggV2@NJGM[_begg�V%8?>>GMPSTVV�M��0SUS��Q��������������QN��������������T8MMLJIHFD?9=A<QMˋrnid_RHLQWJML[ňfa\PJOU[`OGJ�w_��QMSX^diUCGT`[LMQV\aglpY=E]XSORY_ejnsu\7BUQLL\bhmquvv]2@NJGSfkosvv�]%8?>>LTWZ[\]]�Q��0�"Yf
f�Y"[�
���[i���fg���fh���fj���fl���fn���fq���fs���fv���f{���rd���d�B�Y]	]�XUU�������sRP����N�F����F�<����<�2����2�+����+�!��Ɇ�Ԇ���!���z���z�����������c���c���
���Z��Z��
����������T����������0����			�
%�Y]	]�XUU�������sRP�����N`f|u{�����F\s�����z�����<b�������|����2d����j����+S�������s���!:\wxx�we�����:2<^U]t����B�y{	{�vtt�������sn���j�g����g�]����]�S����S�I����I�A��І�݆���A�7��z����z�7�0������0�*��c���c�*�$���Z��Z��$""��������""�j��������""�!G�����!"	"�%�y{	{�vtt�������sn����jiq�|������gcz�����������]h������������Sj����q����IY�������z���ADc~�~l����7D;Fc\bz���0B}�vtt�������sq���q�i����i�_����_�U����U�K����K�A��ц�ކ��A�7��z����z�7�0������0�*��c���c�*�$���Z��Z��$""��������""�j��������""�!G�����!"	"�%}�vtt�������sq����q����������i�����ƹ�����_�������Ҳ����U����Ӧ����K�������̤��Ap�����������7pip�������0B�9f	f�9�����zf����$�f���f�f���f�f���f�f���f�f���f�f���f�f���f�g���g�k���k�q���q�+����y'�����F"�	��J%�9f	f�9�����zf����$=���fK�	��f�
��f��
��f�
��fK�	��f�=���f������
���
����������T����������0����			�
%�Y]	]�XUU�������sRP����N�F����F�<����<�2����2�+����+�!��Ɇ�Ԇ���!���z���z�����������c���c���
���Z��Z��
����������T����������0����			�
��*���*�$�����$""��������""�j��������""�!G�����!"	"�%�y{	{�vtt�������sn���j�g����g�]����]�S����S�I����I�A��І�݆���A�7��z����z�7�0������0�*��c���c�*�$���Z��Z��$""��������""�j��������""�!G�����!"	"���*���*�$�����$""��������""�j��������""�!G�����!"	"�%}�vtt�������sq���q�i����i�_����_�U����U�K����K�A��ц�ކ��A�7��z����z�7�0������0�*��c���c�*�$���Z��Z��$""��������""�j��������""�!G�����!"	"���g���g�k���k�q���q�+����y'�����F"�	��J%�9f	f�9�����zf����$�f���f�f���f�f���f�f���f�f���f�f���f�f���f�g���g�k���k�q���q�+����y'�����F"�	��J���IJJ�99JJG�K��ՙ��ϫKL�I��Ż�w���IJ�J��ɻ�w����H�J��˻�w����J�I��̻�w����I�I��Ι�w���I�H��ϻw����H�J���ϻw����J�I��һw�����I�H���һw����H�H��ջw�����H�I���ջw����I�H��׻w�����H�H���߻w����H�GHH�HH�Ga���aa������登��|���ۻ�w̷����~��߻�wͥ��t�����w�����}��⻙w����}�{����w����{�z���w�����z�{����w����{�z���w�����z�w����w����w�w���w�����w�v����w����v�t���w�����t�q����w����qm�mmb��������������ڶ�����w����������w��������w������ﻙw��������w�������w���������w�������w��������w������w��������w�����w�����������w��������������a��Mgg�fgg�$�i���i%�l���l&�o�����r���r�v���v�z���z������������������������������������������������������a��IJJ�99JJG�K��ՙ��ϫKL�I��Ż�w���IJ�J��ɻ�w����H�J��˻�w����J�I��̻�w����I�I��Ι�w���I�H��ϻw����H�J���ϻw����J�I��һw�����I�H���һw����H�H��ջw�����H�I���ջw����I�H��׻w�����H�H���߻w����H�GHH�HH�G#�IJJ�99JJG�K��ՙ��ϫKL���aa������登��|���ۻ�w̷����~��߻�wͥ��t�����w�����}��⻙w����}�{����w����{�z���w�����z�{����w����{�z���w�����z�w����w����w�w���w�����w�v����w����v�t���w�����t�q����w����qm�mm$��aa������登��|��������������ڶ�����w����������w��������w������ﻙw��������w�������w���������w�������w��������w������w��������w�����w�����������w��������������#�������������ڶ���Mgg�fgg�$�i���i%�l���l&�o�����r���r�v���v�z���z������������������������������������������������������#�Mgg�fgg�$�i���i%�I��Ż�w���IJ�J��ɻ�w����H�J��˻�w����J�I��̻�w����I�I��Ι�w���I�H��ϻw����H�J���ϻw����J�I��һw�����I�H���һw����H�H��ջw�����H�I���ջw����I�H��׻w�����H�H���߻w����H�GHH�HH�G3�IJJ�99JJG�K��ՙ��ϫKL�I��Ż�w���IJ�J��ɻ�w����H�J��˻�w����J�I��̻�w����I�I��Ι�w���I�H��ϻw����H�J���ϻw����J�I��һw�����I�H���һw����H�H��ջw�����H�I���ջw����I�H��׻w�����H�H���߻w����H���ۻ�w̷����~��߻�wͥ��t�����w�����}��⻙w����}�{����w����{�z���w�����z�{����w����{�z���w�����z�w����w����w�w���w�����w�v����w����v�t���w�����t�q����w����qm�mm4��aa������登��|���ۻ�w̷����~��߻�wͥ��t�����w�����}��⻙w����}�{����w����{�z���w�����z�{����w����{�z���w�����z�w����w����w�w���w�����w�v����w����v�t���w�����t�q����w����q����w����������w��������w������ﻙw��������w�������w���������w�������w��������w������w��������w�����w�����������w��������������3�������������ڶ�����w����������w��������w������ﻙw��������w�������w���������w�������w��������w������w��������w�����w�����������w������l���l&�o�����r���r�v���v�z���z������������������������������������������������������3�Mgg�fgg�$�i���i%�l���l&�o�����r���r�v���v�z���z�����������������������������������������������GHH�HH�G�IJJ�G�K������ϫKL�����������IJ������Ż�����H����ù�����J�����������I����������I������������H������⟖����J�������������I�������������H�H����������H�I����������I�H����������H�H����������H�GHH�G�m�mm�����������|�14554310v̷���379:8630-ͥ��t26��T�30,����14�65�1.+����}/2��P�/,)����{,/�00�,)'����z*+�,+��($����{(())((''#����z&%$$##""m����w�w����������w�v����������v�t����������t�q����������qm����������������������ڶ���~����������F�������������B�������������������
���

�n���������������������������������������������������������@�P(ow.png�	

�cgc{c������v����R����4����!�����������
����
��
�
��	��



���
����

	����
���
��

	������������������������������������������������튀�����݀|�������������{��
��y������~|{z��w��
��u����~}{zywv��s��
��q���|{yxvu���o��
��m~�
��k|{yxvusrponlki�������������������������������������������������������������
���������������
����������������
����������������
�����
�����������������������������?�����;��	��e=��	���B���%������
�
�
�
�
�
�
����
���oc.png�	

�f�gg�BA@?><;:936532A����55320?����j200/>����P0.-<����<+�:������.)8��321/.-,*��'7��2��.���)��&5��0/-,+)('��$3��.��*���%��#2��,+*)'&%#��!0��+��'���"��.��)(&%$#! ��,�
��+�
��)(&%$#! �����������������׸���������˸����������������������곳������������ޯ��������������������������������������������������������������������������������
�����
�����������������/.-,*)(&$""! .���~# ,����[*����?)����)�'�����%�� ��#���������!���� ��������������������
��
��
��	�
���
��

	�������������?�����;��	��e=��	���B���%������
�
�
�
�
�
�
����
���oi.png�	

rj�j�k����������������������������������ɽ������������칳�	��������������������������������������������������������������������������������������
�����������������b`_^]\[YXUVUTR_����VUTSR^�����TRQP]����lQOO[����\M�Z����QLX�	��KW��ZTSRQPON��IV��X����L��HT��U�P�NM�K��GS��S����I��EQ��P�M�KJ�H��DP��N���G��BO��MKJIHGFE��AM�
��@MKJIHGFDCBA@?=����u����P
����3

����������	����
��
��������	����
���������
������
�	����
�����
��

		���
��
		�������������?�����;��	��e=��	���B���%������
�
�
�
�
�
�
����
���oo.png�	

@n�n�n��~|{zywvutwqpnm|����pmnmkz�����mlkjy�����jihw����sh�u����igs�	���cr�
��ap�
��_n�
��^m�
��\k�
��Zi�
��Xg�
��Wf�
��Udca`_^\[ZXWVTS�~|{zywvutwqpnm|����pmnmkz�����mlkjy�����jihw����sh�u����igs�	���cr�
��ap�
��_n�
��^m�
��\k�
��Zi�
��Xg�
��Wf�
��Udca`_^\[ZXWVTS�~|{zywvutwqpnm|����pmnmkz�����mlkjy�����jihw����sh�u����igs�	���cr�
��ap�
��_n�
��^m�
��\k�
��Zi�
��Xg�
��Wf�
��Udca`_^\[ZXWVTS�������������?�����;��	��e=��	���B���%������
�
�
�
�
�
�
����
���icons8-pp.svg�	

����vq�q�r
/�����	�������������������������������������������������������������������������������������������������������������������������������./�UIIM	�3GIJJ�LJ�w����J�z������J����骊�J���JJº��̊�J��ZJ�ƣ����J��UJ���ي��J�݆JJ��㡊��J��wJJ�~������J��uJJ����͊�J��������J��������J�w�����3GIJJ�L�UIIM.0�
��Oee�d��Re��eef������ef���߃���߾ef��a��.����eef��`��'����eef����e��ކeef��S�Wkee�f��O�����ef��j����ef�������ef�Oee�d��./�*[	�+^���@�q�������\�������������������������������������������������������������q�������\�+^���@�*[.icons8-excel.svg�	

�����v<vPv`/�U1-+	�3/..�0�-..�DLL�K.�ELL.������nL.��DZ�X.�y���bL.�4�Ȱ..�����iL.�o��@..�����fL.�t��D..�����fL.�<�ѹ..�����iL.��5b�`.�y���bL.������nL.�ELL�-..�DLL�K�3/..�0�U1-+./�U�~�	�f}}�|�|}}�����~}}�����~}}�����뾯�~}���}����׹��~}�����}}����弯�~}}����}}����޻��~}}����}}����޻��~}����}}����弯�~}�ꁞ��}����׹��~}}�����뾯�~}}�����|}}�����f}}�|�U�~�./�U123	�3/112�42�HPP2�IPP2������qP2��H]�[2�|���fP2�8�ɲ22�����mP2�r��D22�����iP2�w��H22�����iP2�@�Һ22�����mP2��8e�c2�|���fP2������qP2�IPP2�HPP�3/112�4�U123./�*[	�+^���@�q�������\�������������������������������������������������������������q�������\�+^���@�*[.icons8-word-2.svg�	

�����
z�z�z�0�
�

��

�!!�

�!!�"�

����K"�L�
��!�
6DD�)"�!��H�
���K"�
�P��o�
a~~�8"�
���αY
a~~�8"�
�S��(
���K"�
K�!h�

6DD�)"�

����K"�

�!!�"�

�!!�

��./�UIFD	�3GGFHGG�H�FGG����HGG�������HGG������Hw�GæV�G�������HV�I��t�G�����HG�z�쑧G������HGÿ��āG������HG��|��[G�����HGv�V��GG�������HGG������HGG�������FGG����3GGFHGG�H�UIFD./�����	�����������������������������������ѩ����������������������ҡ�����������ᾡ��������������������������������������������������������������./�*[	�+^���@�q�������\�������������������������������������������������������������q�������\�+^���@�*[.2icon-group�	

~�2~�2�IJJ�G�IJJ��������KLIJJ�����������IJK������ϫ���n��HI��������n��o�JJ����������oφ�IJ��������φυ�II��������υЇ�HI��������Ї҆�JH��������҆Շ�IJ���������Շ؅�HI���������؅ك�HH���������كځ�IH���������ځ��HI�����������}�HH����������}�HHGH����������HHGGHH�G�����þ�����|���þ�����­������������­�����t�������̷������~������ͥ������}�������������{}������������z{������������{z������������z{������������wz������������ww������������vw������������tv������������qt�����������pmmq����������pmmm
m�����������������ڶ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Mgg�$�Mg����i%Mg��	��l&i����l���ro���vr���zv���z�����������������������������������
����������2
icon-text�	

F��2��2���IJJ�G�K������ϫKL�I��������IJ�J���������H�Jۢ��������J�Iܿ�������I�Iܦ��������I�H���������H�Jޫ��������J�I���������I�H߮��������H�H����������H�I౯�������I�H����������H�H����������H�GHH�G!�����������|�������̷����~������ͥ��t��ż������}����������}�{�˼������{�z����������z�{���̼�ż�{�z����������z�w����������w�w����������w�v����������v�t����������t�q����������qm"������������ڶ���������������������������������������������������������������������������������������������������������������������������������������!�Mgg�$�i���i%�l���l&�o�����r���r�v���v�z���z���������������������������������������������������!img/src/icons-small.pxm000064400000155566151215013440011074 0ustar00PXMT_DOC�HEADERIN��$(����METADATA&��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_IMAGE_ZOOM_�����NSNumber��NSValue��*��f������_MASKS_VISIBLE_RECT_�����<{{6.95324e-310, 6.95324e-310}, {8.39912e-323, 2.22546e-314}}�����_DOCUMENT_SLICES_�����NSMutableArray��NSArray�������_PX_VERSION_����� 1.6.5�����_DOCUMENT_WINDOW_RECT_�����{{712, 4}, {200, 874}}�����_PRINT_INFO_�����
NSMutableData��NSData���}�[381c]streamtyped���@���NSPrintInfo��NSObject�����NSMutableDictionary��NSDictionary��i����NSString��+NSHorizontallyCentered�����NSNumber��NSValue��*��c������
NSRightMargin�������f�H�����NSLeftMargin�������H�����NSHorizonalPagination�������������NSVerticalPagination������������NSVerticallyCentered�������NSTopMargin�������Z�����NSBottomMargin�������Z��������_LAYERS_VISIBLE_RECT_�����{{0, 348}, {239, 240}}�����_DOCUMENT_SLICES_INFO_���������PXSlicesPreviewEnabledKey�������c������PXSlicesVisibleKey�������������__OLD_METADATA_FOR_SPOTLIGHT__���������	colorMode�������������layersNames���������Layer 1�����dir�����
dir-opened�����file_extension_m4b�����file_extension_jpeg�����file_extension_htm�����file_extension_zip�����file_extension_hqx�����file_extension_gz�����file_extension_flv�����file_extension_doc�����file_extension_html�����file_extension_bin�����file_extension_bat copy 3�����file_extension_bin�����file_extension_chm�����file_extension_ptb copy 5�����file_extension_ptb copy 4�����file_extension_ptb copy 3�����file_extension_ptb copy 2�����file_extension_ptb copy�����file_extension_ptb�����file_extension_ace�����file_extension_rtf�����file_extension_pdf�����file_extension_mpeg�����file_extension_mp4�����file_extension_txt�����file_extension_exe�����application�����Layer 0������keywords����������
csProfileName�����sRGB IEC61966-2.1�����resolutionType�������
resolution�������d����R@�����
canvasSize�����
{16, 1280}������PXRulersMetadataKey�������������PXGuidesArrayKey�������������PXGuidePositionKey�������c�����PXGuideOrientationKey��������������PXRulersVisibleKey������������_MASKS_SELECTION_�����I�[73c]streamtyped���@���NSMutableIndexSet��
NSIndexSet��NSObject��I������_ICC_PROFILE_NAME_��ܒ���_ORIGINAL_EXIF_���������*kCGImageDestinationLossyCompressionQuality������������Depth������������{TIFF}���������ResolutionUnit�������Software�����Pixelmator  1.6.5�����Compression�������DateTime�����NSMutableString��2011-06-29 00:42:06 +0400�����XResolution����������B�����Orientation�������YResolution����������B������PixelHeight����������������{Exif}���������PixelXDimension������������PixelYDimension�������������
ColorSpace��������{JFIF}���������YDensity����������B�����
IsProgressive�������XDensity����������B�����DensityUnit��������{IPTC}���������ProgramVersion�����Pixelmator  1.6.5�����ImageOrientation�������Keywords��چ����ProfileName��ܒ���DPIWidth����������B�����{PNG}���������XPixelsPerMeter�������������YPixelsPerMeter��������������	DPIHeight����������B�����
ColorModel�����RGB�����HasAlpha�������
PixelWidth�������������_DOCUMENT_LAST_SLICE_INFO_���������PXSliceMatteColorKey�����NSColor���ffff�����transparent�������PXSliceFormatKey�����PXSliceFormatPNG24������_LAYERGROUPS_EXPANSION_STATES_�������������_STATE_�������_ID_�����:B49E082D-A1FB-487E-BE17-E16F73A8F48E-7317-000022DE0376C4C3�������6���7����:2FF17678-F87E-4E6E-974D-AEA1452BD260-7317-000022DE0375EFB6�������6���7����:E171E19A-6285-43FA-A545-2E08E088286D-7317-000022DE03753825�������6���7����:2B6314C0-94D3-4C2D-9EB8-2547D45A688F-7317-000022DE03747F72�������6���7����:86178D35-500B-4623-A85A-DFB323809A81-7317-000022DE0373DCEE�������6���7����:B6072A85-4E32-4313-9BFE-CA12E71CDDE9-7317-000022DE037336E4�������6���7����:141ACB82-8C5E-4C2A-B4DC-B8D953D85190-7317-000022DE03725503�������6���7����:0C889008-D40C-41E0-9823-0527E71BC619-7317-000022DE03719715�������6���7����:93651A65-B373-4406-A096-8E0C60F71A91-7317-000022DE0370F224�������6���7����:7D161273-35F6-481F-BD4E-5F76C12E4EF0-7317-000022DE03703387�������6���7����:DF7B7D00-9D58-40FF-AB9B-C0B4E116D0BE-7317-000022DE036F8E95�������6���7����:E4915B50-BCCF-4E3A-A2A4-88DDFC85C7C2-7317-000022DE036EAEC3�������6���7����:A2222DE8-C779-4E62-86DF-E7A4A005933A-7317-000022DE036DF68D�������6���7����:DB8A1109-C165-42F8-A602-A93EC4310B9B-7317-000022DE036D5323�������6���7����:B50AC766-400F-4253-9654-13294B38B1A3-7317-000022DE036CAC73�������6���7����:FCA3C5B3-B773-48CA-A969-4C7CC08BE446-7317-000022DE036BC544�������6���7����:45A3A36A-1062-4E1A-9E54-753C7A61F5BE-7317-000022DE036B1DAE�������6���7����:68EE54FD-1991-449B-9898-B1F93AD70339-7317-000022DE036A4C08�������6���7����:0A8227E9-EF9C-4910-83B3-6C6DD3B1E89A-7317-000022DE03699079�������6���7����:7B043E90-924C-45F0-9A91-914255DA508F-7317-000022DE0368EB2E�������6���7����:FF8D7603-C25D-4431-80E6-6C25E00BBE5F-7317-000022DE03682D54�������6���7����:587F6844-CF89-4FFB-9E2C-2412F64E6630-7317-000022DE03678849�������6���7����:B7C4F623-D892-486B-90FB-A99EA25A8EA9-7317-000022DE0366DB1F�������6���7����:7A7AE012-6ED6-4941-ADAA-B810F40DDE18-7317-000022DE03658E24�������6���7����:151FF549-750C-485C-9255-3469B07D2FE6-7317-000022DE0364E54C�������6���7����:006E318C-BD27-431A-AF83-E3B0BFDF3832-7317-000022DE0364379F�������6���7����:B87DDA57-9B11-452C-87CB-C71D10DCE80E-7317-000022DE036371D3�������6���7����:0675C424-B6A2-4128-A197-5E9EC0E334B4-7317-000022DE0362C35D�������6���7����:942D4059-6B5B-4B16-BBC5-36E294E422BD-7317-000022DE0361715A�������6���7����:9D4AFCE3-1E59-42D2-AB1C-D4C2B0A3214B-7317-000022DE03608265�������6���7����:C24D76FC-604F-44DD-ABC9-DE5742197FC4-7317-000022DE035EDBD5�������_IMAGE_VISIBLE_RECT_�����{{-61, 0}, {169, 832}}�����_LAYERS_SELECTION_�����8�[56c]streamtyped���@���
NSIndexSet��NSObject��I�����GUIDES_INFO8c	COLORSYNCHHLinomntrRGB XYZ �	1acspMSFTIEC sRGB���-HP  ?�.�J��`�<_|}��cprtP3desc�lwtpt�bkptrXYZgXYZ,bXYZ@dmndTpdmdd��vuedL�view�$lumi�meas$tech0rTRC<gTRC<bTRC<textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ �Q�XYZ XYZ o�8��XYZ b����XYZ $����descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view��_.���\�XYZ L	VPW�meas�sig CRT curv
#(-27;@EJOTY^chmrw|�������������������������
%+28>ELRY`gnu|����������������&/8AKT]gqz������������!-8COZfr~���������� -;HUcq~���������
+:IXgw��������'7HYj{�������+=Oat�������2FZn�������		%	:	O	d	y	�	�	�	�	�	�

'
=
T
j
�
�
�
�
�
�"9Qi������*C\u�����


&
@
Z
t
�
�
�
�
�.Id����	%A^z����	&Ca~����1Om����&Ed����#Cc����'Ij����4Vx���&Il����Ae����@e���� Ek���*Qw���;c���*R{���Gp���@j���>i���  A l � � �!!H!u!�!�!�"'"U"�"�"�#
#8#f#�#�#�$$M$|$�$�%	%8%h%�%�%�&'&W&�&�&�''I'z'�'�(
(?(q(�(�))8)k)�)�**5*h*�*�++6+i+�+�,,9,n,�,�--A-v-�-�..L.�.�.�/$/Z/�/�/�050l0�0�11J1�1�1�2*2c2�2�3
3F33�3�4+4e4�4�55M5�5�5�676r6�6�7$7`7�7�88P8�8�99B99�9�:6:t:�:�;-;k;�;�<'<e<�<�="=a=�=�> >`>�>�?!?a?�?�@#@d@�@�A)AjA�A�B0BrB�B�C:C}C�DDGD�D�EEUE�E�F"FgF�F�G5G{G�HHKH�H�IIcI�I�J7J}J�KKSK�K�L*LrL�MMJM�M�N%NnN�OOIO�O�P'PqP�QQPQ�Q�R1R|R�SS_S�S�TBT�T�U(UuU�VV\V�V�WDW�W�X/X}X�YYiY�ZZVZ�Z�[E[�[�\5\�\�]']x]�^^l^�__a_�``W`�`�aOa�a�bIb�b�cCc�c�d@d�d�e=e�e�f=f�f�g=g�g�h?h�h�iCi�i�jHj�j�kOk�k�lWl�mm`m�nnkn�ooxo�p+p�p�q:q�q�rKr�ss]s�ttpt�u(u�u�v>v�v�wVw�xxnx�y*y�y�zFz�{{c{�|!|�|�}A}�~~b~�#��G���
�k�͂0����W�������G����r�ׇ;����i�Ή3�����d�ʋ0�����c�ʍ1�����f�Ώ6����n�֑?����z��M��� ����_�ɖ4���
�u��L���$�����h�՛B��������d�Ҟ@��������i�ءG���&����v��V�ǥ8��������n��R�ĩ7�������u��\�ЭD���-�������u��`�ֲK�³8���%�������y��h��Y�ѹJ�º;���.���!������
�����z���p��g���_���X���Q���K���F���Aǿ�=ȼ�:ɹ�8ʷ�6˶�5̵�5͵�6ζ�7ϸ�9к�<Ѿ�?��D���I���N���U���\���d���l���v�ۀ�܊�ݖ�ޢ�)߯�6��D���S���c���s���
����2��F���[���p�����(��@���X���r�����4��P��m��������8��W��w����)���K��m��LAYERS�^$�'.*�.1�5t9.<�@CC�G^J�N�Q�U\X�\J_�c�g$j�n^q�u�yA|��^���2����t
Layer 1d':B49E082D-A1FB-487E-BE17-E16F73A8F48E-7317-000022DE0376C4C3@1x��Qn�PE�K��}�՘��ƿb���K�w�C�+P[%�6������'�<���1�}3��2
UO�P�:���ߧ^��p�I��yT�?�/�g���j����A�"I��G���Q�.qI�������,K��4G�{7Ԙ�s�rK��0Q�t�R�q���՘���s���3Qv�0�ƌs>�WyV���I��!��1�6�u���U%��1��_���3��(v��3��,�V~�������3xp<�ph}��1���k��z�|S��lM���W�Fu{���y�TU���streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:621DB4D2-04E5-44AD-B2BA-1C4CD3C07D77-7317-000022DE035B365E��z3dird':2FF17678-F87E-4E6E-974D-AEA1452BD260-7317-000022DE0375EFB6@;�x��]H�a�
Zf�
�dwAQ�mt�PT�E7%��"!�i.���u�:0�l�}X�ln*L�,���hQ79�g{�ٴ�w�Ţ�^�q����y��:al��]�`S��Z��j���~��s���vl�-�"��C�fl�O[��Ej�1��M��/:


K�de�*K�d�{e\Y��ݻv�">Ü�NlNt�n|�x��t>�?Aȥ����aO{:�ԤV\��v�㠀1�F(�Բ�S&$��ĈD����W�g�T{�<��L~�[��z�E���		��7���:H$�k��e�:ݷ���Bvel#�ɧ�4b�#d�L��W�w�ƌX25��])��zću���ü�P���h��ozn��61�mClHM4DK4`^�\���j�������6�(
���yq@E���s���\���l٪�2W��{�����Z�����l�
�:��Z�%�}sB�o�_�
p�v�K���3�"�c���9������S�<�MFP���&v��A������5՞K��ݿ��sם>�̱Ѫ��+���f��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:621DB4D2-04E5-44AD-B2BA-1C4CD3C07D77-7317-000022DE035B365E��lf
dir-openedd':E171E19A-6285-43FA-A545-2E08E088286D-7317-000022DE03753825@&x��]HSa��cW]�����F��	Z�-*hj7}@�lE])��4�؜l�ڪ55��͕-��6g��ZQb$*km;�g�#�ӻ�E%=�㼼�8��T���"{j��
�*{�����TF��><�Ә�c�/���n$�LU��Y"(�W��eޛ�-�)��Z�v��u$�ު�/��a�ӊ�S�D�)W��N�n��8sc]�Mؽ�w����Y䉄K����[&hE�GZ�-0i�70����ݫCl�����
볊vn+�4�㟌RLu� ��o`�����{l���v�k	���X�I>;�t��RlB#�G�e�FuH
���.Jk�E�u_ü��g��ם�h��I|!��"o��4�vE���J�l���NG1O���v4�~����C�=�c��(_�(�y����+G�~ò�O1��&�m9Nrjʡ���)1�Q���"�溿�J�{�1c����H�-<n��L�ž:�����N����GK��I�m���ڊ��H��*��\I�p����}UF��d��ڶ�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:621DB4D2-04E5-44AD-B2BA-1C4CD3C07D77-7317-000022DE035B365E���
-file_extension_m4bd':2B6314C0-94D3-4C2D-9EB8-2547D45A688F-7317-000022DE03747F72@jx��[H�a�?��j˔l��:6��M#�� �
"/")�H�A�͡6���"�� �Rt �6��N��!F��p�\92�x���-죋~����|߃>!Z
,��4�!�z�^7���#5��\ԃT:^�sO��=r�҅w�¹}�u����n����!X�ӫ��`���n�C�G�e�~"�Ԥ�����b�|��h��܄�#����d�^t�,�E�,��G\�PW���G��@{-[!��"�n�!5��bF8
��T�"Z��"����!�f����j�z����W3|�ߏ��u�?��OC�v�:���А�dئƇ���~bkrk���yds��#&{�����Y�����_��/YMx߿��2J	dW.ـД�y|6�&�;�x{o�O�,l~sgB]���!:r���8�2�m*L�ު���xus3���X�1Kfёy�7�
/ol�E�U�E�F�N������}	����>���j�W*�Wy�xs��3I6�g�^�O.�*�z�9[H^��/۫0�[��y
��&oezes��t�.Q�1~�̧Z��{J$v&ӽ��L1Q�4�;�oX
�W���r�����_�_
�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:621DB4D2-04E5-44AD-B2BA-1C4CD3C07D77-7317-000022DE035B365E���
�file_extension_jpegd':86178D35-500B-4623-A85A-DFB323809A81-7317-000022DE0373DCEE@Ix���KTQ�]�6�(�E1�A��*pѦBhhԦ���&(a�1��!j�Ge������91N��8��3���i��{��%.z��{Ϲ�s�sϹ/����A�4�@I���$��e��'�����S�gX��_DaqDU0J<���e_#�/��\�b�o.@��ht�L�j�|�`�"��4~t��
Y�.���y��alrA��%�lv�b��av4��	.��p���l��Wh���TpL}���t��%����
��S"�z��zb������|Zt��Y2��}�Oe�BTBo9�a�k�M�]:�A���2�C1Kf~�������/��|���qle����ԿS�����֯O�U�f[�O��Ȫ�Q�e{Ւ�w���b�Z5fZ��_��S.���S�}�թ1��i�})f)�=��o����lК
-Գ5����gc<��+f)�����$��&)�([
�����Ԣ���d�g�����C����dTN�"N��USd�M`�7}�_1Ki���;԰(�V��>ï�%[��o�\�Gu=��~�Vk������~B�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:621DB4D2-04E5-44AD-B2BA-1C4CD3C07D77-7317-000022DE035B365E���
'file_extension_htmd':B6072A85-4E32-4313-9BFE-CA12E71CDDE9-7317-000022DE037336E4@hx��]HSa�w�]�3?(�s�m�Q�A�ՍTWQ	7Cj�9E2���VD4������,7�4u)n�����������=Չ����y�����[�u�ڼ�rT���ON��$���m^��]�>L��*0tmeЗ�ݥx
N�lEoe풃ױ�ra��]'7�1s�����$�Z��m��&}z^�Bg3�`/O��*@��9
ぬ���~-9
jjx�
���>ƚv�Rt�Ii>G�Ɓ4�6k/j���Wa��S��~&.#f/G���
V\����#�k���kPb���~}ƭ������`y�=��nƲ�<�#M��)��{>�d��ӗ&��^�|������W�S�16��n)�0�T#c=�
om�]G�W%�.��;�ߔ��}��;>�����Iq�Ԙ}\���,,MQ�/��߸��;�����g9�'M����`�%�x��t�o��}E��
c�d��`o�_]�H�..gQH�|�b�F[6"К.�sM�	��{�`y�D�g
�!h�c�-��L�[����U��M�*�[J�;��򤉘mu�{�\�n��]]�Z�cyI22��Q,���;��H�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:621DB4D2-04E5-44AD-B2BA-1C4CD3C07D77-7317-000022DE035B365E���
file_extension_zipd':141ACB82-8C5E-4C2A-B4DC-B8D953D85190-7317-000022DE03725503@Hx���K�Q���!�(b�=N��)m.*�D�K~1�QW-ͽ�Y(�W��
��[ε�Ɯ�2��P4Ÿ��gv`DP?�x�}��:���ORw���J��ΊxVZ|����݁5���'�W�{+��%���}���ױ���0���_���toG:����s;8`~L+�r��}�m#T���N�Gsw�=�8꘡4�`�l����Ap5T���T��p,�D}oZWJg�x̭t�G)�M� �ӑ��&�h�緡uG��A�����sEG3�f�`#Y3e�r[�;SM�}K��s�
& �����C��(�q:7�'
s�8O5�{�;�C����ԟ�&�I�A�&d����}�q�j�Z����y8Ez��I��%:���gI�7%�8O5�7�?��XM�iZ�f%��L�q�
��9�SM����ˏ0�2h{�x�5+�h͞q"+�s�����+�M�L���U
{&�"N��r��ThA\�|��e��,C?Y@�Ģ,^�w��X��<�u�C8��Ъ���j��[��<�5�̳��9�A�㼢�=��!��P�tR*h�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:621DB4D2-04E5-44AD-B2BA-1C4CD3C07D77-7317-000022DE035B365E��w
~file_extension_hqxd':0C889008-D40C-41E0-9823-0527E71BC619-7317-000022DE03719715@)x���nQ�y��
���T�Z,���0J;@�����/�L�-����3Է�O`�{uR�q%+s�>��s有���TM���Š�BVȲ,�
9�|u�E������x��y��^��A�
���aN�sD�k�w^���pw\.8��`�&X�F
~�F@�y	��cBf���&�/��%�u�)
�
��'�4�N��p��	��y���++�R�EX���F�v�s���A	�v
�0[���%	��e"��e!�P�g�9k��n��7��#�G��|�N���y����	s�.���"��]��}���EB!"�ө'�։Q�2�F�x��:�����������%ub�R�H�X��	��s�QG6�F&�����Z.�E���<a���k�O��~����/WWD����
;9a�q�0[<?���[@>�%jV��v�(�=9�f��㷨Vʨ��b��G����1ת�gœ�<a�4-�:�߼<�k�3���9�y�ly<��Z"Au�ߦ���A���/9?Mg��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:621DB4D2-04E5-44AD-B2BA-1C4CD3C07D77-7317-000022DE035B365E���
Mfile_extension_gzd':93651A65-B373-4406-A096-8E0C60F71A91-7317-000022DE0370F224@Qx���O�q�_��͖�5C�Upfi�Y��*g�EĐ7Ǜ�B��8�I��+2�đ�x_Wu�M7�t�휟�ٜ��w;�;��9ϳ�.��G���(����T:�=t�<c�.�K�}��C�	[�=l:>"g�Ev���m����MCUњ �H��r�T;�.<:eG&Tgٰ���&:��*�͐r(�o���P7�r�����g,��qŒ_�I r�5��%I��~ּ���}��G_��o��TG�YeA�I32e�H��5S��IX/N�('���&��V�w��q稯pa��vUC�0L��ȅ˴��a��v)D�X1��_җ�PG�]��(�dy�aQDϥ����'M
�����4Nã���\��;�ؔa��6%Ĝ9�I���k#M3�$`U��܏�&�6��˳b��I���o�ǰz_J������Wx�绒��jRp̓&��֍��-�0��'�pƨ7A��֔�'M
���m x=�����/1֐�g�o���<iR�u��) ޞA���5D����Y�}]p̓&���=�==�gǼ�p�QU�G1��7�i�U�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:621DB4D2-04E5-44AD-B2BA-1C4CD3C07D77-7317-000022DE035B365E��u
�file_extension_flvd':7D161273-35F6-481F-BD4E-5F76C12E4EF0-7317-000022DE03703387@'x���KSq�GB^,_�"��Z�.5�5T����CI(�F
��BJ��PVT�ºP�?���/�%̗l2&Jʖf����X��E�/�����-��tFr�4k��KS�o�,��C/a���Wu�x�p��ĞA��$}g��� %)�-y̬�}}�`As�'���~p؂8f� O����Q�?K��hkR�hf2Ŀ��I\Ώf��Nᩙ��0�v�(��F����{9��=2�s �+���0�GV���3mpʋfF�[��v�Pp8l��
s�c^,����Z��3��hfl)�:�07BI�,�y��dEĄ��*����gG�{�͌�ׯB��9*��)+��͘ؿS�3�S^43v�/u�����)=��؇5fB�t\�q�����{�͌=5��v���RU��|nt.Q]�De��U�ʨ�)/���Z�S���W�b�x�;�ǖ��Y��v��5K�����l㊘09���n�&�7��6���VWZ��:8�-���~�|޻���F��L��F���U9�E�3�Ҽ���?c��N3�9�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:621DB4D2-04E5-44AD-B2BA-1C4CD3C07D77-7317-000022DE035B365E��_
�file_extension_docd':DF7B7D00-9D58-40FF-AB9B-C0B4E116D0BE-7317-000022DE036F8E95@x���KSa�􂛶t� Ӽ�ƛ�&"z�./�� (ċ3� ��p���EeZ[`�K�H��S���l�dHL�(g�i��wN<f���y~�|��9��s�?��^�&xV�ql�t3���f2�gTd�:�L�
/߆���{��1�b_�`�h*2�x��"�7�x��S}�xnh�ۥ2l�XU�Y��@�;�9�YSH�[o;�6zU�
:-����0P��Yxt&����s#��k���b�������x⳦0�"���l~,$��w��Ǒ]Nsg3(��g��4�i�;'����'�����0��X���)dN�#rq] �Lp�ɮ,��R
/�u�_η<�YS�)P��K�ٰ�k�j3��Q>�W4��5��+���RD�����]������+.bm&Z5��5��3]%�_-@��nk�mn�]���5
��u�yO|�2��܃D��ψ'>k�!�ӝ^����_"���5E㑼'roȷo)�������G�������streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:621DB4D2-04E5-44AD-B2BA-1C4CD3C07D77-7317-000022DE035B365E���
Xfile_extension_htmld':E4915B50-BCCF-4E3A-A2A4-88DDFC85C7C2-7317-000022DE036EAEC3@�x���KSq�O��ZuvqA��_��"�|DFWkG�ܚ�� $��
�lR�Z���
7�a�iⵄ�MݲY�.�}{~gqbH/������wα�����C�H+�V��o;Ņe���n�
��*ڳu���: p_�K��f<��*:%�ڌW�r��A��|N�῁��k��m*�A��LJ�_��B�^�!_\Yo
�Od!�D fA���OI�}o9JZ4�U��k̃�R�_n�\/�gd�eI��t6H�p��X�@�Q	�|F}z9�s1fރ��<��	���_��q��[ཛྷ����v,�
 �kDȲ�Ζ�qb�3hi���=���Ad���@�
�X���JЂ/֣�U��˓&!�,t��Π/�"�s��"�p\���|��u�;L�&�wR?�Q�����Ǧ]�kދ�����MY��,˓&���1תE�v-�Q�i?�Hg1�f�ԥ�f�9�'M���[
0lހoc��L�����H�N#���}��cy�$�e[���Fne#:�Bv��DŽH{1F��mP�9�'M�U�
�l��5��q�h��^��i�n��~��a�J��r,O���F��*K;�FN��<v],ʱ�,��T;��X�2�o�@�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:621DB4D2-04E5-44AD-B2BA-1C4CD3C07D77-7317-000022DE035B365E��7
�file_extension_bind':A2222DE8-C779-4E62-86DF-E7A4A005933A-7317-000022DE036DF68D@�x���K�a���/tA'����d��oK�TF����q҉�V�
:	�&s��Z���e��������{��z�g��8E�4�n���Z�&R��`����_f�]E��a��,��L�K����S�|��Z��sq����?����J�m(�ڭK���t����7����GN2f���a��X�=���q)q�Ka,������1߱9�3�cV�f�����z��N<cV�7�f��b�����8ʉc�|�j5�����Ϙ��O�3Ẍ́�r1�M;R]�1�\�xƬTק/��%�
3ӎ����c�+Ca��E9�N<cV��SiT����j�l��w�Z}�ʼng̪�v����F��:�7gڌ���yq��<�N<cV�?L�P���j^��u���YÉg�J���$֯���U>b��]xs��Z�xƬ��q�x��r�nk.N<cV�G=R�-��ߵ�޿��)��;�)��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:621DB4D2-04E5-44AD-B2BA-1C4CD3C07D77-7317-000022DE035B365E���
Rfile_extension_bat copy 3d':DB8A1109-C165-42F8-A602-A93EC4310B9B-7317-000022DE036D5323@4x���K�a�W�D�5�
5�(H�>UXH/Ӝ�l�Eo�`.&{q���2"ʆ�k���$J�Pd��X%�7�o}=��X��C׮�:���x�o���s�n�X�P��#V������H��t__�i�/SA���~Lƛ��V2�x��V!�G���x�ϩ��8ʑ����C�pl/IY&�	�m;V���ڨ�?�u÷���K��p֭zJ̔��O�'�8Q�$�8^�XG%�e�p�B�qGϾR�_�n f*�}s�N� �8Y�Z���J\k��A�.̥��:G��£KE���Ëdk��&|�� Դ���C+��F�
qO�x��#fJ���Y�<UKv�T�
oF��n�)O̔��{�q���ʘ>���h�Z�J:�\9剙R��ޭL.)vt���W�+�<1S�:��w �3	|z�B�m3��s͕S���H��I;��m���ҹ��)O̔�l܉!�v��\���I���u��r�3um�x������m��/���6�z�k����L�ׯ��YD��K�!�U���\9�-�UF����#��7�a��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:621DB4D2-04E5-44AD-B2BA-1C4CD3C07D77-7317-000022DE035B365E��7
�file_extension_bind':B50AC766-400F-4253-9654-13294B38B1A3-7317-000022DE036CAC73@�x���K�a���/tA'����d��oK�TF����q҉�V�
:	�&s��Z���e��������{��z�g��8E�4�n���Z�&R��`����_f�]E��a��,��L�K����S�|��Z��sq����?����J�m(�ڭK���t����7����GN2f���a��X�=���q)q�Ka,������1߱9�3�cV�f�����z��N<cV�7�f��b�����8ʉc�|�j5�����Ϙ��O�3Ẍ́�r1�M;R]�1�\�xƬTק/��%�
3ӎ����c�+Ca��E9�N<cV��SiT����j�l��w�Z}�ʼng̪�v����F��:�7gڌ���yq��<�N<cV�?L�P���j^��u���YÉg�J���$֯���U>b��]xs��Z�xƬ��q�x��r�nk.N<cV�G=R�-��ߵ�޿��)��;�)��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:621DB4D2-04E5-44AD-B2BA-1C4CD3C07D77-7317-000022DE035B365E���
file_extension_chmd':FCA3C5B3-B773-48CA-A969-4C7CC08BE446-7317-000022DE036BC544@ax���KSq�tU�`mmg;gV^t]J�Etԥ$��QD��%S4�Y�E�E���٘���%�PY&ED�?���X��t��}��y������"�rۊ��$۪��Zt���_���\��\3�O��>T�S����)��T7���t���[������V�R����O�F�Ά��Q�S��#ւGG�XX������k�C�&��5#P�'�|D��Lj����Uz���� LS��h�|�Mv�NY0Zo@��ӝ�X~R���	,+n���u�";��G�/ �d�ˇ��S�w�1�1�~�BǠ�}�iRd��J��
������ �����9��y|�H�X�����W����y�RgL�ِ=�
I�q�����ͥH�7�q�0Ma�?�ߏL��X�N��6��W"����n7#Cs�q�0Maى��{��1yމ|��0	<�XN�L�,G��	���ۻ1�+�p���|�	sC.仌�
�i.��9�y�4�k���NL��d��@!���\�_��j��i��nū��1�/b�_R��U�_1����s�q�0M��L�Ej����Zd�q^W,y�����k��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:621DB4D2-04E5-44AD-B2BA-1C4CD3C07D77-7317-000022DE035B365E���
�file_extension_ptb copy 5d':45A3A36A-1062-4E1A-9E54-753C7A61F5BE-7317-000022DE036B1DAE@Ex��]HSa�w_D�M��}aAC,/ꦻ(bDA��L�(b}��B"���s�lkM%"y�"���}9ې�����v�����Kέ�x8�}y~�����15�Ɩ�`���68B�7��!�6��C��n�����.+��:ϓ�%���@у�g���x�u�g`Y3�S�;Y���!�	��X�:�RW���a�~4��O�����(+VI��7��4	^�6�"0?����;ֶFP3Tx'��iK��2�<1Mb}����&�ֹ�8�5�CR��_����}����ٙ�$�ˬ[�G��첰|�$.��/����IfR�Ta�f���#���4G�Vq�s��4	�����D2+��.���/�x�@{x6������L��]fX�D��*�b(��04=���l�9Ώyb�����\
��1�x:��$v�8G����$���a��\Ay[�w�c���0w�}�3��J�֛ϋ~������yu���T���y��S�[�F��[����?�V��6�/��4�:�(�=��][�'�4�&g"�˕�6��E~^:��jG��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:621DB4D2-04E5-44AD-B2BA-1C4CD3C07D77-7317-000022DE035B365E���
�file_extension_ptb copy 4d':68EE54FD-1991-449B-9898-B1F93AD70339-7317-000022DE036A4C08@Ex��]HSa�w_D�M��}aAC,/ꦻ(bDA��L�(b}��B"���s�lkM%"y�"���}9ې�����v�����Kέ�x8�}y~�����15�Ɩ�`���68B�7��!�6��C��n�����.+��:ϓ�%���@у�g���x�u�g`Y3�S�;Y���!�	��X�:�RW���a�~4��O�����(+VI��7��4	^�6�"0?����;ֶFP3Tx'��iK��2�<1Mb}����&�ֹ�8�5�CR��_����}����ٙ�$�ˬ[�G��첰|�$.��/����IfR�Ta�f���#���4G�Vq�s��4	�����D2+��.���/�x�@{x6������L��]fX�D��*�b(��04=���l�9Ώyb�����\
��1�x:��$v�8G����$���a��\Ay[�w�c���0w�}�3��J�֛ϋ~������yu���T���y��S�[�F��[����?�V��6�/��4�:�(�=��][�'�4�&g"�˕�6��E~^:��jG��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:621DB4D2-04E5-44AD-B2BA-1C4CD3C07D77-7317-000022DE035B365E���
 file_extension_ptb copy 3d':0A8227E9-EF9C-4910-83B3-6C6DD3B1E89A-7317-000022DE03699079@Ex��]HSa�w_D�M��}aAC,/ꦻ(bDA��L�(b}��B"���s�lkM%"y�"���}9ې�����v�����Kέ�x8�}y~�����15�Ɩ�`���68B�7��!�6��C��n�����.+��:ϓ�%���@у�g���x�u�g`Y3�S�;Y���!�	��X�:�RW���a�~4��O�����(+VI��7��4	^�6�"0?����;ֶFP3Tx'��iK��2�<1Mb}����&�ֹ�8�5�CR��_����}����ٙ�$�ˬ[�G��첰|�$.��/����IfR�Ta�f���#���4G�Vq�s��4	�����D2+��.���/�x�@{x6������L��]fX�D��*�b(��04=���l�9Ώyb�����\
��1�x:��$v�8G����$���a��\Ay[�w�c���0w�}�3��J�֛ϋ~������yu���T���y��S�[�F��[����?�V��6�/��4�:�(�=��][�'�4�&g"�˕�6��E~^:��jG��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:621DB4D2-04E5-44AD-B2BA-1C4CD3C07D77-7317-000022DE035B365E���
�file_extension_ptb copy 2d':7B043E90-924C-45F0-9A91-914255DA508F-7317-000022DE0368EB2E@Ex��]HSa�w_D�M��}aAC,/ꦻ(bDA��L�(b}��B"���s�lkM%"y�"���}9ې�����v�����Kέ�x8�}y~�����15�Ɩ�`���68B�7��!�6��C��n�����.+��:ϓ�%���@у�g���x�u�g`Y3�S�;Y���!�	��X�:�RW���a�~4��O�����(+VI��7��4	^�6�"0?����;ֶFP3Tx'��iK��2�<1Mb}����&�ֹ�8�5�CR��_����}����ٙ�$�ˬ[�G��첰|�$.��/����IfR�Ta�f���#���4G�Vq�s��4	�����D2+��.���/�x�@{x6������L��]fX�D��*�b(��04=���l�9Ώyb�����\
��1�x:��$v�8G����$���a��\Ay[�w�c���0w�}�3��J�֛ϋ~������yu���T���y��S�[�F��[����?�V��6�/��4�:�(�=��][�'�4�&g"�˕�6��E~^:��jG��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:621DB4D2-04E5-44AD-B2BA-1C4CD3C07D77-7317-000022DE035B365E���
�file_extension_ptb copyd':FF8D7603-C25D-4431-80E6-6C25E00BBE5F-7317-000022DE03682D54@Ex��]HSa�w_D�M��}aAC,/ꦻ(bDA��L�(b}��B"���s�lkM%"y�"���}9ې�����v�����Kέ�x8�}y~�����15�Ɩ�`���68B�7��!�6��C��n�����.+��:ϓ�%���@у�g���x�u�g`Y3�S�;Y���!�	��X�:�RW���a�~4��O�����(+VI��7��4	^�6�"0?����;ֶFP3Tx'��iK��2�<1Mb}����&�ֹ�8�5�CR��_����}����ٙ�$�ˬ[�G��첰|�$.��/����IfR�Ta�f���#���4G�Vq�s��4	�����D2+��.���/�x�@{x6������L��]fX�D��*�b(��04=���l�9Ώyb�����\
��1�x:��$v�8G����$���a��\Ay[�w�c���0w�}�3��J�֛ϋ~������yu���T���y��S�[�F��[����?�V��6�/��4�:�(�=��][�'�4�&g"�˕�6��E~^:��jG��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:621DB4D2-04E5-44AD-B2BA-1C4CD3C07D77-7317-000022DE035B365E���
�file_extension_ptbd':587F6844-CF89-4FFB-9E2C-2412F64E6630-7317-000022DE03678849@Ex��]HSa�w_D�M��}aAC,/ꦻ(bDA��L�(b}��B"���s�lkM%"y�"���}9ې�����v�����Kέ�x8�}y~�����15�Ɩ�`���68B�7��!�6��C��n�����.+��:ϓ�%���@у�g���x�u�g`Y3�S�;Y���!�	��X�:�RW���a�~4��O�����(+VI��7��4	^�6�"0?����;ֶFP3Tx'��iK��2�<1Mb}����&�ֹ�8�5�CR��_����}����ٙ�$�ˬ[�G��첰|�$.��/����IfR�Ta�f���#���4G�Vq�s��4	�����D2+��.���/�x�@{x6������L��]fX�D��*�b(��04=���l�9Ώyb�����\
��1�x:��$v�8G����$���a��\Ay[�w�c���0w�}�3��J�֛ϋ~������yu���T���y��S�[�F��[����?�V��6�/��4�:�(�=��][�'�4�&g"�˕�6��E~^:��jG��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:621DB4D2-04E5-44AD-B2BA-1C4CD3C07D77-7317-000022DE035B365E���
�file_extension_aced':B7C4F623-D892-486B-90FB-A99EA25A8EA9-7317-000022DE0366DB1F@jx���K�a�'�N�r�fbK�0ù�e�`��3p(�ʬ��L͑m���u�}hn�m�܇���X��AY`�*�J:	:���~�7D"���{?��ޫڔ�>N�?)K���,S��+��o���Mݕ�_g�2�Ɨ�~|������������:Tf�ݤ�C����q�A�@W��u�Y��zhM���
dz���A��2��[���'v�G�D6��m�B�����'m���o~@5	�/E�5���V�[U��{�doG��5��^$���&|���T����k8���>}�i�^���5H�Z��a1��N8ɧ���K�{r�Nec�a<��x5r�n�v�1��,x�H�;ֿO�!`��l��\��&�:�g��\<4��1��v�O5	^�{Ԃ�My|
��u�
���^��W!pAMgy��>�$}
�M5k4��FI�U�
�^�����c�j�~3؈'m�1jVae>J�UxmV��B1�O5	^�
1y��jj�e�� �#�Q,z�SMB(O��Lۏb�Z�IK&��bx����g�ا���b'���T �*G̥G�[��yO<���>�$j�F\i�
{��֒D������*���streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:621DB4D2-04E5-44AD-B2BA-1C4CD3C07D77-7317-000022DE035B365E���
�file_extension_rtfd':7A7AE012-6ED6-4941-ADAA-B810F40DDE18-7317-000022DE03658E24@>x��Kha���"�$�$�ͣ&$�u���•RPՅ��`��R3Ƙ���Q,TT�"�U뢢����dL�HR�,]�P�

�H�x��Lb~p��;���y<:�*�����G���%/0�	�B�˔���ǧ;����^A���Hx��B\�@�D=�i3A�o;:[L�������PN{�
6h=Əa�݂���"��C�i�}
(��!p"�")�J5P��#�ǚ1�^���8v�]1�!3�8z�7,�
XQ����CX9����U�cLC�5��㽘8S��
�"qa:��t؍I��>�o��{��
S=&�U���2Q��Z�	�!]Oߞ�|·_�伎[K��<�ɜ��>�gLC��m��K6d�Us�j�D
�و^�����ܮ���1
�ڊ�+6,'w�ȓ5��'0�cW}�ϘFBj»���:0�F�{r��[���F��Pf�:U��3���6��f�_��_���	��p�>�gLC9�`��P�[�W7͔�2�pˊ׷��s��~�4�[트&�K<[��gI�/I�\��_WN=��?$���K9�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:621DB4D2-04E5-44AD-B2BA-1C4CD3C07D77-7317-000022DE035B365E���
�file_extension_pdfd':151FF549-750C-485C-9255-3469B07D2FE6-7317-000022DE0364E54C@@x���K�a��B��b�� L!�RKSI3�̴eDp"ˈ�ŋ��B2E�!�R�00"����𢚂0-SƲ��Ŗ_��D��>�}~���=q&�8�7�w�8�<:a������	~[s?��+cD-k�z���@l�K��%G�"Frw7D����h
�C��.H��!5y����d��%c�xp�B�Ob�:�9�mH0C��w�CZ�0������V�����l+sQZ�s�K�˞�6о`��[.��T'�����}�nnʎ�)��L�#�̴�`O����|r2ޱa���xO����<���^{�̐%��S��=Ka���fy0���k�,ֹ�\ﵧ}�in:E]�ϓ��b��"��^���vQh�� ���c�|��ƣ��p��M��h�r邗�67�G��3<��Hh_0CIqꡬ�Î�����p��Ge����_��{؅��`�4��˭~y
N��}��e>��}��꣢T�6<_U! ?�����El����mO(�"~��������5�>(�]	��P�����t↓=���R�����d�	����streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:621DB4D2-04E5-44AD-B2BA-1C4CD3C07D77-7317-000022DE035B365E���
^file_extension_mpegd':006E318C-BD27-431A-AF83-E3B0BFDF3832-7317-000022DE0364379F@8x��MOQ���@�?���Y#cܘY���J[m���UAB��ݸ35�%�R�$��F&��4%��i
ƥ}9g0��҅Orr�����L�f��v�v�����>mZѕAvX�K@^�C^g��>��z����S��
�^�d����Y$�	������X#m;��n��߬��8�6z/\�"�z����]X�K�;��qh�3�iH��+��M���p�a�m�وlċ�@�z�H�+Q/�>�ip>���Z�X���'iS�&��#�Ȇ�'v,
��r�����49��ψ��d�N٤P( �D�
y0y��O�tq�Jg��o.U#��s��"����^�y�݋���[��"��I(��/�tg2�Ol��1tӁ}`~IB�\�?�i(�
���U�_ۣz�SL�煇G񮳆, �c�ۈ�[��yfx�=�)�!���-t�{d���l�:s��=�)�����H
d����c�b�����߈��D|4���>{�SL��HM��d:Wj��۔��Ǿn+��(����mR�
�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:621DB4D2-04E5-44AD-B2BA-1C4CD3C07D77-7317-000022DE035B365E��j
_file_extension_mp4d':B87DDA57-9B11-452C-87CB-C71D10DCE80E-7317-000022DE036371D3@x���KSa�_��us/n;�`RHЧ>d_�(�"�$ej�L2�9b�#
�
2��Ȝۙ��|m�Az� $�"���l>%�.ι���g�^�}�Ы�^%���c�K�U�.
��.?�#s�ȟ�9Ѝ�}kz���܁\R����Jd�h��A0�������1��D��Ze���~�����@ẵ	�V�$;.��z0�#��v�o�E1Z��M�9x���
�)݉��#ލ|;3)��<�@ᢇ���%/L���5���2G�$�؅-l����ӈ�.{��O|�2M��Nz���L%��Ӆ�>k/���)݅/��xy͋�+���R�(^E��^<�YSȼ���]>��ncc�w#Lv�ě~k/���)d�������.;[e>d;0s+��~L�|j�'>k
Cw��=��k��9����	b6����ً'>k����(�P��}��wva�O�\�FE��Ϛ"r��`��+	05XH�=�c%܉'>k�����ۿF|�~e#��Gį`���0�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:621DB4D2-04E5-44AD-B2BA-1C4CD3C07D77-7317-000022DE035B365E��b
�file_extension_txtd':0675C424-B6A2-4128-A197-5E9EC0E334B4-7317-000022DE0362C35D@x�S]SRQ��z��z�%�fl0��,�@�eȕ˽(4�H�]���5�������c3=�Z���2�5���c���9��x�M� ��|l@Em����w
|>���j���:>�h7_��l}=�\ʻ ��M��ىAH>��G~��m@��B�Ӹ�sy��3�=����a��#*�dw�{���Of����]yK���Y���03B�F�9�D��U��>@�n�����md.���0�!�
"7PqU�����Q���2Zo����z]��C���c*�Vc��/�u��E�Lj��;a��"זx.щ�6:{=pl��V,��<ةQ�=md�_[��F�w_H�R�O��a�/:���A�U�����6��'d_t��̓�w�<�FQNE��6߯�qIE��Z�S��=mt��U�Q5�ҍ�L���Ɣ҉�6|�m��}:V�|5��I��3���=�t���C���B<����*�?�")�v�7���y�?(�S�|���r�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:621DB4D2-04E5-44AD-B2BA-1C4CD3C07D77-7317-000022DE035B365E��J
�file_extension_exed':942D4059-6B5B-4B16-BBC5-36E294E422BD-7317-000022DE0361715A@�x��Kh�A�5��&�;����n�u���nܨm@�֤��u�*4��EC��[��E4ŶI#���.*�Ֆ�9�L)1�\�����\l]p;�
y�+���Q�7�4@Y|f���3����3.P4�y�:�<�סsPz�7�ί�fL&�lg'�S�y⌬��R:H���	{L׌�	��0�� աӸpls�1���2r=-,/�W���4ae"�l��.I&�=|`̢y�G��|O3r�7"ـL�z����M,���G�˅�yW�,�/���Vy�[ֳ0���M������rQ����fc
W[�'�1����W�����v�.��e�f��<��Y4/�����nZ|J��(���Y�˓ϘE�׷�(��w��;��ækڗ'�1���h7*�#��}y���e�����8�����w�˓Ϙe�k+jca̿lg�Ü������ڗ'�1K����[�Y��;k���%���S"��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:621DB4D2-04E5-44AD-B2BA-1C4CD3C07D77-7317-000022DE035B365E��Q�applicationd':9D4AFCE3-1E59-42D2-AB1C-D4C2B0A3214B-7317-000022DE03608265@
�x���J�`F�i�.E/��tv�"��R.A�n�$iuo@�T�djli���=u��9p���9!ͽ����V�%��~��7{>�S�<�=mh��+�|�Q�dM��us�mc[�NkI��A�喒�m%�;�ec[�NsAe�
�vI�(R�5D3e�h�����K�b-B:L���d�a��eʲ��l�6���%�D�x�m���[*��K�@6*v����Z�����G^�5�mKCA��,gP�o
���streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:621DB4D2-04E5-44AD-B2BA-1C4CD3C07D77-7317-000022DE035B365E��#���Layer 0d':C24D76FC-604F-44DD-ABC9-DE5742197FC4-7317-000022DE035EDBD5@"x�ox�}XU����X���Kl�-��\�1�������^� �hb��{C�"*T���H��׻���!`��=߽7��Y̞�w�̞3�2{�8r�H���q��ْ6z'%��?�={vE*�@�_���̜9�(��W���	�=UC�,,�'.eXRbi���?��!�j(q���DEE�J׎���R��ܧ ,4�a��CC����X���r���q��N/u��� ..V
�c�����CH{)�C��S�z�j�89����HJL������M+@�)�C�Dڦ���LKK�S�))�HH��U�4�H]��.��HW����
W898"%9�V�륞��l��ٙdr����dee�m�=ezH\����U�Vᄛ��L].V�=wvrBFF�
�����g��a���L�<4������n'N��ŕ)�4W����L�;o��L�%K���4�B{{]Xe쉽b��d�����j�q�����p]��˪�p.�f�!���\q]ݗ���8��<ω%�Ȕ(v$��2(W\W}�8��h������+8�M^ҏ�e�c��Nʩ����@�s�z�[��5��_p�w{�PC�\\�����ԛj�����:�;@�/�f�VԶۉ�;���w���_i�R��P�]�ߣ��v��Xtr3[oDK��j(q��e�B�K�B������5����]�FG�g�3O��Q�R�h?��#�O�b�٭��g9>>�M�`�Y��y��C :�_���%	ؐ�@�T���*M���b����\���\݇�W`i|�VD�N��P�/v�Q���[��C�
�|r��]OoBwO](q�;��(W\M�c��o.\�Ƈ�0)!)�b'�l�n��-DG9�����\1��9W�)g�缲��I;�߻�[��'�Wޖ�ɿ���/�V6�{�-�gt	>������a�r�t��j��܏���ۍ��f�ί�Z��K��Roa�
As��e�L/$��A��<9���ɧY�8�`����/�m�ޛz��p_�	N���{�y��j�78��3M;�N�^�	VK�b���oW�7����0Ӵ���z4���I��%��'�e�4 �J>�B�"_��GdE�(�Nj�Ba�/�ϓ_�|�z��d[.���bl�u����zk~��� �k�J��4f���X���c���oC�LJ��ޞUʵ�1K�\K�R�P�%�Y*8Vr�ͻ�Ժ.*��v���mi+eJ�B��4f��R�T˥�s�sL�J���0K�%�`�,[%���O� [���Z�TH�V,ӎe�:o�o)Kʔ��r-it���h�|���-�'6b˨$}�<d(~`��?�~C��ǁ�ᧁ<h0����Øv�7���tN����˔�M��o.^����#�
��Ч�p��F�:�9^k�n�Z��a;���#�������3`8z!�}6�ίF��
d8����OCis	bK�F��v��R�:Y'g#�u:�\g ݞ�a�?�ڈ-%�4){�`ں
�/��\������^8d�j#��`�Q9|8��F��m����oz�8
���Gc谑i4bK�ƍ��^1h�8`_�X7����l�g%ל0h��xAl)1���c0��ζi�d���|��9�?��ԏ��#!��`⸱8w��Qo�Ӱ�t�?hm�{Al)1��	�1v�X9�}7��Yj�'J�ۍ��c訉���Rb�)'�~/�3��ߟeG��dk�o���LRmĖL�<	S'M��I�1n�4�?���8f�45M��Fl)1�w�}{~洩�ѣ����B��e<?����da�<��wx�wx�w���w��:}XH���Q�_XYZ��r���!�����pDFF�)���D����@}4�e���H��Ga�����=�	�p.X/��y�Ԥ8�{�����I����.����1�LK�21�ή��}�n�-P����gjj�������6�R�)��ca*�s$��4�R�>55U���d�!6>����g��(`Z�N��p�s���(Z�di����td�9���]���\"FP?<0
х#�����4����ONN�J >���b�#���j8�Ǘj(���v=Aن_}#s'?Z���.7���ȇ$�ou��{IxW�㎺.cJ�aoo�S��hjv_���Wkn�d�x����/�YȚH�F�S�ÿ�c�M��L�դ\V�6$�\W~�C��EҴ@��u�z�?U.�J�������8��L�#ɜ�	D><��?T����v
"�Dd�iD�Q����FNv*�t�0\�j��g��E^$���<S��v�Z��������c�� .�
�R��A�1��I��	�אv����ϴ���z
Ğ2=$.H��K�+�L�P){�� 9&��@I� Ğ2=$.HO#�Ɉ(�a�*\p�w�z�ᯔt�Ğ2=\Vԁ@l��ɸ��L�|��S���I]���N�+��a>J��Ğ2=�d���S�����I��+�0J�؉�b����b�/�~���ĬYo�~��:�?{��Ŋ���ܧ@֋�n�(q����`��E�b2n1�{)���/�^�u�F��ZJp���}���1ʕ.[����c,���_m\P�J~�}�JU
篦�5c~ʙ���TL:r�?Ѝ���7A�R��R�B�˺1/������߷o��	I���p��e+�hѢ�nC��{�(�=2�M���7�z��>hh޴�V�L�^/kG�r�<��|��rua�!̚�j?D�R����QB aJjm�Y���y�rmG�C����k�G֎��</��#���K� �e��Ҋi:l�GZ��3Կ���MY(s� (��0u�cp(�Ї0�)4|���~�M��܋=�S��0��&�:C�HGe�,L�&�6��Q�L��GN��4&��R���!f������..+�k��{EE�^�a����ngv�h��{=ά��!��m�Z�&�e\B���x��/Xb�|WV����-��a�!�}���p�|��`w���\^��fPB����)���ÿ��jR��)��r'c.s�{��B�hG�󙍉�����|zi�����!S�+���vt@��돍�7�/��&�F�({4}�%�l�S���P�vb�EW̦�r�aq��S������JGn�6���q���%l7~�8�G� q_#,v닒ז�u�+n�U�zi*��x�� �y*&��D�Qj�B	�
%�n�uF�ƈ�^�m��j�=\\_�'� �&d�X��k�$�A�>H���0�g*,Z��� dgԿ2^�j��3�LzD�B��H??	)�#�$�C����2X?��D���x��Y��b8����w^V-cÕ)8qa�z"��h�D[�zCǀ�<S�q�� tG<�\�ay�ʕ�����1"m�B��N���0��z˘�߇�'B��0��`,q�^,��޷�������Zx|�9ߙ��s�6;�
���"��5��~���ߡ��0�޸`VK�^�TѪA�i�qo}<;�O�7��}��G
��:��������ᷲ2>�=eyQV�pg���VwwV���+!p[Yl+��}��]���,���fzߊ�v�jg����skk���pbY��ٽ�[K>)v���W+Rl5J\��!�S��W��~~�jZ;�~)���GFF"2*
���d"�LJ�b!�~)���A�\�����l$��)��KLFL��LYF�<�q{��<pp�@�-'�\P���;�}�Ǹ��)�OHD|b��㩦���@�{��w���8��!��w��}�4�Ҳy.7#��,�YbYS��Nn�7�#��pY�A���1�:�_Cm�o�i�v�uyla;5ػ�����5��-��b,���UmX2x!Z�cf����N8���p�@��	.k�����0��̙e���@8O+G������J�Ղ���C���/4r�_ACqf�Ljy~�<�x��_�0�>V+�S;g7����*������xvd�V��%����	�	�h�W88�J�H�V��s�c��_��ׯU�Z�������쵹��v066>KY^��O�ߡ��~�ŝ_�{o/xm��K��Ÿ�����p3)w�ʨV��A_��T�,��%?�W#�b���գ�|�����.���<��2[O����?�p��o���ᳯs92��������枾�iQx����?���+Y\���bs9�R���IJ������?+~�KB������uT�g$� =1I:ʵ܇������9Qb���ϋ|t
�i�H�DVr �����e�{�#:��%��m����>CF|뺃��n�J�[��UY�Z>���M��J>�:�
�Gw����Y�N^�Թ�6H�5��4�4n�D�o�-�G9d}P��
�v�����.��ܤ+�U�{�〃�@떷�2N���e9����OP��}���@��w��]X�k"Ѹ�5�u��/��ĉ���5k��$s��X$�;�p��ƚ�Jbd��q�k������M�U���=c?b	�Q�a F��]�^��O��N5u�>P�ƭڵ�.�oS�B��2�V��	�2\����F�?
�t�Ѥy�Q��IA�f�0s��NK
J�r��m{�[�h�m�]�-�&;����`˖��]]����)64-��:<�3f��O�@�?�3�/��)C�		������2$_ k��ܼyC-C(��2=$.�=������{�� �k��Q ���!q��;�����~zcN���U^������)����_����Y�C��}A�S��e�A�k����߹�������@�ž ���z


�b����c�S��̙�$e�����jڛrR��'9�*:��?�������Nϟ���m(�C�S ϛ�4J\��g��y���Ȟ�@�7���(�ί�����I˺_=M��*T�s�3�̡������3&:�V�R374��a�R�W/�^���Z��������1��h[M/�
c��eɎ��_жG��x�uE)���Ca��z�P>�]~H@ӎ���2����CALOOen�<�P�q8�w�A�f!(��O��w��y����yn�D�o�ѬC:�':��B����?h�8S�ll9�buBP�u��v�2w^��3�i�Zmb0aq���_�7�B搴C�E���
Ν�X+������ƥ�1o�L��)�򦬫���~���o�?`o��#9%�W�1�x����Wб�=�Wt����`��XH��oi�xJ����-e�^�ަ@��*�Yy������ͣiU�^|T~&$�r��7�X��HW��k�z�S���J��x���*Ebp�8{�X�z�Sy)g�rr�p�'U�h��&&����Wi�3x�|���c�X��Á���^,�K%�J�h^=�+_{��5���Y�ޕ�
JZ׉a���9��m��B��{����1��������F�O�Q��^�$���<���H�md����i�P�C��)���Ͱ��?��wn'�1���������.]�e˖�S�o�R�����ߋuӛ��B��>�@ΏD�D�툌��[�J�'�#*2\=�!�{7���j?��A��'~/.&
��q�ߺN;���r��6��+a��½�/�O�YI�h���y��WPFh�;`��zR�BӋ�KL���O@���aƝ�):�	�.�ǃ���V�
M/�.%��.+	���� ��BU�~��rƾy�zhz�yi�y�IU�7�������~';�zhz�{�i�y9�x�>��������~(��s��U�FJUhz��ܬL��d�|8�\����nS�Ǜ�_����r��&��e����)����R�;��ؽ�y��܋F�NN�p�T�$<�q�ϫs�F
�c!i�ğ��)�*��5˵�k���?�}j���,�+��Z��?�ё���@�<�j�N��g!�d��!cU��?a4�5��ZUTj싪]�ְ44Iǩ��g�^������lonV*6��;�����{�e����4�~0'U;�ō��f�qI���=9�;}'�+��(�F��M4��?���I@��!8���x\�3�L_ބ@�/B6+�Ӻ�ޤ��i����Pg1��g^�wj��sB*�Y�A��	|)�=�V�5��?�id6�15eM�����C殰���'�?����I�r1
����Q:���z��K��[�����1.�'�O#$�g�R�օfOs`}����m��l���^ł}�}rp��EL�c�n.k�~g�B���g,Qj�x(�S�\��E&�����?~���	���S�KK��׭5�i���UXZY��Q�x~��E�2�y�g$שr%53�9��w?_�>�����ᙑT\�:VC��C��v�����0�,�L����oj�OH���œ��8��:W�75&%%!�.�z���{���[�:�#$G���3���ojL���U�V��آ�~����C�C/،ҥ;L-�׋�Ԙ���z,�o��q���Um�8�"<LZ��L�Y�������333�)���g���i�W^-+1$��,wBIu��Ϝ���b�G���h~��D/s�0X����`?�L��SΜػ��Ѽ7�'��}��C��������Bo�?�%�����z��O(q�����/ez�x�/SSd���������
�Wt4�b�M&�H�d�����^��Ƅ�x�fBYP����0�b�	J��E�u�r4��-�ɉ�\neSWO|��ď��P�6�[�5xr�WX�O��-�)��Ȧ(?Fk�i�x|�W������/E+�G������e�,m�N.��+J���k���V��B~����X���,�y�ʮ�
��vBU�"m��_<$�j�����
��c��+��Go,���̾V�!s�0(�
��l�"��PԴ5��j�b+[c�Uy{�چ�����-\�7L=�N�\:���9��Z�XbU[TX���,mx[�U��P���m�/$$�d�=���oL������֔�!�)'~O}��EbL(S��{�Ͽ�|�u<�p�5(�Cƫ@�RGJBz����c���?Ԛt5'���u&��ь��t�U4�r^���_|l�������2��Y*#�	Y�$c���ٜ��|���Ͼ�	jݢ�?��Oֱ�to|��M�]�9�X��_��'T�}��Zu���o8����5��vK��բ�8�O�ԋ�����O��cX����Pw�5|f|-�ݢ>ޠ~�yŒ�4�2���>
�o3n�f���f�^�5���I�Gg_e���hn����1M_�{�CD�����rIB�!Է�5�����t�kI�MW�2w
B����gG�RB�v����_~�'�:<������̺���#?�^�6�y�o�~�W1y����n�,�oV��HK���o0�B۶m������O>I�w*�>�D�b�`cc#�עq�С�
�VQ��+W�'�����ѣ�^a6�S�|�7ҷ'���Ê)"��&&&�:u��?���J�z%F���[�n�v;�kz�̙+nnn��&�gõbA�~v(��[������]�U�V�����,Xp�y�D�~�ХK�1��ٳ�Lz+ԬY3�}���Xͨ�~(�ϱ(/�6l�����F�[1�"/���(U�FY�v{�[���f!>�;9���V{��%�0����G���[�O/�~s�>�e�[������=�b�hU(Jh�}l���f�e~�E��'P.��*qr%�~ͷѬP|z`vz��S�ʅ���,{��3J
G�+;P�{�M�3hV(jr/�`�.�s����ԧ�d�'���%([��f����I(s�֨[T�7��=`gL�Ks�C_�/1���K���ܖ����W<נ���Ӭp�*�;�s��g��{�����E*^�Ptې\�v�޴z5ZT�_dE�0�f&��Ӹ_<E��4�2��o���[)M*�+���E��	�ʌ;f�	���pw�uws��%�ٯCщ��Yܺq
W�Wp��\��%]��BQ�F͎�\�����T�T��p	�?+r�G���:ҬPԮ�~��a��,��d�8ݒ��-��Ƶz���2�PT�f⯣�{`�:���N3/�y��]���[s4u�.OT�2ڌf��� ̹��;�?���];�}%�~5�ng��^9:�໘84��m>Ygm˪��JV}���'���^�o���=���c�7p
�']�Өn�!�����[�4+�l���~���D�҆�P~\����E��W2Zl��J}���h[�:,�¾G��v�ϭȰ�Uhn��Y�ͷ\}e��.rJ��P�x�*���j�l��8��8�ӬpT�=@��p�R������)q]�Gh��������P����t;T�˩ܢ�Y����L~#�ml���l��
�ip����V)����.R��~-�����5}���@�_�P��O��ZH���S�KT3���3��(����q{�����d,�MB���~-�4����KY���K"Qd| ����.Ro�1��e_�}*m����VQ���B{�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����:621DB4D2-04E5-44AD-B2BA-1C4CD3C07D77-7317-000022DE035B365E��MASKSPREVIEW*�@*�@x�}wTWW�5﬙w��3��ݨ��"v���k�I4�b�^#bQA���PAA,�b)���E�+b��~�O��$�Ǜ5�;{��s�s�>�r1k݇S�	�cJ���:80����Ү#�׺Oi�/N��-�� y-�Q�i~@�R<
��ˇR^���^�7�:Ǫ�k��#e	v�*������B-F80��8#nfm$��C�]}���bϘ����w�
���l�M��?4�3��L�k��sj�u�-N����=�"�9��:�Mǁi�xqp&��!١ٛ"qv�������l���g1�Pk]�cm����H�o����s�ǥ���d[�����$�p<�t�X�E�>+Yd�#�Ƚy��#�#>������Z��k��[�7�zx���.fH[\�<��H��7�9�
v��l��i��QT_�0��.���q�*x��)���m��ZGY/:�Ӧ#ֺ>�E����uqҷ>Nx��%U��7g_ju�Iщ�6��������8��ח��k
NxTũ�uX_Ok��i�;�2�[�슺d=��������j:�Ӧ#Φ!�oh��k��ҚzZy1�6.��J��֋N��X��8���n�X�ZiD�DobS��A�+(((((((�G���Z�L��t�'�eT�`�����zot�Ӛ��}\���E�Fϫy'v 7%9�������kq{�
���%�/��_)�Ϗʔ��?��Ge?��G�e>.U�������Y��#��<~)s�e�?^�C� dƄ��%�.E�^�p/<��5���%6-)����~=iӒ��I+�t��F{�>�����(L^��ëY��@<O	«�58l�}u�c΋�|��*�=n���\2o�;�����w|�M��0�'��!w�r�z�G�7�kr)%)}��a�g�})�1+�rv�!����]R�%c�ԑ��{�>�-��}m�⬼���d��J.!]�����7��ٹOy�G��e_
u��������D�)�
�-��X�wBn�ҖN�>l�({�<<��@� >�<O�g�Ϥ�s�me���a��7���|DfoY�#^��/���� �‡a�k|�cC9Y��t�s��'H��,��O`�{����{�J�Mvk�/<��uL��
"��i�Eg��I��������<�Z��C�����������¿���{/��=`?&"��*b����q}�ز�p-ze6�D�e�z�L��Z<M^��}��٢~��Z5����?ۢA�n-�ҵy����}L���������܄���6G��ubrV!Oc��gɫ�(u:V�ԃV
��rr�.�����V"/ur�cN"��Gn�?��-CVR��ʳf���|Ө���O2���J�5rR���t
��Ca�z�!�֒̃R�	�~*8�7�<�/lX�u�}4nlZ���e(ص�G4�z�G/����<n)�N�v"h��T�a�ǟ���@r�<^���<�ꌆ5*�L\2��a�1ȋ��r�l�����'Q���&t��X>>��я/,���=�d#s�r]�Y����ݿ6����JԲ��[��8
��<XoW,�B�9�6��c.Ъ�AʺlZ��[����7����#��>�
�,:4��U�_���է���ݚ���l��ѺW���G0��D�����������b_9k�cy�_�(�`�
3˕��J�������m��z��������k��{f�)Jy�8���&H���|"lX�����>������Ⰳ	R�i�Ji���u�_� ��vN���F�v�/�q6#ͩ���!�"��3�:��΄!}e{D�^"H�Y��Q����0����g8��c�;}��åU\u؛���]��'�jϕ6�yb
��G���ˢȺ��Ο�ű�b�/<�'=>��d�p���DO��]�ˣ��wڷU�)�*��fZ)�@�E'z�tH���W~E%ˋk���ڎZ)�@Jщ�6�&/�ej���p9��VJ,�vщ�6�$:�jXw�J���N���ىqk�0dl�������.:�ӦcςJ�IZ��6�t��~G�R/�=m:,��I�.�
Hщ����J�U}(E�����������3�^��Xqm���w��������;[I)ߒ��ȥ���Xi��E �ߎ�E���gZ�8���|��D�I�M~?3�	s� �~��ۡ��A���}�=p;�#hl��t���$�
E�AH�e�1a���#��=�?�>nmvӞm:���Iv�9B�8d?XӉ�6glr�����av?$�쫕��Z]��P�]t��M��7��<�y�H������(�=m:$��a!�xP�:���8<o i�]�/��n��6NӉ�6_s�ޑ	8�5��1�$�zi��i�g3
WC�q��c��񞝇h<�6
'|&r_�d��4��i�!�u�8�3������j��M'z�tH|9Ė{U�Y:�|�i��3˧r��4��=m:�gp��ٸd�"%S�E'z�t����}(EO��`bbb�o����������Ÿ�]�Yq����8��c� �
c�b��%Ο�����5�2y��	��Œ�m<>	�!-��?�q��2�>��@-Gf��gװ{Q7V�Nm���VE�O�/�,h���8��_'��b�󏸗�����ӛ�h��h�D��T�
���$^�<�'<��8�����9��X�?Ɗ��'<9��E��ڟ��N�1���u���I��QpV&� r5'����ߋ���L�}��u_�qZ�}ЦC�?=���d��7B0c��>A�Տa���;Oq�c�(��=�7�[�ey+�_���4��e>*���'��g�\��2�����&d��6��Nh�c�'� _��8����$��-�w�O��oG����o^K�,��M�g�n��~�S�|�|S�g�o���MTr��/��C%�L�q�@C�DO�����.h�
W?z���hm?A�5Yh�PӉ�65]Σ����|��;C��N��0uLˑ���I)K�v��>�2/���������Ÿ��S̳b���\&���Z�,�X���4�{Ҹ/Z��}�ܻ}ؕ\�����W������I�BDO1��R�y>��VFO6EV���.��5��G�"������w��?Gν�����?1ţ��7�<<cĥ�>p���Q����O���o�5G�}^�"fze�;�\����3�c�*��1y���U�<��n�x�[�<?�}u��:�8��zr��p+j����,���7������6�m+R]���{s|���<��]��ДDž���gTy�O!#^��wb��7v����8��I�5�/?�4�@̌� f��=݄�v�ʶ�=m:$��-�WE��2����@,��=��W�;���t.��yT�7�A�s�(ȦҀX[øo���_8ފ�H��*�+u&�+$����w��o��x���Y-�����7,�?������	բ��"ٽ4�!��3��L�e��6�6�p<�:�VT��O�+�����\c��*dU��ӦÉ�aI]<����Y|>R�Og���4~C�nћC�cI^���������Ÿ�M��d�N����;��ԼnRċ�y���k(�R�;�c����~_a�E c e��s��p�7�ɳ�w|�D,-��h:���C��L��G�
�'}�W�H�
��ҦC�'M��>R"yn�8�z~C\^��|;#f�����y��z=�:8���6`��{&έ�#̹�!وk���E'z�tH�<n�H5�ޗZtp!�G]�q
Rc���.:�ӦC�g1�qܝ:�oq)Ԓ�F��W�]t��MG��<7�?N�4�c��z�(��m���N��8w_/��o���ft���$N��_i�=m:$~��;uMq��]�?�+�[��+\
lƲ��=m:�<��;�ŕ�M9mdN'��+����յ_�jp3��.:�ӦC�;:�f���	�E�CƆ����)n�6�)�=m:�l�V��6#�sM!�#[�#�D'z�t8�Tm��}(EO��AJ^���������Ÿ����oX�w-Jb��%��0?�G;�j[�����z�p>�����-pl��a���V�t�ÐRJ��b7��!���b�?4�d~/�����)17n`����C2���~�^F���Y5pp��1����e���F���V�;�s�Ge��;��3���=�g{��S�#�C¬*8�ۆm��l�P����2m:b������戱����́j!�9M�Cm$�y�,8�q� qNT�8|�C�J#iF)$�)�}#��H�W�{�����-��i<�ڃ��8�)s���8��M'z�tH�`KW��|��2�r�!uA�,�gRZ�;��ۿ�t��M��w7w�>�/�>ҝ��,��;"�=m:$�����R�g|��E��<�`qi�'P�yWe�����t��MG,���6�~�/PNyU��߯��=m:���p�\-�ѯ�<�Y��ļ�
�#R�4|KDt��M�|D���g���w��@�{D'zc���W|(E���������B����C�O�g9��'��MJ�xCÀu롕o)qp0�/=�Rw+2w!(W���.��9T�􂁥��S��_MN���r+��/_T�p5�]E�*W���^��?����H`��q|R�=�6��侓j�Լ�Z_\����>�]�K���䣳���tDO���]]�z53��ǽ��9X�>�k�D�:�Є��k��t��M���s�D�L4ox�}���lX
y��;Z�P�E'z�tT���f-�C�f�Ѭ�=l�(@|�34������]t��M��6Ӏv_?D�o�E��8~�9���1qt�i���>B�&1�ע���'��m���-���5K��1���
�a�3l-��Q��i�Q��9�tm���s�q�V�*��Mzv���_���"7b����M����g��w��c'z��W���]zt�c�E�^=h�k,�~��ݞ����SQ��[�_���?�70��#���r$٧' z�t|���^��~���=m�C�3$��P�^AAAAAAA�Oæɍ2����s��ȍ�_7)�-�5���r�N�����Ñ�s
l{T)�;b�ϋ�ysN�p}�J�������8�տ�>ğ5��-�x�UC�	s��C8�R��+��ܞՍ��?���u9��@���:��'=:r/D���Ⱦ���M��G��7ο�!��<����j�W�`��Z��DO���9�q?�;ޝ�9w��b��
>�^=���ûq��E��6v��
k�ή�ׯ?�`�p�:�J�4>�t��M��w7v�EUj���g�_^�x���r������DO��3�;�����0�^�r�׀��G�UOӉ�6q�_�fh�oT�xpb==���N��L,S�U��_��t��M�����亂�7�>5y~Um^��5�!�������4��i�!�Ր�x��|#��):�Ӧ#��<�J��^2�]t��M�C��{�.޶��k����!���J�+(((((((�i�1��_q��[��h�=��(������ʼn�\ �w��+H^Ky�q��,�7�Gs�Uy����8���H�¾)�9V-���ki1R���Q�&ʽ����B�W\��+;�6����R��Z)17dc�o�����]%�C��1cQ_�=$~�`�����G�]���[����O���Lz�oı�ɭ�>�0ߨ���-�=D�c{��Y�d�N+�\\?��X�{D�rIM����3Ap7-�W����fWB>ד�p<�t���}V�?�_`�S˿�Oj�{y�oe~�}�o�_Ov["չ&Ǯ@�W�M�(x��9�q�;�����uB���+͵:�t��xYT��3���6���^�8��
�2ө�1W�/#m~)��瞌�	�w$��U5��i�!q��\c�9s%~�rE���^<E��_�����E�\ה��s�*T�(��~�e��|ƵW����Lqv�2�[j�h�!k���5f~aXu~��,������;�pquҜ�'��ō�5T��TR'�ʽ���s/B�DobYO%yŇR�







�k���~=�?s�CseHm��?t`��?Td\r��4�L����b�P��7��W[�
SQ3
���X�"���C�������W��Ž4����=xoՐ8������W�2�*���gȿ����i�^���a�R]Ӊ�6�d�ȟ�<�����Ã��90�q!
Ɏ�SWB���s�w����q/����n0����C�Ked�[O1��l��-��1F��T�t��M�ę;p������Ҁ�[��o>	�vL��=�l���DO�yo���?���]	Y�7�m@~"�+�Ւs̍~/`^pq
s� �!�{���+�mp��k1`�vщ�6�H���r�b��r��^#u�71���|(E���������f�,�WQ}�#~����]ŗ�i%��]yX~X��I�s�R��`ʌ�
�������@��X5؟�{�>d�ĠX�1��H�!~_�Q'�:l�7�3`��:����.�{7�0,.�,3�?�/�F�n���h��6�3a~�'�V[�T�%�3�"�����M����7����"���s�F�=ļ�X���^澂����$�gJ����w1)�1�x쿕{���_��f�j�!��k��~�o��;��n>��ט�|��J���;Ο3����0��~ڟ�^�y�qo.�g<Ǭ�B��_d|Ƴ�-�gQ�},��y�C��-�>ą�Xs�������M����\�C�u7�S�
vi��?����ҦC�gB
�D��yh�-�?K���ŗ��,b�/&�ҋ��~&��WTE�~q�0$���_��^��_�����Cߣ�#Y?.�5&���,޿�i���8��߃�,��ܟ�iJ��
ћC�	�+>��WPPPPPPP����_T�����((((((((�_A�*�P���?>*P���T������������ͳ[��yP#:
2�����`߷�����.g�޹�t�R�S;��vGr>�<���(c��6���Zl)�aa��8��v=��-�p����?��ȹpZ�#�ê�VJ��Ŗ��VD>��H�~�lg��\�G6�ƒ�1��Cz�n
��p8|VNk��a��Ƿa��x��3�7%l&���۔exZ5�۰�X=�3�LBb�T�WZ7��_�_b�5��x
p2.N��n���T���X2��#�}�x������׌�w{��lj؍�ὉN��8:`<�N�K��R����upu�H���N��x��Q�ԂJ܇����-�]t��M�Ļ�F�9�����T�(��k�me����vщ�6.��"�g�fv¹C[�.
��vщ�6o�D��4�#ΧlòI_���X�]t��M��z�p��N}���{ t��X?�{��X�]t��MǰN_�I���}hKRJ-&�.:ћC�	�+>��WPPPPPPP�Ӡ�?����P�







�)P���_T������qq6V�����qL��&%@�w���
��o�v�R܉�A�~��m�o���ۑ����@�LK�g�=тoq��\DX�}����^�~�|��ۡ��A��~��:��1�{�<F���x �n(�B�,�	3 }�Xq��	�q��qk���<h�!���O��J�!���N��8c�+�;�ox���0��f���d{K�.�a��.:�ӦC���Hs��E#9�;H��2N���N�����Hw��u,=�qx�@�B�N_2G�Ƴm��=m:$��c�p�k"�c8�;H,��.:�Ӧ#�f����	o�=���޳����F������,'i:�ӦC�+�����'}&���M�t��M�ėCl��j�N��i��3˧���t�N�鈟��Cf�6��Gɔvщ�6=;��i{�=r�>��WPPPPPPP��E{�mY<����>�{ö{���@�[/�R�xW�3� r�
�{\|�w�e,W\�c�l���-d��׀��9�>|�d7/B�r�%,��+`�L�Y�)2�!����o�,�CK��9�r�"�~�F�vy�XL��D����?�{�ץW��]W&��҃X�|
���g�1|���ϒ�/!z�tt`�r�9��JB��Ch�@'�k�~��‰\t���jϙ6�_x��_���A�U�L�$ڮH�w���7]���tDO�y��N<ŏ���1$���	��D��#Z]w���N����x���=FGǵ�X����kҵ���N�<��DO����e����~m��G�7h;z������=m::1�r�~�r�6�Br�:
8�k��qF��DO������[��-�0�
��϶��=m::y�U�]��y}�.�ǭ�]��r-u��&��i���;��"�����)uo):�Ӧ���qR���H��M�!���|(E����������S����M��d�%�A�l��Oi=��C�I'��~��'q�8b�#�11N�[|�c���̢�Cƌ�Ǧ�+�uô��hx��e��	�����ö��٠"���c��®�7�v��̖T;��c��DLj���c
�z�v�?�(��t8|��n��m��Q
l���%=WcJӅ���웗�=#�tH�w~*~��~X����	D���C��>��k垹���;�a۝�bq� ��1A��������ӏ��v���9'�=��^�ba�:�8����*�έW0��h:�ӦC��������j�����K�V��7Tk��i�!���։��ϟC��c�,��^��e��.:�ӦC�-Sbi�M��WS2�4�J�-x�ί�f�
ج�DO��ܱٝyb<�F���Mt×u�ٶ�b��=m:$��(��
~�"��c�F�����Q�M'z�t����1���#��{��
�Z�-d�~M'z�t�k42N���?$u�71���W|(E���������ưaó�F�����Ƒ#�0b�H�1B+G����K�Fѻa}06�#<,���`��U
X��A��&�NЮ]�b�s}�t���v�vm�`���,_�~���s	��о}�"����(�W��?��~B�.]��<ʊX����`��yR�s�.F���׭	B�^�Яo_���׮���/>^�n=
Z`���Z�#y���������r�@��ٓN $8cG��<�,V�#p���Ձ+0�r0������
a���wo4H��Ⱦ�yѦC���{_c��laA'�)<\����z���@�
���H�r�&��	��bİ!زq#{�~�!�1q�8L�0Ak��i�!�e��:y&O����B�R7m��O�t��M��������2��N�����:y"fL��Qt��M��~>���=6Ӧ�e����=�sfi:�ӦCbOw,p����-�̴�LދP��n��\��=m:F�
_ֻ-v���y��Nڄ�=m:�u�7j�h֏�cR'zcH> y��R�







���T'���
�����#�Y���%��,1YN���0�9�w���vJn&�F�
���<��VM��V��_��-j�Ԁ����*R6�0.�ۏ�y�cNժ|���߲6nq�����殴4�Huƥ����Q9����c1���F���o�c��&��A#�y�'��('l��-�._�?�ŵ�=m:$����#l�7S�N =�;�uÕ=n����wK�e�Ӧ���W��k+l�n��	Mp2�0��nl}l���S�A��渲۵�|��v8#bF;D��MS����;�iב3;`묎��iG�DO��/ns�v��dDX��׏=[�}�(�.�aߕm�5��i��?����]ݰs޷��ޜN"��b�v;��]�i:�ӦC�3�6ط�;��낻�
sO�������(:�ӦC�S�"֥'籺�e��߱�gĹ���DO��!�82	��pЭ7��~���]5�A��Z�Pt��MNJ�uq*x,�VEڊ!H]1��-
��im��DO���ŭZO�(:ћC��K>��WPPPPPPP�_�B����C�O�g9��'��MJ�xC��u롕o)1�³��G����;.(W����J�C�O/�8 ���i�܊�C�˗�*\F�jWuV�x+W���Y$�S���R�FyLy��=�Zծ�n�:ͪ_G�nѺ�������3�!z�t�����s�jf���-����B�7ѽ��=]�i�M'z�tH�i4����
�hlR���Dp��K̷�f���N����9�}h�Z7��VM�=:���_�F�;h���.:�ӦCb�i@���c�Gh����~��Mj�=m:*2�8��M6��}�6_e���d�z��Vy����[=��E'z�tT,s�F�w�E��yX�#r���|tm��:���d�\M'z�tH<�S>�;�cw�:����+|߾��������y������	\��z�_���1��-�T�缀�xN��<g���z�c�$�P'z�t|���^��~���=m�C��K^����Ÿ
��wȃ_img/src/dialogs.pxm000064400000132217151215013440010261 0ustar00PXMT_DOC�HEADER �@N�2Cp�p�METADATA��]streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_IMAGE_ZOOM_�����NSNumber��NSValue��*��f������_MASKS_VISIBLE_RECT_�����{{0, 0}, {0, 0}}�����_DOCUMENT_SLICES_�����NSMutableArray��NSArray�������_ORIGINAL_EXIF_���������{TIFF}���������ResolutionUnit�������������Software�����Pixelmator  1.6.5�����Compression������������DateTime�����NSMutableString��2011-07-06 14:57:18 +0400�����XResolution�������H�����Orientation�������YResolution�������H������{Exif}���������PixelYDimension��������������
ColorSpace�������PixelXDimension������� ������*kCGImageDestinationLossyCompressionQuality������������PixelHeight��������������
PixelWidth������� ���������{JFIF}���������
IsProgressive�������c������YDensity�������H�����XDensity�������H�����DensityUnit��������{IPTC}���������ProgramVersion�����Pixelmator  1.6.5�����ImageOrientation�������Keywords�����������ProfileName�����	Color LCD�����DPIWidth�������H�����{PNG}���������
InterlaceType������������XPixelsPerMeter�������������YPixelsPerMeter��������������	DPIHeight�������H�����
ColorModel�����RGB�����HasAlpha�����Ơ�����Depth�������������_PX_VERSION_����� 1.6.5�����_DOCUMENT_WINDOW_RECT_�����{{620, 85}, {408, 670}}�����_LAYERS_VISIBLE_RECT_�����{{0, 0}, {239, 240}}�����_DOCUMENT_SLICES_INFO_���������PXSlicesPreviewEnabledKey�������PXSlicesVisibleKey��ņ����__OLD_METADATA_FOR_SPOTLIGHT__���������	colorMode�������layersNames���������trash_32�����	search_32�����	magnifier�����compress�����pencil�����Untitled Layer 4�����arrow_up�����
bullet_add�����Untitled Layer 2�����Untitled Layer 5�����Untitled Layer 3�����Untitled Layer������keywords��Ғ���
csProfileName��Ԓ���resolutionType�������
resolution�������d�H�����
canvasSize�����	{32, 432}������_PRINT_INFO_�����
NSMutableData��NSData���z�[378c]streamtyped���@���NSPrintInfo��NSObject�����NSMutableDictionary��NSDictionary��i����NSString��+NSHorizontallyCentered�����NSNumber��NSValue��*��������
NSRightMargin�������f�H�����NSLeftMargin�������H�����NSHorizonalPagination������������NSVerticalPagination������������NSVerticallyCentered�������NSTopMargin�������Z�����NSBottomMargin�������Z��������_MASKS_SELECTION_����I�[73c]streamtyped���@���NSMutableIndexSet��
NSIndexSet��NSObject��I������_ICC_PROFILE_NAME_��Ԓ���_LAYERGROUPS_EXPANSION_STATES_�������������_STATE_��Œ���_ID_�����;18DCEA49-EC76-443A-A8F7-C33B7F0ABE40-38719-0000A622FFF83A76��������Œ����;B04E2227-A8FB-445E-8507-715014398607-38719-0000A5FC7D711AD1��������Œ����;0828C7D6-460F-46D8-A0A3-17F76E305E18-37040-00009A59C66DC784��������Œ����9566ABCBB-01BE-4C4C-87D1-0B342B8B69DE-876-000009D534597ABC��������Œ����997AB2E81-9E27-4462-9760-F6AA01B147B3-876-000009B8F9D8ED23��������Œ����992F51EF2-97FC-4217-9109-D7BCBC694246-876-000008D641B063BD��������Œ����944BD8AFF-ECBA-439E-AE3B-DCF4874F4791-876-000008CD62DBA8BA��������Œ����9606B053D-0A88-4C9F-B995-4A1465F464A3-876-000008AF7D200E79��������Œ����9A308625B-DFD4-4F42-B24E-7647D1E32544-876-00000897A3BCCCB3��������Œ����93DED5A86-9E91-4497-8896-05443D45274C-876-000008E8F68B3C6B��������Œ����9B488B5C0-15AF-492B-9E78-BF75A597D20B-876-000008D39490AF11��������Œ����9ABC8B5FA-F536-49F3-A247-199BBC422425-876-00000892F8AC9460�������_DOCUMENT_LAST_SLICE_INFO_���������PXSliceMatteColorKey�����NSColor���ffff�����transparent�������PXSliceFormatKey�����PXSliceFormatPNG24������_IMAGE_VISIBLE_RECT_�����{{-125, 1}, {377, 628}}�����_LAYERS_SELECTION_����8�[56c]streamtyped���@���
NSIndexSet��NSObject��I�����GUIDES_INFO0	COLORSYNCLAYERSa��lU$'+�/�2�5�9.A�GxMT� �trash_32d';18DCEA49-EC76-443A-A8F7-C33B7F0ABE40-38719-0000A622FFF83A76���x��{L�e�_���TK���*B�tk�E�r���V�b�G���;(��M74��-CJ�@G8�A��U 8r=p8�� �s~�};tDnK�}�����y��}�hc���^�\��f>͸g�h��կ����N��Vm�g�޲`����9�S���<��޲�^uݢ��k�
$������)
Ě�~S�*��0�^Z���k�Z�*���f�O�Q����FͶ�DZق>�9s�|��_���>��[<��5{�g[<�����3�A`;�����l�߳�-��jC���?X���1[�c�l��5_C�$Ye2^�V�%��؊�x����ی�:+�_��>��9�g�l��S�o��o����k9p�N�8���x���MHll�(111�������hw�f��*�����…(,,���3G��x��AF����w����<���H�'''#<<�F4����w̮��Fgg'���W�\�h4��؄��}1?m��BK�M�DZ��&Ecc����M��>���2D3a���o,..�Y__���\�vMq��ջ�I�#y�x<7H�S�:[w��"���244�x{{Gj�����Szzz_mm-����k,�^3���C���p���2;s�퀥Ǣ��EAUU��-77�
���d����`ppP�Ʋ��>�^(tY����[,�
��� ,�c�r�r��uTVVB��s~���dߗ���ק����Wa�nG\�.����W��8��"���������
�٬��A�ɓ'�%~ʊ��8��������g�.=炝j�O��[��,n�[�_�!��*7�3�����J���<<<��������l���|a$��g���r�\?-�.:?,���è������ދ��J��)����5++k��̍7���du���ǥ���
�n�l��N��6�#��gϵ��@��P�������ȷ���qr�����@<�W*���н5w/�_�DFS)V��bU�8}9W�+** ��m�u?�:v�X=�|���v,�R}�=��c�Ut[��Ԇ7s�`u�W8X���e�u�pK�A�!Y�?�^�׏p^=�����Ν����#2,����<-�s~�+IP�]#����U��t���W�իgG���Yb�]۷o�)//Gkk��C��r#�Y����}sv$Z:Z�%++Ź^�72ñ�\|����淗~Y�Z��v�]��C�׷�����^�^��dR�����e����{��_�x�{���N�������
p�X�V�}�-������
��aII	�~�ĎWƒ�<�Q�	�YX���d����~YG���*��e>=�z~�	��焗ŏ����G�<��̧�>z�k�0_�����h����:
x�_��=s��\��#>��o=�O�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;5B792C89-3A87-47BD-AE80-BFEB96DF95A4-38719-0000A5FA48522E53����	search_32d';B04E2227-A8FB-445E-8507-715014398607-38719-0000A5FC7D711AD1���x��	P����iܢ�D�h�2mj�]2c%c��Bj���5�hY��T@T�ME	�
��B$��lFEQ,MP�I¾\�\���}�~��$�)X��y8�پ�=�?��F�Q�T?�6�?Y[���e���Yc����k�R��-�2�����3�D�g�r$x����DnA�)W�<�e��v�_�ֶA�s��Ǐ�������o�2�	��0���0��XLJLh?�Bk�;.쳇7}�<��4�+&M2���[6u��Н��*��_�&���ƛ	(�.�
1��6d��a�G
�-�]�]���=PD�{����u�ԑzzh �0��a��B�?��Y����!����
9?�w�v�0����1[��u��{&����9j�]�_8�T/��Wޅ�e���s�=��o+��U�n?߹��3��(���߈Cu"�'ؿ���D����	�q^���#�x\����j��8?�z�E]9s�^{�y��'4Y;y&Lh�z(g�7�}y�X`������C�����2�Ɣ)O/�wYE-�a����coE�#��)�
mɄe{���
�w���l/����D��I{�/<���2��K/��P��R;PA��9/���Ptڒ\���HpUh�wAk��O'=*�E�9���	@|���~I�a�7]�K�R��烸��Pg�65�ܨ㊦�W4~�84R[�6�Қ�]Y�|�M����t�
��2��;���}S[<h��#c����N
wj���

�7�Oc����[�=���Y�	���>r+���2Æ=�皼��큾pz��-)�hJ��5{�
�;�)ioN�B[F�>ڋ��`��^%W�߃ao�(3ll|����}�/�қ��9��qv�3њ��t��R}M���IH��nڳ��+;ݹ�\G(�!\{t�!h���̰�j���4�R�d��9�����GW^:r�+7�P�?Agv(	��{lg_A8��&��s�
@W�[�A�
�ܡ̰ak3/����rz/>���HE"�)�s�tF���4%R��V�J��X���G�[��C�W�DA�N��Z�Sfؘ={���`'~�N���Qh/#G�|���(h/��<
�eR���.��p<QJֵ���Z,tU����O�ac̘ѓ���Umӕhe������`��W�K� ��w)�4N�8����1进����y%?eF�ń;�� �����/�B��������� 7�\g��W
�9�U���E*�%�p�$/�?4��u/7ZcC*j�a�~���`��$�1�3�u�A�	lj�@
�_g��e.������g��?#����lh�9@[���x;�b��cY��Hj���9�2ƺ4�5h<�/����a���y#�Xgx�5���PM�:�2#���6;-3|^�3��t$�u����o�X�WI@3��gL4f�&7��m�b���/v��Lj��wL&ΰ�̈!� ߌ�S��.4�@O
�W
45`�]�'�}���	H�rdž
�V���.�fTmʄ]�Ƀ��&fӭ(3b��=1ˆ��-���靨���r�����UqO��Tܯ�B��غy9d�����s�JtU��ؒ��!N֘<L����O�����q)�yO�o�u�J88,�=Ϧn��_��8�8�mQ�x��{�x���ËQlC1v�ɓ'?iI������s�Ͱm��J���E~��a^�-]�r��3�E{��2�Ø�x������aÌ�Zs�K͟�'+��\,Y�b��#�c�q2��'f�)bA����'*�j��2��^4g��+��K^Qxa��K��]�ˎ&��bN����9�7Ē,$�%KTO��gH;6��ܸ�}��كq�	2����)��!�K��Y2���b��J�/i��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;5B792C89-3A87-47BD-AE80-BFEB96DF95A4-38719-0000A5FA48522E53����	magnifierd';0828C7D6-460F-46D8-A0A3-17F76E305E18-37040-00009A59C66DC784���x���KSa��65�����b��i�i�C�uA��FE�QYa�QDDt�e�D�(u�VVn.un:u:��[hJ�~����(��d|���<{���L��"""�
�be||��������c)�"�T:#66vEF�����e���5�>�_��<.w͌1��(�gb?�F�)?�p�I�UWC��珼}��C��W�wo�[W�\֠�sZ�9�P��\�AokeI���=C�ث�;��y�n����5U��SN�L̛4?5��o2�-�ў��z��h!Jr�|͡����ʻz�	6�5�z�Z�%�����^��7Z�yڬ5}�N[?���a}����֢�(���o�(����ޤ�i�����4Օ��-DI�՞h�)��/���`������h!J8W��+.{���%�̩*��Z�����vִ7T��/�u7�g2k�+�;^`|�Z����0�na�ENj�~�3����c��I��v(I��k�B�d2Y����
k+{]�Qg���?���g�t���y>l�h�����E�(��cbb�322V[,����u�-/��8LJ��1��=��~o������@�C-Ν� D��������LS����tո��*Eɡ����G>}��8���n+<vĥ�j�I$�-(����ݓ��er��%%Y�!�����1���Vƀ(�[�T*��K��|]]���dzFH�U�֪T����lӈ�LMI�`
Ҁi��\�Z]�,'��SS�}�80�»�h�ҥ����t���g1��d�����@pqZ�/`,�O�li��F����<������jA�D����g܇�`�3���)R0U�|�؟��O
��1&�d�,@�H�LA��
٢P�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;5B792C89-3A87-47BD-AE80-BFEB96DF95A4-38719-0000A5FA48522E53��� ncompressd'9566ABCBB-01BE-4C4C-87D1-0B342B8B69DE-876-000009D534597ABC�ex��	L�G�m�Q"U�5i�ƪ�P5QK�I�ZE�[EnQ.O��r�}XPN�E@	�h�)g+U��P9D@WԦ����`#T�����������73j��ڛ���tCr��Ҥ�t���HM�f����(<�h��
J�X[��X?���xSS�5ٜY����lHK3 -I�D	8O&����F�]9��w\��~<�%��ٖ,�$�&��Nj���&-���T��"�׮�����n��k�u�	q'����&f�Y!��
罔#��	�{��)�h���AZ�N�֥?\+Iq~��"�s?�O$�Fk9^�Ot����J�#�9�3��uh;=�0n�����<q�Qԕe�UZD5)�ER�VI������.�ٰ�&����Z�9���A`�@��̏h�~t]s#��0Wk5G�3z�!��9B]�k���j�����x�v�ɱ6����ȕ�`Ax-�k��<B��/K�Fk�U4�"��	���~b�G�!�/�S��-8��N����k�-pi���p{B�P#�vު@[}	|L�c�����fH�ل&�c�\næ�M��Z^`��KaY��!�*�;����
{?�%��̐s��CV�����c�L�w��[r:�<�	+���� {�!����Ң�ZS�&��򲇇�6���`�9���|��n��*����W�?���mu�B���'��Plh}�R���vlL��
�mC�qγ�}
�A�p�'�p�
�?���Q�8,�A�gC��EQ2XP
tB����ӵ�T^>����}����,�R�vca�z���G{�A`?�����	�����q�w�������/��V���'X~�
��n��a�8�m��7��Z�0��:b���H9&Կ��˜7d�g������ן�rc(��0���G�u�/뫚�N
�o]��y�1�
<���c*�u�D}���?�44=�&�V��
eq����8�J�'�,O��@VS�����A��]y�Lxg�[y|/�[Q~ꤟ�D��%E��kS^����(�J���&4J��S��|	�����Ȗ��;��u�!����]-x�و�tN+�����L�w�N8���\U�f���4W�9b}�Y��Mamwn**Ɋ��O�x̽�U�Ҿ}=�����sB����ـC8������n)fMBa����ڏ�¹�s��x^���H������L
/D #���Έ�>�%�s�Oմ�5}��fN�!��	5Ba���ǖ&��!II8��L�^���������9��'#E�0u�x#��&��i�:���M�� �zĊ7���T�<3n���d����M�o�������)_o\v!���u����mB�"k�>�?K����"�e�oZ@>�Hm�8��~�H�&�Z��qZ'W��	9���;�1��i��>�O�A ��1t����/�����"�[M��X?G������#5
��	�=m�l\�8�|��5�ۊӢ���
G+�b��8�snK���ϵ��X��\���B������1��\��r#5����1�T	5�}���c��>�ڎR�2G���streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;5B792C89-3A87-47BD-AE80-BFEB96DF95A4-38719-0000A5FA48522E53���  Jpencild'997AB2E81-9E27-4462-9760-F6AA01B147B3-876-000009B8F9D8ED23�gx��Ol�q��x�bXL���]&!�(���@��A��m*E4���v�j,���֕[�aF�Ŗٚ>�&6�n�4��&t:���o�����e��}x���=}*�f�����V욒j�+�{�Z�=��ڳ��T��5�s��^���1LD'�em�ðK�V�{�59���E$��ϣ��e�DG�u��~:%Ƹu�^4ۯ"	��O��fFg�x.�a/�f��J��.��S~�{(�Ѓ;.',3�WΡ����MT��?m���Q�K�Qy6��"�
Zf�R+�D�����Q�X����Y�.���."{)���e#���}���,�s�
ɱ��v�m�l�_[ߟ;��O��?�{G�I���ܒ��w�ْ?󸝔�|ƞ���r�ko�ԃ]ɱ勲7k�<F�0�
8�B2�M�����i��0��Z@e��N��Z�W�D����w���'��l`v��6�֔�֌V�$��L�ȷتmۖɹ���
tT
�M�*�Sd����-�h6m�:��C{�OW����R32K��m�jj	%��6_�W@���[>'u/]��,*�RPrJ�-�����Jj!�ΛBI1f13��MI8�������streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;5B792C89-3A87-47BD-AE80-BFEB96DF95A4-38719-0000A5FA48522E53��8Untitled Layer 4d'992F51EF2-97FC-4217-9109-D7BCBC694246-876-000008D641B063BD@�@x���K�q�\�Iupϝ++A:Qi?H�A��T*���]ZӃ*�DK3�K�dkY�q��{O��y7�o
��<����W�`l��:�����<;���s�Sh֕�U�>o*�ۡ{ϽO#��Ι>=4}�hx���ȫp�Z�Ӧ��;��'�>��ݜ5�2����ɣOc�
����ƴ�~����ɣO�}�]���Vy�K���'�>��ߪ�L/�l٣�ɣO#����i�Ȗ=�<�4b�V1-��
O}��m����e�hx���.��os����%�hx��;���c7<O�n���"�������K�&��2
v����y�Fk�M��GÓG�w~����rی&v����;�f8��H�N��Ӎ3[��6t��Ʈ���k��w�s�GN�����o�Ѡޖ	=�����'Ó��e<����mjk�������#{ƣ~+}�n��=��t��d|߮���8U��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;5B792C89-3A87-47BD-AE80-BFEB96DF95A4-38719-0000A5FA48522E53��,�arrow_upd'944BD8AFF-ECBA-439E-AE3B-DCF4874F4791-876-000008CD62DBA8BA@�@x���K�q��n��s�JK�TjJB�~�`�D'
�`-�C���
D�C��i���K��,���k�=����,�H~k`f�}YQG�z���A����T�F��&�-�󗹆��ߨl'���Ζ�X�u����J���=�,���<��]��Ԁ�*~0�?1�t�@9���|F��^��l֮�L�c�W��u�Gϝz�����zx�4�e�{�k���W6|��FÓG�w~/��Z�[�5e[mt�ۜ�?#W���Ka<G�q���n�;���أ�ɣ������
���7����ѧ�����lٿe��'�>����e��أ�ɣO#���<ۜi�=�<�4b��m��=�<�4ط[_�i��*4<y�id�������|�<�4b�Xzn*��/
O}ݿl�̛6�M�
O}u�ٴ���?t�i���)x��{ϽO����ǿu��=�~��|}U��streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;5B792C89-3A87-47BD-AE80-BFEB96DF95A4-38719-0000A5FA48522E53��=P
bullet_addd'9606B053D-0A88-4C9F-B995-4A1465F464A3-876-000008AF7D200E79@�x}��K�a��`��h ����\�Ǧ1�ݸ���"]d�A�XΘ�1J���n���hr�d�e+	�3n�y_��;�<��FG�PM�:7��kn�ffGs�����X�o���M�l��n03;2���)e��_��a�-�볝Y{e��ffG�ט���5x�;g�mt�.GL�}���v(fvd0�޹��i��Ҭ]ٞ4�<3�K�ތb;�``��X])�l���.�V�)��������vd��;�+]T����ɳ~�OL`���%e�[Meʴ�‰�X�.�=0}c�6h�xiZ�7}}�tsؑ��ҡ�3tݨh��m;����l<�fsؑ��ҡ��&3z�6�GM?ޚJ��x3�9��``�Ѝ� ���yM��v�Lw��5�̎�N�&����_�D��?oeܴ��ffG;t����z�u^�S�ϗ3����`"K��k�$5��$5�Iq�Rd���)��8Ζّ�H�I���streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;5B792C89-3A87-47BD-AE80-BFEB96DF95A4-38719-0000A5FA48522E53��j"����?Untitled Layer 2d'9A308625B-DFD4-4F42-B24E-7647D1E32544-876-00000897A3BCCCB3��xŘkPTe�l
�&o�6�L���h3&ݿ4MS9M5��Sh~i��4�d�
�WXQD.��(`
&�������J�,�]v��s���{�a�C�i�w������y��b����fN�:���?�h�����"Xe^�O<�ܬ{�>h������o�4��i!5Iﶶ�]O��b��KW��1t�j���퉣�Y�ݏ<��,7�1��??��O�d�?���SBr7�:/}K=�Je�TI��trI',$5�I��Iұ`Y���h��fy
Y>}�	��o�g歠+��lmv]�V�+A��Lq5�*��E��\!ا��(���Ji)I�[
)"��/'�4)  ��M�r���N�xW`���'M�{J04^
��Dn."�i�l?�B��t����8�l��PA�y<�z�*��_�ys�_GR�^=�����Mk~�K_{�Hꚫ�)���
�u���-�6}|9~�m(��(lΛ�Br����d��a+9�8��>��Y5�}E��r���j��z+uL��4�L��PF�Z�6���h����a���M{�y*�m��}��!���˂�>�k�i�l�Z��%��e~�`�a�a[��Aw_���{c
տ(,�-י�4Ԙ�<�Fv�#��bp�j�Q�L��{
֠oa����a;�Pg�taW��2|�<>'����Q?��F���=	�>�)��6��g�GY]�i�_{r�J��<r��7�
��Y|��	����y�F����fT����u �.�0T?����si��.ԏ��޼��v�
�5���9-&�U�W��녲���v��h�sÇO��~b�<x8
{c�
��B؃��V� &@\�s�z��a�յ�Ͻq���?6Z�۷��^��=X����Ga�3�Ԩ�`5��xT�Aǂ8�7�Y����1T?���n��E����C�h�0���
�a�b\�P��9�/�mV�Ͻw�$P�V��/]:��N<�%�W%�?�:�-��+�������:�u�����,n�N�u�r�F�g�_X���h
����
����`�1���ʳ� z�,��s_d�~����'v�@m���b#�W��d�����Gb�ԧ���#s�����є����f����B�:�-�N�{$P_y��'
ezA�A��@�9ư
D�ᘀ�B1_U�qh/��"�����2?4T����2E��l +z�{��8���p��1���W�@������
�H����4�n�D�m�^�*�>�6�6�
Sʠ~��^GM����Ŷéd-O���������'�#l�hj-F���V�������;�����/��gI:� ��QO�G=�[��8���X{������i���M[�7Z�b�	R��fa,��G� ���m��<�^XA۞jڼ�`��Kl���^���Y����}PF���#~�������ae�<�"ؿ�C?�����Yj÷��(�-aO�Si?��Ƿ�<�I�[���M䘱6�s����9�I{��_�������Zv�r='J�n�T�aT�
v�63�6['7Jiω�F+�lkt�v䅝
���ʍ�u�5�gr�f��� d�_�Itc�:�=g-u�E��ȍ�!��,�1��e�҈�?vG�˟��=���k��?���W��_ǝ3&=W�FKW�:�-;�~7G��o������h͍����Y�^k|<���ç�?�̀<090 ,x���fN]��;`%`]8���t��4m�i+fϘp�S8�ǿ��L���streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;5B792C89-3A87-47BD-AE80-BFEB96DF95A4-38719-0000A5FA48522E53��� %Untitled Layer 5d'93DED5A86-9E91-4497-8896-05443D45274C-876-000008E8F68B3C6B���x͔�o[U�-��ش,�a��x�'q<f����P�g�ر��c�V��.A���4aX�b;i��g��{�uߓ�����O�{�9��~����x\�\σg��b

$7�G
2>�Y_[�ɉqUߺ�Ź��_%�H�C{R_�R���"ҵ���G�{M0��-��s�8?�<��= ҵ�
yY_]Q��e��k�,��?���/JO�j�L�:	��Yή҃~^�f!ҵF�9���,��+`gu>��}99����PԜ��xO�1ZP�?����5��Y�t��|V�Vemy	��������™Ϟ�F�O�*#�l[~!��եE�|�����<��M��*�3�B���9�@MCyqA��H��gӲ�0���>8�|���s�'��W�ACY�t�\:%�s�63�|���ך��7���	�Tg>�:�|��x̌�2���LjH�g�d~�L��I�~[�
���Ƽ҂��|�B&-s�txg����C�2;U���\��=�=�7>�Z��s��sU�ҩ����L����$(�%��|>i��x<c�k���Ԥ���?��Z��~)'��I@%g�F�Y���Z��>)N�*n~��4��l�E��B�k%�ze���ѼX�b5v�uք5a��̨���5AM�,D�V"��Ŭ����#�I*�lZ��CUoÙ��Tb���ч,D�V"�|fX��go��P��aMX�������;��Do�-?��Կ�f��;�@-��G�Z���[�Ǟ:�β����n��X�-?����R��w�
�zOڳ�7a"]+	�@��Y�'V
ԷUݬm����V3�Y3�<O�\���{T�cɄD{��{�A�o�0�Y۲���b�US�>�L���o�VބY�t�p0 �xDz�Q�T�]�lڴj̍rf�9U���Q���E�P�-?��%��*ؔ�=��j��gMx�=U��+�hXBA_[~�����z�k���6@9S��5稕�o�=bf����I�ߞ�uK8�ǽ��Y�2�����$��������,D����%�W�<�х�3f��Z���q_]�<{���s��q���ċ��}����M�.a"]�˗68'�w���M����W�4��A���\���y�{<�ο��J�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;5B792C89-3A87-47BD-AE80-BFEB96DF95A4-38719-0000A5FA48522E53��� Untitled Layer 3d'9B488B5C0-15AF-492B-9E78-BF75A597D20B-876-000008D39490AF11���x͔�o[U�-��ش,�a��x�'q<f����P�g�ر��c�V��.A���4aX�b;i��g��{�uߓ�����O�{�9��~����x\�\σg��b

$7�G
2>�Y_[�ɉqUߺ�Ź��_%�H�C{R_�R���"ҵ���G�{M0��-��s�8?�<��= ҵ�
yY_]Q��e��k�,��?���/JO�j�L�:	��Yή҃~^�f!ҵF�9���,��+`gu>��}99����PԜ��xO�1ZP�?����5��Y�t��|V�Vemy	��������™Ϟ�F�O�*#�l[~!��եE�|�����<��M��*�3�B���9�@MCyqA��H��gӲ�0���>8�|���s�'��W�ACY�t�\:%�s�63�|���ך��7���	�Tg>�:�|��x̌�2���LjH�g�d~�L��I�~[�
���Ƽ҂��|�B&-s�txg����C�2;U���\��=�=�7>�Z��s��sU�ҩ����L����$(�%��|>i��x<c�k���Ԥ���?��Z��~)'��I@%g�F�Y���Z��>)N�*n~��4��l�E��B�k%�ze���ѼX�b5v�uք5a��̨���5AM�,D�V"��Ŭ����#�I*�lZ��CUoÙ��Tb���ч,D�V"�|fX��go��P��aMX�������;��Do�-?��Կ�f��;�@-��G�Z���[�Ǟ:�β����n��X�-?����R��w�
�zOڳ�7a"]+	�@��Y�'V
ԷUݬm����V3�Y3�<O�\���{T�cɄD{��{�A�o�0�Y۲���b�US�>�L���o�VބY�t�p0 �xDz�Q�T�]�lڴj̍rf�9U���Q���E�P�-?��%��*ؔ�=��j��gMx�=U��+�hXBA_[~�����z�k���6@9S��5稕�o�=bf����I�ߞ�uK8�ǽ��Y�2�����$��������,D����%�W�<�х�3f��Z���q_]�<{���s��q���ċ��}����M�.a"]�˗68'�w���M����W�4��A���\���y�{<�ο��J�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;5B792C89-3A87-47BD-AE80-BFEB96DF95A4-38719-0000A5FA48522E53��#� �Untitled Layerd'9ABC8B5FA-F536-49F3-A247-199BBC422425-876-00000892F8AC9460�">�}x�tU��/`Ci*�_AB��Ho�{i"M�P��*"]:	��i���AZB	jB�!
����K.$� ���z��9s�|{Μ�937��%��!���y�Ր�%�x:T��
�0^�����\����,������?��������5|7-3V�c��G��K�,��D�X��9ݿ���]�P��A|Zj�yՕ�"��Z\��!8O���]���2�����Wl�oa�;0�7��4%-{_������I��Z��:�&�.�e5v�<��sb���(�>�r�D�[F�T�{h���N�âu���1��m*79����'I���i���L�����ԝ�$���C�w�P��~~��ݳCi��W���i�ѳ0}9��`�js	����7y��Z��:?i��ü�/�
C��ԤF��(��D��(�4�x����P�.�
��|&���P����?i���{�k���^���n@�ֽ�R�[���61)�Џ��!Uŕ�<�-݈mc�[}�Y+�f_��\ݓ]�E�Z�W_�]�8ǭ�����:4��}ٗ����	ey]�������W��TƊ�K�?:���@�f>(Y�8/�H�X�5�1�o9�5֦�$����GŖ�v86��3����)My*����Q��1|�c|�{*��y*��%Mb׋4W4�~�~�v���J���STh����hoJS��<M���>S]��
���HMJ�2q]��ŕ}?~^<�r޴Bն��Y� �@E{S��T�i��	b_b����@�z
9?l5Z�$3�T/g�kn���i���>Փ�J�`���M4ŕ�<�I���S���A�J�(T�U� 3y[k����ԯ�9��=@���S��>� \��@e�W��T&9��y�P�0�W�"J��&����摡_�5׋�!��E�(�|�8u>�ʦ)�4�Lr���b�.�WԦ���4�K�q-�ޖ���z]������*+6�P�4ŕ�<�I�T�,r�`��-�S�b���!����A��Ǽ��°j�}ŕ�<�I���s8&/r|�2���S��%��;�N�p4���_&O��,�㣨l��JS��$��t�0�����aĜH,��7#ѤG$��L���"1�G�DS\i�K��_E�U�(�����Ԓ�ݸw���1���c�(��2�zF�?���"
W��R�Y�(��/�D���P�������jF�.^� ���c��f[�Ѻo���g���W��R�e�h8O�;��]|\�r}�z��If��e�g89�W�ǰ�C���YZ����!6yij�MS\i�S��i��N�F��v��R5j�-+m�5��OJ/�޲�u���I#m�Ƣ}�X�Şv�ĢQ�X�ڛҔ�2Oӎ~FLc��A�S�}��v]�Dڲ|'6�;��L]��~xL�8t��:��x����)My*c�#���>�		w�{��4���.�ǽ��g�ϰ
���B���p�G���2�D�6}�u�#����Ҕ�2Vt�͘�;�[�
U8�<�K�H�j�d%%ʯ��Ƌ���n��I|'
J@�	�6�;L`_'�e/ŕ�<���C�@���W�/��!HDZ�Ljz����X��E4�~��>&@�a���#ݿ�Gi=�3�5�1F�����W�ڕ��7����3�
�'�*��~�2�L_:�cr�,`�D���aj�����ܣO7�5�"���9��1j��O"��x�)_�*}X`�6�������I�|=�!&�?&-~Xc_�P��Gq��]4ƹ�Z�B����O�N�����$�j'��|�gҾE{�����;4g��GOd��ɱ�i�k�=a�vt�Q]� �%�i1=��$��b)��	�L��n�л�J��\f׵�*�:$���!_/b��I���Q_�"u�Bi�S�U��@^�e"����\D}��)OeT����X�5*�Ɛi
�z�o���e���r`Z�l����+���˰9������o��f���
Έ9��n�;ょ�#����9
�W������57f4�q^u僼�e���b��\�\Y�l��B���@�1����x���m�Z�������,�/�{uI��GFWE�٥��]@�I������:�Ș2�; �:�M$��-�K��|h�����C�߹4\[��+�$5�ꢦY�y/�	\���wQV�����'�s��(�C#���cZQ�9́z��踲=9��6��X���!7��|����Ϧ�{���}��b8<��4�L�0OeԦC����x|s����_?~���>�����-��c���Ն��_���E���+�c��plY�^R�f�%�Q����.xt�w�ƞA�ѫ|Wi�����73�X�9��}~77ġQ%pl�#�O�h�}y�-�q�8�d�'�Y���X��Y�(~dL)\[�ϯ�ե����{��4��^��0�׍_�nmC�ׯ�ǒ8�}E��T���J���iuv�4w�v���o�2�X6i��Ƴ	9:�{'���Z���m/iø^|��9ί�:A��8��g|f�HuR��*�sa{*=�<�c�
F�nu����Fܥ5��>pgH�ҲL\�F���	��C��%�犬W�~�e2�N|��@X-��2.�u�E�/z�k��%��F�.��q�!p���8��K�q�7GK�d��峺?pon�w��)�qzZ��������'�=N�c�*8���U1���c��	eX��Q��_Sk�!��4>�ʘn>���m�ݡ�;�ss��˟�U�	3�q�յCp�nl���S��\�gu���2��Qٴ�?�Ǚ�>t�9�	bί�����97�Mr�yd�ӣlg
�o�ss١4�8����z���HUӢ�|ض�|W<�cv�C�]���u��K�zg�~؁��:~jF�Acx�k�ML�vv}����� �>�K+{2��YΨ���_�M�A}�s���s d�d ��>�����H�����ZH�
��iq���K/xR���d��o�s?7B,ׁ+�����ɾj��paQ�hM�f��q(UM��gZc��{��R݅����
_�NC�w�e8߭{p�����K�h�5G�9w*�vs��YS\XҖ�*�,ʻ����/Y�x7K����w�kQ�]^��;F��v���S
t�E����iT6�ں��3?y�\:�����>{9`F�w�J����!�#�!��L��u��k{�7:���.�Й�:�?���ٵ
.,lf�����^n���î����̐6�̽]Y�������ޫz�N\Y�YVt�V{���wn��JS�Q�).��ʵ�"N�gߗ�{7c��;��j�3�!��lD�_�+˻��/_›�`;V~�ˮm�joJS�Q&)��U�����˿��>Ƭ�9�9���ĝc�{Yw�\Z�������>6�W�•e��hoJS��<����s4��L�ށ����?��VF�Ot>��ޅ�z���{`Q���	�7�>��>���k\_��	�޿�@��UMS\i�3�|�kk��w�D��Ail����]ZD�V�^ +)��Ꝡ����o���xg]���p泾�	������@q����H� ����*`g��X�6w�4������,4+-n�N��ѕ�L;!��RDqN���L�N���D�qMt}s�@�noq�8��>�������y��*w���-�
��Wg�}�{[��v8�w�
�M������C�4�=�9�q~ŭv�ˋ�=���6���ȷ4�g�W�J|V�4^�Qgَk+�B�:�f��ZKc<��̱-�=�=n�}��qϛY�O�l���3T�YM���̹�G���]���2O����>���L+�5�<��;z���c>9���I>�|�gZL�(+�o�Y��E�Y�g6~���w��1�f6�yCeTVuH~��C�^�2͓D�E���E�<�Ҕ�2*�:�����D2�ٹ��4)JS�ʨl��[��[��[��[��[��[��[��7����ى��:�ŕ�<���^�E�m;�f�Q����>&F���._$��U����`h��7�_Z?ɥ���]�L�����]2��~����W.�w�_[O�iiCn�����6ܿ��W��Sy�ƁD]e�
+�����~�f���@���dO*�m��md����{�W��6,��=�~�������A�}d*�g��I�ѣxD���
��B_�wb�S�{�*y�Q�
�}�#���`*��m����LmP?D&>����9��6��nB���H*8� �������1��[Ǥ�&5r��̦|�(�9F��
��
�Ś)���4HJf�p�B��.w�J%'�:n��1�B�D&�� )�M?��)c�h�
�yB��|K��d6�������9zL�~���D.�K��<=�M?"��"
�
��v��I�l����AW�´䍇��}�D\�G`Ϩ�Yd����i&�
Ą��Q�:��!��"��6�N�~T��4͹v�p��~|��,ca[�dB��T�\Y�R'���M?�����,��Ć���ɰ�T����,�CX�{�`��#�t�o�kK�b.�J�l��G|SE|�?���t�(X~n�9\����;��3��o����c��ȹ����J���`ӏ�
D�1����r��C׏�=��<�~�e�3,[Гi�+-��i���:�����թ��Y���c�H(Q�2�c�e�8T]�v�0��k�c8,d�=����Ƽ����c�a�]�05_#V�Ϳ{7��k�?�}Z�uX�U��Ww���μ��l�KO�)n�)�e������ړ[���Y�_��~Ώ{��W�K�@j�g�wU�����{(k?�,���3���2���u.��M_�������q���ү��N̓e�H�~��̇�P���6}�/�Ն��6<��K�����|˾Ѱ�ˮ����F��M�����F��[��z��^j���)�yb��B5���l�����5@�FГi�i�;��3�_��Դ�=���eFSXNL��$9�#��3�4ō4坘�u�%,y�w���[7�p�a�h�<�O��v�~G�eC�)�`Y���f�r���}�d��Ҕ��GZZ�L������a��y^P�W���~����7�fŷX洆e���lX<�(��9����#� �Hb5��!yI��SR�����WO�sl�q��ҔgjK'y����-i������o�XIM���Q�b�巘������Xۡ���%W��T&���ܯsĿ8�'gi>��<��g���s��;��5Qf=O�?��k,��l��<��,�J��w
MgL�d:_�H�?9�����γ�؟��c#����+�a?��|��Q�
z��x�ՙ��Sd��y�2�!��^��C*��)�M?�{�`o{��l�a��>:�[��:4/�+I���Cxf�Y�<�>�C��O��w�/�V��?��k=ϲ-F(g�d[�e�{�-�NXQ��r��O����M�<������MB���܇��!9�x���\L�+���E�6
��s���(��"���l�:?���i��m�k�\��"�6��*�"�t��\M�za�����F�9!�P�	s��
�J}޿LmHa���?�H����ȤƱ���lC���~lT�}:��Ցm��ƃ���?����V��ы ���ט�l�?������s�F��j�hԑI?:�1�uŠ�V�B&Mi��L>��˳_�`YՑI_�!��\���z�Tߺ���Ԝ{����Ȥ����&$ϓ�"�~Z�_ə�\��hMx2�9i�4�{Xo��W��l1�<��b�4�=�gB���XRœ�#m�9X��&uRA�c�҃9_��?;J\/��k
RO
z���c#��`�b�]�1�LH�BJ��,�~Z��Ŝ���"���`
S��e�k�k
�HO���/�V�����5�XR˪�L>䋤�^�z!�E�j/e���"i���F����Z/�BuT�g���sqZMs5-�Er� �HV�VK�z��oi�B���ʕ*�ԫS���"�ѽsG4�_ψ>�ㅈ�������a�T���dɢ��3�Ϝ1N��X����zaڵic��om%���ڵ����n�/:��u��
�a�aFhb��(^�T	*��F�!���iQ���֪��_t@�NI�5�uz���[�����B2�4�:䊡۠nm]��L�z��~�П�(iguj�@��йC{��m�]����թ ���E����}ү�:5k<�_�Fu|Ѿ�A'b��uP�9�`�/���Z�'C���A���Z��+�ڵ��(ig�jTC���mX�<EN�I"
���Z�Yw���R�Z����ժ�]떉����: ฉ�	��0�Ia�¤���g��Z>��5�WyF�z��hӢڴ�m��Q��?BI9��#6��T_��v�jh-�I|W���~�ʟ�e�&hټ	Z1�<QĖ-+q�������jU>{F��gѼI#4oL�4$
ECTgy�O�Dt-O�W��f��yݬq�?���_Z���*�*�I���1Q(��[C�\�2�(ig�U,����l]�	��_*[W�p-�R�Z�����ˡ�M������\2�(.�'Ś���Bq���iQ��*8��XZ���&�p�B"��5��q��ҬX�
�/"��(O-Jڙc�2�U��A���Ua�CŅ���VtmEת'ߵjT�c�2��-]����	�,��u�x^�~�k3L�����5��FY���"�sn�reJ=�_�kG�q���'I��x^^"�-�EI;+]�8*U(o������~wF���]'��LS^�`��U^�ҍ2
�j�U���%��/Y�4���ىY�~�����Bif�0��(��y÷�%�D��p,[
���}</�K8r.[���Pi�rIC#�!�\�c��%�}F�x���s)S�$�<�9$$�L󴋛$�V\�����J7��.���
?�_���J3��Ub�g�0����W��Jg�y�`�	kI���E�"��)\%�aۊe�����3D��8�X�,+�ŋ��(ig�
�h-�L��'cKCZ��3�Bخ�(LT�����y߅���
�l�ڑmJ��C!�/iQ���˝�E��2���|��y><FI�}Dʒ����%jZ�ȉ��-��-��-��-��-��-��-��-�3}�@�V@��w��Z��O��lys��P�Z
�U���5�y�i���.Ţ/�>ș��YCz�]>��c��~��~M�x,CF��p���md�]�w[�3{��Y�ڜ�mW�xG?����'b��!��b��!��;3|�{".z�ed�]��Rm�1[Î�G���=1{f!f��D� fa<��y�?��l\�9�[o������|�A�����q�Y?�u^��6�'[�Y2�̔1c�ߵ��<x}��y��3�}�C#.��lC����?�^���^۽4�g�ʘk{�Ey��4��K#���K��.�ȫ���5���az�XD�d��>�6��w��A����6)��c���G|����s���`�<�=W�ǭE�����6��L3S��ѻ񆨓���5���K�v0����id��򘁈��L��h#�(��6�y�Qۧ"l�Tx,z�ɯ]�6�qx!���MS�>����
�}�u��/�����1<���\{���k��`��;	�<��c6v�p�]�wK�x�{;k�\og{?[ַ�Q�2󛖛���2wV���Ucqk�p��2
	�ww���^�yH�{�n�]�����d+b/n!�/���Yo#���ǁ'WE��Zp�-*�/>'�My��~�7��	��#p�m���(�t��?���ʥ��D�������g�&�xR�w`��xΣ�sqs�D���u_�m
�]�q�m8���쇈�\9���\���t�,-D���d`띔�����o�x\Z0W���c1���,c�,��qw�DTp�[�Bs���{�G���8�	����\�����1�y��м
�9;&���)ccMZ<��������{�I�:�p�!�Gp���p�,�];�>wLi�f�o���}�o��&�@�����>�ۧ!|�O/���1
��{�L��h��kn�6��n���`DwE��a?�m��vL��l���-?���qpj^���l����2��5�=�sǜ�oc�`�x��%��'�	�|�'g��)k�������2�w�:?��_5���G��O0uV�ŝ#���͔��E#�Zse��.rBԎ鸽���F�1��գ��h�e���T*�Q=J��|�Vký"���27]� ��U=a���Z=~+G����vx�Ӕ{��k���gyb<�t���!�c_�.n�w�\��o�7�<����l��m���A�gl��n;c�n
���2>K�ƢAl��M^��߼'��O�O��ʵ;�;D�ߊa��hHd�7��I�g�m��s��K�qH�:q�' Ν(4���ħĖ�E��d
��?�R��$�e͘!�G���ޜ9��y7�м9���0��3�����{/G���y��#
͒�ҩHq�streamtyped���@���NSMutableDictionary��NSDictionary��NSObject��i����NSString��+_PARENT_LAYER_ID_�����;5B792C89-3A87-47BD-AE80-BFEB96DF95A4-38719-0000A5FA48522E53��MASKSPREVIEWC� ��C{�x�\���k���kw�]k�k��k#6���-�-��`+؅(*��JwJ_�u��AP@0�����zr��̙3g�ό�tZ�����c'�b6ٗ�u�j&�xiR��y���>���
�.7��髯��k3�
�/��觘��K-b�roLv�b��h�1�”Ua�?���uD���[����� bY~�u���.�p�7��6���d�	-�v�z�e���]��Q� �<������n_$#�U�*�=�{S+j�v[SWF�����?�u�/B=7����`�hl���D��>��J�<�!>Iz��*�u5��O;�;S*�uG��/Q��K����5wO��f��_�J[����V��x4�����w�$-��D����F��^�Q�5�Q��*�Ґx�$.y��˵pG�&��uLV���9r��
���x�1k��A�nﮣQ��;*�o�6���V�b+O�wG�z�<)S�n��l��ix�o��F�f78Ƙ�Ij���V�Ly�[9�;��wb��`_z�z�7Te�L3Ol��I\�L��tE�G��������\ϋ2�I���x�skLc��'�w�B���ɨ���ؓ��M�L�$�}TaL6��@�S�?P����he�/~�sEα�ԯ�՗��vg_��5��E���TLn�'eR�mj������ъ}@��Ԥ�X�kF2����g��A�v<o:������G'?�n�C��&yR&uަn?��/��r��\�[(P���h��S
9��S��a��S��?�@ݿ�Q��/"^S4�$.yR&uRB��}t8FN�D��(Y�L�Av���2�n�~�ށh�5�{�L�n<�~x�<�ʚI\�L꤄���7s��Ty�ʍ.B�IA�������t�|�#M{����h�[1T�L�'eR'%���~�
�6?�M�/H
��^K�p.o�7��;��L�^A��)�FRY3�K��I���҆���?�����G��Ш{0Z�
A�~)Ӝe
�c��7��<)�:)!>�������ڣJ�K����?{S���5��V�B�f@ʴ��:�53�ʚI\�L꤄������K�/�SV�a�!���������i�/�r�'��%O�R��0t�����*mr��{����1�(�u��א�i?(���c����IYj��&�`�A8~,{���9�6�.������㈙�"9���W����R�<�h�#\!qɓ���8$�x
h�
�V����;/m���oU�g3?k-��##��k���t����5[ǰ�5���I��y�.��1:J�}�RQ��%���6�9�p�ʛ�u��WFb�H�aQ�6"�mIN��к_U���I��y���3e	��C�
����D���X^^��5���m��ع�ԏF�QѼxC�����TLn�'eRGOҝۏ��1�b9��}-�$z�k�/�7������˷�y�^�c�{L��Րx�a18v&���I\�L�����1cP��#��yE~k)ZD4�&��H�R5�5������9`0�פ���;.�����X�u,:֐��I��$>f�v�N���M��s�O4�h�fR�c!�c�R5����!������4)��?>9�������1u�����JԮ��W|���L�
$uJ���/�kux�4�0X���ˁ�s��S����Mo6�z�y�n��k�ˏ��=��Uj��D|�FZ&�R�v�c��~�j�����m��`��ט������NB��?.����P��C5�e�)9�J|�)��cRO��"�jOޯ��=�ܷȽ�ϼ~�5��������=Ƕ���~�z]閮n�"ۊ"��gFL�Q.RL����|і�L9o>�k��*�r�4�8�m���
)��|���LDΓ�D�2D��1i��'eRG��6�m&�),�Nd�.H�O�"yR&u��'����r�.�������t˃�]s'"���bI���K}c�u�L��ɧ�Lrd�ͤen��}
�����!"om@��9�����������a�1�,����yd[�A>IJ��c��Z���\�^g��+�x`���8����Y��q}��=��ȹQ|���W����3������W����������*8;�Ύ.�@�ͨ�Gf=�y)�a�����D�7����<�'I�}��].w�-��}�?;�?���Uq~|q\�X
������H��1�,.N*E��pŸ*�n�A�Ӄ�>9����߹�o���~{&js���A�%�l�*q�+s_��ˤ����Ēp�5�G�i5
7�	ӎ��\�����vz=�?�P�N;����[W������Z8�*�P/)����H����-}��/�Ù��1�FN3�"I-S�o3���y{#��2\���ipuVu\�SKcv
�-�q�2�dbq��m���f%֯��%��^	Ow�k��p����~�M��l&��8>��/�f�ǝ�NJ�:��ϫ��6��Ҿ���]o�#���½�]X��&ݮ�:6�WV���<\���Z�(�D狟,{D��6�Wש���cV�4 ��]-د�F���~]W֭��Ѷm��qۤ	����%�@4)-��s����m��w7��kq������Ƣ��>�:"|]��0��x`�� ������ڬ�j�-�ɸ�����8d�s��Ц�F�M�s�tt�	����Ѹ��n/i�67S�Z��>�->6�u���\�3��V��/X�ٵYU�Mc�������!���:0юAv���A�s�����v��w��xò�<��i��/���Y���>�5�~6���u�:�ʚݘ[w�&�!i��m鰍���p�BmRP�av�9�^a;�~K�[�:�'>��8Jxwy��
�f~.l[=^+��%��)��byS�}�f����<~kiS�Aدi�m5X~wE�l��0?���G����VOm������7�5���Bnyxv>�w����׶�ú�R�>��]���T�,:��w�=�֤������5�8\�S'�>����Y��E�U����Bg�dzC��Yt�7���>��Ajۮ��~���pef�d�{���ɼ���#^�l삇��R�+����,�����,�Y;<��7˥λH�c�����UԵY�IA�}N��#���:17uţ�=S��}/O/��fO���#�k�)�h�n���Ύ-��m�;�6��u��K��#�vB�Ѭ���xk��M�ٟ�pEŃ��U�V���h�{���pCW�VL查�M��ޮ�e���ai�<�݃�M<��]���V7��?�=�L�'e��[<�֗s�`�^_˾��~j�M��_��gwLZ#�n"���־p�1μ'c�<6����M�L�Iʎ����&p�:6#~��v�Y���֒c�yKD>�
o^����k�S���8��'[zR1�I��I�7Qy'��wfΎ)�k�ȟ#��Od}�7��2�FN��c��e�P�>;/��λ��ٞ�x��_
Ɲw��@Gk�j&qɓ2UG1O����)�����ql�OR3��h�ԛ��"�:��b\�w
A��~u�z��_��>��H
��Yp_w�WH\�\�J`$�okc�}Ÿ&N-���
"Z����X�X{�_�|m�j�D����9�vĐ~G���h�	U�H����^5�8Z�>��˓*��"0�T(C������G�ĝ%��$5o�p���q��j2\-�%`�#*��,��8b��Gű~��.���'ߢ��I�ԫ�ce%���*��v<�>>�� �����e.����5���\w��ۯ��Rj��pۡ�r��k�����s9�s�f���]���U8�*�~���J3�$����g����s)�#KO�Aė�̈�1�E�鸖�|іs��em�?��;)�}~P�ղ��K�+ېb:͇���D�<�Kd�(C�/��o!yR&u��l#�f"i���[�t���K7���R�$�Z֫X�]��%;.�O��B�3e�A�
5��,$]��K��?��Nc^s�8GN�\&��܈�N#�/��e�\^m�]���ո�.k��Y3e�e� c�\0_��%�^9�we/��,x�~�����o���
d�/��%���"l��Lj�	exr���F�8��}p����(>�@|̽��1w-��;����퉏�?�i�Ӯyߧ��ٿ��7��ȓ3G�|W$o����u�ٿəߒ�fϕ�Fy]��^D\3�;�6KN"l�!ⴰ<^�>���;�^�{fF�'�<�Z4���c�m���\2���Ec��$�G�Y��j�dz�Yw���m��8��/�E�5��Dˆ�qN�ή�k;sx�<��Zx[.��1x5�ב%-�H({�C�G��B�x}�<6̚�K��l��L�����f;I[/EԝC�y~>>�alԃCox������hxaC쳝�sc�mMcCN� �}f��*�jy�_�0�!��a�U\�)pJʈ
�f<�f9^��M��1׷Rߌ�,����M*ԣ�R�^���ҷ����1׶ B�/C(˥�����F`:)M��l"ej;�Z\��w?8�#��9�/o�>��eR��^��������4���Z���kH��۫PҬ/��]��xD]1C�ōq!'LX��S	�X�P`<�HzJ`���z�L�=C�f<�HZ�VKK�D�~�8Dۚ"�ؐ�KX�4��7�<Ɖ��<�y���
��_0��R���"��&��[l��'�܄�	�C���$y�	��
�$�a}�>.��ԗ���?�k�"��F��]tl!������*L
۫ŒD������1���!6+ゎ.��A�1"!	�Z�pC�U��%$*��RG��>O����?!l��}�qw�h�^܀`���G �(�]�:�KT<1o!B�VHI�K���I�2��Y=�y.7�88���#��<
$�R��D�K� q��H�Ṱ�9	�Vv�nQs����x��]a�c�Y'��|�����+GrL.C��Eq��g��mH���m�Η�����o�tE?[3�}q�w�<)�:~f�����b$�8��,���g�`6�aO �H�`��ޙh��
l�
���σ�q�:�a
�K��I�>k��>��V�@�%�yq~{��k��τ�>c�=*$���X�P#!�펚�A�5ݰ���]�IC莍��$.yR&u��
�qs9�9�Ή�_��%IC��3����=v��I'��e����f2t��j4�5���c�ԑ�չ�U�����?+��b:|��
)�G$L�m��=3������ZCw�����;:�ʚI\�I먺���������~�X�᳛���l��'����4��[�p=�;=�ji��Qu��ͬ��wF�}�>��Pϛ��*��o4��V(|{tg�R!m�:�.����/>�r>^n��b:>�u�xW3C�͂�vc܍q73A������ŭ��[��9Н3���ɩ1T�L�*Oʤ���66� ��|x��b�^m1$���|�
�`��,��['(���籽����k�PY3��<)�:�[a�_84�G�ńnN��'��t<��jl&I�x���գ`b��U����&�]]H��T�L�*Oʤ���ĩz������M͒��)�C�~�i�'��}��I�"ſ��/���^厎���\�mr��ye���%O�X���Un��W�����|�q��M*�:��ҭ�݉)�[��
�K��I��m#�~
��T>RAW$�p��:��QƸB�'eRG�+�|Jy�螺N���Ho��ʤ��&�)�DC��sA�'eR'%�j�+�Չ�q|ZvX}ǧ�Ĵ�9-�ɨ��5_�3����C��>.(�-��9
���ދ��|��-�(��O�����gF�PH�P���������zR_��B���Ya��o<�+�K�v��ϳ��L:8������|�q�)�a���Ɲ��"�D}��g�9�Ω�b���@��6s���Il�ݝ��"i������y��^$��E��<���Ť
�a	�BƤ�a^j�ՆD}?���w�%v�~.��pw_5���Ǥ����KR�D}�#��J�����-S79��AR�D�������wyu3��P���ڣ₤���
��%���R�G�qƐm�H?���
��%�{�K��#��1c�!�	<�Hć=fL?�q$~����-$5Kԗ�6��	�0cD�9�S�#�����������&�<�0��䂸��t�D��_z��`�~��@��s?&�7�'������M�݌���ڼ���Y�:��$�G�WD��t�uc�<�� ��������].c��-�
W;�5�7\��:�3�VJ��D��!��#]ĄyS;�L�}}'����>|{f�Z����d��6�Q��6$�G��"�׏H�gZD����gW�~/��e��s�/k~�I\�u��4�f�c��L�����#E��nCt�����^Y㫵>�z���c�~��RÖ�و��?����x����>-�5tƵ1����Ԑ5�����כ�U����~�OM�'����6�9O��y=�����&\�q|�C��ܧ��uږt�OM�/�[���z=��i��?��~|k�ZۿϤ�~�/�Do��j�q��
i��6��~=�q��\kik}���&q�'ej���;���o9����O��G�����05�-�o��qn
=i&q�'e	�ݐZ�����?t����v\g�hk|Y�sͯ7��<)KX�s-ڇ�����߇H�i�!�u��[\1΍�qm�][��Z_���$.yR�?��G�WL����{ê��|5���AF��!뿺���Vv���旵� q�K{�/�Ʋ./J~�~#Uد����H��%#d%җr<��t�ꤑN�]��H���i���|�D�퐱-� qɓ2���2��u�G��S���e=��k���u�'�dH�D1�zJ�szd����~H�w�����Z���&��%���1�^OL���2��O��e-�iY�&'�;&*�����6�t��S3�CO�׾�����}���A}�!���b2ұ�N���x���#��(9W�[��}t�5��x���Z�~ ׬���ִo��� �ۧbr�&�HF-Q?�u�~=˶�P`�m;:)3�[9ȷj��#���0�7uR;6��ښU��R��yO!fi���L�Gc4Q?��a��D�>��q:>��o��6_��,,Q_֏[wju�s�e��<;��|�B�އ &�/cB;W34_$���z�A�sB�8&�sU�p����IR�/�_��ݗ��`����Z�=_$�G��q�'k��#ۈ���9W�|�|�sS��~,��C}�_u^�
�/d̋� q1m�w��z8���� 7u>j�m�d��DS��1��]�����6b�/�!��@�R��|�T_�!�ҳ��#ue1я�392'�̛�"�~F�R2���Ȝ�b2�D[�к������:5�ɼ/�]R
ѯ�L�ώԼ��9!~D��9X�4!M�A�3rуv���{�%�I�e�6H<=��k�XLT��&:�p�E?�τd^H
�#�D?���E;_����ӉاЗs_�9�Ǜ�B|�/�Q����U�5�֕m�ć�"�O2_��E2j�d��d�
��}�l����-dٖk^[��uqFM�Ռ�)ѐ�#�HF-��EJ�~�vV���Ԯeڼi4oژ4A��=ЦEs��=�A���B����C�)�/?�3gN�d&�˖�`��
���cb�?��]�(��׷�����&�ѿW�ۿWO�~��=�A��U�B
-OC�+UHD�J^k�!���v�%�Y�ƍзWw��كtg]M_ҁAN
⽥���q�S�'J�e�&
I�N��j~�ПhQ2�5m��{tE���vK��ü��W�����Z�ٔ>�~UH�6j��~��
Ы�ߊ�D�/i?�{�����Ǵ��%OK�1L�/i�o����ӳ��-J&��
�ߝ��K���M$L��0�,���9�=�C��iD-J&�F��k�	���/i�k����s]�'��&՗�7����B�u��oP����]:
�/�+���\a�]"R�T_ʅ&
ꣳ�L�A�w���۷E�mщ��'�������A4d�*�I�_��w��QڶF�6�m+"��

X_��~�o�$.y��5�t�6	���Ѣd2�[�&ڶj�.�	����i�?6�w-���KyjQ2��Q�Z�h�8�gb}0Q^��.�vM���X���/Zr.hռjS��ɬV�jh�qӢYc��71>��/
�$�}^��Nj�7�V�^(v�
%]hl��_�(��jV��y�!d�sp&Oa� �ĸ>��J' y��'hd>:�.x��3��ec"*�Bc�z�*��W�Z��S�ʾs�*�~`�!qA�ɉp��W�
�>�=�淉oL	C�U>��P�o�hU+W�y���Xo��~H��a�1�Ч�0!���ȷ��־ݜo��}[�wV�
g̴P`�*g=]��'(�x�S�sG]���}��8���[X���vЙ�V�]7�>���P�}���P���ʥ����U�T�k�P��YY��og$��ұ�Nc�'e1���*n����fعa1t���ו���^i�-��KG�⿊vE"RV�B9�D/��N��0�i}\B�\p@�^���E\:�C�Q���S��J3�l�R([���G�eʕE���P�*��c��<�ݽ��ׇ����$�u�J�l��Կ@}�*�reJ�B�����ʗ-
U*UD��=���$hy���I�p��!�4�*�gԦ�E�3Ti�)]�˕~G�,�+U,����D�wU�P��K��%�q2}��A�c���%�_�>C�f~ɒ%TP2�I�*�+ö��|�����;D��ܿ��/�~L�
��R��J3��ߋ�>�d2+]�w5.ʖ-�,3>��#�*�Y�t��7�3Ti�Ʊ/Z�Lf��/eJ���D�|(�~3��]��U��U���*[�Z�Y��C)�Kڑ{A��k�����u�'��>`���/�[q�%���
�J��u��d�t�x�Ι��D�4�+^E��JI��L��F:���'`��Ϳ|�)�^n��a���W�V)"ڟ�
�T�UZZ�AҒ/���"�ۆ�i$-�R�9-+
��BI���K��]˔)��}�n:�5��>��AW�L3�?uˤkZ���!t!�p-�u��?�#�����[)�w-��A���܉���Z������أ�*��o[�RMT�|�Yi�����;���G�F��&yR�_!zٲ~Me�lF�(��۟1ѣ���]���Kj���;�>���)!zIMҷ�&a
����C�K�ۓ5T<}\BA�P���%5I���'o��
�ߐ�H�&�$�G����
��$eRO��'�#zIMҒ�_!zImN�}*�B�R0��K�.Ů]��v�Z�^�:UV�Z��ʕ+�d�Ν011��I��)���l���W>��/�ʕ+�t��;H���z?���ԣ�p�
.\�������<�|��J<xӧO�O�T�W�^�ŷ��=^�z�gϞ)�>}����3�8;!��X�96���ߎ�����I��������'�:u�)ʤj*Thdgg�����p>C�S���&c���$<7�LF��_=ª�G`�|���			���}�6���3S���ȑ#���������”�ۼ��@��ԝ��V���(��!J����'��y�����R���{��xƖ/_�!e�4�������J�m��.T��w/O4�8�����LďLJ(ͤ��ݻ8q�D��%�4������M���V?:���0��B�O�����D�S�rK��z���*.>D�޽nt�^�1c��/www�!��鍶�V���ij�:;	��cj�=�ԛz{'��.Sڂ�]������]���j�jȍ7�e˱�c��U/�D��Ա^x��磦��סWף�	?1�/��n@@�:'d�͝;�(ݿ׊-Z����ar΄��*��/��˜���|�B4�Ⱦ;�rA�,g��P�{�K�xnO���Z�̙�r���d�>V�d��OO@E�)�r��GJW�v��a�k�r���VcQ��(xpN�߹s<��K�,)��N����;���gn(F�_m�����V���hwa!��tE˳�P��8,�{�78OL@������A��666�_t�.�5ࢌ�w�����ǯ���۩�a��0�j���)ie���E������:v����t����W޺u...j\^�@�s3��"t�j�sߛ����/\��L��f���t4:�w\.�[�l�̽��t��t[�j�Zq��}�������$c�m^�|����"�{rC��9#�y/�_�~]�!�M��͛��cǎ�������=��������)d�H^�zU�D�Mɲ��D֦��D�A(�{�nї�C}�#���lG��W��N."�9���ɏD�IT!���O��ѣO�?"~ſ舞�~E�}�� ��2��L���DŠ��{(IJ�b:m�E��O���N��/F+U�P�%~j\�"�k�(ܨ��B�>�d�B�X���O���[g���:s�����P�-Ӊ�`k�i��ͧ�sj��~{��)����1[:_C4�cG=��(�s�zb�(�[E=��7������S���&��6ϛ~,��ZD�Y����yf9"ϮH`%"��E�G_\�˻0�M}�<9���w����`���Z(o��L�ȕȏ�r��7g�YҸ���;f�Q�������9~g�C��k�!��Vx�=
�S[�����rn{��3[m6�>��&8[��9�2
s"��f������_(��-�`��mx}�ߘT�^ԓ�E�B�`�1w�!��#��.��ۍ8���Ҽ?��^Dݵ��.�d�,�;�tH���7�>~N�(�WT�`fm�%D�[g���zl����Dˆ���ޚ|SJ�x�q�[j��'>ϚI�u�ɰv�Bm���\�^_�d!|�]1��Kp֔�G_�����:�٬E�5�YCV��ZX�S+�
�3�?I�fމ8�t�?毘�ۯ��]�_
~���ܹr䦼nٿ�X��a�����j��m�/~K36��_��p��΍3�4��yt���1D=<J,y�淁&p ����7v�{ܲ��l�{mG�ˍ}/(�[1���3��u
\����j>�����{�H�)d�%C�"�ǹU�J@�I���k��y{a5\���u�&���c�Φ���9�Ŵq<��f�o�q���jD��OE����
l�$�u�3G�<4�֍œ���x�xr,��0�x[�΁O��s����k�*�HG3�?~���8����&�c�C�+Cٷ�'9�y^~*伒o@��7�A�̙Ԝ��h؞W�������p^�[~���"��Cy�}���߳}�w��Y}����y��'xfrܜ�|/��󻄖��D~�ъ�L��W؉%��v\p��Y�����k
�o�ob�C�5~w��|q��𻌜>�#��o͹[ct�zs)�h&��c��hw�s0ǜ7�ph.~�����`BT�y~�l���6t�S�Q�4�7�J�{7�9��j��x仅>����mS�nd�#�Lf���d�h8m��&x�ِ��3"����"����vLU�K��?7�d2[;���~�:�v'�L���Ԁ�ۛ����|�]?��S�o�a�䞷)����a_��;�~���e�<�W['k�Z���R��#T��~jN�R��?�{�L�w2��V?�����i�o�vh�2�~󞸱�foxaƹ;��DB�m��h�AX�o����;�w�����K�c����#�mI$T�N���8:�?4�O�A�b�(%��$�\�3e��p��#��;�H�<��3Y��#��3�h�<��ϛsud��Po���b_�=��K�yƇ��_޿��Eo�k!�I��;z�/�_|y���oޥ$->��I\�$��kh��yϢ�9���]�fDBIK���/]n������[Y0c���9߿�||u��~o)����t�qM9����/�Kו�����m�T�D
jQ2�}����p��M���u��J�y�B5���O6��cgժTzG_~{/�^�NE2��]�ÔH(�u�uR��u����
���R&i���%uR������r�w�?�	��7����ۿ���,D���L�?��� �������?��_����0/��Y\:�U�m�ލ�<��4�/�w0~��H6�Lމ��/��"������2w1S:�}�3�?K}�*�"���E�~"�(e����1���>�Ik������N�6��*�|U.��~}y��߿������ʺ9�bo���Fj��ӟ���T���_���o�����]�є�k����F:�����g�k�zߐ��Qi��zT��zMH)"ڟڲ�
��}Ky�2�*_�?�im�s��	��w�Uק���J��&�6/��(ʗ�/o����Yw	z}��s����/�_ć�/�_�<��%�Lf���Ӟ�>sQq����<K$->��I\�$��kh��K�PH)�9����1S�E�O>����P�����D���Lֽ��KbZBAo���_�HZ��e;�ݸa���E�Y�꫺�����_�B|�E�d����H(����	e�9V�V���EK�r=ʷ Z�Lf��VFT�<	�P�Je��|��!�$-���|�r>�(����z���}I�K����K��I�F�+�˗/��%����/��X4D���L�{|��tR���ߟ�iQ����]{��}��t ���E>�/�C#9�/�ž��lg��f��{W����e;?��,_��i7�]j�*�A3�|n˶g��]��3_�BtH4�X>�Q��[���,'�˲���;7���/<����3\Yl�K�b�H�������M�Y�߮�{�k�s��/����8;��{M��Y䧶l5����]`��O�W��p��nٌ9sf�h�!L��#ڵȧ���0�>�4�~ذp�1��1i�hѮO��Oy��i?�9���2����)���@jO�7�́jcv���?	Ԯ?����h0�{�\��5�I��7�MN�cϱ��v�m����~��s턱&�y�'h�O��/ڢ+l���5f�@��v漥����96�NA��R���X��#6xnq�Eh��n4�[���?����ś��y������ka�y<��D��sj�e�>tޑ�/��:�b֭(L������h�ϭ�˜���D�qS�����~�**�ϕ���lڴ,��YӻMt7�������#�_��!�[�ϥ-�s��T�2�D毾n�tu�)@����sZnR�T EI"��_��&Z������=����e?���u3�o�q�ٿnd;ٞ|�eտ�G����ޯ���Ӈ�pt�	���a��!��ct:fw|����Q8�Z�~:�z�/��)�X�
�p`��T��Cf�`0���h��ڽt<�����<^�O?������1<�i
O���z��<I�+?��غ�P�i2���Q�aطp�,H�c��0�?g����g��68�!Z�$E��eK���l�Xї��W�'��)8��N��<D´�:y����c���9`@�fgw���+���p�}rA��ݿ��T�tt�6�%��gOy1��e>�"�7,N�Wx0��Z�6<?�I���Zڮ1��c��Aa��`�6��3�M`8���{���6��/��t[,x�;��{��K�3>�������&�"iHZ^9�n/��l^<���䓦�!)G��_�Ϣ�����{��ORG�[�v��xT_}�=�Jr��<�\��G�Xl8�����C�/o��,+N
i�ԕm�
�B}#�84��z�P���H���7�y,��z�n��0�8'���+����8�:)�D3%S��Ţ�IO4���@ʥ��s��zW�Ժbi�����1gT�'e)Y�b��8�Db��t�zc�Q�����/���B�?�`���:�,u�v�(m�����Whw�e�H���0
�S�e��`ɄA8�������诶�SLq��$g� �̜1�}Py�=�L�h�;�:�����%�O���jl�"Qs�3^DC��) �R^���F������x|�����`�_���c��}�_����aꄚi �R���TX�n���1+����+a��H���ۧ�^��_|�t��D�;�5��&]�E��jG�+�Ywk~h
�U<�e�	2.���3P�WO�5���j��W�@�g0��H/3� {������;7ٻ{�8?�
?�g�A���3|<�U\�q�ƹ#������%C�w�PX�B��ݬ�s�Pl�3��v���9�:\�N���
r��|����#�2�I?����!|G%��)�=x�N��N��5�녣���}�˽�p�=����˽s������E_���
������X�Gڬ�7=8Q�ٝ3�ph#��LĶ��}�$�X6;�' �e�c|�.�E��M�Aő���x��B]�eԾ�ٯGW��B���l�<�\8�G��b�tl^8u��[^�B�~-���ߋE��$ћ��*�c�����D��︁_��I��Ƿ��e��1�q�h��}�n�/N~!EH^"�I-)@*���i�����i�Ƕ&�/�C����ȻYHjk[i���?vo�t́
s �ݦ�b��Z��5����e��]�6�'u���/c���C-��U��pn�B��w�E��0w��1m���H]A��|���q~n�z�֥`�j�E�qb�җ�s�f�o[L&�N�E_���Z��-��4�?B�f�-��'ia8��eK�8�y!&�uY�ȟRG�
�-�>F_��4��@"c�gR�4L@�'eRG�
����P�Bd{�!���$�<A�'eRG��V���b)X�L�,�lY�N�u:Իս{�W�����[��F)�z��I�dɢE�hdG���
ƃ�#�i6��������|)�ѣ����fmٳ�C۶u�L�	7�
C�Ɉ=;�8�g"�<��ql*�v�҂A��v�v�=�|��˗�r�nM�vM�P˩�-�E���@�;���!��Nĝ3F��4xn� ۋ�ːI����.���ӕv����,D�q%n�%��I����W�5f_M��j|�?�M����;0 �Oӗ��sk=�}����lK|�S�=اt����
s�>�X�_��/�S�飻 �j��#�1<��7�>���B̵Ո��
1�����M,��X��������s2�Fu��?���4M�صk�珷p��ԣ/�ʘ���4���0ˉaG&�����4DZ�����l�B�>5������Iվ���z�c���Ї�!�f"NLSZ��
�g��߂0�c�~6@�C��m�����֢��I����>��I�j�*�������wI��l��������
�]c4v�S����5j�	bUlD�>�qr&v��?�(��2��_ջ��Ҏ>3�}:��&Q��
�3��Ǔq��n�mc�-M
ɓ��Y�G���&������2�Z���g��-m�8n���M͝��0��6^�ɴ'��M�r_����X89������i��I�q>����ss}v.^[�F�a#���]��ϓ�9�cbb(H���T���o����}�yԟ�|���A�ڀ2�Z�~�BCO/@���h��F����G���C�������sj�t�=3�-�5��l�[!��u�|#���8����Q���j>�?eR���n��u���<_��.�7��#�fB���S&�{�O.A�E�ZB�M������^�+��)�1�m#Ϛ �n���s��3eR��M��w��
�~~%�ϭ&k�j����^s�Y~�ߍ� i�;�᪌u�.C��~_�����;�8�q"�6���2�Z�R?�0�Mx}i".�'�_�a��̿���$$��cZ�-��B�#��nD�6G�s,�1��4�<�2�Z�l_����6QW6��	\c�
��6��f�Y��ڨz�5SF�ڌ�g����J�_�O�4M���F!���a�olF�usD�6C�]��}?�{u�L���蛬�mb�lA��^�>څ��C��{M�سg3��K�q�w ��V��7C��)b�}��i␀=a=э{�{����υ��]nYc�2}��4��6�}�����v�;mCܓ͊x's��'q����<��p��~���p9�C���2�?�w��u�5�y��?T�L�&�p�����* �>�I��=v"��ĹjĿd�}7����^��,�}�2���6������;��6�,Z�2i����̦ �����"/q>$��X�~�`;���N�^k��}[����Q��x݀CxJk�[km�U�ʤi�r}[�	�Q#:��։xy�?���>������Ć�����b߆	�oGH�ܹs���?����ldnn�s�Mj�>�ڐ�Hm�z�(��&��R�_�
���O��szܘ.<���լYf��c������~�lqb6>�D����@�����ϟ���K(��S�\E��jKn�6|UoF�6T]�jc�����?���s�T�%i������Z��rq�S��J�A*|���w��u9
�L�yJ6"���E�y��)B�����.��}D����ҮӼ��B��WY�]����|Cr��D��=)M��j�.i@���j��6?`�N��'�N���OFimg/volume_icon_googledrive.svg000064400000000337151215013440012745 0ustar00<svg xmlns="http://www.w3.org/2000/svg" version="1" width="48" height="48"><path d="M17 6h14l14 24H31z" fill="#ffc107"/><path d="M10 42l7-12h28l-7 12z" fill="#1976d2"/><path d="M3 30l7 12 14-24-7-12z" fill="#4caf50"/></svg>img/volume_icon_network.svg000064400000031444151215013440012133 0ustar00<svg xmlns="http://www.w3.org/2000/svg" width="160" height="160" viewBox="0 0 42.33 42.33" id="svg8"><g id="layer1" transform="translate(-48.98 -204.72)"><g id="XMLID_16103_" transform="matrix(1.05625 0 0 1.0371 44.78 200.04)"><ellipse ry="1.9" rx="14.6" cy="43.1" cx="24" id="XMLID_16108_" opacity=".15" fill="#45413c"/><path d="M43.3 27.4c0-2.5-1.5-4.6-3.6-5.6.1-.6.2-1.1.2-1.7a6.8 6.8 0 0 0-9.4-6.3c-.8-4.8-5-8.5-10-8.5-5.6 0-10.2 4.6-10.2 10.2v.7a9.13 9.13 0 0 0-5.5 8.3c0 5 4 9 9 9h23.5c3.3 0 6-2.7 6-6.1z" id="XMLID_16107_" fill="#fff"/><path d="M37.2 29.2H13.7a9.1 9.1 0 0 1-8.8-6.9c-.2.7-.3 1.4-.3 2.1 0 5 4 9 9 9h23.5a6.06 6.06 0 0 0 5.7-8.2c-.8 2.4-3 4-5.6 4z" id="XMLID_16106_" fill="#f0f0f0"/><path d="M43.3 27.4c0-2.5-1.5-4.6-3.6-5.6.1-.6.2-1.1.2-1.7a6.8 6.8 0 0 0-9.4-6.3c-.8-4.8-5-8.5-10-8.5-5.6 0-10.2 4.6-10.2 10.2v.7a9.13 9.13 0 0 0-5.5 8.3c0 5 4 9 9 9h23.5c3.3 0 6-2.7 6-6.1z" class="st4" id="XMLID_16105_" fill="none" stroke="#45413c" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M30.4 13.8a7.68 7.68 0 0 0-4.1 6.5" class="st4" id="XMLID_16104_" fill="none" stroke="#45413c" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/></g><g id="g3965" transform="matrix(.81344 0 0 .81344 50.86 206.3)" overflow="visible"><g id="Layer_1"><g id="g1182"><path id="path1183" d="M36.05 41h-8.6a1.5 1.5 0 0 0-.73-.64v-8.69h-4.88v8.69a1.5 1.5 0 0 0-.73.64h-8.6v4.88h8.45A1.5 1.5 0 0 0 22.4 47h3.75c.7 0 1.28-.48 1.45-1.12h8.44z" opacity=".2"/><path id="path1184" d="M35.86 40.82h-8.59a1.5 1.5 0 0 0-.74-.64v-8.7h-4.87v8.7a1.5 1.5 0 0 0-.74.64h-8.6v4.87h8.45a1.5 1.5 0 0 0 1.45 1.13h3.75c.7 0 1.28-.48 1.45-1.13h8.44z" opacity=".2"/><path id="path1185" d="M35.67 40.63h-8.59a1.5 1.5 0 0 0-.74-.64V31.3h-4.87v8.69a1.5 1.5 0 0 0-.74.64h-8.59v4.87h8.44a1.5 1.5 0 0 0 1.45 1.13h3.75c.7 0 1.29-.48 1.45-1.13h8.44z" opacity=".2"/><path id="polygon1186" fill="#616161" d="M11.95 40.44v4.88H35.5v-4.88h-.68z"/><linearGradient y2="44.64" x2="23.72" y1="41.11" x1="23.72" gradientUnits="userSpaceOnUse" id="XMLID_20_"><stop id="stop1188" offset="0" stop-color="#cecedb"/><stop id="stop1189" offset=".19" stop-color="#fff"/><stop id="stop1190" offset=".48" stop-color="#cecedb"/><stop id="stop1191" offset=".75" stop-color="#b3b3c6"/><stop id="stop1192" offset=".99" stop-color="#828282"/></linearGradient><path id="rect1202" fill="url(#XMLID_20_)" d="M12.62 41.11h22.19v3.53H12.62z"/><path id="polygon1203" fill="#616161" d="M21.28 43.96h4.88V31.1h-4.88v.37z"/><linearGradient gradientTransform="rotate(-90 -256.9 586)" y2="868.38" x2="291.57" y1="864.85" x1="291.57" gradientUnits="userSpaceOnUse" id="XMLID_21_"><stop id="stop1205" offset="0" stop-color="#cecedb"/><stop id="stop1206" offset=".19" stop-color="#fff"/><stop id="stop1207" offset=".48" stop-color="#cecedb"/><stop id="stop1208" offset=".75" stop-color="#b3b3c6"/><stop id="stop1209" offset=".99" stop-color="#828282"/></linearGradient><path id="rect1219" fill="url(#XMLID_21_)" d="M21.95 31.48h3.53v12.11h-3.53z"/><linearGradient y2="39.69" x2="23.72" y1="46.44" x1="23.72" gradientUnits="userSpaceOnUse" id="XMLID_22_"><stop id="stop1221" offset="0" stop-color="#cf0000"/><stop id="stop1222" offset=".99" stop-color="#ff6d00"/></linearGradient><path id="path1226" d="M27.1 44.94c0 .83-.68 1.5-1.5 1.5h-3.76a1.5 1.5 0 0 1-1.5-1.5V41.2c0-.83.68-1.5 1.5-1.5h3.75c.83 0 1.5.67 1.5 1.5z" fill="url(#XMLID_22_)"/><linearGradient y2="49.63" x2="23.72" y1="37.07" x1="23.72" gradientUnits="userSpaceOnUse" id="XMLID_23_"><stop id="stop1228" offset="0" stop-color="#fff030"/><stop id="stop1229" offset=".99" stop-color="#ffae00"/></linearGradient><path id="path1233" d="M21.84 40.44a.75.75 0 0 0-.75.75v3.75c0 .42.34.75.75.75h3.75c.42 0 .75-.33.75-.75V41.2a.75.75 0 0 0-.75-.75z" fill="url(#XMLID_23_)"/><linearGradient y2="43.82" x2="23.72" y1="41" x1="23.72" gradientUnits="userSpaceOnUse" id="XMLID_24_"><stop id="stop1235" offset="0" stop-color="#fff"/><stop id="stop1236" offset=".5" stop-color="#ffe3a9"/><stop id="stop1237" offset=".99" stop-color="#ffc957"/></linearGradient><path id="path1241" d="M21.84 41c-.1 0-.18.09-.18.2v3.74c0 .1.08.19.18.19h3.75c.1 0 .2-.08.2-.19V41.2c0-.1-.1-.19-.2-.19z" fill="url(#XMLID_24_)"/></g><path id="path1242" d="M25.25 1.28L12.14 9.87l-.04.02-.05.04-.04.03-.17.2-.02.04-.04.08-.02.04-.03.09-.02.04-.02.08v.05l-.01.1V33.51c0 .44.28.83.7.97l9.76 3.26c.32.1.67.05.94-.15l13.02-9.77c.26-.2.41-.5.41-.82V4.22v-.05-.07l-.01-.06V4l-.02-.03-.02-.08-.02-.06-.03-.07-.04-.06-.04-.07-.04-.05-.04-.05-.02-.02-.03-.04a4.33 4.33 0 0 1-.11-.09l-.06-.03-.07-.05-.07-.03-.06-.02a7 7 0 0 0-.08-.03l-.05-.01-9.67-2.08c-.27-.06-.55 0-.78.15zM11.69 10.53" opacity=".2"/><path id="path1243" d="M36.14 4.2v-.05l-.01-.05v-.02l-.01-.02a.87.87 0 0 0-.05-.13l-.02-.04-.03-.04L36 3.8l-.03-.03a.94.94 0 0 0-.07-.06l-.03-.03a.83.83 0 0 0-.04-.03l-.04-.02h-.01l-.03-.02-.05-.02-.05-.01-.03-.01-9.67-2.08a.66.66 0 0 0-.5.1l-13.1 8.58h-.01l-.02.02-.03.02-.02.02a.71.71 0 0 0-.11.13l-.02.02c0 .02-.02.04-.03.05v.03l-.03.05v.03l-.02.06v.03l-.01.06V33.5c0 .28.18.53.45.62l9.76 3.25c.2.07.43.04.6-.1l13.02-9.76a.66.66 0 0 0 .26-.52V4.22 4.2z" opacity=".2"/><path id="path1244" d="M25.06 1.09l-13.1 8.59-.05.03-.05.03-.03.03-.18.2-.02.04-.04.08-.02.04-.03.09-.01.04-.03.09v.05l-.01.1v22.82c0 .44.28.83.7.98l9.76 3.25c.32.1.68.05.95-.15l13.02-9.77c.25-.19.4-.5.4-.82V4.03v-.05-.06l-.01-.07V3.8c0-.02-.01-.01-.02-.03l-.02-.08-.02-.06a14.21 14.21 0 0 0-.1-.2l-.05-.05-.04-.05-.01-.01-.04-.04-.05-.05-.06-.04-.06-.04-.07-.04-.06-.03-.07-.03-.08-.02-.05-.02L25.84.94c-.27-.05-.55 0-.78.15zM11.5 10.35" opacity=".2"/><path id="path1245" d="M35.95 4v-.04l-.01-.05V3.9l-.01-.02-.01-.05-.02-.04a.34.34 0 0 0-.02-.04l-.02-.04-.03-.04-.02-.04-.03-.03-.03-.03a.33.33 0 0 0-.04-.03l-.03-.03a.83.83 0 0 0-.12-.07l-.05-.02-.04-.01-.03-.01-9.68-2.08a.66.66 0 0 0-.5.1l-13.1 8.58h-.01l-.02.02-.03.02-.02.02a.71.71 0 0 0-.11.13l-.02.02-.02.05-.02.03-.02.05v.03l-.02.06v.09l-.01.02v22.79c0 .28.18.53.45.62l9.76 3.25c.2.07.43.04.6-.1l13.02-9.76a.66.66 0 0 0 .26-.52V4.03v-.02z" opacity=".2"/><linearGradient y2="8.67" x2="14.03" y1="26.92" x1="32.27" gradientUnits="userSpaceOnUse" id="XMLID_25_"><stop id="stop1247" offset="0" stop-color="#585868"/><stop id="stop1248" offset="1" stop-color="#494949"/></linearGradient><path id="path1252" d="M24.87.77l-13.1 8.6-.05.02-.04.04-.04.03-.17.2-.03.04-.04.08-.02.04-.03.08-.01.04-.02.1-.01.04-.01.1V33.01c0 .44.28.83.7.97l9.77 3.26c.32.1.67.05.94-.15l13.02-9.77c.26-.2.41-.5.41-.82V3.7v-.04-.07l-.02-.07V3.5l-.01-.04-.03-.07-.02-.06-.03-.07L36 3.2l-.04-.07-.04-.05-.04-.05a.3.3 0 0 0-.02-.02l-.04-.04a3.78 3.78 0 0 1-.16-.13l-.08-.04-.06-.03-.07-.03-.07-.02-.06-.01L25.65.63c-.27-.06-.55 0-.78.14zM11.32 10.03" fill="url(#XMLID_25_)"/><linearGradient y2="28.05" x2="33.41" y1="9.81" x1="15.17" gradientUnits="userSpaceOnUse" id="XMLID_26_"><stop id="stop1254" offset="0" stop-color="#7d7d99"/><stop id="stop1255" offset="1" stop-color="#494949"/></linearGradient><path id="path1259" d="M35.76 3.7v-.05-.05l-.01-.02v-.02l-.02-.05-.02-.04a.34.34 0 0 0-.02-.05l-.02-.03-.02-.04-.03-.04-.03-.03-.03-.04-.03-.03-.04-.02-.04-.03-.04-.02-.04-.02-.04-.02-.05-.02h-.03L25.57 1a.66.66 0 0 0-.5.09l-13.1 8.59h-.01l-.02.01-.03.03-.02.02a.71.71 0 0 0-.11.13l-.01.02-.03.05-.02.03-.01.05-.01.03-.02.05V33c0 .29.17.54.44.63l9.76 3.25c.2.07.43.03.6-.1l13.02-9.76a.66.66 0 0 0 .26-.53V3.72v-.03z" fill="url(#XMLID_26_)"/><radialGradient gradientUnits="userSpaceOnUse" gradientTransform="translate(19.5 19.5) scale(.1875)" fy="47.28" fx="105.2" r="139.09" cy="47.28" cx="105.2" id="XMLID_27_"><stop id="stop1261" offset="0" stop-color="#fff"/><stop id="stop1262" offset=".28" stop-color="#cecedb"/><stop id="stop1263" offset=".64" stop-color="#bdbdcf"/><stop id="stop1264" offset="1" stop-color="#9a9ab1"/></radialGradient><path id="polygon1272" fill="url(#XMLID_27_)" d="M12.33 10.22l9.76 3.26L35.11 3.7V26.5l-13.02 9.76-9.76-3.25z"/><linearGradient y2="3.36" x2="23.72" y1="13.22" x1="23.72" gradientUnits="userSpaceOnUse" id="XMLID_28_"><stop id="stop1274" offset="0" stop-color="#cecedb"/><stop id="stop1275" offset="1" stop-color="#eee"/></linearGradient><path id="polygon1279" fill="url(#XMLID_28_)" d="M25.44 1.64l-13.11 8.58 9.76 3.26L35.11 3.7z"/><linearGradient y2="38.24" x2="22.17" y1="16.69" x1="15.04" gradientUnits="userSpaceOnUse" id="XMLID_29_"><stop id="stop1281" offset="0" stop-color="#fff"/><stop id="stop1282" offset="1" stop-color="#cecedb"/></linearGradient><path id="polygon1286" fill="url(#XMLID_29_)" d="M12.33 33l9.76 3.26V13.48l-9.76-3.26z"/><linearGradient y2="28.48" x2="17.78" y1="35.2" x1="16.64" gradientUnits="userSpaceOnUse" id="XMLID_30_"><stop id="stop1288" offset="0" stop-color="#fff"/><stop id="stop1289" offset="1" stop-color="#bdbdcf"/></linearGradient><path id="polygon1293" fill="url(#XMLID_30_)" d="M12.33 27.4V33l9.76 3.26V30.5z"/><linearGradient y2="16.36" x2="20.09" y1="16.36" x1="13.81" gradientUnits="userSpaceOnUse" id="XMLID_31_"><stop id="stop1295" offset="0" stop-color="#7d7d99"/><stop id="stop1296" offset="1" stop-color="#cecedb"/></linearGradient><path id="polygon1300" fill="url(#XMLID_31_)" d="M13.8 16.16l6.3 2.1v-1.71l-6.3-2.1z"/><linearGradient y2="18.78" x2="20.09" y1="18.78" x1="13.81" gradientUnits="userSpaceOnUse" id="XMLID_32_"><stop id="stop1302" offset="0" stop-color="#7d7d99"/><stop id="stop1303" offset="1" stop-color="#cecedb"/></linearGradient><path id="polygon1307" fill="url(#XMLID_32_)" d="M13.8 18.6l6.3 2.09v-1.71l-6.3-2.1z"/><linearGradient y2="22.93" x2="18.67" y1="18.9" x1="14.63" gradientUnits="userSpaceOnUse" id="XMLID_33_"><stop id="stop1309" offset="0" stop-color="#7d7d99"/><stop id="stop1310" offset="1" stop-color="#cecedb"/></linearGradient><path id="polygon1314" fill="url(#XMLID_33_)" d="M13.8 21.02l6.3 2.1V21.4l-6.3-2.1z"/><g id="g1315"><linearGradient gradientTransform="matrix(.9659 .2588 0 1.0353 -242.05 -531.04)" y2="477.59" x2="271.32" y1="478.92" x1="271.32" gradientUnits="userSpaceOnUse" id="XMLID_34_"><stop id="stop1317" offset=".01" stop-color="#fff"/><stop id="stop1318" offset="1" stop-color="#b6b6b6"/></linearGradient><path id="path1322" d="M19.78 33.41c-.46-.12-.81.1-.81.5s.35.8.8.93l.49.13c.45.12.8-.1.8-.5s-.35-.8-.8-.93z" fill="url(#XMLID_34_)"/><linearGradient gradientTransform="matrix(.9659 .2588 0 1.0353 -242.05 -531.04)" y2="477.72" x2="271.32" y1="478.86" x1="271.32" gradientUnits="userSpaceOnUse" id="XMLID_35_"><stop id="stop1324" offset=".01" stop-color="#b6b6b6"/><stop id="stop1325" offset=".37" stop-color="#9d9d9d"/><stop id="stop1326" offset=".74" stop-color="#898989"/><stop id="stop1327" offset="1" stop-color="#828282"/></linearGradient><path id="path1331" d="M19.78 33.6c-.35-.1-.63.07-.63.36s.28.6.63.69l.48.13c.34.09.63-.07.63-.36 0-.28-.29-.6-.63-.69z" fill="url(#XMLID_35_)"/><linearGradient gradientTransform="matrix(-.9659 -.2588 0 .7765 -840.35 -606.85)" y2="528.08" x2="-890.74" y1="529.26" x1="-890.74" gradientUnits="userSpaceOnUse" id="XMLID_36_"><stop id="stop1333" offset=".01" stop-color="#9f6"/><stop id="stop1334" offset=".24" stop-color="#68de56"/><stop id="stop1335" offset=".48" stop-color="#3bc147"/><stop id="stop1336" offset=".7" stop-color="#1bab3c"/><stop id="stop1337" offset=".88" stop-color="#079e35"/><stop id="stop1338" offset="1" stop-color="#093"/></linearGradient><path id="path1342" d="M20.83 34.4c0 .26-.26.4-.57.31l-.48-.13c-.32-.08-.57-.35-.57-.6 0-.26.25-.4.57-.31l.48.12c.31.09.57.36.57.62z" fill="url(#XMLID_36_)"/><linearGradient gradientTransform="matrix(.9659 .2588 0 1.0353 -242.05 -531.04)" y2="477.65" x2="271.34" y1="478.52" x1="271.31" gradientUnits="userSpaceOnUse" id="XMLID_37_"><stop id="stop1344" offset=".01" stop-color="#3c3"/><stop id="stop1345" offset=".36" stop-color="#1bb433"/><stop id="stop1346" offset=".74" stop-color="#07a033"/><stop id="stop1347" offset="1" stop-color="#093"/></linearGradient><path id="path1351" d="M19.78 33.8c-.25-.07-.46.03-.46.22s.21.4.46.47l.48.13c.24.06.45-.04.45-.23s-.2-.4-.45-.47z" fill="url(#XMLID_37_)"/><linearGradient gradientTransform="matrix(.9659 .2588 0 1.0353 -242.05 -531.04)" y2="478.35" x2="271.32" y1="477.78" x1="271.32" gradientUnits="userSpaceOnUse" id="XMLID_38_"><stop id="stop1353" offset="0" stop-color="#fff"/><stop id="stop1354" offset=".09" stop-color="#e8f7d6"/><stop id="stop1355" offset=".23" stop-color="#c8ed9e"/><stop id="stop1356" offset=".36" stop-color="#ade46d"/><stop id="stop1357" offset=".5" stop-color="#97dc46"/><stop id="stop1358" offset=".63" stop-color="#85d627"/><stop id="stop1359" offset=".76" stop-color="#79d212"/><stop id="stop1360" offset=".89" stop-color="#72d004"/><stop id="stop1361" offset="1" stop-color="#6fcf00"/></linearGradient><path id="path1365" d="M19.76 33.71c-.2-.05-.36.04-.36.15 0 .12.16.3.36.35l.52.14c.2.05.35-.04.35-.15 0-.12-.15-.3-.35-.35z" fill="url(#XMLID_38_)"/></g><path id="_x3C_Slice_x3E_" fill="none" d="M0 48V0h48v48"/></g></g></g><style id="style3713">.st4{fill:none;stroke:#45413c;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10}</style></svg>img/edit_tinymce.png000064400000000362151215013440010500 0ustar00�PNG


IHDR�a�IDATxcP,��@���r0H� 6@���z��Ǥ��l�x�m۵��[�7�f��|`j6���?t�M0VF��L�A�ط��%+�=�_��>�w<d�4@�%���W������mZ��o��$��(��r�h�rfch�g�!��	�0�k�#�f2��Y��*�=3�m|TM*eIEND�B`�img/edit_ckeditor5.png000064400000000215151215013440010716 0ustar00�PNG


IHDR�aTIDATx�c��\�a\�5#c25bb25bb��A�����
���^��� `=
 �:�T�M8���ħ��H�g&��3y�As��IEND�B`�img/fm_close_icon.png000064400000003050151215013440010617 0ustar00�PNG


IHDRr
ߔtEXtSoftwareAdobe ImageReadyq�e<&iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CC 2014 (Windows)" xmpMM:InstanceID="xmp.iid:D34731D3212C11E8953292F3C7C28D8F" xmpMM:DocumentID="xmp.did:D34731D4212C11E8953292F3C7C28D8F"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:D34731D1212C11E8953292F3C7C28D8F" stRef:documentID="xmp.did:D34731D2212C11E8953292F3C7C28D8F"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>���IDATx�̖�K�A�9S%n�JG�E,h!�8H@S�s6�T���@R�n�M�d
.AP��":�V��}�pw�_�i�r�����ݻw/��=h��Bs�4
����jP���&�Q,��6�OP۞�;>�>����M��;&���g�t]@�l�Ơ(M�}Z���t�B?�U��b8m=�l1��mh�������#�d��0�^�m�8�G���	���Z�A�hZ��uh�,3�
^h�n3-�$D�,t�r�Y&M�W=˘p�,�\6sy�Ő(�C�:�&=�_<�P�z����\Gs���{���s��$����2����e{d�)~Y�C����\C5l��0��LJ�=gn|b�,c��ٮai��!�/�VL�wF���ꙶ��y$cP����&�0������¾PH��Kƭ�}c�o���7
:FƵb8��Bɂ�{Z���}פC��g�ӹ�G�j��@��O��G���oxSO��&�c�ud��:�eR�/%H��Тq6а�o����>5����Y�M���)��箮s�M^aY �}���-[\��K�~���l�,1�q�r��\�<a�Y��j)x����x�Kq��ٴ]D��2���U��K�,��
0J��8��g�IEND�B`�img/volume_icon_zip.png000064400000000733151215013440011226 0ustar00�PNG


IHDR(-S�PLTEGpLɆ�̈�|�uƄ̈�\Â�y�r�f�l�ciF�}`@www�����ߘ���׏���ԋ�Ї���υ������۔�͂���ˁ��|�ڒݾz����ǥ`���v���������ϭi��K��W̪f����.�����A�����AtRNS��a��������
z�,��f�3Q��<��IDAT��N�0���P�
��7�q����znB�������A��T�u�j�^A�yk8�5� BX:.��%@�	 (�,O�YW ��6���ز^ȮS^���n�~�NO��[��X͒[�"���'�C
��&[�0K����Ҡ��K`(���O��:��v<QOH-�w�IEND�B`�img/edit_simplemde.png000064400000000220151215013440011000 0ustar00�PNG


IHDR���RPLTE��a���������������������3IDATxc������WCH�`��%�bii�P1F\��HII���JR�HF�IEND�B`�img/edit_pixlreditor.png000064400000001562151215013440011400 0ustar00�PNG


IHDR�a9IDATx�m�`a�wLj�)"��mi�f۶m۶m۶m)�����B m	���j�%��z�"���'oj��Q���K<E�W�����R�J��؀���D=��)���
���C|)
�G�rӻ�A��s�R��$�'YS:��m���*��f�3}���أ����D�X
ŵ��^{}Gξ�����u�F��IS���VHHRn���~�u��FpV��(�:����sȲ�9G�`J�!���3�v�3�I����8p��(���*��3$[y�W�/�>�m<K����"�[׵h껜��b*d�iM�U�;��t��p�'Ӹ���5�|fb"Έ��[Jip����T]�Q��I�w��u���IAF؛�`фh�?�۴(�� ��Q���<|�{Vh�L]�j���H�� �5��(o�����fh��X�(�;�ZD�m����6h�}	�.؇p�4ƍ�o�)-1	�a;1p�t|7���Y�қ>����'�I$�7f��C!��~ܭ� ^���Z:�x���ڏ�ϝ��8��OÞ�<`�O4�-8�xϐ`���U���jtGh:�3��n�us�r�d2�p���&�R/�T�Y���Y5N�-��p���6����+�
��Q]�.��wy�w�-�P�����|��n�vAk��H�VbM�0���)�Z��x�!Γ��X�YMw�����Sa'�W�$pS�Oh�~>X'ɷ�X'R����3�ωޕF�IHgY+�-�ǭJ+�`��I�E��px
��?ӭ��$�-Ր����! ��r���Ue OZ �Q�Ͻ�,@�	IEND�B`�img/volume_icon_dropbox.png000064400000000635151215013440012102 0ustar00�PNG


IHDR�adIDATxڍS%\fA�3�g���z����h�=��F�]"��
7{������糾3��~�9�rW���'a{����?9��n��N��Z�ߗƹ�ٺI<ˋ�2��͏���Nj��6M�څ�X����8�=�-z �[�G��v"_��d�ܹf��O0�ν��X	��@P�su��W0��}�S��t��}�D�D�Fؾ�*��6�O�j�a�>�̹gh�/,/���A�B��
Mn��DCP<��)��<�I�7�Ϳ熙Z�R��YX^*�9_�B���!��A0P�ITi4^&r.����S3�_�A�ѯ��Z���(>�ʹL���k<8=���a��g��K����Xa��)�IEND�B`�css/contextmenu.css000064400000013571151215013440010422 0ustar00/* menu and submenu */
.elfinder .elfinder-contextmenu,
.elfinder .elfinder-contextmenu-sub {
    position: absolute;
    border: 1px solid #aaa;
    background: #fff;
    color: #555;
    padding: 4px 0;
    top: 0;
    left: 0;
    z-index: 9999 !important;
}

/* submenu */
.elfinder .elfinder-contextmenu-sub {
    top: 5px;
}

/* submenu in rtl/ltr enviroment */
.elfinder .elfinder-contextmenu-ltr .elfinder-contextmenu-sub {
    margin-left: -5px;
}

.elfinder .elfinder-contextmenu-rtl .elfinder-contextmenu-sub {
    margin-right: -5px;
}

/* menu item */
.elfinder .elfinder-contextmenu-header {
    margin-top: -4px;
    padding: 0 .5em .2ex;
    border: none;
    text-align: center;
}

.elfinder .elfinder-contextmenu-header span {
    font-weight: normal;
    font-size: 0.8em;
    font-weight: bolder;
}

.elfinder .elfinder-contextmenu-item {
    position: relative;
    display: block;
    padding: 4px 30px;
    text-decoration: none;
    white-space: nowrap;
    cursor: default;
}

.elfinder .elfinder-contextmenu-item.ui-state-active {
    border: none;
}

.elfinder .elfinder-contextmenu-item .ui-icon {
    width: 16px;
    height: 16px;
    position: absolute;
    left: auto;
    right: auto;
    top: 50%;
    margin-top: -8px;
}

.elfinder .elfinder-contextmenu-ltr .elfinder-contextmenu-item .ui-icon {
    left: 2px;
}

.elfinder .elfinder-contextmenu-rtl .elfinder-contextmenu-item .ui-icon {
    right: 0px;
}

.elfinder-touch .elfinder-contextmenu-item {
    padding: 12px 38px;
}

/* root icon of each volume */
.elfinder-navbar-root-local.elfinder-contextmenu-icon {
    background-image: url("../img/volume_icon_local.svg");
    background-size: contain;
}

.elfinder-navbar-root-trash.elfinder-contextmenu-icon {
    background-image: url("../img/volume_icon_trash.svg");
    background-size: contain;
}

.elfinder-navbar-root-ftp.elfinder-contextmenu-icon {
    background-image: url("../img/volume_icon_ftp.svg");
    background-size: contain;
}

.elfinder-navbar-root-sql.elfinder-contextmenu-icon {
    background-image: url("../img/volume_icon_sql.svg");
    background-size: contain;
}

.elfinder-navbar-root-dropbox.elfinder-contextmenu-icon {
    background-image: url("../img/volume_icon_dropbox.svg");
    background-size: contain;
}

.elfinder-navbar-root-googledrive.elfinder-contextmenu-icon {
    background-image: url("../img/volume_icon_googledrive.svg");
    background-size: contain;
}

.elfinder-navbar-root-onedrive.elfinder-contextmenu-icon {
    background-image: url("../img/volume_icon_onedrive.svg");
    background-size: contain;
}

.elfinder-navbar-root-box.elfinder-contextmenu-icon {
    background-image: url("../img/volume_icon_box.svg");
    background-size: contain;
}

.elfinder-navbar-root-zip.elfinder-contextmenu-icon {
    background-image: url("../img/volume_icon_zip.svg");
    background-size: contain;
}

.elfinder-navbar-root-network.elfinder-contextmenu-icon {
    background-image: url("../img/volume_icon_network.svg");
    background-size: contain;
}

/* text in item */
.elfinder .elfinder-contextmenu .elfinder-contextmenu-item span {
    display: block;
}

/* submenu item in rtl/ltr enviroment */
.elfinder .elfinder-contextmenu-sub .elfinder-contextmenu-item {
    padding-left: 12px;
    padding-right: 12px;
}

.elfinder .elfinder-contextmenu-ltr .elfinder-contextmenu-item {
    text-align: left;
}

.elfinder .elfinder-contextmenu-rtl .elfinder-contextmenu-item {
    text-align: right;
}

.elfinder .elfinder-contextmenu-ltr .elfinder-contextmenu-sub .elfinder-contextsubmenu-item-icon {
    padding-left: 28px;
}

.elfinder .elfinder-contextmenu-rtl .elfinder-contextmenu-sub .elfinder-contextsubmenu-item-icon {
    padding-right: 28px;
}

.elfinder-touch .elfinder-contextmenu-ltr .elfinder-contextmenu-sub .elfinder-contextsubmenu-item-icon {
    padding-left: 36px;
}

.elfinder-touch .elfinder-contextmenu-rtl .elfinder-contextmenu-sub .elfinder-contextsubmenu-item-icon {
    padding-right: 36px;
}

/* command/submenu icon */
.elfinder .elfinder-contextmenu-extra-icon,
.elfinder .elfinder-contextmenu-arrow,
.elfinder .elfinder-contextmenu-icon {
    position: absolute;
    top: 50%;
    margin-top: -8px;
    overflow: hidden;
}

.elfinder-touch .elfinder-button-icon.elfinder-contextmenu-icon {
    transform-origin: center center;
}

/* command icon in rtl/ltr enviroment */
.elfinder .elfinder-contextmenu-ltr .elfinder-contextmenu-icon {
    left: 8px;
}

.elfinder .elfinder-contextmenu-rtl .elfinder-contextmenu-icon {
    right: 8px;
}

.elfinder .elfinder-contextmenu-ltr .elfinder-contextmenu-extra-icon {
    right: 8px;
}

.elfinder .elfinder-contextmenu-rtl .elfinder-contextmenu-extra-icon {
    left: 8px;
}

/* arrow icon */
.elfinder .elfinder-contextmenu-arrow {
    width: 16px;
    height: 16px;
    background: url('../img/arrows-normal.png') 5px 4px no-repeat;
}

/* arrow icon in rtl/ltr enviroment */
.elfinder .elfinder-contextmenu-ltr .elfinder-contextmenu-arrow {
    right: 5px;
}

.elfinder .elfinder-contextmenu-rtl .elfinder-contextmenu-arrow {
    left: 5px;
    background-position: 0 -10px;
}

/* command extra icon's <a>, <span> tag */
.elfinder .elfinder-contextmenu-extra-icon a,
.elfinder .elfinder-contextmenu-extra-icon span {
    position: relative;
    width: 100%;
    height: 100%;
    margin: 0;
    color: transparent !important;
    text-decoration: none;
    cursor: pointer;
}

/* disable ui border/bg image on hover */
.elfinder .elfinder-contextmenu .ui-state-hover {
    border: 0 solid;
    background-image: none;
}

/* separator */
.elfinder .elfinder-contextmenu-separator {
    height: 0px;
    border-top: 1px solid #ccc;
    margin: 0 1px;
}

/* for CSS style priority to ui-state-disabled - "background-image: none" */
.elfinder .elfinder-contextmenu-item .elfinder-button-icon.ui-state-disabled {
    background-image: url('../img/toolbar.png');
}

.elfinder .elfinder-contextmenu-ltr .elfinder-contextmenu-extra-icon{ display:none !important; }css/fonts.css000064400000002455151215013440007201 0ustar00.elfinder-font-mono {
    font-family: "Ricty Diminished", "Myrica M", Consolas, "Courier New", Courier, Monaco, monospace;
    font-size: 1.1em;
}

.elfinder-contextmenu .elfinder-contextmenu-item span {
    font-size: .72em;
}

.elfinder-cwd-view-icons .elfinder-cwd-filename {
    font-size: .7em;
}

.elfinder-cwd-view-list td {
    font-size: .7em;
}

.std42-dialog .ui-dialog-titlebar {
    font-size: .82em;
}

.std42-dialog .ui-dialog-content {
    font-size: .72em;
}

.std42-dialog .ui-dialog-buttonpane {
    font-size: .76em;
}

.elfinder-info-tb {
    font-size: .9em;
}

.elfinder-upload-dropbox {
    font-size: 1.2em;
}

.elfinder-upload-dialog-or {
    font-size: 1.2em;
}

.dialogelfinder .dialogelfinder-drag {
    font-size: .9em;
}

.elfinder .elfinder-navbar {
    font-size: .72em;
}

.elfinder-place-drag .elfinder-navbar-dir {
    font-size: .9em;
}

.elfinder-quicklook-title {
    font-size: .7em;
    font-weight: normal;
}

.elfinder-quicklook-info-data {
    font-size: .72em;
}

.elfinder-quicklook-preview-text-wrapper {
    font-size: .9em;
}

.elfinder-button-menu-item {
    font-size: .72em;
}

.elfinder-button-search input {
    font-size: .8em;
}

.elfinder-statusbar div {
    font-size: .7em;
}

.elfinder-drag-num {
    font-size: 12px;
}

.elfinder-toast {
    font-size: .76em;
}

css/commands.css000064400000046265151215013440007660 0ustar00/******************************************************************/
/*                          COMMANDS STYLES                       */
/******************************************************************/

/********************** COMMAND "RESIZE" ****************************/
.elfinder-resize-container {
    margin-top: .3em;
}

.elfinder-resize-type {
    float: left;
    margin-bottom: .4em;
}

.elfinder-resize-control {
    float: left;
}

.elfinder-resize-control input[type=number] {
    border: 1px solid #aaa;
    text-align: right;
    width: 4.5em;
}

.elfinder-mobile .elfinder-resize-control input[type=number] {
    width: 3.5em;
}

.elfinder-resize-control input.elfinder-resize-bg {
    text-align: center;
    width: 5em;
    direction: ltr;
}

.elfinder-dialog-resize .elfinder-resize-control-panel {
    margin-top: 10px;
}

.elfinder-dialog-resize .elfinder-resize-imgrotate,
.elfinder-dialog-resize .elfinder-resize-pallet {
    cursor: pointer;
}

.elfinder-dialog-resize .elfinder-resize-picking {
    cursor: crosshair;
}

.elfinder-dialog-resize .elfinder-resize-grid8 + button {
    padding-top: 2px;
    padding-bottom: 2px;
}

.elfinder-resize-preview {
    width: 400px;
    height: 400px;
    padding: 10px;
    background: #fff;
    border: 1px solid #aaa;
    float: right;
    position: relative;
    overflow: hidden;
    text-align: left;
    direction: ltr;
}

.elfinder-resize-handle {
    position: relative;
}

.elfinder-resize-handle-hline,
.elfinder-resize-handle-vline {
    position: absolute;
    background-image: url("../img/crop.gif");
}

.elfinder-resize-handle-hline {
    width: 100%;
    height: 1px !important;
    background-repeat: repeat-x;
}

.elfinder-resize-handle-vline {
    width: 1px !important;
    height: 100%;
    background-repeat: repeat-y;
}

.elfinder-resize-handle-hline-top {
    top: 0;
    left: 0;
}

.elfinder-resize-handle-hline-bottom {
    bottom: 0;
    left: 0;
}

.elfinder-resize-handle-vline-left {
    top: 0;
    left: 0;
}

.elfinder-resize-handle-vline-right {
    top: 0;
    right: 0;
}

.elfinder-resize-handle-point {
    position: absolute;
    width: 8px;
    height: 8px;
    border: 1px solid #777;
    background: transparent;
}

.elfinder-resize-handle-point-n {
    top: 0;
    left: 50%;
    margin-top: -5px;
    margin-left: -5px;
}

.elfinder-resize-handle-point-ne {
    top: 0;
    right: 0;
    margin-top: -5px;
    margin-right: -5px;
}

.elfinder-resize-handle-point-e {
    top: 50%;
    right: 0;
    margin-top: -5px;
    margin-right: -5px;
}

.elfinder-resize-handle-point-se {
    bottom: 0;
    right: 0;
    margin-bottom: -5px;
    margin-right: -5px;
}

.elfinder-resize-handle-point-s {
    bottom: 0;
    left: 50%;
    margin-bottom: -5px;
    margin-left: -5px;
}

.elfinder-resize-handle-point-sw {
    bottom: 0;
    left: 0;
    margin-bottom: -5px;
    margin-left: -5px;
}

.elfinder-resize-handle-point-w {
    top: 50%;
    left: 0;
    margin-top: -5px;
    margin-left: -5px;
}

.elfinder-resize-handle-point-nw {
    top: 0;
    left: 0;
    margin-top: -5px;
    margin-left: -5px;
}

.elfinder-dialog.elfinder-dialog-resize .ui-resizable-e {
    width: 10px;
    height: 100%;
}

.elfinder-dialog.elfinder-dialog-resize .ui-resizable-s {
    width: 100%;
    height: 10px;
}

.elfinder-resize-loading {
    position: absolute;
    width: 200px;
    height: 30px;
    top: 50%;
    margin-top: -25px;
    left: 50%;
    margin-left: -100px;
    text-align: center;
    background: url(../img/progress.gif) center bottom repeat-x;
}

.elfinder-resize-row {
    margin-bottom: 9px;
    position: relative;
}

.elfinder-resize-label {
    float: left;
    width: 80px;
    padding-top: 3px;
}

.elfinder-resize-checkbox-label {
    border: 1px solid transparent;
}

.elfinder-dialog-resize .elfinder-resize-whctrls {
    margin: -20px 5px 0 5px;
}

.elfinder-ltr .elfinder-dialog-resize .elfinder-resize-whctrls {
    float: right;
}

.elfinder-rtl .elfinder-dialog-resize .elfinder-resize-whctrls {
    float: left;
}

.elfinder-dialog-resize .ui-resizable-e,
.elfinder-dialog-resize .ui-resizable-w {
    height: 100%;
    width: 10px;
}

.elfinder-dialog-resize .ui-resizable-s,
.elfinder-dialog-resize .ui-resizable-n {
    width: 100%;
    height: 10px;
}

.elfinder-dialog-resize .ui-resizable-e {
    margin-right: -7px;
}

.elfinder-dialog-resize .ui-resizable-w {
    margin-left: -7px;
}

.elfinder-dialog-resize .ui-resizable-s {
    margin-bottom: -7px;
}

.elfinder-dialog-resize .ui-resizable-n {
    margin-top: -7px;
}

.elfinder-dialog-resize .ui-resizable-se,
.elfinder-dialog-resize .ui-resizable-sw,
.elfinder-dialog-resize .ui-resizable-ne,
.elfinder-dialog-resize .ui-resizable-nw {
    width: 10px;
    height: 10px;
}

.elfinder-dialog-resize .ui-resizable-se {
    background: transparent;
    bottom: 0;
    right: 0;
    margin-right: -7px;
    margin-bottom: -7px;
}

.elfinder-dialog-resize .ui-resizable-sw {
    margin-left: -7px;
    margin-bottom: -7px;
}

.elfinder-dialog-resize .ui-resizable-ne {
    margin-right: -7px;
    margin-top: -7px;
}

.elfinder-dialog-resize .ui-resizable-nw {
    margin-left: -7px;
    margin-top: -7px;
}

.elfinder-touch .elfinder-dialog-resize .ui-resizable-s,
.elfinder-touch .elfinder-dialog-resize .ui-resizable-n {
    height: 20px;
}

.elfinder-touch .elfinder-dialog-resize .ui-resizable-e,
.elfinder-touch .elfinder-dialog-resize .ui-resizable-w {
    width: 20px;
}

.elfinder-touch .elfinder-dialog-resize .ui-resizable-se,
.elfinder-touch .elfinder-dialog-resize .ui-resizable-sw,
.elfinder-touch .elfinder-dialog-resize .ui-resizable-ne,
.elfinder-touch .elfinder-dialog-resize .ui-resizable-nw {
    width: 30px;
    height: 30px;
}

.elfinder-touch .elfinder-dialog-resize .elfinder-resize-preview .ui-resizable-se {
    width: 30px;
    height: 30px;
    margin: 0;
}

.elfinder-dialog-resize .ui-icon-grip-solid-vertical {
    position: absolute;
    top: 50%;
    right: 0;
    margin-top: -8px;
    margin-right: -11px;
}

.elfinder-dialog-resize .ui-icon-grip-solid-horizontal {
    position: absolute;
    left: 50%;
    bottom: 0;
    margin-left: -8px;
    margin-bottom: -11px;;
}

.elfinder-dialog-resize .elfinder-resize-row .ui-buttonset {
    float: right;
}

.elfinder-dialog-resize .elfinder-resize-degree input,
.elfinder-dialog-resize input.elfinder-resize-quality {
    width: 3.5em;
}

.elfinder-mobile .elfinder-dialog-resize .elfinder-resize-degree input,
.elfinder-mobile .elfinder-dialog-resize input.elfinder-resize-quality {
    width: 2.5em;
}

.elfinder-dialog-resize .elfinder-resize-degree button.ui-button {
    padding: 6px 8px;
}

.elfinder-dialog-resize button.ui-button span {
    padding: 0;
}

.elfinder-dialog-resize .elfinder-resize-jpgsize {
    font-size: 90%;
}

.ui-widget-content .elfinder-resize-container .elfinder-resize-rotate-slider {
    width: 195px;
    margin: 10px 7px;
    background-color: #fafafa;
}

.elfinder-dialog-resize .elfinder-resize-type span.ui-checkboxradio-icon {
    display: none;
}

.elfinder-resize-preset-container {
    box-sizing: border-box;
    border-radius: 5px;
}

/********************** COMMAND "EDIT" ****************************/
/* edit text file textarea */
.elfinder-file-edit {
    width: 100%;
    height: 100%;
    margin: 0;
    padding: 2px;
    border: 1px solid #ccc;
    box-sizing: border-box;
    resize: none;
}

.elfinder-touch .elfinder-file-edit {
    font-size: 16px;
}

/* edit area */
.elfinder-dialog-edit .ui-dialog-content.elfinder-edit-editor {
    background-color: #fff;
}

.elfinder-dialog-edit .ui-dialog-content.elfinder-edit-editor .elfinder-edit-imageeditor {
    width: 100%;
    height: 300px;
    max-height: 100%;
    text-align: center;
}

.elfinder-dialog-edit .ui-dialog-content.elfinder-edit-editor .elfinder-edit-imageeditor * {
    -webkit-user-select: none;
    -moz-user-select: none;
    -khtml-user-select: none;
    user-select: none;
}

.elfinder-edit-imageeditor .tui-image-editor-main-container .tui-image-editor-main {
    top: 0;
}

.elfinder-edit-imageeditor .tui-image-editor-main-container .tui-image-editor-header {
    display: none;
}

.elfinder-edit-imageeditor .tui-image-editor-main.tui-image-editor-menu-crop .tui-image-editor-wrap,
.elfinder-edit-imageeditor .tui-image-editor-main.tui-image-editor-menu-flip .tui-image-editor-wrap,
.elfinder-edit-imageeditor .tui-image-editor-main.tui-image-editor-menu-rotate .tui-image-editor-wrap,
.elfinder-edit-imageeditor .tui-image-editor-main.tui-image-editor-menu-draw .tui-image-editor-wrap,
.elfinder-edit-imageeditor .tui-image-editor-main.tui-image-editor-menu-shape .tui-image-editor-wrap,
.elfinder-edit-imageeditor .tui-image-editor-main.tui-image-editor-menu-icon .tui-image-editor-wrap,
.elfinder-edit-imageeditor .tui-image-editor-main.tui-image-editor-menu-text .tui-image-editor-wrap,
.elfinder-edit-imageeditor .tui-image-editor-main.tui-image-editor-menu-mask .tui-image-editor-wrap,
.elfinder-edit-imageeditor .tui-image-editor-main.tui-image-editor-menu-filter .tui-image-editor-wrap {
    height: calc(100% - 150px);
}

/* bottom margen for softkeyboard on fullscreen mode */
.elfinder-touch.elfinder-fullscreen-native textarea.elfinder-file-edit {
    padding-bottom: 20em;
    margin-bottom: -20em;
}

.elfinder-dialog-edit .ui-dialog-buttonpane .elfinder-dialog-confirm-encoding {
    font-size: 12px;
}

.ui-dialog-buttonpane .ui-dialog-buttonset.elfinder-edit-extras {
    margin: 0 1em 0 .2em;
    float: left;
}

.ui-dialog-buttonpane .ui-dialog-buttonset.elfinder-edit-extras-quality {
    padding-top: 6px;
}

.ui-dialog-buttonpane .ui-dialog-buttonset.elfinder-edit-extras select {
    font-size: 12px;
    margin-top: 1px;
    min-height: 28px;
}

.elfinder-dialog-edit .ui-dialog-buttonpane .ui-icon {
    cursor: pointer;
}

.elfinder-edit-spinner {
    position: absolute;
    top: 50%;
    text-align: center;
    width: 100%;
    font-size: 16pt;
}

.elfinder-dialog-edit .elfinder-edit-spinner .elfinder-spinner,
.elfinder-dialog-edit .elfinder-edit-spinner .elfinder-spinner-text {
    float: none;
}

.elfinder-dialog-edit .elfinder-toast > div {
    width: 280px;
}
 
.elfinder-edit-onlineconvert-button {
    display: inline-block;
    width: 180px;
    min-height: 30px;
    vertical-align: top;
}
.elfinder-edit-onlineconvert-button button,
.elfinder-edit-onlineconvert-bottom-btn button {
    cursor: pointer;
}
.elfinder-edit-onlineconvert-bottom-btn button.elfinder-button-ios-multiline {
    -webkit-appearance: none;
    border-radius: 16px;
    color: #000;
    text-align: center;
    padding: 8px;
    background-color: #eee;
    background-image: -webkit-linear-gradient(top, hsl(0,0%,98%) 0%,hsl(0,0%,77%) 100%);
    background-image: linear-gradient(to bottom, hsl(0,0%,98%) 0%,hsl(0,0%,77%) 100%);
}
.elfinder-edit-onlineconvert-button .elfinder-button-icon {
    margin: 0 10px;
    vertical-align: middle;
    cursor: pointer;
}
.elfinder-edit-onlineconvert-bottom-btn {
    text-align: center;
    margin: 10px 0 0;
}

.elfinder-edit-onlineconvert-link {
    margin-top: 1em;
    text-align: center;
}
.elfinder-edit-onlineconvert-link .elfinder-button-icon {
    background-image: url("../img/editor-icons.png");
    background-repeat: no-repeat;
    background-position: 0 -144px;
    margin-bottom: -3px;
}
.elfinder-edit-onlineconvert-link a {
    text-decoration: none;
}

/********************** COMMAND "SORT" ****************************/
/* for list table header sort triangle icon */
div.elfinder-cwd-wrapper-list tr.ui-state-default td {
    position: relative;
}

div.elfinder-cwd-wrapper-list tr.ui-state-default td span.ui-icon {
    position: absolute;
    top: 4px;
    left: 0;
    right: 0;
    margin: auto 0px auto auto;
}

.elfinder-touch div.elfinder-cwd-wrapper-list tr.ui-state-default td span.ui-icon {
    top: 7px;
}

.elfinder-rtl div.elfinder-cwd-wrapper-list tr.ui-state-default td span.ui-icon {
    margin-right: 5px;
}

/********************** COMMAND "HELP" ****************************/
/* help dialog */
.elfinder-help {
    margin-bottom: .5em;
    -webkit-overflow-scrolling: touch;
}

/* fix tabs */
.elfinder-help .ui-tabs-panel {
    padding: .5em;
    overflow: auto;
    padding: 10px;
}

.elfinder-dialog .ui-tabs .ui-tabs-nav li {
    overflow: hidden;
}

.elfinder-dialog .ui-tabs .ui-tabs-nav li a {
    padding: .2em .8em;
    display: inline-block;
}

.elfinder-touch .elfinder-dialog .ui-tabs .ui-tabs-nav li a {
    padding: .5em .5em;
}

.elfinder-dialog .ui-tabs-active a {
    background: inherit;
}

.elfinder-help-shortcuts {
    height: auto;
    padding: 10px;
    margin: 0;
    box-sizing: border-box;
}

.elfinder-help-shortcut {
    white-space: nowrap;
    clear: both;
}

.elfinder-help-shortcut-pattern {
    float: left;
    width: 160px;
}

.elfinder-help-logo {
    width: 100px;
    height: 96px;
    float: left;
    margin-right: 1em;
    background: url('../img/logo.png') center center no-repeat;
}

.elfinder-help h3 {
    font-size: 1.5em;
    margin: .2em 0 .3em 0;
}

.elfinder-help-separator {
    clear: both;
    padding: .5em;
}

.elfinder-help-link {
    display: inline-block;
    margin-right: 12px;
    padding: 2px 0;
    white-space: nowrap;
}

.elfinder-rtl .elfinder-help-link {
    margin-right: 0;
    margin-left: 12px;
}

.elfinder-help .ui-priority-secondary {
    font-size: .9em;
}

.elfinder-help .ui-priority-primary {
    margin-bottom: 7px;
}

.elfinder-help-team {
    clear: both;
    text-align: right;
    border-bottom: 1px solid #ccc;
    margin: .5em 0;
    font-size: .9em;
}

.elfinder-help-team div {
    float: left;
}

.elfinder-help-license {
    font-size: .9em;
}

.elfinder-help-disabled {
    font-weight: bold;
    text-align: center;
    margin: 90px 0;
}

.elfinder-help .elfinder-dont-panic {
    display: block;
    border: 1px solid transparent;
    width: 200px;
    height: 200px;
    margin: 30px auto;
    text-decoration: none;
    text-align: center;
    position: relative;
    background: #d90004;
    -moz-box-shadow: 5px 5px 9px #111;
    -webkit-box-shadow: 5px 5px 9px #111;
    box-shadow: 5px 5px 9px #111;
    background: -moz-radial-gradient(80px 80px, circle farthest-corner, #d90004 35%, #960004 100%);
    background: -webkit-gradient(radial, 80 80, 60, 80 80, 120, from(#d90004), to(#960004));
    -moz-border-radius: 100px;
    -webkit-border-radius: 100px;
    border-radius: 100px;
    outline: none;
}

.elfinder-help .elfinder-dont-panic span {
    font-size: 3em;
    font-weight: bold;
    text-align: center;
    color: #fff;
    position: absolute;
    left: 0;
    top: 45px;
}

ul.elfinder-help-integrations ul {
    margin-bottom: 1em;
    padding: 0;
    margin: 0 1em 1em;
}

ul.elfinder-help-integrations a {
    text-decoration: none;
}

ul.elfinder-help-integrations a:hover {
    text-decoration: underline;
}

.elfinder-help-debug {
    height: 100%;
    padding: 0;
    margin: 0;
    overflow: none;
    border: none;
}

.elfinder-help-debug .ui-tabs-panel {
    padding: 0;
    margin: 0;
    overflow: auto;
}

.elfinder-help-debug fieldset {
    margin-bottom: 10px;
    border-color: #778899;
    border-radius: 10px;
}

.elfinder-help-debug legend {
    font-size: 1.2em;
    font-weight: bold;
    color: #2e8b57;
}

.elfinder-help-debug dl {
    margin: 0;
}

.elfinder-help-debug dt {
    color: #778899;
}

.elfinder-help-debug dt:before {
    content: "[";
}

.elfinder-help-debug dt:after {
    content: "]";
}

.elfinder-help-debug dd {
    margin-left: 1em;
}

.elfinder-help-debug dd span {
    /*font-size: 1.2em;*/
}

/********************** COMMAND "PREFERENCE" ****************************/
.elfinder-dialog .elfinder-preference .ui-tabs-nav {
    margin-bottom: 1px;
    height: auto;
}

/* fix tabs */
.elfinder-preference .ui-tabs-panel {
    padding: 10px 10px 0;
    overflow: auto;
    box-sizing: border-box;
    -webkit-overflow-scrolling: touch;
}

.elfinder-preference a.ui-state-hover,
.elfinder-preference label.ui-state-hover {
    border: none;
}

.elfinder-preference dl {
    width: 100%;
    display: inline-block;
    margin: .5em 0;
}

.elfinder-preference dt {
    display: block;
    width: 200px;
    clear: left;
    float: left;
    max-width: 50%;
}

.elfinder-rtl .elfinder-preference dt {
    clear: right;
    float: right;
}

.elfinder-preference dd {
    margin-bottom: 1em;
}

.elfinder-preference dt label {
    cursor: pointer;
}

.elfinder-preference dd label,
.elfinder-preference dd input[type=checkbox] {
    white-space: nowrap;
    display: inline-block;
    cursor: pointer;
}

.elfinder-preference dt.elfinder-preference-checkboxes {
    width: 100%;
    max-width: none;
}

.elfinder-preference dd.elfinder-preference-checkboxes {
    padding-top: 3ex;
}

.elfinder-preference select {
    max-width: 100%;
}

.elfinder-preference dd.elfinder-preference-iconSize .ui-slider {
    width: 50%;
    max-width: 100px;
    display: inline-block;
    margin: 0 10px;
}

.elfinder-preference button {
    margin: 0 16px;
}

.elfinder-preference button + button {
    margin: 0 -10px;
}

.elfinder-preference .elfinder-preference-taball .elfinder-reference-hide-taball {
    display: none;
}

.elfinder-preference-theme fieldset {
    margin-bottom: 10px;
}

.elfinder-preference-theme legend a {
    font-size: 1.8em;
    text-decoration: none;
    cursor: pointer;
}

.elfinder-preference-theme dt {
    width: 20%;
    word-break: break-all;
}

.elfinder-preference-theme dt:after {
    content: " :";
}

.elfinder-preference-theme dd {
    margin-inline-start: 20%;
}

.elfinder-preference img.elfinder-preference-theme-image {
    display: block;
    margin-left: auto;
    margin-right: auto;
    max-width: 90%;
    max-height: 200px;
    cursor: pointer;
}

.elfinder-preference-theme-btn {
    text-align: center;
}

.elfinder-preference-theme button.elfinder-preference-theme-default {
    display: inline;
    margin: 0 10px;
    font-size: 8pt;
}

/********************** COMMAND "INFO" ****************************/
.elfinder-rtl .elfinder-info-title .elfinder-cwd-icon:before {
    right: 33px;
    left: auto;
}

.elfinder-info-title .elfinder-cwd-icon.elfinder-cwd-bgurl:after {
    content: none;
}

/********************** COMMAND "UPLOAD" ****************************/
.elfinder-upload-dialog-wrapper .elfinder-upload-dirselect {
    position: absolute;
    bottom: 2px;
    width: 16px;
    height: 16px;
    padding: 10px;
    border: none;
    overflow: hidden;
    cursor: pointer;
}

.elfinder-ltr .elfinder-upload-dialog-wrapper .elfinder-upload-dirselect {
    left: 2px;
}

.elfinder-rtl .elfinder-upload-dialog-wrapper .elfinder-upload-dirselect {
    right: 2px;
}

/********************** COMMAND "RM" ****************************/
.elfinder-ltr .elfinder-rm-title .elfinder-cwd-icon:before {
    left: 38px;
}

.elfinder-rtl .elfinder-rm-title .elfinder-cwd-icon:before {
    right: 86px;
    left: auto;
}

.elfinder-rm-title .elfinder-cwd-icon.elfinder-cwd-bgurl:after {
    content: none;
}

/********************** COMMAND "RENAME" ****************************/
.elfinder-rename-batch div {
    margin: 5px 8px;
}

.elfinder-rename-batch .elfinder-rename-batch-name input {
    width: 100%;
    font-size: 1.6em;
}

.elfinder-rename-batch-type {
    text-align: center;
}

.elfinder-rename-batch .elfinder-rename-batch-type label {
    margin: 2px;
    font-size: .9em;
}

.elfinder-rename-batch-preview {
    padding: 0 8px;
    font-size: 1.1em;
    min-height: 4ex;
}
.CodeMirror {
    background: inherit !important;
}

css/dialog.css000064400000036311151215013440007305 0ustar00/*********************************************/
/*                DIALOGS STYLES             */
/*********************************************/

/* common dialogs class */
.std42-dialog {
    padding: 0;
    position: absolute;
    left: auto;
    right: auto;
    box-sizing: border-box;
}

.std42-dialog.elfinder-dialog-minimized {
    overFlow: hidden;
    position: relative;
    float: left;
    width: auto;
    cursor: pointer;
}

.elfinder-rtl .std42-dialog.elfinder-dialog-minimized {
    float: right;
}

.std42-dialog input {
    border: 1px solid;
}

/* titlebar */
.std42-dialog .ui-dialog-titlebar {
    border-left: 0 solid transparent;
    border-top: 0 solid transparent;
    border-right: 0 solid transparent;
    font-weight: normal;
    padding: .2em 1em;
}

.std42-dialog.elfinder-dialog-minimized .ui-dialog-titlebar {
    padding: 0 .5em;
    height: 20px;
}

.elfinder-touch .std42-dialog.elfinder-dialog-minimized .ui-dialog-titlebar {
    padding: .3em .5em;
}

.std42-dialog.ui-draggable-disabled .ui-dialog-titlebar {
    cursor: default;
}

.std42-dialog .ui-dialog-titlebar .ui-widget-header {
    border: none;
    cursor: pointer;
}

.std42-dialog .ui-dialog-titlebar span.elfinder-dialog-title {
    display: inherit;
    word-break: break-all;
}

.std42-dialog.elfinder-dialog-minimized .ui-dialog-titlebar span.elfinder-dialog-title {
    display: list-item;
    display: -moz-inline-box;
    white-space: nowrap;
    word-break: normal;
    overflow: hidden;
    word-wrap: normal;
    overflow-wrap: normal;
    max-width: -webkit-calc(100% - 24px);
    max-width: -moz-calc(100% - 24px);
    max-width: calc(100% - 24px);
}

.elfinder-touch .std42-dialog .ui-dialog-titlebar span.elfinder-dialog-title {
    padding-top: .15em;
}

.elfinder-touch .std42-dialog.elfinder-dialog-minimized .ui-dialog-titlebar span.elfinder-dialog-title {
    max-width: -webkit-calc(100% - 36px);
    max-width: -moz-calc(100% - 36px);
    max-width: calc(100% - 36px);
}

.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-button {
    position: relative;
    float: left;
    top: 10px;
    left: -10px;
    right: 10px;
    width: 20px;
    height: 20px;
    padding: 1px;
    margin: -10px 1px 0 1px;
    background-color: transparent;
    background-image: none;
}

.elfinder-touch .std42-dialog .ui-dialog-titlebar .elfinder-titlebar-button {
    -moz-transform: scale(1.2);
    zoom: 1.2;
    padding-left: 6px;
    padding-right: 6px;
    height: 24px;
}

.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-button-right {
    float: right;
}

.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-button.elfinder-titlebar-button-right {
    left: 10px;
    right: -10px;
}

.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-button .ui-icon {
    width: 17px;
    height: 17px;
    border-width: 1px;
    opacity: .7;
    filter: Alpha(Opacity=70);
    -moz-border-radius: 8px;
    -webkit-border-radius: 8px;
    border-radius: 8px;
}

.elfinder-mobile .std42-dialog .ui-dialog-titlebar .elfinder-titlebar-button .ui-icon {
    opacity: .5;
    filter: Alpha(Opacity=50);
}

.std42-dialog.elfinder-dialog-minimized .ui-dialog-titlebar .elfinder-titlebar-button .ui-icon {
    opacity: 1;
    filter: Alpha(Opacity=100);
}

.std42-dialog.elfinder-dialog-minimized .ui-dialog-titlebar select {
    display: none;
}

.elfinder-spinner {
    width: 14px;
    height: 14px;
    background: url("../img/spinner-mini.gif") center center no-repeat;
    margin: 0 5px;
    display: inline-block;
    vertical-align: middle;
}

.elfinder-ltr .elfinder-spinner,
.elfinder-ltr .elfinder-spinner-text {
    float: left;
}

.elfinder-rtl .elfinder-spinner,
.elfinder-rtl .elfinder-spinner-text  {
    float: right;
}



/* resize handle for touch devices */
.elfinder-touch .std42-dialog.ui-dialog:not(ui-resizable-disabled) .ui-resizable-se {
    width: 12px;
    height: 12px;
    -moz-transform-origin: bottom right;
    -moz-transform: scale(1.5);
    zoom: 1.5;
    right: -7px;
    bottom: -7px;
    margin: 3px 7px 7px 3px;
    background-position: -64px -224px;
}

.elfinder-rtl .elfinder-dialog .ui-dialog-titlebar {
    text-align: right;
}

/* content */
.std42-dialog .ui-dialog-content {
    padding: .3em .5em;
}

.elfinder .std42-dialog .ui-dialog-content,
.elfinder .std42-dialog .ui-dialog-content * {
    -webkit-user-select: auto;
    -moz-user-select: text;
    -khtml-user-select: text;
    user-select: text;
}

.elfinder .std42-dialog .ui-dialog-content label {
    border: none;
}

/* buttons */
.std42-dialog .ui-dialog-buttonpane {
    border: 0 solid;
    margin: 0;
    padding: .5em;
    text-align: right;
}

.elfinder-rtl .std42-dialog .ui-dialog-buttonpane {
    text-align: left;
}

.std42-dialog .ui-dialog-buttonpane button {
    margin: .2em 0 0 .4em;
    padding: .2em;
    outline: 0px solid;
}

.std42-dialog .ui-dialog-buttonpane button span {
    padding: 2px 9px;
}

.std42-dialog .ui-dialog-buttonpane button span.ui-icon {
    padding: 2px;
}

.elfinder-dialog .ui-resizable-e,
.elfinder-dialog .ui-resizable-s {
    width: 0;
    height: 0;
}

.std42-dialog .ui-button input {
    cursor: pointer;
}

.std42-dialog select {
    border: 1px solid #ccc;
}

/* error/notify/confirm dialogs icon */
.elfinder-dialog-icon {
    position: absolute;
    width: 32px;
    height: 32px;
    left: 10px;
    bottom: 8%;
    margin-top: -15px;
    background: url("../img/dialogs.png") 0 0 no-repeat;
}

.elfinder-rtl .elfinder-dialog-icon {
    left: auto;
    right: 10px;
}

/*********************** ERROR DIALOG **************************/

.elfinder-dialog-error .ui-dialog-content,
.elfinder-dialog-confirm .ui-dialog-content {
    padding-left: 56px;
    min-height: 35px;
}

.elfinder-rtl .elfinder-dialog-error .ui-dialog-content,
.elfinder-rtl .elfinder-dialog-confirm .ui-dialog-content {
    padding-left: 0;
    padding-right: 56px;
}

.elfinder-dialog-error .elfinder-err-var {
    word-break: break-all;
}

/*********************** NOTIFY DIALOG **************************/

.elfinder-dialog-notify {
    top : 36px;
    width : 280px;
}

.elfinder-ltr .elfinder-dialog-notify {
    right : 12px;
}

.elfinder-rtl .elfinder-dialog-notify {
    left : 12px;
}

.elfinder-dialog-notify .ui-dialog-titlebar {
    overflow: hidden;
}

.elfinder.elfinder-touch > .elfinder-dialog-notify .ui-dialog-titlebar {
    height: 10px;
}

.elfinder > .elfinder-dialog-notify .ui-dialog-titlebar .elfinder-titlebar-button {
    top: 2px;
}

.elfinder.elfinder-touch > .elfinder-dialog-notify .ui-dialog-titlebar .elfinder-titlebar-button {
    top: 4px;
}

.elfinder > .elfinder-dialog-notify .ui-dialog-titlebar .elfinder-titlebar-button {
    right: 18px;
}

.elfinder > .elfinder-dialog-notify .ui-dialog-titlebar .elfinder-titlebar-button.elfinder-titlebar-button-right {
    left: 18px;
    right: -18px;
}

.ui-dialog-titlebar .elfinder-ui-progressbar {
    position: absolute;
    top: 17px;
}

.elfinder-touch .ui-dialog-titlebar .elfinder-ui-progressbar {
    top: 26px;
}

.elfinder-dialog-notify.elfinder-titlebar-button-hide .ui-dialog-titlebar-close {
    display: none;
}

.elfinder-dialog-notify.elfinder-dialog-minimized.elfinder-titlebar-button-hide .ui-dialog-titlebar span.elfinder-dialog-title {
    max-width: initial;
}

.elfinder-dialog-notify .ui-dialog-content {
    padding: 0;
}

/* one notification container */
.elfinder-notify {
    border-bottom: 1px solid #ccc;
    position: relative;
    padding: .5em;

    text-align: center;
    overflow: hidden;
}

.elfinder-ltr .elfinder-notify {
    padding-left: 36px;
}

.elfinder-rtl .elfinder-notify {
    padding-right: 36px;
}

.elfinder-notify:last-child {
    border: 0 solid;
}

/* progressbar */
.elfinder-notify-progressbar {
    width: 180px;
    height: 8px;
    border: 1px solid #aaa;
    background: #f5f5f5;
    margin: 5px auto;
    overflow: hidden;
}

.elfinder-notify-progress {
    width: 100%;
    height: 8px;
    background: url(../img/progress.gif) center center repeat-x;
}

.elfinder-notify-progressbar, .elfinder-notify-progress {
    -moz-border-radius: 2px;
    -webkit-border-radius: 2px;
    border-radius: 2px;
}

.elfinder-notify-cancel {
    position: relative;
    top: -18px;
    right: calc(-50% + 15px);
}

.elfinder-notify-cancel .ui-icon-close {
    background-position: -80px -128px;
    width: 18px;
    height: 18px;
    border-radius: 9px;
    border: none;
    background-position: -80px -128px;
    cursor: pointer;
}

/* icons */
.elfinder-dialog-icon-open,
.elfinder-dialog-icon-readdir,
.elfinder-dialog-icon-file {
    background-position: 0 -225px;
}

.elfinder-dialog-icon-reload {
    background-position: 0 -225px;
}

.elfinder-dialog-icon-mkdir {
    background-position: 0 -64px;
}

.elfinder-dialog-icon-mkfile {
    background-position: 0 -96px;
}

.elfinder-dialog-icon-copy,
.elfinder-dialog-icon-prepare,
.elfinder-dialog-icon-move {
    background-position: 0 -128px;
}

.elfinder-dialog-icon-upload {
    background-position: 0 -160px;
}

.elfinder-dialog-icon-chunkmerge {
    background-position: 0 -160px;
}

.elfinder-dialog-icon-rm {
    background-position: 0 -192px;
}

.elfinder-dialog-icon-download {
    background-position: 0 -260px;
}

.elfinder-dialog-icon-save {
    background-position: 0 -295px;
}

.elfinder-dialog-icon-rename,
.elfinder-dialog-icon-chkcontent {
    background-position: 0 -330px;
}

.elfinder-dialog-icon-zipdl,
.elfinder-dialog-icon-archive,
.elfinder-dialog-icon-extract {
    background-position: 0 -365px;
}

.elfinder-dialog-icon-search {
    background-position: 0 -402px;
}

.elfinder-dialog-icon-resize,
.elfinder-dialog-icon-loadimg,
.elfinder-dialog-icon-netmount,
.elfinder-dialog-icon-netunmount,
.elfinder-dialog-icon-chmod,
.elfinder-dialog-icon-preupload,
.elfinder-dialog-icon-url,
.elfinder-dialog-icon-dim {
    background-position: 0 -434px;
}

/*********************** CONFIRM DIALOG **************************/

.elfinder-dialog-confirm-applyall,
.elfinder-dialog-confirm-encoding {
    padding: 0 1em;
    margin: 0;
}

.elfinder-ltr .elfinder-dialog-confirm-applyall,
.elfinder-ltr .elfinder-dialog-confirm-encoding {
    text-align: left;
}

.elfinder-rtl .elfinder-dialog-confirm-applyall,
.elfinder-rtl .elfinder-dialog-confirm-encoding {
    text-align: right;
}

.elfinder-dialog-confirm .elfinder-dialog-icon {
    background-position: 0 -32px;
}

.elfinder-dialog-confirm .ui-dialog-buttonset {
    width: auto;
}

/*********************** FILE INFO DIALOG **************************/

.elfinder-info-title .elfinder-cwd-icon {
    float: left;
    width: 48px;
    height: 48px;
    margin-right: 1em;
}

.elfinder-rtl .elfinder-info-title .elfinder-cwd-icon {
    float: right;
    margin-right: 0;
    margin-left: 1em;
}

.elfinder-info-title strong {
    display: block;
    padding: .3em 0 .5em 0;
}

.elfinder-info-tb {
    min-width: 200px;
    border: 0 solid;
    margin: 1em .2em 1em .2em;
    width: 100%;
}

.elfinder-info-tb td {
    white-space: pre-wrap;
    padding: 2px;
}

.elfinder-info-tb td.elfinder-info-label {
    white-space: nowrap;
}

.elfinder-info-tb td.elfinder-info-hash {
    display: inline-block;
    word-break: break-all;
    max-width: 32ch;
}

.elfinder-ltr .elfinder-info-tb tr td:first-child {
    text-align: right;
}

.elfinder-ltr .elfinder-info-tb span {
    float: left;
}

.elfinder-rtl .elfinder-info-tb tr td:first-child {
    text-align: left;
}

.elfinder-rtl .elfinder-info-tb span {
    float: right;
}

.elfinder-info-tb a {
    outline: none;
    text-decoration: underline;
}

.ui-front.ui-dialog.elfinder-dialog-info.ui-resizable.elfinder-frontmost.elfinder-dialog-active {
    max-width: 400px !important;
    width: 400px !important;
    overflow: hidden !important;
}
.ui-front.ui-dialog .ui-helper-clearfix.elfinder-rm-title {
    margin-left: -49px;
    padding-top: 7px;
    padding-bottom: 7px;
}
.elfinder-info-tb a:hover {
    text-decoration: none;
}

.elfinder-netmount-tb {
    margin: 0 auto;
}

.elfinder-netmount-tb select,
.elfinder-netmount-tb .elfinder-button-icon {
    cursor: pointer;
}

button.elfinder-info-button {
    margin: -3.5px 0;
    cursor: pointer;
}

/*********************** UPLOAD DIALOG **************************/

.elfinder-upload-dropbox {
    display: table-cell;
    text-align: center;
    vertical-align: middle;
    padding: 0.5em;
    border: 3px dashed #aaa;
    width: 9999px;
    height: 80px;
    overflow: hidden;
    word-break: keep-all;
}

.elfinder-upload-dropbox.ui-state-hover {
    background: #dfdfdf;
    border: 3px dashed #555;
}

.elfinder-upload-dialog-or {
    margin: .3em 0;
    text-align: center;
}

.elfinder-upload-dialog-wrapper {
    text-align: center;
}

.elfinder-upload-dialog-wrapper .ui-button {
    position: relative;
    overflow: hidden;
}

.elfinder-upload-dialog-wrapper .ui-button form {
    position: absolute;
    right: 0;
    top: 0;
    width: 100%;
    opacity: 0;
    filter: Alpha(Opacity=0);
}

.elfinder-upload-dialog-wrapper .ui-button form input {
    padding: 50px 0 0;
    font-size: 3em;
    width: 100%;
}

/* dialog for elFinder itself */
.dialogelfinder .dialogelfinder-drag {
    border-left: 0 solid;
    border-top: 0 solid;
    border-right: 0 solid;
    font-weight: normal;
    padding: 2px 12px;
    cursor: move;
    position: relative;
    text-align: left;
}

.elfinder-rtl .dialogelfinder-drag {
    text-align: right;
}

.dialogelfinder-drag-close {
    position: absolute;
    top: 50%;
    margin-top: -8px;
}

.elfinder-ltr .dialogelfinder-drag-close {
    right: 12px;
}

.elfinder-rtl .dialogelfinder-drag-close {
    left: 12px;
}

/*********************** RM CONFIRM **************************/
.elfinder-rm-title {
    margin-bottom: .5ex;
}

.elfinder-rm-title .elfinder-cwd-icon {
    float: left;
    width: 48px;
    height: 48px;
    margin-right: 1em;
}

.elfinder-rtl .elfinder-rm-title .elfinder-cwd-icon {
    float: right;
    margin-right: 0;
    margin-left: 1em;
}

.elfinder-rm-title strong {
    display: block;
    white-space: pre-wrap;
    word-break: normal;
    overflow: hidden;
    text-overflow: ellipsis;
}

.elfinder-rm-title + br {
    display: none;
} 

.elfinder .elfinder-dialog .ui-dialog-content.elfinder-edit-editor{ padding: 0; }
.elfinder-ltr .elfinder-info-tb tr td:first-child{ text-align:left; }

.elfinder-dialog-info table.elfinder-info-tb tr{ display:block !important; }
.elfinder-dialog-info table.elfinder-info-tb tr td:first-child{width: 96px;}


/* New css Added here  */
.ui-front.ui-dialog.elfinder-dialog.elfinder-dialog-notify .ui-widget-content .elfinder-dialog-icon{ bottom: inherit; top:25px; }
.ui-front.ui-dialog.elfinder-dialog.elfinder-dialog-notify .ui-widget-content .elfinder-notify{ padding-left:50px; font-size: 12px; }
.ui-front.ui-dialog.elfinder-dialog.elfinder-dialog-notify .ui-widget-content .elfinder-notify-progressbar{  margin-left: 5px;  margin-top: 10px; }

/* css for Arabic language icons*/
.wrap.wp-filemanager-wrap .elfinder-rtl .ui-front.ui-dialog .ui-dialog-content.ui-widget-content {
    padding-right: 56px;
    padding-left: unset;
}
.wrap.wp-filemanager-wrap .elfinder-rtl .ui-front.ui-dialog .ui-dialog-content.ui-widget-content .ui-helper-clearfix.elfinder-rm-title {
    margin-left: 0;
    margin-right: -49px;
}
.wrap.wp-filemanager-wrap .elfinder-rtl .ui-front.ui-dialog .ui-dialog-content.ui-widget-content .ui-helper-clearfix.elfinder-rm-title span.elfinder-cwd-icon:before {
    right: 0;
    min-width: 20px;
    max-width: 30px;
}css/cwd.css000064400000105221151215013440006620 0ustar00/******************************************************************/
/*                     CURRENT DIRECTORY STYLES                   */
/******************************************************************/
/* cwd container to avoid selectable on scrollbar */
.elfinder-cwd-wrapper {
    overflow: auto;
    position: relative;
    padding: 2px;
    margin: 0;
}

.elfinder-cwd-wrapper-list {
    padding: 0;
}

/* container */
.elfinder-cwd {
    position: absolute;
    top: 0;
    cursor: default;
    padding: 0;
    margin: 0;
    -ms-touch-action: auto;
    touch-action: auto;
    min-width: 100%;
}

.elfinder-ltr .elfinder-cwd {
    left: 0;
}

.elfinder-rtl .elfinder-cwd {
    right: 0;
}

.elfinder-cwd.elfinder-table-header-sticky {
    position: -webkit-sticky;
    position: -ms-sticky;
    position: sticky;
    top: 0;
    left: auto;
    right: auto;
    width: -webkit-max-content;
    width: -moz-max-content;
    width: -ms-max-content;
    width: max-content;
    height: 0;
    overflow: visible;
}

.elfinder-cwd.elfinder-table-header-sticky table {
    border-top: 2px solid;
    padding-top: 0;
}

.elfinder-cwd.elfinder-table-header-sticky td {
    display: inline-block;
}

.elfinder-droppable-active .elfinder-cwd.elfinder-table-header-sticky table {
    border-top: 2px solid transparent;
}

/* fixed table header container */
.elfinder-cwd-fixheader .elfinder-cwd {
    position: relative;
}

/* container active on dropenter */
.elfinder .elfinder-cwd-wrapper.elfinder-droppable-active {
    outline: 2px solid #8cafed;
    outline-offset: -2px;
}

.elfinder-cwd-wrapper-empty .elfinder-cwd:after {
    display: block;
    position: absolute;
    height: auto;
    width: 90%;
    width: calc(100% - 20px);
    position: absolute;
    top: 50%;
    left: 50%;
    -ms-transform: translateY(-50%) translateX(-50%);
    -webkit-transform: translateY(-50%) translateX(-50%);
    transform: translateY(-50%) translateX(-50%);
    line-height: 1.5em;
    text-align: center;
    white-space: pre-wrap;
    opacity: 0.6;
    filter: Alpha(Opacity=60);
    font-weight: bold;
}

.elfinder-cwd-file .elfinder-cwd-select {
    position: absolute;
    top: 0px;
    left: 0px;
    background-color: transparent;
    opacity: .4;
    filter: Alpha(Opacity=40);
}

.elfinder-mobile .elfinder-cwd-file .elfinder-cwd-select {
    width: 30px;
    height: 30px;
}

.elfinder-cwd-file.ui-selected .elfinder-cwd-select {
    opacity: .8;
    filter: Alpha(Opacity=80);
}

.elfinder-rtl .elfinder-cwd-file .elfinder-cwd-select {
    left: auto;
    right: 0px;
}

.elfinder .elfinder-cwd-selectall {
    position: absolute;
    width: 30px;
    height: 30px;
    top: 0px;
    opacity: .8;
    filter: Alpha(Opacity=80);
}

.elfinder .elfinder-workzone.elfinder-cwd-wrapper-empty .elfinder-cwd-selectall {
    display: none;
}

/************************** ICONS VIEW ********************************/

.elfinder-ltr .elfinder-workzone .elfinder-cwd-selectall {
    text-align: right;
    right: 18px;
    left: auto;
}

.elfinder-rtl .elfinder-workzone .elfinder-cwd-selectall {
    text-align: left;
    right: auto;
    left: 18px;
}

.elfinder-ltr.elfinder-mobile .elfinder-workzone .elfinder-cwd-selectall {
    right: 0px;
}

.elfinder-rtl.elfinder-mobile .elfinder-workzone .elfinder-cwd-selectall {
    left: 0px;
}

.elfinder-cwd-view-icons .elfinder-cwd-file .elfinder-cwd-select.ui-state-hover {
    background-color: transparent;
}

/* file container */
.elfinder-cwd-view-icons .elfinder-cwd-file {
    width: 120px;
    height: 90px;
    padding-bottom: 2px;
    cursor: default;
    border: none;
    position: relative;
}

.elfinder-cwd-view-icons .elfinder-cwd-file .ui-state-active {
    border: none;
}

/* ltr/rtl enviroment */
.elfinder-ltr .elfinder-cwd-view-icons .elfinder-cwd-file {
    float: left;
    margin: 0 3px 2px 0;
}

.elfinder-rtl .elfinder-cwd-view-icons .elfinder-cwd-file {
    float: right;
    margin: 0 0 5px 3px;
}

/* remove ui hover class border */
.elfinder-cwd-view-icons .elfinder-cwd-file .ui-state-hover {
    border: 0 solid;
}

/* icon wrapper to create selected highlight around icon */
.elfinder-cwd-view-icons .elfinder-cwd-file-wrapper {
    width: 52px;
    height: 52px;
    margin: 1px auto 1px auto;
    padding: 2px;
    position: relative;
}

/*** Custom Icon Size size1 - size3 ***/
/* type badge */
.elfinder-cwd-size1 .elfinder-cwd-icon:before,
.elfinder-cwd-size2 .elfinder-cwd-icon:before,
.elfinder-cwd-size3 .elfinder-cwd-icon:before {
    top: 3px;
    display: block;
}

/* size1 */
.elfinder-cwd-size1.elfinder-cwd-view-icons .elfinder-cwd-file {
    width: 120px;
    height: 112px;
}

.elfinder-cwd-size1.elfinder-cwd-view-icons .elfinder-cwd-file-wrapper {
    width: 74px;
    height: 74px;
}

.elfinder-cwd-size1 .elfinder-cwd-icon {
    -ms-transform-origin: top center;
    -ms-transform: scale(1.5);
    -webkit-transform-origin: top center;
    -webkit-transform: scale(1.5);
    transform-origin: top center;
    transform: scale(1.5);
}
.elfinder-cwd-size1 .elfinder-cwd-icon.elfinder-cwd-bgurl:before {
     -ms-transform-origin: top left;
    -ms-transform: scale(1.18) translate(0, 15%);
    -webkit-transform-origin: top left;
    -webkit-transform: scale(1.18) translate(0, 15%);
    transform-origin: top left;
    transform: scale(1.18) translate(0, 15%); 
}

.elfinder-cwd-size1 .elfinder-cwd-icon.elfinder-cwd-bgurl:after {
    -ms-transform: scale(1) translate(10px, -5px);
    -webkit-transform: scale(1) translate(10px, -5px);
    transform: scale(1) translate(10px, -5px);
}

.elfinder-cwd-size1 .elfinder-cwd-icon.elfinder-cwd-bgurl {
    -ms-transform-origin: center center;
    -ms-transform: scale(1);
    -webkit-transform-origin: center center;
    -webkit-transform: scale(1);
    transform-origin: center center;
    transform: scale(1);
    width: 72px;
    height: 72px;
    -moz-border-radius: 6px;
    -webkit-border-radius: 6px;
    border-radius: 6px;
}

/* size2 */
.elfinder-cwd-size2.elfinder-cwd-view-icons .elfinder-cwd-file {
    width: 140px;
    height: 134px;
}

.elfinder-cwd-size2.elfinder-cwd-view-icons .elfinder-cwd-file-wrapper {
    width: 98px;
    height: 98px;
}

.elfinder-cwd-size2 .elfinder-cwd-icon {
    -ms-transform-origin: top center;
    -ms-transform: scale(2);
    -webkit-transform-origin: top center;
    -webkit-transform: scale(2);
    transform-origin: top center;
    transform: scale(2);
}

.elfinder-cwd-size2 .elfinder-cwd-icon.elfinder-cwd-bgurl:before {
    -ms-transform-origin: top left;
    -ms-transform: scale(1.55) translate(0, 18%);
    -webkit-transform-origin: top left;
    -webkit-transform: scale(1.55) translate(0, 18%);
    transform-origin: top left;
    transform: scale(1.55) translate(0, 18%);
}

.elfinder-cwd-size2 .elfinder-cwd-icon.elfinder-cwd-bgurl:after {
    -ms-transform: scale(1.1) translate(0px, 10px);
    -webkit-transform: scale(1.1) translate(0px, 10px);
    transform: scale(1.1) translate(0px, 10px);
}

.elfinder-cwd-size2 .elfinder-cwd-icon.elfinder-cwd-bgurl {
    -ms-transform-origin: center center;
    -ms-transform: scale(1);
    -webkit-transform-origin: center center;
    -webkit-transform: scale(1);
    transform-origin: center center;
    transform: scale(1);
    width: 96px;
    height: 96px;
    -moz-border-radius: 8px;
    -webkit-border-radius: 8px;
    border-radius: 8px;
}

/* size3 */
.elfinder-cwd-size3.elfinder-cwd-view-icons .elfinder-cwd-file {
    width: 174px;
    height: 158px;
}

.elfinder-cwd-size3.elfinder-cwd-view-icons .elfinder-cwd-file-wrapper {
    width: 122px;
    height: 72px;
}


.elfinder-cwd-size3 .elfinder-cwd-icon {
    -ms-transform-origin: top center;
    -ms-transform: scale(1.5);
    -webkit-transform-origin: top center;
    -webkit-transform: scale(1.5);
    transform-origin: top center;
    transform: scale(1.5);
}

.elfinder-cwd-size3 .elfinder-cwd-icon.elfinder-cwd-bgurl:before {
    -ms-transform-origin: top left;
    -ms-transform: scale(1.18) translate(0, 20%);
    -webkit-transform-origin: top left;
    -webkit-transform: scale(1.18) translate(0, 20%);
    transform-origin: top left;
    transform: scale(1.18) translate(0, 20%);
}

.elfinder-cwd-size3 .elfinder-cwd-icon.elfinder-cwd-bgurl:after {
    -ms-transform: scale(1.2) translate(-9px, 22px);
    -webkit-transform: scale(1.2) translate(-9px, 22px);
    transform: scale(1.2) translate(-9px, 22px);
}

.elfinder-cwd-size3 .elfinder-cwd-icon.elfinder-cwd-bgurl {
    -ms-transform-origin: center center;
    -ms-transform: scale(1);
    -webkit-transform-origin: center center;
    -webkit-transform: scale(1);
    transform-origin: center center;
    transform: scale(1);
    width: 72px; 
    height: 72px;
    -moz-border-radius: 10px;
    -webkit-border-radius: 10px;
    border-radius: 10px;
}

/* file name place */
.elfinder-cwd-view-icons .elfinder-cwd-filename {
    text-align: center;
    max-height: 2.4em;
    line-height: 1.2em;
    white-space: pre-line;
    overflow: hidden;
    text-overflow: ellipsis;
    -o-text-overflow: ellipsis;
    margin: 3px 1px 0 1px;
    padding: 1px;
    -moz-border-radius: 8px;
    -webkit-border-radius: 8px;
    border-radius: 8px;
    /* for webkit CSS3 */
    word-break: break-word;
    overflow-wrap: break-word;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
}

/* permissions/symlink markers */
.elfinder-cwd-view-icons .elfinder-perms {
    bottom: 4px;
    right: 2px;
}

.elfinder-cwd-view-icons .elfinder-lock {
    top: -3px;
    right: -2px;
}

.elfinder-cwd-view-icons .elfinder-symlink {
    bottom: 6px;
    left: 0px;
}

/* icon/thumbnail */
.elfinder-cwd-icon {
    display: block;
    width: 48px;
    height: 48px;
    margin: 0 auto;
    background-image: url('../img/icons-big.svg');
    background-image: url('../img/icons-big.png') \9;
    background-position: 0 0;
    background-repeat: no-repeat;
    -moz-background-clip: padding;
    -webkit-background-clip: padding-box;
    background-clip: padding-box;
}

/* volume icon of root in folder */
.elfinder-navbar-root-local .elfinder-cwd-icon,
.elfinder-cwd .elfinder-navbar-root-local.elfinder-droppable-active .elfinder-cwd-icon,
.elfinder-cwd-view-list .elfinder-navbar-root-local td .elfinder-cwd-icon {
    background-image: url("../img/volume_icon_local.svg");
    background-image: url("../img/volume_icon_local.png") \9;
    background-position: 0 0;
    background-size: contain;
}

.elfinder-cwd .elfinder-navbar-root-local.elfinder-droppable-active .elfinder-cwd-icon {
    background-position: 1px -1px;
}

.elfinder-navbar-root-trash .elfinder-cwd-icon,
.elfinder-cwd .elfinder-navbar-root-trash.elfinder-droppable-active .elfinder-cwd-icon,
.elfinder-cwd-view-list .elfinder-navbar-root-trash td .elfinder-cwd-icon {
    background-image: url("../img/volume_icon_trash.svg");
    background-image: url("../img/volume_icon_trash.png") \9;
    background-position: 0 0;
    background-size: contain;
}

.elfinder-cwd .elfinder-navbar-root-trash.elfinder-droppable-active .elfinder-cwd-icon {
    background-position: 1px -1px;
}

.elfinder-navbar-root-ftp .elfinder-cwd-icon,
.elfinder-cwd .elfinder-navbar-root-ftp.elfinder-droppable-active .elfinder-cwd-icon,
.elfinder-cwd-view-list .elfinder-navbar-root-ftp td .elfinder-cwd-icon {
    background-image: url("../img/volume_icon_ftp.svg");
    background-image: url("../img/volume_icon_ftp.png") \9;
    background-position: 0 0;
    background-size: contain;
}

.elfinder-cwd .elfinder-navbar-root-ftp.elfinder-droppable-active .elfinder-cwd-icon {
    background-position: 1px -1px;
}

.elfinder-navbar-root-sql .elfinder-cwd-icon,
.elfinder-cwd .elfinder-navbar-root-sql.elfinder-droppable-active .elfinder-cwd-icon,
.elfinder-cwd-view-list .elfinder-navbar-root-sql td .elfinder-cwd-icon {
    background-image: url("../img/volume_icon_sql.svg");
    background-image: url("../img/volume_icon_sql.png") \9;
    background-position: 0 0;
    background-size: contain;
}

.elfinder-cwd .elfinder-navbar-root-sql.elfinder-droppable-active .elfinder-cwd-icon {
    background-position: 1px -1px;
}

.elfinder-navbar-root-dropbox .elfinder-cwd-icon,
.elfinder-cwd .elfinder-navbar-root-dropbox.elfinder-droppable-active .elfinder-cwd-icon,
.elfinder-cwd-view-list .elfinder-navbar-root-dropbox td .elfinder-cwd-icon {
    background-image: url("../img/volume_icon_dropbox.svg");
    background-image: url("../img/volume_icon_dropbox.png") \9;
    background-position: 0 0;
    background-size: contain;
}

.elfinder-cwd .elfinder-navbar-root-dropbox.elfinder-droppable-active .elfinder-cwd-icon {
    background-position: 1px -1px;
}

.elfinder-navbar-root-googledrive .elfinder-cwd-icon,
.elfinder-cwd .elfinder-navbar-root-googledrive.elfinder-droppable-active .elfinder-cwd-icon,
.elfinder-cwd-view-list .elfinder-navbar-root-googledrive td .elfinder-cwd-icon {
    background-image: url("../img/volume_icon_googledrive.svg");
    background-image: url("../img/volume_icon_googledrive.png") \9;
    background-position: 0 0;
    background-size: contain;
}

.elfinder-navbar-root-onedrive .elfinder-cwd-icon,
.elfinder-cwd .elfinder-navbar-root-onedrive.elfinder-droppable-active .elfinder-cwd-icon,
.elfinder-cwd-view-list .elfinder-navbar-root-onedrive td .elfinder-cwd-icon {
    background-image: url("../img/volume_icon_onedrive.svg");
    background-image: url("../img/volume_icon_onedrive.png") \9;
    background-position: 0 0;
    background-size: contain;
}

.elfinder-navbar-root-box .elfinder-cwd-icon,
.elfinder-cwd .elfinder-navbar-root-box.elfinder-droppable-active .elfinder-cwd-icon,
.elfinder-cwd-view-list .elfinder-navbar-root-box td .elfinder-cwd-icon {
    background-image: url("../img/volume_icon_box.svg");
    background-image: url("../img/volume_icon_box.png") \9;
    background-position: 0 0;
    background-size: contain;
}

.elfinder-navbar-root-zip .elfinder-cwd-icon,
.elfinder-cwd .elfinder-navbar-root-zip.elfinder-droppable-active .elfinder-cwd-icon,
.elfinder-cwd-view-list .elfinder-navbar-root-zip td .elfinder-cwd-icon {
    background-image: url("../img/volume_icon_zip.svg");
    background-image: url("../img/volume_icon_zip.png") \9;
    background-position: 0 0;
    background-size: contain;
}

.elfinder-cwd .elfinder-navbar-root-googledrive.elfinder-droppable-active .elfinder-cwd-icon,
.elfinder-cwd .elfinder-navbar-root-onedrive.elfinder-droppable-active .elfinder-cwd-icon,
.elfinder-cwd .elfinder-navbar-root-box.elfinder-droppable-active .elfinder-cwd-icon {
    background-position: 1px -1px;
}

.elfinder-navbar-root-network .elfinder-cwd-icon,
.elfinder-cwd .elfinder-navbar-root-network.elfinder-droppable-active .elfinder-cwd-icon,
.elfinder-cwd-view-list .elfinder-navbar-root-network td .elfinder-cwd-icon {
    background-image: url("../img/volume_icon_network.svg");
    background-image: url("../img/volume_icon_network.png") \9;
    background-position: 0 0;
    background-size: contain;
}

.elfinder-cwd .elfinder-navbar-root-network.elfinder-droppable-active .elfinder-cwd-icon {
    background-position: 1px -1px;
}

/* type badge in "icons" view */
.elfinder-cwd-icon:before {
    content: none;
    position: absolute;
    left: 0px;
    top: 5px;
    min-width: 20px;
    max-width: 84px;
    text-align: center;
    padding: 0px 4px 1px;
    border-radius: 4px;
    font-family: Verdana;
    font-size: 10px;
    line-height: 1.3em;
    -webkit-transform: scale(0.9);
    -moz-transform: scale(0.9);
    -ms-transform: scale(0.9);
    -o-transform: scale(0.9);
    transform: scale(0.9);
}

.elfinder-cwd-view-icons .elfinder-cwd-icon.elfinder-cwd-bgurl:before {
    left: -10px;
}

/* addtional type badge name */
.elfinder-cwd-icon.elfinder-cwd-icon-mp2t:before {
    content: 'ts'
}

.elfinder-cwd-icon.elfinder-cwd-icon-dash-xml:before {
    content: 'dash'
}

.elfinder-cwd-icon.elfinder-cwd-icon-x-mpegurl:before {
    content: 'hls'
}

.elfinder-cwd-icon.elfinder-cwd-icon-x-c:before {
    content: 'c++'
}

/* thumbnail image */
.elfinder-cwd-icon.elfinder-cwd-bgurl {
    background-position: center center;
    background-repeat: no-repeat;
    -moz-background-size: contain;
    background-size: contain;
}

/* thumbnail self */
.elfinder-cwd-icon.elfinder-cwd-bgurl.elfinder-cwd-bgself {
    -moz-background-size: cover;
    background-size: cover;
}

/* thumbnail crop*/
.elfinder-cwd-icon.elfinder-cwd-bgurl {
    -moz-background-size: cover;
    background-size: cover;
}

.elfinder-cwd-icon.elfinder-cwd-bgurl:after {
    content: ' ';
}

.elfinder-cwd-bgurl:after {
    position: relative;
    display: inline-block;
    top: 36px;
    left: -38px;
    width: 48px;
    height: 48px;
    background-image: url('../img/icons-big.svg');
    background-image: url('../img/icons-big.png') \9;
    background-repeat: no-repeat;
    background-size: auto !important;
    opacity: .8;
    filter: Alpha(Opacity=60);
    -webkit-transform-origin: 54px -24px;
    -webkit-transform: scale(.6);
    -moz-transform-origin: 54px -24px;
    -moz-transform: scale(.6);
    -ms-transform-origin: 54px -24px;
    -ms-transform: scale(.6);
    -o-transform-origin: 54px -24px;
    -o-transform: scale(.6);
    transform-origin: 54px -24px;
    transform: scale(.6);
}

/* thumbnail image and draging icon */
.elfinder-cwd-icon.elfinder-cwd-icon-drag {
    width: 48px;
    height: 48px;
}

/* thumbnail image and draging icon overlay none */
.elfinder-cwd-icon.elfinder-cwd-icon-drag:before,
.elfinder-cwd-icon.elfinder-cwd-icon-drag:after,
.elfinder-cwd-icon-image.elfinder-cwd-bgurl:after,
.elfinder-cwd-icon-directory.elfinder-cwd-bgurl:after {
    content: none;
}

/* "opened folder" icon on dragover */
.elfinder-cwd .elfinder-droppable-active .elfinder-cwd-icon {
    background-position: 0 -100px;
}

.elfinder-cwd .elfinder-droppable-active {
    outline: 2px solid #8cafed;
    outline-offset: -2px;
}

/* mimetypes icons */
.elfinder-cwd-icon-directory {
    background-position: 0 -50px;
}

.elfinder-cwd-icon-application:after,
.elfinder-cwd-icon-application {
    background-position: 0 -150px;
}

.elfinder-cwd-icon-text:after,
.elfinder-cwd-icon-text {
    background-position: 0 -1350px;
}

.elfinder-cwd-icon-plain:after,
.elfinder-cwd-icon-plain,
.elfinder-cwd-icon-x-empty:after,
.elfinder-cwd-icon-x-empty {
    background-position: 0 -200px;
}

.elfinder-cwd-icon-image:after,
.elfinder-cwd-icon-vnd-adobe-photoshop:after,
.elfinder-cwd-icon-image,
.elfinder-cwd-icon-vnd-adobe-photoshop {
    background-position: 0 -250px;
}

.elfinder-cwd-icon-postscript:after,
.elfinder-cwd-icon-postscript {
    background-position: 0 -1550px;
}

.elfinder-cwd-icon-audio:after,
.elfinder-cwd-icon-audio {
    background-position: 0 -300px;
}

.elfinder-cwd-icon-video:after,
.elfinder-cwd-icon-video,
.elfinder-cwd-icon-flash-video,
.elfinder-cwd-icon-dash-xml,
.elfinder-cwd-icon-vnd-apple-mpegurl,
.elfinder-cwd-icon-x-mpegurl {
    background-position: 0 -350px;
}

.elfinder-cwd-icon-rtf:after,
.elfinder-cwd-icon-rtfd:after,
.elfinder-cwd-icon-rtf,
.elfinder-cwd-icon-rtfd {
    background-position: 0 -400px;
}

.elfinder-cwd-icon-pdf:after,
.elfinder-cwd-icon-pdf {
    background-position: 0 -450px;
}

.elfinder-cwd-icon-ms-excel,
.elfinder-cwd-icon-ms-excel:after,
.elfinder-cwd-icon-vnd-ms-excel,
.elfinder-cwd-icon-vnd-ms-excel-addin-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-excel-addin-macroEnabled-12:after,
.elfinder-cwd-icon-vnd-ms-excel-sheet-binary-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-excel-sheet-binary-macroEnabled-12:after,
.elfinder-cwd-icon-vnd-ms-excel-sheet-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-excel-sheet-macroEnabled-12:after,
.elfinder-cwd-icon-vnd-ms-excel-template-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-excel-template-macroEnabled-12:after,
.elfinder-cwd-icon-vnd-ms-excel:after,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-spreadsheetml-sheet,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-spreadsheetml-sheet:after,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-spreadsheetml-template,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-spreadsheetml-template:after {
    background-position: 0 -1450px
}

.elfinder-cwd-icon-vnd-oasis-opendocument-spreadsheet,
.elfinder-cwd-icon-vnd-oasis-opendocument-spreadsheet-template,
.elfinder-cwd-icon-vnd-oasis-opendocument-spreadsheet-template:after,
.elfinder-cwd-icon-vnd-oasis-opendocument-spreadsheet:after {
    background-position: 0 -1700px
}

.elfinder-cwd-icon-vnd-ms-powerpoint,
.elfinder-cwd-icon-vnd-ms-powerpoint-addin-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-powerpoint-addin-macroEnabled-12:after,
.elfinder-cwd-icon-vnd-ms-powerpoint-presentation-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-powerpoint-presentation-macroEnabled-12:after,
.elfinder-cwd-icon-vnd-ms-powerpoint-slide-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-powerpoint-slide-macroEnabled-12:after,
.elfinder-cwd-icon-vnd-ms-powerpoint-slideshow-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-powerpoint-slideshow-macroEnabled-12:after,
.elfinder-cwd-icon-vnd-ms-powerpoint-template-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-powerpoint-template-macroEnabled-12:after,
.elfinder-cwd-icon-vnd-ms-powerpoint:after,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-presentation,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-presentation:after,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-slide,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-slide:after,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-slideshow,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-slideshow:after,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-template,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-template:after {
    background-position: 0 -1400px
}

.elfinder-cwd-icon-vnd-oasis-opendocument-presentation,
.elfinder-cwd-icon-vnd-oasis-opendocument-presentation-template,
.elfinder-cwd-icon-vnd-oasis-opendocument-presentation-template:after,
.elfinder-cwd-icon-vnd-oasis-opendocument-presentation:after {
    background-position: 0 -1650px
}

.elfinder-cwd-icon-msword,
.elfinder-cwd-icon-msword:after,
.elfinder-cwd-icon-vnd-ms-word,
.elfinder-cwd-icon-vnd-ms-word-document-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-word-document-macroEnabled-12:after,
.elfinder-cwd-icon-vnd-ms-word-template-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-word-template-macroEnabled-12:after,
.elfinder-cwd-icon-vnd-ms-word:after,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-wordprocessingml-document,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-wordprocessingml-document:after,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-wordprocessingml-template,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-wordprocessingml-template:after {
    background-position: 0 -1500px
}

.elfinder-cwd-icon-vnd-oasis-opendocument-text,
.elfinder-cwd-icon-vnd-oasis-opendocument-text-master,
.elfinder-cwd-icon-vnd-oasis-opendocument-text-master:after,
.elfinder-cwd-icon-vnd-oasis-opendocument-text-template,
.elfinder-cwd-icon-vnd-oasis-opendocument-text-template:after,
.elfinder-cwd-icon-vnd-oasis-opendocument-text-web,
.elfinder-cwd-icon-vnd-oasis-opendocument-text-web:after,
.elfinder-cwd-icon-vnd-oasis-opendocument-text:after {
    background-position: 0 -1750px
}

.elfinder-cwd-icon-vnd-ms-office,
.elfinder-cwd-icon-vnd-ms-office:after {
    background-position: 0 -500px
}

.elfinder-cwd-icon-vnd-oasis-opendocument-chart,
.elfinder-cwd-icon-vnd-oasis-opendocument-chart:after,
.elfinder-cwd-icon-vnd-oasis-opendocument-database,
.elfinder-cwd-icon-vnd-oasis-opendocument-database:after,
.elfinder-cwd-icon-vnd-oasis-opendocument-formula,
.elfinder-cwd-icon-vnd-oasis-opendocument-formula:after,
.elfinder-cwd-icon-vnd-oasis-opendocument-graphics,
.elfinder-cwd-icon-vnd-oasis-opendocument-graphics-template,
.elfinder-cwd-icon-vnd-oasis-opendocument-graphics-template:after,
.elfinder-cwd-icon-vnd-oasis-opendocument-graphics:after,
.elfinder-cwd-icon-vnd-oasis-opendocument-image,
.elfinder-cwd-icon-vnd-oasis-opendocument-image:after,
.elfinder-cwd-icon-vnd-openofficeorg-extension,
.elfinder-cwd-icon-vnd-openofficeorg-extension:after {
    background-position: 0 -1600px
}

.elfinder-cwd-icon-html:after,
.elfinder-cwd-icon-html {
    background-position: 0 -550px;
}

.elfinder-cwd-icon-css:after,
.elfinder-cwd-icon-css {
    background-position: 0 -600px;
}

.elfinder-cwd-icon-javascript:after,
.elfinder-cwd-icon-x-javascript:after,
.elfinder-cwd-icon-javascript,
.elfinder-cwd-icon-x-javascript {
    background-position: 0 -650px;
}

.elfinder-cwd-icon-x-perl:after,
.elfinder-cwd-icon-x-perl {
    background-position: 0 -700px;
}

.elfinder-cwd-icon-x-python:after,
.elfinder-cwd-icon-x-python {
    background-position: 0 -750px;
}

.elfinder-cwd-icon-x-ruby:after,
.elfinder-cwd-icon-x-ruby {
    background-position: 0 -800px;
}

.elfinder-cwd-icon-x-sh:after,
.elfinder-cwd-icon-x-shellscript:after,
.elfinder-cwd-icon-x-sh,
.elfinder-cwd-icon-x-shellscript {
    background-position: 0 -850px;
}

.elfinder-cwd-icon-x-c:after,
.elfinder-cwd-icon-x-csrc:after,
.elfinder-cwd-icon-x-chdr:after,
.elfinder-cwd-icon-x-c--:after,
.elfinder-cwd-icon-x-c--src:after,
.elfinder-cwd-icon-x-c--hdr:after,
.elfinder-cwd-icon-x-java:after,
.elfinder-cwd-icon-x-java-source:after,
.elfinder-cwd-icon-x-c,
.elfinder-cwd-icon-x-csrc,
.elfinder-cwd-icon-x-chdr,
.elfinder-cwd-icon-x-c--,
.elfinder-cwd-icon-x-c--src,
.elfinder-cwd-icon-x-c--hdr,
.elfinder-cwd-icon-x-java,
.elfinder-cwd-icon-x-java-source {
    background-position: 0 -900px;
}

.elfinder-cwd-icon-x-php:after,
.elfinder-cwd-icon-x-php {
    background-position: 0 -950px;
}

.elfinder-cwd-icon-xml:after,
.elfinder-cwd-icon-xml {
    background-position: 0 -1000px;
}

.elfinder-cwd-icon-zip:after,
.elfinder-cwd-icon-x-zip:after,
.elfinder-cwd-icon-x-xz:after,
.elfinder-cwd-icon-x-7z-compressed:after,
.elfinder-cwd-icon-zip,
.elfinder-cwd-icon-x-zip,
.elfinder-cwd-icon-x-xz,
.elfinder-cwd-icon-x-7z-compressed {
    background-position: 0 -1050px;
}

.elfinder-cwd-icon-x-gzip:after,
.elfinder-cwd-icon-x-tar:after,
.elfinder-cwd-icon-x-gzip,
.elfinder-cwd-icon-x-tar {
    background-position: 0 -1100px;
}

.elfinder-cwd-icon-x-bzip:after,
.elfinder-cwd-icon-x-bzip2:after,
.elfinder-cwd-icon-x-bzip,
.elfinder-cwd-icon-x-bzip2 {
    background-position: 0 -1150px;
}

.elfinder-cwd-icon-x-rar:after,
.elfinder-cwd-icon-x-rar-compressed:after,
.elfinder-cwd-icon-x-rar,
.elfinder-cwd-icon-x-rar-compressed {
    background-position: 0 -1200px;
}

.elfinder-cwd-icon-x-shockwave-flash:after,
.elfinder-cwd-icon-x-shockwave-flash {
    background-position: 0 -1250px;
}

.elfinder-cwd-icon-group {
    background-position: 0 -1300px;
}

/* textfield inside icon */
.elfinder-cwd-filename input {
    width: 100%;
    border: none;
    margin: 0;
    padding: 0;
}

.elfinder-cwd-view-icons input {
    text-align: center;
}

.elfinder-cwd-view-icons textarea {
    width: 100%;
    border: 0px solid;
    margin: 0;
    padding: 0;
    text-align: center;
    overflow: hidden;
    resize: none;
}

.elfinder-cwd-view-icons {
    text-align: center;
}

/************************************  LIST VIEW ************************************/


.elfinder-cwd-wrapper.elfinder-cwd-fixheader .elfinder-cwd::after {
    display: none;
}

.elfinder-cwd table {
    width: 100%;
    border-collapse: separate;
    border: 0 solid;
    margin: 0 0 10px 0;
    border-spacing: 0;
    box-sizing: padding-box;
    padding: 2px;
    position: relative;
}

.elfinder-cwd table td {
    /* fix conflict with Bootstrap CSS */
    box-sizing: content-box;
}

.elfinder-cwd-wrapper-list.elfinder-cwd-fixheader {
    position: absolute;
    overflow: hidden;
}

.elfinder-cwd-wrapper-list.elfinder-cwd-fixheader:before {
    content: '';
    position: absolute;
    width: 100%;
    top: 0;
    height: 3px;
    background-color: white;
}

.elfinder-droppable-active + .elfinder-cwd-wrapper-list.elfinder-cwd-fixheader:before {
    background-color: #8cafed;
}

.elfinder .elfinder-workzone div.elfinder-cwd-fixheader table {
    table-layout: fixed;
}

.elfinder .elfinder-cwd table tbody.elfinder-cwd-fixheader {
    position: relative;
}

.elfinder-ltr .elfinder-cwd thead .elfinder-cwd-selectall {
    text-align: left;
    right: auto;
    left: 0px;
    padding-top: 3px;
}

.elfinder-rtl .elfinder-cwd thead .elfinder-cwd-selectall {
    text-align: right;
    right: 0px;
    left: auto;
    padding-top: 3px;
}

.elfinder-touch .elfinder-cwd thead .elfinder-cwd-selectall {
    padding-top: 4px;
}

.elfinder .elfinder-cwd table thead tr {
    border-left: 0 solid;
    border-top: 0 solid;
    border-right: 0 solid;
}

.elfinder .elfinder-cwd table thead td {
    padding: 4px 14px;
    padding-right: 25px;
}

.elfinder-ltr .elfinder-cwd.elfinder-has-checkbox table thead td:first-child {
    padding: 4px 14px 4px 22px;
}

.elfinder-rtl .elfinder-cwd.elfinder-has-checkbox table thead td:first-child {
    padding: 4px 22px 4px 14px;
}

.elfinder-touch .elfinder-cwd table thead td,
.elfinder-touch .elfinder-cwd.elfinder-has-checkbox table thead td:first-child {
    padding-top: 8px;
    padding-bottom: 8px;
}

.elfinder .elfinder-cwd table thead td.ui-state-active {
    background: #ebf1f6;
    background: -moz-linear-gradient(top, #ebf1f6 0%, #abd3ee 50%, #89c3eb 51%, #d5ebfb 100%);
    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ebf1f6), color-stop(50%, #abd3ee), color-stop(51%, #89c3eb), color-stop(100%, #d5ebfb));
    background: -webkit-linear-gradient(top, #ebf1f6 0%, #abd3ee 50%, #89c3eb 51%, #d5ebfb 100%);
    background: -o-linear-gradient(top, #ebf1f6 0%, #abd3ee 50%, #89c3eb 51%, #d5ebfb 100%);
    background: -ms-linear-gradient(top, #ebf1f6 0%, #abd3ee 50%, #89c3eb 51%, #d5ebfb 100%);
    background: linear-gradient(to bottom, #ebf1f6 0%, #abd3ee 50%, #89c3eb 51%, #d5ebfb 100%);
    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebf1f6', endColorstr='#d5ebfb', GradientType=0);
}

.elfinder .elfinder-cwd table td {
    padding: 0 12px;
    white-space: pre;
    overflow: hidden;
    text-align: right;
    cursor: default;
    border: 0 solid;
}

.elfinder .elfinder-cwd table tbody td:first-child {
    position: relative
}

.elfinder .elfinder-cwd table td div {
    box-sizing: content-box;
}

tr.elfinder-cwd-file td .elfinder-cwd-select {
    padding-top: 3px;
}

.elfinder-mobile tr.elfinder-cwd-file td .elfinder-cwd-select {
    width: 40px;
}

.elfinder-touch tr.elfinder-cwd-file td .elfinder-cwd-select {
    padding-top: 10px;
}

.elfinder-touch .elfinder-cwd tr td {
    padding: 10px 12px;
}

.elfinder-touch .elfinder-cwd tr.elfinder-cwd-file td {
    padding: 13px 12px;
}

.elfinder-ltr .elfinder-cwd table td {
    text-align: left;
}

.elfinder-ltr .elfinder-cwd table td:first-child {
    text-align: left;
}

.elfinder-rtl .elfinder-cwd table td {
    text-align: left;
}

.elfinder-rtl .elfinder-cwd table td:first-child {
    text-align: right;
}

.elfinder-odd-row {
    background: #eee;
}

/* filename container */
.elfinder-cwd-view-list .elfinder-cwd-file-wrapper {
    width: 97%;
    position: relative;
}

/* filename container in ltr/rtl enviroment */
.elfinder-ltr .elfinder-cwd-view-list.elfinder-has-checkbox .elfinder-cwd-file-wrapper {
    margin-left: 8px;
}

.elfinder-rtl .elfinder-cwd-view-list.elfinder-has-checkbox .elfinder-cwd-file-wrapper {
    margin-right: 8px;
}

.elfinder-cwd-view-list .elfinder-cwd-filename {
    padding-top: 4px;
    padding-bottom: 4px;
    display: inline-block;
}

.elfinder-ltr .elfinder-cwd-view-list .elfinder-cwd-filename {
    padding-left: 23px;
}

.elfinder-rtl .elfinder-cwd-view-list .elfinder-cwd-filename {
    padding-right: 23px;
}

/* premissions/symlink marker */
.elfinder-cwd-view-list .elfinder-perms,
.elfinder-cwd-view-list .elfinder-lock,
.elfinder-cwd-view-list .elfinder-symlink {
    margin-top: -6px;
    opacity: .6;
    filter: Alpha(Opacity=60);
}

.elfinder-cwd-view-list .elfinder-perms {
    bottom: -4px;
}

.elfinder-cwd-view-list .elfinder-lock {
    top: 0px;
}

.elfinder-cwd-view-list .elfinder-symlink {
    bottom: -4px;
}

/* markers in ltr/rtl enviroment */
.elfinder-ltr .elfinder-cwd-view-list .elfinder-perms {
    left: 8px;
}

.elfinder-rtl .elfinder-cwd-view-list .elfinder-perms {
    right: -8px;
}

.elfinder-ltr .elfinder-cwd-view-list .elfinder-lock {
    left: 10px;
}

.elfinder-rtl .elfinder-cwd-view-list .elfinder-lock {
    right: -10px;
}

.elfinder-ltr .elfinder-cwd-view-list .elfinder-symlink {
    left: -7px;
}

.elfinder-rtl .elfinder-cwd-view-list .elfinder-symlink {
    right: 7px;
}

/* file icon */
.elfinder-cwd-view-list td .elfinder-cwd-icon {
    width: 16px;
    height: 16px;
    position: absolute;
    top: 50%;
    margin-top: -8px;
    background-image: url(../img/icons-small.png);
}

/* icon in ltr/rtl enviroment */
.elfinder-ltr .elfinder-cwd-view-list .elfinder-cwd-icon {
    left: 0;
}

.elfinder-rtl .elfinder-cwd-view-list .elfinder-cwd-icon {
    right: 0;
}

/* type badge, thumbnail image overlay */
.elfinder-cwd-view-list .elfinder-cwd-icon:before,
.elfinder-cwd-view-list .elfinder-cwd-icon:after {
    content: none;
}

/* table header resize handle */
.elfinder-cwd-view-list thead td .ui-resizable-handle {
    height: 100%;
    top: 3px;
}

.elfinder-touch .elfinder-cwd-view-list thead td .ui-resizable-handle {
    top: -4px;
    margin: 10px;
}

.elfinder-cwd-view-list thead td .ui-resizable-e {
    right: -7px;
}

.elfinder-cwd-view-list thead td .ui-resizable-w {
    left: -7px;
}

.elfinder-touch .elfinder-cwd-view-list thead td .ui-resizable-e {
    right: -16px;
}

.elfinder-touch .elfinder-cwd-view-list thead td .ui-resizable-w {
    left: -16px;
}

/* empty message */
.elfinder-cwd-wrapper-empty .elfinder-cwd-view-list.elfinder-cwd:after {
    margin-top: 0;
}

/* overlay message board */
.elfinder-cwd-message-board {
    position: absolute;
    position: -webkit-sticky;
    position: sticky;
    width: 100%;
    height: calc(100% - 0.01px); /* for Firefox scroll problem */
    top: 0;
    left: 0;
    margin: 0;
    padding: 0;
    pointer-events: none;
    background-color: transparent;
}

/* overlay message board for trash */
.elfinder-cwd-wrapper-trash .elfinder-cwd-message-board {
    background-image: url(../img/trashmesh.png);
}

.elfinder-cwd-message-board .elfinder-cwd-trash {
    position: absolute;
    bottom: 0;
    font-size: 30px;
    width: 100%;
    text-align: right;
    display: none;
}

.elfinder-rtl .elfinder-cwd-message-board .elfinder-cwd-trash {
    text-align: left;
}

.elfinder-mobile .elfinder-cwd-message-board .elfinder-cwd-trash {
    font-size: 20px;
}

.elfinder-cwd-wrapper-trash .elfinder-cwd-message-board .elfinder-cwd-trash {
    display: block;
    opacity: .3;
}

/* overlay message board for expires */
.elfinder-cwd-message-board .elfinder-cwd-expires {
    position: absolute;
    bottom: 0;
    font-size: 24px;
    width: 100%;
    text-align: right;
    opacity: .25;
}

.elfinder-rtl .elfinder-cwd-message-board .elfinder-cwd-expires {
    text-align: left;
}

.elfinder-mobile .elfinder-cwd-message-board .elfinder-cwd-expires {
    font-size: 20px;
}
css/elfinder.full.css000064400000351473151215013440010610 0ustar00/*!
 * elFinder - file manager for web
 * Version 2.1.46 (2019-01-14)
 * http://elfinder.org
 * 
 * Copyright 2009-2019, Studio 42
 * Licensed under a 3-clauses BSD license
 */

/* File: /css/commands.css */
/******************************************************************/
/*                          COMMANDS STYLES                       */
/******************************************************************/

/********************** COMMAND "RESIZE" ****************************/
.elfinder-resize-container {
    margin-top: .3em;
}

.elfinder-resize-type {
    float: left;
    margin-bottom: .4em;
}

.elfinder-resize-control {
    float: left;
}

.elfinder-resize-control input[type=number] {
    border: 1px solid #aaa;
    text-align: right;
    width: 4.5em;
}

.elfinder-mobile .elfinder-resize-control input[type=number] {
    width: 3.5em;
}

.elfinder-resize-control input.elfinder-resize-bg {
    text-align: center;
    width: 5em;
    direction: ltr;
}

.elfinder-dialog-resize .elfinder-resize-control-panel {
    margin-top: 10px;
}

.elfinder-dialog-resize .elfinder-resize-imgrotate,
.elfinder-dialog-resize .elfinder-resize-pallet {
    cursor: pointer;
}

.elfinder-dialog-resize .elfinder-resize-picking {
    cursor: crosshair;
}

.elfinder-dialog-resize .elfinder-resize-grid8 + button {
    padding-top: 2px;
    padding-bottom: 2px;
}

.elfinder-resize-preview {
    width: 400px;
    height: 400px;
    padding: 10px;
    background: #fff;
    border: 1px solid #aaa;
    float: right;
    position: relative;
    overflow: hidden;
    text-align: left;
    direction: ltr;
}

.elfinder-resize-handle {
    position: relative;
}

.elfinder-resize-handle-hline,
.elfinder-resize-handle-vline {
    position: absolute;
    background-image: url("../img/crop.gif");
}

.elfinder-resize-handle-hline {
    width: 100%;
    height: 1px !important;
    background-repeat: repeat-x;
}

.elfinder-resize-handle-vline {
    width: 1px !important;
    height: 100%;
    background-repeat: repeat-y;
}

.elfinder-resize-handle-hline-top {
    top: 0;
    left: 0;
}

.elfinder-resize-handle-hline-bottom {
    bottom: 0;
    left: 0;
}

.elfinder-resize-handle-vline-left {
    top: 0;
    left: 0;
}

.elfinder-resize-handle-vline-right {
    top: 0;
    right: 0;
}

.elfinder-resize-handle-point {
    position: absolute;
    width: 8px;
    height: 8px;
    border: 1px solid #777;
    background: transparent;
}

.elfinder-resize-handle-point-n {
    top: 0;
    left: 50%;
    margin-top: -5px;
    margin-left: -5px;
}

.elfinder-resize-handle-point-ne {
    top: 0;
    right: 0;
    margin-top: -5px;
    margin-right: -5px;
}

.elfinder-resize-handle-point-e {
    top: 50%;
    right: 0;
    margin-top: -5px;
    margin-right: -5px;
}

.elfinder-resize-handle-point-se {
    bottom: 0;
    right: 0;
    margin-bottom: -5px;
    margin-right: -5px;
}

.elfinder-resize-handle-point-s {
    bottom: 0;
    left: 50%;
    margin-bottom: -5px;
    margin-left: -5px;
}

.elfinder-resize-handle-point-sw {
    bottom: 0;
    left: 0;
    margin-bottom: -5px;
    margin-left: -5px;
}

.elfinder-resize-handle-point-w {
    top: 50%;
    left: 0;
    margin-top: -5px;
    margin-left: -5px;
}

.elfinder-resize-handle-point-nw {
    top: 0;
    left: 0;
    margin-top: -5px;
    margin-left: -5px;
}

.elfinder-dialog.elfinder-dialog-resize .ui-resizable-e {
    width: 10px;
    height: 100%;
}

.elfinder-dialog.elfinder-dialog-resize .ui-resizable-s {
    width: 100%;
    height: 10px;
}

.elfinder-resize-loading {
    position: absolute;
    width: 200px;
    height: 30px;
    top: 50%;
    margin-top: -25px;
    left: 50%;
    margin-left: -100px;
    text-align: center;
    background: url(../img/progress.gif) center bottom repeat-x;
}

.elfinder-resize-row {
    margin-bottom: 9px;
    position: relative;
}

.elfinder-resize-label {
    float: left;
    width: 80px;
    padding-top: 3px;
}

.elfinder-resize-checkbox-label {
    border: 1px solid transparent;
}

.elfinder-dialog-resize .elfinder-resize-whctrls {
    margin: -20px 5px 0 5px;
}

.elfinder-ltr .elfinder-dialog-resize .elfinder-resize-whctrls {
    float: right;
}

.elfinder-rtl .elfinder-dialog-resize .elfinder-resize-whctrls {
    float: left;
}

.elfinder-dialog-resize .ui-resizable-e,
.elfinder-dialog-resize .ui-resizable-w {
    height: 100%;
    width: 10px;
}

.elfinder-dialog-resize .ui-resizable-s,
.elfinder-dialog-resize .ui-resizable-n {
    width: 100%;
    height: 10px;
}

.elfinder-dialog-resize .ui-resizable-e {
    margin-right: -7px;
}

.elfinder-dialog-resize .ui-resizable-w {
    margin-left: -7px;
}

.elfinder-dialog-resize .ui-resizable-s {
    margin-bottom: -7px;
}

.elfinder-dialog-resize .ui-resizable-n {
    margin-top: -7px;
}

.elfinder-dialog-resize .ui-resizable-se,
.elfinder-dialog-resize .ui-resizable-sw,
.elfinder-dialog-resize .ui-resizable-ne,
.elfinder-dialog-resize .ui-resizable-nw {
    width: 10px;
    height: 10px;
}

.elfinder-dialog-resize .ui-resizable-se {
    background: transparent;
    bottom: 0;
    right: 0;
    margin-right: -7px;
    margin-bottom: -7px;
}

.elfinder-dialog-resize .ui-resizable-sw {
    margin-left: -7px;
    margin-bottom: -7px;
}

.elfinder-dialog-resize .ui-resizable-ne {
    margin-right: -7px;
    margin-top: -7px;
}

.elfinder-dialog-resize .ui-resizable-nw {
    margin-left: -7px;
    margin-top: -7px;
}

.elfinder-touch .elfinder-dialog-resize .ui-resizable-s,
.elfinder-touch .elfinder-dialog-resize .ui-resizable-n {
    height: 20px;
}

.elfinder-touch .elfinder-dialog-resize .ui-resizable-e,
.elfinder-touch .elfinder-dialog-resize .ui-resizable-w {
    width: 20px;
}

.elfinder-touch .elfinder-dialog-resize .ui-resizable-se,
.elfinder-touch .elfinder-dialog-resize .ui-resizable-sw,
.elfinder-touch .elfinder-dialog-resize .ui-resizable-ne,
.elfinder-touch .elfinder-dialog-resize .ui-resizable-nw {
    width: 30px;
    height: 30px;
}

.elfinder-touch .elfinder-dialog-resize .elfinder-resize-preview .ui-resizable-se {
    width: 30px;
    height: 30px;
    margin: 0;
}

.elfinder-dialog-resize .ui-icon-grip-solid-vertical {
    position: absolute;
    top: 50%;
    right: 0;
    margin-top: -8px;
    margin-right: -11px;
}

.elfinder-dialog-resize .ui-icon-grip-solid-horizontal {
    position: absolute;
    left: 50%;
    bottom: 0;
    margin-left: -8px;
    margin-bottom: -11px;;
}

.elfinder-dialog-resize .elfinder-resize-row .ui-buttonset {
    float: right;
}

.elfinder-dialog-resize .elfinder-resize-degree input,
.elfinder-dialog-resize input.elfinder-resize-quality {
    width: 3.5em;
}

.elfinder-mobile .elfinder-dialog-resize .elfinder-resize-degree input,
.elfinder-mobile .elfinder-dialog-resize input.elfinder-resize-quality {
    width: 2.5em;
}

.elfinder-dialog-resize .elfinder-resize-degree button.ui-button {
    padding: 6px 8px;
}

.elfinder-dialog-resize button.ui-button span {
    padding: 0;
}

.elfinder-dialog-resize .elfinder-resize-jpgsize {
    font-size: 90%;
}

.ui-widget-content .elfinder-resize-container .elfinder-resize-rotate-slider {
    width: 195px;
    margin: 10px 7px;
    background-color: #fafafa;
}

.elfinder-dialog-resize .elfinder-resize-type span.ui-checkboxradio-icon {
    display: none;
}

.elfinder-resize-preset-container {
    box-sizing: border-box;
    border-radius: 5px;
}

/********************** COMMAND "EDIT" ****************************/
/* edit text file textarea */
.elfinder-file-edit {
    width: 100%;
    height: 100%;
    margin: 0;
    padding: 2px;
    border: 1px solid #ccc;
    box-sizing: border-box;
    resize: none;
}

.elfinder-touch .elfinder-file-edit {
    font-size: 16px;
}

/* edit area */
.elfinder-dialog-edit .ui-dialog-content.elfinder-edit-editor {
    background-color: #fff;
}

.elfinder-dialog-edit .ui-dialog-content.elfinder-edit-editor .elfinder-edit-imageeditor {
    width: 100%;
    height: 300px;
    max-height: 100%;
    text-align: center;
}

.elfinder-dialog-edit .ui-dialog-content.elfinder-edit-editor .elfinder-edit-imageeditor * {
    -webkit-user-select: none;
    -moz-user-select: none;
    -khtml-user-select: none;
    user-select: none;
}

.elfinder-edit-imageeditor .tui-image-editor-main-container .tui-image-editor-main {
    top: 0;
}

.elfinder-edit-imageeditor .tui-image-editor-main-container .tui-image-editor-header {
    display: none;
}

.elfinder-edit-imageeditor .tui-image-editor-main.tui-image-editor-menu-crop .tui-image-editor-wrap,
.elfinder-edit-imageeditor .tui-image-editor-main.tui-image-editor-menu-flip .tui-image-editor-wrap,
.elfinder-edit-imageeditor .tui-image-editor-main.tui-image-editor-menu-rotate .tui-image-editor-wrap,
.elfinder-edit-imageeditor .tui-image-editor-main.tui-image-editor-menu-draw .tui-image-editor-wrap,
.elfinder-edit-imageeditor .tui-image-editor-main.tui-image-editor-menu-shape .tui-image-editor-wrap,
.elfinder-edit-imageeditor .tui-image-editor-main.tui-image-editor-menu-icon .tui-image-editor-wrap,
.elfinder-edit-imageeditor .tui-image-editor-main.tui-image-editor-menu-text .tui-image-editor-wrap,
.elfinder-edit-imageeditor .tui-image-editor-main.tui-image-editor-menu-mask .tui-image-editor-wrap,
.elfinder-edit-imageeditor .tui-image-editor-main.tui-image-editor-menu-filter .tui-image-editor-wrap {
    height: calc(100% - 150px);
}

/* bottom margen for softkeyboard on fullscreen mode */
.elfinder-touch.elfinder-fullscreen-native textarea.elfinder-file-edit {
    padding-bottom: 20em;
    margin-bottom: -20em;
}

.elfinder-dialog-edit .ui-dialog-buttonpane .elfinder-dialog-confirm-encoding {
    font-size: 12px;
}

.ui-dialog-buttonpane .ui-dialog-buttonset.elfinder-edit-extras {
    margin: 0 1em 0 .2em;
    float: left;
}

.ui-dialog-buttonpane .ui-dialog-buttonset.elfinder-edit-extras-quality {
    padding-top: 6px;
}

.ui-dialog-buttonpane .ui-dialog-buttonset.elfinder-edit-extras select {
    font-size: 12px;
    margin-top: 8px;
}

.elfinder-dialog-edit .ui-dialog-buttonpane .ui-icon {
    cursor: pointer;
}

.elfinder-edit-spinner {
    position: absolute;
    top: 50%;
    text-align: center;
    width: 100%;
    font-size: 16pt;
}

.elfinder-dialog-edit .elfinder-edit-spinner .elfinder-spinner,
.elfinder-dialog-edit .elfinder-edit-spinner .elfinder-spinner-text {
    float: none;
}

.elfinder-dialog-edit .elfinder-toast > div {
    width: 280px;
}
 
.elfinder-edit-onlineconvert-button {
    display: inline-block;
    width: 180px;
    min-height: 30px;
    vertical-align: top;
}
.elfinder-edit-onlineconvert-button button,
.elfinder-edit-onlineconvert-bottom-btn button {
    cursor: pointer;
}
.elfinder-edit-onlineconvert-bottom-btn button.elfinder-button-ios-multiline {
    -webkit-appearance: none;
    border-radius: 16px;
    color: #000;
    text-align: center;
    padding: 8px;
    background-color: #eee;
    background-image: -webkit-linear-gradient(top, hsl(0,0%,98%) 0%,hsl(0,0%,77%) 100%);
    background-image: linear-gradient(to bottom, hsl(0,0%,98%) 0%,hsl(0,0%,77%) 100%);
}
.elfinder-edit-onlineconvert-button .elfinder-button-icon {
    margin: 0 10px;
    vertical-align: middle;
    cursor: pointer;
}
.elfinder-edit-onlineconvert-bottom-btn {
    text-align: center;
    margin: 10px 0 0;
}

.elfinder-edit-onlineconvert-link {
    margin-top: 1em;
    text-align: center;
}
.elfinder-edit-onlineconvert-link .elfinder-button-icon {
    background-image: url("../img/editor-icons.png");
    background-repeat: no-repeat;
    background-position: 0 -144px;
    margin-bottom: -3px;
}
.elfinder-edit-onlineconvert-link a {
    text-decoration: none;
}

/********************** COMMAND "SORT" ****************************/
/* for list table header sort triangle icon */
div.elfinder-cwd-wrapper-list tr.ui-state-default td {
    position: relative;
}

div.elfinder-cwd-wrapper-list tr.ui-state-default td span.ui-icon {
    position: absolute;
    top: 4px;
    left: 0;
    right: 0;
    margin: auto 0px auto auto;
}

.elfinder-touch div.elfinder-cwd-wrapper-list tr.ui-state-default td span.ui-icon {
    top: 7px;
}

.elfinder-rtl div.elfinder-cwd-wrapper-list tr.ui-state-default td span.ui-icon {
    margin: auto auto auto 0px;
}

/********************** COMMAND "HELP" ****************************/
/* help dialog */
.elfinder-help {
    margin-bottom: .5em;
    -webkit-overflow-scrolling: touch;
}

/* fix tabs */
.elfinder-help .ui-tabs-panel {
    padding: .5em;
    overflow: auto;
    padding: 10px;
}

.elfinder-dialog .ui-tabs .ui-tabs-nav li {
    overflow: hidden;
}

.elfinder-dialog .ui-tabs .ui-tabs-nav li a {
    padding: .2em .8em;
    display: inline-block;
}

.elfinder-touch .elfinder-dialog .ui-tabs .ui-tabs-nav li a {
    padding: .5em .5em;
}

.elfinder-dialog .ui-tabs-active a {
    background: inherit;
}

.elfinder-help-shortcuts {
    height: auto;
    padding: 10px;
    margin: 0;
    box-sizing: border-box;
}

.elfinder-help-shortcut {
    white-space: nowrap;
    clear: both;
}

.elfinder-help-shortcut-pattern {
    float: left;
    width: 160px;
}

.elfinder-help-logo {
    width: 100px;
    height: 96px;
    float: left;
    margin-right: 1em;
    background: url('../img/logo.png') center center no-repeat;
}

.elfinder-help h3 {
    font-size: 1.5em;
    margin: .2em 0 .3em 0;
}

.elfinder-help-separator {
    clear: both;
    padding: .5em;
}

.elfinder-help-link {
    display: inline-block;
    margin-right: 12px;
    padding: 2px 0;
    white-space: nowrap;
}

.elfinder-rtl .elfinder-help-link {
    margin-right: 0;
    margin-left: 12px;
}

.elfinder-help .ui-priority-secondary {
    font-size: .9em;
}

.elfinder-help .ui-priority-primary {
    margin-bottom: 7px;
}

.elfinder-help-team {
    clear: both;
    text-align: right;
    border-bottom: 1px solid #ccc;
    margin: .5em 0;
    font-size: .9em;
}

.elfinder-help-team div {
    float: left;
}

.elfinder-help-license {
    font-size: .9em;
}

.elfinder-help-disabled {
    font-weight: bold;
    text-align: center;
    margin: 90px 0;
}

.elfinder-help .elfinder-dont-panic {
    display: block;
    border: 1px solid transparent;
    width: 200px;
    height: 200px;
    margin: 30px auto;
    text-decoration: none;
    text-align: center;
    position: relative;
    background: #d90004;
    -moz-box-shadow: 5px 5px 9px #111;
    -webkit-box-shadow: 5px 5px 9px #111;
    box-shadow: 5px 5px 9px #111;
    background: -moz-radial-gradient(80px 80px, circle farthest-corner, #d90004 35%, #960004 100%);
    background: -webkit-gradient(radial, 80 80, 60, 80 80, 120, from(#d90004), to(#960004));
    -moz-border-radius: 100px;
    -webkit-border-radius: 100px;
    border-radius: 100px;
    outline: none;
}

.elfinder-help .elfinder-dont-panic span {
    font-size: 3em;
    font-weight: bold;
    text-align: center;
    color: #fff;
    position: absolute;
    left: 0;
    top: 45px;
}

ul.elfinder-help-integrations ul {
    margin-bottom: 1em;
    padding: 0;
    margin: 0 1em 1em;
}

ul.elfinder-help-integrations a {
    text-decoration: none;
}

ul.elfinder-help-integrations a:hover {
    text-decoration: underline;
}

.elfinder-help-debug {
    height: 100%;
    padding: 0;
    margin: 0;
    overflow: none;
    border: none;
}

.elfinder-help-debug .ui-tabs-panel {
    padding: 0;
    margin: 0;
    overflow: auto;
}

.elfinder-help-debug fieldset {
    margin-bottom: 10px;
    border-color: #778899;
    border-radius: 10px;
}

.elfinder-help-debug legend {
    font-size: 1.2em;
    font-weight: bold;
    color: #2e8b57;
}

.elfinder-help-debug dl {
    margin: 0;
}

.elfinder-help-debug dt {
    color: #778899;
}

.elfinder-help-debug dt:before {
    content: "[";
}

.elfinder-help-debug dt:after {
    content: "]";
}

.elfinder-help-debug dd {
    margin-left: 1em;
}

/********************** COMMAND "PREFERENCE" ****************************/
.elfinder-dialog .elfinder-preference .ui-tabs-nav {
    margin-bottom: 1px;
    height: auto;
}

/* fix tabs */
.elfinder-preference .ui-tabs-panel {
    padding: 10px 10px 0;
    overflow: auto;
    box-sizing: border-box;
    -webkit-overflow-scrolling: touch;
}

.elfinder-preference a.ui-state-hover,
.elfinder-preference label.ui-state-hover {
    border: none;
}

.elfinder-preference dl {
    width: 100%;
    display: inline-block;
    margin: .5em 0;
}

.elfinder-preference dt {
    display: block;
    width: 200px;
    clear: left;
    float: left;
    max-width: 50%;
}

.elfinder-rtl .elfinder-preference dt {
    clear: right;
    float: right;
}

.elfinder-preference dd {
    margin-bottom: 1em;
}

.elfinder-preference dt label {
    cursor: pointer;
}

.elfinder-preference dd label,
.elfinder-preference dd input[type=checkbox] {
    white-space: nowrap;
    display: inline-block;
    cursor: pointer;
}

.elfinder-preference dt.elfinder-preference-checkboxes {
    width: 100%;
    max-width: none;
}

.elfinder-preference dd.elfinder-preference-checkboxes {
    padding-top: 3ex;
}

.elfinder-preference select {
    max-width: 100%;
}

.elfinder-preference dd.elfinder-preference-iconSize .ui-slider {
    width: 50%;
    max-width: 100px;
    display: inline-block;
    margin: 0 10px;
}

.elfinder-preference button {
    margin: 0 16px;
}

.elfinder-preference button + button {
    margin: 0 -10px;
}

.elfinder-preference .elfinder-preference-taball .elfinder-reference-hide-taball {
    display: none;
}

.elfinder-preference-theme fieldset {
    margin-bottom: 10px;
}

.elfinder-preference-theme legend a {
    font-size: 1.8em;
    text-decoration: none;
    cursor: pointer;
}

.elfinder-preference-theme dt {
    width: 20%;
    word-break: break-all;
}

.elfinder-preference-theme dt:after {
    content: " :";
}

.elfinder-preference-theme dd {
    margin-inline-start: 20%;
}

.elfinder-preference img.elfinder-preference-theme-image {
    display: block;
    margin-left: auto;
    margin-right: auto;
    max-width: 90%;
    max-height: 200px;
    cursor: pointer;
}

.elfinder-preference-theme-btn {
    text-align: center;
}

.elfinder-preference-theme button.elfinder-preference-theme-default {
    display: inline;
    margin: 0 10px;
    font-size: 8pt;
}

/********************** COMMAND "INFO" ****************************/
.elfinder-rtl .elfinder-info-title .elfinder-cwd-icon:before {
    right: 33px;
    left: auto;
}

.elfinder-info-title .elfinder-cwd-icon.elfinder-cwd-bgurl:after {
    content: none;
}

/********************** COMMAND "UPLOAD" ****************************/
.elfinder-upload-dialog-wrapper .elfinder-upload-dirselect {
    position: absolute;
    bottom: 2px;
    width: 16px;
    height: 16px;
    padding: 10px;
    border: none;
    overflow: hidden;
    cursor: pointer;
}

.elfinder-ltr .elfinder-upload-dialog-wrapper .elfinder-upload-dirselect {
    left: 2px;
}

.elfinder-rtl .elfinder-upload-dialog-wrapper .elfinder-upload-dirselect {
    right: 2px;
}

/********************** COMMAND "RM" ****************************/
.elfinder-ltr .elfinder-rm-title .elfinder-cwd-icon:before {
    left: 38px;
}

.elfinder-rtl .elfinder-rm-title .elfinder-cwd-icon:before {
    right: 86px;
    left: auto;
}

.elfinder-rm-title .elfinder-cwd-icon.elfinder-cwd-bgurl:after {
    content: none;
}

/********************** COMMAND "RENAME" ****************************/
.elfinder-rename-batch div {
    margin: 5px 8px;
}

.elfinder-rename-batch .elfinder-rename-batch-name input {
    width: 100%;
    font-size: 1.6em;
}

.elfinder-rename-batch-type {
    text-align: center;
}

.elfinder-rename-batch .elfinder-rename-batch-type label {
    margin: 2px;
    font-size: .9em;
}

.elfinder-rename-batch-preview {
    padding: 0 8px;
    font-size: 1.1em;
    min-height: 4ex;
}


/* File: /css/common.css */
/*********************************************/
/*            COMMON ELFINDER STUFFS         */
/*********************************************/

/* for old jQuery UI */
.ui-front {
    z-index: 100;
}

/* common container */
.elfinder {
    padding: 0;
    position: relative;
    display: block;
    visibility: visible;
    font-size: 18px;
    font-family: Verdana, Arial, Helvetica, sans-serif;
}

/* prevent auto zoom on iOS */
.elfinder-ios input,
.elfinder-ios select,
.elfinder-ios textarea {
    font-size: 16px !important;
}

/* full screen mode */
.elfinder.elfinder-fullscreen > .ui-resizable-handle {
    display: none;
}

.elfinder-font-mono {
    line-height: 2ex;
}

/* in lazy execution status */
.elfinder.elfinder-processing * {
    cursor: progress !important
}

.elfinder.elfinder-processing.elfinder-touch .elfinder-workzone:after {
    position: absolute;
    top: 0;
    width: 100%;
    height: 3px;
    content: '';
    left: 0;
    background-image: url(../img/progress.gif);
    opacity: .6;
    pointer-events: none;
}

/* for disable select of Touch devices */
.elfinder *:not(input):not(textarea):not(select):not([contenteditable=true]),
.elfinder-contextmenu *:not(input):not(textarea):not(select):not([contenteditable=true]) {
    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
    -webkit-user-select: none;
    -moz-user-select: none;
    -khtml-user-select: none;
    user-select: none;
}

.elfinder .overflow-scrolling-touch {
    -webkit-overflow-scrolling: touch;
}

/* right to left enviroment */
.elfinder-rtl {
    text-align: right;
    direction: rtl;
}

/* nav and cwd container */
.elfinder-workzone {
    padding: 0;
    position: relative;
    overflow: hidden;
}

/* dir/file permissions and symlink markers */
.elfinder-lock,
.elfinder-perms,
.elfinder-symlink {
    position: absolute;
    width: 16px;
    height: 16px;
    background-image: url(../img/toolbar.png);
    background-repeat: no-repeat;
    background-position: 0 -528px;
}

/* noaccess */
.elfinder-na .elfinder-perms {
    background-position: 0 -96px;
}

/* read only */
.elfinder-ro .elfinder-perms {
    background-position: 0 -64px;
}

/* write only */
.elfinder-wo .elfinder-perms {
    background-position: 0 -80px;
}

/* volume type group */
.elfinder-group .elfinder-perms {
    background-position: 0 0px;
}

/* locked */
.elfinder-lock {
    background-position: 0 -656px;
}

/* drag helper */
.elfinder-drag-helper {
    top: 0px;
    left: 0px;
    width: 70px;
    height: 60px;
    padding: 0 0 0 25px;
    z-index: 100000;
    will-change: left, top;
}

.elfinder-drag-helper.html5-native {
    position: absolute;
    top: -1000px;
    left: -1000px;
}

/* drag helper status icon (default no-drop) */
.elfinder-drag-helper-icon-status {
    position: absolute;
    width: 16px;
    height: 16px;
    left: 42px;
    top: 60px;
    background: url('../img/toolbar.png') 0 -96px no-repeat;
    display: block;
}

/* show "up-arrow" icon for move item */
.elfinder-drag-helper-move .elfinder-drag-helper-icon-status {
    background-position: 0 -720px;
}

/* show "plus" icon when ctrl/shift pressed */
.elfinder-drag-helper-plus .elfinder-drag-helper-icon-status {
    background-position: 0 -544px;
}

/* files num in drag helper */
.elfinder-drag-num {
    display: inline-box;
    position: absolute;
    top: 0;
    left: 0;
    width: auto;
    height: 14px;
    text-align: center;
    padding: 1px 3px 1px 3px;

    font-weight: bold;
    color: #fff;
    background-color: red;
    -moz-border-radius: 8px;
    -webkit-border-radius: 8px;
    border-radius: 8px;
}

/* icon in drag helper */
.elfinder-drag-helper .elfinder-cwd-icon {
    margin: 0 0 0 -24px;
    float: left;
}

/* transparent overlay */
.elfinder-overlay {
    position: absolute;
    opacity: .2;
    filter: Alpha(Opacity=20);
}

/* panels under/below cwd (for search field etc) */
.elfinder .elfinder-panel {
    position: relative;
    background-image: none;
    padding: 7px 12px;
}

/* for html5 drag and drop */
[draggable=true] {
    -khtml-user-drag: element;
}

/* for place holder to content editable elements */
.elfinder [contentEditable=true]:empty:not(:focus):before {
    content: attr(data-ph);
}

/* bottom tray */
.elfinder div.elfinder-bottomtray {
    position: fixed;
    bottom: 0;
    max-width: 100%;
    opacity: .8;
}

.elfinder.elfinder-ltr div.elfinder-bottomtray {
    left: 0;
}

.elfinder.elfinder-rtl div.elfinder-bottomtray {
    right: 0;
}

/* tooltip */
.elfinder-ui-tooltip,
.elfinder .elfinder-ui-tooltip {
    font-size: 14px;
    padding: 2px 4px;
}

/* File: /css/contextmenu.css */
/* menu and submenu */
.elfinder .elfinder-contextmenu,
.elfinder .elfinder-contextmenu-sub {
    position: absolute;
    border: 1px solid #aaa;
    background: #fff;
    color: #555;
    padding: 4px 0;
    top: 0;
    left: 0;
}

/* submenu */
.elfinder .elfinder-contextmenu-sub {
    top: 5px;
}

/* submenu in rtl/ltr enviroment */
.elfinder .elfinder-contextmenu-ltr .elfinder-contextmenu-sub {
    margin-left: -5px;
}

.elfinder .elfinder-contextmenu-rtl .elfinder-contextmenu-sub {
    margin-right: -5px;
}

/* menu item */
.elfinder .elfinder-contextmenu-header {
    margin-top: -4px;
    padding: 0 .5em .2ex;
    border: none;
    text-align: center;
}

.elfinder .elfinder-contextmenu-header span {
    font-weight: normal;
    font-size: 0.8em;
    font-weight: bolder;
}

.elfinder .elfinder-contextmenu-item {
    position: relative;
    display: block;
    padding: 4px 30px;
    text-decoration: none;
    white-space: nowrap;
    cursor: default;
}

.elfinder .elfinder-contextmenu-item.ui-state-active {
    border: none;
}

.elfinder .elfinder-contextmenu-item .ui-icon {
    width: 16px;
    height: 16px;
    position: absolute;
    left: auto;
    right: auto;
    top: 50%;
    margin-top: -8px;
}

.elfinder .elfinder-contextmenu-ltr .elfinder-contextmenu-item .ui-icon {
    left: 2px;
}

.elfinder .elfinder-contextmenu-rtl .elfinder-contextmenu-item .ui-icon {
    right: 2px;
}

.elfinder-touch .elfinder-contextmenu-item {
    padding: 12px 38px;
}

/* root icon of each volume */
.elfinder-navbar-root-local.elfinder-contextmenu-icon {
    background-image: url("../img/volume_icon_local.svg");
    background-size: contain;
}

.elfinder-navbar-root-trash.elfinder-contextmenu-icon {
    background-image: url("../img/volume_icon_trash.svg");
    background-size: contain;
}

.elfinder-navbar-root-ftp.elfinder-contextmenu-icon {
    background-image: url("../img/volume_icon_ftp.svg");
    background-size: contain;
}

.elfinder-navbar-root-sql.elfinder-contextmenu-icon {
    background-image: url("../img/volume_icon_sql.svg");
    background-size: contain;
}

.elfinder-navbar-root-dropbox.elfinder-contextmenu-icon {
    background-image: url("../img/volume_icon_dropbox.svg");
    background-size: contain;
}

.elfinder-navbar-root-googledrive.elfinder-contextmenu-icon {
    background-image: url("../img/volume_icon_googledrive.svg");
    background-size: contain;
}

.elfinder-navbar-root-onedrive.elfinder-contextmenu-icon {
    background-image: url("../img/volume_icon_onedrive.svg");
    background-size: contain;
}

.elfinder-navbar-root-box.elfinder-contextmenu-icon {
    background-image: url("../img/volume_icon_box.svg");
    background-size: contain;
}

.elfinder-navbar-root-zip.elfinder-contextmenu-icon {
    background-image: url("../img/volume_icon_zip.svg");
    background-size: contain;
}

.elfinder-navbar-root-network.elfinder-contextmenu-icon {
    background-image: url("../img/volume_icon_network.svg");
    background-size: contain;
}

/* text in item */
.elfinder .elfinder-contextmenu .elfinder-contextmenu-item span {
    display: block;
}

/* submenu item in rtl/ltr enviroment */
.elfinder .elfinder-contextmenu-sub .elfinder-contextmenu-item {
    padding-left: 12px;
    padding-right: 12px;
}

.elfinder .elfinder-contextmenu-ltr .elfinder-contextmenu-item {
    text-align: left;
}

.elfinder .elfinder-contextmenu-rtl .elfinder-contextmenu-item {
    text-align: right;
}

.elfinder .elfinder-contextmenu-ltr .elfinder-contextmenu-sub .elfinder-contextsubmenu-item-icon {
    padding-left: 28px;
}

.elfinder .elfinder-contextmenu-rtl .elfinder-contextmenu-sub .elfinder-contextsubmenu-item-icon {
    padding-right: 28px;
}

.elfinder-touch .elfinder-contextmenu-ltr .elfinder-contextmenu-sub .elfinder-contextsubmenu-item-icon {
    padding-left: 36px;
}

.elfinder-touch .elfinder-contextmenu-rtl .elfinder-contextmenu-sub .elfinder-contextsubmenu-item-icon {
    padding-right: 36px;
}

/* command/submenu icon */
.elfinder .elfinder-contextmenu-extra-icon,
.elfinder .elfinder-contextmenu-arrow,
.elfinder .elfinder-contextmenu-icon {
    position: absolute;
    top: 50%;
    margin-top: -8px;
    overflow: hidden;
}

/* command icon in rtl/ltr enviroment */
.elfinder .elfinder-contextmenu-ltr .elfinder-contextmenu-icon {
    left: 8px;
}

.elfinder .elfinder-contextmenu-rtl .elfinder-contextmenu-icon {
    right: 8px;
}

.elfinder .elfinder-contextmenu-ltr .elfinder-contextmenu-extra-icon {
    right: 8px;
}

.elfinder .elfinder-contextmenu-rtl .elfinder-contextmenu-extra-icon {
    left: 8px;
}

/* arrow icon */
.elfinder .elfinder-contextmenu-arrow {
    width: 16px;
    height: 16px;
    background: url('../img/arrows-normal.png') 5px 4px no-repeat;
}

/* arrow icon in rtl/ltr enviroment */
.elfinder .elfinder-contextmenu-ltr .elfinder-contextmenu-arrow {
    right: 5px;
}

.elfinder .elfinder-contextmenu-rtl .elfinder-contextmenu-arrow {
    left: 5px;
    background-position: 0 -10px;
}

/* command extra icon's <a>, <span> tag */
.elfinder .elfinder-contextmenu-extra-icon a,
.elfinder .elfinder-contextmenu-extra-icon span {
    display: inline-block;
    width: 100%;
    height: 100%;
    padding: 20px;
    margin: 0;
    color: transparent !important;
    text-decoration: none;
    cursor: pointer;
}

/* disable ui border/bg image on hover */
.elfinder .elfinder-contextmenu .ui-state-hover {
    border: 0 solid;
    background-image: none;
}

/* separator */
.elfinder .elfinder-contextmenu-separator {
    height: 0px;
    border-top: 1px solid #ccc;
    margin: 0 1px;
}

/* for CSS style priority to ui-state-disabled - "background-image: none" */
.elfinder .elfinder-contextmenu-item .elfinder-button-icon.ui-state-disabled {
    background-image: url('../img/toolbar.png');
}

/* File: /css/cwd.css */
/******************************************************************/
/*                     CURRENT DIRECTORY STYLES                   */
/******************************************************************/
/* cwd container to avoid selectable on scrollbar */
.elfinder-cwd-wrapper {
    overflow: auto;
    position: relative;
    padding: 2px;
    margin: 0;
}

.elfinder-cwd-wrapper-list {
    padding: 0;
}

/* container */
.elfinder-cwd {
    position: absolute;
    top: 0;
    cursor: default;
    padding: 0;
    margin: 0;
    -ms-touch-action: auto;
    touch-action: auto;
    min-width: 100%;
}

.elfinder-ltr .elfinder-cwd {
    left: 0;
}

.elfinder-rtl .elfinder-cwd {
    right: 0;
}

.elfinder-cwd.elfinder-table-header-sticky {
    position: -webkit-sticky;
    position: -ms-sticky;
    position: sticky;
    top: 0;
    left: auto;
    right: auto;
    width: -webkit-max-content;
    width: -moz-max-content;
    width: -ms-max-content;
    width: max-content;
    height: 0;
    overflow: visible;
}

.elfinder-cwd.elfinder-table-header-sticky table {
    border-top: 2px solid;
    padding-top: 0;
}

.elfinder-cwd.elfinder-table-header-sticky td {
    display: inline-block;
}

.elfinder-droppable-active .elfinder-cwd.elfinder-table-header-sticky table {
    border-top: 2px solid transparent;
}

/* fixed table header container */
.elfinder-cwd-fixheader .elfinder-cwd {
    position: relative;
}

/* container active on dropenter */
.elfinder .elfinder-cwd-wrapper.elfinder-droppable-active {
    outline: 2px solid #8cafed;
    outline-offset: -2px;
}

.elfinder-cwd-wrapper-empty .elfinder-cwd:after {
    display: block;
    position: absolute;
    height: auto;
    width: 90%;
    width: calc(100% - 20px);
    position: absolute;
    top: 50%;
    left: 50%;
    -ms-transform: translateY(-50%) translateX(-50%);
    -webkit-transform: translateY(-50%) translateX(-50%);
    transform: translateY(-50%) translateX(-50%);
    line-height: 1.5em;
    text-align: center;
    white-space: pre-wrap;
    opacity: 0.6;
    filter: Alpha(Opacity=60);
    font-weight: bold;
}

.elfinder-cwd-file .elfinder-cwd-select {
    position: absolute;
    top: 0px;
    left: 0px;
    background-color: transparent;
    opacity: .4;
    filter: Alpha(Opacity=40);
}

.elfinder-mobile .elfinder-cwd-file .elfinder-cwd-select {
    width: 30px;
    height: 30px;
}

.elfinder-cwd-file.ui-selected .elfinder-cwd-select {
    opacity: .8;
    filter: Alpha(Opacity=80);
}

.elfinder-rtl .elfinder-cwd-file .elfinder-cwd-select {
    left: auto;
    right: 0px;
}

.elfinder .elfinder-cwd-selectall {
    position: absolute;
    width: 30px;
    height: 30px;
    top: 0px;
    opacity: .8;
    filter: Alpha(Opacity=80);
}

.elfinder .elfinder-workzone.elfinder-cwd-wrapper-empty .elfinder-cwd-selectall {
    display: none;
}

/************************** ICONS VIEW ********************************/

.elfinder-ltr .elfinder-workzone .elfinder-cwd-selectall {
    text-align: right;
    right: 18px;
    left: auto;
}

.elfinder-rtl .elfinder-workzone .elfinder-cwd-selectall {
    text-align: left;
    right: auto;
    left: 18px;
}

.elfinder-ltr.elfinder-mobile .elfinder-workzone .elfinder-cwd-selectall {
    right: 0px;
}

.elfinder-rtl.elfinder-mobile .elfinder-workzone .elfinder-cwd-selectall {
    left: 0px;
}

.elfinder-cwd-view-icons .elfinder-cwd-file .elfinder-cwd-select.ui-state-hover {
    background-color: transparent;
}

/* file container */
.elfinder-cwd-view-icons .elfinder-cwd-file {
    width: 120px;
    height: 90px;
    padding-bottom: 2px;
    cursor: default;
    border: none;
    position: relative;
}

.elfinder-cwd-view-icons .elfinder-cwd-file .ui-state-active {
    border: none;
}

/* ltr/rtl enviroment */
.elfinder-ltr .elfinder-cwd-view-icons .elfinder-cwd-file {
    float: left;
    margin: 0 3px 2px 0;
}

.elfinder-rtl .elfinder-cwd-view-icons .elfinder-cwd-file {
    float: right;
    margin: 0 0 5px 3px;
}

/* remove ui hover class border */
.elfinder-cwd-view-icons .elfinder-cwd-file .ui-state-hover {
    border: 0 solid;
}

/* icon wrapper to create selected highlight around icon */
.elfinder-cwd-view-icons .elfinder-cwd-file-wrapper {
    width: 52px;
    height: 52px;
    margin: 1px auto 1px auto;
    padding: 2px;
    position: relative;
}

/*** Custom Icon Size size1 - size3 ***/
/* type badge */
.elfinder-cwd-size1 .elfinder-cwd-icon:before,
.elfinder-cwd-size2 .elfinder-cwd-icon:before,
.elfinder-cwd-size3 .elfinder-cwd-icon:before {
    top: 3px;
    display: block;
}

/* size1 */
.elfinder-cwd-size1.elfinder-cwd-view-icons .elfinder-cwd-file {
    width: 120px;
    height: 112px;
}

.elfinder-cwd-size1.elfinder-cwd-view-icons .elfinder-cwd-file-wrapper {
    width: 74px;
    height: 74px;
}

.elfinder-cwd-size1 .elfinder-cwd-icon {
    -ms-transform-origin: top center;
    -ms-transform: scale(1.5);
    -webkit-transform-origin: top center;
    -webkit-transform: scale(1.5);
    transform-origin: top center;
    transform: scale(1.5);
}

.elfinder-cwd-size1 .elfinder-cwd-icon.elfinder-cwd-bgurl:before {
    -ms-transform-origin: top left;
    -ms-transform: scale(1.35) translate(-4px, 15%);
    -webkit-transform-origin: top left;
    -webkit-transform: scale(1.35) translate(-4px, 15%);
    transform-origin: top left;
    transform: scale(1.35) translate(-4px, 15%);
}

.elfinder-cwd-size1 .elfinder-cwd-icon.elfinder-cwd-bgurl:after {
    -ms-transform: scale(1) translate(10px, -5px);
    -webkit-transform: scale(1) translate(10px, -5px);
    transform: scale(1) translate(10px, -5px);
}

.elfinder-cwd-size1 .elfinder-cwd-icon.elfinder-cwd-bgurl {
    -ms-transform-origin: center center;
    -ms-transform: scale(1);
    -webkit-transform-origin: center center;
    -webkit-transform: scale(1);
    transform-origin: center center;
    transform: scale(1);
    width: 72px;
    height: 72px;
    -moz-border-radius: 6px;
    -webkit-border-radius: 6px;
    border-radius: 6px;
}

/* size2 */
.elfinder-cwd-size2.elfinder-cwd-view-icons .elfinder-cwd-file {
    width: 140px;
    height: 134px;
}

.elfinder-cwd-size2.elfinder-cwd-view-icons .elfinder-cwd-file-wrapper {
    width: 98px;
    height: 98px;
}

.elfinder-cwd-size2 .elfinder-cwd-icon {
    -ms-transform-origin: top center;
    -ms-transform: scale(2);
    -webkit-transform-origin: top center;
    -webkit-transform: scale(2);
    transform-origin: top center;
    transform: scale(2);
}

.elfinder-cwd-size2 .elfinder-cwd-icon.elfinder-cwd-bgurl:before {
    -ms-transform-origin: top left;
    -ms-transform: scale(1.8) translate(-5px, 18%);
    -webkit-transform-origin: top left;
    -webkit-transform: scale(1.8) translate(-5px, 18%);
    transform-origin: top left;
    transform: scale(1.8) translate(-5px, 18%);
}

.elfinder-cwd-size2 .elfinder-cwd-icon.elfinder-cwd-bgurl:after {
    -ms-transform: scale(1.1) translate(0px, 10px);
    -webkit-transform: scale(1.1) translate(0px, 10px);
    transform: scale(1.1) translate(0px, 10px);
}

.elfinder-cwd-size2 .elfinder-cwd-icon.elfinder-cwd-bgurl {
    -ms-transform-origin: center center;
    -ms-transform: scale(1);
    -webkit-transform-origin: center center;
    -webkit-transform: scale(1);
    transform-origin: center center;
    transform: scale(1);
    width: 96px;
    height: 96px;
    -moz-border-radius: 8px;
    -webkit-border-radius: 8px;
    border-radius: 8px;
}

/* size3 */
.elfinder-cwd-size3.elfinder-cwd-view-icons .elfinder-cwd-file {
    width: 174px;
    height: 158px;
}

.elfinder-cwd-size3.elfinder-cwd-view-icons .elfinder-cwd-file-wrapper {
    width: 122px;
    height: 122px;
}

.elfinder-cwd-size3 .elfinder-cwd-icon {
    -ms-transform-origin: top center;
    -ms-transform: scale(2.5);
    -webkit-transform-origin: top center;
    -webkit-transform: scale(2.5);
    transform-origin: top center;
    transform: scale(2.5);
}

.elfinder-cwd-size3 .elfinder-cwd-icon.elfinder-cwd-bgurl:before {
    -ms-transform-origin: top left;
    -ms-transform: scale(2.25) translate(-6px, 20%);
    -webkit-transform-origin: top left;
    -webkit-transform: scale(2.25) translate(-6px, 20%);
    transform-origin: top left;
    transform: scale(2.25) translate(-6px, 20%);
}

.elfinder-cwd-size3 .elfinder-cwd-icon.elfinder-cwd-bgurl:after {
    -ms-transform: scale(1.2) translate(-9px, 22px);
    -webkit-transform: scale(1.2) translate(-9px, 22px);
    transform: scale(1.2) translate(-9px, 22px);
}

.elfinder-cwd-size3 .elfinder-cwd-icon.elfinder-cwd-bgurl {
    -ms-transform-origin: center center;
    -ms-transform: scale(1);
    -webkit-transform-origin: center center;
    -webkit-transform: scale(1);
    transform-origin: center center;
    transform: scale(1);
    width: 120px;
    height: 120px;
    -moz-border-radius: 10px;
    -webkit-border-radius: 10px;
    border-radius: 10px;
}

/* file name place */
.elfinder-cwd-view-icons .elfinder-cwd-filename {
    text-align: center;
    max-height: 2.4em;
    line-height: 1.2em;
    white-space: pre-line;
    overflow: hidden;
    text-overflow: ellipsis;
    -o-text-overflow: ellipsis;
    margin: 3px 1px 0 1px;
    padding: 1px;
    -moz-border-radius: 8px;
    -webkit-border-radius: 8px;
    border-radius: 8px;
    /* for webkit CSS3 */
    word-break: break-word;
    overflow-wrap: break-word;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
}

/* permissions/symlink markers */
.elfinder-cwd-view-icons .elfinder-perms {
    bottom: 4px;
    right: 2px;
}

.elfinder-cwd-view-icons .elfinder-lock {
    top: -3px;
    right: -2px;
}

.elfinder-cwd-view-icons .elfinder-symlink {
    bottom: 6px;
    left: 0px;
}

/* icon/thumbnail */
.elfinder-cwd-icon {
    display: block;
    width: 48px;
    height: 48px;
    margin: 0 auto;
    background-image: url('../img/icons-big.svg');
    background-image: url('../img/icons-big.png') \9;
    background-position: 0 0;
    background-repeat: no-repeat;
    -moz-background-clip: padding;
    -webkit-background-clip: padding-box;
    background-clip: padding-box;
}

/* volume icon of root in folder */
.elfinder-navbar-root-local .elfinder-cwd-icon,
.elfinder-cwd .elfinder-navbar-root-local.elfinder-droppable-active .elfinder-cwd-icon,
.elfinder-cwd-view-list .elfinder-navbar-root-local td .elfinder-cwd-icon {
    background-image: url("../img/volume_icon_local.svg");
    background-image: url("../img/volume_icon_local.png") \9;
    background-position: 0 0;
    background-size: contain;
}

.elfinder-cwd .elfinder-navbar-root-local.elfinder-droppable-active .elfinder-cwd-icon {
    background-position: 1px -1px;
}

.elfinder-navbar-root-trash .elfinder-cwd-icon,
.elfinder-cwd .elfinder-navbar-root-trash.elfinder-droppable-active .elfinder-cwd-icon,
.elfinder-cwd-view-list .elfinder-navbar-root-trash td .elfinder-cwd-icon {
    background-image: url("../img/volume_icon_trash.svg");
    background-image: url("../img/volume_icon_trash.png") \9;
    background-position: 0 0;
    background-size: contain;
}

.elfinder-cwd .elfinder-navbar-root-trash.elfinder-droppable-active .elfinder-cwd-icon {
    background-position: 1px -1px;
}

.elfinder-navbar-root-ftp .elfinder-cwd-icon,
.elfinder-cwd .elfinder-navbar-root-ftp.elfinder-droppable-active .elfinder-cwd-icon,
.elfinder-cwd-view-list .elfinder-navbar-root-ftp td .elfinder-cwd-icon {
    background-image: url("../img/volume_icon_ftp.svg");
    background-image: url("../img/volume_icon_ftp.png") \9;
    background-position: 0 0;
    background-size: contain;
}

.elfinder-cwd .elfinder-navbar-root-ftp.elfinder-droppable-active .elfinder-cwd-icon {
    background-position: 1px -1px;
}

.elfinder-navbar-root-sql .elfinder-cwd-icon,
.elfinder-cwd .elfinder-navbar-root-sql.elfinder-droppable-active .elfinder-cwd-icon,
.elfinder-cwd-view-list .elfinder-navbar-root-sql td .elfinder-cwd-icon {
    background-image: url("../img/volume_icon_sql.svg");
    background-image: url("../img/volume_icon_sql.png") \9;
    background-position: 0 0;
    background-size: contain;
}

.elfinder-cwd .elfinder-navbar-root-sql.elfinder-droppable-active .elfinder-cwd-icon {
    background-position: 1px -1px;
}

.elfinder-navbar-root-dropbox .elfinder-cwd-icon,
.elfinder-cwd .elfinder-navbar-root-dropbox.elfinder-droppable-active .elfinder-cwd-icon,
.elfinder-cwd-view-list .elfinder-navbar-root-dropbox td .elfinder-cwd-icon {
    background-image: url("../img/volume_icon_dropbox.svg");
    background-image: url("../img/volume_icon_dropbox.png") \9;
    background-position: 0 0;
    background-size: contain;
}

.elfinder-cwd .elfinder-navbar-root-dropbox.elfinder-droppable-active .elfinder-cwd-icon {
    background-position: 1px -1px;
}

.elfinder-navbar-root-googledrive .elfinder-cwd-icon,
.elfinder-cwd .elfinder-navbar-root-googledrive.elfinder-droppable-active .elfinder-cwd-icon,
.elfinder-cwd-view-list .elfinder-navbar-root-googledrive td .elfinder-cwd-icon {
    background-image: url("../img/volume_icon_googledrive.svg");
    background-image: url("../img/volume_icon_googledrive.png") \9;
    background-position: 0 0;
    background-size: contain;
}

.elfinder-navbar-root-onedrive .elfinder-cwd-icon,
.elfinder-cwd .elfinder-navbar-root-onedrive.elfinder-droppable-active .elfinder-cwd-icon,
.elfinder-cwd-view-list .elfinder-navbar-root-onedrive td .elfinder-cwd-icon {
    background-image: url("../img/volume_icon_onedrive.svg");
    background-image: url("../img/volume_icon_onedrive.png") \9;
    background-position: 0 0;
    background-size: contain;
}

.elfinder-navbar-root-box .elfinder-cwd-icon,
.elfinder-cwd .elfinder-navbar-root-box.elfinder-droppable-active .elfinder-cwd-icon,
.elfinder-cwd-view-list .elfinder-navbar-root-box td .elfinder-cwd-icon {
    background-image: url("../img/volume_icon_box.svg");
    background-image: url("../img/volume_icon_box.png") \9;
    background-position: 0 0;
    background-size: contain;
}

.elfinder-navbar-root-zip .elfinder-cwd-icon,
.elfinder-cwd .elfinder-navbar-root-zip.elfinder-droppable-active .elfinder-cwd-icon,
.elfinder-cwd-view-list .elfinder-navbar-root-zip td .elfinder-cwd-icon {
    background-image: url("../img/volume_icon_zip.svg");
    background-image: url("../img/volume_icon_zip.png") \9;
    background-position: 0 0;
    background-size: contain;
}

.elfinder-cwd .elfinder-navbar-root-googledrive.elfinder-droppable-active .elfinder-cwd-icon,
.elfinder-cwd .elfinder-navbar-root-onedrive.elfinder-droppable-active .elfinder-cwd-icon,
.elfinder-cwd .elfinder-navbar-root-box.elfinder-droppable-active .elfinder-cwd-icon {
    background-position: 1px -1px;
}

.elfinder-navbar-root-network .elfinder-cwd-icon,
.elfinder-cwd .elfinder-navbar-root-network.elfinder-droppable-active .elfinder-cwd-icon,
.elfinder-cwd-view-list .elfinder-navbar-root-network td .elfinder-cwd-icon {
    background-image: url("../img/volume_icon_network.svg");
    background-image: url("../img/volume_icon_network.png") \9;
    background-position: 0 0;
    background-size: contain;
}

.elfinder-cwd .elfinder-navbar-root-network.elfinder-droppable-active .elfinder-cwd-icon {
    background-position: 1px -1px;
}

/* type badge in "icons" view */
.elfinder-cwd-icon:before {
    content: none;
    position: absolute;
    left: 0px;
    top: 5px;
    min-width: 20px;
    max-width: 84px;
    text-align: center;
    padding: 0px 4px 1px;
    border-radius: 4px;
    font-family: Verdana;
    font-size: 10px;
    line-height: 1.3em;
    -webkit-transform: scale(0.9);
    -moz-transform: scale(0.9);
    -ms-transform: scale(0.9);
    -o-transform: scale(0.9);
    transform: scale(0.9);
}

.elfinder-cwd-view-icons .elfinder-cwd-icon.elfinder-cwd-bgurl:before {
    left: -10px;
}

/* addtional type badge name */
.elfinder-cwd-icon.elfinder-cwd-icon-mp2t:before {
    content: 'ts'
}

.elfinder-cwd-icon.elfinder-cwd-icon-dash-xml:before {
    content: 'dash'
}

.elfinder-cwd-icon.elfinder-cwd-icon-x-mpegurl:before {
    content: 'hls'
}

.elfinder-cwd-icon.elfinder-cwd-icon-x-c:before {
    content: 'c++'
}

/* thumbnail image */
.elfinder-cwd-icon.elfinder-cwd-bgurl {
    background-position: center center;
    background-repeat: no-repeat;
    -moz-background-size: contain;
    background-size: contain;
}

/* thumbnail self */
.elfinder-cwd-icon.elfinder-cwd-bgurl.elfinder-cwd-bgself {
    -moz-background-size: cover;
    background-size: cover;
}

/* thumbnail crop*/
.elfinder-cwd-icon.elfinder-cwd-bgurl {
    -moz-background-size: cover;
    background-size: cover;
}

.elfinder-cwd-icon.elfinder-cwd-bgurl:after {
    content: ' ';
}

.elfinder-cwd-bgurl:after {
    position: relative;
    display: inline-block;
    top: 36px;
    left: -38px;
    width: 48px;
    height: 48px;
    background-image: url('../img/icons-big.svg');
    background-image: url('../img/icons-big.png') \9;
    background-repeat: no-repeat;
    background-size: auto !important;
    opacity: .8;
    filter: Alpha(Opacity=60);
    -webkit-transform-origin: 54px -24px;
    -webkit-transform: scale(.6);
    -moz-transform-origin: 54px -24px;
    -moz-transform: scale(.6);
    -ms-transform-origin: 54px -24px;
    -ms-transform: scale(.6);
    -o-transform-origin: 54px -24px;
    -o-transform: scale(.6);
    transform-origin: 54px -24px;
    transform: scale(.6);
}

/* thumbnail image and draging icon */
.elfinder-cwd-icon.elfinder-cwd-icon-drag {
    width: 48px;
    height: 48px;
}

/* thumbnail image and draging icon overlay none */
.elfinder-cwd-icon.elfinder-cwd-icon-drag:before,
.elfinder-cwd-icon.elfinder-cwd-icon-drag:after,
.elfinder-cwd-icon-image.elfinder-cwd-bgurl:after,
.elfinder-cwd-icon-directory.elfinder-cwd-bgurl:after {
    content: none;
}

/* "opened folder" icon on dragover */
.elfinder-cwd .elfinder-droppable-active .elfinder-cwd-icon {
    background-position: 0 -100px;
}

.elfinder-cwd .elfinder-droppable-active {
    outline: 2px solid #8cafed;
    outline-offset: -2px;
}

/* mimetypes icons */
.elfinder-cwd-icon-directory {
    background-position: 0 -50px;
}

.elfinder-cwd-icon-application:after,
.elfinder-cwd-icon-application {
    background-position: 0 -150px;
}

.elfinder-cwd-icon-text:after,
.elfinder-cwd-icon-text {
    background-position: 0 -1350px;
}

.elfinder-cwd-icon-plain:after,
.elfinder-cwd-icon-plain,
.elfinder-cwd-icon-x-empty:after,
.elfinder-cwd-icon-x-empty {
    background-position: 0 -200px;
}

.elfinder-cwd-icon-image:after,
.elfinder-cwd-icon-vnd-adobe-photoshop:after,
.elfinder-cwd-icon-image,
.elfinder-cwd-icon-vnd-adobe-photoshop {
    background-position: 0 -250px;
}

.elfinder-cwd-icon-postscript:after,
.elfinder-cwd-icon-postscript {
    background-position: 0 -1550px;
}

.elfinder-cwd-icon-audio:after,
.elfinder-cwd-icon-audio {
    background-position: 0 -300px;
}

.elfinder-cwd-icon-video:after,
.elfinder-cwd-icon-video,
.elfinder-cwd-icon-flash-video,
.elfinder-cwd-icon-dash-xml,
.elfinder-cwd-icon-vnd-apple-mpegurl,
.elfinder-cwd-icon-x-mpegurl {
    background-position: 0 -350px;
}

.elfinder-cwd-icon-rtf:after,
.elfinder-cwd-icon-rtfd:after,
.elfinder-cwd-icon-rtf,
.elfinder-cwd-icon-rtfd {
    background-position: 0 -400px;
}

.elfinder-cwd-icon-pdf:after,
.elfinder-cwd-icon-pdf {
    background-position: 0 -450px;
}

.elfinder-cwd-icon-ms-excel,
.elfinder-cwd-icon-ms-excel:after,
.elfinder-cwd-icon-vnd-ms-excel,
.elfinder-cwd-icon-vnd-ms-excel-addin-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-excel-addin-macroEnabled-12:after,
.elfinder-cwd-icon-vnd-ms-excel-sheet-binary-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-excel-sheet-binary-macroEnabled-12:after,
.elfinder-cwd-icon-vnd-ms-excel-sheet-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-excel-sheet-macroEnabled-12:after,
.elfinder-cwd-icon-vnd-ms-excel-template-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-excel-template-macroEnabled-12:after,
.elfinder-cwd-icon-vnd-ms-excel:after,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-spreadsheetml-sheet,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-spreadsheetml-sheet:after,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-spreadsheetml-template,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-spreadsheetml-template:after {
    background-position: 0 -1450px
}

.elfinder-cwd-icon-vnd-oasis-opendocument-spreadsheet,
.elfinder-cwd-icon-vnd-oasis-opendocument-spreadsheet-template,
.elfinder-cwd-icon-vnd-oasis-opendocument-spreadsheet-template:after,
.elfinder-cwd-icon-vnd-oasis-opendocument-spreadsheet:after {
    background-position: 0 -1700px
}

.elfinder-cwd-icon-vnd-ms-powerpoint,
.elfinder-cwd-icon-vnd-ms-powerpoint-addin-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-powerpoint-addin-macroEnabled-12:after,
.elfinder-cwd-icon-vnd-ms-powerpoint-presentation-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-powerpoint-presentation-macroEnabled-12:after,
.elfinder-cwd-icon-vnd-ms-powerpoint-slide-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-powerpoint-slide-macroEnabled-12:after,
.elfinder-cwd-icon-vnd-ms-powerpoint-slideshow-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-powerpoint-slideshow-macroEnabled-12:after,
.elfinder-cwd-icon-vnd-ms-powerpoint-template-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-powerpoint-template-macroEnabled-12:after,
.elfinder-cwd-icon-vnd-ms-powerpoint:after,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-presentation,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-presentation:after,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-slide,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-slide:after,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-slideshow,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-slideshow:after,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-template,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-template:after {
    background-position: 0 -1400px
}

.elfinder-cwd-icon-vnd-oasis-opendocument-presentation,
.elfinder-cwd-icon-vnd-oasis-opendocument-presentation-template,
.elfinder-cwd-icon-vnd-oasis-opendocument-presentation-template:after,
.elfinder-cwd-icon-vnd-oasis-opendocument-presentation:after {
    background-position: 0 -1650px
}

.elfinder-cwd-icon-msword,
.elfinder-cwd-icon-msword:after,
.elfinder-cwd-icon-vnd-ms-word,
.elfinder-cwd-icon-vnd-ms-word-document-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-word-document-macroEnabled-12:after,
.elfinder-cwd-icon-vnd-ms-word-template-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-word-template-macroEnabled-12:after,
.elfinder-cwd-icon-vnd-ms-word:after,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-wordprocessingml-document,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-wordprocessingml-document:after,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-wordprocessingml-template,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-wordprocessingml-template:after {
    background-position: 0 -1500px
}

.elfinder-cwd-icon-vnd-oasis-opendocument-text,
.elfinder-cwd-icon-vnd-oasis-opendocument-text-master,
.elfinder-cwd-icon-vnd-oasis-opendocument-text-master:after,
.elfinder-cwd-icon-vnd-oasis-opendocument-text-template,
.elfinder-cwd-icon-vnd-oasis-opendocument-text-template:after,
.elfinder-cwd-icon-vnd-oasis-opendocument-text-web,
.elfinder-cwd-icon-vnd-oasis-opendocument-text-web:after,
.elfinder-cwd-icon-vnd-oasis-opendocument-text:after {
    background-position: 0 -1750px
}

.elfinder-cwd-icon-vnd-ms-office,
.elfinder-cwd-icon-vnd-ms-office:after {
    background-position: 0 -500px
}

.elfinder-cwd-icon-vnd-oasis-opendocument-chart,
.elfinder-cwd-icon-vnd-oasis-opendocument-chart:after,
.elfinder-cwd-icon-vnd-oasis-opendocument-database,
.elfinder-cwd-icon-vnd-oasis-opendocument-database:after,
.elfinder-cwd-icon-vnd-oasis-opendocument-formula,
.elfinder-cwd-icon-vnd-oasis-opendocument-formula:after,
.elfinder-cwd-icon-vnd-oasis-opendocument-graphics,
.elfinder-cwd-icon-vnd-oasis-opendocument-graphics-template,
.elfinder-cwd-icon-vnd-oasis-opendocument-graphics-template:after,
.elfinder-cwd-icon-vnd-oasis-opendocument-graphics:after,
.elfinder-cwd-icon-vnd-oasis-opendocument-image,
.elfinder-cwd-icon-vnd-oasis-opendocument-image:after,
.elfinder-cwd-icon-vnd-openofficeorg-extension,
.elfinder-cwd-icon-vnd-openofficeorg-extension:after {
    background-position: 0 -1600px
}

.elfinder-cwd-icon-html:after,
.elfinder-cwd-icon-html {
    background-position: 0 -550px;
}

.elfinder-cwd-icon-css:after,
.elfinder-cwd-icon-css {
    background-position: 0 -600px;
}

.elfinder-cwd-icon-javascript:after,
.elfinder-cwd-icon-x-javascript:after,
.elfinder-cwd-icon-javascript,
.elfinder-cwd-icon-x-javascript {
    background-position: 0 -650px;
}

.elfinder-cwd-icon-x-perl:after,
.elfinder-cwd-icon-x-perl {
    background-position: 0 -700px;
}

.elfinder-cwd-icon-x-python:after,
.elfinder-cwd-icon-x-python {
    background-position: 0 -750px;
}

.elfinder-cwd-icon-x-ruby:after,
.elfinder-cwd-icon-x-ruby {
    background-position: 0 -800px;
}

.elfinder-cwd-icon-x-sh:after,
.elfinder-cwd-icon-x-shellscript:after,
.elfinder-cwd-icon-x-sh,
.elfinder-cwd-icon-x-shellscript {
    background-position: 0 -850px;
}

.elfinder-cwd-icon-x-c:after,
.elfinder-cwd-icon-x-csrc:after,
.elfinder-cwd-icon-x-chdr:after,
.elfinder-cwd-icon-x-c--:after,
.elfinder-cwd-icon-x-c--src:after,
.elfinder-cwd-icon-x-c--hdr:after,
.elfinder-cwd-icon-x-java:after,
.elfinder-cwd-icon-x-java-source:after,
.elfinder-cwd-icon-x-c,
.elfinder-cwd-icon-x-csrc,
.elfinder-cwd-icon-x-chdr,
.elfinder-cwd-icon-x-c--,
.elfinder-cwd-icon-x-c--src,
.elfinder-cwd-icon-x-c--hdr,
.elfinder-cwd-icon-x-java,
.elfinder-cwd-icon-x-java-source {
    background-position: 0 -900px;
}

.elfinder-cwd-icon-x-php:after,
.elfinder-cwd-icon-x-php {
    background-position: 0 -950px;
}

.elfinder-cwd-icon-xml:after,
.elfinder-cwd-icon-xml {
    background-position: 0 -1000px;
}

.elfinder-cwd-icon-zip:after,
.elfinder-cwd-icon-x-zip:after,
.elfinder-cwd-icon-x-xz:after,
.elfinder-cwd-icon-x-7z-compressed:after,
.elfinder-cwd-icon-zip,
.elfinder-cwd-icon-x-zip,
.elfinder-cwd-icon-x-xz,
.elfinder-cwd-icon-x-7z-compressed {
    background-position: 0 -1050px;
}

.elfinder-cwd-icon-x-gzip:after,
.elfinder-cwd-icon-x-tar:after,
.elfinder-cwd-icon-x-gzip,
.elfinder-cwd-icon-x-tar {
    background-position: 0 -1100px;
}

.elfinder-cwd-icon-x-bzip:after,
.elfinder-cwd-icon-x-bzip2:after,
.elfinder-cwd-icon-x-bzip,
.elfinder-cwd-icon-x-bzip2 {
    background-position: 0 -1150px;
}

.elfinder-cwd-icon-x-rar:after,
.elfinder-cwd-icon-x-rar-compressed:after,
.elfinder-cwd-icon-x-rar,
.elfinder-cwd-icon-x-rar-compressed {
    background-position: 0 -1200px;
}

.elfinder-cwd-icon-x-shockwave-flash:after,
.elfinder-cwd-icon-x-shockwave-flash {
    background-position: 0 -1250px;
}

.elfinder-cwd-icon-group {
    background-position: 0 -1300px;
}

/* textfield inside icon */
.elfinder-cwd-filename input {
    width: 100%;
    border: none;
    margin: 0;
    padding: 0;
}

.elfinder-cwd-view-icons input {
    text-align: center;
}

.elfinder-cwd-view-icons textarea {
    width: 100%;
    border: 0px solid;
    margin: 0;
    padding: 0;
    text-align: center;
    overflow: hidden;
    resize: none;
}

.elfinder-cwd-view-icons {
    text-align: center;
}

/************************************  LIST VIEW ************************************/

.elfinder-cwd-wrapper.elfinder-cwd-fixheader .elfinder-cwd::after {
    display: none;
}

.elfinder-cwd table {
    width: 100%;
    border-collapse: separate;
    border: 0 solid;
    margin: 0 0 10px 0;
    border-spacing: 0;
    box-sizing: padding-box;
    padding: 2px;
    position: relative;
}

.elfinder-cwd table td {
    /* fix conflict with Bootstrap CSS */
    box-sizing: content-box;
}

.elfinder-cwd-wrapper-list.elfinder-cwd-fixheader {
    position: absolute;
    overflow: hidden;
}

.elfinder-cwd-wrapper-list.elfinder-cwd-fixheader:before {
    content: '';
    position: absolute;
    width: 100%;
    top: 0;
    height: 3px;
    background-color: white;
}

.elfinder-droppable-active + .elfinder-cwd-wrapper-list.elfinder-cwd-fixheader:before {
    background-color: #8cafed;
}

.elfinder .elfinder-workzone div.elfinder-cwd-fixheader table {
    table-layout: fixed;
}

.elfinder .elfinder-cwd table tbody.elfinder-cwd-fixheader {
    position: relative;
}

.elfinder-ltr .elfinder-cwd thead .elfinder-cwd-selectall {
    text-align: left;
    right: auto;
    left: 0px;
    padding-top: 3px;
}

.elfinder-rtl .elfinder-cwd thead .elfinder-cwd-selectall {
    text-align: right;
    right: 0px;
    left: auto;
    padding-top: 3px;
}

.elfinder-touch .elfinder-cwd thead .elfinder-cwd-selectall {
    padding-top: 4px;
}

.elfinder .elfinder-cwd table thead tr {
    border-left: 0 solid;
    border-top: 0 solid;
    border-right: 0 solid;
}

.elfinder .elfinder-cwd table thead td {
    padding: 4px 14px;
}

.elfinder-ltr .elfinder-cwd.elfinder-has-checkbox table thead td:first-child {
    padding: 4px 14px 4px 22px;
}

.elfinder-rtl .elfinder-cwd.elfinder-has-checkbox table thead td:first-child {
    padding: 4px 22px 4px 14px;
}

.elfinder-touch .elfinder-cwd table thead td,
.elfinder-touch .elfinder-cwd.elfinder-has-checkbox table thead td:first-child {
    padding-top: 8px;
    padding-bottom: 8px;
}

.elfinder .elfinder-cwd table thead td.ui-state-active {
    background: #ebf1f6;
    background: -moz-linear-gradient(top, #ebf1f6 0%, #abd3ee 50%, #89c3eb 51%, #d5ebfb 100%);
    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ebf1f6), color-stop(50%, #abd3ee), color-stop(51%, #89c3eb), color-stop(100%, #d5ebfb));
    background: -webkit-linear-gradient(top, #ebf1f6 0%, #abd3ee 50%, #89c3eb 51%, #d5ebfb 100%);
    background: -o-linear-gradient(top, #ebf1f6 0%, #abd3ee 50%, #89c3eb 51%, #d5ebfb 100%);
    background: -ms-linear-gradient(top, #ebf1f6 0%, #abd3ee 50%, #89c3eb 51%, #d5ebfb 100%);
    background: linear-gradient(to bottom, #ebf1f6 0%, #abd3ee 50%, #89c3eb 51%, #d5ebfb 100%);
    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebf1f6', endColorstr='#d5ebfb', GradientType=0);
}

.elfinder .elfinder-cwd table td {
    padding: 4px 12px;
    white-space: pre;
    overflow: hidden;
    text-align: right;
    cursor: default;
    border: 0 solid;
}

.elfinder .elfinder-cwd table tbody td:first-child {
    position: relative
}

.elfinder .elfinder-cwd table td div {
    box-sizing: content-box;
}

tr.elfinder-cwd-file td .elfinder-cwd-select {
    padding-top: 3px;
}

.elfinder-mobile tr.elfinder-cwd-file td .elfinder-cwd-select {
    width: 40px;
}

.elfinder-touch tr.elfinder-cwd-file td .elfinder-cwd-select {
    padding-top: 10px;
}

.elfinder-touch .elfinder-cwd tr td {
    padding: 10px 12px;
}

.elfinder-touch .elfinder-cwd tr.elfinder-cwd-file td {
    padding: 13px 12px;
}

.elfinder-ltr .elfinder-cwd table td {
    text-align: right;
}

.elfinder-ltr .elfinder-cwd table td:first-child {
    text-align: left;
}

.elfinder-rtl .elfinder-cwd table td {
    text-align: left;
}

.elfinder-rtl .elfinder-cwd table td:first-child {
    text-align: right;
}

.elfinder-odd-row {
    background: #eee;
}

/* filename container */
.elfinder-cwd-view-list .elfinder-cwd-file-wrapper {
    width: 97%;
    position: relative;
}

/* filename container in ltr/rtl enviroment */
.elfinder-ltr .elfinder-cwd-view-list.elfinder-has-checkbox .elfinder-cwd-file-wrapper {
    margin-left: 8px;
}

.elfinder-rtl .elfinder-cwd-view-list.elfinder-has-checkbox .elfinder-cwd-file-wrapper {
    margin-right: 8px;
}

.elfinder-ltr .elfinder-cwd-view-list .elfinder-cwd-filename {
    padding-left: 23px;
}

.elfinder-rtl .elfinder-cwd-view-list .elfinder-cwd-filename {
    padding-right: 23px;
}

/* premissions/symlink marker */
.elfinder-cwd-view-list .elfinder-perms,
.elfinder-cwd-view-list .elfinder-lock,
.elfinder-cwd-view-list .elfinder-symlink {
    margin-top: -6px;
    opacity: .6;
    filter: Alpha(Opacity=60);
}

.elfinder-cwd-view-list .elfinder-perms {
    bottom: -4px;
}

.elfinder-cwd-view-list .elfinder-lock {
    top: 0px;
}

.elfinder-cwd-view-list .elfinder-symlink {
    bottom: -4px;
}

/* markers in ltr/rtl enviroment */
.elfinder-ltr .elfinder-cwd-view-list .elfinder-perms {
    left: 8px;
}

.elfinder-rtl .elfinder-cwd-view-list .elfinder-perms {
    right: -8px;
}

.elfinder-ltr .elfinder-cwd-view-list .elfinder-lock {
    left: 10px;
}

.elfinder-rtl .elfinder-cwd-view-list .elfinder-lock {
    right: -10px;
}

.elfinder-ltr .elfinder-cwd-view-list .elfinder-symlink {
    left: -7px;
}

.elfinder-rtl .elfinder-cwd-view-list .elfinder-symlink {
    right: 7px;
}

/* file icon */
.elfinder-cwd-view-list td .elfinder-cwd-icon {
    width: 16px;
    height: 16px;
    position: absolute;
    top: 50%;
    margin-top: -8px;
    background-image: url(../img/icons-small.png);
}

/* icon in ltr/rtl enviroment */
.elfinder-ltr .elfinder-cwd-view-list .elfinder-cwd-icon {
    left: 0;
}

.elfinder-rtl .elfinder-cwd-view-list .elfinder-cwd-icon {
    right: 0;
}

/* type badge, thumbnail image overlay */
.elfinder-cwd-view-list .elfinder-cwd-icon:before,
.elfinder-cwd-view-list .elfinder-cwd-icon:after {
    content: none;
}

/* table header resize handle */
.elfinder-cwd-view-list thead td .ui-resizable-handle {
    height: 100%;
    top: 6px;
}

.elfinder-touch .elfinder-cwd-view-list thead td .ui-resizable-handle {
    top: -4px;
    margin: 10px;
}

.elfinder-cwd-view-list thead td .ui-resizable-e {
    right: -7px;
}

.elfinder-cwd-view-list thead td .ui-resizable-w {
    left: -7px;
}

.elfinder-touch .elfinder-cwd-view-list thead td .ui-resizable-e {
    right: -16px;
}

.elfinder-touch .elfinder-cwd-view-list thead td .ui-resizable-w {
    left: -16px;
}

/* empty message */
.elfinder-cwd-wrapper-empty .elfinder-cwd-view-list.elfinder-cwd:after {
    margin-top: 0;
}

/* overlay message board */
.elfinder-cwd-message-board {
    position: absolute;
    position: -webkit-sticky;
    position: sticky;
    width: 100%;
    height: calc(100% - 0.01px); /* for Firefox scroll problem */
    top: 0;
    left: 0;
    margin: 0;
    padding: 0;
    pointer-events: none;
    background-color: transparent;
}

/* overlay message board for trash */
.elfinder-cwd-wrapper-trash .elfinder-cwd-message-board {
    background-image: url(../img/trashmesh.png);
}

.elfinder-cwd-message-board .elfinder-cwd-trash {
    position: absolute;
    bottom: 0;
    font-size: 30px;
    width: 100%;
    text-align: right;
    display: none;
}

.elfinder-rtl .elfinder-cwd-message-board .elfinder-cwd-trash {
    text-align: left;
}

.elfinder-mobile .elfinder-cwd-message-board .elfinder-cwd-trash {
    font-size: 20px;
}

.elfinder-cwd-wrapper-trash .elfinder-cwd-message-board .elfinder-cwd-trash {
    display: block;
    opacity: .3;
}

/* overlay message board for expires */
.elfinder-cwd-message-board .elfinder-cwd-expires {
    position: absolute;
    bottom: 0;
    font-size: 24px;
    width: 100%;
    text-align: right;
    opacity: .25;
}

.elfinder-rtl .elfinder-cwd-message-board .elfinder-cwd-expires {
    text-align: left;
}

.elfinder-mobile .elfinder-cwd-message-board .elfinder-cwd-expires {
    font-size: 20px;
}

/* File: /css/dialog.css */
/*********************************************/
/*                DIALOGS STYLES             */
/*********************************************/

/* common dialogs class */
.std42-dialog {
    padding: 0;
    position: absolute;
    left: auto;
    right: auto;
    box-sizing: border-box;
}

.std42-dialog.elfinder-dialog-minimized {
    overFlow: hidden;
    position: relative;
    float: left;
    width: auto;
    cursor: pointer;
}

.elfinder-rtl .std42-dialog.elfinder-dialog-minimized {
    float: right;
}

.std42-dialog input {
    border: 1px solid;
}

/* titlebar */
.std42-dialog .ui-dialog-titlebar {
    border-left: 0 solid transparent;
    border-top: 0 solid transparent;
    border-right: 0 solid transparent;
    font-weight: normal;
    padding: .2em 1em;
}

.std42-dialog.elfinder-dialog-minimized .ui-dialog-titlebar {
    padding: 0 .5em;
    height: 20px;
}

.elfinder-touch .std42-dialog.elfinder-dialog-minimized .ui-dialog-titlebar {
    padding: .3em .5em;
}

.std42-dialog.ui-draggable-disabled .ui-dialog-titlebar {
    cursor: default;
}

.std42-dialog .ui-dialog-titlebar .ui-widget-header {
    border: none;
    cursor: pointer;
}

.std42-dialog .ui-dialog-titlebar span.elfinder-dialog-title {
    display: inherit;
    word-break: break-all;
}

.std42-dialog.elfinder-dialog-minimized .ui-dialog-titlebar span.elfinder-dialog-title {
    display: list-item;
    display: -moz-inline-box;
    white-space: nowrap;
    word-break: normal;
    overflow: hidden;
    word-wrap: normal;
    overflow-wrap: normal;
    max-width: -webkit-calc(100% - 24px);
    max-width: -moz-calc(100% - 24px);
    max-width: calc(100% - 24px);
}

.elfinder-touch .std42-dialog .ui-dialog-titlebar span.elfinder-dialog-title {
    padding-top: .15em;
}

.elfinder-touch .std42-dialog.elfinder-dialog-minimized .ui-dialog-titlebar span.elfinder-dialog-title {
    max-width: -webkit-calc(100% - 36px);
    max-width: -moz-calc(100% - 36px);
    max-width: calc(100% - 36px);
}

.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-button {
    position: relative;
    float: left;
    top: 10px;
    left: -10px;
    right: 10px;
    width: 20px;
    height: 20px;
    padding: 1px;
    margin: -10px 1px 0 1px;
    background-color: transparent;
    background-image: none;
}

.elfinder-touch .std42-dialog .ui-dialog-titlebar .elfinder-titlebar-button {
    -moz-transform: scale(1.2);
    zoom: 1.2;
    padding-left: 6px;
    padding-right: 6px;
    height: 24px;
}

.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-button-right {
    float: right;
}

.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-button.elfinder-titlebar-button-right {
    left: 10px;
    right: -10px;
}

.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-button .ui-icon {
    width: 17px;
    height: 17px;
    border-width: 1px;
    opacity: .7;
    filter: Alpha(Opacity=70);
    -moz-border-radius: 8px;
    -webkit-border-radius: 8px;
    border-radius: 8px;
}

.elfinder-mobile .std42-dialog .ui-dialog-titlebar .elfinder-titlebar-button .ui-icon {
    opacity: .5;
    filter: Alpha(Opacity=50);
}

.std42-dialog.elfinder-dialog-minimized .ui-dialog-titlebar .elfinder-titlebar-button .ui-icon {
    opacity: 1;
    filter: Alpha(Opacity=100);
}

.std42-dialog.elfinder-dialog-minimized .ui-dialog-titlebar select {
    display: none;
}

.elfinder-spinner {
    width: 14px;
    height: 14px;
    background: url("../img/spinner-mini.gif") center center no-repeat;
    margin: 0 5px;
    display: inline-block;
    vertical-align: middle;
}

.elfinder-ltr .elfinder-spinner,
.elfinder-ltr .elfinder-spinner-text {
    float: left;
}

.elfinder-rtl .elfinder-spinner,
.elfinder-rtl .elfinder-spinner-text  {
    float: right;
}



/* resize handle for touch devices */
.elfinder-touch .std42-dialog.ui-dialog:not(ui-resizable-disabled) .ui-resizable-se {
    width: 12px;
    height: 12px;
    -moz-transform-origin: bottom right;
    -moz-transform: scale(1.5);
    zoom: 1.5;
    right: -7px;
    bottom: -7px;
    margin: 3px 7px 7px 3px;
    background-position: -64px -224px;
}

.elfinder-rtl .elfinder-dialog .ui-dialog-titlebar {
    text-align: right;
}

/* content */
.std42-dialog .ui-dialog-content {
    padding: .3em .5em;
    box-sizing: border-box;
}

.elfinder .std42-dialog .ui-dialog-content,
.elfinder .std42-dialog .ui-dialog-content * {
    -webkit-user-select: auto;
    -moz-user-select: text;
    -khtml-user-select: text;
    user-select: text;
}

.elfinder .std42-dialog .ui-dialog-content label {
    border: none;
}

/* buttons */
.std42-dialog .ui-dialog-buttonpane {
    border: 0 solid;
    margin: 0;
    padding: .5em;
    text-align: right;
}

.elfinder-rtl .std42-dialog .ui-dialog-buttonpane {
    text-align: left;
}

.std42-dialog .ui-dialog-buttonpane button {
    margin: .2em 0 0 .4em;
    padding: .2em;
    outline: 0px solid;
}

.std42-dialog .ui-dialog-buttonpane button span {
    padding: 2px 9px;
}

.std42-dialog .ui-dialog-buttonpane button span.ui-icon {
    padding: 2px;
}

.elfinder-dialog .ui-resizable-e,
.elfinder-dialog .ui-resizable-s {
    width: 0;
    height: 0;
}

.std42-dialog .ui-button input {
    cursor: pointer;
}

.std42-dialog select {
    border: 1px solid #ccc;
}

/* error/notify/confirm dialogs icon */
.elfinder-dialog-icon {
    position: absolute;
    width: 32px;
    height: 32px;
    left: 10px;
    top: 50%;
    margin-top: -15px;
    background: url("../img/dialogs.png") 0 0 no-repeat;
}

.elfinder-rtl .elfinder-dialog-icon {
    left: auto;
    right: 10px;
}

/*********************** ERROR DIALOG **************************/

.elfinder-dialog-error .ui-dialog-content,
.elfinder-dialog-confirm .ui-dialog-content {
    padding-left: 56px;
    min-height: 35px;
}

.elfinder-rtl .elfinder-dialog-error .ui-dialog-content,
.elfinder-rtl .elfinder-dialog-confirm .ui-dialog-content {
    padding-left: 0;
    padding-right: 56px;
}

.elfinder-dialog-error .elfinder-err-var {
    word-break: break-all;
}

/*********************** NOTIFY DIALOG **************************/

.elfinder-dialog-notify {
    top : 36px;
    width : 280px;
}

.elfinder-ltr .elfinder-dialog-notify {
    right : 12px;
}

.elfinder-rtl .elfinder-dialog-notify {
    left : 12px;
}

.elfinder-dialog-notify .ui-dialog-titlebar {
    height: 5px;
}

.elfinder-dialog-notify .ui-dialog-titlebar-close {
    display: none;
}

.elfinder-dialog-notify .ui-dialog-content {
    padding: 0;
}

/* one notification container */
.elfinder-notify {
    border-bottom: 1px solid #ccc;
    position: relative;
    padding: .5em;

    text-align: center;
    overflow: hidden;
}

.elfinder-ltr .elfinder-notify {
    padding-left: 36px;
}

.elfinder-rtl .elfinder-notify {
    padding-right: 36px;
}

.elfinder-notify:last-child {
    border: 0 solid;
}

/* progressbar */
.elfinder-notify-progressbar {
    width: 180px;
    height: 8px;
    border: 1px solid #aaa;
    background: #f5f5f5;
    margin: 5px auto;
    overflow: hidden;
}

.elfinder-notify-progress {
    width: 100%;
    height: 8px;
    background: url(../img/progress.gif) center center repeat-x;
}

.elfinder-notify-progressbar, .elfinder-notify-progress {
    -moz-border-radius: 2px;
    -webkit-border-radius: 2px;
    border-radius: 2px;
}

/* icons */
.elfinder-dialog-icon-open,
.elfinder-dialog-icon-readdir,
.elfinder-dialog-icon-file {
    background-position: 0 -225px;
}

.elfinder-dialog-icon-reload {
    background-position: 0 -225px;
}

.elfinder-dialog-icon-mkdir {
    background-position: 0 -64px;
}

.elfinder-dialog-icon-mkfile {
    background-position: 0 -96px;
}

.elfinder-dialog-icon-copy,
.elfinder-dialog-icon-prepare,
.elfinder-dialog-icon-move {
    background-position: 0 -128px;
}

.elfinder-dialog-icon-upload {
    background-position: 0 -160px;
}

.elfinder-dialog-icon-chunkmerge {
    background-position: 0 -160px;
}

.elfinder-dialog-icon-rm {
    background-position: 0 -192px;
}

.elfinder-dialog-icon-download {
    background-position: 0 -260px;
}

.elfinder-dialog-icon-save {
    background-position: 0 -295px;
}

.elfinder-dialog-icon-rename,
.elfinder-dialog-icon-chkcontent {
    background-position: 0 -330px;
}

.elfinder-dialog-icon-zipdl,
.elfinder-dialog-icon-archive,
.elfinder-dialog-icon-extract {
    background-position: 0 -365px;
}

.elfinder-dialog-icon-search {
    background-position: 0 -402px;
}

.elfinder-dialog-icon-resize,
.elfinder-dialog-icon-loadimg,
.elfinder-dialog-icon-netmount,
.elfinder-dialog-icon-netunmount,
.elfinder-dialog-icon-chmod,
.elfinder-dialog-icon-preupload,
.elfinder-dialog-icon-url,
.elfinder-dialog-icon-dim {
    background-position: 0 -434px;
}

/*********************** CONFIRM DIALOG **************************/

.elfinder-dialog-confirm-applyall,
.elfinder-dialog-confirm-encoding {
    padding: 0 1em;
    margin: 0;
}

.elfinder-ltr .elfinder-dialog-confirm-applyall,
.elfinder-ltr .elfinder-dialog-confirm-encoding {
    text-align: left;
}

.elfinder-rtl .elfinder-dialog-confirm-applyall,
.elfinder-rtl .elfinder-dialog-confirm-encoding {
    text-align: right;
}

.elfinder-dialog-confirm .elfinder-dialog-icon {
    background-position: 0 -32px;
}

.elfinder-dialog-confirm .ui-dialog-buttonset {
    width: auto;
}

/*********************** FILE INFO DIALOG **************************/

.elfinder-info-title .elfinder-cwd-icon {
    float: left;
    width: 48px;
    height: 48px;
    margin-right: 1em;
}

.elfinder-rtl .elfinder-info-title .elfinder-cwd-icon {
    float: right;
    margin-right: 0;
    margin-left: 1em;
}

.elfinder-info-title strong {
    display: block;
    padding: .3em 0 .5em 0;
}

.elfinder-info-tb {
    min-width: 200px;
    border: 0 solid;
    margin: 1em .2em 1em .2em;
    width: 100%;
}

.elfinder-info-tb td {
    white-space: pre-wrap;
    padding: 2px;
}

.elfinder-info-tb td.elfinder-info-label {
    white-space: nowrap;
}

.elfinder-info-tb td.elfinder-info-hash {
    display: inline-block;
    word-break: break-all;
    max-width: 32ch;
}

.elfinder-ltr .elfinder-info-tb tr td:first-child {
    text-align: right;
}

.elfinder-ltr .elfinder-info-tb span {
    float: left;
}

.elfinder-rtl .elfinder-info-tb tr td:first-child {
    text-align: left;
}

.elfinder-rtl .elfinder-info-tb span {
    float: right;
}

.elfinder-info-tb a {
    outline: none;
    text-decoration: underline;
}

.elfinder-info-tb a:hover {
    text-decoration: none;
}

.elfinder-netmount-tb {
    margin: 0 auto;
}

.elfinder-netmount-tb select,
.elfinder-netmount-tb .elfinder-button-icon {
    cursor: pointer;
}

button.elfinder-info-button {
    margin: -3.5px 0;
    cursor: pointer;
}

/*********************** UPLOAD DIALOG **************************/

.elfinder-upload-dropbox {
    display: table-cell;
    text-align: center;
    vertical-align: middle;
    padding: 0.5em;
    border: 3px dashed #aaa;
    width: 9999px;
    height: 80px;
    overflow: hidden;
    word-break: keep-all;
}

.elfinder-upload-dropbox.ui-state-hover {
    background: #dfdfdf;
    border: 3px dashed #555;
}

.elfinder-upload-dialog-or {
    margin: .3em 0;
    text-align: center;
}

.elfinder-upload-dialog-wrapper {
    text-align: center;
}

.elfinder-upload-dialog-wrapper .ui-button {
    position: relative;
    overflow: hidden;
}

.elfinder-upload-dialog-wrapper .ui-button form {
    position: absolute;
    right: 0;
    top: 0;
    width: 100%;
    opacity: 0;
    filter: Alpha(Opacity=0);
}

.elfinder-upload-dialog-wrapper .ui-button form input {
    padding: 50px 0 0;
    font-size: 3em;
    width: 100%;
}

/* dialog for elFinder itself */
.dialogelfinder .dialogelfinder-drag {
    border-left: 0 solid;
    border-top: 0 solid;
    border-right: 0 solid;
    font-weight: normal;
    padding: 2px 12px;
    cursor: move;
    position: relative;
    text-align: left;
}

.elfinder-rtl .dialogelfinder-drag {
    text-align: right;
}

.dialogelfinder-drag-close {
    position: absolute;
    top: 50%;
    margin-top: -8px;
}

.elfinder-ltr .dialogelfinder-drag-close {
    right: 12px;
}

.elfinder-rtl .dialogelfinder-drag-close {
    left: 12px;
}

/*********************** RM CONFIRM **************************/
.elfinder-rm-title {
    margin-bottom: .5ex;
}

.elfinder-rm-title .elfinder-cwd-icon {
    float: left;
    width: 48px;
    height: 48px;
    margin-right: 1em;
}

.elfinder-rtl .elfinder-rm-title .elfinder-cwd-icon {
    float: right;
    margin-right: 0;
    margin-left: 1em;
}

.elfinder-rm-title strong {
    display: block;
    white-space: pre-wrap;
    word-break: normal;
    overflow: hidden;
    text-overflow: ellipsis;
}

.elfinder-rm-title + br {
    display: none;
}

/* File: /css/fonts.css */
.elfinder-font-mono {
    font-family: "Ricty Diminished", "Myrica M", Consolas, "Courier New", Courier, Monaco, monospace;
    font-size: 1.1em;
}

.elfinder-contextmenu .elfinder-contextmenu-item span {
    font-size: .72em;
}

.elfinder-cwd-view-icons .elfinder-cwd-filename {
    font-size: .7em;
}

.elfinder-cwd-view-list td {
    font-size: .7em;
}

.std42-dialog .ui-dialog-titlebar {
    font-size: .82em;
}

.std42-dialog .ui-dialog-content {
    font-size: .72em;
}

.std42-dialog .ui-dialog-buttonpane {
    font-size: .76em;
}

.elfinder-info-tb {
    font-size: .9em;
}

.elfinder-upload-dropbox {
    font-size: 1.2em;
}

.elfinder-upload-dialog-or {
    font-size: 1.2em;
}

.dialogelfinder .dialogelfinder-drag {
    font-size: .9em;
}

.elfinder .elfinder-navbar {
    font-size: .72em;
}

.elfinder-place-drag .elfinder-navbar-dir {
    font-size: .9em;
}

.elfinder-quicklook-title {
    font-size: .7em;
    font-weight: normal;
}

.elfinder-quicklook-info-data {
    font-size: .72em;
}

.elfinder-quicklook-preview-text-wrapper {
    font-size: .9em;
}

.elfinder-button-menu-item {
    font-size: .72em;
}

.elfinder-button-search input {
    font-size: .8em;
}

.elfinder-statusbar div {
    font-size: .7em;
}

.elfinder-drag-num {
    font-size: 12px;
}

.elfinder-toast {
    font-size: .76em;
}


/* File: /css/navbar.css */
/*********************************************/
/*              NAVIGATION PANEL             */
/*********************************************/

/* container */
.elfinder .elfinder-navbar {
    /*box-sizing: border-box;*/
    width: 230px;
    padding: 3px 5px;
    background-image: none;
    border-top: 0 solid;
    border-bottom: 0 solid;
    overflow: auto;
    position: relative;
}

.elfinder .elfinder-navdock {
    box-sizing: border-box;
    width: 230px;
    height: auto;
    position: absolute;
    bottom: 0;
    overflow: auto;
}

.elfinder-navdock .ui-resizable-n {
    top: 0;
    height: 20px;
}

/* ltr/rtl enviroment */
.elfinder-ltr .elfinder-navbar {
    float: left;
    border-left: 0 solid;
}

.elfinder-rtl .elfinder-navbar {
    float: right;
    border-right: 0 solid;
}

.elfinder-ltr .ui-resizable-e {
    margin-left: 10px;
}

/* folders tree container */
.elfinder-tree {
    display: table;
    width: 100%;
    margin: 0 0 .5em 0;
    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}

/* one folder wrapper */
.elfinder-navbar-wrapper, .elfinder-place-wrapper {
}

/* folder */
.elfinder-navbar-dir {
    position: relative;
    display: block;
    white-space: nowrap;
    padding: 3px 12px;
    margin: 0;
    outline: 0px solid;
    border: 1px solid transparent;
    cursor: default;
}

.elfinder-touch .elfinder-navbar-dir {
    padding: 12px 12px;
}

/* ltr/rtl enviroment */
.elfinder-ltr .elfinder-navbar-dir {
    padding-left: 35px;
}

.elfinder-rtl .elfinder-navbar-dir {
    padding-right: 35px;
}

/* arrow before icon */
.elfinder-navbar-arrow {
    width: 12px;
    height: 14px;
    position: absolute;
    display: none;
    top: 50%;
    margin-top: -8px;
    background-image: url("../img/arrows-normal.png");
    background-repeat: no-repeat;
}

.elfinder-ltr .elfinder-navbar-arrow {
    left: 0;
}

.elfinder-rtl .elfinder-navbar-arrow {
    right: 0;
}

.elfinder-touch .elfinder-navbar-arrow {
    -moz-transform-origin: top left;
    -moz-transform: scale(1.4);
    zoom: 1.4;
    margin-bottom: 7px;
}

.elfinder-ltr.elfinder-touch .elfinder-navbar-arrow {
    left: -3px;
    margin-right: 20px;
}

.elfinder-rtl.elfinder-touch .elfinder-navbar-arrow {
    right: -3px;
    margin-left: 20px;
}

.ui-state-active .elfinder-navbar-arrow {
    background-image: url("../img/arrows-active.png");
}

/* collapsed/expanded arrow view */
.elfinder-navbar-collapsed .elfinder-navbar-arrow {
    display: block;
}

.elfinder-subtree-chksubdir .elfinder-navbar-arrow {
    opacity: .25;
    filter: Alpha(Opacity=25);
}

/* arrow ltr/rtl enviroment */
.elfinder-ltr .elfinder-navbar-collapsed .elfinder-navbar-arrow {
    background-position: 0 4px;
}

.elfinder-rtl .elfinder-navbar-collapsed .elfinder-navbar-arrow {
    background-position: 0 -10px;
}

.elfinder-ltr .elfinder-navbar-expanded .elfinder-navbar-arrow,
.elfinder-rtl .elfinder-navbar-expanded .elfinder-navbar-arrow {
    background-position: 0 -21px;
}

/* folder icon */
.elfinder-navbar-icon {
    width: 16px;
    height: 16px;
    position: absolute;
    top: 50%;
    margin-top: -8px;
    background-image: url("../img/toolbar.png");
    background-repeat: no-repeat;
    background-position: 0 -16px;
}

/* ltr/rtl enviroment */
.elfinder-ltr .elfinder-navbar-icon {
    left: 14px;
}

.elfinder-rtl .elfinder-navbar-icon {
    right: 14px;
}

/* places icon */
.elfinder-places .elfinder-navbar-root .elfinder-navbar-icon {
    background-position: 0 -704px;
}

/* root folder */
.elfinder-tree .elfinder-navbar-root-local .elfinder-navbar-icon,
.elfinder-tree .elfinder-navbar-root-trash .elfinder-navbar-icon,
.elfinder-tree .elfinder-navbar-root-ftp .elfinder-navbar-icon,
.elfinder-tree .elfinder-navbar-root-sql .elfinder-navbar-icon,
.elfinder-tree .elfinder-navbar-root-dropbox .elfinder-navbar-icon,
.elfinder-tree .elfinder-navbar-root-googledrive .elfinder-navbar-icon,
.elfinder-tree .elfinder-navbar-root-onedrive .elfinder-navbar-icon,
.elfinder-tree .elfinder-navbar-root-box .elfinder-navbar-icon,
.elfinder-tree .elfinder-navbar-root-zip .elfinder-navbar-icon,
.elfinder-tree .elfinder-navbar-root-network .elfinder-navbar-icon {
    background-position: 0 0;
    background-size: contain;
}

/* root icon of each volume "\9" for IE8 trick */
.elfinder-tree .elfinder-navbar-root-local .elfinder-navbar-icon {
    background-image: url("../img/volume_icon_local.svg");
    background-image: url("../img/volume_icon_local.png") \9;
}

.elfinder-tree .elfinder-navbar-root-trash .elfinder-navbar-icon {
    background-image: url("../img/volume_icon_trash.svg");
    background-image: url("../img/volume_icon_trash.png") \9;
}

.elfinder-tree .elfinder-navbar-root-ftp .elfinder-navbar-icon {
    background-image: url("../img/volume_icon_ftp.svg");
    background-image: url("../img/volume_icon_ftp.png") \9;
}

.elfinder-tree .elfinder-navbar-root-sql .elfinder-navbar-icon {
    background-image: url("../img/volume_icon_sql.svg");
    background-image: url("../img/volume_icon_sql.png") \9;
}

.elfinder-tree .elfinder-navbar-root-dropbox .elfinder-navbar-icon {
    background-image: url("../img/volume_icon_dropbox.svg");
    background-image: url("../img/volume_icon_dropbox.png") \9;
}

.elfinder-tree .elfinder-navbar-root-googledrive .elfinder-navbar-icon {
    background-image: url("../img/volume_icon_googledrive.svg");
    background-image: url("../img/volume_icon_googledrive.png") \9;
}

.elfinder-tree .elfinder-navbar-root-onedrive .elfinder-navbar-icon {
    background-image: url("../img/volume_icon_onedrive.svg");
    background-image: url("../img/volume_icon_onedrive.png") \9;
}

.elfinder-tree .elfinder-navbar-root-box .elfinder-navbar-icon {
    background-image: url("../img/volume_icon_box.svg");
    background-image: url("../img/volume_icon_box.png") \9;
}

.elfinder-tree .elfinder-navbar-root-zip .elfinder-navbar-icon {
    background-image: url("../img/volume_icon_zip.svg");
    background-image: url("../img/volume_icon_zip.png") \9;
}

.elfinder-tree .elfinder-navbar-root-network .elfinder-navbar-icon {
    background-image: url("../img/volume_icon_network.svg");
    background-image: url("../img/volume_icon_network.png") \9;
}

/* icon in active/hove/dropactive state */
.ui-state-active .elfinder-navbar-icon,
.elfinder-droppable-active .elfinder-navbar-icon,
.ui-state-hover .elfinder-navbar-icon {
    background-position: 0 -32px;
}

/* ltr/rtl enviroment */
.elfinder-ltr .elfinder-navbar-subtree {
    margin-left: 12px;
}

.elfinder-rtl .elfinder-navbar-subtree {
    margin-right: 12px;
}

/* spinner */
.elfinder-tree .elfinder-spinner {
    position: absolute;
    top: 50%;
    margin: -7px 0 0;
}

/* spinner ltr/rtl enviroment */
.elfinder-ltr .elfinder-tree .elfinder-spinner {
    left: 0;
    margin-left: -2px;
}

.elfinder-rtl .elfinder-tree .elfinder-spinner {
    right: 0;
    margin-right: -2px;
}

/* marker */
.elfinder-navbar .elfinder-perms,
.elfinder-navbar .elfinder-lock,
.elfinder-navbar .elfinder-symlink {
    opacity: .6;
    filter: Alpha(Opacity=60);
}

/* permissions marker */
.elfinder-navbar .elfinder-perms {
    bottom: -1px;
    margin-top: -8px;
}

/* locked marker */
.elfinder-navbar .elfinder-lock {
    top: -2px;
}

/* permissions/symlink markers ltr/rtl enviroment */
.elfinder-ltr .elfinder-navbar .elfinder-perms {
    left: 20px;
    transform: scale(0.8);
}

.elfinder-rtl .elfinder-navbar .elfinder-perms {
    right: 20px;
    transform: scale(0.8);
}

.elfinder-ltr .elfinder-navbar .elfinder-lock {
    left: 20px;
    transform: scale(0.8);
}

.elfinder-rtl .elfinder-navbar .elfinder-lock {
    right: 20px;
    transform: scale(0.8);
}

.elfinder-ltr .elfinder-navbar .elfinder-symlink {
    left: 8px;
    transform: scale(0.8);
}

.elfinder-rtl .elfinder-navbar .elfinder-symlink {
    right: 8px;
    transform: scale(0.8);
}

/* navbar input */
.elfinder-navbar input {
    width: 100%;
    border: 0px solid;
    margin: 0;
    padding: 0;
}

/* resizable */
.elfinder-navbar .ui-resizable-handle {
    width: 12px;
    background: transparent url('../img/resize.png') center center no-repeat;
}

.elfinder-nav-handle-icon {
    position: absolute;
    top: 50%;
    margin: -8px 2px 0 2px;
    opacity: .5;
    filter: Alpha(Opacity=50);
}

/* pager button */
.elfinder-navbar-pager {
    width: 100%;
    box-sizing: border-box;
    padding-top: 3px;
    padding-bottom: 3px;
}

.elfinder-touch .elfinder-navbar-pager {
    padding-top: 10px;
    padding-bottom: 10px;
}

.elfinder-places {
    border: none;
    margin: 0;
    padding: 0;
}

/* navbar swipe handle */
.elfinder-navbar-swipe-handle {
    position: absolute;
    top: 0px;
    height: 100%;
    width: 50px;
    pointer-events: none;
}

.elfinder-ltr .elfinder-navbar-swipe-handle {
    left: 0px;
    background: linear-gradient(to right,
    rgba(221, 228, 235, 1) 0,
    rgba(221, 228, 235, 0.8) 5px,
    rgba(216, 223, 230, 0.3) 8px,
    rgba(0, 0, 0, 0.1) 95%,
    rgba(0, 0, 0, 0) 100%);
}

.elfinder-rtl .elfinder-navbar-swipe-handle {
    right: 0px;
    background: linear-gradient(to left,
    rgba(221, 228, 235, 1) 0,
    rgba(221, 228, 235, 0.8) 5px,
    rgba(216, 223, 230, 0.3) 8px,
    rgba(0, 0, 0, 0.1) 95%,
    rgba(0, 0, 0, 0) 100%);
}

/* File: /css/places.css */
/*********************************************/
/*               PLACES STYLES               */
/*********************************************/
/* root extra icon */
.elfinder-navbar-root .elfinder-places-root-icon {
    position: absolute;
    top: 50%;
    margin-top: -9px;
    cursor: pointer;
}

.elfinder-ltr .elfinder-places-root-icon {
    right: 10px;
}

.elfinder-rtl .elfinder-places-root-icon {
    left: 10px;
}

.elfinder-navbar-expanded .elfinder-places-root-icon {
    display: block;
}

/* dragging helper base */
.elfinder-place-drag {
    font-size: 0.8em;
}

/* File: /css/quicklook.css */
/* quicklook window */
.elfinder-quicklook {
    position: absolute;
    background: url("../img/quicklook-bg.png");
    overflow: hidden;
    -moz-border-radius: 7px;
    -webkit-border-radius: 7px;
    border-radius: 7px;
    padding: 20px 0 40px 0;
}

.elfinder-navdock .elfinder-quicklook {
    -moz-border-radius: 0;
    -webkit-border-radius: 0;
    border-radius: 0;
    font-size: 90%;
    overflow: auto;
}

.elfinder-quicklook.elfinder-touch {
    padding: 30px 0 40px 0;
}

.elfinder-quicklook .ui-resizable-se {
    width: 14px;
    height: 14px;
    right: 5px;
    bottom: 3px;
    background: url("../img/toolbar.png") 0 -496px no-repeat;
}

.elfinder-quicklook.elfinder-touch .ui-resizable-se {
    -moz-transform-origin: bottom right;
    -moz-transform: scale(1.5);
    zoom: 1.5;
}

/* quicklook fullscreen window */
.elfinder-quicklook.elfinder-quicklook-fullscreen {
    position: fixed;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    margin: 0;
    box-sizing: border-box;
    width: 100%;
    height: 100%;
    object-fit: contain;
    border-radius: 0;
    -moz-border-radius: 0;
    -webkit-border-radius: 0;
    -webkit-background-clip: padding-box;
    padding: 0;
    background: #000;
    display: block;
}

/* hide titlebar in fullscreen mode */
.elfinder-quicklook-fullscreen .elfinder-quicklook-titlebar,
.elfinder-quicklook-fullscreen.elfinder-quicklook .ui-resizable-handle {
    display: none;
}

/* hide preview border in fullscreen mode */
.elfinder-quicklook-fullscreen .elfinder-quicklook-preview {
    border: 0 solid;
}

.elfinder-quicklook-cover {
    width: 100%;
    height: 100%;
    top: 0;
    left: 0;
    position: absolute;
}

.elfinder-quicklook-cover.elfinder-quicklook-coverbg {
    /* background need to catch mouse event over browser plugin (eg PDF preview) */
    background-color: #fff;
    opacity: 0.000001;
    filter: Alpha(Opacity=0.0001);
}

/* quicklook titlebar */
.elfinder-quicklook-titlebar {
    text-align: center;
    background: #777;
    position: absolute;
    left: 0;
    top: 0;
    width: 100%;
    height: 20px;
    -moz-border-radius-topleft: 7px;
    -webkit-border-top-left-radius: 7px;
    border-top-left-radius: 7px;
    -moz-border-radius-topright: 7px;
    -webkit-border-top-right-radius: 7px;
    border-top-right-radius: 7px;
    border: none;
    line-height: 1.2;
}

.elfinder-navdock .elfinder-quicklook-titlebar {
    -moz-border-radius-topleft: 0;
    -webkit-border-top-left-radius: 0;
    border-top-left-radius: 0;
    -moz-border-radius-topright: 0;
    -webkit-border-top-right-radius: 0;
    border-top-right-radius: 0;
    cursor: default;
}

.elfinder-touch .elfinder-quicklook-titlebar {
    height: 30px;
}

/* window title */
.elfinder-quicklook-title {
    display: inline-block;
    white-space: nowrap;
    overflow: hidden;
}

.elfinder-touch .elfinder-quicklook-title {
    padding: 8px 0;
}

/* icon "close" in titlebar */
.elfinder-quicklook-titlebar-icon {
    position: absolute;
    left: 4px;
    top: 50%;
    margin-top: -8px;
    height: 16px;
    border: none;
}
.elfinder-touch .elfinder-quicklook-titlebar-icon {
    height: 22px;
}

.elfinder-quicklook-titlebar-icon .ui-icon {
    position: relative;
    margin: -9px 3px 0px 0px;
    cursor: pointer;
    border-radius: 10px;
    border: 1px solid;
    opacity: .7;
    filter: Alpha(Opacity=70);
}

.elfinder-quicklook-titlebar-icon .ui-icon.ui-icon-closethick {
    padding-left: 1px;
}

.elfinder-mobile .elfinder-quicklook-titlebar-icon .ui-icon {
    opacity: .6;
    filter: Alpha(Opacity=60);
}

.elfinder-touch .elfinder-quicklook-titlebar-icon .ui-icon {
    margin-top: -5px;
}

.elfinder-quicklook-titlebar-icon.elfinder-titlebar-button-right {
    left: auto;
    right: 4px;
    direction: rtl;
}

.elfinder-quicklook-titlebar-icon.elfinder-titlebar-button-right .ui-icon {
    margin: -9px 0px 0px 3px;
}

.elfinder-touch .elfinder-quicklook-titlebar .ui-icon {
    -moz-transform-origin: center center;
    -moz-transform: scale(1.2);
    zoom: 1.2;
}

.elfinder-touch .elfinder-quicklook-titlebar-icon .ui-icon {
    margin-right: 10px;
}

.elfinder-touch .elfinder-quicklook-titlebar-icon.elfinder-titlebar-button-right .ui-icon {
    margin-left: 10px;
}

/* main part of quicklook window */
.elfinder-quicklook-preview {
    overflow: hidden;
    position: relative;
    border: 0 solid;
    border-left: 1px solid transparent;
    border-right: 1px solid transparent;
    height: 100%;
}

.elfinder-navdock .elfinder-quicklook-preview {
    border-left: 0;
    border-right: 0;
}

.elfinder-quicklook-preview.elfinder-overflow-auto {
    overflow: auto;
    -webkit-overflow-scrolling: touch;
}

/* wrapper for file info/icon */
.elfinder-quicklook-info-wrapper {
    display: table;
    position: absolute;
    width: 100%;
    height: 100%;
    height: calc(100% - 80px);
    left: 0;
    top: 20px;
}

.elfinder-navdock .elfinder-quicklook-info-wrapper {
    height: calc(100% - 20px);
}

/* file info */
.elfinder-quicklook-info {
    display: table-cell;
    vertical-align: middle;
}

.elfinder-ltr .elfinder-quicklook-info {
    padding: 0 12px 0 112px;
}

.elfinder-rtl .elfinder-quicklook-info {
    padding: 0 112px 0 12px;
}

.elfinder-ltr .elfinder-navdock .elfinder-quicklook-info {
    padding: 0 0 0 80px;
}

.elfinder-rtl .elfinder-navdock .elfinder-quicklook-info {
    padding: 0 80px 0 0;
}

/* file name in info */
.elfinder-quicklook-info .elfinder-quicklook-info-data:first-child {
    color: #fff;
    font-weight: bold;
    padding-bottom: .5em;
}

/* other data in info */
.elfinder-quicklook-info-data {
    clear: both;
    padding-bottom: .2em;
    color: #fff;
}

/* file icon */
.elfinder-quicklook .elfinder-cwd-icon {
    position: absolute;
    left: 32px;
    top: 50%;
    margin-top: -20px;
}

.elfinder-navdock .elfinder-quicklook .elfinder-cwd-icon {
    left: 16px;
}

.elfinder-rtl .elfinder-quicklook .elfinder-cwd-icon {
    left: auto;
    right: 32px;
}

.elfinder-rtl .elfinder-navdock .elfinder-quicklook .elfinder-cwd-icon {
    right: 6px;
}

.elfinder-quicklook .elfinder-cwd-icon:before {
    top: -10px;
}

.elfinder-ltr .elfinder-quicklook .elfinder-cwd-icon:before {
    left: -20px;
}

.elfinder-ltr .elfinder-navdock .elfinder-quicklook .elfinder-cwd-icon:before {
    left: -14px;
}

.elfinder-ltr .elfinder-quicklook .elfinder-cwd-icon:after {
    left: -20px;
}

.elfinder-ltr .elfinder-navdock .elfinder-quicklook .elfinder-cwd-icon:after {
    left: -12px;
}

.elfinder-rtl .elfinder-quicklook .elfinder-cwd-icon:before {
    left: auto;
    right: 40px;
}

.elfinder-rtl .elfinder-quicklook .elfinder-cwd-icon:after {
    left: auto;
    right: 46px;
}

/* image in preview */
.elfinder-quicklook-preview img {
    display: block;
    margin: 0 auto;
}

/* navigation bar on quicklook window bottom */
.elfinder-quicklook-navbar {
    position: absolute;
    left: 50%;
    bottom: 4px;
    width: 140px;
    height: 32px;
    padding: 0px;
    margin-left: -70px;
    border: 1px solid transparent;
    border-radius: 19px;
    -moz-border-radius: 19px;
    -webkit-border-radius: 19px;
}

/* navigation bar in fullscreen mode */
.elfinder-quicklook-fullscreen .elfinder-quicklook-navbar {
    width: 188px;
    margin-left: -94px;
    padding: 5px;
    border: 1px solid #eee;
    background: #000;
    opacity: 0.4;
    filter: Alpha(Opacity=40);
}

/* show close icon in fullscreen mode */
.elfinder-quicklook-fullscreen .elfinder-quicklook-navbar-icon-close,
.elfinder-quicklook-fullscreen .elfinder-quicklook-navbar-separator {
    display: inline;
}

/* icons in navbar */
.elfinder-quicklook-navbar-icon {
    width: 32px;
    height: 32px;
    margin: 0 7px;
    float: left;
    background: url("../img/quicklook-icons.png") 0 0 no-repeat;

}

/* fullscreen icon */
.elfinder-quicklook-navbar-icon-fullscreen {
    background-position: 0 -64px;
}

/* exit fullscreen icon */
.elfinder-quicklook-navbar-icon-fullscreen-off {
    background-position: 0 -96px;
}

/* prev file icon */
.elfinder-quicklook-navbar-icon-prev {
    background-position: 0 0;
}

/* next file icon */
.elfinder-quicklook-navbar-icon-next {
    background-position: 0 -32px;
}

/* close icon */
.elfinder-quicklook-navbar-icon-close {
    background-position: 0 -128px;
    display: none;
}

/* icons separator */
.elfinder-quicklook-navbar-separator {
    width: 1px;
    height: 32px;
    float: left;
    border-left: 1px solid #fff;
    display: none;
}

/* text files preview wrapper */
.elfinder-quicklook-preview-text-wrapper {
    width: 100%;
    height: 100%;
    background: #fff;
    color: #222;
    overflow: auto;
    -webkit-overflow-scrolling: touch;
}

/* archive files preview wrapper */
.elfinder-quicklook-preview-archive-wrapper {
    width: 100%;
    height: 100%;
    background: #fff;
    color: #222;
    font-size: 90%;
    overflow: auto;
    -webkit-overflow-scrolling: touch
}

/* archive files preview header */
.elfinder-quicklook-preview-archive-wrapper strong {
    padding: 0 5px;
}

/* text preview */
pre.elfinder-quicklook-preview-text,
pre.elfinder-quicklook-preview-text.prettyprint {
    width: auto;
    height: auto;
    margin: 0;
    padding: 3px 9px;
    border: none;
    -o-tab-size: 4;
    -moz-tab-size: 4;
    tab-size: 4;
}

.elfinder-quicklook-preview-charsleft hr {
    border: none;
    border-top: dashed 1px;
}

.elfinder-quicklook-preview-charsleft span {
    font-size: 90%;
    font-style: italic;
    cursor: pointer;
}

/* html/pdf preview */
.elfinder-quicklook-preview-html,
.elfinder-quicklook-preview-pdf,
.elfinder-quicklook-preview-iframe {
    width: 100%;
    height: 100%;
    background: #fff;
    margin: 0;
    border: none;
    display: block;
}

/* swf preview container */
.elfinder-quicklook-preview-flash {
    width: 100%;
    height: 100%;
}

/* audio preview container */
.elfinder-quicklook-preview-audio {
    width: 100%;
    position: absolute;
    bottom: 0;
    left: 0;
}

/* audio preview using embed */
embed.elfinder-quicklook-preview-audio {
    height: 30px;
    background: transparent;
}

/* video preview container */
.elfinder-quicklook-preview-video {
    width: 100%;
    height: 100%;
}

/* allow user select */
.elfinder .elfinder-quicklook .elfinder-quicklook-info *,
.elfinder .elfinder-quicklook .elfinder-quicklook-preview * {
    -webkit-user-select: auto;
    -moz-user-select: text;
    -khtml-user-select: text;
    user-select: text;
}

/* File: /css/statusbar.css */
/******************************************************************/
/*                           STATUSBAR STYLES                     */
/******************************************************************/

/* statusbar container */
.elfinder-statusbar {
    display: flex;
    justify-content: space-between;
    cursor: default;
    text-align: center;
    font-weight: normal;
    padding: .2em .5em;
    border-right: 0 solid transparent;
    border-bottom: 0 solid transparent;
    border-left: 0 solid transparent;
}

.elfinder-statusbar:before,
.elfinder-statusbar:after {
    display: none;
}

.elfinder-statusbar span {
    vertical-align: bottom;
    overflow: hidden;
    text-overflow: ellipsis;
    -o-text-overflow: ellipsis;
}

.elfinder-statusbar span.elfinder-path-other {
    flex-shrink: 0;
    text-overflow: clip;
    -o-text-overflow: clip;
}

.elfinder-statusbar span.ui-state-hover,
.elfinder-statusbar span.ui-state-active {
    border: none;
}

.elfinder-statusbar span.elfinder-path-cwd {
    cursor: default;
}

/* path in statusbar */
.elfinder-path {
    display: flex;
    order: 1;
    flex-grow: 1;
    cursor: pointer;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    -o-text-overflow: ellipsis;
    max-width: 30%\9;
}

.elfinder-ltr .elfinder-path {
    text-align: left;
    float: left\9;
}

.elfinder-rtl .elfinder-path {
    text-align: right;
    float: right\9;
}

/* path in workzone (case of swipe to navbar close) */
.elfinder-workzone-path {
    position: relative;
}

.elfinder-workzone-path .elfinder-path {
    position: relative;
    font-size: .75em;
    font-weight: normal;
    float: none;
    max-width: none;
    overflow: hidden;
    overflow-x: hidden;
    text-overflow: initial;
    -o-text-overflow: initial;
}

.elfinder-mobile .elfinder-workzone-path .elfinder-path {
    overflow: auto;
    overflow-x: scroll;
}

.elfinder-ltr .elfinder-workzone-path .elfinder-path {
    margin-left: 24px;
}

.elfinder-rtl .elfinder-workzone-path .elfinder-path {
    margin-right: 24px;
}

.elfinder-workzone-path .elfinder-path span {
    display: inline-block;
    padding: 5px 3px;
}

.elfinder-workzone-path .elfinder-path span.elfinder-path-cwd {
    font-weight: bold;
}

.elfinder-workzone-path .elfinder-path span.ui-state-hover,
.elfinder-workzone-path .elfinder-path span.ui-state-active {
    border: none;
}

.elfinder-workzone-path .elfinder-path-roots {
    position: absolute;
    top: 0;
    width: 24px;
    height: 20px;
    padding: 2px;
    border: none;
    overflow: hidden;
}

.elfinder-ltr .elfinder-workzone-path .elfinder-path-roots {
    left: 0;
}

.elfinder-rtl .elfinder-workzone-path .elfinder-path-roots {
    right: 0;
}

/* total/selected size in statusbar */
.elfinder-stat-size {
    order: 3;
    flex-grow: 1;
    overflow: hidden;
    white-space: nowrap;
}

.elfinder-ltr .elfinder-stat-size {
    text-align: right;
    float: right\9;
}

.elfinder-rtl .elfinder-stat-size {
    text-align: left;
    float: left\9;
}

/* info of current selected item */
.elfinder-stat-selected {
    order: 2;
    margin: 0 .5em;
    white-space: nowrap;
    overflow: hidden;
}

/* File: /css/toast.css */
/*
 * CSS for Toastr
 * Copyright 2012-2015
 * Authors: John Papa, Hans Fjällemark, and Tim Ferrell.
 * All Rights Reserved.
 * Use, reproduction, distribution, and modification of this code is subject to the terms and
 * conditions of the MIT license, available at http://www.opensource.org/licenses/mit-license.php
 *
 * ARIA Support: Greta Krafsig
 *
 * Project: https://github.com/CodeSeven/toastr
 */

.elfinder .elfinder-toast {
    position: absolute;
    top: 12px;
    right: 12px;
    max-width: 90%;
    cursor: default;
}

.elfinder .elfinder-toast > div {
    position: relative;
    pointer-events: auto;
    overflow: hidden;
    margin: 0 0 6px;
    padding: 8px 16px 8px 50px;
    -moz-border-radius: 3px 3px 3px 3px;
    -webkit-border-radius: 3px 3px 3px 3px;
    border-radius: 3px 3px 3px 3px;
    background-position: 15px center;
    background-repeat: no-repeat;
    -moz-box-shadow: 0 0 12px #999999;
    -webkit-box-shadow: 0 0 12px #999999;
    box-shadow: 0 0 12px #999999;
    color: #FFFFFF;
    opacity: 0.9;
    filter: alpha(opacity=90);
    background-color: #030303;
    text-align: center;
}

.elfinder .elfinder-toast > .toast-info {
    background-color: #2F96B4;
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=") !important;
}

.elfinder .elfinder-toast > .toast-error {
    background-color: #BD362F;
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=") !important;
}

.elfinder .elfinder-toast > .toast-success {
    background-color: #51A351;
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==") !important;
}

.elfinder .elfinder-toast > .toast-warning {
    background-color: #F89406;
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=") !important;
}

.elfinder .elfinder-toast > div button.ui-button {
    background-image: none;
    margin-top: 8px;
    padding: .5em .8em;
}

.elfinder .elfinder-toast > .toast-success button.ui-button {
    background-color: green;
    color: #FFF;
}

.elfinder .elfinder-toast > .toast-success button.ui-button.ui-state-hover {
    background-color: #add6ad;
    color: #254b25;
}

.elfinder .elfinder-toast > .toast-info button.ui-button {
    background-color: #046580;
    color: #FFF;
}

.elfinder .elfinder-toast > .toast-info button.ui-button.ui-state-hover {
    background-color: #7DC6DB;
    color: #046580;
}

.elfinder .elfinder-toast > .toast-warning button.ui-button {
    background-color: #dd8c1a;
    color: #FFF;
}

.elfinder .elfinder-toast > .toast-warning button.ui-button.ui-state-hover {
    background-color: #e7ae5e;
    color: #422a07;
}

/* File: /css/toolbar.css */
/*********************************************/
/*               TOOLBAR STYLES              */
/*********************************************/
/* toolbar container */
.elfinder-toolbar {
    padding: 4px 0 3px 0;
    border-left: 0 solid transparent;
    border-top: 0 solid transparent;
    border-right: 0 solid transparent;
    max-height: 50%;
    overflow-y: auto;
}

/* container for button's group */
.elfinder-buttonset {
    margin: 1px 4px;
    float: left;
    background: transparent;
    padding: 0;
    overflow: hidden;
}

/*.elfinder-buttonset:first-child { margin:0; }*/

/* button */
.elfinder .elfinder-button {
    min-width: 16px;
    height: 16px;
    margin: 0;
    padding: 4px;
    float: left;
    overflow: hidden;
    position: relative;
    border: 0 solid;
    -webkit-box-sizing: content-box;
    -moz-box-sizing: content-box;
    box-sizing: content-box;
    line-height: 1;
    cursor: default;
}

.elfinder-rtl .elfinder-button {
    float: right;
}

.elfinder-touch .elfinder-button {
    min-width: 20px;
    height: 20px;
}

.elfinder .ui-icon-search {
    cursor: pointer;
}

/* separator between buttons, required for berder between button with ui color */
.elfinder-toolbar-button-separator {
    float: left;
    padding: 0;
    height: 24px;
    border-top: 0 solid;
    border-right: 0 solid;
    border-bottom: 0 solid;
    width: 0;
}

.elfinder-rtl .elfinder-toolbar-button-separator {
    float: right;
}

.elfinder-touch .elfinder-toolbar-button-separator {
    height: 28px;
}

/* change icon opacity^ not button */
.elfinder .elfinder-button.ui-state-disabled {
    opacity: 1;
    filter: Alpha(Opacity=100);
}

.elfinder .elfinder-button.ui-state-disabled .elfinder-button-icon,
.elfinder .elfinder-button.ui-state-disabled .elfinder-button-text {
    opacity: .4;
    filter: Alpha(Opacity=40);
}

/* rtl enviroment */
.elfinder-rtl .elfinder-buttonset {
    float: right;
}

/* icon inside button */
.elfinder-button-icon {
    width: 16px;
    height: 16px;
    display: inline-block;
    background: url('../img/toolbar.png') no-repeat;
}

.elfinder-button-text {
    position: relative;
    display: inline-block;
    top: -4px;
    margin: 0 2px;
    font-size: 12px;
}

.elfinder-touch .elfinder-button-icon {
    -moz-transform-origin: top left;
    -moz-transform: scale(1.25);
    zoom: 1.25;
}

.elfinder-touch .elfinder-button-text {
    -moz-transform: translate(3px, 3px);
    top: -5px;
}

/* buttons icons */
.elfinder-button-icon-home {
    background-position: 0 0;
}

.elfinder-button-icon-back {
    background-position: 0 -112px;
}

.elfinder-button-icon-forward {
    background-position: 0 -128px;
}

.elfinder-button-icon-up {
    background-position: 0 -144px;
}

.elfinder-button-icon-dir {
    background-position: 0 -16px;
}

.elfinder-button-icon-opendir {
    background-position: 0 -32px;
}

.elfinder-button-icon-reload {
    background-position: 0 -160px;
}

.elfinder-button-icon-open {
    background-position: 0 -176px;
}

.elfinder-button-icon-mkdir {
    background-position: 0 -192px;
}

.elfinder-button-icon-mkfile {
    background-position: 0 -208px;
}

.elfinder-button-icon-rm {
    background-position: 0 -832px;
}

.elfinder-button-icon-trash {
    background-position: 0 -224px;
}

.elfinder-button-icon-restore {
    background-position: 0 -816px;
}

.elfinder-button-icon-copy {
    background-position: 0 -240px;
}

.elfinder-button-icon-cut {
    background-position: 0 -256px;
}

.elfinder-button-icon-paste {
    background-position: 0 -272px;
}

.elfinder-button-icon-getfile {
    background-position: 0 -288px;
}

.elfinder-button-icon-duplicate {
    background-position: 0 -304px;
}

.elfinder-button-icon-rename {
    background-position: 0 -320px;
}

.elfinder-button-icon-edit {
    background-position: 0 -336px;
}

.elfinder-button-icon-quicklook {
    background-position: 0 -352px;
}

.elfinder-button-icon-upload {
    background-position: 0 -368px;
}

.elfinder-button-icon-download {
    background-position: 0 -384px;
}

.elfinder-button-icon-info {
    background-position: 0 -400px;
}

.elfinder-button-icon-extract {
    background-position: 0 -416px;
}

.elfinder-button-icon-archive {
    background-position: 0 -432px;
}

.elfinder-button-icon-view {
    background-position: 0 -448px;
}

.elfinder-button-icon-view-list {
    background-position: 0 -464px;
}

.elfinder-button-icon-help {
    background-position: 0 -480px;
}

.elfinder-button-icon-resize {
    background-position: 0 -512px;
}

.elfinder-button-icon-link {
    background-position: 0 -528px;
}

.elfinder-button-icon-search {
    background-position: 0 -561px;
}

.elfinder-button-icon-sort {
    background-position: 0 -577px;
}

.elfinder-button-icon-rotate-r {
    background-position: 0 -625px;
}

.elfinder-button-icon-rotate-l {
    background-position: 0 -641px;
}

.elfinder-button-icon-netmount {
    background-position: 0 -688px;
}

.elfinder-button-icon-netunmount {
    background-position: 0 -96px;
}

.elfinder-button-icon-places {
    background-position: 0 -704px;
}

.elfinder-button-icon-chmod {
    background-position: 0 -48px;
}

.elfinder-button-icon-accept {
    background-position: 0 -736px;
}

.elfinder-button-icon-menu {
    background-position: 0 -752px;
}

.elfinder-button-icon-colwidth {
    background-position: 0 -768px;
}

.elfinder-button-icon-fullscreen {
    background-position: 0 -784px;
}

.elfinder-button-icon-unfullscreen {
    background-position: 0 -800px;
}

.elfinder-button-icon-empty {
    background-position: 0 -848px;
}

.elfinder-button-icon-undo {
    background-position: 0 -864px;
}

.elfinder-button-icon-redo {
    background-position: 0 -880px;
}

.elfinder-button-icon-preference {
    background-position: 0 -896px;
}

.elfinder-button-icon-mkdirin {
    background-position: 0 -912px;
}

.elfinder-button-icon-selectall {
    background-position: 0 -928px;
}

.elfinder-button-icon-selectnone {
    background-position: 0 -944px;
}

.elfinder-button-icon-selectinvert {
    background-position: 0 -960px;
}

.elfinder-button-icon-opennew {
    background-position: 0 -976px;
}

.elfinder-button-icon-hide {
    background-position: 0 -992px;
}

.elfinder-button-icon-text {
    background-position: 0 -1008px;
}

/* button icon mirroring for rtl */
.elfinder-rtl .elfinder-button-icon-back,
.elfinder-rtl .elfinder-button-icon-forward,
.elfinder-rtl .elfinder-button-icon-getfile,
.elfinder-rtl .elfinder-button-icon-help,
.elfinder-rtl .elfinder-button-icon-redo,
.elfinder-rtl .elfinder-button-icon-rename,
.elfinder-rtl .elfinder-button-icon-search,
.elfinder-rtl .elfinder-button-icon-undo,
.elfinder-rtl .elfinder-button-icon-view-list,
.elfinder-rtl .ui-icon-search {
    -ms-transform: scale(-1, 1);
    -webkit-transform: scale(-1, 1);
    transform: scale(-1, 1);
}

/* button with dropdown menu*/
.elfinder .elfinder-menubutton {
    overflow: visible;
}

/* button with spinner icon */
.elfinder-button-icon-spinner {
    background: url("../img/spinner-mini.gif") center center no-repeat;
}

/* menu */
.elfinder-button-menu {
    position: absolute;
    margin-top: 24px;
    padding: 3px 0;
    overflow-y: auto;
}

.elfinder-touch .elfinder-button-menu {
    margin-top: 30px;
}

/* menu item */
.elfinder-button-menu-item {
    white-space: nowrap;
    cursor: default;
    padding: 5px 19px;
    position: relative;
}

.elfinder-touch .elfinder-button-menu-item {
    padding: 12px 19px
}

/* fix hover ui class */
.elfinder-button-menu .ui-state-hover {
    border: 0 solid;
}

.elfinder-button-menu-item-separated {
    border-top: 1px solid #ccc;
}

.elfinder-button-menu-item .ui-icon {
    width: 16px;
    height: 16px;
    position: absolute;
    left: 2px;
    top: 50%;
    margin-top: -8px;
    display: none;
}

.elfinder-button-menu-item-selected .ui-icon {
    display: block;
}

.elfinder-button-menu-item-selected-asc .ui-icon-arrowthick-1-s {
    display: none;
}

.elfinder-button-menu-item-selected-desc .ui-icon-arrowthick-1-n {
    display: none;
}

/* hack for upload button */
.elfinder-button form {
    position: absolute;
    top: 0;
    right: 0;
    opacity: 0;
    filter: Alpha(Opacity=0);
    cursor: pointer;
}

.elfinder .elfinder-button form input {
    background: transparent;
    cursor: default;
}

/* search "button" */
.elfinder .elfinder-button-search {
    border: 0 solid;
    background: transparent;
    padding: 0;
    margin: 1px 4px;
    height: auto;
    min-height: 26px;
    width: 70px;
    overflow: visible;
}

.elfinder .elfinder-button-search.ui-state-active {
    width: 220px;
}

/* search "pull down menu" */
.elfinder .elfinder-button-search-menu {
    font-size: 8pt;
    text-align: center;
    width: auto;
    min-width: 180px;
    position: absolute;
    top: 30px;
    padding-right: 5px;
    padding-left: 5px;
}

.elfinder-ltr .elfinder-button-search-menu {
    right: 22px;
    left: auto;
}

.elfinder-rtl .elfinder-button-search-menu {
    right: auto;
    left: 22px;
}

.elfinder-touch .elfinder-button-search-menu {
    top: 34px;
}

.elfinder .elfinder-button-search-menu div {
    margin-left: auto;
    margin-right: auto;
    margin-top: 5px;
    margin-bottom: 5px;
    display: table;
}

.elfinder .elfinder-button-search-menu div .ui-state-hover {
    border: 1px solid;
}

/* ltr/rte enviroment */
.elfinder-ltr .elfinder-button-search {
    float: right;
    margin-right: 10px;
}

.elfinder-rtl .elfinder-button-search {
    float: left;
    margin-left: 10px;
}

.elfinder-rtl .ui-controlgroup > .ui-controlgroup-item {
    float: right;
}

/* search text field */
.elfinder-button-search input[type=text] {
    box-sizing: border-box;
    width: 100%;
    height: 26px;
    padding: 0 20px;
    line-height: 22px;
    border: 0 solid;
    border: 1px solid #aaa;
    -moz-border-radius: 12px;
    -webkit-border-radius: 12px;
    border-radius: 12px;
    outline: 0px solid;
}

.elfinder-button-search input::-ms-clear {
    display: none;
}

.elfinder-touch .elfinder-button-search input {
    height: 30px;
    line-height: 28px;
}

.elfinder-rtl .elfinder-button-search input {
    direction: rtl;
}

/* icons */
.elfinder-button-search .ui-icon {
    position: absolute;
    height: 18px;
    top: 50%;
    margin: -8px 4px 0 4px;
    opacity: .6;
    filter: Alpha(Opacity=60);
}

.elfinder-button-search-menu .ui-checkboxradio-icon {
    display: none;
}

/* search/close icons */
.elfinder-ltr .elfinder-button-search .ui-icon-search {
    left: 0;
}

.elfinder-rtl .elfinder-button-search .ui-icon-search {
    right: 0;
}

.elfinder-ltr .elfinder-button-search .ui-icon-close {
    right: 0;
}

.elfinder-rtl .elfinder-button-search .ui-icon-close {
    left: 0;
}

/* toolbar swipe handle */
.elfinder-toolbar-swipe-handle {
    position: absolute;
    top: 0px;
    left: 0px;
    height: 50px;
    width: 100%;
    pointer-events: none;
    background: linear-gradient(to bottom,
    rgba(221, 228, 235, 1) 0,
    rgba(221, 228, 235, 0.8) 2px,
    rgba(216, 223, 230, 0.3) 5px,
    rgba(0, 0, 0, 0.1) 95%,
    rgba(0, 0, 0, 0) 100%);
}

css/theme.css000064400000032707151215013440007155 0ustar00/**
 * MacOS X like theme for elFinder.
 * Required jquery ui "smoothness" theme.
 *
 * @author Dmitry (dio) Levashov
 **/

/* scrollbar for Chrome and Safari */
.elfinder:not(.elfinder-mobile) *::-webkit-scrollbar {
    width: 10px;
    height: 10px;
}

.elfinder:not(.elfinder-mobile) *::-webkit-scrollbar-track {
    border-radius: 10px;
    box-shadow: inset 0 0 6px rgba(0, 0, 0, .1);
}

.elfinder:not(.elfinder-mobile) *::-webkit-scrollbar-thumb {
    background-color: rgba(0, 0, 50, 0.08);
    border-radius: 10px;
    box-shadow:0 0 0 1px rgba(255, 255, 255, .3);
}

.elfinder:not(.elfinder-mobile) *::-webkit-scrollbar-thumb:hover {
    background-color: rgba(0, 0, 50, 0.16);
}

.elfinder:not(.elfinder-mobile) *::-webkit-scrollbar-thumb:active {
    background-color: rgba(0, 0, 50, 0.24);
}

.elfinder:not(.elfinder-mobile) *::-webkit-scrollbar-corner {
    background-color: transparent;
}

.elfinder:not(.elfinder-mobile) *::-webkit-scrollbar-button {
    background-color: transparent;
    width: 10px;
    height: 10px;
    border: 5px solid transparent;
}

.elfinder:not(.elfinder-mobile) *::-webkit-scrollbar-button:hover {
    border: 5px solid rgba(0, 0, 50, 0.08);
}

.elfinder:not(.elfinder-mobile) *::-webkit-scrollbar-button:active {
    border: 5px solid rgba(0, 0, 50, 0.5);
}

.elfinder:not(.elfinder-mobile) *::-webkit-scrollbar-button:single-button:vertical:decrement {
    border-bottom: 8px solid rgba(0, 0, 50, 0.3);
}

.elfinder:not(.elfinder-mobile) *::-webkit-scrollbar-button:single-button:vertical:increment {
    border-top: 8px solid rgba(0, 0, 50, 0.3);
}

.elfinder:not(.elfinder-mobile) *::-webkit-scrollbar-button:single-button:horizontal:decrement {
    border-right: 8px solid rgba(0, 0, 50, 0.3);
}

.elfinder:not(.elfinder-mobile) *::-webkit-scrollbar-button:single-button:horizontal:increment {
    border-left: 8px solid rgba(0, 0, 50, 0.3);
}

/* input textarea */
.elfinder input,
.elfinder textarea {
    color: #000;
    background-color: #FFF;
    border-color: #ccc;
}

/* dialogs */
.std42-dialog, .std42-dialog .ui-widget-content {
    background-color: #ededed;
    background-image: none;
    background-clip: content-box;
}

.std42-dialog.elfinder-bg-translucent {
    background-color: #fff;
    background-color: rgba(255, 255, 255, 0.9);
}

.std42-dialog.elfinder-bg-translucent .ui-widget-content {
    background-color: transparent;
}

.elfinder-quicklook-title {
    color: #fff;
}

.elfinder-quicklook-titlebar-icon {
    background-color: transparent;
    background-image: none;
}

.elfinder-quicklook-titlebar-icon .ui-icon {
    background-color: #d4d4d4;
    border-color: #8a8a8a;
}

.elfinder-quicklook-info-progress {
    background-color: gray;
}

.std42-dialog .ui-dialog-titlebar .ui-dialog-titlebar-close:hover .ui-icon,
.elfinder-mobile .std42-dialog .ui-dialog-titlebar .ui-dialog-titlebar-close .ui-icon,
.elfinder-quicklook-titlebar-icon .ui-icon.elfinder-icon-close:hover,
.elfinder-mobile .elfinder-quicklook-titlebar-icon .ui-icon.elfinder-icon-close {
    background-color: #ff6252;
    border-color: #e5695d;
    background-image: url("../img/ui-icons_ffffff_256x240.png");
}

.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-minimize:hover .ui-icon,
.elfinder-mobile .std42-dialog .ui-dialog-titlebar .elfinder-titlebar-minimize .ui-icon,
.elfinder-quicklook-titlebar-icon .ui-icon.elfinder-icon-minimize:hover,
.elfinder-mobile .elfinder-quicklook-titlebar-icon .ui-icon.elfinder-icon-minimize {
    background-color: #ffbc00;
    border-color: #e3a40b;
    background-image: url("../img/ui-icons_ffffff_256x240.png");
}

.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-full:hover .ui-icon,
.elfinder-mobile .std42-dialog .ui-dialog-titlebar .elfinder-titlebar-full .ui-icon,
.elfinder-quicklook-titlebar-icon .ui-icon.elfinder-icon-full:hover,
.elfinder-mobile .elfinder-quicklook-titlebar-icon .ui-icon.elfinder-icon-full {
    background-color: #26c82f;
    border-color: #13ae10;
    background-image: url("../img/ui-icons_ffffff_256x240.png");
}

.std42-dialog .elfinder-help,
.std42-dialog .elfinder-help .ui-widget-content {
    background: #fff;
}

/* navbar */
.elfinder .elfinder-navbar {
    background: #dde4eb;
}

.elfinder-navbar .ui-state-hover {
    color: #000;
    background-color: #edf1f4;
    border-color: #bdcbd8;
}

.elfinder-navbar .ui-droppable-hover {
    background: transparent;
}

.elfinder-navbar .ui-state-active {
    background: #3875d7;
    border-color: #3875d7;
    color: #fff;
}

.elfinder-navbar .elfinder-droppable-active {
    background: #A7C6E5;
}

/* disabled elfinder */
.elfinder-disabled .elfinder-navbar .ui-state-active {
    background: #dadada;
    border-color: #aaa;
    color: #777;
}

/* workzone */
.elfinder-workzone {
    background: #fff;
}

/* current directory */
/* Is in trash */
.elfinder-cwd-wrapper.elfinder-cwd-wrapper-trash {
    background-color: #f0f0f0;
}

/* selected file in "icons" view */
.elfinder-cwd-view-icons .elfinder-cwd-file .ui-state-hover,
.elfinder-cwd-view-icons .elfinder-cwd-file .ui-state-active {
/*    background: #ccc;*/
    background: none;
}

/* type badge in "icons" view */
/* default */
.elfinder-cwd-icon:before {
    color: white;
    background-color: #798da7;
}

/* type */
.elfinder-cwd-icon-text:before {
    background-color: #6f99e6
}

.elfinder-cwd-icon-image:before {
    background-color: #2ea26c
}

.elfinder-cwd-icon-audio:before {
    background-color: #7bad2a
}

.elfinder-cwd-icon-video:before {
    background-color: #322aad
}

/* subtype */
.elfinder-cwd-icon-x-empty:before,
.elfinder-cwd-icon-plain:before {
    background-color: #719be6
}

.elfinder-cwd-icon-rtf:before,
.elfinder-cwd-icon-rtfd:before {
    background-color: #83aae7
}

.elfinder-cwd-icon-pdf:before {
    background-color: #db7424
}

.elfinder-cwd-icon-html:before {
    background-color: #82bc12
}

.elfinder-cwd-icon-xml:before,
.elfinder-cwd-icon-css:before {
    background-color: #7c7c7c
}

.elfinder-cwd-icon-x-shockwave-flash:before {
    background-color: #f43a36
}

.elfinder-cwd-icon-zip:before,
.elfinder-cwd-icon-x-zip:before,
.elfinder-cwd-icon-x-xz:before,
.elfinder-cwd-icon-x-7z-compressed:before,
.elfinder-cwd-icon-x-gzip:before,
.elfinder-cwd-icon-x-tar:before,
.elfinder-cwd-icon-x-bzip:before,
.elfinder-cwd-icon-x-bzip2:before,
.elfinder-cwd-icon-x-rar:before,
.elfinder-cwd-icon-x-rar-compressed:before {
    background-color: #97638e
}

.elfinder-cwd-icon-javascript:before,
.elfinder-cwd-icon-x-javascript:before,
.elfinder-cwd-icon-x-perl:before,
.elfinder-cwd-icon-x-python:before,
.elfinder-cwd-icon-x-ruby:before,
.elfinder-cwd-icon-x-sh:before,
.elfinder-cwd-icon-x-shellscript:before,
.elfinder-cwd-icon-x-c:before,
.elfinder-cwd-icon-x-csrc:before,
.elfinder-cwd-icon-x-chdr:before,
.elfinder-cwd-icon-x-c--:before,
.elfinder-cwd-icon-x-c--src:before,
.elfinder-cwd-icon-x-c--hdr:before,
.elfinder-cwd-icon-x-java:before,
.elfinder-cwd-icon-x-java-source:before,
.elfinder-cwd-icon-x-php:before {
    background-color: #7c607c
}

.elfinder-cwd-icon-msword:before,
.elfinder-cwd-icon-vnd-ms-office:before,
.elfinder-cwd-icon-vnd-ms-word:before,
.elfinder-cwd-icon-vnd-ms-word-document-macroEnabled-12:before,
.elfinder-cwd-icon-vnd-ms-word-template-macroEnabled-12:before,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-wordprocessingml-document:before,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-wordprocessingml-template:before {
    background-color: #2b569a
}

.elfinder-cwd-icon-ms-excel:before,
.elfinder-cwd-icon-vnd-ms-excel:before,
.elfinder-cwd-icon-vnd-ms-excel-addin-macroEnabled-12:before,
.elfinder-cwd-icon-vnd-ms-excel-sheet-binary-macroEnabled-12:before,
.elfinder-cwd-icon-vnd-ms-excel-sheet-macroEnabled-12:before,
.elfinder-cwd-icon-vnd-ms-excel-template-macroEnabled-12:before,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-spreadsheetml-sheet:before,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-spreadsheetml-template:before {
    background-color: #107b10
}

.elfinder-cwd-icon-vnd-ms-powerpoint:before,
.elfinder-cwd-icon-vnd-ms-powerpoint-addin-macroEnabled-12:before,
.elfinder-cwd-icon-vnd-ms-powerpoint-presentation-macroEnabled-12:before,
.elfinder-cwd-icon-vnd-ms-powerpoint-slide-macroEnabled-12:before,
.elfinder-cwd-icon-vnd-ms-powerpoint-slideshow-macroEnabled-12:before,
.elfinder-cwd-icon-vnd-ms-powerpoint-template-macroEnabled-12:before,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-presentation:before,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-slide:before,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-slideshow:before,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-template:before {
    background-color: #d24625
}

.elfinder-cwd-icon-vnd-oasis-opendocument-chart:before,
.elfinder-cwd-icon-vnd-oasis-opendocument-database:before,
.elfinder-cwd-icon-vnd-oasis-opendocument-formula:before,
.elfinder-cwd-icon-vnd-oasis-opendocument-graphics:before,
.elfinder-cwd-icon-vnd-oasis-opendocument-graphics-template:before,
.elfinder-cwd-icon-vnd-oasis-opendocument-image:before,
.elfinder-cwd-icon-vnd-oasis-opendocument-presentation:before,
.elfinder-cwd-icon-vnd-oasis-opendocument-presentation-template:before,
.elfinder-cwd-icon-vnd-oasis-opendocument-spreadsheet:before,
.elfinder-cwd-icon-vnd-oasis-opendocument-spreadsheet-template:before,
.elfinder-cwd-icon-vnd-oasis-opendocument-text:before,
.elfinder-cwd-icon-vnd-oasis-opendocument-text-master:before,
.elfinder-cwd-icon-vnd-oasis-opendocument-text-template:before,
.elfinder-cwd-icon-vnd-oasis-opendocument-text-web:before,
.elfinder-cwd-icon-vnd-openofficeorg-extension:before {
    background-color: #00a500
}

.elfinder-cwd-icon-postscript:before {
    background-color: #ff5722
}

/* list view*/
.elfinder-cwd table thead td.ui-state-hover {
    background: #ddd;
}

.elfinder-cwd table tr:nth-child(odd) {
    background-color: #edf3fe;
}

.elfinder-cwd table tr {
    border: 1px solid transparent;
    border-top: 1px solid #fff;
}

.elfinder-cwd .elfinder-droppable-active td {
    background: #A7C6E5;
}

.elfinder-cwd.elfinder-table-header-sticky table {
    border-top-color: #fff;
}

.elfinder-droppable-active .elfinder-cwd.elfinder-table-header-sticky table {
    border-top-color: #A7C6E5;
}

/* common selected background/color */
.elfinder-cwd-view-icons .elfinder-cwd-file .elfinder-cwd-filename.ui-state-hover,
.elfinder-cwd table td.ui-state-hover,
.elfinder-button-menu .ui-state-hover {
    background: #3875d7;
    color: #fff;
}

/* disabled elfinder */
.elfinder-disabled .elfinder-cwd-view-icons .elfinder-cwd-file .elfinder-cwd-filename.ui-state-hover,
.elfinder-disabled .elfinder-cwd table td.ui-state-hover {
    background: #dadada;
}

/* statusbar */
.elfinder .elfinder-statusbar {
    color: #555;
}

.elfinder .elfinder-statusbar a {
    text-decoration: none;
    color: #555;
}

/* contextmenu */
.elfinder-contextmenu .ui-state-active {
    background: #6293df;
    color: #fff;
}

.elfinder-contextmenu .ui-state-hover {
    background: #3875d7;
    color: #fff;
}

.elfinder-contextmenu .ui-state-hover .elfinder-contextmenu-arrow {
    background-image: url('../img/arrows-active.png');
}

/* dialog */
.elfinder .ui-dialog input:text.ui-state-hover,
.elfinder .ui-dialog textarea.ui-state-hover {
    background-image: none;
    background-color: inherit;
}

.elfinder-notify-cancel .elfinder-notify-button {
    background-color: #707070;
    background-image: url("../img/ui-icons_ffffff_256x240.png");
}

.elfinder-notify-cancel .elfinder-notify-button.ui-state-hover {
    background-color: #aaa;
}

/* edit dialog */
.elfinder-dialog-edit select.elfinder-edit-changed {
    border-bottom: 2px solid #13ae10;
}

/* tooltip */
.ui-widget-content.elfinder-ui-tooltip {
    background-color: #fff;
}

.elfinder-ui-tooltip.ui-widget-shadow,
.elfinder .elfinder-ui-tooltip.ui-widget-shadow {
    box-shadow: 2px 6px 4px -4px #cecdcd;
}

/* progressbar */
.elfinder-ui-progressbar {
    background-color: #419bf3;
}

.elfinder-ltr .elfinder-navbar{
    margin-right:3px;
}
.elfinder-rtl .elfinder-navbar{
    margin-left:3px;
}
/**
* Buttons
*/
.ui-button,
.ui-button:active,
.ui-button.ui-state-default {
    display: inline-block;
    font-weight: normal;
    text-align: center;
    vertical-align: middle;
    cursor: pointer;
    white-space: nowrap;
    -webkit-border-radius: 3px;
    border-radius: 3px;
    text-transform: uppercase;
    -webkit-box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.4);
    box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.4);
    -webkit-transition: all 0.4s;
    -o-transition: all 0.4s;
    transition: all 0.4s;
    background: #fff;
    color: #222;
}
.ui-button .ui-icon,
.ui-button:active .ui-icon,
.ui-button.ui-state-default .ui-icon {
    color: #222;
}
.ui-button:hover,
a.ui-button:active,
.ui-button:active,
.ui-button:focus,
.ui-button.ui-state-hover,
.ui-button.ui-state-active {
    background: #3498DB;
    color: #fff;
}
.ui-button:hover .ui-icon,
a.ui-button:active .ui-icon,
.ui-button:active .ui-icon,
.ui-button:focus .ui-icon,
.ui-button.ui-state-hover .ui-icon,
.ui-button.ui-state-active .ui-icon {
    color: #fff;
}
.ui-button.ui-state-active:hover {
    background: #217dbb;
    color: #fff;
    border: none;
}
.ui-button:focus {
    outline: none !important;
}
.ui-controlgroup-horizontal .ui-button {
    -webkit-border-radius: 0;
    border-radius: 0;
    border: 0;
}
div.elfinder-cwd-wrapper-list tr.ui-state-default td span.ui-icon {
    margin-right:5px;
}

.std42-dialog,
.std42-dialog .ui-widget-content{
    background:#fff;
}
.std42-dialog,
.std42-dialog .ui-dialog-buttonpane.ui-widget-content{
    background: #ededed;
}
css/statusbar.css000064400000006341151215013450010057 0ustar00/******************************************************************/
/*                           STATUSBAR STYLES                     */
/******************************************************************/

/* statusbar container */
.elfinder-statusbar {
    display: flex;
    justify-content: space-between;
    cursor: default;
    text-align: center;
    font-weight: normal;
    padding: .2em .5em;
    border-right: 0 solid transparent;
    border-bottom: 0 solid transparent;
    border-left: 0 solid transparent;
}

.elfinder-statusbar:before,
.elfinder-statusbar:after {
    display: none;
}

.elfinder-statusbar span {
    vertical-align: bottom;
    overflow: hidden;
    text-overflow: ellipsis;
    -o-text-overflow: ellipsis;
}

.elfinder-statusbar span.elfinder-path-other {
    flex-shrink: 0;
    text-overflow: clip;
    -o-text-overflow: clip;
}

.elfinder-statusbar span.ui-state-hover,
.elfinder-statusbar span.ui-state-active {
    border: none;
}

.elfinder-statusbar span.elfinder-path-cwd {
    cursor: default;
}

/* path in statusbar */
.elfinder-path {
    display: flex;
    order: 1;
    flex-grow: 1;
    cursor: pointer;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    -o-text-overflow: ellipsis;
    max-width: 30%\9;
}

.elfinder-ltr .elfinder-path {
    text-align: left;
    float: left\9;
}

.elfinder-rtl .elfinder-path {
    text-align: right;
    float: right\9;
}

/* path in workzone (case of swipe to navbar close) */
.elfinder-workzone-path {
    position: relative;
}

.elfinder-workzone-path .elfinder-path {
    position: relative;
    font-size: .75em;
    font-weight: normal;
    float: none;
    max-width: none;
    overflow: hidden;
    overflow-x: hidden;
    text-overflow: initial;
    -o-text-overflow: initial;
}

.elfinder-mobile .elfinder-workzone-path .elfinder-path {
    overflow: auto;
    overflow-x: scroll;
}

.elfinder-ltr .elfinder-workzone-path .elfinder-path {
    margin-left: 24px;
}

.elfinder-rtl .elfinder-workzone-path .elfinder-path {
    margin-right: 24px;
}

.elfinder-workzone-path .elfinder-path span {
    display: inline-block;
    padding: 5px 3px;
}

.elfinder-workzone-path .elfinder-path span.elfinder-path-cwd {
    font-weight: bold;
}

.elfinder-workzone-path .elfinder-path span.ui-state-hover,
.elfinder-workzone-path .elfinder-path span.ui-state-active {
    border: none;
}

.elfinder-workzone-path .elfinder-path-roots {
    position: absolute;
    top: 0;
    width: 24px;
    height: 20px;
    padding: 2px;
    border: none;
    overflow: hidden;
}

.elfinder-ltr .elfinder-workzone-path .elfinder-path-roots {
    left: 0;
}

.elfinder-rtl .elfinder-workzone-path .elfinder-path-roots {
    right: 0;
}

/* total/selected size in statusbar */
.elfinder-stat-size {
    order: 3;
    flex-grow: 1;
    overflow: hidden;
    white-space: nowrap;
}

.elfinder-ltr .elfinder-stat-size {
    text-align: right;
    float: right\9; 
    padding-right: 10px;
}
.elfinder-ltr .elfinder-stat-size > .elfinder-stat-size {
    padding-right: 0px;
}
.elfinder-rtl .elfinder-stat-size {
    text-align: left;
    float: left\9;
}

/* info of current selected item */
.elfinder-stat-selected {
    order: 2;
    margin: 0 .5em;
    white-space: nowrap;
    overflow: hidden;
}
css/toast.css000064400000012067151215013450007203 0ustar00/*
 * CSS for Toastr
 * Copyright 2012-2015
 * Authors: John Papa, Hans Fjällemark, and Tim Ferrell.
 * All Rights Reserved.
 * Use, reproduction, distribution, and modification of this code is subject to the terms and
 * conditions of the MIT license, available at http://www.opensource.org/licenses/mit-license.php
 *
 * ARIA Support: Greta Krafsig
 *
 * Project: https://github.com/CodeSeven/toastr
 */

.elfinder .elfinder-toast {
    position: absolute;
    top: 12px;
    right: 12px;
    max-width: 90%;
    cursor: default;
}

.elfinder .elfinder-toast > div {
    position: relative;
    pointer-events: auto;
    overflow: hidden;
    margin: 0 0 6px;
    padding: 8px 16px 8px 50px;
    -moz-border-radius: 3px 3px 3px 3px;
    -webkit-border-radius: 3px 3px 3px 3px;
    border-radius: 3px 3px 3px 3px;
    background-position: 15px center;
    background-repeat: no-repeat;
    -moz-box-shadow: 0 0 12px #999999;
    -webkit-box-shadow: 0 0 12px #999999;
    box-shadow: 0 0 12px #999999;
    color: #FFFFFF;
    opacity: 0.9;
    filter: alpha(opacity=90);
    background-color: #030303;
    text-align: center;
}

.elfinder .elfinder-toast > .toast-info {
    background-color: #2F96B4;
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=") !important;
}

.elfinder .elfinder-toast > .toast-error {
    background-color: #BD362F;
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=") !important;
}

.elfinder .elfinder-toast > .toast-success {
    background-color: #51A351;
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==") !important;
}

.elfinder .elfinder-toast > .toast-warning {
    background-color: #F89406;
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=") !important;
}

.elfinder .elfinder-toast > div button.ui-button {
    background-image: none;
    margin-top: 8px;
    padding: .5em .8em;
}

.elfinder .elfinder-toast > .toast-success button.ui-button {
    background-color: green;
    color: #FFF;
}

.elfinder .elfinder-toast > .toast-success button.ui-button.ui-state-hover {
    background-color: #add6ad;
    color: #254b25;
}

.elfinder .elfinder-toast > .toast-info button.ui-button {
    background-color: #046580;
    color: #FFF;
}

.elfinder .elfinder-toast > .toast-info button.ui-button.ui-state-hover {
    background-color: #7DC6DB;
    color: #046580;
}

.elfinder .elfinder-toast > .toast-warning button.ui-button {
    background-color: #dd8c1a;
    color: #FFF;
}

.elfinder .elfinder-toast > .toast-warning button.ui-button.ui-state-hover {
    background-color: #e7ae5e;
    color: #422a07;
}
css/quicklook.css000064400000026023151215013450010047 0ustar00/* quicklook window */
.elfinder-quicklook {
    position: absolute;
    background: url("../img/quicklook-bg.png");
    overflow: hidden;
    -moz-border-radius: 7px;
    -webkit-border-radius: 7px;
    border-radius: 7px;
    padding: 32px 0 40px 0;
}

.elfinder-navdock .elfinder-quicklook {
    -moz-border-radius: 0;
    -webkit-border-radius: 0;
    border-radius: 0;
    font-size: 90%;
    overflow: auto;
}

.elfinder-quicklook.elfinder-touch {
    padding: 30px 0 40px 0;
}

.elfinder-quicklook .ui-resizable-se {
    width: 14px;
    height: 14px;
    right: 5px;
    bottom: 3px;
    background: url("../img/toolbar.png") 0 -496px no-repeat;
}

.elfinder-quicklook.elfinder-touch .ui-resizable-se {
    -moz-transform-origin: bottom right;
    -moz-transform: scale(1.5);
    zoom: 1.5;
}

/* quicklook fullscreen window */
.elfinder-quicklook.elfinder-quicklook-fullscreen {
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    margin: 0;
    box-sizing: border-box;
    width: 100%;
    height: 100%;
    object-fit: contain;
    border-radius: 0;
    -moz-border-radius: 0;
    -webkit-border-radius: 0;
    -webkit-background-clip: padding-box;
    padding: 0;
    background: #000;
    display: block;
}

/* hide titlebar in fullscreen mode */
.elfinder-quicklook-fullscreen .elfinder-quicklook-titlebar,
.elfinder-quicklook-fullscreen.elfinder-quicklook .ui-resizable-handle{ display: none; }

/* hide preview border in fullscreen mode */
.elfinder-quicklook-fullscreen .elfinder-quicklook-preview {
    border: 0 solid;
}

.elfinder-quicklook-cover {
    width: 100%;
    height: 100%;
    top: 0;
    left: 0;
    position: absolute;
}

.elfinder-quicklook-cover.elfinder-quicklook-coverbg {
    /* background need to catch mouse event over browser plugin (eg PDF preview) */
    background-color: #fff;
    opacity: 0.000001;
    filter: Alpha(Opacity=0.0001);
}

/* quicklook titlebar */
.elfinder-quicklook-titlebar {
    text-align: center;
    background: #777;
    position: absolute;
    left: 0;
    top: 0;
    width: calc(100% - 12px);
    height: 20px;
    -moz-border-radius-topleft: 7px;
    -webkit-border-top-left-radius: 7px;
    border-top-left-radius: 7px;
    -moz-border-radius-topright: 7px;
    -webkit-border-top-right-radius: 7px;
    border-top-right-radius: 7px;
    border: none;
    line-height: 1.2;
    padding: 6px;
}

.elfinder-navdock .elfinder-quicklook-titlebar {
    -moz-border-radius-topleft: 0;
    -webkit-border-top-left-radius: 0;
    border-top-left-radius: 0;
    -moz-border-radius-topright: 0;
    -webkit-border-top-right-radius: 0;
    border-top-right-radius: 0;
    cursor: default;
}

.elfinder-touch .elfinder-quicklook-titlebar {
    height: 30px;
}

/* window title */
.elfinder-quicklook-title {
    display: inline-block;
    white-space: nowrap;
    overflow: hidden;
}

.elfinder-touch .elfinder-quicklook-title {
    padding: 8px 0;
}

/* icon "close" in titlebar */
.elfinder-quicklook-titlebar-icon {
    position: absolute;
    left: 4px;
    top: 50%;
    margin-top: -8px;
    height: 16px;
    border: none;
}
.elfinder-touch .elfinder-quicklook-titlebar-icon {
    height: 22px;
}

.elfinder-quicklook-titlebar-icon .ui-icon {
    position: relative;
    margin: -9px 3px 0px 0px;
    cursor: pointer;
    border-radius: 10px;
    border: 1px solid;
    opacity: .7;
    filter: Alpha(Opacity=70);
}

.elfinder-quicklook-titlebar-icon .ui-icon.ui-icon-closethick {
    padding-left: 1px;
}

.elfinder-mobile .elfinder-quicklook-titlebar-icon .ui-icon {
    opacity: .6;
    filter: Alpha(Opacity=60);
}

.elfinder-touch .elfinder-quicklook-titlebar-icon .ui-icon {
    margin-top: -5px;
}

.elfinder-quicklook-titlebar-icon.elfinder-titlebar-button-right {
    left: auto;
    right: 4px;
    direction: rtl;
}

.elfinder-quicklook-titlebar-icon.elfinder-titlebar-button-right .ui-icon {
    margin: -9px 0px 0px 3px;
}

.elfinder-touch .elfinder-quicklook-titlebar .ui-icon {
    -moz-transform-origin: center center;
    -moz-transform: scale(1.2);
    zoom: 1.2;
}

.elfinder-touch .elfinder-quicklook-titlebar-icon .ui-icon {
    margin-right: 10px;
}

.elfinder-touch .elfinder-quicklook-titlebar-icon.elfinder-titlebar-button-right .ui-icon {
    margin-left: 10px;
}

/* main part of quicklook window */
.elfinder-quicklook-preview {
    overflow: hidden;
    position: relative;
    border: 0 solid;
    border-left: 1px solid transparent;
    border-right: 1px solid transparent;
    height: 100%;
}

.elfinder-navdock .elfinder-quicklook-preview {
    border-left: 0;
    border-right: 0;
}

.elfinder-quicklook-preview.elfinder-overflow-auto {
    overflow: auto;
    -webkit-overflow-scrolling: touch;
}

/* wrapper for file info/icon */
.elfinder-quicklook-info-wrapper {
    display: table;
    position: absolute;
    width: 100%;
    height: 100%;
    height: calc(100% - 80px);
    left: 0;
    top: 20px;
}

.elfinder-navdock .elfinder-quicklook-info-wrapper {
    height: calc(100% - 20px);
}

/* file info */
.elfinder-quicklook-info {
    display: table-cell;
    vertical-align: middle;
}

.elfinder-ltr .elfinder-quicklook-info {
    padding: 0 12px 0 112px;
}

.elfinder-rtl .elfinder-quicklook-info {
    padding: 0 112px 0 12px;
}

.elfinder-ltr .elfinder-navdock .elfinder-quicklook-info {
    padding: 0 0 0 80px;
}

.elfinder-rtl .elfinder-navdock .elfinder-quicklook-info {
    padding: 0 80px 0 0;
}

/* file name in info */
.elfinder-quicklook-info .elfinder-quicklook-info-data:first-child {
    color: #fff;
    font-weight: bold;
    padding-bottom: .5em;
}

/* other data in info */
.elfinder-quicklook-info-data {
    clear: both;
    padding-bottom: .2em;
    color: #fff;
}

.elfinder-quicklook-info-progress {
    width: 0;
    height: 4px;
    border-radius: 2px;
}

/* file icon */
.elfinder-quicklook .elfinder-cwd-icon {
    position: absolute;
    left: 32px;
    top: 50%;
    margin-top: -20px;
}

.elfinder-navdock .elfinder-quicklook .elfinder-cwd-icon {
    left: 16px;
}

.elfinder-rtl .elfinder-quicklook .elfinder-cwd-icon {
    left: auto;
    right: 32px;
}

.elfinder-rtl .elfinder-navdock .elfinder-quicklook .elfinder-cwd-icon {
    right: 6px;
}

.elfinder-quicklook .elfinder-cwd-icon:before {
    top: -10px;
}

.elfinder-ltr .elfinder-quicklook .elfinder-cwd-icon:before {
    left: 0;
    top: 5px;
}

.elfinder-ltr .elfinder-navdock .elfinder-quicklook .elfinder-cwd-icon:before {
    left: -14px;
}

.elfinder-ltr .elfinder-quicklook .elfinder-cwd-icon:after {
    left: -42px;
}

.elfinder-ltr .elfinder-navdock .elfinder-quicklook .elfinder-cwd-icon:after {
    left: -12px;
}

.elfinder-rtl .elfinder-quicklook .elfinder-cwd-icon:before {
    left: auto;
    right: 40px;
}

.elfinder-rtl .elfinder-quicklook .elfinder-cwd-icon:after {
    left: auto;
    right: 42px;
}

/* image in preview */
.elfinder-quicklook-preview > img,
.elfinder-quicklook-preview > div > canvas {
    display: block;
    margin: auto;
}

/* navigation bar on quicklook window bottom */
.elfinder-quicklook-navbar {
    position: absolute;
    left: 50%;
    bottom: 4px;
    width: 140px;
    height: 32px;
    padding: 0px;
    margin-left: -70px;
    border: 1px solid transparent;
    border-radius: 19px;
    -moz-border-radius: 19px;
    -webkit-border-radius: 19px;
}

/* navigation bar in fullscreen mode */
.elfinder-quicklook-fullscreen .elfinder-quicklook-navbar {
    width: 188px;
    margin-left: -94px;
    padding: 5px;
    border: 1px solid #eee;
    background: #000;
    opacity: 0.4;
    filter: Alpha(Opacity=40);
}

/* show close icon in fullscreen mode */
.elfinder-quicklook-fullscreen .elfinder-quicklook-navbar-icon-close,
.elfinder-quicklook-fullscreen .elfinder-quicklook-navbar-separator {
    display: inline;
}

/* icons in navbar */
.elfinder-quicklook-navbar-icon {
    width: 32px;
    height: 32px;
    margin: 0 7px;
    float: left;
    background: url("../img/quicklook-icons.png") 0 0 no-repeat;

}

/* fullscreen icon */
.elfinder-quicklook-navbar-icon-fullscreen {
    background-position: 0 -64px;
}

/* exit fullscreen icon */
.elfinder-quicklook-navbar-icon-fullscreen-off {
    background-position: 0 -96px;
}

/* prev file icon */
.elfinder-quicklook-navbar-icon-prev {
    background-position: 0 0;
}

/* next file icon */
.elfinder-quicklook-navbar-icon-next {
    background-position: 0 -32px;
}

/* close icon */
.elfinder-quicklook-navbar-icon-close {
    background-position: 0 -128px;
    display: none;
}

/* icons separator */
.elfinder-quicklook-navbar-separator {
    width: 1px;
    height: 32px;
    float: left;
    border-left: 1px solid #fff;
    display: none;
}

/* text encoding selector */
.elfinder-quicklook-encoding {
    height: 40px;
}
.elfinder-quicklook-encoding > select {
    color: #fff;
    background: #000;
    border: 0;
    font-size: 12px;
    max-width: 100px;
    display: inline-block;
    position: relative;
    top: 6px;
    left: 5px;
}
.elfinder-navdock .elfinder-quicklook .elfinder-quicklook-encoding {
    display: none;
}


/* text files preview wrapper */
.elfinder-quicklook-preview-text-wrapper {
    width: 100%;
    height: 100%;
    background: #fff;
    color: #222;
    overflow: auto;
    -webkit-overflow-scrolling: touch;
}

/* archive files preview wrapper */
.elfinder-quicklook-preview-archive-wrapper {
    width: 100%;
    height: 100%;
    background: #fff;
    color: #222;
    font-size: 90%;
    overflow: auto;
    -webkit-overflow-scrolling: touch
}

/* archive files preview header */
.elfinder-quicklook-preview-archive-wrapper strong {
    padding: 0 5px;
}

/* text preview */
pre.elfinder-quicklook-preview-text,
pre.elfinder-quicklook-preview-text.prettyprint {
    width: auto;
    height: auto;
    margin: 0;
    padding: 3px 9px;
    border: none;
    overflow: visible;
    background: #fff;
    -o-tab-size: 4;
    -moz-tab-size: 4;
    tab-size: 4;
}

.elfinder-quicklook-preview-charsleft hr {
    border: none;
    border-top: dashed 1px;
}

.elfinder-quicklook-preview-charsleft span {
    font-size: 90%;
    font-style: italic;
    cursor: pointer;
}

/* html/pdf preview */
.elfinder-quicklook-preview-html,
.elfinder-quicklook-preview-pdf,
.elfinder-quicklook-preview-iframe {
    width: 100%;
    height: 100%;
    background: #fff;
    margin: 0;
    border: none;
    display: block;
}

/* swf preview container */
.elfinder-quicklook-preview-flash {
    width: 100%;
    height: 100%;
}

/* audio preview container */
.elfinder-quicklook-preview-audio {
    width: 100%;
    position: absolute;
    bottom: 0;
    left: 0;
}

/* audio preview using embed */
embed.elfinder-quicklook-preview-audio {
    height: 30px;
    background: transparent;
}

/* video preview container */
.elfinder-quicklook-preview-video {
    width: 100%;
    height: 100%;
}

/* video.js error message */
.elfinder-quicklook-preview .vjs-error .vjs-error-display .vjs-modal-dialog-content {
    font-size: 12pt;
    padding: 0;
    color: #fff;
}

/* allow user select */
.elfinder .elfinder-quicklook .elfinder-quicklook-info *,
.elfinder .elfinder-quicklook .elfinder-quicklook-preview * {
    -webkit-user-select: auto;
    -moz-user-select: text;
    -khtml-user-select: text;
    user-select: text;
}
css/common.css000064400000015356151215013450007345 0ustar00/*********************************************/
/*            COMMON ELFINDER STUFFS         */
/*********************************************/

/* for old jQuery UI */
@font-face {
    font-family: 'Noto Sans';
    src: url('./../fonts/notosans/NotoSans-Regular.eot');
    src: url('./../fonts/notosans/NotoSans-Regular.eot?#iefix') format('embedded-opentype'),
        url('./../fonts/notosans/NotoSans-Regular.woff2') format('woff2'),
        url('./../fonts/notosans/NotoSans-Regular.woff') format('woff'),
        url('./../fonts/notosans/NotoSans-Regular.ttf') format('truetype');
    font-weight: normal;
    font-style: normal;
    font-display: swap;
  }

.ui-front {
    z-index: 100;
}

/* style reset */
div.elfinder *,
div.elfinder :after,
div.elfinder :before {
    box-sizing: content-box;
}

div.elfinder fieldset {
    display: block;
    margin-inline-start: 2px;
    margin-inline-end: 2px;
    padding-block-start: 0.35em;
    padding-inline-start: 0.75em;
    padding-inline-end: 0.75em;
    padding-block-end: 0.625em;
    min-inline-size: min-content;
    border-width: 2px;
    border-style: groove;
    border-color: threedface;
    border-image: initial;
}

div.elfinder legend {
    display: block;
    padding-inline-start: 2px;
    padding-inline-end: 2px;
    border-width: initial;
    border-style: none;
    border-color: initial;
    border-image: initial;
    width: auto;
    margin-bottom: 0;
}

/* base container */
div.elfinder {
    padding: 0;
    position: relative;
    display: block;
    visibility: visible;
    font-size: 18px;
    font-family: Verdana, Arial, Helvetica, sans-serif;
}

/* prevent auto zoom on iOS */
.elfinder-ios input,
.elfinder-ios select,
.elfinder-ios textarea {
    font-size: 16px !important;
}

/* full screen mode */
.elfinder.elfinder-fullscreen > .ui-resizable-handle {
    display: none;
}

.elfinder-font-mono {
    line-height: 2ex;
}

/* in lazy execution status */
.elfinder.elfinder-processing * {
    cursor: progress !important
}

.elfinder.elfinder-processing.elfinder-touch .elfinder-workzone:after {
    position: absolute;
    top: 0;
    width: 100%;
    height: 3px;
    content: '';
    left: 0;
    background-image: url(../img/progress.gif);
    opacity: .6;
    pointer-events: none;
}

/* for disable select of Touch devices */
.elfinder *:not(input):not(textarea):not(select):not([contenteditable=true]),
.elfinder-contextmenu *:not(input):not(textarea):not(select):not([contenteditable=true]) {
    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
    -webkit-user-select: none;
    -moz-user-select: none;
    -khtml-user-select: none;
    user-select: none;
}

.elfinder .overflow-scrolling-touch {
    -webkit-overflow-scrolling: touch;
}

/* right to left enviroment */
.elfinder-rtl {
    text-align: right;
    direction: rtl;
}

/* nav and cwd container */
.elfinder-workzone {
    padding: 0;
    position: relative;
    overflow: hidden;
}

/* dir/file permissions and symlink markers */
.elfinder-lock,
.elfinder-perms,
.elfinder-symlink {
    position: absolute;
    width: 16px;
    height: 16px;
    background-image: url(../img/toolbar.png);
    background-repeat: no-repeat;
    background-position: 0 -528px;
}

.elfinder-symlink {
}

/* noaccess */
.elfinder-na .elfinder-perms {
    background-position: 0 -96px;
}

/* read only */
.elfinder-ro .elfinder-perms {
    background-position: 0 -64px;
}

/* write only */
.elfinder-wo .elfinder-perms {
    background-position: 0 -80px;
}

/* volume type group */
.elfinder-group .elfinder-perms {
    background-position: 0 0px;
}

/* locked */
.elfinder-lock {
    background-position: 0 -656px;
}

/* drag helper */
.elfinder-drag-helper {
    top: 0px;
    left: 0px;
    width: 70px;
    height: 60px;
    padding: 0 0 0 25px;
    z-index: 100000;
    will-change: left, top;
}

.elfinder-drag-helper.html5-native {
    position: absolute;
    top: -1000px;
    left: -1000px;
}

/* drag helper status icon (default no-drop) */
.elfinder-drag-helper-icon-status {
    position: absolute;
    width: 16px;
    height: 16px;
    left: 42px;
    top: 60px;
    background: url('../img/toolbar.png') 0 -96px no-repeat;
    display: block;
}

/* show "up-arrow" icon for move item */
.elfinder-drag-helper-move .elfinder-drag-helper-icon-status {
    background-position: 0 -720px;
}

/* show "plus" icon when ctrl/shift pressed */
.elfinder-drag-helper-plus .elfinder-drag-helper-icon-status {
    background-position: 0 -544px;
}

/* files num in drag helper */
.elfinder-drag-num {
    display: inline-box;
    position: absolute;
    top: 0;
    left: 0;
    width: auto;
    height: 14px;
    text-align: center;
    padding: 1px 3px 1px 3px;

    font-weight: bold;
    color: #fff;
    background-color: red;
    -moz-border-radius: 8px;
    -webkit-border-radius: 8px;
    border-radius: 8px;
}

/* icon in drag helper */
.elfinder-drag-helper .elfinder-cwd-icon {
    margin: 0 0 0 -24px;
    float: left;
}

/* transparent overlay */
.elfinder-overlay {
    position: absolute;
    opacity: .2;
    filter: Alpha(Opacity=20);
}

/* panels under/below cwd (for search field etc) */
.elfinder .elfinder-panel {
    position: relative;
    background-image: none;
    padding: 7px 12px;
}

/* for html5 drag and drop */
[draggable=true] {
    -khtml-user-drag: element;
}

/* for place holder to content editable elements */
.elfinder [contentEditable=true]:empty:not(:focus):before {
    content: attr(data-ph);
}
/* bottom tray */
.elfinder div.elfinder-bottomtray {
    position: fixed;
    bottom: 0;
    max-width: 100%;
    opacity: .8;
}

.elfinder div.elfinder-bottomtray > div {
    top: initial;
    right: initial;
    left: initial;
}

.elfinder.elfinder-ltr div.elfinder-bottomtray {
    left: 0;
}

.elfinder.elfinder-rtl div.elfinder-bottomtray {
    right: 0;
}

/* tooltip */
.elfinder-ui-tooltip,
.elfinder .elfinder-ui-tooltip {
    font-size: 14px;
    padding: 2px 4px;
}

/* progressbar */
.elfinder-ui-progressbar {
    pointer-events: none;
    position: absolute;
    width: 0;
    height: 2px;
    top: 0px;
    border-radius: 2px;
    filter: blur(1px);
}

.elfinder-ltr .elfinder-ui-progressbar {
    left: 0;
}

.elfinder-rtl .elfinder-ui-progressbar {
    right: 0;
}

/* Word Break Pop*/
.ui-dialog.elfinder-dialog-info .elfinder-info-title .elfinder-cwd-icon + strong{ float: left; width: calc(100% - 65px); word-break: break-all; display: block; }
.ui-dialog.elfinder-dialog-info .elfinder-info-tb .elfinder-info-path,
.ui-dialog.elfinder-dialog-info .elfinder-info-tb .elfinder-info-link{
    word-break: break-all;
}

/*for default theme css*/
.wrap.wp-filemanager-wrap .ui-front.ui-dialog.ui-widget.ui-widget-content.ui-corner-all.ui-draggable.std42-dialog .ui-dialog-content.ui-widget-content .ui-helper-clearfix.elfinder-rm-title span.elfinder-cwd-icon:before {
    left: 0;
    top: 6px;
}
css/toolbar.css000064400000031241151215013450007506 0ustar00/*********************************************/
/*               TOOLBAR STYLES              */
/*********************************************/
/* toolbar container */
.elfinder-toolbar {
    padding: 10px 0;
    border-left: 0 solid transparent;
    border-top: 0 solid transparent;
    border-right: 0 solid transparent;
    max-height: 50%;
    overflow-y: auto;
}

/* container for button's group */
.elfinder-buttonset {
    margin: 1px 4px;
    float: left;
    background: transparent;
    padding: 0;
    overflow: hidden;
}

/*.elfinder-buttonset:first-child { margin:0; }*/

/* button */
.elfinder .elfinder-button {
    min-width: 16px;
    height: 16px;
    margin: 0;
    padding: 4px;
    float: left;
    overflow: hidden;
    position: relative;
    border: 0 solid;
    -webkit-box-sizing: content-box;
    -moz-box-sizing: content-box;
    box-sizing: content-box;
    line-height: 1;
    cursor: default;
}

.elfinder-rtl .elfinder-button {
    float: right;
}

.elfinder-touch .elfinder-button {
    min-width: 20px;
    height: 20px;
}

.elfinder .ui-icon-search {
    cursor: pointer;
}

/* separator between buttons, required for berder between button with ui color */
.elfinder-toolbar-button-separator {
    float: left;
    padding: 0;
    height: 24px;
    border-top: 0 solid;
    border-right: 0 solid;
    border-bottom: 0 solid;
    width: 0;
}

.elfinder-rtl .elfinder-toolbar-button-separator {
    float: right;
}

.elfinder-touch .elfinder-toolbar-button-separator {
    height: 28px;
}

/* change icon opacity^ not button */
.elfinder .elfinder-button.ui-state-disabled {
    opacity: 1;
    filter: Alpha(Opacity=100);
}

.elfinder .elfinder-button.ui-state-disabled .elfinder-button-icon,
.elfinder .elfinder-button.ui-state-disabled .elfinder-button-text {
    opacity: .4;
    filter: Alpha(Opacity=40);
}

/* rtl enviroment */
.elfinder-rtl .elfinder-buttonset {
    float: right;
}

/* icon inside button */
.elfinder-button-icon {
    width: 16px;
    height: 16px;
    display: inline-block;
    background: url('../img/toolbar.png') no-repeat;
}

.elfinder-button-text {
    position: relative;
    display: inline-block;
    top: -4px;
    margin: 0 2px;
    font-size: 12px;
}

.elfinder-touch .elfinder-button-icon {
    transform: scale(1.25);
    transform-origin: top left;
}

.elfinder-rtl.elfinder-touch .elfinder-button-icon {
    transform-origin: top right;
}

.elfinder-touch .elfinder-button-text {
    transform: translate(3px, 3px);
    top: -5px;
}

.elfinder-rtl.elfinder-touch .elfinder-button-text {
    transform: translate(-3px, 3px);
}

.elfinder-touch .elfinder-button-icon.elfinder-contextmenu-extra-icon {
    transform: scale(2);
    transform-origin: 12px 8px;
}

.elfinder-rtl.elfinder-touch .elfinder-button-icon.elfinder-contextmenu-extra-icon {
    transform-origin: 4px 8px;
}

/* buttons icons */
.elfinder-button-icon-home {
    background-position: 0 0;
}

.elfinder-button-icon-back {
    background-position: 0 -112px;
}

.elfinder-button-icon-forward {
    background-position: 0 -128px;
}

.elfinder-button-icon-up {
    background-position: 0 -144px;
}

.elfinder-button-icon-dir {
    background-position: 0 -16px;
}

.elfinder-button-icon-opendir {
    background-position: 0 -32px;
}

.elfinder-button-icon-reload {
    background-position: 0 -160px;
}

.elfinder-button-icon-open {
    background-position: 0 -176px;
}

.elfinder-button-icon-mkdir {
    background-position: 0 -192px;
}

.elfinder-button-icon-mkfile {
    background-position: 0 -208px;
}

.elfinder-button-icon-rm {
    background-position: 0 -832px;
}

.elfinder-button-icon-trash {
    background-position: 0 -224px;
}

.elfinder-button-icon-restore {
    background-position: 0 -816px;
}

.elfinder-button-icon-copy {
    background-position: 0 -240px;
}

.elfinder-button-icon-cut {
    background-position: 0 -256px;
}

.elfinder-button-icon-paste {
    background-position: 0 -272px;
}

.elfinder-button-icon-getfile {
    background-position: 0 -288px;
}

.elfinder-button-icon-duplicate {
    background-position: 0 -304px;
}

.elfinder-button-icon-rename {
    background-position: 0 -320px;
}

.elfinder-button-icon-edit {
    background-position: 0 -336px;
}

.elfinder-button-icon-quicklook {
    background-position: 0 -352px;
}

.elfinder-button-icon-upload {
    background-position: 0 -368px;
}

.elfinder-button-icon-download {
    background-position: 0 -384px;
}

.elfinder-button-icon-info {
    background-position: 0 -400px;
}

.elfinder-button-icon-extract {
    background-position: 0 -416px;
}

.elfinder-button-icon-archive {
    background-position: 0 -432px;
}

.elfinder-button-icon-view {
    background-position: 0 -448px;
}

.elfinder-button-icon-view-list {
    background-position: 0 -464px;
}

.elfinder-button-icon-help {
    background-position: 0 -480px;
}

.elfinder-button-icon-resize {
    background-position: 0 -512px;
}

.elfinder-button-icon-link {
    background-position: 0 -528px;
}

.elfinder-button-icon-search {
    background-position: 0 -561px;
}

.elfinder-button-icon-sort {
    background-position: 0 -577px;
}

.elfinder-button-icon-rotate-r {
    background-position: 0 -625px;
}

.elfinder-button-icon-rotate-l {
    background-position: 0 -641px;
}

.elfinder-button-icon-netmount {
    background-position: 0 -688px;
}

.elfinder-button-icon-netunmount {
    background-position: 0 -96px;
}

.elfinder-button-icon-places {
    background-position: 0 -704px;
}

.elfinder-button-icon-chmod {
    background-position: 0 -48px;
}

.elfinder-button-icon-accept {
    background-position: 0 -736px;
}

.elfinder-button-icon-menu {
    background-position: 0 -752px;
}

.elfinder-button-icon-colwidth {
    background-position: 0 -768px;
}

.elfinder-button-icon-fullscreen {
    background-position: 0 -784px;
}

.elfinder-button-icon-unfullscreen {
    background-position: 0 -800px;
}

.elfinder-button-icon-empty {
    background-position: 0 -848px;
}

.elfinder-button-icon-undo {
    background-position: 0 -864px;
}

.elfinder-button-icon-redo {
    background-position: 0 -880px;
}

.elfinder-button-icon-preference {
    background-position: 0 -896px;
}

.elfinder-button-icon-mkdirin {
    background-position: 0 -912px;
}

.elfinder-button-icon-selectall {
    background-position: 0 -928px;
}

.elfinder-button-icon-selectnone {
    background-position: 0 -944px;
}

.elfinder-button-icon-selectinvert {
    background-position: 0 -960px;
}

.elfinder-button-icon-opennew {
    background-position: 0 -976px;
}

.elfinder-button-icon-hide {
    background-position: 0 -992px;
}

.elfinder-button-icon-text {
    background-position: 0 -1008px;
}

/* button icon mirroring for rtl */
.elfinder-rtl .elfinder-button-icon-back,
.elfinder-rtl .elfinder-button-icon-forward,
.elfinder-rtl .elfinder-button-icon-getfile,
.elfinder-rtl .elfinder-button-icon-help,
.elfinder-rtl .elfinder-button-icon-redo,
.elfinder-rtl .elfinder-button-icon-rename,
.elfinder-rtl .elfinder-button-icon-search,
.elfinder-rtl .elfinder-button-icon-undo,
.elfinder-rtl .elfinder-button-icon-view-list,
.elfinder-rtl .ui-icon-search {
    -ms-transform: scale(-1, 1);
    -webkit-transform: scale(-1, 1);
    transform: scale(-1, 1);
}

.elfinder-rtl.elfinder-touch .elfinder-button-icon-back,
.elfinder-rtl.elfinder-touch .elfinder-button-icon-forward,
.elfinder-rtl.elfinder-touch .elfinder-button-icon-getfile,
.elfinder-rtl.elfinder-touch .elfinder-button-icon-help,
.elfinder-rtl.elfinder-touch .elfinder-button-icon-redo,
.elfinder-rtl.elfinder-touch .elfinder-button-icon-rename,
.elfinder-rtl.elfinder-touch .elfinder-button-icon-search,
.elfinder-rtl.elfinder-touch .elfinder-button-icon-undo,
.elfinder-rtl.elfinder-touch .elfinder-button-icon-view-list,
.elfinder-rtl.elfinder-touch .ui-icon-search {
    -ms-transform: scale(-1.25, 1.25) translateX(16px);
    -webkit-transform: scale(-1.25, 1.25) translateX(16px);
    transform: scale(-1.25, 1.25) translateX(16px);
}

/* button with dropdown menu*/
.elfinder .elfinder-menubutton {
    overflow: visible;
}

/* button with spinner icon */
.elfinder-button-icon-spinner {
    background: url("../img/spinner-mini.gif") center center no-repeat;
}

/* menu */
.elfinder-button-menu {
    position: absolute;
    margin-top: 24px;
    padding: 3px 0;
    overflow-y: auto;
}

.elfinder-touch .elfinder-button-menu {
    margin-top: 30px;
}

/* menu item */
.elfinder-button-menu-item {
    white-space: nowrap;
    cursor: default;
    padding: 5px 19px;
    position: relative;
}

.elfinder-touch .elfinder-button-menu-item {
    padding: 12px 19px
}

/* fix hover ui class */
.elfinder-button-menu .ui-state-hover {
    border: 0 solid;
}

.elfinder-button-menu-item-separated {
    border-top: 1px solid #ccc;
}

.elfinder-button-menu-item .ui-icon {
    width: 16px;
    height: 16px;
    position: absolute;
    left: 2px;
    top: 50%;
    margin-top: -8px;
    display: none;
}

.elfinder-button-menu-item-selected .ui-icon {
    display: block;
}

.elfinder-button-menu-item-selected-asc .ui-icon-arrowthick-1-s {
    display: none;
}

.elfinder-button-menu-item-selected-desc .ui-icon-arrowthick-1-n {
    display: none;
}

/* hack for upload button */
.elfinder-button form {
    position: absolute;
    top: 0;
    right: 0;
    opacity: 0;
    filter: Alpha(Opacity=0);
    cursor: pointer;
}

.elfinder .elfinder-button form input {
    background: transparent;
    cursor: default;
}

/* search "button" */
.elfinder .elfinder-button-search {
    border: 0 solid;
    background: transparent;
    padding: 0;
    margin: 1px 4px;
    height: auto;
    min-height: 26px;
    width: 70px;
    overflow: visible;
}

.elfinder .elfinder-button-search.ui-state-active {
    width: 220px;
}

/* search "pull down menu" */
.elfinder .elfinder-button-search-menu {
    font-size: 8pt;
    text-align: center;
    width: auto;
    min-width: 180px;
    position: absolute;
    top: 30px;
    padding-right: 5px;
    padding-left: 5px;
}

.elfinder-ltr .elfinder-button-search-menu {
    right: 22px;
    left: auto;
}

.elfinder-rtl .elfinder-button-search-menu {
    right: auto;
    left: 22px;
}

.elfinder-touch .elfinder-button-search-menu {
    top: 34px;
}

.elfinder .elfinder-button-search-menu div {
    margin-left: auto;
    margin-right: auto;
    margin-top: 5px;
    margin-bottom: 5px;
    display: table;
}

.elfinder .elfinder-button-search-menu div .ui-state-hover {
    border: 1px solid;
}

/* ltr/rte enviroment */
.elfinder-ltr .elfinder-button-search {
    float: right;
    margin-right: 10px;
}

.elfinder-rtl .elfinder-button-search {
    float: left;
    margin-left: 10px;
}

.elfinder-rtl .ui-controlgroup > .ui-controlgroup-item {
    float: right;
}

/* search text field */
.elfinder-button-search input[type=text] {
    box-sizing: border-box;
    width: 100%;
    height: 25px;
    min-height: 25px;
    padding: 0 20px;
    line-height: 22px;
    border: 0 solid;
    border: 1px solid #aaa;
    -moz-border-radius: 12px;
    -webkit-border-radius: 12px;
    border-radius: 12px;
    outline: 0px solid;
}

.elfinder-button-search input::-ms-clear {
    display: none;
}

.elfinder-touch .elfinder-button-search input {
    height: 30px;
    line-height: 28px;
}

.elfinder-rtl .elfinder-button-search input {
    direction: rtl;
}

/* icons */
.elfinder-button-search .ui-icon {
    position: absolute;
    height: 18px;
    top: 50%;
    margin: -8px 4px 0 4px;
    opacity: .6;
    filter: Alpha(Opacity=60);
}

.elfinder-button-search-menu .ui-checkboxradio-icon {
    display: none;
}

/* search/close icons */
.elfinder-ltr .elfinder-button-search .ui-icon-search {
    left: 0;
}

.elfinder-rtl .elfinder-button-search .ui-icon-search {
    right: 0;
}

.elfinder-ltr .elfinder-button-search .ui-icon-close {
    right: 0;
}

.elfinder-rtl .elfinder-button-search .ui-icon-close {
    left: 0;
}

/* toolbar swipe handle */
.elfinder-toolbar-swipe-handle {
    position: absolute;
    top: 0px;
    left: 0px;
    height: 50px;
    width: 100%;
    pointer-events: none;
    background: linear-gradient(to bottom,
    rgba(221, 228, 235, 1) 0,
    rgba(221, 228, 235, 0.8) 2px,
    rgba(216, 223, 230, 0.3) 5px,
    rgba(0, 0, 0, 0.1) 95%,
    rgba(0, 0, 0, 0) 100%);
}

/* Theme Search Fix */
.elfinder-toolbar .elfinder-button-search .ui-icon-search{ 
    background-image: url('../img/black-search.png');
    background-position: 7px 3px;
} 
.elfinder-toolbar .elfinder-button-search .ui-icon-close{
    background-image: url('../img/black-close.png');
    background-position: 2px 3px;
}

/* Grid View Hover */
.elfinder-cwd-wrapper .elfinder-cwd-file.ui-corner-all:hover .ui-state-active,
.elfinder-cwd-wrapper .elfinder-cwd-file.ui-corner-all .ui-state-active:hover{color: inherit;}
.elfinder-cwd-wrapper .elfinder-cwd-file.ui-corner-all.ui-selected:hover .ui-state-hover.ui-state-active{ color: #fff; }
div.tool-op-getfile{display:none !important;}css/elfinder.min.css000064400000264460151215013450010431 0ustar00/*!
 * elFinder - file manager for web
 * Version 2.1.46 (2019-01-14)
 * http://elfinder.org
 * 
 * Copyright 2009-2019, Studio 42
 * Licensed under a 3-clauses BSD license
 */
.elfinder-resize-container{margin-top:.3em}.elfinder-resize-type{float:left;margin-bottom:.4em}.elfinder-resize-control{float:left}.elfinder-resize-control input[type=number]{border:1px solid #aaa;text-align:right;width:4.5em}.elfinder-resize-control input.elfinder-resize-bg{text-align:center;width:5em;direction:ltr}.elfinder-dialog-resize .elfinder-resize-control-panel{margin-top:10px}.elfinder-dialog-resize .elfinder-resize-imgrotate,.elfinder-dialog-resize .elfinder-resize-pallet{cursor:pointer}.elfinder-dialog-resize .elfinder-resize-picking{cursor:crosshair}.elfinder-dialog-resize .elfinder-resize-grid8+button{padding-top:2px;padding-bottom:2px}.elfinder-resize-preview{width:400px;height:400px;padding:10px;background:#fff;border:1px solid #aaa;float:right;position:relative;overflow:hidden;text-align:left;direction:ltr}.elfinder-resize-handle,div.elfinder-cwd-wrapper-list tr.ui-state-default td{position:relative}.elfinder-resize-handle-hline,.elfinder-resize-handle-vline{position:absolute;background-image:url(../img/crop.gif)}.elfinder-resize-handle-hline{width:100%;height:1px!important;background-repeat:repeat-x}.elfinder-resize-handle-vline{width:1px!important;height:100%;background-repeat:repeat-y}.elfinder-resize-handle-hline-top{top:0;left:0}.elfinder-resize-handle-hline-bottom{bottom:0;left:0}.elfinder-resize-handle-vline-left{top:0;left:0}.elfinder-resize-handle-vline-right{top:0;right:0}.elfinder-resize-handle-point{position:absolute;width:8px;height:8px;border:1px solid #777;background:0 0}.elfinder-resize-handle-point-n{top:0;left:50%;margin-top:-5px;margin-left:-5px}.elfinder-resize-handle-point-e,.elfinder-resize-handle-point-ne{top:0;right:0;margin-top:-5px;margin-right:-5px}.elfinder-resize-handle-point-e{top:50%}.elfinder-resize-handle-point-se{bottom:0;right:0;margin-bottom:-5px;margin-right:-5px}.elfinder-resize-handle-point-s,.elfinder-resize-handle-point-sw{bottom:0;left:50%;margin-bottom:-5px;margin-left:-5px}.elfinder-resize-handle-point-sw{left:0}.elfinder-resize-handle-point-nw,.elfinder-resize-handle-point-w{top:50%;left:0;margin-top:-5px;margin-left:-5px}.elfinder-resize-handle-point-nw{top:0}.elfinder-dialog.elfinder-dialog-resize .ui-resizable-e{width:10px;height:100%}.elfinder-dialog.elfinder-dialog-resize .ui-resizable-s{width:100%;height:10px}.elfinder-resize-loading{position:absolute;width:200px;height:30px;top:50%;margin-top:-25px;left:50%;margin-left:-100px;text-align:center;background:url(../img/progress.gif) center bottom repeat-x}.elfinder-resize-row{margin-bottom:9px;position:relative}.elfinder-resize-label{float:left;width:80px;padding-top:3px}.elfinder-resize-checkbox-label{border:1px solid transparent}.elfinder-dialog-resize .elfinder-resize-whctrls{margin:-20px 5px 0}.elfinder-ltr .elfinder-dialog-resize .elfinder-resize-whctrls{float:right}.elfinder-help-team div,.elfinder-rtl .elfinder-dialog-resize .elfinder-resize-whctrls{float:left}.elfinder-dialog-resize .ui-resizable-e,.elfinder-dialog-resize .ui-resizable-w{height:100%;width:10px}.elfinder-dialog-resize .ui-resizable-n,.elfinder-dialog-resize .ui-resizable-s{width:100%;height:10px}.elfinder-dialog-resize .ui-resizable-e{margin-right:-7px}.elfinder-dialog-resize .ui-resizable-w{margin-left:-7px}.elfinder-dialog-resize .ui-resizable-s{margin-bottom:-7px}.elfinder-dialog-resize .ui-resizable-n{margin-top:-7px}.elfinder-dialog-resize .ui-resizable-ne,.elfinder-dialog-resize .ui-resizable-nw,.elfinder-dialog-resize .ui-resizable-se,.elfinder-dialog-resize .ui-resizable-sw{width:10px;height:10px}.elfinder-dialog-resize .ui-resizable-se{background:0 0;bottom:0;right:0;margin-right:-7px;margin-bottom:-7px}.elfinder-dialog-resize .ui-resizable-sw{margin-left:-7px;margin-bottom:-7px}.elfinder-dialog-resize .ui-resizable-ne{margin-right:-7px;margin-top:-7px}.elfinder-dialog-resize .ui-resizable-nw{margin-left:-7px;margin-top:-7px}.elfinder-touch .elfinder-dialog-resize .ui-resizable-n,.elfinder-touch .elfinder-dialog-resize .ui-resizable-s{height:20px}.elfinder-touch .elfinder-dialog-resize .ui-resizable-e,.elfinder-touch .elfinder-dialog-resize .ui-resizable-w{width:20px}.elfinder-touch .elfinder-dialog-resize .ui-resizable-ne,.elfinder-touch .elfinder-dialog-resize .ui-resizable-nw,.elfinder-touch .elfinder-dialog-resize .ui-resizable-se,.elfinder-touch .elfinder-dialog-resize .ui-resizable-sw{width:30px;height:30px}.elfinder-touch .elfinder-dialog-resize .elfinder-resize-preview .ui-resizable-se{width:30px;height:30px;margin:0}.elfinder-dialog-resize .ui-icon-grip-solid-vertical{position:absolute;top:50%;right:0;margin-top:-8px;margin-right:-11px}.elfinder-dialog-resize .ui-icon-grip-solid-horizontal{position:absolute;left:50%;bottom:0;margin-left:-8px;margin-bottom:-11px}.elfinder-dialog-resize .elfinder-resize-row .ui-buttonset{float:right}.elfinder-dialog-resize .elfinder-resize-degree input,.elfinder-dialog-resize input.elfinder-resize-quality,.elfinder-mobile .elfinder-resize-control input[type=number]{width:3.5em}.elfinder-mobile .elfinder-dialog-resize .elfinder-resize-degree input,.elfinder-mobile .elfinder-dialog-resize input.elfinder-resize-quality{width:2.5em}.elfinder-dialog-resize .elfinder-resize-degree button.ui-button{padding:6px 8px}.elfinder-dialog-resize button.ui-button span{padding:0}.elfinder-dialog-resize .elfinder-resize-jpgsize{font-size:90%}.ui-widget-content .elfinder-resize-container .elfinder-resize-rotate-slider{width:195px;margin:10px 7px;background-color:#fafafa}.elfinder-dialog-resize .elfinder-resize-type span.ui-checkboxradio-icon{display:none}.elfinder-resize-preset-container{box-sizing:border-box;border-radius:5px}.elfinder-file-edit{width:100%;height:100%;margin:0;padding:2px;border:1px solid #ccc;box-sizing:border-box;resize:none}.elfinder-touch .elfinder-file-edit{font-size:16px}.elfinder-dialog-edit .ui-dialog-content.elfinder-edit-editor{background-color:#fff}.elfinder-dialog-edit .ui-dialog-content.elfinder-edit-editor .elfinder-edit-imageeditor{width:100%;height:300px;max-height:100%;text-align:center}.elfinder-dialog-edit .ui-dialog-content.elfinder-edit-editor .elfinder-edit-imageeditor *{-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;user-select:none}.elfinder-edit-imageeditor .tui-image-editor-main-container .tui-image-editor-main{top:0}.elfinder-edit-imageeditor .tui-image-editor-main-container .tui-image-editor-header{display:none}.elfinder-edit-imageeditor .tui-image-editor-main.tui-image-editor-menu-crop .tui-image-editor-wrap,.elfinder-edit-imageeditor .tui-image-editor-main.tui-image-editor-menu-draw .tui-image-editor-wrap,.elfinder-edit-imageeditor .tui-image-editor-main.tui-image-editor-menu-filter .tui-image-editor-wrap,.elfinder-edit-imageeditor .tui-image-editor-main.tui-image-editor-menu-flip .tui-image-editor-wrap,.elfinder-edit-imageeditor .tui-image-editor-main.tui-image-editor-menu-icon .tui-image-editor-wrap,.elfinder-edit-imageeditor .tui-image-editor-main.tui-image-editor-menu-mask .tui-image-editor-wrap,.elfinder-edit-imageeditor .tui-image-editor-main.tui-image-editor-menu-rotate .tui-image-editor-wrap,.elfinder-edit-imageeditor .tui-image-editor-main.tui-image-editor-menu-shape .tui-image-editor-wrap,.elfinder-edit-imageeditor .tui-image-editor-main.tui-image-editor-menu-text .tui-image-editor-wrap{height:calc(100% - 150px)}.elfinder-touch.elfinder-fullscreen-native textarea.elfinder-file-edit{padding-bottom:20em;margin-bottom:-20em}.elfinder-dialog-edit .ui-dialog-buttonpane .elfinder-dialog-confirm-encoding{font-size:12px}.ui-dialog-buttonpane .ui-dialog-buttonset.elfinder-edit-extras{margin:0 1em 0 .2em;float:left}.ui-dialog-buttonpane .ui-dialog-buttonset.elfinder-edit-extras-quality{padding-top:6px}.ui-dialog-buttonpane .ui-dialog-buttonset.elfinder-edit-extras select{font-size:12px;margin-top:8px}.elfinder-dialog-edit .ui-dialog-buttonpane .ui-icon,.elfinder-edit-onlineconvert-bottom-btn button,.elfinder-edit-onlineconvert-button button,.elfinder-preference dt label{cursor:pointer}.elfinder-edit-spinner{position:absolute;top:50%;text-align:center;width:100%;font-size:16pt}.elfinder-dialog-edit .elfinder-edit-spinner .elfinder-spinner,.elfinder-dialog-edit .elfinder-edit-spinner .elfinder-spinner-text{float:none}.elfinder-dialog-edit .elfinder-toast>div{width:280px}.elfinder-edit-onlineconvert-button{display:inline-block;width:180px;min-height:30px;vertical-align:top}.elfinder-edit-onlineconvert-bottom-btn button.elfinder-button-ios-multiline{-webkit-appearance:none;border-radius:16px;color:#000;text-align:center;padding:8px;background-color:#eee;background-image:-webkit-linear-gradient(top,#fafafa 0%,#c4c4c4 100%);background-image:linear-gradient(to bottom,#fafafa 0%,#c4c4c4 100%)}.elfinder-edit-onlineconvert-button .elfinder-button-icon{margin:0 10px;vertical-align:middle;cursor:pointer}.elfinder-edit-onlineconvert-bottom-btn{text-align:center;margin:10px 0 0}.elfinder-edit-onlineconvert-link{margin-top:1em;text-align:center}.elfinder-edit-onlineconvert-link .elfinder-button-icon{background-image:url(../img/editor-icons.png);background-repeat:no-repeat;background-position:0 -144px;margin-bottom:-3px}.elfinder-edit-onlineconvert-link a,ul.elfinder-help-integrations a{text-decoration:none}div.elfinder-cwd-wrapper-list tr.ui-state-default td span.ui-icon{position:absolute;top:4px;left:0;right:0;margin:auto 0 auto auto}.elfinder-touch div.elfinder-cwd-wrapper-list tr.ui-state-default td span.ui-icon{top:7px}.elfinder-rtl div.elfinder-cwd-wrapper-list tr.ui-state-default td span.ui-icon{margin:auto auto auto 0}.elfinder-help{margin-bottom:.5em;-webkit-overflow-scrolling:touch}.elfinder-help .ui-tabs-panel{overflow:auto;padding:10px}.elfinder-dialog .ui-tabs .ui-tabs-nav li{overflow:hidden}.elfinder-dialog .ui-tabs .ui-tabs-nav li a{padding:.2em .8em;display:inline-block}.elfinder-touch .elfinder-dialog .ui-tabs .ui-tabs-nav li a{padding:.5em}.elfinder-dialog .ui-tabs-active a{background:inherit}.elfinder-help-shortcuts{height:auto;padding:10px;margin:0;box-sizing:border-box}.elfinder-help-shortcut{white-space:nowrap;clear:both}.elfinder-help-shortcut-pattern{float:left;width:160px}.elfinder-help-logo{width:100px;height:96px;float:left;margin-right:1em;background:url(../img/logo.png) center center no-repeat}.elfinder-help h3{font-size:1.5em;margin:.2em 0 .3em}.elfinder-help-separator{clear:both;padding:.5em}.elfinder-help-link{display:inline-block;margin-right:12px;padding:2px 0;white-space:nowrap}.elfinder-rtl .elfinder-help-link{margin-right:0;margin-left:12px}.elfinder-help .ui-priority-secondary{font-size:.9em}.elfinder-help .ui-priority-primary{margin-bottom:7px}.elfinder-help-team{clear:both;text-align:right;border-bottom:1px solid #ccc;margin:.5em 0;font-size:.9em}.elfinder-help-license{font-size:.9em}.elfinder-help-disabled{font-weight:700;text-align:center;margin:90px 0}.elfinder-help .elfinder-dont-panic{display:block;border:1px solid transparent;width:200px;height:200px;margin:30px auto;text-decoration:none;text-align:center;position:relative;background:#d90004;-moz-box-shadow:5px 5px 9px #111;-webkit-box-shadow:5px 5px 9px #111;box-shadow:5px 5px 9px #111;background:-moz-radial-gradient(80px 80px,circle farthest-corner,#d90004 35%,#960004 100%);background:-webkit-gradient(radial,80 80,60,80 80,120,from(#d90004),to(#960004));-moz-border-radius:100px;-webkit-border-radius:100px;border-radius:100px;outline:none}.elfinder-help .elfinder-dont-panic span{font-size:3em;font-weight:700;text-align:center;color:#fff;position:absolute;left:0;top:45px}ul.elfinder-help-integrations ul{padding:0;margin:0 1em 1em}ul.elfinder-help-integrations a:hover{text-decoration:underline}.elfinder-help-debug{height:100%;padding:0;margin:0;overflow:none;border:none}.elfinder-help-debug .ui-tabs-panel{padding:0;margin:0;overflow:auto}.elfinder-help-debug fieldset{margin-bottom:10px;border-color:#789;border-radius:10px}.elfinder-help-debug legend{font-size:1.2em;font-weight:700;color:#2e8b57}.elfinder-help-debug dl{margin:0}.elfinder-help-debug dt{color:#789}.elfinder-help-debug dt:before{content:"["}.elfinder-help-debug dt:after{content:"]"}.elfinder-help-debug dd{margin-left:1em}.elfinder-dialog .elfinder-preference .ui-tabs-nav{margin-bottom:1px;height:auto}.elfinder-preference .ui-tabs-panel{padding:10px 10px 0;overflow:auto;box-sizing:border-box;-webkit-overflow-scrolling:touch}.elfinder-preference a.ui-state-hover,.elfinder-preference label.ui-state-hover{border:none}.elfinder-preference dl{width:100%;display:inline-block;margin:.5em 0}.elfinder-preference dt{display:block;width:200px;clear:left;float:left;max-width:50%}.elfinder-rtl .elfinder-preference dt{clear:right;float:right}.elfinder-preference dd{margin-bottom:1em}.elfinder-preference dd input[type=checkbox],.elfinder-preference dd label{white-space:nowrap;display:inline-block;cursor:pointer}.elfinder-preference dt.elfinder-preference-checkboxes{width:100%;max-width:none}.elfinder-preference dd.elfinder-preference-checkboxes{padding-top:3ex}.elfinder-preference select{max-width:100%}.elfinder-preference dd.elfinder-preference-iconSize .ui-slider{width:50%;max-width:100px;display:inline-block;margin:0 10px}.elfinder-preference button{margin:0 16px}.elfinder-preference button+button{margin:0 -10px}.elfinder-preference .elfinder-preference-taball .elfinder-reference-hide-taball{display:none}.elfinder-preference-theme fieldset{margin-bottom:10px}.elfinder-preference-theme legend a{font-size:1.8em;text-decoration:none;cursor:pointer}.elfinder-preference-theme dt{width:20%;word-break:break-all}.elfinder-preference-theme dt:after{content:" :"}.elfinder-preference-theme dd{margin-inline-start:20%}.elfinder-preference img.elfinder-preference-theme-image{display:block;margin-left:auto;margin-right:auto;max-width:90%;max-height:200px;cursor:pointer}.elfinder-preference-theme-btn,.elfinder-rename-batch-type{text-align:center}.elfinder-preference-theme button.elfinder-preference-theme-default{display:inline;margin:0 10px;font-size:8pt}.elfinder-rtl .elfinder-info-title .elfinder-cwd-icon:before{right:33px;left:auto}.elfinder-info-title .elfinder-cwd-icon.elfinder-cwd-bgurl:after{content:none}.elfinder-upload-dialog-wrapper .elfinder-upload-dirselect{position:absolute;bottom:2px;width:16px;height:16px;padding:10px;border:none;overflow:hidden;cursor:pointer}.elfinder .elfinder-contextmenu-ltr .elfinder-contextmenu-item .ui-icon,.elfinder-ltr .elfinder-upload-dialog-wrapper .elfinder-upload-dirselect{left:2px}.elfinder .elfinder-contextmenu-rtl .elfinder-contextmenu-item .ui-icon,.elfinder-rtl .elfinder-upload-dialog-wrapper .elfinder-upload-dirselect{right:2px}.elfinder-ltr .elfinder-rm-title .elfinder-cwd-icon:before{left:38px}.elfinder-rtl .elfinder-rm-title .elfinder-cwd-icon:before{right:86px;left:auto}.elfinder-rm-title .elfinder-cwd-icon.elfinder-cwd-bgurl:after{content:none}.elfinder-rename-batch div{margin:5px 8px}.elfinder-rename-batch .elfinder-rename-batch-name input{width:100%;font-size:1.6em}.elfinder-rename-batch .elfinder-rename-batch-type label{margin:2px;font-size:.9em}.elfinder-rename-batch-preview{padding:0 8px;font-size:1.1em;min-height:4ex}.ui-front{z-index:100}.elfinder{padding:0;position:relative;display:block;visibility:visible;font-size:18px;font-family:Verdana,Arial,Helvetica,sans-serif}.elfinder-ios input,.elfinder-ios select,.elfinder-ios textarea{font-size:16px!important}.elfinder.elfinder-fullscreen>.ui-resizable-handle{display:none}.elfinder-font-mono{line-height:2ex}.elfinder.elfinder-processing *{cursor:progress!important}.elfinder.elfinder-processing.elfinder-touch .elfinder-workzone:after{position:absolute;top:0;width:100%;height:3px;content:'';left:0;background-image:url(../img/progress.gif);opacity:.6;pointer-events:none}.elfinder :not(input):not(textarea):not(select):not([contenteditable=true]),.elfinder-contextmenu :not(input):not(textarea):not(select):not([contenteditable=true]){-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;user-select:none}.elfinder .overflow-scrolling-touch{-webkit-overflow-scrolling:touch}.elfinder-rtl{text-align:right;direction:rtl}.elfinder-workzone{padding:0;position:relative;overflow:hidden}.elfinder-lock,.elfinder-perms,.elfinder-symlink{position:absolute;width:16px;height:16px;background-image:url(../img/toolbar.png);background-repeat:no-repeat}.elfinder-perms,.elfinder-symlink{background-position:0 -528px}.elfinder-na .elfinder-perms{background-position:0 -96px}.elfinder-ro .elfinder-perms{background-position:0 -64px}.elfinder-wo .elfinder-perms{background-position:0 -80px}.elfinder-group .elfinder-perms{background-position:0 0}.elfinder-lock{background-position:0 -656px}.elfinder-drag-helper{top:0;left:0;width:70px;height:60px;padding:0 0 0 25px;z-index:100000;will-change:left,top}.elfinder-drag-helper.html5-native{position:absolute;top:-1000px;left:-1000px}.elfinder-drag-helper-icon-status{position:absolute;width:16px;height:16px;left:42px;top:60px;background:url(../img/toolbar.png) 0 -96px no-repeat;display:block}.elfinder-drag-helper-move .elfinder-drag-helper-icon-status{background-position:0 -720px}.elfinder-drag-helper-plus .elfinder-drag-helper-icon-status{background-position:0 -544px}.elfinder-drag-num{display:inline-box;position:absolute;top:0;left:0;width:auto;height:14px;text-align:center;padding:1px 3px;font-weight:700;color:#fff;background-color:red;-moz-border-radius:8px;-webkit-border-radius:8px;border-radius:8px}.elfinder-drag-helper .elfinder-cwd-icon{margin:0 0 0 -24px;float:left}.elfinder-overlay{position:absolute;opacity:.2;filter:Alpha(Opacity=20)}.elfinder .elfinder-panel{position:relative;background-image:none;padding:7px 12px}[draggable=true]{-khtml-user-drag:element}.elfinder [contentEditable=true]:empty:not(:focus):before{content:attr(data-ph)}.elfinder div.elfinder-bottomtray{position:fixed;bottom:0;max-width:100%;opacity:.8}.elfinder.elfinder-ltr div.elfinder-bottomtray{left:0}.elfinder.elfinder-rtl div.elfinder-bottomtray{right:0}.elfinder .elfinder-ui-tooltip,.elfinder-ui-tooltip{font-size:14px;padding:2px 4px}.elfinder .elfinder-contextmenu,.elfinder .elfinder-contextmenu-sub{position:absolute;border:1px solid #aaa;background:#fff;color:#555;padding:4px 0;top:0;left:0}.elfinder .elfinder-contextmenu-sub{top:5px}.elfinder .elfinder-contextmenu-ltr .elfinder-contextmenu-sub{margin-left:-5px}.elfinder .elfinder-contextmenu-rtl .elfinder-contextmenu-sub{margin-right:-5px}.elfinder .elfinder-contextmenu-header{margin-top:-4px;padding:0 .5em .2ex;border:none;text-align:center}.elfinder .elfinder-contextmenu-header span{font-size:.8em;font-weight:bolder}.elfinder .elfinder-contextmenu-item{position:relative;display:block;padding:4px 30px;text-decoration:none;white-space:nowrap;cursor:default}.elfinder .elfinder-contextmenu-item.ui-state-active{border:none}.elfinder .elfinder-contextmenu-item .ui-icon{width:16px;height:16px;position:absolute;left:auto;right:auto;top:50%;margin-top:-8px}.elfinder-touch .elfinder-contextmenu-item{padding:12px 38px}.elfinder-navbar-root-local.elfinder-contextmenu-icon{background-image:url(../img/volume_icon_local.svg);background-size:contain}.elfinder-navbar-root-trash.elfinder-contextmenu-icon{background-image:url(../img/volume_icon_trash.svg);background-size:contain}.elfinder-navbar-root-ftp.elfinder-contextmenu-icon{background-image:url(../img/volume_icon_ftp.svg);background-size:contain}.elfinder-navbar-root-sql.elfinder-contextmenu-icon{background-image:url(../img/volume_icon_sql.svg);background-size:contain}.elfinder-navbar-root-dropbox.elfinder-contextmenu-icon{background-image:url(../img/volume_icon_dropbox.svg);background-size:contain}.elfinder-navbar-root-googledrive.elfinder-contextmenu-icon{background-image:url(../img/volume_icon_googledrive.svg);background-size:contain}.elfinder-navbar-root-onedrive.elfinder-contextmenu-icon{background-image:url(../img/volume_icon_onedrive.svg);background-size:contain}.elfinder-navbar-root-box.elfinder-contextmenu-icon{background-image:url(../img/volume_icon_box.svg);background-size:contain}.elfinder-navbar-root-zip.elfinder-contextmenu-icon{background-image:url(../img/volume_icon_zip.svg);background-size:contain}.elfinder-navbar-root-network.elfinder-contextmenu-icon{background-image:url(../img/volume_icon_network.svg);background-size:contain}.elfinder .elfinder-contextmenu .elfinder-contextmenu-item span{display:block}.elfinder .elfinder-contextmenu-sub .elfinder-contextmenu-item{padding-left:12px;padding-right:12px}.elfinder .elfinder-contextmenu-ltr .elfinder-contextmenu-item{text-align:left}.elfinder .elfinder-contextmenu-rtl .elfinder-contextmenu-item{text-align:right}.elfinder .elfinder-contextmenu-ltr .elfinder-contextmenu-sub .elfinder-contextsubmenu-item-icon{padding-left:28px}.elfinder .elfinder-contextmenu-rtl .elfinder-contextmenu-sub .elfinder-contextsubmenu-item-icon{padding-right:28px}.elfinder-touch .elfinder-contextmenu-ltr .elfinder-contextmenu-sub .elfinder-contextsubmenu-item-icon{padding-left:36px}.elfinder-touch .elfinder-contextmenu-rtl .elfinder-contextmenu-sub .elfinder-contextsubmenu-item-icon{padding-right:36px}.elfinder .elfinder-contextmenu-arrow,.elfinder .elfinder-contextmenu-extra-icon,.elfinder .elfinder-contextmenu-icon{position:absolute;top:50%;margin-top:-8px;overflow:hidden}.elfinder .elfinder-contextmenu-ltr .elfinder-contextmenu-icon{left:8px}.elfinder .elfinder-contextmenu-ltr .elfinder-contextmenu-extra-icon,.elfinder .elfinder-contextmenu-rtl .elfinder-contextmenu-icon{right:8px}.elfinder .elfinder-contextmenu-rtl .elfinder-contextmenu-extra-icon{left:8px}.elfinder .elfinder-contextmenu-arrow{width:16px;height:16px;background:url(../img/arrows-normal.png) 5px 4px no-repeat}.elfinder .elfinder-contextmenu-ltr .elfinder-contextmenu-arrow{right:5px}.elfinder .elfinder-contextmenu-rtl .elfinder-contextmenu-arrow{left:5px;background-position:0 -10px}.elfinder .elfinder-contextmenu-extra-icon a,.elfinder .elfinder-contextmenu-extra-icon span{display:inline-block;width:100%;height:100%;padding:20px;margin:0;color:transparent!important;text-decoration:none;cursor:pointer}.elfinder .elfinder-contextmenu .ui-state-hover{border:0 solid;background-image:none}.elfinder .elfinder-contextmenu-separator{height:0;border-top:1px solid #ccc;margin:0 1px}.elfinder .elfinder-contextmenu-item .elfinder-button-icon.ui-state-disabled{background-image:url(../img/toolbar.png)}.elfinder-cwd-wrapper{overflow:auto;position:relative;padding:2px;margin:0}.elfinder-cwd-wrapper-list{padding:0}.elfinder-cwd{position:absolute;top:0;cursor:default;padding:0;margin:0;-ms-touch-action:auto;touch-action:auto;min-width:100%}.elfinder-ltr .elfinder-cwd{left:0}.elfinder-rtl .elfinder-cwd{right:0}.elfinder-cwd.elfinder-table-header-sticky{position:-webkit-sticky;position:-ms-sticky;position:sticky;top:0;left:auto;right:auto;width:-webkit-max-content;width:-moz-max-content;width:-ms-max-content;width:max-content;height:0;overflow:visible}.elfinder-cwd.elfinder-table-header-sticky table{border-top:2px solid;padding-top:0}.elfinder-cwd.elfinder-table-header-sticky td{display:inline-block}.elfinder-droppable-active .elfinder-cwd.elfinder-table-header-sticky table{border-top:2px solid transparent}.elfinder .elfinder-cwd table tbody.elfinder-cwd-fixheader,.elfinder-cwd-fixheader .elfinder-cwd{position:relative}.elfinder .elfinder-cwd-wrapper.elfinder-droppable-active{outline:2px solid #8cafed;outline-offset:-2px}.elfinder-cwd-wrapper-empty .elfinder-cwd:after{display:block;height:auto;width:90%;width:calc(100% - 20px);position:absolute;top:50%;left:50%;-ms-transform:translateY(-50%) translateX(-50%);-webkit-transform:translateY(-50%) translateX(-50%);transform:translateY(-50%) translateX(-50%);line-height:1.5em;text-align:center;white-space:pre-wrap;opacity:.6;filter:Alpha(Opacity=60);font-weight:700}.elfinder-cwd-file .elfinder-cwd-select{position:absolute;top:0;left:0;background-color:transparent;opacity:.4;filter:Alpha(Opacity=40)}.elfinder-mobile .elfinder-cwd-file .elfinder-cwd-select{width:30px;height:30px}.elfinder .elfinder-cwd-selectall,.elfinder-cwd-file.ui-selected .elfinder-cwd-select{opacity:.8;filter:Alpha(Opacity=80)}.elfinder-rtl .elfinder-cwd-file .elfinder-cwd-select{left:auto;right:0}.elfinder .elfinder-cwd-selectall{position:absolute;width:30px;height:30px;top:0}.elfinder .elfinder-workzone.elfinder-cwd-wrapper-empty .elfinder-cwd-selectall{display:none}.elfinder-ltr .elfinder-workzone .elfinder-cwd-selectall{text-align:right;right:18px;left:auto}.elfinder-rtl .elfinder-workzone .elfinder-cwd-selectall{text-align:left;right:auto;left:18px}.elfinder-ltr.elfinder-mobile .elfinder-workzone .elfinder-cwd-selectall{right:0}.elfinder-rtl.elfinder-mobile .elfinder-workzone .elfinder-cwd-selectall{left:0}.elfinder-cwd-view-icons .elfinder-cwd-file .elfinder-cwd-select.ui-state-hover{background-color:transparent}.elfinder-cwd-view-icons .elfinder-cwd-file{width:120px;height:90px;padding-bottom:2px;cursor:default;border:none;position:relative}.elfinder .std42-dialog .ui-dialog-content label,.elfinder-cwd-view-icons .elfinder-cwd-file .ui-state-active{border:none}.elfinder-ltr .elfinder-cwd-view-icons .elfinder-cwd-file{float:left;margin:0 3px 2px 0}.elfinder-rtl .elfinder-cwd-view-icons .elfinder-cwd-file{float:right;margin:0 0 5px 3px}.elfinder-cwd-view-icons .elfinder-cwd-file .ui-state-hover{border:0 solid}.elfinder-cwd-view-icons .elfinder-cwd-file-wrapper{width:52px;height:52px;margin:1px auto;padding:2px;position:relative}.elfinder-cwd-size1 .elfinder-cwd-icon:before,.elfinder-cwd-size2 .elfinder-cwd-icon:before,.elfinder-cwd-size3 .elfinder-cwd-icon:before{top:3px;display:block}.elfinder-cwd-size1.elfinder-cwd-view-icons .elfinder-cwd-file{width:120px;height:112px}.elfinder-cwd-size1.elfinder-cwd-view-icons .elfinder-cwd-file-wrapper{width:74px;height:74px}.elfinder-cwd-size1 .elfinder-cwd-icon,.elfinder-cwd-size2 .elfinder-cwd-icon,.elfinder-cwd-size3 .elfinder-cwd-icon{-ms-transform-origin:top center;-ms-transform:scale(1.5);-webkit-transform-origin:top center;-webkit-transform:scale(1.5);transform-origin:top center;transform:scale(1.5)}.elfinder-cwd-size1 .elfinder-cwd-icon.elfinder-cwd-bgurl:before{-ms-transform-origin:top left;-ms-transform:scale(1.35) translate(-4px,15%);-webkit-transform-origin:top left;-webkit-transform:scale(1.35) translate(-4px,15%);transform-origin:top left;transform:scale(1.35) translate(-4px,15%)}.elfinder-cwd-size1 .elfinder-cwd-icon.elfinder-cwd-bgurl:after{-ms-transform:scale(1) translate(10px,-5px);-webkit-transform:scale(1) translate(10px,-5px);transform:scale(1) translate(10px,-5px)}.elfinder-cwd-size1 .elfinder-cwd-icon.elfinder-cwd-bgurl{-ms-transform-origin:center center;-ms-transform:scale(1);-webkit-transform-origin:center center;-webkit-transform:scale(1);transform-origin:center center;transform:scale(1);width:72px;height:72px;-moz-border-radius:6px;-webkit-border-radius:6px;border-radius:6px}.elfinder-cwd-size2.elfinder-cwd-view-icons .elfinder-cwd-file{width:140px;height:134px}.elfinder-cwd-size2.elfinder-cwd-view-icons .elfinder-cwd-file-wrapper{width:98px;height:98px}.elfinder-cwd-size2 .elfinder-cwd-icon,.elfinder-cwd-size3 .elfinder-cwd-icon{-ms-transform:scale(2);-webkit-transform:scale(2);transform:scale(2)}.elfinder-cwd-size2 .elfinder-cwd-icon.elfinder-cwd-bgurl:before{-ms-transform-origin:top left;-ms-transform:scale(1.8) translate(-5px,18%);-webkit-transform-origin:top left;-webkit-transform:scale(1.8) translate(-5px,18%);transform-origin:top left;transform:scale(1.8) translate(-5px,18%)}.elfinder-cwd-size2 .elfinder-cwd-icon.elfinder-cwd-bgurl:after{-ms-transform:scale(1.1) translate(0,10px);-webkit-transform:scale(1.1) translate(0,10px);transform:scale(1.1) translate(0,10px)}.elfinder-cwd-size2 .elfinder-cwd-icon.elfinder-cwd-bgurl{-ms-transform-origin:center center;-ms-transform:scale(1);-webkit-transform-origin:center center;-webkit-transform:scale(1);transform-origin:center center;transform:scale(1);width:96px;height:96px;-moz-border-radius:8px;-webkit-border-radius:8px;border-radius:8px}.elfinder-cwd-size3.elfinder-cwd-view-icons .elfinder-cwd-file{width:174px;height:158px}.elfinder-cwd-size3.elfinder-cwd-view-icons .elfinder-cwd-file-wrapper{width:122px;height:122px}.elfinder-cwd-size3 .elfinder-cwd-icon{-ms-transform:scale(2.5);-webkit-transform:scale(2.5);transform:scale(2.5)}.elfinder-cwd-size3 .elfinder-cwd-icon.elfinder-cwd-bgurl:before{-ms-transform-origin:top left;-ms-transform:scale(2.25) translate(-6px,20%);-webkit-transform-origin:top left;-webkit-transform:scale(2.25) translate(-6px,20%);transform-origin:top left;transform:scale(2.25) translate(-6px,20%)}.elfinder-cwd-size3 .elfinder-cwd-icon.elfinder-cwd-bgurl:after{-ms-transform:scale(1.2) translate(-9px,22px);-webkit-transform:scale(1.2) translate(-9px,22px);transform:scale(1.2) translate(-9px,22px)}.elfinder-cwd-size3 .elfinder-cwd-icon.elfinder-cwd-bgurl{-ms-transform-origin:center center;-ms-transform:scale(1);-webkit-transform-origin:center center;-webkit-transform:scale(1);transform-origin:center center;transform:scale(1);width:120px;height:120px;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px}.elfinder-cwd-view-icons .elfinder-cwd-filename{text-align:center;max-height:2.4em;line-height:1.2em;white-space:pre-line;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis;margin:3px 1px 0;padding:1px;-moz-border-radius:8px;-webkit-border-radius:8px;border-radius:8px;word-break:break-word;overflow-wrap:break-word;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}.elfinder-cwd-view-icons .elfinder-perms{bottom:4px;right:2px}.elfinder-cwd-view-icons .elfinder-lock{top:-3px;right:-2px}.elfinder-cwd-view-icons .elfinder-symlink{bottom:6px;left:0}.elfinder-cwd-icon{display:block;width:48px;height:48px;margin:0 auto;background-image:url(../img/icons-big.svg);background-image:url(../img/icons-big.png) \9;background-position:0 0;background-repeat:no-repeat;-moz-background-clip:padding;-webkit-background-clip:padding-box;background-clip:padding-box}.elfinder-cwd .elfinder-navbar-root-local.elfinder-droppable-active .elfinder-cwd-icon,.elfinder-cwd-view-list .elfinder-navbar-root-local td .elfinder-cwd-icon,.elfinder-navbar-root-local .elfinder-cwd-icon{background-image:url(../img/volume_icon_local.svg);background-image:url(../img/volume_icon_local.png) \9;background-position:0 0;background-size:contain}.elfinder-cwd .elfinder-navbar-root-local.elfinder-droppable-active .elfinder-cwd-icon{background-position:1px -1px}.elfinder-cwd .elfinder-navbar-root-trash.elfinder-droppable-active .elfinder-cwd-icon,.elfinder-cwd-view-list .elfinder-navbar-root-trash td .elfinder-cwd-icon,.elfinder-navbar-root-trash .elfinder-cwd-icon{background-image:url(../img/volume_icon_trash.svg);background-image:url(../img/volume_icon_trash.png) \9;background-position:0 0;background-size:contain}.elfinder-cwd .elfinder-navbar-root-trash.elfinder-droppable-active .elfinder-cwd-icon{background-position:1px -1px}.elfinder-cwd .elfinder-navbar-root-ftp.elfinder-droppable-active .elfinder-cwd-icon,.elfinder-cwd-view-list .elfinder-navbar-root-ftp td .elfinder-cwd-icon,.elfinder-navbar-root-ftp .elfinder-cwd-icon{background-image:url(../img/volume_icon_ftp.svg);background-image:url(../img/volume_icon_ftp.png) \9;background-position:0 0;background-size:contain}.elfinder-cwd .elfinder-navbar-root-ftp.elfinder-droppable-active .elfinder-cwd-icon{background-position:1px -1px}.elfinder-cwd .elfinder-navbar-root-sql.elfinder-droppable-active .elfinder-cwd-icon,.elfinder-cwd-view-list .elfinder-navbar-root-sql td .elfinder-cwd-icon,.elfinder-navbar-root-sql .elfinder-cwd-icon{background-image:url(../img/volume_icon_sql.svg);background-image:url(../img/volume_icon_sql.png) \9;background-position:0 0;background-size:contain}.elfinder-cwd .elfinder-navbar-root-sql.elfinder-droppable-active .elfinder-cwd-icon{background-position:1px -1px}.elfinder-cwd .elfinder-navbar-root-dropbox.elfinder-droppable-active .elfinder-cwd-icon,.elfinder-cwd-view-list .elfinder-navbar-root-dropbox td .elfinder-cwd-icon,.elfinder-navbar-root-dropbox .elfinder-cwd-icon{background-image:url(../img/volume_icon_dropbox.svg);background-image:url(../img/volume_icon_dropbox.png) \9;background-position:0 0;background-size:contain}.elfinder-cwd .elfinder-navbar-root-dropbox.elfinder-droppable-active .elfinder-cwd-icon{background-position:1px -1px}.elfinder-cwd-view-list .elfinder-navbar-root-googledrive td .elfinder-cwd-icon,.elfinder-navbar-root-googledrive .elfinder-cwd-icon{background-position:0 0}.elfinder-cwd .elfinder-navbar-root-googledrive.elfinder-droppable-active .elfinder-cwd-icon,.elfinder-cwd-view-list .elfinder-navbar-root-googledrive td .elfinder-cwd-icon,.elfinder-navbar-root-googledrive .elfinder-cwd-icon{background-image:url(../img/volume_icon_googledrive.svg);background-image:url(../img/volume_icon_googledrive.png) \9;background-size:contain}.elfinder-cwd-view-list .elfinder-navbar-root-onedrive td .elfinder-cwd-icon,.elfinder-navbar-root-onedrive .elfinder-cwd-icon{background-position:0 0}.elfinder-cwd .elfinder-navbar-root-onedrive.elfinder-droppable-active .elfinder-cwd-icon,.elfinder-cwd-view-list .elfinder-navbar-root-onedrive td .elfinder-cwd-icon,.elfinder-navbar-root-onedrive .elfinder-cwd-icon{background-image:url(../img/volume_icon_onedrive.svg);background-image:url(../img/volume_icon_onedrive.png) \9;background-size:contain}.elfinder-cwd-view-list .elfinder-navbar-root-box td .elfinder-cwd-icon,.elfinder-navbar-root-box .elfinder-cwd-icon{background-position:0 0}.elfinder-cwd .elfinder-navbar-root-box.elfinder-droppable-active .elfinder-cwd-icon,.elfinder-cwd-view-list .elfinder-navbar-root-box td .elfinder-cwd-icon,.elfinder-navbar-root-box .elfinder-cwd-icon{background-image:url(../img/volume_icon_box.svg);background-image:url(../img/volume_icon_box.png) \9;background-size:contain}.elfinder-cwd .elfinder-navbar-root-zip.elfinder-droppable-active .elfinder-cwd-icon,.elfinder-cwd-view-list .elfinder-navbar-root-zip td .elfinder-cwd-icon,.elfinder-navbar-root-zip .elfinder-cwd-icon{background-image:url(../img/volume_icon_zip.svg);background-image:url(../img/volume_icon_zip.png) \9;background-position:0 0;background-size:contain}.elfinder-cwd .elfinder-navbar-root-box.elfinder-droppable-active .elfinder-cwd-icon,.elfinder-cwd .elfinder-navbar-root-googledrive.elfinder-droppable-active .elfinder-cwd-icon,.elfinder-cwd .elfinder-navbar-root-onedrive.elfinder-droppable-active .elfinder-cwd-icon{background-position:1px -1px}.elfinder-cwd .elfinder-navbar-root-network.elfinder-droppable-active .elfinder-cwd-icon,.elfinder-cwd-view-list .elfinder-navbar-root-network td .elfinder-cwd-icon,.elfinder-navbar-root-network .elfinder-cwd-icon{background-image:url(../img/volume_icon_network.svg);background-image:url(../img/volume_icon_network.png) \9;background-position:0 0;background-size:contain}.elfinder-cwd .elfinder-navbar-root-network.elfinder-droppable-active .elfinder-cwd-icon{background-position:1px -1px}.elfinder-cwd-icon:before{content:none;position:absolute;left:0;top:5px;min-width:20px;max-width:84px;text-align:center;padding:0 4px 1px;border-radius:4px;font-family:Verdana;font-size:10px;line-height:1.3em;-webkit-transform:scale(.9);-moz-transform:scale(.9);-ms-transform:scale(.9);-o-transform:scale(.9);transform:scale(.9)}.elfinder-cwd-view-icons .elfinder-cwd-icon.elfinder-cwd-bgurl:before{left:-10px}.elfinder-cwd-icon.elfinder-cwd-icon-mp2t:before{content:'ts'}.elfinder-cwd-icon.elfinder-cwd-icon-dash-xml:before{content:'dash'}.elfinder-cwd-icon.elfinder-cwd-icon-x-mpegurl:before{content:'hls'}.elfinder-cwd-icon.elfinder-cwd-icon-x-c:before{content:'c++'}.elfinder-cwd-icon.elfinder-cwd-bgurl{background-position:center center;background-repeat:no-repeat}.elfinder-cwd-icon.elfinder-cwd-bgurl,.elfinder-cwd-icon.elfinder-cwd-bgurl.elfinder-cwd-bgself{-moz-background-size:cover;background-size:cover}.elfinder-cwd-icon.elfinder-cwd-bgurl:after{content:' '}.elfinder-cwd-bgurl:after{position:relative;display:inline-block;top:36px;left:-38px;width:48px;height:48px;background-image:url(../img/icons-big.svg);background-image:url(../img/icons-big.png) \9;background-repeat:no-repeat;background-size:auto!important;opacity:.8;filter:Alpha(Opacity=60);-webkit-transform-origin:54px -24px;-webkit-transform:scale(.6);-moz-transform-origin:54px -24px;-moz-transform:scale(.6);-ms-transform-origin:54px -24px;-ms-transform:scale(.6);-o-transform-origin:54px -24px;-o-transform:scale(.6);transform-origin:54px -24px;transform:scale(.6)}.elfinder-cwd-icon.elfinder-cwd-icon-drag{width:48px;height:48px}.elfinder-cwd-icon-directory.elfinder-cwd-bgurl:after,.elfinder-cwd-icon-image.elfinder-cwd-bgurl:after,.elfinder-cwd-icon.elfinder-cwd-icon-drag:after,.elfinder-cwd-icon.elfinder-cwd-icon-drag:before{content:none}.elfinder-cwd .elfinder-droppable-active .elfinder-cwd-icon{background-position:0 -100px}.elfinder-cwd .elfinder-droppable-active{outline:2px solid #8cafed;outline-offset:-2px}.elfinder-cwd-icon-directory{background-position:0 -50px}.elfinder-cwd-icon-application,.elfinder-cwd-icon-application:after{background-position:0 -150px}.elfinder-cwd-icon-text,.elfinder-cwd-icon-text:after{background-position:0 -1350px}.elfinder-cwd-icon-plain,.elfinder-cwd-icon-plain:after,.elfinder-cwd-icon-x-empty,.elfinder-cwd-icon-x-empty:after{background-position:0 -200px}.elfinder-cwd-icon-image,.elfinder-cwd-icon-image:after,.elfinder-cwd-icon-vnd-adobe-photoshop,.elfinder-cwd-icon-vnd-adobe-photoshop:after{background-position:0 -250px}.elfinder-cwd-icon-postscript,.elfinder-cwd-icon-postscript:after{background-position:0 -1550px}.elfinder-cwd-icon-audio,.elfinder-cwd-icon-audio:after{background-position:0 -300px}.elfinder-cwd-icon-dash-xml,.elfinder-cwd-icon-flash-video,.elfinder-cwd-icon-video,.elfinder-cwd-icon-video:after,.elfinder-cwd-icon-vnd-apple-mpegurl,.elfinder-cwd-icon-x-mpegurl{background-position:0 -350px}.elfinder-cwd-icon-rtf,.elfinder-cwd-icon-rtf:after,.elfinder-cwd-icon-rtfd,.elfinder-cwd-icon-rtfd:after{background-position:0 -400px}.elfinder-cwd-icon-pdf,.elfinder-cwd-icon-pdf:after{background-position:0 -450px}.elfinder-cwd-icon-ms-excel,.elfinder-cwd-icon-ms-excel:after,.elfinder-cwd-icon-vnd-ms-excel,.elfinder-cwd-icon-vnd-ms-excel-addin-macroEnabled-12,.elfinder-cwd-icon-vnd-ms-excel-addin-macroEnabled-12:after,.elfinder-cwd-icon-vnd-ms-excel-sheet-binary-macroEnabled-12,.elfinder-cwd-icon-vnd-ms-excel-sheet-binary-macroEnabled-12:after,.elfinder-cwd-icon-vnd-ms-excel-sheet-macroEnabled-12,.elfinder-cwd-icon-vnd-ms-excel-sheet-macroEnabled-12:after,.elfinder-cwd-icon-vnd-ms-excel-template-macroEnabled-12,.elfinder-cwd-icon-vnd-ms-excel-template-macroEnabled-12:after,.elfinder-cwd-icon-vnd-ms-excel:after,.elfinder-cwd-icon-vnd-openxmlformats-officedocument-spreadsheetml-sheet,.elfinder-cwd-icon-vnd-openxmlformats-officedocument-spreadsheetml-sheet:after,.elfinder-cwd-icon-vnd-openxmlformats-officedocument-spreadsheetml-template,.elfinder-cwd-icon-vnd-openxmlformats-officedocument-spreadsheetml-template:after{background-position:0 -1450px}.elfinder-cwd-icon-vnd-oasis-opendocument-spreadsheet,.elfinder-cwd-icon-vnd-oasis-opendocument-spreadsheet-template,.elfinder-cwd-icon-vnd-oasis-opendocument-spreadsheet-template:after,.elfinder-cwd-icon-vnd-oasis-opendocument-spreadsheet:after{background-position:0 -1700px}.elfinder-cwd-icon-vnd-ms-powerpoint,.elfinder-cwd-icon-vnd-ms-powerpoint-addin-macroEnabled-12,.elfinder-cwd-icon-vnd-ms-powerpoint-addin-macroEnabled-12:after,.elfinder-cwd-icon-vnd-ms-powerpoint-presentation-macroEnabled-12,.elfinder-cwd-icon-vnd-ms-powerpoint-presentation-macroEnabled-12:after,.elfinder-cwd-icon-vnd-ms-powerpoint-slide-macroEnabled-12,.elfinder-cwd-icon-vnd-ms-powerpoint-slide-macroEnabled-12:after,.elfinder-cwd-icon-vnd-ms-powerpoint-slideshow-macroEnabled-12,.elfinder-cwd-icon-vnd-ms-powerpoint-slideshow-macroEnabled-12:after,.elfinder-cwd-icon-vnd-ms-powerpoint-template-macroEnabled-12,.elfinder-cwd-icon-vnd-ms-powerpoint-template-macroEnabled-12:after,.elfinder-cwd-icon-vnd-ms-powerpoint:after,.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-presentation,.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-presentation:after,.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-slide,.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-slide:after,.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-slideshow,.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-slideshow:after,.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-template,.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-template:after{background-position:0 -1400px}.elfinder-cwd-icon-vnd-oasis-opendocument-presentation,.elfinder-cwd-icon-vnd-oasis-opendocument-presentation-template,.elfinder-cwd-icon-vnd-oasis-opendocument-presentation-template:after,.elfinder-cwd-icon-vnd-oasis-opendocument-presentation:after{background-position:0 -1650px}.elfinder-cwd-icon-msword,.elfinder-cwd-icon-msword:after,.elfinder-cwd-icon-vnd-ms-word,.elfinder-cwd-icon-vnd-ms-word-document-macroEnabled-12,.elfinder-cwd-icon-vnd-ms-word-document-macroEnabled-12:after,.elfinder-cwd-icon-vnd-ms-word-template-macroEnabled-12,.elfinder-cwd-icon-vnd-ms-word-template-macroEnabled-12:after,.elfinder-cwd-icon-vnd-ms-word:after,.elfinder-cwd-icon-vnd-openxmlformats-officedocument-wordprocessingml-document,.elfinder-cwd-icon-vnd-openxmlformats-officedocument-wordprocessingml-document:after,.elfinder-cwd-icon-vnd-openxmlformats-officedocument-wordprocessingml-template,.elfinder-cwd-icon-vnd-openxmlformats-officedocument-wordprocessingml-template:after{background-position:0 -1500px}.elfinder-cwd-icon-vnd-oasis-opendocument-text,.elfinder-cwd-icon-vnd-oasis-opendocument-text-master,.elfinder-cwd-icon-vnd-oasis-opendocument-text-master:after,.elfinder-cwd-icon-vnd-oasis-opendocument-text-template,.elfinder-cwd-icon-vnd-oasis-opendocument-text-template:after,.elfinder-cwd-icon-vnd-oasis-opendocument-text-web,.elfinder-cwd-icon-vnd-oasis-opendocument-text-web:after,.elfinder-cwd-icon-vnd-oasis-opendocument-text:after{background-position:0 -1750px}.elfinder-cwd-icon-vnd-ms-office,.elfinder-cwd-icon-vnd-ms-office:after{background-position:0 -500px}.elfinder-cwd-icon-vnd-oasis-opendocument-chart,.elfinder-cwd-icon-vnd-oasis-opendocument-chart:after,.elfinder-cwd-icon-vnd-oasis-opendocument-database,.elfinder-cwd-icon-vnd-oasis-opendocument-database:after,.elfinder-cwd-icon-vnd-oasis-opendocument-formula,.elfinder-cwd-icon-vnd-oasis-opendocument-formula:after,.elfinder-cwd-icon-vnd-oasis-opendocument-graphics,.elfinder-cwd-icon-vnd-oasis-opendocument-graphics-template,.elfinder-cwd-icon-vnd-oasis-opendocument-graphics-template:after,.elfinder-cwd-icon-vnd-oasis-opendocument-graphics:after,.elfinder-cwd-icon-vnd-oasis-opendocument-image,.elfinder-cwd-icon-vnd-oasis-opendocument-image:after,.elfinder-cwd-icon-vnd-openofficeorg-extension,.elfinder-cwd-icon-vnd-openofficeorg-extension:after{background-position:0 -1600px}.elfinder-cwd-icon-html,.elfinder-cwd-icon-html:after{background-position:0 -550px}.elfinder-cwd-icon-css,.elfinder-cwd-icon-css:after{background-position:0 -600px}.elfinder-cwd-icon-javascript,.elfinder-cwd-icon-javascript:after,.elfinder-cwd-icon-x-javascript,.elfinder-cwd-icon-x-javascript:after{background-position:0 -650px}.elfinder-cwd-icon-x-perl,.elfinder-cwd-icon-x-perl:after{background-position:0 -700px}.elfinder-cwd-icon-x-python,.elfinder-cwd-icon-x-python:after{background-position:0 -750px}.elfinder-cwd-icon-x-ruby,.elfinder-cwd-icon-x-ruby:after{background-position:0 -800px}.elfinder-cwd-icon-x-sh,.elfinder-cwd-icon-x-sh:after,.elfinder-cwd-icon-x-shellscript,.elfinder-cwd-icon-x-shellscript:after{background-position:0 -850px}.elfinder-cwd-icon-x-c,.elfinder-cwd-icon-x-c--,.elfinder-cwd-icon-x-c--:after,.elfinder-cwd-icon-x-c--hdr,.elfinder-cwd-icon-x-c--hdr:after,.elfinder-cwd-icon-x-c--src,.elfinder-cwd-icon-x-c--src:after,.elfinder-cwd-icon-x-c:after,.elfinder-cwd-icon-x-chdr,.elfinder-cwd-icon-x-chdr:after,.elfinder-cwd-icon-x-csrc,.elfinder-cwd-icon-x-csrc:after,.elfinder-cwd-icon-x-java,.elfinder-cwd-icon-x-java-source,.elfinder-cwd-icon-x-java-source:after,.elfinder-cwd-icon-x-java:after{background-position:0 -900px}.elfinder-cwd-icon-x-php,.elfinder-cwd-icon-x-php:after{background-position:0 -950px}.elfinder-cwd-icon-xml,.elfinder-cwd-icon-xml:after{background-position:0 -1000px}.elfinder-cwd-icon-x-7z-compressed,.elfinder-cwd-icon-x-7z-compressed:after,.elfinder-cwd-icon-x-xz,.elfinder-cwd-icon-x-xz:after,.elfinder-cwd-icon-x-zip,.elfinder-cwd-icon-x-zip:after,.elfinder-cwd-icon-zip,.elfinder-cwd-icon-zip:after{background-position:0 -1050px}.elfinder-cwd-icon-x-gzip,.elfinder-cwd-icon-x-gzip:after,.elfinder-cwd-icon-x-tar,.elfinder-cwd-icon-x-tar:after{background-position:0 -1100px}.elfinder-cwd-icon-x-bzip,.elfinder-cwd-icon-x-bzip2,.elfinder-cwd-icon-x-bzip2:after,.elfinder-cwd-icon-x-bzip:after{background-position:0 -1150px}.elfinder-cwd-icon-x-rar,.elfinder-cwd-icon-x-rar-compressed,.elfinder-cwd-icon-x-rar-compressed:after,.elfinder-cwd-icon-x-rar:after{background-position:0 -1200px}.elfinder-cwd-icon-x-shockwave-flash,.elfinder-cwd-icon-x-shockwave-flash:after{background-position:0 -1250px}.elfinder-cwd-icon-group{background-position:0 -1300px}.elfinder-cwd-filename input{width:100%;border:none;margin:0;padding:0}.elfinder-cwd-view-icons,.elfinder-cwd-view-icons input{text-align:center}.elfinder-cwd-view-icons textarea{width:100%;border:0 solid;margin:0;padding:0;text-align:center;overflow:hidden;resize:none}.elfinder-cwd-wrapper.elfinder-cwd-fixheader .elfinder-cwd::after,.std42-dialog.elfinder-dialog-minimized .ui-dialog-titlebar select{display:none}.elfinder-cwd table{width:100%;border-collapse:separate;border:0 solid;margin:0 0 10px;border-spacing:0;box-sizing:padding-box;padding:2px;position:relative}.elfinder .elfinder-cwd table td div,.elfinder-cwd table td{box-sizing:content-box}.elfinder-cwd-wrapper-list.elfinder-cwd-fixheader{position:absolute;overflow:hidden}.elfinder-cwd-wrapper-list.elfinder-cwd-fixheader:before{content:'';position:absolute;width:100%;top:0;height:3px;background-color:#fff}.elfinder-droppable-active+.elfinder-cwd-wrapper-list.elfinder-cwd-fixheader:before{background-color:#8cafed}.elfinder .elfinder-workzone div.elfinder-cwd-fixheader table{table-layout:fixed}.elfinder-ltr .elfinder-cwd thead .elfinder-cwd-selectall{text-align:left;right:auto;left:0;padding-top:3px}.elfinder-rtl .elfinder-cwd thead .elfinder-cwd-selectall{text-align:right;right:0;left:auto;padding-top:3px}.elfinder-touch .elfinder-cwd thead .elfinder-cwd-selectall{padding-top:4px}.elfinder .elfinder-cwd table thead tr{border-left:0 solid;border-top:0 solid;border-right:0 solid}.elfinder .elfinder-cwd table thead td{padding:4px 14px}.elfinder-ltr .elfinder-cwd.elfinder-has-checkbox table thead td:first-child{padding:4px 14px 4px 22px}.elfinder-rtl .elfinder-cwd.elfinder-has-checkbox table thead td:first-child{padding:4px 22px 4px 14px}.elfinder-touch .elfinder-cwd table thead td,.elfinder-touch .elfinder-cwd.elfinder-has-checkbox table thead td:first-child{padding-top:8px;padding-bottom:8px}.elfinder .elfinder-cwd table thead td.ui-state-active{background:#ebf1f6;background:-moz-linear-gradient(top,#ebf1f6 0%,#abd3ee 50%,#89c3eb 51%,#d5ebfb 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebf1f6),color-stop(50%,#abd3ee),color-stop(51%,#89c3eb),color-stop(100%,#d5ebfb));background:-webkit-linear-gradient(top,#ebf1f6 0%,#abd3ee 50%,#89c3eb 51%,#d5ebfb 100%);background:-o-linear-gradient(top,#ebf1f6 0%,#abd3ee 50%,#89c3eb 51%,#d5ebfb 100%);background:-ms-linear-gradient(top,#ebf1f6 0%,#abd3ee 50%,#89c3eb 51%,#d5ebfb 100%);background:linear-gradient(to bottom,#ebf1f6 0%,#abd3ee 50%,#89c3eb 51%,#d5ebfb 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebf1f6', endColorstr='#d5ebfb', GradientType=0)}.elfinder .elfinder-cwd table td{padding:4px 12px;white-space:pre;overflow:hidden;text-align:right;cursor:default;border:0 solid}.elfinder .elfinder-cwd table tbody td:first-child{position:relative}tr.elfinder-cwd-file td .elfinder-cwd-select{padding-top:3px}.elfinder-mobile tr.elfinder-cwd-file td .elfinder-cwd-select{width:40px}.elfinder-touch tr.elfinder-cwd-file td .elfinder-cwd-select{padding-top:10px}.elfinder-touch .elfinder-cwd tr td{padding:10px 12px}.elfinder-touch .elfinder-cwd tr.elfinder-cwd-file td{padding:13px 12px}.elfinder-ltr .elfinder-cwd table td{text-align:right}.elfinder-ltr .elfinder-cwd table td:first-child{text-align:left}.elfinder-rtl .elfinder-cwd table td{text-align:left}.elfinder-ltr .elfinder-info-tb tr td:first-child,.elfinder-rtl .elfinder-cwd table td:first-child{text-align:right}.elfinder-odd-row{background:#eee}.elfinder-cwd-view-list .elfinder-cwd-file-wrapper{width:97%;position:relative}.elfinder-ltr .elfinder-cwd-view-list.elfinder-has-checkbox .elfinder-cwd-file-wrapper{margin-left:8px}.elfinder-rtl .elfinder-cwd-view-list.elfinder-has-checkbox .elfinder-cwd-file-wrapper{margin-right:8px}.elfinder-ltr .elfinder-cwd-view-list .elfinder-cwd-filename{padding-left:23px}.elfinder-rtl .elfinder-cwd-view-list .elfinder-cwd-filename{padding-right:23px}.elfinder-cwd-view-list .elfinder-lock,.elfinder-cwd-view-list .elfinder-perms,.elfinder-cwd-view-list .elfinder-symlink{margin-top:-6px;opacity:.6;filter:Alpha(Opacity=60)}.elfinder-cwd-view-list .elfinder-perms{bottom:-4px}.elfinder-cwd-view-list .elfinder-lock{top:0}.elfinder-cwd-view-list .elfinder-symlink{bottom:-4px}.elfinder-ltr .elfinder-cwd-view-list .elfinder-perms{left:8px}.elfinder-rtl .elfinder-cwd-view-list .elfinder-perms{right:-8px}.elfinder-ltr .elfinder-cwd-view-list .elfinder-lock{left:10px}.elfinder-rtl .elfinder-cwd-view-list .elfinder-lock{right:-10px}.elfinder-ltr .elfinder-cwd-view-list .elfinder-symlink{left:-7px}.elfinder-rtl .elfinder-cwd-view-list .elfinder-symlink{right:7px}.elfinder-cwd-view-list td .elfinder-cwd-icon{width:16px;height:16px;position:absolute;top:50%;margin-top:-8px;background-image:url(../img/icons-small.png)}.elfinder-ltr .elfinder-cwd-view-list .elfinder-cwd-icon{left:0}.elfinder-rtl .elfinder-cwd-view-list .elfinder-cwd-icon{right:0}.elfinder-cwd-view-list .elfinder-cwd-icon:after,.elfinder-cwd-view-list .elfinder-cwd-icon:before{content:none}.elfinder-cwd-view-list thead td .ui-resizable-handle{height:100%;top:6px}.elfinder-touch .elfinder-cwd-view-list thead td .ui-resizable-handle{top:-4px;margin:10px}.elfinder-cwd-view-list thead td .ui-resizable-e{right:-7px}.elfinder-cwd-view-list thead td .ui-resizable-w{left:-7px}.elfinder-touch .elfinder-cwd-view-list thead td .ui-resizable-e{right:-16px}.elfinder-touch .elfinder-cwd-view-list thead td .ui-resizable-w{left:-16px}.elfinder-cwd-wrapper-empty .elfinder-cwd-view-list.elfinder-cwd:after{margin-top:0}.elfinder-cwd-message-board{position:-webkit-sticky;position:sticky;width:100%;height:calc(100% - .01px);top:0;left:0;margin:0;padding:0;pointer-events:none;background-color:transparent}.elfinder-cwd-wrapper-trash .elfinder-cwd-message-board{background-image:url(../img/trashmesh.png)}.elfinder-cwd-message-board .elfinder-cwd-trash{position:absolute;bottom:0;font-size:30px;width:100%;text-align:right;display:none}.elfinder-rtl .elfinder-cwd-message-board .elfinder-cwd-trash{text-align:left}.elfinder-mobile .elfinder-cwd-message-board .elfinder-cwd-trash{font-size:20px}.elfinder-cwd-wrapper-trash .elfinder-cwd-message-board .elfinder-cwd-trash{display:block;opacity:.3}.elfinder-cwd-message-board .elfinder-cwd-expires{position:absolute;bottom:0;font-size:24px;width:100%;text-align:right;opacity:.25}.elfinder-rtl .elfinder-cwd-message-board .elfinder-cwd-expires{text-align:left}.elfinder-mobile .elfinder-cwd-message-board .elfinder-cwd-expires{font-size:20px}.std42-dialog{padding:0;position:absolute;left:auto;right:auto;box-sizing:border-box}.std42-dialog.elfinder-dialog-minimized{overFlow:hidden;position:relative;float:left;width:auto;cursor:pointer}.elfinder-rtl .std42-dialog.elfinder-dialog-minimized{float:right}.std42-dialog input{border:1px solid}.std42-dialog .ui-dialog-titlebar{border-left:0 solid transparent;border-top:0 solid transparent;border-right:0 solid transparent;font-weight:400;padding:.2em 1em}.std42-dialog.elfinder-dialog-minimized .ui-dialog-titlebar{padding:0 .5em;height:20px}.elfinder-touch .std42-dialog.elfinder-dialog-minimized .ui-dialog-titlebar{padding:.3em .5em}.std42-dialog.ui-draggable-disabled .ui-dialog-titlebar{cursor:default}.std42-dialog .ui-dialog-titlebar .ui-widget-header{border:none;cursor:pointer}.std42-dialog .ui-dialog-titlebar span.elfinder-dialog-title{display:inherit;word-break:break-all}.std42-dialog.elfinder-dialog-minimized .ui-dialog-titlebar span.elfinder-dialog-title{display:list-item;display:-moz-inline-box;white-space:nowrap;word-break:normal;overflow:hidden;word-wrap:normal;overflow-wrap:normal;max-width:-webkit-calc(100% - 24px);max-width:-moz-calc(100% - 24px);max-width:calc(100% - 24px)}.elfinder-touch .std42-dialog .ui-dialog-titlebar span.elfinder-dialog-title{padding-top:.15em}.elfinder-touch .std42-dialog.elfinder-dialog-minimized .ui-dialog-titlebar span.elfinder-dialog-title{max-width:-webkit-calc(100% - 36px);max-width:-moz-calc(100% - 36px);max-width:calc(100% - 36px)}.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-button{position:relative;float:left;top:10px;left:-10px;right:10px;width:20px;height:20px;padding:1px;margin:-10px 1px 0;background-color:transparent;background-image:none}.elfinder-touch .std42-dialog .ui-dialog-titlebar .elfinder-titlebar-button{-moz-transform:scale(1.2);zoom:1.2;padding-left:6px;padding-right:6px;height:24px}.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-button-right{float:right}.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-button.elfinder-titlebar-button-right{left:10px;right:-10px}.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-button .ui-icon{width:17px;height:17px;border-width:1px;opacity:.7;filter:Alpha(Opacity=70);-moz-border-radius:8px;-webkit-border-radius:8px;border-radius:8px}.elfinder-mobile .std42-dialog .ui-dialog-titlebar .elfinder-titlebar-button .ui-icon{opacity:.5;filter:Alpha(Opacity=50)}.std42-dialog.elfinder-dialog-minimized .ui-dialog-titlebar .elfinder-titlebar-button .ui-icon{opacity:1;filter:Alpha(Opacity=100)}.elfinder-spinner{width:14px;height:14px;background:url(../img/spinner-mini.gif) center center no-repeat;margin:0 5px;display:inline-block;vertical-align:middle}.elfinder-ltr .elfinder-info-tb span,.elfinder-ltr .elfinder-spinner,.elfinder-ltr .elfinder-spinner-text{float:left}.elfinder-rtl .elfinder-info-tb span,.elfinder-rtl .elfinder-spinner,.elfinder-rtl .elfinder-spinner-text{float:right}.elfinder-touch .std42-dialog.ui-dialog:not(ui-resizable-disabled) .ui-resizable-se{width:12px;height:12px;-moz-transform-origin:bottom right;-moz-transform:scale(1.5);zoom:1.5;right:-7px;bottom:-7px;margin:3px 7px 7px 3px;background-position:-64px -224px}.elfinder-rtl .elfinder-dialog .ui-dialog-titlebar{text-align:right}.std42-dialog .ui-dialog-content{padding:.3em .5em;box-sizing:border-box}.elfinder .std42-dialog .ui-dialog-content,.elfinder .std42-dialog .ui-dialog-content *{-webkit-user-select:auto;-moz-user-select:text;-khtml-user-select:text;user-select:text}.std42-dialog .ui-dialog-buttonpane{border:0 solid;margin:0;padding:.5em;text-align:right}.elfinder-rtl .std42-dialog .ui-dialog-buttonpane{text-align:left}.std42-dialog .ui-dialog-buttonpane button{margin:.2em 0 0 .4em;padding:.2em;outline:0 solid}.std42-dialog .ui-dialog-buttonpane button span{padding:2px 9px}.std42-dialog .ui-dialog-buttonpane button span.ui-icon{padding:2px}.elfinder-dialog .ui-resizable-e,.elfinder-dialog .ui-resizable-s{width:0;height:0}.std42-dialog .ui-button input{cursor:pointer}.std42-dialog select{border:1px solid #ccc}.elfinder-dialog-icon{position:absolute;width:32px;height:32px;left:10px;top:50%;margin-top:-15px;background:url(../img/dialogs.png) 0 0 no-repeat}.elfinder-rtl .elfinder-dialog-icon{left:auto;right:10px}.elfinder-dialog-confirm .ui-dialog-content,.elfinder-dialog-error .ui-dialog-content{padding-left:56px;min-height:35px}.elfinder-rtl .elfinder-dialog-confirm .ui-dialog-content,.elfinder-rtl .elfinder-dialog-error .ui-dialog-content{padding-left:0;padding-right:56px}.elfinder-dialog-error .elfinder-err-var{word-break:break-all}.elfinder-dialog-notify{top:36px;width:280px}.elfinder-ltr .elfinder-dialog-notify{right:12px}.elfinder-rtl .elfinder-dialog-notify{left:12px}.elfinder-dialog-notify .ui-dialog-titlebar{height:5px}.elfinder-dialog-notify .ui-dialog-titlebar-close,.elfinder-rm-title+br{display:none}.elfinder-dialog-notify .ui-dialog-content{padding:0}.elfinder-notify{border-bottom:1px solid #ccc;position:relative;padding:.5em;text-align:center;overflow:hidden}.elfinder-ltr .elfinder-notify{padding-left:36px}.elfinder-rtl .elfinder-notify{padding-right:36px}.elfinder-notify:last-child{border:0 solid}.elfinder-notify-progressbar{width:180px;height:8px;border:1px solid #aaa;background:#f5f5f5;margin:5px auto;overflow:hidden}.elfinder-notify-progress{width:100%;height:8px;background:url(../img/progress.gif) center center repeat-x}.elfinder-notify-progress,.elfinder-notify-progressbar{-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}.elfinder-dialog-icon-file,.elfinder-dialog-icon-open,.elfinder-dialog-icon-readdir,.elfinder-dialog-icon-reload{background-position:0 -225px}.elfinder-dialog-icon-mkdir{background-position:0 -64px}.elfinder-dialog-icon-mkfile{background-position:0 -96px}.elfinder-dialog-icon-copy,.elfinder-dialog-icon-move,.elfinder-dialog-icon-prepare{background-position:0 -128px}.elfinder-dialog-icon-chunkmerge,.elfinder-dialog-icon-upload{background-position:0 -160px}.elfinder-dialog-icon-rm{background-position:0 -192px}.elfinder-dialog-icon-download{background-position:0 -260px}.elfinder-dialog-icon-save{background-position:0 -295px}.elfinder-dialog-icon-chkcontent,.elfinder-dialog-icon-rename{background-position:0 -330px}.elfinder-dialog-icon-archive,.elfinder-dialog-icon-extract,.elfinder-dialog-icon-zipdl{background-position:0 -365px}.elfinder-dialog-icon-search{background-position:0 -402px}.elfinder-dialog-icon-chmod,.elfinder-dialog-icon-dim,.elfinder-dialog-icon-loadimg,.elfinder-dialog-icon-netmount,.elfinder-dialog-icon-netunmount,.elfinder-dialog-icon-preupload,.elfinder-dialog-icon-resize,.elfinder-dialog-icon-url{background-position:0 -434px}.elfinder-dialog-confirm-applyall,.elfinder-dialog-confirm-encoding{padding:0 1em;margin:0}.elfinder-ltr .elfinder-dialog-confirm-applyall,.elfinder-ltr .elfinder-dialog-confirm-encoding{text-align:left}.elfinder-rtl .elfinder-dialog-confirm-applyall,.elfinder-rtl .elfinder-dialog-confirm-encoding{text-align:right}.elfinder-dialog-confirm .elfinder-dialog-icon{background-position:0 -32px}.elfinder-dialog-confirm .ui-dialog-buttonset{width:auto}.elfinder-info-title .elfinder-cwd-icon{float:left;width:48px;height:48px;margin-right:1em}.elfinder-rtl .elfinder-info-title .elfinder-cwd-icon,.elfinder-rtl .elfinder-rm-title .elfinder-cwd-icon{float:right;margin-right:0;margin-left:1em}.elfinder-info-title strong{display:block;padding:.3em 0 .5em}.elfinder-info-tb{min-width:200px;border:0 solid;margin:1em .2em;width:100%}.elfinder-info-tb td{white-space:pre-wrap;padding:2px}.elfinder-info-tb td.elfinder-info-label{white-space:nowrap}.elfinder-info-tb td.elfinder-info-hash{display:inline-block;word-break:break-all;max-width:32ch}.elfinder-rtl .elfinder-info-tb tr td:first-child{text-align:left}.elfinder-info-tb a{outline:none;text-decoration:underline}.elfinder-info-tb a:hover{text-decoration:none}.elfinder-netmount-tb{margin:0 auto}.elfinder-netmount-tb .elfinder-button-icon,.elfinder-netmount-tb select{cursor:pointer}button.elfinder-info-button{margin:-3.5px 0;cursor:pointer}.elfinder-upload-dropbox{display:table-cell;text-align:center;vertical-align:middle;padding:.5em;border:3px dashed #aaa;width:9999px;height:80px;overflow:hidden;word-break:keep-all}.elfinder-upload-dropbox.ui-state-hover{background:#dfdfdf;border:3px dashed #555}.elfinder-upload-dialog-or{margin:.3em 0;text-align:center}.elfinder-upload-dialog-wrapper{text-align:center}.elfinder-upload-dialog-wrapper .ui-button{position:relative;overflow:hidden}.elfinder-upload-dialog-wrapper .ui-button form{position:absolute;right:0;top:0;width:100%;opacity:0;filter:Alpha(Opacity=0)}.elfinder-upload-dialog-wrapper .ui-button form input{padding:50px 0 0;font-size:3em;width:100%}.dialogelfinder .dialogelfinder-drag{border-left:0 solid;border-top:0 solid;border-right:0 solid;font-weight:400;padding:2px 12px;cursor:move;position:relative;text-align:left}.elfinder-rtl .dialogelfinder-drag{text-align:right}.dialogelfinder-drag-close{position:absolute;top:50%;margin-top:-8px}.elfinder-ltr .dialogelfinder-drag-close{right:12px}.elfinder-rtl .dialogelfinder-drag-close{left:12px}.elfinder-rm-title{margin-bottom:.5ex}.elfinder-rm-title .elfinder-cwd-icon{float:left;width:48px;height:48px;margin-right:1em}.elfinder-rm-title strong{display:block;white-space:pre-wrap;word-break:normal;overflow:hidden;text-overflow:ellipsis}.elfinder-font-mono{font-family:"Ricty Diminished","Myrica M",Consolas,"Courier New",Courier,Monaco,monospace;font-size:1.1em}.elfinder-contextmenu .elfinder-contextmenu-item span{font-size:.72em}.elfinder-cwd-view-icons .elfinder-cwd-filename,.elfinder-cwd-view-list td,.elfinder-statusbar div{font-size:.7em}.std42-dialog .ui-dialog-titlebar{font-size:.82em}.std42-dialog .ui-dialog-content{font-size:.72em}.std42-dialog .ui-dialog-buttonpane{font-size:.76em}.dialogelfinder .dialogelfinder-drag,.elfinder-info-tb{font-size:.9em}.elfinder-upload-dialog-or,.elfinder-upload-dropbox{font-size:1.2em}.elfinder .elfinder-navbar{font-size:.72em}.elfinder-place-drag .elfinder-navbar-dir{font-size:.9em}.elfinder-quicklook-title{font-size:.7em;font-weight:400}.elfinder-quicklook-info-data{font-size:.72em}.elfinder-quicklook-preview-text-wrapper{font-size:.9em}.elfinder-button-menu-item{font-size:.72em}.elfinder-button-search input{font-size:.8em}.elfinder-drag-num{font-size:12px}.elfinder-toast{font-size:.76em}.elfinder .elfinder-navbar{width:230px;padding:3px 5px;background-image:none;border-top:0 solid;border-bottom:0 solid;overflow:auto;position:relative}.elfinder .elfinder-navdock{box-sizing:border-box;width:230px;height:auto;position:absolute;bottom:0;overflow:auto}.elfinder-navdock .ui-resizable-n{top:0;height:20px}.elfinder-ltr .elfinder-navbar{float:left;border-left:0 solid}.elfinder-rtl .elfinder-navbar{float:right;border-right:0 solid}.elfinder-ltr .ui-resizable-e,.elfinder-touch .elfinder-quicklook-titlebar-icon.elfinder-titlebar-button-right .ui-icon{margin-left:10px}.elfinder-tree{display:table;width:100%;margin:0 0 .5em;-webkit-tap-highlight-color:rgba(0,0,0,0)}.elfinder-navbar-dir{position:relative;display:block;white-space:nowrap;padding:3px 12px;margin:0;outline:0 solid;border:1px solid transparent;cursor:default}.elfinder-touch .elfinder-navbar-dir{padding:12px}.elfinder-ltr .elfinder-navbar-dir{padding-left:35px}.elfinder-rtl .elfinder-navbar-dir{padding-right:35px}.elfinder-navbar-arrow,.elfinder-navbar-icon{position:absolute;top:50%;margin-top:-8px;background-repeat:no-repeat}.elfinder-navbar-arrow{display:none;width:12px;height:14px;background-image:url(../img/arrows-normal.png)}.elfinder-ltr .elfinder-navbar-arrow{left:0}.elfinder-rtl .elfinder-navbar-arrow{right:0}.elfinder-touch .elfinder-navbar-arrow{-moz-transform-origin:top left;-moz-transform:scale(1.4);zoom:1.4;margin-bottom:7px}.elfinder-ltr.elfinder-touch .elfinder-navbar-arrow{left:-3px;margin-right:20px}.elfinder-rtl.elfinder-touch .elfinder-navbar-arrow{right:-3px;margin-left:20px}.ui-state-active .elfinder-navbar-arrow{background-image:url(../img/arrows-active.png)}.elfinder-navbar-collapsed .elfinder-navbar-arrow{display:block}.elfinder-subtree-chksubdir .elfinder-navbar-arrow{opacity:.25;filter:Alpha(Opacity=25)}.elfinder-ltr .elfinder-navbar-collapsed .elfinder-navbar-arrow{background-position:0 4px}.elfinder-rtl .elfinder-navbar-collapsed .elfinder-navbar-arrow{background-position:0 -10px}.elfinder-ltr .elfinder-navbar-expanded .elfinder-navbar-arrow,.elfinder-rtl .elfinder-navbar-expanded .elfinder-navbar-arrow{background-position:0 -21px}.elfinder-navbar-icon{width:16px;height:16px;background-image:url(../img/toolbar.png);background-position:0 -16px}.elfinder-ltr .elfinder-navbar-icon{left:14px}.elfinder-rtl .elfinder-navbar-icon{right:14px}.elfinder-places .elfinder-navbar-root .elfinder-navbar-icon{background-position:0 -704px}.elfinder-tree .elfinder-navbar-root-box .elfinder-navbar-icon,.elfinder-tree .elfinder-navbar-root-dropbox .elfinder-navbar-icon,.elfinder-tree .elfinder-navbar-root-ftp .elfinder-navbar-icon,.elfinder-tree .elfinder-navbar-root-googledrive .elfinder-navbar-icon,.elfinder-tree .elfinder-navbar-root-local .elfinder-navbar-icon,.elfinder-tree .elfinder-navbar-root-network .elfinder-navbar-icon,.elfinder-tree .elfinder-navbar-root-onedrive .elfinder-navbar-icon,.elfinder-tree .elfinder-navbar-root-sql .elfinder-navbar-icon,.elfinder-tree .elfinder-navbar-root-trash .elfinder-navbar-icon,.elfinder-tree .elfinder-navbar-root-zip .elfinder-navbar-icon{background-position:0 0;background-size:contain}.elfinder-tree .elfinder-navbar-root-local .elfinder-navbar-icon{background-image:url(../img/volume_icon_local.svg);background-image:url(../img/volume_icon_local.png) \9}.elfinder-tree .elfinder-navbar-root-trash .elfinder-navbar-icon{background-image:url(../img/volume_icon_trash.svg);background-image:url(../img/volume_icon_trash.png) \9}.elfinder-tree .elfinder-navbar-root-ftp .elfinder-navbar-icon{background-image:url(../img/volume_icon_ftp.svg);background-image:url(../img/volume_icon_ftp.png) \9}.elfinder-tree .elfinder-navbar-root-sql .elfinder-navbar-icon{background-image:url(../img/volume_icon_sql.svg);background-image:url(../img/volume_icon_sql.png) \9}.elfinder-tree .elfinder-navbar-root-dropbox .elfinder-navbar-icon{background-image:url(../img/volume_icon_dropbox.svg);background-image:url(../img/volume_icon_dropbox.png) \9}.elfinder-tree .elfinder-navbar-root-googledrive .elfinder-navbar-icon{background-image:url(../img/volume_icon_googledrive.svg);background-image:url(../img/volume_icon_googledrive.png) \9}.elfinder-tree .elfinder-navbar-root-onedrive .elfinder-navbar-icon{background-image:url(../img/volume_icon_onedrive.svg);background-image:url(../img/volume_icon_onedrive.png) \9}.elfinder-tree .elfinder-navbar-root-box .elfinder-navbar-icon{background-image:url(../img/volume_icon_box.svg);background-image:url(../img/volume_icon_box.png) \9}.elfinder-tree .elfinder-navbar-root-zip .elfinder-navbar-icon{background-image:url(../img/volume_icon_zip.svg);background-image:url(../img/volume_icon_zip.png) \9}.elfinder-tree .elfinder-navbar-root-network .elfinder-navbar-icon{background-image:url(../img/volume_icon_network.svg);background-image:url(../img/volume_icon_network.png) \9}.elfinder-droppable-active .elfinder-navbar-icon,.ui-state-active .elfinder-navbar-icon,.ui-state-hover .elfinder-navbar-icon{background-position:0 -32px}.elfinder-ltr .elfinder-navbar-subtree{margin-left:12px}.elfinder-rtl .elfinder-navbar-subtree{margin-right:12px}.elfinder-tree .elfinder-spinner{position:absolute;top:50%;margin:-7px 0 0}.elfinder-ltr .elfinder-tree .elfinder-spinner{left:0;margin-left:-2px}.elfinder-rtl .elfinder-tree .elfinder-spinner{right:0;margin-right:-2px}.elfinder-navbar .elfinder-lock,.elfinder-navbar .elfinder-perms,.elfinder-navbar .elfinder-symlink{opacity:.6;filter:Alpha(Opacity=60)}.elfinder-navbar .elfinder-perms{bottom:-1px;margin-top:-8px}.elfinder-navbar .elfinder-lock{top:-2px}.elfinder-ltr .elfinder-navbar .elfinder-perms{left:20px;transform:scale(.8)}.elfinder-rtl .elfinder-navbar .elfinder-perms{right:20px;transform:scale(.8)}.elfinder-ltr .elfinder-navbar .elfinder-lock{left:20px;transform:scale(.8)}.elfinder-rtl .elfinder-navbar .elfinder-lock{right:20px;transform:scale(.8)}.elfinder-ltr .elfinder-navbar .elfinder-symlink{left:8px;transform:scale(.8)}.elfinder-rtl .elfinder-navbar .elfinder-symlink{right:8px;transform:scale(.8)}.elfinder-navbar input{width:100%;border:0 solid;margin:0;padding:0}.elfinder-navbar .ui-resizable-handle{width:12px;background:url(../img/resize.png) center center no-repeat}.elfinder-nav-handle-icon{position:absolute;top:50%;margin:-8px 2px 0;opacity:.5;filter:Alpha(Opacity=50)}.elfinder-navbar-pager{width:100%;box-sizing:border-box;padding-top:3px;padding-bottom:3px}.elfinder-touch .elfinder-navbar-pager{padding-top:10px;padding-bottom:10px}.elfinder-places{border:none;margin:0;padding:0}.elfinder-navbar-swipe-handle{position:absolute;top:0;height:100%;width:50px;pointer-events:none}.elfinder-ltr .elfinder-navbar-swipe-handle{left:0;background:linear-gradient(to right,#dde4eb 0,rgba(221,228,235,.8) 5px,rgba(216,223,230,.3) 8px,rgba(0,0,0,.1) 95%,rgba(0,0,0,0) 100%)}.elfinder-rtl .elfinder-navbar-swipe-handle{right:0;background:linear-gradient(to left,#dde4eb 0,rgba(221,228,235,.8) 5px,rgba(216,223,230,.3) 8px,rgba(0,0,0,.1) 95%,rgba(0,0,0,0) 100%)}.elfinder-navbar-root .elfinder-places-root-icon{position:absolute;top:50%;margin-top:-9px;cursor:pointer}.elfinder-ltr .elfinder-places-root-icon{right:10px}.elfinder-rtl .elfinder-places-root-icon{left:10px}.elfinder-navbar-expanded .elfinder-places-root-icon{display:block}.elfinder-place-drag{font-size:.8em}.elfinder-quicklook{position:absolute;background:url(../img/quicklook-bg.png);overflow:hidden;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:20px 0 40px}.elfinder-navdock .elfinder-quicklook{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;font-size:90%;overflow:auto}.elfinder-quicklook.elfinder-touch{padding:30px 0 40px}.elfinder-quicklook .ui-resizable-se{width:14px;height:14px;right:5px;bottom:3px;background:url(../img/toolbar.png) 0 -496px no-repeat}.elfinder-quicklook.elfinder-touch .ui-resizable-se{-moz-transform-origin:bottom right;-moz-transform:scale(1.5);zoom:1.5}.elfinder-quicklook.elfinder-quicklook-fullscreen{position:fixed;top:0;right:0;bottom:0;left:0;margin:0;box-sizing:border-box;width:100%;height:100%;object-fit:contain;border-radius:0;-moz-border-radius:0;-webkit-border-radius:0;-webkit-background-clip:padding-box;padding:0;background:#000;display:block}.elfinder-quicklook-fullscreen .elfinder-quicklook-titlebar,.elfinder-quicklook-fullscreen.elfinder-quicklook .ui-resizable-handle,.elfinder-statusbar:after,.elfinder-statusbar:before{display:none}.elfinder-quicklook-fullscreen .elfinder-quicklook-preview{border:0 solid}.elfinder-quicklook-cover,.elfinder-quicklook-titlebar{width:100%;height:100%;top:0;left:0;position:absolute}.elfinder-quicklook-cover.elfinder-quicklook-coverbg{background-color:#fff;opacity:.000001;filter:Alpha(Opacity=.0001)}.elfinder-quicklook-titlebar{text-align:center;background:#777;height:20px;-moz-border-radius-topleft:7px;-webkit-border-top-left-radius:7px;border-top-left-radius:7px;-moz-border-radius-topright:7px;-webkit-border-top-right-radius:7px;border-top-right-radius:7px;border:none;line-height:1.2}.elfinder-navdock .elfinder-quicklook-titlebar{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;cursor:default}.elfinder-touch .elfinder-quicklook-titlebar{height:30px}.elfinder-quicklook-title{display:inline-block;white-space:nowrap;overflow:hidden}.elfinder-touch .elfinder-quicklook-title{padding:8px 0}.elfinder-quicklook-titlebar-icon{position:absolute;left:4px;top:50%;margin-top:-8px;height:16px;border:none}.elfinder-touch .elfinder-quicklook-titlebar-icon{height:22px}.elfinder-quicklook-titlebar-icon .ui-icon{position:relative;margin:-9px 3px 0 0;cursor:pointer;border-radius:10px;border:1px solid;opacity:.7;filter:Alpha(Opacity=70)}.elfinder-quicklook-titlebar-icon .ui-icon.ui-icon-closethick{padding-left:1px}.elfinder-mobile .elfinder-quicklook-titlebar-icon .ui-icon{opacity:.6;filter:Alpha(Opacity=60)}.elfinder-touch .elfinder-quicklook-titlebar-icon .ui-icon{margin-top:-5px}.elfinder-quicklook-titlebar-icon.elfinder-titlebar-button-right{left:auto;right:4px;direction:rtl}.elfinder-quicklook-titlebar-icon.elfinder-titlebar-button-right .ui-icon{margin:-9px 0 0 3px}.elfinder-touch .elfinder-quicklook-titlebar .ui-icon{-moz-transform-origin:center center;-moz-transform:scale(1.2);zoom:1.2}.elfinder-touch .elfinder-quicklook-titlebar-icon .ui-icon{margin-right:10px}.elfinder-quicklook-preview{overflow:hidden;position:relative;border:0 solid;border-left:1px solid transparent;border-right:1px solid transparent;height:100%}.elfinder-navdock .elfinder-quicklook-preview{border-left:0;border-right:0}.elfinder-quicklook-preview.elfinder-overflow-auto{overflow:auto;-webkit-overflow-scrolling:touch}.elfinder-quicklook-info-wrapper{display:table;position:absolute;width:100%;height:100%;height:calc(100% - 80px);left:0;top:20px}.elfinder-navdock .elfinder-quicklook-info-wrapper{height:calc(100% - 20px)}.elfinder-quicklook-info{display:table-cell;vertical-align:middle}.elfinder-ltr .elfinder-quicklook-info{padding:0 12px 0 112px}.elfinder-rtl .elfinder-quicklook-info{padding:0 112px 0 12px}.elfinder-ltr .elfinder-navdock .elfinder-quicklook-info{padding:0 0 0 80px}.elfinder-rtl .elfinder-navdock .elfinder-quicklook-info{padding:0 80px 0 0}.elfinder-quicklook-info .elfinder-quicklook-info-data:first-child{color:#fff;font-weight:700;padding-bottom:.5em}.elfinder-quicklook-info-data{clear:both;padding-bottom:.2em;color:#fff}.elfinder-quicklook .elfinder-cwd-icon{position:absolute;left:32px;top:50%;margin-top:-20px}.elfinder-navdock .elfinder-quicklook .elfinder-cwd-icon{left:16px}.elfinder-rtl .elfinder-quicklook .elfinder-cwd-icon{left:auto;right:32px}.elfinder-rtl .elfinder-navdock .elfinder-quicklook .elfinder-cwd-icon{right:6px}.elfinder-quicklook .elfinder-cwd-icon:before{top:-10px}.elfinder-ltr .elfinder-quicklook .elfinder-cwd-icon:after,.elfinder-ltr .elfinder-quicklook .elfinder-cwd-icon:before{left:-20px}.elfinder-ltr .elfinder-navdock .elfinder-quicklook .elfinder-cwd-icon:before{left:-14px}.elfinder-ltr .elfinder-navdock .elfinder-quicklook .elfinder-cwd-icon:after{left:-12px}.elfinder-rtl .elfinder-quicklook .elfinder-cwd-icon:before{left:auto;right:40px}.elfinder-rtl .elfinder-quicklook .elfinder-cwd-icon:after{left:auto;right:46px}.elfinder-quicklook-preview img{display:block;margin:0 auto}.elfinder-quicklook-navbar{position:absolute;left:50%;bottom:4px;width:140px;height:32px;padding:0;margin-left:-70px;border:1px solid transparent;border-radius:19px;-moz-border-radius:19px;-webkit-border-radius:19px}.elfinder-quicklook-fullscreen .elfinder-quicklook-navbar{width:188px;margin-left:-94px;padding:5px;border:1px solid #eee;background:#000;opacity:.4;filter:Alpha(Opacity=40)}.elfinder-quicklook-fullscreen .elfinder-quicklook-navbar-icon-close,.elfinder-quicklook-fullscreen .elfinder-quicklook-navbar-separator{display:inline}.elfinder-quicklook-navbar-icon{width:32px;height:32px;margin:0 7px;float:left;background:url(../img/quicklook-icons.png) 0 0 no-repeat}.elfinder-quicklook-navbar-icon-fullscreen{background-position:0 -64px}.elfinder-quicklook-navbar-icon-fullscreen-off{background-position:0 -96px}.elfinder-quicklook-navbar-icon-prev{background-position:0 0}.elfinder-quicklook-navbar-icon-next{background-position:0 -32px}.elfinder-quicklook-navbar-icon-close{background-position:0 -128px;display:none}.elfinder-quicklook-navbar-separator{width:1px;height:32px;float:left;border-left:1px solid #fff;display:none}.elfinder-quicklook-preview-archive-wrapper,.elfinder-quicklook-preview-text-wrapper{width:100%;height:100%;background:#fff;color:#222;overflow:auto;-webkit-overflow-scrolling:touch}.elfinder-quicklook-preview-archive-wrapper{font-size:90%}.elfinder-quicklook-preview-archive-wrapper strong{padding:0 5px}pre.elfinder-quicklook-preview-text,pre.elfinder-quicklook-preview-text.prettyprint{width:auto;height:auto;margin:0;padding:3px 9px;border:none;-o-tab-size:4;-moz-tab-size:4;tab-size:4}.elfinder-quicklook-preview-charsleft hr{border:none;border-top:dashed 1px}.elfinder-quicklook-preview-charsleft span{font-size:90%;font-style:italic;cursor:pointer}.elfinder-quicklook-preview-html,.elfinder-quicklook-preview-iframe,.elfinder-quicklook-preview-pdf{width:100%;height:100%;background:#fff;margin:0;border:none;display:block}.elfinder-quicklook-preview-flash{width:100%;height:100%}.elfinder-quicklook-preview-audio{width:100%;position:absolute;bottom:0;left:0}embed.elfinder-quicklook-preview-audio{height:30px;background:0 0}.elfinder-quicklook-preview-video{width:100%;height:100%}.elfinder .elfinder-quicklook .elfinder-quicklook-info *,.elfinder .elfinder-quicklook .elfinder-quicklook-preview *{-webkit-user-select:auto;-moz-user-select:text;-khtml-user-select:text;user-select:text}.elfinder-statusbar{display:flex;justify-content:space-between;cursor:default;text-align:center;font-weight:400;padding:.2em .5em;border-right:0 solid transparent;border-bottom:0 solid transparent;border-left:0 solid transparent}.elfinder-path,.elfinder-statusbar span{overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis}.elfinder-statusbar span{vertical-align:bottom}.elfinder-statusbar span.elfinder-path-other{flex-shrink:0;text-overflow:clip;-o-text-overflow:clip}.elfinder-statusbar span.ui-state-active,.elfinder-statusbar span.ui-state-hover{border:none}.elfinder-statusbar span.elfinder-path-cwd{cursor:default}.elfinder-path{display:flex;order:1;flex-grow:1;cursor:pointer;white-space:nowrap;max-width:30%\9}.elfinder-ltr .elfinder-path{text-align:left;float:left\9}.elfinder-rtl .elfinder-path{text-align:right;float:right\9}.elfinder-workzone-path{position:relative}.elfinder-workzone-path .elfinder-path{position:relative;font-size:.75em;font-weight:400;float:none;max-width:none;overflow:hidden;overflow-x:hidden;text-overflow:initial;-o-text-overflow:initial}.elfinder-mobile .elfinder-workzone-path .elfinder-path{overflow:auto;overflow-x:scroll}.elfinder-ltr .elfinder-workzone-path .elfinder-path{margin-left:24px}.elfinder-rtl .elfinder-workzone-path .elfinder-path{margin-right:24px}.elfinder-workzone-path .elfinder-path span{display:inline-block;padding:5px 3px}.elfinder-workzone-path .elfinder-path span.elfinder-path-cwd{font-weight:700}.elfinder-workzone-path .elfinder-path span.ui-state-active,.elfinder-workzone-path .elfinder-path span.ui-state-hover{border:none}.elfinder-workzone-path .elfinder-path-roots{position:absolute;top:0;width:24px;height:20px;padding:2px;border:none;overflow:hidden}.elfinder-ltr .elfinder-workzone-path .elfinder-path-roots{left:0}.elfinder-rtl .elfinder-workzone-path .elfinder-path-roots{right:0}.elfinder-stat-size{order:3;flex-grow:1;overflow:hidden;white-space:nowrap}.elfinder-ltr .elfinder-stat-size{text-align:right;float:right\9}.elfinder-rtl .elfinder-stat-size{text-align:left;float:left\9}.elfinder-stat-selected{order:2;margin:0 .5em;white-space:nowrap;overflow:hidden}.elfinder .elfinder-toast{position:absolute;top:12px;right:12px;max-width:90%;cursor:default}.elfinder .elfinder-toast>div{position:relative;pointer-events:auto;overflow:hidden;margin:0 0 6px;padding:8px 16px 8px 50px;-moz-border-radius:3px 3px 3px 3px;-webkit-border-radius:3px 3px 3px 3px;border-radius:3px 3px 3px 3px;background-position:15px center;background-repeat:no-repeat;-moz-box-shadow:0 0 12px #999;-webkit-box-shadow:0 0 12px #999;box-shadow:0 0 12px #999;color:#fff;opacity:.9;filter:alpha(opacity=90);background-color:#030303;text-align:center}.elfinder .elfinder-toast>.toast-info{background-color:#2f96b4;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=)!important}.elfinder .elfinder-toast>.toast-error{background-color:#bd362f;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=)!important}.elfinder .elfinder-toast>.toast-success{background-color:#51a351;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==)!important}.elfinder .elfinder-toast>.toast-warning{background-color:#f89406;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=)!important}.elfinder .elfinder-toast>div button.ui-button{background-image:none;margin-top:8px;padding:.5em .8em}.elfinder .elfinder-toast>.toast-success button.ui-button{background-color:green;color:#fff}.elfinder .elfinder-toast>.toast-success button.ui-button.ui-state-hover{background-color:#add6ad;color:#254b25}.elfinder .elfinder-toast>.toast-info button.ui-button{background-color:#046580;color:#fff}.elfinder .elfinder-toast>.toast-info button.ui-button.ui-state-hover{background-color:#7dc6db;color:#046580}.elfinder .elfinder-toast>.toast-warning button.ui-button{background-color:#dd8c1a;color:#fff}.elfinder .elfinder-toast>.toast-warning button.ui-button.ui-state-hover{background-color:#e7ae5e;color:#422a07}.elfinder-toolbar{padding:4px 0 3px;border-left:0 solid transparent;border-top:0 solid transparent;border-right:0 solid transparent;max-height:50%;overflow-y:auto}.elfinder-buttonset{margin:1px 4px;float:left;background:0 0;padding:0;overflow:hidden}.elfinder .elfinder-button{min-width:16px;height:16px;margin:0;padding:4px;float:left;overflow:hidden;position:relative;border:0 solid;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;line-height:1;cursor:default}.elfinder-rtl .elfinder-button{float:right}.elfinder-touch .elfinder-button{min-width:20px;height:20px}.elfinder .ui-icon-search{cursor:pointer}.elfinder-toolbar-button-separator{float:left;padding:0;height:24px;border-top:0 solid;border-right:0 solid;border-bottom:0 solid;width:0}.elfinder-rtl .elfinder-toolbar-button-separator{float:right}.elfinder-touch .elfinder-toolbar-button-separator{height:28px}.elfinder .elfinder-button.ui-state-disabled{opacity:1;filter:Alpha(Opacity=100)}.elfinder .elfinder-button.ui-state-disabled .elfinder-button-icon,.elfinder .elfinder-button.ui-state-disabled .elfinder-button-text{opacity:.4;filter:Alpha(Opacity=40)}.elfinder-rtl .elfinder-buttonset{float:right}.elfinder-button-icon{width:16px;height:16px;display:inline-block;background:url(../img/toolbar.png) no-repeat}.elfinder-button-text{position:relative;display:inline-block;top:-4px;margin:0 2px;font-size:12px}.elfinder-touch .elfinder-button-icon{-moz-transform-origin:top left;-moz-transform:scale(1.25);zoom:1.25}.elfinder-touch .elfinder-button-text{-moz-transform:translate(3px,3px);top:-5px}.elfinder-button-icon-home{background-position:0 0}.elfinder-button-icon-back{background-position:0 -112px}.elfinder-button-icon-forward{background-position:0 -128px}.elfinder-button-icon-up{background-position:0 -144px}.elfinder-button-icon-dir{background-position:0 -16px}.elfinder-button-icon-opendir{background-position:0 -32px}.elfinder-button-icon-reload{background-position:0 -160px}.elfinder-button-icon-open{background-position:0 -176px}.elfinder-button-icon-mkdir{background-position:0 -192px}.elfinder-button-icon-mkfile{background-position:0 -208px}.elfinder-button-icon-rm{background-position:0 -832px}.elfinder-button-icon-trash{background-position:0 -224px}.elfinder-button-icon-restore{background-position:0 -816px}.elfinder-button-icon-copy{background-position:0 -240px}.elfinder-button-icon-cut{background-position:0 -256px}.elfinder-button-icon-paste{background-position:0 -272px}.elfinder-button-icon-getfile{background-position:0 -288px}.elfinder-button-icon-duplicate{background-position:0 -304px}.elfinder-button-icon-rename{background-position:0 -320px}.elfinder-button-icon-edit{background-position:0 -336px}.elfinder-button-icon-quicklook{background-position:0 -352px}.elfinder-button-icon-upload{background-position:0 -368px}.elfinder-button-icon-download{background-position:0 -384px}.elfinder-button-icon-info{background-position:0 -400px}.elfinder-button-icon-extract{background-position:0 -416px}.elfinder-button-icon-archive{background-position:0 -432px}.elfinder-button-icon-view{background-position:0 -448px}.elfinder-button-icon-view-list{background-position:0 -464px}.elfinder-button-icon-help{background-position:0 -480px}.elfinder-button-icon-resize{background-position:0 -512px}.elfinder-button-icon-link{background-position:0 -528px}.elfinder-button-icon-search{background-position:0 -561px}.elfinder-button-icon-sort{background-position:0 -577px}.elfinder-button-icon-rotate-r{background-position:0 -625px}.elfinder-button-icon-rotate-l{background-position:0 -641px}.elfinder-button-icon-netmount{background-position:0 -688px}.elfinder-button-icon-netunmount{background-position:0 -96px}.elfinder-button-icon-places{background-position:0 -704px}.elfinder-button-icon-chmod{background-position:0 -48px}.elfinder-button-icon-accept{background-position:0 -736px}.elfinder-button-icon-menu{background-position:0 -752px}.elfinder-button-icon-colwidth{background-position:0 -768px}.elfinder-button-icon-fullscreen{background-position:0 -784px}.elfinder-button-icon-unfullscreen{background-position:0 -800px}.elfinder-button-icon-empty{background-position:0 -848px}.elfinder-button-icon-undo{background-position:0 -864px}.elfinder-button-icon-redo{background-position:0 -880px}.elfinder-button-icon-preference{background-position:0 -896px}.elfinder-button-icon-mkdirin{background-position:0 -912px}.elfinder-button-icon-selectall{background-position:0 -928px}.elfinder-button-icon-selectnone{background-position:0 -944px}.elfinder-button-icon-selectinvert{background-position:0 -960px}.elfinder-button-icon-opennew{background-position:0 -976px}.elfinder-button-icon-hide{background-position:0 -992px}.elfinder-button-icon-text{background-position:0 -1008px}.elfinder-rtl .elfinder-button-icon-back,.elfinder-rtl .elfinder-button-icon-forward,.elfinder-rtl .elfinder-button-icon-getfile,.elfinder-rtl .elfinder-button-icon-help,.elfinder-rtl .elfinder-button-icon-redo,.elfinder-rtl .elfinder-button-icon-rename,.elfinder-rtl .elfinder-button-icon-search,.elfinder-rtl .elfinder-button-icon-undo,.elfinder-rtl .elfinder-button-icon-view-list,.elfinder-rtl .ui-icon-search{-ms-transform:scale(-1,1);-webkit-transform:scale(-1,1);transform:scale(-1,1)}.elfinder .elfinder-menubutton{overflow:visible}.elfinder-button-icon-spinner{background:url(../img/spinner-mini.gif) center center no-repeat}.elfinder-button-menu{position:absolute;margin-top:24px;padding:3px 0;overflow-y:auto}.elfinder-touch .elfinder-button-menu{margin-top:30px}.elfinder-button-menu-item{white-space:nowrap;cursor:default;padding:5px 19px;position:relative}.elfinder-touch .elfinder-button-menu-item{padding:12px 19px}.elfinder-button-menu .ui-state-hover{border:0 solid}.elfinder-button-menu-item-separated{border-top:1px solid #ccc}.elfinder-button-menu-item .ui-icon{width:16px;height:16px;position:absolute;left:2px;top:50%;margin-top:-8px;display:none}.elfinder-button-menu-item-selected .ui-icon{display:block}.elfinder-button-menu-item-selected-asc .ui-icon-arrowthick-1-s,.elfinder-button-menu-item-selected-desc .ui-icon-arrowthick-1-n{display:none}.elfinder-button form{position:absolute;top:0;right:0;opacity:0;filter:Alpha(Opacity=0);cursor:pointer}.elfinder .elfinder-button form input{background:0 0;cursor:default}.elfinder .elfinder-button-search{border:0 solid;background:0 0;padding:0;margin:1px 4px;height:auto;min-height:26px;width:70px;overflow:visible}.elfinder .elfinder-button-search.ui-state-active{width:220px}.elfinder .elfinder-button-search-menu{font-size:8pt;text-align:center;width:auto;min-width:180px;position:absolute;top:30px;padding-right:5px;padding-left:5px}.elfinder-ltr .elfinder-button-search-menu{right:22px;left:auto}.elfinder-rtl .elfinder-button-search-menu{right:auto;left:22px}.elfinder-touch .elfinder-button-search-menu{top:34px}.elfinder .elfinder-button-search-menu div{margin:5px auto;display:table}.elfinder .elfinder-button-search-menu div .ui-state-hover{border:1px solid}.elfinder-ltr .elfinder-button-search{float:right;margin-right:10px}.elfinder-rtl .elfinder-button-search{float:left;margin-left:10px}.elfinder-rtl .ui-controlgroup>.ui-controlgroup-item{float:right}.elfinder-button-search input[type=text]{box-sizing:border-box;width:100%;height:26px;padding:0 20px;line-height:22px;border:1px solid #aaa;-moz-border-radius:12px;-webkit-border-radius:12px;border-radius:12px;outline:0 solid}.elfinder-button-search input::-ms-clear{display:none}.elfinder-touch .elfinder-button-search input{height:30px;line-height:28px}.elfinder-rtl .elfinder-button-search input{direction:rtl}.elfinder-button-search .ui-icon{position:absolute;height:18px;top:50%;margin:-8px 4px 0;opacity:.6;filter:Alpha(Opacity=60)}.elfinder-button-search-menu .ui-checkboxradio-icon{display:none}.elfinder-ltr .elfinder-button-search .ui-icon-search{left:0}.elfinder-ltr .elfinder-button-search .ui-icon-close,.elfinder-rtl .elfinder-button-search .ui-icon-search{right:0}.elfinder-rtl .elfinder-button-search .ui-icon-close{left:0}.elfinder-toolbar-swipe-handle{position:absolute;top:0;left:0;height:50px;width:100%;pointer-events:none;background:linear-gradient(to bottom,#dde4eb 0,rgba(221,228,235,.8) 2px,rgba(216,223,230,.3) 5px,rgba(0,0,0,.1) 95%,rgba(0,0,0,0) 100%)}css/places.css000064400000001102151215013450007304 0ustar00/*********************************************/
/*               PLACES STYLES               */
/*********************************************/
/* root extra icon */
.elfinder-navbar-root .elfinder-places-root-icon {
    position: absolute;
    top: 50%;
    margin-top: -9px;
    cursor: pointer;
}

.elfinder-ltr .elfinder-places-root-icon {
    right: 10px;
}

.elfinder-rtl .elfinder-places-root-icon {
    left: 10px;
}

.elfinder-navbar-expanded .elfinder-places-root-icon {
    display: block;
}

/* dragging helper base */
.elfinder-place-drag {
    font-size: 0.8em;
}
css/navbar.css000064400000021711151215013450007316 0ustar00/*********************************************/
/*              NAVIGATION PANEL             */
/*********************************************/

/* container */
.elfinder .elfinder-navbar {
    width: 230px;
    padding: 3px 5px;
    background-image: none;
    border-top: 0 solid;
    border-bottom: 0 solid;
    overflow: auto;
    position: relative;
}

.elfinder .elfinder-navdock {
    box-sizing: border-box;
    width: 230px;
    height: auto;
    position: absolute;
    bottom: 0;
    overflow: auto;
}

.elfinder-navdock .ui-resizable-n {
    top: 0;
    height: 20px;
}

/* ltr/rtl enviroment */
.elfinder-ltr .elfinder-navbar {
    float: left;
    border-left: 0 solid;
}

.elfinder-rtl .elfinder-navbar {
    float: right;
    border-right: 0 solid;
}

.elfinder-ltr .ui-resizable-e {
    margin-left: 10px;
}

/* folders tree container */
.elfinder-tree {
    display: table;
    width: 100%;
    margin: 0 0 .5em 0;
    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}

/* folder */
.elfinder-navbar-dir {
    position: relative;
    display: block;
    white-space: nowrap;
    padding: 3px 12px;
    margin: 0;
    outline: 0px solid;
    border: 1px solid transparent;
    cursor: default;
}

.elfinder-touch .elfinder-navbar-dir {
    padding: 12px 12px;
}

/* ltr/rtl enviroment */
.elfinder-ltr .elfinder-navbar-dir {
    padding-left: 35px;
}

.elfinder-rtl .elfinder-navbar-dir {
    padding-right: 35px;
}

/* arrow before icon */
.elfinder-navbar-arrow {
    width: 12px;
    height: 14px;
    position: absolute;
    display: none;
    top: 50%;
    margin-top: -8px;
    background-image: url("../img/arrows-normal.png");
    background-repeat: no-repeat;
}

.elfinder-ltr .elfinder-navbar-arrow {
    left: 0;
}

.elfinder-rtl .elfinder-navbar-arrow {
    right: 0;
}

.elfinder-touch .elfinder-navbar-arrow {
    -moz-transform-origin: top left;
    -moz-transform: scale(1.4);
    zoom: 1.4;
    margin-bottom: 7px;
}

.elfinder-ltr.elfinder-touch .elfinder-navbar-arrow {
    left: -3px;
    margin-right: 20px;
}

.elfinder-rtl.elfinder-touch .elfinder-navbar-arrow {
    right: -3px;
    margin-left: 20px;
}

.ui-state-active .elfinder-navbar-arrow {
    background-image: url("../img/arrows-active.png");
}

/* collapsed/expanded arrow view */
.elfinder-navbar-collapsed .elfinder-navbar-arrow {
    display: block;
}

.elfinder-subtree-chksubdir .elfinder-navbar-arrow {
    opacity: .25;
    filter: Alpha(Opacity=25);
}

/* arrow ltr/rtl enviroment */
.elfinder-ltr .elfinder-navbar-collapsed .elfinder-navbar-arrow {
    background-position: 0 4px;
}

.elfinder-rtl .elfinder-navbar-collapsed .elfinder-navbar-arrow {
    background-position: 0 -10px;
}

.elfinder-ltr .elfinder-navbar-expanded .elfinder-navbar-arrow,
.elfinder-rtl .elfinder-navbar-expanded .elfinder-navbar-arrow {
    background-position: 0 -21px;
}

/* folder icon */
.elfinder-navbar-icon {
    width: 16px;
    height: 16px;
    position: absolute;
    top: 50%;
    margin-top: -8px;
    background-image: url("../img/toolbar.png");
    background-repeat: no-repeat;
    background-position: 0 -16px;
}

/* ltr/rtl enviroment */
.elfinder-ltr .elfinder-navbar-icon {
    left: 14px;
}

.elfinder-rtl .elfinder-navbar-icon {
    right: 14px;
}

/* places icon */
.elfinder-places .elfinder-navbar-root .elfinder-navbar-icon {
    background-position: 0 -704px;
}

/* root folder */
.elfinder-tree .elfinder-navbar-root-local .elfinder-navbar-icon,
.elfinder-tree .elfinder-navbar-root-trash .elfinder-navbar-icon,
.elfinder-tree .elfinder-navbar-root-ftp .elfinder-navbar-icon,
.elfinder-tree .elfinder-navbar-root-sql .elfinder-navbar-icon,
.elfinder-tree .elfinder-navbar-root-dropbox .elfinder-navbar-icon,
.elfinder-tree .elfinder-navbar-root-googledrive .elfinder-navbar-icon,
.elfinder-tree .elfinder-navbar-root-onedrive .elfinder-navbar-icon,
.elfinder-tree .elfinder-navbar-root-box .elfinder-navbar-icon,
.elfinder-tree .elfinder-navbar-root-zip .elfinder-navbar-icon,
.elfinder-tree .elfinder-navbar-root-network .elfinder-navbar-icon {
    background-position: 0 0;
    background-size: contain;
}

/* root icon of each volume "\9" for IE8 trick */
.elfinder-tree .elfinder-navbar-root-local .elfinder-navbar-icon {
    background-image: url("../img/volume_icon_local.svg");
    background-image: url("../img/volume_icon_local.png") \9;
}

.elfinder-tree .elfinder-navbar-root-trash .elfinder-navbar-icon {
    background-image: url("../img/volume_icon_trash.svg");
    background-image: url("../img/volume_icon_trash.png") \9;
}

.elfinder-tree .elfinder-navbar-root-ftp .elfinder-navbar-icon {
    background-image: url("../img/volume_icon_ftp.svg");
    background-image: url("../img/volume_icon_ftp.png") \9;
}

.elfinder-tree .elfinder-navbar-root-sql .elfinder-navbar-icon {
    background-image: url("../img/volume_icon_sql.svg");
    background-image: url("../img/volume_icon_sql.png") \9;
}

.elfinder-tree .elfinder-navbar-root-dropbox .elfinder-navbar-icon {
    background-image: url("../img/volume_icon_dropbox.svg");
    background-image: url("../img/volume_icon_dropbox.png") \9;
}

.elfinder-tree .elfinder-navbar-root-googledrive .elfinder-navbar-icon {
    background-image: url("../img/volume_icon_googledrive.svg");
    background-image: url("../img/volume_icon_googledrive.png") \9;
}

.elfinder-tree .elfinder-navbar-root-onedrive .elfinder-navbar-icon {
    background-image: url("../img/volume_icon_onedrive.svg");
    background-image: url("../img/volume_icon_onedrive.png") \9;
}

.elfinder-tree .elfinder-navbar-root-box .elfinder-navbar-icon {
    background-image: url("../img/volume_icon_box.svg");
    background-image: url("../img/volume_icon_box.png") \9;
}

.elfinder-tree .elfinder-navbar-root-zip .elfinder-navbar-icon {
    background-image: url("../img/volume_icon_zip.svg");
    background-image: url("../img/volume_icon_zip.png") \9;
}

.elfinder-tree .elfinder-navbar-root-network .elfinder-navbar-icon {
    background-image: url("../img/volume_icon_network.svg");
    background-image: url("../img/volume_icon_network.png") \9;
}

/* icon in active/hove/dropactive state */
.ui-state-active .elfinder-navbar-icon,
.elfinder-droppable-active .elfinder-navbar-icon,
.ui-state-hover .elfinder-navbar-icon {
    background-position: 0 -32px;
}

/* ltr/rtl enviroment */
.elfinder-ltr .elfinder-navbar-subtree {
    margin-left: 12px;
}

.elfinder-rtl .elfinder-navbar-subtree {
    margin-right: 12px;
}

/* spinner */
.elfinder-tree .elfinder-spinner {
    position: absolute;
    top: 50%;
    margin: -7px 0 0;
}

/* spinner ltr/rtl enviroment */
.elfinder-ltr .elfinder-tree .elfinder-spinner {
    left: 0;
    margin-left: -2px;
}

.elfinder-rtl .elfinder-tree .elfinder-spinner {
    right: 0;
    margin-right: -2px;
}

/* marker */
.elfinder-navbar .elfinder-perms,
.elfinder-navbar .elfinder-lock,
.elfinder-navbar .elfinder-symlink {
    opacity: .6;
    filter: Alpha(Opacity=60);
}

/* permissions marker */
.elfinder-navbar .elfinder-perms {
    bottom: -1px;
    margin-top: -8px;
}

/* locked marker */
.elfinder-navbar .elfinder-lock {
    top: -2px;
}

/* permissions/symlink markers ltr/rtl enviroment */
.elfinder-ltr .elfinder-navbar .elfinder-perms {
    left: 20px;
    transform: scale(0.8);
}

.elfinder-rtl .elfinder-navbar .elfinder-perms {
    right: 20px;
    transform: scale(0.8);
}

.elfinder-ltr .elfinder-navbar .elfinder-lock {
    left: 20px;
    transform: scale(0.8);
}

.elfinder-rtl .elfinder-navbar .elfinder-lock {
    right: 20px;
    transform: scale(0.8);
}

.elfinder-ltr .elfinder-navbar .elfinder-symlink {
    left: 8px;
    transform: scale(0.8);
}

.elfinder-rtl .elfinder-navbar .elfinder-symlink {
    right: 8px;
    transform: scale(0.8);
}

/* navbar input */
.elfinder-navbar input {
    width: 100%;
    border: 0px solid;
    margin: 0;
    padding: 0;
}

/* resizable */
.elfinder-navbar .ui-resizable-handle {
    width: 12px;
    background: transparent url('../img/resize.png') center center no-repeat;
}

.elfinder-nav-handle-icon {
    position: absolute;
    top: 50%;
    margin: -8px 2px 0 2px;
    opacity: .5;
    filter: Alpha(Opacity=50);
}

/* pager button */
.elfinder-navbar-pager {
    width: 100%;
    box-sizing: border-box;
    padding-top: 3px;
    padding-bottom: 3px;
}

.elfinder-touch .elfinder-navbar-pager {
    padding-top: 10px;
    padding-bottom: 10px;
}

.elfinder-places {
    border: none;
    margin: 0;
    padding: 0;
}

/* navbar swipe handle */
.elfinder-navbar-swipe-handle {
    position: absolute;
    top: 0px;
    height: 100%;
    width: 50px;
    pointer-events: none;
}

.elfinder-ltr .elfinder-navbar-swipe-handle {
    left: 0px;
    background: linear-gradient(to right,
    rgba(221, 228, 235, 1) 0,
    rgba(221, 228, 235, 0.8) 5px,
    rgba(216, 223, 230, 0.3) 8px,
    rgba(0, 0, 0, 0.1) 95%,
    rgba(0, 0, 0, 0) 100%);
}

.elfinder-rtl .elfinder-navbar-swipe-handle {
    right: 0px;
    background: linear-gradient(to left,
    rgba(221, 228, 235, 1) 0,
    rgba(221, 228, 235, 0.8) 5px,
    rgba(216, 223, 230, 0.3) 8px,
    rgba(0, 0, 0, 0.1) 95%,
    rgba(0, 0, 0, 0) 100%);
}
fonts/notosans/NotoSans-Regular.ttf000064400002222050151215013450013423 0ustar00FFTM��5�	$GDEFgQa����GPOSlh�Tp��GSUB*�[X�0��OS/2b��`cmaphNOK0gasp�|glyf��:���thead%�T�6hhea��D$hmtx>hr�IHloca,rB\OPILmaxpuh name����		post������`preph��OH�o}]_<���'6�'A���v
�C-������
�RRyQ��XK�X^2B���@ _)GOOG�
��-��C��� -X^M
H�A�<>?1�5�A,(,')<2)B(Ht
<1<Y<0<-<<?<7<,<1<2H<2<8<2��:�ax=�a,aa�=�aS(��kaa�a�a
=]a
=na%3,
�ZX�J6<&IPt
I<&���(1.gU�7g747Xg7jUN��UU�UjU]7gUg7�U�3ijO���'|'�| <2
H<[< <;<'�;D�@1e �(<2B(@1��7<2^^(oU�7H�^%x �'�"
�q��x=,a,a,a,aS(S(SS��a
=
=
=
=
=<@
=�Z�Z�Z�Z6]awU1.1.1.1.1.1.`.�747474747��L����]7jU]7]7]7]7]7<2]7jOjOjOjO�gU�1.1.1.x=�7x=�7x=�7x=�7�ag7�i7,a47,a47,a47,a47,a47�=g7�=g7�=g7�=g7�aj���j	S����S��S��S(S(Ud(N����kaUUWLaAaUaU
���ajU�ajU�ajU��ajU
=]7
=]7
=]7�=�6na�Una�>na�G%3�3%3�3%3�3%3�3,
i,
i,
i�ZjO�ZjO�ZjO�ZjO�ZjO�ZjO�6�6<&�'<&�'<&�'FUg	�
gagU{ZdRxx=�7�*
g3g7\F,<�;L6M������=:�U\ZS"kaU��Z���jU==h73=M7�
gUna%/�-<&e��i@
i,
Z�O%�Z@<&�'H#H7�"�:0H#�!�$KUP�+�A
Ha�a=7aaU	a�alU1.S��
=]7�ZjO�ZjO�ZjO�ZjO�ZjO431.1.q��`.�=g7�=g7ka��
=]7
=]7H#���a�a=7�=g7�a�a�ajU�1.q��`.
=]71.1.,Q47,a47S����S��
=]7
=]7nW�na�T�ZjO�ZjO%3�3,
i?&��aj���a_7�:T2<&�'1.,a47
=]7
=]7
=]7
=]76�}�U����7�7x=�7
,
�3�'����
a,a47�����=g7n
�
6�1Qg7ggU�!0g7g743433�+�!�!X7��g6g7>7����jQjUjU
LR@$z^��U�U�Q�Q�Uj��jUxU]7`78�6����U�UZRZ/U/U�3��������iij
]eQ����''�������7
=@UX->7}U��	�Ug7���7�77��^^�U[U�NUs��s���7�7���7

k7�L�g�����!!
�(�(�(y(((�(y(((BHBH�(�( �(�(,(�(�(�(���(J�77!X�N�N�N�N�N�N�N�(�(g�(�(K(K(M8(�(�(�(H(((((((����Y��l�0�e���s�������W�������d�d�������������������������������O���s�����������N�C�X�W�d�d�H�l� �1�N�0���o�:���N�C�C�����0�`���H���i���&�0�����H�H�X�Q���������d�������H������@����������~�������������������^���������avU�<�U�'���b�U�R�!�7�!���(���
H�
�



I
L���a�a
,a<&�a
=S(kaa�a�ap<
=�a]a<&,
6K3J5Z�S6o7�-`ULRVOo7eUL-�-�7`UR7LRUrU�7]7�XF�7f7�VO�7R�OAL��VO]7VOAka�UoP"
P�7ZU�=]7x=�7�aa�,0Q��	���XF�7��=�7�]agUx=�a�U]xx=x,a,a�
a�=%3S(S����a�
jabp�aga�aa�,aVL&bbja��a�a
=�a]ax=,
p$3J�a�P
aa�Za�aya1.W9@U�UE47��!�U�UUB�U}U]7pUgU�7���6xUeJ�U�U�
URU�DU/4747j	�U�7�3N����JvUj	U�U�rU��	z	�a�U�<�aU���aQUK�$Z�O=]7{{�=G75=�7=�:��<�7a3�5�8�����H����a�UgR	eagUa�U��aU�L&�!�a-UjaUj
	�o�a�U/a�U a_U=�7x=�7,	�6�6�w(^	��PmJ�P^J�ajUQ�Q�S(V��a0U�K�amU�a�U�PeJ�a�US(1.1.q��`.,a47�;43�;43V�L&�!H#�b�Ub�U
=]7=]7=]7y�p�p�p��PeJa�UZa
U�x&Jg>g7�>�6�#)&y#&�[�a�U�=�7�	�M5�+�J�)&a2U�p
=g7�jaU�2CakU�a�U�a�U��r��{��S�J�����GN�����$�U�))))�����23O�z�����IA3�:�.g*++8;�.VD�����,�(B��V����$�9���������%�g�T���(�j�W�Mg���[�c���N�����23�A3DU��.�.{�W�'K'�'T'Z'>'T'g'&'H'G�@=i������+�D3��?A;��������r�2����t�����3���3�k�T�T.5E�7b7����Uy��z	X1������2���1�P�E����� ���[�3���2)�������$$������3�*�*<*�W8�:)�$''��
-t/���
�`3@

;TVT$�V�!V[2V��VjVz;
#^^^�4'9z;z;�V�TQj&j(��
�'�!���V�
TV�V�5C�=���?�
�?i?i'�(�?�����?U?N?�?�?�(�&�?�?i�;]mm5�$2!�7�$o$o!:>�$�8[7`7�7�$8�&�&�7�
�3�`5JH
�7Q��$f�37�3J�7Q�.�$f�Qg��g7X�����j��g�����Z����i���"gU�7J*�@$Zg
T
]
gUg7X7U(�UjUgU�(�3�����'1.g7g747�+�!�3N�!��jO�!�	8$Y�$?�
����$�5��5������7�7`7`5����7�7�$�#7!����
���5�5J22`D	�$�U�C���H�l�h�l�h�&�&�������\������;�����]�K�n���������������������������������������������}�����m�^���������e�e���������]���H1.�agU�agU�agUx=�7�ag7�ag7�ag7�ag7�ag7,a47,a47,a47,a47,a47aX�=g7�ajO�ajU�aj���%j�ajUS����S��kaLkaUkaUaL����a��a���a�U�a�U�a�U�ajU�ajU�ajU�ajU
=]7
=]7
=]7
=]7]agU]agUna�Una�Ina�Ina���%3�3%3�3%3�3%3�3%3�3,
i,
i,
i,
i�ZjO�ZjO�ZjO�ZjO�ZjOX�X������JJ6�<&�'<&�'<&�'jUi�7.FUFF
�Z\-1.1.1.11.1.1.1.1.1.1.1.,a47,a47,a47,a47,&4,a47,a47,a47S(<S(N
=]7
=]7
=]7
=])
=]7
=]7
=]7=h7=h7=h7=h7=h7�ZjO�ZjOZ�OZ�OZ�OZ�OZ�O6�6�6�6��a�=P5\
��o7o7o7o7o7o7o7o7�
�
y
y
e
e
�
�
�-�-�-�-�-�-�
�
�
�
q
q
`U`U`L`K`U`U`>`?{
�
>
>
*
*
q
r
LBL8L��L��L��L��L��L���

�
�
�
�
�
�
]7]7]7]7]7]7q
{
4
4
 
 
VOVOVOVOVOVOVOVO
�
�
�
AAAAAAAA;
E
�
�
�
�
1
2
o7o7�-�-`U`ULLR]7]7VOVOAAo7o7o7o7o7o7o7o7�
�
y
y
e
e
�
�
`U`U`L`K`U`U`>`?{
�
>
>
*
*
q
r
AAAAAAAA;
E
�
�
�
�
1
2
o7o7o7o7o7o7o7�
�
)LR)�(�(`U`U`U`>`>�
�
�
�
�a�)�)�(L��L��L��L��L��L��SS

�L�L�(VOVOVAVOXFXFVOVO66 

�
�����(AAAAA�

]
I
��(L����M��<�d���+B(B(<(�(�(�('��������gg�gA<xMpD��HHHXX���,��������1-�'�'H'�����Z���6(6'E2�H��aav^B(��ADODW��H<$�^6X')�,]')t�O]<5'64=5�5�5'HH�XXXXX������������^�3^
^^^^^R#R#R#�>��7^^%^^^
^^^^^R#R#R#�>�mo$�$Xo!�7[7�7`7�7�77!�
<$<3<8<-<!�U<
LAS�
Ui7<<<�<<
�=`%x=m�"<O<
*;F
p7<a�� � x2�7= 5A](L6yj7D��"���	ajg�/ A6R
a�_@1D,�a
=h��Q�alaTa*8(^v&��SJLkaF�=k2�[8������a%"x�N�)ca	1(a	al�E6�$C	�	W W�o�c��,����0%%%>�%J[B
%6> >>#>0�%�!d'2R0

��]
na1.i�avU�a/U<&�'�=a�b�.�
a�U�7�5�]7�:����#3A"���������a���������������������������f�d���@����������t�r���}�q�x�x�����{���#�#�5�5�5�<�>�>���5d�L���z;5R���B<2�>�>;2<2'�'�MPMMPM�����(�4545=554�#A�<fHLH)J�<���+B�((��CfL�:>(�1�<�(J(�(�(�(�(Zt
<Ha>R�a�b<,A"�#A"�##-�-�,ZR�ZoP	=�"=�:�����cKa1U=D7�aLU��e�a>T�
�x����Ta�U
=]7	=w58=�7q+�����L��#C���������u�����`�V��BwB��E#3�+�&�!0K�HR���"��`uU"�V��aiUa�UC=�7=]7��7�u��Z(Z(Z(Z(Z(Z(Z(Z(�N�N�N�N�N�N�N�N�N�N�N�N�N�N�M5(e(i(Z(�F�F
H
H
H�(�(zFEF�1�+�aiUB
(O1-.+#n#N�O�(��.��.T�.}.�.}.x�!k
	kaUk
	iaYU
t�=�5C=�7]g��T
f	
=g7�=�7J-� �9B'^��
$�]
g
Zg<aU),����V4K5~"7�UPU U�U�U�A	W5�\�US9S9J0U\�U�\�Up7� �(H�2
Q
Q�a���5EavUg����7jU�
A6	��K�1O+�1X-�JO<�gf�il���#�R
L&�=a��Kx0k,!������^wU=�:�4j.��80�����C7!{x=%3<&�ag7%�(�.2�g#%V]3�aS(_�N�N}Nn(n(n(�C�93�cQ�c��/�(�,���������������������6:::::�9�:�[�Xa)��g�.�:6X
b5���z��UiUiU�,�,C-�6�C�C�5�5oP"WFUPU���xfiPi�P�T�'G��/��r�r��yiPH��7�����U6S[.�Og7c+�7���,<,P�ZZ���UH3�|����������w����������f��)�)�b�a�[..44a�a,aS(�Za�aZ����������\Z
G����<<�������a�a#jU1.47jO�J�E�������B��PJ����cc������
J......FJFFJF�J�J�J�H�J�J�J�D�J�J�JP/P/P/P/P/WJWWJ#%#%#��#��##%#��%#��#%#�����J�J�J�J�J�J�J����JoJoJoJoJoJoJx0x0x0x0x0x0x0x0x0x0x0�0�J�Jx0�J�J�J�J�)�)�)�)�)�)WE�����TETETETETETETETETETETE�����������.2a�a\6aa�f�?#"#I#/#'##0#(# #%#"K6�",8/;?8
<1?/H7�+&<-<<?<7�M:<2<1^^%^^^
^^^^^^^%^^^
^^^^^��89<�5�6q
q�5��<]lNNNN"&"(&&#'NNNN""&&(&#'%'.%%%NNNN%'%%%""#""""'%'%%%??NNNN%GGGGG3%%%%%%%%"%%-****+NNNN_)N�QItD�E�N~N~M�5�Mn;���U������������7U������P
�7W W�o����

�
�
�
�


1a�
�
�
�
�
�
�
�
�
�
X
X
D
D
�
�
��
�
v
v
b
b
�
�
�
�
o7o7o7o7o7o7o7o7L��L��L��L��Z��Z��Z��Z��Z��Z��Z��Z��VOVOVOeOeOeOeOeOeOeOeOmA�7
J�J7�J�WJx0#%�J��JoJ�-x0MJ�J�����0��E�0#%##���x0�0�JWJ�J�J�J�J�J�J�J�J�JWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJ#%#%#%#%#%#%#%#%#%#%#%#%#%###x0x0x0x0x0x0x0x0�J�J�����������������0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0333333333333zJzJzJzJzJzJzJzJzJzJzJzJ�0�0�0�0�0�0�0�0�0�0�0�0#%##���x0�0�JWJ�J�J�G�F�J�J�J�JWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJ#%#%#��#��#��#��#��#��##%#��#��#��#��##��x0x0x0x0x0x0x0x0�J�J�����������������0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0333333333333zJzJzJzJzJzJzJzJzJzJzJzJ�0�0�0�0�0�0�0�0�0�0�0�0H�())L�L�)�L�(�(�����(�(�(�(�)�(��))L�)�L�)�L�(�(�����(�(�(�(8Q�����$�U�))))����U��O�z����I�:�.g*8;�.V�,�(B��.���.[�_���<��IA3�]�.j*f4d��.^H�����(x��<H�.�[�_���<��IA3�]�.j*f4d��.^H����(x���23O�z�2�IA3�(�.g*+8;�.VD�����,�B�,+D�.��23O�z�2�IA3�(�.g*+8;�.VD�����,�B�,[�P_����^�Y��IIAA33�~�.j*�4d�.�H����x+,^HJ.#[�P_���^�Y�IA3�~�.j*�4d�.�H���x+,&&&&,,,,33AA33�G���$�$�$�������%�%�%�g�g�g�T�T�T�������(�(�(�j�j�j�W�W�W��������)))����������)))�����[������RR������IhAAA[[3R�����ulj���������g�8����^���Y����HLHMfM������� ������=���������.�.�.�.�.�.�.�.'X'8'R�����J�����J�����I�����I�����w�
�
�H�H�H�H�.�������.���������������IA3�����IA3����4�4��I�I��.�.��I�.�.�.�.��I��X��9�������.�.�M��-��V���%�g�T���(�j�W��$�����J�������%�g�T���(�j�W���$�����I�I�,�,��s�"<9FsbDb;_I'2.T1H�*'0'W'/'(''@'7','4'4&U&,'2'2'2Gdl�*d6'����,�x6'2�(�(8R8Q�S�Q$H'E'2T1'H������c�K�W� �A�F����
$$����R�)���������.�x@8
~w����/	�����EMWY[]}������� d q � � � �!_!�!�""%�,.R�����ʧ��9���.�k���/������
 �z�����	����� HPY[]_�������  f t � � �!!�!�""%�,`-�@��§��0��.�0��� ���������������������������������������������������Q�B�������F��c�c�c�cmc=b�bi`h�
�
���
	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abc���������������������������������tfgk�z�rm	dxl��uiy{n~d���epVo�d�����������<�	-�����{���������������������s���|��������((((((d�����H���� @�� ��L���h��		,	�
�
�8��(���
(
d
�
�p� t�T�<h���(Dt�T�t�@��`x� t�L�`��X��p��44p�8�@L  p � � �!�!�!�","�"�#$#x#�#�$$D$�$�%H%�&�'','D'\'t'�'�'�(((4(L(d(|(�(�(�)),)D)\)t)�)�)�*d*|*�*�*�*�+(+�+�+�,,$,<,T--$-<-T-l-�-�-�-�-�.p.�.�.�.�.�//\/�/�00$0<0T0�0�0�11(1@1X1p1�1�1�1�1�22202H2�2�3\3t3�3�3�3�3�44�4�4�4�4�55$5<5T5l66$6<6�6�6�77(7@7X7p7�7�7�7�7�88808H8`8�8�8�8�99H9�9�9�9�::0:H:`:x:�:�:�;(;�;�;�;�;�<<<�=$=<=T=l=�=�=�=�=�=�>>,>D>\>t>�>�>�?,?`?�?�?�@@@4@L@d@|@�@�A A8APAhA�A�A�A�A�A�BB(B@B|B�C|C�C�DLD�EExE�FF`F�GG�G�G�HpH�I8I�J0J�J�KKtK�LL�L�M\MlM|M�N`N�OTO�PLP�Q Q�Q�RR|R�S SdS�T T�T�U$U�U�V V0V�V�W\W�XXtX�Y4YLYdY�Y�Y�Y�ZZ(Z@ZXZpZ�Z�Z�Z�Z�[[[0[H[`[�\x]]�^h__�`X`h`�a�b4b�b�cc|dd d8dPdhd�d�d�d�d�ee e8ePehe�e�e�fHf`fxgg�hhh4hLhdh|h�h�h�h�h�ii$i<iTili�i�i�i�i�i�jj,jDj\jtj�j�j�j�j�khk�k�llXmm�nnhnxn�n�n�n�o|pp�q\qtq�rr�r�r�s$s�t tXt�u�vv�ww4wxx(x�x�yy�y�zz\z�{@{�|<|�}$}t}�~8~�,��,������0������������(�p��$���������X����,�\����T�������h���������h�����\����H�������������X�����P����L��� �L���� ����L������l���T�����8�T���<��������8�����$�����<�p���\�����T�����4�|���H�X�h�x���������<����������T������������ �4�H�l��������������<�h�����@�������X�t����X�x��������$�D�X�l�|��������T�h����������(�D�`������������ �4�P�d�t����������$�H������,�<�L�\�p����������8�X�x��������H�\�p�����������8�L�`�t��������������$�@�`��������L���������������4�H�\�x���h����4���$�4������D��������������� �4�������L�����$�d°��\ü��<�tĤ������@�`ŀŐŠ�������(�8�Xƴ�������(�@�X�pLjǘǨ�����,�<Ȥȴ����� �X�hɌɜ�����ʀʐ���T�l˄˜˴������x��H���X����tϬϼ�<Ш��рѐ���8Ҥ��DӔ��t���P�hՀ՘հ���,��ׄ������ؘ��Xٴ��xڤ���T���<ܜ� ݰ���������� �0�|��0�@�X�p߈ߠ���p�����@������������$�D�����l��$�X���������$�4����H����@����8��������`�p��0�t����T�������� �D�T�d�t�����L���� ����,�D�\�����P�`�p����T�d�|���D���8�����P����\���$�����x�����������T����l�����D�\����|h�X�� T����P�		�	�	�

@
�d�\�
8
t
�D���8p��@�d�Dp���D���4�� t��H�X��h�D�P��(`��P��(���p� d t � � � � �!!X!�!�!�!�""("@"P"`"x"�"�"�"�"�## #8#P#h#�#�#�#�$$X$�%%\%�%�& &0&�','�( (�(�)l)�**\*�++`+�,,(,�--�-�.0.�//�/�/�/�/�040|11�22|2�2�3(3x3�44�4�5�5�6`6�77\7�7�8�9d::�:�;T<<�=�=�=�>T>l>�>�>�>�?d@,@p@�A�BB�CDDD�EEpE�F�F�GXG�HxI IdI|I�JhJ�KpK�L$L�MM�NPNhN�OpO�PxQQ0QHQtQ�RR(R�R�S SdS�TT\T�T�UU$U<UTU�U�U�V�V�WW4WPW�W�X,XDX\XtX�X�X�X�X�Y�Z�[�\`\|\�\�]�]�^�_0_�`d`�a(a�bb0bHb`bxb�b�b�c,c�dtd�e0e|ff�f�g<g�hhxh�i�i�i�jj<j�k$k8k�k�l`mmLm�m�nnLn�n�oDoho�o�o�o�pLplp�p�p�qqDqXqtq�r,rpr�r�sTs�tt`t�uTvv�w�x�x�ytz$z�{�|(|�|�|�}X}l}�}�~~�4����@�����$�\������l����d������4�l�����H�l�����p������������$�X�|�����$�l�����������p������8�X�����(�x���8�������T���<���`���,�����P���8�t����x����H�|���,�l����D���4�t���`����D�����@�����<���4��������H���t�����(����D���P�����\���<���T���d�������������� �����,���d����(���H���$����x���D���L����H����P�������d�������p���4����� ����`����p�����0�X ��Xð�Ā���0�P�pŐŰ����8�Tƌ����$DŽ���H�`�ɐ��|���`���$�d̜̀��� �X͠���PΈΰ�$τ��XР�(р���8Ҁ��Ӝ�(ԤԸ��� �L�pՄ���P֔��$�<�T�lׄל״������$�<�T�l؄؜�ٴ�����@���,ۼ�������<�\�t܌ܤܼ�������4�L�d�|ݔݬ�����l�����,�D�\�tߌߤ�������,�D�\�t����������4�L�d�|��L�����(��0��������(�@�X�p���������(�@����d����������4�L�d�|����������,��D�\�t����������4�L�d�|����������$�<�T�l����������,�D����T�d�|�����`�$�����8����������|�8�����0��������������d�L��L<\�4Ld|�	D	�
�4��
x8Xx����� 8Ph��������0H`x����<��0l�H�$<Tt����,Dd����4Tt����$Dd|����4Tl����$D\t����$<Tt����,Dd�����4Tt����$Dd|����  , L l � � � � �!!<!\!|!�!�!�!�"""4"L"d"|"�"�"�"�"�##,#L#t#�#�#�$$<$\$|$�$�$�%%D%l%�%�%�%�&&8&`&�&�&�&�''<'d'�'�'�'�((D(l(�(�(�))$)L)t)�)�)�**,*D*d*|*�*�*�*�+++4+L+\+�+�+�,,,4,T,l,�,�,�,�,�---0-H-`-x-�-�-�-�-�..(.@.X.p.�.�.�.�.�///0/P/h/�/�/�/�0$040T0t0�0�0�0�0�11,1D1\1l1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�22 202L2d2|2�2�2�2�3$383d3�3�44P4�4�4�55$5<5\5p5p5p5�5�5�66,6,6�88,8D8�8�8�8�8�99@:::�:�:�;;4;X;h;�;�;�;�<<(<L<�<�<�==T=l=�=�>4>d>�??(?�?�@H@�A�A�BxBxBxBxBxBxBxBxBxBxBxB�B�B�C CTC�C�DDPD�E,EPE�FXF�F�F�F�G,GlG�G�G�G�G�G�G�HH H4HHH\HpH�H�IIdI�I�J8J|J�J�K4KtK�LLL�L�M�N$N\N�O<O�P@P�QpQ�Q�RhR�R�S�T@T�UPU�VdV�W0XHX|X�Y0Y�ZPZ�[[�[�\�]h]�]�^X^�_�_�_�_�`�bhc�c�d0d�e|fPgtg�h�h�iLi�j�kLk�m�n�olo�pPp�qLq�rr@r�r�s,ttLt\ttvv�w`w�y(z�z�||�}$}\}�}�}�~L~�|���\����4�T�����p��h���L�����h������� �L��������0�T�x���h�x�p�,�H�X�|��������x���<���P�`�����D�x��������8�H���t��� �D���<���(�P��������x�����0�l����<�x������t������8�t�����$�p���4�����@����L����8�x�������<�`���T���t��������$�L�t�����L����,��������(�D��� �D�h���������<��������T���$�����X�l��������8�d��� �8�X���T����@�������$������X�����D�t���D�p�����(��������x������l���`�Đ���HŜ���HƠ��x���TȠ���`���0ʌ���Pˀ˰��\̼��\Ͱ���8���`ψϠ�\ҌӴ��Ԉ���0�h���X֠���H�|������@ؔ�ِ�0���4ۜ�<���(ݐ���ހ���8߈��� �|���\������x���(�h���,�`������<�p����8�p�����P������$�H�d�����4�T�t�����,�X�� �X����H�`���L���p�����4���(��,�������L�d�|��� �t���4�������$�L���,�D������\���H���`��|����0t� �� �X�X�8�L��h�D�		h	�

�
�L�4�

�
�� ���|�P��� <X��(t� ��\�|�$�<��(��\�8���Xh�X�� ( L �!,!�!�!�!�"0"�##�$$T$�%\&&�'X'�(H(�))�**@*d*�*�+d+�+�,,X,�--4-\-�-�-�.$.x.�/(/�/�0P0�1H1�2D2�3@3�44�55�5�6<6�747�7�7�7�8�9�:T;;�;�;�<L=<=T=�>>�?X?�@L@�A8BB�C4C�D<D�ELE�F�GG�HlII�JlJ�K KTK�L<L�MM�M�NNxOO�O�O�P�QQ|Q�R$RxR�S8S�TTtT�UU�V,V�W(W�X0X�Y�Y�ZZ0ZHZ`ZxZ�Z�[,\\\8\d\�\�\�]] ]L]x]�]�]�]�^^8^`^`_�`�`�`�aha�b�b�cpc�c�c�c�c�ddd0dHd`dxd�d�d�e8ePehe�e�e�fff4fLfdf�f�f�f�ggg�g�hHh`hxh�h�h�h�h�ii i8iPi�i�i�i�jj$j<jTjlj�j�j�j�kk0k�k�k�ll,lDl\l�l�l�mm4mLmdm|m�m�m�m�m�nn4n�n�n�o0oHoxo�o�pp p8pPphp�p�p�p�p�p�q,qDq�q�q�rrXr�r�r�s<s�s�s�ttxt�t�uuu4uLudu|u�v v8vPv�wwPw�w�xx,x�yy(y@yXypzztz�z�z�z�{D{�{�{�{�{�{�||(|�|�|�|�}p}�}�}�}�~~0~H~`~x~�~�~�~� 0HXh����$�<�X����������������� �0�x����|���(�����h���4�h���<�����p���4���$�8�L�`�t���������������(�<�P�d�x����������|����$�`������������T�������(�P�t������� �L�p��������D�l������� �P�x�������$�P�t������� �L�t��������8�d��������0�X��������� �L�x��������@�l��������@�l��������@�h��������D�t��������D�p��������D�t��������8�d��������@�p��������4�`��������0�X��������4�\��������,�T��������$�P�x������� �H�p���8��������\������\�������,�<�T�����(�8�P������$�<�d�������0�H�h��������(�P�x��������� �H�p����������@�h���������0�H�h���������� �8� �������� �D�h���������p����h����������(�@�����t�0�T�x�����X��������X�h�x��������D�T�d�����������(�8�H��������������������(�8�H�X°���������� �0�@�P�`�pÀØð�������(�@�X�pĈĠİ���������� �0�@�P�`�pŀŐŠŰ��������0�H�`�xƐƨ�������� �0�@�P�`�pǀǐǠǰ��������(�8�H�X�h�xȈȘȨȸ����������(�8�H�X�h�xɐɨ���������� �0�@�P�`�pʈʠʸ�������0�H�`�xː˨������� �8�P�h̘̰̀�������(�@�X�p͈͠͸�������0�H�`�xΐΨ������� �8�P�hπϘϰ�������(�H�hЈШ�������0�H�`�xјѸ���� �H�pҘ����� �8�X�xӘӸ�������8�X�xԘԸ������ �8�X�x՘ո����0�Xր֨�������0�L�h׈ר������� �8�P�p؈ؠ����� �8�P�hـٰ٘������0�P�pڈڠڸ�������8�P�hۈۨ������(�@�X�p܈ܨ������0�X݀ݨ�����0�P�pސް����(�P�xߠ������8�X������ �H�h�������(�P�x�������$�4�D�T�d�|�����������$�4�D�\�l�|�����������$�<�L�\�t��������������<�T�l���������4�T�t���������,�D�\�t����������4�L�d�|��������\�@����,��h�� �8��`�����(�@�X�p���,���P����\���\�����<���x���d���T��������\�t�������������4�L�d�|������������,�D�\�t����������4L�Ph�x��x����P�,�	h	�

�0� ��
,
D
�D�H�h8��0H`x�p�����h������$<Tl���Tl�����\���h��� l �!!(!@!X!p!�!�!�","|"�##�#�$@$�%<%�&$&|&�'$'<'�(,(�) )8**t+d+�,, ,8,P-\-t.p.�.�.�/|0L182$2<2T2l2�2�2�2�2�33343L3d3�3�3�3�4�5t6P7(88�9�:�;�<�=�>�?�@�ApB`B�C�D�EtF<GG�H�IhJPKDL@LXMHN8O(PPTP�QQ,QDQ\QtQ�R�R�SS�TTtUU\U�V<V�WDW�XXX4XLXdX|X�X�X�X�X�YY$Y<YTY�Y�Y�ZZZ0ZHZ`ZxZ�Z�Z�Z�Z�[[0[P[p[�[�[�[�\\0\�]�__�`�a�b�c�c�d�e�f\g(g�h�itjdk,k�l�m�n�o�p�q�r�s�s�t@uu�v�w�xtytz4{T|h}�~���h����X�p�$�������\�����4�D���`�����X�@�X�P������l�(�������L�P�h�h�X�4����������L���������������d������,�L�d���D�\������������<���H�����H�����D�����H�����P�h��������������(�@�X�p���t���p���l���p���t���|� ���d����<�����$���l���`�����4�L���H���`�������� �8�P�h���������������0„�����l�|� ���Hż�D���p������l�ʨ�H�`�x���`���X��(ΰ��h���l�4�(�t��,�x���\����� Ք�@�� �4�D����|���P���`��܀ܘ�<��ބ�d���X���D����0����,���`���0�H����L��4�L�d�|��`�$����p�8�����`�0������L����L�,�h������������L�t���������P����T���H�d���X|����Xt�$$@\���@��<L����		(	@	X	p	�	�	�	�	�


t
�l�,�
�|p�t^��3!%!!^���5���63dH����7#34632#"&�9kt$%%$��l%%$  A�W�#!#�77����l�3##7##7#537#5373373337#���)G)�'F&~� ��(H(�(E(�����C����C�B����B��>���")07.'55.546753.'#>54&'�7h "j3c\gX@5W$ M(BX-h_@63-<@;60A1U�RGJTXWJ
�+?2FW
o�*!(+��+"&'1���%/2#"&546#"32542#"&546"3254�JLIMGKF�tM���&##&MhIMIMGKFL&##&M�ujjwwjju
�6�4QPPR���ujjwwjju?PPQQ��5����+52>73#'#"&5467.546">54&32670P]Q>�!Y0&�wW/tSgzSG 7cR*5&$;30R6=J>@\�QI?X$�Q/@n)�T*4f^M]($R7JRH,'$=%"=($.�� B67B*A���#�7��(�b�
4673#.(GLSFGGERLGz�[^�wt�^X��b�
#>54&'3GLREGGFSLGy�X^�tw�^[�)6��7''7'7'B��wVUMYu����6\�/��/�\6�2oS3##5#5353A��H��H�G��G�)��t7#>73�
1A^i569�4(�3753(��NNH���y74632#"&H$%%$6%%$  
j�	#j��V
�6�1���
#"&54>3232654&#"0hVys/hUxv�~CQPEEPQCfs�Xít�W���������Yc�!#467'73cVL.�I�+4>;�0�)57>54&#"'>32!�(�6J&F84O)/*mDdt.R7�iI�6TQ0;=$ ;#1eY8b_6�-���*#"&'532654&+532654&#"'>32�PDVT:y_8`,-h0`Ui_EFX[F<:R(,&qHpm#HU
XG>a6RKBC;KJ=49"<,d(�
%##5!533'467#!(hU��P[h�����K�#�4I!,��?���2#"&'532654&#"'!!>n��~7a!$g/OaV]H,f��:�ndoSKOFK
QP�7��
�,4>32.#"3>32#".2654&#"7G�e3-E\5R@]r{hDnA�?NEE/F'"D1M�yHK.Ph;#1qhp�D��QUDP'< +U7,�3!5!�%���zPD�z1��
�(52#"&54>7.54>">54&32654&/^x%>%,H+ks|)D'4I8`<7G#<$4GF�JMIMRDBE�XS+@15F1Zie[1H4UB7K(G52%2#>625�(4EE74EI2���,#"&'532>7##"&54>32'"32>54.G�e5'1F[6SA\q9fEDn@�>OCF0F'"D�M�yHK
.Oi:"1qgKl:E��RTEO'< +T8H���&4632#"&4632#"&H$%%$$%%$�&&$  �x%%$  ��&4632#"&#>73F$%%$q
1B
^�&&$  ��4�5&WU#2t	`-5%
	�)��yt�2�N��8��5!5!8�6��GG�GG2t	`7-52y���)�N�2�����+74>7>54&#"'>32#4632#"&�% '+>;1L#(a<_h5$!#F#$$#�&72!,*04F^Q-?5*)�%%$  :��I�?M#"&'##"&54>3232>54.#"3267#".54>32326?.#"I,@,.5F5LS4_A,U
%+K�Sr�Q��=o++kAv�Y:n�ch�]�3+81
(1<e.XG+5"%2fTBe:	�4"3U3]�D^�j��DX�t]�uAV��@:TC}0K~�!'!#3	.'3!V��U[Q��
Q����3*-;�aT�"2+2654&+32654&#-��FB-I*�s��\DS[v�_JMc�Ob?S&F8aj��;:;3�K��J<8E=��Y�"3267#".54>32.�s�{{/T((U;m�IO�nqT$!Q�����NZ�pl�]*La��	+324&+3 ���l�V_��ua"l���P�v����a��)!!!!!�q���#��5�O�N�a��	3#!!!!�Z���"���O�O=���� 3#".54>32.#"32675#��:vKo�OX�u<k."&_3��7v`/B�y��Y�qp�[N��U�I
�a��!#!#3!3�Z��ZZnZM����.(*�)57'5!*��TTTT4;44�����B��"&'532>53$$-Zf�L2-�Agbak�!##3>?3kj�IZZ>�i��U@����"D"��a��33!aZ8��Pa*�!##333#467#��S���Y�ri9�O��I�6�4f ��a��!###33.53�i��Sh}TQ#h7�q��@L �=����#".54>3232654&#"�K�lo�HH�pk�K��ryzppyysfo�\\�on�\[�o�������a*�2+##32654&��5}kRZ�[HfdX�nd;g@���M��BOED=�V�� #'"#".54>3232654&#"�ig���
o�HH�pk�K��ryzppyysf��#��\�on�\[�o�������a_�2####32654&&�*A$�i��Z�fkWPT�ef9L-
��'���N��ECF;3����)%#"&'532654.'.54>32.#"��u<f"$k9PQIA[]:gC;b(%W/CDD:?W-�_jV>5#0)!`S9Q,M9/$0&5J
!�!##5!#CZ��{OOZ����%#"&5332653�<{_��Z]^aWY�JwE�w�1W`gQ�X�#3>7X�Z�^���6�6,M##N-���#.'#3>73>7��[�
�[�^o
~]�n�6�:-	
U.�/�L.V&'\,��N.[#%W/�F�!##33Ff��_��d��_�6��tV����6�3#3�a�Z�bk_�K���&�	)5!5!!�x�����D6PD��P�b0�#3#30���hH�(
k�#`W���6��b��3#53#����V�H��&�3#&�2�N���<g�����f���!5!��@��@(^��#.'5�!%;:1�7499
.���!&2#'##"&546?54&#"'>326= b^@#MDI`~�[:5*L!#`NdM7+DZ!V^��L,*MRPW C4B��83-*KN0U��0�!3>32#"&'##3"32654�P?dyzc?P?X�UBAXHG?";".����. D���bgcijd�7���"".54>32.#"3267,Go?BqH)L@�ML,CA
:z_c|:I	�ag
N7���""&546323.=3#'#'26=4&#"dxyd>OXG
P1UEBYGGG
����.!
3�H"0I]^dkq_`j7��"2!3267#".54>"!.$Ec5��YP3O*)P7LuA;kF?I>"<mI5[_M>{YX~DHQHDU��###5754632.#"3L�X^^\R 5*,+��,�)h[E
;?#7�"+2373#"'5326=467##"&546"326=4&5UFu{vKOwEO6phuusCJIFQJL"()G��st"Q*QF-	Q����JkcciWan_U�3>32#4#"#3�Y4bbWxZCXX(#)*]g��W�e^���N��2#"&546#�AX�������4632#"&"&'532653N8&  *XH���G#1k��KUU
�3>?3#'#3�	�g��j�=WWk4
���5��U��3#3�XX�UV"!2#4#"#4#"#33>323>�[ZWmNCWnQ>XG
U0~&]"]h��YZV��Yd^��I*)Z.,U"2#4#"#33>W`bWxYDXG
\"]h��W�d^��I*)7��'"
#".5463232654&#"'�sGo@�sIo?�kKRQLLRRJ
��A}Y��A{Y_oo__llU�0"#2#"&'##33>"32>54&Tcyyd>QXHN1RCAX1?G"����/4�I#0J\^ck6]<\n7�""467##"&54632373#26754&#"�Q@ay{b?P
FX�SEDWHFG0"0����0#I��/[^fiq__kU�"2.#"#33>O#

)H+XH
R"Q-Q6��b,@3���")%#"&'532654.'.54632.#"�tb8Q [/C<954J(oZ1U%"J'69=33H&�NPP+$  (8,DJF#(9��S�%267#".5#5?33#*
4*G,LM#4��/>C	HA8*#r{D��1/O��#'##"&533265H
\4abYwYE��G*']f_���d^�333>73��^rr^���6126<��".'##33>733>73#�
`d�[J_`\KZ�g/)OO*����+X27.��"PX.���373#'#Թd��c��d��c���������33>73#"&'5326?^tm_�YN$
.9��(I!Q)0��LZF4+G'�	)5!5!!��x ��p��#:�DB�n�b\�.=4&#5>=463\\j?;;?nX4;mm:5�NP�3+I*2�PNH,1�gg�1+�8�3#�II�� �b`�>=475&=4&'53# 4;mm:5\j?;;?nXV+1�gg�1+HNP�3+I*2�OO2	�.#"56323267#"&
$/>0H9.$/>1G;?"N5"M6
H�J�"#"&546323#�$%%$\:l�%%$  ��[����!.#"3267#5.54>753a&EBRMOL,A:'C;W00X:D�I
ehh_
M
ad	<rY[t>	T � 2.#"3#!!5>=#53546N7X"I)9<��*��	+8``o�F;B�Bh=;PJ@BiB�Yd;��B!1467'7>327'#"''7.732>54.#"ZB1B:7C0@#?/C8@0B0AC";$%:##:%$;"a9D/@@/C9?1B/@#@/B9$:##:$%;##;,�33#3##5#535#533�\�|���V���z�]m]��@R@��@R@w�8�3#3#�IIII����;����3A467.54632.#"#"&'532654.'.7>54.'C0$(f_8N%"D0<18LMV.#'sg7R  ^/J8774K'K?P)D>,�2=7(<EC'H<3A5&ELK+*:6%3+"(%.�w��4632#"&74632#"&���1���&?".54>32'2>54.#"7"&54>32&#"3267�P�c66c�PL�e96c�P@pV0.SqDZ�P.SrScb.ZAA:2+;A9B92
6c�PP�c66c�PP�c65.UrEArV1Q�\ArV1Z{eAe9=TJLS
@
 4�$2#'#"&54?54&#"'>326=�AB/8&/8�8*2A7<*3-�6;�*12c!1
�/((8��
7'?'(�?��?�ƪ>��>��$��%�
�$��%�2��#5!5G�q����G��(�31���&4=".54>32'2>54.#"'32#'#72654&+�P�c66c�PL�e96c�P@pV0.SqDZ�P.SrE�RL0tVd>2',(,1
6c�PP�c66c�PP�c65.UrEArV1Q�\ArV1_�@A/7­��(# �����:!5!����B7�u�"&54632'2654&#"�HWVIGXXF0-/.1..�UDDVVDDU;4*,44,*42	V3##5#53535!A��H��H����G��G��GG�3U!57>54&#"'>3232��s))%1#E+@I;8Q��6p'1'  .?71N5M�AU(2#"&'532654&+532654&#"'>�GH+'/TY%@F>40:4992/)5$EU>0(4
3):I
?")#$!7' .(^��#5>73�29:#"j�9947U�#'##"&'##33265GP8'8XXxYD��H(*<)���d^7��%�####".54>3!%:f:'>\37dA?���.l[`m.��H��+��#"'532654&'73�JJ 	$&5&+:$3�057V5(%��L#467'7�G

6#�L�T*		'1\ Y�#"&5463232654&#"YVHCXTIGU�,11,,11,)QYWSRWVS:;;:;99'8��
'7'7'7'7ժ>��>�ǩ>��>��%��$�
�%��$�"��$33467'73#5#533#'35467~�K�L#

6#�IG���I==�} �62*		'1\�T��`4��<`�]81��*33467'73#57>54&#"'>323`�K�L

6#�IG#s))%1#E+@I;8Q��62*		'1\�T��6p'1'  .?71N5M>�(,7@"&'532654&+532654&#"'>323!5#533#'35467�%@F>40:4992/)5$E.GH+'/TA�K�L���I==�} 
?")#$!7' .>0(4
3):I���6`4��<`�]81�@�"+#"&546323267#"&54>7>=3;#$$#$!&,?:2L"(a<_h5$""F�%%$  �%81 -*04F^Q-?5)*��~�&&E����~�&&x����~�&&�m���~�&&�_���~�&&l���~n&&��=��5�)5##!!!!!%3#5���k]S�������:���O�N��M��=�Y�&(|��a��&*E����a��&*x����a��&*�`���a��&*l���(*�&.E���(>�&.xM���S�&.������7�&.l�����
2+#53#3#3 4&=k�Wű�JJ�n��Z"��P�s��:NBM�N�����a��&3�����=����&4E����=����&4x*���=����&4�����=����&4�����=����&4lf�@��>''7'7�2��2��4��4�>3��3��3��4�=���� )#"''7.54>327&#"4'326�K�lpI0=4,,H�p4Y%.=3^��?4Nys�3��E*zpfo�\/D(J1�Wn�\B)Gc�=d%�#���I�:���Z����&:E����Z����&:x���Z����&:�����Z����&:lM���6�&>x��a*�
+#3322654&+*4}mQZZ`�~��iaWbY~<g@��|n�COEC��U��J�6#"&'532654&'.54>54&#"#4>32
**
&%6>gS/HL(70)5?.))G8#=%X:d?awi"3' 
$K;UNO.($2");(,! &*&.+��HCO#J��.����&FEo��.����&Fx���.����&F�H��.����&F�:��.����&Fl���.���1&F��.��-",3>2!3267#"'#"&546?54&#"'>32>"34&326=[A^3��OJ2L&(M2�>"\MIax|Z=3(M!#d1>QT5:C�9��^H3*?U"<lH6`[Mq4=MRPW"A4B)-).HOJET�83-*KN0��7��"&H|���7���&JEs��7���&Jx���7���&J�L��7���&Jl�������&�E���L�&�x$����*�&��������&�l�`7��'� ,7#".546327.''7.'"32654&� As&cDW�tHo?l5OB*�&p.{TKLSSLN�$C69@�z��;mKp�9`&K7@��YSI_a\>Y��U�&S�V��7��'�&TE���7��'�&Tx���7��'�&T�^��7��'�&T�P��7��'�&Tl2y	G"&546325!"&54632!!  ����!!  � "" �GG� "" 7��'6&#"''7.546327&#"4'326'�sI8(:-!�sI:';-"�k
�$4RJ:�"4QL
��!8'>$e@��$8&?#c>&A2l_J1��o��O���&ZE���O���&Zx���O���&Z�d��O���&Zl�����&^x�U�0�&#"&'##33>324&#"3260yc?PXXN@cy[FJRDAXJE
��.  "���-
"0��ee\\ckk�����&^l���~W&&�����.����&F�\��~�&&�z���.����&F�U���$~�&&����.�$�!&F�,��=��Y�&(x���7����&Hx���=��Y�&(�����7����&H�K��=��Y�&(�!���7����&H����=��Y�&(�����7����&H�K��a��&)���7����!.#5>73"&546323.=3#'#'26=4&#"�0
W�cdxyd>OXG
P1UEBYGGG�6957������.!
3�H"0I]^dkq_`j�����7��^�*"&546323.=#53533##'#'26=4&#"dxyc?O��XLLH
P/TEBYGFF
����.!
3=BYYB��H"0I\]ehn``i��a�W&*�t���7���&J�`��a��&*�m���7���&J�Y��a��&*�����7���&J����a�$��&*�7�$")03267#"&5467#".54>32!3267"!.�-52)'LuA;kGEc5��YP3O*(,b?I>t-82,"?>{YX~D<mI5[_M 0(9QHDU��a��&*�`���7���&J�L��=����&,�����7��&L�X��=����&,�����7��&L�e��=����&,�:���7��&L����=�#��&,��7��*7#5>732373#"'5326=467##"&546"326=4&kW!1X5UFu{vKOwEO6phuusCJIFQJL�58	69�()G��st"Q*QF-	Q����JkcciWan_��a��&-��������&M������3#5353!533##!!5!aaaZnZaaZ��n��HwwwwH��M���o	�3#3>32#4#"##535���Z4abWxZCXLL�ZBW')*^g��C�d^��\BZ����b�&.��������9�&�����>W&.���������&�����E�&.���������&�����(�$*�&.�\���$��&N����(*�&.�O�U�3#3�XX��(�B	�&./S��N���&NO�����B2�&/��������*�&�����a�#k�&0�J��U�#
�&P�U
#'#33>?���i�B]]		����6��(L
���W��&1x/���L�&Qx$�a�#��&1�,��A�#��&Q��a��#5>733!�0
W�nZ8�6957�6��PUQ�#5>73#3Q0
W�XX�6957����a��&1�#����U:�&Q����
��
35'737!a1#TZ�$�8�<2���Q?d�P���3'737N3$WX@%e ;8���,;D����a��&3x���U�&Sx���a�#��&3�|��U�#"&S�5��a��&3�����U�&S�d��_�&SF��a�B��"&'532>5##33.53�%&/�mSh}Tf�L1+QFP%�}�� q7t�<d`U�""&'532654#"#33>32�"
&wYEXGY4bbF�G#1��c^��I*)]g�RKU��=���W&4�����7��'�&T�r��=����&4�����7��'�&T�k��=����&4�����7��'�&T�S=��d�"2!!!!!!#".54>"327&�2.�������1o�HG�u{ttz9*)�O�N�O\�oo�[O����!6��~!!(42!3267#"&'#".54632>"!4&"32654&�et��SM5M((N5Dh fBFm?�r?d_<<F<�BOFHONHI!�n5`ZM8778A}Y��8659HNJESfeeifdhg��a_�&7x����U��&Wx���a�#_�&7�H��>�#�"&W�~��a_�&7�f���G��&W���3����&8x����3����&Xx���3����&8�L���3����&X���3���&8|���3��"&X|��3����&8�L���3����&X���
�!�&9|����S�&Y|g��
!�&9�E�����$#5>73267#".5#5?33#�0
W�*
4*G,LM#4��/�6957�FC	HA8*#r{D��1/
!�3#535#5!#3#蕕�ߔ�EJ�PP�J����S� %267#".=#535#5?33#3#*
4*G,DDLM#4����/>C	HA|Bz*#r{DzBz1/��Z����&:�����O���&Z�V��Z���W&:�����O���&Z�x��Z����&:�����O���&Z�q��Z����&:�����O��1&Z����Z����&:�����O���&Z�YZ�$��&3267#"&5467#"&5332653�52 '.��Z]^aWY,,,*k843=	�w�1W`gQ�2?j$2E��O�$&Z�P����&<�����&\����6�&>�J������&^�.��6�&>l�����&�&?x����'��&_x���&�&?�����'��&_����&�&?�Q���'��&_�Uj�"#4632.)/XaP2*�4?��AgUE
	��0�)"&'###53533#3>32'2654#"S?P?LLX��P?dyzpHG�UBA
. D]BYYB";".����Ijd�bgci
��'03#"#.546;2#2654&+2654&+�OEH憉FB-I*�s\DS[v�_JMc�} A=Ob?S&F8aj�;:;3�J<8E����a4��U��0�#"&'##!!3>32'2654#"S?P?���P?dyzpHG�UBA
. D�Jo";".����Ijd�bgciZ��H�".5332'2654&+U]n0Z�dv4x|PG`\{K
8cA���8^9^yMGCE<|NAR��-�"&533>32'2654#"Bm�XP?dy~lHG�UBQ
���";".����Ijd�bg`j��;�"&'532654&#"'>32�;U()S.s�|{0Q!$)jAn�IN�
N����LZ�ql�]=���Z(2.#".#"3267#".54>32546|
/$!M0s�{{/T((U;m�IO�n;:6ZH03N����NZ�pl�]AE7��"�(".54>3254632.#".#"3267,Go?BqH 6=
/@�ML,CA
:z_c|:[AEI0|I	�ag
N�����
��3#"#.546;2#' 4&+�OEH�l�VŰ"��u} A=P�s��M����3�
!"&54>;5!5!'3#"?��5}k\����eRfdYh^8b<�O�6M=H?>7���$"&546323.=!5!#'#'26=4&#"dxyd>O���G
P1UEBYGGG
����.!
3�J�H"0I]^dkq_`jF�/"&22#".'732>54.'.54>">54&9Ho?_V+(UE1K2
& J,*/11XWDo>JQQCMXV":iH`v"%4'#F-
E##!'/[W*Ul4HaJIc `RM^<��35!!5!5!5!<5��#���O�N�O�6��;�����6��&�*2.#";#"3267#".54675.546:Jw(+(SA<L`aafgua[7q.-lBdz7^ZERt�+=":6<GK>DBHR5];LZUIMd��6�"&5473265!!!!yCG
O'{����Y�I=
!/<O�O�q^S����)"&54673265#5754632.#"3#�@OK!^^\R 5*,+��C�F;
&1&)h[E
;?#D��LW=���Z-2.#".#"32675#53#".54>32546�
/"&_3��7v`/B��:vKo�OX�uHA6ZH05N��U�I
�P��Y�qp�[AE�:�""&54673>73'254&'6>(�^��_�!">6"�L9,t6_��,M##O,s��Ap&8MN9I"%EU��U�#"&=4&#"#33>3232653jl58R=XXT0[\~A=Xk
]g�A@e^����(#)*]g��FOD��xcZ��R�".533267�,E(Y%(/
7
IA-��00J	"0�3#!57#535'5*TZZT��TZZT�4�N�44N�4ak�2.#"##3>?>)		
�$j�OZZDz&$�F�kVM����!N$�	U
�2.#"3>?3#'#4�$
	�g��j�=W�I ��4	
���5�q���3#5333#UFFXFFbBT��B�������,#''7.#"5>3273267#"&/.'#�jc""9Amf�%+I	z@ ?G,.!? �6A%,�;9#P'��Z����#"&533265332653#'##"'#daZ:?YLZ;@\GZGd5�+i
gs��FFd^�FFog��6R..d31�����"&'5326533.53##-

 h}Ti��C�L#/��@L ��6Q#h7�RK��U�"r��=����=��%�$#".54>32>5332654&#"�J�lp�HH�pR|)*_9?-��qzzonz{qfo�\\�on�\71L4;dU|�������7���j##".54632>5332654&#"'�sGo@�s5Y -^
::�kKRSJKSRJ
��A}Y��$!M2E]N.eiieeff=����*#".54>32>32#4&#"32654&#"�G�gj�EE�jIp'f7e`Z:?f%5��kpqihqqkfo�\\�on�\/,/,gs��FF=\��������7��"&#".54632>32#4#"32654&#"�mCj=mj?L*PPW\@#��EKKFFKLD
��A}Y��H%#]h��I,@__oo__ll
z�"3#"#.546;2+2654&+�OEH׌�5}kRHfdX_[} A=nd;g@��cBOED��U�0�#12.#"3>32#"&'##4"32>54&�$
NAcyyd>QX�RCAX1?G�I P4#0����/4�a���\^ck6]<\na��_�##3322654&+���ZZk�*A$��WPTXfd'��def9L-
��sECF;��/����)23267#"&54>7>54&#"'>Df:\\@O#RO9k$"f<u�2\?:DDC*N"&Z�,Q9S`!)0#5>Vj_8J5&0$/9M-���"(23267#"54>7>54&#"'>�bg(J44:<C/\Q8�&H34<96C"&M"JD,8(  $+P�+9(#F��&�^�����%23267#".5#"&54>";54&u=E%(/
6,E'-A:7)'�FG�H00C	IAg?13 H
%�S�""&'532=#".5#5?33#3267�
0%C+LM#4��T*
9�I4fHA8*#r{D��`�@E
5�3#"#.5463!#�f=OEH��{0 A=O����S�#2.#"3#3267#".5#57546�)
	-<��/%*
4*G,LMI�IDUD��1/C	HA8*#BJP
�!�"&5#5!#3267pCD�� 


#�KR�OO�6/#LZ��2�>53#"&5332>53�1]%H=8w`��Z_`AO$YiL;/Q7��JwE�w�0V`/S5�O���k#'##"&5332653>53�$G<H
[3bcYwYEX0]`/T8�bG*']f^���d^;M:%����!%2654&'5!##".5467#5!�xpJ] �@XL�ij�LW@� ]KqD�rd�CHO1�pb�ON�bq�1OHB�cr�Z����"&5332654&#"5>32j��Z]^aW &2�<{
�w�1W`gQB' 	L���JwE;�33>32&#"��b��0 
����-I#�����"&2.#"#"&'5326?33>?>��YN$
.;�^tL,"A�LZF4+G��(I!Q)�8)&�37!5!3#!!5#O����ٟz��������PD�G�PD'�3#!!57#537!5�oe�{#�x�p�m��B�F�D:�F�D��#����7��%�".54>7'5!!#"3267Kaz9Cm>�����N1Q/`a2o.-j
=e;Ld3�GP�A C7EPR"��".54>7'5!!#"3267 Or=BpD�����;[o`M;a! `�<hAOf6�@J�=MZGWP��("&54>32654&+57!5!#"3267�QjPISB`[;�����hn/gU@'543QQ�9>!7!:@@4=�J@�^W8Y3
P
0�23#!!5#53>54&#"'>]ld��v�(��>2/G%/'e�`U*O,F��FIF.K*55" ;#1#���"&'532654.+#5!!32�:g-/n2a`/P2|^��*KwE?
RRL2@PP�3bGCi;!���"&'532654&+5#5!#32�:^"]7<SLMZHq�T`)1e
O3:51�JJu+L11U5$����#"&'532654&'.=#5?33#�8Q [/C<.D+([\#4��ENt
P+$(>=Z*#r{D\"	D=NPU�"2#33>">54&K<^6^�kXHJ+L@��G"2cJ_�V�I#0J\^��jDS���33�N�������&���A��3#3###535#535)����N������H`H��H`H���H������a��&)'?��!���a��&)'_�����7���&I'_g����a�B��&1/��a���&1O��U���&QO��a�B��&3/���a���&3O���U��&SOj��~�&&�m���.����&F�H��S�&.��������*�&�����=����&4�����7��'�&T�^��Z����&:�����O���&Z�dZ����.!52#"&54632#"&546#"&5332653��7��<{_��Z]^aWY�GG���JwE�w�1W`gQ�O��D/!52#"&54632#"&546#'##"&533265��7��H
\4abYwYEDGG����G*']f_���d^Z���
"5>73#"&546323"&54632#"&533265389i2:;(��<{_��Z]^aWY�G"
21}��JwE�w�1W`gQ�O��g
"6>73#"&546323"&54632#'##"&533265�9i2:;(�oH
\4abYwYE�G"
21}A��G*']f_���d^Z���#*=.'53>73"&546323"&54632#"&5332653@
,0<88>1-���<{_��Z]^aWY�0/
&&
/0���JwE�w�1W`gQ�O��q*>.'53>73"&546323"&54632#'##"&533265
,0<88>1-��oH
\4abYwYE�0/
&&
/0�A��G*']f_���d^Z���
"5#.'52#"&54632#"&546#"&5332653D8;:15��<{_��Z]^aWY"G12
���JwE�w�1W`gQ�O��g
"6#.'52#"&54632#"&546#'##"&5332658;:15��H
\4abYwYEg"G12
����G*']f_���d^��3���"~�#-!52#"&54632#"&546'!#3	.'3��7��V��U[Q��
Q��GG������3*-;�.���D7B!52#"&54632#"&5462#'##"&546?54&#"'>326=���7�Cb^@#MDI`~�[:5*L!#`NdM7+DZDGG��V^��L,*MRPW C4B��83-*KN0~�!!52#"&546'!#3	.'3�ז�V��U[Q��
Q��GGw�����3*-;�.���E+6!52#"&5462#'##"&546?54&#"'>326=��הb^@#MDI`~�[:5*L!#`NdM7+DZEGGw�V^��L,*MRPW C4B��83-*KN0����5W&��0���.��-�&���=����(".54>32.#"32675#535#533#�y�KX�u<k."&b3��7v`/B����@@4n
Z�op�\N��Y�F
IGNP�G�7�I"$123733##"'53267#535467##"&546"326=4&5UF7?rhvKOw8C��6phuusCJIFQJL"()G��G=L"Q*!GA&Q�}y�Jc\]bP[f]��=����&,�����7��&L�X��ak�&0�������
�&P����=�$��&4���7�$'"&T����=�$�W&4'���� ��7�$'�&T&�r����#���&��B������&������*�&�����a��&)?���a��&)_���7���&I_g��=����&,x8���7��&Lx�a��P�33!332653#"&=!aZ(Z/.0,ZZ_X\����.��-26*s��Jd`O���a�^�2#33>">54&�?b8*_�xZG_<FQ#��L�4lSC��s1��a->N9gE��G�~SS��a��&3E����U�&SE���
(1>73#&54632#'!#2654&#"3'.'0j
.6;
1=0/A]R��N\> Z�TFD..�?2872.
��������8;.����
">I#5>732#"&546"32654&2#'##"&546?54&#"'>326=�
8@?0��/@?01<<1  b^@#MDI`~�[:5*L!#`NdM7+DZ�%$5�713882271�V^��L,*MRPW C4B��83-*KN0����5�&�x����.��-�&�xZ��=����&�x+���7��'�&�x���~�&&�d���.����&F�?��~�&&�>���.����&F���Q��&*�W���7���&J�C��a��&*�1���7���&J�����1�&.��������&�����E�&.��������&�����=����&4�����7��'�&T�U��=����&4�����7��'�&T�/��W_�&7�]�����&W���a_�&7�7���T��&W����Z����&:�����O���&Z�[��Z����&:�n���O���&Z�5��3�#��&8���3�#�"&X����
�#!�&9����#S�&Y��&�L	�)>54&''>54&#"'>32'q�W&=5#L(_v7F>;`-+9yB9fA?4";%cժ^<BL-<F

F.=-3:=("#NC:S2I5]�`*��"&>54&''>54&#"'>32��-(C%X_$92,M%.^17X5/+,?h�~�"mU3;	B/6".1@!I</IMDWvL��a��&-��������&M����a���2#4&#"#33>�t�ZNZn_ZGFR�}��C�]]xh�Y�\.7��U�*7C67.'##"&546323.=3>#"&'%26=4&#"%2654&#"�	SPdyyd>OX$a2=AZh'��UEBYGGG�8.'8 dS:
43����.!
3��5>.;-4J9�]^dkq_`j,':��e�+".5467.=3326=3'2654&#"MN|IOF:7ZINOIZ8;DSF}S_XY_^WX
9lMRccEXXDXXDXXFbcQMl9NWMMTTMMW2��"�*".5467.=3326=3'2654&#"(Go@D>00X=AA=X10<G�qQLLRRJK
:pOTgVP�~OFFO~�QVgSw�I^RQ\\QR^&�:�"&'532=!5!5!!�
0�`x�����9�I4FD6PD�ʑ@E��'�:�.��~�&&�����.����&F����a���&*|���7�"&J|�=����+7!52#"&54632#"&546#".54>3232654&#"��7��K�lo�HH�pk�K��ryzppyys�GG���o�\\�on�\[�o�������7��'D)5!52#"&54632#"&546#".5463232654&#"��7���sGo@�sIo?�kKRQLLRRJDGG��Q��A}Y��A{Y_oo__ll=����)55!>3232673#".#"#".54>3232654&#"�)��1+2.20,2.�K�lo�HH�pk�K��ryzppyys�GG�5=4>�Wo�\\�on�\[�o�������7��'D'35!>3232673#".#"#".5463232654&#"�)��1+2.20,2.m�sGo@�sIo?�kKRQLLRRJ�GG�5=4>����A}Y��A{Y_oo__ll��=����&4�,���7��'�&T��=����+!52#"&546#".54>3232654&#"�ז^K�lo�HH�pk�K��ryzppyys�GGw��o�\\�on�\[�o�������7��'E)!52#"&546#".5463232654&#"�ה�sGo@�sIo?�kKRQLLRRJEGGw�?��A}Y��A{Y_oo__ll��6W&>�^������&^�B��s�3673632#"&'72654&#"$*X $AADA/A	�a6a��A34H$,X$,U���"#.!6754#"#33>32632#"&'72654&#"t$*xYDXG
\3`b $AADA.@	�a6��d^��I*)]h�F27A#+X$,��z�&367#5?33#632#"&'72654&#"$*LM#4�� $AADA.A	�a6=*#r{D�F27A#+X$,���"&'532653&  *XH�G#1k��KU7����!-8"&546323.=33>32#"''2654&#"!2654#"$p}yd>OXP?dyp�8d>IKBYGGI�LG�UBI
����.!
:"��";".����}@=Iq_dfq_`jjd�bgek7��"!,82#"&'##5467##"&54632>"32654&!"32654&�q|yd>OXQ?dyp�8d��LG�VAH3IKBYGGH"����.!
9#��"<".����}A<Ijd�bgekq_dfq_`j��~�!'####37337.''!V�gCgEU[Q*CJ�PCM
�0,��(��Ny��-�'';؁�=��Y� ).'3267#"'#7.54>327"&/!$�$+/T((U;2,C!WWO�n%%Ys�66��7	L��
N
K_(�{l�])s��X�"7�0�� &"'#7.54>3273.'3267#",2)KCU-4BqHMCP

�$,CA�&|�

�� sVc|:��
I��
N`3^
��
3#5333#!aWWZ��8LG7��G�P
��!�!#5##5!733#7CZeF���F.S�E��pVO..O��+��3��";"&'&'.'532654.'.54632.#"3267hRO: [/C<954J(oZ1U%"J'69=33H&k_
3)*
/�LQF	P+$  (8,DJF#(9+KP%,(H	'��".'.+5!5!3267�<L-19# ��p��;>81
!�#F4,':�DB�n
LA,(H��2#>54&#"'>�gv^hZYh>D"X!#f�fYK�1��BnF4?H�"2#5>54#"'>�gj$RFXYa{"N!#\"fY-^U!b�nFyBT�*35#5332#2654&+2654&+3#aRR̆�FB-I*�s\DS[v�_JMc����N�Ob?S&F8aj�;:;3�J<8EVN_
����533!33##"&=326=!
PZsYQQ<{_��Z]^aW��bN����NfJwE�wdgW`gQf��`�Wa����!##7#!733#3#337#3#��AhA1E8kA��w8�"AcKK�..O�N�M���7�0�&+/273#3267#"'#7.54>"37&4&'7$KCR7=�< *3O*)P74,ICS18;kF?Ip5w,�)/"��qN5�
M��!uRX~DHQH��*C�FW0����B�"&'532>5#5333#$$-RRZQQf�L2-6NB��N��gb����#4632#"&"&'53265#53533#N8&  *KKXKKH���G#1KG��G��KU=�	�#223733267#"&=467##".54>"32>=4.kIrG 


CKpP_�EE�`bllcX]$$^�7/\��/#LKRg$.8\�oo�[N����6_?�?`57�u""/23733267#".=467##"&546"326754&?P
F	$6 Q@ay{nHFGISED"0#I��;%C	IA>0"0����Iq__k[^fi
_�2####53#32654&&�*A$�i��ZWW�fkWPT�ef9L-
��'��'LWN��ECF;
�"##5#53533>32.#"+~XKKH
R8#

8X
?G��G�b,@QPC6�##'#53'33737#,f~Ze;EbC�DaF�M�JN���N����ߑ��&33733##"&'5326?#533>?#^C�?_C9T�YN$
.9t[>�����G��LZF4+G"G��Q)89(IQ��"&"&533>323267>54&#"a_@#NCI`~�[;4*L!#_OeL6,C[	V^mL,*MRPW C4B83-*KN07��Y"*"&546323733267#"&'#'26=4&#"dxyd>OF &2P1UEBYGGG
����.!E�^@	$."0I]^dkq_`j��0"*2#"&'##4&#"5>323>"32654&Tdxyd>OF &2P1UEBYGGG"����.!E�@#/#/I]^dkq_`jU��0� +2.#"3>32#"&'##4"32654�%
P?dyzc?P?�UBAXHG�I 8";".����. Dq���bgfjjd�!���"2#"&'532654&#"'>�Gj<CqG+AB*POKPCU"7v_c�=N
ldd`I0���"$/2.#">32#"&''>7&54>"32654&9)L@�
&X/HQ5Q*0Q 
C&ArY!C (J)5""I	�4%%(D62?+ :@hc|:��!'.$ 7���%2".=467##"&546323.=3326726=4&#"8"9#O>dyyd>OX
'��UEBYGGG�IA?3
!.����.!
3��;%C	/]^dkq_`j7��u� -"&546323.=432.#"#'#'26=4&#"dxyd>Oy%
G
P1UEBYGGG
����.!
3O�I ��H"0I]^dkq_`j3���"2#"&'53267!54>"!.Gk;AtM7P)*O3PY��5dEC>I"D~XY{>M_[5Im<HUDHQ3���"2#".=!.#"5>3267�MtA;kGDd5oYP3O*)P5>C?I">zZX~D<mI5[_M��DUQH3��"#,"&5%.#"5>3273267#"&''2>5hui
TD3O*)P7^�j
*< (A"ry/:
��?
�ubADM^Z<,"B8F��H&=I"J;I+���"(#"3267#"&54>75.54632.#"3cI�R<8U!V>sn!6 -7s[:S(!!E/ySF;H\1(MYC(3	;1DJFL,&��!���"�!���"8273267#"&'#"&'532654+532654&#"'6�Lfg
*< (A%4' 6!ov:^"]7<S�H:ES?;,C(T"20<,"B8F	$,	 4)C[O)2ZH%-&&F%7��+")2#"&546"32654&+532654&Mdh6/7#2hP����_Z]\>KLM*ES6"QA45
4),K,���Jhehd/0,%H!0".���"&'53265#53533#&  *KKXKKH�G#1KG��G��KU6�u�-:2.#"#"'5326=4>5##"&546323.=4"326=4&4$
u{vKOwEO6phuug5U�CJIFQJL�I ��st"Q*QFQ����()4H���kcciWan_��7�"L7���"2.#"32675#53#".54>Cn= G �ML$3s�1^;Go?Hy"$L�ag�G��:z_c|:��%"&546733>?3'2654&'�4?&�^f"	f^�"?4�G52\3�� U 66�7;\*4HIBA�����"0<2.#"#"&5467'.'&5>323>?>32654&�
	y$ ?44?""	
	*=	

=,�"E�1B+3==4+D.�C&T)+V "��+-Q� 47##"&5332653#�Z4acWxZCXX(#)*]g]���e^�U� 432.#"3>32#4#"#Uz$
Y4bbWxZCXq�I ^(#)*]g��W�e^��U��+2.#"3>32#"&'532654#"#4�$
Y4bby#xZCX�I ^(#)*]g�?�	I��e^��q�
��2#"&546##5#5353��KXKKX��^G��G���R��6t$#57'5PP�PP4�s44�4u�.#"#>32332673#"'#�	39/
X	28/Xr;E<��:F����T�3#"&54>3233#354&#"�*=7/'
Xhh{#);.0		�yH��qU�=�".533267�,E'W%(&
(�IAA��00C	U�o�"&'532654&+57!#3!f;^ !b:M`o[;��XX��q�Aw�PYMTK=�2��@�omGm=Q��R!"&533265332653#'##"'#[ZWmNCWnQ>XG
U0~&\
^g]��[U(��d^��I*)Z.,Q�R$467##"'##"&533265332653#�U0~&\5[ZWmNCWnQ>XX3
*)Z.,^g]��[U(��d^��U�V",2#"&'532654#"#4#"#33>323>�[Zy#mNCWnQ>XG
U0~&]"]h�?�	I�ZV��Yd^��I*)Z.,��" 2#4#"#"&'5326533>W`bWxYD$<$%
G
\"]h��W�d^��AI	C%;`I*)U��" 3267#".54#"#33>32
'#<$xYDXG
\3`bH;%C	IA��d^��I*)]hU#33.53#UlSm���P006���
34���7��'" 7��,"$25!!3#!!5#".546"32654&0^>`��
��P1Go@�qEWKRQLL"A7I�I�I6!A}Y��Jl__oo__l8���"'2#"'##"&54>"326=332654&�k�Mb]l" m]bK�py�<12.T2-2<|"N�bj�ZZ�ja�OI�rRTJ8��>DTRr�6���!#5.5467533>54&'�PwB�|VOxB�SS\TU[SZTUY FvQy���EwQz�
��	g[[h	
hZZf
��H"&'732>53#'#N"
 
*G+XH
S
Q-Q6��b,@��H�"&'732>53#'#N"
 
*G+XH
S
Q-Q6��b,@��#".=467##"&'732>533267m!9#S8"
 
*G+X
(�IA\3
,@Q-Q6��;%C	U��"2.#"#33>O#

)H+XH
R"Q-Q6��b,@U��" 2.#"3267#".533>O#

)H+$(
!,E'H
R"Q-Q6��00C	IAab,@RH"2.#"#4>�0
&##W(H"
K,0��{BH�"2#4&#"'>h0H(W##&
0"HB��j0,K
U332#'#2654&+U�Vh$9 �f��~>E4>�QM/?#���-.&0�U3373+7#32654&UX��f� 9$hV��~�>4E���$>0LR��1%/,3�9�"7%#"'3267#".=32654.'.54632.#"�tb-#$(
!,E' [/C<954J(oZ1U%"J'69=33H&�NP00C	IA�+$  (8,DJF#(9���2.#"#"&'532654>�&
$<$%
$=�	C%;�bAI	C%;�BH���%"&'53265#534>32.#"3#)%
KK$=#&
KK$<�	C%;@GBH	C%;��G��AI��"".54&#"5>323267�#=$
#!8!
&�IA�1(C	D=�3;%C	����("&546;4>32.#"3#'26=#"!@ODM2$=#&
KK'>- ,(�B47CVBH	C%;��HBIH%,��Y""5>323#5#534&a+
4*H+LM#4��/�C	HA��*#r{D61/�S�267#".5#5?33#*
4*G,LM#4��/�C	HA*#r{D��1/
��`75353!533##'##"&=3265!
EYXKKH
\4abYwYE��G����G�G*']fD>�c[��? ".5467#5332654.'53#-Go@63��0HKRQL"7 �j�
=qNJl'IEuVOddP3\D
EIU�v�Q��"2#"&53326=4&#"5>�/C%otvmXCHHC&%"GB�yyu}0��aKM_�7%	K�#.'##1�^rr^���<6235����"%3>73#.'##.'##3c

`d�[J_`\
KZ�g�)NN*-��,X37��.#PX.���!#.'##>32.#"�^tm_�XN$
 .81)H!Q)��bLZF3,G�#537�X�d������;��'�!".=!5!5!!3267�#:"�� ��p��#
'�IAI:�DB�n�;%C	'��">7#5!5!3>32+72654&#"�� ��p��S)Y=5AJ[a�- 2;
:�DB�nQN>*7D%2�,/�������'2".54632>54&+57!5!&''27.#"�.Y:XN;o5o[;����DpB
&9$!&nDa9.X-/&>�?26D%$
TK=�J@�5aI5(6)"&I4# $��2#>54#"'>�gj$RFXYa{"N!#\�fY-^U!��knFyB��2.#"#.546�5[#!M#{bXXES$j�ByFn��=!U^-Yf����"&'73254&'3�4\#!N"{aYXFR$j
ByGmp�� V^-Yf7��""&54>32.#"3267,|y'E[4)L@2G%#E1,CA��r�['I	?�tu�<
N��=����&4+U!332#254&+2654&+U�9[5</2Jet�7>��BFFD�;328
9<DY<J&#��'/.(�-��!"%2#"&54>75.546";#"32654����xr!6 .7tc�SE*�S>\U"���[C)4 	
91DIJK-%HZ2(fh�7��Q�+2.#".#"32675#53#".54>32546
/ G �ML$3s�1^;Go?HyK5*6�I0�L�ag�G��:z_c|:	^AEU(33!53#5!UX#XX������������'"&54632"&546;33#'26=#"�n<K@I+XKK%;*&#q��B47C��HBIH$+	� �%467##73753#j	�g��j�=WW�4
��3�5�U�333UX��1I7���%2467##"&546323.=4>32.#"#26=4&#"�O>dyyd>O#9"'
X�UEBYGGG
3
!.����.!
34BH	C%;��/]^dkq_`j��23##5#535>54#"'>�gj#NAllX[[Q_{"N!#\�fY-^U!PI��I~nFyB��2.#"3##5#535.546�5[#!M#{_Q[[Xll@O#j�ByFn~I��IP!U^-Yf7����'*"&546323.=3!!!'#'26=4&#"!dxyd>OX���#�2
P1UEBYGGG9��
����.!
3��B�nDH"0I]^dkq_`j�7���2?"&'532654&+57!#'##"&546323.=3!26=4&#"�;^ !b:M`o[;��G
P?dxyd>OX��DpBAw�&UEBYGGG�PYMTK=�2H"0����.!
3��@�5aIGm=/]^dkq_`j7����)69C>7#'##"&546323.=3!3>32+%26=4&#"!2654&#"��
P?dxyd>OX���S)Y=5AJ[a�MUEBYGGG9��L- 2;
H"0����.!
3��B�nQN>*7D%2�]^dkq_`j��p,/��$83".5#5?3!>32.#"#72654.'.5467#3�*G,LM#4*1U%"J'69<43H&tbC<954J(	�/%HA.*#r{F#(9+NFH $  (8, ��1/��-6#"&'5326=#".5#5?3354>32.#"267#�$<$%
1*G,LM#4�$=#&
�)
�/IAI	C%;LHA8*#r{>BH	C%;�����1/��4�6A".5#5?33#3267&54>32.#">32#"&'%2654&#"�*G,LM#4��-1M$BqH)L@�$U7HQ5Q*=d!*aL)5"*(F!(
HA8*#r{D��1/)6Pc|:I	�%%D62?')1I$ "<�
�5"&'532654#"####5754632.#"33>32}"
&wYDX�X^^\R 5*,+�X4bbF�G#1��c^���,�)h[E
;?#I*)]g�RKUU��i�,"&'#332654.'.54632.#"s:a+XXdgVF954J(oZ1U%"J'69=33H&�
 ��z5+$  (8,DJF#(9+NPU4�33!!%!UX���#�y����B�nD;���#'#3737#'#3737�cKQSIbFBTFPFEcKQSIbFBTFPF����P����������P����U��!#5##!#5##U�X�X�X�X�闗�闗��""232653#547##"&=4&#"5>0#;#xZCXXZ4ac
&";2ځe^���(#)*]g�#E���"/2326533267#".=47##"&=4&#"5>0#;#xZCX	$6 Z4ac
&";2ځe^��;%C	IAH(#)*]g�#E7]�3>32#54#"#3p:"?@8N;,99a8>��M=8��7]�432.#"3>32#54#"#7P:"?@8N;,9�T,"98>��M=8����v�4632#"&"&'5326533

%	

9/���+t��-37g2&#"#33>�
	)=9/5g1<0�B;'
�a"&'7326=3#'#3
	(=9/60;1���;&
�a7"&=467##"&'7326=33267� 16$
	(=9�);7	&0;1���$(
7aa
3373+7#32654&79UZBc3D8��R](#-a���*+.1�j �a!.'##33>?33>?3#
	>A`;0

>><0;aC�/

0�A�54��05����La33>?3#"&'5326?=K
	G>�:2%a�+0���.6*+���������[��������������������?�2#52654#1<<1 8821827?�"&5463"3�1<<1 8?822727�
�654&#"'>32#Py%&5<%EH:BA$H'4D2+E4��#5.54632.#"�AB:HE&<5&%$T4E+2D4'H'57�콽hu'YO7'5����COY'uh"	
73#'mm'TT"�뼼
"
#'37mm'TT
�뼼(^z�#.'#5>7�-1>86</,
�75/.47(^z�.'53>73�
,0<88>1-^54
00
45(�x�#xP���(^Q�!5Q���GG��(^��x��(^��E(�4x<7#xP<����(�mQ������(�4��E����(�4��x��H�'37�Y��YY���苋H��'3�Y�����(����
����(����
��������������������������K#53��<(^_�
#"&'33267_QHJK62.'9�<JI=)'(q��2#"&546\�(^1"&54632'2654&#"�1<<1/@?0  ^822771382(�$�3267#"&54>7p-52+0""t-82,6, 5(^��>3232673#".#"(9/5028/51^;E:F(^��#5>73#5>73�
.62 
`�
.622`�:947
:9U"�����7"&''73267�(Ab�
*<�8FD.<,"B��(;���Ja$7"&546733>?3'2654&'�!)�=B		B=�)"

�+ 8�34���#7 +,('
7p�#3p99�!g$#"&'532654&'.54632.#"K@%4<,'#339H;81H'227x/0

0	'')-
*	''La'373#'#�xAYYAyA_`@Þzz����
�2.#"#5.546�";2P@99D6E�'
H+BھU(6=NT�!#5!�nB�PNT�!#5353��B�B��PNT�!#533��BFB(�PNT�!5#533��B�B�PNT�)533T���BBnN�T33!NB����BN�T33##NB��B�B���(�9z�������(W��*5���[��(�v��'373��OXYN��ކ��(�v��73#'(�1�OXY��܄�(�#'57#�����k1kE>?(�#57'5(����E>?Ek18����"&54632'2654&#"�1<<1/A@0 ��822881382��(��E��(��53#.753#.(` 27-�`126.�
749:
"U9:��(�������(�C��������H����(���3##(Ι5�5�(���#5#5�5���5(��3533(5��5(��3#5353�Ι55�(�0��!53!53�B8M9Хcc(�0��!53!�B8�Хc(��K	'57!!#���O����1�;D<E���^���E������^���x�����Y^����1���^���������l^����D�0�J!!���_JG���e^����=����q4������sw��l����N�@5#'>54&#"5632�.#6$+%
%<B�&)5U4,����^p1��l����^����Z���W^����/��T(�#5(P�����Tx�#53#5(P�P�������^�a�
#.'5##.'5�126.O126.�"U9:
"U9:
�d^�L2#"&546#"&'33267�QHJK62.'9Lh<JI=)'�d^��
2#.#"#>JK63.'97Q�H>)'<J�����H��������K��������I��������M��������4e��E�t�������4e��x�t�����&X��353#5#XnBBn]A�A���&X��##533XnBBn�A�A�����!#5#NB�����+l�>53g3<]]hiDCPf��8��"&5463"381<<1 8�822727���0i��3#535!H�H0d<<d���0i��5#53#!H�H�d<<d���i��53533##5iHBHHB�<FF<FF�����br����p�S�O�*"&'532=3u
0O9�I4��@E��*"&=33267u<9O0
�E@��4I���P�	��"&54632������s�Q���l��������p����l�����#@��#5>73@!0WF7859�����d|������$S������4(������N�&���!#5##�dB�B0�nn�C�O���#"'#"&53326533265�>0661<6708=::##::B "B "���X�9�����0�����W�8�����/�����d�G�����<�����d�F���������H�H����� �����l�m�����D�� �f�!5!�@��@���1�"����3���N��P��&�q���0�I������h@%5!���GG�o���'7��%��=��:����#��L@���0��8��2#52654#51<<1 8821827�N�&���!53353���B�Bڪnn�C����!5!!5!���z��
���ȓ^�C�O���4632632#4#"#4#"�>0661<6708�;9##::B "B "��;f77''7f*<;+<<+;<*;�+<<+;<*;;*<��@@b463"#52654.?E:D;#/2$-#03
%,���0�����2����`^)�E�8����^��x����H^���� ����[BO����i^�C������i��<��&P��!#5!#��B��B��nn���0�"����2�����4x��������]��3#5#]�Bx<�x�H9�"&''7.#"#>32732673J$%-$	39/!"-!
28_	=;;E98:F�HA��!-2#"&546#".#"#>3232672#"&546�8/5139/50��m:F;E��X]�\+".#"#>3232673".#"#>3232673G2.31+2.20,2.31+2.20�5=4>�5=4>�Q�%���	7355#�}d}}d\>>\\>>���]��5#7# ;\\;�x__x��e�	'/7?GKOW_gow������53#7535#53"5432"54323"5432"5432!"5432"5432!"543253!53%"5432!"5432"5432!"5432"5432!"5432"54323"5432"54325353!533353���f��g���q�����y��6_5����>y�|���q�g5�66fz�.�6ff66ff6�
.F�����3VF.p6g��g666��NP#5>7.'5I5885.,
D3

2����S?&���d^�H
>32#.#""&54632�QHJK63.'9e�<JH>)'d���!_��77''7_*31/12*31/1K*21/13*21/1���P��.'5>73E6886.,�
D
3

2���P��#5>7.'5I5885.,(
D3

2�H���%#5>7.'5>73#.'#�5995.,�
D3


3(
D3

2�@BB@B@����S?&�����q���[���j��37''7'7#F
>F3883F>&F"B
0*@@*0
B"�@����+2632#"'#"&54632654&#"4&#"326S891<<1871<<�  5  ''7228((8227i��T_#7#73_"3{"3�xCxC�����
"&'332673��*F#�k�)F3��_]6>7=dX���K� 1��q,�!5!,��Xq3�����,��"��_��#".#"#>323267�]G9gdg9<93]H8fdh9<9�C=!D<!�~��O
2#.#"#>��*F#��j�)F3�O_]6>7=dX���%���!55!���}}�za>\\>��hdF$2#'##"&54?54&#"'>326=V#!+s)"+#-")FH�!A

r ��hrF2#3267#"&546"34&/5�K#$4@:0!zF5+J864<!"��l!�2#"&546#5	

	
(�Q����hzF#"&5463232654&#"z=4/?<41>�"$%""%%!�6::65995&--&&++��hoB#'##"&=3326=o!)+,(5(B�%)��3(&o��hgF"&54632.#"3267%0>@1"GEh59;5RP��ho�""&546323.=3#'#'26=4&#"-66-$( $&(   h8778
V��&%(+-&&+��lq�3>32#54#"#33(,-'6)((C%)��4)%o0�^l�F!2#54#"#54#"#533>323>g)('1#'2$( '9
)F%)��3$#v�3(&o�$��l`F2&#"#533>D

*(!%F '!r�'��hRt27#"&=#5?33#0+"#FF�'}.2|��l}B
'33>?3
[*4
3+\l�~
"

"
~���lyB'373#'#S->>,SX-BB-�hPPhnVVa��333#aZ����N��U`333#UX���J�<T�!##!#5#�II�|�.���U9�!##5!#5#zL�Lz����O'@��573'0j_@�
���`�573_;0�
����b�����U-�R���"&=33267�(-N�)"S@:��!���"��7���"&H��p��!���"&�W�o����& �����B��/(^�573(0j_^�
��^�573'"&546323"&54632&jU}�^�
���
��&&EB����H��&���
��'*�B���
'�'-�B���
��'.�B���
��B�&4rB����
�'>�B���
0�&d|B��������Y&tC�g��~�&��aT�'a��3!!a{���O��
t�353%!.'

Q����2��e2Q�*-;��a��*��&�?��a��-=����#".54>3232654&#"5!�K�lo�HH�pk�K��ryzppyysT.fo�\\�on�\[�o��������NN��(*�.��ak�0`�
13#.'Q]�
��3*-;����a*�2��a��3<4�5!5!5!P�X��D�yQQ��QQ��QQ��=����4ay�3!#!aY���6{����a*�5&�355!!*'26;&����?��&G(�J'KP���Q��
!�9��6�>3�"+!5.54>753'>54.'ycG J~^Y_~I I`YZg*/g�Wg-*f[Z4Sa.5bM/DD.Lc60bQ3Z��5X8;\57\99X4��F�=Z��!5.=3332>=3n��\.S7X7S.\�������Vb(�>(bV�ᔓ���'353.54>323!5>54.#"�%F-L�ij�L,E&���>J 2gQPg1 I>OUvJb�YX�bKvUOH,\kBLxEExLBk[-H��7�&.l�����6�&>l�����7��Y&lB���-���&pB���U�&rB���R��6&tBI��O��&�C�7��Y")"&546323733267#"&'#'26=4&#"`zwg8T
F %1S*SECVIG
����.%I�^@	$.$.I_gdjke�U�.�/4>32#"&'2654.+532654&#"U=h@fnS;Lb=iB6C �FR)C&SI9AI3#@(#@�Vg/c\HT
b[D`1��.MF5E#DK=><HD�Z�.�533>53��[aU@W$YP����B?^ߑg��W�-���&2".5467.54>32.#"'2654&'#Gp?_V,(VD2J3&K,*/11YVDo>JQPDLYV
:jG`v"$5&$E-E##"'/[W*Ul4HaJJb _SM^-���")"&54675.54632.#";#"3267tkC.+4h^8[ I+<3I0EEBEE?4MR
YC<:
;0DKI)#.%D1.++N
7�6��'>54.'.54>?"+5!D%&Vb)1X8m/C"xt�:G GHN?� B7M39p{I�C5�NjQ("2&34,E U�"4#"#33>32�sUCXG
W3\a�G�d^��I*)]h��7���
"&54>32!.#"267!(|u0kV}w1k�2HMLG�NJ��G
εz�\˹y�]���������R��6"&533267�OHX* 
&
UK��{1#G��U
����'"&/.'##'.#"5>323267�%
O
\^�;0!M^ �

%�B@$^(��C,,FMV�AU�\$3326533267#"&'##"&'#UXzRDX %1J8':���d^�^@	$.(*<)��333>53��[aU@W$WN��B?^ߑi��S7�6��6>54.'.54675&54>7+5!#";#"D
#(Ie4W?t)C(D"tEuGJYloFS$$PA57� ?2Q>Qcp/=&C>@:3AC+F+/6 ",,C#��7��'"T��w"5###5!#3267&o�Wmgi#
�^�,�DD��#E	F�!"4632#"&'#2654&#"Feu�>mF(L�HOQM�K�����U{AH-�/gakfƢ7�6�"">54&'.54632.#"D#8Ac8�r(J8!WHEC+C'�F"<nX��I
iT8U9
/+%L7��F"&54>;#'2>54'#"(m�F�W�z&*7lO6D M#bbH
��e{8D%gHHyII4W4�VcqUl���".5#5!#3267L.N0���5+/7HC9DD��:.B
O��".5332654&'3CQ)X53HOX�
#AY6/��9M(rxFn<;oJ��7��� 5.546753>54'@OxB�VPwB�|V\QR�ZT���EwQz�
��FvQy��.�	h\\i	
i[��J$'.#"5>3233267#"./�w'!o�^�d!%
	'2%W��u�'.E+'�G�k�-/D2(���O���5.533>54&'3JLq>W+K.VU]WEwL��3tc��KR ��IejEuFCxBg};�A���+".54673326=332654&'3#"&'#>U,4%Z%6<12.T2-2<1*Z(1,U>7FE
DzP_�++�bacJ8��>Dca_�1.�]PzD3;;3������6�&tl�e��O���&�l���7��'&TB���O��&�B���A���&�BSa�k�".'53267#3>73	:0V@)c=Vq�IZZ+�i��&��MG[U@����/	��mywU��J�*7"&54>32#"&'>322654&#"2654&#"M�pG}PW\6S,,P [>>h?Fs+2/*2(FH	PURE<W&F
���_F;.<#]6#+3_BVo5I"%('��[KMO*#`k*��`�3=".54654&#"'>3232654&'.546323#.#"GQ 12'/7Y\|�CS[nzF@;yS
X?++0n
3Q-)M>
4'"Q-*B��
8^:?V��Ii�^�go,&%;#E�33>32&#"��b��)(����&&F �����
�'��B���E�&�l�����7������D/".5467#5!##"&'#'26=332654&'!>U,r.r,U>7FE22.T2-2<�g<
DzP>e(II(e>PzD3;;3IJ8��>Dca?e((e?acU�@
"&'53267'#33>?3=c#T3DV�B]]		�j��(�	=4F�6��(L
���=��!5.54>32'2654&#"P]z<F�mh�I?{Z,ulltunn�Q�PV�ML�WQ�P��{bbzzbb{7�'"5.546322654&#"<\4�sIo?m_,QLLRRJK��	GwP��AzVx��.t__hh__t=Y�!5.54>32.#";W��K�m?e,$%O7ww{{��{V�ILs`aq�7�3�"'"&'532654&'.54632.#"!? 33-&5A]2�r(J8!WH?CGKZ�D	# "8iX��I
iT8Q6@>AIa��3!!!#5#a���V��O�π��a��#!!!#5#�X���V��O�ߑ������+"&546?!7>54&#"'>32!3267�8G
%��:		#>A
6C


<92 �&H>72 `�&I0���,"&54675>54#"'>32%3267�KB
e��d+'<=G^t
 #
�E89%L7#?+E
;.I1�I:��")E��
�!>54''7&''7&#"'>32q �'��(�4H4W*'bF��L�H$!pC�C+�D�$F ��E�J�����>54&''7.''7.'7"&+��
��<�m{ƋJ*%�N�d6NCO$CJECL`Rq��~a�H���"+3>54&#"'>3233267#"&5467`"5#
%NU
X"1(
KR
��%ew?TEEowC ^%ew?XAEpvD��F�!"%1>54&'.=4632#"&'#2654&#"�Ok@eu�>mF(L*SE>0�HOQM�K�2WEى���Nt@/9 $.%CcVgeƎ��7���"H������O��=������7���"�����"���a*����U�0����=��Y�(a*�3333#467###az��yY�J����6�6k"��!l7�RU��33#467#'Uh��cT�H������R3��4���!"&5#534632#"&'#3#2654&#"FBBeu�>mF(L�ˑHOQM�K�TFi����U{AA)FT/gakfƢ����;�J��=��Y�&(+����;�&Jk+��a��&*E����a��&*l�
����"'532>=4&+##5!#32�1+-:F�Y��ٿemf
N
0.@:8��{OO�]XFda��a��&�x��=��f�"!!3267#".54>32.�j�
\��}y1X*Nqt�FP�qAc)%#T�vtN�N\�on�\M��3����8��(*�.��7�&.l��������B��/����#,"&'532>7>7!32+#%2654&+B""T;iz3~���

&?�]X`d0K/I'(��o��6\9^s{J��4C^0XACE8��a��33!332+!%2654&+aZ2[:iz3~�����\X`c0��.��6\9^sM��MACE8��
��#32#54&+##5���dkZ7D�Z��P�\Y��:7��zP��aj�&�x����b��&�E����p�
(#"&'33267#"&'5326733>73�W_bQR/4.5 AXD1.8A��c��_�KMLL6%'4�#G_/Y	0=�w

�a�Dy�!##5#3!3y�\�ZeY����z��~�&a4�
3!!32#'2654&+a���jkv.v�	`NVg_�O�5[;boMACE8����aT�'a��!#��Z�P����D��3#5!#3>7!B[V�V7$A2 O/9 M����>���OQ:���6)��a��*T�	333	### ��dVd��g��V��go[��Z��Z����j��j��&���)#"&'532654&+532654&#"'>32\MZ^��:i-/o1`cthfajiP@CY*+*{Mtx#IUXG^vRHBD>KG<6:"=+db��333#4>7##bT�dT�vd�x!RDO�6�%TF��b��
!#"&'33267333#4>7##HW_bQR/4.5�mT�dT�vd�KMLL6%'4�x!RDO�6�%TF��aj�
!##33jl��ZZ;f��j����Z����c�!###"&'532>7>7!cZ�	
&?3#
#�{J��4C^0K1I$&��o��a*�2��a��-��=����4ay�3!#!aY���6{����a*�5��=��Y�(��
!�9��p�%#"&'5326733>73� AXD1.8A��c��_�G_/Y	0=�w

�3����'#5.54>753>54.'�t�8FvYY[wD9�sP_(gpYtc(^Q�XHwI0_M0nn1O^.GwJX�0S8XikV9S/��F�=a�D��%#5!3!3�V��ZeYO�����z��PY�!##"&5332673YZ:e>dnZ=D;^;Z%]X��:9Za��)3!3!3���ZZ[��z��za�D��%#5!3!3!3�V��Z[ZO�����z��z����
3#5!32#'2654&+���qdt1z�	WRZ]f{O��6\9^sMACE8��a��3332#!3%2654&+aZnds1y�kZ�3VRY\d��6\9^s�6LBCE7��aO�3332#'254&+aZ�dv4��	�`\{��6\9^sM�E8����;�"'>32#"&'53267!5!.�2R!%)j8s�JL�t>V**V0����Z
��K\�fu�\N��Onza����"#".'##33>3232654&#"�G�hf�J�ZZ�J�bg�I��ksukjttlfo�\T�i����_�M[�o��������#.546;#";8�i�&C*���ZlU[X\h(��8
.P?ag�6(U;DBH	��.���!F9��!�+467>73>32#"&2654&#"9jvA|6#XVAL1E,hj>nIo��AP=F,H0
#?B��	Mkq(�kYx;�aTfR_'21\I+U!+324&+324&+326</2Jet��9[5Y7>�y�FD��BF�28
9<DY;>&#��.(�'U�##��XJ�2�F1
3#5!#3>73�NU��T+EEN"5#��2����_�|ED��0���7��"J�###33���d�R�d��`�R�������������!���"(2#"&'532654+532654&#"'6�\m6/ 6!ov:^"]7<S�H:ES?;,C(T"ID19
	 4)C[O)2ZH%-&&F%U-73#4>7#3�lR��mS�00���<43
�@U-�
#"&'332673#4>7#3W_bQR/4.5��lR��mS�KMLL6%'4��00���<43
�@U
3##3�`�f�XX�����������!###"&'53267!�Y�
.L:
6ACϩ�^B��U�#467####3�O�J�Ou����V.�Q�-/���Q�U(!53#5!#�#XX��X�������7��'"TU#!#X��X���3��U�0"U��7���"H�###5!ǯW���2�J����^��6���<���]U�Ff#5!3!33fV�EXXL���2�1J326753#5#"&=3�g2R+XX-W=R[XU\���!VH�U,!3333,�)X�X����2�2�U�Gy3#5!3333+NX�4X�X��1����2�2��32+#5#32654&�nkft����;GB�MKKY�J�ګ(00#U�
3332#!3%2654&+UX�hdbn)X�w9HB>��LLKY��G'11#�U	2+34&+326L�fo�XE>��8I<�KYܝ1#�(���""&'53267!5!.#"'>32�.CF,N\��OLEP(KsAEy
LT[HRL
G
8zd_|;U��
"#"&'##33>3232654&#"
�mf}�XX�|eEj<��FLMDELLF
���y��qxA{Yeiieeff�3#7.546;#5#';5#"vf�:$hV�X�E>~�=5�#?/MQ��դ.-�0��7���&JEr��7���&Jl�	��*"&'532654#"##53533#3>32�!
$wYDYLLX��Z4bbD�H#0��d^��]AZZAX&)*]g�gLU��U��&�x�7���"".54>32.#"!!32676JsBDuI)OCMP��PN-FD
9z`d|9
HNPHYVL��3���"X��N��N�����&�l�`������O��!32+##"'53267#32654&�|iedt�}
.K9 6B�lo:IE�MKKYΩ�^A��ګ(00#U@32+5##335#32654&�xkebt��ZZ��np;HD�LKKY����ګ(00#��	����U�&�x���U-�&�E����
(#"&'3326733>73#"&'5326?�W_bQR/4.5��^tm_�YN$
.9�KMLL6%'4��(I!Q)0��LZF4+GU�G!#3!3##�XX�V�2����~�&.'33>7.'33673#.'�7];] .3a	] 09<I^a\P >4�_��[���3M(4l0T���8w9����4��;���##.'#.'33>?.'33>7�ZVR<vP*N3W(8	
J
X!46J���4�;�C��h_��35�2i1Q��BV�	o�3#53533#32#'2654&+���[��^jx2z�
^T\eTLffL|6\9_rLBCD8��	E�3#32+#535#32654&թ���gt�uu揑;MG�lI��KY�Il�n�(00#a��}�%".'##33>32.#"!!3267�m�I�ZZ�
S�h8d'$"O1k~R��|w/T)(V
U�g����^�OLxqN~�NU���"$".'##33>32.#"!!32672FoB�XX�	DlC)L?LN��	�,A?
4oV��Rg0HMPJ�L��	#####3'.�*_�FRF�]*+#�'�6J��J���X/1Xa;7#'##5##3'&'S�Zc5O7aZ�4�������;.2JI=$a��	#######333'.x)b�DQE�`��ZZ�~+#�$�6M��M��M����.X<#Z`:U#'##5##7##3373'.'#�Yd5O4dZe�VV�_4�����������;9?G2�� #'.##"#7>7'5!��BL,B\B72Z25A`B+KA�����B�.Q8��/4��S4/��8P/�BQ�x #'.##5"#7>7'5!8�6<"?X?
+&Q(+@W?!<6����3�'?)��"&��'"��(?(�3H�a��"%#'.##"#767##3!'5!��BL+CYC"61[17A^F�ZZ[�����B�.P8��23��R3.��Q�����BQ�UK#&#'.##5"#7>7##3!'5!�6<"?X?
+&Q&,
@W?	�VV����3�'>)��!'��&"��(�߬3H��*UU2.#"32>32.#"#".5467>54&+532654&#"'>7.'53>�	5X\aNZd��78#1,>9!,2
52 4<-EM exbYxdfbiiP@=^*,%V5?@<*3U9*!^CIVVG^oU#;#<EBCE;KG<6:"=%A
5.�>��T2&#"32632.#"#".54>7>54&+532654&#"'>7.'53>y
2;E8/ 7"oz43".5]%!&	,"h8;B"RFHXMNF:ES?;'H(:!5@4*3�9&
D419
	4(CX	J
#6!7#)1/*H%-&&F
;
0,��Z��c��O����=����#".54>32%"!.267!�K�lo�HH�pk�K��pr	�	oprq�-qfo�\\�on�\[���rr����yy�7��'"
#".54632'"!.267!'�sGo@�sIo?�JJ8MHMJ��L
��A}Y��A{rQOOQ�gZVVZ��"#3>?>32.g"%�g��^�	P'90!�@F��71N&'X1�HW(J2&#"#33>?>�	
{u�\F!/D(*�z��*?H"�4:����&!�^����&"�)=���6#".54>3232654&#"%33>73#"&'5326?�E�dg�BB�hd�E��emncbnmf)]wk]�ZM$
.9fo�\\�on�\[�o�������+��'H"Q(2��LZF4+G��7�G"&T^I=���2"&'.5467>32'>32>54&'#"&'�%[}@��%$X|CB|X%a$$	\]]\$$[__;b�b��`�bb�a��ss��ss�7��\L-#"&'.5467>324&'#"&'>32>\pc7^vqd!_t[;>@:;@2?:
t�0�us��rQddSSf$f=���	!X4632;#".#"#654.54632".54>32.#"32675332654&#"'>32#"'P=5&IR38XD4@i;!<;f]|=>tP&K"4RZfe7Z8 ef[R3"K&Pt>={]hGG�56>9{
	
"'9�_�om�YC����������CY�mo�_>>:��Nq U2;#".#"#54625654.54"&54632.#"32675332654&#"'>32#"&'�&IR29XC4@<g!=::gk{rd"8)=>NC"4X6"DK?=*9"dr{k8QPq?955k"(8#
	&���C
je^l��l^ej
C����(""(��~s
4#'##'##'5.'33>7.'33673#.'�([Z'7];] .3a	] 09<I^a\P >4�sT2222T��_��[���3M(4l0T���8w9����4��;����
1#'##'##'5#.'#.'33>?.'33>7M([Z'DZVR<vP*N3W(8	
J
X!46J�T2222T����4�;�C��h_��35�2i1Q��BV�<�f�2.#"3267#5".54>�8i)%"S2v�v�-Z|�FS��M�������_�jl�]7��"2.#"3267#5"&54>9(PDSQRP ,X�Cu"I	bii`	��慎d|93��-t'''7'77'7�;Z�"�d�!�Y<Y�!�c�"�t"�Q9Q�R9Q�!�Q9R�Q:R�5:���#"&546;>32#���/h2�8c���2#4&#"+532>�5<?EW83RI�55$?��\� 

4632&��"0:x�#'
	
%��\� 

5654.5432�w:0!�R%
	
'#�H��r2;#".#"#546F&IR38XD4@=r>956��9

)7ESao>32#.#">32#.#"!>32#.#">32#.#"!>32#.#">32#.#"!>32#.#">32#.#"�;<:?/-$&(<<:?/,$&�0;<:?/-$&�<<:?/,$&O;=9@.-$'��;<:?/-$&x<<:?/,$&��;<:?/-$&�5=@2"#�5=?3"#5=?3"#��4>@2!#4>@2!#��5=@2!#5=@2!#�4>@2!#���&4#,5>G#'>7'.''7>7.'%.'5.'7'>#>73AR(��?:	02+`#9)f/�P2q+	-i/�-j.1q,20(?9��9(g/(+`h(9R41q,	-j.�+`#9)f.1?9
0��R(9(9R��(g/),`"::	0(?W-i/2q+a�D�
%"&'3326737#4>7##3333bPQ/4-6SXsMS�udT�cbHKM6%'4KM�A��LK���w!MDP����U�G��
""&'3326737#4>7#333IbPQ/4-6SXH=R��lSl\?^LL6%'4KM��=2/�?�� K��2��4�3#32+#535#3254&���Zl~5���JJ�bf�`�ZN�5\:bo"NZ�����D8	�3#32+#535#32654&����okht�LL掐<LF�wC��MKKY>Cw���(00#a1�'+#32267'7>54+12993G0CWZċ���$27A�_�9dK+]
���n�B*S8+���U�0","&'##33>32'"327'7>54&S>QXH
N@cy.)74?!8RCAX:7=G
/6�I#0��Tu"K)T�\^ckK)OR8eea�]!#!5���ZH]�ʓU��##35��X���,���
!3###53�����ZJJ�P�N��:NB�
#3##5#535��XLLJ�D��D�a�g� "#!!>32#"&'532654&7Z���;��DxN.?>"Z]�:���P���m�FP{xwzU�� #>32#"&'532654&#"#��"�:b<&9:"?CTY"XJ���ay8N
`fic��Du�	3#5###	33K���_V2��V��g��dV�����j��j��o[��Z��Z�G3#5###33�ݯbU0�R�d��`�R��������������&�$�:4&'.'532654&+532654&#"'>32#"'53263\(/o1`cthfajiP@CY*+*{Mtx\MZ^}}*31t4RHBD>KG<6:"=+dMIUXGXs:&,48!�$�"84&'&'532654+532654&#"'632#"'5326�]6"]7<S�H:ES?;,C(Tg\m6/ 6!ag*31t5O)2ZH%-&&F%ID19
	 4)?X9&,48a�D��	3#5##3\��lV;��ZZ;�����j����ZU�F5##333�+�XX�`�Z����������aj�%#5'#375373#'5==ZZ==�f��5lɌ�D����C�b��"���U73#'#5'#375%m`��fz@8XX8�S|�6��\�?����@�
j�53533#3	##
TZ^^;f��Dl��Z&OUUO�Z����j��&	�3#3###535����`�f�XLL�ZA��������]AZ��	###53���Dl��Z��;����j��zP��Zk###5!X�e�V���������H��a�D��5#!#3!33�Y��ZZoYV��M����.����U�Gw5#5!#3!533 P��XX#XO������2��a'�
33!3##!aZn��Z����.P��M��U�
33!5!##5!UX#�X����H�0��a���">32#"&'532654&#"#!#!`7��CwN/>>"Y]ul9Y��Z����k�G
P
|vxy��y���U�B#>32#"&'532654&#"#!#!"FqB5[8$64 9<PS"X��X�18|fay8N
`fic��2=����3?327#"&'#".54632.#"327.54>324&#">�#7 $&'.N#? h�J�� :2tg�j(-0S43S2[/-...$06KAlPO		Z�k��
L	����1�KVm31m_RabOGw& {7��]"2>2.#"3267.54632327#"&'#".546">54&!)
$P?F9%ZCAU9'
#%D2%Om8v
"#$ ("Gne9Z3 W:\VS_DaFJ|K���;51KK43;=�$Y�,4&'.54>32.#"3267#"##"'5326y"~~O�nqT$!Q0s�{{/T((U;)31t8��l�]*L����N8&,487�$�"*4&'.54>32.#"3267##"'5326*"PbBqH)L@�ML,C@*)31t8�wc|:I	�ag
N8&,48	�D!�5##5!#3BZ��V��yQQ����G�#3#5##5ƮOVP�I�z����I��6�>��#533>73*X�\po\�����(YX)&��6�35#535333#�b��a�O���_�KO���3##5#5333>7�ц�X���\nk��C��C��.N!!Q/�Dh�5##3332��_��d��_ݺV��6��tV��������F5#'#3733�(��c¹d��c��N���������	�DG�5!#5!#!33����dZY��yQQ��z�����G�5!#5!#!33l�B���XQ���II�{�1��P�D��3#5##"&533267YVVZ:e>dnZ=D;^;����%]X��:9ZJ�F_3#5#5#"&=332675OWP-W=R[Xg2R+�2����!VH��\�PY�##5"&53353>7Y["F&=otZ@I='H�6#
��Z[��9:��\J#5#5#"&=353>75X8 ;	RXX_;8���yrWG��Y���aj�3>32#4&#"#aZ:l7dnZ=D;^;Z��]X��:9����U�M���#*2!3267#"&'#"&54673;>"!4&�j�;��yyDm.+nP��
7FK6��au�]�Z�g3{�R��?5"1��P|wq���f!#*2!3267#"&'.54673;>"!4&�Fc5��WO:L*)P7s�@EH3

Ad9>J@!<lI5aYL�67 
1Oc/HNKET�D�&.2!3267#5.'#"&54673;>"!4.�j�;��yyDm.'aCW��	7FK6��au�&X�Y�e6{�R����?5"1��P|wLl;�Gf!%,.'.54673;>32!3267#"!4&bZj@EH3
�YFc5��WO:L*#G,V$>J@�o67 
1sn<lI5aYL��NKET��(*�.T�
#"&'33267333	###iW_bQR/4.5���dVd��g��V��g�KMLL6%'4��[��Z��Z����j��j����
#"&'33267###332W_bQR/4.5���d�R�d��`�R��KMLL6%'4������������a���#32#"&'532654.#"#3>?3*��H{N.>?(TeArJ"9ZZ6�k|��n�EPzxPg2����?�U�%#"&'532654&#"#373=d;$75!<N]X0WW�a�Jo>ax9L`gh^����7w�D��%3#7###"&'532>7>7!caHgNZ�	
&?3#
#�P��{J��4C^0K1I$&��o�GH%3#7###"'53267!�\@Y=X�/L96ACJ���ϩ�^C��a���%#"&'53265!#3!3�DwN/=>#\_��ZZoYFn�DOvy	����.U�(%#"&'5326=!#3!53(5[8$559=��XX"Yav6
NYg����a�D��%3#7#!#3!3�bIgNY��ZZoYP��M����.U�G�33!533#7#5!UX#X\@Z>X����2�����P�DY�!##35#"&5332673YWVS:e>dnZ=D;^;Z��]X��:9ZJ�F##35#"&=332675OVM-W=R[Xg2R+���!VH��\�a�D��!##3333#7#4>7#��S��߄aHhOY�rEB�F��I�����CB��U�G�%#7#467####33�@Z>O�J�Ou��uJ���V.�Q�-/���Q��2��(*�.~�
#"&'33267'!#3	.'3�W_bQR/4.5yV��U[Q��
Q��KMLL6%'4�X���3*-;�.����
)4#"&'332672#'##"&546?54&#"'>326=�W_bQR/4.5cb^@#MDI`~�[:5*L!#`NdM7+DZ�KMLL6%'4�V^��L,*MRPW C4B��83-*KN0��~�&&l���.����&Fl�����5����.��-"�a��
#"&'33267!!!!!!�W_bQR/4.5U�q���#��5�KMLL6%'4�X�O�N�7���
%,#"&'332672!3267#".54>"!.�W_bQR/4.5cEc5��YP3O*)P7LuA;kF?I>�KMLL6%'4�<mI5[_M>{YX~DHQHDU;����"5>32#".=!.267!LCq0,kOq�NJ�ij�;zbbz�U&X�R\�po�[[�o"y���}vKm;��3���"��;����&�l;���3����&l���T�&�l������&�lS��&���&�l�����!����&�l�#���#"&'532654&+57!5���:g-/n2a`qiC��G�dc^xRJCC>I�P��#"&'532654&+57!5��DpBAwQ;^ !b:M`o[;��@�5aIGm=PYMTK=�J��b�W&������U-�&�����b��&�li���U-�&�l(��=����&4le���7��'�&Tl
��=������7��'" ��=���&le���7��'�& l����;�&�l���������&�l�����pW&���������&^�B����p�&�l$������&^l�����p�&���������&^�[��PY�&�l0���J�&�l	a�D��	!3#5#���UUZ�P����U�G�	#3#5#��OWPI�z�����a��&�l����U��&�l_�:��"&'532=##53!!3#3�
0YJJ�����N9�I4F:NBP�N�@E�:�"&'532=#5#535!#3#3�
0VLLI�M9�I4F�D�J�D��@E�:a�"&'532=##333�
02��_��d��_ݻN9�I4F6��tV�����ڑ@E�:"&'532=#'#3733�
0-��c¹d��c��I9�I4F�����΅@EF�3333####=��d��`����f��`ם�)����O��6��R�3'3733##'#7#8��d��c����d��c��6����D����>�!"&54>;3'3#"C�w3vcmZ�df_WUg^9b<.�6MD>C<��7���I>��+�'%326=3#"&'#"&54>;3"32>=�940:Yba=MP?ns:~fEZ�_a�/7�95:7��Qj,&%,hfA`6.��>K�1�6��3�"/%326=3#".'#"&546323.=3"326754&,A83Yd^2>%
UKcxw^=KW�FBCFPA>�@J@A��b_+(8����.!
2��jeee\^dj#��.�+2326=3#"&'.+532654&#"'>	nt[GT[3;95Xh^[pjba]abK<:W&-)v�cMIWVJF=;@��aa_kKAII<6:"<+&���"(232=3#"'.+532654&#"'>�Xl3,1=19iW��GGE8AL;7&E&)R"ID19

:4-5���¡1+H%-&&F#�Db�#23#5#54&+532654&#"'>qx`JY_ZV[vkceghO@=](-)z�cMIVXGz���D>II<5;#<+&�G	!$23#5#54&+532654&#"'>�Zn6-5 RVPJMJ;FS@8(L$ *_!JD17
	5)J����//I%,&'F����)%32=3#".5##"&'532>7>7!Q56lXi[9Y3�	
'>3#"u�@8{��aa&VG�I��5C]0K0I'(��o��%32=3#"&5##"'53267!�28eX�]f�/L96A;�?=���_d��^C��a����%326=3#".=!#3!3o5665Xh[9Y2��ZZ[Y�@9;@��aa&WG�����.U��D!5332=3#"&=!#�X38eW�\g��X���@=����`c6�=���� !#".54>32.#"32>5#���l�PT�w;r-"&f4��6mTM[(�r+��Y�rn�\M��U�I9eA7��M"3#"&54632.#"3265#P�{�����:]( T/ggYdXM�"~����Eo`\qSC	��p�#326=3#".5#5�8758Yk[9[5��Q�D@9;@��aa&VG�Q��?#326=3#"&5#5��4825W�[i�H��@=<A���_dH5��%�(2.#";#"3267#"&54675.546=Lo-0)W>CMfdedhwbX=k-V���e[O[}�'@ 97<EJADCCS&o^J]
UINe��+���"�:��*"&'532=###"&'532>7>7!3<
0Y�	
&?3#
#�N9�I4F{J��4C^0K1I$&��o���@E�:;!"&'532=###"&'53267!3�
0X�
.L:
6ACN9�I4Fϩ�^B��,�@E����#"&'532>7>7!3###B#"��_��f��_�	
'>K0I'(��o������6��tI��5C]0��"'53267373#'#'#56Ac��d��c…r/LC������������]a"�33273#+2654&+a�bs3�_��f�!lNRHfdX_[�2eL���X$��cBOED��U� ")33>3273#'#"&'#2>54&#"UHNAVs�c��d�
sY>Q�1?GJRCA�I#0ii�����mo/4�/6]<\n\^ckP�.5463!!!!!!##3#"�&C*�����#��5�t��iFhlU[X8
.P?agO�N�O(��t	;DBH��="")2"&'##7.546;>32!3267.#"35#"ug�
}�f�:$hV�K/Ec5��YP3O*)P5>C?I�t�=5E
rm��#?/MQ: $<mI5[_MKDUQH#�0&.-��=�V��6��7�"V����<��\aj�!##37'773'jl��ZZ�V2VXf�Z3X~j�����S5Ra�V5U�U773'##37�,E=`jJ*IR�f�XX��+EEwJ,H]����������6"&'532654&#"###"&'532>7>7!>32�/>>"Y]ul9Z�

&?3""T7��Cw�
P
|vxy��{J��4C^0K/I'(��o����k�G�,"&'532654&#"###"'53267!>32=&9:"?CTY"X}
.K9 6B "�:b�N
`fic��^A�����ay8a��&>32#"&'532654&#"#!#3!3�7��CwN/>>"Y]ul9Z��ZZnZ���k�G
P
|vxy��M����.U�J&"&'532654&#"#5##3353>32r&9:"?CTY"X�XX�X"�:b�N
`fic��������ay8a�D��5#!#!3yY��ZV��{������U�Gi%#5#!#!iWP��X�J����3�2a�D��5#4&#"#3>323iY=D;^;ZZ:l7dmV��:9����]X��U�Gh�5#4#"#33>323OxZCXXY4bbO��W�e^����(#)*]g����4~�3!3#!#"&'532^ZlZZ��K@!<=��/�6N�wIHI��"&'53253!53#5!#CXXX��D�IZe�����K\�D{�&!33	##!3#5!#3>7!B0Z;f��Dl��Z��[V�V7$A2 O/9 M��9��Z����j��I���>���OQ:���6)�F�#3533##5#3#5!#3>73��X�`�f�X�NU��T+EEN"5#�������������_�|ED��0��@�� '3>7.53>7!3#5!>7#!5l)DKUW&'PW��6U7� z&tg&�&[1
XK��\_�X����G����,0X�F?&367&=3>7!3#5!675#35M%~M#'JQ�u�PKw[�(W1�5=���/6
@�L�0�����8�:l�7�@��%#5###"&'532>7>7!�WT�	
&?3#
#�M��{J��4C^0K1I$&��o���F8%#5###"&'53267!8QS�
.L:
6ACF��ϩ�^B��.���E�
>32.#"7#"&54632��kLHl"ED5:8��eRX_GFKC*���E�4632#"&%#"&'73267�kMHl"ED6:8O%dSY^FFKC�G��>4632#"&�!  !""""N6��4632#"&4632#"&N$$$$$$$$�&&&&��&&&&�Q%#"&'732654&''>54&#"'>3232675#53.#"#".'7326323###"'�[CV�?G+d>&0) D9/%<"M1NSC	&$ 2IG'%

#9/B%+ %8*ohQ.�FD��j{#'%:F,%$ EN;N*

�GD1;7,,"RJG��"x;%#"&'732654&''>54&#"'>3232675#5!###"'�[CV�?G+d>&0) D9/%<"M1NSC	&$ 2IhQ.�FD��j{#'%:F,%$ EN;N*

�GG��"x?%#"&'732654&''>54&#"'>3232675#5!#####"'�[CV�?G+d>&0) D9/%<"M1NSC	&$ 2IhQ�Q.�FD��j{#'%:F,%$ EN;N*

�GG��'��"���n<%".5467>;5!5!##"632.'.5463232654&:/@>1]���n�	.7JbSK?"!9h-;E+FM1�L3(
VGG�!
KAAK

F9 ),!$������&���3n'!##".'732654&''>54&'!3n O$9-N09g_,GCO.)5-(#JG��nG'0Z. U;2D"=�rNwC%1)EF01-
n<!!>32'>54&#"#".'732654&''>54&'!�� O	>"AS#H )#'*-N09g_,GCO.)5-(#JG��nG'0Z.	OE.\/)G(,'%&2D"=�rNwC%1)EF01-
��cnF7'7.#"'>325!5!!>7&546323267#"&5467.'#5/�*=*9)"J,(@>%��c�k"C
*&-
4.1 /"B)LT/.5:PAC�6-J90�GG�	 ,!"+!)!"F
O>(E
������nD%467>54&#"'67.#".54>32675!5!#3267#"&�=C,#3.M1(++R:6:`81I%,I!0D�*ʤ(B=:2 /"C)KU0I0-+?=.#.$&EK142[]55C-
GG�JE)M 
,$"E
N���H8y&�"����H8�&�#3�H8n/#'>7>=#'>54./.'&=#5!8^%Q
�("n?5!H
01W'7O8'�3<0J#)��.:&>$A2(G*-#21"$D�G���H8�&�$3��'y&�"����&�#����&�$����&�%�	n4!632'>54&#"#5#".54632.#"3267!5!	��0EAR#H '#68QG2/S2nX91:@=(,E��	'�2SM.h2) T)/.H���$&M9P^I4/53*#GAnD#5#"&'.54632>54&'#5!267!32675#".54632.#"�Q#S*l�b"%	�A��#:��F>F�c+N%@(/K+`O6%077'��-k}#-";/GG��%8R`TZL'F.IQE,,+)Bn#".546;5#5!##�7&"BhQ'��*<�GG��']n-##5#"&5467.547#5!3267!632&"#"]gQL7M`(.
4]�J8,4M��+"#19'�٦QC4F*G��*'+#!%(F(�n0<%".5467>;5!5!##"632#"&'73254&74632#"&f:.A>1]�o���	.7Jbbcb�;=9wKt1k�L4(
VGG�!
KADVXF1DAN"$s  !!�n"##5#"&54675!23#"3267!5!�hPH2Mc�%$ :G:&2G�/�'�٥VG3HF1/+++#G�nH%2>54&#".54675!5!##"&5467.54632.#"632&"#"(M~K.)"5:!QJ75�9˴3C2]�Rab*/ZI4
#X,"#^>F?lE/>$ 3?S40D	FGGJ
TH:nX4S@-A+<@EA 	FF(&�n"##"'#".'732654&'7!5!5!�Q�)$,)C(5`X*G.d: )=-���'��rP-.>=�w��"(,N@nGG��n7L%".5467>;5!5!##5#"'.'.5463232654&727##"632:/@93`��hQ0	SK?"!9h-;E+FM1�64��	.7*#=�L3(
VGG���AK

F9 ),!$.�!

�n+>32232675!5!##+#"&'732654&#"�AC^	'���gQ(0
>M"U�3E)YB7>9).�D?	�GG��27jr]P4+.(n ##"3267#".54>;5!5!�70@7,G*6L*,c5Em>Do?��'�&A0?J4bFAY.�GXn$##"&54>;5!5!2654&'#"X�PXBnBq�Do>��X��G^:9#J/!_'�qIFW)qgC[.�G��=C0M7'FDPn0%".5467>;5!5!##"632#"&'73254&f:/@>1]�oPn�	.7Jbbcb�;=9wKt1�L3(
VGG�!
KACWXF1DAN##An%0!".54>75!5!##"&54>32'>54&#"3NuBHvE��A�'@E @:!A11?sf7F##,7gIF_1iGG�<):J(*"<%%<"FW�%!-)"+�n####"'.=#5!27>=#zQ�B/],O�4�
!'��'�*:;F6�GG�� ,+��'.��Hn##".5467>;5!5!�Qm==JG6.O/RD��pH'��H+1[94(PV0#8�GG.�x-#5#"&'>54&#".546323267#5!)QP7Uw_M/% QALI5)K0PJ:34J R
'�ٴa]G6233	F	=:89#H8J\$#( GG��n4.'#".5467>;5!5!##"3:7&54632�&*UG+!`;���1:GOR*+-!:"F/O9,?_GG�. 5E#1 #	3#*vx<##5#"&5467.54632'>54&#"632&"#"3267#53vhQI:M_/;R?5G(=	(1#299,5J>�'�ٖQC2G8<O8-/)'
,# 'F)&)(+2G9n!####".5463!5!9gQ�6&"�nG��*6*<�����9n&��Gn#5#"&'.=#5!+3267�QD/(AOG��
2(F'�ٿI@�GG�)0&n$/>32'>54&#"#5#"&'.=#5!!3267�:#AR#H (#59Q@+(@O��()@'�SM.h2) T)/.I���G9�GG�70"In(##5#".54632.#"67!5!3267'IgQM88Y2yb('2��oI�6C0!�)'�٥*K3V\E�'G��43�.�x1235#5!##5##".546;54&'&#".546�%:Ƀ;gQ�*$!
+/9KYLxD>t�GG��%!',i/2G=@;5dn#5##".546;5#5!+3�Q�*$"~d���'��%!',�GG�Sn##5#"&'>54&'#53267#ShQN3Zo><{�=12J�nG�ٳyd
/,0G��11*46l���n!%.'.54632>54&'#5!#�6;hP
"%'$
��h,L1-w*61dX$"<'-GG#:7L54o���n!-%.'.54632>54&'#5!#4632#"&�6;hP
"%'$
��h,L1-w��!  !*61dX$"<'-GG#:7L54o7""!!���n+5!##&#"'67.#".54>3263235�hQ2.M0(++R:6:`81J$,I!:W'GG��c?=.#.$&EK142[]55C8}@n!0?5!##"&'#".54>32>7532654&#"326?67.#"�4D+O66P'I-/M.-P36O':#m!=#*?7%&5��6%&6!<#*?'GGw]J5U0+$.!+T=8T/+$'"r��!#7>@455>5541!$8���wn&�7;n###5#".54632.#"3267!5!;hPK56T1s^
'%
0>F?-4K�};'�٥*K3V\I6230-#G(���x,47"&54632>54&#".54632.'##5!z#/$'2@;/98^]GC/R3E=-T@3S%�QY�#VA8C#FS:3@+U@Eu!'_,,H]j��'GGQn##5#"&'.=#5#3267QhQJ2(AO����22�
nG�ٿI@�GG��/�)0���n&3##"&'.'.54632>54&'#5!2675#KQ:'*]!)o=68cL"%	����'@"�
4'��
	
4n161dX$";0GG�	�.*>�r"n7%>54&#".5467.5467>;5!5!##"632A$.:AEIGF6[c;)���"h�	/6EW)DAE$ &+90:G55G|M&;4"(
VGG�*C&:L�Vg��%53�Qg����%&���@���4632#"&��!  !�""!!*�n*%#".'732654.'.547>;#"�UF.NJ)E&J2$-/+,1.;?]f'	,&-6�BO"RI#ER$%)0"$8/>G
 ($<;n##5!�QY'��'GG����N�$�.546323###53.#"�TK<P:ngQYW=7(*g#@"AS9y`G��'Ghc1+"7�9��632#"&'73254&#"�6:KS]Va�<='FO1j1+M?=N\L+0>J! �����#"&54632.#"3267?9KU\OKpV">6pI342*�

O?9P8[5'SX' &
����#"&54673267C)KUYX:42 /"�
O?8SB,!"���vB&#"'3267#"&547.54673267C)
,% 0"C)OQYX:4-$ /"�

?
K94"/JB%
���Ey
#"&'73267EkMHl"GC597_dSY^FDIC�%g���.#"#".'732632�(&

#9/B%+ %8+gH4;7,,"VM�gg���.#"'632�)2""'46O?gO[&	I3{k�Tg���.#"'>327.#"'632�-+*2-F&, '46O?g(%	E
+&49E3{k����*y&"����(�&#���j�&$���W�&%�M�����
632.#"�DeO"92eD	,3V3)PKg n#3�Q�'��nG����&�PZbg4632#"&%#"&'73267#"&'732654&''>54&#"'>32326?>32#"&'732654&#"#1�kLHl"ED5:9�[CV�?G+d>&0) D9/%<"M1NS%% #F6&F-_P.D 1.#9+!(9/
0&eSY_FFKC��FD��j{#'%:F,%$ EN;(@/80%O?Q`#55647"),%.�[���h#53^GG���c�l����!!�cI��MG�����i'3�rlG����N�i#7qAGi�����*�
#"&'73267!!*dD@cD:/22��H��gO@DK4./4�@��J����
"&'73267��Ad#M==M"d�'B""B'����
"&'73267"&'73267��@d #M==M"g>A`#,O22O+#`�&B!!B'v BB ����	n&�������An&�������Bn&��������n&�1O���@Pn&�S���@An&�/����n&������Sn&���^onX7'7.#"'>325!5!!>7&546323267#"'3267#"&547&5467.'#5/�*=*9)"J,(@>%��c�k"C
*&-
7+,% /"B),% /"B)OQ6./5:PAC�6-J90�GG�	 ,!"+!(
?

?
K9%B":
����:�nW2675!5!#3267#"'3267#"&547&5467>54&#"'67.#".54>�,I!0D�*ʤ(B6;,% /"C),% /"B)OQ6EI,#3.M1(++R:6:`81I�-
GG�JE#7?

?
K9%A*D

-+?=.#.$&EK142[]55C�.�v->#23267#"&5467>54&#"'67.#".54>32>h8&80%#5 ;C8> %!
F#GA.-J+':";:3*6
>
?2(=0.%")J52'GJ)*4�.�v�J"'3267#"&547.5467&#"'67.#".54>32>323267

%$5 <B#$%!
F#GA.-J+':";:%8&+"&$5��
=
=2
',0.%")J52'GJ)*45+
=
�n3#�QQn����n3#3#�QQ�QQn��n��Ky�%".54>32'2654&#":[33Z:;[43[=5D@54D@y3[:;Y33[;:Z2GJ89FJ98F����x*2'>54&/7>54&#".54>HR#RGy(A�jn)#'110?xL9'IQ2`<#51�Dh2  !:>05#T���x$%&'#"&54632>54&#"'>32�@_O#0$&+>A4#<&%S+7Y4F9-W!-�L#O9;<E*UAFl,pZ���x3>32.'#"&54632>54&'#'2>54&#"ZP5PY;0,?:;A#< "0$-"0-52!&<@0&"D#RI=J(B*3ME"*2N#	0$#0G&# >���x+9%#".54>7.5467>54'732654.'�QF+G+,.6A!U7878T
"A3/+�"("(
!  
7J!<(2A/6M:/4J78K208K41E5
*&"/"!/"T��%x'.'#".5467327&54632�&$+RA&T#FJ		+(,-3CKNF2V@.m11]4FG
!1%	^`#g��xA.'#".5467.54632.#"632.#"3:7.54632�"B[.$)iP?-l'#,	
2>F2
)+-2CA=.M-6?,@CFG%
	E*,..
#1%	!U%&1L%#".'732654.#".54632dN=aI3P1UB=)1$:4c\E<:U/uh2wʙ��mRF3X6!FR:5BFzH�x!".54>?32673\:/*�>�.!B03^4$.p$L;>J2�5�7C"3+""J)G��x*4>32'>54&/.732654&#"G)L4MZGA�$@�7(P0&)0/''2�-J+]JAS

t<#51�.P&*36*)55@i.".54>32'2654&#"�)D(%D,+B''B+#++#%*-$?)&?&%>('@%B)! )+!)i��4632#"&i""""N##%%��+y&�"���%&����%&�����&������Jx&�3�����x&�4�9n$632'>54.#"#".54675#5!�*)tf"H:6,)*$$29'�gY0j4)!X+&7S&*!
�GG���n".:F##"'#".'732654&'7!5!5!4632#"&'4632#"&4632#"&�Q�'#+)C(5`X*G.d: )=-����h�]'���J),::�p}�%(G@VGG�DSn%#5#"&'>54&'#5!+'.'3267�QN3Zo><{S��
��
1,=1$5'�ٳyd
/,0GG�E
$411Bn7!##".546;5#5!#!R8�7&"�Bh�xG��)<�GG���n$7!#"'#".'732654&'735!5!#!R�v'#+)C(5`X*G.d: )=-����h��GCJ),::�p}�%(G@VGG��?�x2#>54&#"'>�_jYJPSLG-,< RxeRIb��GG756F
Pn/3".547>;5!5!##">32#"&'732654&!!f@-<#73d�oPn�!$8T[ad`�;;7zO>6,���+

D,/FGG�
	A9:KJ@3:;�GIn"*7!5#".54632.#">7!5!#!327'R?M88Y2yb('2	�oIh�q-C0 �-Gr*L3V[E�	GG��242	�����^R�'�������^
7#/"&54632'2654&#""&54632!"&546322>?12??2 !! ��^;22::22;1 !! �\�F#."&'#"&54632>32%27.#"2654&#"s(67$2A?4%76(2?2��.(($"%% +**\,-?50C)!,@45!3E"!((('D!$��TlH>7#.'553,"12",2�#44#
��rv�|#4632#"&4632#"&74632#"&.`�H��2���''7'77''7'7755#47!75#45
45#56!65#46a55#57!75#55!55#57!75#55����A>3232>3232>32#.#"#".#"#".#"�6+ *)$$), 4;5(&,#&,+&"-#��C?)********<Z/:T********+A"��6��	"&=3648E�4+n_�t����	"&=3"&=3 39E�47E�4+n_94+n_����a(%3#�*7�7(������(
%3#"&5463�j7X(��3c�C4673#.%#654'3�2002�2002� :0@>2:90??2:��cDC#/4673#.%#654'34673#.%#654'3��2002�2002��2002�2002� :0@>2:90??2: :0@>2:90??2:���3���h���kk�K%4673#.%#654'3�k2002)2002� :0@>2:90??2:�T�����!.'##'33>?33>?3#		+-B)!

++)
	!)C/�		y�s#"
yy
!
#s��T�����!3>?3#'.'##'.'##73	+-B)!		++)

!)C/� 		 y�s#
"yy 
#s�5���)5%#"&54>32#"&'>32"3254&"32654&�*WE|�)LkBNO^J+W$ `*\a�3MQ d,J"UG5B69�+H+üT�l<M5@EKT?3S�A4J '�)BG1',.�1
3#!#3>73�NU��T+EEN"5#��Z����bW�qE>�v,a7���"
#".5463232654&#"�^P3M,]Q3M,�'+*((+*'
��6{f��6yfn``nn]]7��A"".54>32.#"3267}c�PR�`=h $X*{spm?_($W
:z_c|:I
feag
N��T�#!5T�Xs���6�JU,3!####U�X�X����2�2��C�32+#5#32654&֔nkft����;GB��DMKKY�J���(00#	E�3#32+#535#32654&թ���gt�uu揑;MG��I��KY�I��(00#1��'�3#"&5467332654&#".�^�]Zz~~zY\�^LQSJNNOO����^n��n^���MdcNP^a������73'���=�6q����������
73'73#���=�6qW==���Յ�����!!!��H��!C2���3#'3#�65Q66������M!!����MG�1���3267#"'#"&'73267�KA5AA6@JA4-'<\F<<F\<'-4�P�����3!!�PN��7lE�E������463#";#"&'.�EL=
��.,�5:GE
,������E��"�V��h��'73�r=�(�-h�(��=� ���h3#'3#hDDxDDh������h3#73#73#��@@m@@m@@h��������[�����.�g�3����'70NOO�RRS���L����4632#"&'4632#"&��}!!!!!!!!�2�L����#4632#"&'4632#"&'4632#"&���}!!!!!!!!!!!!))�47>;#";#"&))73��#>O�BG E>��\�W#.#"#"&'732>54.54632~&%*4`K"	EHSG,E�15P��|3[E(K,R8i��[QX ���8!!����8H����I+53267>54&'&'+&'9?pz&	
"-#"I$"3.+

G0&$�OI;#"&'.54>7>7"#-"
	&zp?9'&*&0G

+.3"$$��O8.'.5467>;#"�*&'9?pz&	"-#"!$"3.,

G0&�����8'67>54'.+5325"#-"	&zp?9'&+&0G

,.3"$�����)3267>54&'.54632.#"+}z&	
)+2M@<\/B;(! %1)+9?p8'!$86!7I?O!26"2)"3/+

��,T8(%#"#"&'732654&'.5467>;Tz&	(,2M@=[/B;(! $2)+9?p�'"$76!7I?O!26" 2)"3/,

3�xD!".54632#"&'732654&#"32>=4&#"3267#"&54632�w�MnV<DMQ
	/.$4;6t^Nj?93#.4	

OSH>SkM�Z�f��H8:OA% qhGzI.Nc6ap 'DO:;E��i�V*�xR!".5467>54&#".5463232>54&'.54>32'>54&#"v_y:3*. (,
:AH=>D)1""TLOV"' %F;AA@;
,($1"!:9z4[8;L)3%") E(82>/B0M/ 4$9&*;$3%38#>+B46(F +& 4 V97Z4*�xG!".5467>54&#".5463232654&#"3267#"&54632u^y:3*. (,
:AH=>D)1"!RI�|93#-4
OSH>Sk�4[8;L)3%") E(82>/B0M/ 4$9&�tMe 'CO:;E�w��*#xFP%4&'#".5467>54&#".546323267.54632'>.#"���Ut;3*. (,
:AH=>D)1"#M>moU\#G;+J.BF#H!��<>)*!�$({�4[8;L)3%") E(82>/C/M/ 4$9&p]3A'6B,k\FA'W))?:'$NR�W��h��7�-�-]<�<8x6B!"&547.54>32.#"632"&#"327&54632"&546326co9,9'TC <.@7)1*3

%A'C?( 1Pg!!  kSO5M8'D*F0""9G4);=
	#"-"!!":���x1=32654#7#".5467.54632.#"3267'4632#"&�0�1"R
DG@B)I-1-9D�n6/LTN< : �
j((-D;7-:C5.HU<[aI;9<5

\  !!)�x+7E%#".54>7054&'.54632.#"'4632#"&"32654&'�@e:@i=:`8(@8;E@) OSo!!!!YO^*C&@R<8�<H 'O<2G'9+*<<,! #&1]�""""o23#,-0#=$���I4@L7>7>54'.+"&'.54>7>7;24632#"&4632#"&�$-!	'F?9'&*/"#-"
	&G*3!
'&+$$$$�$$$$&0

+.3"$:&0	,.3"$�&&&&��&&&&'*��
"&'732672.#"'>Kt!JI4;<OoWKt!JH5:<Oo$a_IHNEgYa_JGNDhX'8��
7>54&'7.5467'ALDHc][e�BLEGb^Zf�?<7LE$tLKsp?;7LD$tKKs���E�
#"&'73267EkMHl"GC597odSY^FDIC-�%'7'77	�D��?��D��@ؾ0��+��0��+/�E�7".'73267332>7#"&'�-A%O!+J ) O%A-,77�&b[DEEXXEEC[b&&..&������gw�������Vg'w����wl��
33#'#73'&'
�M�[A�?[�9
�桡�
�)5##!#3#3%35#��ԩP]|����M���H�G���3��2",7>3267#"&'#".=!.#"5>32>324&#"7>32672x|Z=3(M!#c2>QT6A^3WOJ1M&(M2�>#[MIa[3*?UK^H��9=:C�PW"A4B)-).<mG6`[Mq4=MQ-*KN08zETOJ
6'35#535323##254&+2654&+UKK�9[5ZFet�7>��BFFD��E�;3+E+DY<J&#��'/.(�;���"3267#"&54>32.FQ]VX"E#"D.��>xV+S#"A�l_^m
H
�Q|EE
V+324&+32����~�\d\M>�����d^�v$2+5#535#3#3254&}����88�H��9�d�����H�G�H��d^V�)!#3#3���A����H�G�!���"("'732654&+53254&#"5>32�gT(C,;?SE:H�S<7]"^:vo!6 /6m
%F&&-%HZ2)O[C(5 	
91CJV�7�#2#"&546�X+����2��
"&'532653t!$'XR
G-��xOKV�33>?3#'VY �g��g�+�"����%��
35'7373V#AY`$��:&�7<J�IV�3333#<7###Vw��vX�H��f���H �w�#��V333#467##VT	`T��`��:���+5�k;��? ".54>32'2654&#"=Ws89sW}�;sTVOOUUQPE}RS{E�}S|EGn__ll__n#���"&'532654&#"'632�.D"$D"Q^XW"A!Fe��=s
H
m^^m
E#�Q{F>
%"&54>32"32654&)��A}Y��A{Y_oo__ll�sGo@�tHp?�KRQLLRRJHE�74>32'>54#"#.:z_c|:I	�ag
N�Hn?ArH(M@�ML+DAZ&%"&547'7>32'"654&27%1��!8'>$e@��$8&?#c>&A2l_J1��o�sJ7(:-!�tI:';-"�
�$4RJ���"4QL4��|"!-4"&=!.#"5>32>32#"&'%2654&#"267!
etdSM4N()M5DifBFm?�r?d^@OFGPNHI��<F��<	�m5`ZM7878A|Z��8659IgdeifdhgNJES9���*#".5467.=3326=3"32654&�#)/8xd=c950%%Y2462X�A==AA>>�1EJ8X`+S:9IH.HH.<<.H�955<<559;
? 2#4&#"#4>>}�]OUUQ]9s �}_ll_S{E;��?
#".533265?;sTWs8]PUVO
S|EE}R_nn_V�2+##32654&�ne*aU3Y�:+HE=TM-N1�G�-5/.�7.546;#5##35#"�1ij�XX�fDG;><�#<-JO�����(--1�!"&54>7'3353'35#"ji1�f�XX�GD@<>PI.;$
����G�1--(�!##5!#Y����HHQ��%#"&5332653/aKjmY@AD<X�8Z4m[W��=BH7Y&/H�%#!5!254&#!5!H]h��W�d^��I*)�`bWxYDXG
\+��+!#!5!254&#!"&54632"&54632�G*']f��Y�d^���H
\4abYwYEX�(��J�!%#!5!254&#!5!254&#!5!J]h��YZV��Yd^��I*)Z.,B[ZWmNCWnQ>XG
U0~&\�333>73��YkkY���6126<��
�$333>733>73#.'#��RCVWT	DQ�]T


W��+X27.��"PX.��.:.

/:��'�	35!5!!' ��p��#:�DB�nD!���#"&'532654&+57!5��fWov:^"]7<SLMH���B�	ZFF`O,72,A�D����'"&54675>54&#"'>323267�ejFXCI:9&J!#\4be?OJR<?%S !%a
^P6o'AO527B_P6n'AP517B��� )%3267#".'#"&'53267.54>328'?%2<&6S"%"<(4A,O66O+"5�4*F10F,F)57n70K,,K0&MHV�##��YI�1
�33#.'
�S�]z	z��T).'��V�!###!�W�Y��0��V��5V##5".=3332=3V*dXWVd*Y�W�Ze2\9��9[2���3������!###"'53267>7!�Y�<8


:�5uj&WGH,Bq�N��'##3.'3b8�7;�5��		5�����R6#����#5##!#3#3%35#�E=�:�������&���/�/���?��!2+2654&+32654&#�VZ.+,<VK��<,6;L]>02@�/;&1.2;?��$"#�-�,$")
��&535323#+572654&+32654&#
2�VZ'QAVK��<,6;L]>02@�-�/;2-';?�-$"#�-�,$")?��+324&+32��s��i|>\SL?��ln�khUP��?B�!!#3#3B��Ƚ���/�/�'*�535#535#5!'ɽ��/�/�/�T(��3#"&54632.#"32675#	�%M1lr~r'F>!S]Q^+f�weew
/
]PM`?��#5##3353�;�;;�;�������#57'53¨77�77V�����v�'"'532653
(:B�-)��[>;?��#'#3>?3�E�/;;)}D��'���)��?D�33?;����0?�##333#467#�6W��V:�x?"�����_�T>��?��###33.=3�D�6D�7d?!����E�?��333#5467#?7�D6���Fb�T�!?��(��#"&5463232654&#"�mimijmhm��KNOIINOK�dyzccyxdQ]]QQ\\&��*".5467.=3326=3'2654&#"�2Q/3.&$;/330:$'-5cQ=::>=99"A.1<;*44)55)44*;
;1EL/4./22/.4?h�2+##32654&�[S#QE5;v;.CA:�B<#>&��.�(/))?��
2#'###32654&�VS:#�Ep\;}BE947�<=44����.�)(*$b�##5!#�;�[�}//;��#"&5332653�Y\VZ:==>9:�B[WG��59>0T�#.'#3673>7T{<Z
X;{=HR<U
H�T33�����409��648f&2#'##"&546?54&#"'>326=�@=*2,0>RU;&"2>3A2#,:f48�..114(	'�"-.5Og&"&=33>323267'>54&#"�?=)2,/?RU;&"1=3A2$,;39�./104( 
(�"-/$�g*"&546323733267#"&'#'26=4&#"�ANO@)3	. 4 7-+:...SSSU*�&,88
;AD9:?!g'283267#"'#"&=3&#"5>32>324&#"7>327�:'!2A Q$F@I�b 12 \(;2/@;")71=/��%'Nb'
(34P@ q/
D%/0-/"I)3\7l�!3>32#"&'##3"32654p4)AOOA)4)9c8+*:/.x$
SSST)ȭ;=;?@;z$Y�""&546323.=3#'#'26=4&#"�ANO@)3:/4 7-+:...SSSU	��8+,88
;AD9:?$Mg2#3267#"&546"3.�CL�:4!44$J]UD)/�(gPB79.
TPPZ,0+)2!Kg2#"&=3.#"5>3267�K]UECM�94"34#)+)0gTQOZPA 6:/
�)31+$g'#"3267#"&54675.54632.#"3�0b5'%79(JH.$K;&6-O6-�+7	.
6($"$)-*	.!g%"'73254&+53254&#"5632�C7,O6-&/d6'$=+LMH.$H*

-+6
07(%$"),$�Yg*2373#"'5326=467##"&546"326=4&�G&.MOM14M-3#ICLKL,0/.502g1+��EF10*
1WOM[-@;<?5:B98�{a#2#"&546v9
a��B��7U�3>?3#'#3ppC��Ey'99�
	m��� v�7+g!2#54#"#54#"#33>323>�;;8G3,8H4)9.	8Q<g8?��L63��L<8�B,67�^g%"&'532654#"#33>32	N:-9.
:!@@.�+M;9�B,8>��-3$fg#"&5463232654&#"fXJFZWKFZ��15512550�PWWPPWWP9BB9:@@g2#"&'532654#"'>zEU^E*+43e+7gLUYT	/@<v,&�ve
2#4&#"#46�QV=3784=SeZK:@@:KZ&v�
#"&533265vVRUS=4783�J[[J9BB97�lg"2#"&'##33>"32654&�@OOA(49/3 6,+9/..gSTRU��,-78;@F67B
��27#"&=#5?33#�	")=22"eeD();�DI)�3Za#'##"&=3326=Z.	<"?@:N:,a��+8=��M<8�;|J+53254&+5!|=C��TB=�\/�:;4H6)4*75)a!"&=3326=3326=3#'##"'#�;:8G3+9G5(:/8R=8>��M73��M=8���,6Ja
33>?3��=JJ=�B�23���
>e#3267#"&'#"'53267.54632�)4%#6
'"*>55>/}*+)* !B!+99+"E7�k�-74>32#"&'72654&+532654&#"7(D)BH6&1@W@#,_-6:%6/%*/!))��4>;8+2;6>B	��.*0/(.$%$+)��<a7533>53}};?7)9:4�zF�@9�X>me4|[�!-"&5467.54>32.#"'2654&'�FZ>8'8,1=1)0:8,H)144,298M@:G
%#*	*653A+:-,;91/8$���75.546753'5>54'�N^ZR8M_\P8<45s:7q��VJIW��VIIV���>78>?7o�}b"?'.#"5>32733267#"&/�N	
 Hu=�A
&&8u��*#���|) $m�3��vZ2#"&546#U

*9Zx��B7���72&#"#33>�
	)=9/5�1<0�B;'3��Z�%#'##"&=3326=Z.	<"?@:N:,�+8=��M<8���J�
33>?3��=JJ=�`B�23���7�kk-4>32#"&'72654&+532654&#"7(D)BH6&1@W@#,_-6:%6/%*/!))��4>;8+2;6>B	��.*0/(.$%$+)��"<�533>53}};?7)9:4�zF�@9�X?le4|.�b�4632#"'#72654#".RBLTXD8'^/3gY1�5RQYQMW
+U�=;}wa$��h5.546753'5>54'�N^ZR8M_\P8<45s:7q�VJIW��VIIV���>78>?7o�}�"7'.#"5>32733267#"&/�N	
 Hu=�A
&&8u��*#���|) $m�Q��o"'.%3267#"&'#"&5332653>32'.#"YP3O*)P7Bc#ZGjmXAAD;XF0Ec5\>C?I�[_M.4)6m[W��=BH7Y8%<mI5FDUQH���0�.:#"&'##.#"#>325332673#"'3>324#"3260zc?P?	32)
X21*P?dy[�UBAXHG��. Dx;E9h:F	";".���bgcij7����.;"&546323.=.#"#>325332673#"'#'#'26=4&#"dxyd>O32)
X21*
G
P1UEBYGGG
����.!
3S;E;k:F��H"0I]^dkq_`j����0&#"#>325#5754632.#"3#32673#"'#m	32)

^^\R 5*,+��
21*X;E�)h[E
;?#D�:F����"-6@7#>7533>323>32>73#5"&'#5.'#4#"%4#"U3/-G
U0~&]4[Z20/W=�AW@>XUnFA;~CUmNC>�@�/:
�I*)Z.,]hM/<��
��	
�YMG
	,ZV
��y""+2>73#5.'#5#>7533>"54W`b21+W.`^)X35*G
\&NGA�E"]hP7;	����8:	�I*)JMI%I���0".<&#"#>3233>32#"&'#32673#"&'#2>54&#"U
	32)HNAcyyd>Q21*X�1?GJRCAw;EHI#0����/4K:FI/6]<\n\^ck���",7&#"#>32533>32.#"32673#"'#U	32)H
R8#

)H+21*X�;E�b,@Q-Q6!:F���H"*7.#"#>3254>32.#"32673#"'#R	32)
(H00
&##
21*W�;ENBH
K,0|:F������"8"&'532654.'.#"#>7&54632.#"2673�8Q [/C<94
D3%$oZ1U%"J'69<N0&	2!t
P+$  2@
,DJF#")	+-?
&NP��S�4".=.#"#>325#5?33#32673#"&'3267�*G,32)	LM#4��21*/%*
4
HAj;E�*#r{D�:F81/C	"�$32673#"&'!!57&#"#>327!5��

21*)p#�x�32)+n��B�:F�D:�;E	�DU��0+"&'##4632&#"3632'2654&#"T4VFu{vKOwEO6phuttDIHGQJL
()G!st"Q*PG-	Q����JkcciWam`7ga353#5##p�99�9a������B*�!#".5467'57!5"32654&��O=�sGo@vhb���RJKRQLL@�M/oOu�:mNkxC~J��YPO]]OPY����77.5#5?33#373>32#4#"#3267#"&'$ZLM#4��X�M�E&bbWxZCX�*
4&=Kq:)8*#r{D��H=���]g��W�e^��Z��C	N$##575#535'53KP�PKKP�P?G�44�G�44���6"&=#53533#3267�OHMMXpp* 
&
UKbG��Ge1#G
�f"#*23##"&'###53533>"!.267!TZu86x`>QXKKHN1JE#F>DG��C"qrF��/4��F�I#0JLMGR�ghRZ`
��J"&=#5353!533#'26=!(jmGGYXGG/aHD<��@m[BF����FD8Z4GH7DD=B
��S$/".545#53>7#53!.'53#3#%326545!-Go@-60%��$=&=#�J6,���KRQL��
=qNF-GIEK85PEI;UFv��OddPU�:0�%1#"&'532=#"&'##33>32"32654�9<
0!&?P?XP?dy%"�UBAXHGA@EI4F
. D��";".��Km#�bgcijd�7�:>�$1"&546323.=33#"&'532=#'#'26=4&#"dxyd>OX,9<
0$
P1UEBYGGG
����.!
3�Q�@EI4FH"0I]^dkq_`j�:��&"&'532=##5754632.#"3#3|
05^^\R 5*,+��,9�I4F�)h[E
;?#D�u�@E7��"/<23733#"&'532=##"'5326=467##"&546"326=4&5UF�9<
0�u{vKOwEO6phuusCJIFQJL"()G�c�@EI4w>st"Q*QF-	Q����JkcciWan_U�:�"3>?33#"&'532=#'#3�	�gٲ:9<
0�=WWk4
���@EI4F�5��(�:��3#"&'532=#�,9<
05��P�@EI4F�U�:�"0"&'532=#4#"#4#"#33>323>323

04mNCWnQ>XG
U0~&]4[Z,9�I4FYZV��Yd^��I*)Z.,]h��@EU�:E"""&'532=#4#"#33>323�
04xYDXG
\3`b,9�I4FW�d^��I*)]h��@EU�0"%3#"&'532=#"&'##33>32"32>54&�9<
0!&>QXHNAcy%"�RCAX1?GA@EI4F
/4�I#0��Kn#�\^ck6]<\n(�:�""2.#"3#"&'532=#33>O#

)H+,9<
05H
R"Q-Q6։@EI4Fb,@3�:�":2.#"#"&'532=#"&'532654.'.546�1U%"J'69=33H&9<
0(8Q [/C<954J(o"F#(9+&:a@EI4DP+$  (8,DJ����.2.#"3#"&'532=##"&'532654>�&
�9<
0�$<$%
$=�	C%;�&�@EI4{~AI	C%;�BH�:�"&'532=#33>733a
0��^rr^��9�I4F��6126<�.�@E�:�3#"&'532=#'#37���,9<
0
��c¹d����Ɋ@EI4F����'�:�!#"&'532=!5!5���#9<
0�� ��B�n�@EI4F:�D.�:n!+6"&=#'##"&546?54&#"'>323326726=.1@#MDI`~�[:5*L!#`4b^,
#��DZOdM7�=J?L,*MRPW C4BV^�܇#EKN083-*7�:�"(5"&5463237332673267#"&=.'#'26=4&#"dxyd>OF
#1@&	P1UEBYGGG
����.!E�^�#E=J7%'"0I]^dkq_`j7�u�0=".=467##"&546323.=432.#"326726=4&#"/6 O>dyyd>Oy%
	$��UEBYGGG�IA?3
!.����.!
3O�I �A;%C	/]^dkq_`j7�:K"$+".54>32!32673267#"&="!.9LuA;kGEc5��YP3O*
#1@+L?I>
>{YX~D<mI5[_�#E=J>	�QHDU+�:!"5"&=#"&54>75.54632.#";#"32673267�1@+9sn!6 -7s[:S(!!E/ySF8I�R<8U!
#�=J>	YC(3	;1DJFL,&H\1(�#E!�:�"5"&=32654+532654&#"'632#"'3267�1@"]7<S�H:ES?;,C(Tg\m6/ 6!ov9/
#�=J�)2ZH%-&&F%ID19
	 4)C[	=#E3�:�"&-"&5#".=!.#"5>3233267267!j1@}^Dd5oYP3O*)P7KrCK
#��?I��>�=Jiv<mI5[_M<tU��#EQHDUN�:;�2#"&54633267#"&=#�A,
#1@5��1�#E=J?!�:�")2#"&'3267#"&=32654&#"'>�Gn?ApG

#1@B*PLNOAN":z_c|:8#E=J�
hdagI��:�(2.#"3267#"&=32654>�&
"8!
#1@
$=�	C%;�H=H5#E=J�%;�BHO�:�#33267#"&=#'##"&533265,
#1@%
\4abYwYE�1�#E=J?G*']f_���d^!�:�("&=32654&+57!5!#"&'3267�1@"]7<SLM>���t�e\ov5
#�=J�.42)A�IG�SFKeA#E	lg*2#"&'##54&#"5>323>"32654&�ANOA(3	.!4 7-+:...gTSRU)�',88
<@C:9@$#g"&54632.#"3267�FY]F2)g21,*PUYP,	y:>/	>g +2.#"632#"''67&546"32654&�2*g3=/5#4@(,]R,0#g,	y .(!&% '>YP�$f�*7#"&546327.''7&'"32654&�*KA-8WKGYRG"3+UI P7016612�	( #&qIUVNDCM":-!&�52,9:8%5!g%2#"'532654+532654#"'6�;H$.HML+=$'6d/&-6O,7g,)#$$(7/	6+.
*
��###5754632.#"3�X9==;6#
9X8��>7)I����a7"&'5326=#53533#	

00911/�+�*��*�-3$�Yg*2373#"'5326=467##"&546"326=4&�G&.MOM14M-3#ICLKL,0/.502g1+��EF10*
1WOM[-@;<?5:B95�Za47##"&=3326=3#!:"?@8N;+998=��N=8��8��2#"&546##5#5353U

[19009��*��*��5�a"&=33267�3/:
	3-��+�a#575'5�44�44a 
�

�
 �a##575#535'53�04�4004�4�*l

l*Y
  
Y�����&"&54632"&546;33#'26=#"U
H'1*/9112'
���' !(B��+<)+
7���
7"&53327�+892	�);�
:(���3#"&'532=#pL#�cRP,*�7a3379�B��,7�+g+2#"&'53254#"#54#"#33>323>�;;OG3,8H4)9.	8Q<g8?��T,"L63��L<8�B,65�)a$467##"'##"&=3326=3326=3#�8R=";:8G3+9G5(::	68>��M73��M=8��.���]g2#54#"#"'5326533>�>@8N;,3"	.	<g8?��M<8�;)
($m,7��g%3267#"&=4#"#33>32]#2N;,9.	<!>@�$(
);�M<8�B,8?7da3.=3#7F�6G�B��
1���
�$fg#"&54632'"3&267#fXJFZWKFZ�00�
[20��PWWPPWW*1/`�63i#���#5.5467533>54'N_\Q8M_\R66<67;6;6qeVIIV��VJIW��>67>?6m!�g0#"'3267#"&=32654&'.54632.#"K@1	+8<,'#339H;81H'227x/09();Q	'')-
*	''�����2.#"#"'5326546�	3"	3�
($�n;)
($�;)
��� 7"&'532=#".=#5?33#327�
+22"ee7�,=,'�DI)�:lP�a53533533##'##"&=3265#,:�911.	<"?@:N:,��*����*�+8=)%M;7va"&5467#5332654&'53#�FZ#!T�/15510�UEXQF-@,*
F4/<<0.L*,3QGQ5Oa#"&=3326=3OFIDG:S,(9�3DA7��M+"�5\g2#"&=3326=4&#"5>�-5�LG9+//,g(;Z�FK��:-.9V!-Ja
#'.'##Ƅ=JJ=�a���33�Ba	#57#533����#�)(��ba%"&=#57#53332675#0ɼ��	�);,#�)(�T$(
�Za!7>7#57#533>32+72654&#"mc���69("+0;?Z"!�	#�)(�0/%!)]
6	�.a#"&'532654&+57#5�,H,^O&=?&2>H;&��a'�;+@Q
0	5.3-$�-$_�"&546323.#"267#�PLHTQNI��/21._30�.{mn{zom{RPP��R\[S�Uw�#!2#"&546#.'52#"&546}Z*7,#"T#T
C�Cw�#!"&54632>73#"&54632��`6*K�7T"
T#��,2��'"54>54.54>54#"'>32,W
!3�	



		
�H`��"#"&=332>;�3RI&5=@4DX8�659>�l^��37#��{"���C?K�h^��#'73���"{�^K?C�lT��3'#���"{��K?C�hT��#'73��{"���C?K�&S��'77'I�"v��"vSL?@AL?@�&S��'77Bv"��v"��@?LA@?L���V��2&#"#533>:

*(!%< '!r�'����l���'���M�����N���32673#"'#5�1(&29MDd%��.#"/ENRA�\^��#.'#5>72$r�J<^�PW�Z;*gh\�26
//
&))���<
4#"5>32'>��//75,,"%�1;4.(I 6������]�������� �#363232654&'7#".#"#�>. #/()(0:0$7-)'-?m,
9*.7($�;[�8%32654&#52#"&54&#"3"&54632! 1>=31=! 1==21>�$!!1;10=91$""0;2/=:��t74&#"327#"&546325>?#	-9?12?78�,%!1:10<A?>f0H����^�&������]h�F'-82#3267#"'#"&54?54&#"'>326"34&326=W,3�D""@)#!+n(#,716p�* &F5+K-!A
"">"V �Kh�G'1#"'1#"54?54#"'63263232654&#"326=�=3B?Rp,3%)+971>�"$%""%%!M&), &�6:00@A2 95&--&&++*#!�nh�G('##"&54?54#"'63236?3'326=	$#(p,3 $)+X	
I,w_&), &l !A2LE��h#!��pg�'#"'53254&'7.54632.#"3267JC	!)3@1"GE!	�(
	53;5RP��hy�#"&5467&'72654&#"O:61=96;&,6$"##F"()287//6$(
�*" (J!)��hz�(7#"&546327.''7&'"3254&
4-'<50>911;37%""%H#�	K1994--3&
y$!&K$��po�(2373#"'5326=467##"&546"326=4&1 l5"#6#2/444!@%!"� �\   :53<+(Q#&	,&��hkF2.#"3275#53#"&5462 RE3[+0>FFRP;l59;5��l~�3>?3#'#3!M/bh/T''�H[{dO0��l�#3((l0��ldB5332(nlֹ��l�B53373#5<7##'#s5GH5(E!Dl֤�փ
�����lqF2#54#"#533>,,'6)( )F%)��4(&o���lrB53.=3#'^1}%1{l֬!|֬$	x��l�B
532#'#7254&+Nl'/#D.>:9;@l� ZUUr%G��lpC2#'#532654+'-0B,;4-6-(C \W%��haF$#"&'532654&'.54632.#"a4,%)##(2(&
"2#"&�  ��ld�"#54632.6(,$	
���)"��lbB	#57#533b��z���l����h�F'"&54632373327#"&'#'26=4&#"-66-$ 	$&(   h8778
�&%(+-&&+��h|� 3>32#"&'##3"32542
$,77,$
(D'(@R
8778
0s'*(*SQ��pw+4632#"&'72654&+532654&#"^<+.2&",<,A&)&!!'p43+'%"'%),jy)�	��hpF2#"&=3&#"5>32674@;0.5�K#$!F855<5,J�" ��lk�##5#5754632.#"3R<(**)%	

'<'��)%1��l_�0&#"#>325.#"#>32533273#"'3273#"'#
			(
	
	(�-`p,]�}(zF#"'#7&5463232654&#"z=4)-6<41>�"$%""%%!�6:Ue.5995&--&&++��p|�"2#"&'##33>"32654&-67,%
(!#%(   �7779X6%&(+/$%,��pQ2.#"#"'53265462
$
$��((�m(oB#'##"'#7&=3326=o!)1.:(5(B�Wn
��3(&o�^l�C!.'##'33>?33>?3#		+-B)!		++)
	!)C/�		y�s#
#
yy 
#s���hd�1<4632#"&74632#"&2#'##"&54?54&#"'>326=5
	

	
U	

	V#!+s)"+#-")|		



		


,H�!A

r ��hz�#/4632#"&74632#"&#"&5463232654&#"5
	

	
U	

	Z=4/?<41>�"$%""%%!|		



		


�6::65995&--&&++��ho�+4632#"&74632#"&#'##"&=3326=5				U	

	O!)+,(5(|		



		


0�%)��3(&o�����ip���e^��
#"&'33267�QHJK62.'9�<JI=)'�e^��
#"&'33267�QHJK62.'9�<JI=)'��q4�2#"&546���&��!'3!73���dBFFBڪnn������������'O��.#"#>32
4MZ,DxNA
��b�U�%(+UP H=�]����/.#"56323267#"&.#"56323267#"&")"2' $(#1' ")!3' $("2'Q:$
:#v:$
9$��NP.'5>73E6886.,N
D
3

2�H���%#5>7.'5#.'53>73�5995.,{
D3


3(
D3

2@BB@B@����~�&&����.���!&F�c��aT�&'�����U��0�&G���a�PT�&'�e��U�P0�&G�l��a�mT�&'����U�m0�&G�����=�Y�&('|x���7���&H'|�x���a��&)����7���&I���a�P��&)����7�P�&I�N��a�m��&)�����7�m�&I�h�a���'#"'532654&'7"+324&+3 �JJ 	$&5&)
��l�V��$3���ua"�057V�P�s��;(Ώ���7��*7"&546323.=3#'##"'532654&'?26=4&#"dxyd>OXG
0!$3JJ 	$&5&&UEBYGGG
����.!
3�H&
5(&057LI]^dkq_`j��a�8��&)�����7�8�&I�S��a�+
.'535!!!!!!!>:1i8�)$�q���#��5�12
"GsGG���O�N�7��q
&-.'535!2!3267#".54>"!.#:1i8�)�Ec5��YP3O*)P7LuA;kF?I>�12
"GsGGK<mI5[_M>{YX~DHQHDUa�+
>73#5!!!!!!!�8j29:S)&�q���#��5�G"
21sGG���O�N�7��q
&->73#5!2!3267#".54>"!.�8j29:S)�Ec5��YP3O*)P7LuA;kF?I>�G"
21sGGK<mI5[_M>{YX~DHQHDU��a�8��&*�[���7�8"&J�\���a�H��&*�L��7�H"&J�M��a���&*'|��r���7��&J&�^|���a��&+�������&K���=���W&,�����7��&L�l��a��&-����O�&M�'�a�P��&-����U�P�&M�`��a��&-lR������&Ml�a�%���&-|����&M|	��a�G��&-����U�G�&M�q����Ha�&.������H:�&N�����=
".>73#"&546323"&54632!57'5!t9i2:;(���TTTT�G"
21}��4;44����g
"&>73#"&546323"&54632#3K9i2:;(�EXX�G"
21}����ak�&0x����L
�&Px$�a�Pk�&0�t��U�P
�&P�5��a�mk�&0�����U�m
�&P�O���a�P��&1�V��L�P��&Q�������P�W&1'�V��������P�&Q'������a�m��&1�p�����m�&Q�����a�8��&1�[�����8*�&Q������a*�&2xb���UV�&Rx{��a*�&2�k���UV�&R����a�P*�&2����U�PV"&R���a��&3�!���U�&S����a�P��&3����U�P"&S�_��a�m��&3�����U�m"&S�y���a�8��&3�����U�8"&S�d��=���#
 0<>73#>3232673#".#"#".54>3232654&#"F8j29:g1+2.20,2.�K�lo�HH�pk�K��ryzppyys�>"
--�5=4>�Wo�\\�on�\[�o�������7��'q
 .:>73#>3232673#".#"#".5463232654&#"�8j29:g1+2.20,2.m�sGo@�sIo?�kKRQLLRRJ�>"
--�5=4>����A}Y��A{Y_oo__ll=���-=I"&546323"&54632>3232673#".#"#".54>3232654&#")���4/50-3/51�K�lo�HH�pk�K��ryzppyys��5=4>�Wo�\\�on�\[�o�������7��'R-;G"&546323"&54632>3232673#".#"#".5463232654&#"����4/50-3/51|�sGo@�sIo?�kKRQLLRRJ��5=4>����A}Y��A{Y_oo__ll=���+
*.'535!#".54>3232654&#"�:1i8�)�K�lo�HH�pk�K��ryzppyys�12
"GsGG�?o�\\�on�\[�o�������7��'q
(.'535!#".5463232654&#"2:1i8�)g�sGo@�sIo?�kKRQLLRRJ�12
"GsGG����A}Y��A{Y_oo__ll=���+
*>73#5!#".54>3232654&#"@8j
19:S)�K�lo�HH�pk�K��ryzppyys�G"
21sGG�?o�\\�on�\[�o�������7��'q
(>73#5!#".5463232654&#"�8j29:S)j�sGo@�sIo?�kKRQLLRRJ�G"
21sGG����A}Y��A{Y_oo__ll��a*�&5x����U�0�&Ux���a*�&5�����U�0�&U����a_�&7�����U��&W����a�P_�&7�r��I�P�"&W����a�P_W&7'�r�z���I�P��&W'���3��a�m_�&7�������m�"&W�����3����&8�����3����&X����3�P��&8�+��3�P�"&X�3����A>73#'"&54632#"&'532654.'.54>32.#"#"j29:;�u<f"$k9PQIA[]:gC;b(%W/CDD:?W-47
99��_jV>5#0)!`S9Q,M9/$0&5J3����A>73#'"&54632#"&'532654.'.54632.#"�#"j29:;tb8Q [/C<954J(oZ1U%"J'69=33H&j47
99�NPP+$  (8,DJF#(93���H"&54632.'53>73#"&'532654.'.54>32.#"A
,0<88>1-��u<f"$k9PQIA[]:gC;b(%W/CDD:?W-��54
00
45��_jV>5#0)!`S9Q,M9/$0&5J3���RH"&54632.'53>73#"&'532654.'.54632.#"�A
,0<88>1-�tb8Q [/C<954J(oZ1U%"J'69=33H&��54
00
45�6NPP+$  (8,DJF#(9��3�P��&8'�+�����3�P��&X'�����
!�&9�������S\&Y�?{��
�P!�&9�@���PS�&Y���
�m!�&9�Z����mk�&Y����
�8!�&9�E����8�&Y����Z�Q��&:lK���O�Q&Zl���Z�H��&:����O�H&Z�F��Z�8��&:�����O�8&Z�U��Z���#
 3>73#>3232673#".#"#"&5332653-8j29:g1+2.20,2.�<{_��Z]^aWY�>"
--�5=4>��JwE�w�1W`gQ�O��q
 4>73#>3232673#".#"#'##"&533265�8j29:g1+2.20,2.UH
\4abYwYE�>"
--�5=4>E��G*']f_���d^Z���.2#"&54632#"&546!5#"&5332653�K���<{_��Z]^aWY�GG��JwE�w�1W`gQ�O��R/2#"&54632#"&546!5#'##"&533265��K��tH
\4abYwYER�GG���G*']f_���d^��X�&;�P�����&[����PX�&;�U���P�&[�&����&<E'����&\E�����&<xt����&\x,����&<l�����&\lh����&<�v����&\�.���P��&<�����P&\����F�&=�������&]����F�&=l�����&]l���6�&>��������&^����&�&?�Q���'��&_���&�P�&?�S��'�P�&_���&�m�&?�b���'�m�&_�/���U�m�&M�y�����SU&Yl�y{��1&\������1&^�i��.��7&F����Uj�&C���j�754632.#"7#QaP2*)/j �X2�-�gUE
4?R;8L�Zv
j�3>32.#"3###
H`P2*)/��XHCfTE
3>H��Z����(2#"&'532654&+57.#"#4>hct�?b84mX4]))a,UJVV>�F:\TY:x�WK�1Z@?a8RKD@CA�&)gQ�2�JwE��-���o���P~�&&�n��.�P�!&F�C��~�&&�c���.���5&F�>~�	",>73#.'#5>73'!#3	.'3�X42
441:\:KV��U[Q��
Q�n* 
3_))A""A�����3*-;�.��,	6A>73#.'#5>732#'##"&546?54&#"'>326=�X42
441:\:�b^@#MDI`~�[:5*L!#`NdM7+DZ�* 
3_))A""A=V^��L,*MRPW C4B��83-*KN0~�	",.'53>73#.'#'!#3	.'3�3W':]:2451|V��U[Q��
Q�b3
 +TA""A))�����3*-;����,	6A.'53>73#.'#2#'##"&546?54&#"'>326=w3W':]:2451�b^@#MDI`~�[:5*L!#`NdM7+DZ�3
 +TA""A))=V^��L,*MRPW C4B��83-*KN0~$,62#'>54&#"56#.'#5>7'!#3	.'3�.2$)C:1441:V��U[Q��
Q�"#'?
)}"A))A"�q���3*-;�.��g$@K2#'>54&#"56#.'#5>72#'##"&546?54&#"'>326=�.2$)C:1441:4b^@#MDI`~�[:5*L!#`NdM7+DZg"#'?
)}"A))A"�V^��L,*MRPW C4B��83-*KN0~%-7#".#"#>323267#&'#5>7'!#3	.'3�/).*-/(.+D;03560;V��U[Q��
Q�.>/=�"@!/(@"�s���3*-;�.���s%AL#".#"#>323267#&'#5>72#'##"&546?54&#"'>326=�/).*-/(.+D;03560;6b^@#MDI`~�[:5*L!#`NdM7+DZs.>/=�"@!/(@"�V^��L,*MRPW C4B��83-*KN0���P~�&&'�n�o���.�P��&F&�J�=~�	)#5>73#"&'33267'!#3	.'3�41W JFGG5.+&4�V��U[Q��
Q��5,k<GF=)'�z���3*-;�.���L	3>#5>73#"&'332672#'##"&546?54&#"'>326=�41W JFGG5.+&4Vb^@#MDI`~�[:5*L!#`NdM7+DZB5,k<GF=)'�V^��L,*MRPW C4B��83-*KN0~�	)#.'5#"&'33267'!#3	.'305
IGGF5.+&4�V��U[Q��
Q��,5
k<GF=)(�z���3*-;�.���L	3>#.'5#"&'332672#'##"&546?54&#"'>326=�05
IGGF5.+&4Ub^@#MDI`~�[:5*L!#`NdM7+DZL,5
k<GF=)(�V^��L,*MRPW C4B��83-*KN0~"*42#'>54&#"56#"&'33267'!#3	.'3)-1$)�IGGF5.+&4�V��U[Q��
Q�"#-
'�<GF=)(�z���3*-;�.���n">I2#'>54&#"56#"&'332672#'##"&546?54&#"'>326=-1$)�IGGF5.+&4Yb^@#MDI`~�[:5*L!#`NdM7+DZn"#-
'�<GF=)(�V^��L,*MRPW C4B��83-*KN0~#+5#".#"#>323267#"&'33267'!#3	.'3�/).*-/(.+IGGF5.+&4�V��U[Q��
Q�.</;�;FD=('�|���3*-;�.���q#?J#".#"#>323267#"&'332672#'##"&546?54&#"'>326=�/).*-/(.+IGGF5.+&4Ub^@#MDI`~�[:5*L!#`NdM7+DZq.</;�;FD=('�V^��L,*MRPW C4B��83-*KN0���P~�&&'���n��.�P��&F&�Z�2��a�P��&*�V��7�P"&J�W��a��&*�V�7��5,3#'>54&#"56322!3267#".54>"!.�.#6$+%
%<BrEc5��YP3O*)P7LuA;kF?I>�&)5U4,�<mI5[_M>{YX~DHQHDU��a��&*�Q���7���&J�=a0�	&>73#.'#5>73!!!!!!�X42
441:\:/�q���#��5n* 
3_))A""A���O�N�7��),	29>73#.'#5>732!3267#".54>"!.�X42
441:\:�Ec5��YP3O*)P7LuA;kF?I>�* 
3_))A""A<<mI5[_M>{YX~DHQHDU&��	&.'53>73#.'#!!!!!!�3W':]:2451\�q���#��5b3
 +TA""A))���O�N���,	29.'53>73#.'#2!3267#".54>"!.�3W':]:2451�Ec5��YP3O*)P7LuA;kF?I>�3
 +TA""A))<<mI5[_M>{YX~DHQHDUa$02#'>54&#"56#.'#5>7!!!!!!�.2$)C:1441:��q���#��5"#'?
)}"A))A"�q�O�N�7��	g$<C2#'>54&#"56#.'#5>72!3267#".54>"!.�.2$)C:1441:5Ec5��YP3O*)P7LuA;kF?I>g"#'?
)}"A))A"�<mI5[_M>{YX~DHQHDUa�%1#".#"#>323267#&'#5>7!!!!!!�/).*-/(.+D;03560;��q���#��5.>/=�"@!/(@"�s�O�N�7��s%=D#".#"#>323267#&'#5>72!3267#".54>"!.�/).*-/(.+D;03560;2Ec5��YP3O*)P7LuA;kF?I>s.>/=�"@!/(@"�<mI5[_M>{YX~DHQHDU��a�P��&*'�V�b���7�P�&J&�N�W(*� #'>54&#"5632!57'5!.#6$+%
%<B��TTTT&)5U4,�R4;44��<�5#'>54&#"5632#3�.#6$+%
%<BDXX�&)5U4,����(�P*�&.����N�P��&N����=�P��&4����7�P'"&T�W=����$0#'>54&#"5632#".54>3232654&#"�.#6$+%
%<B�K�lo�HH�pk�K��ryzppyys&)5U4,��o�\\�on�\[�o�������7��'5".#'>54&#"5632#".5463232654&#"�.#6$+%
%<B��sGo@�sIo?�kKRQLLRRJ�&)5U4,���A}Y��A{Y_oo__ll=����	*6>73#.'#5>73#".54>3232654&#"�X42
441:\:�K�lo�HH�pk�K��ryzppyysn* 
3_))A""A�co�\\�on�\[�o�������7��4,	(4>73#.'#5>73#".5463232654&#"�X42
441:\:b�sGo@�sIo?�kKRQLLRRJ�* 
3_))A""A����A}Y��A{Y_oo__ll=����	*6.'53>73#.'##".54>3232654&#"�3W':]:2451�K�lo�HH�pk�K��ryzppyysb3
 +TA""A))�co�\\�on�\[�o�������)��',	(4.'53>73#.'##".5463232654&#"�3W':]:2451��sGo@�sIo?�kKRQLLRRJ�3
 +TA""A))����A}Y��A{Y_oo__ll=���$4@2#'>54&#"56#.'#5>7#".54>3232654&#".2$)C:1441:yK�lo�HH�pk�K��ryzppyys"#'?
)}"A))A"��o�\\�on�\[�o�������7��'g$2>2#'>54&#"56#.'#5>7#".5463232654&#"�.2$)C:1441:(�sGo@�sIo?�kKRQLLRRJg"#'?
)}"A))A"�#��A}Y��A{Y_oo__ll=���%5A#".#"#>323267#&'#5>7#".54>3232654&#"$/).*-/(.+D;03560;wK�lo�HH�pk�K��ryzppyys.>/=�"@!/(@"��o�\\�on�\[�o�������7��'s%3?#".#"#>323267#&'#5>7#".5463232654&#"�/).*-/(.+D;03560;&�sGo@�sIo?�kKRQLLRRJs.>/=�"@!/(@"�%��A}Y��A{Y_oo__ll��=�P��&4'�������7�P'�&T'�W�`��=��%�&dx#���7����&ex���=��%�&dE����7����&eE���=��%�&d�����7���5&e�T��=��%�&d�����7����&e�O��=�P%�&d����7�P�j&e�X��Z�P��&:����O�P&Z�PZ����'#'>54&#"5632#"&5332653�.#6$+%
%<B�<{_��Z]^aWY&)5U4,�NJwE�w�1W`gQ�O��5(#'>54&#"5632#'##"&533265�.#6$+%
%<BxH
\4abYwYE�&)5U4,��G*']f_���d^��Z��2�&sx
���O����&tx���Z��2�&sE����O����&tE�Z��2�2#'>54&#"5632>53#"&5332>53�.#6$+%
%<B�1]%H=8w`��Z_`AO$Y&)5U4,��L;/Q7��JwE�w�0V`/S5�O���52#'>54&#"5632#'##"&5332653>53�.#6$+%
%<B$$G<H
[3bcYwYEX0]�&)5U4,�/T8�bG*']f^���d^;M:��Z��2�&s�����O����&t�U��Z�P2�&s����O�P�k&t�O��6�&>Eq������&^EU���P6�&>�D����&^����6�#'>54&#"56323#3�.#6$+%
%<Bn�a�Z�b&)5U4,��_�K�����5/#'>54&#"563233>73#"&'5326?j.#6$+%
%<B��^tm_�YN$
.9�&)5U4,��(I!Q)0��LZF4+G��6�&>�;������&^�a��	!3!!3TZ8�{Z��P�6��3##53533533###�XQQX�XPPX�HIggggI��H=����%32654&#"5>32#".54>7�Mm9/`Ige^K-.#Lo=B�f_�KH|L�\�bDpBpX\`F	?uPM�LS�\r�j5��"�#32654&#"5>32#".54>7�Kf=NQLLGB &bu�rLp=J�j�(jvw5`v^QP_F�ps�EVg��/
��\�""&54>733>73'32>7�7;;gA�a�
	�^�*FIY&0"5T1
>13M2���7C�Ue,qHG2���"&546733673'32>7b0<se�_{	{^�)Zi$%IW�:3MX�<2<3S��lhrF=5��7��Y&lO���7��Y&l����7��Y&l&OP{���7��Y&l&�,{���7��Y&l&OYB���7��Y&l&�6B���7��Y�&l'O��C��7��Y�&l'���D��
��&&7O����
��&&A�����
x�'&�&O��{����
x�'&�&���{����
d�'&�&O��B����
d�'&�&���B����
��'&-'OS�$���
��'&.'�/�#���-���&pO���-���&p�k��-���&p&O2{���-���&p&�{���-���&p&O;B���-���&p&�B���
��'*�O���
��'*�����
I�'*Y&O��{����
I�'*Y&���{����
5�'*E&O��B����
5�'*E&���B����U�&rO���U�&r�\��L�&r&O#{���K�&r&��{���U�&r&O,B���U�&r&�	B���>��&r'O����?��&r&�d����
�'-�O���
#�'-�����
��'-Y&O��{����
��'-Y&���{����
��'-E&O��B����
��'-E&���B����
�'-�'OS�$���
�'-�'�/�#���B��6&tO��8��6&t�������6&t&O�{T�����6&t&��{T����6&t&O�B^����6&t&��B^�����=�&t&O���������>�&t&��������
��'.�O���
��'.�����
��'.m&O��{����
��'.m&���{����
��'.Y&O��B����
��'.Y&���B����
��'.�'OS�$���
��'.�'�/�#���7��'&TO���7��'&T����7��'&T&O\{���7��'&T&�8{���7��'&T&OeB��7��'&T&�BB��
��4�&4dO����
��>�&4n�����
����'4'&O��{����
����'4'&���{����
����'4&O��B����
����'4&���B����O��&�O���O��&�����O��&�&OG{���O��&�&�#{���O��&�&OPB���O��&�&�-B���O���&�'O��:��O���&�'���;��
�'>�����
��'>�&���{����
��'>w&���B����
��'>�'�/�#���A���&�O#��A���&�����A���&�'O�{^��A���&�'��{^��A���&�'O�Bh��A���&�'��Bh��A����&�'O!����A����&�'������
"�&dnO����
,�&dx�����
��'d1&O��{����
��'d1&���{����
��'d&O��B����
��'d&���B����
�'dd'OS�$���
�'de'�/�#���7��Y&l{{��7��Y&lB���-���&p{]��-���&pB���U�&r{N��U�&rB�����6&t{���R��6&tB<��7��'&T{���7��'&TB���O��&�{r��O��&�B���A���&�{���A���&�BF��7�Y&l'O�<���7�Y&l'��<���7�Y&l&OP'{�<���7�Y&l&�,'{�<���7�Y&l&OY'B�<���7�Y&l&�6'B�<���7�Y�&l'O�'�C�<���7�Y�&l'��'�D�<���
���&&7&O��<��
���&&A&���<��
�x�'&�&O��'{���<���
�x�'&�&���'{���<���
�d�'&�&O��'B���<���
�d�'&�&���'B���<���
���'&-'OS�$&���<���
���'&.'�/�#&���<���U�&r'O�<��U�&r&�\<��L�&r&O#'{�<��K�&r&��'{�<��U�&r&O,'B�<��U�&r&�	'B�<��>��&r'O�'��<��?��&r&�d'��<��
��'-�&O��<���
�#�'-�&���<���
���'-Y&O��'{���<P��
���'-Y&���'{���<P��
���'-E&O��'B���<<��
���'-E&���'B���<<��
��'-�'OS�$&���<���
��'-�'�/�#&���<���A��&�'O#<��A��&�'��<��A��&�'O�'{^<��A��&�'��'{^<��A��&�'O�'Bh<��A��&�'��'Bh<��A���&�'O!'���<��A���&�'��'���<��
�"�&dn&O��<[��
�,�&dx&���<e��
���'d1&O��'{���<��
���'d1&���'{���<��
���'d&O��'B���<
��
���'d&���'B���<
��
��'dd'OS�$&���<Q��
��'de'�/�#&���<R��7��Y�&l�_��7��Y�&l�f��7�Y&l&{{<���7�Y"&l<���7�Y&l'B�<���7��Y�&l�C��7�Y�&l&�C<���~�&&�z���~W&&�����
��&&Y{����
��&&EB�����~�&&<���)[�OR��6P"&=33267�OHX* 
&
UK��1#G)[�'>54&#"5>32m(
,3+[8#)#0��(^�����(w�y'��l���U�&r&{N<��U�"&r<��U�&r'B�<��>��&r���>��&r&�<��
��'*�{���
��'*�B���
;�'-�{���
'�'-�B���a���&-<���)[c&O{���)[d&OB���([��&Oq�����6�&t������6�&t��������6&ty�������Y&tC�g�����=�&t�������=y&t'����l�d��E�&.������>W&.������
��'.�{���
��'.�B���L[�&�{���L[�&�B���([��&�M���O���&��V��O���&��]��A��&�y���O��&�C���F�!&|O���F�!&|����O���&��:��O��y&�'�:�l���6�&>�W���6W&>�^���
 �'>�{���
�'>�B���
��'5�����^�'53'"&546323"&54632FUj&��^�
����^�C(^�'53�_j0^�
���A��&�'{�<��A��&�<��A��&�'BF<��A����&�����A���&�'��<��
��V�'4�{���
��B�&4rB����
D�'d�{���
0�&d|B�������&d<���(^�BL[�.54632.#"�+4+
[0#)#8��{��
3'7'7#�@ll@y��=kk=�H�+�{�
#'73yAmmA���=kk=�!��(�3��(�3(A�5!(�AII(��375!(��NN(��375!(��NN��(��3�������&a�an���"���!5!!5!��a��a�Z@�@���	>73#0A	_�5�5&WU#���	#>73�
1A
^�4�5&WU#����t������	#.'7r	A0�#UW&5�4�[�#'>7##'>7[_0x^/�:�456:�456�[�	#>73#>73[
1B
^�
1@
^�5�5&WU#5�5&WU#���nt����[�#.'7##.'7)A0Z@/�4�:6�44�:6�4A��'#5'37��d��d���
�W��<��%7'#75'75'37'��e����e���U��U��U��U�M�+�4632#"&M@//@@//@mD88DB::D�H7D�%������8yt��H���y'��H���y&'��H��:���{�Z3#迅�'�H�,�{Z#53���'�!���{t�#53#_�_�b������{t�#53#3#_�_�b�'�&�����{t�#535#53#_���_�b&�'��1��h�%1;E2#"&546#"32542#"&546!2#"&546"3254!"3254�JLIMGKF�tM���&##&MhIMIMGKF�IMIMGKF��&##&M
&##&M�ujjwwjju
�6�4QPPR���ujjwwjjuujjwwjju?PPQQ��PPQQ��	-����(6DNXb2#"&546#"32542#".546!2#".546!2#".546"3254!"3254!"3254�6D MMHNJ�tK��~&##&L15D LM5CK��6D MM4CK�6D MM4CK�&##&L��&##&L&##&L�:dAmtwjkt
�6�8NOOP���:e@mt;f@ls:e@mt;f@ls:e@mt;f@lsCMPOO��MPOO��MPOO��'��3#�Z�:����'���'���'�b�3!333��Z��f�Z�v�Z�������������#@�:��������d�'���������'�E'����{Q3#'�(�<vy�A����(8�7'(�?��?��$��%�'8�'7'e��>����
�%��2���#/;"&54632'	7		"&54632!"&54632"&54632���.2��.45.��2.���[��^    ��.65/��4.���.6��    ��H����&�����)'>32#767>54&'"&54632�&(0Z4_l5(!J=
(%C5!�	9[S-A7#2(�/-58�_  ������:s�J��3267#"'@&�JH�&*_��bPNNP��FJ632.#"a��a)&�JI�&\��PNNP�g�3#'>��<_f���������sM�''��=Q�=��(�3�A@�	#@�LK��6�O�b+�#3#3#3+�܍����hE��D���b��53#53#53�����HJFHH������=�'$�$����^�&$���H����&$�$3!5!�%�}���C7�^��L�!2#"&'##^Bc73\>':fw.m`[l.�p?��6&'%"&5463!'3#	glqk�cc&u��u�CmX&I7!2#'3#Xkqlg�cc&�u��uCm��)�9���,��&#"&5463273#.�#%%#q^	B0�$  $&�a#UW&5����J&����)�8��'���m�4632#"&%#4632#"&  e��M&  �   S�6�i   O��u2673#".#"#>32�8?4
oK9zyt37@4nK;ywr3%MN$4%MO$�J��'632.#"@)b��_*&�HJ����PNN���%#''5'7#53'75373�~-~?~,~��~,~?,~��~,~��-~?,��,5����432#"432#"432#"]9::9��9::9(9::9�<<;�<<;�<<<��'��&�'��'�T��4���432#"432#"%432#"432#"\9::9��9::9Z9::9��9::9�<<;�<<;;<<;�<<<5���'432#"%432#"432#"432#"%432#"59::9`9::9��9::9��9::9W9::9�<<;;<<;�<<<��<<<<<<<5����4632#"&4632#"&5    �   ��!! 5��Y�#/"&54632"&54632!"&54632"&54632C  �  �  �  q    �� !!  !! �� !! '����#/;!5!3!!"&54632!"&54632"&54632!"&54632h��ALB����  �  �&  �  TLS��L��" !!  !! �4!!!!H����#4632#"&4632#"&4632#"&H$%%$$%%$$%%$w%%$  �%%$  �%%$  H����#/"&54632"&54632"&54632"&54632�$$$$$$$$$$$$$$$$M $&&$ � $&&$ � $&&$ � $&&$ ���{t�#535#53#3#___�___�b&�''�&�����{t�#53#35#_�_b���b��������{u�'3`�`�����}���{u�#7#`uu`�b������{u�
'77'`uu`>>>�sYkkY���777���{t�
#535#533#___�__�b&�'�&���JT"&54632'254#"�MNJQMOISTT+''�sljsrkju?��OQOP3v�2#"&546#U

*9�x��B
�UO
##5#533'4673U=K��I=� P}``4��]81u�@L#>32#"&'532654&#"'7+�	CZTR FE-550%L7mD@FM

C(+&*��LT)2.#"3>32#"&54>"32654&�#"6>6);JRED]/T
+2(&/)T;)F*F@FP_a/ZH+�-/-.&+�CL#5!O��'��p<1���ET$12#"&5467.54>">54&32654&'�7P*'/SBIN- !&?$ $(%$/!"()*(-&T57%07)8C@8)6+&$17"!�($$&
�IV'2#"'532>7##"&546"32654&�D]-TB% 7<
3(@JRE$/'*+3-V\c/[I,<,G(H@AS9,,&.-*;#�/�5#53533#�ll4ll�o4oo4o#9/m5!#944#/�5!5!#��q33p44>s��
4673#.>/-B/100B+1S�46�KI�70�s��
#>54&'3�0,B1/1/B-/�T�47�IK�64�7]g2#54#"#33>�>@8N;,9.	<g8?��M<8�B,���vJ2�����%�~�*}�����~33v�����vA3w����
�~U-������u@*������vL2������~C*������vE2������vI4�����#��/������#%/Y	����#��/�	����>�K�c	�����K�c	����8�&72#'##"&546?54&#"'>326=�@=*2,0>RU;&"2>3A2#,:�48�..114(	'�"-.$��M�72#3267#"&546"3.�CL�:4!44$J]UD)/�(�PB79.
TPPZ,0+)2$��f�%#"&5463232654&#"fXJFZWKFZ��15512550APWWPPWWP9BB9:@@��L�7'373#'#�xAYYAyA_`@D�zz����!��K�72#"&=3.#"5>3267�K]UECM�94"34#)+)0�TQOZPA 6:/
�)31+7��]h73>32#54#"#3p:"?@8N;,99�8>��M=8��7��Uh73>?3#'#3ppC��Ey'99z
	m��� v�7��ph#3p99`�7��+�!%2#54#"#54#"#33>323>�;;8G3,8H4)9.	8Q<�8?��L63��L<8�B,67��]�72#54#"#33>�>@8N;,9.	<�8?��M<8�B,7�l�"72#"&'##33>"32654&�@OOA(49/3 6,+9/..�STRU��,-78;@F67B!���$#"&'532654&'.54632.#"K@%4<,'#339H;81H'227/0	0	'')-
*	''
���+27#"&=#5?33#�	")=22"ee;();�DI)�$� 2.#"35!#3#3!5"&54>�$G  5;DFO������xt1_�@dXZW�B�B�C�uKs@3��)�%.4%&'#7.546?3273.'267##&#")+#?78vo?*?!#
a)J$$M5?�

]"*2:A,!p�)�Zy�[SWb
H�"JX��5�tRc@8���.".54>32.#"33>32.#">7Xc>C�`6^'$J0>^3I9G;& 
+@3F$L
Z�pl�]HG�Zr�h8"KD8�J-�35#53!!!!3#�UU����痗�AO�OnA�!�&2.#"3#3#!!5>5#535#53546P8W"I)5?����&��	/5aaaa_�E:BXANBACPJ
JFBNABguU��V�&2#4#"#5#54#"#33>32736�[ZWmNCW�F�nQ>XG
U0t*[F?'"]h��YZV�ض���d^��I*)Mň
2�#'+3#535#53533533#3###3'#3'#3'#3'#XNNNNh_vONNNNi_v**^B�C__*@R@����@R@�����|��RRR��tL����,2+##32654&3#3267#"&=#5?҅v1tfW�)\[RHnn)
+ 7@MN�nd<g?���M��CNEDxhC�%(A
CF�($_S���?2####32654&2.#"#"&'532654&'.546�ni0�_}[U�@BB8<i+@ 1"'%6#6R[%CJ0($5#7Y�ef8L.
��'���L��ECF=\C$)*9,FWQ,#)*9,BL
�� 3#53333333###3'7#7#�;J?7P3S:\<R1O5=H6Z<];FF$� <G=K@?��?��?��@��K�������U��
332#4&+332653+U�nhQKD�eQ�LMQ.dQ��|e��2NO�{�1QM�Ag;��7�f^�&�Du��/�02.#"3#3#3267#"&'#53&45465#53>|2X)%K'�%���aR'OK0y�PHHO��H�A

	AU]
N
�vA
A{�<�3#533333##fWWU�b�β�e�8NB:��:��B��N>��*�35'75'75#5!#77�u$�u$���u$�u$��P5idP5i�OO�Q5ieQ5i����/<3332>54.#"'>32#%>32#"&'##2654&#".{Vk	f�G:kJ+`$$n:e�Qg�t�]QPL*XF1

T�-C$"(4
(B�
Z�bFf9GL�^��e�PcR>.[=
6-�,D;#(384��$1"'532654&''#7.54632>54&#"n$''$'3rS>R�PU,%M>>I68-1R>(!�
K,*�wȆz	��[�1URLE=�Yf�WJQKLw,(*6IR
2�#+123#3#+##535#535#3&#3>54#326�drKACQui8SWWWW�F�$5���3;N�JD6		

6=Q�w6Y6�JDDzY
|D =����!'5.54>753.'3#>7u��I�c@:h-"$Y0�3h>��-`Mhr�*<PG	âf�_&#N��F�MzM
:���
_�"3#3##'##7#537#533.#3^`��cLU_S�R_UKb�`.iB����@R@����@R@b$U01T�R���9"&547#53>7!5!>54&#"'>323#!!3267"u~/TCI8��~@D1W"&n4eu7WDJ<	:�{�9k$"r
^_&@!@/5OSU)@!@tQ=��Y�".'>7#5.54>753�2\%$G*)J$"G.@��E�`@@^lee�L��N

GG
Šd�a	&u�xy���L�3#5?33733#3267#"&5#aLP 4� 5��O*5GO��*{{{{F��aD
K[7�-����IR[g5.546323>323>32654.'.54>32.#"#5#"'#5.''54&#"7"5432754&#"q*1 "".B1.0M*O63S2=iB4a1.R)>N(H/8W2QO6"&6 >e/
�%!> 6+")Oy;&+31<6!K*5'2L;<U-H:5(0"3K:F`SIFK	c�%)%96=IY1?(/�!!##5!#�-Z���N���NNO��!53267#53.+5!#3#�PU�
UL��0	��aP�J,.<@82@@'C@IQ�����"&'5755753772>53�*kkkkV����[j.V#O~F%A$O$A$��GAGOG@H��K~NE�d:����*5F7'7&=#"&54632!2#"&/'3267#"&'4&#";3265.#!77�%YNaI8>LO^*10"2UJV[L >%9Fdz&"%+.}!AN��jFP^/K9InAL8DWh5U1>O#PRJK?	NSO�17#)�1$0@p& ZOK;��74>753#54.'##;<�lXd�BY/]FXK]*Y�z�K��I�{��cv7��8va�
�35#535#5332+3#2654&+aWWWW����T��G[eTYZ�AYL\jefsYA�n<NDB��7H/)73.54675363253&'#5&#"#5;!7�Mfqm<<)')'<<�I�Z���N(�p��offmM����4�W�MNa��/"+433533253#5"+#52654&+32654&#a\@"@?A=:(?%OF@7@ZR=KRNhSBDX�eehrOE?S&F8Nckbbb�;:;3�K��J<8E�����h��p ����(A2#'#"&54?54&#"'>#326="&54632.#"3267�AB/8&/8�8*2A�LK���<*3-JEZ]F4+Y+*/-�6;�*12c!1
�6ʬ/(��SX\R	7s7:
<
 ��w�(M2#'#"&54?54&#"'>#326=#"&'532654&'.54632.#"�AB/8&/8�8*2A�LK���<*3-��"8>&%&,18I994',,<�6;�*12c!1
�6ʬ/(�=f
8*,/+2

)2��F� ".54>32&#"3267~o�IO�n0]0PU+K>W)X*/V�S)*
Z�pl�]8"��
;
^S�O{)��7����&t(r &� )5.546753.'67!&��IORFBB./1524,�8,..,�l[Zk
lh3��4wR@R;
PA����(4"&54>32.#"3267	##"&5463232654&#"�Ib/P02+ig03|�tM��UGAWUFAX�'.-''-.'OW>J"
4	rq
4	
K�6��QWWQRVVR2@@24>>(����/	#	"&54632.#"3267#'##"&=3326=z�LK���EZ]F4+Y+*/-=&<@AH@2'�6��SX\R	7s7:
<
 ��+1:@��G95���6��&�T����;����7S�&t+c���{Q�2ET".54>?#".5467'>7>3273>732>7>54#"2>?	!*5S_W"$3$%
A
#;#^:)'.v�'B.
3T6N;KX}!B;"01-#�"51O/BF=&�{",!DA9+
G	)88@
&D"):!(@��:5
?I�'TI-�7T,"J (+EPN;

��-O1�(3;@!����:���".5463232>7'>?>7#"&54>54&#"'>3232>7>7>3232>73#"&5467>7>54&#"�9A1"$ 1+8J>$?P8G( O?;;3	BL%8=:

1CKH
 -" %. %\db+"%4mX/- +0,!#/43!:+$m<Yy#NE,
/G.*
'6/	(7' 
CwMA.,
C�M0*
(+ .O3@7"
 
2<?
"DPcA
D�k@#!\b%	=wcD
(,$
(1-;B){E"3k]9�@MICG$P����e"&'7326'..#"'>327>54.54>732>7#".'>32�)4#8=/7F �$
""+*(&2&%8</	64!	=S=9
)20"*:>

:E"|E��^f)<8:	 �%(%KVZ*@;2!@5	'3F.	")&TRCz,04a��3333##'3#3#a���xCC�CC��:�6[��5`��`�333>32#654&#"xX#X0Y_7W638VS,��$('LK
��W.1e^��&�"3#73733#3>32#654#"yH	JX�	�$^AHQCX@_WZ6_>[[>S$(++CF
��?Uaa�������>O".54632#"32>7.54>7>3>54'77>7�5?
1"$#22+D=-:;�oA�73A00 "?)!A5`�|CPa=:=pX3'
!22(7' 
&5];
5C8ld)<j�Y'
+G5 9:19iB�;��r+Mci0$& ���I>3232>7#".#"".''7>3232>54.54>7 *3<<6)"	
HN	*66$<)�.)	1h
%24
$30""	:6$.�	1=9&77-=�+|"."3S/-]Q&*#'	<OO&DB%��&�LZg".54632>7>7.54>32&#">3232>7#"&'67>54&#"267.#"�";%=%&T)	BR+4[u@---):cI( 27=DLT-+&/UqCG(!<!HBAU2&E +WBB<?,%<20�x,9$I)4$3
%#  H+

*;>5`K+		.Nb5,8 
<}qZ4*$gl\3CY&D-#M4B5We0Dq���"6����"*%2673#".=5>754>324#"67#53KI)F+0.?4:E1V6'S<&z:-:RY!LAq;�)C(MFAkP�2;\3)�@���%2"&'#####53533533#3>32'2654&#"@7T>�WLLW�X��P9irr{GKJGSAB
-&IX��X?aaaa? B,.��|�Ifae`f_
\aa��	
333#%5aL�5M�:�"��6�5b�c_��+/333.53##%"&54632'2654&#"5!_eEOb���@TQF@URD,&&,+('V��DE��6NGF�t�XRRWVSRX:97855879�EE1���&1:".54>32'2>54.#"'32+532654&+�P�c66c�PL�e96c�P@pV0.SqDZ�P.Sr>�RLV>RF',(,E
6c�PP�c66c�PP�c65.UrEArV1Q�\ArV1_�EDCL��%*(#,��O]>7>32#"&5463232>54.#"#".5467.54>74.'326�)3
(Z(R�'?S)$FhER]+%*@(3B(.'.i50Z%50C61O.$!)=@$6&6q&PaA56]"F<CnB7p]8SC26 	))4PSB7;*6,(d6&IHI'@R0T52k0+]4<eP7��)OQ++S#/B#"a\�3!2+'3#3#>54'a�xBk>cxCCx���$/S�m[>_6��5`��1��@<k=�V�")/.54>32!'27.#"%>54&'3'u��K�mk�K[I��YM7A&N87-.-.��.--.6|�
(
æn�\\�n��&��H��?)�UU�))�ST�)�~����^��".54>54&'"#"&54632>54'#".546332>7>7>7.#"32>53#"&54>7>326732>7p%!.0"01<(![U9A1"$ -$>PB) W>4"6#=q[;@-$#K@)9O04:-A?8�[(C98om
!# $3>
#EF=
.C-^ NcuA)@h>&5.	(7& C}XC�L%.#	,AN*)(.Rm?1%PF+44+QE1!.	N)@h+"JD
() 	
5=,��K�r�.#"'>3267>54.#"'>54.54>7>32>3232673267'>54.#">?".=4&#"�  40
!49-&'%
%!

,=&)I48L1#&
#
	5Z2,!% �D/%<><�C�
.*	6%
	!>fNKg@(((+('
%$)/(

' +E)E2%&-&	��tz9+C<
LP 71t
E#*,3-Pa��
!3!2##'3#3#>54&'3a�xC=�ÿ+xCCx���$/*)DJ��c[B]��=��5`��#��<<79
��a_�33273#'#7'#254&+a���LE98Ufh[AFTsN�f�^YY�ffEc]Z��kk���s�J:��a�o_i &27'7#####3023&4'>&/'�y*A$�i�f7h`Z�fk=�0752�=44Do*�9L-
���S����N���I�A8c��%:"&'532654&'.54632.#"733#5467###�57'(((1"G;3-E)(47M�^^a[@e5`c	5	*"00	1	
2+,34`�����/��(�j�#5!#33#3#3333ve
f�Ӕ���B?�j*66��`6Z6d6`��6j��33#5467###!#5!#E^^a[@e5`��e
fj`�����/��(�*66���oXi'7>73#'#3_���_�Z=7T�^��:3L��#@#N-�6R�<�u&O�	
35!5!!%3#&n��	��]�IjG5`55��55`���!'"'532654&+57!537!5!��~?xSqN/^-[YeqB��i������<�g`Ae9"PSDACA�K�L<�����dS����'##".54>7#5!32>54.'5�&E-L�ij�L,F%�>J 2hPPg1 I>�OVuKb�YX�bKvVOH,\kBLxEExLCj\,H��V"&'4&#"'>3232>54&#"'7>54&#"#".5732632>32�5,70C)VF"2/62 &:00
$!K
&/&0!10.0#0>$8^vq
;0
	
&@KKEK
A,:!!
	l
*2'A3%/2o�T#���2#4&#"5>cOHX*  &UK�~�1#G��ak�0��~n&&��=��C��".546332>7>7>7.#"32>53#"&54>7>3267#".54>73267>54.'#"&54632>54&'�3<
1"$ +$>YL)*9)4"6#=q[59'$#K@)9O04:':98�[(C/'7Q(
%&,HR' -1-
7
!!1#	1<(![	.2(7& Q�X-SY2%.#	$5F*)(.Rm?1%PF+44+I:(!.	A)/H4$9)'QE*$
,=!*395$Q7		:V23NcuA)@h>=��z�K".5467>7>7327#".''2>54.547"32>78r_9=;<D8
/*
	!7V/#/0!T�c-;�)*QuKQl4% 	&*#0=>*@&
&+A3.\Nb�H
m2��8"".54>32!3267.#"!5Tt;.K\.JuD�lN-IV"#;TTL41H#N~HHhD C|U�%<6%>%�&"�����(4".5467'>7>3232>73'>54#"�&1	,!!7�C%!
:fO
NR#R\-;L+2-%
),$5
(&AN ::2(+L/)V9�<@42KO��e�dp".54>7.54>32#"&546732654.#"#"&'32>54&#".54>32254.#*�=Y0EqC
;e?0<"
0%"$#-'"1!./K+5#9#A3 3(M?&$8%%?(%#(EX{ " 4\;=hF	4*-R5.2:))<
0 73,36aC	

7NZ/556H(%'.N/
$(B(#--O:!�

����P�7�".54>323267#".#"32>54&'7".546332>?'>7>77>7>32>7"�!':\�S3@.."%#
	%1&DCF(6mY6 2,#3Jk.;!1"$ -',G= 8R3J.7RA
%&
	GN `�5%$
!RSF+
+!.Oe6&%#7A<
<!D>'��)+#(7& 6]<A1':e_/
$Ze5$	8,&0-
T�L��	3!5!5!5!LZ�q5��"�6O�O������{"&5463232>7>7>7>7>732>7#"&54>7>7#".54>7>7�=I3(!).
*$7_VW/?|i# #9?>,="8f062"$8?@@"(&,'/40#UyG=Y#3GF00$!SYP(QWg
J:*;#(	"=e~@V�k

5HNG2
8NUOUfd'<O$<SSc`&JTP@.F"
#I27HKPK<9>8(E�dV�5-=&4]�lFC2Zki'6whA����#;".5467'7>32>73'267.54632>54&#"�%0	,PLS&+.3"/1*@*;)"
 +M7+
),$5
_$B)+UZ%.&'1'
1o+%]kS.'%��@Y.'#>7.'7>53&_i7@4ICO&I 6A�C'1N$@./P!5�@X�P^�c+I4=�V.jg(7|x1<m."�E35!4&+5323"6EZ��Td,M=)XJ=+fY��=��EP7>=4&/5#'7D%
T1
;G(%�1!0+5'�! 
D)G@j+Ӵ"=[�E!!5!#"���M==����N��N)�� 27#".54>2654&#"���"��\�om�\[�o��������ig���
o�HH�pk�K��ryzppyysab�&!'##3!##33#!#3#%.'316�6`�X��g}a��drsa��YK����7����3 ��rX��
�����M�M�CC�1���!4"&5467###?!#327%3#26?#"&547#<Q
;�f�fsOyl;<�JC\CK
1	:A<3
E;5��#5��
|;��E%*'��+&(�!4>73>73>7#�
���~	b9�
�Do	�T])��%	��(\W",4M�7;1
a�	3!!'3#a���xCC�5�k5`a��3!##'3#3#aG��xCC�CC�6��k5`��`�l�5	5!!!7#!5!=��6�������-�K�U�?b�77�q����1���>E���� #>32#"&'732654.#"3<�:vKo�NW�u<k."&_3��6w`/B�R^Y�qo�[N��V�I
���#!5�Z���6zP��)5!3��n8ZPz6�#3#�a�Z�b_�����G$��	
332#'3#27&+%>54'$����a���C�CK[Gq1Kj�2AB%ʌ�|�o5`��"#��H3�^`8	����#+"&54>323#773#2>54.#"�@Q"Bc@4DB���'R�C�B��/Q<!0-	5"=&	\[B�mA7(6�e4::��h>bo2 ;&VyL.;
	���""(/"&54>323267>?&"#">54'�mr*SxNH`��'.-^-+ZI4%	+{$)/�9A
m]@}g><>Bd�
?4	��-'%)�H'< V
"&54632'2654#"3'3#�"-2/L; �q�rnC\CP&%*<G372�~��1��o�V
'-"&54632'2654#""&'7326737>7#�"-2/L; ��(.
��y%?]47
iBP&%*<G372��	5#/�� JC*MA<�c�!##3532!>54&#
hB�B����A��ofbs��$LL^mcu�<YFTKJ����)5"&5467'#>7'3>32>54&#"2654&'�P]R=�!Y1%�wW/tShySG 7b*6=J>@[ �*5&$;31QI?X$�Q/Am)�T*4e_L])$R7IS� B67B*��,'$=%"<)$.,��v�`r���".5467.54>?.#"327#"&54>3232>3263:.54632#>54'>54.#":7'"&#"767.'2654&'"#"&'+30H+@!	"$	
") 
	#
2C,F2
$
 "e=
2�	-$'&
,a�	
	 xt$![0�40
)*f&
$:!Y5*( )�

)
 �/GU'BO)4$**%27X!:$�)A:%)> 2���_	" 
��4+
V92U+4����:#'##3#3&'32.#"#"&'532654.'.546NE#y$D�? I�I�B"Wp;5 (:)ND<>"*$8(;rbbX�6�c	^�
50)+5
	=
0#)6_	3535#5353���YH�H����N\jx"&'#"&'#"&'+53267.546323267.54323267.5432;>54&#">54&#">54&#"7U !V67U !W66V !R5#E#?>~$!H$"G"}}# G$"E"
~}$!D#�		%% �M	
!%%Z		 $$ 	3
"X['sm�&YV%

"W\'��&[W"

$XY'��&[W"
3M#ROOR#TRRT#ROOR#TRRT#ROOR#TRR��%�'}�~'�(��`��%���'}�~'�(���`��%����'}�~'�('}��`���`����933467'73#"&'532654&+532654&#"'>32f�K�L

6#�IG�%@F>40:4992/)5$E.GH+'/T�62*		'1\�T��
?")#$!7' .>0(4
3):I��-�F57>54&#"'>3233"&'532654&+532654&#"'>32s))%1#E+@I;8Q�K�L�%@F>40:4992/)5$E.GH+'/T6p'1'  .?71N5M>���6
?")#$!7' .>0(4
3):I��%����'}�~'�(���`�����'v�~'�c��`����=�'w�~'�l���`��
��$�'��~'�^��`��%����'}�~'�)���`����$�'��~'�g��` ����)5B33467'73#"&5467.54>32>54&#"2654&/n�K�L

6#�IG�IN- !&?%7P*'/SA%$  $(*(-&
!"(�62*		'1\�T��@8)6+&$257%07)8C!"�$&
($����(,EQ^"&'532654&+532654&#"'>323"&5467.54>32>54&#"2654&/�%@F>40:4992/)5$E.GH+'/T^�K�L�IN- !&?%7P*'/SA%$  $(*(-&
!"(
?")#$!7' .>0(4
3):I���6@8)6+&$257%07)8C!"�$&
($#����";GT33"&'532654&#"'73#>32"&5467.54>32>54&#"2654&/��K�L7 FE-550%�	CZTsIN- !&?%7P*'/SA%$  $(*(-&
!"(�6

C(+&*�7mD@FM��@8)6+&$257%07)8C!"�$&
($0����
#/<33#5!"&5467.54>32>54&#"2654&/a�K�LI��'��IN- !&?%7P*'/SA%$  $(*(-&
!"(�6p<1����@8)6+&$257%07)8C!"�$&
($��%i�'}�~�)��!���"����G�'��~'�gw�`2�g!!2�=gI0*"#/;GS_kw������2#"&5462#"&54632#"&5464632#"&%4632#"&4632#"&%4632#"&4632#"&%4632#"&4632#"&%4632#"&4632#"&%4632#"&2#"&54632#"&5462#"&546)
J
�
��

<

��

�

�T

�

�T

�

��

<

�
�
J






I


@


J


J


@









��35#535#5333#3#!aWWWWZ����8�GYG��GYG�P
��35#535#5333#3#UKKKKXKKKK�GYG��GYG�����32673#"'!!&#"#>323�
21*	$��	32)Zk:F�PT;E/
*�3#53532+2654&+3#aWW���5}kRHfdX_[���N�qk@kA��OEVMFpNpa�_�#2##3267#"&5#32654&&�*A$�i�� 


CK�fkWPT�ef9L-
��'��/#LKRN��ECF;.�0�� &.5#7.546?&#"'>3273#'##4&'7">=7�CA/:eh2		*L!#`4DCH^@#MD�)JP>BY�74)��K>HU�B��#���L,*m$/
�@�KM0r$
�3�0��"#.5#5?3373#3267#"&'7hCQLM#4[GCJw+*
4(	F�5#8*#r{��9��C	����a�D��OU�Fh�3>323#5#4#"#3�Y4bbOWOxZCXX(#)*]g���W�e^���a�D|�%#5##3>?3|V%�IZZ>�i���P��U@����"D"���U�F#�3>?33#5#'#3�	�gٰNW)�=WWk4
�����5��&�D�5!5!5!!��gx�������D6PD���'�F�5!5!5!!X�� ��p��#��:�DB�n�=����#2373#'##".54>"32>=4.kIrGGpP_�EE�`bllcX]$$^�7/\�6\.8\�oo�[N����6_?�?`5a�@�!#"&'5325467####333^V("h�K�R���~a_Is�(P&��lNW�9��T���!73#	>?#^VU[��Q��Q����3��*,
;�b����#"&'##33>32'2654&#"�IrGGpP_�EE�`bllcW^$$^
8.\�\/7\�oo�[N����5`?�?_6��"��)2&#"#.'#3>73>7>�

�[�
�[�^o
~]~R6�I$'���:-	
U.�/�L.V&'\,��N.[#%W/E=7*"0333>733>?>32.#"#.'#��[J_`\
20%hg\	`��+X27.��"PX.�.#A�\.:.

/:��
�'!,23>73#'#5267.546"654&�5F>:w^�e[5$I3
@'=58W06126<��I 9;?D!
+ Ba��33!!aZ2����O��U�!!#���X�J�7���"$"&54674632'>54&#"c��:,D%-/N.UI>X0O�13R0=/,
��Q�6/1kFIV'([^CwOa�AK0\F^c0?5���#%,%#"&'#"&54>32!326732654'"!.�?;+%I/z�:lLir��XR1O.!#
��?O@�"2E��VF�o4[b" 6SQG]��J�!#'##"&'732654&#"'>32JEN8"

DU#/#8PQ^17ScOW12D	MY7��'"
#/#".54632>54&#"4546324&#"326'�sGo@�sIo?�LRRJ<1/@7  
��A}Y��A{�	T7_ll_4R2772:{3535#535#5!:����AH�G�H����vZ4632#"&"&'5326533

%	

9/9��+t��-3��#3>7��:�=i

h�T���./3� ��A.#""&'3267#".'.'.'532654.'.54>32�.S)>M'H/8W3f
3$$/5A)" 

,f:FV*L23S1<iB5`1a:5(0"3K:\f

9%	
K	#>("-V>9'2$1L;<U-"� !�35!5!3267#"&'.#"����y?F#K#1;O_"(=?N=��>7=+
J	O7#'��hx�&467>73>32#"&2654&#"c/59@"	(//=12;p# )�FO
	
+-6+56D'") & 
/��lxB+5324+324+326p".4hh&4(4>6<>;< #�#;?"E��lbB##5bk(B����"�B
3#5##53>535`#&�%$nB�hJJh&a1)X��al�B#'#5#7'3537�dl-h%i-lc+b%bBhnmmmmnhhhhh��hdF%2#"'532654+532654#"'6)1 255*%E %7&F% 
$��l|B
3#'#53H+gp.m((Bgomm�h��ifB#5##"'532673f(G	''�l�eW\a��l�B#547##'##537�$N"L$5LMB։���֬���lsB353#5##57�''�(BYY�``���hzF#"&5463232654&#"z=4/?<41>�"$%""%%!�6::65995&--&&++��lpB#5##5p'}(Bָ����p|�"2#"&'##33>"32654&-67,%
(!#%(   �7779X6%&(+/$%,��hgF"&54632.#"3267%0>@1"GEh59;5RP��llB##5#53lO'N�%����lyB'373#'#S->>,SX-BB-�hPPhnVV��"�B#5#533533�&�(}'""Jָ����lnB326753#5#"&=37.%(((%)(�$
\�`
"P�fl�B!5335335���(h'iB�ָ����d"�B3#5!5335335�#(��(h'iB�gJָ�����hzF#"&54632'"3&267#z=4/?<41>p@�@#!��6::6599@@�$#G�@h�C"&546;##5#"3267R0>@1�O'�G#"h59:3��O&*��hdF$2#'##"&54?54&#"'>326=V#!+s)"+#-")FH�!A

r ��hrF2#3267#"&546"34&/5�K#$4@:0!zF5+J864<!"��lrC53533##54#"#54675KA'@@),'A@(,(!! )&*(88(*&( ��hl�%"&5467.53>73'2654'')()$$!)',h#'#&!&823F"(% #�l��3#32+5#535#32654&%LLDa.4j55g@A" �Z;<$�Z�E�th�F#"&'##533>3232654#"�91.9=((>8..;�A#BA�6:31`�Y./95S*)Q�rh�G&"&547##53354#"'632#'#'26=,#(Z((�3 %
)+X$ '$&)h!d�X2L� !#��l�B#'##5##73'&'"f(-#,(f	
;
B�^^^^��}l�B#'.##5"#7>7'5#zI$
'$	'$H�}?BE BAddABE=�ql�B ##'.##5"#7>7##533'5#�I$
'$'	C''zI�}?BFBAddAB	`�YE<x|�#!#�5��5x|�#!#4632#"&�5�K�5��t�#7�5��:|.k�t�'7@��k.|��{o�77"&54632{���-:|.k��34�x�'7'"&54632D�ڷk.|�ƅ#��##5!#5����55#��##5!#4632#"&5���G�55�5��1=.5463232654&'.54632#"&'.#"7"&54632�(9
&#	G;'3
	'	9�"
"(.85?	 07 ;$�5��1.5463232654&'.54632#"&'.#"�(9
&#	G;'3
	'	9"
"(.85?	 07 ;$5��1".5467>54&#"#"&54>32327>32A.9	(	
4&;G	"&

9$; 70 	?58.("
"<O��!!<{��O{��F��>R��	7���%SRT$��>R��'b$S%R%S$��(
5@KOSWf47#"&535!5!4632!!#"&547!5!&73654&#"32654'#5!5!535654.54632�n6-������W%$��E$%�7�*+�����¶,n5�O 
	'#�++�++�++K$$
+
%%+		m
		�++�++�++�N 
	
#�l�!5�`44���!'7#5�}����`4�/�4���%!5!#���}����44�d���2#52654#d1<<1'D8218'#BLI�3#4632#"&4632#"&>�@=Z�6���?�9%#"&'.547327�.(*L#"'"-��|45S'"#L*(."54��|-z*t$7'&#"'632'654'��45".(*M"#&"-*�-"&#"M*(."545/�4632#"&5-54632#"&����|����;��;�&�JB�7'%'%4$$��$$�5�5��5�5����)2#"&54667#"&54>7>=3Q&(0Y5^m5(!J=
'&C5��l	9[S-A7"3'�/,49�H]�7"&'>7.546327.546327.56327.546327.546327.546327.54632>32>322>322>322>322>32>32232>32#"'�"


		

	



&%/#)
%'!,F
-,!11'%%+!
.'( 
">:
	5/!)%	
 (%	/%+"9
1
+
	#


	

%				
#
		$
	
		


���(�&l�z���2	�&c���_>���&7���%SRT$��>���&'b$S%R%S$2	E#4632#"&.#"56323267#"&�"$/>0H9.$/>1G;�"N5"M6
2}	�#.#"56323267#"&4632#"&
$/>0H9.$/>1G;O?"N5"M6
u��u�33#�7����$1�$����#533J��7��1�P4�#3#�@��:��#53���~:�HP�b433P@�����:�b�3#53�@��H:��3!!".54>3!!")EX/��4hT32Ug5��/XE)b,/0B<<B0/��75!2>54.#!5!2#�/XE))EX/��5gT32Ug5�0/,,/0B<<B��(�b��'
�
���b��&��5����432#"%432#"432#"59::9W9::9��:99:�<<;;<<;��<<<5����432#"432#"%432#"X9::9��9::9W9::9�<<;��<<<<<<<5���432#"%432#"432#"%432#"59::9`9::9��9::9W9::9�<<;;<<;��<<<<<<<4���'432#"432#"%432#"%432#"432#"\9::9��9::9Z9::9��9::99::9�<<;�<<;;<<;;<<;�<<<#����+%#54.'.54632.#"#"&54632/F""$5h_<a("L2:?,&!$#$$#�)*5?-Q^F40*,!27�$  $%�ua�5>54.5467`#B@$AA�"$'-=2##',>f��%".54>32'2>54.#"3T22T33S22S3#8""8##9""9�2T34S22S43T2<"9##8""8##9"��H��+L��t>73#L0A^v569�5��H�����)��J����	>73##"&54632U0B	^j#%%#�5�5%XU#��%%$  <"�	#5'3Y��Y��	�O���}�	5'37'#�X��X�5��O�	+��37'#7+�d��d��
W��B��� -467.54>32.#"#".732654.'B2'(%2U5YO%F%7:D4.O0[JE`1KDL,)D=(�*@6"/;":&%"&(8+CM+G4+>/$"
.��(�X3'�����(�
�3'�0'������W��''7'77V34$44#53$23c43$34"53$33C�2�h#/;G"&54632"&54632"&54632"&54632"&54632"&54632�$$$$$$$$$$$$$$$$$$$$$$$$� "%%" �#%%#�#$$#� "%%" �#$$#� "%%" L��NK75>54.54>54.54>54.54>7�,,6];AQ,,,,,,,,,,6];AQ,,,,,,,,-#2?;,#,$&,+%%+-"3> ;,#,$&,,%%*:����&<FL33253.'>7###.54>72675'"&54675"2327&B=21="?1;: =24=y�CxM8It,4q2pzYG9_97v�/+�m/>�@EL	F���
����
��OpB	�
&

\g[j
	;aCEi<���P�z:T��(�'�1��t?3#.1^A0i4�96<��t	?3#.?3#.<^	B0�^	@0i#UW&5�5#UW&5�(���7"&546323!�[Y+!(��UC-,#	!N(��"�'7'7S+�G�+�G��*���*(�_T
%.#"#>32(9'.26KJHQ�')>HJ<(_
"&'332673>32#.#"�JK62.'97Q�KJHQ79'.2�I=)'<J��>HJ<')(�_T
#"&'33267_QHJK62.'9T<JI=)'(�_�"&54632"&'332673�JK62.'97Q0bI=)'<JZ��2#52654#2#52654#Z1<<1'D1<<1'D�8218'#B�8218'#B
j�#&5467jr	nVz	g��#��G #<��375'575'37'7'7'�������e�������U�
U
�U��U�
U
�U�H����2#52654#4632#"&d1<<1'D$%%$�8218'#B��%%$  a��	##7�/��ZZ��P�����P��>���s#"&5467332674632#"&�1#($8 
�$%%$/+4+
��%%$   C"&54632'%'%"&54632A$$$��$$2��5�5��5�5�aX�x737'aT��X�T�bX�x%#75'3�T��TX�T���,�3!5!�%�}���C7�m"�'%�">3232654&#!5!5!32#"&#"G
:6F?;-6?������{�LX&WS>dH�$ !=?N=��%@+;L
#�)�">3232654&+5!5!32#"&#"3&$(-!+?.G�"��w��|kVTP7P!.
�	"$6�G9�gHD=G

"�'%�*>3232654&#!57#537!5!3#32#"&#"G
:6F?;-6?�ʫ�����屈���LX&WS>dH�$ !=�L�N=��L�%@+;L
#�)�*>3232654&+57#537!5!3#32#"&#"3&$(-!+?.G�i�n��wxe�{|kVTP7P!.
�	"$6�@�G9�@�HD=G

-����)74>7>54&#"'>323267#"&--W?:DDC.W&)b:Df:\\@JRO9k$"f<u��8J5&0$/9M,Q9S`!)0#5>Vj-���")74>7>54&#"'>323267#"&-&H34<96'J"&T1Zo(J44:<C/\Q8bt�+9(#FJD,8(  $+PP,��s�7'533267#"&{O�O&.#6LQ��55�!1/F	M��R��6tZ��53533##54&#"#54675��Z��quZ_]Z`ZzpLaaLa
�m��`da_��p�aP53533##54&#"#54675{�X��ZcXFIIGXbX�ASSAN	f`hdHCCHdh_f
N=���� 3#"&5467332654&'#5��a�ww����ww�c1pxyn]\Za[���sUd||dUs�CPPC?J��M"���� -"&5467.53>73'2654&'�U\<>-: 
X2.*7[%G525)O:+602&+6
WE7aB)EDM26MD,.YsTU�q:,JD%,H+C0)+O,'8,+3=����6".54>32.#"32675332654&#"'>32#"'S]|=>tP&K"4RZfe7Z8 ef[R3"K&Pt>={]hGG
_�om�YC����������CY�mo�_>>:��N#4"&54632.#"32675332654&#"'>32#"&' k{rd"8)=>NC"4X6"DK?=*9"dr{k8QP
����C
je^l��l^ej
C����(""(��p�4&#"'63232+72654&+�$2&.>TUk������VWaV_5<GTe|ibeoL@HL4��l#4&#"'>3232+%4&+326�!-$4PO��kn�bB>��<Ax.5EM];�MY�1#�0+�3#5!32#!3%2654&+��j����[Z�ETW^V`|N��ibeo�6L@HL4��3#5!32#!3%2654&+�����kn0X�y;CB>{�FۘMY��E/11$�a�333533#32+#%2654&+aZ�Z��j����ɓVTW^V`�```J�ibeo ��L@HL4��U��333533#32+#%2654&+UX�X����knޛ{;CD>��iiiE��MY�,E/11$�=����&4>3233###".%4.#"32>=D�h^�K�ZZ�H�dh�E.`KJ`--_LK_.fm�]N�_.�6Nf�W]�mV�HH�WW�HH�7���"4>32353#5##"&%4&#"3267<jEe}
�XX�~fm�~EMLEELME
Y{Axq���y���effeeiia��33!3###!3'.'aZ&y]\y�{\���w�+��5�3J��J���pE+*U���#*"&547##3!54#"'>32#'#'26=�L[+�XX�p%M',^1`c?%Q'GUOT\5
RN=&��#}B]a��P/+FQI12;+-��	!3'.!'v�u.F�C�F�E�3�TD��D����
133'.'#!'�d���		65.4��QCD�����$%##5##7>7'5!#7!"!.#F�Q�1[F/J:�A�:I/H[������0>)�(>0�����:P-�44�-M9����01.1^!%##5##7>7'5!#7"!.#�H�)Q=AC��<C=Q�����)3<7>uuuu�BG�--�?H�ء��
!- a��33!3!!3'.'!'aZ&y]�u���w�+F^�\��5�3J���pE+*���T?373!7##3'.'!'��]d��^�X�
�	Z@3A�����@D56C
�~��%#.'####"&'532673�]n	Y	&&7. ##�]@2S(��p,b-t8Y3J>F�!#'.'####"'532673\N
	X
!32	�`�(?��T6&gLCH3��D��733!3!#WYeZ��VO{��z�6��F#33!3!LXX�E��2���Dx�!3#5!#3>7!x��ZV�V7$A2 O/9 M�M���>���OQ:���6)�F�#3#5!#3>7353��NU��T+EE�t"5#�F�w����_�|FD��0�����!###"&'532>7>7!!c\�	
&?3#
#���{J��4C^0K1I$&��oM���####"&'5326735��`�
.L:
6A�F�-ϩ�^B��aF�!##33!!#467#��S������Y�ri9�O��IM���4f ��U�##467####33'��O�J�Ou��F�-V.�Q�-/���Q���=����&447��'"
%".54632'2654&#"7"&54632-Go@�sIo?�qQLLRRJKV
A}Y��A{Y��Io__ll__o�=����'3".54>32'2654&#"7"&546323"&54632�o�HH�pk�KK�lzppyysr�
\�on�\[�oo�\N���������5��B#
%1#".5463232654&#"4632#"&74632#"&B�NuB�Qu?�HU]\UV\XY+�
��D}V��D}U^op]_mi[��=����'4/'44&44��7���"'
b�
b+�yG�1=IUags������������%#"&'#"&547#"&546;&54632>32232#"#32654&#"32654&#"4632#"&'4632#"&3&'32654&#"32654&#"32654&#"'"#673"#674632#"&%4632#"&74632#"&23&'2#3&'232654&#"32654&#"7"#674632#"&'4632#"&�KG/>?,KHKHHKHK->?.GKGKKG�36622663�36622663J���36622663�	36622663�36622663�`�	����36622663�36622663�_�JY$  $ZI?)ZIIZ(?IZ$  $YJ>)YJJY)�<EE<<DD<<EE<<DD:



Y�<EE<<DD<<EE<<DD<<EE<<DD+e





Z�<EE<<DD<<EE<<DD,f



��@�
#"543!2#"'�&((�)('n./33/.���$D#/;GS_#'#7'373#'#7'373#'#7'373#'#7'373#'#7'373#'#7'373#'#7'373#'#7'373X89FA44A�89FA44A�89FA44A�889FA44A�89FA44A�489FA44A�89FA44A�89FA44Aq\\neSSd�\\neSSdo\\neSSd�1\\neSSdo\\neSSd�'\\neSSdo\\neSSd�\\neSSd�L���,#5!#5!!53!5�H�(Hh��H�L�����
����l�#'+/3##5#53535!!5!5!!5!5!!5!3#3#3#��0��0�~;c;�';c;�';c;�200��00�00�0��0��'0000�0000�0000~��;��;��C��'#7'373#73'7#'#3D�EE�DC�FF�C-c22c--d22duxyuuyx,NVWNNWV��hjF"&54632.#"3#3267'2AB2$

CvwF
h4:<4?F��ltB73#5467#53;�1%�1&�!��~
#����lJ�4632#"&74632#"&#535				U	

	((|		



		


�����p}�33>?3#"&'5326?i+41+h
(#
�z
 y�$�ul�B32+5#5#32654&Bb.4jM�AB BX<$�uE��l�B	
5332#353'2654&+(>\,1�(� 9l�X<$��E��lwB	2+534&+326^-2n(~CD!�<$�X>E�`l�C#.'#.'33>?.'33>7�L%
5$1'$!(!Csd4a(p?:_
;*1`(#_7�V��
#"&'33267�QVUOB/4123@=6##$"��ku'#7#"&=3326?u4>	%(?
 
'�F)/)(	>��w��
u!���k�'
v!�D��3#5!#3>753!B[V�V7#?2!U/9 M����=���M��Q:���6)�F1�3#5!#3>7533##�NU��T+@EP�v!5�2����Y�s��2�D��3���+"&'532654.'.54>32.#"�=d&(c7J\.L..T5>i@;`++N)AR*H,1Y8@q�V XQ2G:DbJJk9ITM5F5!G]DRs;+��#)#"&'532654.'.54632.#"�og7W#&Z*AE <)/K*sX/T*E):?;.,J,cqLE:+;.8N=_bAB4(3*8O&����5333	####"&'532654&+532654&#"'>32*%�Z;f��Dl��Z�E��:i-/o1`cthfajiP@CY*+*{Mtx#0F3��Z����j��N.V^vRHBD>KG<6:"=+d!���"423533##5##"&'532654+532654&#"'6�\m�X�`�f�X�ov:^"]7<S�H:ES?;,C(T"ID-��������2$C[O)2ZH%-&&F%K��#!##"&'#"&533267&5332673�Zma2P@~5bkZ?F2V7	Z?C4R4Z)0[[��;=#��<<YHg#326753#5#"'#"&=33267&=344,P)XX*[6k(/f:RXX44,P)X^72��� G!&VS��72��9g�/7%2#"'532654+53254&#"!#3>7!36!�/?: #CC<+1$*R'&N#(��W5-L4	\N&�z*4W\&#2 %15

(,%
�
R��r�� @���9.�>�.4%2#"'532654+53254&#"!#3>7!36!.<8#@A='0#(O&&J�'R'>C3;%��82U%"1$.3

'*$�Y�.|s�Q����%4&+##5!#32#"'53265C;?�Z�����RV0#*1�=1��|NNŶ��Se
L	8;��##>32#"&'5326=4&#"##5Ӳ#W8]aEI( $9:5P X�F�!\_�EUH'.�A:��F���7#5!#3267#"&���3-!/S^��NN�IF;Le���7#5!#3267#"&Ʊ��). 
1VK�6FF��81GY`�(��%"&5463!!"3!2654&#!3!3#�10//>��11D09�XZaZ&(#QF�,%&-5&+#-��|�m@))D(U�(^#"&546;#";254&#!3!3#�10//��%�r+;��XX!NE�,%&-5V#*�/�9%)D(�>�"&5467#5!##"3267�/?G6��60+8	
�848EQNN��-9<�>�"&5467#5!##"3267�/?D4���/0+8	
�846E�FF�--9<��5!#32673##"&=�CG5_@ZZBq5dl|NN�;=Y�6)[[��326753#5#"&=#5!# 553Z/XX.e=S[���^72��� VSzFFak�4632.#">32#4#"#adW&
#/9@m2elZ�4[=Z�miO=G_[[��x��U�#4632.#"3>32#4&#"#UNF1#""V=ZaX:<WGXcQI	E)&N2.)_e��FHCaa��a�(��'"&5463!!"3!2654&#!3!3!3#q10//��Y%�1D0:�%Z[ZN#QF�,%&-5&+#-��|��|�l#V)D(U�(j'"&5463!!"3!2654&#!33333#910./q��%e7:+;��X�X�X<!OE�,%&-5,*#*�/�/�"K)D(��=���&446��7���"&TT�=����##".54>32.'!35!#>�K�lo�HH�pk�Ka^]���]_`_�_`fo�\\�on�\[�Bh
��~�n����7��'"
2#".546;&'5>7#0Io?�sGo@�R=?��r�{B>>�"A{Y��A}Y��LPG��I���
XL�a32+#5#32654&�`�BK�o^`'.+a�\-5-�f7`a	2+34&+326؈CH�9�-(ac$/�\-5B�_g�u$��#5.5467533654'6B@8&6B@9%%*%&)%OO^910:]]911:Vt)%$*JI��h�F!"&'##533>32.#"3#3267`/?>((>>-"
BttE
h04`�Y1,?F(��2�"&546;#";�CIHD~~__~bE@AC*Z[*(�'2�"&546;#";5!�CIHD~~__~�bE@AC*Z[*w**��(�2�
�	��(02�
�	(�2�53254+532#(~__~~DHIC�*Z[*DAAC(02�53254+532#5!(~__~~DHHD~�*Z[*DAACw**(��2�72+53254+5�DHHD~~__~�DAAC*Z[*��(�'2�
���NT�!3"&54632B���P?NT�!3"&54632B���P�NT�!3"&54632B���P NT�!3'"&54632B���P�NT�!3#"&54632B���PNT�33"&54632NB���P@NT�33"&54632NB���P�NT�33"&54632NB���P NT�337"&54632NB���P�NT�333"&54632NB���PNT�!##N�B�B��NT�3##���B��B�9�NT�3#33#�BB�����BNT�3##���B��7B��MS�333MB����B(�
�##"&54632
I4����(0=G#"&54632'7���4�5�3�(^AG#"&54632!5!�Y���I(S2�5353(�5S5q�FH��##5#�L�����F:�z'3533�L�:���HH�e#34632#"&�9kt$%%$F�'%%$  HR�o#"&546323#�$%%$[9k+%%$  �����H���
��V(���	5''5'(f�5a
��:<sr&�(���I	%55���5a5����$sr<FB�##532654+532#532654+532�:KmLRVT'UX
8Ki49UN$Q�*14YCOC)F*�a*,6UCPA'C)F!T"#53254&+532#532654+532�$c509=PNCF,0b#&LLBU)P#!BG9!:$��*"(@BB:3G1	��"&546;#";L��y}ib�v^	}gewP�RX2+�`'%".546;#";.`r1vzEA�kU�5[7ZmL�KF.a�@��"&'53265!#3!3�)#48��ZZlZd�L;F?����.�HmeU��""&'532654#"#33>32�( $vWGXXW=YaE�H'.��ba����9.)_e�MEU��
��&9�����-%267#"&5#5?3!'"'532654&+57!*5GOLP 4<�x?vSlQ.]-ZXbq<�3?D
K[7*!v{<�veFn=#Q`IIQB��a1���!"&54>7'572.##"3267I��?j?��Gp1!.W,�Sfha_2k1+h
ocCV-�CxES�CD>BHS.�#%'572.##"3267#"&546&��Kj1/R7�Fub\]2k0U����ťCv BS�DPBDOO)teem#����%#"&'5326=!53467#3�KD%
!&��O_W��WVK)./>��:u$
,����#"&'5326=!53!5467#�HL*!")��R[���VEUH'.Q>�/�:u$
+#��h� +"&'5326=!533#467#3#5>73B%
!&��O_��K��)2
X
K)./>�HK&WV�:u$
,��}%T"
7:�^ +#"&'5326=!533#%!5467##5>73�FM*!"(��R[�����')2
XJI]H'.Q>�/HH�:u$
+�T%W$
9;O~	3#!#3#�L/���@�?(���"'%#"'532654&'.54632.#"�hV^<#M+3=D7$?&aO)K%#=,75$)A%�HOH,(**%;-DM=)&#'9����&&&#.��8#2=H26?54&#"'>32#'##"&'#"&54?54#"'>326=326=`c>i[:5*L!#`4b^@#MD7T3>,P\�bp%M',^MT\5.GU
dM7+DZ#]aE C4BV^��L,*-.!(RN�}B��2;+-QI183-*KN0��L�(7#3>32#"&'732654&#"'.'3�Qb]X��k�KK�l��Nryzppyys�Q�����p�[�oo�\|j��������<@�.��y#!-82632#"&'##"&54?54#"'>32654&#"326=~,ByIo?�sEm fFX^�bp%M',^�KRQLLRRJ�T\5.GU#ONA{Y��>::>RN�}B��_oo__llh2;+-QI1����"&/!#3326533'.'�m}(	��Qb]�0G7\]Z��d�P
dj��8J%c]�2w�3�<@.��L#(3232653#'##"&'#"&54?54#"'>326=`c9=WGXF
[=@W"_<P\�bp%M',^MT\5.GU#]a�HCb`��H*(2350RN�}B��2;+-QI1}�13>73#'!3'.']�	
�]��cP��Qk�P�/=;M�6��)�<@.��#"-!'##"&54?54#"'>323>73326=�%Q?L[�bp%M',^1`c
�a���T\5.GUP/+RN�}B]a�83;V��2;+-QI1��1333##3'.'>?#aq�p]��go�u�.�,�"���A�6?��|}<@��@?Q"b.��#&1!'##"&54?54#"'>32373'3>?#'326=�%Q?L[�bp%M',^1`ct_a��0
)Y�T\5.GUP/+RN�}B]a��O;U]8�2;+-QI1�}�&#"'5326?'!#3>73.'3l#n_;*16<L��Pb]�	
�]��Q�)afR
7?4���1=;M��<@�.�#/:'##"&54?54#"'>323>73#"&'53267326=�%Q?L[�bp%M',^1`c
�a��*?0!"*)JT\5.GUe/+RN�}B]a�830h�u":#K	,*T2;+-QI1����;�&JT-��!���"&�W�o
k�53533#>?3	##
TZ^^>�i��&j�IZ&OUUO�"D"��mU@��&	
�3>?3#'##53533#�	�g��j�=WLLW��k4
���5�]AZZAak�%7'#3>?37#'ceIZZ>�i��gc)f�jrb|Q�@����"D"�ɎR2TњQU
�?'#33>?37#'�EC=WW	�g�Ih'jzjQEi6[5���s4
��`Q1R�m5
k�%7'##53533#>?37#'ceIZTTZ^^>�i��gc)f�jrb|Q�@��&OUUO�"D"�ɎR2TњQ	
�#?'##53533#3>?37#'�EC=WLLW��	�g�Ih'jzjQEi6[5�]AZZA�4
��`Q1R�m5aN�	%!!37:�lYZYNN�#P�#U�7#3�XXXX�!�#�!���
3#53533#!aKKZmm8+MRRM�%P��3##53533#�XFFXEE^@ZZ@��	�#53>323##".'"!.267!>L�id�O::N�gk�KJpr	�qpsq�-sJFb�QP�cFg�TU�f<�tt����{{���t" =3>323##".'7"!.267!H
�jd�@?�mDkB�IJ6LHLL��L�BrzzrBz�;rQ�UMMU�gaTTa��=����&4t35���#&2".54632>32#"'254&#"2654&#"*Ho>�x7U7(:A5':n�;�PKLPLON
D}V��#%F8 :$OyDjB##%��p]_mic^o��=���&446��7���"&TT�*�75332+3##5#32654&Q���5}kRddZ�[HfdXuK
nd;g@VKuu��BOED�0"+5333>32#"&'#3##5"32>54&SHNAcyyd>Q��X�RCAX1?G�AgI#0����/4;A``h\^ck6]<\n{�$"#.546;32+##32654&�+'JJT���5}kRZ�[HfdX) 
<Thnd;g@��f��BOED��#)62#"&'#.#"#.5463233>"32654�er6hJ1MX
!"LEL		I
Q)SD/;JH#��S~F&/�%#=K�J'-J_^�m_�
!�!*"&=4#"5>32;32+##32654&,RU=&�*."���5}kRZ�[HfdX^SqPG�t82hnd;g@��f��BOED	�/#+8%.=4#"5>3233>32#"&'#5&32>54#")AJ=&�4@IR;erA�d.Xs0IY(�SDCcHmPF�yPW�J'-��T�G��7^<�_=�T��(7'"#".54>327#'32654&#"pf6
o�HH�pk�Kig-�mO�({�ryzppyysq(@\�on�\[�o��#/5:+S/1�������7�d"*535467##"&546323733##5'26754&#"��Q@ay{b?P
FRRX�SEDWHFG�@D0"0����0#I��@aa�[^fiq__k=�7��(4%>54&#52#''7'"#".54>3232654&#"�ig/-##&<F59�W�$qkD
o�HH�pk�K��ryzppyysf��#1�9!!)6F5:K$�[*I,EO\�on�\[�o�������7��")64&#'2#5'7467##"&546323737>26754&#"�+)@M&�X�&�Q@ay{b?P
Fb&�jSEDWHFGD%)5F9#4.��ﺾ%�"0����0#I�R`&4�[^fiq__k-=�2##53254&+'���MD�f��x�]YlZ�ffI_��(K�J:L �2#'#532654&+'�bk<2�b�tc8@=:dXPM:K��A2.0+D9�vu�#357>54&#"'>32!533##59�6J&F84O)/*mDdt.R7�UbbUI�6TQ0:=$ <#1eY8a`6���P��'�u6" #5!57>54&#"'>323533#�S���3F.%<<0#R;LXE=g�Tbc��>�4W2%+3:'OD>a;i��I��X�3>73#'#73L9��_�Z886R�^y�N!,M##N-�6��������3'#7333>73�:5R�^]x8�r^�N����h�IF26<�����,#"'5326?.'#3>73>73� y_7)16A�
�^�ZpsZ�xZwnR
6@8�20L��P0^&#i4��5$W46�
��3"'5326?.'##33>733>73�$ 
.5
Z


X]�ZL][XJX�:I�	H@A#&,1)
	)2.����1_>2,��+[a9��[f)�,"&54632.#";#"&'532654&+57�hjdP"6#/<BM��}���=h+1k2b^jtC��]YS^@		65;:<�dffwSP?>IC����+"54632.#";'"&'532654&+57��^S$9'-<CE�Ճ��{8]&,Z.WY_kE�f�P^
=	74:.7�f\]qNE@<F>�
*�35753732+72654&+cYYZ��n�~��`KaeV[`�-H-�bWIWiddsx�?QEA��
�0�!.575373>32#"&'##4&#"326
KX��N@cyyc?PX�FJRDAXJE�I*��iIi-
"0����.  "���ee\\ckk(�73##5#53332#'2654&+�mmZYYZn�~��]dV[_�7A@@AInjcerG=RDB���0�!.##5#5333>32#"&'#4&#"326e�XMMXN@cyyc?P(FJRDAXJE[>WW>S�-
"0����.  "Kiee\\ckka�@�3>73aZ
'�e�{���`1b R,��+�U�
#3673�XX�f�	�� 801I,����(#"'532654&+532654&#"'>32�NGPT�vzO*e+RbfbTUdUL<3T*$/pD_v#FWXGem)QEFA@LB=6:  @%'^��#&4+53254&#"'>32#"&'5326x�ML�J9TM ,f>7Z6BBJQ�|:\)\[U[
�G�<@7A!)TAD\^LmyP/S����'354632+#"&'5326=#%2654&#"�VPHV\T:[U-!2.�,-% ")�4JdN@LR�g^N8C�J,&(27.����&#"&'53265#5354632+72654&#"�KV0
!!.)xxUOMP\S:7,-% ")INYG	28�G/JbKACSG*%&18)4���!"3267#"&54>32#52654&$KKDC 1:)`n9kJJqA���~L�ZKGLH
tgHn=D�i��K��r�5�#!"3267#"&54>32#52>54& HIFA/8'`n9jJq���Wr8O�gXSTKztRxB����HM��z�"�\g"3267#"&54632#52654&�//X$>HRIIVosTS4;>5d	-IEJWc_��+k~IO7�c�,"&546323.=33733##7#'#'26=4&#"dxyd>OX8CDCz�CED`
P1UEBYGGG
����.!
3�P��H��H"0I]^dkq_`jU�c��
%33##7#33+DCz�CEDtX;�H����PU�c?"+23733##7#4#"#4#"#33>323>�[Z+CDCz�CEDcmNCWnQ>XG
U0~&]"]h�뜜H��YZV��Yd^��I*)Z.,U�c"23733##7#4#"#33>W`b9CDCz�CEDqxYDXG
\"]h�뜜H��W�d^��I*)U��3.'#7#33>7�A2,	6@B?AKXFS9��S¿
^G��^14U�c�!3323733##7#'#2654&+U�Vh$9 h6CDCz�CEDL��~>E4>�QM/?#���H����-.&0�����#.2+##3267#"&5#5?335462654&#"4>KUUX�P*5GOLP 4�K32"!�G9?P�-��aD
K[7*!v{"G`�-$-4$A��*2+532654&''7.546">54&�SY/&.=vp��GO;1�9�=JaP+/66).�UL7P&9D.XfO2<2>�>�'RBGYE.*,8 '7$)1����2#".5467#52654&#"�l�HI�nm�I<=�yynssxq1g�]�nm�]]�n\�/N�p������W�H5��"�!#".5467&'72654&#"�-/�wHo>~y�U<>/)bxQJLPLOK�*gF{�?sNt�[d$;&!F�GhUPf`YRh\�1��2.#"3##33>�%

%Zh��YDg�QekfJ�/�f1?U��#2.#"3##33>L"	
 CV��XFM#SbP�E�	^179���,#".54>7.5467#5!#"2654&'_;T,sFl=;\27+���a+	GM>>,Q2T� FX=m}4bEG\5#7($
JJ<�LTL?L%*J;FP9���,7.546323!53254.">54&�;T,sFl=;\27+��M�a+	FN?=-P2S�!EX=m}4bEG\5"7)$
JJ< �SM?K&*J;GO0 !357'.54632!2654&#"R�O=�sGo@vhb� �RJKRQLL@�M/oOu�9nNjyC~JjZOP\\POZ��#!5�Z���6zPU��#3�XX�	\�;
�%3267#"&54&#"#33>32xM!!5LJOPi`ZEmMuw�]J[M4^Zyj���^26~�U��#4&#"#33>323267#"&5�;?SGXF
\5^cA(GBNHC_c��	H+'_e�PGQC\�1��2.#"#33>�%

%ZhYDg�Qek��f1?U��#2.#"#33>L"	
 CVXFM#SbP��	^177��R�5!#"3267#".54677�Z�I{v,U+(Z7g�KiN|NNM�X�MU�gp�( ���"&5467#5!#"3267-v�:6��q^kVP%D F
�yPoHHkjWeN��(�.z�����HV�&4632#"&4632#"&H$%%$$%%$�&&$  ��%%$  2���5!!52[��~GG�GGQ���7#3�9k��Q���3jk�9��a��	!#!3!3�Z�:ZlZN|��.���Q��(#"&5463233#327#"&";54&�1>??3Xgg$,/QE9#+
3<.47�g6��/1	FV.'E��4632#"&E/'&//&'/a/,,//,,a�7��!###33.533#�R��Sh}T@WQ#h7�q��@L �����U�<P"!#4#"#33>323#�<xYDXG
\3`b7RW�d^��I*)]h������Y�53>32.#"3#3267#"&'?S�iqT$!Q0k�	��	zq/T((U;��
;Lc�T*L�wLr�N�����" =3>32.#"3#3267#".'GDkB)L@���MH,CA.El@�ARg1I	�AX]
N7qY7�:�"&".54>32.#"3267#"&'532=,Go?BqH)L@�ML,C9<
0
:z_c|:I	�ag
�@EI4@U�:E�$"&'532=#4#"#33>323�
04xZCXXY4bb,9�I4FW�e^����(#)*]g��@E
�� )27.546;32+#"%2654&+32654&#EH̆�FB-I*�s�&\DS[v�_JMc� A=0Ob?S&F8ajO�;:;3�K��J<8E6�r�$13632#"&'##327#"&546732654.#"4X-1j9sl<O?NYVD+(6g|�wX?UEL'XI1,��H}O��1!H�&�sdg
F����*�ijid<[3��4��"&'5325#53!!3#/!<rr�����K�IDmMMM�M��IH��###535#5754632.#"3#=xX]]^^\R 5*,+��Q@��@�)h[E
;?#D�1���/".54675.54632373#'#'26=4&#";#"9OwB[YOKoZpNIlKkpsnOPWg)*�j
0]BG[
QESe?+`�6a*AKv}rum>2?BJ�HB+���#2".54675.54>32373#'#'26=4&#";#"�4Z7;C277S+7E)E@W.ZDKS8<AFGDH
 D53I
>,2?'K��M'0Hd]j^*'()B2,+21����)"&54675.54632'2654&'";#"B��[YOK�q�II�r|vuyQSWg)*�1S
naG[
QERf[�nm�]N����=5=AJ�0;��-��!"^J���#"&5475.=3;#"32653#'#:p��6O,[iu*�[IisYIl
g[�
*PC��XKJ�=Av}��6a*A<���%".54675.=3;#"32653#'#�3R11718S?KC8>4XFTAU
#E13FB@lf@8B2,+2d]��M'0����&32675#5!# 57>32.#"%���+D�5vF��<C[�g:k. )\0d��		��
�N���
>U�IKgYp=�_"%,67>323737#"'5326=467##"&'"%.4532654tg5UFMMu{vKOwEO6p\p
8@I%J[��H>QJ
�()G�?��st"Q*QF-	Qqg
aY6F>�7NSWak�573>?3%##^Z>�i���j�IZ>d��"D"��I=@��U@��)�?37>?37#'#5RW
�g����j�,WR��s
,&��1?+���&����"73737##77'#3.=^hɱTZZiեS^�����Ok����>��J��!~"�#h��@L ;f"?33>327##5"%54RG
\3`bMMW��XRGWE�I*)]d?��4��`[4�i�!###5753277.+27_g��Z^^�w�GAHC)[JYf�	�����
=�NN
>	Da�4)��{&U���"'733>32.#"7#5WH
R8#

)H+��XW�	b,@Q-O50?0���� �/7.54>32.#"%#"&'532654.'&'�'(:gC;b(%W/CD6C�@C�u<f"$k9PQIA
�`M79Q,M9/07;>&QD_jV>5#0)0���"+7.54632.#"7#"&'532654&'{$'oZ1U%"J'698G�s#&tb8Q [/C<3I�7+DJF# '*?8+NPP+$++
��!#!##"#.546;!3�Z��Z'+'JJT�nZM��) 
;T��.��&����=���#3"&'5326=467##".54>323732>=4&#"X?x8;|>eghR_|=E}UNeN��9N.h_bd)W�Vds2.CX�`n�P;/`�i��j(BS*8ux�}JuC��G�%!#"&54632533#4&#";G�d4>?B3$ZggZ$-MM3?.58��6�/2&;�)57'5!;��hh*hh4;44��0�uHE#'"#".54>3232654&#"HOR�rp
	Zx;;xZ[v:�DU[\TXX[Ug���J�XW�JJ�Wdxxdhsw
�373##j�IZZ>�i��@�6`"C#�7"�33!53�Z�����OO���<�7&'#"&5463233267&#"�(8B/8EA6*&Z�)!"$1G)"!&<45<���)' ��|�$23327#"./#.#"5>d#*i�`�)(0$f�`z	 �0'�_�@��(*B"I:��b�&*.C	^�J�#2+#2654&+32654&#1�~J@JQ�t�Z�VLWVw�VRV[�[Y@QOMgg����<;;8�G��GC=A��U�.�m��=����
E��:��N#
F4����'7&53537#"&'%326q=K%Z	j@=><{_;]"w��0ZaW(^?X�1'�Q )M��JwE��n.g.��C6'7&53537#'##"'%5326c58Y75.H
\4O.(�4YE&,B+F_��@@-6�-G*'�l��d���"#3#'##732654+7323'.'#)�^XX�t&	3:O;:A?V?�*�6���)*"4B9,7O��&\#&W,0��&I%7#732654+732"&54>32373#7#'2>7>54&#">&	3:O;:A?V�@Q'F`:5B CrF
"\%G:4,'B2,^)*"4B9,7O��]ZK�g<8%S��c,AI6\91/<1Ul;66����3?'73#732654+732/
UzL
�
VzM
��&	3:O;:A?V1@22��1�)*"4B9,7OII#732654+7323�&	3:O;:A?V�rXr^)*"4B9,7O��������)"&5467332673#732654+732opm\Y]EDYWcYdEt�B&	3:O;:A?V
g_2��L28@\Y�)Nr=�)*"4B9,7O7��&I,#732654+732"&5467332>?3#7#I&	3:O;:A?V�=IFYH	!%"OD1WrH3C^)*"4B9,7O��DA)G��+ %0jX��c3"���E(@%.'#3>7>73>32#"&32654&+532654&#"#-12Z�^�&L(
D9S7#(V/qu\MZ^��4_6J@>VYoc4/edP@?d)
J�SI�d�6,M#��GY�DJYdMIUXG^v���HBD>KG<6:85G��Nf+D"&'#&'#33>7>73>3232654+532654&#"}4SC)e�^r%> #F!O3Wh6/ 6!f��!!>"4G� AM=5?U!
Q|0sB��61k�7Al,2?ID19
	 4)C[I=x4
)2ZH%-&&98=�:Y�&"3267#"&'532=#".54>32.�s�{{/T(9<
0-<m�IO�nqT$!Q������@EI4DZ�pl�]*L3�:��7".=32654.'.54>32.#"#"'3267�,E'$k9PQIA[]:gC;b(%W/CDD:?W-�u:2$(
!�IA�>5#0)!`S9Q,M9/$0&5J8_j00C	&�:�"&'532=!5!5!!�
0�`x�����9�I4FD6PD�ʑ@Ea��	+32%!.#3 !�Ű��l�V��
�wua�~l���P���yr��7���#"&546323.=3#'#"!.267!dxyd>OXG
P2@F&DPRF��F
����.!
3�H"0�[ORX�fWXT[���053.54>32.#"3##"&'532654.'&'Z:gC;b(%W/CDA7�b"$�u<f"$k9PQIAOAE.9Q,M9/#0%AD2_jV>5#0)���"-753.54632.#"3##"&'532654./@oZ1U%"J'69;G�Ctb8Q [/C<95�A.DJF#"&A/ NPP+$  (��!#!5!3�Z��2ZMO.{3#5!5!#XX�����J2���73!73#'!24;44���TT��TT��#53533533##5#535#???;�;??;���:+GGGG+����C#Ef#/2#3267#"'#"&546326"34&"32654&�BK�62"32#[))YDYUJ)A'PP�'��3..43/0fOB:6.
CCWPPV" B+[)2==<?=<?=V�)33333�sK�J�K�(�(���	!!5!5!5!L��"���/O�O�63��3##".546";?�ZRk}5��^YdfH�6@g;dnMDEOBa*�3.53###33��S���Y���i9��6I���I4f q(*�)57'5!*��TTTT444��P�)33>73>73#.'#.'�bo
sY�
yY�]�
�]io�P0^&#i4��5$W55�6�20L��6g#%_0�PN�n3#NQQn��Ngn3#3#QQ�QQn��n��N/n3#3#3#QQ�QQ�QQn��n��n��(�Gn'3��nP�O(�Gn''3����nP�OBP�O(Gn'''3������nP�OBP�OBP�OC���7"&54>32'2654&#"�H['I32I('I3*-/(+,.�VD)E*(E++F)F/%$/0#%/9V�o7"&5467%'2654&#"�I[%52.\ K%5C'I3*-/(*-.VWC*?)�:I7N9+F)F/%$/0#%/�c�D�y32>54.'7#"&'�2&Yb(Q@yb7hD�_N��7>��IH�f;�c�Qy32>54.5467#"&'�my2"+"�rXg"+"L�p"	�7X39c\]3XeK?:(T_l@+^R3����4632#"&732654&#"�:./::..;1 G,77,,89*�/����(2'654&/7>7654#".546�&*&4;
'Z$
!#
#�%1#+	H	&�(����".'#"&54632>54&#"'632&(
 !&--<'�2 *// 21�,����/.'#"&54632654&'#'2654&#"'>32C'-
)+.7�#

+	*$!
 /�����$."&5467.547>54'7'3254&'w#0#%"	2'&0#")I"!
�#$$",
	
&$%&	
	
 * #	#F	���$.'#".5467323&454632*
		4!
1?
$�-//*4(>F�����7.'#"&547&54632.#">32#"323&54632/
58#7*"	7
#�.4#&  +	)#!�����#".'732654&#".546324)+@)
1.3%	/."%*5/72,l`bq#!2	*+ J�����"&546?3267|(@!e'n/=�'*+%t }-
�����)>54&/.54632'2654&#"?	}0''1"
=~�
c'..$%.���� �:2675#53##5#"'#"&'732654&'#'>54&#"'>32v

%�10
	/#/C"*0"
# !')+"UO,,��
"!>F28**
&$������"".'732654'#'654'#5!#z 4.*1'(I�,
%0�>84@,)
,,*'$$���.�0#632'>54#"#5#"&54632&#"32675#5!.�",)%1
!#78+	9
���R'&0
$&xK,,'.,+�,������!##5##".546;5#��!10U
���,��
 
H����#5#"&'.=#5!#32675*0#!
'(�
!��W	


"U,,Eo�����.'&54632>54'#53#E-G	
w�2/!/>�$C	
,,%.
1-���C.75#"&54632&#"32675##5#53.546323#3.#"E##67,	
�0-+92Cl'01���$H- �H
,,'.,���,	
&=0,�B !����##"#"&'732654&'.547>;-;#+$%9 )' %!1�	*'%7'
$��6a�9������:0�9'����*=<��:��9'����'*='����:�-�9=4632#"&%#"&'732672&'#"&54632>54&#"'>�kMHl"ED6:8�Qi<1'J:RD ,!$)5=0 7#$G%dSY^FFKC��MO7U M +h9
;+-,A
:���9M4632#"&%#"&'73267"&54632>54&''2>54&#"'>32.'�kMHl"ED6:8�%.", .(+*!-<;-# ?!M5GR.(%32.75%dSY^FFKC�<	"$@
A
<18 6!'>-+#9:�S�9C4632#"&%#"&'73267#"#"&'732654.'.547>;�kMHl"ED6:8`$)$+2QAAe5<#F1!)-(*-+9:W%dSY^FFKC��	-/"7@EQ 4=%*'49��B%2>54&#".54632#"&5467.54632.#"632&"#"6M~K.)"5:!QJHD.K-2]�Rab*/ZI4
#X,"#^>F?lE/>$ 3?S47H'M;:nX4S@-A+<@EA 	FF(&:a�-72>54&#".54632#"&54>32&"#"�MK/)!JIFG[2]�R`bG<
_>F?lE/>$""0"3GXW:nX4RA&A(FF(&�[x��373#�LWWP�0�����X'on5!X'GGh��)#".'.'732654&#".54632�ufDqm>):+,\@7XW5P=),12
XOBA9J$-_f.YB-/E
?E:N(F8)<E	H1+A1N����:HT"&'73267>=##".5463!5!5!.54632&#"3#"&'73267'"&54632Q�69,f>.7�6&"�I�ZH 4"-(0kg%`VC]@715-D[HEE:007GCb6*<�G3VW	E/@0G��LT!�RXB@E>^Lh���H8�&��3�g���,.#"#".'732632654&/.=7�+60B($
  0%
 7.F$)1g-25085 
35,31��[
7>32#.#"zGSy5YB4`�MCGI)/)/��Y"$+2"&'#53>323733#3267#"&'#"!.265!`w46	v\>OFEE &2P2?E&ENUE��G
��>ux.!E�>�@	$."0�XLOU�f][X`.��O#)4;"&54?54#"'>32>32.#"!#"&''26=265!�M_�an%L'+^1|(bD5R*.N2QXrqhBj#c;DRNR[5�D@��P
RN�%w@],1Hc[4o�><==FQI12;+-^FQS:����&'7.=46?33267'7654/�$E-	�`�",' �dF


%E<� r�	�$
�yJm��3#!'73454>32!!!3267#"&'#"!.2:lLdr����cV@1O.*R5g�9$k 

=�

VFzo7@@Hg`"m/>���".574632>32!3267#".'.#"327#"&"!.SD0
~_Ec5��YP3O*)P7KrC*%0##$	DC�?I>�=Gly<mI5[_M<tV  #
BDTQHDU
<��###5354632.#"3L�Xcc\R 5*,+��h�Gh[E
;? 5�
#+9E%.''.546326=467##"&54>32373"32>=4&267.#")
<
M;W^WN7Y
V8eq1aHm9
K�KJJH9CAk3?J/2,4TA+
:799!$%!&,*�{MxDSIAcXZb-O4Ua�y#����2!#.#"#"&54632332654&'&5432#"&'�X
!
3H.
X

2?3
�#D9<9
��"
B88?z�7.#"#>325.#"#>325332673#"'32673#"'#�
3<-
3<-X

3;,

3;,X$>C
p	%>D
��$@B
o	 #@B�j�3#5.546753'54&'>�X6DE5X6CD5�%$�$$�
U=<T��
V:<U
�#7
�7##6
�7U���#/9"&546754&#"#4#"#33>323>32&''26="�1@IP56ICXkKAXET0|'X4Y[2;M8#
753={FBXY��Z_c��H))Y,-]g�
6OT=&.!U��g#!+"&546754&#"#33>32&''26="�1@IP9=XFXF
\<Ya2<L8"
753=xHCb`��H*(_e�
6OT=&.!U�V#%0&'#"&546324&#"#33>32%3267&#"B08EB6)':<XFXF
[<Ya(��*!#�)"!&<45<tFAb`��H*(_e�{#2Ga!)),����)#.'5>=4&'732>54&'.K&2N)1K,	�-,+&
�+"C(+OR.%�)�� :%.J$,���"+67#.''7&'5>=4&'77.'.4&'32>K	<%H&2N)/#,%%	�-_W
t)*�	\n"C(+OR.C9%�)�$�,� :-��/ (7.#"5>327#"''7.'%4'326z�.(F E.Q7'3* �wK7'3)��#5PK�0-N(4%8$c>��&5%85aF1��p6~,!-4%"&'#"&54>32>32.#"!%2654&#"265!�=_d?r�?mFBf hD5N((M5MSdt�OIHNOHF�A<��F9568��Z|A8787MZ`5m�IghdfiedgSEJNC���+)19@"&=!.#"5>32>327#"''7&'&#"2654'267!etdSM4N()M5DifBO:!4'�rD3'4+^��$;NH�OF� ��<F��<�m5`ZM7878(/#8#b>�� 8#>59[29f��gdJ/��NJESC���$!(/6"&=!.#"5>32>32#"&'"!.267!267!etdSM4N()M5DifBFm?�r?d^>GI+HFIF��I��<F��<�m5`ZM7878A|Z��8659�VTTV�gWVWVNJES5��v#%1".54632&#"3267&54632#"'72654&#"-Lo=�u,&IPNR$=!�xMm;�wgA@�PKLPLOK
G}R��Gjc^nBZ��D}U��??Jp]_mic^o5��v9.7@".54632&#"3267&546327#"''7&'&#"2654&'-Lo=�u,&IPNR$=!�x5,7-0�w8.7@N�$LO�PK�
G}R��Gjc^nBZ��'($uM��'*?/MVi��p]2N��P7#546753#54&#"�XbXXZcXFIIGvvz_f
��	f`zvHDDW�]'3267#"&=4&+#32#32654&�B'GC?HQX�bi6//2�cd9>>VPGQC�MJ�NM7CPG��2.0+U3#33>73>HXF>1�bI��^,4UB#2&#"&#"#33>32>"
-7!:!:#XFI,&A#S
,O4��^53/!���# *2.#".'#"&546733>"3265�"	
 CV2:E1@IOFM�8"#SbPM
6	OT753=C^17�x!&.���#,62&#"&#".'#"&546733>32>"3265F"
-7!:!:#2:E1@IOFI,&@�t8"#S
,O4M
6	OT753=C^53/ �x!&.c#3267##"&'VR!W.X"+T)#

���

��_#&"&5#"&'5326763274&#"326�Sc"+T)VR!W.)91J))L)4))45('6
hX

F

��++J-0L,�)79)(97��f�7#"&'5325432.#"�CI&B�&
B�BTGPڔGPP��#'##"&53326=F
[=YaX9=WGG��H*(`d_��HCb`E��d353!533##'##"&=#3267!LXXPPF
[=YaL�9=NI����((B�H*(`d#HCONP��F#.2#"&546"&53326=332653#'##"'#��ZZX47ICXkKAXFT0|'X#  ��]g_��FBXYq�_c��H(*X+-T��J#".2#4&#"#54#"#33>323>"&54632�ZZX47ICXkKAXFS0|'W�#]g��QFBXYq�_c��H))X,,����Q#732653#'##"&=4&#"5632�9=WGXF\<Ya! !,>G�HCb`��H*(`d�*&B
JI���J����x !-"&/#'.#"5>323>3274&#"326�<FH�^�]
 1-N�\�Q4";HF%#$%�FP�����"D1.�$���H6:J�$$$#��) .5332>?'.#"5>3233267#"&/#8}a
1,O�\�]&!
':;AY&.%�O	#'�"D0/�'���+8D
JF��2<��i""&/#373>3274&#"326�-:j�c��e��c�H4%7CA""""
)�����fC36Ez!"#"��373#'#Թd��c��e���c������<��j"373>32#"&/	4&#"326�U�d��c�I4%7CA:-;g��J""""�����fC36E)��<`!"#"�y�5332>7373#'#�8
׼e��c��e��+-"�O%#Y
�������.=P�"#"&'5326=467##"&53326=3t{:b*,g9JF7zYaX9=WGXoyROG	*U`d_��HCb`V����
#"&'33267#.#"#>32�QHJK62.'9779'.26KJHQ�<JI=)'��')>HJ7�]� %"'5326=4#"#33632
M8/99#P:?-�+�Q;:��}"49=��)3���.#.#"#"&546325332654&'&5432#"'�9		"/9!)!		)"$"��

'""%��.#"#>325332673#"'#^
!%9 %
9�#)��#*��g326=3#'##"&=4#"5632�M8.9-	;':?+	
).�T;:���+:<0',,Up332+!#!254&+�X�h\fn��Xm�x=:��QIOW�3�,_2'�S��"#2!3267#"&'##33>"!.&Ec5��YP3O*)P7n��XX�~_?I>"<mI5[_M�}��m{HQHDU.��(#.52>32!3267#"&'#"&'73254&#"5>"!.�Bi b>Ec5��YP3O*)P7Fn!!lC(M@�ML+DA�?I>#2414<mI5[_M4351I	�ag
NIQHDUO���#)632#"&'#"&53326532654&#">bMn:�xElbNgcX:FCQ[KQPKLPLO)3E}T�?84Cad^��IEYa ��^rs]^qk7��Y"*23>32.#"#'##"&546"326=4&?P2& FO>dyxrHGGGYBE"/#/#@�^E!.����Ij`_qkd^]+8#!"#53.54>323#5>54&2OWA:܆5?9mOOl9?5��;AW�dS\wAA"y[Cj??jC[y"AAw\Sd7�:��'47"&546323.=3!!3267#"&=!'#'26=4&#"!dxyd>OX���#0
<9��
P1UEBYGGG9��
����.!
3��B�n�4IE@AH"0I]^dkq_`j��9��5I3".5#5?3!>32.#"+3267#".=72654.'.5467#3�*G,LM#4*1U%"J'69<43H&tb<$(
!,E'�C<954J(	�/%HA.*#r{F#(9+NF00C	IA H $  (8, ��1/���,32673#"&'#'##"&'732>=&#"#>3253H	32)H
S8"
 
*G+21*X3;E�b,@Q-Q6!;E��`!3>?3#'.'##'.'##3�
	>A`;0
>><
1;aC�./����64��05�A<���353#5#<d<<d>H�HP���##53�d<<>BH�H����&KKX��
�&KNX���&KQX��e�&K'KXN���]�&K'KXQ�U����'".5#575.#"#4>323#32671*G,LM?'<6X5[:Mj��/%*
4
HA8*#`=6��ABS'91{D��1/C	3��2�R"&'532654.'.54632&54>323#3267#".5#575.#".#"�8Q [/C<954J(oZ&$.L.GX��/%*
4*G,LM
.!+.
"J'69<24I&t
P+$  (8,DJ 6G$90{D��1/C	HA8*#`4(.F#)9+NP�|K
>;#"�|"t�Vj�)KCR'A:A��K�
2#.+5W�t"F)�k'RCA:A�_�
.#"#>322g9<93]H8f2~!D<`��
32673#"&'2g9<93]G9f2�!C=���$!5$��AA���!5��AA���Y!!����NA�w���
3;#".�wF)�jV�tB@;A'S������
+53267�"t�Wk�)BBS'A;@���������� ���
32673#"&'2g9<93]H8f2!C=���$�C!5$�׽AA���C!5�׽AA���Y�C!!����N�A�f��	#"543!</9^�34A���-	5!632#�9)/"�A&2)�E��+;JV^bfosw}����53#%53#5!53353353#53#53#"&5463272+"'5326=3%32654&#"2654+#53#5332654&##53#53533!5353!53!53353)�^֔5�d�;�:��55��66G>BB>>BB>}575.e	
=6�� "##" G+�T66j55�B$�55��6666^x_5������;�Q�6^^6�^666666�㄄��BQQBCPPL ) "',��2��1.�-33--33?���6K�򄄄���_55_�555555)�d��+	467>54&#">32332654&#"��5�6�!++\P*X"(!>!%!gt())(��6�6�d#=1CJW#7'�##%b�Bv�#"&'532>54&#"#33>32�%&/LZHQ!ZG?K%q�l�L1+�[P5`?�N�\.tz� d`��a�B��[��o�%"&=3326=4&#"#33>32b��ZYY\RLZHQ!ZG?K%q�:w
�w

W`gQ�[P5`?Jb\.tz�JwE.Zb�	#/>73#"&'332673"&546323"&54632�W410FI70*#6	9Q��L,
5pF7!7Fw.Zb�	#/#.'5#"&'332672#"&54632#"&546�14QDFI70*#6	���,5
b7FF7!�4Z\�	
%#5>73!52#"&54632#"&546*41W2��7��5,�GGf4Z\�	
%.'535!"&546323"&54632�4W�(��A5
,eGG���a���&1|���a���&3|���$~�&&����a�$��&*����(�$*�&.�/��Z�$��&:��a��33aZ�6��a��_�&���Z#�&�x2�����*�&���������8�&���������8�&����������&�������&�l�n���
"&>73#"&546323"&546323V9i2:;(��Z�G"
21}���6��\��&��4���Z�P��&�����
��&�E���G��#'>54&#"56323�.#6$+%
%<B�Z&)5U4,�R�6����*�&��������#W&�������<�$��&����<�$��&������G�&���������HF�&��������B�"&'532>53�#55-ZfL
2-��gb������&�D���a��N�&1��a��:�&3���#���&Q|��U�"&S|�.�$�!.9"&5467#"&546?54&#"'>32#'#3267326=-52I`~�[:5*L!#`4b^@+--dM7+DZ�2,=MRPW C4BV^��L*F)-8�83-*KN0��7�$"&J��O�$&"&5467"#"&5332653#'#3267D52"abYwYEXH
$//-�2,<]f_���d^��G!$@!-8J�<33JX<���E&
��k�����&
��P���� &
��O�����&
��O��B��&
�������&
��U��J��<&#�����
�&
��X���$�<&
�����0�&
��Q��<"&'532653w,)).)WV		I34��p_V�����&#
��>13#'#.'3�c�`9�<�8�>�£��0.���&%
����&%�F$��"&%�;$���&%
����&%
�����&%�M$���$>&%�8��U&%�v$���&%&
��
����&%�+$���<%##!#3#3!#3[�Ea�������'r���<G�F�G������&0
�]J�<2+2654+254&+�sh<18As_ŸA8�Yj}@Dc<JG4@	
=?RS<�-,V���e,2�.���D"3267#".54>32.FZb]^%E!?YYv;C}VXKB�wegu
MJ�XV�K$G��.���&3
�-��.���"&3�g$��.��D&3|���.���"&3�i$��.����&3
��J<+324&+32������[fbSH�%��<��hi�V<35#5332#5254&+3#J>>������fbShh�A����I�hi�A���J"&9�P$��<:J�<!#3#3!JH����<G�F�G��J�&=
����J�&=�-$��H�"&=� $��J�"&=�"$��J��&=
����J�&=��$��D�&=
����J��&=�4$��J�$�<&=�{J�<	!#3##JG���W<G�G�/��C%#"&54>32&#"3275#53+g9��D�aeLFNejhd=-����V�L#G!zbmp�G��/��&H�}$��/��"&H�r$/�#C'%#"&54>32&#"3275#53#5>73+g9��D�aeLFNejhd=-��!0W��V�L#G!zbmp�G��7859��/���&H
��J<#!#3!5W��WW<����<��S<##!##5353!5335!SFW��WFFWWF�����[��?XXXX�__��J"&M�]$%�<357'53%AA�AA2�44�I2��%*&P
������-&P��$����="&P��$�� �&P
��k��%�&P�9$�����&P
��q��%�b�<&P[#����&�&P��$��%�$�<&P�����J&P��$���b�<"'532653,.)WV�
D34-��_V�����b#"&[��$J�<3>?3##JX
�d��e�@X<��"���3�J�#�<3>?3###5>73JX
�d��e�@X!0W<��"���3�F7859J�<!!����<�
I<��J�&_
��qJ�<!!#5>73����Y0
W<�
I<
6957J�#�<!!#5>73�����!0W<�
I<�~7859��J�<&_�����<
%!5'737���3%XWv&�II�";7�M:c�J�<#4>7####33�R�L�Oy��<��g1*
� �
+2��<�0�J$<###33.5$k��Ok!<���Q ��<�2N#H��J$&f
�-��J$"&f�p$J�#$<###33.5#5>73$k��Ok!_!0W<���Q ��<�2N#H�~7859J�b$<%#"'53267##33.53$WM-(*��Oi#O_V
D),�Q ��<�HO#1��J$&f�Y$0��HE#".54>3232654&#"H:v[Zx;;xZ[v:�DU[\TXX[UX�JJ�XW�JJ�Wdxxdhsw��0��H&l
�1��0��H&l�x$��0��H"&l�n$��0��H�&l
���0��H&l
���0��H"&l��$��0��H�&l��$0��HT!*#"''7.54>327&#"4&'326H:v[U:"0#(';xZ,I&/'&%�D�)<[Wb�%=]UX�J#1"1'sIW�J48&qG.LUxc/H��y��0��H&t
�3��0��H&l�]$0���C%2!#3#3!#".54>"3267.7.5�����-Vu;;uZXVUX%
%CG�G�GJ�XW�IIufhu�J�<
2+#2654&+�kjplGW�AK>AK<XTUb�<��.=55�J�<+#3322654&+�plGWWNkj�AK>AK"Ubk<nX�.=55�0�xHE#'#".54>3232654&#"HMU�vlZx;;xZ[v:�FT[]SWX[Ud���J�XW�JJ�WdyxehsxJ�<2#'##2654&+��6;�c�gW�;BDAG<�7P���<��047-���J�&{
����J�"&{�2$J�#�<!2#'##2654&+#5>73��6;�c�gW�;BDAG�!0W<�7P���<��047-��7859)���D'%#"&'532654&'.54>32.#"�nb7P"M\5BCAHN4Y8/S#$G 1;;)-F'�J\P$-*++FE2E$E*'$(;��)���&
����)���"&�$��)��D&|p��)���"&� $)�#�D'3%#"&'532654&'.54>32.#"#5>73�nb7P"M\5BCAHN4Y8/S#$G 1;;)-F'�!0W�J\P$-*++FE2E$E*'$(;��7859E��,D$#"'532654&+57.#"#4632}^QmbT6B%7F?Yn
6*>CXrfWb=TGJ[L0-248~ $MJ��hhsKF�<###5��W�<K��K�<#3##5#535#5��ssWss�<K�C��C�K���"&��$����<&�|q�#�<###5#5>73��W�!0W<K��K�~7859E��<%#"&5332653xpmuXIFDGX�gushi��IMMGg��E��&�
� ��E��&��g$��E��"&��\$��E���&�
���E��&�
�
��E��"&���$��E���&��n$E�$<$3267#"&5467#"&5332653p-52.!(muXIFDGXF-,t-82,$Cshi��IMMGg��p:;E��E��U&���$��E��&��L$�<33>73��`|
|a�<��#28v���<.'#3>73>73#�
b_�VV	
[U]	
]U�_k ;9��<��#PC(Y��"H,*
n�����&�
�x���"&���$����&�
�\���&�
�b�<7#373#��b��`��a��d��'�����<#53�Y�`��<����b�����&�
�����"&��$����&�
�����&�
���<	35!5!!/�����78�I9�FI���&�
�����"&��!$���&���$2J��!!2�6�Z��a������&�l�n�����B���a���6��&�*#".5467.54>732654&h�O?2cj�qGp?dY!8!O���)M1QIMRO� 0w^r|5hKZv$1#4B(
��
,O@HVWMJV��a�����a������f��&�B�>����&�l�n�?z�3?;��T��"&'532653X"
#(:B	.)>��>;��"��#����Ih#�2��/�#���'�S�#�
���X#����0�S�����(������� �]����%��������"�T�#��6��#
".54632'254#"$Pj4{vPi5yw���J
G~S~�F|S�J���dj6#!#467'736Y	 c+�J>'K
I;�,�#)57>54&#"'>32!��6�4?;>)T).3oA\g#C1�?G�%1/ ,4 "=,%UI-D<"e�S�#(#"&'532654&+532>54&#"'632ƋSN�v?Y'$^4SYg[=>0O0H53I+(V~\uw� 
RJdoOJD>:J9048<E[�X(#
%##5!533'467#3(mV��IZm�����:�5�,M)
1 ��;�S2#"&'532654&#"'!!6k��}7_#/]/Q_\RD!(j��?ghqrPHLGG		UN�8���'462.#"3>32#".2654&#&8��,.� Y4dnxlQm6�CKGB(H,%D/��I��./thm�P��URFO&=#,U6�]�!5!s����nM8�}1��
�(42#"&54>7.54>">54&32654&'^x%>%,H+ks|)D'4I8`<7G#<$4GF�JMIMPVBE�XS+@15F1Zie[1H4UB7K(G52%2#>625�(4EE73E!I/�T#(%#"&'53267##"&54>32'"32>54.��03t�VAam7gFq��DJGC(F-"C���I��2.qgHk<�RVLHM!<(-R37���
#"&54>3232654&#"0hVys/hUxv�~CQPEEPQCfs�Xít�W���������#�467'73#�L.�IV�+4>;��6&��357>54&#"'>32!&�6J&F84O)/*mDdt.R7�iI�6TQ0;=$ ;#1eY8b_6�P-���*#"&'532654&+532654&#"'>32�PDVT:y_8`,-h0`Ui_EFX[F<:R(,&qHpm#HU
XG>a6RKBC;KJ=49"<,d(�
!5!533#467#!k��P[hhU
 ��K�#O��4M2��?���2#"&'532654&#"'!!>n��~7a!$g/OaV]H,f��:�ndoSKOFK
QP�7��
�,4>32.#"3>32#".2654&#"7G�e3-E\5R@]r{hDnA�?NEE/F'"D1M�yHK.Ph;#1qhp�D��QUDP'< +U7��3!5!d%���zPD�z:���(5"&54>7.54>32>54&#"2654&/)s|)D'4I8`=^x%>%,H+j4GF:7G#<!IMRDBEJ
e[1H4UB7K(XS+@15F1Zi�>62552%2#��E74EI74E2���,#"&'532>7##"&54>32'"32>54.G�e5'1F[6SA\q9fEDn@�>OCF0F'"D�M�yHK
.Oi:"1qgKl:E��RTDO&< +T81���
#"&54>32&#"4'3260hVys/hUxv�~"\QC)��?3PEfs�Xít�W��,$e��7+��::�����J���`��%��}�`��3�v�`����A�w�`��
U���`����@���`����L���`��C���`����E���`����I���`��J���~��%��}�~��3�v�~��A�w�~��
U���~��@���~��L���~��C���~��E���~��I���~���B
74673#.<:N;99:M;;�e�FJ�`^�LD����B
7#>54&'3�<;L:77;M>9�d�CL�^`�JI��>26=467"&=4&',2I^+1',*)1+^I5)�$%z>=A$s.21/v#@:Bv'$� >%#5>=4675.=4&'523 )4K],0*))*1+\L2+�$'vB:@#v/1/1s#A>>z&#<��B3#3#<�kk�B>��=��B#53#53�k��k>�==5���<3#4632#"&9aC<�m}6�u��#"&54632#3�aC����
��ZD'7467>54&#"'>32#4632#"&t+#!	4):E)L.PZ21!D�,=$!&'#=JC4E!*+}�ld�'#"&54632327#"&5467>=3,#!	4):E(M.O[21!D��,<%!&'#=JC5D!*+��5��f<'���*��'57�ff;��a��!��*��?'7hh;��K��"�
�]���#2.#"3##"&'53265#57546� 4)+)��WP# *(iiX�D.>ED�*aOI,;�)AhN�R�5!!5!		#!'!�����6��=��K���9�U�N�77���?���w�:>N��!#533�����BnB�-�PN��	!'#5353�����BĪB���PN��	!5#533�����B��B��K�PN��	!#5353�����BbB��P1�373��?�C�� �P��373#��=��BB�� �P���3733��?�sB���n�P��	3753#��>��BB���?�P���	3773#5��>��BB���z��P���	3753#��>��BB���0�P@"1�3'753��,�CĻ1���P&��!'773���-��BU��/���P"��!'73���,�nBƸ2���P(��	!#'7353���0��Bɳ/���P&��	!5'73���(�kBsK�4����P&��!73���.:B^.��2�P1�3573��<�Cw!�x��P��!73���<��B�x �x��P��!'73���>�hB���iS�P��	!753���>��B���},W�P��	!5#733���;��B���7�P��	!773���<��B$��I�1�P1�373��8�C$i#��
�P��!73���4��B/��i&��
�P#��!73���:1B�!��&�P��	!7753���4��BƤi%���P��	!5'73���:�yB��]"��y�P'��	!#733���8��BFG#��(�P1�3'3#S?�CC��P���3'3##V?��Bs��Pn��3'3#K=�BB��� �P���	3'53#'X>ԠBB�����P�z��	!5'3���>�Br���w��P��	3'3#'X>ԠBB�����P�N��3533#N��BB�Bn�P�-N��	35353#N��BB�Bf�P��vN��	35373#5N��BB�B��P��N��	35353#N��BB�Bq��P��1�3'53#N<�CCRF�P���3'73#U>נBBh���PSi��3'3#N<ܠBB� �x�P���	3'353##N;զBBw��P���	3'3#5P>�BB�����Pa-��	3'3#'N<٣BB��$�P1�"1�3'73#5N,�CC1��P�"��3'73#N,éBBn2��P��&��!''73���-ȠB��/��U�P&��	3'753#N(ȠBBk4�Ks�P��(��	!5#'733���0��B��/��P&��!'3���.hB2��.^�P1�3'3#N8�CC#i$�P
#��3'3#]:kBB!��P&��3'3#N4ҢBB�&i��/�P
��	3'753#P:˭BBy"]���P�y��	3'3#5'N4ҢBB�%i��P��'��	3'33##_8��BB�#e(�PF%1�3'73�.�CS�3��P'��!#'73���/��n�0��P.��!'73���'ɗB7q2��*�P%��	!''753���-ɠB���2����P%��	!5'73���)ɠBr�x3��s��P%��	!'73���*ɠB9�3����P1�373��>�Cv�G�P��373#��=��BBu�C�P���3733��>�mBv��n�P��	3753#��=��BBu�9�?�P���	3773#5��>��BBv��z��P���	3753#��>��BBv�!0�P@N��!#5373�}æ�BTnB��PN��!#533����vB�B���PN��	!5#533�����B�OB����PN��	!'#533�����B-�B�#�P1�3573��:�C������P��!73���9��B�|�#����P��!'73���:�mB���xcS�P��	!753���9��B���"��@X�P��	!5#733���:��B�����P��	!773���:��B2������P%1�3'73��.�C+�1�&�P'��!'73���/��B/���0�$�P%��!'73���-�jB2�1�� �P%��	!'7753���/��B͠�/����P%��!573���.;B�i1����P"��	!#'733�Ȥ0��BF�-�(�P"1�3'3�<�C���P#��!#'3�t�;��n�9�P"��!'3���<̠B�� �P"��	!''53���<ɣB���p�P"��	!5'3���<̠BM����[��P"��	!''3���<̠B*���P'1�3'73��-�C�3�S�P%��3'73#��-}�BB�2s9�P�'��3'733��-��B�3�n�P%��	3'753#��-��BB�2y�^�P�%��	3'773#5��-��BB�2����P�%��	3'73#��-��BB�2�8�P1�3'53�:�C���N�P?��!'73�m�:��BSc��T��P��!'3���9ҠB���#��U��P?��	!#'353�r�:��B�c��P��	!5'3���9ҠBXo��#�����P��	!''3���9ҠB%��#���PN��!#533�kե�B��B�PN��!'#533�����B�B�N�PN��	!#5353�uˣ�B��B0��PN��	!#5373�����BB�B��P%1�3'73�.�CB�1��PG��!'73�j�,��B ɰ0�2�PG��!'73��l.��By1���1�PG��!'53���,GB��0ip�PG��	!5''73��},��B���0����PG��	!#'733���,��BF�0�(�P31�3'3�6�C2�%6�P%��!#'3���6��n��$6�P%��!'3���6җB�$6�*�P%��	!''53���6ɠB���$6���P%��	!5'3���6ɠBr��$6�s��P%��	!'3���6ɠB#�$6���P1�373��7�Cd%��0�P��373#��7��BBd%��P���3733��7�{Bd%��n�P��	3753#��6��BBd%��r�P�����	773#5��7��BBe%����P���	373#��6��BBd%���P%1�3'753�.�Cٜ2�x�P%��!'3���&iBY��26�P%��!'73��p2��BЊ-�\�P"��	!#'7353���0��B�-ň�P%��	!5'73���*ɠB�9�3�����P%��	!''73���-ɠB9��2���P-1�35'73�-�C��2���P*��!'73���.��B���.|��P*��!73���.6BX.��T�P*��	!'753���.��B���.�5v�P*��	!5#'733���0��B��-��P+��	!'773���-��B/��2��&�PN��!#533�qϧ�B �B(�PN��!#533�����BFB� �PN��	!#53753�vʯ�B�|B���PN��	!5'#533�����B��B��P)��WC*4"&5467.54632673#'>54&#"267'�YfA=##UIEQA7�'U
-rm?&VA)0)!$)!)C�'4?UI;K!!>(;DA=1F�3L4]#o?"%e0"#$ 0���/,.4����4632#"&74632#"&���Q���"&54632��tu^.'53@;q+.u8877�r�#5>73�29:#"j9947�u!
>73#7>73#�9g686�9g696�P,83P,83~r�#&'#5>7\@#:;487;,+
P&/:=,58~r�#.'53673�-*
h@#;86::67 P&
4<,�p��
#"&'33267�SGIQ86,)7�BKJC-+�Y�7#"&546324&#"326�A24@@42A7""!"�4<<33<<3    nt��#".#"#>323267�>,'$"4>.'$#�BB!#AC""�z��!!�0���E�$�3267#"&54>7Y-52+0""t-82,6, 5������:s��U�����������$�&������"&'53265#53533#&  *KKXKKH�G#1KG��G��KU����"&546;33#'26=#"(<K@I+XKK%;*&#�B47C��HBIH$+���pa7"&'532653	

9/�+t��-3������7��p�#3p99`BU�:;33267#"&=#�,
#1@5�1�#E=J?�a##5#5353�19119�*��*������a7"&546;33#'26=#"'1*/9112'
�' !(B��+<)+
����H8&������P�P�&���
�3#5#53533#�XKKXKK�G��G7pa#p9a��B ?33'3# q�rnC\C��1��o�?"&'7326737>7#A(.
��y%?]47
iB�	5#/�� JC*MA<���p�"&'532653	9.�+t��-3������&&N��
����&&7&O��N���
����&&A&���N���
����'&�&O��'{���Ny��
����'&�&���'{���Ny��
����'&�&O��'B���Ne��
����'&�&���'B���Ne��
����'&-'OS�$&���N���
����'&.'�/�#&���N���a���&-N���
����'-�&O��N{��
����'-�&���N���
��t�'-Y&O��'{���N>��
��t�'-Y&���'{���N>��
��`�'-E&O��'B���N*��
��`�'-E&���'B���N*��
����'-�'OS�$&���Nq��
����'-�'�/�#&���Nr�����&dN���
��q�&dn&O��N;��
��{�&dx&���NE��
��4�'d1&O��'{���N���
��4�'d1&���'{���N���
�� �'d&O��'B���N���
�� �'d&���'B���N���
��g�'dd'OS�$&���N1��
��h�'de'�/�#&���N2����B���
Q�'��O���
[�'������
�'�Y&O��{����
�'�Y&���{����
�'�E&O��B����
�'�E&���B����
G�'��'OS�$���
H�'��'�/�#���
s�'��{���
_�'��B��7��Y�'EQ'>54&#"5>32'53#"&'33267"&546323733267#"&'#'26=4&#"�(
,3+�_j0QHJK62.'9v`zwg8T
F %1S*SECVIG�8#)#0�
�<JI=)'�����.%I�^@	$.$.I_gdjke�7��Y�'EQ'>54&#"5>32573#"&'33267"&546323733267#"&'#'26=4&#"�(
,3+@0j_AQHJK62.'9v`zwg8T
F %1S*SECVIG�8#)#0�
�<IH=)'�����.%I�^@	$.$.I_gdjke�7��Y�'EQ.54632.#"'53#"&'33267"&546323733267#"&'#'26=4&#"�+4+
�_j0	QHJK62.'9v`zwg8T
F %1S*SECVIG�0#)#8�
�<JI=)'�����.%I�^@	$.$.I_gdjke�7��Y�'EQ.54632.#"573#"&'33267"&546323733267#"&'#'26=4&#"�+4+
10j_JQHJK62.'9v`zwg8T
F %1S*SECVIG�0#)#8�
�<JH>*'�����.%I�^@	$.$.I_gdjke���7��Yi&l&�f&OH^{�^��7��Yi&l&�f&Oh^B
^��7��Yi&l&�f&�0^{�^��7��Yi&l&�f&�O^B^����6�&t�����6�&t�����6�&t������6�&t����6�'7'>54&#"5>32'53#"&'33267"&533267#(
,3+�_j0QHJK62.'9OHX* 
&�8#)#0�
�<JI=)'�UK��{1#G��?�'7'>54&#"5>32573#"&'33267"&533267H(
,3+@0j_AQHJK62.'9OHX* 
&�8#)#0�
�<IH=)'�UK��{1#G���6�'7.54632.#"'53#"&'33267"&533267%+4+
�_j0	QHJK62.'9OHX* 
&�0#)#8�
�<JI=)'�UK��{1#G��6�'7.54632.#"573#"&'33267"&533267C+4+
10j_JQHJK62.'9OHX* 
&�0#)#8�
�<JH>*'�UK��{1#G�����6i&t&��&O�^{L^����6i&t&��&O�^Bm^�����6i&t&��&��^{X^����9i&t&��&��^Bw^��O���&��R��O���&��R��O���&��RO���'@'>54&#"5>32'53#"&'33267".5332654&'3�(
,3+�_j0QHJK62.'9xCQ)X53HOX��8#)#0�
�<JI=)'�#AY6/��9M(rxFn<;oJ��O���'@'>54&#"5>32573#"&'33267".5332654&'3�(
,3+@0j_AQHJK62.'9xCQ)X53HOX��8#)#0�
�<IH=)'�#AY6/��9M(rxFn<;oJ��O���'@.54632.#"'53#"&'33267".5332654&'3�+4+
�_j0	QHJK62.'9xCQ)X53HOX��0#)#8�
�<JI=)'�#AY6/��9M(rxFn<;oJ��O���'@.54632.#"573#"&'33267".5332654&'3�+4+
10j_JQHJK62.'9xCQ)X53HOX��0#)#8�
�<JH>*'�#AY6/��9M(rxFn<;oJ����O��i&�&�q&OS^{�^��O��i&�&�q&Os^B^��O��i&�&�q&�;^{^��O��i&�&�q&�Z^B^A��6�$1".54>32">54.4&'326;;]@"/O_09Z5!4u<p>=4"as;!3v1+*rL%F5SN
"S�p|�V!%K;'_+*�Do@�=ye	*8<(/�18K 	hm)a7��"*5.54>74632>54&#":JuD7';-0/N.UI>X0K{H3R0<0"��:xb6hV2zFIW(4[TAoEk�A�/3eP^O,*��>%��J�<2J}<3!#J3�<G�>353%!.'�c�l.w	3��6IC0.��J�<=���<���J<M0��HE".54>32'2654&#"'53=Zx;;xZ[v::v\\TXX[UU�J�XW�JJ�WX�JKxdhswddx�NN��%�<P��J�<]�>13#.'�c�`�
�>���0.�u��J�<e��J$<f-�<5!5!5!Bc������GG�FF��GG��0��HElJ<3!#!J�W��<���
��J�<x���<
��<357'5!#*'26;����?��&G(�;��<H��I���<����<�0�<%!5.54>753'>54&'5Of9/rdWer.:fMWaKR�[OK_H*BM%9c@77>d:'MB(H�7SCFVWEDR���<�Ep<!5.=3332>=3/m}W%B,W,B%Wuu�vw��?J]��J?��wv�0TD%353.54>323#5>54.#"0w.E?yUXx>C/w�-6&N><N%6,I!pYO{GGzOZp!ID)FM2:Z44Z:2LG)D��%�<P�� �&P
��k�� �&P
��k���<�����&�
������&�
����0��HEl��0TD
���>%��J�<=��J<MJ�@�<"&'53267#3>?3=c#T3EY�@XX
�d��(�	=3B3�<��"������>%��>%��>%��>%��>%��>%��>%��>%��>%��>%��>%��>%��>%���>&%<����>&%<����>&%<����>&%<����>&%<����>&%<����>&%<����>&%<����>&%<����>&%<����>&%<����>&%<���J�<=��J�<=��J�<=��J�<=��J�<=��J�<=��J�<=��J�<=��J<M��J<M��J<M��J<M��J<M��J<M��J<M��J<M��J<M��J<M��J<M��J�<&M<���J�<&M<���J�<&M<���J�<&M<���J�<&M<���J�<&M<���J�<&M<���J�<&M<���J�<&M<���J�<&M<���J�<&M<���J�<&M<���%�<P��%�<P��%�<P��%�<P��%�<P��%�<P��%�<P��%�<P��%�<P��%�<P��%�<P��%�<P��%�<P�� �&P
��k�� �&P
��k�� �&P
��k��0��HEl��0��HEl��0��HEl��0��HEl��0��HEl��0��HEl��0��HEl��0��HEl��J�<x��J�<x���<����<����<����<����<����<����<����<����<����<����<����<����<�����&�
������&�
������&�
����0TD
���0TD
���0TD
���0TD
���0TD
���0TD
���0TD
���0TD
���0TD
���0TD
���0TD
���0�TD&
�<���0�TD&
�<���0�TD&
�<���0�TD&
�<���0�TD&
�<���0�TD&
�<���0�TD&
�<���0�TD&
�<���0�TD&
�<���0�TD&
�<���0�TD&
�<���0�TD&
�<���>&%P��>&%P��>&%P��>&%P��>&%P��>&%P��>&%P��>&%P��>&%P��>&%P��>&%P��>&%P��JV<&MPW��JV<&MPW��JV<&MPW��JV<&MPW��JV<&MPW��JV<&MPW��JV<&MPW��JV<&MPW��JV<&MPW��JV<&MPW��JV<&MPW��JV<&MPW��0�D&
�P���0�D&
�P���0�D&
�P���0�D&
�P���0�D&
�P���0�D&
�P���0�D&
�P���0�D&
�P���0�D&
�P���0�D&
�P���0�D&
�P���0�D&
�P���%,&PBU$�� �&P
��k��e,&PC�s$���,&�B�$����&�
�����,&�C�$��0��H,&lB�$��0T,&
�B$��,&%B�$��J�,&=B�$��J,&MB�$��/&%O�$��/&%�p$��/&%&O7${�$��/&%&�${�$��/&%&O@$B�$��/&%&�$B�$���&%'O�$�*��&%&�x$�+���,&%{b$��,&%B�$��'&%�+H���&%
�����&%
�����>&%<����,&%&{b$<����,&%'B�$<����/&%'O�$<����/&%&�p$<����/&%&O7$'{�$<����/&%&�$'{�$<����/&%&O@$'B�$<����/&%&�$'B�$<�����&%'O�$'�*�<�����&%&�x$'�+�<����'&%&�+H<���J�/&=O�$��J�/&=�W$��G�/&=&O${�$��F�/&=&��${�$��J�/&=&O'$B�$��J�/&=&�$B�$��J�,&={I$��J�,&=B�$��J/&MO�$��J/&M��$��J/&M&OY${�$��J/&M&�5${�$��J/&M&Ob$B$��J/&M&�?$B$��J�&M'O�$�L�J�&M'��$�M�J,&M{�$��J,&MB�$��J'&M�MH��J�<&M<���J�,&M'{�$<���J�,&M'B�$<���J�/&M'O�$<���J�/&M'��$<���J�/&M&OY$'{�$<���J�/&M&�5$'{�$<���J�/&M&Ob$'B$<���J�/&M&�?$'B$<���J��&M'O�$'�L�<���J��&M'��$'�M�<���J�'&M&�MH<���%�/&PO%$��%�/&P��$����"/&P&O�${`$����"/&P&��${`$����,/&P&O�$Bj$����,/&P&��$Bj$����I�&P&O#$��������J�&P&�$�������,&P{�$��%,&PBU$����J'&P��H����3�&P
��l����)�&P
��t����,&Py�$$��e,&PC�s$����I�&P'����l�p$��0��H/&lO�$��0��H/&l��$��0��H/&l&Oi${
$��0��H/&l&�E${
$��0��H/&l&Or$B$��0��H/&l&�O$B$��0��H,&l{�$��0��H,&lB�$��J�/&xO�$��J�/&x�\$���/&�O�$���/&��S$���/&�&O${�$���/&�&��${�$���/&�&O#$B�$���/&�&�$B�$����&�&O~$�
�����&�&�[$�����,&�{E$���,&�B�$���'&��H����&�
������&�
�����,&�y�$���,&�C�$����&�'�
�l�$��0T/&
�O�$��0T/&
���$��0T/&
�&On${$��0T/&
�&�J${$��0T/&
�&Ow$B$��0T/&
�&�T$B$��0T�&
�'O�$�a�0T�&
�'��$�b�0T,&
�{�$��0T,&
�B$��0T'&
��bH��0�TD&
�<���0�T,&
�'{�$<���0�T,&
�'B$<���0�T/&
�'O�$<���0�T/&
�'��$<���0�T/&
�&On$'{$<���0�T/&
�&�J$'{$<���0�T/&
�&Ow$'B$<���0�T/&
�&�T$'B$<���0�T�&
�'O�$'�a�<���0�T�&
�'��$'�b�<���0�T'&
�&�bH<���>&%P��,&%&{b$P��,&%'B�$P��/&%'O�$P��/&%&�p$P��/&%&O7$'{�$P��/&%&�$'{�$P��/&%&O@$'B�$P��/&%&�$'B�$P���&%'O�$'�*�P���&%&�x$'�+�P��'&%&�+HP��JV<&MPW��JV,&M'{�$PW��JV,&M'B�$PW��JV/&M'O�$PW��JV/&M'��$PW��JV/&M&OY$'{�$PW��JV/&M&�5$'{�$PW��JV/&M&Ob$'B$PW��JV/&M&�?$'B$PW��JV�&M'O�$'�L�PW��JV�&M'��$'�M�PW��JV'&M&�MHPW��0�D&
�P���0�,&
�'{�$P���0�,&
�'B$P���0�/&
�'O�$P���0�/&
�'��$P���0�/&
�&On$'{$P���0�/&
�&�J$'{$P���0�/&
�&Ow$'B$P���0�/&
�&�T$'B$P���0��&
�'O�$'�a�P���0��&
�'��$'�b�P���0�'&
�&�bHP���H��&���( ��B��)��O��)[�O��L�����L��&��{���)d�&O�B����L��&��B���(��'Oq�$��(~��'�M�#���^�y���^�C��(w�y'��l���( ��{��( ��B��(^�����)c�&O�{����(^�B���^�C��)[�O��)[�O��L[����)[c&O{���L[�&�{���)[d&OB���L[�&�B���([��&Oq���([��&�M����^�y���^�C��(w�y'��l���(^�{��(^�B��(���$��Q���/�����&�'#�2_����x&�2_����x&�2_���6�n&������6��&�'�������@3n&�0���@n&�0����cn&�A���B�n&����H8y&�'"��@���H8�&�'#3�@���H8n&��@���H8�&�'$3�@����'y&�'2_"������&�'#�2_�����&�'$�2_�����&�'%�2_���^on&=A���:�n&>����+y&�'"�2_����]n&������@�n&�S�����n&������@�n&�l���6n&��������n&�$~���@n&�2���@Xn&�A�����n&����1Hn&��.���x&������n&�L��*��vx&i����Gn&������In&	����.���x&
E�����dn&�����O�n&q����;n&����(���x&�V����Qn&�����n&3?##"&'.'.54632>54&'#5!2675#4632#"&KQ:'*]!)o=68cL"%	����'@"�
4��!  !'��
	
4n161dX$";0GG�	�.*>��""!!�"n7C%>54&#".5467.5467>;5!5!##"6324632#"&A$.:AEIGF6[c;)���"h�	/6EW)DA��!  !E$ &+90:G55G|M&;4"(
VGG�*C&:L�""!!.���xEP##"&'327&54632.'#".5467.5463232675#5!654&#"oQG22S /24/(),&:1
;Z2E1,.QL>Y.)+.O&Y��*!K"("*'��E
5$) 4 
))=)G+7IG.5H:;0B�GG1!51:$"���n*%4&'7!5!5!###"&'.'.54632>U`h�)�hQ�".
<69-J"!2b)6F+(-�/JCnGG��rN03B

F< #.�g�.54632.#"�YB 6&(*g#L$CC
B	-#!?$�.����73'�.�(�;uӥ��&��wn,#>;#"#5#".54632.#"3267!5!j�6'@3.4QG2/S2nX91:@=(,E��j'�G��$&M9P^I4/53*#G�n%@%#"&'.54632>54'#5!!3267'#".54632.#"3267�)bIl�b"%����	F>F�c3X/N./K+`O6%077*#:J*k}#-";4)GG.R`TZ!K'F.IQE,,+)�(n#".546;5#5!�7&"('��*<�GGv�n)3267#"&5467.547#5!#632&"#"�8,6I) bIM`(.
4n�+"#19
*'+<4QC4F*GG!%(F)�����n&�*�v�n!!#"&54675!23#"3267��f�5I0Mc�%$ :G:&3InG��'VG3HF1/++-�nF5!2>54&#".54632#"&5467.54632.#"632&"#"�]M~K.)"5:!QJHD.K-2]�Rab*/ZI4
#X,"#^>'GG�?lE/>$ 3?S47H'M;:nX4S@-A+<@EA 	FF(&PKn!!#"'#".'732654&'7!K��<�)$,)C(5`X*G.d: )=-nG�P-.>=�w��"(,N@��WnI%".5467>;5!5!##"6323267#"'.'.5463232654&:/@93`��u�	.7*#='%3
4)	SK?"!9h-;E+FM1�L3(
VGG�!

	E	AK

F9 ),!$v<n(!!>3223267+#"&'732654&#"*��AC^	(+
>M"U�3E)YB7>9).nG�D?
M27jr]P4+.(����$n&�*�����Xn&�*�����Qn&�*�����An&�*���n7"'.=#5!#'27>=#�],O�=B14�
!�;F6�GG�*:G ,+��'.��|n!!467>;#".k��-RDlY==JG6.O/nG��#8G+1[94(PV.��x%.546323267#"&'>54&#"�ALI5)K0PJ:33L%%aCUw_M/% Q�	=:89#H8I^##( C-a]G6233	����in&*�*g�x4%#"&5467.54632'>54&#"632&"#"3267�%[GM_/;R?5G(=	(1#299,5J�,QC2G8<O8-/)'
,# 'F)&)(,��n!!#".5463!u���6&"nG�6*<G��n3267#"&'.=#5!�
2)G$(S;(AOB'�)0(D(I@�GG�n&#>;#"#5#"&'.=#5!3267r�5(@4.4Q@,(@Or�.(*?'�G���G9�GG�70#v�n%!!#".54632.#">7%3267'��`�%`A8Y2yb('2�
��C0!�)nG��,*K3V\E�43�.�x)-%#".546;54&'&#".5463233#L*$!
+/9KYL4%:Ƀ44�%!',i/2G=@;5D>tGtG��n3##".546;5#5!#���*$"~l�AG%!',�GG��n%#"&'>54&'#5!#3267�&]AZo><{W�o=12L�-yd
/,0GG46l$11+��n5!#"&'73267�  P,B}H8f76G('GG��$%C$��,n(!!&#"'67.#".54>32632��2.M1(++R:6:`81I%,I!;WnG�?=.#.$&EK142[]55C8?�n.=!!#"&'#".54>32>3232654&#"326?67.#"�%�+O66P'I-/M.-P36O' G.0M.��!=#*?7%&5��7%&6!<#*@nG��5U1,#-"+U=8T/+$/ ,Ta!#7>@455>5541!$8v�n!!#".54632.#"3267��j�%_<6T1s^
'%
0>F?-4KnG��,*K3V\I6230-(���x,7"&54632>54&#".54632.'z#/$'2@;/98^]GC/R3E=-T@3S%�#VA8C#FS:3@+U@Eu!'_,,H]��n#"&'.=#5!#267�%(VB(AO��92�
E+I@�GG���)0���n/267#"&'.'.54632>54&'#5!#q24*]!)o=68cL"%	��z
4BH
4n161dX$";0GG.*>�r�n/%#".5467.5467>;5!5!##">;�9<&GF6[c ;)E���E�	F8��
2:G55G|M%:4#(
VGG���Kn*6B!!".'732654&'7!#"'"&546323"&54632"&54632K��65`X*G.d: )=-�'#+)C��qnG�T:�p}�%(G@GJ),:yY��n!7"&'>54&'#5!#'.'3267�Zo><{W�
� U#
1,=1"4�yd
/,0GG�W!�
$411
.��x=H#"&'327&54632.'#".5467.546323267%654&#":+2S /24/(),&:1
;Z2E1,.QL>Y.),"7��*!K"("*9
5$) 4 
))=)G+7IG.5H:;0B
t!51:$"���n&!!4&'7!#"&'.'.54632>��OU`Z�".
<69-J"!2b)6F+(-nG��/JCGN03B

F< #.����wn&��������n&�������(n&��������n&��������n&��������n&������@�n&�l����Kn&�1O���6Wn&�������<n&�$~����$n&�������Xn&�������Qn&�������Wn&��������n&�����1|n&���.���x&�������in&'*��L��*���x&�i�����n&��������n&��������n&��������n&�����.��x&�E������n&��������n&������O,n&�q���w�n&��7�����n&�����(���x&��V�����n&������n/;267#"&'.'.54632>54&'#5!#4632#"&q24*]!)o=68cL"%	��z
4��!  !BH
4n161dX$";0GG.*>��""!!��n/;%#".5467.5467>;5!5!##">;4632#"&�9<&GF6[c ;)E���E�	F8��g!  !�
2:G55G|M%:4#(
VGG��""!!��	n8?.54632.#"3267!5!!>32'>54&#"#5.�6JnX91:@=(,E��	��9#AR#H '#7Q�5JQFP^I4/53*#GG�SM.h2) T)/.%#������AnC7.'.54632>54&'#5!##5267!75#".54632.#"�H�L"%	�AhQ���#:��
F>F�e�@(/K+`O6%077.Dfa#-";0GG��S�^.R`TXS$'F.IQE,,+)��Bn'%##".546;5#5!##5�/�7&"BhQC�Z��*<�GG��z��]n-'7.5467.547#5!##5'3267!632&"#"v/�>G(.
4]gQ�8,4M��+"#19AT	I;4F*GG�٩d*'+#!%(F(����n&�� ���n$'7.54675!23#"3267!5!##5�/�:G�%# :G:&2G�/�hP
AUM<3HF1/+++#GG�٧����n&��L��n%'%5#"'#"&'732654&'7!5!5!##5�0
�&)C(O�?G.b<!(=-0��hQC��A'(5~�qt$>@nGG��{��@n;Q%".5467>;5!5!##5'75#"'.'.5463232654&7267##"632:/@93`��@gQ�:�(D, 	SK?"!9h-;E+FM1�*D,��	.7)#D�L3(
VGG��p�8�
AK

F9 ),!$.�!
��n0'%5+#"&'732654&#"'>32232675!5!##5|0
:#
=N"U�3E)YB7>9).AC]
#4��hQC�U

27is\Q4,.'H
D?�GG��{���n&������Xn&�����Pn&�� ���An&�����n''%##"'.=#5!##5%27>=#L0
�B/],O�gQ��4�
!C�Y�*:;F6�GG��{^ ,+��'.6n7'7.#"'>325!5!##5/�*=*9)"J,(@>%��6gQAC�6-J90�GG���.���x-?.'>54&#".546323267#5!##5i�Je_M/% QALI5)K0PJ:34J R
gQ��)a\TG6233	F	=:89#H8J\$#( GG�ٴ���n3?.5467>;5!5!##"3:7&54632.'*�,L/!`;���1:GOR*+-!C&��M	-N;,?_GG�. 5E#1 #	3#""F�*��vx<'7.5467.54632'>54&#"632&"#"3267#53##5�/�<G/;R?5G(=	(1#299,5J>�hQ+AX
J92G8<O8-/)'
,# 'F)&)(+2GG�ٜ��9n'%5##".5463!5!5!##5�0
�6&"�9gQC�\6*<�GG��{��Gn?&'.=#5!##5#3267-�6 OGhQ��2�
1'H5d	 I@�GG���4�)0&��n%0?&'.=#5!!>32'>54&#"#53267,�0O��:#AR#H (#59Q��E()@5e
"F9�GG�SM.h2) T)/.I����3�70"��In )?.54632.#"67!5!##53267'9�FXyb('2��oIgQ��C0!�))S
TDV\E�'GG�٨�743�.���x5'%5##".546;54&'&#".5463235#5!##580
�*$!
+/9KYL4%:Ƀ;gQC�,%!',i/2G=@;5D>t�GG��{��dn'%5##".546;5#5!##5#3�0
�*$"~dgQ��C�,%!',�GG��{����Sn'7.'>54&'#5!##5%3267#]/�K\
><{ShQ��=11L�AaqZ
/,0GG�ٲ{11*46l������n&
�����n0%'75.#"'67.#".54>326325!5!##5�9�
2.M1(++R:6:`81I%,I!;W
���gQ4<�h?=.#.$&EK142[]55C8GG�١���n&����;n#'7.54632.#"3267!5!##5h/�FWs^
'%
0>F?-4K�};hPASUEV\I6230-#GG�٢�x$07'7.''>7.546325#5!##5>54&#"�0�:^&+[/0)M%5)UIBV-#,x6LhQ��".!%("/(C�9D+&H'5LI;+E�GG���66" "��Qn?&'.=#5!##5#3267-�8"OQhQ��<���22�
5c"I@�GG����4��/�)0���n)3%'75#"&'.'.54632>54&'#5!##5'35!�0��4C,)o=68cL"%	��hQ���

kD}4n161dX$";0GG��ן�./#�^:n<?&#".5467.5467>;5!5!##">32'>54'��&LCQLH6ah;)��~:g�	6 S^(F�Sv99 @M35J�P!C4#(
VGG�6R**K-)?�9n'?.#"#".54675#5!!632'>54'��6*,)7&$29��*)tf"H"���K%5!
�GG�gY0j4)!X+
���n%1=I'75#"'#"&'732654&'7!5!5!##54632#"&'4632#"&4632#"&�>��!%)C(O�?G.b<!(=-0��hQ���\3��@&(6�qt$>@VGG��q"D��Sn%'7.'>54&'#5!##5#'.'3267]/�K\
><{ShQ�
��
1,=1$5AaqZ
/,0GG�ٲu�E
$411.��xIT%75#"&'327&54632.'#".5467.5463232675#5!##5654&#"��(a2/]!02/+(),&:0	6S.E1,.QL>Y.(/@_+�>hQk��*!K"("*>�h
5%) 4 
))=)G+7IG.5H:;0A"|GG��x�!51:$"���n.%4&'7!5!5!##5'75#"&'.'.54632>U`����gQm:��".
<69-J"!2b)6F+(-�/JCnGG�ٱ|9�ZN03B

F< #.���j	n&�*����An&������@Bn&�����j]n&�*��n0<HO%".5467>;5!5!##"632#"&'73254&74632#"&4632#"&73'f:.A>1]�o���	.7Jbbcb�;=9wKt1k�E!  !�(�;u��L4(
VGG�!
KADVXF1DAN"$s  !!��""!!n��&�����j�n&�R*��nHT[%2>54&#".54675!5!##"&5467.54632.#"632&"#"4632#"&73'(M~K.)"5:!QJ75�9˴3C2]�Rab*/ZI4
#X,"#^>�!  !Y�(�;u�F?lE/>$ 3?S40D	FGGJ
TH:nX4S@-A+<@EA 	FF(&�""!!Q��&�����^n&�1���6@n&������Zn&�$�n ,3##"3267#".54>;5!5!4632#"&73'�70@7,G*6L*,c5Em>Do?���"!  !�(�;u�'�&A0?J4bFAY.�G�i""!!c��&���Xn$07##"&54>;5!5!2654&'#"4632#"&73'X�PXBnBq�Do>��X��G^:9#J/!_�!  !<�(�;u�'�qIFW)qgC[.�G��=C0M7'FD{""!!Y��&���Pn0<C%".5467>;5!5!##"632#"&'73254&4632#"&73'f:/@>1]�oPn�	.7Jbbcb�;=9wKt1��!  !�(�;u��L3(
VGG�!
KACWXF1DAN##�""!!n��&���An%0<C!".54>75!5!##"&54>32'>54&#"4632#"&73'3NuBHvE��A�'@E @:!A11?sf7F##,��!  !4�(�;u�7gIF_1iGG�<):J(*"<%%<"FW�%!-)"+�""!!b��&�����O�n&�����6n&�A��.�j�x&�\*���Pn&���*�[vx&�?���@9n&����jGn&*���jn&*���jIn&*��.�@�x&����@dn&*���jSn&!*����n!-4%.'.54632>54&'#5!#4632#"&73'�6;hP
"%'$
��h,L1-w��!  !@�(�;u�*61dX$"<'-GG#:7L54o7""!!���&�����O�n&q���n&'��Z���j;n&
*���r�x&2���jQn&	*���n)3?%'75#"&'.'.54632>54&'#5!##5'35!4632#"&�0��4C,)o=68cL"%	��hQ���

��!  !kD}4n161dX$";0GG��ן�./#��""!!�:n<H?&#".5467.5467>;5!5!##">32'>54'4632#"&��&LCQLH6ah;)��~:g�	6 S^(F��!  !Sv99 @M35J�P!C4#(
VGG�6R**K-)?��""!!��wn.'7.54632.#"3267!5!#>;#"#5]/�6JnX91:@=(,E��j�6'@3.4QAJQFP^I4/53*#GG�G�����n$?7.'.54632>54&'#5!!74632.#"3267#".�H�L"%	����
F>F�e��pM`O6%077*#:N./K+.Dfa#-";0GG.R`TXR?��IQE,,+)A'F���n#".546;5#5!'%�7&"_�/
)'��*<�GG��C�:���n)'7.5467.547#5!#632&"#"3267v/�>G(.
4n�+"#198,6I)AT	I;4F*GG!%(F('*'+>���v�n&�� �����n&�� ���n!!!'7.54675!23#"3267��f�/�:G�%$ :G:&2J(&nG��AUM<3HF1/++->����n&��L���n!!!#"'#"&'732654&'7!'%m��^�&)C(O�?G.b<!(=-0�0
)nG�A'(5~�qt$>@�/C�:���nIM%".5467>;5!5!!#"6323267#"'.'.5463232654&7:/@93`�����	.7)#D,*D,(D, 	SK?"!9h-;E+FM1��+��L3(
VGG�!
I
AK

F9 ),!$��4����n(,!!>3223267+#"&'732654&#"%h���AC]
#5:#
=N"U�3E)YB7>9).q
)��nGj
D?T

27is\Q4,.'���:����vn&�������n&������vXn&������Xn&�����vPn&�� ����Pn&�� ���vAn&������An&����Rn##"'.=#5!27>=#'%�B/],O���4�
!n0
)'�*:;F6�GG�� ,+��'.�C�:A�n!!7.#"'>32��tP�*>)9)"J,(BD*��nG�]�6-J@9C�.���x%'7.'>54&#".546323267�/�Je_M/% QALI5)K0PJ:34K%Aa\TG6233	F	=:89#H8J\$#( G����in&�*�*���x4'7.5467.54632'>54&#"632&"#"3267�/�<G/;R?5G(=	(1#299,5J%+AX
J92G8<O8-/)'
,# 'F)&)(,F���n!!#".5463!'%��q�6&"�0
)nG�6*<G��C�:���n?&'.=#5!#3267-�6 OB�
1)G%��5d	 I@�GG�)0(A����n'?&'.=#5!#>;#"#53267,�0Or�5(@4.4Q��E()@5e
"F9�GG�G����3�70"���n'!!7.54632.#">73267'��`9�FXyb('2�
'��C0!�)nG�S
TDV\E�A
�743�.��>x)-1%#".546;54&'&#".5463233#'%L*$!
+/9KYL4%:Ƀ��Z0
)�%!',i/2G=@;5D>tGtG��C�:���n3##".546;5#5!#'%���*$"~��0
)AG%!',�GG��C�:���n'7.'>54&'#5!#3267]/�K\
><{W�o=12L&AaqZ
/,0GG46l$11+E����n&�����3n(,!!&#"'67.#".54>32632'7��2.M1(++R:6:`81I%,I!;W�9�#nG�?=.#.$&EK142[]55C8��<�;����n&������n!!'7.54632.#"3267��jh/�FWs^
'%
0>F?-4K+nG��ASUEV\I6230-D((x ,7'7.''>7.5463253>54&#"�0�:^&+[/0)M%5)UIBV-#,x6L[��!%("/"(C�9D+&H'5LI;+EM>GG�6" "#6���n'7.'.=#5!#3267�%N��/�-O��.
22D3�BcI@�GG,�)0��Sn+/#"&'.'.54632>54&'#5!!;'7+�4C,)o=68cL"%	�:��

 ՚0�(/4n161dX$";0GG./#��D}:�����n&*���n!-9E!!"&'732654&'7!#"'7%"&546323"&54632"&54632m��6O�?G.b<!(=-0�!%)CN�,����qnG�l�qt$>@G@&(6x�9�2Y���n!?.'>54&'#5!#.'3267.�K\
><{W�
�
���
1,=1"4)aqZ
/,0GG�T�r
$411
.��xx=ALP267#"&'327&54632.'#".5467.546323#654&#"7�A^+(a2/]!02/+(),&:0	6S.E1,.QL>Y.(/Y����*!K"("*
�.�l#[
5%) 4 
))=)G+7IG.5H:;0AG1!51:$"�*�<���Kn&*!!4&'7!#"&'.'.54632>72��U`��".
<69-J"!2b)6F+(-p�(�nG��/JCGN03B

F< #.S�=����jwn&6*�����n&7�����@�n&8����j�n&9*�v�n0<HO]%".5467>;5!5!##"632#"&'73254&74632#"&4632#"&73'.#"'632f:.A>1]�o���	.7Jbbcb�;=9wKt1k�E!  !�(�;u��2eD	CeQ!�L4(
VGG�!
KADVXF1DAN"$s  !!��""!!i��&���?<H/H%���j�n&<R*��nFRY5!2>54&#".54632#"&5467.54632.#"632&"#"4632#"&73'�]M~K.)"5:!QJHD.K-2]�Rab*/ZI4
#X,"#^>�!  !Y�(�;u�'GG�?lE/>$ 3?S47H'M;:nX4S@-A+<@EA 	FF(&�""!!Q��&�����^�n&>1���6�n&?�����Z�n&@$�v5n ,3A##"3267#".54>;5!5!4632#"&73'.#"'632�70@7,G*6L*,c5Em>Do?���"!  !�(�;u��2eD	CeQ!'�&A0?J4bFAY.�G�i""!!c��&���?<H/H%�vZn$07E##"&54>;5!5!2654&'#"4632#"&73'.#"'632X�PXBnBq�Do>��X��G^:9#J/!_�!  !<�(�;u��2eD	CeQ!'�qIFW)qgC[.�G��=C0M7'FD{""!!Y��&���?<H/H%�vPn0<CQ%".5467>;5!5!##"632#"&'73254&4632#"&73'.#"'632f:/@>1]�oPn�	.7Jbbcb�;=9wKt1��!  !�(�;u��2eD	CeQ!�L3(
VGG�!
KACWXF1DAN##��""!!i��&���?<H/H%�vPn%0<CQ!".54>75!5!##"&54>32'>54&#"4632#"&73'.#"'6323NuBHvE��A�'@E @:!A11?sf7F##,��!  !4�(�;u��2eD	CeQ!7gIF_1iGG�<):J(*"<%%<"FW�%!-)"+�""!!b��&���?<H/H%���ORn&I�����n&JA��.�j�x&K\*�����n&�'*����*�[�x&M?���@�n&N����j�n&O*���j�n&P*���j�n&Q*��.�@>x&R����@�n&S*���j�n&T!*���O3n&Vq����n&�'��Z���j�n&X*���r(x&Y2���j�n&Z	*��Sn+/;#"&'.'.54632>54&'#5!!;'74632#"&+�4C,)o=68cL"%	�:��

 ՚0�(��!  !/4n161dX$";0GG./#��D}:�""!!���n<JV?&#".5467.5467>;5!5!##">32'>54'632.#"4632#"&��&LCQLH6ah;)��~:g�	6 S^(F�UDeP!92eD	��!  !Sv99 @M35J�P!C4#(
VGG�6R**K-)?�;3V3)PKB""!!��"nO2'>54&#"632#"&'73254&#"'.5467.5467>;5!5!##"6GW'>; '9AMCBCKS]Va�<='FO1j1+YL;)���"h�	/,(@$5DC!"&6(3:"M?=N\L+0>J! (6f<#93"(
VGG���"nN"&'73254&#"'.5467.5467>;5!5!##"632'>54&#"632-a�<='FO1j1+YM;)���"h�	
/9GW'r 7EJD87KS]��\L+0>J! 1`@/0 (
VGG�
$:!^$A *%,2M?=N��8nQ2'>54&#".#"3267#"&5467.5467.5467>;5!5!##"6GW'>; '9AMCBDAdN =7oJ331*9KU-)@7;)���"h�	/,(@$5DC!"&6(3:"9V1'SW& &
F

O?'@,X3#93"(
VGG���BnQ2'>54&#"232.#"3267#"&547.5467.5467>;5!5!##"6GW'r 7EJD54KpU"=7oJ331*9KUC:4;)���"h�	
/,$:!^$A *%,07[5'SW& &
F

O?I&(S4/0 (
VGG�
�^5nF23267#"&5467.#".5467.5467>;5!5!##"6EW)<62);!KT:<>=FHI>6a_;)���5{�	.,*C&!
( !	EK;'L(&:5&DI/5M�H'@4#(
VGG��XnX23267#"'3267#"&547&54>7&#".5467.5467>;5!5!##"6EW)=51 *;!
,%*9!OP64){FHI>6a_;)���5{�	.,*C&!
$
A

A
K8$@1'N:5&DI/5M�H'@4#(
VGG���"nO[2'>54&#">32#"&'732654&#"'.5467.5467>;5!5!##"64632#"&GW'r 7EJD<;#LTZIHp6./V3.35&0gY;)���"h�	
/�!  !,$:!^$A *%.3N>=N/20*%%! 
6eD/0 (
VGG�
��""!!��}nR^2'>54&#"632.#"3267#"&5467.5467.5467>;5!5!##"64632#"&GW'r 7EJD;9KoV"=7oJ342*9KTLB;)���"h�	
/�!  !,$:!^$A *%-27[5'SW& &
F

O?.-[;/0 (
VGG�
��!!""�5nFR23267#"&5467.#".5467.5467>;5!5!##"64632#"&EW)<62);!KT:<>=FHI>6a_;)���5{�	.�!  !,*C&!
( !	EK;'L(&:5&DI/5M�H'@4#(
VGG��""!!�XnXd23267#"'3267#"&547&54>7&#".5467.5467>;5!5!##"64632#"&EW)=51 *;!
,%*9!OP64){FHI>6a_;)���5{�	.�!  !,*C&!
$
A

A
K8$@1'N:5&DI/5M�H'@4#(
VGG��""!!��:nT?&#"632#"&'73254&#"'.5467.5467>;5!5!##">32'>54'λ&EEOB<KT]Va�<>'FN2i0 *
gU;)��~:g�	:"P_*F�pg21 55"M?=N\L+0>J! ;kD;2 (
VGG�		3M('G*&;u��:nS?&#"632#"&'73254&#"'.5467.5467>;5!5!##"632'>54'ڪ&@NF9O"!KT]Va�<>'FN2i0 *RR;)��:h�	3>Qa*A��^1)#G'M?=N\L+0>J! *MD30(
VGG�.L.E$(+
v��QnV?&#"32.#"3267#"&547.5467.5467>;5!5!##">32'>54'λ&EEO?9KpU"=7oJ252+9KTDD:;)��~:g�	:"P_*F�pg21 34 8[5'SX' &
F

O?J&.[9;2 (
VGG�		3M('G*&;u��QnV?&#"632.#"3267#"&547.5467.5467>;5!5!##"632'>54'ڪ&@NF3G
KpU"=7oJ342+9KT;12;)��:h�	3>Qa*A��^1)!D%8[5'SX' &
F

O?D'!<830(
VGG�.L.E$(+
v��An3'>54&#".'.54632>54&'#5!!632!H!"#"H+-w@6;hP
"%'$
�A��5J(.W%)E##*!.4o161dX$"<'-GG#:
I��!nD%"&545.'.'.54632>54&'#5!!>32.#"3267�<P%<#-w@6;hP
"%'$
�!�A1=]H?.X7+(*,�N?#4o161dX$"<'-GG#:%$7]9"VU+%C
��6nL67.'#".5467>;5!5!##"3:7&54632#"&'73254&#"('+*UG+!`;���1:GOR*+-
38]Va�<='FO1j1+ /O9,?_GG�. 5E#1 #	'G3=N\L+0>J! ���nO#"&546323.'#".5467>;5!5!##"3:7&54632.#"3267�9KU\O
*UG+!`;���1:GOR*+-
Ig(>6pI342*�

O?9P/O9,?_GG�. 5E#1 #	*g>'SX' &
��;nF"&5467&'#".5467>;5!5!##"3:7&546323267�KU8-*UG+!`;���1:GOR*+-%(1.2 /"C��O?/B& /O9,?_GG�. 5E#1 #	;#
)!"E
��4nK?.5467>;5!5!##"3:7&54632#"&'732654&#"'67.'*�,L/!`;���1:GOR*+-	47QJSz7=5A.).&"$!��M	-N;,?_GG�. 5E#1 #	%	J6=NWQ+)?#'#"A
"����nN?.5467>;5!5!##"3:7&54632.#"3267#"&546323.'*�,L/!`;���1:GOR*+-
Ig(>6pI342*9KU\O
��M	-N;,?_GG�. 5E#1 #	*g>'SX' &
F

O?9P 
���;nE?.5467>;5!5!##"3:7&546323267#"&5467&'*�,L/!`;���1:GOR*+-%(1.2 /"C)KU8-��M	-N;,?_GG�. 5E#1 #	;#
)!"E
O?/B& ���An3?'>54&#".'.54632>54&'#5!!6324632#"&!H!"#"H+-w@6;hP
"%'$
�A��5J�.!  !(.W%)E##*!.4o161dX$"<'-GG#:
I��""!!��!nDP%"&545.'.'.54632>54&'#5!!>32.#"32674632#"&�<P%<#-w@6;hP
"%'$
�!�A1=]H?.X7+(*,�1!  !�N?#4o161dX$"<'-GG#:%$7]9"VU+%C
{""!!��6nLX>7.'#".5467>;5!5!##"3:7&54632#"&'732654&#"%4632#"&F
*UG+!`;���1:GOR*+-	77QJWy4=/V='0)$!��    !/O9,?_GG�. 5E#1 #	&	L4=N\L+IB%%! J""""���nO[#"&546323.'#".5467>;5!5!##"3:7&54632.#"3267%4632#"&�9KU\O
*UG+!`;���1:GOR*+-
Ig(>6pI342*��!  !�

O?9P/O9,?_GG�. 5E#1 #	*g>'SX' &
�""!!����;n&��L�|Pn0<U%".5467>;5!5!##"632#"&'73254&4632#"&"&'732654&#"'632f:/@>1]�oPn�	.7Jbbcb�;=9wKt1�!  !I[�878d@/.-(17ENU�L3(
VGG�!
KACWXF1DAN##����L>0<9CF84G�{Pn0<V%".5467>;5!5!##"632#"&'73254&4632#"&"&54632.#"3267f:/@>1]�oPn�	.7Jbbcb�;=9wKt1�!  !FOVFEgP">1dA..-(4�L3(
VGG�!
KACWXF1DAN##����F84G2Q0'HN	D�|An%0<U!".54>75!5!##"&54>32'>54&#"4632#"&"&'732654&#"'6323NuBHvE��A�'@E @:!A11?sf7F##,=!  !I[�878d@/.-(17ENU7gIF_1iGG�<):J(*"<%%<"FW�%!-)"+���L>0<9CF84G�{An%0<V!".54>75!5!##"&54>32'>54&#"4632#"&"&54632.#"32673NuBHvE��A�'@E @:!A11?sf7F##,=!  !FOVFEgP">1dA..-(47gIF_1iGG�<):J(*"<%%<"FW�%!-)"+���F84G2Q0'HN	D�Gg���"&546323#�BQQ��g��4632.#"#.53�XB!5&(*P{Q�CC
B	-#!<$#Lo���g��$4632.#"#.5374632#"&�XB!5&(*P{Q��CC
B	-#!<$#Lo��m���&�����&�����&����$�&�Q,�$0�-#53.#"#.54632>32.#"13##YYW=7(*PTK,>B, 6&(*
ngQ'Ghc1+"7#@"AS  
B	-#>$G���$0�-9#53.#"#.54632>32.#"13##"&54632YYW=7(*PTK,>B, 6&(*
ngQ�'Ghc1+"7#@"AS  
B	-#>$G��������E����g.� .'#"&'73267632.#"�:$E^"F9-1/;(? 6&(*g:Y^FDIC
B	-#!?$��g.� ,.'#"&'73267632.#"'4632#"&�:$E^"F9-1/;(? 6&(*g:Y^FDIC
B	-#!?$m�%g���!.#"#".'732632'4632#"&�(&

#9/B%+ %8+     gH4;7,,"VM�""""�%g1�$.#"#".'732632>32.#"�(&

#9/B%+ 
P5!4&)*gH4;7,,..
B	-$+F�%g1�$0.#"#".'732632>32.#"7"&54632�(&

#9/B%+ 
P5!4&)*?gH4;7,,..
B	-$+F;�gg���.#"'632'4632#"&�)2""'46O?!!!!gO[&	I3{k�""""�gg3�.#"'632632.#"�)2""'41<e 6&(*gO[&	I"+M
B	-#
/@�gg3�).#"'632632.#"7"&54632�)2""'41<e 6&(*@gO[&	I"+M
B	-#
/@;�Tg���).#"'>327.#"'632'4632#"&�-+*2-F&, '46O?!!!!g(%	E
+&49E3{k�""""�Tg3�,.#"'>327.#"'632632.#"�-+*2-F&, '4.Be 6&(*g(%	E
+&49E#*M
B	-#0=�Tg3�,8.#"'>327.#"'632632.#"7"&54632�-+*2-F&, '4.Be 6&(*@g(%	E
+&49E#*M
B	-#0=;����*�&������1�&�����1�&����(�&����(4�&����(4�&����j�&����j6�&����j6�&����W�&����W6�&����W6�&�����&J����G�&L����G�&M�g�.54632.#"'4632#"&�YB 6&(*g#L$CC
B	-#!?$m���&���������&������H8�&������H8�&��3���H8�&��3��'�&������&������&������&�����+�&������&������&������&�J������&�'��2_���6��&�'�������H8�&�'�@�����H8�&�'�3�@���H8�&�'�@�3����'�&�'2_�������&�'��2_�����&�'2_�������&�'2_������+�&�'2_����in/.54675!5!5!!>32'>54&#"##"8.N/���-i��9$@S"I'#68Qe15IG(PU1.
H�GG�SM.h2) T)/.I��H+1[9���xZb%"&547#"#5#".54632.#"3267!5!#>;632>54&#".54632.'##5!�#/.4QG2/S2nX91:@=(,E��2n6'1'2@;/98^]GC/R3E=-T@3S%�QY�#��$&M9P^I4/53*#GG�=VA8C#FS:3@+U@Eu!'_,,H]j��'GG���xEks%"'#".54632.#"3267>32>54&#".54632.'#".'.54632>54'#5!!327##5!�C'/K+`O6%077*-#'2@;/98^]GC/R3E=-T@3S%#)nDD��I"%�W��E=K�]qR�QY�
'F.IQE,,+)
VA8C#FS:3@+U@Eu!'_,,H]} ,l_&";4)GG0QaYV3���'GG�e�nBN".547>;5!5!##">32##"'#".546;5.'73265474632#"&fD*;#:3_�s���(
=PZL!,+4!",N >>�=<5:F*.
>GG�?8 4��	�'8Y7%1D32f    �V�n>JQ".546;5&'732654#".547>;5!5!##">32#5#4632#"&35#"'�4%P:>>�=<5_D*;#:3_�s���(
=PZL�0��!)42�'7{%B1D32F*.
>GG�?80��s"    ��\�n@S_%".5467>;5!5!##5#"&'>54'.#!"632#"&'73254&267!32%4632#"&f:/@>1]�o�hQB&Ov9B

%&�~	.7Jbbcb�;=9wKt1�&>���6=17:���L3(
VGG��cac'"
!
KACWXF1DAN##TpV/1<+�  !!�n">!##5#"&54675!23#"3267!#"&54675!23#"3267�hPH2Mc�$ :G:&2G���5G.Mc�$:G:&2FnG�٥VG3HF1/+++#��&VG3HF1/+++anHc!##"&5467.54632.#"632&"#"32>54&#".54675!#"&54675!23#"3267a�3C2]�Rab*/ZI4
#X,"#^>4M~K.)"5:!QJ75���$Y?Mc�%$ :G:&/DnGJ
TH:nX4S@-A+<@EA 	FF(&?lE/>$ 3?S40D	F��1VG3HF1/++(���an&����nZo%2>54&#".54675!5!##5#"&'>54'.+"'#"&5467.54632.#"632&"#"323267(M~K.)"5:!QJ75�9�hQC*Hv:B%&0' 2]�Rab*/ZI4
#X,"#^>#�6=17:$)CF?lE/>$ 3?S40D	FGG��gac'"'1:nX4S@-A+<@EA 	FF(&�J/1<+!g�n;!###"'#".'#"'#".'732654&'7332654&'7!5!�hQ�)$,)C(3[U)A)$,)C(5`X*G.d: )=-�/g; )=-��nG��rP-.>8kP-.>=�w��"(,N@��"(,N@nn0K5!##"632#"&'73254&#".5467>;5".'732654&'7!#"'n�	.7Jbbcb�;=9wKt1.:/@>1]��5`X*G.d: )=-~)$,)C'GG�!
KACWXF1DAN##L3(
V�)=�w��"(,N@GP-.>�nG%"&'732654&#"'>323267&'732654&'7!5!5!###"'#"&'#"#,U�3E)YB7>9).AC]	"F.d: *=-���hQ�(#-)D(=l239
=Mvjr]P4+.(HC?#'��"(,N@nGG��rP-.>Qb27�n<%"&54>;5!5!##"3267#"3267#"&54>;5"m�>kA
���K!EXC2S)9K!EXC2S)(l3m�>kA
�YX9I#AGG�	
#7+Ks	
#7+KYX9I#"�vHnV%"&54>;5!5!##"3267#"3267.#"3267#"&5467.54>;5"jz:gC���`9OD;U&1>`9OD;U&J&;XD=7oJ331+9MS87Q[:gC�ON4B ;GG�
/%Ko
/$K
	3I)#GL	F
G8*?
MC4B �-n1A".54>;5.54>;5!5!##"3267'2654&'#"Go??lCjz>kA
��-�K!EXC1T)A#LX@mEGZ88)%?W�%N=8I$#YV9I#AGG�	
#7+K
0[::I!G-0#:&12�vDnIV%"&54>;5!5!##"3267.#"3267#"&5467.54>;254&'#"jz:gC��-�`9OD;U&8GLX_N8TA=7oJ331+9MS76V\?j@�882F)�ON4B ;GG�
/%K-R4DD	
4F(#GL	F
G8)?
	KE3C!�M0	!Sn2E5!##5#"&'>54'.+#"3267#".54>;5267!32gQD)Iu:B%&�70@7,G*6L*,c5Em>Do?�*C�'�6<17:'GG��hac'"-&A0?J4bFAY.��c hV/1<+�Xn'7G".54>;5.54>;5!5!#2654&'#"2654&'#"'Hq@@nCGn?@nC��X�M[^JM[AnGI\:9*&AZMI\:9*&AZ�%N=8I$#%N<8I$BGGH[:GL/[::I!�-0#:&12��-0#:&12wn)<K#5#"&'>54'.+"&'#"&54>;5!5!267!!22654&'#"QC)Iu:A
&&�#6<BnBq�Do>��w��)B��5=08:�G^:9#J/!_'��_ac'!!b;FW)qgC[.�GG�Z q^/1<*9=C0M7'FD�PnJU"&5467.'732654#".547>;5!5!##">32#"&54632'23254#"Nw�seL�3>>�=<5_D*;#:3c�oPn�(
=PZ=A>(P<:KMFEkov=*'�ZXJJ	F;1D32F*.
>GG�?8-C?	$-1)=>':Gn<'�PnR".547&'732654#".547>;5!5!##">32#"'>32#"&'732654fC+;R:><�=<5_C+;#;2c�oPn�'<O[_f%#;O[_fZ�<><�=<51F+$%D1E4 4F+/
@GG�@99K@99KIF1E4 4�vfnn%".547&'732654#".5467>;5!5!##">32#"'">32.#"3267#"&5467.'732654fI(8O::AD<5_I(8:1g�oPn�!APZ^g"!APZHM7QA=7pI342*9MR>=Gy.:AD<5	
B( #@2B1+
B(!

4GG{	
:56D
:5/A3F'#GL	F
G8,B
C22B1+jn@S%".5467>;5!5!##5#"&'>54'.#!"632#"&'73254&267!32f:/@>1]�ojhQC*Hv:B%&��	.7Jbbcb�;=9wKt1�)C�1�6=17:�L3(
VGG��gac'"!
KACWXF1DAN##T!gV/1<+�jn@SZ%".5467>;5!5!##5#"&'>54'.#!"632#"&'73254&267!3273'f:/@>1]�ojhQC*Hv:B%&��	.7Jbbcb�;=9wKt1�)C�1�6=17:�E�(�;u��L3(
VGG��gac'"!
KACWXF1DAN##T!gV/1<+�љ�&���An@KV"&54>35.54>35!5!##"&54632#"&5463223254#"23254#"7x�BuLu�BuL��A�>)P<;KMFDEE>)P<;KMFDjov=*'v=*'�YY9I#!YX9I#@GG�	$-1)=>'/Am	$-1)=>':G�<'�o<'an5HS!".54>75!5!##5#"&'>54'.#!"&54>32%267!32%>54&#"3NuBHvE��ahPD)Iu:A
&&��@E @:!A11?s�)C���5=17:�17F##,7gIF_1iGG��U`d'!
<):J(*"<%%<"FWw!zh.2;*%!-)"+���n.54675!5!5!###"U.N/���hQt15JF(PV0-H�GG��H*1[9���n!!#".54675��t15JF6.N/�nG�G*1[94(PV0-H���x-1G#5#"&'>54&#".546323267#5!%!!467>;#".SQP7Uw_M/% QALI5)K0PJ:34J R
�F8��-RDlY==JG6.O/'�ٴa]G6233	F	=:89#H8J\$#( GGGG��#8G+1[94(PV���x,08N%"&54632>54&#".54632.'!)##5!467>;#".�#/$'2@;/98^]GC/R3E=-T@3S%�<<��{QY�JRDlY==JG6.O/�#VA8C#FS:3@+U@Eu!'_,,H]�G��'GG��#8G+1[94(PV�Z�n9Y"&5467.54632>7>;5!5!##"3:7&54632''3267#".'&#"632&"#"
Z`&+YI!`;�ٞ1:G/PS
*+-"UF9Tj�9+P�3	2fM
[,"

),�L:/:&9?%7_GG�?5E#1 %
��)G,�##\KC9<D!�Zn>".546;5.5467>;5!5!##"3:7&54632'#"&'�2"&1!`;���1:GPT
*+-"TEU	+�&6WP<,?_GG�. 5E#1 %
����Z�n5AJ".5467&5467>;5!5!##"3:7.54632'7"&'>7327'�9V0G="`;�k��1;GPT	*+-"TE:*pY1f%�/
�� 5�})G.=R%-,?_GG�. 5E	#1 %
��0G�!�3$")��Z%n]#"&'.546?'.#"3267#"&54>32767.5467>;5!5!##"3:7&54632's*"!''/@(963$�4_;!`;��%�1:GPT
*+-"TEJ;

T)+?<0(189X9*SD,?_GG�. 5E#1 %
���Zzn3C".5467&5467>;5!5!##"3:7&54632''32>7#"&'�8T/B9"_;�uz�1:G.OT
*+-"TE9*m�C+,H;
0c%'4})G.;O%0,?_GG�>5E#1 %
��0G�1)&: 	0�ZynCVf".5467&5467>;5!5!##5#"&'>54'.+"3:7&54632'%267!3232>7#"&'�8T/B9"_;�uyhQC*Hv:B%&�:G.OT
*+-"TE9*m)C��6=17:�_C+,H;
0c%'4})G.;O%0,?_GG��^ac'">5E#1 %
��0G�!p_/1<+_1)&: 	0�Z&nf'#"&5467.54632'654&#"632&"#"3267#".5467>;5!5!##"3:7.54632�E9TjAZ`>OM<2C;&&; (
(-9+Q�4
*WI-!`<��&�0;GPT
)*-!��)G,L:#F=9K5+.&* $
D!##]J/N9,?_GG�. 5E	#1 %
�Z$nv�.+"3:7.54632'#"&5467.54632'654&#"632&"#"3267#".5467>;5!5!##5#"&'>54267!32|%&�;GPT
)*-!UE9TjAZ`>OM<2C;&&; (
(-9+Q�4
*WI-!`<��$hQC*Hv:B])C��6=17:o. 5E	#1 %
��)G,L:#F=9K5+.&* $
D!##]J/N9,?_GG��^ac'"�!p_/1<+�W*nG.'#".547.5467>;5!5!##"632&#"3:7.54632�&
<h@!(:*q��*��	2C*"@C.G#*+-
 �!F$K:;+=)(
VGG�$I7++,	#1 #3#�W�nWj.'#".547.5467>;5!5!##5#"&'>54'.#!"632&#"3:7.54632267!32�&
<h@!(:*q���hQC*Hv:B%&��	2C*"@C.G#*+-
 �)C�Vl6=17:�!F$K:;+=)(
VGG��gac'"$I7++,	#1 #3#!gV/1<+���n&8".546;4&+"&'&5467>;5!5!##5##";23d*$"$ B+3&@-;���hQ��-) S).�&,) 5!-VGG��a$!(�
1&���n:"&547.5467>;5!5!##5##"632.#"3267Uf&:*D���hQE_���	0?
&#
,>>;0Ov4PC6(<((
VGG��q4$2�#
H-)*(TD��7n7"&547.5467>;5!5!##"632.#"3267Uf&:*D�����	0?
&#
,>>;0Pv448J]PC6(<((
VGG�#
H-)*(WD<93!.n<7".5463!67>;5!5!##"632#"&'73254&#".'#�6&">1]��.n�	.7Jbbcb�;=9wKt1.:-?��*<
VGG�!
KACWXF1DAN##H06���.n&	���x;?#".5463!>54&#".546323267#5!##5#"&'!!�6&"N@/% QALI5)K0PJ:34J R
gQP7Os����*6*<(D1233	F	=:89#H8J\$#( GG�ٴUQDG���x;?#".5463!>54&#".546323267#5!##5'7.'!!�6&"N@/% QALI5)K0PJ:34J R
gQ��/�Ea����*6*<(D1233	F	=:89#H8J\$#( GG�ٴ�AaPIDG�x<@N##5#"&5467.54632'>54&#"632&"#"3267#53)!#".5463!�hQI:M_/;R?5G(=	(1#299,5J>��j/���6&"'�ٖQC2G8<O8-/)'
,# 'F)&)(+2GG�6*<Ggx48F%#"&5467.54632'>54&#"632&"#"3267!!#".5463!%[GM_/;R?5G(=	(1#299,5J�#/���6&"�,QC2G8<O8-/)'
,# 'F)&)(,yG�6*<G���x<@N'7.5467.54632'>54&#"632&"#"3267#53##5!!#".5463!�/�<G/;R?5G(=	(1#299,5J>�hQ�#/���6&"+AX
J92G8<O8-/)'
,# 'F)&)(+2GG�ٜ�G�6*<Gvn)7".5463!5!5!###"&'.546?675#�6&"[�CvhQ�'%!!TUI��)<�GG��p"EF16���x;?G#".5463!632>54&#".54632.'#"&547!)##5!�6&"'2@;/98^]GC/R3E=-T@3S%#/��K���QY*6*<>VA8C#FS:3@+U@Eu!'_,,H]#DG��'GGGn!.3"&'.546?>7&'.=#5!##52675#�/+%,OGhQ�
$F'G�
$

HB�GG���s+	%߇)0
�x<@W_##5#"&5467.54632'>54&#"632&"#"3267#53)!#".54632.#"67%327'�hQI:M_/;R?5G(=	(1#299,5J>��?Z���(`A8Y2yb4)���C0# �)'�ٖQC2G8<O8-/)'
,# 'F)&)(+2GG��",*K3V\E�43��n$0#5#"&'&'##".546;5#5!3&=#!#3267:QD/(A�*$"~��-���
2(F'�ٿ%!',�GG���)0&���n#/%7&'&'##".546;5#5!##53&=#!#3267��6 �*$"~�hQ������
1'H5d	 %!',�GG���N��)0&�n&,3267#"&'&'##".546;5#5!3&=#�
2)G$(S;(A�*$"~��2��'�)0(D(%!',�GG��mn17B>32'>54&#"#5#"&'&'##".546;5#5!3&=#!3267':#AR#H (#59Q@+(@�*$"~m�b��,()@'�SM.h2) T)/.I���%!',�GG�ſ70"�x-B235#5!##5##".'##".546;5#5!6!54&'&#".547#�%:Ƀ;gQ�.&�*$"~y�5
+/9KYixD>t�GG��%!.%!',�G
��i/2G=@���nT263267>;5!5!##"632#"&'73254&#".545&#"'67.#".54>�,I!<X>1]���n�	.7Jbbcb�;=9wKt1.:/@3.M1(++R:6:`81I�8VGG�!
KACWXF1DAN##L3?=.#.$&EK142[]55C����n&����gx-1V#5#"&'>54&#".546323267#5!%!!&#"'67.#".54>32632QP7Uw_M/% QALI5)K0PJ:34J R
���2.M3 (++R:6:`81I%/N$8O'�ٴa]G6233	F	=:89#H8J\$#( GGGG�=92&.$&EK142[]55C"-�n1=2.#"3267&'>54&'!5!##5#"&'#".5463267#�
'%
0>F@1,U><�/�hQN31N9K34U2s6=12J��I6230-)$+
/,0GG�ٳ&"'*K3V\�11*46l�w�x4@#5#"&5'%32675.''>7.546325#53>54&#"_Q3G@Ya/"#0)<F�7+[/0)M%5)UIBV-#S|@��2!%("/"'�PO%PDDC�=()!%�%9D+&H'5LI;+E �GG�6" "#6�w�x;G#5#".54632.#"32675.''>7.546325#53>54&#"_QB)1M,cQ9'3::,%<F�7+[/0)M%5)UIBV-#S|@��2!%("/"'�PL'F/HQE-,+(�%9D+&H'5LI;+E �GG�6" "#6��-x?K5!##'67.#".'.''>7.54632>32675>54&#"�`hQ5BM0(++Q:58]96V#+[/0)M%5)UIBV-#= 1=+J"7X�4".!%("/'GG��c@M.#.$&EK14/XY19D+&H'5LI;+E
#,3~666" "�x3?!"'.546?>7&''>7.546325#5!##5>54&#"B&%!7/N"qV+[/0)M%5)UIBV-#,w7MgQ�	$d!%("/"
$
&&9D+&H'5LI;+E�GG���i+�6" "#6Wn!$+!".547.=#5!##"32675#67'<Bj>=!TWhA6<L2*E(4W')l-�78L�#M?E*@/�GG�>
6&*Ld�q/7�[n3FIP!".547.=#5!##5#"&'>54'.+#"3267%267!32%5#67'<Bj>=!T[hQC)Iu:A
&&mA6<L2*E(4W')l�)B�Mv5=08:���78L�#M?E*@/�GG��_ac'!4>
6&*L� q^/1<*��q/7����Wn&!�\n#5!".5467.=#5!#5#6;'2654.'#",7hD!T\m(%0=l+�74G��HS 0!$=*F#J=)=?.�GG�#C/9G!d�r-4��=,1 *
&%,un*=@HZ!".5467.=#5!##5#"&'>54'.+%267!32%5#6;'2654.'#",7hD!TuhQC)Iu:A
&&�(%0=l�)B�3�5=08:���74G��HS 0!$=*F#J=)=?.�GG��_ac'!4#C/9G!� q^/1<*��r-4��=,1 *
&%,���\n&$���x>[%.'.54632>54&'#5!6323267#5!##5#"&'#"&'7267>54&#".547#|68cL"%	�� )K0PJ:34J R
gQP7Ej08*]!)o2)E(?5/% QAL�
4*61dX$";0G
#H8J\$#( GG�ٴA>
4n�	@-233	F	=:.*>��yx6S%.'.54632>54&'#5!6323267#"&'#"&'7267>54&#".547#|68cL"%	�� )K0PJ:33L%%aCEj08*]!)o2)E(?5/% QAL�
4*61dX$";0G
#H8I^##( C-A>
4n�	@-233	F	=:.*>���n/>J#5#"&'.'#"&'.'.54632>54&'#5!2674=#%#3267�QD/(A;(*]!)o=68cL"%	��%= �
4��
2(F'�ٿ#	
4n161dX$";0GG�		�.*>�)0&��Xn7F3267#"&'.'#"&'.'.54632>54&'#5!2674=#D
2)G$(S;(A;(*]!)o=68cL"%	��%= �
4'�)0(D(#	
4n161dX$";0GG�		�.*>���n.=I%7&'.'#"&'.'.54632>54&'#5!##52674=#%#3267ѩ6 ;(*]!)o=68cL"%	��hQ�Ώ%= �
4��
1'H5d	 #	
4n161dX$";0GG���O		�.*>�)0&���nAP[>32'>54&#"#5#"&'&'#"&'.'.54632>54&'#5!2674=#%3267p:#AR#H (#59Q@+(@;(*]!)o=68cL"%	����%= �
4
()@'�SM.h2) T)/.I���'	
4n161dX$";0GG�	�.*>�70"�)nFP.5467.5467>3!5!5!#!">;2#4&+#"'.=72>=#BY, ;)�����	6'�S Q#5%I")#L>@o�=hg;"G5#(
VGG�#?��8r+218+b	E+OW8�)os(.�)�nG".546;54&+".5467.5467>;5!5!#!">;2#5#Y0"�"�76)'VD6Ia1 ;)�M����	6'�UQo"&6.
E+LW;4>gg;"G5#(
VGG�%=���0�)/n2D.5467.5467>;5!5!##5##".546;.#"##"632Ia1 ;)���/hQ�)$"5><L'VD+��	+1_^�>gg;+C5#(
VGG�P�$"',/:=A+LW;�� bO�)!n+G.5467.5467>;5!5!##5#"&'>54#"7267##">32Ia1 ;)���!gQ?)Js9Bf�'VD�':��	7!4U29/;�>gg;"H5#(
VGG�Db\^!7~+LW;��	8+25%�)nV.5467.5467>3!5!5!#!">;2#5'67.#".54>326754&+"BY, ;)�����	6'�WP/A
!AI-K['<!#5 )#�76)#L>�=hg;"G5#(
VGG�';���	;>4%	
!*H438l=(3
E+OW8�)�nT.5467.5467>;5!5!#!">;2#5#"&54632.#"326754&+"BY, ;)��%��	6'�O 
Q;'FZZL2

%0/2+#8#�76)#L>�=hg;"G5#(
VGG� /!��VL=@KB&##"�
E+OW8���n22675!5!#'>54&#"'67.#".54>�,I!0D�*ʤ(B;'E#3,#3.M1(++R:6:`81I�-
GG�JEFt53)`7-+?=.#.$&EK142[]55C���@�n&3�����n&3������n&3'���D��LxKW2675!5!#'>54&#"'67.#".'.''>7.54632>>54&#"N,I!0D�x|�(B;'E#3,#3.M1(++R:68\:6V#+[/0)M%5)UIBV-#= 1=��!%("/"�-
GG�JEFt53)`7-+?=.#.$&EK14/XY19D+&H'5LI;+E
#,!6" "#6���n..'#"&54632>54&#"'675#5!###-7%0$( +C@2%=&=C��hQ�CQG8/#;">12.FLGG��'N
RJ>[0���n*.'#"&54632>54&#"'675#5!#-7%0$( +C@2%=&=C���CQG8/#;">12.FLGGN
RJ>[0���|�n&8�<���|�n&9�<�����n&�*6����6n&�'l*����v�n&��L�v�nHT[i%2>54&#".54675!5!##"&5467.54632.#"632&"#"4632#"&73'.#"'632(M~K.)"5:!QJ75�9˴3C2]�Rab*/ZI4
#X,"#^>�!  !Y�(�;u��2eD	CfP!F?lE/>$ 3?S40D	FGGJ
TH:nX4S@-A+<@EA 	FF(&�""!!Q��&���?<H/H%.�xD235#5!!>32'>54&#"#5##".546;54&'&#".546�%:Ȃ��:#AR#H '#69Q�*$!
+/9KYLxD>t�GG�SM.h2) T)/.I���%!',i/2G=@;5��.���x&@E�.x;235#5!#>;#"#5##".546;54&'&#".546�%:Ȃz�6'@3.5Q�*$!
+/9KYLxD>t�GG�G��%!',i/2G=@;5��.��x&BE�.���xH-5##".546;54&'&#".5463235#5!!>32'>54&#"#5�*$!
+/9KYL4%:Ȃ��:#AR#H '#69Q�+�-%!',i/2G=@;5D>t�GG�SM.h2) T)/.I��z���.�@�x&D�.��x?-5##".546;54&'&#".5463235#5!#>;#"#5
�*$!
+/9KYL4%:Ȃz�6'@3.5Q�+�,%!',i/2G=@;5D>t�GG�G�z���.�@x&F�X���q,.'#"&54632>7#"'.=3326?b#<&1$+ &1.<F&Q'7Q A6=C2O#QC(A4��*(��s�J#8���U'%>54&'.+"'&5467#5!#;2e		`.+,(���11
>)+7-('J6k8HH9o.&
*"4R���m2%>54'.+"'&546732654'7#"';2n2b,+-E3B$Q6AAD >D+7-(%L/�`%!
3D).Y'(
*"4��#53.54632#&$#"3##YYP���+�Se������mgQ'G0!SXJPel6A+G��;�#53.54632#.#"3##YYRdUs�=P5tI7<mgQ'G7HY��kg7/0G��m�#53.54632#.#"3##YYRi[}�CQ=�P<D
lgQ'G6J[��jh900G����#53.54632#&#"3##YYPta��OT��FOlgQ'G2N^���;3-G����#53.54632#&#"3##YYPzfh��8U��MVlgQ'G1O^F~U�;5,G��)�#53.54632#.#"3##YYP�mr��<W[�qU\lgQ'G1O]FTgj;6,G��]�#53.54632#.#"3##YYP�s}Υ?Yb�|\clgQ'G1P\G~Tgj:8+G����#53.54632#.#"3##YYP�y�ޱB[j�dhlgQ'G1P\H~Sfk:9+G����#53.54632#&$#"3##YYP����E\q����lgQ'G1Q[HRfkt,G����#53.54632#&$#"3##YYP�����I_x��sulgQ'G1RZI~Rel8<,G��0�#53.54632#&$#"3##YYP����Ma�թ|zlgQ'G0 SYIQel7>+G��d�#53.54632#&$#"3##YYP����Pc��ô��mgQ'G0!SXIQel7?+G�����&K��,����&L��,����&M��,����&N�:,���&O�j,��W�&P��,��~�&Q��,����&R��,����&S�,���&T�S,��8�&U��,��m�&V��,
�-#53.54632&54632.#"#&$#"3##YYP���GzYB 6&(*X������mgQ'G0!SX^MCC
B	-#!?$el6A+G����,#53.54632>32.#"#.#"3##YYRdUAk,
O6 6&(+P5tI7<mgQ'G7HY/../
B	-#!'kg7/0G����+#53.54632>32.#"#.#"3##YYRi[K{4
R: 6&(*V=�P<D
lgQ'G6J[5344
B	-#!?$jh900G��C�*#53.54632>32.#"#&#"3##YYPta[�AU@ 6&(*V��FOlgQ'G2N^B;>?
B	-#!?$�;3-G��v�*#53.54632>32.#"#&#"3##YYPzfg�GXA 6&(*V��MVlgQ'G1O^F>BB
B	-#!?$�;5,G����,#53.5463254632.#"#.#"3##YYP�mt�NXB 6&(*U[�qU\lgQ'G1O]I@CC
B	-#!?$gj;6,G����-#53.54632454632.#"#.#"3##YYP�s��TXB 6&(*Vb�|\clgQ'G1P\LCCC
B	-#!?$gj:8+G���-#53.54632&54632.#"#.#"3##YYP�y��[XB 6&(*Vj�dhlgQ'G1P\PECC
B	-#!?$fk:9+G��A�,#53.54632&54632.#"#&$#"3##YYP����aXB 6&(*Vq����lgQ'G1Q[SG

CC
B	-#!?$fkt,G��s�-#53.54632&54632.#"#&$#"3##YYP���gXB 6&(*Vx��sulgQ'G1RZVHCC
B	-#!?$el8<,G����-#53.54632&54632.#"#&$#"3##YYP���!mXB 6&(*V�թ|zlgQ'G0 SYYICC
B	-#!?$el7>+G����-#53.54632&54632.#"#&$#"3##YYP���4sXB 6&(*W��ô��mgQ'G0!SX\KCC
B	-#!?$el7?+G��
�-9#53.54632&54632.#"#&$#"3##"&54632YYP���GzYB 6&(*X������mgQc'G0!SX^MCC
B	-#!?$el6A+G�����,8#53.54632>32.#"#.#"3##"&54632YYRdUAk,
O6 6&(+P5tI7<mgQ'G7HY/../
B	-#!'kg7/0G�����+7#53.54632>32.#"#.#"3##"&54632YYRi[K{4
R: 6&(*V=�P<D
lgQI'G6J[5344
B	-#!?$jh900G���C�*6#53.54632>32.#"#&#"3##"&54632YYPta[�AU@ 6&(*V��FOlgQ�'G2N^B;>?
B	-#!?$�;3-G���v�*6#53.54632>32.#"#&#"3##"&54632YYPzfg�GXA 6&(*V��MVlgQ�'G1O^F>BB
B	-#!?$�;5,G�����,8#53.5463254632.#"#.#"3##"&54632YYP�mt�NXB!5&(+U[�qU\lgQ�'G1O]I@CC
B	-#!?$gj;6,G�����-9#53.54632454632.#"#.#"3##"&54632YYP�s��TXB 6&(*Vb�|\clgQ2'G1P\LCCC
B	-#!?$gj:8+G����-9#53.54632&54632.#"#.#"3##"&54632YYP�y��[XB 6&(*Vj�dhlgQe'G1P\PECC
B	-#!?$fk:9+G���A�,8#53.54632&54632.#"#&$#"3##"&54632YYP����aXB 6&(*Vq����lgQ�'G1Q[SG

CC
B	-#!?$fkt,G���s�-9#53.54632&54632.#"#&$#"3##"&54632YYP���gXB 6&(*Vx��sulgQ�'G1RZVHCC
B	-#!?$el8<,G�����-9#53.54632&54632.#"#&$#"3##"&54632YYP���!mXB 6&(*V�թ|zlgQ�'G0 SYYICC
B	-#!?$el7>+G�����-9#53.54632&54632.#"#&$#"3##"&54632YYP���4sXB 6&(*W��ô��mgQ0'G0!SX\KCC
B	-#!?$el7?+G������#53.#"#&546323##YYV&S>.1
P"ZObz0mgQ'Gib4,!7@@DU��G�����#53.#"#.546323##YYU0jE49
R`Um�8mgQ'Ghc6.!5<!GW��G���J�#53&#"#.546323##YYQ��@J
Tn^��IlgQ'G�92!17 L\��G������&|�D,�����&}�>,���J�&~�0,��0�*#53.#"#&54632>32.#"3##YYV&S>.2
P"[Oe@I/!5&)*mgQ'Gib4,!7@@DUI$%
B	-#

+8G����0�+#53.#"#.54632>32.#"3##YYU0jE4:
RaU>b)
N5!5&)*ggQ'Ghc6.!5<!GW,,,,
B	-#<"G���I0�*#53&#"#.54632>32.#"3##YYQ��@K
To^S�:U=!5&)*ggQ'G�92!17 L\<79:
B	-#<"G����0�*6#53.#"#&54632>32.#"3##"&54632YYV&S>.2
P"[Oe@I/!5&)*mgQ�'Gib4,!7@@DUI$%
B	-#

+8G�����0�+7#53.#"#.54632>32.#"3##"&54632YYU0jE4:
RaU>b)
N5!5&)*ggQ�'Ghc6.!5<!GW,,,,
B	-#<"G����I0�*6#53&#"#.54632>32.#"3##"&54632YYQ��@K
To^S�:U=!5&)*ggQ�'G�92!17 L\<79:
B	-#<"G��������&��=�����&��=�w��"&'732654&#"'>32�Sz7=5A.).&"$!4CIQ��WQ+)?#'#"A		N>=N���
���&�_���
���&�_���H��& ����H��& ����H�vB&!����H�vB&!����.�v-?�����vE&?�������vE&?�������v�&@�����.�v�@�����v�&@���������
632.#"4632#"&�DeO"92eD	�!  !,3V3)PK""""���@����
"&'73267%4632#"&��7\D56C[��    �'B""B'0""!!�����@����������
'"&'73267%4632#"&"&'73267��7ZD56C]��    B7X&F+,F%X�&B!!B'""!!m BB ��������b�n.:".547>;5!5!##">32#"&'73265474632#"&fD*;#:3_�s���(
=PZ^gZ�<>>�=<5:F*.
>GG�?88JHE1D32f    c�nH%2>54&#".54675!5!##"&5467.54632.#"632.#"(M~K.)#3<!QJ75�9˴3C2]�Rab

(,ZI4
#.*+"$	Y�2U6$2'
?G-)<-GG0H=1]J,G8"6$57DF3:�n#"3267#"&54>;5!5!#sK!EXC1T)(l3m�>kA
����	
#7+KYX9I#AGG�Xn&%".54>;5!5!#'2654&'#"'Hq@@nC��X�M[AoFI\:9*&AZ�%N=8I$BGGH[::I!G-0#:&12bPn.".547>;5!5!##">32#"&'732654fD*;#:3c�oPn�(
=PZ^gZ�<>>�=<5F*.
>GG�?88JHE1D32�An"-%"&54>35!5!##"&54632'23254#"6w�BuL��A�>)P<;KMFDknv=*'�YY9I#@GG�	$-1)=>':Gn<'�n -;5!##"&'#".54>32>7532654&#"326?5.#"�4D_Q6O& I./M.-P36O&:#W;"*?7%(2��6%&6:"*?'GGRRAG]&(&K61J)%!M�*-24*-23+--*-j�n22675!5!#'>54&#"'67.#".54>�2L!0F�*ʤ(B)E ,#3.M/(+D:-GT#/D�+	XGG\HA,Y62&G)*85%&/4$<*JI&/:���n.:F".547>;5!5!##">32#"&'73265474632#"&4632#"&fD*;#:3_�s���(
=PZ^gZ�<>>�=<5:�_!  !F*.
>GG�?88JHE1D32f    ��""!!�����n&���/n+#"3267#"&54>;5!5!#4632#"&sK!EXC1T)(l3m�>kA
�����!  !�	
#7+KYX9I#AGG�B""!!Xn&2%".54>;5!5!#'2654&'#"4632#"&'Hq@@nC��X�M[AoFI\:9*&AZ�!  !�%N=8I$BGGH[::I!G-0#:&12�""!!
Pn.:".547>;5!5!##">32#"&'7326544632#"&fD*;#:3c�oPn�(
=PZ^gZ�<>>�=<5�z!  !F*.
>GG�?88JHE1D32�""!!&An"-9%"&54>35!5!##"&54632'23254#"4632#"&6w�BuL��A�>)P<;KMFDknv=*'��!  !�YY9I#@GG�	$-1)=>':Gn<'�""!!����n&��������n&����x&>7.54632.'7>54&#")M%5)UIBV-#!g:&]T+[/�!%("/"+&H'5LI;+E
H
9�6" "#6�4����!"&'732654&#"'632''73�X}747^@-*+'13N�.�(u1$(S��F7375
Ca�B�� 8&1D�4�v��!"&'732654&#"'632''73�X}747^@-*+'13N�.�(u1$(S�vF7375
Ca�B�� 8&1D��v��-4632#"&"&'732654&#"'632''73�!  !$X}747^@-*+'13N�.�(u1$(S ""!!��F7375
Ca�B�� 8&1D�I��6� 73'"&54632.#"3267�I�(u;X��CMQEBcM"=._>,,+&2��'n��C51C/M.'DI	C�I�v6 73'"&54632.#"3267�I�(u;X��CMQEBcM"=._>,,+&2���'n��C51C/M.'DI	C��v6,4632#"&73'"&54632.#"3267�!  !-�(u;X��CMQEBcM"=._>,,+&2 ""!!G��'n��C51C/M.'DI	C�.����73'#"&54673267�.�(�;u�lC)OQYX:41#1!��'���
A4/OB�.�v��73'#"&54673267�.�(�;u�lC)OQYX:41#1!���'���
A4/OB��v��&4632#"&73'#"&54673267�!  !�(�;u�lC)OQYX:41#1! ""!!Y��'���
A4/OB�I�v���+73'#"'3267#"&547&54673267�I�(u;X�LC)Q 0"C)OP7YX?/+& 0"��'n��
,
?
C3"<+CB�.�v-�C%73'23267#"&5467654&#"'>7.#".54>32>�c�(u;X�8&=+)5 ;C8> 6F
#GA.IY':"::u�'nn-&0<
7,#5#7
!;+25X7$-�.�v��T%73'"'3267#"&547.5467.#"'>7.#".54>32>323267�c�(u;X�m

!'5 <B!6F
#GA.IY':"::&8&+! '5u�'nn�

;
8.

"'	#7
!;+25X7$-.%


<
�.���73'.#"'632�.�(�;u��2eD	CfP!��'���?;H/G&�.�v��73'.#"'632�.�(�;u��2eD	CfP!���&���?<H/H%��v�� 4632#"&73'.#"'632�!  !�(�;u��2eD	CfP!;""!!Q��&���?<H/H%�I����73'"&'73267�I�(�;f��Ad#L=>M"d���&~��'B!!B'����� 4632#"&73'"&'73267�!  !-�(�;f��Ad#L=>M"d*""!!=��&~��'B!!B'�X�v��"73'"&'73267"&'73267�\�(�:b��=]  I:;H!c;=[")K/0K)![ho�+iiy%??&h??��v�� .4632#"&73'"&'73267"&'73267�!  !T�(�:b��=]  I:;H!c;=[")K/0K)![*""!!%o�+iiy%??&h??���9�v��������v���������v�� �����B%"'3267#"&547.54673267jQ 0"C)OQYX?/+& /"C�"1
4&#!32
0
�.��-;'2"3267#"&5467654&#"'67.#".54>32>h8&80)5 ;C:@ 5F
#"BE+I[':"9;$&	1
-#+

.	.#*(F/%�.���I"'3267#"&547.5467&#"'67.#".54>32>323267

!%5 <B 5F
#"BE+I[':"9;&8&)$ *5�0
-%	
		.	.#*(F/%%
	
1
���M�v��[*���������:3�n����v���n4���*nB.'#".547.54676;5!5!##">32&"#"3:7&54632�@k@&*Qq��*��%=%#�.G#*'1$:8?2+"3((
 BGG�#
GJ!!. *.��<nZ"&'.546?'.#"3267#"&54>32767.5467>;5!5!##"3:3&54632'T(!''/@(963 T@P%  Z4��<�1i0/PS
*+-"=E=�N


J)+?<0(189N#

OH,?NGG�6.;"1 %	��i�g��,.54632.#"7"&54632"&'73267�SB/"(&$d2J7="$
<Gg$K$CC	B
, B'oR<CY*7L:�Vg��4632#"&53&'73267#"'�6
@715-D[GR3Tھ'B@E>^L=���&4632#"&##5353&'73267#"'3WQYY6
@715-D[GR3gT���'G�'B@E>^L=�G�����(4632#"&7#"'#"&'73267&'732674�VCU3Z;Bf"G=.31@3-1)
W"XIF?5PV=:?9
=<A9�%gX�.4632#"&.#"#".'73267&'73267#"'�(&

#9/B%+@715-D[GT�H4;7,,"B@E>^L%5�gg��'4632#"&.#"'63273267#"'`I)2""'42$9715-D[G+!T�O[&	IB@E>^L,<�Tg��64632#"&.#"'>327.#"'63273267#"'`S-+*2-F&, '42$9715-D[G+!T�(%	E
+&49EB@E>^L,<������&��([�74632#"&##53.#"#".'73267&'73267#"'3w3QYW'%

#9/B%+@715-D[GnT���'GD1;7,,"B@E>^L+G�j��04632#"&##53.#"'63273267#"'3�QYX)2!"'42$9715-D[G+!nT���'GLX%	IB@E>^L3G�W��?4632#"&##53.#"'>327.#"'63273267#"'3�QYK+**2-F&, '42$9715-D[G+!nT���'G$#
	E
+&49EB@E>^L3G���N4632#"&##53.#"#".'732632654&/.=7&'73267#"'3�.QYB)60B($
  0%
 7.F$	@715-D[GWT���'G(25085 
35B@E>^L,G�94632#"&#53.54632&'73267#"'#&$#"3##3�&YP���=x3@715-D[G)!$Ae������mgQT��G0!SXVG)]B@E>^L3el6A+G����74632#"&#53.54632&'73267#"'#.#"3##�BYRdU\G@715-D[G P5tI7<mgQT��G7HY/
B@E>^L	*7kg7/0G��"�84632#"&#53.54632&'73267#"'#.#"3##>�YRi[8a*@715-D[GQ=�P<D
lgQT��G6J[B@E>^L+5jh900G��f�74632#"&#53.54632&'73267#"'#&#"3##���YPtaI�8
@715-D[G$ T��FOlgQT��G2N^*' B@E>^L+4�;3-G����74632#"&#53.54632&'73267#"'#&#"3##���YPzfV�@
@715-D[G(#U��MVlgQT��G1O^1-(B@E>^L+5�;5,G����84632#"&#53.54632&'73267#"'#.#"3##��oYP�mi�I@715-D[G&-(W[�qU\lgQT��G1O]<6%6B@E>^L
-8gj;6,G����84632#"&#53.54632&'73267#"'#.#"3##�HYP�sp�N@715-D[G-(Yb�|\clgQT��G1P\;4$4B@E>^L+5gj:8+G���84632#"&#53.54632&'73267#"'#.#"3##9� YP�yy�S@715-D[G/)[j�dhlgQT��G1P\;3#4B@E>^L*3fk:9+G��J�74632#"&#53.54632&'73267#"'#&$#"3##f��YP����Y@715-D[G1+\q����lgQT��G1Q[=5$7B@E>^L*2fkt,G���84632#"&#53.54632&'73267#"'#&$#"3##���YP����b@715-D[G6._x��sulgQT��G1RZD:'@B@E>^L*4el8<,G����84632#"&#53.54632&'73267#"'#&$#"3##���YP���
h"@715-D[G:1a�թ|zlgQT��G0 SYH=(FB@E>^L+4el7>+G����94632#"&#53.54632&'73267#"'#&$#"3##�YYP���$p*@715-D[G# ;c��ô��mgQT��G0!SXOC*QB@E>^L2el7?+G���$n�54632#"&.5463273267#"'3###53.#"���TK,!+715-D[G

ngQYW=7(*T�#@"ASB@E>^L&1G��'Ghc1+"7��[�44632#"&#53.#"#&5463273267#"'3##wYV&S>.1
P"ZO4)3715-D[GmgQT��Gib4,!7@@DUB@E>^L%/G����[�64632#"&#53.#"#.54632'73267#"'3##wYU0jE49
R`UF7@715-D[GmgQT��Ghc6.!5<!GWB@E>^L&/G���J[�74632#"&#53&#"#.54632&'73267#"'3##wYQ��@J
Tn^Br2	@715-D[G lgQT��G�92!17 L\&#B@E>^L	(2G����g��"0&54632.#"!53%"&54632"&'73267P?TB0")%#��Q1K8*!!%
<GgHKCC	B
, B'��oR<C.+*7L:������&���g��*8&'#"&'73267632.#"7"&54632"&'73267�'(6E^"F9-1/&$50")%#d2J8*!!%	=Gg-0Y^FDIC	B
, B'oR<C.+*7L:�%g��$0=.#"#".'732632>32.#"7"&54632"&'73267�(&

#9/B%+ L5/"(&x2J7="$
<GgH4;7,,,,	B
, -VoR<CY*7L:�gg��)6.#"'632>32.#"7"&54632"&'73267�)2""'40:=*/"($|2J7="$
<GgO[&	I ($$	B
-#5MoR<CY*7L:�Tg��.:G2.#"#.#"'>327.#"'632>"&54632"&'73267C/"'%
U-+*2-F&, '4-@
=�2J7="$
<G�	B
-#@&(%	E
+&49E!(%$�R<CY*7L:������&����(��&����j��&����W��&�������&N�-9F#53.54632&54632.#"#&$#"3##"&54632"&'73267YYP���@xSB/"(&$X������mgQ�2J7="$
<G'G0!SXXI
CC	B
, B'el6A+G���R<CY*7L:4�+7D#53.54632>32.#"#.#"3##"&54632"&'73267YYRdUxUI1/"(&P5tI7<mgQL2J7="$
<K'G7HYR*(	B
, 1@kg7/0G���R<CY*7L:e�+7D#53.54632>32.#"#.#"3##"&54632"&'73267YYRi[Gu1
N40"(&#U=�P<D
lgQ}2K8=!%
<G'G6J[/-/-	B
, B'jh900G���R<CY*7L:��*6C#53.54632>32.#"#&#"3##"&54632"&'73267YYPtaV�>N=/"(&$V��FOlgQ�2J7="$
<G'G2N^;689	B
, B'�;3-G���R<CY*7L:��*6D#53.54632>32.#"#&#"3##"&54632"&'73267YYPzfb�FP>/#(&$U��MVlgQ�2J8* "$
=G'G1O^?9<<	B
, B'�;5,G���R<C.+*7L:�+7E#53.54632>32.#"#.#"3##"&54632"&'73267YYP�mn�KS@0#(%#U[�qU\lgQ22J8*!!%	=G'G1O]B;>?	B
, B'gj;6,G���R<C.+*7L:N�+7E#53.54632>32.#"#.#"3##"&54632"&'73267YYP�s|�RSA/#(%#Vb�|\clgQe2J8* "$
=G'G1P\F>BB	B
, B'gj:8+G���R<C.+*7L:��,8E#53.5463254632.#"#.#"3##"&54632"&'73267YYP�y��YSB/"(&$Vj�dhlgQ�2J7="$
<G'G1P\J@CC	B
, B'fk:9+G���R<CY*7L:��,8F#53.54632454632.#"#&$#"3##"&54632"&'73267YYP����_SB0#(%#Vq����lgQ�2J8* "$
=G'G1Q[MBCC	B
, B'fkt,G���R<C.+*7L:��-9G#53.54632&54632.#"#&$#"3##"&54632"&'73267YYP���fTB0#(%#Vx��sulgQ�2J8*!!%	=F'G1RZPCCC	B
, B'el8<,G���R<C.+*7L:�-9G#53.54632&54632.#"#&$#"3##"&54632"&'73267YYP���lTA0#(%#V�թ|zlgQ02J8*!!$
=G'G0 SYSE		CC	B
, B'el7>+G���R<C.+*7L:K�-9G#53.54632&54632.#"#&$#"3##"&54632"&'73267YYP���-qSB/"(&$W��ô��mgQc2J7* "$
<G'G0!SXUGCC	B
, B'el7?+G���R<C.+*7L:�$��,8F#53.#"#.54632>32.#"3##"&54632"&'73267YYS>5(*PTK,=A- ."('rgQ�1K8*!!%
<G'Ggd1+"7#@"AS'!"	B	-#0BG���R<C.+*7L:����)5B#53.#"#&54632>32&#"3##"&54632"&'73267YYV&S>.2
P"[OeAD0-!")%mgQ�1K8=!%
<G'Gib4,!7@@DUI$%	B-#

+8G���R<CY*7L:����+7D#53.#"#.54632>32.#"3##"&54632"&'73267YYU0jE4:
RaU>b)
I5 -")%ggQ�1K8=!%
<G'Ghc6.!5<!GW,,,,	B	,"!<"G���R<CY*7L:�I��*6C#53&#"#.54632>32.#"3##"&54632"&'73267YYQ��@K
To^S�:S:0")%ggQ�1K8=!%
<G'G�92!17 L\<79:	B
-#<"G���R<CY*7L:�I����,%73'"'3267#"&547.54673267�I�Kj;X��Q 0"C)OQYX?/+& /"Cy�&mn"1
4&#!32
0
�,��+�8>%73"3267#"&5467654&#"'67.#".546?67�I�Kj080)5 ;C:@ 5F
#"BE+I[�n3*"-y�$"&	1
-#+

.	.#*(F/ 
UF�,����FL"'3267#"&547.5467&#"'67.#".5467'73326767

!%5 <B 5F
#"BE+I[�Kj1)$ *5�n3*"-�0
-%	
		.	.#*(F/ 
y�& 
	
1
F����734632#"&�k[$%%$����%%$  s���333�osn�����"kx7#537#53733733#3##7##%7#�}���"F!�"E"~���"F#�"E���B�A����A�B����9��x%/"&546323#254#""&54632'254#"�GJELHKF"M�NKK&""�HIELIIEMKK&""`UV^^VU`_��Nvu:;:<��aTV__VTaAtv;;::s���3�o���D�['@
&54673�KFELQDIHF�g���fj�����m;�[@
654'3<DHGFRKFFK�j��mg�����eI%�7'7'37'�v��d�
�xWVMT�^6��6^�/��2a�$#53533##スI��II��I�.��t>73.a
0�;�45~71#R3#1��RRH���y74632#"&H$%%$6%%$  *�Z�A3#1R��SA�0����
"&54>32'2654&#"sp-dRtq-eSK@@KK>>
ít�W��s�XL��������W[�!467'73H/�I�*e!;<��6/��?>54&#"'>32!!/�1E&@3.K"2'g@^n,M2�P�CL�5TR19>&:#1fY7b`5�Q(����)"&'532654&+532654&#"'>32�5_)+b.ZSdVAAPTC74P$-%lDilUEVZ�
SKBB<JK<39!=+dMHW
YG^w�
%!533##=4>5#U��D\hhVɠN�#Q��%QG4��@���� "&'532654&#"'!!>32�2\ =BMWVRC,Q��7Ag=�
TJOGI	PQ�/]Ep7����-".54>32.#"3>32'2654&#" Aj>(FmN1+BU1H:\oue;I@A,B$ @
D�k>xkS/L.Oh:#0qho�KPUDO'; +T7,��!5!#�����_yQG�}4����'3"&5467.54>32>54&#"2654&'kuQ90C8\57[7I7&E,9dB/B=64=A/EFIM=?A
gYI[U@9L&&L:AR5G0<X0�=5233279��B70G$L64A4����-"&'532>7##"&546322>54.#"�0+BV0I:\oudBi>(Fm,B$ ?0:JA
L.Oh:#0rgp�D�k=ykS/['<,S7PUDOU���&"&54632"&54632�$$$$$$$$� $&&$ �T $&&$ ,��&"&54632#>7�$$$$
0C� $&&$ ��5~7;�42M�85%
2��g1�N��N2���!!!!2�=�=�II2M�87-52g���=���N�1�G����+754>7>54&#"'>324632#"&�% '96(J"(\/[i/#!$[$$$$�&72*0"/:G`V+@6)(	�&&$  l�Z.@3#3#l�rr�@F��F*�Z�@3#*RR@�6�Z�@3#53#6qq��`ZF�	�3##�2�N��O�=g�����b���!!��aZD,�ZQ@26=467.=4&#,<?aI)0j460)Ia?<r)1�KAH.�b
:3�.H@K�1)�Z2@3#�HH@�6�Z[@"5>=475&=4&'53[<>aJ*/jj/*Ja><()1�K@H.�cc�.HAK�1)2��6323267#".'.#"21H (%(<0I '$'<O5

"O5

"(�W!!(��\WR(�W!!(��hWRR���'>73Y/C�5~7<�4Q���#>7�
0C�5~7;�3S���'>733'>73Z/C[/C�5~7<�45~7<�4Q���#>7##>7�
0C[
0C�5~7;�35~7;�3H���z#"&54632!"&54632!"&54632�$$$$��$$$$�$$$$ $&&$  $&&$  $&&$ Es�'7'77�2��3��3��2�3��3��2��22_�."&54632!!"&54632!!!!��=�!!!!� "" MI� "" ��1#RH�n3&'.+5!#3##'7326767#H�+&B����	TT�f�
,12��$
GG(H?O��G"��������&x1x�{�������&�y�������.�&�z�����c����&�x�4���K����&�y�#���W����&�z�+��� ����&�{����A����&�|�-���F����&�y�������&w"y�������C&�2��7��
6%�&����$6�I'�����$����&�������,��'����\�W.#"'>54.54632~&%*$^YY?SG,E�15P��|DmCK_Ui��[QX �R�r�7'7'37'�Gpu>uqH433�a7 vv 7akk���x4@#"&54675.''>7.546325#53#3267>54&#"�C)KU00B�:+[/0)M%5)UIBV-#*q4@�g:42 /"�>!%("/"�
O?)D�	%9D+&H'5LI;+E�GG��B,!"-6" "#6���HN�&�J3�g�,8.#"#".'732632654&/.=7'4632#"&�+60B($
  0%
 7.F$)1!  !g-25085 
35,31�""""�g��F4632#"&.#"#".'732632654&/.=7&'73267#"'+�+60B($
  0%
 7.F$	@715-D[GT�-25085 
35B@E>^L1��gD�%;.'&/.5<?>32.#"#.#"#".'732632�*7/F#

P7!5&(*�*7/B($
  1%
g315..
B	-#!?$-250<9��gD�%;G.'&/.5<?>32.#"#.#"#".'73263274632#"&�*7/F#

P7!5&(*�*7/B($
  1%
�g315..
B	-#!?$-250<9m��g��$:FS&'&/.5<?>32.#"#.#"#".'7326327"&54632"&'73267�07/F#
L6/"(&$�*7/B($
  1%
�2J7="$
<Gg7;15-,	B
, B'-250<9oR<CY*7L:n:!632>32'>54&#"#".5467.#"#".54675#5��YtPa,#G>P
.6&"L27%.${nGCA<1R45_'E*2? 2(8##U(8&
PG�h�n<G!632#"&54632#".54>;.#"#".54675#52654&#"��/*&OyDV;jA;3
JIJEseIqAK�XiQ)(*$$2�8G##,nGW0aH
(996:%(3MM2CW1\@EX*MGS&*!
eG��#-'(<n#4##5#"&'>54.#"#".54675#5267!632<hQ@&Hv:B'>%)(*$$2&=�M*&by17:nG��^ac'"	S&*!
eG�sW=J1<+&�4j	��
M
{�"Q	�
0y�
��
-;�K
	h	�	�	6�	")	_	 �	D�	*%		(g	
`�	>9	<�	
"�	4�		v]	"'	�Copyright 2015-2021 Google LLC. All Rights Reserved.Copyright 2015-2021 Google LLC. All Rights Reserved.Noto SansNoto SansRegularRegular2.007;GOOG;NotoSans-Regular2.007;GOOG;NotoSans-RegularNoto Sans RegularNoto Sans RegularVersion 2.007Version 2.007NotoSans-RegularNotoSans-RegularNoto is a trademark of Google LLC.Noto is a trademark of Google LLC.Monotype Imaging Inc.Monotype Imaging Inc.Monotype Design TeamMonotype Design TeamDesigned by Monotype design team, Irene Vlachou.Designed by Monotype design team, Irene Vlachou.http://www.google.com/get/noto/http://www.google.com/get/noto/http://www.monotype.com/studiohttp://www.monotype.com/studioThis Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: https://scripts.sil.org/OFLThis Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: https://scripts.sil.org/OFLhttp://scripts.sil.org/OFLhttp://scripts.sil.org/OFLiota adscriptiota adscriptAccented Greek SCAccented Greek SCTitling Alternates I and J for titling and all cap settingsTitling Alternates I and J for titling and all cap settingsflorin symbolflorin symbol�j2R	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a����������������	���
����������bc�d�e�������f����g�����h���jikmln�oqprsutvw�xzy{}|��~�����
��� !"#��$%&'()*+,-./0123��456789:;<=>?@AB��CDEFGHIJKLMNOPQ��RSTUVWXYZ[����\]^_`abcdefghijklmnopq�rstu��vwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~����������������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~���������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~������������������������������������������������������������������������������������������������������������������������������������������������												
			
																			 	!	"	#	$	%	&	'	(	)	*	+	,	-	.	/	0	1	2	3	4	5	6	7	8	9	:	;	<	=�	>	?	@	A	B	C	D	E	F	G	H	I	J	K	L	M	N	O	P	Q	R	S	T	U	V	W	X	Y	Z	[	\	]	^	_	`	a	b	c	d	e	f	g	h	i	j	k	l	m	n	o	p	q	r	s	t	u	v	w	x	y	z	{	|�	}	~		�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�









	























 
!
"
#
$
%
&
'
(
)
*
+
,
-
.
/
0
1
2
3
4
5
6
7
8
9
:
;
<
=
>
?
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
[
\
]
^
_
`
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
{
|
}
~

�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~����������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������









	























 
!
"
#
$
%
&
'
(
)
*
+
,
-
.
/
0
1
2
3
4
5
6
7
8
9
:
;
<
=
>
?
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
[
\
]
^
_
`
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
{
|
}
~

�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgNULLCRuni00A0uni00AD	overscoreuni00B2uni00B3uni00B5uni00B9AmacronamacronAbreveabreveAogonekaogonekCcircumflexccircumflex
Cdotaccent
cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve
Edotaccent
edotaccentEogonekeogonekEcaronecaronGcircumflexgcircumflex
Gdotaccent
gdotaccentuni0122uni0123HcircumflexhcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJijJcircumflexjcircumflexuni0136uni0137kgreenlandicLacutelacuteuni013Buni013CLcaronlcaronLdotldotNacutenacuteuni0145uni0146NcaronncaronnapostropheEngengOmacronomacronObreveobreve
Ohungarumlaut
ohungarumlautRacuteracuteuni0156uni0157RcaronrcaronSacutesacuteScircumflexscircumflexuni0162uni0163TcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring
Uhungarumlaut
uhungarumlautUogonekuogonekWcircumflexwcircumflexYcircumflexycircumflexZacutezacute
Zdotaccent
zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188Dtailuni018Auni018Buni018Cuni018Duni018Euni018Funi0190uni0191fhookuni0193
Gammalatinuni0195	Iotalatinuni0197uni0198uni0199uni019Auni019Buni019Cuni019Duni019Euni019FOhornohornuni01A2uni01A3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhornUpsilonlatinuni01B2uni01B3uni01B4uni01B5uni01B6uni01B7uni01B8uni01B9uni01BAuni01BBuni01BCuni01BDuni01BEuni01BFuni01C0uni01C1uni01C2uni01C3uni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3uni01E4uni01E5Gcarongcaronuni01E8uni01E9uni01EAuni01EBuni01ECuni01EDuni01EEuni01EFuni01F0uni01F1uni01F2uni01F3uni01F4uni01F5uni01F6uni01F7uni01F8uni01F9
Aringacute
aringacuteAEacuteaeacuteOslashacuteoslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217uni0218uni0219uni021Auni021Buni021Cuni021Duni021Euni021Funi0220uni0221uni0222uni0223uni0224uni0225uni0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233uni0234uni0235uni0236uni0237uni0238uni0239uni023Auni023Buni023Cuni023Duni023Euni023Funi0240Glottalstopcasedglottalstopcaseduni0243uni0244uni0245uni0246uni0247uni0248uni0249uni024Auni024Buni024Cuni024Duni024Euni024Funi0250uni0251uni0252uni0253uni0254uni0255uni0256uni0257uni0258uni0259uni025Auni025Buni025Cuni025Duni025Euni025Funi0260uni0261uni0262uni0263uni0264uni0265uni0266uni0267uni0268uni0269iotaserifeduni026Buni026Cuni026Duni026Euni026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276uni0277uni0278uni0279uni027Auni027Buni027Cuni027Duni027Euni027Funi0280uni0281uni0282uni0283uni0284uni0285uni0286uni0287uni0288uni0289uni028Auni028Buni028Cuni028Duni028Euni028Funi0290uni0291uni0292uni0293uni0294uni0295uni0296uni0297uni0298uni0299uni029Auni029Buni029Cuni029Duni029Euni029Funi02A0uni02A1uni02A2uni02A3uni02A4uni02A5uni02A6uni02A7uni02A8uni02A9uni02AAuni02ABuni02ACuni02ADuni02AEuni02AFuni02B0uni02B1uni02B2uni02B3uni02B4uni02B5uni02B6uni02B7uni02B8uni02B9uni02BAuni02BBuni02BCuni02BDuni02BEuni02BFuni02C0uni02C1uni02C2uni02C3uni02C4uni02C5uni02C8	macronmodacutemodgravemoduni02CCuni02CDuni02CEuni02CFuni02D0uni02D1uni02D2uni02D3uni02D4uni02D5uni02D6uni02D7uni02DEuni02DFuni02E0uni02E1uni02E2uni02E3uni02E4uni02E5uni02E6uni02E7uni02E8uni02E9uni02EAuni02EBuni02ECuni02EDuni02EEuni02EFuni02F0uni02F1uni02F2uni02F3uni02F4uni02F5uni02F6uni02F7uni02F8uni02F9uni02FAuni02FBuni02FCuni02FDuni02FEuni02FF	gravecomb	acutecombuni0302	tildecombuni0304uni0305uni0306uni0307uni0308
hookabovecombuni030Auni030Buni030Cuni030Duni030Euni030Funi0310uni0311uni0312uni0313uni0314uni0315uni0316uni0317uni0318uni0319uni031Auni031Buni031Cuni031Duni031Euni031Funi0320uni0321uni0322dotbelowcombuni0324uni0325uni0326uni0327uni0328uni0329uni032Auni032Buni032Cuni032Duni032Euni032Funi0330uni0331uni0332uni0333uni0334uni0335uni0336uni0337uni0338uni0339uni033Auni033Buni033Cuni033Duni033Euni033Funi0340uni0341uni0342uni0343uni0344uni0345uni0346uni0347uni0348uni0349uni034Auni034Buni034Cuni034Duni034Euni034Funi0350uni0351uni0352uni0353uni0354uni0355uni0356uni0357uni0358uni0359uni035Auni035Buni035Cuni035Duni035Euni035Funi0360uni0361uni0362uni0363uni0364uni0365uni0366uni0367uni0368uni0369uni036Auni036Buni036Cuni036Duni036Euni036Funi0370uni0371uni0372uni0373uni0374uni0375uni0376uni0377uni037Auni037Buni037Cuni037Duni037Euni037Ftonos
dieresistonos
Alphatonos	anoteleiaEpsilontonosEtatonos	IotatonosOmicrontonosUpsilontonos
OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsiuni03A9IotadieresisUpsilondieresis
alphatonosepsilontonosetatonos	iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhouni03C2sigmatauupsilonphichipsiomegaiotadieresisupsilondieresisomicrontonosupsilontonos
omegatonosuni03CFuni03D0uni03D1uni03D2uni03D3uni03D4uni03D5uni03D6uni03D7uni03D8uni03D9uni03DAuni03DBuni03DCuni03DDuni03DEuni03DFuni03E0uni03E1uni03F0uni03F1uni03F2uni03F3uni03F4uni03F5uni03F6uni03F7uni03F8uni03F9uni03FAuni03FBuni03FCuni03FDuni03FEuni03FFuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0460uni0461uni0462uni0463uni0464uni0465uni0466uni0467uni0468uni0469uni046Auni046Buni046Cuni046Duni046Euni046Funi0470uni0471uni0472uni0473uni0474uni0475uni0476uni0477uni0478uni0479OmegaroundcyomegaroundcyOmegatitlocyomegatitlocyOtcyotcyuni0480uni0481uni0482uni0483uni0484uni0485uni0486uni0487uni0488uni0489uni048Auni048Buni048Cuni048Duni048Euni048Funi0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0500uni0501uni0502uni0503uni0504uni0505uni0506uni0507uni0508uni0509uni050Auni050Buni050Cuni050Duni050Euni050Funi0510uni0511uni0512uni0513uni0514uni0515uni0516uni0517uni0518uni0519uni051Auni051Buni051Cuni051Duni051Euni051Funi0520uni0521uni0522uni0523uni0524uni0525uni0526uni0527Enlefthookcyuni0529uni052Auni052Buni052Cuni052Duni052Euni052Fbinducandradevacandrabindudevaanusvaradevavisargadeva
ashortdevaadevaaadevaidevaiidevaudevauudevarvocalicdevalvocalicdevaecandradeva
eshortdevaedevaaidevaocandradeva
oshortdevaodevaaudevakadevakhadevagadevaghadevangadevacadevachadevajadevajhadevanyadevattadevatthadevaddadevaddhadevannadevatadevathadevadadevadhadevanadevannnadevapadevaphadevabadevabhadevamadevayadevaradevarradevaladevalladevallladevavadevashadevassadevasadevahadevaoevowelsigndevaooevowelsigndeva	nuktadevaavagrahadevaaavowelsigndevaivowelsigndevaiivowelsigndevauvowelsigndevauuvowelsigndevarvocalicvowelsigndevarrvocalicvowelsigndevaecandravowelsigndevaeshortvowelsigndevaevowelsigndevaaivowelsigndevaocandravowelsigndevaoshortvowelsigndevaovowelsigndevaauvowelsigndeva
viramadevauni094Eawvowelsigndevaomdeva
udattadevaanudattadevauni0953uni0954candralongevowelsigndevauevowelsigndevauuevowelsigndevaqadevakhhadevaghhadevazadeva	dddhadevarhadevafadevayyadeva
rrvocalicdeva
llvocalicdevalvocalicvowelsigndevallvocalicvowelsigndeva	dandadevadbldandadevazerodevaonedevatwodeva	threedevafourdevafivedevasixdeva	sevendeva	eightdevaninedevaabbreviationsigndevauni0971acandradevaoedevaooedevaawdevauedevauuedevamarwariddadevazhadevaheavyyadeva	gabardeva	jabardevauni097D
ddabardeva	babardevauni1AB0uni1AB1uni1AB2uni1AB3uni1AB4uni1AB5uni1AB6uni1AB7uni1AB8uni1AB9uni1ABAuni1ABBuni1ABCuni1ABDuni1ABE
wbelowcombwturnedbelowcombveroundedcydelongleggedcy	onarrowcyeswidecytetallcytethreeleggedcyhardsigntallcy	yattallcy
ukunblendedcyuni1CD0uni1CD1uni1CD2uni1CD3uni1CD4uni1CD5uni1CD6uni1CD7uni1CD8uni1CD9uni1CDAuni1CDBuni1CDCuni1CDDuni1CDEuni1CDFuni1CE0uni1CE1uni1CE2uni1CE3uni1CE4uni1CE5uni1CE6uni1CE7uni1CE8uni1CE9uni1CEAuni1CEBuni1CECuni1CEDuni1CEEuni1CEFuni1CF0uni1CF1uni1CF2uni1CF3uni1CF4uni1CF5uni1CF6uni1CF8uni1CF9uni1D00uni1D01aeturnedBbarredsmalluni1D04uni1D05Ethsmalluni1D07eturnedopeniturneduni1D0Auni1D0BLstrokesmalluni1D0DNreversedsmalluni1D0F
Oopensmall	osideways
osidewaysopenoslashsidewaysoeturneduni1D15otophalfobottomhalfuni1D18RreversedsmallRturnedsmalluni1D1Buni1D1C	usidewaysudieresissidewaysmsidewaysturneduni1D20uni1D21uni1D22Ezhsmallspirantvoicedlaryngealuni1D25uni1D26uni1D27uni1D28uni1D29uni1D2Auni1D2Buni1D2CAEmoduni1D2E
Bbarredmoduni1D30uni1D31Ereversedmoduni1D33uni1D34uni1D35uni1D36uni1D37uni1D38uni1D39uni1D3ANreversedmoduni1D3Cuni1D3Duni1D3Euni1D3Funi1D40uni1D41uni1D42uni1D43
aturnedmoduni1D45aeturnedmoduni1D47uni1D48uni1D49uni1D4Aeopenmodeturnedopenmoduni1D4D
iturnedmoduni1D4Funi1D50uni1D51uni1D52oopenmodotophalfmodobottomhalfmoduni1D56uni1D57uni1D58usidewaysmod
mturnedmoduni1D5Buni1D5Cuni1D5Duni1D5Euni1D5Funi1D60uni1D61uni1D62uni1D63uni1D64uni1D65uni1D66uni1D67uni1D68uni1D69uni1D6Auni1D6Buni1D6Cuni1D6Duni1D6Euni1D6Funi1D70uni1D71uni1D72uni1D73uni1D74uni1D75uni1D76uni1D77uni1D78uni1D79uni1D7Aiotaserifedstrokeuni1D7Cuni1D7DUsmallstrokeuni1D7Funi1D80uni1D81uni1D82uni1D83uni1D84uni1D85uni1D86uni1D87uni1D88uni1D89uni1D8Auni1D8Buni1D8Cuni1D8Duni1D8Euni1D8Funi1D90uni1D91uni1D92uni1D93uni1D94uni1D95uni1D96uni1D97uni1D98uni1D99uni1D9Auni1D9Buni1D9Cuni1D9Duni1D9Eereversedopenmoduni1DA0uni1DA1uni1DA2uni1DA3uni1DA4uni1DA5iotaserifedmodiotaserifedstrokemoduni1DA8uni1DA9uni1DAAuni1DABuni1DACuni1DADuni1DAEuni1DAFuni1DB0uni1DB1phimodlatinuni1DB3uni1DB4uni1DB5uni1DB6uni1DB7uni1DB8uni1DB9uni1DBAuni1DBBuni1DBCuni1DBDuni1DBEuni1DBFuni1DC0uni1DC1uni1DC2uni1DC3uni1DC4uni1DC5uni1DC6uni1DC7uni1DC8uni1DC9uni1DCAuni1DCBuni1DCCuni1DCDuni1DCEuni1DCFuni1DD0uni1DD1uni1DD2uni1DD3uni1DD4uni1DD5uni1DD6uni1DD7uni1DD8uni1DD9uni1DDAuni1DDBuni1DDCuni1DDDuni1DDEuni1DDFuni1DE0uni1DE1uni1DE2uni1DE3uni1DE4uni1DE5uni1DE6uni1DE7uni1DE8uni1DE9uni1DEAuni1DEBuni1DECuni1DEDuni1DEEuni1DEFuni1DF0uni1DF1uni1DF2uni1DF3uni1DF4uni1DF5kavykaaboverightcmbkavykaaboveleftcmbdotaboveleftcmbwideinvertedbridgebelowcmbdeletionmarkcmbuni1DFCuni1DFDuni1DFEuni1DFFuni1E00uni1E01uni1E02uni1E03uni1E04uni1E05uni1E06uni1E07uni1E08uni1E09uni1E0Auni1E0Buni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11uni1E12uni1E13uni1E14uni1E15uni1E16uni1E17uni1E18uni1E19uni1E1Auni1E1Buni1E1Cuni1E1Duni1E1Euni1E1Funi1E20uni1E21uni1E22uni1E23uni1E24uni1E25uni1E26uni1E27uni1E28uni1E29uni1E2Auni1E2Buni1E2Cuni1E2Duni1E2Euni1E2Funi1E30uni1E31uni1E32uni1E33uni1E34uni1E35uni1E36uni1E37uni1E38uni1E39uni1E3Auni1E3Buni1E3Cuni1E3Duni1E3Euni1E3Funi1E40uni1E41uni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Auni1E4Buni1E4Cuni1E4Duni1E4Euni1E4Funi1E50uni1E51uni1E52uni1E53uni1E54uni1E55uni1E56uni1E57uni1E58uni1E59uni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E64uni1E65uni1E66uni1E67uni1E68uni1E69uni1E6Auni1E6Buni1E6Cuni1E6Duni1E6Euni1E6Funi1E70uni1E71uni1E72uni1E73uni1E74uni1E75uni1E76uni1E77uni1E78uni1E79uni1E7Auni1E7Buni1E7Cuni1E7Duni1E7Euni1E7FWgravewgraveWacutewacute	Wdieresis	wdieresisuni1E86uni1E87uni1E88uni1E89uni1E8Auni1E8Buni1E8Cuni1E8Duni1E8Euni1E8Funi1E90uni1E91uni1E92uni1E93uni1E94uni1E95uni1E96uni1E97uni1E98uni1E99uni1E9Auni1E9Buni1E9Cuni1E9Duni1E9Euni1E9Funi1EA0uni1EA1uni1EA2uni1EA3uni1EA4uni1EA5uni1EA6uni1EA7uni1EA8uni1EA9uni1EAAuni1EABuni1EACuni1EADuni1EAEuni1EAFuni1EB0uni1EB1uni1EB2uni1EB3uni1EB4uni1EB5uni1EB6uni1EB7uni1EB8uni1EB9uni1EBAuni1EBBuni1EBCuni1EBDuni1EBEuni1EBFuni1EC0uni1EC1uni1EC2uni1EC3uni1EC4uni1EC5uni1EC6uni1EC7uni1EC8uni1EC9uni1ECAuni1ECBuni1ECCuni1ECDuni1ECEuni1ECFuni1ED0uni1ED1uni1ED2uni1ED3uni1ED4uni1ED5uni1ED6uni1ED7uni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EDEuni1EDFuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE6uni1EE7uni1EE8uni1EE9uni1EEAuni1EEBuni1EECuni1EEDuni1EEEuni1EEFuni1EF0uni1EF1Ygraveygraveuni1EF4uni1EF5uni1EF6uni1EF7uni1EF8uni1EF9uni1EFAuni1EFBuni1EFCuni1EFDuni1EFEuni1EFFuni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBCuni1FBDuni1FBEuni1FBFuni1FC0uni1FC1uni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCCuni1FCDuni1FCEuni1FCFuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDBuni1FDDuni1FDEuni1FDFuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECuni1FEDuni1FEEuni1FEFuni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCuni1FFDuni1FFEuni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni200Buni200Cuni200Duni200Euni200Funi2010uni2011
figuredashuni2015uni2016
underscoredbl
quotereverseduni201Funi2023onedotenleadertwodotenleaderuni2027uni2028uni2029uni202Auni202Buni202Cuni202Duni202Euni202Funi2031minuteseconduni2034uni2035uni2036uni2037uni2038uni203B	exclamdbluni203Duni203Euni203Funi2040uni2041uni2042uni2043uni2045uni2046uni2047uni2048uni2049uni204Auni204Buni204Cuni204Duni204Euni204Funi2050uni2051uni2052uni2053uni2054uni2055uni2056uni2057uni2058uni2059uni205Auni205Buni205Cuni205Duni205Euni205Funi2060uni2061uni2062uni2063uni2064uni2066uni2067uni2068uni2069uni206Auni206Buni206Cuni206Duni206Euni206Funi2070uni2071uni2074uni2075uni2076uni2077uni2078uni2079uni207Auni207Buni207Cuni207Duni207Euni207Funi2080uni2081uni2082uni2083uni2084uni2085uni2086uni2087uni2088uni2089uni208Auni208Buni208Cuni208Duni208Euni2090uni2091uni2092uni2093uni2094uni2095uni2096uni2097uni2098uni2099uni209Auni209Buni209Cuni20A0
colonmonetaryuni20A2lirauni20A5uni20A6pesetauni20A8uni20A9uni20AAdongEurouni20ADuni20AEuni20AFuni20B0uni20B1uni20B2uni20B3uni20B4uni20B5uni20B6uni20B7uni20B8uni20B9uni20BAuni20BBuni20BCuni20BDuni20BEuni20BFuni20F0uni2100uni2101uni2102uni2103uni2104uni2105uni2106uni2107uni2108uni2109uni210Auni210Buni210Cuni210Duni210Euni210Funi2110uni2111uni2112uni2113uni2114uni2115uni2116uni2117weierstrassuni2119uni211Auni211Buni211Cuni211Dprescriptionuni211Funi2120uni2121uni2123uni2124uni2125uni2126uni2127uni2128uni2129uni212Auni212Buni212Cuni212D	estimateduni212Funi2130uni2131uni2132uni2133uni2134uni2135uni2136uni2137uni2138uni2139uni213Auni213Buni213Cuni213Duni213Euni213Funi2140uni2141uni2142uni2143uni2144uni2145uni2146uni2147uni2148uni2149uni214Auni214Buni214Cuni214Duni214Euni214Funi2150uni2151uni2152uni2153uni2154uni2155uni2156uni2157uni2158uni2159uni215A	oneeighththreeeighthsfiveeighthsseveneighthsuni215Funi2184uni2189
minus.devauni25CCuni2C60uni2C61uni2C62uni2C63uni2C64uni2C65uni2C66uni2C67uni2C68uni2C69uni2C6Auni2C6Buni2C6Cuni2C6Duni2C6Euni2C6Funi2C70uni2C71uni2C72uni2C73uni2C74uni2C75uni2C76uni2C77uni2C78uni2C79uni2C7Auni2C7Buni2C7Cuni2C7Duni2C7Euni2C7Fbecombcyvecombcy	ghecombcydecombcy	zhecombcyzecombcykacombcyelcombcyemcombcyencombcyocombcypecombcyercombcyescombcytecombcyhacombcy	tsecombcy	checombcy	shacombcyshchacombcy
fitacombcy
estecombcyacombcyiecombcydjervcombcymonographukcombcy	yatcombcyyucombcyiotifiedacombcylittleyuscombcybigyuscombcyiotifiedbigyuscombcyuni2E00uni2E01uni2E02uni2E03uni2E04uni2E05uni2E06uni2E07uni2E08uni2E09uni2E0Auni2E0Buni2E0Cuni2E0Duni2E0Euni2E0Funi2E10uni2E11uni2E12uni2E13uni2E14uni2E15uni2E16uni2E17uni2E18uni2E19uni2E1Auni2E1Buni2E1Cuni2E1Duni2E1Euni2E1Funi2E20uni2E21uni2E22uni2E23uni2E24uni2E25uni2E26uni2E27uni2E28uni2E29uni2E2Auni2E2Buni2E2Cuni2E2Duni2E2Euni2E2Funi2E30uni2E31uni2E32uni2E33uni2E34uni2E35uni2E36uni2E37uni2E38uni2E39uni2E3Auni2E3Buni2E3Cuni2E3Duni2E3Euni2E3Funi2E40uni2E41uni2E42dashwithupturnleft
suspensiondblkavykainvertedlow kavykawithkavykaaboveinvertedlow	kavykalowkavykawithdotlowstackedcommadbl
solidusdottedtripledagger
medievalcommaparagraphuspunctuselevatuscornishversedividercrosspattyrightcrosspattyleftTironiansignetuniA640uniA641uniA642uniA643
Dzereversedcy
dzereversedcyuniA646uniA647uniA648uniA649
Ukmonographcy
ukmonographcyOmegabroadcyomegabroadcyYerneutralcyyerneutralcy
Yerubackyercy
yerubackyercy
Yatiotifiedcy
yatiotifiedcyYureversedcyyureversedcyIotifiedacyuniA657YusclosedlittlecyyusclosedlittlecyYusblendedcyyusblendedcyYusiotifiedclosedlittlecyyusiotifiedclosedlittlecyuniA65EuniA65F
Tsereversedcy
tsereversedcyDesoftcydesoftcyElsoftcyelsoftcyEmsoftcyemsoftcyOmonocularcyomonocularcyObinocularcyobinocularcyOdoublemonocularcyodoublemonocularcyuniA66EuniA66FuniA670uniA671uniA672uniA673uniA674uniA675uniA676uniA677uniA678uniA679uniA67AuniA67BuniA67CuniA67DuniA67EuniA67FuniA680uniA681uniA682uniA683uniA684uniA685uniA686uniA687uniA688uniA689TewithmiddlehookcyuniA68BuniA68CuniA68DuniA68EuniA68FuniA690uniA691uniA692uniA693uniA694uniA695uniA696uniA697	Odoublecy	odoublecy
Ocrossedcy
ocrossedcyuniA69CuniA69DuniA69EuniA69FuniA700uniA701uniA702uniA703uniA704uniA705uniA706uniA707uniA708uniA709uniA70AuniA70BuniA70CuniA70DuniA70EuniA70FuniA710uniA711uniA712uniA713uniA714uniA715uniA716uniA717uniA718uniA719uniA71AuniA71BuniA71CuniA71DuniA71EuniA71FuniA720uniA721uniA722uniA723uniA724uniA725uniA726uniA727uniA728uniA729uniA72AuniA72BuniA72CuniA72DuniA72EuniA72FuniA730uniA731uniA732uniA733uniA734uniA735uniA736uniA737uniA738uniA739uniA73AuniA73BuniA73CuniA73DuniA73EuniA73FuniA740uniA741uniA742uniA743uniA744uniA745uniA746uniA747uniA748uniA749uniA74AuniA74BuniA74CuniA74DuniA74EuniA74FuniA750uniA751uniA752uniA753uniA754uniA755uniA756uniA757uniA758uniA759uniA75AuniA75B
RumrotundauniA75DuniA75EuniA75FuniA760uniA761uniA762uniA763uniA764uniA765uniA766uniA767uniA768uniA769uniA76AuniA76BuniA76CuniA76DuniA76EuniA76FuniA770uniA771uniA772uniA773uniA774uniA775uniA776uniA777uniA778uniA779uniA77AuniA77BuniA77CuniA77DuniA77EuniA77FuniA780uniA781uniA782uniA783uniA784uniA785uniA786uniA787uniA788uniA789uniA78AuniA78BuniA78CuniA78DuniA78EuniA78FuniA790uniA791uniA792uniA793cpalatalhookhpalatalhook	Bflourish	bflourishFstrokefstroke	Aevolapuk	aevolapuk	Oevolapuk	oevolapuk	Uevolapuk	uevolapukuniA7A0uniA7A1uniA7A2uniA7A3uniA7A4uniA7A5uniA7A6uniA7A7uniA7A8uniA7A9uniA7AA
EreversedopenuniA7ACuniA7ADIotaserifedQsmalluniA7B0uniA7B1uniA7B2uniA7B3uniA7B4uniA7B5uniA7B6uniA7B7Ustrokeuni1D7EAglottalaglottalIglottaliglottalUglottaluglottal
Wanglicana
wanglicanaCpalatalhookShookZpalatalhook
Dmiddlestroke
dmiddlestroke
Smiddlestroke
smiddlestrokeHalfhturnedhalfhturneduniA7F7uniA7F8uniA7F9uniA7FAuniA7FBuniA7FCuniA7FDuniA7FEuniA7FFuniA830uniA831uniA832uniA833uniA834uniA835uniA836uniA837uniA838uniA839uniA8E0uniA8E1uniA8E2uniA8E3uniA8E4uniA8E5uniA8E6uniA8E7uniA8E8uniA8E9uniA8EAuniA8EBuniA8ECuniA8EDuniA8EEuniA8EFuniA8F0uniA8F1uniA8F2uniA8F3uniA8F4uniA8F5uniA8F6uniA8F7uniA8F8uniA8F9uniA8FAuniA8FBuniA8FCuniA8FDaydevaayvowelsigndevauniA92EuniAB30uniAB31uniAB32uniAB33uniAB34uniAB35uniAB36uniAB37uniAB38uniAB39uniAB3AuniAB3BuniAB3CuniAB3DuniAB3EuniAB3FuniAB40uniAB41uniAB42uniAB43uniAB44uniAB45uniAB46uniAB47uniAB48uniAB49uniAB4AuniAB4BuniAB4CuniAB4DuniAB4EuniAB4FuniAB50uniAB51uniAB52uniAB53uniAB54uniAB55uniAB56uniAB57uniAB58uniAB59uniAB5AuniAB5BuniAB5CuniAB5DuniAB5EuniAB5Fsakhayat	iotifiedeoeopenuouniAB64uniAB65dzdigraphretroflexhooktsdigraphretroflexhookrmiddletildeturned
wturnedmodlefttackmodrighttackmodf_ff_f_if_f_llongs_ts_tuniFE00uniFE20uniFE21uniFE22uniFE23uniFE24uniFE25uniFE26uniFE27uniFE28uniFE29uniFE2AuniFE2BuniFE2CuniFE2DuniFE2EuniFE2FuniFEFFuniFFFCuniFFFDEng.alt1Eng.alt2Eng.alt3uni030103060308uni030003060308uni030103040308uni030003040308uni013B.loclMAHuni0145.loclMAHAogonek.loclNAVEogonek.loclNAVIogonek.loclNAVUogonek.loclNAVI.saltIJ.saltIacute.saltIbreve.saltuni01CF.saltIcircumflex.saltuni0208.saltIdieresis.saltuni1E2E.saltIdotaccent.saltuni1ECA.saltIgrave.saltuni1EC8.saltuni020A.saltImacron.saltIogonek.saltIogonek_loclNAV.saltItilde.saltuni1E2C.saltJ.saltJcircumflex.saltuni01C7.saltuni01CA.saltuni013C.loclMAHuni0146.loclMAHaogonek.loclNAVeogonek.loclNAVuogonek.loclNAV	i_sc.saltiacute_sc.saltibreve_sc.salticircumflex_sc.saltidieresis_sc.saltidotaccent_sc.saltigrave_sc.salt
ij_sc.saltimacron_sc.saltiogonek_sc.saltitilde_sc.salt	j_sc.saltjcircumflex_sc.salta.sc	aacute.sc	abreve.scacircumflex.scadieresis.sc	agrave.sc
amacron.sc
aogonek.scaring.sc
aringacute.sc	atilde.scae.sc
aeacute.scb.scc.sc	cacute.sc	ccaron.scccedilla.scccircumflex.sc
cdotaccent.scd.sceth.sc	dcaron.sc	dcroat.sce.sc	eacute.sc	ebreve.sc	ecaron.scecircumflex.scedieresis.sc
edotaccent.sc	egrave.sc
emacron.sc
eogonek.scf.scg.sc	gbreve.scgcircumflex.sc
uni0123.sc
gdotaccent.sch.schbar.schcircumflex.sci.sc	iacute.sc	ibreve.scicircumflex.scidieresis.sci.loclTRK.sc	igrave.scij.sc
imacron.sc
iogonek.sc	itilde.scj.scjcircumflex.sck.sc
uni0137.scl.sc	lacute.sc	lcaron.sc
uni013C.scldot.sc	lslash.scm.scn.sc	nacute.sc	ncaron.sc
uni0146.sceng.sc	ntilde.sco.sc	oacute.sc	obreve.scocircumflex.scodieresis.sc	ograve.scohungarumlaut.sc
omacron.sc	oslash.scoslashacute.sc	otilde.scoe.scp.scthorn.scq.scr.sc	racute.sc	rcaron.sc
uni0157.scs.sc	sacute.sc	scaron.scscedilla.scscircumflex.sc
uni0219.sc
germandbls.sct.sctbar.sc	tcaron.sc
uni0163.sc
uni021B.scu.sc	uacute.sc	ubreve.scucircumflex.scudieresis.sc	ugrave.scuhungarumlaut.sc
umacron.sc
uogonek.scuring.sc	utilde.scv.scw.sc	wacute.scwcircumflex.scwdieresis.sc	wgrave.scx.scy.sc	yacute.scycircumflex.scydieresis.sc	ygrave.scz.sc	zacute.sc	zcaron.sc
zdotaccent.scuniA7F7.saltuni0406.saltuni0407.saltuni0408.saltuni04C0.saltuni0431.loclSRBuni04CF.salt	Iota.saltIotatonos.saltIotadieresis.saltuni1D35.saltuni1D36.salt	zero.tosfone.tosftwo.tosf
three.tosf	four.tosf	five.tosfsix.tosf
seven.tosf
eight.tosf	nine.tosfzero.osfone.osftwo.osf	three.osffour.osffive.osfsix.osf	seven.osf	eight.osfnine.osfzero.lfone.lftwo.lfthree.lffour.lffive.lfsix.lfseven.lfeight.lfnine.lf
zero.slash	zero.dnomone.dnomtwo.dnom
three.dnom	four.dnom	five.dnomsix.dnom
seven.dnom
eight.dnom	nine.dnom	zero.numrone.numrtwo.numr
three.numr	four.numr	five.numrsix.numr
seven.numr
eight.numr	nine.numrparenleft.sc
parenright.scbraceleft.sc
braceright.scbracketleft.scbracketright.sc	exclam.sc
exclamdown.scquestion.scquestiondown.scexclamdbl.scguilsinglleft.scguilsinglright.sc
fhook.ss03summationDoubleStruck.miruni02E502E502E9uni02E502E502E6uni02E502E502E8uni02E502E502E7uni02E502E9uni02E502E902E5uni02E502E902E9uni02E502E902E6uni02E502E902E8uni02E502E902E7uni02E502E6uni02E502E602E5uni02E502E602E9uni02E502E602E6uni02E502E602E8uni02E502E602E7uni02E502E8uni02E502E802E5uni02E502E802E9uni02E502E802E6uni02E502E802E8uni02E502E802E7uni02E502E7uni02E502E702E5uni02E502E702E9uni02E502E702E6uni02E502E702E8uni02E502E702E7uni02E902E5uni02E902E502E5uni02E902E502E9uni02E902E502E6uni02E902E502E8uni02E902E502E7uni02E902E902E5uni02E902E902E6uni02E902E902E8uni02E902E902E7uni02E902E6uni02E902E602E5uni02E902E602E9uni02E902E602E6uni02E902E602E8uni02E902E602E7uni02E902E8uni02E902E802E5uni02E902E802E9uni02E902E802E6uni02E902E802E8uni02E902E802E7uni02E902E7uni02E902E702E5uni02E902E702E9uni02E902E702E6uni02E902E702E8uni02E902E702E7uni02E602E5uni02E602E502E5uni02E602E502E9uni02E602E502E6uni02E602E502E8uni02E602E502E7uni02E602E9uni02E602E902E5uni02E602E902E9uni02E602E902E6uni02E602E902E8uni02E602E902E7uni02E602E602E5uni02E602E602E9uni02E602E602E8uni02E602E602E7uni02E602E8uni02E602E802E5uni02E602E802E9uni02E602E802E6uni02E602E802E8uni02E602E802E7uni02E602E7uni02E602E702E5uni02E602E702E9uni02E602E702E6uni02E602E702E8uni02E602E702E7uni02E802E5uni02E802E502E5uni02E802E502E9uni02E802E502E6uni02E802E502E8uni02E802E502E7uni02E802E9uni02E802E902E5uni02E802E902E9uni02E802E902E6uni02E802E902E8uni02E802E902E7uni02E802E6uni02E802E602E5uni02E802E602E9uni02E802E602E6uni02E802E602E8uni02E802E602E7uni02E802E802E5uni02E802E802E9uni02E802E802E6uni02E802E802E7uni02E802E7uni02E802E702E5uni02E802E702E9uni02E802E702E6uni02E802E702E8uni02E802E702E7uni02E702E5uni02E702E502E5uni02E702E502E9uni02E702E502E6uni02E702E502E8uni02E702E502E7uni02E702E9uni02E702E902E5uni02E702E902E9uni02E702E902E6uni02E702E902E8uni02E702E902E7uni02E702E6uni02E702E602E5uni02E702E602E9uni02E702E602E6uni02E702E602E8uni02E702E602E7uni02E702E8uni02E702E802E5uni02E702E802E9uni02E702E802E6uni02E702E802E8uni02E702E802E7uni02E702E702E5uni02E702E702E9uni02E702E702E6uni02E702E702E8ampersand.sc
uni0308.sc
uni0307.scgravecomb.scacutecomb.sc
uni030B.sc
uni0302.sc
uni030C.sc
uni0306.sc
uni030A.sctildecomb.sc
uni0304.sc
uni0328.sc	macron.sc
idotlesscyjedotlesscyiogonekdotlessjstrokedotlessjcrossedtaildotlessjmoddotless
yotdotlessisubscriptdotlessiretroflexhookdotlessistrokemoddotlessjcrossedtailmoddotlessitildebelowdotlessidotbelowdotlessistrokedotlessimoddotlessiitalicDoubleStruckdotlessjitalicDoubleStruckdotlessjsubscriptdotless
uni1FBC.ad
uni1F88.ad
uni1F89.ad
uni1F8A.ad
uni1F8B.ad
uni1F8C.ad
uni1F8D.ad
uni1F8E.ad
uni1F8F.ad
uni1FCC.ad
uni1F98.ad
uni1F99.ad
uni1F9A.ad
uni1F9B.ad
uni1F9C.ad
uni1F9D.ad
uni1F9E.ad
uni1F9F.ad
uni1FFC.ad
uni1FA8.ad
uni1FA9.ad
uni1FAA.ad
uni1FAB.ad
uni1FAC.ad
uni1FAD.ad
uni1FAE.ad
uni1FAF.aduni037F.saltuni1F38.saltuni1F39.saltuni1F3A.saltuni1F3B.saltuni1F3C.saltuni1F3D.saltuni1F3E.saltuni1F3F.saltuni1FDA.saltuni1FDB.saltuni03B1030603130300uni03B1030603130301uni03B1030603140300uni03B1030603140301uni03B1030403130300uni03B1030403130301uni03B1030403140300uni03B1030403140301uni03B9030803060300uni03B9030803060301uni03B9030803040300uni03B9030803040301uni03B9030603130300uni03B9030603130301uni03B9030603140300uni03B9030603140301uni03B9030403130300uni03B9030403130301uni03B9030403140300uni03B9030403140301uni03C5030803060300uni03C5030803040300uni03C5030803040301uni03C5030603130300uni03C5030603130301uni03C5030603140300uni03C5030603140301uni03C5030403130300uni03C5030403130301uni03C5030403140300uni03C5030403140301uni03D0.altphi.saltalpha.scbeta.scgamma.scdelta.sc
epsilon.sczeta.sceta.sctheta.sciota.sckappa.sc	lambda.sc
uni03BC.scnu.scxi.sc
omicron.scpi.scrho.sc
uni03C2.scsigma.sctau.sc
upsilon.scphi.scchi.scpsi.scomega.sciotatonos.sciotadieresis.sciotadieresistonos.scupsilontonos.scupsilondieresis.scupsilondieresistonos.scomicrontonos.sc
omegatonos.sc
alphatonos.scepsilontonos.scetatonos.sc
uni03D7.sc
uni1F00.sc
uni1F01.sc
uni1F02.sc
uni1F03.sc
uni1F04.sc
uni1F05.sc
uni1F06.sc
uni1F07.sc
uni1F70.sc
uni1F71.sc
uni1FB6.sc
uni1FB0.sc
uni1FB1.sc
uni1FB3.sc
uni1FB2.sc
uni1FB4.sc
uni1F80.sc
uni1F81.sc
uni1F82.sc
uni1F83.sc
uni1F84.sc
uni1F85.sc
uni1F86.sc
uni1F87.sc
uni1FB7.sc
uni1F10.sc
uni1F11.sc
uni1F12.sc
uni1F13.sc
uni1F14.sc
uni1F15.sc
uni1F72.sc
uni1F73.sc
uni1F20.sc
uni1F21.sc
uni1F22.sc
uni1F23.sc
uni1F24.sc
uni1F25.sc
uni1F26.sc
uni1F27.sc
uni1F74.sc
uni1F75.sc
uni1FC6.sc
uni1FC3.sc
uni1FC2.sc
uni1FC4.sc
uni1F90.sc
uni1F91.sc
uni1F92.sc
uni1F93.sc
uni1F94.sc
uni1F95.sc
uni1F96.sc
uni1F97.sc
uni1FC7.sc
uni1F30.sc
uni1F31.sc
uni1F32.sc
uni1F33.sc
uni1F34.sc
uni1F35.sc
uni1F36.sc
uni1F37.sc
uni1F76.sc
uni1F77.sc
uni1FD6.sc
uni1FD0.sc
uni1FD1.sc
uni1FD2.sc
uni1FD3.sc
uni1FD7.sc
uni1F40.sc
uni1F41.sc
uni1F42.sc
uni1F43.sc
uni1F44.sc
uni1F45.sc
uni1F78.sc
uni1F79.sc
uni1FE4.sc
uni1FE5.sc
uni1F50.sc
uni1F51.sc
uni1F52.sc
uni1F53.sc
uni1F54.sc
uni1F55.sc
uni1F56.sc
uni1F57.sc
uni1F7A.sc
uni1F7B.sc
uni1FE6.sc
uni1FE0.sc
uni1FE1.sc
uni1FE2.sc
uni1FE3.sc
uni1FE7.sc
uni1F60.sc
uni1F61.sc
uni1F62.sc
uni1F63.sc
uni1F64.sc
uni1F65.sc
uni1F66.sc
uni1F67.sc
uni1F7C.sc
uni1F7D.sc
uni1FF6.sc
uni1FF3.sc
uni1FF2.sc
uni1FF4.sc
uni1FA0.sc
uni1FA1.sc
uni1FA2.sc
uni1FA3.sc
uni1FA4.sc
uni1FA5.sc
uni1FA6.sc
uni1FA7.sc
uni1FF7.sc
uni1FB3.sc.ad
uni1FB2.sc.ad
uni1FB4.sc.ad
uni1F80.sc.ad
uni1F81.sc.ad
uni1F82.sc.ad
uni1F83.sc.ad
uni1F84.sc.ad
uni1F85.sc.ad
uni1F86.sc.ad
uni1F87.sc.ad
uni1FB7.sc.ad
uni1FC3.sc.ad
uni1FC2.sc.ad
uni1FC4.sc.ad
uni1F90.sc.ad
uni1F91.sc.ad
uni1F92.sc.ad
uni1F93.sc.ad
uni1F94.sc.ad
uni1F95.sc.ad
uni1F96.sc.ad
uni1F97.sc.ad
uni1FC7.sc.ad
uni1FF3.sc.ad
uni1FF2.sc.ad
uni1FF4.sc.ad
uni1FA0.sc.ad
uni1FA1.sc.ad
uni1FA2.sc.ad
uni1FA3.sc.ad
uni1FA4.sc.ad
uni1FA5.sc.ad
uni1FA6.sc.ad
uni1FA7.sc.ad
uni1FF7.sc.adiotatonos.sc.ss06iotadieresis.sc.ss06iotadieresistonos.sc.ss06upsilontonos.sc.ss06upsilondieresis.sc.ss06upsilondieresistonos.sc.ss06omicrontonos.sc.ss06omegatonos.sc.ss06alphatonos.sc.ss06epsilontonos.sc.ss06etatonos.sc.ss06uni1F00.sc.ss06uni1F01.sc.ss06uni1F02.sc.ss06uni1F03.sc.ss06uni1F04.sc.ss06uni1F05.sc.ss06uni1F06.sc.ss06uni1F07.sc.ss06uni1F70.sc.ss06uni1F71.sc.ss06uni1FB6.sc.ss06uni1FB0.sc.ss06uni1FB1.sc.ss06uni1FB3.sc.ss06uni1FB2.sc.ss06uni1FB4.sc.ss06uni1F80.sc.ss06uni1F81.sc.ss06uni1F82.sc.ss06uni1F83.sc.ss06uni1F84.sc.ss06uni1F85.sc.ss06uni1F86.sc.ss06uni1F87.sc.ss06uni1FB7.sc.ss06uni1F10.sc.ss06uni1F11.sc.ss06uni1F12.sc.ss06uni1F13.sc.ss06uni1F14.sc.ss06uni1F15.sc.ss06uni1F72.sc.ss06uni1F73.sc.ss06uni1F20.sc.ss06uni1F21.sc.ss06uni1F22.sc.ss06uni1F23.sc.ss06uni1F24.sc.ss06uni1F25.sc.ss06uni1F26.sc.ss06uni1F27.sc.ss06uni1F74.sc.ss06uni1F75.sc.ss06uni1FC6.sc.ss06uni1FC3.sc.ss06uni1FC2.sc.ss06uni1FC4.sc.ss06uni1F90.sc.ss06uni1F91.sc.ss06uni1F92.sc.ss06uni1F93.sc.ss06uni1F94.sc.ss06uni1F95.sc.ss06uni1F96.sc.ss06uni1F97.sc.ss06uni1FC7.sc.ss06uni1F30.sc.ss06uni1F31.sc.ss06uni1F32.sc.ss06uni1F33.sc.ss06uni1F34.sc.ss06uni1F35.sc.ss06uni1F36.sc.ss06uni1F37.sc.ss06uni1F76.sc.ss06uni1F77.sc.ss06uni1FD6.sc.ss06uni1FD0.sc.ss06uni1FD1.sc.ss06uni1FD2.sc.ss06uni1FD3.sc.ss06uni1FD7.sc.ss06uni1F40.sc.ss06uni1F41.sc.ss06uni1F42.sc.ss06uni1F43.sc.ss06uni1F44.sc.ss06uni1F45.sc.ss06uni1F78.sc.ss06uni1F79.sc.ss06uni1FE4.sc.ss06uni1FE5.sc.ss06uni1F50.sc.ss06uni1F51.sc.ss06uni1F52.sc.ss06uni1F53.sc.ss06uni1F54.sc.ss06uni1F55.sc.ss06uni1F56.sc.ss06uni1F57.sc.ss06uni1F7A.sc.ss06uni1F7B.sc.ss06uni1FE6.sc.ss06uni1FE0.sc.ss06uni1FE1.sc.ss06uni1FE2.sc.ss06uni1FE3.sc.ss06uni1FE7.sc.ss06uni1F60.sc.ss06uni1F61.sc.ss06uni1F62.sc.ss06uni1F63.sc.ss06uni1F64.sc.ss06uni1F65.sc.ss06uni1F66.sc.ss06uni1F67.sc.ss06uni1F7C.sc.ss06uni1F7D.sc.ss06uni1FF6.sc.ss06uni1FF3.sc.ss06uni1FF2.sc.ss06uni1FF4.sc.ss06uni1FA0.sc.ss06uni1FA1.sc.ss06uni1FA2.sc.ss06uni1FA3.sc.ss06uni1FA4.sc.ss06uni1FA5.sc.ss06uni1FA6.sc.ss06uni1FA7.sc.ss06uni1FF7.sc.ss06uni1FB3.sc.ad.ss06uni1FB2.sc.ad.ss06uni1FB4.sc.ad.ss06uni1F80.sc.ad.ss06uni1F81.sc.ad.ss06uni1F82.sc.ad.ss06uni1F83.sc.ad.ss06uni1F84.sc.ad.ss06uni1F85.sc.ad.ss06uni1F86.sc.ad.ss06uni1F87.sc.ad.ss06uni1FB7.sc.ad.ss06uni1FC3.sc.ad.ss06uni1FC2.sc.ad.ss06uni1FC4.sc.ad.ss06uni1F90.sc.ad.ss06uni1F91.sc.ad.ss06uni1F92.sc.ad.ss06uni1F93.sc.ad.ss06uni1F94.sc.ad.ss06uni1F95.sc.ad.ss06uni1F96.sc.ad.ss06uni1F97.sc.ad.ss06uni1FC7.sc.ad.ss06uni1FF3.sc.ad.ss06uni1FF2.sc.ad.ss06uni1FF4.sc.ad.ss06uni1FA0.sc.ad.ss06uni1FA1.sc.ad.ss06uni1FA2.sc.ad.ss06uni1FA3.sc.ad.ss06uni1FA4.sc.ad.ss06uni1FA5.sc.ad.ss06uni1FA6.sc.ad.ss06uni1FA7.sc.ad.ss06uni1FF7.sc.ad.ss06anoteleia.sc
tonos.caseuni1FBF.caseuni1FBD.caseuni1FFE.caseuni1FDD.caseuni1FCE.caseuni1FDE.caseuni1FCF.caseuni1FDF.caseuni1FED.caseuni1FEE.caseuni1FC1.caseuni1FEF.caseuni1FFD.caseuni1FC0.caseuni1FCD.casetonos.scdieresistonos.sc
uni1FBF.sc
uni1FBD.sc
uni1FFE.sc
uni1FCD.sc
uni1FDD.sc
uni1FCE.sc
uni1FDE.sc
uni1FCF.sc
uni1FDF.sc
uni1FED.sc
uni1FEE.sc
uni1FC1.sc
uni1FEF.sc
uni1FFD.sc
uni1FC0.scnullCR_1space_1	uni02BC_1ashortnuktadeva
anuktadevaaanuktadeva
inuktadevaiinuktadeva
unuktadevauunuktadevarvocalicnuktadevalvocalicnuktadevaecandranuktadevaeshortnuktadeva
enuktadevaainuktadevaocandranuktadevaoshortnuktadeva
onuktadevaaunuktadevarrvocalicnuktadevallvocalicnuktadevaacandranuktadevaghanuktadevanganuktadevacanuktadevachanuktadevajhanuktadevanyanuktadevattanuktadeva
tthanuktadevannanuktadevatanuktadevathanuktadevadanuktadevadhanuktadevapanuktadevabanuktadevabhanuktadevamanuktadevalanuktadevavanuktadevashanuktadevassanuktadevasanuktadevahanuktadeva	kassadeva	janyadevarephdeva	vattudeva
kaprehalfdevakhaprehalfdeva
gaprehalfdevaghaprehalfdevangaprehalfdeva
caprehalfdevachaprehalfdeva
japrehalfdevajhaprehalfdevanyaprehalfdevattaprehalfdevatthaprehalfdevaddaprehalfdevaddhaprehalfdevannaprehalfdeva
taprehalfdevathaprehalfdeva
daprehalfdevadhaprehalfdeva
naprehalfdeva
paprehalfdevaphaprehalfdeva
baprehalfdevabhaprehalfdeva
maprehalfdeva
yaprehalfdeva
raprehalfdeva
laprehalfdevallaprehalfdeva
vaprehalfdevashaprehalfdevassaprehalfdeva
saprehalfdeva
haprehalfdevazhaprehalfdevaheavyyaprehalfdevakassaprehalfdevajanyaprehalfdevakanuktaprehalfdevakhanuktaprehalfdevaganuktaprehalfdevaghanuktaprehalfdevanganuktaprehalfdevacanuktaprehalfdevachanuktaprehalfdevajanuktaprehalfdevajhanuktaprehalfdevanyanuktaprehalfdevattanuktaprehalfdevatthanuktaprehalfdevaddanuktaprehalfdevaddhanuktaprehalfdevannanuktaprehalfdevatanuktaprehalfdevathanuktaprehalfdevadanuktaprehalfdevadhanuktaprehalfdevananuktaprehalfdevapanuktaprehalfdevaphanuktaprehalfdevabanuktaprehalfdevabhanuktaprehalfdevamanuktaprehalfdevayanuktaprehalfdevalanuktaprehalfdevallanuktaprehalfdevavanuktaprehalfdevashanuktaprehalfdevassanuktaprehalfdevasanuktaprehalfdevahanuktaprehalfdevakaradeva	kharadevagaradeva	gharadeva	ngaradevacaradeva	charadevajaradeva	jharadeva	nyaradeva	ttaradeva
ttharadeva	ddaradeva
ddharadeva	nnaradevataradeva	tharadevadaradeva	dharadevanaradevaparadeva	pharadevabaradeva	bharadevamaradevayaradevararadevalaradeva	llaradevavaradeva	sharadeva	ssaradevasaradevaharadevamarwariddaradeva	zharadeva
heavyyaradevakassaradevajanyaradeva
kanuktaradevakhanuktaradeva
ganuktaradevaghanuktaradevanganuktaradeva
canuktaradevachanuktaradeva
januktaradevajhanuktaradevanyanuktaradevattanuktaradevatthanuktaradevaddanuktaradevaddhanuktaradevannanuktaradeva
tanuktaradevathanuktaradeva
danuktaradevadhanuktaradeva
nanuktaradeva
panuktaradevaphanuktaradeva
banuktaradevabhanuktaradeva
manuktaradeva
yanuktaradeva
ranuktaradeva
lanuktaradevallanuktaradeva
vanuktaradevashanuktaradevassanuktaradeva
sanuktaradeva
hanuktaradevakaraprehalfdevakharaprehalfdevagaraprehalfdevagharaprehalfdevangaraprehalfdevangaraprehalfUIdevacaraprehalfdevacharaprehalfdevajaraprehalfdevajharaprehalfdevanyaraprehalfdevattaraprehalfdevattaraprehalfUIdevattharaprehalfdevattharaprehalfUIdevaddaraprehalfdevaddaraprehalfUIdevaddharaprehalfdevaddharaprehalfUIdevannaraprehalfdevataraprehalfdevatharaprehalfdevadaraprehalfdevadharaprehalfdevanaraprehalfdevaparaprehalfdevapharaprehalfdevabaraprehalfdevabharaprehalfdevamaraprehalfdevayaraprehalfdevararaprehalfdevalaraprehalfdevallaraprehalfdevavaraprehalfdevasharaprehalfdevassaraprehalfdevasaraprehalfdevaharaprehalfdevazharaprehalfdevaheavyyaraprehalfdevakassaraprehalfdevajanyaraprehalfdevakanuktaraprehalfdevakhanuktaraprehalfdevaganuktaraprehalfdevaghanuktaraprehalfdevanganuktaraprehalfdevacanuktaraprehalfdevachanuktaraprehalfdevajanuktaraprehalfdevajhanuktaraprehalfdevanyanuktaraprehalfdevattanuktaraprehalfdevatthanuktaraprehalfdevaddanuktaraprehalfdevaddhanuktaraprehalfdevannanuktaraprehalfdevatanuktaraprehalfdevathanuktaraprehalfdevadanuktaraprehalfdevadhanuktaraprehalfdevananuktaraprehalfdevapanuktaraprehalfdevaphanuktaraprehalfdevabanuktaraprehalfdevabhanuktaraprehalfdevamanuktaraprehalfdevayanuktaraprehalfdevalanuktaraprehalfdevallanuktaraprehalfdevavanuktaraprehalfdevashanuktaraprehalfdevassanuktaraprehalfdevasanuktaraprehalfdevahanuktaraprehalfdevahaudeva	hauUIdevahauudeva
hauuUIdevaharvocalicdevaharrvocalicdevahanuktaudeva
hanuktauudevahanuktarvocalicdevahanuktarrvocalicdeva	haraudevaharauUIdeva
harauudevaharauuUIdevaraudevarauudevadaudevadauudevadarvocalicdeva	daraudeva
darauudevadararvocalicdevaranuktaudeva
ranuktauudevadanuktaudeva
danuktauudevadanuktarvocalicdeva
dddhaudevadddhauudevarhaudeva	rhauudevaoevowelsignanusvaradevaoevowelsignrephdevaoevowelsignrephanusvaradevaooevowelsignanusvaradevaooevowelsignrephdevaooevowelsignrephanusvaradevaiivowelsignanusvaradevaiivowelsignrephdevaiivowelsignrephanusvaradevaecandravowelsignanusvaradevaecandravowelsignrephdevaecandravowelrephanusvaradevaeshortvowelsignanusvaradevaeshortvowelsignrephdevaeshortvowelsignrephanusvaradeevowelsignanusvaradevaevowelsignrephdevaevowelsignrephanusvaradevaaivowelsignanusvaradevaaivowelsignrephdevaaivowelsignrephanusvaradevaocandravowelsignanusvaradevaocandravowelsignrephdevaocandravowelrephanusvaradevaoshortvowelsignanusvaradevaoshortvowelsignrephdevaoshortvowelsignrephanusvaradevaovowelsignanusvaradevaovowelsignrephdevaovowelsignrephanusvaradevaauvowelsignanusvaradevaauvowelsignrephdevaauvowelsignrephanusvaradevaawvowelsignanusvaradevaawvowelsignrephdevaawvowelsignrephanusvaradevarephanusvaradevaashortanusvaradevaiianusvaradevaecandraanusvaradevaeshortanusvaradevaaianusvaradevaocandraanusvaradevaoshortanusvaradeva
oanusvaradevaauanusvaradevaacandraanusvaradevaoeanusvaradevaooeanusvaradevaawanusvaradevaashortnuktaanusvaradevaiinuktaanusvaradevaecandranuktaanusvaradevaeshortnuktaanusvaradevaainuktaanusvaradevaocandranuktaanusvaradevaoshortnuktaanusvaradevaonuktaanusvaradevaaunuktaanusvaradevaacandranuktaanusvaradevakatadeva	kashadeva
khashadeva	ngagadeva	ngamadeva	ngayadevacacadeva	cachadevacacharadeva	chayadevajajadeva	jaddadeva	nyajadeva
ttattadevattattauudevattatthadeva
ttatthauudeva	ttayadevatthatthadeva
tthayadevaddaddhadeva
ddaddadevaddaddauudeva	ddayadevaddarayadevaddhaddhadeva
ddhayadevatatadevatataprehalfdeva	tathadeva	tashadeva	daghadevadagadevadabadeva	dabhadevadavadeva
davayadeva	dadhadevadadhayadevadadadeva
dadayadevadamadevadayadevadayaprehalfdeva	naddadevanaddaradeva	nathadevanatharadeva	nadhadevanadhaprehalfdevanadharadevananadeva	nashadevapanadeva	badhadevamapadeva
maparadevamapaprehalfdeva	maphadeva	mabhadeva	laddadevaladdaradeva	lathadevavayadeva	shacadeva	shavadeva	shaladeva	shanadeva
ssattadevassattayadevassattaradevassatthadeva
ssatthayadeva
ssattharadeva	sathadevasathaprehalfdevasapadevasapaprehalfdeva
saparadeva	saphadeva	hannadevahanadevahamadevahayadevahaladevahavadeva	ladevaMARlanuktadevaMARlaradevaMARlanuktaradevaMARshaladevaMAR
shadevaMARshaprehalfdevaMARshanuktadevaMARshanuktaprehalfdevaMARchaprehalfdevaNEPchanuktaprehalfdevaNEPcharaprehalfdevaNEPchanuktaraprehalfdevaNEP
jhadevaNEPjhanuktadevaNEPjhaprehalfdevaNEPjhanuktaprehalfdevaNEPjharadevaNEPjhanuktaradevaNEPjharaprehalfdevaNEPjhanuktaraprehalfdevaNEPfivedevaNEPeightdevaNEPninedevaNEPivowelsign00devaivowelsign01devaivowelsign02devaivowelsign03devaivowelsign04devaivowelsign05devaivowelsign06devaivowelsign07devaivowelsign08devaivowelsign09devaivowelsign10devaivowelsign11devaivowelsignanusvaradevaivowelsignanusvara01devaivowelsignanusvara02devaivowelsignanusvara03devaivowelsignanusvara04devaivowelsignanusvara05devaivowelsignanusvara06devaivowelsignanusvara07devaivowelsignanusvara08devaivowelsignanusvara09devaivowelsignanusvara10devaivowelsignanusvara11devaivowelsignrephdevaivowelsignreph01devaivowelsignreph02devaivowelsignreph03devaivowelsignreph04devaivowelsignreph05devaivowelsignreph06devaivowelsignreph07devaivowelsignreph08devaivowelsignreph09devaivowelsignreph10devaivowelsignreph11devaivowelsignrephanusvaradevaivowelsignrephanusvara01devaivowelsignrephanusvara02devaivowelsignrephanusvara03devaivowelsignrephanusvara04devaivowelsignrephanusvara05devaivowelsignrephanusvara06devaivowelsignrephanusvara07devaivowelsignrephanusvara08devaivowelsignrephanusvara09devaivowelsignrephanusvara10devaivowelsignrephanusvara11deva
dummymarkdevaiivowelsign1devaiivowelsign2devaiivowelsign3devaiivowelsignanusvara1devaiivowelsignanusvara2devaiivowelsignanusvara3devaiivowelsignreph1devaiivowelsignreph2devaiivowelsignreph3devaiivowelsignrephanusvara1devaiivowelsignrephanusvara2devaiivowelsignrephanusvara3devauvowelsignnuktadevauvowelsignnuktaleftdevauvowelsignnarrowdevauuvowelsignnuktadevauuvowelsignnuktaleftdevarvocalicvowelsignnuktadevarvocalicvowelsignnuktaleftdevarrvocalicvowelsignnuktadevarrvocalicvowelsignnuktaleftdevalvocalicvowelsignleftdevalvocalicvowelsignnuktadevalvocalicvowelsignnuktaleftdevallvocalicvowelsignnuktadevallvocalicvowelsignleftdevallvocalicvowelsignnuktaleftdevaviramanuktadevauevowelsignnuktadevauevowelsignnuktaleftdevauuevowelsignnuktadevauuevowelsignnuktaleftdeva
ngaaltdeva
chaaltdeva
ttaaltdevatthaaltdeva
ddaaltdevaddhaaltdeva
llaaltdevalaaltdevaMARnganuktaaltdevachanuktaaltdevattanuktaaltdevatthanuktaaltdevadddhaaltdeva
rhaaltdevalllaaltdevalanuktaaltdevaMARshaprehalfaltdeva
vattuudeva
vattuulowdevavattuulownuktadevavattuuudevavattuuulowdevavattuuulownuktadevavatturvocalicdevavatturvocaliclowdevavatturvocaliclownuktadevavatturrvocalicdevavattulvocalicdevavattullvocalicdevavattuviramadevavattuviramalowdevavattuviramalownuktadevavattuuevowellowdevavattuuevowellownuktadevavattuuuevowellowdevavattuuuevowellownuktadevauvowelsignlowdevauuvowelsignlowdevarvocalicvowelsignlowdevarrvocaliclowdevalvocalicvowelsignlowdevallvocalicvowelsignlowdeva
viramalowdevauevowelsignlowdevauuevowelsignlowdevadadaaltdevadabhaaltdevarephcandrabindudevaoevowelsigncandrabindudevaooevowelsigncandrabindudevaecandravowelsigncandrabindudevaeshortvowelsigncandrabindudevaevowelsigncandrabindudevaaivowelsigncandrabindudevaocandravowelsigncandrabindudevaoshortvowelsigncandrabindudevaovowelsigncandrabindudevaauvowelsigncandrabindudevaawvowelsigncandrabindudevaivowelsigncandrabindudevaivowelsigncandrabindu01devaivowelsigncandrabindu02devaivowelsigncandrabindu03devaivowelsigncandrabindu04devaivowelsigncandrabindu05devaivowelsigncandrabindu06devaivowelsigncandrabindu07devaivowelsigncandrabindu08devaivowelsigncandrabindu09devaivowelsigncandrabindu10devaivowelsigncandrabindu11devaiivowelcandrabindudevaiivowelcandrabindu1devaiivowelcandrabindu2devaiivowelcandrabindu3devaoevowelsignrephcandrabindudevaooevowelsignrephcandrabindudevaecandravowelrephcandrabindudevaeshortvowelrephcandrabindudevaevowelsignrephcandrabindudevaaivowelsignrephcandrabindudevaocandravowelrephcandrabindudevaoshortvowelrephcandrabindudevaovowelsignrephcandrabindudevaauvowelsignrephcandrabindudevaawvowelsignrephcandrabindudevaivowelsignrephcandrabindudevaivowelsignrephcandrabindu01devaivowelsignrephcandrabindu02devaivowelsignrephcandrabindu03devaivowelsignrephcandrabindu04devaivowelsignrephcandrabindu05devaivowelsignrephcandrabindu06devaivowelsignrephcandrabindu07devaivowelsignrephcandrabindu08devaivowelsignrephcandrabindu09devaivowelsignrephcandrabindu10devaivowelsignrephcandrabindu11devaiivowelsignrephcandrabindudevaiivowelsignrephcandrabindu1devaiivowelsignrephcandrabindu2devaiivowelsignrephcandrabindu3devavatturrvocalicUIdevavattulvocalicUIdevavattullvocalicUIdevaexclam.deva
quotedbl.devanumbersign.devapercent.devaquotesingle.devaparenleft.devaparenright.deva
asterisk.deva	plus.deva
comma.devahyphen.devaperiod.deva
slash.deva	zero.devaone.devatwo.deva
three.deva	four.deva	five.devasix.deva
seven.deva
eight.deva	nine.deva
colon.devasemicolon.deva	less.deva
equal.devagreater.deva
question.devabracketleft.devabackslash.devabracketright.devaasciicircum.devaunderscore.devabraceleft.devabar.devabraceright.devaasciitilde.devanbspace.devaendash.devaemdash.devaquoteleft.devaquoteright.devaquotedblleft.devaquotedblright.deva
ellipsis.deva
multiply.devadivide.deva	uni2010_1uni20B9.devaone_onedeva	two_udevathree_kadeva
one_radeva
two_radevathree_radevafour_radevafive_radevatwo_avagrahadevatwo_uni1CD0	vi_radevavisarga_uni1CE2visarga_uni1CE4visarga_uni1CE5visarga_uni1CE8uni1CE1.alt	uni20F0_1sharvocalicdevaayanusvaradevaayanusvaravowelsigndevaayvowelsigncandrabindudevaayvowelsignrephdevaayvowelsignrephanusvaradevaayvowelsignrephcandrabindudevamarwariddaddadevamarwariddaddhadevamarwariddayadeva�����n��34/045����
%&)**+-.45<=>?@A\]jkklmnvwyzz{������������������_`��	@	A	A	B	�	�	�	�
g
h
h
i
l
m
v
w
�
�
�
�vw������������������������

�vw����������������23347889?@@AGHVWz{{|~��������������������������67ABEFFGGHIJNOQB&4---
;w
;w��(����!"%**..//0234?@wy{{|�������������w���������������{{������������7AGGJN��h�����
 #%)  +##,&3-bg;jjAlmBbbDjjEopFt�H��]��h��i��k	�	�l	�	��
m
t�
�
����������*-.1u}��	���

!"!"#$%%'3'044]a9hi>`a@cnBq�N��v��w	�	�x
h
h�
m
v�
�
��������-���'()*+,-./0123juwz{|}�������������	�	�	�	�	�	�	�
p
��DFLT&cyrl\dev2
devazgrek�latn��
"#$%+-./123457MKD FSRB z��
"#$%+,-./0123457��
"#$%+-./123457��
"#$%+-./123457MAR 0NEP P��

!&()*��

!&()*��
!'()*MAR .NEP L��!&(*6��!&(*6��!'(*6��	
"#$%+,-./0123457.APPHdCAT �IPPH�MAH MOL 4NAV hROM ���
"#$%+,-./0123457��
"#$%+-./123457��
"#$%+-./123457��
"#$%+-./123457��
"#$%+-./123457��
"#$%+-./123457��
"#$%+-./123457��
 "#$%+-./1234578aaltRabvsZakhnlblwfrblwfxblws~c2sc�case�ccmp�ccmp�cjct�cjct�dnom�frac�half�half�half�half�haln�liga�lnum�locl�locllocl
locllocllocl locl&locl,locl2locl8locl>loclDnuktJnumrPonumVordn\pnumbpreshpresppstsxrkrf�rphf�rtlm�salt�sinf�smcp�ss03�ss04�ss06�ss07�subs�sups�tnum�vatu�zero�FHKLMO1?4��������$&AB9:;<78�' �.�/�	
0#!CEDE���352(+%:*8+6,4-"=>?)�PX`hpx���������������� (2:BLT\dlt|����������������$,4<DLT\dlt|����������������$,4<DLT\dlt|����������������$,4<DLT\dlt|����������������$,4<DLT\dlt|�< 0p��,J\n�����"&�� (,4Vrz�����@v#4(v)
)>)B)F)J*8+�,�,�,�/�/�/�4x4�4�4�8�<b?�B�E�H�L�PTP�P�R&RBU�WWbX�Y�ZZZ$Z�^�^�^�edh�ln�q�tLwy�|8
��� �v����H���������������@�������l�4���������4������������������������������8�@�H�P�X�`�v�������b�f�J�d�@�@�R�V������������L���������¤¾�����z�~ĦŤ�D�
���239=GHM]_efxz{���������239=GHz{���������
��*&(/)-06D>AB:kqmovpt�����y�*&(/)-06D>ABVQST:kqmovpt�����y�++''4477855;;<<EE??CC@@JJIILKKOONNZXRW\^^``aaccddgghhjssnnrrww||~~}}��������������������������������..11uu	����[
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�cQ	

�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�	

�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�����
�
�����
�
�
�
�
��������
���

%&'()*%&'()*-./01234-./01234DEFGHIJKTUVWXYTUVWXY^_`abcde_acenopqrstunopqrstu+,56LMZ[fgvw !"# !"#;<=>?@AB;<=>?@AB|}~����|}~����$98:7C+,568OPQRNSOPijkl\]hmijfg]zy{x�Z[vwy���
��
�
�
��bi,F� !"#$����������`$$'-035@BBGLVW"Z`$bb+ee,ss-��.��;��B��a��m��q��~�����������������������!�$%�(5�8B�VV�������������������������

�,,�aa�vv�������������AA�CG�IM�OT�Va�cd
fln���&��/��0��2��567mm8||9��:<66=DD>HH?��@$C==IggJijK��M��O�L�R[�_f�lx|����� ��!	�	�"	�	�#	�	�%dd&��'(P\-��:,y�,:HVdr�������������������
"(.4:@FNTZ`flrx~��������������������$*06<BHNTZ`flrx~��������������������� &		�		�	�����	��}��	��v��	��w��	�����		�����	
�����	�����	�����	
�����	��		n%�P[~ln%M	�P�[]	_	e		f	~lx		�	 V�QST�,,�FF
Z
X�R�YY
�U�W\�bb�ii���j�����������Rb�M
��
�L
��N
�
�
��
�
�D
�E
�F
�G
�H
�I
�J
�KTeSd`r]oagWiYk
�L
�MVhXjZl[m\n^p_qUf��������������������������������������������������y
"&./4FMNOPQRSTUXY�����������������	
"#&'67BHNUbem����������MOPQ\]^ghijkyz{����������������������������������<D�$NO�
,av�6DH�j�	�	�	�NO��

,,aavv��66DDHH��jj��	�	�	�	������		


 #$$%&'3.��
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�NO�
,av�6DH�j�	�	�	�.��
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�NO�
,av�6DH�j�	�	�	�^0:DNj|��������$6@JT�����������d�s�6������������e�t�7��!�:BJRZbjrz����������������
��
��

��
��
��
	��
��
��
��
��
��
��
��
����������������������������������
�
���:BJRZbjrz����������������
G��
F��
E��
D��
C��
A��
@��
?��
>��
=��
;��
:��
9��
8��
7��
6��
5��
4��
3��
1��
0��
/��
.��
-��
2�
<�
B�
,�:BJRZbjrz����������������
��
~��
}��
|��
{��
z��
y��
x��
w��
u��
t��
s��
r��
q��
o��
n��
m��
l��
k��
i��
h��
g��
f��
e��
j�
p�
v�
d�:BJRZbjrz����������������
c��
b��
a��
`��
_��
]��
\��
[��
Z��
Y��
X��
W��
V��
U��
S��
R��
Q��
P��
O��
M��
L��
K��
J��
I��
N�
T�
^�
H�:BJRZbjrz����������������
+��
*��
)��
(��
'��
%��
$��
#��
"��
!��
��
��
��
��
��
��
��
��
��
��
��
��
��
��
 �
&�
�
�,
�F
�Y
��
�&*.4:FJNTZ� �����%=P��n&0:DNX
����
����
����
����
����
����
����
����$.8BLV`jt~�
����
����
����
����
����
����
����
����
����
����
����
����$.8BLV`jt~�
����
����
����
����
����
����
����
����
����
����
����
����lt����������67����"#&'����"#&'���	
*>1Q_{1{Q
{_{Q{1c{_MLN�Nbm�MLN�Nbm�����2										
			
										 
"MPQRSUXY2										
			
										 
"MPQRSUXY$		��}vw������		
"S�������������������&F4Tn~n~&4FT
��.����������������������
.������������.����������������������
d/�
����%239=GHMP[]_eflxz{������������
��*&(/)-06D>ABVQST:kqmovpt�����y+',475;<E?CF@JIKONZXRYUW\^`bacdgihjsnrw|~}�������������������.1u��
�
�
�
�
�
�
�
�
�
�
�
�bcQ	

�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
������
%&'()*-./01234DEFGHIJKTUVWXY_acenopqrstu !"#;<=>?@AB|}~����edro+,568gikOPLMhjlijfg]mnpZ[vwyqf���/
$&'()*+,-./0123456789:;<=>?@B`bes�����������������������������������������������������������	 "$&(*,.02468:<=?A�����������������BCDEFGHIJKMNOPQRSTUVWXYZ[\]^_`abcdef��!#=���������������������������������������������� )*+,-./09:;<=>?@HIJKLMOPQWXYZ[\]^efghijktuvwxyz{�����������P�
������%239=GHMP[]_eflxz{������������*&(/)-06D>ABVQST:kqmovpt�����y�+',4785;<E?CF@JILKONZXRYW\^`bacdgihjsnrw|~}������������������.1u��[
�
�
�
�
�
�
�
�
�
�
�
�bcQ	

�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�����
%&'()*-./01234DEFGHIJKTUVWXY^_`abcdenopqrstu+,56LMZ[fgvw !"#;<=>?@AB|}~����$edro98:7CgikOPQRNShjlijkl\]hmmnpzy{x�qf���bi,F�P
$@BFGHIJKLMNOPQRSTUVWXYZ[\]^_`be�������������������������������������������������������������
!#%')+-/13579;>@B������������������BCELghijklmnopqrstuvwxyz{|}~����������� "$�����������������������������������������������������	

!"#$%&'(12345678ABCDEFGMOPQRSTUV\]^_`abcdijklmnopqrsyz{|}~������b.����������RTS`]aWYVXZ[\^_U��������������������	BB
MMOQ\^iky{����6"(�KQ�KN�Q�N�KKq	���V|;��

��	
����
��������
�
�
�
�
�
�
�
�
�
�� !"#$;./����������������AHUe����m|����gi��������ghd�PQRSTUVWXYZ[\V����������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOP
��c
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�������������������������������������-./0123456789:;<=>?@ABCDEFGHIJKLMNOP )09@LL[[��$8C'y�3��?��K!,W
38@HIJABCDEFG�HKL����?i�9x�������������",6@JT^hr|�������������&0:DNXblv�����wxyz{|}~��������567����8����9:������;���<���������4:A	�
%,.=>3OO5336887@@8"
�*�*����*
XO��������(4@LXdp|����������$0<HT`lx����������� ,8DP\ht�����������(4@L�*
�*
�*
�*
�*
�*
�*
�*
�*
�*
�*
�*
�*
�*
�*
�*
�*
�*
�*
*
'*
*
*
*
*
*
*
*
.*
*
	*
0*

*
*
*

*
*
*
*
*
*
 *
!*
)*
-*
*
*
*
*
*
*
*
*
*
*
*
"*
#*
$*
%*
&*
(*
**
+*
,*
/*
1*
2*
3*
4*
5*
*
*
5*
6*
*
2*
D*
E*
�5<%UW-��034I88K::L@AM�*
*:JXY[\*
6*
6*
6*
6�
*�M����������",6@JT^hr|�������������&0:DNXblv������������� *4>HR\fpz����*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*9*;*B*C*	�5<$VW,��.34G88I::J@AK~J�����������&0:DNXblv������������� *4>HR\fpz�������������$.8BLV`jt�*�*�*�*�*�*<*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*=*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*B*C*�5<$VW,��.44G@AH�?�������������$.8BLV`jt~������������
(2<FPZdnx�������������*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*9*;*����	58;<"VW$��&��'��+��.34;88=::>�<~������������
(2<FPZdnx�������������",6@JT^hr|��������6*7*8*9*<*=*>*?*@*I*J*K*M*N*O*P*Q*R*S*T*U*V*W*X*Y*Z*[*]*^*_*`*a*b*c*d*f*g*h*i*j*o*p*q*s*t*u*v*w*x*y*z*U*{*|*}*~**�*V*{*	������	�
#"$(&4+56:�9x�������������",6@JT^hr|�������������&0:DNXblv������*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*B*C*��������
58;< VW"��$��%��&��'��*@A7�8v������������� *4>HR\fpz�������������$.8BLV`jt~���6*7*8*9*<*>*@*I*J*K*M*N*O*P*Q*R*S*T*U*V*W*X*Y*Z*[*]*^*_*`*a*b*c*d*f*h*j*o*p*q*s*t*u*v*w*x*y*z*U*{*|*}*~**�*F*G*
�����������

!"#"$$&4'DE6�O����������&0:DNXblv������������� *4>HR\fpz�������������$.8BLV`jt~��������������������������������������������'��������.��	�0�
���
������ �!�)�-������������"�#�$�%�&�(�*�+�,�/�1�2�3�4�5���5�6��2�D�E��5<%UW-��034I88K::L@AM�M����������",6@JT^hr|�������������&0:DNXblv������������� *4>HR\fpz���6�7�8�9�:�<�=�>�?�@�A�C�E�G�I�J�K�L�M�N�O�P�Q�R�S�T�U�V�W�X�Y�Z�[�\�]�^�_�`�a�b�c�d�e�f�g�h�i�j�k�l�m�n�o�p�q�r�s�t�u�v�w�x�y�z�{�|�}�~������Y�~�>�?�F�G���99G;=HBCK&<s !**?@@�
t6n���Hh�*�*�*� (0�*��*��*��*�*��*�*�
$�*��*�*��*��*�*�&0:BJRZbjrz***�*�*****�*
�*	�*��*�Q*P*�O*U�*�����U�**28BLf������
6����0:\����������������������"(������������
�������������"*28>DJPV\b����
�	����$*06<�
�
�	�

��
 �"(.4:@%�"�%�$�#�&�"�!�
,+)'"(.421130/.-�$73 ������������������������E9J
 2<Vhr����(������������������"(.4�
�
�	�

��
,+)'
�������������X(2<F*������*�(������P������������()OPQR�w{������������������������()..OR��ww{{������������GGGGGG
$2GGGG�:@FLRX^djpv|���������������#���"�#�$�"�#�$�%$%�"���,��x#z��"�#�$y"y#y$y%x"���������()OPQR�w{��������

*8 �II!�JJ II!JJ�� 
 �=�!
!��&HZdnx:�7x
@w?�;�8�<�9�=�>�A�����xyz{|���&R\fpz������*T~���&Pz������
(2<FPZd������������������$����������$����������$����������$����������$����������$����������$����������$����������$����������$����������$����������$������������������I�$N�M�L�K�J���������������������N��M��L�&���������"#$%&'(),OPQR��w{���������N/V\'�K�����������556677889<UUVVWXYY[\����������������������&��!��%��#��%����	����$��
����������
������"������������%��������������&��!��%��#��%����	����$��
����������
����"�����������������������

!""#344558899<<AB#EH%II!JJKKLL$MM
NNOOQQRR%SSTTUUVV"XXYY%ZZ[\%^^``%ccddffkk#mn%oo!ppqqrr$ss
ttuuwwxx%yyzz{{"}}~~%��%������������������������ 	
 !#$&&))+,-./0168899::;;@ADEKKOQ%LV`lx����������� ,8DP\ht�����������ssPQRST	U
VWX
YZ[\]^_`abcdefghijk l!m"n#o$p%q&r 	K~������������		


557799::;;<<UUWX[\����������������������������������������������������������	

  !!##$$%%&&''(())**++,-../011223355����������������������  !!#$&&--..112688::@ADEKK&2>Jyz{|}~ 	�Kw������������������	
557799::;<UUWX[\������������������������������������������������������������������		

  !!##$$%%&&'*,,--..00113355OOuu����������������������!!#$&&..2688::KK&2>Jyz{|}~�Kf������������		
557799::;;<<UUWX[\������������������������������������������������

  !!##$$%%&&''(())**,-..113355^^��������������������!!#$&&..26KK$0<z{|}~�Kh������������		
557799::;;<<UUWX[\��������������������������������������������������

  !!##$$%%&&''(())**,-..113355TTzz��������������������!!#$&&..26KK$0<z{|}~nKb������������		
557799::;;<<UUWX[\����������������������������������������������

  !!##$$%%&&'())**,-..11335588cc������������������!!#$&&..26KK$0<z{|}~tKc������������	
557799::;<UUWX[\��������������������������������������������������

  !!##$$%%&&'*,,--..113355������������������!!#$&&..3346KK$0<z{|}~PK]������������	
557799::;<UUWX[\��������������������������������������������������

  !!##$$%%&&'*,,--..113355������������������!!#$&&..36KK$0<z{|}~hKa����������������	
557799::;<UUWX[\����������������������������������������������������

  !!##%%&&'*,,--..11335599dd������������������!!#$&&..36KK$0<z{|}~�Kh��������������������	


557799::;;<<UUWX[\����������������������������������������������������

  !!##%%&&'*,,--..113355����������������!!#$&&..33KK$0<z{|}~VK^����������������	
557799::;;<<UUWWXX[\��������������������������������������������������

  !!##%%&&'*,-..113355MMss����������������!!#$&&..KK$0<z{|}~NK]������������		
557799::;;<<UUWWXX[\����������������������������������������

  !!##%%&&''(())**,-..113355ZZ����������������!!#$&&..KK
".{|}~$KV����������		
557799::;;<<UUWX[\��������������������������������

  !!##%%''(())**,-..113355JJpp����������������!!#$&&..KK
".{|}~KU����������		
557799::;;<<UUWX[\��������������������������������

  !!##%%''(())**,-..113355NNtt����������������!!#$&&..KK
".{|}~KR����������		
557799::;;<<UUWX[\������������������������������������

  !!##%%'())**,-..113355����������������!!#$&&KK
".{|}~KS����������		
557799::;;<<UUWX[\������������������������������������

  !!##%%'())**,-..113355KKqq����������������!!#$&&KK
".{|}~$KV����������		
557799::;;<<UUWX[\������������������������������������

  !!##%%'())**,-..113355XX}}����������������!!#$&&33KK
".{|}~�KK����������	
557799::;<UUWX[\����������������������������������

  !!##%%'*--..113355<<ff����������������!!#$&&KK
".{|}~�KI����������	
557799::;<UUWX[\��������������������������������

  !!##%%'*--..113355UU����������������!!#$&&KK
".{|}~�KM������		
557799::;<UUWX[\����������������������������������

  !!##%%'*--..113355QQww����������������!!#$&&33KK
".{|}~�KK������������	
557799::;<UUWX[\������������������������������������

  !!##%%'*--..113355����������������!!#$&&KK
".{|}~�KH������������	
557799::;<UUWX[\��������������������������������

  !!##%%'*--..113355����������������99;;KK
".{|}~�K?������������	
557799::;;UUXX[\��������������������������������

  !!##%%'*..1155��������������KK
".{|}~RK3��������
5577::;;UUXX��������������������

!!##%%''))..1155SSyy����������KK
".{|}~>K0������	
55::;;UU����������������������

!!##%%''))..1155����������KK |}~�K%������
55::;;��������������������!!##%%))..����������KK |}~�K����
::��������������!!%%..����������KK |}~�K����
::��������������!!%%..����������KK |}~�K����
::����������!!%%..������������KK}~�K����
::����������!!%%..����������KK}~�K����
::��������������!!%%..IIoo����������KK}~�K!������
:;������������������!!%%..VV{{����������KK}~�K����
::��������������!!%%..ABkk����������KK}~�K��
������������%%..LLrr��������KK}~�K
����������..EHRRYY[\``mnxx~~��KK~JK��
����..KK~ &K�����	����������������	


5566	778899::;;<<UUVVWWXXYY[\����������������������������������������������	������������	������������������	



		  !!""##$$%%&&'*++,-../01122334455��������������������������	
	





  !!#$&&))+,--../0	112688::@ADEKKOOPPQQ	
 *4>HR\fptuvwxyz	{
}~KKKKKKKK	K
KK(�@KVG��	���..
5<UY[\��
��
�����������������������������589<<ABEOQVX\^^``cdffkkmuw{}��������������������������	
!#$&'))+899::;;@ADEKKLV��OQ.>N^��������	��
�*:JZjv�������������	��
���������	��
�f$*06<BHNTZ`K{L{M{N{O{P{Q{R{S{T{U{V{KVKVKV$KV�KV�KV{{{{{�����L� **//|��������
����
j���1XY[\������	 !0�������������
#&-./01256P& !!**//	34?@XY[\|�	��	��	��������		!00���������������

##&&-256PP���	�������"\rz� *34	���-2PP **34s������06<BHNTZbjrz����������{�{�{�{�{�{{�{�{�{�{�{�{{�{	{{!{${3{3{������	 !0�
#&56������ *34�.bhntz��������������������� (06<DLRX^djpv|���������������������������������������������������	�
������������������������������U*�.������	 !0�������������
#&-./01256P����J�������
5789:;<�����������������������"#$%&'()*+,-/123�!$4:@ADE2��������
5577889;<<?@����������������������"$%%&&''(())*-//13��!!$$44::@@AADDEE�����	����75789:;<V�������������������"#$%&'()*+,-/12354:E, !345577889:;<VV����������������������������������""#-//1122335544::EE�$�����������l�=����������������������
"(.4:@FLRX^djpv|�������������������������������	
������������	

358@D557<��	!""-%/51448669:::AA;EE<J$*06<�4�3�@�?�!� ��
��?@x&Lr����������4F
 ������
 ������&,2� ����� ����H 
� ���! (08@HPV\bhntz��{4�{3�{*�{ �{�{�4�3�*�@�?�!� ��������� 
� ���!"(.4�*�@�?�!� ��� ���� &,�4�3�*� ����
9:����{J�(������!?@�������!$�����������!!//?@|�������������������!!$$����������������������4��������������������������!?@�������������4 (.�������������!$B$.8;�B�D�F�H������
4.��������
��.
��.
�� Vrz�����3������������55::;;������������������������		!!%%))00���������������,,-.17@ADE������s$���|���������}���������~���������:BJ�0�������!**==?@���������
''�������������������������		
 ""%%''))+,�����s
*8������*
E�D�C�B���*4>HR\fpz���������e�k�l�m�n����*�*�*�*�*\*�*:�A�C�E�G������9:���5�����t7stu	

 !"#$%&'()*+34v5,-./0126G

$@D `d%��*��+��,��-��.��0��2��4	:	:5	A	A6
��DFLT&cyrl6dev2FdevaVgrekflatnv������������abvm&blwm.dist6kernHmarkPmkmkX	

'(*,Zbjt|���������������$,4<DLT\dlt|����������IRV���0�  �< �(V�����
X.�V���
2FZn���^����Pf,�����34�8w�7E2��������
�?.��� Q>�.���=n[�.���%UC�.�������.�����:.���=n[�.����&X.������.������.���b���.���b���.����M.������.���
=+o.���V�t�.�����/|}~������"�8������������8���/|}~����������������������������/|}~�������F�F�F�F�F�F�F�i�F�F�F/|}~������&��������������������������������� (8@w�7Esw�7EG):DL34��������34sL"�����������������������������������������=�����������������������=��wy��w�7AGG!lVv	 &,28>D
��
�
�V�
�
�
�
�	*-.1u}��	���"(.&"^vf�$*06<BHNT�n�n�n�n�n�n�n�n�n�n�nCL.wyx$�Vn�#n�$n�Vn4\~��wy��w�7AGG!wy��w�uu7AGGwy��w�7AGGs+++"*L�������������������BBbb�����		


 #$$%&'3
0B�V�)TZ`flrx~��������������������� &,28>DrB�B;��B|BmBy�p��B^B�tBxBT���Bm�z�sB8�+�|B�BdBbBh�h��B��|B�BrB�B|B�B��mBxB�CrB�Bt�)'()*+,-./0123juwz{|}�������������	�	�	�	�	�	�	�
p���$����v��i�*���/|}~������B��������!()**?@DDFF��������������		!00;;BBDDFFHH\\���������������������������

##&&-25566��������������������HH//|�����s .<JZjz<�:P���.������������������������$%()��������
��	��
����
����KVWb{{|~�
��	����
���������
��..����������������..����,>Rfx��������
&4BP^l!"	#
$%
& ��A��������������������� &,28>DJPV\bhntz����������������������sJ�"BJ1�{��s{J�s�{s�{���"
Z�����(��M:G�H�XJ{ JJ@	����A�������
5;U[���%)���������	!$,-.1237@ADE����������OP!**?@������25�������$*06<BHNTZ`flrx~����������������������V�V�V�V�V�V�V�V�V��V�V��V��V���V��V���V�/�/��/�/��/�/��/�/�/�/�/��/�/�/�/�V�V�V�V���V�/�/�/6.e��������� &,28>DJPV\bhntz����������������������
"(.4:@FLRX^djpv|���������������������$++�_�<\$<��
����vww
�




�,\�$,���



��>9����$4<��Bq7���!!22G����<\$<<e�������������
5;=DF���������������������	���������������������������	
!#$&,-./012��������/34|}~�����������NTZ`flrx~������������������
����s�x����;��������������'X����Xf|������6H���06hn�Ljp�������������������������������������������������8������������)��*+��3�������������������������������������������	������������8��������������������������������������������������	������������8�����������3��&�������������������������	��
����������������8��;����������������������������������������y��3��������3��������������������;��3�������������������	������������8����������3��������3��������������	��������������8����3�������3��$�������������������������	����������������8��;����������������������������������������q3�����������y������������8����3������������������������������������������������	;������3�������������	��������������3����
�������������	������8���������;����������������������	��������������������'������������������������������JQY�(*B$���$*06<BHNTZ`flrx~��������������������� &,28>DJPV\bhntz����������������������
"(.4:@FLRX^djpv|���������������������$*06<BHNTZ`flrx~��4�4�&�&��0�0��*���Y���P�Q��#��$�4�&�O�9�8�G�F�H�m�f�"��&��O�"�4��%��!�������o�%
lll	llllll��ll	l
l��������J�����,������ 
l��m
lp
l
lp
l
l
l
l
l
l
l
l
l
l
l
lll
llm��(��p
p��(	l
l	ll�&�
l
ll
"
l
l
l
l
ll	l
l��pl
l
l"
l
ll
l
ll
n
k
l
ll
l
l;ll
ll��p
l
l
l
l$Ml�����
 #%)  +##,&3-bg;jjAbbBjjCopDt�F��[��f��g	�	�h	�	�}
m
t�
�
�������
 #%)  +##,&&-bg.jj4lm5bb7jj8op9��;��<��>��?F &,28>DJPV\bhntz����������������������
"(.4:@FLRX^djpv|������������Y��������������8������H�������3�8����,���j�28>DJPV\bhntz����������������������
"(.4:@FLRX^djpv|���������������������$*06<BHNTZ`flrx~��������������������� &,28>DJPV\bhntz�����������:nMnMn~n�n�nsn�n�n"n"n�n1n'n{nnnsn�n1n{n~n�n�ninRnRnRn�n�n�n�n�n�n�n�n�n:nMnMn~n�n�n~n�n�n�n"n"n'nsn�n�n"n"n�n1n'n{nnsn�n�n"n"n�n1n'n{nninininin�n�n'n'n'n'n'n'n�n�n'n'n'n�n�n1n1n�n�n�n]n]nQn"n"n"n"n"n�n�n�n1n�n'n�n6n�n6n;nonpn�nnn�n�nnn�nn�n�n�n�n�nXnnnnn�n�n"n"n�n1nn�n�n�n"n"n�n1nn�n;nMn��������������59:;=>[�������������z|}~����������������	 !%)0����������������������������������������	
$&,-.1234567@ADE������������������2���"#$%.012���������������������������������JKLMN2���������$*06<BHNTZ`flrx~��������������������Ln�Ln�Vn�Vn�Ln�Vn�Vn�Vn�Vn�Vn�Vn�Ln�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Ln�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�VnLB�>p�� &,��|��s��� &,��|����F� &,��|����"� &,28>D���|��T���31��� &,28>D���|��T���11�z������4
=3F04f]jklmy`�{	A	A�	�	��
h
h�
m
v�
�
�����������$*06<BHNTZ`flrx~��������������������� &,28>DJPV\bhntz����������������������
"(.4:@FLRX^djpv|���������������������$*06<BHNTZ`flrx~��������������������� &,28>DJPV\bhntz����������������������		
				"	(	.	4	:	@	F	L	R	X	^	d	j	p	v	|	�	�	�	�	�	�	�	�������|����6���������������v��i��Y��������=�������������������������8�8����`�����������������H���������������������������j�d��3����j����$�8���,�8����,�����6�BHNTZ`flrx~��������������������� &,28>DJPV\bhntz����������������������
"(.4:@FLRX^djpv|���������������������$*06<BHNTZ`flrx~��������������������������������J�������516�������L��������b����?���\&H&��O
BB
�
B
BB������BB��t	B	B��������
��
�7FH|CC##��������������������
87�BI
F�
�
��
B���
�
B
B
B
B
BD
B!�
BB�B.��
B�

B
B
�
�
�p�����CCCDGCCBCGC�FCBBBCDG��CGGC��GGCCCGC��CCBC�F��

!"!"#$%%'3'034]a8hi=`a?cnAq�M��e��t��u	�	�v
m
t�
�
����

!"!"#$%%'3'044]a9hi>`a@ciBknIq�M��u��v	A	Aw	�	�x
h
h�
m
v�
�
��������������������� &,28>DJPV\bhntz����������������������
"(.4:@FLRX^djpv|���������������������$*06<BHNTZ`flrx~��������������������� &,28>DJPV\bhntz�������������������|����6���������������=���������������8����`��������������������������������j�d�����j����$�8���,��hrr|������������4b||���h�����h��||||||�����������������||d�����z�����������z������bbb|���������|��b||�|�|�||||||||||||���������������������������������rr������������������������������������h��@N@@@������jjjjjx���	�
��9��;��<��>�����&��(��*��8��:��<������!��#��������������/ZO(������/2�������������������������=��/<������1����$&��Bb������������������������������?��A��C��E��G��I��K��M��O��Q��S��U���������������%��&��'��(��)��*��+��,��-��.��/��0��1����������������������������������������������=�����o�����3��4��5��6��7��8��H��I��J��K��L��l��m��n��o��p��q��r��s��t��u��v��w��z�������������������������������������$������������$�����$������������/_��$/29��;��<��>�����&��(��*��8��:��<������!��#��������������/d9��;��<��>�����&��(��*��8��:��<������!��#��������������/n[P\P������$P�F/2.=2��������������������������������#��$��%��&��'��(��)��*��+��,��-��.��/��0��1���������������������#��$��%��&��'��(��)��*��+��,��-��.��/��0��1��
��� �������������%��&��'��(��)��*��+��,��-��.��/��0��1�������������������������������������������������������������������������������������������������������������
����������������%��&��'��(��)��*��+��,��-��.��/��0��1���
����������������#��$��%��&��'��(��)��*��+��,��-��.��/��0��1����
�����
���3��4��5��6��7��8��H��I��J��K��L��l��m��n��o��p��q��r��s��t��u��v��w��z��������
���[\[<\<[<\<���������������P3��4��5��6��7��8��H��I��J��K��L��[Z\Zl��m��n��o��p��q��r��s��t��u��v��w��z�����������������������������������������������
���������^��_��`��a��b��c��d��e��f��g��h��i��j��k��l��m�����������������	��
������
������������������:���������������������������������������������������
���
���
���������^��_��`��a��b��c��d��e��f��g��h��i��j��k��l��m�����������������	��
������
��������������������������������������������������������������������
&'()*+,01456789;<=>?@DH[\^`e�������������������������������������������&(*89:;<=?Ads����� !"#$?ACEGIKMOQSUWY[]_acekmoqsuwy{}�����������������^%&'()*+,-./23456789:;<G_`blmnopqrstuvxyz�����������������������
�
�
�
�
�
�^_`abcdefghijklm���	

l&RP_,p^��������(������������������������������������������������������(����������������������������������������������������������������������������(������������������������������������������(���������������������������������������������������������������������������������������������������2���������������������������������������������������������2�����������222��������������������
����
�������������������
2((������������������������������������������������������<F��F��<F<������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������`(��������������������������������������������������������������������������������������������������������������������������������F�������������������������������������������������������������������������������������������������������������������������(����<(������(F��������������������������������������������������������~��������������������������~��������������������������������������������(���������(���������������(��������������������������(�����������������������������������������������������������������������������������������������������������$##=<=&&((-))
**00F11*44
55Z66
995::;<'==F>>???FFGGJJKKQMMRSTUWW:YY1[\]]I^^ooNM������-����
��
��
������Z����������������������������������-��-��-��-��
��T��
����������������������������F��I��*��**T**






:::&&5''1((5))1**5++1,,..0022446688'99::;;<<==????AA?dd)ee$ss(tt"����������
����5��1BBCCSDDFFII@JJMMNNSOOoPPQQRRUTT@VV[WWZZ[[@]]Y^^U__m``aa@ccnffgghhii	kkllmmlnnPooppqq_rr	ssavvgwwxxPyy`zz{{f||~~dc������j��������������[����,��+��6��,����!��7��4��+������4������\��6��+��!��������,��,����E�� �������������� ������������%��%������R %R		

;W%67H7HVV4  !!!"";##!$$;%&''(())**++,,;--6778899W::%;;\<<==+>> ??G@@OCC>DD.EE4GG>HH.IIJJKKLLMMNNOOPPQQGRR VVWW6YY+ZZ [[X\\J]]X^^J__>``.aabbccddii]jjkk]llnnoorrssvvwwzz{{}}7~~E7��E������������������4������������������!����!����!����+�� ��G��O��>��.����.��A��3��A��3������A��3��A��3��3������������'  !!'""##'$$??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffkk
llmm
nnoo
ppqq
rrss
ttuu
vvww
xxyy)zz${{)||$}})~~$)��$��)��$������(��"��(��"��(��"��(��"��(��"��������������������������	��������	
 !(	18AGHLRV	WXlopqrstwxxY|���<��#��=��#��=��N��M^^
��Q%/38&9<]^L_`DaaCbbDcdClvzz��9��9����0��/��8��B��B��B
�
�
�
�
�
�
�
�
�
�k
�
�h
�
�
�
�^
�
�

�
�
�
�

�
�2
�
�K
�
�b
�
�
�
�i
�
�e
$T[
\]2^m����
�����
2)77=.9.&&((,,4466992::;<#>>??;BB=FFGGHJKKLL-MMPQRSTTUUVVWWXX,YY+ZZ[^__5bb=ooDC����P��������������������������������������������������������������������������-����-����-����-��������

,##,&&2''+((2))+**2+++,,--..//001122334455667788#99::;;<<==;>>5??;@@5AA;BB5ddeesstt������P��������,��2��+BBDDII<JJLL
MMPPRRHTT<WW[[<^^H__[``aa<bb]cc\ffgghhjj
kk	llmm nnEooppqqQssStt
uu vvXww xxEyyRzz{{W|| }~U��	����Z��	����
��	����	������%����$��%��1��3��$����"��$������J��1����&��%��"��!����������'����������������*��������/��������'������::	
*

803"&  !!N""8##N$$8%%&&''(())**++,,8--..88990:::<<>>??0BBCCDDEE"FF'HHJJKK0LL:MM%NNPPRRTTUUVVWWXXYYJZZ[[I\\?]]I^^?__``aa%bbcc&dd/ee&ff/hhiiOjjFkkOllFnnooqqrr$ssuuwwxx&yy/{{}}3~~!3��!��3��!����K��!��K��!������"��'������������������"��'��1��*��1��*��1��*��&��/������0����������M����M����L��@��L��@��$����������%������$����������#  !!#""###$$??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVXXZZ\\^^``bbddffkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~������������������������������������������������������
����	����	


	 18HL_d
lo	pq rs	tw|���9��7��.��7��.��.��D��C__aa,��>#$A%/01G2238
9GHL
MO[\B]klw
xyzz
{~���6��6����)��(��4��>
�
�
�
�

�
�	
�
�
�
�
�
�
�
�
�
�
�
�T
�
�
�
�Y
�
�V$T[^m�����������-8�&&(*01	469?FGJKMMRUWWYY[^ oo$%��&��2��3��8��?��F��J��M��R��S��]��^��_��`��c��m��n��o��p��q��stwx

y

z{���&,�..�00�22�44�66�8=�??�AA�de�st����������BD�FF�IJ�LR�TT�VW�Z[�]a�cc�ft�v|�~�����������������������������������������������������������
�	
$%-&7@6CE@GRCVWOYdQil]noarscvwez{g}�i��m��n��v������������������������$�?f�k���������������#��)(=18cALkRXw_d~lx�|��������������^^����%/�3<�]d�lv�zz����������������������
�
��
�
��
�
�
�
�'
�
�+
�
�,
�
�-
�
�.
�
�/
�
�46:$;TmT��n��r��s����<��	YJ�J�J�J�J�J�J�J�J�KKKKKKK$K*K0K6K<KBKHKNKTKZK`KfKlKrKxK~K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�LLLLLL L&L,L2L8L>LDLJLPLVL\LbLhLnLtLzL�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�MM
MMMM"M(M.M4M:M@MFMLMRMXM^MdMjMpMvM|M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�NNNNNNN$N*N0N6N<NBNHNNNTNZN`NfNlNrNxN~N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�OOOOOO O&O,O2O8O>ODOJOPOVO\ObOhOnOtOzO�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�PP
PPPP"P(P.P4P:P@PFPLPRPXP^PdPjPpPvP|P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�QQQQQQQ$Q*Q0Q6Q<QBQHQNQTQZQ`QfQlQrQxQ~Q�Q�Q�Q�Q�Q�Q�Q�Q�Q�Q�Q�Q�Q�Q�Q�Q�Q�Q�Q�Q�RRRRRR R&R,R2R8R>RDRJRPRVR\RbRhRnRtRzR�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�SS
SSSS"S(S.S4S:S@SFSLSRSXS^SdSjSpSvS|S�S�S�S�S�S�S�S�S�S�S�S�S�S�S�S�S�S�S�S�S�TTTTTTT$T*T0T6T<TBTHTNTTTZT`TfTlTrTxT~T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�UUUUUU U&U,U2U8U>UDUJUPUVU\UbUhUnUtUzU�U�U�U�U�U�U�U�U�U�U�U�U�U�U�U�U�U�U�U�U�U�VV
VVVV"V(V.V4V:V@VFVLVRVXV^VdVjVpVvV|V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�WWWWWWW$W*W0W6W<WBWHWNWTWZW`WfWlWrWxW~W�W�W�W�W�W�W�W�W�W�W�W�W�W�W�W�W�W�W�W�W�XXXXXX X&X,X2X8X>XDXJXPXVX\XbXhXnXtXzX�X�X�X�X�X�X�X�X�X�X�X�X�X�X�X�X�X�X�X�X�X�YY
YYYY"Y(Y.Y4Y:Y@YFYLYRYXY^YdYjYpYvY|Y�Y�Y�Y�Y�Y�Y�Y�Y�Y�Y�Y�Y�Y�Y�Y�Y�Y�Y�Y�Y�ZZZZZZZ$Z*Z0Z6Z<ZBZHZNZTZZZ`ZfZlZrZxZ~Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�[[[[[[ [&[,[2[8[>[D[J[P[V[\[b[h[n[t[z[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�\\
\\\\"\(\.\4\:\@\F\L\R\X\^\d\j\p\v\|\�\�\�\�\�\�\�\�\�\�\�\�\�\�\�\�\�\�\�\�\�]]]]]]]$]*]0]6]<]B]H]N]T]Z]`]f]l]r]x]~]�]�]�]�]�]�]�]�]�]�]�]�]�]�]�]�]�]�]�]�]�^^^^^^ ^&^,^2^8^>^D^J^P^V^\^b^h^n^t^z^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�__
____"_(_._4_:_@_F_L_R_X_^_d_j_p_v_|_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�```````$`*`0`6`<`B`H`N`T`Z```f`l`r`x`~`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�aaaaaa a&a,a2a8a>aDaJaPaVa\abahanataza�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�bb
bbbb"b(b.b4b:b@bFbLbRbXb^bdbjbpbvb|b�b�b�b�b�b�b�b�b�b�b�b�b�b�b�b�b�b�b�b�b�ccccccc$c*c0c6c<cBcHcNcTcZc`cfclcrcxc~c�c�c�c�c�c�c�c�c�c�c�c�c�c�c�c�c�c�c�c�c�dddddd d&d,d2d8d>dDdJdPdVd\dbdhdndtdzd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�ee
eeee"e(e.e4e:e@eFeLeReXe^edejepeve|e�e�e�e�e�e�e�e�e�e�e�e�e�e�e�e�e�e�e�e�e�fffffff$f*f0f6f<fBfHfNfTfZf`ffflfrfxf~f�f�f�f�f�f�f�f�f�f�f�f�f�f�f�f�f�f�f�f�f�gggggg g&g,g2g8g>gDgJgPgVg\gbghgngtgzg�g�g�g�g�g�g�g�g�g�g�g�g�g�g�g�g�g�g�g�g�g�hh
hhhh"h(h.h4h:h@hFhLhRhXh^hdhjhphvh|h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�iiiiiii$i*i0i6i<iBiHiNiTiZi`ifilirixi~i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�jjjjjj j&j,j2j8j>jDjJjPjVj\jbjhjnjtjzj�j�j�j�j�j�j�j�j�j�j�j�j�j�j�j�j�j�j�j�j�j�kk
kkkk"k(k.k4k:k@kFkLkRkXk^kdkjkpkvk|k�k�k�k�k�k�k�k�k�k�k�k�k�k�k�k�k�k�k�k�k�lllllll$l*l0l6l<lBlHlNlTlZl`lflllrlxl~l�l�l�l�l�l�l�l�l�l�l�l�l�l�l�l�l�l�l�l�l�mmmmmm m&m,m2m8m>mDmJmPmVm\mbmhmnmtmzm�m�m�m�m�m�m�m�m�m�m�m�m�m�m�m�m�m�m�m�m�m�nn
nnnn"n(n.n4n:n@nFnLnRnXn^ndnjnpnvn|n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�ooooooo$o*o0o6o<oBoHoNoToZo`ofoloroxo~o�o�o�o�o�o�o�o�o�o�o�o�o�o�o�o�o�o�o�o�o�pppppp p&p,p2p8p>pDpJpPpVp\pbphpnptpzp�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�qq
qqqq"q(q.q4q:q@qFqLqRqXq^qdqjqpqvq|q�q�q�q�q�q�q�q�q�q�q�q�q�q�q�q�q�q�q�q�q�rrrrrrr$r*r0r6r<rBrHrNrTrZr`rfrlrrrxr~r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�ssssss s&s,s2s8s>sDsJsPsVs\sbshsnstszs�s�s�s�s�s�s�s�s�s�s�s�s�s�s�s�s�s�s�s�s�s�tt
tttt"t(t.t4t:t@tFtLtRtXt^tdtjtptvt|t�t�t�t�t�t�t�t�t�t�t�t�t�t�t�t�t�t�t�t�t�uuuuuuu$u*u0u6u<uBuHuNuTuZu`ufuluruxu~u�u�u�u�u�u�u�u�u�u�u�u�u�u�u�u�u�u�u�u�u�vvvvvv v&v,v2v8v>vDvJvPvVv\vbvhvnvtvzv�v�v�v�v�v�v�v�v�v�v�v�v�v�v�v�v�v�v�v�v�v�ww
wwww"w(w.w4w:w@wFwLwRwXw^wdwjwpwvw|w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�xxxxxxx$x*x0x6x<xBxHxNxTxZx`xfxlxrxxx~x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�yyyyyy y&y,y2y8y>yDyJyPyVy\ybyhynytyzy�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�zz
zzzz"z(z.z4z:z@zFzLzRzXz^zdzjzpzvz|z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�{{{{{{{${*{0{6{<{B{H{N{T{Z{`{f{l{r{x{~{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�|||||| |&|,|2|8|>|D|J|P|V|\|b|h|n|t|z|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�}}
}}}}"}(}.}4}:}@}F}L}R}X}^}d}j}p}v}|}�}�}�}�}�}�}�}�}�}�}�}�}�}�}�}�}�}�}�}�}�~~~~~~~$~*~0~6~<~B~H~N~T~Z~`~f~l~r~x~~~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~� &,28>DJPV\bhntz������������������������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�����������������������Āʀ��ր܀�������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�������������������������́��؁�������������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�������������������������Ȃ��Ԃ�������������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�����������������������ă��Ѓ��܃�������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�����������������������Ƅ̄҄��ބ����������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�����������������������…��΅ԅ�����������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�����������������������ĆʆІֆ����������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�����������������������Ƈ̇��؇އ������������ �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�����������������������ˆȈΈ��ڈ���������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�������������������������ʉ��։����������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�������������������������̊��؊��������������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�������������������������ȋ΋��ڋ��������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�����������������������ČʌЌ֌܌������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�����������������������ƍ̍��؍ލ���������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�����������������������ŽȎΎ��ڎ���������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�����������������������ďʏЏ֏܏����������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�����������������������Ɛ̐��ؐސ������������ �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�����������������������‘ȑΑԑڑ�������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�������������������������ʒВ��ܒ������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�����������������������Ɠ̓ғؓޓ���������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�����������������������”��ΔԔ����������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�������������������������ʕЕ��ܕ������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�����������������������Ɩ̖Җؖޖ���������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�����������������������—ȗ��ԗڗ�����������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�����������������������Ę��И֘�������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�������������������������̙ҙ��ޙ����������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�����������������������šȚΚԚښ�������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�����������������������ěʛ��֛����������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�����������������������Ɯ��Ҝ��ޜ�������������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�������������������������Ν��ڝ����������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�������������������������ʞ��֞������������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�����������������������Ɵ̟��؟ޟ������������ �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�������������������������������ڠ�������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�������������������������ʡС֡����������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�����������������������Ƣ��Ң��ޢ�������������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�����������������������£��Σ��ڣ����������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�������������������������ʤ��֤����������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�����������������������ƥ��ҥ��ޥ�������������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�����������������������¦�������������������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�����������������������ħʧ��֧ܧ����������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�������������������������̨����ި����������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�������������������������ȩΩԩک��������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�������������������������ʪ��֪�������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�����������������������ƫ��ҫ��ޫ������������ �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�������������������������Ȭ��Ԭ�������������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�����������������������ĭ��Э��ܭ�������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�����������������������Ʈ��Ү��ޮ����������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�������������������������ȯίԯگ�������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�����������������������İ��а��ܰ������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�����������������������Ʊ��ұ��ޱ����������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�������������������������Ȳβ��ڲ���������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�����������������������ijʳ��ֳܳ������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�������������������������̴��ش��������������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�����������������������µ��εԵ����������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�������������������������ʶ��ֶܶ����������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�����������������������Ʒ��ҷط��������������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�����������������������¸��θԸ����������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�����������������������Ĺʹ��ֹܹ��������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�����������������������ƺ��Һغ��������������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�����������������������»ȻλԻڻ�����������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�����������������������ļ��мּ�������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�������������������������̽ҽ��޽����������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�����������������������¾��ξԾ����������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�����������������������Ŀʿпֿܿ����������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~����������������������������������������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z����������������������������������������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|‚ˆŽ”𠦬²¸¾��������������������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~ÄÊÐÖÜâèîôú������������������������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�zĀĆČĒĘĞĤĪİĶļ����������������������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|łňŎŔŚŠŦŬŲŸž��������������������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~ƄƊƐƖƜƢƨƮƴƺ������������������������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�zǀdžnjǒǘǞǤǪǰǶǼ����������������������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|ȂȈȎȔȚȠȦȬȲȸȾ��������������������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~ɄɊɐɖɜɢɨɮɴɺ������������������������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�zʀʆʌʒʘʞʤʪʰʶʼ����������������������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|˂ˈˎ˔˚ˠ˦ˬ˲˸˾��������������������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~̴̢̨̖̜̮̺̄̊̐������������������������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z̀͆͌͒ͤͪ͘͞ͰͶͼ����������������������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|΂ΈΎΔΚΠΦάβθξ��������������������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~τϊϐϖϜϢϨϮϴϺ������������������������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�zЀІЌВИОФЪажм����������������������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|тшюєњѠѦѬѲѸѾ��������������������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~҄ҊҐҖҜҢҨҮҴҺ������������������������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�zӀӆӌӒӘӞӤӪӰӶӼ����������������������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|ԂԈԎԔԚԠԦԬԲԸԾ��������������������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~ՄՊՐՖ՜բըծմպ������������������������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�zրֆ֌ְֶּ֤֪֒֘֞����������������������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|ׂ׈׎הךנצ׬ײ׸׾��������������������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~؄؊ؐؖ؜آبخشغ������������������������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�zـنٌْ٘ٞ٤٪ٰٶټ����������������������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|ڂڈڎڔښڠڦڬڲڸھ��������������������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~ۄۊېۖۜۢۨۮ۴ۺ������������������������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z܀܆܌ܒܘܞܤܪܼܰܶ����������������������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|݂݈ݎݔݚݠݦݬݲݸݾ��������������������������$�*D>��;B�v�t|�d�Vi���me,1��*��������ps���se���?����V����JT�W�,��l�e���w�||���������e/=�I���V����H7�Z�����eln���+/�D������%$�6��"�)"�(��BR���$�)�4- ���|�*�)+6���5������������qH��������u552-/?/��LI�4+~���������H�&52������	�^�����������|��D>��D>��D>��D>��D>��D>n����t�|�d�,1��,1��,1��,1�����?����?����?����?�mm�||���������e������e������e������e������e���ln���ln���ln���ln����"�//�<<�����������1�����-� -� -� -� ������������//�55�2-/�?/-/�?/-/�?/-/�?/-/�?///&5�2&5�2&5�2&5�2^����4�4�^����D>W���D>����D�$>���$�t|�d���t|�d���t|�d���t|�d���Vi���me$�)�4mm�55�,1W�-� ,1��-� ,1��-� ,�$1��-�$ ,1��-� �����*�)�+�����*�)�+�����*�)�+��#����*�)�+ps���se6���5ss�5�����?������W?�������?������$��?���$�������?���2�B2�������V�������J�#T�W��#��qH,��l�e������,�#��l�e��#�����,��l�e������,��l�e������,�����||���55�2|�#|���5�#52||���55�2{{x|�B|�5�52��W���e-/�?/������e-/�?/������e-/�?/�����H7�Z�~���H�#7�Z�~�#��H7�Z�~������������������������������e����H���e����H������H�ln���&5�2lnW��&5�2ln���&5�2ln���&512ln���&5�2l�$n���&�$52����������"�^�����"�)"�(�����)"�(�����)"�(��������44�mm�44�44�>>�22����t|L�mm����44�44�.� .���rr�&&��{�M�xB���������������66�������|�|�5�F������-/����WW�4�4�7��7�������������  ������rn�%5���hh��������$$�$$��������$$������&�&���pp����������me���meYR�4�B��e"���e�����B���y�����D>�������?����������e-/�?/ln���&5�2ln���&5D2ln��&5g2ln#��&5q2ln��&5g2D>��D�D>��E���W������4�4�����*�)�+JT�W���qH��$�����e-�$/?/��$�W���e-�$/�?/$$�����������me��meYR�4�����*�)�+���K�K�||���55�2@@�����������//�D>����D>����,1��-� ,1��-� ���?�������?����������e-/�?/������e-/�?/H7�Z�~���H7�Z�~���ln���&5�2ln���&5�2�#���#���#��e�#���H�����S�ps���se6���5s�s������PP�**�)�:"�(��:�D>����,�1��-� ������e-/D?/������e-/D?/������e-/�?/������e-/E?/W"�^�������uu����������D>��t|�d��0��,��l�e��e���������EE�ln���00�,1��-�0� ��B����������4�4H7�Z�~���"�^�����""444444���

4�4�)�44������,,����4�4�*�)+�����5� 5555�5�5��������������������I�I����R����u5�525�52<<B//����k�k����H�����������������������������������"Y"����O�&52//33����������������������������������������e  ,,�??����� ���4�4���������������������E��������6�?����nn����''�:�::�:�U�\�������T���R�a�a��a�a���a��a��a�a=��a?aR�R<���aTT���T���aa��aKa�������BJ��������V�����L����u�eb���k��e��������D�;B�v�,�)"�(�p��se������e�?�JT�W����w�||�������e/I���e"�%$�6�ff����?��"�##����##����-/?/&�&������-/?/�������������������//�4�4�t|�d�&�&���t|�d����,1��,1��ss�1�BB������?����?����B����������ss�55����88�n�Dn�D>��44�;B�v�1�Z�DZ�,1�����&�������5P�bb����w�ps���se������enn�/=�I�t|�d���e8F����%$�6�s�Ds�]R��		�ZZ����AA�=���@@��,,�  ��#�F#- wu��BJBG�	!!uu??-/?/88��LI���^���k�k�	�8�F83+����\\��))����-� -� 5�5��������������������������55�		�BB�^����9�G9�����RR�>>����		VV�II���mm�@@rr�&�*&U��>�����}�}����//>8�>>��b�b�$�$/��������B�B������D��J�GJ�33�))�33�4�4

]���		���F�F���D����G�&�$&���$�O�DO��F55�		55���[[�88z�Dz�?�G?rr�??��������AAt�$|�d��$��D��G��"��������<�D<��F��D��j�Gj`�D`�7�F7]]�//]]�6���5����D���G���?����ww�\�\��h�Dh�&�G&n�n�7�7z�Dz�K�GK]�D]�3�F3�D��z�Gz���?�D>����D>���������,1��-� r\�rr�����ww�&&����$$������WBB����BB�������e-/�?/���//��//�==���88W^����88�^����88�^����]]�33�	�D	��G�������	�:	��:�<�:<��:%%�		44�$�)�4�����������=�D=�
�G
����������||�AAff�HH''��d�:d�%�:%������������������V�����4+��������55�		�������"�"����u�Du�8�G8m�Dm�A�GA�n�4n�9�9��D��A�FA]�@]�*�F*h�@h�,�F,#�#��z|�����=L�>��,,�cc��  ****������7��u���ll55==//4��(//;;//��=
===
����**55>���5��5�J���dd��������������Q����������������������\����D�������������nn���Y�Y���������������''�A����������������������|���������\��������//�P���fLa��gOg��gg���O����g�����gba��g��g��g���giaZ�Za����00g?a���gma��gva����g���e������g|avv��v���ama�;�Ju,00a)a��a=a��e�������a������g���bT��TZ�Z�����������m������=����������)?P'��'�5524��40��a������LI//BR��$�)�4���|�*�)+�:��qH�}���LI44��g��g+a��g�����gpp���T�Ta�a���gia���aZa��TT���qqahhahhaT�T�T�T�T�T���a0�0g?a0�0a���gma���gma��axa��g�������gT�T�v�v���ama��a��a��g��aJa��aa���a���a���a���D��>�����;B�v�BR��;�PB�v�B�PR��;�mB�v�B�lR��t�|�d����Vi���me$�)�4V�Pi���me$�P�)�4V�mi���me$�m�)�4V�i���me$��)�4V�8i���me$�8�)�4,1��-� ,1��-� ,�81��-�8 ,�C1��-�G ,�1��-�� *������|���W��*�)�+ps���se6���5p�Ps���se6�P���5ps���se6���5p�s���se6����5p�Gs���se6�G���5��H��?���H������?���gJT�W���qHJ�PT�W��P��qHJ�mT�W��e��qH,�P��l�e��P�����,�P�Wl�e��P�����,�s��l�e��p�����,�8��l�e��<��������w����u���w����u��P��w��P�u||���55�2|�P|���5�P52|�e|���5�a52|�8|���5�852��#���e-/q?/�����e-/R?/������e-/�?/������e-/�?//=�I���L�I/=�I���L�IH7�Z�~���H�P7�Z�~�P��H�P7WZ�~�P���H�g7�Z�~�o���������P���P�����������R��P���P�����e��Y�H��P��e�P���H��q��e�m���H��8��e�3���H�o�Qn���4�Q52ln���&5�2l�8n���&�552ln#��&5q2ln��&5R2,,�D�����,�P,�D���P���������������������������������������P������P��%$�6�	��%$�6�	���"�^����)"�(�����)�P"�(��P��)"�(����6���5��R�H���1�^��1������������cc�..�D�P>���P�D>��5�D>��,�D>��,�D>�g�D>�s�D�P>���P��D>��L�D>��L�D>�n�D>�q�D�P>���P��,�P1��-�P ,1��-5 ,1��-� ,1��-, ,1��-, ,1�-g ,1�-s ,�P1��-�P� ���?���5��P��?���P������P�����e-�P/?/������e-/5?/������e-/,?/������e-/,?/�����e-/g?/�����e-/s?/��P�����e-�P/�?/���44����44����445���44���P��4�P4l�Pn���&�P52ln���&552���QQ����QQ����QQ5���QQ���P��Q�PQ�"�^�����P�"�^����"�^��5��"�^��������oo�((�..��################{>��H�>�>�*��*��q4�r5��������q��q�q]�q]�����������������g�	eq�e�*��e�*��e���e���e�]��e�^�e����������������T��^����������J��K��-/?/-/?/-/?/-/?/-/?/-/?/�]��e�g��e� ��e� ��e���e���e����������������������������������������������������####��������-/?/-/?/����################{>��H�>�>�*��*��q4�r5�����������������g�	eq�e�*��e�*��e���e���e�]��e�^�e����������������������������������������##�##�##########D>��D>W��`��L�D�����������������(��+eu�ep��se�����������������?���W?�v�b����&�&&�&"�"�������������������
e�k��e������ff�UT�����ama�����L�����b�����v��A�����K��������Uh\h�A���Th��T��Th�hTA2��7�?�����m�T���|����������d+��vA��u55������&&�=��g��V�H7�Z�+/�D�ff�������JT�W�D>n���������h4h4�A�>����e�����e���)*)>�����//�7�7��0���0���H�z�Dz�6�F���5J�DT�W��F��qH�D��F������@��@��@�������������������kk''���//���TZ�Z���y�1�"����(��65����������r�Dr�@�F@Z�DZ�#�F#bb�!!���w�uu������e���Z�DZ�#�F#����;�(;��(������a��a5�4��e��W�u�e��)������"�����JT�W���qHJT�W���qHJT�W���qH,��l�e������������e<>N>������e/=�I���LI�����&4�@���V�����4+��V�����4+��+/�D����4�4�4�4�$�*!���f$�)�4��������u552-,����e��������||���552t|�d�'*��6���5��������|�,,*�)+JT�W���qH||���552~����������A��e&�=�u==g=<66�
��"�e���ln���&52������U]�D���H�m��3��[ht|�d���)"�(�Vi���me$�)�4�����

������������33a������//������*�44���<��|������������������"��"//��,~,���+�+��$�$�������VY+�����������{{���g88/"4��4"Y"222������a (������)��i�Bi�|�B|�cc�:���l�e��|���D>��,1����$��?�ln��������������������������������������������������P���������������������Y����$������$�����������H������������e�������?�52�$�-�$ &�$52vv<�<v��<vy��<vy�<vx��<vx��<v@�<vw��<vv<�<vz��<��<O<��O<
<�<�<�<"�<��<�<��<�$<�<U�<��<�<^h<^^<�<58<�<58�<58"�<5�8<�<58"�<58��<##<2<###<##"2<###<��<�<���<���<��"�<��"�<����<���<���<����<��$�<�<��<�<GA<<<GA<<GA"<<G�#AC<<GA�<<,,<C<,,,<,,"C<,��<<��<��<��"<���<��<��<�b<���<��$�<<��<v�bv<�<v�bv"�<
<�<
�#<�<�v<�<��v�<��v<�<��#v<�<��v<�<���<pp<�<88<[<88[<88"[<8�#8<[<8�b8<88[<<<<d<<<<d<<<<d<<<<"d<<<<�d<<<<d<<<<"d<<<<�d<<<>=<<<<d<<vv<��<�<��<<�x<<d<��<�<���<��"�<��#�<�<��<�<���<��"�<��<�<��"�<�#�<�<,,<��<�<���<��"�<���<�<��#�<�<�*+<@<**@<**@<**"@<**�@<**@<**"@<**�@<*�$*<@<**U@<**@<��<�<��<�<���<��"�<����<���<��<�<��<�<���<��"�<����<���<��<�<���<��"�<���<2v�v�*������������������������������������]]���r�����n�)����Ab**)�7)��������$������Ta��V��T���:�UTa�a�Ta��H���P���UTa�a{�@���T���D�{>��H�>�>�*��*��q4�r5�p��seg�	eq�e�*��e�*��e���e���e�]��e�^�eff�����������������������������%q�/{��4��4�� �� �g�h�G��3�################�������������������������������
<�<<�<��<�<��<�<,,<C<,��<<
<�<pp<�<88<[<<<<d<<��<�<��<�<���<�<��<�<AA<��<<���<���<��<�<����<����<<<<d<<AA<
<�<��<�<,,<C<,
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<��<�<��<�<��<�<��<�<��<�<��<�<��<�<��<�<,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,��<<��<<��<<��<<��<<��<<��<<��<<��<<��<<��<<��<<��<<���<���<���<<<<d<<<<<d<<<<<d<<<<<d<<<<<d<<<<<d<<<<<d<<<<<d<<��<�<��<�<��<�<��<�<��<�<��<�<��<�<��<�<��<�<��<�<��<�<��<�<��<�<��<�<��<�<����<����<����<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<,,,,,,,,,,,,�<�<�<�<�<�<�<�<�<�<�<�<��<<���<��<<��<�<����<��<�<<<<d<<AA<
<�<��<�<,,<C<,
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
��<��<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<��<�<��<�<��<�<��<�<��<�<��<�<��<�<��<�<,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,��<<��<<��<<��<<��<<��<<��<<��<<��<<��<<��<<���<���<��<<��<<��<<<<<d<<<<<d<<<<<d<<<<<d<<<<<d<<<<<d<<<<<d<<<<<d<<��<�<��<�<��<�<��<�<��<�<��<�<��<�<��<�<��<�<��<�<��<�<��<�<��<�<����<����<��<�<��<�<��<�<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<,,,,,,,,,,,,�<�<�<�<�<�<�<�<�<�<�<�<�&?F_nn4~~5��6��M�|l��-��.��/:;4=?6AA9DD:FN;QVDXYJ[[L]]M_`NbbPdlQppZrr[tu\zz^||_��`��a��g��j�&r).�7��nv���������	
%((00;_�L?R[�_h�lx|���				 	&	&'	,	,(	E	E)	I	K*	a	a-	e	e.	h	i/	k	m1	t	t4	{	|5	�	�7	�	�;	�	�<
3
3[
=
>\
@
@^
B
B_
D
F`
N
Nc
P
Pd
Y
ae
c
cn
y
zo
�
�q
�
�r
�
�s
�
�t
�
�u
�
�v
�
�x
�
�z
�
�}
�
�~
�
�
�
��
�
��
�
��
�
��
�
��
�
��
�
���
�����  �)/�22�66�:>�@D�HJ�OX�[j��������������������������������������� ����
�
��
�
��
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
 �,�,�9P	A
�
B3K04k]jplm~`��	A	A�	�	��
h
h�
m
v�
�
�������� &,28>DJPV\bhntz����������������������
"(.4:@FLRX^djpv|���������������������$*06<BHNTZ`flrx~��������������������� &,28>DJPV\bhntz����������������������
"(.4:@FLRX^djpv|���������������������							$	*	0	6	<	B	H	N	T	Z	`	f	l	r	x	~	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�������|����6���������������v��i��Y����&"^����=�������������������������8�8����`�����������������H���������������������������j�d��3����j����$�8���,�8����,����դ'�'6�'Afonts/notosans/stylesheet.css000064400000000000151215013450012427 0ustar00fonts/notosans/NotoSans-Regular.eot000064400002222350151215013450013420 0ustar00�$	($	�LP���_ @)�]}o�Noto SansRegularVersion 2.007"Noto Sans RegularFFTM��5�	$GDEFgQa����GPOSlh�Tp��GSUB*�[X�0��OS/2b��`cmaphNOK0gasp�|glyf��:���thead%�T�6hhea��D$hmtx>hr�IHloca,rB\OPILmaxpuh name����		post������`preph��OH�o}]_<���'6�'A���v
�C-������
�RRyQ��XK�X^2B���@ _)GOOG�
��-��C��� -X^M
H�A�<>?1�5�A,(,')<2)B(Ht
<1<Y<0<-<<?<7<,<1<2H<2<8<2��:�ax=�a,aa�=�aS(��kaa�a�a
=]a
=na%3,
�ZX�J6<&IPt
I<&���(1.gU�7g747Xg7jUN��UU�UjU]7gUg7�U�3ijO���'|'�| <2
H<[< <;<'�;D�@1e �(<2B(@1��7<2^^(oU�7H�^%x �'�"
�q��x=,a,a,a,aS(S(SS��a
=
=
=
=
=<@
=�Z�Z�Z�Z6]awU1.1.1.1.1.1.`.�747474747��L����]7jU]7]7]7]7]7<2]7jOjOjOjO�gU�1.1.1.x=�7x=�7x=�7x=�7�ag7�i7,a47,a47,a47,a47,a47�=g7�=g7�=g7�=g7�aj���j	S����S��S��S(S(Ud(N����kaUUWLaAaUaU
���ajU�ajU�ajU��ajU
=]7
=]7
=]7�=�6na�Una�>na�G%3�3%3�3%3�3%3�3,
i,
i,
i�ZjO�ZjO�ZjO�ZjO�ZjO�ZjO�6�6<&�'<&�'<&�'FUg	�
gagU{ZdRxx=�7�*
g3g7\F,<�;L6M������=:�U\ZS"kaU��Z���jU==h73=M7�
gUna%/�-<&e��i@
i,
Z�O%�Z@<&�'H#H7�"�:0H#�!�$KUP�+�A
Ha�a=7aaU	a�alU1.S��
=]7�ZjO�ZjO�ZjO�ZjO�ZjO431.1.q��`.�=g7�=g7ka��
=]7
=]7H#���a�a=7�=g7�a�a�ajU�1.q��`.
=]71.1.,Q47,a47S����S��
=]7
=]7nW�na�T�ZjO�ZjO%3�3,
i?&��aj���a_7�:T2<&�'1.,a47
=]7
=]7
=]7
=]76�}�U����7�7x=�7
,
�3�'����
a,a47�����=g7n
�
6�1Qg7ggU�!0g7g743433�+�!�!X7��g6g7>7����jQjUjU
LR@$z^��U�U�Q�Q�Uj��jUxU]7`78�6����U�UZRZ/U/U�3��������iij
]eQ����''�������7
=@UX->7}U��	�Ug7���7�77��^^�U[U�NUs��s���7�7���7

k7�L�g�����!!
�(�(�(y(((�(y(((BHBH�(�( �(�(,(�(�(�(���(J�77!X�N�N�N�N�N�N�N�(�(g�(�(K(K(M8(�(�(�(H(((((((����Y��l�0�e���s�������W�������d�d�������������������������������O���s�����������N�C�X�W�d�d�H�l� �1�N�0���o�:���N�C�C�����0�`���H���i���&�0�����H�H�X�Q���������d�������H������@����������~�������������������^���������avU�<�U�'���b�U�R�!�7�!���(���
H�
�



I
L���a�a
,a<&�a
=S(kaa�a�ap<
=�a]a<&,
6K3J5Z�S6o7�-`ULRVOo7eUL-�-�7`UR7LRUrU�7]7�XF�7f7�VO�7R�OAL��VO]7VOAka�UoP"
P�7ZU�=]7x=�7�aa�,0Q��	���XF�7��=�7�]agUx=�a�U]xx=x,a,a�
a�=%3S(S����a�
jabp�aga�aa�,aVL&bbja��a�a
=�a]ax=,
p$3J�a�P
aa�Za�aya1.W9@U�UE47��!�U�UUB�U}U]7pUgU�7���6xUeJ�U�U�
URU�DU/4747j	�U�7�3N����JvUj	U�U�rU��	z	�a�U�<�aU���aQUK�$Z�O=]7{{�=G75=�7=�:��<�7a3�5�8�����H����a�UgR	eagUa�U��aU�L&�!�a-UjaUj
	�o�a�U/a�U a_U=�7x=�7,	�6�6�w(^	��PmJ�P^J�ajUQ�Q�S(V��a0U�K�amU�a�U�PeJ�a�US(1.1.q��`.,a47�;43�;43V�L&�!H#�b�Ub�U
=]7=]7=]7y�p�p�p��PeJa�UZa
U�x&Jg>g7�>�6�#)&y#&�[�a�U�=�7�	�M5�+�J�)&a2U�p
=g7�jaU�2CakU�a�U�a�U��r��{��S�J�����GN�����$�U�))))�����23O�z�����IA3�:�.g*++8;�.VD�����,�(B��V����$�9���������%�g�T���(�j�W�Mg���[�c���N�����23�A3DU��.�.{�W�'K'�'T'Z'>'T'g'&'H'G�@=i������+�D3��?A;��������r�2����t�����3���3�k�T�T.5E�7b7����Uy��z	X1������2���1�P�E����� ���[�3���2)�������$$������3�*�*<*�W8�:)�$''��
-t/���
�`3@

;TVT$�V�!V[2V��VjVz;
#^^^�4'9z;z;�V�TQj&j(��
�'�!���V�
TV�V�5C�=���?�
�?i?i'�(�?�����?U?N?�?�?�(�&�?�?i�;]mm5�$2!�7�$o$o!:>�$�8[7`7�7�$8�&�&�7�
�3�`5JH
�7Q��$f�37�3J�7Q�.�$f�Qg��g7X�����j��g�����Z����i���"gU�7J*�@$Zg
T
]
gUg7X7U(�UjUgU�(�3�����'1.g7g747�+�!�3N�!��jO�!�	8$Y�$?�
����$�5��5������7�7`7`5����7�7�$�#7!����
���5�5J22`D	�$�U�C���H�l�h�l�h�&�&�������\������;�����]�K�n���������������������������������������������}�����m�^���������e�e���������]���H1.�agU�agU�agUx=�7�ag7�ag7�ag7�ag7�ag7,a47,a47,a47,a47,a47aX�=g7�ajO�ajU�aj���%j�ajUS����S��kaLkaUkaUaL����a��a���a�U�a�U�a�U�ajU�ajU�ajU�ajU
=]7
=]7
=]7
=]7]agU]agUna�Una�Ina�Ina���%3�3%3�3%3�3%3�3%3�3,
i,
i,
i,
i�ZjO�ZjO�ZjO�ZjO�ZjOX�X������JJ6�<&�'<&�'<&�'jUi�7.FUFF
�Z\-1.1.1.11.1.1.1.1.1.1.1.,a47,a47,a47,a47,&4,a47,a47,a47S(<S(N
=]7
=]7
=]7
=])
=]7
=]7
=]7=h7=h7=h7=h7=h7�ZjO�ZjOZ�OZ�OZ�OZ�OZ�O6�6�6�6��a�=P5\
��o7o7o7o7o7o7o7o7�
�
y
y
e
e
�
�
�-�-�-�-�-�-�
�
�
�
q
q
`U`U`L`K`U`U`>`?{
�
>
>
*
*
q
r
LBL8L��L��L��L��L��L���

�
�
�
�
�
�
]7]7]7]7]7]7q
{
4
4
 
 
VOVOVOVOVOVOVOVO
�
�
�
AAAAAAAA;
E
�
�
�
�
1
2
o7o7�-�-`U`ULLR]7]7VOVOAAo7o7o7o7o7o7o7o7�
�
y
y
e
e
�
�
`U`U`L`K`U`U`>`?{
�
>
>
*
*
q
r
AAAAAAAA;
E
�
�
�
�
1
2
o7o7o7o7o7o7o7�
�
)LR)�(�(`U`U`U`>`>�
�
�
�
�a�)�)�(L��L��L��L��L��L��SS

�L�L�(VOVOVAVOXFXFVOVO66 

�
�����(AAAAA�

]
I
��(L����M��<�d���+B(B(<(�(�(�('��������gg�gA<xMpD��HHHXX���,��������1-�'�'H'�����Z���6(6'E2�H��aav^B(��ADODW��H<$�^6X')�,]')t�O]<5'64=5�5�5'HH�XXXXX������������^�3^
^^^^^R#R#R#�>��7^^%^^^
^^^^^R#R#R#�>�mo$�$Xo!�7[7�7`7�7�77!�
<$<3<8<-<!�U<
LAS�
Ui7<<<�<<
�=`%x=m�"<O<
*;F
p7<a�� � x2�7= 5A](L6yj7D��"���	ajg�/ A6R
a�_@1D,�a
=h��Q�alaTa*8(^v&��SJLkaF�=k2�[8������a%"x�N�)ca	1(a	al�E6�$C	�	W W�o�c��,����0%%%>�%J[B
%6> >>#>0�%�!d'2R0

��]
na1.i�avU�a/U<&�'�=a�b�.�
a�U�7�5�]7�:����#3A"���������a���������������������������f�d���@����������t�r���}�q�x�x�����{���#�#�5�5�5�<�>�>���5d�L���z;5R���B<2�>�>;2<2'�'�MPMMPM�����(�4545=554�#A�<fHLH)J�<���+B�((��CfL�:>(�1�<�(J(�(�(�(�(Zt
<Ha>R�a�b<,A"�#A"�##-�-�,ZR�ZoP	=�"=�:�����cKa1U=D7�aLU��e�a>T�
�x����Ta�U
=]7	=w58=�7q+�����L��#C���������u�����`�V��BwB��E#3�+�&�!0K�HR���"��`uU"�V��aiUa�UC=�7=]7��7�u��Z(Z(Z(Z(Z(Z(Z(Z(�N�N�N�N�N�N�N�N�N�N�N�N�N�N�M5(e(i(Z(�F�F
H
H
H�(�(zFEF�1�+�aiUB
(O1-.+#n#N�O�(��.��.T�.}.�.}.x�!k
	kaUk
	iaYU
t�=�5C=�7]g��T
f	
=g7�=�7J-� �9B'^��
$�]
g
Zg<aU),����V4K5~"7�UPU U�U�U�A	W5�\�US9S9J0U\�U�\�Up7� �(H�2
Q
Q�a���5EavUg����7jU�
A6	��K�1O+�1X-�JO<�gf�il���#�R
L&�=a��Kx0k,!������^wU=�:�4j.��80�����C7!{x=%3<&�ag7%�(�.2�g#%V]3�aS(_�N�N}Nn(n(n(�C�93�cQ�c��/�(�,���������������������6:::::�9�:�[�Xa)��g�.�:6X
b5���z��UiUiU�,�,C-�6�C�C�5�5oP"WFUPU���xfiPi�P�T�'G��/��r�r��yiPH��7�����U6S[.�Og7c+�7���,<,P�ZZ���UH3�|����������w����������f��)�)�b�a�[..44a�a,aS(�Za�aZ����������\Z
G����<<�������a�a#jU1.47jO�J�E�������B��PJ����cc������
J......FJFFJF�J�J�J�H�J�J�J�D�J�J�JP/P/P/P/P/WJWWJ#%#%#��#��##%#��%#��#%#�����J�J�J�J�J�J�J����JoJoJoJoJoJoJx0x0x0x0x0x0x0x0x0x0x0�0�J�Jx0�J�J�J�J�)�)�)�)�)�)WE�����TETETETETETETETETETETE�����������.2a�a\6aa�f�?#"#I#/#'##0#(# #%#"K6�",8/;?8
<1?/H7�+&<-<<?<7�M:<2<1^^%^^^
^^^^^^^%^^^
^^^^^��89<�5�6q
q�5��<]lNNNN"&"(&&#'NNNN""&&(&#'%'.%%%NNNN%'%%%""#""""'%'%%%??NNNN%GGGGG3%%%%%%%%"%%-****+NNNN_)N�QItD�E�N~N~M�5�Mn;���U������������7U������P
�7W W�o����

�
�
�
�


1a�
�
�
�
�
�
�
�
�
�
X
X
D
D
�
�
��
�
v
v
b
b
�
�
�
�
o7o7o7o7o7o7o7o7L��L��L��L��Z��Z��Z��Z��Z��Z��Z��Z��VOVOVOeOeOeOeOeOeOeOeOmA�7
J�J7�J�WJx0#%�J��JoJ�-x0MJ�J�����0��E�0#%##���x0�0�JWJ�J�J�J�J�J�J�J�J�JWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJ#%#%#%#%#%#%#%#%#%#%#%#%#%###x0x0x0x0x0x0x0x0�J�J�����������������0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0333333333333zJzJzJzJzJzJzJzJzJzJzJzJ�0�0�0�0�0�0�0�0�0�0�0�0#%##���x0�0�JWJ�J�J�G�F�J�J�J�JWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJ#%#%#��#��#��#��#��#��##%#��#��#��#��##��x0x0x0x0x0x0x0x0�J�J�����������������0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0333333333333zJzJzJzJzJzJzJzJzJzJzJzJ�0�0�0�0�0�0�0�0�0�0�0�0H�())L�L�)�L�(�(�����(�(�(�(�)�(��))L�)�L�)�L�(�(�����(�(�(�(8Q�����$�U�))))����U��O�z����I�:�.g*8;�.V�,�(B��.���.[�_���<��IA3�]�.j*f4d��.^H�����(x��<H�.�[�_���<��IA3�]�.j*f4d��.^H����(x���23O�z�2�IA3�(�.g*+8;�.VD�����,�B�,+D�.��23O�z�2�IA3�(�.g*+8;�.VD�����,�B�,[�P_����^�Y��IIAA33�~�.j*�4d�.�H����x+,^HJ.#[�P_���^�Y�IA3�~�.j*�4d�.�H���x+,&&&&,,,,33AA33�G���$�$�$�������%�%�%�g�g�g�T�T�T�������(�(�(�j�j�j�W�W�W��������)))����������)))�����[������RR������IhAAA[[3R�����ulj���������g�8����^���Y����HLHMfM������� ������=���������.�.�.�.�.�.�.�.'X'8'R�����J�����J�����I�����I�����w�
�
�H�H�H�H�.�������.���������������IA3�����IA3����4�4��I�I��.�.��I�.�.�.�.��I��X��9�������.�.�M��-��V���%�g�T���(�j�W��$�����J�������%�g�T���(�j�W���$�����I�I�,�,��s�"<9FsbDb;_I'2.T1H�*'0'W'/'(''@'7','4'4&U&,'2'2'2Gdl�*d6'����,�x6'2�(�(8R8Q�S�Q$H'E'2T1'H������c�K�W� �A�F����
$$����R�)���������.�x@8
~w����/	�����EMWY[]}������� d q � � � �!_!�!�""%�,.R�����ʧ��9���.�k���/������
 �z�����	����� HPY[]_�������  f t � � �!!�!�""%�,`-�@��§��0��.�0��� ���������������������������������������������������Q�B�������F��c�c�c�cmc=b�bi`h�
�
���
	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abc���������������������������������tfgk�z�rm	dxl��uiy{n~d���epVo�d�����������<�	-�����{���������������������s���|��������((((((d�����H���� @�� ��L���h��		,	�
�
�8��(���
(
d
�
�p� t�T�<h���(Dt�T�t�@��`x� t�L�`��X��p��44p�8�@L  p � � �!�!�!�","�"�#$#x#�#�$$D$�$�%H%�&�'','D'\'t'�'�'�(((4(L(d(|(�(�(�)),)D)\)t)�)�)�*d*|*�*�*�*�+(+�+�+�,,$,<,T--$-<-T-l-�-�-�-�-�.p.�.�.�.�.�//\/�/�00$0<0T0�0�0�11(1@1X1p1�1�1�1�1�22202H2�2�3\3t3�3�3�3�3�44�4�4�4�4�55$5<5T5l66$6<6�6�6�77(7@7X7p7�7�7�7�7�88808H8`8�8�8�8�99H9�9�9�9�::0:H:`:x:�:�:�;(;�;�;�;�;�<<<�=$=<=T=l=�=�=�=�=�=�>>,>D>\>t>�>�>�?,?`?�?�?�@@@4@L@d@|@�@�A A8APAhA�A�A�A�A�A�BB(B@B|B�C|C�C�DLD�EExE�FF`F�GG�G�G�HpH�I8I�J0J�J�KKtK�LL�L�M\MlM|M�N`N�OTO�PLP�Q Q�Q�RR|R�S SdS�T T�T�U$U�U�V V0V�V�W\W�XXtX�Y4YLYdY�Y�Y�Y�ZZ(Z@ZXZpZ�Z�Z�Z�Z�[[[0[H[`[�\x]]�^h__�`X`h`�a�b4b�b�cc|dd d8dPdhd�d�d�d�d�ee e8ePehe�e�e�fHf`fxgg�hhh4hLhdh|h�h�h�h�h�ii$i<iTili�i�i�i�i�i�jj,jDj\jtj�j�j�j�j�khk�k�llXmm�nnhnxn�n�n�n�o|pp�q\qtq�rr�r�r�s$s�t tXt�u�vv�ww4wxx(x�x�yy�y�zz\z�{@{�|<|�}$}t}�~8~�,��,������0������������(�p��$���������X����,�\����T�������h���������h�����\����H�������������X�����P����L��� �L���� ����L������l���T�����8�T���<��������8�����$�����<�p���\�����T�����4�|���H�X�h�x���������<����������T������������ �4�H�l��������������<�h�����@�������X�t����X�x��������$�D�X�l�|��������T�h����������(�D�`������������ �4�P�d�t����������$�H������,�<�L�\�p����������8�X�x��������H�\�p�����������8�L�`�t��������������$�@�`��������L���������������4�H�\�x���h����4���$�4������D��������������� �4�������L�����$�d°��\ü��<�tĤ������@�`ŀŐŠ�������(�8�Xƴ�������(�@�X�pLjǘǨ�����,�<Ȥȴ����� �X�hɌɜ�����ʀʐ���T�l˄˜˴������x��H���X����tϬϼ�<Ш��рѐ���8Ҥ��DӔ��t���P�hՀ՘հ���,��ׄ������ؘ��Xٴ��xڤ���T���<ܜ� ݰ���������� �0�|��0�@�X�p߈ߠ���p�����@������������$�D�����l��$�X���������$�4����H����@����8��������`�p��0�t����T�������� �D�T�d�t�����L���� ����,�D�\�����P�`�p����T�d�|���D���8�����P����\���$�����x�����������T����l�����D�\����|h�X�� T����P�		�	�	�

@
�d�\�
8
t
�D���8p��@�d�Dp���D���4�� t��H�X��h�D�P��(`��P��(���p� d t � � � � �!!X!�!�!�!�""("@"P"`"x"�"�"�"�"�## #8#P#h#�#�#�#�$$X$�%%\%�%�& &0&�','�( (�(�)l)�**\*�++`+�,,(,�--�-�.0.�//�/�/�/�/�040|11�22|2�2�3(3x3�44�4�5�5�6`6�77\7�7�8�9d::�:�;T<<�=�=�=�>T>l>�>�>�>�?d@,@p@�A�BB�CDDD�EEpE�F�F�GXG�HxI IdI|I�JhJ�KpK�L$L�MM�NPNhN�OpO�PxQQ0QHQtQ�RR(R�R�S SdS�TT\T�T�UU$U<UTU�U�U�V�V�WW4WPW�W�X,XDX\XtX�X�X�X�X�Y�Z�[�\`\|\�\�]�]�^�_0_�`d`�a(a�bb0bHb`bxb�b�b�c,c�dtd�e0e|ff�f�g<g�hhxh�i�i�i�jj<j�k$k8k�k�l`mmLm�m�nnLn�n�oDoho�o�o�o�pLplp�p�p�qqDqXqtq�r,rpr�r�sTs�tt`t�uTvv�w�x�x�ytz$z�{�|(|�|�|�}X}l}�}�~~�4����@�����$�\������l����d������4�l�����H�l�����p������������$�X�|�����$�l�����������p������8�X�����(�x���8�������T���<���`���,�����P���8�t����x����H�|���,�l����D���4�t���`����D�����@�����<���4��������H���t�����(����D���P�����\���<���T���d�������������� �����,���d����(���H���$����x���D���L����H����P�������d�������p���4����� ����`����p�����0�X ��Xð�Ā���0�P�pŐŰ����8�Tƌ����$DŽ���H�`�ɐ��|���`���$�d̜̀��� �X͠���PΈΰ�$τ��XР�(р���8Ҁ��Ӝ�(ԤԸ��� �L�pՄ���P֔��$�<�T�lׄל״������$�<�T�l؄؜�ٴ�����@���,ۼ�������<�\�t܌ܤܼ�������4�L�d�|ݔݬ�����l�����,�D�\�tߌߤ�������,�D�\�t����������4�L�d�|��L�����(��0��������(�@�X�p���������(�@����d����������4�L�d�|����������,��D�\�t����������4�L�d�|����������$�<�T�l����������,�D����T�d�|�����`�$�����8����������|�8�����0��������������d�L��L<\�4Ld|�	D	�
�4��
x8Xx����� 8Ph��������0H`x����<��0l�H�$<Tt����,Dd����4Tt����$Dd|����4Tl����$D\t����$<Tt����,Dd�����4Tt����$Dd|����  , L l � � � � �!!<!\!|!�!�!�!�"""4"L"d"|"�"�"�"�"�##,#L#t#�#�#�$$<$\$|$�$�$�%%D%l%�%�%�%�&&8&`&�&�&�&�''<'d'�'�'�'�((D(l(�(�(�))$)L)t)�)�)�**,*D*d*|*�*�*�*�+++4+L+\+�+�+�,,,4,T,l,�,�,�,�,�---0-H-`-x-�-�-�-�-�..(.@.X.p.�.�.�.�.�///0/P/h/�/�/�/�0$040T0t0�0�0�0�0�11,1D1\1l1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�22 202L2d2|2�2�2�2�3$383d3�3�44P4�4�4�55$5<5\5p5p5p5�5�5�66,6,6�88,8D8�8�8�8�8�99@:::�:�:�;;4;X;h;�;�;�;�<<(<L<�<�<�==T=l=�=�>4>d>�??(?�?�@H@�A�A�BxBxBxBxBxBxBxBxBxBxBxB�B�B�C CTC�C�DDPD�E,EPE�FXF�F�F�F�G,GlG�G�G�G�G�G�G�HH H4HHH\HpH�H�IIdI�I�J8J|J�J�K4KtK�LLL�L�M�N$N\N�O<O�P@P�QpQ�Q�RhR�R�S�T@T�UPU�VdV�W0XHX|X�Y0Y�ZPZ�[[�[�\�]h]�]�^X^�_�_�_�_�`�bhc�c�d0d�e|fPgtg�h�h�iLi�j�kLk�m�n�olo�pPp�qLq�rr@r�r�s,ttLt\ttvv�w`w�y(z�z�||�}$}\}�}�}�~L~�|���\����4�T�����p��h���L�����h������� �L��������0�T�x���h�x�p�,�H�X�|��������x���<���P�`�����D�x��������8�H���t��� �D���<���(�P��������x�����0�l����<�x������t������8�t�����$�p���4�����@����L����8�x�������<�`���T���t��������$�L�t�����L����,��������(�D��� �D�h���������<��������T���$�����X�l��������8�d��� �8�X���T����@�������$������X�����D�t���D�p�����(��������x������l���`�Đ���HŜ���HƠ��x���TȠ���`���0ʌ���Pˀ˰��\̼��\Ͱ���8���`ψϠ�\ҌӴ��Ԉ���0�h���X֠���H�|������@ؔ�ِ�0���4ۜ�<���(ݐ���ހ���8߈��� �|���\������x���(�h���,�`������<�p����8�p�����P������$�H�d�����4�T�t�����,�X�� �X����H�`���L���p�����4���(��,�������L�d�|��� �t���4�������$�L���,�D������\���H���`��|����0t� �� �X�X�8�L��h�D�		h	�

�
�L�4�

�
�� ���|�P��� <X��(t� ��\�|�$�<��(��\�8���Xh�X�� ( L �!,!�!�!�!�"0"�##�$$T$�%\&&�'X'�(H(�))�**@*d*�*�+d+�+�,,X,�--4-\-�-�-�.$.x.�/(/�/�0P0�1H1�2D2�3@3�44�55�5�6<6�747�7�7�7�8�9�:T;;�;�;�<L=<=T=�>>�?X?�@L@�A8BB�C4C�D<D�ELE�F�GG�HlII�JlJ�K KTK�L<L�MM�M�NNxOO�O�O�P�QQ|Q�R$RxR�S8S�TTtT�UU�V,V�W(W�X0X�Y�Y�ZZ0ZHZ`ZxZ�Z�[,\\\8\d\�\�\�]] ]L]x]�]�]�]�^^8^`^`_�`�`�`�aha�b�b�cpc�c�c�c�c�ddd0dHd`dxd�d�d�e8ePehe�e�e�fff4fLfdf�f�f�f�ggg�g�hHh`hxh�h�h�h�h�ii i8iPi�i�i�i�jj$j<jTjlj�j�j�j�kk0k�k�k�ll,lDl\l�l�l�mm4mLmdm|m�m�m�m�m�nn4n�n�n�o0oHoxo�o�pp p8pPphp�p�p�p�p�p�q,qDq�q�q�rrXr�r�r�s<s�s�s�ttxt�t�uuu4uLudu|u�v v8vPv�wwPw�w�xx,x�yy(y@yXypzztz�z�z�z�{D{�{�{�{�{�{�||(|�|�|�|�}p}�}�}�}�~~0~H~`~x~�~�~�~� 0HXh����$�<�X����������������� �0�x����|���(�����h���4�h���<�����p���4���$�8�L�`�t���������������(�<�P�d�x����������|����$�`������������T�������(�P�t������� �L�p��������D�l������� �P�x�������$�P�t������� �L�t��������8�d��������0�X��������� �L�x��������@�l��������@�l��������@�h��������D�t��������D�p��������D�t��������8�d��������@�p��������4�`��������0�X��������4�\��������,�T��������$�P�x������� �H�p���8��������\������\�������,�<�T�����(�8�P������$�<�d�������0�H�h��������(�P�x��������� �H�p����������@�h���������0�H�h���������� �8� �������� �D�h���������p����h����������(�@�����t�0�T�x�����X��������X�h�x��������D�T�d�����������(�8�H��������������������(�8�H�X°���������� �0�@�P�`�pÀØð�������(�@�X�pĈĠİ���������� �0�@�P�`�pŀŐŠŰ��������0�H�`�xƐƨ�������� �0�@�P�`�pǀǐǠǰ��������(�8�H�X�h�xȈȘȨȸ����������(�8�H�X�h�xɐɨ���������� �0�@�P�`�pʈʠʸ�������0�H�`�xː˨������� �8�P�h̘̰̀�������(�@�X�p͈͠͸�������0�H�`�xΐΨ������� �8�P�hπϘϰ�������(�H�hЈШ�������0�H�`�xјѸ���� �H�pҘ����� �8�X�xӘӸ�������8�X�xԘԸ������ �8�X�x՘ո����0�Xր֨�������0�L�h׈ר������� �8�P�p؈ؠ����� �8�P�hـٰ٘������0�P�pڈڠڸ�������8�P�hۈۨ������(�@�X�p܈ܨ������0�X݀ݨ�����0�P�pސް����(�P�xߠ������8�X������ �H�h�������(�P�x�������$�4�D�T�d�|�����������$�4�D�\�l�|�����������$�<�L�\�t��������������<�T�l���������4�T�t���������,�D�\�t����������4�L�d�|��������\�@����,��h�� �8��`�����(�@�X�p���,���P����\���\�����<���x���d���T��������\�t�������������4�L�d�|������������,�D�\�t����������4L�Ph�x��x����P�,�	h	�

�0� ��
,
D
�D�H�h8��0H`x�p�����h������$<Tl���Tl�����\���h��� l �!!(!@!X!p!�!�!�","|"�##�#�$@$�%<%�&$&|&�'$'<'�(,(�) )8**t+d+�,, ,8,P-\-t.p.�.�.�/|0L182$2<2T2l2�2�2�2�2�33343L3d3�3�3�3�4�5t6P7(88�9�:�;�<�=�>�?�@�ApB`B�C�D�EtF<GG�H�IhJPKDL@LXMHN8O(PPTP�QQ,QDQ\QtQ�R�R�SS�TTtUU\U�V<V�WDW�XXX4XLXdX|X�X�X�X�X�YY$Y<YTY�Y�Y�ZZZ0ZHZ`ZxZ�Z�Z�Z�Z�[[0[P[p[�[�[�[�\\0\�]�__�`�a�b�c�c�d�e�f\g(g�h�itjdk,k�l�m�n�o�p�q�r�s�s�t@uu�v�w�xtytz4{T|h}�~���h����X�p�$�������\�����4�D���`�����X�@�X�P������l�(�������L�P�h�h�X�4����������L���������������d������,�L�d���D�\������������<���H�����H�����D�����H�����P�h��������������(�@�X�p���t���p���l���p���t���|� ���d����<�����$���l���`�����4�L���H���`�������� �8�P�h���������������0„�����l�|� ���Hż�D���p������l�ʨ�H�`�x���`���X��(ΰ��h���l�4�(�t��,�x���\����� Ք�@�� �4�D����|���P���`��܀ܘ�<��ބ�d���X���D����0����,���`���0�H����L��4�L�d�|��`�$����p�8�����`�0������L����L�,�h������������L�t���������P����T���H�d���X|����Xt�$$@\���@��<L����		(	@	X	p	�	�	�	�	�


t
�l�,�
�|p�t^��3!%!!^���5���63dH����7#34632#"&�9kt$%%$��l%%$  A�W�#!#�77����l�3##7##7#537#5373373337#���)G)�'F&~� ��(H(�(E(�����C����C�B����B��>���")07.'55.546753.'#>54&'�7h "j3c\gX@5W$ M(BX-h_@63-<@;60A1U�RGJTXWJ
�+?2FW
o�*!(+��+"&'1���%/2#"&546#"32542#"&546"3254�JLIMGKF�tM���&##&MhIMIMGKFL&##&M�ujjwwjju
�6�4QPPR���ujjwwjju?PPQQ��5����+52>73#'#"&5467.546">54&32670P]Q>�!Y0&�wW/tSgzSG 7cR*5&$;30R6=J>@\�QI?X$�Q/@n)�T*4f^M]($R7JRH,'$=%"=($.�� B67B*A���#�7��(�b�
4673#.(GLSFGGERLGz�[^�wt�^X��b�
#>54&'3GLREGGFSLGy�X^�tw�^[�)6��7''7'7'B��wVUMYu����6\�/��/�\6�2oS3##5#5353A��H��H�G��G�)��t7#>73�
1A^i569�4(�3753(��NNH���y74632#"&H$%%$6%%$  
j�	#j��V
�6�1���
#"&54>3232654&#"0hVys/hUxv�~CQPEEPQCfs�Xít�W���������Yc�!#467'73cVL.�I�+4>;�0�)57>54&#"'>32!�(�6J&F84O)/*mDdt.R7�iI�6TQ0;=$ ;#1eY8b_6�-���*#"&'532654&+532654&#"'>32�PDVT:y_8`,-h0`Ui_EFX[F<:R(,&qHpm#HU
XG>a6RKBC;KJ=49"<,d(�
%##5!533'467#!(hU��P[h�����K�#�4I!,��?���2#"&'532654&#"'!!>n��~7a!$g/OaV]H,f��:�ndoSKOFK
QP�7��
�,4>32.#"3>32#".2654&#"7G�e3-E\5R@]r{hDnA�?NEE/F'"D1M�yHK.Ph;#1qhp�D��QUDP'< +U7,�3!5!�%���zPD�z1��
�(52#"&54>7.54>">54&32654&/^x%>%,H+ks|)D'4I8`<7G#<$4GF�JMIMRDBE�XS+@15F1Zie[1H4UB7K(G52%2#>625�(4EE74EI2���,#"&'532>7##"&54>32'"32>54.G�e5'1F[6SA\q9fEDn@�>OCF0F'"D�M�yHK
.Oi:"1qgKl:E��RTEO'< +T8H���&4632#"&4632#"&H$%%$$%%$�&&$  �x%%$  ��&4632#"&#>73F$%%$q
1B
^�&&$  ��4�5&WU#2t	`-5%
	�)��yt�2�N��8��5!5!8�6��GG�GG2t	`7-52y���)�N�2�����+74>7>54&#"'>32#4632#"&�% '+>;1L#(a<_h5$!#F#$$#�&72!,*04F^Q-?5*)�%%$  :��I�?M#"&'##"&54>3232>54.#"3267#".54>32326?.#"I,@,.5F5LS4_A,U
%+K�Sr�Q��=o++kAv�Y:n�ch�]�3+81
(1<e.XG+5"%2fTBe:	�4"3U3]�D^�j��DX�t]�uAV��@:TC}0K~�!'!#3	.'3!V��U[Q��
Q����3*-;�aT�"2+2654&+32654&#-��FB-I*�s��\DS[v�_JMc�Ob?S&F8aj��;:;3�K��J<8E=��Y�"3267#".54>32.�s�{{/T((U;m�IO�nqT$!Q�����NZ�pl�]*La��	+324&+3 ���l�V_��ua"l���P�v����a��)!!!!!�q���#��5�O�N�a��	3#!!!!�Z���"���O�O=���� 3#".54>32.#"32675#��:vKo�OX�u<k."&_3��7v`/B�y��Y�qp�[N��U�I
�a��!#!#3!3�Z��ZZnZM����.(*�)57'5!*��TTTT4;44�����B��"&'532>53$$-Zf�L2-�Agbak�!##3>?3kj�IZZ>�i��U@����"D"��a��33!aZ8��Pa*�!##333#467#��S���Y�ri9�O��I�6�4f ��a��!###33.53�i��Sh}TQ#h7�q��@L �=����#".54>3232654&#"�K�lo�HH�pk�K��ryzppyysfo�\\�on�\[�o�������a*�2+##32654&��5}kRZ�[HfdX�nd;g@���M��BOED=�V�� #'"#".54>3232654&#"�ig���
o�HH�pk�K��ryzppyysf��#��\�on�\[�o�������a_�2####32654&&�*A$�i��Z�fkWPT�ef9L-
��'���N��ECF;3����)%#"&'532654.'.54>32.#"��u<f"$k9PQIA[]:gC;b(%W/CDD:?W-�_jV>5#0)!`S9Q,M9/$0&5J
!�!##5!#CZ��{OOZ����%#"&5332653�<{_��Z]^aWY�JwE�w�1W`gQ�X�#3>7X�Z�^���6�6,M##N-���#.'#3>73>7��[�
�[�^o
~]�n�6�:-	
U.�/�L.V&'\,��N.[#%W/�F�!##33Ff��_��d��_�6��tV����6�3#3�a�Z�bk_�K���&�	)5!5!!�x�����D6PD��P�b0�#3#30���hH�(
k�#`W���6��b��3#53#����V�H��&�3#&�2�N���<g�����f���!5!��@��@(^��#.'5�!%;:1�7499
.���!&2#'##"&546?54&#"'>326= b^@#MDI`~�[:5*L!#`NdM7+DZ!V^��L,*MRPW C4B��83-*KN0U��0�!3>32#"&'##3"32654�P?dyzc?P?X�UBAXHG?";".����. D���bgcijd�7���"".54>32.#"3267,Go?BqH)L@�ML,CA
:z_c|:I	�ag
N7���""&546323.=3#'#'26=4&#"dxyd>OXG
P1UEBYGGG
����.!
3�H"0I]^dkq_`j7��"2!3267#".54>"!.$Ec5��YP3O*)P7LuA;kF?I>"<mI5[_M>{YX~DHQHDU��###5754632.#"3L�X^^\R 5*,+��,�)h[E
;?#7�"+2373#"'5326=467##"&546"326=4&5UFu{vKOwEO6phuusCJIFQJL"()G��st"Q*QF-	Q����JkcciWan_U�3>32#4#"#3�Y4bbWxZCXX(#)*]g��W�e^���N��2#"&546#�AX�������4632#"&"&'532653N8&  *XH���G#1k��KUU
�3>?3#'#3�	�g��j�=WWk4
���5��U��3#3�XX�UV"!2#4#"#4#"#33>323>�[ZWmNCWnQ>XG
U0~&]"]h��YZV��Yd^��I*)Z.,U"2#4#"#33>W`bWxYDXG
\"]h��W�d^��I*)7��'"
#".5463232654&#"'�sGo@�sIo?�kKRQLLRRJ
��A}Y��A{Y_oo__llU�0"#2#"&'##33>"32>54&Tcyyd>QXHN1RCAX1?G"����/4�I#0J\^ck6]<\n7�""467##"&54632373#26754&#"�Q@ay{b?P
FX�SEDWHFG0"0����0#I��/[^fiq__kU�"2.#"#33>O#

)H+XH
R"Q-Q6��b,@3���")%#"&'532654.'.54632.#"�tb8Q [/C<954J(oZ1U%"J'69=33H&�NPP+$  (8,DJF#(9��S�%267#".5#5?33#*
4*G,LM#4��/>C	HA8*#r{D��1/O��#'##"&533265H
\4abYwYE��G*']f_���d^�333>73��^rr^���6126<��".'##33>733>73#�
`d�[J_`\KZ�g/)OO*����+X27.��"PX.���373#'#Թd��c��d��c���������33>73#"&'5326?^tm_�YN$
.9��(I!Q)0��LZF4+G'�	)5!5!!��x ��p��#:�DB�n�b\�.=4&#5>=463\\j?;;?nX4;mm:5�NP�3+I*2�PNH,1�gg�1+�8�3#�II�� �b`�>=475&=4&'53# 4;mm:5\j?;;?nXV+1�gg�1+HNP�3+I*2�OO2	�.#"56323267#"&
$/>0H9.$/>1G;?"N5"M6
H�J�"#"&546323#�$%%$\:l�%%$  ��[����!.#"3267#5.54>753a&EBRMOL,A:'C;W00X:D�I
ehh_
M
ad	<rY[t>	T � 2.#"3#!!5>=#53546N7X"I)9<��*��	+8``o�F;B�Bh=;PJ@BiB�Yd;��B!1467'7>327'#"''7.732>54.#"ZB1B:7C0@#?/C8@0B0AC";$%:##:%$;"a9D/@@/C9?1B/@#@/B9$:##:$%;##;,�33#3##5#535#533�\�|���V���z�]m]��@R@��@R@w�8�3#3#�IIII����;����3A467.54632.#"#"&'532654.'.7>54.'C0$(f_8N%"D0<18LMV.#'sg7R  ^/J8774K'K?P)D>,�2=7(<EC'H<3A5&ELK+*:6%3+"(%.�w��4632#"&74632#"&���1���&?".54>32'2>54.#"7"&54>32&#"3267�P�c66c�PL�e96c�P@pV0.SqDZ�P.SrScb.ZAA:2+;A9B92
6c�PP�c66c�PP�c65.UrEArV1Q�\ArV1Z{eAe9=TJLS
@
 4�$2#'#"&54?54&#"'>326=�AB/8&/8�8*2A7<*3-�6;�*12c!1
�/((8��
7'?'(�?��?�ƪ>��>��$��%�
�$��%�2��#5!5G�q����G��(�31���&4=".54>32'2>54.#"'32#'#72654&+�P�c66c�PL�e96c�P@pV0.SqDZ�P.SrE�RL0tVd>2',(,1
6c�PP�c66c�PP�c65.UrEArV1Q�\ArV1_�@A/7­��(# �����:!5!����B7�u�"&54632'2654&#"�HWVIGXXF0-/.1..�UDDVVDDU;4*,44,*42	V3##5#53535!A��H��H����G��G��GG�3U!57>54&#"'>3232��s))%1#E+@I;8Q��6p'1'  .?71N5M�AU(2#"&'532654&+532654&#"'>�GH+'/TY%@F>40:4992/)5$EU>0(4
3):I
?")#$!7' .(^��#5>73�29:#"j�9947U�#'##"&'##33265GP8'8XXxYD��H(*<)���d^7��%�####".54>3!%:f:'>\37dA?���.l[`m.��H��+��#"'532654&'73�JJ 	$&5&+:$3�057V5(%��L#467'7�G

6#�L�T*		'1\ Y�#"&5463232654&#"YVHCXTIGU�,11,,11,)QYWSRWVS:;;:;99'8��
'7'7'7'7ժ>��>�ǩ>��>��%��$�
�%��$�"��$33467'73#5#533#'35467~�K�L#

6#�IG���I==�} �62*		'1\�T��`4��<`�]81��*33467'73#57>54&#"'>323`�K�L

6#�IG#s))%1#E+@I;8Q��62*		'1\�T��6p'1'  .?71N5M>�(,7@"&'532654&+532654&#"'>323!5#533#'35467�%@F>40:4992/)5$E.GH+'/TA�K�L���I==�} 
?")#$!7' .>0(4
3):I���6`4��<`�]81�@�"+#"&546323267#"&54>7>=3;#$$#$!&,?:2L"(a<_h5$""F�%%$  �%81 -*04F^Q-?5)*��~�&&E����~�&&x����~�&&�m���~�&&�_���~�&&l���~n&&��=��5�)5##!!!!!%3#5���k]S�������:���O�N��M��=�Y�&(|��a��&*E����a��&*x����a��&*�`���a��&*l���(*�&.E���(>�&.xM���S�&.������7�&.l�����
2+#53#3#3 4&=k�Wű�JJ�n��Z"��P�s��:NBM�N�����a��&3�����=����&4E����=����&4x*���=����&4�����=����&4�����=����&4lf�@��>''7'7�2��2��4��4�>3��3��3��4�=���� )#"''7.54>327&#"4'326�K�lpI0=4,,H�p4Y%.=3^��?4Nys�3��E*zpfo�\/D(J1�Wn�\B)Gc�=d%�#���I�:���Z����&:E����Z����&:x���Z����&:�����Z����&:lM���6�&>x��a*�
+#3322654&+*4}mQZZ`�~��iaWbY~<g@��|n�COEC��U��J�6#"&'532654&'.54>54&#"#4>32
**
&%6>gS/HL(70)5?.))G8#=%X:d?awi"3' 
$K;UNO.($2");(,! &*&.+��HCO#J��.����&FEo��.����&Fx���.����&F�H��.����&F�:��.����&Fl���.���1&F��.��-",3>2!3267#"'#"&546?54&#"'>32>"34&326=[A^3��OJ2L&(M2�>"\MIax|Z=3(M!#d1>QT5:C�9��^H3*?U"<lH6`[Mq4=MRPW"A4B)-).HOJET�83-*KN0��7��"&H|���7���&JEs��7���&Jx���7���&J�L��7���&Jl�������&�E���L�&�x$����*�&��������&�l�`7��'� ,7#".546327.''7.'"32654&� As&cDW�tHo?l5OB*�&p.{TKLSSLN�$C69@�z��;mKp�9`&K7@��YSI_a\>Y��U�&S�V��7��'�&TE���7��'�&Tx���7��'�&T�^��7��'�&T�P��7��'�&Tl2y	G"&546325!"&54632!!  ����!!  � "" �GG� "" 7��'6&#"''7.546327&#"4'326'�sI8(:-!�sI:';-"�k
�$4RJ:�"4QL
��!8'>$e@��$8&?#c>&A2l_J1��o��O���&ZE���O���&Zx���O���&Z�d��O���&Zl�����&^x�U�0�&#"&'##33>324&#"3260yc?PXXN@cy[FJRDAXJE
��.  "���-
"0��ee\\ckk�����&^l���~W&&�����.����&F�\��~�&&�z���.����&F�U���$~�&&����.�$�!&F�,��=��Y�&(x���7����&Hx���=��Y�&(�����7����&H�K��=��Y�&(�!���7����&H����=��Y�&(�����7����&H�K��a��&)���7����!.#5>73"&546323.=3#'#'26=4&#"�0
W�cdxyd>OXG
P1UEBYGGG�6957������.!
3�H"0I]^dkq_`j�����7��^�*"&546323.=#53533##'#'26=4&#"dxyc?O��XLLH
P/TEBYGFF
����.!
3=BYYB��H"0I\]ehn``i��a�W&*�t���7���&J�`��a��&*�m���7���&J�Y��a��&*�����7���&J����a�$��&*�7�$")03267#"&5467#".54>32!3267"!.�-52)'LuA;kGEc5��YP3O*(,b?I>t-82,"?>{YX~D<mI5[_M 0(9QHDU��a��&*�`���7���&J�L��=����&,�����7��&L�X��=����&,�����7��&L�e��=����&,�:���7��&L����=�#��&,��7��*7#5>732373#"'5326=467##"&546"326=4&kW!1X5UFu{vKOwEO6phuusCJIFQJL�58	69�()G��st"Q*QF-	Q����JkcciWan_��a��&-��������&M������3#5353!533##!!5!aaaZnZaaZ��n��HwwwwH��M���o	�3#3>32#4#"##535���Z4abWxZCXLL�ZBW')*^g��C�d^��\BZ����b�&.��������9�&�����>W&.���������&�����E�&.���������&�����(�$*�&.�\���$��&N����(*�&.�O�U�3#3�XX��(�B	�&./S��N���&NO�����B2�&/��������*�&�����a�#k�&0�J��U�#
�&P�U
#'#33>?���i�B]]		����6��(L
���W��&1x/���L�&Qx$�a�#��&1�,��A�#��&Q��a��#5>733!�0
W�nZ8�6957�6��PUQ�#5>73#3Q0
W�XX�6957����a��&1�#����U:�&Q����
��
35'737!a1#TZ�$�8�<2���Q?d�P���3'737N3$WX@%e ;8���,;D����a��&3x���U�&Sx���a�#��&3�|��U�#"&S�5��a��&3�����U�&S�d��_�&SF��a�B��"&'532>5##33.53�%&/�mSh}Tf�L1+QFP%�}�� q7t�<d`U�""&'532654#"#33>32�"
&wYEXGY4bbF�G#1��c^��I*)]g�RKU��=���W&4�����7��'�&T�r��=����&4�����7��'�&T�k��=����&4�����7��'�&T�S=��d�"2!!!!!!#".54>"327&�2.�������1o�HG�u{ttz9*)�O�N�O\�oo�[O����!6��~!!(42!3267#"&'#".54632>"!4&"32654&�et��SM5M((N5Dh fBFm?�r?d_<<F<�BOFHONHI!�n5`ZM8778A}Y��8659HNJESfeeifdhg��a_�&7x����U��&Wx���a�#_�&7�H��>�#�"&W�~��a_�&7�f���G��&W���3����&8x����3����&Xx���3����&8�L���3����&X���3���&8|���3��"&X|��3����&8�L���3����&X���
�!�&9|����S�&Y|g��
!�&9�E�����$#5>73267#".5#5?33#�0
W�*
4*G,LM#4��/�6957�FC	HA8*#r{D��1/
!�3#535#5!#3#蕕�ߔ�EJ�PP�J����S� %267#".=#535#5?33#3#*
4*G,DDLM#4����/>C	HA|Bz*#r{DzBz1/��Z����&:�����O���&Z�V��Z���W&:�����O���&Z�x��Z����&:�����O���&Z�q��Z����&:�����O��1&Z����Z����&:�����O���&Z�YZ�$��&3267#"&5467#"&5332653�52 '.��Z]^aWY,,,*k843=	�w�1W`gQ�2?j$2E��O�$&Z�P����&<�����&\����6�&>�J������&^�.��6�&>l�����&�&?x����'��&_x���&�&?�����'��&_����&�&?�Q���'��&_�Uj�"#4632.)/XaP2*�4?��AgUE
	��0�)"&'###53533#3>32'2654#"S?P?LLX��P?dyzpHG�UBA
. D]BYYB";".����Ijd�bgci
��'03#"#.546;2#2654&+2654&+�OEH憉FB-I*�s\DS[v�_JMc�} A=Ob?S&F8aj�;:;3�J<8E����a4��U��0�#"&'##!!3>32'2654#"S?P?���P?dyzpHG�UBA
. D�Jo";".����Ijd�bgciZ��H�".5332'2654&+U]n0Z�dv4x|PG`\{K
8cA���8^9^yMGCE<|NAR��-�"&533>32'2654#"Bm�XP?dy~lHG�UBQ
���";".����Ijd�bg`j��;�"&'532654&#"'>32�;U()S.s�|{0Q!$)jAn�IN�
N����LZ�ql�]=���Z(2.#".#"3267#".54>32546|
/$!M0s�{{/T((U;m�IO�n;:6ZH03N����NZ�pl�]AE7��"�(".54>3254632.#".#"3267,Go?BqH 6=
/@�ML,CA
:z_c|:[AEI0|I	�ag
N�����
��3#"#.546;2#' 4&+�OEH�l�VŰ"��u} A=P�s��M����3�
!"&54>;5!5!'3#"?��5}k\����eRfdYh^8b<�O�6M=H?>7���$"&546323.=!5!#'#'26=4&#"dxyd>O���G
P1UEBYGGG
����.!
3�J�H"0I]^dkq_`jF�/"&22#".'732>54.'.54>">54&9Ho?_V+(UE1K2
& J,*/11XWDo>JQQCMXV":iH`v"%4'#F-
E##!'/[W*Ul4HaJIc `RM^<��35!!5!5!5!<5��#���O�N�O�6��;�����6��&�*2.#";#"3267#".54675.546:Jw(+(SA<L`aafgua[7q.-lBdz7^ZERt�+=":6<GK>DBHR5];LZUIMd��6�"&5473265!!!!yCG
O'{����Y�I=
!/<O�O�q^S����)"&54673265#5754632.#"3#�@OK!^^\R 5*,+��C�F;
&1&)h[E
;?#D��LW=���Z-2.#".#"32675#53#".54>32546�
/"&_3��7v`/B��:vKo�OX�uHA6ZH05N��U�I
�P��Y�qp�[AE�:�""&54673>73'254&'6>(�^��_�!">6"�L9,t6_��,M##O,s��Ap&8MN9I"%EU��U�#"&=4&#"#33>3232653jl58R=XXT0[\~A=Xk
]g�A@e^����(#)*]g��FOD��xcZ��R�".533267�,E(Y%(/
7
IA-��00J	"0�3#!57#535'5*TZZT��TZZT�4�N�44N�4ak�2.#"##3>?>)		
�$j�OZZDz&$�F�kVM����!N$�	U
�2.#"3>?3#'#4�$
	�g��j�=W�I ��4	
���5�q���3#5333#UFFXFFbBT��B�������,#''7.#"5>3273267#"&/.'#�jc""9Amf�%+I	z@ ?G,.!? �6A%,�;9#P'��Z����#"&533265332653#'##"'#daZ:?YLZ;@\GZGd5�+i
gs��FFd^�FFog��6R..d31�����"&'5326533.53##-

 h}Ti��C�L#/��@L ��6Q#h7�RK��U�"r��=����=��%�$#".54>32>5332654&#"�J�lp�HH�pR|)*_9?-��qzzonz{qfo�\\�on�\71L4;dU|�������7���j##".54632>5332654&#"'�sGo@�s5Y -^
::�kKRSJKSRJ
��A}Y��$!M2E]N.eiieeff=����*#".54>32>32#4&#"32654&#"�G�gj�EE�jIp'f7e`Z:?f%5��kpqihqqkfo�\\�on�\/,/,gs��FF=\��������7��"&#".54632>32#4#"32654&#"�mCj=mj?L*PPW\@#��EKKFFKLD
��A}Y��H%#]h��I,@__oo__ll
z�"3#"#.546;2+2654&+�OEH׌�5}kRHfdX_[} A=nd;g@��cBOED��U�0�#12.#"3>32#"&'##4"32>54&�$
NAcyyd>QX�RCAX1?G�I P4#0����/4�a���\^ck6]<\na��_�##3322654&+���ZZk�*A$��WPTXfd'��def9L-
��sECF;��/����)23267#"&54>7>54&#"'>Df:\\@O#RO9k$"f<u�2\?:DDC*N"&Z�,Q9S`!)0#5>Vj_8J5&0$/9M-���"(23267#"54>7>54&#"'>�bg(J44:<C/\Q8�&H34<96C"&M"JD,8(  $+P�+9(#F��&�^�����%23267#".5#"&54>";54&u=E%(/
6,E'-A:7)'�FG�H00C	IAg?13 H
%�S�""&'532=#".5#5?33#3267�
0%C+LM#4��T*
9�I4fHA8*#r{D��`�@E
5�3#"#.5463!#�f=OEH��{0 A=O����S�#2.#"3#3267#".5#57546�)
	-<��/%*
4*G,LMI�IDUD��1/C	HA8*#BJP
�!�"&5#5!#3267pCD�� 


#�KR�OO�6/#LZ��2�>53#"&5332>53�1]%H=8w`��Z_`AO$YiL;/Q7��JwE�w�0V`/S5�O���k#'##"&5332653>53�$G<H
[3bcYwYEX0]`/T8�bG*']f^���d^;M:%����!%2654&'5!##".5467#5!�xpJ] �@XL�ij�LW@� ]KqD�rd�CHO1�pb�ON�bq�1OHB�cr�Z����"&5332654&#"5>32j��Z]^aW &2�<{
�w�1W`gQB' 	L���JwE;�33>32&#"��b��0 
����-I#�����"&2.#"#"&'5326?33>?>��YN$
.;�^tL,"A�LZF4+G��(I!Q)�8)&�37!5!3#!!5#O����ٟz��������PD�G�PD'�3#!!57#537!5�oe�{#�x�p�m��B�F�D:�F�D��#����7��%�".54>7'5!!#"3267Kaz9Cm>�����N1Q/`a2o.-j
=e;Ld3�GP�A C7EPR"��".54>7'5!!#"3267 Or=BpD�����;[o`M;a! `�<hAOf6�@J�=MZGWP��("&54>32654&+57!5!#"3267�QjPISB`[;�����hn/gU@'543QQ�9>!7!:@@4=�J@�^W8Y3
P
0�23#!!5#53>54&#"'>]ld��v�(��>2/G%/'e�`U*O,F��FIF.K*55" ;#1#���"&'532654.+#5!!32�:g-/n2a`/P2|^��*KwE?
RRL2@PP�3bGCi;!���"&'532654&+5#5!#32�:^"]7<SLMZHq�T`)1e
O3:51�JJu+L11U5$����#"&'532654&'.=#5?33#�8Q [/C<.D+([\#4��ENt
P+$(>=Z*#r{D\"	D=NPU�"2#33>">54&K<^6^�kXHJ+L@��G"2cJ_�V�I#0J\^��jDS���33�N�������&���A��3#3###535#535)����N������H`H��H`H���H������a��&)'?��!���a��&)'_�����7���&I'_g����a�B��&1/��a���&1O��U���&QO��a�B��&3/���a���&3O���U��&SOj��~�&&�m���.����&F�H��S�&.��������*�&�����=����&4�����7��'�&T�^��Z����&:�����O���&Z�dZ����.!52#"&54632#"&546#"&5332653��7��<{_��Z]^aWY�GG���JwE�w�1W`gQ�O��D/!52#"&54632#"&546#'##"&533265��7��H
\4abYwYEDGG����G*']f_���d^Z���
"5>73#"&546323"&54632#"&533265389i2:;(��<{_��Z]^aWY�G"
21}��JwE�w�1W`gQ�O��g
"6>73#"&546323"&54632#'##"&533265�9i2:;(�oH
\4abYwYE�G"
21}A��G*']f_���d^Z���#*=.'53>73"&546323"&54632#"&5332653@
,0<88>1-���<{_��Z]^aWY�0/
&&
/0���JwE�w�1W`gQ�O��q*>.'53>73"&546323"&54632#'##"&533265
,0<88>1-��oH
\4abYwYE�0/
&&
/0�A��G*']f_���d^Z���
"5#.'52#"&54632#"&546#"&5332653D8;:15��<{_��Z]^aWY"G12
���JwE�w�1W`gQ�O��g
"6#.'52#"&54632#"&546#'##"&5332658;:15��H
\4abYwYEg"G12
����G*']f_���d^��3���"~�#-!52#"&54632#"&546'!#3	.'3��7��V��U[Q��
Q��GG������3*-;�.���D7B!52#"&54632#"&5462#'##"&546?54&#"'>326=���7�Cb^@#MDI`~�[:5*L!#`NdM7+DZDGG��V^��L,*MRPW C4B��83-*KN0~�!!52#"&546'!#3	.'3�ז�V��U[Q��
Q��GGw�����3*-;�.���E+6!52#"&5462#'##"&546?54&#"'>326=��הb^@#MDI`~�[:5*L!#`NdM7+DZEGGw�V^��L,*MRPW C4B��83-*KN0����5W&��0���.��-�&���=����(".54>32.#"32675#535#533#�y�KX�u<k."&b3��7v`/B����@@4n
Z�op�\N��Y�F
IGNP�G�7�I"$123733##"'53267#535467##"&546"326=4&5UF7?rhvKOw8C��6phuusCJIFQJL"()G��G=L"Q*!GA&Q�}y�Jc\]bP[f]��=����&,�����7��&L�X��ak�&0�������
�&P����=�$��&4���7�$'"&T����=�$�W&4'���� ��7�$'�&T&�r����#���&��B������&������*�&�����a��&)?���a��&)_���7���&I_g��=����&,x8���7��&Lx�a��P�33!332653#"&=!aZ(Z/.0,ZZ_X\����.��-26*s��Jd`O���a�^�2#33>">54&�?b8*_�xZG_<FQ#��L�4lSC��s1��a->N9gE��G�~SS��a��&3E����U�&SE���
(1>73#&54632#'!#2654&#"3'.'0j
.6;
1=0/A]R��N\> Z�TFD..�?2872.
��������8;.����
">I#5>732#"&546"32654&2#'##"&546?54&#"'>326=�
8@?0��/@?01<<1  b^@#MDI`~�[:5*L!#`NdM7+DZ�%$5�713882271�V^��L,*MRPW C4B��83-*KN0����5�&�x����.��-�&�xZ��=����&�x+���7��'�&�x���~�&&�d���.����&F�?��~�&&�>���.����&F���Q��&*�W���7���&J�C��a��&*�1���7���&J�����1�&.��������&�����E�&.��������&�����=����&4�����7��'�&T�U��=����&4�����7��'�&T�/��W_�&7�]�����&W���a_�&7�7���T��&W����Z����&:�����O���&Z�[��Z����&:�n���O���&Z�5��3�#��&8���3�#�"&X����
�#!�&9����#S�&Y��&�L	�)>54&''>54&#"'>32'q�W&=5#L(_v7F>;`-+9yB9fA?4";%cժ^<BL-<F

F.=-3:=("#NC:S2I5]�`*��"&>54&''>54&#"'>32��-(C%X_$92,M%.^17X5/+,?h�~�"mU3;	B/6".1@!I</IMDWvL��a��&-��������&M����a���2#4&#"#33>�t�ZNZn_ZGFR�}��C�]]xh�Y�\.7��U�*7C67.'##"&546323.=3>#"&'%26=4&#"%2654&#"�	SPdyyd>OX$a2=AZh'��UEBYGGG�8.'8 dS:
43����.!
3��5>.;-4J9�]^dkq_`j,':��e�+".5467.=3326=3'2654&#"MN|IOF:7ZINOIZ8;DSF}S_XY_^WX
9lMRccEXXDXXDXXFbcQMl9NWMMTTMMW2��"�*".5467.=3326=3'2654&#"(Go@D>00X=AA=X10<G�qQLLRRJK
:pOTgVP�~OFFO~�QVgSw�I^RQ\\QR^&�:�"&'532=!5!5!!�
0�`x�����9�I4FD6PD�ʑ@E��'�:�.��~�&&�����.����&F����a���&*|���7�"&J|�=����+7!52#"&54632#"&546#".54>3232654&#"��7��K�lo�HH�pk�K��ryzppyys�GG���o�\\�on�\[�o�������7��'D)5!52#"&54632#"&546#".5463232654&#"��7���sGo@�sIo?�kKRQLLRRJDGG��Q��A}Y��A{Y_oo__ll=����)55!>3232673#".#"#".54>3232654&#"�)��1+2.20,2.�K�lo�HH�pk�K��ryzppyys�GG�5=4>�Wo�\\�on�\[�o�������7��'D'35!>3232673#".#"#".5463232654&#"�)��1+2.20,2.m�sGo@�sIo?�kKRQLLRRJ�GG�5=4>����A}Y��A{Y_oo__ll��=����&4�,���7��'�&T��=����+!52#"&546#".54>3232654&#"�ז^K�lo�HH�pk�K��ryzppyys�GGw��o�\\�on�\[�o�������7��'E)!52#"&546#".5463232654&#"�ה�sGo@�sIo?�kKRQLLRRJEGGw�?��A}Y��A{Y_oo__ll��6W&>�^������&^�B��s�3673632#"&'72654&#"$*X $AADA/A	�a6a��A34H$,X$,U���"#.!6754#"#33>32632#"&'72654&#"t$*xYDXG
\3`b $AADA.@	�a6��d^��I*)]h�F27A#+X$,��z�&367#5?33#632#"&'72654&#"$*LM#4�� $AADA.A	�a6=*#r{D�F27A#+X$,���"&'532653&  *XH�G#1k��KU7����!-8"&546323.=33>32#"''2654&#"!2654#"$p}yd>OXP?dyp�8d>IKBYGGI�LG�UBI
����.!
:"��";".����}@=Iq_dfq_`jjd�bgek7��"!,82#"&'##5467##"&54632>"32654&!"32654&�q|yd>OXQ?dyp�8d��LG�VAH3IKBYGGH"����.!
9#��"<".����}A<Ijd�bgekq_dfq_`j��~�!'####37337.''!V�gCgEU[Q*CJ�PCM
�0,��(��Ny��-�'';؁�=��Y� ).'3267#"'#7.54>327"&/!$�$+/T((U;2,C!WWO�n%%Ys�66��7	L��
N
K_(�{l�])s��X�"7�0�� &"'#7.54>3273.'3267#",2)KCU-4BqHMCP

�$,CA�&|�

�� sVc|:��
I��
N`3^
��
3#5333#!aWWZ��8LG7��G�P
��!�!#5##5!733#7CZeF���F.S�E��pVO..O��+��3��";"&'&'.'532654.'.54632.#"3267hRO: [/C<954J(oZ1U%"J'69=33H&k_
3)*
/�LQF	P+$  (8,DJF#(9+KP%,(H	'��".'.+5!5!3267�<L-19# ��p��;>81
!�#F4,':�DB�n
LA,(H��2#>54&#"'>�gv^hZYh>D"X!#f�fYK�1��BnF4?H�"2#5>54#"'>�gj$RFXYa{"N!#\"fY-^U!b�nFyBT�*35#5332#2654&+2654&+3#aRR̆�FB-I*�s\DS[v�_JMc����N�Ob?S&F8aj�;:;3�J<8EVN_
����533!33##"&=326=!
PZsYQQ<{_��Z]^aW��bN����NfJwE�wdgW`gQf��`�Wa����!##7#!733#3#337#3#��AhA1E8kA��w8�"AcKK�..O�N�M���7�0�&+/273#3267#"'#7.54>"37&4&'7$KCR7=�< *3O*)P74,ICS18;kF?Ip5w,�)/"��qN5�
M��!uRX~DHQH��*C�FW0����B�"&'532>5#5333#$$-RRZQQf�L2-6NB��N��gb����#4632#"&"&'53265#53533#N8&  *KKXKKH���G#1KG��G��KU=�	�#223733267#"&=467##".54>"32>=4.kIrG 


CKpP_�EE�`bllcX]$$^�7/\��/#LKRg$.8\�oo�[N����6_?�?`57�u""/23733267#".=467##"&546"326754&?P
F	$6 Q@ay{nHFGISED"0#I��;%C	IA>0"0����Iq__k[^fi
_�2####53#32654&&�*A$�i��ZWW�fkWPT�ef9L-
��'��'LWN��ECF;
�"##5#53533>32.#"+~XKKH
R8#

8X
?G��G�b,@QPC6�##'#53'33737#,f~Ze;EbC�DaF�M�JN���N����ߑ��&33733##"&'5326?#533>?#^C�?_C9T�YN$
.9t[>�����G��LZF4+G"G��Q)89(IQ��"&"&533>323267>54&#"a_@#NCI`~�[;4*L!#_OeL6,C[	V^mL,*MRPW C4B83-*KN07��Y"*"&546323733267#"&'#'26=4&#"dxyd>OF &2P1UEBYGGG
����.!E�^@	$."0I]^dkq_`j��0"*2#"&'##4&#"5>323>"32654&Tdxyd>OF &2P1UEBYGGG"����.!E�@#/#/I]^dkq_`jU��0� +2.#"3>32#"&'##4"32654�%
P?dyzc?P?�UBAXHG�I 8";".����. Dq���bgfjjd�!���"2#"&'532654&#"'>�Gj<CqG+AB*POKPCU"7v_c�=N
ldd`I0���"$/2.#">32#"&''>7&54>"32654&9)L@�
&X/HQ5Q*0Q 
C&ArY!C (J)5""I	�4%%(D62?+ :@hc|:��!'.$ 7���%2".=467##"&546323.=3326726=4&#"8"9#O>dyyd>OX
'��UEBYGGG�IA?3
!.����.!
3��;%C	/]^dkq_`j7��u� -"&546323.=432.#"#'#'26=4&#"dxyd>Oy%
G
P1UEBYGGG
����.!
3O�I ��H"0I]^dkq_`j3���"2#"&'53267!54>"!.Gk;AtM7P)*O3PY��5dEC>I"D~XY{>M_[5Im<HUDHQ3���"2#".=!.#"5>3267�MtA;kGDd5oYP3O*)P5>C?I">zZX~D<mI5[_M��DUQH3��"#,"&5%.#"5>3273267#"&''2>5hui
TD3O*)P7^�j
*< (A"ry/:
��?
�ubADM^Z<,"B8F��H&=I"J;I+���"(#"3267#"&54>75.54632.#"3cI�R<8U!V>sn!6 -7s[:S(!!E/ySF;H\1(MYC(3	;1DJFL,&��!���"�!���"8273267#"&'#"&'532654+532654&#"'6�Lfg
*< (A%4' 6!ov:^"]7<S�H:ES?;,C(T"20<,"B8F	$,	 4)C[O)2ZH%-&&F%7��+")2#"&546"32654&+532654&Mdh6/7#2hP����_Z]\>KLM*ES6"QA45
4),K,���Jhehd/0,%H!0".���"&'53265#53533#&  *KKXKKH�G#1KG��G��KU6�u�-:2.#"#"'5326=4>5##"&546323.=4"326=4&4$
u{vKOwEO6phuug5U�CJIFQJL�I ��st"Q*QFQ����()4H���kcciWan_��7�"L7���"2.#"32675#53#".54>Cn= G �ML$3s�1^;Go?Hy"$L�ag�G��:z_c|:��%"&546733>?3'2654&'�4?&�^f"	f^�"?4�G52\3�� U 66�7;\*4HIBA�����"0<2.#"#"&5467'.'&5>323>?>32654&�
	y$ ?44?""	
	*=	

=,�"E�1B+3==4+D.�C&T)+V "��+-Q� 47##"&5332653#�Z4acWxZCXX(#)*]g]���e^�U� 432.#"3>32#4#"#Uz$
Y4bbWxZCXq�I ^(#)*]g��W�e^��U��+2.#"3>32#"&'532654#"#4�$
Y4bby#xZCX�I ^(#)*]g�?�	I��e^��q�
��2#"&546##5#5353��KXKKX��^G��G���R��6t$#57'5PP�PP4�s44�4u�.#"#>32332673#"'#�	39/
X	28/Xr;E<��:F����T�3#"&54>3233#354&#"�*=7/'
Xhh{#);.0		�yH��qU�=�".533267�,E'W%(&
(�IAA��00C	U�o�"&'532654&+57!#3!f;^ !b:M`o[;��XX��q�Aw�PYMTK=�2��@�omGm=Q��R!"&533265332653#'##"'#[ZWmNCWnQ>XG
U0~&\
^g]��[U(��d^��I*)Z.,Q�R$467##"'##"&533265332653#�U0~&\5[ZWmNCWnQ>XX3
*)Z.,^g]��[U(��d^��U�V",2#"&'532654#"#4#"#33>323>�[Zy#mNCWnQ>XG
U0~&]"]h�?�	I�ZV��Yd^��I*)Z.,��" 2#4#"#"&'5326533>W`bWxYD$<$%
G
\"]h��W�d^��AI	C%;`I*)U��" 3267#".54#"#33>32
'#<$xYDXG
\3`bH;%C	IA��d^��I*)]hU#33.53#UlSm���P006���
34���7��'" 7��,"$25!!3#!!5#".546"32654&0^>`��
��P1Go@�qEWKRQLL"A7I�I�I6!A}Y��Jl__oo__l8���"'2#"'##"&54>"326=332654&�k�Mb]l" m]bK�py�<12.T2-2<|"N�bj�ZZ�ja�OI�rRTJ8��>DTRr�6���!#5.5467533>54&'�PwB�|VOxB�SS\TU[SZTUY FvQy���EwQz�
��	g[[h	
hZZf
��H"&'732>53#'#N"
 
*G+XH
S
Q-Q6��b,@��H�"&'732>53#'#N"
 
*G+XH
S
Q-Q6��b,@��#".=467##"&'732>533267m!9#S8"
 
*G+X
(�IA\3
,@Q-Q6��;%C	U��"2.#"#33>O#

)H+XH
R"Q-Q6��b,@U��" 2.#"3267#".533>O#

)H+$(
!,E'H
R"Q-Q6��00C	IAab,@RH"2.#"#4>�0
&##W(H"
K,0��{BH�"2#4&#"'>h0H(W##&
0"HB��j0,K
U332#'#2654&+U�Vh$9 �f��~>E4>�QM/?#���-.&0�U3373+7#32654&UX��f� 9$hV��~�>4E���$>0LR��1%/,3�9�"7%#"'3267#".=32654.'.54632.#"�tb-#$(
!,E' [/C<954J(oZ1U%"J'69=33H&�NP00C	IA�+$  (8,DJF#(9���2.#"#"&'532654>�&
$<$%
$=�	C%;�bAI	C%;�BH���%"&'53265#534>32.#"3#)%
KK$=#&
KK$<�	C%;@GBH	C%;��G��AI��"".54&#"5>323267�#=$
#!8!
&�IA�1(C	D=�3;%C	����("&546;4>32.#"3#'26=#"!@ODM2$=#&
KK'>- ,(�B47CVBH	C%;��HBIH%,��Y""5>323#5#534&a+
4*H+LM#4��/�C	HA��*#r{D61/�S�267#".5#5?33#*
4*G,LM#4��/�C	HA*#r{D��1/
��`75353!533##'##"&=3265!
EYXKKH
\4abYwYE��G����G�G*']fD>�c[��? ".5467#5332654.'53#-Go@63��0HKRQL"7 �j�
=qNJl'IEuVOddP3\D
EIU�v�Q��"2#"&53326=4&#"5>�/C%otvmXCHHC&%"GB�yyu}0��aKM_�7%	K�#.'##1�^rr^���<6235����"%3>73#.'##.'##3c

`d�[J_`\
KZ�g�)NN*-��,X37��.#PX.���!#.'##>32.#"�^tm_�XN$
 .81)H!Q)��bLZF3,G�#537�X�d������;��'�!".=!5!5!!3267�#:"�� ��p��#
'�IAI:�DB�n�;%C	'��">7#5!5!3>32+72654&#"�� ��p��S)Y=5AJ[a�- 2;
:�DB�nQN>*7D%2�,/�������'2".54632>54&+57!5!&''27.#"�.Y:XN;o5o[;����DpB
&9$!&nDa9.X-/&>�?26D%$
TK=�J@�5aI5(6)"&I4# $��2#>54#"'>�gj$RFXYa{"N!#\�fY-^U!��knFyB��2.#"#.546�5[#!M#{bXXES$j�ByFn��=!U^-Yf����"&'73254&'3�4\#!N"{aYXFR$j
ByGmp�� V^-Yf7��""&54>32.#"3267,|y'E[4)L@2G%#E1,CA��r�['I	?�tu�<
N��=����&4+U!332#254&+2654&+U�9[5</2Jet�7>��BFFD�;328
9<DY<J&#��'/.(�-��!"%2#"&54>75.546";#"32654����xr!6 .7tc�SE*�S>\U"���[C)4 	
91DIJK-%HZ2(fh�7��Q�+2.#".#"32675#53#".54>32546
/ G �ML$3s�1^;Go?HyK5*6�I0�L�ag�G��:z_c|:	^AEU(33!53#5!UX#XX������������'"&54632"&546;33#'26=#"�n<K@I+XKK%;*&#q��B47C��HBIH$+	� �%467##73753#j	�g��j�=WW�4
��3�5�U�333UX��1I7���%2467##"&546323.=4>32.#"#26=4&#"�O>dyyd>O#9"'
X�UEBYGGG
3
!.����.!
34BH	C%;��/]^dkq_`j��23##5#535>54#"'>�gj#NAllX[[Q_{"N!#\�fY-^U!PI��I~nFyB��2.#"3##5#535.546�5[#!M#{_Q[[Xll@O#j�ByFn~I��IP!U^-Yf7����'*"&546323.=3!!!'#'26=4&#"!dxyd>OX���#�2
P1UEBYGGG9��
����.!
3��B�nDH"0I]^dkq_`j�7���2?"&'532654&+57!#'##"&546323.=3!26=4&#"�;^ !b:M`o[;��G
P?dxyd>OX��DpBAw�&UEBYGGG�PYMTK=�2H"0����.!
3��@�5aIGm=/]^dkq_`j7����)69C>7#'##"&546323.=3!3>32+%26=4&#"!2654&#"��
P?dxyd>OX���S)Y=5AJ[a�MUEBYGGG9��L- 2;
H"0����.!
3��B�nQN>*7D%2�]^dkq_`j��p,/��$83".5#5?3!>32.#"#72654.'.5467#3�*G,LM#4*1U%"J'69<43H&tbC<954J(	�/%HA.*#r{F#(9+NFH $  (8, ��1/��-6#"&'5326=#".5#5?3354>32.#"267#�$<$%
1*G,LM#4�$=#&
�)
�/IAI	C%;LHA8*#r{>BH	C%;�����1/��4�6A".5#5?33#3267&54>32.#">32#"&'%2654&#"�*G,LM#4��-1M$BqH)L@�$U7HQ5Q*=d!*aL)5"*(F!(
HA8*#r{D��1/)6Pc|:I	�%%D62?')1I$ "<�
�5"&'532654#"####5754632.#"33>32}"
&wYDX�X^^\R 5*,+�X4bbF�G#1��c^���,�)h[E
;?#I*)]g�RKUU��i�,"&'#332654.'.54632.#"s:a+XXdgVF954J(oZ1U%"J'69=33H&�
 ��z5+$  (8,DJF#(9+NPU4�33!!%!UX���#�y����B�nD;���#'#3737#'#3737�cKQSIbFBTFPFEcKQSIbFBTFPF����P����������P����U��!#5##!#5##U�X�X�X�X�闗�闗��""232653#547##"&=4&#"5>0#;#xZCXXZ4ac
&";2ځe^���(#)*]g�#E���"/2326533267#".=47##"&=4&#"5>0#;#xZCX	$6 Z4ac
&";2ځe^��;%C	IAH(#)*]g�#E7]�3>32#54#"#3p:"?@8N;,99a8>��M=8��7]�432.#"3>32#54#"#7P:"?@8N;,9�T,"98>��M=8����v�4632#"&"&'5326533

%	

9/���+t��-37g2&#"#33>�
	)=9/5g1<0�B;'
�a"&'7326=3#'#3
	(=9/60;1���;&
�a7"&=467##"&'7326=33267� 16$
	(=9�);7	&0;1���$(
7aa
3373+7#32654&79UZBc3D8��R](#-a���*+.1�j �a!.'##33>?33>?3#
	>A`;0

>><0;aC�/

0�A�54��05����La33>?3#"&'5326?=K
	G>�:2%a�+0���.6*+���������[��������������������?�2#52654#1<<1 8821827?�"&5463"3�1<<1 8?822727�
�654&#"'>32#Py%&5<%EH:BA$H'4D2+E4��#5.54632.#"�AB:HE&<5&%$T4E+2D4'H'57�콽hu'YO7'5����COY'uh"	
73#'mm'TT"�뼼
"
#'37mm'TT
�뼼(^z�#.'#5>7�-1>86</,
�75/.47(^z�.'53>73�
,0<88>1-^54
00
45(�x�#xP���(^Q�!5Q���GG��(^��x��(^��E(�4x<7#xP<����(�mQ������(�4��E����(�4��x��H�'37�Y��YY���苋H��'3�Y�����(����
����(����
��������������������������K#53��<(^_�
#"&'33267_QHJK62.'9�<JI=)'(q��2#"&546\�(^1"&54632'2654&#"�1<<1/@?0  ^822771382(�$�3267#"&54>7p-52+0""t-82,6, 5(^��>3232673#".#"(9/5028/51^;E:F(^��#5>73#5>73�
.62 
`�
.622`�:947
:9U"�����7"&''73267�(Ab�
*<�8FD.<,"B��(;���Ja$7"&546733>?3'2654&'�!)�=B		B=�)"

�+ 8�34���#7 +,('
7p�#3p99�!g$#"&'532654&'.54632.#"K@%4<,'#339H;81H'227x/0

0	'')-
*	''La'373#'#�xAYYAyA_`@Þzz����
�2.#"#5.546�";2P@99D6E�'
H+BھU(6=NT�!#5!�nB�PNT�!#5353��B�B��PNT�!#533��BFB(�PNT�!5#533��B�B�PNT�)533T���BBnN�T33!NB����BN�T33##NB��B�B���(�9z�������(W��*5���[��(�v��'373��OXYN��ކ��(�v��73#'(�1�OXY��܄�(�#'57#�����k1kE>?(�#57'5(����E>?Ek18����"&54632'2654&#"�1<<1/A@0 ��822881382��(��E��(��53#.753#.(` 27-�`126.�
749:
"U9:��(�������(�C��������H����(���3##(Ι5�5�(���#5#5�5���5(��3533(5��5(��3#5353�Ι55�(�0��!53!53�B8M9Хcc(�0��!53!�B8�Хc(��K	'57!!#���O����1�;D<E���^���E������^���x�����Y^����1���^���������l^����D�0�J!!���_JG���e^����=����q4������sw��l����N�@5#'>54&#"5632�.#6$+%
%<B�&)5U4,����^p1��l����^����Z���W^����/��T(�#5(P�����Tx�#53#5(P�P�������^�a�
#.'5##.'5�126.O126.�"U9:
"U9:
�d^�L2#"&546#"&'33267�QHJK62.'9Lh<JI=)'�d^��
2#.#"#>JK63.'97Q�H>)'<J�����H��������K��������I��������M��������4e��E�t�������4e��x�t�����&X��353#5#XnBBn]A�A���&X��##533XnBBn�A�A�����!#5#NB�����+l�>53g3<]]hiDCPf��8��"&5463"381<<1 8�822727���0i��3#535!H�H0d<<d���0i��5#53#!H�H�d<<d���i��53533##5iHBHHB�<FF<FF�����br����p�S�O�*"&'532=3u
0O9�I4��@E��*"&=33267u<9O0
�E@��4I���P�	��"&54632������s�Q���l��������p����l�����#@��#5>73@!0WF7859�����d|������$S������4(������N�&���!#5##�dB�B0�nn�C�O���#"'#"&53326533265�>0661<6708=::##::B "B "���X�9�����0�����W�8�����/�����d�G�����<�����d�F���������H�H����� �����l�m�����D�� �f�!5!�@��@���1�"����3���N��P��&�q���0�I������h@%5!���GG�o���'7��%��=��:����#��L@���0��8��2#52654#51<<1 8821827�N�&���!53353���B�Bڪnn�C����!5!!5!���z��
���ȓ^�C�O���4632632#4#"#4#"�>0661<6708�;9##::B "B "��;f77''7f*<;+<<+;<*;�+<<+;<*;;*<��@@b463"#52654.?E:D;#/2$-#03
%,���0�����2����`^)�E�8����^��x����H^���� ����[BO����i^�C������i��<��&P��!#5!#��B��B��nn���0�"����2�����4x��������]��3#5#]�Bx<�x�H9�"&''7.#"#>32732673J$%-$	39/!"-!
28_	=;;E98:F�HA��!-2#"&546#".#"#>3232672#"&546�8/5139/50��m:F;E��X]�\+".#"#>3232673".#"#>3232673G2.31+2.20,2.31+2.20�5=4>�5=4>�Q�%���	7355#�}d}}d\>>\\>>���]��5#7# ;\\;�x__x��e�	'/7?GKOW_gow������53#7535#53"5432"54323"5432"5432!"5432"5432!"543253!53%"5432!"5432"5432!"5432"5432!"5432"54323"5432"54325353!533353���f��g���q�����y��6_5����>y�|���q�g5�66fz�.�6ff66ff6�
.F�����3VF.p6g��g666��NP#5>7.'5I5885.,
D3

2����S?&���d^�H
>32#.#""&54632�QHJK63.'9e�<JH>)'d���!_��77''7_*31/12*31/1K*21/13*21/1���P��.'5>73E6886.,�
D
3

2���P��#5>7.'5I5885.,(
D3

2�H���%#5>7.'5>73#.'#�5995.,�
D3


3(
D3

2�@BB@B@����S?&�����q���[���j��37''7'7#F
>F3883F>&F"B
0*@@*0
B"�@����+2632#"'#"&54632654&#"4&#"326S891<<1871<<�  5  ''7228((8227i��T_#7#73_"3{"3�xCxC�����
"&'332673��*F#�k�)F3��_]6>7=dX���K� 1��q,�!5!,��Xq3�����,��"��_��#".#"#>323267�]G9gdg9<93]H8fdh9<9�C=!D<!�~��O
2#.#"#>��*F#��j�)F3�O_]6>7=dX���%���!55!���}}�za>\\>��hdF$2#'##"&54?54&#"'>326=V#!+s)"+#-")FH�!A

r ��hrF2#3267#"&546"34&/5�K#$4@:0!zF5+J864<!"��l!�2#"&546#5	

	
(�Q����hzF#"&5463232654&#"z=4/?<41>�"$%""%%!�6::65995&--&&++��hoB#'##"&=3326=o!)+,(5(B�%)��3(&o��hgF"&54632.#"3267%0>@1"GEh59;5RP��ho�""&546323.=3#'#'26=4&#"-66-$( $&(   h8778
V��&%(+-&&+��lq�3>32#54#"#33(,-'6)((C%)��4)%o0�^l�F!2#54#"#54#"#533>323>g)('1#'2$( '9
)F%)��3$#v�3(&o�$��l`F2&#"#533>D

*(!%F '!r�'��hRt27#"&=#5?33#0+"#FF�'}.2|��l}B
'33>?3
[*4
3+\l�~
"

"
~���lyB'373#'#S->>,SX-BB-�hPPhnVVa��333#aZ����N��U`333#UX���J�<T�!##!#5#�II�|�.���U9�!##5!#5#zL�Lz����O'@��573'0j_@�
���`�573_;0�
����b�����U-�R���"&=33267�(-N�)"S@:��!���"��7���"&H��p��!���"&�W�o����& �����B��/(^�573(0j_^�
��^�573'"&546323"&54632&jU}�^�
���
��&&EB����H��&���
��'*�B���
'�'-�B���
��'.�B���
��B�&4rB����
�'>�B���
0�&d|B��������Y&tC�g��~�&��aT�'a��3!!a{���O��
t�353%!.'

Q����2��e2Q�*-;��a��*��&�?��a��-=����#".54>3232654&#"5!�K�lo�HH�pk�K��ryzppyysT.fo�\\�on�\[�o��������NN��(*�.��ak�0`�
13#.'Q]�
��3*-;����a*�2��a��3<4�5!5!5!P�X��D�yQQ��QQ��QQ��=����4ay�3!#!aY���6{����a*�5&�355!!*'26;&����?��&G(�J'KP���Q��
!�9��6�>3�"+!5.54>753'>54.'ycG J~^Y_~I I`YZg*/g�Wg-*f[Z4Sa.5bM/DD.Lc60bQ3Z��5X8;\57\99X4��F�=Z��!5.=3332>=3n��\.S7X7S.\�������Vb(�>(bV�ᔓ���'353.54>323!5>54.#"�%F-L�ij�L,E&���>J 2gQPg1 I>OUvJb�YX�bKvUOH,\kBLxEExLBk[-H��7�&.l�����6�&>l�����7��Y&lB���-���&pB���U�&rB���R��6&tBI��O��&�C�7��Y")"&546323733267#"&'#'26=4&#"`zwg8T
F %1S*SECVIG
����.%I�^@	$.$.I_gdjke�U�.�/4>32#"&'2654.+532654&#"U=h@fnS;Lb=iB6C �FR)C&SI9AI3#@(#@�Vg/c\HT
b[D`1��.MF5E#DK=><HD�Z�.�533>53��[aU@W$YP����B?^ߑg��W�-���&2".5467.54>32.#"'2654&'#Gp?_V,(VD2J3&K,*/11YVDo>JQPDLYV
:jG`v"$5&$E-E##"'/[W*Ul4HaJJb _SM^-���")"&54675.54632.#";#"3267tkC.+4h^8[ I+<3I0EEBEE?4MR
YC<:
;0DKI)#.%D1.++N
7�6��'>54.'.54>?"+5!D%&Vb)1X8m/C"xt�:G GHN?� B7M39p{I�C5�NjQ("2&34,E U�"4#"#33>32�sUCXG
W3\a�G�d^��I*)]h��7���
"&54>32!.#"267!(|u0kV}w1k�2HMLG�NJ��G
εz�\˹y�]���������R��6"&533267�OHX* 
&
UK��{1#G��U
����'"&/.'##'.#"5>323267�%
O
\^�;0!M^ �

%�B@$^(��C,,FMV�AU�\$3326533267#"&'##"&'#UXzRDX %1J8':���d^�^@	$.(*<)��333>53��[aU@W$WN��B?^ߑi��S7�6��6>54.'.54675&54>7+5!#";#"D
#(Ie4W?t)C(D"tEuGJYloFS$$PA57� ?2Q>Qcp/=&C>@:3AC+F+/6 ",,C#��7��'"T��w"5###5!#3267&o�Wmgi#
�^�,�DD��#E	F�!"4632#"&'#2654&#"Feu�>mF(L�HOQM�K�����U{AH-�/gakfƢ7�6�"">54&'.54632.#"D#8Ac8�r(J8!WHEC+C'�F"<nX��I
iT8U9
/+%L7��F"&54>;#'2>54'#"(m�F�W�z&*7lO6D M#bbH
��e{8D%gHHyII4W4�VcqUl���".5#5!#3267L.N0���5+/7HC9DD��:.B
O��".5332654&'3CQ)X53HOX�
#AY6/��9M(rxFn<;oJ��7��� 5.546753>54'@OxB�VPwB�|V\QR�ZT���EwQz�
��FvQy��.�	h\\i	
i[��J$'.#"5>3233267#"./�w'!o�^�d!%
	'2%W��u�'.E+'�G�k�-/D2(���O���5.533>54&'3JLq>W+K.VU]WEwL��3tc��KR ��IejEuFCxBg};�A���+".54673326=332654&'3#"&'#>U,4%Z%6<12.T2-2<1*Z(1,U>7FE
DzP_�++�bacJ8��>Dca_�1.�]PzD3;;3������6�&tl�e��O���&�l���7��'&TB���O��&�B���A���&�BSa�k�".'53267#3>73	:0V@)c=Vq�IZZ+�i��&��MG[U@����/	��mywU��J�*7"&54>32#"&'>322654&#"2654&#"M�pG}PW\6S,,P [>>h?Fs+2/*2(FH	PURE<W&F
���_F;.<#]6#+3_BVo5I"%('��[KMO*#`k*��`�3=".54654&#"'>3232654&'.546323#.#"GQ 12'/7Y\|�CS[nzF@;yS
X?++0n
3Q-)M>
4'"Q-*B��
8^:?V��Ii�^�go,&%;#E�33>32&#"��b��)(����&&F �����
�'��B���E�&�l�����7������D/".5467#5!##"&'#'26=332654&'!>U,r.r,U>7FE22.T2-2<�g<
DzP>e(II(e>PzD3;;3IJ8��>Dca?e((e?acU�@
"&'53267'#33>?3=c#T3DV�B]]		�j��(�	=4F�6��(L
���=��!5.54>32'2654&#"P]z<F�mh�I?{Z,ulltunn�Q�PV�ML�WQ�P��{bbzzbb{7�'"5.546322654&#"<\4�sIo?m_,QLLRRJK��	GwP��AzVx��.t__hh__t=Y�!5.54>32.#";W��K�m?e,$%O7ww{{��{V�ILs`aq�7�3�"'"&'532654&'.54632.#"!? 33-&5A]2�r(J8!WH?CGKZ�D	# "8iX��I
iT8Q6@>AIa��3!!!#5#a���V��O�π��a��#!!!#5#�X���V��O�ߑ������+"&546?!7>54&#"'>32!3267�8G
%��:		#>A
6C


<92 �&H>72 `�&I0���,"&54675>54#"'>32%3267�KB
e��d+'<=G^t
 #
�E89%L7#?+E
;.I1�I:��")E��
�!>54''7&''7&#"'>32q �'��(�4H4W*'bF��L�H$!pC�C+�D�$F ��E�J�����>54&''7.''7.'7"&+��
��<�m{ƋJ*%�N�d6NCO$CJECL`Rq��~a�H���"+3>54&#"'>3233267#"&5467`"5#
%NU
X"1(
KR
��%ew?TEEowC ^%ew?XAEpvD��F�!"%1>54&'.=4632#"&'#2654&#"�Ok@eu�>mF(L*SE>0�HOQM�K�2WEى���Nt@/9 $.%CcVgeƎ��7���"H������O��=������7���"�����"���a*����U�0����=��Y�(a*�3333#467###az��yY�J����6�6k"��!l7�RU��33#467#'Uh��cT�H������R3��4���!"&5#534632#"&'#3#2654&#"FBBeu�>mF(L�ˑHOQM�K�TFi����U{AA)FT/gakfƢ����;�J��=��Y�&(+����;�&Jk+��a��&*E����a��&*l�
����"'532>=4&+##5!#32�1+-:F�Y��ٿemf
N
0.@:8��{OO�]XFda��a��&�x��=��f�"!!3267#".54>32.�j�
\��}y1X*Nqt�FP�qAc)%#T�vtN�N\�on�\M��3����8��(*�.��7�&.l��������B��/����#,"&'532>7>7!32+#%2654&+B""T;iz3~���

&?�]X`d0K/I'(��o��6\9^s{J��4C^0XACE8��a��33!332+!%2654&+aZ2[:iz3~�����\X`c0��.��6\9^sM��MACE8��
��#32#54&+##5���dkZ7D�Z��P�\Y��:7��zP��aj�&�x����b��&�E����p�
(#"&'33267#"&'5326733>73�W_bQR/4.5 AXD1.8A��c��_�KMLL6%'4�#G_/Y	0=�w

�a�Dy�!##5#3!3y�\�ZeY����z��~�&a4�
3!!32#'2654&+a���jkv.v�	`NVg_�O�5[;boMACE8����aT�'a��!#��Z�P����D��3#5!#3>7!B[V�V7$A2 O/9 M����>���OQ:���6)��a��*T�	333	### ��dVd��g��V��go[��Z��Z����j��j��&���)#"&'532654&+532654&#"'>32\MZ^��:i-/o1`cthfajiP@CY*+*{Mtx#IUXG^vRHBD>KG<6:"=+db��333#4>7##bT�dT�vd�x!RDO�6�%TF��b��
!#"&'33267333#4>7##HW_bQR/4.5�mT�dT�vd�KMLL6%'4�x!RDO�6�%TF��aj�
!##33jl��ZZ;f��j����Z����c�!###"&'532>7>7!cZ�	
&?3#
#�{J��4C^0K1I$&��o��a*�2��a��-��=����4ay�3!#!aY���6{����a*�5��=��Y�(��
!�9��p�%#"&'5326733>73� AXD1.8A��c��_�G_/Y	0=�w

�3����'#5.54>753>54.'�t�8FvYY[wD9�sP_(gpYtc(^Q�XHwI0_M0nn1O^.GwJX�0S8XikV9S/��F�=a�D��%#5!3!3�V��ZeYO�����z��PY�!##"&5332673YZ:e>dnZ=D;^;Z%]X��:9Za��)3!3!3���ZZ[��z��za�D��%#5!3!3!3�V��Z[ZO�����z��z����
3#5!32#'2654&+���qdt1z�	WRZ]f{O��6\9^sMACE8��a��3332#!3%2654&+aZnds1y�kZ�3VRY\d��6\9^s�6LBCE7��aO�3332#'254&+aZ�dv4��	�`\{��6\9^sM�E8����;�"'>32#"&'53267!5!.�2R!%)j8s�JL�t>V**V0����Z
��K\�fu�\N��Onza����"#".'##33>3232654&#"�G�hf�J�ZZ�J�bg�I��ksukjttlfo�\T�i����_�M[�o��������#.546;#";8�i�&C*���ZlU[X\h(��8
.P?ag�6(U;DBH	��.���!F9��!�+467>73>32#"&2654&#"9jvA|6#XVAL1E,hj>nIo��AP=F,H0
#?B��	Mkq(�kYx;�aTfR_'21\I+U!+324&+324&+326</2Jet��9[5Y7>�y�FD��BF�28
9<DY;>&#��.(�'U�##��XJ�2�F1
3#5!#3>73�NU��T+EEN"5#��2����_�|ED��0���7��"J�###33���d�R�d��`�R�������������!���"(2#"&'532654+532654&#"'6�\m6/ 6!ov:^"]7<S�H:ES?;,C(T"ID19
	 4)C[O)2ZH%-&&F%U-73#4>7#3�lR��mS�00���<43
�@U-�
#"&'332673#4>7#3W_bQR/4.5��lR��mS�KMLL6%'4��00���<43
�@U
3##3�`�f�XX�����������!###"&'53267!�Y�
.L:
6ACϩ�^B��U�#467####3�O�J�Ou����V.�Q�-/���Q�U(!53#5!#�#XX��X�������7��'"TU#!#X��X���3��U�0"U��7���"H�###5!ǯW���2�J����^��6���<���]U�Ff#5!3!33fV�EXXL���2�1J326753#5#"&=3�g2R+XX-W=R[XU\���!VH�U,!3333,�)X�X����2�2�U�Gy3#5!3333+NX�4X�X��1����2�2��32+#5#32654&�nkft����;GB�MKKY�J�ګ(00#U�
3332#!3%2654&+UX�hdbn)X�w9HB>��LLKY��G'11#�U	2+34&+326L�fo�XE>��8I<�KYܝ1#�(���""&'53267!5!.#"'>32�.CF,N\��OLEP(KsAEy
LT[HRL
G
8zd_|;U��
"#"&'##33>3232654&#"
�mf}�XX�|eEj<��FLMDELLF
���y��qxA{Yeiieeff�3#7.546;#5#';5#"vf�:$hV�X�E>~�=5�#?/MQ��դ.-�0��7���&JEr��7���&Jl�	��*"&'532654#"##53533#3>32�!
$wYDYLLX��Z4bbD�H#0��d^��]AZZAX&)*]g�gLU��U��&�x�7���"".54>32.#"!!32676JsBDuI)OCMP��PN-FD
9z`d|9
HNPHYVL��3���"X��N��N�����&�l�`������O��!32+##"'53267#32654&�|iedt�}
.K9 6B�lo:IE�MKKYΩ�^A��ګ(00#U@32+5##335#32654&�xkebt��ZZ��np;HD�LKKY����ګ(00#��	����U�&�x���U-�&�E����
(#"&'3326733>73#"&'5326?�W_bQR/4.5��^tm_�YN$
.9�KMLL6%'4��(I!Q)0��LZF4+GU�G!#3!3##�XX�V�2����~�&.'33>7.'33673#.'�7];] .3a	] 09<I^a\P >4�_��[���3M(4l0T���8w9����4��;���##.'#.'33>?.'33>7�ZVR<vP*N3W(8	
J
X!46J���4�;�C��h_��35�2i1Q��BV�	o�3#53533#32#'2654&+���[��^jx2z�
^T\eTLffL|6\9_rLBCD8��	E�3#32+#535#32654&թ���gt�uu揑;MG�lI��KY�Il�n�(00#a��}�%".'##33>32.#"!!3267�m�I�ZZ�
S�h8d'$"O1k~R��|w/T)(V
U�g����^�OLxqN~�NU���"$".'##33>32.#"!!32672FoB�XX�	DlC)L?LN��	�,A?
4oV��Rg0HMPJ�L��	#####3'.�*_�FRF�]*+#�'�6J��J���X/1Xa;7#'##5##3'&'S�Zc5O7aZ�4�������;.2JI=$a��	#######333'.x)b�DQE�`��ZZ�~+#�$�6M��M��M����.X<#Z`:U#'##5##7##3373'.'#�Yd5O4dZe�VV�_4�����������;9?G2�� #'.##"#7>7'5!��BL,B\B72Z25A`B+KA�����B�.Q8��/4��S4/��8P/�BQ�x #'.##5"#7>7'5!8�6<"?X?
+&Q(+@W?!<6����3�'?)��"&��'"��(?(�3H�a��"%#'.##"#767##3!'5!��BL+CYC"61[17A^F�ZZ[�����B�.P8��23��R3.��Q�����BQ�UK#&#'.##5"#7>7##3!'5!�6<"?X?
+&Q&,
@W?	�VV����3�'>)��!'��&"��(�߬3H��*UU2.#"32>32.#"#".5467>54&+532654&#"'>7.'53>�	5X\aNZd��78#1,>9!,2
52 4<-EM exbYxdfbiiP@=^*,%V5?@<*3U9*!^CIVVG^oU#;#<EBCE;KG<6:"=%A
5.�>��T2&#"32632.#"#".54>7>54&+532654&#"'>7.'53>y
2;E8/ 7"oz43".5]%!&	,"h8;B"RFHXMNF:ES?;'H(:!5@4*3�9&
D419
	4(CX	J
#6!7#)1/*H%-&&F
;
0,��Z��c��O����=����#".54>32%"!.267!�K�lo�HH�pk�K��pr	�	oprq�-qfo�\\�on�\[���rr����yy�7��'"
#".54632'"!.267!'�sGo@�sIo?�JJ8MHMJ��L
��A}Y��A{rQOOQ�gZVVZ��"#3>?>32.g"%�g��^�	P'90!�@F��71N&'X1�HW(J2&#"#33>?>�	
{u�\F!/D(*�z��*?H"�4:����&!�^����&"�)=���6#".54>3232654&#"%33>73#"&'5326?�E�dg�BB�hd�E��emncbnmf)]wk]�ZM$
.9fo�\\�on�\[�o�������+��'H"Q(2��LZF4+G��7�G"&T^I=���2"&'.5467>32'>32>54&'#"&'�%[}@��%$X|CB|X%a$$	\]]\$$[__;b�b��`�bb�a��ss��ss�7��\L-#"&'.5467>324&'#"&'>32>\pc7^vqd!_t[;>@:;@2?:
t�0�us��rQddSSf$f=���	!X4632;#".#"#654.54632".54>32.#"32675332654&#"'>32#"'P=5&IR38XD4@i;!<;f]|=>tP&K"4RZfe7Z8 ef[R3"K&Pt>={]hGG�56>9{
	
"'9�_�om�YC����������CY�mo�_>>:��Nq U2;#".#"#54625654.54"&54632.#"32675332654&#"'>32#"&'�&IR29XC4@<g!=::gk{rd"8)=>NC"4X6"DK?=*9"dr{k8QPq?955k"(8#
	&���C
je^l��l^ej
C����(""(��~s
4#'##'##'5.'33>7.'33673#.'�([Z'7];] .3a	] 09<I^a\P >4�sT2222T��_��[���3M(4l0T���8w9����4��;����
1#'##'##'5#.'#.'33>?.'33>7M([Z'DZVR<vP*N3W(8	
J
X!46J�T2222T����4�;�C��h_��35�2i1Q��BV�<�f�2.#"3267#5".54>�8i)%"S2v�v�-Z|�FS��M�������_�jl�]7��"2.#"3267#5"&54>9(PDSQRP ,X�Cu"I	bii`	��慎d|93��-t'''7'77'7�;Z�"�d�!�Y<Y�!�c�"�t"�Q9Q�R9Q�!�Q9R�Q:R�5:���#"&546;>32#���/h2�8c���2#4&#"+532>�5<?EW83RI�55$?��\� 

4632&��"0:x�#'
	
%��\� 

5654.5432�w:0!�R%
	
'#�H��r2;#".#"#546F&IR38XD4@=r>956��9

)7ESao>32#.#">32#.#"!>32#.#">32#.#"!>32#.#">32#.#"!>32#.#">32#.#"�;<:?/-$&(<<:?/,$&�0;<:?/-$&�<<:?/,$&O;=9@.-$'��;<:?/-$&x<<:?/,$&��;<:?/-$&�5=@2"#�5=?3"#5=?3"#��4>@2!#4>@2!#��5=@2!#5=@2!#�4>@2!#���&4#,5>G#'>7'.''7>7.'%.'5.'7'>#>73AR(��?:	02+`#9)f/�P2q+	-i/�-j.1q,20(?9��9(g/(+`h(9R41q,	-j.�+`#9)f.1?9
0��R(9(9R��(g/),`"::	0(?W-i/2q+a�D�
%"&'3326737#4>7##3333bPQ/4-6SXsMS�udT�cbHKM6%'4KM�A��LK���w!MDP����U�G��
""&'3326737#4>7#333IbPQ/4-6SXH=R��lSl\?^LL6%'4KM��=2/�?�� K��2��4�3#32+#535#3254&���Zl~5���JJ�bf�`�ZN�5\:bo"NZ�����D8	�3#32+#535#32654&����okht�LL掐<LF�wC��MKKY>Cw���(00#a1�'+#32267'7>54+12993G0CWZċ���$27A�_�9dK+]
���n�B*S8+���U�0","&'##33>32'"327'7>54&S>QXH
N@cy.)74?!8RCAX:7=G
/6�I#0��Tu"K)T�\^ckK)OR8eea�]!#!5���ZH]�ʓU��##35��X���,���
!3###53�����ZJJ�P�N��:NB�
#3##5#535��XLLJ�D��D�a�g� "#!!>32#"&'532654&7Z���;��DxN.?>"Z]�:���P���m�FP{xwzU�� #>32#"&'532654&#"#��"�:b<&9:"?CTY"XJ���ay8N
`fic��Du�	3#5###	33K���_V2��V��g��dV�����j��j��o[��Z��Z�G3#5###33�ݯbU0�R�d��`�R��������������&�$�:4&'.'532654&+532654&#"'>32#"'53263\(/o1`cthfajiP@CY*+*{Mtx\MZ^}}*31t4RHBD>KG<6:"=+dMIUXGXs:&,48!�$�"84&'&'532654+532654&#"'632#"'5326�]6"]7<S�H:ES?;,C(Tg\m6/ 6!ag*31t5O)2ZH%-&&F%ID19
	 4)?X9&,48a�D��	3#5##3\��lV;��ZZ;�����j����ZU�F5##333�+�XX�`�Z����������aj�%#5'#375373#'5==ZZ==�f��5lɌ�D����C�b��"���U73#'#5'#375%m`��fz@8XX8�S|�6��\�?����@�
j�53533#3	##
TZ^^;f��Dl��Z&OUUO�Z����j��&	�3#3###535����`�f�XLL�ZA��������]AZ��	###53���Dl��Z��;����j��zP��Zk###5!X�e�V���������H��a�D��5#!#3!33�Y��ZZoYV��M����.����U�Gw5#5!#3!533 P��XX#XO������2��a'�
33!3##!aZn��Z����.P��M��U�
33!5!##5!UX#�X����H�0��a���">32#"&'532654&#"#!#!`7��CwN/>>"Y]ul9Y��Z����k�G
P
|vxy��y���U�B#>32#"&'532654&#"#!#!"FqB5[8$64 9<PS"X��X�18|fay8N
`fic��2=����3?327#"&'#".54632.#"327.54>324&#">�#7 $&'.N#? h�J�� :2tg�j(-0S43S2[/-...$06KAlPO		Z�k��
L	����1�KVm31m_RabOGw& {7��]"2>2.#"3267.54632327#"&'#".546">54&!)
$P?F9%ZCAU9'
#%D2%Om8v
"#$ ("Gne9Z3 W:\VS_DaFJ|K���;51KK43;=�$Y�,4&'.54>32.#"3267#"##"'5326y"~~O�nqT$!Q0s�{{/T((U;)31t8��l�]*L����N8&,487�$�"*4&'.54>32.#"3267##"'5326*"PbBqH)L@�ML,C@*)31t8�wc|:I	�ag
N8&,48	�D!�5##5!#3BZ��V��yQQ����G�#3#5##5ƮOVP�I�z����I��6�>��#533>73*X�\po\�����(YX)&��6�35#535333#�b��a�O���_�KO���3##5#5333>7�ц�X���\nk��C��C��.N!!Q/�Dh�5##3332��_��d��_ݺV��6��tV��������F5#'#3733�(��c¹d��c��N���������	�DG�5!#5!#!33����dZY��yQQ��z�����G�5!#5!#!33l�B���XQ���II�{�1��P�D��3#5##"&533267YVVZ:e>dnZ=D;^;����%]X��:9ZJ�F_3#5#5#"&=332675OWP-W=R[Xg2R+�2����!VH��\�PY�##5"&53353>7Y["F&=otZ@I='H�6#
��Z[��9:��\J#5#5#"&=353>75X8 ;	RXX_;8���yrWG��Y���aj�3>32#4&#"#aZ:l7dnZ=D;^;Z��]X��:9����U�M���#*2!3267#"&'#"&54673;>"!4&�j�;��yyDm.+nP��
7FK6��au�]�Z�g3{�R��?5"1��P|wq���f!#*2!3267#"&'.54673;>"!4&�Fc5��WO:L*)P7s�@EH3

Ad9>J@!<lI5aYL�67 
1Oc/HNKET�D�&.2!3267#5.'#"&54673;>"!4.�j�;��yyDm.'aCW��	7FK6��au�&X�Y�e6{�R����?5"1��P|wLl;�Gf!%,.'.54673;>32!3267#"!4&bZj@EH3
�YFc5��WO:L*#G,V$>J@�o67 
1sn<lI5aYL��NKET��(*�.T�
#"&'33267333	###iW_bQR/4.5���dVd��g��V��g�KMLL6%'4��[��Z��Z����j��j����
#"&'33267###332W_bQR/4.5���d�R�d��`�R��KMLL6%'4������������a���#32#"&'532654.#"#3>?3*��H{N.>?(TeArJ"9ZZ6�k|��n�EPzxPg2����?�U�%#"&'532654&#"#373=d;$75!<N]X0WW�a�Jo>ax9L`gh^����7w�D��%3#7###"&'532>7>7!caHgNZ�	
&?3#
#�P��{J��4C^0K1I$&��o�GH%3#7###"'53267!�\@Y=X�/L96ACJ���ϩ�^C��a���%#"&'53265!#3!3�DwN/=>#\_��ZZoYFn�DOvy	����.U�(%#"&'5326=!#3!53(5[8$559=��XX"Yav6
NYg����a�D��%3#7#!#3!3�bIgNY��ZZoYP��M����.U�G�33!533#7#5!UX#X\@Z>X����2�����P�DY�!##35#"&5332673YWVS:e>dnZ=D;^;Z��]X��:9ZJ�F##35#"&=332675OVM-W=R[Xg2R+���!VH��\�a�D��!##3333#7#4>7#��S��߄aHhOY�rEB�F��I�����CB��U�G�%#7#467####33�@Z>O�J�Ou��uJ���V.�Q�-/���Q��2��(*�.~�
#"&'33267'!#3	.'3�W_bQR/4.5yV��U[Q��
Q��KMLL6%'4�X���3*-;�.����
)4#"&'332672#'##"&546?54&#"'>326=�W_bQR/4.5cb^@#MDI`~�[:5*L!#`NdM7+DZ�KMLL6%'4�V^��L,*MRPW C4B��83-*KN0��~�&&l���.����&Fl�����5����.��-"�a��
#"&'33267!!!!!!�W_bQR/4.5U�q���#��5�KMLL6%'4�X�O�N�7���
%,#"&'332672!3267#".54>"!.�W_bQR/4.5cEc5��YP3O*)P7LuA;kF?I>�KMLL6%'4�<mI5[_M>{YX~DHQHDU;����"5>32#".=!.267!LCq0,kOq�NJ�ij�;zbbz�U&X�R\�po�[[�o"y���}vKm;��3���"��;����&�l;���3����&l���T�&�l������&�lS��&���&�l�����!����&�l�#���#"&'532654&+57!5���:g-/n2a`qiC��G�dc^xRJCC>I�P��#"&'532654&+57!5��DpBAwQ;^ !b:M`o[;��@�5aIGm=PYMTK=�J��b�W&������U-�&�����b��&�li���U-�&�l(��=����&4le���7��'�&Tl
��=������7��'" ��=���&le���7��'�& l����;�&�l���������&�l�����pW&���������&^�B����p�&�l$������&^l�����p�&���������&^�[��PY�&�l0���J�&�l	a�D��	!3#5#���UUZ�P����U�G�	#3#5#��OWPI�z�����a��&�l����U��&�l_�:��"&'532=##53!!3#3�
0YJJ�����N9�I4F:NBP�N�@E�:�"&'532=#5#535!#3#3�
0VLLI�M9�I4F�D�J�D��@E�:a�"&'532=##333�
02��_��d��_ݻN9�I4F6��tV�����ڑ@E�:"&'532=#'#3733�
0-��c¹d��c��I9�I4F�����΅@EF�3333####=��d��`����f��`ם�)����O��6��R�3'3733##'#7#8��d��c����d��c��6����D����>�!"&54>;3'3#"C�w3vcmZ�df_WUg^9b<.�6MD>C<��7���I>��+�'%326=3#"&'#"&54>;3"32>=�940:Yba=MP?ns:~fEZ�_a�/7�95:7��Qj,&%,hfA`6.��>K�1�6��3�"/%326=3#".'#"&546323.=3"326754&,A83Yd^2>%
UKcxw^=KW�FBCFPA>�@J@A��b_+(8����.!
2��jeee\^dj#��.�+2326=3#"&'.+532654&#"'>	nt[GT[3;95Xh^[pjba]abK<:W&-)v�cMIWVJF=;@��aa_kKAII<6:"<+&���"(232=3#"'.+532654&#"'>�Xl3,1=19iW��GGE8AL;7&E&)R"ID19

:4-5���¡1+H%-&&F#�Db�#23#5#54&+532654&#"'>qx`JY_ZV[vkceghO@=](-)z�cMIVXGz���D>II<5;#<+&�G	!$23#5#54&+532654&#"'>�Zn6-5 RVPJMJ;FS@8(L$ *_!JD17
	5)J����//I%,&'F����)%32=3#".5##"&'532>7>7!Q56lXi[9Y3�	
'>3#"u�@8{��aa&VG�I��5C]0K0I'(��o��%32=3#"&5##"'53267!�28eX�]f�/L96A;�?=���_d��^C��a����%326=3#".=!#3!3o5665Xh[9Y2��ZZ[Y�@9;@��aa&WG�����.U��D!5332=3#"&=!#�X38eW�\g��X���@=����`c6�=���� !#".54>32.#"32>5#���l�PT�w;r-"&f4��6mTM[(�r+��Y�rn�\M��U�I9eA7��M"3#"&54632.#"3265#P�{�����:]( T/ggYdXM�"~����Eo`\qSC	��p�#326=3#".5#5�8758Yk[9[5��Q�D@9;@��aa&VG�Q��?#326=3#"&5#5��4825W�[i�H��@=<A���_dH5��%�(2.#";#"3267#"&54675.546=Lo-0)W>CMfdedhwbX=k-V���e[O[}�'@ 97<EJADCCS&o^J]
UINe��+���"�:��*"&'532=###"&'532>7>7!3<
0Y�	
&?3#
#�N9�I4F{J��4C^0K1I$&��o���@E�:;!"&'532=###"&'53267!3�
0X�
.L:
6ACN9�I4Fϩ�^B��,�@E����#"&'532>7>7!3###B#"��_��f��_�	
'>K0I'(��o������6��tI��5C]0��"'53267373#'#'#56Ac��d��c…r/LC������������]a"�33273#+2654&+a�bs3�_��f�!lNRHfdX_[�2eL���X$��cBOED��U� ")33>3273#'#"&'#2>54&#"UHNAVs�c��d�
sY>Q�1?GJRCA�I#0ii�����mo/4�/6]<\n\^ckP�.5463!!!!!!##3#"�&C*�����#��5�t��iFhlU[X8
.P?agO�N�O(��t	;DBH��="")2"&'##7.546;>32!3267.#"35#"ug�
}�f�:$hV�K/Ec5��YP3O*)P5>C?I�t�=5E
rm��#?/MQ: $<mI5[_MKDUQH#�0&.-��=�V��6��7�"V����<��\aj�!##37'773'jl��ZZ�V2VXf�Z3X~j�����S5Ra�V5U�U773'##37�,E=`jJ*IR�f�XX��+EEwJ,H]����������6"&'532654&#"###"&'532>7>7!>32�/>>"Y]ul9Z�

&?3""T7��Cw�
P
|vxy��{J��4C^0K/I'(��o����k�G�,"&'532654&#"###"'53267!>32=&9:"?CTY"X}
.K9 6B "�:b�N
`fic��^A�����ay8a��&>32#"&'532654&#"#!#3!3�7��CwN/>>"Y]ul9Z��ZZnZ���k�G
P
|vxy��M����.U�J&"&'532654&#"#5##3353>32r&9:"?CTY"X�XX�X"�:b�N
`fic��������ay8a�D��5#!#!3yY��ZV��{������U�Gi%#5#!#!iWP��X�J����3�2a�D��5#4&#"#3>323iY=D;^;ZZ:l7dmV��:9����]X��U�Gh�5#4#"#33>323OxZCXXY4bbO��W�e^����(#)*]g����4~�3!3#!#"&'532^ZlZZ��K@!<=��/�6N�wIHI��"&'53253!53#5!#CXXX��D�IZe�����K\�D{�&!33	##!3#5!#3>7!B0Z;f��Dl��Z��[V�V7$A2 O/9 M��9��Z����j��I���>���OQ:���6)�F�#3533##5#3#5!#3>73��X�`�f�X�NU��T+EEN"5#�������������_�|ED��0��@�� '3>7.53>7!3#5!>7#!5l)DKUW&'PW��6U7� z&tg&�&[1
XK��\_�X����G����,0X�F?&367&=3>7!3#5!675#35M%~M#'JQ�u�PKw[�(W1�5=���/6
@�L�0�����8�:l�7�@��%#5###"&'532>7>7!�WT�	
&?3#
#�M��{J��4C^0K1I$&��o���F8%#5###"&'53267!8QS�
.L:
6ACF��ϩ�^B��.���E�
>32.#"7#"&54632��kLHl"ED5:8��eRX_GFKC*���E�4632#"&%#"&'73267�kMHl"ED6:8O%dSY^FFKC�G��>4632#"&�!  !""""N6��4632#"&4632#"&N$$$$$$$$�&&&&��&&&&�Q%#"&'732654&''>54&#"'>3232675#53.#"#".'7326323###"'�[CV�?G+d>&0) D9/%<"M1NSC	&$ 2IG'%

#9/B%+ %8*ohQ.�FD��j{#'%:F,%$ EN;N*

�GD1;7,,"RJG��"x;%#"&'732654&''>54&#"'>3232675#5!###"'�[CV�?G+d>&0) D9/%<"M1NSC	&$ 2IhQ.�FD��j{#'%:F,%$ EN;N*

�GG��"x?%#"&'732654&''>54&#"'>3232675#5!#####"'�[CV�?G+d>&0) D9/%<"M1NSC	&$ 2IhQ�Q.�FD��j{#'%:F,%$ EN;N*

�GG��'��"���n<%".5467>;5!5!##"632.'.5463232654&:/@>1]���n�	.7JbSK?"!9h-;E+FM1�L3(
VGG�!
KAAK

F9 ),!$������&���3n'!##".'732654&''>54&'!3n O$9-N09g_,GCO.)5-(#JG��nG'0Z. U;2D"=�rNwC%1)EF01-
n<!!>32'>54&#"#".'732654&''>54&'!�� O	>"AS#H )#'*-N09g_,GCO.)5-(#JG��nG'0Z.	OE.\/)G(,'%&2D"=�rNwC%1)EF01-
��cnF7'7.#"'>325!5!!>7&546323267#"&5467.'#5/�*=*9)"J,(@>%��c�k"C
*&-
4.1 /"B)LT/.5:PAC�6-J90�GG�	 ,!"+!)!"F
O>(E
������nD%467>54&#"'67.#".54>32675!5!#3267#"&�=C,#3.M1(++R:6:`81I%,I!0D�*ʤ(B=:2 /"C)KU0I0-+?=.#.$&EK142[]55C-
GG�JE)M 
,$"E
N���H8y&�"����H8�&�#3�H8n/#'>7>=#'>54./.'&=#5!8^%Q
�("n?5!H
01W'7O8'�3<0J#)��.:&>$A2(G*-#21"$D�G���H8�&�$3��'y&�"����&�#����&�$����&�%�	n4!632'>54&#"#5#".54632.#"3267!5!	��0EAR#H '#68QG2/S2nX91:@=(,E��	'�2SM.h2) T)/.H���$&M9P^I4/53*#GAnD#5#"&'.54632>54&'#5!267!32675#".54632.#"�Q#S*l�b"%	�A��#:��F>F�c+N%@(/K+`O6%077'��-k}#-";/GG��%8R`TZL'F.IQE,,+)Bn#".546;5#5!##�7&"BhQ'��*<�GG��']n-##5#"&5467.547#5!3267!632&"#"]gQL7M`(.
4]�J8,4M��+"#19'�٦QC4F*G��*'+#!%(F(�n0<%".5467>;5!5!##"632#"&'73254&74632#"&f:.A>1]�o���	.7Jbbcb�;=9wKt1k�L4(
VGG�!
KADVXF1DAN"$s  !!�n"##5#"&54675!23#"3267!5!�hPH2Mc�%$ :G:&2G�/�'�٥VG3HF1/+++#G�nH%2>54&#".54675!5!##"&5467.54632.#"632&"#"(M~K.)"5:!QJ75�9˴3C2]�Rab*/ZI4
#X,"#^>F?lE/>$ 3?S40D	FGGJ
TH:nX4S@-A+<@EA 	FF(&�n"##"'#".'732654&'7!5!5!�Q�)$,)C(5`X*G.d: )=-���'��rP-.>=�w��"(,N@nGG��n7L%".5467>;5!5!##5#"'.'.5463232654&727##"632:/@93`��hQ0	SK?"!9h-;E+FM1�64��	.7*#=�L3(
VGG���AK

F9 ),!$.�!

�n+>32232675!5!##+#"&'732654&#"�AC^	'���gQ(0
>M"U�3E)YB7>9).�D?	�GG��27jr]P4+.(n ##"3267#".54>;5!5!�70@7,G*6L*,c5Em>Do?��'�&A0?J4bFAY.�GXn$##"&54>;5!5!2654&'#"X�PXBnBq�Do>��X��G^:9#J/!_'�qIFW)qgC[.�G��=C0M7'FDPn0%".5467>;5!5!##"632#"&'73254&f:/@>1]�oPn�	.7Jbbcb�;=9wKt1�L3(
VGG�!
KACWXF1DAN##An%0!".54>75!5!##"&54>32'>54&#"3NuBHvE��A�'@E @:!A11?sf7F##,7gIF_1iGG�<):J(*"<%%<"FW�%!-)"+�n####"'.=#5!27>=#zQ�B/],O�4�
!'��'�*:;F6�GG�� ,+��'.��Hn##".5467>;5!5!�Qm==JG6.O/RD��pH'��H+1[94(PV0#8�GG.�x-#5#"&'>54&#".546323267#5!)QP7Uw_M/% QALI5)K0PJ:34J R
'�ٴa]G6233	F	=:89#H8J\$#( GG��n4.'#".5467>;5!5!##"3:7&54632�&*UG+!`;���1:GOR*+-!:"F/O9,?_GG�. 5E#1 #	3#*vx<##5#"&5467.54632'>54&#"632&"#"3267#53vhQI:M_/;R?5G(=	(1#299,5J>�'�ٖQC2G8<O8-/)'
,# 'F)&)(+2G9n!####".5463!5!9gQ�6&"�nG��*6*<�����9n&��Gn#5#"&'.=#5!+3267�QD/(AOG��
2(F'�ٿI@�GG�)0&n$/>32'>54&#"#5#"&'.=#5!!3267�:#AR#H (#59Q@+(@O��()@'�SM.h2) T)/.I���G9�GG�70"In(##5#".54632.#"67!5!3267'IgQM88Y2yb('2��oI�6C0!�)'�٥*K3V\E�'G��43�.�x1235#5!##5##".546;54&'&#".546�%:Ƀ;gQ�*$!
+/9KYLxD>t�GG��%!',i/2G=@;5dn#5##".546;5#5!+3�Q�*$"~d���'��%!',�GG�Sn##5#"&'>54&'#53267#ShQN3Zo><{�=12J�nG�ٳyd
/,0G��11*46l���n!%.'.54632>54&'#5!#�6;hP
"%'$
��h,L1-w*61dX$"<'-GG#:7L54o���n!-%.'.54632>54&'#5!#4632#"&�6;hP
"%'$
��h,L1-w��!  !*61dX$"<'-GG#:7L54o7""!!���n+5!##&#"'67.#".54>3263235�hQ2.M0(++R:6:`81J$,I!:W'GG��c?=.#.$&EK142[]55C8}@n!0?5!##"&'#".54>32>7532654&#"326?67.#"�4D+O66P'I-/M.-P36O':#m!=#*?7%&5��6%&6!<#*?'GGw]J5U0+$.!+T=8T/+$'"r��!#7>@455>5541!$8���wn&�7;n###5#".54632.#"3267!5!;hPK56T1s^
'%
0>F?-4K�};'�٥*K3V\I6230-#G(���x,47"&54632>54&#".54632.'##5!z#/$'2@;/98^]GC/R3E=-T@3S%�QY�#VA8C#FS:3@+U@Eu!'_,,H]j��'GGQn##5#"&'.=#5#3267QhQJ2(AO����22�
nG�ٿI@�GG��/�)0���n&3##"&'.'.54632>54&'#5!2675#KQ:'*]!)o=68cL"%	����'@"�
4'��
	
4n161dX$";0GG�	�.*>�r"n7%>54&#".5467.5467>;5!5!##"632A$.:AEIGF6[c;)���"h�	/6EW)DAE$ &+90:G55G|M&;4"(
VGG�*C&:L�Vg��%53�Qg����%&���@���4632#"&��!  !�""!!*�n*%#".'732654.'.547>;#"�UF.NJ)E&J2$-/+,1.;?]f'	,&-6�BO"RI#ER$%)0"$8/>G
 ($<;n##5!�QY'��'GG����N�$�.546323###53.#"�TK<P:ngQYW=7(*g#@"AS9y`G��'Ghc1+"7�9��632#"&'73254&#"�6:KS]Va�<='FO1j1+M?=N\L+0>J! �����#"&54632.#"3267?9KU\OKpV">6pI342*�

O?9P8[5'SX' &
����#"&54673267C)KUYX:42 /"�
O?8SB,!"���vB&#"'3267#"&547.54673267C)
,% 0"C)OQYX:4-$ /"�

?
K94"/JB%
���Ey
#"&'73267EkMHl"GC597_dSY^FDIC�%g���.#"#".'732632�(&

#9/B%+ %8+gH4;7,,"VM�gg���.#"'632�)2""'46O?gO[&	I3{k�Tg���.#"'>327.#"'632�-+*2-F&, '46O?g(%	E
+&49E3{k����*y&"����(�&#���j�&$���W�&%�M�����
632.#"�DeO"92eD	,3V3)PKg n#3�Q�'��nG����&�PZbg4632#"&%#"&'73267#"&'732654&''>54&#"'>32326?>32#"&'732654&#"#1�kLHl"ED5:9�[CV�?G+d>&0) D9/%<"M1NS%% #F6&F-_P.D 1.#9+!(9/
0&eSY_FFKC��FD��j{#'%:F,%$ EN;(@/80%O?Q`#55647"),%.�[���h#53^GG���c�l����!!�cI��MG�����i'3�rlG����N�i#7qAGi�����*�
#"&'73267!!*dD@cD:/22��H��gO@DK4./4�@��J����
"&'73267��Ad#M==M"d�'B""B'����
"&'73267"&'73267��@d #M==M"g>A`#,O22O+#`�&B!!B'v BB ����	n&�������An&�������Bn&��������n&�1O���@Pn&�S���@An&�/����n&������Sn&���^onX7'7.#"'>325!5!!>7&546323267#"'3267#"&547&5467.'#5/�*=*9)"J,(@>%��c�k"C
*&-
7+,% /"B),% /"B)OQ6./5:PAC�6-J90�GG�	 ,!"+!(
?

?
K9%B":
����:�nW2675!5!#3267#"'3267#"&547&5467>54&#"'67.#".54>�,I!0D�*ʤ(B6;,% /"C),% /"B)OQ6EI,#3.M1(++R:6:`81I�-
GG�JE#7?

?
K9%A*D

-+?=.#.$&EK142[]55C�.�v->#23267#"&5467>54&#"'67.#".54>32>h8&80%#5 ;C8> %!
F#GA.-J+':";:3*6
>
?2(=0.%")J52'GJ)*4�.�v�J"'3267#"&547.5467&#"'67.#".54>32>323267

%$5 <B#$%!
F#GA.-J+':";:%8&+"&$5��
=
=2
',0.%")J52'GJ)*45+
=
�n3#�QQn����n3#3#�QQ�QQn��n��Ky�%".54>32'2654&#":[33Z:;[43[=5D@54D@y3[:;Y33[;:Z2GJ89FJ98F����x*2'>54&/7>54&#".54>HR#RGy(A�jn)#'110?xL9'IQ2`<#51�Dh2  !:>05#T���x$%&'#"&54632>54&#"'>32�@_O#0$&+>A4#<&%S+7Y4F9-W!-�L#O9;<E*UAFl,pZ���x3>32.'#"&54632>54&'#'2>54&#"ZP5PY;0,?:;A#< "0$-"0-52!&<@0&"D#RI=J(B*3ME"*2N#	0$#0G&# >���x+9%#".54>7.5467>54'732654.'�QF+G+,.6A!U7878T
"A3/+�"("(
!  
7J!<(2A/6M:/4J78K208K41E5
*&"/"!/"T��%x'.'#".5467327&54632�&$+RA&T#FJ		+(,-3CKNF2V@.m11]4FG
!1%	^`#g��xA.'#".5467.54632.#"632.#"3:7.54632�"B[.$)iP?-l'#,	
2>F2
)+-2CA=.M-6?,@CFG%
	E*,..
#1%	!U%&1L%#".'732654.#".54632dN=aI3P1UB=)1$:4c\E<:U/uh2wʙ��mRF3X6!FR:5BFzH�x!".54>?32673\:/*�>�.!B03^4$.p$L;>J2�5�7C"3+""J)G��x*4>32'>54&/.732654&#"G)L4MZGA�$@�7(P0&)0/''2�-J+]JAS

t<#51�.P&*36*)55@i.".54>32'2654&#"�)D(%D,+B''B+#++#%*-$?)&?&%>('@%B)! )+!)i��4632#"&i""""N##%%��+y&�"���%&����%&�����&������Jx&�3�����x&�4�9n$632'>54.#"#".54675#5!�*)tf"H:6,)*$$29'�gY0j4)!X+&7S&*!
�GG���n".:F##"'#".'732654&'7!5!5!4632#"&'4632#"&4632#"&�Q�'#+)C(5`X*G.d: )=-����h�]'���J),::�p}�%(G@VGG�DSn%#5#"&'>54&'#5!+'.'3267�QN3Zo><{S��
��
1,=1$5'�ٳyd
/,0GG�E
$411Bn7!##".546;5#5!#!R8�7&"�Bh�xG��)<�GG���n$7!#"'#".'732654&'735!5!#!R�v'#+)C(5`X*G.d: )=-����h��GCJ),::�p}�%(G@VGG��?�x2#>54&#"'>�_jYJPSLG-,< RxeRIb��GG756F
Pn/3".547>;5!5!##">32#"&'732654&!!f@-<#73d�oPn�!$8T[ad`�;;7zO>6,���+

D,/FGG�
	A9:KJ@3:;�GIn"*7!5#".54632.#">7!5!#!327'R?M88Y2yb('2	�oIh�q-C0 �-Gr*L3V[E�	GG��242	�����^R�'�������^
7#/"&54632'2654&#""&54632!"&546322>?12??2 !! ��^;22::22;1 !! �\�F#."&'#"&54632>32%27.#"2654&#"s(67$2A?4%76(2?2��.(($"%% +**\,-?50C)!,@45!3E"!((('D!$��TlH>7#.'553,"12",2�#44#
��rv�|#4632#"&4632#"&74632#"&.`�H��2���''7'77''7'7755#47!75#45
45#56!65#46a55#57!75#55!55#57!75#55����A>3232>3232>32#.#"#".#"#".#"�6+ *)$$), 4;5(&,#&,+&"-#��C?)********<Z/:T********+A"��6��	"&=3648E�4+n_�t����	"&=3"&=3 39E�47E�4+n_94+n_����a(%3#�*7�7(������(
%3#"&5463�j7X(��3c�C4673#.%#654'3�2002�2002� :0@>2:90??2:��cDC#/4673#.%#654'34673#.%#654'3��2002�2002��2002�2002� :0@>2:90??2: :0@>2:90??2:���3���h���kk�K%4673#.%#654'3�k2002)2002� :0@>2:90??2:�T�����!.'##'33>?33>?3#		+-B)!

++)
	!)C/�		y�s#"
yy
!
#s��T�����!3>?3#'.'##'.'##73	+-B)!		++)

!)C/� 		 y�s#
"yy 
#s�5���)5%#"&54>32#"&'>32"3254&"32654&�*WE|�)LkBNO^J+W$ `*\a�3MQ d,J"UG5B69�+H+üT�l<M5@EKT?3S�A4J '�)BG1',.�1
3#!#3>73�NU��T+EEN"5#��Z����bW�qE>�v,a7���"
#".5463232654&#"�^P3M,]Q3M,�'+*((+*'
��6{f��6yfn``nn]]7��A"".54>32.#"3267}c�PR�`=h $X*{spm?_($W
:z_c|:I
feag
N��T�#!5T�Xs���6�JU,3!####U�X�X����2�2��C�32+#5#32654&֔nkft����;GB��DMKKY�J���(00#	E�3#32+#535#32654&թ���gt�uu揑;MG��I��KY�I��(00#1��'�3#"&5467332654&#".�^�]Zz~~zY\�^LQSJNNOO����^n��n^���MdcNP^a������73'���=�6q����������
73'73#���=�6qW==���Յ�����!!!��H��!C2���3#'3#�65Q66������M!!����MG�1���3267#"'#"&'73267�KA5AA6@JA4-'<\F<<F\<'-4�P�����3!!�PN��7lE�E������463#";#"&'.�EL=
��.,�5:GE
,������E��"�V��h��'73�r=�(�-h�(��=� ���h3#'3#hDDxDDh������h3#73#73#��@@m@@m@@h��������[�����.�g�3����'70NOO�RRS���L����4632#"&'4632#"&��}!!!!!!!!�2�L����#4632#"&'4632#"&'4632#"&���}!!!!!!!!!!!!))�47>;#";#"&))73��#>O�BG E>��\�W#.#"#"&'732>54.54632~&%*4`K"	EHSG,E�15P��|3[E(K,R8i��[QX ���8!!����8H����I+53267>54&'&'+&'9?pz&	
"-#"I$"3.+

G0&$�OI;#"&'.54>7>7"#-"
	&zp?9'&*&0G

+.3"$$��O8.'.5467>;#"�*&'9?pz&	"-#"!$"3.,

G0&�����8'67>54'.+5325"#-"	&zp?9'&+&0G

,.3"$�����)3267>54&'.54632.#"+}z&	
)+2M@<\/B;(! %1)+9?p8'!$86!7I?O!26"2)"3/+

��,T8(%#"#"&'732654&'.5467>;Tz&	(,2M@=[/B;(! $2)+9?p�'"$76!7I?O!26" 2)"3/,

3�xD!".54632#"&'732654&#"32>=4&#"3267#"&54632�w�MnV<DMQ
	/.$4;6t^Nj?93#.4	

OSH>SkM�Z�f��H8:OA% qhGzI.Nc6ap 'DO:;E��i�V*�xR!".5467>54&#".5463232>54&'.54>32'>54&#"v_y:3*. (,
:AH=>D)1""TLOV"' %F;AA@;
,($1"!:9z4[8;L)3%") E(82>/B0M/ 4$9&*;$3%38#>+B46(F +& 4 V97Z4*�xG!".5467>54&#".5463232654&#"3267#"&54632u^y:3*. (,
:AH=>D)1"!RI�|93#-4
OSH>Sk�4[8;L)3%") E(82>/B0M/ 4$9&�tMe 'CO:;E�w��*#xFP%4&'#".5467>54&#".546323267.54632'>.#"���Ut;3*. (,
:AH=>D)1"#M>moU\#G;+J.BF#H!��<>)*!�$({�4[8;L)3%") E(82>/C/M/ 4$9&p]3A'6B,k\FA'W))?:'$NR�W��h��7�-�-]<�<8x6B!"&547.54>32.#"632"&#"327&54632"&546326co9,9'TC <.@7)1*3

%A'C?( 1Pg!!  kSO5M8'D*F0""9G4);=
	#"-"!!":���x1=32654#7#".5467.54632.#"3267'4632#"&�0�1"R
DG@B)I-1-9D�n6/LTN< : �
j((-D;7-:C5.HU<[aI;9<5

\  !!)�x+7E%#".54>7054&'.54632.#"'4632#"&"32654&'�@e:@i=:`8(@8;E@) OSo!!!!YO^*C&@R<8�<H 'O<2G'9+*<<,! #&1]�""""o23#,-0#=$���I4@L7>7>54'.+"&'.54>7>7;24632#"&4632#"&�$-!	'F?9'&*/"#-"
	&G*3!
'&+$$$$�$$$$&0

+.3"$:&0	,.3"$�&&&&��&&&&'*��
"&'732672.#"'>Kt!JI4;<OoWKt!JH5:<Oo$a_IHNEgYa_JGNDhX'8��
7>54&'7.5467'ALDHc][e�BLEGb^Zf�?<7LE$tLKsp?;7LD$tKKs���E�
#"&'73267EkMHl"GC597odSY^FDIC-�%'7'77	�D��?��D��@ؾ0��+��0��+/�E�7".'73267332>7#"&'�-A%O!+J ) O%A-,77�&b[DEEXXEEC[b&&..&������gw�������Vg'w����wl��
33#'#73'&'
�M�[A�?[�9
�桡�
�)5##!#3#3%35#��ԩP]|����M���H�G���3��2",7>3267#"&'#".=!.#"5>32>324&#"7>32672x|Z=3(M!#c2>QT6A^3WOJ1M&(M2�>#[MIa[3*?UK^H��9=:C�PW"A4B)-).<mG6`[Mq4=MQ-*KN08zETOJ
6'35#535323##254&+2654&+UKK�9[5ZFet�7>��BFFD��E�;3+E+DY<J&#��'/.(�;���"3267#"&54>32.FQ]VX"E#"D.��>xV+S#"A�l_^m
H
�Q|EE
V+324&+32����~�\d\M>�����d^�v$2+5#535#3#3254&}����88�H��9�d�����H�G�H��d^V�)!#3#3���A����H�G�!���"("'732654&+53254&#"5>32�gT(C,;?SE:H�S<7]"^:vo!6 /6m
%F&&-%HZ2)O[C(5 	
91CJV�7�#2#"&546�X+����2��
"&'532653t!$'XR
G-��xOKV�33>?3#'VY �g��g�+�"����%��
35'7373V#AY`$��:&�7<J�IV�3333#<7###Vw��vX�H��f���H �w�#��V333#467##VT	`T��`��:���+5�k;��? ".54>32'2654&#"=Ws89sW}�;sTVOOUUQPE}RS{E�}S|EGn__ll__n#���"&'532654&#"'632�.D"$D"Q^XW"A!Fe��=s
H
m^^m
E#�Q{F>
%"&54>32"32654&)��A}Y��A{Y_oo__ll�sGo@�tHp?�KRQLLRRJHE�74>32'>54#"#.:z_c|:I	�ag
N�Hn?ArH(M@�ML+DAZ&%"&547'7>32'"654&27%1��!8'>$e@��$8&?#c>&A2l_J1��o�sJ7(:-!�tI:';-"�
�$4RJ���"4QL4��|"!-4"&=!.#"5>32>32#"&'%2654&#"267!
etdSM4N()M5DifBFm?�r?d^@OFGPNHI��<F��<	�m5`ZM7878A|Z��8659IgdeifdhgNJES9���*#".5467.=3326=3"32654&�#)/8xd=c950%%Y2462X�A==AA>>�1EJ8X`+S:9IH.HH.<<.H�955<<559;
? 2#4&#"#4>>}�]OUUQ]9s �}_ll_S{E;��?
#".533265?;sTWs8]PUVO
S|EE}R_nn_V�2+##32654&�ne*aU3Y�:+HE=TM-N1�G�-5/.�7.546;#5##35#"�1ij�XX�fDG;><�#<-JO�����(--1�!"&54>7'3353'35#"ji1�f�XX�GD@<>PI.;$
����G�1--(�!##5!#Y����HHQ��%#"&5332653/aKjmY@AD<X�8Z4m[W��=BH7Y&/H�%#!5!254&#!5!H]h��W�d^��I*)�`bWxYDXG
\+��+!#!5!254&#!"&54632"&54632�G*']f��Y�d^���H
\4abYwYEX�(��J�!%#!5!254&#!5!254&#!5!J]h��YZV��Yd^��I*)Z.,B[ZWmNCWnQ>XG
U0~&\�333>73��YkkY���6126<��
�$333>733>73#.'#��RCVWT	DQ�]T


W��+X27.��"PX.��.:.

/:��'�	35!5!!' ��p��#:�DB�nD!���#"&'532654&+57!5��fWov:^"]7<SLMH���B�	ZFF`O,72,A�D����'"&54675>54&#"'>323267�ejFXCI:9&J!#\4be?OJR<?%S !%a
^P6o'AO527B_P6n'AP517B��� )%3267#".'#"&'53267.54>328'?%2<&6S"%"<(4A,O66O+"5�4*F10F,F)57n70K,,K0&MHV�##��YI�1
�33#.'
�S�]z	z��T).'��V�!###!�W�Y��0��V��5V##5".=3332=3V*dXWVd*Y�W�Ze2\9��9[2���3������!###"'53267>7!�Y�<8


:�5uj&WGH,Bq�N��'##3.'3b8�7;�5��		5�����R6#����#5##!#3#3%35#�E=�:�������&���/�/���?��!2+2654&+32654&#�VZ.+,<VK��<,6;L]>02@�/;&1.2;?��$"#�-�,$")
��&535323#+572654&+32654&#
2�VZ'QAVK��<,6;L]>02@�-�/;2-';?�-$"#�-�,$")?��+324&+32��s��i|>\SL?��ln�khUP��?B�!!#3#3B��Ƚ���/�/�'*�535#535#5!'ɽ��/�/�/�T(��3#"&54632.#"32675#	�%M1lr~r'F>!S]Q^+f�weew
/
]PM`?��#5##3353�;�;;�;�������#57'53¨77�77V�����v�'"'532653
(:B�-)��[>;?��#'#3>?3�E�/;;)}D��'���)��?D�33?;����0?�##333#467#�6W��V:�x?"�����_�T>��?��###33.=3�D�6D�7d?!����E�?��333#5467#?7�D6���Fb�T�!?��(��#"&5463232654&#"�mimijmhm��KNOIINOK�dyzccyxdQ]]QQ\\&��*".5467.=3326=3'2654&#"�2Q/3.&$;/330:$'-5cQ=::>=99"A.1<;*44)55)44*;
;1EL/4./22/.4?h�2+##32654&�[S#QE5;v;.CA:�B<#>&��.�(/))?��
2#'###32654&�VS:#�Ep\;}BE947�<=44����.�)(*$b�##5!#�;�[�}//;��#"&5332653�Y\VZ:==>9:�B[WG��59>0T�#.'#3673>7T{<Z
X;{=HR<U
H�T33�����409��648f&2#'##"&546?54&#"'>326=�@=*2,0>RU;&"2>3A2#,:f48�..114(	'�"-.5Og&"&=33>323267'>54&#"�?=)2,/?RU;&"1=3A2$,;39�./104( 
(�"-/$�g*"&546323733267#"&'#'26=4&#"�ANO@)3	. 4 7-+:...SSSU*�&,88
;AD9:?!g'283267#"'#"&=3&#"5>32>324&#"7>327�:'!2A Q$F@I�b 12 \(;2/@;")71=/��%'Nb'
(34P@ q/
D%/0-/"I)3\7l�!3>32#"&'##3"32654p4)AOOA)4)9c8+*:/.x$
SSST)ȭ;=;?@;z$Y�""&546323.=3#'#'26=4&#"�ANO@)3:/4 7-+:...SSSU	��8+,88
;AD9:?$Mg2#3267#"&546"3.�CL�:4!44$J]UD)/�(gPB79.
TPPZ,0+)2!Kg2#"&=3.#"5>3267�K]UECM�94"34#)+)0gTQOZPA 6:/
�)31+$g'#"3267#"&54675.54632.#"3�0b5'%79(JH.$K;&6-O6-�+7	.
6($"$)-*	.!g%"'73254&+53254&#"5632�C7,O6-&/d6'$=+LMH.$H*

-+6
07(%$"),$�Yg*2373#"'5326=467##"&546"326=4&�G&.MOM14M-3#ICLKL,0/.502g1+��EF10*
1WOM[-@;<?5:B98�{a#2#"&546v9
a��B��7U�3>?3#'#3ppC��Ey'99�
	m��� v�7+g!2#54#"#54#"#33>323>�;;8G3,8H4)9.	8Q<g8?��L63��L<8�B,67�^g%"&'532654#"#33>32	N:-9.
:!@@.�+M;9�B,8>��-3$fg#"&5463232654&#"fXJFZWKFZ��15512550�PWWPPWWP9BB9:@@g2#"&'532654#"'>zEU^E*+43e+7gLUYT	/@<v,&�ve
2#4&#"#46�QV=3784=SeZK:@@:KZ&v�
#"&533265vVRUS=4783�J[[J9BB97�lg"2#"&'##33>"32654&�@OOA(49/3 6,+9/..gSTRU��,-78;@F67B
��27#"&=#5?33#�	")=22"eeD();�DI)�3Za#'##"&=3326=Z.	<"?@:N:,a��+8=��M<8�;|J+53254&+5!|=C��TB=�\/�:;4H6)4*75)a!"&=3326=3326=3#'##"'#�;:8G3+9G5(:/8R=8>��M73��M=8���,6Ja
33>?3��=JJ=�B�23���
>e#3267#"&'#"'53267.54632�)4%#6
'"*>55>/}*+)* !B!+99+"E7�k�-74>32#"&'72654&+532654&#"7(D)BH6&1@W@#,_-6:%6/%*/!))��4>;8+2;6>B	��.*0/(.$%$+)��<a7533>53}};?7)9:4�zF�@9�X>me4|[�!-"&5467.54>32.#"'2654&'�FZ>8'8,1=1)0:8,H)144,298M@:G
%#*	*653A+:-,;91/8$���75.546753'5>54'�N^ZR8M_\P8<45s:7q��VJIW��VIIV���>78>?7o�}b"?'.#"5>32733267#"&/�N	
 Hu=�A
&&8u��*#���|) $m�3��vZ2#"&546#U

*9Zx��B7���72&#"#33>�
	)=9/5�1<0�B;'3��Z�%#'##"&=3326=Z.	<"?@:N:,�+8=��M<8���J�
33>?3��=JJ=�`B�23���7�kk-4>32#"&'72654&+532654&#"7(D)BH6&1@W@#,_-6:%6/%*/!))��4>;8+2;6>B	��.*0/(.$%$+)��"<�533>53}};?7)9:4�zF�@9�X?le4|.�b�4632#"'#72654#".RBLTXD8'^/3gY1�5RQYQMW
+U�=;}wa$��h5.546753'5>54'�N^ZR8M_\P8<45s:7q�VJIW��VIIV���>78>?7o�}�"7'.#"5>32733267#"&/�N	
 Hu=�A
&&8u��*#���|) $m�Q��o"'.%3267#"&'#"&5332653>32'.#"YP3O*)P7Bc#ZGjmXAAD;XF0Ec5\>C?I�[_M.4)6m[W��=BH7Y8%<mI5FDUQH���0�.:#"&'##.#"#>325332673#"'3>324#"3260zc?P?	32)
X21*P?dy[�UBAXHG��. Dx;E9h:F	";".���bgcij7����.;"&546323.=.#"#>325332673#"'#'#'26=4&#"dxyd>O32)
X21*
G
P1UEBYGGG
����.!
3S;E;k:F��H"0I]^dkq_`j����0&#"#>325#5754632.#"3#32673#"'#m	32)

^^\R 5*,+��
21*X;E�)h[E
;?#D�:F����"-6@7#>7533>323>32>73#5"&'#5.'#4#"%4#"U3/-G
U0~&]4[Z20/W=�AW@>XUnFA;~CUmNC>�@�/:
�I*)Z.,]hM/<��
��	
�YMG
	,ZV
��y""+2>73#5.'#5#>7533>"54W`b21+W.`^)X35*G
\&NGA�E"]hP7;	����8:	�I*)JMI%I���0".<&#"#>3233>32#"&'#32673#"&'#2>54&#"U
	32)HNAcyyd>Q21*X�1?GJRCAw;EHI#0����/4K:FI/6]<\n\^ck���",7&#"#>32533>32.#"32673#"'#U	32)H
R8#

)H+21*X�;E�b,@Q-Q6!:F���H"*7.#"#>3254>32.#"32673#"'#R	32)
(H00
&##
21*W�;ENBH
K,0|:F������"8"&'532654.'.#"#>7&54632.#"2673�8Q [/C<94
D3%$oZ1U%"J'69<N0&	2!t
P+$  2@
,DJF#")	+-?
&NP��S�4".=.#"#>325#5?33#32673#"&'3267�*G,32)	LM#4��21*/%*
4
HAj;E�*#r{D�:F81/C	"�$32673#"&'!!57&#"#>327!5��

21*)p#�x�32)+n��B�:F�D:�;E	�DU��0+"&'##4632&#"3632'2654&#"T4VFu{vKOwEO6phuttDIHGQJL
()G!st"Q*PG-	Q����JkcciWam`7ga353#5##p�99�9a������B*�!#".5467'57!5"32654&��O=�sGo@vhb���RJKRQLL@�M/oOu�:mNkxC~J��YPO]]OPY����77.5#5?33#373>32#4#"#3267#"&'$ZLM#4��X�M�E&bbWxZCX�*
4&=Kq:)8*#r{D��H=���]g��W�e^��Z��C	N$##575#535'53KP�PKKP�P?G�44�G�44���6"&=#53533#3267�OHMMXpp* 
&
UKbG��Ge1#G
�f"#*23##"&'###53533>"!.267!TZu86x`>QXKKHN1JE#F>DG��C"qrF��/4��F�I#0JLMGR�ghRZ`
��J"&=#5353!533#'26=!(jmGGYXGG/aHD<��@m[BF����FD8Z4GH7DD=B
��S$/".545#53>7#53!.'53#3#%326545!-Go@-60%��$=&=#�J6,���KRQL��
=qNF-GIEK85PEI;UFv��OddPU�:0�%1#"&'532=#"&'##33>32"32654�9<
0!&?P?XP?dy%"�UBAXHGA@EI4F
. D��";".��Km#�bgcijd�7�:>�$1"&546323.=33#"&'532=#'#'26=4&#"dxyd>OX,9<
0$
P1UEBYGGG
����.!
3�Q�@EI4FH"0I]^dkq_`j�:��&"&'532=##5754632.#"3#3|
05^^\R 5*,+��,9�I4F�)h[E
;?#D�u�@E7��"/<23733#"&'532=##"'5326=467##"&546"326=4&5UF�9<
0�u{vKOwEO6phuusCJIFQJL"()G�c�@EI4w>st"Q*QF-	Q����JkcciWan_U�:�"3>?33#"&'532=#'#3�	�gٲ:9<
0�=WWk4
���@EI4F�5��(�:��3#"&'532=#�,9<
05��P�@EI4F�U�:�"0"&'532=#4#"#4#"#33>323>323

04mNCWnQ>XG
U0~&]4[Z,9�I4FYZV��Yd^��I*)Z.,]h��@EU�:E"""&'532=#4#"#33>323�
04xYDXG
\3`b,9�I4FW�d^��I*)]h��@EU�0"%3#"&'532=#"&'##33>32"32>54&�9<
0!&>QXHNAcy%"�RCAX1?GA@EI4F
/4�I#0��Kn#�\^ck6]<\n(�:�""2.#"3#"&'532=#33>O#

)H+,9<
05H
R"Q-Q6։@EI4Fb,@3�:�":2.#"#"&'532=#"&'532654.'.546�1U%"J'69=33H&9<
0(8Q [/C<954J(o"F#(9+&:a@EI4DP+$  (8,DJ����.2.#"3#"&'532=##"&'532654>�&
�9<
0�$<$%
$=�	C%;�&�@EI4{~AI	C%;�BH�:�"&'532=#33>733a
0��^rr^��9�I4F��6126<�.�@E�:�3#"&'532=#'#37���,9<
0
��c¹d����Ɋ@EI4F����'�:�!#"&'532=!5!5���#9<
0�� ��B�n�@EI4F:�D.�:n!+6"&=#'##"&546?54&#"'>323326726=.1@#MDI`~�[:5*L!#`4b^,
#��DZOdM7�=J?L,*MRPW C4BV^�܇#EKN083-*7�:�"(5"&5463237332673267#"&=.'#'26=4&#"dxyd>OF
#1@&	P1UEBYGGG
����.!E�^�#E=J7%'"0I]^dkq_`j7�u�0=".=467##"&546323.=432.#"326726=4&#"/6 O>dyyd>Oy%
	$��UEBYGGG�IA?3
!.����.!
3O�I �A;%C	/]^dkq_`j7�:K"$+".54>32!32673267#"&="!.9LuA;kGEc5��YP3O*
#1@+L?I>
>{YX~D<mI5[_�#E=J>	�QHDU+�:!"5"&=#"&54>75.54632.#";#"32673267�1@+9sn!6 -7s[:S(!!E/ySF8I�R<8U!
#�=J>	YC(3	;1DJFL,&H\1(�#E!�:�"5"&=32654+532654&#"'632#"'3267�1@"]7<S�H:ES?;,C(Tg\m6/ 6!ov9/
#�=J�)2ZH%-&&F%ID19
	 4)C[	=#E3�:�"&-"&5#".=!.#"5>3233267267!j1@}^Dd5oYP3O*)P7KrCK
#��?I��>�=Jiv<mI5[_M<tU��#EQHDUN�:;�2#"&54633267#"&=#�A,
#1@5��1�#E=J?!�:�")2#"&'3267#"&=32654&#"'>�Gn?ApG

#1@B*PLNOAN":z_c|:8#E=J�
hdagI��:�(2.#"3267#"&=32654>�&
"8!
#1@
$=�	C%;�H=H5#E=J�%;�BHO�:�#33267#"&=#'##"&533265,
#1@%
\4abYwYE�1�#E=J?G*']f_���d^!�:�("&=32654&+57!5!#"&'3267�1@"]7<SLM>���t�e\ov5
#�=J�.42)A�IG�SFKeA#E	lg*2#"&'##54&#"5>323>"32654&�ANOA(3	.!4 7-+:...gTSRU)�',88
<@C:9@$#g"&54632.#"3267�FY]F2)g21,*PUYP,	y:>/	>g +2.#"632#"''67&546"32654&�2*g3=/5#4@(,]R,0#g,	y .(!&% '>YP�$f�*7#"&546327.''7&'"32654&�*KA-8WKGYRG"3+UI P7016612�	( #&qIUVNDCM":-!&�52,9:8%5!g%2#"'532654+532654#"'6�;H$.HML+=$'6d/&-6O,7g,)#$$(7/	6+.
*
��###5754632.#"3�X9==;6#
9X8��>7)I����a7"&'5326=#53533#	

00911/�+�*��*�-3$�Yg*2373#"'5326=467##"&546"326=4&�G&.MOM14M-3#ICLKL,0/.502g1+��EF10*
1WOM[-@;<?5:B95�Za47##"&=3326=3#!:"?@8N;+998=��N=8��8��2#"&546##5#5353U

[19009��*��*��5�a"&=33267�3/:
	3-��+�a#575'5�44�44a 
�

�
 �a##575#535'53�04�4004�4�*l

l*Y
  
Y�����&"&54632"&546;33#'26=#"U
H'1*/9112'
���' !(B��+<)+
7���
7"&53327�+892	�);�
:(���3#"&'532=#pL#�cRP,*�7a3379�B��,7�+g+2#"&'53254#"#54#"#33>323>�;;OG3,8H4)9.	8Q<g8?��T,"L63��L<8�B,65�)a$467##"'##"&=3326=3326=3#�8R=";:8G3+9G5(::	68>��M73��M=8��.���]g2#54#"#"'5326533>�>@8N;,3"	.	<g8?��M<8�;)
($m,7��g%3267#"&=4#"#33>32]#2N;,9.	<!>@�$(
);�M<8�B,8?7da3.=3#7F�6G�B��
1���
�$fg#"&54632'"3&267#fXJFZWKFZ�00�
[20��PWWPPWW*1/`�63i#���#5.5467533>54'N_\Q8M_\R66<67;6;6qeVIIV��VJIW��>67>?6m!�g0#"'3267#"&=32654&'.54632.#"K@1	+8<,'#339H;81H'227x/09();Q	'')-
*	''�����2.#"#"'5326546�	3"	3�
($�n;)
($�;)
��� 7"&'532=#".=#5?33#327�
+22"ee7�,=,'�DI)�:lP�a53533533##'##"&=3265#,:�911.	<"?@:N:,��*����*�+8=)%M;7va"&5467#5332654&'53#�FZ#!T�/15510�UEXQF-@,*
F4/<<0.L*,3QGQ5Oa#"&=3326=3OFIDG:S,(9�3DA7��M+"�5\g2#"&=3326=4&#"5>�-5�LG9+//,g(;Z�FK��:-.9V!-Ja
#'.'##Ƅ=JJ=�a���33�Ba	#57#533����#�)(��ba%"&=#57#53332675#0ɼ��	�);,#�)(�T$(
�Za!7>7#57#533>32+72654&#"mc���69("+0;?Z"!�	#�)(�0/%!)]
6	�.a#"&'532654&+57#5�,H,^O&=?&2>H;&��a'�;+@Q
0	5.3-$�-$_�"&546323.#"267#�PLHTQNI��/21._30�.{mn{zom{RPP��R\[S�Uw�#!2#"&546#.'52#"&546}Z*7,#"T#T
C�Cw�#!"&54632>73#"&54632��`6*K�7T"
T#��,2��'"54>54.54>54#"'>32,W
!3�	



		
�H`��"#"&=332>;�3RI&5=@4DX8�659>�l^��37#��{"���C?K�h^��#'73���"{�^K?C�lT��3'#���"{��K?C�hT��#'73��{"���C?K�&S��'77'I�"v��"vSL?@AL?@�&S��'77Bv"��v"��@?LA@?L���V��2&#"#533>:

*(!%< '!r�'����l���'���M�����N���32673#"'#5�1(&29MDd%��.#"/ENRA�\^��#.'#5>72$r�J<^�PW�Z;*gh\�26
//
&))���<
4#"5>32'>��//75,,"%�1;4.(I 6������]�������� �#363232654&'7#".#"#�>. #/()(0:0$7-)'-?m,
9*.7($�;[�8%32654&#52#"&54&#"3"&54632! 1>=31=! 1==21>�$!!1;10=91$""0;2/=:��t74&#"327#"&546325>?#	-9?12?78�,%!1:10<A?>f0H����^�&������]h�F'-82#3267#"'#"&54?54&#"'>326"34&326=W,3�D""@)#!+n(#,716p�* &F5+K-!A
"">"V �Kh�G'1#"'1#"54?54#"'63263232654&#"326=�=3B?Rp,3%)+971>�"$%""%%!M&), &�6:00@A2 95&--&&++*#!�nh�G('##"&54?54#"'63236?3'326=	$#(p,3 $)+X	
I,w_&), &l !A2LE��h#!��pg�'#"'53254&'7.54632.#"3267JC	!)3@1"GE!	�(
	53;5RP��hy�#"&5467&'72654&#"O:61=96;&,6$"##F"()287//6$(
�*" (J!)��hz�(7#"&546327.''7&'"3254&
4-'<50>911;37%""%H#�	K1994--3&
y$!&K$��po�(2373#"'5326=467##"&546"326=4&1 l5"#6#2/444!@%!"� �\   :53<+(Q#&	,&��hkF2.#"3275#53#"&5462 RE3[+0>FFRP;l59;5��l~�3>?3#'#3!M/bh/T''�H[{dO0��l�#3((l0��ldB5332(nlֹ��l�B53373#5<7##'#s5GH5(E!Dl֤�փ
�����lqF2#54#"#533>,,'6)( )F%)��4(&o���lrB53.=3#'^1}%1{l֬!|֬$	x��l�B
532#'#7254&+Nl'/#D.>:9;@l� ZUUr%G��lpC2#'#532654+'-0B,;4-6-(C \W%��haF$#"&'532654&'.54632.#"a4,%)##(2(&
"2#"&�  ��ld�"#54632.6(,$	
���)"��lbB	#57#533b��z���l����h�F'"&54632373327#"&'#'26=4&#"-66-$ 	$&(   h8778
�&%(+-&&+��h|� 3>32#"&'##3"32542
$,77,$
(D'(@R
8778
0s'*(*SQ��pw+4632#"&'72654&+532654&#"^<+.2&",<,A&)&!!'p43+'%"'%),jy)�	��hpF2#"&=3&#"5>32674@;0.5�K#$!F855<5,J�" ��lk�##5#5754632.#"3R<(**)%	

'<'��)%1��l_�0&#"#>325.#"#>32533273#"'3273#"'#
			(
	
	(�-`p,]�}(zF#"'#7&5463232654&#"z=4)-6<41>�"$%""%%!�6:Ue.5995&--&&++��p|�"2#"&'##33>"32654&-67,%
(!#%(   �7779X6%&(+/$%,��pQ2.#"#"'53265462
$
$��((�m(oB#'##"'#7&=3326=o!)1.:(5(B�Wn
��3(&o�^l�C!.'##'33>?33>?3#		+-B)!		++)
	!)C/�		y�s#
#
yy 
#s���hd�1<4632#"&74632#"&2#'##"&54?54&#"'>326=5
	

	
U	

	V#!+s)"+#-")|		



		


,H�!A

r ��hz�#/4632#"&74632#"&#"&5463232654&#"5
	

	
U	

	Z=4/?<41>�"$%""%%!|		



		


�6::65995&--&&++��ho�+4632#"&74632#"&#'##"&=3326=5				U	

	O!)+,(5(|		



		


0�%)��3(&o�����ip���e^��
#"&'33267�QHJK62.'9�<JI=)'�e^��
#"&'33267�QHJK62.'9�<JI=)'��q4�2#"&546���&��!'3!73���dBFFBڪnn������������'O��.#"#>32
4MZ,DxNA
��b�U�%(+UP H=�]����/.#"56323267#"&.#"56323267#"&")"2' $(#1' ")!3' $("2'Q:$
:#v:$
9$��NP.'5>73E6886.,N
D
3

2�H���%#5>7.'5#.'53>73�5995.,{
D3


3(
D3

2@BB@B@����~�&&����.���!&F�c��aT�&'�����U��0�&G���a�PT�&'�e��U�P0�&G�l��a�mT�&'����U�m0�&G�����=�Y�&('|x���7���&H'|�x���a��&)����7���&I���a�P��&)����7�P�&I�N��a�m��&)�����7�m�&I�h�a���'#"'532654&'7"+324&+3 �JJ 	$&5&)
��l�V��$3���ua"�057V�P�s��;(Ώ���7��*7"&546323.=3#'##"'532654&'?26=4&#"dxyd>OXG
0!$3JJ 	$&5&&UEBYGGG
����.!
3�H&
5(&057LI]^dkq_`j��a�8��&)�����7�8�&I�S��a�+
.'535!!!!!!!>:1i8�)$�q���#��5�12
"GsGG���O�N�7��q
&-.'535!2!3267#".54>"!.#:1i8�)�Ec5��YP3O*)P7LuA;kF?I>�12
"GsGGK<mI5[_M>{YX~DHQHDUa�+
>73#5!!!!!!!�8j29:S)&�q���#��5�G"
21sGG���O�N�7��q
&->73#5!2!3267#".54>"!.�8j29:S)�Ec5��YP3O*)P7LuA;kF?I>�G"
21sGGK<mI5[_M>{YX~DHQHDU��a�8��&*�[���7�8"&J�\���a�H��&*�L��7�H"&J�M��a���&*'|��r���7��&J&�^|���a��&+�������&K���=���W&,�����7��&L�l��a��&-����O�&M�'�a�P��&-����U�P�&M�`��a��&-lR������&Ml�a�%���&-|����&M|	��a�G��&-����U�G�&M�q����Ha�&.������H:�&N�����=
".>73#"&546323"&54632!57'5!t9i2:;(���TTTT�G"
21}��4;44����g
"&>73#"&546323"&54632#3K9i2:;(�EXX�G"
21}����ak�&0x����L
�&Px$�a�Pk�&0�t��U�P
�&P�5��a�mk�&0�����U�m
�&P�O���a�P��&1�V��L�P��&Q�������P�W&1'�V��������P�&Q'������a�m��&1�p�����m�&Q�����a�8��&1�[�����8*�&Q������a*�&2xb���UV�&Rx{��a*�&2�k���UV�&R����a�P*�&2����U�PV"&R���a��&3�!���U�&S����a�P��&3����U�P"&S�_��a�m��&3�����U�m"&S�y���a�8��&3�����U�8"&S�d��=���#
 0<>73#>3232673#".#"#".54>3232654&#"F8j29:g1+2.20,2.�K�lo�HH�pk�K��ryzppyys�>"
--�5=4>�Wo�\\�on�\[�o�������7��'q
 .:>73#>3232673#".#"#".5463232654&#"�8j29:g1+2.20,2.m�sGo@�sIo?�kKRQLLRRJ�>"
--�5=4>����A}Y��A{Y_oo__ll=���-=I"&546323"&54632>3232673#".#"#".54>3232654&#")���4/50-3/51�K�lo�HH�pk�K��ryzppyys��5=4>�Wo�\\�on�\[�o�������7��'R-;G"&546323"&54632>3232673#".#"#".5463232654&#"����4/50-3/51|�sGo@�sIo?�kKRQLLRRJ��5=4>����A}Y��A{Y_oo__ll=���+
*.'535!#".54>3232654&#"�:1i8�)�K�lo�HH�pk�K��ryzppyys�12
"GsGG�?o�\\�on�\[�o�������7��'q
(.'535!#".5463232654&#"2:1i8�)g�sGo@�sIo?�kKRQLLRRJ�12
"GsGG����A}Y��A{Y_oo__ll=���+
*>73#5!#".54>3232654&#"@8j
19:S)�K�lo�HH�pk�K��ryzppyys�G"
21sGG�?o�\\�on�\[�o�������7��'q
(>73#5!#".5463232654&#"�8j29:S)j�sGo@�sIo?�kKRQLLRRJ�G"
21sGG����A}Y��A{Y_oo__ll��a*�&5x����U�0�&Ux���a*�&5�����U�0�&U����a_�&7�����U��&W����a�P_�&7�r��I�P�"&W����a�P_W&7'�r�z���I�P��&W'���3��a�m_�&7�������m�"&W�����3����&8�����3����&X����3�P��&8�+��3�P�"&X�3����A>73#'"&54632#"&'532654.'.54>32.#"#"j29:;�u<f"$k9PQIA[]:gC;b(%W/CDD:?W-47
99��_jV>5#0)!`S9Q,M9/$0&5J3����A>73#'"&54632#"&'532654.'.54632.#"�#"j29:;tb8Q [/C<954J(oZ1U%"J'69=33H&j47
99�NPP+$  (8,DJF#(93���H"&54632.'53>73#"&'532654.'.54>32.#"A
,0<88>1-��u<f"$k9PQIA[]:gC;b(%W/CDD:?W-��54
00
45��_jV>5#0)!`S9Q,M9/$0&5J3���RH"&54632.'53>73#"&'532654.'.54632.#"�A
,0<88>1-�tb8Q [/C<954J(oZ1U%"J'69=33H&��54
00
45�6NPP+$  (8,DJF#(9��3�P��&8'�+�����3�P��&X'�����
!�&9�������S\&Y�?{��
�P!�&9�@���PS�&Y���
�m!�&9�Z����mk�&Y����
�8!�&9�E����8�&Y����Z�Q��&:lK���O�Q&Zl���Z�H��&:����O�H&Z�F��Z�8��&:�����O�8&Z�U��Z���#
 3>73#>3232673#".#"#"&5332653-8j29:g1+2.20,2.�<{_��Z]^aWY�>"
--�5=4>��JwE�w�1W`gQ�O��q
 4>73#>3232673#".#"#'##"&533265�8j29:g1+2.20,2.UH
\4abYwYE�>"
--�5=4>E��G*']f_���d^Z���.2#"&54632#"&546!5#"&5332653�K���<{_��Z]^aWY�GG��JwE�w�1W`gQ�O��R/2#"&54632#"&546!5#'##"&533265��K��tH
\4abYwYER�GG���G*']f_���d^��X�&;�P�����&[����PX�&;�U���P�&[�&����&<E'����&\E�����&<xt����&\x,����&<l�����&\lh����&<�v����&\�.���P��&<�����P&\����F�&=�������&]����F�&=l�����&]l���6�&>��������&^����&�&?�Q���'��&_���&�P�&?�S��'�P�&_���&�m�&?�b���'�m�&_�/���U�m�&M�y�����SU&Yl�y{��1&\������1&^�i��.��7&F����Uj�&C���j�754632.#"7#QaP2*)/j �X2�-�gUE
4?R;8L�Zv
j�3>32.#"3###
H`P2*)/��XHCfTE
3>H��Z����(2#"&'532654&+57.#"#4>hct�?b84mX4]))a,UJVV>�F:\TY:x�WK�1Z@?a8RKD@CA�&)gQ�2�JwE��-���o���P~�&&�n��.�P�!&F�C��~�&&�c���.���5&F�>~�	",>73#.'#5>73'!#3	.'3�X42
441:\:KV��U[Q��
Q�n* 
3_))A""A�����3*-;�.��,	6A>73#.'#5>732#'##"&546?54&#"'>326=�X42
441:\:�b^@#MDI`~�[:5*L!#`NdM7+DZ�* 
3_))A""A=V^��L,*MRPW C4B��83-*KN0~�	",.'53>73#.'#'!#3	.'3�3W':]:2451|V��U[Q��
Q�b3
 +TA""A))�����3*-;����,	6A.'53>73#.'#2#'##"&546?54&#"'>326=w3W':]:2451�b^@#MDI`~�[:5*L!#`NdM7+DZ�3
 +TA""A))=V^��L,*MRPW C4B��83-*KN0~$,62#'>54&#"56#.'#5>7'!#3	.'3�.2$)C:1441:V��U[Q��
Q�"#'?
)}"A))A"�q���3*-;�.��g$@K2#'>54&#"56#.'#5>72#'##"&546?54&#"'>326=�.2$)C:1441:4b^@#MDI`~�[:5*L!#`NdM7+DZg"#'?
)}"A))A"�V^��L,*MRPW C4B��83-*KN0~%-7#".#"#>323267#&'#5>7'!#3	.'3�/).*-/(.+D;03560;V��U[Q��
Q�.>/=�"@!/(@"�s���3*-;�.���s%AL#".#"#>323267#&'#5>72#'##"&546?54&#"'>326=�/).*-/(.+D;03560;6b^@#MDI`~�[:5*L!#`NdM7+DZs.>/=�"@!/(@"�V^��L,*MRPW C4B��83-*KN0���P~�&&'�n�o���.�P��&F&�J�=~�	)#5>73#"&'33267'!#3	.'3�41W JFGG5.+&4�V��U[Q��
Q��5,k<GF=)'�z���3*-;�.���L	3>#5>73#"&'332672#'##"&546?54&#"'>326=�41W JFGG5.+&4Vb^@#MDI`~�[:5*L!#`NdM7+DZB5,k<GF=)'�V^��L,*MRPW C4B��83-*KN0~�	)#.'5#"&'33267'!#3	.'305
IGGF5.+&4�V��U[Q��
Q��,5
k<GF=)(�z���3*-;�.���L	3>#.'5#"&'332672#'##"&546?54&#"'>326=�05
IGGF5.+&4Ub^@#MDI`~�[:5*L!#`NdM7+DZL,5
k<GF=)(�V^��L,*MRPW C4B��83-*KN0~"*42#'>54&#"56#"&'33267'!#3	.'3)-1$)�IGGF5.+&4�V��U[Q��
Q�"#-
'�<GF=)(�z���3*-;�.���n">I2#'>54&#"56#"&'332672#'##"&546?54&#"'>326=-1$)�IGGF5.+&4Yb^@#MDI`~�[:5*L!#`NdM7+DZn"#-
'�<GF=)(�V^��L,*MRPW C4B��83-*KN0~#+5#".#"#>323267#"&'33267'!#3	.'3�/).*-/(.+IGGF5.+&4�V��U[Q��
Q�.</;�;FD=('�|���3*-;�.���q#?J#".#"#>323267#"&'332672#'##"&546?54&#"'>326=�/).*-/(.+IGGF5.+&4Ub^@#MDI`~�[:5*L!#`NdM7+DZq.</;�;FD=('�V^��L,*MRPW C4B��83-*KN0���P~�&&'���n��.�P��&F&�Z�2��a�P��&*�V��7�P"&J�W��a��&*�V�7��5,3#'>54&#"56322!3267#".54>"!.�.#6$+%
%<BrEc5��YP3O*)P7LuA;kF?I>�&)5U4,�<mI5[_M>{YX~DHQHDU��a��&*�Q���7���&J�=a0�	&>73#.'#5>73!!!!!!�X42
441:\:/�q���#��5n* 
3_))A""A���O�N�7��),	29>73#.'#5>732!3267#".54>"!.�X42
441:\:�Ec5��YP3O*)P7LuA;kF?I>�* 
3_))A""A<<mI5[_M>{YX~DHQHDU&��	&.'53>73#.'#!!!!!!�3W':]:2451\�q���#��5b3
 +TA""A))���O�N���,	29.'53>73#.'#2!3267#".54>"!.�3W':]:2451�Ec5��YP3O*)P7LuA;kF?I>�3
 +TA""A))<<mI5[_M>{YX~DHQHDUa$02#'>54&#"56#.'#5>7!!!!!!�.2$)C:1441:��q���#��5"#'?
)}"A))A"�q�O�N�7��	g$<C2#'>54&#"56#.'#5>72!3267#".54>"!.�.2$)C:1441:5Ec5��YP3O*)P7LuA;kF?I>g"#'?
)}"A))A"�<mI5[_M>{YX~DHQHDUa�%1#".#"#>323267#&'#5>7!!!!!!�/).*-/(.+D;03560;��q���#��5.>/=�"@!/(@"�s�O�N�7��s%=D#".#"#>323267#&'#5>72!3267#".54>"!.�/).*-/(.+D;03560;2Ec5��YP3O*)P7LuA;kF?I>s.>/=�"@!/(@"�<mI5[_M>{YX~DHQHDU��a�P��&*'�V�b���7�P�&J&�N�W(*� #'>54&#"5632!57'5!.#6$+%
%<B��TTTT&)5U4,�R4;44��<�5#'>54&#"5632#3�.#6$+%
%<BDXX�&)5U4,����(�P*�&.����N�P��&N����=�P��&4����7�P'"&T�W=����$0#'>54&#"5632#".54>3232654&#"�.#6$+%
%<B�K�lo�HH�pk�K��ryzppyys&)5U4,��o�\\�on�\[�o�������7��'5".#'>54&#"5632#".5463232654&#"�.#6$+%
%<B��sGo@�sIo?�kKRQLLRRJ�&)5U4,���A}Y��A{Y_oo__ll=����	*6>73#.'#5>73#".54>3232654&#"�X42
441:\:�K�lo�HH�pk�K��ryzppyysn* 
3_))A""A�co�\\�on�\[�o�������7��4,	(4>73#.'#5>73#".5463232654&#"�X42
441:\:b�sGo@�sIo?�kKRQLLRRJ�* 
3_))A""A����A}Y��A{Y_oo__ll=����	*6.'53>73#.'##".54>3232654&#"�3W':]:2451�K�lo�HH�pk�K��ryzppyysb3
 +TA""A))�co�\\�on�\[�o�������)��',	(4.'53>73#.'##".5463232654&#"�3W':]:2451��sGo@�sIo?�kKRQLLRRJ�3
 +TA""A))����A}Y��A{Y_oo__ll=���$4@2#'>54&#"56#.'#5>7#".54>3232654&#".2$)C:1441:yK�lo�HH�pk�K��ryzppyys"#'?
)}"A))A"��o�\\�on�\[�o�������7��'g$2>2#'>54&#"56#.'#5>7#".5463232654&#"�.2$)C:1441:(�sGo@�sIo?�kKRQLLRRJg"#'?
)}"A))A"�#��A}Y��A{Y_oo__ll=���%5A#".#"#>323267#&'#5>7#".54>3232654&#"$/).*-/(.+D;03560;wK�lo�HH�pk�K��ryzppyys.>/=�"@!/(@"��o�\\�on�\[�o�������7��'s%3?#".#"#>323267#&'#5>7#".5463232654&#"�/).*-/(.+D;03560;&�sGo@�sIo?�kKRQLLRRJs.>/=�"@!/(@"�%��A}Y��A{Y_oo__ll��=�P��&4'�������7�P'�&T'�W�`��=��%�&dx#���7����&ex���=��%�&dE����7����&eE���=��%�&d�����7���5&e�T��=��%�&d�����7����&e�O��=�P%�&d����7�P�j&e�X��Z�P��&:����O�P&Z�PZ����'#'>54&#"5632#"&5332653�.#6$+%
%<B�<{_��Z]^aWY&)5U4,�NJwE�w�1W`gQ�O��5(#'>54&#"5632#'##"&533265�.#6$+%
%<BxH
\4abYwYE�&)5U4,��G*']f_���d^��Z��2�&sx
���O����&tx���Z��2�&sE����O����&tE�Z��2�2#'>54&#"5632>53#"&5332>53�.#6$+%
%<B�1]%H=8w`��Z_`AO$Y&)5U4,��L;/Q7��JwE�w�0V`/S5�O���52#'>54&#"5632#'##"&5332653>53�.#6$+%
%<B$$G<H
[3bcYwYEX0]�&)5U4,�/T8�bG*']f^���d^;M:��Z��2�&s�����O����&t�U��Z�P2�&s����O�P�k&t�O��6�&>Eq������&^EU���P6�&>�D����&^����6�#'>54&#"56323#3�.#6$+%
%<Bn�a�Z�b&)5U4,��_�K�����5/#'>54&#"563233>73#"&'5326?j.#6$+%
%<B��^tm_�YN$
.9�&)5U4,��(I!Q)0��LZF4+G��6�&>�;������&^�a��	!3!!3TZ8�{Z��P�6��3##53533533###�XQQX�XPPX�HIggggI��H=����%32654&#"5>32#".54>7�Mm9/`Ige^K-.#Lo=B�f_�KH|L�\�bDpBpX\`F	?uPM�LS�\r�j5��"�#32654&#"5>32#".54>7�Kf=NQLLGB &bu�rLp=J�j�(jvw5`v^QP_F�ps�EVg��/
��\�""&54>733>73'32>7�7;;gA�a�
	�^�*FIY&0"5T1
>13M2���7C�Ue,qHG2���"&546733673'32>7b0<se�_{	{^�)Zi$%IW�:3MX�<2<3S��lhrF=5��7��Y&lO���7��Y&l����7��Y&l&OP{���7��Y&l&�,{���7��Y&l&OYB���7��Y&l&�6B���7��Y�&l'O��C��7��Y�&l'���D��
��&&7O����
��&&A�����
x�'&�&O��{����
x�'&�&���{����
d�'&�&O��B����
d�'&�&���B����
��'&-'OS�$���
��'&.'�/�#���-���&pO���-���&p�k��-���&p&O2{���-���&p&�{���-���&p&O;B���-���&p&�B���
��'*�O���
��'*�����
I�'*Y&O��{����
I�'*Y&���{����
5�'*E&O��B����
5�'*E&���B����U�&rO���U�&r�\��L�&r&O#{���K�&r&��{���U�&r&O,B���U�&r&�	B���>��&r'O����?��&r&�d����
�'-�O���
#�'-�����
��'-Y&O��{����
��'-Y&���{����
��'-E&O��B����
��'-E&���B����
�'-�'OS�$���
�'-�'�/�#���B��6&tO��8��6&t�������6&t&O�{T�����6&t&��{T����6&t&O�B^����6&t&��B^�����=�&t&O���������>�&t&��������
��'.�O���
��'.�����
��'.m&O��{����
��'.m&���{����
��'.Y&O��B����
��'.Y&���B����
��'.�'OS�$���
��'.�'�/�#���7��'&TO���7��'&T����7��'&T&O\{���7��'&T&�8{���7��'&T&OeB��7��'&T&�BB��
��4�&4dO����
��>�&4n�����
����'4'&O��{����
����'4'&���{����
����'4&O��B����
����'4&���B����O��&�O���O��&�����O��&�&OG{���O��&�&�#{���O��&�&OPB���O��&�&�-B���O���&�'O��:��O���&�'���;��
�'>�����
��'>�&���{����
��'>w&���B����
��'>�'�/�#���A���&�O#��A���&�����A���&�'O�{^��A���&�'��{^��A���&�'O�Bh��A���&�'��Bh��A����&�'O!����A����&�'������
"�&dnO����
,�&dx�����
��'d1&O��{����
��'d1&���{����
��'d&O��B����
��'d&���B����
�'dd'OS�$���
�'de'�/�#���7��Y&l{{��7��Y&lB���-���&p{]��-���&pB���U�&r{N��U�&rB�����6&t{���R��6&tB<��7��'&T{���7��'&TB���O��&�{r��O��&�B���A���&�{���A���&�BF��7�Y&l'O�<���7�Y&l'��<���7�Y&l&OP'{�<���7�Y&l&�,'{�<���7�Y&l&OY'B�<���7�Y&l&�6'B�<���7�Y�&l'O�'�C�<���7�Y�&l'��'�D�<���
���&&7&O��<��
���&&A&���<��
�x�'&�&O��'{���<���
�x�'&�&���'{���<���
�d�'&�&O��'B���<���
�d�'&�&���'B���<���
���'&-'OS�$&���<���
���'&.'�/�#&���<���U�&r'O�<��U�&r&�\<��L�&r&O#'{�<��K�&r&��'{�<��U�&r&O,'B�<��U�&r&�	'B�<��>��&r'O�'��<��?��&r&�d'��<��
��'-�&O��<���
�#�'-�&���<���
���'-Y&O��'{���<P��
���'-Y&���'{���<P��
���'-E&O��'B���<<��
���'-E&���'B���<<��
��'-�'OS�$&���<���
��'-�'�/�#&���<���A��&�'O#<��A��&�'��<��A��&�'O�'{^<��A��&�'��'{^<��A��&�'O�'Bh<��A��&�'��'Bh<��A���&�'O!'���<��A���&�'��'���<��
�"�&dn&O��<[��
�,�&dx&���<e��
���'d1&O��'{���<��
���'d1&���'{���<��
���'d&O��'B���<
��
���'d&���'B���<
��
��'dd'OS�$&���<Q��
��'de'�/�#&���<R��7��Y�&l�_��7��Y�&l�f��7�Y&l&{{<���7�Y"&l<���7�Y&l'B�<���7��Y�&l�C��7�Y�&l&�C<���~�&&�z���~W&&�����
��&&Y{����
��&&EB�����~�&&<���)[�OR��6P"&=33267�OHX* 
&
UK��1#G)[�'>54&#"5>32m(
,3+[8#)#0��(^�����(w�y'��l���U�&r&{N<��U�"&r<��U�&r'B�<��>��&r���>��&r&�<��
��'*�{���
��'*�B���
;�'-�{���
'�'-�B���a���&-<���)[c&O{���)[d&OB���([��&Oq�����6�&t������6�&t��������6&ty�������Y&tC�g�����=�&t�������=y&t'����l�d��E�&.������>W&.������
��'.�{���
��'.�B���L[�&�{���L[�&�B���([��&�M���O���&��V��O���&��]��A��&�y���O��&�C���F�!&|O���F�!&|����O���&��:��O��y&�'�:�l���6�&>�W���6W&>�^���
 �'>�{���
�'>�B���
��'5�����^�'53'"&546323"&54632FUj&��^�
����^�C(^�'53�_j0^�
���A��&�'{�<��A��&�<��A��&�'BF<��A����&�����A���&�'��<��
��V�'4�{���
��B�&4rB����
D�'d�{���
0�&d|B�������&d<���(^�BL[�.54632.#"�+4+
[0#)#8��{��
3'7'7#�@ll@y��=kk=�H�+�{�
#'73yAmmA���=kk=�!��(�3��(�3(A�5!(�AII(��375!(��NN(��375!(��NN��(��3�������&a�an���"���!5!!5!��a��a�Z@�@���	>73#0A	_�5�5&WU#���	#>73�
1A
^�4�5&WU#����t������	#.'7r	A0�#UW&5�4�[�#'>7##'>7[_0x^/�:�456:�456�[�	#>73#>73[
1B
^�
1@
^�5�5&WU#5�5&WU#���nt����[�#.'7##.'7)A0Z@/�4�:6�44�:6�4A��'#5'37��d��d���
�W��<��%7'#75'75'37'��e����e���U��U��U��U�M�+�4632#"&M@//@@//@mD88DB::D�H7D�%������8yt��H���y'��H���y&'��H��:���{�Z3#迅�'�H�,�{Z#53���'�!���{t�#53#_�_�b������{t�#53#3#_�_�b�'�&�����{t�#535#53#_���_�b&�'��1��h�%1;E2#"&546#"32542#"&546!2#"&546"3254!"3254�JLIMGKF�tM���&##&MhIMIMGKF�IMIMGKF��&##&M
&##&M�ujjwwjju
�6�4QPPR���ujjwwjjuujjwwjju?PPQQ��PPQQ��	-����(6DNXb2#"&546#"32542#".546!2#".546!2#".546"3254!"3254!"3254�6D MMHNJ�tK��~&##&L15D LM5CK��6D MM4CK�6D MM4CK�&##&L��&##&L&##&L�:dAmtwjkt
�6�8NOOP���:e@mt;f@ls:e@mt;f@ls:e@mt;f@lsCMPOO��MPOO��MPOO��'��3#�Z�:����'���'���'�b�3!333��Z��f�Z�v�Z�������������#@�:��������d�'���������'�E'����{Q3#'�(�<vy�A����(8�7'(�?��?��$��%�'8�'7'e��>����
�%��2���#/;"&54632'	7		"&54632!"&54632"&54632���.2��.45.��2.���[��^    ��.65/��4.���.6��    ��H����&�����)'>32#767>54&'"&54632�&(0Z4_l5(!J=
(%C5!�	9[S-A7#2(�/-58�_  ������:s�J��3267#"'@&�JH�&*_��bPNNP��FJ632.#"a��a)&�JI�&\��PNNP�g�3#'>��<_f���������sM�''��=Q�=��(�3�A@�	#@�LK��6�O�b+�#3#3#3+�܍����hE��D���b��53#53#53�����HJFHH������=�'$�$����^�&$���H����&$�$3!5!�%�}���C7�^��L�!2#"&'##^Bc73\>':fw.m`[l.�p?��6&'%"&5463!'3#	glqk�cc&u��u�CmX&I7!2#'3#Xkqlg�cc&�u��uCm��)�9���,��&#"&5463273#.�#%%#q^	B0�$  $&�a#UW&5����J&����)�8��'���m�4632#"&%#4632#"&  e��M&  �   S�6�i   O��u2673#".#"#>32�8?4
oK9zyt37@4nK;ywr3%MN$4%MO$�J��'632.#"@)b��_*&�HJ����PNN���%#''5'7#53'75373�~-~?~,~��~,~?,~��~,~��-~?,��,5����432#"432#"432#"]9::9��9::9(9::9�<<;�<<;�<<<��'��&�'��'�T��4���432#"432#"%432#"432#"\9::9��9::9Z9::9��9::9�<<;�<<;;<<;�<<<5���'432#"%432#"432#"432#"%432#"59::9`9::9��9::9��9::9W9::9�<<;;<<;�<<<��<<<<<<<5����4632#"&4632#"&5    �   ��!! 5��Y�#/"&54632"&54632!"&54632"&54632C  �  �  �  q    �� !!  !! �� !! '����#/;!5!3!!"&54632!"&54632"&54632!"&54632h��ALB����  �  �&  �  TLS��L��" !!  !! �4!!!!H����#4632#"&4632#"&4632#"&H$%%$$%%$$%%$w%%$  �%%$  �%%$  H����#/"&54632"&54632"&54632"&54632�$$$$$$$$$$$$$$$$M $&&$ � $&&$ � $&&$ � $&&$ ���{t�#535#53#3#___�___�b&�''�&�����{t�#53#35#_�_b���b��������{u�'3`�`�����}���{u�#7#`uu`�b������{u�
'77'`uu`>>>�sYkkY���777���{t�
#535#533#___�__�b&�'�&���JT"&54632'254#"�MNJQMOISTT+''�sljsrkju?��OQOP3v�2#"&546#U

*9�x��B
�UO
##5#533'4673U=K��I=� P}``4��]81u�@L#>32#"&'532654&#"'7+�	CZTR FE-550%L7mD@FM

C(+&*��LT)2.#"3>32#"&54>"32654&�#"6>6);JRED]/T
+2(&/)T;)F*F@FP_a/ZH+�-/-.&+�CL#5!O��'��p<1���ET$12#"&5467.54>">54&32654&'�7P*'/SBIN- !&?$ $(%$/!"()*(-&T57%07)8C@8)6+&$17"!�($$&
�IV'2#"'532>7##"&546"32654&�D]-TB% 7<
3(@JRE$/'*+3-V\c/[I,<,G(H@AS9,,&.-*;#�/�5#53533#�ll4ll�o4oo4o#9/m5!#944#/�5!5!#��q33p44>s��
4673#.>/-B/100B+1S�46�KI�70�s��
#>54&'3�0,B1/1/B-/�T�47�IK�64�7]g2#54#"#33>�>@8N;,9.	<g8?��M<8�B,���vJ2�����%�~�*}�����~33v�����vA3w����
�~U-������u@*������vL2������~C*������vE2������vI4�����#��/������#%/Y	����#��/�	����>�K�c	�����K�c	����8�&72#'##"&546?54&#"'>326=�@=*2,0>RU;&"2>3A2#,:�48�..114(	'�"-.$��M�72#3267#"&546"3.�CL�:4!44$J]UD)/�(�PB79.
TPPZ,0+)2$��f�%#"&5463232654&#"fXJFZWKFZ��15512550APWWPPWWP9BB9:@@��L�7'373#'#�xAYYAyA_`@D�zz����!��K�72#"&=3.#"5>3267�K]UECM�94"34#)+)0�TQOZPA 6:/
�)31+7��]h73>32#54#"#3p:"?@8N;,99�8>��M=8��7��Uh73>?3#'#3ppC��Ey'99z
	m��� v�7��ph#3p99`�7��+�!%2#54#"#54#"#33>323>�;;8G3,8H4)9.	8Q<�8?��L63��L<8�B,67��]�72#54#"#33>�>@8N;,9.	<�8?��M<8�B,7�l�"72#"&'##33>"32654&�@OOA(49/3 6,+9/..�STRU��,-78;@F67B!���$#"&'532654&'.54632.#"K@%4<,'#339H;81H'227/0	0	'')-
*	''
���+27#"&=#5?33#�	")=22"ee;();�DI)�$� 2.#"35!#3#3!5"&54>�$G  5;DFO������xt1_�@dXZW�B�B�C�uKs@3��)�%.4%&'#7.546?3273.'267##&#")+#?78vo?*?!#
a)J$$M5?�

]"*2:A,!p�)�Zy�[SWb
H�"JX��5�tRc@8���.".54>32.#"33>32.#">7Xc>C�`6^'$J0>^3I9G;& 
+@3F$L
Z�pl�]HG�Zr�h8"KD8�J-�35#53!!!!3#�UU����痗�AO�OnA�!�&2.#"3#3#!!5>5#535#53546P8W"I)5?����&��	/5aaaa_�E:BXANBACPJ
JFBNABguU��V�&2#4#"#5#54#"#33>32736�[ZWmNCW�F�nQ>XG
U0t*[F?'"]h��YZV�ض���d^��I*)Mň
2�#'+3#535#53533533#3###3'#3'#3'#3'#XNNNNh_vONNNNi_v**^B�C__*@R@����@R@�����|��RRR��tL����,2+##32654&3#3267#"&=#5?҅v1tfW�)\[RHnn)
+ 7@MN�nd<g?���M��CNEDxhC�%(A
CF�($_S���?2####32654&2.#"#"&'532654&'.546�ni0�_}[U�@BB8<i+@ 1"'%6#6R[%CJ0($5#7Y�ef8L.
��'���L��ECF=\C$)*9,FWQ,#)*9,BL
�� 3#53333333###3'7#7#�;J?7P3S:\<R1O5=H6Z<];FF$� <G=K@?��?��?��@��K�������U��
332#4&+332653+U�nhQKD�eQ�LMQ.dQ��|e��2NO�{�1QM�Ag;��7�f^�&�Du��/�02.#"3#3#3267#"&'#53&45465#53>|2X)%K'�%���aR'OK0y�PHHO��H�A

	AU]
N
�vA
A{�<�3#533333##fWWU�b�β�e�8NB:��:��B��N>��*�35'75'75#5!#77�u$�u$���u$�u$��P5idP5i�OO�Q5ieQ5i����/<3332>54.#"'>32#%>32#"&'##2654&#".{Vk	f�G:kJ+`$$n:e�Qg�t�]QPL*XF1

T�-C$"(4
(B�
Z�bFf9GL�^��e�PcR>.[=
6-�,D;#(384��$1"'532654&''#7.54632>54&#"n$''$'3rS>R�PU,%M>>I68-1R>(!�
K,*�wȆz	��[�1URLE=�Yf�WJQKLw,(*6IR
2�#+123#3#+##535#535#3&#3>54#326�drKACQui8SWWWW�F�$5���3;N�JD6		

6=Q�w6Y6�JDDzY
|D =����!'5.54>753.'3#>7u��I�c@:h-"$Y0�3h>��-`Mhr�*<PG	âf�_&#N��F�MzM
:���
_�"3#3##'##7#537#533.#3^`��cLU_S�R_UKb�`.iB����@R@����@R@b$U01T�R���9"&547#53>7!5!>54&#"'>323#!!3267"u~/TCI8��~@D1W"&n4eu7WDJ<	:�{�9k$"r
^_&@!@/5OSU)@!@tQ=��Y�".'>7#5.54>753�2\%$G*)J$"G.@��E�`@@^lee�L��N

GG
Šd�a	&u�xy���L�3#5?33733#3267#"&5#aLP 4� 5��O*5GO��*{{{{F��aD
K[7�-����IR[g5.546323>323>32654.'.54>32.#"#5#"'#5.''54&#"7"5432754&#"q*1 "".B1.0M*O63S2=iB4a1.R)>N(H/8W2QO6"&6 >e/
�%!> 6+")Oy;&+31<6!K*5'2L;<U-H:5(0"3K:F`SIFK	c�%)%96=IY1?(/�!!##5!#�-Z���N���NNO��!53267#53.+5!#3#�PU�
UL��0	��aP�J,.<@82@@'C@IQ�����"&'5755753772>53�*kkkkV����[j.V#O~F%A$O$A$��GAGOG@H��K~NE�d:����*5F7'7&=#"&54632!2#"&/'3267#"&'4&#";3265.#!77�%YNaI8>LO^*10"2UJV[L >%9Fdz&"%+.}!AN��jFP^/K9InAL8DWh5U1>O#PRJK?	NSO�17#)�1$0@p& ZOK;��74>753#54.'##;<�lXd�BY/]FXK]*Y�z�K��I�{��cv7��8va�
�35#535#5332+3#2654&+aWWWW����T��G[eTYZ�AYL\jefsYA�n<NDB��7H/)73.54675363253&'#5&#"#5;!7�Mfqm<<)')'<<�I�Z���N(�p��offmM����4�W�MNa��/"+433533253#5"+#52654&+32654&#a\@"@?A=:(?%OF@7@ZR=KRNhSBDX�eehrOE?S&F8Nckbbb�;:;3�K��J<8E�����h��p ����(A2#'#"&54?54&#"'>#326="&54632.#"3267�AB/8&/8�8*2A�LK���<*3-JEZ]F4+Y+*/-�6;�*12c!1
�6ʬ/(��SX\R	7s7:
<
 ��w�(M2#'#"&54?54&#"'>#326=#"&'532654&'.54632.#"�AB/8&/8�8*2A�LK���<*3-��"8>&%&,18I994',,<�6;�*12c!1
�6ʬ/(�=f
8*,/+2

)2��F� ".54>32&#"3267~o�IO�n0]0PU+K>W)X*/V�S)*
Z�pl�]8"��
;
^S�O{)��7����&t(r &� )5.546753.'67!&��IORFBB./1524,�8,..,�l[Zk
lh3��4wR@R;
PA����(4"&54>32.#"3267	##"&5463232654&#"�Ib/P02+ig03|�tM��UGAWUFAX�'.-''-.'OW>J"
4	rq
4	
K�6��QWWQRVVR2@@24>>(����/	#	"&54632.#"3267#'##"&=3326=z�LK���EZ]F4+Y+*/-=&<@AH@2'�6��SX\R	7s7:
<
 ��+1:@��G95���6��&�T����;����7S�&t+c���{Q�2ET".54>?#".5467'>7>3273>732>7>54#"2>?	!*5S_W"$3$%
A
#;#^:)'.v�'B.
3T6N;KX}!B;"01-#�"51O/BF=&�{",!DA9+
G	)88@
&D"):!(@��:5
?I�'TI-�7T,"J (+EPN;

��-O1�(3;@!����:���".5463232>7'>?>7#"&54>54&#"'>3232>7>7>3232>73#"&5467>7>54&#"�9A1"$ 1+8J>$?P8G( O?;;3	BL%8=:

1CKH
 -" %. %\db+"%4mX/- +0,!#/43!:+$m<Yy#NE,
/G.*
'6/	(7' 
CwMA.,
C�M0*
(+ .O3@7"
 
2<?
"DPcA
D�k@#!\b%	=wcD
(,$
(1-;B){E"3k]9�@MICG$P����e"&'7326'..#"'>327>54.54>732>7#".'>32�)4#8=/7F �$
""+*(&2&%8</	64!	=S=9
)20"*:>

:E"|E��^f)<8:	 �%(%KVZ*@;2!@5	'3F.	")&TRCz,04a��3333##'3#3#a���xCC�CC��:�6[��5`��`�333>32#654&#"xX#X0Y_7W638VS,��$('LK
��W.1e^��&�"3#73733#3>32#654#"yH	JX�	�$^AHQCX@_WZ6_>[[>S$(++CF
��?Uaa�������>O".54632#"32>7.54>7>3>54'77>7�5?
1"$#22+D=-:;�oA�73A00 "?)!A5`�|CPa=:=pX3'
!22(7' 
&5];
5C8ld)<j�Y'
+G5 9:19iB�;��r+Mci0$& ���I>3232>7#".#"".''7>3232>54.54>7 *3<<6)"	
HN	*66$<)�.)	1h
%24
$30""	:6$.�	1=9&77-=�+|"."3S/-]Q&*#'	<OO&DB%��&�LZg".54632>7>7.54>32&#">3232>7#"&'67>54&#"267.#"�";%=%&T)	BR+4[u@---):cI( 27=DLT-+&/UqCG(!<!HBAU2&E +WBB<?,%<20�x,9$I)4$3
%#  H+

*;>5`K+		.Nb5,8 
<}qZ4*$gl\3CY&D-#M4B5We0Dq���"6����"*%2673#".=5>754>324#"67#53KI)F+0.?4:E1V6'S<&z:-:RY!LAq;�)C(MFAkP�2;\3)�@���%2"&'#####53533533#3>32'2654&#"@7T>�WLLW�X��P9irr{GKJGSAB
-&IX��X?aaaa? B,.��|�Ifae`f_
\aa��	
333#%5aL�5M�:�"��6�5b�c_��+/333.53##%"&54632'2654&#"5!_eEOb���@TQF@URD,&&,+('V��DE��6NGF�t�XRRWVSRX:97855879�EE1���&1:".54>32'2>54.#"'32+532654&+�P�c66c�PL�e96c�P@pV0.SqDZ�P.Sr>�RLV>RF',(,E
6c�PP�c66c�PP�c65.UrEArV1Q�\ArV1_�EDCL��%*(#,��O]>7>32#"&5463232>54.#"#".5467.54>74.'326�)3
(Z(R�'?S)$FhER]+%*@(3B(.'.i50Z%50C61O.$!)=@$6&6q&PaA56]"F<CnB7p]8SC26 	))4PSB7;*6,(d6&IHI'@R0T52k0+]4<eP7��)OQ++S#/B#"a\�3!2+'3#3#>54'a�xBk>cxCCx���$/S�m[>_6��5`��1��@<k=�V�")/.54>32!'27.#"%>54&'3'u��K�mk�K[I��YM7A&N87-.-.��.--.6|�
(
æn�\\�n��&��H��?)�UU�))�ST�)�~����^��".54>54&'"#"&54632>54'#".546332>7>7>7.#"32>53#"&54>7>326732>7p%!.0"01<(![U9A1"$ -$>PB) W>4"6#=q[;@-$#K@)9O04:-A?8�[(C98om
!# $3>
#EF=
.C-^ NcuA)@h>&5.	(7& C}XC�L%.#	,AN*)(.Rm?1%PF+44+QE1!.	N)@h+"JD
() 	
5=,��K�r�.#"'>3267>54.#"'>54.54>7>32>3232673267'>54.#">?".=4&#"�  40
!49-&'%
%!

,=&)I48L1#&
#
	5Z2,!% �D/%<><�C�
.*	6%
	!>fNKg@(((+('
%$)/(

' +E)E2%&-&	��tz9+C<
LP 71t
E#*,3-Pa��
!3!2##'3#3#>54&'3a�xC=�ÿ+xCCx���$/*)DJ��c[B]��=��5`��#��<<79
��a_�33273#'#7'#254&+a���LE98Ufh[AFTsN�f�^YY�ffEc]Z��kk���s�J:��a�o_i &27'7#####3023&4'>&/'�y*A$�i�f7h`Z�fk=�0752�=44Do*�9L-
���S����N���I�A8c��%:"&'532654&'.54632.#"733#5467###�57'(((1"G;3-E)(47M�^^a[@e5`c	5	*"00	1	
2+,34`�����/��(�j�#5!#33#3#3333ve
f�Ӕ���B?�j*66��`6Z6d6`��6j��33#5467###!#5!#E^^a[@e5`��e
fj`�����/��(�*66���oXi'7>73#'#3_���_�Z=7T�^��:3L��#@#N-�6R�<�u&O�	
35!5!!%3#&n��	��]�IjG5`55��55`���!'"'532654&+57!537!5!��~?xSqN/^-[YeqB��i������<�g`Ae9"PSDACA�K�L<�����dS����'##".54>7#5!32>54.'5�&E-L�ij�L,F%�>J 2hPPg1 I>�OVuKb�YX�bKvVOH,\kBLxEExLCj\,H��V"&'4&#"'>3232>54&#"'7>54&#"#".5732632>32�5,70C)VF"2/62 &:00
$!K
&/&0!10.0#0>$8^vq
;0
	
&@KKEK
A,:!!
	l
*2'A3%/2o�T#���2#4&#"5>cOHX*  &UK�~�1#G��ak�0��~n&&��=��C��".546332>7>7>7.#"32>53#"&54>7>3267#".54>73267>54.'#"&54632>54&'�3<
1"$ +$>YL)*9)4"6#=q[59'$#K@)9O04:':98�[(C/'7Q(
%&,HR' -1-
7
!!1#	1<(![	.2(7& Q�X-SY2%.#	$5F*)(.Rm?1%PF+44+I:(!.	A)/H4$9)'QE*$
,=!*395$Q7		:V23NcuA)@h>=��z�K".5467>7>7327#".''2>54.547"32>78r_9=;<D8
/*
	!7V/#/0!T�c-;�)*QuKQl4% 	&*#0=>*@&
&+A3.\Nb�H
m2��8"".54>32!3267.#"!5Tt;.K\.JuD�lN-IV"#;TTL41H#N~HHhD C|U�%<6%>%�&"�����(4".5467'>7>3232>73'>54#"�&1	,!!7�C%!
:fO
NR#R\-;L+2-%
),$5
(&AN ::2(+L/)V9�<@42KO��e�dp".54>7.54>32#"&546732654.#"#"&'32>54&#".54>32254.#*�=Y0EqC
;e?0<"
0%"$#-'"1!./K+5#9#A3 3(M?&$8%%?(%#(EX{ " 4\;=hF	4*-R5.2:))<
0 73,36aC	

7NZ/556H(%'.N/
$(B(#--O:!�

����P�7�".54>323267#".#"32>54&'7".546332>?'>7>77>7>32>7"�!':\�S3@.."%#
	%1&DCF(6mY6 2,#3Jk.;!1"$ -',G= 8R3J.7RA
%&
	GN `�5%$
!RSF+
+!.Oe6&%#7A<
<!D>'��)+#(7& 6]<A1':e_/
$Ze5$	8,&0-
T�L��	3!5!5!5!LZ�q5��"�6O�O������{"&5463232>7>7>7>7>732>7#"&54>7>7#".54>7>7�=I3(!).
*$7_VW/?|i# #9?>,="8f062"$8?@@"(&,'/40#UyG=Y#3GF00$!SYP(QWg
J:*;#(	"=e~@V�k

5HNG2
8NUOUfd'<O$<SSc`&JTP@.F"
#I27HKPK<9>8(E�dV�5-=&4]�lFC2Zki'6whA����#;".5467'7>32>73'267.54632>54&#"�%0	,PLS&+.3"/1*@*;)"
 +M7+
),$5
_$B)+UZ%.&'1'
1o+%]kS.'%��@Y.'#>7.'7>53&_i7@4ICO&I 6A�C'1N$@./P!5�@X�P^�c+I4=�V.jg(7|x1<m."�E35!4&+5323"6EZ��Td,M=)XJ=+fY��=��EP7>=4&/5#'7D%
T1
;G(%�1!0+5'�! 
D)G@j+Ӵ"=[�E!!5!#"���M==����N��N)�� 27#".54>2654&#"���"��\�om�\[�o��������ig���
o�HH�pk�K��ryzppyysab�&!'##3!##33#!#3#%.'316�6`�X��g}a��drsa��YK����7����3 ��rX��
�����M�M�CC�1���!4"&5467###?!#327%3#26?#"&547#<Q
;�f�fsOyl;<�JC\CK
1	:A<3
E;5��#5��
|;��E%*'��+&(�!4>73>73>7#�
���~	b9�
�Do	�T])��%	��(\W",4M�7;1
a�	3!!'3#a���xCC�5�k5`a��3!##'3#3#aG��xCC�CC�6��k5`��`�l�5	5!!!7#!5!=��6�������-�K�U�?b�77�q����1���>E���� #>32#"&'732654.#"3<�:vKo�NW�u<k."&_3��6w`/B�R^Y�qo�[N��V�I
���#!5�Z���6zP��)5!3��n8ZPz6�#3#�a�Z�b_�����G$��	
332#'3#27&+%>54'$����a���C�CK[Gq1Kj�2AB%ʌ�|�o5`��"#��H3�^`8	����#+"&54>323#773#2>54.#"�@Q"Bc@4DB���'R�C�B��/Q<!0-	5"=&	\[B�mA7(6�e4::��h>bo2 ;&VyL.;
	���""(/"&54>323267>?&"#">54'�mr*SxNH`��'.-^-+ZI4%	+{$)/�9A
m]@}g><>Bd�
?4	��-'%)�H'< V
"&54632'2654#"3'3#�"-2/L; �q�rnC\CP&%*<G372�~��1��o�V
'-"&54632'2654#""&'7326737>7#�"-2/L; ��(.
��y%?]47
iBP&%*<G372��	5#/�� JC*MA<�c�!##3532!>54&#
hB�B����A��ofbs��$LL^mcu�<YFTKJ����)5"&5467'#>7'3>32>54&#"2654&'�P]R=�!Y1%�wW/tShySG 7b*6=J>@[ �*5&$;31QI?X$�Q/Am)�T*4e_L])$R7IS� B67B*��,'$=%"<)$.,��v�`r���".5467.54>?.#"327#"&54>3232>3263:.54632#>54'>54.#":7'"&#"767.'2654&'"#"&'+30H+@!	"$	
") 
	#
2C,F2
$
 "e=
2�	-$'&
,a�	
	 xt$![0�40
)*f&
$:!Y5*( )�

)
 �/GU'BO)4$**%27X!:$�)A:%)> 2���_	" 
��4+
V92U+4����:#'##3#3&'32.#"#"&'532654.'.546NE#y$D�? I�I�B"Wp;5 (:)ND<>"*$8(;rbbX�6�c	^�
50)+5
	=
0#)6_	3535#5353���YH�H����N\jx"&'#"&'#"&'+53267.546323267.54323267.5432;>54&#">54&#">54&#"7U !V67U !W66V !R5#E#?>~$!H$"G"}}# G$"E"
~}$!D#�		%% �M	
!%%Z		 $$ 	3
"X['sm�&YV%

"W\'��&[W"

$XY'��&[W"
3M#ROOR#TRRT#ROOR#TRRT#ROOR#TRR��%�'}�~'�(��`��%���'}�~'�(���`��%����'}�~'�('}��`���`����933467'73#"&'532654&+532654&#"'>32f�K�L

6#�IG�%@F>40:4992/)5$E.GH+'/T�62*		'1\�T��
?")#$!7' .>0(4
3):I��-�F57>54&#"'>3233"&'532654&+532654&#"'>32s))%1#E+@I;8Q�K�L�%@F>40:4992/)5$E.GH+'/T6p'1'  .?71N5M>���6
?")#$!7' .>0(4
3):I��%����'}�~'�(���`�����'v�~'�c��`����=�'w�~'�l���`��
��$�'��~'�^��`��%����'}�~'�)���`����$�'��~'�g��` ����)5B33467'73#"&5467.54>32>54&#"2654&/n�K�L

6#�IG�IN- !&?%7P*'/SA%$  $(*(-&
!"(�62*		'1\�T��@8)6+&$257%07)8C!"�$&
($����(,EQ^"&'532654&+532654&#"'>323"&5467.54>32>54&#"2654&/�%@F>40:4992/)5$E.GH+'/T^�K�L�IN- !&?%7P*'/SA%$  $(*(-&
!"(
?")#$!7' .>0(4
3):I���6@8)6+&$257%07)8C!"�$&
($#����";GT33"&'532654&#"'73#>32"&5467.54>32>54&#"2654&/��K�L7 FE-550%�	CZTsIN- !&?%7P*'/SA%$  $(*(-&
!"(�6

C(+&*�7mD@FM��@8)6+&$257%07)8C!"�$&
($0����
#/<33#5!"&5467.54>32>54&#"2654&/a�K�LI��'��IN- !&?%7P*'/SA%$  $(*(-&
!"(�6p<1����@8)6+&$257%07)8C!"�$&
($��%i�'}�~�)��!���"����G�'��~'�gw�`2�g!!2�=gI0*"#/;GS_kw������2#"&5462#"&54632#"&5464632#"&%4632#"&4632#"&%4632#"&4632#"&%4632#"&4632#"&%4632#"&4632#"&%4632#"&2#"&54632#"&5462#"&546)
J
�
��

<

��

�

�T

�

�T

�

��

<

�
�
J






I


@


J


J


@









��35#535#5333#3#!aWWWWZ����8�GYG��GYG�P
��35#535#5333#3#UKKKKXKKKK�GYG��GYG�����32673#"'!!&#"#>323�
21*	$��	32)Zk:F�PT;E/
*�3#53532+2654&+3#aWW���5}kRHfdX_[���N�qk@kA��OEVMFpNpa�_�#2##3267#"&5#32654&&�*A$�i�� 


CK�fkWPT�ef9L-
��'��/#LKRN��ECF;.�0�� &.5#7.546?&#"'>3273#'##4&'7">=7�CA/:eh2		*L!#`4DCH^@#MD�)JP>BY�74)��K>HU�B��#���L,*m$/
�@�KM0r$
�3�0��"#.5#5?3373#3267#"&'7hCQLM#4[GCJw+*
4(	F�5#8*#r{��9��C	����a�D��OU�Fh�3>323#5#4#"#3�Y4bbOWOxZCXX(#)*]g���W�e^���a�D|�%#5##3>?3|V%�IZZ>�i���P��U@����"D"���U�F#�3>?33#5#'#3�	�gٰNW)�=WWk4
�����5��&�D�5!5!5!!��gx�������D6PD���'�F�5!5!5!!X�� ��p��#��:�DB�n�=����#2373#'##".54>"32>=4.kIrGGpP_�EE�`bllcX]$$^�7/\�6\.8\�oo�[N����6_?�?`5a�@�!#"&'5325467####333^V("h�K�R���~a_Is�(P&��lNW�9��T���!73#	>?#^VU[��Q��Q����3��*,
;�b����#"&'##33>32'2654&#"�IrGGpP_�EE�`bllcW^$$^
8.\�\/7\�oo�[N����5`?�?_6��"��)2&#"#.'#3>73>7>�

�[�
�[�^o
~]~R6�I$'���:-	
U.�/�L.V&'\,��N.[#%W/E=7*"0333>733>?>32.#"#.'#��[J_`\
20%hg\	`��+X27.��"PX.�.#A�\.:.

/:��
�'!,23>73#'#5267.546"654&�5F>:w^�e[5$I3
@'=58W06126<��I 9;?D!
+ Ba��33!!aZ2����O��U�!!#���X�J�7���"$"&54674632'>54&#"c��:,D%-/N.UI>X0O�13R0=/,
��Q�6/1kFIV'([^CwOa�AK0\F^c0?5���#%,%#"&'#"&54>32!326732654'"!.�?;+%I/z�:lLir��XR1O.!#
��?O@�"2E��VF�o4[b" 6SQG]��J�!#'##"&'732654&#"'>32JEN8"

DU#/#8PQ^17ScOW12D	MY7��'"
#/#".54632>54&#"4546324&#"326'�sGo@�sIo?�LRRJ<1/@7  
��A}Y��A{�	T7_ll_4R2772:{3535#535#5!:����AH�G�H����vZ4632#"&"&'5326533

%	

9/9��+t��-3��#3>7��:�=i

h�T���./3� ��A.#""&'3267#".'.'.'532654.'.54>32�.S)>M'H/8W3f
3$$/5A)" 

,f:FV*L23S1<iB5`1a:5(0"3K:\f

9%	
K	#>("-V>9'2$1L;<U-"� !�35!5!3267#"&'.#"����y?F#K#1;O_"(=?N=��>7=+
J	O7#'��hx�&467>73>32#"&2654&#"c/59@"	(//=12;p# )�FO
	
+-6+56D'") & 
/��lxB+5324+324+326p".4hh&4(4>6<>;< #�#;?"E��lbB##5bk(B����"�B
3#5##53>535`#&�%$nB�hJJh&a1)X��al�B#'#5#7'3537�dl-h%i-lc+b%bBhnmmmmnhhhhh��hdF%2#"'532654+532654#"'6)1 255*%E %7&F% 
$��l|B
3#'#53H+gp.m((Bgomm�h��ifB#5##"'532673f(G	''�l�eW\a��l�B#547##'##537�$N"L$5LMB։���֬���lsB353#5##57�''�(BYY�``���hzF#"&5463232654&#"z=4/?<41>�"$%""%%!�6::65995&--&&++��lpB#5##5p'}(Bָ����p|�"2#"&'##33>"32654&-67,%
(!#%(   �7779X6%&(+/$%,��hgF"&54632.#"3267%0>@1"GEh59;5RP��llB##5#53lO'N�%����lyB'373#'#S->>,SX-BB-�hPPhnVV��"�B#5#533533�&�(}'""Jָ����lnB326753#5#"&=37.%(((%)(�$
\�`
"P�fl�B!5335335���(h'iB�ָ����d"�B3#5!5335335�#(��(h'iB�gJָ�����hzF#"&54632'"3&267#z=4/?<41>p@�@#!��6::6599@@�$#G�@h�C"&546;##5#"3267R0>@1�O'�G#"h59:3��O&*��hdF$2#'##"&54?54&#"'>326=V#!+s)"+#-")FH�!A

r ��hrF2#3267#"&546"34&/5�K#$4@:0!zF5+J864<!"��lrC53533##54#"#54675KA'@@),'A@(,(!! )&*(88(*&( ��hl�%"&5467.53>73'2654'')()$$!)',h#'#&!&823F"(% #�l��3#32+5#535#32654&%LLDa.4j55g@A" �Z;<$�Z�E�th�F#"&'##533>3232654#"�91.9=((>8..;�A#BA�6:31`�Y./95S*)Q�rh�G&"&547##53354#"'632#'#'26=,#(Z((�3 %
)+X$ '$&)h!d�X2L� !#��l�B#'##5##73'&'"f(-#,(f	
;
B�^^^^��}l�B#'.##5"#7>7'5#zI$
'$	'$H�}?BE BAddABE=�ql�B ##'.##5"#7>7##533'5#�I$
'$'	C''zI�}?BFBAddAB	`�YE<x|�#!#�5��5x|�#!#4632#"&�5�K�5��t�#7�5��:|.k�t�'7@��k.|��{o�77"&54632{���-:|.k��34�x�'7'"&54632D�ڷk.|�ƅ#��##5!#5����55#��##5!#4632#"&5���G�55�5��1=.5463232654&'.54632#"&'.#"7"&54632�(9
&#	G;'3
	'	9�"
"(.85?	 07 ;$�5��1.5463232654&'.54632#"&'.#"�(9
&#	G;'3
	'	9"
"(.85?	 07 ;$5��1".5467>54&#"#"&54>32327>32A.9	(	
4&;G	"&

9$; 70 	?58.("
"<O��!!<{��O{��F��>R��	7���%SRT$��>R��'b$S%R%S$��(
5@KOSWf47#"&535!5!4632!!#"&547!5!&73654&#"32654'#5!5!535654.54632�n6-������W%$��E$%�7�*+�����¶,n5�O 
	'#�++�++�++K$$
+
%%+		m
		�++�++�++�N 
	
#�l�!5�`44���!'7#5�}����`4�/�4���%!5!#���}����44�d���2#52654#d1<<1'D8218'#BLI�3#4632#"&4632#"&>�@=Z�6���?�9%#"&'.547327�.(*L#"'"-��|45S'"#L*(."54��|-z*t$7'&#"'632'654'��45".(*M"#&"-*�-"&#"M*(."545/�4632#"&5-54632#"&����|����;��;�&�JB�7'%'%4$$��$$�5�5��5�5����)2#"&54667#"&54>7>=3Q&(0Y5^m5(!J=
'&C5��l	9[S-A7"3'�/,49�H]�7"&'>7.546327.546327.56327.546327.546327.546327.54632>32>322>322>322>322>32>32232>32#"'�"


		

	



&%/#)
%'!,F
-,!11'%%+!
.'( 
">:
	5/!)%	
 (%	/%+"9
1
+
	#


	

%				
#
		$
	
		


���(�&l�z���2	�&c���_>���&7���%SRT$��>���&'b$S%R%S$2	E#4632#"&.#"56323267#"&�"$/>0H9.$/>1G;�"N5"M6
2}	�#.#"56323267#"&4632#"&
$/>0H9.$/>1G;O?"N5"M6
u��u�33#�7����$1�$����#533J��7��1�P4�#3#�@��:��#53���~:�HP�b433P@�����:�b�3#53�@��H:��3!!".54>3!!")EX/��4hT32Ug5��/XE)b,/0B<<B0/��75!2>54.#!5!2#�/XE))EX/��5gT32Ug5�0/,,/0B<<B��(�b��'
�
���b��&��5����432#"%432#"432#"59::9W9::9��:99:�<<;;<<;��<<<5����432#"432#"%432#"X9::9��9::9W9::9�<<;��<<<<<<<5���432#"%432#"432#"%432#"59::9`9::9��9::9W9::9�<<;;<<;��<<<<<<<4���'432#"432#"%432#"%432#"432#"\9::9��9::9Z9::9��9::99::9�<<;�<<;;<<;;<<;�<<<#����+%#54.'.54632.#"#"&54632/F""$5h_<a("L2:?,&!$#$$#�)*5?-Q^F40*,!27�$  $%�ua�5>54.5467`#B@$AA�"$'-=2##',>f��%".54>32'2>54.#"3T22T33S22S3#8""8##9""9�2T34S22S43T2<"9##8""8##9"��H��+L��t>73#L0A^v569�5��H�����)��J����	>73##"&54632U0B	^j#%%#�5�5%XU#��%%$  <"�	#5'3Y��Y��	�O���}�	5'37'#�X��X�5��O�	+��37'#7+�d��d��
W��B��� -467.54>32.#"#".732654.'B2'(%2U5YO%F%7:D4.O0[JE`1KDL,)D=(�*@6"/;":&%"&(8+CM+G4+>/$"
.��(�X3'�����(�
�3'�0'������W��''7'77V34$44#53$23c43$34"53$33C�2�h#/;G"&54632"&54632"&54632"&54632"&54632"&54632�$$$$$$$$$$$$$$$$$$$$$$$$� "%%" �#%%#�#$$#� "%%" �#$$#� "%%" L��NK75>54.54>54.54>54.54>7�,,6];AQ,,,,,,,,,,6];AQ,,,,,,,,-#2?;,#,$&,+%%+-"3> ;,#,$&,,%%*:����&<FL33253.'>7###.54>72675'"&54675"2327&B=21="?1;: =24=y�CxM8It,4q2pzYG9_97v�/+�m/>�@EL	F���
����
��OpB	�
&

\g[j
	;aCEi<���P�z:T��(�'�1��t?3#.1^A0i4�96<��t	?3#.?3#.<^	B0�^	@0i#UW&5�5#UW&5�(���7"&546323!�[Y+!(��UC-,#	!N(��"�'7'7S+�G�+�G��*���*(�_T
%.#"#>32(9'.26KJHQ�')>HJ<(_
"&'332673>32#.#"�JK62.'97Q�KJHQ79'.2�I=)'<J��>HJ<')(�_T
#"&'33267_QHJK62.'9T<JI=)'(�_�"&54632"&'332673�JK62.'97Q0bI=)'<JZ��2#52654#2#52654#Z1<<1'D1<<1'D�8218'#B�8218'#B
j�#&5467jr	nVz	g��#��G #<��375'575'37'7'7'�������e�������U�
U
�U��U�
U
�U�H����2#52654#4632#"&d1<<1'D$%%$�8218'#B��%%$  a��	##7�/��ZZ��P�����P��>���s#"&5467332674632#"&�1#($8 
�$%%$/+4+
��%%$   C"&54632'%'%"&54632A$$$��$$2��5�5��5�5�aX�x737'aT��X�T�bX�x%#75'3�T��TX�T���,�3!5!�%�}���C7�m"�'%�">3232654&#!5!5!32#"&#"G
:6F?;-6?������{�LX&WS>dH�$ !=?N=��%@+;L
#�)�">3232654&+5!5!32#"&#"3&$(-!+?.G�"��w��|kVTP7P!.
�	"$6�G9�gHD=G

"�'%�*>3232654&#!57#537!5!3#32#"&#"G
:6F?;-6?�ʫ�����屈���LX&WS>dH�$ !=�L�N=��L�%@+;L
#�)�*>3232654&+57#537!5!3#32#"&#"3&$(-!+?.G�i�n��wxe�{|kVTP7P!.
�	"$6�@�G9�@�HD=G

-����)74>7>54&#"'>323267#"&--W?:DDC.W&)b:Df:\\@JRO9k$"f<u��8J5&0$/9M,Q9S`!)0#5>Vj-���")74>7>54&#"'>323267#"&-&H34<96'J"&T1Zo(J44:<C/\Q8bt�+9(#FJD,8(  $+PP,��s�7'533267#"&{O�O&.#6LQ��55�!1/F	M��R��6tZ��53533##54&#"#54675��Z��quZ_]Z`ZzpLaaLa
�m��`da_��p�aP53533##54&#"#54675{�X��ZcXFIIGXbX�ASSAN	f`hdHCCHdh_f
N=���� 3#"&5467332654&'#5��a�ww����ww�c1pxyn]\Za[���sUd||dUs�CPPC?J��M"���� -"&5467.53>73'2654&'�U\<>-: 
X2.*7[%G525)O:+602&+6
WE7aB)EDM26MD,.YsTU�q:,JD%,H+C0)+O,'8,+3=����6".54>32.#"32675332654&#"'>32#"'S]|=>tP&K"4RZfe7Z8 ef[R3"K&Pt>={]hGG
_�om�YC����������CY�mo�_>>:��N#4"&54632.#"32675332654&#"'>32#"&' k{rd"8)=>NC"4X6"DK?=*9"dr{k8QP
����C
je^l��l^ej
C����(""(��p�4&#"'63232+72654&+�$2&.>TUk������VWaV_5<GTe|ibeoL@HL4��l#4&#"'>3232+%4&+326�!-$4PO��kn�bB>��<Ax.5EM];�MY�1#�0+�3#5!32#!3%2654&+��j����[Z�ETW^V`|N��ibeo�6L@HL4��3#5!32#!3%2654&+�����kn0X�y;CB>{�FۘMY��E/11$�a�333533#32+#%2654&+aZ�Z��j����ɓVTW^V`�```J�ibeo ��L@HL4��U��333533#32+#%2654&+UX�X����knޛ{;CD>��iiiE��MY�,E/11$�=����&4>3233###".%4.#"32>=D�h^�K�ZZ�H�dh�E.`KJ`--_LK_.fm�]N�_.�6Nf�W]�mV�HH�WW�HH�7���"4>32353#5##"&%4&#"3267<jEe}
�XX�~fm�~EMLEELME
Y{Axq���y���effeeiia��33!3###!3'.'aZ&y]\y�{\���w�+��5�3J��J���pE+*U���#*"&547##3!54#"'>32#'#'26=�L[+�XX�p%M',^1`c?%Q'GUOT\5
RN=&��#}B]a��P/+FQI12;+-��	!3'.!'v�u.F�C�F�E�3�TD��D����
133'.'#!'�d���		65.4��QCD�����$%##5##7>7'5!#7!"!.#F�Q�1[F/J:�A�:I/H[������0>)�(>0�����:P-�44�-M9����01.1^!%##5##7>7'5!#7"!.#�H�)Q=AC��<C=Q�����)3<7>uuuu�BG�--�?H�ء��
!- a��33!3!!3'.'!'aZ&y]�u���w�+F^�\��5�3J���pE+*���T?373!7##3'.'!'��]d��^�X�
�	Z@3A�����@D56C
�~��%#.'####"&'532673�]n	Y	&&7. ##�]@2S(��p,b-t8Y3J>F�!#'.'####"'532673\N
	X
!32	�`�(?��T6&gLCH3��D��733!3!#WYeZ��VO{��z�6��F#33!3!LXX�E��2���Dx�!3#5!#3>7!x��ZV�V7$A2 O/9 M�M���>���OQ:���6)�F�#3#5!#3>7353��NU��T+EE�t"5#�F�w����_�|FD��0�����!###"&'532>7>7!!c\�	
&?3#
#���{J��4C^0K1I$&��oM���####"&'5326735��`�
.L:
6A�F�-ϩ�^B��aF�!##33!!#467#��S������Y�ri9�O��IM���4f ��U�##467####33'��O�J�Ou��F�-V.�Q�-/���Q���=����&447��'"
%".54632'2654&#"7"&54632-Go@�sIo?�qQLLRRJKV
A}Y��A{Y��Io__ll__o�=����'3".54>32'2654&#"7"&546323"&54632�o�HH�pk�KK�lzppyysr�
\�on�\[�oo�\N���������5��B#
%1#".5463232654&#"4632#"&74632#"&B�NuB�Qu?�HU]\UV\XY+�
��D}V��D}U^op]_mi[��=����'4/'44&44��7���"'
b�
b+�yG�1=IUags������������%#"&'#"&547#"&546;&54632>32232#"#32654&#"32654&#"4632#"&'4632#"&3&'32654&#"32654&#"32654&#"'"#673"#674632#"&%4632#"&74632#"&23&'2#3&'232654&#"32654&#"7"#674632#"&'4632#"&�KG/>?,KHKHHKHK->?.GKGKKG�36622663�36622663J���36622663�	36622663�36622663�`�	����36622663�36622663�_�JY$  $ZI?)ZIIZ(?IZ$  $YJ>)YJJY)�<EE<<DD<<EE<<DD:



Y�<EE<<DD<<EE<<DD<<EE<<DD+e





Z�<EE<<DD<<EE<<DD,f



��@�
#"543!2#"'�&((�)('n./33/.���$D#/;GS_#'#7'373#'#7'373#'#7'373#'#7'373#'#7'373#'#7'373#'#7'373#'#7'373X89FA44A�89FA44A�89FA44A�889FA44A�89FA44A�489FA44A�89FA44A�89FA44Aq\\neSSd�\\neSSdo\\neSSd�1\\neSSdo\\neSSd�'\\neSSdo\\neSSd�\\neSSd�L���,#5!#5!!53!5�H�(Hh��H�L�����
����l�#'+/3##5#53535!!5!5!!5!5!!5!3#3#3#��0��0�~;c;�';c;�';c;�200��00�00�0��0��'0000�0000�0000~��;��;��C��'#7'373#73'7#'#3D�EE�DC�FF�C-c22c--d22duxyuuyx,NVWNNWV��hjF"&54632.#"3#3267'2AB2$

CvwF
h4:<4?F��ltB73#5467#53;�1%�1&�!��~
#����lJ�4632#"&74632#"&#535				U	

	((|		



		


�����p}�33>?3#"&'5326?i+41+h
(#
�z
 y�$�ul�B32+5#5#32654&Bb.4jM�AB BX<$�uE��l�B	
5332#353'2654&+(>\,1�(� 9l�X<$��E��lwB	2+534&+326^-2n(~CD!�<$�X>E�`l�C#.'#.'33>?.'33>7�L%
5$1'$!(!Csd4a(p?:_
;*1`(#_7�V��
#"&'33267�QVUOB/4123@=6##$"��ku'#7#"&=3326?u4>	%(?
 
'�F)/)(	>��w��
u!���k�'
v!�D��3#5!#3>753!B[V�V7#?2!U/9 M����=���M��Q:���6)�F1�3#5!#3>7533##�NU��T+@EP�v!5�2����Y�s��2�D��3���+"&'532654.'.54>32.#"�=d&(c7J\.L..T5>i@;`++N)AR*H,1Y8@q�V XQ2G:DbJJk9ITM5F5!G]DRs;+��#)#"&'532654.'.54632.#"�og7W#&Z*AE <)/K*sX/T*E):?;.,J,cqLE:+;.8N=_bAB4(3*8O&����5333	####"&'532654&+532654&#"'>32*%�Z;f��Dl��Z�E��:i-/o1`cthfajiP@CY*+*{Mtx#0F3��Z����j��N.V^vRHBD>KG<6:"=+d!���"423533##5##"&'532654+532654&#"'6�\m�X�`�f�X�ov:^"]7<S�H:ES?;,C(T"ID-��������2$C[O)2ZH%-&&F%K��#!##"&'#"&533267&5332673�Zma2P@~5bkZ?F2V7	Z?C4R4Z)0[[��;=#��<<YHg#326753#5#"'#"&=33267&=344,P)XX*[6k(/f:RXX44,P)X^72��� G!&VS��72��9g�/7%2#"'532654+53254&#"!#3>7!36!�/?: #CC<+1$*R'&N#(��W5-L4	\N&�z*4W\&#2 %15

(,%
�
R��r�� @���9.�>�.4%2#"'532654+53254&#"!#3>7!36!.<8#@A='0#(O&&J�'R'>C3;%��82U%"1$.3

'*$�Y�.|s�Q����%4&+##5!#32#"'53265C;?�Z�����RV0#*1�=1��|NNŶ��Se
L	8;��##>32#"&'5326=4&#"##5Ӳ#W8]aEI( $9:5P X�F�!\_�EUH'.�A:��F���7#5!#3267#"&���3-!/S^��NN�IF;Le���7#5!#3267#"&Ʊ��). 
1VK�6FF��81GY`�(��%"&5463!!"3!2654&#!3!3#�10//>��11D09�XZaZ&(#QF�,%&-5&+#-��|�m@))D(U�(^#"&546;#";254&#!3!3#�10//��%�r+;��XX!NE�,%&-5V#*�/�9%)D(�>�"&5467#5!##"3267�/?G6��60+8	
�848EQNN��-9<�>�"&5467#5!##"3267�/?D4���/0+8	
�846E�FF�--9<��5!#32673##"&=�CG5_@ZZBq5dl|NN�;=Y�6)[[��326753#5#"&=#5!# 553Z/XX.e=S[���^72��� VSzFFak�4632.#">32#4#"#adW&
#/9@m2elZ�4[=Z�miO=G_[[��x��U�#4632.#"3>32#4&#"#UNF1#""V=ZaX:<WGXcQI	E)&N2.)_e��FHCaa��a�(��'"&5463!!"3!2654&#!3!3!3#q10//��Y%�1D0:�%Z[ZN#QF�,%&-5&+#-��|��|�l#V)D(U�(j'"&5463!!"3!2654&#!33333#910./q��%e7:+;��X�X�X<!OE�,%&-5,*#*�/�/�"K)D(��=���&446��7���"&TT�=����##".54>32.'!35!#>�K�lo�HH�pk�Ka^]���]_`_�_`fo�\\�on�\[�Bh
��~�n����7��'"
2#".546;&'5>7#0Io?�sGo@�R=?��r�{B>>�"A{Y��A}Y��LPG��I���
XL�a32+#5#32654&�`�BK�o^`'.+a�\-5-�f7`a	2+34&+326؈CH�9�-(ac$/�\-5B�_g�u$��#5.5467533654'6B@8&6B@9%%*%&)%OO^910:]]911:Vt)%$*JI��h�F!"&'##533>32.#"3#3267`/?>((>>-"
BttE
h04`�Y1,?F(��2�"&546;#";�CIHD~~__~bE@AC*Z[*(�'2�"&546;#";5!�CIHD~~__~�bE@AC*Z[*w**��(�2�
�	��(02�
�	(�2�53254+532#(~__~~DHIC�*Z[*DAAC(02�53254+532#5!(~__~~DHHD~�*Z[*DAACw**(��2�72+53254+5�DHHD~~__~�DAAC*Z[*��(�'2�
���NT�!3"&54632B���P?NT�!3"&54632B���P�NT�!3"&54632B���P NT�!3'"&54632B���P�NT�!3#"&54632B���PNT�33"&54632NB���P@NT�33"&54632NB���P�NT�33"&54632NB���P NT�337"&54632NB���P�NT�333"&54632NB���PNT�!##N�B�B��NT�3##���B��B�9�NT�3#33#�BB�����BNT�3##���B��7B��MS�333MB����B(�
�##"&54632
I4����(0=G#"&54632'7���4�5�3�(^AG#"&54632!5!�Y���I(S2�5353(�5S5q�FH��##5#�L�����F:�z'3533�L�:���HH�e#34632#"&�9kt$%%$F�'%%$  HR�o#"&546323#�$%%$[9k+%%$  �����H���
��V(���	5''5'(f�5a
��:<sr&�(���I	%55���5a5����$sr<FB�##532654+532#532654+532�:KmLRVT'UX
8Ki49UN$Q�*14YCOC)F*�a*,6UCPA'C)F!T"#53254&+532#532654+532�$c509=PNCF,0b#&LLBU)P#!BG9!:$��*"(@BB:3G1	��"&546;#";L��y}ib�v^	}gewP�RX2+�`'%".546;#";.`r1vzEA�kU�5[7ZmL�KF.a�@��"&'53265!#3!3�)#48��ZZlZd�L;F?����.�HmeU��""&'532654#"#33>32�( $vWGXXW=YaE�H'.��ba����9.)_e�MEU��
��&9�����-%267#"&5#5?3!'"'532654&+57!*5GOLP 4<�x?vSlQ.]-ZXbq<�3?D
K[7*!v{<�veFn=#Q`IIQB��a1���!"&54>7'572.##"3267I��?j?��Gp1!.W,�Sfha_2k1+h
ocCV-�CxES�CD>BHS.�#%'572.##"3267#"&546&��Kj1/R7�Fub\]2k0U����ťCv BS�DPBDOO)teem#����%#"&'5326=!53467#3�KD%
!&��O_W��WVK)./>��:u$
,����#"&'5326=!53!5467#�HL*!")��R[���VEUH'.Q>�/�:u$
+#��h� +"&'5326=!533#467#3#5>73B%
!&��O_��K��)2
X
K)./>�HK&WV�:u$
,��}%T"
7:�^ +#"&'5326=!533#%!5467##5>73�FM*!"(��R[�����')2
XJI]H'.Q>�/HH�:u$
+�T%W$
9;O~	3#!#3#�L/���@�?(���"'%#"'532654&'.54632.#"�hV^<#M+3=D7$?&aO)K%#=,75$)A%�HOH,(**%;-DM=)&#'9����&&&#.��8#2=H26?54&#"'>32#'##"&'#"&54?54#"'>326=326=`c>i[:5*L!#`4b^@#MD7T3>,P\�bp%M',^MT\5.GU
dM7+DZ#]aE C4BV^��L,*-.!(RN�}B��2;+-QI183-*KN0��L�(7#3>32#"&'732654&#"'.'3�Qb]X��k�KK�l��Nryzppyys�Q�����p�[�oo�\|j��������<@�.��y#!-82632#"&'##"&54?54#"'>32654&#"326=~,ByIo?�sEm fFX^�bp%M',^�KRQLLRRJ�T\5.GU#ONA{Y��>::>RN�}B��_oo__llh2;+-QI1����"&/!#3326533'.'�m}(	��Qb]�0G7\]Z��d�P
dj��8J%c]�2w�3�<@.��L#(3232653#'##"&'#"&54?54#"'>326=`c9=WGXF
[=@W"_<P\�bp%M',^MT\5.GU#]a�HCb`��H*(2350RN�}B��2;+-QI1}�13>73#'!3'.']�	
�]��cP��Qk�P�/=;M�6��)�<@.��#"-!'##"&54?54#"'>323>73326=�%Q?L[�bp%M',^1`c
�a���T\5.GUP/+RN�}B]a�83;V��2;+-QI1��1333##3'.'>?#aq�p]��go�u�.�,�"���A�6?��|}<@��@?Q"b.��#&1!'##"&54?54#"'>32373'3>?#'326=�%Q?L[�bp%M',^1`ct_a��0
)Y�T\5.GUP/+RN�}B]a��O;U]8�2;+-QI1�}�&#"'5326?'!#3>73.'3l#n_;*16<L��Pb]�	
�]��Q�)afR
7?4���1=;M��<@�.�#/:'##"&54?54#"'>323>73#"&'53267326=�%Q?L[�bp%M',^1`c
�a��*?0!"*)JT\5.GUe/+RN�}B]a�830h�u":#K	,*T2;+-QI1����;�&JT-��!���"&�W�o
k�53533#>?3	##
TZ^^>�i��&j�IZ&OUUO�"D"��mU@��&	
�3>?3#'##53533#�	�g��j�=WLLW��k4
���5�]AZZAak�%7'#3>?37#'ceIZZ>�i��gc)f�jrb|Q�@����"D"�ɎR2TњQU
�?'#33>?37#'�EC=WW	�g�Ih'jzjQEi6[5���s4
��`Q1R�m5
k�%7'##53533#>?37#'ceIZTTZ^^>�i��gc)f�jrb|Q�@��&OUUO�"D"�ɎR2TњQ	
�#?'##53533#3>?37#'�EC=WLLW��	�g�Ih'jzjQEi6[5�]AZZA�4
��`Q1R�m5aN�	%!!37:�lYZYNN�#P�#U�7#3�XXXX�!�#�!���
3#53533#!aKKZmm8+MRRM�%P��3##53533#�XFFXEE^@ZZ@��	�#53>323##".'"!.267!>L�id�O::N�gk�KJpr	�qpsq�-sJFb�QP�cFg�TU�f<�tt����{{���t" =3>323##".'7"!.267!H
�jd�@?�mDkB�IJ6LHLL��L�BrzzrBz�;rQ�UMMU�gaTTa��=����&4t35���#&2".54632>32#"'254&#"2654&#"*Ho>�x7U7(:A5':n�;�PKLPLON
D}V��#%F8 :$OyDjB##%��p]_mic^o��=���&446��7���"&TT�*�75332+3##5#32654&Q���5}kRddZ�[HfdXuK
nd;g@VKuu��BOED�0"+5333>32#"&'#3##5"32>54&SHNAcyyd>Q��X�RCAX1?G�AgI#0����/4;A``h\^ck6]<\n{�$"#.546;32+##32654&�+'JJT���5}kRZ�[HfdX) 
<Thnd;g@��f��BOED��#)62#"&'#.#"#.5463233>"32654�er6hJ1MX
!"LEL		I
Q)SD/;JH#��S~F&/�%#=K�J'-J_^�m_�
!�!*"&=4#"5>32;32+##32654&,RU=&�*."���5}kRZ�[HfdX^SqPG�t82hnd;g@��f��BOED	�/#+8%.=4#"5>3233>32#"&'#5&32>54#")AJ=&�4@IR;erA�d.Xs0IY(�SDCcHmPF�yPW�J'-��T�G��7^<�_=�T��(7'"#".54>327#'32654&#"pf6
o�HH�pk�Kig-�mO�({�ryzppyysq(@\�on�\[�o��#/5:+S/1�������7�d"*535467##"&546323733##5'26754&#"��Q@ay{b?P
FRRX�SEDWHFG�@D0"0����0#I��@aa�[^fiq__k=�7��(4%>54&#52#''7'"#".54>3232654&#"�ig/-##&<F59�W�$qkD
o�HH�pk�K��ryzppyysf��#1�9!!)6F5:K$�[*I,EO\�on�\[�o�������7��")64&#'2#5'7467##"&546323737>26754&#"�+)@M&�X�&�Q@ay{b?P
Fb&�jSEDWHFGD%)5F9#4.��ﺾ%�"0����0#I�R`&4�[^fiq__k-=�2##53254&+'���MD�f��x�]YlZ�ffI_��(K�J:L �2#'#532654&+'�bk<2�b�tc8@=:dXPM:K��A2.0+D9�vu�#357>54&#"'>32!533##59�6J&F84O)/*mDdt.R7�UbbUI�6TQ0:=$ <#1eY8a`6���P��'�u6" #5!57>54&#"'>323533#�S���3F.%<<0#R;LXE=g�Tbc��>�4W2%+3:'OD>a;i��I��X�3>73#'#73L9��_�Z886R�^y�N!,M##N-�6��������3'#7333>73�:5R�^]x8�r^�N����h�IF26<�����,#"'5326?.'#3>73>73� y_7)16A�
�^�ZpsZ�xZwnR
6@8�20L��P0^&#i4��5$W46�
��3"'5326?.'##33>733>73�$ 
.5
Z


X]�ZL][XJX�:I�	H@A#&,1)
	)2.����1_>2,��+[a9��[f)�,"&54632.#";#"&'532654&+57�hjdP"6#/<BM��}���=h+1k2b^jtC��]YS^@		65;:<�dffwSP?>IC����+"54632.#";'"&'532654&+57��^S$9'-<CE�Ճ��{8]&,Z.WY_kE�f�P^
=	74:.7�f\]qNE@<F>�
*�35753732+72654&+cYYZ��n�~��`KaeV[`�-H-�bWIWiddsx�?QEA��
�0�!.575373>32#"&'##4&#"326
KX��N@cyyc?PX�FJRDAXJE�I*��iIi-
"0����.  "���ee\\ckk(�73##5#53332#'2654&+�mmZYYZn�~��]dV[_�7A@@AInjcerG=RDB���0�!.##5#5333>32#"&'#4&#"326e�XMMXN@cyyc?P(FJRDAXJE[>WW>S�-
"0����.  "Kiee\\ckka�@�3>73aZ
'�e�{���`1b R,��+�U�
#3673�XX�f�	�� 801I,����(#"'532654&+532654&#"'>32�NGPT�vzO*e+RbfbTUdUL<3T*$/pD_v#FWXGem)QEFA@LB=6:  @%'^��#&4+53254&#"'>32#"&'5326x�ML�J9TM ,f>7Z6BBJQ�|:\)\[U[
�G�<@7A!)TAD\^LmyP/S����'354632+#"&'5326=#%2654&#"�VPHV\T:[U-!2.�,-% ")�4JdN@LR�g^N8C�J,&(27.����&#"&'53265#5354632+72654&#"�KV0
!!.)xxUOMP\S:7,-% ")INYG	28�G/JbKACSG*%&18)4���!"3267#"&54>32#52654&$KKDC 1:)`n9kJJqA���~L�ZKGLH
tgHn=D�i��K��r�5�#!"3267#"&54>32#52>54& HIFA/8'`n9jJq���Wr8O�gXSTKztRxB����HM��z�"�\g"3267#"&54632#52654&�//X$>HRIIVosTS4;>5d	-IEJWc_��+k~IO7�c�,"&546323.=33733##7#'#'26=4&#"dxyd>OX8CDCz�CED`
P1UEBYGGG
����.!
3�P��H��H"0I]^dkq_`jU�c��
%33##7#33+DCz�CEDtX;�H����PU�c?"+23733##7#4#"#4#"#33>323>�[Z+CDCz�CEDcmNCWnQ>XG
U0~&]"]h�뜜H��YZV��Yd^��I*)Z.,U�c"23733##7#4#"#33>W`b9CDCz�CEDqxYDXG
\"]h�뜜H��W�d^��I*)U��3.'#7#33>7�A2,	6@B?AKXFS9��S¿
^G��^14U�c�!3323733##7#'#2654&+U�Vh$9 h6CDCz�CEDL��~>E4>�QM/?#���H����-.&0�����#.2+##3267#"&5#5?335462654&#"4>KUUX�P*5GOLP 4�K32"!�G9?P�-��aD
K[7*!v{"G`�-$-4$A��*2+532654&''7.546">54&�SY/&.=vp��GO;1�9�=JaP+/66).�UL7P&9D.XfO2<2>�>�'RBGYE.*,8 '7$)1����2#".5467#52654&#"�l�HI�nm�I<=�yynssxq1g�]�nm�]]�n\�/N�p������W�H5��"�!#".5467&'72654&#"�-/�wHo>~y�U<>/)bxQJLPLOK�*gF{�?sNt�[d$;&!F�GhUPf`YRh\�1��2.#"3##33>�%

%Zh��YDg�QekfJ�/�f1?U��#2.#"3##33>L"	
 CV��XFM#SbP�E�	^179���,#".54>7.5467#5!#"2654&'_;T,sFl=;\27+���a+	GM>>,Q2T� FX=m}4bEG\5#7($
JJ<�LTL?L%*J;FP9���,7.546323!53254.">54&�;T,sFl=;\27+��M�a+	FN?=-P2S�!EX=m}4bEG\5"7)$
JJ< �SM?K&*J;GO0 !357'.54632!2654&#"R�O=�sGo@vhb� �RJKRQLL@�M/oOu�9nNjyC~JjZOP\\POZ��#!5�Z���6zPU��#3�XX�	\�;
�%3267#"&54&#"#33>32xM!!5LJOPi`ZEmMuw�]J[M4^Zyj���^26~�U��#4&#"#33>323267#"&5�;?SGXF
\5^cA(GBNHC_c��	H+'_e�PGQC\�1��2.#"#33>�%

%ZhYDg�Qek��f1?U��#2.#"#33>L"	
 CVXFM#SbP��	^177��R�5!#"3267#".54677�Z�I{v,U+(Z7g�KiN|NNM�X�MU�gp�( ���"&5467#5!#"3267-v�:6��q^kVP%D F
�yPoHHkjWeN��(�.z�����HV�&4632#"&4632#"&H$%%$$%%$�&&$  ��%%$  2���5!!52[��~GG�GGQ���7#3�9k��Q���3jk�9��a��	!#!3!3�Z�:ZlZN|��.���Q��(#"&5463233#327#"&";54&�1>??3Xgg$,/QE9#+
3<.47�g6��/1	FV.'E��4632#"&E/'&//&'/a/,,//,,a�7��!###33.533#�R��Sh}T@WQ#h7�q��@L �����U�<P"!#4#"#33>323#�<xYDXG
\3`b7RW�d^��I*)]h������Y�53>32.#"3#3267#"&'?S�iqT$!Q0k�	��	zq/T((U;��
;Lc�T*L�wLr�N�����" =3>32.#"3#3267#".'GDkB)L@���MH,CA.El@�ARg1I	�AX]
N7qY7�:�"&".54>32.#"3267#"&'532=,Go?BqH)L@�ML,C9<
0
:z_c|:I	�ag
�@EI4@U�:E�$"&'532=#4#"#33>323�
04xZCXXY4bb,9�I4FW�e^����(#)*]g��@E
�� )27.546;32+#"%2654&+32654&#EH̆�FB-I*�s�&\DS[v�_JMc� A=0Ob?S&F8ajO�;:;3�K��J<8E6�r�$13632#"&'##327#"&546732654.#"4X-1j9sl<O?NYVD+(6g|�wX?UEL'XI1,��H}O��1!H�&�sdg
F����*�ijid<[3��4��"&'5325#53!!3#/!<rr�����K�IDmMMM�M��IH��###535#5754632.#"3#=xX]]^^\R 5*,+��Q@��@�)h[E
;?#D�1���/".54675.54632373#'#'26=4&#";#"9OwB[YOKoZpNIlKkpsnOPWg)*�j
0]BG[
QESe?+`�6a*AKv}rum>2?BJ�HB+���#2".54675.54>32373#'#'26=4&#";#"�4Z7;C277S+7E)E@W.ZDKS8<AFGDH
 D53I
>,2?'K��M'0Hd]j^*'()B2,+21����)"&54675.54632'2654&'";#"B��[YOK�q�II�r|vuyQSWg)*�1S
naG[
QERf[�nm�]N����=5=AJ�0;��-��!"^J���#"&5475.=3;#"32653#'#:p��6O,[iu*�[IisYIl
g[�
*PC��XKJ�=Av}��6a*A<���%".54675.=3;#"32653#'#�3R11718S?KC8>4XFTAU
#E13FB@lf@8B2,+2d]��M'0����&32675#5!# 57>32.#"%���+D�5vF��<C[�g:k. )\0d��		��
�N���
>U�IKgYp=�_"%,67>323737#"'5326=467##"&'"%.4532654tg5UFMMu{vKOwEO6p\p
8@I%J[��H>QJ
�()G�?��st"Q*QF-	Qqg
aY6F>�7NSWak�573>?3%##^Z>�i���j�IZ>d��"D"��I=@��U@��)�?37>?37#'#5RW
�g����j�,WR��s
,&��1?+���&����"73737##77'#3.=^hɱTZZiեS^�����Ok����>��J��!~"�#h��@L ;f"?33>327##5"%54RG
\3`bMMW��XRGWE�I*)]d?��4��`[4�i�!###5753277.+27_g��Z^^�w�GAHC)[JYf�	�����
=�NN
>	Da�4)��{&U���"'733>32.#"7#5WH
R8#

)H+��XW�	b,@Q-O50?0���� �/7.54>32.#"%#"&'532654.'&'�'(:gC;b(%W/CD6C�@C�u<f"$k9PQIA
�`M79Q,M9/07;>&QD_jV>5#0)0���"+7.54632.#"7#"&'532654&'{$'oZ1U%"J'698G�s#&tb8Q [/C<3I�7+DJF# '*?8+NPP+$++
��!#!##"#.546;!3�Z��Z'+'JJT�nZM��) 
;T��.��&����=���#3"&'5326=467##".54>323732>=4&#"X?x8;|>eghR_|=E}UNeN��9N.h_bd)W�Vds2.CX�`n�P;/`�i��j(BS*8ux�}JuC��G�%!#"&54632533#4&#";G�d4>?B3$ZggZ$-MM3?.58��6�/2&;�)57'5!;��hh*hh4;44��0�uHE#'"#".54>3232654&#"HOR�rp
	Zx;;xZ[v:�DU[\TXX[Ug���J�XW�JJ�Wdxxdhsw
�373##j�IZZ>�i��@�6`"C#�7"�33!53�Z�����OO���<�7&'#"&5463233267&#"�(8B/8EA6*&Z�)!"$1G)"!&<45<���)' ��|�$23327#"./#.#"5>d#*i�`�)(0$f�`z	 �0'�_�@��(*B"I:��b�&*.C	^�J�#2+#2654&+32654&#1�~J@JQ�t�Z�VLWVw�VRV[�[Y@QOMgg����<;;8�G��GC=A��U�.�m��=����
E��:��N#
F4����'7&53537#"&'%326q=K%Z	j@=><{_;]"w��0ZaW(^?X�1'�Q )M��JwE��n.g.��C6'7&53537#'##"'%5326c58Y75.H
\4O.(�4YE&,B+F_��@@-6�-G*'�l��d���"#3#'##732654+7323'.'#)�^XX�t&	3:O;:A?V?�*�6���)*"4B9,7O��&\#&W,0��&I%7#732654+732"&54>32373#7#'2>7>54&#">&	3:O;:A?V�@Q'F`:5B CrF
"\%G:4,'B2,^)*"4B9,7O��]ZK�g<8%S��c,AI6\91/<1Ul;66����3?'73#732654+732/
UzL
�
VzM
��&	3:O;:A?V1@22��1�)*"4B9,7OII#732654+7323�&	3:O;:A?V�rXr^)*"4B9,7O��������)"&5467332673#732654+732opm\Y]EDYWcYdEt�B&	3:O;:A?V
g_2��L28@\Y�)Nr=�)*"4B9,7O7��&I,#732654+732"&5467332>?3#7#I&	3:O;:A?V�=IFYH	!%"OD1WrH3C^)*"4B9,7O��DA)G��+ %0jX��c3"���E(@%.'#3>7>73>32#"&32654&+532654&#"#-12Z�^�&L(
D9S7#(V/qu\MZ^��4_6J@>VYoc4/edP@?d)
J�SI�d�6,M#��GY�DJYdMIUXG^v���HBD>KG<6:85G��Nf+D"&'#&'#33>7>73>3232654+532654&#"}4SC)e�^r%> #F!O3Wh6/ 6!f��!!>"4G� AM=5?U!
Q|0sB��61k�7Al,2?ID19
	 4)C[I=x4
)2ZH%-&&98=�:Y�&"3267#"&'532=#".54>32.�s�{{/T(9<
0-<m�IO�nqT$!Q������@EI4DZ�pl�]*L3�:��7".=32654.'.54>32.#"#"'3267�,E'$k9PQIA[]:gC;b(%W/CDD:?W-�u:2$(
!�IA�>5#0)!`S9Q,M9/$0&5J8_j00C	&�:�"&'532=!5!5!!�
0�`x�����9�I4FD6PD�ʑ@Ea��	+32%!.#3 !�Ű��l�V��
�wua�~l���P���yr��7���#"&546323.=3#'#"!.267!dxyd>OXG
P2@F&DPRF��F
����.!
3�H"0�[ORX�fWXT[���053.54>32.#"3##"&'532654.'&'Z:gC;b(%W/CDA7�b"$�u<f"$k9PQIAOAE.9Q,M9/#0%AD2_jV>5#0)���"-753.54632.#"3##"&'532654./@oZ1U%"J'69;G�Ctb8Q [/C<95�A.DJF#"&A/ NPP+$  (��!#!5!3�Z��2ZMO.{3#5!5!#XX�����J2���73!73#'!24;44���TT��TT��#53533533##5#535#???;�;??;���:+GGGG+����C#Ef#/2#3267#"'#"&546326"34&"32654&�BK�62"32#[))YDYUJ)A'PP�'��3..43/0fOB:6.
CCWPPV" B+[)2==<?=<?=V�)33333�sK�J�K�(�(���	!!5!5!5!L��"���/O�O�63��3##".546";?�ZRk}5��^YdfH�6@g;dnMDEOBa*�3.53###33��S���Y���i9��6I���I4f q(*�)57'5!*��TTTT444��P�)33>73>73#.'#.'�bo
sY�
yY�]�
�]io�P0^&#i4��5$W55�6�20L��6g#%_0�PN�n3#NQQn��Ngn3#3#QQ�QQn��n��N/n3#3#3#QQ�QQ�QQn��n��n��(�Gn'3��nP�O(�Gn''3����nP�OBP�O(Gn'''3������nP�OBP�OBP�OC���7"&54>32'2654&#"�H['I32I('I3*-/(+,.�VD)E*(E++F)F/%$/0#%/9V�o7"&5467%'2654&#"�I[%52.\ K%5C'I3*-/(*-.VWC*?)�:I7N9+F)F/%$/0#%/�c�D�y32>54.'7#"&'�2&Yb(Q@yb7hD�_N��7>��IH�f;�c�Qy32>54.5467#"&'�my2"+"�rXg"+"L�p"	�7X39c\]3XeK?:(T_l@+^R3����4632#"&732654&#"�:./::..;1 G,77,,89*�/����(2'654&/7>7654#".546�&*&4;
'Z$
!#
#�%1#+	H	&�(����".'#"&54632>54&#"'632&(
 !&--<'�2 *// 21�,����/.'#"&54632654&'#'2654&#"'>32C'-
)+.7�#

+	*$!
 /�����$."&5467.547>54'7'3254&'w#0#%"	2'&0#")I"!
�#$$",
	
&$%&	
	
 * #	#F	���$.'#".5467323&454632*
		4!
1?
$�-//*4(>F�����7.'#"&547&54632.#">32#"323&54632/
58#7*"	7
#�.4#&  +	)#!�����#".'732654&#".546324)+@)
1.3%	/."%*5/72,l`bq#!2	*+ J�����"&546?3267|(@!e'n/=�'*+%t }-
�����)>54&/.54632'2654&#"?	}0''1"
=~�
c'..$%.���� �:2675#53##5#"'#"&'732654&'#'>54&#"'>32v

%�10
	/#/C"*0"
# !')+"UO,,��
"!>F28**
&$������"".'732654'#'654'#5!#z 4.*1'(I�,
%0�>84@,)
,,*'$$���.�0#632'>54#"#5#"&54632&#"32675#5!.�",)%1
!#78+	9
���R'&0
$&xK,,'.,+�,������!##5##".546;5#��!10U
���,��
 
H����#5#"&'.=#5!#32675*0#!
'(�
!��W	


"U,,Eo�����.'&54632>54'#53#E-G	
w�2/!/>�$C	
,,%.
1-���C.75#"&54632&#"32675##5#53.546323#3.#"E##67,	
�0-+92Cl'01���$H- �H
,,'.,���,	
&=0,�B !����##"#"&'732654&'.547>;-;#+$%9 )' %!1�	*'%7'
$��6a�9������:0�9'����*=<��:��9'����'*='����:�-�9=4632#"&%#"&'732672&'#"&54632>54&#"'>�kMHl"ED6:8�Qi<1'J:RD ,!$)5=0 7#$G%dSY^FFKC��MO7U M +h9
;+-,A
:���9M4632#"&%#"&'73267"&54632>54&''2>54&#"'>32.'�kMHl"ED6:8�%.", .(+*!-<;-# ?!M5GR.(%32.75%dSY^FFKC�<	"$@
A
<18 6!'>-+#9:�S�9C4632#"&%#"&'73267#"#"&'732654.'.547>;�kMHl"ED6:8`$)$+2QAAe5<#F1!)-(*-+9:W%dSY^FFKC��	-/"7@EQ 4=%*'49��B%2>54&#".54632#"&5467.54632.#"632&"#"6M~K.)"5:!QJHD.K-2]�Rab*/ZI4
#X,"#^>F?lE/>$ 3?S47H'M;:nX4S@-A+<@EA 	FF(&:a�-72>54&#".54632#"&54>32&"#"�MK/)!JIFG[2]�R`bG<
_>F?lE/>$""0"3GXW:nX4RA&A(FF(&�[x��373#�LWWP�0�����X'on5!X'GGh��)#".'.'732654&#".54632�ufDqm>):+,\@7XW5P=),12
XOBA9J$-_f.YB-/E
?E:N(F8)<E	H1+A1N����:HT"&'73267>=##".5463!5!5!.54632&#"3#"&'73267'"&54632Q�69,f>.7�6&"�I�ZH 4"-(0kg%`VC]@715-D[HEE:007GCb6*<�G3VW	E/@0G��LT!�RXB@E>^Lh���H8�&��3�g���,.#"#".'732632654&/.=7�+60B($
  0%
 7.F$)1g-25085 
35,31��[
7>32#.#"zGSy5YB4`�MCGI)/)/��Y"$+2"&'#53>323733#3267#"&'#"!.265!`w46	v\>OFEE &2P2?E&ENUE��G
��>ux.!E�>�@	$."0�XLOU�f][X`.��O#)4;"&54?54#"'>32>32.#"!#"&''26=265!�M_�an%L'+^1|(bD5R*.N2QXrqhBj#c;DRNR[5�D@��P
RN�%w@],1Hc[4o�><==FQI12;+-^FQS:����&'7.=46?33267'7654/�$E-	�`�",' �dF


%E<� r�	�$
�yJm��3#!'73454>32!!!3267#"&'#"!.2:lLdr����cV@1O.*R5g�9$k 

=�

VFzo7@@Hg`"m/>���".574632>32!3267#".'.#"327#"&"!.SD0
~_Ec5��YP3O*)P7KrC*%0##$	DC�?I>�=Gly<mI5[_M<tV  #
BDTQHDU
<��###5354632.#"3L�Xcc\R 5*,+��h�Gh[E
;? 5�
#+9E%.''.546326=467##"&54>32373"32>=4&267.#")
<
M;W^WN7Y
V8eq1aHm9
K�KJJH9CAk3?J/2,4TA+
:799!$%!&,*�{MxDSIAcXZb-O4Ua�y#����2!#.#"#"&54632332654&'&5432#"&'�X
!
3H.
X

2?3
�#D9<9
��"
B88?z�7.#"#>325.#"#>325332673#"'32673#"'#�
3<-
3<-X

3;,

3;,X$>C
p	%>D
��$@B
o	 #@B�j�3#5.546753'54&'>�X6DE5X6CD5�%$�$$�
U=<T��
V:<U
�#7
�7##6
�7U���#/9"&546754&#"#4#"#33>323>32&''26="�1@IP56ICXkKAXET0|'X4Y[2;M8#
753={FBXY��Z_c��H))Y,-]g�
6OT=&.!U��g#!+"&546754&#"#33>32&''26="�1@IP9=XFXF
\<Ya2<L8"
753=xHCb`��H*(_e�
6OT=&.!U�V#%0&'#"&546324&#"#33>32%3267&#"B08EB6)':<XFXF
[<Ya(��*!#�)"!&<45<tFAb`��H*(_e�{#2Ga!)),����)#.'5>=4&'732>54&'.K&2N)1K,	�-,+&
�+"C(+OR.%�)�� :%.J$,���"+67#.''7&'5>=4&'77.'.4&'32>K	<%H&2N)/#,%%	�-_W
t)*�	\n"C(+OR.C9%�)�$�,� :-��/ (7.#"5>327#"''7.'%4'326z�.(F E.Q7'3* �wK7'3)��#5PK�0-N(4%8$c>��&5%85aF1��p6~,!-4%"&'#"&54>32>32.#"!%2654&#"265!�=_d?r�?mFBf hD5N((M5MSdt�OIHNOHF�A<��F9568��Z|A8787MZ`5m�IghdfiedgSEJNC���+)19@"&=!.#"5>32>327#"''7&'&#"2654'267!etdSM4N()M5DifBO:!4'�rD3'4+^��$;NH�OF� ��<F��<�m5`ZM7878(/#8#b>�� 8#>59[29f��gdJ/��NJESC���$!(/6"&=!.#"5>32>32#"&'"!.267!267!etdSM4N()M5DifBFm?�r?d^>GI+HFIF��I��<F��<�m5`ZM7878A|Z��8659�VTTV�gWVWVNJES5��v#%1".54632&#"3267&54632#"'72654&#"-Lo=�u,&IPNR$=!�xMm;�wgA@�PKLPLOK
G}R��Gjc^nBZ��D}U��??Jp]_mic^o5��v9.7@".54632&#"3267&546327#"''7&'&#"2654&'-Lo=�u,&IPNR$=!�x5,7-0�w8.7@N�$LO�PK�
G}R��Gjc^nBZ��'($uM��'*?/MVi��p]2N��P7#546753#54&#"�XbXXZcXFIIGvvz_f
��	f`zvHDDW�]'3267#"&=4&+#32#32654&�B'GC?HQX�bi6//2�cd9>>VPGQC�MJ�NM7CPG��2.0+U3#33>73>HXF>1�bI��^,4UB#2&#"&#"#33>32>"
-7!:!:#XFI,&A#S
,O4��^53/!���# *2.#".'#"&546733>"3265�"	
 CV2:E1@IOFM�8"#SbPM
6	OT753=C^17�x!&.���#,62&#"&#".'#"&546733>32>"3265F"
-7!:!:#2:E1@IOFI,&@�t8"#S
,O4M
6	OT753=C^53/ �x!&.c#3267##"&'VR!W.X"+T)#

���

��_#&"&5#"&'5326763274&#"326�Sc"+T)VR!W.)91J))L)4))45('6
hX

F

��++J-0L,�)79)(97��f�7#"&'5325432.#"�CI&B�&
B�BTGPڔGPP��#'##"&53326=F
[=YaX9=WGG��H*(`d_��HCb`E��d353!533##'##"&=#3267!LXXPPF
[=YaL�9=NI����((B�H*(`d#HCONP��F#.2#"&546"&53326=332653#'##"'#��ZZX47ICXkKAXFT0|'X#  ��]g_��FBXYq�_c��H(*X+-T��J#".2#4&#"#54#"#33>323>"&54632�ZZX47ICXkKAXFS0|'W�#]g��QFBXYq�_c��H))X,,����Q#732653#'##"&=4&#"5632�9=WGXF\<Ya! !,>G�HCb`��H*(`d�*&B
JI���J����x !-"&/#'.#"5>323>3274&#"326�<FH�^�]
 1-N�\�Q4";HF%#$%�FP�����"D1.�$���H6:J�$$$#��) .5332>?'.#"5>3233267#"&/#8}a
1,O�\�]&!
':;AY&.%�O	#'�"D0/�'���+8D
JF��2<��i""&/#373>3274&#"326�-:j�c��e��c�H4%7CA""""
)�����fC36Ez!"#"��373#'#Թd��c��e���c������<��j"373>32#"&/	4&#"326�U�d��c�I4%7CA:-;g��J""""�����fC36E)��<`!"#"�y�5332>7373#'#�8
׼e��c��e��+-"�O%#Y
�������.=P�"#"&'5326=467##"&53326=3t{:b*,g9JF7zYaX9=WGXoyROG	*U`d_��HCb`V����
#"&'33267#.#"#>32�QHJK62.'9779'.26KJHQ�<JI=)'��')>HJ7�]� %"'5326=4#"#33632
M8/99#P:?-�+�Q;:��}"49=��)3���.#.#"#"&546325332654&'&5432#"'�9		"/9!)!		)"$"��

'""%��.#"#>325332673#"'#^
!%9 %
9�#)��#*��g326=3#'##"&=4#"5632�M8.9-	;':?+	
).�T;:���+:<0',,Up332+!#!254&+�X�h\fn��Xm�x=:��QIOW�3�,_2'�S��"#2!3267#"&'##33>"!.&Ec5��YP3O*)P7n��XX�~_?I>"<mI5[_M�}��m{HQHDU.��(#.52>32!3267#"&'#"&'73254&#"5>"!.�Bi b>Ec5��YP3O*)P7Fn!!lC(M@�ML+DA�?I>#2414<mI5[_M4351I	�ag
NIQHDUO���#)632#"&'#"&53326532654&#">bMn:�xElbNgcX:FCQ[KQPKLPLO)3E}T�?84Cad^��IEYa ��^rs]^qk7��Y"*23>32.#"#'##"&546"326=4&?P2& FO>dyxrHGGGYBE"/#/#@�^E!.����Ij`_qkd^]+8#!"#53.54>323#5>54&2OWA:܆5?9mOOl9?5��;AW�dS\wAA"y[Cj??jC[y"AAw\Sd7�:��'47"&546323.=3!!3267#"&=!'#'26=4&#"!dxyd>OX���#0
<9��
P1UEBYGGG9��
����.!
3��B�n�4IE@AH"0I]^dkq_`j��9��5I3".5#5?3!>32.#"+3267#".=72654.'.5467#3�*G,LM#4*1U%"J'69<43H&tb<$(
!,E'�C<954J(	�/%HA.*#r{F#(9+NF00C	IA H $  (8, ��1/���,32673#"&'#'##"&'732>=&#"#>3253H	32)H
S8"
 
*G+21*X3;E�b,@Q-Q6!;E��`!3>?3#'.'##'.'##3�
	>A`;0
>><
1;aC�./����64��05�A<���353#5#<d<<d>H�HP���##53�d<<>BH�H����&KKX��
�&KNX���&KQX��e�&K'KXN���]�&K'KXQ�U����'".5#575.#"#4>323#32671*G,LM?'<6X5[:Mj��/%*
4
HA8*#`=6��ABS'91{D��1/C	3��2�R"&'532654.'.54632&54>323#3267#".5#575.#".#"�8Q [/C<954J(oZ&$.L.GX��/%*
4*G,LM
.!+.
"J'69<24I&t
P+$  (8,DJ 6G$90{D��1/C	HA8*#`4(.F#)9+NP�|K
>;#"�|"t�Vj�)KCR'A:A��K�
2#.+5W�t"F)�k'RCA:A�_�
.#"#>322g9<93]H8f2~!D<`��
32673#"&'2g9<93]G9f2�!C=���$!5$��AA���!5��AA���Y!!����NA�w���
3;#".�wF)�jV�tB@;A'S������
+53267�"t�Wk�)BBS'A;@���������� ���
32673#"&'2g9<93]H8f2!C=���$�C!5$�׽AA���C!5�׽AA���Y�C!!����N�A�f��	#"543!</9^�34A���-	5!632#�9)/"�A&2)�E��+;JV^bfosw}����53#%53#5!53353353#53#53#"&5463272+"'5326=3%32654&#"2654+#53#5332654&##53#53533!5353!53!53353)�^֔5�d�;�:��55��66G>BB>>BB>}575.e	
=6�� "##" G+�T66j55�B$�55��6666^x_5������;�Q�6^^6�^666666�㄄��BQQBCPPL ) "',��2��1.�-33--33?���6K�򄄄���_55_�555555)�d��+	467>54&#">32332654&#"��5�6�!++\P*X"(!>!%!gt())(��6�6�d#=1CJW#7'�##%b�Bv�#"&'532>54&#"#33>32�%&/LZHQ!ZG?K%q�l�L1+�[P5`?�N�\.tz� d`��a�B��[��o�%"&=3326=4&#"#33>32b��ZYY\RLZHQ!ZG?K%q�:w
�w

W`gQ�[P5`?Jb\.tz�JwE.Zb�	#/>73#"&'332673"&546323"&54632�W410FI70*#6	9Q��L,
5pF7!7Fw.Zb�	#/#.'5#"&'332672#"&54632#"&546�14QDFI70*#6	���,5
b7FF7!�4Z\�	
%#5>73!52#"&54632#"&546*41W2��7��5,�GGf4Z\�	
%.'535!"&546323"&54632�4W�(��A5
,eGG���a���&1|���a���&3|���$~�&&����a�$��&*����(�$*�&.�/��Z�$��&:��a��33aZ�6��a��_�&���Z#�&�x2�����*�&���������8�&���������8�&����������&�������&�l�n���
"&>73#"&546323"&546323V9i2:;(��Z�G"
21}���6��\��&��4���Z�P��&�����
��&�E���G��#'>54&#"56323�.#6$+%
%<B�Z&)5U4,�R�6����*�&��������#W&�������<�$��&����<�$��&������G�&���������HF�&��������B�"&'532>53�#55-ZfL
2-��gb������&�D���a��N�&1��a��:�&3���#���&Q|��U�"&S|�.�$�!.9"&5467#"&546?54&#"'>32#'#3267326=-52I`~�[:5*L!#`4b^@+--dM7+DZ�2,=MRPW C4BV^��L*F)-8�83-*KN0��7�$"&J��O�$&"&5467"#"&5332653#'#3267D52"abYwYEXH
$//-�2,<]f_���d^��G!$@!-8J�<33JX<���E&
��k�����&
��P���� &
��O�����&
��O��B��&
�������&
��U��J��<&#�����
�&
��X���$�<&
�����0�&
��Q��<"&'532653w,)).)WV		I34��p_V�����&#
��>13#'#.'3�c�`9�<�8�>�£��0.���&%
����&%�F$��"&%�;$���&%
����&%
�����&%�M$���$>&%�8��U&%�v$���&%&
��
����&%�+$���<%##!#3#3!#3[�Ea�������'r���<G�F�G������&0
�]J�<2+2654+254&+�sh<18As_ŸA8�Yj}@Dc<JG4@	
=?RS<�-,V���e,2�.���D"3267#".54>32.FZb]^%E!?YYv;C}VXKB�wegu
MJ�XV�K$G��.���&3
�-��.���"&3�g$��.��D&3|���.���"&3�i$��.����&3
��J<+324&+32������[fbSH�%��<��hi�V<35#5332#5254&+3#J>>������fbShh�A����I�hi�A���J"&9�P$��<:J�<!#3#3!JH����<G�F�G��J�&=
����J�&=�-$��H�"&=� $��J�"&=�"$��J��&=
����J�&=��$��D�&=
����J��&=�4$��J�$�<&=�{J�<	!#3##JG���W<G�G�/��C%#"&54>32&#"3275#53+g9��D�aeLFNejhd=-����V�L#G!zbmp�G��/��&H�}$��/��"&H�r$/�#C'%#"&54>32&#"3275#53#5>73+g9��D�aeLFNejhd=-��!0W��V�L#G!zbmp�G��7859��/���&H
��J<#!#3!5W��WW<����<��S<##!##5353!5335!SFW��WFFWWF�����[��?XXXX�__��J"&M�]$%�<357'53%AA�AA2�44�I2��%*&P
������-&P��$����="&P��$�� �&P
��k��%�&P�9$�����&P
��q��%�b�<&P[#����&�&P��$��%�$�<&P�����J&P��$���b�<"'532653,.)WV�
D34-��_V�����b#"&[��$J�<3>?3##JX
�d��e�@X<��"���3�J�#�<3>?3###5>73JX
�d��e�@X!0W<��"���3�F7859J�<!!����<�
I<��J�&_
��qJ�<!!#5>73����Y0
W<�
I<
6957J�#�<!!#5>73�����!0W<�
I<�~7859��J�<&_�����<
%!5'737���3%XWv&�II�";7�M:c�J�<#4>7####33�R�L�Oy��<��g1*
� �
+2��<�0�J$<###33.5$k��Ok!<���Q ��<�2N#H��J$&f
�-��J$"&f�p$J�#$<###33.5#5>73$k��Ok!_!0W<���Q ��<�2N#H�~7859J�b$<%#"'53267##33.53$WM-(*��Oi#O_V
D),�Q ��<�HO#1��J$&f�Y$0��HE#".54>3232654&#"H:v[Zx;;xZ[v:�DU[\TXX[UX�JJ�XW�JJ�Wdxxdhsw��0��H&l
�1��0��H&l�x$��0��H"&l�n$��0��H�&l
���0��H&l
���0��H"&l��$��0��H�&l��$0��HT!*#"''7.54>327&#"4&'326H:v[U:"0#(';xZ,I&/'&%�D�)<[Wb�%=]UX�J#1"1'sIW�J48&qG.LUxc/H��y��0��H&t
�3��0��H&l�]$0���C%2!#3#3!#".54>"3267.7.5�����-Vu;;uZXVUX%
%CG�G�GJ�XW�IIufhu�J�<
2+#2654&+�kjplGW�AK>AK<XTUb�<��.=55�J�<+#3322654&+�plGWWNkj�AK>AK"Ubk<nX�.=55�0�xHE#'#".54>3232654&#"HMU�vlZx;;xZ[v:�FT[]SWX[Ud���J�XW�JJ�WdyxehsxJ�<2#'##2654&+��6;�c�gW�;BDAG<�7P���<��047-���J�&{
����J�"&{�2$J�#�<!2#'##2654&+#5>73��6;�c�gW�;BDAG�!0W<�7P���<��047-��7859)���D'%#"&'532654&'.54>32.#"�nb7P"M\5BCAHN4Y8/S#$G 1;;)-F'�J\P$-*++FE2E$E*'$(;��)���&
����)���"&�$��)��D&|p��)���"&� $)�#�D'3%#"&'532654&'.54>32.#"#5>73�nb7P"M\5BCAHN4Y8/S#$G 1;;)-F'�!0W�J\P$-*++FE2E$E*'$(;��7859E��,D$#"'532654&+57.#"#4632}^QmbT6B%7F?Yn
6*>CXrfWb=TGJ[L0-248~ $MJ��hhsKF�<###5��W�<K��K�<#3##5#535#5��ssWss�<K�C��C�K���"&��$����<&�|q�#�<###5#5>73��W�!0W<K��K�~7859E��<%#"&5332653xpmuXIFDGX�gushi��IMMGg��E��&�
� ��E��&��g$��E��"&��\$��E���&�
���E��&�
�
��E��"&���$��E���&��n$E�$<$3267#"&5467#"&5332653p-52.!(muXIFDGXF-,t-82,$Cshi��IMMGg��p:;E��E��U&���$��E��&��L$�<33>73��`|
|a�<��#28v���<.'#3>73>73#�
b_�VV	
[U]	
]U�_k ;9��<��#PC(Y��"H,*
n�����&�
�x���"&���$����&�
�\���&�
�b�<7#373#��b��`��a��d��'�����<#53�Y�`��<����b�����&�
�����"&��$����&�
�����&�
���<	35!5!!/�����78�I9�FI���&�
�����"&��!$���&���$2J��!!2�6�Z��a������&�l�n�����B���a���6��&�*#".5467.54>732654&h�O?2cj�qGp?dY!8!O���)M1QIMRO� 0w^r|5hKZv$1#4B(
��
,O@HVWMJV��a�����a������f��&�B�>����&�l�n�?z�3?;��T��"&'532653X"
#(:B	.)>��>;��"��#����Ih#�2��/�#���'�S�#�
���X#����0�S�����(������� �]����%��������"�T�#��6��#
".54632'254#"$Pj4{vPi5yw���J
G~S~�F|S�J���dj6#!#467'736Y	 c+�J>'K
I;�,�#)57>54&#"'>32!��6�4?;>)T).3oA\g#C1�?G�%1/ ,4 "=,%UI-D<"e�S�#(#"&'532654&+532>54&#"'632ƋSN�v?Y'$^4SYg[=>0O0H53I+(V~\uw� 
RJdoOJD>:J9048<E[�X(#
%##5!533'467#3(mV��IZm�����:�5�,M)
1 ��;�S2#"&'532654&#"'!!6k��}7_#/]/Q_\RD!(j��?ghqrPHLGG		UN�8���'462.#"3>32#".2654&#&8��,.� Y4dnxlQm6�CKGB(H,%D/��I��./thm�P��URFO&=#,U6�]�!5!s����nM8�}1��
�(42#"&54>7.54>">54&32654&'^x%>%,H+ks|)D'4I8`<7G#<$4GF�JMIMPVBE�XS+@15F1Zie[1H4UB7K(G52%2#>625�(4EE73E!I/�T#(%#"&'53267##"&54>32'"32>54.��03t�VAam7gFq��DJGC(F-"C���I��2.qgHk<�RVLHM!<(-R37���
#"&54>3232654&#"0hVys/hUxv�~CQPEEPQCfs�Xít�W���������#�467'73#�L.�IV�+4>;��6&��357>54&#"'>32!&�6J&F84O)/*mDdt.R7�iI�6TQ0;=$ ;#1eY8b_6�P-���*#"&'532654&+532654&#"'>32�PDVT:y_8`,-h0`Ui_EFX[F<:R(,&qHpm#HU
XG>a6RKBC;KJ=49"<,d(�
!5!533#467#!k��P[hhU
 ��K�#O��4M2��?���2#"&'532654&#"'!!>n��~7a!$g/OaV]H,f��:�ndoSKOFK
QP�7��
�,4>32.#"3>32#".2654&#"7G�e3-E\5R@]r{hDnA�?NEE/F'"D1M�yHK.Ph;#1qhp�D��QUDP'< +U7��3!5!d%���zPD�z:���(5"&54>7.54>32>54&#"2654&/)s|)D'4I8`=^x%>%,H+j4GF:7G#<!IMRDBEJ
e[1H4UB7K(XS+@15F1Zi�>62552%2#��E74EI74E2���,#"&'532>7##"&54>32'"32>54.G�e5'1F[6SA\q9fEDn@�>OCF0F'"D�M�yHK
.Oi:"1qgKl:E��RTDO&< +T81���
#"&54>32&#"4'3260hVys/hUxv�~"\QC)��?3PEfs�Xít�W��,$e��7+��::�����J���`��%��}�`��3�v�`����A�w�`��
U���`����@���`����L���`��C���`����E���`����I���`��J���~��%��}�~��3�v�~��A�w�~��
U���~��@���~��L���~��C���~��E���~��I���~���B
74673#.<:N;99:M;;�e�FJ�`^�LD����B
7#>54&'3�<;L:77;M>9�d�CL�^`�JI��>26=467"&=4&',2I^+1',*)1+^I5)�$%z>=A$s.21/v#@:Bv'$� >%#5>=4675.=4&'523 )4K],0*))*1+\L2+�$'vB:@#v/1/1s#A>>z&#<��B3#3#<�kk�B>��=��B#53#53�k��k>�==5���<3#4632#"&9aC<�m}6�u��#"&54632#3�aC����
��ZD'7467>54&#"'>32#4632#"&t+#!	4):E)L.PZ21!D�,=$!&'#=JC4E!*+}�ld�'#"&54632327#"&5467>=3,#!	4):E(M.O[21!D��,<%!&'#=JC5D!*+��5��f<'���*��'57�ff;��a��!��*��?'7hh;��K��"�
�]���#2.#"3##"&'53265#57546� 4)+)��WP# *(iiX�D.>ED�*aOI,;�)AhN�R�5!!5!		#!'!�����6��=��K���9�U�N�77���?���w�:>N��!#533�����BnB�-�PN��	!'#5353�����BĪB���PN��	!5#533�����B��B��K�PN��	!#5353�����BbB��P1�373��?�C�� �P��373#��=��BB�� �P���3733��?�sB���n�P��	3753#��>��BB���?�P���	3773#5��>��BB���z��P���	3753#��>��BB���0�P@"1�3'753��,�CĻ1���P&��!'773���-��BU��/���P"��!'73���,�nBƸ2���P(��	!#'7353���0��Bɳ/���P&��	!5'73���(�kBsK�4����P&��!73���.:B^.��2�P1�3573��<�Cw!�x��P��!73���<��B�x �x��P��!'73���>�hB���iS�P��	!753���>��B���},W�P��	!5#733���;��B���7�P��	!773���<��B$��I�1�P1�373��8�C$i#��
�P��!73���4��B/��i&��
�P#��!73���:1B�!��&�P��	!7753���4��BƤi%���P��	!5'73���:�yB��]"��y�P'��	!#733���8��BFG#��(�P1�3'3#S?�CC��P���3'3##V?��Bs��Pn��3'3#K=�BB��� �P���	3'53#'X>ԠBB�����P�z��	!5'3���>�Br���w��P��	3'3#'X>ԠBB�����P�N��3533#N��BB�Bn�P�-N��	35353#N��BB�Bf�P��vN��	35373#5N��BB�B��P��N��	35353#N��BB�Bq��P��1�3'53#N<�CCRF�P���3'73#U>נBBh���PSi��3'3#N<ܠBB� �x�P���	3'353##N;զBBw��P���	3'3#5P>�BB�����Pa-��	3'3#'N<٣BB��$�P1�"1�3'73#5N,�CC1��P�"��3'73#N,éBBn2��P��&��!''73���-ȠB��/��U�P&��	3'753#N(ȠBBk4�Ks�P��(��	!5#'733���0��B��/��P&��!'3���.hB2��.^�P1�3'3#N8�CC#i$�P
#��3'3#]:kBB!��P&��3'3#N4ҢBB�&i��/�P
��	3'753#P:˭BBy"]���P�y��	3'3#5'N4ҢBB�%i��P��'��	3'33##_8��BB�#e(�PF%1�3'73�.�CS�3��P'��!#'73���/��n�0��P.��!'73���'ɗB7q2��*�P%��	!''753���-ɠB���2����P%��	!5'73���)ɠBr�x3��s��P%��	!'73���*ɠB9�3����P1�373��>�Cv�G�P��373#��=��BBu�C�P���3733��>�mBv��n�P��	3753#��=��BBu�9�?�P���	3773#5��>��BBv��z��P���	3753#��>��BBv�!0�P@N��!#5373�}æ�BTnB��PN��!#533����vB�B���PN��	!5#533�����B�OB����PN��	!'#533�����B-�B�#�P1�3573��:�C������P��!73���9��B�|�#����P��!'73���:�mB���xcS�P��	!753���9��B���"��@X�P��	!5#733���:��B�����P��	!773���:��B2������P%1�3'73��.�C+�1�&�P'��!'73���/��B/���0�$�P%��!'73���-�jB2�1�� �P%��	!'7753���/��B͠�/����P%��!573���.;B�i1����P"��	!#'733�Ȥ0��BF�-�(�P"1�3'3�<�C���P#��!#'3�t�;��n�9�P"��!'3���<̠B�� �P"��	!''53���<ɣB���p�P"��	!5'3���<̠BM����[��P"��	!''3���<̠B*���P'1�3'73��-�C�3�S�P%��3'73#��-}�BB�2s9�P�'��3'733��-��B�3�n�P%��	3'753#��-��BB�2y�^�P�%��	3'773#5��-��BB�2����P�%��	3'73#��-��BB�2�8�P1�3'53�:�C���N�P?��!'73�m�:��BSc��T��P��!'3���9ҠB���#��U��P?��	!#'353�r�:��B�c��P��	!5'3���9ҠBXo��#�����P��	!''3���9ҠB%��#���PN��!#533�kե�B��B�PN��!'#533�����B�B�N�PN��	!#5353�uˣ�B��B0��PN��	!#5373�����BB�B��P%1�3'73�.�CB�1��PG��!'73�j�,��B ɰ0�2�PG��!'73��l.��By1���1�PG��!'53���,GB��0ip�PG��	!5''73��},��B���0����PG��	!#'733���,��BF�0�(�P31�3'3�6�C2�%6�P%��!#'3���6��n��$6�P%��!'3���6җB�$6�*�P%��	!''53���6ɠB���$6���P%��	!5'3���6ɠBr��$6�s��P%��	!'3���6ɠB#�$6���P1�373��7�Cd%��0�P��373#��7��BBd%��P���3733��7�{Bd%��n�P��	3753#��6��BBd%��r�P�����	773#5��7��BBe%����P���	373#��6��BBd%���P%1�3'753�.�Cٜ2�x�P%��!'3���&iBY��26�P%��!'73��p2��BЊ-�\�P"��	!#'7353���0��B�-ň�P%��	!5'73���*ɠB�9�3�����P%��	!''73���-ɠB9��2���P-1�35'73�-�C��2���P*��!'73���.��B���.|��P*��!73���.6BX.��T�P*��	!'753���.��B���.�5v�P*��	!5#'733���0��B��-��P+��	!'773���-��B/��2��&�PN��!#533�qϧ�B �B(�PN��!#533�����BFB� �PN��	!#53753�vʯ�B�|B���PN��	!5'#533�����B��B��P)��WC*4"&5467.54632673#'>54&#"267'�YfA=##UIEQA7�'U
-rm?&VA)0)!$)!)C�'4?UI;K!!>(;DA=1F�3L4]#o?"%e0"#$ 0���/,.4����4632#"&74632#"&���Q���"&54632��tu^.'53@;q+.u8877�r�#5>73�29:#"j9947�u!
>73#7>73#�9g686�9g696�P,83P,83~r�#&'#5>7\@#:;487;,+
P&/:=,58~r�#.'53673�-*
h@#;86::67 P&
4<,�p��
#"&'33267�SGIQ86,)7�BKJC-+�Y�7#"&546324&#"326�A24@@42A7""!"�4<<33<<3    nt��#".#"#>323267�>,'$"4>.'$#�BB!#AC""�z��!!�0���E�$�3267#"&54>7Y-52+0""t-82,6, 5������:s��U�����������$�&������"&'53265#53533#&  *KKXKKH�G#1KG��G��KU����"&546;33#'26=#"(<K@I+XKK%;*&#�B47C��HBIH$+���pa7"&'532653	

9/�+t��-3������7��p�#3p99`BU�:;33267#"&=#�,
#1@5�1�#E=J?�a##5#5353�19119�*��*������a7"&546;33#'26=#"'1*/9112'
�' !(B��+<)+
����H8&������P�P�&���
�3#5#53533#�XKKXKK�G��G7pa#p9a��B ?33'3# q�rnC\C��1��o�?"&'7326737>7#A(.
��y%?]47
iB�	5#/�� JC*MA<���p�"&'532653	9.�+t��-3������&&N��
����&&7&O��N���
����&&A&���N���
����'&�&O��'{���Ny��
����'&�&���'{���Ny��
����'&�&O��'B���Ne��
����'&�&���'B���Ne��
����'&-'OS�$&���N���
����'&.'�/�#&���N���a���&-N���
����'-�&O��N{��
����'-�&���N���
��t�'-Y&O��'{���N>��
��t�'-Y&���'{���N>��
��`�'-E&O��'B���N*��
��`�'-E&���'B���N*��
����'-�'OS�$&���Nq��
����'-�'�/�#&���Nr�����&dN���
��q�&dn&O��N;��
��{�&dx&���NE��
��4�'d1&O��'{���N���
��4�'d1&���'{���N���
�� �'d&O��'B���N���
�� �'d&���'B���N���
��g�'dd'OS�$&���N1��
��h�'de'�/�#&���N2����B���
Q�'��O���
[�'������
�'�Y&O��{����
�'�Y&���{����
�'�E&O��B����
�'�E&���B����
G�'��'OS�$���
H�'��'�/�#���
s�'��{���
_�'��B��7��Y�'EQ'>54&#"5>32'53#"&'33267"&546323733267#"&'#'26=4&#"�(
,3+�_j0QHJK62.'9v`zwg8T
F %1S*SECVIG�8#)#0�
�<JI=)'�����.%I�^@	$.$.I_gdjke�7��Y�'EQ'>54&#"5>32573#"&'33267"&546323733267#"&'#'26=4&#"�(
,3+@0j_AQHJK62.'9v`zwg8T
F %1S*SECVIG�8#)#0�
�<IH=)'�����.%I�^@	$.$.I_gdjke�7��Y�'EQ.54632.#"'53#"&'33267"&546323733267#"&'#'26=4&#"�+4+
�_j0	QHJK62.'9v`zwg8T
F %1S*SECVIG�0#)#8�
�<JI=)'�����.%I�^@	$.$.I_gdjke�7��Y�'EQ.54632.#"573#"&'33267"&546323733267#"&'#'26=4&#"�+4+
10j_JQHJK62.'9v`zwg8T
F %1S*SECVIG�0#)#8�
�<JH>*'�����.%I�^@	$.$.I_gdjke���7��Yi&l&�f&OH^{�^��7��Yi&l&�f&Oh^B
^��7��Yi&l&�f&�0^{�^��7��Yi&l&�f&�O^B^����6�&t�����6�&t�����6�&t������6�&t����6�'7'>54&#"5>32'53#"&'33267"&533267#(
,3+�_j0QHJK62.'9OHX* 
&�8#)#0�
�<JI=)'�UK��{1#G��?�'7'>54&#"5>32573#"&'33267"&533267H(
,3+@0j_AQHJK62.'9OHX* 
&�8#)#0�
�<IH=)'�UK��{1#G���6�'7.54632.#"'53#"&'33267"&533267%+4+
�_j0	QHJK62.'9OHX* 
&�0#)#8�
�<JI=)'�UK��{1#G��6�'7.54632.#"573#"&'33267"&533267C+4+
10j_JQHJK62.'9OHX* 
&�0#)#8�
�<JH>*'�UK��{1#G�����6i&t&��&O�^{L^����6i&t&��&O�^Bm^�����6i&t&��&��^{X^����9i&t&��&��^Bw^��O���&��R��O���&��R��O���&��RO���'@'>54&#"5>32'53#"&'33267".5332654&'3�(
,3+�_j0QHJK62.'9xCQ)X53HOX��8#)#0�
�<JI=)'�#AY6/��9M(rxFn<;oJ��O���'@'>54&#"5>32573#"&'33267".5332654&'3�(
,3+@0j_AQHJK62.'9xCQ)X53HOX��8#)#0�
�<IH=)'�#AY6/��9M(rxFn<;oJ��O���'@.54632.#"'53#"&'33267".5332654&'3�+4+
�_j0	QHJK62.'9xCQ)X53HOX��0#)#8�
�<JI=)'�#AY6/��9M(rxFn<;oJ��O���'@.54632.#"573#"&'33267".5332654&'3�+4+
10j_JQHJK62.'9xCQ)X53HOX��0#)#8�
�<JH>*'�#AY6/��9M(rxFn<;oJ����O��i&�&�q&OS^{�^��O��i&�&�q&Os^B^��O��i&�&�q&�;^{^��O��i&�&�q&�Z^B^A��6�$1".54>32">54.4&'326;;]@"/O_09Z5!4u<p>=4"as;!3v1+*rL%F5SN
"S�p|�V!%K;'_+*�Do@�=ye	*8<(/�18K 	hm)a7��"*5.54>74632>54&#":JuD7';-0/N.UI>X0K{H3R0<0"��:xb6hV2zFIW(4[TAoEk�A�/3eP^O,*��>%��J�<2J}<3!#J3�<G�>353%!.'�c�l.w	3��6IC0.��J�<=���<���J<M0��HE".54>32'2654&#"'53=Zx;;xZ[v::v\\TXX[UU�J�XW�JJ�WX�JKxdhswddx�NN��%�<P��J�<]�>13#.'�c�`�
�>���0.�u��J�<e��J$<f-�<5!5!5!Bc������GG�FF��GG��0��HElJ<3!#!J�W��<���
��J�<x���<
��<357'5!#*'26;����?��&G(�;��<H��I���<����<�0�<%!5.54>753'>54&'5Of9/rdWer.:fMWaKR�[OK_H*BM%9c@77>d:'MB(H�7SCFVWEDR���<�Ep<!5.=3332>=3/m}W%B,W,B%Wuu�vw��?J]��J?��wv�0TD%353.54>323#5>54.#"0w.E?yUXx>C/w�-6&N><N%6,I!pYO{GGzOZp!ID)FM2:Z44Z:2LG)D��%�<P�� �&P
��k�� �&P
��k���<�����&�
������&�
����0��HEl��0TD
���>%��J�<=��J<MJ�@�<"&'53267#3>?3=c#T3EY�@XX
�d��(�	=3B3�<��"������>%��>%��>%��>%��>%��>%��>%��>%��>%��>%��>%��>%��>%���>&%<����>&%<����>&%<����>&%<����>&%<����>&%<����>&%<����>&%<����>&%<����>&%<����>&%<����>&%<���J�<=��J�<=��J�<=��J�<=��J�<=��J�<=��J�<=��J�<=��J<M��J<M��J<M��J<M��J<M��J<M��J<M��J<M��J<M��J<M��J<M��J�<&M<���J�<&M<���J�<&M<���J�<&M<���J�<&M<���J�<&M<���J�<&M<���J�<&M<���J�<&M<���J�<&M<���J�<&M<���J�<&M<���%�<P��%�<P��%�<P��%�<P��%�<P��%�<P��%�<P��%�<P��%�<P��%�<P��%�<P��%�<P��%�<P�� �&P
��k�� �&P
��k�� �&P
��k��0��HEl��0��HEl��0��HEl��0��HEl��0��HEl��0��HEl��0��HEl��0��HEl��J�<x��J�<x���<����<����<����<����<����<����<����<����<����<����<����<����<�����&�
������&�
������&�
����0TD
���0TD
���0TD
���0TD
���0TD
���0TD
���0TD
���0TD
���0TD
���0TD
���0TD
���0�TD&
�<���0�TD&
�<���0�TD&
�<���0�TD&
�<���0�TD&
�<���0�TD&
�<���0�TD&
�<���0�TD&
�<���0�TD&
�<���0�TD&
�<���0�TD&
�<���0�TD&
�<���>&%P��>&%P��>&%P��>&%P��>&%P��>&%P��>&%P��>&%P��>&%P��>&%P��>&%P��>&%P��JV<&MPW��JV<&MPW��JV<&MPW��JV<&MPW��JV<&MPW��JV<&MPW��JV<&MPW��JV<&MPW��JV<&MPW��JV<&MPW��JV<&MPW��JV<&MPW��0�D&
�P���0�D&
�P���0�D&
�P���0�D&
�P���0�D&
�P���0�D&
�P���0�D&
�P���0�D&
�P���0�D&
�P���0�D&
�P���0�D&
�P���0�D&
�P���%,&PBU$�� �&P
��k��e,&PC�s$���,&�B�$����&�
�����,&�C�$��0��H,&lB�$��0T,&
�B$��,&%B�$��J�,&=B�$��J,&MB�$��/&%O�$��/&%�p$��/&%&O7${�$��/&%&�${�$��/&%&O@$B�$��/&%&�$B�$���&%'O�$�*��&%&�x$�+���,&%{b$��,&%B�$��'&%�+H���&%
�����&%
�����>&%<����,&%&{b$<����,&%'B�$<����/&%'O�$<����/&%&�p$<����/&%&O7$'{�$<����/&%&�$'{�$<����/&%&O@$'B�$<����/&%&�$'B�$<�����&%'O�$'�*�<�����&%&�x$'�+�<����'&%&�+H<���J�/&=O�$��J�/&=�W$��G�/&=&O${�$��F�/&=&��${�$��J�/&=&O'$B�$��J�/&=&�$B�$��J�,&={I$��J�,&=B�$��J/&MO�$��J/&M��$��J/&M&OY${�$��J/&M&�5${�$��J/&M&Ob$B$��J/&M&�?$B$��J�&M'O�$�L�J�&M'��$�M�J,&M{�$��J,&MB�$��J'&M�MH��J�<&M<���J�,&M'{�$<���J�,&M'B�$<���J�/&M'O�$<���J�/&M'��$<���J�/&M&OY$'{�$<���J�/&M&�5$'{�$<���J�/&M&Ob$'B$<���J�/&M&�?$'B$<���J��&M'O�$'�L�<���J��&M'��$'�M�<���J�'&M&�MH<���%�/&PO%$��%�/&P��$����"/&P&O�${`$����"/&P&��${`$����,/&P&O�$Bj$����,/&P&��$Bj$����I�&P&O#$��������J�&P&�$�������,&P{�$��%,&PBU$����J'&P��H����3�&P
��l����)�&P
��t����,&Py�$$��e,&PC�s$����I�&P'����l�p$��0��H/&lO�$��0��H/&l��$��0��H/&l&Oi${
$��0��H/&l&�E${
$��0��H/&l&Or$B$��0��H/&l&�O$B$��0��H,&l{�$��0��H,&lB�$��J�/&xO�$��J�/&x�\$���/&�O�$���/&��S$���/&�&O${�$���/&�&��${�$���/&�&O#$B�$���/&�&�$B�$����&�&O~$�
�����&�&�[$�����,&�{E$���,&�B�$���'&��H����&�
������&�
�����,&�y�$���,&�C�$����&�'�
�l�$��0T/&
�O�$��0T/&
���$��0T/&
�&On${$��0T/&
�&�J${$��0T/&
�&Ow$B$��0T/&
�&�T$B$��0T�&
�'O�$�a�0T�&
�'��$�b�0T,&
�{�$��0T,&
�B$��0T'&
��bH��0�TD&
�<���0�T,&
�'{�$<���0�T,&
�'B$<���0�T/&
�'O�$<���0�T/&
�'��$<���0�T/&
�&On$'{$<���0�T/&
�&�J$'{$<���0�T/&
�&Ow$'B$<���0�T/&
�&�T$'B$<���0�T�&
�'O�$'�a�<���0�T�&
�'��$'�b�<���0�T'&
�&�bH<���>&%P��,&%&{b$P��,&%'B�$P��/&%'O�$P��/&%&�p$P��/&%&O7$'{�$P��/&%&�$'{�$P��/&%&O@$'B�$P��/&%&�$'B�$P���&%'O�$'�*�P���&%&�x$'�+�P��'&%&�+HP��JV<&MPW��JV,&M'{�$PW��JV,&M'B�$PW��JV/&M'O�$PW��JV/&M'��$PW��JV/&M&OY$'{�$PW��JV/&M&�5$'{�$PW��JV/&M&Ob$'B$PW��JV/&M&�?$'B$PW��JV�&M'O�$'�L�PW��JV�&M'��$'�M�PW��JV'&M&�MHPW��0�D&
�P���0�,&
�'{�$P���0�,&
�'B$P���0�/&
�'O�$P���0�/&
�'��$P���0�/&
�&On$'{$P���0�/&
�&�J$'{$P���0�/&
�&Ow$'B$P���0�/&
�&�T$'B$P���0��&
�'O�$'�a�P���0��&
�'��$'�b�P���0�'&
�&�bHP���H��&���( ��B��)��O��)[�O��L�����L��&��{���)d�&O�B����L��&��B���(��'Oq�$��(~��'�M�#���^�y���^�C��(w�y'��l���( ��{��( ��B��(^�����)c�&O�{����(^�B���^�C��)[�O��)[�O��L[����)[c&O{���L[�&�{���)[d&OB���L[�&�B���([��&Oq���([��&�M����^�y���^�C��(w�y'��l���(^�{��(^�B��(���$��Q���/�����&�'#�2_����x&�2_����x&�2_���6�n&������6��&�'�������@3n&�0���@n&�0����cn&�A���B�n&����H8y&�'"��@���H8�&�'#3�@���H8n&��@���H8�&�'$3�@����'y&�'2_"������&�'#�2_�����&�'$�2_�����&�'%�2_���^on&=A���:�n&>����+y&�'"�2_����]n&������@�n&�S�����n&������@�n&�l���6n&��������n&�$~���@n&�2���@Xn&�A�����n&����1Hn&��.���x&������n&�L��*��vx&i����Gn&������In&	����.���x&
E�����dn&�����O�n&q����;n&����(���x&�V����Qn&�����n&3?##"&'.'.54632>54&'#5!2675#4632#"&KQ:'*]!)o=68cL"%	����'@"�
4��!  !'��
	
4n161dX$";0GG�	�.*>��""!!�"n7C%>54&#".5467.5467>;5!5!##"6324632#"&A$.:AEIGF6[c;)���"h�	/6EW)DA��!  !E$ &+90:G55G|M&;4"(
VGG�*C&:L�""!!.���xEP##"&'327&54632.'#".5467.5463232675#5!654&#"oQG22S /24/(),&:1
;Z2E1,.QL>Y.)+.O&Y��*!K"("*'��E
5$) 4 
))=)G+7IG.5H:;0B�GG1!51:$"���n*%4&'7!5!5!###"&'.'.54632>U`h�)�hQ�".
<69-J"!2b)6F+(-�/JCnGG��rN03B

F< #.�g�.54632.#"�YB 6&(*g#L$CC
B	-#!?$�.����73'�.�(�;uӥ��&��wn,#>;#"#5#".54632.#"3267!5!j�6'@3.4QG2/S2nX91:@=(,E��j'�G��$&M9P^I4/53*#G�n%@%#"&'.54632>54'#5!!3267'#".54632.#"3267�)bIl�b"%����	F>F�c3X/N./K+`O6%077*#:J*k}#-";4)GG.R`TZ!K'F.IQE,,+)�(n#".546;5#5!�7&"('��*<�GGv�n)3267#"&5467.547#5!#632&"#"�8,6I) bIM`(.
4n�+"#19
*'+<4QC4F*GG!%(F)�����n&�*�v�n!!#"&54675!23#"3267��f�5I0Mc�%$ :G:&3InG��'VG3HF1/++-�nF5!2>54&#".54632#"&5467.54632.#"632&"#"�]M~K.)"5:!QJHD.K-2]�Rab*/ZI4
#X,"#^>'GG�?lE/>$ 3?S47H'M;:nX4S@-A+<@EA 	FF(&PKn!!#"'#".'732654&'7!K��<�)$,)C(5`X*G.d: )=-nG�P-.>=�w��"(,N@��WnI%".5467>;5!5!##"6323267#"'.'.5463232654&:/@93`��u�	.7*#='%3
4)	SK?"!9h-;E+FM1�L3(
VGG�!

	E	AK

F9 ),!$v<n(!!>3223267+#"&'732654&#"*��AC^	(+
>M"U�3E)YB7>9).nG�D?
M27jr]P4+.(����$n&�*�����Xn&�*�����Qn&�*�����An&�*���n7"'.=#5!#'27>=#�],O�=B14�
!�;F6�GG�*:G ,+��'.��|n!!467>;#".k��-RDlY==JG6.O/nG��#8G+1[94(PV.��x%.546323267#"&'>54&#"�ALI5)K0PJ:33L%%aCUw_M/% Q�	=:89#H8I^##( C-a]G6233	����in&*�*g�x4%#"&5467.54632'>54&#"632&"#"3267�%[GM_/;R?5G(=	(1#299,5J�,QC2G8<O8-/)'
,# 'F)&)(,��n!!#".5463!u���6&"nG�6*<G��n3267#"&'.=#5!�
2)G$(S;(AOB'�)0(D(I@�GG�n&#>;#"#5#"&'.=#5!3267r�5(@4.4Q@,(@Or�.(*?'�G���G9�GG�70#v�n%!!#".54632.#">7%3267'��`�%`A8Y2yb('2�
��C0!�)nG��,*K3V\E�43�.�x)-%#".546;54&'&#".5463233#L*$!
+/9KYL4%:Ƀ44�%!',i/2G=@;5D>tGtG��n3##".546;5#5!#���*$"~l�AG%!',�GG��n%#"&'>54&'#5!#3267�&]AZo><{W�o=12L�-yd
/,0GG46l$11+��n5!#"&'73267�  P,B}H8f76G('GG��$%C$��,n(!!&#"'67.#".54>32632��2.M1(++R:6:`81I%,I!;WnG�?=.#.$&EK142[]55C8?�n.=!!#"&'#".54>32>3232654&#"326?67.#"�%�+O66P'I-/M.-P36O' G.0M.��!=#*?7%&5��7%&6!<#*@nG��5U1,#-"+U=8T/+$/ ,Ta!#7>@455>5541!$8v�n!!#".54632.#"3267��j�%_<6T1s^
'%
0>F?-4KnG��,*K3V\I6230-(���x,7"&54632>54&#".54632.'z#/$'2@;/98^]GC/R3E=-T@3S%�#VA8C#FS:3@+U@Eu!'_,,H]��n#"&'.=#5!#267�%(VB(AO��92�
E+I@�GG���)0���n/267#"&'.'.54632>54&'#5!#q24*]!)o=68cL"%	��z
4BH
4n161dX$";0GG.*>�r�n/%#".5467.5467>;5!5!##">;�9<&GF6[c ;)E���E�	F8��
2:G55G|M%:4#(
VGG���Kn*6B!!".'732654&'7!#"'"&546323"&54632"&54632K��65`X*G.d: )=-�'#+)C��qnG�T:�p}�%(G@GJ),:yY��n!7"&'>54&'#5!#'.'3267�Zo><{W�
� U#
1,=1"4�yd
/,0GG�W!�
$411
.��x=H#"&'327&54632.'#".5467.546323267%654&#":+2S /24/(),&:1
;Z2E1,.QL>Y.),"7��*!K"("*9
5$) 4 
))=)G+7IG.5H:;0B
t!51:$"���n&!!4&'7!#"&'.'.54632>��OU`Z�".
<69-J"!2b)6F+(-nG��/JCGN03B

F< #.����wn&��������n&�������(n&��������n&��������n&��������n&������@�n&�l����Kn&�1O���6Wn&�������<n&�$~����$n&�������Xn&�������Qn&�������Wn&��������n&�����1|n&���.���x&�������in&'*��L��*���x&�i�����n&��������n&��������n&��������n&�����.��x&�E������n&��������n&������O,n&�q���w�n&��7�����n&�����(���x&��V�����n&������n/;267#"&'.'.54632>54&'#5!#4632#"&q24*]!)o=68cL"%	��z
4��!  !BH
4n161dX$";0GG.*>��""!!��n/;%#".5467.5467>;5!5!##">;4632#"&�9<&GF6[c ;)E���E�	F8��g!  !�
2:G55G|M%:4#(
VGG��""!!��	n8?.54632.#"3267!5!!>32'>54&#"#5.�6JnX91:@=(,E��	��9#AR#H '#7Q�5JQFP^I4/53*#GG�SM.h2) T)/.%#������AnC7.'.54632>54&'#5!##5267!75#".54632.#"�H�L"%	�AhQ���#:��
F>F�e�@(/K+`O6%077.Dfa#-";0GG��S�^.R`TXS$'F.IQE,,+)��Bn'%##".546;5#5!##5�/�7&"BhQC�Z��*<�GG��z��]n-'7.5467.547#5!##5'3267!632&"#"v/�>G(.
4]gQ�8,4M��+"#19AT	I;4F*GG�٩d*'+#!%(F(����n&�� ���n$'7.54675!23#"3267!5!##5�/�:G�%# :G:&2G�/�hP
AUM<3HF1/+++#GG�٧����n&��L��n%'%5#"'#"&'732654&'7!5!5!##5�0
�&)C(O�?G.b<!(=-0��hQC��A'(5~�qt$>@nGG��{��@n;Q%".5467>;5!5!##5'75#"'.'.5463232654&7267##"632:/@93`��@gQ�:�(D, 	SK?"!9h-;E+FM1�*D,��	.7)#D�L3(
VGG��p�8�
AK

F9 ),!$.�!
��n0'%5+#"&'732654&#"'>32232675!5!##5|0
:#
=N"U�3E)YB7>9).AC]
#4��hQC�U

27is\Q4,.'H
D?�GG��{���n&������Xn&�����Pn&�� ���An&�����n''%##"'.=#5!##5%27>=#L0
�B/],O�gQ��4�
!C�Y�*:;F6�GG��{^ ,+��'.6n7'7.#"'>325!5!##5/�*=*9)"J,(@>%��6gQAC�6-J90�GG���.���x-?.'>54&#".546323267#5!##5i�Je_M/% QALI5)K0PJ:34J R
gQ��)a\TG6233	F	=:89#H8J\$#( GG�ٴ���n3?.5467>;5!5!##"3:7&54632.'*�,L/!`;���1:GOR*+-!C&��M	-N;,?_GG�. 5E#1 #	3#""F�*��vx<'7.5467.54632'>54&#"632&"#"3267#53##5�/�<G/;R?5G(=	(1#299,5J>�hQ+AX
J92G8<O8-/)'
,# 'F)&)(+2GG�ٜ��9n'%5##".5463!5!5!##5�0
�6&"�9gQC�\6*<�GG��{��Gn?&'.=#5!##5#3267-�6 OGhQ��2�
1'H5d	 I@�GG���4�)0&��n%0?&'.=#5!!>32'>54&#"#53267,�0O��:#AR#H (#59Q��E()@5e
"F9�GG�SM.h2) T)/.I����3�70"��In )?.54632.#"67!5!##53267'9�FXyb('2��oIgQ��C0!�))S
TDV\E�'GG�٨�743�.���x5'%5##".546;54&'&#".5463235#5!##580
�*$!
+/9KYL4%:Ƀ;gQC�,%!',i/2G=@;5D>t�GG��{��dn'%5##".546;5#5!##5#3�0
�*$"~dgQ��C�,%!',�GG��{����Sn'7.'>54&'#5!##5%3267#]/�K\
><{ShQ��=11L�AaqZ
/,0GG�ٲ{11*46l������n&
�����n0%'75.#"'67.#".54>326325!5!##5�9�
2.M1(++R:6:`81I%,I!;W
���gQ4<�h?=.#.$&EK142[]55C8GG�١���n&����;n#'7.54632.#"3267!5!##5h/�FWs^
'%
0>F?-4K�};hPASUEV\I6230-#GG�٢�x$07'7.''>7.546325#5!##5>54&#"�0�:^&+[/0)M%5)UIBV-#,x6LhQ��".!%("/(C�9D+&H'5LI;+E�GG���66" "��Qn?&'.=#5!##5#3267-�8"OQhQ��<���22�
5c"I@�GG����4��/�)0���n)3%'75#"&'.'.54632>54&'#5!##5'35!�0��4C,)o=68cL"%	��hQ���

kD}4n161dX$";0GG��ן�./#�^:n<?&#".5467.5467>;5!5!##">32'>54'��&LCQLH6ah;)��~:g�	6 S^(F�Sv99 @M35J�P!C4#(
VGG�6R**K-)?�9n'?.#"#".54675#5!!632'>54'��6*,)7&$29��*)tf"H"���K%5!
�GG�gY0j4)!X+
���n%1=I'75#"'#"&'732654&'7!5!5!##54632#"&'4632#"&4632#"&�>��!%)C(O�?G.b<!(=-0��hQ���\3��@&(6�qt$>@VGG��q"D��Sn%'7.'>54&'#5!##5#'.'3267]/�K\
><{ShQ�
��
1,=1$5AaqZ
/,0GG�ٲu�E
$411.��xIT%75#"&'327&54632.'#".5467.5463232675#5!##5654&#"��(a2/]!02/+(),&:0	6S.E1,.QL>Y.(/@_+�>hQk��*!K"("*>�h
5%) 4 
))=)G+7IG.5H:;0A"|GG��x�!51:$"���n.%4&'7!5!5!##5'75#"&'.'.54632>U`����gQm:��".
<69-J"!2b)6F+(-�/JCnGG�ٱ|9�ZN03B

F< #.���j	n&�*����An&������@Bn&�����j]n&�*��n0<HO%".5467>;5!5!##"632#"&'73254&74632#"&4632#"&73'f:.A>1]�o���	.7Jbbcb�;=9wKt1k�E!  !�(�;u��L4(
VGG�!
KADVXF1DAN"$s  !!��""!!n��&�����j�n&�R*��nHT[%2>54&#".54675!5!##"&5467.54632.#"632&"#"4632#"&73'(M~K.)"5:!QJ75�9˴3C2]�Rab*/ZI4
#X,"#^>�!  !Y�(�;u�F?lE/>$ 3?S40D	FGGJ
TH:nX4S@-A+<@EA 	FF(&�""!!Q��&�����^n&�1���6@n&������Zn&�$�n ,3##"3267#".54>;5!5!4632#"&73'�70@7,G*6L*,c5Em>Do?���"!  !�(�;u�'�&A0?J4bFAY.�G�i""!!c��&���Xn$07##"&54>;5!5!2654&'#"4632#"&73'X�PXBnBq�Do>��X��G^:9#J/!_�!  !<�(�;u�'�qIFW)qgC[.�G��=C0M7'FD{""!!Y��&���Pn0<C%".5467>;5!5!##"632#"&'73254&4632#"&73'f:/@>1]�oPn�	.7Jbbcb�;=9wKt1��!  !�(�;u��L3(
VGG�!
KACWXF1DAN##�""!!n��&���An%0<C!".54>75!5!##"&54>32'>54&#"4632#"&73'3NuBHvE��A�'@E @:!A11?sf7F##,��!  !4�(�;u�7gIF_1iGG�<):J(*"<%%<"FW�%!-)"+�""!!b��&�����O�n&�����6n&�A��.�j�x&�\*���Pn&���*�[vx&�?���@9n&����jGn&*���jn&*���jIn&*��.�@�x&����@dn&*���jSn&!*����n!-4%.'.54632>54&'#5!#4632#"&73'�6;hP
"%'$
��h,L1-w��!  !@�(�;u�*61dX$"<'-GG#:7L54o7""!!���&�����O�n&q���n&'��Z���j;n&
*���r�x&2���jQn&	*���n)3?%'75#"&'.'.54632>54&'#5!##5'35!4632#"&�0��4C,)o=68cL"%	��hQ���

��!  !kD}4n161dX$";0GG��ן�./#��""!!�:n<H?&#".5467.5467>;5!5!##">32'>54'4632#"&��&LCQLH6ah;)��~:g�	6 S^(F��!  !Sv99 @M35J�P!C4#(
VGG�6R**K-)?��""!!��wn.'7.54632.#"3267!5!#>;#"#5]/�6JnX91:@=(,E��j�6'@3.4QAJQFP^I4/53*#GG�G�����n$?7.'.54632>54&'#5!!74632.#"3267#".�H�L"%	����
F>F�e��pM`O6%077*#:N./K+.Dfa#-";0GG.R`TXR?��IQE,,+)A'F���n#".546;5#5!'%�7&"_�/
)'��*<�GG��C�:���n)'7.5467.547#5!#632&"#"3267v/�>G(.
4n�+"#198,6I)AT	I;4F*GG!%(F('*'+>���v�n&�� �����n&�� ���n!!!'7.54675!23#"3267��f�/�:G�%$ :G:&2J(&nG��AUM<3HF1/++->����n&��L���n!!!#"'#"&'732654&'7!'%m��^�&)C(O�?G.b<!(=-0�0
)nG�A'(5~�qt$>@�/C�:���nIM%".5467>;5!5!!#"6323267#"'.'.5463232654&7:/@93`�����	.7)#D,*D,(D, 	SK?"!9h-;E+FM1��+��L3(
VGG�!
I
AK

F9 ),!$��4����n(,!!>3223267+#"&'732654&#"%h���AC]
#5:#
=N"U�3E)YB7>9).q
)��nGj
D?T

27is\Q4,.'���:����vn&�������n&������vXn&������Xn&�����vPn&�� ����Pn&�� ���vAn&������An&����Rn##"'.=#5!27>=#'%�B/],O���4�
!n0
)'�*:;F6�GG�� ,+��'.�C�:A�n!!7.#"'>32��tP�*>)9)"J,(BD*��nG�]�6-J@9C�.���x%'7.'>54&#".546323267�/�Je_M/% QALI5)K0PJ:34K%Aa\TG6233	F	=:89#H8J\$#( G����in&�*�*���x4'7.5467.54632'>54&#"632&"#"3267�/�<G/;R?5G(=	(1#299,5J%+AX
J92G8<O8-/)'
,# 'F)&)(,F���n!!#".5463!'%��q�6&"�0
)nG�6*<G��C�:���n?&'.=#5!#3267-�6 OB�
1)G%��5d	 I@�GG�)0(A����n'?&'.=#5!#>;#"#53267,�0Or�5(@4.4Q��E()@5e
"F9�GG�G����3�70"���n'!!7.54632.#">73267'��`9�FXyb('2�
'��C0!�)nG�S
TDV\E�A
�743�.��>x)-1%#".546;54&'&#".5463233#'%L*$!
+/9KYL4%:Ƀ��Z0
)�%!',i/2G=@;5D>tGtG��C�:���n3##".546;5#5!#'%���*$"~��0
)AG%!',�GG��C�:���n'7.'>54&'#5!#3267]/�K\
><{W�o=12L&AaqZ
/,0GG46l$11+E����n&�����3n(,!!&#"'67.#".54>32632'7��2.M1(++R:6:`81I%,I!;W�9�#nG�?=.#.$&EK142[]55C8��<�;����n&������n!!'7.54632.#"3267��jh/�FWs^
'%
0>F?-4K+nG��ASUEV\I6230-D((x ,7'7.''>7.5463253>54&#"�0�:^&+[/0)M%5)UIBV-#,x6L[��!%("/"(C�9D+&H'5LI;+EM>GG�6" "#6���n'7.'.=#5!#3267�%N��/�-O��.
22D3�BcI@�GG,�)0��Sn+/#"&'.'.54632>54&'#5!!;'7+�4C,)o=68cL"%	�:��

 ՚0�(/4n161dX$";0GG./#��D}:�����n&*���n!-9E!!"&'732654&'7!#"'7%"&546323"&54632"&54632m��6O�?G.b<!(=-0�!%)CN�,����qnG�l�qt$>@G@&(6x�9�2Y���n!?.'>54&'#5!#.'3267.�K\
><{W�
�
���
1,=1"4)aqZ
/,0GG�T�r
$411
.��xx=ALP267#"&'327&54632.'#".5467.546323#654&#"7�A^+(a2/]!02/+(),&:0	6S.E1,.QL>Y.(/Y����*!K"("*
�.�l#[
5%) 4 
))=)G+7IG.5H:;0AG1!51:$"�*�<���Kn&*!!4&'7!#"&'.'.54632>72��U`��".
<69-J"!2b)6F+(-p�(�nG��/JCGN03B

F< #.S�=����jwn&6*�����n&7�����@�n&8����j�n&9*�v�n0<HO]%".5467>;5!5!##"632#"&'73254&74632#"&4632#"&73'.#"'632f:.A>1]�o���	.7Jbbcb�;=9wKt1k�E!  !�(�;u��2eD	CeQ!�L4(
VGG�!
KADVXF1DAN"$s  !!��""!!i��&���?<H/H%���j�n&<R*��nFRY5!2>54&#".54632#"&5467.54632.#"632&"#"4632#"&73'�]M~K.)"5:!QJHD.K-2]�Rab*/ZI4
#X,"#^>�!  !Y�(�;u�'GG�?lE/>$ 3?S47H'M;:nX4S@-A+<@EA 	FF(&�""!!Q��&�����^�n&>1���6�n&?�����Z�n&@$�v5n ,3A##"3267#".54>;5!5!4632#"&73'.#"'632�70@7,G*6L*,c5Em>Do?���"!  !�(�;u��2eD	CeQ!'�&A0?J4bFAY.�G�i""!!c��&���?<H/H%�vZn$07E##"&54>;5!5!2654&'#"4632#"&73'.#"'632X�PXBnBq�Do>��X��G^:9#J/!_�!  !<�(�;u��2eD	CeQ!'�qIFW)qgC[.�G��=C0M7'FD{""!!Y��&���?<H/H%�vPn0<CQ%".5467>;5!5!##"632#"&'73254&4632#"&73'.#"'632f:/@>1]�oPn�	.7Jbbcb�;=9wKt1��!  !�(�;u��2eD	CeQ!�L3(
VGG�!
KACWXF1DAN##��""!!i��&���?<H/H%�vPn%0<CQ!".54>75!5!##"&54>32'>54&#"4632#"&73'.#"'6323NuBHvE��A�'@E @:!A11?sf7F##,��!  !4�(�;u��2eD	CeQ!7gIF_1iGG�<):J(*"<%%<"FW�%!-)"+�""!!b��&���?<H/H%���ORn&I�����n&JA��.�j�x&K\*�����n&�'*����*�[�x&M?���@�n&N����j�n&O*���j�n&P*���j�n&Q*��.�@>x&R����@�n&S*���j�n&T!*���O3n&Vq����n&�'��Z���j�n&X*���r(x&Y2���j�n&Z	*��Sn+/;#"&'.'.54632>54&'#5!!;'74632#"&+�4C,)o=68cL"%	�:��

 ՚0�(��!  !/4n161dX$";0GG./#��D}:�""!!���n<JV?&#".5467.5467>;5!5!##">32'>54'632.#"4632#"&��&LCQLH6ah;)��~:g�	6 S^(F�UDeP!92eD	��!  !Sv99 @M35J�P!C4#(
VGG�6R**K-)?�;3V3)PKB""!!��"nO2'>54&#"632#"&'73254&#"'.5467.5467>;5!5!##"6GW'>; '9AMCBCKS]Va�<='FO1j1+YL;)���"h�	/,(@$5DC!"&6(3:"M?=N\L+0>J! (6f<#93"(
VGG���"nN"&'73254&#"'.5467.5467>;5!5!##"632'>54&#"632-a�<='FO1j1+YM;)���"h�	
/9GW'r 7EJD87KS]��\L+0>J! 1`@/0 (
VGG�
$:!^$A *%,2M?=N��8nQ2'>54&#".#"3267#"&5467.5467.5467>;5!5!##"6GW'>; '9AMCBDAdN =7oJ331*9KU-)@7;)���"h�	/,(@$5DC!"&6(3:"9V1'SW& &
F

O?'@,X3#93"(
VGG���BnQ2'>54&#"232.#"3267#"&547.5467.5467>;5!5!##"6GW'r 7EJD54KpU"=7oJ331*9KUC:4;)���"h�	
/,$:!^$A *%,07[5'SW& &
F

O?I&(S4/0 (
VGG�
�^5nF23267#"&5467.#".5467.5467>;5!5!##"6EW)<62);!KT:<>=FHI>6a_;)���5{�	.,*C&!
( !	EK;'L(&:5&DI/5M�H'@4#(
VGG��XnX23267#"'3267#"&547&54>7&#".5467.5467>;5!5!##"6EW)=51 *;!
,%*9!OP64){FHI>6a_;)���5{�	.,*C&!
$
A

A
K8$@1'N:5&DI/5M�H'@4#(
VGG���"nO[2'>54&#">32#"&'732654&#"'.5467.5467>;5!5!##"64632#"&GW'r 7EJD<;#LTZIHp6./V3.35&0gY;)���"h�	
/�!  !,$:!^$A *%.3N>=N/20*%%! 
6eD/0 (
VGG�
��""!!��}nR^2'>54&#"632.#"3267#"&5467.5467.5467>;5!5!##"64632#"&GW'r 7EJD;9KoV"=7oJ342*9KTLB;)���"h�	
/�!  !,$:!^$A *%-27[5'SW& &
F

O?.-[;/0 (
VGG�
��!!""�5nFR23267#"&5467.#".5467.5467>;5!5!##"64632#"&EW)<62);!KT:<>=FHI>6a_;)���5{�	.�!  !,*C&!
( !	EK;'L(&:5&DI/5M�H'@4#(
VGG��""!!�XnXd23267#"'3267#"&547&54>7&#".5467.5467>;5!5!##"64632#"&EW)=51 *;!
,%*9!OP64){FHI>6a_;)���5{�	.�!  !,*C&!
$
A

A
K8$@1'N:5&DI/5M�H'@4#(
VGG��""!!��:nT?&#"632#"&'73254&#"'.5467.5467>;5!5!##">32'>54'λ&EEOB<KT]Va�<>'FN2i0 *
gU;)��~:g�	:"P_*F�pg21 55"M?=N\L+0>J! ;kD;2 (
VGG�		3M('G*&;u��:nS?&#"632#"&'73254&#"'.5467.5467>;5!5!##"632'>54'ڪ&@NF9O"!KT]Va�<>'FN2i0 *RR;)��:h�	3>Qa*A��^1)#G'M?=N\L+0>J! *MD30(
VGG�.L.E$(+
v��QnV?&#"32.#"3267#"&547.5467.5467>;5!5!##">32'>54'λ&EEO?9KpU"=7oJ252+9KTDD:;)��~:g�	:"P_*F�pg21 34 8[5'SX' &
F

O?J&.[9;2 (
VGG�		3M('G*&;u��QnV?&#"632.#"3267#"&547.5467.5467>;5!5!##"632'>54'ڪ&@NF3G
KpU"=7oJ342+9KT;12;)��:h�	3>Qa*A��^1)!D%8[5'SX' &
F

O?D'!<830(
VGG�.L.E$(+
v��An3'>54&#".'.54632>54&'#5!!632!H!"#"H+-w@6;hP
"%'$
�A��5J(.W%)E##*!.4o161dX$"<'-GG#:
I��!nD%"&545.'.'.54632>54&'#5!!>32.#"3267�<P%<#-w@6;hP
"%'$
�!�A1=]H?.X7+(*,�N?#4o161dX$"<'-GG#:%$7]9"VU+%C
��6nL67.'#".5467>;5!5!##"3:7&54632#"&'73254&#"('+*UG+!`;���1:GOR*+-
38]Va�<='FO1j1+ /O9,?_GG�. 5E#1 #	'G3=N\L+0>J! ���nO#"&546323.'#".5467>;5!5!##"3:7&54632.#"3267�9KU\O
*UG+!`;���1:GOR*+-
Ig(>6pI342*�

O?9P/O9,?_GG�. 5E#1 #	*g>'SX' &
��;nF"&5467&'#".5467>;5!5!##"3:7&546323267�KU8-*UG+!`;���1:GOR*+-%(1.2 /"C��O?/B& /O9,?_GG�. 5E#1 #	;#
)!"E
��4nK?.5467>;5!5!##"3:7&54632#"&'732654&#"'67.'*�,L/!`;���1:GOR*+-	47QJSz7=5A.).&"$!��M	-N;,?_GG�. 5E#1 #	%	J6=NWQ+)?#'#"A
"����nN?.5467>;5!5!##"3:7&54632.#"3267#"&546323.'*�,L/!`;���1:GOR*+-
Ig(>6pI342*9KU\O
��M	-N;,?_GG�. 5E#1 #	*g>'SX' &
F

O?9P 
���;nE?.5467>;5!5!##"3:7&546323267#"&5467&'*�,L/!`;���1:GOR*+-%(1.2 /"C)KU8-��M	-N;,?_GG�. 5E#1 #	;#
)!"E
O?/B& ���An3?'>54&#".'.54632>54&'#5!!6324632#"&!H!"#"H+-w@6;hP
"%'$
�A��5J�.!  !(.W%)E##*!.4o161dX$"<'-GG#:
I��""!!��!nDP%"&545.'.'.54632>54&'#5!!>32.#"32674632#"&�<P%<#-w@6;hP
"%'$
�!�A1=]H?.X7+(*,�1!  !�N?#4o161dX$"<'-GG#:%$7]9"VU+%C
{""!!��6nLX>7.'#".5467>;5!5!##"3:7&54632#"&'732654&#"%4632#"&F
*UG+!`;���1:GOR*+-	77QJWy4=/V='0)$!��    !/O9,?_GG�. 5E#1 #	&	L4=N\L+IB%%! J""""���nO[#"&546323.'#".5467>;5!5!##"3:7&54632.#"3267%4632#"&�9KU\O
*UG+!`;���1:GOR*+-
Ig(>6pI342*��!  !�

O?9P/O9,?_GG�. 5E#1 #	*g>'SX' &
�""!!����;n&��L�|Pn0<U%".5467>;5!5!##"632#"&'73254&4632#"&"&'732654&#"'632f:/@>1]�oPn�	.7Jbbcb�;=9wKt1�!  !I[�878d@/.-(17ENU�L3(
VGG�!
KACWXF1DAN##����L>0<9CF84G�{Pn0<V%".5467>;5!5!##"632#"&'73254&4632#"&"&54632.#"3267f:/@>1]�oPn�	.7Jbbcb�;=9wKt1�!  !FOVFEgP">1dA..-(4�L3(
VGG�!
KACWXF1DAN##����F84G2Q0'HN	D�|An%0<U!".54>75!5!##"&54>32'>54&#"4632#"&"&'732654&#"'6323NuBHvE��A�'@E @:!A11?sf7F##,=!  !I[�878d@/.-(17ENU7gIF_1iGG�<):J(*"<%%<"FW�%!-)"+���L>0<9CF84G�{An%0<V!".54>75!5!##"&54>32'>54&#"4632#"&"&54632.#"32673NuBHvE��A�'@E @:!A11?sf7F##,=!  !FOVFEgP">1dA..-(47gIF_1iGG�<):J(*"<%%<"FW�%!-)"+���F84G2Q0'HN	D�Gg���"&546323#�BQQ��g��4632.#"#.53�XB!5&(*P{Q�CC
B	-#!<$#Lo���g��$4632.#"#.5374632#"&�XB!5&(*P{Q��CC
B	-#!<$#Lo��m���&�����&�����&����$�&�Q,�$0�-#53.#"#.54632>32.#"13##YYW=7(*PTK,>B, 6&(*
ngQ'Ghc1+"7#@"AS  
B	-#>$G���$0�-9#53.#"#.54632>32.#"13##"&54632YYW=7(*PTK,>B, 6&(*
ngQ�'Ghc1+"7#@"AS  
B	-#>$G��������E����g.� .'#"&'73267632.#"�:$E^"F9-1/;(? 6&(*g:Y^FDIC
B	-#!?$��g.� ,.'#"&'73267632.#"'4632#"&�:$E^"F9-1/;(? 6&(*g:Y^FDIC
B	-#!?$m�%g���!.#"#".'732632'4632#"&�(&

#9/B%+ %8+     gH4;7,,"VM�""""�%g1�$.#"#".'732632>32.#"�(&

#9/B%+ 
P5!4&)*gH4;7,,..
B	-$+F�%g1�$0.#"#".'732632>32.#"7"&54632�(&

#9/B%+ 
P5!4&)*?gH4;7,,..
B	-$+F;�gg���.#"'632'4632#"&�)2""'46O?!!!!gO[&	I3{k�""""�gg3�.#"'632632.#"�)2""'41<e 6&(*gO[&	I"+M
B	-#
/@�gg3�).#"'632632.#"7"&54632�)2""'41<e 6&(*@gO[&	I"+M
B	-#
/@;�Tg���).#"'>327.#"'632'4632#"&�-+*2-F&, '46O?!!!!g(%	E
+&49E3{k�""""�Tg3�,.#"'>327.#"'632632.#"�-+*2-F&, '4.Be 6&(*g(%	E
+&49E#*M
B	-#0=�Tg3�,8.#"'>327.#"'632632.#"7"&54632�-+*2-F&, '4.Be 6&(*@g(%	E
+&49E#*M
B	-#0=;����*�&������1�&�����1�&����(�&����(4�&����(4�&����j�&����j6�&����j6�&����W�&����W6�&����W6�&�����&J����G�&L����G�&M�g�.54632.#"'4632#"&�YB 6&(*g#L$CC
B	-#!?$m���&���������&������H8�&������H8�&��3���H8�&��3��'�&������&������&������&�����+�&������&������&������&�J������&�'��2_���6��&�'�������H8�&�'�@�����H8�&�'�3�@���H8�&�'�@�3����'�&�'2_�������&�'��2_�����&�'2_�������&�'2_������+�&�'2_����in/.54675!5!5!!>32'>54&#"##"8.N/���-i��9$@S"I'#68Qe15IG(PU1.
H�GG�SM.h2) T)/.I��H+1[9���xZb%"&547#"#5#".54632.#"3267!5!#>;632>54&#".54632.'##5!�#/.4QG2/S2nX91:@=(,E��2n6'1'2@;/98^]GC/R3E=-T@3S%�QY�#��$&M9P^I4/53*#GG�=VA8C#FS:3@+U@Eu!'_,,H]j��'GG���xEks%"'#".54632.#"3267>32>54&#".54632.'#".'.54632>54'#5!!327##5!�C'/K+`O6%077*-#'2@;/98^]GC/R3E=-T@3S%#)nDD��I"%�W��E=K�]qR�QY�
'F.IQE,,+)
VA8C#FS:3@+U@Eu!'_,,H]} ,l_&";4)GG0QaYV3���'GG�e�nBN".547>;5!5!##">32##"'#".546;5.'73265474632#"&fD*;#:3_�s���(
=PZL!,+4!",N >>�=<5:F*.
>GG�?8 4��	�'8Y7%1D32f    �V�n>JQ".546;5&'732654#".547>;5!5!##">32#5#4632#"&35#"'�4%P:>>�=<5_D*;#:3_�s���(
=PZL�0��!)42�'7{%B1D32F*.
>GG�?80��s"    ��\�n@S_%".5467>;5!5!##5#"&'>54'.#!"632#"&'73254&267!32%4632#"&f:/@>1]�o�hQB&Ov9B

%&�~	.7Jbbcb�;=9wKt1�&>���6=17:���L3(
VGG��cac'"
!
KACWXF1DAN##TpV/1<+�  !!�n">!##5#"&54675!23#"3267!#"&54675!23#"3267�hPH2Mc�$ :G:&2G���5G.Mc�$:G:&2FnG�٥VG3HF1/+++#��&VG3HF1/+++anHc!##"&5467.54632.#"632&"#"32>54&#".54675!#"&54675!23#"3267a�3C2]�Rab*/ZI4
#X,"#^>4M~K.)"5:!QJ75���$Y?Mc�%$ :G:&/DnGJ
TH:nX4S@-A+<@EA 	FF(&?lE/>$ 3?S40D	F��1VG3HF1/++(���an&����nZo%2>54&#".54675!5!##5#"&'>54'.+"'#"&5467.54632.#"632&"#"323267(M~K.)"5:!QJ75�9�hQC*Hv:B%&0' 2]�Rab*/ZI4
#X,"#^>#�6=17:$)CF?lE/>$ 3?S40D	FGG��gac'"'1:nX4S@-A+<@EA 	FF(&�J/1<+!g�n;!###"'#".'#"'#".'732654&'7332654&'7!5!�hQ�)$,)C(3[U)A)$,)C(5`X*G.d: )=-�/g; )=-��nG��rP-.>8kP-.>=�w��"(,N@��"(,N@nn0K5!##"632#"&'73254&#".5467>;5".'732654&'7!#"'n�	.7Jbbcb�;=9wKt1.:/@>1]��5`X*G.d: )=-~)$,)C'GG�!
KACWXF1DAN##L3(
V�)=�w��"(,N@GP-.>�nG%"&'732654&#"'>323267&'732654&'7!5!5!###"'#"&'#"#,U�3E)YB7>9).AC]	"F.d: *=-���hQ�(#-)D(=l239
=Mvjr]P4+.(HC?#'��"(,N@nGG��rP-.>Qb27�n<%"&54>;5!5!##"3267#"3267#"&54>;5"m�>kA
���K!EXC2S)9K!EXC2S)(l3m�>kA
�YX9I#AGG�	
#7+Ks	
#7+KYX9I#"�vHnV%"&54>;5!5!##"3267#"3267.#"3267#"&5467.54>;5"jz:gC���`9OD;U&1>`9OD;U&J&;XD=7oJ331+9MS87Q[:gC�ON4B ;GG�
/%Ko
/$K
	3I)#GL	F
G8*?
MC4B �-n1A".54>;5.54>;5!5!##"3267'2654&'#"Go??lCjz>kA
��-�K!EXC1T)A#LX@mEGZ88)%?W�%N=8I$#YV9I#AGG�	
#7+K
0[::I!G-0#:&12�vDnIV%"&54>;5!5!##"3267.#"3267#"&5467.54>;254&'#"jz:gC��-�`9OD;U&8GLX_N8TA=7oJ331+9MS76V\?j@�882F)�ON4B ;GG�
/%K-R4DD	
4F(#GL	F
G8)?
	KE3C!�M0	!Sn2E5!##5#"&'>54'.+#"3267#".54>;5267!32gQD)Iu:B%&�70@7,G*6L*,c5Em>Do?�*C�'�6<17:'GG��hac'"-&A0?J4bFAY.��c hV/1<+�Xn'7G".54>;5.54>;5!5!#2654&'#"2654&'#"'Hq@@nCGn?@nC��X�M[^JM[AnGI\:9*&AZMI\:9*&AZ�%N=8I$#%N<8I$BGGH[:GL/[::I!�-0#:&12��-0#:&12wn)<K#5#"&'>54'.+"&'#"&54>;5!5!267!!22654&'#"QC)Iu:A
&&�#6<BnBq�Do>��w��)B��5=08:�G^:9#J/!_'��_ac'!!b;FW)qgC[.�GG�Z q^/1<*9=C0M7'FD�PnJU"&5467.'732654#".547>;5!5!##">32#"&54632'23254#"Nw�seL�3>>�=<5_D*;#:3c�oPn�(
=PZ=A>(P<:KMFEkov=*'�ZXJJ	F;1D32F*.
>GG�?8-C?	$-1)=>':Gn<'�PnR".547&'732654#".547>;5!5!##">32#"'>32#"&'732654fC+;R:><�=<5_C+;#;2c�oPn�'<O[_f%#;O[_fZ�<><�=<51F+$%D1E4 4F+/
@GG�@99K@99KIF1E4 4�vfnn%".547&'732654#".5467>;5!5!##">32#"'">32.#"3267#"&5467.'732654fI(8O::AD<5_I(8:1g�oPn�!APZ^g"!APZHM7QA=7pI342*9MR>=Gy.:AD<5	
B( #@2B1+
B(!

4GG{	
:56D
:5/A3F'#GL	F
G8,B
C22B1+jn@S%".5467>;5!5!##5#"&'>54'.#!"632#"&'73254&267!32f:/@>1]�ojhQC*Hv:B%&��	.7Jbbcb�;=9wKt1�)C�1�6=17:�L3(
VGG��gac'"!
KACWXF1DAN##T!gV/1<+�jn@SZ%".5467>;5!5!##5#"&'>54'.#!"632#"&'73254&267!3273'f:/@>1]�ojhQC*Hv:B%&��	.7Jbbcb�;=9wKt1�)C�1�6=17:�E�(�;u��L3(
VGG��gac'"!
KACWXF1DAN##T!gV/1<+�љ�&���An@KV"&54>35.54>35!5!##"&54632#"&5463223254#"23254#"7x�BuLu�BuL��A�>)P<;KMFDEE>)P<;KMFDjov=*'v=*'�YY9I#!YX9I#@GG�	$-1)=>'/Am	$-1)=>':G�<'�o<'an5HS!".54>75!5!##5#"&'>54'.#!"&54>32%267!32%>54&#"3NuBHvE��ahPD)Iu:A
&&��@E @:!A11?s�)C���5=17:�17F##,7gIF_1iGG��U`d'!
<):J(*"<%%<"FWw!zh.2;*%!-)"+���n.54675!5!5!###"U.N/���hQt15JF(PV0-H�GG��H*1[9���n!!#".54675��t15JF6.N/�nG�G*1[94(PV0-H���x-1G#5#"&'>54&#".546323267#5!%!!467>;#".SQP7Uw_M/% QALI5)K0PJ:34J R
�F8��-RDlY==JG6.O/'�ٴa]G6233	F	=:89#H8J\$#( GGGG��#8G+1[94(PV���x,08N%"&54632>54&#".54632.'!)##5!467>;#".�#/$'2@;/98^]GC/R3E=-T@3S%�<<��{QY�JRDlY==JG6.O/�#VA8C#FS:3@+U@Eu!'_,,H]�G��'GG��#8G+1[94(PV�Z�n9Y"&5467.54632>7>;5!5!##"3:7&54632''3267#".'&#"632&"#"
Z`&+YI!`;�ٞ1:G/PS
*+-"UF9Tj�9+P�3	2fM
[,"

),�L:/:&9?%7_GG�?5E#1 %
��)G,�##\KC9<D!�Zn>".546;5.5467>;5!5!##"3:7&54632'#"&'�2"&1!`;���1:GPT
*+-"TEU	+�&6WP<,?_GG�. 5E#1 %
����Z�n5AJ".5467&5467>;5!5!##"3:7.54632'7"&'>7327'�9V0G="`;�k��1;GPT	*+-"TE:*pY1f%�/
�� 5�})G.=R%-,?_GG�. 5E	#1 %
��0G�!�3$")��Z%n]#"&'.546?'.#"3267#"&54>32767.5467>;5!5!##"3:7&54632's*"!''/@(963$�4_;!`;��%�1:GPT
*+-"TEJ;

T)+?<0(189X9*SD,?_GG�. 5E#1 %
���Zzn3C".5467&5467>;5!5!##"3:7&54632''32>7#"&'�8T/B9"_;�uz�1:G.OT
*+-"TE9*m�C+,H;
0c%'4})G.;O%0,?_GG�>5E#1 %
��0G�1)&: 	0�ZynCVf".5467&5467>;5!5!##5#"&'>54'.+"3:7&54632'%267!3232>7#"&'�8T/B9"_;�uyhQC*Hv:B%&�:G.OT
*+-"TE9*m)C��6=17:�_C+,H;
0c%'4})G.;O%0,?_GG��^ac'">5E#1 %
��0G�!p_/1<+_1)&: 	0�Z&nf'#"&5467.54632'654&#"632&"#"3267#".5467>;5!5!##"3:7.54632�E9TjAZ`>OM<2C;&&; (
(-9+Q�4
*WI-!`<��&�0;GPT
)*-!��)G,L:#F=9K5+.&* $
D!##]J/N9,?_GG�. 5E	#1 %
�Z$nv�.+"3:7.54632'#"&5467.54632'654&#"632&"#"3267#".5467>;5!5!##5#"&'>54267!32|%&�;GPT
)*-!UE9TjAZ`>OM<2C;&&; (
(-9+Q�4
*WI-!`<��$hQC*Hv:B])C��6=17:o. 5E	#1 %
��)G,L:#F=9K5+.&* $
D!##]J/N9,?_GG��^ac'"�!p_/1<+�W*nG.'#".547.5467>;5!5!##"632&#"3:7.54632�&
<h@!(:*q��*��	2C*"@C.G#*+-
 �!F$K:;+=)(
VGG�$I7++,	#1 #3#�W�nWj.'#".547.5467>;5!5!##5#"&'>54'.#!"632&#"3:7.54632267!32�&
<h@!(:*q���hQC*Hv:B%&��	2C*"@C.G#*+-
 �)C�Vl6=17:�!F$K:;+=)(
VGG��gac'"$I7++,	#1 #3#!gV/1<+���n&8".546;4&+"&'&5467>;5!5!##5##";23d*$"$ B+3&@-;���hQ��-) S).�&,) 5!-VGG��a$!(�
1&���n:"&547.5467>;5!5!##5##"632.#"3267Uf&:*D���hQE_���	0?
&#
,>>;0Ov4PC6(<((
VGG��q4$2�#
H-)*(TD��7n7"&547.5467>;5!5!##"632.#"3267Uf&:*D�����	0?
&#
,>>;0Pv448J]PC6(<((
VGG�#
H-)*(WD<93!.n<7".5463!67>;5!5!##"632#"&'73254&#".'#�6&">1]��.n�	.7Jbbcb�;=9wKt1.:-?��*<
VGG�!
KACWXF1DAN##H06���.n&	���x;?#".5463!>54&#".546323267#5!##5#"&'!!�6&"N@/% QALI5)K0PJ:34J R
gQP7Os����*6*<(D1233	F	=:89#H8J\$#( GG�ٴUQDG���x;?#".5463!>54&#".546323267#5!##5'7.'!!�6&"N@/% QALI5)K0PJ:34J R
gQ��/�Ea����*6*<(D1233	F	=:89#H8J\$#( GG�ٴ�AaPIDG�x<@N##5#"&5467.54632'>54&#"632&"#"3267#53)!#".5463!�hQI:M_/;R?5G(=	(1#299,5J>��j/���6&"'�ٖQC2G8<O8-/)'
,# 'F)&)(+2GG�6*<Ggx48F%#"&5467.54632'>54&#"632&"#"3267!!#".5463!%[GM_/;R?5G(=	(1#299,5J�#/���6&"�,QC2G8<O8-/)'
,# 'F)&)(,yG�6*<G���x<@N'7.5467.54632'>54&#"632&"#"3267#53##5!!#".5463!�/�<G/;R?5G(=	(1#299,5J>�hQ�#/���6&"+AX
J92G8<O8-/)'
,# 'F)&)(+2GG�ٜ�G�6*<Gvn)7".5463!5!5!###"&'.546?675#�6&"[�CvhQ�'%!!TUI��)<�GG��p"EF16���x;?G#".5463!632>54&#".54632.'#"&547!)##5!�6&"'2@;/98^]GC/R3E=-T@3S%#/��K���QY*6*<>VA8C#FS:3@+U@Eu!'_,,H]#DG��'GGGn!.3"&'.546?>7&'.=#5!##52675#�/+%,OGhQ�
$F'G�
$

HB�GG���s+	%߇)0
�x<@W_##5#"&5467.54632'>54&#"632&"#"3267#53)!#".54632.#"67%327'�hQI:M_/;R?5G(=	(1#299,5J>��?Z���(`A8Y2yb4)���C0# �)'�ٖQC2G8<O8-/)'
,# 'F)&)(+2GG��",*K3V\E�43��n$0#5#"&'&'##".546;5#5!3&=#!#3267:QD/(A�*$"~��-���
2(F'�ٿ%!',�GG���)0&���n#/%7&'&'##".546;5#5!##53&=#!#3267��6 �*$"~�hQ������
1'H5d	 %!',�GG���N��)0&�n&,3267#"&'&'##".546;5#5!3&=#�
2)G$(S;(A�*$"~��2��'�)0(D(%!',�GG��mn17B>32'>54&#"#5#"&'&'##".546;5#5!3&=#!3267':#AR#H (#59Q@+(@�*$"~m�b��,()@'�SM.h2) T)/.I���%!',�GG�ſ70"�x-B235#5!##5##".'##".546;5#5!6!54&'&#".547#�%:Ƀ;gQ�.&�*$"~y�5
+/9KYixD>t�GG��%!.%!',�G
��i/2G=@���nT263267>;5!5!##"632#"&'73254&#".545&#"'67.#".54>�,I!<X>1]���n�	.7Jbbcb�;=9wKt1.:/@3.M1(++R:6:`81I�8VGG�!
KACWXF1DAN##L3?=.#.$&EK142[]55C����n&����gx-1V#5#"&'>54&#".546323267#5!%!!&#"'67.#".54>32632QP7Uw_M/% QALI5)K0PJ:34J R
���2.M3 (++R:6:`81I%/N$8O'�ٴa]G6233	F	=:89#H8J\$#( GGGG�=92&.$&EK142[]55C"-�n1=2.#"3267&'>54&'!5!##5#"&'#".5463267#�
'%
0>F@1,U><�/�hQN31N9K34U2s6=12J��I6230-)$+
/,0GG�ٳ&"'*K3V\�11*46l�w�x4@#5#"&5'%32675.''>7.546325#53>54&#"_Q3G@Ya/"#0)<F�7+[/0)M%5)UIBV-#S|@��2!%("/"'�PO%PDDC�=()!%�%9D+&H'5LI;+E �GG�6" "#6�w�x;G#5#".54632.#"32675.''>7.546325#53>54&#"_QB)1M,cQ9'3::,%<F�7+[/0)M%5)UIBV-#S|@��2!%("/"'�PL'F/HQE-,+(�%9D+&H'5LI;+E �GG�6" "#6��-x?K5!##'67.#".'.''>7.54632>32675>54&#"�`hQ5BM0(++Q:58]96V#+[/0)M%5)UIBV-#= 1=+J"7X�4".!%("/'GG��c@M.#.$&EK14/XY19D+&H'5LI;+E
#,3~666" "�x3?!"'.546?>7&''>7.546325#5!##5>54&#"B&%!7/N"qV+[/0)M%5)UIBV-#,w7MgQ�	$d!%("/"
$
&&9D+&H'5LI;+E�GG���i+�6" "#6Wn!$+!".547.=#5!##"32675#67'<Bj>=!TWhA6<L2*E(4W')l-�78L�#M?E*@/�GG�>
6&*Ld�q/7�[n3FIP!".547.=#5!##5#"&'>54'.+#"3267%267!32%5#67'<Bj>=!T[hQC)Iu:A
&&mA6<L2*E(4W')l�)B�Mv5=08:���78L�#M?E*@/�GG��_ac'!4>
6&*L� q^/1<*��q/7����Wn&!�\n#5!".5467.=#5!#5#6;'2654.'#",7hD!T\m(%0=l+�74G��HS 0!$=*F#J=)=?.�GG�#C/9G!d�r-4��=,1 *
&%,un*=@HZ!".5467.=#5!##5#"&'>54'.+%267!32%5#6;'2654.'#",7hD!TuhQC)Iu:A
&&�(%0=l�)B�3�5=08:���74G��HS 0!$=*F#J=)=?.�GG��_ac'!4#C/9G!� q^/1<*��r-4��=,1 *
&%,���\n&$���x>[%.'.54632>54&'#5!6323267#5!##5#"&'#"&'7267>54&#".547#|68cL"%	�� )K0PJ:34J R
gQP7Ej08*]!)o2)E(?5/% QAL�
4*61dX$";0G
#H8J\$#( GG�ٴA>
4n�	@-233	F	=:.*>��yx6S%.'.54632>54&'#5!6323267#"&'#"&'7267>54&#".547#|68cL"%	�� )K0PJ:33L%%aCEj08*]!)o2)E(?5/% QAL�
4*61dX$";0G
#H8I^##( C-A>
4n�	@-233	F	=:.*>���n/>J#5#"&'.'#"&'.'.54632>54&'#5!2674=#%#3267�QD/(A;(*]!)o=68cL"%	��%= �
4��
2(F'�ٿ#	
4n161dX$";0GG�		�.*>�)0&��Xn7F3267#"&'.'#"&'.'.54632>54&'#5!2674=#D
2)G$(S;(A;(*]!)o=68cL"%	��%= �
4'�)0(D(#	
4n161dX$";0GG�		�.*>���n.=I%7&'.'#"&'.'.54632>54&'#5!##52674=#%#3267ѩ6 ;(*]!)o=68cL"%	��hQ�Ώ%= �
4��
1'H5d	 #	
4n161dX$";0GG���O		�.*>�)0&���nAP[>32'>54&#"#5#"&'&'#"&'.'.54632>54&'#5!2674=#%3267p:#AR#H (#59Q@+(@;(*]!)o=68cL"%	����%= �
4
()@'�SM.h2) T)/.I���'	
4n161dX$";0GG�	�.*>�70"�)nFP.5467.5467>3!5!5!#!">;2#4&+#"'.=72>=#BY, ;)�����	6'�S Q#5%I")#L>@o�=hg;"G5#(
VGG�#?��8r+218+b	E+OW8�)os(.�)�nG".546;54&+".5467.5467>;5!5!#!">;2#5#Y0"�"�76)'VD6Ia1 ;)�M����	6'�UQo"&6.
E+LW;4>gg;"G5#(
VGG�%=���0�)/n2D.5467.5467>;5!5!##5##".546;.#"##"632Ia1 ;)���/hQ�)$"5><L'VD+��	+1_^�>gg;+C5#(
VGG�P�$"',/:=A+LW;�� bO�)!n+G.5467.5467>;5!5!##5#"&'>54#"7267##">32Ia1 ;)���!gQ?)Js9Bf�'VD�':��	7!4U29/;�>gg;"H5#(
VGG�Db\^!7~+LW;��	8+25%�)nV.5467.5467>3!5!5!#!">;2#5'67.#".54>326754&+"BY, ;)�����	6'�WP/A
!AI-K['<!#5 )#�76)#L>�=hg;"G5#(
VGG�';���	;>4%	
!*H438l=(3
E+OW8�)�nT.5467.5467>;5!5!#!">;2#5#"&54632.#"326754&+"BY, ;)��%��	6'�O 
Q;'FZZL2

%0/2+#8#�76)#L>�=hg;"G5#(
VGG� /!��VL=@KB&##"�
E+OW8���n22675!5!#'>54&#"'67.#".54>�,I!0D�*ʤ(B;'E#3,#3.M1(++R:6:`81I�-
GG�JEFt53)`7-+?=.#.$&EK142[]55C���@�n&3�����n&3������n&3'���D��LxKW2675!5!#'>54&#"'67.#".'.''>7.54632>>54&#"N,I!0D�x|�(B;'E#3,#3.M1(++R:68\:6V#+[/0)M%5)UIBV-#= 1=��!%("/"�-
GG�JEFt53)`7-+?=.#.$&EK14/XY19D+&H'5LI;+E
#,!6" "#6���n..'#"&54632>54&#"'675#5!###-7%0$( +C@2%=&=C��hQ�CQG8/#;">12.FLGG��'N
RJ>[0���n*.'#"&54632>54&#"'675#5!#-7%0$( +C@2%=&=C���CQG8/#;">12.FLGGN
RJ>[0���|�n&8�<���|�n&9�<�����n&�*6����6n&�'l*����v�n&��L�v�nHT[i%2>54&#".54675!5!##"&5467.54632.#"632&"#"4632#"&73'.#"'632(M~K.)"5:!QJ75�9˴3C2]�Rab*/ZI4
#X,"#^>�!  !Y�(�;u��2eD	CfP!F?lE/>$ 3?S40D	FGGJ
TH:nX4S@-A+<@EA 	FF(&�""!!Q��&���?<H/H%.�xD235#5!!>32'>54&#"#5##".546;54&'&#".546�%:Ȃ��:#AR#H '#69Q�*$!
+/9KYLxD>t�GG�SM.h2) T)/.I���%!',i/2G=@;5��.���x&@E�.x;235#5!#>;#"#5##".546;54&'&#".546�%:Ȃz�6'@3.5Q�*$!
+/9KYLxD>t�GG�G��%!',i/2G=@;5��.��x&BE�.���xH-5##".546;54&'&#".5463235#5!!>32'>54&#"#5�*$!
+/9KYL4%:Ȃ��:#AR#H '#69Q�+�-%!',i/2G=@;5D>t�GG�SM.h2) T)/.I��z���.�@�x&D�.��x?-5##".546;54&'&#".5463235#5!#>;#"#5
�*$!
+/9KYL4%:Ȃz�6'@3.5Q�+�,%!',i/2G=@;5D>t�GG�G�z���.�@x&F�X���q,.'#"&54632>7#"'.=3326?b#<&1$+ &1.<F&Q'7Q A6=C2O#QC(A4��*(��s�J#8���U'%>54&'.+"'&5467#5!#;2e		`.+,(���11
>)+7-('J6k8HH9o.&
*"4R���m2%>54'.+"'&546732654'7#"';2n2b,+-E3B$Q6AAD >D+7-(%L/�`%!
3D).Y'(
*"4��#53.54632#&$#"3##YYP���+�Se������mgQ'G0!SXJPel6A+G��;�#53.54632#.#"3##YYRdUs�=P5tI7<mgQ'G7HY��kg7/0G��m�#53.54632#.#"3##YYRi[}�CQ=�P<D
lgQ'G6J[��jh900G����#53.54632#&#"3##YYPta��OT��FOlgQ'G2N^���;3-G����#53.54632#&#"3##YYPzfh��8U��MVlgQ'G1O^F~U�;5,G��)�#53.54632#.#"3##YYP�mr��<W[�qU\lgQ'G1O]FTgj;6,G��]�#53.54632#.#"3##YYP�s}Υ?Yb�|\clgQ'G1P\G~Tgj:8+G����#53.54632#.#"3##YYP�y�ޱB[j�dhlgQ'G1P\H~Sfk:9+G����#53.54632#&$#"3##YYP����E\q����lgQ'G1Q[HRfkt,G����#53.54632#&$#"3##YYP�����I_x��sulgQ'G1RZI~Rel8<,G��0�#53.54632#&$#"3##YYP����Ma�թ|zlgQ'G0 SYIQel7>+G��d�#53.54632#&$#"3##YYP����Pc��ô��mgQ'G0!SXIQel7?+G�����&K��,����&L��,����&M��,����&N�:,���&O�j,��W�&P��,��~�&Q��,����&R��,����&S�,���&T�S,��8�&U��,��m�&V��,
�-#53.54632&54632.#"#&$#"3##YYP���GzYB 6&(*X������mgQ'G0!SX^MCC
B	-#!?$el6A+G����,#53.54632>32.#"#.#"3##YYRdUAk,
O6 6&(+P5tI7<mgQ'G7HY/../
B	-#!'kg7/0G����+#53.54632>32.#"#.#"3##YYRi[K{4
R: 6&(*V=�P<D
lgQ'G6J[5344
B	-#!?$jh900G��C�*#53.54632>32.#"#&#"3##YYPta[�AU@ 6&(*V��FOlgQ'G2N^B;>?
B	-#!?$�;3-G��v�*#53.54632>32.#"#&#"3##YYPzfg�GXA 6&(*V��MVlgQ'G1O^F>BB
B	-#!?$�;5,G����,#53.5463254632.#"#.#"3##YYP�mt�NXB 6&(*U[�qU\lgQ'G1O]I@CC
B	-#!?$gj;6,G����-#53.54632454632.#"#.#"3##YYP�s��TXB 6&(*Vb�|\clgQ'G1P\LCCC
B	-#!?$gj:8+G���-#53.54632&54632.#"#.#"3##YYP�y��[XB 6&(*Vj�dhlgQ'G1P\PECC
B	-#!?$fk:9+G��A�,#53.54632&54632.#"#&$#"3##YYP����aXB 6&(*Vq����lgQ'G1Q[SG

CC
B	-#!?$fkt,G��s�-#53.54632&54632.#"#&$#"3##YYP���gXB 6&(*Vx��sulgQ'G1RZVHCC
B	-#!?$el8<,G����-#53.54632&54632.#"#&$#"3##YYP���!mXB 6&(*V�թ|zlgQ'G0 SYYICC
B	-#!?$el7>+G����-#53.54632&54632.#"#&$#"3##YYP���4sXB 6&(*W��ô��mgQ'G0!SX\KCC
B	-#!?$el7?+G��
�-9#53.54632&54632.#"#&$#"3##"&54632YYP���GzYB 6&(*X������mgQc'G0!SX^MCC
B	-#!?$el6A+G�����,8#53.54632>32.#"#.#"3##"&54632YYRdUAk,
O6 6&(+P5tI7<mgQ'G7HY/../
B	-#!'kg7/0G�����+7#53.54632>32.#"#.#"3##"&54632YYRi[K{4
R: 6&(*V=�P<D
lgQI'G6J[5344
B	-#!?$jh900G���C�*6#53.54632>32.#"#&#"3##"&54632YYPta[�AU@ 6&(*V��FOlgQ�'G2N^B;>?
B	-#!?$�;3-G���v�*6#53.54632>32.#"#&#"3##"&54632YYPzfg�GXA 6&(*V��MVlgQ�'G1O^F>BB
B	-#!?$�;5,G�����,8#53.5463254632.#"#.#"3##"&54632YYP�mt�NXB!5&(+U[�qU\lgQ�'G1O]I@CC
B	-#!?$gj;6,G�����-9#53.54632454632.#"#.#"3##"&54632YYP�s��TXB 6&(*Vb�|\clgQ2'G1P\LCCC
B	-#!?$gj:8+G����-9#53.54632&54632.#"#.#"3##"&54632YYP�y��[XB 6&(*Vj�dhlgQe'G1P\PECC
B	-#!?$fk:9+G���A�,8#53.54632&54632.#"#&$#"3##"&54632YYP����aXB 6&(*Vq����lgQ�'G1Q[SG

CC
B	-#!?$fkt,G���s�-9#53.54632&54632.#"#&$#"3##"&54632YYP���gXB 6&(*Vx��sulgQ�'G1RZVHCC
B	-#!?$el8<,G�����-9#53.54632&54632.#"#&$#"3##"&54632YYP���!mXB 6&(*V�թ|zlgQ�'G0 SYYICC
B	-#!?$el7>+G�����-9#53.54632&54632.#"#&$#"3##"&54632YYP���4sXB 6&(*W��ô��mgQ0'G0!SX\KCC
B	-#!?$el7?+G������#53.#"#&546323##YYV&S>.1
P"ZObz0mgQ'Gib4,!7@@DU��G�����#53.#"#.546323##YYU0jE49
R`Um�8mgQ'Ghc6.!5<!GW��G���J�#53&#"#.546323##YYQ��@J
Tn^��IlgQ'G�92!17 L\��G������&|�D,�����&}�>,���J�&~�0,��0�*#53.#"#&54632>32.#"3##YYV&S>.2
P"[Oe@I/!5&)*mgQ'Gib4,!7@@DUI$%
B	-#

+8G����0�+#53.#"#.54632>32.#"3##YYU0jE4:
RaU>b)
N5!5&)*ggQ'Ghc6.!5<!GW,,,,
B	-#<"G���I0�*#53&#"#.54632>32.#"3##YYQ��@K
To^S�:U=!5&)*ggQ'G�92!17 L\<79:
B	-#<"G����0�*6#53.#"#&54632>32.#"3##"&54632YYV&S>.2
P"[Oe@I/!5&)*mgQ�'Gib4,!7@@DUI$%
B	-#

+8G�����0�+7#53.#"#.54632>32.#"3##"&54632YYU0jE4:
RaU>b)
N5!5&)*ggQ�'Ghc6.!5<!GW,,,,
B	-#<"G����I0�*6#53&#"#.54632>32.#"3##"&54632YYQ��@K
To^S�:U=!5&)*ggQ�'G�92!17 L\<79:
B	-#<"G��������&��=�����&��=�w��"&'732654&#"'>32�Sz7=5A.).&"$!4CIQ��WQ+)?#'#"A		N>=N���
���&�_���
���&�_���H��& ����H��& ����H�vB&!����H�vB&!����.�v-?�����vE&?�������vE&?�������v�&@�����.�v�@�����v�&@���������
632.#"4632#"&�DeO"92eD	�!  !,3V3)PK""""���@����
"&'73267%4632#"&��7\D56C[��    �'B""B'0""!!�����@����������
'"&'73267%4632#"&"&'73267��7ZD56C]��    B7X&F+,F%X�&B!!B'""!!m BB ��������b�n.:".547>;5!5!##">32#"&'73265474632#"&fD*;#:3_�s���(
=PZ^gZ�<>>�=<5:F*.
>GG�?88JHE1D32f    c�nH%2>54&#".54675!5!##"&5467.54632.#"632.#"(M~K.)#3<!QJ75�9˴3C2]�Rab

(,ZI4
#.*+"$	Y�2U6$2'
?G-)<-GG0H=1]J,G8"6$57DF3:�n#"3267#"&54>;5!5!#sK!EXC1T)(l3m�>kA
����	
#7+KYX9I#AGG�Xn&%".54>;5!5!#'2654&'#"'Hq@@nC��X�M[AoFI\:9*&AZ�%N=8I$BGGH[::I!G-0#:&12bPn.".547>;5!5!##">32#"&'732654fD*;#:3c�oPn�(
=PZ^gZ�<>>�=<5F*.
>GG�?88JHE1D32�An"-%"&54>35!5!##"&54632'23254#"6w�BuL��A�>)P<;KMFDknv=*'�YY9I#@GG�	$-1)=>':Gn<'�n -;5!##"&'#".54>32>7532654&#"326?5.#"�4D_Q6O& I./M.-P36O&:#W;"*?7%(2��6%&6:"*?'GGRRAG]&(&K61J)%!M�*-24*-23+--*-j�n22675!5!#'>54&#"'67.#".54>�2L!0F�*ʤ(B)E ,#3.M/(+D:-GT#/D�+	XGG\HA,Y62&G)*85%&/4$<*JI&/:���n.:F".547>;5!5!##">32#"&'73265474632#"&4632#"&fD*;#:3_�s���(
=PZ^gZ�<>>�=<5:�_!  !F*.
>GG�?88JHE1D32f    ��""!!�����n&���/n+#"3267#"&54>;5!5!#4632#"&sK!EXC1T)(l3m�>kA
�����!  !�	
#7+KYX9I#AGG�B""!!Xn&2%".54>;5!5!#'2654&'#"4632#"&'Hq@@nC��X�M[AoFI\:9*&AZ�!  !�%N=8I$BGGH[::I!G-0#:&12�""!!
Pn.:".547>;5!5!##">32#"&'7326544632#"&fD*;#:3c�oPn�(
=PZ^gZ�<>>�=<5�z!  !F*.
>GG�?88JHE1D32�""!!&An"-9%"&54>35!5!##"&54632'23254#"4632#"&6w�BuL��A�>)P<;KMFDknv=*'��!  !�YY9I#@GG�	$-1)=>':Gn<'�""!!����n&��������n&����x&>7.54632.'7>54&#")M%5)UIBV-#!g:&]T+[/�!%("/"+&H'5LI;+E
H
9�6" "#6�4����!"&'732654&#"'632''73�X}747^@-*+'13N�.�(u1$(S��F7375
Ca�B�� 8&1D�4�v��!"&'732654&#"'632''73�X}747^@-*+'13N�.�(u1$(S�vF7375
Ca�B�� 8&1D��v��-4632#"&"&'732654&#"'632''73�!  !$X}747^@-*+'13N�.�(u1$(S ""!!��F7375
Ca�B�� 8&1D�I��6� 73'"&54632.#"3267�I�(u;X��CMQEBcM"=._>,,+&2��'n��C51C/M.'DI	C�I�v6 73'"&54632.#"3267�I�(u;X��CMQEBcM"=._>,,+&2���'n��C51C/M.'DI	C��v6,4632#"&73'"&54632.#"3267�!  !-�(u;X��CMQEBcM"=._>,,+&2 ""!!G��'n��C51C/M.'DI	C�.����73'#"&54673267�.�(�;u�lC)OQYX:41#1!��'���
A4/OB�.�v��73'#"&54673267�.�(�;u�lC)OQYX:41#1!���'���
A4/OB��v��&4632#"&73'#"&54673267�!  !�(�;u�lC)OQYX:41#1! ""!!Y��'���
A4/OB�I�v���+73'#"'3267#"&547&54673267�I�(u;X�LC)Q 0"C)OP7YX?/+& 0"��'n��
,
?
C3"<+CB�.�v-�C%73'23267#"&5467654&#"'>7.#".54>32>�c�(u;X�8&=+)5 ;C8> 6F
#GA.IY':"::u�'nn-&0<
7,#5#7
!;+25X7$-�.�v��T%73'"'3267#"&547.5467.#"'>7.#".54>32>323267�c�(u;X�m

!'5 <B!6F
#GA.IY':"::&8&+! '5u�'nn�

;
8.

"'	#7
!;+25X7$-.%


<
�.���73'.#"'632�.�(�;u��2eD	CfP!��'���?;H/G&�.�v��73'.#"'632�.�(�;u��2eD	CfP!���&���?<H/H%��v�� 4632#"&73'.#"'632�!  !�(�;u��2eD	CfP!;""!!Q��&���?<H/H%�I����73'"&'73267�I�(�;f��Ad#L=>M"d���&~��'B!!B'����� 4632#"&73'"&'73267�!  !-�(�;f��Ad#L=>M"d*""!!=��&~��'B!!B'�X�v��"73'"&'73267"&'73267�\�(�:b��=]  I:;H!c;=[")K/0K)![ho�+iiy%??&h??��v�� .4632#"&73'"&'73267"&'73267�!  !T�(�:b��=]  I:;H!c;=[")K/0K)![*""!!%o�+iiy%??&h??���9�v��������v���������v�� �����B%"'3267#"&547.54673267jQ 0"C)OQYX?/+& /"C�"1
4&#!32
0
�.��-;'2"3267#"&5467654&#"'67.#".54>32>h8&80)5 ;C:@ 5F
#"BE+I[':"9;$&	1
-#+

.	.#*(F/%�.���I"'3267#"&547.5467&#"'67.#".54>32>323267

!%5 <B 5F
#"BE+I[':"9;&8&)$ *5�0
-%	
		.	.#*(F/%%
	
1
���M�v��[*���������:3�n����v���n4���*nB.'#".547.54676;5!5!##">32&"#"3:7&54632�@k@&*Qq��*��%=%#�.G#*'1$:8?2+"3((
 BGG�#
GJ!!. *.��<nZ"&'.546?'.#"3267#"&54>32767.5467>;5!5!##"3:3&54632'T(!''/@(963 T@P%  Z4��<�1i0/PS
*+-"=E=�N


J)+?<0(189N#

OH,?NGG�6.;"1 %	��i�g��,.54632.#"7"&54632"&'73267�SB/"(&$d2J7="$
<Gg$K$CC	B
, B'oR<CY*7L:�Vg��4632#"&53&'73267#"'�6
@715-D[GR3Tھ'B@E>^L=���&4632#"&##5353&'73267#"'3WQYY6
@715-D[GR3gT���'G�'B@E>^L=�G�����(4632#"&7#"'#"&'73267&'732674�VCU3Z;Bf"G=.31@3-1)
W"XIF?5PV=:?9
=<A9�%gX�.4632#"&.#"#".'73267&'73267#"'�(&

#9/B%+@715-D[GT�H4;7,,"B@E>^L%5�gg��'4632#"&.#"'63273267#"'`I)2""'42$9715-D[G+!T�O[&	IB@E>^L,<�Tg��64632#"&.#"'>327.#"'63273267#"'`S-+*2-F&, '42$9715-D[G+!T�(%	E
+&49EB@E>^L,<������&��([�74632#"&##53.#"#".'73267&'73267#"'3w3QYW'%

#9/B%+@715-D[GnT���'GD1;7,,"B@E>^L+G�j��04632#"&##53.#"'63273267#"'3�QYX)2!"'42$9715-D[G+!nT���'GLX%	IB@E>^L3G�W��?4632#"&##53.#"'>327.#"'63273267#"'3�QYK+**2-F&, '42$9715-D[G+!nT���'G$#
	E
+&49EB@E>^L3G���N4632#"&##53.#"#".'732632654&/.=7&'73267#"'3�.QYB)60B($
  0%
 7.F$	@715-D[GWT���'G(25085 
35B@E>^L,G�94632#"&#53.54632&'73267#"'#&$#"3##3�&YP���=x3@715-D[G)!$Ae������mgQT��G0!SXVG)]B@E>^L3el6A+G����74632#"&#53.54632&'73267#"'#.#"3##�BYRdU\G@715-D[G P5tI7<mgQT��G7HY/
B@E>^L	*7kg7/0G��"�84632#"&#53.54632&'73267#"'#.#"3##>�YRi[8a*@715-D[GQ=�P<D
lgQT��G6J[B@E>^L+5jh900G��f�74632#"&#53.54632&'73267#"'#&#"3##���YPtaI�8
@715-D[G$ T��FOlgQT��G2N^*' B@E>^L+4�;3-G����74632#"&#53.54632&'73267#"'#&#"3##���YPzfV�@
@715-D[G(#U��MVlgQT��G1O^1-(B@E>^L+5�;5,G����84632#"&#53.54632&'73267#"'#.#"3##��oYP�mi�I@715-D[G&-(W[�qU\lgQT��G1O]<6%6B@E>^L
-8gj;6,G����84632#"&#53.54632&'73267#"'#.#"3##�HYP�sp�N@715-D[G-(Yb�|\clgQT��G1P\;4$4B@E>^L+5gj:8+G���84632#"&#53.54632&'73267#"'#.#"3##9� YP�yy�S@715-D[G/)[j�dhlgQT��G1P\;3#4B@E>^L*3fk:9+G��J�74632#"&#53.54632&'73267#"'#&$#"3##f��YP����Y@715-D[G1+\q����lgQT��G1Q[=5$7B@E>^L*2fkt,G���84632#"&#53.54632&'73267#"'#&$#"3##���YP����b@715-D[G6._x��sulgQT��G1RZD:'@B@E>^L*4el8<,G����84632#"&#53.54632&'73267#"'#&$#"3##���YP���
h"@715-D[G:1a�թ|zlgQT��G0 SYH=(FB@E>^L+4el7>+G����94632#"&#53.54632&'73267#"'#&$#"3##�YYP���$p*@715-D[G# ;c��ô��mgQT��G0!SXOC*QB@E>^L2el7?+G���$n�54632#"&.5463273267#"'3###53.#"���TK,!+715-D[G

ngQYW=7(*T�#@"ASB@E>^L&1G��'Ghc1+"7��[�44632#"&#53.#"#&5463273267#"'3##wYV&S>.1
P"ZO4)3715-D[GmgQT��Gib4,!7@@DUB@E>^L%/G����[�64632#"&#53.#"#.54632'73267#"'3##wYU0jE49
R`UF7@715-D[GmgQT��Ghc6.!5<!GWB@E>^L&/G���J[�74632#"&#53&#"#.54632&'73267#"'3##wYQ��@J
Tn^Br2	@715-D[G lgQT��G�92!17 L\&#B@E>^L	(2G����g��"0&54632.#"!53%"&54632"&'73267P?TB0")%#��Q1K8*!!%
<GgHKCC	B
, B'��oR<C.+*7L:������&���g��*8&'#"&'73267632.#"7"&54632"&'73267�'(6E^"F9-1/&$50")%#d2J8*!!%	=Gg-0Y^FDIC	B
, B'oR<C.+*7L:�%g��$0=.#"#".'732632>32.#"7"&54632"&'73267�(&

#9/B%+ L5/"(&x2J7="$
<GgH4;7,,,,	B
, -VoR<CY*7L:�gg��)6.#"'632>32.#"7"&54632"&'73267�)2""'40:=*/"($|2J7="$
<GgO[&	I ($$	B
-#5MoR<CY*7L:�Tg��.:G2.#"#.#"'>327.#"'632>"&54632"&'73267C/"'%
U-+*2-F&, '4-@
=�2J7="$
<G�	B
-#@&(%	E
+&49E!(%$�R<CY*7L:������&����(��&����j��&����W��&�������&N�-9F#53.54632&54632.#"#&$#"3##"&54632"&'73267YYP���@xSB/"(&$X������mgQ�2J7="$
<G'G0!SXXI
CC	B
, B'el6A+G���R<CY*7L:4�+7D#53.54632>32.#"#.#"3##"&54632"&'73267YYRdUxUI1/"(&P5tI7<mgQL2J7="$
<K'G7HYR*(	B
, 1@kg7/0G���R<CY*7L:e�+7D#53.54632>32.#"#.#"3##"&54632"&'73267YYRi[Gu1
N40"(&#U=�P<D
lgQ}2K8=!%
<G'G6J[/-/-	B
, B'jh900G���R<CY*7L:��*6C#53.54632>32.#"#&#"3##"&54632"&'73267YYPtaV�>N=/"(&$V��FOlgQ�2J7="$
<G'G2N^;689	B
, B'�;3-G���R<CY*7L:��*6D#53.54632>32.#"#&#"3##"&54632"&'73267YYPzfb�FP>/#(&$U��MVlgQ�2J8* "$
=G'G1O^?9<<	B
, B'�;5,G���R<C.+*7L:�+7E#53.54632>32.#"#.#"3##"&54632"&'73267YYP�mn�KS@0#(%#U[�qU\lgQ22J8*!!%	=G'G1O]B;>?	B
, B'gj;6,G���R<C.+*7L:N�+7E#53.54632>32.#"#.#"3##"&54632"&'73267YYP�s|�RSA/#(%#Vb�|\clgQe2J8* "$
=G'G1P\F>BB	B
, B'gj:8+G���R<C.+*7L:��,8E#53.5463254632.#"#.#"3##"&54632"&'73267YYP�y��YSB/"(&$Vj�dhlgQ�2J7="$
<G'G1P\J@CC	B
, B'fk:9+G���R<CY*7L:��,8F#53.54632454632.#"#&$#"3##"&54632"&'73267YYP����_SB0#(%#Vq����lgQ�2J8* "$
=G'G1Q[MBCC	B
, B'fkt,G���R<C.+*7L:��-9G#53.54632&54632.#"#&$#"3##"&54632"&'73267YYP���fTB0#(%#Vx��sulgQ�2J8*!!%	=F'G1RZPCCC	B
, B'el8<,G���R<C.+*7L:�-9G#53.54632&54632.#"#&$#"3##"&54632"&'73267YYP���lTA0#(%#V�թ|zlgQ02J8*!!$
=G'G0 SYSE		CC	B
, B'el7>+G���R<C.+*7L:K�-9G#53.54632&54632.#"#&$#"3##"&54632"&'73267YYP���-qSB/"(&$W��ô��mgQc2J7* "$
<G'G0!SXUGCC	B
, B'el7?+G���R<C.+*7L:�$��,8F#53.#"#.54632>32.#"3##"&54632"&'73267YYS>5(*PTK,=A- ."('rgQ�1K8*!!%
<G'Ggd1+"7#@"AS'!"	B	-#0BG���R<C.+*7L:����)5B#53.#"#&54632>32&#"3##"&54632"&'73267YYV&S>.2
P"[OeAD0-!")%mgQ�1K8=!%
<G'Gib4,!7@@DUI$%	B-#

+8G���R<CY*7L:����+7D#53.#"#.54632>32.#"3##"&54632"&'73267YYU0jE4:
RaU>b)
I5 -")%ggQ�1K8=!%
<G'Ghc6.!5<!GW,,,,	B	,"!<"G���R<CY*7L:�I��*6C#53&#"#.54632>32.#"3##"&54632"&'73267YYQ��@K
To^S�:S:0")%ggQ�1K8=!%
<G'G�92!17 L\<79:	B
-#<"G���R<CY*7L:�I����,%73'"'3267#"&547.54673267�I�Kj;X��Q 0"C)OQYX?/+& /"Cy�&mn"1
4&#!32
0
�,��+�8>%73"3267#"&5467654&#"'67.#".546?67�I�Kj080)5 ;C:@ 5F
#"BE+I[�n3*"-y�$"&	1
-#+

.	.#*(F/ 
UF�,����FL"'3267#"&547.5467&#"'67.#".5467'73326767

!%5 <B 5F
#"BE+I[�Kj1)$ *5�n3*"-�0
-%	
		.	.#*(F/ 
y�& 
	
1
F����734632#"&�k[$%%$����%%$  s���333�osn�����"kx7#537#53733733#3##7##%7#�}���"F!�"E"~���"F#�"E���B�A����A�B����9��x%/"&546323#254#""&54632'254#"�GJELHKF"M�NKK&""�HIELIIEMKK&""`UV^^VU`_��Nvu:;:<��aTV__VTaAtv;;::s���3�o���D�['@
&54673�KFELQDIHF�g���fj�����m;�[@
654'3<DHGFRKFFK�j��mg�����eI%�7'7'37'�v��d�
�xWVMT�^6��6^�/��2a�$#53533##スI��II��I�.��t>73.a
0�;�45~71#R3#1��RRH���y74632#"&H$%%$6%%$  *�Z�A3#1R��SA�0����
"&54>32'2654&#"sp-dRtq-eSK@@KK>>
ít�W��s�XL��������W[�!467'73H/�I�*e!;<��6/��?>54&#"'>32!!/�1E&@3.K"2'g@^n,M2�P�CL�5TR19>&:#1fY7b`5�Q(����)"&'532654&+532654&#"'>32�5_)+b.ZSdVAAPTC74P$-%lDilUEVZ�
SKBB<JK<39!=+dMHW
YG^w�
%!533##=4>5#U��D\hhVɠN�#Q��%QG4��@���� "&'532654&#"'!!>32�2\ =BMWVRC,Q��7Ag=�
TJOGI	PQ�/]Ep7����-".54>32.#"3>32'2654&#" Aj>(FmN1+BU1H:\oue;I@A,B$ @
D�k>xkS/L.Oh:#0qho�KPUDO'; +T7,��!5!#�����_yQG�}4����'3"&5467.54>32>54&#"2654&'kuQ90C8\57[7I7&E,9dB/B=64=A/EFIM=?A
gYI[U@9L&&L:AR5G0<X0�=5233279��B70G$L64A4����-"&'532>7##"&546322>54.#"�0+BV0I:\oudBi>(Fm,B$ ?0:JA
L.Oh:#0rgp�D�k=ykS/['<,S7PUDOU���&"&54632"&54632�$$$$$$$$� $&&$ �T $&&$ ,��&"&54632#>7�$$$$
0C� $&&$ ��5~7;�42M�85%
2��g1�N��N2���!!!!2�=�=�II2M�87-52g���=���N�1�G����+754>7>54&#"'>324632#"&�% '96(J"(\/[i/#!$[$$$$�&72*0"/:G`V+@6)(	�&&$  l�Z.@3#3#l�rr�@F��F*�Z�@3#*RR@�6�Z�@3#53#6qq��`ZF�	�3##�2�N��O�=g�����b���!!��aZD,�ZQ@26=467.=4&#,<?aI)0j460)Ia?<r)1�KAH.�b
:3�.H@K�1)�Z2@3#�HH@�6�Z[@"5>=475&=4&'53[<>aJ*/jj/*Ja><()1�K@H.�cc�.HAK�1)2��6323267#".'.#"21H (%(<0I '$'<O5

"O5

"(�W!!(��\WR(�W!!(��hWRR���'>73Y/C�5~7<�4Q���#>7�
0C�5~7;�3S���'>733'>73Z/C[/C�5~7<�45~7<�4Q���#>7##>7�
0C[
0C�5~7;�35~7;�3H���z#"&54632!"&54632!"&54632�$$$$��$$$$�$$$$ $&&$  $&&$  $&&$ Es�'7'77�2��3��3��2�3��3��2��22_�."&54632!!"&54632!!!!��=�!!!!� "" MI� "" ��1#RH�n3&'.+5!#3##'7326767#H�+&B����	TT�f�
,12��$
GG(H?O��G"��������&x1x�{�������&�y�������.�&�z�����c����&�x�4���K����&�y�#���W����&�z�+��� ����&�{����A����&�|�-���F����&�y�������&w"y�������C&�2��7��
6%�&����$6�I'�����$����&�������,��'����\�W.#"'>54.54632~&%*$^YY?SG,E�15P��|DmCK_Ui��[QX �R�r�7'7'37'�Gpu>uqH433�a7 vv 7akk���x4@#"&54675.''>7.546325#53#3267>54&#"�C)KU00B�:+[/0)M%5)UIBV-#*q4@�g:42 /"�>!%("/"�
O?)D�	%9D+&H'5LI;+E�GG��B,!"-6" "#6���HN�&�J3�g�,8.#"#".'732632654&/.=7'4632#"&�+60B($
  0%
 7.F$)1!  !g-25085 
35,31�""""�g��F4632#"&.#"#".'732632654&/.=7&'73267#"'+�+60B($
  0%
 7.F$	@715-D[GT�-25085 
35B@E>^L1��gD�%;.'&/.5<?>32.#"#.#"#".'732632�*7/F#

P7!5&(*�*7/B($
  1%
g315..
B	-#!?$-250<9��gD�%;G.'&/.5<?>32.#"#.#"#".'73263274632#"&�*7/F#

P7!5&(*�*7/B($
  1%
�g315..
B	-#!?$-250<9m��g��$:FS&'&/.5<?>32.#"#.#"#".'7326327"&54632"&'73267�07/F#
L6/"(&$�*7/B($
  1%
�2J7="$
<Gg7;15-,	B
, B'-250<9oR<CY*7L:n:!632>32'>54&#"#".5467.#"#".54675#5��YtPa,#G>P
.6&"L27%.${nGCA<1R45_'E*2? 2(8##U(8&
PG�h�n<G!632#"&54632#".54>;.#"#".54675#52654&#"��/*&OyDV;jA;3
JIJEseIqAK�XiQ)(*$$2�8G##,nGW0aH
(996:%(3MM2CW1\@EX*MGS&*!
eG��#-'(<n#4##5#"&'>54.#"#".54675#5267!632<hQ@&Hv:B'>%)(*$$2&=�M*&by17:nG��^ac'"	S&*!
eG�sW=J1<+&�4j	��
M
{�"Q	�
0y�
��
-;�K
	h	�	�	6�	")	_	 �	D�	*%		(g	
`�	>9	<�	
"�	4�		v]	"'	�Copyright 2015-2021 Google LLC. All Rights Reserved.Copyright 2015-2021 Google LLC. All Rights Reserved.Noto SansNoto SansRegularRegular2.007;GOOG;NotoSans-Regular2.007;GOOG;NotoSans-RegularNoto Sans RegularNoto Sans RegularVersion 2.007Version 2.007NotoSans-RegularNotoSans-RegularNoto is a trademark of Google LLC.Noto is a trademark of Google LLC.Monotype Imaging Inc.Monotype Imaging Inc.Monotype Design TeamMonotype Design TeamDesigned by Monotype design team, Irene Vlachou.Designed by Monotype design team, Irene Vlachou.http://www.google.com/get/noto/http://www.google.com/get/noto/http://www.monotype.com/studiohttp://www.monotype.com/studioThis Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: https://scripts.sil.org/OFLThis Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: https://scripts.sil.org/OFLhttp://scripts.sil.org/OFLhttp://scripts.sil.org/OFLiota adscriptiota adscriptAccented Greek SCAccented Greek SCTitling Alternates I and J for titling and all cap settingsTitling Alternates I and J for titling and all cap settingsflorin symbolflorin symbol�j2R	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a����������������	���
����������bc�d�e�������f����g�����h���jikmln�oqprsutvw�xzy{}|��~�����
��� !"#��$%&'()*+,-./0123��456789:;<=>?@AB��CDEFGHIJKLMNOPQ��RSTUVWXYZ[����\]^_`abcdefghijklmnopq�rstu��vwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~����������������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~���������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~������������������������������������������������������������������������������������������������������������������������������������������������												
			
																			 	!	"	#	$	%	&	'	(	)	*	+	,	-	.	/	0	1	2	3	4	5	6	7	8	9	:	;	<	=�	>	?	@	A	B	C	D	E	F	G	H	I	J	K	L	M	N	O	P	Q	R	S	T	U	V	W	X	Y	Z	[	\	]	^	_	`	a	b	c	d	e	f	g	h	i	j	k	l	m	n	o	p	q	r	s	t	u	v	w	x	y	z	{	|�	}	~		�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�









	























 
!
"
#
$
%
&
'
(
)
*
+
,
-
.
/
0
1
2
3
4
5
6
7
8
9
:
;
<
=
>
?
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
[
\
]
^
_
`
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
{
|
}
~

�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~����������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������









	























 
!
"
#
$
%
&
'
(
)
*
+
,
-
.
/
0
1
2
3
4
5
6
7
8
9
:
;
<
=
>
?
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
[
\
]
^
_
`
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
{
|
}
~

�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgNULLCRuni00A0uni00AD	overscoreuni00B2uni00B3uni00B5uni00B9AmacronamacronAbreveabreveAogonekaogonekCcircumflexccircumflex
Cdotaccent
cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve
Edotaccent
edotaccentEogonekeogonekEcaronecaronGcircumflexgcircumflex
Gdotaccent
gdotaccentuni0122uni0123HcircumflexhcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJijJcircumflexjcircumflexuni0136uni0137kgreenlandicLacutelacuteuni013Buni013CLcaronlcaronLdotldotNacutenacuteuni0145uni0146NcaronncaronnapostropheEngengOmacronomacronObreveobreve
Ohungarumlaut
ohungarumlautRacuteracuteuni0156uni0157RcaronrcaronSacutesacuteScircumflexscircumflexuni0162uni0163TcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring
Uhungarumlaut
uhungarumlautUogonekuogonekWcircumflexwcircumflexYcircumflexycircumflexZacutezacute
Zdotaccent
zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188Dtailuni018Auni018Buni018Cuni018Duni018Euni018Funi0190uni0191fhookuni0193
Gammalatinuni0195	Iotalatinuni0197uni0198uni0199uni019Auni019Buni019Cuni019Duni019Euni019FOhornohornuni01A2uni01A3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhornUpsilonlatinuni01B2uni01B3uni01B4uni01B5uni01B6uni01B7uni01B8uni01B9uni01BAuni01BBuni01BCuni01BDuni01BEuni01BFuni01C0uni01C1uni01C2uni01C3uni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3uni01E4uni01E5Gcarongcaronuni01E8uni01E9uni01EAuni01EBuni01ECuni01EDuni01EEuni01EFuni01F0uni01F1uni01F2uni01F3uni01F4uni01F5uni01F6uni01F7uni01F8uni01F9
Aringacute
aringacuteAEacuteaeacuteOslashacuteoslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217uni0218uni0219uni021Auni021Buni021Cuni021Duni021Euni021Funi0220uni0221uni0222uni0223uni0224uni0225uni0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233uni0234uni0235uni0236uni0237uni0238uni0239uni023Auni023Buni023Cuni023Duni023Euni023Funi0240Glottalstopcasedglottalstopcaseduni0243uni0244uni0245uni0246uni0247uni0248uni0249uni024Auni024Buni024Cuni024Duni024Euni024Funi0250uni0251uni0252uni0253uni0254uni0255uni0256uni0257uni0258uni0259uni025Auni025Buni025Cuni025Duni025Euni025Funi0260uni0261uni0262uni0263uni0264uni0265uni0266uni0267uni0268uni0269iotaserifeduni026Buni026Cuni026Duni026Euni026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276uni0277uni0278uni0279uni027Auni027Buni027Cuni027Duni027Euni027Funi0280uni0281uni0282uni0283uni0284uni0285uni0286uni0287uni0288uni0289uni028Auni028Buni028Cuni028Duni028Euni028Funi0290uni0291uni0292uni0293uni0294uni0295uni0296uni0297uni0298uni0299uni029Auni029Buni029Cuni029Duni029Euni029Funi02A0uni02A1uni02A2uni02A3uni02A4uni02A5uni02A6uni02A7uni02A8uni02A9uni02AAuni02ABuni02ACuni02ADuni02AEuni02AFuni02B0uni02B1uni02B2uni02B3uni02B4uni02B5uni02B6uni02B7uni02B8uni02B9uni02BAuni02BBuni02BCuni02BDuni02BEuni02BFuni02C0uni02C1uni02C2uni02C3uni02C4uni02C5uni02C8	macronmodacutemodgravemoduni02CCuni02CDuni02CEuni02CFuni02D0uni02D1uni02D2uni02D3uni02D4uni02D5uni02D6uni02D7uni02DEuni02DFuni02E0uni02E1uni02E2uni02E3uni02E4uni02E5uni02E6uni02E7uni02E8uni02E9uni02EAuni02EBuni02ECuni02EDuni02EEuni02EFuni02F0uni02F1uni02F2uni02F3uni02F4uni02F5uni02F6uni02F7uni02F8uni02F9uni02FAuni02FBuni02FCuni02FDuni02FEuni02FF	gravecomb	acutecombuni0302	tildecombuni0304uni0305uni0306uni0307uni0308
hookabovecombuni030Auni030Buni030Cuni030Duni030Euni030Funi0310uni0311uni0312uni0313uni0314uni0315uni0316uni0317uni0318uni0319uni031Auni031Buni031Cuni031Duni031Euni031Funi0320uni0321uni0322dotbelowcombuni0324uni0325uni0326uni0327uni0328uni0329uni032Auni032Buni032Cuni032Duni032Euni032Funi0330uni0331uni0332uni0333uni0334uni0335uni0336uni0337uni0338uni0339uni033Auni033Buni033Cuni033Duni033Euni033Funi0340uni0341uni0342uni0343uni0344uni0345uni0346uni0347uni0348uni0349uni034Auni034Buni034Cuni034Duni034Euni034Funi0350uni0351uni0352uni0353uni0354uni0355uni0356uni0357uni0358uni0359uni035Auni035Buni035Cuni035Duni035Euni035Funi0360uni0361uni0362uni0363uni0364uni0365uni0366uni0367uni0368uni0369uni036Auni036Buni036Cuni036Duni036Euni036Funi0370uni0371uni0372uni0373uni0374uni0375uni0376uni0377uni037Auni037Buni037Cuni037Duni037Euni037Ftonos
dieresistonos
Alphatonos	anoteleiaEpsilontonosEtatonos	IotatonosOmicrontonosUpsilontonos
OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsiuni03A9IotadieresisUpsilondieresis
alphatonosepsilontonosetatonos	iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhouni03C2sigmatauupsilonphichipsiomegaiotadieresisupsilondieresisomicrontonosupsilontonos
omegatonosuni03CFuni03D0uni03D1uni03D2uni03D3uni03D4uni03D5uni03D6uni03D7uni03D8uni03D9uni03DAuni03DBuni03DCuni03DDuni03DEuni03DFuni03E0uni03E1uni03F0uni03F1uni03F2uni03F3uni03F4uni03F5uni03F6uni03F7uni03F8uni03F9uni03FAuni03FBuni03FCuni03FDuni03FEuni03FFuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0460uni0461uni0462uni0463uni0464uni0465uni0466uni0467uni0468uni0469uni046Auni046Buni046Cuni046Duni046Euni046Funi0470uni0471uni0472uni0473uni0474uni0475uni0476uni0477uni0478uni0479OmegaroundcyomegaroundcyOmegatitlocyomegatitlocyOtcyotcyuni0480uni0481uni0482uni0483uni0484uni0485uni0486uni0487uni0488uni0489uni048Auni048Buni048Cuni048Duni048Euni048Funi0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0500uni0501uni0502uni0503uni0504uni0505uni0506uni0507uni0508uni0509uni050Auni050Buni050Cuni050Duni050Euni050Funi0510uni0511uni0512uni0513uni0514uni0515uni0516uni0517uni0518uni0519uni051Auni051Buni051Cuni051Duni051Euni051Funi0520uni0521uni0522uni0523uni0524uni0525uni0526uni0527Enlefthookcyuni0529uni052Auni052Buni052Cuni052Duni052Euni052Fbinducandradevacandrabindudevaanusvaradevavisargadeva
ashortdevaadevaaadevaidevaiidevaudevauudevarvocalicdevalvocalicdevaecandradeva
eshortdevaedevaaidevaocandradeva
oshortdevaodevaaudevakadevakhadevagadevaghadevangadevacadevachadevajadevajhadevanyadevattadevatthadevaddadevaddhadevannadevatadevathadevadadevadhadevanadevannnadevapadevaphadevabadevabhadevamadevayadevaradevarradevaladevalladevallladevavadevashadevassadevasadevahadevaoevowelsigndevaooevowelsigndeva	nuktadevaavagrahadevaaavowelsigndevaivowelsigndevaiivowelsigndevauvowelsigndevauuvowelsigndevarvocalicvowelsigndevarrvocalicvowelsigndevaecandravowelsigndevaeshortvowelsigndevaevowelsigndevaaivowelsigndevaocandravowelsigndevaoshortvowelsigndevaovowelsigndevaauvowelsigndeva
viramadevauni094Eawvowelsigndevaomdeva
udattadevaanudattadevauni0953uni0954candralongevowelsigndevauevowelsigndevauuevowelsigndevaqadevakhhadevaghhadevazadeva	dddhadevarhadevafadevayyadeva
rrvocalicdeva
llvocalicdevalvocalicvowelsigndevallvocalicvowelsigndeva	dandadevadbldandadevazerodevaonedevatwodeva	threedevafourdevafivedevasixdeva	sevendeva	eightdevaninedevaabbreviationsigndevauni0971acandradevaoedevaooedevaawdevauedevauuedevamarwariddadevazhadevaheavyyadeva	gabardeva	jabardevauni097D
ddabardeva	babardevauni1AB0uni1AB1uni1AB2uni1AB3uni1AB4uni1AB5uni1AB6uni1AB7uni1AB8uni1AB9uni1ABAuni1ABBuni1ABCuni1ABDuni1ABE
wbelowcombwturnedbelowcombveroundedcydelongleggedcy	onarrowcyeswidecytetallcytethreeleggedcyhardsigntallcy	yattallcy
ukunblendedcyuni1CD0uni1CD1uni1CD2uni1CD3uni1CD4uni1CD5uni1CD6uni1CD7uni1CD8uni1CD9uni1CDAuni1CDBuni1CDCuni1CDDuni1CDEuni1CDFuni1CE0uni1CE1uni1CE2uni1CE3uni1CE4uni1CE5uni1CE6uni1CE7uni1CE8uni1CE9uni1CEAuni1CEBuni1CECuni1CEDuni1CEEuni1CEFuni1CF0uni1CF1uni1CF2uni1CF3uni1CF4uni1CF5uni1CF6uni1CF8uni1CF9uni1D00uni1D01aeturnedBbarredsmalluni1D04uni1D05Ethsmalluni1D07eturnedopeniturneduni1D0Auni1D0BLstrokesmalluni1D0DNreversedsmalluni1D0F
Oopensmall	osideways
osidewaysopenoslashsidewaysoeturneduni1D15otophalfobottomhalfuni1D18RreversedsmallRturnedsmalluni1D1Buni1D1C	usidewaysudieresissidewaysmsidewaysturneduni1D20uni1D21uni1D22Ezhsmallspirantvoicedlaryngealuni1D25uni1D26uni1D27uni1D28uni1D29uni1D2Auni1D2Buni1D2CAEmoduni1D2E
Bbarredmoduni1D30uni1D31Ereversedmoduni1D33uni1D34uni1D35uni1D36uni1D37uni1D38uni1D39uni1D3ANreversedmoduni1D3Cuni1D3Duni1D3Euni1D3Funi1D40uni1D41uni1D42uni1D43
aturnedmoduni1D45aeturnedmoduni1D47uni1D48uni1D49uni1D4Aeopenmodeturnedopenmoduni1D4D
iturnedmoduni1D4Funi1D50uni1D51uni1D52oopenmodotophalfmodobottomhalfmoduni1D56uni1D57uni1D58usidewaysmod
mturnedmoduni1D5Buni1D5Cuni1D5Duni1D5Euni1D5Funi1D60uni1D61uni1D62uni1D63uni1D64uni1D65uni1D66uni1D67uni1D68uni1D69uni1D6Auni1D6Buni1D6Cuni1D6Duni1D6Euni1D6Funi1D70uni1D71uni1D72uni1D73uni1D74uni1D75uni1D76uni1D77uni1D78uni1D79uni1D7Aiotaserifedstrokeuni1D7Cuni1D7DUsmallstrokeuni1D7Funi1D80uni1D81uni1D82uni1D83uni1D84uni1D85uni1D86uni1D87uni1D88uni1D89uni1D8Auni1D8Buni1D8Cuni1D8Duni1D8Euni1D8Funi1D90uni1D91uni1D92uni1D93uni1D94uni1D95uni1D96uni1D97uni1D98uni1D99uni1D9Auni1D9Buni1D9Cuni1D9Duni1D9Eereversedopenmoduni1DA0uni1DA1uni1DA2uni1DA3uni1DA4uni1DA5iotaserifedmodiotaserifedstrokemoduni1DA8uni1DA9uni1DAAuni1DABuni1DACuni1DADuni1DAEuni1DAFuni1DB0uni1DB1phimodlatinuni1DB3uni1DB4uni1DB5uni1DB6uni1DB7uni1DB8uni1DB9uni1DBAuni1DBBuni1DBCuni1DBDuni1DBEuni1DBFuni1DC0uni1DC1uni1DC2uni1DC3uni1DC4uni1DC5uni1DC6uni1DC7uni1DC8uni1DC9uni1DCAuni1DCBuni1DCCuni1DCDuni1DCEuni1DCFuni1DD0uni1DD1uni1DD2uni1DD3uni1DD4uni1DD5uni1DD6uni1DD7uni1DD8uni1DD9uni1DDAuni1DDBuni1DDCuni1DDDuni1DDEuni1DDFuni1DE0uni1DE1uni1DE2uni1DE3uni1DE4uni1DE5uni1DE6uni1DE7uni1DE8uni1DE9uni1DEAuni1DEBuni1DECuni1DEDuni1DEEuni1DEFuni1DF0uni1DF1uni1DF2uni1DF3uni1DF4uni1DF5kavykaaboverightcmbkavykaaboveleftcmbdotaboveleftcmbwideinvertedbridgebelowcmbdeletionmarkcmbuni1DFCuni1DFDuni1DFEuni1DFFuni1E00uni1E01uni1E02uni1E03uni1E04uni1E05uni1E06uni1E07uni1E08uni1E09uni1E0Auni1E0Buni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11uni1E12uni1E13uni1E14uni1E15uni1E16uni1E17uni1E18uni1E19uni1E1Auni1E1Buni1E1Cuni1E1Duni1E1Euni1E1Funi1E20uni1E21uni1E22uni1E23uni1E24uni1E25uni1E26uni1E27uni1E28uni1E29uni1E2Auni1E2Buni1E2Cuni1E2Duni1E2Euni1E2Funi1E30uni1E31uni1E32uni1E33uni1E34uni1E35uni1E36uni1E37uni1E38uni1E39uni1E3Auni1E3Buni1E3Cuni1E3Duni1E3Euni1E3Funi1E40uni1E41uni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Auni1E4Buni1E4Cuni1E4Duni1E4Euni1E4Funi1E50uni1E51uni1E52uni1E53uni1E54uni1E55uni1E56uni1E57uni1E58uni1E59uni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E64uni1E65uni1E66uni1E67uni1E68uni1E69uni1E6Auni1E6Buni1E6Cuni1E6Duni1E6Euni1E6Funi1E70uni1E71uni1E72uni1E73uni1E74uni1E75uni1E76uni1E77uni1E78uni1E79uni1E7Auni1E7Buni1E7Cuni1E7Duni1E7Euni1E7FWgravewgraveWacutewacute	Wdieresis	wdieresisuni1E86uni1E87uni1E88uni1E89uni1E8Auni1E8Buni1E8Cuni1E8Duni1E8Euni1E8Funi1E90uni1E91uni1E92uni1E93uni1E94uni1E95uni1E96uni1E97uni1E98uni1E99uni1E9Auni1E9Buni1E9Cuni1E9Duni1E9Euni1E9Funi1EA0uni1EA1uni1EA2uni1EA3uni1EA4uni1EA5uni1EA6uni1EA7uni1EA8uni1EA9uni1EAAuni1EABuni1EACuni1EADuni1EAEuni1EAFuni1EB0uni1EB1uni1EB2uni1EB3uni1EB4uni1EB5uni1EB6uni1EB7uni1EB8uni1EB9uni1EBAuni1EBBuni1EBCuni1EBDuni1EBEuni1EBFuni1EC0uni1EC1uni1EC2uni1EC3uni1EC4uni1EC5uni1EC6uni1EC7uni1EC8uni1EC9uni1ECAuni1ECBuni1ECCuni1ECDuni1ECEuni1ECFuni1ED0uni1ED1uni1ED2uni1ED3uni1ED4uni1ED5uni1ED6uni1ED7uni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EDEuni1EDFuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE6uni1EE7uni1EE8uni1EE9uni1EEAuni1EEBuni1EECuni1EEDuni1EEEuni1EEFuni1EF0uni1EF1Ygraveygraveuni1EF4uni1EF5uni1EF6uni1EF7uni1EF8uni1EF9uni1EFAuni1EFBuni1EFCuni1EFDuni1EFEuni1EFFuni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBCuni1FBDuni1FBEuni1FBFuni1FC0uni1FC1uni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCCuni1FCDuni1FCEuni1FCFuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDBuni1FDDuni1FDEuni1FDFuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECuni1FEDuni1FEEuni1FEFuni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCuni1FFDuni1FFEuni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni200Buni200Cuni200Duni200Euni200Funi2010uni2011
figuredashuni2015uni2016
underscoredbl
quotereverseduni201Funi2023onedotenleadertwodotenleaderuni2027uni2028uni2029uni202Auni202Buni202Cuni202Duni202Euni202Funi2031minuteseconduni2034uni2035uni2036uni2037uni2038uni203B	exclamdbluni203Duni203Euni203Funi2040uni2041uni2042uni2043uni2045uni2046uni2047uni2048uni2049uni204Auni204Buni204Cuni204Duni204Euni204Funi2050uni2051uni2052uni2053uni2054uni2055uni2056uni2057uni2058uni2059uni205Auni205Buni205Cuni205Duni205Euni205Funi2060uni2061uni2062uni2063uni2064uni2066uni2067uni2068uni2069uni206Auni206Buni206Cuni206Duni206Euni206Funi2070uni2071uni2074uni2075uni2076uni2077uni2078uni2079uni207Auni207Buni207Cuni207Duni207Euni207Funi2080uni2081uni2082uni2083uni2084uni2085uni2086uni2087uni2088uni2089uni208Auni208Buni208Cuni208Duni208Euni2090uni2091uni2092uni2093uni2094uni2095uni2096uni2097uni2098uni2099uni209Auni209Buni209Cuni20A0
colonmonetaryuni20A2lirauni20A5uni20A6pesetauni20A8uni20A9uni20AAdongEurouni20ADuni20AEuni20AFuni20B0uni20B1uni20B2uni20B3uni20B4uni20B5uni20B6uni20B7uni20B8uni20B9uni20BAuni20BBuni20BCuni20BDuni20BEuni20BFuni20F0uni2100uni2101uni2102uni2103uni2104uni2105uni2106uni2107uni2108uni2109uni210Auni210Buni210Cuni210Duni210Euni210Funi2110uni2111uni2112uni2113uni2114uni2115uni2116uni2117weierstrassuni2119uni211Auni211Buni211Cuni211Dprescriptionuni211Funi2120uni2121uni2123uni2124uni2125uni2126uni2127uni2128uni2129uni212Auni212Buni212Cuni212D	estimateduni212Funi2130uni2131uni2132uni2133uni2134uni2135uni2136uni2137uni2138uni2139uni213Auni213Buni213Cuni213Duni213Euni213Funi2140uni2141uni2142uni2143uni2144uni2145uni2146uni2147uni2148uni2149uni214Auni214Buni214Cuni214Duni214Euni214Funi2150uni2151uni2152uni2153uni2154uni2155uni2156uni2157uni2158uni2159uni215A	oneeighththreeeighthsfiveeighthsseveneighthsuni215Funi2184uni2189
minus.devauni25CCuni2C60uni2C61uni2C62uni2C63uni2C64uni2C65uni2C66uni2C67uni2C68uni2C69uni2C6Auni2C6Buni2C6Cuni2C6Duni2C6Euni2C6Funi2C70uni2C71uni2C72uni2C73uni2C74uni2C75uni2C76uni2C77uni2C78uni2C79uni2C7Auni2C7Buni2C7Cuni2C7Duni2C7Euni2C7Fbecombcyvecombcy	ghecombcydecombcy	zhecombcyzecombcykacombcyelcombcyemcombcyencombcyocombcypecombcyercombcyescombcytecombcyhacombcy	tsecombcy	checombcy	shacombcyshchacombcy
fitacombcy
estecombcyacombcyiecombcydjervcombcymonographukcombcy	yatcombcyyucombcyiotifiedacombcylittleyuscombcybigyuscombcyiotifiedbigyuscombcyuni2E00uni2E01uni2E02uni2E03uni2E04uni2E05uni2E06uni2E07uni2E08uni2E09uni2E0Auni2E0Buni2E0Cuni2E0Duni2E0Euni2E0Funi2E10uni2E11uni2E12uni2E13uni2E14uni2E15uni2E16uni2E17uni2E18uni2E19uni2E1Auni2E1Buni2E1Cuni2E1Duni2E1Euni2E1Funi2E20uni2E21uni2E22uni2E23uni2E24uni2E25uni2E26uni2E27uni2E28uni2E29uni2E2Auni2E2Buni2E2Cuni2E2Duni2E2Euni2E2Funi2E30uni2E31uni2E32uni2E33uni2E34uni2E35uni2E36uni2E37uni2E38uni2E39uni2E3Auni2E3Buni2E3Cuni2E3Duni2E3Euni2E3Funi2E40uni2E41uni2E42dashwithupturnleft
suspensiondblkavykainvertedlow kavykawithkavykaaboveinvertedlow	kavykalowkavykawithdotlowstackedcommadbl
solidusdottedtripledagger
medievalcommaparagraphuspunctuselevatuscornishversedividercrosspattyrightcrosspattyleftTironiansignetuniA640uniA641uniA642uniA643
Dzereversedcy
dzereversedcyuniA646uniA647uniA648uniA649
Ukmonographcy
ukmonographcyOmegabroadcyomegabroadcyYerneutralcyyerneutralcy
Yerubackyercy
yerubackyercy
Yatiotifiedcy
yatiotifiedcyYureversedcyyureversedcyIotifiedacyuniA657YusclosedlittlecyyusclosedlittlecyYusblendedcyyusblendedcyYusiotifiedclosedlittlecyyusiotifiedclosedlittlecyuniA65EuniA65F
Tsereversedcy
tsereversedcyDesoftcydesoftcyElsoftcyelsoftcyEmsoftcyemsoftcyOmonocularcyomonocularcyObinocularcyobinocularcyOdoublemonocularcyodoublemonocularcyuniA66EuniA66FuniA670uniA671uniA672uniA673uniA674uniA675uniA676uniA677uniA678uniA679uniA67AuniA67BuniA67CuniA67DuniA67EuniA67FuniA680uniA681uniA682uniA683uniA684uniA685uniA686uniA687uniA688uniA689TewithmiddlehookcyuniA68BuniA68CuniA68DuniA68EuniA68FuniA690uniA691uniA692uniA693uniA694uniA695uniA696uniA697	Odoublecy	odoublecy
Ocrossedcy
ocrossedcyuniA69CuniA69DuniA69EuniA69FuniA700uniA701uniA702uniA703uniA704uniA705uniA706uniA707uniA708uniA709uniA70AuniA70BuniA70CuniA70DuniA70EuniA70FuniA710uniA711uniA712uniA713uniA714uniA715uniA716uniA717uniA718uniA719uniA71AuniA71BuniA71CuniA71DuniA71EuniA71FuniA720uniA721uniA722uniA723uniA724uniA725uniA726uniA727uniA728uniA729uniA72AuniA72BuniA72CuniA72DuniA72EuniA72FuniA730uniA731uniA732uniA733uniA734uniA735uniA736uniA737uniA738uniA739uniA73AuniA73BuniA73CuniA73DuniA73EuniA73FuniA740uniA741uniA742uniA743uniA744uniA745uniA746uniA747uniA748uniA749uniA74AuniA74BuniA74CuniA74DuniA74EuniA74FuniA750uniA751uniA752uniA753uniA754uniA755uniA756uniA757uniA758uniA759uniA75AuniA75B
RumrotundauniA75DuniA75EuniA75FuniA760uniA761uniA762uniA763uniA764uniA765uniA766uniA767uniA768uniA769uniA76AuniA76BuniA76CuniA76DuniA76EuniA76FuniA770uniA771uniA772uniA773uniA774uniA775uniA776uniA777uniA778uniA779uniA77AuniA77BuniA77CuniA77DuniA77EuniA77FuniA780uniA781uniA782uniA783uniA784uniA785uniA786uniA787uniA788uniA789uniA78AuniA78BuniA78CuniA78DuniA78EuniA78FuniA790uniA791uniA792uniA793cpalatalhookhpalatalhook	Bflourish	bflourishFstrokefstroke	Aevolapuk	aevolapuk	Oevolapuk	oevolapuk	Uevolapuk	uevolapukuniA7A0uniA7A1uniA7A2uniA7A3uniA7A4uniA7A5uniA7A6uniA7A7uniA7A8uniA7A9uniA7AA
EreversedopenuniA7ACuniA7ADIotaserifedQsmalluniA7B0uniA7B1uniA7B2uniA7B3uniA7B4uniA7B5uniA7B6uniA7B7Ustrokeuni1D7EAglottalaglottalIglottaliglottalUglottaluglottal
Wanglicana
wanglicanaCpalatalhookShookZpalatalhook
Dmiddlestroke
dmiddlestroke
Smiddlestroke
smiddlestrokeHalfhturnedhalfhturneduniA7F7uniA7F8uniA7F9uniA7FAuniA7FBuniA7FCuniA7FDuniA7FEuniA7FFuniA830uniA831uniA832uniA833uniA834uniA835uniA836uniA837uniA838uniA839uniA8E0uniA8E1uniA8E2uniA8E3uniA8E4uniA8E5uniA8E6uniA8E7uniA8E8uniA8E9uniA8EAuniA8EBuniA8ECuniA8EDuniA8EEuniA8EFuniA8F0uniA8F1uniA8F2uniA8F3uniA8F4uniA8F5uniA8F6uniA8F7uniA8F8uniA8F9uniA8FAuniA8FBuniA8FCuniA8FDaydevaayvowelsigndevauniA92EuniAB30uniAB31uniAB32uniAB33uniAB34uniAB35uniAB36uniAB37uniAB38uniAB39uniAB3AuniAB3BuniAB3CuniAB3DuniAB3EuniAB3FuniAB40uniAB41uniAB42uniAB43uniAB44uniAB45uniAB46uniAB47uniAB48uniAB49uniAB4AuniAB4BuniAB4CuniAB4DuniAB4EuniAB4FuniAB50uniAB51uniAB52uniAB53uniAB54uniAB55uniAB56uniAB57uniAB58uniAB59uniAB5AuniAB5BuniAB5CuniAB5DuniAB5EuniAB5Fsakhayat	iotifiedeoeopenuouniAB64uniAB65dzdigraphretroflexhooktsdigraphretroflexhookrmiddletildeturned
wturnedmodlefttackmodrighttackmodf_ff_f_if_f_llongs_ts_tuniFE00uniFE20uniFE21uniFE22uniFE23uniFE24uniFE25uniFE26uniFE27uniFE28uniFE29uniFE2AuniFE2BuniFE2CuniFE2DuniFE2EuniFE2FuniFEFFuniFFFCuniFFFDEng.alt1Eng.alt2Eng.alt3uni030103060308uni030003060308uni030103040308uni030003040308uni013B.loclMAHuni0145.loclMAHAogonek.loclNAVEogonek.loclNAVIogonek.loclNAVUogonek.loclNAVI.saltIJ.saltIacute.saltIbreve.saltuni01CF.saltIcircumflex.saltuni0208.saltIdieresis.saltuni1E2E.saltIdotaccent.saltuni1ECA.saltIgrave.saltuni1EC8.saltuni020A.saltImacron.saltIogonek.saltIogonek_loclNAV.saltItilde.saltuni1E2C.saltJ.saltJcircumflex.saltuni01C7.saltuni01CA.saltuni013C.loclMAHuni0146.loclMAHaogonek.loclNAVeogonek.loclNAVuogonek.loclNAV	i_sc.saltiacute_sc.saltibreve_sc.salticircumflex_sc.saltidieresis_sc.saltidotaccent_sc.saltigrave_sc.salt
ij_sc.saltimacron_sc.saltiogonek_sc.saltitilde_sc.salt	j_sc.saltjcircumflex_sc.salta.sc	aacute.sc	abreve.scacircumflex.scadieresis.sc	agrave.sc
amacron.sc
aogonek.scaring.sc
aringacute.sc	atilde.scae.sc
aeacute.scb.scc.sc	cacute.sc	ccaron.scccedilla.scccircumflex.sc
cdotaccent.scd.sceth.sc	dcaron.sc	dcroat.sce.sc	eacute.sc	ebreve.sc	ecaron.scecircumflex.scedieresis.sc
edotaccent.sc	egrave.sc
emacron.sc
eogonek.scf.scg.sc	gbreve.scgcircumflex.sc
uni0123.sc
gdotaccent.sch.schbar.schcircumflex.sci.sc	iacute.sc	ibreve.scicircumflex.scidieresis.sci.loclTRK.sc	igrave.scij.sc
imacron.sc
iogonek.sc	itilde.scj.scjcircumflex.sck.sc
uni0137.scl.sc	lacute.sc	lcaron.sc
uni013C.scldot.sc	lslash.scm.scn.sc	nacute.sc	ncaron.sc
uni0146.sceng.sc	ntilde.sco.sc	oacute.sc	obreve.scocircumflex.scodieresis.sc	ograve.scohungarumlaut.sc
omacron.sc	oslash.scoslashacute.sc	otilde.scoe.scp.scthorn.scq.scr.sc	racute.sc	rcaron.sc
uni0157.scs.sc	sacute.sc	scaron.scscedilla.scscircumflex.sc
uni0219.sc
germandbls.sct.sctbar.sc	tcaron.sc
uni0163.sc
uni021B.scu.sc	uacute.sc	ubreve.scucircumflex.scudieresis.sc	ugrave.scuhungarumlaut.sc
umacron.sc
uogonek.scuring.sc	utilde.scv.scw.sc	wacute.scwcircumflex.scwdieresis.sc	wgrave.scx.scy.sc	yacute.scycircumflex.scydieresis.sc	ygrave.scz.sc	zacute.sc	zcaron.sc
zdotaccent.scuniA7F7.saltuni0406.saltuni0407.saltuni0408.saltuni04C0.saltuni0431.loclSRBuni04CF.salt	Iota.saltIotatonos.saltIotadieresis.saltuni1D35.saltuni1D36.salt	zero.tosfone.tosftwo.tosf
three.tosf	four.tosf	five.tosfsix.tosf
seven.tosf
eight.tosf	nine.tosfzero.osfone.osftwo.osf	three.osffour.osffive.osfsix.osf	seven.osf	eight.osfnine.osfzero.lfone.lftwo.lfthree.lffour.lffive.lfsix.lfseven.lfeight.lfnine.lf
zero.slash	zero.dnomone.dnomtwo.dnom
three.dnom	four.dnom	five.dnomsix.dnom
seven.dnom
eight.dnom	nine.dnom	zero.numrone.numrtwo.numr
three.numr	four.numr	five.numrsix.numr
seven.numr
eight.numr	nine.numrparenleft.sc
parenright.scbraceleft.sc
braceright.scbracketleft.scbracketright.sc	exclam.sc
exclamdown.scquestion.scquestiondown.scexclamdbl.scguilsinglleft.scguilsinglright.sc
fhook.ss03summationDoubleStruck.miruni02E502E502E9uni02E502E502E6uni02E502E502E8uni02E502E502E7uni02E502E9uni02E502E902E5uni02E502E902E9uni02E502E902E6uni02E502E902E8uni02E502E902E7uni02E502E6uni02E502E602E5uni02E502E602E9uni02E502E602E6uni02E502E602E8uni02E502E602E7uni02E502E8uni02E502E802E5uni02E502E802E9uni02E502E802E6uni02E502E802E8uni02E502E802E7uni02E502E7uni02E502E702E5uni02E502E702E9uni02E502E702E6uni02E502E702E8uni02E502E702E7uni02E902E5uni02E902E502E5uni02E902E502E9uni02E902E502E6uni02E902E502E8uni02E902E502E7uni02E902E902E5uni02E902E902E6uni02E902E902E8uni02E902E902E7uni02E902E6uni02E902E602E5uni02E902E602E9uni02E902E602E6uni02E902E602E8uni02E902E602E7uni02E902E8uni02E902E802E5uni02E902E802E9uni02E902E802E6uni02E902E802E8uni02E902E802E7uni02E902E7uni02E902E702E5uni02E902E702E9uni02E902E702E6uni02E902E702E8uni02E902E702E7uni02E602E5uni02E602E502E5uni02E602E502E9uni02E602E502E6uni02E602E502E8uni02E602E502E7uni02E602E9uni02E602E902E5uni02E602E902E9uni02E602E902E6uni02E602E902E8uni02E602E902E7uni02E602E602E5uni02E602E602E9uni02E602E602E8uni02E602E602E7uni02E602E8uni02E602E802E5uni02E602E802E9uni02E602E802E6uni02E602E802E8uni02E602E802E7uni02E602E7uni02E602E702E5uni02E602E702E9uni02E602E702E6uni02E602E702E8uni02E602E702E7uni02E802E5uni02E802E502E5uni02E802E502E9uni02E802E502E6uni02E802E502E8uni02E802E502E7uni02E802E9uni02E802E902E5uni02E802E902E9uni02E802E902E6uni02E802E902E8uni02E802E902E7uni02E802E6uni02E802E602E5uni02E802E602E9uni02E802E602E6uni02E802E602E8uni02E802E602E7uni02E802E802E5uni02E802E802E9uni02E802E802E6uni02E802E802E7uni02E802E7uni02E802E702E5uni02E802E702E9uni02E802E702E6uni02E802E702E8uni02E802E702E7uni02E702E5uni02E702E502E5uni02E702E502E9uni02E702E502E6uni02E702E502E8uni02E702E502E7uni02E702E9uni02E702E902E5uni02E702E902E9uni02E702E902E6uni02E702E902E8uni02E702E902E7uni02E702E6uni02E702E602E5uni02E702E602E9uni02E702E602E6uni02E702E602E8uni02E702E602E7uni02E702E8uni02E702E802E5uni02E702E802E9uni02E702E802E6uni02E702E802E8uni02E702E802E7uni02E702E702E5uni02E702E702E9uni02E702E702E6uni02E702E702E8ampersand.sc
uni0308.sc
uni0307.scgravecomb.scacutecomb.sc
uni030B.sc
uni0302.sc
uni030C.sc
uni0306.sc
uni030A.sctildecomb.sc
uni0304.sc
uni0328.sc	macron.sc
idotlesscyjedotlesscyiogonekdotlessjstrokedotlessjcrossedtaildotlessjmoddotless
yotdotlessisubscriptdotlessiretroflexhookdotlessistrokemoddotlessjcrossedtailmoddotlessitildebelowdotlessidotbelowdotlessistrokedotlessimoddotlessiitalicDoubleStruckdotlessjitalicDoubleStruckdotlessjsubscriptdotless
uni1FBC.ad
uni1F88.ad
uni1F89.ad
uni1F8A.ad
uni1F8B.ad
uni1F8C.ad
uni1F8D.ad
uni1F8E.ad
uni1F8F.ad
uni1FCC.ad
uni1F98.ad
uni1F99.ad
uni1F9A.ad
uni1F9B.ad
uni1F9C.ad
uni1F9D.ad
uni1F9E.ad
uni1F9F.ad
uni1FFC.ad
uni1FA8.ad
uni1FA9.ad
uni1FAA.ad
uni1FAB.ad
uni1FAC.ad
uni1FAD.ad
uni1FAE.ad
uni1FAF.aduni037F.saltuni1F38.saltuni1F39.saltuni1F3A.saltuni1F3B.saltuni1F3C.saltuni1F3D.saltuni1F3E.saltuni1F3F.saltuni1FDA.saltuni1FDB.saltuni03B1030603130300uni03B1030603130301uni03B1030603140300uni03B1030603140301uni03B1030403130300uni03B1030403130301uni03B1030403140300uni03B1030403140301uni03B9030803060300uni03B9030803060301uni03B9030803040300uni03B9030803040301uni03B9030603130300uni03B9030603130301uni03B9030603140300uni03B9030603140301uni03B9030403130300uni03B9030403130301uni03B9030403140300uni03B9030403140301uni03C5030803060300uni03C5030803040300uni03C5030803040301uni03C5030603130300uni03C5030603130301uni03C5030603140300uni03C5030603140301uni03C5030403130300uni03C5030403130301uni03C5030403140300uni03C5030403140301uni03D0.altphi.saltalpha.scbeta.scgamma.scdelta.sc
epsilon.sczeta.sceta.sctheta.sciota.sckappa.sc	lambda.sc
uni03BC.scnu.scxi.sc
omicron.scpi.scrho.sc
uni03C2.scsigma.sctau.sc
upsilon.scphi.scchi.scpsi.scomega.sciotatonos.sciotadieresis.sciotadieresistonos.scupsilontonos.scupsilondieresis.scupsilondieresistonos.scomicrontonos.sc
omegatonos.sc
alphatonos.scepsilontonos.scetatonos.sc
uni03D7.sc
uni1F00.sc
uni1F01.sc
uni1F02.sc
uni1F03.sc
uni1F04.sc
uni1F05.sc
uni1F06.sc
uni1F07.sc
uni1F70.sc
uni1F71.sc
uni1FB6.sc
uni1FB0.sc
uni1FB1.sc
uni1FB3.sc
uni1FB2.sc
uni1FB4.sc
uni1F80.sc
uni1F81.sc
uni1F82.sc
uni1F83.sc
uni1F84.sc
uni1F85.sc
uni1F86.sc
uni1F87.sc
uni1FB7.sc
uni1F10.sc
uni1F11.sc
uni1F12.sc
uni1F13.sc
uni1F14.sc
uni1F15.sc
uni1F72.sc
uni1F73.sc
uni1F20.sc
uni1F21.sc
uni1F22.sc
uni1F23.sc
uni1F24.sc
uni1F25.sc
uni1F26.sc
uni1F27.sc
uni1F74.sc
uni1F75.sc
uni1FC6.sc
uni1FC3.sc
uni1FC2.sc
uni1FC4.sc
uni1F90.sc
uni1F91.sc
uni1F92.sc
uni1F93.sc
uni1F94.sc
uni1F95.sc
uni1F96.sc
uni1F97.sc
uni1FC7.sc
uni1F30.sc
uni1F31.sc
uni1F32.sc
uni1F33.sc
uni1F34.sc
uni1F35.sc
uni1F36.sc
uni1F37.sc
uni1F76.sc
uni1F77.sc
uni1FD6.sc
uni1FD0.sc
uni1FD1.sc
uni1FD2.sc
uni1FD3.sc
uni1FD7.sc
uni1F40.sc
uni1F41.sc
uni1F42.sc
uni1F43.sc
uni1F44.sc
uni1F45.sc
uni1F78.sc
uni1F79.sc
uni1FE4.sc
uni1FE5.sc
uni1F50.sc
uni1F51.sc
uni1F52.sc
uni1F53.sc
uni1F54.sc
uni1F55.sc
uni1F56.sc
uni1F57.sc
uni1F7A.sc
uni1F7B.sc
uni1FE6.sc
uni1FE0.sc
uni1FE1.sc
uni1FE2.sc
uni1FE3.sc
uni1FE7.sc
uni1F60.sc
uni1F61.sc
uni1F62.sc
uni1F63.sc
uni1F64.sc
uni1F65.sc
uni1F66.sc
uni1F67.sc
uni1F7C.sc
uni1F7D.sc
uni1FF6.sc
uni1FF3.sc
uni1FF2.sc
uni1FF4.sc
uni1FA0.sc
uni1FA1.sc
uni1FA2.sc
uni1FA3.sc
uni1FA4.sc
uni1FA5.sc
uni1FA6.sc
uni1FA7.sc
uni1FF7.sc
uni1FB3.sc.ad
uni1FB2.sc.ad
uni1FB4.sc.ad
uni1F80.sc.ad
uni1F81.sc.ad
uni1F82.sc.ad
uni1F83.sc.ad
uni1F84.sc.ad
uni1F85.sc.ad
uni1F86.sc.ad
uni1F87.sc.ad
uni1FB7.sc.ad
uni1FC3.sc.ad
uni1FC2.sc.ad
uni1FC4.sc.ad
uni1F90.sc.ad
uni1F91.sc.ad
uni1F92.sc.ad
uni1F93.sc.ad
uni1F94.sc.ad
uni1F95.sc.ad
uni1F96.sc.ad
uni1F97.sc.ad
uni1FC7.sc.ad
uni1FF3.sc.ad
uni1FF2.sc.ad
uni1FF4.sc.ad
uni1FA0.sc.ad
uni1FA1.sc.ad
uni1FA2.sc.ad
uni1FA3.sc.ad
uni1FA4.sc.ad
uni1FA5.sc.ad
uni1FA6.sc.ad
uni1FA7.sc.ad
uni1FF7.sc.adiotatonos.sc.ss06iotadieresis.sc.ss06iotadieresistonos.sc.ss06upsilontonos.sc.ss06upsilondieresis.sc.ss06upsilondieresistonos.sc.ss06omicrontonos.sc.ss06omegatonos.sc.ss06alphatonos.sc.ss06epsilontonos.sc.ss06etatonos.sc.ss06uni1F00.sc.ss06uni1F01.sc.ss06uni1F02.sc.ss06uni1F03.sc.ss06uni1F04.sc.ss06uni1F05.sc.ss06uni1F06.sc.ss06uni1F07.sc.ss06uni1F70.sc.ss06uni1F71.sc.ss06uni1FB6.sc.ss06uni1FB0.sc.ss06uni1FB1.sc.ss06uni1FB3.sc.ss06uni1FB2.sc.ss06uni1FB4.sc.ss06uni1F80.sc.ss06uni1F81.sc.ss06uni1F82.sc.ss06uni1F83.sc.ss06uni1F84.sc.ss06uni1F85.sc.ss06uni1F86.sc.ss06uni1F87.sc.ss06uni1FB7.sc.ss06uni1F10.sc.ss06uni1F11.sc.ss06uni1F12.sc.ss06uni1F13.sc.ss06uni1F14.sc.ss06uni1F15.sc.ss06uni1F72.sc.ss06uni1F73.sc.ss06uni1F20.sc.ss06uni1F21.sc.ss06uni1F22.sc.ss06uni1F23.sc.ss06uni1F24.sc.ss06uni1F25.sc.ss06uni1F26.sc.ss06uni1F27.sc.ss06uni1F74.sc.ss06uni1F75.sc.ss06uni1FC6.sc.ss06uni1FC3.sc.ss06uni1FC2.sc.ss06uni1FC4.sc.ss06uni1F90.sc.ss06uni1F91.sc.ss06uni1F92.sc.ss06uni1F93.sc.ss06uni1F94.sc.ss06uni1F95.sc.ss06uni1F96.sc.ss06uni1F97.sc.ss06uni1FC7.sc.ss06uni1F30.sc.ss06uni1F31.sc.ss06uni1F32.sc.ss06uni1F33.sc.ss06uni1F34.sc.ss06uni1F35.sc.ss06uni1F36.sc.ss06uni1F37.sc.ss06uni1F76.sc.ss06uni1F77.sc.ss06uni1FD6.sc.ss06uni1FD0.sc.ss06uni1FD1.sc.ss06uni1FD2.sc.ss06uni1FD3.sc.ss06uni1FD7.sc.ss06uni1F40.sc.ss06uni1F41.sc.ss06uni1F42.sc.ss06uni1F43.sc.ss06uni1F44.sc.ss06uni1F45.sc.ss06uni1F78.sc.ss06uni1F79.sc.ss06uni1FE4.sc.ss06uni1FE5.sc.ss06uni1F50.sc.ss06uni1F51.sc.ss06uni1F52.sc.ss06uni1F53.sc.ss06uni1F54.sc.ss06uni1F55.sc.ss06uni1F56.sc.ss06uni1F57.sc.ss06uni1F7A.sc.ss06uni1F7B.sc.ss06uni1FE6.sc.ss06uni1FE0.sc.ss06uni1FE1.sc.ss06uni1FE2.sc.ss06uni1FE3.sc.ss06uni1FE7.sc.ss06uni1F60.sc.ss06uni1F61.sc.ss06uni1F62.sc.ss06uni1F63.sc.ss06uni1F64.sc.ss06uni1F65.sc.ss06uni1F66.sc.ss06uni1F67.sc.ss06uni1F7C.sc.ss06uni1F7D.sc.ss06uni1FF6.sc.ss06uni1FF3.sc.ss06uni1FF2.sc.ss06uni1FF4.sc.ss06uni1FA0.sc.ss06uni1FA1.sc.ss06uni1FA2.sc.ss06uni1FA3.sc.ss06uni1FA4.sc.ss06uni1FA5.sc.ss06uni1FA6.sc.ss06uni1FA7.sc.ss06uni1FF7.sc.ss06uni1FB3.sc.ad.ss06uni1FB2.sc.ad.ss06uni1FB4.sc.ad.ss06uni1F80.sc.ad.ss06uni1F81.sc.ad.ss06uni1F82.sc.ad.ss06uni1F83.sc.ad.ss06uni1F84.sc.ad.ss06uni1F85.sc.ad.ss06uni1F86.sc.ad.ss06uni1F87.sc.ad.ss06uni1FB7.sc.ad.ss06uni1FC3.sc.ad.ss06uni1FC2.sc.ad.ss06uni1FC4.sc.ad.ss06uni1F90.sc.ad.ss06uni1F91.sc.ad.ss06uni1F92.sc.ad.ss06uni1F93.sc.ad.ss06uni1F94.sc.ad.ss06uni1F95.sc.ad.ss06uni1F96.sc.ad.ss06uni1F97.sc.ad.ss06uni1FC7.sc.ad.ss06uni1FF3.sc.ad.ss06uni1FF2.sc.ad.ss06uni1FF4.sc.ad.ss06uni1FA0.sc.ad.ss06uni1FA1.sc.ad.ss06uni1FA2.sc.ad.ss06uni1FA3.sc.ad.ss06uni1FA4.sc.ad.ss06uni1FA5.sc.ad.ss06uni1FA6.sc.ad.ss06uni1FA7.sc.ad.ss06uni1FF7.sc.ad.ss06anoteleia.sc
tonos.caseuni1FBF.caseuni1FBD.caseuni1FFE.caseuni1FDD.caseuni1FCE.caseuni1FDE.caseuni1FCF.caseuni1FDF.caseuni1FED.caseuni1FEE.caseuni1FC1.caseuni1FEF.caseuni1FFD.caseuni1FC0.caseuni1FCD.casetonos.scdieresistonos.sc
uni1FBF.sc
uni1FBD.sc
uni1FFE.sc
uni1FCD.sc
uni1FDD.sc
uni1FCE.sc
uni1FDE.sc
uni1FCF.sc
uni1FDF.sc
uni1FED.sc
uni1FEE.sc
uni1FC1.sc
uni1FEF.sc
uni1FFD.sc
uni1FC0.scnullCR_1space_1	uni02BC_1ashortnuktadeva
anuktadevaaanuktadeva
inuktadevaiinuktadeva
unuktadevauunuktadevarvocalicnuktadevalvocalicnuktadevaecandranuktadevaeshortnuktadeva
enuktadevaainuktadevaocandranuktadevaoshortnuktadeva
onuktadevaaunuktadevarrvocalicnuktadevallvocalicnuktadevaacandranuktadevaghanuktadevanganuktadevacanuktadevachanuktadevajhanuktadevanyanuktadevattanuktadeva
tthanuktadevannanuktadevatanuktadevathanuktadevadanuktadevadhanuktadevapanuktadevabanuktadevabhanuktadevamanuktadevalanuktadevavanuktadevashanuktadevassanuktadevasanuktadevahanuktadeva	kassadeva	janyadevarephdeva	vattudeva
kaprehalfdevakhaprehalfdeva
gaprehalfdevaghaprehalfdevangaprehalfdeva
caprehalfdevachaprehalfdeva
japrehalfdevajhaprehalfdevanyaprehalfdevattaprehalfdevatthaprehalfdevaddaprehalfdevaddhaprehalfdevannaprehalfdeva
taprehalfdevathaprehalfdeva
daprehalfdevadhaprehalfdeva
naprehalfdeva
paprehalfdevaphaprehalfdeva
baprehalfdevabhaprehalfdeva
maprehalfdeva
yaprehalfdeva
raprehalfdeva
laprehalfdevallaprehalfdeva
vaprehalfdevashaprehalfdevassaprehalfdeva
saprehalfdeva
haprehalfdevazhaprehalfdevaheavyyaprehalfdevakassaprehalfdevajanyaprehalfdevakanuktaprehalfdevakhanuktaprehalfdevaganuktaprehalfdevaghanuktaprehalfdevanganuktaprehalfdevacanuktaprehalfdevachanuktaprehalfdevajanuktaprehalfdevajhanuktaprehalfdevanyanuktaprehalfdevattanuktaprehalfdevatthanuktaprehalfdevaddanuktaprehalfdevaddhanuktaprehalfdevannanuktaprehalfdevatanuktaprehalfdevathanuktaprehalfdevadanuktaprehalfdevadhanuktaprehalfdevananuktaprehalfdevapanuktaprehalfdevaphanuktaprehalfdevabanuktaprehalfdevabhanuktaprehalfdevamanuktaprehalfdevayanuktaprehalfdevalanuktaprehalfdevallanuktaprehalfdevavanuktaprehalfdevashanuktaprehalfdevassanuktaprehalfdevasanuktaprehalfdevahanuktaprehalfdevakaradeva	kharadevagaradeva	gharadeva	ngaradevacaradeva	charadevajaradeva	jharadeva	nyaradeva	ttaradeva
ttharadeva	ddaradeva
ddharadeva	nnaradevataradeva	tharadevadaradeva	dharadevanaradevaparadeva	pharadevabaradeva	bharadevamaradevayaradevararadevalaradeva	llaradevavaradeva	sharadeva	ssaradevasaradevaharadevamarwariddaradeva	zharadeva
heavyyaradevakassaradevajanyaradeva
kanuktaradevakhanuktaradeva
ganuktaradevaghanuktaradevanganuktaradeva
canuktaradevachanuktaradeva
januktaradevajhanuktaradevanyanuktaradevattanuktaradevatthanuktaradevaddanuktaradevaddhanuktaradevannanuktaradeva
tanuktaradevathanuktaradeva
danuktaradevadhanuktaradeva
nanuktaradeva
panuktaradevaphanuktaradeva
banuktaradevabhanuktaradeva
manuktaradeva
yanuktaradeva
ranuktaradeva
lanuktaradevallanuktaradeva
vanuktaradevashanuktaradevassanuktaradeva
sanuktaradeva
hanuktaradevakaraprehalfdevakharaprehalfdevagaraprehalfdevagharaprehalfdevangaraprehalfdevangaraprehalfUIdevacaraprehalfdevacharaprehalfdevajaraprehalfdevajharaprehalfdevanyaraprehalfdevattaraprehalfdevattaraprehalfUIdevattharaprehalfdevattharaprehalfUIdevaddaraprehalfdevaddaraprehalfUIdevaddharaprehalfdevaddharaprehalfUIdevannaraprehalfdevataraprehalfdevatharaprehalfdevadaraprehalfdevadharaprehalfdevanaraprehalfdevaparaprehalfdevapharaprehalfdevabaraprehalfdevabharaprehalfdevamaraprehalfdevayaraprehalfdevararaprehalfdevalaraprehalfdevallaraprehalfdevavaraprehalfdevasharaprehalfdevassaraprehalfdevasaraprehalfdevaharaprehalfdevazharaprehalfdevaheavyyaraprehalfdevakassaraprehalfdevajanyaraprehalfdevakanuktaraprehalfdevakhanuktaraprehalfdevaganuktaraprehalfdevaghanuktaraprehalfdevanganuktaraprehalfdevacanuktaraprehalfdevachanuktaraprehalfdevajanuktaraprehalfdevajhanuktaraprehalfdevanyanuktaraprehalfdevattanuktaraprehalfdevatthanuktaraprehalfdevaddanuktaraprehalfdevaddhanuktaraprehalfdevannanuktaraprehalfdevatanuktaraprehalfdevathanuktaraprehalfdevadanuktaraprehalfdevadhanuktaraprehalfdevananuktaraprehalfdevapanuktaraprehalfdevaphanuktaraprehalfdevabanuktaraprehalfdevabhanuktaraprehalfdevamanuktaraprehalfdevayanuktaraprehalfdevalanuktaraprehalfdevallanuktaraprehalfdevavanuktaraprehalfdevashanuktaraprehalfdevassanuktaraprehalfdevasanuktaraprehalfdevahanuktaraprehalfdevahaudeva	hauUIdevahauudeva
hauuUIdevaharvocalicdevaharrvocalicdevahanuktaudeva
hanuktauudevahanuktarvocalicdevahanuktarrvocalicdeva	haraudevaharauUIdeva
harauudevaharauuUIdevaraudevarauudevadaudevadauudevadarvocalicdeva	daraudeva
darauudevadararvocalicdevaranuktaudeva
ranuktauudevadanuktaudeva
danuktauudevadanuktarvocalicdeva
dddhaudevadddhauudevarhaudeva	rhauudevaoevowelsignanusvaradevaoevowelsignrephdevaoevowelsignrephanusvaradevaooevowelsignanusvaradevaooevowelsignrephdevaooevowelsignrephanusvaradevaiivowelsignanusvaradevaiivowelsignrephdevaiivowelsignrephanusvaradevaecandravowelsignanusvaradevaecandravowelsignrephdevaecandravowelrephanusvaradevaeshortvowelsignanusvaradevaeshortvowelsignrephdevaeshortvowelsignrephanusvaradeevowelsignanusvaradevaevowelsignrephdevaevowelsignrephanusvaradevaaivowelsignanusvaradevaaivowelsignrephdevaaivowelsignrephanusvaradevaocandravowelsignanusvaradevaocandravowelsignrephdevaocandravowelrephanusvaradevaoshortvowelsignanusvaradevaoshortvowelsignrephdevaoshortvowelsignrephanusvaradevaovowelsignanusvaradevaovowelsignrephdevaovowelsignrephanusvaradevaauvowelsignanusvaradevaauvowelsignrephdevaauvowelsignrephanusvaradevaawvowelsignanusvaradevaawvowelsignrephdevaawvowelsignrephanusvaradevarephanusvaradevaashortanusvaradevaiianusvaradevaecandraanusvaradevaeshortanusvaradevaaianusvaradevaocandraanusvaradevaoshortanusvaradeva
oanusvaradevaauanusvaradevaacandraanusvaradevaoeanusvaradevaooeanusvaradevaawanusvaradevaashortnuktaanusvaradevaiinuktaanusvaradevaecandranuktaanusvaradevaeshortnuktaanusvaradevaainuktaanusvaradevaocandranuktaanusvaradevaoshortnuktaanusvaradevaonuktaanusvaradevaaunuktaanusvaradevaacandranuktaanusvaradevakatadeva	kashadeva
khashadeva	ngagadeva	ngamadeva	ngayadevacacadeva	cachadevacacharadeva	chayadevajajadeva	jaddadeva	nyajadeva
ttattadevattattauudevattatthadeva
ttatthauudeva	ttayadevatthatthadeva
tthayadevaddaddhadeva
ddaddadevaddaddauudeva	ddayadevaddarayadevaddhaddhadeva
ddhayadevatatadevatataprehalfdeva	tathadeva	tashadeva	daghadevadagadevadabadeva	dabhadevadavadeva
davayadeva	dadhadevadadhayadevadadadeva
dadayadevadamadevadayadevadayaprehalfdeva	naddadevanaddaradeva	nathadevanatharadeva	nadhadevanadhaprehalfdevanadharadevananadeva	nashadevapanadeva	badhadevamapadeva
maparadevamapaprehalfdeva	maphadeva	mabhadeva	laddadevaladdaradeva	lathadevavayadeva	shacadeva	shavadeva	shaladeva	shanadeva
ssattadevassattayadevassattaradevassatthadeva
ssatthayadeva
ssattharadeva	sathadevasathaprehalfdevasapadevasapaprehalfdeva
saparadeva	saphadeva	hannadevahanadevahamadevahayadevahaladevahavadeva	ladevaMARlanuktadevaMARlaradevaMARlanuktaradevaMARshaladevaMAR
shadevaMARshaprehalfdevaMARshanuktadevaMARshanuktaprehalfdevaMARchaprehalfdevaNEPchanuktaprehalfdevaNEPcharaprehalfdevaNEPchanuktaraprehalfdevaNEP
jhadevaNEPjhanuktadevaNEPjhaprehalfdevaNEPjhanuktaprehalfdevaNEPjharadevaNEPjhanuktaradevaNEPjharaprehalfdevaNEPjhanuktaraprehalfdevaNEPfivedevaNEPeightdevaNEPninedevaNEPivowelsign00devaivowelsign01devaivowelsign02devaivowelsign03devaivowelsign04devaivowelsign05devaivowelsign06devaivowelsign07devaivowelsign08devaivowelsign09devaivowelsign10devaivowelsign11devaivowelsignanusvaradevaivowelsignanusvara01devaivowelsignanusvara02devaivowelsignanusvara03devaivowelsignanusvara04devaivowelsignanusvara05devaivowelsignanusvara06devaivowelsignanusvara07devaivowelsignanusvara08devaivowelsignanusvara09devaivowelsignanusvara10devaivowelsignanusvara11devaivowelsignrephdevaivowelsignreph01devaivowelsignreph02devaivowelsignreph03devaivowelsignreph04devaivowelsignreph05devaivowelsignreph06devaivowelsignreph07devaivowelsignreph08devaivowelsignreph09devaivowelsignreph10devaivowelsignreph11devaivowelsignrephanusvaradevaivowelsignrephanusvara01devaivowelsignrephanusvara02devaivowelsignrephanusvara03devaivowelsignrephanusvara04devaivowelsignrephanusvara05devaivowelsignrephanusvara06devaivowelsignrephanusvara07devaivowelsignrephanusvara08devaivowelsignrephanusvara09devaivowelsignrephanusvara10devaivowelsignrephanusvara11deva
dummymarkdevaiivowelsign1devaiivowelsign2devaiivowelsign3devaiivowelsignanusvara1devaiivowelsignanusvara2devaiivowelsignanusvara3devaiivowelsignreph1devaiivowelsignreph2devaiivowelsignreph3devaiivowelsignrephanusvara1devaiivowelsignrephanusvara2devaiivowelsignrephanusvara3devauvowelsignnuktadevauvowelsignnuktaleftdevauvowelsignnarrowdevauuvowelsignnuktadevauuvowelsignnuktaleftdevarvocalicvowelsignnuktadevarvocalicvowelsignnuktaleftdevarrvocalicvowelsignnuktadevarrvocalicvowelsignnuktaleftdevalvocalicvowelsignleftdevalvocalicvowelsignnuktadevalvocalicvowelsignnuktaleftdevallvocalicvowelsignnuktadevallvocalicvowelsignleftdevallvocalicvowelsignnuktaleftdevaviramanuktadevauevowelsignnuktadevauevowelsignnuktaleftdevauuevowelsignnuktadevauuevowelsignnuktaleftdeva
ngaaltdeva
chaaltdeva
ttaaltdevatthaaltdeva
ddaaltdevaddhaaltdeva
llaaltdevalaaltdevaMARnganuktaaltdevachanuktaaltdevattanuktaaltdevatthanuktaaltdevadddhaaltdeva
rhaaltdevalllaaltdevalanuktaaltdevaMARshaprehalfaltdeva
vattuudeva
vattuulowdevavattuulownuktadevavattuuudevavattuuulowdevavattuuulownuktadevavatturvocalicdevavatturvocaliclowdevavatturvocaliclownuktadevavatturrvocalicdevavattulvocalicdevavattullvocalicdevavattuviramadevavattuviramalowdevavattuviramalownuktadevavattuuevowellowdevavattuuevowellownuktadevavattuuuevowellowdevavattuuuevowellownuktadevauvowelsignlowdevauuvowelsignlowdevarvocalicvowelsignlowdevarrvocaliclowdevalvocalicvowelsignlowdevallvocalicvowelsignlowdeva
viramalowdevauevowelsignlowdevauuevowelsignlowdevadadaaltdevadabhaaltdevarephcandrabindudevaoevowelsigncandrabindudevaooevowelsigncandrabindudevaecandravowelsigncandrabindudevaeshortvowelsigncandrabindudevaevowelsigncandrabindudevaaivowelsigncandrabindudevaocandravowelsigncandrabindudevaoshortvowelsigncandrabindudevaovowelsigncandrabindudevaauvowelsigncandrabindudevaawvowelsigncandrabindudevaivowelsigncandrabindudevaivowelsigncandrabindu01devaivowelsigncandrabindu02devaivowelsigncandrabindu03devaivowelsigncandrabindu04devaivowelsigncandrabindu05devaivowelsigncandrabindu06devaivowelsigncandrabindu07devaivowelsigncandrabindu08devaivowelsigncandrabindu09devaivowelsigncandrabindu10devaivowelsigncandrabindu11devaiivowelcandrabindudevaiivowelcandrabindu1devaiivowelcandrabindu2devaiivowelcandrabindu3devaoevowelsignrephcandrabindudevaooevowelsignrephcandrabindudevaecandravowelrephcandrabindudevaeshortvowelrephcandrabindudevaevowelsignrephcandrabindudevaaivowelsignrephcandrabindudevaocandravowelrephcandrabindudevaoshortvowelrephcandrabindudevaovowelsignrephcandrabindudevaauvowelsignrephcandrabindudevaawvowelsignrephcandrabindudevaivowelsignrephcandrabindudevaivowelsignrephcandrabindu01devaivowelsignrephcandrabindu02devaivowelsignrephcandrabindu03devaivowelsignrephcandrabindu04devaivowelsignrephcandrabindu05devaivowelsignrephcandrabindu06devaivowelsignrephcandrabindu07devaivowelsignrephcandrabindu08devaivowelsignrephcandrabindu09devaivowelsignrephcandrabindu10devaivowelsignrephcandrabindu11devaiivowelsignrephcandrabindudevaiivowelsignrephcandrabindu1devaiivowelsignrephcandrabindu2devaiivowelsignrephcandrabindu3devavatturrvocalicUIdevavattulvocalicUIdevavattullvocalicUIdevaexclam.deva
quotedbl.devanumbersign.devapercent.devaquotesingle.devaparenleft.devaparenright.deva
asterisk.deva	plus.deva
comma.devahyphen.devaperiod.deva
slash.deva	zero.devaone.devatwo.deva
three.deva	four.deva	five.devasix.deva
seven.deva
eight.deva	nine.deva
colon.devasemicolon.deva	less.deva
equal.devagreater.deva
question.devabracketleft.devabackslash.devabracketright.devaasciicircum.devaunderscore.devabraceleft.devabar.devabraceright.devaasciitilde.devanbspace.devaendash.devaemdash.devaquoteleft.devaquoteright.devaquotedblleft.devaquotedblright.deva
ellipsis.deva
multiply.devadivide.deva	uni2010_1uni20B9.devaone_onedeva	two_udevathree_kadeva
one_radeva
two_radevathree_radevafour_radevafive_radevatwo_avagrahadevatwo_uni1CD0	vi_radevavisarga_uni1CE2visarga_uni1CE4visarga_uni1CE5visarga_uni1CE8uni1CE1.alt	uni20F0_1sharvocalicdevaayanusvaradevaayanusvaravowelsigndevaayvowelsigncandrabindudevaayvowelsignrephdevaayvowelsignrephanusvaradevaayvowelsignrephcandrabindudevamarwariddaddadevamarwariddaddhadevamarwariddayadeva�����n��34/045����
%&)**+-.45<=>?@A\]jkklmnvwyzz{������������������_`��	@	A	A	B	�	�	�	�
g
h
h
i
l
m
v
w
�
�
�
�vw������������������������

�vw����������������23347889?@@AGHVWz{{|~��������������������������67ABEFFGGHIJNOQB&4---
;w
;w��(����!"%**..//0234?@wy{{|�������������w���������������{{������������7AGGJN��h�����
 #%)  +##,&3-bg;jjAlmBbbDjjEopFt�H��]��h��i��k	�	�l	�	��
m
t�
�
����������*-.1u}��	���

!"!"#$%%'3'044]a9hi>`a@cnBq�N��v��w	�	�x
h
h�
m
v�
�
��������-���'()*+,-./0123juwz{|}�������������	�	�	�	�	�	�	�
p
��DFLT&cyrl\dev2
devazgrek�latn��
"#$%+-./123457MKD FSRB z��
"#$%+,-./0123457��
"#$%+-./123457��
"#$%+-./123457MAR 0NEP P��

!&()*��

!&()*��
!'()*MAR .NEP L��!&(*6��!&(*6��!'(*6��	
"#$%+,-./0123457.APPHdCAT �IPPH�MAH MOL 4NAV hROM ���
"#$%+,-./0123457��
"#$%+-./123457��
"#$%+-./123457��
"#$%+-./123457��
"#$%+-./123457��
"#$%+-./123457��
"#$%+-./123457��
 "#$%+-./1234578aaltRabvsZakhnlblwfrblwfxblws~c2sc�case�ccmp�ccmp�cjct�cjct�dnom�frac�half�half�half�half�haln�liga�lnum�locl�locllocl
locllocllocl locl&locl,locl2locl8locl>loclDnuktJnumrPonumVordn\pnumbpreshpresppstsxrkrf�rphf�rtlm�salt�sinf�smcp�ss03�ss04�ss06�ss07�subs�sups�tnum�vatu�zero�FHKLMO1?4��������$&AB9:;<78�' �.�/�	
0#!CEDE���352(+%:*8+6,4-"=>?)�PX`hpx���������������� (2:BLT\dlt|����������������$,4<DLT\dlt|����������������$,4<DLT\dlt|����������������$,4<DLT\dlt|����������������$,4<DLT\dlt|�< 0p��,J\n�����"&�� (,4Vrz�����@v#4(v)
)>)B)F)J*8+�,�,�,�/�/�/�4x4�4�4�8�<b?�B�E�H�L�PTP�P�R&RBU�WWbX�Y�ZZZ$Z�^�^�^�edh�ln�q�tLwy�|8
��� �v����H���������������@�������l�4���������4������������������������������8�@�H�P�X�`�v�������b�f�J�d�@�@�R�V������������L���������¤¾�����z�~ĦŤ�D�
���239=GHM]_efxz{���������239=GHz{���������
��*&(/)-06D>AB:kqmovpt�����y�*&(/)-06D>ABVQST:kqmovpt�����y�++''4477855;;<<EE??CC@@JJIILKKOONNZXRW\^^``aaccddgghhjssnnrrww||~~}}��������������������������������..11uu	����[
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�cQ	

�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�	

�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�����
�
�����
�
�
�
�
��������
���

%&'()*%&'()*-./01234-./01234DEFGHIJKTUVWXYTUVWXY^_`abcde_acenopqrstunopqrstu+,56LMZ[fgvw !"# !"#;<=>?@AB;<=>?@AB|}~����|}~����$98:7C+,568OPQRNSOPijkl\]hmijfg]zy{x�Z[vwy���
��
�
�
��bi,F� !"#$����������`$$'-035@BBGLVW"Z`$bb+ee,ss-��.��;��B��a��m��q��~�����������������������!�$%�(5�8B�VV�������������������������

�,,�aa�vv�������������AA�CG�IM�OT�Va�cd
fln���&��/��0��2��567mm8||9��:<66=DD>HH?��@$C==IggJijK��M��O�L�R[�_f�lx|����� ��!	�	�"	�	�#	�	�%dd&��'(P\-��:,y�,:HVdr�������������������
"(.4:@FNTZ`flrx~��������������������$*06<BHNTZ`flrx~��������������������� &		�		�	�����	��}��	��v��	��w��	�����		�����	
�����	�����	�����	
�����	��		n%�P[~ln%M	�P�[]	_	e		f	~lx		�	 V�QST�,,�FF
Z
X�R�YY
�U�W\�bb�ii���j�����������Rb�M
��
�L
��N
�
�
��
�
�D
�E
�F
�G
�H
�I
�J
�KTeSd`r]oagWiYk
�L
�MVhXjZl[m\n^p_qUf��������������������������������������������������y
"&./4FMNOPQRSTUXY�����������������	
"#&'67BHNUbem����������MOPQ\]^ghijkyz{����������������������������������<D�$NO�
,av�6DH�j�	�	�	�NO��

,,aavv��66DDHH��jj��	�	�	�	������		


 #$$%&'3.��
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�NO�
,av�6DH�j�	�	�	�.��
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�NO�
,av�6DH�j�	�	�	�^0:DNj|��������$6@JT�����������d�s�6������������e�t�7��!�:BJRZbjrz����������������
��
��

��
��
��
	��
��
��
��
��
��
��
��
����������������������������������
�
���:BJRZbjrz����������������
G��
F��
E��
D��
C��
A��
@��
?��
>��
=��
;��
:��
9��
8��
7��
6��
5��
4��
3��
1��
0��
/��
.��
-��
2�
<�
B�
,�:BJRZbjrz����������������
��
~��
}��
|��
{��
z��
y��
x��
w��
u��
t��
s��
r��
q��
o��
n��
m��
l��
k��
i��
h��
g��
f��
e��
j�
p�
v�
d�:BJRZbjrz����������������
c��
b��
a��
`��
_��
]��
\��
[��
Z��
Y��
X��
W��
V��
U��
S��
R��
Q��
P��
O��
M��
L��
K��
J��
I��
N�
T�
^�
H�:BJRZbjrz����������������
+��
*��
)��
(��
'��
%��
$��
#��
"��
!��
��
��
��
��
��
��
��
��
��
��
��
��
��
��
 �
&�
�
�,
�F
�Y
��
�&*.4:FJNTZ� �����%=P��n&0:DNX
����
����
����
����
����
����
����
����$.8BLV`jt~�
����
����
����
����
����
����
����
����
����
����
����
����$.8BLV`jt~�
����
����
����
����
����
����
����
����
����
����
����
����lt����������67����"#&'����"#&'���	
*>1Q_{1{Q
{_{Q{1c{_MLN�Nbm�MLN�Nbm�����2										
			
										 
"MPQRSUXY2										
			
										 
"MPQRSUXY$		��}vw������		
"S�������������������&F4Tn~n~&4FT
��.����������������������
.������������.����������������������
d/�
����%239=GHMP[]_eflxz{������������
��*&(/)-06D>ABVQST:kqmovpt�����y+',475;<E?CF@JIKONZXRYUW\^`bacdgihjsnrw|~}�������������������.1u��
�
�
�
�
�
�
�
�
�
�
�
�bcQ	

�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
������
%&'()*-./01234DEFGHIJKTUVWXY_acenopqrstu !"#;<=>?@AB|}~����edro+,568gikOPLMhjlijfg]mnpZ[vwyqf���/
$&'()*+,-./0123456789:;<=>?@B`bes�����������������������������������������������������������	 "$&(*,.02468:<=?A�����������������BCDEFGHIJKMNOPQRSTUVWXYZ[\]^_`abcdef��!#=���������������������������������������������� )*+,-./09:;<=>?@HIJKLMOPQWXYZ[\]^efghijktuvwxyz{�����������P�
������%239=GHMP[]_eflxz{������������*&(/)-06D>ABVQST:kqmovpt�����y�+',4785;<E?CF@JILKONZXRYW\^`bacdgihjsnrw|~}������������������.1u��[
�
�
�
�
�
�
�
�
�
�
�
�bcQ	

�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�����
%&'()*-./01234DEFGHIJKTUVWXY^_`abcdenopqrstu+,56LMZ[fgvw !"#;<=>?@AB|}~����$edro98:7CgikOPQRNShjlijkl\]hmmnpzy{x�qf���bi,F�P
$@BFGHIJKLMNOPQRSTUVWXYZ[\]^_`be�������������������������������������������������������������
!#%')+-/13579;>@B������������������BCELghijklmnopqrstuvwxyz{|}~����������� "$�����������������������������������������������������	

!"#$%&'(12345678ABCDEFGMOPQRSTUV\]^_`abcdijklmnopqrsyz{|}~������b.����������RTS`]aWYVXZ[\^_U��������������������	BB
MMOQ\^iky{����6"(�KQ�KN�Q�N�KKq	���V|;��

��	
����
��������
�
�
�
�
�
�
�
�
�
�� !"#$;./����������������AHUe����m|����gi��������ghd�PQRSTUVWXYZ[\V����������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOP
��c
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�������������������������������������-./0123456789:;<=>?@ABCDEFGHIJKLMNOP )09@LL[[��$8C'y�3��?��K!,W
38@HIJABCDEFG�HKL����?i�9x�������������",6@JT^hr|�������������&0:DNXblv�����wxyz{|}~��������567����8����9:������;���<���������4:A	�
%,.=>3OO5336887@@8"
�*�*����*
XO��������(4@LXdp|����������$0<HT`lx����������� ,8DP\ht�����������(4@L�*
�*
�*
�*
�*
�*
�*
�*
�*
�*
�*
�*
�*
�*
�*
�*
�*
�*
�*
*
'*
*
*
*
*
*
*
*
.*
*
	*
0*

*
*
*

*
*
*
*
*
*
 *
!*
)*
-*
*
*
*
*
*
*
*
*
*
*
*
"*
#*
$*
%*
&*
(*
**
+*
,*
/*
1*
2*
3*
4*
5*
*
*
5*
6*
*
2*
D*
E*
�5<%UW-��034I88K::L@AM�*
*:JXY[\*
6*
6*
6*
6�
*�M����������",6@JT^hr|�������������&0:DNXblv������������� *4>HR\fpz����*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*9*;*B*C*	�5<$VW,��.34G88I::J@AK~J�����������&0:DNXblv������������� *4>HR\fpz�������������$.8BLV`jt�*�*�*�*�*�*<*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*=*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*B*C*�5<$VW,��.44G@AH�?�������������$.8BLV`jt~������������
(2<FPZdnx�������������*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*9*;*����	58;<"VW$��&��'��+��.34;88=::>�<~������������
(2<FPZdnx�������������",6@JT^hr|��������6*7*8*9*<*=*>*?*@*I*J*K*M*N*O*P*Q*R*S*T*U*V*W*X*Y*Z*[*]*^*_*`*a*b*c*d*f*g*h*i*j*o*p*q*s*t*u*v*w*x*y*z*U*{*|*}*~**�*V*{*	������	�
#"$(&4+56:�9x�������������",6@JT^hr|�������������&0:DNXblv������*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*B*C*��������
58;< VW"��$��%��&��'��*@A7�8v������������� *4>HR\fpz�������������$.8BLV`jt~���6*7*8*9*<*>*@*I*J*K*M*N*O*P*Q*R*S*T*U*V*W*X*Y*Z*[*]*^*_*`*a*b*c*d*f*h*j*o*p*q*s*t*u*v*w*x*y*z*U*{*|*}*~**�*F*G*
�����������

!"#"$$&4'DE6�O����������&0:DNXblv������������� *4>HR\fpz�������������$.8BLV`jt~��������������������������������������������'��������.��	�0�
���
������ �!�)�-������������"�#�$�%�&�(�*�+�,�/�1�2�3�4�5���5�6��2�D�E��5<%UW-��034I88K::L@AM�M����������",6@JT^hr|�������������&0:DNXblv������������� *4>HR\fpz���6�7�8�9�:�<�=�>�?�@�A�C�E�G�I�J�K�L�M�N�O�P�Q�R�S�T�U�V�W�X�Y�Z�[�\�]�^�_�`�a�b�c�d�e�f�g�h�i�j�k�l�m�n�o�p�q�r�s�t�u�v�w�x�y�z�{�|�}�~������Y�~�>�?�F�G���99G;=HBCK&<s !**?@@�
t6n���Hh�*�*�*� (0�*��*��*��*�*��*�*�
$�*��*�*��*��*�*�&0:BJRZbjrz***�*�*****�*
�*	�*��*�Q*P*�O*U�*�����U�**28BLf������
6����0:\����������������������"(������������
�������������"*28>DJPV\b����
�	����$*06<�
�
�	�

��
 �"(.4:@%�"�%�$�#�&�"�!�
,+)'"(.421130/.-�$73 ������������������������E9J
 2<Vhr����(������������������"(.4�
�
�	�

��
,+)'
�������������X(2<F*������*�(������P������������()OPQR�w{������������������������()..OR��ww{{������������GGGGGG
$2GGGG�:@FLRX^djpv|���������������#���"�#�$�"�#�$�%$%�"���,��x#z��"�#�$y"y#y$y%x"���������()OPQR�w{��������

*8 �II!�JJ II!JJ�� 
 �=�!
!��&HZdnx:�7x
@w?�;�8�<�9�=�>�A�����xyz{|���&R\fpz������*T~���&Pz������
(2<FPZd������������������$����������$����������$����������$����������$����������$����������$����������$����������$����������$����������$����������$������������������I�$N�M�L�K�J���������������������N��M��L�&���������"#$%&'(),OPQR��w{���������N/V\'�K�����������556677889<UUVVWXYY[\����������������������&��!��%��#��%����	����$��
����������
������"������������%��������������&��!��%��#��%����	����$��
����������
����"�����������������������

!""#344558899<<AB#EH%II!JJKKLL$MM
NNOOQQRR%SSTTUUVV"XXYY%ZZ[\%^^``%ccddffkk#mn%oo!ppqqrr$ss
ttuuwwxx%yyzz{{"}}~~%��%������������������������ 	
 !#$&&))+,-./0168899::;;@ADEKKOQ%LV`lx����������� ,8DP\ht�����������ssPQRST	U
VWX
YZ[\]^_`abcdefghijk l!m"n#o$p%q&r 	K~������������		


557799::;;<<UUWX[\����������������������������������������������������������	

  !!##$$%%&&''(())**++,-../011223355����������������������  !!#$&&--..112688::@ADEKK&2>Jyz{|}~ 	�Kw������������������	
557799::;<UUWX[\������������������������������������������������������������������		

  !!##$$%%&&'*,,--..00113355OOuu����������������������!!#$&&..2688::KK&2>Jyz{|}~�Kf������������		
557799::;;<<UUWX[\������������������������������������������������

  !!##$$%%&&''(())**,-..113355^^��������������������!!#$&&..26KK$0<z{|}~�Kh������������		
557799::;;<<UUWX[\��������������������������������������������������

  !!##$$%%&&''(())**,-..113355TTzz��������������������!!#$&&..26KK$0<z{|}~nKb������������		
557799::;;<<UUWX[\����������������������������������������������

  !!##$$%%&&'())**,-..11335588cc������������������!!#$&&..26KK$0<z{|}~tKc������������	
557799::;<UUWX[\��������������������������������������������������

  !!##$$%%&&'*,,--..113355������������������!!#$&&..3346KK$0<z{|}~PK]������������	
557799::;<UUWX[\��������������������������������������������������

  !!##$$%%&&'*,,--..113355������������������!!#$&&..36KK$0<z{|}~hKa����������������	
557799::;<UUWX[\����������������������������������������������������

  !!##%%&&'*,,--..11335599dd������������������!!#$&&..36KK$0<z{|}~�Kh��������������������	


557799::;;<<UUWX[\����������������������������������������������������

  !!##%%&&'*,,--..113355����������������!!#$&&..33KK$0<z{|}~VK^����������������	
557799::;;<<UUWWXX[\��������������������������������������������������

  !!##%%&&'*,-..113355MMss����������������!!#$&&..KK$0<z{|}~NK]������������		
557799::;;<<UUWWXX[\����������������������������������������

  !!##%%&&''(())**,-..113355ZZ����������������!!#$&&..KK
".{|}~$KV����������		
557799::;;<<UUWX[\��������������������������������

  !!##%%''(())**,-..113355JJpp����������������!!#$&&..KK
".{|}~KU����������		
557799::;;<<UUWX[\��������������������������������

  !!##%%''(())**,-..113355NNtt����������������!!#$&&..KK
".{|}~KR����������		
557799::;;<<UUWX[\������������������������������������

  !!##%%'())**,-..113355����������������!!#$&&KK
".{|}~KS����������		
557799::;;<<UUWX[\������������������������������������

  !!##%%'())**,-..113355KKqq����������������!!#$&&KK
".{|}~$KV����������		
557799::;;<<UUWX[\������������������������������������

  !!##%%'())**,-..113355XX}}����������������!!#$&&33KK
".{|}~�KK����������	
557799::;<UUWX[\����������������������������������

  !!##%%'*--..113355<<ff����������������!!#$&&KK
".{|}~�KI����������	
557799::;<UUWX[\��������������������������������

  !!##%%'*--..113355UU����������������!!#$&&KK
".{|}~�KM������		
557799::;<UUWX[\����������������������������������

  !!##%%'*--..113355QQww����������������!!#$&&33KK
".{|}~�KK������������	
557799::;<UUWX[\������������������������������������

  !!##%%'*--..113355����������������!!#$&&KK
".{|}~�KH������������	
557799::;<UUWX[\��������������������������������

  !!##%%'*--..113355����������������99;;KK
".{|}~�K?������������	
557799::;;UUXX[\��������������������������������

  !!##%%'*..1155��������������KK
".{|}~RK3��������
5577::;;UUXX��������������������

!!##%%''))..1155SSyy����������KK
".{|}~>K0������	
55::;;UU����������������������

!!##%%''))..1155����������KK |}~�K%������
55::;;��������������������!!##%%))..����������KK |}~�K����
::��������������!!%%..����������KK |}~�K����
::��������������!!%%..����������KK |}~�K����
::����������!!%%..������������KK}~�K����
::����������!!%%..����������KK}~�K����
::��������������!!%%..IIoo����������KK}~�K!������
:;������������������!!%%..VV{{����������KK}~�K����
::��������������!!%%..ABkk����������KK}~�K��
������������%%..LLrr��������KK}~�K
����������..EHRRYY[\``mnxx~~��KK~JK��
����..KK~ &K�����	����������������	


5566	778899::;;<<UUVVWWXXYY[\����������������������������������������������	������������	������������������	



		  !!""##$$%%&&'*++,-../01122334455��������������������������	
	





  !!#$&&))+,--../0	112688::@ADEKKOOPPQQ	
 *4>HR\fptuvwxyz	{
}~KKKKKKKK	K
KK(�@KVG��	���..
5<UY[\��
��
�����������������������������589<<ABEOQVX\^^``cdffkkmuw{}��������������������������	
!#$&'))+899::;;@ADEKKLV��OQ.>N^��������	��
�*:JZjv�������������	��
���������	��
�f$*06<BHNTZ`K{L{M{N{O{P{Q{R{S{T{U{V{KVKVKV$KV�KV�KV{{{{{�����L� **//|��������
����
j���1XY[\������	 !0�������������
#&-./01256P& !!**//	34?@XY[\|�	��	��	��������		!00���������������

##&&-256PP���	�������"\rz� *34	���-2PP **34s������06<BHNTZbjrz����������{�{�{�{�{�{{�{�{�{�{�{�{{�{	{{!{${3{3{������	 !0�
#&56������ *34�.bhntz��������������������� (06<DLRX^djpv|���������������������������������������������������	�
������������������������������U*�.������	 !0�������������
#&-./01256P����J�������
5789:;<�����������������������"#$%&'()*+,-/123�!$4:@ADE2��������
5577889;<<?@����������������������"$%%&&''(())*-//13��!!$$44::@@AADDEE�����	����75789:;<V�������������������"#$%&'()*+,-/12354:E, !345577889:;<VV����������������������������������""#-//1122335544::EE�$�����������l�=����������������������
"(.4:@FLRX^djpv|�������������������������������	
������������	

358@D557<��	!""-%/51448669:::AA;EE<J$*06<�4�3�@�?�!� ��
��?@x&Lr����������4F
 ������
 ������&,2� ����� ����H 
� ���! (08@HPV\bhntz��{4�{3�{*�{ �{�{�4�3�*�@�?�!� ��������� 
� ���!"(.4�*�@�?�!� ��� ���� &,�4�3�*� ����
9:����{J�(������!?@�������!$�����������!!//?@|�������������������!!$$����������������������4��������������������������!?@�������������4 (.�������������!$B$.8;�B�D�F�H������
4.��������
��.
��.
�� Vrz�����3������������55::;;������������������������		!!%%))00���������������,,-.17@ADE������s$���|���������}���������~���������:BJ�0�������!**==?@���������
''�������������������������		
 ""%%''))+,�����s
*8������*
E�D�C�B���*4>HR\fpz���������e�k�l�m�n����*�*�*�*�*\*�*:�A�C�E�G������9:���5�����t7stu	

 !"#$%&'()*+34v5,-./0126G

$@D `d%��*��+��,��-��.��0��2��4	:	:5	A	A6
��DFLT&cyrl6dev2FdevaVgrekflatnv������������abvm&blwm.dist6kernHmarkPmkmkX	

'(*,Zbjt|���������������$,4<DLT\dlt|����������IRV���0�  �< �(V�����
X.�V���
2FZn���^����Pf,�����34�8w�7E2��������
�?.��� Q>�.���=n[�.���%UC�.�������.�����:.���=n[�.����&X.������.������.���b���.���b���.����M.������.���
=+o.���V�t�.�����/|}~������"�8������������8���/|}~����������������������������/|}~�������F�F�F�F�F�F�F�i�F�F�F/|}~������&��������������������������������� (8@w�7Esw�7EG):DL34��������34sL"�����������������������������������������=�����������������������=��wy��w�7AGG!lVv	 &,28>D
��
�
�V�
�
�
�
�	*-.1u}��	���"(.&"^vf�$*06<BHNT�n�n�n�n�n�n�n�n�n�n�nCL.wyx$�Vn�#n�$n�Vn4\~��wy��w�7AGG!wy��w�uu7AGGwy��w�7AGGs+++"*L�������������������BBbb�����		


 #$$%&'3
0B�V�)TZ`flrx~��������������������� &,28>DrB�B;��B|BmBy�p��B^B�tBxBT���Bm�z�sB8�+�|B�BdBbBh�h��B��|B�BrB�B|B�B��mBxB�CrB�Bt�)'()*+,-./0123juwz{|}�������������	�	�	�	�	�	�	�
p���$����v��i�*���/|}~������B��������!()**?@DDFF��������������		!00;;BBDDFFHH\\���������������������������

##&&-25566��������������������HH//|�����s .<JZjz<�:P���.������������������������$%()��������
��	��
����
����KVWb{{|~�
��	����
���������
��..����������������..����,>Rfx��������
&4BP^l!"	#
$%
& ��A��������������������� &,28>DJPV\bhntz����������������������sJ�"BJ1�{��s{J�s�{s�{���"
Z�����(��M:G�H�XJ{ JJ@	����A�������
5;U[���%)���������	!$,-.1237@ADE����������OP!**?@������25�������$*06<BHNTZ`flrx~����������������������V�V�V�V�V�V�V�V�V��V�V��V��V���V��V���V�/�/��/�/��/�/��/�/�/�/�/��/�/�/�/�V�V�V�V���V�/�/�/6.e��������� &,28>DJPV\bhntz����������������������
"(.4:@FLRX^djpv|���������������������$++�_�<\$<��
����vww
�




�,\�$,���



��>9����$4<��Bq7���!!22G����<\$<<e�������������
5;=DF���������������������	���������������������������	
!#$&,-./012��������/34|}~�����������NTZ`flrx~������������������
����s�x����;��������������'X����Xf|������6H���06hn�Ljp�������������������������������������������������8������������)��*+��3�������������������������������������������	������������8��������������������������������������������������	������������8�����������3��&�������������������������	��
����������������8��;����������������������������������������y��3��������3��������������������;��3�������������������	������������8����������3��������3��������������	��������������8����3�������3��$�������������������������	����������������8��;����������������������������������������q3�����������y������������8����3������������������������������������������������	;������3�������������	��������������3����
�������������	������8���������;����������������������	��������������������'������������������������������JQY�(*B$���$*06<BHNTZ`flrx~��������������������� &,28>DJPV\bhntz����������������������
"(.4:@FLRX^djpv|���������������������$*06<BHNTZ`flrx~��4�4�&�&��0�0��*���Y���P�Q��#��$�4�&�O�9�8�G�F�H�m�f�"��&��O�"�4��%��!�������o�%
lll	llllll��ll	l
l��������J�����,������ 
l��m
lp
l
lp
l
l
l
l
l
l
l
l
l
l
l
lll
llm��(��p
p��(	l
l	ll�&�
l
ll
"
l
l
l
l
ll	l
l��pl
l
l"
l
ll
l
ll
n
k
l
ll
l
l;ll
ll��p
l
l
l
l$Ml�����
 #%)  +##,&3-bg;jjAbbBjjCopDt�F��[��f��g	�	�h	�	�}
m
t�
�
�������
 #%)  +##,&&-bg.jj4lm5bb7jj8op9��;��<��>��?F &,28>DJPV\bhntz����������������������
"(.4:@FLRX^djpv|������������Y��������������8������H�������3�8����,���j�28>DJPV\bhntz����������������������
"(.4:@FLRX^djpv|���������������������$*06<BHNTZ`flrx~��������������������� &,28>DJPV\bhntz�����������:nMnMn~n�n�nsn�n�n"n"n�n1n'n{nnnsn�n1n{n~n�n�ninRnRnRn�n�n�n�n�n�n�n�n�n:nMnMn~n�n�n~n�n�n�n"n"n'nsn�n�n"n"n�n1n'n{nnsn�n�n"n"n�n1n'n{nninininin�n�n'n'n'n'n'n'n�n�n'n'n'n�n�n1n1n�n�n�n]n]nQn"n"n"n"n"n�n�n�n1n�n'n�n6n�n6n;nonpn�nnn�n�nnn�nn�n�n�n�n�nXnnnnn�n�n"n"n�n1nn�n�n�n"n"n�n1nn�n;nMn��������������59:;=>[�������������z|}~����������������	 !%)0����������������������������������������	
$&,-.1234567@ADE������������������2���"#$%.012���������������������������������JKLMN2���������$*06<BHNTZ`flrx~��������������������Ln�Ln�Vn�Vn�Ln�Vn�Vn�Vn�Vn�Vn�Vn�Ln�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Ln�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�Vn�VnLB�>p�� &,��|��s��� &,��|����F� &,��|����"� &,28>D���|��T���31��� &,28>D���|��T���11�z������4
=3F04f]jklmy`�{	A	A�	�	��
h
h�
m
v�
�
�����������$*06<BHNTZ`flrx~��������������������� &,28>DJPV\bhntz����������������������
"(.4:@FLRX^djpv|���������������������$*06<BHNTZ`flrx~��������������������� &,28>DJPV\bhntz����������������������		
				"	(	.	4	:	@	F	L	R	X	^	d	j	p	v	|	�	�	�	�	�	�	�	�������|����6���������������v��i��Y��������=�������������������������8�8����`�����������������H���������������������������j�d��3����j����$�8���,�8����,�����6�BHNTZ`flrx~��������������������� &,28>DJPV\bhntz����������������������
"(.4:@FLRX^djpv|���������������������$*06<BHNTZ`flrx~��������������������������������J�������516�������L��������b����?���\&H&��O
BB
�
B
BB������BB��t	B	B��������
��
�7FH|CC##��������������������
87�BI
F�
�
��
B���
�
B
B
B
B
BD
B!�
BB�B.��
B�

B
B
�
�
�p�����CCCDGCCBCGC�FCBBBCDG��CGGC��GGCCCGC��CCBC�F��

!"!"#$%%'3'034]a8hi=`a?cnAq�M��e��t��u	�	�v
m
t�
�
����

!"!"#$%%'3'044]a9hi>`a@ciBknIq�M��u��v	A	Aw	�	�x
h
h�
m
v�
�
��������������������� &,28>DJPV\bhntz����������������������
"(.4:@FLRX^djpv|���������������������$*06<BHNTZ`flrx~��������������������� &,28>DJPV\bhntz�������������������|����6���������������=���������������8����`��������������������������������j�d�����j����$�8���,��hrr|������������4b||���h�����h��||||||�����������������||d�����z�����������z������bbb|���������|��b||�|�|�||||||||||||���������������������������������rr������������������������������������h��@N@@@������jjjjjx���	�
��9��;��<��>�����&��(��*��8��:��<������!��#��������������/ZO(������/2�������������������������=��/<������1����$&��Bb������������������������������?��A��C��E��G��I��K��M��O��Q��S��U���������������%��&��'��(��)��*��+��,��-��.��/��0��1����������������������������������������������=�����o�����3��4��5��6��7��8��H��I��J��K��L��l��m��n��o��p��q��r��s��t��u��v��w��z�������������������������������������$������������$�����$������������/_��$/29��;��<��>�����&��(��*��8��:��<������!��#��������������/d9��;��<��>�����&��(��*��8��:��<������!��#��������������/n[P\P������$P�F/2.=2��������������������������������#��$��%��&��'��(��)��*��+��,��-��.��/��0��1���������������������#��$��%��&��'��(��)��*��+��,��-��.��/��0��1��
��� �������������%��&��'��(��)��*��+��,��-��.��/��0��1�������������������������������������������������������������������������������������������������������������
����������������%��&��'��(��)��*��+��,��-��.��/��0��1���
����������������#��$��%��&��'��(��)��*��+��,��-��.��/��0��1����
�����
���3��4��5��6��7��8��H��I��J��K��L��l��m��n��o��p��q��r��s��t��u��v��w��z��������
���[\[<\<[<\<���������������P3��4��5��6��7��8��H��I��J��K��L��[Z\Zl��m��n��o��p��q��r��s��t��u��v��w��z�����������������������������������������������
���������^��_��`��a��b��c��d��e��f��g��h��i��j��k��l��m�����������������	��
������
������������������:���������������������������������������������������
���
���
���������^��_��`��a��b��c��d��e��f��g��h��i��j��k��l��m�����������������	��
������
��������������������������������������������������������������������
&'()*+,01456789;<=>?@DH[\^`e�������������������������������������������&(*89:;<=?Ads����� !"#$?ACEGIKMOQSUWY[]_acekmoqsuwy{}�����������������^%&'()*+,-./23456789:;<G_`blmnopqrstuvxyz�����������������������
�
�
�
�
�
�^_`abcdefghijklm���	

l&RP_,p^��������(������������������������������������������������������(����������������������������������������������������������������������������(������������������������������������������(���������������������������������������������������������������������������������������������������2���������������������������������������������������������2�����������222��������������������
����
�������������������
2((������������������������������������������������������<F��F��<F<������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������`(��������������������������������������������������������������������������������������������������������������������������������F�������������������������������������������������������������������������������������������������������������������������(����<(������(F��������������������������������������������������������~��������������������������~��������������������������������������������(���������(���������������(��������������������������(�����������������������������������������������������������������������������������������������������������$##=<=&&((-))
**00F11*44
55Z66
995::;<'==F>>???FFGGJJKKQMMRSTUWW:YY1[\]]I^^ooNM������-����
��
��
������Z����������������������������������-��-��-��-��
��T��
����������������������������F��I��*��**T**






:::&&5''1((5))1**5++1,,..0022446688'99::;;<<==????AA?dd)ee$ss(tt"����������
����5��1BBCCSDDFFII@JJMMNNSOOoPPQQRRUTT@VV[WWZZ[[@]]Y^^U__m``aa@ccnffgghhii	kkllmmlnnPooppqq_rr	ssavvgwwxxPyy`zz{{f||~~dc������j��������������[����,��+��6��,����!��7��4��+������4������\��6��+��!��������,��,����E�� �������������� ������������%��%������R %R		

;W%67H7HVV4  !!!"";##!$$;%&''(())**++,,;--6778899W::%;;\<<==+>> ??G@@OCC>DD.EE4GG>HH.IIJJKKLLMMNNOOPPQQGRR VVWW6YY+ZZ [[X\\J]]X^^J__>``.aabbccddii]jjkk]llnnoorrssvvwwzz{{}}7~~E7��E������������������4������������������!����!����!����+�� ��G��O��>��.����.��A��3��A��3������A��3��A��3��3������������'  !!'""##'$$??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffkk
llmm
nnoo
ppqq
rrss
ttuu
vvww
xxyy)zz${{)||$}})~~$)��$��)��$������(��"��(��"��(��"��(��"��(��"��������������������������	��������	
 !(	18AGHLRV	WXlopqrstwxxY|���<��#��=��#��=��N��M^^
��Q%/38&9<]^L_`DaaCbbDcdClvzz��9��9����0��/��8��B��B��B
�
�
�
�
�
�
�
�
�
�k
�
�h
�
�
�
�^
�
�

�
�
�
�

�
�2
�
�K
�
�b
�
�
�
�i
�
�e
$T[
\]2^m����
�����
2)77=.9.&&((,,4466992::;<#>>??;BB=FFGGHJKKLL-MMPQRSTTUUVVWWXX,YY+ZZ[^__5bb=ooDC����P��������������������������������������������������������������������������-����-����-����-��������

,##,&&2''+((2))+**2+++,,--..//001122334455667788#99::;;<<==;>>5??;@@5AA;BB5ddeesstt������P��������,��2��+BBDDII<JJLL
MMPPRRHTT<WW[[<^^H__[``aa<bb]cc\ffgghhjj
kk	llmm nnEooppqqQssStt
uu vvXww xxEyyRzz{{W|| }~U��	����Z��	����
��	����	������%����$��%��1��3��$����"��$������J��1����&��%��"��!����������'����������������*��������/��������'������::	
*

803"&  !!N""8##N$$8%%&&''(())**++,,8--..88990:::<<>>??0BBCCDDEE"FF'HHJJKK0LL:MM%NNPPRRTTUUVVWWXXYYJZZ[[I\\?]]I^^?__``aa%bbcc&dd/ee&ff/hhiiOjjFkkOllFnnooqqrr$ssuuwwxx&yy/{{}}3~~!3��!��3��!����K��!��K��!������"��'������������������"��'��1��*��1��*��1��*��&��/������0����������M����M����L��@��L��@��$����������%������$����������#  !!#""###$$??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVXXZZ\\^^``bbddffkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~������������������������������������������������������
����	����	


	 18HL_d
lo	pq rs	tw|���9��7��.��7��.��.��D��C__aa,��>#$A%/01G2238
9GHL
MO[\B]klw
xyzz
{~���6��6����)��(��4��>
�
�
�
�

�
�	
�
�
�
�
�
�
�
�
�
�
�
�T
�
�
�
�Y
�
�V$T[^m�����������-8�&&(*01	469?FGJKMMRUWWYY[^ oo$%��&��2��3��8��?��F��J��M��R��S��]��^��_��`��c��m��n��o��p��q��stwx

y

z{���&,�..�00�22�44�66�8=�??�AA�de�st����������BD�FF�IJ�LR�TT�VW�Z[�]a�cc�ft�v|�~�����������������������������������������������������������
�	
$%-&7@6CE@GRCVWOYdQil]noarscvwez{g}�i��m��n��v������������������������$�?f�k���������������#��)(=18cALkRXw_d~lx�|��������������^^����%/�3<�]d�lv�zz����������������������
�
��
�
��
�
�
�
�'
�
�+
�
�,
�
�-
�
�.
�
�/
�
�46:$;TmT��n��r��s����<��	YJ�J�J�J�J�J�J�J�J�KKKKKKK$K*K0K6K<KBKHKNKTKZK`KfKlKrKxK~K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�LLLLLL L&L,L2L8L>LDLJLPLVL\LbLhLnLtLzL�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�MM
MMMM"M(M.M4M:M@MFMLMRMXM^MdMjMpMvM|M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�NNNNNNN$N*N0N6N<NBNHNNNTNZN`NfNlNrNxN~N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�OOOOOO O&O,O2O8O>ODOJOPOVO\ObOhOnOtOzO�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�PP
PPPP"P(P.P4P:P@PFPLPRPXP^PdPjPpPvP|P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�QQQQQQQ$Q*Q0Q6Q<QBQHQNQTQZQ`QfQlQrQxQ~Q�Q�Q�Q�Q�Q�Q�Q�Q�Q�Q�Q�Q�Q�Q�Q�Q�Q�Q�Q�Q�RRRRRR R&R,R2R8R>RDRJRPRVR\RbRhRnRtRzR�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�SS
SSSS"S(S.S4S:S@SFSLSRSXS^SdSjSpSvS|S�S�S�S�S�S�S�S�S�S�S�S�S�S�S�S�S�S�S�S�S�TTTTTTT$T*T0T6T<TBTHTNTTTZT`TfTlTrTxT~T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�UUUUUU U&U,U2U8U>UDUJUPUVU\UbUhUnUtUzU�U�U�U�U�U�U�U�U�U�U�U�U�U�U�U�U�U�U�U�U�U�VV
VVVV"V(V.V4V:V@VFVLVRVXV^VdVjVpVvV|V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�WWWWWWW$W*W0W6W<WBWHWNWTWZW`WfWlWrWxW~W�W�W�W�W�W�W�W�W�W�W�W�W�W�W�W�W�W�W�W�W�XXXXXX X&X,X2X8X>XDXJXPXVX\XbXhXnXtXzX�X�X�X�X�X�X�X�X�X�X�X�X�X�X�X�X�X�X�X�X�X�YY
YYYY"Y(Y.Y4Y:Y@YFYLYRYXY^YdYjYpYvY|Y�Y�Y�Y�Y�Y�Y�Y�Y�Y�Y�Y�Y�Y�Y�Y�Y�Y�Y�Y�Y�ZZZZZZZ$Z*Z0Z6Z<ZBZHZNZTZZZ`ZfZlZrZxZ~Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�[[[[[[ [&[,[2[8[>[D[J[P[V[\[b[h[n[t[z[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�\\
\\\\"\(\.\4\:\@\F\L\R\X\^\d\j\p\v\|\�\�\�\�\�\�\�\�\�\�\�\�\�\�\�\�\�\�\�\�\�]]]]]]]$]*]0]6]<]B]H]N]T]Z]`]f]l]r]x]~]�]�]�]�]�]�]�]�]�]�]�]�]�]�]�]�]�]�]�]�]�^^^^^^ ^&^,^2^8^>^D^J^P^V^\^b^h^n^t^z^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�__
____"_(_._4_:_@_F_L_R_X_^_d_j_p_v_|_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�```````$`*`0`6`<`B`H`N`T`Z```f`l`r`x`~`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�aaaaaa a&a,a2a8a>aDaJaPaVa\abahanataza�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�bb
bbbb"b(b.b4b:b@bFbLbRbXb^bdbjbpbvb|b�b�b�b�b�b�b�b�b�b�b�b�b�b�b�b�b�b�b�b�b�ccccccc$c*c0c6c<cBcHcNcTcZc`cfclcrcxc~c�c�c�c�c�c�c�c�c�c�c�c�c�c�c�c�c�c�c�c�c�dddddd d&d,d2d8d>dDdJdPdVd\dbdhdndtdzd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�ee
eeee"e(e.e4e:e@eFeLeReXe^edejepeve|e�e�e�e�e�e�e�e�e�e�e�e�e�e�e�e�e�e�e�e�e�fffffff$f*f0f6f<fBfHfNfTfZf`ffflfrfxf~f�f�f�f�f�f�f�f�f�f�f�f�f�f�f�f�f�f�f�f�f�gggggg g&g,g2g8g>gDgJgPgVg\gbghgngtgzg�g�g�g�g�g�g�g�g�g�g�g�g�g�g�g�g�g�g�g�g�g�hh
hhhh"h(h.h4h:h@hFhLhRhXh^hdhjhphvh|h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�iiiiiii$i*i0i6i<iBiHiNiTiZi`ifilirixi~i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�jjjjjj j&j,j2j8j>jDjJjPjVj\jbjhjnjtjzj�j�j�j�j�j�j�j�j�j�j�j�j�j�j�j�j�j�j�j�j�j�kk
kkkk"k(k.k4k:k@kFkLkRkXk^kdkjkpkvk|k�k�k�k�k�k�k�k�k�k�k�k�k�k�k�k�k�k�k�k�k�lllllll$l*l0l6l<lBlHlNlTlZl`lflllrlxl~l�l�l�l�l�l�l�l�l�l�l�l�l�l�l�l�l�l�l�l�l�mmmmmm m&m,m2m8m>mDmJmPmVm\mbmhmnmtmzm�m�m�m�m�m�m�m�m�m�m�m�m�m�m�m�m�m�m�m�m�m�nn
nnnn"n(n.n4n:n@nFnLnRnXn^ndnjnpnvn|n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�ooooooo$o*o0o6o<oBoHoNoToZo`ofoloroxo~o�o�o�o�o�o�o�o�o�o�o�o�o�o�o�o�o�o�o�o�o�pppppp p&p,p2p8p>pDpJpPpVp\pbphpnptpzp�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�qq
qqqq"q(q.q4q:q@qFqLqRqXq^qdqjqpqvq|q�q�q�q�q�q�q�q�q�q�q�q�q�q�q�q�q�q�q�q�q�rrrrrrr$r*r0r6r<rBrHrNrTrZr`rfrlrrrxr~r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�ssssss s&s,s2s8s>sDsJsPsVs\sbshsnstszs�s�s�s�s�s�s�s�s�s�s�s�s�s�s�s�s�s�s�s�s�s�tt
tttt"t(t.t4t:t@tFtLtRtXt^tdtjtptvt|t�t�t�t�t�t�t�t�t�t�t�t�t�t�t�t�t�t�t�t�t�uuuuuuu$u*u0u6u<uBuHuNuTuZu`ufuluruxu~u�u�u�u�u�u�u�u�u�u�u�u�u�u�u�u�u�u�u�u�u�vvvvvv v&v,v2v8v>vDvJvPvVv\vbvhvnvtvzv�v�v�v�v�v�v�v�v�v�v�v�v�v�v�v�v�v�v�v�v�v�ww
wwww"w(w.w4w:w@wFwLwRwXw^wdwjwpwvw|w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�xxxxxxx$x*x0x6x<xBxHxNxTxZx`xfxlxrxxx~x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�yyyyyy y&y,y2y8y>yDyJyPyVy\ybyhynytyzy�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�zz
zzzz"z(z.z4z:z@zFzLzRzXz^zdzjzpzvz|z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�{{{{{{{${*{0{6{<{B{H{N{T{Z{`{f{l{r{x{~{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�|||||| |&|,|2|8|>|D|J|P|V|\|b|h|n|t|z|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�}}
}}}}"}(}.}4}:}@}F}L}R}X}^}d}j}p}v}|}�}�}�}�}�}�}�}�}�}�}�}�}�}�}�}�}�}�}�}�}�~~~~~~~$~*~0~6~<~B~H~N~T~Z~`~f~l~r~x~~~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~� &,28>DJPV\bhntz������������������������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�����������������������Āʀ��ր܀�������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�������������������������́��؁�������������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�������������������������Ȃ��Ԃ�������������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�����������������������ă��Ѓ��܃�������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�����������������������Ƅ̄҄��ބ����������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�����������������������…��΅ԅ�����������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�����������������������ĆʆІֆ����������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�����������������������Ƈ̇��؇އ������������ �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�����������������������ˆȈΈ��ڈ���������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�������������������������ʉ��։����������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�������������������������̊��؊��������������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�������������������������ȋ΋��ڋ��������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�����������������������ČʌЌ֌܌������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�����������������������ƍ̍��؍ލ���������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�����������������������ŽȎΎ��ڎ���������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�����������������������ďʏЏ֏܏����������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�����������������������Ɛ̐��ؐސ������������ �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�����������������������‘ȑΑԑڑ�������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�������������������������ʒВ��ܒ������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�����������������������Ɠ̓ғؓޓ���������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�����������������������”��ΔԔ����������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�������������������������ʕЕ��ܕ������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�����������������������Ɩ̖Җؖޖ���������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�����������������������—ȗ��ԗڗ�����������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�����������������������Ę��И֘�������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�������������������������̙ҙ��ޙ����������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�����������������������šȚΚԚښ�������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�����������������������ěʛ��֛����������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�����������������������Ɯ��Ҝ��ޜ�������������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�������������������������Ν��ڝ����������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�������������������������ʞ��֞������������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�����������������������Ɵ̟��؟ޟ������������ �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�������������������������������ڠ�������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�������������������������ʡС֡����������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�����������������������Ƣ��Ң��ޢ�������������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�����������������������£��Σ��ڣ����������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�������������������������ʤ��֤����������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�����������������������ƥ��ҥ��ޥ�������������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�����������������������¦�������������������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�����������������������ħʧ��֧ܧ����������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�������������������������̨����ި����������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�������������������������ȩΩԩک��������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�������������������������ʪ��֪�������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�����������������������ƫ��ҫ��ޫ������������ �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�������������������������Ȭ��Ԭ�������������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�����������������������ĭ��Э��ܭ�������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�����������������������Ʈ��Ү��ޮ����������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�������������������������ȯίԯگ�������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�����������������������İ��а��ܰ������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�����������������������Ʊ��ұ��ޱ����������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�������������������������Ȳβ��ڲ���������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�����������������������ijʳ��ֳܳ������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�������������������������̴��ش��������������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�����������������������µ��εԵ����������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�������������������������ʶ��ֶܶ����������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�����������������������Ʒ��ҷط��������������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�����������������������¸��θԸ����������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�����������������������Ĺʹ��ֹܹ��������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�����������������������ƺ��Һغ��������������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�����������������������»ȻλԻڻ�����������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�����������������������ļ��мּ�������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~�������������������������̽ҽ��޽����������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z�����������������������¾��ξԾ����������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|�����������������������Ŀʿпֿܿ����������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~����������������������������������������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z����������������������������������������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|‚ˆŽ”𠦬²¸¾��������������������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~ÄÊÐÖÜâèîôú������������������������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�zĀĆČĒĘĞĤĪİĶļ����������������������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|łňŎŔŚŠŦŬŲŸž��������������������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~ƄƊƐƖƜƢƨƮƴƺ������������������������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�zǀdžnjǒǘǞǤǪǰǶǼ����������������������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|ȂȈȎȔȚȠȦȬȲȸȾ��������������������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~ɄɊɐɖɜɢɨɮɴɺ������������������������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�zʀʆʌʒʘʞʤʪʰʶʼ����������������������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|˂ˈˎ˔˚ˠ˦ˬ˲˸˾��������������������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~̴̢̨̖̜̮̺̄̊̐������������������������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z̀͆͌͒ͤͪ͘͞ͰͶͼ����������������������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|΂ΈΎΔΚΠΦάβθξ��������������������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~τϊϐϖϜϢϨϮϴϺ������������������������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�zЀІЌВИОФЪажм����������������������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|тшюєњѠѦѬѲѸѾ��������������������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~҄ҊҐҖҜҢҨҮҴҺ������������������������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�zӀӆӌӒӘӞӤӪӰӶӼ����������������������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|ԂԈԎԔԚԠԦԬԲԸԾ��������������������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~ՄՊՐՖ՜բըծմպ������������������������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�zրֆ֌ְֶּ֤֪֒֘֞����������������������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|ׂ׈׎הךנצ׬ײ׸׾��������������������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~؄؊ؐؖ؜آبخشغ������������������������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�zـنٌْ٘ٞ٤٪ٰٶټ����������������������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|ڂڈڎڔښڠڦڬڲڸھ��������������������������$�*�0�6�<�B�H�N�T�Z�`�f�l�r�x�~ۄۊېۖۜۢۨۮ۴ۺ������������������������� �&�,�2�8�>�D�J�P�V�\�b�h�n�t�z܀܆܌ܒܘܞܤܪܼܰܶ����������������������
����"�(�.�4�:�@�F�L�R�X�^�d�j�p�v�|݂݈ݎݔݚݠݦݬݲݸݾ��������������������������$�*D>��;B�v�t|�d�Vi���me,1��*��������ps���se���?����V����JT�W�,��l�e���w�||���������e/=�I���V����H7�Z�����eln���+/�D������%$�6��"�)"�(��BR���$�)�4- ���|�*�)+6���5������������qH��������u552-/?/��LI�4+~���������H�&52������	�^�����������|��D>��D>��D>��D>��D>��D>n����t�|�d�,1��,1��,1��,1�����?����?����?����?�mm�||���������e������e������e������e������e���ln���ln���ln���ln����"�//�<<�����������1�����-� -� -� -� ������������//�55�2-/�?/-/�?/-/�?/-/�?/-/�?///&5�2&5�2&5�2&5�2^����4�4�^����D>W���D>����D�$>���$�t|�d���t|�d���t|�d���t|�d���Vi���me$�)�4mm�55�,1W�-� ,1��-� ,1��-� ,�$1��-�$ ,1��-� �����*�)�+�����*�)�+�����*�)�+��#����*�)�+ps���se6���5ss�5�����?������W?�������?������$��?���$�������?���2�B2�������V�������J�#T�W��#��qH,��l�e������,�#��l�e��#�����,��l�e������,��l�e������,�����||���55�2|�#|���5�#52||���55�2{{x|�B|�5�52��W���e-/�?/������e-/�?/������e-/�?/�����H7�Z�~���H�#7�Z�~�#��H7�Z�~������������������������������e����H���e����H������H�ln���&5�2lnW��&5�2ln���&5�2ln���&512ln���&5�2l�$n���&�$52����������"�^�����"�)"�(�����)"�(�����)"�(��������44�mm�44�44�>>�22����t|L�mm����44�44�.� .���rr�&&��{�M�xB���������������66�������|�|�5�F������-/����WW�4�4�7��7�������������  ������rn�%5���hh��������$$�$$��������$$������&�&���pp����������me���meYR�4�B��e"���e�����B���y�����D>�������?����������e-/�?/ln���&5�2ln���&5D2ln��&5g2ln#��&5q2ln��&5g2D>��D�D>��E���W������4�4�����*�)�+JT�W���qH��$�����e-�$/?/��$�W���e-�$/�?/$$�����������me��meYR�4�����*�)�+���K�K�||���55�2@@�����������//�D>����D>����,1��-� ,1��-� ���?�������?����������e-/�?/������e-/�?/H7�Z�~���H7�Z�~���ln���&5�2ln���&5�2�#���#���#��e�#���H�����S�ps���se6���5s�s������PP�**�)�:"�(��:�D>����,�1��-� ������e-/D?/������e-/D?/������e-/�?/������e-/E?/W"�^�������uu����������D>��t|�d��0��,��l�e��e���������EE�ln���00�,1��-�0� ��B����������4�4H7�Z�~���"�^�����""444444���

4�4�)�44������,,����4�4�*�)+�����5� 5555�5�5��������������������I�I����R����u5�525�52<<B//����k�k����H�����������������������������������"Y"����O�&52//33����������������������������������������e  ,,�??����� ���4�4���������������������E��������6�?����nn����''�:�::�:�U�\�������T���R�a�a��a�a���a��a��a�a=��a?aR�R<���aTT���T���aa��aKa�������BJ��������V�����L����u�eb���k��e��������D�;B�v�,�)"�(�p��se������e�?�JT�W����w�||�������e/I���e"�%$�6�ff����?��"�##����##����-/?/&�&������-/?/�������������������//�4�4�t|�d�&�&���t|�d����,1��,1��ss�1�BB������?����?����B����������ss�55����88�n�Dn�D>��44�;B�v�1�Z�DZ�,1�����&�������5P�bb����w�ps���se������enn�/=�I�t|�d���e8F����%$�6�s�Ds�]R��		�ZZ����AA�=���@@��,,�  ��#�F#- wu��BJBG�	!!uu??-/?/88��LI���^���k�k�	�8�F83+����\\��))����-� -� 5�5��������������������������55�		�BB�^����9�G9�����RR�>>����		VV�II���mm�@@rr�&�*&U��>�����}�}����//>8�>>��b�b�$�$/��������B�B������D��J�GJ�33�))�33�4�4

]���		���F�F���D����G�&�$&���$�O�DO��F55�		55���[[�88z�Dz�?�G?rr�??��������AAt�$|�d��$��D��G��"��������<�D<��F��D��j�Gj`�D`�7�F7]]�//]]�6���5����D���G���?����ww�\�\��h�Dh�&�G&n�n�7�7z�Dz�K�GK]�D]�3�F3�D��z�Gz���?�D>����D>���������,1��-� r\�rr�����ww�&&����$$������WBB����BB�������e-/�?/���//��//�==���88W^����88�^����88�^����]]�33�	�D	��G�������	�:	��:�<�:<��:%%�		44�$�)�4�����������=�D=�
�G
����������||�AAff�HH''��d�:d�%�:%������������������V�����4+��������55�		�������"�"����u�Du�8�G8m�Dm�A�GA�n�4n�9�9��D��A�FA]�@]�*�F*h�@h�,�F,#�#��z|�����=L�>��,,�cc��  ****������7��u���ll55==//4��(//;;//��=
===
����**55>���5��5�J���dd��������������Q����������������������\����D�������������nn���Y�Y���������������''�A����������������������|���������\��������//�P���fLa��gOg��gg���O����g�����gba��g��g��g���giaZ�Za����00g?a���gma��gva����g���e������g|avv��v���ama�;�Ju,00a)a��a=a��e�������a������g���bT��TZ�Z�����������m������=����������)?P'��'�5524��40��a������LI//BR��$�)�4���|�*�)+�:��qH�}���LI44��g��g+a��g�����gpp���T�Ta�a���gia���aZa��TT���qqahhahhaT�T�T�T�T�T���a0�0g?a0�0a���gma���gma��axa��g�������gT�T�v�v���ama��a��a��g��aJa��aa���a���a���a���D��>�����;B�v�BR��;�PB�v�B�PR��;�mB�v�B�lR��t�|�d����Vi���me$�)�4V�Pi���me$�P�)�4V�mi���me$�m�)�4V�i���me$��)�4V�8i���me$�8�)�4,1��-� ,1��-� ,�81��-�8 ,�C1��-�G ,�1��-�� *������|���W��*�)�+ps���se6���5p�Ps���se6�P���5ps���se6���5p�s���se6����5p�Gs���se6�G���5��H��?���H������?���gJT�W���qHJ�PT�W��P��qHJ�mT�W��e��qH,�P��l�e��P�����,�P�Wl�e��P�����,�s��l�e��p�����,�8��l�e��<��������w����u���w����u��P��w��P�u||���55�2|�P|���5�P52|�e|���5�a52|�8|���5�852��#���e-/q?/�����e-/R?/������e-/�?/������e-/�?//=�I���L�I/=�I���L�IH7�Z�~���H�P7�Z�~�P��H�P7WZ�~�P���H�g7�Z�~�o���������P���P�����������R��P���P�����e��Y�H��P��e�P���H��q��e�m���H��8��e�3���H�o�Qn���4�Q52ln���&5�2l�8n���&�552ln#��&5q2ln��&5R2,,�D�����,�P,�D���P���������������������������������������P������P��%$�6�	��%$�6�	���"�^����)"�(�����)�P"�(��P��)"�(����6���5��R�H���1�^��1������������cc�..�D�P>���P�D>��5�D>��,�D>��,�D>�g�D>�s�D�P>���P��D>��L�D>��L�D>�n�D>�q�D�P>���P��,�P1��-�P ,1��-5 ,1��-� ,1��-, ,1��-, ,1�-g ,1�-s ,�P1��-�P� ���?���5��P��?���P������P�����e-�P/?/������e-/5?/������e-/,?/������e-/,?/�����e-/g?/�����e-/s?/��P�����e-�P/�?/���44����44����445���44���P��4�P4l�Pn���&�P52ln���&552���QQ����QQ����QQ5���QQ���P��Q�PQ�"�^�����P�"�^����"�^��5��"�^��������oo�((�..��################{>��H�>�>�*��*��q4�r5��������q��q�q]�q]�����������������g�	eq�e�*��e�*��e���e���e�]��e�^�e����������������T��^����������J��K��-/?/-/?/-/?/-/?/-/?/-/?/�]��e�g��e� ��e� ��e���e���e����������������������������������������������������####��������-/?/-/?/����################{>��H�>�>�*��*��q4�r5�����������������g�	eq�e�*��e�*��e���e���e�]��e�^�e����������������������������������������##�##�##########D>��D>W��`��L�D�����������������(��+eu�ep��se�����������������?���W?�v�b����&�&&�&"�"�������������������
e�k��e������ff�UT�����ama�����L�����b�����v��A�����K��������Uh\h�A���Th��T��Th�hTA2��7�?�����m�T���|����������d+��vA��u55������&&�=��g��V�H7�Z�+/�D�ff�������JT�W�D>n���������h4h4�A�>����e�����e���)*)>�����//�7�7��0���0���H�z�Dz�6�F���5J�DT�W��F��qH�D��F������@��@��@�������������������kk''���//���TZ�Z���y�1�"����(��65����������r�Dr�@�F@Z�DZ�#�F#bb�!!���w�uu������e���Z�DZ�#�F#����;�(;��(������a��a5�4��e��W�u�e��)������"�����JT�W���qHJT�W���qHJT�W���qH,��l�e������������e<>N>������e/=�I���LI�����&4�@���V�����4+��V�����4+��+/�D����4�4�4�4�$�*!���f$�)�4��������u552-,����e��������||���552t|�d�'*��6���5��������|�,,*�)+JT�W���qH||���552~����������A��e&�=�u==g=<66�
��"�e���ln���&52������U]�D���H�m��3��[ht|�d���)"�(�Vi���me$�)�4�����

������������33a������//������*�44���<��|������������������"��"//��,~,���+�+��$�$�������VY+�����������{{���g88/"4��4"Y"222������a (������)��i�Bi�|�B|�cc�:���l�e��|���D>��,1����$��?�ln��������������������������������������������������P���������������������Y����$������$�����������H������������e�������?�52�$�-�$ &�$52vv<�<v��<vy��<vy�<vx��<vx��<v@�<vw��<vv<�<vz��<��<O<��O<
<�<�<�<"�<��<�<��<�$<�<U�<��<�<^h<^^<�<58<�<58�<58"�<5�8<�<58"�<58��<##<2<###<##"2<###<��<�<���<���<��"�<��"�<����<���<���<����<��$�<�<��<�<GA<<<GA<<GA"<<G�#AC<<GA�<<,,<C<,,,<,,"C<,��<<��<��<��"<���<��<��<�b<���<��$�<<��<v�bv<�<v�bv"�<
<�<
�#<�<�v<�<��v�<��v<�<��#v<�<��v<�<���<pp<�<88<[<88[<88"[<8�#8<[<8�b8<88[<<<<d<<<<d<<<<d<<<<"d<<<<�d<<<<d<<<<"d<<<<�d<<<>=<<<<d<<vv<��<�<��<<�x<<d<��<�<���<��"�<��#�<�<��<�<���<��"�<��<�<��"�<�#�<�<,,<��<�<���<��"�<���<�<��#�<�<�*+<@<**@<**@<**"@<**�@<**@<**"@<**�@<*�$*<@<**U@<**@<��<�<��<�<���<��"�<����<���<��<�<��<�<���<��"�<����<���<��<�<���<��"�<���<2v�v�*������������������������������������]]���r�����n�)����Ab**)�7)��������$������Ta��V��T���:�UTa�a�Ta��H���P���UTa�a{�@���T���D�{>��H�>�>�*��*��q4�r5�p��seg�	eq�e�*��e�*��e���e���e�]��e�^�eff�����������������������������%q�/{��4��4�� �� �g�h�G��3�################�������������������������������
<�<<�<��<�<��<�<,,<C<,��<<
<�<pp<�<88<[<<<<d<<��<�<��<�<���<�<��<�<AA<��<<���<���<��<�<����<����<<<<d<<AA<
<�<��<�<,,<C<,
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<��<�<��<�<��<�<��<�<��<�<��<�<��<�<��<�<,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,��<<��<<��<<��<<��<<��<<��<<��<<��<<��<<��<<��<<��<<���<���<���<<<<d<<<<<d<<<<<d<<<<<d<<<<<d<<<<<d<<<<<d<<<<<d<<��<�<��<�<��<�<��<�<��<�<��<�<��<�<��<�<��<�<��<�<��<�<��<�<��<�<��<�<��<�<����<����<����<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<,,,,,,,,,,,,�<�<�<�<�<�<�<�<�<�<�<�<��<<���<��<<��<�<����<��<�<<<<d<<AA<
<�<��<�<,,<C<,
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
��<��<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<
<�<��<�<��<�<��<�<��<�<��<�<��<�<��<�<��<�<,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,��<<��<<��<<��<<��<<��<<��<<��<<��<<��<<��<<���<���<��<<��<<��<<<<<d<<<<<d<<<<<d<<<<<d<<<<<d<<<<<d<<<<<d<<<<<d<<��<�<��<�<��<�<��<�<��<�<��<�<��<�<��<�<��<�<��<�<��<�<��<�<��<�<����<����<��<�<��<�<��<�<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<,,,,,,,,,,,,�<�<�<�<�<�<�<�<�<�<�<�<�&?F_nn4~~5��6��M�|l��-��.��/:;4=?6AA9DD:FN;QVDXYJ[[L]]M_`NbbPdlQppZrr[tu\zz^||_��`��a��g��j�&r).�7��nv���������	
%((00;_�L?R[�_h�lx|���				 	&	&'	,	,(	E	E)	I	K*	a	a-	e	e.	h	i/	k	m1	t	t4	{	|5	�	�7	�	�;	�	�<
3
3[
=
>\
@
@^
B
B_
D
F`
N
Nc
P
Pd
Y
ae
c
cn
y
zo
�
�q
�
�r
�
�s
�
�t
�
�u
�
�v
�
�x
�
�z
�
�}
�
�~
�
�
�
��
�
��
�
��
�
��
�
��
�
��
�
���
�����  �)/�22�66�:>�@D�HJ�OX�[j��������������������������������������� ����
�
��
�
��
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
 �,�,�9P	A
�
B3K04k]jplm~`��	A	A�	�	��
h
h�
m
v�
�
�������� &,28>DJPV\bhntz����������������������
"(.4:@FLRX^djpv|���������������������$*06<BHNTZ`flrx~��������������������� &,28>DJPV\bhntz����������������������
"(.4:@FLRX^djpv|���������������������							$	*	0	6	<	B	H	N	T	Z	`	f	l	r	x	~	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�������|����6���������������v��i��Y����&"^����=�������������������������8�8����`�����������������H���������������������������j�d��3����j����$�8���,�8����,����դ'�'6�'Afonts/notosans/NotoSans-Regular.woff000064400001037034151215013460013575 0ustar00wOFF>	$(FFTM>��5�GDEFGP
�gQa�GPOS���(��lh�TGSUBK`Mu��*�[XOS/2�``b�cmap!�hNOgaspGHglyfQ ��t��:�headl56%�T�hhea�!$��hmtxH�IH>hrloca$-
IL,rB\maxp� uname�[		���post�ZG�`����prep$h��x�c`d```b<�/�66���+7���=uv3(�w�2���@.ur@�x�c`d``�w���[����-\�"�@(���x�c`d`
bda�`�d`c�#Q��XK�X^2B���@ _)GOOG�
��-��C��� -x��	�Uŕ�O�}M7����,�6[�7�M
���4  �*�5FQǠ��a"j5�(��[4.QGLb25˨�(�ˈT� n�w~��zݯ�63���}�;�֭[U��Sg���g�|��&��\*���u7�H��2)��K�^˻2��b��w�<�Kw$e�y�ɧ�?8�}@+0���V��t�k0�����29�/�WI�_"��� ��R��_��a
e��*Z�ڄ��z:e]e ��7e��-���~��|)�I77N�蘡�v�t\�
����H*�;�y$C�lif�'S�e����]WFwK��ӷ֯�z�V�m��n�4��d�����o!�Z���tw� E�q��}�=�s���j�%7D#��[ �.Ʃ�{+��r����r0ha�r㹆�o�ה�n����U:E���_���z��&��A&��GV��r��aTe�	�2��1N�{=����Š�@1����>7���
ճ��L�,L�J�{��lʷ[�{���������ʟA�AU�텢��/Pa�
��x߹^��~m
��d��@+�I�=��2GLOu�����2Ky��:2�J���6�/T���l�|
�a�
ٍގ��R��:-�h��:7�H��6o����m?��w�s��7=�{�ԍ�y��C�l_H;'�4��d�E"㨧�h2�'c_���Y�7O�����m&�Ù;w�[�d�锖�n���_�����)<k�;ߒ!��\O�����`�›>6��Ə�����j���t��������9V:�!�3��[?-s��P���'0�)r��R�y�P:�zC���MGJ*S
������1�<L�~�j|̚ojot��6��}����ͅ�3ǜ~/���nH|����u��i'{������>�Hϻ��q:s�V��ݾ5[��#��a3j�yUt���0��Ȯv<6�=λ�8����$_龗�&z�:/��Lۮ�蘎G}�΃gŻG�W��o򬊺��Oۓ8��t޻�:��~-2�4��C}K�lQ��@������_f�-�:�V��{����oSMf���w2͍�.��q�����Z�S��o�,I|2����J)�m��J�ڜ#�/�����>�!�����f{�@��}:�.�
��jU?�>�+�A[��������c��_��߁Mh�	qCx'z����ʣ���<�oh��syw������:��&^�-W��o8��Xrᝓi�4VZ�{���*y� �N
Z�&n5~����Aa��{b��
y�g�5��4:��)���b��p/;������k�l�l�يf5~l�(v[��n�*&L��6��ֆ�=4�i@k�!�-�S"�1�V�SA?���M�r��`x\!��k�I?��pK�������pc~&'�x�I�׳�6���$p�Ɛ�wlsG�?�c��7A���>��+~���<>�?6�{1xt��'���Tp'}����5��p�K�,��#�<�^�J�^\�)�V�~|����%~9�]�o�{
�{.�a���R)wKw�;����q��y�MR�g��Cm�lB�W�
�9�/c��W2�A��o͏Ʃ�w�s�
���lg��i���o���Oa7�y�?S�B�[e������h6��$��x�9�q��)g0�?c'�g�c�L�e؝J|�k���N�9u�4�k=��ry~vR�Ŀ?�v͖1�C�Rw��&6�w�'����V���L��{.��3���˜;1v��͑���7����m��9�iK�
���O�w�����q���|�{��Cܧ��x���0�ݟ�~����t��c��#�a�W�<���3Z#.��P�d��?�8�M��X|wU�;�G�&ڋf�*��ֵ���>8G�m���\(_ی�$�3�O2%Մأ׏J����}��nm~|��~����---���=5�G�7A/
9͙�#,/u���s�i�S��[ �K�Wq��D�����h����5����o�7g9��&���k>���cYȏЩ�F)�Z��Oxv�4�~�wm��}[��;����K��u�r?�l"eqj�/��s���dX�h�j0ϯ�yt�
9���eR�>�*���lj�=���/�Hep��
<ho�:�|Z m�y�ʷ�u�.Jt��p�}�Uƃ����i�29�q�׸�/�=b��UF����ao���d1�B
=�)FF�i����)�4�:��Mr��r���=P�s�U�W�~��\O`\���q��1���:���6d��iO�v:'�<F�@k�J�%��i�ZC�1hӺTu��'��h#�R}�9cz�����
~����|y���Iy�LJ�ӝ�����o
���a�\�ڹ���D/���y������U��ļ�u����^�I��$��2�A�= ����
��l���J�>��ώ_͹P��fn?�}�θ�O�COoO��$�ހ(�vn3�|@lUB�F|��к��D�I<3�=����lO��:�u񞚣2��gv�'���U�G��<�	E7'�w�/z�5�֑P<61?�x��,���{���1_W}x�P�t���|����7]Y�uro�\Ꝙ���L����/6�~�}˨Z�R�D�.�_a���p1���p�tc����#�0Y�)7�A�7�mL�J������1��.
��ـW7���`��q=0ģJO��P��~��>�}Y���}~���d�k�$3�q��oZ��x��$V�g�S�x�����]��'��I�zmx;j�����"=�2驱�?���E�����t�>ɉ�?�O<s��^���7Ç�?y<��:�3Cf�.�O2��&ZB��IiEN?��8��<������D��A��0{��5���׊v5���䝓�6 ���iޫ}�KN��֓��a,��r�}9�*��cw�M����	��_h�=.륭�<~�<l��D��Σ��+�����KG`'��i��ӰM+��Ʋ�r��0��"W.��L��s-�|�����<����+���������i��ʍ����'b�v�5�[H���z����V��NI�v��>�`9����x+y�V�ֻ[���!��-�7��N���ǣ/�S���H��W͡�k��gK3b�!am��f=}������!W����g'k����+C,��u��&��ᡌ�b~��pi%�H������d0|ȕw��6�5��!ȧ�_�$�6^^b|_x�>�������R~�[F�� �WF1�e6�*C�\F��-�y����<��F����/Ucu�c�pzȕVhδ<�f�� �Q�C>�
��M���]��0F}~Q(�58-�awd�h7�|9��՛���0>�k␫B\�Mw_[�;��5�\��˩��N��AXL��v@�r�&]��:��P���ZnE��z�&���q����'��'������w6��z�����k~��)M뮽��K�M�\���Z�����qo��j_�r��%4�ָ�u|��b�ӂ_����l��@��??����������Þ�����@'�C�=��<�)��w��O���[��ƶg��o����<�~�K�2��_P�Yɏ�Xp?x�|v����{/R�g%�5�`B�}9]��O�����ٶ�|$�*���߃?�]��p�6��ݐ�`��Ԡ��	l
f/��x�	/��A�WA�Ѡ:`S�T0���k���77�u����v��r������Ez�u�=�v��V� ��M֕3Ɯw��7��:�a-Q�-,ט:�Wo[������4�X�C����
��S+��Fg�C��4Y_�:&k�^uR�5��q�˟������Aj]��‘7F��i��Dȯ��t�G�E��$���^v.�H;�PLŴa F�ĭ��k����}	���hPb����-���LEO��el��Ύ�U_�����W׀q�n��
�|D|~��v����x��������Jwtd��F�OS�=���+�S����4I�6�b|w�{�F��G?J�l=#�Ho�K�v�H.�=����sdpt}�ʠh��[�E�Ĩ�q&�b���ɷec�_�7/��n����~>:4��b>�5��\�ΆL#f
���4�����H�Ɂ��9��+��-��\��k�����ƻ2����oj�P��'�H��o�y^ig+ʌ��@�h�]2���s�ã���>{s����w�<��'6�z�o���[m�Jch�N:���O�0�
fn�����>:��Q�}�N�N������e��Z�)��;#�;OJ�i�;��n��gs�Q��5�\̷��T�Y�������Q���r+Ѵ?�ؠP��\�N'�i��im1���#���7������JQ4�1�J��2l�;�U�H'�N�['�b�5�#�D�k(��/9�خum��2��Рv�
�ry�60K:�Y��A9ѯ��k���%�=&�S��gQ?�������ri]�(�z<t.�u$�sܗ��r�TNY�t��}��Zt��d��Ӥ��I�^/1�.�����1�xS�]um�jh_ӓ$���R��'�Zr�1d	��I������w�FN�JR�$�[x��=)�Љ[�^�����'��'��"#�iȇ{{+C��������{^V_�?�&�=��<�Vga�\p!��08e�\�* ��(��f��I���r
��A�i��Ow~*waӚ�y��>��9��rx{?�)m�^�u����f)�a̗A�)��ަ����U��w�0�'�Z���®�{�7:X�]�5����B�9ܕS�U��{�L��s����7T��� 9�T�5ӽ'p��7D��uWB;�l�Ko�G����0�1�N��p����(�	��M`���T+���sUQ��<Y������{-/��'�����CK� Z!
�&l��(�FrS:�o����ߟ'�s��v�{�3�Խh�z�~T�W^��w�p	�7���W�#�<p��o���ޖ^�k�[���'����x���خwk'��Gf;�����}4���(�9�>4b��Je�Q����~�v�R�}2�+�q�^�����a"�]��š��2Ơ�W��(
~�^]����|�٦b��dlb�^�HK�u:t�p��N)N1s��JRWB�΀�!%3_^]h�׽J;�rJ�7�]'H�����zAk=���`���W
N��6��x�3�:ɉfH�h�4�ٟ�g�[g����}OC��Տ�/h�Ǵ�G�]����d�-�ϑ<h��@|V��|���5v���oē����w�St0r�2��:��g��)~�!>xu?�y��Og��f����{�ReM�3m����P�;�D�*T6��+�;:J{�(��ؚ����	���77�?u�{� ������yG�s_�_��_ڂ�bp�DnU\ͼ����q��0_M�-�a?��ܡ�x���8�<x�%ɗ1�_����.��C�E���=��ԡ���伕�Gֽ��UW9[��T�oj���޳}��QW���y
�5"]H'͈+'�w'�����'�E��.9�
�OtS��5�X�ڋCl�ZaO>�a�-���~
l��9Tc��� �������]�<�\��̎a�T%�S�[�l[)ߣe�m=�V�u3�����	�ʝ��[cjlgp/����3�ѳr��>|P[�M�e�5�G�׏h�q����!-ig
H��0��e�E�?:���7���.����AA|���_��,�cفN<�Ϳ�-���0%��Đ*����Ͳ3Yz����������9	�R�սj��?��o�s.��z@FU}ޞ�Ya�i��
�[��̥�$`���5|�:�sں�����*(��6�1�A�"h��<�&��P�k��į���"Et�T�n�5��6/u�+9_0]F�'�k�%�!�GB�Gv<���5t�;��<���x���h�\��[��l�)P���ͺUs�S�O���a峰�Pי�����ڒ���]�M�?����7<^�/j�����/>�m����{��u�b�z�w�v�2��@�2z��\�e�ᶊsa�fc��˄�v������<)
e ^���I�3�;K'0��A��AG���L��k����/��Ç�'�%N�O;�ߔᴡ礟$ꅭ�>2�OĞ%�[���~֓��h��;�9�˜�e��,�A�;�yy�WrSW����X������	����4m@#�VAy'h7��8\w��Z�+m��鹥��΁��s�I�mBm3���nm�v;�1t(�h��W��_W��tM���o�B�8:�q(-
�CF�]3�)��sc
(O��5msxh;M����?:��C��C��!�S3ތ�}�=��+{�8�$�	�=Տ�s�(y�\ae�5L��`�z:������۹���?'F�k5�������@�OC�)��۳������%�\�Sm��k�4��N[�z������x�g�R��O��~v�����j;�^D���!�87�{��<���}�	�yE�q�g�9�����
�ʷ�Y�_��&#�a��ï���!�	�I�F�?j�կ��=��3�}��ퟘ�}��v���Y�~j���F�'��+2d�ck��:��|�.�� ���n���Z~@��ؗON��z}��d�wB�g�����q��q޾t�Y?�c�g�3�|���1&�
��&��O��w�OݫI��z$�u����l�.���ַw��r��A�6������:���?�/8WZSO��>W�}�����C�ΏޕuVtUX;��/��W�J<-�(����~u�q+�h��N�Z�����,=��#+�'A��u�7���	���m���ߍ�r��/�З�{�wVs��5���i/g}��䙞u���oq=g}�x�7��S��_Ǫ�^������v�{����r�R+�:���<��$c�OzL�q�춀�f������/$�\�T�N��z~<�u��{g�:�q�mL-��- ��wԾ��=���Y��s� GQ{F<9'�F�F�kk;'�5�x3�HΏWoO`�ȋ3Γ�1+E�}Sak�;���3����ޟw"�Z���e��bKS�����d�h�юDR���'H�M�|�v�kt�\"t z%���w�o=�z''�9��Q߯�7�C�����
ף��<�Q\��3R�n�[�D��1�!�	�*Hi^���LUP�sb"�U�?Zo�o����	c�7��D��jyM�2�F�wK�g�>S�-R��'��}w;�1L�����`�AT�<�g]
�2��o���tu���Y(	�WH�W#�]�3a��L=��� �}<w�Z=(@����ϑQ^������A^=�C	u�5�'�9��씯�O���7�*ջ2���ؓ��ںZ���7�Ugؼt_��v�?�W��
�n�\�vȷ��ST&��1�mw��G��d��� �-q3����=���Nl�]f��@�w5#���2�nR	z�9�4�G�$�j;�R����0ݟ����S��g�|��#���1.��Ԩ��7g��c\�_�����>��f���U=�g�~�@�3���6��O3[���z=���j�ЖJ�؜x�œYL�W��}�w�QKg��/,�Vk�}ߵd��X��6�nhDD�Q��efPq�E����Dk���ޘh�T-A�ze|𭏞�{O��;9���p��#\G�����J��@��Uk̟�T3��2��!��Ԩ�t�KW��ZFJ�*���r��-����!o�
���G�Z)�R+�ʷʬ����茘�1��nvM���+��ہ^�8��š�Zj�km��m��I�-��
3M��̓f�������[�ݸkd+i�r�;r�\+����]Y)�˗�<k��cy5���I��|���/	�{��P�&[��Z�M���оa����v�}�.��|\��*��)�*Tj��S�j�ڥv�j��Q[���2U�JW����֩�j�j����^i?��rX�#O�'ϓ�Y�雜�� ��w"*"Jß�=v�X�������}s`�[��7�هJ}NF��_Cј&4�͉�-i�GD�V���H��hbhC[�ўt���BWb�#�>�����AO��^|Ao�З~��:� 3��c8#�(F3���c<��$&3��Lc:3��,f�%s��D��K2�:lf�؋���G?���c��8�i�p���"���5�R�u`��Bq��{9S�O�V��I��?��i?�f��n��_)���|�w����6��*��B��s�p��D�8$�(�>񫣏�����?��bV��'.��l6��,�����}c7�)��F���#�(0���(2
��?p<�����xڥ�gt�e%��-(vT��ޫ MTTTP�@�0`�ETT�"��t�R��J'!	)�'Ԁtl�����~̚��Ǭ�uV����g�}�r�����%��Hq%B�� �O�G� �M4�G��;�~�hAQO�)A��,��� ����%��=>���/�gUOT���ށb[�WC�p���Q�������B<�x> �9���� xH�z
��y������>�z?��ð�?;������ϡ&ǜ �IoN�r�}��Hb<Jã�E/�1=��XF�7r��-'�L�y�AC���%���{�SA���ó|��q����ɯo��&((� �
�ޅ`µ�p�s���"<)"�(>Ei,ʋ��3�bz���J�-�DKAK	�%p/����+�KIK�Q��%{:K�R�'�`��Q
F)�`��Q
F)�J�)�����jJ�)�ޗ�̝�x�5𲸗5���P�r���ܝ���_��P9Z��<_ʛO�����<�+�>�W�_^Ex�U�WѾV4��׃��*�S��̫�J0+����J0+ìl��+
>V�ce��S��*tW�����
��*�Ui�JoU|��S
�j�Tç>��{³'<{³'��'�_u���W��Uw^��Uǯ:~�'��_
�j�W���>5�ϓ�<��I^>��'y��ښ�j��鬦��v���i�jzj�_K�Zz�ҳ���ԡ�V[^��xP��:�Թ�L�:z�1�:��s#�ڙ�v����˻���˻����)gO��ԝ�x?�w=����zv��]�g��٫z���ۧ�$O3���»����i��	¬���Ӽ|�����/�Q��������:��>����s������>
ph@OZ�cC�hȟ�~�y���/��/���`�Fz4��e�_�����د�*�^��Xrc^4��	�&��������=����SS���f�o��nox�.o�9���x���S�=l���z5���\�󪹹6�)�O�|��S����3�c���+/n�Z��B�v�--̫%�Z�ߊWo������5�־�����
m��h��;Y�q~����8�g�q���'?N~[ym嵕�V^[ym嵕��v��ç.��.^�(�x}�i��=^�x{o��<��M�ٶ�>��i{;��lڛY{^�����jo���=-h�`o;�������`��`:��ǎf��t�q'~tƧ3�.8vq��.޽.���̺���n��~w���з�=p�{���sO���S����9}`~�!����|{y���`�#�~,�c=>�'�	�y��{�~���ԗ�}�L?�������@��?�����<��Oy:P��zn��?� s$�g_�9��x
�k�!��s(�f1��_��%�a4
��0����t
��+Ͽ��+�F�a#匴#Վ��_��7�Q�����ݣpm�F�5F�;3��c�;��އq�8�qvs<.�=O�x='��	�f�~���t~�׉���D�&�v���O��;��8�B�T3�Ɵi�L����N��tg3虡�:gš�n��ߛ��{�6��Y����,3�E�,�0�,g�6�l�f�e�g��̡g�9���y����9���\Z��1�\���q�ܹ|�k?��0��/~����?��A�y�i�ݞs��q�o���.,�}��`-�|!��<X��Z�|���[H�B�X��">/�y�^��ZD�"~-�9����>��|�M�!~^��,�k1]��{����Z̯���[,�Gy?��#�?�G��؟%vt	�K�~��,1�%�,�g	�K�/U��\�Ұ�ƥ�/�u)�e0��\�v��eΖٹe<X��evf����Ӱ��-��ry���r3Z.o/Vข�+䮰C+�f��vl%��f���vv%�V�j�ٯ��2�U|X��*|V�
�O��I�����՞��g��kpY�Z�~-�����Z���\g?�y��<֛�z^�W��G�qX/o^���]�w�l�m��MxlR����H"���'�/	�$z��M��I�%�J���|3^��l�����6�~3����7��d��p��'�C2]ɸ'{���J1��J1�<RpH��bƩz��H�-U}*�Ry�jF���.ջ��-�m�w���j���a������վl�������,���w�}�I�N�4ם|م�.w��
7�ݴ�B�/8�m��챳{��U��>���ܧf��������w��W>ip�������:��A|�>��!}�v������MG�q�Q�|�Q:�ڃc����c��8�>&'��t3H��n�f�n��zf���,�3hΰ?���븾ǽ'�<�oN��_'��I��I\O�;�S4�vvZ��x���4���<�3j�8?c_���~eڥL3�4�L=2q;��Y�g�v����8�����~�a����i8�����/:�Ȼ�t\4���w�G�h�ģK�_r~�{qI�%��p��w�ޗ}�"�
���j�W�]��\���f��p���5�^3���
�o�3��`�N��j����
�O���/|������Λ�v�o���˿��WͿ�ހ��7���v�&�����nBA� �B�lb~�DE��)N�hA�Tȍ&���ݝU7�P��B�=��3R�G�н��'����8���zz���)V�Q_���}�C݄����l���0��Ĥ �#�P�C^��b���ӳ��r��	둪�G��G�yT�Gqy4%=�Px���\�J�͏��P8y�ϋ^:�N�P�����'��A�qg��{|i��,?����R@m<�X���Կ�0�� ��+���Q(A�(��¼,�0
�UX�½��tƷ0�E�+Bc��[��"�)�k}��ST���U[��bfR��b�V\m��e������gI��:	�J��J�\��28��Q�粸��]�~��r���Y��
�*��@w�WгNͨ�]�d��̶2͕}�,���*0��\�L�­ʿ���F[5?��	��驎�;{�:�5�I��s�j��	��}�-��� Tg�PW�Y]���W�8�5Ϻ8>��/�a=�����6�]�ڑ�8ח�zN�sr��y�k���������z���ųA�%5/�QQA��<z�W��9���W�k�	-M����6�KM�;k�5�Ə�pvo
���^W�צ<i
���f�s
5�-hn�k3����w�
�߄�����Û�ބÃzc`�׆bp��'1f�c�96W�gg-ͤ%�-崄�
�Vv�-���m=[��Z�p��9�1�6����F}z���6r����5N�8���m�G;��/�ػt��o<����qs�����ޑr�C��ѻ�����ggs��H���zu1�.�w�C��򠫹tկ��j�]�u���t�s���Fkw����n�#C�q�AC�졮�����=�{��S��������C=zٯ^p?��1�ۛO���ͷ޸����>��g}�����n�3�~��?N��.��?����>0�O�S���gv�33���<��7����8n���j��;��}��j�9�!xQ?�|��7ϡ�6�P�_z�%�/a�o�]��0:��>�p��W8|ef_���^|%gF���t��l$�_��k��1�op��Q<m���{>F��j��x��q|s���>��s<��aNP��@�}k���>�7�O��$}&�;�\';���d=��w�}��)8M�s����O�|�����o=3����o���0��0g�9�9f7G�\s�k��G�<�1����pػ��_��/��B	�XL�b�?�Yb�K�/�w)��M�e�.7/���
�\��pV��~Z�=Xſ���'�?��3M?������Y
�wh���V�ƌ�а�k�q�	��k^��X��8l��n�c��h6z_7���M|I�Q"?a'�I�?I��J(ɹ�J�]%��̧����w�P2}�&�}�BC�ީ�S�n�e�=p�m�|+���o�g�~����vܷ�/����wпC��w��oh��]rv��}"��>�K�~�>큷��^�G��u/N�`���>z������U���O�it��Sw�P�4޻c��`�_��; ��; � ��7B����F��8l�i>�O����:b����#|<��yG��wT�QyG�(�Gyu��G�=�:��Q�w�c��㐮_��J��;v:�t�����e�ː�!/C^��y�2p�!��8��8�q8��q��p��N�x�,N�:coΘ�{}��طL���<�'�f�i��"S^��Ly�(�����sW	�3�s��_�:��y>��Ͻ$t��]��~��y���.�|�G��E�.�|�>\��2ݗ�L�e���^�{��W�^�{��W�^�{��W�^�{�N\�W�󪝸jWq�j'�ڇ���*߯��߯�pM�k���p�	�ׄ�kB�5����w��p������_�������u�:���7���-��-:o�|�Ƿ��� �r��b�8�CqA8�Yx|�4�E�p���'j��"%���U������;g�&&�{�=���s� |�>�
��1��g����q%?�U�j,�E�S6�ن��b��+.���xg�(��~v���g��~�s�ɡ&gT���I	�{�E��G���b���Qu����)�
��1���D��\ps�&ݹ`䂑F.���KNn9���
#7�ܼ�-'�����'�>y`䁑�<��O���F^ya䅑�L�ꓗ޼�䕓ON>9���'��|���'�>�_��y����<�������q�<.'����䇑F~3�/'����Ч�>`�Q����?�(��B���� =�pႸ�IAo�B|+�k!z
�(��B�2���S��p
�UX^a�
�*�Oa�
�WD�"��W�"��8w����>E�)��(-E�(���btñ���O1g��fqu��eq�U�O�y��0��,��8�PW��%�.�$̒0K�,�kI�J�\��R|+�c)K�X
^)x����VWfi<K;/
�4��rʨ/�?�(CO�e�z�_Y�xY�e��5����,���b��WN^9�O9�C9�A9��y�٧r��������%E=�=.�M�,�<��0�ì��
0+x�+x�+x�+x�+��R��V���5\���W�[Es�ȃ���h'*�*�}�h���t��+�S��|��_��pe�+�ie�Lk���w�U�b�U�~�JOU�J�{t����V3�j8V���[�̞��e��k�Q�����M
�a�5��p���=���\���k���e�k���m-3���}��ֆ]ۜj�W���fX�:���w>֡���©K�;{�)�R���h�g���ܧ��3���gp}γ�~V�g�<��x��c}�<ǃ�|~���y����=x����������l�j��j�iȏ�z4��!�
͡!����ν�_���h�/���p^��%u/���mijF���;���W�x���W�U5�ͥ1]M�h�y����k4����~6�Ӕ�f�5�����|�����
�}o+V^,m-̺��jZ��
n+[�-���m3}�Go�{�O��{m�cn����>��k��<�ǿ=�����YG�;zg;������w7u���>=�a�z��C��̥����'z��������Ϗ���f�1-��do���>fч�>f�F_����O}8���3@��3�����O��>���>�T7H��}������{1�yCy5��/�×<��v�K^
S7��`��m����F؃����ڜ��{�y��h�}��h^��y�����#g���2���ٻqp��6�_���������|�s"�'Ÿ��d��d���4����ά܅�Sx�>��|
�S��T��1��S��i�O�l��ip���tz�;���x�7�g��Ls�����Yt�R?K�Y��e��h���l�g�8��s��\=��=�<�<���l��y��}>�h[���[D�"��$�!�7	�/��b���b{��7��{���G~4�q��%j�಄�K�]�R����2�-��]<�L�r���Z�\N�
}V��B�
�+�2Cw��O<��7?��n�	ϟ�̷���y�Z��yؽ<��5�����k���wm�Y��z�����m�+�܈�F�����y��D�M�CI|K�y�ϛ���[��d�)8�x�›T��~'l�/[�ق�V��Uϭ|ݦ�6��6}������o��>�e'��4���_������z����}��>3ߏ�~>엿�Y�iޣ4gi�.
�|<`���tRH���0m��aw��Q>u~��cv���ԧ㖮w��3ˀ��q���=��	3;��v�$������];E��j���<��i=O��i�O�zڳ3����}q�
gҖɿL�3帳��zO�ڃ�t��Ggឥ���s�3�s��_���W�~��W����<���]�s�x_�\Tw��Kx\��]恻j��4�n����f�����`��w���y��'�?�W��_����_������u��7=����c��[�؟�ɿ|�����&�����zw�HPQ�+�H���/v����A$#���,5İ rW6�Hȿ�z�;^��Z_�	"��/<sόܛO����������@�-�<�󃓂��e��C�H6��z��A��@4���� �]~���찲{����+����sz�S�GZ�A�Qx���NJ��A$�zw�H�� �[��^$
y�p����E��
"���7U�r���*��Ok~}�\�z��>)�PY��B4�u!��gE`���~E�
}��W��⧂H	�%x\���_J^)?K;/]O�	|K����2t��[V�;E�!R����s^��r���_��8D*�[An�+�"�+�Y���Z9#�Tѯ��Wš*]��V�G5XO��	���Sݳ�zT�K�yU��'�[M��m����Z��o�H������ݪ˧�pJ}=��4�1�g�V�g����>���yN��M#
�4�Dv
"/��}~����K��d��6��e9/��2�^��+�x՞�ʋW�z��p�����4��5��&�5|_��u\��ij�Mi��7�
���훾ǘy�=i��� Kk�g�|�m-`�Šů�ږ��7�hi�-�����{Պ�V���V�[�{+�Z��Խ��۞�ַ5/[��;�{Ն�6���M���ٽ���S#��Nj8����3V�~q�G[��m�ikg��l�G[;�V�v8��E;�j�g;�o��v�߅�.�w�k�z���G��z�;��sƳ���=��l�g{�a{���ݞ���`>̷�Yw0�r:��`W:��Q���t��ь;��)��y'���{҉ם�G'uֳ3
�i�LCg{��v�S����wg����E^>v���]��JSWz���*��n4t����n|�Ʒnzv�_�~�w7������λ��k\{x?z���{փ������`��'�=��IcO�x�,�7���{����x�����p��p��}�����ү�`d��"�]�ٛ��l�?v���������Op���Op���O�.��Ho8�������V�^���_���'}q��Ǿ|�k7��՗����^�K_?9���'���~���k�;gp��M{џO���W�_w�H��_�����c����o�~p�T�Oy�)����|��@���s�?�7H�At����s��4
�c��{"C�»!r���|��b�}�v(.C�?T��0���P���P�P���{S�K��/��0u������c�������]_��+��c����7���z$F�:���f9R�Hܾ�c_���ޱ�=����#�8�a�o�.v�|c���(��䏒?�ߣ叆?��Ѹ��|4�18���z��:�wc��X�6�\ƚ�X�X��k,
�`��5N�qz��{��y8�Ύ�u���i��&x>��	�O�{������o��[��]��g�O�y"��O�?�$�O�|�&��$���O�3����'˟l7&��m��m��m�y>��)�N�3E��S�L�|���j�S�O5s���4{=��x1����4ϧ˟.��e�=��t{1�w3��3��}22����?Ӿ�4���3�w3y7�w3��{�~���qrό̂9�,�f�5[���f����>�\��y.�s�3W߹vx��s�y.�~�s?��A�����w�̓;�?�𜇧;id>��q�o.���|���Yk��/��Y�^@�B�[H�B<�u������"�/��H�"��Ip��g���	z&�@W��,���YLÏ~��F�е�R|�y����]F�2���L�r\V�_��J�+�u�����U|\E�*�V��	����j|V�p5����Z��w����i�ڵp�z��Zyk�^k���Y��u8������pZG�:�^gG��[��z��ӽ�.�w��7�� �hؠ�z7ҽQύ�6�ۨn���m�o�9l��F���jm�x���M�m27���&�l��&=6�ݤ�&u�hJT�?Q~"�D���$�]�(7Q�D}�'ꓤO��$}��IR��O�>Ij��I2�$�I��'�O��f���٬�>�Y�f>n���W��n�}�>�r��I�'Y~�>�$�I�'Y�du�$듬6Ym�����BW
�R�J�-��R�K�/�)z��
?RԦ�“T���Sէ�OU��>U}��T}Sզ�J[*oR�݂�����-8o�y�[pޢ�|��E����٪�V�[��*w�[�ت�V=���6���ކ�6����Ƈm�l�6:�᲍��xl�;�q߮�v���]��o���;�ߡ��w�C������;�ߡ�N�w�S�������;�ߩ�N�w�S�]����]�v��.9��ݭ�n}w�[�n}w��n�v��/����q�>��߃�g{p�C��{��Q���=r��W��r���+g���r���K�>8��쓳O�>9��쓳�������~Z�Ӱ���w��K�oQ��4�>�љFg��4<��H���z����r@��8 �����sP�A9a�� .y{�����~���s�!8��=$�݇a��0����:,�0^�q?,�NG��8B�XG��sD�9G����uvT��t���1����/��<Fs���ӝ��3�t:��P��[��p3�f8;΃��}��Ύ�=��8�N�=��pO8;��	����I������I��O�=|���v;�o����<�~���٧�SjN�9���S�f9��7N�w�S�N�;���~ϟVsڿ�������8���������)N��紞g��{��3j��wF�3���sƿg�8�G&^�8e�Ʉ�	7�L<2�=���Y9g���8��w�z��uVϳz������O��w�9��`��W�ù`.xv��/¿(�Y\�{�l.��e�W��W�]�s������kfz�>\�7����ov�w3�ݎ�����a���O���_<����zݬ���o������w��7|���&�7齉�Mu7��I�-zo�{��[�ނs��[xޢ��[����m���6oü
�6��0oü
� �?��'��FA4��A4�8�Fr�xq%�F��^bd͢&�ڻ|�����@�[��3�hֲ³{�߳2���^��U�A�b��D��@}�D��Ay5��l��!���ps���,Gk��sv���#�����G��G�>�M�
��F����uD��}�(*j������Fny<��Y�aB�<��� �W�|-ũ ��T���z��/���)���
�/x=�£PIQO���\H}!��A�ނ�Ex]��">�_�y1��Q����S�����[R}I�J��J�P�g-'�Y�YYgeͨ�圗ǣ<�a�ק������+ï̇�tT�_���P��鮢OZ�؟*��W��UxX��U̡*_����yP��5pzR��f^�\j˭����O�YO�Ӹ=c����Ϛ[}�>�y��� �P���Kv���e;�

�����44ƽIN��&r��	�&�󚞯�z��>7����f~6�׌�7�}��7վI{���1���C{�b�&V�1v-Ʈ5��9?��h�Ksڛ�gsb�s�ޏX��w,ͱv;֞�z�b�G�ޭX��������O9-x�V�-��t��V����h�D�cfm����/��fߎ�w��.�xu���@KG>u�M'u�=�—�p��Qw�{ؙ���=���^�����?���ۜ��������j��}J�g<�L�@��ہA�
��>�3��C�ʣ�޿/q�v�����/#�e�F�ׯ��7�}C�(�G�9ڬ����X1N�x��M����щtNR?Y�wf3�����tt*�S�1�ib:���2ݞΰ?����fx>����=�;��|=�x4�G�y9�N��s��ϥg�>?���}�����ϓ;�sw��|9���]��>-��]���a�y�����YH��lt!�Ef�����/��b?�G��8_�~�]v�.���iYaOW�ߕz��K?��Oz�cu���٬�g
?�x?��v
?��[��Zx�䬇��z���
zm��n�k]�rw��;F7���c��1��uw�n��q�h�߄�&��$�a�^I洙��t���?ES�P4U�{Mt��r?���D�O�[y���m8�_D�뽃�;��i�
�;�{��ݴ������=�����|���;<�O�}|�xt��oi�����>
�4�q@߃����Q�F�q�#�8‹��?��1���$N���y����F�����y��<:ͷ3�3q�4��0��=�_��J��z���s�hf�x�q���%u��2�+ޣ���f^��\E���'̿<�˳�o8�����|�<��
}o�r�xޢ��6�[����-�nٵ[����m���Y��bj�%�� K���d�wK�H��<� Y�1��/V�q#Ȓ��,=Ů �]E��DK�����z��n����nuYk�Fv�q癜{���B�=p��&`܃����ܣ�=g�,��{���}�� �e��yׇ�g�)����D^�xڜ}`�Ź��$Y���dyhZ�mY�Z޶<$y�c�v�&���`$�2B%-��--}-Z�ZB-MX-�ⵅ��B������϶���������'��q��7<+
$�On���qp7�5�^�g�>8#����ǂH�L� d�����D�V%Y̶o�e��n�g��g�/B��>?//�j4
�(���v��"4��Ӫ�
h�7x���_�o����d��"���W�G�|���w
7�^-����?j���#����8@��p���_�?���Ρ?u�O#����g��@�A+q{ h.�C��C��y�M��ȥ@��h�ը�;�7���G�k�lc��n�x~�6�+���z�^ ������hs�xp�3�3���E5%���M���(ʤ�O*2��2�#�����P
�	�~��7��^�X�؜� ��b�o�\�O�[�ڢ-�����c��6�����Hs+�'<�c�ڝ;׮ݑ��g�]����.�X����u�i�PX��ϣ�(�n�Y%�j�I�Dk�K
C�`��DK%$X�C��9�U��ޔ6$��N�po���5���6k����j��5��]M5��0t�k7��[�osX�C��1��Z�o�rX]�ύu�P]a.	Ӗ�4�-BY�9�B�s,�R��;���I�8��=�h���5
{~?2�����/���ψ���X��<D����h4҃?�����;��=�� �^H1Ն���.���!�ԩ��>����mh�w�Ϫ�炣���{�}o�h�9��%�M0���D�jK{��?�Y�����r�f�����Ɉ~�FX�<��Յ����5�����C�G�>�Lَ���ގ��Y��s�x�8f����볬A��A*����o
�A�����b���yEt��d�TET4��B�Ŝ�<���v]A���ll���������<��'O�r�'�C��4>] 0Y�h� �C>0��L�ju=�>)���4���	N�YF�;��ڊ@���J��
�6�d��`�-R��(pnh������4=���TTY����U��"<n1Z��[H�bjz��m��+n��|��Ά��������y�dߚ����H�����m�m�-�>�(u0Z=�k�5Y-u�-�U�2��2�9�q�F��e�*� ӄ)|r��Ă6^h���>�a�92����ui������ޣ,�LJg&�
�O
Y�YA{��,�@�4�M�j��:�?4e�ι;���rbg6���(����n��t@��A�vDZR�9���a2��Ch���<���j�0�U���P�c6M�ZfV|"�@(;zp��'SkG:a���vl�����k����x�n��[��\��h���o>�p�ڮ��N{���/D։fF�xV��n3`
���z�O�w�Ά�=��1ͦZqp|
��p|�|	G������i,=�����]���Xсu�4�M��������F^iF<��AV��
��z��@�;�f��7�W�ՅZ�@I~�E���(���1�o�'�4Ѹ,A0&��D�
��BTC���)�v��0�LΎZ�
����HP�4=��-e��
k?�x2����[2\k���-s-���^���؁��[*��|�Z�A9N!O�5؟�}[^�
�j�G���x֏�X�c)	�!_�`beu�J�x<>�#�C�@����a
��{\��S��:uؽ�����?y/�a��M���т}���T���џE�����jq	؍{�*��o����zO�?_C{��C�9�$`3)�	o��2�"Eu���bpLUN���&KzDk��h˶��*�69�<�,yD�3�U\��),ȕ���|�[�&D�5��8M�A��$�x�@0r
�q7B�
͛k�Gؤv�:]�$�"h��O��}�T��e(Ҷ��z�랓U���օ�xp�|���(����+J�p���z��5-
��Kf{�V�g�����;>�ء��3ko�7[֠���>���ӏՖ��_)J�ua�D�$G�n�X�/��3m4�S��.���J3DER�o�
������tC��
��Sh�^���̜�BKrE@�d�u.�3\_{C�����m���hC��7O4����cUMO�X��)t�Q��(��Zh�,m���*t>�-��?��G2�,F��ۮ޻���p�Ul8��q��-�VS��k��[�ޞ)���g�
[3u4��5�BkH��n�_��g��~���~�����vL3X����λ��隅_a���E�4|�G���-�&�%`�����~��/-l���f�3�v,t���>9��P�(1p�g�W�l�Z����\fۄ��M�+&�u٧��_�:�e�#U�\w׵}��R%�hX�avt��9VH|��0ubxlmԷ�v�
\Z��Bv���܎��D����`o�_	+T~�j�J�u���:�w	}$��
�E�$�Y�2�*�8gx�YIR�(IUR�s!<���\�>+Ű	%�jP|�[��4<�Wmx~
�G�WK��x��`~�z���'�b�a�%���A)������u Έ4#$a�ѕ�?9�~,Bp�_EBQ�5��{���>�[
kʨ4�`�B|�?k\����4��	����:�k��D0�g\)Ba/�̇�-h�'d��Fp�� ��_!�.KS�L�n6�9��W-'�o:��ܼ�D��/��޳y�����3���ܴ�ё3�����뮻��8}�{��n^D���œJ�w�`��u��O��fg�ٍ3s��_��6�Ou�
��F�H��X�Exy@��=r�HRFRBh?my�>�`�	��ڸ���-K@�]s�0l}aͣ7?7�n�q�ճe���s�N�	϶S�5�G*�-~
>Eg�IuK1�x&:V�<>=��r�l]W�ٕ�+���X���p�7�5���hb�B�/�W,��i���˩Q��4en�Ǧ��iy��z$�!�Rm���������o�A������NDD+�N\stxl|j`�杍������s]�e�y��AZ~H'�)�R�����d�D#;M�T��f��#5�|}Fx����,�$�A��o{v�h�,��g�7���bU���R�X�H߈'�rˋS2�\������G��1��5bA���s"AFX��,J�/��02��s�3���o� ul��@G���['V����>!��d���G����B���q_ꫦ�,�U�djB���noR׃�`	�g�;��I��L����w��W8[pX�l��"�l�
P����}��*��ch/	���#G�}����k�<6�5�,��5+��m�J���� 
�@U�9
��H-΂g���#�T-x�Z��q�? ��̃Z��Z�4S~f��ܛ)MȯLW��)Rər!��w��gJn��$��E*%+�T`\5^+Y��&�)���-��3m���a$#�S'[��mݝ"��ޟ%�SfS�J}Ņ-�2o�k������N�)	��\�0�G�P��ٽg��S+Q���W�Ea��Bnv=r���/QﮚM�Y;��S��A3�
�˯ɸ���M5u[b��l]mνm����pj����}����KSs��vi&�[)�f<*���U�>&��c<ܡI�rf��ꎬ$ �f�t�޾ƺ�h4���>�2e�2_[H��=Mc㲙u[&&ײ:@�kiM1IK&�^�	7H-���tcm�P���N_GaAg�uG�b]��I����+74F&��6��z���XW���'�|.����%b�C��\t��^78>>�m(��B���:p�r�sy���4I�8���B�+Cx1#h�-i}!|�[�DY�A�2SAP����{�h�����(�y~ǎm��M���VhvD.l�n�*슨ӋS�N>xG���5S��^�! �Ⱦ �b	
��x���8I?�_�j`�p�� �rX

��o��C�Ǒ�p������{����E�\�2T���� |/;7���~q�Hˌ�/.ʘ�f/խ��9�yz��,�4Ө4��C��d�/K�QQ���-|���Y[Pɞ��t�ٱY�oB J�e�<2��k��j`�����y�ԧ�H���O�'��G�߄D��=�Pp����훉��8�i	6�wx������]Ո��Y}��6q�4��#L��@?fƑ��k*,v9��1c���A��hW��Qf��C� �MÎ�`�[��\!`د��T{�M5Ժ������f�q͉�C���;4�i����4�!>dF4c�[c,��1���)r6�;��.m
��E�vow=zkQh>r���_�;ar���<:.�^���;4ߠ
G�8�@��"�B;�7�
��]�S�����ԉ2"�_�i
�H4Mᑛ=�}x,M_\�q��-븳n��Mf)��#Ӓ��a�Ċc�"}74�]BQqW�z�V9k��ѓ�|�.��x��U�]㈻�RS�7;6
{�����`�����nm�T�:e�EV�ѨR9J�
�JyD���i�*���-Cs���t��yL�(D�j|#%�
3�~]a���f��}��Z"����� �вuou���ҁ�G�*�I��ç��J��e��UC;��n�h�}l��:83����@c ��ÂD؄H����d�T(e*%[�u���W./	�A���iH��@ZFس�)z�oX�Z�cJ�H��NΜiNS�D�4�dbr4M-	��-÷�wA�F�QH��~�`��$�.�Usgn֠�iѼ
,4 ��L �iC>!��sߟ9r��2s��i�Ig�R�S��Y'X�
}ݛK���[kߞ�K%�&��3Ԯ�f��2Y�G�)��x�m#P�/�����ch�%�w#��������ꨍ�� �k�N����;��@5��!�@2�D������������8�ذ�<p/h�<�+j�%�v�ǀ�{�2I9w�[�V(��b&�?��ߛ��/��F4�$=���
���x�D*�gN��؉�a��2�	4Ip�����L����I�� �^�'dXݚ�j�'�[沺չ�:o4�����Y�t����v�f��|�w{Q�%H�|����g��0櫧)��t���t�iW��o>A7K�p����5f�u��m�ΰ!��^_1���7���<�)U�z~~B�і�	�fR*��l�N�%�D�j�o�v�,�l2�Md7����A�!������(ԃ�TJQ���&������u�U���ں5u�ah�� ��:�/�]������J��{�0�b7��T�����
+eu�:m����{j3U�w���P��e�zs�5��b)ϷV��T^���]+W(䵨W���[箕),��:�/+�hͯ�X�R���Dt�����K	}!-%�ۣ/��;��מ���
`�������!�
�e�8�JhjU��i�:�w�0��� YwA��i<0�c�?c:�8'�W0�Jc4^��=�cv��=?������r-�ms�n�q��\���-���N�� ��:�	��Te�B��Fef�Ti�ɱ���*}a�2`kl��Z2�E9��JUX��%K��Y�|�ą�x�	�������ݖ�T��f�Ɇ�Z}���~a&�m%�kj��{+T���^���.ȸ=`�5�j%�%���v:�������e�g��~��gK���NW�֞�U��p�<���"\�H KW�����?�����ޮ�������eyU���֞���T)�c#8��U$�X�܉$֭��ĴqM�p�;]Ujs��[Z��S���á���,_1|5X�Bu��d:	jL��4o��;А��u;�d>���^G�&��Ҏ�@~8�9v��|��رꇁ�E�#�俘A����a2���6]`r�����x&*X\d���$|� ���~A�W�]�c|��V�{������`w�'o{�Lu���pz�r/&�S�aw(�Ǐ>�W��b<B����>��_P�3*	|/�9�v��L�,�E��Y��k������`�S�vy].p__CCCC_����;�ķ����~�/�6�[��8�[�up�:/<%w��>a��M	|�I�Hq+����� �}�ޒ�XT�TQ�p:���k�F�ʕ�W��C _a4���zhk��J�`=���ݽC��y�j���_VV�.�5���Fa_���OJ|�M�5������j�K�_f��B	��a���2]y�Ŝ���*ҕ����k��G�C_���uV��G���R{�J���H���\�Q��RT�#L��y�鈍��G�UA�;�?�����g�3���Q_h&�5_<n�]�G&7���@���BB$�"��#=���
��
�w�!�皛���<����뭾���8��,�N�Hv�1�i�Ea+��)�<�Ũ��2�����T/P��)��w��!C���|y��!���X�`oS��s����_��kh��{����������eG��<�B��G?�y�3��!��!^��+b�:�Hƅ�{�i�V��a<~@n���E�Iގo~>�|��j���k��'�Ӧ���_	�ؘF�i%�r�^�I?Ȧ>���gL]�K��1�G��`�.L8s��$��y�[��P$8P��Щ����8!A-��=L>���4_��	O��9�a�pm@�����%6�/W 
t���"[-�%�[enI-�Dh�BPW��Tm��ds*j�KZ͜��lN�p����c1���e��5��0�$�G�?R��†�2��Qp�����%j�Gx�p���c�8��o���W� �� ��0�h+�u��X$�y����}�n��S꿁~����~�v��Ⱥ����2�> &��H�/d�{�gy�.�]���N�ڏq�ף��$�����w1���j^�.AiG/艷�#�o�vl�����o<�h&���6�B�ا�ɵ���3�6P��ށ�>���o|��a`�{N�=�=P����!ȹ�z��o>f�N���_���g��v�]�0Q;��wy�p��>�ۏq�̢�t��Fr@5�
�E����<�P�#��?�!X�{�a�C�~��BU��_�� �l�vڋG�"�=	_8FK0+���ħ���S�w:c'7���]U��_hu��߾{8�7��L�|�G����Fu꺂��U3��'�;�;�D�+Twc�"�$��ro/��.o����N�ڏq��3�B�0�5CG��`}�D"�Fl�T��4��a���
]�Ó���\35�j쯜���ݷ��;�?12����9A2��6;-�hl��N��6������d���s=�^��y
5�삂�h��*�|�fj'\c�ٍE�&7��R�׮�u��.���\P�08MF[v�M�*Zx��;,���
�?�֟$h�$HЎ���D������t9��-n���x�B/;>�W�I�(j#�D�:����كI�6|��6q\߀#�q��h.i�9�J�W�Gۚ�v���9�Lٖou�Z�(�_*��6���As�Xpr�����hǐ9����T���W�����u�A��Z�a�
ZO�揂�t;��`|5��&HЎ�\���H+��[�8� 턂N����u�?�P��wY�o���y�nG�R2���8ɳa/ N����2&��11��`W��(ښ7���m�醁k��6�X�Љdu�W�6�]ڽ�-�==��p!Ӫ���pύ7Ulh�|0'�M�ZB���t��C=MS��CdM�M�XMc�q��ɚzqM�]�W�#��ǹ����䷿Ŷ�K���n�E�.��x����
r�&�Vk4Rx�o��˹F�^o6�������;�x���
ec���1�m�X�p`!F;v%4�:ʋ
�k�5��+�s�Ժ���Y��͠\�;���{L��j���kn���j,�նp(�Z?��^�nBk�m�G�N�\,o�%x#A;�錀��.X���i{-�?Όs� �߸�ncv�X[�D[RsnW	}�iZ����5��$ ����t�ӻG"��
0<��2n��e��i�
?xWZ�a��~���Q��u<X�b`A0�×�8����3h�v��u�G��o��#�����=}L�E+�]�<��F+�oh�x�ׁ���>�C�r0w���O��)����(Qt>��)��U���$�0����<�p����(3>�O#���_Cw�����ў�	LX:�^
��W
i�2=��48@M_�o
���iҕ�����>lZN��"	��,�G��b�t���=�_�2>���??����{1<�H����0Ȫꆆ��������89�&.Wpr�q�v��8���'<9�v��=�A����!~��\�S��x��c�%�c�?�ɋ/l���<?V��'1bwM�Ԏ%1U�k
� �k���di�*PR�e���(/.�ᔭbB��A�H\�4�hEtH#`�8`�H�_e�����8��H�;�3���>q�V������G�k^�?p��Y����
�����x~��o���\����}@�Ag���3"���-�K�K�b�I������RM
>6���`�l&x,f�x?^'ҾН-|��1���w���? �Z��>$�%{��,lŜ��¡��;ul�N���N�'��/�	��D��R�8
D�J5�YM��x��9!L���蘊�Vxi�n@i���Q��؅O�Ѻa�'h�UDעu�Ӌ/�5�E�eDN�e���{�&:���⇤�߈,v����?�i$�D��g�O��Q{�%��=����3�"�_g��E��9BK�t�'L�;���?%� :!W���U����<sV���n�C�iG���{2z|����!8�\�%d����>M��'2&����x������i��g�K���iO��c2h�̅�0�[��K�]�x�ؘ�uʳP�!u����U����.{������&��DŽ.��v��]Fo�G��wox�"x���E�#Y���$�i$�:~s�X]�	�rڈw���!iG�x!�}�"�_&!��늏�ڧ�=��/1���)`�~H�ʠ^���<B��p����~�H�Dp"QRmROy-��7X���T��C�w�jf~׉}��oi>tR����}ց��� �XQ
���pV4Ps6��Y'���;���q���d
>�8��":U��x
o|N�X:>��
�8\���jO��_L�4��;�xQ1/� y��|f"��o��2�F�6PDP($Q�BQ/���.e�3�����-!�}�rfR�����,VB�
MtDgΐ�(rm;��R1���\d«�#�ǩ�"!FcsTwK����p6�コܝg'|��g�o��I�"|���a?���u��q[�}q9o�u_����󈳓L
-goT�����)$���J\�*�=�N���5^�����-;�n߾����Oæ�Q��77mz`���뮻[M2��h��Є$G�`/$�\`��S�F��&�i������=��-��p�捆ٺȆ��[kf�r'*+#H����:"���X4��&ց�P�4|���7�e����0�z��ٙ����;Apbh�-�V��wL�I�,L��bh>Fګ_�������O8>:�d|�t���ݟď������I��I�p	<��{�5A���e8>���f��I?�/�w !<���𧢳d"�)c�i���{ �������u2~3~#���X��O�.ṗ��z-Έ_^��gˑD�\��LV�!��d�n����p뭠�����m�~@�
6�̸$���;8�h��W��@�u�D<�l_�͞�=�zg'=-�����/pz<kc��p����?�?���v��=��y�����g��������O��L��	�ˆ'���C�7��%XI^�
k)�jʒ,ć%R^թY�Ĩ��ش��Y�.7��#~��J��Ob�Jj�ZKۇ�B��A'i'y
�J�LڧA��a�G���4gW�٨Q{3��XbCAg�%�?�ٴ�/~N��<2N
s�J��6<��~#����d����G�7�s㣳֕`|t���ϵp�H=L�.���NC	����,���Ғ�t@
���m	b&�S��}�`���A���:x�<��]6}u�T�?��<.H�i��K$B�5�?@��X�E瘎Q���bI� ���#@��A�zC�D�!�4�����So�WfkeI�1=\��"w�B�I�BH-p|ߏ��g��'hq\0�|�~&���	q�yS,��ً���,&K��;���F3�m�_;s�׾����ޖ���0�D�Z:^6��-Z�X��=L��h�bӐG�Y����m8<�¼=��+����A�4�љ�]A�kWd���	���IE���ǵ��}{=]&k����[��O�J3��e8�R�٪��ٲ�����p��Yl�z.X����DT�)
����jj�,O�(
���1���k��-K�JÍl�4�s�X�#ˆ8|0Vf�ȍ�`B��	7&����I$�D�1|>Dt�Œ���@�	��}���?]o�OO��v�i�8T۰#�B,��$�g�]� `
��vv:PC2�F�'��?Z�=;34?^���B�B�
��XMu������
;�˳`�o�3�I�9ּ"�Y̆n$��p��R%�&{(�i��V�%P@YlS�D��(����m)ɰ���n����i�T���U�6���kb�W���~�%R��Km�Yt��d׻G
��cS�M�F�dw.׃o����C�6��J��F��K��b;F��og�yE��B{Hކ6��?P��P}0D���;E��pe�����܎���W�=�������\��*�\���T7���4�M`��u8]����6��п/JI�\9�H���l�1��w�GS;�9�l;�K]R�㡏��r�t���R;�頶����>Y���9*`�#�!�	�� �tUm�`���f]W�q�"U�&�%6/�-�8jXx�u��F|�8!�`3�KS�	�x�9�KҢ�	ӱ0�?����xڴ\Nx���`99�\NX��()d�9�K���`�#�o���z�$[vl�o&su�,S(3�[˜ۃp�:��1;�`���ͶҶ�2m�9�Qc�a���>t��=irb�a8=b��](�'�z=#���U��R��N�k��tBԩC��@}�4��
��\m-s;qt����1��и3���ܦ0,^���#5KR�g���!vIPK�|�U�!"[���wx����wx֯��}Q��@�����z���ٽM����]
a�\�"�I���?�k?��7��ɲY�D���S�@�<K}��n�ݐ���-['7>�,K�򿬴bR�dA�$�
.��7R����)��-��:�'��� ��E"��XUz����%1��#:΃�T[��s�$p!"J����EH
Iҟ�k��Rs�";MjV��u���V���\y~��)Y-�Rr�{���X��S�`T(v�L5FJ��X����Li�Sf�\�e3+=�y�/L�%�3S��5C������h�8g&pu�8oM��6�9��̌���Ms��`��5��ұ��Bg�����%�d�˙�yUR1Za�&�`ds������hdq���� �N���ʰ�(�eI­q���Ƃc@uDU--���be��e�^i>�~�	��޽��P3!I+�)^��={6mܳw/�>�Mk��U�h���|�kﺋ�C��ki,	`g�Lf[`�X��d���8ŭ������f5I�J��Ԇv��5kV���e�&<��\�h��}ʹl��G�έ=��xlm�f�a6�z�l~`�o�6oY3�e�:�b�N�sn%��T�^�%��o_�\\��j�΅esKn�_[u`��}kag�hm������%iim�˷��/|6p�N��L���q��h��A"��u��.|01—��"`W@ 1I��}��Ip�в�f:Tٯ\�U�
�]9��üÿdzYNө��-^���1근LCbG_���J��Bha���	�].�������%��
t����O���h�6\-������.�����Ja\ ���@f�l��hm����l��<[��H�hMyC^C}a�9�6�9��z&M��%Pm��˴k'J�Z��cu�idm

]���6>��J�^1��W�9���rMe�{�`�*}��+�eAC�9����
�R�
g!Z��e�2ŽEe�*נɳ�����Én8Nr|/-��h���|�R1M�`A�Hr�U��%�;���rm�@#�Q�Up!]��+[��:W���c�L�"#7��[[�`�?V���TI� �&Y/���h�U��0��b��I���[�&%���6��`��3�OI���Lh��*�P�{߁{=�V�p
gWô�|F�[�"^�d�k+�۝ϳ�51���Gl||�_]s'���UbY��I���l�o��3��Mj��bK7|�	�nK��5I��2�b���B�|ia
R���I��cU�;'��ixb2�a�k�[+��]�4��l�
O���'^�瘾ב���+�L}j</|!���	�#�U�8�tГ='ݽ�j�x:N=�O5�m�x����M�~�EI��
�`���u�67�㓵��'֬=�:P�0��li8�u�X���ͫn�h�yՖ������ꍜ#��K�}�LYD��2<�Ae�e�诫ܛʳ��ٍi)�i�7SO#Lq5:*�Ch��o5�p��>Z���*�Q���P���j�}�P�'5%[�Ǩ��y�HF23�*.+Y�����b��?�s���d�&�{��
��
&y5GڪrB�D�B}��'�B=��fiS���"�Yx!����
q���������<�0���?y��
�.
:@����*'�0.��?J����M��؋��]Wm�o���;y����������c>$:��-�X�&a�0i�K�����=e��~H}����.��T�&W��Ԫ��3>�R��l�Xj��B��������hl~~��ckU��߂;��[1�i��b�d��X9�
��Y�IU�pt@�����畁���FO��o�1ʒ4o�׻�:�z�&G*�G}��`~�{����rr�.�U�B���Z�7�k����u�6�3C�դ\ �lh�"�65�o_5/���֫�fn~\A9�y����w4�m_
&�
;��CQ�	�"���@���T�u1��L���HQ%�;5k�G�\�{c�Ԥ��d�8x����egćTR~������:;����֯��c��}�,w�ͭ��f�7��
�PeOk�ply+�w���:U���}��3��;�Z�޾�يƽ�-�e��i��a3G�&���#��vQ�۷�2��Eu�0�_F͆�����NV>�F�VF��1����B.�-5-���3�pimsQk�Qh.�n���_�'��»���6�`�q�+LMĬ��K�謠v�0�׃���}�-Yo}�	]G��&����Пv�

��Q�i�����ˊ$\�����(|\F���5HO%vz����)��-���l�HC~��~���!�wYL��t���3�2�<���;��>W��(�q%xΐq|�8��q���q|�8��q���ô�M���21q�c؏Ƹ8�%�#G�ܑ1�GO�?��h,��$�Yer���H܂@�����&����ky�]|��+Tۂ��!e6�;~Y���B?�+�%�4�^��Y�z�s�ƕe�,������h��ŕ���/`!lH�+�Z0xe!P�d���B>5v��c�}��'�(Ֆ�֤��k+tbv���'��>>�n͉�S%^ŕ|��υ,G��9���D�,^�MK�~�Y��	ꁰ��?K!�k�f�����a83����N��R_��]��Vz�ӏ|&�k=ne�ܖ�m�g(��U_��8�ma`��?���%_�R��+�^��D4������N0h��jI!����cQ�9����(R��㜈F����L�pK���Kp��؏hV$�\Rߞ��,����q��U`��+Yϝ	�&�_�XQ/V��/��0$��r�$��Ju�����ˊ�%d�weA;��"�kIE�e�'���L1�K���_��N���7�����[#����޲y��{L��@���j���W���s���r��uVn�X�����9��Hu$�ٷġ�����S��iakܮ�<F;sN�<�R
6�c��o��*���*�*i��w�=(�
X�d�O�X�bkס��������5_^�.T#�:�#�K�ӿ���u�~�j5w�Ѱܖ�u���75O�����͎%��?z�����u�������`���d��ILnբ�ؾY9��@�ȣV\_���_<��eV^<����$�3�>��E�p\$�i�{�a���J�#�"y�Wx=��q,	�Y����D�%�.������v"gs�%F����J�
v����q;�`�Z?v�~R]��d��7�|j8��.�sxxbp�z�����VqI�l��7�Lv|��6m���qx^ ��5�A�.��Uie蚚U���������H��Z�y����kn�I������F��{z��y��W��4�w>��t�Kd�8�aa�'B���
��L�G�6��Tdx�<�^�X7�f�(��2�t���z%��d�D�5�$K]�̷�kJJC%W��ן{^���f��_Q�fgW��Xh�,s�V��d"��X�
��{C<�ZZ��A���][��VVz��Y��K���i���de@s<������yz}���U\�㉏�<���<�H�<�34���ô14{�э~�$'s���8�@W��5	s�΃��v�=���Z��8� /��'̧:�	�p{.�8'���~Ex�}�=��q���~���#��~�C	u��G蚸�/a��yp]�o��0yK��H��8eԮ����?B�/���y�ń��o�	t_�>�0~�<ؘ ~���;��k��㼍�L��G��k�8b/�����[a
�GҒ$}�F�K˲�|$�-�ت�V�|�P��b���lw]�l��o�ȟ>��xne]kqeD��N�d���}冼*���^_ޓ++i
��,$�
��rL�tx����Ty��)v����'�e%ζ�<׸74p9k���>�>_�*]�R�u�.�JU�W��*�M�궆�+Z�	s��^&��(���8�v\��j��8@pr�����z�F��+�.��g��v�SC�Q�+��u��ĉ�L7tŸ0�}i�Q:T��J
h��|.�/��Sr�H���9����Z�J����:�<	ҏ��.��RWv��T!5��KsR�>^��k��j�f�(��� ������v�����)\MrK�X�/A�rr_|�u�@[����Hyh����i����'re������`j���i�n�qp���Y����j[_�>������6�Lr�
�j�%e��#�������
������u[芴-��;z�4��C�;"������嚹��W5�ww��vu�3g���4�|e�T�����5�a^����/�3����p��b9�A(��\<������8���]�sW��0��r5�	P��NV�,"��_��}�+�+:�b���.%zAL�qN�, �/�^��0��J�=QAK&Օ�J1���8̢�#o���ʉ��>�_���A���[�S�R���ǙU�RkI���`�h�t�J�����Zj �"�v,{~����]��pC"4…��=���}���O'�~���O��m,�i}�����UTʪ�`�2x�+���r��=��_	ǗQ"�҃̄$��婚Dx�s�\��q^��.W�x�'%��mĿ���� �m�|�����X��p�!��S����6�
y0g*��O��1k�ܩ�Ӡ�au?����-X�3�b�˲�r�e�ۭ�\�q��*znW�2E�|n;�s��c��#%��%W^��S�ֹ���M���.;��ZHd0���߈O�����S"����ҵ��˪�k�E�/.-O׃ކ�Ą�ҕ/���(ٗޟ&&Q�e��Wrw=�/p`�
�93�M-��o�h��Ml<w�����+k���L��⻝��^���#�p�y'�oy���J�HF!Ɇ4���y�n�G�E�" �t1���P� ���1��A3a��/�+e���&2P�Y\|
�G�ï���W�,B�~õ�%J��O�h�h�?9W?�H�yy�����6QF�P�H���|�z8ކ�l�}n�w���t�=
��"�yO�!4]%LB,^t�T��•ӆ$t(���JS�5]/}�ZDg?�8�������6��K��]�@/�R���4���RIDj˄㱽�ό���u��Uf����p������M�[�P�UZ�YR�R�W���f��w樲S�2�϶�t�����M��E��}��%�M�d!u8�$Dդ�3侮���xY�O=00��à�FA�z1�E'�3�pfB�ʰG�d	H,J�k'��Z�ru���<r|CQ�z�6�&��;\��<(��VR�^��诂�������Ҟ�K���*E�L��e���M�e&e�
�i]�8E��Z:�,_�t$�cb:�ڎ�}	�lZ��F\����bi�����U�����zU���EK��3e�S[�NG_BƇ��=H7Ssu`�GH�h�����`��2����I�r6F�5zmL�ǽ!n&op1{jl�!<�k��;284��܎���١��>Ӫ��P���:<y阼'��+�ӯ��b�Ouw�"avح�>�~}ټ���	��>��&���k�#1�'U-��R;�������+�:V�=�'��>K\G3s�q4�ܭ��$��S�O!���ᑍ�?�,gh��B���c��+�Anz8��X��@�U꥝�����--�,��틠���9�"#Gx�l~	�26$͸I9)D�HL�bH�M���L�ц�U�i��U�Zi,�ߘ�;��{���;3�i;���O�74��0gK{����-=wѴ��~t�k���z�Ȁ�:�� �ꖽ����=���A�l;��U��+���+�˿�/2��
������ﰀ��oF��х���L�m:�����+Ƭ��'	 ]w]��qf�T�QԷ�8gs��5���M�Z�~zp�j��B��/�̄/�t�)�rW�����~�u������f2��/v�sf��vL���=ʙJ�s#@E?/�˒�%)�,C�Ƚ<�1�6�WG��ciZ8]��F�VsO�4�wG�$\��%�^�N]4�[m�^k�V0����&��h�X6#�1Z���m�Ϛ�2����K�7W9k�K'���nN���Ȉ���јv�`&Y�sv�������09�v'ln�3~M��џ��q�2r�$&7в�D4���%Z����Lԗ�ް���#�O�'5T7h2uP��OD���A���>��*(-s0��v-~�'��}�]�Z_��q�L��e�ȧ&�u���X�+�ĺ=ѱ�5�I�VX�Aϯ��/�y���Zv.�	(�Ft�d�Hb��J�V�6R�,��X]KR���)y�'�ɜ�=ƋT�p�e��z�sK�d�l�ܬd��7d	a�8�ⶸ��#����c�W�K�`VJ}Y�OG�/���̃fl�钇Ͷ�~�jnv-����s4{������ѵ��[�E�윺�Ύ�Μz]���CWLL�ʔ�g(���LJӛ��x]��W�?�����Vi�Gu�
"��8��En��Z�m��
tz�����4}�-�u�Tot4��L�����w4Kjr�Yʢ,��<�v���I��e5(���]��|�o�+X߀Ʌ�.�iWj.��ARVG5�X���4HR���̾_D,�&ӗarō�_<ǰ;�^����w��/^�Q�}�L�/O���R�e�a;�1԰p��X��u�߇[J!�}8Yt]Ex{[������9�[3��ՈH���a����j9���#��
��>t[/�#Ni$͗KO��O�v\p�a&6��@u=���z�0�ƜBN=���c�!���I�2Y�=<]g�.��j#*���d�6���a�ZyF�ZU�T�*���ڼu��</��H\�z͎U�2�pN�Ӝ�^'ӔF��>�U5��+�[QP��<�c�3pWf��>��;��;�+K�L���mMAcqh�Hy��djt��بס����C��!E,��64��LU��F�d�^3����o�}�4wY�,F�o�s�~i9�������ȗ��Ơi�l���ƞ�
g����%��8bR��4Q��_P?B��J�c��6�\ɏ��"������+�~�{�63t�,%��\s��c��-�m�9�=Ah�
�"Q�������[��W�ϸ=���cv�v�K��.���%;�R���J1�$2�:��l����δ$-�4~!?����-���s��<t��a�?X޾p�-��l�R��Q�����K�2o�)�pL�����<�(��gP���h����j��l{�;^�T�
��V��9��d��X���9�
�Y�kҲ9�Z�y��%1�,��-���Y�Y�rM��/
��F�T*4E%�>��?�}FU0���-�ǚ�rTuCX��'�T��!��,�lz^�/�€`������w�sD[�2T)byrz�f��X�ט�dYҔq�Z�W�S%է�Rs2��ΧdjMf�F��Q#���+�UU��\��Q ����<[��@!/R��Է�E:�V�����Z4����5�Њ<�<#N��OM�N:��QZ=��w+�]��_�XYv�o�)���e�/{Ӓ����_.�p��,	ʨ�_Y6�n�%M�+��Ȍ�&�9�"B
��<���c�.��dڥoi*�һ�}S�>��w5�q"����A7�� �Y	��yįO޴��q4~t�tv^��:���&�����1#�����b!�,�M<�]n�%E���I|Ie��`�"Y�%)I*uK�`�H��[�(�ԝ���1�}���O���ݛ�ěɨ�BgR���*�vۥ٩���{-�,�,T�� �vǨ��4�A��Ȥ�T�������|�ܖ!u`	F��9&�������ZyL�
)��ۀيq�iUy�䦑��R�!���o�\�yQ)���z[�>�J�wk�)ٴ!�����O��hL�|1�(� K<)�ۡ���P|�Hp�8�m���P2���a彚�2�.>!�\$��ޔ�IH�#î��K,��[�N��h$~�; �{5~F~��Tt����U3�V^|����GS��VM~Z�!�`X�|�}��I�H�_'�C�4M��/��\QCf��T��Ri�;ObqC8���y���sC��D~\	�o=P!��@} �:�S������_F��r��YYC�D0��%Z:��X�M.��/p�x5��>YX��N/�mi �/h��N6=�4��ӫy=�5��*Es���R�l=�����%y��ӟ��u���[o7��j�}��WoIqI�>hn�i����Ç�N���t������Ç�z��^ElX���=�#103/0���G_sZ:S�n��Yw|_Ǯ��zzF{�Fz�{���Q��k��i| i�ٵ���7�)s##�)���ó�|"�D�4F����'�t{V�3�ҴcFa�<
�Փʾ�%/òc\���ZH�Ɛ��@pXVhu���:�V��`���i5��Qt��
,k�bx��{����p�q���Yv�Vju�
R�^���]���)z" �F�b$_���V�ď�|��(�2l�ˀ�IMj�9=Ե`o],���`Lf?���!���{b��%ۖ���@sn�n�6�փD���T�v.4�=��u�ي�>ή�w��Zf�s��U����7A]W��ƒ��� ��e�<!X>�����Ƀ@!���G������2�|����T�o����ߓX�=�ݟ?��w;�w���;�!�b�z�q��*q���
_�>qRv|[����
H��]VGf)�F���Ɩ��X��ǵ�Up�a��x�^����+��In:��HA;pK����N��Qy��F�����K����^��d>3�kJn��E-�O�oZ����i��T��Tj2�yɩ6|�Y��`/����?�������\ɲeI�^�lK���-Y����+vdyŎcg8{H�$̄���f
J�m((PB���R
<��9�^ɒ�����u�=���}�~��2D|�u�~�x�zJ���Bz�9`SUGm�3�)�^����kp����5�o�1�4������A�׃:��RĶåJ�E
U�$�F3��J��ɱ<�D�HG�P~��{\�"�0��7�1�{�4�ȳ�w��"��"��	�IX�TX���b��nx�k�&�?���P���X��͘�X�3�>�D���*yh{�Y؈7H�7���w�W�7Oٛ��k�:��;]��⺦���v�|�P�E��p�1�V��w7�VPc]�f��`MccM�--Ub�fCC��^
������\�&����8�@a�	��(�ڦ��Dh1ej�S*u���s�%k;���qY�ѫqF�ˈ�F�V��|1���Gcm�"k[����<�]�i�y���ܠA�򪱅��Ӡ����zOӉ���[F�O`:6p�1����Y�OfEY�q�y�qJWnC4�S�$6�8�78�t��+�"6����~KEΈ�	��F��s�����̼4u�c��n⎆�Ϭ]��	�$y���,�Ml�Q�wH��$~� J�)�{OV���y`T.�"/C�Nu�K�ib�����lo��y8]-��px��?�|�?ю/Q�hT��5q`I����y����x#�z���K��ip^�ޭ]�6�?�d[V;����*�+��Zkf�V�e���x��&�[+wh<Y�f[S�%=C��{�={���_�{�=�f�KbN�q^�;��h^Q�eH��/�SZ�e�X0Xד�N����e�zPn���uB��5�?S��g�q��.���|�͛G���ݙ��麀:uc�R��2�H6D�$#��	�;�(g�
r�l��
s������~|�䋫
؉¿rߚ�{ˈ�GW$ƞ��x�^���E��+�X��p���eC4Q~������ټ`�z��b��@}}��P�+u9}B��_V�ʚm����������6~�s~��՘#(�j	���ܹa�ɓ��]3��:C�����^h���7
�dg$���ڦ�<kc��X������_��E/�N���	/��kqg{8L��R�%
W�qr��Փ`=�WEoX�A�=����Ͼ�� ���s�|b#ӑ��u��]�F�ї��T5堭	XK�5�֢�+�ks��Fvi��͙92noN
g,ė[	�ў���^\S����>��7�>i�"1
���O��9��(>��B������4wvt�c�Y��#�9�y|����oN��
�1x(r`nT<Ì��]����0����D}����ꩩ�@��,���t�Xӥ1�c�ngэ�����H�@pj���KC.�9wrT$b;x�=���$;��3.>0�s�6��0��S.��̇3g]o�FAm�1bǐ~��Fr?_�u!g��>�;N�!9w����.�)T�gl�s�8�W#k�U�����:�6'h�9��P~�u��ˋT4~�����
�E;���x[��ʴ�/h��m�k�����̊�.�	O"^7�D�b�\�l�\�&�⍕¼��G�	"E�fF�*+F�֚1�’�,�bį|������3�B�<C¼៥$>��`�V��Uf1��Վ���~W�<�R��|$F�<K|��iF>kMH���U���'�~���E��Q�y0��<1[��3�Yw�>�x��1*O���2Ձ���#w���%g����QК�6g;�Ma|�,������*�[�	�=+��	����e�n�Ƹ���XaMy�C􍉼/���R���}I��/����7�`~g"�Dc�.B�=)�c�Y��Zj��%�9��d_�E$�mB�*����/����i/��?���Ȯ����z#tn#^y�,!h�����D�[.����79�"�L�o��i�̩אָ���'�_��3蜞ff��o*R'�#�_�%&�	�|�%{���wA�O~~�g��_rXjfVO4�lqG��8B���BK��cqgZF�8=1��R�)r�u��7�a�c]����q$Vi�e̶M�x�1Vi-:�.�qV%�sS��ৄ��G�p�h��y�se���4�Z�N�x핶rߝ�1y���Ĝ�������i|yrzl��9|:������SWS��;hF�^�v[��)b�R���JuIB�X��/���I�2�o�3�C�*#X�\����L�I�W��-�^�TO	�I�<��_ �27����_Vx/���l�	��z��������=ׅ�W(�Z�:y�E�2O��ڸ���A:z��7�02&+n&$|�QD�Mf4W�\��\�U�MJOL�Er?���C��o�O0�#:F�c�{C��i�Zߑ}�CKݶm� ;'���F�!�S2�Y�ֽ�R;�C#���_�h�4�EI��JŐ�ł��2���P�XX:Z���Ņ��A�=z�LR���oT�������K+*OO�g��-B)��PRCō��T�(P���d9}T��L)�=�\��a6��Vn�7�;0NY���5 ��g=����S��d�`%���cޕ;�u��4�Y�G�}�"�Ө�R�g�q��ǥ���]~&}"x�!�-0qq$X�K�F�M�F�b����$P
3S�vԧE�3���+Q:.|jf��UJ�lej�ҭ�Ya�be]��V�r����:h|ToD2���U	4���O>	
uk���(�v�F%�=��_š�~�Z�B�4�$Z̦qiyW,5,�ϙ�_|��$����4@`�c�O��h1�P86�6�q�h�����4-�+RT�}��}�� ����V$KRS�e��b�����,�'�����0�;bYajj�L�(vk�<�j���@���Nx�9��w���L]����6^"��
y�a�5���'e�]/ɷ�˖�N\
��˱�5���+��~C��+�soͺ����h���	ɃK�
���j��?�`?�r��g�����\�=F����R׃���2;��{�G�Q�Qg�t�Cj7��{���wݻ�ݻ�]��@�B�	f~�1H)���9?&qYZ�bu,`��������v?~\��T����#ﭤ�&�{��� gY1cS�Z����E�MF���u=^�C����f�0^�����`�0�z��P9�TN#+�i�9�B�9v��ɕ�d��m�~@��z�:�i�Bg�ap��Z.�3��2r��tU�Et�b������S��.��+�S�΃��J�r�-!�e�5�s�k����eX�b�;{��vG�jL��y�ݾz]m~�|����w�@*���Ɖ��͈�slo������1S�V��<����	�@�N�:�,L�E��kr2��4��V�Rȋ�2_Y�������!��Ų��V ��_��`HXlgt@����ht�X�Y���f]�Re-V*��r����X���*UE�F;�`CA�PX�$թ�zT�=+O$�NJ�+5r���JQ�x�K&���`�h�bCu�ƭ�#��n�t�m�pzJ/F<�r�^���̥�ҩ��k=u�_r�],m�	HO=e�ux��J;���&����s .Lw�>�<��]nN�\�)p�$�@Y$M}8.��;&�/�����d��a~z.��"��Dϥ�rѢ=���2o�Xn+wP��Pz0p��C?�~G��%�s�r�p.x�N�
o��i��<Y�R�.�5ޏ4�<zuG����3���>��K����W�Tg���;f�X]Ai��j���;�8��hI]E��47�Dw����nI��`���>'��']����'���O,�i;�_�
c��{�j�K'hK${+���r�KNː8�޼��dE*�ړ���
��_"�{���?�K�#��Ԁ���q@��?ɽF�9�9x�Ǜx��W_�~�'ر�#�x��p�7����>O��>7~�����w�sB��~B�zF��(O�#����x��M�!#��	�@������ǥ�GҰ)v�ѱ��j�1���Ő�x�w���;��,�YZ[F�1
8�2ij���� �60�{�~�܃�+�E\:I���8��n
��'��k)��������fL�0���(3B7�#��??&��˹<^F�d1�P�o9��W��~x
G�c�g�d���pZ'���؁�b�:?��L|:��2s�qj��Z��lY����F+��8!�-� *]��,����{���
��{sѽ�޾p׮���nY����\ǎ!9q���bh�!��<=C��h~O���n�B���Q,JK��RvR'wD~@�����-#�Ux��0݊֊.����s'��8&�n�pg�����8��[�����s�W��.�qc~���ѯ�L�OJ��B��at�B���Eqϛ��#躍}~7�>����7�\�ayǘ{�{�nw�mT0�1�]��t�%�,X6T�T����~y~�{� |�z����h_�x�������9��Qt$�ˤ�lH Z%��$wN�P����/�-��4�2����>��P |c��Z~��	o	hٛ_o,/+#q�b�d�E���:�܀���dA4�Ž�1������������*|+����+�Ҟ�0�,�l��%�����k9H���,�M�Xz���;�p�"���2G�T�(L����M�	t����pg8)�4�#?fG`�T�����W��&���]����>w�]�a#�"|�]��~O�t�BU�}��D��*��$/L�I��z�ק��~�No
K�q6�5��~��P)8B�.|�6�O��ۈ�iRF;�/r}�i��Ӂ»�-C�k��S�j�?c�&��\DK�~?UQ���=Ee�.�ЧK//)�XJJf�?.7�Sw��!����s�>�D�mBS�>7P��/zXv�s�^=��g9F��}F�5��G�´7�q�_,�
/���}�i/��P�3����FiLn�i�
<}s�WEa3�j��s�]�k��B=	:I�6f%�W �hB�	�ya2�7Q?���
�ku�T�M���H��\N=J]��g�\�X�9T~yV~�z�@h&����[A��ܫt!y���z7��$Q5Fܸi�1�� s��)<n���z��KaB���If��<�����;��^A&������'g��K�1�����S$ʢVkX��.+�)+�)-�.���*�.#sVQU��"ă==w���ʺ$5jKї��Z
�j�$3Oo)t��2k.x���4C'�Ρy�vg�{:�a츾��E����+2�������<����qǕ�zJ���d��
.�{h}-
�/M�˰���N����tx��)�p�y5£@��g�晓�g�+�u�ztށ�
?�鲀P����ހ�5B?�(�#z]V΋� �עi�"Sf�˜���R�y�d���M�$�<���HN�,���FX��9��#�P�ٻiL�l��ؖ�����5#�$O
��F�C��T�J�"wY]sQwуhn`���E�\�n��� >S�]�/�f�{���+l����H��.
ڙT\2~�%�[+*ч��q2n�bY��=7�tp��̆�4vZ�0J�q�(�9�NP^��j@\j5��&���zj+����������8dD<�JC�D��]�r����o��5g�g�_�.r�U�&��b�8}뇓G�é��+��Z�a�E_ �چmD_�{�{���V��"��M�-���I���3��V��31�#B� U��ˏ�����{��\���<��c�g�[&=L��S���"i,sE�2��I�i�>�2Y�o0�*i�P��&ht�.�V,ш�dm�{�Jچ���VF��F�K�G�a(51|��/e����
|����1�#���Ѱ�	@��z;��**(r��l'�v�o2O�E�3�6n��ؘ�P�~U�ƒ��Qpm;�5M/t�4�V�f�!�_��@��݈�x��a�@.\�XU�}J�_��G�}P�סl�d�8U����/�1EU@�	T!a8`0T)g����H޽�Y�b�,l���kq��]�h��=�R/�P׻|��>W���Vo�����3��U��߇?�,���Dg�%D?cp����K��������T#�g��R3U�n�۽N����"V����r�\#t
ѹ`H�K0bv�7���
5�g�փ�ᷰL�����]{2��rd��Y��?}22��������@.��.I�yļW�\x��Gr��A�҅ӿ��A�Q�L�I��pl�����5u�3d�l�h��?9>�/�\��F��B���)�k�&Cm��ʾ���2������x�	����w�v�ц�@�
n@�<��%71�K.��4�	9��G�Bj��G�4K}F0c�̬�Af��PjI3���k��4ǒg�*Ӳ����d�tS5
ĩ*� U��
�UrYZ��]�Py�Py
r�F�f�<�=ߦ�&)p�-�B��-�*)4��M�ޝ�nN�>Oq��d4�Q���S��>��B�,Y1�Ibq�P"1:�ɢd�O���[�.�Q]6�����8IA̬�T^\PYV\T�9�j6[�&������ݶ�<�-'��1(��t��1��U���P����u��t�-�Tj����a[���G���.����V��kaEU�܌�o5�)�E"#\���FZ�ݙ�Oǧ�ɲ�.G��#=��|�^�Ǔg�L�td$��L�-����Ȁ}^�O.�+��W���fMp��F��JRE_����ȡ�ͳ{���F*��P��gY���Fy����
���c��&��"K�ݙi ���2(Fӎ�e�e�з�2i�B��_Q��P���&z��fZ+��bC��ă�V�f@�i�[v��}�iԏ����׫b�cco*%R�!�l�j��Up'/5!�~�L��LݢP�<nB�_��^�����x ��/�����A8�֥b�Ph_��;��6����"�xIO^EEnO0/ȃ�vv.\��G��U�΄�4����W�v��<��؟�MC��|�!����.f:��J&�t�֨[d ��&�m�n9
��OO���W�l�d��M�h�vS+��u���/�86�ڼ#���!:S7�~���#�J��a��O��mT��s�Hi�/��d��PY� q>�g�`��<�s�O�'�C������x�ґ�.�&���d�{�$r(�f�N��+�H\lS-��J�9�WfEL:NG��e������3�&O�H���E=B�D�Ϩg�ęv;p��E�
Al8����[�\F|5ؾ�H��`[�{	'O|�ٲ�""J���ѳ�e����QHr��V�
n��Cu���X�p�� <)Ŗ��(.5{����y������oc���MTf��2q>"������_����[b҇ϡ���6�S�%���2�e�xJn���v*��Nd4�M*�llf>�'q4����2z��5�TV�bD
�������_���@���8���\\j/���M��1h��,qr�GƘ��'��鳣;���b�Y��Qi��P�3X�'�۹sy�
��?{�\Fc|�CmGt�5��5��]@0� ��7q�l����f�v�ı �.��2bww��\�Yta�}:��6��g�Ʈ.�
�y�����������#4;����~�0<9큛�wre�uq��ıK�
�g�������w���R��G����HZ:�R��@Wd�H~����
�6�BZ�ũ��4v���i����p�cl���#�8k�1����K�2Қ���MfL�?w2/{b �{F��cm�����u�`������A7M{��`1d����TO�T���Eקظ'�>,T,�k�'Hv8V���?���
z{������7��0���|x��w쾀��9j'�V�X3���f�yنE<K4*ݭ�<6zmn��滊��dW�dQFSE��w]������Z�:s�Z7��mh
,��bb#/�?��
�%��,���1��S��	S�&�OH>8��o��?�ĕ'�Wq�#�	^E�� ���֧�������5?��R����d�6�����c�>J�Z�,�d����55���sM��)I-3�id2a|�'�h��|8�xB��h8g̨�
[.!� �F	v{N���&������/
xj2�����4���\�*���
�&�6��c���R�,�o�w�Yj[�+�Rk��\Ý
�O���h7���˻�8J����Z��[57���`:�6P�����ߜ��
��ۣF�E��Vt��z/iX�X{`iXQ9ҧ�58�j��.�-�%7�@.-*��3�.�h��m���,n��Μ��e�婍�uZ��"�����ٽSō���c���6ǟ�!4����o�ƺ���YR��S�p�7`4d4唹�
��uu��m������1_RZXۢ�6�UY�|kmQ~N�T�.�>\�'�CىB�R�r0�p�����2]���7�U�-�Ԙ7�57�4dh�+����B�HTx�\�������b��.��i��]Źu�D
�s�?YB~�����I�u
���
�(�Q�h@c)��,�m�Z�B�)0�Y�-k��]��h���7��6ho���a���l���6�7~�g�NF���CW�<���x�8���;��-�&�E�:��Ȓ�k�"����9n���vR�@V��=�L1�1���*�H�(�<�Q<8��^ZZ(OM���m�O%��%�d�PoES�J�9�`>����\�����J��f/��A#E��2�vDQ�{���k�q$��g/Q� }�Nd�Ę(�����)�eYG"~���<�5k�>�T�
������7�쉙������k3��G.~5Y1+OM�^hq4-(�[�&�ơ�5��5���
�S��{23;��^�N~2�Ґ�U%J�]]�e	��dȫ�H�*qU����x2�"snjn�%—��#8��G�$q7ܜ�C\�yh[��ܥpr�^)�-�m`{0��2wYRxu�$D��/���0}��xw��Pp��@��k�W,�w��^���ն��r�{w�ݻ�Z��6�]
&G�L�p�N���?���8d5��,��=�͆T��4�QSW�Sc�)N���f�(�lY�})�&aʢ9�^�T�+ȱ��E��z2�Q�P�G)x�o��>Y��~��o7ٲ�S�ڌ6��X�p��}����ƍMM�s����_�;����$�[�Q�ٽ
Z�������QH%�����G}�jI��H�<��{&�3ʨA���7���ʒ�nWc�4%(�nZ��=��y���X��~YY����"���6���G�XTB-c�YH�AUdž�[�Xp����_���&
��v�qه�.J.xL�bv�f�J�/K2"8�@�gP�1W_h�W�F�B��T��M��5�6YŚ��4��iU�}�X��=?����s쟀f�_�
hPK�5N�#�;d�w�r�"qmض���I;�\�Hݠ�ue�ܜ����!�t�4�n}�Oiך�@�|�ҝ����nJ\��nm}͆��%��Oq�m4��������D
���*zs��!�'
�S�r�Vx�e|i��vS��99{�F�7�����?:��(�P�ZWi��w?�~*"�!o�F������Y��7cc� ^���l��{�>i����z�x�R,E��98N{��~�*\I�����J�5��o�d�)��(�Z�ش7���mr}��b��'�_(� ���t�z2/�T3�o�HT�Y�"�6�����M�����Y�pI��AOOnng�D�+�W�8���z��1�����l��ꅏ=������2�Qg�Xr\#���n�dV��\=hi�ȶ�[���b	�b�7��0��fD�+BQQd
]�T�KTȋ�N����?��jz�m��WP��G���)\&tu�e��4�D~E���n���8��S�.��yGSrjʢc�����6k�%�;�૘gq�hW*��I�i��_�=v�:�!U'�d"�� �1G��f���iE��.B_���+��_TA��r}%7'���'��'З�~S��k	cA,z�)�/��@�*2�,���b��J��.'���JfR�-�+�b���ɱ��[3M;o�+�r�ñ�rt~��
�:ŏLg;�X���FE���W[�j�D���x&���Z�һ��S��%��<O@�>G�R��|�+�ͧq[�̀O�7H<j,i����pZ�C���^���ܵ͡SSk�.[vYb�e�}��Zw���֙x�˛��6m�<�l'xH�(�B
б��e��$F�ґ\.Hי%5����M}����Y�pdd
�7���VF��s0`�U�[.�\��i��_�ys�
�7n��ޤV��ԫ獮<�a{�ւ}���s���L�i.�+��r���ʚ����	���$K�ޜ��[��wy$Ҫ�ꦨ>�VK�Y�۠l�d���'�f�/ۘ�8��f�4��ď���K@��=v�c���ψ����&'"�T�76�D��$�l	d���א(�2'K�Ize�6I#�(*����	�jb &,�˜[�O�ɵ�~c��‹n��������?�Q�K�w+X?��*XU4�f����0G�%��N+����0�F$�gXdz�8�L���}�ЖJMN2�X�Ok*z���yܜe��t��ƇDk�M?��
������v+3��S�S�W�������c�GiHo��1Ӵ�f[Mξ��i�zc�g��]�̞!�Mb�L�=�ݹ����:$��ٖ��}��V�&?�<Yvli���5g[ϴ?:n���k:2kҚ�jZ�)�5+O�}�蓍�<�#:~#$�)W|�D�ڮ��� [�<�Y嶈�Īk�MUPnV9D:�}ʖ�D!�u���9u����O���N���Y�.�6���]�>ڊc�F8]��2�J$��k��a��e�4K��1��$�����Ͽ-�e'�� P�[���].o_S�Q�3$4��/�&���}�^�
��1z���g�S����x�#/=���`��4��Q���ST���o��
�@=��t투[�/��F.�K���Hoh����jtӧ�/6��h���_�o�H\�N{���%ff+�n��2�Q��2N�"C����b��.����s���V�|�M��.��_)�5�����q�'�5Y`�Y�9�w�8�祗�"Ϝz�(*�Tg�ω�z(r.�,���dž�'�'��ظ�
j	�?Ö��v�����?z�J�ľ�(��Q���H�H@[�H�*r2����E��u^ZI�o��o��K'��v��0������;:�
֏�r�}��A?���}����3�h>��(�*'$X�â�o�A�v�%����+���<��z~��2�\��}�^���8x|���Ze�L��r���xM����_Dw:�	Ǿ��ގ���kf��x+���$�	�r����,I6H����D�A�.��t��u��V	~
�/L�[���&��g�3�{�ë���;��k�|�V��p��S�h��h�&Y���p���g^Λ_�F��Jm�Cm��I�2�
6��쎎=`�f|I�[�D�8<��`������7uF�b2�/rc�%�k�̑�������C*��
�.JLF%��mT1 ����⛁sGƺ����|7_�Q�5)��:_���j��|	������jikm�X��Ӗ���DARra9T0���t!�O��ZrN��^	�ۥp㇃���'��'�w�M睙�cA�j�_6�Up#a�GG��<�xɺ�u���M� F��@��r��/r��{�����;���rT��Dި���_)�"F��t�
ګ����U�7�ڙ���#��p;��x�*n>qwGW�u�����p�o���x1Tp��,xg�q ��q��6�|��|6	���Nb?�5`1s�p�]����A3W�0n�Bz���m��k�)Y�W��h�5'F/ꬪ�����ܶf�4��x�`��:��[�k�V�4�yJ̩��9�\ؑ�d�����X��@���94�u�hql0u�Ja�>vX�ԧLߏǙ��x��f�S��q3�Y:������
d���z�D�F�O1O�B�t�9���w�q�wA�	�g�q���B�Yd
��#IM����%�R��I���QjC(QQS��s�/r^=�����q��?���":���S���ta��)�KY��L�}��6�	���	*1�B���Ǣ�#ɧ��������5�w��qL��_3�1����M�#m�p�2X�1�߰����_p�����S/p��Ы,��M���W��?�t�����D�P�D&;�F����ѯ�Pɂ��e�������*uCA`dΔ��
����=l�Y�+}�{�=�H�J��#�Bw��?���=��	�T��.ZCHPA�W�V��g����+��m�<inwhh1�N٥h2w~$uN��O���g�������.ڸ,	1���A�������@M�7fO�$OE|�vg$�]�늷]����|�v�:����"�cbc��
Tc��9�M֬ž��7�ZSї��Wx��<�8	/�;5)-J��щ�wJRړe{�u,���1��>��X�|�[qpa��x�����'�5�N�B����M^�4���k�,^�f��?̹y�n�ȕmQ#���^}��� ��H�SټS"��e��آ?�j�w�ch�w 8�8���O��Y9:�ș��A�wd�l��|�'��l�i���,/�8�iN���DbH��/^W�œb	��W��$Eu�W,kZ�������B��R	�z^'Q'��SR�%+î%�J��3�=bwʊ�.��8�7�!�*`,:5�_���b,�~o�ލ;S�k/���FA1$c��r�|ǽ������Ux=�Mj�'6���"\��O1�����]���G�̾99uu��gv[��Z�ɜ{�q��ϖ��kw��3�]@���^�`1����x-
ڥ@�(��������3��{����%�2g�G�6�s쇊��z�����J�_��.���h<M�E~��#�}���э�D�iҧ��GK{^J�0T���%f�^-���o�y���	�w�e��L�,��3]`�.��h���ϳ���3�/�Ÿ�1.O�G�+��{w,�_��*�o-�$O�Ԁ����0�@��w����� F:&���vА~��n��X{�^�%ܧ�W3]��>T�+GSEѴ��ca4�M���9"~W��C��[dPd���^f\�] +��z����}����F��{x��8�+�Ѹ�\z����'�2r-��"�|���둌I�şٶ\p���U�����B�t�r��1&]�B�}�ٝ��-���t�'�W����?��@�r1[�b�t�tV���g�7��Їԭ���a@˸}1�NN{p��}�)b��b^$��nGv�"�XT��B�eK&�|q8x�҆������#s�Ga�����o�|� �sy�m���྅�c�@V�Y�oTlC������65؋�,�rk͈�J"��䈩�!������	m]�7��@�M8��߂��B`D_��Rͬ����ޓ_cL��m�3g�@��j�K�;-���6
S$�"�����V��A,�m�R��4�ősj
�B����i��$�	�&oYP����^��V[��Z�;�۶��Vn��ܿ`Ѣ&&8�FÚ�M�7�}�-v�y�Q��&�����[�*.���a�����k��7���0J��
�HiU�*�Ɵ�ޟ���;I#�,�az>�a��y&~�L��V�Db�45s}mkk��!��C�cc�g�F^��ܸm|�a�Pu(TT�d$�dkoĆ�o���iN�>��ev,����1�	��ՁڵMY����֙�Y~g{^}��V��4o|�_*nL��w6���E���/�~�AB?���p���v�����������;_����`ZE��M�k	S㨼]V/mY�`|�K���[�)|D�2p��򒦺�;�ʰ�П~]j��mI�-���A�"Z��
K��y��P����V�6�B�{�(cL�?� �'js���u�_Dm��d<>���[o|����6j&�����c$�ٸmO�o�7�½�{��3�g��h���p�֙p�,�\�+�����@�� ��ci��g�a����?��|Q]i���#&�=r�+
0��w�4a���������$�3
�^Y�vfT�v�G��e�>��els �o�p�}Ǯ����^f���x��R�r�P@��H1�N�r�VB��ԃ���iA��;�L��3��ś����Iq�H������4��:�����K����م#�^�һS�w.*��@�WW�1�c�|F�7��ϓ�n?th��������	��.����[��2�
	>����ͳ�@���r�l!1S��'n|gr͗k�~r���m
p�T���K��,2��Q.Ar���	��N.��ብ�4�B��X��g�;��\*�̽�-��d9����'Y1ex_�^�*�oX�~�>��=E�J}��r���h��2��L����`�ک���T����ڞ(&�t(��h�/��K�{�P&B������ac)�2�
kǸ�ϴh0��˞�e {dO}w��!���K�'Z�ړ�X���#�OS
���Qc)9S@_^2�$��("�&gi����C�����G��q�Q��7�/�?�-�w67�gr�ᣑ9S77

F|�u�@���ڮ�=�
}zi�@-���H5ۘ�"VaL+��楗DqX��o����:�-�-���;��C���o�8A���ݐ,��|C�A��ӥ
je�щ��1
�/�vI"q�,�|��a&��X�ew�M��ρ�\Y`0 I�:CNw��z^@��R�G�:s3�~�/��޻�*�>У*.x�=_g�L��oX����@�g���4�,��2sJe�R��c�r��$Us+��2���r��+��u�^�u�v�M���R���c�J�>W�Q�_Q�������h҄���k_
���j�kR̞��"o��z�^��z(�C
<��o^~'j��%g��jW��v��#�e���1k!q�lm'��+<9����T1jn�2���>�r4���
�d�]��ORj��!B�����H6Tҽ�G�BRbC�S���h�3o$�E�v����G�ɐ\�HҸ5������>��(��o�uJ�ngFqY^][Ƃ
c��'�-�*�ε��u��*m�N��{��y�&�pMS��'�k^·):��@�ɉ��2H[J-eu<:PSWQ3묂�j�X��k���p��o�R���D�c��A莜t���n��b�ک.��dx��7�d�|���dKJ�՘�Jzsw}c�����FGzz�I�VVi�
���&�X��(�-&�wz��&�D���𓓚��|��`�Z�**ȎH�bO_Jp35�F���|'�	�|Ά��١��g��	���ce�6Ӭes��������I�W�Z���%�����e�V]6�Ԟ��D짱�g?M�z��<
��K��^�c�a�����'hklk�3/�[1KO��Uo^�����L���B���!�*A��RV�LB�Bn�٪�}�	�!�&%�R:5v��$i᮪z�B��[�n����:t3��歃F���
����]�pF�L����/nMQBO�\/3@#����&�ݒ])Q5�O�h����!|��3_����_��<3w?�/)���WY/��[�v�O�v/�U7�,X�l�ز�0kh}�F��J���j�q��pAw��e{�Y���X^��#�5@���a��a�q����Y���'+�v�,aa� �/�u�;Blu�`�\Ru��Ր�)n�	l	
����zmf����`b�N��802R�3J�n��*�Vk��;46vh4ŨۥQ(4ʃ�W@�j�u�W��g�a+Z	y���H�"G*����"�������5��׭��&�Ț��
�Q�OK�*)�JH�9E�%@��JY�:U�o��2�J�*ۿ�k\���T)�==)JYf�Ddm����g’`�E'��
q���L
h�,�X�*r�g����'��r���ە������juz��TV:1���bM��%ͬ.6v�&�{u!�/c��@�ѥ1���:�T�oZ��@����T�fE�8I,W(�F�_2�0rb�ң�ZU�Lyh��۴���M��m��CJY�J�t��#��Y	js;��9�ݏ��}�٦����������<8�5�)H�kPs�&
���vr��U�f�.M��,�h�1������\��I���6/�u�:镈5�)n����X�q�Hn;w��{��Ij�ŋO��1ꦆ,'�Hd���q��lv���H�jD��~��4����;���T�J��E���q�s���e)��RϠzͮ'��Vm1Մ��A�H%O����p��l�3��8��I�$�H�#�EYVs�sݞu;uy�Ж��{n�o��mR�ͻ.��/`��d���Swq8�H�>��+�E�%f�����u�ƞ��Ό\ep뮚��LBZ .f�(�y���W�o�s�#$ۯ!<���Е�}�M��������y?\c>��ﺷ��u��H������n
0nX���C�Rb$�g9s���T*��i��@���Z�N��h��*�����w���!`pcS^q�U��us}�	��&���-�TД7�w�ZH�����tD�D�"s��P�Ֆl�/,v���H�;1����^�(O�G+��`�/u�r���2;k�q]�W�s�<:PK���U,�Iq{��/�S����R�,�K�Q=��_>��we�����3�_���y]ZVR�+���2m<�e䒗�/���{HwХ�*:��g̴�瞎K�$���̶�����UN�\f����҅D�2WT9Mr�%�y'6)p���G�/O1�A]L%-��rSTE)0tf�؛˒|tǎ���fѪ�㨇*�Ӭǣ����D�Nl�x��"MBw�ȡd~�Z�/I��ig�<�dM��t��I�[T@��[�_�2׉;P:��i?pL8r恅�e?΅.F)�P�˸��pR!z�y9R�?���
���;�\�%��l碒P��yn-Mч�²`���5%�͘��h�u����/(���{���zh�1k���4���i��
��Z��U?v[[t� �s���V;�w2�x�K�}拕��m^q�Mq7��ðL�� H���ìv���c�\�,Ha*C�nj�4���L��^��K)H��X�UT�$#�~w�Xh�R����77?16�y�d�}�{�dl94���˙��Z_T�eDkY�Ss�ĺ���/Y�����O������]_�0XU+j�O�4���E����jh���p�8*"��}D�`���w5��
=��2�U���6�=>���[r��̿��e?B��r�2�D���)�8�Ÿ�r��h���!R�
�Tti /�(�i۫�o���W�|�5�:���x�5�aA��#�;��d)�bߜ�斬9"�a�%	-Y�n߂[�iz���[3�L3O�@#=��7;0�wr+|�MGtnp뿃���fr���Lbk����΋�9u�����_y%��Ov~�μJ�A�����n!g߬�a4����w�lm��棵�^�g�N����V����q^AQ�24��)!p�;Ei���k7��W�+̡�m����Qu~��=��z��S$ڼa�&�SLg٘��N��_�@p��2�|�2�_�)1W��闚e�|���}`t�/E�.�͛X4��}9#h��e횓6jvs�u�;�����H����K�X�a�/�4���XӻH�
��Og��>���������汋���™Ć�GĂ�5ދ��D"�cSbФ\���a{�K.�e���Sez�n�����M��8ÿ��DE�-�8��װ�	��>Q
��E�\����&�8�9�Na��b�����m�gY,̘3T����a����MM�x������驾Rָ
�q�CnxY��v9S��n΢�L�N�|�s�?
=�xĪ
�g�\�΋��������������Py�&�w�{�O�o�e��9>�󈙹��x�b�u	T�]5�!�.����MU�`������罃�*�Ufc�pu�Tz�#j^*�f-k��#�u�v<���kI���9'��Y��2���&�=��?YKD<Ά��GqgpC�����J�!T��H��n0�r7uά/9��ђ8�тMhY�yv����s��f� K��Fv�s��~�!���Ld��~�Z4����xbF�-v#�i
�O�}��"6�݌N� v���c�� ��6~v�&s��*��y�2�X���-�sz.6:�ei2O���
�{����L�7�p4�>G���8��BLp�«��h����4D����N��)���!�i���\� N�LoY�a#�c^��wÓ\?$���f˚mg7C���R��~e�=���h������Yd� xA�o�D,���?�&$jNy�o�4|�ra<"b)��� 
D�Գ��Y�kq�l�f�djli�2�ݢ��Xxm�%r�ȩY3�m�F��+�)v�8
����3=��z�S+HL�HH�k��B�/����V~ґ����]�ҷ�U�t�{t��a�-c3�k�!:�ĸ/ Υ�y�Z�6��3�CM�,�B���L��˴�����ۅi)i�"��ZkT9�K}��l��e8ҡY�o��-�\|�1�d��g�v4��(���T�DQ�m�_�.jQ)[�]���!�c��and����	Ȥ���]e�9��K;n^�rN���p��͛�8��4�fE�u�/M���SLJ�[S�7��y��!*}"���L⛘_�LD�H��g��;�b�T����U��e�/_�H9:I�Cǖ��h����Ŵ�[�2}��"
�i�o�Jn/p6F$���^�����>�mb6�/M�a0a�,i$�<��cո ;�������.|���PϜr��t�,`��$�;��#��O��.����z��G�>p��-�aZwǔKx�(�S>8�ڮ��{^\&�x���%����j1}/��d�*�h�⡾Z����5�h[�r�O�|����y�qLK=�����Z�^�T����~���S���곎����+������- 	'O2?���롱�"囸������?�Șa;�ȸ�g"e�zo�	�n�(�]��kb6c{4���ި�H���8������Z|s���nFma1?���q�^7�v��d-ܰ�gn��=�-ިXtk�������Ѹ��
��m��ׄ�������"V�o�.4�k�/9q������]"�����f�L�TN�fꆉA�/����������i��q��p�~��}	��O����ul�E���Pɔ7j*���wq�1i�_�d��ΰ66mD~K
�@���`�������
$ϱ��+�0�	�ӯo/��)q��ڥ�9�:o�S���'&���Lyt���Dp�|3tˤk���[�z�p�[i	�eE��ܲ~�v�wN@��ˏ��@��H�{�给k�܎���N����Dl��
���	@^MeSM��~��U.۵x�����c~Ac{K���Z��wnv��H7䃸~���̽������g;��o�߲�CzB��?*y`|o�N��X
�?�d���;q�'���)�.-��� ��?��,
�}�l��$ۗ�t��e����_��H��/ĶUؗ���g{L��[řT�p!O���/�s9���<kηwƕ�c�Ux������Y�|�.���J�5<[u�퍛��X阳�zU�ٯ
�4�kK���W/�����6tN:�h]�f�4|��P�hj��"�niJ��K3���T�>�*���������
~b#:orᰀ�7�=w�K�]����9�����x/�O5�8�~q��ND�/�WEl�`#��8��Ȫ���%3I&�L�{�f&3ɔd�{�d�f����EX���X(
JE���6PA��
|bCł�o���f2��Z�?����s�=��sO?+c�D���n]n.3{K�0��w��B�[��ã�.q{�_�i�r1�Uq-V����3z}ּn=�f��^Uhoio?ph��,mLm!�.�u��p q:Jɢ�d�~��9���Ύa�xn�����ί�|!f�
(m�_��<�P+JO]߹�9+�5M�`���u��,�� e���pسr�9+�8�%z�ܨ�����@�K�:'��s�تsrz��<�֣��5�$��^���f���q*;Cl�%�g�i"I0q䵦7.�ط}d�
�G��*�Pt	���C�3��1Eo���5:A����[�e�?@Z�J8��s�Љ9ҨJ;�{�<Lv"7�؍<3�a�j'��X�LΙ�5��1 ��dK������9��k�*����d��rb�1y��W�5VW��T^/��d󦥜��<T��p����kШ6o�2w�W��K�K����Li�(�=5�fS"�u
Vb+.�y�66^�c+�Q�q���+ӯ>AF1M/��C�^�|w����i�<��F�	���jJS���j�Y`�_�F��,��*0�ɸ��k�F硘����+ƒ�Zbn4<�D�����]��~A��N����G�K�CbQ����
}c}$>q��;��@�UT�X��Q��Z�*�4�{z��k��OW�ޱ��4�睻iӹ<z
J�*D�B��;N�w����L�\z��C��k1��q-j-�5���#�J�w������?0�9�Q��o��_��g�TTS���8���U���|)t�/���~�f\�糢H��eCǍQ�?����R�^����
���}E��״e���8��ۛ��(�)����h���",Ї~Z8�'p,�d0nJ
mط��)�CB���)����'#�
UsC��?U�3��}�J��ܘX�;j���+��1-���nG�?ap4�-�(�޿�^�֎��$s�T�F�<�&C�������݇൳�sQ�&�'�{��� |���s?S���yv�L�]&���$	�ĕ=���v?���p�Oj�sv��x�W��o�|��~����~��a�/���~&�	���&/�����0�$��LM�
/#�噺�|��4���߃�a�Ȁs�pN.��U����!����3p�j
�i����kdG2Tt�(�]o�R�B���SL��� ��q��k�~{-�g����(��c	����9=8�߿�Ρ:��ީ�V���l)b#�G��5Pm�߱��_o�r���Z�¦�v���ۻb����{�(��#,
H&��4H��p���9sñ-_��o�t�+�?��ςۀ��
Pү��aL��6ʝc`0� �/!nN\|+B�K?��-�{/�7�y���_~����g�"lÂR��V7�;\:L�ޫ�l�3�Ėm�g��������xl�B���ݧb�g31}YxN��Z�#��^R�[�X�G���L��d$��۴13D)G���O]��8���_MFS�߾;��c�z�o�o�}qv�>��,3��P��c�B�5m@ȕа�� <�Dxn�R(k��M
l>��Rf�₦�ߖzzK�y�}:W��o�y�z�[�H\q��W��!����ܺu�%і��9A���b��S�Xi�F�U媱Z���P�\ �NFg�/-���M7n�J�ؼ�ċ���gP�s��I�^��ƍ�w
���Mեw��v��&ߗ��evw��D0�c��ǹD�\L��q[Ѧu��2~�Ro��
7󶠻�=����&8gs㜵��R��k����P�[??�p`����Gr�E��y.��4v�Y�3�,�\4mV�ɡ���V��t꩹O=���{c^}�0>=Z��K��c�bp�'��B0��ܪ�:+�!�����]�·S�3y�_'��VR�TZ�X4�{v�Br.��V�,�Y���]�TR@���s���K�M��7�?4ڻ�L./��b}\p����26V�V뚿%��>����Fm3�Xw��o��-@^W9��ϲ�8��(��ջ}�X.=8�}�V�{"�d�m�|}������:�T-�YF�P̆[g[�L��3��;r��6l��;ՙZR���A~{c��kBVBG��@y�m�o���`��ɶ-r��b{&�_g�?��;��{;�#��ԥS�'��ٜFb�	$g�e
}�Vy) ����]|�U7M-:t�I���ܖ١ہ�t�G�^t�'���@�oú�'z��M�Ɖ�9kא�	&���Gs���W�g��"��286��OC8݌]a5�G��wG���;�"}�LW�&���>�|>o�4t��M\]���6[�d�yΙl�ж-[�l?�i6��;���]�uad��]�S��b%_��U�&l��*�mM���ᭌ���7�̮gcR����g�)���It��SZdV���e�_ʈx龜4��A׎ߘ��O�Ϯ��or�i:��pc3[[QK���̸g
 ����6$v�}�&��,��9.ge.�%�����U�X�`��D�e�!��[��3 {�b>���=$�<v��M&,{����u"�?��
������_����h�=<޷m�����_`lgu�m��g�X���I���P�%��džG�خ�/^��	W�T_{�b8?�_�1��5�瘨����r�J�G���=4����׋"��l�k�^(��B!G�D�S�"�umL�lV�y�C�)��d(mG�Qj�Q�Z>�K��	ZQ�(�	!������Z�ʦc��e'����� e&�Z�����lJ����U�zd{����3�d�Ŷ3��Ħ���e���l>oMךfk;�X]Ke3d��ƿC���i0u�@�%�}�*��x���G��d���ӡ��m��^Py��Dt|��ѩ�Vǝ�x��㵲�_z��
;+��q\]�0x�],�x�W�l\��.��
ckjϲ��S��zD�U�~�5������aX�pj��f�X���9螓�'3�NEo�y#2�#�V'���?7F�5$���
Rcl�Mz&����q�fܓ�r���3�ɣ9,�L<G��v�9����
�=c�t�>�?�$�P�U�+ϭ�ؙ�daq���yB����?¸Nk����݊u_�	b��(��,�����&�p���=#�ur�>G$];��3�9�Aj��X�;�`e��PQ��j�Ed�z�M4r�|��l3W5ٴi�G��E[��w����0�
��@ P}�!.`���^6X����y��@Nn��ܕ!y�x����A��Ű^�|@O(1���Q�H���\��,�E��@;;K���zx��������uL��B�y�֨�V-��3�NV������OZ�.H2���-��I�2u��c�،k1D�H2��NV���Y6���
2A��+�f���L$�o���jH��0h$�A���_�l�'	�Q�(�'�ݔS\���ښ�}t�����_�l8��\ڎ�m!�1;T��I�?5{���ǎA�)�A�6�џz�,�����n��(���X�m�
(ۡ�.��QY���RD�1��[F6�~�	�Տ2�Q��=�X[�A:@�s�L|&��ͻ�ZBg�o���k���xpf�"���c'�.fxh�H0>���6"16�VL+U9��а���S$�6�U�K�
�?}�b�`�nSQU����uR�}����ϮW�K�.�V+��*�|��9Ro�k�2�6��V��j�v
1�R	!9"�h4떉�%E	�grZ��3Շ�,�s����2(��lR�L
��k���b��6�-j�>lQ*-���fS��������|ƐN�]�J�����`��b�%�h���>��W11�8�P^^蝾���ޒ��������]&�j(8<��o�Y!UYh�v�:�I��Gdubk�%ڷ}L�S�T�?)U�<�l���͠Dx��TT(��î��f.�r!H��q��i2�W����ͤ�S�#q6'�����1@�W���k�������/Ѽ}�%Ƅ��5҅�{�$���k��i��H���ĕ�E��S��ds�A�6E�sR�
.�O��>�W�vj��xe�Ā��dLn���j�ԭ�KC�ס�6�8:D����g��v���!�����m%URCj
r�LI8=F��!\��b[���:o���ƅ� o��QvŹ���؍Dx�aĒ����=eM���:t��JYGѷ{����0�L���P��E=�5�y;�q�v�v�~ΌK��k/��!C�ӏF��V(��'t�>��i��x-��V)_N�}�Nm��[�6ٿķ�:��[�p�tC�0�_7n��(Uj�{U����������ʸ4I��T�8rY+�r3���+ks)m^�T���G|A��oR�z���~_Kg�0�R��{?�
e!�L~^.�N�r�2��cԘZn���i4�;ť�H�Qw�۸�@��m6��Z�Y8�\��z�Z�=_id������7ήh����i�/dz��Y���ڥTP�p��S�ԆD����7
��x�vG�B�I�Є��^�.�/��^��;���r��VFB��h�^��]X._�^):�m�I/;d�ؗ]�#�9p=���f�g��u3f���9�Q�>4	�N���_Qefnv�b����n�F"��)��	�v�o�R�iow�(�렄��=.�@�{�]T�[i�����{��lziJy���%��%Z�&DM��;��iAx"�v<�_0�"߬_��f�z��S\����~'[!"��[��ؚ�'���Ep�����8�jvs,1�(�����T��+JR���S��W�a�τ&�|�CNä�����Prt�GB�:⏆]:`.�5��<�K�V%��.\a��~G�`L��pm�c������٤�LJk����4��_2�d�R�����a+�s��FD1��*���{%�]��^��DI%i��/-��oh%�Ӛߠ���R�����kn.6q=���O{�<P�pQ����ǞS�+)Uܦ6)/$z��v�[*��KCi�1�[�i��2%�
�#AE��Fj�ų�༉��1�`|h�T��E�E���D�����n�ƬsyBn0����f�W�JJ.=U�oq��Z`V��fQlN>�q�%��r����x�`��SΗgO�}�
6�r�6o�t:�<8pfp�N.ס<�ԃ��r���R��6Y�3B�q�G�eW�Z��Ɛ<�[���˶���BC����Uli�R�-TV�~R��n��
�>P
��nD�2;�}�"u�K�f��ڋ�5��S�o��|C��&m4e�ģt�x��poh��:�.�|�(��e����W����l�{wџ�(
aA75	ZK�r�c�/�w62��y�Ҽ�+��(/�5���J[�^f��'�}�i[�P%KԚ�ʱ˜B����n�u�}[Rgƫ��߆`�`t�����̕��^arx�5��efW�#I8V�3x�uľ/���⡸h���t`EzJ�7�O��1e@+U��Tr�|,�d}ݹ̚�jQ�����,W�\��u���:���X~�*B3�e�$vN"�0�\��JtL�W�.�65)�BH���Ж2M}4\t�ijI��G����֖�ba����;�P/�F�>��_�<8��k,iؘٕ�(���h<��➲+6�R{6G�{��}��:�aF�i��uJyE��l*��|�x31����R�_Z
��O,������s��}Y���P^J%��Ƹ��_�;��4�<}�w�q�'���B#��KvN���s��,���{r.sJ	�w�a.fs���sɊ�1֊^5 ”����F�ڥT�)���Y=}��sD��=WT��T�1v�o�Kf��_�/����WD"I�3U8\�.+�XJ3��ש3�Y\~�߃�ݱ�4���XV��cM�A�y�sǎ�IJ��G$!~N+"R>6��W�kW�R��T)�]x�}� �z��	Ō������Kv^�F�F���d2E���2�x�0}|�v��\HF��sB��>�8����|��������Y���C8Ǵ�񩃲�C~��0֒�:�*�T�
���D�qQZ���
*�ZjͤIs_��Nk1;@ZÃS}��32Q3,�f�
�:�Z+���l��N�T٭W7���%�7Se�\92�m�q]J�W+o7*S��� e����[�U�/�� v��"�v��A��ܪ�=]�> }�N&0��QY9Sj�������b�?=�-;2�V�J���:3_��qE͡d����E��A��U���r�k$�;�m�S�1�b��!N����P�<L22��U�e+���I.�=��1(�=}!���p�4,�|
��o#b*1�U%x�s7�����]�u��Y�n�1�*xcL[�;�2�b�(?���O�%%�Г�Z���}�\��3��S6e]�!��k���4�-��|_�2����M�)rnGN������W��gN�B� ���oH4Z����N��d< �Lj b��q�cO�y�,^�Σ��\�yL=�H̅��$p�\iH)T"�ܯ�����Ώ;�<#ֺ����&���1���#an�5�~�\oA_B����e_)��C�~��s�5%SO_��cOk��E�6j�R�Z�O��
g˔�B��_����V�Vi�H���P�N%���27�KGY:l�t��2�V�;�08>��VG��&�Ė�_{
�r4��5>�1����k�R!���ꉉ�c���>A���w�4U����5��X{Ζ�G��'�A��"���w�1�(j���d���� �W���G)y�K�6��ۅ�����+�2��[D%�v�)og�lN����>,G�͎�Fjn���Ũ��5{�?�l�J(n3g�C��#bE�cC��Q��c�E
�CA���7�f��;v6�SԉCL|��a:��P�"q����͋GI�a%0�0`7`�%yE
�XlԮ��|��plĮJ���1cvuǭ���~)f��(9I��5����Jt*����Lb���MMg�_�6��l.��g��H��d�$X�A�;�uB����M�9�O��W)0�u��������Y��B�(�C��nx�j��G�J���t���A�N���/�ɹ��z��خ��~�N�L��˽��p1����V5���9 ~ܬ��:)�t>ѫ�:�
�ĝH�s�\�,�}��ӷ�k;�@�d&wc�|���0�f����@"<���c�J�a���>�S*�
ɟ�v�=��HSc�����p/�G�K�ql�p-��N��;����ȉ�1m��Z4J��}�Xb�\�gm
�����'�9��ymQ�Bm��N~?�7ذː}A���W-�/�|:WVƯ�%g&�3q�'y1�)38��ŗ���r)��Y����d�v^B�H����$c��+�8�"�b���}������e�i��,շ]��Ԡ�n����I+zcd4,�{�X~�	&��H+\�j��)@�g�UsUM�A��n`L�}5�s�
Qq\�v8w�h�H�b�J�ip_�x(n�*��+΢��x%~�'(�I�݋��V��c�ƨ�������q�U��,	�"�t�������t�kz��yȎ�,���b1rs�\˧9FsEØ<��(Ύ\ٷ��B��K="Ot��T{���f4���%��)?�<g6��o�Mq$��I�x�Q�o��C`���o������+�2��HpgP�v�ک����Aw ��
|>���u-�OV�JT�Z�ҭLj�֍�6m��N�GBz�K�綎���hb!j���l:>jC��Ts�(Wy��Mխ�jl읛�"����Hwb����Vj��°�0��5�sv��+ux��\4�Α1�B�G�Z�(�"�F����!H��ˆ�_i�i�*5�Ժ��i��j�HVy1��ﲬ�&�Br=�,�3>K�
���{��|_��B�m�_�-&��"u_��k��%@��Z��.�3d��
{$6ҭ!�Gl����y��s��sڕ�� �UPP{�*�K��BZoI�$�y�
���uX��Ŷv���$-�"�_�VQ�6�C�{���	s0k�~݌�6��s�u{}f�u+��Cp��X�_D{^��=@)[GL���B�����;GH��4�=���ɰ��G�~�[�ciV�ſ�EB����&�^fk4��{M�'�GV�讗r�5�t�����E+C^uv�׽�I��?i�
�B�A�3�b��w���`R>�9�6j
�<�� �s޶ubn=������#'�SZ"`��`�De�h,79=V"[u����혗C^�T.�<
��������f��ЛA?�?Cef��T�"w�g�a�g�.�<�~���=�*���g���/�;�8�%�j��(���<4�K���۬+�S�PH@�����#�€"��G�ϡ���J����i^yr���=e�d�L
���ٕ=J�	�������:�k�䭁��b��Y��7�)�H(4�V�7�`S���F�z� �QI������~��+b[�Y��.�u�~���������=������W#�,��!s�rF�����4{}��)s��^�sj����ٲ��!�^og�?���9��}p����9Od��ϸ2v?�=N����}d�3���~P�COA7<:���@����Rb��W�;�m�3����I���~��7:B-����T�S,\=�b?�|
w*���+j�˛�Z�F%@3$Rv�x�yW��C#<�s�!<sQ�l��1�N��=մ䍚]lW%l"d.�¬�H��to"��5��VcG�/�ez}9��V��ƔV�S�K��z�B�ޑmu��hU�Olմw�T�J4d/W���.5�S�j���b��'��
�Ldr�LA[���,��RBi̝�S�n��u�l�	�T��|
N"�&̄:v��#:�,QwO#����X�&�H��k���9����1�)��㿡*��$�����~����Ip8瀟-�>��Pi��Ʉ<M��B8<�J/D��h!�r�R�px!���+�d��L�n��������bs� a�O���'x��H�����sz�</�Q_kڹשכ��`0��&�L��B�]f}T��I�:ɍ�����Qȍ��,PG�=���k�x�C�|���R�1$�Zn��JeX4�Ν�G�]6�u����������&��
�#�t�PR��]S��n��48�|�q�M8^���a�bVt�5�Q+�:.�����\:��N�Ҋ��K�5� .R�)������2`3�ĸ@џ�8$=��LW4�Bú&�N�iZs��e6��L^!
ކx�Q�a�J�Pu����7Y���q9��#xl�}��c%w������F~9���7��0��~7��&��Ѧ7m�+�.�:��džR~�]-蔊�H%�I%�N�RHD��h��e�v��&��ļ��	+�ӎ�餽f������l]�P���4�I��Tim�5�^��
S�ځ�d��oOP\��ʀ�0�:��U�����/�qup�<�X�
wJ�k]�I�5�(��+�{|����1��p�^�n���hZym*Q([
q;�$�T��z� ��U�3R|C^uL*��z�M�&^Yomk%�".���$\d��Y[�SV�V)'Hp�A\Y�1v�����VIp�g6������S�(5�TD�y]�+5�����>sS����³15%6��R�x*�S:����3�����^s�Qx]J�w=�}�g�	��"�i���>[	}��{Ma��TQ;�,W�':!<��H���*�Ɔ�k�
�9����|9ϧگ�@��D�{q�h����xr��J~��'l;S��3�����1�3�2_����Aɿ�/9k����{�f��luye�vںm֬Þ��8��[gD-�9;!�u�
�g�A�aRb���V��*����ސn��&�;����|da�S�?bu��X��1<�j׫�Y����?Xu=��c[��gP����PX1�3єϻ�gnӛ��z*�8�2�[BB��p��;#N��׵L(�
�K�1v\��iM��ؘ'���ȂF����j����B�����Z��H�E���-o���ӓҤ.9My���(�r��2-���L����L艮^C��(�<�o��r=�S���6cq�N����x�m������i&h��B����\�V�C�i��Aq;gUܛq��qb(�q$e��T������e���J�9վ���+�~μ�T/#�-@��8��q���ۏ�o�x@�+�~�Y=ON��~}�ι���`����+
���[�7	鿃2(ǣ1���![�?�q{a��
��Zm����ő6	�is���L��[p<���y'�PM.lܲ��t:~�H6��/�n��ަ,x��NA�\����Zy-�dj����:�B�r�~��]��'�ԡ����:wt�u։���[��>��0h/����\��������Z�{FB�P�Z��釈%0N�B;q9}%��q��p�����8��7#�f�)�Nh���Ɔ� �����Cj�Q�2�I�J�L���?dR��XJ�B�T(�4j�Q�14���J�T�Ůժ�X�%Y��>đm���3�������b7�~GL.�[B��5.���nm����!u�� tV��풺�u���
�:�ZO.���E�ѡU;�Vk/-L��Qb����Ö�zPU=3S����"��	�!���"�S<3Q�#���h;
�s��|���rx
��|�d�~0eR�7jW�>�f���"Q
U��g�ǘ|�N�����Q�>5G�FȺ#Q���!f��_b���Q�UV�3vG!�W��cHVY.Z�Y�/`vH��Ɇ�}�mp�UZ�B-Q8-�B�Rȴ*��Ik�(�a�tJ��l�(%
�L!Q�m&�N���f1\���n����6~��ɵ�y$SV���8��oP]�TK��EE�����*%�iv&��
|������ԃ�3�p>sO$^�ԟL� ��_�
����_w�o!��C��o��@��W2���Y�F*S�$���%*�J�QcQ
�9�'{�wH��(����<3\訮���P R)�M�o���<�ˆ��N��p3R)���Nl���0�Oq��z}��jߎ��?D@2���5\s�_���׼��痱�mg8
��[O�Ϯڈ����'T'�9�V��|�*Ӊ[@��T��\�7�Yą7�j��q�m� ښ�ngs�V����H�ڪ���~���o�8�#��,�
�p�ch,�
|�}e��x�E��c����X�
������j2c���#0�c��~�I�f''Z�aWb�L��XfI�4d���8��v���spW���R�=c� F�
�u�)5c�-��iJ#-G{bɣ�>����fw�P4W
&��b�x+*;��=�݃BB8������R��.�MېdxBj!=O��[`�����L�￀kq�C�ڮ���\�4�,��U���p�]v�q���yێ^;g��
��]\���&�8�$=�WJ`�C���~Cf�Am�u����=�����Թ�2��۶�u��y��$�A�@�%�(�<<��~
�&Wjyޤ�ɷ
c�0�M��f�-T\�fG����3�
}_ꍺ_>�w׶3߹��h��C��.�/�U�
_j}�?�� ��Z��p�L��g%	�5�RH�%�n|�^ztq��.8wn��K�c�����B�Jt����.ۻtX��:�e����Fx�|�|��Ϧ�P�Z����O�.<����U����&�����i���3��9�ɐ���o��^:�8:��$_���Ɉx5@��;����؋�"��<���$�����.:�����.s����xh�_��t������
���ŋ�R�Ԁ��|4���c��
�Q�U �ڻ�֕��J뚺��3�hUQ���4ZS�aT�����n\�.�t����(��)V�e�}��8�i��y\��W|�Dtm4U�(Z��\nQ���<����9��sb��s����l����N(�C��u�7�ۯq<xk�QqK�g�i��q��g{�pv�@n���E�}������ʘ��~?�ۃ��w��P�V?�q�,��XW9��w �#\p�7>>�ώc��ת_g��)�jzە���C�ш��H�C
�̧���!_U���0�N�	�Bj��^�����9��x���j�|�Y-�̎��h;�f.ߠ���.?��_#gpP�������J�K
\ �)�.�L�0 0�R}�O%�M�=E��$}�G�����Ďg��06�G!��?pZ@����j�W �LCՋ9�s�#�_%q��!`�L1f_;<�n9ꕔ$�}ڹ6mk[��k6�b����tnAGG���+(6=�K��y�0�A-��a�����g2{M�m�Z۹�u'�r��n�\
�S��)�����!p�T��Ij�q˖�`�I��	+��+2r�U��Bh˥,�r��Q� �� �������W�����3��S�J��E�ra	���*�������ht%��?$��j1�
e��-��X�8�Z�t��C��u�}�a4X�N��y ���n�$b�x��13)�!�)�W㗂�~���pN�g�F<�jO�
�$����ACgء-!44���f�Fa7Y�++�����#��'�F�^FS��u�/]��WDԴ�U�)V}�8x�����ИL��h��>�*����4��[��̾_��֡�L�e'v
}j��m�_ӗH�p�<AZuZ���y�s�}ÛcMO3h5v�(4#�t�+v|f����{�����2'��],	�nc�vm����I�]z�Ϡ�:<m���/�-h�A��4982m��
�N})��+s�6�C��u&c*ynd!�t��V�SM)
d��HhBY�.0�7D,��͕VZ�V]8a�g�=U�-�%�v��~:����ο�X�o�bU8�p�YK���q������F�b^{�Bļ�{��)]~��V���$�{���_���1�9�P�Qk��S�2�����-D
oE��^�L��>Ŕ�C�=�ڧ֙�iw��SҘ��F���,p�(�G�y��jz�:mz�-J�y{�dzk�����8�T7H�����I3����߼8Ż�K�b�]�	���4�qz�ږ�HǬ/Ą��k�3 i|������}���%}T.���mҖ.�k��{�T�A��G���h0��j���������LIE'e��8ә��N��L��2���J�������/�X��ͫU����hz2�Nm�5�����■I�o+�s=�~oЛ,\�W6S~���p�!e�|���6B���$���{S�ި�O)��Z�����ܔNvE�:֭$��w���o�Veu8�D#
��
����F\y��G��^nk*�#�ڐ�)�\"]��N�Lf��#�j���Ȓ�ז�J���g��t�ʐw�52u�����
f�PjS���&�Z|����/6{�ހ9��o�s�ex&G89��ς�CnթL5��!\_�v�5���Idy��V���p���{�6v��ÒW����U�V�O
���xڧV�.�u�X/�X���9.�����ձ?+eR�V�
�i�h�#�.�j���/���߀e�ze�pQ�<�߸^U)��g1�8��gO�8��Ћ
ܵ�}�͋[�c=�Ųr������]�AM�r��~8Mܝ�j�3�+��~+�0��tٿ�Wlڷ:^����D'�	�Z
Q�e��wt�pS�/�^}"�ݏ>��Ӹ֨��-����Ptx��B<�ּ�aT���M#�Ȩpk�
ip�
b��潞�X��m�Bs��(������M6��gclFJ����䲘�?��Џc��Kĭ�irYh������F��Z!�D��Ɓ:,H��t;�#<xm�����v���ɶf��%T�}�moUj:��Oi�?.����Q3��u��ᨙ��~��E����@}Ty�m����{?�+l�F���a�x�>�bF��{C]xs�^<c��
\L�A��}�|&�2�͛C�1�j2�_
�b��9�BWf�C�®���$3��fp1��o�3u��^��kO9�a�;=��e�ɦĹ�ɑ
Ļ
��B5�t�/��{�O%C�⡌bKʦ~�\��$�%�t��#��eGzJ���.��L����b�[W�]���?�>ǽh�����=��Y���p�����h6|�/ʞ=�0�4y���K{m}�O\8v~Q,*vH�w�0B�т�yl�`(����.��+]�e�P�9 ��e��ҋ�,�г��v����	A��g�r}��oJ$n����s[ ��>vٯ��)��w�,1{
	�72v'�W��~���O�b�
�����ӁkW�W� e�b����8�\��;z=��b�黎���I��:��3�c{ڬ%��f�Z��CN�pD$^�uD
�M�`oө�<�#�^AѲ�Њ��k�nt�I�zd�����Z�}0�!�oӷ�J��.�|��(�h����6���{����#,=��<�z�0FXT�S6='5�>���7�q�?�L-��C��9<�v۷1
��C� 1�u���%o�+Jـ��xW�:퉏0}��lS���=D�2������7����
|�[�Od��eB�r��V7\�azV3�H�yz� A��&@�l�0~�LQ��[Uлpo��n��Zey<!�*3�?��?s���鑑���Q^���y�M�_,�]�~����Z����Q6ԩ[�V~�+�,����)�5���(�����k�YZ�#�(��9�qs�D�hb���CP�%�Ѣw�.h��5�����ۇ�~ty_�ș}�u�O��
��36O%��
ϣY�WҞ��m�>���UW���oow��>�P�렻�Q�_%9b� �;�5�0�L�h&����1Ƽf�.�[1e�G�3&�Y��ܑk,	[�ys֖W��r��J��!�O����#����ٟ���Z���g��x�~���)26�ƏT�J��(ʫ������8X��nmx�͸��tl=l!&�"��P��C���S��}��[t�%�)�G����w���?�Z/��0�y6
�ʟ?�5�X4ٿ�e�m[�/��Jq��{I�.ރk�ր��5!��n1��y�/��ӟ8{Kfs2�Z�B�Xh�X>���Y�|�(W���d�D�����uu��>LF�]]�h�r��s�5�̴�(�/{�E����	�
��2����D7�@��d�0��
����S�#�n���ݻ�����J��dET͢���[]��sק�}�����%�'�Q?�W ��E(z�MEi���[~�~MP�c筳�Wlͅr:���孌��W����<� nS��(w��57m�bv��r!ו�-m����^G��}��ڲL�F ��"����}}o�t#���5?P�
�B���;�����'�=`��b��/��82?����&�a������B�-n�?f.�g�ۄ���|æ���
��f�:F�s��_��8_յ`�5�k�h��"|.��6�60w���kU�R)*�_�~_G�j]d㦹�s�Y�D��H$��4����qT�$*�U8�v�V�r4�
��܅������}�����=ý3{Dzh~ʩ��f��Z~�l�.�ѓ��Yu}�ɹ]-B��$�v�}r�o�cA�(����o�g�,�|��>�g���I�jR�ȫ�����d�o�N�L�J�W	�0���I���hm-3p�7ݳZQ(.>�ǦQ�r�t��iR��6JC���/�����&�(��SF��i�/�9>U�V�ſ��s��f�H-�q���ㄢ���Ri�D8"Ty�!O�(��	a~�8�k����O�!#k�!|}���lo*i�h��u�M[�G*�]��	�Ѻ�mi4�Ϟ��DCq��G�]?���j����B8�o!B=	V�~�7������	{�H�i�[ŲP�-6a[۹&����{Fb��)�و��T��D�@��㖈g4�7�x���y�S���l>�|�9�Q9F�5�]��4�	�ȶ�&��x.�����\���:�>;}_
��~�ܪ��_���t��Z��C1��a�G��i��櫨{)�QOVԂ��vm����⚻b���`kh]�曓��z�?��A�����L=u#[��TjF%M��s7�:;[�]	�^�i��;�"IH��g�͔�x-�����x(��?�s��@��!�z�M���釢=J����d�z�?r�G��X�R���a�S�	9�,��̳%�u4�?_̼R�s���G>nÀ�_����2���r1��k��a��5�F˖4{z��tM|��.O,=��
�rij��-�Br}�t7��k�Y�1�=2�s:�7�1�-�Wp_x,��t)����:2=oˋ���oy��O�T�v�&��w�X��p���<��/�z��u�ݏ�w����>5J��g{��Ggl�Sz���������܋�c�����?
H���o�'�:t%�����e�!]��pQ3h��:�}�g�K:�2k�X[ҹ���c>��֭;�m���C�Mrj8�Ź��6�\��4��=p�C�{U@�&��9٣aOD}��x��v0��w�c{�8_���CY�n���D�
����#��/Ѥq���l���:�����(8���tZ�*<�?����)����<
�9�������3���%��<�N�w�_��z�E�%"h��$�����u�)��O�-�6��@P��I��g%�e�:ݾ�h&q����‡h��J�&H�E�m�=�s���{���$��q�b\��P�k!���$�ז`=�{c����Qњx��1�
Ն��^ܳcώ�{����rι�7�s����ű�u����]�a��O*��j�p���jh���,i8HY����L*��$�@i��]�iW$�F���+�ّ��?�"�ڞێ�թ��G&�c�h�@�כO�t���/�{}w9������@�|�Qf��ʓ�)���i�҇z��H�x�+���?�t��Ჰ�= �M�f`e�����~#�+���g�� :�[��Mϧ2�l2�ֳ0SR��h22ԋ��I���E��h�_�Pc�$���uͷ����e6}^���O���]Sm�Md;��x.J�2��Vӿ�����<��OML&�h@3��� �qԘ{�B��I���z.��T�ȎO�m&uH&���|Ȭ���m��O}j�/��ġ�l���%L:���Ӣ1�@F�evLȶ搭6��}sZpw��'�nf̠\De��'
T�$��1
�m��¤�c��8Ϗ�1���7ኇW�����h��5�@~x$��V_'��2��#;#��ם�~=111����!�$�
ޠ�j=�D[:_H���eJB
ǶsB���k�4����c���[Rv�*$��1������d*U!�:��si��f���}�G�652��#�No������!S�3���8��n�7������hn(���3\�4@:8�##yg���ݙܜp�R~q���&�@�L��N�/�3d�;�>�}sxӪ���	ӗ���L/�o9	�[��{5͙q� ͥ8�����pXԨ�D��{ 1��bKeq���78���}<��m������p�
p�@��6
&|.���ũb���d����N�3�D,O��̏�
�~�u����p-x�p$2��
Y�[Rc�T�7�MQ;
�N:*}>��2���Tr�W7󂟹�:�����sXL-d�E���]��>��2�Ǵ�7Q�ܷ�ZS-��޸L��B�6���ݒ�������,}@)w��yՔ;�St�dq���B���Nc�������s)�fEϚ��S�4�e��
F��ayb��'�E!b9�)��Ae��Ss�3#C�\��;�j�IrX��8�On�=���RA�TJl�����e"�X(�DLL#��Sp���;�+~�-�U���{Ս�s��X��M���[�\��
����
an8w#�����s
��Z���t:Q{}g��J
�1e���XNt��X���
v%�z<JeL���!m� |=��Յ�5��2Hp�8R-��v�j8�M��HQʘ��n"�$)��P:�Ndi����6�_��f+�����<�a0
���86:33�>ɞ�d*�[Yw�*vP]f��s�SKE�K,vk"�b�P,�˃Ss��-~?�u����cjo�1p�؊�q�v��scәp<�L[���y|����lX�80=>5���ap���PAh���x7ę�[+L���)�}C��r�-:"B(-&�-�0l�y�;�����)����_~���?�+��=HJ�ψ�I����\uXc����H[M��L(D��n��-���u�������2}"'i<׼�K�Gz��x�y_+!�2u�R�)Z�n�ȼ��PW�Nl[ip>Q��c%���8?��7&{2�u~�|%���ŜW)�c��yN8��v³��!�~ޝN�%�N�����W�������
���$�H?Q[��n�e�G�l8'/�$Si�$)�U2� ��	i��3,y�~��/�µb�ϱB�h��e|�*��vq�P-�X�1�Z�$o봫L�l4���Cze�jQ���Ѥ0{��d�m*���.�m�.�N\���)�ۀd�T�����;
Ξ��-��ə=���X��[]~#�TSΫ�"YM:��Hn:�������;|�E�v�j9g��.H'����:��G�C���-�f2�LR��m��}�8yd6�gk�|�^p�Νd������k4#�۱��xi>��쪄'�iWJ��VH%Ğ>g0�	�ʥ���Y�RkZ]�2�@�ShbQe8�w����D��QT$:?�|X�Q`_x�-�f�d�(��Ǒ�/͏'�֯MtE��S�ӯ��;]�i��G���Ӽ+�+7Od���>��W;��	��n�Lh6�>=@���?�j�]"jo�u4q�Y�O�rEK'�'��$�����(M��J����|�����?�o����;s�Y�m��Zly�%Y�}w'��8;	��!,
���

4��M�J�Fi	e�+e+ek!�G[裁B,}3sGWW�����l�gΝ9s��Y枙	B�����H�(�L!�Z,�'��ud�
��ڲz0�R���q��$y��GdL�9�BE���P �i��UR��}aX�T�0�h���^HކZ}��K�V/����G�z�;�<�nUƴ#�
T`3����s��3�I7hB�#�O3�Nυ�-��P������F��g�pf Ι/Lr傎�E�]u~��Ȇ��� �`|�����:����]]\�p�>*�(ؘ�m�U�?=�Fm\�˶1���l:�l�'O�ۡ�����ĩ=��p�����9АI�<�X�1L�n�:����8i��^[�]G�5�w�2��z����[	{�m��>�w�'a5��삦֞D2\k�u!Fs�X#��)�ARa��k[njRM��@��K"⚠R>Y���5�p����b�X�}ˮ��h���ʃ�*�]�<��n�~��no����ʫ�z~��ڳ7q{q�������D���,��k5K�X��P2�'e)2��B�i,<�ݱ���W~����+]��ⅬS)n�,�T��O����WL��m>g�Md��?��ep����	����k�v�Aύ;�gk���#�OO/_�i��2C�|fFZ(��M1K�uU�ıq�B�-�7�z�g	Y�?⽬��_O"��`j�R���Q|����&W�!XOmOk�V�7 &�����oV�BȪ*ү�VD�M��quՒ��K�.n��zڥ�u���#�-ھ�Z5U
�os�Vl�X�UM�]({�ÂB0�^<�
BO-�J!�GD;�G��,��@��J���荑�5KV�1iD5�p���U�I�Fı2��7�+i?�
�+6���xc��߈��ק$6C]C��ā�~i���D�[I��d�&�
#�����mZ�0��J-,��Z��nM]�	 �-U��9�R2�u�b<�"���>x�Uא�S%D�@��H�~]C�x�R�1���Jd�(�PD�2Ej�O.�,�+�*
E��re��"���?Yjc�qVT1^�"���Anwy�\��	[_ ╄B��Uk�>��#��%R�0��g�KE�P�T����U�$�j�.3�2�+=��2�Y�%dg�[u�粪�&c}����0#�J���S�������iQg�Ԉ\v�n�F5���{uN�N\l�״�KB]ZuO��S�Z��MyEk��72F�<	�q��ѝ��X5��|�����zC")K�%*

{����8�'�JVU�++,���}��,��2��]?��H�u�*��SZ@l����������.�+�!H���7�Z9mO����yW��(C�a[�3h�x
��5��;]
��0E�wq���3���r�^�!�t��*�[��m���K�ʞ=�����=��
�ظg�����!y �]�v����z�ʊ��.;p��k�^�Z�u]�؀||فH.��k�;����������^K�GȔ��o!9[.�cF�����
�V����h3�@ڻqͯᄎ`�� ASۭ�U�G�h�:��<I�㢁��K�FW�[�zW�{)�kq�sp�SiP�g�EX�2������J�S*
' ��{�K�o͚%���?��D,L:��y�mC��H7iAh~��Ĭ��bɳ�7����H��H�#d�l�Z�.Yo�cC�߶��Wz`�rl���?TG���ި�F57r�#ٯ���(_6�E���ܱ�̩s���kz�x�w}�#����{R9��Ƚ�z�>�Vp?59�6m\��řN(_4�GQW+>o�s'�tK�G����+J��vB�9;{\F���[�H�
�.Hlظ`j��M��(�YW\o\�QW�E.�ٴ��w)���U�����6��e=/�=]uS�޾xWWs��$\H�bU*7�i.����§>�H�uHK���\:P�䮢VQ]z�'��"�+j�|r逡64���ij��sFDlOE���[=X+��o��aٽ3�F׭A������S�ł%�f�^��׼��`���>uC�����)���}/��u������	��;8���缽u��� Z����5�>������O�7�c���A��9>S�l >�O`c�]��|:B���X�J�W�J��؃(�b@�9��*r���eNw�g�*��	�4��{c��ܳ�s���O�F
4����m!�t�g�.ݶ�ܝ��hlܩ�^H�{�
Y�}�"��\�І7�5�8�l^�lVE�������*��_�~���r��7�wM���v�#�a��/g��5��9:�nuc_\,|2�F�K�3|b=i�-�uG�&ea�W0�9ӹVlL�>���ğ�MG$�e�r�e>�-�j��=AB\�<w9��V�5w���˭�o5c�RM�rW���n�$vP�S���x����&>)�N����I2��JBM;���%~)t���W�lB�(Y�E�C�4p�JӇ�q�P3�˼r=����Y�#�>��“�	R��>����z�]�
ԗ�t�Stu�D�P�C�!���/I��J�N=Gg�ٝA"^z���J����T��m�J2G���m���N���1�{*E�����@�3���N���Y�H+$R�������;e�"V$*�JwN;�bf�a�r��;jC�����9Ԃ�F����6=΅7ܴ��O�;x�������W�H�'�����qwO�J�Q�g�p^!_i�78�y��m��5�C��U5�mЅ��ڔ=�^?57��9�����U���j�g���E�-k��
���U�5�!�Yi��=���F�
ǟmh
�
/��a���v��Ӊ�f<v	�-����(��S}?!{1b60N���o@qX����zLj�FD��"�}s�awb�a�K(I�qQ�?� r6jY�h��	����FR�ɼ}��Q��y�eݾ��ާ-�Kmj��dV[�����O��őBW%o�G�����mo,%~+�J��p�����K;p�U�L&JX�{�C{�7�v��%����Ҽ+j�5h���_:yQ^P��m��|k)��r[�hp!bT�$tcQ��d߿>{t�{��]�\�Ί��e
.Wwվ�=u��,h��pQʞ��.�D��p׀N�S�
�����}�:.߶���Q���C��2���?s��1�
�6��{k_C����Pg��h��U�Z���Ui��WY�5S}�>�Z�S���/8���e�<EY�o�"�|x�˻:�4�"�!M�ɇ��mENw��������N8���7�K�� ���콩֨�vO$�M�A4Ȍ �4�P���~�ɒ��R�á3�����"��Y�6��n}.�������.�kמ�(��5-��m��;zU��t;������Q[��j�nn#�u|�G5׭�P��W�Sv�8�
d�!�ğ���s��c}���0Ʒ}%�ǩ�E�{74q7��bJ��o�*��Y*��G&B�P��V&�?�ny�6q{�\�r�]����<4�rW�+���˷�Ōi9~He���ۯ��=�.�\/���2$/���$e욣�)3���>2���a:w��B��7,Z�_���C��MO�x��:��s<4W 3�5ݿ_�,]�c�QiTA͆��=�є����1�4$)��Т�V�
�<tZP}N��"]�1��i���T����֚b��L�Ai��y����T)��+B:K��c����ʀ�ħ�+�E�R��e�؟t&�A�Х�)>���h�ǍR�1O��!,���1��e�As{Eݒ�ޥz��(�N���αxu��6\?.0(N����#]��j
p7+\>u�b5�����Xv�O�8�}L�KN]����-qT�
�����uU���Q{Ȭ��
���#ee^o ��*P�Kj�
�J���Hr�9Eރ�����9ͯO�777��<�ňe���.q�MmK\*
��~���|�����&��x2c�ER�2�u�zkuu}8\��k�M�e�����������
�J�2p����ׯ�Ly�H�np��Ս4��׃��d�k��Gp
>J�">����d�o|+��X�z��,\�x�H�G����Dܠ9�qDKq:G#5�n�T5X�J���̑��>��Y�J���Dj�QJ���'�ѻ�Q��)����@��\-�k���X5z��o�m��m)[*w:�K6�K2޸��LQ>/�;I��t�cȹ]��Ũ�}�pY�
I��kL*c!�33b�?~�+:O�7�
�R���^���	�~;�+l̑����kL�˵�F�y����pcja`��.�ψ�v؇�z�X�px���cb����$�qk�ň?|nz��;8i%�q(E���!C�W�'x��"U�b�‘'�,��l�ܠ8GV'�ג/w�%���ɓ���Q*y�-��i���Ԝ��SIl���|\��X��Ԥ=j#�s��i��KTm�N��D3�^n��CcP�b�lE�`R��su�R��6�dǁ:�L/V�=5��zR����s�A�`�W�)յ�y}`⏊������:���`k{�@F�TaX�d�i�ʐ��[|�9u��:?NL�I�C:���j�q���j�y	�WW�Z������:�'3G���N^|r���#ґ���q"���ڦ�xcmc�9p=M!H�<"i���L�ڭJ��1�����'�?ǩ��=��`[�!���
���:]SI��D�u&�>l�����yU�"u�D�`�8�&�E��JyY�¯3j�~*7�O�]1-λzB��������y����9)Il���� �;v-ɽs
�K3��xX�S���Qd*�q�xq��Znn7�C~��� �2�p:��&����Rҧ�V:�H�C�4��(�[�L�G����e�"	9����8�A�w/��������y��[\G��Lϔǵ�VG�άv�6�=	��=m�PYaO�����rHY������`��o�JsN�v0����۰0�7D���/�4\�~�>g�I~?7�u�u��c�2~U�i�����*�7��23�h���g�Ǐ5TT�/v�P���g��}6�s��
4_����FH�� 9�`B���K�1�0%����O�8<'��ϸ}�ׂ5�@�g�Ӹ){(1O�s�1��@'V!"�/��W���!���v��W��Ժd9�H�c���2�Z\i��>�.�nlU*��"��T�FF꯮*5��F�
m����Z�h�DmX�w�0�^ROخ	���G}�zC������w�o�j�
����m\!�.P�*#�*�.Z�摂ѐ�$��\^�+��v�����?�QUM�re��T����}�~�.K��`���8Oc��<�zP���?N��=9�[*�^���4:�eJfQ��⪐�jբ�c���?�Q�^T��,r�;S�N'j秂v�{�qv9\\�;�Z|�7j��U�JUk/�
���*q��En�c�G� }�L2��$_���E��G�n-
G�H�jCK,��f2�Er�*b6�?���B!IDry�B,�[E%*�L"(r�X$�F'��*�Q�&�-�)ӫ��ڍ@�_���Xs[��5Y'�����z���{v�f�?¾A1��k�������:��7��r��7Fn��j��k��`k'��"����F��C�ߦ�Q�M\�փ����Z�.dބ��K�Î��׻�^�~�¡ֶv�'�;��������Z����{.�1�8��G�>�{/ڠR�me�*J���];_�k�����d�K凇�������#x!f?�#��=r�0��;)	|5�z�p׺�S�J���{dA;w~�r8
�į-��,c1�������Mӏ�-y|��l�������Z�*��J'/��*TǭМlb�d�X�OȣGx$NVY��mU<
�Kᑰ�Q$�V�K���䌦�$m���TR֑H�"�dҐt2�o��Dȍ�0u�D�M?���suK���
�&�àT7T{�A��BպU���z�U�חUƍ%�=��.c�e�H��g���s8u��>5��.��ᴄ[�#�f��鰆��k�-�%��e�����p��m���k����7"Ϳ����>�0��<����c���ȺW���u��X��e��H�"�!\����rVquQ�ۇh�J�_U>x�g������
���ۃ�wι�|��BN�„��s#����O���$�
t�j���fU=��m�Q�)V�BƸ����U�4jm>�'V��IRi���p���Ȣ�K�R��mk��C�^�.qj	����g�^����~x���/�.��p�	��oB!���H��ں`G(�(-
�����pˏ��R����5���>�zmCuu�EY��h��������+//:��e��\�m���-%d��� ��~i��A���[�y��0	@Aa�ܕ\�[�Z�ˑjy�۠3��|u#�,�����A�WJG�v"��N'g���W:�Y$+(v�Ԛ`�-�q+�
���[�P\*#�V�F^�:ıHcL"���c2�CԢb��o���c��n��
�&3y�R�k$�z}Cm�����gU���P�����ـ:h���WU�o�Hn,.�����������;;�'�c]h�j�^l/��+��Xur�Pf�6�x��C��a�X
�`��>ZQ1����`Q�y]vߠ����ފ����Fگ�6G�_�Μ(la��-1�����k���h�����ft��\^�T;�2��u6�"M���W򑱼�y3�s�ϏY#�'���ZT�,Z�m3F��-�-=lOQ�D�`L�h�"�����4���-�E��^��I�Y��\����5��~8+���zI߲���==_��g�ZU�$�[@5W���l�A�!��k��W����èl��Ia�'��’"�^�ɮX/��vuA���W/�Jn�]R$���/���mVLM�9��KN	Tٞ�࡫��W�jCy��ىh(�h�vh{��������C���2��W�z���z�z��R/�!�эl�Wy�]�-
��&[�����S;K���\���zv����T1���g+��ƎPc��l����N��D�|	r�J��$�Q��T�	�ڜ���h�\ZTԗXMO�&`����+���~�S*uJ�"�F�4[�v��&�Y�T
���{�������j�V���E��L�^�7�8t�Y+2J�9̯5�_�Y�����߁���=V˝t>md�A��`M�f�9ƶL�kñ������U@�S#���(�Px
>�=�t:�ƺx�NSh��-�"m���+�ʱn&mއڼɯG�t�����@(��C�x�2{��o����&i��6�w��@�l�8��.�#�AT?j��@̻����N7�W�,�PS�\R����>���2��v�D#�R�[D��`H*ݴ���p�JL�?	~WZ@�ވ���O齷��4�Smk�������k���e{�b��XH? ���$߰�����g�xnFr@֧�j���@YY��؈�A�ob�?��Z���X���%H~�0+`q�G3��fa*MX��#/(�H�Ъ��Db����K��-������*B�1�X�CbA!�[���0��H�{�xRO*SX���
�+̵������_?��^���>��H�<�=���x�V*g��{��1�`<��*�:�$��#).�!)�������ujt
Q����kJ}A��E���+�Vlʀշ�c;��F�M�b���3�#��ASX_inb��M�2.�V�=t0��,�g�~�1�iアJ
�
79�����=���h�~�;���c�#�a�3���JZ#<�!ϩ
��Ya���pB�}QjۥP�)q��
ZLZ7rO�=n��$�^�((P��?�껡D�&�i��sOw�S�]��u��V�`�S(�sɛj�V�fH��n�mh��S�#ߍh�Ni)����o1eA��L()�$�('�!"�Tc)A���d2yx�9��HQL��D/�Gq��W�y�NQ��
�j�5��z1�k�@s�`���&J��g���?��Ş'}��|��F�aW<r,qd]G��t���m(N��-�������O1\����&�cV1���C3@�8:<�:oD�.��kn���QR��)�c�>�N�Isw�42HF�I���`7n>���.�����i��jO}堮��
�Q���eFU�G�W�w�W���0a�X����X�֊��T����d���*4�6[HG���Kb��#JcQ�����/�b~�|�Q�o��F}ī�"[L���UG�S["��b�Fc}LG�����Kl�("�V��\	І̊��TXd,�1k�:�Ǝ6�R�a����}�‹�~3�b�3���G+��B����������K��7"����Μ`�!8�o��K�_0�b��\��'�zR��W�/y|�C�����f.�-&�[3�3WxsR���Gpk����<��9�]x���`��q�̃\9�8ߟ�I�ݠ�>wjH�i�s;�/H�>@�#����O�#|������q�f6΢��0>��4GU����0�"�hT��O85%E^_�T��-w,��J�7�×�Y
�WW��q�j��x1<>��]w�P�(���|��T���)û,�9�S)�o�}�V�7���P��vY�m>Y��rY��'��>�C�儏u|<�\~�M�Ǻ>d�zE]h\���rFΝ�R�G/���Z|r���ʳ�u�WAЛ8\�xx1�6M�F#w�ڔ�z{O����3�dDD6{���ae�.�ȜK�@�\���ÂԹ�X���м9����AA6�P�����髖[�F#����ԛ�5���� ����}�^�\S����������o	�f��~"h?oW99�9(�㽌��>@��	|u�/�(3t�c�ߗ��&p4�����닟��#�Δ>A��>�G��6���+T���>)�z�%�>7�2�Y��;���:	�a� x���v4�^"������_A���F�L��0�����H�+�^��׿f2o�)|���C)|f�ן<I�2��lI�&��":�K���FO׏��yܛA��{��F��͠�s�'���o5����)y�S�yo��!���}�c$�8��YdF�j wV�U��|׺�9�.|��nc��lEM��1�dk}���Db�"-boJ��'��S��ja�.��Z�ޟ�w��J��L�aQ4�����I�~^
f�ǩ�t7�XM��DN�4�B�m�p//'�	���<��夐����x�&�?�\��i!�af��Q��	~�ֳ��3�c%��<D��y��>�/I�S�T�g/����H�3�?[3�;��t$���A{������e�S��|�������
R�e��5��X�A���(|j<��)|4o7��K�#�7(��2BO
��ǩ�@�n�������R��y��_H�›���-����>�^p�'�J~��������-�?��K�3� �����2됽=��ȃ�I�ו�'\\��S�z ��g�!��۝
�p���R��Hk��!sM�ޠ���oز�ƾ�wl�ap�w;���cǾ}��m-hfUThŚM&�!ڂ��1�d��˗߷}�=˗ݻ}��ߞ���V2��}����ΆО�n��B��q:�����W���ޚ؜:��;7�ߟs�WL�,"1mӌ�&�G���|r�~� �m��ےhUI�Zo4K+$�*[,l0���<�3��<�y��AL�`�S#����>��ߟa�.�94���;9����?�����7�	�˟��r�_�h=�.���dӑ�k�F@ņ����mGsp"2=��І'Sa��<������C����'��列|��9�@u;gkb�f�Kcn��ۚ	
����>����K�#�g<�J���R�\C�P�7y۱��8�;	���k�n_Bm�i|b��Ԗ虜�|��ܽ�9?��y#o{��f[�1���'IlO$y�$���t������H&3�Aퟄ��'`9?F꟤pK��(T����i�R	�4����e�y"�mdwFv_Q�ǭ�Ĥ��`9���,�ws��xI��
:�l�K�:�J�Z�T�6m4n�k��5�z��y�&�j����T��U��CͰ�P_������`"E��L�Ͼ����Z���k�v�Nem���R����������I�ذ��#�_R�"����N�o/Uk�,ufk��E�P>r������XT[���Z�Յ�h�8��3�ԘF���?�)��|��G7�~|���G���SjN�s��ͩ��8&��~nn	�$���E������������[9�Z�t���z:W�\��Yo���P�����)�;TH�l�f,.G~�� �M�Y�.�d�>��~��	|��Є�S���}B|x�9D�#F\���=>���d�M��?�L���)d�P�:r��u����Og������ӫ�,��I�}������K����0^IJ?�h�S:zzZ�������6!��&���=�Q�>9��/[�z��d�q�rqME'�4�L��0J$:�����ٛ�	���i��*��L6-���ZZv�.�Ȃ9l��
��d�Gr�H�r��O�r�|����y���7��I"��tN��x�=��p�+�`|��<Md�t?�_�VJ|���y''�y`wN��@H�����|_��&ŗ0[62�S�(��+�/U?�Wr�(N�&�o����@p)4�'�\���C�o���9R?�=I�_A�������M�����I�o�����
$H��~����	?[�'��}E��+��p����I[i�������p�ߚ��YC��_!�a�J�ΐ^L�3{0�ҿ̖�>fj\�0��;��%��4����9�+�܊���K
/���	EL>�I�s�0��&8Kr�O���j�Z*_=����U��'k�
�n�PȺ��h�ƺ���k#{
i}z|wa�{!�y
���tu7�0�;�ZDꊴ�%��kR�Ww�WH�����ӝ��Os!<x�2ظv���5uѭ���������-G�=
�-m8��d��jk]]�6,0���:���7�'j��HS!>U�v
pV%a���]�^��F�<&x��᝼|^Ğ��_�k���q�1��Bt!��{���0�T?����S�A��Z��W�닾���&
QK���X�氹����`\��`b0�C�}��P$�H��g��˜r{D�R4�j����n�+O�������*��F��\��e�Άm�\���6)9�,���t���C�5k����1�n8^�5��Mx���čs��H�O�����_-9_����=����{�1,QY�~D�
Dd
��3�����F�˝�f�"�@Gn>�j�L�;m�3��y(>:/{���Ӳ7�_���2^��ڔ_����XzwKJd�p����ka�b{�UoT*;�ᴄCN���n��.񷊋5�B6�^��"-#���xN�%�Bs~�uF4������It��`7�ߟ��P�E�ܺR��3����I��\�|��ۢ����L��K+�Use�Z��t�Ց���\mn4����b�l1���f��jw�]�2�
{��Ԯ��ͅ]��v�v���>�Ay�zS;����ߧߜnXRv��!>'n���vj�=IP��8���0;��FƁs�~��Ps�ģH݆���%N�@Oo�(&�,�Eŗ��a'l1��rln��i�,�S����x
z"���<�a�:7�����lb~Z������;�ixi/�j��1(�����)�����g��Y����>s 3s�R���3��繉����Csh=s^�����gGs�R��v:
V��f�3m%V�B+Q���+Һ=6�DW!.V�!�����n#���7F���L�W4o���my;rC����NS���s���
Bn��������P�D�c#�}CcOWs�h�`>]��矜	�g:��A/�	����ӧ
^����#��̱91�_yd���5��T.��I��<a��	�D��s���C�3��Cr"kdsD��&���J��V�-/�Ze�Ҧ���e=���b�/�QI�D��'���yL�|�" �-�zK3�F���TS��7t$L��-O�Q��,�7��R��������u�|���4��-C<��<�/����|�����q�<s��l޸f^�}#Q��Dz<�L~�Q9��8��#��{t^������[2寀�*ML��*�K�w�%66sO��v���;��$|�~��=7����7I�����f������3 �f>v�v<���)[B⍲������o�MI�Gx��ݙ�8Pƾ�l�3��K��P�i�gنS2�!^Yf>#��D�g�m�~��D����s��7@�/�[� ���#A��	��7#~����Qjc���Ol�E�Lr:����/���'�#����N�`i~G����yiʛ�rG6EW����fyB47ۃ�PTFօ����)��<��]ylzbm.�q�>JmU��/�љ�wy�\���ylz�{��r�r>�>/O�����e[���A"^�Kg>^^����r�2�������G�mIg�^9W�z���}��{:'`����qq>A
Y{9�>��'��A �O�$<���q>@��S8����{&K����y��7��?�"��ߙ�!���Lz��9�8���yx��� J}�c�7x��
��7XD˗p�HW1�l)~���=|w~��y|����yy���7�'R�(�}8��ߡq��H�=���_P�;Ŕ�)���R��⟀��m�p_�	8I�S.�Q9o&�Q�8��rrgۑ\���2,��6��승^�Hvf�y��k̑Ln�n����l{�ٜ4
�G'�2ƻ�Lȹ�<��g��2��̯r�w3S<E���5�x���4A�:�����nv'���+��Ҿ�sW]y���U�޹lN�D6Ԩ��+�O1�z񪪅1����Kx��.��5��M��8�M�ʼ�Mx�E֬�#0Ym]1g�[��N�XÍ�t�<�F�p���S�E��oߡ�E��
H��2vQ9>��3psj,|T���T�s9�TN�=�Ι�%��ӕ�a �g��I~�@Z?k{�����Ɗ����������ǚ��H`����'P\���|��r��k2���l�n5q���b�D$�m]y¶t��-T8ԕ�*��	�x)��2�A��CSb�������y^e�}��8���4�n�!<Έ��+.$](LF���)P7�
��b��8�H�/�y4z�V��M�����䃓cc�¾�
�_��㰏;����e��A���>K�կ��8�nxk}ժ�
��Ju�gh{s�g��z��!D��+�t���1�|�X�#)h�36|`h�
�w޻Ʉ��D��,9?����OpI5v��Y��d{;NE�ϲfϥ;�v4\�	>ش��ت���c+�������x��V���ɵ��Hn���5����*������
ퟭ�Oe��
J�N�����ɠ�U�c���pd�FH�i����F`Oh&և��Z�}��O�dR�Ќ��N۬�M��ZN����]��r���-��~=8u�Ie��|��T�7�4E����lܩ7�z�1�ڴ�p)���-X�d�̏r�g��r�}��1\�g��,�	�_>��������U� -�#z��y>G�s=-�"�8�1�����h��F�%���3ގ�3O�p�<�3>�+��~Izti�9�ѓ��2�|-�0�<�Q�r�|F�C�E\*h�&�x���OZ�0�<��#=�JzH�?�|%���:��"�ʄ��nfr��5����]>S4�h#7~��)����?e��!
��2t�h��98X�g|2��O��w������{M�IvR�^E�
����*���<�����*�If�Od?�b����R� -��4C燁̏֌r�:��H}u�3�GE���
���8x���,�;>����'�|���S�?"}�p��Ӂ�$������.>�	�'�ʀ#j�K�/�e�*��6]�A�sO�2�c:W�̭�QY3/����%~7^ɗPy��|�s����x�WH�+ɉ!��oS����	o��`k���*�3��2Z�4�xf��Ox��g%8�{<���;s�'�+R���_�vE���32����|��#a�L����|�|�wd�#߃��?"�]�a����o˰W����(���9�Y��B˵��gNy��BMd���#4VȄ�0r�Qk��>���.���_N�DͿ�=_���AZ���!��>�.�a��n�O�2"o-�g�_pppu��-?7��7-�Y9nGt�C��
��C��
�aN��~��>d��t����y�G�gNR7�y�����.���>f��0	Z���n,��mY~���e�m`9eׁp��Y>w|~O��y�Nf�\�c�����3-_�GO-eeԏEVb��M�q{o�*���_��c�����ar�1>�?@Bl���w����d�َ&�^��t?�3��Q�桌�3T�N&�,�'/�D#̅#���q���sPy�z9�I�����3~.�Ia����ϙ��8���9��W;^v\���9�Ȏ��\|$��wl�㤔�7��%� ^JIP��s�M~n��_��5��y��77��s�� �/'^��ʇ�'�����_a�����\��C�,�_����	�������qr�~�ϋ��l��1���}�+��X���O/�%�0�_aܐ��[���@��zN�,9�͍'����e�Q/g|������g�r�A��*��b�N�a�YN�<圝�sv|�zn=#<��9�>o}wσ���9?`<��s���S�/HK�2�J�i�Z/(��'�$^�|���
B���˖//����q/�?���i��r~<�R�W�)(��YB�"���C����B��L;�z��)帽w���v
�K�}����3��=[��/�ᇙKǃ�qvj)�+�O�����w���Ծ`?j����p�׭��Iֻ����ywƬ��6�7Y��9�}�'�HD�b)�NN�!g�^(�����FK��H$6�C�r�̠p�
E"X������]����#	>/��}.��ݧ��soûa�������iȸ��a�R�9�OPNl��ܸr�}������d��q����D�0t�o�H����…��3���c�Ej�ZV�� ������p�ǻ(�!>>���0)����4�d�p�Ŏ��[����ᇟ��d��Rپ$�9K�B�i8ۙ��k8�w��}L�ƕ��ɪ�md��:Bo�n2��#����2[�\����=5�I¿J�w�|�S���!~�>�P�q�X���Y�����	�p�[,��	�8�a��g���H�ί9x�=�5�'r�g�C�v���=� �_*�'kd6})|�v3������=���-T�L���:	_[�Cr���W3�'>B,��ʰ�7�|�+cČ�����"F�?��_�gb����O�a�p����9��.�&�[��I��-�/I[H?�vfVn���eo�Iܕm��;[e�s�9..�(Gq�o���Rp�O`2�Iv1��\!�1�wp�c;��󾋳��uYcR�	�ͨ�Gq�'��ꖿ�t0��[����T��woУ�u�M��h��(!�n1��2u5R�R��EE�CA�=�$��yôH�?��+�Q��l�n�bm�w9|�ٺy��y�{�,G���c��~_�u�Vk�]��Ǜ-�7[�g]����D4|zB��x�A;ԁ��.��K����~�na�߁.���{>����p�[�Ս��^r��$��}�K4�o��Wo��RI$��v��X|���ȍ~����;�g��6Ҿ���'w��\A|l�����^�S�W�wcb�%�9��u��]6�˵*�4�Y����r$/f~��F��NF;� ��=�h�Ir�b����\]$��=K|�K�
�n�eWFn%í��E��/`Y�M�RZTm>}��U��񆙨"vq-���1��)�RTKS_�2D�\�OC�����k������K��Mc	�z�I}A���tm
}i3WI���LC큨�~p2���~�����֣�ƌ��4~��y���;M����'
��/)����Q���g�3�&��~�'����G�zȴ��z��/=���x��'�&���)�(~�I�k�5�|���y���`�۪�����UW���Ѐp���A��l��Z�D���J��1��jw���C����3Z�v���×܇�&��ˢ�
���!�h�Hq9����ºS��YV�>�����|
��J�=14U���~2?Q�!T���R�jЯ�h��p�+��ޑ���q��� ��_>�X��_������z�L8yR���p�3���tg��# ���J\B,����P�p�`�'v�C�o�<�0��?L��>�%�/���|�W�l�t6���"�ם呂��ֱ���r�Q_
�M�%�"�ƵHF�If
����.��K����EAgk����}#В�=�z{�͐(�r
�:����(�
�+�J�N}I>��|�Wֵo�}�ͻ	�FFGǾs�[
�۶�n<�mˮ\�:��FG�]��?�-�H`�a=L���'�5���IdO+A�x���5�)���A���0s�ԝ��Я��םH�~��}~��k�
<l�%
w�D�-*�H{?%+��pp(��d�%��ߛT���8�f�Q�z�R��w����'~��眭���5��E&����>���>�P�s������t����-��מ+|����5��X-�#GKc�|�_��X�@,���8��w��f��bI<Z	j/T�(�U&~j*/$�5����%%p���.E��N���ڜ�wU��3V�xD+�'�CY��ᰦ>�S�)�� ⧏������%�
nGs�����%-�v���[ �����/PR=]��\���Bk�T�sY��W�ꍦe+��v��&����ਪ����ٕ%���t��q��_�/��{�"��QH��e��`b�70��.��W����ה�����z�Ç=p�5[�o��W�W?��� z���.�)~㫐�l7��[@�ł��ohZy֧���}��?��_��%F~��)&�2�3�a�q��'�s�MIl�89/@*�%���8�Qۣ�5�}E��=�0�P��[�ѿ;؍݉G��0�)�����5"�?���|��>0���N}����/���h�{����p�}�o<��6ަ]G�,x�/	/d�C#�`�RP����x��O� ���%p�q�c���g�83P=
4k��-jq�Y��Vn]�lK�X������µ���	� Jrk4�(�ڏz
6l9g3�]�ַ��+�$�:q�zf=ӟz&��V?3	��ٲ�=��מ+.��=�c�d=8�|��2r?,�'�|�����wLo����G8����RZj�xΑN�պ�S5x��tz}h�Vp�?�;�h��2�v�)���Oڅh,��<��y����v1��R�dExג�i!��	�'N�/�7��YR�D?�D͞M�"c7ʼ�{�\�?>�w@�A]�2*�>X��ݑx�"��6ظ�ܝ�)�ym���Q��yhA��"���j�y�ɕe�K�.���+�oO����~)A��Zb8|A��H���E�^��?D�Z/]t�O�/p��
���?�!���%?/��<~�OQ|G��-�+����� ��#MM�I��uS}�l�`݇m�lr��{'�$H��2��,��t�m�4��������b
�i:�A}be���=��j΂�H��Hϑ߯��9��I�Tb������俙��ʐ:��Ŕ�͑�٧\v�����¿��*Z56���A'm���B�|A?�9�Y�y���M?Ϥ�!^���O·�6Y�F:�f6�3�����!Бx:�U���藄/��~уEC`a②���=�ΨÁ�9�O$�H�2�')�#����k������疖��"����_�O4F\;i_%�d�3�~�������6�y���wg�4NY�"��4��c(�}ґ��E��h�m�� ^9õq5�߃�I,�BI�~�ǫ.�������6
�7��W�ك0ּ�Z�M��!+(x�D��R��oii��Z�y������x<�o�¾�zvU�c������E���!�բ�ῆGƇG�.ZT�o�ڲi���(�9�����1��p0{�ĎdDeFd~'
u��b�����R���O�����	v��-p7vj#�?Z�v�h�կ����@�T�]�U������
}�IV��lC	���C��q���M�i����]�9�h���`�T�bՖ�b���o��������N�6P�+��t/:u�WC�W6⑦�ϐ?*��5m�F��g��O�<
�[[�beEE��Ɓ�]+4U�
�kt�_U�]$bE�`O�����3�ru�T_�kSUIE%�06ģN�7	�U�Ď>�g��w4��c�dF�u#�L�c
�w�
��7��5?�v���{�ߏ�����v�T8._���
��K�U.w X��b��j�*��l�֪u�>o�Ga�[�p�,��U����}��gjDS?���o�QTS7�qQ��) �T,�(�(��x��#�6�6o���<R�.^��jYH�$��zZG_[��P�WYa)kD���
�E|��&��[�D�lǷG���1�Gx[S�����('�P�=ܺ.s���9������y�����%�
f-r�Z�*:�����ax��ˣ�W��W_����g���#��)�T�:�U᪎�*xɢ+����k���8p�p�ܻ��{Z�ii�i�W��&�����/7��:Bf3�5�ɽ`�h��/f�m+M^�|
ʐ/z!3%/B�-�`{y�=�N`��09›�����І�}��t��!���<̆��$x�x��u�ٌv�A�<̓��b~�`I���1��T#�w[�`ɿ#�uxXKr�y�E0�`�Ӽ�A�c9���m��9�dև�z����6	nc�I[s�kB�-&}nk�^cl���x졆Ѻ?UZ͕�pBm�Q\�W�����+*�M/js����a/�kSp(�!�H%x�s��!�Z�Q���`��|4���+�
�����Puy�&U�Y�^�g�
b����gM�L-�J�'��k�6l[�d��wt�7���u��Q0Đ8���=잃�/]ھ���ں�8��;�9p��Ʌ��ߙ^��c�w�����'�~��'X�}�h|tj��Y۠TT��	Fœ.�#:V���b�uT�f̈�H��n�D��&��\ׂfDs�}�_��C��H���+��vt^sK�>}��r�B�(�z��{Q�yfzI�?P_�*���.���;�3�+
\�o�Xcc]o$T�
⩫�s��Eꦏ�}i�6r쥡�$��Z�}G�kSR2��(K
�%��<��9~�;���6:���PR_%����6��*+?Z�h��M�p(��;��W���m=��L'{j�Ko�<���2�V��JB~O$R���3��as���&.��VT���E��JyY�¯3j�~�y�64�����:i�wШ�3<l�����55F����Fi@$	6�Ĭ��>i��u|����`�`կ�\DW��_�����4�l�]=�@��?������"u�R�nrj�Ww|��=�j�wK<������;�K}��j�,{�E4�Jn��ҙ/�h��a
F+#�{���x����V��L�iթ]*��X�:8��4��k
r�|�����=��6xpj��e!\�F\(�+D	�J9P\4	�g!L�R�G��k�<�K��fćJ|i�5�}K	q��md��`r��-������{m�-ӑ��^)�j�)����Yy[����Oݷc˽+��bS�eS;�5��uv7��D]u��b"��k1<��_�?L	ǥ��+��8q�-��C��ף��/%�3�?���dR?�x�"^�"�k��ꖸ��`������J��DAUl5������.�5tL��t�w���=#����&�7���m�-r�7w�w��hc�;?�� ��;�M-�:ҹ�ʞ���L���ջ˖����{����`��S���(�����uӉ����,8��+U$f���k_�(^� �
i�H�ߏ����C�Ʋ8R�{���H?'Gп�+���ϳW�ee"�tI�;�ʕ"���m_��#����Ŀ,X��j7��!$#�u@9��[�-��X��.�3/mƸ�ߗ�
�>˱�@в|�зm��Q�+˝��<�m]ӆV���É;G�����ri@"j��;{����b&O�fDC�m�<
R-�\6�س����mg;���W^�l�muM���6��������Zǂe��&〣:�y⎥��*?���P��ݝ=���N��k�KP��Y�R��,!OI�D�����@��E�rc�'¢���-��X�:��F��{�qϵ����†�M£��ک��==ޛ�M����@k�����c`�\�^�y�/���A�"j�E0HZ"TV���8�"���d'Nl�8>�uh���C����߅�/X�xԌ�?���#ř0����R�%�r�V�Y3͌&ǝ�7���Y6/y��
&�0�
��}�	����0l0��l|�}�3�0��UUK��y��ը����[o��_;A����&🂭ko��[!��?�Z��s뺺7�܃�=H�q�Mf'`�E3�����B ����B$�	���_���S�q�g$}�,��3���:���KeT)��٭�vL�\^�ƠU��]'>��%R����em�!�P�������3����0�
�·ѧ[x�u@u0(�^/����?<&P,ǟ?������\��o��o7��h|���¾=��c��u�į(wHև���<�E�(�t=�0z�)B�0���6�:ybn�r����v�����ɽ�=���NN�F���T�Pyf�3����y�Z&��҇w������~�e_�s�Į����v��-&n��6>�k�ی�F�n ��E�R���HA"ư�:M�'�bd�yI��?�C�ܱ鎩[&f�MCŖD�8�6�mV����j���/;�;��[?������h_�GW��wO#����h����!��8n�(�`�z/(��Zd!>�_�k���v3�t@=��Z���ϝ����� ��rmc�SýE�Q�uh�퓿��7
��_T۴�z��xj�J�i�
R�1�P;��p��C����PN(x%�����;�z��jy5���?ɭv��ؾi����h�61����V�^Vy`a�,!�E�m$���7ߤ"�}��@%G}@�2�Q7�����j!#����ðHc�,O��w\��5:�<������Nץڞ���>��}�"�uH^�?��w�gә�oM��[
���qk-S9���,�
��&!�h9HDuQ��;�uj��3Ԣ��(�jof���+W��
��%܊'��s�Tۖ����gg�U��M�q�uz�1T
>�IV���s\�.Z�E�.<#�����o,��a��-�{ 
�)n Y������W����C�@��Q��X{2(cZ-10��ֽ�?�C<W��.��N�3��Q�6��B���%Qgj� ��1:����-�u׸5j2<㷃���_��J�K�F6�����nY��/p��$S�͒���`�2��6���!�Z
8rd��2C>Z\�,����x�h4�������nAg,���x17�m�םߑ�$�"c�T�|vr������p�Iih��d����YK������-mA{����9'��}#�B��dG�*�	�y�1��4�Xr#���!)�!5�]8ԑ�N�ZTh����w��)�c�Mc�&��8�h�C�LAK��牧�֮/c��KI�k�&>��Vo���"���',��ןT͎Z�=O��W]A�*�'+Ֆl��M��o����nX��\�h��D����Ba��IG����?s���g%��Kd$�]�q��s��
��\2�w��2�ߺ�7��!�/�J
(s)TBU]�gN ��X�F\1�C�0��
�D���%��@`Qm�1��1
�b|[4��zvxθy��h��}���l\ ��>��]c�k�Y��R#�C��F[z�W���q�5NL
�t*�c��8�#Sr����OƟ�	z��G�5�
�_%�:�$�8��'Oc[�����^Lm�_�]��������O|�]�d�_�L�rގ۱���#�=5iK"��q�L-��a�/_y�������=3�K�u-��-g�Y9{��:p�2��
�?@Y(�A2�����q����,�9���Z�v�dm��+}e��у��Z*�P$T1ll�ꡫ��^��X��#�?h;���A�n��������O�_�iǚ]����69H��[C=nQ$o��F��+��5��߱����ή�r�30�_����T�����tw�d`�����}���o�E�߹s'���ܖ�Ո�6\i�}�-��o�U�g �&9�yX/���@�璄q�QWV�X5kʰ+SS����U5�������L���u9���������+Q�-��}K[��y���ы��=ea��m/E͎Lv�����zuFkP s�C��acSav�G�[�4ʒ\}v��UUT���o�a�?2���j��ƙ��8�O��s�M\��p�x�e����4Y�N�+�W���	�+jU�Fo3�6��bjMV�5�����"�Q?���H�8E��C��O�N�K�64~ס�ִ}b66�阏,DSs��D���V
��1��3��M� �M�3~"�8�C~�p������ðe"��
]E@���,"EF����)t�
��O�ww'iKʞ)d� .�ē�u6/��X%,9�����8LU�t�M;״���J�8Kp�f�j��
��4;\PMJ�ڙ�H;�F��1�����a�'g��g��~J&B�D2.���T��\y쨊�+U`{C�dr~~rjnn
�l��������^9�%vB�����Mq��q\��;δ�Ri�R��fC�����w��W�l,S��䅁����!���r0S��A���I1O=ā�tӺ�.���N��FIV҇NL3"t���y�EF{�$����u��H&��#�N
GLf�V'��J_�)L/�;9�?�tfm��os��ʑP�gB�I�I��)��F.�u��igNg��x?W��ƩTw{�#���_oWkL;��X#-G���
�r��/\�`���s����P�R��s��p�ob�M�UW$�3w��p����D��;�oH��HnB� X����cZ����':�fLG����R���C����1������f�?��5�x��t���.'���Em7Rl&�2���-a�w���֖3�m�E�4u�t�����f��h�]����U��5����;c\ p�Iٝ	/
�:},�Q&�O�sf_9�?�&}e�BB�s9���8�W��lT*���RH�u��R���s�&�˩c�q���M�t��0i�1���%�sjw�ęY��Ͳ^�ʝ�t:�\�Į.�^�{�*�sl�P���w���ZG8�W�™���;r���*d��[[��dj���i�F�����`�*�!��,��JeC��$�v-P�F.I�u��*1�L�j�Ɋ��Bh�-l��.A^��/2S^og�x�S�~��&���,u��Z�)�˹XTo	�)��-���)�Ϯ4�O˘�V��er��H6�ɨh�á��`��>Ns���ǘ/����wٮ�R�]6�Jъ@��1+�}dn)ꩶe}R��a�
}�`�+ա��ҟTr���԰&�̔��x<�ge��b]�^ԑ���
;��ώ�_{���.��w��@��mP^+���b�ڽ�v��ٰ�-�]b�ـ�a�"y�n~'m,�B&w.��	�4_$s-sӺ8��/�!Q���`�hHf�l�K�٭����$�×�LE�(����܊��A�q���S�B-�o��$�=U��H,wl��1��b=�Z7-|t��;vo�8)�4�I
��q�n܇P!JX����F[<T�Vn��-���pg�ӣB;�g�,���z�݉����]��r]�Wf��Έ�(��
��W^����n+��Gr��ʗ���h������MU���aY=Y9����^(��J�-�匮u_��ۮ��XL�W�7�ڗ��"=^����B'V0<7��6Q���W�Q!DV¦O1�%��`<ќ�^�c�Sj�t�h�h�W"�{Ɉ2cX��HRm	��y�J�ϥ5�S(�rџ􀷕��֠�earc�d0�VAnv(b��d.��S���vu0�+h{�VV�ǝ���c8V�5�4L2*Y��1�`����$�:�DXcj���r���9 o���c��#�ņ}#�hg"���*��S1}~��DB���w
����h��IĂ�٣=�m �X}��V��5�
�yc󠻻��ۘ@%�.����CGޟS1;��1�"�m����ҨL��,�[�Z�r�ѥ|���{`�-׳袭���o�یVt;��=i��{�F�:���Y������
�e��6:���(�5F	/,Du�h^,(Ksґ�H̒�ړWg�ܗ�+��+A��r�<���:����(=��HOxS�	��l!ݒ�<WEpG�5r�=@�f6�)���p�fSӦ�92p�Z��SƎ��GG��Z��'HB�h�w�؉����.ЭJ������Nd���]���趡�{��,���h��>Ӥ�X ��@�w��+l���ѝ����̅�@؅d�epOc��Jh)����:p�7U��
�P�yy�)1�S��� I���duv�7�c���}�����n�lܘ}��!�s�������B���R(��Z��ׇ������AI�y�a����R"�E�,nl��
��P�GfW��뚉ѫ����ꑹtr�h�ҍ��c�M��uL����x�
=��G߅�챾�cs�����e�ޞя��@4̋~�zRG\1�Vt�M��"k���DsmJ�B<��/��'�qȥTCDLLj��[	��E�	/��nuNG���}S[c�;j'��\w���-�Pr_!��Ҟ�bf<�w�|��*���k�Ȳv�hpbG��`/n�+=��KG��L�d��� ��H$?1ݭ֕ڢ�xxw1848�N�g
����|e�DI�Ο#㓱�4���9��`nK�����3Dm�A�6���]н�c$��pÓ��4����E��
ς��2]��wJd���9R�k:#"e���|��P�Dcm	�>G�8��r(�;8������lzAxyqS��k)*�L$���D/�N֫�x��}[���ʏ������\k�;;#W��^!"WL�\y�)��/DK�Aؼ�!}�s܆�Ţe�$����
��'J5��ZT]XW�	z�sQ���D�Z��<!F�8�	�>���Za�Pj�Z�Ls�L%���
��KgO����c�;��z�ȷ��ԷU���T#z���:�Η]�L�ݛ�=N�]��+Z[��I�M��x��0P�\���ӎ��v�� ���:�ZAZ�=�m^�خs����,$!
�"�6HmNS��=w��IF!�u(�]c�H89u�Ӑq&�c�|l�/��%�J��&�m,R]��b��5�kњ��W�T��hOZ��$G �C��Yq��0�p
뻯A�	�����D$��Њ���I�,�0la��AB&8"Y��w�N���e
�|ڠ�8�Ee��|�V�9�vݎP@mP�g�i����`d(�fZF3|��ӧ�U��R���l�����KP�=P����d������T�]�d��R�X�zg1`u�t��ױ26��괆m�p8f��!��HY]Z[�q�Ra�6�E\}Y[ �slj�՚�Iy��}�qEk��b���	�����T��ױ��#�c�n�����
���!��k`�h�>CL��S��_�5pA4�;�i��xj���I�.|a��^�]��Z�k'#'6�l#ې�Я�D��W)��L��}�F�Z[fWV7w�Ϝ=���On[\$�ZY���n]�����R����k����c뇉er���xE?�*ɨ�E^
x�n�OgsL�͇������%��/�v��������'���+ҥB�xJޞ����:�@�v�0
E��1�M@�/r�F�%���"~I<y�2��n�?��N@��9�x��	6�#7�vh��
��ak�hs��z&a닄�M�m۶cs��=��R@�]JE��9X�]�d�\:�Vf�ڬͪ3��<�z�ާ)
�2���G�E��Hd+�D*��9:�p5�R���=@�r��]w�mݝ7��d�����Rqw�bQ"�ٞE<�3!��iX�Z���!��`�g����$p}��paI��qhq=�c��O
@s���Sý��K����׷�@�S΍��_u�c	��ԯ@���ka�o�`�x���>	�J�N�Up
�� x
k�
5yӾ�����C���[t �m�zJ�B$�x꿯�t^0}t,�-�yq��_������U~B��޵�pff�������G+Oa�T�GcA�b,�v��_'~��~�"qi�rG�\0/��P���=����κu4���t{��{3ޡ�q�ܹ#;�Z\�k��ys���ݣ�]0�s֖� ���L�H �mKu�4�7�I����{C3��Uj����=Im���Z
����}��2: ]�tO�U�sY�&���`Y�Nk�>�#US��/��$ӼTnw)�~]˶�R���Vɨ�f�E�6����Ȉ�o� �v{��s�dR-�<���
���fC]���$�IeM�o���8-���M���J�Yt�[�x�� �.Wgx�l@F�y9���SF�$���P#��=�%�~һȋ|dC�7�A�a3j�i]�)��52X]��N��,ϝ��[�`6䦘�cq4b��F���Bk�4n#Tn=��H�J�aU h�N�\^�:�јn��^rY�A���&���L^ij�w��d�t:�1y�Bbz1��o����7���&~��I
捤��	M�Em~�*��5ќ�ik-�'Kn����2�����\֜36�=�|
o�!_2R�d�$^b�B��eE	����M~M��3]�66 �@�i˱�V����f�ѕ�-�cX�΢Ч�*�ϣ���z]i.%��xm��Ri����6��cƈ":y��䁼1�U2���R��GmQ0>m�����V�2��tźrf�N��2��A�[k>(%��D�B|�mp˜=���)�	F��>P�9�-9�%9|n�p�2���x�mf��gY��c���z{.���M����)ȱ׉��
e��DH
ڑ6�h���?Ę%!�8W�D0�T��q��瓗��	�Tlye�R�h��oqOmI���h�-������7��p���{�l�����㈍�"s���T�y�#;2��\�b�c�ndGd뻥!���)Vv��S�ާ|�^
�M�!LH5K=p:���(ڣ�l_L��Ѻ�t�+�֚p~>!cBv�����HL�(�N�i5�]9�7�o����F)�xu�o����i�R�-m�J]>��*�=Ė#��bT�^�����,�=,
�F�Ae2�JcK�B��)���XJ��K�~c�;�'t��ܨ�T`t
{9A�DR�\�-,X1-j䊵�@�0�p?Rr��Rz��u�<�7��҆�A���>��@G���e��˦s�d��ZZȸ��=���Ţͫ�f㼉��h�-7�?���K�L�P|���m���5�ᤳ4ե
Y�%�e���u�R�!��6�`��{���`�U����ԨS�bn(�%��5_�@	��\���#$<��x����X�[+]Tƥ1�<dy�rJ�_�S�J*����"U��A�¤:R5s�(�Y��c�@
r�]����s�!������@W@u���nu��WFAP��K�`��ٻ�4����!-�D{�3��ǰ4yE�P.�c#I�������S���
R���XH)��2kkg�3�ε��i:]�5��cR[:�[�j�¶`<�ѧ�i^n��p�}�w�L��:�oL��r���;<9�W5\���&6,j��s�﹤:w�~�JU�*T-c��.����Pe�_�6�ӻ�m�3UZ���T�P�4���̭-a����s�TH��e���=Y�ui��P�ծ��?_��;d_��L��P�Z�l��t�6���fӗisM�G���$��q�T�a,�j���f"&��3j)o̮sm*�6�ײ�;⊙]�K)��L��y��ԨL2s80n�?�A8	��Q%���g�GǸJ(\�(�"��}�j^:D����Ů[{Bۘ�_M�&|�¥�V��®ؐ+��\���Ed*��"���}�}�Y��g�(�-]~���vYn��,
�l��)���	���	�)P`�`�xB��ހ�⚹4�T�����_:V��󪜽�@�,S���vz3�`ş�}�P�&�(Lp���M���}�-����y�B>l�iD�&$>S�Ëlkf�di昙&�(���ǸG>
�<p��MI����{���!�<C
ĺ^M�����\���!�2�c|X�$�@DB���[07���2������xf�ŗ�ĝ���������ȟ~�#�T��t��}O?M|o-�p����g�>!�H<�i]��KL����>����a�}�!�+�])!ɞ�;����ECv�@��Jȅq*��ʤJ�v���+gKlj�ڤ2+mg�LE���Ftn%�x�宊T�S���
�\�WF� ���R���(ExD�#A �dC�oL16F�"[7$��XB��I�p�(�QE���(�ɳn�}^��/^B��������-�0�>�{Xiw��?8g�F��.�&�
(�^o��@\�w�M�2��������s}��ᑶc��_��k�E�n�&I�'�a�S��@�9r�H܎_��"�v8�6M��D�}>ʖ$	��څg���
?�1�ֈ�"����,����#�π����'�[����y�9iXݨ\�t�s��f����w��?pne�.�.��x��T��#`
lc���=|�f�3�>|��C*�ц
N�9����8�$|�ĩ�#�'�C�ei�8���c=�Xja����bN9�,||���h�q.Q�6#O�Sw6A�d�%��C�Z���_���=���l8�9�r���O��}�0�}�p�k���ݶ�E�w+�]��X��v-?�[Y�=(� �v�ȼc�v�2pWu���U�����Ö���z��-ܓ��� Ŗ*e�=h5)�l��`W)�k�=�r��um�c�ᬷ-��<w�h�M[���/�󤅑�|�/8�,��$�p�<��o��E�/�~�=!O2�-!�-
9�lv���N�#��vY���[���tt��}Ee�t2&�'�����fC�2"��*&��i�*���q�n4#J���-.�M��y�6���<s�S�A|@L��@���Z<�@�]BX�^̀Gи��m�ش��h�1F�_9�E��I�sю��O]H:���%��wu᝛(eA��Sĥk�z�{��L]�:�=�P�,�a†(	����'2OP"=���Ov�z�u���Y�Wv�M\/X��趃���T�"�?32��;��:���@�Sh��:]�؆�f��(��`�<4�u��I�O�h�n=>u�������h�}����/�B�ߖ˨'�:��{&S]#7�D�{�G�F�S��ip���Xꎺքx���*?$�rI҆� ��.9&����H�l΂p�U�"�`kbP=%oÖ��\��\�D}Xb4FdI��$ѓ	G,VQe8�xz�RB͆D�����s��͇=��P��`�꣕�_�׫�J���\����]�JI���d�$oR�*�=��H��V�ʯ�:�ܞvJeɾ �+ل?������
�Qiph����6�?�Ok����##F�!h$���3-Ѱ7b��"өh��"n�GͲ&Fg �^�z�R���P�x�J��l�z(�e�@V]Z�}e?�
a�]�@��k̺H���!)�2c�J��WN9\*�7��v�";������!��$�_c2 M�E���f��f�--��/�^���
	�$E�nq��i�`rڽ�rd��Y�M6.��[�m��Ν`y��RZ5�l�CZUA�ћX��IGb��]�3X�FFcJ��Z��Q�	A��O~�8xr�gk�"�7�f���-��$��y���cγX���E���y�m�L�D��8�{�!�J�^�\��/缾��N��^��q���c�܀���.�X�{�?���^r����򺷕n�ۥ�޵MJ���V�XR��}���U��,~���^�-l�}����\@E�?緄^~9�y�C��&~j����g��f���U�Ɍ�'_,��_b)�a���a{-��[$8c�Ce�>C�7�Q�˾I�� �K������y�ȡ�]8|J���&���^�)J1���+�s#�(K�U[�_T��t9�ښME\�����K�ܡ�fM���YiV�2[��Z}'�R��u��$k�H��*��E�C���[d�xӻ~]��d�����$�����HDp�3v�����L~�<p��p�@I������Yʌ6u�DS���5z�����m��:"��x�9�QfW��/jehX��9�Q�@��Z��
���(�F�̶Z�W6`���i���2��q����o7�쭕�1�'��]
�E�>3LmP�3RW��&(�����P3�Z�.��;P������g���p4@��ϠH4?��gd8
�J��6���$.�L����V5��y�߄�m"X��X�&���F���@k�������M2����ھ;NR�)��?���+�a���K��k��HL��L¯��q����V�d�ڸO��<�!1�����pM��4��״�)q_��r�'�('��X?o���~��-9����4{�:�K�'��B;؋��$iI��gS�ɴdY��+%7K>,��g%_��OOPM׹�x��%������^�i�"j�Ѫ���#�oA0��KP�_	�7��ո7Ӹ��3ܻ��6��im�@8�,e�_Կ�6.�w�������O/�>��F�bL����g��4]�C�g�g�>	@���L�+��iBR_�V-_�ޟ�?��[�]����-	X_���V���G5��~�F�P��Y��d���LT�~�
��l�C<"�ȗ�~��U0f�U[A�T�� :˯� `~��W?G����/+\�jpe����[o_{���.A�}s������5��_c�ߛ#Q4ǿ(lD���/�>/��h-*���3��3(�D��%$\����Q952E�Ƅ7�z�ې,�\O����"o�$�x�F(�
:��{�
G�b�a���x�d�AJ~gOW��g5�TFG}~{�H��n��R~S�giCdx��:��%&c)y��H��n`3t3���>8������
�
�F6��9��Oirh^��w�~zpnz��8M�y�ivB����3�эn��z���1ST��[�aZ�L�-Q�؉���U��MI{(%E��~�s�g���	���9�f��U�6�lj2#��B#B�{X&�/�w���`�ga����Ht�^�5�����!�!F�_��(�P%$�*�q�(��ֆ����'�	���	�/_�U��S½\/�c�߅'��a���-�N	�(wL�?�	�r�Myr�O�ul>�x��<�o�3
�G��_����·`
@�}2�b7|u�|U�.n?�W|�˽Dq�w�)����O���1��Y����������n�P;G���q�j���(�Ek�*�����`��1�L?0��9�L,_��w��Z��o#^(����$[����}���ڻ�˝wun/Hjs]%kg�}Mt���4a�1T�{ۜ-��9㪔��v��R��e/�/_�c��
I�g�g���ۉc�B+��3xL��by�FQ�}�:�������f�7��o����H-��R��~��#���WE4����?m�;�|�>?u��Z�QSw�!����<?���Z�[����JM�S��g�X�m�.眘
�Oϡ�� ˚�C6<)����G�Z��@��`���Uݲ��AEFw��'���2�I{��Kt&�̨����!�?��m�Pjg�B
��hr.��ƒ���|
�jq!` �<qrb�9lV�:��}��S^GP�=�<�6I�R��Z޾Em�JI�*�Nh�ZF+h;��w� &�@�Wn'��/c.:[����n�e[H�(�S�.����- �,'U�T�)<_�5
;���Q���\�!����Z�L�n_(�w��
���J�F�۾�g��`5�
j�P�jҪ�V"�^h���-�Mg�fPY{�
)9o����ק�ż�n��w-�%��B�m��
(��ƅ�b<=�)�@�c^��È�.�_�1{�Sw�k����4���`�|u	�v�tO9�H�ƒ�C��2��t{�W]��k��������7o�9|��]#��m�ҝ8n�Ŀ<�G������Z��(p�}I@ܩ�ls�������;&��2�I�����w;�����s�>�`�o�b��k�7��6'(NOlc-���5�#����F�Q�id���Wi=��Y>��^�b��ܖ)��4)�5�3Y��W�ܴ��)80�Wm-�t���Q�D5�����
�"t����ל=t��f�����L�Z�Z�^���ګo�x��[�N��T�gJ�,�ry�T���n��CiO������]~��?}t
>4p��ګb��u��<�˝ɽI�C��9F/F�
lJ�Ikv��@+�r����������nJ�M	x�5�w���\�@���}*�L�W��f�C��I�9���r�^�ċ(��AH`��F(�E����� &���HǦ�3��tE���26�}�-tEh�U�U�r�\t4���T�u�g��AE���P9���j�R�a.a�Q�9����S����׽�O�SQ�N=��ȷ��U�
��…��~��fLL�k|�c�žv�s�}�	iG�=�P
+��%>d@~=!V%����� �<���;괈�lC �S�+Up�Z)k���Rv�R�l�7��#��C��?��)�R%��jk1V(����7�U�Sn	��)�l���c7�X�q�YV�*q�-\2��̇��
��VqyI��"%���_dyW['�g@>1�ºwºQ~63
�s��v=�"�-p?]	�iq[�`P	�	�$*l���Oz�Cd����ë�Gd��X�X�g�Z#�u�.�\��@���} �ؗ8�+�3{�z� �9��~�'�\�&���4�w�
��"�X�fo�Pp�6G��k�J����~��a�@�����RL~����N��p�1�ϋ`?U(�M��9�`l��0����|q�'��'Y�k!a�t`A� 
=+�e(��d�ͥ�q�=��k`�:��
�=#�g{��hͱ��$1ƍ��0���~�}z�C�׽��C�ݏ�wφ�":�O܉�P�2�voq�����z}��q8g��z�0	����J>����@�G��X.���`"�b����6��6)����#��ak/>�(j����O�qI��=.�-Q,ŝ	��OF�yK
{�^�R���P&�(�t�+��c) ��E8��pLlS��ӂB�Ռ�Sk�.�@��h\�j��� ��HjjB!���hL�1��I�Z�;0�&x�1|�a����<7���M'::�������Չ��Css�����q�X�����sK�;�C�
ùz��~�ĵ'q���,�JI6��æ�#	�kT[^ܮ�r.�gf}��p�
���D�a��jh\�ƣ������l�ݺQ�$�"������;d�P,�f�	qT.H�HK����o�����Q�g�z���P��}��Ag�Ō
m���Sh��]9�s&wm��9�������B���5�y%&��=�:��\a�ݾ������C�OpV�;B���i���Z�YE9(�1�b6�n/#�wl�l�A^Xb\˻C:烺T�~b
njߚ���Ny�I�b�a塨�b�������T#وl�7	B\���HW�Z��C]�p<L*�>��KF��pKK8K�����;@�
�
�w2���c����9,��au(�p:\���r��}l$�X�v�J��K�a�_��l��9G��8���:t�	�y)�e�M�@<�IO=D�߁����Y���j���w/��*n�c��g�&F�:��a8�F���Ƶ"��L5|�pk&�J���Җd��d���B��lq1�j-LG#�xN��:�#$ND�1��X%��B)gjpB�=C�|�Y
����(�(�o����X
������ћ�
��d�k9�|\��#��(RnH�XdC�J8a�m��
+Wj۴jܤ��ϋ���rY�b=�z>�!��N� /�$Φ�l�<b.Bp~��C~��r)Lv�Өt��j��Sw�ݦ>�k��2�w�֛���i��َ�?
�6�ߋ���G�����|���Y��*e=���O�IOSSJ��l�y��	\$�81�c���>o~��e���t������#V��f3����;�6��.����s��X��ڿ
o�/J�?�9@Y7hP�����k�"�۸'�q�Q%t��UsVw��j5%j�
�������W���/�М-��־�^�#h��+����c���D����
_>��P�9e��R�3U{c�i���QS�!(�A��kċ���e��������p�������p�K�U1:k���J�@[(g��Jc3�C:��`k=Y�
�9�����\ؔ�9Z�N֣Qr��㵦m֒���ҩ�����_��P��i�5K�u�q������6�B���V
eP�|�m��T�8gЪgTZ����浕������+�'�Y�=�%Maά��
gG�Y��|�n}4��
8!<h��p5�~��7��b
|��7����C0
o���O}΄���`
ACG����RR��u�I
��dD2.���KVP��Y.�A��9d�<
�������Lln�aX�0��ƛ�(���I T
�����M�<�/_�^{�xQ���~)�$�R���%��r�&�at:}41���ŵG����!~�`�XMv��q����*5�m,vU,vS,6��QZyL��l��M��it�RIúj!����⒰��cN\��fL�x����he�'#_}Ǻ]�C�	��g~&C���W�.�h{���ϥ�~w9���,���ŵ��W�~Sx�s��ո��u���B�<+�����3�J��յd3-!HQ�o0Cx}qn8�CF�3[�u�Pmw;-���Z�`�~���/ m�����x`?n�t�#Z���E�����g�'f	�[2�␉S'�Un�|��6�8~4Nrn[!�o'԰��(q�G��B��I����%�;��*T����ATm�K�9,��^g-ϛ$EP8/����ڔBd����nfm6�l�\%\~ <�dLNt���
�4�������*��]�Nd��n�[q/�B�O�t~�O�;��
���,�Y<���zD=��)6y
�:(P�Yd�ė�(1�ba��Ę����@��x��v�)5&��Bbj̸#�J�0��DJ[%�����?�M3[O�?=�Ӄ4�'Y6E���3<�aA�R
T���5���Կ�����L��J=�ds�G�	��O4�Lo����*E��k%�Z�\�P@���R���Ȥ����R��+���IP��F��Je����R.#	��0j�U�XU*�+����.J��R
���hTrS��T��!��������Z��dF�
h�F.&��d*��5�0m��
R)�5pV����3Z%[0���H@)��4r��t����@�Sj���Q��Nu���d��*f4kuj��(x�J�V�yQ�MZ�m"�*B�2 �TJ���H�V�D��)^�RJ�B���5r#�']�J��Q*I(����
)%	�A/�5���HB5P����
�~x%q���v&���ˈ��
|1�۠352s�s�NgD2C�����ul-�L
��p��f6��&���,�kz�՚�̮kf��Fh����v~ڠ�lc�	}o*��Y�ń|L̔ޣ~���Ҟ���z@�i���q8Q����oᜰ�ݜ~�t�$#�3��_<�\.���bۃ�;�(���/����I&���.���+��{���vl�(Y�=�u<q�+��%ea?�X�	������wxT�����Nɚ�����'P�va���yɓ�� ��t��zp"t�#��-��[�e~u&���[@ש���O1dZ��T�]�4ɤ�:_�u��:K_=�$|�s���*@���^��'Q�S*s��1����J~��hky�v��ĺ�"X�I���%�7򀞞/��g�~Xnm-7rb�}���]u��ȵ	p5?;-�&���XS��\��ٳ3d�\���;���+|z.��{g#�S�9|��Ԥ��P�Y��4��AN��7l�w�5g�tM կ�8���\��p��r�1�,�@+�+��:݅���6�������h��Ȗ^@�[7�+�s�\��|�K=
�F �)��v�cr���~��n��"��r�h�2'��Y��1�|��D���~O,�=�3|�aejd�-x����fgr��lv:Ƿp\Ϸr\��f�����o<�y��K�Mp�Q��ĜY��J~%9��+w�Q]�ڥs*��W���zm�+���߅\���k�4b;9��1��?�׈{%J�7R<=N���YX{��D˶�U�^%��
��Y^�5���̠�o$A���2<C�P�zf���^��)(���q��O�{%��X,�`ђ9��1�0.�7O?��J\)�?	�"}'K�HX��KT�m����&=������~Z���-�x�xG��ge�|ߝF&	J���!�Ά�laq���ʽ��xz�p��H�h<��m�����*c)r�6W6�4��XϦ�@>֑r��Y��xS g)�&�ٜ��V�A�O�q���H/�NK�׿�s$���({|�-���|�g6�+�������$�lJ�zV�Ur���8G�{]_���n}W.�W�\��
pޯxxt�{�����=V�����N���%��j�$O��i �b9��}�+w��uM���?g| cVw��vz�mT�t����aM�������h��P).��%Q)�K,eg�&��q�����������B�
��я$1����4O��	�ډq�P��-�G{��!�[���	����d6��u����is8��l��›{.��2tN<4{��@�rk鼛��<s�~0�A�U����u�~J#�.�5���r῁F&�Pi���n� 7h�Z-زw�Y�[m��ӷ�>#>%�ǭ�l���'�梘��j��%���#�N���� CmS8u]��>u����X��~)��S"\�J�\鍋J#W�Ixe`�U�6Ε~Y���ۃ� �^DحYa��>�K�c6�'3��W~=ۓ��x�E��D|^�w��D}
�f$�L�>;�,��߹�;��_�Z;πe0�8���=�AX�JfeE����왐��F�/,1�eB�q�^�9����c��e^����iQ�M�Ze%��k*���+��#k�2,܄�E��� ��k��e���F}`�2,VP3~�^�+l��M�����<�)=i���p��Ν�N�:�`�~$��:�5��?�jj���Q]]�RCo!�����;%����a���)��CsǕN�^�)����e��zy)0���7�"�	Q#�)�T	����O[|���|к�z�$}םƓ'����?���^����}7�u
���Y݇�ܡ<��W�qZO'�$8Ե1�zjmpE}|�K����n�/p�rL=�<N�f.����7���$���n�_O>��w����qK%L#�J�n�*5w�w��SD��,�WuK�;)W,�Y�T���YZ��F��p޽�����^{N������>tY�X_���}dk��G�6Q{�Ѻ6�W��	J����(1��@;hz�~�Mz�@�&�������b�/.(	��Eg�\P�#,�#��Jr���  \~!������v����,�a~
�f��Snh���P����ζD�Sx��+r�х�t�n�gP����;�>�Y��@5�6*רj����.ak��߬ޘe���[�	_�39�
�?��/�?73Q�𙒪(5$��<�"�{�U�;��> W���}טp�(�J�F����|����}�/�{��	����o�������_�aJl���y�B#�`ϭ'�8֯U�`?Y�t}�8���P���rМz
m#dN��6���,��{{��Agdg�w��eKu�=5��S�Tν��-��L�S��&�%>�:���F�|��n�3�j����G۵����+��bh�sg2K���|�R�Im�x&[v�s[�5̘\��7�if�7�6��^�?�0L���8l�l1^�!��)N�'��&M<�+�����
��IQ�~J�I��L�:��� '�uB�M\�D�����z\Ȑ�饇>z���֥�KǏ��;Fwh��o߽c�3_<�>��s��|l�k}'n^�馥]�CC;��]��]cʕ�{zw�.���j��O�<�^��lN��Ft�I�}l�7�?���������^K�z�duY]V/bɽ[���e{�,,�v)˒	�= $$@B
��P	<�@^h	$�4H!�?s�,o��{ג,ifΜi�9�;w�yǝ{�<�&�u���1�0P�w�]z���1��Doo"��9~��E��fț�H��22���XWRS�@��t�9�?
�74U�9i��i���E������mnq�7��ʹ:Sɮ`�+���:���Ӟ�z2������k<Jw��P�
����җ'T~�s��
�v6����ig��CoV�u���yCL�����u!�Y�a���Ըbm[o��-�n�P$$򛎞�r��W�/�8z�\�PT�޾i˽SM�F����`����l��7��>g�Q�+��Ʀ�9��i��dG�Q�RԵ��7��Uj{y���D����OnTko��N�qr~���J�\q�Z���``���
���,�T�Qҥ���+����P6���48���C��������Vi(c�I�/]7;���9�&>�s�uo��]U7�/K;@X���`�AS��J�T�u�=g�{��lk�ɫZ�^o��Jqʺ&��5zw������pn�3��4���_H���0�?t�0������i��n�,"]�ȅ5"�r\����<5VU�x���H#��}��֦���!q�z�ݔ/�z� ���Z��\���g��R�s&}���IJz=�}vzz��I�q�"�t^�e�0���u�[�b(wK�߿R��-`}"�t;�nݺ�
�f�K�SB3Z?cg!����Ө�����ZC�>$O��<�Q��|�A<sbn��&�Nw�OWWOuvLy�¦�&���ޥ(�^�ed��MÇ3�C##��0���x6P��jQ�>� h��\�֧�/�]��]�9��� 8���L�:�R@0��e�7��˾�g��/,�ϯ[G��ϰ��Ȫi�sY�A2���$�"g&l�&�b|ߛ��A�nϽn��I�Hp��h'�M�~q�<U!t�(����s8�
�Dg|h$(yv�d)K�q�Q��:��?��'[�]v�g20�&.cZ��mC=��^w��_��ז��V�jb�����N�e8�wW�90O����j`p�	�s��^�����]@����/'8����vžT&���<I܅�٨�dp
��
6# �(�<����ܫ�g�ej.��p��
�YD}��N�T_�i�E�g���[�dO���v$��1���I��FM^̂��{ 0������Z�����1�__'��S��M����u�լ����Y�]��_y�����dJ#�&!�
��M���]���jC�_�su�g_��%�����>��+���3d(
�X�.�sgk����G�♻������d�6R�M�⓷�ře*�U�m����k��JO���WM��z���a����8�'���P��D�-Va��"`��Ӊ�W��4�F��Q��p|�� Ԃ��{o��?�S7��D�@�����y$X>�}{� V�Ƙ\�@�\ �0�Չ�bUw��QmR[�+7�J��R�	������V�l�Κ����d5�1���bLG�4&9�d��(�!�&t��)����2���TWKW��h����s�(�I�-v&�2L,d�輣IR�<���d`�E12
��K��`���c�,E@�R2��+ �u���P��~A�ϗ�����I|/)C���I*�V��L|/�\~�PǪZ�Ff��5�.�ٮ����������{���;s�5Q�I�K2H�Y�	:i��]��B��`g��=D�t�R�G;��寘:M�!>��s�o��t�~p%��?� �:�k�[sJƑ�5)Lؚ�J%_`��6|�JΜ2U���<����/��~���	d�l�?�������/�f%E1} �I(����ӷ	��uu[ȉ�HHz��/��$�lŰ�бnPiNS��M��ن��,T����8s��k̷�W�wFY���vúZ����]KG�w�ƥk�:ᙈ���
����?�ÿ�~���k*@8��*�>�j�V�^J�G2��Y�
ImbCX �*VF�<IY�R?���'��5P]��9�����t�#3z�Lv�
���r�`5b0t�^)vF�T�]jwn���O�;�l���+I��Nw/r^����l�n�k���"<q�*����_���c��y�F�J<�K=�b�>4�W^޽>��������ܨ�R��hT����J�ޘ�l��
�ˆ&�l��ڴn񦲒|@���b.cg�vF�12<��U�G�l|3��Yp�G���
��>�
���/g�c���q9���&�]�o2c<��U�;�?0�	�i]��.�E�kڅ#X�E��p�4��Խ�^z����U�7Ky[��kW��H=�.�P:� Yy�B=�.BZ�K)�~���k�H㞎��Ց�t0ՙ��&�$�m���x[GG��,���h�����|���Vxq#�p싅o��
�q��1�G.(Ӆ�������~��$_�p^U�G�b��y%���J4��;��l����ߣ�M���Q'x�!�jhH&��:�@ �b�y�	�8�K�g7���ϟS��g�&�n
Tj�o����kL�ȶ��A��C&���9�;N�`���P��e0ʖ��x�“�a^0dTz2|�u�������V�nх�ږeF��3%,Ք����������m����^�����D��7���:�L��D'�&x����@�P�$#IL�pfɑ��~���*�y��[�_��['O2xK�G����MXwn䳝ʝ��S�3�	�I{s�z��?�����1?��t�ck@�g���D��'�����1������[|8@<�F�B�#t$���2821
���B�+'��S�ԩd�T:}*Q�&\S]=�ݮ��v�ڷ��=<��=2L�>��e���d��j��d�m�`KkPZU��	��=̴� ��Ẇ0��c��4���⍾�md��qp9���yH�dȷz
X|�aO���z��ɘ��`�v�4ٿJ2����_�喣ߡ�2�@�-+��R>�������Y��ʸ�����
��!ʯ����`�;��Ý��	��
�����5~�%b��g���
Z�R-T�wAz�!c"�d�H1>��l����w}���Ҩ�[sd`�.*._>�_�#\S%'C[.�]�^�\�h��9��1굵�ƗQ-/��E��Ș��`={�zP�MEH�*�iԓ�͎m"�6a��&XXy3
�>�'H
�ͱ �E�*pi�u�Av�U�-�Ti��Y%Ř�l�
�A�&O�S�+f[�uS��_/w���o�<��a܋��^'[u�w/�ox�����A&�
57F-�*Gt�؅�ɨBa-�V���+�$�TVG\$���4���9
	��D�{�3�Y�%��v�Et?�܀��{���(���"䢆�MS�5 �3�8`�c��`�M�!VQoX:N�
��q��]o��Dq���6e���X/�6
(���)��9�����Rm��F���砎s%H^w��W���R��9������9�cM�}���F��5�O���ngK�+�	��4o�P��0�muzCr��}C�V�U��"���6���Q��U`�߂r$�!�|���=�omY��XlyWK����u�v�|��J}�Y��{=��mri�D��s�{�ښ�ƩYeE�L�v�\�ʚ�%�1�F�)�rH_�J����9@��M�8.��yP�@<����N��[W���^�s���u�͉Q�۵�k�^��O+A��䉻��z�����-Q�+ՙ�dSG[C��\�hp�!�LPN=��p1��d!\f��m�<���$F;�I!�#����}����M��-��&
�X�M���@�ޓp1s6���N|�A|�ć���U�1��G�q�k��&�������gc!u�ۓ[}�KI!�i&�[�| 2�!O�c�|<��ӯ�jcc���G}�L���W

%����^�<Pvr	�i_��c�%��Þ^g.��np��s9�<&cA�w��7��l�O|?���'�5[�y��1�'	��&��QP*ՒPP+�C_��hI$��@e���n���,���G"՝a.���u�����,A��+�y�'P��@&��_|w��Q!fl����j1/��H��0�P3�h6�����D��ކ����Ѯ�k,���]��{��)��z+�hYM`CVs�c4U^Y�'�K�ri��{�~t��Kw<�N��'�b�V����K�+tI(�HEK�ǿ��|�~�?���-�������M<30�����Sv1v=�&�֠t�S���;�/}�2R31��*B�Nl�����sC���j��_RClv�ɶ{�j�3(^/�)��ê(|�������߼�������Z��O����D6]�fv��3h����%H�����|����G�^�Q,H�;n�t�8[`2ۘ�QX~zف=	۷�i �`������T�
��>h"~.�H H�k�\��mK_�U��V˅6��%G�K�6I��Τ��ar��QK�=[���A��=�Z��u�Dqv����Zhs��;E5�/[\���	���J5C�䫺xHs���i���ۢ�����k�5\��G5����^:Zm�e�
L��&�����������o�Jꋦ��?!׫W�LJ�c�$#�ja�����S���D[d�9�o��ۈf�c��r%]�gE����m���h��9����S4F"��/���7�=mEz-�
\�N�b�x�oh� (\ �0^�efnDc�,r_m�����Xc�ֱX=LVc������+�{(��ƖV��3UVR���C�i]@,[�f3X���L��a�-����r9)�i�V�^��<q/Hg33�G,+�	�/��2�/0��/����S�ab�*Q���̮[��n���Ź�_5���F�0�v�����q��m��m��^�F|�*U����nϽ�{/�`�Y��Wq��_����蔽�����Ka,J���K�cf�� �� ���%_����\�Sg�
�����)!c�U��:�l,�f�&'�����*cMOѓS�`a�]��]���y}�?������1�e%� \Z(�'�\=���*�ܥ-���$�Oc�}�G��O��omjb�̤���Yvrz�NIo�~I����r��*p;6C�2������<<}uk�M[{r��uc3Gǫ#@Q�ͅ
�NA��:�a�z��Dy��D��oW;f�T���|��)�b���d؅U1N���u�a��l��#�	�
P\�]mm����Z��e�9�==�$N�:���6�c�ĝ�*�iϢ4�WB]�v��(����U�i_or8��M�2sy9_'h����L����O�<�2˷� ����ګ��Él&y��ԁ�TsK•s|3�t���]a��2r+���rQ~����rx7���{~�����m��HpR�pt�|r��$3��U�liIP�Q�P��[
e/���Ja�����7�J�&��4?��������tt��!�-%��R�����M^a0`.�b���\<�����)k�x��Ţ(g�x���)���R���Ӱ�%Y�\�Cu���r����\��N�]�\��V��9X(�"1����
�O�b�.�Y�9�Ə����'��i%j��|'D��=���؃ī���A"�� b�w�ut���
_���_:ӊ�v𛩾!i�S%$Ȇɮ�Q�o&��SZ-9����o�2����8���B��?���r�gB��e'A�˚"��
eGQ���?�R��{ÿH���o��l ��n�Yˀ��W �T��4����'�+?|�A~^?����N����cu��#2�'�y�Po�Z�Uo؉��Qx<fi¾�׋�ò[��'$�<Y(7+��t��ߣ���?ObO���;��az�|\C�ړEX
���+`���{�ʺ���4O���5 ��˲FT
��7Gf"���O�OT�o7�tB�����IiE$��w*Du�:���C9���c]�v���|��&zδ��qy�C��{�I�a�af���I�m���ҭ��k{����R���Zl���`��k1��՚ꪈ�]fGskk]��>b��~��X�9��t^{վ���~}��p/[�����\��y�	�v�BE��*���}I��
C›"c����#i/�����V	b��D�5�ȁ��j�Pj��k�/��`c~�	��ɮO�8�-�]	�K�M�~%�2�'T�ӕ��л�QV}����buI�#��3�i]|�����}Q]K��]�!:/��1��H�d^�tY
��Y�������6]4c�D�.�,bh���5���?���6�y'���m
�'Bq+��u���˴{�g�����P��Sʧ�پֿ�ϐ�,c�P�1�r8�{�#K�����+N���_x�mk�����kg��-k�լ�	�¤䒁�ɦ�L�j@���x!�Ť��z�
��7_�X0��c_e�]���
��Ç�<��]��jcke��������ǹs~~u�Z�~�"�3(�j�7���)�V� ��x�#Ya�tB����L�01&[�x�_w�sXL���kOo��xt�){�<u�~�����D�S�ILb�j[�c��e���q��	���݁Zp�?�[�W2�Ⱦ�:�z�x��Wz��Ky��U�9u���С?�;�A�H��x��t�F��#��]f4�:����;�8��d�•ޮ��D���W��؋��g'V1!���@ZG�x��z�3��{�%�^�~K'�}�,�n~4N�� =Һʸf��5�����K�;Ԙ�U�m3=����h�Ĵ�*g���LOeF$�8\.��Z_�쒈E"�MkQ�$�ZF!7�v�y1���a�,�/��5�u�шl�Y¢��m+���+»џ�V��X+/�nzMӺ��
�>KC�����&O�fi�Į��m��b�d�L̤t8nL�IH��I��krH���`��W��
�ؗ
0�5�jWG���c�cf'ԁ��'Ԣc��I-X��P�[�P�,�L�4��X}I�]H�����9}������W.]�Φ��5h�Ͳ�
���i��d
�]
�T
�W�_�SD)xZ��Jrj�hҹ�"�>��\|�Yz�I�����i�>��Bz��-p��G�����0\�>�G��Ċ���!�`��t��K��d�#J[l|"���;�Sxs�+ W]M�u�x���^�8�B��p �"rvQ���J&�7�
ͤ�Fx��,�Xc��<�p��A���Lbv(��˸�P���}{���{�d������� ���n��
݇�~�+3Y*��&��5��}
}��)��]z��k�g��d��r�w3:1M|��m�2^��ۑ�n�s�����W�!��K�Ͻ>w�`O��_��W����]��?D�1ʑ��6D{(�8tOe�v ����	��-/�z�{��#+�(�V���8�r�P&�!hY�B��0֥��&�Q6Ǖ�>�la
�~������܁��-<(�K�wN������\��g���,��9|�x/��x?G�e���Ɓ�0��	�*l	�F��z�2PmP+:��zg��A�{`b��9��wΙQ?�,���(N�'�;5�$_|�������
#�_�F�Lp��C�+$
�˩h�ؤ���DQ�+�ڥ]�:������
��ya�g{=�K�
�S�m�AP]�dž����V�������gI��b|�Tb�`~r�N�l뗲y��34��:��&*�������	��ђ�2*����BI^����q��s�;�)��@<��:L���-E�7I�5f/M6���H,Y�^3��rbq�s��g/�bUډk���/��W�-�	g�lBR������T�qdd���Z��K���E�P�	bG���@��"d����ZV���K8|�^!��ϖ"�+m\�$�/����@wh�wS����r�XC�����hw7��z?��
X�,����9�~`",�*���SI�3ϐ��b��#�i���]��]��Ρ�"*�J�W�J��@.�ΥR�ds>�L�8�
(;C�$��5]RС*~�N�4q:�Y7wu����}��k;��}�v.x�l���XD5khOϞ��=�&�x���M���Ν��?��)�Ml'�
QW#��h�/j�Bs��j2�;�~�8�9�>�)����q�����Lg'��	����/�d{�%G��3��5D,����,�[؉�h윏���U	��`��q�ה�:�gY�����we�4�2��u-ڈ])��6���P���>����������Κ�1�U�ʞ}I��Ug��tV�-�
w���=��ɐރ�ˊو�c���4H�G�#���?2�r��x�����;v��ʈ߷����N�~86:ғթ*Ŕ�������$0%6�)gVt��ٷo��O�Ƙ�>��Kk�↶�-�b��?y��k|IXV�2=�������h�L���I�|��L�Xh;�J��")��n;ogr�Et����(�,���
�`-�Q��tG�\�ד>3�b�%�\a�![,ũQ��J���o��mtA&Ǔ���lf'����J�Y(�9��z}{�\}��Fd�)�V,�F��K;7�۫ۧ&�ő�6M=iC��&R�w�V�F@��4H��G���Q���TW���s�29����lc�}agM�Œ�\(C�0�u�!N`維*p"��38l2$A��Ү�)9nf��B���~~{ˑ9�W��ܡ�˲��k���Ě�&HW�Uv������!C�:>x�
�>�'�^���d�O����A�O�4V�nf[V9�x��8غe���u���T�z9����ms4���G-�H�{����D�؉�9r}��A��+fZ�߈Zvt�]�->�٪��}�g�LA��?�ŁH�d�m�6'�~����ɫ����M�33?��.��65���s�ف�t׬�Rx�:�)�\^���c/�[�j��֐��#���i7$KY��'��~�>]��䌦#uUw����T�
JyR�}HƤ�u������bM�U��Q�4w�m������a��5k���I�3������c�_����ma%��<����
��J�F*n���B	�
�W�''�v%��Э{�ݘǞ]X�N������u��y���_���m,���u�����솆�Gv��in���a�ޮ������I������.��-('ȅ"�E���'�O��tM���smJ����(�fg���E��u�U�K`~�ff:z=�ԩޓ')Z�˻�(H3����K��b]�K�=W��^kC���_ߙK5.�78��ԩ�Sᑠ����{�M3����R����r�K� ��
I�p�;�@g�r���Q��2�������?�{��6y�,��j��w^'�����9v9�/����@�Br��tu���&'��|�vb�d��?�cp9��YCZQțD�>p�:��s�t��V��i㾩��A-
�aV9g�9�&�o-W�Y���|㗳��{6#M(�\~)�E�N
���s��fYw���4���)����CF��C�/R�*��g���������r��<A937qS�S(e�la9>1���2Q{�fM]�Cng6�X�M�	8y\g�+"�����SZCS�<�+�1�|�T,�fl�I�(�4�8Nf�:?��(8�yJ���׮��5G��
��������p�U�k݁
���;�/M�L��\n4R_��snaa�B6���7e��E�M�H�/Ҽ�m?���<;9PU��(��D�g�'��L�<y���ԆԳ`�?{'�y�ܲX��{,�OlQ�L�jnH7=S��E�Sr���p"�8��c��0�5����}m�'�Lw���M��Vg�OώdG�uss;�>�K����2�'�,��Y��ZWn1
����Gnݼ��c�a
V�P�Z7C6��8�n�OBѪ=�ʺ��v]v]��Z`�_u��x������o����ek6l��W�����	�NQQpr�|Ӧ<�"�A�����ԣ����,�y����m���V���Ҿ�Jj�`�@i�������y��b�ƚFF����ZX��3@��l��R�ho���<��ؕ���?ĿGLf
����,�W�k*���[��R�B��PØL����q.񌱦� K� _ou��?z!g�nw[��ݗ������CsC�
�AW�okrj7fI�qa�m~��O�N�[�;[�uFc��>�(�O��ːe��I�vF��BI�}�����.�g�)���������n�9>64ƻ��dCs��`r�$�%,�d�}
y�o���?���"+�,T��w����Z�T\;ܛ��U��M���Z`�T[�f'�k�}�����O��f7�U�x��c�9�1/�<>��{{�����nDHv���Js����&�׹w�POW�@]�j,�=�a�q�5�_m��َ��@�˪�j�Y�z�~
�^���)FF(����#�0�:����
���Zx�؁N�|G[����v.f67&O�;��_��C$�?�[*�F^҆��~�y<c&�n�d@Qc���o�v�o�l���Z�
��|�%;����忼���K� �%Ƶ`[$}^��ak���r2C9Vi�2�����a��)2��Tsʲ���5S���7��xk�22��m%���)"��,�<��n,���5�r5�d⒛�䴀Y�J�������5	B���z��̭�f��Ĥxnö����\��#ܻb[�Q��w���AE�O�h�,ÌC��Mit�T/��ɔ�������k6u'F6�5��,�����U9��'� ���燉W���$�V�u9�^�6.&u���M�	F�gk�m�;�D-i�K�9T��h'�#�]2�=ġ���b�1p�%��(�Qusk��#�����woL|��?�!o���
���)�
D3�[��Bz(Z8�U��(&7�pxmU�qm�@}����R�k���._�RvI�ٳ@_��I��{�-�{�z�]"�w��ֹje}cᦎ�!}��ҫ��;BA�^k0a�m�����%�U7���V�TU��*D�#�?P�#����I,��^�ԧ���t`�g�6�wo}𞶞��-�'�gzݾhԩ�bg�:c�6}mқ[�	6�74�������.O���rH>��8Rg�RA��D��aI�Og��m�t]���>�o��;�n,bg'�ܼ��7����{i뗎]y�GFg��D6-3�2��юS�#s\BI}���jߡ=�-M�j�l�9g���#�U8�ZL�:��{�	ll�J]o3����C�ӣ�k�|_��I�#t�W���9~Ī���?�q4)fi�_��0l~�B;��oZ�����{���\R��PQ��,�
�����ϣ)���,d����I}�s'1������9j�E�]�y��h��R`���=��Hol���J�a�ЗgDnn[WS��/8~mL�7]�M��G�-1��J��ޠ����x���j�O��4,C~I�P�`@�6%=sP�+:���6q�����%��"IHw��{�1�J(0ǜJ�<4��!
ڨ}��x5���*
G�����=����O����k�M]�-=��n�^���0h��=���=y
�>�_�wd��"�<��]�K�-���җC�
�9w�q�o��x���W�K��.�Il�t���Χ�lݦ�]{�<�a��ƺ@x2�o���k'���
��
�?8�>(�p����������V,t(�ZAw&1�f�_87�O��8���¼���{�s~��_����.-��+��sf��G��H?�~*.���0A8+{J��6,��g����Ow��F�]�s�_#v�DC7/n�"�7B9�Y*���L��R��݇��}�&7�Z�F]�w|_�]&�a�ȼL�-Ѿ�^p��ϥ�$����c��$f��A��
JJ^g
�E�����z[��X�\�r)|\
��qs#&f��q8��v��
��:�T~�T��w���O�|��+|&�C�z�5����6��{��X��u�c
t�K���7�_�}�$�MtHP�x.�	�����+\p����LW�[\����|��/U��X�n-������b�x��Y�aL�U�+%^;E
�����%�K��6��f������zQ{��4Y@ ��D�oX����a&�X.cl��,kc�6���)n�4��$�m�eɛ�����(�����
1P�y����;^��w��#Q�5�o���8V��q���m�2��7�y�%�|��P��w�@}�]���{:��w��߸��'}���_�n	[O�:mp[YrC������Y{J�/�]OB[��Mmlf���1 )�rŷ��&��n�(�m�A��:�C؆���eS�$56�m��n�Э���	[�m�xe�_ë�djͥuds��,J_mN�1�8;��$�_���|�*�?��W�Sd�')������|"�c�5���YO��T�i86��+�M���X$�pes
�
d��#É��b��_�~���uv��t���(��TF��W�[���c;>S��Ɠc�OO�w���X���=��rǖ��Yz�b������R{C
Kψ.o���~H,�U^Fg�(Yjd�"�>p�U�_^�ccC��-�w�'�q�r��{r�T�=�
x�O��d.�9v&`ʀ�l7�[�YeW9��u���5���ȹ���0��OEI�7�����ɕ�)L|�Vܰ};��x��?�d:����@W�2����l���G�%򬢰��ݱ��2$�ƽ������~cD��������\k>��֎�9)�>nIA|C����5�A8��f,R��B&��ն��/����:6��q���V=��;+ck7vlغcsO�Ȣ�uv=�?��6&�E}����{z):�j��}�]�����ÙVr��p-~
�;-�M�R:
�����0���'��؀;�r���fK1��';jZ�BM[2�3&#���%l��:�]ѱ�n�ݟ��P��t��֠�d��b��d�<�v_"�UKE��#� ��|����/ݽk_�Ɋ�o�͊�������}�+o��Ɩ��z-<�a�&�,ec���N��M!F�=[�dJ��@�փG{<c�v\gDz�v�f�pHx�c��q��7q��\G�5�-�/7�c���Iޫ���"�KZa����B��@,P3�(�'j�¹�`����YR�PZ��6o\h�!�974$�iܴ��B��FbI�X�\�FdK-ه���Vq'�����4q_CB4v�b���9�;���
��{�|�3��#
%8$hʪr����F����܇�Pގ"
ڕ F�XK"��܂r
�op�G��T��2��a�s12�g����v���ѳ'Ճft�VA
�6g��Z�>F���4���w�
g�C¸�xq�Ns��/�(��m[���h4��<��A��8�ߢ ��Eg��C�ᓴ+λ�����5)���\����2�7����T�}Q��Y(�e�BQ�ݖY�"����#�
��_|��'�?T��_�����������Y��~!�0a��Ȼ2
��E��L�X�@� 9�p�ɵ?��`>���]��<t��&�=b����h����D�A�^I�L�f�/,k�G��Q_A�n��8�Jd=A=*Hd��
9l�0�_1��F�?�A�H
!|$i̡QyH�o�\��ca�!*_jci�&c7Mm���N�����
U0�R`S����ON~w�!q[�$��c�_��6xP�(|�����M�(>;�\�߆�4�|����=V�	5���@��l$�cj�kD_`:3�w�ɍ,Iw�ӌ�}8��'����7\_F�o!ԣ�0�U���@�v�
��n1Q?��ZG|�d4�4'N�jX0Wm����g[����^����(�]be����o��S��a��)b�;UL&��!=�5��&[�ͷBN�B�E���U�-���Uon�Gkk�^�a�휭�3�|��P�
��P���v�$-�[�F{�+�TԸ�{��^q��
��nF�o�o�D�����$��-O��ۋ�"��<�"�.w��2�^R?��z�G� ���/�l�I�W�!�kC����+�N19�,�+v�\|oM��M�8`V�ퟺ�1u�P���U�}�M��^�ک�9�ȇrհF3�C�ʼ��Mӛo�M/�;}=X�hp���{�e�P��F�O�=#�GZ� }u�����X1n����*�y�NSY������7R��o����_ЦW�u�|��p@� � �Mp�@=��ڵ��vmX����a��S2�ΰ��`)
oPW�拺dz�Om�������͏�#�Ccヹ��0,^���H������c#s{�έݱ���
�z'B2�X�]��6A%�,q3P,E��9ayĊ�f*ױ,D���Ͽ��P�9�C�J��Zn�'P���EGm�U	
�C}x�㨬�孾�TK�e˿���99&����2��N����4Ȱ|�{��iW�~�78�.�g#�=��"��@D>��p�鼀M`��҉�=2��%j�TZip:�U�N�%������Y��9�"��.1��ܜ�������Lv�ͥ��I�v;Ӧ!��b<��q,�y<�<����w����
w��j�x{vl����,��Z\D�i?o��������-�؂td{�bKb6���{�ZO��7��.f���
/�{��z���F�Q�H�Ŧ����5���Ú�͚Ʀ��S�f��xܟ�18&�9�3"`7�'���.�=)}����]$���K`Q(�.��o�Fp�КH�jҘ&�����p�8����l�Vw��47뫣Du�ˮ��F⃊9�#�;%!�[:;��5���1:�/FiQ�4�	�N�r��ڸ�P]O���%>L��\�R![�o�7�.s�����
�q�m�C���W6<�C�'�P��i����.�?ᖘ�JW����M�M���Ϟ�����Y����i���Չ�Xa��5X�&��,}q"�qb���:���OK6:^�(|
�����(e'�-��	rO�2�8���!��G��7tI'�S��%]<��R�r�Yʖ��JxA�!X+Ȓ<@�9�q���K�ze{n{i��U �H'���H�nE/@�Q���8�~�e�&6{|t��N%GGdkF�ĩ�Dki���)IP�At�����Q������_�	��N���b#I��=.��G(����ј�0ӣ��j�I�#�3|�,�X5l��S	ڈo�+�V��ܻp�*BfF!f�x��`4�٦��̊��U.&�-�m��\髮�٘�:����˓���[�C���Yþm�ƻ�Ǐ�����Mã[ք}�s���9�@����spW�z�,W?�6zG�}�R5ו*g���&wK���ި(�}�D�E���(�$�3�b+v#o����h9����/6vYx@�%dR�z����eR!δ6ٖʴAf�	�����Q��ɤi2�ۮ5J[�#�!�I�}��w�bē�h@���X�F��V(��@���5���1�m��	�`�5r*Gi#����^mQZ9j����qt�~ߠ�hS�n�t&�s�f�~�����[��E�R�,�֍wM %O���H���/6�9p;�_�������rl�T��'��#�'w���@hzZ�m�� U��V�*�M����L�/��f�å�A�(({f�
��9Ʉ��+t׉i����q8\�y%�hor���S�و콷��^��F��U��x�(3a�>��3�m�m�ЃC�S{v���86>����[n�þ�K/�>���P'�}�ϻ1'O|�k����6t?lN������Ocī�t�=yY��o���爅����I%��/ѝ�,��0�F�i�y��t��-�wg�U��T��+�c�[-�dp�Z�c�
�	���(�E�9J��)�M�L^�Է�(�P�h������P�
̶���X�	P�"@��c��)��(�	x8O���߃�����ݏU�9�I�Lj	Xr9�3�B�_��w�����?�T8i�2q�%"��$��Ar߁b�o��H�Z*r��Oa*�i/���=��O�u�6��&���O��@q�@���ޥ#���(�R{��
"�2sBa�h�	����h��T-cN�hrt���"�����g'�y��Ϗ-��|���K$Fz{���V��3��?�0���ƿ�@>ao/��x�����9���Z���n������N������׳ԳD�d���t�9�~��H@��|���"�09:��AbP6/��m�J�zZ��g��(�
�a
H;@X�tl����~���v�úZ�ͥ(�]�+�Ȇ��6Fq�����\h��`�e�
����16�^�>�B�x�BR���I����"��IG�7)�+g����1����α�u�
[Q��|g�HD^����<�W �Spgt�b���LƗ�����Dw_���T��Z���Y�`N����'Է�o��{�����+��WJ�G�_�z)�6P��XH��9���pO!��+�����o��m�����K��篔8��겭��{���WPo���9/�̘=
f��U�s�=�{��Δˑr��δ�Z��[�>ҿ�1��maH�Ba�Ĭ*}����׳c�zǍ�H���U�I���?�e�1uyw��&���f9	w�}h=q��E''���A��C��Iu���}�ʘl-?yt����1iӭwf3G�9L�.1�uJ�"sO�
��*o�6������+r��Y�y�V���U<�ծ���U�x�cpjc�{�?�$3��?`�G��B�.�߭�����N�6��j���y<5��
�A]�C��?��s���i�z�]����b[�,A	��.��\�p�L$�ۅe�y\U%0Yb�P��Y���V�P'k��B1G�͈�|�����XZn�F�īe~���a�PƑ[U�6[�/d�ԃr��!+/WU�E<�X�1��&�����P���?V�2L&�H��J��$>�1(���ৗ߅m���W7E�
.��q���(U	�AX.Tjd��
�])���j}�Df��N�۫Q�cZ~Zi�T"����J��
���2���`��2��R��O�}����*�E�h��TE({��#E=���8���_b���x����T��Un1��Lg�l*W(��-:IU�٣��e<���jry\Olt��Ғ�Vr+r5�9~-�M-�i�ȩ
�l�L�pu�*�.W6	��8�c@)�(�T��׊�}R ��Ta�P�P7�ؘX��d������V�W-
ۋ��Cl�ӻB��e��MI�$�R�+W�];R���\B3窄�J�J������f�\���K4�Ur�[�R��h�17���\H5pJ�29�#RhEbn11�����O�����*����)���f'/P�
��*���y�VW��=��f�Y��.�[�1B�fY�c��wEa��@U�d@���,3��7����
����ݥr[w/�U
��Z #�{)~r��u��)����
�Q�e�J.��,�{�^��f-K�jTJ��J�T�R�w�ep��Q���Jo-�˘^�^*V��H�����#l�����^�$e�"��:7��r��R`=��U<n�g�%�.��{*�p�V%4�D���6��R���x<��0P�3��Ҳ`�H\��3]@"�Ů2�MW�`2�`H���1�er)LD
z"�m
�}�1�ոT;��b)��|�=<�D�ǿ�n�����r����#�xDR�Jh�VU�v��v�.`Q��Ry�)�)n+:*�k:��z3���Y�����j�|-�%���*���(�~�ݦ�kT�*�M���\��ؽ8�a�Ur���W��2)�����W�z��S�?$�u2���̗=��PJ
�H ʐ�"ބ}�0Qnm-��i�#E�Bcͪ(�]~�E%3��v�x��(�&>��F�O`6y<)}E_V�e���]~֫��}�>o'���S�mB�P&�q��_�>��	��*!�J�J>�L-�=�����WA����MѮr��	*� ���xt�/GZ"�R�ܢ�Dc~%�%�k�Z����,Nm0�����P��6�odx�����|���+l�~�g�U�7��u�����a��^�ӇhQ[Y�$x�փ�z�L��h�U�Z�SlW�*�UZ�7����eRE�Kk�[cr�],U*5UR���Av�(���j���⻔��o��𽛉�9,��.\���ҝb;��a'�ߌ�C)�n�}��޸��J��P�^<#8����zxC'W�t
�Ն��FsJ���Ոo�[���k�Z��c�H�t�H���TT�ae
�VZ�F'+��񷮞�P����^[�2h4�r���]�)��$��r��K�jJ�h�l��o���C�׬�z�^��e�f6�˫-Ƹ�B�i�:��`�W�EԺ�i���G�\YQ�b�fQ�T�	Zx��@�Q5ٛ��j��R�b�c3P�c��QF��JmG+��NS@ξ���5]�-���U��e>�`ILNi5���nim�ȅ��A��U�+tj]��kN�Í�To�h]vUX�/G����	��hE�o�������>F�m�k�*7S�3Ѯ^�Y�3��g�ގ�����Y����g%a[hQ�<f��_�a�E�ɦt|c��T�6��q�@8��w��m΅��Ry�����J19-:ci�v��|���H7���н"!��e��ϻ.��9M:M;_�M��!��g
m
5�������Z��jˍ r�[l-����ǰ����7Gy�p�]�##�W���O�Y�fǶ�z)ܻs�{�Wq5���m�ھj��Z��*�m*��*�b[�$7����۸���
��NH ��Mc0L(1��=���)o߾]������wN8�һsߝ{��ܹ3o�^����P�,�߀`��|��=���A����/�sTk��i
��oo�Ù��H�	6VuXAɌy���%eZYKJ}Kuwak�#�%��JZ��\ō�n����8<���f�ptI����&:o�ɖF���{Zx�o���pt@A�X�m�*缺R�2[wX���䚁�m�%Sڌ��\RX.�,�o�3��o��o�]ޒ�f��6UN�
���T����r]�i�//�(���{8����HMnQ�5�˳B���&�k_M�Z�tC�䨔99JU��n���M���q,��}$`���KHN2/Z�B�����q�]-�c�#N�Qy�6͠4�ʵAu�5ݨ0����s���V�@�ӕ���2+�Y�"u�ט�7�H�no��r�R3�n�K�Ł?N����>w��B?�j�.���z�����]M�vG������I�h�PLcy�<z�͇�玕�l�z�6�̵�/yʹ��lqFkKK�"I)��xS��%	H[�'��o�C)�7խ^Wjj��n�![���R�5;8�g;o�����P=$�����"I�A��4:���'�䶕P���㬥�qv}���B��f����X� �(�2��yB���^�ps���7��B��U�4��N�\ݦVΙ�9{]��6�����������w���'���M\�L�|r�/�\���$Y�+�L�8�Y�H�ݨ>9,�*2�.==���2�(_�K�$�&�ͳ*��Y�!C�4E69����M���qRO�V��4&�)�L��i�U�7nx��݃����9��
��Ң	�[�U���RRj�OI���z������РP���g�:�O�Cu���N)�^�F��1@L�g��I�9V��8������g�����^wO���߹�	f���-�*9/��	|R�.
P�dmH�[X��:C��R*����h̳�Œf0q|[�$2R�9#��W#GD㎇�q;������@(z(��żI�$�Gӂ�^D�`�
��x7i��`x�&{H�|^iE�3)JI@�.���O֧@ �W�]�ն�J��ygmUMy���rmGY��#��(/V���S�Y�jU�Io���g�
]���N�]��QL�5�>K�c����r�����&A��툞��][�^Ffƒ�TSnR�.-#��V���� iz���WԻ�r�"�E�a�@+xysU�J$)�"�Y�Ч�y���z���c��?��W��l!���<p���dy��y��NQ��senq�D��=��JѠI�S����V�,)�Zה�L��o�kN���L�d�6SΗ%-
����<�O�,B�)�)w4���[�#�%��JS��5�x}M���m�|러z����j3�szu`R�M�+i~�ŗ�r����]G�UE���pܺ$Wrȉ�ﵖ~�'\
�^_{�������nb��viΠg�Ԋ<�>��+WSiѤ �k�Z���ٷ���3���m�dg��W&��Ҥ=kJ�&�J��9��[S��G��\��0WU�����P`�,ċ!70.W]i�xY�#3&�
g���?
���mx�.�=j4����Nآ��!S�
�W�}{u��"͙�x�沟��"��b0|�D�Z,�,��Yj�Ñm��8��?�l~�t2rK��"� G�K��/SDb��U"���H�N�Tt;��ә�Ew�8�*U�*H���H�L[�an*,�P������/ɵ�Z�P�)�?j��j[i�VoE}�~�j�&�E��|��|;�@���O,2�2��I�,	��@��2��f�h(o3����I�E�K�a�"iZ�R�s��֔]%�F9�`�@���l����XM�PI�3�	�#���թ��[����Gz��n�����4V��[�����~��Ho�dm'�á�K�u�-�����$C�Tt�3=�J뜺M���J��0��ž����gDC'���3YEËҹs�ga8ӜS精���_��~Ikp������]X����`x��io��ik/7؟����뫼z�+��~��TSfz�lm��`x�¹��A_K��LS�C�NX�z�Y�2�j�I�)�c���*5�B��LC��q�Lh��]�a_������m^h0��T�<�<Ö�n��83U?tw�֚�=��SF�p�U��m]�9�̴����2K�ev�֫���:��[��V���y�+�;���Ԡ������/$���5ߘr�) 6^�ٸo]R�eE�p�~ԅ�%�X����*aߔ��'r�xᔭWW���O������̒���5Ķ�b"�	7�
�7A�e��>pɸ�k���u��y����٦M뺖�l^;���Ѯ3%tф�d��Es����SHF�M���;�hv���⧊�5���Q�@�BR���0�^�Ư))߼��T��J�
�*Ց<븞z;5�#�D+���]����Ei=Еu����k˦Wt�we�y�
x���iSɌ����gN�3���Z���R^{-y��ִ57c[1���g)���O�#0�}r�(������3��PS}���f/�U�2g����?r����w`vw��I%�
����@S|�740i�wL|w]�V�]�'ų�I$�G����s�RɶS9�.��t8��(Ü��_��瘪M�rQ�ݩ.��4�몲te���C�{�Ҥ�<6�DuIL;�K��G<7�ȼ�?�v�b+�LCFu��{��ch���{�]hΕ&�z&��4
���:<��Fx��N.�P�1���ayak��"��m`W	x�2�=� �Q�#Ʌ� QTьj\>5���i�tPk�Ot@KNz��{�X���“<|3�{9�Vb��{�F�U�7�������͡�iG������8o�ݗ�`h0�VT�mqqGI�8�]���ʏ�oP�΃,����*<����kS�� �������|�;8Q*����ݽI�k�5k����g��PMccO�5�#e��rjf����jA:#��.��ĬqG#�qk��^����z��7Bv��U���R�K`�����{��E���Ӎh#�D�H���8���b�t�(,����׉l�!��7eʠ����-�meك�5����1g���H��~��ېWt#��
���D�G����I8G��h7[�"	_ׇ���󗓟-�糷��|�O=�t���k�,r��;����T��HjI/���<C��g�-�Mκ�	���}��@"	�w��՝��[ϕKE���? �y4��rYTdI����T}$x�4��h�o;2����|�2+Өp�Ȼo���x��\��*BZ�ؾo�}�}��7s��Y"u������9m��-z��`�Z���ě�/����qG3�m�NRdh孭��2���f!FY��˩�~���S�&-�^]��89�����z�-�o~�����
�쎏�+!lN�h����@.���G���0sz�YTt'6�2�*��,�f�G�^vٜ�m���Ql��3����;@�/��4/���\�7��z����7"�T_*�?��QY�r���/�s�ɹW�o�A�N*~���@m��Y�Q�#�I7�I�\;宺�F=��#�p�5`i
��>6f
�\��%h#�cj���Ҵ,�[��{Ŏ9>1�����%f��4�L鯾ʞa��:�Bim>�Orb�̣roD�
�T��P=��9���U�8�5�t�z�|�J�JVi&E�W?j���v�"���#m����*�`/A^��o���$��*��/���VH|�Ύ���/���Z�6��>i��:���F?�L���{�6s�wj8ȭq��ɪ�Ux"�����
�,��%�d�P�����;����ROU-�������@�q���=�%%�v�Ϊ�L�F)I�T(�e��*E�J!I�+�&�)C��!Ԥ%+�2���,��^�:-E)�HQ��f��I�[T�>~���2$M�f�%&�͐�Z%M���Ȗ��ZF�H��8DG��JK��4�
6����6���E-ݵ]��U%�"E����8Y���;J�uk��b�ggU6���=���Q^����Fv�C
��l&
Q�O�Y0m��wٿ
�%���Vo���o���n��:gT����� �fz���$Y$ˢ�.S`A��ҫ�W
�N�x�Y	͂}��}��_���nP����B�OUcl�rkS�9������r�Tp��0�.��֥&�yM�]�X	��y���O�
��#������32�	���!�-�|
�	�^x�%PU7�ki��u-�t�����nm?�s<]�l��墉�Wz�f
�!�p{��Y��~?�b����N��H�`�k����h���+���p��Ԋ�Q&V&)�Z3��=u��׭h�B��-�\f)�$I�(���J�����f�X�xX>4���y1�RN��DψG�Y�4�\E�@c�����%==�U�{���i
�M[�kl4��ڴ��~Q����F��i}���{��gx�n<x�3�̻��.{L�.�K�)�<��X��9I)U���,�����Pp*�� ��r�T�.Njih�	"'��cU�%x
���ƫ�H.��W�����Ҁ��jd�q��WQ�9���i�"t='�q����n9�8[��	vOGa��2����YVl�H���Z�^�*�*�n5p����6#9ծ.�t*��)W���'a�%��m���2��a��@hA[Z�F#uK*�4i[�8��2Ӝ��nL/
���5�
��(#u�%z}M�����<�g�b�������p&��JC�֓�n�R[&��r���RZr]�̚r��D鲺���'�jf5�_g�fd�ef��:�'��є+2�y�8l`3��vz����ZÁ�0�k{����3_s��E�kTꂨ�����	���N?��o��$'D�-�K��Q�h.�S:�=�O�+���|<�o�=�#4�2�~/�۸Ӹ��ϡ�t3y�=��N��Z�=x�̦.J���TYd��˫�����>{�kC3�����5���(���0�J}�
~�0�fK���������O)�f��+

�y��饦��tUd�Tx�V��n�N��!5|!kU�@^�\O��T.*�
�fd/���D$�qkд@�Z��ͫ�K$�~퀝M�ո���`+�U�O�|��;����q�bD�>���"�!5�>���]���U�*�;mz[�
xq�ʔ�P��o@p&�> ��;�N�
��~�����xzXO��<Z���["Y#��4|�Ȇ�M�2	_���B�M��3iL��nT��ֆ�>�Q,���D)���"�����`CM����l?�!���f@z����W��H���N�XӀ�7�1�Vzᛕ��?3�/O��^a#�>�e�$��icTd�Nk�xa$��OD�:�qgI��ʌ������;��O=��C����"\9r,M��X�)�C�y���!�/B��^TB�&ɩmURGY�>�XP��ǠU�#�":?a$$c)�ѓ�ָ�L
��3C�lfs>��Y�\�lav0;�]��=6b�L��?�����I�-l�z���		����D�h"��9��lo�����Hݎ�C�{�#�[k�Uo;������`��\��4�|o�\��������BF�C��b0X�F�)���D�O���e��,�2�@��|Cp�/{﶑D������؏�n�qp��`So�8�#�(���v'�gߗT�"�٧]�{J���)��7n۶�שQ����m���3��{��?�����"?CDZ�II<>?>�_L��.�[&L��8�zY�Bm*.��[4h.4���sL6�U��\�#W_ϰ>���pv~����ԑ�Ph�ty��|�]��Ŗ�O���p��q��{����/�����l[��@�Sf7�m�iJ(S���-�~�Q�t�X�r�?M�άg��K��٫.`��3ɜ2յ����R�T4����q_"�Q��naF+�u�7o�2y�	quW�Mٽ6%}`��;�lZ�k[�7�R8�ݏƋ��HSỳ|�V]���.l0	s@_����zr\��I���"�/�*i�M��<��K�����e;
)y^��V�I���o]������dgG~��2��q�+�Y)�*b����S�r<Z N�e�(��+�wn��~�3;U��K��o�,�2�c~<��i��t�DY�n"%aۥ�P�U�US��폯�N��T��+C�y�*MP�
��Ɗ����j����H�c��x�7bI��sC�KF)��A9�=�$Y�?s!��7�o�}��3+����rp›���|M�8�\�H+("�R�›�h.�)��&����c�1��YS�@B�8��M��e=���Έ�WrpfS�<��#���E���	��+��p'��/��ž��8��dn�]��{^x)� #&gW�l4���~\A�e��!9�uU�պ�B��܍�sso�"ڛ2�(+\ʋt99YY9����_~��z������њ�A��^�i�g��g�ќ�Q����'��ࣛ���e�x�B����*�]��/��Of-���&)m��)���$�$�N�%��#u�2��mT[���T�۟H�
��+ï�a+�!�3�3j�gƀ��FtB��<�C�	���m�U ���o�����$�\�7��4�R�W���g��M����:.%M]QU#�ϟMx���zKˤ��i&<��)�&��]��4n\� �&p7?C���+<���x,s���H�c����/sy���31D��p6'Q�[���s��yK�y�LE�̋��e�U)�KJ���<Mc{��i��]zı�l�2�Z%bX)����kI>3+��n\?H�u�k�ڶ���١�~\��4{+��"Ѭٓ�NnlKk�ee�C�Z {�<�e��Ѝ|2i�
&����j�"v�cF�E��`K.R��#�ӷ��>�>�Gx��h�`�+n�o��g.�_����Ϙ3���qpi�%��>��$�H��o	�<���$�s�4�%��O��x��a�Nբ1�8��P��~9�O��a��17�O���u-�wm�S�p�:��e��*�`���Gu�w�-���/�f�֡�89.'�j��9oά�S�y�B"�L���y�����Ҭ�i�f('tm���0����"pxC�U7���kp�{Jg��B:��8<�ӹ����eH��*�Й��ߴF���� ��o��l�>A���P��|�b�?W�6��
�f�Y�W;��6��H�,&v�>y�4��}�u���_�����%4��ʩ��s���	m�U4n������V.�*W�x����͓]��<:B��dQJm��>����[vd����C��6�x�1Y�c“�N�=}��b��<yMM�E���zC��v�ՙ�]����vZC�J�'B��⦲�0�9�;�[9��M|>!���Q8�?��!�����*	��HD��$�qW@�MW�|��L�7���
`۽v�\���'1��w���yp"8�jq{v��!
7]���`�ύ��u����,X�H�t�c:��**c/噣���U���=�>�-N�[:@�7}�
�(�="4���Z��O<)�7�кp���	��h��o�/7G�{�x��7�$�/����8�X���5<����dR�Wz8�hn�Cl�߼��u�� Y�K}��H�'C_Q�����M���Mx�9z�����Uۮm�>k��ז\��\�j߮���,!���,�_�<�DwmTwQ^)���/_A�8�[8�g�B�]Ao��ϕ�l��<I�F��^��Wj��*�_�����#��i�����$����ؿ5������*��
~ㄜF7�zɶ^���V�zk+"0�z#�wp;0a�Q���4cF���uQM��l�eʓ���p�[c㻍�r�H�Ǔɶ�+
�q��}z��~D��.��]N�v	�
�kI�~�3����n$}�����|Oy!}���XE�|B�Kx9��ϓy��Ӧ�A�H��t�|���[��<�f�O���~�!�������mt���٦h{gV�>��7�4�$n,����;��2O�2��ʏ��(-�gE���3������[��}�yD�
���3��A��:�w�-ܻ9�ޖ�]7�`�=6�f���R�!�E�Ծ�	���W��a���H���|���
n#�)"oFY!4�d�.?�\��JX��R��*m�����r�������)0����G�#m:��w_�pH��N'Q;qVL�Z'Ӏ[�{ܶ��57��h������<ύ�k�;::>q�F�E�G��v�@t���E���
�5��ծ��>L)�б7"^�k���"�
BS�-n�u1�g1�,&D��z-w���=�P�鶀��ص�6�37S�9�;�Y#z���'�U`�b�!�hVbTOcj�&���-фl���P5]%x��ٗq}�A��������oD�j��X�K(�����d*_9��8j&9��F����Z�fj����:FG?�u�D��Q]���ް�*��y��Kpb�(��!
ߒ�$�#��0בy��9�ïd61V���H�HE�I�D�����ȩ^	9ҋTC�2��\n)�#�8�e�۬R}�L�ժ/m�ө�,.�˾�iJ��*��J��$��9em9�y�	���
���
2�x��i��ch^�"3
�xu������+�7��Q�o��)���Dݿ��f����I�:[F�
6�E��C�Bb�k������`�DIdo��E}5%��6&���-;/4pmcg]c'N�4���RZ�K#����#$��,&2нx�'�0O���>+�S^G�/�k����wM�t�y��^�:q��ҋ���l�����.X�.��^U��B�������9����&������j��ϑ�ߖ{�%/F��d<l�m�}�o����
�TX����H���j�Z�8�Z�xv�+���)nE� ;g"Ki.�B���֥����i�`Sc[�greY�%�2�j�k%���:�ed�ZK���u9�--Vuf�\Qd�[s��";���d#��یn����|+�c>#p��e��/7���@:�r��mɢF��2n�*�\�_FU�4n��/k4�Ylf��ur$\44~�쉾����Z?9i����ipż��*P+�ꘪ��Z^R᩼�h��`�Vv��X��aԏd�\��{�g��f�o:N&���W�ܕ+V��7�9��p'�9y��|;m��F���&~�v�F��8JEmA�P	8�*�4�nK���,���L���r��u˖�lom
���z���=����1o�]��v�f��PxRo���n��O�ɜD�l�hx���(\��s�2'Q:�y�W.�r2Z���؛���@b�Z��2�s��V��
#h-q�*��J���im�%	�XV]���<���&f�72�P����E&v�q�Q�^ye�i�R�2��Y'����R��U�zQAb��}N.�`�l�"�.)]$NM�=�@�R,�L�:iz�BSRE�']7,6�貫�X�~f����
�d�vs[��Y���*��N��i{����s?@d�<~��o�&����-���D�_�5��?�����v�S̼��YG���3`�w�e?gO�{���0��9�;ON~r�W!qn��`6N���w�7R�?������Q8��o~^����[^��c�������A{\��+���Ulk;�Ap	/�R^>��)��Ý&�.��x=��0�t�_���lZ�T���O���1���;��"���2G�Gr/��w~G�n�����"��D$�8��P�`o���b΢˖���O6U�z���5��kB�?Mm�W�
��k�V\�]�9eM���x����)������~&�,q��y�3'�(�?=�7��s<A�}}
0�߰I;*A�T�I��,�u��L�*��:����RY�Ա��ՠ��HOǵO���1����D�A�"�GE������c)�Y����O�?�,���菐�D�O�����`��?�A�~,<�����!�LD��{�H;"�h���#
i��F��?k�"φ5����^�ooGJ�⾋��^ط񺎓'N/�b���4����{�v4�&�`�Q=���Pg��I��h�9Ht��)���ɥ1UI�KaD#LBg?��g=�y5u���R�����[�\;��ʌN��\�Mj/i����z��ӈ.�-L{��;@	;�}ݗ���l�y�&ϟZ[W�S��u��_<m5X{�Q�2�c�|��G���\Wݑ]U���Z��7�>o)�,�N�l�Ad"7,\��>ڧ,y��2�����=V
�f�/;��.#�5�5�>�o�"��� l�-���mW_�a)�^6~ƴ	�fSa.X�~������Ъzu�m�B��d���4�k%jw9�#�M�w㴺��c� 3{)�������tN��4���q�gx���/�}��
�9m͠�I�T¾SZ�j����W�4���Z��|x���$��at����v���mpiW��E��Ņ��V�p:�Ě�F����������wm�C�lu6g[���+/t4�=�3��%`��Z_��j�����S�}�
.���ꚲp�TW�G�?)��,y+l���W�e=--~w�)��ۯ���}�¨�K���1�vs$*?>X	�~u{n������������.�]sG��������OK�e��T�.�߶8pÄ�qm]�@a�7wn\�$'<��t������|A���e&�[�^�4����w|���g�]u��S�]�g��={�Dr�Z�Kx쪢#WayBy�z\�S��bO�\���ه#5{�%�b]�IS𸯣�����(+Z�<��t��Z���	����5�Vc��5wr���k�\�n�M���զ&�9~��B_�6�O�^?�r��dA��Ig��Nm
TO(t,o[�Z�&e�SCu�|
�mvg������Se�	�;�q�"��ߓt����K��p�����ީL�P�bL=�[;�����V�+[U�ɾC�'r��ݙ{���Zzɕ�g����zf�O�k�:s�<���<�t���jUⷧ�3E���*Jb���t�+׉[�f� �������cnh�\�[�,ѵL�f���	
�WlXм����V�����]�&�tJ���PC-_�lS���Oj��œh�c}��D��M��0��������#�p?B7���{~���#[�R��������Z~X/B�h������kp'�dD�W��=-9Ҽv��E�%E����x��e�`��97�y�ګ��Z����T��8myռ��
��4��E^�)�t���,�6����<��e�	�{
�"'VF�]*���;�u���i��*�"�i��F�C�~)�w��ǹ�
2����/f����M�$Z�w��JY�?�����F)c.�a��8�`kx���H`ky>_=	����4`zI?�05zw��g�s�4�_xX6�k!x#1������a*�E���T���T���sdD���ߠrp0z������7	�B��`��L�����q�ޟyXz����ò^������r`C��%��0H�yȡI.Q�!P�]SUU�US��G[;�9�и�#$�>z�O�;jrOz�|�@͸j������ᇛ�=44���;Y�@��w~z3Q���R;��yN4�r�=�Y�>T�;���v��	[m�բ��[W�V$�d��5�<�P\c���F`��m���e�rK"�^r�T�F��s�����(rOWQ�����`�eM�K&J*s���ƺ�
,tn�72� ��]��i	Y��֍<ZKq����?���͋�Y�u#���nz�dn"g{�7���2�!̪Y�M*}�N��e��jq�E��l}nNí{V37�G��o|��?�)���7��|��[��ы#o����t4&��f���47m�&=��Ϊ�b�)��n18ƕ�N�p囚3"�s��eYM���V��h��Eũ<�8��y�"?���sQ9~e�6�4�1	���\n������k����H�]�=SI�`k^NN"�3��٢�{�I�#�y0 ����y�Z�o����!؂��L'�{�ΛW�c��s���Ի隹�y���#OD���,@8�;w��N��Й���-�F\̵
�3�7zTZ�CS�رm�We��4ʋ
.��2d͒�Һ�f�hV�D�.�8k����8�r�S���g4^P�.��-��d7�{�7f��>�UP����g��b'}}'���~6����cײ�uL$'x
ޏ�P�uT��W�~�CW�� [���8|!��g�}{���{�{����F	>�<n�G@�Hol݄���y�
Ls6H��6B$ނ��]���z��`�^���ތ�'�d������:�Ds�`\�����T�s+��"���������}#"z@����1nN.M��T�Û���/���`F�F螪���˂r�uЀq͜�W�����������v零�P!CH~��C/�<���-۳���,lk�F��W�8__�?Z�<�&�f���5·�!�I�<x��о 8�P١;͂����
@A+/|sqp%�<�y�cpO,�8���)&{�T��5Tʞ�+r{�F?8Դ���u�R!/{* -��G�Hv�]��h�c\;�����U���C�\V��q�+���D���ݍ��}	�r؋�s��W	�`�z�ꁗj���|����D�e\oW�N��� �������Q+��.ޮD}�
Z�A
G7'�.n}݃uQ�~p؀ج��2�Mqm5p�.�Ȼ� �f�W/G�7{Q��,��\s%��� ��{OT?�>��^0��z=8Ip�1������*��� da����ǿg�Q�տ�Ԥ��'���_��J����{. �x:k?@&�^k#�cԮґ!j�;��7!� ��/e'L�T@I��rO�LJ�+�FV��ص��:�����f���z�7q��@"��{��Al��lI�-�x^���q��4a^ή�G͔�{�=���=�ّ^����#��A�|��e?��v��8�Ԕ'�"���q�p�^!�T�wA.��j���qc�oD�O4��� ��2��
�7���]����,(G|7�"4��޺O���s��}��Y�d.鼨]����̂Y�+������e;Uc���&��X��y^?�v�g~.�x<��}þg���.,y�Ppߞ����x[���e݅+��st�D�e���K�D�*?�`�[ˎ�bhR�l���`AT��J��Od��*���ʷ��,`!QMJ�]q��,<�,Mpj�x;mg�뷢v.�oa!��m?����Ľ��z3�~�V�zr}�1K�N	﵁��c�_y
ŵ�"�eF屻���0��J��GA����M��*���؅:��F�F:�.���!��R�܋P��{d���� �/�x�-��-�ג�Y\u��㇂��]��ۗ�%������X�~�]	�}��ŽW���.Aȟ��\9���Su���-�Qۜ���:U��]��ئD6U�w!�Ǘő��~��Q�7R�U��߅�����P&����S!ߔ4�E��y}N\�4އ�����5A�i��;⟎��{��ۂ�AO�
s�CB_��޷O�%�iOC���k�������=]b魪w!d/wZ�7�>��h��W�_\���&�]7�����H�^����g�'��f4�7r���>�=�U?tI�.�Veo!V)W�#<U}�*���^�mq~2���҃M���� (��9��L�}���`��廰�W��qk����U�����(�;�+�����]���
�}�����b[������&x5X�b�O��Q��`�x{��{��p�-�;�E�F��5����M�i�Ȣ}�.SE��U�~_��'p)[����5Bԕ����H�����[t��hQ7	\���ۂ�m�2�}����}�[�„����=Y�[v*�=��m�ڃ������1'?)�o����_(�����\w�mS7m}4���\t,|�b%�Bc��q���i{��#��isB����w��z���v˨��q9u���-w�~pt�w_�
���0�&P	2�l~�E����@��M��[����1vLD�/pՒ���5�氏䃉���sl�߽��u��c��p=;	���g}��N]0pՊ۪�\�,�T>�si;!h�ۯń�����p8�]!���c0b{�}���C�/���Ķb��o�q0>`_R��5�d���؝�bۯ"��>qۍAp�GAP���`�Q{��p��$~��ۊ���N�qǾ>�		e�߾��pޅ�n���]����W�p�a��Q�k��t���$�'N
������e1�ӵ��tf��kw�?�<G39��`�+�r�٦����&w���m�6��M��=�%���m��.�#�b?������ѽ�}�#*�y�q�F�P�m�{���PW|���5ڇ�߷�G|��_Ɣ�5��G�o��~��O���#ȩ�8?�
�
M`���Src�(j��yڏ�}�}5h�Q�'���?�c��E}��_'b����5!��g�x%�g���>����"\0��~|#�k����t��+�{�-�.���J���H�熊��bu/�'�O�e@Nf�Q1V�s}��eG�X{��?�Ӡ4��A�'i�Q�|٦�K��t�?��/���7������ɫ�O��Q�J�~7=U��i�S{�7�q��"7�Xz�� ����*En'OQ���J�/K�?‰qx�<M�<[��� 8�~�D�f�]C�)���x����"k�`ɍ��x�oC�gJ�!��?Q��Z�^%�L�_��:d��
rFa��LUy��'7!�<�9V��+�g�K��O_�nW�:j����k��	^��x8F�8��|$���w͕E^�p!:�=�kU>��|�|��Z�eR{�F��vդ���%����r���0�;���=�I��k:M��š��ZW��J�8�t��f��-7,V���}67�&m��ԃ���;��%�W+�R��} G��?O�h����ܬ�윜l�7��x��y~G�^
�4l��T�ܒ�������!�Up5i�>Ω�·:
��n�Q-�(.U����Ju���q�ޅ+�m"%����-��*�:�bN]$JRVU)�T��u3\
M�~
9[�ǒ��ݬ���W�*����_
_��7e�:�r+������Q�@ug�3�:�g�#�i�Ku���_�t����ނԲ�Zg��[��+�D&A���()J_�j���+�}��H�_g�-H�y��7��������� ����TJ}N�_G��M%zC1�^w���i��|���������h�sr̦�3<�	�n�k4������px�!���������:��n5+U�GRW���(T�2x&��hL��&��l���6x�s�"�4��r�5x����
[���&]�d�p�0�?��/V���!d�ϙ�i�һ�����Z)eV����0=�@c
����L�sQ�O��\��~Gc�b�30˭����a��j�P�*cQg�`gg��2�����w�	��v�x��[8:r<�QPC��k,�D}�-R�lh/Ft���H�W�eQ}�`���m�v}��X���9S@�4��Yg�>�;��!�NNQ�kr��v�E�"�FV�W��GɎ�߆1˘�Hl1�½��j&��|ՠ�"gBcR�!v�:s��re)����X��^*j�Jk;��[��s�/5�j�W��U�\t�E[� �<�丅��I�
�&��**�C/�
{�2K�K�e7�
A�=ZpksR�i
.fD�
T��������{ý�>Eេ�r���>�$߼��F=����
ɄuN��Z˪�,�(��fDXr��MB"�[e1.�o�Ҧi�]x_���	��d3��t�2D�:�,��Buj�^�[�r�}�e���|���ײd�4�R7��j�h*�R7��/�6�m8:V�
j�	�_�� �t��G�����G��
7ҳ �w
�3򂤞�&�3_�#-o��;���'���ߢr;���`O�\&���c�aJo�(��ާQz� �7w<B/!�G�$�����/l��C�������o��N�"x�rqj~�85%�?����_��\D5)��?Εb�m��KV�r09��uc���Q�7��kI�Gq�xqz��E�X�H�G�r�n�ޕ��(^��}�Q,�o�DÜ_��—
�X#�oh�:�[��*�������/�?F��>a�b���ś��
'ԣ��[���M��
>Β�>�6�?����_>��"p��C5�����+a9�8�W�p��~&�r','�ǔ�p�B��~%���۸���	��ɵ�G,ףD�
E��o�pQ�	�G-��s�Dx�*��P�!�M���x`���x�>>��0��
]NFJ�X�S8��7�XT��~���ί��#No�$ٴ�Re�}E}-M��!xF�jPh3İ��Kyơ���t���#ʝ�]zu����SoZK�g̗/Z<�%���s��E��*�'�r6�/�����x9�nJ9���Q9U�����ɧX�D����=��{�:�ɚ�S\��3�?lOE9O��gh�T��=�-�=?��Ӆڳ�)'mώ��"͹�$qѰ��"|?�^9�ؔ�!bs�����`��r���g��t�'����؉�=���R�3�-�6������	<Ү���)��y.�z���jCfz�9�ˤNp	��e��C䲾8�Ⳟ�'��̚�l;���y.�0��F��?�B>m��1�<��N��s�o��\c��|�
�8>Q�=E�\(�����d��zϴ��7�qN�Yw	�y?!Ύk��(���8:k	�edm��q�����'и���2�J!i>���\�;q��i�#cP�u���3��K�9
-��}��=U�U�b]��@���y���'�;�y��\cr4���g�]��{|&�s��z?�h����o����q#8!�8�ck[�����d>g%�5g��QC��l8S(3Ĉ�F��#���r�:�5jI�B�J��:���"7ed���Lo0���(���5yV���k=fѬ�5j�{���h�8����םb�۳���M����⢫��o�Gյ��&Ur˴���S�6&/X���5�Û����3/w�[G/��>��L��5�2Pݱ�9�o�))/�.��^7X޹��=�<P�2���L\�n�oAN����B	�L��x~�����@��=�w�'�Y���C�9��Cﰂ�Yv�
�V�4Ep����J����?ٰ�g�/C*�Jc3�h����s^b��ke
�L�솩#g|�F���F�ޓ�[��Oi之��}2DnVGR�����؁Z>hN��i4�Ӥ�o���9��::I���uG���1�H��<�?���|�_��i\�UN\��9'f^"˔Hӓ��(�����h,�k	����V�y�
c{�ܟ��}M�I#�7��O�a�*�~p�!�Gk+�S(�džjA4��c�A3�M�Y�{t���D�M��y�Ի���9�_|l�ώ��~;��R�:���W4�[�k���w�X*�U͗o��@;[���.�뀟o���M��c=���"��q�0�Z�4v��E�^oϼ*]يၹ+J���u
���Ԟ�m�(�e����~P7\m�
¶ˁ�5���D-� 恋u�x���(A<,C<d��I�$l)��$9|�$R+([rр-�pm�WY{�H}�Lgo3t�9�v�d�ހe���<� 6)�[�:M��Җ�����5��=]��*�t۲|�vӲ�=B�z�,3�7;Z�*��x<S�+ƅ͉��XqǂǴǹ�n$���7�LeG}',��kO��;v<�q
`���$z�G5T�A������Lt�L�x�a0�������;���>������h��Dp����yx�~���9گ�/<#=��XW]��/\����ן��yb,�(����9�w�N<��_����1��y����h\���L����ؙ΄urnL���pdD�$.x�/\G�M�6˹~��[����X���/
N:{�z�g.�/5�W���4~����;�Q���#�RQ�Ia�ig$4�������p�>�8B�	�����ing$7���a�wq��E�$�07&�K�v,�b���z�V��6��|����=
V��Gc��OT~�+�_�2V|F�)b�1�����#y�Qz�&m�mM�����2m������ҿs���;�Μ{���[����&(�S�F�_&�Ǎg)/�혀~l{�i{��뿃���N�����gËoo;m�Qrƶ���{z��,��SN�OYd����
�U����7�8�7���c\m�+��SlyG��v�ߏ�Q�C�����=<��E���XB�fO8�o2�h�1�;�g/�!��X����'*?ɕ�����x�/�\ϕw	�y��8�zV{H�v>�ʡ��s�/y:vJ�rZϨ�2�|��ZN�e�r�>v��VB<�N�n/;m��ӫ?^|��i���#��G�Eڧ�OL}4�LYd^O�Y�w��yg>��x8������V.ל�l�ht����{���#Z�.*k'rr�YHo
?H�'.OM�|��ᇸ�KI���
_X���p�삼7�?��)n2�ry��;�/w��������#�8y�'i}�J��~'��N$<Jb/�� ::��C�&��`nMGz[H�Ha��S�|G���{VX�S9c�ߓ�������+�k��F�-�u�|�%��~8M��o��7	���%�G��P��8��|Ǐg/'�q��X�3��OF߿�Z��S�c*-ψ)��
-��8��cW�PF�`?d���/}A�Or���|5������~|�/��9��HxT.e�;a��k`=Q���)����`�JGz[J�i&���[���{��~�=����ʱ=~��/g��2�|�[�|���_��u�Y�)n���f��{?��c���.�8��2�|��ZN�e�r�>v��VB<�N�n/;m��ӛx6�����%G|;�i;�‹�On���κ/#r�c�-�4A9�n�{�L�n��[���-�Y��/f�r6z�u����φwR>ƺ%NΓ��Q���u�����C�b�ӱ�#�i\y�<�?���O�(��O)VB���,x1����՟
�|�4N���1��8<�<�?�w�}*��vo�r�$��2y�����{c���=��/��/��ij᝔�a���8)������1vOP_��y(iN zW�INw�]3�N��#�%Zep�S�#�T��ǡ�I�R���|�
?���0GxC��N���//�~|��/[�hV%ss!��_!Rw�-��\����$���?��8�ւ���J�%��{7Gc�E�>�@�BDg?|���pr̉ʁ޺%��1O���	���h=Ne�&�;"�`�(��C}�["x`�������Q|��D�Ļ�rOE���/g�2��1�]B��\��^�60L=�K�{"�_�K�a���(��2z�+|�(U�IY ��u���,�lX�̈��u\y\�A�����.E�P8x/�cN�p{������&�}��+��Di�Y|�h���H�Ax�����!���J���߉�f�����|_n��������5�=�';��cRN��͢�"�g��i�E�gA��嶸r&<$:�-���S5����b�ۻ��K��~G�u8���NΧ�=\��#�9�>��^���?9��y|�Ng8��8|�HD�?����{��÷2std�\���>�9���C"7��]�m�z�
C򑟆W�~.�����|�+3��¿�k���/arz|����밝��9��^��B�ptZ�;	��p��r�_"��=��gr�˙L�~
�+c����G}������|u�O���\�0nKaQ���RY>��J��?wN�dZ���
��k�NOA0�9^_m/�nRg;ί�U��զ曳m���d�q�{��`�P��Rx؟MZ�ѨӚ�}���,�LMO�,u�\Ã�U�2�Ԫ�����P蓤�S���:M*�Q�ٜ�m2�3�L8��~�S�0��_��C�ׁ���-|u��E�2�$@������]j�M�c�Q���Vv?4/8e�I�Tg��Z͍��"��Z��U�����`�UU�x�W��r~�cWN]���Su��azzfz"3��a�8HA�c@( a#A�*�auwǴ��D��uE�]��{��^��X����{�=��s�=�z�\�l�e���R��Q�~X"U�.�&2(�j��Ÿ�
�����E.��r�L�PkuB�V��0�fS w j�Ț�K�j:��N�
٤\.	Y�1��J��FaW�w��S�����j"����UL��Ոg��Fg��Z�ґ�1�m�N�e�v��[î+����”�QM�&K���Xd���ZMyr�T����g�Y;��@�
��C)@�b�G�0��9f�0��<�t�7����i�'}(���Y�QW(��i��j�y�w�fF��l���ƭ>�a���߆_�'��&d7a&h��/�#��
�B�_����*�#݊��3G^��
��l�
��B�����N�����y<p�]t}8~�N=���!y3�r,�x;�������L��p&�u.����r��.���hR���@(6�$߁��g�����)CO`���_*�I��\&��|UxR��`?|3Bͼ�`t�=�3T#�V��_�:��Cv-}�5/�w�7K�''>xnfWRh�O$g��,h�*�گ�-"��q���z_\o��p6\���m�ض�{fL��DbjI,Ib�hءе���Bv4
�z�-���Zؼ���ɯY��~;a�Z���	�e�w�p���6�~���c�=!
x����S������9S(!�b�~j�z�>�N"�HREL	F��Ҩ=k�OD\D�j��Cb)>���7�*�FF��)�`Z0	�k8�Ccp HҜ'm�Hk��>@^���rS�s�Z������]���);~�Jާ�wT
>�M���h�A�!���1��/Ҝ>O��_H�>~�(��4ILM�O�K侹fa�#W�,MO�%f��}�l;xH��$wOi�J��g��:|r�T"Q���j�t
O�X����-L�ʥc����Ƹ�P��C�K+wW7�M`��a�A88):�}� 3�
(�����g֟��okzb��P�]�j⼒;<w��>!t.��΁w\e��o(6oG�o��`�)p*�ylk�\ 
��i'z(�v���00��9�7p��OAa�$�)���Ҕ
���3�!��x8^�Y
Q�J>1���Jn���٣�*%�n�xW��d���&ل�h:�&�т�cpP%�-��,Dь���駚QJ�j���y�U���������`��9��m����Ha��$@śU��!�tN$ILG.��[�F!��&�=�,�%��\�,�,������A�W���.�ܜ�~����	�g�R�\�i4R�����/��-`?��#��A.}�K&��*���W"%�b�����7�Lh5:�7��]��g�觧�&	���."���Ǝ�����|b!	��K�>���*��hjO1Z�A鰄�p��snz��G)G���%���N��3���D)��u��GW�2�K�-�%��R_�7�7����ܣ���}�j>�1��?.��t��5��,c	�N�4�s�j:��I�������mC�jh@�m��C����ۤR�V�.c�i��\��Q[ڠ���/�œ᠌��m1�;�v���C1;M{������F�f�����[vœ�sb���v�쫌�8�=�����s�=+,�(�D:\��ˡ��b^�F���^��Y��!��65���=	�iC�9�[KYn��b(���/{�ȅ���fñа�b\�/#
�!��Qk�*+����09�ůW�_)�j	�
��sp���<���e%j��R<>���Sl	J����`���S�[M_}H
�%��Š�M��"�8ګ���R�W,2�ٱW([+|X��re3���܍�|���3?����@�֛x��0 a���f}��d�8drC�fO�fVg���IG�ps6��~����u��i��j�;�U�p9g�����bW0v�n�Q����?�����=؋�y�7`G?�U��_�̃߸{��xjWt���s�}���U����Zl�-�ㆁTz�]W���ɘ�WW�f�G{R�(m[��2+��cz��t[-�^�{16r����B�B�
����^X=�ǸzZ�^qJ��Bm|��z�	i����q��0��9��H9C��R�tN_j���w�\r����s§3%z�3�lzϾ\n������@0����A�Z��-��͓���iUE�j�F���xݏ�]�����xr._����j�w.A�(�=��P�ș���	X�E��<�sn%�Žѕ����hO��~P"��
���\N1��eS�����N�Ɠ�*���G������+�~�X�KNų3���|f�@{�Vz���v/81�K{��_%k�y�k|��.�L��.��اݿ�:�ܖ�ow
g���/�\�������όOH�K������Xlr�SL�<(k��V��|�_��Ru�=�ЎZ��tњ6�U��G�F~N��$oC��֙�޽�g#הe�K>{��ԕ�wY����z��נ=6"O�Em����s�<~��vre�k��.����m���}���+��At�y��ԯ�J[���CŔ��_Ȼ��OpN6N��gD����V�{Y�T�iA��7wz�X��C�=��Eã��N��A��a0:���࿡�n/�r��N�j���p�d��e2�\F������[���HvnA�� �P��υ����d#���Q�2�3r��ki*��7k���M���4z�E�P�dU��VI�+0pV�l�гV�9q
�T�v�0�ނ�<M�(�b�bK�	��
68A��3�������D'>K.P��7��M@f~�'��"t\�*軩��r���o�=�?L��&�8���`�z��������o�wS�݌�
~��'��oՏ��o��X�$��,Pq]x��j���O��������7�;���;kw��,�PX�x}��`���80�����80ϧR>5���x0��{�.�[�ۂ�/п�]�?������'�3u��>�����F�����Џ�_���F`�+u�_�~	X�.�|���W����@�4Z�Z}��N��O��fh���9�fч�C�["n��c�T�3wl��!f*�L۪�YX+.НY.r���#F�Yh��vX�����F����G�5�Aw5�8��n�>
��g,E_e��7iq}��}�ˠ�cnZ�4Q���@X����a��p2��'%*�4=�&�~p��_��L��1.��-���c��Y���{a���.���d$��&'�w�}�p�.T��]p��D"�~f�l�C���0���.|�Ge�G,��7�u%�~��!f	qx4�)���.��K������kh����Fx#���x���E2O$�3X�B����%�/�������2͕��S�Zs����"�����C�\��~w������@���ұ��D�p�}�*��`f�j#����2seE1��	hBH TK%N.�1�!$P�[ �s�`a��1i�vS/���K�
�GC�U��=!���/$ K�f�C9�
w[.����$�Q^�ZF��+�K�#�p�`�ж1��QC��.�(^[zG��X��n;�ld,��F�>�?��~撷��6�d�E1�PatTH�X����m[��`c���*�K>L60_R����>�H�����Wd�t�t��ֽK�X"��O��cCz�g�i�sr���?�r���\��Ś�@�-�Ή3�u-{�~��oa���>N������Y��[`�1�"���q�.wxa�TБ�@\�sÏT�(O�B��WS"�R����"{1l�N�BÃ~��x~m�2��|\c���b����K�.w�<N�}n�Q�$�eU셏N�����]�Xdvڽ
��
�ڻ��9N0�齎_ȍ ��щ_��s8'��7����O��5�-�#���&]�9e1y7ݛ��dY�&QH%K4�0)<�Qc@A�&��ϗcC&��@���J�N�s�A�s�n_�9��z'lw�8��a�^�_�U;�¦��V�$?�_� :�߇���]���!Q��Ґ|b�k��'97*���ǀ�=�FG���<L{�铌҂�X� �	TCX�'�b(�L�4~:ﶘ�*0�/c�?€B*8iɝ��"
�g�{�R�Ӏ��m!]�ڂ��&΅Y��=�}��e1.u�Ӗ�V�|��HD�f�P����2�cN_4s=�)r�B�<��^��gz
�䆙@���QyJ�g"��wO��ER�Z�8>�����$�jxY�}�
�>��aAH�G��ǰV��ⷁ��h��ad�u�>���FX�2�zl�0�+�0Pt9��
slDT��@f�v��\��֖~�S�f�g�G_��||[�t��~��Q:@$�%�٫D|�ۯ
�Ԭ�y��rPq�n&��~�sצRf��nll�uÊ=��cJ�<�ĵ�oR���/�j�]t��a���$�t�	�*��sm)��a!�2Ԋ�὏�5Bd��������N_M5�0YєN�����$��ˇqse�ke�ɴQ�����_�
�00�xR�!jg�<��Zi �'�����+S#;�؛�:��p��dh�n�]c/��Qc`2���*G�mZ����*aRs�jʻ�n/�s]��t�J`m��"�0g��}^����������ҏ�4�̝��e4�W��gɿ'	&������2�DP�v�K�Vgr��w�>���(��ٚV0����K/��ʔ��ƮΩhq�\?��,�D$}8c��%[?¿�2�ZC9t��җ��]��N��;�[������%"�^��['�&����b�=<��Mߴ��6�D�E"3�cȢR܄|�EAJ��Y�FT��ǘ���h�X�uz�0�wG�W\��NZ��S}H�뚱8�9��Q�Y��Y���{$���eD����h�>%��z1��f�=�z+�o�{����>��x�-.�+(��
�
��N�?���s��,ÁP�vc�r�|�K����k�
�:������L3���g����2��og�=9]��Į4~3�iu
SW&0%��A!���ʐ^�j1[쁇C��}�޴.�tI9A�^M7��/'ؠmȘ4��<�t�4���a��Ҟ�7��b8?v[q�E^�u�߄��åj�`�+Q_c�ne�י=��S��kK��馥f������mc�G`FP�������*������8X���kږ�jr�I�!��s���@��&T�0��x	�
�ڰ�m4Qze0��A�{��iN:t���W�\���IB��L��Hā˨m6�P�2S۱k"5V���\N��0�:���h�Qm���h����L<�]�`ݤ҉���R�$mB����#��K�gF7-�z�!�*E�	~=T�X�D�:��>�IQ�M4I���B�ޛ@4y���;��a��׺��n蛃����w+MC)�ch�)+'��*%L	R��)��X5����b���/;>��?å��!��"|Q�Tz��Ӵ��=4QYM�\]��F�\�t���](�=�����(L�J6a��W��F��\����B�.�����o:i��a?���K�&v�/]�A��h�ٮ-'Ʈ��\e��i�H��ѳ8}�'���x���#?�xКՐ�TFwR��{�w�h:W�{�C��PM'�~�A�#6� 3���q�;x������.�=�Tj�u��„���b�Y
����āva���V�.M�Bo�����v������Oh�L��T��l���_�c+`�5޻��)��_ͼ�K��E��_M��N��w�P��j����+�tu��FР��;
V��P�P�ׯS�4�;܊���}��ygp+���Ј���2Z����+����#����V�/j~�"��R��w�m�0)���I��=rX�Mů"�0r�bd��
�A"<`_�0�3d�h�}�Ͽo"����O�S��?�t�M��=h��zD7��e����,�����FA�wӶ��=a��n
\����`(������7�=b��$�\�x�x�Ac�׋�*T/��ދ�%����M�T�B�.�BQi�����aN��a�
�6�Z�8�(B�o)m>�Q��䛙4���d��^�B��7�G�Y�mC��=�����Bz*��=��e��*�A?���?�XS��%��ύ>Pb�L}�T]։���}�/��*��SO��S��2u�'x�
O3�{��A�!��������=t
oˬ`���sRRL}}z�R̰��T�1�p(x�(�.��EQw��
q�++�~��͓Q?템9V}�1E&!�P
�ך�5�<<�*ٍ�f��@K���&_�%�b��X���-�G�j�($]
�T�\ԗOg?)`�f�^2�ye��O������M4��SQ����|��6m��B�O>Pz��G�V�i&���k��]?��ay��K1�-ڏ��kc�����;Z�~�&���s�X��:z�}��kYZn���}�p7d�0^f�҉}����H�l^�� /�E~���3-��
�v�?#}&�\F1�v�ſE�Lrkd,08V%�1�-�pq�L,�����OZ'���'[&�f\~s�m.�ʯ�W��z��2��g�G":��;L������u��f�P�`�"/�U�3��VZO~�2���כ�ⴜZ{1�1�F�G��p��'����2��+tL�$����[f�4=ĭ�o�bj���A]���:�5il,��֡���
� ��+�vj�?��z�����N�x-$D��A��>��*{Ķ���wݵr��r{��Sv���ڪ�^��W�?�;�Q]�=�o�k�✵|���T��AM����tٳt��'�̿
�
p�D'���`���'��-~ɷY�=���ʵZN����h�)��6}��K؛'~��wҘ���#!<d̎�:m3>Fa.cs�f-�={��R�o�L�6X��K%y|�<�sFu�Z�����/MxiM�`�����'?錫�R�z�cM�0�X��sE��R&1����(]c�QTɾ镍���1��G���J������}1�%����K�_Ǯ/1��C莩���^H`>��E8}��,�(,�~����r�Eby��H�7�?�(�}���A��R�o#U`~��Ũ҉�7=W|&ݶ���#L�y�„-2�I����$���'������d���b�q��"Tg�&Tg^̢��I�g�ŀZ��.������2��y���\�p��Ͼg����'#��?��g�7�N��*t(.xz�e:��*uq�á�n^����ؘ�I��������x��}�11�&]S��/��=��_�{�3b������g`���S�F��K���7���dž�q|R���X�:|M?'�!bs�]�6�����Y����{�g:��w]����~x�4��u�
��:��sr"$g96�Q9�l_��������R!\	���nNNd��"u�l)GҀI�)����;/�yX:����i�R.E��o�Z!7Zn1������i����.u��M��,�߆��T}>���t}>�zw����c�/u{���n�|'F��:��=Ի�\}^ށ��|�
B�n4
���F�X��`}�!/3���V���w)��\�����h���24�P?4͎����4�����j�{�\��y�ޤ�ݐ�`���=h�4n��^���S��e6G d�kp��;^g���x�?m1��BX��_��sD��٧C��̎LxqF��0H��4�-��jz�x�%V3�H3"��i�+�^�,��ben�82���,��q�����ԑ��5jVg������^��b��ܘqT�{��)y񹡁�����AǴ�-����]��K�R�Q���6{�o|��͉��X(V�lf-Q��N�,\Tea|z��W�Y	�W9(8S�;�Z]����S��)y��T����ci��O��ԊgN�I���m�kc������әL�e�-֢mf%.l�o��Tpyg�p�e2��PpXەلw#\�PL7�k�Xv�$�}.+�\��m�r��m�V,�c�!�k+���Q�
���-X[�ӄ~�D��ԣ�:�u�h�����|�e;,��gf{�_4801��<��
⓻��3��b�р£��k�j\��)g�@)�J��n�MT���C��iv��#�"�[�l �r�#v��N���m��(z�ys6,����io�S�f����.eE��U�U&��T3}vsϰ)��w�5�A�eV�5�R�yB�æMr/�\y5��5>���S�����D&��j�k�-��{�U䋭1�q�����to���ԥ̟?�Bj�w1v��z��6����[���PK�
��9s|u\�i�-b�Z����F���V)O;�
'מ���[�v@ �f�>��ްS���N�#5��hs��3~��)o���<�
tx�G�Cm�a��v��x�NSc	�3����H��2�8O��Ņ/�u����XlZs��V�K���@
��d͔N�s9���{��/s�	]�/�Z���;3
V#k�P+�d�1�s����5�x�
Qi,���Dq��iDR�m��j֚�"o�K�Oa�\:�:*z���'�kRa_5�U��&27�ret�^I�\��M�{B��S�<�������h�N�P�u8�9���J����:fh&�kW�����=�YJ�_S;�]8;�f�J�_e9�Si]������tǂ��>Kg�ej�*ԛQ��d���f�.�8&
���2MF�W
7T-�rC��\�i,����>_��I��S��5J���`��*@���h#b
���Q�7��}�zH�Fn��*��}���ĮB4q�Z�%���!!֥�	��%�~�Dn�)�+zw�D�~�X:*��2��
�|�ɔl�}.�z����Q�N���#+�hۇ�2B�髿f*�"�[��Ʌb맼��YQ�����#�Y��L:sV��5�78+{p\�!zV��Zh0�����ֵ)z��մ6�!�[���P�J`�X��ə���I�	2*�5�J�]��b%_]J�h����}re��u�u�JS
�,�cf���F��Tn��g�݄:[X�^��0��U�D���Z�r�t��:?�=��߹
��>�W]���^����o�~7%��� f��n�Z��M�B�V����-��o�X:A�/haJB7ǂ/h�t�A����m��YY^7�-X2�:�[�1�����Ҷf�6���goy���Y۠kyx��h�ܨH�#��.�s�P�U2mGʻۤ.m����@r�@�7���?si�-Kq�G���
��g��JM��;�z"�n�8�V�y�o��;v��
{��n:�C��x����=��_��W�"Ƚ��"9LL��l��������w�p2��B"U�_�$���n��l�g{��.��,��}�*]�A^����ۼ�l�;'vL��-zS�Uk"�'�[�G��Ropr�eu��c&�뽎��l�,��Ҏ8�It�-{;���-�E��5|w�~|[qxK7g�1n�`��7����“�@
D�[��1��lu8���%��a4��F��q�{b|M����XX?���K`�\�xr׈'g��rX�E���%�kc9�{����_��@�^O�/r놚|�Q���m.��af�j�|&�
�4�}���	�V��-���7z��8��߱%AL���^�O\ �r�	�b���Bmuu�}��T�Z��ؠU;c'���ckKx�z��T�[p����e���qŬ�=�3ok0�
��#	�@t�w3���?ȶ����ID?�$^�3���ٍ�y
��:�xPc�K=�D1�J�ʡ!�[�a%V��'ƦF�v�0��O����m)6�c�O�ޞ�CN����O��e
ц��H{p7��&PZ��b�0��GUn��/�s3��6��M����;�^`�#H�}z��R'��h��jP.�<Y��1���f]��_�T�����p�G�:�}�:���P�k���k��$�Gk�	�S�å�ic8�5yUf��0d�%��Wk{��)U�ڋ^f�B@W�]A|����/@;·S�v���`:-�qot���,9,�ᦿ�d.���6̔7ߕC5��v�n��)�ZR�1[<j5DV"�O�E�@�ev�����rE��L
�٢�K2����i�cmvo�Ek#9p���C��w��
Gߖ �reP՘�te�>�x Z�f��V�ҳ����~}��_
��v-Tg?�Y�r�?�b����|��������u�y�����[�?A��W
�ںn��Ï�z��>�b}��Z�G�j>��{꧓qlDݘ��i�3��k3@�PTv�3�S��:���0����l\��4]����ٕ�;�LL�^�i	�gZ6Y�L���j��h
/���,�&��G�[���8߷��u��:v*E��Y�����x��١hfhKz)z��=J��}��ѓ��Gkt�����f�(��kto��q��̖e��|�s&R��T\C���<-Cj�K/֗�OZ4wb�$��a���e�w��
��}K�rzb��-���	%>��&m!�Iz(S����$�-8D��
��c�&v:�n�9�C����v�_��)L��'�`�_Z�t_�l��`���E�#�o�Y9H'�H4o�"��"m��1ca6E^Jjk;h����9��6�h��p��=Q|�ccc��:���#�I�S�t|`�}�n�M�5�uk�Vۦd���=@��Bm�}�uuG{��!�����������q�43�u�8P�A#�3g��-��1"R�K������-dP���׬��Z{�c�Zc�����J̨̫��&"	�Z9X��En�8]�>wVK��a���X��>�h]�����Ӟ�������A�4��#XXk�_Gآ梼�(�$���Y���X,Q�h�*a����e��3�p6}g�`֚���P�7G�ޫ%�s��a��4n��R5kK ��oX�,8в�wm��g��]'�+�ԣ]J�|Vrq�O^��N�#J�?@��4,��"0h^�����F]�`.�_b�P��\���Ҡר�K���[��%;Z}�H���O�O��yg¿Zx��k3�M�ی����u2
�Vގ�j}5��׾���.WMP#-���&�H�3j�����<�u�V�J�+:�z��K���o�����v��-�o�����O�L��T�}k�G~ĕ�#da�Cz���G�7����ӟ�v���W/�Q5锠��Dp�	Ic�<џ/9F#�'�����
�u����_�oЧ
D�'<jn�Fo�̚ր�ߤ�K�`j�b?�u��Lj�Q��E_A}��S���m9�4�kE*���%f(if�J��l@�zr�Lρ����]F�+��&�K�u��c���?����O�����8+��E� ��`��ϲ�@��b��G[�a.ZUUz^��O�*�ΚN@�y�W-���ާ±X���R�ޫV�& ������Eџ�B_<<8��EB��	��I�bt��}Azf�4���!U���:l�Qo�~��l�ͣ�5���y1��'/�����xƭ���r�f.:�Z�c�h��Eᝫ��S�J���n���(Dm��Ary�'�����_8�OR�e��4�)m���F@w��ڨ!p��hҚ��+[j���k:P�5�d�mQT�?��WX��z��#�r�zS�Bf7%�V��I~�@${�J��;3�Ug]6�Y�=!�W�"C
��(��.䫙�8�5��k�=��>��� �c��::����P�i�%��a����5|�xuw__�?D��;�����;x�4JzM{J�)O5��+��
E��J�|�	|�y�K�ޔ5D��F�å��\��Ugw���^q4���߱w�ȰTx___z"l�5c�E�oˎ�u˲!>o�C���̨�s�^���cY��6�7�z$4�P��b���H���O]I�w7��=5���i�G]��j�%���.y�ۈ�xW�;~3��

P�q%�񐂒3a�����.8y���Qa���|����=���T�U�����@� ���8������V'��Ug�IJ䰯pe�|+O�*��Z���6y�l����0C��,R����Tw�|�|?�5��*�k���*��>��j�������C�9T��G���w.�o��w"�"灲��0?
��b�l��O��8h�O�����N]~��[3���sQV��mg�2Zt��%����E�Ub�H�7�wMOK�'���;�Q�P�F�c�����`�T=F��.�&-�� K�-]�|� �c�73�3JD˖m������G����q�
*�߹��~��aTe��������XE{����x�mϢ���j�69��H�3\�c���~��e����sM�˷G�����(�)"�gZ(�*7�A��:���ZC����*�
��5��b���+,U����\�m�^���ԭ�[GBn�7�IY�Q�#ᑩ��j��n��
�P����r���J�<3���؈L1������#��[�=��ɯ4���\|2u����s�~~�{.��y��hfq��m���g��x���[G���I��ED��E�)��}�L���|;�&��6-G��t�ȕ�W���H#eV��ll|���F�1*nu8E9�����WeɊ��z冽��y�VrB66�LBɮ��i���*�`N�0�Vr#:xx��*��"�^W���=<jY�����N�.ɩ�ܬ�Y���9/�L.m,��
0���F�>A��ƈ����%�B�����>^0}%1�4k�ΐ���+`�|zBZ��k��P��d&ZC�
�S���
�w�LwU��1��f؟H-�A/O���ҟʲ[0�ڄO��d)��͆��a�4���@./9+W[/{m�#���Ǝ�����|b!	�������5^�K�>����	�է�U�/Ѽ�^A���25��L(k����s��~���'�0��t����>[���M��Q_�3@������]�T-�ժ���鑕t%PL�`�������$��RՄ�������H&�BU�ue���~����M�n�$}��Rg���2�T"V�±�͖LI��(	�=S��ʍcF�U��~j�7\�����0�hQ�oqu�0lc��M(Ή�7��lV��F�
~��H{�.s �P����������5��-�Nb���Ԗ�0\,>Mب����
�ex<-��FC��^�S&�Z�%�.��h�/��"��{S�A�-�q�R���~��~GR/ӑ?v�v�=�����6�?ހI�^ʢ��������>cŰoX�u;A�@�x��G0�>�Q�{���𜹰B��q)5��\!qt�ު3��Z��`�XM*�^&�CE�3�1��M��(SL\Q�o���]�0Ur�S#'�d��Q��0������7�2���]qdy�{_f��5��h{��8vX��z��y��۞)j]���+�k�
���_��&�f�N�{�?��l,/h���]���o��I�%7�Y]ݽ���-��?
<�Zb��F��&Z�I��|_�;M1ƻ�+f��؄�g�s���!�r��@�-;�#%�@@1Ԓuaw�!Ϸm'������C�Y�}�\>�0ן�����ݮҠ
q(^�.���#;��N �" ��G_(G?l��=��!5:[�4����L.�O�Z��q�{t�iT�ϷoÍ�bE����=�&'����Rk�A$� �(b���܈����S�S�}u���ը(ϒ�I�E�D2�n'���bN����!Yi*�sv$��1�P:���=���"��_�#�>oBV UD.�y�GU�H.
�a�J��g†�=3�r�4� ��y|`�QY�������X70��I�%�dg��v
�l�I�k_[��M.�M������MQ�2�GYAhN��`�`���1�����u�b��s6�by��&�tĤ�Qxg��yT[hG�{$���e8^&����ҽ��a�{9��j
�a����4�'��({<<�a��hQ�ԩv#���C�D��M���럶�=��Z��e ^����?sx�?���<0z���L�����ޅY��h>d��4����l���Χ$�"�PGB�Ǩ3�W��,���-x�JX!���o
��l��7���&���73���*LQ����2B��C5�7K�(�w�0�&M~��[�K^��͐Jn�����̬��[�M��&�8��#�~U�o8��N�����N8�jy��{�;�[�7Ʌ�-�1'�,�4��Rm�^�+K�X��za�Zew3�l���-���A�����߇fc�j&^��d�����;��*��hj�kG�$�=y+����`[�t�6;̀��ք8������/�q���S��u�Ϲb��cWsQ����<���`��X�z��:��>�KHW�'�yC��Y�Zi���"�)�=�(~��ҭN}�o����i��ԟ��ϿE��K����wI�vBe׍O��y����m��>��S�i8���
��qmV���%��۱�	��`$�v�7����jp���DJo�y�8M+S��ě�L�U��ȉ^?lJ�f�3*��b6z�KfY�D�j���=Z�¥W�D'�٭�#wA
���Q��dǺ���-�kW(d(F�-�;a����,Xc�*�UJ��mI�a�ɇ��C�T�V�W2d5]�`��fГ���ު�!?�Ef2;����2?�6س9�	O��o�ԋ�Z4l�!��<��+�Ғc,���6�Cx�z�'؏q���Є���f���s:^���F�,�����`����d��
�`o=�wׁrx�|�75hR�I��d��s/c�<h�ܞ��OCS��)3�Q��;\����?L�!<Af͘=Ԍ0l��bT'R�@(��oβ�a�R�U�9}�wȗ+.����a�������=�6T�?��;Lff���17���_��3#dX��b�P煞�4�=\+�-��0��_p&�\m�:���^���3�g�8b�,�Vžx��Ѧ��>[tSs�\�/ߊMy�w�b	t__���Un]���d �q��O(�si�Ú����瑟k�k5�f�"�5:/��l�"�L�	6M����Ҋ[��2[2n�H��|O߂�%�4m�3�i�hN>)���HL��it�������[��D1C ��ڠ��Tlť���#dRx��}>�����3��J�r,g
M۞w`��L�	�Dk���9^SЂ���Tā�����7�¿�|�a�S��K�~N�\�;&"竛��X�T�W&1��g7�Z�Ɖ;ucx���;�����/.���F?6@�Bְ�o���on����z�7��{��}k��cK(�G©�عK��J�	�3�R��o��Y�!8��D�3��X4d��T.����!T�D��M�@���A��BNl�9xط�s/�Fp�ͽ�/�r}���_6��<5�N{�ֳ��U4��+��*��Քªn�L���bF�=#�!o�[)~��C��<^���߫rx���c�s���Kw�y��0��ז�6w��G3Ǩ�1)-�5���M|�3���:a�n�p����N���L�P�&�����|R��A����ճ�y���#��Π-|4��a�}�774!��7W�ge*"�hl�Y�;�k�&Z-��w����Ʉ`
�Q���IYa\�jA�9�+b��p��9w�V��@#*�2�,���j�~��I�؉l�����ߍ�E��l���1��l�J�◱ *7D��T�݉a���1��pl�^��~�`0g��'�1���zz�52�LC���->�h�X��\�jU_ b)w�&�)�?��31�W�"@�&amN��XD�܆1��!��Ϭ�R��!�2w�Xt��hֱ�F��Y�i@�n/�]�;���)���=�ZL�n�B.��z��"
>�o����5`�����Ə8z�"�<K�x:<�1>��R�^��4� k&�v��Jy�د%���x�{Ъ�	gd�(��^
�ϣ����'�@�3�.����Y�<���8���`������/�8��NDҦ��H˂C#���o�o�*��Q��4N��n�V���G-�H���-�Pi:��W��n�s4N����n�P�|�ٝ�l0���n{�`��B�bWw�b�}�whN��+����5���l�w�w�s��ao��s/��sy�V�rϦw߭K&�R|I�K�U�}ѓ�=S�]��]�܄�]]�_g�F#�
���"[YǤv����Sk"]����'L��+O��Dif�2����ln�uUƜ��B���)�-�1�Ųۺd��J��OyU*�C���	�q��^+{�v`����C�KX���,�����/zH(�v�Gv�}�[�_J��v͸g�%P3h����ؤ�t��7���^������.�1��:�b�|���~�����y�ŋʜNB�@��,g�Z��w�/��k�2<J�w"c
<��[������غD6f�m�G�0yx�C�>����`�,@�~��\M�/�WotԬ������/�H�*-̉=J
(p+4��=h�R��5���!A�ƾYs���98x֖�����Dq��K�OS#Ԧ�܇�Isa᝴s�;����/��7@>`��B��n{_4��-L�u^vl��x�5:�D,
|q�;3��ׄ�O�w���˝Nbњ�W��]��T��3{��_��}?�2	�P��t�ɗ~�]4e��2�52���e�z�Y��e$g��T�J��a\�D�o�m0��ǿ�1�i��Z�QN��=kH+%J��7�����ߓ����$=��
���D<"�|>�]�Y�T���Q����c�D�z�����B#��/�
�����[��W�2�s
�h�@��y�|g�g
�^v�2g���h���Q���
B�f��9#�I�N;Ǵ]��)����&������[jk �I_�;"W����wg���)�נ���������Y����������C���p�?��>�
�+�K�>kҨ��"����Z��tB��p�g�(k5/�6=��B�)8��Hpt���6���;%'��h����a����Z��
j��u�U��p]�wz�s��u+̳�7�Q��?B��	8ו�{ڧ�Yv.�K���v�]���uN|� ��j����`�#%/X�4}��A�@XΐIʨ�଎Q:���h�V��4$:�Bi�o���O��Ҡ/_\�&p"=&���s�r�
���~�����Vb�;�#fF��!'����D���u�
v��D>8�I䜛�pF��,�����ۂ��ý�ċI� �m^�nI�.L��lkN�$z�%��u�)j�'͓��LO7�1o7>� J�ڢ���O��6Džf�5�h���3��a�Ɨ��Œj�>-H�kJ���
��H��;,�@
hԨ;�R%�'&ӒJn:
F��[Sɻ������t:�V�Ҩ%DT�o�9R��w����6�k����X�^�WA�Ѩ"�k�.D1�#��B �*����a �IDc���/�$�R�тA����j�N������t�������D@oS��7K׵n����/~N��-���k\� S�
]NC�P,ό�X
�%�0_��9�*����bSH������{lF�I�v*3c��j0��r��z]�#<	c�T7]����zh��[�.*ԧ?�����$?��;n�).Fm{M���]�7.�4_1G5�U/UCSߵ񾋺��?�M�>o��,殘*�3ߴ\���㢵B��kB��o^��7/�s��K�/���G�7-y��S�9\�u�8�||�Z��@�W|Ǐ����Ă^A}єv�����g\[���7��5��}+�����)���V�W�9b���p��7�=y�e_�`��=߹teo��}7n_;R���������wo����Z=��������
໥>{���S�~��W��ώ�9򗷞w�����/��T������gO���_�{)�?�~��Ҟ��]p��XMN��h
k���Z��ԁ7�����+9_ݶ{�m���?K���N�Շ����������ý��թ��?Z�rΕ�N���{>���x�����&�y��;dAߥz��>
�'jg��ߢ�	b�:~Z������@�s���?��yj]Xbօ.��@�a�w��Ez�~v���D����?�ַ��f��/��;�uQZ�N�/�먟�v�^��]���ן����X��}Nѝh�?�P���U����j�E����֩�J떯R}�y����ts%[�(�\�3D:m��L$���'�Q���G���J�\��m+q��Q;�2�l
{��f�(�?���t��V�+���4�Hyp��{M�3{�8����`��UlW��w����ͪz�G��Q�ڃ+������F�05,�];���7َ���~����F#2;*�!`-
��TM�t��ۯ~�o�`|���x�����0T����7F�߃u 4Z��L��
�=�����o=���p>M�؎I����m�Cg
Ç�$湸�&ouJ����?�3g
��:��\ȃag�wF����6�tm#m�[��͠�2��58Pg��Mgα}[�|;�f��N-�̄��d�0R���5���&�e�Föf� α7�-i�&��>�p8��q��9��u���:}�����L5�v���m�����3'ʷ^5�ko��q��ہEk��u������&g��yŭZ��[@�97�����A�ľ-Z��[H��\1lg*�u m3_���̂
_��b;S��Co��YX�:����3o��Y`Q/Gۛb��'j�F-���C�H;;˃��A��ݽp�^��_x(����c+�����S�l-�L�\�=2�-��4�sV.>�w1=�*�����~Ou��S�9͇1��Koyxxڤܮ���צ(���bړ2X�ٽw݄����z=�k�a���� Z�f�o��{�ݖ�#=S+Ҝv���iH�=�k���=�7�(;�㧹�TF���yz�h�Ӽ�t/!�\<V����-��.���]�^Ư'���:��h���;J�����9�/K�����Dy� �͸�c֎|���Kak���)�xC��p��>r�����m�Et��ncc�w��@��ۨ���@�u �WQ��V�.ͤ��R76��ZF���W�󠻻��tJ�ͻ�^b�ׁ��`�&Ёu7X��-l�~B0��=�'�:���$�!D������7�!3��������a�:���w�[����wo�(!���j�P�����"�6��I'�ę���w���߿1���oQ�s&�x3�W�k#�c����l�C��L�{2h�x����pZ��]�D�~誮�O�
~�=�'�n'���}w;�}��oe��F
�\D`"��]����X=+CC�q��0b5�#7�������;�fr$`O��v����ٿ��v6J�ozr�nr��K�.�m���
U�@%��Ƣ�2c����у�4ݫ��+���]gʆ�x�_�V{��}ӱj�֫��{r�hL$6F���'0,S��w���.�Z�e{v�v9��7ۈ5<�>��v�RE="��aM�I�=�Z��h8�t~�[>W�OpZ<�I�x�[;7�G8B�[����7,�H���ܱ�D�H�P3��N��;�r�(篺�ioы��]D�D]Dۇ����ۤ;���n��������3�95ƙD�ڌ�`@�P�Dv�R~!�J$����o[ɷ��*{#C(M~1��	���۰m�m�꾀+���S�a����1bs���H<������xv��k�K�zz'��;{x�m����ZS����J��v_r�����U��ULVb��t��
G�}9�ߥ1l�d��?2=H��~	eu����Fg������\G�/��o|����~����kPF��v��(���,�M�9R�
ɩ��鎵�ȫ�Ƹ����긹����![�A��n�Q�k:g��h`uLq�Z����K�Mt��i���  w��r�7��h�'t���s����/��&p��B�Xf
kP��<x2�9ţ���&�o�%�'�(S@�╄*	񤄰��E�W�u�d�!?�Mn6x�J����gw]_���#Q�1�3�2�?
]��	-��N2���l3�e�&�#���V�Rc�^'�^�7d�m��I;��
n��x��Τ�̞�@�i���n�W?9h,�Ӫ�Tm&�r�;9>_��G��GΝ�$�bQ+Й�mw����h.5
LRpl�N؍��Q���G���s�q�	�#���@��P�Yc�i�]Y���mϐ���o�� �ZY|�l��U�d��\=j
/,��)�/�1~���S�V�*��hD��
j����	�m����=-����M�/Д~Mwb)�k�%C��V[S2��;D�(� ��귧�����%w��b,���d4V(�҈��1�zHi͘	ot�a L*���/8��Q�ʎ��~��`��Ψ��/J1�ܯA���$־�V5u�Moȹˣ}�r�Ֆ7L��]���VS����[��J�+��D�x��k�l:�F.�i
1_N�ә��Na���6��M�vz�F 7�x�ᱽ��7h�À���	����K��e2��4C��G�:�j�A�����M�W(,��	�z�LY�i�*��k���V(	?&�p�B�T��޽*p �
5�՚���_+N��'�����h�96^�������Yx������
'��E�U�::G���\]�
�ss��/|�r�������N�v_��
Z���~K��/suh�쁆��^�������r)��/�N�=�ց}n�=U*OzL�s�{�Dx&�;6y�>���^�7Y\.�8���
�މRdڗ�1��uPt18o���6`ml�E /��w�$b�������w��]�翁�m�?�o��߀܏�H�%u�	��=��!=iF�Zcv1�2�XF��^�<%�d�mW�Vq�߼'Y��[�-�l�:,)�%[�m��ߎ�4���W��6)%��GY(�n��@K��B��\��eK�[���B�]βK;3�=i$�N �$r��ӛ���7����H\Ʀ(�j�X+�9�kA�^p-���c��j�s�5�N�7��ؕA��e�2�Kkqf[��yt���"�ۮ���
���!\/��-b�B�2�)*Q�Fcjs��v�G�R*�%�WC�y��5\�8Q��R�{=���z��`v�lk�F>����H��F���KB��A�`֨�
�5$P{��@!���a��?���E�l������"!:�{/�+�@����^Ӂl��3γ�)��ɉ��)���<��ME�%��;�6�E�ޓn�{���$�`��6S��Ә�RC��l�Ẁ����.����iq*�(��.���I
.�L����&	P(m�6��!
����o3I|�(�=������Yݣ�Y�ٜ5`F�Wk�j]�m����Fkz��pl��|�I���8"5�*J��r�̮�����8����̾?����Z{5:�x.wC�)�֭W8ma���p��]8�?�E�^�.cQʎ�L����x;%�4�ۧ3�v�^�T��n�v�^��贪Ȱ6aI9��"G/�G�����X��g|��J=zM%�U��z����s�� 	&C�FQ,J�At�4m�Ƌ^wŕ��!�����T��Q�Lj��ǭ>}&=�c�:���}�^���3NrO���,��k���+��\X��k�TY�U���{D�_�Q������q��J�p�v.�_i�]_�ڹ�٨qsw�Lgΐj��&�0����2f^�بR��M�lolbN������d{�M�u�	��V�Sܶ�I��*��<
lZ�I��l�fT��Y!�z�K�Ҳև:h}w������W퉱x�!�K1_5����q�#�k�8�Ny��#��,hiR*�6.z�y�N�խlM�uϔ�׮�����@2m���������������H�
�bi����l����}�
�̻ѳt�s&�^]��1v�ܔ��am�D�	�zQ�'y��Ʌy�ϳn���½��=�ն�:+��b�c�Ƹ�^1����Dp5�m�4�l�ze�*P��<��6b<�%<���9A��B7bj	O��k�u��k���q?�q�W�fj�5�ȣ�O;@L���vPeZ乣�_�M.d��:�]m�����-s�!�Tfv�mY�r�K���$����E$�23�
1��j�ј0�Y�����3Bm�*W�A�|��~T��2� A���C/�8H��	��M�>+I+#�a@s��O� �QɌ�cI���5�VyΪ�9�#-d���-9����0��W%�*�� 	����:1�
kbԟdO	���}ݰ�(�F�����(q��ͪҔ�%F�,X�g�@��0V�җ�W~�ƿ�m��n���v��t��B`>��G(j� ��O�K����ݘV�����*��*0�P�p��'�HR68�?;��~��6v�}�F5�k�	�_%J��O$�8�R�@0;X��2FFU�8�FĞ{|ܠ�Pd�O�0Nl��pw�$�l��1v�0:؈�OMW`lԵ7$����Fa J�CX���ɐX�̒�|���=��#��zm�� 4VA�\L��	� !�#ƃC�������8{㻧�uH�!�F$�PNm��y�u��a���8'�d	���د�N���u�I�e��^J���"i(Η��F���}��
�	�.���DR8W����<R�!b"�*h���b���y����e�AW�Ɯ�Tꙑ֦�2@�^&ۻg��T����iW��7�T��
�'�<#��L�q�.͗;��P��!k�,M�m����2D�R����VqO;�����z�x�N��"J8���n
�U��HHk]�O{1:���\c05� �'G�g΋H�٤�d�T�"��2�K+OP�+\���SSzʉ���8�XT�ެ(�����Bx����ޟn�B�n���<����aq�xŖE[޳(����z�5�^cVބX��XmTy����C9�J	�>�?>�ՙ5t��r�;F�߮���Z�m���R{0dY�ژ��ukl�p�gqh��j�i
)��S����yխ�!tw�^�ܡ�(䣱��I���Qi�@ hm�P3tp��^���	1[�f��/��*t�`��(�'��,�T�E��ڋk��6~�c���X-���Œ��H
�k�?���0�s}�N<��6D0m���֒�9��Mi��=�&��}�j����m�z���2xo⟈�׹r�p/Q�W>_U�G���",�\�g�^/�x"�Sa�T(��I>��-�
��k��!ٔ��H/Ap&��e��(\��@�,�@Y%	^S�U��%9h��$S����~�gVN��i8M+kI�ʰ���a�Z�]��ò����.�,A��LI�-)�Ss��`{���rm����l��j��`i��x��'����Zք���
�e	��ڦ���_��&Ci�ḛ�ߕL� !�.,�M�HG�"���L���d���gr>Wk�aϢ1s�4x��T)ġ���p��Ncc�B���x2�N��j����I���+[�� |���c�o"Ǒ�/~j
L����qr�T�k�\^"^-)G����8���)�lW���.i��ђdћ��H�ᴀt�qt��!���#{b6�,�
r��
oo���튤�>��j���\� �.)
O0]��ʍ}�S�*���?��37%�D!��+��H�g�N�׉*G���u�c��o$ϭ_��3}d�KqA�Z�R۠���`CC�<%�������>P�g*8�g��F�m�����$�*yx����5�����	(p��jq��=1������Q�t���N�}Z�y˓O�^��r�����}�&'��>�օ2k�́���L�P�z,H�$�*'V���S�lA�����a	���ӓJv$��*�#��_�'y_��S�$XE���A-����ĵd��P�Fhu6�4��j����{�"TS+��J�u%��Yrk �����[8Ư��h8���B��#��7��u���.�}p�	B��B+\y�@��G�����`d�-t2�P&�s{�g�En�I�B�٬�d��p�ĝ�F?z4T<�E�W�B1X
�d�LZ�U`�����sr1QPÁK��A�D�
��j�+��pPPT��2$5��=�E����M��i�R��c�y�����Z�y�]����Q�9��{��3�P@/|-"��Sf��K�^�_Q~�\��J�����3W�/�ڙm:�t~�*��cά������{37�}��)s��u�
���{��`	��Hy��dQ�Ұ�D�#>�J��
��d�s�pp\=2�u:��C���|~p��Uq���֭s���m+��Evuw%w-��m�67��w�E��]]@��~�u�5���j~6P\>&M�(���9��<Ԇ_�dG'�C�;���ʣ+g�.\~��r6�g�~��}/��uо�^�:Qr`(���fG��
��Gs�r�+�*���m��@�!h�_T�0�h�+/���a�vݣ�쟟3�˷�y$�U~{�=���F�%�.�zž/�EQ|؟z(����{����b����@Ԧ0��D���s�G:$��&�ua@��z�w
������C�K��:��!�gCn���1���*P�>��{�v���L߇Fhg��{�}�%�1�X&aq�9����wL���##==�Ǿy��������4z�Ǯ��رc���^�"�#R�jR�֒�[�P�C�?ʃ�M*��;yl%������w�#����w��tM��m#Έo9�uo�X�
0Q��alf*���v��g.$N?-vL0��������πi1�
SJ��r_�mkn9�m������DDŽ;�9k`�Y��s��U�i�q$�I�$��M���e��м�/�~�_�.���%�t�7�@T�
!��c.���-<���9�0�I��K����g2��t�
��LC����e�	��Q)��O�-}*c���2�k[�`��F���-�.k�3
�dxc.� ���ɧu�<� ě�u�/ԓ�XV�Fir�rZ�uěw��ow�Ÿ={\V�Zt�ٰ���um9���t_k��H����ٿg�] ��k۸��ڷ�ύL�l�u;Zf����q�儮��Jh�_*\�,���>0�[�����h�f�GE9�e2�Chd1�A��O�2��{.���o�K,&�	�`k�L{&�H��f�c��>��B~�b�Mw�z��]}Sm,Jn
���X$�$:Wf���:���m�����dm=t�U>�����&�B��A�i�Hu�3��VR_o�k�O,�Tw�򹇠FS�F��/io�N MB��/���B�3Tzt�x���6/p���ټnGa���
}{/m�4�[����o�B^��/�N�!�"��P�jb��"��߃e`	�1~�m㰾�C�.x�Q"u�]�¯'���JAL�F�2�����#�;V��X}�G�YH��g�i+ G��r���Sw��N�K��.C���-_��ڛ��́���˨�i��͵��vk���p=+=��gA���뻑8����{�Ig?�3���iֿW`
����&�Y���z���!���\�}�}�4fs]���)�@?��ո$��ya���7��@�A�P�X(�n-މ�A�����f���x3��u�;�S<�����B�v���jM�.�C�;��Ro��~m�K۫����+mz�N��nF�~�;�˦r�>4�J���gV̸�Չb�(��D̋�C}U�ɞ��@����ᥞ$�jӰK�+gh��3^m�@}l��>�.8�F4
(�.Ju�.�	i~�ǯ�$
���᳻}s�l�	e2��i,�A����<����V��p}�3��3�w�M���7�����3тH�{�����H�0�G&ᵯs��=�g�-"�yܟ.���=
^w�kUĝ����|���⫤Q}�N����ſ��u/�A`a�\��5�)�s\�Of�S��1�s^�}P�{#�=H��XG�p��{�i( �����-��o��rk��/E�����_��rK��E�m�_�Ṯ��Є�E>vCS���G��?�_��V��lv:�c����,מ�����
�o���cCe@P�F}�΄�-������-���A�^x��
33Ϟ���5Q�D?/�5Rq.'��z7J�KN��:�3���#Ţ�E�W�?L)E���O�rsw�=��j���,Mr��[��5��
����#|��>�������#�7*�]�|�����S�\���:\��\]Q~q1�˳�o0��Y�E�2s7eC�?�d�?��c�A����>T~Y1�u/���Vz/I��
�s&QnX~�W�/QO�|>W���߂��j��(�Y�?-��Ql7���
_5nK{qx��G���g��!����v�����	�t��^�n:�:h�_�j±��~���z��'[��dGcCq�y�:O���`*��s��_(�^X�o�#e~�$I8.�ȑ�,Y��g(ޡ����.Sfck�ׄ�v����<��Yc��l(�����x�����ˢ������,�p,�?��{��o6xL��aR�E��˭���69�
5,3�q.�!z=��?���8F�H/Sf>�#sr��\�r�V��׋n�6��"�QG/M�2K�Q}X�|)K��8^&{n��Gh���3ם~up�����(�Q�P($�ʯ�,Pb�A��0�X��Z�����Fn�S�v�j�U*�M$�4�s�U�Ď��.����eC�dR��S� �F�D(hk+�g,ˤKbnS�9wj��u�ǒ�N�	_U���oVJ��y�᠜3�8j�c���U!��^��N6'/�kM�ު��VJ*�d�`k��C��5cd��F8F�_�?^�/�����?��L ��)�\1Ƹ��r���(�XjuisSτBƴ�^�Y7Ѩ
c���4�7�����:b��>�` �FGĿ��h�w��Y���z�9�˝�W �$�2%��]��YV\�$6L��	�~�N���n<0@�sݻ�������;�F�l22�&��F:L�9nTlȹ,�V�}�.�4$�k4���.����χ��7�r��Fk�7��4�v�V.qك>����d#n��C��s7kAeO/Lr�9��Hו�xtt�7�XxO?N� ƕ�*T��p���P��hQ����R�ᤶ͛��Nm{xڍUMo#E��c'�]��A�V$>��?�ˊ!E�byq�J冠=�O[3�X���9q�7����Ώ��랊�,�Ѹ_wW��~]�CD�z��G��}�أu��q�V�W�ezӫ1^�
�q�j�׌���U�*�������Z�9�{�(�1�Oo���[����ye��Cڬ�Q`��Vw{�W}��D����V}�{+���*,��U��q	��0.�G��
my0�Ц��*	�ƫt��x�>,��x��/E��ї��ߧO�3~@���e\��2~H�*?��\�`��e�s�%ڪ�ǸM���4�9eS��Ԣ5�1�8�Ԇ��EB
�.��1��=]�箧�*�^�?�%��<����F��N��j���Q�D�{�$�v>�*W٥
�A
^A}�����i�E_��6LDS$ �NU4M$@x����i]q]1��o��Ɠ�v��޳Al���?3�����׹!�8>�Fft��<֩pQ鿳���b���k`*����s�����Kw�H:΅&����B��ͭ!:v��`s�u�8��S��~J��;֩6�����4�4���Е�-��z���*��T�)�ћƶ�
@$�
�h
�n�3�Rgu�D
P�#�"�
�`.)�E
)l�N�R%����'W�Aw��g�a�E�@#x}�:���hd�d�^��f~�=�G��\�_�?����9ƦX�����c^����4�1��f��qem�� �tJ]UU�6p��8t�m9�>����%��ö��X4����O�3[�{]�xc����6���N:q�@<�2g)s���n��*�e����0�C�p(�tjD_�Lfʞ�$T��N�i�2aFJ�;]ћ��0����x7��/���v)�Dp�f����iv�ݸ;�Y<1��lj����;��.���.�;	cWI҉.R��2,�������D������,�@�v�ԅ��2��,n	��0n�S�=�mi��O�S�C�[Z��W6�?9�m�N�a;|�b�ثg?1*K�Q�����jlO���N '"W�`�Cpk�C��8]�$�Jt�"��:������x�t�x���Ō.lۥ.s��ƴlД���u7q��Y�i�.3333333333�g[�i�����پ3����H�����pL��.a<��/2���p,�����H��(��h����X��8��D�!�Pf3�Y���dF1k2k1k3�0�2������
�
�����M�M�͙͘-�-���1���X&Z��Ę8�`�L�نَٖٞفّىI3&�䘀��8f<3���Lb&3S���4f:3����bf3s���<f>��Y���������,bvg�\����͜�|���ɜ�\�\Ċ���Ȝ�ʬ�ͪ�ã�;�Ɯ�\�����\�\�<�<�\ô1��qL�$S`c�`�e�b�f�a>g3/2�1�3�2��w���+�K��L�%�5s8��)2K�n���0�1ef���0U���1˘���
f%���������Ɯ���������|�|������ڬ��úl��e�ev;�]�e��Hv�&��6��.;�]�]�݀����ݐ݈ݘ݄ݔ݌ݜ݂ݒ݊�n͎e����̫,acl�M�I6�n�n�n�n�����Ħ���!�esl�Rv;���Nd'���)�Tv;���\�\��dg���9�\v;�]�.dwf�d�b>b>fwawewc���y��mg;����d��"��]ʖ�n��-���̝l���5������]�.gW���JvOv/vovv_v?v��@� �`��P�0�p��H�(�h��X�8�x��D�$�d��T�4�t��L�,�l��\�<�|��B�"�b��R�2�r�
�J�*�j��Z�:�z��F�&�f��V�6�v��N�.�n��^�>�~��A�!�a��Q�1�q�	�I�)�i��Y�9�y��E�%�e��U�5�u�
�M�-�m��]�=�}��C�#�c��S�3�s��K�+�k��[�;�{��G�'�g��W�7�w��O�/�o��_���8�8��8�S8��8�38��8�s8��pC���0n8�7�ɍ�����������Fs�q�sprqs�p�r�q�s[p[r[qc����\��8�#\��s	.ɥ�m�m�������4��\�8ʍ��s���$n27���M�s3���,n67������s�����.ܮ�n�"nw.ϵq�\W�s�\W�pK���pe��ۃ�pU��q˸��
��[������������������������������ϝ��ȝĝ̝ʝƝΝ��ɝŝ͝Ý˝ǝ�]�]�]�]�]�]�]�]�]�]�]�]�]�]�]�]��������������������żƼ�����������=�=�=�=�=�=�=�=�=�=�=żɼżͼǼμ�=�=�=�=�=Ͻ��ȽĽ̽½ʽƽν��ɽŽͽý˽ǽ�}�}�}�}�}�}�}�}�}�}�}�}�}�}�}�}����������������[�Y��y^�E^�e^�U^�u��M��m��]>������~$?�_�_�_�_�_�ͯǯ�o�o�o�o�o�o�o�o�o�o�oŏ����Q��}��1>�'�$������w�w�w��|���9>�)?��O�'��~*?�����g��~.?���/��;�����<�Ʒ�|�_�w�]|�_�/�K|7�×�^~��W���/��+�~~%�'��7��/��? 0(8$4,<"2
*:&6.>!1s&	)9%5
-=#3+;'7/?�� ��0��(��8��$��4��,��<��"��2�
�*��:��&��6��.��>��!��1�	�)��9��%��5�
�-��=��#��3��+��;��'��7������	� � 	����	�`�`	����C�a�pa
a�0R%�)�%�-�#�+���66666666����[c���	�@��BRH	��
�	�;;
;	i!#d��T'�&�I�da�0U�&Lf3�Y�la�0W�'����]�]�݄E��B^hڅ� ,:�.�(,�
%�[��B���P�BM��	˅B��R�S�K�[�G�W�O�_8@8P8H8X8D8T8L8\8B8R8J8Z8F8V8N8^8A8Q8I8Y8E8U8M8]8C8S8K8[8G8W8O8_�@�P�H�X�D�T�L�\�B�R�J�Z�F�V�N�^�A�Q�I�Y�E�U�M�]�C�S�K�[�G�W�O�_x@xPxHxXxDxTxLx\xBxRxJxZxFxVxNx^xAxQxIxYxExUxMx]xCxSxKx[xGxWxOx_�@�P�H�X�D�T�L�\�B�R�J�Z�F�V�N�^�A�Q�I�Y�E�U�M�]�C�S�K�[�G�WdDV�D^DQ�DYTDU�D]4DS�D[tDW��Cġ�0q���8B)������G���������������[�[�[�cĭűbT�D_$bL��	1)��m�m������ŝĴ��bND*�Njĉ�$q�8E�*N��3ę�,q�8G�+��ą���.��n�"qw1/���b�X��b�X��KŒ�-��e�W�C��U�&������
�_\)�)�%�-�#�+�'�/ ($,"*&.!)%-#+'/� �(�$�,�"�*�&�.�!�)�%�-�#�+�'�/^ ^(^$^,^"^*^&^.^!^)^%^-^#^+^'^/� �(�$�,�"�*�&�.�!�)�%�-�#�+�'�/> >(>$>,>">*>&>.>!>)>%>->#>+>'>/� �(�$�,�"�*�&�.�!�)�%�-�#�+�'�/~ ~(~$~,~"~*~&~.~!~)~%~-~#~+~'~/� �(�$�,�"�*�&�.�!�)�%�-�#�+1+q/	�(I�,)�*i�.�)Y�-9�+E�!�Pi�4\ZC!��FIkJkIkK�H�J������
�
�����M�M�ͤͥ-�-���1���X)*y�/)&ť���R�6Ҷ�v��Ҏ�NRZ�HY)'��I�	�Di�4Y�"M��Iӥ�Li�4[�#͕�I��BigiiWi7i�����ڤv�C*H��N�K*JK��RI�z���+�!U��T���e�ri��/����������������������������������������N�N�N�N�N�N�N�N�ΐΔΒΖΑΕΓΗ.�.�.�.�.�.�.�.�����������������n�n�n�n�n�n�n�n���������������������������������^�^�^�^�^�^�^�^�ސޔޒޖޑޕޓޗ>�>�>�>�>�>�>�>�����������������~�~�~�~�~�~�~�~���������������9��Y�%Y�Y�5Y�
ٔ-ٖٕ#�y�<L.�!��Gʣ�5���u�u���z����F���&��f�����V�yky��=ٗ���rBN�)yy[y;y{yyGy'9-g䬜�������y�<I�,O�������y�<K�-ϑ�����y����������H�]��mr��!��r��%�%�R�$w�=rY��+rU��}�2y��B�W�{�{�{��������ˇȇʇɇ�G�G�G�G���������'�'�'�'˧ȧʧɧ�g�g�g�g������������˗ȗʗɗ�W�W�W�W���������7�7�7�7˷ȷʷɷ�w�w�w�w��������ˏȏʏɏ�O�O�O�O���������/�/�/�/˯ȯʯɯ�o�o�o�o������������˟ȟʟɟ�_�_�_�_���������?�?�?�?˿ȿʿɿ������*��*��+�"*�"+��*��+�b*�b+��*e�2T�W�PF(#�Qʚ�Z���:ʺ�he=e}eeCe#eceeSe3eseeKe+e���2V�*��+D�)q%�$�����������������V2JV�)�B�q�xe�2Q��LV�(S�i�te�2S���V�(s�y�|e��P�Y�E�U�MY���6�]�P
�b�S�R��e�RR�����*{(��Ԕ>e��\Y��++�=�����}�}�����������C�C�ÔÕ#�#�����c�c���������S�S�Ӕӕ3�3�����s�s���������K�K�˔˕+�+�����k�k���������[�[�۔ە;�;�����{�{�������������G�G�[�[���ǘ������Ǚ��C�'�'���+���g�g���������G�W�W�הו7�7�����{�{�w�w�����������O���O�ϔϕ/�/�����o�o���������_�_�ߔߕ?�?������UFeUN�UAUI�UEUUM�UC5UK�UGuՈ:D�S��k�#ԑ�(uMu-umuu]u���������������������������:F�Z�FUO�U��Ը�P�jJ�F�V�Nݞ�U�A�Q�IM�5���@��8u�:A��NR'�Sԩ�4u�:C���Rg�sԹ�<u��@]�����.RwW�j�ڮv�u�کv�Eu��T-��j�ZV{�=ԊZUkj��L]��P�Օ��^�Q���>��~����A��!��a�����Q���1��q���	��I���)��i�����Y���9��y����E���%��e�����U���5��u��
��M���-��m�����]���=��}����C���#��c�����S���3��s�����K���+��k�����[���;��{����G���'��g�����W���7��w����O���/��o�����_���?����񚠉��ɚ����隡���ٚ��ZD�
Նiõ5��Hm�����������6Z[O[_�@�P�H�X�D�T�L�\�B�R�J�m��բ����bZ\KhI-�m�m�m�m��������rZ�Qm�6^��M�&i��)�Tm�6]����fi��9�\m�6_[�-�v�v�v�v�i�ky�Mk�:���X�Ժ���D[���n�G+k��ZE�j5�O[�-�Vh��JmOm/momm_m?m��@� �`��P�0�p��H�(�h��X�8�x��D�$�d��T�4�t��L�,�l��\�<�|��B�"�b��R�2�r�
�J�*�j��Z�:�z��F�&�f��V�6�v��N�.�n��^�>�~��A�!�a��Q�1�q�	�I�)�i��Y�9�y��E�%�e��U�5�u�
�M�-�m��]�=�}��C�#�c��S�3�s��K�+�k��[�;�{��G�'�g��W�7�w��O�/�o��_��Y��y]�E]�e]�U]�u��M��m��]=�ч�����}�>J_S_K_[_G_W�����o�o�o�o�o�o�o�o�o�o�o��ѷ���Q��}��1=�'�ҷѷշӷ�w�w�w��zF��9=Щ>N�O�'���}�>M����g���}�>O��/��;�������ަ��zA_�w�]zQ_�/�Kz�ޣ��^}��W��ާ/ӗ�+�~}���������������~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~��������������������������������������������������������������������������������������ss�������������������������������������������!�!�����a�a���1�C�a�pc
c�1�e�i�e�m�c�k�6�3�76064626661656367�0�4�2�[c����A��7F�H����;;;i#cd���g�7&�I�dc�1՘fL7f3�Y�lc�1טg�7���]�]�݌E��F�h3ڍ�`,6:�.�h,1�%���1�F���Q1�F��3�ˍF�����������������8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8߸��иȸظĸԸ̸ܸ¸ҸʸڸƸָθ޸��ѸɸٸŸո͸ݸøӸ˸۸Ǹ׸ϸ�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x���������������������������������dL��L�LєL�TL��L�4LӴL�tL׌�C̡�0s���9�i�2�4�2�6�1�5G���������������[�[�[�c̭ͱf��L�$f̌�	3i��m�m������̴͝�1�f�Lj�3Ǜ̉�$s�9ŜjN3��3̙�,s�9ǜk�3�̅���.��n�"sw3o���f�Y0��f�Y4��K͒�m��e���ì�U�f������
��\i�i�e�m�c�k�g�o`hdlbjfnaiemckgo�`�h�d�l�b�j�f�n�a�i�e�m�c�k�g�o^`^h^d^l^b^j^f^n^a^i^e^m^c^k^g^o�`�h�d�l�b�j�f�n�a�i�e�m�c�k�g�o>`>h>d>l>b>j>f>n>a>i>e>m>c>k>g>o�`�h�d�l�b�j�f�n�a�i�e�m�c�k�g�o~`~h~d~l~b~j~f~n~a~i~e~m~c~k~g~o�`�h�d�l�b�j�f�n�a�i�e�m�c�k1kqo	�hI�l)�ji�n�iY�m9�kE�!�Pk�5�Z�a��FYkZkYk[�X�Z������
�
�����M�M�ͬͭ-�-���1���X+jy�o+fŭ���R�6ֶ�v��֎�NV��XY+g��Y�	�Dk�5ٚbM��Yӭ�Lk�5ۚc͵�Y��BkgkkWk7k�����ڬv��*X��N��*ZK��V��z���k�aU��U���e�rk��o����������������������������������������N�N�N�N�N�N�N�N�ΰδβζαεγη.�.�.�.�.�.�.�.�����������������n�n�n�n�n�n�n�n���������������������������������^�^�^�^�^�^�^�^�ް޴޲޶ޱ޵޳޷>�>�>�>�>�>�>�>�����������������~�~�~�~�~�~�~�~���������������9��[�%[�[�5[�
۴-۶۵#�{�=�n�a��Gڣ�5���u�u��z������F��&���f�����V�{k{��=۷���v�N�){{[{;{{{{G{';mg쬝������{�=ɞlO������{�=˞mϱ����{���������������mv��a��v��e�%�R�dw�=v���+vծ�}�2{����W�{�{�{��������ۇ؇ڇه�G�G�G�G���������'�'�'�'ۧاڧ٧�g�g�g�g������������ۗؗڗٗ�W�W�W�W���������7�7�7�7۷طڷٷ�w�w�w�w��������ۏ؏ڏُ�O�O�O�O���������/�/�/�/ۯدگٯ�o�o�o�o������������۟؟ڟٟ�_�_�_�_���������?�?�?�?ۿؿڿٿ������:��:��;�#:�#;��:��;�c:�c;��:g�3��w�pF8#�QΚ�Z���:κ�hg=g}ggCg#gcggSg3gsggKg+g���3։:��;ĉ9q'�$�����������������v2N��9�C�q�xg�3љ�Lv�8S�i�tg�3ә��v�8s�y�|g�����������Y����6���p
�b���r��g�Sr�����:{8��Ԝ>g���Y��;+�=�����}�}�����������C�C�ÜÝ#�#�����c�c���������S�S�Ӝӝ3�3�����s�s���������K�K�˜˝+�+�����k�k���������[�[�ۜ۝;�;�����{�{�����������G�G�ǜǝ'�'�����g�g���������W�W�לם7�7�����w�w�����������O�O�Ϝϝ/�/�����o�o���������_�_�ߜߝ?�?������]�e]��]�]ɕ]�U]��]�5]˵]�u݈;��s��k�#ܑ�(wMw-wmww]w���������������������������;����F]�]��ܸ�p�n��������������M�7�����8w�;���Nr'�Sܩ�4w�;Ý��rg�sܹ�<w���]���������.rww�n���v�w���v�Ew���-��n�[v{�=܊[ukn���]�p�ݕ��^���>��~����A��!��a�����Q���1��q���	��I���)��i�����Y���9��y����E���%��e�����U���5��u��
��M���-��m�����]���=��}����C���#��c�����S���3��s�����K���+��k�����[���;��{����G���'��g�����W���7��w����O���/��o�����_���?�&�F�"bD��%�F��1"fĊ�'�F"�!���a��5"#"##�"kF֊�Y'�ndtd���
"F6�l�$�id���-"[F����l�F��!�X$ID��Td�ȶ��"�Gv���)��d"�H.Dhd\d|dBdbdRdrdJdjdZdzdFdfdVdvdNdnd^d~dAdad��.�]#�EEv��#m��HG�Y��Ι<��Δ�z�cǦ�"���B��^��-�G�!��tw��R��a��m�²��o9]�,���0��b���{q��Bo_Uֲ�Z����S���R�=�8eGr���kr��P��Z��D��� �B� <c��q����ԸU��\u�Fã�����}�kUYߖ�]��	�b�� �A�����B�1�	ȴFn�D��D�8Hcɪr��GLK;+�BO)��Ql�&��j��8$���&�]Pjar�}B���45�TϠO�b\�~�'츞|o�Z��{�
|���z:�ih^͛6��洮���|����龎�5if�\�C�b	if�\	ì��j3�uO���ǥ�����õ�ͳ�ָ@s��^�9hAZ0'lA_3�s*ŞN���9g���
��sp!�p�����A������°�+�A[��V\9PK��jغ�X�("Z��	"�e=�L &�\-_,��F���"�D��SQqqW��5_���Η�b6��	��oA�$b
)��B
)��B
)��8��\�ˍ�mi4>�Ƨ�4�F���NC;
�4���NC;
�t �ij�5�5��V��K1�Q/�/�$�q3�A$�A$�A$�A$�A�3�,�?����~�Y�g���~�Y�g���~�Y�g���~�9�砟�~�9�砟�~�9�砟�~�9�砟�~�����@?�I��1������P�@=�zu
u
u
u
u
u��S�����4���J����t�|!�UK�jWX.�*7���E�}D�C�#&��)�4b1��C���ЏB?
�(�ЏB?
�(�ЏB?
�(�ЏB?
�(�=�{��=��=�{���A߃�}��=�{���C߇�}�>�}�ߞ}�>�}�ݞ}�>�}蓱θR�Vd��ro{�Z�p:��G"#���y� #��2"Ȉ #��2"Ȉ #��b�z$��A?��A}/��cЏA?��cЏA?�8��Ї#��ЏC?�8��ЏC?�ҋuxU���VƑC9đC9đC9$�C9$�C9$�C9$�C9$�	�A�	�'���~�����x����xI�'���!xp���!xp^
�)觠��~
�)��x��{�x��{ॠ�����>,���"x�,���"x�,���"x�^�i�g���>���!xp���!xp���!xp���!xp���!xp^6�����ܡ4��(tV��M����+��
<����+��
<����+�@y��@y��@y��@y/���/���y���y���y���y���y���y���y���y���y�B�B�B�B�B�B�R������6�y-��>��6g-���b1��4=�V^6�Si�b1� �}��>(��>(��>(��>(��>(��>(��>(��>(��>(�{�Q��J���@��@��@��@��@��@��@��@��@��@��@��@��@��@�O�O�O�����������������������������������������������������������~�������������������������������������	*��=��Q,T
�b�Y�ҥޮ|���{ʵB�P�A8mnV��7&�͒1�����ʜAkӺ��An�欦%6��L���s�0�:��',����z��zIh���yir���#�M��q�22���]eqV��;����Ȇ��U���W��L:eL���[u-?�Fap���[�ڷ�G��5?/�5��h��Q(��2�%�l4����lZ�d��f�Jͦ�If�\O��(���r�'��f#k�F"�������Xn�1����i�_�����<p٠���A_�A_�A_�A_srsrsrsrsrsr��Ak��Ak��i��|@O��AO��AO��AO��AO��AO��i����`^L0/&�p����$�&���`^L@Lb����$ &1	�I@Lb����$ &1	�I@Lb����$ &1	�I0/&�����$�%,	`IKX����$�%,	`IKX����$�%,	`IKX����$�%,	`IKX����$�%,	`IKX����$�%,	`IKX����$�%,	`IKX����$�%,	`IKX����$�%,	`IKX����$�%,	`IKX����$�%��$RF�T�r_OG{�Q\	V��ʭ=��j��³`>L0&�̇	���a��0�|�`>L0&�̇	���a��0�|�`>L0&�̇	���a��0�|�`>L0&�̇	���a��0�|�`>L0&�̇	���a��0�|�`>L0&�̇	���a��0�|�`>L0&�̇	���a��0�|�`>L0&�̇	���a��0�|�`>L0&�̇	���a�'�O�	��<1'xbN�Ĝ`nL07&�Й��t&�3�	�L@g:Й��t&�3�	�L@g:Й��t&�K̥	��si��4�\�`.M0�&�K̥	��si��4�\��
�7@��� pn��
�7@��� pn 7���
��bp1���@n 7���
��bp1���@n 7���
��bp1���@n 7���
��bp1���@n 7���
��bp1���@�KAO����x���4K�%���`	b�1X��G�bOG_{�����(,��a���Q7�=}�e�p���X�W:�e-_�*Wj���� �A,6+�f���SU����b{�RT���
��[��<�^tLy�1��Phis���+�(�T��rOX���j;�ZV����c�֌J��ᆎ�֑=�	j��ׁ�Q
RzZG���{��-�����0)l�\	c}�Ӭ�¨�P���۫ȫZ
7#�[�raYyy�T��4�N�?Ԟ��aK���|g%����fW�����V��V�k��m^�����Xm��X]t����sZ�_�)���s�Փז+��5�>)��"���G�u�k���YU	?����ab���ӄ��\���l��]�eR:Q�V6��1p�V�cqX��-�2��h�����U*���jG�
aS;�Jee��n��B��Xެ���J��EY\���jqE�jaY!<{���U�A��DC�m�7@�uGY�ie�h"��W
R9<i���dy8�[��hu�+��"���ʰ��B~�J�̷囉�KZ%���Z;�CgU�QD�G$�1�8b1��BL#f��9�@[>���Y^��k`�����慺;�:
�[�T��lT�rO�R�֯���m�P+��R{�]/4�W�X����F����ƭ�(�}K�z�J�P��Q6�V�E�}D�C�#&��)�4b1��Ci���@?�~������@?�~���)�)�)�)�)�)�)�)tCOͅ��J�^W#S��*��jw���� Ɣ��5xGBǧʽ����/��1&7� [Z���5��U���զ5��ܤ���;fy��j�;��}��&�\,�)�Z���b��V���ݍ2v&����3���!�W��U�Zn_�)]k���*
�Н��GO	V�6��[�{�X(�:J�J}d�C3�`�GL &q�<�����XW���&	�Q#h5|�N��G>�𑅏,|d᧍���dY�b�ޱ9�L�&|6S����p�T$��n�UېA.���Rh���A�����O��b�(��b�R�g��-�8�h�1tQiŒ��R?H�f,�^���b�r�#�8r����Tq\�8.UyđG�G��q�ġ�~�q�ǡ��~�	�'���~�	�'���~���;�}�p�d��s�_��v"�$�I"�$�I"�$�I"�$�I"�$�I"�$�#��H"�$�#��HB?��S�OA?��S�OA?��S�OA?��S�Sh}�V���H$�D�H$�D�H$��w��C�O��:'�K#�4�K#�4�K#�4:'�΁�e�zoW�~ځ�#�ې�HN$'������Drp"98��HN$�A�EY�K���~�Y�g���~�Y�g���~�Y�g���>|H>$������Cr�!9��|H>$������Cr�!9��|H>$������Cr�!9��|H>$������Cr�!9��|H>$�����hl�Һ�]�o��Pi8��Ƞm��Mv���A�Q
�X��V��u3�Y�g��A
�^��K���JȘ"c��çB��'�
գ��#�b1��DL!�3�Y�b��(�ЏB?
�(�ЏB?
�(�ЏB�%�B?
�(�ЇE	`Q��=�Ò�$,IK���$,I�A߃�}�p$�}�0#�H3��0#�H3������!|H���!�>�>�>�>H�������p\G�Ġ�~�1��ipA�1�Ǡ��apF��apF��apF��apF��apF��apF��apF��apA�	��W	�'���Ҽ�+V��0���by3��Z_]�*����`)X��"��`)X��"��`)X��"��`)X��"��`)X��"��`)X��"HA?}8�N"���$8� 
�4��Їk����!�k����!�k��"����!�c�8��!�c�8��!�c�8��!�c�8��!�c�8��!�c�8��!�c�8��!�c�8��!�c�8��!�c�8��!�c�8��!�c�8��!�c�8��!�c�8��!�c�8��!�chTZ~��[����[�x~�E@�N�����?�)�OA
�S���?�)�OA
�S���?�)�OA
�S�����=�)hOA{
�S��t��;�)�NAw
�SН��t��;ݩ��C�@w
�S��t��;�)�NAw
�S��t��;�)�NAw
�S��t��;�)hNAs
�S��4��7�)�MAo
zS���6�i�u^�:S��t��3�)�LAg
:S��t��3�)�LAg
:S��t��3�)�LAg
:S��t��3�)&�|�	>��b�O1���1�)hLAc
S��4��C{Ac
S��4��1�)hLAc
S��4��1�)hLAc
S��4��1�)hLAc
S��4��1�)hLAc
S��4��1�)(LAa

SP�����0�)(LAa

SP�����/})�KA_
�R���/})�KA_
�R�����-m)hKA[
�RP������,e)(KAY
�RP������,e)(KAY
�RP����p�y8W)xJ�S
�R𔂧<��)Oi�Sol��z�"z�>"A�!��I�b1��E�!�ti�ЏF���ξJ�#_��&HF�fcQ*�������G_�6�t
��t�o5��{J�|�CVcIqUG!y�{H�C�������=$�A͏J�Ş����=��G����G��P���g�Š�R���&l��:�Dp�.�E"P"P"P"P"hA��G�>]]�tcЍA7�Z�~�1�Ǡ�~�1�Ǡ�~�1�ǡ�~�q�ǡ�n�q�ơ�n�q�ơ�n�	�&���N�L@/���K@/���K@/�$��K��I�3	�$��OB?	�$��OB?	�$��OA7�tS�MA7�tS�MA7�tS�MA7=�l/���S��+���	�b%�
$�q��P��*�PH���rO��U�؂6�Ѧ4�4��eжږA�2h[��-��e���rmˠm�-��3��G^tl+F=D� ��	�$b
1��A�"��0�(�h�Q�G��>F�h�ф��P���J�Z�6�EQ�Eќ�[)T�+����\lD"񐈇<$�!	`��b��b��b��b��b��z9�P���5@!�a:�Cه��.��(l�HK="�Q��G>2��������������%��0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�_r�G�c�b���j���|��h����z�%���9��s��Y4�����i���B��e1�g1�g1�g1�g1�g��S=��I�b1����!�a�Y d�O@DȂY!"dA�,��� BDȂY!��J[�/=��e(��]�M�M+6�l��Q(�Z��V�',�el�m}�Pi�(�Z��p>�Vm���T�jk�^�jo����*ֿ�8Vn�U��cI��,,�u$�;+�ޮ��8u����X����R�V+�����V��m<xc�s�b�a��Ê��#+FV�<�yX1�b�a��Ê��#+FV�<�yX1�b�a��Ê��#+FV�<�yX1�b�a��Ê��#+FV�<�yX1�b�a��Ê��#+FV�<�yX1�b�a��Ê��#+FV�<�yX1�b�a��Ê��#+FV�<�yX1�b�a��Ê��#+FV�<�yX1�b�aŨ�Hc���X���m���X�4�}�ƋKu~�}�.l��-K���-�
Z�t�n���U�֧ �
v���XZ�ߔ��L�Z.;�������:7K�����P1���Xj���+��kR�{�z�k}�B����ԧE=�jW8*.+֧9v{�\���k�������h�5�X)���W#͟IK��ީ�(��蛹�ӭ�~�cp
���IĔ9g�W���Z�@m�r~�o�Z��JO��n=J�J���Y���V���z��ڂ��᷿�op�Xз*i�PE�00��5����>r����PS�����~��ˌ�3�����P^�3#��{� Rsvup��ה\�Z^\k����B�U�[[P��v���J�J��U���T�L�(���5��H��l
s�#���x�S�S�S��z$�1D�C	�C	�C!B�1��A�"����~�I�'���~�I�'���~��Tdv���.vt�
������$�J�$�J���J
���J
���J
���J*��4�m��i�os�N��E|���I
���)Ӊ��E�}D�C�#&��)�4b1��C��~�Q�G��~�Q�G��~�Q�G��~�Q�G��A߃�}��=�{���A߃�}��=�{���C߇�}�>�}����C߇�}�>�}����A>�A>�A>A�O�O���=��=��=A�O�O�O�O�O�O��~�1�Ǡ�~�1�Ǡ�~�1��2�̾�J�����}R����!�8R�#�8R�#�8R�#�8R�#�8R�#�8R����8�1.&0.&0.&0.&0.&0.&0.&0.&0.&0.&0.&0.&0.&0.&0.&0.&0.&0.&0.&0.&0.&0.&0.&0.&0.&0.&0.&��OB�a�a�a�a�a�a�a�a"��_�̗c��5��f��}���Q�Z%��E��aTӅe�R��o��(M(�JsJ}�R�A���Y���3i�L=�FϤ�3i�L=�N���@����5�G�Ni����D�d�H�d�H�d�H�d��޾
�4~NNɷ
Z�b�0�U�CA����,��=ym�@���"��EZ8h��	f`v�V��Z�:���ϗw��Y�]��a�(:��s):�ⶣ��(��ⶣ����I��I��I��I��I��I��I��I��I��I����p��p��p��p��Z�K#f��9��ЧЧЧЧЧЧ�G&џI�g��D&џI���៺���G]��).��͠{3���7��͠{3���7��͠{3[`�l�-�t���l�-�e����2[`�l�-�e����2[`�l�-�e����2[`�l�-�ebЏATˀj�U���]��dGm�,
R���\_9<H��c�;Vv�ӯJ���k�zq�;�V�_�#��{�ղ�K�-���1�lLh�e�9�D�_�h�X�oQ��oIn���_���œ�'O$(�HP<��x"A�D���	�'O$(�HP<��x"A�D���	���(VG�1�=�c�Z�U�Z�T-����O��>�?��~��Q?3�Tn/MI����u�{�>5=��S����҄1�z��ͨOh��r���e�ܬ8V�������d�bMh�B9���p�bO�m�A;�i�5_�#9���Q~^��Q��"4
'mއ�S�6+R�`g�jK4�\	�q)����z�?]]�O�o��Z\Tm����U�fǷ�C��Rlms��Nnm��v�y�ڪj�%���ߦ_UG�
|��k��:�!K�o.B~L�]��Ʃ�p۴[��}�n�W���p�۵|�֋��ٮ4�^0W�Lr�c���b>�p��Khk���8�}���@�Kz�g:��R#W�}���A7e��Q�G*Ժ�h}�^j�4�7�;��Z�U������.j�Y,�z���
� ,��]Ys�H�~��2`�ݵvW�����G�ELܸ=�>W�5�d��G��E)���g��ɣ�vPe���246�������
��;�?�pz$No��A$<��'(��D��������d+�H ����H��z#�n�4�'�� |*\R�Uj
�4g^1 ���T�*�v�� �랺'�8�rB5�6�L��u�l2Z�O���Cv7�2[�FfһE�wK������ &�Y,3/����k�Ǒ�e(K%S9Y����'4�O���Er������U�7"�wg5Sg���H��(��s[��-�E�m�r^�&N��O�Fn�ֳ�ߋ����/4���bb����"d�y���y��?�������O|�]��gx�}�
��y��pk�=y���ϑV�ۭ\�Q�Z�2��&��L�;�d0ČJ�!�M�v�N]%V�EI���XI6��	�J���)������*R�F��	�P�(�4��+"@�H|Ixa#Ѕ���FZI����#p�b6��Dh���^A�B,$`�WS��Sf��v�0��Ѕ�*��Di'�H;H�*�4��$%c���QƐ��!C�*��Di'bH;C�*�4�1u}����(1=%#���\��QIƨn��>ke[�F��5��-��Y�"�2��	y*�
�u��4q�o�x��oR��
L���P����}���vr���l[��|̗O�vɱ��}�E��2>h�}#��\�3>d<�ƶ>������.d�!�v�����;`��v��q}#s<1�g|��?b��Xn��gX>��w؇���X2�a�;t�cl\��a;`�����g��g��g��g��g��|#�9�>�C����x>�YnX2��a�,��Ᏹq��v������3d�+d�+d�+d�+d�+d�Îz��!�16���ϰ}�}��.|,<~�r�X�
V���>^+`�+`�+`�+`�+`�+`�Îz��!�16���ϰ}�}�x��u!�vȰC��x^s^'>6�q=���S�d�~�ݐ���n� {f�0�r�d,0�> �,���%[|�>����vm�[���[�k�f��������l���%;k�.9��Q�����6/ؙuE��=�j������L�	I�����$9�%��Qm+Uw[>���J�櫦�7d@F@�@��Dn �@�,9�BD"������ D!f`C�B�"�1r�1��E�k�1�J�!f"�Ęaf��	f���q&m����������C�c2�a�1;ρ�9�<���"q�н����v��7r�7r�7r�7r�7r�7r�7*�w<,��ʼ
�ec#2n�9�8���x�ώ���W?�\9���Q&��-*��� �f�q��mF?��[m+7��$S���jw�&�e~$���E��$����k�/!x{|̬�X�Y���Bu��Re�x+�_�]�?�\�˯&eG�I�vB�Iˇ�!��LQ�]��E!��ځC��.DG���m~�Ň�]�0�5��ԛXhR��~ {@���9�p�
w�#0!�6�F8��B�
!Dn�o9������A���A���A�l��np�`�G����>��G��l�`;�1D�[�E�Y� D�
�E-���@ �B �B �B �
�H' �@�	�@�	F�n�y�恛�zh�@F����l�mцmц�0D0�!�N���O!�O!�p}p��7�|�ׇ|}�G����Xr�3��A���!�2��6��Af1D�!3����Q�C�
\���0'/V��G�B�R�!�|�$:��sL�I����<#�̈��<#�gD3#܌`�H���<c�gL�b�S�gL�if��÷z�l��^
?�n�ʜ���C��/�U<($�  �]�4�D�@��It�ldmx,�|��}��1~�x���?`�G���Gܞ�7b��X�!�^�C�r<6������c��X>=�O���c��X>�����}���,~���z�|`��3�1�?f��^����E�?b��c�E,���o��g���|,��g���|��L0���',�	�w��|'�cx�����<6~��������,�!�o�������Y}���Č�|����;e�NY�S������|��3<���g�Y�>����Ϙ��ş��f,���/f㋙��c�����b6������e�W�GP,�Ee��1t��"�,
ʩ�E�r�q9�q9��<ƨ<ƨ��#F����#ǀʢY9⬜׬�D\c\c\Ɗ�c|y�qy��c@Xtm7��M�r9?���f�� f6E�k�D��1F�`f��ħ�5�gF�~nj�\���,o��Y��N��	�c0� [�9�)�E��`;C!��O<�4}3��G���0_���G��G��6
�;M5�ĺn& N�.�Xq���$)�t�VRV�^�L�(�ɸ_�2�9u����i9�9C��<"f�A�Y"�[m��1�307b3d�G�g샬Z+�Xa��d��F;D��~F'��鄬0��Os��Yc;�[�]ׇG)z���r'�������L����ٛ
Qn��vO�7K�\R�-QnЅ���@l[�^��Z��E��$�BӬV�*)΁���(T�#�͑p)�I	{�L�':��Hc[�Qӟ���ݻ��#'�����4C���ǒ��)�m�f���]wY6[:"l�f[W�KYf�y${��>6\�ʆ��+ʾ����1��#����P�<8<e���lW�K�M�`iY�}.��e33���=���n��b���~F�1���Ȯ�F���[#ڂ��P���h��q4����go����XYW+���;X�ˆV�3�I��h��X���2����u2JK]����?��F_��iyI�V�j��[s!��
Qn��vO�7K�\R�-QnЅ����;���Z����d6`{�L�iV+
L��@L�tA������H������y&��9�-�i[�v�~�H�
3�0�ΞYt����ץ>Ke���(&��3�:�y�;u���#��ȓ�\�W%$uy�w�2��r���47��a���a��`�xV���)L����N���+
��<w����E\8pW_ɰ���!�p]æ���e���e��t�.���.ӭ;��%��"��GWGlIl���$�ޕ�ٙ�sl+g
NSg�����_�LNӝK�*�C�M]҇g���YV�(c����Q��(���Mq�W[�7�db�Z���8���9�wro�"s�6�ə�7ԣI�)�\9ڄ�i�+�}�҂�ܮH���7W�#H2�#��z�U+2�Uy�M�e��"u���G#������#�y'��d�cV�9�~�j�>�}�IJHnSb2l��s��˕65��_؎�$m�3��;���]�n�f�k*6����Q�yMŲ��eU��*��T,sW쏬�b�5>s�,+�,��Y^Q��Q����Ł�R��Ⴎj�b�m��z�҉S��S��ᕕ�n2����1n�5f��o�/�l�|e'yI�w|�\d�ɪ@27H7s��e�yn��}N�}�xDӤx��Xjg��i,u#`�|4]c�큋ilMUo{/�[�[�����1Z�y4�dI+�h(\�ã5�݅�n$QV���`�^+R�X
�tW;���S[��Q�Xg[��|�h�C,�nau�:LA\�V�nI�b,W�r��!.�|Nڋ��wKR��b�mI�Ju܎�LK
l�eo�X�F�0W��A�+}�	'W�X;S�FjNQ©I��VI,�a�gK��R)5��3�a�(F�`$�癦/�3��GGR��v�n��(�'[����Hoo�G���b��϶:ş����E?nl�t�
�CZ��ږ�`�����|�6�i���;��‘�"����;:ʅ��w
�G�Y�hnUf�ƿ/�ݶp�xm{��UB�u䳭�G�=`p�
F!�U�t�Q��	z\��x\0��.� b�ϴ'3}�~6�X����*ŠJ�U)�U
�JT)�*ET�Pr)�Ȼ��*R�¾K8p	=�p��.a��.a���s���gr�JU�JٯS�^�rX���A�2�SF5JU�*eO�+��ElX�NNtvrA���嘮U�~�B�Fv�]¾K�Y�@�:����w{s��db%��Ϗ��E	�
�ϦOQ���V�/�j�?����R���������ծ��ʀ������8G\<�kWy�n�_s����ʾY�s�SE��,��4��iF\<:�x�7�45䵥�s�i(kQ�<�޴{5߱�^���Q��l��.%.�̸ʏIr�� S5u���ߴ���iZ[��'I�/�v�ą�-��`��"�2J��-Ej����u�TdC�q��m?2L?=hb���pڛ�%���ɪ�#��Ǵ��SZ��!5袉oc^��wB�u�I3��z����~����3՗�Z�o92�W�(d�O���QK���^����̪c�ժ�J��D�85�)�Bׯ�
jt^�nX��ktA�.��E�:�pS��oJ�J��,�U����\�Z��y#�f�;Կׂe]�i�r��cg���z�K�����+��T��_�^�{�臯�W�+��}T�W�K�^��k�J���_�_�г��ɩ_���^��
_	[ziHy���+���n�>����>��r�TyS��r�7�i�]��|~aV�����y}LNO��w_���)�8��~$��*V���d+e���Ui�E>E�M.�);�/Jb�fj�OI�E>e�O,�)��"��n��^�Se$��P��w	�
��v�;��*]o��y14S@�����-ʩ�p*x�Y�S}�}Z&z�fUF�Z#�%@�Ws����k@j�]�A�B~l���ޯL���ҷ��!T[m[�;3;�E�H�q.�ܒ��'���<='��b�
�T-��?z�z�]eR��j�5�#�#�_���Ǔ��~��|�XX��D����t14���g�d�����7�|o<'ڬxY:͏���L���?d|�R{bݙ���GO4l���B��,�i�3�y�]X�
~
�Tv}�2���O"u_��%���I��/��L��x�e��SUU��Z��[��8g�1AP�( S�R`��^�%���I6��J�F1�A�
�L��U�@�t��5�I5y){�f���e�z�a��9������o�"M)D����o�m�CRz�+��2RJ*R�$�l�,���%�RbĐ�{$N�8*1؊�CY	�J*��I�JV��Δ<8_
�B)���.�K6�xƒ��R�J�<	�f�EZ�V��I;���;�0|Dz��&�'��'d�1x\&�I9�6O�2O�Ibsʫ"�U{��^�7��o�{I��~#�����v8��'�ax$�z�x�K
��>����!�dp�|E:���ׂQ�����IH']L��5����(��G�HG��3��3�ӤcoŦ�cӱ��wb���f��|Ζ���������-v��,�h�m\o���p��$�]�%T�#��Z�ʎ�)T��YT޵����~������E��E��M{�eo�����Yu!%��T�9D�Úp'�a-*ua*��è<�
C*kH�ҕ�I�TI�"�T�]����6�7~׿D�uZ�_G������ȦF*�q�A6���c	\*�p���H�v��.wˉCϤK�Q鑗Qy��o9w�%.��D:���r"Nu��m�T�;O�NR�3Q��Ot]�~+�i�z�\w��k���uQ�����+D�}H��z
YҿQD��D�9�d�b�!�r*�S��L*�,΢"��\���6K��mҌ��v�XcL=d�M3�4Ϛ�Tk�^�7��A�mF�5�13NMfsւ���Vo�ՃI:@��
��	�B)�w���S����B.��h���f�ÌP���8QV,t/��S:�p�2x#+����ky-�p6�`G�qv��_�j���졭�(M�ӿ���3�
{y��.3jF��L�	��o��n���܏��N��4��	>�5�k}�W�-��.�
n�\���+С�&n:L���n�M�y�6��v���3��0���w�һ�-���mY��x��}	�U��Yf�3���3�u��ŵ�k��l!ɾ��dK�$$!I�%I%I�J�$�$I��R��)iS�JB��|��c�b��<�����~�{�{f���|�g9��B	!)|�kڬu'R���C���Q���MG]=�k��A��f%���ѣ�$1b�8�%�H*)MʐtR��O*�ʤ
�F��$��$��OX�VM�H�K;6I#��
�Np�u��ٮ"�*��'�s��8iiwL#U�^�>���k��F81I
�H�Y��#�y�b��:��	"���{y�{�*�Zc~��ߏܭ"��ǯ���k���5���x?e�W&V�훓~5�F���x]����(iӮu�l۸Kб]�4:��o�3�ߢgpN�38���S��)y礝�:�{N;��3b�����>�n�O�"	t۷���tJ��î����n��tn߁}���H��|�utE�����5z�O�#݄�[�?L�����tנ�7^G���� zDRf MA�#-�4
i9�H�#���!Ҧ�o�v8k	���_	�r��~�Y�!�2�al�!C�
�F�vh6~��ٽC���M|`��fp6c�u}���ÆU����d��b���fK���g[1��!�ؚ���F�~#�l�UC�g�����>�H3Ҝ���܆�#���jH/D�	�&w�{Ƚ�2�<L!��t��r�1@�B��i��0_ah!E������#���H� }iy�iH�!M"}ϫ��*�R��:H}�	�q�6��U�DZi	���z��1m�)'3�l2��Y���#���|�����'������Z@3�{�Y������x�����yaUP �r�mO��^tBG�q�n:�N���\��.�+�t=�D����N��f3�bi����&�5��z�~l�ư	l"��f�9l>[̖�Ul�6��l;��q�;<���<�g�)o�;��ć�1|�ȧ�|���e|_�7��|+���C�a8F�Q�H72�L����hmt2z��A�pc�1��hL5fs���bc���Xgl06[����i���j3��3Ӭo65[���f?s�9�cN0'�S��s���\f�2י���Vs���<3bN,5V,�ˈe��ǚ�Z�:�z��ņ���&��5��!ubh[h��2K�����!*]��/5LO��PiK��P���:EDž���U�*�E�;����Pii��S�8�~���4M�T���e�3�wQG��t��e|�gՑ*�L���%|�6R�0-��F��p^J�^C�6Qi3�*�T���?����dl	�*��U��tO�f�O@�w�}���_´��0��'L/\�M�����i�%a�zfX7�;�����x�gôc9�6	�γ��2��>�y]_��-�����ĐͶ{zx^�%a�����{�V�φ�U��t��0����a:�u��D����a:�N�ޚ���
�	iaz�0�{M��g�����u���CK���/���a���0}|Y�>�(Lg��yre��O
�ٙ*��O�
�9�:���Ϫ|Ϫ�<���I*��R%G/LW�L��V����t�J�T��K�z\�><���ӗ�ܿ�\��U�U���)U�K�]��V�o��e%���,���2�E��������1���.�ܼ9+<��6��+���;��o/�H���P�bj����U�]�{��L��9*]��M$&��rW��jTx�UcU���za�$���g�s~s�;5���%Ns��s�s�s����rF;�:w:�9�8�:3�'�����/���<���ls���;;��N9��S�9ϩ�Tuj9M��Nc��S׹ֹ��ι��q�;����$�g�s�s�q���tp.u:���Y����-�ڰ�qj�V���]ۅ�][#�Z����N+�����NW��s����	[/�z���~�]
��:�`�P�n�mlca��q���m��
�]�=���m*l�lO�6�y�g`��.'p�q*�V
�acNܙ۽�]�>�>�Nqrow'�w�����w�����{�;ܻ܉�g�^�K�b�,���rvqu����;ܝ��.w�������s�r��C���gx6�I<3�Y��:o�:S�G���n	�G����p�s�:�;/����y�|g������;�����y�i�M���vb�t�)�)~�<Ox�xI/_���^9��W�;ϫ�
W�*{U��^5��W��̵�Ի�k�]�5�Zx-�V^'���Ż���uˆ{zWz���^���ϻ
�z���]�
�n�zü�ލ��S���^�Wӫ��xݽ˽�����&��W�+��ҼR^i�L��z^}���л�k�5�������n��y�y��s��
yE��^Q����{�4���:^]��w�.Y������u��z�"���]�
�zxWx��p_��
o�w�7��M�g��q����ݝ��v�pg�O:�:��ǹ��p�99���N��S�)�pJ:iN)��S�Iw>u>s��lp>w6:_8��:_���M�lүN�c�q�*���
�z|�FD@���K �)F�����秓>��O��-�������d*�6����[F�#��Z���|B�"7�-�2��H~%�o��G~�m"����>�&���A��ar�L���d*MP�̠��"3i:-K^�hM�
�C��whڅ�����Gt�D>�ч�'t9}�����:��~L?&_�������f�2�|�2X��z���6�� ߂g�>���e��O�c����v��7��o�"~	�[�6d7o�;����M��M� ��|��o��r|
�B��Y�)Z���_�����4 `��p�im�:�:Z|�1��ss#�c1F��j�j��7�
c�c�酱c�FVI+�^d5�����մ�u�5������6֓�g����ݚ�nw�/��W��Q{�=�Y���j�c�d%�U�*�f��R����t��}�L|e|%+�����%$��N>� ��wz�J�W�VQ��An&�)�6�h	�A���P��P��&�t6DZ�b�b�5P�A���n���.��aK���+�JC�U�eB�Ո5cm!���z��y
e#�Xv7���t6�=��"��-�ZZ�ֳ��}϶���� 
K�B��ayU^"�&�9o�Xw�K��G����'�G "�����-�+���>㛠���_�N�"3f؆�Y#�(Gx<gΏ��s�'���>J,{���Y㬏��⾂�u���^<�o3�p;��-h�_��MΫ�qZ���r^s����B�����·�h����Ag��.�����r�p>�;Њ�����R��-��;��|��/��P� .{;e	Kr���r82��u�i/�O�+=(u��ze�(Ы���
��x�y��x	���K�3��r���8S�R�܁(!����_��_N3���Nw�)NW8~��Hx–p���n�d���~9�\�wz��W�4�Ϲp*P#�{bg�g �}�3��H�8��F��A�!�]PR�Qȫ,� �K�q�~�pk�0�<�V��<����<�.�}˻�r���]t���;^�+=�R�w�Vp�N�*���~@{��@���-�z��ҋn�Zȿ�k
t���t�v�,��>���u@{��@{�!@�7�,�Ci�9k���t��>з���p�}��Jg�w����r>���"<�<w1��*����:���}�]��)�%��e@8o-�,Z�yhag�"�;@�:+�s�Z�Y���,���%�I~R�$�TV1R{G�aoe&iFڐ��iO:���R҉t&]I72�<H�������|M��d'�Ev�=d/�O�����C�iZ����hm��;�>�*~�����am�>�6Z_X��Z_�m�vv{���þ��i_m������7ۣ����]��W�O�^���x���m�;��w�������|�u>t�99�d_��5��pփL}H�s1�C}Ҕ`4B��ʧ�
),�>��	6���u�@{����a<�=iI<�v����-�h�(�2
vb"ik���!TZ�`Y��e
���:B���@P�`��pG�+�p?и�c_�����p��F�M��8��8����>����.ȋ.�A��b���O�e��t�ey9��y
�-���{S�%
��&�_��?�Aw��ϧJ�7��us��3B鴸|�Lc=A���P�m�@2��	�=�����Lwpb$�t8�Q�e�������6k���I��p�Q��Q
ڇ}�t�0�i-}�}���l�zY]�%��U�k
�k��:��-`��BT��	i	-�;x��P2��'�B˝Nf�ydx�+���|I�'��3��Q�p�����|��t��`�����y7�|�gc:ߵ0���0}�51}�G�̓|�.�t�K0}�9����aH_d/8�0���t�s���0}����o/��?1����E�<�<�:߅V9�}�op�őf�#+�4U�Hq���H#őG*�4P��8RWq䂐n��n�n��n͐nf�	�F�	�Z�	�j�	�J�	�r�	��ϻ���#M$G\����#�*N�U��Eqb���hʼnQ�7+N�T��Iq�Fʼn�ÔlU�Aq�ző��#�)�R�Vq�ő�#W+��W�Jqd rdJ��K��ɑ�JF�(��V��8s����3=G.W�8�Mq����e�#]G:+�\�8�Qq���H{őv�#mGZ+��Ri�8�Bq�-r�r�'�H�ɑ�G**���8RAq���HYőt%+egJ+ΔR�)�8SBq���L1ř��3�g
)�T�)�8�_q$Uq$��HRq$PIC�(��(�|�#҃���ND�L�n=�P~�*���6��;}���I���*�4�Hl;�Z�!���L��i����l[�Sh��!�/��Z�V�Z���Wh��"�o�B��>EH:���mk҅�Nƒ���;m�w�B�i����N���Y֝�O��sV��Z�~�h-�X��h�.��D��}�K�.�7�D[t���%ڬ�Y��+]�/u��N�h�8���Ă(*?DO ?��_-��.��A7ӯ!��F�A��{�_ ���T*��=��/��"��S�T#�+1��7G㘶�l�:�17z�"DD=`j���ǎs}�Z6��o�q�ZX�6�։��7����~�	~�$��[�aF���狋��ŭ���S≸w�D΅�E�E�����%�%�i8�|�襍�W�h��q�t"�,��>rAn�����C�a�H��
��8�5/�\�� j�p�>�^d�^�5��+/�p���0�&{�B��^�+G�H�>u��qto�s��˫�\�$���@�e/K�<��S$�	�[�KY-���c$�"�pVDj^�\^qF*x����ȳ���軞b���8[z��h9����>�S{�r=�4��L'K:�Q!9"���A5q�bj��?-p�'ķ��Y���r���F���q�18�#Gw�;�9�����8�#Gt��Y8�3Gon�c6��}"�4$;q��n;ɘK�X�a=�pw�(�Ay�#%�3r����Z�5*���*�O��W�kĵ8���k#��bб�q�,�u7����xU��$P��C�ɚ˘�ܾZr��O�s��Y:�����*2��N&�; ���܍���#�dΎ
�z��,�G�4��}3�d&y��"O����K���#��@6�M�n&[ȷ��D��W��G� ���QʩI-�v	�Q�&i*-@�"�-A�F����@+�Z�V��i&��:�.�O�ic����+��na��j���|-������m�M�E�)��7���o�[�6`�����/�xgޅ_ƻ�n�;����W�Jދ��՗��W�^��U�*e��XZ�Ys��y��|�Ek���������z�Zj�k��V[k�������9{������֏�O���N�k�u�:d��XGmbS�م�"vQ��]�.a�������v�]ɮlW����u�zv}���о�nd7�[�-�Vvk݇v����fw�/W�iW�#=j����M�Hշv�=޾ݞ`�!{��h��
�س�}D�I�t&��谿?�������Z��egC���c��'�d��X���m�8v�dj�Xi����r��Q�S�wzV�<=�yj�5��"#�J����c���H+�=(uZ3r	iNZ@���ك-�L��֝\Nz�+HOr�҃�����y�<G��!�}��'/��%�����+d1y��F^'K��.#o���m���1�d5y"��G��)���|A�I�������H�E~&���������ñ�#�1j@�l��PA���iaZ��%i)�����<z>�D��j��Ik�h=ڐ6�M����.��Ѓ'ԅ��j>�_��k!������!�>��X�F>���G�(>����V>N����~�������)V�U�J��XOZ����������Y�%k�����z�Zl�i-�޲�[o[+�w��և�:�#�c�k�����������b}c}k���f�l�b�jm�~�vX��=֟�^k����:`s۰M;f[�m��;a;�k�a�v`'�|v���.`�٥��v;�.k�����jvu���i״kٵ�:vc��}��Ծ�nf_��fG�R�����v/�����k�S�s�}�=ؾ�b�`��)�9ƾ�k�j�;�?�|N���)�"骜�+:�N�R�K\!z��D7�Et��墇�)����{��`$z�P�MH
<O��g�@x��D@�%I(�h�_���v5��0�3!���WHl��Ӷ��p��ρ�Ml�
�Ic����9o����.�{��8��Jq���IIu��8�j��P�Mg����3�f�8�cଘe�[�r�mw�����}�]��Yǝk%���P������I�!��~��g���m����j\g���rtߺں&�8��D���~��H��l�e`w����\��“����y/x���K�B�eo�����{�{�{�[��-���yoy˽���;�J�]o���[���}�>��yy{�x�O�ϼx�Ͻ���&�ޗ�W�f�ko��������������������������~�vzx�����Oo�������z����� �
&�0�)b������p�'��E �"�H�EQP�EQT�E	QR��R��(#�EYQN��y��8_d�J���"��j���!2EMQK�u����'����P4�Eq�h*.��%��h!Z�V��h#ڊv�������Vq.�|g_�)w���;�}�}�}Ν��s_p�/�ܗ܅���+�b�U�5�uw����ԝ�>�.�������������&z�{����ރ��!o�������7�{̛�=����fzOz����������Y�9o�Y|6��4B�׫Jl����֤�p�����A�UM'E��^Dʃ]�@j�Ԭ#B�JZA
d�uc2
jr>(3��O��D�(h�Z��&�EA���Yp�|��8`67[���b�� ���׀QZ1�H2��G�ן�oy82^�Nrl��zi��k�jI;ўtJ��;�d:�Ρ����э�[��C�0�%Y1V�UeuYS֖ue}� 6��c���l&�+��MP�ˆFjt�F�4���n�h�F�j4N��4���M������,d�Ԩ�F�u��4���M�g����h�Fj4E�q�Fu��i4U��5zD�G��1}l�>VO{L��=�����ӿ���}�	�fj�F�4zJ��5�G�{�P���~�1"���w�I�i�.)��3i ��fCR�lg�#5�m� ��:�BjC�h�﷔�vS�5�p������i����-������bܵ��tp7jtOsx�ˠ�l��w;X��b�fB�hM��~t����T:�·������u���a�X:����9��zA��&��l�����mb[�Nv��<���^b�����|"����|�o����|�a�Q̨`d���X���ٰ�X���#xg���"xw��?#xo���W��|(�G�>z�$��G0�`�<��6#8�VW�`;��\5�S"8�N��Epj��\4��"�T���"XD��A��B\8��Dp�.�%"�d���2��e#�\W��|~gDp����#�FgFp�NFp�c8��	j��#�
�F��
3b�@��&hܲfg�2RI�z�*�L��X��.h�֠�C��Q�Du��!I]��tW��y����9�	�^������;�}�l(Ͽ�w`��2�}׳/AS�`�9�/��"��
���ڲ?Ļ� ��ħay�U2�s���y��i�F�5zQ����B�^�h�F�h�X�W5zM��5Z��}��R���h�Foi�\��5Z��;���_���*�Vk�F��4Z��G}��?4ڤ�?5�N�5z_�4�D��}��gm��s�6j�F_j�F�5�Z�-}�����V�~�h�F?k�F�j�]��}�Gm�+hTO�&]�H�L�L�Z�(j�t�h��2�Q�\�Z�j���e ��cA�L�gYBVB4���_ �>Bm����J�Ҧ�-x>}� :������3�Υ��2���/�V���g��,�Ud��!x@Y֟
a���Ħ��l>{
���l�¶�]�Ÿϋ�t^<�&�5��{�|��m�A��k�=�:h�?�U�t�vk���fb��m�9��ȅd�D���d>y�� k!J�B��]��A�R������T��^t N�B�2�Π�҅t)D+�M�{���x%����~~}֌�g�Y?6b��l"{��b� jY��g����'��Z��[�����-��[ѩZ�����Lj���OB�}��|	9.�g ����r�f=h?����C������ɤ�xH<L��jKX-a��
�]m$��,52�� �B�"�M�{�����BSi	Z�V��i3ڞv���`:����#t�G���}��L�;�f0�b�Y���������l��Mf����-a+�:�je=�_[�:in�ڦ�Z_�
5�P�F�Ш�F�4j�Q[��i�^�u��R�:i�Y�.]�QW��i�]��5�B��]�Q/�zk�G���Ө�FWk4@�k4��
����i4\�5��M���f�F�������jt�F����,�P�&v"v���/F�#G}�8��$E��˗�KCT^�/q�AM�p��3>}���ّ�dG�klF~����>b�8�"���B[���"ڊbh+��V�F[���~RVL�Q-Fy���
��YR�� �Ƚd*�I�EdYC֓/�V��짌:�M�i&mH�ӎ��O��Qt�D���t>}���k���n���!c>+��YeV�G��z��l8��;��8C���,�I,���Z?h��%�%�Z��b1�^�1�Z����&���~QR�/��A:Z��rtQ�
�8&��?���>�?��1&�Q#"Y�w�vj�F�4ڭ����h�F�4گ�_��F�4:����f!�hT^#�ӈkdhdj��Ҩ�F�Fq��j��QB#G#W#O�T��kT@���iTJ��4������(Ш�F�4*�Q��iT\��Ԩ�Fe4Jר�F�4��QE���(C�*UӨ�F54�Ԩ�FI��e�@�
�Y�:�W�jt1�3u����q��Fu4�@���ר�F
5�P�F5��"�.���Zh�R�V�֨�Fm5j�Q{�:h�Q�K5�Qg��ht�F]5�Qw�.ר�FWh�S�+5�Qo��h�W�~]�Q���h�F�h4P�k5��u
��z��ht�FC5��p�n�h�F7i4R��5��h��ht�Fc5�U�qݖG��3-���Ii��D�j���?&��䒠^Ѐ4���H+\�)A��l��X*��>���f�Y
G��w0/4�qC�@�F8�(��X����p8R���dYHր�;@��^��;�;L��8�b�L,@�HR��p�Y��!@�1�a�:��?�o�{�Nu�0�3�9����
G�
{T��`�qƃqT]a��u�:*�S����Vl�����WKQD�
g$�p��YN�D0�p�B�g2���솸8䄏�  RQKv�O�K�l���Q.�YrUN��k2G��P���/\�F>�.��;��r���Ia�.f�[d���M��xh���#���x_���㿾���!��,�GR}��eX��6��7�nb>c�1 �a�l�9�j>�~P3��Qd�*�W���\0�
�2��D8 �)i��w�i�JJC9`J
��2 �d���|:<7���әe�4�H���� �I҃����u����+�`(偡40����PJC` vXj���
�~ g[���1�@�BG�#���AB�1�^�_A\>ꄤ̍(�̋ܐ:�XPH�7�ɴ��|��fZYO������+��u�*iX��rbPB>OP�V�^�z3�QP��2<{iHB
��3H�uHk_ =���;�w��6��'�y>��<YΠ�,��߳�T�2T��T��U��U�*ci��4�jA�i��)^���=%�A�>'��|�xI,/�E��x]�!��eb�xG�+V��b�xϿt0�-�ڭ:h�.d葉d��=�����[��5�X�v������_z�,%�(�8J٩�׹����6��U��}��,���_���%�+ ���q��x�#c�W�Qd����M�*I~i =���\w���-��o +�qm�u�K��ʷ]	��"�wƏ�/Ư�o��wc��Y�<�lg�7;����h1N�&n��Nq���HR�-�b�ߐ\�;B�:?���k�̀�U^0\xW�S٬L,�zGB'K~��	�h1Z���r����;�Vq/ܓ�9bÀ���UY/�g�#��յ���y���]y��a�5�1g�Q������P������`y������!dCƓ��$\�pX��dYQ�*����|o�1����v�4�2H������G~PG@�E%Z�PiA�� �y��#����\1J^_��9��A*�›���x�fu�,�U��%#�m婙]��Ep�v���4!�ƅ���~)ܗ�����B�_a������&��-xn�x%<j6������z�B���/�|�~�Ӎ�Gb�ĝIЖ����mR�&ޔ�4qw�怸+1^�S�@���]�]���G�P�ƈ�6�!p~���\O�J�Lܜ����K����ru���cTd�{#��"ğc�\�=�e{6�؈�:��������f�=����X��f��i�Fh�V�5Z��G}�(ja@W��ٞ
�ڟ
R2�*W�m��#�,�|s�ɕ��s>�9�b��r�s~�9�c�0�\9���`Η0��b���b��s�|s.̕s;�s��9c�Wr�
s~�9�`��1�k�r����obΥ��\9ǜ0�r��\�+�N�9�|s���o���܈9Wa�w1�J-�h�^�O5�,%[�v���v���jR��I���I��g�C�
}��F���h�F���K���h3��(�-�G��m0�F�&!W8/��V+h2����2f�Y�,g�G=�qL�%�K�)��ȴj�bῊ=�5�i��UQ9���	1V����d����ˀ���m얞���_�A��A4�U�rnvMS���o��6k��o|\ ��`v����]L9�q��p7S�m�y�\�'&}@�
"S?$��S�S�g�!��o)��b��ϓxA/�T�^$�������%R|҅���J/�I	�]^%q��2I�b^'�b	�<.�3o�֥�?j) �o�b��,')�m�,�B� ���z��/�]�|�U� ����>����{��x_�w�@|@bb�XK��Ň�1,>�#��(��S(�?�?���(���s8k��e�$�	�K�%��+��y��e�Z|
e�"�@���@���B���C�?@����P�ŏP��OP�mb��g�3�����W�+�v����M�%!v�h���M�{��7�A�?$g���=9s�e߳���~R����rƾ�_�q��x���Y�K��~iُ엑3�L٣�ה��:~b����_߯�zc�	)�_�7'e�~R�o�$�o�"I��ߚ��m�6��m�������w ��~G8�R�RR���w"����L�]�.�����J��n���ߝx��~�=��$��{�����Ay����<��By��ï��Cy��C�<7�7@y��C�<�aP��p(ύ��P�����<#��p���P�Q�((�h4���(�X,�z�+�d��!���_�E���e�������6�^�;��8���'_�? ����C��8:������u`�>� &��= �
^Z�QM d�����$D�<�'㕠��M�b2"	�C�ǃ4�EyP"U����ɘ$8_F)A%�)yPEF�A59���9��žs�������x�
�M�KvSV��5|�	d2�A��d���V���6M�i4�֡Mi{ڃ���8:�N�s�B���O7�o�v�_��I�0DW�	�,�G.q�uK����R�6�N��;#NA�q�e��]���!�wG,_��G�q��
�I�=�C|%�TĽ�G�q�}D�q!�F|�Z�H��"�Z��$���_��⁈K"�q�A�K!�qiă�A|=�t�C�E|�r��ʵ|�q�BDZDc��`��B��,�%{��a��4��=2��X�ELn�I��f���qx̴Mp܌N1S�m& ����/�BfG�f��3�N5S��f~��ҙh�L�q1�n�k֕����x}�w1�w&Z�ڸظ�@�Kg��3��M�#����#��΢x�4��.�[<.<C���xt�L1��I8>K��XI�����a��M��@�]��-��刬��=o�C��9�#�G�9�*�����2}�?}�3���帪�~�%��m?GR�ȓ���1�&Z���C!���FX`JʑO?
��Ka��(y�t���_V�,�������
~�y��~E���ý2�J�+�7�*~U8Rͯy�����C�c���P��P��c
Ա���Xu�
z��?샌�G@��P��P��Qmԟ��jK�e�R�3c�3c�3c�'+��ʠ-c�'����Bmi���QCڨ!�PCʾk쉯NB���	�Ya9"1Ja�'1Za���1
�~�[�}6c��6��8��&lm1hm{��i�	�m�jy��m���b��H��s�?��f��gk���Ű��r�6�'��,�����<Q����}Lʳ��y�9�ڬHk���Ű���92������;Нb'\���vA��y�?�_۟�����f�&�X���uk�E�Y,��b�΀o~Ahm�`��"y�9�\ۜ������g�iaUu�E�V}1��vf�B;3#��>N;3�hg�mYض,l[�*ۓ��=��6$cT���<[P�ګ�ګ��
mT�^��v)�H�-
�E�����X���	�Ϳ��D-Lh[�VE��4lˉ�JN9�nCB�ڍP�eoI!𮪒��������["���)yJ��,{���dZF���I�=8O���7%�d2;#���%���!�O�O&���J�\�O&��=ٯİ7�td�?Wj��)�}Qj�ӔZ��1��q�9���'7�O. O�8���=���+���a�h���S���q4q5�	r���}2�dr�S��sK�Cj-\(d�S�m���^�c�3��95���ʱ����b�3����y.�r@�r�}'ү��ϑ�'pz2���)��+�r���ԉ�-N$�gCR�^�I�ɨUb8��G���b�,y5#}t���@j�9�yʮy\�@��[����Sg�L'��{��${�Kv�r����r�tV/�>���x�R��	��3�r�W���H����N�WM�	�N���)�=������&v筃c'��ʫ��2�]ρ��yG����w��&�>�tZgE:+>�\ʑz����oh�S�ѳ-�r60`���k�uM�ͽ�c˙�yj�Pc�S`bO��{
rjר^��_`���2�RB�l^m8�&�T���K�ja8[$�EM�G)�R�qtf(�1��3�߂�EI���<z��`�{����3/�R�{���Ҍ�����R�.M*GdrtD&�Dd�LF�0=9쒭����Ǘ����[#���5�3����8k����
%��dL�Zb8W��-���%]%��gE��FO��U��U��"W�lr%g�1�k��!WNr���J�k�7����\ɹ��T�Ӓ��ۇ~2�:��s!KgO��yHѥ�%E���#�#3���,?r~.�Y��?\���G�d���FJvN�'m�[�J�Rg8��T�*v��*v�r%gm3�1}n�*9k�E��C�ZGS�yJW\y�g���D~rK�|���;
�'9RZbgYZ�����K�7�p������e�N&�9�
���T�7?���aG��&�<��ϲ>6�`�8c�gk,�ԥB�5��=�죝gS6bgM6��B��o�)Y��{ϊ�8}9�x�r"ߙc�.Z�~�?Ή�8+��w��ϽY��l4?�;Dz�_$�8��ñ�(	��OA�S�����QO�@�Ӕ����;����<d Z�a�����<j<ZקZ�fX�y��٫ӎy�i�lu�fX��M5�o��p�<Nݩ��5ef��h���FL5�NƏ�V/9k��~�0B̫^�۽ߩey�αz1U����H%E$�
s�DU�kp�r�j�j1���Ϣ�z���#u`�1�Ђ�w��������z��H>:�V���:ȫo:�ң#at�|WZO�F!���	���h��D�~K��N�C�8]Vy�QN��*���W37_�q4�|˟�{�'�e��'�\�g�O�s�p
yr��'�:,�Ӈ�>q�Yç<��3���-�|���|�˲=�\��*
,�����Sx2�o?�\�D�Ey��\r,͈H��=��1�ϻ�qj,�8wXcr%��\2\I�س�y����?�z�>E�����ٗ=W:`��$Kr<I�J\�g���0\���ے\��
�4�Ʃ>�9��T�r�RǕ�
��R���xN�

��E�f�G��E�Y�͓=�\����'{�p]�3y��S�r�+��~���L�!r.juj��J
�*�<ٞD�y�p��'�����V�q�W��r�Z��hߙ��IUF�^Õz���p5���0U��Dr]��0\Ʌ�.Woa�J�UW���p]�,
���J-U�l���ٲ�=�%��1\�'[y�{�4R�8��	�UzF�B��R�y#2���1\iɎ�.3T{�"`��i���<^�8C����d8w7f�f�f���}�8�7ړl�JNq�\��Ƹ/�E=+ǭB����l��fb4a�
OƃΗ41*4p�zW{�#�=Y'��E-r�Aib�h�z�y���~E��~؟`��a�b�Q�w�)]%�:�cc�J#Mg���K��S�	y� ��l��凫"Y���F,2[�Ę�2,;�F�+dX��B��=��d�Wn�J6�Z�~�O���S�4
\])�ѓ�s�L|�#�_���b~1�U~�Ž̝�R������o~���yt&F���a�x\�2\K�B���4,�	1p
'��և�q�ytFd�"�+J�{�1�!�I\��V3���E�^��"VRH<H.I�U�Rp�]qA� I�A~8^0(�PP���RpM�䰰/�ľ8��L\�(��%p}�p>����q��pU��*�Ub�J���tXz�v�N�O�'�d�dǘ3�T$��!i��h�Z�h�^��FDR���ބHz�#���7#�q>+�5�d�pE"�s�G$5�<�*=#1�`�F��`+���GpJ'�~�+�&�k�K2�'��\�5�뾚�-�k����q݀�q�m�mp|��$I�o4p\�5&�����[W`�
�'K�7��W1�C�%(���T~
��[�U&�d�
bjC���%�@~��/�q6���N~w|��
6�w�
�<����'���u���`�n�k�Wc���2��j���_?�?��o���8�z_�@��%}���\ыC��T���A��kv�Wkvq��������\F��PCre�A��:]��(A*�D����͓�
v�{�/�v|d_���})�"�R��P��EHi�+��_��NB˸�L�8c9YN�j�גuu�f	�=�!z$�G�Hx��H�'�������	舶�<m/�Y�e�%m��-�vH�#퀴#�K�vB�i�`t��ɖ���/�c?=�s9�'fk�R���ڤւV���㯖+��2Q��V�ʵ�7(a�u��7�YŔߥc�z�	5aN5��u�(���ݐ��ӭ
>�\������|�Y6_�Z֗����l�?��H;	V��_U�H�Gh��nA˃vw���>	�*z)AiG�5����I����� h|F��s�f)�xP��l|��Y�̄�����xD��S����q�xF���m�ˆ��p(o!�Epm�pUE�O�K��G�E(j������E�H�uY��S�@[/��BZI�WF��WI�#�_;�hטZ����R�����mӤH4`��Gs���<�01r��}
ۈeT��P�n�D\���Y�L�K~��J/V�W�Q��)>��-|f��I�	ï~Ț��Gx5�m��b���~,ij�cT�Қ����}��$�����2|/�B���d�G���^ي��H!=��ң��>Pn�5c�_��TzX�GTz4L!�)󷢶�#�#�#I���������?a�[�l!Rfd-ł�;��`M�^�~�Z�tX�>d��(ЊwB]f�2��5�H6���6���!��1��$-B�hZ�֢�iSښv�]iO��:����ϐ߂	�@:�Hg!}
�l�s�>��Y��!���y��$����yfZ���B��
��e/#]$��T~��į"�g�nƑ� M"5�3�73pO~?�
,'��Η_<�C~.V����H�'W�j"M u�
�p��i���<��7^(��7�"?͘������n��U���w��_�E�VAtj��Ն(���d֗�Pd�(cD!B|8��G �X"��!|"�'!�;��5h@\TX�<�N�s�B|Sޯ��W��"�h�A$S��<=����y���9��7Ƿ�Z�X��0�S=P������u�F��.��,#��Aa�K1�e��7F�#_��Ѥ�2x�'���b\��h���S}&Wu��Q��(~��bd�0��8���-�c8Q	p�
�j���'�ȈO��(��N�7���Fp�1������ȭ�ը�������{(�;%Sq�����i�Y�������vΚ7��ϫ�j}�$�i�yM�oY��?��K�N*i�$~��F���R�W���eɠ^�a��>z�z���^��
�FUe�F8
N�#�؋���b?�D�T>���Ժ��α��؞óW�_Ճz5";W���)֫��U֢�kIF|�u.�~`8��$SoE۳s�r�;j��#Y��mݧ�s��b� \�l1�A��O>&ȗ�[��Nv���5h
�iZ��KP�fҺ�m�����n:�N���,���t]B��Ut-]O7���{*��k���E�"QI� ���G1���#"݋t�H =����xAJ�2����BG��4�T M"͇4UR��ߑ�D�%Xr�eX6�%X�%�D���R�X*K�c�|,����cH��},��%�>r�w�z�J�A��H� m�����G�Jrh����$��_徤�
kq��^d�&��2]'��(�uQW�C��������;R�ý2�ǀ�@�m��`��NH0I~;$��m��Z%���>�^^�M86��r�Y]2�	<�qt
��-+�2Y3���"$͇n6K�O`ZR�G��X�Y*ד*ד�k�1x���Rݟ�9������iJ�Sd���%��[I��ȃ�Wudy��o04��{&��rߟ���y��o���[u�i�����1o.xl�h��[���Ĵb�*�i�"LK/aZ"��52
k�Q#S�^�`�<��r?��}X/wc�����kf䩞�#��H֗��g�������Sރ9��}��9��_C�`�^ǒ��%{K�K�"�,뮏��+?)�$<2��:M�y�V��ȉe�	��z���2^}��G_}�N�N� �),�X�j��0�/�/��/���\AY�B�/�V�d�?���O���w�r��.��A���_D�/�p�TƼ����0��al��6��hH�{L:	��ý~��ޡ�[~���~�lg`��]�m/�`1�Ä�-��K�C��%�=%B��G!},���:�c��֣�@�H&)��fO��������`�����������$K�2AI��9�J�8�'���]L�'IC��2���*�L���vO�2f>V;���P�Zeh��%rN���h�T�f5WȄ�TO����_�ĞK�`t�P�y�?�{%ao��;y��?ٟ��<�X�#�!�j	l�>I�]�\��Q;�����?�/��yp<�T*׹a8JFqL�*���V&�8~�ч�7�=t
zo�W���e��^���G��Q�ө��eo
U�Ð}6�l(�T�f!��g�1��O��/�Fz����h����ޗ!�=x�d`�Me8R-�����Օ��Yܔ��s�����@�G�"�����}Of�Ә�����R�����`|pG�58�Gm���ۃ;���89�������4�����k�����8o�!����kW=2�[�I�,��k�A�����8��¯��_%�c�+�-���{�k�~>5'�����A~��Ǽ~��j�w��q���w������ƿ����/��r�T�ŧ򛩺/_�v���}�q�r��}j���hPh��VP:(
�lPh�ʆ���d��`%��`�����/��l5���ײ����t���o_��^��c�@�(�| 	�ǜ���}I�7������#cѯ��FV����$�y�� ���hp�3��b�������z�6j�E��	�M��Zo6��"�.����پD+��D�Ġ��-?��&���f2���v2�LI&�N�MzI��A2�̗LM�OHLJNIMKO�H�L�%K%K'�$ӓe�����%+&�O�Hf�ɚɌd�d�d�d�d�d�d���B�P�)��1�t���`�z�~�,��ǡfބ�|6��#�4{�d?n� ��Y�S��=�~�T��Hf�n�.�ooLj�?Z��Kx��}	���������ޝ�eA.aAD@@DDDD������ """QDDDD$�� n!��	?$�	� "N��DQWE��Ͱ�\�G}ޫ���u�W��[ݳ� �@�C��m���x�w��r�_0�/�ϡĢqeTX�3��&�B~�xH"(��pM$H;�u���rr'TP���*�W~��Y��JY�3��b*�*�(�h�v[q��
�rRK���Qw�s�$�¥#��zP*�R)���4����V�jZG�h�t��0"�
%L&ڋp�C���p!�E���b��,���b�X$���b�X���Kc?Y�*�#��N�mq�ӹb�V�q�h��Dǎ�bI_�gX�O�d_�k���m��c�7[�5�6S�5��ޚ���u�콖�����w��gx�3�����<�w��}}�_��+}�4_<����^㋷��}����]6_�=��o�d��]=�׺�yـ~� ͳ��eW�5z?��+=讠�D�ׅ�B����ꃡm��mѶj۴�ߐ�{{E07Z��K�O_�?{���(b�q��n�"M,i�u���l��#��I���.��x�}!��"��{����К��k�Cf��ri.MŬ8�{�E;a��ޫ��i�h�l���ëDU��Ń�s��t�Ҭ�yq�~�>Y��>E�W��߯O��g��p�=��D�C�~`!�4��[s�J߅�:X�Ӫ1���j9��}'���,�qR(��g|�+�:<�=���9��B�O�r�}�=�2g���W��s�v����M�������9�=�Ц3�q�5J��ӑz+����+���4��s��sS#]S�0�R�(�����/�
\�����z�%|>�ȁ<�N
ϟe����V����Ir��w�
���u���)'�v(��b�����x
Aj���<Џ'6I�����){�>�;m����x����Wڷ襵B��uuY��&�y ��y��܉�Ln��+���A��5�7���4�FR�����u�V���ۢ�7�^�`&b�&���Z�:����'=���3O�RB����������94��E�q��N�țH�|ZcI��F��ɲX�q:ۺ�Wݰ&i�)�N�;[!�fVA_�f��;[�խV-���C��7Χa�� ��a�RۤՒ����E�����		'd�@9HC�N�.	O*�d+ȗȶ���v��K���2y䎲3�p�����+�5����F���f�v�-�I�xG��� ��vx%l.��a��4�&B��iv��i�[/�*�jhmƞk'��>�cM�ǾK����W[��]���+`
�f�8i�v*�A�q�X�̼���r�X�9%�y�|<���{6��������)8�U\�d�z��2/��rqcK���_a�m�;�sV���uy�)}�y��ƺ�+�7��=�w\-{�>����V
/r�m���dx����l�m3l3mó<b�c{�6��m^����o�-�����f��m��}��w�e��R���Z	�?h�yt5b�5xw�5j�:�> M}�>�S��5@�[�H���v��txZ��~%��zw�ߨE�pk�>B���p�ä�;����)�g����Cs|�8�ZE4g�3��3ĉy�l�lM��։Y���D-��������91���NX�s���s�s$x�3%Ls>
y��I�N�ع�:�ο8��Z�:���������Xo�u�:�;�
���[g�{j�."��\
<�H�����RW�tvu�������/���k�����p�t=���1�'\O���z	��U
�;��׸�/rmpm����>!=T��:ҋ����1�����[{}{E;��#V��4
s��&��]>�
���D-�ﮘ�,�wғֵ��ֵ��cA��Cъc�[N0�m����9��;��2��G�zO�G6�1,Ϯ>Q��]o���U]�_
9\�nY��q��~����9�A�/8_�@��_Sj���ڠ��9uB~��z�+�4W�+:��ut0�5��{]�Q�k��A
@��$�j!���r��O�A
�����#��!T�'��'Z�KǺ��b���r�4���V���q������M��Z�{�8x�4��+ع�t�6P����'���)���qm���&i�SOh��O��)�s9��r����jL�ԗ�?��۝d}֕�xՁ���+kg4^]�E��+k��x��ڡ5^�[�����xea��ƫK�C�Z[��ƫ�M����/�ZY;�xӅ��b�(�E�(>/&��b��-�b�X&V�j�F���]�{�~qPԉ��+Ѡa����G1�ͼ�a~�}����=�=�5����yD�&%�qj9�<M����X�i��*�u��N,�GX{�S�����%,w�}X�uN�d>�K���o�z�G2�t�O�dNi�<�����~)^>�s�(M<�)��y^��<�7���^}��Uߩ�R��z���]��� =AOs�w|�hpjN�3���y��]krpr~������Zg\�K\m\���]=���r�q�u]��5�u�k���"�3�Ůg]K\Ϲ��~�������p�Wd�X�Z��*a`%z^�%�2�ye�Kע�V���ܠC�#��AǼ@ج&�����u��@�A�A�5��Q�x�+�A��r�8�D��t�,�,@,-�ZZ
�m��@�@;A��g!qt�	:�]��jvP��S���3��)M峿{�ow^)W�c�3��tmc��ľE��w+���9�VZ{���M��jC�Z��%k�Z�V���&h��i�L�m��P[�-�Vj�hk���][��vk{5�vH;�}��$mҔ�����$�U<W���_����q�S�=��3���p��K���_�����D	�򫥅���w��`.� ��_���޺z�h-5����[뭫��o�ǽ%�=1V���0�zN?�ǿ�z���~-��dT���?�]�ng��%h^�bν�~�|�܏�=��w���^�/O�:�_�x�6ІK�*PՇ���R�+A+^n2�������O��'�
��4;�A�`}���K�W���x�0��B��;p�p>��Q��c�0uno\?>�
r���nj9u5	�-V��XS��V��]�ye�_M��X{u�
��5z���е���k��i�_\[Ȳjx|��'kE�������[%���.��O"씈�5�%Ž���<>�M���C���:�=l�
_�̻�7<��&=Ә✟3�4ܯd���wWP2�lx?�V$�B1^�V֦û��r��!��Ū�ꯊU�Z���z�>V��/җ�/��f}��G�O��Q����F}�yW}
���
�-��r�<o���]z6��Ϻ�k;(��nz�����Zzj��
��{����q|����7\Wzj\X]W!�ƳH�3�:��JۂR����Q�(a��מ/P�. x=dz>�SG=_#��ʃ��;���c��5h�o��(�e��u��V@�<�E@k���</�����u��YD�~S}�٫�A�:�B}ǭxGy<_8���Ca��
��
�C�@
�QC}�xx6����o�u��5��X�ف1���c�<&�X=��['!�X)]Q�.��g1j�E�֢�Mh�.��-�j}���Zw遞E������ى�w�a�["n�V@�y^w,��v�r�y3���Kз��
�����u�4��~�\\?�y�E��]��Z��Bԗh0|�.|z���FM}�;�}��X7uz+��)�-V��t|�N��A<:(#���
��M,�Sop�u�?������z<�O��������{��w֣۬��]��r�!�a��Z��<�(�C��!�e~�2����r�2?��A�uN��5�X"���#��¹ş�f0�Q�v�u+�hl�MԴէ�W��W}=p���-�A����J|
5n�X�
���A�h�7t�t��z�z
�z�9�ȫ��Ѣ���Mϟ�l��������?��u�͞��h�Q�S�Ї���Ax���ûh�V�+ʨG�B�`k[ѦCh�A�W�����Fa5U��,{�/T�Zv��FZ�[9n;~��~�����K�}BY��<⳩�q'���%�?�m(�M��hc�x}݂v�<�M�q��.����Z�snK�x�jɆ��l�E�9H5ڱe��[��&�XP���|\�珰� ���y	�w���q/1;�'�m���
8����
�r���v����e�j��kk�:j�9�9��X�c��u�Fǟ�o86;����x���}�(g�3����j���������|�%�E?&�Ew�[���01RD�x�*��Ɣ�qb��"��Yb��/���E�J�5b��,���X����Dԋo5M�k!Z��V�u�zh}��m�6J���t-W+�*���$m�6C����h��e�
�Z[���6j[���.m��_;��iG����d�t�V���$��^��(��2B��d�)�e�+'��r��)���B�D.�+�+r�\/7ɭr��-�J�<$����1EʦL�Z�*\u�us��F�(�RU�*T�j�������i��_#�<]��\�ro?ޞ�v�j���:�L�x��=1|7������\&�Uy�9�D���zN��V�#���,�ܩ�=�+�}c9�=^��y���5�����}�'��e�z~	?����2b�\2o�'{��d��_~o9�[W×\K��A��Fy.����;O�
�����y:/��f�I��
c�r[����~�r��k�t����
��W�X~���^���Wkޑ��+�'w��V�:����7�ioR��I�P�\�-;M�N�AMҽ��cN�e���5���Mf�����h���K�Rg~�E^*;Е���HW�β3��]�5�S�Ջh���t�-זK�l��R��VeK�m�m3i�m�m�ٞ�=E��Ŷ�T�9`�
��~X8�|2p=�ք�wk��ZӋ[�O/�+�Zn�uܦܦ��lO��`n͐�}D7�,@��y��
V����A��7�Dp���*A�A�@SA3@�A��bh1hh���\)���>�.���E����&��VP]k��i�A�@�@�@@��@�P��E��@ɠLP>�444|��=�ZZ�n@[	z���	�	�5I��XNad��O��NW�8S��pq��}�ҙj�4���o�|��S�"X}��/g�2��ad�z���٤��{�q��6xk�-��=<�h�^�����bw��?�Nv�����a��Q2^��lY(��89QN���,��r�\*_���jY#7��r��)k�>y@���z��Ҕ]��0�VuT]U�W
PC�p5JŨD��r��W��T5C�Vs��X-S+T�Z��Yo,�+"��滙?��1��N~ܛއ���8�g������sR]޻%��N�t���0�'�C~�����]�64��:�g�?�gK����������IK��m揜�2Ï�6�K���i���j����^|� ����eΚ��\,>��e�Gr��XV,���&\&sΖ��ѸOS��+���l��@�;=mzv�}�v�>��O��ig8?���c��^�4�L�C�َG�9��SOV�a��ζ��˜�����|�:�0���u>��|�9��s��)�B���E�g����:��r��/g��c�	�gg8�=q��}���u�����-s=�Z�z����׮��Nh��w�{�K�Nzg�[���[���ӧY_
�w,s>�\�s��7ΕΗ���/7��b�k��-���C�G���W��BG�F�F�F�uj���?�M��D�7��_2�MSN��>��}�G�"Z��Ś����XZJ��)!~��
z�~H�|2s��wX���������'Fh�m����}E��o{�{�9�=�����6!��wB}X^��Ͽ�>~%MB�4A��j��+!�}	�;�S?ds�C�#ToՏ
� �2F0w۲�Q�	�)�&�n��^,,�w��&�^�M�����+��}:FBYopm ,�Z�:��UwPo��~w0hh$(
J�LT��
3Qa&��H��((�D���0f��LT��
3Qa&*�D���0f��LT���0f��T�=��B�2�w�m}�D���н�44��4
D���@dz.��A�X�L"�o�/�f���t 2�L"�W ��4�L"�7��m{i}�Lߏ� �L?��7��)P �	jj·u��

�E��@ɠLP>��P��M�ـȀ��D�L6 2��["���ւ��z�ض�n�^�o��mп
���~HE€�
�߀�
xb�؀�
�߀�
�߀�
�߀�
�߀��TP6�T������ZZ
z�
�T����	�����oI�1K�@��oo���C�v�ߎ���ۡ;�o���1�DP:��C�v��>4	�ۡ;�o�ZZZ���ՠ5 �;�o����п}��C��:�o������@����@����@����@����@�@����@����@�+���0{>�8i,ocY���F�,��p�wN�'��='�k��Vx�c��t�������ݳ�Sn�Oo�~ϩc�_����4ω�MO|w���s�U�3����<�˽���UZ�񳈦ڼ�p������7h���'ۘ�o��9�����F�����fd:U��e��~=�o����-\����Ss���,/b��o�|���7�>k�����Sftxc:�;����N�8M	g}R竅-X+��?v�K��M`�o�,5G�W��R��Z�V��AmV��NU�{@V��z����;^��Y�����X�`q9��Yg�&��<��k-_���:�/}����#�H���v�g�v��(g+�5��2Ǯdz����W�1NW�1O�J��X�r��l}s.�ej���~N��-�o����}��wQì�۪�S�u99�
�7���a�yC��~�ۻ�%�4
Z�l�r)��zG4�P��,���;7r��:q��C,��Ùk�{��a�Z�����i��J�ڥ��ڸve�9�p����z;����
�s�/�ˏ��g�=�LJ������\����l,��A~e��֨�&%�9����Z��B�[-��|�Q=�g~k��a~��]��>���9�5y��d؆9��-�㷞�%M��(����վvjԊ-IR���F��_E���Cv�_B^ο��$/�����]����
x�k��s
Ћ���9�n���*�&��U��Y�T`[\5�����1�~9���b��������s;�p;��%4�V��܆�,@k�v����.n�DF��?�m����:���:R�ր�5�j
�Z��Z�F�)�Wk��p�����WWK�j	\%��%p<
� �*�6�C���$p����"�4�ŠJp���SA3@�A��r�.�el{$�A���Znam��A�@��r?� �Z}�M)P �	jj����
��A��|P)h,�JW)�*\���p��RK@�A��
�ZW���M �j�t���ܠC�# �˳cޟu����:p�n����44�ݯ����A��r�8�D��t�,��|�"�RЋ �^_
��u�_��u�_��u�_��u�_��u�_��u���۠�o��mп
��A�6���۠�o��mп
��A�6���۠�.٠�o��mп
��A��h�A�6���۠�o��mпm�O�_��5)�	��������5�VO��N��N����CQ^�䳇�CK���0P�
$an)��!L�fiK���ӵ%�m�\ڪ��\5YM֖�j�V̈��
�7h+�P<{"T��j_X�����B.=��a�>�k��붂>�⾧�ц\nG
Za�+��Y\�
��M�>:�M'���pR��N
���G�ʽ�����W��j_Xc�[��`��6�Q +,1�ve/m����+�w�����_�@-�z�&䩣��!7=�q���M��;h��ND�`�>�&�2O�q9�3�1��x��I<��ՔJ�ԍ4�AO�9�SKi}q��Ut���Zx��KA�A�p}<w��N�[����S~7�B;[��!wE�a�sA�!?��4�hh3hڿ�Sg{�t�f�-�[A��F�"AѠX�P��m܄6nB7�O��uAO���u]	��
���t5��g���kO
�h!�To��&Zh���|��,h	�9߈l��M� \cTL��m�
c�:r]���thh$�6�(�hP�T��ys,�v�8���;A@w�&��3���C{���:���lhe������6�El�T7<P��j�U2���u,��,�0�Q���ρ��,c�;̲!Xj,��Z�g�u��:Xj,���R�`����zXj}K�J�G��(э�(�%֢�Z�X�kQ�%֢�Z�X��(э�(�%֢�Z�X˾�*�4�1�A����}��Fp����ެޅ�	�E�ͻa�nءv�����pP<�t��JPw�U����^��A���>Vk|��(�eW��j�]���Qv5ʮ>Ge�<-�R�P�5s�PjJ�;ǖ֣�z؞ew���z�]��$h�)�B�ӧ�7-�@L���?�ڽV�i+n��&�m~l�#Xl=4�F/?e�4��:���C/���:���C/���:���;�K�<n�Pb-J�E��(�%�i�|J��5�TGm~h����?R���Q̇,
�4���R�~$�Z�F�()��Z;#;�hh>l�6�M�an؄��E+k��Z����
��S"A
��2AY�lP(���
AE�bP	�T*U�V�^A���A�@P��B@��q��`9�0PKX�@�����n�΍ޱ/B��л:���C�,mY�=t��n�Ѝ�����5x��=u��n�ԍ���S7z�FO��=u��n�ԍ���S7z�FO��=u��n�ԍ���S7z�FO��=u��n�ԍ���S7z�FO��=u��n�ԍ���S79�ӷ٣�D�hȫǦ=m���m����(�\�
u忄z%u�����ޣ]K��:@�� ��
4�n��4�FR�S&eS�K��tz�fЃ4��Y�0ͦ_�#�(ͣ��$-��h!-��h)�N�M����V�F�i�i�Z�C{i�c�y���BN*�D+�Ut��q�(���q��I�;�z�Al�l���ˍNFg#ܸѸɸٸŸո�mD�F�1�H0��#��0��#�(0ʌ
�ʸݸøӸ˸۸��q�q�����K�Q�1c��1�x˜o<i,�/�/�o�4��]�+�n�fw�*�����e^m�5�1��ך������@s�9ؼ��2��\�ܬ0+�*s�y�9μ�o�iN0'�w������L�!s�9�|�\`>e.4�6�Ϙ��g�%�s�A�Yg1?
��Q��o��n�!*D��
��	�
��)))
))	)
))�Y�R�*��a8�G�#�a:�!���p9B-a����w�S\LV���C����N����v�%{�����\NOm3i�t�y����6߾��s/��b�ď��Lm������R.�͜��/dD~�����j���4�wl�}qf��m�����.����\'�Oͅ��"��7So�����'��|��Ǫ�>}s�}1ב��d��Ш�ݴ�-�S{�f����VQwz�^|�p�����*ǻ�3��iG�{��������?݊y����|Vzws��bݩ���~������Yv������f��S�g~���F�bԌu���x��������R=��#q�~�{j�g�7�i�z��r{�O�>���ɟ�,���m3�����'wG�>{!��B��ܞ�9��)��^DO������drN>��*��)�Iy��gN��~
�����?�J{��>[��f�מּ���������8j�����~�a��cb=sQ��4�J�҇��f�q<>��k?�P�R���?il9�5�����0����C91�ag�?�w5�g<�'���9��t�����Wԝi&�<�O��'f��u䇘����I�jϼ֜�T�a��P�����7�n��g��O�qF?>�g������#��l�V?�m:��:�U�>�4�5�`�:�U6��>y/�wgS#
�{W�wV_m�6}�f�_���uu���#��֝��;�l�kFK^l��\��'�Sw~=:�Gݏ��.����?̮��s�s�g���=L��.<�I����w��g~����"�#�g�Ǩ��u�������g��訦��v�+5'�!���f�/�;�#�^!̻����r>�]�����\����Ⱥ��O^�ϼ�6ŭ��	,���n��|g��7u�7�cwz�Ӟs������.������Yj�o�/F�?�'���_���
�O��H�x:�C���(}^����7���j�;;����n�����b��3��s���s��)�<QZ�ٗqn};��zv5X_ԝOoy�n��	���ͭ��̺��8������f���ٟɳ��c����6����s������3y�&�ۛ��$�_��ʰӌ��4�W����zg�n�/�=�=����~�G�q?��?��w}�y�s����y��O���`O��S}�'��� g��޹���>��Sw!m����?�u�߿�h�Sh���?������{�u�et����O����V��F�K�ٝYߪ�v�g�>�{lo��ۛ�'�ͮܵͮ���'��g��M�_��ɷ�级�rfk>�mg��+������L����`���`���vʙ��w�͟�'b����/`~���G�K�1�~_F��c��Z�Olugo-���?E.��=���r�R.��?����m�o��9?述���_����W�|{��=~�?zO�>��^�^������㟶}�5�)��8���k�;������c�f��O�������=��6����Ű?�o�Osoy��63��0��q�k�wM'�3��Ʌp�"�7PW� x�nԓ�D��&�FA}�S?�@�!��#���@�P��W���¥t#�݊��(�F#�R$�Aq4<����0�R���6uR�m���*�(�!���Ch�,�F�I��Q��i>-_�H����9�Ki)B*-�_������_��Q{Z����_����Nڈ�џ��	!��@0h3B���-A�?mE�I�z�v����'�D���iB �F0���"���� ���F{LzA�}&����G}�О��О�!��on�������?pMh/���u��ۅ�(��E0�C8���I��%\��P
��h9L�An)ZBn%Z�).�@n#��@�N��T\
�Ut�k��
�#��n��WB�.�C�J\���A�����[��+�����������B\/�'�(ҥb�y��q�(��7��|�R�
w�;��/�S'�^�� �'�'�n�؀��.^G�7����[�-j/��}h�{�=�#��ad�7˛i�.�C!GPky�����Qr]"#e$ңd�D�h��12)�29�d%�x���2��d�L��T���i2
�2�Rd��D�,�E2[f�����y2�*e�,DJ�,"]�bj#Kd	�2YF6Y.ˑ^!+�\V�J��U���+�"���vʒ��8�C�A9r��@E�.y��('"���nʖ��$<u���
�d9�9����^ʓS�T�u�����4*����2]NG�9��A�3�L�ɇ ϒ���9r����CV�j�J�V����5r-R^��R[��|�.�����䟨�� 7 ���u
��F�Mr�"��M�&��_�_)]n��Q�[�-��!w���r'�-�Ƴ��n�˿��������w�t��/�SG��|�ZH�t�e���N~(?����ȏ����F�O�'�A~*?E�Qyy>����zY�����ȯ�����7��l@��8e�1ߎ
����)��(��#=@P;����
V��R!*�)�rP�r*'r������]��T�T-UKȭT+ȗ�K(Q�Qm�۩v�OuP(D]�.CiUGȗ���r�IuBɝUg��*r��^��@�n�r^����]u�|��
r�9{��h�u�:
S�j��Wף��@�p�D�j���nP7�Uj���ިn�[�P5�����f�����KݢnA;oU�"e�����m�V�R�0��h�*r����� G�h��bP{��E�q*�$�Dԛ�������SU*��T%�t�N�T�ʀ��2!g�,ԛ��Qo��A��*e�<�*r�*�U�J�2U�� ��rȕ��RUh�85��Pw �5�]�.ȓ�$��{ �B������-�^u/�j*�ijJ����?��8�P3ЋՃ�g���R��Yj�zX=�{\=����<�}B=y���I�$�j��S�����VOC׋�"h����j1�gճ���%��~�[��a�^P/`T_T/B_�V��(�P+0J�Q�AKV���_V/�M�ZU�5�귐_Q�@���z�Z�F��~��5j
���y�Zy�Z�'�'�ܠ6P۳�g)ȶĶ��v�vjo�g�G�q�q]at4:�Ӹܸr'���Fg��F8��)��k��&�&�Ìa�o6n�<����#�@�[�[!�4FB�͸
�(c���h�F�H#r�9ڈ�c�@�5b!�q��c ���ȉF"�$#�L#�H&�H1R ���ӌ4��F:�#r��	9�Ȃ�mdC�1r ����<�F>��r�Q��(�@��(�\aT@�4*!WU��c!�n�y�1�����!�i�	y�1�]�]�'!�m�MW��In�c�y�1�/�_@�bL�|�q/��T��A�fL�|�q?��?h<H݌��L�d<d<y�1���Ðg�!��%�G�G ?j<
y�1�c�ct�1ט�>n<y�1�����!?i<	y����rҍ�Ud7^6VS�F
�6^36R�񎱟��q�lƿ��t��q��]��v�n�6v�n�{��Dz�=�lv��	�eo�<m��n���
y�� �&��Hi�@z�=�I�djm/�W�ٱ�ۑg�����w�%�����b�l������`��s�پԾ�n�/�?y�}9���S�}�}#EeeR`Ю�]kv1��V�5��j^o&��afR����i��c���f��9�̇\nN@�I�$���ޜi��|�Z�O�OSo��9��\j>O��h����!�G�G4,��২}��࿒�'�ق?��D��CT�Q�GT|8�0R��(3�H�
�4�S�|��/�����_M������o��!�]�wT��@!2D'b�Qp�=�N"�	�ICJzH�
��@��!��_y�
�-����CR0�G��:l��XX5�J�6�1���Bn`�Ӌ��pz1�	a�cP��H�`$ӗ����Lg�0���a70�1ɴ���H�2�@��x�%�ٴdT�}~<�$ Q"��Q2B�9W��"%
�e!\K�70��h�fF;!�vb��pF8##���6�P��6&����?��#m@]�i���%���jB՘�jB՘�jB՘�jzAclc�_4F8���1�1�4�9�
A�!/��/��"�������'@0���t��z2�iI� �d�D
-��ϵd��R(��-��'��Mc��~����6��	bl$.�Q�Yt�N_F8W1����*F8}�\��%z��x��9.q����v\�����<.q����|\�Zq-d���u�:�
��(������Z0
j�(h�"��XXh�*�B�� 1L�l�"�q�Ƹ�Ÿ(�qQ�"�qQ�"�q�!�,����w�_�ett�yq����Q���@.�b!�d4؇,�3�1�H�<i~�g�̕����'��(F>�e�,E��	`��td�s#�ȧ5#�X�<c�x9O�)�DN�$3�����?q��$�?�/���?��T�?��|@>��-�(H1

`��(�?]�����p���#�>�|�a��h���Nr�܂�2�	e�3�qN�9��.���2��l�OY��r���dlӖ����My@�+�@8R��p�#y��v�hG�#�d�\ʘ�;cc�6�y��\~NW�/�|$#�K�W@>����G2�q0��GbR
r�ذ�4��$���@A��-�]�
�2c�P�B�V�*�
��QP[�?R�Um�-��I]�.���|B�8�D1���'��� �.�����'���O(��P�?���^��-�#��f�3���d�#��V��0��iǘ�
c�Nj�AW0摌v$��ތv2���h�R�9��T�*<A%�
�q0�	U�*��yF1湔1�m�ynd�sc��c�ӆ1O�<�2��ʘ�jU�
 �B�Ū5Z((�Q�FAь�F0
j�(���]a��X(��P[u��)�j���2�Vw�LIFD�0"���5��.W��� [��r�E�E�]θh4���c\ԆqQ'5[�ƨ�QsP�\5�BJ�����B)9)�2Rr0R��H�
FJ})ug�ԇ�RwFJ})uWϩ�З�j)�b�%�����j��x��6���1^j�^R/Q�Z�V�F;E2vr0v�`�4��Sc�����;�e�$ի�U��F����kН��.U��z�Xh*��T[�M�Mj˘*�1��h*��TgFS-Muf4Ղ�TgFS-M�0�2M�0�2M�0�2M�0�2M�0�2M�0�2M�0�2M�0�2M�0�2M�0�2M�0�2M�0�:���ʋ���ɋ��Hɋ�N�#�~���CG�:2�Бᇎ?td0:���4FG�#�ё��Hctd0:�����t����\�cd)�)1Rr1R
b��b��H��H)�����R#�����3Fj��=c����3FjᇎZo;��,\���"ň��=�H���#�FDʇ�,�|�'˞���	`�ӑ�O��X�G1��0�u�yzٟ湎1O/�*�*p�g�ssPVPiA9A9����.3������p�ɇ�z�}�V��i�ϕ.
.*3G��#�h�if:�L�Y�ܼ�ͻ![�(ؼǜ�^s:u`�ԟ1R�Ha���d�ԍ1R?���iH����=�ȸ(����X�BAN?�d������'��O"##g��d�cy dR,�cc��l�|��yl�����M�e�C�|�r�(�;����]�@2!@0z�r	#�6�*	Ԗ�I�$�1��$�H �GQ��v�/c�k�<����(�z�2�^��(����7�3�Yh!�qB&#�,�I�(�vc��ǻ�
~�Q��1��=�X�뿣�
�BI��]����{�����$��/�{x�>�w��[�أ��y�����g?�;��[�@��)�1/�^����.y<=���Fz��,��=z{����
X���(�
v�q��qW�D�q/S������U�ˮ�^v<�	��ɴ]N���o�/tc_�[�'v���A���䟰��^p��ϼ?�]�Q�W�>���m�R�ƞ�k��}�{��;<�uz-x?'�uz-t��>6Y/�A�k����)N�4Z�a7 ZZ{/��.�h�=�%�2�DY�[�*�EuP=EWu�*�cOs��nUq�f�E�D4��"{�r���A��n���&��D����EX���kuX��X���	�Wj���t����q��m�mb>V�
�I�dK�Sֹ�x�Z��"�d���U��W�7-�*��.�ŗ����Y�N�wL��.�ݴ,/���o�Ghe�8{�v��˴)�e�����<�6߾ľT{ʾ̾\[?�Q{�:�ў��f���?�~4X[_����N_�
���޴<��
��	�O�ށOy^�o��hY'.�a��E��u����ho> ��,�������,���YdO˳�^�_#����A���&�[~D���?R!��;^���א�,�!��h)g�x��}�I���̀�Q[G���h��Q�Q����cdf�F��CG��at8����=�?����8jt����٣G���뉣����x��9��#^4z��G��zt��
��<z�蝈kG�}`��џ���-Q�a�A�6�#�="�"1$bxĨ���Ĉt\�FGT"1)b*��#�"^�8b��k�����]{�8Q��h�W
�TF:#[E����
q��~��������ȱ�O��9�#��"F.�\�2�\��\�	�����#�F�#E���Ǣ�lQfT(��Q�0~QݣzG��5,jd2D�G�Fe#.�*��EM����5'
��(jiԋ�WE��^�G�Dm�xsԶ(�cTmԾ��G}U���h-�N�q���=��`==$zx�(�1щ������h�g��I���ѳ�1���Gc<�WDWGc<��Eo��xFo�����}�˫�>�����gL���1�b����30fḧ������̘��Ҙ�1b&[��L����y1c� ^�2��6f}�3fk̎�c����#�P��?�9�8�k�b\c[�v�Ÿ�v����;,v��8;��z.�<v\�D�Sb���B<'v~�"�Kc_�]�xulM,F6vs�6ο3�����{��ñ�p\���iq�8�k\X\۸�q]�z��7$nxܨ���ĸ�ܸ�ʸ�q���͈�ǿ��[�8��"�:��.nc�5n{ܮ8�k���q�Ӹ�q_q��1jL ��Vc�#�4�ۘ^���8f(�c"��!N�9�:�t��1��1��L{�Șyc"^2f����_�v�zě�l���1{�`��sd�爏�S��(ތ�o�!><�{|���Y��q||j<�6�0�<v?1~J<�6~V��x�m������U��ko������_�������o4�{BHB�	�"��7�0$ax�5!&!1����P�{M�0)��0#avF6aA��e	+��$�Kؘ�%���Iؕ���	0�	Gx\�1����V�ub��N������ġ�#G$�%&#�L�O,E<6qߟ�8�㙉�p</qa"�8qy�J�~%qm"�9qS��D�s��Ľ��N<�x$���c�\ْ̤Ф�I�“�'�N�48iX�Ȥ����Ԥ�¤�qI��$MO��4'i~Ң��I/Z�$�Jb�T��!i3�mI;�`�I��$F�IR},5YK�'�N�Ò�&ï&wM���< y��|���Q�1��ӓs���+��'OJ��<#yv���ɋ��%�H�N^��.yc���ɻ��$�O>��_%M��LnHQ)�gJ��iJ��n)�Ӕ~)S`�)#R"R`�)�)�)�ӔҔ�)ɔ�)�R`�)���K���,IY��Ly%em
�/eS���_�)�ӔC)GR`�)�R)Ֆj����N���=�wj����RG�F�Ƨ��f[�J-L-O�:1uJ��T��9��S1�S�����y��:�&�>us�T�����}���S?I�?M�6MK�?MIK�?M��5
�4�oڀ4�`��Qi��Ĵ�\��i�i�OJ��6�촹i/N[��quښ�u�7�mI����Jۓ������JkHWD���tXfz��NV?һ���_�@����:�#��8NN�8=?����l����N�g�����K_��t�r-}e�+�M_����Hߝ�Mw���#�s|,�2�2̌Ќֈ;d�[��3zs�?���1,c$�Q��f�>2
3�9�1��)�9��1���[���l��2��3j2x��؜��9cg��}�3g�Ψ�`���e�9���2�fv�kf��f�z�9$s8ǣ2c8N�L�87������Oʜ������\����|]����u�9ޒ�'sW&�����^f�e��+�RY�����Y쇲�g����e����e����f���"�X�Y�Y��,�w��,�;krִ,̦�G��eA�YK��ga6e���6��ڔ�5�)kw��,^W�e�y�1+Φl[��84�uv���ݳ���٬��a�#����S����˳�eO̞���ٳ����ً��"~1{U64�]��!�){[��lh,{_��l���O�볡�-Ǟ����6�����3 �+gxΨh&'1'=�+�8�2ə��ș��ș�����9�8^�S����٘��5g{ήh"g�x���9_�4��\gn����r����;0wh�܈ܸ�d�����|�Ks�r<!���i�3s1�r��.̅��]��2��ܵ���n���ݑ������q�=�{$3(�X�a��y�Vz^�<��w^x^w�{��xp��y#�x�͋�K���+�+��z�71oJfNެ�9yXo��-�Ì�[��:�mކ��y�)y;�j����;���W���#_˷�c������u���=����?<T~L~b~z~n~q~e���I�S�g�c����/ȇ��/�_�_�xM��|X|������ߟKϯ�?���!��@����
�.t*�V�.�W0�`h��������̂��ケ�
&L+�Y�H����K
��,`?U����T���S;
x����
���*8VH��B�0�~��Cax!F��wa�BXr�‘�Q�񅩅م����
'N)�^8�pN��E�K_,\U����pC���m�;k�(<\�Ia}�EZ���WVԶv[Ե��o���!E�W�F�_)J,b�R�[�~���h|�$�S�fa\��-(¸-+ZQT]��h]�Ƣ-Eۋv��(�_������G�WE�?�U1��bgq�b�oq�b����Wq�bx���#�#��=g�=��=O(�x��Ű��y��a��ˋWcċ��/�~�xk�b�t��b���C��7�?/f�QB%6�����%J�2�t/�u����Xt�����T��Kx^R^2��%�[ג�%�8�S2�+B��^JV��.�}�l(�\�.�Y��@ɾ^J�|RR_�m�V��4���i�Ҏ��W��(��t@)�J����8�4����\��K+9_:���tF)��ҹ�J���e�+Ja��kJו�K��n/����)�����h)�Jʔ��9����ڗ��/�V�~��_����e���"��ϗ%���/�/�Q6���G��2^��f��^6����%e����,�R��l}٦��e;�v�a=/s�*���>/c��S9��,-�<)�P^�yR޻�9�I��r^�ˣ�y/O-�u�������q弎�O)�^���)�_}�/-g}��*���|C���m�;�Y_��Y_��y�.�/g�T�U��*B*�*�*:Vt�����C*0�*FU�H��yU�[�󪢲���I�>T̨`�Ṷ�bq�+*����5�8�X�����8�S�z�8X�z�8Z�UEC���tZו�*�WB���*{U1T�Z	�UFT��*�+Yo������i�*'W��*gz�ůd�UΫd�U.�\^���ʵ��+1�*�V��|��[鮄_�<R�~��X?]e�29�j]��*��׏��U����*̵*h�
��
���l�ʮ*��֪0Ӫ���)Uӫ��*��U�x�U����V��q4WUS��
�w�Z��U�U����*��U�T�W};Vk2�l,�5��خc�	�;`,f���cG����bv���	|TY�?^K(�
Ј�iDd"�42� �L#� "2L�4""� "�L��$d�}�}�}��!k%  ?D��t�?�[��^�K�`�������]N�w�{�{ι�{����愒9Y���������9�cN�7�X�dsB�<���W�7��]����"�rs�a~�x�?5�]�/X��,���b����-�-vX`<g��b?·,��|���Y��-�-l-�-�-��E�E$���8g[Z�[�Z4[`O���bD���${�c��,[b/,�da�+,�-�,��[n�^�;-��[�Z���<ly̒�<m	;��h	;�����$�h�i	�hjmI�Y�[�ZV����[b�jٍ���Ӗ�,	/ˇ�O,i<c��JdEf��j��e��
�e��
�eeb�hu�
~���
~�����%+�E+k++�0+o+ؗU�U��E�L+��V�V����ڭȲ���`WVr+�hu�
8Z=��V��Zj
��Yo�&���j��z��^�և��Z�>e
���`}ٚ����v�&���������N����.������n�&Ĭe��z�8YߵƸ��5���
г���l������m6��l�� �9`s؆l��
�1�s6��l�ؠ���A?f�i�oC�em��I��}��/���`\c�m�q�͘
���-�G��6�6�m^ڊl�mW٢?�]o�ɖ���n�˖"�}��7l�ؚ�b�gl���%۫��ml�m�m��m�-��m�-��m�-�ζ��ж���v����m���}[�f��vޖ";=;�!f��vggl���a���k�ߎ���Q��v�؝�C�aw��܎z2;';xE;_;�C�H;�C�T;�hWh�j��G;�p����vw퀣�c;�h�ݑ�^b���G�����~�=p��c�أ�?f����=���=����
�;�c�j�o�q�}�=�O�����Ӿ�x�w�O�1{�i�x�?�������]]#k�����k�ïm�{������5�㵃�`��̮����|�]�{�f}�g�k�8^C��Z�d�3��.��^�]^k��q��k�^��8���k�3�=��8��5ęz�3V;`����V�/��8�w@��p����)ث��/��_�����pw�t���ݡ��;�: �w�t@��0��0�pׁ�wx��́"G�#����F�	q�m���q�#�v<���9o�ӎ���#�v�tގΎ����x;F;o�tG��X���[�����-G���8;>w�N"'}'/8�u�N�����v'��d���:g'3'��t�	8;]r�N�N����	8;:g�X'�����J���S�S�Y�ӐӸ!�t��Y��S�y'B���u�u�����~�_��^�q}�uB�뇮S�y��u������~�:�����o^w��~�z�u��㯣߼�}�����kqn�����:��u���a��_�_�,p�8�p^�l��y��6g���8:p��ǜ���ig��|�8:[:GgggOg�1�C���D�tgBй��9�;�:S��<��y�����;u�_�������*�׺G�M.��e�pt1q�.]����pt9�].�\u�vqpqu~.�.��%���d�?�R����;u�u������N]n��N]��N]�]`��z��S�ծ�S�
��S׭��S�ݮ�S���Sף��S�S��S���SWsWة��+����v��
;uMu�v%d]�]k]�B];]e�����+E@�\1>t}�q���
���
��f�8�m�� ��n���L��v�8���W�sn�_ݮ��u�wC����x�-�
��%����V�s��"�V7�Enn��m�
8��s�nO܀��Kw�����׺g�M��}�;pv7q��݁���;pv?���/��^ݭ�a����=�x�Ǻo�Lw��^���݁�{�;�vw��݁��#w��>���!�X�΃,���v�����^Ļ�<�z���z����z\���z�z�~=�=`���_�x�T����d����=F<�=�<�z<���<����8{��ΞF���s��6O�`�=��_���=	a���=�r=/z^��t���$D=C=�=��z�{�z��������ݞ�c��i=oy��$�<�x>�$�%��Z��k��&/B�k��./����y!.�:�e�u���y/���zY{2^�^�^y�{�z%{ez�{�z^�^�^�7���ƽ��^���oz=�B���x�[�ڛ,�{����V�޻��z��yC��ǽ!w�ސ��eoso�,o'oؕ��w�7I�;�;՛��]�]�M�n���y�xOz�?z���~�
���G�C��Y����g��f�m>$_�=>�>dA>�}���g�9�s·,������v�����	���$��n|r}`7>�>�>�t����L�����������_}_؉�Z_؉�&_؉�v_؉���>_B�����/Y��_؇�%_؇��/�����ۗp�
�E\���K��[�[�������;�K�����/Y��#ߧ����p��#�6���m������׏��;�<�����~��ﲟ�������G���G�/�/ۯЯܯُ֯z,?��+�I?��w�x�=�~/ N���q��ĝ��7��������o���z.�c�'�ɳ����O=���?�+g�����;���w���#��/���'�����?��?����?E��_B��'`m�	�|����}�O����'�L��������L�k�w�@+ 3 ?�F
���z��y���%�Q�Ӏ���@�@i��u������7p����O�
�x9�<�6�)�=�708020>050;�0�<�6�9�3P888x7�$�8�Y y� A�$�$�&�(�<K��mA��A{�L�H�"�:t.��>�J�eI6�9�3� 


�"�����U���u
�$���n�z�$�y��`Q�~���7o	��+�$x_��#�f�'����|5�:�!�5�;808<8689838?�4�:�1�=�7x(��,�L�	~�4��6x!z"
YBz�!�8�<xȎ��!�C��9Br<�T��!B.����
q
q�
	��I
�))�
i�����L�̅�
y�8�YȋPA�$tE�P�Ѝ��C����jJr
=z,��z:�\(�)�J�e(�)�9�3��Jr
M�
%9�V�և��B�CBIN�ӡ�B��>}J� �e�(�F2a��ֆ���m
���λ�L��;fv2�L��KaWì��\ü����bÒ�2���Jê����zÆ����a���=
{6F�M�^�4����u����÷����.|o��p�d�'�?~!�"�p�p�p�����}�)r	����4<;�0�F����d���p�������?Nz!��D��E��0� =���-��,bO�i�/�pı�_��s$��+�$�����Ј�Ĉ�܈�ʈ��ֈ����[�"F<�x�2R��*rm��M�["�G�4��y0�"�H�ȓ�g�|>�R$y�H�H�H�GzGFR�I#����H�"#�#�������*�v�H�"�F�G����Q$��uQ�H~Q[�vD����F�"�E�:E�:u!��eeE�r��"�EEF�G�����
�H~Q�Q�Q$�(Y�H�/j.�n�/�qԳ(�_� ZM�^mM���-���'�4��}8�X4�/�t�h�_�h�h�_�s�g4�_thtt4�_tztn4�_tet}4�_tw�@�X�t��{���D?�~C~.F?fU�Z:���C.f{�[�Iⴘ�1��b�b�Ŝ�A?s)�j�5�b\c(B�	�	��(&9&3����Ҙ�F:����PD3#��M�1�b(���Y�%K��Ʈ�%;��kKv�#vw,�q��C�dDZ�cOŒ�^��Kvk�K@�olp,���񱩱��Ɩ�R���K�V�H�d,�8�wc�R��,�E=w�$nEEXqFq�h��-ng�0q�q��;w"����sq��������?�3�?�z����8���r��h$W�G=J�@�X�Wq����Q|�$�y�W�x�x�I��Ư��D�-���I��&���?�||��3�$�K�W�I���������������������C��������?���_H�K�&�NX��!�8akŽ��	{�'J8�p<�T�ل	��l��|�"�R�
�j�:d	�&�O'�M@?��8�t�ŧR%���$��Nܘ��P�D�3�$"NM<�x8������)NM��x%�"�D�D�D���O'F'����D�Ӊʼn_&�'"�؝�|P�X"����'H|��<A��D�	�DI�I$礵I�H�I[��'���L��%����$�%�'�I:�D�t��$�$꧓\�����N
OB������^R~�zI�I��%�'!��4���^�<	y���I��%=MB|�����)Y��|l�d����1�Hޑ�qF2�x2�W��C�Iϓi4�L~$�t=�"�d�%ɤ��c%�?I&�O�8+�|J2�}r|2�����$�'#O�ܜ�<A�,x&O&�du$��dɄh2����P,�B���M��)�sRєm)�3eO
�L9���Aʱ�
RN� o�r1y���a)�)��R����D��)�)�)�R*S�SՔ�S�Sn��)S��P_��2U�J}a�Ե��S��$uK*�Sw�b~8u_*�%�GRa7�'S1��z>�ԫ���J%lS�戮oJ%|S��©��©�R	�T�R	�T��R	�T�U��p�<�v��G�OS�S��Ҥi��֥mH3Nۚ�#mw�޴�i�Ҏ�O;�v6�B�f�f�FX�����Ni�i�i�RZvZa���ڴ�4B'M�6�6�\��������^`8!H�����פ���7���ҷ��t�Y�L:�	�L:�Z:!�N�+��I��\�-ӁK�s:pI�O�ݥG������aw��鰻�t�]zw:�.},v�~+v��0v��<v�!��cƪ��3�g��-�-cWp�ؗ�2�d����-�|p˸��22�o����ψ�H�����(ͨ΀f�g�3�2`���a��a���a�B&�0S�	;�\�	;�4΄f�Ȅf���x?��0��0��0��0��0��0�p�$;�$;�$l3�3�3	�L��L�dƙٙ����L�afs&�0S�	;̜�ޙw3�w��L�"xg�f��Z�Ehgm�ڜEc���Y{��Y��߬Y��۬�YW�ȗf�g9g�Y�Y�Y�Y�3+=xfgϬ�,�՝<�Ʋ�g֭,�0xf=��٢l�*xf����[��g��l�/xf���'��g��l�}5xf;d�l�l̟d�g��f'g��f�g�f�
f7f�g��dلl6�bلl6�لl��l��\s�9�5g]p�1��94z�!dsȿ��9�k�ќ�9�i�ٜ9�g�y�m�S�9�9���D� ?����<zNa��9�9ȣ�t��rɜɜ��9�b��B1�|i� ��������"��9y�ܝ����"O�{8y��������������d��w����Ks�js��$��A���"ߐ[��<]nk.Ƶ����ʹ�r��R,��$�y��<����0��[��qmަ�-y�lޮ<�<�����#D�N�ɣx$�R��<�<�<�<�<B0/<��%�e����U�5������ϓ��λ�Gx�=͛ϣ�9_/_�OH��ߐO�s��������?�O��<y�����	�|�|�O��O�o~p>�Y~|~j>!�_�_�O�ߜ�ʗ�þ�'�a_�w��.���_�$+
�����A��, $
L��,8Vp��t����W
,��<H����$��E��
�`O������S���S�Â'ԗ�,��*\[9n*�R��pW�I�B���#�f���)D<]x�y�B�B�u
]��,,/$�&fR�UXZ�|gac!򝅽��w�"�Yx����G��w�"�]�W��v��"䷋6!�S������E{��^�-"Xt�y�E����9"E�E����"�KQj쥨��RT[{)�,¼S�H�EsE�{=(B޳�Y�łb�M�b�M�Q1�xs�b��#�(>P|��X���ň;�/�+�,F�V�\���ؿ�[qt1�aqz1�aqq1�+�/~����x�X���[��?)&��_��J�KV��-Y_��dK���JLJ0.*9X�qQ�Y	�E%gJΗ��+�Zb]B���x������ĖP�Q�Y�_B�FIuIc	!W�[2T2^"/�]r��Q�Ӓ���R�Ri���u�J�K���(�]��t�R���㥧J	����K	�R�R�R£Է4���4�4���(-,-/%�(m.�,%JGJ!�ҹһ��J�>+%ɗ	� ��e�{�Q�^����lgٞ2Ӳe�ˎ��(;]v��bI�̲̾��R�gwe�e���IJ�ܲ�ʲ�2�pYw�[6V���*�WF���I��2�i�E����ז�/��|K��r�p�I����G���O�S�R~��R9YF�u9�ܻܵ��Z^[Nr-�,�/'��W�7��\�{ˇʩ�(���.'K(T���z��
�
�����*6TWl���W��[���P�ъ��*�V\��\a^a[��~�{���������W�W�V��WtV�*�ULV�U��W<��~W<�x�(\��rE%I�Ҩrc%���m�;+�T�V�$�Sy��D���s�+�TZV�W:WzV�d+C+�+I�+�+���ŕ�����J�����ӕ�_Vޫ|XI=y��ʗU���VUQ^��jS�뫶WA�L���U��T���:Yu��<Pե��U�UU�U�;U�U�U�U�U�U�g�*��ߩj�j��~�j�j��<N��U�﫞V�W���֫���^]
?S��~�zk5�]���h��U�>^}�~��B5�Ϫͫ���ݫI��Ց�$���j������j�W����ղj��������W?�~Q#��� ~�YS���fc
��m5;k�Ԙ��9\C=p͉��5�Qj.�\��~�ƾƹ�<I�Mh
ivMbMz
!PS\SYC=mMkMw
iv�X�t
I��^���{�󚗵$�Z��U�$����jI��kw�R�T���`-y�Z�ړ��׵�k/Ւ^�Z�:�R�T�]XKc�����Z��j�kKkIⵍ��$�ڡ��Z�w����$�ڧ��J�U�W'�[]��nC�q��:�t�u�����#^w��lųu����H�uNu�u$ߺ��:�o]j]v�u]y]m�u]g���$[7Y7WGz]���q�:u/���9�Wԯ�'��o��\O�~g��z���ד\�Oԟ�'��_��ROr���w�'��ׇ֓\����I�����$���z�k�X�t=ɵ�^��z�k��
$���-
kП6lj��@qKî��膃
GH�N6�i }n��p��"��������G�2�J�0�hho�mjo�7`�p��Q��
�
�i6JW7�&7nh4n��qG��F������/7o<�H�x��r#��F�F�F�ˍ������SIs�Is�;�/7�4N6R��x��A#y��g�/��M��Mk���66A_��5�l��d�t��pɵ�D��&�k�Ŧ+M$�&�&�&�k�Shɵ)�)����T�T�DrmjmB\�4�4�D���Vӽ&��MO��7�n5�7�d��6�o&?ܼ�y{3y�f��}��4i6k>�|��|�����ͮ��́��ͱ��͙�ͥ��͍����55�7��6�n��Lz��y���E�E�Bq`˺�
-�Z�����n��Bz�r��h��S-g[.�\n1o�mqjqo�m	n�l�oIm�n)l)o�min�l����L�̵�my���YˋVA���޺��޺�us�֝�{Z?�h=�J�k=ъx��\��V��Z-[�[�?k�l�o�ȡ5�5��"�����V����$�ցֱV�_��{�$��'��[I~m�6�6�_�ڶ�m$��-m'��j3i��v��H�Gm'�δ�o��v�ͺ͡͵ͻ-�-�-�-�-��<l[i[uid[{[oEtm�m�6�ȶ�m��H����Iۥ��I�7���>��h��N�ؾ��P;�c��S���/��>�۶;��>�����>�Ƿ���>�����>�7�w��>���O��>��m�N����E=w��cE�_F;H#;�u���ô�@�_�:Nt�D;�u\� yvXv�w�<;<;�;H���$ώ܎��gG}Gkɳc�c����q�qs�Î'wu�L;��;i�Ir�\۹���ڹ�s{'�e�I�N���#�f
��y�=�a����%�|�=[�g��ʞ��s {�:���N�3���D��Yډ����qwgo'����N�ݝ�;ww>�D��9�	�ܥ�%�"��Zׅqj�qƩ];����ۅ�Cס��]䧻Nu�?�Ѕ��˼˶�"�.°��uE�]�c��T*�e��.����.��]�3v�]俻(��"\�ȇwQ��E�v=�z�8�nI��n¶ۨ{c7a۽�{g7a�m�}����>�}����>�}������&l�=���C��u'vc<ڝۍ�hwe7ƣݭ��;�݈S����t��ƺ��'�X7��G�CX��=�o��w�!�{���!K�!�{���!�C��P�C��=�x��CH��=�p��C�x�Ϟ��W{�{�o���A^�������~�g���y����=�'�<�Aޡg�y�^i/���z�g�q/����<{����C��7�=ދ�m��^̛�^���^�^ė�/{�{�~�7�y���^�z�{��6�"��"����x��n/�I��{�O�}�'��oEߚ>�}�6�Q�ܷ�oOy¾}������;�w��"��J�e�����<�(����/�/����������������w��a��}�^��Ne�2�˲���2�M�E�]F��Ld�d����LFX�����'�U���0��ʼe��pY�v&˔��Y��QF&�
��er�m�}!!{*���E��K�	��u�����ڿ��$߿��!:�?�O�?���,�߼߶�$�����O����O���/�'���o�'��G��V���D��?�qҀ`@2@=���!
l�6@�ҁ=��|x��	:�87@��2`9@�p� y�D�<�r�B*�h|4�=00@�10=pk�<�Á'd/E�d����-n�2Hv0�k�dp��#�f�'���4xu�z�a�u�{0p0|0v0y0s0�t�z�q�}�wphp|P>x{�����CzCҡ�C�6m�1�{h���CCG���:;ta���Ӑ���P�P�P�P�P�P�P�P�P�P�lhdhrhn��Ѓ��Cφ^�%�+��
o�<�mx��a����
�>=|n��2|e�r��2�<�9Lr�&����\�+��I.����$����[�$���O�I.�/GD#$��U#kGH.#�F���\Fv����o98rd����ɑ3#�F.�\!0�0�:�=8>;�<�9�?R:R=�8�>�;242>"�=r���ӑ���Q�Q����u�F�G����=�wt�(�����㣤W�gG/��^���ڎ�^������^�F�Ə�^�f���^�֎6��^��FGFI�F�F^�>}6Jz5&���^��3#��<�m��jlϘ�����cc�Wc��΍��Ʈ�Y���Ɯǐ��C�c,zy���1�NJ�0N�C�c�{��1���n���{8�����1�}o�n �{c�
�}o�����-7���uy��n �{��
�7N�@�{�
�7��@?{�����7�U��w.oIJ�d��ɞ��3�7<nT��F��Ξ{�3�w@n�wߐ���͞�g�o|�xʞ��3;~�c�R���=�c���ǍǷ�S�:�{|�8y��C�Gǩ�?5~v�<���q�qW�;����G��O��/���y�s\6N||r|n�������I&�	҇�5F��'�M�>L�0� }�8<ql��a��Ĺ	҇�+����dO���	��dO����dO��&���O&Ȟ&^N�&	��U�k'ɞ&7Mn�$�'wM�L�=M�<2IO��<3I�4yi��$!;�0�:I�d�d�$�8�<�9I�M�NVOJ�퓽����|�p��?�h��>9?�0Er��N��"�Nm�2���sj���)�_��O�::u|���٩S��̧l���ܧ|���"��R���
�ʧj���:�dS#S�SsSw�L=�z6�bZ0-�^1�f�hz����m�;��L�N�><}l�����s���L[N�O;O{N�O�NGO'N�O�NOWN�O�NwOL�MOOߚ�7�p�����3���U3kg��l��2�}f׌�̾��3Gf�fNΜ�9?si���e�a�u��28>Cr�I�ɜ!�̔�Tϐ\f�gzgH.3�3�����G3$����9�E.����\���r��|�|���"�/?$�HB~\~JN�������"���IN1��W,����S���By��V�,���#�I�����������Ŭ`V2�bvͬ����ͳ�fw��5�=0{x��,�����s��W�Wf-gI�f�g=gI�fCg�gI�f�gsgI�f+g�gI�f�gfI�f�go͒^�>�}2Kz5�rN4Gz5�jn���ܦ�-s�Ws��L�H����#��;9wf��j����9�ߜÜ��o.p>b.v�a.s>a�t�`�q>`�w�?7>���=k�{4+����u�Ի	����&��憛�G��z�ϛ�o"us�M��y�&�u�<uq��7��4����M������{y�7���f*{�fυ친=ײ�f�����2����������g��|�}�[���=�a�F�;�6�g&�+�q�H&��3G�7A9�-(֠8�r�����nP>����A�gЍ@�e��1�(�t�b�(��X1�	�#(�b��/Oŏ�>��=�k�� D�
�<[+8�b;Н8�u_P|@�(>��k���wt�I48����E�A�(�@YǑ�:����UP��APd�@>�`P������@�(Ơ�
ꢭ��	ʛ"#:.�x��y�3G�g~�q3(��[��-\A�bߑxD��� �)��e��W3O����=�qGk�Gko3�	<@wݡ�c�1�r)BC����B|���)�nx�)<�/�;�mp߷AyO��b��P����$nx棠��V����}�_�@y¡Ԁ2	J�(��w�Ux�-�O"x�ʍ���>�AˢP@Y��Ǹ�,��!(O��oA)�P��Et�%�
����ť*�J�ȣ\UQ�@�P�O I�?a��b�ڔ@%E�1��x-J��"�-��x_
/�'�z������EW胯³)<��ymJ���z�(<��ԞGh��)�X�7T~�u(��Q���?�(���(~��p}���,(}�kQ�*O����W��9����I~��$��䯦�R]�E��ڃ��ʂ�^�"W�"�WYPz�n��s~��~U�{*{W����T��㹧�Y܌hdP�
��b�h�N;������Z�x������[�Z4��f��Rc�T:�������D�x�y Un��O�p��%�-ߦ�X<�XN��/��z%O4���'��sGͳ�e���/6���p"Ie�!��o�ԑ�EL���T}������{�_�8�F�~���9scZ�(ܘG�B��w-`�h��`�R��̻+bcU����H�'2n�����j���%9Q�2�b$�kmGk����//���u�r���ˣ��KU���<�Yq�o�_�GPq�=��e���j�6���{Z����giy~%��{:�Ku�k�D#���s��ʎt�F:�HxA�
Cb�ѐ�����_�v��T1��*Bx%H�3<�upb�Wj6��	&�?�gG|/�����qw]ce����%�{<�,O4����W�<L���S�kGmWпpG�[@��?;�e�aG��ЂjċW��U�<�ڣ`\�Q�j���%�x"x<wx<�Ў �	D�����I��W�eZ<����.�wAC�����l��('�X��(u�E�v,nb�x�堯�di,A�䠹E�[�>����@�g�E�3��	J�X�X���7@�)
���/�*���c-��o@+�L]$V����Jֻ⌣}8�Égc��hg=�9�6׾E�����w��b�ҿ	?�Fz2���A���R�zc��M���*\[��9~���*'��6�.�~�c_�\��
�����F��\�fu6�[�	O�'�Ʃ���c-�?��?����[�[@�=h*b6s�E���:�����b�⧈F]��?�.؝��CP���H[���(u� 2f�A�Vd��*r=c��ᾫ�_�����Z�7�gEx#�%��q�k�ů�cY��<_}P�G�M��x<_��X�V;�)�z���sm�1Ϧ5B�
���*E���"KP�1f2��v��#6���ԞG岱�/z+~fX1n�����X��׎�XB��^i�1��
�xV�o��&�3�_��_������(w?(�����9H�r�ZP{-п��W��W�!�ʸ��џl��<�{m�~�H��"p�'��sO��:^哢D!�}���Z�:�,9y�(w�����?t��_7Ƈ>+���1�C�W3�c��v������Ws�D�[���J
��i��⎚ٕ�Z�%�ϗF{)
y]�uG�ot��m-~e��/�R�D��B�cF�z;W�7̰��>��-��2��Q�g$�\܉Hx^���5�c�;$�W+�F;��r��h��h��ܼ:'��	�N�<��>�>̫��u�3�n�9/!��+�_��6�g������"��G�^cD�Ɯ1���:�6�^͠KA�jg��9O�U�x@��!�A]��D=�E�#�x��w8>|;�nj-�k<���_µ_�i���5�QQ�]�ͷ1JR�R?��@����ǜL��K�`v�⍖SQOE�	�&D�%��(�P�]�}-���������$�u\�������C9��n�l����5��/��/���S	�:��ƻ���V���^�"EtԅF���v]�N���XG]��j�#,F�����O�)����f����:�_�i�b���?��	���Q��E�>3o��򡶷��Z�r��k����C�u5E�Q�2��?�j_��aB��+ǡZ����^�B�[RŌ<lD�7nï\?ɱDv����E��7�{`�,�B���	K_�����h��z2z(�d�=��[�K�	a,�*��Ո@_�+��E�{�䜺@F�
~ �5Q�0GA��G��'zH�U�:���1��5Q�>��}(^`F���A�U
J5��Q_@W	���8�A�(����t��2G�O��xNO�i��C��X�P
@�(����֊1���(֊�L��o���%��ǣ����˔��cꟇf�G���~��¯�ǵ���]܅�u���M�v�_毖A��g�X#��Jv�U�+�>�;bW�Z;�^��s�W]墎u�L�A�2�ȿ-S�;��4Ғ�8c�׽�;ߤc7k�q�P�C5ڜ��L|B�:�ase�5*�>Kj5=''�Ǔ̃�#�4�ZS�����c�Y�%��jN�__am��\�D��Z�W����񵈬���u���q�ɮ’-5�*|Ϡ�0����n"�e|��AU�?
�f��v-QG���h紎h��B��K�s���z�3rTx��:l\��F���r2��5�|m��2<�Yo��?XA2
D~̮���>S�Ug"�$���$"7a��.��@C��U�v�l�H�*De��f4"��#�s���!���<�qƘ�Q�C��#��wD�U��>�?���sƪܘG�?a5Vi���x��K���F��~BH���*F4m����gP?�:2TB7�L�[<O�z:/��T��ż
��ʸ^��B�?b⬹Z��*"�,�Ѐz���N���
S��������/��a�
t�9�`m��Wۅj�Γ�Y�nGi؈zE�IE?�ζ@8��#�)2���;��0���aN�9�#�-�ۘ����/���8V�ү�뢏�扸��}��2t�b�X�.��W�׉6��Ym"�"!Z�j�.��P�e���
�M��U+߁�>猹d�עs3$l^B�c�x���2��2��%*�i�h��L:�<��y0�'�Ea�jV�XÃ������<����)�<�6����G��t��:�}E���Q�"�-�k��d�K�&��x�r�{��[�{c��K3��Yk�:<�b��c��l����]�U�n��Lq����";Tz	��A?�9п�o���~��s.]��s���;��k�{�t<�wv@�QD"EOd�=�:î�2Ty�Kh��}G�^�U��Uo��{���@W���!
�%������~O��i��r��y3/�<��ܜ"���)c�\�l�sU�a�S2�yCV�m*�r��9Җ��*0tU�P�{F[y���)�8�@]�	k�u����{��`.�\;	�a�l���ʨ���2�_�\����t��2�u�M�������Iظ�O*��"�+"
/�/����t�u�ς��E����Q��5��w��	�v�څz����w�.���+a+A���+�u�:�����~�?��䌲��<r���7�-�9(��?����+W�i?��ǡ���[=�֢^��.��$��%�����'�y��#2F_��$T�^���!E_�+��@WD>��"S��[��O�MT��j�^�2�N�.���|�6��m��ݯ��AWd5?����B�)V+��{��{
�b�Сo�^l��U���q�roG]u}��ˮs���ԙռ�V]���l&�&�_�rwL�֢
sĵ\+�&�or�v�h�Rz!��p<�h��K�o�ރ ���Z���v�=�G�Ru��E�g<�A�J�S�J@CJ�^����B&�4e�)A�	&�#�QcTr��y��(�y(�T
0S)�u�n,ΓF�Ga�2�/�g�
E�%�.ǯ���<�1(C�|(�#�ǿ�Y�~�Z��,盘_E��P~�߃g��0�]�*(�8�PP�Q��Q��g(l���1�iM���W
�&C����;���sA4�(KAa�J��.�w�'P�x(><	(e�G��MMR��%h&�f�O��"F���!����<�����)���
�_kQ~�RZ��ע���"HB=	��S�#篸��q�iA6sD�o]��<��q���d�E�9�>�Ї>��w�b�R�obv���(C������<N��Wي���<Q3#o����'�&(G���|$�o�i�G���d�0�A���d��L<� �>���<��4ވ��#��-*P��gf@S1r�����o���e�m1��Q9C�O(�҂��G�?bZ�ag��K�d���+����K�?ݍY��̜�h'f�!�a�w�x��,�e�[�~^q�+��5D,��o��<�uџ�|Κ��p�K�U�]�P��ޟqd�ME=tsH��p<�β1-x�ȷ�>z3��fu��3/������,�s	�^��Op�u̩	rU�`��;�
�(K�#�2�ֆp���ͪ4��o"�
�U>#%[�VɷDekL��ݎz�=h�k�G�k(q�)(�(�R�-�z:��l�o���Lߴ�;����p�l&+�l9s�\}�梙V��(�<�x�h�;�����ݦ��}����$���m�͠/���t���Z��~�%����P�h�o�d<��g��	oՓ������|�dzZ{�&��N���v�a��ҳ1O�z6�:�x�`�x�#t�-l���S�����D�I�~����y����ۇ��Β�[�_<�ۍxx�݈�Jo͕��J�WZ;}R��{h�����]��Z<�q�R{͖���Gng	~���JG��:�7�o�$?;?��M��A�*T���<<�;jȓ;�8
�KN��͚+��p�9��9�i�sdP��y��c��1Yzo#�,���b�zz:���X��#/wK��K�z�]�*M�|�b�w sM�;*��޺�;���f���f�{'<�f�<Y����O�v�{#x{�p�N��Vw��{'Y`��à�y/��R?�rOe��{*�?��S�6�Zyn���E���7���%��s�Z��w�µ�W��j�|{�v^i/��縊��h�y�="�j~��^
��p���E���0��6����uxy<rO�玚Ϭ���eWM@�pr�ˡ�k��x�*�j��z�;�l�+�T�rw(<��9��d�H�W��vt\KoY�a��w�����aX�F����xZ�������*/��m�;�<��P���̔��k�m�(�g�_ã����3��NJ�3�N�{�:����ѿ�G�<��<�u<�3G󞙳�
�x�L�wE��c/-�0��<�Q^;�`���3��NJ3N1��wƾ�oO��K��h܌��i�~�E�K�C4[z"��u�Qo��������^��g:��t�[�]�-����;�|��E��Zx�\M��Q��8��T=�/�˛�V�\A]��6��y���*v�����r5ϯ��q����S)V�|��w������ȵy�T�<a�v~��a��9k���\����'�[QߊG��0t1�t1o
�ߢ�oˆ_x��C>�=yu�m�>��-��Yr�:11g;[�i�U�M��bg]��b^]�<?֮k����EX�+��b
����<�gA�c(z��h@;S�1|�
"^=�;.���?���������u�	`��r�?(�J�B^]�}�X^yVe����m�71������Gj]����q��v����b�P�Q���}�:f�E�p�l�E��L��P�JE��wo�ߢ�]��[x�<g����"^�,�u�������s���=#�𺺤]���������;�zΧ�1�3���L�3������4z"Ī*�o��11�
��
L���x��T���:��U�_��}�Qh��rv�(�!*��N=�<w��m�:wO�.�Z,��;]ܝ��s-�ͧ�5�u�.��Jȟ�����K���?�ͳ+W��k���++�b5E'(u���P�@��K�.�k�п���r�e��@x�Y�}���]�P�c9kB��'N�.�.�Ӛ�[�ʐT��!'0��	�D�$��EP@� �*�6w�E���L��ⰺL��mR�l��~� p���z��乫U�G�.>���⟗���7��Ʈ'\��և�^q.��[qD.�„̮��
o�w�)V���h��c:A*�_P�{_�N��0��}+������5vh~�
�wE��"�9�P��r#w}�f���G��9�yHk�s#x������F��X�ڪ�1���rW��E!I�)r���9�F�L;s��i�
���rg���
7�M�k���<#YsV"q��[j��9���ݳi�Am
�أ!�Z�ʋ��`A��f͕�?¾$�N�<F�y���^�ߒ��!�n,�=��}����]��ݠ�}��v�r�:兀=	<��)V�,ne��=���i'Pp2�܆z|���O��E/�v�*W�3��=��B��CO-��
k�ڙ�o�0�&�Y�Qv�9�$!�s���ٿ�a�|����e<��Ua]������>��C������K��S�{�b|�#z�|�~����x�5�}q��b��L���έo�m�0
�����������Y-�^��*C���M�9d�#��h��^�����b��
]���_�����yI��&�%��L�WY��4_E�_ὖ�����=�BEO�+h�b��������0�H��a��(4n��H���n��E:=9��[����D��3��W��<?V���_DBc�A4%����#��M��Gh���
 �7Ft�5%]+_�W��{���6_2G�}_���GP�9b��W�Uvzx�l^Ԥ�-�ّ$ަ��PU�@��$����A��:/��7�����F��Y9���n���(��Y�.�(�hiօƋ����F�}�9
g�+͈��3;3G��Efdw[Dq�8�9�O�le3֖����� �e�2��(B +ė����C(V)3�� s?�����Aw�����W��&�]&6�!�7��U+շ���;��m%�7�/qǏ��&���(_X�=$��.�[��R$������o/��lϝ��7���
��o���}ޗ:�=�o��<m�\���G�Т�a��_����MY���{�bV�������+������p��S�W�(aX���Q�M��"#ĥ0O�������ku=��xߚ�%���}^���V�x�i�Bf���<���c/��G��e��sZ;Q���<xw%����)��)�ǪPؽlR�_r(��Ѥ��(��潴x>���SS g�%�%�G�(gٯ���g��ٵO��%j��4LP̥�_�b��@����X����R��OSh(�48te�iG;B�=~-�R�̚}�/S��&�2�s����X7�	���)rz��;�>eF�\
�iR��|��]ѿj�0rf)ʈ�i�_ȐCW�4�� � �
<9K�l5)�<��6���Yƣ|NI._<��OU}j~Hu�g�(�L���R�gSP��3��WP UE��?�-�s�K�[����W�u�ã#$�Ó(����8���ZE?�R��Ѣ�)x;�� g
~��W��GM-��F,�Z����n�4�э%�?����-Iߧ˰�~�Sk��rl�9~��QL�5%��^�)V�p(�M�����^�Q��W��q)hG�b����_�*.ϗ5y�~����/A/TP��ʯ+�yn�M
�6�ZܑGg���ۏ_���(M�>�b�M��h�|���SS��n[�y~����U>����8*����=���ҤkS��<�SRb���z�iM���P�'�cm
��&��T�h�_��Pв&ŘGY���"{bư��O��}>!��]��~�	m�s�c��~�=�8Z�R��"F��\E��-D�>�H����G������o����%Ĩ��������s�tn}g_-�~R1G��,7v/�g��}��Ղ��Lqw3U݃�Y���Hݏg�
2u���!�k�o�������ۭ|���W)�-��`����C	���u<�h�v]���VHu�/�|�������簳KX�����?�
�
X����6���7�[b�����q�Q�ī:b�%�.]�	���o@�~҈�?6�Pt���>TM�9s����#8]ى�S��Pt�.��P^%W�w����E��R>|�_ʙ�w������_���R>|�ޟ����.׫|ڣ8�i��_��M��h�����_AY��	�b�dN�
�=�;����ߐ�åD��|���
��<�p)�����G���A� H�E��M�C����ҿ�g����S/�#H��M�(r\ҿ�ҿ�LQ��k��o�v��K�G���]ѿ���������)���������#��$:*���Ǣ�D|NtL|^|^d&� �"���\l.:-�[�~$�ۈΈ���b'���'bW����S�'z_$�L�"�]��mY꽥�C�D�zs��ˮ.�'.K]�%�Zַ�Oܿl@�L< ї�I$���z��Ւ�z���K��VH� ���*ɗ$����V�V=#�N�N�7%ߔ�Do�$E��޷��hه�?ѿ��#�+�������d�������@�~�`��&�z�-[$_1�n�]����ߖ�e�]��I��o��~j�S��K?�|��H���Z���I򶁇�����odtHL�_�~]�#�;�}�3��������HJI�I�I�I�Cj&5�\��P����������A�RW���B�-��XJ}��+i�4Tb-��FHl�Q�h���U�&��H�$���tL:&q�NIoI\�w��G�#���@��%!��I�JB�Ϥ�$�ҏ��(�tAc(0Hb
�
WJ��0|C�b�Y��JR
�4\/I3�h�Q�a��p�$��-ïI�w��1�#)2�k�ORl������I����4����0�0V2a�`�$�4L1L��f�K���$w
k
�%�2�4��70�<25�<1�1�K~o�;��K�`�����Š�H>^���fŦe˿��銧�KV��X^�2x��
+����]���ڕ�[�D��+������+���_X��ʏ�7�|���_\��ʏ���rq�TӪ�<���
{c�~����dQ+E��e�X*^#8 ^+���{z;�v~����.̗]Y���YrN�,p5x��h1�6�?�V�%�%�m�R[�i�4V�[�9�ߒW%��mm�K�PODE��**k��g�%@e��TvQ1����A*G��Q9I���T.Q�*�YzT\�xS	$Z8�X�'Sɤ�O��J5�F*�Tz�Q�"�r��}*��<�2OeA X�GEJe5�uT6P1��U ^���n*{��r��G��r��Y�p�*���S���Dŝ~�L%��O%�J6���J9�k�4S�˨�P��2G��ѲTL����@ !�,�PYA�5t6����鼍�N*{��ϔ�r��1*'���r��E*W�XR���Lœ�?�P*�T��SɥRL�WR���J����1�m��-�ߣ���?�/y),'����	��r�9῜�_N��r�9῜�_N�/?B43*��r�9῜�_~��5*�T��R	�K%�J&�|*�T��4Ri��Ke��89��T�SyD�)�y*��)��T�Q�@Ř�V*;�즲��~*���Q:����>��΄�>�O�����T|�S!��	}�_?�J!�_���'��;�Ȩ�P��B��ߥ��c*����1<��o��
�o@�Pk@�����o@�����o@�����o@�����o@�����o@�����o@�����o@�����-�p_eA�פ�?rA�7����IU�_�X���Y5�`��W�qA��g�})dv����8�[,��`�αPD�,�N�s�^�_9�����E�Z0�U��"����8*�%���۰o�EԍQ?�I�Ֆ�b'(�p鼷[Ԗ$���Nk��_�G�Dݎ��ó�~�E�,L�n�8�����P,"
\���[|���_�������<��p���G��
<Kc��/�,֖_���Y-O�n/Qh��>�SG9o�}6���A�E����}���	q���O��L���U2d�Qx���^�*-�ެ�+��j/�g\�UE-�6�
]��g��J{��)��x�c```d��K�9@�=uv3(�2�9fonts/notosans/NotoSans-Regular.woff2000064400000552464151215013460013667 0ustar00wOF2�4	$��?FFTM�,��v��d`�
��h��:��L6$��H �	��`[�מ��o��/�yIy��?��ȯ��ⴵ-��ߙ���mp��U_x2��amH�4x|���#k�f����J�]�^Q���k�������������������������h�Dߦy훙��ٽ�~{w����QP�� ֢�X?�b��Ġ��Ik0jc�4�I�_��
X�к�#���:C2�,�ɂ&ry�@i(�J)#
�r��"���B�`��(�"���Eq/R�8��8�G$s`1�c�o�h�̤'���2{��3LfF�0�F�R�
�8^��''X|?=I��I��@W7s�2��{����C��1Ŕ��i�3&�q4_�.��@��b���j�z=n'G3ni�20XZQX;
��/͉_�Zl��'��6��
�f&�If�!��q��i��,�49:���Z9�
�ӫ�3F����9P�	�#}h�!�u��:�"��1q�����Uk߱<2#�nP�ޝ��ז�M�500D2}��(�-rq���{J�}��
b��Kݹ���p��A1"�If�M�7��O(��$\�4hu�uu�-��C����a8�,�C٭��3���BJ�d����Skg��<�)��I�Ӄ�`ݝ_���9H�A��f2N �EHA���UC�)7�~�B'�����&ꢇ�Hk�>L#�s.F!�Zҹ�K3x�:n�n��I^/"�U�Œ3f�>;�6�v��l�'�W�{�7+�@��d&�z[8��1�����p��
3f̘�U�f�
�Z,��
J?>�2Ǟئil��g|���
]Ć�u����Nk���$�nUI�p}�\DJ�T/ΏZ�p̸�� O��P���@?ş1��=%#�
�MPz[�=��v�R4��|JN1�2�N���Lo��f�8��f�.<g��!��fC/�&_L�W��`WHn���'�Ÿ/�ff'������@��a�,m�ݪ��OI��.��a��x��$�L�h�~�_�o�8p��7'��a��զ^5�В�t",�������	'��f�����j�N�=�S�)Ɍ�$IL���Z[#"M2�}�0�P��H�?�!(Tv9�:Z�@�I%���b�X$��g^��[�/N���Z���3q	3z��BJ�4MSS��Zk���Ȑ�b_k�{_o�c��Zk-�$}�EX�R�T*�Zk�%��^�3$��|>�{�k��D$��X��
���G���vճEJ����M��5f�b�)!�S�F�j�@99[^��T��j�D��s4B�$�)_˕M�L)9�H��$�\�����#4ʤ�3ZˏΌU)'�b9M�ͦ�������G(9
3R}�/6(�!c��\���r���cf���ާ�]�	����
zk!M0b��j��v�&Y�o�	��	3f�X!��FXG+�����#�9r�?�aC�}�ȭ�������[[���(N�',��8�.�M���l�h`J+VV�kF�h�0(`��Z������G���5����w:}�X��4�;4�����ۥ�P��j���dCY� o�9ȝ��*8-)ky95�98�u!/�)<�$��?ݡ8�=d臇����nqAFH�����&!�(	�#�r$�/x?�y�f~,���7P�7�(�+�rcyW��gh-�>ɂ��������
�/�[���0l��1=p
ǚN��/YK��RҘa\�=�)*�e4��fvVQ#J�a�M�A��<h�E���_�]��[xW��
��W���B���f�������)�mЉ�X�� 	
���7ԐH��2'�����PeC��$p6���
�E��(�������-zU@:����u�����ɯ����*�X �@/d��y�\
��@r���:QJ��F1i�b�,bU5������K<�-��9�?�_��u����
�����t�R�;�*Y�����MI��B[�A��s��l͹�y�>�E�*����S4���]�;��i�J\��'��23�l6�ݐ��� G�
�3�zߥ'F��P�*�w�X�ᯁ�^d��[�|V6�	L%��������$�5E�$E��J�P	L�Bj)Dž�"��24��t6u=��q&uE�zA�Pk�Gy�G�}�9O���?�;q:�k���d~��O��LD�>�*��y#�iӐ��D��z/ދwƍ�s�N�o�d�℩u�7B�w�%
� �a��w��6�m|$)0���"�,�ʬ��u.���[� 9
����ABt���C&3*ꤩ�����q8��DЮ��#�����������@�c1���;&a2��j5(�|PS��"���=�̦���ZU��1ݕt���&���0��WWU����W�*\+�b���B�a��+<��:_'�`a��ͼ��An��Ym�H$EC�Ik�<��������M���)��q@���0��ȈO��,�Э��MB����.J�HR�d�3�Y�����K+ni���
v��ػ�v��
=��0�To����ͥq:t�fm�Ea$+sm�*���Ad iD���1n��tC0�����`Q����b�6Y���(
&&V`&��o<�o��F���t��K��h)�B���dD�L&���f"�X�6�C
�P�/PXV)�9g�LX����9a�(c�T��8Ʀ;%BF��P���rl����+
������B7��VU�n���ry�3Q�+���p��mw_*O*��TY�,�*:�&*$ �7�ӫ�JIe�`�
yy��1~Q0�;-��c��ngg	�,���0`b��fY�NL"K���}�-�����o������儇�z���|���L
����Ja@�
UWUePh@�	����Jx�I߫�\�:)���D���Cł��H�i�S�������+�6�A—����;�������x�L�L�B���d���$>a�X^94ԝm#|�O}���*��Yِ�t�y����_��ߥ�vz��*�
`/Hi�L������C���CũC��}��of��Q�̞B�d
�
e8�������:3���J�mYF�@U�<�5n�A�9��N��E4�󲲮Ʋ1����=�^��1�_z��2g�qwB(�bb��쮐������=�K�ѾZ
I؂���y_U�H���_�-��jw�\����9P�������v:>�!@}wՑ���UJ�J$�������Ҁk
PB�ƀP�uن���P'�h��ϻ��G51�����(q�R�R�p����Yg��9v� N[��բac9�.����HR���T��)��R�4«��1��5�����D���@xb~ɥ'���hT&�W,����
�!!����t܏����E�/~T:*-U:�$CK�yz9(�J�R�T*5���O����������(�p��vt�����S��^�߽����.�PQ��t��PQ(](
�BE�PQ(�҅B�P�(�.��J]� ������������5�J���
��M������4������`AX0M2�L�e�TO����S�)�41���Ԩ�5�q%�o�kO��i��{uE�
�..Υ|�`��V�ڨQd
����X���Yk�����m.����m(!k�P�f4���^��ٴd2
�������.���햷�v���pt-X�� ����U`���6��&�0����!C�ЖxԔ3�썘0�	Ӛ�0aZ��0QQm�i+LT|„�
Ӛ0Qm�&Lk��D������
Ӂs�)�3D�O���ɉ�&KY*�JK����<*��Ȩ��hT:ϋ��4$�X>Pb:�F���%�|�7z��b8.���d� 1�����,~S��,��Y��[�Ef�AP�m�2��Z*b/0�	�̴�������=�S��d�Ld��m
js�*�0�L�	��d2����0�9��H]t�E]QQtE�PQtхBE��P(���J
�B�PQQQQQQ��r�_b�C;hѣ(��v=I�$I�Da��–8F%Q�$�E�&�T����'�2�	�ن�}3i���[	�*�D�랝��}��@3��4�9��Bcz��ih�G�i4b��X�����sg��/%Ki8�ӁC�����i,�O��"�ÁV�A�Z�TK�q�s���?N�i��,��{sg�,��0F$;�Ou���$ٙ`���83wr���!�[q��V�~]m�ã�>�� ��Jj&��rHh<
�Ȉ˹��?�ar��(�z��ࣹ�9��Cp��0���/���z��rh��J��@
�x�J�
���l���{��K�${�=�l���^""bt�@�S��������r|�pGA|1�L�Γ
��7r�D2�Ǐ}�)�F�A��Q�_iT��{l�a�T��K���J��Ƙ���p	�i`���%tZb�\"�p	k:�!l%wB;�?��(jDQTp{�M��RJ)�կ}n��;�y��B!?�ޅ@�j�,\d�l�/�F��+B�)ZJJr�����I�2�Mq�h�3!��_�~�\y��w"�	��NwAf:�SB.B��d|�9?7����w�n(���H ![��1�y״g/���* LF�*̦
}�N���U���;`�d�8d�P�]dE}��ӹ.���~�_�w�A���5ӠA<X{��O�����U�Ӌgܮ�v�}oa`�7T::�GIxD�!SR�H�R����մ�[_�+��lc��!W�ǤP)4��H<|�8��,|?�4��L9N���O�Ck�*EJN�J��*�*�1��iS*W�tkwnݹ�rѶ��p�l[�3�u3���1����GH�(<<��~�ځ��'Љ�H;�7'|C�-�T��,I�
WM�W�V��*��9��G�57w�@�'s���#2�"2���,̬�,"��,���32�Td��-��y 8�֐j�}��yPf�T[�:w��I}۞����Y#��1r��R����.Q�p�����KB$�}1W߹)E��E��D���T�]I?�H�I��v�ri7uh�o[���B��l����4�q�NZ�h��aS�{���+BY%X`b�*���P�WKlSG��:���(��J���i;�x>�N;�?b��|��qB����i���m�?NL��?��b�����~���o�U�/�5]_��j,k��=gW\�JZN�B���z��)@h�*I�ڰ�6І�
	�5�4ή� �J�8ƸpM�|h���.w�l3���D���|���k[���ʫ���H�Y��*鿸�4KW�Vr�I����j٥�r"/`E�B���P��!@�L�d�����]�wc)��:N�:<\y���"�]ɪ,�?�,u�-����s�X�Aa)K���%�<�/kv��m��~�����Mh�uuacP'Q5iv[�<�~��x�B�����H�x�����ջD�A���#����u݂"�h��U%�b�u�Mٟ��4��s�FLj�.3zۣ�+[������H�uL�9�ak�ف`z���Ղ�C���\HU��/Q�����'�EžY�C�Bg
�
�B�v��[+���������n�U@�(�5��U���	|����S�1�p�4�sfb͟�qX�"fɎ�$��ܼ�^u
hYr6'�X-a��j�Dۍx����?��V~5�f��7�da&K���n(�ߦ��d�铪���w�S��jt�3y���^�v�@w�Oo޼��d�#��jh
�*'�7e���W'r;s*���E-,Ti/�`��[�D*�"ޘN
t��(�������t2DJ�d��Xi������sr�ٛ$�e7T��� -�U��g�L�8E��.d����q��.�2*�B9�k���代�:�L:��=�r=x௩7;Z��-�y��TAU�摂#ہm�)6�w*a�����1&�0i0Y��;?��J�韷��Ӟ1Z����%JԖR���Z��+���ZWbQ�Q��e�����w��{>��#I�$9��H�m�f��|���ή��uIkk�0%�a!�!�[��gΔJ�z��Z��Ř`L0AaDD�����'ZF����e�u�^	�ou(��H��ߟ):_{_��GH����� "2H��s����>!���䀋B�$�DI	$�@��˾i���{�-�}���� ADDD��	r��,4���í�s|�3*j����O��6b"*�J���W��V���(H3��x�ݏ8�_vNG����$Y@O`���/��k�DEv!�˾`�(�0����
���s��Nj���ɭ/&��T"���v�9��O�F�HG�n�U�����5M�8���]�qѺ`�܅	�) �"�98���m�bM�n��_v�&���#)4��&�e�8@v���;G���wӸ��I����������;��d���0W���=N�<y��|���|�)� 9�Ȕ&$����!ysѠ<��"
X��jX|Jnd)-(=��RY

�f#�F�o&�o����&V����UU������h~[��V%�ՙ�.��砍yl��w/{[�$|��-	��.AtK�G��>zD��w;�:|�
%Y���c���x�w�8�Q�}�
���;�.��2��\f�=�r˕Qv���ZV�n�fÌ�/�V�%S��)Β9�,o�
C�
+l��D��dzo_��"N2:�(6.��Kl�|?�c�0�U�X#��c"���%��U O"�|!��Ph�[��/^w,��]6X99S�"����~��E���?w8E��%��5��g<���/�L�$���1��t)�!�2���	��	œ�l��m5=����ș1�/��γ�	'<�q6���FG��vQ�P�7���H�蕈Q�(D�9�~�@;�a��Л`��wO��.Y��	g7D'��K�!�4��H2�	��ad��jȶecx[�	8Tc8��e$���ꗽ���ܢ���9�����]�~������,�	S�9��9��^Xk\�����q���1,c���ݎl�Kޜ�(Dc	����D���2���$cѼ>�
��2)`5��,��`h[�}�[\�g����*�m�}?�C�4��������G�������YS�&��$;9���~�w��/}�}�=׶S�5lԄIS��!F�I��J������"ň��ha�vU�W�yϴ�9��#3�i�L���_�B	�D3&���g����K�N����g<
1W^3
q�n��Z�/
�s��b���,.)�4�uV�<�տ�T}yf2����l��3�x�Ǿ���5QrM��j3@x�&�r$�7�d�Xm�R�:�Ԗ@4�؇�З��MU,t]4��I��`>��89��C�U|qb^y����^>�*c��S�:�p�[�BǷ�6'��Zx��6�oL4Ú���1/��ZGWA���ɵt������1��[K#ON4�Ca�p-�w�Ӻ��'�r�kns�;��>c"|��DD��$���ݢ�/��n6ȣ{�P�Xt��8�I�ݤ�f��v�f2�`��o�gB����þ�KLse��0��ݻ{���M尛�P��;��mz���iWY~�5�����FPV�Hn$�$6c��zgH�,��:��e��=�
I�����5�ƾf>�x�P�qv�O?�G��s��_��a������^��w�Ag_|�Bk2K���L��|��$�����/C�/vk���[�rC����`��hބf?>%�k�*&�A��;����@�h�6kL{�5	�C��@�R!�Rp���QTӶ��w�^�S�*�����C���v���=�~�D5�x �������Y����`p	��K˫j�'^2��	�1�!�"(ɀ�M�����1d�2�	�
�B�
qqV��y���j]j�(04N�7̾p�a$��͊W6���y�-Qi&��	��#�r�u��K����S�"~6c刿�x��OR�4h�
hsp�Ks����1|�7��3E$�E1C4s�1�P�O��[1]����%hty��|$>u?�.?iZ�\A��$��(�����A`�B�O��;|�'��k����PC}HF&�Q�*��d��<�&�i�+�����M�<�k�?��=
T�����yv����
*LUJ	j�����ٿ�¾�.��T�d��W����.΢==}���d�7O�p[�8KE45/s�5�w:�`��t�K��A?�ӓ��G���~?��_yJ��p��<�
�7]9ѐ
��+�V��&l&ҘHK��+���SQA�Y�=ip���2��H�I@YP��сrl�(��d9c\�+��v����
y��|�!E~����kR�?$�OI�k	-٪#;���"�huD�IY�&��K�1M*��E�U�̟w���JX��ބu a.8f����2\�~�e2|�1��Ҿ�O�xz�P[U?�WXNSO��ʥеA#�G�>Xۢx�v2�.�"ӶG�����S��=�H���}ER��`Q[�i�7�5���-P��bDI01��=q�&��Ms��4gb����쐞;W��G%�RW:�׫�s�.ԝ��H�f*j�f����Y/�R+tW���5_����Zb�|�j�>���B�A��Q4��Bu3偭�q�%���n�%����e��0(�`�C����՜Ñ�4���t��uƁ��;��.�!	#O��� 0����Ph�=TtUcM_75�MK��:򮢧�o����X�o{Ƥ�4C���!��P"1	)9%����A���3021��¤MӁ'��O�E�;b��.����>���PR���E�e��'��))rB�Z�Z��T�m�VO�>��`ifZ�l�a���Q���'�Q�y�A���Y(R"���0�6���4p��#G!5閦��!�Pbx�)�#[K��rZoӃH�+��X�̓#KcnRdP#��c��[v�9�aC\�����w��D�
9�D�5&�B,~�S��@�BU���-��o~���?r :�.$Ѓ2�C(`#��0�9,`	%�`
l`5�`8�	8��p�;��'�!2w���P1�>��>����\�$0��>��W�,��N����!܀��؉„2.��ƅT�3VHWi�Y���ݷ��U?�7��<�>Ɠ<�]}��7#�>!�V?'w	���\���R����S�f�K��"�ӭ:pK� (Z����Z������?����z(Pb�8�}��٫��m�
Sa�_�;��DD��)�^>��Z�5��_P�m��4��;�Q�nLc��V�������OĢ:��\�c8^�a�h.�O�dzԲ���@ �6�j���l�FU��$����%ֳ�>���hL\B���}�o���_~�������'�����ݟЃ�с�P�Tf%��V�S��r�#���l��of �(�)=�Q�a�7r�YHj��H�Du���|�[��v����e�*Pw2լZP��ġX#�DA8TWá:!�D�2&�n�+3
:��$��e*E�E�"Y*8q`n����D�B�D��z�yW4	/���&�x� 
ƥ4wl#$�V?2#���]�����D�0�ᬳ܈`�h֎��4����B5;qT)�g���� � 9�kf��	�W�~ۛ":�&	�w��hŗ�-�؃����ZX`��W`57kw�+�R���I�o��#���z�n�
sO�/��5�A}��;j����+~������
^>��)=@u��R}�i@��/���P9�c�b�bRHXO����v(E$��\w����n0uMC�#x���Iy�~���^��!l-�v"��&!��f�-j>>�J�!G���;�LC�E��q��L͇�}�1�ϰ������6�-H���0ʚ��o��/~����Mi����f�j�:|W��2#u�`��Ƒؙ��m$l�jCW���|Р�8�n,���G�Ƥ��2�֛�;2�$c��!K�8S�<�LÝG��u�
Z�Z�§��9K��l@E��y�&L����N_��D�xx ��hCbl7C��H�6x( J4N'V�UcE�ۑ�������`�ofbh�r8�烡�%@�3��?�	�گ�Ǟ{�wަm�E�Vo�Vfe����������K7&���t
���˩L_n����RT�5Z�(Ɋ�Yt��dvJ�Fݏq���C-����XO�o`(5�����[Xʭ�J����������EY�n�!�ܕڢ8I��(붋�,/ʪ�5mQv��鵥1�M�2�\���5&|x���-�`c�k�Ϥ��+F�P���R��S��W%][�����z44�01����z��>
Q�,:i�8����y)m��!4�+@8`���K� ��6Oq�䍢d4�cr@)%��B���Wթ�\'�R�B͇����2_���as��R�ܶV~+�)�a�}-�y]�"�j�:]��M/����a��e�^��0��)H���a�j�jb"=��
�J�9JO�>ur���
�^�.�O0ZGn���5e����*w���ͿLv��9�Z�B.�\���*4�/!'�M�),»�_kH
��pa�Q&�Her�W�	RCiuz��d�Xm�o#u�%R���R��5Z��Fn&,V�w�
7�q'
��uC���z�Ft'�&�80� ��^R�>.P��f��?��<v��s?i8��rY F�ɖrOݫ���K�TAj��A��f%qu��ID�%���.V�����.�'�����&�Y���p^$��0Z����IiYyEe��:��I��F�=�#��K<�q\�j%�	'8�8��ф���bfL��s�<�~��'s�,�f_�y܂$n�o\�}�O"f�����:��U�%9A¦#�B��)�Z^+1y�0\�(����!�:�Q"�%LR���V��I��s���<ҹ�shR_����Ehq���eC���iY8����e���4�@$kc�j��}�W1$��H��`-��~��I��L�6}��Y��̝7_�6?io^.��ђ@�-K�뽱X"��J��Ͳ�}�r)�[M�%��4)�
��*�ɔ1�'Yء���E+W�^�v�b*)��W����:�_�g��E/���	��.-�bEb����}�/@���d���a�#��39��d�ih�~��b&�{�i����������y���~,}&x�n��裲��-��,s]m�\��+V�ﲲ���W��/_@n���IJf�F���~\Y^�Hh�'C����7�����ɟ=�~�ş����p��q!��	��_&W��y,S�)����
Fc�Xmv�ᬻ}��L���L;�!�Åh�ю���&�v�"�8�R�X#�]C��p�]�4�L33K[m�=��b�T&!�T!j�V����7M�9bݶd��f�#��(�c`������'qp�!�Bӓ���H,���
%�RS-���&�l����Yw�F��`�p�A�9����Q&�Her�W�	RCiuz��d�Xm��Hwg�%R���R��5Z�~��`4��u�R맶�/.�,I����8l)G M��W@��
��/C��	�]ʫR
y��l��U�r+p��6E�3��.�(��+�����'�ot$g���Rb�}�T�����h�gCG��������p��څ��3��7"IS����1\0@1�� )�e���WMRVB��ց?��S5��C@z�
S�}�K2������Ի����|�"�}��tI��Ty�9O�I���?d��x2���ˁ�ec�&�f�@8�1�D���=
R~���7�QV�ڐu+
�d]ch�R�'�u��4}�h�'
~��F��D�:fLg���H=�l�#E�ȺL
A1(0]��^�,pA?A���*�e��F���������b��,��T�p�_:5�85OnY����G��1�_���
�f���=�)Z�8Ӷe�إ�p[��U*��6I�j�C���(EWsC��'ON7F�v�BRP����%8��2��NJc;x�+�1��U���Q}�^@�Iѝ�-����],\��r9���(X�6�#�Ĝ�\�����
�_X�y��$X�]���X�tpUv���Kv�!4?K�q8�+n����{굏�ށ1��Џ� *�i�ItRe�3]!�rV
�X�a�m�8�S.������j.Ws�/��LB
X�B���c�	7���p�Ͱ/G����"<��B(K�2�BI�ԔFK����1[�6;�p��>��`�,����<�/�"L,���
%�R�������=����^�f��vp�w�F�TL�[@���m�GI��G8����n�|ܭC��{���=�{�c�S�+��5E���e�_M�?�;�C���W:'�F�S�d�y�B&.���\]�Kw��ɢ�:�W�k���^$�j�ߪ�֠o�*�ap��QH�|��{����U^D} �pQ���/�f�
���?��i�ٽB������U��?��]7��g�G$&&�&��I���҃~d~���1ݶ�H�Zh�i�
��x�2\G�\�6v��(�G������|$�"kkŖ01�Ј`�tk<�g8`���q����J+pkp��]�@'N�8�ᙔ�/���U�ذ����nC����*��U�2�s,��B��s�>P'�d��k���% �U�؍���qM�ޑ��Ĥ)�3d�~�Ci�����6���c� )�a��W�������տj�V��{}�?VV�`�"(\R}���_u�*��H݈g��.5��� ���Z3DoL����2�� K7�p���_��(z��'�NvF[�<�A?2Wr�	�i%_/Yhs�/�Fd�$��zr��#�j�u?�m�φH��e�3tkA�]�xʢ"G�LR�_��@Z�%Z�5ڠ-ڡ=:D�i\�0�~��*rD�\m�G~�:����DcW	^����۱;q�q'_�S#�܏�c �"�5�O�l]lkV'nf�<��8�����k(��^�>�)���d2��u��B�^�!��n�<�f�MȂ�^Vz�R�%�ܻ�s��Fo~�Գ�����f�Ʉ�q"���7=b�Ix�!��x��K6�)E���W�i2d��ɑ�@�e*Tk�/��Z��ya�L�����xf.������#N�y��ś_~�$X�PE���W�i2d��ɑ�@�e*Tk�,;���M�5񂌻w=dM��к���i���EA�CR�jDڨ�����*M͸�����	�
)Q�U���s��`��K��Z�v��-[/��]\��=<=��}|����V**I6�L6W�7"(�$�G�_���i$/�+�*5�C�08�Bsrq�`��b�\���f��k0
�#Id
�F�/|�7��Z��`4�-V�����Nx�`I�2�B�Rk�:���-(�@Rit���py|�?�l���_�-��ר�GFfVvNn^~AaQqIi���u!3+;'榒|g�y���|�H;��	��Mb6�B�M묈��-�*�rt�=���Y
7���E\�~w`j�6XCX�_�7<�=��gS|G�r���۳&˵c���*^K�Ï
J�F�,_���5�Y���ӄ^�T�x���������P���3��,.)�E�%���8�ۉ�1Nk�S�GپΨZ*��@:#���(�~����X�N��'oR���[�$�0��B�'�+�|vx��+����/�$�&�3�h���'��p�6/�%����)��+��j��s�؊۾]d��X����BB��ye�	��j<$�іa:X����2�S��y8�È~�N�0�S���!��rA�㷘�I[����IY�_��L��gtkI��O2��N�%
�T&ʋ�+���u������
��@r�W4$�nKo&�&˟��/*kc��y�-�����č��%<{a�V��N� Ӓ ��*��ؚ�#>��h�
ymbB=Z�#aCe�_�=MqQf9��%��5\��w��Dف{�A��$��N�%������)��M/�i�_��k'�����R�˽���#�9��/�!8����lL�5�M�U[^x������4.�p0-����L^�yƗ��H{�v o���J����ݹZ�{������?��N<�/��w���isTr�Hؾ�K9�P��	qh*�(4b4�'���w����_0
��FPr�:�z����%3��>��C�=->g���t�u酱Y�8�Ҩ겁�eF�m~0�ف��ϳ5��(���?��"��׾<�"�w��]��v����2���~_����L���D�ak����w�x5�`JӮE�C�����*�������Һ�?����e��?}o��;�Gg�	�}Ml9�]����&�=!���(I8��q�٦�ξc�~�:@\��^X��p{�O
Ն������5��nIX
���}�/����nfSo��L{�~��Y�;x��u���2��+m^ŵ�a����}e5:}�U2x�5ke�.����洿1<��e��E��2�<��qˇ���<1��;���gB��
R��~���rE�y	�'�ݔ<Dy$T����so�-_J�y�~K)���hu�ѴYi��ȚZ�,�d��22C)�LpZ��ଊzS�Д�2#yuPg2#�
{�<'��-�8��ܐ`��Ү
D�]�"ю����1e��!���ҥ��[�#4u��^w���o���P�^�h?�8�٣IjN�&�E�:��)�Uj�v�:��+��ƪ����AGn	6BF�gd�M�i6C�`S��Z~��w�~��{���
��s�~�_H%�TC ���`�r��D��k�|�#S�J=6�8�V���AZrb��ɑS"�FNK*bz�3���d%�vDu�maa�Wop�&��.�[�n�����&2�A�f �7�3$ap\���G�-N9����EJ�]f|\9%��O�'3!�D	��A
�[�\��@?P��{���h�w�8Tp`�@5o��:^L�lE#�ėy-@�v�E'�ŵ�VJ�(*�t��t=�X��b�¢��KKB�n<KG/E}X10�P2V�c<�w=%V��i�<	H+H�xG�{L[�}!��6���vI�Y�����_��	i��t���V�~�@a$&���)$��*8K���X�Uª��*���($N������q�u�-�;$�$!��&�
�T���C$kT$D�
6e��#,�-샘 RA����
�QŒ+s�Y��u,&!��!�H�I�/[|%bbK�H�B�!]�,n%H�)I�j
�|�"���J�MU�n�k�UǪ钆~�s��k%ֆ5�X�|*]Ժym���jb#Xk��a�'6�U��/:+K&s3���^�����
��ys�l�����|�e^�^r��w��Ej7_�^�[���+����EO��w�����p��q�II�����!��H2������D�D3��$�H,��8Fr��~��& .̍x0/��DD�H"!,�D�(�$��4!����a"�a�2JCƙ[�H^!,�(�
G��Ѯ�ϕ�[�H��Ć8��M��I[R��m��g��T��JѪ
�P�^��bgծ����z�[��WJ?�+��J��a��S̷��UD����94
F\��f���,TlS8�S4:1�D�d�
Q��2����<B�6�����*O*�yZy[U��
U��͎u�Vǻ�����k붋�/������3�;4�[[y��x㫏�s�R�m���2�`Fj8�Lu$�v"c��q���qg����8yWD�1ז=5�hi���)��.������_�(�d���B���8�!P!�t�6w!��B)�H�h��pB� b�������H�K�p��:�qO�so|ɞ�IGL���T�M���=8�4�^q	 {CZmqሞFR�X����w�D�#��sp�IJ�ѣ2��0:���*�����I�b��::��$�a�`���Љ�c��8K�p�L�@�8Wn��I�B�߄��ƞ������I3:L������to��m(ܯ��|!�Q�TWb%Vb�#�L��gЌ��A?$�甙5���)s��n�0g�,X�,Y��X������l��ʔK�|�6n�d
��85N�S#K[
E��,�*U4�h��D�K9�$X�#%�R)��H��TEJ�ً 1�nd&T��=��a�:l�6���@�3���
�ߵ����r���E��_����=oG�l������r���� �'��*&����Gi1�q���s>L�ǜrc���i�x�Ƹ��4=g�7R�LW=��H�׶��R�fK��!����6^lk�e��"wd-�0^�~��ty��
�#���/���["�3b~���~�--P:DR�y���)�hz]K���L�O#d쎖=4dO�޹����+H �!���8��-��z�u-X1�_�YT6��HgL�7�(�h���E�ܱ%f�Ԧ)�K��t5�X5�J�eٷf�ټ'$բ�Q!ӛRe4Y�K��l��m�m��]b�l�
�DC4DClYuu�%^R2QC5z@k`ʚJ$N.�8�n���.�cf�L*L��+h5�`H�b1
!%�b]�+��Ya��,5KY!�B!��,��&��$��S�1����	�೸�v��E�c�)�$1-�Ŵ���T#�H5?��/��S��Lb�xX�(D�%�6�ޒ>�4v=
z����
^C��-�r�krct��D��YI��'᷎2
��ar��H���2��ҕH�&���lK��ڼ[o�5ywHG�>�u9�E�u��C��⑪*�j���?L�Woޘ��c�@湌ݠ��\G���<�.׹s�ٿ]����r]��4�Ղ��k����5Q�<�tL���\r���Pd\j�9�������!����4�&�ر,d�����Oe�.oP�:�b��h�����"H�����*��ʚ�W^���|�?�P�63%��TPiUYo��thaa�2�]����Z崵�ck������K�:Ϭ�n��7��=�s����LE�z��善fs`�&H��Ǒ��ߺ��杙��~��c��D��s�ǵ��E�����|�������w��?��R[����|�3Ȫ=�k�$��{Y3og�$���Golˉ;b����+�kp�}�'�3.��Xس	b�2ٹ2�o�Sx�F�!,vP|�Ys���R��Z��Fi�����̾`��+O�}�S��n��U�kmk��.-�{�g(AY�;��mުs.�R�sW�������n���e�>���/{	���/^-.�*����ym��iWː*�d�L&0-E�IZFS4��#�Kq����ċf�.pw0��'�d�Y٢��t��d��Y��Y]�bP×���.�+Bč�0D2�^Cùu�W)	#��)�쿜[ECM|��|��y��w�\����q�{a��л���3���Y���,Rhh*�����zX=c�t�2_,13�[�MN�̵*z��b�2'Ӊ��%M�$)ґ<�O�J��#����!cVH��Tp��3���+]���oX�X<�L�e�dEFE����KH�QE��k)T:$P�Ke���J��P-�V*C�Шd�*��5��$��8UQ�Uj�v�^�Ah�(��F}�<�q4/W�W�U���-��J�]�E�����4�u�k�νw��g�=�6�'��lY�پ�2��efr�/���^���?'�'���)�ry�O��ro�'�"'Hg4%2A@KЖd3��t2�E�Es�M;S�\r˒5[��H��U7
�@eZ�K��qp�}3]a,$f�Cd��X{yc���?'MGaZ��<
�e��x�^�Nb�"�T��P(Z�ګ��Te�E�@$F��2$�+P�� �S�~Iɠ����zl���-xg����ou��?��1_{�����?޺���9`ʫ5�
�q���b�+7q��7?}�l�G}��/���3@.�
H^n���|!/��}��1Q2�G��y�^�n�P*W�]�VS4e��fhB���Y��X*W�5��:Pa��v6+���*:�o�ĦGdgM�%�T��U�Z�z�z�8i��,/:ebʥy�ן/�.��R������O�Z��_�ߏ�~�:��*�-�:zVV���UWߠ�+�w����h<�o-V�0�Q��L2�Y�>de�	��V��Œ5.c#�&�lf�^�+�#7�ܸ����mGڮ}����
�ۮ?�E��������p��?p�?�������.�á+�W�W�������Op�'.q�5n���'q��g���4��'�����Q��#�	$�/@��
�P�A���� �������o��3A"쿑�@�/G"�d%E��*5T�e�P�n4�
�
�(j�@9V@�v��(n����^�����"�����(�����a�
��3؅Y��a�����8�>��]�.�͍���6�
w⮰���}b������&L�p�m0v
&L�v���˧/���?���hŊ;;�~xv�y����[���ah�,g@W�
�;u�Ho] �[w�����	c@��ykoC��>�T?�'��妟[\Y��u�I��:&�i�e�B��c�vf>��nl��n�.���= ���{� q	�Q ~� �0H�+�d��@ʼ�H
�6#}<A��$YB���93��\�e8�e{��{��QF2t���L3����m��sr7&�����0��)���zut����D{�X�8��j��: �2uC�b�U�����U�w5��Q��U����׷_�T�Tk-�F���*�N�W{P[��h�sX�p\#p{
x2p�ـ�Ng�8W�g���q6�gs��<�=�ک���t�8k
�x�Tv�)�{(��
�/��vk��N�T�.��i��N:�^h���~T��MM�����Z:�C`�#�1cs`|�����]KW��{V�X5���g����M{K�`�����f�f.�ژ����%F�,x+`�M�؛�%o�v,c�����ܚ��u�h��l؞3v�t���V�U{b��X�?�}�q��9&�غ��vrjz��ܼ��B�����(笄��d{P ��I$5� ��Rʢ�^rD�"��,G"�d%��UjE5�����w��—
�t���
�sP�eE��(^%������(Y��u@%�(]n�m�1����z�^��/���v Z����Xf���V�ݞ�U,]�q�λ�ڗ���M�mv/&�}q���-�����C�h|;�?������g㗾��^�wo��?��ˁwz����t����u�s�������E�!N/������^:�~�����ӻ������|��IB$�� ER��Ҳ�J��d�2U�k�,u��U�GdD��������w�8� �P�X�Q �S��P� R��� n�	������t���+����A�D����S�T�I�H���ޙ���-ȝ�yd|�#���g\��8
��]������h�̀$�B��)I
I'�eԦ�PZu�EY�So}�����QNbA�ɇ\Q��'*OfeY6e_�R�A}�O���+�*��v��zQ�>h���m�m���:S��;�'���)�Ξ�7��4��;m��M��S@�o���}͠�-�em�+��0N0z3F�����i0p����O`�9f�p�
��`����`�����~r(��0��0�0�F՚�hV��A�n�FF�f���F��8���A�q�}r��&�[�����_������8�' "H�/$���	D��1��	ѹ!}^Șb��%@���@���!�B��4.�	�Do��@���&Pq��
�o�;@�N�4$4��h��C�@�I#$�!(E�#��	H��}B_��w � �M�6�d	r&���tF|6e(Q���T���
���M��f}�E�}�u
mzBuoh�:��k�
t�@m��`@2}L�CM0g�K�,V�K��2�dX��XƗ����
0�re�8ٴll#�4�֤D��M���g�|m��v?A����/��o��_��?�����l����껨Cp���`4��a|���}a�~�l�X`r��X�k7���{l^��5l�Ž	vY#�A�L'�	$��na۶��gH��o���� j'��!S�,Yd���X4X<`��;�&�H�j2���R�1:��*�	&h�6z�عX�^���aa��"N"$��(�g!A
	cH�@���H�E���y�t��yA�<Ȝ��iȞ�2�W�EPXDQu:Q�DI!РPZ�MJ�f�@�"��(h]T�U%Ѯ@�
�t�[I�82%�� E��a�D�&�tI��"CȔod�o��敷�$D�"&��<$$ J �8��B�q�	DDb$N$I�Jg����w�ӌ�旗L�e��9(��TB
	���6n�\X��&��ˑ+p��깸F5-ڴ���K�h�K�'.}����&x�|����?�H'�v��w��Ӿ���<��{��+�҇/^�?w=����/ƻ�C�܃���s�/�\xvp����׸�W]��=��{���n��}q��[�o8{w�!��Q�CM0g��5�W��U�X5��XV�2V�V�]
�5꩹F�Ŗ�}���^x����%38ao�;Nn��q�'n<q��;?N�.��~��/3\����+W��B�VE���i�Ң�����tP�wh�Ͼ���[е
ݻ==;�BC��@�	�M}قTQ1�
�.��׸֗]��\���8j��+�QqdFq.I�P8���t6'E�4��d��')?2*:&6�������\�Q�q�
�2%J�j
�: ��i�z@�>��(UhUk�:�qJ�S0#��N�CᔴH4O�4jܤ��m7kޢ��� $c��%Ⱦf�;�t�\V�GcF�3�.����U��54�����NNM����/l��1�Lf����¡���Ĺۃ��X9>�ڷ���?6N^�l}���i0s
�̘��\��+k��l���ԹK]��ֽG?=W�8��f;v�?�f-'�w��V��b��F�u�A�V��ԅ-zԱ]S��宙��vo�^CZ�&!�y*T(Z�:$��UҌ.i_p��Yt��,�Ē����IJ��U�Xg��<��n����0�7G�����z����O�w`��g��֣L��cʫ5���$�Q5Mʊ潆]�V�*m�
J�]:��+��]���=�������:��������8�	cI�!��"s9 *�	ѹ�@�|��I�B:���<�Sh���P�qb�H���*�L�1���[��{�����%pPg���	�4L�Fh,bIF�j�&���QG��Xc�u�x�_�J�A��c0w0�XMI�LY���
��M�-:]Z���M�^ЮO_�ؿ�έB�N����r�\�ܾ}r�|s�<|�pv���g��)sL�{����|�u?���~��|��>������������lڲm�ܞ������o����������16���ŋ�e�������5L���6�f��e��
��s�F����
�����F�Q�GBBќ��p�4#44?v��qC�G4�XlAK�	�n�c�M�h�Ĭ� ���E��Hd+�9�C��H2��\@��<RBn��m��h	y�.Hu�@��d�-A~ RdY����q�#�sԱs������\�eWp�
����9u�{8}�q�}�Ǚ�+n����݉��<�n>?p���߸���=
?����^�����\�w���|�盥*��g��dE�t���p�ɏ� �S���Y�*����С�8<8��;�c�p�8�q.�%��]��
8y����רN��Wܨ	g.�n���w�����|����7�ƽ7��<\
<Z
/O��/Yc��˖�X�}��7>��w��(h4)ѬFa�Zj�Dkm��N���t�Q'�:�Х��7z��&�[�����/_�L�k$�b���P*�{e�	
J�l-ڱ�ת���t
V���l� �>1�bI�2�4pJ��8�
��7�@78�8�8�o�8p\��0O�ý��18�o������
��pN����4��X,�lƠ!+[i�dj�|at��a�0�L쉭{a���s�4�Z�3o��F�Bu
%%�VQ�
Zа�Дf4�-�����
m��:��/t��-�J�N���1&`����d���%#�1�&��拝�^��wV�����xϛ��i^6l������(�JmQL$j�h
�:��+ר��Mj�}u��) ���<��p
08&C��6>�	�F�h019������FM��kn�~^���L��l3�ع����GI�%�1II˙;3'g�I�N���J�(92D.�1o���5f �`�<���_��˨�RX���Z�ֽ��a#+U���`��.lf�z�y5�ޮ	��V��:`���X]�=e��+�7إ͈
��3at:7���d6,��l+60���{��=0��}`�~0��-`�f���=��}Ǐ��8~''�pz����G��7>���>Ǜ�|ɻ����=��m���������?����I�?���3�sß�K���	�J�3�j���{,�pr�Uy�{3O'�"
�9+�J�2*&>C^j�,x72^YV�{����&�y�7�9^_<qdo>�R9�bǪur��vo[U�á}kĥ�ܕ:�û�ܳ^T���k-.��:t�Q�&����a��0�n��dʚ�b��nl��NL�}��w;'����enXX��xP6��
��Ƴ�S)�G��gHHʜ%{&xeY�6/��	���L�H:�~E��VҊ��6|��
�}'��M��{�
i�'|vc�?];���]�n�{��>�/�o|����Z�O����Ep�	�������ON�p��^���=�t���=�z�{���%N_]�ܻ�)L���]�[�����ZYc�M6��f��=�z��m����w?�i�&�,�쾻Ǟ�)��EV#!��&��(��(J3J����_���� �gE}L4���h�,��q^��������۝w�7g�����w��������~^^q}s������<D��1
G�sV���HI��ē��$��%;HAP0���0AxHm@ �KG~EŐ���*P�"P�J��v7ixo[Q�]�(��B�]�hQ��(Q�ק��nk�ť��J��A�z����^���u���0�����8|�
�c����x��������X,;���10��b�b%�;3��X���`�:�=��
LнX���ecL<9��+���κ}r��ï���o���|g�z��a|���3�������9��^s�|D�'��$Y��!��)s�����C`p���`H\��]�4�;��G�gM`�Ș�'0�p�3��2�Ȩ馌�qr����e�y��㌩�E���6mIm���G����Plo]����|�.nF���a*`�	-A
=�	#�	3A
+���,�Y�6T[�t���my-�_U��^��:QC�Zs-�F�ū�eW�^U[+%��քꬍkS(q����-T5�7h%���C��zj��n
w}4
�
�:4���"�8�~��g]��-�[�n��h�~z���^�$EJ"Y��)2 e8�c@���B2��p2A����� '�DM��OB
�׶diٲ�]6�Z��bæ�-[���jqiۮb�-�a;���[�u���a�{�xS�L�d"�r	�G�|
($J1�)��2�c�l@U9�t���{�����5о�-(h4)ѬFa�в�T�6u�]h�:��S
:7�K��A�.T����~��_4ɼ�0��ybi�����P��\�	I�0�Ē����J��*��hu�S�N̘��p�ٳM��k�W�LY<_�l4�lL�ճ9kv�g�����˛�ul�ɋf-'�w��VM��f���6�'��lY�پ�2�����o�]�@0�
��F��)	c�$�P�tFd.(*K�!�$&Iɚ_b�F�������C��f�Id6
�Fg�����ƅw����M�p�-�|�p�F_�N]���է��()�꧆�t鯖��4�I�V�]z������%���o0��v/��b3N3��=a�3����6���pF�8]^ݞ[�
ߋ��p�9�ܸ����t��ۅ�۝�?����}�?~�]�f����=_�f���e��3�+�U��b��E����r�w�W,��b���E
�R�PRZ�+o�4��4K���=�.�M�5���cj��/t��}ѳcyD)!z+��f#�iN� �4o'�p�"Xh�A� �@� oA>��@��
 @�BD�i�� k ��0�l�F��1�{�>�L����;/��\'��
nJFs�I�Ƽ�yΦ�t�f�,˾\˻��Z`�]���d-V׭�Ɩ��r�=�~{v����KڲU׶�ͷ�w�lsկư#պ:�ʪ�۝�2����0�ۉ��,�ٱ���
�<b�o���kݶ��so��O�b���ρ?7Wn��y��o˗�����[����3]��3eΚ̑+O�t3���>׼�$Ar<�(�"(	)�a9����#)��CiM�6���.�(�Ԓ4�)�DT$
��ɢC���}������)���������c8rz�^\��w�xrv~qyu}��������}�W�v�{pt|z~������ˣ˯o��;t���+n�����ʭ�������^!O���*���d$en���Y��X1��)������X�'6�M�b�ض-��1np*w���Y߃s�|��;�����.�2��m��cq��p�^����Wp����zn�&�pR���%pr��x&x5�:�[��E�k�@��L�P$@

�\i3 �EN�����"�
��{H@r	�ER�>(ҴQ�݀��NP�@��QP�M���DWP$��(��)(Bi�H1A�9A���E�I���Hw����<o��Y�4j�K'��հQA^��M}��
���Q��s18	�n#��"v����'�`�v[�I�W�hUP�EGQ��~c�Ѓ�u?�ҡ>W��x����Aޯ�du"hC͘�H_t�YwE�G�†eU��Ueᙖ������Y�pR��Īr�F8�Z�{�T�P�i�.�������A�"�B��4���#e �5�'�G���3ͩ����W��8��f�oV4��|�3yr��|�h�zd؊��
���hXd���:j�JE�|��'
��pX؊���w;�St2����0�`
K�x�."�{���lP���Q72^3SqS��!�%��#A�
�)<P�q������T�14�F]8�ˆ0�ƭ�̎��H>b�ڈlWD�lЀoJZ�6(��ղEVȠ�B�2ٚ	y�[��Y�P���R�5N�q!\u^���b8R;&,שCy�"Z
�O�)�J,�T��O	�J.0��ֹ̎�]�,��a6���\�+�B����yA[�]m���ژ%��X(+�;"w���@�fi���B��TVh���_�5�܈�{Ha,�iV�%@b���e0/{撢��j>�P􁐩>�>2��a|���⋥v9��V]�1�1�]"�@LD�vB��
���9f�]��1Oc]_�~�45�'�
4p���ڈ�s��b���Eg�ّ3A���v�"���Y�N���<�]R�1`���-����c��0Ś/�!�~�k�
�Yìؑ�mD���Ѳ{K븦tl	��2�AQ^�Ʌ�R��L�\qB	�����U#3�VO<A���5<�@���b��u����
k,�yh��D��Ӱ��<pG�o�z�4��Uz���d�Ss!�p!���G:�<���.-#}@��=ZB���ru�M�B�ɀ�6��Ӝ��AY��_y�_QcC�T��}|�$���:�vt,x[HE5D&~}?Bd�C��C<������c���,2��=R1Obj�d���C;�(5���S����M���S����pVm���c.�xs�%�p���Yې4�&T��}��	��(½ðr~D�q'Š1�p�
.m�OG���L��C��)	��	�9`��}��F1�)��oc�@#��
.�
�^巺4)�0��18�)4�8��v�j����;<�`�3�vӌ��[wˬ�b7��1N�k�4�ه)f���)4�>���A�cю�xG�aP�k7�m	*$��:e��b����1�4d��W,>R�JCi��s,xָ��4�]m�P/h�B����6\�A���E�M�'��HK_Gǹ�\�`�����/�a20	�)N�C�BS�;8+g_D�[@���iZ��fVu�U���/-qhL���ġȡ����#�.�9Rnn�@"m�e�)�,����Thd�+#J<KB�K�7Ȫ^�#���H3h3cB�jꙹ�
�N�47P����L�xi���(�nڛQ�:+u8�
���8z�T��t��9=	ҰLSŇ��'`�����)���(����<�4�4�;}e�
�BܣҦ]�4ϗ.lQH�O�x��Њ�U�f���a���yu�i�bL��ь�w�CנqK���.CW�X���g}5�T��8e7���
��U�%.�����Drh�Q��Ȯ.|j��n}�~U~f�n��..|�&՗Z�N�N{��H�-�R �^^�c��
І�4��������V�~��3����q_�&�k�
&x�_ݓp���jqͺ*�{B���I�	�-ĵF1����f�T�q��fEA��_�ț�,l�dt�����V�a!�j�I�$�"�'�����bpC�?m s��
y�S@�=�@-�M���]����١��*�K��*�f�~��涎b$= �Q�s��x"oH��d���qHoI�O��у(H4�om�|���]=88�1�΃E�����]��N1�������/:�E�7p~�t���S>E4�gX�5��س>/&>s��*ݼU�VK��R/�uvY/}�@w�?�ٝш���!vHl�ya"�ԩ@��tOK}�L�K�$��)ߎ��ʣ�F�m���ո����i{'�0~���@)�x,پd4��xD�9�����7���ī�ɽ����o�ॼdK�` ��@�$b�����r)i���}4w����z#ߕ;�x0��&
�E�"YS�y��(���Np��_��$�1���\� ���
��2���>�$$�U��R8>t|�^�K%��;�����`G��%�[�G-��7��:�oY�I2�r�ѣ�d:.Q���D3��螐�ܽZв��
������-���3?�"w3W9�H����=��Ǎm~��㼷˛�xL�>�x���]�Fx��TP���c.��d�`���#y}��
<�B1�Yb�0�U=@��<��캕�/7S���# =K�'�"��w��/ԅ�-[�qiɪ�$�2ۚs�;@�"(���*�hЩ�os�]]�f&B%��%hkjl�)�cm�jM_9��ׄ�M=P<�as�^
�l�{�O˗�t�m��l��"3�f-l�,�,��D6S�Tz�«I��E�d���
�U�ǯy�K�%f"� ��v`��Y��rH:�Wy�23)2a��ݼ�r��P��������[#��!�rqХ��}vy�h��_���D�����r�$;Bq}gQy��ѓ<X+k�:�:f�ԙs>�\�&y��y�ifn��+�+[���U��_r5���r����0)B���᫄ܞ�T��W��i�t(���M���u�HM=C=X+��2����6n����(��uh_#�BZ�\�pv8>��C�u=��m��V)�g���zzP3��0�:K����`��.��+	aRB����R���U�+���R.Tn��<x��K�_��_�7s	�\F1�F]��h,��������zN#
��u�!�Fc*�N\������.��=�����O'���� b�Z?����x�
u��~��>|�/���fbK������Ywh�,JPW)��:�����
+�b�ba���_O-�v$��M\�4�[�e���Mo{��h�(�s��6K�	�C�.ܨ��#�%0(���<<�f�Fe�1;3�a�0�4�o��ྕ�Ov�Ѝ�ː E��<��0���}1�� O�<��y��P'd���PǓ�Oȫ�DF6F6�9G��R+�b~��
��b��@(�Q�(�!��l_	=ȩ88!����r6��I�`���*�G�G
���Իjbu��zy�x%��F�C�pG��"'�"lB�g�L�<��}� ��*����� r9�8��Ŗ��A�A���~2��F�KA9�#l�]���(�2-�#�(��c
�J���P_� �(�#�9r�`'mvV�Z��.~�����u6f�m	<�Yo�zX�hwN��~
_�3`�������@��K�ud�u�)Oμ�ԺO��%V�<�^=�8���
��ڤ�����L�Ed�Zjk+V���������ŕ��U�-y<��G
���`��szs`Si�E�?�����'��{��s,��B0��F��/�w��#T�0r����T/����p��uOr�;�
���Gב�.�D�l�����WQ��}��������)R8�<��S�Ӿ�']�"����oV����Շ�sjr*����P;T����>���[�rQǻ�D����兘5l���Os��0�U��v�œ�B頏��B��c���><|��(]�.1���(�7�c�Pvh��cM���Nya2�D9z�^eQj���¢�o��+�u
�5~,p�U+gw�'�D,�J%�
6���ɘ}V�X�aQ��%je��U&B}����!v�"N=k�X ҄�
�Mb4�B/�����#a�+�x�HRj�Gt�B����C�6>Dw��
���,��}��.?��P�pt��+�䝔Sb�tXƃ�L�0"��yo�Id�xƠ?O(p_y�<,�GZ��n@$ cb���E��1Oĉ$u���m>�/R��Ѥ<!�S��uc��q[ua�;�,��>(�=���/���Qr'H�1�T��
Dr����Ï�8CP0�fS]�^��7Ά���yX}a��Ud�Yb��‡� _�>��e�
�bX6]�[�h=&'��a���n	���*����U��y�2��F��֔��[6�[���\��l=�|�K��#�ŷ��������%J�z�#��_�.�R/Qo(�Cz}�S@�!y��|�O��ʼ��d!H�|�`K���p������4�l����3��ځ�_�r���"(��s���<���p�+�.
K�#��a���`My�� �Yz��쿐atC���y$C�N1"n���)��'�)�����}��/�$�P�}���UW��}���c�����.g,���$�h(o��1nq؍}+i$K8<�}L��{@wj�k�Ő��q�[�a�UkZ������+��-j_�Z�ӹ�Х�*��C���Ivi?���yS������/e�Sm�D�z��
SF�D���t�/C�%�
���C\���	J,z��Q?|�کu�'[�!�Գ_S���p(�����ef����2�lޱpurPlL�'1K���X2k%�`�0Ʋߴw2�5T����e�G�g����1<G9�q&l��t�b��}�L^%W
�}H����Z,�WoR��@��"3U��'��K�.(^M���dx��,d<!:�p�~�a'�CԡlR\�1GᄖM�s��ޱ4�	���Wv�]e?hk�W�8^��MЕ�m�ѱL!�|j�|Zw�,�S���~��L۽���i�b�b!���u�B ���ײ+/7^�;o�(7G�yY�����y�l*YHq��s��~N�*�k�ȃ����h�v\y����}���s��$)��Nd;cȢ�/��
�&,�%���S�i!�H
�*q��&s��3��>kI�>�E�d�n7__�)�玵����}�6�R�cB���>�"�n,��.�#��񈏨ى�#A��Q�&�N�=���^�``ү��J������D�:Tr�~ckcw�r���yWm1�*ҿ�B��]��/he�Eϩ�|��l�I=�_ڑ�����y��Pt���:�݉���ivn�@�*����Z7վ�R�L�Ȓ`h���׮)}A
���&9�*���e�K�|ks�k�<�k��7I�>Bzql���_
��ѯ�� ��d��!��}�	t��>�v:�01zk�H4.q���zv���0��{|W�t��%�ۙ�ɍ\e���V{��&&�#���){9���O�,�EX���A%͖'�}�4
�ɘ[�1��k�~hc�T�1�����z�tOg:i
�Q�?����]���hv���r��s6#�"0�Jנ��3��1�����ٻ�
�t�,s�Lx��_��fcq���܍�`xa�������F�cg槑�͞��(/�;��(k��l|�^�rK��suʹd%n{��t$~qB��
;;���[z�"A�>]~i��~װ8R
�j��1��-F���L���m�"u�g�CEc���3��%.�_7���R�c�x>��שR�g��n��K��l�{�vg�=�J��U�U_h_���N3�H*����b"D>ɁiΠU���8w��L3ML)=	*��{�����Ku�OD@d'��3�]�g��"~.'�g夥�����ig<��D��y?c��j�U�93��ɘ��iaDFһ��h�J���9�/u��^*&BD�\�zF�O��F;��2R��/��S���
��+ꚻoIQ1�2=J��7/�ԥ�z�А�ԓ�K�^�~��2<���܉ƻ�r��c@Ȕ$���ˣ$=,t�)Շ�|J��&i)����o�T/���>����Ϭo�[ޔ@���G�!^'�CzF�T��M��R���&��'H\wOY�j�M�T�R��]0���ō�4�_ۗ��Q#���"�A;�U
��s(�;��5)V�[z��$��By���H�"�i �
	h�Z�HT�2d�AňQ��q�x}��������d�,��*Ӊ雧I�L;�,�pQ�ܦ_�6�L�0��S���3��iڭ�+�z�R<k���i�p���H�2mImL���q6nWM-�=�m�E�l9�y��Z�,LGF����|�l`�񈍳�As(��7�9�0C!�="{��A(���c��R��F�˜�ȗ_��n�
:dn��.�I����+W��H���WV�摕��{�6�O�Y�ϕ|��S	�����Oc�E�Z��f�!WV&J!�D�D�$�!�E�y�e�]d��7jE�ʡߊ��R��+%�?��� "����?��c�㔴 �? C=�Sj��:�Ǘ_�)}��:���U�v�!벭N���D�۵:��v���n���Iy�=�/>ī��t��[�5�8�LC=:⹞�n>��X/�)��	م��=
�#�c`���)!���wu��r��umR�[����>ޛ>�Gq>�/���o�������N%+�w�W�g���أ,�d��x3��~�3���{�G;�|�@D
��$Q�˪��П������������g:�<@�����l�x_�a"�>A���DcRCiJiZS���T�O{�֙ɑe\��=1̲6T���sUW-��&+��bM5�
寥�2e��j@���d:�	��i�']h��=�8�z����T�^�t�^����ӥ���e�����k�����k{��N���n��须e��kz0f��e��i
;�T��zG�f�[7�1�����d*�vf:�wn�v��`�f;ҏv}�뻻����p��eD��������6��,[Uo���q�2��6o�p��l��?Z+�*f��߻��{,��/�8^ퟙ���:��5���w��`?�L���;��*8a�Ch��OE��0g}^��^��ן�1J��_�@�����հ�t
�:AQ��4����i��#�'��%�q�}�#��2p��M�O��B[�z� �+0���`�
��pn�	�� h 
�@|@�R���
(�]�j'�t�S�u����F7��-n��rQ�L�$RY��B
8�|�N�.��c�M��2Y�[�����9���1k�rq�u�K�p�~�l�s����B�X"��JR��4ZZ�>�`41�,��-�����o�階1`�,�=��!�+��hbɤ��
%�R�������l��j�E4�D*���>K<�-�C�0��3M���Xmv���h��x�������"<��B(K�2�BI�ԔFK�����1g|t�^�'��kbW^��ߠ�ٳ�غ��?�d��`�	��G���l�_< �٧W�[�����QY9c
�J�*4"�33G�'�D?�eFm�3(]Nם�0��������\!�$���#"I5"��¼�ţ|�R�
9�!��,�涪�����9��[�Ws��>���@�0:*@ϼ�/�S����8$`�������hu��Mٮ�������ў��qf��'�vx�wvhW'dG�W�:�^?�⿝�(I��\~��;��o���97�{߀���סU���>F���'�l�y�Jv�c����A$qdQ��@�b�9���r��R�{c��~�R���w׽�y	ݝ*`�<���y}`�U���u<.�4�P�t�o����^E(�!j��l9\�˅1��x?~��U�փm?n��Mn��(#���[PT��jcřl
-V��p�}�Esͷ�Rˬ�F-g�
�x�d����r}!�0?`E�ʕhfR�
(���	�kۧ,ddbN4t2�m�,f�FF�m���rT2�&I�g�jgVu����
�&�*�淕��\��@
�������|��lQ�R5�����ȝ�/�Q��Y�Q��Y�7�{z{�k}�������Ҋ����s<ۻX�4/��4/��NLN�]�q��y�$5$5Q���jk4��;QqIi�Y���Rr��<�(��PE��2A��!�֥2�.���u!@W�z�;��-�%�>����U�B�U���~u����J��s���շ<y��щa������|J�f��?�|~���-@KS4Csl_��K]uk�/q��C_���T��D�旰?�,#vdԃh�d���=^�\�d�ml�q%�v�'����X���;�hO%�iDFf��G�^3h�ǐ{�Ƚ�ڭD��Lc�o���e�3oU-����ZB�98|,���Y�;+_��5k�`�c����4��(��3l8�F�o��Ses����D+�F��&m�.�C ��D��4v�F+N:�����Y���{���$����r�98:���(Q�N�x�I�|����D��]�D��E#$�bD�^�U�$n��z�|^���3GB:���_�ތ�l>e}��o���UFWJ��(����Lf��QT�#�W���W�������/��z��b�<��G@����u
�O�X��e�*�D6|��+�'�x'<�'^E"��a��t"��`0��`Ej�ʃco�Y F!b�o��$�����~䉞�#�����XDE��@C;�{q���s�u�n*�M�I�o�!�Y�889���4�˾�D�f�5\ܮ�oPA;���_�ժ�W��WT-�\eu}�*���zOp���.��,֞�n0����7M�cZP�0����' $"^�;�������n
�#�(�����;��BWsg��0hH��������q3s�\�vk1�
�;�^�d)�L�枲�>�f@��3��P�q������$�e���5/�
�¾��-���`�Y��q��������񾫳v���3�W�㌿�WK�N��H��D�=F�X����z�w���4�iM���?q�-� 'F�8V�,N��<:+���S�*�R�T���+�)�r�b��c�tתU�V��;�\�}\����'�z�/'��?����R��ʹ��s�>�C5X 4�>0n�S��Zx&����\�s�%�r�J��B�jqx�nu�i|�I��y�ջ�����g��]�׻����F���fOxWc��,��rv1�n�qм�p-#a��$��<13R�$��!�EF�7�2���i��"DH,C+-�_SR�_[�s
�K�N�0IY6X:��p�ե�G�������Z��kl�51TO�����|ݛ���y�<�_�����Ycr`z8i}g윰f]ì�U3�e[��Sk},ٱ[q�O���Ӣ�a}�>���-��H��4G�	�B)&�C��Ԍ����`<�a��n�uʃ�>|?p�*xi��(xy�*H����a��=�&F1�k�=��&G�߫��65��~�4x��Q���u>2��fFկ��Ȃ͎��=���G�UzQ��6?���2�#kaT��G<���U:A1��P��!�wCL1���#���M͒�;�?�j�ҷ�=e�+�;�M��'~8�1�ьR`�:{
%v�΋��N~�]�~r�;�,�5�o�ί*�o����`��o��؂:ߛҫ@���Ū����w�י!t&�<M�.~a&�ݡ%�ݰ�XP?�W��(%�_[�{y�,4��X���jd��
[-��WYg�z��yt_?O1n��ےi.�4<�*^���;R�J�'ぬ�*��Tkmsm�cցU�����Ʃ7>^�
d��JU�ըU�^h�1�=r;�b�DŽ{\�'=i��D:`��E{��;�L���n�Ul�*٨�D+����� Q�d)�eXd�V��
_�����2�5Yi5}�w-���H8mrg}6�y^)��B.�E����P�05��1ϊa��#��듐4n¤�����ml�����7�bs�<�/�� #�.�E4H�_û�ǰ4mv��g��q�T*�H�)1!�|e����'A��Iy8E̻}U�R!p����!/�SYE�K����l_R��:�ڨ9��<P��3#M�\�E���;����շ�^+J�*��=-u��\�WB��|�V�Y:�=��mo�y���u�
���Ē�W˰��D����9��>�������cW_��I*Yy�|��SL1�S��1ih����+U�O�	�q�:��G{
�TǁER�TzY���8:'�l������l�_��a�G��w�0R3�=L��M��݌�^.��sW�oh<O�$�Y�B6��zo�j_��^V7�֪��)�t:��&Ҏ���~�ć�s�z�B6.\�3z��Ç���V����C.r��Ld �Q�]�#(���I=/�)7�d5�e����dt�My'�]�aQpC�t�V��%����J�"�|$AFJBLD(_.&:ږ��Wp#������`oK��MF�N�Q+���R�XMjB[T�DN��pI`��c���+�v��������K��Z3�����㘑d���`[3LE^ɮt��ϐ�5�ڭ��kWs�I��X�^p�v^�6^����V��rj�L�j���*��n�u�!R)d��x
pR��/�00��l;dR[KSC]��͆��UyLj�]�'�R���@|�������u}]��~�e����hiJӚAĶ��9������>���X@ZaY�g$�jH�>���?n�
�?j���}�hm�oɺ����4���w/zY�j;���̭��Ls���'˧s�~��0�-Xmv�ӣT�5Z�ހ ���Z���[��<�����
h�����?���w��}���~N�c��W	z�X)�����	pط�WEvX��¦�_�'/iG�'��c|��:t$Fga2x�B����g��>FZU�9�k�*ݙ=s�|ٟ��5�Y�=+��G0LV���;Do�u���ϧ�Y�eK-��1u���0�R�#=<FȱA�"���Q��G����8dpp\ϲ��x8��8fGE2�at�C4Ns��37�H�f:E͛�WPWɯB�Pͅ�h�0(��SXkL���`9C��OQ)lP?~�*}�܃�I������]�ed��F�5��N�8q!��>�"�5u�˜�^�;���!�ͳ�Z׉
���vw��]�� ��lx�>j���12A�,VM���}�X*W�e�X�l�;��`K�1kD�S���X\�K�T�K��H3+�
�΁�s�T�qc��E�	`�|�����b2Y#�+�*�Fkmck��w��BQ�k7�̤��a�θ��C�Fo�8I�|�yY��2.��7N��>���󥑖��iћ�뇶��k kA]�
f"��
�mI`0�'<��Z��Aa�U[E�x�$�5�5�B�bw\Yt�Ln4��Nu``Aw��^Ay�Y��
TX��")�љ����U���~�Y+���?aɒ�d
,�f=;'7/����������2��/l���ohjf0Y��x~#��EU7m?��v���� 1宴�&�"lv�'Id
�Fg0Yl�8���[�,u�4�J{>�|�P$�Her�R�>}���`4�-�%�J�h�C�08B z�:ky|�P$�Huz��d�����ba�� #�LChuz�����oӂ�	���ˍ�����g��e;��eU7m�� �����C����y=Ӳ�O�,� #ݨ�u��n�6��J��_B��@X��d�;?�'����K$�~:���t~�,�����Ũ{[��w2��'�T�uO�	��hH������0wr^�;�:���PB/s�@(w�?��F�m�㧇p�5��{�R��J��r`Yпm���A�O�`��J*�t��e؝2AɃ�;b�Ӵ��X沶e��Y��:.��RR��|�a�]����⿯.|q+�fߕ�w�����3�s��eo8��r��ame�ֆp��PW��:��)_�BY@��J�2�*T�R�F�:�4jҌ���O�6�:t�ҭ_�>�2L`Ĩ1�&L�2mƬ9�,Z�lŪ5�>ٰ�3�-N.n�<$^>~A��QUSW�1������������������O@HDLB*���������N�8�$�K�,���	�@ap�ffań��o(�7��>��0��4�˪nڮ��z��w{��h(�@��,O ��*��`��.�/���L�/nW�d��(�.��p�y"�'f*>�ǝ��gt��Þ�b���e�V�T�k0U�T���0`D�Ԉ‹(��e*H������ ���s�jz�M�ͷ3R�A�ENTc�56��sn���~�����pd�uh)�D�5�)-(Ux�U�:��-�f���o>y�J|RPYl��S�Nw��@b>� bV�&�R��dSL5�t3�4�lsjn�<�U��B�,Β�
-��r+��G��Ve5X��fT�}V���V]Jǘ���q��f[�3���U�$#3�S�r�d�*V�22�+'5�x���Bt-UP��
�:ђ$3c1t7ͭ�%K�lߞ�Fku7D�̆R$�[
7�k�θ�c����B*
Q��VVS:�t�U�:qէI�j��)��� =9��)�y�SMp���r�G��-��g3Y�ql	o��e&�����4�=C��F.
�_��TՖ�ZM��/�����?����%YQ5�0���bԺz�ܛB�J-4Z����ѣW#���������������O��x��g_��7&���T�:��?��=�1�m��/@2��'�f��A����YKR�6�����������-�;
J���ELhW{�H���s5�}og��#�V�.>�p�[��q/��ā
0�Ŭ�dv��7�d3��Im�(m�3q�\�<�|��B�"�b��R��2�r�
� 0D
�+)#Qh���������D�Bg0YjZ�:z�F�l�[��"P��!��ri���q.�'�o����bVσb�Z�Ma�5�s�%o����$W;�Z;�)�Β�H2Wntt'��cj
Qv ��$1i(�f�u�YOx���3�E�1˝�W��8��d沌��:|�I$��jV���T���&e�(���T�}��u��+�?��y63W懺0�Np�*C���]bv�z{���w�M�f
��˜��ogfY"��y^JR�yk��+�[����~�o	��ʮ[g������{6��)�L���1��N��^�y���8P�D��h� �'�ϚT���!�_����������}oۏ3�Zf�I�%�;	������h*_i��n<S�=��j�6	#�	+1IIf�R�����ș\I�+���Փ�G	
-#3����_@PHXDTL\BRJZFV�FM�e�㡛 b���u�N��J�՘l�����V����l=�~�Om����fX�����AĆ��:$�2FkE���.�>�|��#��%T���ԓ���vP���<�A��<�-C��E|���6��k
/����>�x����'��?�*_;��K�+Oa�&�.T�X���m�YD&.�(��;��t�(�<;2��ò��"��j�5����P�)U�O5���Cd�q?��(���/�������f_BrRƇLz6b2�F~լE�6�n�ЩK�����_=AD� yz���G���e��`ttqb�B��huz��b�989���^@�	�c������8Cۭ��k�O�R��321��X�9��<�|��B�"�b��R�2��5hԤY&���M�d��
Q�k:e��E�V��dSL5��G7���g\L�eg��Ʊ�����@�3fݿ����`:nh��tܞpDK�퉠�;���CP�&�1�]h9ӷ�=
#��pu�����3�uf����g��Q`S�O��֏��>~�{�I��S���
S�l^q~m� ��8f��kc�o��;��g�?�N���B�Tf����-�8n3���� >��]=�b
���MlC���f�DX}Ax<{��C�X�ܽ�y���{�̘�;0qymt�/�yx�W��x��Oe���5�ol��[~M#Q�+):�/5�_��^�n}}���O��3M�a#����d��ne��_-]��4�oƌo:X��UF��mitw�c�zç:*l�1�5�0Fk�h��h�0�1XB��w�X?�Y]��ڨ�ؼ�'�I�-���񘰌��BCh��$4Fcd��P�W
�*�!mqTڞ���Ƒ�ws�����7�駃ػ�f���i�z]J{Шf��Q����u��m9��"�oX@� ��c��R��Ǫ<W!���A��<�`;�āΡ`���'�W��[u=w�_h���0��������8t�N����i�6�7�"�ɣ�)�t��U۾�e��p�ɹLS�~���t}{w��|��nc�Ӫ��v��5��Τ�F�1񆱎<�I��0���8�N��F.�\�<���[�#j��"w�TH�q�Vd7^
5�f�.�j�Wu�=�R&�e:'���'/�DZ3*�Q���[�pK�۾�2	�ǵT�6�s	k��0)��f���:=�frf&b�1�3����ʃ��p{��=����N�*���*HU��w�&�qo���3;��8hVW .��(�QT�PU�;w@Ԓ������j��º��V���_FW|�R���B����F��U|��G������z���W�+���Ek3�:4~�F�t��'��,���&�?05�ҏ-�da;�Ҭ3�l��7ڦ�I��NR��yR�N�1��k;:��E�g=�v����;��t	 ��pH�x|7���p[�e�V���^��'�+�^����V�n��/��LY�hb���w���3�;�x}�L�Xe@�UÜ���/��ON�����U��5�&�Ժͯ?�6�x+�)�d�	�;0�}zP�c�<�����3�1���b=��ĝM� �y�|�P$�M���2��X��o��ё�}�{S�b�+)�(���2_��W���(�<���Ҝo�uu�۬l��|������~��ɤy��kHd���%��>�����W-�^���^2L>�
�
S�&���@����ޫS�{R�[�?(��nE�(igg|)��>�z��4�oU:ԥ�o
�]�Z�ܑ��&��+�a<�וu�:�t�j�h�p快��]����Y�t(�'�F>`��QX�H�a@���<�B?�8�����$;���#|wuޔ�vп
��������?^GZ�8��I>)�4n>� Ϧ�YD��`(�',��YUUD��`F�2���O�&��K�5Z���nRX|j�u�|�A�M����1�2��lV�鄜�I�%�6l�~+�_q?"�e�Q�BA���(,,
���G�PPTtT-6���Rn����N���5����E����K#	�DQ1�L��U����t#%�6�
�!4}��졇�6L�L1�go�$�������4��L�Y�ٓ�Mѷ���MJ�z��,<��}�6|�'����C�0b�����y�����bf	hҟ�i�z�P|1ѵ�����R	Zx��9Z�J���|��և4�N"�@��Γ�eM���%o{��	���
���&�@B���Q���(:&�ФYc���3����!lB��؅s����9!"� �E���&`������D�EQ�P���K`HbJaIc���Ǖ�3����7��kh�	����Z��e��kɻ��l1��])���qJ�.uh���[�P�Hm/ �A��ځ'�����.��@��\�[�P�{^xsY���NVYf����������:�z5$6��$�Y͖�d����ݷů�3�k�H��X�,�cH/����wa�%�2�a-v��8�,��LP5Y�h�Z@���!�Xm�q[��X�k������qJ�&)M���;Bj���I݌-�sL���&��Eꖰ�l6)�
#"cwQ���[x�&��$M��)iR�z��Z��=��ȅ<
kEN
)��MG�c����J�m���zoǩ	&��*SXmk,�d�ܔA���٦�9�X��
�V]�.q���{�%]�b�b�FFlEo.g܆kk]�/W־WgU�ծQ�aq3�W�<��Z�n������y�6�e�<?hEs�#Vm�M�f�{��qCxE�k4�Z糭��{�d&�a�V���*�2�N�2P�(U������m�_��U�gR�=�Qy:�dͨ�!;���䓡�xv�M��C_4?��2�P<�C����	�*�Ѷu�[��zuU�@�Mi�y��]x���g�<=3���O���u�.���#"o���mݰRDN�6U�6�o:Y�Ps�t�'W��ōΥ��[@��(�,ۘ�P�_G8��V9�M����u��r��6?ҷ�X�;%�rl��U3�g��"�q����(���4f'4�m�aTXYD�:>�"h�I��
���T��1Ww��(�kϋ��=N������P�[:j3K�FW87i�{Rtu���.�†1O�I�"��<B��������%��=ި���ui������6��|�r��������W[�U��8W�N�r=��J�%���1u�*�?�I~,G�mO9\yq�H�x����.�J��B\��~	K-N~�H*��E�x����]�����WW5������j8
��W_v6�ctk����GW���cz�lb	�	�F��A����߅g���*٥|ٜxrfؚ��^Y�*�͹O Oy6�,�N*�3�(��&mo�
�"���n����1)���F����sBH~G��]L��@Z:?�Xjd�]x�'j5�1��A��脡�)��6q�ă"fõ��gH�Ou���Q�,=e��<}@�:ӆB�]�l��w�#48k�ٽT�{L� 9u�e��B��9Sn'N�_���ѹ����Cۢ��k�x0��ΝM�=Ģd�גQ`�n�]�RP���e�.-��Q��m���~�H�"A$��؋J0��!B�
�R�Yx���Qj
�*�4*��ċ�i��ў��4�4]���>��T��0"3��Ԏ�|����{ZƳ
dM���]]n�]wտ�I�r��
rB��Q-�r��/�Zh!ra��\jmj�(�|�8˷H�C/�eWW<�T-�f��@g>&}�íy��v�>rh����\�,�_�z�V���4�`5sR�k���d�G�|�G-+�z��m�Ç����h�,�.�f�JTjR�IEE8�J~��
é�&��D�ɐF*�Y�#焄�r���}^�J����Q��F�����U�AUIы�o���?:��Vf��|uj���3�7�D@����:��C�/T��I�W�%��
p@�fp~�~΋У�fN0�um��s^�
�q=�@zp�8$f��H�@\|n-p���Tq����x�'$�񶕲vg�`!��2,��ב�hA*ѝ����OT�3f�R��e0.�1��#0�6sLd�t�����,��C�Āj�)�g�D��Z��D���ȑ�2詺-ٿ����� C��"1w1G6����9�*�@����a�o���H
5k`
"� @ �J�
�VuՊ@Y ����)�x7�F��W��`_�d�x�SH�h$"����z�j��)�"-GD1%b�x�~EF�0��a	ffd��jNln�s�K�^Ĭ�8BˆE��H #
@��-��p���J����<t_'�ԝ�0Q���3!����&�3Sia�5U6���ɶhʣN|�j1�?�%�6�ù-|��\4�	�]��S�w=@�2$�U��դ���ս�ŬٞAom�K�صL�2�ݢ��Ǯ�
y��{�MO�g����s?#�n��]Ş�w	_4�UΫ�w%
�Cz�Ɔn�>���/G�j��/��~�g�"�/�/�/��`/�4�����v��M���r�}�uW�^�2ED�!�zH.�� �����	��?��O�v��p���_{<ø����f*Q�V�s^�~�["<����Є�&$4%,����BQ��Y�i*]��ِ�������<|���`�D1B�+N;r�Ž5����wB��Ӳ;t-�k^�B9/@�I&0v
b|!�1�NZ&r��<���/��w~6�mW�hV�e���(h���O�oƻܒ���=�v:��@t/-~���0��-5�#ZnIt�]��2ƉSN��� �:��*2XXظ��:�8W7��y�����5&�����|],=%�����Drޣ��Wvv��MSh�O�&�Q�1밆�U�$C2�x�3���zT���m�@a��E�ņ�I��4K����w�
&T{gih6^�9����y{�٨��8�%��6颗>����������aW����G
DaM�j��I1�YN���w���ѻ�o_/F�q/h��깬��Ƣ6�t{���Y9�9e�3����O}]��ݿ��S�z�KB�J����J�X�?��F4��?�
���&6���4��vv��]�����9C��瞸��3�_��?�����6;Q� ��	��.���N�8��b����6�v3v^�����>�7�
	@�Qh*�6ۓq<l�r]���)_#y=L}�U������Ҽ���q~9��z
0D��+'��3���N�qC��!yS�ɮ[�>��!bT��q1!&ՆN�iq��<EbQ,���Q��,�	^��l�12o/'�c���F7ӀGmW�"�1�
K����"(b���0��	D��9��=1����} �Y�X�Q�s�2f[�M�@t�Ί[qb��E�Ptb�Qr�d��֘�J@�&�Eʯ\��*�`p��G�Ѩ�
��2���Y��T]W��ڧ���&��|D9�͓L-)�B��k	�xycah�^�Ōj����a�D��72�/8l�덵�/i�c�!�y�h
9_��lZA�wf�"jb�|GP�B�c���1���0ĩ��^|!P[����w���e$r�Qj��+�EY�
��z�%3�R����vKfj���kLj%d���/�m�r
J*Z���x0b̄)V��p��%�F�~����S���3��`Ę	Sf�Y�b͆-�`���(dD0:e5�A�H��g$��/��	�"[��JT�bzL��PϪy�M�U�z���ڶ���XH�-I�k�4���O#n���c_.ھT�}���s�c�rʬ�1�W�E��m�x���V,��bhևHC6���p{2G�}5�^��s3����܁�E�p:�8ܺ8����3qQ��KCֵ
�$-�î
�X�M�D��L�L:�aj�������ԝÄ́8�."�H��U2����n��r��\��~�\n?��o.7�
Y�}mI8�\�%\�φ����;GL�t��̓n͐������)�^J��!��O���3ꆨ\��.]-��K���aJ�����g#��g�"N�}a/IW�z
e�g�4Q�*��w��(Q8?�zMX�Uů�<z��mS#_����4�D5�ʢ���X���c4�<
�r�*gX��ĹH�K����YY�=�(Ȇ���6�εO�uP���N��w}J��Ma<+�e�
�W��O�r�U�,xw�#�<n��݆��e����Ê���
�h�:����˭�j-�؇r$�*���V��>T{�!�*�:��IA��N���zBq��m�i�]V}���3��$O��j�3[1�6\m,����#Vr�t4�8��3���G�c��YL�>o�b=��~oO7(*�`�#n�Y�{
Ҿ��a=^Q�J,}��:ek����i		���:�#Tj����L�rL�4(z��7d�<	�N��`�9��O��=O
4�*eK@�ZH�m"ƒt+)w��K���?M�FH�6�'^��Oq`o`���55]s�Pz���A���jJ͂a�t"C��	h�<�a�S�M����h�N}���v�fȾ5*��ݜ[��	�v���N�P9�xP�H=�T�&��f����B᛭�?lӦ�X���D��*ћ��y��Upv:��H��0t��eH�1'F����7�`�%����p���
N��-������aq7��]���'�<�N�k�\d���4�3Lח��5���,,��#�_9>��?Q�]���.� �`�Z��|�+�4m]=]���iiF�&��j���H$���Ъ9���o*
m�����P�}�C�}1f”��TAQIYEUM]CSK[GWO������L&?jnaiemck�uaL��Sq�F��^�ݢN�W��Ҵ9��qώ#m�l'�>^�S��߳���Kȝ$8�21^���:������U�&�;IB
"�'.���	��D�{��	�����Rx@�}�/��@�,��#�C@=�5�M��5�,��C I"����aMU�#6�:lMXC�P04
dȩeW��]^���셾��7���-��u%���ZI�^��nKy�w���i��&��i�Qj��g��� �$���V
���i��}P�
��p�u��4p�kr�w�t�^�}��8�G*)?�Nۑ��m+�ܷ�rj�1����]Z}E�
2�Ԝ�Rc*^����f���3�=�24U�%���$p���QA~1�����n�+��mI���m��'�j��Q#�F�B��)��񪮃z��c��(������I�bp3yX$2�򼷆�E����a!Y��~M�����?Y>Xb��…[��f�l����W�}�;�C;�cN8�s�:����i��?L���4{��p�z�!�C��U�a�9c��+z�S5~���3�؏m�N��{67v;
x���ˉ�1׭�%���
5T�K̶Ԣ&ͲlہK��3��`��}+�3���
<�ʻ1��M���4�;S�`O��u������A
�������Z�+Y`�̦	�s�w��ϖ*o�A\�"~1�͙�K�.c�e�2,��8|9�K	Hʴl%����nY�a�ytgV��x"�7���,�%���rlm�	���ڈZ߀�S�j�>�:ϋj�|�h�F���[σ��؍o�yV�J�̌�<����l��J�������g���*ʲޟ
�J��䰢^2�:�����	%�E*���Li��aH j�/b%�}���|��b�H�Nu��'�O�I�q�Y�G�u����&�x�����Hk�a�7�z�T�;ݙD��ǵW�|i���]JHC0��������[�[;Z���Dh�e��f�$�C�a�6�U �bw��󖨰o�����8誥=-���""�ě�C�hR�JJ�1������N(�+���$�f墒p�bϜD��h�?Y�v�$;�c�3u6�nOO�5���9%<&>�j;��@:�ߠڇSk��V]�q���m�G:�b]5u�
/|nŌ�u��)�ǡ�U�D��-&RZ�pЁ��
�39b�T$Cj��d"�\�?^�R�
�o����/��$�z�J]siE�El�+d]z ��Ձ��"QĎ��y
�>џڛ$��A;�B[�����ͱ䲨���==��*��������c{���t�N�j|�譏�lh�ưF͚�S���n�p��){Ԃ`'�j\m_��=�&2,�i,7�2��d2�"mK�y ��i
�
9A6�	&/�
���0�lֻ�C1�ޡcPMC6�c��%G?:L<��y.�wF�C=�}� #�?k�zhLEt���y� !c�@`�C# ��7�����I��)j��M�m}N�CF�X��d�nM���
��k�8/�+�_myzE��i�j/xoʤ)���畩��sJ�,7�#I�A_�"��<�z����]�m�Z�S_��~xE����_�m�ݴ�DW�ْ���[P������|0ʙ�|�8��[s�
�^K�7�l�f�D�gg
Ϸ���A��Ȕi�s����6�*v�06~$����9�����~�ÒG��l�F+ ��ʏ��%z/&g�A
j�"k#HY��U�[��[��_�B�R�J@�@��:@f��I�f�T�'4:���Eo���-�
ƟJ�fԪ��M��r���iYiΙO�$TQ��8'�%��HZbpd�BJ+�]�B��2�3'��x�)YC�'�nܻ��"��9aea���:�
�ľ�q]�zԨ�bcy:�zN�uS�k�C�-�"O@J��@��iz/(jLM��v;��J�N ��G<���`@��.l(�K�׋n���'
�v���w��2i��D���&�U�kU�;әQ7���(����"��������x�y�zǤD�yν_�Ǒ��n�:]�;7ײ,�A��XH�\�X{������9��Z�M��o�rg��c�d�r���2�9OS"��vd���B0&8��f�1�eD�5��I#�9�D9�`BP��#�D/�Qj��_�I[*,�������)�`�1vx_G9�%"�VRV�E��q:x˹;���c�MVz����0���B�"Fq.׶�li��[���ְ�9�����u!<�� 	��d�B2˓cb�z��HMR��#�羔��5�����V(/��v�n�-���Ź弪���ĽK�7vo���ijmb]GYx[�̋T:['BX;�!|�E>���3/��
�3����ȫ�/\�؋��Dl��,_���V(�h[�BԭRm[�I���\��zj�bl��x��2�����e����@Q�y/Z^
^p1��~��/��o|M��=�P<a��>��!z�t����KH��A>��1M�LQ�\E��{�pmY��
Qg��,Yk�K�w��Ἶ��×�����0�iPj���~YA���װܢa02apc;w+YΉ�⇅���Oǯ��K��q�}�|���y.d-���(�!�PY�A�	�G� #^"��ܪ�ÉA�P�����Rn&L�Lɱ20��&��A��`2����B:
@im0���]�<��p6�ow�D
���y�I5˻��?�Y{����h9r�V�4s�4ov�x����ɬ���=�?�cg�Q���3p�p�&�}�Ξ���}�X����P��!�T��#�[`����!ӝnQ�ĂwV�թ���C0U1�ƪgo-DRi^�8M�T�<H��I:8�_\�M�>���i3��ꐲ��i{�/�Q�B�n��WD��2d��
�b��~"8�,CF��l��̆#<|%�X��y���{_Ff5#�-���&.�Z��R�Q��S�h��)�j�¨W�ď�$IP�
�/��c��8'sW-�����ߒ����E)M>�57���~�T�o�"��b������7���+8}����z8���i��"]V�ךU�$���U���������Y3��(��T�Z�Xs��M,��l�X&���������X�>�E%;J	"��IE��dD�ךH넥|P�Sb�L������̱�#��H%��!ޓ�oj�3���îJ �����i�BTz�
�~�͗��8.�eɦ]
@S ��+?~i]�q8�*\�w�1�1U�?_~n3�FE	�͠<���))�BU!����P8'��hp����T*!j��1����W<~s%���t�m�D�y�&� 
�9w��y85h�D���
;	EPԷ@"��Ea�rK�9Gf���X�/U�ZՁ��Ր�3��֧"����7��(�]R�-UU�r8��f��ٙ��9���GZ�R>�WkV%��8)��4�J�s��/Aux�����syԉ�5����Λ��%,�)獆��m��L�bZt戓��2f�z��d�w?��}�=M�`�+K���	�`��E+I����Tuy1��u�r5�PgmȲe�o\��s��=ԏ�jq^�#�^)^r�8K�T�qs,.�}��C��&<uP�'Z��Rp�W��B���SHt{���M��r�t�hq�+�'�=�;/.��'�?�Im��f�G1�����|�]ʬ���UE5ʬ�g�9�����]���y��L�{믓��hm�	���)Ř�,��$���)l�I��bF�]�)ґ�z�g�iz�(�P�[$	Z�R��hid
3���p�ڹ�u����9j�U������BZ;B�/��
���z�s)T,Z{#�B���V��Ppe����>�j7t���py�C���.��u�/b��P2��HX����N(�̭�t ���z-8��jo�_�gϯ[�����P�mZKa{C�j4��DyC�Vj���k�����k���
ź}
O��n�_���ۚ<���N���a�W|[ߟ��A�!jl\.�|���:�uTѷ�VJ,Q��<��@}�rj�k{KH�J�<iR1A�,}e[����?o/��S�� �ӡ����~��dR���`_Х��~n`1{�|B��4\�B
Կp�a����u�p����7��
���s�7٧���/�xv�6�҃s�4����?Y�_J���~�ꖲ�+���o!��}5u��g�7��'M���}��oȾ�=}"1��E��1��3ӷ�g7Z����E�ƴ��/w"9�;�|�}�>Fx�#|9��P�|�\�_�L�]����_��/��ڦ���m����|��n�&��|�s���j��Q���V�7�w��[C���}���1�;Tu�c~�՛1�ܣc�/���g��d�O�J��NG�
�X��5��.�(��4xz�1�bJ�����+L���p��;��
s'{c����p|������AF��'�ǡ30��ȗ:�z�*�.#Rs-�6z�+�q���`>��%����}�q���i5����b&�b�Q�,����C���pG.V�v(N�2�[y�
�_�3/@~���wNB�oA ����S�M�ay��8�,�(!;�	�~3�?]������ߜ�̽|�A��|�*(�C@xdN.��\	�(B�,΁i����$������
�`�zNpv��
l��cݮ8���"�𻁢ȱ�����u�Ke`�U��I'vtJ
o"��Z�#Ȏ	�x=m6�dhl��C�js#%��y��z����ӥ=;�O�r=�|�&�A�I7�*Jl��D��e�a�jiI[l`�!�.V�0_ɧp�-=br떒�
U?����,�+hYv��$@ЙA�|p�5P���]ώXB��Ii�H����p���.x�c9;y�߀���7����`�A0���j=���k���m��ͯc�V�hN�rjPU��C�/͌;�7*����E����4���jW����-���(�@�E�]�n����Њ��lr
-��.��c�..v5�f�!k)��ȯhH)�Nj �z�eZ��0���-�̊�I�G�`�GŪ��܍	��g��Ò��@�@o=0���������%'ߓ��[;7�]�>{6*Mخ�����<�>U�pt��q���Vf��+�s���}T�T�L�K˺�U�y\f�q:�[��&^*z�h�F=�<4%��A�&�n���r����WJj����;pHFN�ǫ%䨸" ��w(��ɳ��_v�P
*���R��3��@fr.��vz�WiZ����o1Ph�)d�8�rw%�t�bE>�;���[c̥�kا�r�'(�l���lEq�ܥU��(�I�U�E�+�3�!�Ȏ�YgmL��p�+
���\`�w��b箣ۗ�,�E: !'�e-�՛��K��e��.��&�cU?�b���T{R|�Nj*��v��x˱n�9�
��?E��wLv��T�
�f�J��	]��Ђ;��!��.r)櫊{ܩ�1�pbjey�cW��Z��zk�����;���޼b��z�OK��(��dفM��Oר�I����P'�r���O�+
�s�®<{a�طu�@�!��1�ѻ϶%���w8N���H[���4�5��l�O��2=��RN�3�KXf��r�[;�`ȇ�s���֔Hh�Ĉ�ޘ�j��:��o*Te0��Ԙ�r"-����P���g� ����=:�����;Jeb�%�p~\[������C�·�*�܈�����?�o�pp+JM��L~�C�GxK�]DN���-��#��B��6����Ž��F-���R��5N�|#��:u��3L�����&��%jw�P�1�M���.�%-�t��]�"8�=��!E_-�m2�	��]!}�T��%dȰ7|@�A��[��6N$6	=b�"	Ȉ$�;4D��Z}�--��r�0mx�)��#��p� {�¢ҙ��~��m�s3m��f�Ir'-d����!�G���ks1$������F����Mc��9�o觪�E"S���8�1��K>7�17���+$�X�K��OW�Yj�Z�Ŵ��U	�[�hg�sdb��%�i��9�U����?����4i�Fl�Ѵs�˯u�d���߽�'�A}���
o5��"��o;�)�wPLsy�&�J4�2:�%ҷ�8�e�R�1*����U��Z�̫�4���b���c橙h���k��rg�lu�o�d.��<��6�c�Zqǯ+�"�;�!3��d������ǔ�"�ppyf�e��H�K/�"(x�#+34�!W�� ��6v�az�p�X[��^�ڟ,yh|�2*�3W���~�?��p����4F���b�!}������N���[�$��4%r%4J�mJ�!9���ʏqӋ%�R�%�6$��`��+��zo�Q=,�e�~�h�T&�+	��X�*R�B.\�,՟��4�d�d�,y�qQ��������a��L�I.M�^,Tc/�3�-�=>{��%P�2/�
����&'�
Ĝ��6�u=���q]�V��I�xy�ԉ���SI.a
�G�&�?�ٰ�j�CH��ޅhe�U˺�\�b���-`�0�Vӥ׀�/ZI�D_��x��	� f(p��y6i��O��J�L`u�ߧQ�ӄ��:���(.�ܪ:�Ǯ`�'���p��~i�]�c}��,��y
��2ӄw���^\G\���t-Dxo[�RR�ͥ�$�pg�'��$Hz}�za��� .�l��C�Z��]�H�����'�q���{��V���S,���c�{�1s\��y{�f�p��A��!B�Sܮ�*N� 'gw�0������v[�#�yt��>�Zٌ@��s���ysb��^�#^,��8&\���f��l�{�@2��s���yMq���V��F��X*���%��Ù}*«�5N�{��X��� [P��D�~B���|A�:2�=�w�QF����̴��JR�e.��d��ֽN&��&�	H<�jb�2T����l!ĦQ�Uw΁�A8y��q�$V��Lf"�?���Yǎ�Bs�i��LSPr���
����q��ZO
�	�>.���7���)_��Q��gt�.�L���'J�2�K^_�" fm(�ؒ�c�?ڊV�w4���
d�����:?q�N����5�^��%}4�L%�a�s��я5Q�s�%4L��=s ��a�8�퍭:"Z@���y��%b��2�Y&nͅE�#g=�ķ��#�4_�/�k.�w��?c}�|��
$h%J,���V���E�j$ì�p����~�ٜ�1T�t�u������г91)
&��v|Q���Q�@���뇥�yȌ�dji�F�D�u4F/�Ӡ$Q��]�%,k>���?}с5�W]�s��w,(t��@5{�V�n�n�_g׋:J�B!�s�ė1?S(�;�Q�]G
�H�;�ϒ�#��<�o�mo$
Z��lF����P����VId�׾�,1��0�b���@�>\H~����c%6^�ܖv9�~Nv��t*��w.Nl��LMo��?�f<��B(���b���W���0]��u��r,��iu^��Nt•����:�M|�R��vѥ�d!Y��.���mI]'U��H�ʧ"�(An��]e>B��U����)`�������'�����VB�l���w�8ԡ,uY��.f�z��������*
Md�8f�e?����ӣ�6l����1W�a@øl��$Eg�������\a���uև�����x`^.�vd5C
m՚V���S�T�`����B���]��M}T*dX�iI�v:{�F��̅���@�鸓�,*ѕ��~c\��P�…�9<�uR�X��Q���zC�>��m�vc��ဌ��j��(T<��]��<!�-�0�K��[_h�Y���C2v;�D����l\Ǜ޴:ZĆ9-��)nhD�Hd�4�n��9�K:
^4f��t���u�����;��b�Z���&L�1����%�s������s�.NJ��*���딑n@�ҩ������_E�P)E�$f���p2�<�sޓ�4����>�j̰ШC�;������@A�,sA��*��Hd>o/��e{�K	ZXw�bE���1/1
��{"�54�Z�Z[�+o�4�Z��Kz�ݛw4��I��Bq�
ZM�mţX���7���Hg���h��z��]������,op��#`r�a��_<����_Q��e����Is��)���GÊ]�v�xj�����G�3¹`�X��>nV2��.)’u���6�N��8"��BI7+S0����9:'U�.��M�qt�ǸA�_��@z�,�}`��vy��#��LW}S8:�0�#U�C�_L�| �񞣦8��dW)ί�4�Ѕ���2(d���ъ�}��q��V'C;7&������‚;Dv{�D���r�l��n�d��@f�:0�Ks�$�鈽&���*�'$�^%S����D��
m���z{�P_��$�F0�",��E�t�h,
�Bz6������T�2�Vp$H�_�'i���`�;&�}�L�4���	b�)G�����6�X��9�Ѯ���Gn4��e��K�"Q����h6�b�����5?_�A�F���O��m|=)3��.�2�Ν_�&+m��I���}����f&Lr0y�9)'a^�%�kY��g��}�7��d�N�ta��;\/�EG��]�Y��c�}���ͨaM�Ƭ�rw^#X�N]�I�=��x�.Y�c�m��@�.�o�"EIcc����\��H�x�B*�[��� rL�lLu�w^Ro��r�cT2�d�):�pج?�	��7��b�7���T&��Ø��ah�G!��Oŏ�qi���B�-Y|�X��YЌcV���x��pL}S3c����`n�l_�/8u?:qvf���I��_Y��h39�|���C��\gHyM0���~G逽�u4�wiفR��DI�JȾ��s��{L���.%�fb��%��Ni���E�݊�^D�!TΒpB

:ޞ��ce���5!��`9���M	���ͳ�:��lFK�6�(�
E�2'����mQ���֚����H�i���03��mM�Ɍ�@^m9AiN������t��^�
v��>:\�3��y˛t�CC�aGͭ��o����-
�W�?�k�3�S����(�Y����
ҟ�����b���,`�7Ɨ�.L�v<���0�PN�������U݃x��dYX �a͛!�z��)��Z\I��4+�.J`�S�ԕ�U�rY������g2�����c\RswɊ8Fw�C�u���1?�?�~tx����ᑡ�љj�"F0����\
�\�^xr2{V��^mh�K{?�>�ګl��%��������Е~B��^]��@��C���
�,���N�&>����3�b�'���0_�"<�"�v��--g&�N��'d׳v��؉�`(f��7ݩ�_Bd�g.����	*��L�b�~�$R��aJB�R�������
��w�s`P�~>��9�1��*v�+��?���z��޸L�0�PљP�
�����b|꥾�S��1�qeja�~L���3K�rG�/WC>-VL�? |-�:M���&'(BF�>����P��MI0G҄م�
��
�PFqiuܥ���a��]�(���):��?���@q�I��������U�>J�q]�����b�	.�?t��Z��S��w������iJ�y�6G����t8��,�&��}ĉ�
����2�5r�EZ59��z����M����� @���M�?�q�nC��UdZ��D3��}&�a!�pD���zf�keھ�!q(/'�b�fbt�!~(b�U�"J��r՘7�����9A4�3'�)Ѷ+}ޘ�<8��\��A����Ŧ��H�>����=���c�&u�aS�p&55�)��x	��T�Qev��S/l��&hjB���w]�_3v�M�h
>֏�q�?4�鸞D������Kx,�/+�
�\0�,�y���@��Ubzcb�ӝ`a2t���ʂ�3�G̟/@Ys��M�X! L�5�PK���$�a�J�p����9���8ŒX/E4�)f��ʐB
�%:$�t^��@R`����S��F��R1��͋�t*�2�s�O;>�
��W{��6�	0����M���=:�,��{�g.�z���f1��p���k�����%\�[d�
��-����ΥjJ�`nKkr˟I������s��l��hRO���7���U�;����[�>�t,�F�i�e���s�N[4����y�=�4::�%r;x$,�D)P�pΥ��$�h�/��?�0o<֕;ij�&��
��u�c��I���	�HjC�,��e��1���93�9åjԍ�'��*J<p�&�W��(�M�>��G�=0�[f*=T�
O�Qݒ�Нv�c[��/�÷O��Mߒ[W�����:�r�$�z�s��<��6\b�>
��f�i���Y�d�Q6�C��;��
����}10G="H6��F���C�h�H���
ٕ7]1mpL�J����Q�9>g�k��qJ�$ש��W<R�"�[7S�ʹ��b!hǒ�f��)�`l��Ҟ��Ƣ��4�]Zq����"�R�]����-��x
���]^T!TyF�01�G�C�2�-��K�?D;����忻4��jVh�xk�{%�{��קe�c���E����q��/��$*'����LE�6B��B�Cr>���
/�5��(k����sb0G�.1g|v��=0v�;�� +��5��p�I�2�r�s��z�i��.-7y�4�O�o�ʸ.�$�8�.>�=QG���EUFi�Ĭ��+�LvmV"�_ǘ�4��]@r���n�<oN�ܥ��a�xdU�e�t�J�¡��;s���\�hxH���{ְN�L�c�ƙ:���0z��ost�5:��OoBz�m���4�)f���Z.#h(��ιC�F������8C�LtӤԁs�5p
���3��ܱ��h�S�Ax�۟���1;���ԡSm]ٓ���:���2]r�.��rc�1����ب��e<Ѝ�M�GG_���Sa�k��*G�r��4<w��3g�Xm/�D�.���2�7�#'Eg�΂u�O�_h=�~~1��`�^�5�D�����"+Eċ�����\c6�_wA���L����V��5�q\SqS�E�_r����{'ߘ�	?�E$����g��J����%�+�ĖnSV u�Y=�J�њ^n.�,|�U4�m?
�������'׏Ti���UW�r�L����n-%��8jҠ�V�WkGj.�
~0M���Rei(A�!�:7���`o��9�kZ�j����D����g���n�I��h6��L�^-��X��ϋ�������v'��^A�X�>��~�`�!EIV��M@�W³���!��4��[bk�������d'i���vOP3�8��Z.�>�~G��1�s�-�����W��N����mx�	�0�L�w"�(t�/¿u#4<�_B�ux��'p�QL��^�g��o����m�r�<q�/<{�`�"�O,C�Pۊ�"#�5��6�prڍ͖a�)ļ�a�8���_k��>�6d���4�zTǟ��g%V��2��~�MmaNpI��@�ϖp��"ͯ!v���E�\��q���[�A㡛��C�O��[��'�F�92$����a����/���k�(�6d�C=�/�g��Pө1ɃJ�L���+y���DZ�;��F�ÂĢ�s�.��McTN3�@��J�m�ܽ���*R�:$�3�s-
�}�s�B�A�����Ĭ]u�W)���9�jj?�,���ۭ�B�b�r(8��Y�Z\��b�#�L�ϏN����Z<=�J���\�5���f��jY�(����b�ā(�+�d-ԇRBT����#�b��$����"B��ˆ"m:,��Y���Y�ʰ�I������Q���h��;e�M>d�ř�q k=�?J�=a�1Xʹ�lp1jr��ȨQ��9Ly �j���Oj�dw�u�zy��c�y�|�n;�3�?0��3�x9������A{I��Չ�-!_@v���:碇Ą���R���
Deu����Z��2,	�駄y��e^�7\hqۆ0���{;�G�6��eR��mR�A��{	�F��!�%�%�[Q�I�X>_�
�{�G4�L�}8�u1w���M�#�A�U8���\%s]�i���~��1��Un^�?���a���,Qכ���`F�]�#S�o�.Ć"
�ZGJx���v�&��qL��C�I�p�J�!P��PwVB��L���c��Z�1�6a������m�����,�}��T��g�u'~T���]C�ŷ��e�h�����drC\��3����c�\x��,ڿ�^Y"hk>~���sxi��)K�[�~k�%ۜ�����ѻ�8DuBSw��rTzD��h̩A�Ӱ�
�NB�un�!�$v�
2��=�j���u!�&.WV�7�4J��m�<l&g�Nq̀�:PZd�
veX�hW��{�nG�8�K�5��Cn�Fl
����a�w�pFd�B�ڦ�4h��(#,�e�~Qq�2��������X����"#��"�Z��*<6(nBfc��3D0<��-b��0����L�i�]78�oGs�;��$A��ui��zh~���f�vA^m�b3B31��Ӊ��p����2�0GSm~4�+���h
���v_"@�)��x���As���NJo��ß�7"sK�����;uxEh�T�ʽ	��������5�,���V)L�56��u~�]=%���.$MZS�3� ��p�M�R�/��Ep+f�ʂ�$?vc�u��9�����d%Z����ɒO��h:e����-F���yr�dn�J��y̓�o��$�>~�d�S�ՂPҾx,��H�h`p�A�ݣi�x.�������~�ey��w��y�%���BĜ���2�g4b~��R��2�6e�BJ,��؂�����zt!����zU���.{47��Ob���S�*�6^����,ÿu�1��;��D�4ƺ��@J�:������>�W��0�T��}&��j���+���/R`�h=�<2�g�e��-6gf��g��>'T�,�“y��2W���FFT���F�b�A��]�>�ըX/spB��"���=l�
tC��v�����Z�;;�eI�	�
ƥX�=ܳ�,�>>�PJ�q�8U���pZ&�f��
����W�o�8��<X���� �����1.ߝ��;KRĆ3]�SEu��k]L�x/�F�!>5�g!����r�l�:�Veg���iG��S��CnuR@����#�/�z��*�&{Q� �#nyQ��y�sf ��"VS4��(�Fʻ������Wi!�
�*�^k,���$�t�G�msҝ��dC��f7qY�ؚ����r���bF�5?b>��`��mcާ
��	���~��H
Yu��t�N��Q��T�~��
V%��_e�:�u�(?��]:�e^�{(�p�]RKA�b���^�ұŲkzBb�f��ⶱ/�!="�^�u6��
V�2���Tނ޾�B,��]>��ظw�x�Gr��AASVJo\o��;�.�(J�a���s{g]�y����(���t��v��c�.�/2ǫȅu�'��ˍ`f���Wn�?���Zi���\IB�yh��!u���|J��M��bSnW�Q"8`L8���w�W��8x�<+PmB��B]m�p��aڪb�:����i�k\����+�m��CB�,�z⭛��F�d�0@BKy&���K��>B�u4ui���2uE�6�j}�R���}�<8�P5�T���1�����i{?��J6C���XN�zx/Ŷ��
Q�9�8������AFˮ��N����su���b�8G�vu���Ҭj�T�j1+�|)��oV9F�w*��z��20�ڴ'�؂�j��c���#���G$�\qj��FL{�FuF��,淠�*�+�_�/@/�!)M8X����ޅ5�t}�ݧt8/������	zpv�w�����L-������3���a�}�����؝�8�<0�=o (Y'ႁ"U�gxs�ݔ���cgzC�c����#��-�
��j�_�)VWE(>��(Z��<1��'���2����l�� �Ts�����al��P�
"�Mf�^�`��&ˡV�L����؜�/��ʣ�Dh�_��|������ehP������\	fr�W�7F�f�3C��g2�]�:?Bf��8^�H�ޠU\��xM�R�^0w���ޒlC�ٶ]i6�Th���k�K@ǎ�̀2�Gq����ё�ã�߇L�Л��ȈV�>�R���{�x����a�}FGb���~#�~k�E� &�����b|�"�mb>�7��
w<z�nl����	9���_��$�1�m'�Z�>��7�nD�0�W�"�ǂة���A �������~�f���=�3� d���+�E��CW��]����ex���RZ�6�(*],��Q���GY�w��%��*;�Ԕ*���ɞ'pQ?�Jo\���x��֋p1�:�4Zd�Ҟ�%��#�=C��n;��r�x��Z����O8C�I��R����R��@
!VC^��>�%�u�
��9��i��۸����x.��g!e�ΗĄ(
�m�oG-���k�w�������RT�3CP�+�<�®5�m{:��{�Ǝ˕T�Ah��[�ρa�a�N�\I�PF�~	$�)]d�TD�
B\���B��*
� �<��w�˞7+
��u9���ɶ���YZ�Q�hٯmse5����6#��t�(�1�+�e��o��L#���+��u���ifG6�����xp����"b�)L:�t�qP��/c�V�N��3{����Q�*��QQ���s�	�X�	b��*�݈|�����*��d��f��l�|I�_6,3�;ȳ�('6��l$�����L/��@<r��8�%�?�rj�)�˿=�钨Gn}�%
N���V�wV�i�g{�'�S�)�ږ�T��/�P�|�jr>U, �q���·�p��B��5�Op����u����x�m]e;ufD�x1�,��A�D�s��5-S������N��>���=B��h?��>�~��A�~�߂B��R}2^>���XY���s��1	�3���c���
C�'��*>�#AܫZ/O.i��M�h�4<�o����ḱ��0��H��ђy
�1�:��6Q���`�b�0sTŪA�ƮZtb�=$��0�kn�4N��YV�۶;r���in`�
B�[	��&}�]-hn
x@}5#o�f2D���p�r���[�/X��n�SC��) ���ѯ�bCLߥ��Z�{��߸?����v2�ܚ���mO�L�'�#���`#u�"1奖�x���H�/���)��?H���A�n��P�Q³S��&A�퀐o?C7c
��l����[&����dDGC���y&�uĪ��z�7گY��W2g���r>�?c_L(��Ƃ1�[�M�e/�EoN�!<U�S�A�.!:�˵�'���NxM�d[��±( r>)E�#�$U��O٦T���eN8�`�l�" َ�xS��K�[��0Jlaƃ��Y~37���	ć�D�N#�Z�����Pv�����W�SQ�/����IG��r��X�Z�)q�������WT����p4R3v�;��QcgJ�:���=��	�B�+�v�\��e�����d�y�}(�Ю#�&~VE�e��w)ݚ/���	[���
Y��r��+ς�$}w8~��Xʈ�\KK �
5��Gx52��Jދ�#���@�Ƌ�#>TQ�^�Ҍb�d�Qx��f&�W���=�-h� ��ߌ�1Hyꗽc�3��"���x��+HE-�����ʣ�������o
���?v�M�,�>�D���
�J�^��ͧ6Ǧ��ۮT T��a�{h�C���lg��zl�]oY��~^j
���y�[�����E�,ջO�n�S�a�N^�w��JI�fzU���IV;��7�u���5<��l�Wd�U�'�{n9�j���M�}8��������]��(=S��3V�7.����Ȫ��qu��iوZ�\�-�-).�-��z��ܹE5�Zv�ќ��U�pihӸ�n�Zsә�˓笋�����?}�A%B�Q�^6gl�r�.��D�r�A}�OQm�a�<��S�u�W�!Ϊ\s}���[_EǙ�i��4'9
�M���MS���^��
C���M�?d�i|���!�Bm�W�Ѭ�H�(ԭ>��x�����f��A����Zq�QYB$m�2�Y�`'\�g�bB�n�bV��/��n3#3O���P��׭]�|�rDv8ۺ����{.�!F ������J=}��B35��Η���{���f;���E�Sy�`�?{ET�a���MN�d�:��:uf�$�+z��L��j���z�`��p�m}MNJg7T(S�v()^�Ϥ�#��jQ=8�G�4�e�'��@��,WńN�vl�]�5q�u:6=�cJKP�YuY1.��^gL�?���n"G���T�TXP?�<k�IW�MQq8>��kwsq֛Z�cc-����ɦ&w9	x�c��V�MX���\&(�|~���#�(���I�Q0�(�|������J�����b0�[��1rh���Б�Naukk-�L�
�J��[�������<��*�&T��z����z��f��U��1���)�%������,tb$��a09U'"����
�5��o�|5�d�����l��?��R�fQ㞟4(�
�]
|�Oc���ԍ�+c�����D����.I"zQ$��:������6�W��S�Ƽ�N�
5=;�
3tD?� ��48�jm���R�gn���?���jQ��H2����A��z���yfP�I�h��bMZz��1��@����w�F=�1���R
���_��D�>Ѽݜ	Ox�҃u�}"V�Be6�W��蝩Z��f�w���A�6w��	j3"eOj'�SҤ�ܧ��b����b�C������vQ���
ZO�ny�SΡ�d������a�7���4�I{)���!�����e����2�U�#��T>�Bf�E�Z�[�]�j���Y\����H��C��X7��q�����@I��s�/���mw�0#ދ��!�U��'l`�	�F�n����%(���J��K��,^ǖ�ֈ
�J]�F;t���`�����-F���Sr?u�����+n�*F��z�0�O;����~�
�U~\Q������]V-��~�;/x!��e!�63�*�.@�#hˈ�̦�r=��a3ZLx
G��}?P�
Oc�z#
��>\C�5�k|�jŧ5�E~�o0i~�T�RkҌ��]����AdV��-��F�?�(����JP�*G��:�}:�DI�isZ�ЮI8?�წ�#-�^,�Y"�;i�M���,�2��M�>��c^/��~��b��_����K@�_��PD�d9p�X?�}gc&^�ݪW~H��dFk������2�1�I�*��>9�8�����/�"�!	S�E����!�&��<��ZLG�?��5�
�a;m��'��X�x�{�|�n�y�D��*~�
]Sm��s!�q]�PgYWn6��������9��'m�|�J�`cz����U��o�03'��:Z���ۢКR4��W�%'�k�
��6�I�C�խrg)��<3Y�ܼ�,w��h��Jr��N@��������5p5���4\��^��t(B�f,3�6\t�ڨ�{a��Z�a���-�7J���������N5�M�Lp~�[�ʋ���K�N�CX�"�"�^N/^���.y�u����nJ	��+0��B8��m<�ϲ�␆���3��X�cN�=%�����y�lz`��C���>��צ�b�pg?6`�y�Ҵ��b��L �ɮ����}�䵂P�L���e�V������l�a����0B7�Х=�8�>-w�ģw��Q��k�g�k�q)Ǟ��Ķ�'�6qyB2�6$g��~��H�I>�>���"�ǫ�-LZO2�����|�a�Xx��|���Sm�v�|�W�1ć&:�1�+$�$+|&:��3E��g9�1�c�H�?|+�����\���-�[�9���W��ś�L�nz�n'�-���\���γ�&$c�Dp�T^,�/J3Da�ȿC��5�_�̶h��T�p�"3�nJ7�ŋh����ޥ���F�{w�=|�cT<�ύ���n'|N�h|+!9��3'ɪ��L`�*K�Of�	��Tkx��!�� 3����]�m�Y��#+�K�8��{���y���T"�H�ml�a-tFC1�ĺ!�f��~�B'�N��LM>9���m�(XU�a7�47R���0����6���G��? ��DX@�#X��x�I�X�h��`�b�����]w�sG!��$�9
JQ;�NgTIes=x
��'-�Nzg>k���C����K��l�BbT0�?©�����?��]6�W�G��9��8��i���8�|�,
��$Ӽ[^G�71x`����G��N�[e���Y�HǞ�'�B����]�ё!�8�A^䒶S��[ȁ�
�����0Y	��^U��jl�z�^��-"ʝ�7�:�Acv�v�,{Q�'gL��ENĿt�qW9�D)� ��&F�`<�J6��Xsv�6əy�/�	����=�1W5����c�I�Y��H�
(�nh u
�	>]�_(4��+��6��3%��*�HKk*�0������|P�d;�"�g�5U�)Ud���:�&�2�$3L���[��+?�\���)/dΤL����n耬���\ X@q��\��Tbo�pn��#E��UP_�X�l���ZJIB5���!d���jl͚�\��[�;����Z®
nPt_���� �*kp��ū�Q�
�
�DB�Ǝ%P=$��̿�S�ᣬ�?�x�?HID���<�v��d��W�`��,I��_�J�c���!_d�_`"W�1Z"P�b�?���.+$�it"�Bq	RٌbK��*�Pu���O�=����bB�
E��*�R���_w�G��CC���c�X�,n���b���RcJ;���nfv��V	�S�3��<�
1���S+�Z��b$����1M�ͅ6��=diQ�-�_�e���":]��~7�O[2��=����q�E2��<S�'�����
\ЊdS;�)S�uh
_EM�(ݤBc�_]���^����T�3ڥ.x�c6p��ϐ^咟y�(ܶ/�pU�l(ϿN�v�����R�f1���~Pp�5h.�8/QT�<�o����Ю��Hz���7׋�#�sP멖.��p�aP�q�q�V��^l�L�qvf�ɷ"�ΑQdKٝ��tGY/Fy��v��xbK�|��Éٞ�;���
�VA�B�%=�ގq
��(���HS���S�zW�@$��M?�Vg���ǻ��y�PYCݗd[,ϗc��,�%��u�����ŌeZsʦ�o��T����rb ��'".k�j�ރЖ*<n_;y��jQ%���[h+9�װ��I�$*�Q=�<{�����O$�q�i�6.g�������EN6��8Sn�����e���)�-a�:k�d�و4t���dS�������#..��X{���C�����!��ݟ���yym����b����\�:\��'�7�Nd�� �l{1Xk��~Y�Ə"�[���G�W�i�v&��۹�x�����VÛt��6N�M���KI��Kh��ZM��Pq����w�aM�TR��4��1�m3�
�kSL<-�G:|�b�h���ʖr����$�}a����$o��/��;�ֈ(�;��?Ϋ�o��NF����D�WFs�t�D�Hȃ���uy�8	q
QŊ�"���lR��x�����w�Y�U��u|
�A�s
��N�56�6�:׼5�X��r��L�+ɫ7=�I��|O�6l�9�u�h|�+_�ga��%�޽���{�Wh�o���0GH��I�`;#ܝY$����-�u_���N�����`uH���!gL���7H��ׅ�l*�z��#�8%.��/�[-;�B���m�ǂ��\�9[��l��o�C��?r}nk��G��Y����JC|�-�\�X
P�yN[�9�U���qj�?�T��y���Y��[��q�K-�H�qo�T���Muk�ᅦr�[�cx��&.��H�i؏J&�%��ʬ�*���S�A5�<k��]���S��`
�a�
� ��Y]��|.��ׄ��W���fÑ������N�����a�םaWڝ2�뽘ȽŌk�e�h��	������ꝅ�ڻw�q���J���-��j�3��Moi�:;�F��/�i���SW$#�t:��S��8�&�8D�94�r��ͮ�6w&����,��~p��ho���}2��(�2�R�g�iN?�$P�x��_��_]��c��`�� ������id!�3G={�K��t�J_�^m�w09|�d��_�ͬ��4�N��ߦ�7=T��`��X��*߼��]�E�3W�{-���_�ƥ8a��q߇KS�N,�+	H�Z��-..�ޜ)d;D��yS���]�’���b�o��y�s��4\����r���=����J`���1���Nf@|/�cQ��'ɢo2$D�|�n��_Hp�f�U)�PiBk/��o�
��Ӄ��=�n1%�����M�]��1�8�-�T����J��k̤��[���c�U��e��ڍ
� ���������y!/#9Q{��hֿwI&�����ݗ)��{�m�PK^A����V�J0����'+T�f|$�>N"��d�K��X��D젫��zE�
���7�j�n�Ҩ�;��۫�,\g����[�F����n�d�6���g	�$p��ɀ�d�1f��ͷ�2�Dz�a/�y��'ߢ*�b0P�8�P+*t=e��T�Gћ��E\[<=ܦ���KO�I�9�b�K#Ȳ�f�"(���Y���C�l�|��c��qZgu���X{��jʃV�Oz(oQ��f(�Qed�t��!;�R�1�XT�;z�=|A	׬�������j�)!����5��z������m0Lox�  ����k��[��ӓr!�.���ډ�M!v0�Y�Yd�Ch�Ӫ��kz�̞���zc	d�h	M�h������p��q	�a�*�T�/�Kr�~�2=�|x�C�x�a��კ	�L��Z�1}V1�"��t��{���������q�K�Z+����\�V�T�-}5�O0^/�~|e���ϔT??$�s�v�ȫe��\�}[��L��6��u������.�'���\ʉ|�$I;Z���isjZs8�tO�)1���$S���
�S���K�zt�J
~+g2�#q�-ۉn�e@m;4-���}7]cpnZA���4�*ap['��.�Nj�ύ΅�t���h{<�
�mbW��[w��.����n��>�����T�ܹ{�S�L��Ug�{Q���ÒR`�~�A%t�Q7o�A�C��!R5��y0����F������m�d\qs�7���n]`����{�e��y�%��ʤTR�22Ƈ;-4�� ?
���]j�J>V�r9P��q�� �h�7m���h�&U/(�����n����>�f���EGH�A�(b(��� ���)������C;}��C8�7��1��	�PeK�,��[����˻y]�K�;06hR���
�VN>����,D��VNr?�Dű�RE%#�\��,�R�M�5�>�����u
�V�}X���-�2��߃,)�<r�3�9�ge,�=DPnʽ��q��:���,���1��Q1�=����I"b-�g�S�� �%�y�kĦ���;A���M"��B4�����7������u�I�ZA�<��x��E��E�f��M���u7��2&
�ySb,3�cH�{X1����)��6�˫��0]�v#>�7R�'ر䧯+L�Fq�5�٫�w"6����T�H����R�g���Pܪ����򍢌O�F�G�/��Ă^a&<�d�u�rkq������=�q��P!|�+��}��f���F�rJ�/,
B���M�9�[;~�w����(
����uN��7xH�o	W���
T��dH�EM��H�֦� %3� ���:��$��:`g�,�l؎?����¨�c�ƊBѡ�k'�S�a"u��+~�Hь�����һ��l$
�9A�i�x��J�����xT�I#�ƞ��e�)�)�f��ݲ��S	��+����Q�$�o*�S�{�8���{C�3kt-����)W�$0��2����ԫH�㍮���:��ԕ��S�%Q��E�~���L�R&a{��l�:]'b�8$��Œ2�t���lڧɼ�V,���?'�J_���>�G���Tk�;G�!� �xl��qm���՟�Vf��V��ݲ��}Vf�+�z����6cҏ����xyz�Hlڸ�$��945i�;Q�<:-�BG�h	�zcY	�w0�e���'�](\�
;cn
��#�_�l�c֡-x��{(OM4�c�g�u�^��;�S/M|w"Ŀ�v2�6��2�o��}tmU����
�U(80=�f����c�$zs�6���T�34��X��<�_�3"?�(|T��zĉ�v�;����i�B�Y<v��R۔µu������/������T���S��AWr�����l���h�gU}��5u�r�Z�5�g�
�f�BavY)��3���s�e�=oiِ���('%%��A0!ƞǮ��^D8�ķ&�B
>��� �U$:��gI�����­4̩�ނ�kx1:��C�h9���t��J+b`ؗ���H���Uk���G�'}�h�g��-O��.
��ei�[ڒv�M�9à"��	Z^(�l쉶G����=�f����
�
�V5-��
`nB�}�G���v�AOB1E`����gJw|Op��W;?ZBU�-su���{����[Z��'`eS�8��ڿ�[j�ڰ�5��f�������`�C�3�	\B4�-���1Ԉ*�}�����C�/H-���ă�~����_e�Ad�l��!���L�&d7�&ֽ�Ou����٩a���q�c4������5O��D�3��Z�������"���b+�����ۈ��X�+s���gA9�n@��}ӫ����#�Y!w_�{�B�.�xmO��k�褃	�ݴ��
c|�=�2��U�N.����1ueh9����$de8
�oJ�c�ɽ�G���
�$n���Wܸ��F�9�F�n���x�݁�x.�V��M=���&~�ȀQ��~�3ө!�R�Dy�~������y/B]ETEq�k� ��dI�{Ax�㔝��3����E�m���IɋVX���%�_���&�UnNJ�+X��h5i;��m���e����ia�@�?�Q�Zf¯o�W?b�-��\��c�Q�2��A!&��h;�S:n�;�?LqI_��Q�1�$��r%xf9wQI�״�����f�8����EP��sG!r�&Oo�����>��4���.�Z���NF[_�Khj����]�,����D5�m�5pE�/�\�m�ԸLK����l��5YF�jBsئ�n� �����h�j툐����pn4���_µMt/I���<���_��fY�-����·���3�cL���-��6$iG�6�i�f�T�su�g\Kx?��!���aف��:/������P��$I���ļ�^|�!gi�	�}�k?V�ؑM�����K��4��
sǥ�e �q�mu�'[�Ȩ�C��k���Y�Jw��ˡ=�}��Ē=qͤ3�1�9|��;5�/�u��f�/fK�|�:��J<��#�L�Bjc���C#���".�[��)&�:A.P���_eB6��"��sA�SĘO�T��K�i���Wa�RJ��3�52$�������\\9�b�k�y�%��{5`]ڒ�^6��Y
��n�B�������2´�*���A�G���L�!\�Jr�1IXS�lXd+�3k ��C9�~��s*����꧊Eu���b�8�u(��B��cD��ca0���a/�N�N��F;B��Y�k�2P���P����H)~Y���>^ή�q�K�p[����Ў���@�=�	�m�8�1�,��"��U��.�RY~ عvz�x��$��gy��I�-1_c����͡��'�gV�%�q�53�M
�)��x(�C�*w����;$9����
��R��5t8���^��Gԉ�E�_��%<������sK��aJ�����J���OyB#2��!u%І�{T!b�@!��]��j�m	�~���M+�Z�Z8xE��L���DhO��'A�0��)��!�s��͙���C[U8�q��Vcx]��?�7>($�$>j�h��$!�Bm�4��aJB7S��L����Bn �c��J�vZ��a]��y(
�ߙ��w��.H����'0�͜�14a.��d�|@��Z�9̠�'��#��	��F�#�Wo�[�!2�+�c�Q�C�D���kj��"�!�{Q�����d%���A�F�'Hx�
v+�a��ʰ���2+7�swi.c����D�i�ܒQ��t^HO	@�9
�|�KO�U��!��s
��xr`�I;*��P`��'�� I�L�ds!�ž v�N���
��4��Ч|�ICx�x��A�bJ���a���b
����ܳ`��CW�1��\�a ӕǖg,=�M_١{W�)��)|0�V�,���40�n�D��M!�N����1;�n�D��Θ�sf���
H6p�RZ�C7�ڨ���,J�t1���&?F؄Zu���2Շ�K���k]��jJ-��vg�\p4�aV�#��/�Z*��f7�t�3[�M~_�q�A}�޻Q�sƧ�ڙ/�#�Z.�#C�뒖�8���o�_g�������ya���3���������F,̓�rU40ˇô�E�
b�5M��mL�@JBMVVA)T���1a�U+'z~�P�\7eG��>��t!�
�:\���K8t\�J��Q(=>Vo'��dvx(��l����fCQ�����9s����k�>*[���}��tܙ��Il1>��Ԏ"[Ġ�j{�C"���0\Ipf�@�v2B���9 ���,��S1�6�{�nLZ��mE��X�m�&�	R{�A��GD��G�	�c��b��6�6�U�J�cX
��hqۇ�ʟ;��p�}u:�1t�Z��O-Z��t�=7^�7(�֭��3��+�;���`�~�����J�+��Y�p�ӹPS�"�]���x�Z=K[�x3��(�f)�כ��yϋ ��jl�xtRk�����\�m�f_|Qr=�6a�� �8a�H�@���z�Vt��L
D@v;|C��9���@���U����m�j���S�K��e���j��mJ�ư�)�[MМ�B�y�*�J,t��\��4wr]�8���eZ�d���2FB����/\��v��I�l�(.�/�#���8\&lA�k��J/���X�R+�F�u��F�5�!�_��.ޏ8�
9���䕠[�W�=��BĿ�P��dny��ǘ<���9��|��HMɸ���T�J����Q�7�_>GO�q����C���!\4�T&r5@"�+����Yr��ͧ�Z��bM���q�[�W�t�MjF�~�O-ԁ�/`#.G:�٦��Y?]����]�m���I���B�:�\�C:1,pnV^/�`<'�l�=2���m�F��ڻ��m�+���o�0�i�oN�K��������#ƒ�6
UB��urP��VN���k�Ϩ��)C;;F�}��bs��\��`���þ�#�b�5��b���W�����������7��������wX["�O:��W㌃NY��u�
�����{xDn��vo���&Օ���3�3�Hٍ��xsF���
5�k@�ܟ���Y��d{����ؿ����X���Hv�30����5!x�K�(�;�֞7�)���+۱J��8�+?G��y�p~�x�m���'�Zx0�������*ȥ�z�x>V�����I~PX�O�OkBhh�J�$���-[\���(7	U��)�!Pƍ�/Ϥ��O>{Drb��|��||
tE
wL#���C���@���H�w��)�]�E�i&BS��^,Ze.�KAC�~��5u�GWFœ�ef{���Sk�ɜ۽�g��c�VP����$�(��>y�x�!��vSΡx���s۰hiH�>�r؇Ĝ����h9��'��>x�\->j[��
lf�*��8U.@���� ���ʔ����ĊCa��~�p�=º&b$�5,�%���qʾߴ�xg�]�{;nZU(��8�X�m�#�:
h�{E�����H?� <�m�/5�(�[��H�A@��U=�;M��n�+�6�VE �`7�~�I��.s���>��G����c�ҖB���,U���=g�y4�on�s����8`�Y"s�Qe� ���j{ �`���2j��ؒ�̥rZ����\����`_p�e���W��E�Gr@��ޑ�d
��^��\	����y[�Q2��!��Jj���׺H�I[��QOx���r9�߽& ӱ+�sq��7=���Wb�ۂ��\n�1caz�H�"���R�B�0����F(J���,�}�C�kq��q�,�Uk�+k6\tm�"��\r��۷,��8��=:������q����aG��D�`���������di	Gl�
i8�0��GN����
�R1���ʇ���h�����&
���.���I�c>,�2Ʀ��'�D�>p	�.�CY��h����'1)~�7�|	|�uu��ώ7^'��X�\��Xli�ٴ%\����v�;��`ǎ�/�uV.Ÿn� �3�+�8��F4P6*��͎Я��
����|䗴�7�y��[_������V,��
�D=�W�f�d�%��-i�S��$�Y)CpC���΁�ɝm�:����t�IH>�N-<�j��8a��Q=���ɉ��+�rf�K?bj,�Jҟ�'��i�Ε"�*�a  ;X=�	e��`S�3i0�����k}��,��@wb��B�%2�o�&�v�7��� ��7C>�J��(jZل�h4*N7�B}7>K���]��U�F���/K�(�!�&�.u�1u�aShCq>蝧�����
�%��us�ZŜ9����c��>�c�%n@LA?�X>QPjk�Y��%�b�Å�ێ�>N�7\�	\uv9�K��s�8Qѻ���AH�x��Ptx���/(�`f�+2�<�K��\5��ZS��Z�{[�;��S�DȢ<�h2�
���٘�;�ך_}e�3�1!���-�y�>�Ҝ�B3?�<�>̛JS���阄z*"�#;�t���)�ws������Ӽ��9d�r������m C���1�잎:��{m�=�/�z΄�$���
�Ƴ|���ӭH��I��Z2��e�jlg����
I�2���s��Z_|��	Z�2��&�4��e�A�H92�h�|I�����JT����^�@�SH��k�8JQ��H����n�gdz�d R_��9�Dm��EE�m���t͂MR�2�ʴf���oi�U.�JQ�lHW� zd���+e�j
ZV����n��j_��6)TB����,U�5�8iu��<j�
ž��n�(b0�m�ڇ4{S�,��^�j	����Cj���4�c	�I��C��� ��N��v�
��ЁXx�:Î�
mw�M�=rŢbl+�V/7K�9\X�P�H��bΔ��_aY!F��+�|��,�$.A�z�7�V�j2R�+h(e��5O�AP�#����ʍS�4��rB���C��>��W_�Cl�Rd�t�Y���uw�n�[��vom Ea�+M��i�'��L��W�X/�	�
��0�6@K��@nS�h`X8�;��R3qi�F�鸮%�-�e%����� rK���mn�֙c�.�y�t-+9��n��d�B��EZy5e+��HK������6>�j��X����V$���&j�'醇��wU�	�j�\�"��G�G���Ʊ�C)2�a7�6c|&q�ob���Aw:�m���p�40�&����ۉ�������{��b�8� t�%�2;b�yZ&����l
�{��| �\�z(۬�js�f�_��z�'��z�9l���y�թ���)�7y:cX�.�d�ނ
��w�p����j��	|ab���b���炄��g�d�~5��#�H�le��m�t�<^�s@���5�cyވ�g�V�!5��,(�O��S`�.7��1$�����n*�;
�!,����M�+�3c�ޑc��TGe}������ҫ㤌�Q|�ّ�х��ޥ�<*�Ak-t� �cq:>:�CI9-�*W��l-Z6"��֞PX8eߑ��%��bk�4)��+�y�BCЂ�/'>)-(���?^��
���X"N�����酅FQf�Ls�+ڱ�%&[�'ʤ��e�n���K՟"�RX���î�r�g]+��sx����O����(<Q�^Xj�T)Y���c�(�� ���(��l���}�qm�bJ���Q_�P�z)l�X���w���S��ԟ���*�q��Q��+Z>z?��� ;�
yU�
��UAr@hI݁���:A�C������1���.�Z�b��h�;�O�>/XpMlT��zpL�,�2)\�P�A��c!Kا;ɺ�	�;�t1>:=D�I&ع�Y[�:��(�2
��BT �~�����,�V��2��
(��l^׸�@�3���EX��hp����-�$���/�g}�ټt4�E7��ƹ��m�66B����F���q���8BQ�|�Fg
d
�ؚ�a�p6��]�bF#z^�<f
�:���ݶ3n���\��뭜θ�?4��V��b8T���_���}�JCi�5�x{z���	sh*�}�_���r��|m��
�H&�����0���'���
@T����>\"9����BgZ�4t-@��v�*�*� ,5�&����uP�9%sq"�*�2�2\p�N��c����
�$���
��7�~��0���5'���m�*V_���TU���h?2�z�I�"%��2����8���=��3-�
H�O �/�����
��g7�P�$?�؞����,�w*�o��T��l�=bx��!�c\3q<�ܻޞ����ld�m��08�--���<�_Dr~��2j6Ąu���l��:�ͣ@����,/@Z��&Q�
�r�����CE��N+��s�f�9��~Q��`���Q���&��.�Š��x�Oޖ������~���S$@6�.�e��މ˜|�e�����`"�%�H��%�l�/dȍ�P��ı�9+��� ��I~�5UE�
�FXX�y���!�I����I6
D��c���yp��{����t&�PHr(F�Q|�L0ZvXM<�h��l�[��^�d���1�ƽk_Xׁ�c�=
V��a�k���Iu��x��G9y��w�Y� Ӌ@!��s�n/����@������LJ��4���a�����d6��l�.����>����j�
o�{_�����C�mۉ��`�=�^�����r��¯D^�v�ϔq�ݳ0�/�T��13�L�>d+�~�R���^�r��4�<yh�∂��)�ٞBRl�Zx�:*�������O���*���ؐ�<���ә���^�X.8R���s����LTmTd�-�F�Y#~&��r�,�0:nN//��u)��U��:�e����T�����\�J����
��J��_!z�1��mY3?��P�:(������M��zp��9�"0��a�ܕ�H2�.�ѐ�̀�BT����?��Bk��6n�`
!-✩U��q���6j�2~�p^�I5^��qn���7���`�fx��`�D�r��֤��Sqx����]%o�\T�B�2�U!�T�}b��X6n�ms�
�ƒ�^&�H��v��B�j����Q�L�w�Ee�e�b���^P6��*˰�L~h�-��" �_��R�!��c�Ɍe'�A�W
{`BIH�'��ď����g��=d�?U���o�+��C�:�1��g�.'�1؍:]t��K�جf�{⛊//% ,��˯���\�lHN3�rOv�z�|��F����o��V���xU�f�`�2Ja|��e����Z{^�†G7b�'�qk���r􂩭�Wajh�!x�ڵp)�ݫpY�8�%�%Յ�y�I;|��	H-��}�Rt�3���9S�*��s�qa1Z�����ְϋ��T��Q_����(����=��� %���-�H����_�v\U�o��s��k��^����Z�S+�e���g'��rjL3��	�v���ڇ���d��W4gɽc��Y
֋��
5��ߖ�-�d�l=L^D��J>b*��8���LD�?aa��2M�q]��I�NU�r')��Ă�ת�J���^�5eK�Tvl�cT�M�4w�r��{���.��1�An�������V>b��T��rWZ-�|�ۦ�[���ڦK�T����/�0�e�7IW��(�u����"��/��h�̎!����t/��=o�KL�*sW��C+&
�a1ܮ�-r�8�d������V}���*7��9„T�0gO%���4t1���E%gfriL3����By
؅>�+副�j�9'��+��*�E_�a��-�Y�GT��+6��0a�1*_�3
�zJ/Fcm�ra�:�.��˓�~��||��
��,I�9Î������1���Xq\��+�8Y�l�cdj.���sZ��5���P��}�n�{���k��E����E�H�`�6�9{�cGM�w"�`�5�{Aeؽ�?>���̅�7�n;���w�6~˨� .���_u\CUӨP-#���VV��8�?���=`ɨ̣����#��zAm�6/j��{�Ǿ��]��tu)W�_�Kt^��6J�%��r��he�X�R���Wv��3���.��;�=ta[t�r�w���N���-��K���$}r����o��9�,G���>����R���n!�R���E9����3n#����,�W�.ft�I{́�ET���ᛋ--o�8g.o�xX��цNfyP'�"5�>ݳ V.����nP�M�DI�؅���ْ���OJ�3�6"[�q}��a���쇆�Vwng�:�wڜ�X��M*�W4!=%�,_��<[��*�W��W�w���5^��@-me�4�8��s��|t��2)���A�7
����7
�3�Q/*b��̇f�,?o`���_q�J?=�"�^(5���XL]��U�W�����^�ل��8��ɢ��'��FH'�"�mοl8o1F�/X�YB[G�ǘ���zU8�dS��6^&pצ���
�W�"E=��Z)�Ǡ��Jj����&S�8�<uB5�;.,���17e��O�(��k҂��o$c:ŷ����F�	08��kY�"L'�s���E
�`�.�@*G�;� �}n�a�w��Z tj�!�w�"�:FQ#,ll!���xT4�QW�H7s��1�`�Q��ܴi�w��ű���<Ǻ�,-wo��Zp5	�kJ��k�x&�=��:��aYEEy��z���e<]3�����y<dbb�I�/�L��湚����U�����ή�W�G7�")�7w7���׋�\Pl��}�?A�P��F3�0Iw|c�����.�����\D8���w���ݐ^T\'+�@l�R���
�����>+����B���ߩ��8�ޝ|]��qb�6J����;���t[3�գ{O�m�;���R�(˜�Ee�2sX�!}� �C��y������Z0�6ЧuM:����ʪ+~�M�mc\6�w�CVʅ'�va踨gF������PB1��k�y�ȧT���"uS�}̬��$�隂>B�^Dk��t+D��O�Ϥ!�Ҳv��@��)$d�����w��2)�j+����q�a�X6�3�V8�7pv�$�y/��iH1h���1M�
�J���5{Y$<�K6`圡M�uZ��NJs��Ҵ�Q��u*�`5N���մY�\��ͬ�-^n�m��Q�7N�Z�?r�]���Ȓs3��+��bH튚����I7�G+�Q�����ѮU������ң�p�$J�ؓ�=����(�~�8	w2�"5������͘,�����c��r>�淗J�O�#�ό-X�Є/Viԧ���ញAa��T��f7sQ�R����*8�8>�iـ�y��/I��c�G�Yb�ln�8zF(ϔj����"�X��A�ޱB�C�ބ��C
|�
 ��X��U&�s;��7���4��Z�-�3��'��ӈF��Rܢ�΀ ۿ*zi�a�za����]�׏��bũb���^{1˼�xW�n�j�	Q�TE*qg#�Iڳ� �����線��3|��*��D��j&.�X�ؔ\��
+�S�K�,��e��&T�o2m)&7`���q�^
�5gY�.�c�i,X��c�Z�h���q�<mZƓ<��U�T�h�	�0b>FS��@���º8*8�b1�H�I 
7��
^�v�}@�鉷k(Q���9���]y��]�F����3�e�Z�*��gn�¿�=�������Я�I�T+���M��SW�CkC�swr��l������ˏ�ֱ#�T���C��{������>ЫV0��W������Ì��/>s��ک����2�6�|;�wd,rY�ܵ����WW\�.�+Sy�Ñ�̟u�-����f�]���2u��
����SE#�l�d�1Ϡv"����}{�D�Ac�]�s�\mz�H��*��7~�?��[�.��0�Q��ӹ��c3U�[��[(��O�g�r�8�s�Q|��@��43���43#�Y-m��0��-��=O�N<��)b��'���w�e/�m�gҨ-V�/���h�=���<o?pk�LezE�]y鎞�Y5?�la�q2���	3"w���G�m�cY��tq0�$���r*#�C�W@�	��ae���,���~Ѳ5�/,�i�������7ድG>L��%�����qFd>�n��b�bP�_��'�ƞ�%i��Ԯn�wDYۧ�mu���_3�K�n+~��va�&^�m���5l =�NЪ|���:�|�
�u�5�3�A�%�@���k���K����2~�O>R��mwB��p@"������Ħ�Il�B��=�^dODYP+��G��@�)U�ߡ�8����†�VD�g��Bu��lV��ƿU}��@(~ԸU��J��T�g�ɝ���%b�+��`*:����~3�W��B�p��5g��H�Ȓ.X25�;�����+��b�l�9fl�b�~�5��[��%ݚ�6br�,����5�L�3��ҴŒ&�a��	��mlT��/=a���
��_&y>"E{��A�J.Z����'
�� �7������,=��߉$'��%�+�3��3"��N�q�lΈ�����M�mJMt���� ::�諜]m����k�?n�;� �&����es7�bA:W,�5V�6$X�bz&.m�و�cy!�e}k_��X��n���h
%t�[�L�ق�MX�4�-���"��;0���W
�qҋG�ԝ�Ϭ��+3�T�*��)�괧�L$��U$�,`��cs����C��3���O�*�'.�Of;>ӆp��<�j�t1?3��P�q�]���{��[m�a��ڝ�b���I����pI�y�����c��������SwJ���!Sp��0r�>b���w�a��W��Sf����|@cF�Q�D�`�V�,M�%���P�#oN:�^��i�K�XV.�^���f֋��k<�6�����+����o2Z��Ue���@�1�CjG|��%�;D9K9��1��"��()G�'���m�c�C�e{M�V&��^fn�Mܶ��X��;��)/!K��g��5����4po	|b�d��H�D��O
ֿ �?`Y��;2E���/7��m�rc�?o�<���q��C�~.�t���K�C��t��
4���v`>�f�
I
N�V`�z=��h
�����}��J���M��0��yJO��	u0�d&R�#MP\��P�Mh�N�Q������N��{�z6qVȰ�'����G�����5�y����:y36��I��I+ʑ�2�Xp�&�ɔ���.�q~�zr�4)f���ڙmU�������a �NL��4d8����q0lEڝ�>��6f�����> :/T���io~��E	�;e�Y���d��Ʌ��-&$f�k<M��ƥ��j�ǫ\&�ܩ<E�v�	�+�h�oV[tw�f֭ȑ���teZU��nb!/��Z���(E_��)�~ك�ab���Q���`8�V[�U5+�<�c�
�S�?m�@�l"��^_�_�.Pq�b%���,RΜ����S���G�z7�h�ܳ�Lو��^0ȼz�s�����峵�wĖz�G��k�Dd��Ug!�%@S��K
\���K�L�D��F�U���_Ԋ��X���c��L�?xA�]�Z�r0v��
q&��:��H�R"W>�Wr��71��[ O�V���j��ZɎ�<�9��m��l��,5��Y� )z�1��E�T�3b�;Eu�9�-����xKRoW�
yv�C�/�Fh�>G�7���VMT�G+�����H��
r-+�I�{#�[�E��_�>�g�ߋ7�Wr�+J���4��0���ӽ��;��8�p���2������ޡ�b�Ja���ji����B�?$�(�,oK�WJ��[��^]	�X����oP�^!Q�!�UZ�-@/"՗|�Cq��~�9��99�P�U�56�X�G��بA)+�R��_B��ԑ��[�P��-���!���
���Z&ߢ 3|Q]c�7��e8��Y��J�,����r)_�]�D�'���Ņ�U������*+�
������3�}��ӻ��]Hg�hE���լޛ�޳��sZ�NV���u����Z��-=�0O�gNfe��Ya����KM�Y��4-a�%�B!��y��z}�]�u6�
-U#d_�/���
I��ۆ���&�� ��Ak/=z|,��+?'� J���=+"��T���3�U�Z���>�KN/��u]���/B�E�V�E���ڂY܉n˞��"o�~���[���6���B��KT=�x�t�lr�T(��e�A?<�
�����?�FW�y@~�!��f(�D�g1z�Q�<����o�vfLe��=G�G�ܾ5���F�-������ӆBo����pK4���� Rm'��P��Pice4��Զ<f�B�#p�IK���
��VK������hh����Gj�1n
��ӰqG��O	P4J�Ԧ�q2�Dx^�t2�e�g��(�bC��ތ5hP�/vuU���9:Fx���#
���.E�W,l�&\���hpa��je��g(G*��f
��c��M�B�\�jf/�`z$��b�A1��گ��*<�����_���=���ͨb��p2�rl���Y4NvZ��̮��N47��� "
�q�F��A�6�\[��S������
�),����ז�Q)���7(���id�<G�㭊�k�E%.R�|�������s̘�PQ��ι]�7�ޗ�����?D`sv˝f�io��tM�-&��)SƦmkܞ"�eTX��C:��.؜�
���<�(����<߹�����1�g����2ݴ��d2�ڨ�$QI�%��ϴM9��Y�L�)�7SzTC*���.uGL�<�y�:����]i�_`A�*��P�B0�zR?"�7��׊G��7�{v��N�J�l��~��ؓ
,��5)R����Ń�v�5���qK�G\qM��n�d�c�pw�0�Iuc9�y��Ϲ0`N
��6'\� �]lU��>cD9}qE���E���a�--ި�r͔K�X.�Ս#�IU����`���� ��1'1g~(:p-٧}-"�޽�4�<w=]�ڜm}�2h��%���3�]��a���LǙ�}�c��k�
^K�$y��~5��BWs���)m�)�e��}��s�.�ucm�)��T�����,%s*�;���WA�yf���:3wka�E׺������
8F��Ak��d�'���g�Q��;<��)�P�_Y�U�LY�}`�I}(��"�ߏ�X��lƙ�F|�x�"�-�ӤR	�FKFҞ���v��X�Óը�-*��;��>�?��}j����>W���K4! I���J،�o^�Hk6���E�,t��|��H9�3.�?�7[M�yW�Z�:�[��6������ߗ��&�bG������ߖ�i�[K|kj8�o���8���~L�d��1Rc�e�[�#�a�B��ng;G��<����%�L+�
ۺ=�O�ˠ}r`M�Mp�����p�6��j��HҮ�/�U�m
mm�Y��2^jj9���ު�/vP	
��c�#Nc�H��v82K\�RҠ�tDҡ�D��ڞVX�w�C	P��[ɊNl�n���c�)y3d[2,o�+���lO��
]�����}Җ�!Qq�[
.�N?Y>�=�Ԇ�,�|��˹��Y��Rz)xnrG�z��cG�i�ƽ��#s�P�|���c5T��9���Z��@T��|�Wb�!�0��J��&���( ��F=:���ܚ��)�=�@�N#�'2�L��aZ)w�-ȐǞ�(���YkV���[����h��4dz��(�ƺ���0��~g6@!\N��s<��)�|so�XO,�nkO	��-���'*ssV$��{��Z�pss�[��4s/�p#Dk��ׇs@���bI�叕�:͕�p\�!'og�<�9�$D	��2����MW���*�te�`0�t�1�вl֋�(e�}��$7�d45��V^\=��a�D|fƣ�L;�q�ۇN�,�sH@{��fy��?eݗ�&ϣj�_��^"͐w�޴�j@��[?{����$hsgB��[7�Q@��Vr��w�س�p�'@�~��uG`�;)��jY8�yq�
{֯]��2(��9Cr�Y�Mb�(���r�X8Y��!��r5�_�ŷMԽ/��p_mkB,�!�ӆ�Q�Q�9C?�C�(��ͫ��'�dExSеDd���L�(?�D�k=�x������L1P\Ϳܺ�������
�kl�.�����I�2�Vei'���6��}Ho2'��&�����.����f�~��f�Q~r�Dm=�Ur��(3���M|_%���i?HѮW�J�B��[bK�m��rb�vK⭪��K���ߛ�7��	�g��&�n�����9Um1�`'(�n��^�?�nU�91��2�䬦ܠ�9��6di��3��ۡ��Oe�Y:Vۺ>�]�=}G�U�`e�ǿX�+���w�Xf�U��Bt�C�K�Cj����������$y�dp��Z	'�֎���Ϥe�'�Z&�rM<D'�����δ�U��Q�K�k��6�><I#1����a��0$�#qТ��ۇX��B�mOܗZ0���?���0)�~_��,ƕ���%o��*�Jj`�=�1,�o��sA���lҫ��"8�V8&�T���b���tH�E�D�h7��L�����=�|ą�-G6,��c�s{�]��+xد�ל��ԸC��]d�2��P�͕2r�ݍ��>�Y"���xp�"�u��9њ��炵\�E.I��6_��C��W>1�kU�:	��ۂ���@P6E�˩�q���[��$h�]��q�S�f�Ǐ3�^`�����G/�IK,�C����U���W��⎱9Mh{Nr����Ì�̅*G���{�6Wʠ�����[ߦ�t�1����9
��"��Z�H8�G��vn�(ج����B��YO"��g��M�D�U���;c���O�B+�
�?��M,�R����5y~e���1��)'q�� 4��j�h��z�A��S'�~=����ЮW��A�P��A����O>���|R��c���_�.y�\�j���o��T�h�5N���I]?}�B򚺺މ��gmw�JW�p��'0���؇L�L$�����Pu��w~��u𸄺R�k^�O�
������K�
�����B*f����B���/�d�Q&��B���5	���������h
(s)[�3E��e����]6��C��[2BĒ2)����E�����`�A����\��;ݙg��)�TQO��ih!�>����X�Ȕ&�q{2�m�=��$����GL6�f�b"U�3��;��E�yʚf�J���:���P�XN�1�|�z)r2���>.S�|
.�(ѐ' �C!P�@Ƶ�ml�EyI4�Vs*oWxMzb4�Dzu��S	1�q���ܕ�u�̈�.>�L#�D��k�
�
��i|F��ɫr�v�Q(�JQ����ݣ�_ʝ��!���S���J�y]њ&!;���QD�jw<l��Fi6���:���l,�@�pkk�%
r�{���'VF�3l7�{*
fX9_7���;�d�e}��UG]�gKd�뤋R�q�W��˓"�;V�d
�_�Tf���k4��
�@f:jB�cڪ�@�͸1�\�J��&c��P.[bt�`f��������ŭ�2g�z���6(��.XX�tP�D��)�I�tZ�ސ�륭F9!/��]�.RLx��4_������ %�]k���Ǝ?K��9�E�N���KY��t�r¸v�g'{�LXy�M�G���ɧ/.���ʜoo���Ξ�.-�)�O�|��ލ������};<q�N�#2bg�ؚ���t�2�2�|
|�[�M����h��K�_�^���ɲ���������c���e��ZߟG�3hf���e��4?���Nb�k��?�Q�3�d$	IR4��p�+�Fo�f<����Nࢄ�
Ta��j���r�W�G}�fl�<q\�(U%�Go�(��I�?W�#�7�B�hV�T��0UaSP�[cI�:��IK��2wVvo��N�Į��U4�/�*O��Nn��W(�I��;B�ϒ~��k/?흂���'�k��lX*�����X���?׳_�6b��Z���5��	�֯Yq���>��_G+:m&UvV�l>�ljs�h��]�������檟�ܯ��ՋOКN!��8g��b���<���d��P+`Q�3�<q�9���k켆��}5!���ģ���3��^*$���ƌ�>N��)u�Q���I���hm�*���f�S��$���)*��TĽIx�"���hUA*u����8�bK-�/~�tB��Ŵ����S��4���׶��}TS/�����{���q���U�s\+�A���E�<�w�;`'��(��l�0n�i;��<�n��m�*�C�T3��
;�Fd��N>[��ű$j���D@e�F�n��B��O?>
�s�O���;C4�M�l��	�"'�����.�������Ӄ��l2di7&�fu3���G�� 	g)̵��N�Q	ARw�`zcքޅ=�*�'w*ĩή8Է�
Q*B����\S�7�H\.�\E>��"���:��]���U��\�
~���o@߉� �,)oi��]?�3Jܧ����.G�g��mHh��t�'j��^�3OR�䛥��&�W&���e�@��Q��m����d��stÒЁMD�߮
�Y�16�T��w|ub���f˲���n�>�^�ٚ�l"ʂ�.�`k�w�H1�l�K�̥�Þ�z1|�
�H:�d��`i�߅.�����^B��ʉp=�2�1_����x�ñ���(8��M*M��7Y��`K����-;u��Ey��Ү�Ҿ�rtŅ=��MH���<b_��3�9ᮾ��-����완i�L���v2��6�)�Ը�'sߒ?awɔ&���7��RX�^T=�T[�0���9T�����/p^Z-�?B��ꖄ�-%5�6Hd��~��(����]%�B[n�0�_�����YGم3�*�r�������A��Y=��^��K�q������Xf�t�$�#Y��K|�B��(��-*︗9H1I��U��.F��t
��/��)�Y]�v���z+��겻)�H-�mK�J��~��?�;��L~@$�C&�K~�_RR&&T����D��"�������.Sܗ����>����D�w{`?'�O.����zEF�����ME9wL��N���Tsn_{��M�����1ҞsET
�sW�7xZʹ�����cg�peMno��9AB�~�V��L��+�D����s8c�?a���,%M5��9��Έ���g)&2���&��z	�r�ȂU	A��1���z�n��E�w�(�2��h�W�A��w�������u����6��H�����'�Z��[�q�Ŋ;��~T���2�j3#�)E�/9y�Y�K"o7��<p��`
:��+$�Ь�ΪqZ���`�0����ەa]h,��(k�<,Kxl,�S��
����h�w6ax�ֵgO���߼���k*}��6<C4�T_�V�:�}��BS�'&��o��K�y$���~g�I�þPL{_q��rҕ6oP���]g��J;ll��e
���پdM��D��}���xĵ�+\��|�5"];dl�Y8Ǡ|Fd�2����­�τ|�q�mV?��hgs��l0EC�
�ت�.��q,-Ƅ�ɬԶ�����f�F2��	����O��̳�3hC%�����mH6�;-��.���y��p��NV���)v⥫�W|쾷�?|�k�Z}��� ���\�&��the��7Q{Ec�>�r5�R�*.�`J&��;����~� ���b4apY������{"IȺ�c�5]A�W2�
o�L��'A�B'�g4{(s�G�!��&y._�.g�lnF�뉃��$��m!��/�=���+�Zż�Og�y�'OPW��I��!t^8��t�n�
��J���@�ݯ�:��YqQ�C��R�P�5��n;�I�e:�렦LW��VfC؁T���+�<d|��O+/�p��H`�/��ZF8�J�ilfW�4FJ��[Tx9R劮ct|h�x�[=�7���N��>��ῗ�����yK.Lu����UN�p��3þ���!�<J�BH��.�D��ٓ�ec^�<��HZ�^�E�A{�:`Mn��bk��x-��z1�
�	DZ"�l�V��DF٩ۭ���dcۘ �b~x�i�����_l�&���s��f�ibo���T<��A0��@����i��"���Xu��yTO/�wb��r�>��H\���G����@�
�K���@t�'V����j��i�+B}�~���oܪ��ˇ�^M�_��c�>K�Ufa�!s�~�K�/0�+��	�<{��!=6��<��i�=�`܏@�������R����l�K0�A>�fL��B��7cc^�q�>����p��>>nj���5 j�\f�^ä6h��j`T��=�3��p���2[y�
2�Q����9!��z	�z�P_���?Ŷ����ar@�꯴��Io�Ӱ4K+ЈU_�7�i`��%�F�U��`�ΨŎ$���8=�mM�d��2p/���r&��~M5��϶P�Rb�4������j�*�G!�ʀ��LMu����0%_�ds�`
���F,�1����yr�tOi��KU�������w�B��zy�
J����4���! 5q�M
s�����>��<6 @
���sف�Q£�`G��
"\2��a��#����p�uGB��MO��{D1߱���f*U�Ԉ�w
Bj���n���1�b�9.<����Z�2\߼l����E�ސW�K��:?�8#RFG%" ^��8������f-r(�:��E���Y�����<��lA�ϳ���`1�)� 9�`1�"69��S�]*9+��������Ɔ����NW��+Ͱ����V�
�(ip�)�O�ݢg� ��@�
��JA��:k���O���$�m�c���5B���]�%�FG��"$��S��������{lA�R ��F/3�$���_�T¹�i��5��F{/������a�g(hY|P�2�^�1S�aj�1W��˚�z����CR�Iu�[!V��5NI�"C��^1)�нb��Yj��o�6\]��!b)�<�%f�-mt:�\t�8�zH'�
��Cv%J�o̎�Q���-�����<�Ӣ���
��x{������J�����y����=�U�z�X���Gv�?1f|mh�������x^L8��b��X�R/R�H��^1����E	藍,��@�4� M�{��/گ�rZJ��LbN����I���;�`�ֳ�GS�s���t�cz���V�G�����lQ�:*������8�]$7D#���`�_���d��/�V��d��#����:�����l?��q��k��u�L����Z|V�;�����ܣv'(�|���z�L�!/|�Q�ݳ�rk�<�B���rH���E��<�j�[�gU	��Ԗ)�NKN��a�T1R�mIg�C�$g�8����O�L��n��}��ΫM�j����m1��(u�����6�$�u��9k{o��%q�M����JC���H(~Մ��i���i�|ɻȋQ%WT\2`�7f*#��0�2�ݶ�#ń3���t���kZ�}3����F��n3w%�X���N���ɿ
+}(cl=Hy�y ?��w����U�܂�L�&�,�ju1u�A���u��3o�S�@�h,����=����R�[�k�BLwmVm���֔%����
�2��e;]�ˍ�r{;R���&Z:�5���U"@�����$�gܤ��<�����0�S���
�����Z��!�_���T�!�]�Ij�g�hi��BǢn��շ/����	s�3b%z^+�Ad�6��h�����J��*��׸�@z���
�5��4�F�R����I�E=Xg�k�ieە{6co�C�C����������Z;��,rI����]�9qS�o�mWe�<��2Ŝ>
���})���U7��=pB�5\��ˆ����	)�?���cF�a6��:�|�� ��nYIi�b���Cg�t�G!?�
�wk��v!WlXHǴ���|���$b'�1�0��[F[+
�Pc^��Mu�c��H����7K�"s},
`�6�)�����M
�����;)d�G���\��Vu,>U�x�2���n&D�Ea���	W��f�� !�9�8�̠����~V[s���@��7�>�SN��e������
~��"�O�Vīe4�>��qG�i�tV+�ua�[P5MĞ���
��(�y�7#y��f��M;/6k��҆�/�r�sx&$�~z�
����摼���!j�6�2��K��LC�y�ψtCaV����9���<��m�;�?c�Yx��/�h�3e�<E���5���t]�N�ɚ��E�)^D���묝P
j��(�Q[�7�g��\���EՌ��Cܖҕ@������ �I���f��;n�P�?~ҔV�o��d�H���W�1x�+���ԏ���a��%�.�&/����]����gE�K�IB	��;6�G����C[�?՞���oG�<���FUj�[������gsI�q<--7u��F�o�^Tn��~�nT�%��6�5��`xg��"m��\}2����垖-'��3�Ꝋ�5�~6���	u,LY���-Х��$J�M����]���5���k�)��2e�'��XG��d�Z���Y����q��N����n� �A�7�~���Uv���m̳��ij���^�A��CA�C�r�?$�t�[�}_#��)$��bWC��U7'u	t�6�\�Ƭ2+V��a;R�_��B�l	y�	��A�T��y;�H �F��u�*�֪��29oѬ@�4������ɫ&n�R8W�<=p�&�=��RZmAO�v�|�K���r>��֜�=�	9˸����3�3�X�܈ǃՎ*�`�
��o��PR@���N.�|,Q+�3[��g`��~Mgx���ZNI)�2<q|?�m��"/�����d��أf0�X�9��ZL}�����Ť���G'WON7�3��&MA����.
�
q�����W _=k^^H�$	���+�ӥ�x������Bc�TRBrppCШ!����mƜ����)�&�3�n�
����kmF��,�U��3SU��b���]@����N���p�\�#��$����I�lA[~�M��}ߛ\�35m�}�.�uW9��79?��O�5[�W������Ad�Y�"��=�A�A#(�
L�N$�K!�%������T��S;�7G)>۩k�=�v�v-�p�v��.T�?�D��α޸r��_�4h��S��^cp�D�k�k�	�7�E]��"���5͚*��(������������&潝�cһ�*�ww�M�8����
Zm��wC���`+|�1��1��
��ނ��R>[���t?�;���ӱ.�Fl�]����7�9N#+"��ۣQD/����*�C����y��A��lQN�h
�
�
v���cj�|���H���͛�SJЙ4��l�Ix8:�P�?�_`0�ï���NK����ϡ�g�X{�Hs��iֵ�"�?��Ҩ�O޺���f^�%[��5�c�U�3H�2�,1�ig"Q�.�[ݻ������3��R`M��&��h��Ű�:��,�sfyÅ�}UU�{O�2���k}`ꊞ1ÂZQ����Ys�yD�C�p�!�,�a
�8�u�nH��ӺG��]��+"(jU���g�V�����:�r-Y�[Q�B�"Y��W��Nf[��
)D�ݡ�|�Q�7꺺T�.v\թ��~Z�
�����I㈾TM�}���
,����,M�h�,��Y�e�0
X��\۴4��Gr��Ķy���!��E.v��[E4Vl���Z��$ٸe�5�Y�Y�W���?�8V�,�?	G�:�ʒ���c�M���$ʕ�O}`���EW�h�4\R��}��W�bmIj�ۡ�iS��L��"&���
����V݉����ԥ���88tI`�����{>��V��_�(/T�"<��@�҆�a�Y;X��ܶH�"������*�	W3��1u{/q�A��j���5�t�e���-�5�5D\D�/F�~�#~��.sA�>�VJ�U��ȮaS�X6��b��P��7�p/Rp�s�Dz`�>{�j�u�_e��󳧌�	��ǃ'T��h�"�l
/zH�����wY������~�E�=\���p_��]e
q�\�%7N<�],c^`�۝E^w3ĽL�ϝη��ik�
r�k���ԍΣ�˵��*�/��@��H��>���[-w�]3�ـ�W�W�3}WP���|A3�K �IBf�)h

#]�t�5n�Z1@�.��+i幓��=��o|H�#�ݟ���sU��o�~�[]��C�_�6P���	��l 'рa�%�"xH?z����@���S5�r�=�[���nU�R��S9L(��N�rW�����`���z�_�57y:���qt�F�xW۞����d��Jy:]����c�(w��jY[~:�3�K
�<�aP�̫vEʚ�*Z�������jG#��V��ڂ0���r��#��^Rkg;e/i�3„Y�������s�N��У��BߖH��Ա�GԒ� ��P�@��A@�|�Ar�L��s���	�\*�y��ṓcD�C������ɝ�����}��^��AJ�bgGYofDT�jD���Yy�u�|yHc�U�>�@� @��b:�ڠ�tЋ��G�}��k��;lj���
_W�F{�[;� ��GkF
�_�q���ޙwk�����(_ ��^#ʬ> ^�>�@�W�{`�{[�����q���]%<�8�>��~tbb����ʽ�T�}���J�Hc��,�%ut��"����<�Z
�\���:�	�|��W����g�ؔh�c_����-j�O��%'�H��^=Ş��p*���+q#�Z�G��� �4'�����Z�\��jJ��]�R���;rce���o��SZXLt��?l�A���1r'��5'n
\넻�|B��}�}���jq��5|$C6Gmo�b�ϐ�@���<~�G�y��+��" �)���T��k�yj9�]�	��H���p-+�GY��d�VU�"d'��������M���i��:�s�.�E�pC�ԏ�ML�@�
ҠJ�RMl���œ�ɫy��'T?eY���5+�tֵ����'�N�7�
^����}~H H2�S���`Ʒ�N<C0ڜ�Ho�*�pW,� �뜓pܡ��
[�<rP�"xE@y��M餉iy�gb����{����׮�%�s��խ-�K���O��v�j���_�����Z@�[Ņ��a��P����H``�5��� ����B��)�t�7[���[dz�L����'��=?�lP�IJ`Α����!U5-%փww�_
�-%����6g�Zq�VN��NH%/��A����d����_8,�+�MR%�[KLI�[�&�<5���?��yjH�^J��=�S��֎���	f.���cA���c���<5�4Ny	�#�i��k��1eJ���G�j�˃"�#��1es`BG��C��+5
��A��l�T(R����6 �2����F�de|D���>��䌷`�E���6�I��j%��:A4P�]���W�DU�h���2y�Q�勭�t�䐡�~��p��Ae��=��s���4�zӬ��r�3�!��^��k�^�!d|�*:�^5/Ku��Ըi��3�ns�ʫ��q��!qu䓂����]�ٽ���bh��c[I)�(�S8�ݥ����ó�nQ�1�+Iҭ��p�ȁ�̼�uA��͞fu�i�>;)g"L����`zh�ׇe����,故����q��koQ

A1N̾#��h�2��j!9;H�ӷW���,Ś���Dv��s��Y{���E�>��6'�˺��փ
���M��fkJ���/��DÂ?�#b�e�г�w�G�J�pt�g\g�u'����E�-�p5k�L�`��Mj�Wq<��<��+	+��hG�y�m��M~�q1��xZ\�A�7�T՘��i��_&z}*���A������J?���]�7�O��r��jF�	�Og����KN�Un�LX~�*;�����=ho��q������ɹ[KxU�?�ZO�Q�l|�)޵�qKL�`���V;.�Q�Xf�|~ʲ!Ճ*��▵x$�
��4%$L�7�b�-45Ma�e[>�$�o�`�=�̎���!��L�1Q��gq�r�j	�1&l>tjyIfW)[������dKX^�s����F�S^N���V�f��i�X�(W{�u�[m(��D�GM}�e��9X�3����POA��}�޽#��O��eJ&�����:y,=�+����e7�'Y��������lV���S2�J�ƺ2!+4K���j`��/zW�1���"���ؾW� h3�L�gu�3��ޢO�~�j�*#�[Ï?�r�B$y�4�7�8�8+����V��3i7�n��z�l�H;�:OdH'.q��a�]HKA��g$ ��]��7i.Ht�9(����D-$y��a�>�N���dP�f>i��b�*2�Jv=��nvΰL�1�N�,�1S���]My�=EN��F\%�(�3/4
7A�_p|�f3ʚ5~�"V~eyƷ�L{a:û��Ei�P��^>Q��t$���E�x��/�{���
R�܊��!mw'H�Q�:���B�S�&���GC@��9<m�c~[uC��ˇ�L��<pՅ�ȓ�̞��M}	�
�T���ɀ����R�$(�>����mx�Z��*�i����v�����Z)���J��nO�h$w^Y�=P� ���iEy��-�?'�Mu�WI�W�f�JN��-��E
�Q�R�I I�]�B�����J��P��T
6�Orv?y{�?.X�p��x%�
�[��r����H��Ʃ��zL��!.yCgf�lԷ8ep΢t�Wh3��z�ۻ/R��(�����-�dy��<�,(��p��ϲҎ�����(�������D3�ܦH���^��P	b�t�+�2ut�O;Qo8�W���(hK���ؒ��b;�8{��Լ�io�+)I��C��|^ok�--3ZO/f<�b�[�91o|�{5�D)*��JU0]��&ϱƌ��˺[awρ�v��=4�����e5����h��\�F�Њ<�O;�)m/���V�ɳ7�jœ�2�q)�O�4�@�����	�)�U��!�[
n��y���M�#�����7�JnB��� �1SߏÝ��I�~�]#�����~dĈʳ(�;����μnp����5�����)*EH僗�&�����U�M�x��:��/v0��D��*o���-I4�c�[6n�P�bp
	H�9��:g��[�,��6�w��_�"S�Χ.0�LTR�+\��s��=�p2E2�1�F \)/���<P�G~��?��.,��^�MSTD�}���>�f�P��#�Z����V�Q42��a	9f�dV�y�&���J��?�*Fl
t0�6�F ��l�wH��@֞/գ������Q��:�1�zG��԰O����^��Ka����bd�N�AA�h�3���"H�6C�H��4e��/��I�]�2u��n��Ch��Zol,'օ��LJ��r�[%��H䴑v�㎈�U��1	������@/RX����dN��*�Q����?h^�ѥ�A����D��-L�EtsFV�����{ji��z�s��~ϊ}QWg�g��
V��(�#�:��5%'LQT@�=�3�̝wN��D�q`�r8?%6����p�d��8�o��w���/�ra
r���U�g���r�}�St�
sr�����G���G9
ȹ�|�	����K�j��ta�D7��})z�פG\O����D
���+f!��iCۍ�f�\��s�O�Y�C��t:�Zz3s<C��\�Q$F{dY]�ԁ����yG,���n�m�5��r_]�DN}�߻�?�ǑJ]�	�z��Շ�jح/OX`�m�6� �f�n*H�8�k������:nPY�m�O��1;_��M��y^�^��;{��^��~z��} ���?�
{�jj��I�D�䍧�I��1F�9L�>)H@_UgZ��>�&��;�c����ν��q���ZۘD�͌��LYd���������Etz�K�;4�F_V�۾	�1�>����e�����"�=[�l]�̃��Ͼ�B�����$ܛ��j�f�]����)��t�AO���{�%n��� )��$���y�8k�1���x��R�s����M	f6ϣX.�m� �?8W��&,�d�Ύ/�A������=�=���~�P�G
���}nG�n���9���*���������(�  +�[F���w�s�L-̙ϙ'Դ�~V3U�)�x�L��<g!�J|D��u���b�����b����;�`�A55������8ȹ	[��N�6_0f��ze�	��~� �My�<����y�BSk�XU��V�YB�ۏ`t�G��
v��0�	(�h�L��\�<��� 4zW9�@��G"�ߠl+(��+��׬���
fo�U\��)�
�?
���Q�f2�2���O��Od�@�:t���.�$Ϟ��2d�s��0;�8S�����\<�x�
�VUk�)D����q��J��$�X�����T��R��x�M��W�4�<M�|{�rL�Y��7�w���-�T�Е����޴˼s�ޭ�� >���~s�@�vK\F��'7U'��SS���)�͹T��� A�H�_W\�=)�WI�I���k���S ߹$)�l��r�#/����8{8�Lw�BʏjD�-��TmwҎؐ>���l��U��/����x����%LQ�E$�vE���'�-�������soN�W^-j^���>[,f�<�km�nj$��Ҟ>���5���`�SG�]�-ұ{fs��"��	�g��5/T)|qT�2b�Hl.��	�E�t��W���.˱�~��e�]yE�Vva�Yߴ�-��*��J{۴%K���C4'�*�[+�͋�OR��zLح���
�-U�s"B��s܁�TlƉ�F�d8�ef�V���W�;y�/�Y�EtW�w��"x�������V�	�=�Iͨ�t);���2	D0� j9
YB0���}}6��x+•����e�
?�S�c��D����H7O��+>�M������K}���Z�y�Z���&����D�DN������(K��*��� k����d��Y;E�AϘ��n��d
x�F��Xk��+j�p��\�Q�j
Z�h��/F��LR�^M]H��e����?�%���O�t�A��{�&Ei��A�K���k���Q���H��)�<����[�3�{�j"�R�j=�e�'�{LMs��֎5��;�
�lOro�~[����`�0~gB�Y��W�aݙ����	��.Ig͔�qMk:���eb��ҕx½۬{�z8��5��C�3y�G!���^@�k��1�[�s:2����!�t�ej��N�d[I�	�|ƥ'�a<���q�������5�/%��~,]�^�&��+Sf��s5='ў�^�������,�l�C�!��#��U��N�~���/ƫ���6����U�o�h{���
y�?�d9��{�����6 �2DpU`��Ai�I�;qn�Gk����Q��U:O�&�S�v���kx��Bq��`���Nj)�/[�W�i)��A����B�G3/׿�b�/v:������).�蝶��l�#+'Yھ?zs�����3����8f���Ae�����2v�q����]���'b$М_�L�ql*��ު{�rDHI���T���ʒ�k��v΢GysU3Os.L
N�i��2��|�"�J��x��$�u	FiY��т����C3�8�	�y�1�̯�9��>��<�:pV
�-�O���W�ƶ3���+�7C������͝�?�\}��ʃIؕ:�+�_���D�������#��p΂��Тf�Q�~X�=N�pg��"�u�'\�Ϧ��'�Z�g0�</a�38�
�������~./�l��_�@�����U�j�͜Ay�����pq	���iz�p�h��~�z�]F�~rd,7�*��$(=�w���aQ�a�uz4 ���k�,������g
�7�/~�ZҾ*F�������5���k�b?���S�j	�ޜmc�8m���@VO켣���;nY���G����T֟ٶf�X��Z�U����C]t�µ62t(k��.z"��kB_�� ���`Es���]�.h��l�
���ޙ�	�Ch�J��,���Q*�c��շfZ�|g��Uk�<��vR�D�2�aмe^9l���^>��h��V��C��x&��~���-�Ͻ��<I�K����R F%�и����q�����sm�u��9�
}R��оY����qQ?PU��7�؄jzk�<��-��-QN�z�xW�(������m���x������������.L�&i�[-ϧ.�A�n�K�2��|*:��=���K�Y̺P����ص��.�$�to�ݙF�}=�E�ԏ;��WF�J�D<vC|B���?z�����A	����Aj۹qۥR����(�ښ\�[U1_IL�܉lͳ=�f��R�4�p#Y�n-S��OO�j�(s�k��&͂ibW�Z����I
V�����1ӌ-o��} �j0��xo-S�賱�P�6��t�%+?fzX3��rv��6wn��N������t�K�@)Ob�ը��g>�E
y�Te��ؾ]�&qm��X�!��{��{r�7���Ϭ��P�V-m7n�޼�����Ct���XLFgNK�)��ŗ}�xp�qr��P78@'��FS,�	[W^I"������7�L1�����!�u}>�y�"O��Jb�/L��;�+���a�צ��i�:RF����>����qx|�XL�Z��2=ں@��4�댩���á�N4E��i�|���.���+�=<(�/7�	������!xDe�A����%:��]pEUJl��}]r����
�ϋG�Y���.��~S�fp=���_�����7�:M�mwb��/!ο��#��9�m9+c���K�sҨ��R���Jlp|ju�F�[R�a�˛ِ��4�H�xRs��؉/{�`R��ސ/�{�K-�/K��.���CG[����0�iV�<c%x�Pm��M�V�4FK����
���[�g4��c���h�cjF{\��|���f��u^Fd�f~%��<�k��GmĎMUQ�ۿ�c0��2D��e��m�-sz����H�!�=�_���H7��~�S��>A���ep45*�f�t:�2��$���9���e�@P��mUH�%��i��u�s�F,��6���U�L�5�.'_:��}��)�2�{��z��)�	7�n��
���F�Ft��se�_�� ��/5�/�5j�ΨOԦ�,/��L��;�oC��)��=sFD��/���\|؉+��{g8ہ
Q��x� �)�	�#6@ņ
6��(��-K�}mD$�5��2�3��Y^��3ܙ8�������v���~�vEj��ߵ\/ZJs�U��,��z��W�=�K�q��a��պ�FxL��`4��w�Z���S�K��9���}Vܚ?/O�۟Ϣ@�E,�W]*Hģd	��l|Yx�F�-ڎ
�OʐB����lX�<�|�L�R��_\%+W�T���";�s���C��Rf���n����e̚��ܵl��~dt(�;Ju�˷�tuf�^!hZd~8�����A�J�+��e����?����r���h��!�Z��H1�OSw�������Sh��p��G00	������y=���A�Ra�
��^��{U7r}2���UvW2�Ԍ�W��+5,2�Xgc����4�`� ���E�� 1Y[H-ꔷ�N>N~�Y/��s\@�>b$b"kb0�I��C�U���2.(E�M~�^�;���=g��OJ�'g�NJ}�=Ρ��\�U]A	d6����@X"�G�Bw�8[W���,z�k��A��!�d������a�?�0�Fr3뒱�+�¿�����3�voq��n�����n5BC�sZ�™���"�������|��&L�i�o@ڛ�����`��bEc�8jE��mk��./[!V�!\��d��i��c��f5�;�]î�p;zN�`�_��'��8��KS�0���.u�h= 
1���v�̙����b�Wj�˞��">/�QΈ[��=�'��ˇ9�gJ�x�����������^�����YXJ�h�`F�"��'n��֊�`�ٱV����ܟ�P�P�e��=��r^��zV���3��?��^/��ut<�.��-�(9�6�ʅ��'bӠ�/�	 �
�2�{%�����aҗ�mtTmv�J�D��p���{�}h`��:�,�p�q��uyo�_mVH��&7��D�[>�*�ZIKvT9�w	�>�e�����u6��m���N���Q�՜3��}���&Z��	������^�p�EGR�p���U�ə��Έ/uI*ޣyͼ0�=wsŒII�y/��ȅB) q�Cz7yA[Q��ť��"J�
z�O�a[ca�?x��5����x�/�AbZ�VŝYk�������]���\!
4����Ҽ��0ȥf�4~��q���E {l���g��Y�����\F�W�t��n�U����A�1p���b���a�
;8��#��A�xEl�m���b�)�T�/~�-��,�
��e*���1W���X�ݱ���Z���d0_�H֭F,�
��2˧���}p.n
��
�Q�6̎���~I��>�*-��s�bKس:��8OS�R)LH
Kꠔ~7G�§�S��N^����2.��`��&ZV��<W�b!E{�ཡ��Ԍ�:�V�����\�,��+�A�e�.���x�w�,eg��	�Z�@	�����_L�����<�P�:֞��1�Ɣ��Y2�.4А�^�$����^�=%�Zx�8��bpS&��~��ޖ�S1��l��+�w5��V�o�,7E5ǥ;��;�O��X�o�����[��P�X`y��H넂jpM�D�E �d)�[٤��Mʪ@�8�]O]d��)d�(2FEN>m���p�D<.T��+8��Z�F�b-A*�_����W�ݮ�/��[��x[�S�	�w��q�;1�ȫV}�H����:d՜�ιv��������<�"8���ۤ�R����ǹn_
t��3͞>�䖈=@b��!}xwD)ՙ�G���Sj�"z���|uzKK�z�vPfs-n��t��&�c�#��K
��ʐ"��	��KE�$^�x�����+D�\����$�T�9�1�A��D���<��K��E��cL%�4���ǩ�,-��?_J)�������7��_�*N��t����jT#� �i.Hd�D��� T��b��gC�U����׹ȩ���U�~���e��EH;�>� w;����eMpm#K���L�f��Ҕ�eo0ڥ:�b��WC�F;�ls��5v�	{K���`��k��N�n�$u�c�
�����@͹��3!%u�1n�ʔ�a�F�y��Jȣ���~���s>G�V���H(ʪ���+-��$�=+��zgx(����0�,5��F��⸔��x>�w��kw�@���R4��͸�F�ϥ�?�>Ծ�0��ȥ��9�*��!�k=���ҶV�I�]�K�`�t#�yd��(q���t�WS�$CH���OoP&����bj��BDIF%g9Ir��<�s2��ts��:HzOc�NFs'شF���iD�1���J S�1�σ���ה�Z}��t�h�T��ߪJ�?�g�.N�PG=L �V��r����L�?v�L�
$�2�z/��������ZYK@���%�F�B&0Uq���ѿ�9X��/��G��&�]�����w�qS�q9<�S���m�V�|�E]E¢;6�	��J�\�y6c�P���>�7�'���nOķ�:�b]�bzt�X�&�F�fG��rG}99��,��C�|�A� T�6��D�>|��}�Z�*����"opJy��w���O��s�w��T�>ܹ]=���lUy09�x�i&��|�f��7��_�W������ʼ�Q���W��*�M��(�n	�������.L����	8Զ3:�^�Q��Z��=D�"��/�0i�A�B��o����������Ɇ6�2�_�`�m!않_��Fr��vRU��ԩH�f���k����V�\�:F�.����&�-��n�LKɴj�&	�wB{Zs���� ]��Y�0_�����~����A�H�ǁA���10�Q���~I%˥�B�v�t��!r#�dA���,�C8����
����a����6o��q;
�b��4T��v�לO�[�K���1�	�`����/5Z��Q�r9����u�����:v���є��wo�e�;l���:k��5��f/������hAUӺ�L��K�u���������Y�z��0:1�AҎ�B��si���f,��ͲRtq����x�A�n�i�z]���.c��;W���߅Y	ވ�b*�'ZV�'zO9M���S[ɠlq��ΙTW,`����!M<���MJ�j&��^�
ȫ3M8�oE�I�%�̏�W(@�� '0�>�;}b�����H_[�2�9�d^�q��D��e�K��b�r�`��t:�ٛ�Q��l��ŖG��&56��T1��[ǀR�&7��{����[��eq$K�c�O�)r1��~�[b�9���h��%Jo��Qf�je��v���H?��n�+z#>�D������%�������
���@`����:a�%���Wܦq��4X��){���%ϲ_��򅩰,>�|��v>>j���*L���Z�T��:�M�����r��6������ZS���@0~��
����'����4:1J'�4��DcROo�a�4��>nu[ѐ�8�͞�!ǰ�ݍߙ����O0u
�=f�Fe^�Y���G}Ic5����Beg�d�|�)��Pz�;DA��I>5dp�$��� Yo�Lf�p�-O�����6V^��w|3����"�R~z6��w��ORٽ�3+;N�VW'.��{�F�Q#B"f��M��<:&(�@Aa|�ՙ��4p��`��so\,�_�3ry�ޠ�I�Q�<�"ϠW�fdF�����R�*���Q���8lTU�%��4�{&cJ�Az�%Y����>�%��a0$D�����
��'�{ќ4�:2�]��n.����Ii:����O'9l� 6��X]ξ���@�͕^�ʗBL��-|E�{���īM�`����IT�	��ku/�����J��G�X:�Zr�.�^!��p;��w	1��rt5T�:ޥ��p��hE�t�`�0?[v<EPHB�Hje���7��dx���S��?�$~$ceBbr��Qܫ������eE�vP���g=Ǥ��V�k�_���m��!Ly"�[D����-5t�B��7C���0��[��{R�e�\��Tf�C#}"L(g���3ӟ��D���)�
��eȸ�Td�	���跙�~���]�%�о
�hk�|�^e���x*@��3u.-F��������nb(�|���V�I�>��a�0��Wz��+oh<4{�^��7�oy;��C9� ���/� =���̜�c��YB��n��i����X�M�R:�<P�IM&a�$,�&��P4��3-�����9�l{�6�tZi�X���(�s[�:���N�[�8�'�4Q�u��F���.f�z�)JV��׸�؁��G�^=��=�bl�eOv�9�
>�X��Zf�TB~��Œ/�[���(�U�Pr�d��~�/&�"���D?�^�$8cW��h��&�_�V�_���q�Zܕ�>{��5*�J$��h�'��2�o5�
f�D�0�hwu
*y�i�����s2)��t�O{�3�;�֌��
5��y�.�/��e�97M��\�39�I��lTLLj*��9��J�I&e����2�&�U�����T���)?�~@>(G~��D���u�I��p!��a�\斀�w��FO��`V)�MJVuȘ��_k���U2�E6L���(�� ��J��"�t8P	;��Ca�_1xΨC-PH��X,��x�[�c��D�����PC&���)G2	�ş��5�iz�З���2��M4v�;sl�V"�򒿎05[)�bU
'ʮ��y���S4��j<o�6>��%�1� �%�p�����eƒ��-hK��\ݴ\�uhl;!,��V�t��L�.ŀ���U?
q�T�:{h��=��,�{�n\4��c�?�F5�~�		��DH�l�x��z����C��z�w�o59�4����.K�u�s�"�6��<
�4�C�?s��y���A"�'���N	W��z
�@���A�2	��ɠ�>j"��#�_�����Hf���F� #�
ct�T�G8̣
ieq�$B�U�H8n���Tۦ)���u^P8٧��-���/�)���n�Ń��z�_�˔ϋ�NmjO__b�B�Mv�e�q�-C��F�)Q��O�Fg�= sPE�k���ˮCL��zD���wC/��Ұ�C�TzNQ��%'N]�P���E"{\mᨻ5�7��f�w:��s쒏҉�/���~��\~��&��#ε�h�j}��u��S��P�

��	���*�F�Ś���G9@�,���S�+���B�ҙ�m��'�poE|!�����8B���U�
��ttՖS��'LJ��ՆSP�ɂy��"`O>�s<��'E3q�&#vÑ�ڜY�+�;"�A6�L��c�Ay֛Ǥ�(HkTr�	LXf�Xs�>���_�+py
G�[�jr�hVX@�k{p����Ñ$,t��f��mޞ�o�E�w
��Hi���OLY�Id��@�+Av�AD�]8�4����.����5���a���G�Q����|��MU�R��Q��]N/�}o��F��#d�j�d̚�iV��B�[�X4i��<���!�I�r���~m�]F`{�K?��U+%�;3��z�1vX��l�w#F�ƠR��5TI��^C	�:����V��ܪ�WF)j$T�ee�v�>�Ro�Ee��h��,�㉠,e�[����M��W�������#X�'���d����)�W�x��B��|A��D���������`��2���k�I;�Q�Өu%�ZEd\�Ѧ�v����V�ss/��,a)�=>���[J�NJ̯���G7n7N�~�=jږ����n�����$p},�`��$����q�.�Z��z�[�Nc=9����
3��=��W��M�g��8t�	�u����öG��CPcҗ���Pc��dpI�pYgZ�
�n�lF�G[i�7��~5��c�I�� ��~"�h򟅓v��	h�e�(RL 䑣4�?m�UhS����F�@��������>��EU:�_i�o�6�Z[e/�1��\u�F���T7
����/*��k
�f7�W9P��];B��f[G�3�+��9HB��#�X}�
�<�
�[�̷����1�'M��̂�E�՞	�JN��Ε�!�A�
�R�ѽ�� ��`�Wٻ����G��N�F{�4���]�N�)ƚ{�F�݋���c4��������A��e{Ku�E�#;@pT~��-�ޣ���O�ް�����kN��D��%O���"�9& G��~�����q����R��V$�R;��C��*�s"�Y�ވuc�T#���δ����4|�rrӕ3��P@��_��gD
)��$wp���N��ct�:23>n�4ߓkZ�5QDMƢÃ�N�zBuqR=��Us�*�yIII�RB�����K��4���'�|sM�u����%c���W�[eM�4�׼�1A3׷6��5�,�~����Fm����d�.0��"�
ߦ���<�*~M�s�i��p�
��Y� ��k��i�����A7Ԑ���@h�'�nDH���T��C/�;0��(Q�h����#��N���kf[���_�^�1�:y�bQ��%���F^Ӏ���u\{j��B��+acԑ���QLL����FS�1U9b8�b�DE�|FĮ�6
;����U�Ga;�[ҒdIr��$k�w��K���nH��3嬂0g�gUG5V�f�(<���S�)}zaoK	��?�K�O֐�-CIR�b�$�O�ȁ����I�ri@�Qm+�2��d�nF�ϰo�@�gH����Yoŵӡ�BД㙯|ZkM�1PIO�!4XTz
�<[Bƒ0����R���Y�ݽ���ɳ!‚�h8���Z�r�*���������d)�m�k#z����
��4�FV��b$���ӡ�3V��P�U�䗀��d���9��	⓬i.qk�
��ͭ<sG\q&�\K�:�8ZT�s`W��;��nK�dꪸ�F���:%��H�* �t[���y��^dY�-�|�L�F�^�]��O�Q�R�ȥq���ۛJy�.��b��jX�Nʻ���wA�CE6��Ȃ+��k#t�U��ي�!��j�M/�G"M��N#�e�7q:��y�.P�\&��6L�G�fҵ�����%D�W=鷋���O��{��w`N"b۽�<)�wznObbk2�:�{`�/�Ë
�־k+Q���g��-@ Pw(����t=�E3?���+�#�!Dp*�|L�s�Yg�#���H��p����R���"�k�Y���`��xV��݊����i��1w�א-�P�&�:#��� �WR�<\
ȥO�Y��)�֧��8r!��FD��a�=�#Ҳ�<�+��O��� 3���mS��M
�����dGcwpR��~����8�2)1�*ݒ0�����{
����ØU��(P*�,�� ��������tY[�{)����ۉ-�7�FI�m��;�����o`�6��ݐ�A��ٻ}S�����F�o��y��u��}�o�n&#�	�Z�j��k8��S�;�r��C��z��ڮ��j�qwY�W��A��;�ʏ.90��Ka���z�45}��+Q֏�wt��8��-}�ʨ��CM�5;1��`�(������ܟN�61�}�_e��4A̚�H�8ޞ��d�t���/?ߐk�&g�f��C���Ɵ���g4-c�e�.�te�Kc�@ KG�"�m��d�k�6��h$�B��}�ط4�5��ԲO����\nv���tOmk�2��?y�-���p���,�M�|�b�X&�[��k5�gj�"M�F��p�#s�zCb�|��;9i�\�����Ȍ񱜪݉�F�6��G"�6+b0i�[�Y_-؝�m|��k�V(.�E�V��%��GSN�>�N�8=N{>)y��2:�����|6!�TKohٛd����H��y�kx{���@���x;��(T�W*��X����A�;�}w�[
A(:EH�.���)��Ck�B�+�bCP�#27���|�K%�*�&��{h�?�bO��)��y�������O��b����8Ƭ�?pɲ��n����Dϝ�g�d�תm��w Me��.�2��cܡ����B���%Ԡ��[��(���p���D�1������O��D����mI�&�L�?Ll�բ��"���[b�i�fo�F�!�G�J�"��u�GC�X�.�v�okծ5|7�i���q��d�|s��h�D�&<&Q�ij�VcJ��!t�*.���95M���O�:��xŤ,�G�;�KѼ"r��-�W�k�9uWs�;�X���|������Gm��`����)�<"�82e�ڽ��ߓ�
�?��d�&"�a����
:��F)@�:��cLc�}e碃�1G�Nƃ}���)�㮹a�A���knD�<nc�I��y#�0��-��a�yhz
x��Oǯ,�hx�����ҙ��ǕN�B��׾{S荗U*�Q�gh�?���y�醨��� �o�j�Q�ݟl?ւ���x�k��c�R�\�4�tff"�H�cҩ��ʨ��P �bV��F�O��!��>��@<qg�<ƪ���VU-l�E��'V��x3���8B�H<l�e���OI7�y���6�w�	�_)��kڧ)�߇�������7�y`�.���kX5C�;�$��*��FBaA��ݘ�>:<H����G�ڍ�b���L3�1���ΐ��'xɢ%��Sf<k��JuU�;@��|�L{)����pb�ڜ���P'�|�ҧ��\	k�+���Us���.�k�j����^D�@i���3�<�J���5�
WWm��9��o�;_��I�D���,ԉ����K%��}7&O$	o�o��DŽ)	��YWw���ۤ�G�5�C��\?��5��]����	����D�����7eȢG\�y9����xⅉ�
4Z›lS��v�%oN�����L�0�L�E��S�D	3&�.��NV��Jl�
�fv�Fm��I�G����R��Z[��t\cQTc[I�R�^r֩;K�_���z�b��Y��=2�l 2��!����:�eO������v���k:�<@���T�P
Kf��†�:6�IQ�@'\��R��F�\�׮�����_�����J�p����gv�䁿ߜO���]�ս-z�c���_)�0�A
�j�t�^O�È��z��GmE���Tru�E��W�,��'���J��oݬ�@�*vu��c�V�Z?�~����D*�xw&G:wpi�w$݃-����p;��=T�πڃ�dR�j��Z��_�[y��T������}��Q�GpC��O�M�i+���A�_��yaf٨"��˂����1���቎�-Ϛ��Dyà=�Ow9���h��{�">v��~tɚ��𡧕�_v��*�]�I�w������V���b�w���k���S�E�t��F�w};Vϴ�����XFi�$�GcJ|���N�KY	��XI/k��V���t�O(�R�f#D�(����Y��ت��d޴��J�O^�xa�X��k��x�3�Χ8���uBF�4c�7ķ
(و�Ѧ������:��|.\��W2�¤�{`���2�L�i7�1����ssMM@ Y(�d�]���s��|츎Fބ��a�5��@5	I�Ccl�}r�W�����¾����M��PP��yЧO�7-Cuɇ$@��PH�0r\�����f��}����O��UxE�^X]��c�Iu�>�Z�~�۞�E~���%�U�D���N�q���桶ٶI�� ���J�R��%U����%U��'��0������\�lb�ˇ�!<��х�`������;�,EU{��_��[?Qٗ����Jm�v}洄�>�C}!��g,O9���?�LG�g����Wbx���*e�d��3u�i�m$Do�u/3��r9��X)TS:7�/���=X��eBe.�vOVY��q0�����d�������/��2m.>j�\*^fN�qsnCd�;h�o{��&�n�I��7�-�?�Qo�h\#�XN���>V��\�a�ǧ���c�:�~oh��F=w2n�X����z��[��A
d��3����X�Y9Z?��[���Rm�۳��:���x���*�o�>7;4u���
H~��;�>Nq�Y�G���F�<�d���]�����R���~'��I�{�ѶT0���H�����US�T%�/'�N5�����S8z��$����TÌ�#�ݷR:��|�����TA��`�_�
'g���Al�;��{��a�`�-s��
�0�z���T�p�."���ԉ��GS
B_��
�j�o�<��:AN��B"��d��^���!�����D<�Iޠ���\ۋ�O�J�H��+�s
��=�])V��y�c%j�ÔQ�n�4Ѿ���^r`��>�/�ra��XZ�$�τ�i�q�<�S;�Ke�^�3�2&I&�B����srO�k�� �	��vc/�2Y��T��&(���JF��C���z�ï��TD��}!x�����Y�Bk.��s΃0u��J�:��pJpT;}��#da��S����D7���q�
��y+�f��M�"��c�ܡ����>po�N�
���8�į^�� +0�=x����D��L�k�p$���Tωo�/F�*���R
B3=
)���hU��:W�v�B�f�N]o�n`�T3�U�&��)�f�|J0��4�/Z�A$�֭�J��>s�M�0�c0���Շ]�1!����П�Ҷ��}m�mJ���q�O����#�����C.�$, �,�WfUJ�Z-\!����/�f:�a8iij���pA��	�<Q�4����:6d�,pۜ�C����G�j�\pL�|�Km�҆Ah�a`J��r^��]�F�f�J�|N�^���W�����on��mi�	�9[�^Ob}NL9p$��j+��d�[���=v���!d�N��~d�n��v��ϝ�}.�}�i��X�?uh�vr��o#W!�����q�#6��!��4��/!�{t��HL�]d�&%5~ ��Z.��ʞ鶓3Z�K��f��w8\�S���`6�t���=0ض��p"!U�.<ZM��3-4���^SQ�n�����֞�F�T39I҆'���sZL5˜k\OIk���i�U^x�\#k{k��>ɲ��[�hɩY�[�~�L�ǻ^7�
��4]���w�ׅ���_u�l�6�X�/��y�	�!Y.�[1����r���r
?q�-��\��8�eX���GLƳqHĥ8�ߙީ�e��!�����"��RQ�o�J��J�e���Rߒɏ)
�E���Jy�UI�d�/d�},n�2�QөT��T%,f]�,�Q��hm�:	n)����e��þ��-��6!��	h�K��XVs��3LY�&����K)�c��G�j��`kH:d�݅P��ks%�)Wc����-
�'r�L��� ��D�Ac�4%����M=�X,u��kӫAj��\ь��B��@�S�j}.�C�6�[��"_�S��˧��eo?t -�v��f
86O-q+��r>!��_|�LקU܌���T�P�����Ĺ�),,���9�D&��*��y��_Ee2u9-<$����kՉz:L�X��)m����$==�t���n��V|�U	�B�Ã4�L,i�tM�D�xR�s�B���=�@Â/�lۃ�봃����e9˼>	�l�jh<n��k��E6~oXt�x��c"��-V?�GUb��Ŧ�>�1���Q!����g�cV��R�bHh�.���0R�$�e��.}
�,�!��B|V�?(�SL�ЌIh��h7���J�_%��k��"�>ۮXg@���0?yA4�Ц]g����� +�4i�FS%�*�C[hR�y��8HxAh��A�#��_"��h��A�<�a)ip��Bk��f��T�
�F ��^|~���V�U!��t=�|:AKh��S�� D*���!DSxQ哗5cJJ�D<��Ϋ&l������`�oaK���0�b&b�t�?����h�D����b�X+�zi��di4�B�i4�#T�ܹ����!i�?����!�^��T(�>!L ��&Wl���&JuC�X�FY�}O���}���&����_z>"�<v!<�B��7��(���oT��LHf5��z(v���?�&�٤q�
C�Oj�Vk`��m/���
 {�>lz��2��#�X�[��ʺ��u�0�
[����
���[E���p15��t��ڋX��a-����k>��o87^	|4��+홆�+h���TI��}�X+�G5�wB�����
��M��yp�Y ����왕��kQ�
����Z�nT[sB$��rû�Ld�t�a
@���)�9�l�A��z�ΟGu�R;��M�m~�hb�SV��5���7��X���n\E誌��$T�<ql���:•0}�����Ή=�o�!��M۬a��D�� Io:��R	=N'ڂ��1C�8�Bj.�T��2�4B4�	Pj0�檘]�6ߞr^wD�^xa����#i���)怺��֐9}U�橜+�"xg�w�Ԧ�"�m��1��'���IX�Ӕ���N׆�Qd�w�ʇ�5w|�<�1����՞���J5��EQүI)�Qӧ���n���f�u<+W_����E����';y�!n�O��@�^Q��hQ\�13��Rߢ�V ��BO?Gok����?݅���삒�98?����શ�E�6%a�3�&E�U�f�s�š��Ei'n�Q�p�=�=���Q�y7t�*ڣ�]�>��h�Ĥ�"��"��%
<�7���l��ҝ3�
fڢ�6|����f��u���~x�oQ,�g��p��Wٴ^���]N��qE���q:��#��d?��������q����K-�^���T�*��	���	�P�S9"��(�6,���~v���7����Ա���O��ݏV���p°��S���X[Q�� ��;
D�q
��G�A�� m�;&��7�}\P�^��\ �Ü���2��T~�էTK7	�������j�5�ḿ�{��ɏ�|sDu��xs��U������V�YN�^��~��3�6�Kz$	s���?`�p�%������!�mYD0��W�#����]���5���I�,�٤�?�����@<c��Qd�{|�&z)D����"5.p��$+�n��pN9���aw�+յG�/r����T��Y��2�x����jJ�74y�'��B~���!�u�Bא�e��5���j�ՠ�����1N"������>oC8�j��_o�� �N��4|��a�!�qV����%52�	�ە�w�*y�����mCOpʹk�蛇������S�	\�rFkr�R(=���&�Q�(����i��֥��G��Q�D�u���!�Jv$�(���]gRI
�	���3v��lg'��{V�ۆ82u9�6!o��T�*�	'^�T��Vv�\�G5�8���su�}�/~����������{���+�n����6�Y�ʰ�,��%o�h]�ɪ����K�CFJ�]���&��8E�v��u\�t/�(��p̫sQ�8��8�he+����ڀ�/v/
�c\(o���+ðPf#�7oA�U~^���	�*gB��ҡ2�D�*Yԍ�����؎�U	�*���<	8�8K�,�?%�/ v���?��>��χmIJ���*n}#89�$�Ɩ\�~<,AӮ�j�CP�|+8`s:��Vn��xo�{�X<�k�M�-��2�l�3+��7��
h��4�M_S	�{F��_�������L|�;dؾ�W�+��9�\��lP�-��.}p%�$����§
�I�Lyϖv��p>�	�6�I�UT�*m���Uxk{��,�cA�iV�ϕ#��h7�4��9j�b��ůK#�M}n{+rMI��s��1O�XS�~�Fe�����<���H贇�G@p�����Aq�>�A��������jӈ�bS��������x?�H�R��U�%-c.#.c/��.z���h��	��/�'<���n������=]}�V3����(K��t����
J��??cKK��(�窾��BSNI�s�޸JH�`�?�����V�
�*�$��t�7 zH�3/ܞ��Pc}�h ��_)fj̔r*y
s����CY�̳P�)�q���.T�w@qp8�<*iB����Oq޵��V�5�u�u�@��*(���
z�
�/`���z�%3�^�ٴ�͛�$&�B$t8�3�P:^Pn�I���e�Z��+��u�A�w�J��D��ڪ�֣��!�G['���
$��<1��\�}�S�X��&�Į�O*n%	�iq2ƙ�-s���&ެ�����[�YS��{��)�����\�$a�h�uJ�E!X�ev�߼��L%�A��2�L�9V{vJ����uA ẋ0V�Y���q��x�%{�����^���4d@�4[�,K"<N� �`�-%�_=���
�磷[b�WIN^��$O��i@mV���vtZG�ʮ{SH���1{H�ސ/�#{�
��A���̃��ڈ�D��Z�?}U¯}F7�H#7!;�Q|�A���c���@'$z=�vtF�D�m��1ۿ"5oٸ���q!7f0�XXQ���=�I��`6�ϕ��~��iʲ�\EYpi�jRa�m�q���eZ��o��K��b��x�4F��g��~Kh�P�S
�1�%�h;sUb�C9��+ �$j��%ˈ�7�x�i\�%hLa�z$�
>hO��ٔ���~��k�����w0>ru���o�e{��Fx�3:�]����vtW禩��F=�w��,�'��K���h������2OX�-�F����)�<ݕ���<��,�C�Kp�I�V/n�����lH�siw�V��Rz�ژ�;4�����'-��)�U�?�.��e��ɕ"�Ů=��xM��ɥ�8nM3��ob�8�$n�	x�G$�P5��T8O��M|��^ğŹ��4p��_��]S�0L11g��o����0��^�D�/�kr��| ���ZX�Պ��}�|���F^���Ӻ�ś�3V؇m��y�d��]��ㅥya��sL�I�'O�3I���ɂ� l4��2ϻ=�X�:�۽�Ic��n�<�̚F���QE���M+�f�e9��C�<^O�eͿ�J�TI��4T���q�yO�����O�I�3k�~f�7>�z=�^m��Q���`�H�A��!=���Ӡ�8�.���cv���K�d_fNF����/����;�L�)�η�M�����Z�
�CGq6�����>�Dߪ��Y����0o�ҩK:�&����rC�g�:my�49Uq=�O]뿑�m;޲�?d��w�9�Mj���a�	�r�'��7�l��O�U��SB>�JVv�*<�&������C���;T%���6���ļLR�"埃�&muX)x�-���L
�+�h��B�G\{��55}|R�l����Zc�F��q�ޙ�'�>�Όx����C��<Q�	3ZNj�^!�êK��a�?n/$�ٽ��"-}c�]��1}�o����dZ~�1~�Ů����
��
?�b��O#"��zS�f3�wt+R�c ��L��k���Q�5�S�S��gjM���(�Q��o+(��c�F�p��v|�����ɂ��`Yx��L��oK[i�2ب���
�,(��Iu/�C�n!��ɠY{�%�_�	"��K�Y�85[%�����[���u����E�R,a��r�Y���E�Z?�f���.Q���'�U��)�k1�eb�����i�1(�^A2m�r�f�i��O�'�[�;6�8�n =�
W@S�i�/?5�認M�k�c-�ɨ�ѽ��lL��ɼ�1��bS6W�;����<�_��Ά+��$�y�d�U��l�r���;��Tߺ}W*:`^R;g�Vv��'�[��5�U�L*�	�A哗y�J�9��@�b�}�c��
}x�i��7=[�I���X����k��k����j�|@8r��{��x��P�=d���T���*Ao[ �i��
��+����s�2^Lf��L"G�!l�œ��W=�9�j�-
��LP�T*�g��FZ��
��%=i�b%ATUU��&zN�5�4Xw{��d(�oR}�3&�ѡI�I-�%@�Q�s����Ds]V$z��M ��[�A������r���{Ǔ��r�C�N`�B����y�#7bn��"�ތ9� �����”`��R6)�Y�ޯ�~�e#zcd�왫S��>(�F/�
��%,F<�H�CD�7��!X� �4��A*�h��-���L���kCw�9��E/҃t�tD��m�9�2����(�޷c#���1�J	���,;�6Rh'��c���	�?���uԗ~z2�x0��o'=�e���u��ػ8�6�������ۖ@6���Ƽk�y���Z��l��0�9|+�� ���N�VJ���<�zx��@lןl%�7��j��#�p�nj<ocjtr��Ģ!�r@$��0#3��c���I�ύ� %t�z����V��˜�x�j���AT$�o;���85u�k2�16�,KoϣA��5s��0*/n�􊣈�|�Z��Ζ���j}ԛ��sUI� ���d��Q��Is�㩯p�N��&g�W�"!�A��G!�n���ߑ�>*?+��[�iǙ�{��{�f��glw���&=��U�̲\t �Rliy�7��G��|�ηg���l������6Hk�B�w���g�Ҳz�VKVd�����}�i�({)l�����y��=�ύªڧ�iLGe���7�S��\]|��oq��"z���1��jk�ky��
ǗCp�f�V7(u�|�LR?�UL*r�?�)�������r�
S�Y�X��JbydqV�ON���;#��玶��	)��X�r�TOv,7"�.�Xq}�
#>��L�S��"��Rvs�C�K��e�d�2{3t.��j�c1�6c,�z�#M7R�zk��>ٓ�E���D$�I��Ս��y&�%sr٢Yd�XTߊ0&t�����zr����okV����5fG뿊W\M�4�9�v�������6�V߷0M��g�5�h� 鑬vL���Tt���c�'��s��on�9���͓�'��`W��n�8v�6�QI��E6�R��
�)Arq��=�+�5�������dF��#��#Qq�צ4���WQxtq�[�mǮ��1��`&��'�0?f����0_7/Қ�����R4e�\$:);�ӷ�}�J�����H�{�rٻE�4�N�Kf=���%L��t-̲ڧV[@>G��� <ڝ��Z��^�%���ep��.��h/�Y�Ejydo�t�O������I�{���Fo�/|�I���;|���7n�oꍬJ�a��>�R <*ܠk��SO�E���8��C�/:Qsqv�g9������5����	D	�"�z��J�y��w�������l���
$��D*_B�"�VsS��|T.Y�d����w�,ãggmNH)Li�1�`�V��I�d?	0��C C��l�Cv?��:���֠`U���ě��
Y��X"����9����Έ���v��Wӟ�(�����*8AL�gh"���.�VyK�N�H���l���DUə��t9�+��vc�<��œP��H��e��T��,��<ף�6&z�m�K�f�cy��#���}�R0&t�:�VC�8 �K���W4��Y�ۅ���Ǭl�I�1&0M��;)����2�f��M��|A˼��wf��/{��Ҝ\�;gW$�s �z�&���U�v�Uk5��N���'VA��
H3�i�:�u ��<L�ؼ�Y!���9h3N5$i���X��k�W���3�W_n���~>OCfzD�0��R�)(c���@�T�.D A�{^�[|�\[ɾ��u��y�`,�sݹȞ�&���
���h���"���|5%<�-�U�b�2�].�oJgS���Ȫ����$o#ѻ3�|yҧu������=0<��p��qx;e�T~h��cC�u�IK8��oB�u���yqY1a��[`���z��򒂖ɗ��*���-!�0AP�T�-:v�S��T�����C1��j��d.�ި��C��Y\�������3*o��k�����52lI8d՝��}��.W��K:n�Q\�0��4��c�mǾ�C)F5�
h;��^kl��
����t;dB({�ʙVM�:sl5�!uI5|�s��D����6�W��)�(|�SLd)����P�IhS�Qx	�\�ԡ.	��/J��^��D5fk��W��R?������[��K���M��oz�/����]��&jx��qY�Oh���v6�z�T�{$��i���B��?��OVD@��2��B�M��1l0o�����d�����K�����^HT'trd�.�q�� ��o�r�]=���������u����y���Ze�@wt�I���s�jv��YK	�˾�b\WV�O�iV��3������)��@�}a�Bk��)n�?�
i���U�l0��n�_����3�>z���Rb���;�B���1�M�=Մ�ӝ����$j8�=���_��B0lk�P�xU���%?���M�8>��9��,T/��TGϬͪ(F��U�s�L�1�k)&zm���Ϝ�*n2\ 8����,5��~�x�����B�t$��-(^��&���B{
�T����E���CC����{Jfr���=6fV�D��.�){&��I�-BV��WW1�_�FO�xYJ\۹�Lɾ�f��-��V�„a�"��x�ѳ9=0P��c���~~�ۆ�N�(�O�2�_�ْ�h��.9%�������"����E�p��"=j��z�n-�*x��?D�l�3
����,%��^z��\i��9v>�R�ԴD�k-�뫹˂�,5�<��/)4��eX��z߃��g��	8�I��N%���P]����&����a]$�L7E�~r���=W�N7v`۫mtg5W�/Jz���?��7А_�p]6��L%�Env�Y�G�uЄ���I��7�B��X��u����Ͱ��hh;ewK���cu����+�\f������>T��<j�i'0�)d�N�Xĭ�󹵭���׎L��1��i4�����ŧ�Rg���H��W�^�U㯉��QE��aj{�`L;��}�4�?�j�5Uvv3�5A�B�b�ٹfS<�Ȇ1��&xXA���gO_�s�	�c�hHO�q�)��UQ,���u��S*qJl������_-����2�G�8��8��-�ɯ�Rb�4�{�<l����[.�E���$a�S?x
XkL�}������`b�����Iś�9�%v����j֬�'�;z�܀�9�2��7��M����{6v� �IБ��7��T��s�}�s�)��cVC��J=ŏ�v�[�\
�|'�XX|�y�ڹ���N#�|��5���
Ev� �}b5]ӽx��r�|~{�X~�r�|��L�s���wՔϢ��P8&R
l,2R�
�_+��`���)o|="��ץ6ᅽ�T�	9Ը�����Ǜ�Sw�F���J-f�I=���C����+�OL.�����R�E���i�l�A(e|�o��Z�<�Mnf��(�V�R!# c�M3��O�F�(���Z:\B������w7h�bc���"�B������i���>^�O"������a,�Y����Kܨ�Ϝ��0�*�[����U܈iZ�&�
��םg~�]��_�����!�9�R�ä\F�Lr uY�Q�``���z<��y�ܠ� ��w�B_������ͦ|.Ҿ��<�2Z�r:�7Q~�]d����ڦ�Z��gD���"�Ͷ'�Vc���5?�J�ⵈ��W�a���Ӟ�_���Ӻ%�6�{v|�D��%>�{�#�i�4:΃F���-@�\���6�V0��Z�kw\�M���-Cun���Q��Q�����x�=L<}�]����<�y�1�̩�Ƽ-�1�U`,����qQE?2��=���G�s�Dx�
$��!�v�h%"n$@�H8�����cX�en���3���z_��XʞN�O���|���� �ʡ��ՐN665����bv��-3�<
&�S~�����@�<�V�N)�F��b/5�TS�
5'�9ۢ�J�ԇ���	�a�ѫw�lxW:��,������xh�řK*�ԧ���L�0�(�'ˁ������h��lq,�N�]H]|!�h����j�C{i�R�.e%��~¼9"�G頼���^��7?1���u�o��q\��K��ű�ϐL��Ȣ�2�9ȏS!�H����1#�<O0f�7�������k�:��"�qmVy���	3C=��zl���imvY4���y�DN��D���9E~Z�mjr��j�,ÿ?��۴�b�ޙ�O{Q=9��uu�*`Ho��T�<�8�`3U��6��
�0��c6V�}�Q�u�7��
T0|�aeVIל̉�o���a]a;���k�Î��y?ܻ�Q��uu�Wtfg�<7P}�v��c{o�#�v��M�w�9H�*��'�9��=K�O�]�Q���`�x9�i/E���X ��Q�$!�#B �7�B���_����9�����|�54�!M�y�(/���'z��Y�C���Ž�`��D$O�${���2���1ҷ@���w:�iw��ni��0?"P>��瑬_T�s]+��Υiq�'�Ğ��|s�#~Q�R�<Pu��;,.���̢�h_Db�'��%�e�j�P��}�=���m�+�TJ�TGnλY���{��*�W^�/zzʬ��y~��T�@��%)��_�w���<������i
"�s�"
b��{�#��*��Q��.a���_�x���7��J"�Z����_�C�aw�d̦�qcC���	��>'�m��.�0�Cm��_	�$?{1��m��_�����Fn�ͼ�)k���fb���W��>`�L�4����fǣQ1�&�o�'���_�m7N�蕫(b��	�r��W~㭦��&
���
�����`����3����E��2H��r��~�Ea~��mN�$���Y��.,�������s�[�l1PW��RQ��%s&g���s�zF6jFA�[KD�]�F�i,&�F��)��r=pZ�����H��S_EY����V��#ͿN!�B�4-Hі��I���J6)�����T媕���G�~��w��
:��2�#8���ݚ0�8���}��U��b�g,/٭S	;�����gut�G�:q��C�}q=���50V�]��\�� kO%Qo��t�n�I�J]cb�!U��d��䑁���S����g�❜h��=9���6\�Ē�
�*n��Ю�t���*�<Įa���L���;/�.��5C�x����r7[=��LN���D���0����p��L}�j��'�{�^"���}�ۀ��T��7 ��`
t���Z�-]ݬ�.8ּ2
f�3��H�j�W�ϗ�(^\��N%3�05���!wA��$����p/�Ae0�M{x?��(#CH�	%�@�d���@<[ٮ�z:wP����
Ĵ��\�eA�FK��<S�S߄���@YL�N���P����0|���¾	}eb�6WFp�깗�%�d�$��`��2,Au�j����t�S��>�c��d�iec�v�=j~o�Ix��L�fJ�۽l{�� �d��K�N6�rXD����qFH����3L#�G�o��=�K��_�$�p���*<yJ-fE߳�D
��<7�gp�knjj��Ҵy��!��L�b~��t�J�dfR	��0�l�(oڢɰ2��mV �g��v�a�W*5�{�t+VW�Zs!

���U��Dj�ĕ��DA!wS���/oLaFq�_YL1r(�13����R�N5p���+�v�%ʄ���	�򗻐c���,�f�eA�4���{��K{ X{�i�87���p����X���K�pgܶc� E�v�vŝqzТ�9m��X+Rk�y���ua'P�R�tD�]{�E��K��M���Ŏ{覥'�G�0�l
K��?f�'[��l�W"�OFE|�웍�7�	���Hdv�o��/>p倸��I�8z�C"sbM��Õ���N�#V�6���k�}�E�x(�E>B Nv��צ�N'�����Q{$Jo*#;���%���:'���!9 Ij���xVJ%��d;��&��q�%�q�0��L�+�/.�C���PH6R�-�ԡ��>ɦT�Z���X��̴�d��R�S��Ǒ�����7�G��{gl��-�k�q�n�����%���l���/$�n���	Gɤ�����7����K.p�.v-���s�P�Iځ�����z-�w0:�Ceܟ��a��
����3�ę��U�۷�J����|O>��"�fpˀ�oMd�&���AA0G~�`�$�}�0��!&��������h/Ec��l:꟎ɯI�#h�_X��C�����ջ�kO{�Z����/3e����-��wջ���m�Ce���P����C�[¿�߂.�\D��ynRإ$�gX��#����@֏_C��������{������]}�+Bv������r�J�`�e�unCZ��ȫ��Dh0�@eݩC������M��[PI�NM)"2�ڸ\��he��[�һpإt�
,nk��J��>mm��n� ��+ͽe�=@�z*l�_���p�Y�z��1qG³>p��gP����2��',�d����k�
2�r�Ѩ4�(��cLyv����"5�8�C&#�n�%k�#���l}=l
�51a�J��ؒx{ʟ����k�l�bCS�H�$�y������L�X�Dy	�
:��|��ɕSH)\^��b���bQ�u:\���*�_ڴֆLP!p��3d��R��8+��2g�B�E�i&09�fC�D'N/.J�Uf�;F�գS��`�QR�=,1�����$�O菹CO���U��K����O���A����Qs�Xe����3�&9r���
�.�ZQ�؅<����%��Xb�<�&���Q�&��	*y�\{�	 Ӌ)W��,C�f��fr
��'��<v
�(9��#'��M�%qՎQ��u}�b�4G�ŃG/sTE�5�
�>	�p�K\���=g���{^��.�����[]XO{�0���9�Ş������{.ܮɐ�
�&���'Y߀�'�z���+?X&!���$����N�ih��W�%ux����,�ij�+��qaʧ%hK�Nu�$�����P�:ߚ��[�ϒ2�"��q���7�$�,�0�w�͎Q@C��w[�S1�h/��� ���4���Ҟl���!O���b��P���	���D��������ƜIP�t�%򩱔O�Õڞ�
Jy�����t���7,��T�sO�,����G�5w!"s"z�$��a�~	"���;~i���;��9��y�C�∦����{���|�q�j	jN���w�s�0M�5�GI?A$����	�j�8<�P�hd ���sN�ƾ�DW�.��Q.���Ce���9�
�)�E]�x� �OT�$0$�v][�=
.�TjY
a�}g���4�v�	�\I�T��a�6�b�gܵ�����-��wA�
�`�O�E-��p�L��O~1{�j�+�J/E�	~�ʼn����*����C!R���u9�ľU����g��YA��l+��@�Y�Ǯs]#|!
�������YY���;o�ts�"�sK~�toA�|C%�*������l���t\㈉ P�R �\�m�}V-�ێW�q�իW��Vq#�#��m�>��[���VH_�n����H��-d�xDnh6YOF:h�2fPJ����7V��ȣ��%��'�J7��r�@��&h�	$rb�ւHZ�N^0�W;�"�A�O�U�>���쑩�B�:52�i<{�+��ߝhZv���ũ�.95�}굗�X�B�C�@+ül��H��ϱ�޽�ԩ��̜lQ�x�!�|�9�^n��M��vS�E�h�X&�2���yL�r*E����w9��)*�T�uG�}�tpd���su��*`V���V:���<�~XW�Ï��깬�N9�&T�%/�
[�&S(R�Z�D-s��ֹ@�,���c�#��c���NjDm.	3av��5�TZ:�>������
��=Fـ;[0�}g��~Nj�sԓ�ōmD�d�wE�
������_Ĥԍ?\&�|�6��@!^V�Z��a�x��||���ܲ@n$_i����n����1x�$�A�r�}U����A�W��h���
h5ɾD;O�%Sw+��^�v�|�-������-Ĩ<�m�!�	���U����+~���k�L
�._9�1�	ሰq;��l���<�Yq�)�l7��]Y�z��U�E�G����Pk��C����o����_�^�_!`
���o�vJ5��I�f� �V侴lV^�~��>}rqS�pq��&kx5+�U���ι.���/���=����bHFNnFx�!�^�M���
#���5�`�%���uL˜&��z������~`yѣ�1�3�[��祔�c����w�����Y���5����|�yc��c�Y��Pg�g@�S��Ԁ͋�T����f��nr��G<C���V6
�`D?�q�?��˴+n^���O���	�ԋ�	o\ep�6}Qk�D�uF�c,l�W�yơ@Ql��>6���O����<a)����߲�|	�@[��9=)Xr!��T��n˦��{w�io����.0���잔Ǽ	
��m�C7}�fTY�j��hT�1'��/�'n�;��������.{�r�1f�ZӉ�݀�W�����r����v�F}�qj��\(��ڍ���9X.�p����)�u�{^|���ƒ"�\(���5�|m���ک�tE������|8�x>:?shh�g�B{<��
�.p�W�9���	T�NUL�TtNt)&��HT�KӞՇ^�]�@���L�PG��[F;�,�lY�8'/7I��6Y\�hC�o�|Y���B�7*�h�m�F�Ʃ��6ܽ[�3�(fxtX�� ob	d�`��G7oP�pPB
$�C�����A�/�Ƙ�o}T�"��K@+Ô����E���0:m�e��.�27�\�ޫ�:(�E!_���[q�����93MؗT��A��<s�0W���њ�C��N<��&7~̜�'��kr&3��fQ�,�x��2ɿ�(1J�('���xc$�!�Q$���r6��.M^�\��
v?��Ͽ��6�s)9�;��^���:�[稠�`3s�f2�IL��Xbr+M��&�r�ͫ�� îl�xL��Z��D�Es��y�pԯ�Ya�Q�n��wD,��z�{P��p�&��u��D��������S��F[R�hՓd�g�*^B�Q�=��^j� 
�J"�󲂱�s,p������<j|��ٝ:��\���&qI�KZ�A��/�tUYo&KΔ&�k��1m+9k%�1+�8en%��4R/e��9�����:����>=���zk�`�
���_J�rT+ ��Ij7n��Q�0�t����*�A�4�lDz#�R����������b�Z�B��߲�`���[9.�W��ØԪp�C��p�l>�YW��J��|�?=H��c�)��F��>aX�J_n��6�N�͛�'�m��g.���'���W��Dp���?$̢k��M?:1wդK�/��:�#������ԅ6��}�iei���"T�{�ayFC;8�_��v̶_�&C��|���I����x���Z&
���)�f���=~�ż-32�|�<��cU���>����:,�|11@L}J���Ï��DL������_h�l�h�Z�,���t#>�`�~�8��^:�C��>�1۞��� �p%M4aU#��ܼ���z�ZUїɞ��5V�"��}ZVҭ
�)#�N{�v̶x�(�N�b'�_�a�3�ŏ�	�ʾ����ti��f����8���[��� ����DS�Y�8WڌI�?p���@�nc��B����=#k�dng����dD�Ʊ�C��K@M���K�~;���Q}[�ܚL�>ﺏ�'>�(j���%P��G��+$�9�kC��o��1~, 73�*4�v�����e��[��<F؛ڒ�,�ת�n�lSd��P�;���K�|mJ�i|��
�ܖ�P�}4�1fTȤ����nCd�O�Ս���ե�
�4�P�i��i��؄��ت�N�4���H�m�O�<	��p�`�L�YMn�4~��x�)��ٝ� �7A�s��r��y�a�G��Y��Kq��t���:�qdo㲚���_5�wY5��D�u����F���Y�
��O��VF�
߆��YǾK_�x���qO��D�2��5+����c_��?� u:�R篬%,Q]	��&.ٴ���lj樂d�V�#8��^�^Dr��=?����w8���T�c�_�̢*7!����LO�A�A+~e�G�L���-P#�kL��\���=2�.�뙶P��ʣ���!��f
�Qe�5��3���>�B��6��kT)�.��v�dF�F��1�džJ�b���N)�I3�̤�Bifd#�f?p�2j�U&��UNs�,Ł��祅A)/şo/���F�/��%��BS�Y�\#L���`�}����i��ӍƇ--,/�R�$M�.�
_J��2I� ̀�v��9E�BG�&
��{Z��x!�A9�[����L�1����� ����z������w����RFߎJ�w<�f]��1"y8`5�����{P�0���8=2�.։���u���d+%�$́��
}^	<?i�$�O�M��
Ϩ�c�_8�_�	�����<'X�븯�эIz�
�����<����3�8<��x�(�S��I�P��0{˩��S��Ū]�%���w-�h�S3-����+P������_G3mm�[��ӄ�l�~j�,v�*�\���ړ|��<-��
�Ϻ*em��?`-ڎ�|o_M��+���)����{�q駱�m}����V1�V��j���c���d�0�[	�|
��Y���<~H�U���Ϝ7�c])�?�=�:��Ù[
xCkB�=�-=T�]�E�nW���>�t��o�����wgnj]�6S��oO\eظ��%:�F�12����н^(�ٰ�b��_
�۶����ܴ��p�}��Ĕŗ	ڐҌ�D0�6U-�&*W#.���^����djt&���N�{Fk��n�l'u�ל[��2�hb�o5_p��K��׫n�y "��N��A��XN`���H5;ݰu)��
l��w��o��X�iݾ.�?�'SiX��-�0�U��4����i�z�˛�V�	b�O�6�A�����T&|�X�:W��f����)��y6�ǖ!S_��Hr�������`$옟�!�$�� [�(���+��P�cO`�Y�t+��ʕb��S��M��7#B`s�5�n��@��+T2N,�f��8�:�Q.}^ky9?3yT@_�����#�z�Wt���ㆲ�Ъ+Ж�E�_8u]aSev�@�A!֤/�lm�#&T֑UܯO�4�jfX!����*~D���@�@������ㇷUzȩ��Ip��⃺)�ﳢm�/ɔ����B�~�D����0]ΰ�_��:s>L�����ӕ�S�U����]4�aܾ����i�匯�����xt(�;�U� t�>������cd��:�!;}��U�;�n����1�JI�O?�19<�:�94#l���uG!Q��������H�g`��.��E�%C%k�N����ܶ�V$m���2t�`%�;�{��8͘�:F�	��sdUѧ-���׌�\o�w�z9
Ɠ����Fꛄe�͗�E3�_������Uu|�.y3|�C��|�~�5�!p���
�����6����F��G���5���F#׳��E�7�
�<�LD�T4�mk1O9� x�L�RzS&s/
?=��cVZ��d��ヘQ�p;=I��wQ�>��k5���g�M7Kp!�#��=	�Ha�8�]������zybw*7���nl�wK�w�8]��,�}�l�/i�u���U/�	���B�q?r�mb�@%����;�¿��TT8��~ݞ��o}�^P�Q�۳�ҩH��c|JZ�?q��7�
VϽB�>姮dd��X8#���eC�T�}�h����*�D`���W������{�1�Z���mc�<�MG��MȌw�'�FC���v�zA6�p���`���!R��]���Sgy]��������5Xu�oc��?2��=Z�ۅ{������6X��$A�>���s�>{���3w����Dη�/~<L�JI�
�@D"�1pUb&N�`��љDt�>��>H�e�4�!�!D�X��5�T�O*U���3x��A�u���T:��ZO(�:EV0���T�r؁���i���2�w&3[��*l6s5�4g�HŠ"AwX$v�u�����0ܻ���r@:X���~�go�Jo��l��#����O!�����M�1_�Es�&,
�
*� ��ƈ�5Fsa�Q��ꌊ(���0��a(��S,
����E�Ҡwҝ̚4W��F����f•�酊U7�+k���,@�_���CΙ
���P=��m��E˯�_�:��g�T�Θ.��I���qX�Y<7��)��vO,`5[I#�a�*�Kx�Eu�s"x���AwQDAQ��.�恡���x<Y�p(�ڦK���3;�3���F;b7����7��X��#90�z�܃�T�-��SŞ������Զo�0�N2�B�x���qMk�w,��Gtf
�a�B_��/�B�,�d�f#���<�O��[,�=5�ı���
g������Pb����V�.��SDW�v1!x���f��A���[�j�~c����X��s!u啢%T���ߢa��uRN�V_���B�KT���`���T�85)���YGaw�/�L/�l=E�0�`���ɦ�뮼O�4Kno�&�ԗ41%S�rM�z����Xe���E#��͢��p�rJ�障�)�ft��@n�B�V�T�����9J��x��P��H.���&��b��(�,�NF�����'���2�KRa�eQ��ϕ����y�)�{�h3=��'5'M����d��ʼn��Y�u�1*�G�I�R�T=|Yo'�i��&��\O���Z��g�D{}���\��+z;�,֬7{>X��	G, aR��]a$�Ǻ����a��k�`n"b}1(?(g~�����n��1�b���D�}�d,�9��4��8���l��K���SZɄ�jl#�qq�?S��Z�V���F�ʭ��Z�./PX%maR��'����*6��\�ûV	��2�gY�@
e���\�`���PL$N.���1���d"b����(`6k,��瑄} ���#	0)��ۚ態	��`��{��{��YjsfX�D"R��V?����J�bM����7�%��{�{I�n6�{жDH)Qo(J��3f_c��$�BKAj��A~����ۦW��<��\9_�4���ݢ?>�Q���D��I�Ͷ��]�d3�8�K����k���D}v�n�к�щ��e_{[�p�o-�K�1��cE�A@
�Y����lK�?%띅)f�����B��:�-��X�E�����l��/5��,�L���G�xX��$�ܲC@v���ۛ'��y�|�
��sh$bAc[R��7?��g�� 8e��z�v!l:�����u�����4���9X�L��Le�V�ܒ��=�K�YF�4i�ڮR��F���P>)h�E� �t�N�+ �Ep
���z|vś�\����N��#4/�Sz@���L��RWJ��$����tw��T��ʔ��.[@I�-�����箝�yv� h_�����pyt%O�f �opx��"�<���'P�R�L!u�[��=j��a�����>U��!߮ъ���`�=��q���^���=lSq�ؕ�������3#�LU/�"�3_f%m_�a��
��!LԞ�d`�5�q��6��g7fT�b!ĿJ�*%Ѵ��:!��B��Q
h{�p���H%	1=���
��� ���w�eƶ9��<��ەy��7R�Y�����Kv�]�H������_�'��$&q銆����6�hmC�Z��K{q�~z�ܰ }a�b�
�uIt�S�N-�L�ȤCRoEa#(�<l��>��(������)��.*�9~S��ץ��|���^��[h���,JT_I,��2uQh )�}�f���#M�vUF����k��s�Y�>x�@�J�x>����v]�YF�ꒂY�dj�����X|�^�MG��oihw���˧��OƎ'�F�;:CC��ks��3�4��lJ��5�V�/�'��u�eE�9"+6��N�����Zz�Ą	��/+�?�UV��n�gRe����O����h����.������vQW�$�n�@Q������P-�T��in�0�\pP�r�z���p�9(x#`Q5�پ��\��3���.��g�R+K�u�*Ƞ�Gޖ&��R�d�i?�r���ϻ��՘���ng�f'��'�����m)��Nu+^iS����p��j�.���6�ͱ�����&�j�!�IL����#䡐6y@��#��"<-��D�q��ӱ�)�8䤮������IkR�k/*�\ŵh��Ƽve�^����c���e�ԝQ�� ���h����f�2h(�EY�����WL�Ceڐ��D�M�^3���2^7U���!��*���Z�>P�*K��f�]˥�e���KB�U*����@^!�O�x1k~��->s�aW;9nL;����$5�(��7�-��1I�52�P�8Ҽgk��9Iګ����K���b�vf,b7�t��.�,"�n���޳5)��,,AJRa�[-`���l�>d��m�]�
�9wW��p_�=��f��q�%#Cf���w��-��Z4K��H��h۔^IG[�Y�4�ȠB"�g��ܭ�i�Q������t�5m���}{ɏ�&�-�.jnt�z�D��7~�tq�UN���?PYb�	i�(��������ظ��{d�B\{����,LXi^�I�g���M�~EWay��[��TL77]ٗ�]����N��'����&���C��F�<�um��K�ɴ�K�n
�G+��D;�2v��}+�h��fѺؗ��
���F�6`NPv�*1Q6���3&
�Dz����q=�M���w�`�����g1�O��A1�\ז��a��Z��`Sh�tγ��������F�?`j�{��U��W��9�d�+����d|tQj��+;
�ӧ�
B�!c�^a�� �q�@��QϤj����NR�����H���<$���Z�,���!:m���c��a��z��W�}�
�4�7Ɣ�Q͗�g��Rnd;�F��pۉ4ȝ����c.���^4��CM��,���0�k2+
���"�
;���Ofo�f��9לJ�j��F-��1EՊ�d���A��)���BW�����+RU�۫=�[3����(���j&7xmKxdT5U�ڀ�r�p�L�H*],�m� ^!��'�H/�^�]�
�'��/6�����	}�vɀ�4O�D~�Óo-˹H��h�a�� �E�Q0�W�*�O��3�0���s?<�����F1�-Ԯ��L��D���D�Ca�$�ufUr�������W�a��w4�c$��BH����̶XGE��s,���1]���LvX)%��|h�_�2'��F�	�?��S���PHt�TP���F��w��3���,�gR�,6��_�.��-C�Ұ�֖F�=2hI��h�ŇEiЄq����"��X�H�MXW\V3����5&"Ӱ���t2�'֤����b�8�b�������=�M��@��E�y��.�?�H.{�t�~��ݷ}�o�L4ڂAW����Y����%�*�)&�)�E4%��q�&S�um�'2-�,��{�����E2��
�!�zi\�Y�aƝ̸���ˣ�F,m������$�t%Zl+�r�ܲei���>�5�c�S�����6�uB�A�I.,6^B@�^i;$���Y�M�2���p�iyT�U�\�	�]��[@�U!��|y7#�#J�[k��NWa![A�j���]�+)�<���^�������G�T��qHN��9C��k'����A,a/��7���-F*q��3���}�!�P�
i�����N1�m˖D��<-XBel��|l��A��FF�~pc0�;����~j�_���5����T�3K�Uv���NF'��锈.)�u�j��U�l�ރ���†ßn��	���H��H@��r��C����
�����ZNj�MW�Ȣ��{K���B�73n����Y��v�2t�c5�X�T4���->"4��3���}�+h�v�=l��@�v��<��1�X�cw�R�e����$��l6������c��Tj5ܣ��0P����dm��S�l\
�7��'vt:�E�)�u��^��f~��ғ�'8*�ѩ�͐RF��0,’]�f�	��U�2=m^`�]u�Rg����m��:�%��/��q&b"�@�8�-�o�Z�}pװ�.�֫bz���>LI��7�TR�-;[���]���,A_VA����x�4��Q�Xmi�+�b���F��r��3�
 B,��l��K�vR�Smpt��
Q��l�&n�eJF�	n՘u�#FN��f�_9�ι��t˞�X�\��4K̿9�R���eۚ����?�J �у,/����x�xN��-R�*\9�qӏ����9yÔC��M=���2�����2���ϼ��4��>o<�ݦ�[��J��M��'8�!�}��]Q��UW��ms��C���_�bU�`'�x9�}dj^C��]��u��Pk�Ѫ�yCPM:&���_��
�f&���_� �&Lir���:2�בy?�6�+2��G���_G�dfONO��M��K9��z�lz#�J��nڳY��&>KФ�g��XX\0�R&O[9�p�G:�َh#��}��n�@�]��	�iJt&�ܻH��$�!Q����x���R�Z,r�.T�q$Ue��Z1|�)X�2�,j��q4�BS��WjļS��m���^�6%�DR������79���5��
��ƍBt�Y�|���6�A�=f2Z��[Վo���o�
��칻�����˗t�"(?j�c0o�MiU�m�47����۪SDg�=�:�+�N.˖*s3�]+	Gx�~��>#�*��1	7�A��!�������$N���z�^HK���o�i�[Y�:+0�&*���AF�]C��m9�#$��L��T�s����{񺭫�Wk�
d��H��=������Z��l������{��,��+Lg��C��"X:�N�/�6G{�>o��r���QgF�/��!�`0�Y=�m�*׉�)p�h��
�<yܱ�<�q��	�,��kM!�oz�U!O?XM%%kO\j����m��M�7������0�ʏ��[U��+/Y�306�����0�X�x$�D�Fy�Y���։�E��Y����-�˰�.�KW��Fd��a2H�� �S%�\���eg1�l�Xcly�0���{�)�L#��B*'�g�05�fFd������z���Ds��9��ɚ���Ҭ���i)�4�֍���C�}������������\�,k	��;�x�����5�.��=�y�qE�01&���pAƄ0Ab��5�	P���u+΍����kU��r���� �tW�AU�b�u��uV=P�W "9~N��}�k�j�����E
���`���.���Kβ�~�Y02�,B�<B���$x�J�p	mɹ�|ߟf���ĉ��D�]��>/�����O�	��=�[/��H���u��\�����S��iy\��I��[�x;Q�G��e�9ԃH����al����RX,xb�����䦸�"��/�}��7�K.J���i�����߾�I{c�`C���C�Q�E��$�72��f,��Nh��B�և���-�tm~<c=�6��<dm�R�e���WmF>f���F�sw��.���I���a&9>��������
���K����30ܫw�oi��Sk�4��J�+r$"HAM�����S��{z�{��3a/�c��U$}`��\��N��׻�N�q�Bٛn�%�lbg���6oq��q��l�N%��8��f�VC�U��(
M�b&qpӥ�@�i�YX��+�xo
D�KK�j�*�q�<���!p;��R�\�`I��F��KmKi�u��:�_:�=��<`���M�ZP�$�Ȱ�y�l�%/���s��7�&�,��Eਈ-X�Rj9��w���N?�֡e&
]q	�1x�zE���G�8\�>��}C`�}QS�~&�%mx����?h��X�\��vހ���Y�ЊfE^�쀙~�:1�5%�'"�����~w�M����]��q�TP_�Sy7��$��6��1�5�g���ܸ2%��C��}�'q���+`5˿�Q]�����э������-�f��t
t�Bs�\_�W�f{_y�vhA�>ke�a�����
RRw�Mi�Ă��(Є��!P�)U�l9��,C[���ţ�[,�����NL����dc"��,�$*�*�YP��%4����pa����!��0rw׆����=��`0���=�)�oƮŖy�|��~�e�y�p~��7Ns���׫�����
\���(���N�P��#uL�x�y�<�w8��3��}��9����lq��A�W��}����^mMM�H�N��Q���'e�.0J�u�;4����I�Ŏ���>�]+��ŝc��1r�{�XA�|gۘ�,&Q��e�Er!�;�W�\
Ћ�}8P7���8�Y,6dъ	8O+��u�2��������zp0�(f,�Ü��3�d�FΆ�U��Z>����_�����P�D��5Z�����8O"'Ng�Ca�����tN��[�����f�sՂP��-G1ח�ؐ
�B� �т3��!aȞϿ��x�5EN����_���'L��j���`~)}�d��2AT��T�޺��a�g[C�
��p���؍���Ú{����z���<?f��m�ԛIڷm(S��@{�`��d,'�
�ݨ���g�S���̢��pa����;EД��,����ɲ_z<�����YX\��*GJhl�+7��Ē�k���5|BO&h�z�8�ULFp�ZR2�‘��^�����rgj�x�^\�ퟃ���B�%e�*l�������#ڸ�z��
\A���!�B�EN�;�bF����t��ćd�#�?nhҘ��y�E�;�쒞&p��}=����}�LYfz�<S�������C4�{͋>N�H�nQ\8�s��kF2�d�rnj�ؐ�~��vG�3RF0�o�F�{��x^�&Q_r"�kAmc���߉~�d�ʔ"��<��
 �n/qV�;z
��%��Ổ�_9#���|���d�� �X�%2�J��9�WӒ�+ٚ�]���ȑ�+`�*G"1oN�uT�^J$Äj�Xh����YMq��3x�5+��b^�X.�R�ǃ���W��7�jx�.?ڕ[څ���
R���
_��H��^����~�O���a�[84�+$̷2����rV:�ƃ�XX��S}��Ftz��/��ܘ,�,�$���ד׈�%�}��J9�"c��2ٲ	�M�*�bMB�+�^�iw����D�l^�(Ɋ�5M�¿��×U׿_��_5�t-���q~�i�/�ϫ��*�T_E����/ֹ4�}gO��Tt���#�X 7F��	 [0�>��l��mA�Խ��\�����|r�Ɂ��G?���a� ��.I��6%8sk@�
7E+>3���8�{�]dA@�tJi��j����I�G�q����
[��2k��"�a�Ÿb=1��h ؎�y"mCl���/�U�7(7?�D��>.11�U�H5����.�;rB����	2�G���tp����(f����jR]�2^�H�&-����7�]��;%�[�_�3}k`����y|�h$��R����[��U�퓿�:^d���4��J���
��VgCq$��d�=����C��z�U��&��H�‘��J"X1�aq��ݩ^�=Brﵣ3���j��ѐ��cd�t���87�S"��v��|��e��Ȉ�F�r��{�|}���SL������/���e.jm&\fy.��
����(��XL�&��u"�F]�7�E��p���y���GBr����3Ѡ'��F�B�2#��Nĭs�Ac�?*s^Ϭ�)߲��~�[�n���?O=�yղy�[�]���������aeʒ�J3@�&>��^)~3�
�e}u��d�������qq�`u!�/3wyݡaagN1p��^q_ctY��� ����7����:�>���	�ﲱ��<�^o���Yh��辉3e�8"��[.��^:�q謊���͜\:j�����W'���
��'�8^�6���`��>� Zv�:�K���r�K�g���!M�>U��j +�)�u�&�Y �!U��!�N��ysn��>�p?+
�"=�w�0�鑟{$�����1�%C=p��V�X��KBJ�yPv��H��&�k)E�=�s���+���"�^9��W�O�>0O����R֞��t��S�}�EX���auȁi�#H��7Ztp�+�/�pt��oRW5q�r�~�D_kK*�{{;ծ���xD��q����3\Qm����2����?���b�I��x��E&�|�2�M̟�v�E��C�!=�t�lJ=)�O1=�F�2��Nu�e���RJ���|)�dUԇmk�ݱ	h�>�j�>]i8o
����%E��.�ޮ?�_V&�|:�zQ��pB�߄h�=)��bF�
�HFp��[A��G1K���m�c�4��ԂQ6��z��(��贕�����������H@�Ճ�uH�� ��%؟T�ΗV�3�gPO	�i��0YJ��ߦ;F�
�V�5��鑭h��%X�]8�/�+ep$pKdzK:�{6FZ߱��c��l�g�h�8f�3�^i��Js���H��$�d������쏤���Zۀ��f,g�b�9r֥Y��Oa�"/�Mړ��t\�`�g��Q���9v�+.�m��U<�QƗ����[����T�͡Xe� l����������|Cn�Qc�t{���+A
���	:�2��3���3�V�i��f�7��@nh���grW	�5`"�P�iQ���T�%N�RnWC)5͢�G�0m�||�f�(�][���zK�qEeŞ׈�^�$�,�gC�=>N�E���ުB�_��%��i�P�߄Ɔ�`�yMJ��߬��U�ֈ?�ZG;�1�5��w|ui��5�:ڨ�ުd���{׹�.��q�2�V�fv�*C,'9�(�o��Bb![5�$X++*���u�X}{5��<���S�%zXՃ'�e�����T�R�^�H3��������K�ml6~xC��_�P0�A��?�%��;O�>{�
i�C�n�}]���C&��;��Pii������3��ቛd�Y�
 ���;?}��4پpCc*(|U,�yH����.����*��g4�U���,3�"��\�mi@�^vm���2ۖ/����m�3� �(�=�g���Sˏ`I���@E�&T�>I|��Q�+k���((9s-(��zF.�<�ew��T���~DIZ�$4
H1]���{�b]t8M$
���U�b)daU�N����c�@����On�&a�����~y 1i��no}�z`@�]zqmG�T���w6)^��.d����ڏ����i������𵙱}�s	�\!z�X���ֈ6�֎>U����ښ:�|,1]{k]�;4��#3�������n�-6ī��N�|o<�;�q�ˑn$��Ad��7�Ḃ#qGqM�ӧ��x�j�s�0!�P{���M���O��o�HY�3q��htW�
�:i\��X�G�;D_$�vmu�����ܶ��¡���@�Q�v;�D�Sj۷~���JJi�K"��c�i������͸Zk
;3�ir{m��K�f�W�͍�y���0���O&c�G~(3s;�3���V�=T!�Gl�ENl۬e����g�
v�ڶ���Ty��Kq��t���U���e��O}�레_�k��)�0X�������݀�"�S���%��J������]��]�KO�-e�䐌_�?��U��õ$���������Hf�����k&%e1Ie��0i�t>pzrb��j��w<yx����a��	Y�l��(.Et�5��8J�4��'6�f���|U#�eWfWcʀ��r��t`�p�Gu䈁��M^��$DӶ���c{��x��_=�����Q��+i��|MbV�L�M_b�A�L�#%�Ț,�ՂF7jZ�6���TĻ�C~G�ۋɞ�#�`�Ttx驕;t}Ye��@@����Z,���FJ��u��[w`�p�5�e��������^T��[Sq)g�ˋjаbT&�Y#��J��ʘ�yޥ�v�3�dg���eho��������:�}�Ϫ�d��I��%�L�7W��Lʞ��_)���2i	��8q�w��(=�ߕ�y>��:Nx��]�h8�1
��V9����"r�hX}�f��'��8hz��U��#~|���o�i`�tf��j�w++I<;|E��p֮cL���;�W_/�5�M�A���VӨ�V2�LfP�Q2<����ª
�y���7$���Ca���)�V)ȑ7�ҢJ�@(~}��9E`J-���6��`��^;+�J#&��
����/h���o�3�v���un���6v�WD���iT�YR�|(@
CO?���!���?�:j���{:�4���)�S#1}�N*n]:���R�(o�e�<�Uq�w�*S�Juÿ���5Q^��T�?z�U�_z���dj-�k�Ƌ��e6ҥ�uJ���,�O�=aI�����1�%E�D�)B$o�y���f��R��wrU�f/|��7"�>�UM�R�{��*�r�~�EM~,�6'!ɠ�ϳ��罐s�rIE���b�b༠��
��^��_�����+���].H5��o]O�.'��H{{l2�@ڻW��O�J�Ψx
'�M������,�ϴ���_J���k�]|[?�q��������@kȩi�xK'+���X7M;h�(*�sn�����qd-�-�q��]��<HZ���	7�l}�d�O�Zk������.�r0{���&�/Fv�?q���iS\��d�ij0c�|�����Z��y�~�Y�Q������u�~ʖ�>֔���O|w'el�?�8�@eđ�i���6�����o�p��\(�*�Ͽ8.6.A_�G�[���T�|�Ş�/�wE&�re6�Ƃ����U>�gN���r�:�,
�^�k�&)k�7�1Bv7���M�jS��x���]þq��#U��K��Vl�a��Jd��q�q,�Mo�=e���UƢ|<w9�����v��1��\�u�(`�X}��<R��7�T��<�~O�"=i�в��l$�$�s�s��*nυ�\n����
��QB���w�w��]��oi#�t��/������	�g1�C�6е9?����q���FHB�I`�}\����dkyb�ԀF����h����$$�k%��Äi�#�#h��>���h�NSM���@F�;�Zw����k
4�ƅ<:��'�ɋY	����3�`��*�j��<g	�<=�1�[��fȮ�� ���;A���m�]G?u�
�'K�Aپ�@eZ��Z��ac4���X���E/%~���y�5�\
����o�;E�B+�L*	/��2�^`t�]��팢��h�i��1��`jt6�(h�C�t"A9j�dc6��z6�8%�A��M��u��.�X��2T�,�C\W4�O�k_��2�Q`,N����n�2=η��q��qs��gh�J���OQ��b�:{� ��-��Q��p_�?��rҚ�����m$��7��7F���j���]2{?ދ����R�ģ�L��u�~Y3���e�c2~�=��n�ܶHb'�^,�歬�!�ܾn�X�6�q��S9>N�N���3�V�;���fۭ�ur�r��o����`st�َ^U�jv��ۍ[������V��m�f�nȮ�Y��-q+��J��2��k�&6��ͅ�	wq�/�H�c9W��Xfs��3D�Z�jNh��� �Mek�oe<z�3p�SL$�wɄ�6���e�X;�����k��F��!��s
���b�+�->�	;�^,%�Ȧ,vňͥG�~��H�y���̱�9A�g=�T�ժQ���
u��:VH�Bes����`�*����m\ׂZs)�XW���O2%፸���w@���$uBE>&�@��^�H����\R��0�X�>��v��2���C�T��.[MSU`��N-��;��RMBuRr�UUW|�b֊>M�ˇ��)��p�"W�.��U������?���u��5��$�^�O��?\�������鈚o��ذ��Y��T�[M��9��}����3c��G:���KN��ǭ(��/��9�&6�I�N�
8�p>~>�J���e����yq�����b��sT��G����hJ���^J��p!w'��`�2�����e���������jy��ܗ#�]�1V�wtk��!̕�+/���S~j�Y�ޤ����;]nXkvw��ȦkO�+�&��m/��*I�6�8~>��j����m�u��7<�p����@��Us5����F\
�Ѝ�'vle�	��SMd�w��g�cV�b-��܇#3�ɷ�oa#U�k@�H'ck[�as��f�\^�-���a�KB�J������R�:�+�n��
gh��7~�=��g�Nv��cr����DK�q�6lλ����ܟ�$l���)&j��c�܈+�0������nja�K-�y�D�x�
�v:�>L����T{ƽY��R�p<�$To��3C�Y4�i)��N�F��S��ē���-�W�n��Da��̛��2S��N����4��΂6$;8�{�*uw�p�~:h�87�{��g�(�~Ҏ�_�ԖM�T���g7�;�
����j,���1���![M��L��r�C��~]��3�k?-�'�kV�D�e��d���2��NΏ\��B��kub)�9���ٕ�V6�yO�ٹ��]_E�3��B���v
��l��O?Z콈/1��ޝ�<��8"�K7��I@%<}�GNbU��#bj���d�4b�s���,,��D"����c�ʌ��n~��{7#����UgA=\{��e��&7��1��4�ZgUT�V&s���N��Q6�U{��ئ�޵�7W7
Ҍ�p^|���5��؛oX�H�,�/�0��D��a�ݞu ����d
���Ȯ���:��
]\�XG�08ʌ��v+��.���7��.|���r,��	6��ə*��)�� ���7	ˠ>��^�4:Ì�k��=��S%�w�M5SS���K0Yu�ڜh.�w�����ad�֎��i�^���+���ˏ�(|MP��MA���F�.�oO0{jG�Õ��F���c���v�}�����B�q��O���ɏdP����gR��^�km�²�r4*�ī/q5�c�͂p�XO�ӕ�c��W��ˢ�{���$q��%���8�bM��:�nF�۱f_�B���
Y��EOG��C��i3��$.>B4<n��Wp�C<ʒN��g%��h)/2 ��z�3΅'�����y���{W�;�7�r�ndH��mf�B�屼l��0�U��!z~iʜĎL�_3k�5��Ǿ��sq��]"�+�f.y��D���jAi���q��OEΕ��wG�d:������ym�ݟ���ug?E^�g�g��:{�$�z5�653K��Q����a��<7���m��ܙ�Jɾ�Nы��P�)�q�lv5ˉU�ya�N��k*f�;-ϚԵ{ۿ��~y��Y�s�qі���WS��<2(�}�*�ը)�AI�ܕ��o���Yv�.O��X*���]�3�S�^���a5���1�N�\5��d�8�>X�����j�+�����nahS�����p��c�0j�/^x�۱��b`ʒ
�p���1�ɘF�Ba��E�%������ukCe
�qk�|��\�v��υ̥���uKH���Ι˕���]�%�Ə�?^D��Yۂ���yX�
Sל�V�V<��R�&����P�N_M�b� ��g�!I�ͷV+��u!�� �!:�3�����‹ɓ1�+��?���ܪs�q�Urߨ�݇q��h��[��j��vrJV�=-vĭ&�<��C��JxD �%>��<bgp���l	�D��W07;�5ahz��ܦ��Q�-z��0��wj��/���l�V��r9;e����淊o�稄q\�Y�7<��B���ὕp)�|��D&�,ɸ&#%��Zڳm�Z�G�IzY9ԧ���
���S����~s��q�!wx �m�w�^�42�
V�F�����!g>�{��ꯛ�c7r�
��g5ު��d2G�i���.k�>��,��xh'�6��7�c�xE*������sFY��L�� ��s�~�9�3����DwG�=<���|%׈Ŧ SOj�?���XJ�G�ߟ	��\��\���	�c2ʬ�A��=7�=����N�!�k����]�X�#���y��#�҂eJ9��N"P$�;��0Y� vCӉt��&,GQp!&]����W�=~�P��1_2���XBPW\�$l��ͧ<�ՙ�#a����lW��Tsy��+_,H۪.6��/��M=Ei���N��f-s�ٝ��%ݴ�<�@Յp�����<�_1�����<����$0_N���tڸ`���dJ�Iՙ�8,�ʦ��."&�ՂP���C�[�&�l��NjƵ.2���m�y|e=�`_6�J|�`�j���򖭦�~��|�7hL8�L�>�Н.�X6Ӂ�c����'�sD1���ʌj��99%�H�����d�z���
�w@����T��d���{��n������ڭ\��>�40I��k�%����fq{�J����=dn�Vt��P�n��;h�e#H��'��'2`H^H���ԁJ�=Q��?�1hE����A��c��b��\mIu!Y�H�>�䔡������eXK�lx�}�t�Q���-6�o�GH��i���cFL�u����\9
��j�J���fG0ٜT�X������91b��~o���76�B�ʎ\}_g�zb
=�A�� :7wQ<��?�/T��#n1Z8�^�֙=&m���i�����I��>җ]�,�\h��R����>��Ow��P�;���.���̒���엦�Jb\�dX�h����f( �Gt��k���;�
���M����C�=M�Z5f5)l�!iu�g��R'f�Į���^��bmb�����"������xL��ӞDZ��:f���b��p
����2=��u����d��z'5_(�,�%�J��6P��2��c�W�����=j��.�g񗣙�|�C�y�w���ͮ�
�i���Z�m�ا�Ft��]��2yMn�g��^�
�fڂrs�]w�Yp�ћ�Ҕd���s9f������w9L��Z��@����QzN��TQM�[���N?Wg��`Y�N�{)�⣒A�>U9��:,>K��F��V�{3]|����b]C���{Δ��Htbyz@�4�QV;Vc�ҳ�g�
�YR�!�_������\Y���L�DF�2��}i�JWh�b���)��M���!��t�!�[a��	�Rɹ���	���$�)W�ӧ��UBjK�)�AOFA���Ě�`GO���ʘ�9�:+2�᫝f���Bퟁ��E)�q#��[n�%C��)��5x7k���Aо�[�b+��^��&\[��/$������G�l�-���T��&j�
V1v�U� &�uIq)e��{C�l��틸E&ʼ�6�,5�Ԃ!����?բ�0�5�k^��a�T���W�<�.��8�ɗRC�ʇ�!�y�^=^�N��cvc#uo�u4�7|-�֗��͇�X*��a��9��f�z{�8�%�9�*Ϝ�PU%�g;������WR`6��v�VGŽ��Ҡ�GÄ�#R	��؃g����̈́Z�<_�Jlb�-|�W_郩T�ڧ���g�(!b��Y�jU�-����1~[�}�hn4��l�Q6�L�L���#��0�h8�>�6Zt�F�/�#��C�o
a�B��I1�K�8MO����M���>�k�\�Ml0V+nҩEGΰ�=H֦Y�m��jW�����Ri�
�v֋�s�Ce�@�>6uki,��c�	?�7��i���E>�o�%3�����;�9M:��(7)�He��$�H�4z�so�r��e!�4�d�v�½*��!b�G'|�4c���3��1�4�,n����YK�����-��^�j���P~�s9y2J_Ŵ8�ؙ�<J,�t��9a����+N�����D2�׮	v�glj�䮭�/2C����:�s���XL5~�Qg�sOV��08�:M�h"�$�e�j�M���&f���}�,-OsY��+��L��z����HM+dV���lv�$*��R�G��F����0��)�霵!v�AB�=�x��;)��ç���ᛔ��Oq����/5'?b�����-��^4�%O騗���W�X�B�b���#Udzq�h���5�)�d��Y
K�U�af�{q�e&Սr���wڞ��v���3��н1�N�usݻ�6��ob�ϐ�%G���8r�6^gc	u��0�s8I�G1'"-x����D�3�{��s�0���f/�]�S������
�Í�Ƽ7�v�5sn��tzt��(|��H`�[���4Q񙽇�^9��~/g�,k�(�)ޑz>6dc2K�|9_gRrS�`�mLNy�/9�z>o�q��l�K�7��I
��nٳ3H/<�
���;��u���iAO9�}�߾�s]`����!�g�JU�o;o扻_8�%����xZ��E�G�j��E��`&ךQ��rE�s��-7�)�n��|Ѧ�6߃���D�=���ӑ�L���Z�	�wG~q���L@���<5�A��_�{9�)=��Fv8�
M ��>�U=��9�A^�{�`(t4��6�v*w6���,���̟í���G�6}�s�|�B��vpϴbyJ7[`� ��0f���N�b�T�X�;��m�e�����N��#: ����='��^�O~����KR)�d��K��/�Q<����G_7|�gњ0q���(J�#�� s��ޛ�-s����%�����z&��yjc��=`O��� �Z�*>���X���,R;�;��",?~\�$�|�����	d���P��k�v�so�(݂'�텚U1�nq��-`������D������țE�&\��o�)GD c~����^��n��Y��	�D#i���	���Ҹ+��w\�nF~���ꑬ=й��G�+�'��y���� v~OH�k:q&��-�<�S8�5���_��~և����g��<�p��=x��R��
ul�bpv�(�I��(�H��
��{î	�e���q�'r�3�rn`0̘�td�ߌ��U1�Yyv`/Z� �UU�$�ˌ���h��5L���<7��mIY���YV	#͛�b9J�"

�qE G��%�C��2���2��Z�`lW<a�GSs��܏|5�u�F���nk3��4E;=$%vU��T�n�>Y�UH��W�G�sٗ���&����2Z�
�Ӷ������SY��R���M���o`��z�_��9��7,22�C���(�%�%�Нo{�?Yݵ��Z���h�������pEc�}y������w�������o��NM���-{��15>^��ۘ�#����?f݅?�w����#ޟ
�X��D�s[�k����t�q������$�q���u�����g7v���r��Xs�z�<�_?���O��٤��҉e򓊐��Ԟ�N�eГ���?���d�*��t��-߽Ѿ㼻�r�K3���+3e�k��i��:��2G�X�کC���.���vҜ��C���~=9=E��-��;
ӺN	������51����텮�� 5b�21�k��ZC��t>��d�P��M�m�D�\�o�ުІ��rO���2��>��?,�k�N9�%�\���	j'�uq�+R4�٧�E���$*����~��$���*;��-vX���:rS�L��Tk�V��{����^%[�nՕ�:����B������"���i}�fth���
.-�~��hK�Ƕ��w�4�c�n�rc��v\�Kwvg�3_�6u��=K�|F�VJg��l.th=���5���ӓ���K�-M��Kwݴ�Gt�Ԇ�s&���/�r�׫h�ukexg���.��Mf:��ijz5������yεcBr4��yό�V��*^���c߷�:��t��;��J���Z�M^[����&Z�����~A�+��܎�ߩgf"����}O�1�ҿffl͙��e�/�2����j3Y�B�e��^���1+j[X��;�ަK!��dK�M[�T��/29	9��W|�J�Xmal�ЎE�&m6�Ӕ�~�ޕ)�J��e�2���t�.�l&`t�Z���ٜx��䙳ca
2�Gz��tEm�!v� +Ǥ�ތcB�EJ��/	%�bP:W�osd��\v�|��̜~�Z��"��:�CG���y��%�M���z�\�~�p
�g�~�9�����&�3pz&h��͈��
���d�
�ZR��d�u�y�A�߫}>>zR��_{ۓ"1`�AO
�p{��͵X��i1��R�9ұ`���Y��⒮�V�r��e�(�o)�ޔ���;}{��.l4�j�,���5<�=�m�j����rN�ǀL����JXnB�ys"�	7;l͙�[�/y*s`��Wy•f;�,qQN@g��{_�c�ƹ�-Ǚ������n-ь��&�_JZ:���+�mul>���V�3�^%��J"n�y�7�n��\�)�kv:�~��'W�2�k������+�Z�n�W�8 l\\q���{���q}��<d���sM�B�0n��W�U<rT�M�I�,�wϗ<,���W�r��j*�j �|�'[L�mĝ�›J�퟊s�z0,�D
%�'
K )8E(	Q_̡oa��t��&��Qm�h��X`r �<�
 ����d[���:�j|�PŲW�ȩ�IS��2�5>���I<L��-�W��aq�f�"��.�O�ܓ8rW�"���T�A�_3��Br�B��7���;�!qoc�U;��O��^
��Y�u3��/3)�ɫ5��8J'r�Q+q�h�m�m�O
���� ^�S'���A�\��ղ!��Q��z|����@g��Mz\�3��)�lPB�-D�z2��Xe*P���í1֛��#VE%�f��홏�M�~�J*�
[���7d�o����>�J�9m�b���a��1��Ʉ|B��*��-�D�U৤�Z�[�u�OK��{7���]7O�e!�R�uY��*��AF�|]+?��"�(w����wm�YLЖ(��賗[	���FA�M]����^>�
,w;5��k�mCC���lb��[��b�I��n0���7�C�ߓ)�j'�{rڟ|�o,˦���:�����~=��h]�bh��P2���53���=5b���L�v���w��G5�rB��@���i-ӓt�W�e��W�)��ۂt��ml���m����	����k�����M�n:�"?k�.�|�X��0ȝ�`ii���ic���7|F�D{MQс2��ʔ�b;1����G��'m���򫡢Ql?�/r�RS��R�Q�Z�Y9�dn�ӻ��|�_�9��dJ�[�4\�/q�����61c�t�IȤ-���zC�8�Ί'>z`�h�(r0^t2N	�b5�ݶ�h
�B��"��S��*f4
Y$b-��}]|rs�ZԖ��z63un�;�|�o/��K�O%in�`���7�Hl��y��h�j�i�9gX�m7!|������l��P5KI�H
���\Ȁcf�;�8�T������2���?��?��V��y`���PY�[�̫�V�ìQ��.ۣ��{�W��mapX���Yg��l��8c1>Z�O�q����q*���P�h��m����)#~�n�˦��L+�`��;�t�ϲ��FD�(��d�H����D�@��'��bTt���;�G�q��\������p���j䟋ݞ�|�Rh8	��K�3fj�ek��ƭ�*v��$y�tw;��k��s��oߌL�s����L뮊��
c��,�-
0�MTڅfl
��&q�~O��wI��w��%�@�h+R�.�4�/�Qbr�3��$4��)�Gӻ9Y�2���}�d��`�t�*b
�3pU���IGI�c��.�Ǩ1g����4����34��m�n-Is�.�_OhՅ�
IH� f�g��O�2�9S��@\uI9(13�A�yN�\���Kyud4sQbnϫ��Ī07��ˣ9���'$!��M�(�������XG�N�a(b��3�ty����o�d��$S\'ss����(��Ü�5�Y'�2R5,����?B��W�F�H_ ��Ţtd�Eث��x�7��Z��R��f!��Nڐm3�י��Ǚ%h[=��c��Z}�;��+1����О�S�a���R�ej���X.���ƴ��jS��iO�i̴��0����n�_���{�Q���H��,E��(e�h�_湟�[O�X�f�W�8]�z�i�*%��R04����q�I�7�
1O�~��ڼ@� ˱����r7�t��b�%��9��7�r`�Ķ���S��]�Y���ʹ�36+�3��]Nɞ�P��A�A��eU��X�[�#S�s)���l��R��r����Dq�U�P�Q;
�5dz���Fw9�����_��Z��+�D���� ۺ;٪5x
���'{�
O��	�?bL:��B�ăo�zQ�Zv��]����A��V,N���稠��3�8�&`�e�Ҿb��D�Au��̢#]K��,�;��DL�n��Dr�;f�5?DU�zP�׽����3����kC�����Ӑ���b���heט��IL�sE�3lֹU�����/���40�*��a��l�%�>|�iV��ijS}�C��xd�1Z��%�g��D��q���Y9�3��b�J���q����j�Ǯ�L8���z D�\��X�)�������-��s���c�=s{��O�:дfu��ߣ^_qV���50�ی?�oБ����]5�l`{?��ծ&"�;�Plx�xHj�p�`�����gj��l��:�#;��9$X���{�?�
����+�����W;M�x�G㤏����?����SuD��|6I�iy�
Tn$H�Dg�ܪ�g �]=��6��O�B�6)D�o�c�;�@���Y��M�EW�NU�]{���Bq�T�ǎ����O
��/3��WC���ݚ�o�k��i�į�g.��?'|����"��5R�v�,�8���K|��	�\��[�}v�D,E�W

įf0��b׀�K^�*�!3����d����a��_��â[;;��t�%����%�P.�I������5J�8!M��:a%����(lZ�2Hם��49z�!3���
�D}��G���Ά�M�����~����j���S�O{����b~�)~�3��'+���.[Q�[6��-���/���6c�3;_�i���U���:�T[���[ce��JU]�� X����s3*�	r�>`m���t-�;8����Ť)�!�$�"���x�A��fkU�K��[[��.�Q�lk��~��Q��W+ߗk �x�1ʥ���>k����k���[%t4"5��æ�o��VT�#�7��6Є�Ƚ�;�8�����kP��2Ca@� ��2.g�d�@���x���=��a���w���֟�{��a\7U��I���<tׯ,�
�X:�v�Hڀ=F.r��#6�p�^Mq��|�>�~[~��
�?E��e�od��)P���ךU\�V��=���{�~cH#��	H��,�ޝC��w�-k[A�e�=��WSi %���]�O��:�.������������*�{��Zo��J2�p��O��&Lg�}Sƚ�*ZR=�;����p����%�]���7׿��5����u����ژ�U]�
��g@B��O��O����V�mٟ�k�o��O�7Q�S{���
��w^�V���gW�Fd~�D��o0	���⼸Ƹ���_��.9�}YIyii\iiI���zJ�F�+��e_�y���8�>��ؗ!�ب�@�,��%�=aOK�R���s�VR���&>ڇ`��Vҫ��*���Ŵ��y:�f�"�N<��՜��N/5Z�(}lA�¡���8m[�5W$�fu�����Y�	O3���p�z�>V���)�43�Yz��ȶ#nJ� �T1�.�����o�L�`�t���L�$���3��XL��_M�wR/�B�10�
��0&8��ތoB`��թ_�>�U�}	�]�Q>Bd;��!�<S�\��5N��#�X��Z��.!�*�0���1����Q�L��fek^`Ό_
cZ�h<c;yb��།@�NoI(������z��U�{!���f����٩̨o5Q@�ʊ���ǐ��:P��
.b'��إN*b�J����(�P�4��~��z%ՃH����]�H����KM�-l��@6���!�)�9#8
�ǫ9H=`����`s��o��lo*z-7��t�����T��̼�����n���ِ��J�z��@͍b�m��-"2���l���	!��,@�--42��|۠��YL��v��Z.,r��S5�sC�%����1S��P�jfA�J���F��6�-7�´�_�.��o��0Ω��G��S�,�<�J��T��u,J]�o�?Zb��6O�gڂ�섣~���(�9��:Ӽ
����g��)+�
��>P����wP��f���eN��r4R����S�g������C�b�
x/сN�Xm�D/�S��q~p���L�1cRe�O��N(��$j"K�0i%�R
lS�B��X%�$����M̳��Em%�1��/,�"R���-r�T�\I��T+�R�L3�>�(��)U}Y�O��0��i;e���d܀qjC@�W�P'�ف}�Xy�u�M?i�j�im�2�o`;��T�����ll�w����ʷ*#����o?q����n��#Z�̚<~�w��F��e�zX
K9v�©lF9�m�F�����Bnɿ�f�(�H��D�T�ό�aٔGFy�5�_-u�k��(�PL�2f�����Q+sZ�?���<��x��!��ܱAV\�hx�x�Zͣn��ѵ6���X� 1��eW�*{��p��(�Lbg��tyY�5�R�<�1g��(-�IƁt������(s�51H�P�=Ø��f,�N�P��ä�~:]�1m���t��ʻ̚H����C$�T�G��~M�:D�� n?�-�m����U���dd�mGЩ�h�C�f��k�5I�c�[`Zbv2�b�W���B諧�89�nC�PH*�<Pq���4?d�b
���u�������ܻ�'J��r̽�n�4��":,y�rs
;�#D����
ޖ����k����l�j/�*k9D���b��8��g�9���N�NybC�2������l���T��T��6x��9��!Y\��]g5�dl�K�4��FF��3�n� ]h�Nh����I�f��R=Vz�-H�|����Rf��Q�x����E�:a�)O �y�ud�Yr��[Q䡸�����$���#~I��ByTų̓���H�gð?:��:����C�@y�/J�eȳ���w��%|v���(�,���W�e�����C�Y3�U���w^�� H��"űG��s����e�� ���EhW�ks�~��<�]�?����ҙS��7�
_Ղ)�{$��V���!���:'�
Ԃ3�X:'�`njG�Kn3x�|z��g�c&�(�����	� �~9��r���i���g�YV
zj�ࡑK@�21Fa���m د�M�M�$���'�1���&}�*-> �
��?�v���m?��Z�g�
�Ufb}ԯS��H����R�C=�5���9?b��%��h�#���Hθ�K��y��$>|`��x�~q���������ס�q~}+�w��J���7�o�w>/O�S|��v�:��1��M
%�hi��3h>�s�@�������]�
h�2��+u���H
���2�CZ�@g����i��s����"��u]��J��b�B��cŚ{���m�n@�@��#���� 	@�4�g`����@��F��TG��n�y���XA''�ȒQ�T8cs��I���Z>=i>�P"!B�y��/f�LC�!�-%���qĵ|Q��I^m�7�5�~?`��Vp-��C`�"s�ud,�>�ɩ=�ON�M+�J�j��^>zd_�@9��C�z157g��8�aDAxn�7xB^ݩ.���n\S���|d�������)�q$�c�����<����S�F�(-��S,����D�D?I7*^��G0�@.�nCnR~o��^Ԅ9���'��'q��:f@�FiѸ�P~bVGiDxΐ�iJNɅaH�:eNp�a˩����~���B�Brg��G<fX&�喰��(�Ox1b��P^3r��."����F9��+ȑh�]�`I�U�P�|D嘕�C(*�w��IM*��
O�,	�T#O��d�W��N~C�&��V��)`�
I9R�k
�za���x��O�FU���0m�.b�a�.�b#߱��1�q
:M��i����a�x�Sp��tC��)�74�f-@�� Iw��2#�*�<PB��K���7_�x)��T#v��4el�,��@����������y���,����b0T?��4?�J��r����!E��k��Ny�[��|�qg���B>�jo*�K�\�I��?h�$���� �i$d�d��b�3��\_]U(���g-�7���K<��(nd�B�(�+4�r�%�;�j����&}�ڧk*hwUW��$&g$!M�Y�3sr}�+v;�*�t�qo�V3�ƚ�#���ѯ��HG�d1�-A͸N��ɃdM�D�.�d���Xڑ}���S�Z����u�B��V���]��^�CU���%~��1籫����
iʲ�%'�3��{z�A�)���Z��y�s Q�{n=��\iPd�;%����\���p.����Z9���Y{�m�+��9��v�d���>�%�X�Y��+������L'Q�>e<�)��ދm�'X�:�Pi�J��'K;�l�آ��ל*�Vj����ȁ+�",�"B��Shm��œ��g�7��1�:<�b�t�&��s�f۱t��혏
)�f��/ss�\1{�+��5��XZ3 ����'W�Օb�:���1[���!@�*)��F�V�w��I��Q*��X��!�;#UL�B8��[_=�����_�J��H�:GsB!�<o�i�
�O���e. ]�뼪S�Җ:����T6��
=�42��k�H7��4��VR��:nO�r���-�
V���zbi=
!�է�A�/�s���Q|
�1��6R��)],&]d�o_j���Q�S-Kpo�2 }�
�w��u�.k������p���N�<�&��\�ɐ�0�.�B��N�E`�Aq2|��(A��^^��$iH�7��I�l�U�{�J6�}�IЭK��MB��N��&��^�����G�{&Y�n��Nb��8��� ��<}׵4��$T��~�VMb�Ke��͚Į-ESl�&1��P9ڰW�*��8|K
Ѐ�\��D!�G�p�D�%��N��k���=�0��5�H�Bӧ��bl�e7��{�wy�Ћ��`_n�}8�3[���Y>w�rS{���F������,:b�����9�h"���,�I�"��v#G��*�l�Î�(Czʘˋ;.�%d�.{�2Cu��	���"��p��Z��XE�2ј5O��Z�%M5�˜����r��K]/�$���PEy͹d�̵���\>H�f�����uw9���x�	~�-�HFXsx[
��rn(Y�/v|��I݂8���!����Se���\�xߜ�NP�;���H)~{+���^):�M�O��OD�x!�c��j{��(��G��������L�Ge�=��D�9J����m� -zu��tM�.Ek<�\�#"a:��I�-��^�L�[ߤ�9�Z��͟��҅Z,S�.ӂ�؆�؁.�Ŀn'@KR8?>.�&"bi�w�S�����L��؎(������/ z@����8�Ɠ/���饋i��<U�\����u�O�v�3G�:�>���'KH�k��"ڞ���۴�L��MW�k�|@�9ɧq(����l��(3e1��B��ܶ���C(���0��h��`W~E���7d^�1	GwLY�3�^�
w�������T��n�\�޶dU{�dB�&@�TB�}��*	�^3�bV`
e�W�Nv������$	�!�e<��ܠ��]1�X^�b:����z��4��m]�wk��ܚ-
�������x�����$�uȿ�Z#�َ
(�p\~z���XA�LMH���['���8��s� x*v��ry��>�/�h�
k_��D:ȧ.�?@1�ԋ����,�:)� ˼*0a��emNb,�Z�U}r�&�<�#Շj�ҳv�s^���=����VIe��K�k�/-�X�o��Pl~����=��E7=��+��>=�`�]/�h[��ǫ/س�xX+���E�?/�9�D��3�tS��Zϧ���N����فm�m��{j��6�֯�W�Q��(����=��O���3+~�Â����3,7-���Q<�͸�Y�y�{���W;d����6ŝ��r���t�ut�#jox9�G�+��}�aol&!��V�����P��ڶ<�Ӿ��h�P�@��%m��M��ޒ��,�V~]�xr��1�l�9��$b���nŌl<7�0�������ꞁ���_�*������>"ъ9�B���\�T�_�jק5�[�_��/��2�c���´��e/S12ጻrUltn�B߯�!zm��JSʕmgPN5���&/۝Ww�S>򉓚�s��\�u��:��2��||Z�U�b�<��?�&ť��U~r�9�G#�1b����ؓ+�%�tk{�i}v�@;�S��2�{<�������c�����2]��J��KG���>��c[�u����3Ml_I(���T�th�&�&�8���d���xÓd)_H�T�,N���L��!�[�a�h��]�I��>$X�	�z:/���������x�RV�d�=Hҽ!�$;�!�d�6K�[oa��!�Da
�ͯ`���a۞w������D#�
s�m��Z51m�w�ڇ�P�ʼn����]�F��������D�Ϝ.umߜr��b1�dC���O74�m�Q�j'(VѾ�9�;�2Q�m/�(�(�&�?�C��
0`JK�-�Š}�;µ�
-t�]w�"O	#W���)��:���Q�,Lޚ�5-��ԞU�k���k��5n����ٶ�w���&�J�:��u�JKw��BgE&�g��//��*�/��>�h6y��{�r��3[�y����I�4��EX[߱n�#j]%Z-t��P�DnW�|>ֵ���:�����c}�,��#��G�x��SU��Y��IpFt1~ȳ�>�{ޟf�'t,�/l&Y_��"fŤ"���efI�"�Qo?k&�T��S�\]?:u�5¨�4�6]5Ө[Z�o��1T�vϯ?��3�
(�E��q�z�U�����l1�/�H�~
�]�[Ri�.��:}�A� �H�xYЩ��O�����GG�Y2)�@�L*�Ȍ=��1l�I���F��S|m��X�v�}�9D��X�q�,ކTA�CA*Q�ɟ^����r|+>��B��\?w�Ճ�UڴӭU�(��*��&8*`k�cU��:n�=Eϥ�*[�:]���e�8,:�u��KR��r�T#�Y����JT�{�Srd�f�<
�9���(/��g�宣<��둕}�9��[���uB!�}�
�1t0�����F%�QyҜP(�I[3�9,d ɋ
�U.\��# y�eA�"r>�Ĭ�T�<��gɤh�2��5����w�68nhlt�	A�44���F��ABF�I�4��a�pl��$@�0
`s4���VĞ2�G
�t	�������<�$��y/��'���ʔy;�Į=���&��c��T \*cBdd=ѳ�m����E�B�%NYP���}����O8߶x�T��Ժ��y��\)W~[��s��|���A�\�+���j�I��3L^�C��(n�D���^ɔ�O��I�g
��I���pb�����o��O�~(�u}�kN�ۀ��w��3��2ޣ��݃��2����E�	��B��&��ą�7�{��&�_r�������D_q���`�rr����;z���3��;��tή������p�9��q���<��z�y�z������?&�ҥ+d&>>Q�6���?�y��M�l’I�~6S�+u�bg
��\���>ꯁUB~��ȴ�S������|X����4J#C�S�U5~&yy��!y�U�����q��H���?je���LJ��D���v������"���!"�F�*��EFY��KWԐ�(�Xl�nrݯ�W�[�F`�2�l�~��N�K�Zr������<���؝�;B����,?���U*��-Ý��t2c?�-�>H��Y�pC���يXˈ������'2�lF������Y���o.�b.�r����VOԧ��K�_���s��v�������vӅ����&�c~:�;�g��C�w�=yoޗ���`>��#c��H�,Zpwc�_+��x��o����D1�&�ߒ���W�o��w�������88d�����C��P"I"�	
����cPL8(�C�w����NӘXHf�IwxO|�dH��}�K����ݤ|ڇ"X���Cp��x/�_:��c�Q�ƮI�qc��)MY�9Y�6g�[o�^���s��y|��tA��.�CW�E��L]��IuD�*��T'K=
��t�Ss��>���&&~ʭW�~����n���t����Qv�8�z�.������B���Gn�{~}�����0O�W�%_�M�D�&��-g���"�o�G����ճ��➻խ�ۥï�(M�5@�,ϑ���c�a���y�޿"���%_�����s{�J^S�XG%��o�T>�X�2�N����/��C۬�mA?�i��?��%������^p��=�"�/�.�l��.����uR�c��#����S���nzS�~�\��A|��������-/��f5�o��ؔ�֐�����ܯ�s��GE@��l�k~�{o+��0� ʹ!0���o�}ʏ������)oʗ��w���[%��ǚ��x3{�}/�W?�z��T'GP�I�lb0���`�|q���=�����d�/��+�R�r^�@6��5�/'��5�U�]�W�k�u�\�V�|{���W��/p�|4/�>����!��K�K�y�1���
�� �'�:n�>N��2u������Xg^U����!��٦|��@��Ef����8�?�B!�_�M��{�禋��w��V�]��{�<���5�d�xԱa
AIǖ���|�I>���_��s%[C��c��}[�F�dX<�.�=A�/�$Œ�q~]ќ<��)�h
��Mw�$���ق\IAl�i��&���`��[N�V��B�%W���q�[�oNO0wՀ\�TJ������5�.�0t[]�+Ro$��J9�z<Hu[]�+�T0%�y>�[�$w�����/�5>.�e���)��m]Qw}dԑof��G�f��dAW���€˳{X'�ZѢb{Ƙ3����`M�r�$P�$�bR歡��
�	�$nE�(�r�|�� W>�I^s-lt趺2WT��؎r�ss`�h��ۉ-RW,�&1�K�H�.�\	a����WG�[��%l%�H8�Z�2Uu���� �I`V@\�MX�!luj�0��$��~*�}%���K�0�vTP����$��ԁ�ӝ`B�u���ݹ�S�^��|F�WO�����
�EJ�X�8;�3z:̴����5sZkz�|3W�����(��Z!밹���{�<�Z�� 2c�,��CQ[k
�HP��"�f���\0��$'����"˚�S�H����Kzrػ��Z�@<u.�Zm����d��q�HH�*�K��&55g?�(
u��"%�+��崀#\�>#"S��A�*V��g`���,�	��ܣ��K��7WM�CLO�G]�)�)pݵ~�J>������ �-��K�V�_�:U��U:p;v�ٳ��f��Q��񞙳�Ox���T�gA�9�E���[#[���J��-.�x�Mqd]���`I���>`LWt��Vf��w>���o����M��;�E�K�x��#�	�o���d[�)u��w��E��M?6�i�����~�bǍ��ڜ�n��i��w3np��k��@�х���m{7�##I�7��H��DS%�f{�?)Q�5�A���[�3n���ğ{엫uj��K��G�>+q�%`�M0�4{���5=8�Ĝ΢DOv��.��I��BX�RFt9bgG�|1梯?���Ԡ�a��Q1,c��ė(m��l<Zhm�3���{a&�˴�	�A@ws����H"p��@� Vy�7}��VY��Pā�lc,I�Jxbt�C3;�-�(�U�{C���t:#�`�~
�d�5X���d����N@���G99k���ܐ�ܺ&�8��Nҥh�C��gi�¡~R(5�yuX�k;r~��R�;�D���(�{��.�Ԙ{S���\ �����2�Ł`�x���V��A�c���З����=p$�һK#H����D�1>�''�#"n�XN�V�\����1��a�y����>[�T,}=F�.�oŰ�-ЋJ�ڮ)�@��F�h����(���F����ޖ���L��-��� ��R�:܄�H�]����%\
ԦV]~���2��ky���RQ����<�8h�X�?�5RR�C-�u�M� ���h����j>����T^K�]|>1境�.�����%�0�^�Ʈ�����P��g��z1�ˠ7���J�T���[��id;�CY�,нz
�3c��jԺ�Y��>��1Z�`�����03>�)j���4�Z
]�e��Q�a����	г⦙��y���9]�#䓦x��@tMc�IO�&1x�gP�.vH�$�D���X�=bN�vs��SK���
'�y���P3�7��.V]���A�
rj�=���ڋM5�!����E���Е�=,��]�e��R.�\�9W�H�ۥѹX+f���r ����	�Ù��TGf��\t�zD`���D�#��E��O��X*���ZɋY���\�e�&�7����l�l�R	���I���]���%Ը�	���*�a�s���#�h�%���7��!�vy�:I�ظ+ǖ0�wIU	��ԫ�Z�{v�,�~�O&�80�=l��\=�F*�X趎�t��;o�=�,�	��-����0Ϗ<.Z�Y@����j���^��p��H=,�A"�F-F���� �e]g��;[9��@�9���������B>KFͅ$�zW,��x깝�ẝ�w�~tw�G�!�P��>�j><���y�dc�.V����1΍�س�kh^O����Y	��3���]���ۮ%?G;�v%_�Iɛ�-�4�B.i$�)觛�LZ,$9��-��G�dYHr��_�=��A�����:�ΡbE�J4�5D���|4��B����F��$�z�L+T�M�����Dh�{��g@��aڀ]���N�F��!DX�iB�� !H5	!�48���������i��mM�=� ���R	���P��H�R}����O$�FK�ú�D�.l��&X=ٜ�N�;-:և�=i$�dK-����&��R^?g�5�����2�*�I�w�Y�'K� �%W\ڣ|.՘,��NhE�u]R�G���!�!�i�l���,�0�m����xn��U�&���>kձ-
*}ޱ��M}u.������>�1��yK��w�Ifd8݋�rW�9�Bs��=-�'�Y�F}3�)�bW��"���Y��*\[�"�W�&pl)�s���|!{^�7<8K���:�([B��N3{+�`�Y�v
?w�=�ɟ�L�w����ހ�׭ǃ{I�S�Hui�a3Y.u(��H����ׂ�H��sm���`m�xq��7'�+�;�^�駱�		�Rˌ�H�����Gh!�����<6X_�T{�����l�"fфvQ7���/�L���Ȝ���b����ގS8��7�Ԣa��V�rީ�e�_�wZup29�Z���G��U��5";{k�:=����!Ugr�7f7d�z�OT��vl��k�ٺ��U�|�՞�1�;<`��N+c�Jڍg	����I,Kpy����sk�#���f!�JMޙ���9�I���Y�z���W��)x\��Գ���?��3F�z�$v��<����Y��Y��C>�k��9�#�iO+�h�ږ2�e]g`nUT�\W�"oiwl�����{�!3	���x�R�Q�8sC�i"����NQ��7�D��,�Z���_�5��&{K�,h�䑨�,rR4+�Vru��6�;���W)���R���/��>3m�qGb�����ua�(AXveث�#b�A�����d���46�KFt.�2�Z������T�@���~C����"?�/�)�
s!�}2X$�##_P��Մ�-J��KO���^�G�8;+HT��J��� ��s�MA�
#�q�T@�JH���Ga%x8L��u�T Q!$w�6���K�n��AU�c�/��E�P�9��xI�EX�z<�[�Z��*�m�_�f���na6�����
�oH��q�泆�^
�O�7%"��GE7�?(�oº�ҘX�S�myݤ������R�%`b������"�p��ā���XS_�'`znA"���@�v��[��>�P�C�gTe^6�9
��L�	�BP^��h��{��a^l"}��?�ٝ�Y݁��܏���QP>w�\��=�u�I{
��_�q!T��w�9r!3�Ն7��q+l����;|P
Q�г�ϕ�&��E�+N��5�fN-���ce�V{?M�~�Te��/�4���ڳp	�^�9>���Eh�����$k���H�6�ϯ��:Rr��q��T���
��[}��$ ���I���@��cQ9Z%-�9Y|�:�"2��"A�	 �o�b�/q�I��d#=��
`�7���H��]
p�
�.���B���N��]w�<�uS�����O5��ڤ�?
�5�jf���Y��f��ZL'!�d��D8�*H�'6��32K+8�ug�["ݑ��~��R��;��\���[HC_��f���B��AY�w.̘���2�������ik���Qak��Uc��bk��X�@�5
u�Q��[���?�,oZ�gfW�����ף�CU�|PZ�!����d�S*��-��N�{C	�n)<$��^���vJ	sm ��^����>�����.���s)L-�'�
rLǰg���.�ՎSxF�ծ���س��ˣ��J�
R��n��R��$?�3��ҽy����{��dV��=�����KSJ�I��4���{T>�9�������Q�ީ�|<����(F�D!~����)��Y&>O�Q�z���'�r��̙p8@�-�A)��TV���|�E�8u�}�HF^�8�N��斕l�CH�8���<)����e�.���&�l�5��hJKe���z��86Ǻ$U��9�5�mu�:uŽRI*���ǘ]?4�"8Cm�1�0#g�֨
�<�`)���.8�wP:68^p�V��PB��6�ta6d\�(?���
l.g���Ǝ���ӑ�7=��azW�Q��N�Zb�(0`��c�P���s�3׀���.��Tbe�sc`U˫��rlfX��XY�
�K3��Q����֓h�
��x&��V�2�)�dHK��$�tքR� ����O��+�Ut��cݚ�*+狋}jϯ�W0�J^>��ܱ@��_�y���K����
*��lZ<@W�x`�����b��#�,gȾА�.��3r����u!qf}�oР6�U{|���ph����l�ٵ�w/��0�$Y<����������'�5���w�K���YDtRā`�ñ����� +�IR���#�?�<��i⌶$�[�17��ז�$U���H�����ٙl"���?
|9�*n�cX�o��ٖ���Z:��u�p�=~;�E5ex�kA{MZ�'S��
�T���J�hc�o/Bvi2����a䑅h6se��
0C���ϳF���3
,�Rl � ��*�`5�=4G9��9�`��&C�-h����<�oč�f��	�$I��r_��7�@��"'�Τ�½I�����X	��RK�m��jrl��H�K��"��"� �,�%�Az*E��6>�r�kރû�hĶ�$8].�u
P C%j��ޯ9�B���Sx�H��̧���B�����ܽr����j���|����eJ5���G��T�	u��긅�y�;�TtC�qHE��T��{V�'�HP���r����!����brs��@)���>����K؁Y��RE_�"l(�0�5��X�$�(%S:R
��$��@'֡�־�U��8'B/�j�Hm�j�����--��b;D�J-Ӌ�T�f�T��vSP�ny�v=}�e-��-&`-�W���V,��3�)�����4ɌM�4d��bv�]�xi����[�������M8
��"yx�I��Lڹ��
��sX]�ZcHdK�2��/��=�<n�������0��5~]
�T�}|ၸt"��Ťj P��
H;��jbP�Ǟ���n�n����~��ӳՔ֨v��
�݆�Ӟ�`~�AT��ٮ��P���Rϖ-��V��
���r�K�}�5%~����-��_�o(-���yD�źm,�0׶����G3��Z^�*U�[)�JQ%Q���"���{�?�9C-�U��S!�Z+s�|v���;o��'�kuV��
���.��,��r���1�<��Bf[�z��Il+���A)��]���ˤ�+�%�	����
�S�����<M։N<��T��u�,�z��'�˰����(45��a��$��f�۱�tЍ�}^$�.�۩Ϭ#����K���(�Ql��v��M�ux�I7M�'��6%.
�rH��ΪF�gY��Ks�p'�����Ą��
�8�˝��a���p8H�	y��T��)̹���H|+zO�wi?�Ѳ��ix��*��\A�+sw�a*܈l�Z9�2l�x�Z�T��-�y[�T�"I�p.@:�sq�-BD�):d�Ǫ��v����؁q�=~�G���ksQ���f����Z.�l`���GT�ٻ ؉�pS,�dd��\��]e���kd����20c7e��$���W���\�Ph
w��튜v/gX��R6�><+�"���ݥ�z��3����V�Hi����l�|D��u��*��|H�&��2("��'�%9��	71%}3�*P�:�3I�M�s&�uzB,T�G᡿ϣFhQ
�і�������b��p�l��s��hZ������w�v�qfxw�h��a�J�d�kf�@ry�;=�rUt���A��^�	�쟾�{ʻ���� ��ʐ7j����v�KPD�����z�A�G.u�x3O�{���g��
�����g�X���ځ�ֵȦڧ,�S��n�~t7��ǚ�AfK�Q,g��AN��T;U��J7���=q��i%�{&.2E���UJ9����S����stC9Ƌ��J�t@7b�Ǵ�3\��I��췪��y���b�^��u[�W�%I"�y�6���g�4�97�N�N���S�Ncӯ�[3
.�w_id��Woe����99Vwpq̠3��,�����#(|d
K}��Z*\ƹ?���y�<��$���6��Lk4�mӫLS
�сq��|��$�ר|�W����YESrq
���L��]i�6�0�?Հw��b@>��k���|���Fv�M?s^[�+�Z=v2�5���jT���p�%7e�]�c�\=�1���;F�J�J�J*�|�@g~p�Fir�x&E+��-b�X�����v���ϴ�y,'f�6zj�?wh�d���#�nr\ށT�"��~I��{��lM���x����^�5�m�����I�%��[1���̬��!�,9]�2vҏ���8�ߢ?����[@|����~���29�5������,-�)�g<��^Mv0�u���c�Da��	~yU=�O �KT��D����Wq�����H���p$?~-7y��<;��#L�O��8����	b\&�s��4tI��Ơ��S
�,�vA�a����W�&�H���C�J\��؍7�yh)4��,tprU���|�{2�qZ^ؒ��_�I��ŧ���1Ie��)�؊3�}�~�$����e_Ռ��`���oS��`&Q��xk7֡���(a1.�Ã�%���(��W,���*=Cro�:�{��t����8�QL���P��`8ַ��6t^K��<b�$��[��s�:FR�N�k��gi�^^�o�H#5��53�q�yH�:Fpp��JB�kWu�L��dcS�c��h�ydՖ`���U.����[w�$`a
�ֲq^Y��
	�Nu��G�
1��d�ȹVE~�0�Q��]����Bt?�*��x�v�D}H�i���/�����S�cw��r�/<?�%i:��;���0�I����K\W��5W%�L�{�?��z��3j$�|4�%4��ݧ%uo!�%�o�^�����z�y&�V:l(iL	������[�������s1��L-���$�5OEGqx�,�>!��"�b.��E����V�Aq�gl�t�oըU�c=3mC����7X�Vn%ئ1�0)b
�]�˂Y�Y�W¿��#������*y�i��s}�1к3�qM<f�g���=}&6�[kul��Nj�;x�F�H�a�B����_�-�gd��̷�|�`�h��r0�fN�+�1�}��%,�kΰ�����l��v��+[�pyP���g�K��e���I���g�@A��F2����	��Nj{ݘ�EJ���Č�/X@EQp�*�qÜOu��#v����:���Υ�3�H;����Ce���Q����V��S;>�y#��T���.h3J,|��j�=�Y�����F���!�$+=���g'G���
]Ek��IeV�>l���̤�Z�*ACXպ�ϫ����*&���l�Qn�Dp�����i�=�0n��:�B�G|�lE�S���f��
E�5b�5{���E��&`/��i�9d2�JeY�eN�ˠ�G��}p~���[|���hg.�5'��3)7a����rӔ�c
_ߚ��O�`�o�s�x�����c)�R��O����(و�����iz���Ӿc��ӫ�Z.ͬ�Tg�⳵�>�3��Y�	����<n%X�@`os#8��#�m�̀=�}�X���ē*Z�֗�s��͝�{/A�L��C}/m�u���&��Д�`:o�$J�S`33�X��mй؇G���&�B��{�;*��τ)��ē�{���L���E�4,RL<b�V��$Ģ&{�au����Xw�=�P�w�v$�ʘ��Z�f�xo1�?SPu�хR�T��J�[�Oa�wb���ϳz[�
���M�R8F�z
(p"߳$�ŎdC;��Yu'�Lb�ݥ�%��'�X�O�L�aV)�Z�T���(��82
�%�h��[<�*�{�(ʛ�5�F��TpokvP.�O�EH����Y-��.�m)M<��$*��K;�i�
��d���v)��h���!��@�9��>���{
��u�,&�F3	�u�=��w�Ĵ3'7�6j��Pb���ZmIU�����n�
5U��&�El��RT ���V�]���&
�{�`p5���5MB�(%LB1�ǿ|��g�A5��f�}Q	k�}bZ
��!��7�Yӌr�?$��Y���2N0��r����I�v���n=o�Y�N$5��Z��LH�-�9)1���tm��_G{����B3b�g0N�Q�,WQ,�	�p�TT[�
���j�[��Ȣ��i<��::�p���5y�>���zpO%E��r͆����Vc-���v�
VkW[Q�[��72�{&N��n�
�C��Q�5z5ھ���+���lۣ�����B3Ż�݂6���[ai����?����t_�U�<��.f��	�f�vo>��\uՍ��TR?������@0�9��5_R�K�W$��d
$��LJ/Dڒ��k��fow�@Q����B�������7�R5�/c��Q=�g�6�j�zֈ0��hS�CT�����\�؝�x�a����
�%���#G� ����|����[Toٙ�B�A޼��7_��M+��1J�h�V��]9!�#��4�C�A&�_��"�lko�6�gd�X,�a�{ݼe/���I�L�^�m`��Rv��k��տ�VuV+��I����y<@��J��5C��ac���V3���|�J�@��?[��t�s��z�X��XDH�cg�]Ӆ�#n����*�5%�؜����Pdy���Nh}�%�#n��
���D��a0�1�b�j�o���Q�%�X�Z�I�Z�J� -[���XnA�	L�.2
$��N;T%$~c�x�(��?��i\�_$��tf��nQmXM@1G�wv����aX:^��{3af7��kS�~>�NFg�"Z �Puy���a�jZ��;��@z�s������F�'\e�Ѭ��V�Ov;�7�Ybc��L�ƒ&�m�l�7�[�-@�Yޜ���hѮX?���p}%�s\�l9�K�[���c�/�`�-�8
�c5�J�U���GbX���:*�z/�lUB�Δڼg�íeGn����<��0lJ�q�T��#AB��
,�U-_�z�+�����;��g���d�)M�eb�/���$�5�0m5�[꬏\��E�G`�se`@��T���^�B�?����d��6�k�TQ:����E��j]zLcW[���,K��o)�n�X1Hv�<:M���S�.�֙��0W�u��`u�5��z��D�NX��M덶w���xnWgh�s.)bw¡87�7Li�G���q����6n{;�B@���#��#{ۂ��k׀!E;
eŘ8���,�*&�	� �+�;\#�{�Գ��vK��ir�OK�@W;
���<ca����-��Ŵ\
��T1�G��,��ޱ��yb\ͧ��{-���ez#Vo�磨�fq⧍4�G�����'E����9�g2��^��Mo��'�֬����ȋ���Iϸ���!��G9��e9!�1���)߿m�������Ƭ�H�g�T�y@<�| WuX@�B40�1�`@*�&q��F���GDF}A�yu��_M�~���ۑ��^�s���+�U	�W����2+�����H(��i_�0��*~�BCS=P�� ��iw7�z_��)Tpj��ȡ���C�
�=�xC�����Ҷؽ�3A�}j��׫�%��3Χ����<\��pY��!,A	0��?ܧ�0qI3��EW����4��8��k!%D���b�,U'WyI��õF\�ƃ@��5�$�Os:��pA<ܗ���y��􉑁v�9J�FՅ�9@Dy4	bc~u�cDd�ε��bt�!3��p�,h0�����	I��n-�x�	:ߵ�숍��f�#
�.��͚��]�N�%5&�}=�p\���@�Y�p�d�n��Ny�t����j�]zzQ��"��D{��<����z��������w7��~-*���@p�!'�9O	�����A��q����f�b�Ş����AT�K'�np��;J��Eyn��%M�����Y`B'����|��xa3���N9�����Ѫ�V|��θ�
μ�|Dfh`���ٴ�(~������Sډ1��쓖�Vy�Vݺ'���듨
,��!N�Iò�9�v9]�M:�t��]V��m�biO�
�F���u�<&G
̋��<�6����J���?����ދ���/g�=�4��$�~��p��6_��x`.���&r���ȳ~�Nb[ۧ�-�R�r���n��XM��s8%�k�Y �may��Z��%1�%
^NU���
�A���լE���[��v
v��LE|{2�,�yo�n�q�;�bM�^��k��j5�ٝ�^��e����5�i�?IZ����+��?�����tE+e`g�M��m�zd
�wX�~<�?n
(F�T�(�N�=_i��n��=|m$�a�v��\>��n�������yV�����dz-W>��`�)����F�'�ٮ4�@�������6��+��ۆ�=�x<�M�-��}�3tm\-�,����P�I�9c�8��xՂ��m4�1P�v~���!k+�����q#H�=���S�r�>�!���P�C�,t%�zؼ��	Jw*�>%c1����e���OU�b�PK��6��}W�|���waM��Ǿ*֘�� ��[��Y�q�h��Y���|u7\kV�oOˑ��]�����Ơ‚	h��DZ�Sx��N
��t������0�����GW�8zlo+�/3öl������1�$O��յ�o�	��fh�t1GV~/�$->m����%�+�D�!��� `�S���O����߱��Z�UF��B�#Fh���

h��*p�j!�Ќ����i�s��Ĭ��´Ϩ�������Н�v>oc�E�Ъ�cQ3�:�5w��M�x�Q�uY��4A ���
Ml�B"�6�u	�݇��Κ�qN����.8P���7�[��ٵ��^�J��H$����=�Z�,S���k��q�,��qХH�Ҁ�C?�
��(�B<��1���Z���!{w��I�����.RY��.�p��i�@����t�.��u��6�������t�ML�Z
IU�h�^m��˗���l�H���m;9�J
Kԙ�Z�L7��u����	ވ�� ��H�Ւ��SL�KԬ����)�
%�-��4`��d�k���f�2q�;_e�N-�����֥��P�'�.'ylvF�0��'�{��X
�?������d*�{+�R�y;�����5<E;$~�W�e~2Y;�1߄|w�w?WEƾҬ}�t��,����Z�I��rR���t3pU�/�"2��␛�:#2�ʭ5I�Y[�<�Ha2V��/ք�z�I�"4��mB���R����a��7U��x=N��4(����V�Y���h�8����wS�K��u��T���D�S�8���Ә���	��Z�-yԐ�?ݶ��=���p��
9;>M��:���#�CP����h�/Jض��6��.L�]P�`I2
r30�T���/�΋)��`�8�v _��Z)��A����ݨ�15k�F	�9���js����
'�{i�e��Y�t��;!�-���5Ȧ�
x�Yv�P	x.�=..�V6	�/���-�������M��D��!��Pt�|�ϣ�!xb�"�!=�5�s�%e�`����!	3�)�`q�<�}�la�@�M�ߤw��x������tD �ǷW��W��Z|��)(+'/W3�����������U�յ5�(�"6nu^v�P5�^P:e��n.�C�@(K�2�B���;�huz��d�Xmv�ӕJ�,��0a
v��XKA�(�@��,O($}�D�Pit'g�6�
u��݃�d�9\_ �%R�\�,�7�m=���
F��b�� ���$
����"�L���&�����H,���
�J����������lg�����bC�0����*�@��,O ��*��P�Q
M-m]=}C#c���Ys@7L"L(�B��	�J�3�,6���3�,6����"�D*�+�*�F���&��j�;�.�`�p��h7C�08�Bc�8<�H"S�4���������bs�<�@(K�2�B�Rk�:��h2[�6��!P�D�1X�@$�)T��d)���[(K�29��6���
F��������q2�7g�ͱn�N��Oc�A�2o��%��Q�R��q
���
F���Xmv�]ntô *:���TJ�X�6���r{�>Ff��qX��/(,*���Z�{�k�U:g5�#Q5��G�uJO������#����������������_PXT\�oiYyEeUuMm]}C#"C;ڴmn׾C�N���de7r1$/`dPX$4�#襁ъ�b��p��W465'[Z�ڳ�`7���ړ	�f�D��'BϙM�1܋x8V-��HȐ��ŔPJ�2
�SA%UTSC-u��@#M4�B+m���Dg�Еnt�Gz����aBR�!A1� )�a9^%YQ5�t�\o��aZ��z~Fq�fyQVu�v�0N�n����N�Ͱ/�����n����Q��Y^�Uݴ]?��j��λ��x:_�v\�A�a��YN��b5oD2cR�8�!ԡQ����T����yׂ����P�72=�
�U�����>.!͐�lDž�=�81��ж�q��u�o��m��� ]�=��A`G QhI��L�����[?7w���py|�P$��U&W(Uj�V�7M�<�`�npD~��ER4�r���˓�
���>f�fa'i�eU7m��Zo��n8�ΗŲ�~F1D�$i�Ӣ�X��v�0N�\�m?ԩ��1��\H,jYv3�<ó<�x�7�E���jo���a`��٢ABơ���v&6.>!1	�2r
J*jZ:���K�H/I�F&��H���Æe��9	\�<�|DR�Z4��2,"*&�OBRJZF�����1j�x�v~�L�nW�HQ�ň'R����TRfV�L���h��KBFAEC�-G�<�
*R�D�2�*T�R�F�:�4jҌ���@ap%eU�D�1X�@$�)T��d��khji�����ML͚�aZaBR����L��\��1�,6����"�Dڈ��Vl�:��h2[�6���@FP'H�v� 0
�#�(4���$2�J�;9����{0�,6����"�D*�+�*�F���&��j�;@��H���S�jP�����rQ!G9��rT]TH�Q��E����.�rT(w��H�BP�q�xQ!3G��rsT�zQ1;Gy݋�5�"jБ�"*ё�"*�Q��EE,+'H�fX�DIVTM7L�8!��-(���TO��EY�M��8�֛�����e���q|��X��M�0A�����0���*��D*����T�05�!��+���`4�I���?���v�=�1����{�,���l%G]ncI��C��J��(�*�F���&��j�;�.�`�p���� ���$
����"�L���N�.�n�&����Wi"N�er�R��huz��d��l?�� ���8�����	D�B��L����B�X"��J�Z���
F�������������bs�<�/�� #iAz5q���xGz�-�No0�̤�j�;('�r{��&�q!�E�tz��d�b��N���py|�P$�Her�R��huz��d�Xmv�����N��A`G Qh�'Id
�Fwrvqus�`0Yl��Eb�T&W(Uj�V�7Mf��fw� 0
�#�(4���$2�J�3�,6����"�D*�+�*�F���&+k[�����������py_ �AF$R�U(U��Z��`4�I��fwPN��0@7L"L(�Bbۋ�1�Ȑ�@�
�����a0Yl��Eb�T&W(Uj�V�7Mf��fw8]���I�n�@ap��`qx�D�Pit'gW7w���py|�P$�Her�R��huz>u�j�� ��୩�W���$2�J�3�,6����"�D*�+�*�F���&+k[�����������py_ �AF$R�U(U��Z��`4�I��fwPN�]t��snQ�0-�0���t�����+N�ۣ^��wDI>*i�Q��R�;B�����")	�!PW���@��,��#��	|�p�$�M�/JH�̕G�}9[�6���E�1�$O �Ȕ��&
Eb�T�#V�hu��!�A?�K�LY��ȕ'_�B��~&��Z��l�#���iA�	e\H��E�얗��8}|���`��.�/���L�P���No0�����p���	������I���(Ɋ����z�?Ӳ��0��4ˋ�����q��u���$���q	�"��QƉ�<1NOk���5�<N�$�A?�"L�4�iQV��h�~�Y.�2�I�}bH�Ka���6����eLb$�)l&չ�&MJFjo�5i~��M�$h��Q�D�MzY�L��IN����Ħ{,�<'������d8�[����D��
�΁�s��JfF����S>?,"*&�OBR���o��ASBhĨ1�&L�����a`no��RL>
�!(�
��i�3JF{����%�ב\D��#��v}�@¡���ر��������������[��[��[��[�O�q������`R�yN��
�X(��b5xy��1��G�
��X�b��B�PVJX�`
6�%�t)a7����;ٙ����6O{��>���I���(Ɋ����z�?Ӳ��0��4ˋ�����q��u�����p��7��f��Jzc��6:NR�D���V�������e�l���Q�ѳ�$i�Ӣ�X��:'
�!%�1�m?b|���F9}0���er�L,�����V�F�:�')�0"�J��d�K�vt����|�)*��s�^�<x��-oN��O�.�fX�DIVTM?�/��a����Q��Y^�Uݴ]?�Ӽ��~ #(�$E3,��$+�V�^�ʀ+Mݴ]?��j�󈳓��x:_�8!����8��!I�y���<����X��v�0N�\�m/.�S���\H,j�X0�t'Rěhd&�;m����������	��(���o�$2�J�;9����{0�,6�˓V���_��ne~�%Ly�׹@�"! �o�����n�}�C����O2�w�q]��O�����`)��W��\��>v
����]t	�7���q����$-�)�:e|J���M�b�o�|J�7x��2�s�QD�Bz���'�"��٬s�=�q��#�9���Y�/f�猓�,ޓ|��мg�
wT���}��H��A��D�����r��D��!�%��M�w"�YY�[�����9��/YCQ��ߥ�x,���5�#iѥ�E��9J_���E�����}�|-m�4���L4�ݷʩ�Z�ኦVit���	j�.�kN6����ȶ�{>W�?=#e�N^K�fX��E�}�m�V_ր���ã��׍"�66W	_����<��S���m��~1K;΄T�6���a��>�$��yQL(�B*O�W��U��6^kS�p��|D1���<ml� „2.�򴱹�ʸ�����j"L^ӏO��6�MK��Zk�sέoa�q! �/�v)��7`��M�S@룥��yR&	
h�$aBRy��\!@�	e\H�icsE&�q!����D�PƅT�66����mK������?:,�lh_�B!�BZ�RJ)��RJ)�"L(��i~uU���oڣ��\9@�	e\H�ics&�q!����UD�PƅT�66WaBRy��\=�ʸ�����"L���űﻧpX��ˡ�o�����cֳp�m� „2.�򴱹:�ʸ����
o\�:�N�q=��=V���$��e�i|s|�`����f,�D�PƅT�66W�S��� �g2�y�1�c�1�c�1�c��B�	e\H�ics�&�q!���͕D�PƅT�66WaBW�6����'�e�5�ǯh��-�4a����g��3Q��Ťn�,�I� �k@:�~T�/���1NQ��]Ϩ1����;9�5N��G9�з�D�X��ͱ�p��.�f�w�`.�"���ĕ��xu�<%/��90���q�0q���:�S��LQ�W�*^�t�Œ).��y�N��2Bf#�	�J�b�s��ּ��v{��zMC�j�PTk*�~F��cAE�ٖUYWX7̥h�c�1}9�1�c�'���!L(�B*O���w�Kb��9D�PƅT�66�{J� „2.�� 0���T��,t}��ZzB��B��f��D�PƅT�66WaBRy��\-@�	e\H�icsu&�q!������J)��RJ)��RJ)��RJ)��RJ)�t��|=��ܿ0���H�<m�h�K���o���S���K���h��o΁KT��#DNJ0���/1�VZ4/�c��2�7O$I��Jȳ{��H":��,�SSm�����#Ii*��	���80��2e�ETY��(Ӥʚ8���d�M��Z�ˬD�,>V�G��qD��"�ɇ�h�~�"9|����k�%뱫���hx�u*a&,a��]�K��6M���^7�	��P��5�;ƃ+]9h;�N���`��z�Х�Ec��Qf���DiHt^Wf�jjWg����_nq��0f�h�DC�,o��C]��]�5t���h)�yY�'���ElK)~����y™ �S�'|Snu���	X�	�V�e�-O����?�6bɄb�j|�fS����0o�~
�D�[.��A������Q6�c2��z�_�~��'�~��_~��7�O��{���:?�a!:-/�����s���vՉ�1�SPG�O����B�,���H�/p��H�whێ咣�#5+�0��q H�fXN��2y�Z�AR4�r$��S�1��Y���3/ bF@u:U�������]�$��F�N�S� d��p^�T&��=v��Ze�� ڎ崘,B`�A��Pt��P�������?s5]�ɅA
��Ҋ�����p-�SN��tllVv�Й���V�S0U�0���\ۼ��-	vA?��e�!��ge�Ry_�w�)H��e��6N�~=e��B)�B�I}�="mln
��%���ߊ~d�d�<��� T��6����In��%�賐*j>e�%S5.}_7�q�d�G�ҧM�]��!„2.�򴱹r�ʸ����R�m;��:_���CnP�0���<ml� „2.��yc���Fu�	�b������o^��M�?#��$H:2.OQ�}̿��ꗞ�m��Ͱ�Ie����h��$H*���Sc�1�c�1�c�1�c�1�c���敟��۷ޠ?�����ne��=L������nN��sy_��$�Q'��:I��Y+�R8�|��N.,"L(�B*O�+�0���<ml� „2.�򴱹b�ʸ�����J"L(�B*O�+�0���<ml�O.�s���x�ս�y���b�tt�B,a�x؁@u�ǁ )�a9	���)�1���� �L��O���|�
��i�Ъs�9�s���ʸ����B�"��t���9�s�9�s�9�s�9�s�9�vRy:S
aB��ɕD�PƅT�6��s�9�s�g��9�s�9�s�9�s�9���H��RJ)��RJ)�y���9�s�9��Y�a9	���)jͰ���)jI��I�����@�fXN���M~
&�q!������D#�e�dJ�px��s����p�}g��9�爿�w��Vc#��}��вN8OE!�z��#
�>@1k��q�����t�yS�x
P�0e\H�ics�&�q!���͕D�0.�򴱹r��2.�򴱹
�ʸ���&[	aBRy���⩗pkڗ�\<m��3G��}����
K��&e	��
��}p�@�	e\H�ics��"@�	e\H�ics�&���uRu���.��I5џ�׵_B�+�-:hMDŽ2.����ƿ����y�aBRy��\	@�	e\H�ics�&�q!?�/�{ܠ�Oq�^�M�A������a8-�^��Ys�f	�l�ڀa�ʸ������"L(�B*OKdq/��M�/�ѡ<5јb��.re����=)ӡ�U
p���W�.Gxj�]b�g��2�\��4�q; 8��%H>�0���/
Z~���
����˜�����k썽�w�˱��I��ز@��EWX@��.4詞u��ǃ>�N��^��a�j��,_���4?�l:&c�6�N�=�c޵ܿX��@��Q�$�=����}��㱞B�2��,���guyg3�v޷��O��u�z}���s!�<��z�v��ג�8o����cq��n�����hɸ�/�)|�k�Ӿ���݃f�H���*[�F�?�37���NWR������韮��Y�Q<;���
��-���L���G�s�2�:
dzz;����M�#�~<4Ŗ[�m���������S1}�彥���#!5���xe�)]�vIu���?��J�����U�2Y�
������X��H� „2.�򴱹
�ʸx'��7�$�޾�bo��B)��R"�ҿ(|�}k����Jt�}s*�#e򤁅C�	e\H�ics�&�q!����D�PƅT�66WaBRy��\	@�	e\H�ics�&�q!�7ޗ/v�C������S���A�	e\H�ics�p�9�s�9�\!�B!�BJ)b79��}}�d��u\E��-�G��	ܤ��d���!=���ඣ0�,�Z���3a��h��~��hی��&�sw���s���zP"B!3D����]壻{����9�t�����3�F_�s_=�Ƙ�VP�_�xp���j�e_3}$?��0��ޓq��!�4g�����n�e�ʸH�D�PƅT�66WaBRy������8
�w{�0�0���<ml��j!�B!�B!�B��ic��������N��b�\G��L<�,���÷~>�z-��S���m�XM�z��t���y5���t6�V��1Yy5��o�f�0�ǁ?���!�T��]��aBRy��\
�?�WGSy���?Z��8��24�B��@`�d�9�/����/�(�}���߾��Nys�Z���|���r��+�
ī8�i����ú�r����}Ҫ�$���Me�~)�Z�[�;��8	�w�k�����
1[��	�܌C�#�_��v�K�:�(����޵��o�ɱث��謬Z�XQeڵ��Z��)���g�An7��:�b��<�̋=@��p�����n}j�����-=���̶��FV�X7���SHY�&��s��h�ټ�s�JY��g#���c��Z"�}�nt�@��<�P�S���y�=$I1qsĜC��l�8k�ۡ":�hJ��5auz����wp�S��v��_?�S��.r��K&	��j�4gӜlF-LP�9�
��5�f�:��8�P� vO�а��)c��踌�:B� )��9�%�6���Tχ	S�Ҹ�l�R�����1O��^�94��^�S�w����3� �xu��nGG=4�=-�	���C+th-�c�Zn'��ƾ/���(q����Q\Ι9�ӓ�&�F����!�9\5�.鲡4�0�`��˵�2��^JYlǂ_\����jE\@�#�u�1�)ȕ��2�c�@d»�m�>���P�t��3�4����.*
�+���
���`���Nt��yՎ�[*���������<<��+

At�~7�t<

A�R���kj��б5�sl���գO�`�f�̔K�_�v0�ɿY��P�M����c7�g���`f�&�o�ռ/�M�$1������ ��Ʃ�����.w��n��P�]{�n�M��B�L)�T*��a�+��~�;�q%Bѥ�9�u]�뺮�B,�߼���U�3�N���'B�!�ȔRJeJ)�~!�4�>�Lt�:SJ)�J)�L��R�Rʳ���P���.�zo��a�|�����w> �����ȶNC`���=Z$^���ޕ`7��~0h���S&z
澛C��Q�ִ~��?���7e��i���LY���g��]5�ke������i��j���î�~�
F�)W�^T��跺�B���s������;���7��x4��=�� )Ͱu�#EQEݮ���G���ó/2*^tL�7L�F�t\��yS�o��ǭ(�9��$'�� �d�����"H$���%J�(Q��F�#��ea#,,c�-]�XM�U=�՛�!5νϋ�G�(9
N8�L!�C��f��8r(D�����(hO�=��!\��2kq��‹�'��z�V�`�tb���B$���d��J��e�̾	ZVk���Y½��ѵ��6���r;(���*�ZOЗq��v�B0�b�Ca�4�%��+�u #��SqGB0�bs;#����%��+�;�[8���F�2�������V�T�B0�bs�P�X�eY��>@FPl�*]�nP�+$
]�-�ǧ�w����9$&%�����[$B�	�I�)�i���DȱX�D���R�i�Z��G�Wvn?���^M�g�
�y>Z�/[h�.$��D���r,����l��F?�"�D*�W��i1q	�
����W!Eb	�rWB�X"�m����!!@V	B�X"����P$�Hew�i4��	�J@(K�C]�|Z	�JA(K���Q�i�Z�V��!�%Rٶ�j̺��Y$$��a�#��zS8�P`��h@�@@@��F;�	Z��@M�ew�N�K��?S�Ŀ�L��qf��ˉ�#�b�f���ظ��!�] ߸�$����ī���O;ks�ĐSL��l�+�r���g�<?L�A^>��Fz�>��g��՗��v�Wީ�&�1c{�.g1�"�U1��	���JHβQ6�R���U�����+�{�+/�J�/�S�����U�p�@��	�s_f�<�[?��WrA4�6���0�<m��F���)�[O�jF�Sf�~$d���%�e��L�Z7����0�N�"y���uK��Z%�H��íDu�ܽ;�ۺ��͹{�^㻽+E�{���]"|,z���CG�8n}L�}��;!BDt��t�^��I{f媓�JY�X70��P��ZMȡe�X�AE8�N��*+
�9H��Y�w+l0�_��\�4��Ǭ���K�gi�H��0��Fh�� 
yY�BSZ�C�l؊��[S�u�^
�6����Iz�{te���Ŝ~,x�At��c[8�	�=�h%��-��=h�X�&Ú��5�v�Y�U��tM���uCM���,�:�1g���Ƕ?�
z�~���<W\��6�
E�H�S��?*�|�cT�Sj�բz�g]jMES�(��R�X�X�X��R'J����j�*Y)G:jO
F�Tfe9��=����U8u�ss��.ZT�Mu�^���c�&�w�6Aaꑊ�R�ۀ�>�X�hQT��j��D�v>��
vp���
�9g#��4ػ�1Y�aY��+��CM!4��F��~�/�V0(���Y��:��M;{e\;�r�Y�W�.�DK�#�V�A���۵ȴL;���AY��8�/���=���ꪅ7��
o=~��3���^F��g�d�:��myV`��$b�@����eUc�ЦfP���q&�h��U�|'�m�e�e�K �[X��0$��DcD+W8��������"t�FW���aV_�S�Hh���� ���������~�X�÷��/�ȍ
8��%���t�p�7�8�i�[�8��:Gdw��K4��S��}�����x省U�t���N�ܜ, �<<�2�%C4"�5����E��Ȥ�}ͮ�o#�B�Eu��^�CT���D�,%{�m4\���hU�*Mvҵ�+��^��U��hK��&�L�pp�i�%�~潌�V��^KF.�0��7�L�1Cr�#nB[�_Q�ͭsG!�c�}��
iw�۪Ɂ躁9��Mkk۟g�2rd��2����~���f$��߆�6U�^�Җa[*w�#��*�۷�~
OԻ�:<[�=�Ğ���AQ����tQ%��b�rXz������
�K6c��>�a� zñ&��*��P��3,.�K)�7��E,f	KY�rVpr%3̬�T�� C$�P�B�e����\���f�b���V����\����4E;����w{�c��HT{��W[qY����MD���Բu3�qݑxbH]E7Df����!�WV���y���0��1��ۚ����~w�������Vc��~�7O�Kfݵ-<2����mG?MJ(7�e��qOUE�x��OB����lrͳS�
/�|�UU�@b/�.����Ԓ�ዯi:|'ɄN���˕C����3R���^�S�~Ħk�:LmV�˺���G�|2Ll2�6��,����ʵ]Gi�M��m�֖���{ۻ��uC���EL���C[[Mk˂G{�Eq?xm���n�>VR��M�7#��m�_&�M�����*����*�'xf����bU�[6��\��\��\õL�*g�]Ŏj혹�ᔃ�H}����6ɾa�f�`�_V������g|*u;�#��|�#|����>��z��l��s�-�>����ٱ9��o$��݊&�54D��̬LXF��?ףS��C��[k���j�x�1���Hٴ�v��9X�k~裟�o�8���ϥ�a�z�o{>����L�2�(�>©���y0��;UZ7��z�ޕ>��΅Ǐ��Zܑ�
�6r�n���}u�f]��'_sh{�O�cN��]#�Μ�ج;s{���ߑ��|�����g���m�j�fX�jej��;(��Zg���}=�*���ƙ��	9�g��
�z���Q����w������ �x梺7S�1q������5�ո�M�œ^z^��y2OMl���}��؟����v�~�u���be$��+��\���uV��O4���$�fonts/raleway/Raleway-Bold.woff000064400000254170151215013460012515 0ustar00wOFFXx��FFTMX\����GDEF�tv�2�,�GPOSްy����kGSUB�����OS/2P`�gNcmap
h	�^-R�cvt �N���fpgmt���Zgasp�lglyf L�6 �8�C�head�66��hhea�!$�hmtx`�����loca0\N?��maxp�  �\name��B��Jpostƈ�#�a�1�prep�L�O(���r�_<����^#�+tv�6�1hx�c`d``^�_������?!VC�2`�vq�-in/��Qx�c`aJe����������
��������
�0����+P��7�b,M����ؙ�).��@xڕ�ml�����Oy�B��/P
��
�P��PТ�Ѡ��a�������m)�2Y�b":Q(t��s˜��d/��eF��q.*E�NB7XA���O)teM�����\�ש_�Z��Zt��S~�i�{\i��&���"��LU:���W���"�Ju�EMS�܏Ԡ��_�X�Y3\�n�35�ר���(_�R�N5~��0עq:��.�]>�8�3���c�jQ�?�<D����U�<�/�O�ٕA�5��gl���
�����Y�ip�
������|H>U*��ğ�'���U��j���Ƃ5~�&���^��q��ȝF�����P�{@E��q�4<i��A��Kknt^���u��ui��6wh�l?IC���}gO� ���ڍ�R��ߪ�A�3�%�&���U��J]���4�WK�|]U�ql�Qs��jc5ו�ʽ�9��?�� �>����`�qw"G5���*Y�m׸h/�>��3�5(�}|2�bUb���C~�EY�
��_�{�C�=�v1[�%��֠ˠ�kP��-V\I��-�A�ػ��9�bՇo�E_�Ȓh�ڙ�h���������oh��;����S�!��9�f$:~9����0�"X�*���h(�R�1�c!NL�Fċ��5q�,��V�q�����k�sW�m�5��`*���,��A����������7Yl'VvhL���u��{��'31����U�	y��eeI��kTs��v����5-�~��>fL!��{핬͛��/2k��Ҭ/Y,>����k9>r��[_��N/�:W�:��fYY��!ן ��k���W��ۆ���I�s�/���E��T��W�F�*q��1�>CeP94�q�?V}N@�ɘ�J��&<Y�4T5&�O�B�� �̓�(�������,z��s��*K
c����XK�#��֙-�e�j��ؖ�R���f�5�uWY�?���w���I��Þ����t3~�z�!{�7������*��0k�-�����dzH���Jd��;l
1��
P+q�.xo����'�.wF#�ߟb�ꎭ���h59b�m�{,��kBd�������p��‡�\�i���}���qw�Ǧ$�.��
�&>���|�s=ȿ���&QK������/[�ߡV�|�/Ғp�t�c�.�~�ҩ��s|�>�*�j����o�A_�g�.z�m-`��%����_	��_є�
�f�ń�(�C};6�������DOp���?G^\@-�v�iÐ��o�Ս�w����&�/���~*w�	=��5�(���d����ţZ��nssAo����Q�f{���e�*����f�,fc<k�,�sf��f�\�;�/f��烯��i��	z*Dw��LS�g��D�K�q���<|�۱��N��/���K�R���z�Ł�g�N&h1��+k\��i���m���+smR���c�ճ~�T.�֭�F�v�N�ۧ������_�����~dH�@��} �?��^��\Wc��ɻ�2=�1hc�do�B�} C�7=�?yC�0�S�v��^�
Mp����O/�Z
���[���63�����zw�z�o�ݼ��ϵ����c�[�����=���oW�ׁ>��
�h��դ���o�^إ�Q�}?s��׶jx��B�6[��h
1\�sםj�
55Jk^����y3���=�q���tNE����4�4{<H~�������3�}X�!�t�ۄo��Y_@����kX�.򳡽���6��SS���h�4}��@_�y��1�������h#��5(z��ܣ�/Wh��	��%�k�����nD�&ޟM�&�������U�O��O>iU*z���-�Wj����j85�,�U�O8�l��vή�{�:��R��
��X�ڍ�?��2�=rǑ��[��<������O4�L�
;�7��۰�������^�ί��s�R�L��>{K��;�g?����~UP�k���[;xw�3�\���_���-�����ñ�k�c�x���YLUG��\D�Q@YƹG�Q�Tp�Zm-VA��F�JXTԊ�T����&�EE�j�K�i���C���Y�&�ɤt3��.M���d2߼L�7���06�0Z����e�W����zլ�cM��]d���1�B�X)AJ��$�tK�/="�|ɏ(�"(��h6ͥf�'ݖ��By�\![�I�p�L�,>���`Ν|��x"O�x���.����c�8o�g�o���/E��B�"^$�$�"J�nqHt�n�'�ŀ�⺸��r
��t�9ӝ���x)~J���(\�QV*���3�|��˲F��R�ã�`�]�=��=a�K�R�GyM�)}"}C /[9�VN��)!�Er�|���qD8�7��y<�G�8>�'�e|5�湼�W�Z��<�!�q�2@LaBx�s�|��\���.�k+ϋKbH\�(Ӝ9��a+'�ʩ)�x��(��κk
Y�V��f�Y�V���ʷҬ�V�k>4���.�y�l5[���<`�e֘U&7}ܿ�G�W�C��9w�{���]�.7ڍSF��d4
�a㠱Ϩ5��F�Qb�4�F��i�7���
}��X_�/�$=Q��c�(}����D{�}�}�}�}�}�=�h�i��
�L+Ҷk۴<-Y��6���A�^�S��5j���.Q>��W��������%��.l,�ҟ��g����N�8xc<|0�v���1���D�1S�P�3��c��'LGf �!
3�<�X�a�1s��0�1IH�,�",�,�2,G
^�
���X�W�*V�5�b
^�Z�Cұ��Ld!9؈M�E6#(���pGq�Ёt��Ї~�LJ���K��A\�0>�\�u\�M�-ܦl�c�ڈ=�B)ޤ#�D����N��:�=l�n;�m�ʆ�v��2އoc+J����Yj�.��&�c�G=N� LkieP&��z|L]��P!UQ>P/�Q��ʢ\@�p��]4�8ъ6[؂38��aGY�X3;�ZP�N�V����ewxڍW[o��R{�U�6��v�)�����U#!�ڵ.��ҮR�Sr/��&�Ӌ�Q��umL��o���yY��~ȏ�P�3�]]�%���9g�9sn3n�������O�:����o�xr��7���/?��O?�����ƣ� M~��{ww���;�����lksc�F�6k�E+��Z�5�--��VG���h�RK�5P�
�
�#wk'j�9�;�U�*xmzӑN1X`��VOlm�F�-��nd��3\�Sv��N�љ�
=�
�/�7�h��J9�؜x�d��[���X�A \�A�UX��'-�Ӟ�o�#�4���C1���n�x����ٞҭ7a?OL?Q|ȹ*ybЍ���D8�x'�Ŭԑ�pyON^/�p��f���^lg����A��/��K۲[�j���h™
5�&(i�i��,x�]���$d�Xc��C�B�ѫ�Yl8�
�i�$����S�`;6����`��y�l�)�4�τ�bX	�aÞ����_cU�}Ӱ�-'�
�X�Y5t&��NNyJ��`М��0�<��ۧ+��}�`௿�X�gi���7q����ά�A�Ц���k�"�M�<�{mi���Gb�8{�m���5��-�B #�t�ei�OiB�M4W�s��Pt��
�@�;<Q�$@�7;�CQ�5���s^f<�=��Vj�����X�a�g�L�0e���+��m��W�P�a7�w���U(RU�NV`�ȗ������k�B�
�w��d.��‚�S���{����Z|fF�K���X#l���`e,��	twwiN7���	X8e�e;|;2j�c>TcK����'�r��ჴ$b`��a�{�:�$N�-����=��H�!�\>�MȰ�����:C��S�\6:Y�4���̆zX�]+��S�E���Q���$U�.yS����7�MT��aJũD��&< �����i�aZ��IR��X��Z}��=Z�:��$�I(��u�*��R
.*�]��.j?~��a.�rT;�^:.����5�'Ў�"�)�TT�: {_��
��=
D:�IO�zn�j�7�-�$��m	áZ�3��Fu�V�.�˒_��Z�Qp��N�m�7y�kW��d2��b02�U�1_7_}d���)D���!�h��l'R�)IY7t>���e i���GA;��W�6`�Q��l��~��G�ߠ���af ��Ҷ�N��}�Вn
ݪ��xp�*@�.�rN�}(m��iu�Ї(�c�B�|P��zMf;�T>qPH�����]��D��$����Z�d�!�d�\�iujz	g�5��Zg™%�>���-�����y��yލ� FfV)���{��Ow�
�-��a��*�z6���ƪ��:PTZ�:���î0�ĺE�����p�/mfU�2��b9��2�=��|�^��٨ae��\��QI;��}��JS?*:�X����<��q0�RN����NΐE���Ć��7Β��OX%���jU#��ݢ挃6��6m�y�ԉM�i)��e�ߢm���ծA�k���͗P�K�+��H�2�c��Ձh���	�:�Mh��1Th�����6F��5��y��g��<b�:�& �ЛgR=��ƅ���7>��G�3��Ō#�2��3p�)B�ϛ0׊��U1�+�U�s�"�ފ��i������%��E�:�?��7c*���{y~�'`������B{S��]���ۼ�����h��Y�U�}yZӹS�����^���#@�R��N�,���K�C���(��A����T�{p~�sV��i�mU��+�.r��4�uH_c��,�C�c�D�[��us�={@���;�b�+&'�Y�M������KΛ����2.�6o��]���T��gHNCG�7l�Ճ�FV[vjt˛^����i>�Ԅ=O\�ń}$��q�%�P��O����R���ԝ�|	iM؏�|@g���pW;h,P॓�.���T�W3���K=9<a�oK!g�5����2a؍�Q����=���"�? �>4~k!�\��_I���&y�x�M�INBA@���f12C1
ڎ8O��^(b'4,�p�ʄ
��d�qŎ�x\�|����We�T.˲�g��X\�Ca����o�n��	\�.s��"��8�,�,�p�F8I!�Q�'8�#�c�(D�a�D!D�l�� ��V��ڋ,���#�2��j[x�]ؤGٔ��[�-�I�D�W}x5�b
X��Y��ٜ}3dN��T�i�1��:N�w�t*�|h����D7�6�F�;3�	��2����[4jM��M"���Tӆ�s0 ��0G�ƗN����>�S�>T�.�s�Ԫ���������o�/W�ok¿`�h�x�c���t���ɚA�������o �����qA�"DAu D��� R�A�A�I���q�Ռ{����]x�]�mHZ�`_ך�sιfffv2=�Gff'g�̜3W������s�6gΜ��L"bDDDD����C"FDDDDD�!2"""bĽ?/��`��k�-���;�g�p|�
߃'���פ׼�VR�)P�/e3%q]}}��_��TB*���0ߘ�q� !�;b��H�aҠ4EZg�H�a:&ݘ>�~���d�33�2�p$�BJ�f�F���t�\CaQ�juv�|Kr�qk�V
�=�U�ۼێ��n�o_`(5�3�YƜ��Kpg��_l6��v�u�ww6�)�Tg�3�2��a�A�:���m�08%Ίs�p[Y�,LV(k0k?��c�����C�~?���w�I��lT6)[���gDzdz���gC\���%~�rRs2s(9�Y�~N"璈$���('�N�&�x�����r�����ܟ���$	CҒ$?)J#͒�Hk�=��U*�����)��y�y��L2��#K�zr9@�#%#/���'��|l>%ʗ��c����W l��F���0��� ��P�(�.P�<������c
���P(EF1P��I�q!�]H.��5��T�ʧʨF���Q���ԟ�}j�zFK�e��4MH��ܴY�*m���v��8��
�
:A�9��&��"d��U$,�+�.J�-FŁ�=���N�Ѓ�(}�>I�N_��Џ���KF*���i�2c��q�D0��b&�)g�.f�9Ĝb.2י��c��a,.K�Ұ�Y>V�5ƚg���Y'%�%��DQ�^,,�(Ygc�x6�
�l�����1��{��`��/Ja��R~��TS�(�)])�*=�9x�����8ӜuN�^F)��ˬe}e�e�e�e'\�̝��sq������c�S���K<O��x��.�[A�`W�W�*f!8@\��B�04-Cqhک�W*+���ʙʭ�+>����O���{��0�@/�
F�*d����Q5P5_�T�SuP�[��=˜pNx��|`x�Z5�ZS�W=Z=[���hj�5m5�_ͪ&��"��)���k�k������`�t�v�1L���u�:j���Z��K�%jɈ��a�C�C��ɇ��t�@ꔎJ�q�#�QۣC6);�'�s�%�
����
y�\ w����u��c�c�c���T��!�pژҘ�hhk�o\k�n<l<S B�KV+���EBq��hJo�7���&~�����j
5
5�)qJP	)eJ�ҩ*wTDKU�R��*��G5��V-�6UG�3u���|u�zA}������ēs�D��5m�ƫ	h5S�%ͦf_��mF7S���
��fos_�D�R�v�-\�ӂZH+�j�vm�vP;�]�nk�g:����x:�Ψs�ztc��-]R��l�Toл�a��~Z�����_�d�0Z�-��@�d�b�F��+�2T���k�5�f+�mC�p�jn�h
��N�~o��z�zfD	F�Qd�=�^�q�7��MpS���$1�MNS�4`�0͛�L��s�g.6�J���g5Ϛ�w�,0�B�p-R��Ⲅ-Ö˪�riEZ�V��ڪ�Z�k�:l���Zw�	�-�F�1lB��f��m!�W۴mٶa;��av��lg��.�k��v���>n_���ɧ����ڧ���m
m涎���om�g���\�V����{���'�Y�}�ǟ'\��1�x�~��� v��$��yy�D;!g�y�J�j���+��v}w�}-=�:��>w�������%�zd���3�������x{�%y��o�{�/���;���H�:��������]�ǿox�{?���o�D��ۥ��Z��u��y�#08�~0~�����2�
���`op:�<�v+�����nO��6DiB����r(�%C��ˏ����0&,;��/
�~��tЃ���,F��?�D#C���dd&�Y��#��^n��w���g�s��I���7�w��E�e�K2
�Z��ѕ�V���+����S�K��������,���b@���H�*�xڼ�x�ŵ0<3��{�]m/ڕVZ�b�M��[�{�6�M�B
C��4B(�����`RH�!�܄��B^}3�[$�ν��?�e���yϜ9s���H�b��3���yݞ@V�I�SzF����:�K���ղJ��?�d��U9�`�U�e�1�]&G�2�O߃�4��'$R��zzV~�^}Y���T S�HJ��'�ZuZ�d�333P
�O������"ϖ���M���98̇t�-���S��4�.U"�����3~��y<&+p���:*�A�U!�S��e2�
IM:$��0����P��1M_�%��^aZ�z��;���i!���7��os]s_lg��֝��7�/�5�3q)���껮�n�đM_�6Y�M��G���ވƙ8�t�r�K�r��["H�|uQ$*2�xBa$�F�-�X��K��95�B"��(��y5���1���uht �N����L:��f�1��t�t
7���^q���3�?��j+��r[�-#�3��%q�{I������J���Y~���+=�]��q�%B�A��{L
urIwaY�h���v]���YU�Pn�����Ǔ���?��%��8�� \֕���B��K\���Q`�H��i����5E
o<*LuB2�G�`��/�F1|96��:�-�F�t.m�?�s�Z7��sU��y�����--��y
��S�h��ƪ�����?
�W	�S��7��	oB�4x�:���R�h;Ol��+i15��H
K�R7l��P��0ҩN�Ms�J>��3��(���_jI���S���⤯��*x#�����l�,
E;\~���QG�N���;�L��x2�Ѳ�M�m	{�����oɵ���6�m��F�[��*l���
:,��)*��g�a"���X�,Qy$m<��B;�P�ӌĉ�gry����Fay�������?�1���7��=bZ�eWz�Sk�]��0L�����Q��$H�a�P�k٘ﳆ[T[:���ޣ�v%�>�4�k�rSd���4�
�c=���F*��%�'�$��|��ɔ��"b����`Z�7
� pQ|P3��i��
�α1g�0�Y�����o�}H��Y�<�R���TJ1�z�ޛŚ���r`˖�{������M�� �g!f@��z3��h�p��rI����~����p\��.zǪ0�u�0����<��1@�"N�$黸�[��V��a���s��"N$��ѱ���'t�t7��4��5�&�̪����+6��@$0�,x�O�$p�S!����˾^�l�ۜ�6�/��G/>�r�%K���-�Ŗ�rK�+�/���4�Z�K�R��W�0��~լR�JO�Φ�
ƛ�2�O����o	�&���8p�ef��
��)�v���A��<�X�J�@a�W�@ƎHC���`p��<�2�B$T0B�>����Έ�r��^�lR�^��w~�����]
��C�y��m�kun��`UnT����hڛ�d*�զ9@��^��)�0��`4��A~EI���'�㧊c �N�x ��B���j�^���-�]2�78jΖ�#�l�R����:b�����m)�
�-L��:פ��.2�i���b�iZ뜭���lp Nm�n�*d�s!r<2�@��b16M�x�`!M�$?��B��t��¶�O��+WV��Cw�_��_z'������$�0=x$J�u���02;d�6Ԛ�Z7��
�c]c��V�L���]P�]ם��c���}���),
�9�7c�[�����[z/��a�ΣW�������VyE�%��`,Ȩ�C	}
�\��ϳ9(߽{�]�*���5:j��8�[޻tdo�cO�����|��ѥ��ʫ�D������o[ܳ��_Ÿ{��I���ʆ�B��zʞ�A�#�J�;��⺾�o�P}�n��e���3 :�w����i�Kf�!���+��4�s��橱!<D9M�@X�7VD��蚧�51�o`po�'m1�M-����@���3�t��ѕ������sG�hju�Zm����=���ݡ�\���#i�95��e�2e��m	Z����)m	�m
hu~�٧��f�Q�
�3�9dƜV>7e�h9<��D�¹X������ս��Sh�CwktOX���e�� S�-�����k3��KWm�uΌ�;�ۉ}��ԷS}�ϓT��%1�������[n���A���A���q��O ��Q�4NM}�5C�η��
SF�*@L�_�ȉm��,0��<>�f)�g��Z�]C��{���*��7�|ç�Ie���û)βg�c�~��*~��	՗`�+�^�������Z�������Y>ĝ��.|�?���n�y���=���0�x ���u�i@���MM	CN�!V	#���2�ϭhm�[#f{�%]��o
�t��֐ђ���w�BB+69#6[@g�i;�E�11�q��.������Q�O��.ƊV�I�{��ufs0)�J�5�����v���gp0�6�$�'�rd�a�M�3�ƺR&��a�ocE
�"E| ‡T𴝨��K>62����r"���q�L�,ɯh
��Tk��d�Ht�������bS{��Mƣ�*�!�*|^tѵ:�9�1Jg¦�u	�:��k�Ş��9�u����]6����4��=�cv�t�W&�S{�{��LT�.����y7�O��Xl�*<��g3�5BC>~��!��rP�cČ�/D�/�~�D*��y|�H"�P�)�k��h,����7
�At�pJ?�7�|�}3���i�<�4�@�'����[�=���
��`���b�X�SS��i=��M�@�,�'Z�}�<�f:�uV��S�L�4x��o:��9l���+���{
_�XւNd�[�k�u̅_7����1�l֐�ʈs���>�
�ssYf�q�#���O��7q�Y�"l�
�F��#g|���?�ݮ)��2c�#?s�U{��G�\��[���R��ŵ-}-��AC"Н	tm���7��g0}$@�e�� &�����ÑSFK��&(�@t�����fj]綾��K��޸�pS���j������c�R�I�P"AU�fG���z��Z���c0R}�t�gw��)V�ߌ/^�T��5(����硥��˻�oj>BOb���\�,��^��%~QE�I.&`"�4a��0j&��6˥^��f�j/����Lfݕ#�>��b�Ph�ٝ��X��yK>	a��v��c�Wml�Ͷz�驲�-w�P��z{mL�j�A,<�UtTdPt�ګ�=�xޭFǎT���Q�Cƫ�C'��@'��:eQ�ꑣ�5n#��|��b�è$���'��95���X����SV�QMfۊĨ�V�ٚ�ꀗT�Zz���1/��1X�
	#��/�lQ�O��iC0B��Q�rw���}��V�oW��˫߮u���:1<>��G²"�b��v<�g�g�4G��gĐXG����Ռ�!$�b7����G�������jq'��8Il�O� !U�H�h	 ,j謹��EG/�/W�0�(|�t;�)'�S�״ Hd��u&�3��/�jAV��FX|hu*����ءU���C��ڲc���՞K��2V~ǖ�����޹�p�U��pkl�7�&�Ͼ	N���c��B&�3H
��aE��������mc��C&���E'B}ю�}�[lY�?c��F�#n����:���3�98����Z�q�4��{��旦�2:詞P�"J~�V���8ݏ%L-U*�@���خ�%C19^r;��O�}���[B&[�8K���Nu�o��pf\����a�C4��"o��1��ԋ���o�p��|[��n�H�o=�I�my[�h?�|C��Mƍ��YK�2�R��c��44?�bF���}�Ȼh	;��qi�9ɡ��s:9��N�Դ'�#S�*��?�9��$S�A��}�¦C�p{�S��@�g<B~>�!O�@�O�>,n�/�|�DҊ�o���Z���U����ϑ�MK�g�?�����N%���H �x*PE"�&?��h:
���4c�b�R5�����e�]��;���j��W}�++ы�W��_� ּ-��>�Ƭ��1�Gj:Pȓ@���b=.n�Aes�U�;��ԧ>���?~��?��zw�����w�'�<$�	!��E5�P��,���/�Y���b0_�����	OR`nD˨�\�1��&�J�D�z�M�~�z��W��O�����֪���|�GP�~E�>�d���4�h/�zWW���8����H����ޠ��CZL�/�g��G�ml�G�l"�ag�n�߱r��(���Y�AG���X3�C��X�k��O��O����6������8�EO�T\��w�s�4G���m��3�M��F�|�(��O���[�.1�~���b-�"e�;���y<�OZ1[$�R)�in���Ps~?M�r~������q�F��N�z���7�{�}�bdq$���c�J��.	���g:������f��Z��}��Ԗ�9�+=��[�kЅ�g�F�E:�I��H[�:��H�S��Y�ǭ�#2���"���Rʵ�H�͵�yV��J��fC/���[:�Y���V��%���U�,~���]`�%��j�v��\dtc[��Eኹ��G�1�:�Q��2>@NL_�wP�15��-&lxd�D�a�<=�=89y��u�'���wL��M�ZIdlcn�򑑎�����*�&��b:�q�k1� ��B�*bt��
O�]���b��0�����OИ>����ё�c{_q�eF��|q�/��V���}�h��L���P֩
z�P0z�P!
[N�̘�gw'3-#ȯ�Ǭ�h��*���F7�3B�L#�wYͷ۷��Z
<�X�i#6m-�f4c�w-�D����D!��S�u#X����A����_�����k�K"�6�\���A�Y�p]�P�C�nw;�K~�	˱���F#��İ$t�v�Y@*�s&Q`�D����,ɺ�]VeH��>�N���gT��"i"柮�c�c֍}C=��ƪ�V�R@E"�蔍ɚ�q�FiN�Y��@(�4oP�Y���u��+�q�]t��侖a��td0bY/2�<�,��;S>�!�e�#��
���5U����A��;�Ӛܡ0��W8cfK��t��������I�K�jaE*P*a%���^5�h#T7I���æ\D23c�Ԟ.�0P�%]�ױp}/��m��=�@��kI��8���"�4��Z���A�����#t��i����Q�P��N#pW�)�JM9$04�>[Q�Ri���2�̋F�j�D��"��?��L0f
�s
Ö[Y��P��>�HyܨY=(�z&�j�#��̼y���xp��&��1�!,cXJ�x�/�(�mM֡ki�@�cƤWy�됽��}�u�Y$��+z;k81;0�����;�j���*̘�	�R�R�����͈�LH�����dn~�3�@pPɽpl����.�L�<r�l/%�o�@W�#�gL�!�/�so�H��7�X�
lNd�s�s�1oD��|T2s@׹�5�喓�X�m��͵~Xҍ��/�i]�3iں�>?����@`p�\�<�N��t���
v�$X���G#�g>�Bel0���W��D����x�S�1>�����\���և�1@ub�>zs�
�,KX��u�iϞ��o߲��^}V�,�����7�;�bٖE�FW,���-b��\���	+�-T�x^*E+��,���RS�+���S.^��,*cm�p�B&5щ��L��ޙ�{<��[�-zg:��%��Mm��#�|���N����惆�]��sEZ�|�"-��-e9#�RQ��U+Dh�d�������3�ۦR��V_@�ݹN�0����"��p����A�^������"�9ƗF/�j�e�D|uK0nIz�����M�\hȯ��g׊hE���l6�^%��̢op�i���-M �X���N����8��>�D��K�xb���"ny[ͮ��A����D�������mz}Hfj��B�n��g���I�'�o�vT�^VJLP`�VTjIEV��+���W�zS�3�M.[�m&��#��Zg��Zy�wWϲ��P��������G�Ƹ�-�6J{1��5vb5;Ilv�!)
�o�x�u���d�]���s�3��S��i������
F��T����d�$��K�~�{�Ԟ�������\��՝������⡇~��Zܡ�}(i.G�@<9πH.i�c�N�I(�J����w�$��Wo�#���#٣ͣՏ��xD�~򠈎[0kE[te�DtJ�H�&�)�q�;~65�qJ�f���o:x����p�ʥ��	��(�
x��Oxn����^:�iY#ޑ�xGp�x������;�WY׬[^}t��2��b_�ϊ��*%A	]�gS��e�J0f�#�ɵC�)�J���-T9�
�\-�8��*�~�w�4Z��:�C����E��^	���k�qO��T�f�|̭�0:�@m�,@`�avĿ�ro6���02�{��Q�s���*��!�A�Яc��5�?��
��$��+�p�i��r�a�������
\�1U���*�m
W6�+��6�tD�·}���&��(�Xl&��^��l��͙����L}��B��K'�ɥiq �SR�o�N�����
�ހ"�:�a,kt~?Y��>���RP�t��$��1��Xbŀ��UA5v�H�\O�Q�`�.����o����V�,���v�
�1s�a�[�^�K��N�]�D�g��
��z��4+C�%�.x��=*�!��%��L�~�^�c+b<�~^���è�iqŤf�&̃)�o�b�Fl�^e�P���X	��Fx�z��7�]�B�.��i��0�FU�i�ͭQ��kp�:�R��2�Wl���Tv�����Բx[r�'���B_��Vp	"�H�I�R*�bv�b`7�'�c?;���>�е;�8�l�(dC
��]�

��a�`�8�_��!�td
��>�J��O
�]y�p�ߩT�����5l6�����I�T*�ƼÞ7����*��?՟(:r�o1�5nǯ�8��Ȓ|�	��F�ժD2_��F��u�"�eS8Ǟ��$6��%)�#����	��y�?�/�=���\:��;����m+z+��f��{�T?�X-�2��a!P=�X�a�]�α5�~�R�@Qu<
g�+~.2�|�KX�c����p�>���%%�LE��w�+�lm	�0��<�!��w�["��n������6<K�e�6�7�
��ò)g��6��ڞ5I�@a-�_��e��-bg��*����:��+����%��H�	���S,w�TN�� ��F�v�XQf�2�@D�T�dj��g�P�ۢ�9���ef�T�I
bv��5� zS%��Md����%��X��rH�J_�|�/��Vve�_f���,X=�/=���m��o��ֶ���{�K&V��d*_q�X~u��ٹ��x�����QY�v���i��!e�
an㵋Ǯݐ�m�vl�s���{��wO����wO�y˓��Do��ԙ$:O��9Ur�:�n�Q
�q�	�쉧@��4��-"Q�;���_��/�4���d�rpZ]�w$–NՓJ��9� V�zF��Pj`�'�������)�Bn�<d��R�ҫr���xw2ۣҺ�:])>:�U)��a?��R�d��@`7�xA-�?þ��h՜@.�2�e��u
]�'K��Z ���B�VD�
�P���
��@׿]x�]Ow�?�|����o| ��A�$��ug��R=
o����K�uo�s����"uo�&�
��>Yӕ�dr�A;f�Tn�q+g�3��gL��H�y��JY�r��e7N
�7.[u�dbjo��S����k_w�t>Ӗk��n�����Tfɍ��1'�'v���L$�6�볦�����]����P:���X�dy
	���)o;p���nI��Vb>���H3���y2�@��I�=�Z,�F�I$2�Z�'��B��R(�$��2�R"��B��O�.�_;��P+��K�T������A�N�2-���n*ul��^�w略�;�m;�ټ5�b��R�(�Iu=.��R�JQ�sNa+[�a��~`�o.$]-�#����	K8�eW�Sx]v0���=V�[e�.�`�'���%V�j1[S����(��	��J��G�u���Fhn�]`N��@�r��5��;�
�{��b1��Ie�Ǖ��B�Lj<
����f�
�,V�Mס3+Y�'&�¡���J.O��>���l��2�&��.��ڊR��HAs�'G1�“�;6��RQ�J�w�����}态/���v=��Y����9ƴGk�U?³�"����oY��Z��Hf0���@�[���[O��F!ϺfЏ#X�300�']��Ҷۙu�KМN×\���b��:w�ź��1�'��ge���	x�.��v#�ž$��m6���i�yJ;��z<�*R�'�H��� <��_���/=Y��4�R�W
��^,tU��c|k���4KlvH���a]~7��V�jo����g(Q��&��8�N��щ[�A�)h4M���g����Lf2���|�'���z@��"����` dHlx6�_�-�B��>� vQ~��ϧwm����fڹ��\�~�
�T��������mj���;�O���A���|.�L~2S(p�s���X�%�-�c�>�<ϟ���#�)�p�±�=�%%����qK(�u��?9�dc�vA3䗪���H��&/}�I^T�
�Kˊ><�x1��f�͆g��T�2���?�)
4
�bi�����&�'�Yӗ�>_0�
Z�GK�hI:)ko�Y�ʻ���d-o���QF#6R��ꑐ����ç�Mִw�.�v�:Z�f
��~͜�5��-Z��z+�M�T4���^p|���c��)h�����>�!�*n#=G���ݴ��m���z���N���KJ����y����:�#{ƮӑF�Sh������F	4��lI�J��'��/�U�jk�s6X}�+K����4�G�h��NU=��v|�:q���x�i��Z%�;g�V�"���h}�sG�{)��Lc�l���m�����&�F���M�6�
��*
�����Q|b,>��R|�ph�}�8|r�/^��,I8����?��F����M��öyx�3DZ1X�]V�9=��y:>��yM$����3֙9��yoA�Lo�T}ma�Y�NOS��?~��m�%�ϡt�p�]J��d~���m�^
't�6��h��9�<>���mwQZFi#�
�O΃O�W�_(k$b1��E<! �1�@H�|���0��D�8 ��:|rb˖��/���-[&��/L\��W�U�����:J�"G�W)���l���m�:>�9�����q-hsS����6J��7���p:9��C�Ӽ��:�CT?X�g��H�J	���QE���qZ�^�K*�H�\[����iR������Go���֨�F4��O�Љ�Շ�Y�'�
[�O�A��VR_���v�*�h�&�7��<�9�k�ͦ_OV��6sq�I�޹̝v�&���S;�C�M嶕iS��=[2ݶf�R��`w�]1cU�$m+��ᴧ3"�L���Ӎ�]�	��Wj�w3�T��P��?����+�������m#���$-��C�6A�~����Q�g�D���u<�z`���GӰi�܁� ��r/����"?�j��N&��6�[�r*ƺ+F��\=v���7o���OP���y�R+�����xas��ӄ%�W̶,���^ܹ��^_�����4��s��ő�}��e�ݩ�c
��L�)�R<G P�1��h<5�H�FI4�O�|�Тˇ%M����@°ѤSk�~�H����:<����Z
L�!�^}��u�#�<_'�ōyfۼ]os�u�M�m0/�#-���\��������
��������<y
6,���{�i��A�Ja��k�����_
�?�/����~��}p�u�v��Gk?"�Zx��P<kM��i�A����O��]X|��Lݸ��J�Z�1�����_"U�`B}�E�;F�{W�3�����-C�뽠�Y����:}�y��/j���z.Z.��OM��#�y�K��������|�����+�˙.I�!WO��8���FB��y�)�'��wP2w.�)��9��;k��|�H�����&��O�?g�!�4�E$�+���{6��L�XD���3
��ɐ�'/�ٳ�z�9|�z�UW������q���8���Hk���0��M"��ܚn*N����Y�=�%O��3��YM/X/�W�}�?��6<�|/���^�`M�R[��C;��6�`�.r-!�n���*nή�s�n����򷊛�St�gm���:'u�j��(���CdN<�$��������G�do�z>������*aE�*E��o�#�d+[Jƭ��%d\����֢��y!ݾ��{�����dZWPk�{u�7/�y�f�{W�O-ߔ�G
>�C
�Qan-6p>���U$�2S���#��c���1k�N��Ճ�l~�s|����m汝F�c���aa`=��
�6Rk�>G�����h�!����>�����}qs�C:gnq��9��E
'rV8��(�����!����<��/q9���r\��o�H��
#���°6Ƀ�2
c���Y)��>�Rd}z
D2�~���c��A���l9�
��&�[�ŭҊZ#!%b���֠�1���?/I�0|���i]"�\����6��^W�O{Ĺ�_p��<�n�<6�����O�����Z�g��?:.
8�o.�sF��|�pr��{���a�ϒ���3�{������}��ԖF�4���(�('�ߢ0Z��1[I`�rmS�KMm��9�Z�·s�A�t��CPJ���!�
���'B�_��||��(��b�Wf_�"�3�z���j�̝�c�Vn����^a�
��h�:Ƶ���]e
�e�/oQYWwY�%].�$JR�/i�v6QI$>شˆ�����ҏ�>=gC����=��4r>b�����V�w��U��k�X������~�<��3U���)�\Ԕ�y`��9�q��&������O�߹���_�=�c���x�9>:��T7�ql����m��1n���8��h�a�g�Ⱦ6�J��>����_��-��}�]�ͥ$`�ڜ�p�����k��:G��b���%Z%K����K脊�3t�<6�_Bo�(�}����=���9�c}KC��ހ�����)~1�����t�	N^���TRyy�&/�JQ:,��=���5���pe���/�Wᦚ�p�l��C33���{w�~$�����&'{�tl�9�CA���u�T��qmT�T�Y�R���s�O�x�环c6Bj~9X��~�J+#��dGW�	��,<�����������C�,����'jσ�a��=��1}\N}m��J��l�o@�U�2Hu��T.0a�k!�6����FH72:�p�]��Q������v�65b�q�+���X$RI+$�O9�+i3����IOuƬS���g(��44A�!Oz�9^f��Ǘd�"�<>M�����(G��Gm�87�ϱ��9���u|��<^��/{/�7��Egc��YӐ�����2��&>`�2�ݓ۟L֪�v{��?p��v8}$9��[�R�Rc��%��3��ө��x�$���v /�I���ԤJ��bT��ԾV��|�əj�	pW��Z��>�~˒��0����\��DS��z�A��yi6�>Y��Y����m�2L`�ϑ_��ks�|����s��g�e<�}��Y��g�綤He�ـ*�]V3�P\qԶ�V�ĥ䜠�R�r��-����lU��k4���Dz����E%�!�|T�lb$e��Gb�Œ9p`�+i�mҵ'�[ɪ/�?�M6���1�s�-�zIeJ�����4���^o�)�I�ҹSp�\��8/oI��X�¨�-a�⃃���u[�`��d�]��A�E�����{0D2%���BcL���o�1���/�|Ж�J}�/��E�����
w���@0k��[c���P�u |�MNr�}��<�S~Am�
Αo����
6�w�p�R�lo�:'�钟���s�m$��u8�CT�h�M����؟�ڼ��|��;	N�:Nt�/s/����;8�=��5`�u��J��cT��F��p�WQ8�������24pɓ=�,��=�=�'u��s�b-8c�ǹ>����q�g�ާ����I���Nv�����c�,�}ҽ�Tw�>���C.h���!����tLS�W[��6jk�dŅ/�l�P�*B���/9���c�����h	�.Z�cZv73�g�\��'�8p���r�V�XDT�^c���l��l[\П^�	��K�9�>�3��=�_�v6?�����L_�uub�:3��u�9����[p���1O(~8
�:�G��t
?�
��7uX���z<I�y� ln7��Q��_��/}s2�N;ٯ�¡�C�%q��}��i�t�8�G+�p��äh��ݏA豆��Xߨ)��^y?��R�m��X�,Oco�i���*7��T��0�L� ��c���i_]�n����#A�Zϵy����f>�Z��\p7�K8�����p�N�M-�r�W�-a��@ad*n n�ıI�\�M�^�9����&�Yrhm
;�V�7���%7Z�\60vŚdr��c���z��_�o�tE��)���֤;޶<ޱ�P��5�;�.ͤ���3�:B���	�=N���+�cj��ij�ns�N�e�+v�>�z�*�M��Gv�8�ʰ��M5ys��t76�l�ޔ��7��3����$�
̐h8��߈qXjS݇z�fO�v>לX��c�u�{���$�jas;"{�Rx�8x�)<�6�Tyľ����82�'�Z�l�HQ�*у	��;�:�o:����R�����Zm�N��YWH��A��N��0�����w�9X��E��.���޼�qF�F��6�l�:�V��,�����|Vֳ�����O2�w"iY���R���,��}�ۺ��f��\2o���^e�]�%r������^.�J���.��"FiE��s����r!��X������}������]��.:�G�}������ťc�Bs6l<GC������K��;�L�kq>y�jpx�R8i�Gu8/�i�G����s�9c�8�׍�#�z���v̉�:�ju�-��!lN������|[�����t�o������z��:	�]'��_w&���ж l��X�gil;���[7{��n
l0��Q�L.+�9�O΂S�eb�@*S(Db1O*��j4n�I�#����i̱���q�@OΆc����kGġ�w���؆���/6����"�ަ������w��q��mK2�J&'L�S���|�6d�.�֭P������e��4ͭ�F�(���u��k�������3�RZ��R[�gLgo�T��a}�^OQX	��F��c�'>�BӨќ_G�X7�:ʚk��u�ǹܧ�뢏�uђf�:P���1����2s��Z��z�K����d�z���z���@�s����\-ɧK��*����PZ�1I>|�T���as��|��\>\t�|��4.�ss.�\�c�s�H�l��m�I.�s7�s���9r75ڄ����Y����qoNo����'��1�Gc̛���q?��u���4�F+��4���6v�����Z����<O��ǹx�q�x�q.��5҈�i��%6��7��4��4�r�n�m�����)0�z�M�;�N���{�~17�{l���y9s��NٺS6�����\
.n��̭��	�Z��:�m�D�p�K��'�}�����\�c����Z{��u�L��u��>_�u����9��s���M=�7�P�����^�skN�1��z����*H�z��(���=;}��U�8�2�3�e�OU�1���Ν�c"��d:a��t��Ҙ56&�N�`C����=Ax'�������`���	��T��;$�I̢p;Wx٘9�h��#��P�d�������K�>��mE��t��4��|�d�Ý��M�u��a�~v??ʂk�p.8,$U`�e<���R�n!vm��c�m�'[���������I=�	\ko�k���pK2n�h,�/�&�8��y��+����bqv��
#�;}�y5�޼��HB�Fс�q0�ɗ�aH�A�܄���vO™�����]
t?2-ć�L��F0H��S�7�,��!6�4�o�{��#���6�@OV]�3k�
x�-4�x����H���`�x����z�����v��&�A8"���*��h��V��h2!a(�a���(^�.��3���h�ێ9Lw�����[�\�}����0����K5�&�:8p�?9��n����;~sYb����#�B��;2��nO�����9Or��쎳T.��N/�����#C>tK��8:ZtD�9,4�#%��h͕Wb}������սx�������]����(>?�����#�V�j�@��;R\M�� ;&!���P���J�\��
��=a�+�r�J��{Y���C�1�Ԉ�<�soi�W>�^s��'��N&'��]��~9^���}���	꜓b�s�_Г�:��F��V�|���|›)�6�49ُY��"��}���è��C�]^D?�-���D��[	�ϝo <,��W�G�e��G����Bqx���2�.�����h�]F�akpO�:1�ŞC���n�ij/�(s��f/lI��3)�m�I�p�@�Q���kp���b��(c�3)���~���^��<b>{	���<8�E���鎄�i�u>{�c3��_���#�a4݊�G��кuC�قt�'�I< W`�'Ss9��a6�����(�j��nm
e
�Q*%R�A���-�hK����"9��Y��0�>Flr�F�au�2-* 賦�M�<}v�%��h�(��s9�����撑��Mv5D����n�4�s�%��`��i>�+�h��d�"�/]�i�C;t���,"wo���"�A�-X`/q���Y-�f�����n��3���Oo݊֝~>�ݙ�z�oY�2S4��Ng4B���Tmw�̼�$Ҹz�=�d��'������I�U_�m��x|Q�j�����˦�}7��m8�W�^f����G�#�%�@��$�˧)�D�(�'�-�\&	��Ӟt��^RiT���ҥ���B�8�^i��~�.B��7�VZl}$�_�4Ҳ�Uz�~Na��w�.B��m�]��
:J��S���S�\�G��+�9��s��Wi�f���,�ٿ#r~���,��ہY�7��VTr�H��s��`�yx^�p^�Ae-X=J�:;�����3��p�-秇wu��;��B9R�rV�1Z�w�7��ⶡ�1��D!�8~��W��Ƃ���-R7�(z�
��h����8��4��g���Ƒo��Y �/9�&[u�Ԧ[};4�~w�?�@A��'?����6�tn�������8}[�ӷ+4�qp����Qq�' �^���k���3���@�L��b�\v�.Νs����.@�
+0��b��9����Ո%��յ-d^��+T�c���W����W���g��T����H�j�$7⡋��y���.�V���}ݛ
h�ʋ��a��H9�IRM�=?�A�:�T* d
�|R{1zf*=���n�Ps��=�G���Mc��?�_�8�0�
:Q�
�T�{���m0S=�۞pXc�ڹ�_�x��k% �+�������
�4ء�;�A��-�Z��7���)��F���>���;����՟�y��ZN~��Ï(ʛb�%��I�����x|}n�ُp�z����1�E���l=����Rt=C�X��	�*d5G�\�?��h����;G����n��T�����j�7�G����;�NJ&>�ޚ�s*��{j�l��G������◟%�D�3����^�u~~���l�X�e���c��K��k��ԣ���[�ā��P^��ϝa-�`W
q�ԉ�JP�:a��ɺ	�\NgUKy9֐M����ږCߛ�Q;o��e���^=�Lu��<�i�m�����Bq�����A(S�D"��R!B
G)r����4���A&��xi��2����AM��7:�t��Pj|��H�/�n8U�%t���To!�Z�o�<��`\N��F�J%���b�
�I�5��9�Gk7�4:+�������]�\xr��j4'��BW���Owt��t��m1G�y�1d����@�P�T)9iԬ)���Q)��C1PHgO��NId/w�$�K�����T?�y�c�;]��*j���5��q���s<s?���B�0R)�n�`�-�Ŕ�G޼�Z���ڇ!���8c�|�ct={7b�H-� %�:=z��{Ga,��.����2��
<!���l��wM�{٫�z��}�R�Zt�w뜽�����uc�}���UhE�(�:R}��>�ł�{��m�A��C���y��AOu���I, \����
#9��Bz���O�Y,U�7w��c�Vm���+����ƒ��ȶ��0V�;`ƞA+p��V�B*c|�	�U�׈vb_1E��=������A5�ױ�tA��\Y�ή�S��T9/�>��y(5�t�{�%'R�t��̋-��7�gY����Z��ؽ��W~
�ɤVtŇ�v�K��e�Z�;Ӣ���ԗ�ҪF̟�Lյ;�j�I�V���Qh>���9u��,��1�Uto��V���Ĩ�k��B8�n.�4�Y8%m)G��^�0�@=_%�uཟv�+e��^���[ro
G�D8DŽs��������zD��X���y�r#�1��e��d��b}�*��1hn���~���.�e-˕���]��{{���G����c0q��m�Go?N�M��!4Q��m���Z��ʺ�w�&f1�}��q��r`\�T��K`���4���p�dLG���$��c�	�m�"�k�~�,��ϳ�8z�%��G�>�!����̏���O
ӳ�j��MXNj��B�X),&Fw�-���ԏއ�}�'�M�?�X���U�
�rȖM�2�#G��_�*�\{� <��v'-���x`�߲��kNx���>�?t��"w?
�3_DZ���F�gةd*"ZGg���sr�^�3%ݸRr~})�z�)�ΣG/��wt��ǧ�\_��Ʀ�;&�����֒�3�?]w���Gv^rl�����mŎ�;��<'wj`#T��\�-�k��`���`��Mgk��г�c� ��^s�2g�i�@���E]�}�U߇W�al�x�����\��{9�-���U��h�D+���vr�� F��o�5ݾ{���ӳ�����PD��:2������ᡮ`��*I��s��S9U�¢"9VL:�,��SY��1�*EB�^*+��]��Yr�
�%W�m6+��j �o+�s<�f��|�@��/��
�cE<Iwݮq�Uv��hlJ��Z$�����+��r��84Z�z��x�Sߍ�a}��aƬ��U��귐lo�����
���T��p�����Y;�yzz�[�i��i:��xzG��V�u���a�C��놏W����0�ݳ�P_�%�8��Ƀ	ׇ��>�6�x��I���i�i#-�$�a��~Y�����9>��S���=7G�����_�NW��=����n�C�҃�y�B�������\�ZK�.��>���ک·��p.��*�-�V�f۶����۟H��/��&-v���WZ�f�ŒK�y�	OY�若���s�C�d���bI��9-����{���V���~.�~�_��yH�d��g�n��jg���r���gyK3�7����y �d'N`z~��_#��
t��p2��"��Hj������rFS��f����M��*L�CC��E�1�w��ܰ�S?k�~���L*�>"wH��Yf�n��T�>���f&�G��`�����9Xv��
k�Ģx���r㤗ڐa���9�d/�|��S�����N���b��P�WWs�\�`��=�\u��5k(�ɦ=���!
S�_ޥ0�*�TM�c׬�W��c����]{���3�ܙ��0)P��g<'�֎�Q�Y�V�9(S�"Gw�@�6�K�d�P��G����d����}�����X�@��ڐ�J�nWH?v1Ij���ն?Dh$��~h�نq�@=��)�v��
���]{�+gT�uv�W�i0�=���`��S�zkx��7��?ؿ�-X���@k�@0H^C�Z�
�0M�r9��":�T�0�c�KB���l����֙�̌:��h����H�aZC�㉴���Ո�����4��1�i����pĔP_�
�켩�=�J�>�~]/3�n�E�Ŕ���.K3�_��L
/x{�<����=@�|�Y8�<K=���E\�H��.�<�a6�$#*�K�U.�I�s=]���;�^��k��y��%ى���g4x��n'�F�o��߄�`��~�t.�	R��Y�)���y��C�Z�`"������O[�1�'�:�w�9go����65�j^7tN���w�x�^u*�+�Z�EE�3���Q�^�ro�r�:����A�]9����ea�=��ov�[�;=��
N����n�p�\._��':�!��0�
j�G1�>�9�#�����3��to�|G��^����ޝ�����&E���\��$���*���ܐ�|Ѣˇ+��xr0L$d-�}��1���,�Ȓ�����kڃ�d!u�ҡ��x>1������+.X�k񟔏vfF#����sP[�E������᳜�T?	��7n6���k'��m����%�X�]�㓩��,�|��`��!Ǩ�6��s�x~W�ro�����mrS�5ZT�,^<��ۗe��%̅U���:^/_k)L�&�ɖ? ���/_z<-]w�С��z�սt����
֜��a�t�{�H.^�7��Z"������U%�?���0�==�
l�Y�ϹY�
��_�� T��;\�ĭc��
cў��υs����J}M{�X?���N����gB�����G��n?�?��cb��e�O,:�yX4��롮�)�5��@�4e�k.ɡ�X��;�r
uL�7&m
�ɚ�����̲V�M٩��un-�S�Nj�K4�lj>'.l]��k{8_���9��z��n���߅+m^���X�d/����4�5�O��Q��;�Z!�'�F�(�ٯhZ
{5M�cG�^]Ϻw��ͼ��c��q|&��u��w�-K?�Ľ�]U�?~�9���{�u�ܹ3s��L�d�+!��Fr!�!@&$�*MT��|ʣZ�T�D����ς�"̝�.瞹wf���>�$3�;�uv]{��~�۷��S[[*Z{�9���s�C�m�WY�ݯ�s��b� ;�]b���,g��[��5:�����[�2Ķ�W�LJf��y���;u3�S�	�%�?�3"�*�P�W���d�3���z)�|���E^:�j���jo-�`�S���=��:h��:�_�+:�W0��;o�%֞�Μ:�`�oO�x��
� ��i��}%("4�i�*�p v0�=��y�֝w#/9����z�d��_ؘ/�s��ڧk�_�'���ѻоm��K�仴A��NM�ͻ
�~�q}幻o���������5v��nh��җ4���T����Cv�P�� Ұ�`ȣ�=�0���'o5�w�n�K�S��t�V��S�2X����3+�Q��|�3Wl��W
>�Cr=����ض��݌ʼf�BF���%B�u����Oۅ(��3�����]H���~8E���T�q�J�g�2������Uv�����q=8R���1n6��1����1�T���sz�w�����V��l7sEj2>�������aنsņaa.<~d3�܎�'�۾_���+���G�x>G�G�u�H='�v��d64��6��l�(�`L��>s2����쪊����sw9R6w�v�em��F?�^��쭼6�[��V뽱wb�=,/��
Q1X���D�E��pX�2<�8����h�Bz4���)�Zה����5��Og机��*�E��2�<i�mÑs-���#b�Di���+1�~�昳�����y�09�O!_�'j��}x�WtM����'� ���:�2-;���<��bj�����P�
������һ�|ps�{��i�\���r��u�����A�VK�>vY)��ڟ���?��¾ҋ��+wCZ-e��U��* �g�λt���գ�����B�G�Qez�������ԑcӵT����с	��"��#Gg�j�Cq�H�al�ʂ�W���v�v?"s�،ܼKҏ+�<%SLaW�㶔۞��
��-�/�
/S�Y-��2E�B�Q��m9T�&i	��9�s�]+���5B��`�@�@-�U����4b*&;Dv���W�#���T����ǨW^95G]���p��{����e1It���l��"h؜7��\f˥�/��q�-r�=��wG��w�a|��Pi�M�Z�NG�}LдT��Q7ܰ/0����s�w���A��_�������<�[�u��>�d��gdn
a��ՠ���jh�dB����۸U���O���ζ�����Ȗt�ƒ[�e)ܗ����Z�ʦ>lh=�����?�w��SwV�g���>�Q!,y��Q*F�P �e��3��N�N�-�W*ࡓ��
�<����D{;�ѫ��k��=�u0A�x�ׁ�宨��T,�}��ŞQ$�xű�7|쁛g��jm�eO?
����l�߾ŮӰ%
��˃mUΛ?FF��PGF`{��]����P�|浍���o�=�k3�G��`��T��¿P�s��0�5N��_��u�w�\���~�s�o�V����	����ê@ˏ�d�TkM�#�ACm�ws��ze�:���uA�8�ׅ�wH�;gx�|�gP%���ퟌ�;��m���b\(���c<t��F)�\k4��2x�_�}n�-��6�bx�2�e�����Q4A�qqO �sa����I�p�u��ѩ��`ud|����*<(_�IY"�I>h�i��av{���M�N^�@���@g�*Dhz�xd~%Q8F=	�{�U+�!:u��KzG�ծv+;��#A��Nh?V���J��/�X��d�k4�L-?y5�-2`}���D1�z��Z����?`e�j�����<����gf����1��L�ѵm�N��	�e��r;GV�m����~�j���h��d�:-SMut�N�M,�f1Ζ�k΃W��nu�"�0P'Co�s��4%��Q�`4�@�5��f^w��e���v������b���h�Oܰy١��eJ����_��+)L¨+0PX��L&Kv�5k����;Lw��8\�+�6ߴ2���U>��f".`
M,s�!o��� dykRs�0�h�����5e�ªV#������jK�IF:��%[� ���@#�y��A����͘U�M��3�&���hx�N�7�,ok$�t�##�#�)?��-\�X��D_��0���O����m�!�6��W�h�9��_�cG���^`ր������t4Y���Q���ci*�DN'ԃ�=#���'Ͼ��[���jm1;�	wo��f`S��U���K]��,�x�H��HrMO��ƺ"���/w�A�Z�*���6Q�5��9kl�-I�;_��z���\�j�Ŏ��6O�����Gt\��=";P:24��;���@Xeӄ�y��b��8E����ĺ�6	ӤUs�����oDR���5c��\<�Cx��pτ�8D�~2 �1���b��!�1GN����5W�\���O���Vp��_O#�+����[�02-�#���|�xŮ#/
	�®��;ny��޿��[�(���������쑔�|^|�
�K�"���J��F�ID���"��/��;33WM��_�x'�%_
N�t~�-l��M��<�FRI�<�X�M2���$#<��V��z�����܃_��?��o{�ml�1���A�c�{�l��\�q����K���xZ��Ԕ\N��U�g�ޥx��c���.�'��/_w@,:xݗCV}�b�`�f[?wE��J"9�=�N*�L����#J���Ɛ.��W�F��}�j�<��y�?��E�Ya�����P��!��|�X"���Q�0K^��g���H��'Y�z�cdž��7�ۆ�=Wb�>����9���汝�e	b;`��&�}�	s��I�`y*!�K�G-ǜ��;9GD~b�A.�����F�ҧ�Aux��ܰk&цN�nmm>\\�,N6~��Y��S�ZĶ�5�ti�X�5�]{��G�q�^|Ee��A��w
�q5o�� �^h����c6�߃�I�*�A,g��d9�Y���iU�.�
��Z>R���N��zAy�B.#:�p'h��2�Q�w_�}?xc�i���3������H�Y6]�3rɺdjݥ�-�>8�ϭ߲zcXmulC��AW2?���ql����éU���)T�����i�?��?�<	���Qe-�j@��'�c^s]�
��J7����
y�4����
�Das��߻�}��2M�1��;�'߯��M`d~_)���F��!�8���NG����m��5���p��)BM��s'�=�R-���C�*��Q3MӞ���ӱݒIZ�S��|�����ó5YF5�`��?�l}��g������,���#�R����������V_y�ڟ��l�(5����}��&���LƬ
ty����i^I��f�j�}h����>;z4|?8�O�����s�%�	`�&q�p�����_�>�1��g��sA�8}h<[�j���6�@4�"��
i�-	��!��Ж����aK�ͥ�H�1���<Z:y2!�	^����]��Ke��Oo6��7��	�����W���*Slޗ���TR��*r�U������������8�9��E�g�Ζ�Hby�%ktZ�_�'�63�托kn��}���m�b�sM�hX�庐�?XW��_^It��Y��};���g���oX�9}/��"�NDF��8�����S���r�B�E�K�����=(:��<Ϟ���'jڃ����Ccn-���z�ŢU��zF@6I��R��Bdx�K�hw��g��}�,3�/|b�2��gp�tx���_oF�1�.|
����Td*�@jF�^��r�9ÇF�4�e^=����m�񣑤!�>���|D*�M��.��J^�}�(�F��6��F�[E-j��q�Iڈ�/y�'��_�p�z��;��Z�5����s�Kq�\_������?���"2������܉�lW7`��S
y���y�����7��w��[�9X�>�����^�<C�
���B�e��\�D��Յ<�B�#u ��������-p7�b9�<��[/�|�w16�+.r��r�c��r2	w��|��EQyHJ*��b9h��K�ùa�\H�(�hÍ������Ƽ�F�9o�&D!��<BP�خNk��ׇv�V�E
����O�~�
��/JÁe��W���k�:�֩]o��3��q~4CUJ���k4Z��l,���n�ja����t��
�x6��Y;�`�5�էŻF7�V)����P�{�C�m~Jz���u�.�g���C�O}�uɢs�g뱣�ۚx�X�s�twSw�PH�񄈌��2����fNE��Ҝ���T�&?/{>�g��hg�=p7�_P�T�8~#�9I �~0w���9vtC&��������MGk�ǖMg�Z�v�s��
*˗׾Z�.���?���J��	b$��g��:�4�B��yk|
a��k�VG�\��c�w�����i_)��[��Px{!�P&Bub��G��
퟊)�?:k��?R4�#Ο��ᗬ������$.�at_�gi�}$s���	��Ts&/�l=^�:��!^��q}]�aEe�a!�,D�Ku��្-*˭���S��AΫ���\$��qy^c�S�r�z1'�ė��̒�D������Px
|�tO�l"n�I��(Ο��ܽ��y<�<�`��\��y�~�`���N�<o��9!����(�L�tU#�j��6;�5�E�
+�'������]�R%���Z�<\;�p�OʵQ{�ƍ}g�~��Xё1���E��p�9�n��*5@j�K%���|���j�0e��mZ�"[����I������Bagn��-Y��t�Nia��uvP��L�6�x�AC��ˬ_��P��N���"#������t�-&�F��F�ېw��N[r�'r�.��e�g,_�~���/3�1my�^��z��e�Ҫ5���������Pw�'i���GO�{�q�U���S�Ht�/?v�~�d�u�nE��/I%���j��7+���f��7g�!��j��س��|�\.F<B�a	č,qN�_�$��6��oz�7�ٛ�x�LL��x�h�#��Z�R�T�AnI�TL�!Љ���)�:s�;+�}y�X��Ǿ|����̗��X��T�ϑ<_�˅N��\*!��6�d�Vo*�ђ���}�b���{㥉
�Ѷ@�fI�W�
�m=��rӮ�5�Ć��F�ie��:�W�'LQ�5b:˚t��@�܏�oh��I]�:��I)��C8�
%�9��p%�=񨄂��-θ���X�vB�:9�__�D�qg$���<(�e]
�;f�W<愧UmUy�z�b�ߪw�]�t��菑���d�OQ�#B�Ox��S����me�U�tۻ��q��=�ـ�l���i��=�ݽ,"gx�/�k��{�ѻ���⻻y����Q��1	����j����.E��Ȼ��g�6�7�9��#g�J%�9�'�����љ���~c}?:E��a?��Gu���cM�Qw}?��4݇y���}� �Eo�%,4q���9��74��x�
�)�sH��NQ#��f�0;�o�<���er_�؄�84��Iރ�猓�輼M
��
Ҟh��c����1�w�)��vZ��L����spc~j3�X=A=	�O�i��L����U��|ԲH~d�|�.*��4����~��Q��7�t�r�]�a
�5Ks�=�b��v5 �}'�8�1>������}�$��4-���kz�����}M��>�4����[�b�	�=�˜��iK"̵'�+g�d���k?Ę��`���}u�z��E������}ujߥ^�}��<w������V6<�����J���i@��ͻ�m���+H9�6R΀�9���咺�z~	.�B��)�d�MrI���NQO����¦&yR�Aަy��66H{t!^��EX�w�`�޿�1,��E���	\GҲ�4�޳�w�>�/�Do�K��cżOX��uK�C�X�uWt���X�� ��!�u�Z$��F�S,/m_�Sh�9%�}�Z���Qރ�K��W_�~
�R��?� �a�,�ҹ�z�Cy��>�P�	;��2v[b���OQ7������\�],'P���w����秳���~�e�cw-{�}O*��'c������B��X~�t[ۙ���Hz��t����=��
����Wǵ�C��� ��
W�>\��K�Z�t�](4a-�����.�Z.4a-�:���-�ZV`ۢ.���
Қ��&�E��{P� �Agc�j���Y]�	v�9�.j��`��z{c�j��뉞X^gG�����̷7�?��ǼBX��.����A&6��&��F���o�'�i�%�L�g��g�vp6���������mA��o��,��<J�`?���0��,�s'�n�>+�f�gE��ɹ�=�3�Y�s��0����l�VǶR�^��L���c�/q���1.�xNQ'��O:�8��3xl�����8,r������NҮ��MF!e1UO#�"o@�S1OB��^�U�g�N�`p>���8����Ƹ�c,�����^�����y�$�䪞�1j/N��Jb�5�ͦի$Z>�ꎘ��@RY�����:7�\�u��Rg7i�j�֓KM�@>l�F��S��ٳ��<�:n�����Cm�t�������=���~�
#��)�ɞ�7o�e�Bԅ�BSQ���9����^���R)�5Ms��'/L�<}�����r�p��E�z� �=N^�V+�-Q>��ɋ�"yCK��8yQ���N/%o'/�s���>�sJ`�{�O�cK�Ea�[�u«����݇V����eI��\�}x�x�<��,.��̾]��ӕ�Rm���{I�.)o/'Ϗׅ�3�Kr��WC�wIyr�����g�����@}p���P�3�ѝ,����;�6�яZݻ�������9��%�fm�>���
2��T��&�Op����;��&<#����S��Y�Ij���mtĒ�$c�V?�}��h4���u9��JT�x%k��Gp����ßH�a�<-����k���"y���q�"��Q�}��us�"{�����~���a��wz)y{8yѳq}��C�����H�����[��1܈��ɼo��+.�㐌����8��I�x��{�6�>W4�"�'��ݓ���{`��͑��*�����o�:?�ƣ��)��{湡�YB�}�Z4?8��_
�o�3�3�'8y�@K�3��#Ϗ�
�#��#���8���}��$�%�ʆ��D"K�/��na�YX^f�<-.W'������ɋP_��
K����
c;��<<�[ر�,/?���=�<2��Ӌ�8���O��&��}hu�W��6�݃���c�_�	I���x�@��&ն/��
��-Kq:�rn���m��Er^���NǶ}~��'89�1ؽ��
c��������*X���.6�(�EVF}n1����9\��s��5�=x�I��Y>t�i�6W��(����>�u�<�Y�'���ѷ���U�}t��1�S#,���4��=�u#d|��2����3��ʹ��s;ܷ���/��*'�v���"9Opr�ujY(����:���Nu����T��M4�(>LVF������|�l��}E'����o��S���#[�?|����|�:&Q�L<8~>��O�}�O����#�##r�o���S�	�{(#�[X<^H�=j�|�s?I�'���d/��d�S���`\#@�Pp��_㍜'�L���"�i�R��]gv,q�����}�F����k?��`�0�������lƿBW��W.���E��Vx��8�&� ��ch�~���>w)�7-��e�F�?~�-�XNU�cp�/2��~��/ˁ����ϡ9���e| �	�Þ}6c����Gbw����ɋ������)CE"|�3�Y�$c�$\��p)II�e�s���R�Dž���i��H&9�[9�s$��Ϟ8q�������j��@�G������\*)��<�x^��S���p�pj�N��B���\t`
TjON��7P�(�W��'�:.WY�-e�%�͞����[�$jP�E}s�H)l%X.>JB����B_�j�?�~��2�Th�m�A��(��JRej��Bm�r�Y۷OT*k�-k�R.qu��g�(�$b�a��?�[0N��Әֶ7|�u��]�<��ņ��ht8�uku.�O��_@��/��G��q��\������X�X{���;���B�{��0�F#�4�4���p���R}�9�	�[k_�ݻ�*�f�y>28����t��K�(���<�W��b�O#��d���~�Ш�{�蓟��
���o���N�:*���R�`�~~.��Aw�o������ܷ��ٹֹw����p��z��kP�V�1������u�)'8��$�|�S�Gݒn\˙_a��p���$LA��o�:�c��X���6���#�I�����'�V��ʰ70R
����eW)b	'
���փ��e��7�9#�
�X,�u�r�!C�,��j�L�`6�Ə��hk��
��ߟ��κ�V܆&X��jCEy]�J���U�dՑd��zK�<.,�����-��Ƹ���Z�zs���'��%�_�l�%��=�p���3{�cv�*C6ך�
n#�&���5��w�W^���y<���j�v*R#�IdN���	���d�%(f�%e�4�X�������C��͚v�[�V��^���e�e���n��<z�G�q�,�	��	X>>%{��<X&��s3^ �����j�,p�6E�Z�(���e��Rm���k�l�B\�0�–�4�`Sl��H/Oe�'[��Hz(N���r[�h��q�)n}��jfc@�N�<����&�Ҡӛ�۲^{D��8�6�ʦ�;Tj�7T&�̤R�dv2��O�d���\��w��NF7*��,Tn�M���ʒ���J��H4��e��;'�I�-a����8��83:cW�h����ЮM�^�y����gл5�\ι��w���9���A�9�>T���peME�iWν��]�X��k��VQjԯb����V3
��گX�@=�QИ��{����*
&�ڠ�0!�I3�2h@�3���ҫ)��6�Qē�]l��%[5�*`��i�D����a.��H2�HzeYiv8�b�%�кš���
dur��ju�̲v��8��I:��Ů�X���!���N�
��[ľ�1F�n@Hn���f8�o7*""w�,tu���-�`A�V�v�2C�D(֒Y�>h�[TV���o�X�6}QgV8Z�ބHX�[,D��}\��:kE&`d21H�uͫ:�2Y��Vn|o���z�G�u<�
 �i��u]�U��Dk�%���b4\�]�-�5�Tz�!ۚKk��%&\zX�k���򲪮k^�	=wmt$�/��Ζ��۵��9dS9mq�-�}c��Ԝ{��94���3�x���>����w5�9�[H�!��`н��K��.�s]�z�/�sÁ�z�h�zN��z�op���v���9E]�yaTs:���X�9�T��3*�.�j��:�k^��	�0ETEgK��H��m;')��9���׻]Y��U��U\p'Tq/�=:�Ǡ�.-ly��U����rQ>�B�Bx�d4�jmҪ��	�R��C�,�̀iUό"�r9a?f�pkٟ��KV��r\�.xpZA�
\����^�>�K�/��b��`�=�?���/~��h\��Q�S#G�b)_$��U&������_�}�V�<��~�c0H?5����+�6l�{��ܟi���
GX	E��K��PR\��뙭(,�>OR;��2�8272��$mޤ��2�7����1�&gt����1�c���6��b�m�s������k��Xq���/�m���>`��
�!G[�%��"�9
�R!��&�do���8�ZH��p')�ӴD!��j	l-ގB�Q����GI������#�F_�ϟ��;y�&������j1�""��QCso��,�^�W�.�*d�h����C2�g��`�(lR���ϖ�;h�7P�]k�����\�I|�RG��'9�z5����o�^3f	��1� �%M2o�}}}3��������hdE�6Ɯ�~oru{v} �x��6`+��v�O�zW�:���v�r�e�y�Fj)$@|�S;�(�I����0ۗ��G��UN�Ĩ�Tb��-5��E��V�}%�;I7jE�V�R9dR�H/3J����k"��AW-v��Z��<�"YcPWf��?A֘�2Fmx����<-������������>�|���럾���×\z���[�Y����+V���������l;� ������(��D��W�~Cz��JV�r���řL6���BFc<����w	�v��}0����_9B�( ,�x�sl�kc�QU�W.��Ժ�2�P{��C۷延���X����\y�.��.�gV���l��]N~_��5`��os�[*{�����[�xs���>��>2w�s��L?��#���( Y�3$����(2u�-��y�^�nt;�%G����E�����6d������q_rC��lj����g�
5�ȅ
�1���x2���~�h�z�P����j�X�O�����<D��E�����!��n��
��ፊ�r]��8~�|ί�K�%�=���˓����뱮��7G�Sx��	��i�#>PQS���7��_�[LWE�B/\J��	/?�2��A9�fE!�E��*_nU���\���&w�Ów^GG��}��觢뒩��A�S�'�.2�]s�П��T���RSB�FE����i�*�FM�ptL�E«�e�����tr�v6;Z�z�Q{�����wdSK��ˆι��Ӻ�j�;#��m�u�7P�<�|�^�쑶m'F��ݶ�$��^�ʮ���Z�:ȷ�nF��s��QAh+%�A<2Jt�#��:��'� �_а#�p���H���k�>ɻ�~���
�uG9O��-��ߎH�PO8���ϩ��<#��I��d����b.�w:�j�e�pz�=�)��a�z��
���t�]^C��y���QN��
6�^���da�dToh�3�4r���n��k���V�B̸ �F$׭u��yV�����[�q�={j+�
{��9�����J9Q���f3Y��N\$
���y���C��z����g���q���-�w��<K�h�����ky�E���dI]�+��_�kjE/k'�`}��WL���U*�N��
"�Ǡze�u��͈Iν~8��k����A4��l��
Tk׃*�ߑ;s��-��WW=�J�P��+�/�����mv���Ū��r�Đ�dY���(���XdVF�W\8�=�	�d��!�՞���z�eӑ�Z
СѢ�W
��wOm�ߢ�}QM�7�$�s�Ps�*J�N���!'rq��z�݋p���إ�w�g`M�/�i��p���>�i�Q�7������/6�Y��`9�+h�*bh���*1:)ɖ�$�0���	�k�Yr`��̯���Ý�@���i���R�Ӧ�k�?n|�uNu�}���_㷴���B�<n�x]���~S�w�~��f8�:��I@�0t��͑�X;e|��<�2�rr��<��1��lo���V�h�MA�1h2���;�4#��0ٲ:�Y�Ҳ*�^��{�bMڝq�%	�L�F���2h]f+��%7ł��JBJ��K}��J�)!XRճ��9��Ш�V*'���P��.g1
�M��x	���v[��ߵf��.a2��B[`��5�9�Fk��2�s��'k/���
���L#�H�"E8O�5�N"�)D�` ֢Fc��ߦ������61��R�Z��ɔ|a�E�52������(o��LnY���ؚ�@e�t;}���5t�,���y�nدp�Bs�`�⚪[���<�C��?B��غk�-�׭hm��nU���{���P�P����U�X8���<제�i��u>*#��1�\�%+V\��wdr�<��~Vl�V{�6�8���|t���eG�S^�=
��_p�d��evѯ�<��`���+!|8?�i�U���UTG�>ޞχ+˖���P:,
��؛����T�x�h���F�-�;�|"�ǝ`S>e/��!{�+KK2C��IK(�u��?���X�C�-�\ܠľ�P��u���@:ן��M^�ţ6�

�a�Ýt�O5�h�t�sr��j���f�ɦ��Y��')C᜙m��K���)��x��%��a��F��[�un�W�u{�j��
�����>�^7��i�wC}�UqzXUU�mDG0����vh�D��&��]�x��gWgd��L�O
����ڡ���Ջ�.�$�{����;2��Y���~�Sf4���<F
�w�{��ͻ�ř�{�}��r��E'���v�]�/h��E9�|���h��#��q8����%�P{���>�a��ǘ|qQ*䩐! �5,TF��O��J�������׮]��ه�#��Ǿ�~���~�:UUJ#D���v��W���|��u�8�bv%��.�%�hho�ľwE!�D��i�T&�bN"ϭ�2zd�ƀ�[������c�L?�����;.�[�[���1ve����@��3
�y�]z�~a?N1�*
���`�+�Α�o�����a�
ߤ�'���y�݆��M�2J@I0��P(��J3��βAd��'��9p��j���~p��?�C�������OñNN���R�t�>�ej�B�-C�C����׌�LLh[d})P%i��<��v7�*��~!�*U��P�P$6�
�JE�����#��*�Z���h��c0x�V�	��G�
o�2���ʴ�������d�����7*���W��v�W
�W��P4�lfZ�E,{ؤơ
�Eh�6R��аl73�e�2�Ij��m ?��&�Ej�����J�Y|��>��ԃ�붡j\>
��(S_�N3���ᘶ�Qt�sɌ啌�9䖞w���=�d¥
&�f��r��"_�5��k�!�\���:��d�c�Ѡs�Η(�G��`�:T�>�,��f}C�

q����<)�|Aqe�fs^kd���	�V�9�fj�A_-�5k������x�P6p3��ۘ;	��"1������C�FD '���v�������>v�����w`Y=Pֽ�xB	#�|
,�Ő�p6������HT��ML�Kʅ8A�+P��B��D<F�gČ�wer�����)Ђs��[���ם��~�vK�&��]L��گ	>\����h�=DM�PTT�^�2S���l�f�^h�7C��Be�tŤ�
Q��C�6���A�%��e����_��w�\���M�+raS__ly���g3�t�V<==��Ϲ�\VeH��MO��w��k[��2�LoSjv�.��sumiQ)���������`N�_�����0�%U`���Z�2����f!�T�ZM�ɞ�z�����gi�y�����H�[�Оc�Y"fM���w�o����$���G#A�Uz�cJ��!��xSg�@ms�S��;�+(|WP�f�L__����^�NiD�Qw|̑�۲n�9b]�{�֮u�d�^�\��l����F�V,�?c�?[��4�R`6����66ҧ�eMn\X͇uꇵ⢎���'pö��}��Xfn�9S�.��4jk�v\�^�Rq�e2���
�E��J�y�D���'�㚕��J:�F���j��OB���5���v��];��[ﻠ�]v�
�C�	P)��~�:�*U��+�,����hW��-Hه�ն���Q"Y'T��K�-��J�o)�
g	-�~np�r�����@���1�7n/n�KϟE0%�&�j�VWo���N'$J� t��&�#lH
e���p,�~ܞMm��Cf�;j��'ͅ
i�]���.-�J����+vs�
�=��_�w��+�Š1BsHj�}�rD�uj78�R�^c�K�3�)���ZC��
���-�H�#lM^�p�W�R��DH�lPV�:%�����?�����m��w�[�>�M�w��w�E촹���&��}^/��{L{#��BN@��[G�A�
�
;�.��pt|���}"[��Me-��H�[J��w�tz�!~������w���V|�p�XdU���.Z���5�&n@��!w�Q\*��>�Q���������%��r��*��բu$�}�gu��8_/4�R��|fE�WZ�t�:���#������'�6�!�љ�&}�?	GG��JԠ;��}�˛��[��	��S"��z�O'ђ5��8e�!�<�ZRU���^Σ�!��H9~�h���1��h��=k��[7�|�ՙ�M��=�H���u���#�K"C�
����m�ճתּeA�#i�$
�h��p�*aκ .UA���3�a�Pk"&R0�A�#;���&?.�_2O�¢�;w�tl���H�9�#���C9�.�
V�R�h#G�b 2EG�b�#шIn$܊��&}��_<�(xB
A?�
r�b^-oqf�+h�l�yǽ�a��
�"�d�

*:�=���k4��_�
�8�����
�侊^�S���=�C��C�M�Y�#��E��G��7A`2+Kn���΍�C*�&�
�w�ۓA%���ـ�W�D��i+�=��7�>�׀*�dC/���K�
��)����{����!���ݓ�ջ�Ʈ��7O�:5U�Gd�Xz�l�Vz�7JU5�����v1�x�}[k��nmDz@�'��Q���LD1��7�[G`Y�eo�i�:@_���,f�3���b`Tb�0���6���mڱ�G���}�܋g]�'hY�Fp�‚�u�^/�����ʧ��D�<�R�c�]}�e�l�2s\C��fN�5i����==E��bo""� \����e2Au�׸��~8��ߴ��kѢ��a���C�b�)u*o���}}|�מ)t:�qM�����@Ʈ��D�5��*;����zR�N�zӺ�a�p�~`3�B2+��
!}>hʵD�!��-�=��Qiӆ�EO|����ј^kL���}��{�M��c4��]�
R��%"�@,���Eb�T&���b@�����(�U4�XP	;;�?��E$<B�0˼��/�m?n�w��tr����'�{�^��|b/P��Ta�|��d�s^u����ș�z�Ȍ�s�Й�����h���/�:u�~Q�ѿ�I�K�vhnHV\t2��.S+]��
�
�K6�Ϊ���N:Cy)ţ�T�/��v.>��cWhd���ŶM��`��x%h)���h�oKW��E�-�m"����83%�����|��H�#=���?j��4���S�GT��&x�l|�hq��aF��ۯ�9�����s��\��×�����ZFc�{�dB��/P��[wS�>������<�_��r��������tr��m�X��2Ĕ�1>L*���9V � 
��w�~��;�˷���sϽOw�Y�
�SE���Z�ã.���
L������������ʋu	1j�$��r_`�%??����Yh�>���"�T�篤,��a����rmA���>.��@D�����ֵ����T�7P}�Р��o��O~B���N�sO�C�
�	[����C6�7?RjJ�����P'�MR�SѠ	e�tB1�Ll��_"��;����ʹC!7[�U��P�I��G�J"2&�'{�]	��S@z�k9�����֞���*�b��������9|�c7����}2�>F�<��$��[
��hمzZM���s�����õOC1?	�D�&<^��S| dJb������Om�Sg��ڿ���k��d����$�G���;W��%�Mའ�η���J���Hl|�L��P�5�b�3f�%��hm�>�H/ߑ�o������;�e����;2en>�q{ᨗK������͇��@XX�M�n���Og�f�d۪dju���[�>-��|����B�O���CR�t�H���'��l#}(�#��ѻ�•����[.x���y"�^��<���Յ������u.�:+���D�R(,�$#�����U�ZS���2ִ���/��6�ƀ�&���rF���
��٧�>�w�۰
��t�xѲM'%�"��sЕFRyo�IKS���$��M&��Xǚ���<�;�Ҫ�Lē��da�߱���7n[�V�Τ�*��dWHp�+w-F�E'S;��c!���t����Q�	/Ѩ��
^pZ��h�v�|{7z���
���ZJ.�	J��GW��u�
��H���rvm��^�O)=���TхX4�G��sZ����B9}�P�������Jg��<�������p���gs$3����a*�TͧB�X�BT�l=/��7cT+���@��݃��xǞ=;�?�X?�����S�/���Eg��0�Jȓ��ϖ�-�B���~���N���+~�S:��S�_�~��t�Jqu,AY"J�8O�� #[O�7�\���O�~�ω������pQ��\�(�@̧i����>�:�Gs�յG��k��њnؽ{C�1���E���Ex�i�L"�J%"C�q��<:d����
����j-�d?~�ͨ6w� �E8~�:([@��P
lDE�8�O�K���G0]^h�G��W+�8��l8n�*dR��XL@{���:�	!1C��-"���0Q!A��R]�ͭ?X��T]ג]w~�h~S��}��-��@���׺�����-LW��t���c�s����Lq�X�����u�i�P��u� �l��}<˵��16_��%�z_��*!�7��إ�>�\��~�Y�E�J��N�DLհ������Y��p�z�15��9޵!�K�����9�L��Y��S��ߑ��3��-�˶&�W��KW��p�2Y�s:�6x�6�rY*
�*�Q*���o�>֡y�����P�6!+ƷD��z�a��mHth�������˭�T�ϸ�W��+���M��(����Vw9i�A���uIJT�'���c��.<�2U1��|�h��^�Ph$�@@ȵ��>K��!,}N�6��"^�"�]D��Վ6�8��ІԐ���j��60,�{���.�t���;�;�鋱p�����fK���ôھwpӹ�De�k�Ř��j�B�g�$�)W(��}�Da\��2:xv��Ͻ����>?S���Y��h.�\�u?3�9�&�{_�}��9���?�j�� G�l��5'�8�$ܜ�n��o�p8Q_M��b�O��C��`�GEi�MrAU#�V�� Y�r[x~.�$$7�C}�i��;*���������E-٨rF��=J�zO.�v���,�#.�W�^�~��?x�ى9:����f(�SZU��U�DL��lؗ@��j�a���7�ē�6
�U3�}ʱ��kP��VN�<r�o��^L��ٙ�ٷ���V���c0˔�;�<˔�e��,�(��R�K�l��sY�
����Ʃ�A�T9q[1Z����H��E�x@�N>z��u�l�^.�|�Ͷ"
����Z�7�$P<AUͪM��4��8��S_ pಙ]�Ue���*�ii���	v�������PL�?
�G���whG�(
eG^#�HD�����6{yE�ʳ�N��J ?7����UV��s�4~���x#�U��0�;��8>wL���}/�՞C�擓��ǚ`^L�F��F�ko��Fs��>?���06i����u]uR�Tm
*�8b�	@b�Δ��:~I��=Om_d��B�Bqե����>o)�������x�NS
,���/��7п�Tu�Ýnwg8��$������ǽ�j�;�a�ꤣ�s���i6_0�,������ÕH����h���vV��-����2���&���?�\��2x�~���#嫘���C1�Y��E�D�j��p��Rm��"2��������?/�[5��|N0�y��+���
A�Wab�B�Wd��4��P1�Gp���*o[�;�6'݁��f�"ݷ67�;oϔ�-�V�.nl3��֠#j��kU��)���k	km�W��%�s��6X�Q�VKY�LU�x�����h^`�k2t!d��T�M}�e�Xw�gx���]�ƑqdFuk#[��K��c=��)�=�`�XLQ�;a:'����I�VWܒ^��I���xym
�l//(�ژF*�4%�5fD����9��_�6�][;��������X^G�هc���<(Jk2)�P��h�.s!�IcԺq#�;(=��O�}mNG��ծ>�l������žC���D0�h�zrv��w�ruǎ��}E<��,y�{�s���:��Lې��e3�,�Kg�OO[��@���c
�����F�{V^�S941t���������:|��?��)k��ʆTԿ��}���v�4�}��'m��o)�1�,l���?���_FqI97�sj�Ajw~��x��䝽C��n*K����6�,�U�t5��Y� ���4�j:ha�����0:5pa���>O�b
�"������9l�����bFWޣ�F��6�OI�)��m����g�۷w���rY�Şʚ͙��-�)S�nKЪ��\��MiK�.k@����>�Ώ�-�-����o�&]���]�����%T�P�~O!/��V�&�6xa`|~�g^_x�{OY�[�Ƈ��q��@W����
�p��F��acBq�5����yq�4���]3p.3�����9���yl|"�����l.�|����_��*������S��\�￀�E����\t�&���Pz�B�A�;����}���#o=����cl"��ڠ�{���ߦ�)8_�~>*y���������G��^�խ6��nC�;���%V�j��׼��6]�T�<t�^:�C#fI:,�e�>��mY#��l���.���nl��V���5�mH��x@�)F"o��6��x��F�
X�k��Ay϶��	o��y��u��8
�X1�N���ӻ�Z���ӱ�R'`a?6�
���)��j�)�_}�{�RX�79�G�.O'�a�eԆ*�B9�6�ΩT;�T�r�Zm��Yr����)�x�/d���άΈ2�}�@e�W/zQ���=z���@87I�+�鵞�M���B �ٰ��d�N=���_�{'��nS1trc��
轜rH��=&tU��c9����/2k&l6�1� 
��\�&��cC���-�(s�-3�*6wH�	�' ��7붞ݦ���6	�r��f%�
�lh�r˹=	1Vn�'�
.����P�?�'�z��8�3eqr��<(�I�����~��~p�)�-P�b<�(��=/��_�_g5�Q��6�w����@��
N�8Z�'Գ�Ѝ���O(��]B�����;��Pd��� %��	E��l�4`m��	E=ά���i�r��	!U��\ZjQn��n�
�����a��L��f�|��խ�҃���]���Y�xD›����,֖�\����:�s�k'C���7��.�����4��'��V�rJ��.oZ䤶�Ö䦺�DJ��&㛣�dlK|�~����#�p���bFAuʒ=,���(�:Ӹ�`�f������%��̮�e�m<^g��C���mB�]H��P���i�a���
�g�P�
١;~�}�S����3�9���y8z�l�{K�Zn�u8]*���S�L�B����3�~�w[�}���
�9l[��5���r�!�ff��7��6W���uo#ؽ���g`k`��(pzl�h|�����/0�������f�F��J���G��A�\r��w'����ʂ�9VV���1eE&F]�Y��>��b�f聊�3��Ņ�g���0	,�/��$:�:��t�+csX�G���'��[2y0�c��ϑ�2���!tOP|�	H<��㬋�1m9��rf'�8H|�$�^=^&w�V�l�8�'���&���ɓ1��Ag�23�40���V��ꌹ�a��L�&Jy���1�x��V�nG�=61~��D,��W �����h�� �,��5=5]MU����mYd���2�HQ����}�Y���와�����]u�>���󬢌���~MtF��n�|v��9�4�&����Kt%�=џ�Jk1�t��2ї�V��D/ҭ����Z^�#�˴�t'�+tm�m��з�?%�*]_y$�"�~aT���j���]ξJ�u����ϲ}��g?'�����:j]K�e굾K�"��6�4m�D/ӗ�%z��K_'�J&�&����CzD�j�#M%�)��-ڠM�=NJ��$P#��~
~K/����6
��c͑�
h@o�2xF��Zc�9�����kQ:�Q�W�?�����*����Y���
}���c��~[��y_�#i�H��Sg_�<��a�[��
=��1���@j����f[�t�#�;Q�رU�r��jҳ
+ӆ)�=L���<o��x���~�AM��	��llݹ����~Ҹ�虍�;��k
��Gc��9��B9�m%�}��v5gU�`HB@q.�š��{���=d� T|�c~&��R'5�=�'C{y�R�Rc�^����'��,����ud���i�U4�tEo�ScO�̔ݶx*���Im�ő-PQV�U�F]�7�e-��❒�"zϔG	4��9�r5�{�͹�z�u�gc{�U'�����6�S��=�bqMj*�V�6l1N͘G��L�6�x��Tt�ѭ�~���7��ޝ�0����I��eM$���:'���;���Ӆ�(aS���0�w�5#'_�Ml�4��a-�$y�����!,(�x��f�6�sso�4��'�F�9���c��R
wD_��m��l1��y�Io9�����`�挨U`d����)�
s�[�����S�c&�+��R3%{Rvd���7j��T�|�E�O��l?���)WM_F䞣��A���D��\c�CS$}C�#���J>���I�f&o%�Q����e��p���Z�d�DO�wD��AcҌE��.+���9-d�^W�Q"�u%F*�m��aS�ֲ* ��`�z71$+Q��T��=�
♾��I��x���,P9]i`��Rh_x�E���@aG���=%��)/�-{�u‡�i
�T�����mlaY��w�7w*�,�n޲QԆ��a,p���
Jx�Vh�;2�L�����cCH���|�]��:%Je*80�'S^!�:xQ)�V:�=<��������9�DT(�>wWM�h���0<J���Y��Ox�8�^S��[�C�ﭯ#�F�r�lo`O��"�x��5���M���q4�*���2�E��9�~���1>\���J�3٧.�������0Yw�>`��)ͻS�$��Xm�&��3d�v�f�I��N�x��+��62$10��Z����9Ο���E��(z��>��0�(,��ʣ
�h@��+jU5̻
C[L����͎`eI�������j,�����H�BC�:���ںr�`g���(���dx�m�xG��2�!���{�XҞ,��%�!�BdY��DT&���{��{���������x�ٻ�yg��4+AB���P���?kL�aVR�h����R#5Q3
������4��ehYZ�F���H+�ʴ
�J����Ik�ڴ�K���mH�ƴ	����)�P�Ώ�!�b�JqJ�f�9mA[�V�5mCIr(Eir)C�h<M���-M��h2M��i�J�h:�ю4�v��4�v�]hWڍf��e�.���`��N���:�����r�����H'r��hJ�у�7�9t�L?�/t]M�ӣt
�S���z���=A��S�4=C�S'�H���t-u�wt<�B/���M_��t8ͥ͡^�"�G%ڃ�Q�*T�*��|���B�=ioڋn��i_ڇ����+����&n�a<����7��#yi��пL�,/ǣ�yy^�W�xe^�W��xu^����7����ux]^���
xCވ7�Mx��M����?�U��a�c��qN�f�9o�[�V�5o�I��>d�S�f�3<�������$ގ'�ޞ���y���x:��<�w�<�����#��w�]xWލg���v�q繓���<��r�r�K<���=����'�)������y!��{�޼���|��|ʇ��|�G��|����|��'��|
�ʧ��|��g��|����|_���|	_ʗ��|_�W��|
_���|��7��|�ʷ��|��w������|��Л��M����.?���?ʏ��?�O��?������/��
�ʯ����o��t&����{�>��G�1Ÿ�g�9�_�W�5���w�=��?�O�3�¿�o�;���_�7�������X2DB� C�Q��Y��pYJF�HYZF�2��,'�eyYAV��deYEV��duYC֔�dmYG֕�d}�@6��dc�D��X�TZ$,��[b�*qI�f��l![�V��l#Iq$%iq%#�d�L����L��d�L��e�*�d��Ɏ2Cv��2Kv�]dW�Mf�v�I��S��[
2G�J��JQJ2O���T�*5��@�e��){�޲��+��r�(�r�*���r�)G��r�+���r��('��r��*���r��)g��r��+��r�\(��r�\*���r�\)W��r�\+��r��(7��r��*���r��)w��r��+���<(���<*����<)O���<+����(/���*����)o���+���|(���|*����|)_���|+���(?���*����)���[��fU�t���A�j�6i��Ẕ�Б����etY]NG�򺂮�+�ʺ�����꺆��k�ں������n��ƺ��ѱ���hX#U��ƴU���ts�B�ԭtk�F��hJ��jF��x��u[����d����:U��tm�u��3u�论����5����k�vi�t����բ�t��e�hUkڧ�u�@7j?�B��Ct�L��JW�#�P��{�^�K�ҽu�W���=P҃�=T��=R�ң�W=F����x=AOԓ�d=EO���t=C�Գ�l=G����|:J/��"�X/�K�2��N�+�J:�N�o�*��.��,������d�]��k�>�_����Qoқ��Uo���S�һ��W���}P҇�}T��	}R�ҧ�}V���}Q_җ�}U_��
}S�ҷ�}W����P?ҏ��T?���R�ү��V����Qҟ��U���S�ҿ���"�-�Բ�!V�j��Z�V��l
��[KY#�����(kkYk9k���������������������������������������������5�kmj�Xa+bE-cMn�4IRSj�BKK��ԉ@�P�hH�fs�R�!h(�^��CY_���R1?�!hs*W(�j��=�͹�vS��T��r�b�)��J粞ˎ@�u��j�`@7�}ir;�g6�#h�
<�}i7 ��A�[�k�//�p$�6�0�{�m�oϖ��z�P-�t�C_& ���_l"-*&JaN���9�� �h�:lnW9�/�d��\hR6W��C=�`�M�&K��5����SoB��Y���
��&������J�j�4�;�n�K�Ů�)H����|>��V�ʖk�=�Zuxi`/45 ��m�f����r ӂ�_��
X�����QŢ���j��t�U��<�Z�ڐA
��|�V.��Լvx������ k�3�8�=s�ݿ��
2\�KӬ�[qᠭ���]*�����ok^�O(�b
k�j�ơ	h���J�����Kp��(�2a(V;
�2�
2Hz+��̆�h6<�)��l�;�K�m�g���F�Q������&�I�MA�P�	4~�0�a����?~�0�a�#�G�O�D���?
~��E
��:�� ?�a'D�"�	�H*��U��s��F��x�/�i�ߞW4m�Ƈw�Js�����P���E��Q�y4������N"@F���C���X�h4xP��%�ģX �
g��6���3H�`��j����3�pI$iZq�P$m���7H�`�l8�
g��6���3�p�`Ù0�a�����U�D��z��Xw�u7Xw�`�lp�
n�|L|lx��e��
6�����hP	
^?
~|�A?
~�(�|�߀o�G�4|�߀o�7��
�|�
�
�
�
�
�
>ʥ������������������G�41�b��V�o�V�ӊx��8xq����K ��M����'�o�&�o�&�O��?~��8��$�I��'�O��?	~||��$�I��'Ӎm�sS�P�7�Y#p�;Q����%��\�
���AL8�19��AL(���E�u�E��(��$�5I��������xaPT��AQ1(*&~
��)���O��?
~�4�i���O��?
~�4�i�]�]�]�]�]�]�]�]�]�]�qp288|||��8`�L���3�g�π�?~���3�g��d�٨A6j���b��ب)6j��a�Fب6j��a�FبvP�nPC뚀��i���&�ՆƠ�P�c~P���b~�UW
ޢ�����(�G1>�u�B����|����k�A�|���m�o�g�g#�ؘoc~�c����o��o��o��o����׊�ߊ�Z���t�Ȍ���|_gt��|�Pi���
���?�	ğ@�	ę��$�M"�$�'1>�|��7�|��D�IğD�I�o�'�r�9�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�O��?~
��)�S�O��?~
��)�S�O��?
~�4�i���O��?
~�4�i�������������������g�τC3�������=z��y�q��B��E�P'�pKSg��V�wԿb��-�_U��ˊ��������V[�c^<E�q��8���/q��'��J=�bo���f�VO��
n%c�y�J�*�	��T��Z��+i���X�� 18`:����T]���5�\ɗ�
�|o�<7��5�+�Bo��V0lc�m�9�]���a��rv���з�V����Ϋ��3���~^�k���շ7����;��f��G+���c+��Dh\]����؞R�g��mCY�z8�H�Óhh�'&���ÓX��Ik��I<4?���k���Uw��ڽ&�5^���N���n�)x����5=^��5E�)y�<���k�^S��Լ��k�{�����f�	��9㦢�,ُ����i�я/�O&����%�׏F�����Gc������A�Ē};=�~rPP��̒}3(^3(3�o�MjP?��Π�LZOg�z�����N��|�4��3Ty<��zC��n4t�je_�/�w�RX���#���%o@��;h�Uj핡�G��|zFS��3}���y��y��q�w���}�o���b��g����0<3`����y\��̀����3��޲��
��`xf�,���������3<k�|�P��>^�G���%�7���ٞj�����\��{l.[ɇ��r��j�Г�oz����R`w�+uDG�\w1��o��˗��\��=���_x��2�N���#�G����Ѧ���?z�!���x��=�`Dg��А�G �N
c�`-���o���m�d�@$�\�՞ClA�9۾�A5j�t��ީ�Z�V�/�`�q���
D�V2�\�0g�=�9r��3���{�>��iSxڭ�{P�U����]D��+��
��&j (����E�ZVb}��ӤcM�86�8T�8f�����L󑩩��2++_�ԌL:�ً�R�D�;��{��=�=�[ ��Yr�KNu��=�����^�ųPQ
Y l[�
6�z�!�\#hM 
���A44���<���d8`HҠ�Xл�`
�Hr��j�jF6�Y�c����k�z��!�W�����r@q���^���Q�X��Y<��Hqa����Ե�R���j�֩Fl�jĆU#6��������L�Rw��
W��(7�����A��	��S��F;da��;)[x&�=�F'�$�.L��	]�L�a��\�'f{q��w��}y����w�K>_\<.`&�Bf\�Lĥ̎X��k��q�nbv�m>_|�b��~ߤ�><�T��ΐ!Y2���|�c�̴�#��sf�-���pa�����0Th�k
��5�������Q�.L����0Z��[	[��
c���	�va$@xa2̆y0r,�����8%p
�C�����
1�`v�$LE����d��s�e|�2\�p3��xO�i���9Ņ�7��~Ʉ�U�5_�"�쨖j�2K�ƒ�e-�k���-�����K��ZN�r��/j�X�2-��jh��S�Z&�wj�f�G����zf�u���?�����kY���Ҧ�lK�r��.-�j��h�g�����m��6}v�t-gi�߱�Пܴ�>�M�	m�Oi+m��>����v�����>�O� _�s�n�^��9H5�i8g�����2}C'�[:I����H?��t���Y:G��y:EG��.*��*�
R5T���j��*��ٟoj���|���mnϷ8��-:@G���t�n�0<=�'���@*G���I
�a$��|��cp�<�g���R����^�+x
o�M��\��n8���
UuT]�•]�S��ⷄ=�k��geB.����6q��#p���TWO�����O��
�V�B��|�P�f��n��sPf��+�I����������nqn�`
[�hUp��i[ש@��N9l�F�(�գ�lݠBep.#(���ɧ��Z���*��J�IO�Aq0hma~��+�KP����ski��5ZM[�p��m<��v܎x�v3ߣ��is�a�t�y��3�Q	�]�w�o�@N�\�����A:�a��0ʈ5z=�}��,rJ?6{����E�\�}��uc�Kx�W��j\Ǟw���\�9��� ������G@cՖW|C�a.Q��E����p�GK�h!�*��o�ʎ����_a�p�fU����۴Ң��wt��>��ByDU�ÿ̘�%>��F
S�3�'�q�H%���v�6
ΐE��Q�x�"U�gۃ]w���33���[ٲ�!��{�B����Lsm���B�(��S.�rWL�=��{�tɆ��/I
T�^�y�;M��H�*M<L͢��&��ۮ�3��4����
�{/U}���o�{�,��7(�m$�K�μ��^�\.g� g~E�prw���'v2�cӎ�Z�K쇬�Xk�s�{�Iַ�$;g$Z�
~N
��"��m�H�����)��yb���U�}��D+z��Y���J#E"�pч�^��s��;���a2;J�٢NJ~�Nn�oX��x�Խ	xT����9���-,԰�(*�,RP�"�Vk]j[���Ҿ*��}��׭Z���
CX�HH�&!	�I&�Lf&�O&�y�9A@T�w���w��9s�g���}��<�s�&�H?���ٷ��?}��_��_��_��"�_�a�	�w~����鿼��Gİ_>��G���P����^�C���b���-)�ʭ��|ډ��������-��/�>�g����'rOKj�=~ң�Ǒ�{�$�Oi���i�i}�Z��}�3xؐ����������>yx�y�8���r��}~�ώX9���eT�����ѳG������ew�K�������7a�Ĕ�M�?eô��f��Z���U5���K��Lo�!f�1k�r�r��e�f��^��r���YKg}2g�����_���M�s-sӭUs8��s�r����h∕�D��ȿ��$�߼�yC//H�M�oޖ�o^��/�j�Ԭ����_�Ɲ��k�,Q�����L�o΂�qs�_w}PbqxI鈕YKOC�=)#J�ͻhbVU7�u&��~x��s���Qџ=;*����|��Q���N�3z��a�̘5����Jy(8���?�Ө���xd�#O��;#��J��2.){�m���K��l%+~�G�/�g�|yA�����	3g-�|ߜ���<ߍ1se�e-�
]�@�\�I�ss�l���7~�)[��G���ѳ�}����/���ɿ6zvB7~���b���'_�����ڗU�t��Se�������۲�=�ǧ�s��}�g�����
~�����3G�0kz����-��9���q�j1 �F�����?��G�F�t�^w��v��do�nE4o�<����$���F�f���gV��Z���_�!۩���.}�5y.٪�֜��Ze�zv�sI+�zv�+>�/+'��n��?Z����g̒�~y�?��+�N��ο
��Ŀ��o{���ʰ�^�~����<���wf�Ӷ��u�����[~Z��6uݘu���W|8����aӚ1s�V�����al���f-͹.灜�r���n���.�#�lxDo0ʨ�
��b��4㸸Ψ��e��~�� � �g�e`9XV����M�b�]��e[(aá�0bZO�Ieص1`�ѨM6j�)F�6�8�Mc�됋�zm�aӞd��@�w!9�V���aI
�e�q�2�o�[6�s���o5��
�*�=�g;��d#��h�g��lá�F�A�nx���~�b4�[��qB���S/�s8hԉ���n| ��CA��'���#(F-b� 6�K��,\�"�冗���V��}�a����Z(-�����kI3��>b8W=�U���F�0�`�#��y\���F���(�<^$��b��A�Ї��l�2r�t��"�M?��bq>}����y~_��`%x�(�ěx��8�?�����s�4��E?��^�-E ,���|�7_��8�C�\	��$0��O���\��E��j׋-PNm�3�"q��Xdi��T�'"
��G/�<��ɵы|�"�p�.�"��E/r-���,��Dz�B/\��؏^�ы|�b?z�F/��n�b?zᶴ�K�H�);:����Б\tą�T�#U�H:�EG\���B}7��7�Б&t�Q? 2Г�!�C��>�� tc8�5��c��q`"���막>�:a���Ao1�cnD�ns��FT܂��ޙ�\�d���E��݆��I���dz7��M�w���dz7�޽@���F|�
�U�x��4|b�~��k�Z������#�|>����u�����3�9�r9�vʙv��`���R�|�[�,D!�D�<��Y�,E�! "�r`��ԀZP�>��H;��@6"��m�/69T�#�K�GDo��Ѫ�7Z�ȁ�t� �`��(zr4l6y)r,a�e������*0\���.�h�W�ʹ�a�:�
��N�����m	���<�y��r,d3��m\{��������@۪��\�N��|o��&�����a5~d�
֢|��o�h��g�!,��|N���8�b����e��a�2Z-��>S���-?���ɖ�1,+�� �!q��a�#췔��D>�|��YVt��:��V��kY��*�Qͱ'�fg[ҁlD6aY�KOÌV}8r��F�k병s�������z�H�?�
FLG7�O�&��o�+Vہ�t���a4�;@!��p�R�-D�8��s�
P	hw=��8O=8��4���v�^������	��$��N��{�}v�c��ؽ����}���fe�� ��,bGw���e`9XV����߱_�
`��7������~g�ߍb,�;�m��m����Nx���i�;
(��)m3a���e�Y��v�M��o�/������*;�6(�O�ޅ��E�0��#�c�����a��tlL�n�.;���߱��բ-U6��}���4��{�V�x'���V�
U�s�a��פ��]ٔ��v��dэ>�{�
�aW}D&��fڎ���$Jى��Tvb7���c7e7�f���n4cɖ�c�k�|�sUq�l����@6"���}Hۘ!tlB�D��>�������~3�ߜ�u���F���_��n��M���8_
����0�`"�!0�P�c�g�u��au?Z6ڈF��4t�V�E��o Q@>\����O���h5��x�}pR<t��s��K$��U�(;�b�c�Ux�Rl��x;ܭ{)��D�d�e4��yx�iě��,"�Z뎥��;���i�0k���6�E	��c�8�&�2�E��i�$���O�u�j�����(�O?��'��&>���q�=h���ߣ
�y"��EDQ.cEC�&��Am �"�p��
?�h-L�C�a'ڰ+�!v&Ⰻ�F�I�yRa��0O2�s�)�y�a�b"�S,��������;��#Dvj�N���}D���/�P90T�C�P90�r";ч���N�a'��}؉>�W2�u�:
{����^Ga����Qث�*���a�bث�裇}�)��m���6��s�<���(���r�s�d!��%r�s�~d	�Y�<�<�<ʁ
T�jPj�
lWLb��@�^1��+���z�`�^����NK�A_���o��a�b�;lXL4b�����!�6y�b�%�L�H��3\&�k��`2Q�Xq*:�h�=��,�`&��h�Is`ң0�r��(ъ6-֞��K9�r��v�ص/�&Y�v�Q��D,v";Z������h�ìu�4�c[�M���:�
ځ�@��{!>���e��9F:���]Hèâ�-�t�ڒ��a샭�a�bK/��"ӌ#0�PK?�A:�B����`<�
\��,���?6�%Z~`Da�X�(,������Ga�b��8�	����Sȧ��q�e`x���	�A1� �h�gy�mk��Y!��<C*��ϐJ���3�9�,����PL�d�C=���DO�x�d��v��q"(���C�!���A�E� ���I��I��$�x�b3���N�S;��n\�o#?��ا�"��<���;���n�5}r/���ߋ�_"�!���D_-z),X�J�e'��}ى��x�b�/;ї��ˮ;��F��g'hxm��m.�m��4����)#/�	"�v�ʯG�I�#��aO3�ɨ��w�2
�t"�l���|�y�-�찜�s�rnX����fq�*n�M�,Ȓmd�6���l��L��,�P��y�l@��������xmd���׆U��6���L�F�[��(D��h�mk%��&����V��V��V[Z��g�d����Fq� r�A?����
5֩q��jD�u)�.�7�ֻ������$��y�/�
��^��8��m�X��_?��P�DY��1`,gD�+���j0L�ᗩ�.Zi�S���i�rZ����i�r|<���(�e�i�]��.��d*=�R.�e�h�rZ���)�e���#��.Zf�~�4���bᴀ�pP�CԾ��G����_�����u���R:(�!Jy�Z)a%��tu�����Q�:Jv���DVJ�Du��A���AiQ�C��#.9���)M�P1�u �~�F���^${]E�"�Ƃ�F=�)�4e�����4����TP�
JSAi�(M��Ci�)M���4����ҔQ�2J���5Q�&���]ݥ��TU���R�R�Z����Hd��m_Ћ�(�0L6�(])�+�t������S:y�����S�zJWJ�J)]*���t�����UQ�*JWJ�J��`�y*n��^�0�k�t픮��yT�^$�Z�D�”,L�”���5R�FJ&�9�)Y���)Y�����F#%k�di�����)Y;%k�d픬��5�,��tQq��7
K�B)�aEׁ,��y�-�
��^�6���6>�"��Q�� �?�Qby'�ot�~rA~g�!��3��DPr%w�pF��!�A
B� D
B�@��r�('m��/�V1�n����F%񦏶�).�Ŵ�(�q�QD
�b:��%�ߒ�=�V<���r��/���w��η������GaQc�Xp=��Z���q5�Rc+�G��R�jj-�X����VS�jj[@M����6��y`�Н`1x��a5�#5ǣ4�y�-�
��^�2�&��s("�8�<'5j�-��O����Ь��+i9J�<f�x���9�aТ#��v,���}����WR�|�S5P�|t}��]�G�*)Y>%�G�����}�>����(M>�ɧ��>JPI	*)A%%ȧ���	OM#��� �#w�e��KX�;����0�̰�i{YɌO�S�>"�OA2���C����M���W!�9L���ڋ�n�D锏���;>z�G���S��w����m�H�A��c�d�0qpԼ/P����b�$�v��셔���3@���
���L�xȈ����u��0q\�6,�
�Ei���lQ��01[Լ�0�3������Z�Y`�,�K衭���M�6VZ�/�f:V(�1g�Q��@��Nf��H�d�m��������8(G>c�'��=�ȒBx�T�'�8�h�����K�"��T�_2���Ih�t5�NFnJx�VQ��?�7��ɕ[�V"(}W�x�H��2Lw"�2�(YD��b�p	��a��cXV����ЩU�k��a�� �;�.����o(.�N�!G��Eȍ$�wj����.U~�S�y��E��E��E��E��E�ԅ����R��DЕ:�IY�&yiRr�L�"�1������O)҉.u�Kt�]�D�"�!�)�>u�Ou�S��A�<�S�A�"�S}jU�t��U�_��O��W��^�J��\G>�E�߅�աct��Л{����a�0���?L�����p�X��^������,e[8�:PN�&�͠�~�>&�z?.6�[�gb]��H!Y�$%����b<q�J�[?�<���0�s���3
����F����L?s�8�lA�\"E�A��<y�Mhm��c�G����	��1�!�'.+]�6���Hd��X�V����{��#DT=��������!Z)���~�XB=N�b����&�A��)���*��L76*:�����N2�2�k�]�~�`��%b-:�7^�����3���F��&ㄘ�����ym�c0�m�#���B����ZU����	�s�G�3��y��.�
��^�/q�W���5�:x�	���Q��`
Xց��}�e�|6���'�ѧ��h<qo�&6S�-��1��6��S�<��_�����Bd�K�>u�^�G� K�e�ȃ�ôO9��T�P�ا��N ���وlB��,!��|���ôOD\����ޠ/臯�O�;9�?�!#� 3�g88$��Ԙ�xj�{<5�=�8L��N���j��Z�V��Q��E2�7�}�Q��M���xU[��G�1�7���[�hz����{<��_%���@��t����r��<�:���d���iQd'߻�A�H=���A/>�"ӌK?>���Aȑ`4��W�k�����α�%����=�|����a�#��;�{,e_��Sȧ��r�K��g�n[^7N���[|_�����/Sw��x8G�_�N=�40_>I�(.�<ܝ{ގ�\`l&�L<�Y��h�����5`-Xփ��"7��p�'`��<�9w��":v�}�o��� 7����A����]`����P��E�/������~a��"�[oح�����唧TtB��<u���tk#h�4���6�l�/�����!�_Ǣ�♣��f�SˈY� �G���ua���b��@�6j2t�\:/�Q�ћ=��1��i����Lk��m�����}��]��?�_ds��x�Ed���#2���}7���'i���H�*��c�t��Q�(�Z��$����3�hc���^;�U����+)�N)z�/֙f���^�4�����%J�Al�������'|��w�WҖ{���+�p�<���+Ǹ��\9�+�V��M��M���jN���,�7	�ۉ�L1}�'\)f����H�֝�{���ާ~��3nR�@���<aDy��G�שx­r��v#�oBW�*o���p!�[\�MO-�<J���o�d�|�=ι�k�:�	�sayx��*��
��}�8�-|&Z�;�N�S-�]\{Hx���"�7���Hz��'��	�}x��'��	�}��	�uBx��&�����x�E���#����)�x�8"N�Ц���~�4a1�H�����2���̰9N�f����;k��Fa�� ��4#nI�6p�=ɸ�q#0�0nƕ,+6`y�c���uؓ���w�µ�I�D����xX����4���i6�LP�*�a%y�b�����Fl�	6��n�M��fM�5#�f���!}��a��9ڹv��n:�&���`����ر|���mg�Y��	��6C��hW�
�]A�+�vŋb �W��������ʹ��i;���a�Gkiɠ�!1�,6�?æL8��	W�)��I	CpD�*�&�M��OYy����v,u�����T���3K�x"�	OH��䊝�jĭQ��;'��L򹠌���i���*�����A�,#�9����D$��F~��
a�ӥeL�'�f$��K�'���D�G�����Ψ!��������BJUL�)���.%]kl��ӈ8��X�Ki�����`w?���j|�D;����D]Q��O[��N�K��at�]��n�c��멡���j��ҳbtt?^����N���j�U�C����'��mބΨ^����j�z	�5=Y�ҋbJx�v\��mV�Ҿ�]c'H=<���l�
kh�V��E�q�ڰ�|�ܮ�&_�`$�<���P�q`��)Y��,�AҊw�/�˹�r��K&ℛ��D��D���\2�rx:�L���'���#?�H�~
���D��ţ��c�Y޷�۞��r��/��Ud$2����AF� #q���/���B���/���B8>�υ�s�\8>�`��Pz�*z�s2�r8?�υ�sї\8?��%#�����Hld$62� I�/�b���B�PHF�䒑8��d$�A.����O��'��r�	���\|B.>!��ā_�##q���H��<2>"O���.q
z<=��g|��%+)'+)'+)'+)'+q�Kr�J��\�>%��ā_�%+)'+)�*�JZ�3�d%��C>YI+�&����8LV��>�d%~�Y����FVb#+�����J�d%A�;Y����n>y.�7�V�
��pR.YI+>*��D��n�YI+��S�����AV� +q�
�J��J��a�d%�d%�d%�d%�d%�\��r��r�[.YI��KVRNVRNVRNVRNVRNVR�����咕��r�}�d%�d%�d%�d%A��r��r��r��r��r��r��r��r��R�1,�G����B|�*|d!>2��������ā��%+q�3s�J�d%A�� YI9YI9Y���GV&+)�摕��������K��J�d%a��0YI��Ďͅ�r�J��\�YI��$HVROVR����ď�ď�ď�����T8�	�9�L���s�c��L��B|l>6�#y�Llp`@�����I3�I1�I3�I3���WLf�Lf"c��d&�d&�d&�d&r�^1���WLf�l>9vÙ�Y��,�A�瑅��Bld!6��r��r�Y��,�Fb#)�����s��Xx1�(S�}�_��'&K��’{M�tÒŒ���$����0��@��:�|r�I2`�k`��X�	7��-�:3��
,�k:�e4)�Xn�W���U�&ZTF/��Z9�FYwkh��E��:��=�<5�B<*�����D0	Lƫd�#f�U7�[7���E�̱��y1ďU�m��C�w�-c��탿[�y�퀻����䄷ݴ�^���k��Zx�^���k��6��㺫�������!�l�O��w���ɴ�1x9/��e�l��m�M�c���좌{@>�/T[/�8���6��>��ǵ�
>���m�q|\��c|l��m�
>������Z��
>������Z�����+��k����z:�b���\��Cpq-\l��k�b\\���Z�����Z���pq.�q.��.��.���>�����-pq\����-p�.n@��� ��w���'8�R���/7��n-��ok��Z���
·!�6����|�oC�m�
��6�6߆�[|�����|�oC�m�
��!������|k�oc�m�
��!���
��!�6߆��|�oC�m���ompm�
±A8�dž��[����Z8V�$i�c��86dž��Z8�
�u��!8�
�
��!86���X�cp��c�_m�k-�j�_[����~uïn5��^x�%�>uçn��
���S7|�Ok�� |Z�V��UX~;|ڂ�7b�
�
��;���j����2�����r�U*}?V��-�c��?�t����N�Z@�ʃl�
~���`�j��O�zQe�ɑ�p�
���#k���p�~8��l�#���y*J\D��X�D5�PM��*�����X�f�Ո�[��k5�1pԴ�+��+��aX��j%�b�����pgZ]�澪bd�r�-�	Z��:�!ܹ�����X\?prR����/��~I^�8��l�{I2��C)tJѩ�&���b��K��0�Ļ��'`�,��c�����y�0o�
�[Eo7��<�/,/s�+�W�k�u�xS�҈��1�2S�hǘɐ}��-|'w�c�c�����r�E֋�z1X/��`����b��*Ǘ#m|�ՠԂ:P�o'�vdҁlD6�{r�h��D	��`���b0\���p1NΒ��`��3��`���eb0J&�cyc0IL�c��%��1b�>�j��4X �Y}��V��cX}��a�1,<�e����rcX��@9� ���>�İ����bX[ˊaY1,+�eŰ� �bbX}$���� 1�J�j��[�z�EL1����i�g�:c�����2rT^�K���}1�-�B�y��H���hA3ZЌ4��hQw(�B��
��8�.ηȹ8r����Oͽ��n�9�FΧ�si�<�zNΕ��d��m��M�c�2�O�e�O��+���j@]5�M6��o�jS�|N�v��]͏Y,F���Or.����1����0�Ђ��E�`[��Z�h5|�3�j�Sk2:�6��VHS��8.n�9T�J�DcZ�b�i�Xf_���"�<$F�!r>���R�?��T�%-�7�-����*��q�	��ހt �MDh��ͫ�|��l�R������آ/�hV��B��|� ZD��h������e0�~sNJ	�ւ���m-h��g"9�H+qGX��؃ָįнg��z� ��:�;9rg�e����V&�6��.�G��Vg�M� \L����g��^Vc�q&'u��6�ިh�3d��@E�%�Y�Գ����SL䨧��9�����w�a�i���Rw�7)f�Ǟ6�/�Bwɧ����ݗze��]{��|Zp�#�\���CZO�s�V���5�#�}��o�q��.��l�T�&aoS�J��"M܇�}B$��m��_9��%nr�PDL�*r>I�~���r������N#���Tu���t�w���j,�"�4�)c)eR��<�*�zO�A��,��˪�>f�6�����ݭփ�PB+���뤰'~��^x�/��T��R"��.��f�j�|&��^r\O'm����'�'[��#�(S#>ЃfɘރN��3���	]pR�FU#G���D���5�����_�(�Q!��-�B��Lm���+8�}����D�fw����ٚ�M%��Qڝ��㫾�wF���:V5��4�����r�J�n�S�$H<�?.�)�z�L����a�wH�1}	�Jԫ��>��ժ�^fO� �;Ɨ�R:.����Û
�',A��~��8�
֘�K��?�J1	�Y�1��b<���|^⧤
��7�T>[�M�n�os����|�,d�G��8��oXV����"-�eUG��#o���|Do>�6y�O������1 �"
q����6��r�|5Z���L�ت%'����J�D$n�7ш�H�M$�&q���D�D"n�7����M��a#�H�M��&�p]�ɗ:�;ȓ:�;�a��b|W1��W�|�~��4�M[D�s�VD~$�n�ɋ:�U��~9��X��Z����T�O*&7����V�D+n"7Q��(�M��&����OTK�"G�Ւ�ȑeE�.>�7�����M�"���Z�� ��b��a�E�G�D3n"�$G݆��5�c�~'X�ņVc�k�Z���s�
0(}G�&
r��r�D9n�7Q�[YT��̾‚F4�*�:м�xΒ�k�_�	C�X�Ʊ
�(9�m�:L����I=΂�g�߈�'�F;��.57z>��h���Qt�1�Ǽ^����E,$�����(zEo��m����Q�6*����G`�$�H:�['z�Do������Q�5��F���諓ʏ�:���譓Xʏ�:O���Dw���u��Nb-�9�o�_���r�2��]v��g'1��v���k�מ��2�ׇ��C�^��k;zE���Z~�د��=�>��?Cnc�.��M͢;D��G���Q�ى>;�g'��D���}v�g��C�W~tډN��i;�E���q=vc��e'q�}v_�s��N���U���F��賓�ʏN;�i;:mG���W�9�=�B����.�=�R�?�
x�S�ӗ�T~b*?1���ʯ���<�K��e��ҍc�i���ףE�Qe�c4�U�NK��/m�S�9��]'~�
9_��b��3狩��2�~��9��W�CKcߒ���\/f�z13׋ud��^�s��RO��)Nj~-�K#�K>%�K���.�Fž!���	14!v��]��.�ޚ$��]\���4"�QJ?b�:�?K���e`9XV�����bx��N�[/m2��T�jXD��

cAa�B���!G���(V�
�B�f�&
��Ё��/��%����+�#ʎ[���_���:��w��i�_D�S���݆DY�0������V�x��^݇��kzXƎ*��ZDD�X͚�U�9�,�}�j?�_��U�	��ܔ.Os���h��`+��"���bj~�	��2X~�b�c�G>�6y���1����K�U�Q���$�;���1��C�.E���q|�yOM�D^��D~�9	y-R����ӧ�=�m�/P#�g[�a�i���\p3<~���Cp+9ŏ���"_�_���׽�u�����}8�]D�����`X	^/Q�?Q�?�����
���-�ω�E�¾�����
 �y��
ޑk�P��q���=��k�:��$�}>��r��|
6ʱ] ����0����P^�CyϲnHP�f�,������B9��%r�����V��j>X���`5�8D������W�
Y��DV!��ǐ5���Zd��#O ���Il�y����)[�ۊl��F�#=H/҇�@����X��'�|��9��l�/�V
iA&��'֓�6���R>3HC��Vd�ف�¸>��`\/��q��P����!�3���r���i�5G�z͑�^5sb4e��'.E�%ƽ9N=W�+���z(W"�R+�Ժ(؍Z�I���$V*P��C������,��j��_[���z/�5S��U�����\��)x�-�e�m_�7�Q��|߮�5��98_ߋ��G�]��$fzT!�l�F���s
�7<���\�k>G�~�s
/^�k��g^b&��>��V �s�?�YG��uș(��_=����x�X��r+���O���?���"?�G��g"><��Ãz�x��LćW��Q�*��"k8�Z�mDbߖ<�|N��xV"�vy�l�j��X�鈹
�s&ai��ī�Nz*����[��{���^�J�
c�g׳��j�5`-X֫�_ru��x|�F�����{u�HߨƂy�}��:1-�рW�H��u��3z��G:�"B��;���n���^�
@!��cD^}����I�<'^əx�`8�C�r��D>"
��O��\p�i�����s��מI<���x�L�jV��
����D��SFs����9>�{rT�*��1�S�'G�%�:�[�;�1��Kx�<B'��<e�Z�[G�>!�)Qo�Ě��Uw7\b ��v�ڀWnQO��tk�A-58��M����K��獛sb�>�}�c���`X	^r
�D���fq�YoǛ��fq�Yo����:1b5��8N�ր׉�5�u�[*���1��|+��f�,̜1�Z�VͿ#>Ts�'���Z��N�v7��� �PYYbF�|⚧��75t�.���0N���3�s��7��8�b�W��=�|���E�f�H�V=�L�F���j�ZK��˚�U��\�9�j�^@_`��;����w�y1xI��j6��B1s$���y6QѤtpz�ʼn�B�_!��W��+D�%c��W��+D�"��{�����^!�����j��g]�&Sw��\���nc�9ˬ��)d�T�A+��
����<ϱ�r��/��/q�?q\G�"v
;���B�N!b��;�����Nqb�8�S��)N�'v�;�����N~5'��쿋��Q���h�-��ĉY��+qb�8qJ�
���MB�%!b��H�X$N'�ĉ=d�!c���A�*ސ���3B�2�S��'Bhh�B�2v�q����qb�8qB�A�26�qA�����3��j9��͖3���6��F\".h#.��	��~b?q�����{�\�i�r>����,#�%���l�L�"�_��GYC�߅E���C���>�u���㚜՝���Ϸa%~�|?�χ��!�|?��DZ�6�|+jÂ�}�.�ȍ��O�����>_�N���C���+?�GJ�rcQn,ʍ_�cU���a_(����E�]X[�O��1����{�'��y�>9F+���B�=���;����������{�Xb���v�}]X��W������8�&����o���t��7����'E=]��#��TB��L$WL&#M�Jc�No1S�s������#p���L�pF9#O�	�3��ݠ��Y���� ��;���"���@O�L�XR@o�XA��-?�_��E2%�u�B�F
��)�N�j`��R�>ԣ���Z��V�i��Y_jf�fVjf�fVjf�f}�Yo�+�3"���gMVjg5G9X����YE�jÁ��J���*䈮��.ї��v}�]_jח�Y����Yͧ�Vjg�vVjg�vVjg�vVj�vVjן�eP;+��R;+�����r
|�W�\e4�{).��+�?���#�v֎���:[�M��>שy�'`��u#-&ԝ�;�(�L-����~���y��?q�?�����
���
�����x�Vq����:�쇑���ڂ�*�~T�*pN��#0n���F`���q#��n֍��X7b�KM�y#0o���6�F`�L�e�0lv
'�U�* �U�, �9�߮W���D0I�c��a��0�f=�6���h2k�ɬ��f��8Ũ�[�Q#�Q�`{.���p�Q�0jF���5�F�&X���M����a��g��j~����kʕ(a� ��1#0fƌ���[�Ua� l�[a�F�2[6�l�-#�e�Ô�aJ?Ly���\�-�l-��z�}�KF��q]"C�KЪ��5����h�	k8�'�w�q�.��s�K�̓�y�+?�$W���n��C�xh�!G���z����zx��i�G\#z�+��B�n���XB�5�'����{@����Z���Ļ��FNj�FNj�FNj��ﵖ��k�n�il�G��Z`6��S����H��Om	�w�s�-�����~X�,�����s�����G�<�Џ���p�� ��l�ą�nδX��#�=��^��O<.~.�_r�_��&=٥*�xW��?�?�?�<,r����n�y`�	vq��\a���Z��/�1�%�<�?x�l�"R�T��`88�`�	0��r�[��5�Z0Edj��-KX�`&�>���5'�hn�<�:@A�c;�]��
X@H[z!{#�+����ȁ ]��B����`<�
\��[���w|~<�1�
��,WS������e�T�	;����*��>A�5+F�s�|q�~��5~�&������kD}-~s�׃O����1J���[ą�V���|u|�'�����7�&�;A3hm�@*���F�d�\�@�Mu���5���9y��_C�~��|���J;L��T�"1��C��E&V#�|^�\��d�]��1�|���S���5�:x�	��o�w��������1H̠�-|�
>��m l�y`�	�Dž'Ƅw�b�ُ,A�"ː������ʑ6�W�jPjA����	$�N��)`v�N���Y�(��ѩ��C "ӑ����C�����ެ�/"�
�wȹDq�r��9y%�*���	H�h�$y�v-2���3�W���r�y�zvI~�I��I��I�ԩ�{����@���'H� M�O���|>}�uyS��I�Sȧ���u���O~"7
��#:���0r��H�O0�͜}f|�<��/��?�@�^���H�럣�g>�;sV{9�V�J@}��A�>ԛ�4�Nwq�v࡯'cw:�3��u��g�ix���4x��L�������sȜg�#�!-Z�Sd�)2�"x�<A� m�ҷ��n " ��0<�0<�0<�0����f���ml��f���g̘�e�xI0^&���e�xSa��-6����43߹�Z��������������Ɯ}�^�׭�o��/G�e�u�۹d��?�U����w�҂�:o�Z7 �X/z�������'N3��7Gd��g����+'�X�o��	�2v���$�s�7;L5��4��y����:g�]��;�v�
�
�71T�]��A�����O�^D�^��7^�6��@.T��7�i}�Z?S�5�k����h
�@�S�.���6UmH�6�V���

����-�ѐ�h�,���Dv�";+�]�9͹ۼ<��^���]����l�@�L�FM zKA3�[��/�1�%f�Y�ЬYh�,4k�6R\B�6�Hm(��P"�"�$"���Ć�y3���о�h�L�o&�7�I��Dg%%%
I��I4�(�(�Hj�L"�$"�$45�	M�DSoBS�u
X� ����h�h�"+QOQO�<M��m~�&�L�ܩV��Hd���e�Ͼ	�vkwwvN+$�
I�B��re��%t�R���i����٥�,����e�(��V���Pf��ֳ���k�:��/zR3�{��b����Rֳ�z������ݣQ;�>���4up�(5>�,G�R+���3�aIhX���%�;�3����U���q��W��X�ԓc]o~�x�����%��%j�Ⱦ�bl5-q�v��[��N3��LΘ��fR��hO
v9����MQ�.�(�}��]fb�22�2�K6y���-f��2���� ��i����HZj$-5���-@S���0�K��2e�L�/S��
�ʋ�ebk��je_����jv5�g��Ll(��e��L�'S���m4�<*3�OL\("Ӎ�s^��U�
�(��q`��V*�$5^����E��"fw��^bv��g����|��yr��J��7mX��h†}��侚xT��JY���S��bXV����V�$g4�W�k�u�x�c�U�~�~�~�~�~�~�~���X�E��"�w�β�C��L����V��l�`;��`'�E=��I��T�d!��%re+�8r&�� g"p�ȃ�à�@%�5�ԱO=�Ҏl@:���&5���u'��\{"�h�RAo�����@D�#!#� 3�g88\����9�r~~�Z��r�s<�
L׀kA⮔�ܠ�ܠ�ܠM���%G��k�*�{�����-7�Ҷq�<���Ҏ���@#�:)C3he7�x�t?�� �9���N�wC���n��$��p�k�,����L3Z-��<��29�����*p-��� ?���%G��<�|����\��\�e��=���|
�4�9ο������%�q�;wo�}-�w K�a�J�ɻy�7��7.��>o:9A����|�m��<ř��#_�,��>�{�{��^r /�؋7���������E�"r�<��y��8.�s����\(��"�u�_�N���r��=Ƚ �B~/B~�$/֋9�~�)�.��A�#�\_͞l�ˑ���R.r)?���\ʯ;�"r�dy��	�Ahc��}ہ�H=9?�V��m�ĩ>(�[}P
l*�m8`��*�m�+���lBm'�����Q�7:Pc)�cG�{5�Z�5�c���Z��lc�ѥ���}.��|��v"�;�����*��I�>y%iQD���%�d�MFL^͢]�4}���\Us�]�G�Z��o�*E5-�$�ԯ�d}��7L}��7�ōu����dr����J�������I��m+��>J�N[��
"=��Ҵ��Q��j�4J�(I1�Չuub]�_[�J������(�l�_C���06.��F#g�ӯ��]ܠV�M6v�;��w��
g�ʊ�J?9�{�ܫF�����;Ի8j���|��Faڨ�Z��[6jR��(M�7�����^Uk�Q�b�;��j �|�|z�ּ�/�!Y�.t(b��=5m%Li��^L���g�?��'4�=��zu��t��gg����$�1�;Mm�q�8g�sƠZw��|����7�\�?X�/�Y,_[��Qi����=J�=���*���	Ҋk��$J[II+)�qU�>�b�,���݆]�S�J����,�b;粒� ���] �vʒ}&�ȶ��B�XrL���n1ӊe����b�[���u�������5j-�}�\���F�ۘU���b�b�HH��Ϭ���ֺ3�q;g�rŸV"G�+�*Δ��͗	�W�|��kk��7v�#E�w��Z��B|�p�zd�r��8����r��k����Po��ގ�����������Rz�:XF��o>��ޡ�ާ�F���j��ی"t�ȌOv�G�����V�#���A�
�r��^Z���O_��Y=k=��(��s
�����Gk�F/��A7��>81�t$��M��"!Z!��Ԉ�x�;�bp.k\��:<r�smU�*J`G&��1���>������/����N�!r/���i�Ǵ~�p���n𹜫�
��w߶~�|������x�9�9�*.H0I-��~Z���w�^8nr����=���]�}��F���"=g�R~�{|�96�������$��Q��1U6ɷ�ɺh�ڱ�v��{�^��W�RTc���C�5��5�jƌ��N�}�8K'g�Tg���M3��f���;jT�ɚ�T�Np~��UW�0��Iy�_���f3�7*�u�RI�Q��e/=J<���22�;d��m�@:]�NW�ӕ��^�����67ӜW��C�0iJ����7�b7*mL�eH�L�6&��ӎ>�х0G�@娆64�C���:�}�w��SZ�f�R��-������%��r�o��m����.�Ϣg�S�w���������g�7F� ����h�3�s`�7�9b����h���H���sj}�\7R�"��3���G�gK�(Y��՝�:@�}H��~�z@�R��j��xú�k�w����N̠� Ԕ�H�'����9L�{`�F��+3;������l
h�QX:Uq�W+�5b_%�[6V����w�u��zD��~`�b.�Qu��Q��1�›���U�`���*p'X�嘞�>�?�����oͥ���靈>�K7�7��qm*Z��os]�ƞ�Q�;����-Q�F�F1X�SF���-��ty-�o�X�v9�l4fq��A�D�4y3z����?�w���|r��c0��nG.`�;��-�Nb���E�mw��F�X¶{8߻��Z
ր�@j�z�>���}>�����)�6���f���߶���`�۹v�v�]\{7�݃����KP̾%���C9��T�P��n��9_+pQ�v� " �o]�+X@�	R�|-�}Ac�6C@ۆ����p�v		F�Yj��ˍ"m<�
L׀k�<�4~�2
�`&�A�
۪-?�K9�S쳌��5��}b[��8�~3h!�o��~_7�ہ�@��[!>G8G��.`�
X��ђ���o�$�㘥�R��fl��6j,}�U�� �ҟ� �t�er$
.�U�Z0L�<��=��)���� x<�o�c�'��|~<�9���%���n�k��q�����y���p�2V�����	��:u!�ߠg��G�'z6Y����׀�`X�7���>&O���F��M|΁Y6s���~�o�,տ ��Eny`�w"w�����P��E�/�����g�u��X�֬1g�VÚ�j�PC�~=8�ls�z#h�4���6�k���7�1�x|�|������a���F"���VX�2��P�O0噺4���o���x��e�G��A�u�.WВz��ri��ex+�|(��4�ww�7'�w��׊Jé�$jp������&��5�b�YWT�+	s��"c�jm�Zg$͐��{���?�k-5�NV=H��G�3�R%��3N��?�ѹ����`$q�(�C3N����{"r�,W���a��vn���"o&����_���|?r��~��u�^b��1M;1����#���r��/����K\��*x
��o�w9�=ʳ�k�:��Ȣ�2�x�R�L)^�41�@μ&��$��_��K.�˔�eJ�2�x�R�L)^�/ӈ�i��ȷ����Bd�K�>�S����<��T��S*�UzJ�:ex�2�N)^��S��)�딊:�RO�8�V�)
jŞ2ѨV�)��'9k���S/��KD:���x�Rm�Z�TKW���j��J?���/١]�F��F��j��j�j ���i�5��B�x�F��K��x�>^�ާ-2��i���%�{��O��j�A�:e�6���u�c�G�#|��*u7���w"�r��߃\z�{�K�D������=�~�|�qO�Tj���?x�{����n�M��~�^�������x�Cx��S�k,W$*�<�V%*=�]�r��2��e��øOsP�+��̑r�]J�aj��R�K#qs;qs;�^I�|���1�"�c��u�s�����<><������?�<�Cx�2�O^��|wq#ަ�+���6x� �&���+�U�m�x� ��o���6A��\��o#W��a�z<M��˹f�Uje�2�L#^�/�x�{��0�x�F<L����R<L)�T�����Փ��N�V��5��)��ݮ'�˂զ��ݧf��u����7�E�K�̙VX��i�eZa�VX����8��f�J���9�������j�|mU3_]d!a��^/m�Z�o����|[^51[T�Iv�Q^-,2Z͙��j��j�G�9Gߏ���I�zC~s�k�)j����iT����u%f���3\���Q�(qO���l��Q���l�)��|S^s�Myj�r51MT�������Ӟ%��~}m,���
jn���*�y���`�������KN�%'w�����|#Ƃ��(꘸y�\���꘸F����k���S���T��hZ�[�YD��%hD'~(�V���k/Q�b�ğ�g��_��������A��oZs�-���6x��d�]��g�+Tj�'t�ߎ���T�c�8�3�j0�r�M޿mn�>�Q��y7�䁚�3�J7�ʶa�<5/[��-WȖ�c��ط�Z�6�/���
�G�qj5���\�B�`!W��+W�F��h�z�ڋV�W3W�U9cU�c�zw���~D��5���.�6���}�z��Z��>�a5�:�U���R�Vk �!#Dn���e����Z������Rsͣ��oX^Ss�wc^����~p�ߪ8_��2vc^,c7���2vc^9U���Q��t�Zqa=���Z�c-^}�ZMn�~r��'ނ�tb-�XK'�҉�t���o�w¼jm��j�����6�b/���(ZEˢhY��{�R�^��KQz)J/E�(=�G��H��y�Ҟ��;��z�\�9�_�f���	�߹��;�-j��@u��IEף�c<g��ē�f���������XQ��\Q��\M����w��
��
��
��
��
��
��
�j��*���k�Z5�N���}p���r����8�W����P�%F~��Q%V +;��X'Qc�YW�W�'��	9o��s�cU+�
4W�,�	�n¢���,��>��G>�HFmǵ��S��rm	�'�j�
nq��	?tm�7�Zܤ�>}ۊd�&��L��l�?���T��ȇ�r���G�ʞV+�uub�M���
eru�F�pr4��D7��;�b���L�K߀�K�lR��Je���T���5���Q����(��FUbj���G�j���h�hNb+��b���U��O�}��h����Uv�ʎV��*;ZU�����q��`
Xց��}��|6�����)�9~>�@.�˹��[��D&�M�v"��ʃVy�*Z�Q�>��l|�ՠ����\�I��$Ws
h���Q4�C��'g�/���hX	V����a�hX=@�hX
��,�7��t�a�?ZV���в��-+Q�$+�u�kh�-�e�̃�y�2Z�Q�D�M�i�h�|ǥ\]Q���N$$��^L$ԁ�y�4��Q����ys|Ƿ���m�m���h[�)#�jѶz��m�W�<��_sWUu��2�`@
�����
*e�Z�J�m�V�Z�Zk���n\Z7�V[�Z������$�@�	{@Y�D&�$fB��$!y��w�͛�$$�_��}w�z�z�}�s(�b�Q�"�G���  ��>?��������&�y��:��ش:#��6db�R�ϐ�Y21k�!���C�!��rH`9$�X�of��K`���{ۉY[n$��H`���䘵!H`����!H`�� ��;�6��}�U	,K�q�F����ծ�XY��}9�C���Xx#�G�W��ī-�L�r#��F����Ն �!�v��w�e��2H`#$��ħ�C��@?$�����uFC��$0d�ӆ��N3_�l���~vDs��
q:|�:��������Hc6<�ݐ�ЇχDfA��̟i��;1
�=g�; Fo�,�'���o�o�o�o�o���
�b7����.vC��+�+�+�+����S����������
�g����Fv��
od7����Fv��
�b>$"��4�g����A�v6��|�8���V68�
�2�f��Y�'�')�m��|p,��|�+��̇/���\�ײ�7铭���\����n�hnE�`�]�qv5���GWS~:��*�8z��r���|�����������R$
�9��…�L8S�l��������6�=��_�����C���kf������y�_H3�0��<p`��
���-�p(�
S6�͠p.(�=���E@�BP�,z!��-eA�BP5Tͅ��CG�Pu3�Z�nU7���AQ�֞���kЯ?��sl@� �ĸ�(��b��	�^!��4C�=D�:堎�)e�w�ח:�3l��HA�P��(�~`\�8.��z����(�1�-,���81Ko�Ѹc?0�+z&2�*�����9��t0o��4@n 7
����P]׉���:hu����#���C�N��8jX(�Yy)U���c�c��3xւ:��N-�S�Ԃ:��N��^�A�ZP�"O�9E��<P-T��ցj٠Zv�wP
֘_y�b����j��\�X��<P3��5�A�ZP�Ԭ5י�]y��:Pt(��{�	V6��
m$;���m��o�r�y� ?�\�����jV��e�bO��o��8kP,jU��"6k�F���xl3��=Rl���e���*3�ɪ�IZ1q�(����Uhu�+��v��r#�Ky�)75奮����X��'�������Ɨ��/�QF�<�s��ma9�j�>���"��3�,��R�&�������X��S�|��~�ؗ�r`��3'�����Vk9�P�c�	m�Ʌ}�������S"�ܡ�*ka�"��PM����)��s�#�`����Ϙ��fa�k4:��1�s\_x��l�l�l�l�l�l2_~�9�z��/?S���sԭ“����y���s���DXZ���V
$���Rh`B����h�Qԇ=H�1T���g
8_\w2�)�����I�S����)zh5�2�^(�;���W��IYjv&q<
���
�]�+��(p�������;��(��)�q
hPԀ5�A��>e���2��\��\���yl�<�m(���#�ca�.b�.�'R
$�#�#�#�#�#�#,��m�m�m�m�m�m�m�m�m�m�m�mA�0(% B3���"��:�"���(��((�sE�axAP�fN6㣣*�2Gl�4���C5�'?�2�[�4#{�9����h�5�*�!�������Z�Ɵ����2Ԏ��@��!#٠�\�ƿ9S�4�'���R�����t�l-(�F{Yeg������u)�+et�l��ɕ2�R�V����p�UʴJYV)��k(=���@�йt.�@���lpa.�0�#yPf��8~	����c˂�uʄ��s8��Dk.81��pvQ�,JD�г�pL�_�9(3(�
���C��P)z�A9=J>tt9�`��,<���]�PXo���:�:�:� 9S��k�t�����e��}����b�6i�a!�"ոz5��
ܡ�2`�k���if'��ހ>��	?z�<�!���mm21D���"�!j�
��f�a3��~�?l�6��c��^(D�['f�s�O;�g�F�e���nr�;cH���e�l �8�~�?lG��ֹ�'؎*��Iq:�����clC����'�Z[A��fvu=(t�#�ᯍ��B_��н!��c��'Of�<#2y�S���Y�fHf&�iF���L3�-�ŷ#m����M���s��g�w��/���%����b�.����Yٛ���mE�@_#���5^.l�3)�f��C�|�:�·�F���k���F���@d`!d`!Gǚ�c�������(�H��&e>x�o"O.�:Q&�ȒE�>�_���E&2$�N!M�g���C)�c��'v��&�,��92�;*�hw�c�-�X�M�v1��og�E�u���V�|$��N1�Sl�P
����P�{��rp>��V1�j���8֦�#���h C0n��
Ա�O�!7�2�2�	���x��r��F�{a#6�F�39Jm	�D�-���AnE���x�%��X��`]��W�h��c�z7��Q?�ߗ�C��\��G1���X;�^I,��һ�*�%�8���Us���x/��������{��x���w�]��<���Tj<g����q�pαS���^���l����!`�!`�!3�w>`�!`Kϭ'�ʶ���}��	�7�&`��O�_>l��P����}�@�qO
�̉y�>����s�}�W|��s����yB��<�b�v���2�Z��d�3�r$�({X�q2�w�e��)uJA�RP��)uV����<�W($�/M~'��z�9�#�R4^��KQx#�zT�8�Z������;J���#�d8����N��o��������n�����Z�{���[8�m�e�d�J��;y=�_I&��𳼾���lr���8 ��(���E��p՞���S荵���Y�����8M��Zp6�p���Y8�g}����g}���u���:��(8g�mp���8K��.�.g����٨�l��&q��������l,�qv+8��ݚ��
.�����+�(�;֐ip0�E��8���g�ӈ��u~8G"�H��#p};�]��z�F�f����R�Z�O"�@��P�	oś�8!�x�
���	��<EP�rE@�������-`�Q)��A�g^���{}5�2����j�r����%U�J�P(TaF=P(
E@�����7��̷�~�-b���g›bmv��
�81���;�(SҖ�����3�=�}��'O��<
x�������]��
E��G1�(^�f��q�c�Q����]���(�Ź�wC8���s��(�!�s���8f	e�A}9���:��Īہ�����,�8&]�37[�!�!�sL:�G����32~��)?8�O��F}#zV�;���2�+�q�u1`<�xr�Lp��WT�La~�f� ���j��B%�P�^4�z�V	�+�)�3�f����\-*�;��;��;���լ(�����u�g)C(}A����O9�����Q��|������{,�vFO��N�ө�S�Z@�#I�4߫�Q�#�U�(����5���y�D\�;��	����t���/C�r���B콅mA���
�xg9���m���Z�_6��;l���b=�e�����)�D$oj��7Yk�o7@G���q9u��ӱ��~W�"&�_�1��X&��`�J܆���N,W�ߋk�=X���X�E�xL��u"*��&�,��*�������bQ!!��L�G9C�O�'��r�\"ϐK�r9T��U�P��r�� ϗ��|Kn���Qr��!�J��%��J���H�>9A�XI%�5J�.r��P��
���+oVg�3�o�u��M�T����"�y���&ʻ�%�R���y������O]�������*�������M�9]ݥ�O����)�G����S�ɿ�'��9��zJ>��VO˿����ʿ���+�5K͒/����o��ʑ/��j�|E�W�,�Em��+��%g�
�W����~��N���=����t�>E~����=AW.ғ���'��2WO�S�2�+}���3�Y����"��˲P��ߗ��l�Enҟ���a�C�dX��2�~])���z��'-]�k��ATR��:�tX��W��JӍ�Qu��9Q'�Щ���e�Hq!G^�FJ�|a-��B���Ӻ�ߑ�K��fM٦���p���wL�ZS�l����ZM��l�X_:���v�����ê>���na"���C��'�"�Y�K�k�e�&aE��X���X���0�k�uM�;5[a�c�ŏ�+��jɼ�q��$����,X=Ԭ��U�p���0��!�c�j��U�ƽB��U�>�8�.�zk���i��\g���e�Uh�L�S�]+�y������j��9�U�Nm?0���Q-��$p���iO_0���1�"�E�/�Է)�2p����V�
�dG����U�
W�ޡ��V�Ռ�D;p=�q*���[�������詍�cɎ��!}���l�>�IK\�R�}
��m�у1~@��M}�ѥ/���ٟ���[�M��v�k;k���ں3&���`g����<�j���^���,�!�u�,_�-]Iq���[���;�Ӷ�
k�Ua�~�?���F�k�}_�y���u��cmr]��oje�c��k��x��ϣ���n�oG�`Y#:e�V�b�?�ۗ�8M��ٳ�9d�Am������U6X�#��M0�m�2���{�z�>���<J�0"!�
��s��Pn��އ�Ԥ��Rڝ0��s%۱;�d�l�!p�P[~iۅ��7Y��}-���$�w����꺵vs�~m[�D��-wD_�e#/C�¬�K|�ݦ�#�������)��<�=���Vɝ��0t��S��= �_aK��6F%H�ӏ�')m��F�`kvŤݴ�K�;1;���Y��-�-�G��Z����m��8l�����:�/r��]�@ۯJݛ�u��;I�b]��h_7�m�.��Q�8Ҷ����G���:�?���0�w���t�GZ����nl<d+��'_M�T�'�����S�1���?�	3��$�_~qJ���Z���ӧ
�]Jk�Z�R���:�{���(<�<��
�I���&�ի�/���٤/��S�#�C��y)O�I�z��6���6E�
م�>?�g��d��DR�ioG�S����><�c��#<i`V�uB�H��ߺ���s��^�q�k����sl�T{��'o�V8G�u|DЩ~���f}���=N�Xo�~}S�=���N�3���Z�&6����9�lw�:O�j��$�{�U�
{�
J~`۟�F8�$�߶݁��Z}Ϋ����u�S���L��U�펎T�^�.l�NYY�O,,�����v�����\[��p?�� ���y:6�p�:\c���Mt�]��X���o'���{�N�qO�g����<u�-JGH����瞧+uV�8K�G_}'��SqE	��V�j�R��<"CP$!�70�j]�q����p�M��C��D_��`_71H��7vB�BV��>n�7���^`���_���ki���Cl!\2��˴=���4�h��!��W��Gܵ���|7�M��^2�
��A�n6�V`�V<9����.�����.Z��� =�
7�ob@<N'�s�8��@p/���@T��(;������_��~KK:��h�iX�OBHN��˙gbOIb�3g�1�x���fd�0,()���'I��v	μeG+�2e��I�W��u<(dKm&���>�.��7��s����u�Z�$+}���7Z�Nt٧�PV;�Ӌ�d�`�N8:&�¥�qh���c'��i���YlZ�����m�Z�_n�u������
<�]lK>�֩۬;�u����y���?�-���(�Bv�l�����L_�8w��qs7���9K�v>��)y$���"��	G˩�<��t&k�`�_�w���vq(��D���yg&H%�T��^���=���f�����l@o�l�2x^�b	��1����=�5����5D�Q�C?(��r��E���w5K/��H�5�A;>�`➃v���4#�sS��V$0��u���"��Z�`iK��}N]9 �lݖ�=9c�ob@�S�	��+��Š�?��i�R���~�g�_�G2t<�NO��Y��X�1�����
6�'�<��3�qy��oO��"]�Th��a��P9��w!i<����<��,�|T#���'�#�'�so#і)gd9�����N�_0��g0�~�ж~<��p�.��>�x��
�$�1�2��N����`_1�����	l}T
�vi��mlW�ȊJ�X�/Yz�=1�{�S��|�u�c�:�u]����|�Sق��:Ӕ�~)f����z;K���f�(X.���n�*���Z����	^�p��IL��a�)L���>ek�@����P\�7�����e1��z��!�3���1��qE1K?q���k��X^��<�Kq,�ZɳV���UG�|���q���ƫb��R�%r�Ub�X*~-�DX��籾��X��y�x���*�<Vq�汊�\,?�r�\)��UX�,��EX�r�� �x6k�f�ʳY�K�^��	r���޲B~)����LY-��Sd������(��#��<Ge���h�_�*/U���xf�<��gj��T^�sZ���kyN�/xN�u<���<����z��[�A��g��3[����?���{xf�<��>��z?�l}�g������Gxf�xf�c<��	���l}�g�>�3[��3[��3[��3[_晭����Y<��u��:[�J�(��o��]���P~��r���9r�^�ɏ��D��:_�G�џ�źX�\��To�>��g����+��_���<�<��F!��LXx�\Y��g@���g�|�st�
�\�J�{�\(�k��`�.EY���L������n�bAW=�<�M=l]<�=�/y����L�\�W�ɀk�6p�n���y��0j�;]�3��q�E�]����d���gSxVz
=���ف�ϗ(�g�� ���^�5}��m����d/F��!�a(y����k�x/���s�u���V�6
p��>�}�x_��}��������x�3���|\�;g8s���H��t�뼭�:�
Ӝ�g,YZO�9��f}z�3O3�(�F��s�Mpj�����O��5�_r�fg�mN�.�v�Y�H���m�S{Ω93\Ҳ��1mn�1�#�޶���L�7$i�̴m\s�b�U�q-AN�XN��J(!���W�Cb�Yb�!��,�������(�x�M\Ƶ+�A�d�v�S�<��<����O���Ju�*o��[��\���țPN�-���Ѽ�����߯
P��{�x�<�ϳ��}>~*oy��R�Q�����wY�
��-�5��MuU���
�����|��y�8���_�weZHWX��Lu޲�F@�;�}./��6���S�O��`����<�_LuXu�r��EbD&����.��	��sy˹t�x�������G�ENjOx��|�-|�-|䷹n_Ǿ�JYDu�n�v����t���u��o�]��
޲��2�1�W�����	�7�.������z�G�"��K�~\�d��̔,�#����B�9J���\�r�(�'S)Z�Yi��\�@�A����r _���|�:.��.����e.���,cT�eW.��k2��vɸ�H�p�̫9���풷���tM�����;x�oy�X�_�y����~��1�K-��py��߳�����v4b?�ry%�}���y/c$���*ΆG7#�s1Ƥ�s�c8����7�=�I�2�}q������B�X�D�T�LLW�kp�k�7M<,��E�Y�,���}m��S��rY	�J�_uP��W5+�4����:W/�y����	�J���P���uz�ޠ7��E�j�1�d�\H���F�ܕl8Yo��d��V�Js�Y�i�Av��4yd�)�6РW���h�=�usv{Xaΐ
��yI�H)B9�l��k�����i.����e�-.�q�����P<��>�>k���'s��l�sY��p����$����[\�-k�>)���%�V�\/�r��{	�v��GO�5��4k,ݕ˷�K���BΗ��a�1b����f�2�熙�c����"�������x1�w$�Z1U�"nw� e�C�&^��3��)s�����������c�o&��L���񓹜��\�固�R���R���AT�S�O�+�!K��f�-�r��'��Lv32:�Ȩ�N���I�!?�<����
A~E��*�����.�t;z���]�����Q�`դ'��^#�+tvfonts/raleway/Raleway-Bold.eot000064400000502104151215013460012334 0ustar00D����LP��[ P� �r�RalewayBoldVersion 4.026Raleway Bold FFTM�����|GDEF2�,����GPOS��k�\�GSUB���l�OS/2�gN�`cmap^-R���cvt ��)��fpgm��Z��gasp��glyf8�C�2� �head��,6hhea�d$hmtx�����locaN?��*@\maxp�\� nameB��JS,posta�1�a<#�prepO(�(���r�_<����^#�+tv�6�1h��O�6�1--in/��Qe��XK�X^27��P [NONE�
����� �� 
`2M�3W�=�%z"#�(�=6"5Y3�/�:�:�:�f1�,4&.;*_.1\,M �EG �>=�"M*��J��JYJ>J� �JJ��JHJaJ�J�oJ��Jek�@�����s<R}<.I'�6�/>z=4�Wrz\=�=��.==<�=\=^z=z�=��j8&	G&�=*O=278�1VP'!3(.�Q+�MI+�(�#d;[:I+�<(�;���/�M�#�:F* �$�:s � �����������YJYJYJYJJ������J������4��@�@�@�@�\J.=>>>>>>�4WWWW��=������e\=^^^^^�6^j8j8j8j8&Y=&�>�>�>�4�4�4�4�J���YJWYJWYJWYJWYJW� z� z� z� z�J\=�\�������������3�"J�=	J=�����J.=.=HJ=<HJ=<HJ=<HJ�<R��X���J\=�J\=�J\=\���J\=�^�^�^=��J�=�J�=�J�=e�e�e�e�k�k����@j8�@j8�@j8�@j8�@j8�@j8G�&�s�s�s��$�^�@j8?J�Js3JMJB<�JJa=� z�^4J�Js� z�>����^�>�>YJWYJW���������^�^�J��J�=�@j8�@j8e�k��^�^�^�&���W�=�=��/��qqQ�<�=�=QH!�2"?�n!//<!2M�!!22M=?!<2�&t=�YJYJ�L�eJ���L��L�O���J��L�JLYJ/]'�O�O�L�aJ�J��LoJ�k��;����J�<�JJ��JxL�$�J�7>n06=�=xWX�e=e=:=S�=[=^P=z=4�&�e=%.Z=�=j�==@#:=1!WWg���=A��=�����GU=f��:=e=&O=�
.��'r�]�H	W�E�M�SzCL�=0��J)=0h]'��L?=�Jq=�-�qAJ�=�J=XJ�=b)j0�4k��&	���"�?���<A.�<7.�J\=|��$�J/X�S+=�o�J[=%TE�<.�TE�=�>�>���YJW�W�W/X]'�`$����Oe=�Oe=�^�]�]�$@#��&��&��&�<%.L�=�J�=@���	R)�"�S�zG�T�C�T�F���f���o�4�J��J�YJWYJWYJW� z�J\=�J\=�����HJ=<HJ=(aJ�=�J\=�J\=�J\=�^�^�^�^�J�=�J���e�e�e�e�e�k�k��@j8�@j8GGG�&s���=�>�>�>�>���>�>�>�>�>�>�>�>YJWYJWYJWYJWY*WYJWYJWYJW3�J�=�^�^�^�^�^�^�^�^�^�^�^�^�@j8�@j8�@j8�@j8�@j8�@j8�@j8�&�&�&�&Z����d�:�:[:�:�:�8�6�:�8�5�:�#�*kMZ:�(�=�=f#f:�6����"�� ��L �����"�� �: a ,]&OJ~(�%!� ho
� 	�k)R$�@EI:�S+=>&`#� �� ��=^t� 3 >j���:�(e�5�K�2�C3�=�8�?�aI
� �=5{z�=?z{_8d
'�QTDQ zDD�Dl �DD�RD�D�D�D� (D� RD&�<S�@A2!��
:>J]'�]'�\B6zX�j8j8j8.=&
\=�=�8�8�728��=4�4n%�*�+`)I!J9$_.3"\,_(�L �����"�� ��M �����"�� ��* �����"�� ��:/("j��2!!!��9
�����d
~~��������-37Y����$(.15����_cku�)/	!%+/7;IS[io{������       " & 0 3 : D p y � � � � � � � � � �!!! !"!&!.!T!^""""""""+"H"`"e%�����
 ����������*07Y����#&.15����bjr�$. $*.6:BLZ^lx������         & 0 2 9 D p t � � � � � � � � � �!!! !"!&!.!S![""""""""+"H"`"d%��������������������l�j�e�a�S�Q�N�-�����������������������|��
�����������������~�x�t�����������z�x�r�p�n�f�b�Z�X�U�O�N�F�C�?�>�<�;�:�7�.�-�(��������������������������u�s�j�i�f�_�;�5��������s�W�@�=�����
	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abc��������������������������������Ztfgk\z�rm�xl����u��iy�����n~����ep�D��o]d���QRWXTU���<c|ab��[{VY^������������������s���|���@J������������~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSQPONMLKJIHGF(
	,�
C#Ce
-,�
C#C-,�C�Ce
-,�O+ �@QX!KRXED!!Y#!�@�%E�%Ead�cRXED!!YY-,�C�C-,KS#KQZX E�`D!!Y-,KTX E�`D!!Y-,KS#KQZX8!!Y-,KTX8!!Y-,�CTX�F+!!!!Y-,�CTX�G+!!!Y-,�CTX�H+!!!!Y-,�CTX�I+!!!Y-,# �P��d�%TX�@�%TX�C�Y�O+Y#�b+#!#XeY-,�!T`C-,�!T`C-, G�C �b�cW#�b�cWZX� `fYH-,�%�%�%S�5#x�%�%`� c  �%#bPX�!�`#  �%#bRX#!�a�!#! YY���`� c#!-,�B�#�Q�@�SZX�� �TX�C`BY�$�QX� �@�TX�C`B�$�TX� C`BKKRX�C`BY�@���TX�C`BY�@��c��TX�C`BY�@c��TX�C`BY�&�QX�@c��TX�@C`BY�@c��TX��C`BY�(�QX�@c��TX��C`BYYYYYYY�CTX@
@@	@
�CTX�@�	�
��CRX�@���	@��CRX�@��	@���CRX�@��	@�@�	YYY�@���U�@c��UZX�
�
YYYBBBBB-,E�N+#�O+ �@QX!KQX�%E�N+`Y#KQX�%E d�c�@SX�N+`!Y!YYD-, �P X#e#Y��pE�CK�CQZX�@�O+Y#�a&`+�X�C�Y#XeY#:-,�%Ic#F`�O+#�%�%I�%cV `�b`+�% F�F`� ca:-,��%�%>>��
#eB�#B�%�%??��#eB�#B��CTXE#E i�c#b  �@PXgfYa� c�@#a�#B�B!!Y-, E�N+D-,KQ�@O+P[X E�N+ ��D �@&aca�N+D!#!�E�N+ �#DDY-,KQ�@O+P[XE ��@ac`#!EY�N+D-,#E �E#a d�@Q�% �S#�@QZZ�@O+TZX�d#d#SX�@@�a ca cY�Yc�N+`D-,-,-,�
C#Ce
-,�
C#C-,�%cf�%� b`#b-,�%c� `f�%� b`#b-,�%cg�%� b`#b-,�%cf� `�%� b`#b-,#J�N+-,#J�N+-,#�J#Ed�%d�%ad�CRX! dY�N+#�PXeY-,#�J#Ed�%d�%ad�CRX! dY�N+#�PXeY-, �%J�N+�;-, �%J�N+�;-,�%�%��g+�;-,�%�%��h+�;-,�%F�%F`�%.�%�%�& �PX!�j�lY+�%F�%F`a��b � #:# #:-,�%G�%G`�%G��ca�%�%Ic#�%J��c Xb!Y�&F`�F�F`� ca-,�&�%�%�&�n+ � #:# #:-,# �TX!�%�N+��P `Y `` �QX!! �QX! fa�@#a�%P�%�%PZX �%a�SX!�Y!Y�TX fae#!!!�YYY�N+-,�%�%J�SX���#��Y�%F fa �&�&I�&�&�p+#ae� ` fa� ae-,�%F � �PX!�N+E#!Yae�%;-,�& �b �c�#a �]`+�%�� 9�X�]�&cV`+#!  F �N+#a#! � I�N+Y;-,�]�	%cV`+�%�%�&�m+�]%`+�%�%�%�%�o+�]�&cV`+ �RX�P+�%�%�%�%�%�q+�8�R�%�RZX�%�%I�%�%I` �@RX!�RX �TX�%�%�%�%I�8�%�%�%�%I�8YYYYY!!!!!-,�]�%cV`+�%�%�%�%�%�%�	%�%�n+�8�%�%�&�m+�%�%�&�m+�P+�%�%�%�q+�%�%�%�8 �%�%�%�q+`�%�%�%e�8�%�%` �@SX!�@a#�@a#���PX�@`#�@`#YY�%�%�&�8�%�%��8 �RX�%�%I�%�%I` �@RX!�RX�%�%�%�%�%�%I�8�%�%�%�%�
%�
%�%�q+�8�%�%�%�%�%�q+�8�%�%����8YYY!!!!!!!!-,�%�%��%�%� �PX!�e�hY+d�%�%�%�%I  c�% cQ�%T[X!!#! c�% ca �S+�c�%�%��%�&J�PXeY�& F#F�& F#F��#H�#H �#H�#H �#H�#H#�#8�	#8��Y-,#
�c#�c`d�@cPX�8<Y-,�%�	%�	%�&�v+#�TXY�%�&�w+�%�&�%�&�v+�TXY�w+-,�%�
%�
%�&�v+��TXY�%�&�w+�%�&�%�&�v+�w+-,�%�
%�
%�&�v+���%�&�w+�%�&�%�&�v+�TXY�w+-,�%�%�%�	&�v+�&�&�%�&�w+�%�&�%�&�v+�w+-,�%�%J�%�%J�%�&J�&�&J�&c��ca-,�]%`+�&�&�
%9�%9�
%�
%�	%�|+�P�%�%�
%�|+�PTX�%�%��%�%�
%�	%��%�%�%�%��%�%�%����v+�%�%�%�
%�w+�
%�%�%����v+�%�%�
%�%�w+Y�
%F�
%F`�%F�%F`�%�%�%�%�& �PX!�j�lY+�%�%�	%�	%�	& �PX!�j�lY+#�
%F�
%F`a� c#�%F�%F`a� c�%TXY�
& �%:�&�&�& �:�&TXY�& �%:��# #:-,#�TX�@�@�Y��TX�@�@�Y�}+-,��
��TX�@�@�Y�}+-,�TX�@�@�Y
�}+-,�&�&
�&�&
�}+-, F#F�
C�C�c#ba-,�	+�%.�%}Ű%�%�% �PX!�j�lY+�%�%�% �PX!�j�lY+�%�%�%�
%�o+�%�%�& �PX!�f�hY+�%�%�& �PX!�f�hY+TX}�%�%Ű%�%Ű&!�&!�&�%�%�&�o+Y�CTX}�%��+�%��+  ia�C#a�`` ia� a �&�&��8��a iaa�8!!!!Y-,KR�CSZX# <<!!Y-,#�%�%SX �%X<9Y�`���Y!!!-,�%G�%GT�  �`� �a��+-,�%G�%GT# �a# �&  �`�&��+����+-,�CTX�KS�&KQZX
8
!!Y!!!!Y-,��+X�KS�&KQZX
8
!!Y!!!!Y-, �CT�#�h#x!�C�^#y!�C#�  \X!!!��MY�� � �#�cVX�cVX!!!��0Y!Y��b \X!!!��Y#��b \X!!!��Y��a���#!-, �CT�#��#x!�C�w#y!�C��  \X!!!�gY�� � �#�cVX�cVX�&�[�&�&�&!!!!�8�#Y!Y�&#��b \X�\�Z#!#!�Y���b \X!!#!�Y�&�a���#!-@�?4>U>U=(�<(�;'�:'�9'�8&�7%�6%�5$�4$d3#�2#�1"�0"�/!�. �-�,�+�*�)�!� �����@�[@�[@�[@�[@�ZKUKUYY
KUKUYY2UK
UKU2UYp
YY?_����Y?O_�	dUdUYY_�@@���T+K��RK�	P[���%S���@QZ���UZ[X��Y���BK��SX�BY�CQX��YBs++++s+s++s+++++++++++++++++++++++++++++++++++++++++++++++�
�;�������+���
��'%(����J�222222Pj�6�0Rv�����Jx�:|��V���:�$b�� Ff���		:	R	z	�	�

`
�
�>\���0Hbr��
6
r
�H���"Hl��*v��8l���&Vz���$$>��P��08�@Vf��:z��Tdl������$6J�������� Zl~�����$6HZ���&8L���.>N^p���$6\����   Z l ~ � � � � � � � �!! !2!D!T!f!z!�""("8"J"\"n"�"�"�"�"�"�"�"�###&#:#L#^#p#�#�#�#�$$ $2$B$N$`$r$�$�$�$�$�$�$�%
%%.%B%V%b%v%�%�%�%�&&&&&:&L&^&p&�&�'''"'4'F'X'�(*(<(L(`(t(�(�(�(�(�(�(�(�)))").)@)L)t)�)�)�)�)�***,*@*R*d*p*|*�*�*�*�*�*�*�+++0+@+�+�+�+�,,$,�,�-^-j-v-�-�-�-�-�-�-�-�-�-�...*.�.�.�.�.�.�///,/</N/`/r/�/�/�/�/�/�/�000$060H0X0j0|0�0�0�0�0�0�1
1"1:1R1j1�1�1�1�222"2*2>2^2~2�2�2�2�2�2�2�2�2�333<3D3X3l3�3�3�3�444D4r4�4�4�4�55&565N5d5�5�5�5�5�66b6�6�6�6�7<7N7�7�7�7�7�88L8�8�8�8�8�8�99929j9r9�::$:6:`:�:�:�:�:�:�:�:�;;T;\;�;�;�;�<4<p<�<�=<=x=�=�>>(>\>d>�>�???B?l?�?�?�?�?�?�@@2@�@�@�@�AA*A^A�A�BBXB�B�B�CCCXC`ChCtC|C�DD<DND`DpD�D�E
E@ErEzE�E�E�E�FF<FtF�GG(G@GdG�G�H
HVH�H�II<IpI�I�J
J>JpJ�J�J�J�K$KhK�L.L�L�M M4MHMPMpM�M�NN>NpN�N�N�N�OO<ODO�PP~P�P�QQQ^Q�Q�Q�Q�Q�Q�RR@RrR�R�R�R�R�R�R�R�R�S
SS"S*S<SNS`SrS�S�S�TT*T:TLT^TpT�T�UU0UBUTUfUxU�U�U�U�U�U�U�VVV*V<VzV�V�W<WnW�W�XHXTX`XhXpXxX�X�X�X�X�X�X�X�YY&Y<YPYdYxY�Y�Y�Y�Y�ZZZ*Z:ZFZZZfZzZ�Z�Z�Z�Z�Z�[[[&[8[L[`[t[�[�[�[�[�\\\2\J\^\r\�\�\�\�\�\�\�]].]F]b]~]�]�]�]�]�]�^^0^B^T^f^x^�^�^�^�^�^�^�_b_n_�_�_�_�_�_�_�```0`D`Z`v`�`�`�`�`�`�aaa,aHa\apa�a�a�a�a�a�a�bbb,b@bTbpb�b�b�b�b�b�ccc"c6cJc^crc�c�c�c�c�c�ddd0dBdTdddvd�d�d�d�d�d�d�e
ee.e@eRebete�e�e�e�e�e�e�fff"f2f2f2f2f2f2f2f2f:fJfZfjfrf�f�f�f�f�gg.gZg|g�hPhbhnh�h�h�ii.iri�i�j<j�j�j�k0k|k�k�l6lLl�l�mVm~m�nn�oo�o�pp:p�p�q>q�q�q�r4rtr�r�sNs�s�t:t|t�u&u6uFuVufu�vv*vLvxv�v�v�v�wDwxw�w�x xFxnx�x�yyjy�zRz�{ {n{~{�|$|p|�|�|�}}P}|}�~(~`~�~�6R�����(�N�n���ށ*�`���ʁ���F�l�����ڂ��J�R�Z�b�n�v�Ą��X�������Ƅ΄��:���܆�L�l�t�|���؇�F���ވ�N�����*�~�����������������ƉΊ�6�t����*�x����:�z����.�V�����d�����Ҏ��:�T�x�������Џ܏�����$�0�H2.�%#!"&543!24#!"3!27.!�@�4��

a�i4�
���8��
��iW��@
rr++23/01353W����>����=�L���?3�20153353=r+r�����%��?@		?3?399//333333333301#3##7##7#537#537337337#�� ��.l/x-l.p�!z�/l0x.l/z�� w!��d����d�^����牉"��S/>@@ .26:!
::++!!	?3/33332?3/33333901%3#773.#"#".'732654.'.54>32 CC	09CC�%5> 89$H6Fg7*J_45ka)=	.AO(8:.S7DZ,FvH2YN@��#���
t*&"1OA9Q2)w	&# $/H6Ic3$#����/?E)@@EE8((0 	rCBBr+22/32/3+22/32/301".54>32'2>54.#"".54>32'2>54.#"		�.J--J..K,,K.    �.J--J..K,,K. !! �%=����)E**E((E**E)C&&&'�(E*+D))D**E)C&&'&
IV6����(����<@,;	$	r3	r?+2+2901!.54>3232>53#".54>7>54&#"��*33Y72U6/N1$;! 9#+Q@%m:b|CIl;4P(,< %!+&�b-A63M*#F4/L@,10*MlC_�g6;`88TA''!-)�W=�����?�0153=r���"����
//01467."V?f+)E6b)E([e�j+Rgn3P�]1?������//01'>54.'7(D*b7D)*g>V[C��?1]�P3ngR+j�3�%� @
		�?�2923017'7'37'K/GIGHF/4-.G:MM:G"KK/�v
�	/3333301##5#5353vgyggy�lqqlqq:������/�99017#53I*t)sw��w:�iO�/20175!:/�yy:��
�r+201353:n�����rr++01	#�����:�1��5U�r
r+2+201#".54>324.#"32>5CuJJuCCuJJuC�8$%88%$7 %X�NN�XX�OO�X6Q..Q66P..Q,�;@
rr+23+22/301%!53#52>73�j�	&0033%�yyy/} 	�>&E)@
r'r+2+2990134>7>54.#"'>32!&#=/)>+()#U/AO-D`3(/2&1-H>7!!b!+L3#6) y�m@.@'r/3+29/3301%#"&'732654&+532654.#"'>32}*>#@uOLu'LI5=@JK=E--JTI_4Dg: 9�1L.>\31/_ %1148d8*$*&^-,P5'F/��;

@
		r/+9/9333015!533#358��O[XX�ܭ�w��Sx�
��k;"@
r/2+29/301"&'732>54.#"#!#>32M| MT-$7 4!!9uR^�
."Cj<Dv�B9P'.6##4�z�:gCGm<.��7�.@'
r/3+9/3301%4.#">327.#"32>".54>327ApG!:,$B-,LM'qCT|C@uPJuE��"<$#<$$;$$<�Ck?#@[0+%T6:[��f�NBpA%=$$;##;$$=%��2G�r+2/01!5!#_������z�:,��0�!3C@''88@0
r+2/39/39901%#".54>7.54>324.#"32>32>54.#"0GvFGuE"3)*FS)(TF+)4 �$, 7"#+ 8"�/--.�Bb7:eA(A/
(4/J32I05)0B!'0 '0A&%$% �f);.@
'r/3+29/30132>7#"&'32>54.#"%2#".54> AqE"9-
%A-,MM'rCT|C@uQIvD#<$$;$$<#$<DCk?$@[0+%T6:\��g�NBpA%=$$;##;$%<%E��
rr+2+2015353Emmmv������G���
@
	?3?3/3301537#53Hn`*u)v���w��w ���@	/3/3901% ���Z ������>�w��/3�20175!%5!>9��9�WW�WW=���@	/3/3901%57'5�Z���������"��$(@
&&%
r+2?33/0174>7>54.#"'>3253z
$!-*+. W?S-&J<$(5#lo� 90	+&$<):0J4 2' )"銊*�n[Uh)@^'1
fEL '�;/2�2|/3�22/339/3012#".'#"&54>324.#"'>3232>54.#"3267#".54>>=.#"326�J�i<!9+$'X3JO7W-(:2-)D%W0AJ!	".VuHFvU/,QrF/H%)Y,K�c9>j�|
<&0$0[1a�\:B;&&%O=7?$8G'?I"`4 '<=FwX0/VuECuX246d�TY�_2��	&$!
��
D@'	
		
	

rr++29/33399<<<<013#'##��B�A��bf�:��%��J��&@rr+2+29/3901%#!!24.+32>32>54.#�>i>��|2I'42=G�%��)�ٸ&#�<Q*�5S-3\^++�*��((����$@ 	r	
r+2�2+2�2014>32.#"32>7#"./Z�Sb�#j:B 4M47M.!D:q_v:L~[3hA}g=VEI(/*DT*/WC'0&A5J&?i�J��
@	rr++23013!2#4.+32>Jt�NV�k�2^CxxD^1�_�bl�XdEi;�,=kJ7�@


rr++29/3301%!!!!!7��+��yy�y�p�J'�	@rr++29/3013!!!!J�����y�p�� ���� &@#""
%r
r	r+++39/3201".54>32.#"3267#5!#qE{]44^~Jd�$ga9-J69L.6c+YO�r8c�MI�b8UFL58&BV03V@%86�`
e��J��@
	rr++9/32301#!#3!������B�:/����J���rr++0133J��:�����
r	r++301732>53#"&'&
B-'2	�4iW0L �	6V<t��P�`4J��@
	rr+2+2901333	#J�*���!��Z��R��u2^�J>��rr++30133!J�j��yJ�@	rr+2+2901!##33��M����ԓ��[�.�l��:J��	@r	r+2+29901#33#Ԋno�s�8�,�;����'@	#
r	r++2301".54>3232>54.#"yN[25]LMZ24]��5M12N45M03M4<g�DG�e;>h�DF�e:h.VC')EU+.UC')DTJY�
@rr++29/3013!2+32>54.+J-1R="8bC��(+��(DT,<lD�g5"%4����'+@

*r
r	r+++3301".54>32'2>54.#"73#yN[25]LMZ24]J2N45M03M45M#��=f�DG�e;>h�DF�e:z)EU+.VB()ET,.VB(���J��@
r
r+2+29/33013!2#'#32>54.+J:1S=!:'�����(+��(DT,-S>����g4 "3��G�2@*".r	r+2+29901.#"#".'732654.'.54>32�%5> 89$H6Fg7*J^55jb)=	.BN(8:.R8CZ,EvH2YN*&"1OA9Q2)w	&# $/H6Ic3$]�@	rr++2301###5!]��OM��My@����@	
r	r++3201".5332>53wUwI"�(B12C'�#Kv9dEj��,SB&'BS+j��I�a7��@	rr++29013#���������"�:��$@
r

r+2+2/2/29013733##37=�QRzZɖ��w}|w���X����'�:*���������@
	r	r+2+29013#'#����������������^h��@rr++29013#5�����������N�2���Q�	@	rr+23+23017!5!!!��%�����h�yh�yR��
��//32013#3R�??(k��kc��rr++01#����L�:�.�����//320153#53.@@�(k6k��'/"��r+2�2013#'�p�n��/��i&��6����/3015!6oyyy/I����/�9013/|7V�w��'8+@!66$/$r
rr+223+2+9/3330174>3254&#"'>32#"&/#".%>=.#"3269fB!D;:+N++4m<p}
()"f54S/F84C*:�3M*
26X""ph�m$,0+K
5
-%$=��\�'@rr
rr+2+++201"&'#3>32'2>54.#"g<^u�[=3T=!%BYZ 5'#=)5)$'
6/[��/6+Lb88bK)r*9+I,.} 
�� @		rr++2301".54>32.#"32>71@fH'C|UUz�8"&?$%>&+"�E]
+Mb6J{JJ<('G/.G)('>#��]�/@+!
rrrr++++332014>323#"&/#".5.#"32><jD:]�#$/c66[C%�
,62%(5'#L{H9,*��m$!14*Jc
}.,:  9*
!��B%!@i"	rr+2+29/]3901".54>32!3267!.#"0?fH'C}UVzA�k'=#(G
sG`�%<%$;%
+Ka6K|KK{G(<'  (>#:(;!!;��@
	r
r++2|?333013#5354>32.#"3#]EE+O5 A ("$���f A_4e0.%f�v�!>"6!@#-
rr
rr++++33301".54>3253#"&'732>='2>75.#"
4W?"$AY6=\uK�TUv*I[3+G+_("+52$'5)J`69bK)7.\�
No;94G%*A3B-1k!}./9 8*=$�@	rr
r+2++29901!#4&#"#3>32$�/)6+
��d;3@$&=<1 ����28#;I'=���
??�2013353=�����U�����<���
r/2+�201"&'732>5353%D: �1Q��[
��8X0��=2�@
	rr
r+2++901!'#373��G��ӎ���F��F���<��@��rr++20133267#"&5<�"
H?E��$f
C>=k$%@rr

r+22++293301!#4&#"#4&#"#3>32>32k�+&'G�+&'G�ydAAI
 c>1="
&>;=1��&?:<1��a37@/69#;J&=$@	rr
r+2++29901!#4&#"#3>32$�,'7,
�y>Q-1?!
&?:1 ��a"/#;J&��A#@	 
rr++2301".54>3232>54.#"/@fG&&Gf@@eH%%Gf�$>'&>%%>&'>$
+Lb67bL++Lb76bL+.G()G.-H()G=�+\'"@$#rrrr+2+++2901"&'#3>32'2>54.#"w=]�u\;5YB%;gp2%(5'$)6
7/���Z.5*Ka8L|Ir-9!8+
 {0�+=&"@rr

rr+2+29++01".54>3253#'2>75.#"2T>!%BZ4<\u�<F/'%*3&$@
+Jd89bJ)7-[�1fr'|&-9 +F*=u@
r
r++?33301"#3>7:u=`�{V0�/,��p6>���+@
rr+2+29901"&'732654.'.54>32.#"�Cz,0/[*'/1#:N'5_@8d)6(H%%+?W,r
,+W&$
$7+4K*#'U

&70NX��w�@

rr+2+2�3301%#".5#53533#3267w07%>%EE�nn(9.-g��g�8��B@
r
rr+2+2+299017332>73#"&/#"&8�,+3+�$-#nBQT�H��<=* E��m!*57i	@	r
r++2901333������n���F @	

r
r+2+2229013#'#37'373��pXVq�~�=[o67o[>�����t�ࠠ�@

r
r+2+2901?3#/#�n
m����q	p������������@	
r+2?3990132>733#"&'H
ϋ�|��1I- f1,�}���#9!�	@	
rr+23+23017!5!!!!�����$�JR\^R��^*����//33013#"&=4&'52>=46;�7�
�y�#
%�k�%^�kO�~��//013Or���w2����//33015323+535467.=2�
�7yk�^%�k�%
#�8�h�
�	/33�220174>3232>53#".#"8 5($96J!7)$;4	�+/"(1#V����
�
?/�201##5܆����>���'��+�)'@%%

$$?3/333?3/333015.54>753.'>7#3W@#7jL<Fr �.$�NW#�,%
xo0L[0DtOqqD?(��(-=nz ;,
(*33����:'@%::(77,3	rr+2+29/3232/3301!!>54.54>32.#">323267#".#"9y��$/ 7^9<n%FN%&&%-,#!>=> F }e�=@%A?@#2Q/81R",&59D(89 	d
	.p�7"2�'//3/301>327'#"&''7&5467'732>54.#"�65E7DE2H6 7I1ED6S+))+�G7C77D2D
E2E0:6E7�././��.@

r
?+29/93�22333013#3##5#535'#5333�Ix$�����"xJ������WCW��W AW4��VQ�~��//9/�01##�rrr�v���v�+����?R!@F=I@MP8 
1'r/3+2901%#".'732>54.#.5467.54>32.#"%>54.#"&'�+DL#(D7)V<!)%B\1
9`:+D4%g	&&1#%L@&�� %#
		& 	�2&7L0!$R	.L3$	9'4V4&+1$'?/,b
��M\|��+���'L@
:2
rD(`	r+2�2+2�201".54>32'2>54.#"7".54>32.#"32>7�P�e88e�PR�h88h�REuY10XvFCtV0/WsM7[B$>\=Np
")!(#	<W6b�NM�a66a�MN�b65-RqDApT//ToB@pU/K#@U2,TC'D:'
",.
&!;$(S��#2+@*-!')$�@�?3�29/93332/301"&5463254&#"'632#"&/'2676=.#"�2FTB1"%&4EPNV
	B	'#!*!SA15B!%=/LJh
U"H'#.N�
$@
	/333/393301%-%#����$���� �mmgn�A�mmgn�;j#�
�/�301#5!5#r����ڮx:�"O�/20175!:��yy+���&6?%@?0446>'
r26`	r+2�2+2�29/3301".54>32'2>54.#"32#'##72654&+�R�e88e�RQ�f99f�QZ�U0VuEEsV..Vs]�)?$$gk\@_�!Z6b�NM�a66a�MN�b64O�ZApU//Tp@AqT0,C$3'
����#! ���<yh��(���	r+2�2014632#"&7327>54&'.#"(;+-::-+;K


q*99*0:<E

;�-@	/3�2/3333/0175!##5#5353;buxuuxll�kk�0"@B D?2�29014>7>54&#"'>32390?*/(/#32L/RT).!(��5G2
"!: G;"/
Nu0,@
&BD?2�29/3301"&'732654&+532654&#"'>32�=\*!1 '9AB::4'916B 2J+.(,42Q('6
H<5"".=)(6��/I���M�,\!@ 	rrr+2+2+299/01332>73#"&/#".'#M�,.2,�%-2A$&	���<=* E��r$&3"��#��c�#@

r+233/39/33301463!####".7%#3#��&Fq3rEg8p5 7=33�y�d�N �� >pM.A%.RU��:����/�01753:n����7� �0@	

BD?33�22301#53#52>53�N '+Q�OO	O��$S����@�?3�201".54>32'32>54.#"�:T,,T::S-,T�'''(S4V12U44U21V4�//-/:.e�
$@

	/333/393301%57'5
57'5e���������߱ngmm�A�ngmm��� ��X�&'c*	� ��l�"392@76613&&%%1499 r+22/392/3/9/333/301!4>7>54&#"'>323#53#52>53		70=).'/"1
2J/OS(, (���N '+Qn=���5F3
#!
:!F<!/ 
N�NNP����IV6����������&'c�	F�+��$(@	$$''(
?3?33/0132>7#".54>7>57#5h"",++-"
W?S.%J<$'3#ln 9/	+'%<):0J4 2' )"銊����&&����/�01����&&����/�01����&&����/�01����&&�v��/�01����&&�l�
�/��01����&&����/�/301����-@


rr+23+99//333301!!!!!!5##������V�"�i�՟�y�y�y��)�����7��&(����J7�&*����/�01��J7�&*����/�01��J7�&*����/�01��J7�&*�a�
�/��01����&.�����/�01��J�&.�6��/�01����)�&.�����
/�01����&�&.����
�/��01��@rr+2+29/3015!!2#4.+32>E��t�NV�k�2^CxxD^13dd���_�bl�XdEi;�,=k��J��&3����/�01������&4����+
/�01������&4�#��(
/�01������&4����.
/�01������&4����(
/�01������&4���
�,(
/��014Y��&@
		/33/33392301%''7'77�TggSfbTbcSb�SggTfcSbcTc������&4��@����&:����/�01��@����&:���/�01��@����&:���� /�01��@����&:���
�/��01����&>����	/�01JH�@



rr++99//33012+#32>54.+f1S=!7cB����(,�F)CT,<lDnƀ��5"3�=���-@%		-r
r+/3+29/33017>54.+532>54.#"#4>32�>Q!3#$&:d@8X3'AJ.Of8u47"1x!
 .�

8W1(I3">+	fH9R3�����&F�e�</�01�����&F���9/�01�����&F�X�?/�01�����&F�5�9/�01�����&F�,
�=9/��01�����&F���KBB/�/301���7IR/@NR%C%%r)118r+223+299//332301".54>32>7.#"'632>32!3267#"&'726767.'.#"%.#"�3Q/9eA >:5*P+)hs>\!_:U{C�f)?%(G
sG`:Js$IQ!>34C)2%<&&=$
+L/2L+


,/UC&$"(K{I
(<'  (>#;1&0b
%	.%%�(<""<(���7&H������B�&J���)	/�01����B�&J���&	/�01����B�&J�v�,	/�01����B�&J�J
�*&	/��01����&����/�01��=	�&��'�/�01�����&����
/�01�����&���
�/��01��D�+3"@(/0.-12,3 ?3?9/9301#".54>32.'332>54.#"'?D)Ke<L|H%CW34[
*FgH�CcA�e#>'(>$$='(>$eo*q'q&s"FoN)@nE2VB%+#/YSO&#ew}t%;"$=$%9!";�=
@4?
B��=$�&S�b�/�01����A�&T���'
/�01����A�&T���$
/�01����A�&T�v�*
/�01����A�&T�T�$
/�01����A�&T�J
�($
/��0160�#@
		/3/333/2015353%5!�qqq�����������kk��A#'+/&@+-,*%&)(//
r''r+22/+22/901".54>32'2>54.#"77'7'73/@fG&&Gf@@eH%%Gf@&>%%>&'>$$>�g8IS1�7?AX
+Lb67bL++Lb76bL+r)G.-H()G..G(l)Vb$4 O��8��B�&Z���!/�01��8��B�&Z���/�01��8��B�&Z�t�$/�01��8��B�&Z�H
�"/��01����&^���/�01=�+>�'@rr
r#r+2+++201#"&'#3>324.#"32>>)H_6-:
��
93;^C#�8'*  '/#7eN."���%2Rd1+I,$�-:����&^�:
�/��01����&&����/�01�����&F�@�9/�01����&&����/�01�����&F�l�@/�01���8��&&�����8&F�>������&(�$��%/�01�����&H���!	/�01������&(����+/�01�����&H�w�'	/�01������&(���%/�01�����&H���!	/�01������&(����*/�01�����&H�w�&	/�01��J��&)����/�01�����&I*�2V+4��@rr+2+29/3015!!2#4.+32>E��t�NV�k�2^CxxD^13dd���_�bl�XdEi;�,=k��}�3(@ !/r
rr%r+2�2++2+29015!4>323#"&/#".5.#"32>T)��<jD:]�#$/c66[C%�
,62%(5'#UOO��L{H9,*��m$!14*Jc
}.,:  9*
!��J7�&*�u��/�01����B�&J�^�&	/�01��J7�&*����/�01����B�&J���-	/�01��J7�&*����/�01����B�&J���&	/�01��J�87�&*�X���8B&J����J7�&*����/�01����B�&J�v�+	/�01�� ����&,����-
/�01���!>�&L���=
/�01�� ����&,����.
/�01���!>�&L���>
/�01�� ����&,���'
/�01���!>�&L���7
/�01�� �+��&,���*��İV+4���!>�&L���;
/�01��J��&-����/�01��=$�&M����/�01��!@


r
r+2+29/33/3015!'#!#3!�2�����BLL��:/����$�@
	rr
r+2++2�299015!#4&#"#3>32)�/)6+
��d;3@$UOO��&=<1 ����28#;I'����K�&.�����/�01����<�&����
/�01����&�&.�����/�01�����&����/�01���&.�����/�01�����&����/�01��3�8��&.����"�8��&N���V+4��J��&.� ��/�01=��r
r++0133=���J����&./��=�<��&NO������&/����	/�01�����<�&����/�01��J�+��&0�����ΰV+4��=�+2�&P�����ΰV+4=2@
	r
r+2+2901!'#373��H��ҏ���G������J>�&1�6��/�01��<��@�&Q�&��/�01��J�+>�&1���	��ΰV+4��<�+@�&Q�E���ӰV+4��J>�&19��<����&Q��V+4��J>�&1{3Y��<��|�&Q{���V+4��G�	@
rr+22/3+2/3017'%3!!M!��j�I�I�<��y����X�@
	rr+23+22301'%33267#"&5!"1"��!
H?E
H�H��$f
C>��J��&3�%��
/�01��=$�&S���/�01��J�+��&3��
��ΰV+4��=�+$&S�����ΰV+4��J��&3����/�01��=$�&S���/�01����$�&S,�.�/�01J�<��@
rr++2/3901#33#"&'732>=Ԋjf�1T1%E: �=�4�28T/[
*=�<#%@rr
r/2+++29901"&'732>54&#"#3>32n&D9 ,'7,
�y>Q-1?!1R�[
4?:1 ��a"/#;J&��8X0������&4����(
/�01����A�&T�^�$
/�01������&4����/
/�01����A�&T���+
/�01������&4���
�,(
/��01����A�&T��
�($
/��01���2%@r)r	rr+2+2+29/3+201%!5#".54>325!!!!2>54.#"� ?L+K|Z03\{I,K=����0J23J./J24Jyyi 1<g�DG�e;1hy�y�)EU,.UB()ET,.VB(���*:C%@C?3r##+r+223+2239/301".54>32>32!3267#".''2>54.#"%.#"-N|GG|N-M>&hDNyF�l'?&*G
oI_6)KBAG('>$$=('>$#?M'<%%;$
GzNN{G7'==D{P
%=$*  )?!5&'5r)G-.G))H.-F)�(<""<(��J��&7����/�01��=u�&W��/�01��J�+��&7�����ΰV+4��=�+u&W����ΰV+4��J��&7����!/�01��=u�&W��/�01����G�&8����3./�01������&X���,/�01����G�&8����9./�01������&X�F�2/�01���7G�&8�����7�&X�]����G�&8����8./�01������&X�F�1/�01���7]�&9�����7w�&Y�@��]�&9����
/�01������&Y�i�@		

rr++9/333015!###5!I�.��O#KK*��My��x�@

r+2?�3333/30175!#".5#53533#3267 %307%>%EE�nn(�PP�9.-g��g���@����&:����/�01��8��B�&Z�Q�/�01��@����&:����/�01��8��B�&Z�\�/�01��@����&:����!/�01��8��B�&Z���%/�01��@����&:����,##/�/301��8��B�&Z���0''/�/301��@����&:���
�/��01��8��B�&Z��
�"/��01��@�;��&:����8�8B&Z�b���&<�U��/�01��F�&\���/�01����&>����/�01����&^�f	�/�01����&>�e�
�
	/��01��Q�&?����
/�01����&_���
/�01��Q�&?����
/�01����&_���
/�01��Q�&?����/�01����&_�A�/�01���� )@&&r!	r+2+29/301".5467!.#"'>32'2>7!qO]2#6C%&E3
�\zFM}\11[~M4S4�y7W;d}A
+G21!/8R/<eDH�e<y-P43P.�<�&@
"r/2+29/33301"&'732>5#5354>32.#"3#�%E: DD+O5 B)"$��2R�[
vgAA_4e0.Fg��6T/�����&4����(#V+4����Ad&T�6���$ V+4��@��$&:�%��V+4��8���d&Z�����V+4J�	&3@r
	#""!& �%r+23��2923?33?3+201%!5!!)!2#4.+32>7#'���%�����`t�NV�k�2^CxxD^1�UUFk`kh�yh�y�_�bl�XdEi;�,=kr?? eeJ��
&3@#""!& �%rr?2+2+23��2923?33013!2#4.+32>!5!!!7#'Jt�NV�k�2^CxxD^1�!�����$�J�UUFk`k�_�bl�XdEi;�,=k�\^R��^�?? ee��U�/9@A@$0669
=<<;@:�?23r+r

!r+2??3+29+2��2923?33014>323#"&/#".5.#"32>!5!!!7#'<jD:]�#$/c66[C%�
,62%(5'#� �����$�K�UUFjajL{H9,*��m$!14*Jc
}.,:  9*
![\^R��^�?? ee��J����&1/H��J�<�&1OH��<�<�&QO=��J����&3/���J�<��&3O���=�<$�&SO\�� ����&,����,
/�01���!>�&L���<
/�01���>��&4�����8A&T����J�&)?���J��&)_�����U�&I_��� ����&,x��'
/�01���!=�&L�x��7
/�01��&Q@,
	

	

			!
?3333332??9/333//9<<<<01'733#'##4632#"&7"32654&rV6}�B�A��bf://:://:i#l�:��%���*11*(11T�����&F'������QKBB/�/3301������&����/�01������&��x�S/�01������&4&�#��,
/�01����A�&����0
/�01����&&���
�/��01�����&F�A
�<@/��01����&&����/�01�����&F�l�=/�01��J7�&*�w�
�/��01����B�&J�_
�)-	/��01��J7�&*����/�01����B�&J���*	/�01�����&.����
�/��01������&���
�/��01���&.�����/�01�����&����/�01������&4���
�+/
/��01����A�&T�_
�'+
/��01������&4����,
/�01����A�&T���(
/�01��J��&7�j�
�#/��01��u�&W�
�/��01��J��&7���� /�01��=u�&W�3�/�01��@����&:���
�!/��01��8��B�&Z�]
�!%/��01��@����&:����/�01��8��B�&Z���"/�01���+G�&8���6��ӰV+4���+�&X���/��ذV+4���+]�&9�����ΰV+4���+w�&Y�i���ӰV+4�����J&4'�����~�0�,,(
/��/�01����A�&T&�J�^��,�(($
/��/�01�����S&4'�������D�((
/�/�01����A�&T&�T�^��@�$$
/�/�01�����S&4'�
�����,@((
/�/�01����A�&T'���^��(�$$
/�/�01����&>�y��	/�01����&^�N�/�01���<��
r/+301"&'732>53
%E9 �2Q�[
��8X0��;%@""rr+2+29/301".'467!.#"'>32'2>7!)V{B�(<#)G
rF`:@fG'B{T%9%��'<
K|H
);'  (>#+Jb7J|Ka"<((<"��=���_��=���`��G���/I����/�901'73�V6}Iw5��
��/3�20152654&#52/::5//1*)15��
�
�/3�201"&5463"3�.;;.51)*1/��US����US��Q}��//01#�r�v�<yh��/3015!<,ySS=���
��/�0153=r#���=���
��/�01'3_"r���Q�~��//01#�r�v���!T'����2\�����5�����?�8��W����/22�2201".#"#4>3232>53+$J-!(%J/Z	*- (/"��!IZ��/I����/�3013/|7V�w/I����/2�01'73�V6}IwUS���/3�9330173'jajEUUuee ??W��@
�/2/2�22/01".#"#4>3232>53+$J-!(%J/Z	*- (/"<yh��/2015!<,ySS!T'�
�
�/3�2012673#"&53�"GI:9JH$�* :LL:,2\���/�01532y\~~M\|��/2�20153353MoQo\wwww�T��
�/3�201'>32'>54&#")1(+!"

�)+0%
5����	/3�2014632#"&7"32654&;./::/.;i�*11*)11U!IZ���/2�23301'73'73cB0hJA/iIw�wUS���/�2923017#'dUUEjaj�?? eeIL���/333�2013'3�i/B�h0B�w�w!T'�
��/3�201"#4632#.�$HJ9:IG"�,:LL: *G����/�99013#57�'q(�?TT?2�����/2�017267>732#*a3?�\!.+2�9����/�01532y�~~M�9|���/3320153353MoQo�wwww=�+�����/�9017#53I'q(�H^^H�7�
/3�201"&'732654&'7�>"-(49�G
%=,*9?�8���/3�2014673.?24*%&'$2;n"D+L&!�E'��
��
/3�2012673#"&53�"GI:9JH$* :LL:,<�]h���/3015!<,�SS2�WL�/30175!2%�PPy�@
rr+222+201!5!����pR���hh^���&��-#@"r,,r+223333+201353.54>323!5>54.#"&�0E&2]|HI|\3&F0���%;*5L//K6+;%fQf:D|a88a|D:fQff
7JS+)O@&&@O)+SJ7
f=�,L!#@ 
r
rrr++2+2+2901332>73#"&/#".'=�,.2,�%-2A$&���<=* E��r$&3"����o
@rr
r++233+201##5!#3267#"&5�K7`G=E��j�tt� f
C>��J7����J7�&�la�
�/��01����#!@rr	r+2++239/301"&'732654.#"##5!!>32�9"!5F%>'(V'��)��*`3In<�		k	9@+9��Quu�:iHpw��L�&�����/�01����'@
r	r+2+29/3901".54>32.#"!!32>7{O�\1.Z�Vd�$k:E!+E3��"7G)"F;qaw>i�DB~f<VEI(/0>$n(F40&A5J&����G�8��J��.����&�&.l���������/����&#@&		rr++29/3333015>?!32#!#%32>54.+%5#�~Lk75gJ���+AV*t&//(sw$V�z���7cDAd9M~s�i<u21L��'@rr++9/3333320133!332#!!%32>54.+L�%�~r|6fJ����s&00(r����ub@c84��p0.��@

rr+2+239/3013#5!!>32#54&#"����$U0r|�=E(LQuu�v�ϿCC����L��&�����
/�01��O��&�����
/�01��������&�|��/�01J�x}�@
rr/++223015#3!3#+� �݈���M�:�����&L��
@rr+2+29/3013!!32#'32>54.+L���wx4fNȵ(00-��w�p^?`7w-+��J��'L��rr++2013!!L����y���x��@

r+2/�23330132>?!3#5!!#&(�^y�R$��*\�i�������dh�^��J7�*�)@rr+22+229/3339901333333####���<�<Ϡ���>�?�pV��������+��+��'��7�-@' r	r+2+29/3901"&'732654.+532>54.#"'>320W�(gP6@?6)UV -1&6Nc(}]Jj;/3<AEvF?@&-8.-i((+#F;H-V=1U\=B[.O��	@	rr+2+29901333#O�X�������:����O��&���
/�01L��@r	r+2+29/39013333	##L�FӚ����D������+������@
	rr+2+2/301!##52>?!�$DgH%6%�Mx��i+w T�z�:��J�2��J��-������4L��@	rr++23013!#!L?����:M����JY�5������(��]�9������@	rr+2+299015326?33#�8
�昿����B7r#��|��5*�#-@-$?�223?�22301!5.54>753'>54.'\@rX35Zq=�=rY43Yr>2T13B�1T23B%@.RqDHqQ,66-QqGFpR-@��2W?/I31W>/H4������=J�y��@	rr/++233015!3!33[���^����M���<Z�@	rr++9/3201!#"&=332673�*@+||�AO#F�ny��?;;�:J��@
rr++332201333333J�يي��M��M�:J�y��@
	rr/++23333015!333333�ˊيي]����M��M�����@
rr++29/33013#5!32#'32>54.+��0�Om:8jL��)33+Tr�8eEDh:p 5!4!JN�@
rr++9/3323013332#'32>54.+3J��Om:8jL��)33+���8eEDh:p 5!4!���;L\�@
rr++9/33013332#'32>54.+L��Om97jL��(43+��8eEDh:p 5!4!$����)@% r		r+2+29/3901".'732>5!5!.#"'>32IDpTr6E'0N78��D66L1&D4m+�jS�Z/1]�)J2A!1%AU/&f%*N<#0#KDW<f�EH�e:J����&!@
rrr	r+2+++29/301".'##33>32'2>54.#"�X�Vl��mY�Uc�SV�_=U,.V;<T,-UJ�]����^�G[�lt�Sz=lEJi:<kFIk:7Z�@

rr+2+29/39013.54>3!##*#35#"7�BK<jG�H
��|z54mK?c9�:����-""/����F0��R�'@ 
	rr+2+29/301"&54>?>32'2654&#"B��"BeB��0H+hJFj;?yX>IH?'=$ =
��`�V69m:1M:19<jFKuBrK><L =+(>#=%@	%r
r+2+29/39013!2#'32>54.+532>54&+=$6C ').:.V;����!�$:!,B
?31?[T#=��r
r++2013!#=[�u�i��^@

r+2/�233301532>?!3#5!73##�Iu��AƎ
�5^I��i��&AB[9����BJD)@r
r+22+229/33399013'3353373#'##5#����)�,������,�*���������������+@%rr+2+29/3901"&'732654&+532>54&#"'>32�Tp l7)/3*)67'*#-eiF7W2!%018`<51%"S 618"@0"@D.2E#=(	@	
rr+2+29901333#=��z����Y��P����=(�&�f�
/�01=$@r	
r+2+29/390133373#'#=�-����+��������@
r


r+22/+2015>?!##&��� 9Tw5`K����=g�O"=�@
r
r+2+2901333##'=�����T���/��S����=@

r
r+2+29/30133353#5#=�Ԇ�����������AT=�r
r+2+2013!##=ֆ�����i��=�+\U����H�@	
rr+23+013#5!#��ӧ�uu�i�@rr+2+29901"&'7326?33�+'ԋ�|��8H�

j$%+	�}���0C$�+��$/%@r/
r%
rr++223+223+015#".54>;5332+3#";2>54.+1Su>?uR�Rv>>uS�&;"":�';!":'��IwEGwH��HwGEwI�@5(F--F''F--F(��]=��K@r	
r/+23+2015!3333�h���J�i��i�.�@

rr+2+9/301!5#"&=3326753a='S^�)+0��
YV��/,
	��=@
r
r+23+2201333333=������i��i���=��g@
r
	
r/+233+22015!333333�K�����J�i��i��i�S
@r
r+2+29/3013#5!32#'32>54.+��x^c*R=�k##j�l�`O5T/f$#=�@
r
r+22+29/3013332#'32>54.+3=�\_d+R=eP"#Oq��`O5T/f$#����=�@r
r+2+9/3013332#'32>54.+=�w^d*R=�k##j�`O5T/f$##��$#@

rr+2+29/3901".'732>7#53.#"'>325]Gk@(%<)��&;''>evQCfF$$Gf	;(2$%!8#W 6  $58B,Ma45aM-=��&!@
rr
rr+2+++29/301".'##33>32'2>54.#"GjCR��RClEUv?@vT&: !:%$9  9
7a=��>a6J{KK{Ir(F/1G&'G00G&!�@


r
r+2+29/330137.54>;#5#35#"!�/70T7��GsWc^$*%�
L>4L+���(  *����B�&JE��)	/�01����B�&JlJ
�*&	/��01���3F�-#@!%%r
r	/2++9/3�22301".'732>54.#"##53533#>32Z$6&\)
5-,:�NN���Q4E^09Z�C9V=FU'1*�P{{P�(,=�mH_6��=��&����/�01��"@
rr+2+29/3901".54>32.#"3#3267/AfG%$FhBQve>(';&��(=%(?k 	-Ma54aM,B85$  6 W#8!%$2=D�����X��=��N�����&�l������<��O��0$@$		r
r+223+29/3015>?!32+#%32>54.+&b^d*S<� 9T�U"#Uw5`K��]L4Q-�=g�O"l"!=>#@r
r+23+29/333013335332+5#%32>54.+=�Єe^d*R=��TX#"W�ı]L4Q-��f"!��)�'@
r
r+2+9/993�223013#53533#>32#54&#"AMM���V9bS�/1.>#PggP�(-e_���880+����=$�&����
/�01��=(�&����
/�01����&�E�/�01=��@
r

r/+22+2015#333#ﲆɆ��i���
��@
r+2/9/3�2015!332#'32>54.+
��Њ�Om:8jL��)33+�)UU����8eEDh:p 5!4!���'@

r
r+2+99//3333013#53533#32#'32>54.+Xqq���w^d*R=�k##j�S��S�`O5T/f$#�
!@r
/22+29/3399013!####!7!����?�?�����i]����$��$����]
!@r
/22+29/3399013'!#'##5#37!̸ �͡�$�#���f�w��������8�������|����A}��@
rr++93301!3>;#"���IF<(!����B=r��	H@
r
r++9330133>;#"���cF@9$
��h#=8g����W�v�&� /@	V
/�01+4��E�v��&���V+4��@
rr+2+9/3�2015!332#'32>54.+{�抑Om:8jL��)34+�'PP����6dDBf9p 5!4!6�@�
r+2/9/3�2013332#'32>54.+'5!v�{^d+R=�n"#m����^M5T/d%#�YYSj�
'@rr++29/33333013!2+32>54.+7S-3U@"9gE��0!2�~8�8�&BU/@l@�^6%&6�,�,C�+\(,'@rrr,++*))r+23323+++201"&'#3>32'2>54.#"?}=]�u\;6W?#"=QW3$'5(%*7&1�2
7/���Z.5*Ka89cK*i-;"$;*
 {4T-�,L�b�rr++�3013!53!L;x��Ɯ��=���r
r++�3013353#=�w��i�	@rr++29/3015!!!������YY���y���	@r
r++29/30175!!#^��\��LL�u�iJ�x��@
rr/2++29/301"'732654&#"5>32%!!�96""2DBK+I)(\0{���G��ֈpEMGPx�{���y��=�="@
!r
r/2++29/301"&'732654.#"5>32%!#A">,7-0!3&G&9[61_��[��VM>2=\5eKLu@�u�i�y!�3@

rr/+2323+229/33399015#53%33333####�9������<�<Ϡ���>�?⇇y��pV��������+��+����Z3@



r
r/+23+229/33399??015#53%'3353373#'##5#�;�������)�,������,�*�l������������'�w7�1'@+$r	r/+233+29/390157'"&'732654.+532>54.#"'>32�r;W�(gP6@?6)UV -1&6Nc(}]Jj;/3<AEv���F?@&-8.-i((+#F;H-V=1U\=B[.���7�&�|SL�y��'@
		rr/+223+2/9/39015#53%333	##36����FӚ����D��y��������+��=��0%@
		r
r/+233+29/39015#53%3373#'#�3��
�-���Ι�+l�������J��-@r	r+2+2/9/3/33/9013333##7#3J�����֖���::��%����2�νP=\!@r	
r+2+29/��390133373#'#7#3=��w������h66������z!��'@
r
r+2+299//393015!333	##&݅_ӗ����\'PP��������+��*�)@r
r	
r+2+99//339+0133373#'#5!C�-����+�J�l�����5PP��!@
r
r+222+29/390153333	##��FӚ����CTrr��������+��u!@

r
r+222+29/3901533373#'#��-����+�mm�a�������J�y �&�">�V+4��=��n&�!��V+4J��@

r
r+2+2239/301'!%#!#3!����׉����BMyyy�:/����=�@
r
r+2+2239/301'!3353#5#�[�K�Ԇ���uu�i�����J�x+�!@rr+2/+2/39/3013!#!"'732654&#"5>32J0���f96!;BNE&L'(\0Sp:��:M���jOPRTlCyQ��=�=p$@r
r
/2?++29/301"&'732654.#"###!>32�!?,7-0!7�ʆ�&K"9\51^�VXG8B���i�5gLU�I)��B�6F+@C'rr0;;		r3	r+2+23333+2+201%#"&'#".54>&3267.54>323267>76.'&B1zH;p-0f@O�g:1Y{K1N,>oI%&8P�^HuR,/_H
?\%�$!!'N>+ &G9Q+,3a�XH�e6w<jDPw@Re9^�T2XrA?sY* (PH
(#:V=/0��U2B-@3%rr,;;	r/r+2+23333+2+201%#"&'#".54>3267.54>3223267">54.U ]1+P&W0Z�M)Jd<#5*Q8	
-1BtLLq?LM+E��)>"3#.E'$;&ES6cK(c-G*1V5"d<Fm>;fBGv#."?+#C51F+/=�w��'5.54>32.#"32>7BAkL+/Z�Sb�#j:B 4M47M.!D:qG]1��Dew>A}g=VEI(/*DT*/WC'0&A,A*���"@	r!�r+�33+2015.54>32.#"32>7�Ca4C|UUz�8"&?$%>&+"�5I,{
Np?J{JJ<('G/.G)(!7$z���y]�&�"�
V+4�����&�!��
V+4����>	�+@rr++2901533�Nj��~����a��������#@
rr++29/93330135#535333#�������������W��V�2W��+##@
rr++29/3333015#535333#�zzdž����vvՙ<�V���<��y��"@

	rr/+223+29015#533#'#76�����������y�M��������^h��$"@r


r+2�33+29015#53?3#/#�(��tm		n����p	q���l�����������yk�!@
		r+23233/�3301+5!5!3!33%�������^My�����M������"@

	

r+23333?�3301#5!#5!3333���u�r���J�uu���i��i���<�y��&�"��V+4��.��'&�!P�V+4��<Z�&�#�Q.�#@


rr+2+9/3/33/01!5#"&=3326753'#3s='[h�.80��66�
YV��/,
	��R!Jg�@r
r+2+9/301>32#54&#"#�*@+}z�@P#F���ny��?;�����=$�M��\�09%@,55'	r1r+2+29/33/3901467;#"&2!32>7#".54>"!.L&'�xen�M~Z1��"6B$'F4
�]xCL|Y/0Y}M4S2�5V�9)cLJ;d}A
+G22 /7S/<f�GE�e;w0U76V0���-6!@..""3r&r+2+29/333301467;#"&".54>32!3267!.#"7'�vO[�9^E%%D_:Sv?�u*?!(E
nF^�&;%$>(W1
QE��+Ka68cL+K{G(<'  (>#6)=""=$�yg�4='@9+�"+	r5r+2+22/�9/3�20157467;#"&2!32>7#".54>"!.�w��M'&�xen�N~Z0��#5B%'F3
�]xBM{Y00Z|M4R3�5V��X�K9)cLJ;d}A
+G22 /7S/<f�GE�e;w0U76V0���1:'@22&&7r*�r+�33+29/33330157467;#"&".54>32!3267!.#"Rx�G7'�vO[�9^E%%D_:Sv?�u*?!(E
nF^�&;%$>()��1
QE��+Ka68cL+K{G(<'  (>#6)=""=��J��.���&�J��/�01��D�&���/�01S�'��$!@rr/2++29/33301"&'732>54.+#33:33�6 ,%@Q+>��.Ӛ�Ch=7^�h"D32ZD'������e�MUy?=�,!@!r
r/3++29/3301#"&'732654.+#33:373g4K*.Q63&$(C(8��!��*QmBGi9
c
=5<W/������v��&� �V+4���vf&���V+4��J�$��&�V��=�+&����T�v �&�
 H�V+4��E�vv&���V+4<�yZ�@	r	r+2+23/9/301!#"&=332673#53#�+B,zz�AK$H��v�I'ny��?;)�:��^.���@
r+2?3�9/301535#".=3326753#
M:8S-*/-�^��
,S7��20
����T�vo�&�
 ��V+4��E�v�&�%�V+4��=������&����/�01�����&�R�9/�01����&��l�
�/��01�����&��;
�=9/��01���������������J7�&�x��/�01����B�&�a�&	/�01������C����;�������&l���
�.*/��01����;�&m�G
�*&/��01���&��3�
�/��01��D�&���
�/��01��'��7�&��O�
�2. /��01������&��
�0,/��01$��:� !@ 	r		r+2+239/33012#"&'732>54&+517!5!-Nh<DuMZ�(hT8*9CIP������&>K&Hi9F?@&-6$4A`�yh���#�@rr+2+239/3301"&'732>54&+57!5!3�O�&RO3-A"XNB�����	jq*I]�@=F)/:(>B\�o^�tY:Y<��O��&�s���
/�01��=(�&�sc�
/�01��O��&����
�
/��01��=(�&��O
�
/��01������&����
�,(
/��01����A�&��J
�($
/��01����+#@		"'r	r+2+29/333015!".54>3232>54.#"t��N[25]LMZ24]��5M12N45M12M4@QQ��<g�DG�e;>h�DF�e:h.VC')EU,.TC')DT��A'@$rr+2+29/30175!".54>3232>54.#"q��@fG&&Gf@@eH%%Gf�$>'&>%%>&'>$�99�+Lb67bL++Lb76bL+.G()G.-H()G������&|���
�0,/��01����A�&}�J
�,(/��01��$����&����
�.* /��01��#��$�&�;
�($/��01��������&�sy��/�01����&�sB�/�01��������&��e�
�/��01����&��.
�/��01��������&����
�/��01����&��q
�/��01��<Z�&��r�
�	/��01��.��&��*
�/��01��L�y�&�"r�V+4��=���&�!D�V+4��JN�&����
� /��01��=��&��
�/��01�$(�@r/2?33+29/301"&'73265#53'!!5!�;  //j�0Vg������X:;\\Eb5��y��YY�+�@r

/2?33+29/301"&'73265#53'!#'5!y7!,,R�0TS[��^�

X<5QQC_3�u�i�LL�$��@r/2+2901"&'732>54&/#33�= "���������/P�

h 2��^h�����+S$2O.�,
"@r
/2?+2901"&'732654&/#3?3k-Dp����n
m��[(*'F�
c$3^�����{7^2-F(�� @

		r+2/9/339015!3#'#�����������4PP���������^h	@
	r+2/39/9930175!?3#/#2���n		m����p		p����CC&��������)��:�-@  r'	r+2+29/3901".5467.54>32.#";#"32670KwEG@=9?kB\}.[M8&51!UU(7C>5Qh(�.[B=\T1>V-E?F%.+*`/-9-&@?F"���/@
"r)r+2+29/3301".5467.54>32.#";#"3267Bg;64-<d;2N;P
+.5%=;**-*5lq#E2.A
!,-@"."6#Q%  15<���$��&�I���+&��������6���+=V���<��F\��T�y��&�"
�
V+4��C��j&�!��
V+4��T�y��&N
"��V+4��F��}�&O	!��V+4�����$��&�
������+#&�����y��&�"�V+4����f&�!��
V+4���7��&('���$��9/�01���7�&H'�����5	/�01��J�9��&)�����İV+4���9]�&I���1��ذV+4��J�]��&)�������V+4���]]�&I�q�1����V+4��J7S&*'�u���y��/�/�01����B�&J&�^����-�&&	/�/�01��J7S&*'�u���y��/�/�01����B�&J&�^����*�&&	/�/�01��J�77�&*'������'/�01���7B�&J'�����A	/�01�� ����&,����'
/�01���!>�&L�h�7
/�01��J�9��&-���=�9$�&M�����ΰV+4��J�E��&-����=�E$�&M���!
��ذV+4����&X&.'�����6~��/��/�01�����&�&���'���/��/�01��J�9>�&1�����ΰV+4��<�9@�&Q�O���ӰV+4��J�]>�&1�~��(�]T�&Q�������V+4��J�9�&2�B��=�9k&R�c�&
��ΰV+4��J��&3���
/�01��=$�&S���/�01��J�9��&3����ΰV+4��=�9$&S�����ΰV+4��J�]��&3�����ΰV+4��=�]$&S�\�����V+4�����a&4'����#��D�((
/�/�01����A�&T&�T����@�$$
/�/�01�����[&4'�������HD�((
/�/��01����A�&T&�T�J��D@�$$
/�/��01�����S&4'�����y�/�((
/�/�01����A�&T&�^����+�$$
/�/�01�����S&4'����$y�,�((
/�/�01����A�&T&�^����(�$$
/�/�01��J�9��&7�����ΰV+4��=�9u&W�
���ΰV+4��J�]��&7�������V+4����]u&W�������V+4����G�&8����3./�01������&X���,/�01���9G�&8���4��ӰV+4���9�&X���-��ذV+4����Gh&8'�������7�33./�/�01������&X'������0�,,/�/�01����Gh&8'�������:�88./�/�01������&X&�F����3�11/�/�01���9G�&8'������4��ӲV7./�01+4���9��&X'�����0-��ذV+4/�01���9]�&9���	��ΰV+4���9w�&Y�s���ӰV+4���]]�&9�e�	����V+4���]x�&Y������V+4��@���a&:'������6�/�/�01��8��B�&Z&�Q����:�/�/�01��@���M&:'�����z�"�/�/��01��8��B�&Z&�\�I��&"�/�/��01���&<�b��/�01��F�&\���/�01���&<����/�01��F�&\�K�/�01���&<�)�
�/��01��F�&\��
�/��01����&>����	/�01����&^���/�01���9Q�&?���	��ΰV+4���9�&_���	��ΰV+4����w�&Y����
�
/��01=����<!@
:2-(r"r	r+2++2901"&'732654.'.54>7.#"#4>32�Bz+/-V)&/-!;N&)Ia8!'9$6D +Me9GoH
/UC'+=S)l
,+W&$
%7,0B*5&/*H/�D�<\> /YB&	"50PX���9��&&�����9&F���:$��ɰV+4����&&���/�01����&F���C/�01����&&(v��@/�/�01����$;&F(6�@@??/�/�01����&&)5��@/�/�01������4&F)��C@??/�/�01����&&*���@/�/�01����B&F*M�J@??/�/�01���$&&+����/�/�01����k&F+C�@@??/�/�01���9��&&'������/�01���9�&F'���X�:$��ɲVC/�01+4���&&$����/�/�01����f&F$h�G�@@/�/�01���%&&%����/�/�01����l&F%e�J�@@/�/�01���/&&&���#�/�/�01����v&F&m�Q�@@/�/�01���)&&'����/�/�01����p&F'Y�G�@@/�/�01���9��&&'������/�01���9�&F'���l�:$��زVD/�01+4��J�97�&*���
��ΰV+4���9B&J���'��ɰV+4��J7�&*���/�01����B&J���0	/�01��J7�&*�k��/�01����B�&J�T�/	/�01��JY�&*(k��@/�/�01����B;&J(T�-@,,	/�/�01��*7�&*)*��@/�/�01����B4&J)�0@,,	/�/�01��J7�&**���@/�/�01����BB&J*k�7@,,	/�/�01��J7$&*+y���/�/�01����Bk&J+b�-�,,	/�/�01��J�97�&*'������
��IJV/�01+4���9B�&J'���v�'��IJV0	/�01+4��3��&.��\��/�01����&���1���/�01��J�9��&.� ���İV+4��=�9��&N��	��ΰV+4���9��&4�
�)��ΰV+4���9A&T���%��ذV+4������&4�I��2
/�01����A&T���.
/�01������&4(���/@..
/�/�01����B;&T(T�+@**
/�/�01������&4)`��2@..
/�/�01����A4&T)�.@**
/�/�01������&4*���9@..
/�/�01����AB&T*k�5@**
/�/�01�����$&4+���7�..
/�/�01����Ak&T+b�+�**
/�/�01���9��&4'�
����)��βV2
/�01+4���9A�&T'���v�%��IJV.
/�01+4������&E�#��8
/�01����A�&F���4
/�01������&E����;
/�01����A�&F���7
/�01������&E�I��B
/�01����A&F���>
/�01������&E����8
/�01����A�&F�T�=
/�01���9�&E�
�9��ΰV+4���9Ad&F���5��ɰV+4��@�9��&:�	���ӰV+4��8�=B&Z�����ɰV+4��@����&:�D��$/�01��8��B&Z���(/�01��@��$�&G���*/�01��8����&H���./�01��@��$�&G����-/�01��8����&H���1/�01��@��$�&G�D��4/�01��8���&H���8/�01��@��$�&G����3/�01��8����&H�Q�./�01��@�9$&G�	�+��ӰV+4��8�=�d&H���/��ɰV+4����&>����/�01����&^�s�/�01���9��&>���
��ΰV+4���&^�E����&>���/�01���&^���/�01����&>�n��/�01����&^�D�/�01��:�iO:��O�/20175!:��yy:�"O�/20175!:��yy:�fO�/20175!:,�yy��:�fOR8�����/�99013#57�(�$�z��x6�����/�99017#53G(�#�z��x:�}����/�99017#53K(�#�������8�{�&TT�5�w�
@	
/3�29017#5337#53F(�#j(�#�{��x{��x:�}w�
@
�
/3�29017#5337#53K(�#e(�$���������#�~��
//9/33301#5333#������Ux��Dx��*�~�@
	//9/333�223015#535#5333#3#�����������xpy@��ypx�M���/301#".54>320//0^00//: �@
	
?2332301353353353:nNnNn������(��q�/?O_e5@`eeP@@XHH8((0 	rcbbr+22/32/3+22/333232/301".54>32'2>54.#"".54>32'2>54.#"".54>32'2>54.#"		�.K,,K..K++K.!   �.K,,K..K,,K.!  !�-K--K-.K,,K. !! ��=����)E**E((E**E)C&&&'�(E*+D))D**E)C&&'&C(E*+D))D**E)C&&'&
IV6����=���
��/�0153=r#�����=���&__�#.+�@	/3/3901%%#���� �mmgn�:.B�@	/3/3901%57'5B����߱ngmm��6�����rr+2+201'		�=���/IV6������/%�!
BD?2�201".54>32'32>54.#"�5O67N25N68N�;+"1 :*"1!�'@K#&L>&)@K#&K>%� >*)/ >*)/�~/

@
		
BD?�29/3333015#5733#'35��;88��`I��E`���o/&@	# BD?3�29/3012#"&'732654.#"#>73#>�)H-/R45V-@%)6)4A

�.�"=)*@$&!2'"!3560I_	
"��/*@#
BD?3�29/93014.#">327.#"32>".54>32�*L3%>=3>*O.XgbS5Q.�/1./(=#=A3"zq]g'B%""!#��/�BD?�201#5!#�l�Z�J�[ ��/+:@ 008B(D?3�29/33301#".5467.54>324.#"32>'32>54.#"�1Q02Q/4!*1J'&K1(%1Q.,--�&&&!1%; #;$'/'#33#*2���/*@	

#BD?2�29/301"&'73267#".54>32'2>54.#"�.O+>4<>&1L+.Q4TbgS/.0-�"2A=$='(B(h]qy�"#$!���Q%�!
BA?2�201".54>32'32>54.#"�5O67N25N68N�;+"1 :*"1!Z(?K#'K?%)@J#&L>%� ?*)0!>*)/ ��:U@	

BA?33�22301!53#52>53:��a'/'!PNN	P�����V"@B A?2�29014>7>54&#"'>32391>*/(/#33K/RT). )�U5G3
"!: G;"/
N��uV,@
&BA?2�29/3301"&'732654&+532654&#"'>32�=\*!1 '9AB::4'916B 2J+.(,42QZ)&6
F=4!#.=))4��~Q

@	
BA?�29/3333015#5733#'35��;88�TaI��Da����oQ&@
$$# BA?3�29/3330172#"&'732654.#"#>73#>�)H-/R45V-@%)6)4A

�.�"=+)@$' 2'# 3651H`	"���T*@	#
BA?3�29/301%4.#">327.#"32>".54>32�+L2%><4>*O.XhcS5Q.�00-.7'=$>@3!yq]g'B%#"!#���Q�BA?�201#5!#�l�ZJ�[ ���Q+:@0  8B(A?3�29/33301%#".5467.54>324.#"32>'32>54.#"�1Q02Q/4!*1K&&K1(%1Q.,--�&&%!1'&:!#<$'/'#33")2����T*@	

#BA?2�29/301"&'73267#".54>32'2>54.#"�-P*=4=>&2L*.Q4ScgS0//-Z! 3@=#>'(B'g]qy�""#  ��"� $(,0)@*/+--r#%"''r+233�2+233�2014>32.#"32>7#".#53#3##53#3# B|VUy�9"&>%%>'+"�D^:@eI&j>>�>>�>>�>>J{JJ<('G/.G)('>#+Mb	������ M�	
@
r?+29/3�2013!!!!'5!p�����I�y�p��h[[,���6:>@7:>;;
6(/	r
r+2+229/3�2017>54.54>32.#">323267#".#"!!!!8#/ 7^9=n%GN$& &$-,"!>==!E )m��m��W=@%A?@#2Q/81R",&59D(89 	d
	�S-S&7�"@

r
?3+29/993�201%!5!5!5!#33#7�����Ήno�s�SmR�8�,�;J��1�
2^=@ /r#++$(PI(II(:3r''r+/33/+29///33333+201332+32>54.+#".5#53533#3267"&'732654.'.54>32.#"J�2R=!7cBWN(,I�/7%?$EE�nn(=n'+*R'#),5F#/V:3Z&2$@""&9O(g�(DT,<lD�g5"%4��9.-g��g��,+W&$
$7+4K*#'U
	%80NX(V�!=@  !r?3+9/93�2233333301%!5!3!!'!5!3!!3733##37�!�p�!p�!�p�!��QR�zZɕ��w|}w���Y�SS�RRD���'�:*�����%n�,04/@
		2233 (--0/33|/33/33|/33/3/3014>3253#"&/#".%5.#"32>!!!!55a>6_�#$.c7Ae:�
,5"5 7"'#�tI��.��[Aj?1&�3n%!14@kD(#9"#5
!�E�E!����,!@
(	r
r+2+29/993�201?!7!74>32.#"32>7#".!�>�?(/Z�Sb�#j:B 4M47M.!D:q_v:L~[3�JJ�JJQA}g=VEI(/*DT*/WC'0&A5J&?i� �� @

	rr+2+29/930175!33	# X�Ҋ*���!��ZuIIu��R��u2^�]�@		

rr++230175%5%###5!C��8��O�A�A��A�A-��My
Y�!&@!	r?+299}//33�201!!!!!2+32>54.+
R��R��=$5U?" <U5��!4"7�+E3E���+GY/0XG*�>"@-/?  ���/(.0@.*++r#	r+2/223+2/2239/3?01%3#3".54>32.#"3267#5!#VCCCCE{]44^~Jd�$ga9-J69L.6c+YO�r@���
�{8c�MI�b8UFL58&BV03V@%86�`
e��	����'+/'@-,(
))
r!	r+2+29/99993�201"&54>54&#"'>3232677!%7!
pi)CJB*.5"F8)_Fmf*BJC)08&G:'d����N�ZO1L=527!&&VVK1K:329%')Y%11c11���/,'@(	r
r+2/233+2/22301%3#34>32.#"32>7#".VCCCC��/Z�Sb�#j:B 4M47M.!D:q_v:L~[3@���
��A}g=VEI(/*DT*/WC'0&A5J&?i�]�@
	r?+23}/3013#5!#5!��O�O�kk�R[kk)��@�
r?+99�2330132#32>54.+!5!5!5!)�2R=!!>*���o)+{�7�7��(DT,-S>��^!8#$8 yRDS$3�@r?2+9013332>53#%5%5%S�f%-�2aO��r��r��
5(:_D%�U�UU�U@����@


	?3/3933/3012#4.#"#4>?wRvK#�'C21B(�"Iw1CCN4]{E��(M=%$=M)��By_7���/�  @ 	r?+29/3�23301=!5!!2+32>54.+!��W��4S; 5bE�w(+q�yy�BBn�(DT,<lD�g5"%4:��Q�&@	&	/3?39/3017>54&#"3267'#"&54632�%F9!K<)A&?8<%-� drn+:H";%�4:	Y!�"# LPFSw�	)!@	

&r?+22/33/3?9901#33#".54>32'32>54.#"܉kr�os;S--T::S-,T�'''(�9�.�;S4V12U44U21V4�//-/+���23@'*-0

$00?33/3�292/3/90173#5#'#3.#"#"&'732654&'.54632;�WAFAW�� .%<9F8&M#8'94G5 =)��ջ���+@

)*-.@
	'&,4>���)@
r+�923333301##5#5!3#5#'#3S_W_"�W@G@W�:q��W�ջ���+�&��-!@+-r!
r+2+2233330173.54>323!5>54.#"!&�0E&2]|HI|\3&F0���%;*5L//K6+;%��fQf:D|a88a|D:fQff6JS+)O@&&@O)+SJ6f#��I @	r	r+2+29/301%"&'5!4.#"3267'2!5>6,N�E|RR|EE{SNo%`F,O��N$&�P�MK|JH{K0##+�'%tu$'�� ��h�&'c*�����"(U;@O:77)@HH)#((1)&%% /33/293/3?33/33/39/33014>7>54&#"'>323		%"&'732654&+532654&#"'>3270>)-(.#1
2J/OS(-(צ=���=[*!1 (8AB:;5'916B 2J+.(,42Q15F2
#"9!G;!/
N��IV6����('5
G<4""/=()5�� ��w�&'c*
�������&'c�
_������&'c�
R������&'cO
���!2@+		r"r+2+29/301".54>326<'.#"'>32'2>54.#"�Ch<*H\2.E5%BJ&i:rzE~N.%3#;%2
7`;1VB%$	=H"N$&���^h%11#:$4��A.#'@
&% 
$'?2�2?3�201".54>3232>54.#"/@fG&&Gf@@eH%%Gf�$>'&>%%>&'>$q�2�?
+Lb67bL++Lb76bL+.G()G.-H()G��;��n�@rr+233+201%!53n���pr��hhh^����L ����@		r/3+23301###5!##��P�P�R�T�tt�T �
!@	
/333/9933301!!5!57'5!� ���Ŷ?�W����[t��>�}�/2015!>�kk��y��rr+2+201'<L��8�@�k:����/201753:n��
@


r+2/9/33013333#�m{Cpx�����{�����{^(��/? @0<$ 8(/223�2923012>32#".'#".54>2>7.#"!2>54.#"�(7'%8(4J*,M0&7&'9)*N1-L9##$$*""#$((2S32T1$$2T23S1��%&#%%#'#�Y^4�
/3/301&632.#"#"&'7326'^B?H
&B?G�;F` �Q>C`!5���-@�@%�)/3�/2�2�201#".#">3232>7#".#">3232>7P%('1
=$+(	<%('1
=$+(	�	),
 s
),	K�@
/�23/333/3017'!!!!V�3�=9��9��4��$�WW2�Y
@
	/3�22/390175!%%2a��^���ll���PJ��C�Y
@
		/3�22/390175!57'5Cb����^ll<��JP���	@	?3?3901#d�����֍������nl������=�+���
��/�01#7#53�='q�H^^��31@		+$r2/3
r+2?3333333+29|/3013#5354>32.#"3#3#5354>32.#"3#]EE,Q8%D$,	���EE+O5 A ("$���f
7X4ff�v�f A_4e0.%f�v��@
r	r+2?333+201#5354>32.#"!###]EE7O2&C=5F$(����f ,L;!d*%���v����) @r"
r
r+?333+2+201"&54.#"3###5354>323267=G$" 'WW�EE5bDrl&*4B3�23!f�v�f,AY.lX�� l
�86@		,$r61488
?23?3333333+29|/3013#5354>32.#"3##5354>32.#"!###]EE,Q8%D$,	���DD7P2&C=6F$'����f
7X4ff�v�f ,L;!d*%���v����D@@ 
		#6r=r(11+..-
?2?3333333+2+29|/333013#5354>32.#"3#"&54.#"3###5354>323267]EE,Q8%D$,	��9>G
%" 'XX�DD5bDrl'*3�f
7X4ff�vB3�23!f�v�f,AY.lX�� l
��X�b>@#TTJMM<+A&F!0Jr80r\

Y
r`r+2+223+2+293333/301%#".5#534.#".#"#".'732>54.'.54>32.54>323#326>06&>%DD!!1.
5*I ')0J3!9K,*ZO30^+(!+-F/9[1J%RB>H#
nn(�j9.-g:C3%% T	"1$*?*[!

0"9M(
*(A'7O4g�
?�@
r+22/3901##33?܍���ܗ������:����� ����-@$##
r	r+2+29/301".54>32.#"32>7#'!uNY/0[OZ�)m*9#/J31L1#>0 �01Vu<g�EF�e;OFV&$)DU,*UF*)3t	?qW2��=��&���/�01��� 3@ 
r'

r0r+2+29/3+01!5#".54>3254&#"'>32'6=.#"32>}\72R/$>Q,*B;:)Q*)1l=Mj7�8*")*%I*)+L/(@+	39U #3aD�Ä<


$
��?&"@
rr&

r"r+2+29++01".54>3253#5.#"32>76[C$$?V2;]��Rk*53%%A)1&
*Jc99bK)8.V��U,3F/.9+F*(��>�'"@r'
r"r
r++2+29+01!5#".54>323.#"32>7�S66[C%<jC;\��
-52%(5(#R,0*Jc9L{H9,*�&=.-9  9*
!=�+���r+�2?013#3#=�����&��?���
rr++0130*#?�+-�&�,a/$@rr!"
'
rr+2+29++201".54>3253#"&='2>75.#"2T>!%BZ4<\u'':<F/'%*3&$@
+Jd89bJ)7-[��r3(�fr'|&-9 +F*k�@
r
r++2/223013#53533#hNN�yy�y��y�m8��"@rr
r++2+29901!5#".5332>73�;H&/C)�(#2*�Z!-6M.H��#7+E��
Y@
	r
r+2+93301!#333ff���yj{iz��A����o��o���+@
rr+2+9901#73��Tϊ�~���u�����R7@CC=:r,++'0rK		HrOr+2+223+22/3+22/392/301%#".5#534.#".#"32>7#".54>32.546323#3267�07$>%EE#/(�9"2$&2+$�G^8@fH&%FhC0B
]YDK nn(9.-g$9(7'54+
(+9!"9+()="-M`65aM,1EO$=M(g�M/
?@#
		

		>/2?9/93339<<<<0133#'#3�c�8�8�R�/��D2/&@>/3?39/3901%#!!24.+32>32>54.#26Z6��I+>"-*4=z��"�� �/@ /*B$'HI �2} ��<2#�??3?3014>32.#"32>7#". (LnGSz]S'+@+-@'90
dQc1@lN*3cP0D6A-"2>#@2$;*:1SgDX/

�>/2?301332#4.+32>D�e�EL�]�+Q;ii<Q*/K~MU~F4M,��-PD�/@	

>/3?39/301%!!!!!�Q�����jj/jwc�D�/	�>/?39/3013!!3#D����/j�c� ��A3!'@
$##
?''/22/?39/301".54>32.#"32677#53#;;gM,,Oj>Tx\P.%=+.?%+Q$&Sp|�d/Pg9:eM,C7D(*0@$%@0*'w$"�X��DN/�	>?2/39/301#5!#3!5Ny��yy/����/��D�/	�>/?0133Dy/����y/�>??301732>53#"'':&1.y.\MP7|%O<��@iJ(!DU/@

	>/2?3901333#'Dy��Q/������G�D�/�>/2?0133!Dy/�;jD�/@
	>/2?3901!##33>�B�y����]���/��.��D]/	�>	/3?39901#33#�y^BybO��/��X�� ��m2'�#
??2?301".54>3232>54.#"FBlN*,Pl@BlM*,Ok�,A()@+,@()@,/Qf68eO.1Qf57eP-"?23? ">12?D/�
>/?39/3013!2+32>54.+D9Z31V:��$%�/8U/0V6�!%$ ��y3'+@
?((**?2/23/?301".54>32'2>54.#"73#FBlN*,Pl@BlM*,Ok@)@+,@()@,,At�r/Qf68eP.1Rf57eO.l3? ">22? "?1o�D?/@

>/2?39/39013!2#'#32>54.+D:Y21#���v�$&�/8V.#?2ѷ�!&$���3.@	'+??3?39901.#"#"&'732654.'.54>32�
2B#//=,;W/$?Q,D�46;S.-/'D/9K%;e<@l'�	&>4/A(&!i
';+:N(%/�>/?3301###5!�y��;�j<��R/�
>?3?301%2>53#".53F*9!yAeFIe@y"7g0= ��9eL+-Nd6��!=0O/
�>?2/9013#����f�/�{���/�/@
	>?333/39013733#'#37pEGpjI���fkkf���F-����������/�b�=/@

	>?2/390173#'#�����փ�����/���쾾>/�>?2/9013#5�����x�/������m!
/	@		>?33/33017!5!!!!V���M�[jj[��j�x��@

r+2?3/333301333#5!!I�~�Jr�(R3��M�������
���r/2+90133#
}����:(����#-!@-r$	r+�333+�333015.54>753'>54.'\@rY35Zq>�>rY43Ys>7]8":I�4Z7 7G'FA6^�NS�\4AA5]�RO�^5A��=lN:Z?"<lL:[?$��J'�+��'�w7�,���w��>��'�77�&������7���B��%� +@
!(rr+2+29/3301"&54>32'2654&+32654&#";y�1gOA[0,*=I>iI69:7p99b)//)/3syFf7(L72H_OHa/n@::>�58K1++2236���+@"r%r+2+2901".54>7>54.#"'>323267O_*'UD%)!.;XoM@T)$I:?6303ET$r
%@),9+//6!?-*:)'  ;,3���!>LD�0@


r+2/2/?3/3/9/33333013'333373#'##5#����)�,������,�*�������������-�+@
%rr+2+29/3301"&'732>54.+532654&#"'>32�Kzc=,)8!<*<33>5-";VlI]i7.@KAl�F=,$$ :&'7`4/+0 (38B`P9O_MIb2��8��BZ��8��B�&Z_�/�01��8��B����=2�P
�r+/3901##\���������o��=$S��=kR8��p@	
r	r
/?3+2+299015'./#"&5332>73;�#nBQT�,+3+�*#"57ieH��<=* E���8��g$'@rr
r		r+23++2+290133267332673#5#"&'#".58�+''F�*''F�yeAAI
c?0>"
��?:=02��?:<12��a46@.59#;I&7���.'@'&#	-
?�3?3?3?933015'./#"&'#".533267332673;;hEAI
c?1="
�+''G�*''F�)!$39@.59#;I&H��?:=02��?:<12���8��@rr+2+9/301"&5332'2654&+&p~�h1U?$$?U32442f5hl>�,J65J,n-()-L-2��m@rr+2+29/301"&=#5!32'2654&+�q~�
i1T@$$@T41551f5hl�m�,J65J,n-()-L-2=�	@	r/+29/30175!!#l��[��SS�u�i����?���7�-���7�%��H�.@
'rr+2+29/3301".54>7.5463!!"2'2>54.#"6O|F:+-0eU��('9=U}DG|O'=$#>''=$$=
>nF+OB>&HPr#<mGFn>r8')<!!<)'8*����'�#
r	r+2+201.54>3232>54.#"^KtN'*QrGMsN'*Qr�)@*-@)+?+,@)
Bl}<@�i?Dl~:Ah?g*SF+.HR&*SF+.HR+��@
r?33+22/301%!53#52>73�n�%/180�yyy�|$��)-�(�r&/2+20134>7>54.#"'>32!)#8)#KA)/!&A3T1EX5Nj72>!4@%b=]I8&*6'+'X(&7_>-E4)*$#y!���2@
+#r		r+2+29/3301".'732>54.+532654.#"'>329]EH
,B*)<!)P:!#HW22MWL_3Gn>!<),C%Gy7&[*+!.d2.)/%a -1T6(B,
3M-?X0#�

@	
r?+29/333301!5!533#35E��U\XX�ֳ�x��Ty��$���"@r	r+2+29/33301"&'732>54.#"#!#>32
M{!MS-$84! :uR^�."Cj=Eu
C9P'.6#"5�z�
;fCGm=.��7�.@
'	rr+2+29/9301%4.#">327.#"32>".54>327ApG!:,$B-,LM'qCT|C@uPJuE��"<$#<$$;$$<�Ck?#@[0+%T6:[��f�NBpA%=$$;##;$$=%"8�
�r+2?01!5!#d�����Lz�:,��0�!3C@8''@r0	r+2+2933301%#".54>7.54>324.#"32>32>54.#"0GvFGuE"3)*FS)(TF+)4 �$, 7"#+ 8"�/--.�Bb7:eA(A/
(4/J32I05)0B!'0 '0A&%$%(��1�.@
'r	r+2+29/330132>7#"&'32>54.#"%2#".54>(AqF"9,%B-,LM'rBT|C@uPIvE$;%$;$$<#$;�Bk?$@[0+%T6;\��g�MApA&<%#;##;$$=%�����Qk�� ��:Ul�����Vm����uVn����~Qo����oQp��"���Tq�����Qr�� ���Qs�����Tt����%�!
B?2�201".54>32'32>54.#"�5O67N25N68N�;+"1 :*"1!'@J$&L>%(@K#&L=%� >*)/ >*)/ :�@		

B/33�22301%!53#52>53:��a'/'!PNNN	O����"@
B /2�290134>7>54&#"'>32391>*/(/#33K/RT). )�5F3
#!
:!F<!/ 
N��u�,@
&B?2�29/3301"&'732654&+532654&#"'>32�=\*!1 '9AB::4'916B 2J+.(,42Q('5
G<4""/=()5~�

@		
B/�29/33330135#5733#'35��;88�aI��Ea����o�&@	# B?3�29/3012#"&'732654.#"#>73#>�)H-/R45V-@%)6)4A

�."=**@#&!1'"!2660I_	
"����*@
#
B/3�29/9301%4.#">327.#"32>".54>32�+L2%><4>*O.XhcS5Q.�00-.�'=$=@3"yq]g'B%#! $���B/�201#5!#�l�Z\J�Z ����+:@ 008B(?3�29/33301%#".5467.54>324.#"32>'32>54.#"�1Q02Q/4!*1K&&K1(%1Q.,--�&&%!1{%; "<$'/'#32#*1 �


����*�

#B/2�29/301"&'73267#".54>32'2>54.#"�-P*=4=>&2L*.Q4ScgS0//-!3@=$>&)B'g]rx�""#!/��%�!
BC?2�201".54>32'32>54.#"�5O67N25N68N�;+"1 :*"1!/(?K#'K?%(AJ#&L=&� ?*)/!>*)0 2�@
	

BC?33�22301#53#52>53�N '+Q�NNP��1�"@B C?2�29014>7>54&#"'>32390?*/(/#32L/RT).!(�15F2
#"9!G;!/
N*u�,@
&BC?2�29/3301"&'732654&+532654&#"'>32�=\*!1 '9AB::4'916B 2J+.(,42Q*)&7
G=5!".	=()56~�

@
		
BC?�29/3333015#5733#'35��;88�6`I��D`��/o�&@	# BC?3�29/3012#"&'732654.#"#>73#>�)H-/R45V-@%)6)4A

�.F"=**@$'!1&# 3660H_"+��*@#
BC?3�29/93014.#">327.#"32>".54>32�*L3%>=3>*O.XgbS5Q.�/1./�'=$=@3!yr\h(B%#!!#6���BC?�201#5!#�l�Z�I�\ /��+:@ 008B(C?3�29/33301#".5467.54>324.#"32>'32>54.#"�1Q02Q/4!*1J'&K1(%1Q.,--�&&&!1�%;!#<$'/'#33")3�
+��*@	

#BC?2�29/301"&'73267#".54>32'2>54.#"�.O+>4<>&1L+.Q4TbgS/.0-+"3A<$>&)B'g]ry�""$ :����/301753:n�/I��
��/�01'73�V6}Iw(=s�
�
�/2�201"&5332673�MXS(**%SX=O>(& >O"���@
�_/]2�201".5332653�9S-^+0/,_-S�%B)-* )B%�+8u��/�201"&'7326=3�6 
'+�h�c<:auil�v�u��/33�017#533J��B��<u��$Oy��/�201"&'732>=3�; $�0U�

h<*ZyDc5�v�y��/�33017#533J��C��<y�����u��/3�015#53__�u��y�y��/3�015#53ll⇇y�2El�
��/�017#3l::EP��!D-f&���K���!D'l&��������!F'v&����Zp����E`p&��������9H�;&���a��H�4&�c���Z��H�B&���<��
G�k&�
������Im���/�9901'7'm]V#ڑI.nd�?Q��
�	)j3�	3�
�"
6
�
���	�	/	G	.V	�	�	�	R	f�		f0	
�	D	�	,
Y	
 
�	4QCopyright 2010 The Raleway Project Authors (impallari@gmail.com), with Reserved Font Name "Raleway".Copyright 2010 The Raleway Project Authors (impallari@gmail.com), with Reserved Font Name "Raleway".RalewayRalewayBoldBold4.026;NONE;Raleway-Bold4.026;NONE;Raleway-BoldRaleway BoldRaleway BoldVersion 4.026Version 4.026Raleway-BoldRaleway-BoldRaleway is a trademark of Matt McInerney.Raleway is a trademark of Matt McInerney.Matt McInerney, Pablo Impallari, Rodrigo FuenzalidaMatt McInerney, Pablo Impallari, Rodrigo FuenzalidaMatt McInerney, Pablo Impallari, Rodrigo FuenzalidaMatt McInerney, Pablo Impallari, Rodrigo FuenzalidaRaleway is an elegant sans-serif typeface family. Initially designed by Matt McInerney as a single thin weight, it was expanded into a 9 weight family by Pablo Impallari and Rodrigo Fuenzalida in 2012 and iKerned by Igino Marini. It is a display face and the download features both old style and lining numerals, standard and discretionary ligatures, a pretty complete set of diacritics, as well as a stylistic alternate inspired by more geometric sans-serif typefaces than its neo-grotesque inspired default character set.Raleway is an elegant sans-serif typeface family. Initially designed by Matt McInerney as a single thin weight, it was expanded into a 9 weight family by Pablo Impallari and Rodrigo Fuenzalida in 2012 and iKerned by Igino Marini. It is a display face and the download features both old style and lining numerals, standard and discretionary ligatures, a pretty complete set of diacritics, as well as a stylistic alternate inspired by more geometric sans-serif typefaces than its neo-grotesque inspired default character set.http://theleagueofmoveabletype.comhttp://theleagueofmoveabletype.comhttp://pixelspread.comhttp://pixelspread.comThis Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: http://scripts.sil.org/OFLThis Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: http://scripts.sil.org/OFLhttp://scripts.sil.org/OFLhttp://scripts.sil.org/OFL�j2-	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a��������������������	����������bc�d�e�������f����g�����h���jikmln�oqprsutvw�xzy{}|��~�����

��� !"��#$%&'()*+,-./012��3456789:;<=>?@A��BCDEFGHIJKLMNOP��QRSTUVWXYZ����[\]^_`abcdefghijklmnop�qrst��u�vwxyz{|}~�����������������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwx��y�����������z{���|}~������������������������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./01234NULLCRuni00A0uni00ADuni00B2uni00B3uni00B5uni00B9AmacronamacronAbreveabreveAogonekaogonekCcircumflexccircumflex
Cdotaccent
cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve
Edotaccent
edotaccentEogonekeogonekEcaronecaronGcircumflexgcircumflex
Gdotaccent
gdotaccentuni0122uni0123HcircumflexhcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJijJcircumflexjcircumflexuni0136uni0137kgreenlandicLacutelacuteuni013Buni013CLcaronlcaronLdotldotNacutenacuteuni0145uni0146NcaronncaronnapostropheEngengOmacronomacronObreveobreve
Ohungarumlaut
ohungarumlautRacuteracuteuni0156uni0157RcaronrcaronSacutesacuteScircumflexscircumflexuni0162uni0163TcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring
Uhungarumlaut
uhungarumlautUogonekuogonekWcircumflexwcircumflexYcircumflexycircumflexZacutezacute
Zdotaccent
zdotaccentuni018FOhornohornUhornuhornuni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCGcarongcaronuni01EAuni01EBuni01F1uni01F2uni01F3Gacutegacute
Aringacute
aringacuteAEacuteaeacuteOslashacuteoslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217uni0218uni0219uni021Auni021Buni022Auni022Buni022Cuni022Duni0230uni0231uni0232uni0233uni0237uni0259uni02B9uni02BAuni02BBuni02BCuni02BEuni02BFuni02C8uni02C9uni02CAuni02CBuni02CC	gravecomb	acutecombuni0302	tildecombuni0304uni0306uni0307uni0308
hookabovecombuni030Auni030Buni030Cuni030Funi0311uni0312uni031Bdotbelowcombuni0324uni0326uni0327uni0328uni032Euni0331uni0335uni0394uni03A9uni03BCuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0462uni0463uni046Auni046Buni0472uni0473uni0474uni0475uni048Auni048Buni048Cuni048Duni048Euni048Funi0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04AD	Ustraitcy	ustraitcyUstraitstrokecyustraitstrokecyuni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0510uni0511uni0512uni0513uni051Auni051Buni051Cuni051Duni0524uni0525uni0526uni0527uni0528uni0529uni052Euni052Funi1E08uni1E09uni1E0Cuni1E0Duni1E0Euni1E0Funi1E14uni1E15uni1E16uni1E17uni1E1Cuni1E1Duni1E20uni1E21uni1E24uni1E25uni1E2Auni1E2Buni1E2Euni1E2Funi1E36uni1E37uni1E3Auni1E3Buni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Cuni1E4Duni1E4Euni1E4Funi1E50uni1E51uni1E52uni1E53uni1E5Auni1E5Buni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E64uni1E65uni1E66uni1E67uni1E68uni1E69uni1E6Cuni1E6Duni1E6Euni1E6Funi1E78uni1E79uni1E7Auni1E7BWgravewgraveWacutewacute	Wdieresis	wdieresisuni1E8Euni1E8Funi1E92uni1E93uni1E97uni1E9Euni1EA0uni1EA1uni1EA2uni1EA3uni1EA4uni1EA5uni1EA6uni1EA7uni1EA8uni1EA9uni1EAAuni1EABuni1EACuni1EADuni1EAEuni1EAFuni1EB0uni1EB1uni1EB2uni1EB3uni1EB4uni1EB5uni1EB6uni1EB7uni1EB8uni1EB9uni1EBAuni1EBBuni1EBCuni1EBDuni1EBEuni1EBFuni1EC0uni1EC1uni1EC2uni1EC3uni1EC4uni1EC5uni1EC6uni1EC7uni1EC8uni1EC9uni1ECAuni1ECBuni1ECCuni1ECDuni1ECEuni1ECFuni1ED0uni1ED1uni1ED2uni1ED3uni1ED4uni1ED5uni1ED6uni1ED7uni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EDEuni1EDFuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE6uni1EE7uni1EE8uni1EE9uni1EEAuni1EEBuni1EECuni1EEDuni1EEEuni1EEFuni1EF0uni1EF1Ygraveygraveuni1EF4uni1EF5uni1EF6uni1EF7uni1EF8uni1EF9uni2002uni2003uni2007uni2008uni2009uni200Auni200Buni2010
figuredashuni2015minuteseconduni2070uni2074uni2075uni2076uni2077uni2078uni2079uni2080uni2081uni2082uni2083uni2084uni2085uni2086uni2087uni2088uni2089
colonmonetarylirauni20A6pesetauni20A9dongEurouni20ADuni20AEuni20B1uni20B2uni20B4uni20B5uni20B8uni20B9uni20BAuni20BCuni20BDuni2113uni2116servicemarkuni2126	estimateduni2153uni2154	oneeighththreeeighthsfiveeighthsseveneighthsemptysetuni2206uni2215uni2219commaaccentf_ff_f_if_f_ls_tW.ss09G.ss11	i.loclTRKa.ss01a.ss02d.ss03j.ss04l.ss05q.ss06t.ss07u.ss08w.ss09y.ss10c_ta.scb.scc.scd.sce.scf.scg.sch.sci.scj.sck.scl.scm.scn.sco.scp.scq.scr.scs.sct.scu.scv.scw.scx.scy.scz.scuni0414.loclBGRuni041B.loclBGRuni0424.loclBGRuni0492.loclBSHuni0498.loclBSHuni04AA.loclBSHuni0498.loclCHUuni04AA.loclCHUuni0432.loclBGRuni0433.loclBGRuni0434.loclBGRuni0436.loclBGRuni0437.loclBGRuni0438.loclBGRuni0439.loclBGRuni045D.loclBGRuni043A.loclBGRuni043B.loclBGRuni043F.loclBGRuni0442.loclBGRuni0446.loclBGRuni0448.loclBGRuni0449.loclBGRuni044C.loclBGRuni044A.loclBGRuni0493.loclBSHuni04AB.loclBSHuni0499.loclCHUuni04AB.loclCHUuni0431.loclSRBzero.lfone.lftwo.lfthree.lffour.lffive.lfsix.lfseven.lfeight.lfnine.lf	zero.subsone.substwo.subs
three.subs	four.subs	five.subssix.subs
seven.subs
eight.subs	nine.subs	zero.dnomone.dnomtwo.dnom
three.dnom	four.dnom	five.dnomsix.dnom
seven.dnom
eight.dnom	nine.dnom	zero.numrone.numrtwo.numr
three.numr	four.numr	five.numrsix.numr
seven.numr
eight.numr	nine.numrperiodcentered.loclCATuni030C.altbrevecombcybrevecombcy.casehookcytailcyhookcy.casetailcy.casedescendercydescendercy.caseverticalbarcy.caseuni03060301uni03060300uni03060309uni03060303uni03020301uni03020300uni03020309uni03020303
apostrophe��T\����������������#$+,, 0��������$+�
�hDFLTcyrlRlatn0�� !"#$%&BGR VBSH �CHU �SRB ��� !"#$%&��	 !"#$%&��
���� !"#$%&4AZE nCAT �CRT �KAZ "MOL ^ROM �TAT �TRK �� !"#$%&��
 !"#$%&�� !"#$%&�� !"#$%&�� !"#$%&�� !"#$%&�� !"#$%&�� !"#$%&�� !"#$%&'aalt�c2sc�ccmp�ccmpdligdnomfracligalnum$locl*locl0locl6locl<loclBloclHloclNloclTloclZlocl`loclflocllnumrrordnxsalt�sinf�smcp�ss01�ss02�ss03�ss04�ss05�ss06�ss07�ss08�ss09�ss10�ss11�subs�sups�!#$1
	
 %"&'()*+,-./02fnv����������������
"*2:BLT\fnv~�����������������@d����48<N`dhlptx����&.2:\x��������LPTX\`dhlpz~��Mc�������������������������������������yz{|������������������������	

M'()*+-./012356789:;=>?GHJKLMPRSUWX[]_{"#&'������������������&'->>LZhv������������� &,28��kd��l}��mv�n�w�o�	e�p
f�qg�rh�s
i�tj�n���~�����n�����������~����������������&,4<FINOQTVYZ\^,>?NO��,NO������
��NO
��NON
,
+�*�)�(�
'�&�%�$��� {QQ {11�{�{yz{|"#&'yz{|"#&'_N_N_N_N_N	�����,->?�����&',>?.�������������������������������������V�
d}vwefghij��O�c����&F4Tn~n~&4FT�T3�&?sF_
�Y�YHX6"(�KQ�KN�Q�N�KKhFhFiFgIbOaQ]V[Y[Z
��<\Y^�,�
NxDFLTcyrl$latn4������kernmarkmkmk (20������F�`
`���`���Bh�x�(<�P��J8�l����� � �!4!�&�&�&�''F'�&�&�(J(�+Z,,r,�-�.3B48b9T9�;�=�>,>z>�>�??z?�?�@@@D@�@�@�>,A
A(A^A�A�A�DzD�GVG�G�IpI�I�JJ�JNJpJ�K ������!4 �!4!4!4!4&�&�&�&� �&�(J(J(J(J(JR
R-�-�-�-�8bR�T�=�=�=�=�=�=�>�X:>�>�>�>�?�XxX�YlZJ@�@�@�@�@�@�]@]fA�A�A�A�GV>,GV�=��=�]�^� �>z �>z �>z �>z �_ �a�!4>�!4>�!4>�a�>�!4>�&�bN&�bN&�bN&�bN&�?�bl?�&�e�&�fd&�f�f�f�&�?�'f�'F@'�@D'�g�hh�'�'�j�&�@�&�@�&�@�k^k|(J@�(J@�(J@�a�>�,k�,A(,k�,rA^,rA^,rlF,rA^,�l�,�l�m�A�-�A�-�A�-�A�-�A�-�A�-�r�3BDz8bGV8b9TG�9TG�9TG�(J�=�!4>�R]f,rA^,�s?�@�s.!4!4sPs�t$&�&�t�uL'Fu�v�v�!4w8x'F&�&�(Jxpx�yTz�{�(J(J{�|H|�>�}}:A�A�@A�A�@�@�A�>,}�}�GV@�~L~zA�A�~zA�@�@�A�>�>�~�~�D?���@A�GVA��T'F@'F@&�@� �>z8b�^��A�A�?�&�'FA�?��=��=�!4>�!4>�(J@�'FA�A�(J@�(J@�GVGVGVA�A�(J�63BDzA� �>�&�?�&�@�,A(,rA^,؂P3BDz3BDz3BDz9TG�!4>�!4>ڂz��(J@�-�A�8bGV8bGV�ڂ���Z���̇ZJJ��6�<�F�P�n��@D��@DA��⍼���6����4���Ă6���A���ԝ��F������̤��঴�
�(�ªP�.� ���±䳦(J � � ��6A�A�A�@@�@�A�>z>z�<�f�����ȴε4�ZP����&��/��9��;��<��=��>��[��\��^��������������������������������������������&��(��*��8��9��:��;��<��[��]��{����������������������4��B��D��d��f��h�������������������������������@��A��F��G��U��X����������������������������������%��������!������������������
��������������k����&!/9��:��;��<��=!>��?[��\��]^��_�!�!�!�!�!�!�>�
����������������������!�!�!�&��(��*��,��.��0��2��4��6��8��9��:��;��<��=>?@AB[!]>_
`{����������!���������4��B��D��d!f!h>�������������������������������2��@��A��F��G��U��X�����������������������
������&(��,��4��6��9;
<=>F��H��I��J��K��L��O
T��V��Y��Z��[��\��]^���������������������������������������������������������������������	��������������������������������������������������������������������������������������������������
�����������������&'��()��*+��-��/��1��3��5��7��89��:;��<C��[\��]^��_��`��{|�������������������������������
������������������������
��
	��4>��?��BDEde��fg��hi��k��z��{��|��}��������������������������������������������3��@A��FG�������������������������������������������������	������������������������������������������������������������&��/��9;<=>F��H��I��J��L��T��V��X��\�����������������������������������������������������������*�%�����������������������������������������������������������������I�!�����*����������!��#��%��&(*89:<C[��\��]��^��`��z��{���������������������������������������
����
$4?��BDd��e��f��g��h��i��k��{��}�������������������������@F�����������������������������������������������	�����������������;��O[���*��C����������������������D��E���������������������'����;��=��[��]��*����������������������������D��E��������������������������������;��[��*��C����������������������D��E���������������������R��������������������&��(��,��/��4��6��8��;<
=>F��H��I��J��K��L��R��S��T��U��V��W��X��Z��[��\��]��^��_�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������	�����
�������������������������������� ��!��"��#��$��%��-��/��1��3��5��7��8
9��:;��<>��@��B��C��[��\��]��^��_��`��y��z�����������������������������������������������������������������������������������������������������������	��
����
����������%��'��)��/��1��7��9��>��?��BDE��d��e��f��g��h��i��k��w��y��z��{��|��}������������������������
�������������������
���
���
������������3��@A��FG��������������������������������������������������������������������������������������������������������������������������������������������������������������<����&��/9��;��<��=��>��?��A��t���������������������������������&��(��*��8��:��<��=��?��A��[��]��{���������������4��B��D��d��f��h��������������@��F�����H��������&/9��:��;��<��=>��A��q��t��{���������"����������������������&��(��*��,��.��0��2��4��6��8��:��<��[]"{��������������4��B��D��dfh"�����������2��@��F��Q��R�����!9��;��<��>��A��t�������&��(��*��8��:��<��]{������������4��B��D��h�����������@��F�����#9��;��<��>��A��t���
���&��(��*��8��:��<��]
{������������4��B��D��h
�����������@��F�����)������9��;��<��>��A��qt���
������&��(��*��8��:��<��]
{������������4��B��D��h
�����������@��F��QR���'��9��;��<��>��A��q�������&��(��*��8��:��<��]{�����������4��B��D��h�����������@��F��QR����-��&��9;��<��>��������������������������������&(*8��:��<��[��]��{������4B��D��d��f��h���������@��F���;��������������"��&��/��9?f��q��t{��������������������������������������&(*=?A[��]��{���������4d��f��h����Q��R��V��Y��]�����,&��9;��<��>��������������������������������&(*8��:��<��[��]��{������4B��D��d��f��h������������@��F����� ����9��;��<��>��A��t�����&��(��*��8��:��<��{������������4��B��D�������������@��F�����;��*������D�������
;��O�	*������D��������������G����&��9��;��<��>��[��\��^�������������������������������������&��(��*��8��9��:��;��<��[��]��{�������������������4��B��D��d��f��h����������������������������@��A��F��G��U��X����������������(��������	������$��%��;��A��[��m��n��r��~������������
��*��C��_��`�����U����������������������������&��9��;��<��=��>��?A��K��X��Y��Z��[��\��]��^��_��������������������������������������������������������!��#��%��&��'��(��)��*��+��-��/��1��3��5��7��8��9��:��;��<��=>��?@��AB��[��]��z��{��|��������������������4��B��D��d��f��h����������������������������������3��@��A��F��G��U������������������������������������������������������;��=��������%�*U����������
��
�����;��=��A��]��������������*U������������������������[����
�����/���
C�����U�����������������K������������������������ ��%��&��(��,��/��4��6��8��F��H��I��J��K��L��R��S��T��U��V��W��X��Y��Z��[��\��]��^��_��o��q������������������������������������������������������������������������������������������!�������������������������������������������������������������������������������������������������D��
�������!��
�������������������������������� ��!��"��#��$��%��'��)��+��-��/��1��3��5��7��9��;��>��@��B��C��[��\��]��^��_��`��y��z��|����������������������������������������������������������������������������	��
��������������%��'��)��/��1��7��9��>��?��d��e��f��g��h��i��k��w��y��z��{��|��}��������������������������������������������������������3��A��G��Q��R��U��V��Y��]��a��b������������������������������������������������������������������������������������������������������
����������������������������������������;��A��[����*��U������������������������������U�����������������U������������"����
AB[��m��r�������-��������#�*�C��_��`�����U����������������������������$��;��A��[��m��n��r��~����*��C���U�Y�����������������������������;��=��A��]��������������*U���������������������������������������&��/��;��<��=��>��F��H��I��J��L��T��V��X��\]^o��q���������������������������������������������������������������������������������������������������������������������������!�������������!��#��%��8��9:��;<��[��\��]��^��`��z������������������������
����?��B��D��d��e��f��g��h��i��k��{��}�����������������������������@��AF��GQRU��V��Y��]��a�������������������������������������*����&��;��=��A��]���������������������������������������*[��]��d��f��hU������������������������;��A��[�����������������
��*��C��`�����U���������������������������;��=��[��]��n����*U��������������������������������;��������������������%��[��]��m��r�������������*�)�������M�%�����*��!��%��)��C�������U�������������������������������������������������������������������U���������������L����
���������������������������� ��%��&��(��,��/��4��6��8��A	F��H��I��J��K��L��R��S��T��U��V��W��X��Y��Z��[��\��]��^��_��m��o��q��r�������������������������������������������������������������������������������������������1�������������������������������������������������������������������������������������������������5�/����������
�������������������������������� ��!��"��#��$��%��'��)��+��-��/��1��3��5��7��9��;��>��@��B��C��[��\��]��^��_��`��y��z��|��������������������������������������������������������������������������	��
��������������%��'��)��/��1��7��9��>��?��d��e��f��g��h��i��k��w��y��z��{��|��}��������������������������������������������������������3��A��G��Q��R��U��V��Y��]��a��b���
������������������������������������������������������������������������������������������������������������������������������������1������������������������%��A
[��]��m��r��������������5�����8�2�������!��%��B��C�����U�����������������������������	(��,��4��6��8��A
F��H��I��J��K��L��R��S��T��U��V��W��X��Y��Z��[��\��^��m��o��q��r�������������������������������������������������������������������	�8����������������������������������������������	��������������������������������������������������0�5�"����	��
�������������������������������� ��!��"��#��$��%��'��)��+��-��/��1��3��5��7��9��;��C��\��^��_��`��y��z��|���������������������������������������������������������������	��
��������������%��'��)��/��1��7��9��>��?��e��g��i��k��w��y��z��{��|��}���������������������������������������������������������3��A��G��Q��R��U��a��������������������������������������������������������������������������������������������������������<������
��������������������%��A	[��]��m��r�����������������������1����������.�.���������!��%��B��C�����U���
��������������������������[��m��r��������5�
�����C�����U�����������������y(��,��4��6��H��I��J��L��OT��V�����������������������������������������	������������������������������������������������������������&������������������]_��`������������������������������
��
>��?��hk��z��{��|��}��������������������������������������������������������������&(��,��4��6��9��:��;��<��=>��Y��[��\��]^���������%��������������������������������������������������������������������&��'��(��)��*��+��,��.��0��2��4��6��8��9��:��;��<��C��[]%_��{��|��������������������������������������������4��>��B��D��Edfh%z��|�����������������������������������2��@��A��F��G��U��X���������������	�������������������������������
��$��;��A��[��n��~�����U��������������������$��;��=��A��B��[��]��b��~�����U�������������������$;��=��A��[��]��������U��������������	;��[�������U���������������$��;��=��A��[��]�����U�������������������#��%;6=:A!Bb��:�O����Z�L�9�:���U��-;��<��=��A��O�8�����������U��������
��$��;��=��A��[�����U���������������������U��O����$U��

	;��A��������`�����U���������$��;��A��[��m��n��r��~��U��������������
��$��;��=��A��[�����U�����������������������$��;��=��A��B��[��]��b��~�����U�����������������;��=��A��ORU��������
������%;��=��A�����������U�����
��;��=��A��[��]�����U�����������������	;��A�����������U�����������	;��A��[�����U���������������������������%��&��/��9��;��<��=��>��?��A��F��H��I��J��K��L��T��V��X��o��q���������������������������������������������������������������������������������������������������������������������������������������������!��#��%��&��(��*��8��:��<��=��?��A��[��\��]��^��`��z��{������������������������������������
����4��?��B��D��d��e��f��g��h��i��k��{��}�����������������������������@��F��Q��R��U��V��Y��]��a�������������������������������������������
������%;��=��A��~�������U�����(��,��4��6��9��;��<��>��F��H��I��J��K��L��T��V��X��o��q���������������������������������������������������������������������������������������������������������������������������������������������������������!��#��%��&��(��*��8��:��<��\��^��_��`��z��{���������������������������������������
����4��>��?��B��D��e��g��i��k��z��{��|��}��������������������������������@��F��Q��R��U��a������������������������������������������������������������%��;��=��A�����������U��;��A�����������U�����s(��,��4��6��H��I��J��L��OT��V���
������������������������������������������������������������������������������������������������$��	����������������]
_��`�����������������������
��
>��?��h
k��z��{��|��}���������������������������������������������������������O6��
�;&��;��<>������������������������������	8:��<��[����B��D��d��f������@��F�����O4���9;��*���������D��������������������������������$;��=��[��]��*��������������������������������������D��E��������������������������������&'��(��)��*��+��,��-��.��/��0��1��2��3��4��5��6��7��8��9��:��;��<��=>��?F��G��H��I��J��K��L��M��N��OLP��Q��R��S��T��U��V��W��X��Y��Z��[��\��]^��_�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������R�������������������������������	��
������������������������������������������ ��!��"��#��$��%��&��'��(��)��*��+��,��-��.��/��0��1��2��3��4��5��6��7��8��9��:��;��<��=>?@ABC��[\��^��_��`��y��z��{��|���������������������������������������������������������������������������������������������������������	��
������
����������������%��'��)��/��1��4��6��7��9��>��?��B��D��O��T��c��de��fg��i��j��k��w��y��z��{��|��}��������������������������������������������������������������������������������
������������2��3��@��A��F��G�������������������������������������������������������������������������������������������������������������������������������������������������������������������'����;��<��=��>��A��]���������������*8��:��<��B��D��������@��F��U������������������������y��������������$��&��/��8��9��;��<��=��>��?��A��B��F��]��^��b����������������������������������������������������������������������������� ��"��$��&��(��*8��:��;��<��=��?��A��[��\��]��^��y��{��������������������������4��B��D��d��e��f��g��h��i��������������������������@��A��F��G��TU��V��WX��Y��]������������������������������&��'��(��)��*��+��,��-��.��0��1��2��3��4��5��6��7��8��9��:��;��<��=��>��?��A��K��X��Y��[��\��]��^��_�������������������������������������������������������������������������������������������������������������������������������������
�������������������	������������������������ ��!��"��#��$��%��&��'��(��)��*��+��,��.��0��2��4��6��8��9��:��;��<��=��>��?��@��A��B��[��]��_��y��z��{��|�������������������������������������������������������4��6��>��B��D��T��d��f��h��j��z��|�������������������������������������������������������
������2��@��A��F��G��U��X��������������������������������������������������$;��=��A��O[��]��������U��������������
A����U���4*$B	GMNOPQ	b~
���������
�������					�
Oc�TU��WX�����7

%$ABGMNOPQbn~�����������������
Oc�TU��WX����������$&��'��)��*��+��-��.��/��0��1��2��3��5��7��8��9��:��;��<��=��>��?��AK��Y[��\��]��^��_���������������������������������������������������������������������������������������������������������������������������	�������������� ��"��$��&��'(��)*��+,��.��0��2��4��6��8��9��:��;��<��=��>��?��@��A��B��[��]��y��{��|���������������������������������������������4��6��B��D��T��d��f��h��j�����������������������������������������������
����2��@��A��F��G�������������������������������	������������������$������$��;��=��A��B��[��\��]��^��b��~����������9��;�������������������������A��G��U�����������������5��������	������$��%��;��A��L��Ou[��^��m��n��r��~�������������������*��;��C��_��`�������������������A��G��U�����������������������������$��;��A��OV[��n��~�����U���������������Fcc�^$0;��A}BvGiKMiNiOfPiQkR
S
U
W
Y3Z[\$] ^ _aUbrjTmnCr~)�����i�i�i�i�(�
����� �\� �i�i�i�i�i�i�i�i�i�kkkkk







'3)3+3-/13579$; >@B3|3�i�
�
�
�
�
�
�
�
�
� �
�
�



i	
i
ii
i

 
%
'
)
/
1
7
9
Oiciw
y
� � � �
�
�$�
�i�
�
�3�$�$�$�i3A G TIUpWIXp�~��
����f�g�&��� �i����i�
�
�����

;��[�������U�����������[�����
�����/���
C��]���hU�����������������;��=��A��OU���������(��,��4��6��:��F��H��I��J��K��L��T��V��X��Y��Z��[��_������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������!��#��%��'��)��+��,��-��.��/��0��1��2��3��4��5��6��7��>��@��B��\��^��_��`��z��|�����������������������������
����>��?��e��g��i��k��z��{��|��}������������������������2��3��U������������������������������������������������������������
�������������������������8=(A;B+GMNOPQa	b&jn�����������������
Oc�TU$WX$�:����#AB	b	����U���	A
����U���	O1��������U�����O>����U��4*$B	GMNOPQ	b~
���������
�������					�
Oc�TU��WX���������$��;��A��OA[��m��n��r��~��U��������������;����������$��9��;��<��>��A��[��m��n��r��~�������&��(��*��8��:��<��C��{������������4��B��D�������������@��F��T��U��W��X���������������������������e�� <<Z9$;��AWBOGBK��MBNBO?PBQDY[\]^a/bKj-m��nr��~�
�B�B�B�B���3���B�B�B�B�B�B�B�B�B�DDDDD%#')+9;B"|�B�BB
BBBOBcB�����B����BAGT$UIW$XI�W��������������=�@����B�B4����$��;��A��KY[��\��]^��_m��n��r��~�������')+9��;��>@B|����������������������A��G��U������������������O��������U�������$��;��=��A��O#[�����U�����������������
������%;��=��A���������U�������
��%;��=��A	BQ����������U��X������;��=��A��O[��]�����U�����������������
;��A��Og���������U�����������H##?"$;��A9B2G$M$N$O$P$Q%Yab.jn~
������$��$�$���$�$�$�$�$�$�$�$�$�%%%%%%')+|�$���$$
$$$O$c$�$�$TU,WX,�:�$�$�������$�$C���������������������������� ��%��&��(,/��46F��H��I��J��K��L��R��S��T��U��V��W��X��Z��[��\��]��^��_��mo��q��r��������������������������������������������������������������������������*�)��������������������������������������������������������������������������������������������M�%��������*��
����������������������!��#��%��)��-��/��1��3��5��7��9��;��>��@��B��C[��\��]��^��_`��z��������������������������������������������������������������������	��
��������������%��'��)��/��1��7��9��>?��d��e��f��g��h��i��k��w��y��z{��|}���������������������������������������������������3��A��G��Q��R��U��V��Y��]��a��b�������������������������������������������������������������������������������������������������������������������������������������������
;��A��OO[�����U��������������
;��A��O$���������U�������������A��o��q�����Q��R��a��������$��A���������������������������T��U��W��X��;��=��������%�*�����������������
U����������
��
�,��;��=��[��]��n����*���������������������������������U���������������������������������������������������������������������U��V��Y��]������������������$��A�������������T��U��W��X��C������������	������$��%��;��A��[��m��n��o��qr��~������������
��*��C��_��`�����������������������������������D��E��QRT��U��W��X��a���������������������������$�������������������������������E�������������������������������������
D��E��8������
AB[��m��o��q��r�������-��������#�*�C��_��`���������������������
"DEQ��R��U��VY]a�����������������������������������������������������
	D��E����������o��q����������������������
EQRV��Y��]��a��;��=��������%�*�����������������
U����������
��
�^���������������������������� ��%��[��]��m��o��q��r���������������*�)�������M�%�����*��!��%��)��C����������������������������������������
&E����Q��R��U��V��Y��]��a��b���������������������������������������������1��������;��=��A��B��]��������������*��������������������������������D��U��V��Y��]��������������������������A
o��q�����������������������
6DE��Q��R��a��������$��;��A��[��n��~����������E��T��U��W��X�������������� ����������$��;��=��A��B��[��]��b��~������������������������E��U�����������������������$��A����������E��TU��WX����
A��o��q������Q��R��a����������$��A����������E��TU��WX��������$;��=��A��[��]��o��q�������������EQRTU��WX��a������������������������A��B��o��q�������Q��R��V��Y��]��a��b��o��q�������Q��R��a��H������$��;��=��A��[���������� T��U��W��X�����������������������$;��=��A��[��]��o��q���������QRTU��WX��a��������������������;��=��A��[��]���������������TU��WX�����������������$$ABb����
HTU��WX����U��������$��;��=��A��[����������T��U��W��X�����������������
"a���������������������������������� ��%��A[��]��m��o��q��r�������������������������1����������.�.���������!��%��B��C�����������������������������������������D
E��Q��R��U��V��XY��]��a��b���
��������������������������Ao��q������QRVY]a��;��=��A��U��������
;��A��O(���������U�����������O:��������U�����OI����U��������#�C������������������
����������%��F��G��H��I��J��K��L��M��N��O��P��Q��R��S��T��U��V��W��X��Y��Z��[��\��]��^��_������������������������������������������������������������������������������������������������������������������������������������������������������������������
����������������������!��#��%��'��)��+��-��/��1��3��5��7��9��;��>��@��B��C\��^��`��z��|����������������������������������������������������������������������������	��
������
����������������%��'��)��/��1��7��9��?��DO��c��e��g��i��k��w��y��{��}���������������������������������������������������������3��A��G�������������������������������������������������������������������������������������������������������������������������������������������������;��O([���.*��C����������������������'D��E�������������������������%��������+��C���������������������
D�������	���A����������������#��%;6=:A!Bb��6�L����W�I�5�6���U��-����U��6����	���������������������������� ��%��&��(��,��/��4��6��8��AF��H��I��J��K��L��R��S��T��U��V��W��X��Y��Z��_��m��o��q��r�������������������������������������������������������������������������������������������*�����������������������������������������������������������������������������������������������3�'����������
�������������������������������� ��!��"��#��$��%��'��)��+��-��/��1��3��5��7��>��@��B��C��[��\��]��^��_��`��y��z��|�������������������������������������������������������������������������	��
������������%��'��)��/��1��7��9��>��?��d��e��f��g��h��i��k��w��y��z��{��|��}�����������������������������������������3��Q��R��U��V��Y��]��a��b������������������������������������������������������������������������������������������������������������������������������������v��������&��/��9��;��<��=��>��?��A��F��K��[��\��]��^���������������������������������������������������������������������	&��(��*8��9��:��;��<��=��?��A��[��\��]��^��{�����������������������4��B��D��d��e��f��g��h��i�����������������������������@��A��F��G��U��V��Y��]��������������������������������������������������$��'��(��)��*��+��,��-��.��0��1��2��3��4��5��6��7��8��9��:��;��<��=��>��?��A��K��Y��[��\��^����������������������������������������������������������������������������������������������������������������������������	���������������������� ��"��$��&��'��(��)��*��+��,��.��0��2��4��6��8��9��:��;��<��=��?��A��_��y��{��|��������������������������������������������������4��6��>��B��D��T��j��z��|����������������������������������������������������
������2��@��A��F��G��T��U��W��X������������������������������������������:��?������������������,��.��0��2��4��6��=��?��A���2��U��OR����U��:��?������������������,��.��0��2��4��6��=��?��A���2��U��
;��<��=��A��Ov8�����������U���������������������%&��/��9��;��=��>��?��A��FH��I��J��L��T��V��o��q����������������������������������������������������������������������������������������������������������������������&��(��*��:��<��=��?��A��[��\]��^`��{���������������������������������
��4��?��B��D��d��ef��gh��ik��{��}������������������@��F��Q��R��U��V��Y��]��a��b����������������������������������&��/��9��;��=��>��?��A��F��H��I��J��K��L��T��V��X��o��q���������������������������������������������������������������������������������������������������������������������������������������������!��#��%��&��(��*��:��<��=��?��A��[��\��]��^��`��z��{������������������������������������
����4��?��B��D��d��e��f��g��h��i��k��{��}�������������������@��F��Q��R��U��V��Y��]��a��������������������������������������������������������%��&��/��9��;��=��>��?��A��F��H��I��J��K��L��T��V��X��o��q���������������������������������������������������������������������������������������������������������������������������������������������!��#��%��&��(��*��:��<��=��?��A��[��\��]��^��`��z��{������������������������������������
����4��?��B��D��d��e��f��g��h��i��k��{��}��������������������@��F��Q��R��U��V��Y��]��a�������������������������������������������n������	����$��(��,��4��6��9��:��;��<��>��A��m��n��o��q��r��~�����������������������������������������������������������������&��(��*��,��.��0��2��4��6��8��:��<��_��{��������������������4��>��B��D��z��|���������������2��@��F��Q��R��T��U��W��X��a��������������������������������������G��$��&��9��:��;��<��=��>��A�����������������������������������������������&��(��*��,��.��0��2��4��6��8��:��<��[��]��{��������������4��B��D��d��f��h�������������2��@��F��U��X�����������������@��$&��9��;��<��>��A��o������������������������������&��(��*��8��:��<��[��]��{��������������4��B��D��d��f��h�������������@��F��TU��WXa������������������������T����������$��&��/��8��9��;��<��=��>��?��A��B��b���������������������������������������� ��"��$��&��(��*��8��:��<��=��?��A��[��]��y��{�������������������4��B��D��d��f��h����������������@��F��T��U��W��X������������������������)9��;��<��>��A��o��q���&��(��*��8��:��<��{������������4��B��D����������@��F��QRU��a��b�����������D��������&��/��9��=��>��?��o��q���������������������������������&��(��*��:��<��=��?��A��[��]��{�����������������4��B��D��d��f��h�����@��F��QRU��V��Y��]��a��b�����������������8������$��9��:��;��<��>��A���������������������&��(��*��,��.��0��2��4��6��8��:��<��]{�����������4��B��D��h�����������2��@��F��TU��WX�������������;��A��U��7����&��9��;��<��=��>��?��A��������������������������������&��(��*��8��:��<��=��?��A��[��]��{��������������4��B��D��d��f��h��������������@��F��U�������H����
(��,��4��6��9��>��o��q��������������������������������������������������&��(��*��:��<��_��{��������������������4��>��B��D��z��|���������@��F��Q��R��U��a�������������������������q����������$��(��,��4��6��9��:��;��<��>��A��m��n��o��q��r��{��~���������������������������������������������������������������&��(��*��,��.��0��2��4��6��8��:��<��]_��{��������������������4��>��B��D��hz��|���������������2��@��F��Q��R��T��U��W��X��a��b����������������������������������������$��;��=��A��B��b�����U������������������������G����������&��/��9��;��<��=��>��?��A��B��b�����������������������������������&��(��*��8��:��<��=��?��A��[��]��{�����������������4��B��D��d��f��h���������������@��F��U��V��Y��]������������������&����$��&��;��=��A��B��b������������������������������[��]��d��f��hU������������������������c������$��(��,��4��6��9��:��;��<��>��A�������������������������������������������������������������&��(��*��,��.��0��2��4��6��8��:��<��_��{��������������������4��>��B��D��z��|������������������2��@��F��TU��WX�������������������������������������7&��9��;��<��=��>��A��������������������������������&��(��*��8��:��<��[��]��{��������������4��B��D��d��f��h�������������@��F��U��X����������������<����������%��&��/��9��=��?��o��q��������������������������������&��(��*��=��?��A��[��]��{�����������������4��d��f��h�����Q��R��U��V��Y��]��a��b���������������<����&��/��9��;��<��=��>��?��A��������������������������������������&��(��*��8��:��<��=��?��A��[��]��{�����������������4��B��D��d��f��h��������������@��F��U���������u������������%��&��(��,��/��4��6��8��9��=��>��?��o��q��~���������������������������������������������������������������������������� ��"��$��&��(��*��:��<��=��?��A��[��]��_��y��{����������������������������4��>��B��D��d��f��h��z��|������������@��F��Q��R��U��V��Y��]��a��b����������������������������v������������%��&��(��,��/��4��6��8��9��=��>��?��o��q��~���������������������������������������������������������������������������� ��"��$��&��(��*��:��<��=��?��A��[��]��_��y��{����������������������������4��>��B��D��d��f��h��z��|������������@��F��Q��R��U��V��Y��]��a��b����������������������������H��(��,��4��6��9��>o��q��~������������������������������������������&��(��*��:<_��{��������������������4��>��BDz��|���������@FQ��R��U��a�������������������������p�������������� ��%��&��(��,��/��4��6��9��=��>?��o��q��~��������������������������������������������������������������������������&��(��*��:<=��?��A��[��]��_��{��������������������������4��>��BDd��f��h��z��|����������@FQ��R��U��V��Y��]��a��b������������������������������%��9��;��<��>��o��q�����&��(��*��8��:��<��{������������4��B��D����������@��F��Q��R��U��a������������
����A��VY]����������A��qt�����QR��q���QR�������A��t���������������"��Af��q��{��������Q��R��V��Y��]�����������������	����A��VY]�c��_	 ""%AFa8eeTggUjjVooWqqXttY{{Z[��\������C�[`y|��"��$��(��-��/��2��5��6��9��<��>��@��CXY
_d%%i01j47l>?pBBrDEsKKuMMvOOwTUx``zcm{pp�ww�y}�����������������������������������������������
��23�@A�FG�QR�TY�ac�||�������������������������������������������	(` 4;4���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������G����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������+37���������)����������������������������������������������������������������������������������������������������������������������������������44')'..	+
&
(/& %0)31	




&	
	
	
	
((+   





%%%	+!!","9	,,!!#$#&
$$
!:-78"#78	
--"#( %
))56'56'01/****22"			$$
#
3))%%	"



&('						!

			

"



	!

"#
	-#

./0,  12
,
3$
 $$
		!

*+*+&'#

 (g &&(*,46:<<>?FZ\\1^_2oo4qq5{{67��8��O��U��e��k������C�[`�y|��������������������
��������������������(�*
7E*1G47O>?SBEUKKYMMZOO[TU\``^cm_ppjrskwwmy}n��s��t��u��v��w��x��|��}���������������������
��23�@A�FG�QR�TY�ab�����������������������������������������������4~DY|���������������������$*06<BHNTZ`flrx~��������������������� &,28>DJPV\bhntz����������������������
"(.4:@FLRX^djpv|���������������������$*06<BHNTZ`flQ�[�|�xJ�ffcF�F7y�tw�uuc����f�`���P$c���}�}|��y�zc9�V:�@;�6w���w��I�JF�:+01CrCC/08@�..��!�����=./��/}/�{����(��,0�3B������d����Q�I��4�7��T��eJ�W�K8��i����3�} u�,))
v�u`�W�Wk�wn�l�mi�9J�J���t�t;�;/�/'�'y�y���O�#,Y&()*,-./01234789:<>?FHIJLMNPQRSTWXYZ\^_n~����������������������`lm�����������������������$+ ���������������������$*06<�Y����n�3�����T��n�y�����$�������:.J
n�9�9��E�]���������� &,28n�y������*06<BHNTZ`flrx~�����������������n���3����T�����������+�Y�+����
��$+��$+^djpv|������������������Y����n�3�����T�������"������դ'��^#�+tvfonts/raleway/Raleway-Regular.eot000064400000502264151215013460013064 0ustar00�����LP��[ P� �{RalewayRegularVersion 4.026Raleway Regular FFTM������GDEF2�,��t�GPOS�JJo����GSUB����OS/2��gX�`cmap^-R���cvt ��)��fpgm��Z��gasp�lglyf��'2�!head��,6hhea��d$hmtx&���loca�'�*@\maxp�\� nameA�MS�4posta�1�a�#�prepO(�(��{�_<����^#�+tv�(� u��?�(�M--in/��QO��XK�X^27��P [NONE�
����� �� 
`2M��\$E�%k&�(�/�E
, A>�4�P�A�A\d7�.	,&"!#[4"Q2J$�A�F�!�D�7�"E/��Y�*�YaYMY�*�Y�Y��YGYmYY�*nY�*�Y_ b�O�
x�uX82+�A�1!!iK%'n(K'Jj(GK�K�KN�KGKS'iKi(_K� ORF-��5�V2�B��[1+�45��W�/I=@0�0=)FI:A@0�6
2�H�$�#�1lRZ"�A#"�,=?"'"�#�!����������*aYaYaYaY��Y���"Y�*�*�*�*�*�@�*�O�O�O�O�[Y'K!!!!!!!!!!!!�!%'K'K'K'K'��K���Z*GKS'S'S'S'S'CS'RFRFRFRF[K�!!�!!�!!�*%'�*%'�*%'�*%'�Yn(�"n(aYK'aYK'aYK'aYK'aYK'�*j(�*j(�*j(�*j(�YGK�,G�������������!��Y�K�Y�K����YKKGYNGYNGYNGY:NN$
YGKYGKYGKG���YGK�*S'�*S'�*S'�*
'�Y_K�Y_I�Y_K_ � _ � _ � _ � bObO�!Q�ORF�ORF�ORF�ORF�ORF�ORF-��u�u�u���*S'�ORF?Y�YY((Y'Y�N�Y�Y(K�*j(�*S'1Y�YY(�*i'�!!����!�*S'�!!�!!aYK'aYK'��������*S'�*S'�Y_/�Y_K�ORF�ORF_ � bO�*S'�*S'�*S'���K�E�E�"�1�#�#J*J*�W�6�E�E�W+�2�#�5�,F+11*:6+2=�#+*%+"22=9#5+62��-XKMaYaY�Y�*_ �Y���&�Y�zY�]h�Y��Y�YY�&aY�!-�]�]zY�&mY�Y�*�YnY�*bh+*x�Y�E�Y�Y�SYbY�0�Y}A!!`;J�JDK'&�RJRJJ9�JGJS'8JiK%'��'�CJ:J7JM�J�J-&
K$K'K'9�J.'� �K��"+JIJRJ5J����&�*R'�
)�]RJ{!hSaCY�J���zY�J�&!-��YJkY"K����CYbJ�YJ8Y\JS43;�*%'b��
+ �r��E:�E:�YGKc�c��Y�&cS�J�&9�YGJ�YGJ�E�:mY�J�K�!!�!!����!aYK'�K�K�&!-�4-���]RJ�]RJ�*S'�*R'�*R'�0-&hhh�E:Y�JSY�J"�����)�#�&9�*i(-�TKC�YGK��8���&9�*%'�Yn(�Yn(aYK'aYK'aYK'�*j(�YGK�YGK��GYNGYmY�KYGKYGKYGK�*S'�*S'�*S'�*S'�Y_K�Y_��_ � _ � _ � _ � _ � bObO�ORF�ORF---�u�OwK�!!�!!�!!�!!�!!�!!�!!�!!�!!�!!�!!�!!aYK'aYK'aYK'aYK'aYK'aYK'aYK'aYK'�3�
�Y�K�*S'�*S'�*S'�*S'�*S'�*S'�*S'�*S'�*S'�*S'�*S'�*S'�ORF�ORF�ORF�ORF�ORF�ORF�ORF����C����d�A�A:A�A�A�@�@�P<@7@WP�'�)_V�A*.�E�E`)`?��(�&�v�(c�&� �&"�$�#�v�(c�&�!'(d�1K%�Y^)n)!!�_n�*>7�*b�+N"�O;5HtY�6�>�-[+0"�#8"�#�S6S'f� DL���A��-,	�A�S�>�A��9F�G�1+#&�*�K!l(j(�K�Qi(<NF=p'JCTS,mTTTk,�T�T�2T�T�T�T�,T�,:T
$�KL�)
2(%��)(MY!-�*!-�*;N:j(&�RFRFRFKGK�KgF�F�DF|�J%'�%'Y)�0�*E/H09,([4	Q2[,�&"�$�#�v�(c�&�!�&"�$�#�v�(c�&�!�&"�$�#�v�(c�&� �A1$+�;����2+*+X��/& �����d
~~��������-37Y����$(.15����_cku�)/	!%+/7;IS[io{������       " & 0 3 : D p y � � � � � � � � � �!!! !"!&!.!T!^""""""""+"H"`"e%�����
 ����������*07Y����#&.15����bjr�$. $*.6:BLZ^lx������         & 0 2 9 D p t � � � � � � � � � �!!! !"!&!.!S![""""""""+"H"`"d%��������������������l�j�e�a�S�Q�N�-�����������������������|��
�����������������~�x�t�����������z�x�r�p�n�f�b�Z�X�U�O�N�F�C�?�>�<�;�:�7�.�-�(��������������������������u�s�j�i�f�_�;�5��������s�W�@�=�����
	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abc��������������������������������Ztfgk\z�rm�xl����u��iy�����n~����ep�D��o]d���QRWXTU���<c|ab��[{VY^������������������s���|���@J������������~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSQPONMLKJIHGF(
	,�
C#Ce
-,�
C#C-,�C�Ce
-,�O+ �@QX!KRXED!!Y#!�@�%E�%Ead�cRXED!!YY-,�C�C-,KS#KQZX E�`D!!Y-,KTX E�`D!!Y-,KS#KQZX8!!Y-,KTX8!!Y-,�CTX�F+!!!!Y-,�CTX�G+!!!Y-,�CTX�H+!!!!Y-,�CTX�I+!!!Y-,# �P��d�%TX�@�%TX�C�Y�O+Y#�b+#!#XeY-,�!T`C-,�!T`C-, G�C �b�cW#�b�cWZX� `fYH-,�%�%�%S�5#x�%�%`� c  �%#bPX�!�`#  �%#bRX#!�a�!#! YY���`� c#!-,�B�#�Q�@�SZX�� �TX�C`BY�$�QX� �@�TX�C`B�$�TX� C`BKKRX�C`BY�@���TX�C`BY�@��c��TX�C`BY�@c��TX�C`BY�&�QX�@c��TX�@C`BY�@c��TX��C`BY�(�QX�@c��TX��C`BYYYYYYY�CTX@
@@	@
�CTX�@�	�
��CRX�@���	@��CRX�@��	@���CRX�@��	@�@�	YYY�@���U�@c��UZX�
�
YYYBBBBB-,E�N+#�O+ �@QX!KQX�%E�N+`Y#KQX�%E d�c�@SX�N+`!Y!YYD-, �P X#e#Y��pE�CK�CQZX�@�O+Y#�a&`+�X�C�Y#XeY#:-,�%Ic#F`�O+#�%�%I�%cV `�b`+�% F�F`� ca:-,��%�%>>��
#eB�#B�%�%??��#eB�#B��CTXE#E i�c#b  �@PXgfYa� c�@#a�#B�B!!Y-, E�N+D-,KQ�@O+P[X E�N+ ��D �@&aca�N+D!#!�E�N+ �#DDY-,KQ�@O+P[XE ��@ac`#!EY�N+D-,#E �E#a d�@Q�% �S#�@QZZ�@O+TZX�d#d#SX�@@�a ca cY�Yc�N+`D-,-,-,�
C#Ce
-,�
C#C-,�%cf�%� b`#b-,�%c� `f�%� b`#b-,�%cg�%� b`#b-,�%cf� `�%� b`#b-,#J�N+-,#J�N+-,#�J#Ed�%d�%ad�CRX! dY�N+#�PXeY-,#�J#Ed�%d�%ad�CRX! dY�N+#�PXeY-, �%J�N+�;-, �%J�N+�;-,�%�%��g+�;-,�%�%��h+�;-,�%F�%F`�%.�%�%�& �PX!�j�lY+�%F�%F`a��b � #:# #:-,�%G�%G`�%G��ca�%�%Ic#�%J��c Xb!Y�&F`�F�F`� ca-,�&�%�%�&�n+ � #:# #:-,# �TX!�%�N+��P `Y `` �QX!! �QX! fa�@#a�%P�%�%PZX �%a�SX!�Y!Y�TX fae#!!!�YYY�N+-,�%�%J�SX���#��Y�%F fa �&�&I�&�&�p+#ae� ` fa� ae-,�%F � �PX!�N+E#!Yae�%;-,�& �b �c�#a �]`+�%�� 9�X�]�&cV`+#!  F �N+#a#! � I�N+Y;-,�]�	%cV`+�%�%�&�m+�]%`+�%�%�%�%�o+�]�&cV`+ �RX�P+�%�%�%�%�%�q+�8�R�%�RZX�%�%I�%�%I` �@RX!�RX �TX�%�%�%�%I�8�%�%�%�%I�8YYYYY!!!!!-,�]�%cV`+�%�%�%�%�%�%�	%�%�n+�8�%�%�&�m+�%�%�&�m+�P+�%�%�%�q+�%�%�%�8 �%�%�%�q+`�%�%�%e�8�%�%` �@SX!�@a#�@a#���PX�@`#�@`#YY�%�%�&�8�%�%��8 �RX�%�%I�%�%I` �@RX!�RX�%�%�%�%�%�%I�8�%�%�%�%�
%�
%�%�q+�8�%�%�%�%�%�q+�8�%�%����8YYY!!!!!!!!-,�%�%��%�%� �PX!�e�hY+d�%�%�%�%I  c�% cQ�%T[X!!#! c�% ca �S+�c�%�%��%�&J�PXeY�& F#F�& F#F��#H�#H �#H�#H �#H�#H#�#8�	#8��Y-,#
�c#�c`d�@cPX�8<Y-,�%�	%�	%�&�v+#�TXY�%�&�w+�%�&�%�&�v+�TXY�w+-,�%�
%�
%�&�v+��TXY�%�&�w+�%�&�%�&�v+�w+-,�%�
%�
%�&�v+���%�&�w+�%�&�%�&�v+�TXY�w+-,�%�%�%�	&�v+�&�&�%�&�w+�%�&�%�&�v+�w+-,�%�%J�%�%J�%�&J�&�&J�&c��ca-,�]%`+�&�&�
%9�%9�
%�
%�	%�|+�P�%�%�
%�|+�PTX�%�%��%�%�
%�	%��%�%�%�%��%�%�%����v+�%�%�%�
%�w+�
%�%�%����v+�%�%�
%�%�w+Y�
%F�
%F`�%F�%F`�%�%�%�%�& �PX!�j�lY+�%�%�	%�	%�	& �PX!�j�lY+#�
%F�
%F`a� c#�%F�%F`a� c�%TXY�
& �%:�&�&�& �:�&TXY�& �%:��# #:-,#�TX�@�@�Y��TX�@�@�Y�}+-,��
��TX�@�@�Y�}+-,�TX�@�@�Y
�}+-,�&�&
�&�&
�}+-, F#F�
C�C�c#ba-,�	+�%.�%}Ű%�%�% �PX!�j�lY+�%�%�% �PX!�j�lY+�%�%�%�
%�o+�%�%�& �PX!�f�hY+�%�%�& �PX!�f�hY+TX}�%�%Ű%�%Ű&!�&!�&�%�%�&�o+Y�CTX}�%��+�%��+  ia�C#a�`` ia� a �&�&��8��a iaa�8!!!!Y-,KR�CSZX# <<!!Y-,#�%�%SX �%X<9Y�`���Y!!!-,�%G�%GT�  �`� �a��+-,�%G�%GT# �a# �&  �`�&��+����+-,�CTX�KS�&KQZX
8
!!Y!!!!Y-,��+X�KS�&KQZX
8
!!Y!!!!Y-, �CT�#�h#x!�C�^#y!�C#�  \X!!!��MY�� � �#�cVX�cVX!!!��0Y!Y��b \X!!!��Y#��b \X!!!��Y��a���#!-, �CT�#��#x!�C�w#y!�C��  \X!!!�gY�� � �#�cVX�cVX�&�[�&�&�&!!!!�8�#Y!Y�&#��b \X�\�Z#!#!�Y���b \X!!#!�Y�&�a���#!-@�?4>U>U=(�<(�;'�:'�9'�8&�7%�6%�5$�4$d3#�2#�1"�0"�/!�. �-�,�+�*�)�!� �����@�[@�[@�[@�[@�ZKUKUYY
KUKUYY2UK
UKU2UYp
YY?_����Y?O_�	dUdUYY_�@@���T+K��RK�	P[���%S���@QZ���UZ[X��Y���BK��SX�BY�CQX��YBs++++s+s++s+++++++++++++++++++++++++++++++++++++++++++++++�
�;�������+���
��'%(����J�222222Pj�6�0Rv�����Jx�:|��V���:�$b��"Hh���		<	T	~	�	�

d
�
�B`���$:Rl|��
@
|
�R���,Tx��6���Dx��4f���88R�d��DL�$Rfv��"J���"dt|�� ���� 2DX�������0j|�����"4FXj��&6H\��
.@P`p���(8Jp���   & p � � � � � � � �!!!&!8!J!\!n!�!�!�"0"B"R"d"v"�"�"�"�"�"�"�"�###0#B#V#h#z#�#�#�$
$$,$<$N$^$j$|$�$�$�$�$�$�$�%%(%:%L%`%t%�%�%�%�%�&&&0&D&X&j&|&�&�'''.'@'R'd'v'�(H(Z(l(�(�(�(�(�(�(�(�)))&)6)B)N)`)l)�)�)�)�***&*8*L*`*r*�*�*�*�*�*�*�*�+++,+>+P+`+�+�,,,0,D,�,�-~-�-�-�-�-�-�-�-�-�....&.8.J.�.�.�.�///(/:/L/\/n/�/�/�/�/�/�/�/�00 020D0V0h0x0�0�0�0�0�0�0�11*1D1\1t1�1�1�1�1�242<2D2L2`2�2�2�2�2�2�2�2�3
333"3*3^3f3z3�3�3�3�44$4<4f4�4�4�4�55$5H5X5p5�5�5�5�66666�6�7777b7t7�7�7�7�7�8.8r8�8�8�8�8�99:9B9X9�9�9�:&:H:Z:�:�:�:�:�:�:�:�:�;&;x;�;�;�;�<"<X<�<�==`=�=�=�>6>L>�>�>�??2?B?h?�?�?�?�?�@@@(@Z@�@�@�AA*ATA�A�A�B6B�B�B�B�C*C<C�C�C�C�C�C�D*DfDxD�D�D�D�E6EnE�E�E�E�FFF.FjF�F�G<GVGnG�G�G�H:H�H�I(I4IlI�I�JJ:JnJ�J�J�J�K&KTK�K�L\L�MMPMdMxM�M�M�M�N6NpN�N�N�N�OO>OlOtO�P>P�QQ"Q4QFQ�Q�Q�Q�RRR$R8RpR�R�R�R�R�R�SSS S(S:SJSRSZSlS~S�S�S�S�T
THTZTjT|T�T�T�UUPUbUtU�U�U�U�U�U�U�VVV&V8VJV\VnV�V�W*WpW�W�X.X�X�X�X�X�X�X�X�X�X�YYY Y4YHY^YtY�Y�Y�Y�Y�Y�ZZ$Z:ZPZbZrZ~Z�Z�Z�Z�Z�Z�[[[,[8[L[^[p[�[�[�[�[�[�\
\"\:\R\j\�\�\�\�\�\�\�]
]]6]N]f]~]�]�]�]�]�^^^6^P^h^z^�^�^�^�^�^�^�__ _2_�_�_�_�_�_�```,`@`T`h`|`�`�`�`�`�`�aa&a:aNada�a�a�a�a�a�a�bbb(b<bPbdbxb�b�b�b�b�b�cc$c8cJcZcnc�c�c�c�c�c�c�dd2dDdVdhdzd�d�d�d�d�d�d�ee e0eBeTefexe�e�e�e�e�e�e�fff(f:fJf\flflflflflflflflftf�f�f�f�f�f�f�gg$gHghg�g�g�h�h�h�h�h�h�i>ifi�i�jjtj�j�k(khk�k�l"lnl�l�m0m�m�n"nVn�oXo�ppJptp�qqxq�q�r8rnr�r�s6s�s�t$ttt�t�u`upu�u�u�u�vBvfv�v�v�v�v�ww�w�xx6x\x�x�x�yyZy�zz�{2{\{�{�||`|�|�|�}4}V}�}�}�~d~�~�$Pr�����,�P�d�������f�����6�P�����Ƃ��0���������������N�V��������$�,�4�t����L������������T���Ĉ�D���ވ��f���‰ʉ҉ډ����
�H�r�����"�f���ʌ,�v���ލ�j���֎&�<������.�V�x�����Ώ����$�0�<�H�T�`�l��2.�%#!"&543!24#!"3!27.!�@�4��

a�i4�
���8��
��i\��@
rr++23/017353\DDD���ppE
����?3�20153353E;$;
����%��?@		?3?399//333333333301#3##7##7#537#537337337#��/��2:3�2:3q~/��1:2�1:2t�/�/��6����6�3������&��C/>@@ .26:!
::++!!	?3/33332?3/33333901%#773.#"#".'732654.'.54>32!..&*..�)1: ]W*WEKo;%E^86fY(#5AK(U_/`GJe4AsI/QE��|�}�cG=*0,K@1H0-#9#>=,5"*E9B[/$(����/?E)@@EE8((0 	rCBBr+22/32/3+22/32/301".54>32'2>54.#"".54>32'2>54.#"		�)D))D))D((D)--,-j)D((D)*D((D*----�M#����&B'(B&&B'(B&'00//�&B((A&&A((A'(/00/T[����/����<@,;	$	r3	r?+2+2901!.54>3232>53#".54>7>54&#";��+4/Q2/K,3Q1)E(2M)6[D%:0UsC>h=3Q-.G(:-!4.+�u.A5,F*#?*-G=9@),=1Wp?L�d91V:6QA35'2.%7-�eE	����?�0153E;	��,�����
//01467.,R:4-'D;3*?#Zf�bXeh0N�[?�� �����//01'>54.'7�"@*2;D(,5:QZ?��?[�N0heXb�>� @
		�?�2923017'7'37'W+DE)ED, *+">$II$>AA4�k�	/3333301##5#5353k|?||?8��8��P���b��/�99017#53VBQT__TA�e0�/20175!A$�??A|b
�r+201353A;bb@��rr++01	#@�(M��:�7��-U�r
r+2+201#".54>324.#"32>-ArHHqBBqHHrAE.R66R//R66R.%X�NN�XX�OO�XGl==lGGl<=k.�;@
rr+23+22/301%!53#52>73����&1062"F>>>�B"�,�E)@
r'r+2+2990134>7>54.#"'>32!,"B6>7!;, 4(	+#7K-=W.#7;/@&f"ED?#-0	/"+H*);+,-+>&�m�@.@'r/3+29/3301%#"&'732654&+532654.#"'>32W-@$:hELr/V@JW[TMR&A*9W,@V1>^6 ;�2L0<\2=6++5IDDQ:H8)63-*#4-P6(D.��;

@
		r/+9/9333015!533#%!d��c.XX���<�6>��_#�k�;"@
r/2+29/301"&'732>54.#"#!!>32Kz-a:2O/-M0.T?OW��1L,Ai>Cp�K="1<,N31K*)'�?�:fBFj;4��/�.@'
r/3+9/3301%4.#"4>327.#"32>".54>32/AoD-O:1X;8[,pGNvBBsJGrC�3T32U32T33T�Cm@ :'b�J=3(=G^��\�GBou2T23S22T22T2"��
G�r+2/01!5!#����N?�:2���!3C@''88@0
r+2/39/39901%#".54>7.54>324.#"32>32>54.#"EqCGn?+A"6 '@O('OA'!6 'A'E5? +Q34? +Q4��/H"$G/,G(&G+�>\39^:-I2
+:#,C/.C,#;+

5H($7&%C.#6'%Dp&77'&67$�f;.@
'r/3+29/30132>7#"&'32>54.#"72#".54>$ApC.N<1W<7\,qFNvBAsKFsC�2U22T32U33TGCm@ ;&b�J>2(=G^��]�GBnt2T22T22T23S2A{�
rr+2+2015353A:::�bb�\bbF���
@
	?3?3/3301537#53F:4B�bb�T__T!���@	/3/3901%
%!���@�]�I��K�D�rf�/3�20175!%5!D.��.�11s117���@	/3/3901%5-5�]@����K��I�"��$(@
&&%
r+2?33/0174>7>54.#"'>3253�%1+'>##?0/AR+%F7!'0*9;�,?.#3$,9.):0G1(7'
 70�kk/�n
[Uh)@^'1
fEL '�;/2�2|/3�22/339/3012#".'#"&54>324.#"'>3232>54.#"3267#".54>>=.#"326�J�e:6(!#
Y5GO8U,,C61'H$R.8A 
)	1ZxFEx\41YxF*J%
(U*K�d9=h��	
C0#?'02[7e�U:B;&**L:3:0H)'$=H$�.*@FI}^52[}IG|^5 8e�QU�b5��
!&()$*
��
D@'	
		
	

rr++29/33399<<<<013#'!#5;'J\��[KՏ��:��_��Yo�&@rr+2+29/3901%#!!24.#!!2>32>54.#o6[6��V2I'60=GF 7#��	$:#�v�#6 4!�5S/�5S-5Zb5$=&��&=�%<"$;$*����$@ 	r	
r+2�2+2�2014>32.#"32>7#".*-V~P_� 7FO'@bC"(Ha9(TI:\q6IzY0hA}g=WD"/73Ui6;lS1:.5J&?i�Y��
@	rr++2301332#4.+32>Y�q�LS�h?xW��Xx>�_�bl�XdU�K��N�Y6�@


rr++29/3301%!!!!!6�#�r[��>>�>�;��Y+�	@rr++29/3013!!!!Y�tN���>��:��*���� &@#""
%r
r	r+++39/3201".54>32.#"3267#53#vGzZ11XxGi�"6"rF;_D#(Ja8At5eZ��;=h�DH�d:VE$B>2Tj9<kS/ADJz,6��Y��@
	rr++9/32301#!#3!�E�[FF��:L����<Y���rr++0133YF�:�����
r	r++301732>53#"&'"E-4@"F.\L1L Y#GjGw��P�`4Y��@
	rr+2+2901333	#YF�M��1O���d���rd��Y9��rr++30133!YF��x>Y�@	rr+2+2901!##3	3��,��FHGB�?�����:Y��	@r	r+2+29901#33#�F:�FAE����O�;*����'@	#
r	r++2301".54>3232>54.#"wKzX02[zGKzW02Zz��&Fa:=aE$&G`:<aE%<g�DG�e;>h�CG�e:h:kS13Uj7:jT02UjYR�
@rr++29/3013!2+32>54.+Y&.M8 3\>��*>"(A'��&AO):g@��D.J+,J+*����'+@

*r
r	r+++3301".54>32'2>54.#"73#wKzX02[zGKzW02ZzG=aE$&G`:<aE%&FazE�E=f�DG�e;>h�CG�e:?3Uj7:kS13Uj7:kS1��Yg�@
r
r+2+29/33013!2##32>54.+Y,.L9'G0�O���*>"'A(��&AO)3Z>
����D.K*+I- ��=�2@*".r	r+2+29901.#"#".'732654.'.54>32�(29 ]W)XDLn<&D^87eZ'#5AK(U_0`FJf3ArJ/QEAG=*0,K@1H0-#9#>=,5"*E9B[/$Q�@	rr++2301###5!Q�F�@��x�>O����@	
r	r++3201".5332>53zTtDE4XBDY3F Gr<e�Df��7jT13Ti6f��G�b:
��@	rr++29013#V��I��@����o�:��$@
r

r+2+2/2/29013733##3dBdeC|�L��>��=��K�������u�:_����As�@
	r	r+2+29013	##	U��O��O��P����5����+��^h{�@rr++29013#]��L��F����~�B��
�S�	@	rr+23+23017!5!!!�%,�#��7Q>7��>X�����//32013#3Xw77(9�f9��rr++01#i�L�L�:�2�����//320153#53288x(9�9��+/���r+2�2013#+�:�<��/��iW��A����/3015!A}>>>1l����/�90131G<,�]!���'8+@!66$/$r
rr+223+2+9/3330174>3254&#"'>32'./#".%>=.#"326!8cA&R NE*Q,3b3`p
#p:2Q-]"I%IZ:'1U�1G',BN0##na�
6&-1+I
L
:23!&K��A�'@rr
rr+2+++201"&'#3>32'2>54.#"J=h=D#bA7W> %DYE*H4/S8(E5"38
?0e��5A.Ma37`K+<"<K(7a;$;#�/"'�� @		rr++2301".54>32.#"32>7-9_G'BvMIpBO04V34V4"?/CAW
+Lb7JzHC9(-6^<;`9)%;!(��7�/@+!
rrrr++++332014>323'.=#".5.#"32>(=lEAgD j96[C%�
:I$*D16F)83"J{JE1>�x
6 33<,La�$;##<L(*L; #0'��-%!@i"	rr+2+29/]3901".54>32!3267!.#",8`F'CvKMsB�B5U23[;BY��5U33T5
+Kb8IzIJyH8W34*%<!'9V11Wk�@
	r
r++2|?333013#5354>32.#"3#dHH%E/:
*/3���6@\11JF6�-(�!"6!@#-
rr
rr++++33301".54>3253#"&'732>='2>75.#"5ZA$#AX6Cc"=EuEYn#*g:3U3h&90 8G&,E/5G,K`37aL+D2m��Hc2@6!10%J8g1;9%.�&;!%=L&*K; K�@	rr
r+2++29901!#4&#"#3>32D>:&K9DDo?-?'#XY'C+����:E =Q3K���
??�2013353KDDD	��vdd���K���
r/2+�201"&'732>5353!;!'*D,F.D�.
+$��.H(+ddK	�@
	rr
r+2++901!#33��oDD'K��h����N����rr++20133267#"&5ND$
7.7��'7
6/KR$%@rr

r+22++293301!#4&#"#4&#"#3>32>32RD:9;]D8::^D>!g?AP	$e@,=%#[VTB��#\URC��	v=BJ<BD ;S3K@	rr
r+2++29901!#4&#"#3>32D6:(N;
D>DV.+<$#\U'C+��	v&9  ;S3'��,#@	 
rr++2301".54>3232>54.#")8_E&&F_88^F&&E_�3V44V44V44U4
+Ka68aK++Ka86aK+:_78a9:`8:_K�+A'"@$#rrrr+2+++2901"&'#3>32'2>54.#"UAgD=h;6ZB%;jZ+D16F)83"6G
D2���e1=-La4I{J<#<K(*L:"%.�%;#(�+&"@rr

rr+2+29++01".54>3253#'2>75.#"5W>"&C[4=g=DMd)C3"2:+E41T
,La57aK+?0f�"Av<!8"�1'$<L'8`9KO@
r
r++?33301#3>762ODgD@Y2
�H?��	}7D ���+@
rr+2+29901"&'732654.'.54>32.#"�@n(,Y2=L%E06I%3Y7<\!M/ :%8);X0n
*+0)%1.!!3)3C#&". '"!4/IR��E�@

rr+2+2�3301%#".5#53533#3267E"03HHDxx%.-!u6��6��F��	@
r
rr+2+2+299017332>73#./#"&FD=<(K:D"uDRT�2��YX#A+H�I
6F<Dr	@	r
r++2901333��G��C�	�;��	 @	

r
r+2+2229013##37'373�C�;ml;�B�`X=BC<W`	����	�=�ש����	@

r
r+2+2901?3#/#[��M��M��M��	�������� 
	@	
r+2?399017>733&'i�H��D��)	
�DB	�=�`!�		@	
rr+23+23017!5!!!]�����Z�W.�3.�X35�����//33013#"&54&'52>546;�7^^���$
%��9
!49V�~��//013V;���w2�����//33015323+53467.52^^7

�9��4!��
9%
$B��X�
�	/33�220174>3232>53#".#"B(43
++!!7/
� &%[����
�
?/�201#7#5�DDD���pp+��
�)'@%%

$$?3/333?3/333015.54>753.'>7#3U?"9hH%JeAH+<0CHT%�*J/'=*xo0L[0DwNttA8)(�_(*:nz1X<�&;G4����:'@%::(77,3	rr+2+29/3232/3301!!>54.54>32.#">323267#".#"4P��.6'1R26a(N) 5'.&$.,*946:t6��.G? -IBD&/N.81*)1 5!!?@K/!?B*				4


5}�'"2�'//3/301>327'#"&''7&5467'732>54.#"�9!!9F"HIJ:!!:GG$F!;!8""8!!8"!9!�G!H99HEEG2=9G!�%<#$>$&<##>��.@

r
?+29/93�22333013#3##5#535'#5333�To!��F��pV�L��Mn060��040X��~W�~��//9/�01##�<<<�i��i�/����?R!@F=I@MP8 
1'r/3+2901%#".'732>54.'.5467.54>32.#"2%>54.#"&'�&<F""=1(-%I*!=(&;8Y29Z0%:-!6*2!<&K9$G;"��2;7
*>.�5&-C,!*#!2#'%%G3->(3M+"
1"9,&:+2|%*'&+%��=y��0���'L@
:2
rD(`	r+2�2+2�201".54>32'2>54.#"7".54>32.#"32>7�O�c77c�OO�d77d�OFwZ32YxGFxY11YxN.TA'8V:BgB
-0(<'/94,
B
4P6b�NM�a66a�MN�b6%/VvHEwX11XuFEuY1]!=U5*SD)963= *@,"6&0Zy�#2+@*-!')$�@�?3�29/93332/301"&5463254&#"'632#./'2676=.#"�1ETA:+2-8FEFP	
	I!80-9-Z?/0=+2%.ID�
4"-4	%()B��
$@
	/333/3933017'?')���������;��;�%�;��;�I~l
�/�301#5!5<��l�>A��0�/20175!A��??0���&6?%@?0446>'
r26`	r+2�2+2�29/3301".54>32'2>54.#"32#'##72654&+�P�c77c�PO�d77d�O\�W1YwGGwY11XxR�(<#.o:ju5�(+1&�6b�NM�a66a�MN�b6$R�`EvX11XuEEwX2'*B# 9(����8(*5���6�W��2.���	r+2�2014632#"&7327>54&'.#"21"#00#"14



	�#//#$01A

		H=�@	/3�2/3333/0175!##5#5353HC�?��?=99L9��9��$�]+"@B D?2�29014>7>54&#"'>323$7+@+33!2"
'F0II,0,,��4E.%+!D3*)*+#�_+,@
&BD?2�29/3301"&'732654&+532654&#"'>32�>U!8$1DRC?H?+)=-: ,E)/,.8-I�0)#' #')" !'"2"-	9&"2��1l���R�,(	!@ 	rrr+2+2+299/01332>733#.=#".'#RD=>'K:D>N*2 
D	��YX#A+H�O< B#;"&��"��-�#@

r+233/39/3330146;####.7%#3"���F<J;Pu?;7\6bgNJJ�q�6� 7��7:jK>P)scd��A�|f�/�01753A;�pp��#�L��"��+@	

BD?33�22301#53#52>53��Q!',-�--5-��,Z����@�?3�201".54>32'32>54.#"�5R-.Q56P/.Q�"7"#7!!8"!8"Z2T01T11T10T2�%<#$=%%;$#>?B�
$@

	/333/393301%57'557'5���������;��;�%�;��;���"����&'c	�"����"392@76613&&%%1499 r+22/392/3/9/333/301!4>7>54&#"'>323#53#52>53		�6*=*21!0"
&D0GF*/+,��Q!',-x#���4E.%, !D3+**,s--5-����T[������#��t�&'c�	!�+��$(@	$$''(
?3?33/0132>7#".54>7>57#5>%0+'?"$>0.AR+%F8!&1)8:0,?-#3$+:/):0G1(7'70�kk����&&����/�01����&&���/�01����&&����/�01����&&�y��/�01����&&���
�/��01����&&����/�/301����-@


rr+23+99//333301!!!!!!5!#��vT����)���L���>�>��>��V����*�L��&(����Y6�&*����/�01��Y6�&*�
��/�01��Y6�&*����/�01��Y6�&*���
�/��01����&.�����/�01��Y��&.�5��/�01����&.�����
/�01����&.����
�/��01"��@rr+2+29/3015!32#4.+32>"-��r�KS�h?xW��Xx>J66���_�bl�XdU�K��N���Y��&3����/�01��*����&4����+
/�01��*����&4�2��(
/�01��*����&4����.
/�01��*����&4����(
/�01��*����&4���
�,(
/��01@l��&@
		/33/33392301%''7'77�,zy+yx,wy+x�+yy,xy+xy,y��*����&4J��O����&:����/�01��O����&:�4��/�01��O����&:���� /�01��O����&:���
�/��01��{�&>����	/�01Y?�@



rr++99//33012+#32>54.+l/L93\=�FF�+="'B'�9&@P*9g@yƍ�.K)+I-��K���-@%		-r
r+/3+29/33017>54.+532>54.#"#4>32�]p+K1#7"7",<A4Z:5T10JS(He>9KM/G'>3"$1(C*�;Z2(I/#@-kI3N5��!����&F�y�</�01��!����&F���9/�01��!����&F�b�?/�01��!����&F�.�9/�01��!����&F�c
�=9/��01��!����&F���KBB/�/301!���7IR/@NR%C%%r)118r+223+299//332301".54>32>7.#"'632>32!3267#"&''26767.'.#"%.#"�1N-7b@#E	K<'T,g^A\ h?LuC�;7X43[<BY3Dp#LX5Z	@ HZ!8�5U64V4
+I./F(	(5= -D71/9JyK8W34*%<!?4)24(!5

<1 5�9X22X9��'�L&H����'��-�&J���)	/�01��'��-�&J���&	/�01��'��-�&J���,	/�01��'��-�&J��
�*&	/��01����&����/�01��K��&��&�/�01������&����
/�01����&���
�/��01*��/�+3"@(/0.-12,3 ?3?9/9301#".54>32.'332>54.#"'?/*I^6EuD&CY3Bn#BmR`Rj=�@2U46V43V44W3�fzxjAiL)AoC1WC&A40^]]-0qwwc2S15W32O/2T�?LIB��K�&S�O�/�01��'��,�&T���'
/�01��'��,�&T���$
/�01��'��,�&T���*
/�01��'��,�&T�P�$
/�01��'��,�&T��
�($
/��01CJ��@
		/3/333/2015353'5!�;;;���[[��ZZ�99'��,#'+/&@+-,*%&)(//
r''r+22/+22/901".54>32'2>54.#"77'7'73)8_E&&F_79^F&&E_94V44V44U43V�@)-3(�,,)>
+Ka67bK++Kb76aK+<8a9:`89`;:_73R9>z9��F���&Z���!/�01��F���&Z���/�01��F���&Z�}�$/�01��F���&Z�~
�"/��01��� 
�&^���/�01K�+5�'@rr
r#r+2+++201#"&'#3>324.#"32>5(E\67WEET=:[@"F-Q6(A1 19)D35cL-6$�����(:0Pa18`<"8 �-$#<L��� 
�&^�r
�/��01����&&����/�01��!����&F�B�9/�01����&&����/�01��!����&F�z�@/�01���J��&&����!�J�&F�?��*����&(�3��%/�01��'���&H���!	/�01��*����&(����+/�01��'���&H���'	/�01��*����&(�(��%/�01��'���&H���!	/�01��*����&(����*/�01��'���&H���&	/�01��Y��&)����/�01��(����&I�2V+4"��@rr+2+29/3015!32#4.+32>"-��r�KS�h?xW��Xx>J66���_�bl�XdU�K��N�(��e�3(@ !/r
rr%r+2�2++2+2901534>323'.=#".5.#"32>i���=lEAgD j96[C%�
:I$*D16F)83"i..��J{JE1>�x
6 33<,La�$;##<L(*L; #0��Y6�&*����/�01��'��-�&J�c�&	/�01��Y6�&*����/�01��'��-�&J���-	/�01��Y6�&*���/�01��'��-�&J���&	/�01��Y�J7�&*����'�J-&J����Y6�&*����/�01��'��-�&J���+	/�01��*����&,����-
/�01��(�!�&L���=
/�01��*����&,����.
/�01��(�!�&L���>
/�01��*����&,� ��'
/�01��(�!�&L���7
/�01��*�9��&,��*��İV+4��(�!�&L���;
/�01��Y��&-����/�01��K�&M����/�01,��!@


r
r+2+29/33/3015!'#!#3!,�2E�[FF�55��:L����<�@
	rr
r+2++2�2990153#4&#"#3>32��D>:&K9DDo?-?'i..��#XY'C+����:E =Q3�����&.�����/�01�����&����
/�01����
�&.�����/�01������&����/�01����&.�����/�01����&����/�01��!�J��&.�����J��&N���V+4��Y��&.�+��/�01K�	�r
r++0133KD	����Y����&./���K�Kp�&NO�������&/����	/�01�����K��&����/�01��Y�9��&0�����ΰV+4��K�9	�&P�����ΰV+4K		@
	r
r+2+2901!#33��pDD%M��h�	�����Y9�&1�3��/�01��N���&Q�*��/�01��Y�99�&1���	��ΰV+4��N�9�&Q�S���ӰV+4��Y9�&1H��N��C�&Q��V+4��Y9�&1{-f��N��*�&Q{���V+4@�	@
rr+22/3+2/3017'%3!&1�F��(�'��x>
��$�@
	rr+23+22301'7'33267#"&5!��D$
7.7!'�'���'7
6/��Y��&3�>��
/�01��K�&S���/�01��Y�9��&3�*�
��ΰV+4��K�9&S�����ΰV+4��Y��&3����/�01��K�&S���/�01�����&S,�%�/�01Y�K��@
rr++2/3901#33#"&'732>=�F5�E-F'!:"'*C����K�".F(.
+$K�K%@rr
r/2+++29901"&'732>54&#"#3>32h!;!'*6:(N;
D>DV.+<$,F�.
+>\U'C+��	v&9  ;S3��.H(��*����&4����(
/�01��'��,�&T�c�$
/�01��*����&4����/
/�01��'��,�&T���+
/�01��*����&4���
�,(
/��01��'��,�&T��
�($
/��01*��X�2%@r)r	rr+2+2+29/3+201%!5#".54>325!!!!2>54.#"X�(Og<J{Y02[zG>hL�wS����<aE$&G`:<aE%&Fa>>�5S1<g�DG�e;1U3�>�>��3Uk7:jS13Uj7:kS1'���*:C%@C?3r##+r+223+2239/301".54>32>32!3267#".''2>54.#"%.#"(HuDDvI3XBwOIpD�B7X46[:DX12ZGDV15V33U54V43V�6U33S3
GzKM{H)I3NWCyR6X44*&;!)I13I'<8_:<_89a;:^7�9X22X9��Yg�&7����/�01��KO�&W���/�01��Y�9g�&7�����ΰV+4��I�9O&W����ΰV+4��Yg�&7����!/�01��KO�&W�$�/�01�� ��=�&8����3./�01�� ����&X���,/�01�� ��=�&8����9./�01�� ����&X�S�2/�01�� �L=�&8���� �L�&X�T�� ��=�&8����8./�01�� ����&X�S�1/�01���LQ�&9�����LE�&Y�.��Q�&9����
/�01����k�&Y�!`�@		

rr++9/333015!###5!L�*�E�?455T�x�>��F�@

r+2?�3333/30153#".5#53533#3267!�4"03HHDxx%.--�-!u6��6����O����&:����/�01��F���&Z�I�/�01��O����&:����/�01��F���&Z�]�/�01��O����&:����!/�01��F���&Z���%/�01��O����&:����,##/�/301��F���&Z���0''/�/301��O����&:���
�/��01��F���&Z��
�"/��01��O�K��&:���F�J	&Z�i���&<�e��/�01���&\���/�01��{�&>����/�01��� 
�&^�q	�/�01��{�&>���
�
	/��01��S�&?���
/�01����&_���
/�01��S�&?����
/�01����&_���
/�01��S�&?����/�01����&_�Z�/�01���� )@&&r!	r+2+29/301".5467!.#"'>32'2>7!mGy]3K,GY30WBBYr=DxZ43[wEEpF��Hs7b�J
9bH(#?)3N-9c�LK�a7?EwMLxE�K��&@
"r/2+29/33301"&'732>5#5354>32.#"3#� ;"'*II%E/:*/2��-F�.
+�6K@\11JFM6�Q.F(��*���&4�~��(#V+4��'��,^&T�6���$ V+4��O��&:�I��V+4��F��q]&Z�����V+4Y�	&3@r
	#""!& �%r+23��2923?33?3+201%!5!!)32#4.+32>7#'��%-�"��p�q�LS�h?xW��Xx>hUU'c2b7Q>7��>�_�bl�XdU�K��N��??UUY��
&3@#""!& �%rr?2+2+23��2923?3301332#4.+32>!5!!!7#'Y�q�LS�h?xW��Xx>�]�����[�V�UU'c2c�_�bl�XdU�K��N���3.�X3�??VV(��6�/9@A@$0669
=<<;@:�?23r+r

!r+2??3+29+2��2923?33014>323'.=#".5.#"32>!5!!!7#'(=lEAgD j96[C%�
:I$*D16F)83"�\�����[�W�UU'c2bJ{JE1>�x
6 33<,La�$;##<L(*L; #0k�3.�X3�??VV��Y����&1/G��Y�K��&1OG��N�K��&QO��Y����&3/��Y�K��&3O��K�K��&SOG��*����&,����,
/�01��(�!�&L���<
/�01��*�O��&4�
��'�J,&T����Y�&)?���Y��&)_���(��7�&I_n��*����&,x��'
/�01��'�!�&L�x��7
/�01��&Q@,
	

	

			!
?3333332??9/333//9<<<<01'733#'!#4632#"&7"32654&l.<H�;'J\��[KՏ�83&'33'&3Y;Y�:��_���&..&%..W��!����&F'������QKBB/�/3301������&����/�01��!����&����S/�01��*����&4&J�2��,
/�01��'��,�&����0
/�01����&&���
�/��01��!����&F�I
�<@/��01����&&����/�01��!����&F�z�=/�01��Y6�&*���
�/��01��'��-�&J�j
�)-	/��01��Y6�&*����/�01��'��-�&J���*	/�01������&.����
�/��01������&���
�/��01����&.�����/�01����&����/�01��*����&4���
�+/
/��01��'��,�&T�k
�'+
/��01��*����&4����,
/�01��'��,�&T���(
/�01��Yg�&7�r�
�#/��01��/O�&W�

�/��01��Yg�&7���� /�01��KO�&W�<�/�01��O����&:���
�!/��01��F���&Z�d
�!%/��01��O����&:����/�01��F���&Z���"/�01�� �9=�&8���6��ӰV+4�� �9�&X���/��ذV+4���9Q�&9�����ΰV+4���9E�&Y�t���ӰV+4��*���H&4'�������0�,,(
/��/�01��'��,�&T'���c��,�(($
/��/�01��*���Q&4'�������D�((
/�/�01��'��,�&T&�P�c��@�$$
/�/�01��*���Q&4'�'�����,@((
/�/�01��'��,�&T'���c��(�$$
/�/�01��{�&>���	/�01��� 
�&^�Q�/�01���K�	�
r/+301"&'732>53 ;"'*D-E�.
+$��.H(��$%@""rr+2+29/301".'467!.#"'>32'2>7!"KvC�6T24Y;BY39_F'BtL4Q4��6V
I{I8W24)&:"+Kc8IzH43X89X2��E	��_��E	E�`��"Ta��1l����/�901'73^-;Hl]#K|�
��/3�20152654&#52#'22K"#/%%.#K|�
�
�/3�201"&5463"3|&33&K.%%/#��*p!����*p!��Wp��//01#�<�i�6�W��/3015!6!�//E	��
��/�0153E;	��E	��
��/�01'3];	��W�~��//01#�<�i���+u�����2yp����#K�����5�J��,vj���/22�2201".#"#4>3232>53*"*$'%*'~!"��+l!��1l����/�30131G<,�]1l����/2�01'73^-;Hl]*p!���/3�9330173'*b2c'UU�UU??:vx�@
�/2/2�22/01".#"#4>3232>53*"*#'%*'~!"6�W��/2015!6!�//+u��
�
�/3�2012673#"&53�!)9))9*"�&*;;*(2yp��/�01532>yaa=y��/2�20153353=:[:y^^^^�`w��
�/3�201'>32'>54&#"&!"

�&'

#K����	/3�2014632#"&7"32654&#3&'22'&3Y�%//%%..V+l!���/2�23301'73'73P%9@*&9@l]n]*p!���/�2923017#'PUU'c2b�??VV%l���/333�2013'3�?9%�@9%�]n]+u��
��/3�201"#4632#.�"*9))9)!�(*;;*&"Ta���/�99013#57^?�@FF@2�����/2�017267>732!&
	:
&0�3!
	2�Wp���/�01532>�aa=�W���/3320153353=:[:�^^^^9�9x����/�9017#53<?�JLLJ#�L��
/3�201"&'732654&'7�=&!$$"'08�'
'3'(-5�J���/3�2014673.5--)%'%+/i;-- +�h��
��
/3�2012673#"&53�!)9))9*"u&*;;*(6�W���/3015!6!�//2"E�/301532�--p�@
rr+222+201	!5!a������o55��x6-��-#@"r,,r+223333+201353.54>323!5>54.#"-�8R,1XxFGxX1,R8���2M7$C_<;_C$6N1>]tAE~b99b~EAt]>>>T_05fR11Rf50_T>>K�,!	!#@ 
r
rrr++2+2+2901332>733#.=#".'KD=>'K:D>N*2 
���YX#A+H�O< B#;"&����4	@rr
r++233+201##5!#3267#"&5�BP
n 
7-6�5�>>��!7
6/l��Y6����Y6�&�l��
�/��01����#!@rr	r+2++239/301"&'732654.#"##5!!>32�+!HR,M0._.D���/c1Cg;u9OR8L&���==��7gHpl��Y��&�����/�01*����'@
r	r+2+29/3901".54>32.#"!!32>7zH{[2,XSa�!7FR)<`C%M��*I_7*WJ:^r<g�GA}g=WD"/7-J]/:8dM,;-5J&�� ��=�8��Y��.����&.l���������/&����&#@&		rr++29/3333015>?!32+!%32>54.+&'9'��Le32cJ��'7C	�9G F?�>/l�����6a?<a:��|�m<=,H((G,Y��'@rr++9/3333320133!332+!%32>54.+YFoF�rr2cJ����9G E?���1��oZ8_8W��;*D&%@(��@

rr+2+239/3013#5!!>32#54&#"�����*^3ppDMY1b�==�js��UO����Y`�&�����
/�01��]��&�����
/�01����oy&����/�01Y�xa�@
rr/++223015#3!3#?�F}E刈�x��:�����&Yn�
@rr+2+29/3013!!32#'32>54.+Y�j�up1cK��:F G@��>�mW9]7>*C$$?'��Yo�'Y���rr++2013!!Y����>�x&�x��@

r+2/�233301532>?!3#5!7!!&+�U>��D���&��.g���xƈ��J���i��Y6�*��)@rr+22+229/33399013	33333	####��R�aE`�R��Q�bEc�nX��<��<����J��J��-����-@' r	r+2+29/3901"&'732654.+532>54.#"'>32It!6V8LY%D0DE%8 #?*3N3gH=[552?E<i	?8!,0OB*A$8#:$':".)"7>/S86WbA>Y0]��	@	rr+2+29901333#]E�AE�M��f�:[����]�p&���
/�01Y`�@r	r+2+29/39013333	##YFk�Q��V�m��<����J��&��~�@
	rr+2+2/301!!#52>?!9�� :T:'<*�����o/>(d���:��Y�2��Y��-��*����4Yq�@	rr++23013!#!YF�t�:��x��YR�5��*����(��Q�9��o�@	rr+2+299015326?33#�-��M�I��*&;A�/��)$*�#-@-$?�223?�22301!5.54>753'>54.'tDx[36\vBBCx[45]wAAHwG+J^sHwG*J^4B.RqDHqQ,55.RqEFrP-B|�?pM;\A#@pK;[B%��s�=Y�y��@	rr/++233015!3!33v��FzEV���x��x�E*�@	rr++9/3201!#"&=332673�:D'vpDQ[3aD2
gp��SLU�:Y]�@
rr++33220133!3!3YFFE�x��x��:Y�y��@
	rr/++23333015!3!3!33t��FFEV���x��x��x���@
rr++29/33013#5!32#'32>54.+Ѿ�Mf43dK��;G!G@��<��6bA;d:;-I(*H,Y��@
rr++9/3323013332#'32>54.+3YF�Mf32dK��;H!H?�E��6bA;d:;-I(*H,���;Y9�@
rr++9/33013332#'32>54.+YF�Mf32dK��;H!H?���6bA;d:;-I(*H,0����)@% r		r+2+29/3901".'732>'!5!.#"'>32N<oY;HV+:cJ'��l%Db>+QD:%�cQW.1Z}'J4,;0Tl::3eO08-#DW=g~BE�g=Y����&!@
rrr	r+2+++29/301".'##33>32'2>54.#"eZ�S�FF�U�Ua�RV�\Nq?BrJLo=?pS�c����e�P]�jq�V?M�V[�HK�WZ�IA$�@

rr+2+29/39013.54>;##*#3#"A�MS9hH�E
����1N*&I-nL9]7�:$��a($@,,D(��!���F;��9�'@ 
	rr+2+29/301"&54>?>32'2654&#":~� >[;��<P-lGLk8;qSYa_[4T1+R
��a�W8H;E>_L:?>nHLq?<gVTj,T>6V1J�	%@	%r
r+2+29/39013!2#'32>54.+532>54&+J,<(&-8)G.�+(ű(/%�	%:!*C
D0*>"1,+/,$6J�	�r
r++2013!#J7�	=�4��(	@

r+2/�233301532>?!3#5!7!#	&SF=�b4�y�F{^��4�yy��Z]}I��'��-J&�	)@r
r+22+229/33399013'3353373#'##5#&ðM�DFF�N��O�FFD��������������+@%rr+2+29/3901"&'732654&'#532>54&#"'>32�Hf8H3=I:359$75,;4[=2K+$ .32X72#'8/+4/('0#".4!=+%?F//D$J		@	
rr+2+29901333#JD==D���T�����[��J�&�x�
/�01J�	@r	
r+2+29/390133373#'#JDN�N��P�N	���������	@
r


r+22/+20152>?!##*!RD�/D>F{_����Zl�T$Jr	@
r
r+2+2901333##JF��CA�,�	��g�����F�]J�	@

r
r+2+29/30133!53#5!JD*DD��	������'��,TJ�	�r
r+2+2013!#!J�D��	���4��K�+AU��'��H�	@	
rr+23+013#5!#ͺ���==�4�&
	@rr+2+29901"&'7326?33�#.�H��D�,2�
042A�=��/<'�+��$/%@r/
r%
rr++223+223+015#".54>;5332+3#";2>54.+;Mr>?rLDLr?>rM[6T0/T�7T/0S7��HuFGvH��HvGFuH��7]98\55\89]7���	]J��'	@r	
r/+23+2015!3!33�`DDGyy	�3�3�:�	@

rr+2+9/301!5#"&=3326753u F(VWD9?#FD�X[��F@
���J�	@
r
r+23+2201333333JD�E�D	�3�3��J��	@
r
	
r/+233+22015!333333�lD�E�DGyy	�4�4�4�.	
@r
r+2+29/3013#5332#'32>54.+���YZ(M:��)23-��9�[J0N.6!53J[	@
r
r+22+29/3013332#'32>54.+3JDvY[(M:{r)23-p�D	�[J0N.6!53����J�	@r
r+2+9/3013332#'32>54.+JD�Y[(M:��)23-�	�[J0N.6!53&��#@

rr+2+29/3901".'732>7#53.#"'>32.WF7Y/5T6��0R9/Q5jK?aC"$D_	8(0.5Y40/T5(15B-M`13aN.K���&!@
rr
rr+2+++29/301".'##33>32'2>54.#"�Di?hDDh@iBMp>?qK6R-/R43P,-P
>mE�	�Hl<HzMOyE<6^=A^45_??_3$�
@


r
r+2+29/330137.54>;#5#735#"$�5A*M4�Dt���x4>3�MC-F*�����;-.@��'��-�&JE��)	/�01��'��-�&Jl�
�*&	/��01�G�-#@!%%r
r	/2++9/3�22301".'732>56.#"##53533#>32B'0
)'7#C8@SDKKD��!\<A[05O�
#'G`8Jc4A8�	.��.�35>wWF{]5��J��&����/�01'��"@
rr+2+29/3901".54>32.#"3#3267+;`D%"Cb?Kj4Q/9S0��4U5.Y7z	.Na31`M-B50)5T/04Y5.0<A�� ���X��K��N����&�l������K��O��	$@$		r
r+223+29/30152>?!32+#%32>54.+*!CpY[(N9��/D�k)22-j>F{_��UD-J*�Zl�T$90-J	#@r
r+23+29/3330133!5332+5!%32>54.+JDD{ZZ'M;��Ow)32-u	���UD-J*��60-�'@
r
r+2+9/993�223013#53533#>32#54&#"MKKD��b@`RD;G@W2-{{-�26hc���NN?:����J��&����
/�01��J�&����
/�01���&
�&�]�/�01J���	@
r

r/+22+2015#3!3#��DD�yy	�3��yZ�@
r+2/9/3�2015!332#'32>54.+|��E�Nf33dK��:H!H@�*77����6bA;d:;-I(*H,����'@

r
r+2+99//3333013#53533#32#'32>54.+f{{D���ZZ'M;��)22-�.��.�[J0N.6!53��
!@r
/22+29/3399013	!	####!!����O�cEc���alZ����H��H���&�	
!@r
/22+29/3399013'!#'##5#37!&̶���R�<F;�����>��������#���*����|��'��,}
��@
rr++93301!3>;#"5��I��76) !"���82<"$��/	@
r
r++9330133>;#"��E��73% !
�	�9c406&�r��]�l�p&� V@	V
/�01+4��J�lR�&���V+4R�@
rr+2+9/3�2015!332#'32>54.+G�E�Mf32eJ��;H H?�D--����6bA;d:;-I(*H,�@�
r+2/9/3�2013332#'32>54.+'5!�D�Y[(M:��)22-��Y�w[J0N.6!53�66SL�
'@rr++29/33333013!2+32>54.+7S&.M8 4[>��*="'A(��$�$�&AO):g@��D.J+,J+��C�+:(,'@rrr,++*))r+23323+++201"&'#3>32'2>54.#"?NBgD= g;6ZC%"?WG*D16F)83"6GP!�"
D2���e1=-La47bK*<#<K(*L:"%.�%;#^�Y�U�rr++�3013!53!YU>��Ə�xJ���r
r++�3013353#J�>�	y��4��	@rr++29/3015!!!v�����<11���>�x���		@r
r++29/301'5!!#9�7��..�	=�4Y��G�@
rr/2++29/301"'732654&#"5>32%!!n*+!GSYV.Y..b/qxu�����w:^aag>�{|w�>�xJ�H�	"@
!r
r/2++29/301"&'732656.#"5>32%!#7!"K@#>)&?#%H,8U0-Y��7�.
bTCQ$:2fONt>�	=�4�y��3@

rr/+2323+229/33399015#53%	33333	####�/n�M��R�aE`�R��Q�bEc���>ŇnX��<��<����J��J��&��	3@



r
r/+23+229/33399??015#53%'3353373#'##5#�,i�ðM�DFF�N��O�FFD�yy<�y����������-�u��1'@+$r	r/+233+29/390157'"&'732654.+532>54.#"'>32�<!It!6V8LY%D0DE%8 #?*3N3gH=[552?E<i����?8!,0OB*A$8#:$':".)"7>/S86WbA>Y0���L�&�|DY�y{�'@
		rr/+223+2/9/39015#53%333	##=/m��Fk�Q��V�m��>��<����J��J��	%@
		r
r/+233+29/39015#53%3373#'#�*g�BDN�N��P�Nyy<�y	������Yj�-@r	r+2+2/9/3/33/9013333##7#3YE��J�N�$$��?����M���>K
	!@r	
r+2+29/��390133373#'#7#3KC��K��M��h$$	�����	j�'@
r
r+2+299//3930153333	##�El�Q��U�nD--����<����J������)@r
r	
r+2+99//339+0133373#'#5!CD@�N��P�@�"�P�����D--��!@
r
r+222+29/390153333	##�El�P��U�n�<<�v��<����J��I	!@

r
r+222+29/3901533373#'#�DN�O��P�N�99�0	������Y�y��&�"T�V+4��J��F	&�!��V+4Y��@

r
r+2+2239/301'!%#!#3!�E���E�[FF��>>>�:L����<J�	@
r
r+2+2239/301'!3!53#5!�D7�[D*DD���==�4	����Y���!@rr+2/+2/39/3013!#!"'732654&#"5>32YF���*+!HRXW-Z..b/Lg6u�:��xw:^aag>=tR|J�HC	$@r
r
/2?++29/301"&'732656.#"#!#!>32{7!"K@#>) E#D��D�%N&8U0-Y�.
i[DP$��4	�2fNSzB4��)�6F+@C'rr0;;		r3	r+2+23333+2+201%#"&'#".54>73267.54>323267%>54.#")5{G0]%.\.V�n=.RqB
Ag9V�g)7Q,Q�^GsR,8nR"Hi)��4`@O�MCpCKp?\.44c�ZDz_6>I{Nd�O^{Ga�U2ZxGH�b2!�M}TO�U[x;Fz;��2B-@3%rr,;;	r/r+2+23333+2+201%#"&'#".54>3"3267.54>323267">54.!]1 : @!`�O$?S/
+C(;lJ	
?E@rKJm<]Z		/F �7T.&J38Y40O(
I�R3]G)66[8@i>!yMJqA?lEU�$�0W81[B?_8?R(*�u��'5.54>32.#"32>7\DpR,-V~P_� 7FO'@bC"(Ha9(TI:Oc2��Cg|AA}g=WD"/73Ui6;lS1:.0E(�'��"@	r!�r+�33+2015.54>32.#"32>7
Ch;BvMIpBO04V34V4"?/C8L-yqLvDJzHC9(-6^<;`9)!7#p���yQ�&�"!�
V+4�����	&�!��
V+4��{�>�+	@rr++2901533��G��B����6���
u�#@
rr++29/933301!5#535333#����L��M�쒒�1���~�B1� �+	#@
rr++29/3333015#535333#�ww�F��B�uuհ%�1��%��y��"@

	rr/+223+29015#533	##	X/m����N��N��O��>�M��5����+��^h���	"@r


r+2�33+29015#53?3#/#�W�_��M��M��M��yy<����������yI�!@
		r+23233/�3301+5!5!3!33:�F�)��FmFU�>����x��x����	"@

	

r+23333?�3301#5!#5!3333Ǵ��E�wD�DG�==��y	�3�3���E�y��&�"��V+4��:���	&�!k�V+4��E*�&�#�G:�	#@


rr+2+9/3/33/01!5#"&=3326753'#3t E(VWD9?#FE�$$�X[��F@
���_	Y>�@r
r+2+9/301>32#54&#"#�9E'voCQ[3`D��gp��SL�����K�M��9�09%@,55'	r1r+2+29/33/3901467;#"&2!32>7#".54>"!..1+dQPW�Fz\4��,GY30XBAZr<Ew[32[xDDqDHs�1%"==H7b�J
9bH(#@(2O-9c�LK�a7?EwMLxE��{-6!@..""3r&r+2+29/333301467;#"&".54>32!3267!.#"!

,%UCDNo4[E''D\3LtB�C7T04[<AY��6T31U5O+
16��+Kb87aI+JyH8W34*%<!'9V11W�y9�4='@9+�"+	r5r+2+22/�9/3�20157467;#"&2!32>7#".54>"!.�>�6-0,cPPW�Gy]3��,GY20XBBYr=EwZ43[wDDpEHs���B1%"==H7b�J
9bH(#@(2O-9c�LK�a7?EwMLxE���1:'@22&&7r*�r+�33+29/33330157467;#"&".54>32!3267!.#"Q=��"
-%UDDNo3[F''E[4LsB�C6U03[;BY��5U31U5yy��+
16��+Kb87aI+JyH8W34*%<!'9V11W��Y��.���y&�;��/�01��&��&���/�01S�,F�$!@rr/2++29/33301"&'732>54.+#33:3�)
$4)G^4WEEG
�Q�Fl>/Q�<,Q8;lR0����=��h�PIm=J�>�	!@!r
r/3++29/3301#"&'732654.+#33:735P-&A,
*+1T4;DD2�NPpB<[2;I;Bi>�	����&�l��&� 9�V+4���l8	&���V+4��Y�.��&�u��J�=�	&���Y�l��&� T�V+4��J�lF	&���V+4E�y*�@	r	r+2+23/9/301!#"&=332673#53#�:D'vpDQ[3aDh?�M2
gp��SLU�:��>:���	@
r+2?3�9/301535#".=3326753#)HD$:O'A:@#DCOy��)R;��GB
�y��Y�l]�&� ��V+4��J�l�	&�1�V+4��K�	����y&����/�01��!����&�_�9/�01����&����
�/��01��!����&��l
�=9/��01���������!������Y6w&����/�01��'��-�&�w�&	/�01������C����$�������&l���
�.*/��01����$�&m��
�*&/��01����&��H�
�/��01��&��&���
�/��01��-����&��t�
�2. /��01������&��:
�0,/��01-��� !@ 	r		r+2+239/33012#"&'732>54&+517!5!
C`<>lFM|"6^;6M+`^E�����$<M)Ed6@7!+1(I1FY8�>7���$�	@rr+2+239/3301"&'732>54&+57!5!3�Mz7X<:M'hd7����qv">V�B</.+N1PX1�==�u^2U<!��]��&�s���
/�01��J�&�sd�
/�01��]��&����
�
/��01��J�&���
�
/��01��*����&����
�,(
/��01��'��,�&���
�($
/��01*����+#@		"'r	r+2+29/333015!".54>3232>54.#"WS��KzX02[zGKyX02Zz��&Fa;<aE$&G`:<aE%O55��<g�DG�e;>h�CG�e:h:kS13Uj7:jT02Uj'��,'@$rr+2+29/30175!".54>3232>54.#"P��8_E&&F_88^F&&E_�3V44V44V44U4�##��+Ka68aK++Ka86aK+:_78a9:`8:_��*����&|���
�0,/��01��'��,�&}��
�,(/��01��0����&����
�.* /��01��&���&�n
�($/��01����o�&�sy��/�01���&
�&�sI�/�01����o�&����
�/��01���&
�&��j
�/��01����o�&����
�/��01���&
�&��
�/��01��E*�&����
�	/��01��:��&��^
�/��01��Y�y��&�"u�V+4��J���	&�!X�V+4��Y��&���
� /��01��J[�&��
�/��01�/�@r/2?33+29/301"&'73265#53'!!5!�*
42k�&FA����v�=LE>?A]2��>�x<11�=�	@r

/2?33+29/301"&'73265#53'!#'5!_)
3/G�&E.6�8�8J=<==W.�	=�4�..�,�@r/2+2901"&'732>54&/#	33�+1"��P��P��O���)!0M�=3#J*���cc��0���4[%4M,�>�	"@r
/2?+2901"&'732654&/#3?3=
	%.!&A	�M��L��M�R+.*C�;<,(L+N
���`3c00L+� @

		r+2/9/339015!3	##	�a�h��N��N��O��G--��5����+��^h�	@
	r+2/39/9930175!?3#/#6n����I��J��I���..�������)����-@  r'	r+2+29/3901".5467.54>32.#";#"3267Dj<F=496`>Hg3N4,C$"<&ED0E$XM8V6 v	0Y>AbW68S/>7").":'$:#8$A*BO0,!8?#���/@
"r)r+2+29/3301".5467.54>32.#";#"3267�9Z32.'2V3+F41%1:H-?<3:#>)4J8i$D//A
!.+=!+.((67','#27��&�.~�&�u���=�	&���*����6��(�+V���<��	\��T�y��&�"'�
V+4��C��0	&��!��
V+4��Y�y��&N"��V+4��K��K�&O!��V+4�����.��&�������=�	&����&�y��&�"9�V+4����8	&�!��
V+4��*�L��&('���3��9/�01��'�L�&H'�����5	/�01��Y�W��&)����İV+4��(�W7�&I���1��ذV+4��Y���&)�������V+4��(�7�&I�q�1����V+4��Y6R&*'�����x��/�/�01��'��-�&J&�c����-�&&	/�/�01��Y6R&*'����x��/�/�01��'��-�&J&�c����*�&&	/�/�01��Y�L6�&*'������'/�01��'�L-�&J'�����A	/�01��*����&,����'
/�01��(�!�&L�g�7
/�01��Y�W��&-� ��K�W�&M�����ΰV+4��Y�h��&-����K�h�&M���!
��ذV+4���\&.'�����5���/��/�01����&�&���&���/��/�01��Y�W9�&1�����ΰV+4��N�W�&Q�]���ӰV+4��Y�9�&1�����?�&Q�������V+4��Y�W�&2�e��K�WR&R�z�&
��ΰV+4��Y��&3�4��
/�01��K�&S���/�01��Y�W��&3�4���ΰV+4��K�W&S�����ΰV+4��Y���&3�����ΰV+4��K�&S�[�����V+4��*���e&4'����2��D�((
/�/�01��'��,�&T&�P����@�$$
/�/�01��*���c&4'�������HD�((
/�/��01��'��,�&T&�P����D@�$$
/�/��01��*���R&4'�����x�/�((
/�/�01��'��,�&T&�c����+�$$
/�/�01��*���R&4'����2x�,�((
/�/�01��'��,�&T&�c����(�$$
/�/�01��Y�Wg�&7�����ΰV+4��K�WO&W����ΰV+4��Y�g�&7�������V+4����O&W�������V+4�� ��=�&8����3./�01�� ����&X���,/�01�� �W=�&8���4��ӰV+4�� �W�&X���-��ذV+4�� ��=u&8'������7�33./�/�01�� ����&X'������0�,,/�/�01�� ��=u&8'�������:�88./�/�01�� ����&X&�S����3�11/�/�01�� �W=�&8'������4��ӲV7./�01+4�� �W��&X'�����0-��ذV+4/�01���WQ�&9���	��ΰV+4���WE�&Y�~���ӰV+4���Q�&9�m�	����V+4���_�&Y������V+4��O���e&:'����4��6�/�/�01��F���&Z&�I����:�/�/�01��O���O&:'�����x�"�/�/��01��F���&Z&�]���&"�/�/��01���&<�|��/�01���&\��/�01���&<����/�01���&\�P�/�01���&<�f�
�/��01���&\��
�/��01��{�&>����	/�01��� 
�&^���/�01���WS�&?���	��ΰV+4���W�	&_���	��ΰV+4����E�&Y����
�
/��01K��S�<!@
:2-(r"r	r+2++2901"&'732654.'.54>7.#"#4>32�?n)+Z1=L%E07I$0Sh6
.G+;Q+A%D\5?_;:fL+7)<X0o
*+0)%1. "3*2@%(62U5�.�5W@".P7)# !4/IR���W��&&���!�W�&F���:$��ɰV+4����&&�$��/�01��!����&F���C/�01����&&(v��@/�/�01��!���
&F(+�@@??/�/�01����&&)���@/�/�01��!���&F)8�C@??/�/�01����&&*���@/�/�01��!��� &F*T�J@??/�/�01����&&+����/�/�01��!���+&F+@�@@??/�/�01���W��&&'�����/�01��!�W��&F'���b�:$��ɲVC/�01+4����&&$����/�/�01��!���,&F$w�G�@@/�/�01����&&%����/�/�01��!���*&F%t�J�@@/�/�01����&&&���#�/�/�01��!���@&F&x�Q�@@/�/�01����&&'����/�/�01��!���3&F'\�G�@@/�/�01���W��&&'�����/�01��!�W��&F'���z�:$��زVD/�01+4��Y�W6�&*��
��ΰV+4��'�W-&J���'��ɰV+4��Y6�&*�#��/�01��'��-�&J���0	/�01��Y6�&*�x��/�01��'��-�&J�P�/	/�01��Y6�&*(t��@/�/�01��'��-
&J(L�-@,,	/�/�01��Y6�&*)���@/�/�01��'��-&J)Z�0@,,	/�/�01��Y6�&**���@/�/�01��'��- &J*u�7@,,	/�/�01��Y6�&*+����/�/�01��'��-+&J+b�-�,,	/�/�01��Y�W6�&*'�����
��IJV/�01+4��'�W-�&J'�����'��IJV0	/�01+4��3��&.��N��/�01��
��&���(���/�01��Y�W��&.�+���İV+4��K�W��&N��	��ΰV+4��*�W��&4�&�)��ΰV+4��'�W,&T���%��ذV+4��*����&4�J��2
/�01��'��,�&T���.
/�01��*����&4(���/@..
/�/�01��'��,
&T(M�+@**
/�/�01��*����&4)���2@..
/�/�01��'��,&T)Z�.@**
/�/�01��*����&4*���9@..
/�/�01��'��, &T*u�5@**
/�/�01��*����&4+���7�..
/�/�01��'��,+&T+b�+�**
/�/�01��*�W��&4'�&����)��βV2
/�01+4��'�W,�&T'�����%��IJV.
/�01+4��*����&E�2��8
/�01��'��,�&F���4
/�01��*����&E����;
/�01��'��,�&F���7
/�01��*����&E�J��B
/�01��'��,�&F���>
/�01��*����&E����8
/�01��'��,�&F�P�=
/�01��*�W�&E�&�9��ΰV+4��'�W,^&F���5��ɰV+4��O�W��&:�)���ӰV+4��F�\	&Z�����ɰV+4��O����&:�L��$/�01��F���&Z���(/�01��O���&G�4��*/�01��F��q�&H���./�01��O���&G����-/�01��F��q�&H���1/�01��O���&G�L��4/�01��F��q�&H���8/�01��O���&G����3/�01��F��q�&H�I�./�01��O�W&G�)�+��ӰV+4��F�\q]&H���/��ɰV+4��{�&>����/�01��� 
�&^���/�01���W{�&>���
��ΰV+4��� 
	&^�%��{�&>���/�01��� 
�&^���/�01��{�&>�l��/�01��� 
�&^�=�/�01��A�e0A��0�/20175!Ar�??A��0�/20175!A��??A�D0�/20175!A�??��A�D0R@	����/�99013#57|C�jggj@	����/�99017#53GB	kffkP���f��/�99017#53VBhhffh��@	��&TTy@	��
@	
/3�29017#5337#53GBWB	kffkkffkP��f
@
�
/3�29017#5337#53VBSBhhffhhffh'�~o�
//9/33301#5333#���A���r>�'>��)�~q@
	//9/333�22301#535#5333#3#�����A�����!?n?|��?n?��V	��/301#".54>32	))))Z))((A�b@
	
?2332301353353353A;L9M:bbbbbb.��	�/?O_e5@`eeP@@XHH8((0 	rcbbr+22/32/3+22/333232/301".54>32'2>54.#"".54>32'2>54.#"".54>32'2>54.#"		�)D))D))D((D)--,-j)D((D)*D((D*----{)D))D))D((D*----��#����&B'(B&&B'(B&'00//�&B((A&&A((A'(/00/(&B((A&&A((A'(/00/T[����E	��
��/�0153E;	����E	E�&__�)B!�@	/3/39017')�����;��;�?B8�@	/3/3901%57'58�����;��;��(��r��rr+2+201'		�#���T[����&��*%�!
BD?2�201".54>32'32>54.#"�0H02G,0G01G�!A0$7$"A/$7$�%=F"$G<#&=G!$H:#�%I006%I0/7�b*

@
		
BD?�29/3333015#5733#'35���99��g*��+g���V*&@	# BD?3�29/3012#"&'732654.#"#>73#>�+E),J,1P@'0B!38)
� 0� 9%(<!)" 2))098*
,�(�s**@#
BD?3�29/93014.#">327.#"32>".54>32s*I/(HG8%<I-N^\I/K,� 8"!7!"7!!6&=##KT "%vwP[%?;,++,�[*�BD?�201#5!#�A�3�,�q&�g*+:@ 008B(D?3�29/33301#".5467.54>324.#"32>'32>54.#"g,J,.H):".+C##B+,!(5-#55"$64"�..-&=
"5 6 '2) -- *5!!!$$�# �k**@	

#BD?2�29/301"&'73267#".54>32'2>54.#"�,K<%9FH)-I+,K.I]^H!6!!7!!7 !7�&"TK%$>%'>%[Pwv�,,,,&���?%�!
BA?2�201".54>32'32>54.#"�0H02G,0G01G�!A0$7$"A/$7$U%=F"$H;#&=G!$G;#�%I0/7%I007"��
E@	

BA?33�22301#53#52>73
�Y$+$-$,,5	,��$��^D"@B A?2�29014>7>54&#"'>323$8*?+33!2"
'F0II+1,-�P4E.%, !D3+**,#��_D,@
&BA?2�29/3301"&'732654&+532654&#"'>32�>U!8$1DRC?H?+)=-: ,E)/,.8-IU0)"' #(("! '"2#,
9&"1��b?

@	
BA?�29/3333015#5733#'35���99�Pg*��,g����V?&@
$$# BA?3�29/3330172#"&'732654.#"#>73#>�+E),J,1P@'0B!38)
� 0� 9&'<!)! 2)(188*
,�(��sB*@	#
BA?3�29/301%4.#">327.#"32>".54>32s*I.(HG8$=
J,N_]I/K+�!7"!7!"7  64&=$$LS"%vvQZ%>:,+,,��[?�BA?�201#5!#�A�3,�q&��g?+:@0  8B(A?3�29/33301%#".5467.54>324.#"32>'32>54.#"g,J,.H):".+C##B+,!(5-#55"$64"�..-&="5 7'2) .- *
4!"#$%�#!��lB*@	

#BA?2�29/301"&'73265#".54>32'2>54.#"�-J;%:FI(-J*,K-J]^I"6!"6" 7!"7U%"SK$$=&&?$[Pwu�++++(��� $(,0)@*/+--r#%"''r+233�2+233�2014>32.#"32>7#".#53#3##53#3#(BvLJpCO04V34V4"?/C@W38`F'F%%�%%�%%�%%JzHC9(-6^<;`9)%;!+Lb������J�	
@
r?+29/3�2013!!!!'5!y�tO���&�>��:���661����6:>@7:>;;
6(/	r
r+2+229/3�2017>54.54>32.#">323267#".#"!!!!3/6(1S17`'N* 4'.&$/,*855;P��P��*.G? -IBD&/N.81*)1 5!!?@K/!?B*				4


�+=*%%�"@

r
?3+29/993�201!5!5!5!%#33#%����F:�FA+>+�����O�;Y����
2^=@ /r#++$(PI(II(:3r''r+/33/+29///33333+201332+32>54.+#".5#53533#3267"&'732654.'.54>32.#"Y�.L93\=WS*>"(A'Mv"03HHDxx&-�;d%(S-9G#@,2C"0Q37UG+6"4&7Q,e�&AO):g@��D.J+,J+��-!u6��6��Z*+0)%1. !3)3C#&". '" !4/IR)4�!=@  !r?3+9/93�2233333301!5!3!!'!5!3!!3733##3��C�D��C��CdeC}�K��>��>��K�>++p**�����u�:_����A)L�,04/@
		2233 (--0/33|/33/33|/33/3/3014>323'.=#".%5.#"32>!!!!B6a=AgD i;@e9�
9J%/G(-K.93"�R#��.��C=h?E1)��6 32=AiQ$;#1O-0K,$/�+�*!����,!@
(	r
r+2+29/993�2017!7!74>32.#"32>7#".!�7�+8-V~P_� 7FO'@bC"(Ha9(TI:\q6IzY0++�++8A}g=WD"/73Ui6;lS1:.5J&?i��� @

	rr+2+29/930175!33	#8�F�M��1O��55��d���rd��Q�@		

rr++23015%5%###5!?��0�F�@'�'��'�'>�x�>R�!&@!	r?+299}//33�201!!!!!2+32>54.+P��P��J&.M8 6K.��*>"(A'�/+=*�c�&AO),P@%��D.J*-J+*���/(.0@.*++r#	r+2/223+2/2239/3?01%#3".54>32.#"3267#53#]....GzZ11XxGi�"6"rF;_D#(Ja8At5eZ��;����W=h�DH�d:VE$B>2Tj9<kS/ADJz,6��7����'+/'@-,(
))
r!	r+2+29/99993�201"&54>54&#"'>3232677!%7!*kf/JTI0CI+N!'\>ha0ITJ/EO0P#&^����o�UO1L<65?(352QJ2J;55@*783/  V  *���/,'@(	r
r+2/233+2/22301%#34>32.#"32>7#".]....��-V~P_� 7FO'@bC"(Ha9(TI:\q6IzY0�����A}g=WD"/73Ui6;lS1:.5J&?i�Q�@
	r?+23}/301!#5!#5!�@���@??���>>+��@�
r?+99�2330132#32>54.+!5!5!5!+^.L9'G0�O�>*="'A(Z��x��x��&AO)3Z>
��D.K*+I-\*E+"#�@r?2+9013332>53#%5%5%`F�4>
F0[K��k��k�x,G48\B#�3�33�4O����@


	?3/3933/3012#4.#"#4>?zRrG F3YDBX4EDt9..N4Yt@��/\K,+J\1��<s\6����  @ 	r?+29/3�233015!5!32+32>54.+��M��1N70[A��1=!A/�>>y77��&AO):g@��D.J+,J+H��-�&@	&	/3?39/3017>54&#"3267'#"&54632w#A4=2!6605
$!&0�Ygd):H";%�267"�")*'QTJYa�	)!@	

&r?+22/33/3?9901#33#".54>32'32>54.#"�F6�F=?6Q-.Q46Q..Q�!8""7""7"!9!D����N�;\2T/2S22S2/T2�$<$%=$&;$$=6���23@'*-0

$00?33/3�292/3/90173#5#'#3.#"#"&'732654&'.54632�UC0T(T0B�* *1;@1$>4"  ,13?02���ٯ��)
	%,('$	"')+>���)@
r+�923333301##5#533#5#'#3,_0_�C0T(T0BU���0��ٯ���-��-!@+-r!
r+2+2233330173.54>323!5>54.#"!-�8R,1XxFGxX1,R8���2M7$C_<;_C$6N1��>]tAE~b99b~EAt]>>>T_05fR11Rf50_T>>+��: @	r	r+2+29/301%"&'5!4.#"3267'2!5>21W�CwNMwCBwNKi#`E2X��W-&�L}KK{IH{K0#,�.(|}'.��"��	�&'c�#��s�"(U;@O:77)@HH)#((1)&%% /33/293/3?33/33/39/33014>7>54&#"'>323		"&'732654&+532654&#"'>32#7(?*22 1!
'C0GG+/+,�#���>U!8$1DRC?H?+)<-: ,E)/,.8,JG4E.%+!D3*)*+��T[����0)"' #(("! '"2#,
9&"1��"���&'c
���#����&'c�
 ����w�&'cv
����,�&'c+
����!2@+		r"r+2+29/301".54>32>54.#"'>32'2>54.#"�@c8'DY2>](H2.T'!i:moDxO(A1(F+0S3(F
7]9/VC'>8$$Yg- )&'����\<4@!)C(1Q0*D('��,)#'@
&% 
$'?2�2?3�201".54>3232>54.#")8_E&&F_79^F&&E_�3V44V44V44U42� �?
+Ka67bK++Kb76aK+:_78a9:`89`��;��`�@rr+233+201%!53`��:���555��x6������@		r/3+23301!##5!##��BRtPB���>>� ��
!@	
/333/9933301!!5!55!�G������]�.���3@-D�C�/2015!D�88����U��rr+2+201'3*���"�TA�|f�/201753A;�pp�
@


r+2/9/33013333#�gGGvB����m����m3-��/? @0<$ 8(/223�2923012>32#".'#".54>2>7.#"!2>54.#"�'4&$5&0F&)F.$4%
%7((H-*G,,  + //6.. +
 +//-K.-K----L-.J-��130&&11&&0 40	�Y$4�
/3/301&632.#"#"&'7326'b408
# )4/6  �/?	0%"�4:	0&"A�o|-@�@%�)/3�/2�2�201#".#">3232>7#".#">3232>7Q*,& '/ 	*,& '/ 	e$	

Q
$

		SJ��@
/�23/333/3017'!!5!!l��8-��-��]����1�1>=�
@
	/3�22/390175!%%?B��>���=99B�BomD�A=�
@
		/3�22/390175!57'5AC����?=99�DmoB���	@	?3?3901#!��I�������nl��B���9�9x��
��/�01#7#53_#?�JLLQ�31@		+$r2/3
r+2?3333333+29|/3013#5354>32.#"3#3#5354>32.#"3#dHH%I5#9))���HH&D0:)/4���6,P23
"(6�-�6@\11JF6�-��@
r	r+2?333+201#5354>32.#"!###dHH-E0%;,?%*5D�D�6%H<$	1+B"���-��I�) @r"
r
r+?333+2+201"&54.#"3###5354>323267�.6/*'2nnDHH(P<XZ&
	!$7.�2!(B(
6�-�6;Z3XD�.%	8��86@		,$r61488
?23?3333333+29|/3013#5354>32.#"3##5354>32.#"!###dHH%I5#9))���HH-E0%<+?%*5D�D�6,P23
"(6�-�6%H<$	1+B"���-��3�D@@ 
		#6r=r(11+..-
?2?3333333+2+29|/333013#5354>32.#"3#"&54.#"3###5354>323267dHH&J5$6&)��,/6/)'2nnDHH(P<XY&

!#�6,P23
"(6�-7.�2!(B(
6�-�6;Z3XD�.%	8#�� �b>@#TTJMM<+A&F!0Jr80r\

Y
r`r+2+223+2+293333/301%#".5#534.#".#"#".'732>54.'.54>32.54>323#326#/3II((@2 !M$!='+2$G:##:H%*PC,]0!?+/5&D39Y.!B
G=5<vv%.P7-!u6KR 9+4)("*$$4(*;$#/#$*$#2&9D 0#%>&8U86���@
r+22/3901##33�I��I�N��Lо�:U����a��a*����-@$##
r	r+2+29/301".54>32.#"32>7#5!|J|Z22Z{JY�+7+8C'<aD&&Ea;3WB,�4Vq<g�EF�e;UD-1&3Uk77jU2&@R,?>qX2��K��&���/�01!��� 3@ 
r'

r0r+2+29/3+01!5#".54>3254&#"'>32'6=.#"32>�$l:1N.'?N&6PNE'T,,c6D]0U#J$:0#9 @7R0,+I.)<&	/CS -'4^=��sU
*"4 (��"&"@
rr&

r"r+2+29++01".54>3253#5.#"32>77ZB$%BX3AfDDb�6E)*F22V7*E3
,Ka58bK*C4j��i3@Z'="%=K&8_:!;$(���'"@r'
r"r
r++2+29+01!5#".54>323.#"32>7�d96[C%=lDBd DD
:I$*D16F)93"a0;,La4J{JE1>�&T%;"#=K(*L; #0K�+���r+�2?013#3#KDDDD�&�[Q���
rr++0130*#QD	�&(�,7/$@rr!"
'
rr+2+29++201".54>3253#.5'2>75.#"5W>"&C[4=g=
	!Md)C3"2:+E41T
,La57aK+?0f�};$v<!8"�1'$<L'8`9)�@
r
r++2/223013#53533#hMME||�>��>�5F��	@rr
r++2+29901!5#".5332>73�AQ*3D%D63*I7Dr&8$?Q-2��1P0'A'H��'	@
	r
r+2+93301!#333(��G�G��A��G���^	�L��L����+	@
rr+2+9901	#73��LV�H��	�"�	�6�'��e�R7@CC=:r,++'0rK		HrOr+2+223+22/3+22/392/301%#".5#534.#".#"32>7#".54>32.546323#3267e"03HH,*31BP1*E14E)?3CEX-;`E%$B`:2ENJ<Bww%--!u6)E3>,;7.
,)$<L'*L; '):-M`35aM,=#=O"=S06��7$
?@#
		

		>/2?9/93339<<<<0133#'!3�4�BL��K�v�$�ܥ��T$&@>/3?39/3901%#!!24.+32>32>54.#-M/��!)= ,(3;?-��0���,*�)@$$)A")EJ),�-m�,*,��1'#�??3?3014>32.#"32>7#".,%IjDOr2b05R7!;P0!F<5M_.=gK(2`P/C5 6)&?N(,P?$+#(91QeT?$

�>/2?301332#4.+32>T�_�@G�X�4cH��Id2$J{LS|D@a8�L9dT�$@	

>/3?39/301%!!!!!�m���#��88$8�4�T�$	�>/?39/3013!!!!T�����$8�6�,��4'!'@
$##
?''/22/?39/301".54>32.#"32677#53#B<fK))Je<Wo1_:1N7!<P.5a+*c���6/Pd57cM,B5!2.%?O*-P=#03B--�0��T-$�	>?2/39/301#5!#3!5->��>>]$���$��T�#	�>/?0133T>#����\#�>??301732>53#"'&;$<:>(OBM5L3cG��>gH(!T($@

	>/2?3901333#T>DF�J�l#��6��
b�T�$�>/2?0133!T>K$�8T�$@
	>/2?3901!##33c�$�>A��A���O�M$��l��TI$	�>	/3?39901#33#�>0�?6��Q$�I���,��]''�#
??2?301".54>3232>54.#"E?gK(*Lg=>gJ(*Kg��:Q02P8 :P/2Q9/Oc57cN-0Pc37dM-+O?$&@N)+O>$%@NT�$�
>/?39/301332+32>54.+T�4R-+M5��#2 6!�$4O+-P2��!6"5 ,��]''+@
?((**?2/23/?301".54>32'2>54.#"73#E?gK(*Lg=>gJ(*Kg<2P8 :P/2Q9:Qa>�>/Oc57dN,/Qc37dM-9&@N)+O?$&@N)+O?$z�T$@

>/2?39/3901332#'#32>54.+T�4Q.!;(�H���"36"�$4O+'D0����!7 5!$���'.@	'+??3?39901.#"#"&'732654.'.54>32�0=#KG#H8>[1:M/Ex1?O-BO(N;=S*6`=;^$�3-#
":1'9%''4!-, (!7,3G# �$�>/?3301###5!��>����8K��@$�
>?3?301%2>53#".53E7J*>;_EFa:>+H5%?N(��7cM,.Nc4��)O>$:$
�>?2/9013#T��B�6�$�3��$r$@
	>?333/39013733##373;ST;io�E�7||8�D�l ��������$�(�
$@

	>?2/390173#'#S��F��E��F��$������ $�>?2/9013#5X��E�?�$��"����Y%$	@		>?33/33017!5!!!%��z�y��&1�82�F8�x��@

r+2?3/3333015333#5!7!?�?�?;��C�ʈ���xƈ��:���r/2+90133#?H���:s��(��#-!@-r$	r+�333+�333015.54>753'>54.'sDx\36]wACCw\56]wABJ|I,MauJzI,Ka5:56^�OS�^3555^�QR�^35o\J�\GmM*J�ZFoM+��Y+�+��-�u��,��*�u��>��-�L��&��z��*�L���N��� +@
!(rr+2+29/3301"&54>32'2654&+32654&#"*jr/Z@8U/2,DK8aBINPJ�OO�8GG8;Fqk*>Z2&I45JgQG^/:ULNR�IRt>99<H?:���+@"r%r+2+2901".54>7>54.#"'>323267DZ--[C&/13G0aG3N, D7MNM?6T,"m
<+09(&$'/<-,6#4.-'!$!,,��(�!L&��0@


r+2/2/?3/3/9/33333013'333373#'##5#&ðM�DFF�N��O�FFD�����b�������$�+@
%rr+2+29/3301"&'732>54.+532654&#"'>32�Gt8S26I&&G4P==NG8*H5dERf8.FI8e�B</.+O11H*5B=9@)/5A[P9NmOBd6��F��	Z��F���&Zq�/�01��F������K	�P	�r+/3901##0�H��D�	���;	��KS��KRRF��K	@	
r	r
/?3+2+299015'./#"&5332>73;
"uDRTD=<(K:D
0yyD<Dro2��YX#A+H�O�F��L	$'@rr
r		r+23++2+290133267332673#5#"&'#".5FD9:;\D99;]D> g@AP	#f@,<&	��[VTB>��\USB?��v<CK;BD ;S3D���	.'@'&#	-
?�3?3?3?933015'.'5#"&'#".533267332673;U iAAP	#fA+=%D:9;^D8:;]D
/yyE<DK;BD ;S31��[VTB>��\USB?�O�F���	@rr+2+9/301"&5332'2654&+goD�1N88N1FLLF�KjcB�,C--C-:@:;?dEK��V	@rr+2+29/301"&5#5332'2654&+�gq��1N88N2FLLF�Ljc	9�,C--C-:@:;?dEKJ�		@	r/+29/301753!#`���7��..�	=�4��'��?���L�-��'�L�)��.�.@
'rr+2+29/3301".54>7.5463!#"2'2>54.#"*HuD'E/23TK�42JDKvDEvI5U32V44V33U
>nF4WB@)CD<',)3>mGFn><-Q67U//U76Q-0��{�'�#
r	r+2+201.54>3232>54.#"VHnJ&)MlDImJ%)Lm��8Q78T7:R59T7
Bk}<@�i?Dl~:Ah?g4iW58[g/4iW59Zg*��@
r?33+22/301%!53#52>73����	#.06/E>>>E@%�o/�(�r&/2+2013&>7>54.#"'>32!0-@(&RF+!D43O5-%?W:Jb1)AK!@L%�?`J7#*=.&@'"0,(,9\75I1$888>0���2@
+#r		r+2+29/3301".'732>54.+532654.#"'>32?f@*2W82Q/8fF""ap-K,B^/EY0Dk= >-/G'Ep	*J1&"A(#=),?";@@*>":+.$44X9(?+	4K-<V/�

@	
r?+29/333301!5!533#%!w��r/XX���=�6>��`(���"@r	r+2+29/33301"&'732>54.#"#!!>32Ly.b:2O/.L0.T@PW��2M,Ai=Bo
K>"1<,M31K+*&�?�:eCEk;4��/�.@
'	rr+2+29/9301%4.#"4>327.#"32>".54>32/AoD-O:1X;8[,pGNvBBsJGrC�3T32U32T33T�Cm@ :'b�J=3(=G^��\�GBou2T23S22T22T2
�
�r+2?01!5!#����L�?�:2���!3C@8''@r0	r+2+2933301%#".54>7.54>324.#"32>32>54.#"EqCGn?+A"6 '@O('OA'!6 'A'E5? +Q34? +Q4��/H"$G/,G(&G+�>\39^:-I2
+:#,C/.C,#;+

5H($7&%C.#6'%Dp&77'&67,��&�.@
'r	r+2+29/330132>7#"&'32>54.#"72#".54>,AoD-O;1X;8[+pFOvAArLFsB�3T43T32U22T�Bn@ ;&b�I=2'>G^��]�GAou3T22S33S32T2��&���?k��"��
El��$��^Dm��#��_Dn����b?o����V?p��(��sBq����[?r��&��g?s��!��lBt&����%�!
B?2�201".54>32'32>54.#"�0H02G,0G01G�!A0$7$"A/$7$%=F"$H;#&=G!$G;#�%I0/7%I007"
�@		

B/33�22301%#53#52>73
�Y$+$-,,,5	,��$^�"@
B /2�290134>7>54&#"'>323$8*?+33!2"
'F0II+1,-�4E.%, !D3+**,#��_�,@
&B?2�29/3301"&'732654&+532654&#"'>32�>U!8$1DRC?H?+)=-: ,E)/,.8-I0)"' #(("! '"2#,
9&"1b�

@		
B/�29/33330135#5733#'35���99�g*��,g����V�&@	# B?3�29/30172#"&'732654.#"#>73#>�+E),J,1P@'0B!38)
� 0� 9&'<!)! 2)(188*
,�(��s�*@
#
B/3�29/9301%4.#">327.#"32>".54>32s*I.(HG8$=
J,N_]I/K+� 8"!7!"7  6�&=$$LS"%vvQZ%>:,+,,[��B/�201#5!#�A�3c,�q&��g�+:@ 008B(?3�29/33301%#".5467.54>324.#"32>'32>54.#"g,J,.H):".+C##B+,!(5-#55"$64"�..-&=o"5 7'2) .- *
4!"#$%�#!��l�*�

#B/2�29/301"&'73265#".54>32'2>54.#"�-J;%:FI(-J*,K-J]^I"6!"6" 7!"7%"SK$$=&&?$[Pwu�++++&F��%�!
BC?2�201".54>32'32>54.#"�0H02G,0G01G�!A0$7$"A/$7$F%=F"$G<#&=G!$H:#�%I006%I0/7"F��@
	

BC?33�22301#53#52>53��Q!',-s--5-��$G]�"@B C?2�29014>7>54&#"'>323$7+@+33!2"
'F0II,0,,�G4E.%+!D3*)*+#A_�,@
&BC?2�29/3301"&'732654&+532654&#"'>32�>U!8$1DRC?H?+)=-: ,E)/,.8-IA0)#' #')" !'"2"-	9&"2Kb�

@
		
BC?�29/3333015#5733#'35���99�Kg*��+g��FV�&@	# BC?3�29/3012#"&'732654.#"#>73#>�+E),J,1P@'0B!38)
� 0I 9%(<!)" 2))098*
,�(Bs�*@#
BC?3�29/93014.#">327.#"32>".54>32s*I/(HG8%<I-N^\I/K,� 8"!7!"7!!6�&=##KT "%vwP[%?;,++,K[��BC?�201#5!#�A�3�,�q&Fg�+:@ 008B(C?3�29/33301#".5467.54>324.#"32>'32>54.#"g,J,.H):".+C##B+,!(5-#55"$64"�..-&=�"5 6 '2) -- *5!""$$�# Bk�*@	

#BC?2�29/301"&'73267#".54>32'2>54.#"�,K<%9FH)-I+,L-I]^H!6!!7!!7 !7B&"TK%$>%'>%[Pwv�,,,,A�|f�/301753A;�pp1l��
��/�01'73^-;Hl]$K?�
�
�/2�201"&5332673�DJ2-/.+1JK@1(& 1@+Xp@
�_/]2�201".'332673�1C"7)64*7"A3*'3�=�<��/�201"&'7326=3T#
,.DS�;JI+=aa�l�<��/33�017#53	>&m�H��<��.	>��/�201"&'732>=3k)'*F#F�	;*M3&??^4�l�>��/�33017#53	>&m�I��>����<��/3�015#53QQ�yy<��y�>��/3�015#53]]���>�2NV�
��/�017#3V$$N>��+P�,&���FR��*O�*&����P��+R�@&����OO��Q?3&����Y��XQ�
&�.���3����RP&�/���-��/Rb &����/��&Pd+&����Q�l\���/�9901'7'\W-&�n;"nd�?W��
�*)�3 	3�
"
Z
�
���	�	/	G	4_	�	�	
	R:	f�		fT	
�	D
	,
}	
 
�	4uCopyright 2010 The Raleway Project Authors (impallari@gmail.com), with Reserved Font Name "Raleway".Copyright 2010 The Raleway Project Authors (impallari@gmail.com), with Reserved Font Name "Raleway".RalewayRalewayRegularRegular4.026;NONE;Raleway-Regular4.026;NONE;Raleway-RegularRaleway RegularRaleway RegularVersion 4.026Version 4.026Raleway-RegularRaleway-RegularRaleway is a trademark of Matt McInerney.Raleway is a trademark of Matt McInerney.Matt McInerney, Pablo Impallari, Rodrigo FuenzalidaMatt McInerney, Pablo Impallari, Rodrigo FuenzalidaMatt McInerney, Pablo Impallari, Rodrigo FuenzalidaMatt McInerney, Pablo Impallari, Rodrigo FuenzalidaRaleway is an elegant sans-serif typeface family. Initially designed by Matt McInerney as a single thin weight, it was expanded into a 9 weight family by Pablo Impallari and Rodrigo Fuenzalida in 2012 and iKerned by Igino Marini. It is a display face and the download features both old style and lining numerals, standard and discretionary ligatures, a pretty complete set of diacritics, as well as a stylistic alternate inspired by more geometric sans-serif typefaces than its neo-grotesque inspired default character set.Raleway is an elegant sans-serif typeface family. Initially designed by Matt McInerney as a single thin weight, it was expanded into a 9 weight family by Pablo Impallari and Rodrigo Fuenzalida in 2012 and iKerned by Igino Marini. It is a display face and the download features both old style and lining numerals, standard and discretionary ligatures, a pretty complete set of diacritics, as well as a stylistic alternate inspired by more geometric sans-serif typefaces than its neo-grotesque inspired default character set.http://theleagueofmoveabletype.comhttp://theleagueofmoveabletype.comhttp://pixelspread.comhttp://pixelspread.comThis Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: http://scripts.sil.org/OFLThis Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: http://scripts.sil.org/OFLhttp://scripts.sil.org/OFLhttp://scripts.sil.org/OFL�j2-	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a��������������������	����������bc�d�e�������f����g�����h���jikmln�oqprsutvw�xzy{}|��~�����

��� !"��#$%&'()*+,-./012��3456789:;<=>?@A��BCDEFGHIJKLMNOP��QRSTUVWXYZ����[\]^_`abcdefghijklmnop�qrst��u�vwxyz{|}~�����������������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwx��y�����������z{���|}~������������������������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./01234NULLCRuni00A0uni00ADuni00B2uni00B3uni00B5uni00B9AmacronamacronAbreveabreveAogonekaogonekCcircumflexccircumflex
Cdotaccent
cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve
Edotaccent
edotaccentEogonekeogonekEcaronecaronGcircumflexgcircumflex
Gdotaccent
gdotaccentuni0122uni0123HcircumflexhcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJijJcircumflexjcircumflexuni0136uni0137kgreenlandicLacutelacuteuni013Buni013CLcaronlcaronLdotldotNacutenacuteuni0145uni0146NcaronncaronnapostropheEngengOmacronomacronObreveobreve
Ohungarumlaut
ohungarumlautRacuteracuteuni0156uni0157RcaronrcaronSacutesacuteScircumflexscircumflexuni0162uni0163TcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring
Uhungarumlaut
uhungarumlautUogonekuogonekWcircumflexwcircumflexYcircumflexycircumflexZacutezacute
Zdotaccent
zdotaccentuni018FOhornohornUhornuhornuni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCGcarongcaronuni01EAuni01EBuni01F1uni01F2uni01F3Gacutegacute
Aringacute
aringacuteAEacuteaeacuteOslashacuteoslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217uni0218uni0219uni021Auni021Buni022Auni022Buni022Cuni022Duni0230uni0231uni0232uni0233uni0237uni0259uni02B9uni02BAuni02BBuni02BCuni02BEuni02BFuni02C8uni02C9uni02CAuni02CBuni02CC	gravecomb	acutecombuni0302	tildecombuni0304uni0306uni0307uni0308
hookabovecombuni030Auni030Buni030Cuni030Funi0311uni0312uni031Bdotbelowcombuni0324uni0326uni0327uni0328uni032Euni0331uni0335uni0394uni03A9uni03BCuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0462uni0463uni046Auni046Buni0472uni0473uni0474uni0475uni048Auni048Buni048Cuni048Duni048Euni048Funi0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04AD	Ustraitcy	ustraitcyUstraitstrokecyustraitstrokecyuni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0510uni0511uni0512uni0513uni051Auni051Buni051Cuni051Duni0524uni0525uni0526uni0527uni0528uni0529uni052Euni052Funi1E08uni1E09uni1E0Cuni1E0Duni1E0Euni1E0Funi1E14uni1E15uni1E16uni1E17uni1E1Cuni1E1Duni1E20uni1E21uni1E24uni1E25uni1E2Auni1E2Buni1E2Euni1E2Funi1E36uni1E37uni1E3Auni1E3Buni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Cuni1E4Duni1E4Euni1E4Funi1E50uni1E51uni1E52uni1E53uni1E5Auni1E5Buni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E64uni1E65uni1E66uni1E67uni1E68uni1E69uni1E6Cuni1E6Duni1E6Euni1E6Funi1E78uni1E79uni1E7Auni1E7BWgravewgraveWacutewacute	Wdieresis	wdieresisuni1E8Euni1E8Funi1E92uni1E93uni1E97uni1E9Euni1EA0uni1EA1uni1EA2uni1EA3uni1EA4uni1EA5uni1EA6uni1EA7uni1EA8uni1EA9uni1EAAuni1EABuni1EACuni1EADuni1EAEuni1EAFuni1EB0uni1EB1uni1EB2uni1EB3uni1EB4uni1EB5uni1EB6uni1EB7uni1EB8uni1EB9uni1EBAuni1EBBuni1EBCuni1EBDuni1EBEuni1EBFuni1EC0uni1EC1uni1EC2uni1EC3uni1EC4uni1EC5uni1EC6uni1EC7uni1EC8uni1EC9uni1ECAuni1ECBuni1ECCuni1ECDuni1ECEuni1ECFuni1ED0uni1ED1uni1ED2uni1ED3uni1ED4uni1ED5uni1ED6uni1ED7uni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EDEuni1EDFuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE6uni1EE7uni1EE8uni1EE9uni1EEAuni1EEBuni1EECuni1EEDuni1EEEuni1EEFuni1EF0uni1EF1Ygraveygraveuni1EF4uni1EF5uni1EF6uni1EF7uni1EF8uni1EF9uni2002uni2003uni2007uni2008uni2009uni200Auni200Buni2010
figuredashuni2015minuteseconduni2070uni2074uni2075uni2076uni2077uni2078uni2079uni2080uni2081uni2082uni2083uni2084uni2085uni2086uni2087uni2088uni2089
colonmonetarylirauni20A6pesetauni20A9dongEurouni20ADuni20AEuni20B1uni20B2uni20B4uni20B5uni20B8uni20B9uni20BAuni20BCuni20BDuni2113uni2116servicemarkuni2126	estimateduni2153uni2154	oneeighththreeeighthsfiveeighthsseveneighthsemptysetuni2206uni2215uni2219commaaccentf_ff_f_if_f_ls_tW.ss09G.ss11	i.loclTRKa.ss01a.ss02d.ss03j.ss04l.ss05q.ss06t.ss07u.ss08w.ss09y.ss10c_ta.scb.scc.scd.sce.scf.scg.sch.sci.scj.sck.scl.scm.scn.sco.scp.scq.scr.scs.sct.scu.scv.scw.scx.scy.scz.scuni0414.loclBGRuni041B.loclBGRuni0424.loclBGRuni0492.loclBSHuni0498.loclBSHuni04AA.loclBSHuni0498.loclCHUuni04AA.loclCHUuni0432.loclBGRuni0433.loclBGRuni0434.loclBGRuni0436.loclBGRuni0437.loclBGRuni0438.loclBGRuni0439.loclBGRuni045D.loclBGRuni043A.loclBGRuni043B.loclBGRuni043F.loclBGRuni0442.loclBGRuni0446.loclBGRuni0448.loclBGRuni0449.loclBGRuni044C.loclBGRuni044A.loclBGRuni0493.loclBSHuni04AB.loclBSHuni0499.loclCHUuni04AB.loclCHUuni0431.loclSRBzero.lfone.lftwo.lfthree.lffour.lffive.lfsix.lfseven.lfeight.lfnine.lf	zero.subsone.substwo.subs
three.subs	four.subs	five.subssix.subs
seven.subs
eight.subs	nine.subs	zero.dnomone.dnomtwo.dnom
three.dnom	four.dnom	five.dnomsix.dnom
seven.dnom
eight.dnom	nine.dnom	zero.numrone.numrtwo.numr
three.numr	four.numr	five.numrsix.numr
seven.numr
eight.numr	nine.numrperiodcentered.loclCATuni030C.altbrevecombcybrevecombcy.casehookcytailcyhookcy.casetailcy.casedescendercydescendercy.caseverticalbarcy.caseuni03060301uni03060300uni03060309uni03060303uni03020301uni03020300uni03020309uni03020303
apostrophe��T\����������������#$+,, 0��������$+�
�hDFLTcyrlRlatn0�� !"#$%&BGR VBSH �CHU �SRB ��� !"#$%&��	 !"#$%&��
���� !"#$%&4AZE nCAT �CRT �KAZ "MOL ^ROM �TAT �TRK �� !"#$%&��
 !"#$%&�� !"#$%&�� !"#$%&�� !"#$%&�� !"#$%&�� !"#$%&�� !"#$%&�� !"#$%&'aalt�c2sc�ccmp�ccmpdligdnomfracligalnum$locl*locl0locl6locl<loclBloclHloclNloclTloclZlocl`loclflocllnumrrordnxsalt�sinf�smcp�ss01�ss02�ss03�ss04�ss05�ss06�ss07�ss08�ss09�ss10�ss11�subs�sups�!#$1
	
 %"&'()*+,-./02fnv����������������
"*2:BLT\fnv~�����������������@d����48<N`dhlptx����&.2:\x��������LPTX\`dhlpz~��Mc�������������������������������������yz{|������������������������	

M'()*+-./012356789:;=>?GHJKLMPRSUWX[]_{"#&'������������������&'->>LZhv������������� &,28��kd��l}��mv�n�w�o�	e�p
f�qg�rh�s
i�tj�n���~�����n�����������~����������������&,4<FINOQTVYZ\^,>?NO��,NO������
��NO
��NON
,
+�*�)�(�
'�&�%�$��� {QQ {11�{�{yz{|"#&'yz{|"#&'_N_N_N_N_N	�����,->?�����&',>?.�������������������������������������V�
d}vwefghij��O�c����&F4Tn~n~&4FT�T3�&?sF_
�Y�YHX6"(�KQ�KN�Q�N�KKhFhFiFgIbOaQ]V[Y[Z
��<\Y^�,�
NxDFLTcyrl$latn4������kernmarkmkmk (20���\���X��*
`���`���Bh�x�(<�P��J8�l����� � �!4!�&�&�&�''F'�&�&�(J(�+Z,,r,�-�.3B48b9T9�;�=�>,>z>�>�??z?�?�@@@D@�@�@�>,A
A(A^A�A�A�DzD�GVG�G�IpI�I�JJ�JNJpJ�K ������!4 �!4!4!4!4&�&�&�&� �&�(J(J(J(J(JR
R-�-�-�-�8bR�T�=�=�=�=�=�=�>�X:>�>�>�>�?�XxX�YlZJ@�@�@�@�@�@�]@]fA�A�A�A�GV>,GV�=��=�]�^� �>z �>z �>z �>z �_ �a�!4>�!4>�!4>�a�>�!4>�&�bN&�bN&�bN&�bN&�?�bl?�&�e�&�fd&�f�f�f�&�?�'f�'F@'�@D'�g�hh�'�'�j�&�@�&�@�&�@�k^k|(J@�(J@�(J@�a�>�,A(,A(,k�,rA^,rA^,rl,rA^,�lJ,�ltm�A�-�A�-�A�-�A�-�A�-�A�-�r�3BDz8bGV8b9TG�9TG�9TG�(J�=�!4>�R]f,rA^,�r�?�@�r�!4!4ssxs�&�&�t�u'FuPv^v�!4ww�'F&�&�(Jx:x�yz�{^(J(J{�||�>�|�}A�A�@A�A�@�@�A�>,}J}�GV@�~~DA�A�~DA�@�@�A�>�>�~J~�?�l��@A�GVA��'F@'F@&�@� �>z8b�(��A�A�?�&�'FA�?��=��=�!4>�!4>�(J@�'FA�A�(J@�(J@�GVGVGVA�A�(J�3BDzA� �>�&�?�&�@�,A(,rA^,؂3BDz3BDz3BDz9TG�!4>�!4>ڂD�b(J@�-�A�8bGV8bGV�ڂ|�·$�|���$JJ������8��@D��@DA������`������X�����bA��䜞��������Ȣ��������������~�ԧ򨌪����ܮ������p(J � � ��A�A�A�@@�@�A�>z>z��0�b���������$P����&��/��9��;��<��=��>��[��\��^������������������������������������������&��(��*��8��9��:��;��<��[��]��{����������������������4��B��D��d��f��h�������������������������������@��A��F��G��U��X��������������������������������������%����������������������������
����������������k����&/9��:��;��<��=>��?[��\��]^��_�������9��������������������������&��(��*��,��.��0��2��4��6��8��9��:��;��<��=>?@AB[]9_`{�������������������4��B��D��dfh9�������������������������������2��@��A��F��G��U��X�����������������������
������&(��,��4��6��9;<=>FH��I��J��KL��OT��V��YZ��[��\��]^�����������������������������������������������������������������������������������������������������������������������������������������������������������������������&'()*+-��/��1��3��5��7��89��:;��<C��[\]^_��`��{|�����������������������������������������������������
��
��4>��?��BDE��defghik��z��{��|��}�������������������������������������������3��@A��FG�����������������������������������������������������������������������������������������������&��/��9;<=>F��H��I��J��L��T��V��X��\�����������������������������������������������������������������������������������������������������������������������������2����������������!��#��%��&(*89:<C��[��\��]��^��`��z��{����������������������������������������
����
4?��BDd��e��f��g��h��i��k��{��}�������������������������@F�����������������������������������������������	���������������������;��O[���*��C����������������������D��E���������������������'����������;��=��[��]��*����������������������������������D��E����������������������������������;��[��*��C����������������������D��E���������������������R��������������������&��(��,��/��4��6��8;<=>F��H��I��J��K��L��R��S��T��U��V��W��X��Z��[��\��]��^��_����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%������
������������������������������ !��"#��$%��-��/��1��3��5��7��89��:;��<>��@��B��C��[��\��]��^��_��`��yz���������������������������������������������������������������������������������������������������������	��
����
����������%��'��)��/��1��7��9��>��?��BD
E��d��e��f��g��h��i��k��w��y��z��{��|��}������������������������������������������������������������3��@A��FG��������������������������������������������������������������������������������������������������������������������������������������������������������������<����������&��/��9��;��<��=��>��?��A��t�����������������������������������&��(��*��8��:��<��=��?��A��[��]��{�����������������4��B��D��d��f��h���������������@��F�����H����������&/9��:��;��<��=>��A��q��t��{���������$����������������������&��(��*��,��.��0��2��4��6��8��:��<��[]${��������������4��B��D��dfh$�����������2��@��F��Q��R�����!9��;��<��>��A��t���������&��(��*��8��:��<��]{������������4��B��D��h�����������@��F�����#������9��;��<��>��A��t������&��(��*��8��:��<��]{�����������4��B��D��h�����������@��F�����)����������9��;��<��>��A��q��t���������&��(��*��8��:��<��]{������������4��B��D��h�����������@��F��Q��R�����'������9��;��<��>��A��q���������&��(��*��8��:��<��]{������������4��B��D��h�����������@��F��Q��R������-&��9��;��<��>��������������������������������&��(��*��8��:��<��[��]��{�������������4��B��D��d��f��h�������������@��F�����;������������������"��&��/��9��?��f��q��t{��������������������������������������&��(��*��=��?��A��[��]��{�����������������4��d��f��h�����Q��R��V��Y��]�����,&��9��;��<��>��������������������������������&��(��*��8��:��<��[��]��{�������������4��B��D��d��f��h�������������@��F����� ������9��;��<��>��A��t�����&��(��*��8��:��<��{�����������4��B��D�������������@��F�����;��*������D����
;��O�*������D�����������G����&��9��;��<��>��[��\��^�����������������������������������&��(��*��8��9��:��;��<��[��]{������������������4��B��D��d��f��h�����������������������������@��A��F��G��U��X����������������(��������������$��%��;��A��[��m��n��r��~������������
��*��C��_��`�����U����������������������������&��9��;��<��=��>��?��A��K��X��Y��Z[��\��]��^��_��������������������������������������������!��#��%��&��'��(��)��*��+��-/13578��9��:��;��<��=��>?��@A��B[��]��z��{��|��������������������4��B��D��d��f��h����������������������������������3@��A��F��G��U�����������������������������������������������;��=�������*��U����������������;��=��A��]������������*U�����������������������[������������������C�����U���������������������K������������������������������ ��%��&��(��,��/��4��6��8��F��H��I��J��K��L��R��S��T��U��V��W��X��Y��Z��[��\��]��^��_��o��q����������������������������������������������������������������������������������������
�����������������������������������������������������������������������������������������������������(���������
��
�������������������������������� ��!��"��#��$��%��'��)��+��-��/��1��3��5��7��9��;��>��@��B��C��[��\��]��^��_��`��y��z��|���������������������������������������������������������������������������	��
��������������%��'��)��/��1��7��9��>��?��d��e��f��g��h��i��k��w��y��z��{��|��}�����������������������������������������������������������3��A��G��Q��R��U��V��Y��]��a��b���������������������������������������������������������������������������������������������������������������������������������������������������;��A��[����*��U����������������������������U�����������������U�����������"����AB[��m��r����������������.�C��_��`�����U����������������������������$��;��A��[��m��n��r��~������
*��C�����U�\�������������������������������;��=��A��]������������*U������������������������������������&��/��;��<��=��>��F��H��I��J��L��T��V��X��\]^o��q������������������������������������������������������������������������������������������������������������������������������������������!��#��%��8��9:��;<��[��\��]��^��`��z������������������������
����?��B��D��d��e��f��g��h��i��k��{��}�����������������������������@��AF��GQ��R��U��V��Y��]��a�����������������������������������*������&��;��=��A��]�������������������������������������*[��]��d��f��hU�����������������������;��A[�����������������*��C`�����U�����������������;��=��[��]��n�����
�*��U�����������������������������;��������������������������%��[��]��m��r���������������������9�.�������!��%��)��C�������U�������������������������������������������������������������������������U���������������L�������������������������������� ��%��&��(��,��/��4��6��8��AF��H��I��J��K��L��R��S��T��U��V��W��X��Y��Z��[��\��]��^��_��m��o��q��r������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������'�2����������
�������������������������������� ��!��"��#��$��%��'��)��+��-��/��1��3��5��7��9��;��>��@��B��C��[��\��]��^��_��`��y��z��|��������������������������������������������������������������������������	��
��������������%��'��)��/��1��7��9��>��?��d��e��f��g��h��i��k��w��y��z��{��|��}�����������������������������������������������������������3��A��G��Q��R��U��V��Y��]��a��b���������������������������������������������������������������������������������������������������������������������������������������1������������������������%��A[��]��m��r�����������������*�3�������!��%��B��C�����U�����������������������������(��,��4��6��8��AF��H��I��J��K��L��R��S��T��U��V��W��XY��Z��[��\��^��m��o��q��r������������������������������������������������������������������������������������������������������������������������������������������������������������������(�9�������
������������������������������ ��!"��#$��%'��)��+��-��/��1��3��5��7��9��;��C��\��^��_��`��y��z|���������������������������������������������������������������	��
������������%��'��)��/��1��7��9��>��?��e��g��i��k��w��y��z��{��|��}��������������������������������������������������������3��A��G��Q��R��U��a�����������������������������������������������������������������������������������������������������<������������������������%��A[��]��m��r�����������������������
���������� �0���������!��%��B��C�����U���������������������������������[��m��r��������'������C�����U�������������������y(,46HI��JL��OTV�������������������������������������������������������������]_`�����������

>?hkz{|}��������������������������������������&(��,��4��6��9��:��;��<��=>��Y��[��\��]^���������$��������������������������������������������������������������������&��'��(��)��*��+��,��.��0��2��4��6��8��9��:��;��<��C��[]$_��{��|������������������������������������������4��>��B��D��E��dfh$z��|�����������������������������������2��@��A��F��G��U��X����������������������������������������������
��$��;��A��[��n~�����U��������������������$��;��=��A��B��[��]��b��~�����U�������������������$��;��=��A��[��]������U��������������	;[�����U���������$��;��=��A��[��]�����U���������������������%��;/=6A$Bb��&�6����S�^�.�&���U2�#�&;��<��=��A��O�8�����������U��������
��$��;��=��A��[�����U���������������������U��O����U��
;��A��������`�����U�������$��;��A��[��m��n��r��~��U������������
��$��;��=��A��[�����U���������������������$��;��=��A��B[��]��b~���U�����������������;��=��A��OGU��������
������%��;��=��A���������U���
��;��=��A��[��]���U���������������	;��A�����������U�������	;��A��[���U���������������������%��&��/��9��;��<��=��>��?��A��F��H��I��J��KL��T��V��X��o��q���������������������������������������������������������������������������������������������������������������������������������������������!��#��%��&��(��*��8��:��<��=��?��A��[��\��]��^��`��z��{�����������������������������������
����4��?��B��D��d��e��f��g��h��i��k��{��}�����������������������������@��F��Q��R��U��V��Y��]��a���������������������������������
������%��;��=��A��~���������U�����(��,��4��6��9��;��<��>��F��H��I��J��KL��T��V��Xo��q���������������������������������������������������������������������������������������������������������������������������������������������������!#%&��(��*��8��:��<��\��^��_��`��z{��������������������������������������
��4��>��?��B��D��e��g��i��k��z��{��|��}����������������������������@��F��Q��R��U��a������������������������������������������������%��;��=��A�����������U��;��A�����������U�����s(,46HI��JL��OTV���	��������������������������������������������������
�]	_`��������

>?h	kz{|}�������������������������������O5���;&��;��<��>������������������������������8��:��<��[����B��D��d��f��������@��F�����O3���:;��*�������������D��������������������������������������������$;��=��[��]��*���������������������������������������D��E��������������������������������&��'��(��)��*��+��,��-��.��/��0��1��2��3��4��5��6��7��8��9��:��;��<��=��>��?��F��G��H��I��J��K��L��M��N��OQP��Q��R��S��T��U��V��W��X��Y��Z��[��\��]��^��_������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������X�������������������������������	��
������������������������������������������ ��!��"��#��$��%��&��'��(��)��*��+��,��-��.��/��0��1��2��3��4��5��6��7��8��9��:��;��<��=��>��?��@��A��B��C��[��\��^��_��`��y��z��{��|����������������������������������������������������������������������������������������������������������������	��
������
����������������%��'��)��/��1��4��6��7��9��>��?��B��D��O��T��c��d��e��f��g��i��j��k��w��y��z��{��|��}��������������������������������������������������������������������������������
������������2��3��@��A��F��G�������������������������������������������������������������������������������������������������������������������������������������������������������������������������'������;��<��=��>��A��]���������������*8��:��<��B��D�����������@��F��U�����������������������y��������������$��&��/��89��;��<��=��>��?��A��BF]��^��b�������������������������������������������������������� "$&��(��*8��:��;��<��=��?��A��[��\]��^y{������������������������4��B��D��d��ef��gh��i�����������������������@��A��F��G��T��U��V��W��X��Y��]����������������������������&��'��()��*��+��,-��.��0��1��2��3��45��67��8��9��:��;��<��=��>��?��A��K��XY��[��\��]��^��_��������������������������������������������������������������������������������������������������������������������������������������	�������������� ��!"��#$��%&��'��(��)��*��+��,��.��0��2��4��6��8��9��:��;��<��=��>��?��@��A��B��[��]��_y��z{��|������������������������������������������������4��6��>B��D��T��d��f��h��j��z|��������������������������������������������������
����2��@��A��F��G��UX����������������������������������������$��;��=��A��O[��]������U��������������A����U���4$BGMNOPQb~�����������������
Oc�TU��WX�����7$ABGMNOPQbn~�����������������
Oc�TU��WX������������$��&��'��)��*��+��-��.��/��0��1��2��3��5��7��8��9��:��;��<��=��>��?��A��K��Y��[��\��]��^��_���������������������������������������������������������������������������������������������������������������������������	�������������� ��"��$��&��'��(��)��*��+��,��.��0��2��4��6��8��9��:��;��<��=��>��?��@��A��B��[��]��y��{��|�����������������������������������������������4��6��B��D��T��d��f��h��j������������������������������������������������
����2��@��A��F��G�������������������������������	������������������$����$��;��=��A��B[��\��]��^��b~��������9��;�������������������������A��G��U�����������������5��������������$��%��;��A��L��Od[��^��m��n��r��~�����������������
��*��;��C��_��`�������������������A��G��U�����������������������������$��;��A��O?[��n~�����U���������������((J($;ALBDG3KM3N3O/P3Q/RSUWY
Z[\]^_a$bEj#mnr~�����3�3�3�3��������%��3�3�3�3�3�3�3�3�3�/////
'
)
+
-/13579;>@B|
�3�������������3	3
333%')/179O3c3wy��������3���
����33AGTU6WX6�N������/�,�����3����3�������
;[�����U�������[�������������������C��]���hU���������������������;��=��A��OU���������(��,��4��6��:��F��H��I��J��K��L��T��V��X��Y��Z��[��_������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������!��#��%��'��)��+��,��-��.��/��0��1��2��3��4��5��6��7��>��@��B��\��^��_��`��z��|�����������������������������
����>��?��e��g��i��k��z��{��|��}������������������������2��3��U���������������������������������������������������������������������������������������8		-A3B GMNOPQab!jn�����������������
Oc�TUWX�3����  A'Bb����U���'	A����U���O��������U�����O#����U��4$BGMNOPQb~�����������������
Oc�TU��WX���������$��;��A��OG[��m��n��r��~��U������������;����������$��9��;��<��>��A��[��m��n��r��~���������
&��(��*��8��:��<��C��{��������������4��B��D����������@��F��T��U�\W��X���������������������������e��

$$��;��A'B#GKMNOPQY[��\��]^��a
b"jm��n��r��~�������������������������%')+9��;��B|����
��Oc��������������������A��G��TU
WX�(������
����������4����$��;��A��KY[��\��]^��_m��n��r��~�������')+9��;��>@B|�������������������������A��G��U������������������O��������U�������$��;��=��A��O[�����U�����������������������%��;��=��ABQ����������U��X����;��=��A��O[��]���U���������������
;��A��Or���������U�������H$;��ABGMNOPQYabjn~�����������������������%')+|����
Oc��TU��WX�������C���������������������������������� ��%��&��(,/��46F��H��I��J��K��L��R��S��T��U��V��W��X��Z��[��\��]��^��_��mo��q��r�����������������������������������������������������������������������������������������������������������������������������������������������������������������������9�.����������
����������������������!��#��%��)��-��/��1��3��5��7��9��;��>��@��B��C[��\��]��^��_`��z��������������������������������������������������������������������	��
��������������%��'��)��/��1��7��9��>?��d��e��f��g��h��i��k��w��y��z{��|}���������������������������������������������������3��A��G��Q��R��U��V��Y��]��a��b����������������������������������������������������������������������������������������������������������������������������������������������
;��A��O8[���U��������
;��A��O)���������U���������A��o��q���Q��R��a��������$��A���������������������������T��U��W��X��;��=�������*������������������
U����������,��;��=��[��]��n�����
�*��������������������������������U����������������������������������������������������������������U��V��Y��]�����������������$��A�������������T��U��W��X��C��������������������$��%��;��A��[��m��n��o��q��r��~������������
��*��C��_��`����������������������������������D��E��Q��R��T��U��W��X��a���������������������������$���������������������������E������������������������������
D��E��8������AB[��m��o��q��r����������������.�C��_��`�������������������
DE��Q��R��U��VY]a������������������������������������������������������
D��E����������o��q�����������������������
EQ��R��V��Y��]��a��;��=�������*�������������������
U����������^���������������������������������� ��%��[��]��m��o��q��r�����������������������9�.�������!��%��)��C����������������������������������������

E����Q��R��U��V��Y��]��a��b���������������������������������������������1����������;��=��A��B]������������*����������������������������D��U��V��Y��]�������������������������Ao��q�������������������
DE��Q��R��a��������$��;��A��[��n~����������E��T��U��W��X�������������� ��������$��;��=��A��B[��]��b~�������������������E��U�����������������������$��A����������E��T��U��W��X����A��o��q����Q��R��a����������$��A������������E��T��U��W��X����������$��;��=��A��[��]o��q�������������E��Q��R��T��U��W��X��a������������������������ABo��q���������Q��R��V��Y��]��a��b����o��q�����Q��R��a��\������$��;��=��A��[����������T��U��W��X�������������������������$��;��=��A��[��]o��q�����������Q��R��T��U��W��X��a��������������������;��=��A��[��]���������T��U��W��X���������������$ABb����
TU��WX����U��������$��;��=��A��[����������T��U��W��X�����������������
a�������������������������������� ��%��A
[��]��m��o��q��r�������������������������
���������� �0���������!��%��B��C����������������������������������������DE��Q��R��U��V��XY��]��a��b�����������������������������������������A��o��q�����������Q��R��V��Y��]��a��;��=��A��U��������
;��A��O&���������U�������O/��������U�����O>����U���������C����������������������
�����������%��F��G��H��I��J��K��L��M��N��O��P��Q��R��S��T��U��V��W��X��Y��Z��[��\��]��^��_������������������������������������������������������������������������������������������������������������������������������������������������������������������
����������������������!��#��%��'��)��+��-��/��1��3��5��7��9��;��>��@��B��C��\��^��`��z��|�����������������������������������������������������������������������������	��
������
����������������%��'��)��/��1��7��9��?��DO��c��e��g��i��k��w��y��{��}���������������������������������������������������������3��A��G�������������������������������������������������������������������������������������������������������������������������������������������������;��O[���*��C����������������������D��E�������������������������%����������C�����������������������
D�������	�������A��������������������%��;/=6A$Bb�� �/����L�W�'� ���U2�#�&����U��6������������������������������ %��&��(��,��/��4��6��8��AF��H��I��J��K��L��R��S��T��U��V��W��X��YZ��_��m��o��q��r�����������������������������������������������������������������������������������������	�����������������������������������������������������������������������������������������������$�(����������
�������������������������������� ��!��"��#��$��%��')+-��/��1��3��5��7��>��@��B��C��[��\��]��^��_��`��y��z��|�����������������������������������������������������������������������	��
������������%��'��)��/��1��7��9��>��?��d��e��f��g��h��i��k��w��y��z��{��|��}���������������������������������������3��Q��R��U��V��Y��]��a��b���������������������������������������������������������������������������������������������������������������������������������v����������&��/��9��;��<��=��>��?��A��FK��[��\��]��^����������������������������������������������������&��(��*��8��9��:��;��<��=��?��A��[��\]��^{�����������������������4��B��D��d��ef��gh��i����������������������������@��A��F��G��U��V��Y��]�������������������������������������������������$��'(��)*+,��-.01234��56��78��9��:��;��<��=��>��?��A��K��Y��[��\��^�������������������������������������������������������������������������������������	���������� ��"��$��&��'��(��)��*��+��,��.��0��2��4��6��8��9��:��;��<��=��?��A��_��y��{��|�������������������������������������4��6>��B��D��Tjz��|�������������������������������������������
��2��@��A��F��G��T��U��W��X�����������������������������������������:��?������������������,��.��0��2��4��6��=��?��A���2��U��OG����U��:��?������������������,��.��0��2��4��6��=��?��A���2��U��
;��<��=��A��O[8�����������U���������������������%��&��/��9��;��=��>��?��AF��H��I��J��L��T��V��o��q�����������������������������������������������������������������������������������������������������������������������������������������&��(��*��:��<��=��?��A��[��\��]��^��`��{�����������������������������������
��4��?��B��D��d��e��f��g��h��i��k��{��}������������������@��F��Q��R��U��V��Y��]��a��b���������������������������������������&��/��9��;��=��>��?��A��F��H��I��J��KL��T��V��X��o��q���������������������������������������������������������������������������������������������������������������������������������������������!��#��%��&��(��*��:��<��=��?��A��[��\��]��^��`��z��{����������������������������������
����4��?��B��D��d��e��f��g��h��i��k��{��}��������������������@��F��Q��R��U��V��Y��]��a����������������������������������������������%��&��/��9��;��=��>��?��A��F��H��I��J��KL��T��V��X��o��q���������������������������������������������������������������������������������������������������������������������������������������������!��#��%��&��(��*��:��<��=��?��A��[��\��]��^��`��z��{�����������������������������������
����4��?��B��D��d��e��f��g��h��i��k��{��}��������������������@��F��Q��R��U��V��Y��]��a���������������������������������n����������$��(��,��4��6��9��:��;��<��>��A��m��n��o��q��r��~�����������������������������������������������������������������&��(��*��,��.��0��2��4��6��8��:��<��_��{��������������������4��>��B��D��z��|���������������2��@��F��Q��R��T��U��W��X��a��������������������������������������G����$��&��9��:;��<��=��>��A���������������������������������������&��(��*��,.02468��:��<��[��]��{�������������4��B��D��d��f��h�������������2@��F��U��X��������������������@������$��&��9��;��<��>��A��o������������������������������&��(��*��8��:��<��[��]{�������������4��B��D��d��f��h�����������@��F��T��U��W��X��a��������������������������T����������$��&��/��89��;��<��=��>��?��A��Bb������������������������������������ "$&��(��*��8��:��<��=��?��A��[��]��y{�����������������4��B��D��d��f��h����������������@��F��T��U��W��X�����������������������)��9��;��<��>��Ao��q�������&��(��*��8��:��<��{�����������4��B��D����������@��F��Q��R��U��a��b��������������D����������&��/��9��=��>��?��o��q�������������������������������������&��(��*��:��<��=��?��A��[��]��{����������������4��B��D��d��f��h�����@��F��Q��R��U��V��Y��]��a��b�������������������8������$��9��:��;��<��>��A���������������������&��(��*��,��.��0��2��4��6��8��:��<��]{�����������4��B��D��h�����������2��@��F��T��U��W��X�������������;��A��U��7��&��9��;��<��=��>��?��A��������������������������������&��(��*��8��:��<��=��?��A��[��]��{�������������4��B��D��d��f��h��������������@��F��U�������H����(��,��4��6��9��>��o��q����������������������������������������������&��(��*��:��<��_��{���������������������4��>��B��D��z��|���������@��F��Q��R��U��a������������������������q����������$��(��,��4��6��9��:��;��<��>��A��m��n��o��q��r��{��~�����������������������������������������������������������������&��(��*��,��.��0��2��4��6��8��:��<��]_��{��������������������4��>��B��D��hz��|���������������2��@��F��Q��R��T��U��W��X��a��b������������������������������������������$��;��=��A��Bb���U�����������������������G����������&��/��9��;��<��=��>��?��A��Bb���������������������������������&��(��*��8��:��<��=��?��A��[��]��{����������������4��B��D��d��f��h���������������@��F��U��V��Y��]������������������&������$��&��;��=��A��Bb����������������������������[��]��d��f��hU�����������������������c��$��(,469��:��;��<��>��A�����������������������������������&��(��*��,��.��0��2��4��6��8��:��<��_{���������������4��>B��D��z|������������2��@��F��T��U��W��X��������������������������7��&��9��;��<��=>��A������������������������������&��(��*��8��:��<��[��]{�������������4��B��D��d��f��h�����������@��F��U��X�����������������<����������%��&��/��9��=?��o��q����������������������������������&��(��*��=��?��A��[��]��{�����������������4��d��f��h�����Q��R��U��V��Y��]��a��b�����������������<����&��/��9��;��<��=��>��?��A��������������������������������������&��(��*��8��:��<��=��?��A��[��]��{����������������4��B��D��d��f��h��������������@��F��U��������u������������%��&��(��,��/��4��6��89��=��>��?��o��q��~���������������������������������������������������������������������������� "$&��(��*��:��<��=��?��A��[��]��_��y{���������������������������4��>��B��D��d��f��h��z��|�����������@��F��Q��R��U��V��Y��]��a��b������������������������������v������������%��&��(��,��/��4��6��89��=��>��?��o��q��~���������������������������������������������������������������������������� "$&��(��*��:��<��=��?��A��[��]��_��y{���������������������������4��>��B��D��d��f��h��z��|�����������@��F��Q��R��U��V��Y��]��a��b������������������������������H��(��,��4��6��9��>��o��q��~��������������������������������������������&��(��*��:��<��_��{���������������������4��>��B��D��z��|���������@��F��Q��R��U��a�������������������������p������������ %��&��(,/��469��=��>��?��o��q��~��������������������������������������������������&��(��*��:��<��=��?��A��[��]��_{���������������������4��>B��D��d��f��h��z|����@��F��Q��R��U��V��Y��]��a��b������������������������%��9��;��<��>��o��q�����&��(��*��8��:��<��{������������4��B��D����������@��F��Q��R��U��a������������
��������A��V��Y��]��������������A��q��t�����Q��R����������q�����Q��R�����A��t���������������"��A	f��q��{��������Q��R��V��Y��]���������������	��������A��V��Y��]�����c��_	 ""%AFa8eeTggUjjVooWqqXttY{{Z[��\������C�[`y|��"��$��(��-��/��2��5��6��9��<��>��@��CXY
_d%%i01j47l>?pBBrDEsKKuMMvOOwTUx``zcm{pp�ww�y}�����������������������������������������������
��23�@A�FG�QR�TY�ac�||�������������������������������������������	(` 4;4��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
���X��������������������������������������������������������������������������������������������	�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������,,0����������$$2����������������������������������������������������������������������������������������������������������������������������������������������44')'..	+
&
(/& %0)31	




&	
	
	
	
((+   





%%%	+!!","9	,,!!#$#&
$$
!:-78"#78	
--"#( %
))56'56'01/****22"			$$
#
3))%%	"



&('						!

			

"



	!

"#
	-#

./0,  12
,
3$
 $$
		!

*+*+&'#

 (g &&(*,46:<<>?FZ\\1^_2oo4qq5{{67��8��O��U��e��k������C�[`�y|��������������������
��������������������(�*
7E*1G47O>?SBEUKKYMMZOO[TU\``^cm_ppjrskwwmy}n��s��t��u��v��w��x��|��}���������������������
��23�@A�FG�QR�TY�ab�����������������������������������������������4~DY|���������������������$*06<BHNTZ`flrx~��������������������� &,28>DJPV\bhntz����������������������
"(.4:@FLRX^djpv|���������������������$*06<BHNTZ`flR�\�y�wX�fecQ�Q6q�ys�rrc|�|�o�Kz��N#c������x���w�wc0�G:�;3�3z���z�
�E�FK�;	"�*	-7	L	77)	,s-	9�##m�p��	���	�(	")	��)m*�	k�	����	��"	�*�		v�	��! I��	m	m	R�=����|�<��h>�C�+.��j�	�	�	�	�*				��O			q�&	%	%
|�{c�Z�Zq�}q�o�pp�<M�M���z�z>�>5�5+�+}�}��0�O�	"	Y&()*,-./01234789:<>?FHIJLMNPQRSTWXYZ\^_n~����������������������`lm�����������������������$+ ���������������������$*06<�G	�	�	�	�	Q	�.	|	��	��	B	|�Q�[�����/�	�	�	�	�	�	�	�	:.J
Q�W��W��h����������� &,28Q�[������*06<BHNTZ`flrx~�����s�s���������Q���.�{���B����y�����p����������
��$+��$+^djpv|������������������G	�	�	�	�	Q	�.	|	��	��	B	�	�	�	�	�	�	�	�	"|���|�դ'��^#�+tvfonts/raleway/stylesheet.css000064400000005554151215013470012254 0ustar00@font-face {
    font-family: 'Raleway';
    src: url('../lib/fonts/raleway/Raleway-ExtraBold.eot');
    src: url('../lib/fonts/raleway/Raleway-ExtraBold.eot?#iefix') format('embedded-opentype'),
        url('../lib/fonts/raleway/Raleway-ExtraBold.woff2') format('woff2'),
        url('../lib/fonts/raleway/Raleway-ExtraBold.woff') format('woff'),
        url('../lib/fonts/raleway/Raleway-ExtraBold.ttf') format('truetype');
    font-weight: bold;
    font-style: normal;
    font-display: swap;
}

@font-face {
    font-family: 'Raleway';
    src: url('../lib/fonts/raleway/Raleway-Bold.eot');
    src: url('../lib/fonts/raleway/Raleway-Bold.eot?#iefix') format('embedded-opentype'),
        url('../lib/fonts/raleway/Raleway-Bold.woff2') format('woff2'),
        url('../lib/fonts/raleway/Raleway-Bold.woff') format('woff'),
        url('../lib/fonts/raleway/Raleway-Bold.ttf') format('truetype');
    font-weight: bold;
    font-style: normal;
    font-display: swap;
}

@font-face {
    font-family: 'Raleway';
    src: url('../lib/fonts/raleway/Raleway-Black.eot');
    src: url('../lib/fonts/raleway/Raleway-Black.eot?#iefix') format('embedded-opentype'),
        url('../lib/fonts/raleway/Raleway-Black.woff2') format('woff2'),
        url('../lib/fonts/raleway/Raleway-Black.woff') format('woff'),
        url('../lib/fonts/raleway/Raleway-Black.ttf') format('truetype');
    font-weight: 900;
    font-style: normal;
    font-display: swap;
}

@font-face {
    font-family: 'Raleway';
    src: url('../lib/fonts/raleway/Raleway-Regular.eot');
    src: url('../lib/fonts/raleway/Raleway-Regular.eot?#iefix') format('embedded-opentype'),
        url('../lib/fonts/raleway/Raleway-Regular.woff2') format('woff2'),
        url('../lib/fonts/raleway/Raleway-Regular.woff') format('woff'),
        url('../lib/fonts/raleway/Raleway-Regular.ttf') format('truetype');
    font-weight: normal;
    font-style: normal;
    font-display: swap;
}

@font-face {
    font-family: 'Raleway';
    src: url('../lib/fonts/raleway/Raleway-Medium.eot');
    src: url('../lib/fonts/raleway/Raleway-Medium.eot?#iefix') format('embedded-opentype'),
        url('../lib/fonts/raleway/Raleway-Medium.woff2') format('woff2'),
        url('../lib/fonts/raleway/Raleway-Medium.woff') format('woff'),
        url('../lib/fonts/raleway/Raleway-Medium.ttf') format('truetype');
    font-weight: 500;
    font-style: normal;
    font-display: swap;
}

@font-face {
    font-family: 'Raleway';
    src: url('../lib/fonts/raleway/Raleway-SemiBold.eot');
    src: url('../lib/fonts/raleway/Raleway-SemiBold.eot?#iefix') format('embedded-opentype'),
        url('../lib/fonts/raleway/Raleway-SemiBold.woff2') format('woff2'),
        url('../lib/fonts/raleway/Raleway-SemiBold.woff') format('woff'),
        url('../lib/fonts/raleway/Raleway-SemiBold.ttf') format('truetype');
    font-weight: 600;
    font-style: normal;
    font-display: swap;
}

fonts/raleway/Raleway-Regular.woff2000064400000173434151215013470013324 0ustar00wOF2�����?FFTM���h�p`�F�
	�
����B�\6$�4 �4��[#P��D��ڏ�6Y�U�S�$�u@���R/����t�ԩ0�P�a�4���0FY_������������"�ӟ���[@A@P�5��ۚ��� ����S"%�J>+���E��.�em�-IWb��[�ad+D�V���~a�ڕ���u�H�ҍ�J{��,�w8�qp�rW@X�4�H�݉���lc��.R9*�u�7��b��e����o��6h7�����!�+z���:w�i�t��\X��zd���MT1�X�����E|O�NT���j�ֶs�컉72���y�(Th�Os��"�#I�.�%AF�������������[�6�'#��%;G}e�6�d�M2��sf{�M���9m�M���<���H���d�T_^V���Ą���+��[�8��c
����y�=�̵�'>���&��v�lP��{���R^���&��=M
v���3%�]��?1- *ב4��6�f.��?����	eI�d��6FČ
�y�&D&(7k���y5��2��j�y�20�����ݶh�,‹��#�i>�z�E�'Wo�]����
=Q)��) �[�Dz�i�������?�ϭ�d�4����}x���jJC]5�4�B�
��F
k� )v0a�*l'ʙs"�m���z����c�����A[A{!Q�`��l��7L5�������C>����̙��#Ž��F%$O�D�,J��t��P҈-�@2�I���~������+��>T��]O�{U�ug1aQ�F1Y޿�}�ے���yB@Y����mj	Ȅ�[�z9m�L��3a��-	![HX��p����{��W	�p�n&�|S	bAK���{tbu� ��e��������ݮv�"��{�.r���"�m,�$z#$Q�#�%�����A���̛���fWw����%3ss���$�j 6�`�n�dْ-����sߊa���&�'dH[��,���,���D�U�0@6%0$�Ć/D�4G�Y�@�h�wk�����D�4&�<��6��Q�Y�XB� �*�q'��Y�w��/�-9DN��l<'3�ZpJ��Xs��3s5a�/S4�jpL݇�/�W=��H
&�$A�A��X���v�bd��Zy�Q=��w�Z(a�Q��Bt�]��g��%I��J��n�������Ps��m�i%B���)�^i��sho�o��T��S���Su훩��v��(��B��Sѿ�1���)���/L�C����^�nah��Y꣡�V:	2�R/���Y9x�ui�O��7��7����V;
�����*��t�:@��N���ft���(2�r�ee�|��I���s���*}��,#�KhE��n{�Y�AeY�8��ڎ��CTߙv%�0�~N4�~㊟(QY#F
-��Nl����e�@B�j�A-�
�|�e�+�Y�<3;[_�u��	�$�_����<Ͻ�'`dz�m\ì���26�����?2��y�wS� �n&� X�jk+���>�ޗ-��=Lm������(�vG�M�OlK�7
��đ^��|ƋMfڷ��"ֶ&�{
�A�X��5��iS�'<m=�%�#'s�#�aS�	��Cak/�Mp	N�������Ҏ��x
v�J���Gy����J��ޝQ�ҫP3�i�K�i�����%_���4U��M��
��`1ճ���=21�™�w�1�
�����Ëk��L<�N?�/J?����'ɞB7w�qp�!@��%H��,��l�d���p/@)>J��Htx!駬����^���=!'��Wo��M��B,g~�g�2UM5e3E�O��|k~ڙ	���d�iS��{o��|����ۿ������sJGlO�!��!�+����J��JWkdy�޴^�>����g�ɏ|���>��fw�?��?4����F[Tӯ�16�q�Jj�~�e|�b��G��P��TI���e5�o�O�@�Ȗ'O���Rv���ֿ��!���}!��@��	I�,�:��0{ZQ	,U?��Z�]=���P�Ѐ�ғ.I��W%���bq�}搨����ed�\܄@��c�j��/�DZ����Vۤ��[����x�����m3�ѩ}�4��?�&����s��h��)�)d�R�)k����
XOpz�/&|f�ۅ�AhA5���
3�^ �z0B�!.t�y�7��߻������ ��"b7��]�N�?H������U*\��1�Y�Ǘ��Xk�3N��h%J+��g^�o�>�s�Z��6"""J)�˘R
Q[��B��zw?��}�i5:����!(����ß�˕��k�*�IB)�2r��-���s�ݘc6Ě&)�*�����h�R4n�7߰Kx�}�V�[�J3�x�G:x�ש�S�VD�XC�1(F��f�j�l ���� g:��y'�wy��H0SL�A0�`Y@%@�T'��ը&PQU��
���_����b��_;�DE�ǜB"*Qj�3��6
������Ϫ�y8;#�{��D�N�Ġ�T��@��K�������� �ߟ�Fr[�_����Ƿ}�]�_�Ǹ��wg6g�E���9���3�N(�_Dp5�Ǥ8�"�n�	��a�y�-m)�0�9{��� ������nąiU�ߊ�b��@��kCڭ�UƿA<8��L�M�ݦ�f�6/h����,��ڲ�r�r�o�G���:��s�/]}��r-uS�w1L�����y�:�a�,�,�e!�p���ڨ�aPP�3-�cZ.�P�&�weŞ*sUⅈ���>�]��_k�z�5h?_#��{@8�L��ٜz�<7�շEHN�A[�x� �?qm��2����i&p.��2��I�dsؑLN���3��h�n��u�C��B���/6�,�T��r�ܷm����վڲJ4j�Y��X�M�=R�>�<�.q]����Ԫq��1-�9���5�0�o���XM��Z�A�z�{6��)�.��,��6���3X]����򧭲k�t����S�	u����'��5�hL�h%�JC��;c�L�闙q3w�<$�#)��b��(/�^��Y��[C)�di�[W�R�u��0(�#_�iN��E=�ՊF52k,^��qayQ�,]s�Ω�C�L�W<f̯�_�s>����
W�k�0�Fe�0aX3�zL�Բj�}+���9I_�
�
��Ko��rԲj��VV�){P��a/}�>+*vU�]�ɪ����o57Kcӿu/{���)���5��C����f#���Hv�k��]�{V[A�m��(��S���L�Y,ۜc�!���_�;�2Ǵ� B�XRS#�Ο���l��MV�{������0���2��)���Ef�e�l�"��c�(]�8dv�0�+����<�5�:e�ީӜ���7Üe�c�,2� ������LaK�������i&aƑ�NݥA-1C��j}]�o�V��S-���@�v�+�r/��ʇ�^��j�
��*��B	(P؎;���d�>l���:/v�8kq��Z-םf`P(J(:��NN��E��tI�4�W�Ȕɔ�T���%����B����Ah"���*S����`b��M�Vm�ݑ�؎„��~D"�"myDQ�t"Cb��c�E1L�,1�;f-�PK5Ҥ����3ֳ;���e�氵�{�,լ��]R��������0����GZ�8�{��du����_��h��è�+[e��`&`�`:̂��~aQ
K*��
m�ېm8�('�n��~�au)�T'D&
�hD��8��˸��6�C4BS��t@'tA7�z�����Y�y兀瀗�׀����=�z�4Ҕ4
3 �9x
o�4O�$-H��$�|&�xM�_��2�3"2"3
�%	=a$̤2�����u��&]��5i�kO:T�D�G$ik�E�L��MD�ݒI��10S vʬ�@��=w p �|�2� ���O1U%B��ӑP��&��h&��f�\��@TT?��} :�GGZ���Vq5����q��zR=͟�g�Y�r(P[��@���@�p�:�
��B"1L��b�$S����22	YY�l|>g �-��
���<ƃ�R��J�����B�PA�����
��l(0��]�\���3�k3��g�[��]!B	��\i�H,��ڍ�^�J��X�|>��Z�:�|>��?��S�nY1`-�}��ce�k�L����:o�.X�#8����v�яJ)W�uC���"�Mq�f=W��s��:��_�LQ����?��t�c��8e�˾G��M��[���?�R�ӊ���c�/utv���C�+��.Ce��ؽь�Q��n>�F����ޱ��o	|K�
�[T$IVUS��e�#�y
��E*J�Up�I5�1�\��pTAj"�ۭv�����z����g�
����Җ�L�W
�vf+�zQ��\bv|���5����L��Vf�=��k�Pi���Ũ�̨�m7�lʕ/-�i�A#��g����+�f���pQ������.��D�{�m�[��!���.D��y2Y�YUV>�G��sx�������,��/�\jy@�J,�9�Ω*�Z������Йu����P���.f�P���(��K������R\��<�5`�6Z���_��)���8�2111111������/�����-�Y	�Uzo�;N�}�>�N�&˲i��>G����'���9$�.n0ϭ���x���DŽ�tYS,N^�H�(ə�'��g�XJ�+N�>�R�Q��5�<n\ >�˅b�$&��'�ȿL�����T���[B�w�P����Z���W[(�ɇa�<�Ι]�r��|�]�Y]��F�����$���EQ�i�/����w@�U�����tȁ�\`5HE����qi�vB=)��pO?�
!���()�[��(m�55��l�
��B�M�}�D�B�^��)�)��ߴ���쾱�D!rkv�șP�,��O� �>���CT�w$���I-�-��`BP�Ӛ�H3�3���ć|V�S������"�}Q%�x����I*��T��t��y�B�m*JUj���J����^o�c��湬�U����~�rR
��i�jug����~K�m�!��rWM晸+� �%5Ee��lu���R��u���
JKO��E�8���R�F��\1��'�O��+��=��Dm�J��)C��*��ʄ�
A���~�g��.w��P�ܟ�5���7k��g6y³�����0�0���S-�@�8=|��P��X?HA��7,�Lw�^B�t��Һ韾ө�.x�\��>�4�����$�]�4����5z��IZPiF��9՘�`A��g��b��ym��5!-ӡRl*%S����Z�f����Y�˕&�4�<d��^��{��d8��S�i�yx;I��h���:��[��,�\
�ȭU�V�kb��s�s����k��]]]]]]�蚘��,\���t%���0\K���x�[}M+��ӟ%Y�����+��B�H�(�,�wx:�P:����j�cKx��9���o�����&���G�e�@B�Xr=�n�In�Y��³tQ� �u8d��捪j�*�}�0��DvBt�O��j�cK���J{�Ӛ
m�K�n/��w@� d8U�����`M��B�,�
^��
BDb��ԛW@?s�w�c����g%ċ��dw,�-Nf�3/�ԩQ{�0�+N'�O�-�s�]PnTv����{2��� � r� A,"'!��B9@�bM�񔁢��5�\��8��}^u�\6C��s��~Gʜj��5�VatZ�+���2/*�6x�v��C�\�x���m7>�d�[���~аp�s)=�6a�K���u]����P|X �%+�,w��w�a���^��l��\I�����ɥ�ټE��ԝ�F�B��\X�0�r���^�лiE�RMZ���pl��2g��jw�%}�7�C�/h��~Yv$]0��@Œ�Gd �AL3���<��ÅY�x�����hlmb�@rP-ǥ���g
(�@�6��ٕ-���ފ�L����V}���CN��\|?K�6�r~�0Bx��ALT�F���PD\
�M�m��LE����ӭf�QTbe��&���1
SVe�b+6�;��9����a�����b�-6+_DS��iB/�B�^�Vv�1��/
�a�E�xh��x9�̳���G6a�Yb��~��iBKG?5�RN_wI�602�*j�*idTTմut/
�7h�pŴIJ���=���>~!
+��Gʯ�p���ɶH�Xޯ�2��G��C=�&>۔���ʧ	���
�����:g�2���c��f_�V�`���R�]'�������-�E�Ԅ�,�^e?���&a�,�zvh!%��v;ף�"�ʡfI]� �v)-������y�p
��Ԩ'7:դ�O���>>�|�7��:��(��P�a.\׿�KW�(@4_�H,]"C�P�TUUUUU�Ԣ)�(�QѺ���w��}��G�c�z
KS�݃����n��O�t�փ��=*�E�N�T=S�\��쮋
��<7�Qcu�n�L;3��:o�U��;"-��V��J��f����vr噜	��˚b�p4x��Q�3'O
���"�b)Q�L9j��a��T�ԪרI��6@����\.�UITH}JF��)�Q��U�}�5U����9
��87q߷\U�%��m���p"��D���;�݌n�L
'qUu����kd#Q�@\����ōKߦ�U�V�����$J�-��<R�Zi=1����v�8���p�勲�OiF�ۧ���PLd�*�SB�EZ�q��.��i�=g
��W��L�R.���=S�N>!�� �"�YQ�G����J2�p�l��'���Q�t��Zi�h�}�A�����i����
�
��@�8Ju����2r�0��4��?ebyY���,`a�K����Ư[�o����$��[���0���� U�@ʎf��;8�?i�f����=���),���1�T0m�-su�l�_�PH+	��Y�s������Y7��$�����7�}��>I�%��?��ޜ��[��'39�Y�=��w�CgW4[��yO*q�6h5YΛ��v��$l�?��1��o
h��̥���)W�۱�tQ�����fT8��I$c�ueD�,�r��e �&�T�Q�U�l�4�wi�t�tJ�n=8�q�O_��-�fx�sya�L���4b�М��-�K�~5	�Ϗ�$�;R��UE�`G.�.�C���~���u	F��
�PҠW�z,�;����n���7��9j�]�!k(V����D{�m�6Фm`�֞B��eG^ez&���[���	�.g�jE���<���m�}�2�(� I:ۮ(�La���&�P$��OSܳ�JrYΪr����ͣ7�a4�͍cV|r&�8m������Xf���[k��r@�w��Ԑ�R�
���'�琽Ѻ�\F���f�z��?�ZCD���+F�%(���=i�W4�Q�������V��T0ڐ��Ɯ�<�S�߄u�G��{}��y0�Ġ�A���Y��O�Ɣ�_[)T��l	=��>�����o`���v�S�T��zˀK�������C�y�I�s�^��2ޢw��/r�U�p�]G3i��q{Z�?_�y��;R���K]�h�9�bcl��r^u51����ף�7�c6��Ϗ��s2��>\��vj��ݏ#���-*m�N�`��X𿮅GX��<�d-ee�
��LQ�z��0���N��1R��V�l*�L�̤�ˈLY��tsXd!!�(FE�Vr0�0U�V���)�ħ>��J�
EYYYYY����H*U�R�R�b)��Y�,eeeeee�
K����V����Q���H�Yw��D�!G��tYS,N���Q�3'O��
E�K�Re�Qk���Rm�V�FMZz�6��
�\.���h�: �?��E�L	Py�Ah��Y�'@u�;�ua-��}˕s-7n섄95&w>�Ap�ft�`��8����7�p�lU�%�()�Z\K�۔�������H�D�Ѣ�Q��J�Jk�|�~ko���?�hO#.���ED:��n_���
YD���H���)eo��E׭`��ov��&^@KG�t��b�bU��:�I��>2u�L����d2u�:���,�fɃQ�*U�T�J����I]��:TnL0`�+r0	����1��w�O30�!X���F"��:�L�,I6"A�Xm���v!�� ��1�n��\��,_:�<_��m�!�b�@�
�짎~%k#�<ms��η���qj�?=����Ÿ4����y�����]R\�hHAFQ��֭�0LU�ը�*uTl�4��$�{_�.�ѧS�t�)�|<�<f{Z���@�����S�<7�Qcu���vf 4�u��y�̗wD,ZZ/�l�-�:�eM�48*���Q�3'O
�����/%8e�Pk�@e��U�Q�������H���FA�<�U�]�?}��7��i@]�p.w�>WʵܸM�N�T�{]�g�ftR0Ux��U��ԑ��l�\.���rھ�Yp&D�#�Qu�E/F5�U���2O����lg����'������"��)�4�c�T�*�����]�BQr����o{}d4?Z:��`��3�f�b|.{T�7A��RE����e�T��j�)�J����^�C�1��\�\��8���<y7��P���2�5a��ER�_j�m���_T�@i��O��4DtXB]y8,fZ�F%���<`�Є�w=ް)���ʑ�C�.>��!�#����F
ŋ���[*�on$|k�W�H�Y6F3��#�9tHHmG �#��v֎�m|<��1偳�!.�\�•�v��ݓ{�k�k�E��<�	Oz�T�u��Moy��;���T��L���ܗ��׽�|+"�[���y�Ȭg,�*���C�
��Eg���I�>���6�f��� M�<7������]r����{qli���A�4"�����?�4�o� s~��/�
�P�n���?�ԫ:��l��՟|��H#Q�~�+�}� �(FES�L��.ݑ?ɞ�fge�OF�zc��Yl��#"OiΪ�G/��T�2UJ��i��|��Em���!��	ņW��T�,�<����=��o�_�����s�s�~1r�F�;.��:;�p�}��1UM�8�&Lf�.3.n�9;���q7���-��U��	���Y{��_gs��Ƿ�F����Ӝ�����Q��|�[��;&�9`�C�^y�%�����)@
t~#�T�ls���ك���݈�B��(��(�*�y���%��FةH�h\}B�f=��p^H�s)Р�V��oV����S�j�+���y�QOU
��it(O-#[��$�OX����X^ӝ���z�*��;�7�V;X��62�vP�d���Оjj�eV
޹���y0�W;�i%�L8�
�S������DKa�O���--��$���cbZ�D��ߦ�z~]ޱ���ݔ<V���$돬��ߛ�򆄗G�a���VR�x~K���>�����bH��k`04�����p,��((�I�C�e��i�}u���ְӹy�����p
��%6�J��6�i�v*�7E���m���7bӒb9���>�<���дx�	y�jox_]���o�p��$l}ݨ莆)տ�Mf���X�b9d�\`�,n�܅<�w����HH�&l��Lɪ�4�)K���*�z�tӾ������t�K��]�g6�f,讻
D@B)Ep%����}\�il
G�`'���f=�������e��5v���%(�&�J�1���
��H�Zgl��z4`�z��*����i1�	q��)YQ��=Z뢻V��w��ʝ���и����ܠ,��3 ao��n�9Q�ͧﵚ�L��A6�hD������#7��r��ۆ��R�Q�����q�q���rg.���.��3�� u1Lx�/��֑\b�М�y3{�y�#�`�Y��m�# "!�t����gx�Sj��E�'��Uo�� ]�]���r�X(v�R|܂���o*Ҡ�`�V.r����V��ьuQM�єߙ���W�g�S�t?]��0r�?�`Zm�Y�l����gidޏl\�Gf��!��-�pW �G�b�Lb��ܜ�p2&2��2��a��{3[^i�ò^��XgΜI�~3�c�{�w��uOl�#���q}�.�C�_���n4y����|�@(K��r�V���_)�����;줠�jm��%���]��0�}x�S���_uG��Qv�yѢ�!f�17'�O^��5�et�	�c�=�e���I���}��v�n$�u�lo\{�g�h�n��%('P�Ι�DY�e{s6���]��w���+�S����K19o�#�˰1�z`����'�_�2�6�ѐeQh�L��d\1	��of̫��b��ۉ]���<N��?��I]�ٯ4�4^�t#�~��.��=��U�؂s��L�-M��eJ�qG*]2dʒ-��ǔ��;@a-b!*�]�BQ��VJʔ��tW��N+4LT�V���ѱ�k�X���h�3���:�N��Y,kt=q�V�����߀���0�s#^5V�Ae�e*/o��c��Ь9��޽aZ�3sf^1�~3� ���QY���>��o�;�G��s�*�~g����y��$�I���y%���{�
#]��.�	G�G@DBFI�FNr�'_A����B��ʔ�vi�T��1
S[e�b�V�V�z
�4i�ry��6�vW:�ؿ.�E��	EhE|&���s�/E��QYPۢa�p0���A+���~��M��y�b�2V�Evq��IJˉsZ�j�>�i�.\}tW�7n섄9�c<��|���0ͨ� S��'Wq���A!�YW�x� Q���k�m�����pu"��7ݓϦ�
�n�g���c��\�t&��]8Sʗd��t:�~���-�{�7���!�01_~Ļc��l��u�o�q�
�yU/r>t�&�
��!�0���X#k|Wp���g�&/�ҫ�k���o���N�f�{��=�a���3��-{���������;g�|hgX���)�ϝs\����k�بb��+{�Lθ��i�Q2:����|�`�]y�՞Y���`�e�[�tG
�d�2��S���l&uڜ�\xUW��Թ�̈́�A/��Rq��!��l6���8�}{�ҫ�'"�mYշ���kK�!a�DatBo0H`ڛ���:��U9�x&�)fˡ���T�%�tk��8�xn�l�n� ��!B[]�A[��-�9gŦQ�;
hG�"��^��{X:��*j?^/c}N��(Ҕ)��v��?���_d)y�����.P"cb�]|�LƜ%+�l�m��ث�R	N\;%�i\̹r��wGy������Lԛ�Z�-c.�[2"S�l9��y��en�;@a-�[*;��I$�o�ܗ�)K���0oz;�n2/�	�z�7��w�~�l���/��6l6p�>@A1�&Ng2E*�AhA�w,���Se��Tu�4�o5�
���H	�]W�PĒ�ϓ�����견�Dwo��#�-y�߀߲e�9R�S-�>]>7(o�,&:L/$z]��e�
kK�]$7�����ڨ�m�H�5���,x��	�UL`+�ql8�*n0�a/z>�PfCG��+$��D�&��)<*��<�y�p�2�m���G���}S���ij����x�F��<M�6���;a(.����{�`��r��\@>�x�W���o��O�$=p.������d�[^z3䣟BX����*7���g�2��d�fu�wL}��]�]���#`�[�R!��-�"��w%PR"9��z��"6�	E)�1[F3[�$ۂ��l �(T4$Kl�D"�H4���V�v�]�(�Eĺ��t�����d�pc��&��'0����͖ �>��Fe�
ܖYQ�H���Ȕ-W~)�+V�|J�Ta:�*�Q��D͐f67�cK�	`�\�%�S�9il�L��)�Nk]ޞ�K5@��ڲ�#;)VN�C�x��ˮ���: �!��}~g|�	��e(u���10]t��9��(%�9������J1�e�խf�B:��s{�W�u��bnNV�;��Ll̇�OxΠ�<�i�o��7<�o>2�˪1�c܄ɏ�8½	��䞚�w��`�,h�S|�1fz�<��4�i>j��*`���e�D3�N��x��H�'Xk�tq�=�	.�-� M�ji�i�o�HV-..*~��`C
/#��}_���&*b\����汱��mp����@<��a��$+������������.E<��W~��NY�/5�e��i����S�lK6y�+���~������KLL�W���Xa�S�W]M���Ps-Kq���V�ƕe7����%�l<�\y�����7�x�M:j��Uͣd��^	|�Y��o���Ƹ A|r��>�%|?�o��X�(�+xaΤ�,�Gs����������r�9�������֩������g��l�~��'�*�(FEK��)WQ(&�T�Q�XC1�31����2¹O<��	� �Dx���}���0�0~���+'w�(b�S�Ԫx5�khji�zX��c�8��B��Qj�$�PK�Ce�T�15��:�4biҬ%\��%��q
�������X���oNP"M�����z�}-./L8"�Q;Z�b��}l����C�O�`_�g	b����4�����i��U�&�5{�m9��u\��A��Qjz��0
�����:�ze7�!�����Y�YrJ�ƭ()J��I��i0l�`.,��N*B!���������@Q<j�V55Xm��~~��+I���q��'���P{2�E,����fX0���'�s�[\a���Z�+[��RdS�:@�1���G�mK4�WU����r��.�/��z�@.u�3�ò�8�͛V۲{K�[����μ"R�x�����ې-����u�x^,�h�N��{r����7��T`�X6�,JW�߄W9�8��tk�?Q�S
��mɗ��*,��b�X,��d�j������	S\
��UV��S��N�cT������7Q�jI���=䠣�nK��>7q�W�`ɺf�QX.U�U�I%�����%��?=��p!ץРvθ�x}~Ys�ׄD}v+�QU'�"(�������RVǙ;��jx�Y���{Ѐ��:����Zت06�r>��J,��W��4-�˪8�~P��\lN~*ڸ�3it)���^�d�ot���W�Rz��I�B'���%�����}�Xr8e���-~�LțCJ(=컋�"����"`��$�,%��I$��D����<1O��D��






A�3d�A�b�H�$CR3l��5�
j`B�`۠-˷D����;�#��~H�{��#]�����h�zr��I���0(��j�kԤem�
��-Dȭ��$�t}3l�o�6}B�/e	���lع������\K���;!�DN�ŝ�w~�ft�`B<N��N@	E�F�:�H���Y�)�!��P�DQԝ��多��֡�X��|�ٽs~b bDY��"/4Å����YS�� �(�(�t�J���λۅIz� �I�8��b]Y�(
���¦�$�O�i&��� �ݸ�>@���
Gq�c�.�%�T?�kpR���w�\�	��?;���y��F�D-�XdG��F5�d�l�m~���Ai;6]�l˥A��/۔���_;�bV]7w=a}Z��l�����w�Y��J�^a?�f�7}��@�$�ԘK��P���ܼ�Mn"�j#�u|ޝ���G�L��eο§tG5�Ԫc�0���£�ת�Z~٥(ir�G��Ĥ�*�R��Y�m�Τ>�Ѵ34;�(V:1[7G�+�J�O�S�;p�V��V�/�&��N�XD>���)�!��YF�f��d��s=,[������Avs�L�	�8X%W^_�~�y����&�]-���scy�1L��zNJE��v�i)͛������SP�c\mF5q;�S-�e�^�=���
؃��Ǚש�sE��S����>~v:puy�Orq]����g�6�?���#�R~�hmL0�m�Y��Y´�x6�*�2ƞ}MS�G�<.���I���o���K�Fk^�O��)c�O�,�m�'3+����>��a�)D�Dp��:e��m���D{ny�r��Is$�������Q�i=�þ�����.]�gQW%�t����⯇���e`@4��eş{\W�D���Ƒ�LZM�����!���C��T� �2ڡf�ggee��ЎS�:|%�K<?V;�K�%{�{&�3��|�Lg0Y��ᣩ�iN�G{,�r�+�!�]
�R�g�`��K@�QN�1�̅�&fC��.�˿ Z��/�&X����C�&d��`a�Q�s�"�|q��.��pA6X��x�4I{3���>�9����d�@=)$�dj<�Z���D"���)�A��<�Mv\ÀU�t�(Z2�>U����Z_�k}p.�v-\;�cO�F�K��Vhc�C%�Ō�]ؠ7F�aF���1�T��[��X�},�&�������JW��1���	J���t$R|�du�	���@�9�6Q$�}2=�-W�2q�S�Ri.�[���b��c��l��5�]�����*U-ǚ)�_�Zg���}R9���C�yy?>c0˟���~�J0&�Q:'d��7e>Em�XR��m���\&�+o
~.�ӎj��Tn�K��[fy�ʬ��䶕xmw�C�Ɨ��6NT����u��-o�5���7h3����)�G�#�1�e��p�h//�M���z�a��s�m���w��7��^��n�n=&�1_�)챞>�m�.��j5n����HC���j�輕\��b��zI��ɕ.s	�p A��z&!�<������0OD�ik��g��]�sxK���������3��L�,��f�}v�^�[]zs���'P��� ½�g��E<5�6L�T��)9��ˉ�E�r��]]S�t�뗡�Ʀ�]��}�<�8�
�,��Ӄ�.���P��<�ȓ���
#����V�FMZ�m�O����
$jd+��<���V4���p�mN=�s�>�}�Oi��r��ܸM�OH‰�^��|��駴K�\SХ�/*Jii����)���-�!��v�M�!��T�J�Z�Z�myJ�/�/��,6��a�X�߈2��6Q��|��S����Cl��"�[h���E��Oi�����*ū�� � K����	-�a�'5V�Q�?�ח��Ԁ]
ɔ���B���PS(�[�[����t�%mTg��gvg'�s�V��`�y.��%կ�k@��{���} 5��
�4H�T��$*�\�/��m�M*�TR'�Y2���{
B
�!@�(���Z�ĵ��Q�[:O�����~�����횢GCO�Y��20N�z��O.�xgm����?P<xL� e�A����(d
��0d���Y�X\<�G ��4��]2"S�l9�\!$dŨh�&�B�P(
�L&?Jn��U�A&���.��>�g��o�`�o�+ύxa�X&0�铙��:o��3_�Y�h���jU!���eFQ�b��c@G��)�#�	%9s��e�2c���-ƽ�
 W.�o@�䫘BB�z ��&�(Ȕ2*���}7�M$(/6,9
(�]�.��[�*�p�6�NHx������d�E^Z�+��a	�H�*0Ԫע�r����1d��x�he��oLՎ:�s�"����_�EY���L����:8.�*��<s(J�F����,�ݢ�P�a�1�Ba5����^]�A]>)?U��P�[X��^E��Ilr��&94��
C=>������S:TE�R.�Hl'`,Ĝ��p�r�Q��-�F�aH����-�"���Tvu�C�x9�WC���b��@�\ɴI+w�.�;���9�U�A�TQ�� �H
�F;��a����ݒ�dw�.��m'}�:s��l��Qt/�vU[7w�쩣I`��P�M��0
DTe|�f�r�P)&E�]���q�>�y�ٖyόa�HL��#��q�����ճ%�A�#��b{�)P�j��3b��}�ش�|��y��H�>�_����8\�c�@�H�"C>*�� SRe�1	� �`>�|r��3d��g� ��D�
�O8�2&Q|�QF�;lȰ������4���.�!ѷ�|r�A�)�5Uwг��4tՊӪf<���<h��!H�`�!ϐg�l(�Q��!e�K�ݒ���o�_\Uϰ=�/�ҫ�y�RB{���p`��R@�P��s�0�w��W#u�4W"^!(�׷Ŭ|8�'���ɉ=�߬��Cb����pBR�V�X�g:���aP�� u�"t-�p�T�Z�������R�*��'6666666n�����!""�,��,""f""b�dm($�$��(��|c�!d�,�U�+�_�N��hJQ����H�J�R�UEJ�~�6\�G�8G��n���� E�HD��ry��y����8�K5���KjR>�	Sy�[���-�8�a�^5��nbȀ�d�^aF��333Lt�Yg� ��6`fb�O�ۭ����W؄.�謳���O���)rz������CU��9������`n�|���/��m�>�7�g�Ms��$IB!����TF7K'�
�P��0aB!����i;&DmD���
䤏]	9k�����Α�>�f�H:���$OȲF��Wд�g[��N�ՙ�ȱ�5�]�I6�Ыz�Zȳ�C��
�Q�R�OY���t_['<���<Q�؆�GD.4��1K�u�4w[m���ؑCM�a��r
+���+]���>QTD��:c��)��K
�T���fϏ�Bg
�2�87�gJ�Ed�c?Fb|��Ii 8L�Pz2�?�04�g�6ī����V�Ʌz��ą�7��DM��@�,�rNsYq�Js�\����2�f`/���`�� �,Y��U�$�n�"�S�Ũ�o�U�.���=Q���t��A}�K
|`
��r������~�xX��G7�90��7$���lc��eS�d��=��ޛ	� �F��� �.�9�j�����ġ~��_����
�De����IT�R�T�����_;yE?P�6r��>��p,D�`Z
D���B�����g�D|e`���B�M���''!�o��.{�^kOo<����#�2�M��7ۓۃ�{�R����\��#,6=�====�x���K*{
�[O0[�@�z�َ����p�ð&z}`eH��&�;w�0�"Q������c@t�a��qw��u
���Doŏa��ɩk��c�v�X���$`x3��mX*����ʍ�.�h|̤�ɈLY���\����pe�#�.��k�T*�e5�dz(z�.Fvw8���&T��(�n�K�����h=L�N2d奵a��<�q����uL��O��ԉzzN�d�I#��䭝�AA�9��Ӥ��[b媟T�鉲>E��M��5N�*<)���;X�lHРΎ��N9d�3L�?dã�f�g��1�?�S2"S�l9C�u�w}�m��y�.�n�U��c� �M���b$�kU��c��OT�74�T1��>�e���{�>{u��60�I8ǯ�8U��Ö�a'}n2�&��'EBFQ*h�o2T�ɈQo�5�mXxD�Bӏ�Y�e�#W�wt�^1KN����8��i�E%=��:3��w����/��d��a�a�d�J�����Ҟ7�qNms�LMMM�N�oߖ/L={q���%�^ޤ���ސ�����Ҕ)Wѥ۲n�gĨ7扚�6,<"r��=:f��U�N��n���mŮ�
��5]�1�VP���X�rM�u�:RqxG��:c��9��K
|�rM�@�����ݮk��y=>������˞@�uM�u��� >�9?�&V��@Ϥ�ٳ��8^�Õƃ��'����,���U��ƿ)��a�a�,천CM�łkw�敻����t:�N�ѷ�3����hΣ��jQ��؅ÌG0ӓzO=GG_H�zj�=V����o��7��]�qT\��u�:���H��6���#���+b�uCL���\�P[F�BV��e@wELy�2��142�l�4?0a�L0�I�Z)Cw;�W��MOU����uϵ�#��u$C��},��qn� 7���%�B�9˵��]�k�f��:9�yУy1P xS�8����h�(j���	wl��#sC��q<p
�;vl���cǎqǎkh�;666�H
:���T��
H`ls�5��(��b�
`
Y�`ir���=I֓I7�a(Y��\K044t���S3>z�\ofH�����u��F�t'/	��W8�f#Қ��=	���
om8����RF0b�b�&7�@딚�z�<��E���4�"���;_�{A�	����r�#V'��[*��ׁt�["Z�����bn�TN;�\�����^�X�����ѣ�Jއ�p�e���ĩU�jGcWy<��X���'�o���$���R+-:Ȯ��u�t�#:�G�.z�c�v�F/m�W�\KB�����^�=2iMҲ]�ggR=��(�=���?7:���Eڹy����f �!ړp�'}!+���Z1��`�`����zhj�&��G�n"�Hd���m�/x�C{�;��0��Z�V���R�Q��E�.U�ɈQo��������jWĎ�.��f��b��>J�u*v�	B�ڜ��<^6�`0
c��0�}&i��{%#���hU˘�$4�k��L#�v����iR���|O��v���Ƶ�E&��0�������;��B�G?�v�Պ�Q�l���pej���t�0P�bT�;Ov&��k�Z(k'��;o�x�y�iw����9w2�(;.m�Kz�2�I���6�Ȓ��r�3�X���#���ŢY��“EP��x�'��ķ�!�Ċ	!B�1?�Ȏ*��t�_l��{G!��‚
�.����3��eIz��І}mbE��w�ZA��u��:C�[��u�]���dž��=��3YS2��K���?�@����R���C0�G��b��2��%��-�L��V��:�6�`�f�)&L�9�q�d͐}z��B���*do�2��&q��S������������gl���m7s
tPSGYj�$kmA�b��7���/Cj��l{�~v<�\��Ŧы���R���T�
�)]H=�>��oD$6�ћ�Dͤ��ut:��;S,�0�ͫ����֢�FK�ͷ̲݊]�m8sަ�ٮ\���m��<���k��|w��-��K��1��q�DY�� !�EF���2ؼ��v���bTT���La,�Qht�
]b�ݨ�w��գ�N�.��x9���@�.�t�f_Bw��u��v��}��i#�_�0`�a�x��x�3+;���dp�ΧΜBlY6��~R���Q0P٨�Y��L0�;9��uF������3%PP�)���乁�)U��(B(�y�i���l4c���g��o����x��!� u#)��_UѶ);_�g�r@ɬ<ҩ����@��2�D�5+;W��F���"�!����
%�QYdU�#*�T�/��+��:�ZQ��$�8����nS�9�I'���%��2�M���M��
��>����
�8����
�;�\��++��૖�P&w����6��h(��Ig��3K9�hxW:������n����+�Y�3J���μ�k���H=����Ӂك��83МI���N���\�&�]���?6��0wY�/}�-�l5O�2F�O�z���Ź��Զ��sN�`i@>6���R��j�t�߱O��V����<�.�-�C�E\j��R��9�5_���)�tv����SdY}�n����Tn�Ě�f�H*���W�C��ߤ�������u�����t����o��JJev��<A�����Q鳮��j?�o
�y)	��{"��c
�{Vrwԍ��t:w����<[
W�U�\nU�$��<o�q�T�'a���ÊDG���$��1�N��UԐB��ȫr;Z肜�$I@���G>�m��Km�ˮ��S��|?}F��k���⑺��p�֋V�͵�0�v�"-Xm�yg��:�=$��)�{2[0���J|T�
��\���9�'����K��[�����a���T��BF*���� sO�1�K�`����4�������xѷ�~�廵g��WOH��x����Ì�U社�f.^m�XZ�(���\�DT
��c�<���5�,m4�8�'�g�h�S�f�]nݤ���E���R÷uWVɳ�B��(��g"&�%)�X��Rz��=�G���G'l��G�,M<�@{��3����v������'R����'�|��|�eO�(�<�xc:;���\��ﮌ1-9���&b
` 15�K�׳
��R΄��[3�`4�so
(=��;@�7�oef���!���& T��s�A�`P	�Aos� �����3��-ۉݓ���/]����s���a�jhb�G�һ3�Q5���Fx�Z?���dͧ�Yz��.A��oh��1rssl�;bO�@7o��KJ&��#��|bô���[ ��&<z-ag�����qE�I+�V(����sU�S
(�A2���s��;'qzUA}�MgyJ"�[,�<\ )W�޿v�ʷ*��Ƕ?u��\T!h-�X]�-\ȅ^l�:�����"���:�}���|�n���7�="%1ˈ�h�s���ns���Šނ� V�k���n)Rwc�����7�Ҫ��ں� �'�!�M8s_+%J�/j��H�K�#Br0�c
�|[�Hl���m�N�z��R�(���A1�h\h%;F�
@����nE<�"���<�����@.N��������+�幱����?u��bL*5XJ0��,�+Q��W�/��S�����n���]M����@�SV����0�R����ę��H��yKR{�H��(��y�h��1�����۝����'V/�6���t���x�X�C<����	�|��CI�V�z.����;�wEpX�)\ȅ�^ph&�9j�^Z�p�.��	�V{`��	F�_�F�#�~�F�bj4a�����	{�-�r�L
������)�`���FL�[��-��r�?-H"�M�0�֞t���+�7ބ*�$h�EJ��!C*1*�:�l�A&Ts���p2*G�F�f�yD���f�}��f!��'攍�G7"E��%&d�Y���(aÆO�T/[���P>�}Y`�Xe�����5�;��s!y�\��|�$��3qt��K��ͨ��%I�ͧ�����)A<����s��\=O$*�j��T�ӯnl\�Բ���ǎ�8Y*���6W�6.>����_�������MK͐��e����}��켿�CX$�8,7����	~_�/fh\��G�1YH���ԙ�L(��ɳ�/�#���.���u�?&�ݯG/�i{�_Ϭ������~��������R�T8�ຜ��q���-��F�����3)sa��-��hwIȎq�.�+C���w^<8��������Q�:����{��21�zUA�ءq�h�q��Fж0�6u9|�G�u�Ԍ�v,y�긖ʌ���
R�TY��x��<�7v�h�E��I��Wy;~�?G�6�����$$y�$K|��'UNpخw��dg�`B��'JF�ɸ8q‚~��d��
�;(�G©��qry¶�u'����F�"�޵��r]�����]���ɘ��"��
T�X3�X'z$�JC¨dB���`6"w�(@F� U��0;YI'�A
�ŞdR9OJ�R��`W�u$�_%v�3�n�
�����c'�]8�lx+��14X��;{gld��be�6͇wI�Z�v���i�K ���7`�Y�p��-���J��󀙜rD��X���b�_��;p/�>�,��et��[4��*>�&�^��*�;�љ	�����RJ���v���4�SA�4f�W����0"�s�ɇ��2⚽��q�
VP�t��\��iR�Q{�e.tR��!�R��|_+���Ȭ�~M%��V�Ԕ�l���.Eձs��5CM�]YGZ��&�r!���<�h��ܮg���5��_I��$˝@��n�gU�O��G��0�('J�Ĉ#RC-u��H�&RڴK�PF�.�z�
P�1j�c��ՙ>�/Y:&�j�Zu4lԤ��3�l��
�_@",��9��B�dd�jk�P��j�jc�?`��}GN\��Z�����Q�i�E�u��P�A�	���0@`*�����(����ܖ�-�����]�d)sv=9�%�=8�]�\�c�r��o�4������a�x?=���y��y��)_�L��KN�	�%4����ҦI��/��F5�������V�}f���3�)���i&X�TPM#-�d�r���jmw��庋�bSv��f\�"`�6�L�/-~~2���z��K�?�$��C�6��O�#����21�V�j���Φ��8�L1��~�5���֔�|�(��ɸ!�J�CD��H\�6��٩���-�w��W:j43��~K��L�ō����q�G�"��q��t����5ƅw��1�|���ƈ�UK�_��X�1�7�*�����;��������O�D��l�=1O�_{�C6$/�o0E��3�,s؃ey����?Xy����9&���a�"�ߛ#M���+��<�<��n��	0o�nZ�M`��:"`�=.�ƛB��0'�_ӻ&Hy�P\��������
2�!m��x��ʹ�M���b�;���f�{{=8|':q\���#9��=#���v�k;��
�YZª��U�Z7�b"8�FaqV��;�Y��:���s�ȉ3=���}b,��V��v�},-z<1�]Ӿ��`�n��t�8O�ed��6�2Utx�kω��]��O@���FX�,��o����.TϸTv���S���E�Î;-N��\��·lT���|m��&�yE.�k�Av�>�R5>����zc;H���&�aǝ'�EW���n��z����p�:��)��,AE=`��?4�GЛ���r��&�N�J�*��b{�������c��fp x�`*Đ��XB3Hw�CUT�NG�lAG�$;I�4l�D�~a˨�j��T��C-��s��5kYϟlF5�Rcۨ�DC
EBFC�=!�q��C�r[��@�C���|��)JB�&�:�-|����ݱ4�q^Xљ�i�=�s�ζ�k4�68�l#b��a��<�	���u�(
��9ES	��9Z���g-&�P�1�&,��O�&0��,2�����w���N��t���`�u:3��G���G��|�FR�edu��͐��ߥg1�EpA�i�5X�T������jU�uj��y�|��|8���.2
M;��J�����Ԁ�/�ԍt�n����+[��_X�!L���Gh&Q����\��q�Us�"P+��P=v�3f�Ie�}{�ɧ�٨�۬�j(N���K�N�/
�J2�X���ۂE'��;tq�������o[N�dN�t���
��K0i��.>*����Զ���-�1�|����mS�P����T5]�*"c��^@8iR��l���AD���<M\��vGʨ�d�Dא�b���6!�cK��%7BkA"�J
3�1�@cJ)�.���>zF?���G��~D�ң�>=2T��t�s��;�F�.�p9B�5=R?��Ճ�]Ā�0���k�X<���x����?J��Ɏ* lb�� �`i���/��Pr܏�T^�S�g1P�c�j�Q��j���c���fm��{h��
)�܆DG3��<V�K��:�M��s�b��0>���5z��!A�~T�����;
���1)	��&�Jjh����kz���l߳Wv���3�p>P�#�;�;O�B.�sq^��k��O���{`�~�/0r_�Q}�X�5��%���m~�|1�G��OPM���2�)�C�08$�o� 0� ����nj�h�ظ��GWE�eI&����)8�	V����m޶���`�V���ފ�u�D��qւ�"C�%L�

r>D�BMq�!�v����Iۚ�U���iqe�
�Xd�W7�6��֊�"��@tWt[�+��]]���E]�QBT/���Ea�_���d��e�,��Q�	�}^���t�m֒P��;�|��ٳf�1-m������}{:3��yob���?P�d��7R�#f3����b'�měE�f��k5Kj1�|�R|S���>����@�^�m̸E���9��B��
L����Q�V�zl
5kҢU�N���@��%�fK-�*Qv�I�5��թ -�����)r����e$8�Za���ioʝD��m��e).�RMP�CHXBr�S��i��X.�H��ʫ=�DB���-���)P�.2
�1eʕZ�[�p��D��U,�n������̮Ё��b>�����w�b_"D��H'��٭��ls(Fp;��.��-��.m�dRVfF��ׯ�k蚪���I�Κu�U#WKQ�Q��kk��*+��h$
��>���r:������p�9�n��N7L���q��2�z�j���D�x*ݎu.Xvpছ=�V:�2���HA��h<���� 2�������s?(�9��r��T�]b���e4j6���T��O��/]x�cسcY���N�c����%T�UY��5��*A7a �2Hk��p�����l�K"HË�D�����M�M!��0�\v�F&h��)��MK%u�I���U~%�$�B>bID�	����<��Ńi�_	�vyH���Gj�g�캇`�)��*)d8\��ݤ�<&:/�?t�5f�6��Q.��H�w�N��j2>�_q�_�C�-��T����w�ٚ����YJ�M�Tb����kS~v[%��p�5{��nm/�lt3=����FÑ,�jL���	ٞh]p�й�u�$��r�-]��²=�dR�n�C{6zu7p�~.��i`f��^<���Ɖ�yI��8�=��vJ~��<3�)�GI�9?^��-읏����`9���ܥ���/��ޓgv�%'�e3��s��٠n�Ǿ�l�'ٽ�߻�H�-��M߱i�Ƈu�e���3�tq���9'���
HK03v����'�-����|�
GyH�d�':D�di�v-��4��L�nd��M�=g����:2�ȋ蘞�M�%b#p%)�£�E����%d�d�a�T�����1f�V G	�P��w�h�47�j��{YW7�1IY�����篗��F%���d}�/ĜOGR`��ߙ6zI��u��z[͐9���rl2�LB�H18ZS�Y�D�6ɱ �����|+�\Җ{6����j���5��e��^jh@�f��+��ia!��
�E�i�(��ET3s�
0*�.�p�"#m�&X�>��Ɖ�=���b��j�5�&#��䦲��zd�d���d�V!�g�*�'X�ܷo�e|�M�I�fAc�T�&bKQ�*�#�\�᥌�Yr�h.�l�Q�&���a9e�4�rm�����Q�T5O��yي;y��%�� �E�1�$����"l�P�&��ze�� =4z�%�&�:~X�Td�[j.@�t��A[X,��X��r(�������O�0:Ω�a�pL3����CR��ƴ���ڋ�9�e��F�*����[�ѡ���u�^���"x�X�c�KFO3���A�6��<�%(t|�y�P�<M*OO�v���K��5��COc���aiJ����w�ذ��{��C{�;�(m�O���%�d{H>��d���e���H�.؃e|�:�2�-�bD0���,��s�Y�̅�"Uz��E� �2���|��h���*�Y�9fE)����gJ��@��g���2$����"x&$"�����=D�Hw��0�sښ�GN�)A/���u�̨�4�����R	f�A��PaRo�ޮl��hP� ��p���O�+B�>����o64�ئy:�V�G���q?A�|u��%۳�a�!�w�ǛS����x��x���b��G�h5�j�Ƥ7&8����`�0o�e��� ����kװ�ٗ���'z���"N
�k.J$4��fC��.�w���&5�~1~�Y%\R�<�&��'�$!p#�̻8X�ñ
)��J�Qy�G���!�4-�%?G��%0��hF��8����qd���3�r2Ϧ�3�q
�������~��q%��>��5?��kA�h��R�K�c���9�D�,&���AoBs8T�:;��O��{t)v<�ž=�X�)5\�R�G[���͎OD8��H��������hH�� �Ȍo
�����P�(�
���H����B"_��`4�@��N
��FB�6eծ��x.w�:x��2��0�EX1��"���1�f��\B�sP��
���o�ξ��c��U�KΤ���m�����u��~}�B .ނ��)�*B],q��x�S����z�f����ߴ�Fs�
��B�T�	���N*�r���0"0Kmb\""�ym%wI��$����V��<%\��(-иzR�>�Ԋ�CZ��NXh�U�
T��;5�W$�y��D��!mdD��Z�-d��<,HQէ����ӌ�cdL�gۂ�{��>�R-��0����k.��Lq/�VA��~�!�q�Ḣ�v���U�,�������p��fw����2DS3k�iCY۰�fv��u~8�Ã��-���_�%$U�����E��%��z&]o�ԥX����9�x��s-�1�ǁ��-��k�
#�k�D4HҸה�C���da�A"�仫Pe�SҊ�\1*>�5����b�J�o'f��=����վ*1^ջ$"��W�*����=n5�չ�\��_!02�&�������~�����Z�-uS�0��n�h3w�f���#zu󩛵��T$3�Y��x���g5g�˙�k,'�0y�Hޘ���-���u'���T������A�:���P�˽d
WH�dvT�������l��g�M�۴��k#c����rKթ|�ّ��:��׉�۪Ysz�؞ڙax����J���뻩p��ڱ0o�j��/l�{�2kl]r*aPI[�K�,n3c3�0���A���W���&$���ӷa$�
+j��/��@XAn,AB9%��Xt�⣼n��@[�gs��b��꾾x�G|P��Q��5�K~���
���K₨�-`�Q�_˘gs�������H�U��K��:�50ܚ�H8$�x��,��	��0d�Q2φn��'Ҭ��ɝd�-�H��zI�Џ��Y|�`���P�[�k� �~��lM^��z_ո�Ɲ%�-��/��>�S�1i��C"K������P ���U�����Ѡ���=x��2:��ͮ<�����M����m�p%k�����?p���[�(?05�)��;�|�)RԬ�LŌH�qE�A�т�����;��.�P�_��dK]�m���fU�Nuqkf��gqK`8|�Qu���w�(�h־�a�{|��2��Pv֗�~���<8rJ�@AM�xk7���c���kC߄%I�D�"3�@54���|E��]
S�"1�*�u%r߇��2���d���,e���_H*�PgU�F���	%�C��@t�$�2!��Y,�}P�ڔHI�T5FcYL��X�v"��TP��4�8�
=:TB(�),-�47t��Wͥ�{RX���y]��-q�f��	�c�XsR���R�^��,7�Y�l�"�J�����<]/>f%z�R��c��k�$T.	׼�
c?�W�Z6T�^E���4Le��+��Q�V�,5��%�O��|y�-���2@�5�
,�du�CҀ��jD�����XlӒ)�x|>�c���DP�+6P�~-��Q�#
��u�d��޼�P�
���g�����x��jF��UM��_�f�v�>�触[�R�g�#�v?6�wQJ%s�=��ى��	ӝr�\��p��=v+آ��U''����G�z�����b����o��V��Y:n6Sҡ1M2�	��B*�`��[̢5�ԛ����T}�Kh�7v��˖����_�U�9����b��C��gD�#3T�I:lE$Z��&�~� ����@��]ʥ�_����̂+Jz���}bŒ�B�ҿ�'O��↦��R642
�i[>�$��&��V�P�v��c��1�Ra��׀�F��m��Bumk�G��5>q��[g���|�J�#��I�	ʠ=b^(��&�)�F�,?���.��o��'r1)Z��^���b��K^�)K̖���K8q�f�#L���A�j�H� F)l
uB�R�J�μő[=���$�0���vA#�4<�o�1�[����]��NЂ����[�M�1����[p��n㻺��ɿ���ʡ�u]2��NH'd��O5��
��&���H�RNSj�0#3�}�߼jɱ*O��Ĺײ�Fl�k�w:�=f�{vA��t� ݘQ��jX*���>�|�����-c�#S�����f���6�p��S8}�p}vw�L��b�#R����ɂ�T-�8[���h��y��#P�/8���t�qk�5D��i=�^�ຓ&��3�z�M��AnƉ�1�$�R��k̈��K�c�tq��Ы�ӽ9i	��@m�k�x�s�]3�d�N\��*6�" F6�0�q�y6����^DZ7P�FB�gMW�Ѧ?�D��CZ9�Z�U1L;,~8h�4	ò:K��=�MD�T�.���A�{�%r�e��'���CT��!�?v�a֞=�s��ͺU�	��46�&R�s1���Fm�UXwu�w�����_x�˷��!1��c�L�=I�������ߜ&�1��`L)��g�=��2�������.��t�Lr��4�˥��#ic�I�.,�`_6��� ŋ��A2m�xGd�ֳs�ƀ�*뀓���x�k1�޳pZ�PA�ҹ���mM�B,�-���~ǭ��E)
�ʹ��+8�:���p��$�W�Z�%���`�c��K�	���k9�
�5�~�R;v4�������H� r��+�%ԝ�H��z��$�o��� 1�n>s��M��t�N�K�x�j@7F�sVec�\'-�CZMı�Ρ5a��e��Bz?(m�.>��W͐�!xiO��3�����c�!pD
�R���v^B愍�0!��T�&��Kq�(�]�
��.
�׷Y�O��7}0��8߁&P�͕��Hh�l	��±t�6����.Ӫ�&��<:��E���E�M����~�ѷ�p>|,_�Sg��=F�7� ��a3�*`
�*>,ҏR4�=�â�$��~2)-���
�+͢�[�z/�_�s�̋%ex�����6[rDVu��hf�k����8\���i4g��d�h$��|H����ɵVZ:����}�x/+�Q%�K��g�}
+y�{=�[8�uobE�t�V>�(
bc�H4v8P���vQ�y��BN�o|DL�31g��S�:R�'�!��,�>��KSg�PɃ�S*�+�yx��� {.��Nf���~ք�<,�N�T�1���Hb�w��MB�ܢX�Y��0�����9�FI��=���j ���ֲ�4�E�M�~=�l"{:�f&�&XiS�G2)ԡ�`��H��v��}��Lpع4{�}�+0��]�l?���,GS
ZI�.9-��dbƏ���(%�J�������iKlX����E8;��P`t�������;�^��Bw]YQ��eaX�?�!�(��n��A}��n�T�2`�.�|�w�_��`��Et�7.��*o��Y�̂Y�^�$���L9w��8�^<X�]�?�������2z�g5��E�ܯO����Ζwn�y�.qmH��ג"�z&hf
��gG�c���w^P��-�Q��W�|��I�T�:�����F��a��>=mS�r�E��:��8�@�\�AVoj�LǦ,o'J�Kn�'`^����l(,^5(�oN

BQ�
k4Y�������Z��+������o��jey���ғ,`(dx�b�h����e�&��2����	���sf̝�l�z�@R�e����P�i�S׶>�:8.zH!恿�s�$�(؋����
�@b�~l}h�)��7��[
��^N�蝃��¹�]!Nb}{J���t*g���������Hz%I��q�֖]j1��D�w�]���>.�4���~���Z�=�0��o��_���<�d��σ��Se�d�
���S��d�����Vf�!�:��u�	���Z�I��T�#�=D�c= �iL`��2@�������Zp�`C�N��BiK��0y\��)�t�r[�:PD+!�*)�\�(�;��D�����ަ٥)�8ӐÅ�=���+\�vɩ[�S�E���}Ϫ>�\/`߆���x��b# KLc��v�h8t�z����ʐ�z�#��L�M}J�
�S�46=*�@�rے��S�@�d�2�o��l�_�è�L��Mۙ!m��T��1�%�C�x(�܌�)����d�R��0��
]�[\�e${[ߺ��JU,$�N�2qv��v�U�:j��,�I�dҐ��ׅ+eZ�!���ˈ��t�{�@�Gt���"d����NH}��j�<��Rv�m�67Lm�5<0�Kf�ƍ��;�BF��W��X{�Ұ��,l1/�7���7
C@җs���X���(����s�#��Ñ04������>���a������P�ڼ[\+4�zM0-��)�
��{.�E:Ҥ�&�|�1-��<����MU&L�k(��"�7�]���N��!�0P�jo�Ah�Łce�=�I��Dʀ�����(~ř])S�b
�FEi>��[#��wj1ym?�^�Ld�ЂZTR,����,F�=��Օ��z��Amu�˺$n����
��p")!��	����+1�(%�	O�nX��	����z��p߷G:��hf}��L�C���g��ȿ,lh�V6d�(ʾ����P$�Tq`k��y��,-�l����q��7G���ri"�3*#�`3�q�F���Ar�[�i$�Т����󈎈��1�;�8�k&j'��d�p.��l�S��0��8�4|�b���ؑ}��.�X,�>������6vY�*C��;9ٙI�Ť��0ҖR~�-ްj�L
�YniwM�)��`k�6E�;I�\8�h,��,T޲
j{�.��m�� ��<;}>�w·�u��Y��)/�h��}����4�.ߜ_�#_{)o'%Smo �w'�`?;p"~b�o�}�������]���^�Y뮉��D�Lc�+��{��T���Cc���c��w����!%�^��1�e4Ă���'F��X���h
8�W��d��7GTD���k�3R�;>�;v�8�[� �܎��z�'46ٞ+�k䰿�h��A4/�^*y"C�KW���Q�dP����3NO�+�նP��r�����B���>lQ�^:00��]��d��rDw�A-��u���,4�P�`�og8�{$Ah�ƭc��:��w�a'Z\�j�'�!����]�wO���M��ގK�(D!
�bcuM�!_�2���CA�~����Li��p<)#�ŭ�d���@T&��.�����z'u�7�����ʂ__6M�*Op\�%��b�4[� ?-�B��p��T��2��`����P�*.Wp*��
k	�ԎIc䔻���,�{�{��E��Du�&:���)$�Z�W�G�rW�n�Fl�3A�:ao�^�0�Z�A��6�Uxu�S�%!'oT����</��lj��$ o24���[������y��v���րsOOo��-�,���j�W�^@S���h
�z�KT�4���Ͼ�㓘>���ArJ��O:ᲈ)YtM�_BT""�i�s?�^�+�&$4�9Sstk��H{V�ҭ[�4�ݏ��w]pF�П`��rf��������:��#�I���ˤ�t�SG��)?�
��)��ċsĩ����|�%^p�f��E��Q�"���>B�s\9��,c�aIU�F5��\��eX�D��6�jhH�3���Z�9�-vJ�0c�|d;bq-.��x�@�s. �]O$;�'��3��m�W��9�m�My�ۤ�K!i�B�c��3;SpAL\�
�V��uS��A(�xr��~�/�#f1����<%<U\
E��&�G2/���&�!�S���[�|
��BD��"�ym��2��R�e� �(=����Qv#�I���u�L�,ԝ��6�4sA�����&N� �uh��Q���Ov�0�#{�/��o�N���6d��2��Á� ��ZSĘ51M(K��>�4�͈���,!��<<��pty-�������I��N8j��T*U^�j���rM�}����+ƿ�V\,�\��"
�0
���o�gQ�������[m�:Nd��Ev>�?q���.U�E����pK
ڊ&��3�0�8V�]�!���-�kxa3����+��q�$��J��K���f���ψO���;�d��W��]7��^���}��	]�T�6��EML��K��f�q���t�p�!s[�	�(�>��.�:������l'b�M��^Qi�ߍ��,֎gS��L������x9=���4=I���JN�pE���k�*���0�O��B��?_��Y�N����fV��0���U`ʭb�C�j������N�3�#{B�ҧD��:M��K9x5�N�0�4�+��}g����*�<���?�,�d�\	A@!- /�ƙ?���k��\[�)���|��i��t��3,�L,u����?��;A����h�}��P�=.@��)l��`<~��'�Y[J�lE�TDƍ$^�߶~�Ts�U�Z�!jl�.�9s,��\�gs9Oi��u@�X(��%-���8��"u)Q�13^�;�����8��N���N�U�*[��"Lsڥ��/���B�ɡ�{���Q��4ln����Wxx��|�qk���K3�t�oJ1��ѳG\�L�[�+�K��W�{�ʲ�X���
v�H����RgS0_N`�f���.�aܟ��t�@#�,�i��tC�fA��u�T>�\'��h�*=��^V+�r�D���P����r���͒9���o�VW�7Է��'ڜ�����>/��(���+�ҤY}E16z	\������i�~C�I:vHgEz����a�Y&}�
�[��DgY�Xc�lV@���`��z��2<2j�|�AF�'bl͢��`�H�;
�l��"-�����
�#sc�ʍ� k�����7���y��Qdx
�{ޚt�*��u>,zh%��mȨ�k���z���hB2��f��u���1�$�	����Iǚh+��ꌵr8�hQ?Nقk$:C�l�0[
b�l���6S|<�<Qa����ߢ9B�����j�*��A���LD�j�PN�Ɩ�J�z۾�6|lT(v�4�`��-y�O�/���ߢ����,��'�c�;P��6�Y%C9�v��������b�z�'�e���g�$v}�z5����i��z��d&��%�E-@0*���ry۬J 	;e6R7I[y����1�G
�[^4���C�)�����j�`ĝ<e���^�H��i_�Ϳ����i"T�|?���#($#����
P���	�('�W�^��f5������i5k4ھ���xd���j�'����NQ��v}�,�[25R϶�K3_�^��(9��^Gj;��~ü=���t�IR�)��|��2uˁɑ�rƴr��Y�%p��M�	�1d֙-����jf
�*��z���'��jqm�N��u%��x!Z[�G��:���?��uvZ7Z
�>�TVʫz�&�Qп���ZpŬ�P8).�@��fI��Axsx�J�����o�kUq��ͬ�I���5:��3�n.���(<�d:�"@kj�6�N�Ou���NK����+"!���mZ����ٳ5�pH
A�"Bk��P90ff,�PV�̧��J�N$w�j�e"q�2&0�5��^kvG�*��k7f:�)2[���Z~7!�!�ܩi�ؤ+�����-��O�n6��r!Z2�(7���.��z����;`�藶�@t�a44�nĤ<L� ��SKA�ۛL�*�m����pc��M�c��l��ʕ�r��:���W���r/��P<A�)�ڰV_̷�0�R��J�&
�d%,&�߹�ai�����2��3*�!���YO_ �i���.� rњj>�bժ4$�\[���o�
ƒ�+�]^V)a5P��5�����!�%}m�o'�m2�U1��ͬU8u-Θ^�A���l��9����g���ʈ���*լZ�+�W��6l�Lm��TN��ܢU$�����&����B�	����韖C�s̄��v����L��-S�p�j����r��P��"���DB]��IG�,���!q�����n��u�6աrl�������b�%o�&��1C�uѵ��x��~>�~q��Ljr+q
�'�]B�w��y��*CAwP�������ȉ���kF�F�FC�Z�cj�Ι3�>�II�}z��O{O��L'4����tG�,�Q��'������o�sq��Ÿ*�>�>ÿ�)=�W/?��Uk�QO��R����qҫ�����(�&mu:��Z������eZun֪��Vf�[�����5XRb�ߟJ�lY�9���;t69�#�∞]���I@7-.�5=M^{��gr�y������
{�i�<�k�$V�W�2^ԩ��adM!�&T��[JdUT�`[�["����Z��>��G�?���w�\�Xd�1��o���1u�b���R��j�{w���hs�mH�ݞ^L)).r�o:�[4ڪ:�� 2#�x�
I�M�2�����L��,ڜ��C��t�
�#ȑe�e�ﺤ�o�-\�W�f�ۆ����S��l�zȆ�ӏ��~>euP��S��Ж���L�n���O�/e�?�����w�Ŵ��%��Dr>�HɌA֏��6�O��e��D.����+�u��u��>/�����_�l��>�@����ca�T�M�S���G�S�X^۰�R��
쐒O,SCa�Κ�L��;���{�^H�_x�����Xm�[�g?��`P"
,�H�<i�e�MdC�xY���Y���1�s�ʹ��a���E�(�܂v����g�
濫ſ���[6l3̿���P���sـ>����U��7kmҩ�	�������J�Ǹ���ovlյ�o�F�ѫ�q�i��X�������AOv��+8s6�ଭ�^g����Ai=�9KLK漬�D�jn�v㟏K(|���_s;Zk#H��8���~Y�$}�))S�2�Me��!g�Ө�G���ufU�fS�O�_�cӿp�q�(er
��2l:�K/ZSƼ4>��;�%0�veҪ��S!w
j�Z��'Mт-:��Wp�&�%%�
��.���.}���)Q��i|m���dQ3�NLY*�2Q0 U��RqP&��l�n���h�b�2&�i����٬?>�����7����L��<� �U��FWQ(D�w��cH"H�6�lZsO�������-�F���%B����w2-O�̱���*�.�LN"����@��kŢ��0���.z�����7�S���\#Fn�E�i�
8U"�/��ߺWW��o	��pg�>��W��}��}{z�m�F��Hܬe%~�����+��(���Y�s4O�vX��3�'Mer��+�#.���g�ݧ3s���}$+��%U�b2�2ȑ:$�c/G�9e��kW4��&��~-���De��pƷ�M]�\'H92-U[*T��5iL�)Nk�;�zѮ�D�
 ��9"��;A��-��&+c��_��~<��3�#��QӦ/�E���d*EXD����^��]�U٦��HƊX��,��n�h&��R�VY*�-��tzp=��岲�T�
+� ���b�""�g.�F��սU���Ѓ�ci��B��G��+�x�ϪYu�jmx���b��k�M�
�C��t����g��v
�����8���B�RG�
�{�¯�Z�..1�i�6�FXЫ�f����_��x]@p�3P����<ښ��/ņ	��}.j-X�Kq�UJٖ@M�e�ҩ7�vJ��:o4�t:�eϱ�Φ�`4La��0�J8�h,~����}ߓ;"����x���F��O �h?ިk�2�����m6�����SK~��	L|�y{A���p/M�|h��Y ��,!5���~��MRw�l�p�kf{S
�x�-+��vLA�~��jwQ�őB�D��N+ԗV����mSE��B��O�tQ�L�"�@��3�a��Zg �Z�k�h,�ª��s�ѐ�d�(�E�9	P>V򂯆mï@���&��r���&�A���uhu��OUY'���HVIAb/���~k!w�{'	�p�&V����=*�u¶�TOZ�d����vS?h$������0@�F:d���T˶�-���K?��>V��u�c�N���C��W�.�+V�_�*��>,ww!p��XA2�E�ua����K�E}�c��X���W���qc�qآ�H���³��cEŧJ1�O����r1��L�[|��#��
��$9�e�&��HP&W��mY��4@[�����?��9���(�a�����ґEw��28%,3�b�X,1�Qx
�=����6��R���$(T�<�DF%jL���5����EEpS*?}:UC"5���DS
?���)�77�To^]H^jdY��ث�K��BO�4K��IZ�66]��/���F�W֡}պ�
�����G�����|�������}��}/��� ���5�f^{`j��Ͻ�����ċ��5,�[�#�o9�<A:f�zN!bB�ad�RJ*�,�L�%�n9\�oV���7�=�Gs����ؙ�j�������!T�'�~�p�e)�)���,��AY?��=e��rְg�'�U���,WƔ9�O��Ċ�c�J+�-6��h]���dm���dL;
�@�Ǩ
���J�k�[4�K�$�����2�5f���[�mt(�M��X���#L���y��&�f[��3.��~��~z���W��=,����^�٘f,D?�'ˠ�J�ptMi�����xB6�nL�&f�u#T�n�MU��j�V'���^��S-P�#D����*�$��]�n-؛<��e9~��Q)�5d��Z���^�nb��Zq(�-"�ع\b�1b���S���uO�kd�j�X�3�[�D��(�u�q�,�l|m�y~����l��-|1���du��]dJ�~4�O��>��Fo���y<��-��V֫ܿ��x+�ya��c�+A�0�54ZB�R��ߒ:+��φã�0}��b�����p7��H(hO��=��l�ڧ���hA{�g���jx��e��'�������g�3�C
kl��gL��i�F�1.V�iT��.\g���rը-�o�e�V�3�C�FC��Ҍ(�=����"k��o��I�B��@�>^C�ԡ�/7�bc�ţ���O��"\���M�x�;�Y��M�Bɽ�x��v(�*S�d�Ui=1�@�
QL����V��{r�tz��
���ޝ�bp�yq���)�L]0DE��mÑ�#yl����Lt=�o�
�{!��^?L<!��Q��<4D|Ck��׋�R�x'(�:�^�Рu��m�#B���'��y#�U��ʑ��~�v�}�L۰=#�r�o���tC�ܹrˠ]&	t�g�݊Сk�2����$� ���mo2�����HB4�j�Ή%�ȍi�ee+��ِQĺh\ch�"�nEe�'�׿�}]p~��2o����p�G��N�rD��+k�h5�M*��Qs�l�#�����e^�z��98d-zƬ5�(󍑸��1{���oV�s��
�=��v�G����c��H���BH���.��]���i|�5pV
I�o 4�	��M��	����`E1�!kمV�8���ۋ�U�my)Ui˃g���u���K)���i$�}"s�K�ڻ�=���]��'3��� O���'�{�	���v6`t�%��T�D[�V�9�J�y��8`����,��D"���o6l6��O��P.4|Ƿ��o����c�����j+H�N_^���^J���○��B#����!���#�
��߅��S�S��>K<�{��A�~�s�����>�d.[����bTr����H8ݕ�8�$�q
b���<�K�%�g�N�#Q�����l�j�*��Tj5⊠bATQ�=��2������>�9���M�φ�F"ъ5�
d��a˩|�q�s�;�l�n����*��w����>�'ݾ����:�ñX�%�x="�b�\^�J�U,���P���[���n�a
F�P�6��RQ��M�i^_.�(�
e9���>I�T��8\�[,nS�����F-���G��F�-
n~������f���i7�{�`_�ҫJ��*�E\U
(�BPm2	��rs����x6O�U|zʛ�漚w�O1&K����▟j�~?�F'AG�j4INR�И���_`�[����
��7Jz�~@Q�S0P|��Fy����Vc��	M��Ǻm�D[��}H���B).mk��o����.t��!X�qzy�g��Q~W��#�$=$�D�
_˼_��2�vzx���dF��<Q�5�\�S^�[�����W�4ז65���t^�9Ɗ9(����h�\�9��;����F�Fm��}�J)ۡ��!����Ń�Ÿ~!�bς�<@v�~SV��p�)�����V�{���hxn�`���4���=/��}y&�l��S�~瓽�=󎜠)9#�W�W��u*��J��ww�ʶyta}j'�R���uo�
2� �]����=JU�Q�:��)���Ŏ�ᄋ�S�T��B�H����9� �֙��[o8^�5�kY�5�tEx����bU���J8���2�w8ׅ~�
��ln�ުG�����kŷ�ys������iX{YU]]y"".�_���I&�
Μ2��sŜ#�+�0g_��Mu�$+=p������EBMH&��	'�3��뉚�CC�cD/�{9p��_hh��O�>��_m۷�:N�F�a��l�-��s���oh�s�O��ג���^]����x�yg�0A�ȍ���z��{���L�~j��D3iy��W�Ш��FZKh����1x�y�a�|l~�$��x)
G
�.���i)����k�m���23O��o�nc$�)/�@���3
Z(�ѴQd�oxI�����Ҫ��h"*�q�Ó0('��v���i�H��T8�q�^��?��bٜ�T�����Rb]^���J��NE�8�&�^ox#��K�����s���C3�k�X�k��W�����ꥡj{��4&�;�3��J�y�9�f٬ȿ^`ZM�7_�L�gv���۩�ܝ6�_ [�W��Q��xF�]���*� Rƕ�%�*9q�Y��jt�����}^��k���j���p��c-���k�:(E42V�i
��@��$)�qD�@��҄`��^M>���J*�M��or�Lem�q�Ov�23�r��x��S�NY}?��H'W�V`�-bLu���7eo�d�}e{/�7��xd���W�'oaM�Έ�oyF��b8��4��w��5�}_?�ݳa�Ҕ8���!�v���ex�rG��ad8<B=�۸ڸ����s�X�tzf�f�����܆�Z�D3kG�g����D��5�_&�� 6���J���X���#���:�)�Q��3�.��7�z4�z9��UA �C=i�����2|���k�IGYa{�E�?>�f�B�
>��QM�U��\���j��gi���jBd���G�n�uʂ��_��;��D�.Hv�5�&��Ma� ��3N�����i_f��۰6�t���
�M��X�Ƿ[7iW���#��:�r�5���L=1��s[��*�"겍���������l��&���-`���~���j`��2a�տ3:s�|��*m�'0�#���%���-6f��ML#K@/�۷�q�'(���q٥�e�v��̀r=�Ah?!3�1�k��.��q���ٌ
�J�;h*
����U�!Cjʫm��K6�Z��+�W7���CM�"���g{e��h�Z6��m\i{�ە6uJ����R\�}>eP)�b����zó��q��C2Z�
>##���H�y�ł�M/���
���
n2YX�6����J�7����ᨤ�D�P�����h7,0YX$:�V?��/b��d��O��3���K�����}I �>�>��;�?�~�չ�8K!�xņ/0�W3Vh�
!�ꎛ���޻����<k��>}�W�c�Jk>�K�<��O|Չޞ�t4@U>w������eu"�[0%�H���Vw\���4ʲ1�H�ʽ"��J�r���l�����o�����dq� ��tm�!�$����Z/Y@
S�
��9�SoN��.�� �T`5�"���p��V4���w9t:�!㠢�@6׷���r�P䆆3ЦvޢcL��O�ƾ�p��|��2fS~x�s!�?��d��dF SMi��=��'下72�c�gG)
���w��p��c?�����Ao���mz�i��f�znKq�T܂AP���D�DL�)�	�Q�����+\��>΢M����[���vn�M�g��A�N�L�k�۱&���������O��[�/�S�����ꋿd�8�i\�\��X�K�ISe�J)�ua�:�
V�3n��P�ɄE�r�%�3_�lt&!"t�aBc��9Ţ:�)�݄%�h�=	�,¼�6=���J+�6�]��8��;�2��rR�2?W�-�5Gj���(��'��ط_���+<J���O���^�K�v�OI.$�a��9�����*�N��y�#u�H d���-D|f������x)��@�w;IB��2��YA��B�l-f0,��Tʁ�A�x1�B"Ysqx��@
��*|r�����B����	��B+���Q��Lr=�3y"c�s��;+�ު����X&��9�FkyA d�`���|v�y��8�ƴ�:(�.�)�U����$�<ï �ӗ?~�1�"h��5w"R��8�)Yy�ԏ�	(T�sJr� �hT@dO���/��{���=Lj����9����%�÷�7;�����踑2
���yN��W=���2�(��C-�i���"�-���K�Prm��iC3s,��b��D��k_>�qaʎ�DNf�ᱭ,���}����l�QC�2ݧ8��c���S'���45ו[�<�Pzp{ذ�
���7\�Z�Z8-��ѯ�%�~�߹a���"�~R"T�!�.��5�%�jR�y~؏�r�N#���Q�lA�� `�yiN� �S��5�}�jf�2�h�y�v�}LfŪr"�8�o๖��1EZD*�H�:Tb����5@�!֊[�AI��NZTt��$��Rc����@p�|ȟ+���CTO8-����0�^��jT6ՂF�ZIL����^�Aon4k���/�r��Β R�O$�\1q.�d�%����:1_,�f��U+	W	���'H#�Qj�/��ݨ`
��ge��J����8��q�j��5.����I�JE�G�j�+�������:!䗉�N}P�P���
��[��ucE1�\p�%N�.�p*~�a�_�ϧ_
Wk�3�7syx�39��*r}"��9����fӫT`4�8�H5���9�;�)�a��mX0\R;��U\~�F�&�Bb��݄?���;��:2*��޲IRN�l�G�%�
��\[�|�YT!˷�J����Jͻc�%�@,Xا���\2����R�I>�N���,{�;d�N���4�%��=���@����rZ�cV������M6EF~JG�	8l��8���A02����!#F�B�	���, Sl���2�G�]���tz#��&4�is�hO3B���Vnp�ui�uѱy�z)/o�;�˘W�5�����-�s&��{,����k~��Z#����o_䝓�
�F�ae���[=�i=.��<�N�e`[��f	=z�FߔGE�O�O��鈂�ϼ�
ANMF_y�^k%H�P>���r���[�C�
�Ud'�$|�ߕi���ͯW�+�v����`��{qAAN����� �ٜ��ֵw�ܸ��[��s�%��i<���Hˤ�ρTKp�?��<� 2�1��ǵ�b��}1��(qIC���e�0pߊ�=r@|CrO�7�}+<�K��A���t��+��s�h��}�6;"���
�ݶX�;��1T�xz�R�����.�P��y~<���څB�H�s"BA��7o���Z���}�{���l��kx�y�֩�R�&g��I�3��3C+�V8^�#�y�e{a�o�"�#[�(o��5>��X���]�Ҭڝ������9Ln��>��3�E2�ǔNy���-�uֱ��6ظo��J"���o��谂����Z�;y���]oY-����Q��ږA�qB��!S2f��	bI�V��GY��X�T�����(k��b����30C�ڶg�����b=7=���aҏ��&Av��Y�g�Uu$�{/�zN�/7�Ǣ�%ֻ���7���������c�8T�jY~��(+"� Y�.��
�+>���L����n�<�u�6���I&�t&�\, }�������I���Y��#\�`�gp����<�_h������!���Yr���;�
�fk5P9EL�`��11X?!,����!M�����&.����{#Ϋ�!�ߑگj=j����\��XB6ۆ�f�t�آj�a�Tk�P+�B��j5����@�e1	J[/���yIiU@W8�%ã�)3�
t2/_��Zz��*�Fy�l����p=[W�*#�N���YL�{�N��%Ԓם��:&���J
�������t��R�if�Q%L��mL���Ȫ�Z5��ߨ�Р�����°���{
�\�pre�]`����J���O�
8'pK���Y��v.��q�r*�4�ʤ_���3^лݶ}8���n�Y ����Dr�-+��|[e���D���>��E��ڵh�ő�a���3P�[��(DZS;OaU|�`lM����@���JK᠟+�Ì�b7�Ov�`
��=h-��F�"}��0k%�����p��o�2�^��`�N+���z�\��9T�=c(�aX��]_�:��cS��CR̤�O1�y�K�s�@|����Xɋ�P��S���I����Y��a�$�nʞ:�TY�� z�B���!��
�{�M5YlLH]N#&�<[3�i����P��|3P[�v,ݽ�٠�5d?RkV2k��
�HQ�9�q-V��gI5L�����[��4
��ɤFD:���A��ET�a?]���|h][/�{��@��X�`�/�^�L�_
B��f�	��7s��E`����}�לb�JH����kv�A��mĆ��S�&�a�U�oȴ<l}�jabWl�2���51Tp�)!v�8�J5���M�`B��s�5���I�XA�o]�!��Y3K�<���!����^L�����"��#S�굢���B����7�]��;m�wO���<�>����o�!�+E�*��w�%��ѭ_�6K�{)�����{��nD.*�ۋo�ih�U�<���=��]_���
�����ϕQW%RC7�( �œ�O��W5�r`���\���bA��P��TlH�H���+� ����bg`��Kg/����P��ȖS�eǂ���O;]����?8^��M�#r��@`oe��=p�����2�Ӿ�پ��6�yP�g^|p��|�������Q��!��!Ө~�d�:����$�0b*q��[wn�V	%�*+��A�ʪ�9Y	)�)=��*���2��%2-�ΔA�c~�]�����$;S�Cμ8"�p��|��>qRW+�b2�&�;J�s'�q%J��Z�E��<>�kէN_�o�l
b�j�Fo���i��3��k~Փ0��e�!�IԊ퀗xH$���y�^@,�M� u�vb������uȺuT��
�d��e"��g�d2��)J��k1j��o��p�k0��&�Z��k[���oU74*�(	�ʱ�䎓�eTnV_�r�'7	R��թ�3��s��=%6̨Єu��U�ӄ��ʲ|K�	���k�2A{,�3�2�߿�jȵ�h�,+����C����*�g:�jffI�p��M-
V��7eޢA�U$"[�y�h�m��� �f��������E���lթVq��5���Ę{�L��Ў)F�Q�#��.Eƒ��;ɰ�(�r(�=�����r�!�<�R�BlqB���!�J	�a�=���Țf0sgz�[A��9[��u�wSHK��Ց�B�	�UqbB� 7k#�
�6�Q����F�
��~+4+�O�� H1����)�R���Y�΁�
�G�q&b)ѹ�4�
���0K]���~j����@	e��39��ʓ�#�<@�Θ@C�zz]���?�	�UZ�O('Jቀ!��7v�`�D8�)&��2N:-9]��� Ԗd�;�\?}��NQx�\n~�[f�R SxNmh�l��:��#���c�4��^�@\�����*rhK?=� �(�:��I�G2[4CiPy�eAy�\V5���4�����5�=���yM������s#����TP�f&:��>]��&���l�O��1ũs���.a�9�8�Ϩ���6\�tZ^�v�,W�����&�����;M2y�W�'��i�dSdVR~��P�X����7����,N�.(C(r:����6u�qgu�a��B�į�C��F0�w�=1��U6`m��2�׹���ҼI܃�\0T��
{� 3��z��x�e�Q�N : !p+�%�^w�\s��JJ
�9The&�@���
� *}�����K$kӨ�KI��4�+y�	YV����C��.��ܦ�Ov	v6-N����F0�:˰KdmӘ�K)?Mg�����o)P��Ö��b=^j"{lI�x%9�s��h�����}����<m��L�% ��3��[B���F>�ۤ�
ړ.�<9GO^�(�t��n����S#Cs�(b��˦��,�눎xȨ{xg��_˸���e���gE��,{�A
�U�1l�ۊ�Нt�42�
��
f��!dj	К�ߌ�h%
��<��'3�}[��Ҙ���G(�����y2a�v^)3���a�ٰ���T�ұ+���--��Qˢ��]h�"�(_��J��HL���.�;ʮ����a����7��o%S
y7z���4��x\�Q�2���<͇�IF5�
���]�\�`�B2�Vz�{��>{p�ӲJ�����e�q?L����W\u/4.h���;�{�2�M�5&oB�u�&p3
��*�-�e���E�f���
Қ�2�O���`��gG��y/�<�f5�
.���k���
���޼�J��=!�[�`�F���m�����z�����.��(�0g��bM*�r�V�'>:,
A��ĉ�th�t��U��	T�H6��NҵI�@qT�wv�
�
�kto���bZ+��k��F�q%soU�����^`1k�����-�ي�HK%�T��R�ٺJO���Iƣ=�NB�[��ڑ����gT�&�us�54���9��g�g�5*�Ӂ�ơ�U�З�z�m����Z�(0�|í���1��fF����ݨV1	z��Ϧ��[e��2�nӟ�e�2��Sކ��\>���d5j��yC��u�ͅ%i��4(�nx�8��1���Q6�y�{�۱w��BF�ZFV7��{e_d�=V�T�D9*P��# �2<���}2��7�M�>R:nE�
�QOY;Fޥ���)�y��(�Sh�p�|��S�)F(��*��QH�t�|zmP�_,�ы6��~����d?�����l.���R>�����W6�^F��"�x�/���PH���V����Wv�%�4��D�wk�[]>���^�b���b@�W�.��f����,���,8�,���j�/�k<Y�n�1�X�p�W�d�c�����-At*"���n��oW�
i�܅����l�Ug�y/<��}N]ҙ�����u�3��_h�]2��4.���M�?q4"�+�vd��d5�g[�6y,����G��O��u�LιG��Y��Y�JAޥg�2�ټEgr��+��3�6�6��v1���:��f6�q�����)�ǝ���-s�xA!�-�	�_E|1�zGӐ��S�4�Fk�����G4pQ�4��	۠��^f��ڎo�U��!���=mF�r�ԉ�)Kʀ���XtO�(k����^�̎��g�.L|�{,�J����3�H�eqq�PO���y��F�ئC��v�l)��B�uۍ,���l<�n�|O���=��%`w�'���q�X��LW���2�	�=�E�O��eOw�-�c�Y��j�O$��=ۏ]mD�k�^�=�T>b�^������ܦ�8�`�5��g�Ϣ��N��냦K����9kRA��,{xK��<�g��T�8�9�����WHS��?X�6W�d팢c���0/J6���J��q4e��2B�����&gzbV�Iۑ^�䚱Hi3ք���zY��D}/�t���� 1���|�M��(��ܸ�Ŭ�o�,�d���1������^�V
w�6v��[m��0y�6u�u�ې��m���,c�5���_3��iڳ��e�����ێ��M}y�����,�X��a蛴��v)���o���!��'�0~��{
�O=�g�0}Ãl�Eo��nr?8k��y�o3ɝ#s��T�X��S��fY��q���)��2E��Y��6����-�#d�7kij���	��x������
5F�j���Gn\ 7��i��#�U�2�-�1K/��[�<�hmԷ]�[�]D
$�T:u��f��ku
���AUC<��	�szdm��\	޸���!_��w���wp�&	��#�d:��(PŘ��g����rKKG~7�z^hn�U���谜��tb�`�'�.�Y�*��#�I"���\�᳒n��	.\�5�����~$����,w*}"����T%�����P5�Rع���P�+�c�ݷA�#���1*�^t��k�m.���k���G�6����&�]�3�N�݀$_=�?���>�y~^��RMO�~�E����~�5�dӪ%��\��y����a���B��ӿ�yL��;QU0�zL��;6Dk�k>�@;��I�W$�'��@
����o�HY���e&͇ᤂ��sͺ�3��Y����Fh�C�K�Ԭ�8�'�
pxWX���o�����)���ǀ�0:�T�bW�F�m"���9;���z�W�q��'Zx7�#��ϊ!TD;q���f�΅��Lz�Cs��o������u�6�)̆ͩ��\q�|$9�i���8rL��]y����7���X_�#�z�X-�k����"�_��ĵ|<o�?�t��H�mT*iyG�nD�_�S�9�a�����&�)!�f�?B����Z"�B�&q;A�ؘ��SY{�ղW��aԿ����=,���$�iPs>����~�/l��u��k��?�kX��7f~}���j�~�7��BԆ�J�Zշ��j=�oB�T��YL7W5�/&w�tz�(}��g��*�b�T���x
�:�2?Oj���#�%��1-o�Pb\?�^3�D[3*��-�J��������Ԯ�R�H��Qbc
K��mO�$98��$'�j4��Mږ%��%�e�֖�7�i��Ř��T��U��슙j�������Q��<Da'�|�z#���6�V����5נ֨{�*&�\-�S��Ĥ֊��|�l�\;��^��N�h� ��
��)�f����~e�4X�	��T�+&�Y߇�j��i�+
ڈ!����l�q)����'
Y#Vi'W�r��ƹ�$��;В���H�T��]�f��R�>� �іa���h5��z�����Rν�*�=��h؍s@�p��Q֜ˉ��͵�8ߝ�ӳh�<%�Tk1u��~��U4��qرv�0�|Ҡ��ϙ�s|X��gMc��I�M��K$*�5Ypޫ�
�o��ԛ�R�!�|R!��@w������u_�����~�_s�r^��Ӯ�š��5}��V�ʛ������IB�"=֯[���o��5k{�e*+�5�#�܉#�37.��=����4I��<���R(��{�c}e��č-9"���g�H9���۹�+NYfŔFwz7-������
>�b]��F����'�<�ZoGI���!��q��}����_���_�:��P%�$�JL+��1
'*b�*�H�J
X��?2|ַ6�x=�-�b�}1���%�44�8��6E�R���i�J���x.Є����V���SH���f�?��o�#g�	%(��i��w��HrZ<����K���aŞB�(���m���	%(��T!��Q���m_!��FD%��e��a�![���$���}��DS�VEK��ɥ@*uE���l��u�,�~��L�y���D�w�BCQP_�%.�A|�R����*ۿ���{�f��?h��9Q���$�4��!��I�G�z����ߺ0�ۦHC����^�UbI9��oN�	�|��H�S�.+���诘�`fbA��b����5�ԁH�(q��u<���?����!c�ۼ�00�t��̶y5A�&6�]�oO/��1�ME�y%k�$�:T�:g槟����;�����J�o���>?�D��,/'ٕ69�z���l��r;4�`��T��{�����'‹�r��2p��gH�f,c����D0�%;⨧~���U0�2S/Z�	7�#oYP0��k(6��s���U��@O����;гm~@V��,p�e3N�5�鄅�e*�3mC��HG}�N2�&�:���@_���)��۝�HS+&X^�w�Z#J�g�L�
>YG�Pb��dX��7m��6�#�"Vq6�y��>���"s�ܬ,9l]�0���|���x��iU]�3�@{��U"H���rd�b�Ou,�Q�pp�/�����谒���J�R׋��o��[j��u�!-{'�)��KuR�I7o���'�\4��E�DD4��La�u
	�����Mf6��f��
�(YX�Fh#;n���&S.ղjr\��ٮ��G���g`��YQ�x��k5��$�F[��ÕDO:
{6U�wtC�j:�SH�qI�4�ki��lV�6�/4)�EyҊc��ݎ�P����_հTRc0���T��pL೩PIb�������dl��W��inp�j��D�c0s�@�8#`�ch�O$��\�����	:�o��_Nh/�$��q��".ax�*��A�Y�s�:S����DͧP(a��FԠA���� �+�q��ϴ�����M��ە�z�%��8
�m5\rb���FɬsU�!�3�Z%��`$��֤,_�٬�Z	����5���Y%��l��|�
@�̾�F����p��s{Bd[Rq̷��Ҭ�LGd�ujF���k6Y�<�a��V�k�����rh��
�	%��Wg��N�K;U G�a�٬R��X_�N�ȃ����w���c+3�G���D���`���#��F�zJ8�2AS�#���Ŭ�+GAq�3��#}�u�8�������	��:� $�n�侌R���bj�Ϭ�-�t4>V�J��Ɖ���eGi�1Gp���&ޖ���M��Ҩ�>o�f�Qp�NWjᑐ�f}�K�zXMS���=��W���o��������
T��0�CSA;
v9�<��h	�k�c�$��&��L���Ў
����Қp/Z:����s��O�~uO��G�̊����&#m�^ݦP�bU����m����|�������$|�2�Q����W���
�Gj-�o�pg�r��بo�E��~����݋E�ϸS(=Xu��X�#fֲ4�*���k�n��$5�f���=뗏�ė�i��|A��ό�&}���h�
m�w�<���c��A��]�>�)I�-�D�t��,Wfƺ}�P���\�VU?���|>��7E�����U2Ҙ���W��j�X����,g4j :o#��>�L3rh3�a3k2s�:��pE	�
n��ԙ�4�l��}���@g�0
�wJZ��� Ќ1rjA�<�6�9���g��f:�[x=A��i�U!�J�
�-�dZ^W�r�,�����MI���H_��ppLZ`��]��n��Dh�U�r`7�	�e��z�޿����o>X�߷���^��@��&�b��������וn�z��+��lG�))AyTPi4�@�V��ثް]
kD`E��t	)cӋ��j=�����h+�ߛM��dw�	6�Cr�2���?��c
C{,�Ӑ�ץ$�n.�����8��j��76��}����~�Í8_�*����xݘHt!b�PVW�|@>�8y>
��س�H�Cछ��.����|��9�= �?����k�$�����8���^�����
�\ �G9%�v��O��;�j��~C-6Z����]��T�6�H�� D��_�ͷ:��x����M���C~�)�L�h��1��5������؀`Vҟd����s���phC��gT�bDR��`
7����Q��h,Pp��F�!סƊ��c]��=�?���E��D{�H����/Eܗ�];��,��ry/a��d:�I��(�!?Oᡁ�(����9��ظ5^7Y�5�k��͈f�����:�i���5�ʔg0����j�ڱ1gkP�w\Nԃ�K��p��R`��c��Hj�5
i��$)5o��n������`J����tp�f�$<��Ϳ]����_�t�|ԤSC����d4:<��_�G��uY���Y�e�l<1*�xpYY�}q;��L���ñ�����gO�W����Ɖ���4�|�˚�)K�����AL|zo���Q���y����i����iF
��QZ�$+K��^���t��'S�����Q]�Y� ��"���NB!JIy��dbث�0�~Q�( Q硇������R����@�;۹�9_�	�.�&��,7�M=���&#F����/�Q��RR���a{���GH��g���NO9ޟ�c;pg��j�G"��qol&Ђ�)�\�?"�#�"]�'\`p���Hl�-��/_�)�|	���@b�Cp� �����V.І:��uQ�3
A�6����Qo��H��	�5xp2r`H���N3����[-�6 >�[�}����D0w��
ߏ0�ƽ$$��`<"�ك �Z*@ ~u1"M1́�)��n{a@<@4�4�7��4�E�c�]ma
���,:�_�x˷>���G�a#\��vg �Rs`W���ρv��o���<_D*!�n]f��L��v*	
��0ڛO�]l�F��C��?p��
������S݉k�x4��~���b~�_���&��T�b��g|]�ā��zzM�2Q�I^I*?U�ƆF�0#���3S`�F{|-u�'7c�����(�H�4�n-�Iݮ���*b��qd�+Q��w�(�^Pm���OM��!F$H�����Ҍi��X2��y{��PoX��{91�޷25c�~�\D�b��T@�o��-*�A��U;M���8�
�����A���RI�2���n�R�
�D�Us�꛰���V#�
��W7�Qւ#�a�6]0�NCӇ���;��_�yY�L�M�;0u��ꢭ�ף}Wk��-�Ʊ�F�wH�D]����F����ID�F����R\;��طI�;�#�]iq���/�%�xN�9�ؕ�@Uð�uWAdg����F��i�
AL��V3%� BU�)mZq�AH�ʶ3����D)A�a�P�g�;�sQA�bB��1WL�T�$�F!��<��?��v�4��~�y�V�{49Z�F�V���,6b(	1����"�!	�^N#��'�);T=�����5WzK5E�h�V_T�;�v��[�w��H��"JQ-�FD�<���E�	��Ja�.ܱ��ѵ*��:��0}��7�>� ĸ7 �0��1�! �]U�*��0h�q��v5q|quDz�yp��ޝO�~<d���[*��L������{��IL)�4ӓ�ݥ�%B�F�U���9��b�m"�O��|���<Sb#�B��c"��S��G��*�I9�F�اʒe���v*a��v��Iݚ�k+�Y������"�V]d�+Dʲ��<kY���f�4G��Yh��ٮ�U)"#�B����f(jy[\�\���iΡ@��.��րPj)M<�9!*%꺫P���}
�,��j�T!h�B�"g��y�_�nK{�Ϛ�t�P�	j�h>U��N�Օ�'Z>tY*��z{�F�ik˳%4���iH��g��i��dZ�$�&V��
�,E���C�4�`QU!�A6Y��@��0Y8�4���	�y��ż.��ֳ�FW]�*�˅n1#��;s�����!���Q��1-$��B��]d\X։�������A������oCR�֤���V�8���na�T��z8��1>�};]��Bt�$q�Wg�����D�&���F
͵���$ɰt����Ӭ�qF�٩���m���o��>հ�4d#��JBr�@�0�}�(q�wc�p�eJQ.��"�nm�J��G�B�j�]�q"f�U�Y;��`��(	+�����t���d��FBb��)!��h�wk}�y��~��P
��<�S�g(�8N�.���C�u�8: G��󱈯C��K�#��۪��Ce�{�Th�-���WKr�^��1My���:��3B�HW�$��~�wY_W�H7�7V�9u�$�/��q���ƀ�ϋ�A�6�u^���5����U�(]v���k�e*��Gy_.���:�*�#zy���l:M�(�<�<֪?�h~����l��dPK^ܙ5��'��\7��T��ަ䵩��;���<$�=��^��S���y#�)�{�9��ӟHkh{�4l6��1�C� |��3x��P������w�2v�R�ێ�=L�Jp�͐�m�VUp�pZ��_j&��_^����5l���w�a5wn8���.�����.�y�(���6��<�6�|s.��v�lo5�xq���S�;s�Ο��u���R�����Cu����
�������Y�br	�����5�M���
�
��,.�w�y�����6��ddI�~��[`�0�h�����&����js%�C�!�������+�5����㐯����~�e�C�{�z�6��`+=s;�����{�n
���/=w�����r��?��އ�t�r<6���6�9�>�
ν�y

.-� B��+���ٍM��w6}�ߗ�n%�ظ�z>�r��7�:���_�?=���^�Õ=�b{�Y^h��u������¼�ۑ�L�!yz!�-�d}ڔ�ъ��H�v�y�
�����c+�ڟ�p�oe�BYhwk���
�[f�-Ʌ���(J�s���W)k%�z\�Hq{d�ˋ'�ԓ ]�i���ݯ�}ۢ��6G�S}��_̳�J!
W
����fs�á�S�g}���dC�8�ݪ��ka���1_T�z���?*�2X휇���8��gQ���X?�$[��ِ��K��J'�}�Д�ĉ*���/gf����>��}%?�v����
0�$�}�:Ȓ���Tư�Io{?�r������s�ի�k��㬖�t��^�l�3ۉ�C�rU���f㺱��z�X��NS�� ��D���J�ޥ��^<}j}�R�E���Ӫ1�91�9��D�-V���8���?d��_em���k�|�3�u���fl{�꩐��Y麶�^dF%�d9΢��Ԉ��ze1n��R.w]n�O����|(�2�l� ����;��c�d��q��t{k �&����GOP��T�ұV �5u��0�_
D衔���]Ő	�)^�R����?;d��z��,E�!�� ^T܄b��?]-�'�v+�2N���!��)"�J�D��z���F�pP|�"-��8����R��0z��3d���*��=�N�F����M��@����B1��KEE�e+r�T���
�/c��E1ʗc��[�?
H	&C�ɼ���Վ;�6X}C�w�$��v+d�����g�a�Z��\n��2+�Ě�v�呃C��.C׊B9���z��B��i�n���!��JU��|#���߯�/��r���G�YR��0�£q�����}�d|�����t����!������=b�n� y+���W���<f6h�w
��^�3�(��B+�3��[#�cĝ�j���B� �+^b?��z�z��	@��3�C�tk4�ߨ^H�_O�w���e�/�:}����DH��IV	�8\�͢Σ4�1Ck���mn��_��RM�lg�5�A���Jc�S�$��x��ґ�-�š;
��_U���5��ӹ�Bu֌D^GX�19��BZ����#v���*&`L�‡�4n�_�|+���[�z��
�mLlor����/�#�����������2��W���;����s���R<����S����a�jl��-<�g���+������rR(h�m�D�è��F�&�7.���N?��s��g)հb��k����lY���Q��,&�*�;V2��.�0a$Oq��`3�.��ڽ�K�f��M�$�#;X�0�H�6C�ڼ��'x�-p��B(a2n�^�|�`�	I�h���-�&�A�[��R<:�&
�뷅�PoQC	q�ެEq/g
�6	��g Z�m&vF^���Ժ���~U��tN���R5<�lXK5��R4{��8�W���x��>�Q�ށ�$����(�E/��K���,}�Y�zGl��E���՟<U9�*���R���A����L��fRN�.1^�7��OQ��w±�:[-*웮�)��_c��=�T���xd
��9���b�����uj���A��j�*�֊(F�Y=i�psvd�U7f<F���pSC�!f
��X��䘑�+�RH��g��t�M�V�<���t��U�
kg+쯰�f)�<ԛ��ww�B�C?
]�zp�u�8�h"s:i�@��`Vʝ��B���*Ѣ��G�%�"v$bS_�:��1���*�.M��,~-�*_�t=��W�2Sq'Jz�M|�4�A�7�R�LB!�ˠ?���S	���n�ɥf�A�Aq�F�Ty��/��}E��9���fBr��Mp�l��h?=���U8����n�����Qٷ�2Y�@��UI�]��ɤJ�$�6c(�M�~��ͅk|xЛ��l9�z3,��\�7o{��X��Ϫ&{�Q�C��.C����F�;x؉?[\�X>x��"�P5M/r
��/�$B�|�7\h��ݮ1��˸�T��+���C!AT�ތ��
�<�	��'��#��G$ $5��
?�t.�i��0��꼴��e�n@��?�fS���Hh!d1l�a1vQ_?ޏ�_Ce��k0��!�%X�֒��<$R�-_�*<L��(s=�&l̕U�ꙣ���DUq�髈�yxC��H{�5��u��d�Jx7`�0��Pz?�y��S��[�Ix{QO	
(�Y�J�
{���(���v5rA��.P[
��hG� @LM����P���gHm(dA?��r{���4�כ'�T
2!��^�>(R<CH�o�w�	Th�T+sԌU�XM�U+|A�*~�WH�0�1�VJ�QuU2�/�k�h|�]*҂��J���;%?o$�H�X&�U:�D���8����k.M�(��XDWMݎ���gJ��j�Q��u0��)�<�:���F2���:�	 "�#�Ռ�4M�p/�l���oGP[�p
�ᨛw���#I2P&��$(R�D O��x���D e�SM2�RJ�+"�Zطg�w�e37�j�)�K=��=��f��L��r�~����ŀ�Qi=qX{�['���2�s�����R�v[jIh���Z�����&�K*P�� huh7����+|Ǔ��(�ePx��N��>=�pp�i�W2�`C8R�(l���݃g�dm�R&?O�y������N�ٓg�3�W��TS����T?�/�e�+�iHl��}�=�0h�w4�r#k�	򗪐��S)�!�h��\�����r�.W�q#Zj*W3����B�ߔF�
��(dU�~aH�l�%���"^���/��p���ЕOxS%���|�Y��RW�� $?��=��<�'�-��z.�sĜ���/��[�9z���v
��sER�;�AU�"��{�e0���z�L���p�Y/�
Ǣ�5�9�;=��g=�%��e?�Um��h���'C�H_'4u�\H>��ﵨK������AM�Ca�k���!Ꮩ��	,��s����$O]����G��SMWEĈ[^������w,���.�Ս�:t^�/0��j|����?ȶqdQG$�F�fCm���P��/��L�}ZE:Oa�v5���ƨ7e�a�1s� �S`���<�F[yLO�i`}:^S�����������t��A�-O�爦�[
�����TN 7�9���y�R�&(ӵ��m=y�!aw���{�y:%�_�\ս���G����<�N���q�}={)5ûGA{�D�����ƴ�}�z/������꼢��ϞE�	��ȭy��
�W~��̣��4����
'�?���6�0������6^�l7�CE�� �WB�(T���%�Dyo5<��3k���e�k�����1��+��.��%%�}B�^5]���{��S|�)��%��F7�a,�	��3覦O�ʌRp��v5�6�\�NK�׵#�����X�a�r�{�K{�Z��IZkE[E~5�o�]�=r�Y]�,xz5�Qz�D�×�
�\�IO��֋�Wܵ⮩��wVXJ�Z���Q�뚷>s
��+��,�$�/�{��E�/��$���u�J�e�%>�ĚY���	m�l���(R��|��_^�Ak�l�Xq��#��Լ�2N9�;�4@�|�U��Tl�� 0�;�Z�d�Tm�F���H_f�_�F�y0��p%��L&��[�N\�	�v�� �"ҙ?�@sfM�����Ǫs���j�y�=?����G��5�V��5��1B]+hYK�F�+�IP!	`��� �r���q�(`ըf��`5iJ�-C�:�S��&#))�[��8���D�����@B���,��1�Tx�D�+oh�*MKw�ciw�~�T�gb���]a�ΙO�X�ߍ:�����9�S�=�6{����W�qh1���=f�R?/6,�B�
�Jy�����"�4�(Q�J�)�kZlB���*��h2iv�}�ĉ�c�Qqcz�$���"3���R��9H ���
�(G��b�F6V:IQ�
�(�ΧT!T�~�!$J=��K���.���tp�񏟾|Gi4O�yU��uti+v��ꐢ�qlb�:)��%B�J�`�4-��b��J|��b�ȩ�����҄��E8r| B�;2��\1s<�}���D��7X�4,�!\��ZQɃ��K��IA�	J)���zr�%x��w���]z������W�YH�d�j6f��ՠ���p�\�R��ii����B3+Q������ ��y��HN&T2	�em�mT�dR
sj4��P4�e)�ٛ`w�ߜj�p�W�J���i`�p�yp�丷�L�Ǎ��$=Z���:�8�̫K�RB�N%���*Aj���䵴ug�GÒ�����^��)�`%�i^̐�J�L9u�k���ȳQI����n�b>u)Y*x��P|t� Q��;T�%2*�"o�Q�2�XC`�t���l: c�2�\��2�l���R�rx�e�c��L%�������0������0c�j�rXI?���1'�� /��ЋQ,�l�T@:h=��n�.՛�X�rhK�}�BaV�R�&bLJ2�uL?͏�C��FH�@j��(o�Q�^�Ř����h��]=�-�
6!7<��{Y�)&p���Qf_�ES��l�
�/!�^aYNP%2���$�j3�Z%|D��xLucn�����	B��	J��	��z䑻��50.Ȫ����{X��^�B<�������)@2
�^ny�5������1B���8
H�>�h�D1]X��t:�$�X���}��8��T�x�23��jcq3K<�+����\5�Jw�6�0���e>3^�1{��-r�B�]���_
��Գ)]* �V�l�\�(#,��y���IyF}��t���ր��� ����{�ˊi�Y����/����PZؘ�t]q��K����B@H��
�T(��P)]�^$�e�-O�Z��\7湸U��W5ʰ�I�7�_��,w�'�ߐx��I����_}�ISN{bU��Z�jצ��&�S��>O����
�n�����0�u+>���#������ckXy�����*��	Y	
*zY�2L,l\<|B"bR2�XJ��T�4�t��@&fpKFG Qh�'I�t*�B��L�Od���H,���
���������N����
�9��m���R6TK+k��pS�X�c�%[�\y��r�w�S�P:�d;�T%hJ�)W��JLU�ը*�ڠ��Z�jӮC�.�z�����E=b�єjF7����?�M[����PطC?t��{'NY}̽�����Wc�o��n�(mm�T���B�"��c�D�;9�b��z&fV6�������a9^%YQ5݀I���Q��Y^�Uݴ]?�Ӽ��~�0�b8AR4�r� J��j�aZ��z~Fq�fyQVP���f�����h<����j���x:_��;��|�?�Q)�a9^h�ڝn�?�Ɠ�l�X�֛�n8�Η�
�����nD�h,����d� �t&�;��O�L�xʖʕj��h����A"�b���f9�Xo��0�fw8-���1X�@$�)T�L�bs�<�@(K�2�B�Rk�:��h2[�6��	�@ap��`qx�D�Pit���py|�P$�He"��ʩ��������o`hdl�Qk@W���i��
Od���E�4q�XZY� Qh�'Id
��ݦ�L����B�X"���T�5Z��%�)�b�Ƕ�T���E����z��N����Kn�Q�0堔I7۱Hn=b*��櫦���A�F���:s�¥+��5n_��<z�2�+}��STM7`�e;��a'i�g��<}����u�&�W�1&�o+�2��C�<0'di!�೧C��L�Z3��`xj|�d��e1Y��Q�0ݘ ���9I3��>p�Eh�]�l��ۘ)�8�X,k�����V��.�>[��7�ԥ���^=�s'$e�P�(O�!|y\䖑��;���X�_�,��b��t5�H9����Q�B�q����벴WP�zr̄�BU��x�`8�U,��k"��mͺ�we�2m�����S��&��F�ww�F&�Djj��&�Ʉ��t�<��M�6k�fW�]v�Y�8��獹�}sݧ�s�oR}���;�l4/E�}��U��!�L�G��ò�?�aw�
B�-kmT_��-�:E���
�SƅT���U����.����o���E��5Y���!��~Zڧ�ϻ��!��sF����q�l�A�e\H�..mrK�$~���J/;i�-~>�g��5ʹ�q���s������N�f����ӯ���u��f��"���/�t�0�C�E^	EO'���i�m���a�q!�6��->����q�l�A�e\H���ea�q!�6��-=����q�l�.g�o�BH)��RJ)��R*��RJ)��v��o�x��ǯ��Wm�;�n�����ެ	PƅTڸ^�� L�2.����u�(�B*m\/[� L�2.�����a�q!�6�����0Q���2.�����NH�z�"P�Mn�A@���%�U��(�B�˖���^�� L�2.�q�lyH���_=�{��_t��?���_s��0�.Ʒ��-z�&|rI/"L8�xA�dE�ҫa�Q��$+��^��2^%YQ��0�(�Q�UK���2^%YQ��Z|M�Y-_�ɁI��Z��C��&�p!U�5�_J�6W�w���������g�q��8���R!��H�#��}O
��H-�j��wh�-��6�iU�U&�QA���: �nSL����}��4�1J�q�ʸ�k�'�Y߆,ϼ*i�Jll��R2OmG�'��殦��0�p��8���
��ߪO���Gv�.�5V5�R㢱H�[�8�܄p�N�@Y�%�@�
k��|r��-�w�m��x�[|CQ�P�8��@K�B5H!�Z�FY�G�E;���=O�).a����W�Ә���’c�`��U�*룦�>���3�����p����.p�Lu(�Y���V��`?��N���P+�ӹ��g����{��ˤ���bWݠ���[	unK�¾�4�9V:�����H3J��H̢b�X�-� �A0̢b�X�-� ����K��{���f1׹����]��
����'t�E��Ё�=�Z*�Y{$Cߘ�&�C+z&A���ҩ���i���ơ��q�=�G�c6�0)�0�;.l侦��)z�(:B�k�I5���W2')���ARΘN���m%���HhI15�Q�������m�#��Ј~*�O��K��d��T4�hƿ�(6kS�׋�w��/p��ܹ�Xn,۝Nw���bi�9&����w�'˓˜X&٠��Qƙ�Ռ�9n��c��{�%��I5I�!ыQ��FԷ����Ωa�㭃��$
Ͷ{��?�s�Տk����5^���,3�&d�ㆶ�J2�Ǯ�?|����[�W�I!%�~Φ�>1'��>(B��n}�\f|�����2fonts/raleway/Raleway-Regular.ttf000064400000501774151215013470013100 0ustar00 FFTM������GDEF2�,��t�GPOS�JJo����GSUB����OS/2��gX�`cmap^-R���cvt ��)��fpgm��Z��gasp�lglyf��'2�!head��,6hhea��d$hmtx&���loca�'�*@\maxp�\� nameA�MS�4posta�1�a�#�prepO(�(��{�_<����^#�+tv�(� u��?�(�M--in/��QO��XK�X^27��P [NONE�
����� �� 
`2M��\$E�%k&�(�/�E
, A>�4�P�A�A\d7�.	,&"!#[4"Q2J$�A�F�!�D�7�"E/��Y�*�YaYMY�*�Y�Y��YGYmYY�*nY�*�Y_ b�O�
x�uX82+�A�1!!iK%'n(K'Jj(GK�K�KN�KGKS'iKi(_K� ORF-��5�V2�B��[1+�45��W�/I=@0�0=)FI:A@0�6
2�H�$�#�1lRZ"�A#"�,=?"'"�#�!����������*aYaYaYaY��Y���"Y�*�*�*�*�*�@�*�O�O�O�O�[Y'K!!!!!!!!!!!!�!%'K'K'K'K'��K���Z*GKS'S'S'S'S'CS'RFRFRFRF[K�!!�!!�!!�*%'�*%'�*%'�*%'�Yn(�"n(aYK'aYK'aYK'aYK'aYK'�*j(�*j(�*j(�*j(�YGK�,G�������������!��Y�K�Y�K����YKKGYNGYNGYNGY:NN$
YGKYGKYGKG���YGK�*S'�*S'�*S'�*
'�Y_K�Y_I�Y_K_ � _ � _ � _ � bObO�!Q�ORF�ORF�ORF�ORF�ORF�ORF-��u�u�u���*S'�ORF?Y�YY((Y'Y�N�Y�Y(K�*j(�*S'1Y�YY(�*i'�!!����!�*S'�!!�!!aYK'aYK'��������*S'�*S'�Y_/�Y_K�ORF�ORF_ � bO�*S'�*S'�*S'���K�E�E�"�1�#�#J*J*�W�6�E�E�W+�2�#�5�,F+11*:6+2=�#+*%+"22=9#5+62��-XKMaYaY�Y�*_ �Y���&�Y�zY�]h�Y��Y�YY�&aY�!-�]�]zY�&mY�Y�*�YnY�*bh+*x�Y�E�Y�Y�SYbY�0�Y}A!!`;J�JDK'&�RJRJJ9�JGJS'8JiK%'��'�CJ:J7JM�J�J-&
K$K'K'9�J.'� �K��"+JIJRJ5J����&�*R'�
)�]RJ{!hSaCY�J���zY�J�&!-��YJkY"K����CYbJ�YJ8Y\JS43;�*%'b��
+ �r��E:�E:�YGKc�c��Y�&cS�J�&9�YGJ�YGJ�E�:mY�J�K�!!�!!����!aYK'�K�K�&!-�4-���]RJ�]RJ�*S'�*R'�*R'�0-&hhh�E:Y�JSY�J"�����)�#�&9�*i(-�TKC�YGK��8���&9�*%'�Yn(�Yn(aYK'aYK'aYK'�*j(�YGK�YGK��GYNGYmY�KYGKYGKYGK�*S'�*S'�*S'�*S'�Y_K�Y_��_ � _ � _ � _ � _ � bObO�ORF�ORF---�u�OwK�!!�!!�!!�!!�!!�!!�!!�!!�!!�!!�!!�!!aYK'aYK'aYK'aYK'aYK'aYK'aYK'aYK'�3�
�Y�K�*S'�*S'�*S'�*S'�*S'�*S'�*S'�*S'�*S'�*S'�*S'�*S'�ORF�ORF�ORF�ORF�ORF�ORF�ORF����C����d�A�A:A�A�A�@�@�P<@7@WP�'�)_V�A*.�E�E`)`?��(�&�v�(c�&� �&"�$�#�v�(c�&�!'(d�1K%�Y^)n)!!�_n�*>7�*b�+N"�O;5HtY�6�>�-[+0"�#8"�#�S6S'f� DL���A��-,	�A�S�>�A��9F�G�1+#&�*�K!l(j(�K�Qi(<NF=p'JCTS,mTTTk,�T�T�2T�T�T�T�,T�,:T
$�KL�)
2(%��)(MY!-�*!-�*;N:j(&�RFRFRFKGK�KgF�F�DF|�J%'�%'Y)�0�*E/H09,([4	Q2[,�&"�$�#�v�(c�&�!�&"�$�#�v�(c�&�!�&"�$�#�v�(c�&� �A1$+�;����2+*+X��/& �����d
~~��������-37Y����$(.15����_cku�)/	!%+/7;IS[io{������       " & 0 3 : D p y � � � � � � � � � �!!! !"!&!.!T!^""""""""+"H"`"e%�����
 ����������*07Y����#&.15����bjr�$. $*.6:BLZ^lx������         & 0 2 9 D p t � � � � � � � � � �!!! !"!&!.!S![""""""""+"H"`"d%��������������������l�j�e�a�S�Q�N�-�����������������������|��
�����������������~�x�t�����������z�x�r�p�n�f�b�Z�X�U�O�N�F�C�?�>�<�;�:�7�.�-�(��������������������������u�s�j�i�f�_�;�5��������s�W�@�=�����
	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abc��������������������������������Ztfgk\z�rm�xl����u��iy�����n~����ep�D��o]d���QRWXTU���<c|ab��[{VY^������������������s���|���@J������������~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSQPONMLKJIHGF(
	,�
C#Ce
-,�
C#C-,�C�Ce
-,�O+ �@QX!KRXED!!Y#!�@�%E�%Ead�cRXED!!YY-,�C�C-,KS#KQZX E�`D!!Y-,KTX E�`D!!Y-,KS#KQZX8!!Y-,KTX8!!Y-,�CTX�F+!!!!Y-,�CTX�G+!!!Y-,�CTX�H+!!!!Y-,�CTX�I+!!!Y-,# �P��d�%TX�@�%TX�C�Y�O+Y#�b+#!#XeY-,�!T`C-,�!T`C-, G�C �b�cW#�b�cWZX� `fYH-,�%�%�%S�5#x�%�%`� c  �%#bPX�!�`#  �%#bRX#!�a�!#! YY���`� c#!-,�B�#�Q�@�SZX�� �TX�C`BY�$�QX� �@�TX�C`B�$�TX� C`BKKRX�C`BY�@���TX�C`BY�@��c��TX�C`BY�@c��TX�C`BY�&�QX�@c��TX�@C`BY�@c��TX��C`BY�(�QX�@c��TX��C`BYYYYYYY�CTX@
@@	@
�CTX�@�	�
��CRX�@���	@��CRX�@��	@���CRX�@��	@�@�	YYY�@���U�@c��UZX�
�
YYYBBBBB-,E�N+#�O+ �@QX!KQX�%E�N+`Y#KQX�%E d�c�@SX�N+`!Y!YYD-, �P X#e#Y��pE�CK�CQZX�@�O+Y#�a&`+�X�C�Y#XeY#:-,�%Ic#F`�O+#�%�%I�%cV `�b`+�% F�F`� ca:-,��%�%>>��
#eB�#B�%�%??��#eB�#B��CTXE#E i�c#b  �@PXgfYa� c�@#a�#B�B!!Y-, E�N+D-,KQ�@O+P[X E�N+ ��D �@&aca�N+D!#!�E�N+ �#DDY-,KQ�@O+P[XE ��@ac`#!EY�N+D-,#E �E#a d�@Q�% �S#�@QZZ�@O+TZX�d#d#SX�@@�a ca cY�Yc�N+`D-,-,-,�
C#Ce
-,�
C#C-,�%cf�%� b`#b-,�%c� `f�%� b`#b-,�%cg�%� b`#b-,�%cf� `�%� b`#b-,#J�N+-,#J�N+-,#�J#Ed�%d�%ad�CRX! dY�N+#�PXeY-,#�J#Ed�%d�%ad�CRX! dY�N+#�PXeY-, �%J�N+�;-, �%J�N+�;-,�%�%��g+�;-,�%�%��h+�;-,�%F�%F`�%.�%�%�& �PX!�j�lY+�%F�%F`a��b � #:# #:-,�%G�%G`�%G��ca�%�%Ic#�%J��c Xb!Y�&F`�F�F`� ca-,�&�%�%�&�n+ � #:# #:-,# �TX!�%�N+��P `Y `` �QX!! �QX! fa�@#a�%P�%�%PZX �%a�SX!�Y!Y�TX fae#!!!�YYY�N+-,�%�%J�SX���#��Y�%F fa �&�&I�&�&�p+#ae� ` fa� ae-,�%F � �PX!�N+E#!Yae�%;-,�& �b �c�#a �]`+�%�� 9�X�]�&cV`+#!  F �N+#a#! � I�N+Y;-,�]�	%cV`+�%�%�&�m+�]%`+�%�%�%�%�o+�]�&cV`+ �RX�P+�%�%�%�%�%�q+�8�R�%�RZX�%�%I�%�%I` �@RX!�RX �TX�%�%�%�%I�8�%�%�%�%I�8YYYYY!!!!!-,�]�%cV`+�%�%�%�%�%�%�	%�%�n+�8�%�%�&�m+�%�%�&�m+�P+�%�%�%�q+�%�%�%�8 �%�%�%�q+`�%�%�%e�8�%�%` �@SX!�@a#�@a#���PX�@`#�@`#YY�%�%�&�8�%�%��8 �RX�%�%I�%�%I` �@RX!�RX�%�%�%�%�%�%I�8�%�%�%�%�
%�
%�%�q+�8�%�%�%�%�%�q+�8�%�%����8YYY!!!!!!!!-,�%�%��%�%� �PX!�e�hY+d�%�%�%�%I  c�% cQ�%T[X!!#! c�% ca �S+�c�%�%��%�&J�PXeY�& F#F�& F#F��#H�#H �#H�#H �#H�#H#�#8�	#8��Y-,#
�c#�c`d�@cPX�8<Y-,�%�	%�	%�&�v+#�TXY�%�&�w+�%�&�%�&�v+�TXY�w+-,�%�
%�
%�&�v+��TXY�%�&�w+�%�&�%�&�v+�w+-,�%�
%�
%�&�v+���%�&�w+�%�&�%�&�v+�TXY�w+-,�%�%�%�	&�v+�&�&�%�&�w+�%�&�%�&�v+�w+-,�%�%J�%�%J�%�&J�&�&J�&c��ca-,�]%`+�&�&�
%9�%9�
%�
%�	%�|+�P�%�%�
%�|+�PTX�%�%��%�%�
%�	%��%�%�%�%��%�%�%����v+�%�%�%�
%�w+�
%�%�%����v+�%�%�
%�%�w+Y�
%F�
%F`�%F�%F`�%�%�%�%�& �PX!�j�lY+�%�%�	%�	%�	& �PX!�j�lY+#�
%F�
%F`a� c#�%F�%F`a� c�%TXY�
& �%:�&�&�& �:�&TXY�& �%:��# #:-,#�TX�@�@�Y��TX�@�@�Y�}+-,��
��TX�@�@�Y�}+-,�TX�@�@�Y
�}+-,�&�&
�&�&
�}+-, F#F�
C�C�c#ba-,�	+�%.�%}Ű%�%�% �PX!�j�lY+�%�%�% �PX!�j�lY+�%�%�%�
%�o+�%�%�& �PX!�f�hY+�%�%�& �PX!�f�hY+TX}�%�%Ű%�%Ű&!�&!�&�%�%�&�o+Y�CTX}�%��+�%��+  ia�C#a�`` ia� a �&�&��8��a iaa�8!!!!Y-,KR�CSZX# <<!!Y-,#�%�%SX �%X<9Y�`���Y!!!-,�%G�%GT�  �`� �a��+-,�%G�%GT# �a# �&  �`�&��+����+-,�CTX�KS�&KQZX
8
!!Y!!!!Y-,��+X�KS�&KQZX
8
!!Y!!!!Y-, �CT�#�h#x!�C�^#y!�C#�  \X!!!��MY�� � �#�cVX�cVX!!!��0Y!Y��b \X!!!��Y#��b \X!!!��Y��a���#!-, �CT�#��#x!�C�w#y!�C��  \X!!!�gY�� � �#�cVX�cVX�&�[�&�&�&!!!!�8�#Y!Y�&#��b \X�\�Z#!#!�Y���b \X!!#!�Y�&�a���#!-@�?4>U>U=(�<(�;'�:'�9'�8&�7%�6%�5$�4$d3#�2#�1"�0"�/!�. �-�,�+�*�)�!� �����@�[@�[@�[@�[@�ZKUKUYY
KUKUYY2UK
UKU2UYp
YY?_����Y?O_�	dUdUYY_�@@���T+K��RK�	P[���%S���@QZ���UZ[X��Y���BK��SX�BY�CQX��YBs++++s+s++s+++++++++++++++++++++++++++++++++++++++++++++++�
�;�������+���
��'%(����J�222222Pj�6�0Rv�����Jx�:|��V���:�$b��"Hh���		<	T	~	�	�

d
�
�B`���$:Rl|��
@
|
�R���,Tx��6���Dx��4f���88R�d��DL�$Rfv��"J���"dt|�� ���� 2DX�������0j|�����"4FXj��&6H\��
.@P`p���(8Jp���   & p � � � � � � � �!!!&!8!J!\!n!�!�!�"0"B"R"d"v"�"�"�"�"�"�"�"�###0#B#V#h#z#�#�#�$
$$,$<$N$^$j$|$�$�$�$�$�$�$�%%(%:%L%`%t%�%�%�%�%�&&&0&D&X&j&|&�&�'''.'@'R'd'v'�(H(Z(l(�(�(�(�(�(�(�(�)))&)6)B)N)`)l)�)�)�)�***&*8*L*`*r*�*�*�*�*�*�*�*�+++,+>+P+`+�+�,,,0,D,�,�-~-�-�-�-�-�-�-�-�-�....&.8.J.�.�.�.�///(/:/L/\/n/�/�/�/�/�/�/�/�00 020D0V0h0x0�0�0�0�0�0�0�11*1D1\1t1�1�1�1�1�242<2D2L2`2�2�2�2�2�2�2�2�3
333"3*3^3f3z3�3�3�3�44$4<4f4�4�4�4�55$5H5X5p5�5�5�5�66666�6�7777b7t7�7�7�7�7�8.8r8�8�8�8�8�99:9B9X9�9�9�:&:H:Z:�:�:�:�:�:�:�:�:�;&;x;�;�;�;�<"<X<�<�==`=�=�=�>6>L>�>�>�??2?B?h?�?�?�?�?�@@@(@Z@�@�@�AA*ATA�A�A�B6B�B�B�B�C*C<C�C�C�C�C�C�D*DfDxD�D�D�D�E6EnE�E�E�E�FFF.FjF�F�G<GVGnG�G�G�H:H�H�I(I4IlI�I�JJ:JnJ�J�J�J�K&KTK�K�L\L�MMPMdMxM�M�M�M�N6NpN�N�N�N�OO>OlOtO�P>P�QQ"Q4QFQ�Q�Q�Q�RRR$R8RpR�R�R�R�R�R�SSS S(S:SJSRSZSlS~S�S�S�S�T
THTZTjT|T�T�T�UUPUbUtU�U�U�U�U�U�U�VVV&V8VJV\VnV�V�W*WpW�W�X.X�X�X�X�X�X�X�X�X�X�YYY Y4YHY^YtY�Y�Y�Y�Y�Y�ZZ$Z:ZPZbZrZ~Z�Z�Z�Z�Z�Z�[[[,[8[L[^[p[�[�[�[�[�[�\
\"\:\R\j\�\�\�\�\�\�\�]
]]6]N]f]~]�]�]�]�]�^^^6^P^h^z^�^�^�^�^�^�^�__ _2_�_�_�_�_�_�```,`@`T`h`|`�`�`�`�`�`�aa&a:aNada�a�a�a�a�a�a�bbb(b<bPbdbxb�b�b�b�b�b�cc$c8cJcZcnc�c�c�c�c�c�c�dd2dDdVdhdzd�d�d�d�d�d�d�ee e0eBeTefexe�e�e�e�e�e�e�fff(f:fJf\flflflflflflflflftf�f�f�f�f�f�f�gg$gHghg�g�g�h�h�h�h�h�h�i>ifi�i�jjtj�j�k(khk�k�l"lnl�l�m0m�m�n"nVn�oXo�ppJptp�qqxq�q�r8rnr�r�s6s�s�t$ttt�t�u`upu�u�u�u�vBvfv�v�v�v�v�ww�w�xx6x\x�x�x�yyZy�zz�{2{\{�{�||`|�|�|�}4}V}�}�}�~d~�~�$Pr�����,�P�d�������f�����6�P�����Ƃ��0���������������N�V��������$�,�4�t����L������������T���Ĉ�D���ވ��f���‰ʉ҉ډ����
�H�r�����"�f���ʌ,�v���ލ�j���֎&�<������.�V�x�����Ώ����$�0�<�H�T�`�l��2.�%#!"&543!24#!"3!27.!�@�4��

a�i4�
���8��
��i\��@
rr++23/017353\DDD���ppE
����?3�20153353E;$;
����%��?@		?3?399//333333333301#3##7##7#537#537337337#��/��2:3�2:3q~/��1:2�1:2t�/�/��6����6�3������&��C/>@@ .26:!
::++!!	?3/33332?3/33333901%#773.#"#".'732654.'.54>32!..&*..�)1: ]W*WEKo;%E^86fY(#5AK(U_/`GJe4AsI/QE��|�}�cG=*0,K@1H0-#9#>=,5"*E9B[/$(����/?E)@@EE8((0 	rCBBr+22/32/3+22/32/301".54>32'2>54.#"".54>32'2>54.#"		�)D))D))D((D)--,-j)D((D)*D((D*----�M#����&B'(B&&B'(B&'00//�&B((A&&A((A'(/00/T[����/����<@,;	$	r3	r?+2+2901!.54>3232>53#".54>7>54&#";��+4/Q2/K,3Q1)E(2M)6[D%:0UsC>h=3Q-.G(:-!4.+�u.A5,F*#?*-G=9@),=1Wp?L�d91V:6QA35'2.%7-�eE	����?�0153E;	��,�����
//01467.,R:4-'D;3*?#Zf�bXeh0N�[?�� �����//01'>54.'7�"@*2;D(,5:QZ?��?[�N0heXb�>� @
		�?�2923017'7'37'W+DE)ED, *+">$II$>AA4�k�	/3333301##5#5353k|?||?8��8��P���b��/�99017#53VBQT__TA�e0�/20175!A$�??A|b
�r+201353A;bb@��rr++01	#@�(M��:�7��-U�r
r+2+201#".54>324.#"32>-ArHHqBBqHHrAE.R66R//R66R.%X�NN�XX�OO�XGl==lGGl<=k.�;@
rr+23+22/301%!53#52>73����&1062"F>>>�B"�,�E)@
r'r+2+2990134>7>54.#"'>32!,"B6>7!;, 4(	+#7K-=W.#7;/@&f"ED?#-0	/"+H*);+,-+>&�m�@.@'r/3+29/3301%#"&'732654&+532654.#"'>32W-@$:hELr/V@JW[TMR&A*9W,@V1>^6 ;�2L0<\2=6++5IDDQ:H8)63-*#4-P6(D.��;

@
		r/+9/9333015!533#%!d��c.XX���<�6>��_#�k�;"@
r/2+29/301"&'732>54.#"#!!>32Kz-a:2O/-M0.T?OW��1L,Ai>Cp�K="1<,N31K*)'�?�:fBFj;4��/�.@'
r/3+9/3301%4.#"4>327.#"32>".54>32/AoD-O:1X;8[,pGNvBBsJGrC�3T32U32T33T�Cm@ :'b�J=3(=G^��\�GBou2T23S22T22T2"��
G�r+2/01!5!#����N?�:2���!3C@''88@0
r+2/39/39901%#".54>7.54>324.#"32>32>54.#"EqCGn?+A"6 '@O('OA'!6 'A'E5? +Q34? +Q4��/H"$G/,G(&G+�>\39^:-I2
+:#,C/.C,#;+

5H($7&%C.#6'%Dp&77'&67$�f;.@
'r/3+29/30132>7#"&'32>54.#"72#".54>$ApC.N<1W<7\,qFNvBAsKFsC�2U22T32U33TGCm@ ;&b�J>2(=G^��]�GBnt2T22T22T23S2A{�
rr+2+2015353A:::�bb�\bbF���
@
	?3?3/3301537#53F:4B�bb�T__T!���@	/3/3901%
%!���@�]�I��K�D�rf�/3�20175!%5!D.��.�11s117���@	/3/3901%5-5�]@����K��I�"��$(@
&&%
r+2?33/0174>7>54.#"'>3253�%1+'>##?0/AR+%F7!'0*9;�,?.#3$,9.):0G1(7'
 70�kk/�n
[Uh)@^'1
fEL '�;/2�2|/3�22/339/3012#".'#"&54>324.#"'>3232>54.#"3267#".54>>=.#"326�J�e:6(!#
Y5GO8U,,C61'H$R.8A 
)	1ZxFEx\41YxF*J%
(U*K�d9=h��	
C0#?'02[7e�U:B;&**L:3:0H)'$=H$�.*@FI}^52[}IG|^5 8e�QU�b5��
!&()$*
��
D@'	
		
	

rr++29/33399<<<<013#'!#5;'J\��[KՏ��:��_��Yo�&@rr+2+29/3901%#!!24.#!!2>32>54.#o6[6��V2I'60=GF 7#��	$:#�v�#6 4!�5S/�5S-5Zb5$=&��&=�%<"$;$*����$@ 	r	
r+2�2+2�2014>32.#"32>7#".*-V~P_� 7FO'@bC"(Ha9(TI:\q6IzY0hA}g=WD"/73Ui6;lS1:.5J&?i�Y��
@	rr++2301332#4.+32>Y�q�LS�h?xW��Xx>�_�bl�XdU�K��N�Y6�@


rr++29/3301%!!!!!6�#�r[��>>�>�;��Y+�	@rr++29/3013!!!!Y�tN���>��:��*���� &@#""
%r
r	r+++39/3201".54>32.#"3267#53#vGzZ11XxGi�"6"rF;_D#(Ja8At5eZ��;=h�DH�d:VE$B>2Tj9<kS/ADJz,6��Y��@
	rr++9/32301#!#3!�E�[FF��:L����<Y���rr++0133YF�:�����
r	r++301732>53#"&'"E-4@"F.\L1L Y#GjGw��P�`4Y��@
	rr+2+2901333	#YF�M��1O���d���rd��Y9��rr++30133!YF��x>Y�@	rr+2+2901!##3	3��,��FHGB�?�����:Y��	@r	r+2+29901#33#�F:�FAE����O�;*����'@	#
r	r++2301".54>3232>54.#"wKzX02[zGKzW02Zz��&Fa:=aE$&G`:<aE%<g�DG�e;>h�CG�e:h:kS13Uj7:jT02UjYR�
@rr++29/3013!2+32>54.+Y&.M8 3\>��*>"(A'��&AO):g@��D.J+,J+*����'+@

*r
r	r+++3301".54>32'2>54.#"73#wKzX02[zGKzW02ZzG=aE$&G`:<aE%&FazE�E=f�DG�e;>h�CG�e:?3Uj7:kS13Uj7:kS1��Yg�@
r
r+2+29/33013!2##32>54.+Y,.L9'G0�O���*>"'A(��&AO)3Z>
����D.K*+I- ��=�2@*".r	r+2+29901.#"#".'732654.'.54>32�(29 ]W)XDLn<&D^87eZ'#5AK(U_0`FJf3ArJ/QEAG=*0,K@1H0-#9#>=,5"*E9B[/$Q�@	rr++2301###5!Q�F�@��x�>O����@	
r	r++3201".5332>53zTtDE4XBDY3F Gr<e�Df��7jT13Ti6f��G�b:
��@	rr++29013#V��I��@����o�:��$@
r

r+2+2/2/29013733##3dBdeC|�L��>��=��K�������u�:_����As�@
	r	r+2+29013	##	U��O��O��P����5����+��^h{�@rr++29013#]��L��F����~�B��
�S�	@	rr+23+23017!5!!!�%,�#��7Q>7��>X�����//32013#3Xw77(9�f9��rr++01#i�L�L�:�2�����//320153#53288x(9�9��+/���r+2�2013#+�:�<��/��iW��A����/3015!A}>>>1l����/�90131G<,�]!���'8+@!66$/$r
rr+223+2+9/3330174>3254&#"'>32'./#".%>=.#"326!8cA&R NE*Q,3b3`p
#p:2Q-]"I%IZ:'1U�1G',BN0##na�
6&-1+I
L
:23!&K��A�'@rr
rr+2+++201"&'#3>32'2>54.#"J=h=D#bA7W> %DYE*H4/S8(E5"38
?0e��5A.Ma37`K+<"<K(7a;$;#�/"'�� @		rr++2301".54>32.#"32>7-9_G'BvMIpBO04V34V4"?/CAW
+Lb7JzHC9(-6^<;`9)%;!(��7�/@+!
rrrr++++332014>323'.=#".5.#"32>(=lEAgD j96[C%�
:I$*D16F)83"J{JE1>�x
6 33<,La�$;##<L(*L; #0'��-%!@i"	rr+2+29/]3901".54>32!3267!.#",8`F'CvKMsB�B5U23[;BY��5U33T5
+Kb8IzIJyH8W34*%<!'9V11Wk�@
	r
r++2|?333013#5354>32.#"3#dHH%E/:
*/3���6@\11JF6�-(�!"6!@#-
rr
rr++++33301".54>3253#"&'732>='2>75.#"5ZA$#AX6Cc"=EuEYn#*g:3U3h&90 8G&,E/5G,K`37aL+D2m��Hc2@6!10%J8g1;9%.�&;!%=L&*K; K�@	rr
r+2++29901!#4&#"#3>32D>:&K9DDo?-?'#XY'C+����:E =Q3K���
??�2013353KDDD	��vdd���K���
r/2+�201"&'732>5353!;!'*D,F.D�.
+$��.H(+ddK	�@
	rr
r+2++901!#33��oDD'K��h����N����rr++20133267#"&5ND$
7.7��'7
6/KR$%@rr

r+22++293301!#4&#"#4&#"#3>32>32RD:9;]D8::^D>!g?AP	$e@,=%#[VTB��#\URC��	v=BJ<BD ;S3K@	rr
r+2++29901!#4&#"#3>32D6:(N;
D>DV.+<$#\U'C+��	v&9  ;S3'��,#@	 
rr++2301".54>3232>54.#")8_E&&F_88^F&&E_�3V44V44V44U4
+Ka68aK++Ka86aK+:_78a9:`8:_K�+A'"@$#rrrr+2+++2901"&'#3>32'2>54.#"UAgD=h;6ZB%;jZ+D16F)83"6G
D2���e1=-La4I{J<#<K(*L:"%.�%;#(�+&"@rr

rr+2+29++01".54>3253#'2>75.#"5W>"&C[4=g=DMd)C3"2:+E41T
,La57aK+?0f�"Av<!8"�1'$<L'8`9KO@
r
r++?33301#3>762ODgD@Y2
�H?��	}7D ���+@
rr+2+29901"&'732654.'.54>32.#"�@n(,Y2=L%E06I%3Y7<\!M/ :%8);X0n
*+0)%1.!!3)3C#&". '"!4/IR��E�@

rr+2+2�3301%#".5#53533#3267E"03HHDxx%.-!u6��6��F��	@
r
rr+2+2+299017332>73#./#"&FD=<(K:D"uDRT�2��YX#A+H�I
6F<Dr	@	r
r++2901333��G��C�	�;��	 @	

r
r+2+2229013##37'373�C�;ml;�B�`X=BC<W`	����	�=�ש����	@

r
r+2+2901?3#/#[��M��M��M��	�������� 
	@	
r+2?399017>733&'i�H��D��)	
�DB	�=�`!�		@	
rr+23+23017!5!!!]�����Z�W.�3.�X35�����//33013#"&54&'52>546;�7^^���$
%��9
!49V�~��//013V;���w2�����//33015323+53467.52^^7

�9��4!��
9%
$B��X�
�	/33�220174>3232>53#".#"B(43
++!!7/
� &%[����
�
?/�201#7#5�DDD���pp+��
�)'@%%

$$?3/333?3/333015.54>753.'>7#3U?"9hH%JeAH+<0CHT%�*J/'=*xo0L[0DwNttA8)(�_(*:nz1X<�&;G4����:'@%::(77,3	rr+2+29/3232/3301!!>54.54>32.#">323267#".#"4P��.6'1R26a(N) 5'.&$.,*946:t6��.G? -IBD&/N.81*)1 5!!?@K/!?B*				4


5}�'"2�'//3/301>327'#"&''7&5467'732>54.#"�9!!9F"HIJ:!!:GG$F!;!8""8!!8"!9!�G!H99HEEG2=9G!�%<#$>$&<##>��.@

r
?+29/93�22333013#3##5#535'#5333�To!��F��pV�L��Mn060��040X��~W�~��//9/�01##�<<<�i��i�/����?R!@F=I@MP8 
1'r/3+2901%#".'732>54.'.5467.54>32.#"2%>54.#"&'�&<F""=1(-%I*!=(&;8Y29Z0%:-!6*2!<&K9$G;"��2;7
*>.�5&-C,!*#!2#'%%G3->(3M+"
1"9,&:+2|%*'&+%��=y��0���'L@
:2
rD(`	r+2�2+2�201".54>32'2>54.#"7".54>32.#"32>7�O�c77c�OO�d77d�OFwZ32YxGFxY11YxN.TA'8V:BgB
-0(<'/94,
B
4P6b�NM�a66a�MN�b6%/VvHEwX11XuFEuY1]!=U5*SD)963= *@,"6&0Zy�#2+@*-!')$�@�?3�29/93332/301"&5463254&#"'632#./'2676=.#"�1ETA:+2-8FEFP	
	I!80-9-Z?/0=+2%.ID�
4"-4	%()B��
$@
	/333/3933017'?')���������;��;�%�;��;�I~l
�/�301#5!5<��l�>A��0�/20175!A��??0���&6?%@?0446>'
r26`	r+2�2+2�29/3301".54>32'2>54.#"32#'##72654&+�P�c77c�PO�d77d�O\�W1YwGGwY11XxR�(<#.o:ju5�(+1&�6b�NM�a66a�MN�b6$R�`EvX11XuEEwX2'*B# 9(����8(*5���6�W��2.���	r+2�2014632#"&7327>54&'.#"21"#00#"14



	�#//#$01A

		H=�@	/3�2/3333/0175!##5#5353HC�?��?=99L9��9��$�]+"@B D?2�29014>7>54&#"'>323$7+@+33!2"
'F0II,0,,��4E.%+!D3*)*+#�_+,@
&BD?2�29/3301"&'732654&+532654&#"'>32�>U!8$1DRC?H?+)=-: ,E)/,.8-I�0)#' #')" !'"2"-	9&"2��1l���R�,(	!@ 	rrr+2+2+299/01332>733#.=#".'#RD=>'K:D>N*2 
D	��YX#A+H�O< B#;"&��"��-�#@

r+233/39/3330146;####.7%#3"���F<J;Pu?;7\6bgNJJ�q�6� 7��7:jK>P)scd��A�|f�/�01753A;�pp��#�L��"��+@	

BD?33�22301#53#52>53��Q!',-�--5-��,Z����@�?3�201".54>32'32>54.#"�5R-.Q56P/.Q�"7"#7!!8"!8"Z2T01T11T10T2�%<#$=%%;$#>?B�
$@

	/333/393301%57'557'5���������;��;�%�;��;���"����&'c	�"����"392@76613&&%%1499 r+22/392/3/9/333/301!4>7>54&#"'>323#53#52>53		�6*=*21!0"
&D0GF*/+,��Q!',-x#���4E.%, !D3+**,s--5-����T[������#��t�&'c�	!�+��$(@	$$''(
?3?33/0132>7#".54>7>57#5>%0+'?"$>0.AR+%F8!&1)8:0,?-#3$+:/):0G1(7'70�kk����&&����/�01����&&���/�01����&&����/�01����&&�y��/�01����&&���
�/��01����&&����/�/301����-@


rr+23+99//333301!!!!!!5!#��vT����)���L���>�>��>��V����*�L��&(����Y6�&*����/�01��Y6�&*�
��/�01��Y6�&*����/�01��Y6�&*���
�/��01����&.�����/�01��Y��&.�5��/�01����&.�����
/�01����&.����
�/��01"��@rr+2+29/3015!32#4.+32>"-��r�KS�h?xW��Xx>J66���_�bl�XdU�K��N���Y��&3����/�01��*����&4����+
/�01��*����&4�2��(
/�01��*����&4����.
/�01��*����&4����(
/�01��*����&4���
�,(
/��01@l��&@
		/33/33392301%''7'77�,zy+yx,wy+x�+yy,xy+xy,y��*����&4J��O����&:����/�01��O����&:�4��/�01��O����&:���� /�01��O����&:���
�/��01��{�&>����	/�01Y?�@



rr++99//33012+#32>54.+l/L93\=�FF�+="'B'�9&@P*9g@yƍ�.K)+I-��K���-@%		-r
r+/3+29/33017>54.+532>54.#"#4>32�]p+K1#7"7",<A4Z:5T10JS(He>9KM/G'>3"$1(C*�;Z2(I/#@-kI3N5��!����&F�y�</�01��!����&F���9/�01��!����&F�b�?/�01��!����&F�.�9/�01��!����&F�c
�=9/��01��!����&F���KBB/�/301!���7IR/@NR%C%%r)118r+223+299//332301".54>32>7.#"'632>32!3267#"&''26767.'.#"%.#"�1N-7b@#E	K<'T,g^A\ h?LuC�;7X43[<BY3Dp#LX5Z	@ HZ!8�5U64V4
+I./F(	(5= -D71/9JyK8W34*%<!?4)24(!5

<1 5�9X22X9��'�L&H����'��-�&J���)	/�01��'��-�&J���&	/�01��'��-�&J���,	/�01��'��-�&J��
�*&	/��01����&����/�01��K��&��&�/�01������&����
/�01����&���
�/��01*��/�+3"@(/0.-12,3 ?3?9/9301#".54>32.'332>54.#"'?/*I^6EuD&CY3Bn#BmR`Rj=�@2U46V43V44W3�fzxjAiL)AoC1WC&A40^]]-0qwwc2S15W32O/2T�?LIB��K�&S�O�/�01��'��,�&T���'
/�01��'��,�&T���$
/�01��'��,�&T���*
/�01��'��,�&T�P�$
/�01��'��,�&T��
�($
/��01CJ��@
		/3/333/2015353'5!�;;;���[[��ZZ�99'��,#'+/&@+-,*%&)(//
r''r+22/+22/901".54>32'2>54.#"77'7'73)8_E&&F_79^F&&E_94V44V44U43V�@)-3(�,,)>
+Ka67bK++Kb76aK+<8a9:`89`;:_73R9>z9��F���&Z���!/�01��F���&Z���/�01��F���&Z�}�$/�01��F���&Z�~
�"/��01��� 
�&^���/�01K�+5�'@rr
r#r+2+++201#"&'#3>324.#"32>5(E\67WEET=:[@"F-Q6(A1 19)D35cL-6$�����(:0Pa18`<"8 �-$#<L��� 
�&^�r
�/��01����&&����/�01��!����&F�B�9/�01����&&����/�01��!����&F�z�@/�01���J��&&����!�J�&F�?��*����&(�3��%/�01��'���&H���!	/�01��*����&(����+/�01��'���&H���'	/�01��*����&(�(��%/�01��'���&H���!	/�01��*����&(����*/�01��'���&H���&	/�01��Y��&)����/�01��(����&I�2V+4"��@rr+2+29/3015!32#4.+32>"-��r�KS�h?xW��Xx>J66���_�bl�XdU�K��N�(��e�3(@ !/r
rr%r+2�2++2+2901534>323'.=#".5.#"32>i���=lEAgD j96[C%�
:I$*D16F)83"i..��J{JE1>�x
6 33<,La�$;##<L(*L; #0��Y6�&*����/�01��'��-�&J�c�&	/�01��Y6�&*����/�01��'��-�&J���-	/�01��Y6�&*���/�01��'��-�&J���&	/�01��Y�J7�&*����'�J-&J����Y6�&*����/�01��'��-�&J���+	/�01��*����&,����-
/�01��(�!�&L���=
/�01��*����&,����.
/�01��(�!�&L���>
/�01��*����&,� ��'
/�01��(�!�&L���7
/�01��*�9��&,��*��İV+4��(�!�&L���;
/�01��Y��&-����/�01��K�&M����/�01,��!@


r
r+2+29/33/3015!'#!#3!,�2E�[FF�55��:L����<�@
	rr
r+2++2�2990153#4&#"#3>32��D>:&K9DDo?-?'i..��#XY'C+����:E =Q3�����&.�����/�01�����&����
/�01����
�&.�����/�01������&����/�01����&.�����/�01����&����/�01��!�J��&.�����J��&N���V+4��Y��&.�+��/�01K�	�r
r++0133KD	����Y����&./���K�Kp�&NO�������&/����	/�01�����K��&����/�01��Y�9��&0�����ΰV+4��K�9	�&P�����ΰV+4K		@
	r
r+2+2901!#33��pDD%M��h�	�����Y9�&1�3��/�01��N���&Q�*��/�01��Y�99�&1���	��ΰV+4��N�9�&Q�S���ӰV+4��Y9�&1H��N��C�&Q��V+4��Y9�&1{-f��N��*�&Q{���V+4@�	@
rr+22/3+2/3017'%3!&1�F��(�'��x>
��$�@
	rr+23+22301'7'33267#"&5!��D$
7.7!'�'���'7
6/��Y��&3�>��
/�01��K�&S���/�01��Y�9��&3�*�
��ΰV+4��K�9&S�����ΰV+4��Y��&3����/�01��K�&S���/�01�����&S,�%�/�01Y�K��@
rr++2/3901#33#"&'732>=�F5�E-F'!:"'*C����K�".F(.
+$K�K%@rr
r/2+++29901"&'732>54&#"#3>32h!;!'*6:(N;
D>DV.+<$,F�.
+>\U'C+��	v&9  ;S3��.H(��*����&4����(
/�01��'��,�&T�c�$
/�01��*����&4����/
/�01��'��,�&T���+
/�01��*����&4���
�,(
/��01��'��,�&T��
�($
/��01*��X�2%@r)r	rr+2+2+29/3+201%!5#".54>325!!!!2>54.#"X�(Og<J{Y02[zG>hL�wS����<aE$&G`:<aE%&Fa>>�5S1<g�DG�e;1U3�>�>��3Uk7:jS13Uj7:kS1'���*:C%@C?3r##+r+223+2239/301".54>32>32!3267#".''2>54.#"%.#"(HuDDvI3XBwOIpD�B7X46[:DX12ZGDV15V33U54V43V�6U33S3
GzKM{H)I3NWCyR6X44*&;!)I13I'<8_:<_89a;:^7�9X22X9��Yg�&7����/�01��KO�&W���/�01��Y�9g�&7�����ΰV+4��I�9O&W����ΰV+4��Yg�&7����!/�01��KO�&W�$�/�01�� ��=�&8����3./�01�� ����&X���,/�01�� ��=�&8����9./�01�� ����&X�S�2/�01�� �L=�&8���� �L�&X�T�� ��=�&8����8./�01�� ����&X�S�1/�01���LQ�&9�����LE�&Y�.��Q�&9����
/�01����k�&Y�!`�@		

rr++9/333015!###5!L�*�E�?455T�x�>��F�@

r+2?�3333/30153#".5#53533#3267!�4"03HHDxx%.--�-!u6��6����O����&:����/�01��F���&Z�I�/�01��O����&:����/�01��F���&Z�]�/�01��O����&:����!/�01��F���&Z���%/�01��O����&:����,##/�/301��F���&Z���0''/�/301��O����&:���
�/��01��F���&Z��
�"/��01��O�K��&:���F�J	&Z�i���&<�e��/�01���&\���/�01��{�&>����/�01��� 
�&^�q	�/�01��{�&>���
�
	/��01��S�&?���
/�01����&_���
/�01��S�&?����
/�01����&_���
/�01��S�&?����/�01����&_�Z�/�01���� )@&&r!	r+2+29/301".5467!.#"'>32'2>7!mGy]3K,GY30WBBYr=DxZ43[wEEpF��Hs7b�J
9bH(#?)3N-9c�LK�a7?EwMLxE�K��&@
"r/2+29/33301"&'732>5#5354>32.#"3#� ;"'*II%E/:*/2��-F�.
+�6K@\11JFM6�Q.F(��*���&4�~��(#V+4��'��,^&T�6���$ V+4��O��&:�I��V+4��F��q]&Z�����V+4Y�	&3@r
	#""!& �%r+23��2923?33?3+201%!5!!)32#4.+32>7#'��%-�"��p�q�LS�h?xW��Xx>hUU'c2b7Q>7��>�_�bl�XdU�K��N��??UUY��
&3@#""!& �%rr?2+2+23��2923?3301332#4.+32>!5!!!7#'Y�q�LS�h?xW��Xx>�]�����[�V�UU'c2c�_�bl�XdU�K��N���3.�X3�??VV(��6�/9@A@$0669
=<<;@:�?23r+r

!r+2??3+29+2��2923?33014>323'.=#".5.#"32>!5!!!7#'(=lEAgD j96[C%�
:I$*D16F)83"�\�����[�W�UU'c2bJ{JE1>�x
6 33<,La�$;##<L(*L; #0k�3.�X3�??VV��Y����&1/G��Y�K��&1OG��N�K��&QO��Y����&3/��Y�K��&3O��K�K��&SOG��*����&,����,
/�01��(�!�&L���<
/�01��*�O��&4�
��'�J,&T����Y�&)?���Y��&)_���(��7�&I_n��*����&,x��'
/�01��'�!�&L�x��7
/�01��&Q@,
	

	

			!
?3333332??9/333//9<<<<01'733#'!#4632#"&7"32654&l.<H�;'J\��[KՏ�83&'33'&3Y;Y�:��_���&..&%..W��!����&F'������QKBB/�/3301������&����/�01��!����&����S/�01��*����&4&J�2��,
/�01��'��,�&����0
/�01����&&���
�/��01��!����&F�I
�<@/��01����&&����/�01��!����&F�z�=/�01��Y6�&*���
�/��01��'��-�&J�j
�)-	/��01��Y6�&*����/�01��'��-�&J���*	/�01������&.����
�/��01������&���
�/��01����&.�����/�01����&����/�01��*����&4���
�+/
/��01��'��,�&T�k
�'+
/��01��*����&4����,
/�01��'��,�&T���(
/�01��Yg�&7�r�
�#/��01��/O�&W�

�/��01��Yg�&7���� /�01��KO�&W�<�/�01��O����&:���
�!/��01��F���&Z�d
�!%/��01��O����&:����/�01��F���&Z���"/�01�� �9=�&8���6��ӰV+4�� �9�&X���/��ذV+4���9Q�&9�����ΰV+4���9E�&Y�t���ӰV+4��*���H&4'�������0�,,(
/��/�01��'��,�&T'���c��,�(($
/��/�01��*���Q&4'�������D�((
/�/�01��'��,�&T&�P�c��@�$$
/�/�01��*���Q&4'�'�����,@((
/�/�01��'��,�&T'���c��(�$$
/�/�01��{�&>���	/�01��� 
�&^�Q�/�01���K�	�
r/+301"&'732>53 ;"'*D-E�.
+$��.H(��$%@""rr+2+29/301".'467!.#"'>32'2>7!"KvC�6T24Y;BY39_F'BtL4Q4��6V
I{I8W24)&:"+Kc8IzH43X89X2��E	��_��E	E�`��"Ta��1l����/�901'73^-;Hl]#K|�
��/3�20152654&#52#'22K"#/%%.#K|�
�
�/3�201"&5463"3|&33&K.%%/#��*p!����*p!��Wp��//01#�<�i�6�W��/3015!6!�//E	��
��/�0153E;	��E	��
��/�01'3];	��W�~��//01#�<�i���+u�����2yp����#K�����5�J��,vj���/22�2201".#"#4>3232>53*"*$'%*'~!"��+l!��1l����/�30131G<,�]1l����/2�01'73^-;Hl]*p!���/3�9330173'*b2c'UU�UU??:vx�@
�/2/2�22/01".#"#4>3232>53*"*#'%*'~!"6�W��/2015!6!�//+u��
�
�/3�2012673#"&53�!)9))9*"�&*;;*(2yp��/�01532>yaa=y��/2�20153353=:[:y^^^^�`w��
�/3�201'>32'>54&#"&!"

�&'

#K����	/3�2014632#"&7"32654&#3&'22'&3Y�%//%%..V+l!���/2�23301'73'73P%9@*&9@l]n]*p!���/�2923017#'PUU'c2b�??VV%l���/333�2013'3�?9%�@9%�]n]+u��
��/3�201"#4632#.�"*9))9)!�(*;;*&"Ta���/�99013#57^?�@FF@2�����/2�017267>732!&
	:
&0�3!
	2�Wp���/�01532>�aa=�W���/3320153353=:[:�^^^^9�9x����/�9017#53<?�JLLJ#�L��
/3�201"&'732654&'7�=&!$$"'08�'
'3'(-5�J���/3�2014673.5--)%'%+/i;-- +�h��
��
/3�2012673#"&53�!)9))9*"u&*;;*(6�W���/3015!6!�//2"E�/301532�--p�@
rr+222+201	!5!a������o55��x6-��-#@"r,,r+223333+201353.54>323!5>54.#"-�8R,1XxFGxX1,R8���2M7$C_<;_C$6N1>]tAE~b99b~EAt]>>>T_05fR11Rf50_T>>K�,!	!#@ 
r
rrr++2+2+2901332>733#.=#".'KD=>'K:D>N*2 
���YX#A+H�O< B#;"&����4	@rr
r++233+201##5!#3267#"&5�BP
n 
7-6�5�>>��!7
6/l��Y6����Y6�&�l��
�/��01����#!@rr	r+2++239/301"&'732654.#"##5!!>32�+!HR,M0._.D���/c1Cg;u9OR8L&���==��7gHpl��Y��&�����/�01*����'@
r	r+2+29/3901".54>32.#"!!32>7zH{[2,XSa�!7FR)<`C%M��*I_7*WJ:^r<g�GA}g=WD"/7-J]/:8dM,;-5J&�� ��=�8��Y��.����&.l���������/&����&#@&		rr++29/3333015>?!32+!%32>54.+&'9'��Le32cJ��'7C	�9G F?�>/l�����6a?<a:��|�m<=,H((G,Y��'@rr++9/3333320133!332+!%32>54.+YFoF�rr2cJ����9G E?���1��oZ8_8W��;*D&%@(��@

rr+2+239/3013#5!!>32#54&#"�����*^3ppDMY1b�==�js��UO����Y`�&�����
/�01��]��&�����
/�01����oy&����/�01Y�xa�@
rr/++223015#3!3#?�F}E刈�x��:�����&Yn�
@rr+2+29/3013!!32#'32>54.+Y�j�up1cK��:F G@��>�mW9]7>*C$$?'��Yo�'Y���rr++2013!!Y����>�x&�x��@

r+2/�233301532>?!3#5!7!!&+�U>��D���&��.g���xƈ��J���i��Y6�*��)@rr+22+229/33399013	33333	####��R�aE`�R��Q�bEc�nX��<��<����J��J��-����-@' r	r+2+29/3901"&'732654.+532>54.#"'>32It!6V8LY%D0DE%8 #?*3N3gH=[552?E<i	?8!,0OB*A$8#:$':".)"7>/S86WbA>Y0]��	@	rr+2+29901333#]E�AE�M��f�:[����]�p&���
/�01Y`�@r	r+2+29/39013333	##YFk�Q��V�m��<����J��&��~�@
	rr+2+2/301!!#52>?!9�� :T:'<*�����o/>(d���:��Y�2��Y��-��*����4Yq�@	rr++23013!#!YF�t�:��x��YR�5��*����(��Q�9��o�@	rr+2+299015326?33#�-��M�I��*&;A�/��)$*�#-@-$?�223?�22301!5.54>753'>54.'tDx[36\vBBCx[45]wAAHwG+J^sHwG*J^4B.RqDHqQ,55.RqEFrP-B|�?pM;\A#@pK;[B%��s�=Y�y��@	rr/++233015!3!33v��FzEV���x��x�E*�@	rr++9/3201!#"&=332673�:D'vpDQ[3aD2
gp��SLU�:Y]�@
rr++33220133!3!3YFFE�x��x��:Y�y��@
	rr/++23333015!3!3!33t��FFEV���x��x��x���@
rr++29/33013#5!32#'32>54.+Ѿ�Mf43dK��;G!G@��<��6bA;d:;-I(*H,Y��@
rr++9/3323013332#'32>54.+3YF�Mf32dK��;H!H?�E��6bA;d:;-I(*H,���;Y9�@
rr++9/33013332#'32>54.+YF�Mf32dK��;H!H?���6bA;d:;-I(*H,0����)@% r		r+2+29/3901".'732>'!5!.#"'>32N<oY;HV+:cJ'��l%Db>+QD:%�cQW.1Z}'J4,;0Tl::3eO08-#DW=g~BE�g=Y����&!@
rrr	r+2+++29/301".'##33>32'2>54.#"eZ�S�FF�U�Ua�RV�\Nq?BrJLo=?pS�c����e�P]�jq�V?M�V[�HK�WZ�IA$�@

rr+2+29/39013.54>;##*#3#"A�MS9hH�E
����1N*&I-nL9]7�:$��a($@,,D(��!���F;��9�'@ 
	rr+2+29/301"&54>?>32'2654&#":~� >[;��<P-lGLk8;qSYa_[4T1+R
��a�W8H;E>_L:?>nHLq?<gVTj,T>6V1J�	%@	%r
r+2+29/39013!2#'32>54.+532>54&+J,<(&-8)G.�+(ű(/%�	%:!*C
D0*>"1,+/,$6J�	�r
r++2013!#J7�	=�4��(	@

r+2/�233301532>?!3#5!7!#	&SF=�b4�y�F{^��4�yy��Z]}I��'��-J&�	)@r
r+22+229/33399013'3353373#'##5#&ðM�DFF�N��O�FFD��������������+@%rr+2+29/3901"&'732654&'#532>54&#"'>32�Hf8H3=I:359$75,;4[=2K+$ .32X72#'8/+4/('0#".4!=+%?F//D$J		@	
rr+2+29901333#JD==D���T�����[��J�&�x�
/�01J�	@r	
r+2+29/390133373#'#JDN�N��P�N	���������	@
r


r+22/+20152>?!##*!RD�/D>F{_����Zl�T$Jr	@
r
r+2+2901333##JF��CA�,�	��g�����F�]J�	@

r
r+2+29/30133!53#5!JD*DD��	������'��,TJ�	�r
r+2+2013!#!J�D��	���4��K�+AU��'��H�	@	
rr+23+013#5!#ͺ���==�4�&
	@rr+2+29901"&'7326?33�#.�H��D�,2�
042A�=��/<'�+��$/%@r/
r%
rr++223+223+015#".54>;5332+3#";2>54.+;Mr>?rLDLr?>rM[6T0/T�7T/0S7��HuFGvH��HvGFuH��7]98\55\89]7���	]J��'	@r	
r/+23+2015!3!33�`DDGyy	�3�3�:�	@

rr+2+9/301!5#"&=3326753u F(VWD9?#FD�X[��F@
���J�	@
r
r+23+2201333333JD�E�D	�3�3��J��	@
r
	
r/+233+22015!333333�lD�E�DGyy	�4�4�4�.	
@r
r+2+29/3013#5332#'32>54.+���YZ(M:��)23-��9�[J0N.6!53J[	@
r
r+22+29/3013332#'32>54.+3JDvY[(M:{r)23-p�D	�[J0N.6!53����J�	@r
r+2+9/3013332#'32>54.+JD�Y[(M:��)23-�	�[J0N.6!53&��#@

rr+2+29/3901".'732>7#53.#"'>32.WF7Y/5T6��0R9/Q5jK?aC"$D_	8(0.5Y40/T5(15B-M`13aN.K���&!@
rr
rr+2+++29/301".'##33>32'2>54.#"�Di?hDDh@iBMp>?qK6R-/R43P,-P
>mE�	�Hl<HzMOyE<6^=A^45_??_3$�
@


r
r+2+29/330137.54>;#5#735#"$�5A*M4�Dt���x4>3�MC-F*�����;-.@��'��-�&JE��)	/�01��'��-�&Jl�
�*&	/��01�G�-#@!%%r
r	/2++9/3�22301".'732>56.#"##53533#>32B'0
)'7#C8@SDKKD��!\<A[05O�
#'G`8Jc4A8�	.��.�35>wWF{]5��J��&����/�01'��"@
rr+2+29/3901".54>32.#"3#3267+;`D%"Cb?Kj4Q/9S0��4U5.Y7z	.Na31`M-B50)5T/04Y5.0<A�� ���X��K��N����&�l������K��O��	$@$		r
r+223+29/30152>?!32+#%32>54.+*!CpY[(N9��/D�k)22-j>F{_��UD-J*�Zl�T$90-J	#@r
r+23+29/3330133!5332+5!%32>54.+JDD{ZZ'M;��Ow)32-u	���UD-J*��60-�'@
r
r+2+9/993�223013#53533#>32#54&#"MKKD��b@`RD;G@W2-{{-�26hc���NN?:����J��&����
/�01��J�&����
/�01���&
�&�]�/�01J���	@
r

r/+22+2015#3!3#��DD�yy	�3��yZ�@
r+2/9/3�2015!332#'32>54.+|��E�Nf33dK��:H!H@�*77����6bA;d:;-I(*H,����'@

r
r+2+99//3333013#53533#32#'32>54.+f{{D���ZZ'M;��)22-�.��.�[J0N.6!53��
!@r
/22+29/3399013	!	####!!����O�cEc���alZ����H��H���&�	
!@r
/22+29/3399013'!#'##5#37!&̶���R�<F;�����>��������#���*����|��'��,}
��@
rr++93301!3>;#"5��I��76) !"���82<"$��/	@
r
r++9330133>;#"��E��73% !
�	�9c406&�r��]�l�p&� V@	V
/�01+4��J�lR�&���V+4R�@
rr+2+9/3�2015!332#'32>54.+G�E�Mf32eJ��;H H?�D--����6bA;d:;-I(*H,�@�
r+2/9/3�2013332#'32>54.+'5!�D�Y[(M:��)22-��Y�w[J0N.6!53�66SL�
'@rr++29/33333013!2+32>54.+7S&.M8 4[>��*="'A(��$�$�&AO):g@��D.J+,J+��C�+:(,'@rrr,++*))r+23323+++201"&'#3>32'2>54.#"?NBgD= g;6ZC%"?WG*D16F)83"6GP!�"
D2���e1=-La47bK*<#<K(*L:"%.�%;#^�Y�U�rr++�3013!53!YU>��Ə�xJ���r
r++�3013353#J�>�	y��4��	@rr++29/3015!!!v�����<11���>�x���		@r
r++29/301'5!!#9�7��..�	=�4Y��G�@
rr/2++29/301"'732654&#"5>32%!!n*+!GSYV.Y..b/qxu�����w:^aag>�{|w�>�xJ�H�	"@
!r
r/2++29/301"&'732656.#"5>32%!#7!"K@#>)&?#%H,8U0-Y��7�.
bTCQ$:2fONt>�	=�4�y��3@

rr/+2323+229/33399015#53%	33333	####�/n�M��R�aE`�R��Q�bEc���>ŇnX��<��<����J��J��&��	3@



r
r/+23+229/33399??015#53%'3353373#'##5#�,i�ðM�DFF�N��O�FFD�yy<�y����������-�u��1'@+$r	r/+233+29/390157'"&'732654.+532>54.#"'>32�<!It!6V8LY%D0DE%8 #?*3N3gH=[552?E<i����?8!,0OB*A$8#:$':".)"7>/S86WbA>Y0���L�&�|DY�y{�'@
		rr/+223+2/9/39015#53%333	##=/m��Fk�Q��V�m��>��<����J��J��	%@
		r
r/+233+29/39015#53%3373#'#�*g�BDN�N��P�Nyy<�y	������Yj�-@r	r+2+2/9/3/33/9013333##7#3YE��J�N�$$��?����M���>K
	!@r	
r+2+29/��390133373#'#7#3KC��K��M��h$$	�����	j�'@
r
r+2+299//3930153333	##�El�Q��U�nD--����<����J������)@r
r	
r+2+99//339+0133373#'#5!CD@�N��P�@�"�P�����D--��!@
r
r+222+29/390153333	##�El�P��U�n�<<�v��<����J��I	!@

r
r+222+29/3901533373#'#�DN�O��P�N�99�0	������Y�y��&�"T�V+4��J��F	&�!��V+4Y��@

r
r+2+2239/301'!%#!#3!�E���E�[FF��>>>�:L����<J�	@
r
r+2+2239/301'!3!53#5!�D7�[D*DD���==�4	����Y���!@rr+2/+2/39/3013!#!"'732654&#"5>32YF���*+!HRXW-Z..b/Lg6u�:��xw:^aag>=tR|J�HC	$@r
r
/2?++29/301"&'732656.#"#!#!>32{7!"K@#>) E#D��D�%N&8U0-Y�.
i[DP$��4	�2fNSzB4��)�6F+@C'rr0;;		r3	r+2+23333+2+201%#"&'#".54>73267.54>323267%>54.#")5{G0]%.\.V�n=.RqB
Ag9V�g)7Q,Q�^GsR,8nR"Hi)��4`@O�MCpCKp?\.44c�ZDz_6>I{Nd�O^{Ga�U2ZxGH�b2!�M}TO�U[x;Fz;��2B-@3%rr,;;	r/r+2+23333+2+201%#"&'#".54>3"3267.54>323267">54.!]1 : @!`�O$?S/
+C(;lJ	
?E@rKJm<]Z		/F �7T.&J38Y40O(
I�R3]G)66[8@i>!yMJqA?lEU�$�0W81[B?_8?R(*�u��'5.54>32.#"32>7\DpR,-V~P_� 7FO'@bC"(Ha9(TI:Oc2��Cg|AA}g=WD"/73Ui6;lS1:.0E(�'��"@	r!�r+�33+2015.54>32.#"32>7
Ch;BvMIpBO04V34V4"?/C8L-yqLvDJzHC9(-6^<;`9)!7#p���yQ�&�"!�
V+4�����	&�!��
V+4��{�>�+	@rr++2901533��G��B����6���
u�#@
rr++29/933301!5#535333#����L��M�쒒�1���~�B1� �+	#@
rr++29/3333015#535333#�ww�F��B�uuհ%�1��%��y��"@

	rr/+223+29015#533	##	X/m����N��N��O��>�M��5����+��^h���	"@r


r+2�33+29015#53?3#/#�W�_��M��M��M��yy<����������yI�!@
		r+23233/�3301+5!5!3!33:�F�)��FmFU�>����x��x����	"@

	

r+23333?�3301#5!#5!3333Ǵ��E�wD�DG�==��y	�3�3���E�y��&�"��V+4��:���	&�!k�V+4��E*�&�#�G:�	#@


rr+2+9/3/33/01!5#"&=3326753'#3t E(VWD9?#FE�$$�X[��F@
���_	Y>�@r
r+2+9/301>32#54&#"#�9E'voCQ[3`D��gp��SL�����K�M��9�09%@,55'	r1r+2+29/33/3901467;#"&2!32>7#".54>"!..1+dQPW�Fz\4��,GY30XBAZr<Ew[32[xDDqDHs�1%"==H7b�J
9bH(#@(2O-9c�LK�a7?EwMLxE��{-6!@..""3r&r+2+29/333301467;#"&".54>32!3267!.#"!

,%UCDNo4[E''D\3LtB�C7T04[<AY��6T31U5O+
16��+Kb87aI+JyH8W34*%<!'9V11W�y9�4='@9+�"+	r5r+2+22/�9/3�20157467;#"&2!32>7#".54>"!.�>�6-0,cPPW�Gy]3��,GY20XBBYr=EwZ43[wDDpEHs���B1%"==H7b�J
9bH(#@(2O-9c�LK�a7?EwMLxE���1:'@22&&7r*�r+�33+29/33330157467;#"&".54>32!3267!.#"Q=��"
-%UDDNo3[F''E[4LsB�C6U03[;BY��5U31U5yy��+
16��+Kb87aI+JyH8W34*%<!'9V11W��Y��.���y&�;��/�01��&��&���/�01S�,F�$!@rr/2++29/33301"&'732>54.+#33:3�)
$4)G^4WEEG
�Q�Fl>/Q�<,Q8;lR0����=��h�PIm=J�>�	!@!r
r/3++29/3301#"&'732654.+#33:735P-&A,
*+1T4;DD2�NPpB<[2;I;Bi>�	����&�l��&� 9�V+4���l8	&���V+4��Y�.��&�u��J�=�	&���Y�l��&� T�V+4��J�lF	&���V+4E�y*�@	r	r+2+23/9/301!#"&=332673#53#�:D'vpDQ[3aDh?�M2
gp��SLU�:��>:���	@
r+2?3�9/301535#".=3326753#)HD$:O'A:@#DCOy��)R;��GB
�y��Y�l]�&� ��V+4��J�l�	&�1�V+4��K�	����y&����/�01��!����&�_�9/�01����&����
�/��01��!����&��l
�=9/��01���������!������Y6w&����/�01��'��-�&�w�&	/�01������C����$�������&l���
�.*/��01����$�&m��
�*&/��01����&��H�
�/��01��&��&���
�/��01��-����&��t�
�2. /��01������&��:
�0,/��01-��� !@ 	r		r+2+239/33012#"&'732>54&+517!5!
C`<>lFM|"6^;6M+`^E�����$<M)Ed6@7!+1(I1FY8�>7���$�	@rr+2+239/3301"&'732>54&+57!5!3�Mz7X<:M'hd7����qv">V�B</.+N1PX1�==�u^2U<!��]��&�s���
/�01��J�&�sd�
/�01��]��&����
�
/��01��J�&���
�
/��01��*����&����
�,(
/��01��'��,�&���
�($
/��01*����+#@		"'r	r+2+29/333015!".54>3232>54.#"WS��KzX02[zGKyX02Zz��&Fa;<aE$&G`:<aE%O55��<g�DG�e;>h�CG�e:h:kS13Uj7:jT02Uj'��,'@$rr+2+29/30175!".54>3232>54.#"P��8_E&&F_88^F&&E_�3V44V44V44U4�##��+Ka68aK++Ka86aK+:_78a9:`8:_��*����&|���
�0,/��01��'��,�&}��
�,(/��01��0����&����
�.* /��01��&���&�n
�($/��01����o�&�sy��/�01���&
�&�sI�/�01����o�&����
�/��01���&
�&��j
�/��01����o�&����
�/��01���&
�&��
�/��01��E*�&����
�	/��01��:��&��^
�/��01��Y�y��&�"u�V+4��J���	&�!X�V+4��Y��&���
� /��01��J[�&��
�/��01�/�@r/2?33+29/301"&'73265#53'!!5!�*
42k�&FA����v�=LE>?A]2��>�x<11�=�	@r

/2?33+29/301"&'73265#53'!#'5!_)
3/G�&E.6�8�8J=<==W.�	=�4�..�,�@r/2+2901"&'732>54&/#	33�+1"��P��P��O���)!0M�=3#J*���cc��0���4[%4M,�>�	"@r
/2?+2901"&'732654&/#3?3=
	%.!&A	�M��L��M�R+.*C�;<,(L+N
���`3c00L+� @

		r+2/9/339015!3	##	�a�h��N��N��O��G--��5����+��^h�	@
	r+2/39/9930175!?3#/#6n����I��J��I���..�������)����-@  r'	r+2+29/3901".5467.54>32.#";#"3267Dj<F=496`>Hg3N4,C$"<&ED0E$XM8V6 v	0Y>AbW68S/>7").":'$:#8$A*BO0,!8?#���/@
"r)r+2+29/3301".5467.54>32.#";#"3267�9Z32.'2V3+F41%1:H-?<3:#>)4J8i$D//A
!.+=!+.((67','#27��&�.~�&�u���=�	&���*����6��(�+V���<��	\��T�y��&�"'�
V+4��C��0	&��!��
V+4��Y�y��&N"��V+4��K��K�&O!��V+4�����.��&�������=�	&����&�y��&�"9�V+4����8	&�!��
V+4��*�L��&('���3��9/�01��'�L�&H'�����5	/�01��Y�W��&)����İV+4��(�W7�&I���1��ذV+4��Y���&)�������V+4��(�7�&I�q�1����V+4��Y6R&*'�����x��/�/�01��'��-�&J&�c����-�&&	/�/�01��Y6R&*'����x��/�/�01��'��-�&J&�c����*�&&	/�/�01��Y�L6�&*'������'/�01��'�L-�&J'�����A	/�01��*����&,����'
/�01��(�!�&L�g�7
/�01��Y�W��&-� ��K�W�&M�����ΰV+4��Y�h��&-����K�h�&M���!
��ذV+4���\&.'�����5���/��/�01����&�&���&���/��/�01��Y�W9�&1�����ΰV+4��N�W�&Q�]���ӰV+4��Y�9�&1�����?�&Q�������V+4��Y�W�&2�e��K�WR&R�z�&
��ΰV+4��Y��&3�4��
/�01��K�&S���/�01��Y�W��&3�4���ΰV+4��K�W&S�����ΰV+4��Y���&3�����ΰV+4��K�&S�[�����V+4��*���e&4'����2��D�((
/�/�01��'��,�&T&�P����@�$$
/�/�01��*���c&4'�������HD�((
/�/��01��'��,�&T&�P����D@�$$
/�/��01��*���R&4'�����x�/�((
/�/�01��'��,�&T&�c����+�$$
/�/�01��*���R&4'����2x�,�((
/�/�01��'��,�&T&�c����(�$$
/�/�01��Y�Wg�&7�����ΰV+4��K�WO&W����ΰV+4��Y�g�&7�������V+4����O&W�������V+4�� ��=�&8����3./�01�� ����&X���,/�01�� �W=�&8���4��ӰV+4�� �W�&X���-��ذV+4�� ��=u&8'������7�33./�/�01�� ����&X'������0�,,/�/�01�� ��=u&8'�������:�88./�/�01�� ����&X&�S����3�11/�/�01�� �W=�&8'������4��ӲV7./�01+4�� �W��&X'�����0-��ذV+4/�01���WQ�&9���	��ΰV+4���WE�&Y�~���ӰV+4���Q�&9�m�	����V+4���_�&Y������V+4��O���e&:'����4��6�/�/�01��F���&Z&�I����:�/�/�01��O���O&:'�����x�"�/�/��01��F���&Z&�]���&"�/�/��01���&<�|��/�01���&\��/�01���&<����/�01���&\�P�/�01���&<�f�
�/��01���&\��
�/��01��{�&>����	/�01��� 
�&^���/�01���WS�&?���	��ΰV+4���W�	&_���	��ΰV+4����E�&Y����
�
/��01K��S�<!@
:2-(r"r	r+2++2901"&'732654.'.54>7.#"#4>32�?n)+Z1=L%E07I$0Sh6
.G+;Q+A%D\5?_;:fL+7)<X0o
*+0)%1. "3*2@%(62U5�.�5W@".P7)# !4/IR���W��&&���!�W�&F���:$��ɰV+4����&&�$��/�01��!����&F���C/�01����&&(v��@/�/�01��!���
&F(+�@@??/�/�01����&&)���@/�/�01��!���&F)8�C@??/�/�01����&&*���@/�/�01��!��� &F*T�J@??/�/�01����&&+����/�/�01��!���+&F+@�@@??/�/�01���W��&&'�����/�01��!�W��&F'���b�:$��ɲVC/�01+4����&&$����/�/�01��!���,&F$w�G�@@/�/�01����&&%����/�/�01��!���*&F%t�J�@@/�/�01����&&&���#�/�/�01��!���@&F&x�Q�@@/�/�01����&&'����/�/�01��!���3&F'\�G�@@/�/�01���W��&&'�����/�01��!�W��&F'���z�:$��زVD/�01+4��Y�W6�&*��
��ΰV+4��'�W-&J���'��ɰV+4��Y6�&*�#��/�01��'��-�&J���0	/�01��Y6�&*�x��/�01��'��-�&J�P�/	/�01��Y6�&*(t��@/�/�01��'��-
&J(L�-@,,	/�/�01��Y6�&*)���@/�/�01��'��-&J)Z�0@,,	/�/�01��Y6�&**���@/�/�01��'��- &J*u�7@,,	/�/�01��Y6�&*+����/�/�01��'��-+&J+b�-�,,	/�/�01��Y�W6�&*'�����
��IJV/�01+4��'�W-�&J'�����'��IJV0	/�01+4��3��&.��N��/�01��
��&���(���/�01��Y�W��&.�+���İV+4��K�W��&N��	��ΰV+4��*�W��&4�&�)��ΰV+4��'�W,&T���%��ذV+4��*����&4�J��2
/�01��'��,�&T���.
/�01��*����&4(���/@..
/�/�01��'��,
&T(M�+@**
/�/�01��*����&4)���2@..
/�/�01��'��,&T)Z�.@**
/�/�01��*����&4*���9@..
/�/�01��'��, &T*u�5@**
/�/�01��*����&4+���7�..
/�/�01��'��,+&T+b�+�**
/�/�01��*�W��&4'�&����)��βV2
/�01+4��'�W,�&T'�����%��IJV.
/�01+4��*����&E�2��8
/�01��'��,�&F���4
/�01��*����&E����;
/�01��'��,�&F���7
/�01��*����&E�J��B
/�01��'��,�&F���>
/�01��*����&E����8
/�01��'��,�&F�P�=
/�01��*�W�&E�&�9��ΰV+4��'�W,^&F���5��ɰV+4��O�W��&:�)���ӰV+4��F�\	&Z�����ɰV+4��O����&:�L��$/�01��F���&Z���(/�01��O���&G�4��*/�01��F��q�&H���./�01��O���&G����-/�01��F��q�&H���1/�01��O���&G�L��4/�01��F��q�&H���8/�01��O���&G����3/�01��F��q�&H�I�./�01��O�W&G�)�+��ӰV+4��F�\q]&H���/��ɰV+4��{�&>����/�01��� 
�&^���/�01���W{�&>���
��ΰV+4��� 
	&^�%��{�&>���/�01��� 
�&^���/�01��{�&>�l��/�01��� 
�&^�=�/�01��A�e0A��0�/20175!Ar�??A��0�/20175!A��??A�D0�/20175!A�??��A�D0R@	����/�99013#57|C�jggj@	����/�99017#53GB	kffkP���f��/�99017#53VBhhffh��@	��&TTy@	��
@	
/3�29017#5337#53GBWB	kffkkffkP��f
@
�
/3�29017#5337#53VBSBhhffhhffh'�~o�
//9/33301#5333#���A���r>�'>��)�~q@
	//9/333�22301#535#5333#3#�����A�����!?n?|��?n?��V	��/301#".54>32	))))Z))((A�b@
	
?2332301353353353A;L9M:bbbbbb.��	�/?O_e5@`eeP@@XHH8((0 	rcbbr+22/32/3+22/333232/301".54>32'2>54.#"".54>32'2>54.#"".54>32'2>54.#"		�)D))D))D((D)--,-j)D((D)*D((D*----{)D))D))D((D*----��#����&B'(B&&B'(B&'00//�&B((A&&A((A'(/00/(&B((A&&A((A'(/00/T[����E	��
��/�0153E;	����E	E�&__�)B!�@	/3/39017')�����;��;�?B8�@	/3/3901%57'58�����;��;��(��r��rr+2+201'		�#���T[����&��*%�!
BD?2�201".54>32'32>54.#"�0H02G,0G01G�!A0$7$"A/$7$�%=F"$G<#&=G!$H:#�%I006%I0/7�b*

@
		
BD?�29/3333015#5733#'35���99��g*��+g���V*&@	# BD?3�29/3012#"&'732654.#"#>73#>�+E),J,1P@'0B!38)
� 0� 9%(<!)" 2))098*
,�(�s**@#
BD?3�29/93014.#">327.#"32>".54>32s*I/(HG8%<I-N^\I/K,� 8"!7!"7!!6&=##KT "%vwP[%?;,++,�[*�BD?�201#5!#�A�3�,�q&�g*+:@ 008B(D?3�29/33301#".5467.54>324.#"32>'32>54.#"g,J,.H):".+C##B+,!(5-#55"$64"�..-&=
"5 6 '2) -- *5!!!$$�# �k**@	

#BD?2�29/301"&'73267#".54>32'2>54.#"�,K<%9FH)-I+,K.I]^H!6!!7!!7 !7�&"TK%$>%'>%[Pwv�,,,,&���?%�!
BA?2�201".54>32'32>54.#"�0H02G,0G01G�!A0$7$"A/$7$U%=F"$H;#&=G!$G;#�%I0/7%I007"��
E@	

BA?33�22301#53#52>73
�Y$+$-$,,5	,��$��^D"@B A?2�29014>7>54&#"'>323$8*?+33!2"
'F0II+1,-�P4E.%, !D3+**,#��_D,@
&BA?2�29/3301"&'732654&+532654&#"'>32�>U!8$1DRC?H?+)=-: ,E)/,.8-IU0)"' #(("! '"2#,
9&"1��b?

@	
BA?�29/3333015#5733#'35���99�Pg*��,g����V?&@
$$# BA?3�29/3330172#"&'732654.#"#>73#>�+E),J,1P@'0B!38)
� 0� 9&'<!)! 2)(188*
,�(��sB*@	#
BA?3�29/301%4.#">327.#"32>".54>32s*I.(HG8$=
J,N_]I/K+�!7"!7!"7  64&=$$LS"%vvQZ%>:,+,,��[?�BA?�201#5!#�A�3,�q&��g?+:@0  8B(A?3�29/33301%#".5467.54>324.#"32>'32>54.#"g,J,.H):".+C##B+,!(5-#55"$64"�..-&="5 7'2) .- *
4!"#$%�#!��lB*@	

#BA?2�29/301"&'73265#".54>32'2>54.#"�-J;%:FI(-J*,K-J]^I"6!"6" 7!"7U%"SK$$=&&?$[Pwu�++++(��� $(,0)@*/+--r#%"''r+233�2+233�2014>32.#"32>7#".#53#3##53#3#(BvLJpCO04V34V4"?/C@W38`F'F%%�%%�%%�%%JzHC9(-6^<;`9)%;!+Lb������J�	
@
r?+29/3�2013!!!!'5!y�tO���&�>��:���661����6:>@7:>;;
6(/	r
r+2+229/3�2017>54.54>32.#">323267#".#"!!!!3/6(1S17`'N* 4'.&$/,*855;P��P��*.G? -IBD&/N.81*)1 5!!?@K/!?B*				4


�+=*%%�"@

r
?3+29/993�201!5!5!5!%#33#%����F:�FA+>+�����O�;Y����
2^=@ /r#++$(PI(II(:3r''r+/33/+29///33333+201332+32>54.+#".5#53533#3267"&'732654.'.54>32.#"Y�.L93\=WS*>"(A'Mv"03HHDxx&-�;d%(S-9G#@,2C"0Q37UG+6"4&7Q,e�&AO):g@��D.J+,J+��-!u6��6��Z*+0)%1. !3)3C#&". '" !4/IR)4�!=@  !r?3+9/93�2233333301!5!3!!'!5!3!!3733##3��C�D��C��CdeC}�K��>��>��K�>++p**�����u�:_����A)L�,04/@
		2233 (--0/33|/33/33|/33/3/3014>323'.=#".%5.#"32>!!!!B6a=AgD i;@e9�
9J%/G(-K.93"�R#��.��C=h?E1)��6 32=AiQ$;#1O-0K,$/�+�*!����,!@
(	r
r+2+29/993�2017!7!74>32.#"32>7#".!�7�+8-V~P_� 7FO'@bC"(Ha9(TI:\q6IzY0++�++8A}g=WD"/73Ui6;lS1:.5J&?i��� @

	rr+2+29/930175!33	#8�F�M��1O��55��d���rd��Q�@		

rr++23015%5%###5!?��0�F�@'�'��'�'>�x�>R�!&@!	r?+299}//33�201!!!!!2+32>54.+P��P��J&.M8 6K.��*>"(A'�/+=*�c�&AO),P@%��D.J*-J+*���/(.0@.*++r#	r+2/223+2/2239/3?01%#3".54>32.#"3267#53#]....GzZ11XxGi�"6"rF;_D#(Ja8At5eZ��;����W=h�DH�d:VE$B>2Tj9<kS/ADJz,6��7����'+/'@-,(
))
r!	r+2+29/99993�201"&54>54&#"'>3232677!%7!*kf/JTI0CI+N!'\>ha0ITJ/EO0P#&^����o�UO1L<65?(352QJ2J;55@*783/  V  *���/,'@(	r
r+2/233+2/22301%#34>32.#"32>7#".]....��-V~P_� 7FO'@bC"(Ha9(TI:\q6IzY0�����A}g=WD"/73Ui6;lS1:.5J&?i�Q�@
	r?+23}/301!#5!#5!�@���@??���>>+��@�
r?+99�2330132#32>54.+!5!5!5!+^.L9'G0�O�>*="'A(Z��x��x��&AO)3Z>
��D.K*+I-\*E+"#�@r?2+9013332>53#%5%5%`F�4>
F0[K��k��k�x,G48\B#�3�33�4O����@


	?3/3933/3012#4.#"#4>?zRrG F3YDBX4EDt9..N4Yt@��/\K,+J\1��<s\6����  @ 	r?+29/3�233015!5!32+32>54.+��M��1N70[A��1=!A/�>>y77��&AO):g@��D.J+,J+H��-�&@	&	/3?39/3017>54&#"3267'#"&54632w#A4=2!6605
$!&0�Ygd):H";%�267"�")*'QTJYa�	)!@	

&r?+22/33/3?9901#33#".54>32'32>54.#"�F6�F=?6Q-.Q46Q..Q�!8""7""7"!9!D����N�;\2T/2S22S2/T2�$<$%=$&;$$=6���23@'*-0

$00?33/3�292/3/90173#5#'#3.#"#"&'732654&'.54632�UC0T(T0B�* *1;@1$>4"  ,13?02���ٯ��)
	%,('$	"')+>���)@
r+�923333301##5#533#5#'#3,_0_�C0T(T0BU���0��ٯ���-��-!@+-r!
r+2+2233330173.54>323!5>54.#"!-�8R,1XxFGxX1,R8���2M7$C_<;_C$6N1��>]tAE~b99b~EAt]>>>T_05fR11Rf50_T>>+��: @	r	r+2+29/301%"&'5!4.#"3267'2!5>21W�CwNMwCBwNKi#`E2X��W-&�L}KK{IH{K0#,�.(|}'.��"��	�&'c�#��s�"(U;@O:77)@HH)#((1)&%% /33/293/3?33/33/39/33014>7>54&#"'>323		"&'732654&+532654&#"'>32#7(?*22 1!
'C0GG+/+,�#���>U!8$1DRC?H?+)<-: ,E)/,.8,JG4E.%+!D3*)*+��T[����0)"' #(("! '"2#,
9&"1��"���&'c
���#����&'c�
 ����w�&'cv
����,�&'c+
����!2@+		r"r+2+29/301".54>32>54.#"'>32'2>54.#"�@c8'DY2>](H2.T'!i:moDxO(A1(F+0S3(F
7]9/VC'>8$$Yg- )&'����\<4@!)C(1Q0*D('��,)#'@
&% 
$'?2�2?3�201".54>3232>54.#")8_E&&F_79^F&&E_�3V44V44V44U42� �?
+Ka67bK++Kb76aK+:_78a9:`89`��;��`�@rr+233+201%!53`��:���555��x6������@		r/3+23301!##5!##��BRtPB���>>� ��
!@	
/333/9933301!!5!55!�G������]�.���3@-D�C�/2015!D�88����U��rr+2+201'3*���"�TA�|f�/201753A;�pp�
@


r+2/9/33013333#�gGGvB����m����m3-��/? @0<$ 8(/223�2923012>32#".'#".54>2>7.#"!2>54.#"�'4&$5&0F&)F.$4%
%7((H-*G,,  + //6.. +
 +//-K.-K----L-.J-��130&&11&&0 40	�Y$4�
/3/301&632.#"#"&'7326'b408
# )4/6  �/?	0%"�4:	0&"A�o|-@�@%�)/3�/2�2�201#".#">3232>7#".#">3232>7Q*,& '/ 	*,& '/ 	e$	

Q
$

		SJ��@
/�23/333/3017'!!5!!l��8-��-��]����1�1>=�
@
	/3�22/390175!%%?B��>���=99B�BomD�A=�
@
		/3�22/390175!57'5AC����?=99�DmoB���	@	?3?3901#!��I�������nl��B���9�9x��
��/�01#7#53_#?�JLLQ�31@		+$r2/3
r+2?3333333+29|/3013#5354>32.#"3#3#5354>32.#"3#dHH%I5#9))���HH&D0:)/4���6,P23
"(6�-�6@\11JF6�-��@
r	r+2?333+201#5354>32.#"!###dHH-E0%;,?%*5D�D�6%H<$	1+B"���-��I�) @r"
r
r+?333+2+201"&54.#"3###5354>323267�.6/*'2nnDHH(P<XZ&
	!$7.�2!(B(
6�-�6;Z3XD�.%	8��86@		,$r61488
?23?3333333+29|/3013#5354>32.#"3##5354>32.#"!###dHH%I5#9))���HH-E0%<+?%*5D�D�6,P23
"(6�-�6%H<$	1+B"���-��3�D@@ 
		#6r=r(11+..-
?2?3333333+2+29|/333013#5354>32.#"3#"&54.#"3###5354>323267dHH&J5$6&)��,/6/)'2nnDHH(P<XY&

!#�6,P23
"(6�-7.�2!(B(
6�-�6;Z3XD�.%	8#�� �b>@#TTJMM<+A&F!0Jr80r\

Y
r`r+2+223+2+293333/301%#".5#534.#".#"#".'732>54.'.54>32.54>323#326#/3II((@2 !M$!='+2$G:##:H%*PC,]0!?+/5&D39Y.!B
G=5<vv%.P7-!u6KR 9+4)("*$$4(*;$#/#$*$#2&9D 0#%>&8U86���@
r+22/3901##33�I��I�N��Lо�:U����a��a*����-@$##
r	r+2+29/301".54>32.#"32>7#5!|J|Z22Z{JY�+7+8C'<aD&&Ea;3WB,�4Vq<g�EF�e;UD-1&3Uk77jU2&@R,?>qX2��K��&���/�01!��� 3@ 
r'

r0r+2+29/3+01!5#".54>3254&#"'>32'6=.#"32>�$l:1N.'?N&6PNE'T,,c6D]0U#J$:0#9 @7R0,+I.)<&	/CS -'4^=��sU
*"4 (��"&"@
rr&

r"r+2+29++01".54>3253#5.#"32>77ZB$%BX3AfDDb�6E)*F22V7*E3
,Ka58bK*C4j��i3@Z'="%=K&8_:!;$(���'"@r'
r"r
r++2+29+01!5#".54>323.#"32>7�d96[C%=lDBd DD
:I$*D16F)93"a0;,La4J{JE1>�&T%;"#=K(*L; #0K�+���r+�2?013#3#KDDDD�&�[Q���
rr++0130*#QD	�&(�,7/$@rr!"
'
rr+2+29++201".54>3253#.5'2>75.#"5W>"&C[4=g=
	!Md)C3"2:+E41T
,La57aK+?0f�};$v<!8"�1'$<L'8`9)�@
r
r++2/223013#53533#hMME||�>��>�5F��	@rr
r++2+29901!5#".5332>73�AQ*3D%D63*I7Dr&8$?Q-2��1P0'A'H��'	@
	r
r+2+93301!#333(��G�G��A��G���^	�L��L����+	@
rr+2+9901	#73��LV�H��	�"�	�6�'��e�R7@CC=:r,++'0rK		HrOr+2+223+22/3+22/392/301%#".5#534.#".#"32>7#".54>32.546323#3267e"03HH,*31BP1*E14E)?3CEX-;`E%$B`:2ENJ<Bww%--!u6)E3>,;7.
,)$<L'*L; '):-M`35aM,=#=O"=S06��7$
?@#
		

		>/2?9/93339<<<<0133#'!3�4�BL��K�v�$�ܥ��T$&@>/3?39/3901%#!!24.+32>32>54.#-M/��!)= ,(3;?-��0���,*�)@$$)A")EJ),�-m�,*,��1'#�??3?3014>32.#"32>7#".,%IjDOr2b05R7!;P0!F<5M_.=gK(2`P/C5 6)&?N(,P?$+#(91QeT?$

�>/2?301332#4.+32>T�_�@G�X�4cH��Id2$J{LS|D@a8�L9dT�$@	

>/3?39/301%!!!!!�m���#��88$8�4�T�$	�>/?39/3013!!!!T�����$8�6�,��4'!'@
$##
?''/22/?39/301".54>32.#"32677#53#B<fK))Je<Wo1_:1N7!<P.5a+*c���6/Pd57cM,B5!2.%?O*-P=#03B--�0��T-$�	>?2/39/301#5!#3!5->��>>]$���$��T�#	�>/?0133T>#����\#�>??301732>53#"'&;$<:>(OBM5L3cG��>gH(!T($@

	>/2?3901333#T>DF�J�l#��6��
b�T�$�>/2?0133!T>K$�8T�$@
	>/2?3901!##33c�$�>A��A���O�M$��l��TI$	�>	/3?39901#33#�>0�?6��Q$�I���,��]''�#
??2?301".54>3232>54.#"E?gK(*Lg=>gJ(*Kg��:Q02P8 :P/2Q9/Oc57cN-0Pc37dM-+O?$&@N)+O>$%@NT�$�
>/?39/301332+32>54.+T�4R-+M5��#2 6!�$4O+-P2��!6"5 ,��]''+@
?((**?2/23/?301".54>32'2>54.#"73#E?gK(*Lg=>gJ(*Kg<2P8 :P/2Q9:Qa>�>/Oc57dN,/Qc37dM-9&@N)+O?$&@N)+O?$z�T$@

>/2?39/3901332#'#32>54.+T�4Q.!;(�H���"36"�$4O+'D0����!7 5!$���'.@	'+??3?39901.#"#"&'732654.'.54>32�0=#KG#H8>[1:M/Ex1?O-BO(N;=S*6`=;^$�3-#
":1'9%''4!-, (!7,3G# �$�>/?3301###5!��>����8K��@$�
>?3?301%2>53#".53E7J*>;_EFa:>+H5%?N(��7cM,.Nc4��)O>$:$
�>?2/9013#T��B�6�$�3��$r$@
	>?333/39013733##373;ST;io�E�7||8�D�l ��������$�(�
$@

	>?2/390173#'#S��F��E��F��$������ $�>?2/9013#5X��E�?�$��"����Y%$	@		>?33/33017!5!!!%��z�y��&1�82�F8�x��@

r+2?3/3333015333#5!7!?�?�?;��C�ʈ���xƈ��:���r/2+90133#?H���:s��(��#-!@-r$	r+�333+�333015.54>753'>54.'sDx\36]wACCw\56]wABJ|I,MauJzI,Ka5:56^�OS�^3555^�QR�^35o\J�\GmM*J�ZFoM+��Y+�+��-�u��,��*�u��>��-�L��&��z��*�L���N��� +@
!(rr+2+29/3301"&54>32'2654&+32654&#"*jr/Z@8U/2,DK8aBINPJ�OO�8GG8;Fqk*>Z2&I45JgQG^/:ULNR�IRt>99<H?:���+@"r%r+2+2901".54>7>54.#"'>323267DZ--[C&/13G0aG3N, D7MNM?6T,"m
<+09(&$'/<-,6#4.-'!$!,,��(�!L&��0@


r+2/2/?3/3/9/33333013'333373#'##5#&ðM�DFF�N��O�FFD�����b�������$�+@
%rr+2+29/3301"&'732>54.+532654&#"'>32�Gt8S26I&&G4P==NG8*H5dERf8.FI8e�B</.+O11H*5B=9@)/5A[P9NmOBd6��F��	Z��F���&Zq�/�01��F������K	�P	�r+/3901##0�H��D�	���;	��KS��KRRF��K	@	
r	r
/?3+2+299015'./#"&5332>73;
"uDRTD=<(K:D
0yyD<Dro2��YX#A+H�O�F��L	$'@rr
r		r+23++2+290133267332673#5#"&'#".5FD9:;\D99;]D> g@AP	#f@,<&	��[VTB>��\USB?��v<CK;BD ;S3D���	.'@'&#	-
?�3?3?3?933015'.'5#"&'#".533267332673;U iAAP	#fA+=%D:9;^D8:;]D
/yyE<DK;BD ;S31��[VTB>��\USB?�O�F���	@rr+2+9/301"&5332'2654&+goD�1N88N1FLLF�KjcB�,C--C-:@:;?dEK��V	@rr+2+29/301"&5#5332'2654&+�gq��1N88N2FLLF�Ljc	9�,C--C-:@:;?dEKJ�		@	r/+29/301753!#`���7��..�	=�4��'��?���L�-��'�L�)��.�.@
'rr+2+29/3301".54>7.5463!#"2'2>54.#"*HuD'E/23TK�42JDKvDEvI5U32V44V33U
>nF4WB@)CD<',)3>mGFn><-Q67U//U76Q-0��{�'�#
r	r+2+201.54>3232>54.#"VHnJ&)MlDImJ%)Lm��8Q78T7:R59T7
Bk}<@�i?Dl~:Ah?g4iW58[g/4iW59Zg*��@
r?33+22/301%!53#52>73����	#.06/E>>>E@%�o/�(�r&/2+2013&>7>54.#"'>32!0-@(&RF+!D43O5-%?W:Jb1)AK!@L%�?`J7#*=.&@'"0,(,9\75I1$888>0���2@
+#r		r+2+29/3301".'732>54.+532654.#"'>32?f@*2W82Q/8fF""ap-K,B^/EY0Dk= >-/G'Ep	*J1&"A(#=),?";@@*>":+.$44X9(?+	4K-<V/�

@	
r?+29/333301!5!533#%!w��r/XX���=�6>��`(���"@r	r+2+29/33301"&'732>54.#"#!!>32Ly.b:2O/.L0.T@PW��2M,Ai=Bo
K>"1<,M31K+*&�?�:eCEk;4��/�.@
'	rr+2+29/9301%4.#"4>327.#"32>".54>32/AoD-O:1X;8[,pGNvBBsJGrC�3T32U32T33T�Cm@ :'b�J=3(=G^��\�GBou2T23S22T22T2
�
�r+2?01!5!#����L�?�:2���!3C@8''@r0	r+2+2933301%#".54>7.54>324.#"32>32>54.#"EqCGn?+A"6 '@O('OA'!6 'A'E5? +Q34? +Q4��/H"$G/,G(&G+�>\39^:-I2
+:#,C/.C,#;+

5H($7&%C.#6'%Dp&77'&67,��&�.@
'r	r+2+29/330132>7#"&'32>54.#"72#".54>,AoD-O;1X;8[+pFOvAArLFsB�3T43T32U22T�Bn@ ;&b�I=2'>G^��]�GAou3T22S33S32T2��&���?k��"��
El��$��^Dm��#��_Dn����b?o����V?p��(��sBq����[?r��&��g?s��!��lBt&����%�!
B?2�201".54>32'32>54.#"�0H02G,0G01G�!A0$7$"A/$7$%=F"$H;#&=G!$G;#�%I0/7%I007"
�@		

B/33�22301%#53#52>73
�Y$+$-,,,5	,��$^�"@
B /2�290134>7>54&#"'>323$8*?+33!2"
'F0II+1,-�4E.%, !D3+**,#��_�,@
&B?2�29/3301"&'732654&+532654&#"'>32�>U!8$1DRC?H?+)=-: ,E)/,.8-I0)"' #(("! '"2#,
9&"1b�

@		
B/�29/33330135#5733#'35���99�g*��,g����V�&@	# B?3�29/30172#"&'732654.#"#>73#>�+E),J,1P@'0B!38)
� 0� 9&'<!)! 2)(188*
,�(��s�*@
#
B/3�29/9301%4.#">327.#"32>".54>32s*I.(HG8$=
J,N_]I/K+� 8"!7!"7  6�&=$$LS"%vvQZ%>:,+,,[��B/�201#5!#�A�3c,�q&��g�+:@ 008B(?3�29/33301%#".5467.54>324.#"32>'32>54.#"g,J,.H):".+C##B+,!(5-#55"$64"�..-&=o"5 7'2) .- *
4!"#$%�#!��l�*�

#B/2�29/301"&'73265#".54>32'2>54.#"�-J;%:FI(-J*,K-J]^I"6!"6" 7!"7%"SK$$=&&?$[Pwu�++++&F��%�!
BC?2�201".54>32'32>54.#"�0H02G,0G01G�!A0$7$"A/$7$F%=F"$G<#&=G!$H:#�%I006%I0/7"F��@
	

BC?33�22301#53#52>53��Q!',-s--5-��$G]�"@B C?2�29014>7>54&#"'>323$7+@+33!2"
'F0II,0,,�G4E.%+!D3*)*+#A_�,@
&BC?2�29/3301"&'732654&+532654&#"'>32�>U!8$1DRC?H?+)=-: ,E)/,.8-IA0)#' #')" !'"2"-	9&"2Kb�

@
		
BC?�29/3333015#5733#'35���99�Kg*��+g��FV�&@	# BC?3�29/3012#"&'732654.#"#>73#>�+E),J,1P@'0B!38)
� 0I 9%(<!)" 2))098*
,�(Bs�*@#
BC?3�29/93014.#">327.#"32>".54>32s*I/(HG8%<I-N^\I/K,� 8"!7!"7!!6�&=##KT "%vwP[%?;,++,K[��BC?�201#5!#�A�3�,�q&Fg�+:@ 008B(C?3�29/33301#".5467.54>324.#"32>'32>54.#"g,J,.H):".+C##B+,!(5-#55"$64"�..-&=�"5 6 '2) -- *5!""$$�# Bk�*@	

#BC?2�29/301"&'73267#".54>32'2>54.#"�,K<%9FH)-I+,L-I]^H!6!!7!!7 !7B&"TK%$>%'>%[Pwv�,,,,A�|f�/301753A;�pp1l��
��/�01'73^-;Hl]$K?�
�
�/2�201"&5332673�DJ2-/.+1JK@1(& 1@+Xp@
�_/]2�201".'332673�1C"7)64*7"A3*'3�=�<��/�201"&'7326=3T#
,.DS�;JI+=aa�l�<��/33�017#53	>&m�H��<��.	>��/�201"&'732>=3k)'*F#F�	;*M3&??^4�l�>��/�33017#53	>&m�I��>����<��/3�015#53QQ�yy<��y�>��/3�015#53]]���>�2NV�
��/�017#3V$$N>��+P�,&���FR��*O�*&����P��+R�@&����OO��Q?3&����Y��XQ�
&�.���3����RP&�/���-��/Rb &����/��&Pd+&����Q�l\���/�9901'7'\W-&�n;"nd�?W��
�*)�3 	3�
"
Z
�
���	�	/	G	4_	�	�	
	R:	f�		fT	
�	D
	,
}	
 
�	4uCopyright 2010 The Raleway Project Authors (impallari@gmail.com), with Reserved Font Name "Raleway".Copyright 2010 The Raleway Project Authors (impallari@gmail.com), with Reserved Font Name "Raleway".RalewayRalewayRegularRegular4.026;NONE;Raleway-Regular4.026;NONE;Raleway-RegularRaleway RegularRaleway RegularVersion 4.026Version 4.026Raleway-RegularRaleway-RegularRaleway is a trademark of Matt McInerney.Raleway is a trademark of Matt McInerney.Matt McInerney, Pablo Impallari, Rodrigo FuenzalidaMatt McInerney, Pablo Impallari, Rodrigo FuenzalidaMatt McInerney, Pablo Impallari, Rodrigo FuenzalidaMatt McInerney, Pablo Impallari, Rodrigo FuenzalidaRaleway is an elegant sans-serif typeface family. Initially designed by Matt McInerney as a single thin weight, it was expanded into a 9 weight family by Pablo Impallari and Rodrigo Fuenzalida in 2012 and iKerned by Igino Marini. It is a display face and the download features both old style and lining numerals, standard and discretionary ligatures, a pretty complete set of diacritics, as well as a stylistic alternate inspired by more geometric sans-serif typefaces than its neo-grotesque inspired default character set.Raleway is an elegant sans-serif typeface family. Initially designed by Matt McInerney as a single thin weight, it was expanded into a 9 weight family by Pablo Impallari and Rodrigo Fuenzalida in 2012 and iKerned by Igino Marini. It is a display face and the download features both old style and lining numerals, standard and discretionary ligatures, a pretty complete set of diacritics, as well as a stylistic alternate inspired by more geometric sans-serif typefaces than its neo-grotesque inspired default character set.http://theleagueofmoveabletype.comhttp://theleagueofmoveabletype.comhttp://pixelspread.comhttp://pixelspread.comThis Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: http://scripts.sil.org/OFLThis Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: http://scripts.sil.org/OFLhttp://scripts.sil.org/OFLhttp://scripts.sil.org/OFL�j2-	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a��������������������	����������bc�d�e�������f����g�����h���jikmln�oqprsutvw�xzy{}|��~�����

��� !"��#$%&'()*+,-./012��3456789:;<=>?@A��BCDEFGHIJKLMNOP��QRSTUVWXYZ����[\]^_`abcdefghijklmnop�qrst��u�vwxyz{|}~�����������������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwx��y�����������z{���|}~������������������������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./01234NULLCRuni00A0uni00ADuni00B2uni00B3uni00B5uni00B9AmacronamacronAbreveabreveAogonekaogonekCcircumflexccircumflex
Cdotaccent
cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve
Edotaccent
edotaccentEogonekeogonekEcaronecaronGcircumflexgcircumflex
Gdotaccent
gdotaccentuni0122uni0123HcircumflexhcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJijJcircumflexjcircumflexuni0136uni0137kgreenlandicLacutelacuteuni013Buni013CLcaronlcaronLdotldotNacutenacuteuni0145uni0146NcaronncaronnapostropheEngengOmacronomacronObreveobreve
Ohungarumlaut
ohungarumlautRacuteracuteuni0156uni0157RcaronrcaronSacutesacuteScircumflexscircumflexuni0162uni0163TcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring
Uhungarumlaut
uhungarumlautUogonekuogonekWcircumflexwcircumflexYcircumflexycircumflexZacutezacute
Zdotaccent
zdotaccentuni018FOhornohornUhornuhornuni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCGcarongcaronuni01EAuni01EBuni01F1uni01F2uni01F3Gacutegacute
Aringacute
aringacuteAEacuteaeacuteOslashacuteoslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217uni0218uni0219uni021Auni021Buni022Auni022Buni022Cuni022Duni0230uni0231uni0232uni0233uni0237uni0259uni02B9uni02BAuni02BBuni02BCuni02BEuni02BFuni02C8uni02C9uni02CAuni02CBuni02CC	gravecomb	acutecombuni0302	tildecombuni0304uni0306uni0307uni0308
hookabovecombuni030Auni030Buni030Cuni030Funi0311uni0312uni031Bdotbelowcombuni0324uni0326uni0327uni0328uni032Euni0331uni0335uni0394uni03A9uni03BCuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0462uni0463uni046Auni046Buni0472uni0473uni0474uni0475uni048Auni048Buni048Cuni048Duni048Euni048Funi0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04AD	Ustraitcy	ustraitcyUstraitstrokecyustraitstrokecyuni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0510uni0511uni0512uni0513uni051Auni051Buni051Cuni051Duni0524uni0525uni0526uni0527uni0528uni0529uni052Euni052Funi1E08uni1E09uni1E0Cuni1E0Duni1E0Euni1E0Funi1E14uni1E15uni1E16uni1E17uni1E1Cuni1E1Duni1E20uni1E21uni1E24uni1E25uni1E2Auni1E2Buni1E2Euni1E2Funi1E36uni1E37uni1E3Auni1E3Buni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Cuni1E4Duni1E4Euni1E4Funi1E50uni1E51uni1E52uni1E53uni1E5Auni1E5Buni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E64uni1E65uni1E66uni1E67uni1E68uni1E69uni1E6Cuni1E6Duni1E6Euni1E6Funi1E78uni1E79uni1E7Auni1E7BWgravewgraveWacutewacute	Wdieresis	wdieresisuni1E8Euni1E8Funi1E92uni1E93uni1E97uni1E9Euni1EA0uni1EA1uni1EA2uni1EA3uni1EA4uni1EA5uni1EA6uni1EA7uni1EA8uni1EA9uni1EAAuni1EABuni1EACuni1EADuni1EAEuni1EAFuni1EB0uni1EB1uni1EB2uni1EB3uni1EB4uni1EB5uni1EB6uni1EB7uni1EB8uni1EB9uni1EBAuni1EBBuni1EBCuni1EBDuni1EBEuni1EBFuni1EC0uni1EC1uni1EC2uni1EC3uni1EC4uni1EC5uni1EC6uni1EC7uni1EC8uni1EC9uni1ECAuni1ECBuni1ECCuni1ECDuni1ECEuni1ECFuni1ED0uni1ED1uni1ED2uni1ED3uni1ED4uni1ED5uni1ED6uni1ED7uni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EDEuni1EDFuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE6uni1EE7uni1EE8uni1EE9uni1EEAuni1EEBuni1EECuni1EEDuni1EEEuni1EEFuni1EF0uni1EF1Ygraveygraveuni1EF4uni1EF5uni1EF6uni1EF7uni1EF8uni1EF9uni2002uni2003uni2007uni2008uni2009uni200Auni200Buni2010
figuredashuni2015minuteseconduni2070uni2074uni2075uni2076uni2077uni2078uni2079uni2080uni2081uni2082uni2083uni2084uni2085uni2086uni2087uni2088uni2089
colonmonetarylirauni20A6pesetauni20A9dongEurouni20ADuni20AEuni20B1uni20B2uni20B4uni20B5uni20B8uni20B9uni20BAuni20BCuni20BDuni2113uni2116servicemarkuni2126	estimateduni2153uni2154	oneeighththreeeighthsfiveeighthsseveneighthsemptysetuni2206uni2215uni2219commaaccentf_ff_f_if_f_ls_tW.ss09G.ss11	i.loclTRKa.ss01a.ss02d.ss03j.ss04l.ss05q.ss06t.ss07u.ss08w.ss09y.ss10c_ta.scb.scc.scd.sce.scf.scg.sch.sci.scj.sck.scl.scm.scn.sco.scp.scq.scr.scs.sct.scu.scv.scw.scx.scy.scz.scuni0414.loclBGRuni041B.loclBGRuni0424.loclBGRuni0492.loclBSHuni0498.loclBSHuni04AA.loclBSHuni0498.loclCHUuni04AA.loclCHUuni0432.loclBGRuni0433.loclBGRuni0434.loclBGRuni0436.loclBGRuni0437.loclBGRuni0438.loclBGRuni0439.loclBGRuni045D.loclBGRuni043A.loclBGRuni043B.loclBGRuni043F.loclBGRuni0442.loclBGRuni0446.loclBGRuni0448.loclBGRuni0449.loclBGRuni044C.loclBGRuni044A.loclBGRuni0493.loclBSHuni04AB.loclBSHuni0499.loclCHUuni04AB.loclCHUuni0431.loclSRBzero.lfone.lftwo.lfthree.lffour.lffive.lfsix.lfseven.lfeight.lfnine.lf	zero.subsone.substwo.subs
three.subs	four.subs	five.subssix.subs
seven.subs
eight.subs	nine.subs	zero.dnomone.dnomtwo.dnom
three.dnom	four.dnom	five.dnomsix.dnom
seven.dnom
eight.dnom	nine.dnom	zero.numrone.numrtwo.numr
three.numr	four.numr	five.numrsix.numr
seven.numr
eight.numr	nine.numrperiodcentered.loclCATuni030C.altbrevecombcybrevecombcy.casehookcytailcyhookcy.casetailcy.casedescendercydescendercy.caseverticalbarcy.caseuni03060301uni03060300uni03060309uni03060303uni03020301uni03020300uni03020309uni03020303
apostrophe��T\����������������#$+,, 0��������$+�
�hDFLTcyrlRlatn0�� !"#$%&BGR VBSH �CHU �SRB ��� !"#$%&��	 !"#$%&��
���� !"#$%&4AZE nCAT �CRT �KAZ "MOL ^ROM �TAT �TRK �� !"#$%&��
 !"#$%&�� !"#$%&�� !"#$%&�� !"#$%&�� !"#$%&�� !"#$%&�� !"#$%&�� !"#$%&'aalt�c2sc�ccmp�ccmpdligdnomfracligalnum$locl*locl0locl6locl<loclBloclHloclNloclTloclZlocl`loclflocllnumrrordnxsalt�sinf�smcp�ss01�ss02�ss03�ss04�ss05�ss06�ss07�ss08�ss09�ss10�ss11�subs�sups�!#$1
	
 %"&'()*+,-./02fnv����������������
"*2:BLT\fnv~�����������������@d����48<N`dhlptx����&.2:\x��������LPTX\`dhlpz~��Mc�������������������������������������yz{|������������������������	

M'()*+-./012356789:;=>?GHJKLMPRSUWX[]_{"#&'������������������&'->>LZhv������������� &,28��kd��l}��mv�n�w�o�	e�p
f�qg�rh�s
i�tj�n���~�����n�����������~����������������&,4<FINOQTVYZ\^,>?NO��,NO������
��NO
��NON
,
+�*�)�(�
'�&�%�$��� {QQ {11�{�{yz{|"#&'yz{|"#&'_N_N_N_N_N	�����,->?�����&',>?.�������������������������������������V�
d}vwefghij��O�c����&F4Tn~n~&4FT�T3�&?sF_
�Y�YHX6"(�KQ�KN�Q�N�KKhFhFiFgIbOaQ]V[Y[Z
��<\Y^�,�
NxDFLTcyrl$latn4������kernmarkmkmk (20���\���X��*
`���`���Bh�x�(<�P��J8�l����� � �!4!�&�&�&�''F'�&�&�(J(�+Z,,r,�-�.3B48b9T9�;�=�>,>z>�>�??z?�?�@@@D@�@�@�>,A
A(A^A�A�A�DzD�GVG�G�IpI�I�JJ�JNJpJ�K ������!4 �!4!4!4!4&�&�&�&� �&�(J(J(J(J(JR
R-�-�-�-�8bR�T�=�=�=�=�=�=�>�X:>�>�>�>�?�XxX�YlZJ@�@�@�@�@�@�]@]fA�A�A�A�GV>,GV�=��=�]�^� �>z �>z �>z �>z �_ �a�!4>�!4>�!4>�a�>�!4>�&�bN&�bN&�bN&�bN&�?�bl?�&�e�&�fd&�f�f�f�&�?�'f�'F@'�@D'�g�hh�'�'�j�&�@�&�@�&�@�k^k|(J@�(J@�(J@�a�>�,A(,A(,k�,rA^,rA^,rl,rA^,�lJ,�ltm�A�-�A�-�A�-�A�-�A�-�A�-�r�3BDz8bGV8b9TG�9TG�9TG�(J�=�!4>�R]f,rA^,�r�?�@�r�!4!4ssxs�&�&�t�u'FuPv^v�!4ww�'F&�&�(Jx:x�yz�{^(J(J{�||�>�|�}A�A�@A�A�@�@�A�>,}J}�GV@�~~DA�A�~DA�@�@�A�>�>�~J~�?�l��@A�GVA��'F@'F@&�@� �>z8b�(��A�A�?�&�'FA�?��=��=�!4>�!4>�(J@�'FA�A�(J@�(J@�GVGVGVA�A�(J�3BDzA� �>�&�?�&�@�,A(,rA^,؂3BDz3BDz3BDz9TG�!4>�!4>ڂD�b(J@�-�A�8bGV8bGV�ڂ|�·$�|���$JJ������8��@D��@DA������`������X�����bA��䜞��������Ȣ��������������~�ԧ򨌪����ܮ������p(J � � ��A�A�A�@@�@�A�>z>z��0�b���������$P����&��/��9��;��<��=��>��[��\��^������������������������������������������&��(��*��8��9��:��;��<��[��]��{����������������������4��B��D��d��f��h�������������������������������@��A��F��G��U��X��������������������������������������%����������������������������
����������������k����&/9��:��;��<��=>��?[��\��]^��_�������9��������������������������&��(��*��,��.��0��2��4��6��8��9��:��;��<��=>?@AB[]9_`{�������������������4��B��D��dfh9�������������������������������2��@��A��F��G��U��X�����������������������
������&(��,��4��6��9;<=>FH��I��J��KL��OT��V��YZ��[��\��]^�����������������������������������������������������������������������������������������������������������������������������������������������������������������������&'()*+-��/��1��3��5��7��89��:;��<C��[\]^_��`��{|�����������������������������������������������������
��
��4>��?��BDE��defghik��z��{��|��}�������������������������������������������3��@A��FG�����������������������������������������������������������������������������������������������&��/��9;<=>F��H��I��J��L��T��V��X��\�����������������������������������������������������������������������������������������������������������������������������2����������������!��#��%��&(*89:<C��[��\��]��^��`��z��{����������������������������������������
����
4?��BDd��e��f��g��h��i��k��{��}�������������������������@F�����������������������������������������������	���������������������;��O[���*��C����������������������D��E���������������������'����������;��=��[��]��*����������������������������������D��E����������������������������������;��[��*��C����������������������D��E���������������������R��������������������&��(��,��/��4��6��8;<=>F��H��I��J��K��L��R��S��T��U��V��W��X��Z��[��\��]��^��_����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%������
������������������������������ !��"#��$%��-��/��1��3��5��7��89��:;��<>��@��B��C��[��\��]��^��_��`��yz���������������������������������������������������������������������������������������������������������	��
����
����������%��'��)��/��1��7��9��>��?��BD
E��d��e��f��g��h��i��k��w��y��z��{��|��}������������������������������������������������������������3��@A��FG��������������������������������������������������������������������������������������������������������������������������������������������������������������<����������&��/��9��;��<��=��>��?��A��t�����������������������������������&��(��*��8��:��<��=��?��A��[��]��{�����������������4��B��D��d��f��h���������������@��F�����H����������&/9��:��;��<��=>��A��q��t��{���������$����������������������&��(��*��,��.��0��2��4��6��8��:��<��[]${��������������4��B��D��dfh$�����������2��@��F��Q��R�����!9��;��<��>��A��t���������&��(��*��8��:��<��]{������������4��B��D��h�����������@��F�����#������9��;��<��>��A��t������&��(��*��8��:��<��]{�����������4��B��D��h�����������@��F�����)����������9��;��<��>��A��q��t���������&��(��*��8��:��<��]{������������4��B��D��h�����������@��F��Q��R�����'������9��;��<��>��A��q���������&��(��*��8��:��<��]{������������4��B��D��h�����������@��F��Q��R������-&��9��;��<��>��������������������������������&��(��*��8��:��<��[��]��{�������������4��B��D��d��f��h�������������@��F�����;������������������"��&��/��9��?��f��q��t{��������������������������������������&��(��*��=��?��A��[��]��{�����������������4��d��f��h�����Q��R��V��Y��]�����,&��9��;��<��>��������������������������������&��(��*��8��:��<��[��]��{�������������4��B��D��d��f��h�������������@��F����� ������9��;��<��>��A��t�����&��(��*��8��:��<��{�����������4��B��D�������������@��F�����;��*������D����
;��O�*������D�����������G����&��9��;��<��>��[��\��^�����������������������������������&��(��*��8��9��:��;��<��[��]{������������������4��B��D��d��f��h�����������������������������@��A��F��G��U��X����������������(��������������$��%��;��A��[��m��n��r��~������������
��*��C��_��`�����U����������������������������&��9��;��<��=��>��?��A��K��X��Y��Z[��\��]��^��_��������������������������������������������!��#��%��&��'��(��)��*��+��-/13578��9��:��;��<��=��>?��@A��B[��]��z��{��|��������������������4��B��D��d��f��h����������������������������������3@��A��F��G��U�����������������������������������������������;��=�������*��U����������������;��=��A��]������������*U�����������������������[������������������C�����U���������������������K������������������������������ ��%��&��(��,��/��4��6��8��F��H��I��J��K��L��R��S��T��U��V��W��X��Y��Z��[��\��]��^��_��o��q����������������������������������������������������������������������������������������
�����������������������������������������������������������������������������������������������������(���������
��
�������������������������������� ��!��"��#��$��%��'��)��+��-��/��1��3��5��7��9��;��>��@��B��C��[��\��]��^��_��`��y��z��|���������������������������������������������������������������������������	��
��������������%��'��)��/��1��7��9��>��?��d��e��f��g��h��i��k��w��y��z��{��|��}�����������������������������������������������������������3��A��G��Q��R��U��V��Y��]��a��b���������������������������������������������������������������������������������������������������������������������������������������������������;��A��[����*��U����������������������������U�����������������U�����������"����AB[��m��r����������������.�C��_��`�����U����������������������������$��;��A��[��m��n��r��~������
*��C�����U�\�������������������������������;��=��A��]������������*U������������������������������������&��/��;��<��=��>��F��H��I��J��L��T��V��X��\]^o��q������������������������������������������������������������������������������������������������������������������������������������������!��#��%��8��9:��;<��[��\��]��^��`��z������������������������
����?��B��D��d��e��f��g��h��i��k��{��}�����������������������������@��AF��GQ��R��U��V��Y��]��a�����������������������������������*������&��;��=��A��]�������������������������������������*[��]��d��f��hU�����������������������;��A[�����������������*��C`�����U�����������������;��=��[��]��n�����
�*��U�����������������������������;��������������������������%��[��]��m��r���������������������9�.�������!��%��)��C�������U�������������������������������������������������������������������������U���������������L�������������������������������� ��%��&��(��,��/��4��6��8��AF��H��I��J��K��L��R��S��T��U��V��W��X��Y��Z��[��\��]��^��_��m��o��q��r������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������'�2����������
�������������������������������� ��!��"��#��$��%��'��)��+��-��/��1��3��5��7��9��;��>��@��B��C��[��\��]��^��_��`��y��z��|��������������������������������������������������������������������������	��
��������������%��'��)��/��1��7��9��>��?��d��e��f��g��h��i��k��w��y��z��{��|��}�����������������������������������������������������������3��A��G��Q��R��U��V��Y��]��a��b���������������������������������������������������������������������������������������������������������������������������������������1������������������������%��A[��]��m��r�����������������*�3�������!��%��B��C�����U�����������������������������(��,��4��6��8��AF��H��I��J��K��L��R��S��T��U��V��W��XY��Z��[��\��^��m��o��q��r������������������������������������������������������������������������������������������������������������������������������������������������������������������(�9�������
������������������������������ ��!"��#$��%'��)��+��-��/��1��3��5��7��9��;��C��\��^��_��`��y��z|���������������������������������������������������������������	��
������������%��'��)��/��1��7��9��>��?��e��g��i��k��w��y��z��{��|��}��������������������������������������������������������3��A��G��Q��R��U��a�����������������������������������������������������������������������������������������������������<������������������������%��A[��]��m��r�����������������������
���������� �0���������!��%��B��C�����U���������������������������������[��m��r��������'������C�����U�������������������y(,46HI��JL��OTV�������������������������������������������������������������]_`�����������

>?hkz{|}��������������������������������������&(��,��4��6��9��:��;��<��=>��Y��[��\��]^���������$��������������������������������������������������������������������&��'��(��)��*��+��,��.��0��2��4��6��8��9��:��;��<��C��[]$_��{��|������������������������������������������4��>��B��D��E��dfh$z��|�����������������������������������2��@��A��F��G��U��X����������������������������������������������
��$��;��A��[��n~�����U��������������������$��;��=��A��B��[��]��b��~�����U�������������������$��;��=��A��[��]������U��������������	;[�����U���������$��;��=��A��[��]�����U���������������������%��;/=6A$Bb��&�6����S�^�.�&���U2�#�&;��<��=��A��O�8�����������U��������
��$��;��=��A��[�����U���������������������U��O����U��
;��A��������`�����U�������$��;��A��[��m��n��r��~��U������������
��$��;��=��A��[�����U���������������������$��;��=��A��B[��]��b~���U�����������������;��=��A��OGU��������
������%��;��=��A���������U���
��;��=��A��[��]���U���������������	;��A�����������U�������	;��A��[���U���������������������%��&��/��9��;��<��=��>��?��A��F��H��I��J��KL��T��V��X��o��q���������������������������������������������������������������������������������������������������������������������������������������������!��#��%��&��(��*��8��:��<��=��?��A��[��\��]��^��`��z��{�����������������������������������
����4��?��B��D��d��e��f��g��h��i��k��{��}�����������������������������@��F��Q��R��U��V��Y��]��a���������������������������������
������%��;��=��A��~���������U�����(��,��4��6��9��;��<��>��F��H��I��J��KL��T��V��Xo��q���������������������������������������������������������������������������������������������������������������������������������������������������!#%&��(��*��8��:��<��\��^��_��`��z{��������������������������������������
��4��>��?��B��D��e��g��i��k��z��{��|��}����������������������������@��F��Q��R��U��a������������������������������������������������%��;��=��A�����������U��;��A�����������U�����s(,46HI��JL��OTV���	��������������������������������������������������
�]	_`��������

>?h	kz{|}�������������������������������O5���;&��;��<��>������������������������������8��:��<��[����B��D��d��f��������@��F�����O3���:;��*�������������D��������������������������������������������$;��=��[��]��*���������������������������������������D��E��������������������������������&��'��(��)��*��+��,��-��.��/��0��1��2��3��4��5��6��7��8��9��:��;��<��=��>��?��F��G��H��I��J��K��L��M��N��OQP��Q��R��S��T��U��V��W��X��Y��Z��[��\��]��^��_������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������X�������������������������������	��
������������������������������������������ ��!��"��#��$��%��&��'��(��)��*��+��,��-��.��/��0��1��2��3��4��5��6��7��8��9��:��;��<��=��>��?��@��A��B��C��[��\��^��_��`��y��z��{��|����������������������������������������������������������������������������������������������������������������	��
������
����������������%��'��)��/��1��4��6��7��9��>��?��B��D��O��T��c��d��e��f��g��i��j��k��w��y��z��{��|��}��������������������������������������������������������������������������������
������������2��3��@��A��F��G�������������������������������������������������������������������������������������������������������������������������������������������������������������������������'������;��<��=��>��A��]���������������*8��:��<��B��D�����������@��F��U�����������������������y��������������$��&��/��89��;��<��=��>��?��A��BF]��^��b�������������������������������������������������������� "$&��(��*8��:��;��<��=��?��A��[��\]��^y{������������������������4��B��D��d��ef��gh��i�����������������������@��A��F��G��T��U��V��W��X��Y��]����������������������������&��'��()��*��+��,-��.��0��1��2��3��45��67��8��9��:��;��<��=��>��?��A��K��XY��[��\��]��^��_��������������������������������������������������������������������������������������������������������������������������������������	�������������� ��!"��#$��%&��'��(��)��*��+��,��.��0��2��4��6��8��9��:��;��<��=��>��?��@��A��B��[��]��_y��z{��|������������������������������������������������4��6��>B��D��T��d��f��h��j��z|��������������������������������������������������
����2��@��A��F��G��UX����������������������������������������$��;��=��A��O[��]������U��������������A����U���4$BGMNOPQb~�����������������
Oc�TU��WX�����7$ABGMNOPQbn~�����������������
Oc�TU��WX������������$��&��'��)��*��+��-��.��/��0��1��2��3��5��7��8��9��:��;��<��=��>��?��A��K��Y��[��\��]��^��_���������������������������������������������������������������������������������������������������������������������������	�������������� ��"��$��&��'��(��)��*��+��,��.��0��2��4��6��8��9��:��;��<��=��>��?��@��A��B��[��]��y��{��|�����������������������������������������������4��6��B��D��T��d��f��h��j������������������������������������������������
����2��@��A��F��G�������������������������������	������������������$����$��;��=��A��B[��\��]��^��b~��������9��;�������������������������A��G��U�����������������5��������������$��%��;��A��L��Od[��^��m��n��r��~�����������������
��*��;��C��_��`�������������������A��G��U�����������������������������$��;��A��O?[��n~�����U���������������((J($;ALBDG3KM3N3O/P3Q/RSUWY
Z[\]^_a$bEj#mnr~�����3�3�3�3��������%��3�3�3�3�3�3�3�3�3�/////
'
)
+
-/13579;>@B|
�3�������������3	3
333%')/179O3c3wy��������3���
����33AGTU6WX6�N������/�,�����3����3�������
;[�����U�������[�������������������C��]���hU���������������������;��=��A��OU���������(��,��4��6��:��F��H��I��J��K��L��T��V��X��Y��Z��[��_������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������!��#��%��'��)��+��,��-��.��/��0��1��2��3��4��5��6��7��>��@��B��\��^��_��`��z��|�����������������������������
����>��?��e��g��i��k��z��{��|��}������������������������2��3��U���������������������������������������������������������������������������������������8		-A3B GMNOPQab!jn�����������������
Oc�TUWX�3����  A'Bb����U���'	A����U���O��������U�����O#����U��4$BGMNOPQb~�����������������
Oc�TU��WX���������$��;��A��OG[��m��n��r��~��U������������;����������$��9��;��<��>��A��[��m��n��r��~���������
&��(��*��8��:��<��C��{��������������4��B��D����������@��F��T��U�\W��X���������������������������e��

$$��;��A'B#GKMNOPQY[��\��]^��a
b"jm��n��r��~�������������������������%')+9��;��B|����
��Oc��������������������A��G��TU
WX�(������
����������4����$��;��A��KY[��\��]^��_m��n��r��~�������')+9��;��>@B|�������������������������A��G��U������������������O��������U�������$��;��=��A��O[�����U�����������������������%��;��=��ABQ����������U��X����;��=��A��O[��]���U���������������
;��A��Or���������U�������H$;��ABGMNOPQYabjn~�����������������������%')+|����
Oc��TU��WX�������C���������������������������������� ��%��&��(,/��46F��H��I��J��K��L��R��S��T��U��V��W��X��Z��[��\��]��^��_��mo��q��r�����������������������������������������������������������������������������������������������������������������������������������������������������������������������9�.����������
����������������������!��#��%��)��-��/��1��3��5��7��9��;��>��@��B��C[��\��]��^��_`��z��������������������������������������������������������������������	��
��������������%��'��)��/��1��7��9��>?��d��e��f��g��h��i��k��w��y��z{��|}���������������������������������������������������3��A��G��Q��R��U��V��Y��]��a��b����������������������������������������������������������������������������������������������������������������������������������������������
;��A��O8[���U��������
;��A��O)���������U���������A��o��q���Q��R��a��������$��A���������������������������T��U��W��X��;��=�������*������������������
U����������,��;��=��[��]��n�����
�*��������������������������������U����������������������������������������������������������������U��V��Y��]�����������������$��A�������������T��U��W��X��C��������������������$��%��;��A��[��m��n��o��q��r��~������������
��*��C��_��`����������������������������������D��E��Q��R��T��U��W��X��a���������������������������$���������������������������E������������������������������
D��E��8������AB[��m��o��q��r����������������.�C��_��`�������������������
DE��Q��R��U��VY]a������������������������������������������������������
D��E����������o��q�����������������������
EQ��R��V��Y��]��a��;��=�������*�������������������
U����������^���������������������������������� ��%��[��]��m��o��q��r�����������������������9�.�������!��%��)��C����������������������������������������

E����Q��R��U��V��Y��]��a��b���������������������������������������������1����������;��=��A��B]������������*����������������������������D��U��V��Y��]�������������������������Ao��q�������������������
DE��Q��R��a��������$��;��A��[��n~����������E��T��U��W��X�������������� ��������$��;��=��A��B[��]��b~�������������������E��U�����������������������$��A����������E��T��U��W��X����A��o��q����Q��R��a����������$��A������������E��T��U��W��X����������$��;��=��A��[��]o��q�������������E��Q��R��T��U��W��X��a������������������������ABo��q���������Q��R��V��Y��]��a��b����o��q�����Q��R��a��\������$��;��=��A��[����������T��U��W��X�������������������������$��;��=��A��[��]o��q�����������Q��R��T��U��W��X��a��������������������;��=��A��[��]���������T��U��W��X���������������$ABb����
TU��WX����U��������$��;��=��A��[����������T��U��W��X�����������������
a�������������������������������� ��%��A
[��]��m��o��q��r�������������������������
���������� �0���������!��%��B��C����������������������������������������DE��Q��R��U��V��XY��]��a��b�����������������������������������������A��o��q�����������Q��R��V��Y��]��a��;��=��A��U��������
;��A��O&���������U�������O/��������U�����O>����U���������C����������������������
�����������%��F��G��H��I��J��K��L��M��N��O��P��Q��R��S��T��U��V��W��X��Y��Z��[��\��]��^��_������������������������������������������������������������������������������������������������������������������������������������������������������������������
����������������������!��#��%��'��)��+��-��/��1��3��5��7��9��;��>��@��B��C��\��^��`��z��|�����������������������������������������������������������������������������	��
������
����������������%��'��)��/��1��7��9��?��DO��c��e��g��i��k��w��y��{��}���������������������������������������������������������3��A��G�������������������������������������������������������������������������������������������������������������������������������������������������;��O[���*��C����������������������D��E�������������������������%����������C�����������������������
D�������	�������A��������������������%��;/=6A$Bb�� �/����L�W�'� ���U2�#�&����U��6������������������������������ %��&��(��,��/��4��6��8��AF��H��I��J��K��L��R��S��T��U��V��W��X��YZ��_��m��o��q��r�����������������������������������������������������������������������������������������	�����������������������������������������������������������������������������������������������$�(����������
�������������������������������� ��!��"��#��$��%��')+-��/��1��3��5��7��>��@��B��C��[��\��]��^��_��`��y��z��|�����������������������������������������������������������������������	��
������������%��'��)��/��1��7��9��>��?��d��e��f��g��h��i��k��w��y��z��{��|��}���������������������������������������3��Q��R��U��V��Y��]��a��b���������������������������������������������������������������������������������������������������������������������������������v����������&��/��9��;��<��=��>��?��A��FK��[��\��]��^����������������������������������������������������&��(��*��8��9��:��;��<��=��?��A��[��\]��^{�����������������������4��B��D��d��ef��gh��i����������������������������@��A��F��G��U��V��Y��]�������������������������������������������������$��'(��)*+,��-.01234��56��78��9��:��;��<��=��>��?��A��K��Y��[��\��^�������������������������������������������������������������������������������������	���������� ��"��$��&��'��(��)��*��+��,��.��0��2��4��6��8��9��:��;��<��=��?��A��_��y��{��|�������������������������������������4��6>��B��D��Tjz��|�������������������������������������������
��2��@��A��F��G��T��U��W��X�����������������������������������������:��?������������������,��.��0��2��4��6��=��?��A���2��U��OG����U��:��?������������������,��.��0��2��4��6��=��?��A���2��U��
;��<��=��A��O[8�����������U���������������������%��&��/��9��;��=��>��?��AF��H��I��J��L��T��V��o��q�����������������������������������������������������������������������������������������������������������������������������������������&��(��*��:��<��=��?��A��[��\��]��^��`��{�����������������������������������
��4��?��B��D��d��e��f��g��h��i��k��{��}������������������@��F��Q��R��U��V��Y��]��a��b���������������������������������������&��/��9��;��=��>��?��A��F��H��I��J��KL��T��V��X��o��q���������������������������������������������������������������������������������������������������������������������������������������������!��#��%��&��(��*��:��<��=��?��A��[��\��]��^��`��z��{����������������������������������
����4��?��B��D��d��e��f��g��h��i��k��{��}��������������������@��F��Q��R��U��V��Y��]��a����������������������������������������������%��&��/��9��;��=��>��?��A��F��H��I��J��KL��T��V��X��o��q���������������������������������������������������������������������������������������������������������������������������������������������!��#��%��&��(��*��:��<��=��?��A��[��\��]��^��`��z��{�����������������������������������
����4��?��B��D��d��e��f��g��h��i��k��{��}��������������������@��F��Q��R��U��V��Y��]��a���������������������������������n����������$��(��,��4��6��9��:��;��<��>��A��m��n��o��q��r��~�����������������������������������������������������������������&��(��*��,��.��0��2��4��6��8��:��<��_��{��������������������4��>��B��D��z��|���������������2��@��F��Q��R��T��U��W��X��a��������������������������������������G����$��&��9��:;��<��=��>��A���������������������������������������&��(��*��,.02468��:��<��[��]��{�������������4��B��D��d��f��h�������������2@��F��U��X��������������������@������$��&��9��;��<��>��A��o������������������������������&��(��*��8��:��<��[��]{�������������4��B��D��d��f��h�����������@��F��T��U��W��X��a��������������������������T����������$��&��/��89��;��<��=��>��?��A��Bb������������������������������������ "$&��(��*��8��:��<��=��?��A��[��]��y{�����������������4��B��D��d��f��h����������������@��F��T��U��W��X�����������������������)��9��;��<��>��Ao��q�������&��(��*��8��:��<��{�����������4��B��D����������@��F��Q��R��U��a��b��������������D����������&��/��9��=��>��?��o��q�������������������������������������&��(��*��:��<��=��?��A��[��]��{����������������4��B��D��d��f��h�����@��F��Q��R��U��V��Y��]��a��b�������������������8������$��9��:��;��<��>��A���������������������&��(��*��,��.��0��2��4��6��8��:��<��]{�����������4��B��D��h�����������2��@��F��T��U��W��X�������������;��A��U��7��&��9��;��<��=��>��?��A��������������������������������&��(��*��8��:��<��=��?��A��[��]��{�������������4��B��D��d��f��h��������������@��F��U�������H����(��,��4��6��9��>��o��q����������������������������������������������&��(��*��:��<��_��{���������������������4��>��B��D��z��|���������@��F��Q��R��U��a������������������������q����������$��(��,��4��6��9��:��;��<��>��A��m��n��o��q��r��{��~�����������������������������������������������������������������&��(��*��,��.��0��2��4��6��8��:��<��]_��{��������������������4��>��B��D��hz��|���������������2��@��F��Q��R��T��U��W��X��a��b������������������������������������������$��;��=��A��Bb���U�����������������������G����������&��/��9��;��<��=��>��?��A��Bb���������������������������������&��(��*��8��:��<��=��?��A��[��]��{����������������4��B��D��d��f��h���������������@��F��U��V��Y��]������������������&������$��&��;��=��A��Bb����������������������������[��]��d��f��hU�����������������������c��$��(,469��:��;��<��>��A�����������������������������������&��(��*��,��.��0��2��4��6��8��:��<��_{���������������4��>B��D��z|������������2��@��F��T��U��W��X��������������������������7��&��9��;��<��=>��A������������������������������&��(��*��8��:��<��[��]{�������������4��B��D��d��f��h�����������@��F��U��X�����������������<����������%��&��/��9��=?��o��q����������������������������������&��(��*��=��?��A��[��]��{�����������������4��d��f��h�����Q��R��U��V��Y��]��a��b�����������������<����&��/��9��;��<��=��>��?��A��������������������������������������&��(��*��8��:��<��=��?��A��[��]��{����������������4��B��D��d��f��h��������������@��F��U��������u������������%��&��(��,��/��4��6��89��=��>��?��o��q��~���������������������������������������������������������������������������� "$&��(��*��:��<��=��?��A��[��]��_��y{���������������������������4��>��B��D��d��f��h��z��|�����������@��F��Q��R��U��V��Y��]��a��b������������������������������v������������%��&��(��,��/��4��6��89��=��>��?��o��q��~���������������������������������������������������������������������������� "$&��(��*��:��<��=��?��A��[��]��_��y{���������������������������4��>��B��D��d��f��h��z��|�����������@��F��Q��R��U��V��Y��]��a��b������������������������������H��(��,��4��6��9��>��o��q��~��������������������������������������������&��(��*��:��<��_��{���������������������4��>��B��D��z��|���������@��F��Q��R��U��a�������������������������p������������ %��&��(,/��469��=��>��?��o��q��~��������������������������������������������������&��(��*��:��<��=��?��A��[��]��_{���������������������4��>B��D��d��f��h��z|����@��F��Q��R��U��V��Y��]��a��b������������������������%��9��;��<��>��o��q�����&��(��*��8��:��<��{������������4��B��D����������@��F��Q��R��U��a������������
��������A��V��Y��]��������������A��q��t�����Q��R����������q�����Q��R�����A��t���������������"��A	f��q��{��������Q��R��V��Y��]���������������	��������A��V��Y��]�����c��_	 ""%AFa8eeTggUjjVooWqqXttY{{Z[��\������C�[`y|��"��$��(��-��/��2��5��6��9��<��>��@��CXY
_d%%i01j47l>?pBBrDEsKKuMMvOOwTUx``zcm{pp�ww�y}�����������������������������������������������
��23�@A�FG�QR�TY�ac�||�������������������������������������������	(` 4;4��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
���X��������������������������������������������������������������������������������������������	�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������,,0����������$$2����������������������������������������������������������������������������������������������������������������������������������������������44')'..	+
&
(/& %0)31	




&	
	
	
	
((+   





%%%	+!!","9	,,!!#$#&
$$
!:-78"#78	
--"#( %
))56'56'01/****22"			$$
#
3))%%	"



&('						!

			

"



	!

"#
	-#

./0,  12
,
3$
 $$
		!

*+*+&'#

 (g &&(*,46:<<>?FZ\\1^_2oo4qq5{{67��8��O��U��e��k������C�[`�y|��������������������
��������������������(�*
7E*1G47O>?SBEUKKYMMZOO[TU\``^cm_ppjrskwwmy}n��s��t��u��v��w��x��|��}���������������������
��23�@A�FG�QR�TY�ab�����������������������������������������������4~DY|���������������������$*06<BHNTZ`flrx~��������������������� &,28>DJPV\bhntz����������������������
"(.4:@FLRX^djpv|���������������������$*06<BHNTZ`flR�\�y�wX�fecQ�Q6q�ys�rrc|�|�o�Kz��N#c������x���w�wc0�G:�;3�3z���z�
�E�FK�;	"�*	-7	L	77)	,s-	9�##m�p��	���	�(	")	��)m*�	k�	����	��"	�*�		v�	��! I��	m	m	R�=����|�<��h>�C�+.��j�	�	�	�	�*				��O			q�&	%	%
|�{c�Z�Zq�}q�o�pp�<M�M���z�z>�>5�5+�+}�}��0�O�	"	Y&()*,-./01234789:<>?FHIJLMNPQRSTWXYZ\^_n~����������������������`lm�����������������������$+ ���������������������$*06<�G	�	�	�	�	Q	�.	|	��	��	B	|�Q�[�����/�	�	�	�	�	�	�	�	:.J
Q�W��W��h����������� &,28Q�[������*06<BHNTZ`flrx~�����s�s���������Q���.�{���B����y�����p����������
��$+��$+^djpv|������������������G	�	�	�	�	Q	�.	|	��	��	B	�	�	�	�	�	�	�	�	"|���|�դ'��^#�+tvfonts/raleway/Raleway-Bold.ttf000064400000501630151215013470012346 0ustar00 FFTM�����|GDEF2�,����GPOS��k�\�GSUB���l�OS/2�gN�`cmap^-R���cvt ��)��fpgm��Z��gasp��glyf8�C�2� �head��,6hhea�d$hmtx�����locaN?��*@\maxp�\� nameB��JS,posta�1�a<#�prepO(�(���r�_<����^#�+tv�6�1h��O�6�1--in/��Qe��XK�X^27��P [NONE�
����� �� 
`2M�3W�=�%z"#�(�=6"5Y3�/�:�:�:�f1�,4&.;*_.1\,M �EG �>=�"M*��J��JYJ>J� �JJ��JHJaJ�J�oJ��Jek�@�����s<R}<.I'�6�/>z=4�Wrz\=�=��.==<�=\=^z=z�=��j8&	G&�=*O=278�1VP'!3(.�Q+�MI+�(�#d;[:I+�<(�;���/�M�#�:F* �$�:s � �����������YJYJYJYJJ������J������4��@�@�@�@�\J.=>>>>>>�4WWWW��=������e\=^^^^^�6^j8j8j8j8&Y=&�>�>�>�4�4�4�4�J���YJWYJWYJWYJWYJW� z� z� z� z�J\=�\�������������3�"J�=	J=�����J.=.=HJ=<HJ=<HJ=<HJ�<R��X���J\=�J\=�J\=\���J\=�^�^�^=��J�=�J�=�J�=e�e�e�e�k�k����@j8�@j8�@j8�@j8�@j8�@j8G�&�s�s�s��$�^�@j8?J�Js3JMJB<�JJa=� z�^4J�Js� z�>����^�>�>YJWYJW���������^�^�J��J�=�@j8�@j8e�k��^�^�^�&���W�=�=��/��qqQ�<�=�=QH!�2"?�n!//<!2M�!!22M=?!<2�&t=�YJYJ�L�eJ���L��L�O���J��L�JLYJ/]'�O�O�L�aJ�J��LoJ�k��;����J�<�JJ��JxL�$�J�7>n06=�=xWX�e=e=:=S�=[=^P=z=4�&�e=%.Z=�=j�==@#:=1!WWg���=A��=�����GU=f��:=e=&O=�
.��'r�]�H	W�E�M�SzCL�=0��J)=0h]'��L?=�Jq=�-�qAJ�=�J=XJ�=b)j0�4k��&	���"�?���<A.�<7.�J\=|��$�J/X�S+=�o�J[=%TE�<.�TE�=�>�>���YJW�W�W/X]'�`$����Oe=�Oe=�^�]�]�$@#��&��&��&�<%.L�=�J�=@���	R)�"�S�zG�T�C�T�F���f���o�4�J��J�YJWYJWYJW� z�J\=�J\=�����HJ=<HJ=(aJ�=�J\=�J\=�J\=�^�^�^�^�J�=�J���e�e�e�e�e�k�k��@j8�@j8GGG�&s���=�>�>�>�>���>�>�>�>�>�>�>�>YJWYJWYJWYJWY*WYJWYJWYJW3�J�=�^�^�^�^�^�^�^�^�^�^�^�^�@j8�@j8�@j8�@j8�@j8�@j8�@j8�&�&�&�&Z����d�:�:[:�:�:�8�6�:�8�5�:�#�*kMZ:�(�=�=f#f:�6����"�� ��L �����"�� �: a ,]&OJ~(�%!� ho
� 	�k)R$�@EI:�S+=>&`#� �� ��=^t� 3 >j���:�(e�5�K�2�C3�=�8�?�aI
� �=5{z�=?z{_8d
'�QTDQ zDD�Dl �DD�RD�D�D�D� (D� RD&�<S�@A2!��
:>J]'�]'�\B6zX�j8j8j8.=&
\=�=�8�8�728��=4�4n%�*�+`)I!J9$_.3"\,_(�L �����"�� ��M �����"�� ��* �����"�� ��:/("j��2!!!��9
�����d
~~��������-37Y����$(.15����_cku�)/	!%+/7;IS[io{������       " & 0 3 : D p y � � � � � � � � � �!!! !"!&!.!T!^""""""""+"H"`"e%�����
 ����������*07Y����#&.15����bjr�$. $*.6:BLZ^lx������         & 0 2 9 D p t � � � � � � � � � �!!! !"!&!.!S![""""""""+"H"`"d%��������������������l�j�e�a�S�Q�N�-�����������������������|��
�����������������~�x�t�����������z�x�r�p�n�f�b�Z�X�U�O�N�F�C�?�>�<�;�:�7�.�-�(��������������������������u�s�j�i�f�_�;�5��������s�W�@�=�����
	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abc��������������������������������Ztfgk\z�rm�xl����u��iy�����n~����ep�D��o]d���QRWXTU���<c|ab��[{VY^������������������s���|���@J������������~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSQPONMLKJIHGF(
	,�
C#Ce
-,�
C#C-,�C�Ce
-,�O+ �@QX!KRXED!!Y#!�@�%E�%Ead�cRXED!!YY-,�C�C-,KS#KQZX E�`D!!Y-,KTX E�`D!!Y-,KS#KQZX8!!Y-,KTX8!!Y-,�CTX�F+!!!!Y-,�CTX�G+!!!Y-,�CTX�H+!!!!Y-,�CTX�I+!!!Y-,# �P��d�%TX�@�%TX�C�Y�O+Y#�b+#!#XeY-,�!T`C-,�!T`C-, G�C �b�cW#�b�cWZX� `fYH-,�%�%�%S�5#x�%�%`� c  �%#bPX�!�`#  �%#bRX#!�a�!#! YY���`� c#!-,�B�#�Q�@�SZX�� �TX�C`BY�$�QX� �@�TX�C`B�$�TX� C`BKKRX�C`BY�@���TX�C`BY�@��c��TX�C`BY�@c��TX�C`BY�&�QX�@c��TX�@C`BY�@c��TX��C`BY�(�QX�@c��TX��C`BYYYYYYY�CTX@
@@	@
�CTX�@�	�
��CRX�@���	@��CRX�@��	@���CRX�@��	@�@�	YYY�@���U�@c��UZX�
�
YYYBBBBB-,E�N+#�O+ �@QX!KQX�%E�N+`Y#KQX�%E d�c�@SX�N+`!Y!YYD-, �P X#e#Y��pE�CK�CQZX�@�O+Y#�a&`+�X�C�Y#XeY#:-,�%Ic#F`�O+#�%�%I�%cV `�b`+�% F�F`� ca:-,��%�%>>��
#eB�#B�%�%??��#eB�#B��CTXE#E i�c#b  �@PXgfYa� c�@#a�#B�B!!Y-, E�N+D-,KQ�@O+P[X E�N+ ��D �@&aca�N+D!#!�E�N+ �#DDY-,KQ�@O+P[XE ��@ac`#!EY�N+D-,#E �E#a d�@Q�% �S#�@QZZ�@O+TZX�d#d#SX�@@�a ca cY�Yc�N+`D-,-,-,�
C#Ce
-,�
C#C-,�%cf�%� b`#b-,�%c� `f�%� b`#b-,�%cg�%� b`#b-,�%cf� `�%� b`#b-,#J�N+-,#J�N+-,#�J#Ed�%d�%ad�CRX! dY�N+#�PXeY-,#�J#Ed�%d�%ad�CRX! dY�N+#�PXeY-, �%J�N+�;-, �%J�N+�;-,�%�%��g+�;-,�%�%��h+�;-,�%F�%F`�%.�%�%�& �PX!�j�lY+�%F�%F`a��b � #:# #:-,�%G�%G`�%G��ca�%�%Ic#�%J��c Xb!Y�&F`�F�F`� ca-,�&�%�%�&�n+ � #:# #:-,# �TX!�%�N+��P `Y `` �QX!! �QX! fa�@#a�%P�%�%PZX �%a�SX!�Y!Y�TX fae#!!!�YYY�N+-,�%�%J�SX���#��Y�%F fa �&�&I�&�&�p+#ae� ` fa� ae-,�%F � �PX!�N+E#!Yae�%;-,�& �b �c�#a �]`+�%�� 9�X�]�&cV`+#!  F �N+#a#! � I�N+Y;-,�]�	%cV`+�%�%�&�m+�]%`+�%�%�%�%�o+�]�&cV`+ �RX�P+�%�%�%�%�%�q+�8�R�%�RZX�%�%I�%�%I` �@RX!�RX �TX�%�%�%�%I�8�%�%�%�%I�8YYYYY!!!!!-,�]�%cV`+�%�%�%�%�%�%�	%�%�n+�8�%�%�&�m+�%�%�&�m+�P+�%�%�%�q+�%�%�%�8 �%�%�%�q+`�%�%�%e�8�%�%` �@SX!�@a#�@a#���PX�@`#�@`#YY�%�%�&�8�%�%��8 �RX�%�%I�%�%I` �@RX!�RX�%�%�%�%�%�%I�8�%�%�%�%�
%�
%�%�q+�8�%�%�%�%�%�q+�8�%�%����8YYY!!!!!!!!-,�%�%��%�%� �PX!�e�hY+d�%�%�%�%I  c�% cQ�%T[X!!#! c�% ca �S+�c�%�%��%�&J�PXeY�& F#F�& F#F��#H�#H �#H�#H �#H�#H#�#8�	#8��Y-,#
�c#�c`d�@cPX�8<Y-,�%�	%�	%�&�v+#�TXY�%�&�w+�%�&�%�&�v+�TXY�w+-,�%�
%�
%�&�v+��TXY�%�&�w+�%�&�%�&�v+�w+-,�%�
%�
%�&�v+���%�&�w+�%�&�%�&�v+�TXY�w+-,�%�%�%�	&�v+�&�&�%�&�w+�%�&�%�&�v+�w+-,�%�%J�%�%J�%�&J�&�&J�&c��ca-,�]%`+�&�&�
%9�%9�
%�
%�	%�|+�P�%�%�
%�|+�PTX�%�%��%�%�
%�	%��%�%�%�%��%�%�%����v+�%�%�%�
%�w+�
%�%�%����v+�%�%�
%�%�w+Y�
%F�
%F`�%F�%F`�%�%�%�%�& �PX!�j�lY+�%�%�	%�	%�	& �PX!�j�lY+#�
%F�
%F`a� c#�%F�%F`a� c�%TXY�
& �%:�&�&�& �:�&TXY�& �%:��# #:-,#�TX�@�@�Y��TX�@�@�Y�}+-,��
��TX�@�@�Y�}+-,�TX�@�@�Y
�}+-,�&�&
�&�&
�}+-, F#F�
C�C�c#ba-,�	+�%.�%}Ű%�%�% �PX!�j�lY+�%�%�% �PX!�j�lY+�%�%�%�
%�o+�%�%�& �PX!�f�hY+�%�%�& �PX!�f�hY+TX}�%�%Ű%�%Ű&!�&!�&�%�%�&�o+Y�CTX}�%��+�%��+  ia�C#a�`` ia� a �&�&��8��a iaa�8!!!!Y-,KR�CSZX# <<!!Y-,#�%�%SX �%X<9Y�`���Y!!!-,�%G�%GT�  �`� �a��+-,�%G�%GT# �a# �&  �`�&��+����+-,�CTX�KS�&KQZX
8
!!Y!!!!Y-,��+X�KS�&KQZX
8
!!Y!!!!Y-, �CT�#�h#x!�C�^#y!�C#�  \X!!!��MY�� � �#�cVX�cVX!!!��0Y!Y��b \X!!!��Y#��b \X!!!��Y��a���#!-, �CT�#��#x!�C�w#y!�C��  \X!!!�gY�� � �#�cVX�cVX�&�[�&�&�&!!!!�8�#Y!Y�&#��b \X�\�Z#!#!�Y���b \X!!#!�Y�&�a���#!-@�?4>U>U=(�<(�;'�:'�9'�8&�7%�6%�5$�4$d3#�2#�1"�0"�/!�. �-�,�+�*�)�!� �����@�[@�[@�[@�[@�ZKUKUYY
KUKUYY2UK
UKU2UYp
YY?_����Y?O_�	dUdUYY_�@@���T+K��RK�	P[���%S���@QZ���UZ[X��Y���BK��SX�BY�CQX��YBs++++s+s++s+++++++++++++++++++++++++++++++++++++++++++++++�
�;�������+���
��'%(����J�222222Pj�6�0Rv�����Jx�:|��V���:�$b�� Ff���		:	R	z	�	�

`
�
�>\���0Hbr��
6
r
�H���"Hl��*v��8l���&Vz���$$>��P��08�@Vf��:z��Tdl������$6J�������� Zl~�����$6HZ���&8L���.>N^p���$6\����   Z l ~ � � � � � � � �!! !2!D!T!f!z!�""("8"J"\"n"�"�"�"�"�"�"�"�###&#:#L#^#p#�#�#�#�$$ $2$B$N$`$r$�$�$�$�$�$�$�%
%%.%B%V%b%v%�%�%�%�&&&&&:&L&^&p&�&�'''"'4'F'X'�(*(<(L(`(t(�(�(�(�(�(�(�(�)))").)@)L)t)�)�)�)�)�***,*@*R*d*p*|*�*�*�*�*�*�*�+++0+@+�+�+�+�,,$,�,�-^-j-v-�-�-�-�-�-�-�-�-�-�...*.�.�.�.�.�.�///,/</N/`/r/�/�/�/�/�/�/�000$060H0X0j0|0�0�0�0�0�0�1
1"1:1R1j1�1�1�1�222"2*2>2^2~2�2�2�2�2�2�2�2�2�333<3D3X3l3�3�3�3�444D4r4�4�4�4�55&565N5d5�5�5�5�5�66b6�6�6�6�7<7N7�7�7�7�7�88L8�8�8�8�8�8�99929j9r9�::$:6:`:�:�:�:�:�:�:�:�;;T;\;�;�;�;�<4<p<�<�=<=x=�=�>>(>\>d>�>�???B?l?�?�?�?�?�?�@@2@�@�@�@�AA*A^A�A�BBXB�B�B�CCCXC`ChCtC|C�DD<DND`DpD�D�E
E@ErEzE�E�E�E�FF<FtF�GG(G@GdG�G�H
HVH�H�II<IpI�I�J
J>JpJ�J�J�J�K$KhK�L.L�L�M M4MHMPMpM�M�NN>NpN�N�N�N�OO<ODO�PP~P�P�QQQ^Q�Q�Q�Q�Q�Q�RR@RrR�R�R�R�R�R�R�R�R�S
SS"S*S<SNS`SrS�S�S�TT*T:TLT^TpT�T�UU0UBUTUfUxU�U�U�U�U�U�U�VVV*V<VzV�V�W<WnW�W�XHXTX`XhXpXxX�X�X�X�X�X�X�X�YY&Y<YPYdYxY�Y�Y�Y�Y�ZZZ*Z:ZFZZZfZzZ�Z�Z�Z�Z�Z�[[[&[8[L[`[t[�[�[�[�[�\\\2\J\^\r\�\�\�\�\�\�\�]].]F]b]~]�]�]�]�]�]�^^0^B^T^f^x^�^�^�^�^�^�^�_b_n_�_�_�_�_�_�_�```0`D`Z`v`�`�`�`�`�`�aaa,aHa\apa�a�a�a�a�a�a�bbb,b@bTbpb�b�b�b�b�b�ccc"c6cJc^crc�c�c�c�c�c�ddd0dBdTdddvd�d�d�d�d�d�d�e
ee.e@eRebete�e�e�e�e�e�e�fff"f2f2f2f2f2f2f2f2f:fJfZfjfrf�f�f�f�f�gg.gZg|g�hPhbhnh�h�h�ii.iri�i�j<j�j�j�k0k|k�k�l6lLl�l�mVm~m�nn�oo�o�pp:p�p�q>q�q�q�r4rtr�r�sNs�s�t:t|t�u&u6uFuVufu�vv*vLvxv�v�v�v�wDwxw�w�x xFxnx�x�yyjy�zRz�{ {n{~{�|$|p|�|�|�}}P}|}�~(~`~�~�6R�����(�N�n���ށ*�`���ʁ���F�l�����ڂ��J�R�Z�b�n�v�Ą��X�������Ƅ΄��:���܆�L�l�t�|���؇�F���ވ�N�����*�~�����������������ƉΊ�6�t����*�x����:�z����.�V�����d�����Ҏ��:�T�x�������Џ܏�����$�0�H2.�%#!"&543!24#!"3!27.!�@�4��

a�i4�
���8��
��iW��@
rr++23/01353W����>����=�L���?3�20153353=r+r�����%��?@		?3?399//333333333301#3##7##7#537#537337337#�� ��.l/x-l.p�!z�/l0x.l/z�� w!��d����d�^����牉"��S/>@@ .26:!
::++!!	?3/33332?3/33333901%3#773.#"#".'732654.'.54>32 CC	09CC�%5> 89$H6Fg7*J_45ka)=	.AO(8:.S7DZ,FvH2YN@��#���
t*&"1OA9Q2)w	&# $/H6Ic3$#����/?E)@@EE8((0 	rCBBr+22/32/3+22/32/301".54>32'2>54.#"".54>32'2>54.#"		�.J--J..K,,K.    �.J--J..K,,K. !! �%=����)E**E((E**E)C&&&'�(E*+D))D**E)C&&'&
IV6����(����<@,;	$	r3	r?+2+2901!.54>3232>53#".54>7>54&#"��*33Y72U6/N1$;! 9#+Q@%m:b|CIl;4P(,< %!+&�b-A63M*#F4/L@,10*MlC_�g6;`88TA''!-)�W=�����?�0153=r���"����
//01467."V?f+)E6b)E([e�j+Rgn3P�]1?������//01'>54.'7(D*b7D)*g>V[C��?1]�P3ngR+j�3�%� @
		�?�2923017'7'37'K/GIGHF/4-.G:MM:G"KK/�v
�	/3333301##5#5353vgyggy�lqqlqq:������/�99017#53I*t)sw��w:�iO�/20175!:/�yy:��
�r+201353:n�����rr++01	#�����:�1��5U�r
r+2+201#".54>324.#"32>5CuJJuCCuJJuC�8$%88%$7 %X�NN�XX�OO�X6Q..Q66P..Q,�;@
rr+23+22/301%!53#52>73�j�	&0033%�yyy/} 	�>&E)@
r'r+2+2990134>7>54.#"'>32!&#=/)>+()#U/AO-D`3(/2&1-H>7!!b!+L3#6) y�m@.@'r/3+29/3301%#"&'732654&+532654.#"'>32}*>#@uOLu'LI5=@JK=E--JTI_4Dg: 9�1L.>\31/_ %1148d8*$*&^-,P5'F/��;

@
		r/+9/9333015!533#358��O[XX�ܭ�w��Sx�
��k;"@
r/2+29/301"&'732>54.#"#!#>32M| MT-$7 4!!9uR^�
."Cj<Dv�B9P'.6##4�z�:gCGm<.��7�.@'
r/3+9/3301%4.#">327.#"32>".54>327ApG!:,$B-,LM'qCT|C@uPJuE��"<$#<$$;$$<�Ck?#@[0+%T6:[��f�NBpA%=$$;##;$$=%��2G�r+2/01!5!#_������z�:,��0�!3C@''88@0
r+2/39/39901%#".54>7.54>324.#"32>32>54.#"0GvFGuE"3)*FS)(TF+)4 �$, 7"#+ 8"�/--.�Bb7:eA(A/
(4/J32I05)0B!'0 '0A&%$% �f);.@
'r/3+29/30132>7#"&'32>54.#"%2#".54> AqE"9-
%A-,MM'rCT|C@uQIvD#<$$;$$<#$<DCk?$@[0+%T6:\��g�NBpA%=$$;##;$%<%E��
rr+2+2015353Emmmv������G���
@
	?3?3/3301537#53Hn`*u)v���w��w ���@	/3/3901% ���Z ������>�w��/3�20175!%5!>9��9�WW�WW=���@	/3/3901%57'5�Z���������"��$(@
&&%
r+2?33/0174>7>54.#"'>3253z
$!-*+. W?S-&J<$(5#lo� 90	+&$<):0J4 2' )"銊*�n[Uh)@^'1
fEL '�;/2�2|/3�22/339/3012#".'#"&54>324.#"'>3232>54.#"3267#".54>>=.#"326�J�i<!9+$'X3JO7W-(:2-)D%W0AJ!	".VuHFvU/,QrF/H%)Y,K�c9>j�|
<&0$0[1a�\:B;&&%O=7?$8G'?I"`4 '<=FwX0/VuECuX246d�TY�_2��	&$!
��
D@'	
		
	

rr++29/33399<<<<013#'##��B�A��bf�:��%��J��&@rr+2+29/3901%#!!24.+32>32>54.#�>i>��|2I'42=G�%��)�ٸ&#�<Q*�5S-3\^++�*��((����$@ 	r	
r+2�2+2�2014>32.#"32>7#"./Z�Sb�#j:B 4M47M.!D:q_v:L~[3hA}g=VEI(/*DT*/WC'0&A5J&?i�J��
@	rr++23013!2#4.+32>Jt�NV�k�2^CxxD^1�_�bl�XdEi;�,=kJ7�@


rr++29/3301%!!!!!7��+��yy�y�p�J'�	@rr++29/3013!!!!J�����y�p�� ���� &@#""
%r
r	r+++39/3201".54>32.#"3267#5!#qE{]44^~Jd�$ga9-J69L.6c+YO�r8c�MI�b8UFL58&BV03V@%86�`
e��J��@
	rr++9/32301#!#3!������B�:/����J���rr++0133J��:�����
r	r++301732>53#"&'&
B-'2	�4iW0L �	6V<t��P�`4J��@
	rr+2+2901333	#J�*���!��Z��R��u2^�J>��rr++30133!J�j��yJ�@	rr+2+2901!##33��M����ԓ��[�.�l��:J��	@r	r+2+29901#33#Ԋno�s�8�,�;����'@	#
r	r++2301".54>3232>54.#"yN[25]LMZ24]��5M12N45M03M4<g�DG�e;>h�DF�e:h.VC')EU+.UC')DTJY�
@rr++29/3013!2+32>54.+J-1R="8bC��(+��(DT,<lD�g5"%4����'+@

*r
r	r+++3301".54>32'2>54.#"73#yN[25]LMZ24]J2N45M03M45M#��=f�DG�e;>h�DF�e:z)EU+.VB()ET,.VB(���J��@
r
r+2+29/33013!2#'#32>54.+J:1S=!:'�����(+��(DT,-S>����g4 "3��G�2@*".r	r+2+29901.#"#".'732654.'.54>32�%5> 89$H6Fg7*J^55jb)=	.BN(8:.R8CZ,EvH2YN*&"1OA9Q2)w	&# $/H6Ic3$]�@	rr++2301###5!]��OM��My@����@	
r	r++3201".5332>53wUwI"�(B12C'�#Kv9dEj��,SB&'BS+j��I�a7��@	rr++29013#���������"�:��$@
r

r+2+2/2/29013733##37=�QRzZɖ��w}|w���X����'�:*���������@
	r	r+2+29013#'#����������������^h��@rr++29013#5�����������N�2���Q�	@	rr+23+23017!5!!!��%�����h�yh�yR��
��//32013#3R�??(k��kc��rr++01#����L�:�.�����//320153#53.@@�(k6k��'/"��r+2�2013#'�p�n��/��i&��6����/3015!6oyyy/I����/�9013/|7V�w��'8+@!66$/$r
rr+223+2+9/3330174>3254&#"'>32#"&/#".%>=.#"3269fB!D;:+N++4m<p}
()"f54S/F84C*:�3M*
26X""ph�m$,0+K
5
-%$=��\�'@rr
rr+2+++201"&'#3>32'2>54.#"g<^u�[=3T=!%BYZ 5'#=)5)$'
6/[��/6+Lb88bK)r*9+I,.} 
�� @		rr++2301".54>32.#"32>71@fH'C|UUz�8"&?$%>&+"�E]
+Mb6J{JJ<('G/.G)('>#��]�/@+!
rrrr++++332014>323#"&/#".5.#"32><jD:]�#$/c66[C%�
,62%(5'#L{H9,*��m$!14*Jc
}.,:  9*
!��B%!@i"	rr+2+29/]3901".54>32!3267!.#"0?fH'C}UVzA�k'=#(G
sG`�%<%$;%
+Ka6K|KK{G(<'  (>#:(;!!;��@
	r
r++2|?333013#5354>32.#"3#]EE+O5 A ("$���f A_4e0.%f�v�!>"6!@#-
rr
rr++++33301".54>3253#"&'732>='2>75.#"
4W?"$AY6=\uK�TUv*I[3+G+_("+52$'5)J`69bK)7.\�
No;94G%*A3B-1k!}./9 8*=$�@	rr
r+2++29901!#4&#"#3>32$�/)6+
��d;3@$&=<1 ����28#;I'=���
??�2013353=�����U�����<���
r/2+�201"&'732>5353%D: �1Q��[
��8X0��=2�@
	rr
r+2++901!'#373��G��ӎ���F��F���<��@��rr++20133267#"&5<�"
H?E��$f
C>=k$%@rr

r+22++293301!#4&#"#4&#"#3>32>32k�+&'G�+&'G�ydAAI
 c>1="
&>;=1��&?:<1��a37@/69#;J&=$@	rr
r+2++29901!#4&#"#3>32$�,'7,
�y>Q-1?!
&?:1 ��a"/#;J&��A#@	 
rr++2301".54>3232>54.#"/@fG&&Gf@@eH%%Gf�$>'&>%%>&'>$
+Lb67bL++Lb76bL+.G()G.-H()G=�+\'"@$#rrrr+2+++2901"&'#3>32'2>54.#"w=]�u\;5YB%;gp2%(5'$)6
7/���Z.5*Ka8L|Ir-9!8+
 {0�+=&"@rr

rr+2+29++01".54>3253#'2>75.#"2T>!%BZ4<\u�<F/'%*3&$@
+Jd89bJ)7-[�1fr'|&-9 +F*=u@
r
r++?33301"#3>7:u=`�{V0�/,��p6>���+@
rr+2+29901"&'732654.'.54>32.#"�Cz,0/[*'/1#:N'5_@8d)6(H%%+?W,r
,+W&$
$7+4K*#'U

&70NX��w�@

rr+2+2�3301%#".5#53533#3267w07%>%EE�nn(9.-g��g�8��B@
r
rr+2+2+299017332>73#"&/#"&8�,+3+�$-#nBQT�H��<=* E��m!*57i	@	r
r++2901333������n���F @	

r
r+2+2229013#'#37'373��pXVq�~�=[o67o[>�����t�ࠠ�@

r
r+2+2901?3#/#�n
m����q	p������������@	
r+2?3990132>733#"&'H
ϋ�|��1I- f1,�}���#9!�	@	
rr+23+23017!5!!!!�����$�JR\^R��^*����//33013#"&=4&'52>=46;�7�
�y�#
%�k�%^�kO�~��//013Or���w2����//33015323+535467.=2�
�7yk�^%�k�%
#�8�h�
�	/33�220174>3232>53#".#"8 5($96J!7)$;4	�+/"(1#V����
�
?/�201##5܆����>���'��+�)'@%%

$$?3/333?3/333015.54>753.'>7#3W@#7jL<Fr �.$�NW#�,%
xo0L[0DtOqqD?(��(-=nz ;,
(*33����:'@%::(77,3	rr+2+29/3232/3301!!>54.54>32.#">323267#".#"9y��$/ 7^9<n%FN%&&%-,#!>=> F }e�=@%A?@#2Q/81R",&59D(89 	d
	.p�7"2�'//3/301>327'#"&''7&5467'732>54.#"�65E7DE2H6 7I1ED6S+))+�G7C77D2D
E2E0:6E7�././��.@

r
?+29/93�22333013#3##5#535'#5333�Ix$�����"xJ������WCW��W AW4��VQ�~��//9/�01##�rrr�v���v�+����?R!@F=I@MP8 
1'r/3+2901%#".'732>54.#.5467.54>32.#"%>54.#"&'�+DL#(D7)V<!)%B\1
9`:+D4%g	&&1#%L@&�� %#
		& 	�2&7L0!$R	.L3$	9'4V4&+1$'?/,b
��M\|��+���'L@
:2
rD(`	r+2�2+2�201".54>32'2>54.#"7".54>32.#"32>7�P�e88e�PR�h88h�REuY10XvFCtV0/WsM7[B$>\=Np
")!(#	<W6b�NM�a66a�MN�b65-RqDApT//ToB@pU/K#@U2,TC'D:'
",.
&!;$(S��#2+@*-!')$�@�?3�29/93332/301"&5463254&#"'632#"&/'2676=.#"�2FTB1"%&4EPNV
	B	'#!*!SA15B!%=/LJh
U"H'#.N�
$@
	/333/393301%-%#����$���� �mmgn�A�mmgn�;j#�
�/�301#5!5#r����ڮx:�"O�/20175!:��yy+���&6?%@?0446>'
r26`	r+2�2+2�29/3301".54>32'2>54.#"32#'##72654&+�R�e88e�RQ�f99f�QZ�U0VuEEsV..Vs]�)?$$gk\@_�!Z6b�NM�a66a�MN�b64O�ZApU//Tp@AqT0,C$3'
����#! ���<yh��(���	r+2�2014632#"&7327>54&'.#"(;+-::-+;K


q*99*0:<E

;�-@	/3�2/3333/0175!##5#5353;buxuuxll�kk�0"@B D?2�29014>7>54&#"'>32390?*/(/#32L/RT).!(��5G2
"!: G;"/
Nu0,@
&BD?2�29/3301"&'732654&+532654&#"'>32�=\*!1 '9AB::4'916B 2J+.(,42Q('6
H<5"".=)(6��/I���M�,\!@ 	rrr+2+2+299/01332>73#"&/#".'#M�,.2,�%-2A$&	���<=* E��r$&3"��#��c�#@

r+233/39/33301463!####".7%#3#��&Fq3rEg8p5 7=33�y�d�N �� >pM.A%.RU��:����/�01753:n����7� �0@	

BD?33�22301#53#52>53�N '+Q�OO	O��$S����@�?3�201".54>32'32>54.#"�:T,,T::S-,T�'''(S4V12U44U21V4�//-/:.e�
$@

	/333/393301%57'5
57'5e���������߱ngmm�A�ngmm��� ��X�&'c*	� ��l�"392@76613&&%%1499 r+22/392/3/9/333/301!4>7>54&#"'>323#53#52>53		70=).'/"1
2J/OS(, (���N '+Qn=���5F3
#!
:!F<!/ 
N�NNP����IV6����������&'c�	F�+��$(@	$$''(
?3?33/0132>7#".54>7>57#5h"",++-"
W?S.%J<$'3#ln 9/	+'%<):0J4 2' )"銊����&&����/�01����&&����/�01����&&����/�01����&&�v��/�01����&&�l�
�/��01����&&����/�/301����-@


rr+23+99//333301!!!!!!5##������V�"�i�՟�y�y�y��)�����7��&(����J7�&*����/�01��J7�&*����/�01��J7�&*����/�01��J7�&*�a�
�/��01����&.�����/�01��J�&.�6��/�01����)�&.�����
/�01����&�&.����
�/��01��@rr+2+29/3015!!2#4.+32>E��t�NV�k�2^CxxD^13dd���_�bl�XdEi;�,=k��J��&3����/�01������&4����+
/�01������&4�#��(
/�01������&4����.
/�01������&4����(
/�01������&4���
�,(
/��014Y��&@
		/33/33392301%''7'77�TggSfbTbcSb�SggTfcSbcTc������&4��@����&:����/�01��@����&:���/�01��@����&:���� /�01��@����&:���
�/��01����&>����	/�01JH�@



rr++99//33012+#32>54.+f1S=!7cB����(,�F)CT,<lDnƀ��5"3�=���-@%		-r
r+/3+29/33017>54.+532>54.#"#4>32�>Q!3#$&:d@8X3'AJ.Of8u47"1x!
 .�

8W1(I3">+	fH9R3�����&F�e�</�01�����&F���9/�01�����&F�X�?/�01�����&F�5�9/�01�����&F�,
�=9/��01�����&F���KBB/�/301���7IR/@NR%C%%r)118r+223+299//332301".54>32>7.#"'632>32!3267#"&'726767.'.#"%.#"�3Q/9eA >:5*P+)hs>\!_:U{C�f)?%(G
sG`:Js$IQ!>34C)2%<&&=$
+L/2L+


,/UC&$"(K{I
(<'  (>#;1&0b
%	.%%�(<""<(���7&H������B�&J���)	/�01����B�&J���&	/�01����B�&J�v�,	/�01����B�&J�J
�*&	/��01����&����/�01��=	�&��'�/�01�����&����
/�01�����&���
�/��01��D�+3"@(/0.-12,3 ?3?9/9301#".54>32.'332>54.#"'?D)Ke<L|H%CW34[
*FgH�CcA�e#>'(>$$='(>$eo*q'q&s"FoN)@nE2VB%+#/YSO&#ew}t%;"$=$%9!";�=
@4?
B��=$�&S�b�/�01����A�&T���'
/�01����A�&T���$
/�01����A�&T�v�*
/�01����A�&T�T�$
/�01����A�&T�J
�($
/��0160�#@
		/3/333/2015353%5!�qqq�����������kk��A#'+/&@+-,*%&)(//
r''r+22/+22/901".54>32'2>54.#"77'7'73/@fG&&Gf@@eH%%Gf@&>%%>&'>$$>�g8IS1�7?AX
+Lb67bL++Lb76bL+r)G.-H()G..G(l)Vb$4 O��8��B�&Z���!/�01��8��B�&Z���/�01��8��B�&Z�t�$/�01��8��B�&Z�H
�"/��01����&^���/�01=�+>�'@rr
r#r+2+++201#"&'#3>324.#"32>>)H_6-:
��
93;^C#�8'*  '/#7eN."���%2Rd1+I,$�-:����&^�:
�/��01����&&����/�01�����&F�@�9/�01����&&����/�01�����&F�l�@/�01���8��&&�����8&F�>������&(�$��%/�01�����&H���!	/�01������&(����+/�01�����&H�w�'	/�01������&(���%/�01�����&H���!	/�01������&(����*/�01�����&H�w�&	/�01��J��&)����/�01�����&I*�2V+4��@rr+2+29/3015!!2#4.+32>E��t�NV�k�2^CxxD^13dd���_�bl�XdEi;�,=k��}�3(@ !/r
rr%r+2�2++2+29015!4>323#"&/#".5.#"32>T)��<jD:]�#$/c66[C%�
,62%(5'#UOO��L{H9,*��m$!14*Jc
}.,:  9*
!��J7�&*�u��/�01����B�&J�^�&	/�01��J7�&*����/�01����B�&J���-	/�01��J7�&*����/�01����B�&J���&	/�01��J�87�&*�X���8B&J����J7�&*����/�01����B�&J�v�+	/�01�� ����&,����-
/�01���!>�&L���=
/�01�� ����&,����.
/�01���!>�&L���>
/�01�� ����&,���'
/�01���!>�&L���7
/�01�� �+��&,���*��İV+4���!>�&L���;
/�01��J��&-����/�01��=$�&M����/�01��!@


r
r+2+29/33/3015!'#!#3!�2�����BLL��:/����$�@
	rr
r+2++2�299015!#4&#"#3>32)�/)6+
��d;3@$UOO��&=<1 ����28#;I'����K�&.�����/�01����<�&����
/�01����&�&.�����/�01�����&����/�01���&.�����/�01�����&����/�01��3�8��&.����"�8��&N���V+4��J��&.� ��/�01=��r
r++0133=���J����&./��=�<��&NO������&/����	/�01�����<�&����/�01��J�+��&0�����ΰV+4��=�+2�&P�����ΰV+4=2@
	r
r+2+2901!'#373��H��ҏ���G������J>�&1�6��/�01��<��@�&Q�&��/�01��J�+>�&1���	��ΰV+4��<�+@�&Q�E���ӰV+4��J>�&19��<����&Q��V+4��J>�&1{3Y��<��|�&Q{���V+4��G�	@
rr+22/3+2/3017'%3!!M!��j�I�I�<��y����X�@
	rr+23+22301'%33267#"&5!"1"��!
H?E
H�H��$f
C>��J��&3�%��
/�01��=$�&S���/�01��J�+��&3��
��ΰV+4��=�+$&S�����ΰV+4��J��&3����/�01��=$�&S���/�01����$�&S,�.�/�01J�<��@
rr++2/3901#33#"&'732>=Ԋjf�1T1%E: �=�4�28T/[
*=�<#%@rr
r/2+++29901"&'732>54&#"#3>32n&D9 ,'7,
�y>Q-1?!1R�[
4?:1 ��a"/#;J&��8X0������&4����(
/�01����A�&T�^�$
/�01������&4����/
/�01����A�&T���+
/�01������&4���
�,(
/��01����A�&T��
�($
/��01���2%@r)r	rr+2+2+29/3+201%!5#".54>325!!!!2>54.#"� ?L+K|Z03\{I,K=����0J23J./J24Jyyi 1<g�DG�e;1hy�y�)EU,.UB()ET,.VB(���*:C%@C?3r##+r+223+2239/301".54>32>32!3267#".''2>54.#"%.#"-N|GG|N-M>&hDNyF�l'?&*G
oI_6)KBAG('>$$=('>$#?M'<%%;$
GzNN{G7'==D{P
%=$*  )?!5&'5r)G-.G))H.-F)�(<""<(��J��&7����/�01��=u�&W��/�01��J�+��&7�����ΰV+4��=�+u&W����ΰV+4��J��&7����!/�01��=u�&W��/�01����G�&8����3./�01������&X���,/�01����G�&8����9./�01������&X�F�2/�01���7G�&8�����7�&X�]����G�&8����8./�01������&X�F�1/�01���7]�&9�����7w�&Y�@��]�&9����
/�01������&Y�i�@		

rr++9/333015!###5!I�.��O#KK*��My��x�@

r+2?�3333/30175!#".5#53533#3267 %307%>%EE�nn(�PP�9.-g��g���@����&:����/�01��8��B�&Z�Q�/�01��@����&:����/�01��8��B�&Z�\�/�01��@����&:����!/�01��8��B�&Z���%/�01��@����&:����,##/�/301��8��B�&Z���0''/�/301��@����&:���
�/��01��8��B�&Z��
�"/��01��@�;��&:����8�8B&Z�b���&<�U��/�01��F�&\���/�01����&>����/�01����&^�f	�/�01����&>�e�
�
	/��01��Q�&?����
/�01����&_���
/�01��Q�&?����
/�01����&_���
/�01��Q�&?����/�01����&_�A�/�01���� )@&&r!	r+2+29/301".5467!.#"'>32'2>7!qO]2#6C%&E3
�\zFM}\11[~M4S4�y7W;d}A
+G21!/8R/<eDH�e<y-P43P.�<�&@
"r/2+29/33301"&'732>5#5354>32.#"3#�%E: DD+O5 B)"$��2R�[
vgAA_4e0.Fg��6T/�����&4����(#V+4����Ad&T�6���$ V+4��@��$&:�%��V+4��8���d&Z�����V+4J�	&3@r
	#""!& �%r+23��2923?33?3+201%!5!!)!2#4.+32>7#'���%�����`t�NV�k�2^CxxD^1�UUFk`kh�yh�y�_�bl�XdEi;�,=kr?? eeJ��
&3@#""!& �%rr?2+2+23��2923?33013!2#4.+32>!5!!!7#'Jt�NV�k�2^CxxD^1�!�����$�J�UUFk`k�_�bl�XdEi;�,=k�\^R��^�?? ee��U�/9@A@$0669
=<<;@:�?23r+r

!r+2??3+29+2��2923?33014>323#"&/#".5.#"32>!5!!!7#'<jD:]�#$/c66[C%�
,62%(5'#� �����$�K�UUFjajL{H9,*��m$!14*Jc
}.,:  9*
![\^R��^�?? ee��J����&1/H��J�<�&1OH��<�<�&QO=��J����&3/���J�<��&3O���=�<$�&SO\�� ����&,����,
/�01���!>�&L���<
/�01���>��&4�����8A&T����J�&)?���J��&)_�����U�&I_��� ����&,x��'
/�01���!=�&L�x��7
/�01��&Q@,
	

	

			!
?3333332??9/333//9<<<<01'733#'##4632#"&7"32654&rV6}�B�A��bf://:://:i#l�:��%���*11*(11T�����&F'������QKBB/�/3301������&����/�01������&��x�S/�01������&4&�#��,
/�01����A�&����0
/�01����&&���
�/��01�����&F�A
�<@/��01����&&����/�01�����&F�l�=/�01��J7�&*�w�
�/��01����B�&J�_
�)-	/��01��J7�&*����/�01����B�&J���*	/�01�����&.����
�/��01������&���
�/��01���&.�����/�01�����&����/�01������&4���
�+/
/��01����A�&T�_
�'+
/��01������&4����,
/�01����A�&T���(
/�01��J��&7�j�
�#/��01��u�&W�
�/��01��J��&7���� /�01��=u�&W�3�/�01��@����&:���
�!/��01��8��B�&Z�]
�!%/��01��@����&:����/�01��8��B�&Z���"/�01���+G�&8���6��ӰV+4���+�&X���/��ذV+4���+]�&9�����ΰV+4���+w�&Y�i���ӰV+4�����J&4'�����~�0�,,(
/��/�01����A�&T&�J�^��,�(($
/��/�01�����S&4'�������D�((
/�/�01����A�&T&�T�^��@�$$
/�/�01�����S&4'�
�����,@((
/�/�01����A�&T'���^��(�$$
/�/�01����&>�y��	/�01����&^�N�/�01���<��
r/+301"&'732>53
%E9 �2Q�[
��8X0��;%@""rr+2+29/301".'467!.#"'>32'2>7!)V{B�(<#)G
rF`:@fG'B{T%9%��'<
K|H
);'  (>#+Jb7J|Ka"<((<"��=���_��=���`��G���/I����/�901'73�V6}Iw5��
��/3�20152654&#52/::5//1*)15��
�
�/3�201"&5463"3�.;;.51)*1/��US����US��Q}��//01#�r�v�<yh��/3015!<,ySS=���
��/�0153=r#���=���
��/�01'3_"r���Q�~��//01#�r�v���!T'����2\�����5�����?�8��W����/22�2201".#"#4>3232>53+$J-!(%J/Z	*- (/"��!IZ��/I����/�3013/|7V�w/I����/2�01'73�V6}IwUS���/3�9330173'jajEUUuee ??W��@
�/2/2�22/01".#"#4>3232>53+$J-!(%J/Z	*- (/"<yh��/2015!<,ySS!T'�
�
�/3�2012673#"&53�"GI:9JH$�* :LL:,2\���/�01532y\~~M\|��/2�20153353MoQo\wwww�T��
�/3�201'>32'>54&#")1(+!"

�)+0%
5����	/3�2014632#"&7"32654&;./::/.;i�*11*)11U!IZ���/2�23301'73'73cB0hJA/iIw�wUS���/�2923017#'dUUEjaj�?? eeIL���/333�2013'3�i/B�h0B�w�w!T'�
��/3�201"#4632#.�$HJ9:IG"�,:LL: *G����/�99013#57�'q(�?TT?2�����/2�017267>732#*a3?�\!.+2�9����/�01532y�~~M�9|���/3320153353MoQo�wwww=�+�����/�9017#53I'q(�H^^H�7�
/3�201"&'732654&'7�>"-(49�G
%=,*9?�8���/3�2014673.?24*%&'$2;n"D+L&!�E'��
��
/3�2012673#"&53�"GI:9JH$* :LL:,<�]h���/3015!<,�SS2�WL�/30175!2%�PPy�@
rr+222+201!5!����pR���hh^���&��-#@"r,,r+223333+201353.54>323!5>54.#"&�0E&2]|HI|\3&F0���%;*5L//K6+;%fQf:D|a88a|D:fQff
7JS+)O@&&@O)+SJ7
f=�,L!#@ 
r
rrr++2+2+2901332>73#"&/#".'=�,.2,�%-2A$&���<=* E��r$&3"����o
@rr
r++233+201##5!#3267#"&5�K7`G=E��j�tt� f
C>��J7����J7�&�la�
�/��01����#!@rr	r+2++239/301"&'732654.#"##5!!>32�9"!5F%>'(V'��)��*`3In<�		k	9@+9��Quu�:iHpw��L�&�����/�01����'@
r	r+2+29/3901".54>32.#"!!32>7{O�\1.Z�Vd�$k:E!+E3��"7G)"F;qaw>i�DB~f<VEI(/0>$n(F40&A5J&����G�8��J��.����&�&.l���������/����&#@&		rr++29/3333015>?!32#!#%32>54.+%5#�~Lk75gJ���+AV*t&//(sw$V�z���7cDAd9M~s�i<u21L��'@rr++9/3333320133!332#!!%32>54.+L�%�~r|6fJ����s&00(r����ub@c84��p0.��@

rr+2+239/3013#5!!>32#54&#"����$U0r|�=E(LQuu�v�ϿCC����L��&�����
/�01��O��&�����
/�01��������&�|��/�01J�x}�@
rr/++223015#3!3#+� �݈���M�:�����&L��
@rr+2+29/3013!!32#'32>54.+L���wx4fNȵ(00-��w�p^?`7w-+��J��'L��rr++2013!!L����y���x��@

r+2/�23330132>?!3#5!!#&(�^y�R$��*\�i�������dh�^��J7�*�)@rr+22+229/3339901333333####���<�<Ϡ���>�?�pV��������+��+��'��7�-@' r	r+2+29/3901"&'732654.+532>54.#"'>320W�(gP6@?6)UV -1&6Nc(}]Jj;/3<AEvF?@&-8.-i((+#F;H-V=1U\=B[.O��	@	rr+2+29901333#O�X�������:����O��&���
/�01L��@r	r+2+29/39013333	##L�FӚ����D������+������@
	rr+2+2/301!##52>?!�$DgH%6%�Mx��i+w T�z�:��J�2��J��-������4L��@	rr++23013!#!L?����:M����JY�5������(��]�9������@	rr+2+299015326?33#�8
�昿����B7r#��|��5*�#-@-$?�223?�22301!5.54>753'>54.'\@rX35Zq=�=rY43Yr>2T13B�1T23B%@.RqDHqQ,66-QqGFpR-@��2W?/I31W>/H4������=J�y��@	rr/++233015!3!33[���^����M���<Z�@	rr++9/3201!#"&=332673�*@+||�AO#F�ny��?;;�:J��@
rr++332201333333J�يي��M��M�:J�y��@
	rr/++23333015!333333�ˊيي]����M��M�����@
rr++29/33013#5!32#'32>54.+��0�Om:8jL��)33+Tr�8eEDh:p 5!4!JN�@
rr++9/3323013332#'32>54.+3J��Om:8jL��)33+���8eEDh:p 5!4!���;L\�@
rr++9/33013332#'32>54.+L��Om97jL��(43+��8eEDh:p 5!4!$����)@% r		r+2+29/3901".'732>5!5!.#"'>32IDpTr6E'0N78��D66L1&D4m+�jS�Z/1]�)J2A!1%AU/&f%*N<#0#KDW<f�EH�e:J����&!@
rrr	r+2+++29/301".'##33>32'2>54.#"�X�Vl��mY�Uc�SV�_=U,.V;<T,-UJ�]����^�G[�lt�Sz=lEJi:<kFIk:7Z�@

rr+2+29/39013.54>3!##*#35#"7�BK<jG�H
��|z54mK?c9�:����-""/����F0��R�'@ 
	rr+2+29/301"&54>?>32'2654&#"B��"BeB��0H+hJFj;?yX>IH?'=$ =
��`�V69m:1M:19<jFKuBrK><L =+(>#=%@	%r
r+2+29/39013!2#'32>54.+532>54&+=$6C ').:.V;����!�$:!,B
?31?[T#=��r
r++2013!#=[�u�i��^@

r+2/�233301532>?!3#5!73##�Iu��AƎ
�5^I��i��&AB[9����BJD)@r
r+22+229/33399013'3353373#'##5#����)�,������,�*���������������+@%rr+2+29/3901"&'732654&+532>54&#"'>32�Tp l7)/3*)67'*#-eiF7W2!%018`<51%"S 618"@0"@D.2E#=(	@	
rr+2+29901333#=��z����Y��P����=(�&�f�
/�01=$@r	
r+2+29/390133373#'#=�-����+��������@
r


r+22/+2015>?!##&��� 9Tw5`K����=g�O"=�@
r
r+2+2901333##'=�����T���/��S����=@

r
r+2+29/30133353#5#=�Ԇ�����������AT=�r
r+2+2013!##=ֆ�����i��=�+\U����H�@	
rr+23+013#5!#��ӧ�uu�i�@rr+2+29901"&'7326?33�+'ԋ�|��8H�

j$%+	�}���0C$�+��$/%@r/
r%
rr++223+223+015#".54>;5332+3#";2>54.+1Su>?uR�Rv>>uS�&;"":�';!":'��IwEGwH��HwGEwI�@5(F--F''F--F(��]=��K@r	
r/+23+2015!3333�h���J�i��i�.�@

rr+2+9/301!5#"&=3326753a='S^�)+0��
YV��/,
	��=@
r
r+23+2201333333=������i��i���=��g@
r
	
r/+233+22015!333333�K�����J�i��i��i�S
@r
r+2+29/3013#5!32#'32>54.+��x^c*R=�k##j�l�`O5T/f$#=�@
r
r+22+29/3013332#'32>54.+3=�\_d+R=eP"#Oq��`O5T/f$#����=�@r
r+2+9/3013332#'32>54.+=�w^d*R=�k##j�`O5T/f$##��$#@

rr+2+29/3901".'732>7#53.#"'>325]Gk@(%<)��&;''>evQCfF$$Gf	;(2$%!8#W 6  $58B,Ma45aM-=��&!@
rr
rr+2+++29/301".'##33>32'2>54.#"GjCR��RClEUv?@vT&: !:%$9  9
7a=��>a6J{KK{Ir(F/1G&'G00G&!�@


r
r+2+29/330137.54>;#5#35#"!�/70T7��GsWc^$*%�
L>4L+���(  *����B�&JE��)	/�01����B�&JlJ
�*&	/��01���3F�-#@!%%r
r	/2++9/3�22301".'732>54.#"##53533#>32Z$6&\)
5-,:�NN���Q4E^09Z�C9V=FU'1*�P{{P�(,=�mH_6��=��&����/�01��"@
rr+2+29/3901".54>32.#"3#3267/AfG%$FhBQve>(';&��(=%(?k 	-Ma54aM,B85$  6 W#8!%$2=D�����X��=��N�����&�l������<��O��0$@$		r
r+223+29/3015>?!32+#%32>54.+&b^d*S<� 9T�U"#Uw5`K��]L4Q-�=g�O"l"!=>#@r
r+23+29/333013335332+5#%32>54.+=�Єe^d*R=��TX#"W�ı]L4Q-��f"!��)�'@
r
r+2+9/993�223013#53533#>32#54&#"AMM���V9bS�/1.>#PggP�(-e_���880+����=$�&����
/�01��=(�&����
/�01����&�E�/�01=��@
r

r/+22+2015#333#ﲆɆ��i���
��@
r+2/9/3�2015!332#'32>54.+
��Њ�Om:8jL��)33+�)UU����8eEDh:p 5!4!���'@

r
r+2+99//3333013#53533#32#'32>54.+Xqq���w^d*R=�k##j�S��S�`O5T/f$#�
!@r
/22+29/3399013!####!7!����?�?�����i]����$��$����]
!@r
/22+29/3399013'!#'##5#37!̸ �͡�$�#���f�w��������8�������|����A}��@
rr++93301!3>;#"���IF<(!����B=r��	H@
r
r++9330133>;#"���cF@9$
��h#=8g����W�v�&� /@	V
/�01+4��E�v��&���V+4��@
rr+2+9/3�2015!332#'32>54.+{�抑Om:8jL��)34+�'PP����6dDBf9p 5!4!6�@�
r+2/9/3�2013332#'32>54.+'5!v�{^d+R=�n"#m����^M5T/d%#�YYSj�
'@rr++29/33333013!2+32>54.+7S-3U@"9gE��0!2�~8�8�&BU/@l@�^6%&6�,�,C�+\(,'@rrr,++*))r+23323+++201"&'#3>32'2>54.#"?}=]�u\;6W?#"=QW3$'5(%*7&1�2
7/���Z.5*Ka89cK*i-;"$;*
 {4T-�,L�b�rr++�3013!53!L;x��Ɯ��=���r
r++�3013353#=�w��i�	@rr++29/3015!!!������YY���y���	@r
r++29/30175!!#^��\��LL�u�iJ�x��@
rr/2++29/301"'732654&#"5>32%!!�96""2DBK+I)(\0{���G��ֈpEMGPx�{���y��=�="@
!r
r/2++29/301"&'732654.#"5>32%!#A">,7-0!3&G&9[61_��[��VM>2=\5eKLu@�u�i�y!�3@

rr/+2323+229/33399015#53%33333####�9������<�<Ϡ���>�?⇇y��pV��������+��+����Z3@



r
r/+23+229/33399??015#53%'3353373#'##5#�;�������)�,������,�*�l������������'�w7�1'@+$r	r/+233+29/390157'"&'732654.+532>54.#"'>32�r;W�(gP6@?6)UV -1&6Nc(}]Jj;/3<AEv���F?@&-8.-i((+#F;H-V=1U\=B[.���7�&�|SL�y��'@
		rr/+223+2/9/39015#53%333	##36����FӚ����D��y��������+��=��0%@
		r
r/+233+29/39015#53%3373#'#�3��
�-���Ι�+l�������J��-@r	r+2+2/9/3/33/9013333##7#3J�����֖���::��%����2�νP=\!@r	
r+2+29/��390133373#'#7#3=��w������h66������z!��'@
r
r+2+299//393015!333	##&݅_ӗ����\'PP��������+��*�)@r
r	
r+2+99//339+0133373#'#5!C�-����+�J�l�����5PP��!@
r
r+222+29/390153333	##��FӚ����CTrr��������+��u!@

r
r+222+29/3901533373#'#��-����+�mm�a�������J�y �&�">�V+4��=��n&�!��V+4J��@

r
r+2+2239/301'!%#!#3!����׉����BMyyy�:/����=�@
r
r+2+2239/301'!3353#5#�[�K�Ԇ���uu�i�����J�x+�!@rr+2/+2/39/3013!#!"'732654&#"5>32J0���f96!;BNE&L'(\0Sp:��:M���jOPRTlCyQ��=�=p$@r
r
/2?++29/301"&'732654.#"###!>32�!?,7-0!7�ʆ�&K"9\51^�VXG8B���i�5gLU�I)��B�6F+@C'rr0;;		r3	r+2+23333+2+201%#"&'#".54>&3267.54>323267>76.'&B1zH;p-0f@O�g:1Y{K1N,>oI%&8P�^HuR,/_H
?\%�$!!'N>+ &G9Q+,3a�XH�e6w<jDPw@Re9^�T2XrA?sY* (PH
(#:V=/0��U2B-@3%rr,;;	r/r+2+23333+2+201%#"&'#".54>3267.54>3223267">54.U ]1+P&W0Z�M)Jd<#5*Q8	
-1BtLLq?LM+E��)>"3#.E'$;&ES6cK(c-G*1V5"d<Fm>;fBGv#."?+#C51F+/=�w��'5.54>32.#"32>7BAkL+/Z�Sb�#j:B 4M47M.!D:qG]1��Dew>A}g=VEI(/*DT*/WC'0&A,A*���"@	r!�r+�33+2015.54>32.#"32>7�Ca4C|UUz�8"&?$%>&+"�5I,{
Np?J{JJ<('G/.G)(!7$z���y]�&�"�
V+4�����&�!��
V+4����>	�+@rr++2901533�Nj��~����a��������#@
rr++29/93330135#535333#�������������W��V�2W��+##@
rr++29/3333015#535333#�zzdž����vvՙ<�V���<��y��"@

	rr/+223+29015#533#'#76�����������y�M��������^h��$"@r


r+2�33+29015#53?3#/#�(��tm		n����p	q���l�����������yk�!@
		r+23233/�3301+5!5!3!33%�������^My�����M������"@

	

r+23333?�3301#5!#5!3333���u�r���J�uu���i��i���<�y��&�"��V+4��.��'&�!P�V+4��<Z�&�#�Q.�#@


rr+2+9/3/33/01!5#"&=3326753'#3s='[h�.80��66�
YV��/,
	��R!Jg�@r
r+2+9/301>32#54&#"#�*@+}z�@P#F���ny��?;�����=$�M��\�09%@,55'	r1r+2+29/33/3901467;#"&2!32>7#".54>"!.L&'�xen�M~Z1��"6B$'F4
�]xCL|Y/0Y}M4S2�5V�9)cLJ;d}A
+G22 /7S/<f�GE�e;w0U76V0���-6!@..""3r&r+2+29/333301467;#"&".54>32!3267!.#"7'�vO[�9^E%%D_:Sv?�u*?!(E
nF^�&;%$>(W1
QE��+Ka68cL+K{G(<'  (>#6)=""=$�yg�4='@9+�"+	r5r+2+22/�9/3�20157467;#"&2!32>7#".54>"!.�w��M'&�xen�N~Z0��#5B%'F3
�]xBM{Y00Z|M4R3�5V��X�K9)cLJ;d}A
+G22 /7S/<f�GE�e;w0U76V0���1:'@22&&7r*�r+�33+29/33330157467;#"&".54>32!3267!.#"Rx�G7'�vO[�9^E%%D_:Sv?�u*?!(E
nF^�&;%$>()��1
QE��+Ka68cL+K{G(<'  (>#6)=""=��J��.���&�J��/�01��D�&���/�01S�'��$!@rr/2++29/33301"&'732>54.+#33:33�6 ,%@Q+>��.Ӛ�Ch=7^�h"D32ZD'������e�MUy?=�,!@!r
r/3++29/3301#"&'732654.+#33:373g4K*.Q63&$(C(8��!��*QmBGi9
c
=5<W/������v��&� �V+4���vf&���V+4��J�$��&�V��=�+&����T�v �&�
 H�V+4��E�vv&���V+4<�yZ�@	r	r+2+23/9/301!#"&=332673#53#�+B,zz�AK$H��v�I'ny��?;)�:��^.���@
r+2?3�9/301535#".=3326753#
M:8S-*/-�^��
,S7��20
����T�vo�&�
 ��V+4��E�v�&�%�V+4��=������&����/�01�����&�R�9/�01����&��l�
�/��01�����&��;
�=9/��01���������������J7�&�x��/�01����B�&�a�&	/�01������C����;�������&l���
�.*/��01����;�&m�G
�*&/��01���&��3�
�/��01��D�&���
�/��01��'��7�&��O�
�2. /��01������&��
�0,/��01$��:� !@ 	r		r+2+239/33012#"&'732>54&+517!5!-Nh<DuMZ�(hT8*9CIP������&>K&Hi9F?@&-6$4A`�yh���#�@rr+2+239/3301"&'732>54&+57!5!3�O�&RO3-A"XNB�����	jq*I]�@=F)/:(>B\�o^�tY:Y<��O��&�s���
/�01��=(�&�sc�
/�01��O��&����
�
/��01��=(�&��O
�
/��01������&����
�,(
/��01����A�&��J
�($
/��01����+#@		"'r	r+2+29/333015!".54>3232>54.#"t��N[25]LMZ24]��5M12N45M12M4@QQ��<g�DG�e;>h�DF�e:h.VC')EU,.TC')DT��A'@$rr+2+29/30175!".54>3232>54.#"q��@fG&&Gf@@eH%%Gf�$>'&>%%>&'>$�99�+Lb67bL++Lb76bL+.G()G.-H()G������&|���
�0,/��01����A�&}�J
�,(/��01��$����&����
�.* /��01��#��$�&�;
�($/��01��������&�sy��/�01����&�sB�/�01��������&��e�
�/��01����&��.
�/��01��������&����
�/��01����&��q
�/��01��<Z�&��r�
�	/��01��.��&��*
�/��01��L�y�&�"r�V+4��=���&�!D�V+4��JN�&����
� /��01��=��&��
�/��01�$(�@r/2?33+29/301"&'73265#53'!!5!�;  //j�0Vg������X:;\\Eb5��y��YY�+�@r

/2?33+29/301"&'73265#53'!#'5!y7!,,R�0TS[��^�

X<5QQC_3�u�i�LL�$��@r/2+2901"&'732>54&/#33�= "���������/P�

h 2��^h�����+S$2O.�,
"@r
/2?+2901"&'732654&/#3?3k-Dp����n
m��[(*'F�
c$3^�����{7^2-F(�� @

		r+2/9/339015!3#'#�����������4PP���������^h	@
	r+2/39/9930175!?3#/#2���n		m����p		p����CC&��������)��:�-@  r'	r+2+29/3901".5467.54>32.#";#"32670KwEG@=9?kB\}.[M8&51!UU(7C>5Qh(�.[B=\T1>V-E?F%.+*`/-9-&@?F"���/@
"r)r+2+29/3301".5467.54>32.#";#"3267Bg;64-<d;2N;P
+.5%=;**-*5lq#E2.A
!,-@"."6#Q%  15<���$��&�I���+&��������6���+=V���<��F\��T�y��&�"
�
V+4��C��j&�!��
V+4��T�y��&N
"��V+4��F��}�&O	!��V+4�����$��&�
������+#&�����y��&�"�V+4����f&�!��
V+4���7��&('���$��9/�01���7�&H'�����5	/�01��J�9��&)�����İV+4���9]�&I���1��ذV+4��J�]��&)�������V+4���]]�&I�q�1����V+4��J7S&*'�u���y��/�/�01����B�&J&�^����-�&&	/�/�01��J7S&*'�u���y��/�/�01����B�&J&�^����*�&&	/�/�01��J�77�&*'������'/�01���7B�&J'�����A	/�01�� ����&,����'
/�01���!>�&L�h�7
/�01��J�9��&-���=�9$�&M�����ΰV+4��J�E��&-����=�E$�&M���!
��ذV+4����&X&.'�����6~��/��/�01�����&�&���'���/��/�01��J�9>�&1�����ΰV+4��<�9@�&Q�O���ӰV+4��J�]>�&1�~��(�]T�&Q�������V+4��J�9�&2�B��=�9k&R�c�&
��ΰV+4��J��&3���
/�01��=$�&S���/�01��J�9��&3����ΰV+4��=�9$&S�����ΰV+4��J�]��&3�����ΰV+4��=�]$&S�\�����V+4�����a&4'����#��D�((
/�/�01����A�&T&�T����@�$$
/�/�01�����[&4'�������HD�((
/�/��01����A�&T&�T�J��D@�$$
/�/��01�����S&4'�����y�/�((
/�/�01����A�&T&�^����+�$$
/�/�01�����S&4'����$y�,�((
/�/�01����A�&T&�^����(�$$
/�/�01��J�9��&7�����ΰV+4��=�9u&W�
���ΰV+4��J�]��&7�������V+4����]u&W�������V+4����G�&8����3./�01������&X���,/�01���9G�&8���4��ӰV+4���9�&X���-��ذV+4����Gh&8'�������7�33./�/�01������&X'������0�,,/�/�01����Gh&8'�������:�88./�/�01������&X&�F����3�11/�/�01���9G�&8'������4��ӲV7./�01+4���9��&X'�����0-��ذV+4/�01���9]�&9���	��ΰV+4���9w�&Y�s���ӰV+4���]]�&9�e�	����V+4���]x�&Y������V+4��@���a&:'������6�/�/�01��8��B�&Z&�Q����:�/�/�01��@���M&:'�����z�"�/�/��01��8��B�&Z&�\�I��&"�/�/��01���&<�b��/�01��F�&\���/�01���&<����/�01��F�&\�K�/�01���&<�)�
�/��01��F�&\��
�/��01����&>����	/�01����&^���/�01���9Q�&?���	��ΰV+4���9�&_���	��ΰV+4����w�&Y����
�
/��01=����<!@
:2-(r"r	r+2++2901"&'732654.'.54>7.#"#4>32�Bz+/-V)&/-!;N&)Ia8!'9$6D +Me9GoH
/UC'+=S)l
,+W&$
%7,0B*5&/*H/�D�<\> /YB&	"50PX���9��&&�����9&F���:$��ɰV+4����&&���/�01����&F���C/�01����&&(v��@/�/�01����$;&F(6�@@??/�/�01����&&)5��@/�/�01������4&F)��C@??/�/�01����&&*���@/�/�01����B&F*M�J@??/�/�01���$&&+����/�/�01����k&F+C�@@??/�/�01���9��&&'������/�01���9�&F'���X�:$��ɲVC/�01+4���&&$����/�/�01����f&F$h�G�@@/�/�01���%&&%����/�/�01����l&F%e�J�@@/�/�01���/&&&���#�/�/�01����v&F&m�Q�@@/�/�01���)&&'����/�/�01����p&F'Y�G�@@/�/�01���9��&&'������/�01���9�&F'���l�:$��زVD/�01+4��J�97�&*���
��ΰV+4���9B&J���'��ɰV+4��J7�&*���/�01����B&J���0	/�01��J7�&*�k��/�01����B�&J�T�/	/�01��JY�&*(k��@/�/�01����B;&J(T�-@,,	/�/�01��*7�&*)*��@/�/�01����B4&J)�0@,,	/�/�01��J7�&**���@/�/�01����BB&J*k�7@,,	/�/�01��J7$&*+y���/�/�01����Bk&J+b�-�,,	/�/�01��J�97�&*'������
��IJV/�01+4���9B�&J'���v�'��IJV0	/�01+4��3��&.��\��/�01����&���1���/�01��J�9��&.� ���İV+4��=�9��&N��	��ΰV+4���9��&4�
�)��ΰV+4���9A&T���%��ذV+4������&4�I��2
/�01����A&T���.
/�01������&4(���/@..
/�/�01����B;&T(T�+@**
/�/�01������&4)`��2@..
/�/�01����A4&T)�.@**
/�/�01������&4*���9@..
/�/�01����AB&T*k�5@**
/�/�01�����$&4+���7�..
/�/�01����Ak&T+b�+�**
/�/�01���9��&4'�
����)��βV2
/�01+4���9A�&T'���v�%��IJV.
/�01+4������&E�#��8
/�01����A�&F���4
/�01������&E����;
/�01����A�&F���7
/�01������&E�I��B
/�01����A&F���>
/�01������&E����8
/�01����A�&F�T�=
/�01���9�&E�
�9��ΰV+4���9Ad&F���5��ɰV+4��@�9��&:�	���ӰV+4��8�=B&Z�����ɰV+4��@����&:�D��$/�01��8��B&Z���(/�01��@��$�&G���*/�01��8����&H���./�01��@��$�&G����-/�01��8����&H���1/�01��@��$�&G�D��4/�01��8���&H���8/�01��@��$�&G����3/�01��8����&H�Q�./�01��@�9$&G�	�+��ӰV+4��8�=�d&H���/��ɰV+4����&>����/�01����&^�s�/�01���9��&>���
��ΰV+4���&^�E����&>���/�01���&^���/�01����&>�n��/�01����&^�D�/�01��:�iO:��O�/20175!:��yy:�"O�/20175!:��yy:�fO�/20175!:,�yy��:�fOR8�����/�99013#57�(�$�z��x6�����/�99017#53G(�#�z��x:�}����/�99017#53K(�#�������8�{�&TT�5�w�
@	
/3�29017#5337#53F(�#j(�#�{��x{��x:�}w�
@
�
/3�29017#5337#53K(�#e(�$���������#�~��
//9/33301#5333#������Ux��Dx��*�~�@
	//9/333�223015#535#5333#3#�����������xpy@��ypx�M���/301#".54>320//0^00//: �@
	
?2332301353353353:nNnNn������(��q�/?O_e5@`eeP@@XHH8((0 	rcbbr+22/32/3+22/333232/301".54>32'2>54.#"".54>32'2>54.#"".54>32'2>54.#"		�.K,,K..K++K.!   �.K,,K..K,,K.!  !�-K--K-.K,,K. !! ��=����)E**E((E**E)C&&&'�(E*+D))D**E)C&&'&C(E*+D))D**E)C&&'&
IV6����=���
��/�0153=r#�����=���&__�#.+�@	/3/3901%%#���� �mmgn�:.B�@	/3/3901%57'5B����߱ngmm��6�����rr+2+201'		�=���/IV6������/%�!
BD?2�201".54>32'32>54.#"�5O67N25N68N�;+"1 :*"1!�'@K#&L>&)@K#&K>%� >*)/ >*)/�~/

@
		
BD?�29/3333015#5733#'35��;88��`I��E`���o/&@	# BD?3�29/3012#"&'732654.#"#>73#>�)H-/R45V-@%)6)4A

�.�"=)*@$&!2'"!3560I_	
"��/*@#
BD?3�29/93014.#">327.#"32>".54>32�*L3%>=3>*O.XgbS5Q.�/1./(=#=A3"zq]g'B%""!#��/�BD?�201#5!#�l�Z�J�[ ��/+:@ 008B(D?3�29/33301#".5467.54>324.#"32>'32>54.#"�1Q02Q/4!*1J'&K1(%1Q.,--�&&&!1%; #;$'/'#33#*2���/*@	

#BD?2�29/301"&'73267#".54>32'2>54.#"�.O+>4<>&1L+.Q4TbgS/.0-�"2A=$='(B(h]qy�"#$!���Q%�!
BA?2�201".54>32'32>54.#"�5O67N25N68N�;+"1 :*"1!Z(?K#'K?%)@J#&L>%� ?*)0!>*)/ ��:U@	

BA?33�22301!53#52>53:��a'/'!PNN	P�����V"@B A?2�29014>7>54&#"'>32391>*/(/#33K/RT). )�U5G3
"!: G;"/
N��uV,@
&BA?2�29/3301"&'732654&+532654&#"'>32�=\*!1 '9AB::4'916B 2J+.(,42QZ)&6
F=4!#.=))4��~Q

@	
BA?�29/3333015#5733#'35��;88�TaI��Da����oQ&@
$$# BA?3�29/3330172#"&'732654.#"#>73#>�)H-/R45V-@%)6)4A

�.�"=+)@$' 2'# 3651H`	"���T*@	#
BA?3�29/301%4.#">327.#"32>".54>32�+L2%><4>*O.XhcS5Q.�00-.7'=$>@3!yq]g'B%#"!#���Q�BA?�201#5!#�l�ZJ�[ ���Q+:@0  8B(A?3�29/33301%#".5467.54>324.#"32>'32>54.#"�1Q02Q/4!*1K&&K1(%1Q.,--�&&%!1'&:!#<$'/'#33")2����T*@	

#BA?2�29/301"&'73267#".54>32'2>54.#"�-P*=4=>&2L*.Q4ScgS0//-Z! 3@=#>'(B'g]qy�""#  ��"� $(,0)@*/+--r#%"''r+233�2+233�2014>32.#"32>7#".#53#3##53#3# B|VUy�9"&>%%>'+"�D^:@eI&j>>�>>�>>�>>J{JJ<('G/.G)('>#+Mb	������ M�	
@
r?+29/3�2013!!!!'5!p�����I�y�p��h[[,���6:>@7:>;;
6(/	r
r+2+229/3�2017>54.54>32.#">323267#".#"!!!!8#/ 7^9=n%GN$& &$-,"!>==!E )m��m��W=@%A?@#2Q/81R",&59D(89 	d
	�S-S&7�"@

r
?3+29/993�201%!5!5!5!#33#7�����Ήno�s�SmR�8�,�;J��1�
2^=@ /r#++$(PI(II(:3r''r+/33/+29///33333+201332+32>54.+#".5#53533#3267"&'732654.'.54>32.#"J�2R=!7cBWN(,I�/7%?$EE�nn(=n'+*R'#),5F#/V:3Z&2$@""&9O(g�(DT,<lD�g5"%4��9.-g��g��,+W&$
$7+4K*#'U
	%80NX(V�!=@  !r?3+9/93�2233333301%!5!3!!'!5!3!!3733##37�!�p�!p�!�p�!��QR�zZɕ��w|}w���Y�SS�RRD���'�:*�����%n�,04/@
		2233 (--0/33|/33/33|/33/3/3014>3253#"&/#".%5.#"32>!!!!55a>6_�#$.c7Ae:�
,5"5 7"'#�tI��.��[Aj?1&�3n%!14@kD(#9"#5
!�E�E!����,!@
(	r
r+2+29/993�201?!7!74>32.#"32>7#".!�>�?(/Z�Sb�#j:B 4M47M.!D:q_v:L~[3�JJ�JJQA}g=VEI(/*DT*/WC'0&A5J&?i� �� @

	rr+2+29/930175!33	# X�Ҋ*���!��ZuIIu��R��u2^�]�@		

rr++230175%5%###5!C��8��O�A�A��A�A-��My
Y�!&@!	r?+299}//33�201!!!!!2+32>54.+
R��R��=$5U?" <U5��!4"7�+E3E���+GY/0XG*�>"@-/?  ���/(.0@.*++r#	r+2/223+2/2239/3?01%3#3".54>32.#"3267#5!#VCCCCE{]44^~Jd�$ga9-J69L.6c+YO�r@���
�{8c�MI�b8UFL58&BV03V@%86�`
e��	����'+/'@-,(
))
r!	r+2+29/99993�201"&54>54&#"'>3232677!%7!
pi)CJB*.5"F8)_Fmf*BJC)08&G:'d����N�ZO1L=527!&&VVK1K:329%')Y%11c11���/,'@(	r
r+2/233+2/22301%3#34>32.#"32>7#".VCCCC��/Z�Sb�#j:B 4M47M.!D:q_v:L~[3@���
��A}g=VEI(/*DT*/WC'0&A5J&?i�]�@
	r?+23}/3013#5!#5!��O�O�kk�R[kk)��@�
r?+99�2330132#32>54.+!5!5!5!)�2R=!!>*���o)+{�7�7��(DT,-S>��^!8#$8 yRDS$3�@r?2+9013332>53#%5%5%S�f%-�2aO��r��r��
5(:_D%�U�UU�U@����@


	?3/3933/3012#4.#"#4>?wRvK#�'C21B(�"Iw1CCN4]{E��(M=%$=M)��By_7���/�  @ 	r?+29/3�23301=!5!!2+32>54.+!��W��4S; 5bE�w(+q�yy�BBn�(DT,<lD�g5"%4:��Q�&@	&	/3?39/3017>54&#"3267'#"&54632�%F9!K<)A&?8<%-� drn+:H";%�4:	Y!�"# LPFSw�	)!@	

&r?+22/33/3?9901#33#".54>32'32>54.#"܉kr�os;S--T::S-,T�'''(�9�.�;S4V12U44U21V4�//-/+���23@'*-0

$00?33/3�292/3/90173#5#'#3.#"#"&'732654&'.54632;�WAFAW�� .%<9F8&M#8'94G5 =)��ջ���+@

)*-.@
	'&,4>���)@
r+�923333301##5#5!3#5#'#3S_W_"�W@G@W�:q��W�ջ���+�&��-!@+-r!
r+2+2233330173.54>323!5>54.#"!&�0E&2]|HI|\3&F0���%;*5L//K6+;%��fQf:D|a88a|D:fQff6JS+)O@&&@O)+SJ6f#��I @	r	r+2+29/301%"&'5!4.#"3267'2!5>6,N�E|RR|EE{SNo%`F,O��N$&�P�MK|JH{K0##+�'%tu$'�� ��h�&'c*�����"(U;@O:77)@HH)#((1)&%% /33/293/3?33/33/39/33014>7>54&#"'>323		%"&'732654&+532654&#"'>3270>)-(.#1
2J/OS(-(צ=���=[*!1 (8AB:;5'916B 2J+.(,42Q15F2
#"9!G;!/
N��IV6����('5
G<4""/=()5�� ��w�&'c*
�������&'c�
_������&'c�
R������&'cO
���!2@+		r"r+2+29/301".54>326<'.#"'>32'2>54.#"�Ch<*H\2.E5%BJ&i:rzE~N.%3#;%2
7`;1VB%$	=H"N$&���^h%11#:$4��A.#'@
&% 
$'?2�2?3�201".54>3232>54.#"/@fG&&Gf@@eH%%Gf�$>'&>%%>&'>$q�2�?
+Lb67bL++Lb76bL+.G()G.-H()G��;��n�@rr+233+201%!53n���pr��hhh^����L ����@		r/3+23301###5!##��P�P�R�T�tt�T �
!@	
/333/9933301!!5!57'5!� ���Ŷ?�W����[t��>�}�/2015!>�kk��y��rr+2+201'<L��8�@�k:����/201753:n��
@


r+2/9/33013333#�m{Cpx�����{�����{^(��/? @0<$ 8(/223�2923012>32#".'#".54>2>7.#"!2>54.#"�(7'%8(4J*,M0&7&'9)*N1-L9##$$*""#$((2S32T1$$2T23S1��%&#%%#'#�Y^4�
/3/301&632.#"#"&'7326'^B?H
&B?G�;F` �Q>C`!5���-@�@%�)/3�/2�2�201#".#">3232>7#".#">3232>7P%('1
=$+(	<%('1
=$+(	�	),
 s
),	K�@
/�23/333/3017'!!!!V�3�=9��9��4��$�WW2�Y
@
	/3�22/390175!%%2a��^���ll���PJ��C�Y
@
		/3�22/390175!57'5Cb����^ll<��JP���	@	?3?3901#d�����֍������nl������=�+���
��/�01#7#53�='q�H^^��31@		+$r2/3
r+2?3333333+29|/3013#5354>32.#"3#3#5354>32.#"3#]EE,Q8%D$,	���EE+O5 A ("$���f
7X4ff�v�f A_4e0.%f�v��@
r	r+2?333+201#5354>32.#"!###]EE7O2&C=5F$(����f ,L;!d*%���v����) @r"
r
r+?333+2+201"&54.#"3###5354>323267=G$" 'WW�EE5bDrl&*4B3�23!f�v�f,AY.lX�� l
�86@		,$r61488
?23?3333333+29|/3013#5354>32.#"3##5354>32.#"!###]EE,Q8%D$,	���DD7P2&C=6F$'����f
7X4ff�v�f ,L;!d*%���v����D@@ 
		#6r=r(11+..-
?2?3333333+2+29|/333013#5354>32.#"3#"&54.#"3###5354>323267]EE,Q8%D$,	��9>G
%" 'XX�DD5bDrl'*3�f
7X4ff�vB3�23!f�v�f,AY.lX�� l
��X�b>@#TTJMM<+A&F!0Jr80r\

Y
r`r+2+223+2+293333/301%#".5#534.#".#"#".'732>54.'.54>32.54>323#326>06&>%DD!!1.
5*I ')0J3!9K,*ZO30^+(!+-F/9[1J%RB>H#
nn(�j9.-g:C3%% T	"1$*?*[!

0"9M(
*(A'7O4g�
?�@
r+22/3901##33?܍���ܗ������:����� ����-@$##
r	r+2+29/301".54>32.#"32>7#'!uNY/0[OZ�)m*9#/J31L1#>0 �01Vu<g�EF�e;OFV&$)DU,*UF*)3t	?qW2��=��&���/�01��� 3@ 
r'

r0r+2+29/3+01!5#".54>3254&#"'>32'6=.#"32>}\72R/$>Q,*B;:)Q*)1l=Mj7�8*")*%I*)+L/(@+	39U #3aD�Ä<


$
��?&"@
rr&

r"r+2+29++01".54>3253#5.#"32>76[C$$?V2;]��Rk*53%%A)1&
*Jc99bK)8.V��U,3F/.9+F*(��>�'"@r'
r"r
r++2+29+01!5#".54>323.#"32>7�S66[C%<jC;\��
-52%(5(#R,0*Jc9L{H9,*�&=.-9  9*
!=�+���r+�2?013#3#=�����&��?���
rr++0130*#?�+-�&�,a/$@rr!"
'
rr+2+29++201".54>3253#"&='2>75.#"2T>!%BZ4<\u'':<F/'%*3&$@
+Jd89bJ)7-[��r3(�fr'|&-9 +F*k�@
r
r++2/223013#53533#hNN�yy�y��y�m8��"@rr
r++2+29901!5#".5332>73�;H&/C)�(#2*�Z!-6M.H��#7+E��
Y@
	r
r+2+93301!#333ff���yj{iz��A����o��o���+@
rr+2+9901#73��Tϊ�~���u�����R7@CC=:r,++'0rK		HrOr+2+223+22/3+22/392/301%#".5#534.#".#"32>7#".54>32.546323#3267�07$>%EE#/(�9"2$&2+$�G^8@fH&%FhC0B
]YDK nn(9.-g$9(7'54+
(+9!"9+()="-M`65aM,1EO$=M(g�M/
?@#
		

		>/2?9/93339<<<<0133#'#3�c�8�8�R�/��D2/&@>/3?39/3901%#!!24.+32>32>54.#26Z6��I+>"-*4=z��"�� �/@ /*B$'HI �2} ��<2#�??3?3014>32.#"32>7#". (LnGSz]S'+@+-@'90
dQc1@lN*3cP0D6A-"2>#@2$;*:1SgDX/

�>/2?301332#4.+32>D�e�EL�]�+Q;ii<Q*/K~MU~F4M,��-PD�/@	

>/3?39/301%!!!!!�Q�����jj/jwc�D�/	�>/?39/3013!!3#D����/j�c� ��A3!'@
$##
?''/22/?39/301".54>32.#"32677#53#;;gM,,Oj>Tx\P.%=+.?%+Q$&Sp|�d/Pg9:eM,C7D(*0@$%@0*'w$"�X��DN/�	>?2/39/301#5!#3!5Ny��yy/����/��D�/	�>/?0133Dy/����y/�>??301732>53#"'':&1.y.\MP7|%O<��@iJ(!DU/@

	>/2?3901333#'Dy��Q/������G�D�/�>/2?0133!Dy/�;jD�/@
	>/2?3901!##33>�B�y����]���/��.��D]/	�>	/3?39901#33#�y^BybO��/��X�� ��m2'�#
??2?301".54>3232>54.#"FBlN*,Pl@BlM*,Ok�,A()@+,@()@,/Qf68eO.1Qf57eP-"?23? ">12?D/�
>/?39/3013!2+32>54.+D9Z31V:��$%�/8U/0V6�!%$ ��y3'+@
?((**?2/23/?301".54>32'2>54.#"73#FBlN*,Pl@BlM*,Ok@)@+,@()@,,At�r/Qf68eP.1Rf57eO.l3? ">22? "?1o�D?/@

>/2?39/39013!2#'#32>54.+D:Y21#���v�$&�/8V.#?2ѷ�!&$���3.@	'+??3?39901.#"#"&'732654.'.54>32�
2B#//=,;W/$?Q,D�46;S.-/'D/9K%;e<@l'�	&>4/A(&!i
';+:N(%/�>/?3301###5!�y��;�j<��R/�
>?3?301%2>53#".53F*9!yAeFIe@y"7g0= ��9eL+-Nd6��!=0O/
�>?2/9013#����f�/�{���/�/@
	>?333/39013733#'#37pEGpjI���fkkf���F-����������/�b�=/@

	>?2/390173#'#�����փ�����/���쾾>/�>?2/9013#5�����x�/������m!
/	@		>?33/33017!5!!!!V���M�[jj[��j�x��@

r+2?3/333301333#5!!I�~�Jr�(R3��M�������
���r/2+90133#
}����:(����#-!@-r$	r+�333+�333015.54>753'>54.'\@rY35Zq>�>rY43Ys>7]8":I�4Z7 7G'FA6^�NS�\4AA5]�RO�^5A��=lN:Z?"<lL:[?$��J'�+��'�w7�,���w��>��'�77�&������7���B��%� +@
!(rr+2+29/3301"&54>32'2654&+32654&#";y�1gOA[0,*=I>iI69:7p99b)//)/3syFf7(L72H_OHa/n@::>�58K1++2236���+@"r%r+2+2901".54>7>54.#"'>323267O_*'UD%)!.;XoM@T)$I:?6303ET$r
%@),9+//6!?-*:)'  ;,3���!>LD�0@


r+2/2/?3/3/9/33333013'333373#'##5#����)�,������,�*�������������-�+@
%rr+2+29/3301"&'732>54.+532654&#"'>32�Kzc=,)8!<*<33>5-";VlI]i7.@KAl�F=,$$ :&'7`4/+0 (38B`P9O_MIb2��8��BZ��8��B�&Z_�/�01��8��B����=2�P
�r+/3901##\���������o��=$S��=kR8��p@	
r	r
/?3+2+299015'./#"&5332>73;�#nBQT�,+3+�*#"57ieH��<=* E���8��g$'@rr
r		r+23++2+290133267332673#5#"&'#".58�+''F�*''F�yeAAI
c?0>"
��?:=02��?:<12��a46@.59#;I&7���.'@'&#	-
?�3?3?3?933015'./#"&'#".533267332673;;hEAI
c?1="
�+''G�*''F�)!$39@.59#;I&H��?:=02��?:<12���8��@rr+2+9/301"&5332'2654&+&p~�h1U?$$?U32442f5hl>�,J65J,n-()-L-2��m@rr+2+29/301"&=#5!32'2654&+�q~�
i1T@$$@T41551f5hl�m�,J65J,n-()-L-2=�	@	r/+29/30175!!#l��[��SS�u�i����?���7�-���7�%��H�.@
'rr+2+29/3301".54>7.5463!!"2'2>54.#"6O|F:+-0eU��('9=U}DG|O'=$#>''=$$=
>nF+OB>&HPr#<mGFn>r8')<!!<)'8*����'�#
r	r+2+201.54>3232>54.#"^KtN'*QrGMsN'*Qr�)@*-@)+?+,@)
Bl}<@�i?Dl~:Ah?g*SF+.HR&*SF+.HR+��@
r?33+22/301%!53#52>73�n�%/180�yyy�|$��)-�(�r&/2+20134>7>54.#"'>32!)#8)#KA)/!&A3T1EX5Nj72>!4@%b=]I8&*6'+'X(&7_>-E4)*$#y!���2@
+#r		r+2+29/3301".'732>54.+532654.#"'>329]EH
,B*)<!)P:!#HW22MWL_3Gn>!<),C%Gy7&[*+!.d2.)/%a -1T6(B,
3M-?X0#�

@	
r?+29/333301!5!533#35E��U\XX�ֳ�x��Ty��$���"@r	r+2+29/33301"&'732>54.#"#!#>32
M{!MS-$84! :uR^�."Cj=Eu
C9P'.6#"5�z�
;fCGm=.��7�.@
'	rr+2+29/9301%4.#">327.#"32>".54>327ApG!:,$B-,LM'qCT|C@uPJuE��"<$#<$$;$$<�Ck?#@[0+%T6:[��f�NBpA%=$$;##;$$=%"8�
�r+2?01!5!#d�����Lz�:,��0�!3C@8''@r0	r+2+2933301%#".54>7.54>324.#"32>32>54.#"0GvFGuE"3)*FS)(TF+)4 �$, 7"#+ 8"�/--.�Bb7:eA(A/
(4/J32I05)0B!'0 '0A&%$%(��1�.@
'r	r+2+29/330132>7#"&'32>54.#"%2#".54>(AqF"9,%B-,LM'rBT|C@uPIvE$;%$;$$<#$;�Bk?$@[0+%T6;\��g�MApA&<%#;##;$$=%�����Qk�� ��:Ul�����Vm����uVn����~Qo����oQp��"���Tq�����Qr�� ���Qs�����Tt����%�!
B?2�201".54>32'32>54.#"�5O67N25N68N�;+"1 :*"1!'@J$&L>%(@K#&L=%� >*)/ >*)/ :�@		

B/33�22301%!53#52>53:��a'/'!PNNN	O����"@
B /2�290134>7>54&#"'>32391>*/(/#33K/RT). )�5F3
#!
:!F<!/ 
N��u�,@
&B?2�29/3301"&'732654&+532654&#"'>32�=\*!1 '9AB::4'916B 2J+.(,42Q('5
G<4""/=()5~�

@		
B/�29/33330135#5733#'35��;88�aI��Ea����o�&@	# B?3�29/3012#"&'732654.#"#>73#>�)H-/R45V-@%)6)4A

�."=**@#&!1'"!2660I_	
"����*@
#
B/3�29/9301%4.#">327.#"32>".54>32�+L2%><4>*O.XhcS5Q.�00-.�'=$=@3"yq]g'B%#! $���B/�201#5!#�l�Z\J�Z ����+:@ 008B(?3�29/33301%#".5467.54>324.#"32>'32>54.#"�1Q02Q/4!*1K&&K1(%1Q.,--�&&%!1{%; "<$'/'#32#*1 �


����*�

#B/2�29/301"&'73267#".54>32'2>54.#"�-P*=4=>&2L*.Q4ScgS0//-!3@=$>&)B'g]rx�""#!/��%�!
BC?2�201".54>32'32>54.#"�5O67N25N68N�;+"1 :*"1!/(?K#'K?%(AJ#&L=&� ?*)/!>*)0 2�@
	

BC?33�22301#53#52>53�N '+Q�NNP��1�"@B C?2�29014>7>54&#"'>32390?*/(/#32L/RT).!(�15F2
#"9!G;!/
N*u�,@
&BC?2�29/3301"&'732654&+532654&#"'>32�=\*!1 '9AB::4'916B 2J+.(,42Q*)&7
G=5!".	=()56~�

@
		
BC?�29/3333015#5733#'35��;88�6`I��D`��/o�&@	# BC?3�29/3012#"&'732654.#"#>73#>�)H-/R45V-@%)6)4A

�.F"=**@$'!1&# 3660H_"+��*@#
BC?3�29/93014.#">327.#"32>".54>32�*L3%>=3>*O.XgbS5Q.�/1./�'=$=@3!yr\h(B%#!!#6���BC?�201#5!#�l�Z�I�\ /��+:@ 008B(C?3�29/33301#".5467.54>324.#"32>'32>54.#"�1Q02Q/4!*1J'&K1(%1Q.,--�&&&!1�%;!#<$'/'#33")3�
+��*@	

#BC?2�29/301"&'73267#".54>32'2>54.#"�.O+>4<>&1L+.Q4TbgS/.0-+"3A<$>&)B'g]ry�""$ :����/301753:n�/I��
��/�01'73�V6}Iw(=s�
�
�/2�201"&5332673�MXS(**%SX=O>(& >O"���@
�_/]2�201".5332653�9S-^+0/,_-S�%B)-* )B%�+8u��/�201"&'7326=3�6 
'+�h�c<:auil�v�u��/33�017#533J��B��<u��$Oy��/�201"&'732>=3�; $�0U�

h<*ZyDc5�v�y��/�33017#533J��C��<y�����u��/3�015#53__�u��y�y��/3�015#53ll⇇y�2El�
��/�017#3l::EP��!D-f&���K���!D'l&��������!F'v&����Zp����E`p&��������9H�;&���a��H�4&�c���Z��H�B&���<��
G�k&�
������Im���/�9901'7'm]V#ڑI.nd�?Q��
�	)j3�	3�
�"
6
�
���	�	/	G	.V	�	�	�	R	f�		f0	
�	D	�	,
Y	
 
�	4QCopyright 2010 The Raleway Project Authors (impallari@gmail.com), with Reserved Font Name "Raleway".Copyright 2010 The Raleway Project Authors (impallari@gmail.com), with Reserved Font Name "Raleway".RalewayRalewayBoldBold4.026;NONE;Raleway-Bold4.026;NONE;Raleway-BoldRaleway BoldRaleway BoldVersion 4.026Version 4.026Raleway-BoldRaleway-BoldRaleway is a trademark of Matt McInerney.Raleway is a trademark of Matt McInerney.Matt McInerney, Pablo Impallari, Rodrigo FuenzalidaMatt McInerney, Pablo Impallari, Rodrigo FuenzalidaMatt McInerney, Pablo Impallari, Rodrigo FuenzalidaMatt McInerney, Pablo Impallari, Rodrigo FuenzalidaRaleway is an elegant sans-serif typeface family. Initially designed by Matt McInerney as a single thin weight, it was expanded into a 9 weight family by Pablo Impallari and Rodrigo Fuenzalida in 2012 and iKerned by Igino Marini. It is a display face and the download features both old style and lining numerals, standard and discretionary ligatures, a pretty complete set of diacritics, as well as a stylistic alternate inspired by more geometric sans-serif typefaces than its neo-grotesque inspired default character set.Raleway is an elegant sans-serif typeface family. Initially designed by Matt McInerney as a single thin weight, it was expanded into a 9 weight family by Pablo Impallari and Rodrigo Fuenzalida in 2012 and iKerned by Igino Marini. It is a display face and the download features both old style and lining numerals, standard and discretionary ligatures, a pretty complete set of diacritics, as well as a stylistic alternate inspired by more geometric sans-serif typefaces than its neo-grotesque inspired default character set.http://theleagueofmoveabletype.comhttp://theleagueofmoveabletype.comhttp://pixelspread.comhttp://pixelspread.comThis Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: http://scripts.sil.org/OFLThis Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: http://scripts.sil.org/OFLhttp://scripts.sil.org/OFLhttp://scripts.sil.org/OFL�j2-	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a��������������������	����������bc�d�e�������f����g�����h���jikmln�oqprsutvw�xzy{}|��~�����

��� !"��#$%&'()*+,-./012��3456789:;<=>?@A��BCDEFGHIJKLMNOP��QRSTUVWXYZ����[\]^_`abcdefghijklmnop�qrst��u�vwxyz{|}~�����������������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwx��y�����������z{���|}~������������������������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./01234NULLCRuni00A0uni00ADuni00B2uni00B3uni00B5uni00B9AmacronamacronAbreveabreveAogonekaogonekCcircumflexccircumflex
Cdotaccent
cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve
Edotaccent
edotaccentEogonekeogonekEcaronecaronGcircumflexgcircumflex
Gdotaccent
gdotaccentuni0122uni0123HcircumflexhcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJijJcircumflexjcircumflexuni0136uni0137kgreenlandicLacutelacuteuni013Buni013CLcaronlcaronLdotldotNacutenacuteuni0145uni0146NcaronncaronnapostropheEngengOmacronomacronObreveobreve
Ohungarumlaut
ohungarumlautRacuteracuteuni0156uni0157RcaronrcaronSacutesacuteScircumflexscircumflexuni0162uni0163TcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring
Uhungarumlaut
uhungarumlautUogonekuogonekWcircumflexwcircumflexYcircumflexycircumflexZacutezacute
Zdotaccent
zdotaccentuni018FOhornohornUhornuhornuni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCGcarongcaronuni01EAuni01EBuni01F1uni01F2uni01F3Gacutegacute
Aringacute
aringacuteAEacuteaeacuteOslashacuteoslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217uni0218uni0219uni021Auni021Buni022Auni022Buni022Cuni022Duni0230uni0231uni0232uni0233uni0237uni0259uni02B9uni02BAuni02BBuni02BCuni02BEuni02BFuni02C8uni02C9uni02CAuni02CBuni02CC	gravecomb	acutecombuni0302	tildecombuni0304uni0306uni0307uni0308
hookabovecombuni030Auni030Buni030Cuni030Funi0311uni0312uni031Bdotbelowcombuni0324uni0326uni0327uni0328uni032Euni0331uni0335uni0394uni03A9uni03BCuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0462uni0463uni046Auni046Buni0472uni0473uni0474uni0475uni048Auni048Buni048Cuni048Duni048Euni048Funi0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04AD	Ustraitcy	ustraitcyUstraitstrokecyustraitstrokecyuni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0510uni0511uni0512uni0513uni051Auni051Buni051Cuni051Duni0524uni0525uni0526uni0527uni0528uni0529uni052Euni052Funi1E08uni1E09uni1E0Cuni1E0Duni1E0Euni1E0Funi1E14uni1E15uni1E16uni1E17uni1E1Cuni1E1Duni1E20uni1E21uni1E24uni1E25uni1E2Auni1E2Buni1E2Euni1E2Funi1E36uni1E37uni1E3Auni1E3Buni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Cuni1E4Duni1E4Euni1E4Funi1E50uni1E51uni1E52uni1E53uni1E5Auni1E5Buni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E64uni1E65uni1E66uni1E67uni1E68uni1E69uni1E6Cuni1E6Duni1E6Euni1E6Funi1E78uni1E79uni1E7Auni1E7BWgravewgraveWacutewacute	Wdieresis	wdieresisuni1E8Euni1E8Funi1E92uni1E93uni1E97uni1E9Euni1EA0uni1EA1uni1EA2uni1EA3uni1EA4uni1EA5uni1EA6uni1EA7uni1EA8uni1EA9uni1EAAuni1EABuni1EACuni1EADuni1EAEuni1EAFuni1EB0uni1EB1uni1EB2uni1EB3uni1EB4uni1EB5uni1EB6uni1EB7uni1EB8uni1EB9uni1EBAuni1EBBuni1EBCuni1EBDuni1EBEuni1EBFuni1EC0uni1EC1uni1EC2uni1EC3uni1EC4uni1EC5uni1EC6uni1EC7uni1EC8uni1EC9uni1ECAuni1ECBuni1ECCuni1ECDuni1ECEuni1ECFuni1ED0uni1ED1uni1ED2uni1ED3uni1ED4uni1ED5uni1ED6uni1ED7uni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EDEuni1EDFuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE6uni1EE7uni1EE8uni1EE9uni1EEAuni1EEBuni1EECuni1EEDuni1EEEuni1EEFuni1EF0uni1EF1Ygraveygraveuni1EF4uni1EF5uni1EF6uni1EF7uni1EF8uni1EF9uni2002uni2003uni2007uni2008uni2009uni200Auni200Buni2010
figuredashuni2015minuteseconduni2070uni2074uni2075uni2076uni2077uni2078uni2079uni2080uni2081uni2082uni2083uni2084uni2085uni2086uni2087uni2088uni2089
colonmonetarylirauni20A6pesetauni20A9dongEurouni20ADuni20AEuni20B1uni20B2uni20B4uni20B5uni20B8uni20B9uni20BAuni20BCuni20BDuni2113uni2116servicemarkuni2126	estimateduni2153uni2154	oneeighththreeeighthsfiveeighthsseveneighthsemptysetuni2206uni2215uni2219commaaccentf_ff_f_if_f_ls_tW.ss09G.ss11	i.loclTRKa.ss01a.ss02d.ss03j.ss04l.ss05q.ss06t.ss07u.ss08w.ss09y.ss10c_ta.scb.scc.scd.sce.scf.scg.sch.sci.scj.sck.scl.scm.scn.sco.scp.scq.scr.scs.sct.scu.scv.scw.scx.scy.scz.scuni0414.loclBGRuni041B.loclBGRuni0424.loclBGRuni0492.loclBSHuni0498.loclBSHuni04AA.loclBSHuni0498.loclCHUuni04AA.loclCHUuni0432.loclBGRuni0433.loclBGRuni0434.loclBGRuni0436.loclBGRuni0437.loclBGRuni0438.loclBGRuni0439.loclBGRuni045D.loclBGRuni043A.loclBGRuni043B.loclBGRuni043F.loclBGRuni0442.loclBGRuni0446.loclBGRuni0448.loclBGRuni0449.loclBGRuni044C.loclBGRuni044A.loclBGRuni0493.loclBSHuni04AB.loclBSHuni0499.loclCHUuni04AB.loclCHUuni0431.loclSRBzero.lfone.lftwo.lfthree.lffour.lffive.lfsix.lfseven.lfeight.lfnine.lf	zero.subsone.substwo.subs
three.subs	four.subs	five.subssix.subs
seven.subs
eight.subs	nine.subs	zero.dnomone.dnomtwo.dnom
three.dnom	four.dnom	five.dnomsix.dnom
seven.dnom
eight.dnom	nine.dnom	zero.numrone.numrtwo.numr
three.numr	four.numr	five.numrsix.numr
seven.numr
eight.numr	nine.numrperiodcentered.loclCATuni030C.altbrevecombcybrevecombcy.casehookcytailcyhookcy.casetailcy.casedescendercydescendercy.caseverticalbarcy.caseuni03060301uni03060300uni03060309uni03060303uni03020301uni03020300uni03020309uni03020303
apostrophe��T\����������������#$+,, 0��������$+�
�hDFLTcyrlRlatn0�� !"#$%&BGR VBSH �CHU �SRB ��� !"#$%&��	 !"#$%&��
���� !"#$%&4AZE nCAT �CRT �KAZ "MOL ^ROM �TAT �TRK �� !"#$%&��
 !"#$%&�� !"#$%&�� !"#$%&�� !"#$%&�� !"#$%&�� !"#$%&�� !"#$%&�� !"#$%&'aalt�c2sc�ccmp�ccmpdligdnomfracligalnum$locl*locl0locl6locl<loclBloclHloclNloclTloclZlocl`loclflocllnumrrordnxsalt�sinf�smcp�ss01�ss02�ss03�ss04�ss05�ss06�ss07�ss08�ss09�ss10�ss11�subs�sups�!#$1
	
 %"&'()*+,-./02fnv����������������
"*2:BLT\fnv~�����������������@d����48<N`dhlptx����&.2:\x��������LPTX\`dhlpz~��Mc�������������������������������������yz{|������������������������	

M'()*+-./012356789:;=>?GHJKLMPRSUWX[]_{"#&'������������������&'->>LZhv������������� &,28��kd��l}��mv�n�w�o�	e�p
f�qg�rh�s
i�tj�n���~�����n�����������~����������������&,4<FINOQTVYZ\^,>?NO��,NO������
��NO
��NON
,
+�*�)�(�
'�&�%�$��� {QQ {11�{�{yz{|"#&'yz{|"#&'_N_N_N_N_N	�����,->?�����&',>?.�������������������������������������V�
d}vwefghij��O�c����&F4Tn~n~&4FT�T3�&?sF_
�Y�YHX6"(�KQ�KN�Q�N�KKhFhFiFgIbOaQ]V[Y[Z
��<\Y^�,�
NxDFLTcyrl$latn4������kernmarkmkmk (20������F�`
`���`���Bh�x�(<�P��J8�l����� � �!4!�&�&�&�''F'�&�&�(J(�+Z,,r,�-�.3B48b9T9�;�=�>,>z>�>�??z?�?�@@@D@�@�@�>,A
A(A^A�A�A�DzD�GVG�G�IpI�I�JJ�JNJpJ�K ������!4 �!4!4!4!4&�&�&�&� �&�(J(J(J(J(JR
R-�-�-�-�8bR�T�=�=�=�=�=�=�>�X:>�>�>�>�?�XxX�YlZJ@�@�@�@�@�@�]@]fA�A�A�A�GV>,GV�=��=�]�^� �>z �>z �>z �>z �_ �a�!4>�!4>�!4>�a�>�!4>�&�bN&�bN&�bN&�bN&�?�bl?�&�e�&�fd&�f�f�f�&�?�'f�'F@'�@D'�g�hh�'�'�j�&�@�&�@�&�@�k^k|(J@�(J@�(J@�a�>�,k�,A(,k�,rA^,rA^,rlF,rA^,�l�,�l�m�A�-�A�-�A�-�A�-�A�-�A�-�r�3BDz8bGV8b9TG�9TG�9TG�(J�=�!4>�R]f,rA^,�s?�@�s.!4!4sPs�t$&�&�t�uL'Fu�v�v�!4w8x'F&�&�(Jxpx�yTz�{�(J(J{�|H|�>�}}:A�A�@A�A�@�@�A�>,}�}�GV@�~L~zA�A�~zA�@�@�A�>�>�~�~�D?���@A�GVA��T'F@'F@&�@� �>z8b�^��A�A�?�&�'FA�?��=��=�!4>�!4>�(J@�'FA�A�(J@�(J@�GVGVGVA�A�(J�63BDzA� �>�&�?�&�@�,A(,rA^,؂P3BDz3BDz3BDz9TG�!4>�!4>ڂz��(J@�-�A�8bGV8bGV�ڂ���Z���̇ZJJ��6�<�F�P�n��@D��@DA��⍼���6����4���Ă6���A���ԝ��F������̤��঴�
�(�ªP�.� ���±䳦(J � � ��6A�A�A�@@�@�A�>z>z�<�f�����ȴε4�ZP����&��/��9��;��<��=��>��[��\��^��������������������������������������������&��(��*��8��9��:��;��<��[��]��{����������������������4��B��D��d��f��h�������������������������������@��A��F��G��U��X����������������������������������%��������!������������������
��������������k����&!/9��:��;��<��=!>��?[��\��]^��_�!�!�!�!�!�!�>�
����������������������!�!�!�&��(��*��,��.��0��2��4��6��8��9��:��;��<��=>?@AB[!]>_
`{����������!���������4��B��D��d!f!h>�������������������������������2��@��A��F��G��U��X�����������������������
������&(��,��4��6��9;
<=>F��H��I��J��K��L��O
T��V��Y��Z��[��\��]^���������������������������������������������������������������������	��������������������������������������������������������������������������������������������������
�����������������&'��()��*+��-��/��1��3��5��7��89��:;��<C��[\��]^��_��`��{|�������������������������������
������������������������
��
	��4>��?��BDEde��fg��hi��k��z��{��|��}��������������������������������������������3��@A��FG�������������������������������������������������	������������������������������������������������������������&��/��9;<=>F��H��I��J��L��T��V��X��\�����������������������������������������������������������*�%�����������������������������������������������������������������I�!�����*����������!��#��%��&(*89:<C[��\��]��^��`��z��{���������������������������������������
����
$4?��BDd��e��f��g��h��i��k��{��}�������������������������@F�����������������������������������������������	�����������������;��O[���*��C����������������������D��E���������������������'����;��=��[��]��*����������������������������D��E��������������������������������;��[��*��C����������������������D��E���������������������R��������������������&��(��,��/��4��6��8��;<
=>F��H��I��J��K��L��R��S��T��U��V��W��X��Z��[��\��]��^��_�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������	�����
�������������������������������� ��!��"��#��$��%��-��/��1��3��5��7��8
9��:;��<>��@��B��C��[��\��]��^��_��`��y��z�����������������������������������������������������������������������������������������������������������	��
����
����������%��'��)��/��1��7��9��>��?��BDE��d��e��f��g��h��i��k��w��y��z��{��|��}������������������������
�������������������
���
���
������������3��@A��FG��������������������������������������������������������������������������������������������������������������������������������������������������������������<����&��/9��;��<��=��>��?��A��t���������������������������������&��(��*��8��:��<��=��?��A��[��]��{���������������4��B��D��d��f��h��������������@��F�����H��������&/9��:��;��<��=>��A��q��t��{���������"����������������������&��(��*��,��.��0��2��4��6��8��:��<��[]"{��������������4��B��D��dfh"�����������2��@��F��Q��R�����!9��;��<��>��A��t�������&��(��*��8��:��<��]{������������4��B��D��h�����������@��F�����#9��;��<��>��A��t���
���&��(��*��8��:��<��]
{������������4��B��D��h
�����������@��F�����)������9��;��<��>��A��qt���
������&��(��*��8��:��<��]
{������������4��B��D��h
�����������@��F��QR���'��9��;��<��>��A��q�������&��(��*��8��:��<��]{�����������4��B��D��h�����������@��F��QR����-��&��9;��<��>��������������������������������&(*8��:��<��[��]��{������4B��D��d��f��h���������@��F���;��������������"��&��/��9?f��q��t{��������������������������������������&(*=?A[��]��{���������4d��f��h����Q��R��V��Y��]�����,&��9;��<��>��������������������������������&(*8��:��<��[��]��{������4B��D��d��f��h������������@��F����� ����9��;��<��>��A��t�����&��(��*��8��:��<��{������������4��B��D�������������@��F�����;��*������D�������
;��O�	*������D��������������G����&��9��;��<��>��[��\��^�������������������������������������&��(��*��8��9��:��;��<��[��]��{�������������������4��B��D��d��f��h����������������������������@��A��F��G��U��X����������������(��������	������$��%��;��A��[��m��n��r��~������������
��*��C��_��`�����U����������������������������&��9��;��<��=��>��?A��K��X��Y��Z��[��\��]��^��_��������������������������������������������������������!��#��%��&��'��(��)��*��+��-��/��1��3��5��7��8��9��:��;��<��=>��?@��AB��[��]��z��{��|��������������������4��B��D��d��f��h����������������������������������3��@��A��F��G��U������������������������������������������������������;��=��������%�*U����������
��
�����;��=��A��]��������������*U������������������������[����
�����/���
C�����U�����������������K������������������������ ��%��&��(��,��/��4��6��8��F��H��I��J��K��L��R��S��T��U��V��W��X��Y��Z��[��\��]��^��_��o��q������������������������������������������������������������������������������������������!�������������������������������������������������������������������������������������������������D��
�������!��
�������������������������������� ��!��"��#��$��%��'��)��+��-��/��1��3��5��7��9��;��>��@��B��C��[��\��]��^��_��`��y��z��|����������������������������������������������������������������������������	��
��������������%��'��)��/��1��7��9��>��?��d��e��f��g��h��i��k��w��y��z��{��|��}��������������������������������������������������������3��A��G��Q��R��U��V��Y��]��a��b������������������������������������������������������������������������������������������������������
����������������������������������������;��A��[����*��U������������������������������U�����������������U������������"����
AB[��m��r�������-��������#�*�C��_��`�����U����������������������������$��;��A��[��m��n��r��~����*��C���U�Y�����������������������������;��=��A��]��������������*U���������������������������������������&��/��;��<��=��>��F��H��I��J��L��T��V��X��\]^o��q���������������������������������������������������������������������������������������������������������������������������!�������������!��#��%��8��9:��;<��[��\��]��^��`��z������������������������
����?��B��D��d��e��f��g��h��i��k��{��}�����������������������������@��AF��GQRU��V��Y��]��a�������������������������������������*����&��;��=��A��]���������������������������������������*[��]��d��f��hU������������������������;��A��[�����������������
��*��C��`�����U���������������������������;��=��[��]��n����*U��������������������������������;��������������������%��[��]��m��r�������������*�)�������M�%�����*��!��%��)��C�������U�������������������������������������������������������������������U���������������L����
���������������������������� ��%��&��(��,��/��4��6��8��A	F��H��I��J��K��L��R��S��T��U��V��W��X��Y��Z��[��\��]��^��_��m��o��q��r�������������������������������������������������������������������������������������������1�������������������������������������������������������������������������������������������������5�/����������
�������������������������������� ��!��"��#��$��%��'��)��+��-��/��1��3��5��7��9��;��>��@��B��C��[��\��]��^��_��`��y��z��|��������������������������������������������������������������������������	��
��������������%��'��)��/��1��7��9��>��?��d��e��f��g��h��i��k��w��y��z��{��|��}��������������������������������������������������������3��A��G��Q��R��U��V��Y��]��a��b���
������������������������������������������������������������������������������������������������������������������������������������1������������������������%��A
[��]��m��r��������������5�����8�2�������!��%��B��C�����U�����������������������������	(��,��4��6��8��A
F��H��I��J��K��L��R��S��T��U��V��W��X��Y��Z��[��\��^��m��o��q��r�������������������������������������������������������������������	�8����������������������������������������������	��������������������������������������������������0�5�"����	��
�������������������������������� ��!��"��#��$��%��'��)��+��-��/��1��3��5��7��9��;��C��\��^��_��`��y��z��|���������������������������������������������������������������	��
��������������%��'��)��/��1��7��9��>��?��e��g��i��k��w��y��z��{��|��}���������������������������������������������������������3��A��G��Q��R��U��a��������������������������������������������������������������������������������������������������������<������
��������������������%��A	[��]��m��r�����������������������1����������.�.���������!��%��B��C�����U���
��������������������������[��m��r��������5�
�����C�����U�����������������y(��,��4��6��H��I��J��L��OT��V�����������������������������������������	������������������������������������������������������������&������������������]_��`������������������������������
��
>��?��hk��z��{��|��}��������������������������������������������������������������&(��,��4��6��9��:��;��<��=>��Y��[��\��]^���������%��������������������������������������������������������������������&��'��(��)��*��+��,��.��0��2��4��6��8��9��:��;��<��C��[]%_��{��|��������������������������������������������4��>��B��D��Edfh%z��|�����������������������������������2��@��A��F��G��U��X���������������	�������������������������������
��$��;��A��[��n��~�����U��������������������$��;��=��A��B��[��]��b��~�����U�������������������$;��=��A��[��]��������U��������������	;��[�������U���������������$��;��=��A��[��]�����U�������������������#��%;6=:A!Bb��:�O����Z�L�9�:���U��-;��<��=��A��O�8�����������U��������
��$��;��=��A��[�����U���������������������U��O����$U��

	;��A��������`�����U���������$��;��A��[��m��n��r��~��U��������������
��$��;��=��A��[�����U�����������������������$��;��=��A��B��[��]��b��~�����U�����������������;��=��A��ORU��������
������%;��=��A�����������U�����
��;��=��A��[��]�����U�����������������	;��A�����������U�����������	;��A��[�����U���������������������������%��&��/��9��;��<��=��>��?��A��F��H��I��J��K��L��T��V��X��o��q���������������������������������������������������������������������������������������������������������������������������������������������!��#��%��&��(��*��8��:��<��=��?��A��[��\��]��^��`��z��{������������������������������������
����4��?��B��D��d��e��f��g��h��i��k��{��}�����������������������������@��F��Q��R��U��V��Y��]��a�������������������������������������������
������%;��=��A��~�������U�����(��,��4��6��9��;��<��>��F��H��I��J��K��L��T��V��X��o��q���������������������������������������������������������������������������������������������������������������������������������������������������������!��#��%��&��(��*��8��:��<��\��^��_��`��z��{���������������������������������������
����4��>��?��B��D��e��g��i��k��z��{��|��}��������������������������������@��F��Q��R��U��a������������������������������������������������������������%��;��=��A�����������U��;��A�����������U�����s(��,��4��6��H��I��J��L��OT��V���
������������������������������������������������������������������������������������������������$��	����������������]
_��`�����������������������
��
>��?��h
k��z��{��|��}���������������������������������������������������������O6��
�;&��;��<>������������������������������	8:��<��[����B��D��d��f������@��F�����O4���9;��*���������D��������������������������������$;��=��[��]��*��������������������������������������D��E��������������������������������&'��(��)��*��+��,��-��.��/��0��1��2��3��4��5��6��7��8��9��:��;��<��=>��?F��G��H��I��J��K��L��M��N��OLP��Q��R��S��T��U��V��W��X��Y��Z��[��\��]^��_�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������R�������������������������������	��
������������������������������������������ ��!��"��#��$��%��&��'��(��)��*��+��,��-��.��/��0��1��2��3��4��5��6��7��8��9��:��;��<��=>?@ABC��[\��^��_��`��y��z��{��|���������������������������������������������������������������������������������������������������������	��
������
����������������%��'��)��/��1��4��6��7��9��>��?��B��D��O��T��c��de��fg��i��j��k��w��y��z��{��|��}��������������������������������������������������������������������������������
������������2��3��@��A��F��G�������������������������������������������������������������������������������������������������������������������������������������������������������������������'����;��<��=��>��A��]���������������*8��:��<��B��D��������@��F��U������������������������y��������������$��&��/��8��9��;��<��=��>��?��A��B��F��]��^��b����������������������������������������������������������������������������� ��"��$��&��(��*8��:��;��<��=��?��A��[��\��]��^��y��{��������������������������4��B��D��d��e��f��g��h��i��������������������������@��A��F��G��TU��V��WX��Y��]������������������������������&��'��(��)��*��+��,��-��.��0��1��2��3��4��5��6��7��8��9��:��;��<��=��>��?��A��K��X��Y��[��\��]��^��_�������������������������������������������������������������������������������������������������������������������������������������
�������������������	������������������������ ��!��"��#��$��%��&��'��(��)��*��+��,��.��0��2��4��6��8��9��:��;��<��=��>��?��@��A��B��[��]��_��y��z��{��|�������������������������������������������������������4��6��>��B��D��T��d��f��h��j��z��|�������������������������������������������������������
������2��@��A��F��G��U��X��������������������������������������������������$;��=��A��O[��]��������U��������������
A����U���4*$B	GMNOPQ	b~
���������
�������					�
Oc�TU��WX�����7

%$ABGMNOPQbn~�����������������
Oc�TU��WX����������$&��'��)��*��+��-��.��/��0��1��2��3��5��7��8��9��:��;��<��=��>��?��AK��Y[��\��]��^��_���������������������������������������������������������������������������������������������������������������������������	�������������� ��"��$��&��'(��)*��+,��.��0��2��4��6��8��9��:��;��<��=��>��?��@��A��B��[��]��y��{��|���������������������������������������������4��6��B��D��T��d��f��h��j�����������������������������������������������
����2��@��A��F��G�������������������������������	������������������$������$��;��=��A��B��[��\��]��^��b��~����������9��;�������������������������A��G��U�����������������5��������	������$��%��;��A��L��Ou[��^��m��n��r��~�������������������*��;��C��_��`�������������������A��G��U�����������������������������$��;��A��OV[��n��~�����U���������������Fcc�^$0;��A}BvGiKMiNiOfPiQkR
S
U
W
Y3Z[\$] ^ _aUbrjTmnCr~)�����i�i�i�i�(�
����� �\� �i�i�i�i�i�i�i�i�i�kkkkk







'3)3+3-/13579$; >@B3|3�i�
�
�
�
�
�
�
�
�
� �
�
�



i	
i
ii
i

 
%
'
)
/
1
7
9
Oiciw
y
� � � �
�
�$�
�i�
�
�3�$�$�$�i3A G TIUpWIXp�~��
����f�g�&��� �i����i�
�
�����

;��[�������U�����������[�����
�����/���
C��]���hU�����������������;��=��A��OU���������(��,��4��6��:��F��H��I��J��K��L��T��V��X��Y��Z��[��_������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������!��#��%��'��)��+��,��-��.��/��0��1��2��3��4��5��6��7��>��@��B��\��^��_��`��z��|�����������������������������
����>��?��e��g��i��k��z��{��|��}������������������������2��3��U������������������������������������������������������������
�������������������������8=(A;B+GMNOPQa	b&jn�����������������
Oc�TU$WX$�:����#AB	b	����U���	A
����U���	O1��������U�����O>����U��4*$B	GMNOPQ	b~
���������
�������					�
Oc�TU��WX���������$��;��A��OA[��m��n��r��~��U��������������;����������$��9��;��<��>��A��[��m��n��r��~�������&��(��*��8��:��<��C��{������������4��B��D�������������@��F��T��U��W��X���������������������������e�� <<Z9$;��AWBOGBK��MBNBO?PBQDY[\]^a/bKj-m��nr��~�
�B�B�B�B���3���B�B�B�B�B�B�B�B�B�DDDDD%#')+9;B"|�B�BB
BBBOBcB�����B����BAGT$UIW$XI�W��������������=�@����B�B4����$��;��A��KY[��\��]^��_m��n��r��~�������')+9��;��>@B|����������������������A��G��U������������������O��������U�������$��;��=��A��O#[�����U�����������������
������%;��=��A���������U�������
��%;��=��A	BQ����������U��X������;��=��A��O[��]�����U�����������������
;��A��Og���������U�����������H##?"$;��A9B2G$M$N$O$P$Q%Yab.jn~
������$��$�$���$�$�$�$�$�$�$�$�$�%%%%%%')+|�$���$$
$$$O$c$�$�$TU,WX,�:�$�$�������$�$C���������������������������� ��%��&��(,/��46F��H��I��J��K��L��R��S��T��U��V��W��X��Z��[��\��]��^��_��mo��q��r��������������������������������������������������������������������������*�)��������������������������������������������������������������������������������������������M�%��������*��
����������������������!��#��%��)��-��/��1��3��5��7��9��;��>��@��B��C[��\��]��^��_`��z��������������������������������������������������������������������	��
��������������%��'��)��/��1��7��9��>?��d��e��f��g��h��i��k��w��y��z{��|}���������������������������������������������������3��A��G��Q��R��U��V��Y��]��a��b�������������������������������������������������������������������������������������������������������������������������������������������
;��A��OO[�����U��������������
;��A��O$���������U�������������A��o��q�����Q��R��a��������$��A���������������������������T��U��W��X��;��=��������%�*�����������������
U����������
��
�,��;��=��[��]��n����*���������������������������������U���������������������������������������������������������������������U��V��Y��]������������������$��A�������������T��U��W��X��C������������	������$��%��;��A��[��m��n��o��qr��~������������
��*��C��_��`�����������������������������������D��E��QRT��U��W��X��a���������������������������$�������������������������������E�������������������������������������
D��E��8������
AB[��m��o��q��r�������-��������#�*�C��_��`���������������������
"DEQ��R��U��VY]a�����������������������������������������������������
	D��E����������o��q����������������������
EQRV��Y��]��a��;��=��������%�*�����������������
U����������
��
�^���������������������������� ��%��[��]��m��o��q��r���������������*�)�������M�%�����*��!��%��)��C����������������������������������������
&E����Q��R��U��V��Y��]��a��b���������������������������������������������1��������;��=��A��B��]��������������*��������������������������������D��U��V��Y��]��������������������������A
o��q�����������������������
6DE��Q��R��a��������$��;��A��[��n��~����������E��T��U��W��X�������������� ����������$��;��=��A��B��[��]��b��~������������������������E��U�����������������������$��A����������E��TU��WX����
A��o��q������Q��R��a����������$��A����������E��TU��WX��������$;��=��A��[��]��o��q�������������EQRTU��WX��a������������������������A��B��o��q�������Q��R��V��Y��]��a��b��o��q�������Q��R��a��H������$��;��=��A��[���������� T��U��W��X�����������������������$;��=��A��[��]��o��q���������QRTU��WX��a��������������������;��=��A��[��]���������������TU��WX�����������������$$ABb����
HTU��WX����U��������$��;��=��A��[����������T��U��W��X�����������������
"a���������������������������������� ��%��A[��]��m��o��q��r�������������������������1����������.�.���������!��%��B��C�����������������������������������������D
E��Q��R��U��V��XY��]��a��b���
��������������������������Ao��q������QRVY]a��;��=��A��U��������
;��A��O(���������U�����������O:��������U�����OI����U��������#�C������������������
����������%��F��G��H��I��J��K��L��M��N��O��P��Q��R��S��T��U��V��W��X��Y��Z��[��\��]��^��_������������������������������������������������������������������������������������������������������������������������������������������������������������������
����������������������!��#��%��'��)��+��-��/��1��3��5��7��9��;��>��@��B��C\��^��`��z��|����������������������������������������������������������������������������	��
������
����������������%��'��)��/��1��7��9��?��DO��c��e��g��i��k��w��y��{��}���������������������������������������������������������3��A��G�������������������������������������������������������������������������������������������������������������������������������������������������;��O([���.*��C����������������������'D��E�������������������������%��������+��C���������������������
D�������	���A����������������#��%;6=:A!Bb��6�L����W�I�5�6���U��-����U��6����	���������������������������� ��%��&��(��,��/��4��6��8��AF��H��I��J��K��L��R��S��T��U��V��W��X��Y��Z��_��m��o��q��r�������������������������������������������������������������������������������������������*�����������������������������������������������������������������������������������������������3�'����������
�������������������������������� ��!��"��#��$��%��'��)��+��-��/��1��3��5��7��>��@��B��C��[��\��]��^��_��`��y��z��|�������������������������������������������������������������������������	��
������������%��'��)��/��1��7��9��>��?��d��e��f��g��h��i��k��w��y��z��{��|��}�����������������������������������������3��Q��R��U��V��Y��]��a��b������������������������������������������������������������������������������������������������������������������������������������v��������&��/��9��;��<��=��>��?��A��F��K��[��\��]��^���������������������������������������������������������������������	&��(��*8��9��:��;��<��=��?��A��[��\��]��^��{�����������������������4��B��D��d��e��f��g��h��i�����������������������������@��A��F��G��U��V��Y��]��������������������������������������������������$��'��(��)��*��+��,��-��.��0��1��2��3��4��5��6��7��8��9��:��;��<��=��>��?��A��K��Y��[��\��^����������������������������������������������������������������������������������������������������������������������������	���������������������� ��"��$��&��'��(��)��*��+��,��.��0��2��4��6��8��9��:��;��<��=��?��A��_��y��{��|��������������������������������������������������4��6��>��B��D��T��j��z��|����������������������������������������������������
������2��@��A��F��G��T��U��W��X������������������������������������������:��?������������������,��.��0��2��4��6��=��?��A���2��U��OR����U��:��?������������������,��.��0��2��4��6��=��?��A���2��U��
;��<��=��A��Ov8�����������U���������������������%&��/��9��;��=��>��?��A��FH��I��J��L��T��V��o��q����������������������������������������������������������������������������������������������������������������������&��(��*��:��<��=��?��A��[��\]��^`��{���������������������������������
��4��?��B��D��d��ef��gh��ik��{��}������������������@��F��Q��R��U��V��Y��]��a��b����������������������������������&��/��9��;��=��>��?��A��F��H��I��J��K��L��T��V��X��o��q���������������������������������������������������������������������������������������������������������������������������������������������!��#��%��&��(��*��:��<��=��?��A��[��\��]��^��`��z��{������������������������������������
����4��?��B��D��d��e��f��g��h��i��k��{��}�������������������@��F��Q��R��U��V��Y��]��a��������������������������������������������������������%��&��/��9��;��=��>��?��A��F��H��I��J��K��L��T��V��X��o��q���������������������������������������������������������������������������������������������������������������������������������������������!��#��%��&��(��*��:��<��=��?��A��[��\��]��^��`��z��{������������������������������������
����4��?��B��D��d��e��f��g��h��i��k��{��}��������������������@��F��Q��R��U��V��Y��]��a�������������������������������������������n������	����$��(��,��4��6��9��:��;��<��>��A��m��n��o��q��r��~�����������������������������������������������������������������&��(��*��,��.��0��2��4��6��8��:��<��_��{��������������������4��>��B��D��z��|���������������2��@��F��Q��R��T��U��W��X��a��������������������������������������G��$��&��9��:��;��<��=��>��A�����������������������������������������������&��(��*��,��.��0��2��4��6��8��:��<��[��]��{��������������4��B��D��d��f��h�������������2��@��F��U��X�����������������@��$&��9��;��<��>��A��o������������������������������&��(��*��8��:��<��[��]��{��������������4��B��D��d��f��h�������������@��F��TU��WXa������������������������T����������$��&��/��8��9��;��<��=��>��?��A��B��b���������������������������������������� ��"��$��&��(��*��8��:��<��=��?��A��[��]��y��{�������������������4��B��D��d��f��h����������������@��F��T��U��W��X������������������������)9��;��<��>��A��o��q���&��(��*��8��:��<��{������������4��B��D����������@��F��QRU��a��b�����������D��������&��/��9��=��>��?��o��q���������������������������������&��(��*��:��<��=��?��A��[��]��{�����������������4��B��D��d��f��h�����@��F��QRU��V��Y��]��a��b�����������������8������$��9��:��;��<��>��A���������������������&��(��*��,��.��0��2��4��6��8��:��<��]{�����������4��B��D��h�����������2��@��F��TU��WX�������������;��A��U��7����&��9��;��<��=��>��?��A��������������������������������&��(��*��8��:��<��=��?��A��[��]��{��������������4��B��D��d��f��h��������������@��F��U�������H����
(��,��4��6��9��>��o��q��������������������������������������������������&��(��*��:��<��_��{��������������������4��>��B��D��z��|���������@��F��Q��R��U��a�������������������������q����������$��(��,��4��6��9��:��;��<��>��A��m��n��o��q��r��{��~���������������������������������������������������������������&��(��*��,��.��0��2��4��6��8��:��<��]_��{��������������������4��>��B��D��hz��|���������������2��@��F��Q��R��T��U��W��X��a��b����������������������������������������$��;��=��A��B��b�����U������������������������G����������&��/��9��;��<��=��>��?��A��B��b�����������������������������������&��(��*��8��:��<��=��?��A��[��]��{�����������������4��B��D��d��f��h���������������@��F��U��V��Y��]������������������&����$��&��;��=��A��B��b������������������������������[��]��d��f��hU������������������������c������$��(��,��4��6��9��:��;��<��>��A�������������������������������������������������������������&��(��*��,��.��0��2��4��6��8��:��<��_��{��������������������4��>��B��D��z��|������������������2��@��F��TU��WX�������������������������������������7&��9��;��<��=��>��A��������������������������������&��(��*��8��:��<��[��]��{��������������4��B��D��d��f��h�������������@��F��U��X����������������<����������%��&��/��9��=��?��o��q��������������������������������&��(��*��=��?��A��[��]��{�����������������4��d��f��h�����Q��R��U��V��Y��]��a��b���������������<����&��/��9��;��<��=��>��?��A��������������������������������������&��(��*��8��:��<��=��?��A��[��]��{�����������������4��B��D��d��f��h��������������@��F��U���������u������������%��&��(��,��/��4��6��8��9��=��>��?��o��q��~���������������������������������������������������������������������������� ��"��$��&��(��*��:��<��=��?��A��[��]��_��y��{����������������������������4��>��B��D��d��f��h��z��|������������@��F��Q��R��U��V��Y��]��a��b����������������������������v������������%��&��(��,��/��4��6��8��9��=��>��?��o��q��~���������������������������������������������������������������������������� ��"��$��&��(��*��:��<��=��?��A��[��]��_��y��{����������������������������4��>��B��D��d��f��h��z��|������������@��F��Q��R��U��V��Y��]��a��b����������������������������H��(��,��4��6��9��>o��q��~������������������������������������������&��(��*��:<_��{��������������������4��>��BDz��|���������@FQ��R��U��a�������������������������p�������������� ��%��&��(��,��/��4��6��9��=��>?��o��q��~��������������������������������������������������������������������������&��(��*��:<=��?��A��[��]��_��{��������������������������4��>��BDd��f��h��z��|����������@FQ��R��U��V��Y��]��a��b������������������������������%��9��;��<��>��o��q�����&��(��*��8��:��<��{������������4��B��D����������@��F��Q��R��U��a������������
����A��VY]����������A��qt�����QR��q���QR�������A��t���������������"��Af��q��{��������Q��R��V��Y��]�����������������	����A��VY]�c��_	 ""%AFa8eeTggUjjVooWqqXttY{{Z[��\������C�[`y|��"��$��(��-��/��2��5��6��9��<��>��@��CXY
_d%%i01j47l>?pBBrDEsKKuMMvOOwTUx``zcm{pp�ww�y}�����������������������������������������������
��23�@A�FG�QR�TY�ac�||�������������������������������������������	(` 4;4���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������G����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������+37���������)����������������������������������������������������������������������������������������������������������������������������������44')'..	+
&
(/& %0)31	




&	
	
	
	
((+   





%%%	+!!","9	,,!!#$#&
$$
!:-78"#78	
--"#( %
))56'56'01/****22"			$$
#
3))%%	"



&('						!

			

"



	!

"#
	-#

./0,  12
,
3$
 $$
		!

*+*+&'#

 (g &&(*,46:<<>?FZ\\1^_2oo4qq5{{67��8��O��U��e��k������C�[`�y|��������������������
��������������������(�*
7E*1G47O>?SBEUKKYMMZOO[TU\``^cm_ppjrskwwmy}n��s��t��u��v��w��x��|��}���������������������
��23�@A�FG�QR�TY�ab�����������������������������������������������4~DY|���������������������$*06<BHNTZ`flrx~��������������������� &,28>DJPV\bhntz����������������������
"(.4:@FLRX^djpv|���������������������$*06<BHNTZ`flQ�[�|�xJ�ffcF�F7y�tw�uuc����f�`���P$c���}�}|��y�zc9�V:�@;�6w���w��I�JF�:+01CrCC/08@�..��!�����=./��/}/�{����(��,0�3B������d����Q�I��4�7��T��eJ�W�K8��i����3�} u�,))
v�u`�W�Wk�wn�l�mi�9J�J���t�t;�;/�/'�'y�y���O�#,Y&()*,-./01234789:<>?FHIJLMNPQRSTWXYZ\^_n~����������������������`lm�����������������������$+ ���������������������$*06<�Y����n�3�����T��n�y�����$�������:.J
n�9�9��E�]���������� &,28n�y������*06<BHNTZ`flrx~�����������������n���3����T�����������+�Y�+����
��$+��$+^djpv|������������������Y����n�3�����T�������"������դ'��^#�+tvfonts/raleway/Raleway-Bold.woff2000064400000175540151215013470012603 0ustar00wOF2�`����?FFTM����p`�F�
	�
���� �\6$�4 ���[�N�
�b�n?��z�B#�N	�I�õt�#�1�%��t�Z��չ+��݁y����������ߘLĦ'9�d�L�Cx��tm�n�FP݅�Ŕ}*j61��űH���RJ��Φ_b���f�ֱ&��� 	�����nor�M�ɽ<��R�6f���Gũb'PΒ$(�MFv�у���׵� �����:5{5��U.��\�l[P���w��i�ԣ���3�0�`8�-8���h6
q��˧����*e7u�B2(��`ʏ�w��I9c��A\7j)*�I���YK7ܶ#�F+3P[��ߝ���D/�C%^��O,��l��^����\��f/W9y�[�
�mC������>"�-�a�E�,�B��~Vs�V����:��u�:`+~��3�.ݱy��H��[��O�y��K`��w1b��W1-�+Me��g�m����֡��NJW�MPR����Q��d1KW�lRVwAI=�>Q#J�f����x#�9|�X�]g�y�>*à���j�$|�>��38�-�{���"^�$n��%(�O���Q-��2�srR�jߪ��L䲃%ۑ+O�Pʹzzo%�$s��C@"�9��boc����0&�Q#�`*1�n��R1
l0��#�h@ll����<_���:����4MF^��ED�߲�l�F[��>�b��#~�ο�wZa˦5���t�e��;s�%l�x�K�[ό�F�;Z@҂�G�b�rt���*'ڒ�t����;���J��v�W��	�$�@�00Cn��(��
1'��ɵ���i�i�e�i)O�Oz�L~��#��p�E����iu����
��_�|mQ^���i�n��$�hH0Edh:���6fz��%�h#5MR���i����`l�ߐ�s�fej0�l�����ҕ�y<{س�f?q���9�6�@S��R�|u�G��F��D�sE
#n��������]��g\�����ƲJp��| �d���#I0V!
�0X�cm�9��>�����@��VS�M�t�:`�kD9�'L�S�Ofى���T�t
��k
;��&y

k�?L�t>��Y5g&�P�|��j��qEc�
W�BP��B@D��'��nLQ��˵-q�B�Ҥ���!��M�j�X���q�Vv7�)"��\�����qn+JĄ�}��d#��08'~��°$}���S	-����tj]�YM��|y��uRKN��#t����� �p�m0L1�.W��M�6&�u����E����L�m���R���E�X=�	����޼����������p��mO��V�R�Y.Id��H�e!���@�(uf`
h7S�I��$A���vZ����M:�DH¬A��"l
x�Er¾;�ڛ�[ח�vx��%��o���S6`�s�$u�ȹo�ƹ��L�`ŏbW�p��c��h0K��b�6�D�U�Pe�(��?�u���b(�N^*9���@@=0Z�}��/˰�a�|[�V�~�4�9ζ�d�l���w�\'�2Y0��Ȥ�%�+��TNm��[@K�� ~	ZkZ��LC���];�&:��?��gL8�h�dhU��uL8���:���b9&��%O������1fv�D�� ��� �	�6��Ģ-\��"����U�� �I�iBf����+�M)�h������������>)Jl�`D�J=0T�m��4ƘH�iZ��2�+3�Gk\6�h�;���7K�l��`��}_�Ŝ�:J>ᘬ��� rW��գ>��|E�F�h���iO Fhx��LӺ�[E?��gڰ�l��à�����Zp4t�B���9{�C�
0��f���yt#ə�#�ʤ T
B��Ҕ޷nuw�r)�0��;NAy��_㽹9���ZQJ���(]3��쮊Kӥ��\`P`^`` A�������{m:���R�UK$E���i�����ewȬ����u���Z`���?���%�2!^SD��Pz$T�_ղ�`�X��Ņ�Kt�=%'n�sQ�EO�@��N/A��IN����Nt�Sh��R,��:�qf���4�z:��ZJ��R�Y
��c�X����F3V�ƣ���(j�'%�����2��P��U;�v�,�H�c���'�4����̷3�\�{8[�;�H(F�+�dK����I!�mR"~�!I	)E���
��`��|@-�Z��,�m��
f�h���p��_���
f�lC�hl!+��?��Q���f{l !�%
�"V�V�a*Vd�^�u��?���󸏱-c���h��RJ�2��_ @��"�jEVз�_�~?�����5�aD�C	����ٴ�����ل�R�"�@q"�E���=���"BJ����o�4����TV0�������}9㵿�x��U6��}�B@��օ��s ��LM>�C>��.q�e���%_�eP_) �S��y1�t&�	B2U�F��W(���wd���
��o|��[�@�MZ#g[p
�H�jWb�lfb��ڇ���}(�H��!��FpH�P��	��P@���
8�>>e�o��k�� ��/q�	��Ƴ~&;��,��7�?��v\���E�`�]�\>F	p$��=Lx�݄C���
�I��i���r��a�a�e��������<q�1~�d�G��`R��vj2�c�#!���Kl����#(�~�Ɉo���$�$�R@�*�M��"����3܋�7Iʼc�_�6�[�Xb�@�̠P����a,{l��\NBb_$+��˾���k^u�/�~��-�BķY}�;��J�d<��W�~$��l�<�:��g���NY��wyfFj����Gf���+���I�S��89��%5��^M^a���^��lL�g6� �AJ�/��h�b��*X��-�w(T7
�Y��cV�1z"9ߠ�GP�n���ݢQ~./GnLF��B�}_'�o�u�l�{1B�-28 'T���Tβ�����bAx��*�rUU���|�g����!U���G�üX����cm��r������(a��g�5�(��1ᒡ��?�3F�!i��@���t��ц{:����U�M�{�&lL/�����Qu�d(
춼���W�N��0�ϸ��p̿�y���BT*,e6�v�J�E�7�5������x��܇u��Z�ڕ?��_F"Y��,tY\����cX�����s�{���>�F��]}����ත��_��eY����
��m���ӫ8�yx����vd;x繋�d���(�G^�xp��6�X���?�bs�
�|�O���Yq�ؑ�#׏��RZɜ7��A��	y$2;rBIg�i�j-�=�6ۏ��\�
�Ym��k�+\��%�Dr)H�	z~>�OϨ����3�?f�{+O"����被��3��S�p��l쳏�z}���=���=��T�,.�oJ�Y���f��$o����c1…���,�$s��(A+h�c�T�xbcH��76r�S�4n����4b��I���HwJ�2���g��Ǎj��Fm��\�M�*~3[�e#�TAfB����p�djj��0N���(N���8NO��$eO���B����Bh�o�9����C��BKM
"�vJiPJ����X�A�r cME�*a�2Þgm����H�E���	��
�6��	���;|ٚ��q�ߎ�Nt��w<��T�,ğ'���0�*�����F���w�
��)_U'�ka����q&�6J��b
��e��"�{�g�<�����+��|�bhG����MgVOM��7+�Z �|��Y�y�z��8ReOM��=����yo,��B��Xɱ����RFU4���ƌYsDž��’e+k5���y���|tܚ�۱kϾ�=�SϽ��[�;�;�DN�9w��?�R��)#����<���<��8��MI��[���1�E�ߜ���+\�+�3��,X����Y����L �|<���ּ#��|���u��9!�w�_�U��<H�%/EU�^�ո�k����W+4�i��u(��T��?A��.?o�2[�\��";�ݲ�����������c�i��|�byy}�:A|it�qR�)�����!�.��k�o�.�L������:Q��!xo�I��~B
a&���.�"4ʪ�@س�L�C�N����D�J����XΎ��_�Y��6E8���	=#)��������a"��G�͠��Fx��_�������!H^N�Q1q��*�ώ���e���s��'�eC��<ە�;I��t�qש���c�À��}�9���J�<�+\��:��R��K�UYZ�����P����j.�s� �
D��E:�G�%v�C��`��xkΎ�~:��n�o�T�LB�r��/��H�l�m~�\�U���Zr��w����Ie{��<��N�����q�"�Z�XY&T��҈b
��%��[��!{,ړ��9�[O�t�w�<{�gለ�[���8�~t
l���|))vS�d�}S��\��<0�*��xL�n��E|��Pʺ�r�2���&W��ndo�fy�K��o��>��R��� cS��(�) (P�*c�Z���ZS� JIۆ�	hrx{�b�DN�6�ِr>ł?l2���g�����/�R�X�J�[��P�T�(�j�	��_��i��P�d���!�M������
�ѫ@?�.+jc��vtrz�{��0�U/
�-4seZ`&ժ����������9�k>~A��4/_	����K�䱔���#P���'�-Sk�2c֜��رd��Z�Y�s�֯�ˆ�Ͷ�m��iW��;p��x깗^{�}Gv܉�:s���/�B*�l�"��	��fd��N>D�B3�dCw��0�2lӣ��� ^r�`O���3��Ǎ��3"K�����;��v�Ϭ�a��L�x��]LQ��|�F�w'��	qݹ����K4b{\G�X�_)���ly*�*I��8V�Z�>
�ɴ"m�C}NE�7���۪]
j�6���;��ad�O ��>'��t��zN}[���ݲ���݃�N�/��@��X֐�Ǘfe��s�����9l�VL�V�"�3N*2��Oy�.��u�
��OCd�2�[v9��\'u�{�x����82�e|�7q���*%��YFvr��W+Qy�R��:#�ޒf����70ޘ@"��Y�ԑ��Q�[[K������gΆ��6�m*ɳ@p���`Hl��ْ�6�]i����5ĚM��\������~
�5H��6�a�UAdb���I$����V���us��_6��Cr��UL��H5���˧�fz��@"��I���%���LnJ��wCe�B��ȟ0V(��Q(��q(���I7zf�e`ep%��B�������R[^%�4Ji!tG�i7�7/�h֐�	�]+J�=��C���eK¾;����*��p2�j��Y��j��ݎ�8md����fT\�Vs��™�:�X,��K�ȉ\�@c/��!3;|w���;��ULᅡf�|�+w��SXh�~jS�R�_�����ij렀G�ΰfd��"����7�,����Q1<��(Z�t^j:˙t'�5�V�)!��
���܌p��Ujv�>�m2�3Q$RQ���搅��E�9��ULᅡ�YVm�U~�5��e2���y�f�c���2>_��8��|�X��d2�~>����ݳ�
��a`]�vN��^
����Z�Pc1nr.,�1�}"���w�E��&���BY�6�a���i�̻�O��Ft�$A�}�%h�0a�|��p|[B#���K!�_�q�z�&vN���=3��y&��R��SE�-|a��]""Q8CG��‡$�f{��㶄0+KVGjr�V���̓j#��!� �Cн!9���7��CX�r��_�[���@,��F�&��*��$p��2�a$HPA�������/�qD�"�J��P�,۽Bh:�`�R�E�ۆ�MB؝a�|�L驙��uiHZ*lt)ܗل�,χI���̴	-��Ѣ��'�a�bf��Xs��-LÙ*xJc��L�,	�>D$*hG�V�J��)�1�77p�� �jCs��ڼ�g�5A@p074��0�����仝�
�K����(ԟ�a�* \�T�g@�#S�X;E�X�G����B�+�T[U%��"�[�F�n��T�at][�7����͓���I4dbr	L�Rl%�p�*M�fFU=�	�:��Z�s��sp�Z^;]��C3v��d�JZ]YK�����x�:�x>��;�[;P9
v��U;'?;����<O��|�G�@&b�b�ȦU�0�yr@�\��N�>�
^iS��D�a�O6���a�E'�Fϥ�������{N���tn�oԝ�&��f�
�Ӧ���#��7]�}T�&��"�1��-a�hZK�@�4z5��Pk��A(�Ơ����Y��Ǘ_h�7a��&�����w<�[u�l*	OtϮ�<���ߍ+ɤ*y�O֭�a�l�a�Qd}�0���	�iQ���Q�(Rc�+�R%ȔI��sp�~/�
��31�v��ղIp�ÐPv�w�~�(AC��D�1�0Eɔi�*E�2���O�FR��!R���9ۿ��f���*t]�G��a�:E=n��Ф�,ɺ���j!��,�7��'la���t��'����;9�1|),"*&.��m)i�2���jg�C��l6�-�HnL�,M,M,6�F��ޞ�f�و=b��#�>þ�2
\����B}h�61�F�ff	�>���<O�;~��jW�[�D"�t��+�*N�;�cf޾db�Ҋo�V^����|g� k�1k�a��q�n�S�&���]�*#Yy����r�1�J�5�ھ�� ���vmzBkЈa�VF;FX�@$��۷M�Xޕ����yė�L ق?����eO�~9��io����d��H�J�8]�����F�g�W���Lgq�:n�V)�r
�����c�kχ��B%z�([̱8&!�t)��g��F^P�D�JUԞ_j�
Ĩ�wj�)�u�=��������$D`�|J*i�M��3g�"I��j�
:�3�?��d� X�F�c�B��Ct��Y]��(9�1�}H�Z��� j2c� �!�L��b�u�O� �Q76�$ԪW?��v��-��l�IuH;��#�����.�
X
�,u�}ੲ�P�Z~��~n�>���a-z��L埿��#�gh'��:!�\÷�l�)��g�u�'�F�v5�������j6����܊�ISW����Nx_�J�XS�kA��n���H@������)&�f���s��g1��/�I5B�ц��OۨՒ�9i�Ms��%�X>���J8"�b�)�HI�Ȏ���Ԉi�1k�BZ��E#���کl�.y�� � 2%gN���+z����4���+L��u��ЯcY��`U��t��r�Su1�g��7J�!V�bcr3����SH�����0��|a��u�r���S׊4!f�Uz��w*�~ڋΖ"V�	U��b e2���Y�sk������d�A��%�h���j��=y<�ƇB�B��iA���<�d$��o�(F>�j!��L{ְ����kҍ��!�O��ɦn��dU��:'{g��rT�ӽ�g�o��ç��.�#��5	��|��>^��M��*
���kt���3���OCg�c��9�e�Rc�,qF�!�]���7��ݍt�Уo����U�;C�W�%�BȞ�NM��bj�Q�Q��x�,_0X*�`j0�ϐј�L#�#�P.����� ��0�ȕ�J�ڧ�C�o6Zv�i'u���U)s#��∙
>!�P<.�+5v��c�u
)f,We9`��9��qgB�{pbH��_�D)-�j�{�M�&�Lf%�v�;��Iʮ���s�^'��mo��30�O�c�*WUWu�g����<F�#Q%�y5�BvR����2:!���-��ku�
�l#I�R3�Q�gB��r��ل��Cui�la���:��������{>�ر8�ܓBZF��$n����O&/M�MˌYs�bՒe+k5����ʗ
�ǭ��=;v��w�p�{J��K�������r�̹��������}X�r����.�fd�1\�ffɶ�[�4}�$2hȰ��1�*qx�Q�c&��Ύrr��w���~3��Iޕ�r����7s�*|3QK1Jܕ�2��W��))WS��9�>�P-
�զ'���F���'I_s򺦅Ow����ۃ��<'���L ��m����[f���N�v��-�yGR��H�x��q�qt�c�u�
�F�(���f׮�=V���B�P`p�u�������=��/�
#=�������"	c�*%��YFvrN�U�JTީTE���� 8�~��>�J�lIIi�M��3דԒ\�?�O�4���ߟ`�9V��O?y~<�U�wUE
�)�M��Vq�?vb�">z����S�g��C���1�;j�I�0�(>��f�V�*���|�s��ݍ���*H����* 8��BKωg� D�ϫ�RUdJM����tw��|����U����FB�Y�����Zm$�K���4y���흶�N��Xɪ����#�S"�j��J�R�b�X�}�ZOmLA)�q�i�jǮ=���OYϫ^z��;�;�Sg�]���b?Q9�Z>����A
#ӎ1�T��(43K�}�һ�i�dАa#�aa�Gb<��	�u���5÷�Z}�]�~;�<��� �΄�azw��][�FE1�IP�)���B�NI�ʘ���sm_�c��@�6=�5(bD97��8<�H'��nv�{8�h���S��@����	���D��=9��i���9lDs���%��w�yP*�I}��eb�z�&حB�B�P��s�@1yP޳|>_&$�pE���GY��݇��@����Gކ &K�(�#
�E�Y!�5D��e*y�[%)��5���
��S�l�}!�k��mu�
�D�{.�����ṹn�d=Ex����K&���Q�:�2̺*Zn�������7���|��Y��-�YX�q.N H�G�Ճ�`m*�1�F�1��Z)��
��0S%��J�.~x�;Z@����hPZ���78s�On�*�{�G@P������b9V�ٍ	�f̚��AA�T�	�w�\^z���w��̹��|�_
ӟ
�%ʉ\y��(,Dɔ�<�E�8��2Ūo6�lU;��)�of@�b�G6;I\N�4��z��E����b\c�qO�<({��,�."'��?t��X����U��X�I�d.ȝQ��դddh�b�r.��b^��v�d�U�ˀ��Ю՚����}���v�9p��Yuі-�R�����$��T=�%}h��Bw��YeVt+�e�X%ccF���H�l�r����[��F��λk����Sj�|?Zۡ�cw@n�0����U"�����-aOq4w�}vq,4Z�uK��`u�ϖ:�����eB�i2�V<Tw�fAMit��x�X��Ƣ�(�i�ȣ����9cҭ�gd�|]�	�못�A{/đM�s}4��r�%���'��!��8��uc^	Mqhn�_�%ndt�Q�0:���}�i\^�؆�{J��9ʇ@9�/�(ר�E�0�G�w%$���	B�*�IzYXr������	����-���%�B�3��uM�~h�ٶb.,`HU#��������R��������֬�i�����~�����þ˵U7��1��F��W
�A��:'?Cg�x����Y>H�V\lv:�F��,��g�U�)M��Yn`�1��裀Ji"?�i!ꐞˍ�8�wc�cQ����M���Ϫ��m�@��+�p���6��ݡ:�Q�	�kr-�D��jY>�н��'������e��E��jsd�+v9��j���YX���I�X��e���f������7�zrS�ye���;�d%�UW-�j�����$�'1~)�����/`j�ơͤNK2���e2�L&sw�us����H�PJZFvj� 8e3״˗
���Ǯ�;��SϽ��[�;u�r�z��<�
�aEGw2�����^	��យ�d�+�`��6���i�[>�Џ��Y��d5�a��jON!�e�T»�	�.�w(��k�at���>ȸ��x�ׯ�i�q��#&¤��B�'�5K�EW7��X���"&/�vW�>���b��=���%"!Y�ϧ���M�2Q8�u+�	��|t�|4���@e�� D�ϕ���Sr|��r�³�d��2�M3��9/������P��ZXDTL\"%�R�2�>R(
�Ciݱ!��5Ƕb��ڳ��U�P(
�.��L����K9�r�Q�W���ܯ�͂^�4gJ���mhW�l侸�Q���h31O�<!ܔUa�b��jON!��7��T�i.�p����z��¹C���ֳ���X{���R80�J��Á�m�]b������y�Gj6�P��v��."HD�j}�:�O�/٣2g�v��`b���ll�p[�
Qǂ�~���AD@�b���)�#4M�i��y!B� �{�R�W���wgo�:qj+��JA�B���bNi]�W���5�y��<��bvN��r�
ۯ�Jj<#�h�0�p��8��oM�
�\���5Р,1��v�U�ԛ3����g@�f��@_Ä�W3��Y]�++E�n
��:��>���K=�kgv�1b"fr.8(�p;#�Y���E@
����EQk�@)v����G*�t��K��$x��&c�0k��M06Iޔ"�`>�6��n��P�3:�ap���w�`7���a�_-�ݾ�-@Ô)XaG�Vx]�*An��<�h��:Q�!sL�� �I-�+�*ui�utg��`4YXZY�<�=�Cd7�8�����֭������S_��Q�(���hQ�rr�mP�6�B�(��(M+=��H]��x5{o�V�����I��������d���#�X`Аa#F���x�D�����;���&�m�ݱWdE��k�D��퓹�
$q�<J�
Fщ��B��!�'�u�c��D:���TgR��Y��&�e�yd��A+ª����,t)=�S���p�蜹� �P��n8^)^�Xt	ԓ�(�b:1ss��)���o.�3���� �"h�O�&�@�dD�dߜ�s�?�Q(o���xfpx⟎��+�BoF��q=q��PC��(s>��Y��*u�H�ï�g�g�xf��`�0��������^�`0U�SHh�*�܏M�x-����5�R�*�����4�6�ǐCS��؞��ăR!>HGA0R���
�#�x3{�.Ap����D�x��>>��WU���<��M�u1w�b�g^��T3��.3�c�3�'eDTɐW���%9�~�gTN��]D@g����'�Wܡ����r��0��CX�7��W�C6	(�n2�@�L�}sK�F+�iE�����Z�a~�c
[�98�V��mw$�FDTL\"��"紾���R��٤;[��}�Ic�Hs�<-ܦ�R�W*d��|���V�m�����ik��5;Y��{	�M┹�p��۴q���ZrP�zt(:�k�0���̜�0�2�o4�_�Tn@��ɚ�5kj
"�_�+�#��u�p�Ky,~��v#�3aL��Y��,����c�&F�r����<h��ڳ�D�7)B!�QGFd:�N�Z�&�c�A����D;�6��^z�tz�iz�uy�n�|H��/���Z��nTܦ�Æb�#&��nW�(�e�lV.��T�S����D%*Q�؈�x�4(����s*8��ĂoV�U*�
���j���$�i�7CA����W��;�[�1�3#����`^Oy�~�v�E�УA�Ϟ�w�p�k�L���Ǜ.�׷�g���#�s'pUh�Vx�(:�b�B�}4��\��lG���3=�m�o��?C�f��*ý�x���n�q!R~�)���tC$���2dh�a��
><P�A�!
~(�S A**%��E�f��Z`S�P�%7a*MS@ሔ%(h�Щ���[km� [���`}]7v�$=U���Q����pP�m�]<��_B~�ߕh4�k3��Fk��_�J?51l��DL��1P8"�C
%t*�b���ZDE����`T|-7JS�P�6�x��`$I�����eƂe��6�eǞ��I^Բ�'Uߠ[�-�H��:E+�(�a��9�J�٩*y�|(<(rBqҸnh�ڹF���W���?����GbCF��q`2�Qʹ�"+rpي4�2Q9��q̉�R}B<!ڐeY�e=r��}��B4s���L� g%
˽��^��D�b�[��:�)�X��r�����q��&n��q�ѵ���t}�30���E�z�GzT�d���Zy���,��a���>WC{�?Ν��U�A���?㤔9����=��{���}r�oͭ2��c�>��`��[����:��/�!���]%�ѥ�!�I
�·��:�����=z��Uy~T<�w����2:tV]��j~�4'ӑ�w\(k��k�Ѐ���h@#�=��`��(�ىo3	���#��B�$�(�e��Q	BEŽ4B���rl±�@'�X��VY� �"��2}�⽄.
4F����L���
4n>Z��m�����}�7h�(�	SkZ��X����A�l��;�2[�dņ{���p4��C��g�ӎc:	��~0hȈQr�5q�_5���M P�P !
��z�3�T���	;f�!���bÑ�����jl]�`G���Ș8�G�'Z<�좷�x�ۋg	��f7�`�U1kT��!�eP\��+Pq�J_#�mbE�c��|=_���i�3���|����~��o�@}��� LVKW��FW�-��2��ʳ�@�O��Y���A1�̃�a���q�y:�"�Jp&Ys�-wq��m���l�#���|
*=�SCr�q�.����uS��%��)��
v�(�PH!��Lj�R�i3���-y��(�=��⸓锹�Δ�ٓ��9�~�u�:��J*�U�7}eȉs�{�ט�y\'i�-6��ړSHϠw�hz&�]O��r[O��{�i|��[%S�00EEW�C-�yd�:�xL�ҩ?[
�	��D�\��� *�bJ�%���t-'0�̆�tJ����f.|fx������i�w��
��i�h�&�n��O�A�F�M�JӴP8"��4J�T�Tͭ�6E��qP	.Gpq�JL� �C��u�4��.���F���g�@�|7���)@FȆ޷�M��yw��z��T���F�
�s�Er^�K���3��9R����=��4-�B����|��D�C1��*��wV��V|{H�2xW��QGLֆf~�l6�`�$/�k��=��8U�v6d\Q��_�N�pPi�����x���ξ�����b��B	Ca9:�p�X��*m����Ҁ�15�I�y��Ŏv���_�~�����0��->��GCd��L��;C�\p��׎��t�7�$(�
J�Tbv�b�7J��s����u��c8���nv��jP	ޏԲ���k���78f��X���}�K�9�~{/
o���p$ݳ����
v��9���2������ݖ�`Z�sw���k�e�*�p������Ãs�S*U����A(�����N^�!!�<�z���@V�`��?��� )	�,?^3
�#?v�ӂ!|���HG\�=��1�;�o��
���D�h@g���g�l�X�'|	�}����E�h���A2���]v����i����T��Pna��>�7h�(�	Si��
GL�*c(2efǥt87[;
p�%t*�b4���ƱU�1wP	^�V�8M�[�x�^8ZD��u��S&!i�����V�&ڨ�61��.kj���� z��e~ C]�Kë6J4+�*A7�?7�ur���%pVVVVVV�^��L
�
�
�BE�d󭭭����
��m�3S}LnjYs��Ғe+i5�����~-_6lNn|��=_8�U<�SϽ��[��h�8���م_�UN���j'J��F�M�#Qhf���[zS�ĠaL���(x�LI�v���m:�I��,[[��j���:�/q�'�>��V.ׇ�!l-*S$N#��HV^!���rTF�auGs��+�B�4Ԇ�@�`##�X�@$8�.U��������9	��&r	�c��˗	�eG�مv�76�6�ͺ� o��)��`(�
gc�O�^�x1�'�Br�O���T�Aq:)A<ּ�#�y�>� .�o*��q��Z�"�EV��$����S���^���(a�;<�<ӟ���)��e`8�%H�����!G�
1��H�ER�|��0lt�O�#���?'�P�5��,X/�����Kk9-��JB���XUi�\��l�0���X��v�	�R����`
�5
�\N˽V!Ȥӌ\�i��-&�����E)m���%�B�;t���RyW��
�����X��(�,��vl���@�֯/S:�����67�U �d�ᄎ� 
[���������4k5#�
����܁`(���OD��U)�/��9k.����S6tބ��ȿ�I!�ѼOC�K�k�X���4���x_[R&p!�-KY�C= �ړA���U�B-��݋���ι��GRsƧB��j[��|�j�dʫ�h�@�*�y�
u[uw'�+��ک���,�AT�
�բ��˨�hիV�����i*o����;$�~�X���6��`ƭ����C; ���`�♨��+s)
,Mi��_�I{Jېǐ6P�'j��˖5o��[��:+�ŭ'��#hLUĔ��^����!���p�)��J���1k]�i�J�����|E��{j�-�r�V�sAT�"C���(j�c�,�d��W�<X?%�:���	��'��5�.J��6k���HO&�z���2�y[m�9+��.�5�[��[8�~�K�!�`;
��rV�*JB�~�[��;��+o�.n	k0e��{yۀ�a����5@x�[F�<l���a_U��Z*kc���vlȝ�)@��ȺœE�!׻$D�f����R�f�!k�z�5�h�S,R�+�;a�@J�Z��:��vJG0P��+�&�HS*�%���M$,�g�p�T�"���[���\}�j�K�%NњwiP��7rv�����/]M\yje6P��WF
�1��9U�V��5'k����r}��]�W&��HC�"��P��f��]���d��tOf7��
ď_b�rs��T��@�"��LKQd�"�q�g7�p#��Ҟ����[��WνVC��T%�)J41�2u�I��lқz�%���{TY�cwA
0�쭫�vzy��3����XX�����&�!u����G$�
�Ph�y�R6�I¤fK�i��̵�ٓ��������c$�	)��?N_�D|H-�	��}���K�KAm+ۑ���#�'�V��׫$z���Z��ZA��~��.�TDݔ7��̪j��y���dM���inh-UM��@I�M��������oJ����(���Jӝ��+�hp8Oܨ�o�8Pj��w�+M�e��1wN_��iy�	yOK����[�P��%P6K��i�Wص�>"��Uj���n���7<�����q�w�\DQ�G�v�����6n��q��V�:4�FW8�a�x<�(c�E}�����
yL��*V���4h�A%(���%�R�â�F�M�K��̠3��0ΰ��GFx#��1#FD#�;�Ӑ�д����ܪs�:����gr�;[kۻa�3Q�X&n/q^��2e%�P��$�*cj�:�����@n�Y*�U���^��z7��Fh�ΰ.|���P�tŀ��	D�W]:gӼ��7��p�Q�g�OFA�1�>�ep������[Azt�u���.Y�����E�a�6j7�@a"ġ��s��s^G|O��	�ǟ�O2����H���d�d���d2�1�1�ᢄg<a���~m�)Ft�#���:2�B*���
�֘�Β臭֯-;��B>������]�2��[U1�gi7ޫD ~�,/(��?�}�=l�PTҤ�V�?h�r{�e�kZO��1�q��@���\ʀ]��tI�pY��`([ ɐ-��("T
EWb�b�c)U *U�j��o�6H�$�A5
��]f�dSZ2LoZ�\��Wju�}!ml��,2c�K�z�vN�I�<!/����ɡ�𙰈���DJ���ed�tA���m�㮝�d2�L��]��bE��JYEu��N^���-A�ԔL&�w�	I4�1$2���m����}�;�ޟ/�ɫ�A2H���e����((���>���w��~>.�:h-�Y�8���hL;��)\��ы�s�:�gJ�@��<��_�UDz�8��,�.j��7)Ǐ���&��E���zy#��Co��;�Jc��(�������SEVjr���2��:���2i��X��Q+�Mt��#N')(�njה�\�ߎ/J3G%�%+R�z��-9���Q"�;���vz��Q�hq�~'yS�\UQ���k�Le�9t�*��cq�[����h���E����y����)����-m���n��k���?g���<�c�՗�P��S�nv�0��<��#\a�|~��]fUC=ҭ�u��׾>W��a=�Ùa�DVy��Y���tq�5����-�S����������W|9#�k?'��hL@aZ�
�0WX(,Ś
[v��ه�8rZ9;<�Ļ�m+��Տ%)��6
����T�L�w�IY%9Uףz��P�ƋT�����x�GW��F�w>�'����S~�2dĘI����]dҀ2�l���(�9��j��IP����oE�����j��)��Nnm'��Kՠ��5�_����A��bT�L���\�+X�_6�S�e�_N����y=U4�q�ީ;���蔮�a�=�#��,��T���U�[�XY&�o���R�t+Z���X���R36���h&���C������Z�w!i��bN�V��Mj��Z�>��
�T�N���T��T�����嬇�y�#����he:��ڭ*�_ �P V"aȻpf4�v�BqT�U��/B&V7�bP���F��������./Q���W��5�����J�޾��l,�h��~���Dv/�K�4���q�q���yr�����WXԂ ��͘*�L�lت]�r?�c���
mT��yt�N�ų��B@Fv��;���޼\K[Z�~9Y�-%�L��sE���k��]e���&�Z��c@��Zn>
�4{"�3%)�gsq@_�"z��B6>㟇qxNr3L^��j� zd�B�c�9��|��' ��@�4��4�d���b��9[��
��&hn�y��#����0���#������L��ޒ'
 �v�
��O7�͉c|'�f�m]Й�1v�1�FB�%�a�%ge-s"e��rt���&|]tq�T�
�K�����=�3,���՞,�OK>+��lϸ�G���HL�t(Um$Y����g@�Y��V�-b�(ʹ_�����Hn�a<y������A��*9V�dG�}[�������o]�����3Gn��:|�ԛ���
���Vߎ=��8�.ڲ�R*Hj� p*a�QJ���{������
�@njc,��:�d����'�BO�xs�.�1U��Zɺ�x���]�\���2���up͌+d�iI��QV����0���ej2��΢/�j�O?��tq$z��>���:�Q�=Q���Êu��sprewYxg����M�e�Ua-�A�T�F)-�nR�)�O�z�42S��3�(a>�l��7�y<�G�"�J؟��}�4]j����|�2Ż���5p#xi�-�b������w'c��}|;�Аf�R��NE�(wӀ�����HX�D�#QA�5X��!����J�É�q�hE,��s���e��?F�qq�[�T�7x��U`����S�Cï�P+��hL�A�Y�+�y�C��M�sޗ��K��z�C'c�5�s z �ҫ{Z=Ho���~�i@?w�#Cg�:\���w>��0f�J$�/gl
s�J(��)��Y�V>���F�����lt�h��U���:*���J\�
��˴.�a�,�m�1ӊH�����p�m�5*	_w�W_�=�h}�␹�/O�iq��-��g�]��=k��Q.7�S�3*Z�Q�<��Zs#ф��eو7�،NG��}�B��4�D?!<�*܊!A�
't�L��H�����d�H�=���t2��v佲��89���tP�[ظt�H:C8/����(��p��S �M�k��8��
�;�ΰ
xRd�e<��8f?�C�����Ӧ$~��(9�q}D+b&,:O�ڸy� N�$E���e���D�$�S�ue��3������F�$�*vdρ#'Ϊ��l��
�	'�6c�+�9(�_A���W�
N�w�&+e�i�z.p}3U3t�L<Un�x]���Y�Y��b�6*n��Qt^�XP���Ht+���x~��o@�|�}�O$�ntO�ʖ��~08��Vώ=��8�.ڲ�R*Hj��S	?�RZݤ^'�G"W��iP
�@�+@
\�~�'+y�yqxw�g��S<:��#ZS%�KA7�|��{�*�����0�d��5}�}����	�Cd��
o1
�3ͼն��g�RAB�q����%����Εb�=�t��$#�t����`3|�^9
�eJ>���,��b�.4r#�Qxk�{",I$=�:[�1n��^k��Hc��
�a����G�t�o/	�p�˲��o��z:&�V�3�>#�x��ǧ�ky-��c����Zݞd�[��
�f�;[���Q�g�G�6��,'�,c�y�|��6�wvF�:��!t�V�y�`�x9fQ{#(�T��(���M�}��6KT�#Q�w�ef!���o�B:i��V0��J���E�"�JXJ!Ѱ�b�����`“eA$��D¾�BV?�֍3�*���S��V'�=��W][EBw��'��Y=333s�{݌N_ׇ��%�F#��q��T���y�!"I�L�ZO��N�Q�3汚?Q@�P(J�$)�QٟVJ*=)����DZ���No��+�Rz=�>���d[
��u����D�p׆PG'�V�:��a2j����Yz!��$<��N{R{�p��*�xoA������/s�|i��ߋ��S7O�,�P�.}�p>��bIVZ�!��V�(Oe�J��T^�9��8�7���%���q'���<�{�i�CjG�I���K�vܘq��|R(��Lr6�������jƒ?�4�!Yd��[�\��m�=�Sr�L��*�����.q��ˑ���^����,k6wt���s�<��nJ���P�666666����T����+�6�
�r�x�	���66�n�q(��y�y:�������^�	P��J��3��d0��T�����@QEQEQ%�)�j��A�GL	��.31�`.�	��*�&f��.�t�A��=�Ĝ���q<���}�GQt��eo�=��v�W�Eu^�'��\��{��#=�eg0�O?�U��F��h<�M�sJ��RJ)����RAR� ��Ǎ�ƣ����:�ܐFS��2�Wd��-�2�Є=�ãw����Q�����XG?D�A0��N?1Rɽ�JT�A:/R�<R�p8w'�ù��pd���=6�����$-�{K9���y^A����&��9�͚�|`���z]�?4������B�#K���On�S���S�$@����7$T9.]����e�����/����b�i�Al]*4!r��'g��L�?ϋ�a%	2A68����1��l�Eq"���V	�F�u�m$�]�]��\�qS��w�8B���	f��Ҭ�u���o�;��^�[�;�`���>٣}�����}����6�_v��]�f�B�۳����\xѹ'1��h��*XX�k�?z��ķ\�*5�_���]GO�M_�������$`n���=�\]�B(F�dh��P`Ԇ������_�YR�[[���E0:F�|��s���r��q�MGt:���dXv��Ƽ=�q��wa��fZ�zq�^�Y{e�>��jkŜ9W
�Z9O�5��~���ߟ������hi[�h
`?8��a���-��ǃ�&=\����c7D80^��jRĈ^��T��p���v�Ҟ�-��R4�f��7��M�1s<�7#�-���Q�p�6�խ��+{ɩi{vy����ʃ�O�<��4|%��8��Ez��,j�����/�撪�"V���o%�# ���3+�n
a���:��A.�퉞ʜʀZ���b���NP���{�<����6
�H�~�@��a	�#ښVM�r�@��r-JU
�<uH���HtɵW�0�f"�y��86�k�0�X��\ �r���E��:\�Dsm�x�-���R*[����6j�c��
� #{�d{�7�z��W�U�wTY&Akݫ�S@y�5�"�ui�L"�9H�P�`i"o����+#�̙WԚ����x>m5��~g�E�K~L���j�����p�F����E�3H�)�{6�zm�����Q�@DG1q���PrmT-U,A��R�2�8��׻�A*mdy����O�+���k�',�	|�pl�#*�9dw������2�����R�a�#�d��
�+e��7�E�s)����ڠ܏��б�{�.9e*u�wl�M(K80�����f������>�᳍(O�dX�'�v*B-h��\�w<�򿰷�M9�:�a|fk�ӸуA�uZs���h;���.[GDWT��g����[AOUF#�׭���l&�h�hЫ�v�����7bե+���(s��<��ӕ3u�0�i���Q?�Bz_W��s}j��\V;_Ӷ[\>�0�-{'�ܬ�%!/=��r�_\�r/�?X�d�9tcz��V4�o|�!�1o��z?�:������*�+�&�b�j���1@b��~$YJ��h2���TQ��K6��Qlѷ��Z�,?m�ۄ/�m�2�yPw��2��,�Np��a��� wd�&�
�2�r��4�'-���*s�c�<�O�q��@�\S:�:E��R�W�^q�y@J�����M�%��e%q#QU!�bx4��^ʸ�F]��
���g#D��4r+������wև�\�/���p��s	q���9W��L6P�t�΃>�b�L�t���=KI=my�Iz{=5\\�
��ڔ�Y� �b�˦^��Id&�9�o�VhGX�)��۲�R��َ����
��x�r��Md�A�P(�
�4�B�Xb��l'��Z8vj�eAn޲�"5CZ������s��(<�03��tb�o�;bbgs��a�0L�OÓ����p?Z�<�}"�aa�:X��$ǯ���t�+Zfԩ[��HQs+n`M�W?�u�����c��bJ�'�9:BN���$���9����V�L��B��B�9?\�R�'bW�b��
�1
��R�Dz�CY���֧v['�jI�Bi
���T�`bZ�0h+�-�W-u@�V���{�����έ�䏬'���E4hN���������A(m�\����*��|�'� �>I�UaӍMQ#x�OKn#�N�L̛�S�Q��{6����b�♱�P��i`���ص�A���Gtm^Q����b����D-؜c�	��mΩ���6 �o��Q�����Pw&b31�o�y��
��`��H>KR�A,/W�m��8-��$�5Ft~j�����	�����E`�I~};@�:=[���vF�	s����A�^�X;	�a�Q�赎�K<��Cs���W�q֏��J�IMȋAJ�X�0�����}F#wr8�_׽WB(Z\6�)AM����
�� &�N���__)���}B��;8������Ȧw;xG04�"�5�4k7��=ԟ����#1�����q?E	;��������H�B���:s��:�k8PN=L��2o?k�޻�����Ϟ[�û��۟�ן��_��?�t�H9��"B4;sU��pK���2�h�/����]�%&g[�{�l���w�y�1ɑ�J���2���9W�+O_S�W�����׆t5�I��oPnPQ
9�N�jI���&d��/�=+e*T�Ѡ�~rsk
�,زc�
	��������!�+�,Z.�LU��L�ލ�jp�}aRM��Ijv�i���Ӡ�|_��߯捽�lU�;�F�~>X�AڼV*��bhH��>�u��O���/w�������?m/^x��?���T��+���^� \���|k�׫���P\�xe�ϼֶ
��m��RR�C��Hv:���~e��[�n��`	�u��¾��+��`?���h�D	�����F�a�B�1�g��[-��&�	k�'m��o/v����n���c����&�)���@�F����$�۫�]~�]~���������u��-G�&Z�)�	Z3L�V]ʅL�D�\�J�fV�/7E�5�{�_�}�^*��������©zy���u'�w�Q=��Ex=y�>��9ju���E�U�֠�
g<���l3��g��T�BI�v�a��Զx%��Q(�"��J�_�R��!w_��F���ojs,P@F�qdE��=AD~�8\l��d�3���5��m%Y� ��%:Y�=#��B�7�^�t�UAߗ׳Y�ˬ�4�eK��A��]�zڵ�-"�־�ISIJ��Ze7*�ϩص_���ܠ��Jσ������V�_.ٲ+��I�^1c�Q����ؼ
�H;�,�*A�B�f&���C�\A��ֻФ*b��g(w?ﬣ�B��xr�v�]e��h
�{�I�F	h�V����$;��5N���	�(jS<�WLi)W��l�v�+�d�%�-qrE��#N��Lp�C�qQ]��V�|[[�c��o��'�'B�J���쏄&\��,���
l��7	8�kW�����|���/�2"A�I�.B�T���/]� Fc
kB��-IЊ֔�'�kB�A142��E�+Q�Tt����W�T�Z�15k��~*M
*��2U1C6���#�N�
�p9�Z�̀;�<
x�:�wP�@�	e��I�B�h8��Mh*@��h@�PE@��WB����S'���+����(�ɛR�p��M��`��V��H)�ΝP%TJ�r7�L:��Q��q�(��΁���K�ğO��[�>�^
��=�0��z6���s�c�@]��f��\���K$D�xI�K�*�aǝ��`��\��~���.<��DfF���W�R��K�^W�E�H�fjk�D����e�I���P��i�&�

�oS[���׷/o��܃��,r�M�A��� �z6@u��`��ߌ7�X'�$��[�η�9��F�	P�f�ĭ����_d�C�|����r�A���c(�����(,k��=�b1��#��k�0$?����!�_��_>�����^i�f���\bT5c=�J)LEW1T�*��J���b�H��<�64�D�Ml>(��?(���*���$`��U��U�
8�j".��W�x⋈"����&X���*H�w��`�.Bm���T���b��$n��n�|���%s5��.���w�uk꡵�=k�����AWT��约Zl������U=V�`kMܑ�q$�H"��Z٣g�5�
�Y��gǞGN��0p%;~����/�f�t�Y�d�\u��u����"TDU��W�r_K%R�╬�J�~e��U�:]�Mu(�9�_�>��t@� ����uO
^Jw��4���W�"�Z)�Z�8��HLfE����&����0�Rv;{k�^xy��{5��\�4G����)�JI��&�g{Ai���z�xwm�Ӻ��[��Dl�~�h� ��>1������>�gu;��G���]'����>�i�@�6�Y��p'�\��8
W�����+���8,�\�-�c���������\��/�X4)Nq}ԊđC'��%׸�jZ3�Z�qX�\T�jQ+�2����	���0��B��Y��
չ^y�?�)P:�|�2����R'{ʉ��3�X����
�+��Q���B�U،�=](�*[�{�gJ��9�ym��3�� �">�+ <��i��WBx�
�+�N��7��^�+$C]�P�%�j?w����}���!o����F�u�o{g�}�+qޝ�~���'�K~�x��sQ���`��c��ޕ+��'8B�1��g�4��ip6�q��ܯf����2�|騪T
�:5�Й'�S���#B�u��C����
�+Q\L�bҞ�3��c�0���L43�=�@�1	�M���!��w5���B�0R
�u"4q���u��я�;��?�s��0�JN�(CR�¼Y'~�$��;�0���.(����]���S�`���m��e��-�s�Wx����I��PB�0�Ϛ�^��&r?�0pMGw�݁��p��K����6E��'�0��i�k���Q�0�D�Ƹ;Qf״�|^�!�����._�܈aeÈ��d$fX~yHri�(��_r�-��*�1q�[I}�V�N�A_V&����J��>7�x��(�YN �s%+!:1�j_�]	�A�pb7�+��K��uH@��n/��ʑ��Bs%`���9��?�5���XM�P�7�3��0T?�"J�e���B�O�FL��N�H
�T\�:��A|��\OK:���b4���z�96��ml�lW��[K{�)�eS�i��ncڼw���)����čQ�h���@�)��4&Vm��е;�>�0�r��iЪS�A#q�02������)3N��l%9�oVgr��]���4��6.|�*[r"�sI��5�:�yl�>�N�c����*Q.Z�/�����gʒ#W�)����
�Ǭ��CK6���֋w;�*�'7�Э߰�E�	sI���#Cy-����_l�7#�]<�]]�<
A�G�ZnI{vbflw���:���ئ.�4	���bЩ��I�����ns����z���N��j��.�6h0�j��6�ƚ�U�\���I$��[`E�0k�wR�.�6U�
+}~��лR�d"5�������@TQ����"�eoa��-�o�Ŗp�qR��KS���x�}��Ku�(�b�����k[�2����T�J�Z5��kԠI�.�貫�������⭐�0�)���!ER9,�ylj��I���>�3��|��^32��gms��>����Xi8w�Ұ��`�,�ZKh?�c��Q�v�+�Z�p�˔N8)�qg��._�<���Y6\�N�4;��(3��F���J���6���d�G�S�{�Ȼ6�S�Xu0SR|����!&�I�Y�
	T�YU��p�<�24E8�"0^��;k��V��mE�7��5�Ϫ�*+��JK��
�hA8�}����&P���m׉���Ȏv�v�-y��̈`��@0�j,v4������P`�nť�g��PB�WMy4n�jm���KC�r3
�L��߲���
5l��e�S��N��؄2	�k�я"&�g�[�U٬d��3����J�E�}h�t��3�o�}�pH�9b��@�v����D0���d�`s����&�.��}γʏ�N;��M'U��m$���ws򓐢p˧�qW:�1T.�JW����:�MV<L,;R�^�^�rv[�
_�+�(�`�LXEBI��r���!d��m+�W�Ӎ#�:��cT� �q����~xX�����a1i��d!<��D�Bb��	(c=�d��n�?w��_0X�v�N�N4�8�]�����
�;�&���
�`��)�"�2IxeاU��z�|��H�qg�zdj��i�!�F��$gA�wCz?�	����6a�Uȷ"U]�ˏ
ִI	�(O'�H��9����q˩�T��c�5��k���\c�A=��Y�Cqo�Ġ�Z�*w��N0��tڣqR���|*i�G�}2.�l�k����x�d-�����=xi��ϑ�Pc0A�Y�¦��`f��w��<��nh����-.��w��.�S���L�2��Y�X�Gf���#$f��7�^4�!e�*��z�E���8-�����4L���Mpޣ���8r�4��{������8Oe(��Y\4��]�JI���|��4������$��1���X���L��hs��J�q����Ă�XJ�LQ�V��3��faz��1�0嚇��9�e��^3p��9a���:8�Sxr�f�i�fX�t�9��Kr0����8����|�L�֧C8�j�e�e�XCy)�ࠋ-]��#��ժ`�ۡj�TQ�ܜ�Ɓ̠H�� z����'qť�Aq���5�s�%�&��`�ۚ��'oxYZ{!����Ls��I!���A ��X�8A��"`�f0,0'�6h�5�̓s�Dk41ϱ+uՁ{Fvs,�8젱�w��\BN@�.={9&V�����9�-19��d
��lkI5�:#[i#�� ��˵��Y��&\��x:t�+䢜gP���q\_R��s�9�/��;K���ю�i$w8�``td$�:���"�3"r��b �k`
d��}�P
��jS�?	�
/,�2����J��^�̈́�t�C��a	mK�;-U��`_1\\Ͽ�N+�T�����&��"i
+�@k��b�RK�cY�1vA��^�CO�^�DC���G�J�s�鴖K�ə��V��q& �|aJ��<y�d��aq4��2�wX�=3�
4Q���RX%^��.Ɉ�D��2�V��t�D����2����h�t1'|�,L����d_��GRM\�2)km�)=��h�.ݡ=�����.�*�X��z�k�'����*<D��k�ᠰg�Pt"��w|.�3�C���7wf�lq|��u��.s�q2��������L>��`a�i[m�l���{��k>yV�xSXl��y��0l�]�7��[�ಚ6&n�O�dK���7��6��Nj�O��DLH���6r�r}�^[6SΫ���T�6�ڶ�l�ԝ�aH
��t&Mi����S0�k,yD�#J����߶ub����[�CY����2珅��/�������۲���B�(i�:��|�xנ6sUy�sv�A}t��>�p����̨�p8�P~�j˵�%�����$:t�C�teA�_��d
@���ڀgf�,���
0|&`�?�?E��W!��7�
�[�F( �t!�8h��~�i��2��&<��Lƶl%���7n��aì�Xjs�+6��\��~�#��paʱ���޽�g�y����r��6A@� ���3�JB�"!q��(�R��
��q��҇��呧Ԙ�P,�; &���ĐҼ�P����X'�]�JI����?-�3-�K4�]$�(-ɽMIbߴ
��xa`&���P��7.���4U7��
�0�J�|�I�2�e������"rך�}{&=X���͕���R$�b��Kױ�-����kAw�_�������F)�D�@�ۦי�3`4�)�e3�d����+a)�J?�̵�a���xQD���)l��n�H�Z�:W�H��d;��.s]jCZ�h
�;[�2[0�o��!jD�GqLE�'!X�h�w�P�g�}U]ۮ��WP%�\s>�8�G�x��}H�.�+&<S��$
H�p����N�~6 �M�#�Jkc@!�S�RM��<�_+�)��p�o�igSR�̑@�˳�Je갭U��DlP�
2/���|��ӱ�ySv*.0�$cuX�'��8�ދki�_�쯔��� p6�uzUXa)�z��?3������mUQФ
X3�mO˪衛/
�p�D7��"f*�y�;�=��3�2^�=T�޹�JsE/��	�ZX�\�ص�ҍ6-@`�Y+�:jMu4i�0����ȟ���GVU2}��Y�����v$v�vl����̦��)떖�,j|������ʰ���6����Q`����|���)u_�R������+��.��l~:���~�3���/~�'j"J�kU��
я|�P3�ѱY#I�bݦ	�h�S� �3O�k�~.���x�}�V�}�eo�@@H���� ՠ������h�ن���T����y������Y/��[����ӵ����ϴ��[�b�#�#��}{�*�@o�Ȁ�n\��2�jD��·�VO�0ټ�b 0�'�na2�51������˚��5Vb�����C�&��bd,��\M������ 	�y!���1v��q�����u S5:9	0�3�q���!͙�{� ����Dv�H��8��E���i^��)�������)z�(K��eMJ��\�+�]�U����#�aW��_���š.���T���$gG�+n����d��7.����;H=��t1��`���6yy�4�S��%��|z�O�r��*7n�m���+��P�M������{,��nr�����UB���T]�f�
�Fѻ�DQ��h�9�Ÿ�V�fuMis�V
�?K��˓::݁���ºgVw�:���1��%�d��+4�Z��}
��_��8�ay0;����Q����шbŽ|2\BVv8�-x��G�S�K�iU�])�`*3�B^V�p )�A��;��"�b�?Y������;4P��`�6�S�A�D�
�
Qcꮉ�^�]n@<�͋ Kw ���:O���[L�i�LϬJ��uYқ�&ga�����y��H�9W���Bq�3+&y(rBT�o?�X��lw�b�w�n.�%��>��lY�A`��6d5���߶h:��1��X@/�p�t���	2\ó�e�4SY���f)�Y���
J?T���>a�PM�vF�a�s�՚�pݍ�x7Q8'��e����O8��� +-~V�%a34�F6"]2���eJ5��:(4�
�8���>��h3����KY��cv����w���?g���gP㥠?,��n�Hp['+c�n�
�O%xj�]���P|�;v�]}�
��˷�ۏz椁vx[|2�_�̅��������)C��vl��R�3���E|�+�}�#=D�sN�Xb!J�9(� b�WM�����>O�@X�o0��"C�B��/�������A�WB�M��p��j����	,u���H%����V9��Y��Q��t�m
�]��M^�ͽ�	ҽ�g�v�JN�޿vB��Ս�����a�Z�yOoQ`O�bL#�K�`3y��t��
Q���H���ƈc���T�dz��ˍ��:�X�Pe�
�]Ŧ�/8�K\Ó��\5�7�G�W�
i���"�\����BL��������<��<H���Zae�G�r�q	(��	����B�¢~�K�X�5Ke�<F�$�M�F�x���7+�8����4������%�6�o6��������O����o�����E�I�n��V�Ц�^R,�0R��|��R��Ꮏ���o��t�D�}�/ܦ*tɰ�F
���9:&�eX�GAʵ`�@�٠
��iíU�Q���#�[lG"4j(�}��9��,l�."��`(�4��Ć�YL����#�Do�{q���f[`9zm�����2�]�THj���sU�v��›	��7����m��Z�I����b�^���{^���١�|�����ȧE���g迍'H՛�;r-W~};�%�7�@]�)9c�\��a�B9�T2jX�ec�m\���#$x���{*&IJ[�fJ̍W�m?#ܧ|`�E(�cC��� �u`<��	@ٷ
��W�J�/Q�lK��nh�|�̱��w&��E��3m���ܢ�Y���|^�I:r�k�`�!lZ�O��f0gv������	�a�a0�x/\��i��:�M��0�}����
���ĨY�D��[w¸]�z���T���=��2(У����/<2<3�ǥx��5z��
X�Q3�[�Ҵ^�(Mn�(��b��烈���/�Ƹ�����\o.�pͶ����̏+K��ϸ�Wߩ�>����ZC���1Kv���_1��A�?Ϧ�$RoQ�\,�s��+��NFvZ��t�Р�VM�C���"IQ�-un��` َ*�.�C��瑪�b�IL��?�v54�5N\ ��:Q=��s��ϋ ź�b�*���A;��c��$rZ[�aĪ��+�0猫���RNIK�ƖA�K�&����w*�ӌTt�_�K�t:	��,�ظQ�DE���P�;<w
"#��j�W3=^����п�U��6c�[�3}�G�
��:�?G��E�FcP$Ci2Ep���ަ($��A�O���y�]�����l�
KG3O�d=er
�7Fb*m��40.f��`VD�3���9(5��/qi��Bّ�Ҭ����S�f�Rdj+�� �&Ű^���N$��Թ�:i��q�� 6�\�&}]P���1N�S��uyD��Թ�M�Dz	K^5:1�.0Js��f���X
��Ǡ�F��b�>:L���٫Yh�JLz@kz�G8���u ��VG?f�[�h:�b�[�S�lZ�ƽc'5��@�[�LzoE`�$�	��9�� �Y��>0t����ѿ��ñ(�7����3��z�g��A�L��j��y�І�E/�\�uӊ�`դ�oPA=$�cz�i=N�t��=�a~1;C02��_����%1��
�2@�vR���~�dZ2%5/Q{~kK��W�^s/�>Z�YGd�9��?
�cP��Jq�H��V��G"��"o�h=�)ߓ]l�aƚu�Yz����Y�ݫ�Y�|���C���;�ռ���w���;֥�+
i���^a����^=v

|7�H١�x�w���9���v�e8R@��U�#ُZ���p�a��b�
�G������7:#%X*�+�P祆�8e�
�<4�@2xҜ=���)@����e���XT������kSw�Ww�Ea�нi�r������L���5X�/4o({��v���60�۳�E�����?�(��Jq�%��6��XNa��L�e�5}C�$m4{dz��j����u��(�N��l��/�S�K[��E��@��F�?�.�WȑA���.%c����po&��/L���C%�O�.iC��`�2�3�6xK8H{��Z�-�9
QsIb�r4��+%A�%R�L�f<5��iw�
�V8���Υ/^ރ�y���}@�F��������U�uf�$�t8^�o္���ηY#�oŦk���푵8^�۾c�$K����+n{i����&p�4����9w1�|%��ě�u�.�4A3�(����aE��iX�T� ��-�O��<�����wв��U�H}��^4Ր`K��-K�ߝ�=<x��aD8���Җ	�X�?��
���
��w����k={�����Zro�ۃ�y��CF��Е���f�Ф4�������-%��:N���� P�,�"�J�ܙ���c�Z6�2U��;;��s�3��v��V�b6��[a.L�3I��)A�}�w��{�x8&��^�^��O�����
�Lԍ�W�Q���,�̳?��p��s[{$��e��+�m�3*�r��g����&h�@��8c��"�"�?A�Ձ��.1V�|���Y�J7|A�}�L�A��L�a<J��}��o�
1fL�z5��6!��-n7n=q����}����	jX�O���'�[�2��L�	�h�~�Oa{0-��@���+C	j_d%�ȍ�<��i���R�Z0U��]�weM�Pלc�N��6ܞ��&|$&�e,y ��q�!0�u��l�L&���}i�æ�j�)3�gN�}�I��f4��<'��-�A�'s�Y$|C�F�L�(sL�_����3��D
"Ⱦ+q�����sk���͟�5,e�&���1f��QsK�v� ���
~o�@E{�j�Z9���Ƌ�6��ew[�@��;%���]�u�� 73A~����no�����t��@}����y{j�|~!�M�G�
�-�9/^m����,O3��VJ$��xl���~~�(lH|�h�$���^fV�uú�����K��vE9S�I�?ߛ*~�
�?�dhf��l�����5ɏ*?F���a�<�e��V���3,&�li,Jʴ>�q�Ic��m3+v�IJfŢ`��ѓ7՗'�]�c�aAZ�@}���1���b-���1ȹh�*8�/B�ڹ�ܑ���"��iI���Q�d�w��B\3Ҏ_d�����^�W0u�#�z�h�[燃���}��������F�~`"Gv��ly.��:"X^S�+㺂�_7��z}N3�ۡO��"[/�c��]\-�{Z�k�ST��\̙�o K�a��C�쳀�+�"c�Ƀ�9+!i���l�h�)X��m
"\�����^טGv��څ�Y���,���,���Ɔ6�� ���jy\�yL��qma��.�a�R�K�d�4x.�0��/����bK�D���<�d��@P%���������T�sM�M�A����>��='<߳fEf��RM�C��p��hf%^q9��j��� �֑��
��i�"B�����0�����MN܊�$�#t�
�Ɠ���QC�ɐ4���`_���WXUIJ7�k׮�"	��=���f;
�pHZ�O��"�B�$0
�F�.���0�p���NRL�b�]f3���QE^^=��7���Ƈ�l�7�\�
H`�E3�%�����
�L�~Ֆ�\�l�E�&�!���+"��
rH�rZ�!�5�x���{���X�����=��NB���f�%/�-7�^n�c�kJd=�t�R5��g��}ѹa��Dy�R�mxG\��W�o����D����S|��ˡ����Z�V^+�V�!p5���e�eu��7�<ߨ�ò��%y�Bʲ��u*��_^��解�>�L����rU��W@�)�.�a����6a��B{�M�)A����θ!'���Kdb����<�bl�����
B�@�D�˗����4Lj@���������L<^���_����%.� Y��eĝ�D�a]�o�9f�M���R.!P�����U�b�^ci!�\����"��	�a���iv�V7��h]�f���`PGC��3Ǿ`�*n:�ٓտ��=�T&��7&E_�
)R�:��(�Ĵ���Jyt˺�^�r��/�U����Y��GY�%zh����<шV+%�a�l+��Lw�W[����+ZU��ӛc����3L=%=�u���)T�(v.��"�F��� X1��Oq�C���_��Vz8�Vmz���se����P>O�,���I��&_��ܭBb�h���g�g�XL	�K�*�ʧfo������ݍ�i��w7i>��^֭
��m�ʽ	��go�W�$�VP/"o�@�z��hE�#�$j��������~x3ca�p�ެ���t�ާ���z����RN�ot��P&s�:�u�ž�7i�F�9�r�Zz�x�ю�v�����}2��K%>Q�?��0�b��M���U�0�
��3������s �ñ��V�ݏ����y+
����n#�L�lW}{%Q.�B�A(� �ȣ�,�X}=�,��t��a�t�0��ɷ�b'	ė.H7���.������.�]8J�\*�7���9�7�G�������g8���<�|��+�)z�wKߒ���V��N�OחΧ�[���k3��DŽ��C�Dp�t�>wG����1c�ʺ	��7c�w����S�</�
�W�x�MW�W�a5m(5��V&.�j�6�Q�z��%|N�l�T&G��V}[!Y*��I�.�"�)$(//�@��F��d�K{�E�r�#��eݐK�.�T�r76�%)�j��ӳ�+��y�$hv���`�=��W(��?�Y��v���������p�pɱPk�Ah+�\��hx�Z]�=W��G.�n���]�em=|����\�V�KR�B��k4�у��`h�B��ɩ�:��'c��{?���Jo����6�ưȤM�j�tߜ���5����Bʆ
���f-XaQ4�u}�̓����W���m�4����ŵ����q�D=�;{H�$֤ӡ��YF���(q��_;�!����ȚD��g�ZA�c2�=��f�I'#�3��3I��IO���+���}��E
�78rɐ�-��LY�f»��&�4Hҹ�oUJO)o�����q7��%m7�L���Y�siJ9�U�
���akI�r��wsi$���q���S�5H��e��)�u�"E�Ȥ@Y����Q�E�\�r=7��;���܉�QxJZJ�-yӅ��5���o�G%2r1���p/���-.FT"�Ev��^��0�7���:��,�g��	���6bkFR!SI#Ψ�Ha��I�K�iC��Y����95�(�ȍ���T9y< /"nZ^ a� �=:��9�롦6g�r�Q�&�[]�Y�`��i�p@��t��V��F�~�}�����n�s���?��|�v�>�A�r�kߖOZ�Z�r�I�l��Y�K,�NF��ͨ��C���&�B���|
e	/
�](�b�g�j�����"]o��r_�k�'�N�+sA�t�8@=�+R�0-��
ϢX�".�-9)�j""�_��j������n&Ҷ�S��\표��u�Ȫ��,>F�����bAI'��衋Y�w�Td��ⴣ�-DE�x������g��7O{?hf�h�/�\Ɓ�G�clh-g�)��B�ݠ�ܰ�7��f���q>��=7G�ӕ
�^N���5g�x:�'d0<i7���G�gF��^���D�i���F�4_�`ޕ
:�V�.��cLξDjŊX
�D�A���/.�U]>�.�j
�L���ˬ��5�X����>R�<LNl��{�n*�j1L9��]j���!��Y�_ߛ@�m:�����L���q	e��L�������_��%��VmKo�`���.�������9�qp��(,�vK\���x�ƀS��t]|pӃb��p����K��C����i�)X�X|�2�=��?����)�	�v���:��|�hS^��$,.g�e�Mn>�>���2�T�)8��,.��DOx��q9	��ǩ��8�LF��yw�L�q�a���ato�U���=���Y[,N��oHy�;�D���t�������l��6��'Md�2�FN
�-h,e��rz��$�I�B�"��(�����?i�[êd>����"�W���ɥ��Y���-�G@or�.��Sb��:u�	Ql�M�b�),<��I�e�`g��4�c�{/A&���]%�m����C'���	|�Y>��؉������q>T�i�9�
�w�CV����A�f���#sJ1U~2�zI��G�ڽ�{K����@�)�\�[����	�βM�e�:O�u��'�_@��eW�CV.m�on�<J�Hs11�F��i9��S�2�F�{n�O�1�w��9�D����V�����尢l�W�A޵���q�`���T�����vXYp���=�����Y�C���i���UK�y>�J~Eo�T��9#���v�T�4}Y����������N�mo%��%K!�ݶGKYqz��@�_d����sa���\���n�.\!3ZZ���3 �bq<9�5�%����A��<���1�>!�.?�� ���ԕtZ��S.�_h��_f��ܮ�*:���Nc~
�}�<,�|AZ�G^�E����I�wA��ze����ݙk[�-�3WS���"��������?�G_���~3yz��%�a��z��"���T��.4�ǃf�	>5�b�G;�C�Jm��Z��k�e���r2(b_�c�'�H
�O4���P�n%"��
�u���C��я'K��y���‘��j��4Y?�?{��@uK�  o/���`�Y<*os:d텱.�ї�;;��ТVg�lw=���K��K����В��
̩St�^��Pj��SIG3AU}q"F�}H�C7�S3)���fF�[ۋ�0�sf.s�;ŧ���)Z�)�{���uU�9�`�eu���2��~��8� o)`��L�<�$�.]���B��nuI��@ڱ�c]�����NY�K��.��(�y�)��9�g�;D���x���1;]\V�vq]�<7#)��1��hNˆ�ꑾ����N�.�E��z��)�'��a�'�Da3kO�Ff!��d܅k���EN�)�����{�8���_iy��0|�ԧh���*`��?�0����@�����^`�A8�b�̗1 ���nlX	�D9E��b@)����/�9�_���BL-S����� 7K�)��
_g�C�'�r��MQ�8�T�cQ��QKb*�8U�;Ilk$�ڨ�F!ݖ����X�Z�ڢ�gi�/�e�i�P�É+�x�U6u
s�i-܋��"���Gw��g4w<�p$�Erpv����0��q난�0�3+nB��K}�swI诏�;E ?�K}�m�n� �u�Xi�>}���/���=-}�Ɵ��~|pr��eΌuւ3��� �$�F%?g!f�)�w�N��$�h2YS�RSS[�����uϋUF'#*��k]�m%���G�N�Y�`W� ?��)S�Y�J�M`��{B��U?`���:��P�WyԬ��>G�7�1J��$��ڒG�Z&���*�/!��Y:�y�H����le܋֕lS�q�{����+����3!]&E�#c�Ϧޱu�Xbr�8x�S��u�{�
�g�·�就�h*,hC	��?`w�B*N�	rԚRсu�b(�
����h�	G/mpG%St�-���αׂ�KBw�E�u�J�/�+���*�7�\*�T��魱w
sQ&���Aaj�����ַe�O�`�<a[e�;P)�I�����?���k�P:Xu˼�4���y�x!���I���H��� �0tDc!a�*�����
0�7��j���U�����t͇^[�����6��û(���nYL$%T��>R<�k��pQ㒒(j��e�Ԅg�[�\IM ��ݝ����W��ѨL�qϪ���""ZDl��r��i�Fb��w2wQ�w78�6=��jjE�0���1�ќ�~�W�PΩ�ӹI�UHJ���H1����q�e�q�V�J2��a8�pP�'�֔�[�`���-��D��J	��U2tB�hn�k`"���4�[�u�n��}�t��|�����?�h�_g��JWh[��J�[����3oR

&){'�Pfj0��)�\�lb�N����gsR�280h.K(�A�bL�7d��i"uH�4�?T(%�{�?V������1���G�+���5�o�~���Y��<�6��M�j�,jkB˓ו�V����oJI/��T��1QcEzgCg�q�桋��,��x�[�)_��J��oE�/�emG����p�.�؍��s� ��1���@�R�p�2�``Z|�q9��u��])��!:�3,��W�Ob�RE���f�s��DZ�Dm���'�߆�߆h�9�:X��lW�O1F�/G�@}e=cPHmT�0Ȏ��	���'S��+�Ϧ=#��`�t���=7��0�PT?q<}�	B�NWVVj���t�5=&�7�:��1D����^���f���Ng�s�/,x�s��2�2�'0��3��`��3H�⩳�O?�n�as�����N���6b�P�0/�.��zVzΖ0�b�4���3���rb�nt;��Q>�.��8�WlS�� �d}U����������J��q����+i����a�E"Z
/f)]�#�2?�FA�a^��lho��Mp��e��a����
��#�F�RO���q�&P9P^=��x�eժ��MBῶ����p���XH�|\��V��B16"�>��a[n<V�~2{���ցU����o�PW�"�g�ia��F%g=��wP�>� �C�-�S���=���U3	jo������ef�هtֲ�XL�t�$9R�X���M��S��?��i��PL� �Q�2q���˥�\�r���6Z�sC��&��4u)2?p�zȪ�p���0�	��n��i��l���%-w��uhk�zd���9\Z���D�x����I���>�St
���E�:!�}�F��x�O�)%���㟴�����W��UI]�͚S�TX��/�KX��-?�Cm�f����
6����VNOwLv�Z1,w��l���IdL^�ņ�Dm9�r���µ}�S�M��o���d�cR�%):�WBڡ,n���1�O"/u`�D�Z��]�4JLq�R��X�`i�����eڎ���~c2��z|���:��8Ss�7mڭ�����yr�8Q�v[��;#f�2bR/�k�*I���c�8[���׼)��Ǘ;��
T�G�Q�_���X.)�;ܰ����SrC<|d9"�T��T�챶M�R��7��҉v�I�X.UO�ZPO���hMLD8L!6��2dŒA&
�Q�s�f����<X�ӈ�ҷUx��DX�7& P_�h�o(m��S���o+zSжRt�:�K>d^2���I��eih�t��K�9�/�'���`� �=_��
�D�"��9(1y�;ƈ�@������D�Z�Q]R���@�"Uޢ �"���b)XU$Za60Z�+��q��
J������~�:m�Y��"m�͖�Y�{%M1#S�`���\�hpc'���yk!�M�n����i���@�Rú���㑊��?8��AГx/���j��ͦF�g���:m�fq��+�b���X+���d�I��E�|�+��-�>�5�|�?瑛�[��#H3�D+*�������a>���Jo�|��Ռ8�Ykl�6�4��;
�ky�����ǘy`ׯ�7=��o�����+5?*��,��94�z�.�Gy�Jl��~��=6?�2�
���^.�JV���l �MV?jB�2�̂զe']�m_s���Z��?�j��
;	35䥁�(kE-�,|J��K[�9������!�,֊��0�k��l�V}��Y#r���'��_n�`�qdYZ��Qn6^q�K��c�ܶ�nwd��<��> 7d��'�{�?���BR)��������V6�{�ad0�0�$~�Ԝ��ʎV���\�'�	����	K�nl7nc����쌧�
K�߾���t���*�Fd֑d3�;���Am"��oUͬ�S"�D2L��:fe�Yf��ۿ^�y"65)Տ8�c����KG�O�����WR���-��'%Ttf������*�凣f5k�x������{<�N�V2$W2��L�V(��*s��w�>�F��&��W��p�۠fl�0��p�0#\U�9c'�(�O@a0>K%�^�\�e����Qٽ�Wdb
Ta�/.N *K��!(r��s��v5�;z���4�O8����W2O��c
>�nR���3�����+�k����q�,�B���L���Vp���փ�3_ ��j�iIKSؿ��!hEl��'��d�7�WH���DU���_y�>�1���FN@�?FzH���(�+<7
Pu�`���u�zw���8)���Du��9�O�v�r�}�?�`=pۓ�{v���_ð�+o2��o�_�hs��y]z*w��bS�X`K���u���y�D�q���z���":ۍy��ޔ"��t꓍�z��@1|����u�kln	3����l}66:)PǸv��;�);�z韣���8���[�/|`��9�B�
a�Ff�	hB���)m��A�ъ����Q��Q<�?��%
�ZQ������H���h�G��~ޭ�J�5hy�m#fC{P��&W�n �{��kk�p����z�Ȓ���q�v�\�s����TgR��UQ8�g,�h>������y��X{{P����j�h?���6��[^x��a�c����g~�H8�|�D��+�
p��F�-��?�NW/��3�mc���y�x��>�a�Ԋj���f��k���vӝ���9 /\����6R�u�֢�<5�+��u�/��~a$,��V��"�!����9늁�x��q��l�ڤ���ZN��a�tʖ������|i�Ȥפ^J$��)��f��DÑ@��A�I��i�+Xި'�H��QKEn��Jh��/��T���X"�e,�hR��b47�2
��|�����$�Zꓪ6��JP�e�k�����q#���ٽX�[�/�$����]ijO���H�	�e]��n҃��a��\��{^�t����9�=�qs��a�cF)�*/�W�.�I���^�������"�0�2]{.x�Y`�e����0ْN���Ϛ���Cx�(�^#��$'Gz?F���rˋ`Y���K�zm�v��ꭦ�z'�Z�n��$��T���r&r�r�^ٺ�m]�|�dyA�z�_��WT�^��c9��ee]h��I�D����f�����t�j(Ȁ�7"��ܭӦ�j�	Z��]b(���T�y����˦Mc��h�;ҥ�f��EҜ{�сm�k�����5�f�1c�1�-Rɋ����?�b(U�Ա��TSf(
�r�%���l�7���
�����V������NaEA�{)@��!�ro�p�J�P�������X�hVޠ�߫�ȕ1x<�/�s�3P���}{�q%���5�Rp�k���Zg�Ժ|�"S���g#��d
@N1Y+�ExA��y���yh����v'��2\���$�\1�Ă��d��~��_v�[ WQ���_0<�P�܉�u<��C#��3��!ă�Z�)���<�M�ܬ'��@nwL�;��	˄T�뫰1SB
�8�҆�AG�4�j�G�,Z��)�P�L��5������na?�?"�K����F8L>�;g'w���<?���Q
g�=�֐�$�߫����{��~T�#eC2<�b���������m���m���D%�jC�tx����,�ӗ�����Dʢ���d�Z��" �,?z��~F=drjwT����s9�^��ZQ�.�.)�UѸ_���v}��}����5����������߄4�?PA�&������J�������E�90�ӢH��T��2�����E�<���ޑ�����8lq�Q�Ƒ��oz��d����t�T�Б�y렫b���K¿�e]��B%�A���7�U�]��~��2��A����z0E�E�3�q�V���������=�̨���N+\�˕���f�7I����JH�x����TEu\��:Y�4شaIO�}xE,q�c��eU2����z��T�*@8L
i׽�O�9����Z`m�c�ϑE��f������[�B�O�,Y�G��i�
q�S�wrj�//)�B�wt��)�P�a5�{V�d1C����:K���oMЍ�6��8P|���D��S��.ʙ����E̜���WZ%�!�~��8�>�{�Aw���g�kG�ơQTZ��]O_�����s#��1���6
�}��L8��6̯������g������������W�re��V��1�m)k�zE�VP�I�|w#U�����='�g��r��m��@��2QL���}���_�]�.��#3�s����g���ց���H�ڠP^��{Qom^"�a�}�WEB�<��5�Ui�*��pKF���,��w�Y�ߦЌ�V�X��)��Y���~ڧU���϶t/'^]�u3��~Jek�qn�y�?La!���E�w-:qٴ��Pr]��(j\�kMͽ�e�鷟-kHfʊS�Ί�TT�I���Q���$µ��$1kr)�}Ktܖ	���0�[ߖ�k�̞!!�yy����<=LB�y�!�q���;���C��Ks�貥�2,�����k6>�G֘�ǣ,��}�-�a�&VS_љ�� v�=a!�nVǮ��z�-
�+I�OE���^��.岿(&̺�F�dpp�����0�}v�uXE�ƴx�v⾢��Q��S��7���݆#;(5�A*{��0�CZ�=�o?�ӪC�g[��W+Ğ/tᵟ���e�2��9��=��	ӯze��ҟh]Ž�@=�wt}_T��C38>M���A�NXP��v�,^������H����>�a�AK�}�ιN� 0;�TǜI�4����$^9��v��4����Nz�����@��w�"�>;1��[��~��Fu�x�SH���s�sY+X&GB��sk3l{�_��e/W��c�6v�A���/��R��R��H��87�B�OpD�\��@Ω�V��]�q�5�ך�S����=�����j�W��"��N뤻��7�A��M���e[w����D��S�|�J:���(��kdH\hR��
�1�?44Q�Es�^iJf,TSE�9�Gi�����G�4N.6R�7c�3Ȗ��A���4V�l�J��w�5�5��<<�&_��z�@�nl#�[���Y�Wh�G�4Loߒ��K:*�dr�/$���:I�<v~�;�Tz���+���J(ί#��i�	L�œC5�
K�$C�`f�\A/2�1�v��
T�'9����'J�[(��
~nP�l�旄������-T�-B�
�O��pk2�S
��U9�˘�?yp����T)�9�s6\=��E�a����}�����*�Bx���������G=���嶓F����ު}[�v��io��������[0�[�tUsB�ΣV�?���7�Q#�~h�r�����Q)�`�_8�`E��T����Rg.�G-3�q9Q�f[��orѣ�����N�/�pXܺ�I����S�:C'�UlB���Y���@��,��f�1�4�8
Wˠb|����}`��7v^��7�vE��$�TIp:&�$�iW�茸'Nl�ә�������qHVvQ��:xRHj�1�=+а�������<	��2�F:�ngޞY�eNw<b]|D���r�f	xzyZ�Q3�lI��z�NY̢��Hd�ߏD�mr��3E�� �d���%)�HUh�Pͣ��x�y�*�WD�f�K�o���'?m�"����0%��E�i��O����;�sX��'{�?F!�U�?�\�:s�Y)���2�J�s t���t���
\SWz�V]̉Ź�z�͘0�~΃�> a�o��Uk鰟&�·�7�7��[����Ø�?�ٻGV��Jv�5��8�2���CU�;���N��5o,}�yF�i�w����k?^�4�.�N�s-����{�@�U
#j�8�W(x��gw�.�JET��D|
C��Ԗ�˙�|{-���������ɼ�g�,�eT������9��z�8{��'�v*��.���=�G�,M�v#�{���� �{�D^�IwH�w�L��)w}�M����2z5��8�f�Nn�i�ښ���Jʛ���UX'���eZ�J�]��hEغ{'O�[<����U�q��8�K�f�*Y=����u���ɲ����0V� ���x��._n�U$_S���9�ȯnK,�CM�\���>@@�
���H�BY��|f~Q�h��
Gh�k�`Wssq7��.��k^�+���:}��&Ċ�&��I��Y��k�'�9��0c���*Nn��m���u��ڰ��_�x���zДez_g�7}�Z�ݝ�b�Ҹ|�Gi?$�>�(G��&��i|J�ͥ����Q�\�ζb�?vӌ)_I��.l%8����&�2�����a�C6ׯ�qS��_.],�o��˾�O`�i ��d�b��#�[3T�2��ćO����^��E�IDĘ�	����~=ZoU���9��:��Jb�bɽ�^U����eX�Y��$�s��0u'6��f
4�tՠug�iY��ⶻٰ��w�("&��صF#�Ɔ�*s�~u`(���4A��I�4a�@s �PH������'�EeD�8��e��5�����B#�D���4ˬ�y�nkjs	Ƭ��B��<��ɯ��o�܂�﷌������]Zmz#v��r(œ;)K\�2�����N��x;Ż'I��#��ڒƶ���t��!�����4�uȊN�bʴ?�c�|��\Q��'��5�����i4�I�dyJqT쑐�16�T0
�����V������+lly�D�8�9�)�10sZX��p4`lԾݲ:u���Ϫ�N ���Q_�^f���O�N��G���ڍ|��b�"Ht��_����Ѵ�J�0��7.'��^��'���k���T��Y�S9���&�⾡e��/c4"Xln,k��%�м_�|�@�pv��"4(�_��:��cW������&q"�o�b��s\��P�}w�����5S�F#��O���L���k�<����HP��g��O-c)o:C)i�#�A�-���(�3=;�N����㗦d�s(o�]"5e�r���^�wE+?&xY��{69%-�����Z44�Y(��I�A���g�¯i��� �$��X������M��б_ᓃ�0�snP�^�+�ִ�8u%Z�!�8q�>ڄl
�6I���'~����o)��cb����{DP�6�q��������X�q�V�F�'��p�_�]����oq��.�ڗ���O�v|%˓�K�
mÇ��h���х��+���M�@�oq4s����L�K�Y�c5�U.�(�4�HK8|	�MH�J����1�'7�	�i�ڪ�(L�*������;R�`ZŽ�k[
SMSS����G�Ʈ".n7�4�L�n!Ǘ��=�v�;!�f�Ү�I�������F�T�h��^j-��4|3	���1ґj�b�4�ڴx����%vn<,W�F��4c�9��c���5���E��hVn��F����,�栉Y�'�z��7۬k���m0��i���u�g�^ɔ.���>�J��t!�2�V7�<������KDK�Z�_��+g���RԜ�\ICL���:#�,���Hv�DpDk"�G��i�&V�Azs�d�T��)Xdhښ^�o�HC��.zG�f���,�j�
OqH�:�P�z��V4T����u��iV�3r �*lOkO��/
�_����4��u���-7_�Ϧ9����?���Y�?�N57�d"z�$�+��4��W��X�������Vy���G`��S�)��$Z��͝]����6�;�;�����i����1�V�E ��R~)��/Ϗ�Z{���Q���ܿ��ԭJ��_Y6��Bڬ����jCi3S�P+,�����y�D(���hc��fW��[�v�/��l��!__��XU�fޠ�!	7t�܁.��2��p���8a��/��	Ǎ.����/y�{�6�Ak�^����<���{�Z�h�����!\¦�xI�9H��h�'� ��
6�t�6)Dߵ1���֦s�;�(�N�.�|2+����S0&f��)T�(w�h*�LSX]�T��V�5�0�3�cQ>������~~_�jO��x?���S�IZ���LʥR��t��P&c�:�iu���A-jd�$S!��m��������F�߈r�Y�߇��gkr�N�Ia�z0���d���<�h'l��r G�O�o����:��ճ��
)H�M�ϲ��[�ݷ��\�`/���+!%�g`[�����-�D5�m�G�
�<+�s���>nʱr�
R�[�1bab�}�/�w}�!;����xݙ�d�
/Ng�R�%�친Fb>��"��
�O�?�\h;x��i�SػY�DWj��p3v��;��w�Px6��:�����oST���Y�x������u�_q�s��2���;�L-
�p�΀3m�J|�a���ʧ���j�D�}՟m'^����@{�v���P+ٻ�c����v?�Z����_N��n����뙖��l$$�t6�ʻx�6M�ݔ�ۘ�wp	�cl�E���?��{�{����-J[(A���(�s��1‘�J�!/���*��p�#7���%׾
�����^Pߌ��}.I�;��G��X7N8�\��Q)<��\�����4����������)�h/�~j�bLaӼ�Q�:��i͉��rE���X~,��&zE���q�S-\�v�U����3��0��H)s��K��ø+�\����|����n	�s��=��W:pQJ\�'.g���Q���,�AXN�)�)c���y�S��e@<n7�EE��3t+0'��.��!� �\����x��'���~kE��o�<�2X�]Cy�/M��-!�=K��H�_�U\�-c��X9������G����sJ���n|Xt�j����ԟ�!���B�K��Fw)���"��΃FG��]����v
�u����:`,��&�EN�e^��\n�4a�F��+s�6�pY�����.����ܜp�����I[���B�Hp�[���,S����swg�|���������R���x��<��0��|c��%�}L�t��|!�\f֣�y�9�C� ��HyG�~�d�'��B����-�@�Jh&M�rk��.�������6���F�m��Ǵf�W�pm9�&�׸_���O	FLl�e4�eͯ�_# ^ÅYwB��H�7O
�X�Ճ"����"�Jy�*�(̀�c�����&8���ރ��8Z�n�v٤�)������r�(�=�z�Ī�
$T�m�翺��O	��9��B�r��]Z�!������S䯫P��Z:�zN	c�*\Y�KW%��h5�������M$��a�\����(X^>�ܩZ!���k��ǚE�#���T���
�U��^��)\�0��8e��n��EB���<��jN���̆2�i$�1��a?B�&�E@ӣ���F�>y5ң_)�c��7w���ڻ��a���]��t�޿��z#�ج��r��[�N��z���bs�q���ְ������"�pc�e]���y�`͠�x�z��)\�r��ȧ�C�;+�`�q�#����f5�%m�~rƛ q��V)�:P����nu{����	w�Ku�+��~��J���+Ϸ�[e��_a�b<m���J`.�ab	��[p4GO�[����0T�����f[%��Va���Nϥ�tmr�����FU�'pͺ��P�im	-���h��8ݭ v+>{��P�����>��n�CH���_�~U!�	�ɟͲ@�B�_|����B`©��?��mtg�'�m�e��V�%�폾���N�1��j���7��K��9\,+��];F�/�����
����d���xl���<>��RFF0�#�z
��m]���Nz�m,��3bd�ɠ\t���N�UV3�n\�MHѼu��CQF�WD���nE�^$�q���YRC9=����{��G�N͇�}��'��
O�s�@��?w�=�b��I��;%�צ�,0w^~{8n�z�qbf0&~�����=�z���7W\g$�n�Y�?{�?��\�κ�3��
Ç����Ն��|�Ryu�N�o��
�J���@��z�_�^�=�ɫ���7���q�؀��=〽��K�9
d�W6v슾QQ��,�xy�W�=M���s0I<���aS9(�y����TM#�rE��Ld��Z��x=�6�;���uspr��0�����l�O�H��v÷l��E���Z�A˚�� [������ju�[oӪ�����*���|_w�"�ȁK����ڢ:i�`�1�Y�g���v�U�T�f�`uN!�%โ��}���^&;6˧����2��tf������qyX=!�8|"1r�{ q*�┹�ffm7t٥2�����"D��]�B\�*�y)*֥/mCU_�h��.e�rt�yG�d�-��w��p�6�d�9��Jn/ʛ�M�N�c�@��Ű����w�q6��&s�M�2�-�%c��|܌��٢(1�ͫ��7�<Մ�9T.q�t�
)2�,nD��vqcν��Zɤ3��,����H��ר5UT��8�y$>;��$�d7���2�w��M܌���U��L�Y�63�5#�9�&���Wt+�����l�/`�"�W�1/o,#E��˃"�aݠH�:�b;�Z�KK���>7ns2a`��&?����"��O�%Q�\]�!�m�<K(��G��"O�"|H��GR� Em�Ց�Y��R��|W1|G�K�L�;`�8.�	��-)p2�Ū
�C-�=��֗�n�	���cQ�Q)��8�Ĥ�@�$t4�9�V��\�	j���jDPSF8]U8B�B������Dz8 C�)TgX"I�&�5�e�٠��xC�r�v�}H�?'�|F./�X�
���N���,G4�r69m���r�x��d�6������~p��/�����&��'��}��*_��+t=���Ŗ�m��ߪ�hh���9���A�����`菀�ݎ�����tZ����8��y��
N�~a�s���dQƷ+A�V�~B�y��V�Y�̒W�Z��y�4f=��K��,d)C�N��8/]E��^#+a.q�|�`V���#�K���A]�g��;w��]�4���	��aӘʗ�b��&WGQ�����8kbK
8=e�)�k�����(zK�����
Y#�z�)m6g�J����W�ݚ�b�x�ޜ.U����P���(�@��T�wPK˶�.͗�%�^�v�ɰ^6l�_�v꺮CRE{,�W�|��]�m�+�:gp�M�i>�}/)�I��Y��� �i�E�gb3�F3�ظ)�~TFP��eӒ0�7mSuS�퉑I�T�!:-V�ﻋxT�Y��p��C�������
s��5k+L��t5�SC��L���oʆg�ԝiP&QO���-�Ծs|+wUx��S!SRb�tA9%��Jr��ý�כj����+�Kc1��2�3N������V9KJq��Cm�i�H��_�	^���8�5�4���������$6z ���U%��9��ı��@='�5U9���9�=�cH��`�6-[Sj8��x�0�i�y�y^�I��x?xy�[�m��3޶��w��ȟ��r�>rv�\H)Ukt^{�J���L��~����Ν�qB��SK;ԴZ����S���f�c�@�N2l-�LH�U�rv�^�@;Kk�X���YZ�T�5$P��um�����l���y�Z���jû'�Lq�q�����TՑ��,��~�=��=�
I4��sʾ�+94X�.�s��yMgD�yU-ZƎ[{y��7�[�	��=�b)��"��pd][59H�87��.���7���:g�I��_���"� i����;��D�ܝ�;�dK��5�7Ẕg/��	�_b&�d�4)�̳%�N/M��Z�L�Щb�����Ł����9�f^�f#�R��o��ZQ�%�7-?�vXP����:��z;�*��K�L�v��y��G�;�a�l<�{��!Q���e�vj�M�'�8�n�c�z`��q'Z�gYR�t�/�;��sy9�h��z?-�T��,
�F�ZHQ\	
}׊�S������y;Nޑ1����g+�_+
#��S\$"	%)
���Ěȇ�{�_��#���]=��� 5�T�>
�����D��-�:�8qR���#?��Q�g��0v�Y<F��"C*"+�!Ӆe�d
M�>q��gkul�;��{ִ<�O0_"ĀD����^��f�C�˻�Z�p��A<1pS07e��@�S�>���Gd�8R�촅����ۦ~���F�Y���У��{��}ׁ�w��U	'ܼ�ϫ����Dj�+�–z��^IrT4\yx_�F�8�*�Ճ$31���D�Ĵ������wTަ'A���H_�u��O_wU;��H�f������ʁRwiέ�9*��4�[�� ΪzN,���0vs��͹�jEz-���϶���Qa>J�t'n�(y�*��9V�<c�ۼ�aTBp��Ķy5�[3���k���smm�e�)�+��'.?*
JN��������������ǑHw�Q�,���,

s9��2�ۡQ�8�����~�(�r)˳^���յQOtz4�V��8r�b���,�I!tY��˩�c�(��At�Ŗ�~�F�����os����a ]Ql��t�׼�E�T9Y͓m��|"���L���i�w%�7!���҃��m��
��~�W*ր'�	Ok�1��5�RC���.�ހ�	4��$|��YȲk��)��ţLH���}���U�Ug7�+��q��]�Ԓ�=)���7�i7K�A��e�d`(Jx�5>rJU�a�:�G`��:�L��+y}U�EW/r+�/�����ǒ��J���>އ:*��]�ٿ���T9k6Q�ށyx�0[p�B� ����~�my�F�n���ܐT�#�4�X��M04J�I��-ka�	�
⺂�1体q(N�>��/"��E@/�L�c��CU���s��AR$C-�����DEj��`�� U2�$�
���Q0��U,^�c
ݘxv+��@]�4�����V ��7�ո�	��>��9�,а��4�������v�!��U�b
lj,�F�3
�݂��H��V�M!�8Sa�LӁ����oHGi��)�	��8,�΅ {MJL�Mp�
G��k�������1 �w�䋓�9��fqs3���k��	�(^r
��yEϥf&8W£��6K΂� 1���ZK�$F�܋׎��y�M�.����D�,O� ��e
��驔�r����y�<��O�.&m��b�
�d�R��c#bz!ݺB�p4@���a���e����Ř:v�f%���a��F�Y ����Ή}i]
*�Ɏ�g.����]J��\�Z؃�.��#�KT���Z&�U,�W}�ā�"���ʳ��b�%_=B��	����Ū�$�D{��W�]7�8Xv"&��q�֡�";C68�-݊ɾX��
h3ɤK|�
��x����C��NVqlh�1��F��N�U6^��F��\�=���Í�p>g��|��4H���E��j�F��zy{oOܨ�I
�����(��ӟ+m!um}�X�#�$𔉅JC*�!�1F��$
;���+�s	ꏟ~�����܊��T�?K(��_ߧ��S��X����6Y��r�XIf��?��S��7V�&IS���D��3�9R����Tah�K{�n۫���r�?/]�����7�"�9��̜�S�k/�S~R�����)�b�1�|�69_N�愤��'��ǘ�G<4��E�(�z�q���	}D[�U�9����]�?����nc�YkCk�$����Ū���M����,�*��8Y�UI��M@i'=�`���b�N�H�A�Ft�l��#C�&�a����p��2��\�P|q�c���:'����	s��ȰTI"�wЕ�'�[��^P�\�&<�r,�QI(e>�l���Qj�3fs�nP]�H�dV#A'{�C�^GIŸO�j܇[�De��yC���F�v�f�6ܔ�Kf����|�\�'{�.������O�O�f�f���w�03-[�#k."�I�MO������M�.�~�f=�\I�	��.�}0B�"�p���)GLm�,�`)�7���z6_-c��1��{ܶ�>+9f��k
X�.�M~Ȑ����C�hehaT+�4L�A���z/&�U<�Ek���4�P�G����ϯ�;Um5�����*ĭ�=T��0�Ji��8�y|�42h�q/|���8~��x����p�g�3"I>�_�bN}Q/��.C�~{K�!�E���>%?Dk�+=�̖׎�o֒���B��m�bdg@�U���W�!��Z%Nu(`�n���l���,�?}��3"�"A_���z����)FI�}�0��?)��Ƥ46@���T��vV�Q��0�׏U
�A�r�B��a�B)�e�bSV��h�9��Ś����I��f���}���~Җ�v��W�f5�X�z1=���._M�`؋ &�-��%
f�ⴡ��Ӂd���>4��*8�5��
��s�zMm��$M0�):(N1䒒_4[M�[�~!|���F�<?����r"=���By�wk���ԣ-�N����i��g:k�%�HM	r��v+W���z�p1hR�Dg��U?1�
���|�.�G�%'V,�T|i��q<��.M��2;���ྷ$���zsS��o�=T���{�V6M4��Ya�2�ʒ�Fc�f�'߉��}����yꓨ�巜���r�s�&
B�0��`�(�����ٛ�������/Wꋀ�OI3^M�H�`Q$�`̔��0e��l:&:T
��6	�$�p::��)TFd%Df�����B��`9M#k?ϩ�����ab9dQ˯:X�������gcy�������#�;��o(G��)��Z���d������}P-��2}������LH�Y�8q)lm���c���%����$,&��%���(\U\/PFp��uE!�0�*3gi�i����Q�b��5��$P������w��>�?2`�Q�|��O%�HaW�넠*[��"�"��41<���
h�G�Jiy!Y�m��{(|Ci=H�RI�́�}��iirU���Y���/t��2!�ݰG蹒aWp�`w�pQ+�fdTzʹHt���b���ۖ�=���;���:�6�kO���F�\�C*�5�Ol�-�$#�Jf���bɌ�������W��(��(F��D�G�P���B�mo��d%�:'���6����@U�����a��|!\Q���h���!wjD��[z��Gi3�3�?�&s&HܨAe�t:b�i,fͧ� -�9�V��E2�&���D��`BB�Nh�$lO�H�cgJ#ս�ʬ�������S>\!���jE�2Q ˛�jJl��a�O��v�m�j(�FtiFU�΅U*SP��b������6�>�=ذ&Ue�v}cE`#X9�
�ɱ�8:�]{5�7Ѽ,P�ګ0���(7�5qn�
y��jo��A1�~;����+�#�_����%m�d��'$g�ţ��]��ǡMz�j3!�ةn�Ѿ�
�l?�i��Ebw�=TIƝ��D�(8g�cg�i��-�"�2_0��ʔ6�;�P� �v����i��X�o�!C��pW&�cĄ�m*I�I�*�4��Q�f30�%�֏p�i��Ȩ�C��A�i�.׺A�YM<9�|D!B�D��*MR�?U ��41!�A�c��ECZ��
�5�W�p'��Gh4׭.ji�P�,s���~k�gҠ�1�e"�y�1�ݞ�`�7O�g���<�;�	��"O9�S?�қ�8�h汱�t�qP��({E�P��H~!�E����&�ϮNHϛ���u��y:f����I�0�s�e�t<�X�S�`�aA��)�v�Row)hI�S��O�D�,�b�] �q�Z��ygUV���H�)�{�}���-��!ޛ²Dٻ>�.Ơ�JE(eJ�{��K�u&o�Sa�Kh7D/�Π��q�
Ŭ���œ��d�6�K'��>��ff<ҵ�*'`�fJW���#���,z�J��?�9�q ����d���p�<�(��6`�2u6�wi�-�a-h��������y��nW+�{EȚ�p�pj��
h.U��N�����m?9��R��o��]������A��'3�RO�'i�/!M���Xm��D1-$��E�o@~�͈�0H���p��l
%�ڈ�.&:�4�:��J��vN�A��m���rQU�$�,dgSa�ɹ���xje�3-&O�nD��6C�&X>[�A��I�r���7����+H�oMr��n���ϩ�<{C)��6��O�}s��u�NF�%C�%!.����[ڜh�u���4�7��$�҅�{G��ey%'��lw�w�}{>Ƿ�V
�~@Y[_��Y1���N��}7Ƴ���6D��@�G�~�6Ne#�#�It]�7|>[LC1y.��CI�+մ��l�H�+��է�J��Ϧ�S>�F��Hߺ8�-�xLX�qq��2ܼ:��;�(�4NV��ѧT�b�#��|,Vid9n�ʱ�{c�چ�t��v/��?����6�T8.~��ה'>�+4�ۻ8�gD�
�Izo���
�Z�����L�@mU@�>���{#����� }P�by�+��R;i"�'Q��w��P�-�����`��z��	\��lbV����كt�
��C�X�������BQSr��9�~�=�^��nw�:��K��SӸ4~�P�7���25�D��$F��+��Ļ2��wuӇ��o��vx>[#֩o����݃k�:T�2�n��o��l�S�� ~���(1#~��r�ØMr]Fr,T�e����'�2��v�t�j.�8�(��=71J6�h�(�ੵ�tv��R�2g���+���������w�}8�jVE����Wix&�j��0��3>���P'����'F���b8Ҽ�&=��ބ̰$����xb9ή��<ۄ�ӥ
.�HIp���^wTe��o�̇�A=�`��X�I6ߚag�-ۘ��7(G#�{oF���q4����fnN�_��QMR�M��Ou��F�J_i�ě�<Zٳ�M���n�yeF-GV�y4���Gd����	�#6z�F(B+�œ�j0��>����6��\6}�v����!�I6/�'��X\�țu�FPg��#���²��ݸP��(�B�a���*���lw
y��lKR&qsk;�mg1�l�8��q�}%^�m��*$b�dCqB!|��I[D�
va1�m��Z���bR�HP�~�:|{9��a���:�|���?�}]	."�0�$S��|�����7
����d��(�x��okk�c��>P��F�F�JʬK>O�:]�G��#�I=s��a������km��|��r�x�U�����x(
%&�p�~$W�ym��ޡ�O����M8����g"N�<� so�2���fכw���$���5�w��C�z�_�WYVg��ɣ�G�u�����޳J4�l\76k�/f��ӂVh�wj�:=�b�2����/�O;jT��}�jM���Q����I�1�&�r=$fE��1�.����}�Q`�=1��C���3
�>���m~@��um;=�����Cj�������x[�-wY�<�t{w�P�'e��lA>^]�C�v��:;�kҦ�;��t� (2����g�M�,�N��w���TƂ�ˁ�Jy���j*����u&m�땮.��c���U.++�)�$��y�&���e���~�=�D9W��…t?�%?�fǡC�?���9�U:���m�b��;
��0�����	\.�8�sQ��@�`D��W���5��ii��O�C�"ò"��S�!�Ư���)1zZ"��j9^�����G$��'�'n���=Y���һ9(�|�n���U������;H]�",�j�*dNn�5��呅�-��	]���R��=n�V��\���>™Uig2�W2���������|e>��8H�~��!�H��)q:���9nd���~�B����q3�����XY�ydS�A��Kl^�%�yDd6�P�]D"��R�xP��������2�:�۹�.^�H�{Ml�l*˝�N�'�Ki�Eߍkr���_�8��w�Pqe�OF�����Kv�$�J��LaS�8�`v׌�;Gk�@~��$QBؕ������i���&F;�B���g�՚JG�PXE=�'u�_u�c�i��u�Q�Y5I]'��P�y�	
��>$v����*)`R��/�ir��������\�ϯ�]c��.��_.���<&�Cb2��	�;���T��r|���|�~�_^�Y�'��+���6�E�\̊ݡ)�B��jR�ՂF��v�q�Շ����W�3�+��귞%PC�%х,����lY��7�uy�a��"q�@�c%�H��>�|��^Љf1f�έ�f"�����'�����b'��n5���=��P�':�@� L&�+M��֚��^Sm]�bk�7���V��
ܛw�G��~%��X�j�i4�3��A5�JR���:L�Q���������@>������>�l���"��g����]�&��/�.��'Z�Q�ܶ@����qF�°N���YEJZ�x�>��;�&(�g���t>kL2Q���z�8���S
g�������F�*�5r���Ͷ}���sU�A�Y�ѵ0�^�npN+��X�S[�F�I��@����}��JiM��%sD]\]�=2{�L�F�C*���L�pL~$�a�&DK�B9�w��t����׭@h�1I��V�n,�R�y�7�ػ	SQ��FQ^g�$���&2�G]w�P�(w��<�lWB+��Z�+��խ��#��m*�M�����Q��OSu<b�A^��Η@:�N��U��+i�A/1�I�K&*@X�P���
�E0���T�S��]��R)�Ԡ�+�p;,Džf���Z�Xm'g�Gﺠ�@�T�\���F�L�=u�XZ��L�'�a3�~j��(
�F!�ʝ�1E˨��I���U�u&ni|VW�O�=0�N�����`8H��o��`�p'��Oo㟌���9�'�3T�$�3�C���<�Y��?'>�Dz����]~	���%�/��}��A{Ƥ�ѦȈ��Lj�Zć�o��Tů
(�BE�K*;��Q?���E�Ҩ<)��K@����E�?��W�+
W	�U>�g�,����͊3������es�E��@�
�!�-�:I)��?��h&�6[-�:��Y픈�:Sf����G�L�t��H�ߒ`0�#.�‰��Tjb%*qu�a�7��K�k<,��Q#�7
7E`��R�(=+qq\��p��XtA�\696�	`�(�,I�2�p3��i�����S�WSa7��~f�Ҽ�q�f�
�C�IOZ.9S�4r��(؃j�Q �/�+p'�)[��ŘY ?#Tv8,
AA��d����4�Jz�<g9���7kBd��9���Q�›��\b��sZF�n%��<�KJ�
�ع,[�j`U)˚�ág5Ü<�3M�4ȅ�eD�[���$�@&w3$���x�"�A3��W;l�C��`y⨦��q��G�;ʂ�N��e�d^�S.-�8դ�������e�]+!x
�S���*��+�,@*�k�e�(_���6Ŵjo��lfz^XO�!?H�)A��żr�dU�
���
�uK�Nr��V�?�{�y�7l�y��/��]���KP�2|�{�ZН!V+6����%�A�#Ȉ��O�5�YS~�z�:7-�,�B��Ҽ�啇��� ���w_t3��'|<>�0�z�����{�8��fA�")Yw��ILj>�������$F�܄'g1�7�Mn>�<�,�2�R�Y�O�S�e�_�
%�:eBI�2t=H��Y�3ڇ]Kݥ:�\�� 4�YX��0��ၐ��z��}�5m�F���%,_N�T�I�iz�'vW��N��#�+��o^v`��6���0��,���3VA��i�mM�#e��_��p��,���T(`�f��&�6x��9��/?:	�Gꬹ���z� ��K!���Z�s�nX�1[����\���:��{%R�&lsK�ң���t�&����"��e�ܷ�j�޵s�-kD@�����:�P�O�St�eK;z�q�4�Ay$�?
���>Ft�D��(-^�}�*�–���]E����Ì����.��ȻP��뜅�Dv�8.�湧(ʪ��L'�$ް��;F��r�,�w�%j�6)oYE�jN�?�� =����	�Ԏ�d-7&�hdA(<�j%(D�F_�$�
��4x�8���(���p���]|jo�<�յR���o�Di`#�w{k7�(�i�mͽ���,�+�骯(�E�M۲�=����#�۹��^{�V��G���TҐ��Q	���<���p.b��'٦wz5���/�%����=j�Z��^
����*���RN�Q���\��f��I�,FS�+����j��:	k_?��>lG�m�ND0��d��7W��/U�M^�9֢��b��t��)��j
���\���V��άa��v���߰jD�-t�+��Q3���х�M��T��hx�8��Tf����s�K^۠o�"��ߺ��@9���`+V��y�x�r�RDK=�S�1,
�ƭ�B3U�;[��fP*)D�*A�mӰ8�:iv��)\ԏ�NO��]�1L��d�Ģ�K#��|b,$�9l�1ɶ�.Xcj�ܨ�U����"�p��a���i�-�T0��9��|v�Kh�l����>(%rgL���,c�D� �Q{�/���L%wȇI����U+��j���$gQs����)R�j$��p��9��c�K���^�f�I>����*��%���kA�guR����$)�s�oz���Ԃ��ɿ߬
@��4]�oP��
-�[�ƪ�6v����g�;�H��?��C� �;�s�m�ن�=�HQP�~���Q(��ǰT`?���Ih�&��`?����S�OvR����uw�+���P?
�_I�N�LJ~�4d�	��2��`�<��X�0V��C�Z���ж�Ļ0�3���\��RDD�~��:��z�hh��8��������*����U"�-�������d�FV=��@�Z�?�\����WJ	F|�t{�@��G^	=�+����&�8�Y�2
P�B�s�lhm��y�)�n���1�@��ѳ׬@Sjb��n�$L�4c�	[�B,� �Z"ZNX�U��=�J�]`��i\T��Ih�ڀ�M?�Pᢡ�U��AI���7���ȿ��;N�D1c_�6FB�0�i�&iXc���x@����z��;*-�H��;��p���s�7�s�ԝ�OKP�5O�!,#2.�Y��`�jV�O;����1��V�
Zl,5&A"�ǸHؗd��@��DlZ&�ޖ�	��2���\�0M1GuP�V�h��dn4C�;)_X��{L(W����6�k�M���V?�2 +1�t)g�n�&�����3˨�i
���Q˼y�KP�lK�>�'�wJa���h,�Ͻ�;n
��ߙ�7
�%�7)�rЊ��`���AMk�}>p?&-S�
e)>11D����bC�IKR[lH�<caC>�\vo��Ӎ��c�%0Bn�t
��@G�L'V��F��*so����46��F�0C��4��Ha�F�"�8���= ,E�O�D쬧�Y�1ť�*D|��.��Q!(�O͍zW/���Z���qi��y,V*�9Ӭ�^'�+?�rJ�XoA�l
�#{z'{ܶH���#��F�`�\��5h	��3��äEq�n�,O�dױݮU�E��ȋ)��$Kd7,lP��S�L�U:�뫨�3Zm$�.$Y
O�nrčv���OB�i�t���cOtj��w?\X��fg�Ϋ��H?�1W2�NB����`�p.�4l�숣��\,L#�R7Ȕ�m8
tڧ�:_��:�@+@�q����nc!����ta:U��W�aӳ*��Iq�<��upx�+W`�S\y��n�g��,���4[��xʬ��<W�����N��TO�rOI�:Z�ryr�-
)����
S���d��ZR��iܽ��J
���$��� �_��üK�~�����t�@�B0p���%Ҥ�ᴟ��tD�*�G�ú�uB����A�>\䓑�b�N���z(�=<���~���S��[a�	�tyi�>�Y%A�Ւ$+�ƺ��nxY��Ͷ�-�6[m����%�n{�1��Tcَ�Wc���B�
�S�M4�Z3���e��������;8:9���������
-=#3+;w ����_@PHXDTL\BR*_IZFVN^AQIY�4�<U5u
M-m]=}C#cS3sK��6�v)����a�H��9��"�L���&��h��~W7��>�KDLBJFNAIEMCKG�`q��F@88��yx����Eb���ݸmKg�h̾�#��`l�`㘚?_13����ZӬV?�3��ԜJv8�w�δ����	@3²e���f�X0���J��&��!�<~'�ƽ�`���ƓU5-=#3+;'7/������������������������������`phxdtl|brjzfvn~aqiyeum}csk{gwo������������!�#�X<�L�3�\�P,�+�Z�ѴXFfVvNn^~AaQqIiYyEeUuMm]}CcSsKk[{GgWwOo_������������+��p��|��rv~qyU�����w�V������x2
��|�B<�<��R��D����p�����s .�����H,�����[XZY�\ظDm��ʵ���=x�J��s��B��������+T�X�Re�U�T�Z
�ut��9��453��������w'r0�O��GR�Iv@�L1�ap
	e�c`ba��������S�\%5
-=�52MH�~f�i0��аqje[\bvN.n^>~��ΊEg�\���Sku�U{k`h��Y˨q4�;���� J����S���B�jU��x^߳o��ir_�z�L�Y7_,W�Ͷ����2\����'*���3�^�P��Ʀ8�`>WW�Æ��,�I[��Pe�Cs��N�;�%9&w{)"���N�v@b�$��pJ 9K���[�
f�3dK��D�Œr3
��@�fY�-�h�,V�����|��p��so��+LJ����PD�A2�$DR��E�g�$��.���l���3�f8E�+��9����.�ό��w�]Q�zr,Û	U z���@�1$M4���uɺ3Ż���:H獎��w>NK��0����Ǻ�b���o����#Cc.��h�ݎ�e3�V��
Ř���b�t]��[�j���J/��}��ǫ9��j-����i������p�����ᠻ�y��ڨ��߬�~2�Nq�q!��1��*k��G�#�`�ౘ����WkZ߅��x��Qj%زA�v��G3@"L(�B*mZv�D�ʸ�*:��+ ���N+m�q�;B�ȡ�KYs;߰�k/7	j�;��^8��xj�+q;��>��шJ���DD������A�����Zr��r�t�lm�B!�B!�B�Ȥ �6-;Β`�!„2.�Ҧe�I�0����i�qR"L(�B*mZv�T�ʸ�J��'���N'LBK�!��RJ)��RJ)�TJ)��RJ�N�qk]���|�������w��L������LV�<&�q!�6-;NN�ʸ�J��'@�	e\H�Mˎ� „2.�Ҧe��aBRiӲ��S���f�$��iw�Q�Ҵ�8�B7c%$Ti;N�q�B�Pƅ4-;N*@����D�Pƅ4-;NzHu�G���ě�s����H?��D��%P�LR"mQ�<汳"L(�B*mZv�l�ʸ�J��''@�	e\H�Mˎ� „2.�Ҧe��
aBRiӲ��8�[���=�9;��4gD4��c.����p%����/~�o��C��� �hR�B�&�q�/�r��<sk����0���Q3+��W�	e��=ۦ?��*�2��C�j�\���7�Mv� ҤX��pSr��JH����;�*m�~D3�,���\Ϻ��Z�����R�JP���oӧ�"��]���-9͎E��x)b�O�EvB���84�d�t����o�&-�����y�[�CP�W�v������G��>Q�(���Y�\�~D��I�|	����,W�h��N(V�L�
��tA�jq�	A�
�j�z��*U�T�c��޼��6Ԋ�#���d�Y���%<{��V���#���PŽ��0���&�8P�:���G�vQ���pF8.�+p	����'p	`�>�|�#�3��.ߗ���T�ܽ~F�"�͹���]�?���?i?k��>|�o	�Ё�s��YD�ٸ�=��ܛϐ}�/�gj�ОY��1(�4�Q�)�y��>���u����m�sa���E����l�Cø�tx�s-'h8	��
V�]+Ye����3-c�t$4�T���F���xB�����G�h��g���&['�����R�/ğ{&�B��c�A�ƻ�I�d���@�]ŲE�A��'UR%�jD�UjK�X���+,@(BҀضر!nKB2Ջ��-AR�MՍ���fsn��<s`O��eb�f�qC]�|�#	�s��O��;��Y���|"��	�fa֭�6ض�	n)�#����b۝*RYy��fonts/raleway/Raleway-Regular.woff000064400000251454151215013470013241 0ustar00wOFFS,��FFTMS����GDEFՈv�2�,�GPOS��vJ��JJoGSUB����OS/2Q`��gXcmap
D	�^-R�cvt �N���fpgmP���ZgaspՀglyf (�k!��'head�66��hhea�!$��hmtxd��&��loca\�'�maxp�  �\name��4A�MpostĜ�#�a�1�preppL�O(��{�_<����^#�+tv�(� ux�c`d``^�_������?_V9�2`�w
�-in/��Qx�c`a�g�����������
��������
�0����+���l�k��10�41�R``��cbg:��m�xڭ�{l�gǿ�;(��z�BKi��
���K-8L(qTP� *�1��%��1jtc����dN�1�˦f��–	
�is+�;~����Y9��'y�}�{o�y�F���[��~Y�
�wuZ⿯�~��!���j�/�č�4w���.-p�5['�nw��tP]~�&��jwj��i���5��U��i����J�>�:=ƞ_�ǽ�j�����j�%j�t�ߧ~��������
�9��R���Nj���R�G�B)Ư�}x�*�AS�-*��F�ƤJ9����T������Z?W`���f��M'4��V�-�S�yi߫�Q��0���Q�d�N_�^W���^�2�Xo��(�6��O��F������UM׵n@�J��Gjӟ�����d���Y��5�U�6d1Y�M�Z�r͏i���f��j�=Z�;��vk�+��Z�v��ݮ��G�ڿW5�7I����=�n�kaT���o2�"<��/C�ٗ�.n�uz�2]@��Y���=�Eal�J��u�i@n&��Pt4]�^L�0��h���l��!����t1����4~�c9E����F�N�?����x%4{6�O��g��R��@�8�>��#�r�
V�EA���?~���#���[
����^;��*���;��������i2���v5�
���ĸ<��4����7	n'F�Ry���U����\������K�&������1b��S�@�J��ęxxU+S���'�W�wĬ���o[8/�%�`��=���g#�:<���ʴ%'�|Y��t�%2
��ḴX�-�>bqD��'q��(�$b��d��լ�SX{Nm�rEsb� 5A����-�̇NC�񜭙�k�5ɺ�x][���i���1�k�_�+�1�Q�'���>��!�U��/�WU��ۯX�p@������M�A�A��O���6X�=�����9��&�C!�.�=�53��s���Za�1ƿ%'�@�jf��y��F�#_f�e�b���wυ|�	4��Ap)dz�ƹ�WI��G[���[J�Q�2Q;��{w���t�(`�;T������džc�FX�jT_�\>���cw��;�Ne������Ws����dg�?�bx-CF}ȷ�d� �d�4���Ω�d��r*c�V��7ߦbw"�o��"x���A���,r��I�׃}�]�\��m>a22�/��ߌ�<λ�42��y���Q�S������M�ݷ4���_�ӓߤ>�Gވ}�!���1=cg��;����bA.V$1�b��`�D.�����s�M0��D	bs��`���|L���l{A�������9�o��4�it�Q�%<�
�/��ÿ��ݝ�Ͽ����� �>?�&x�������C=pq��u��KsZ.�
/��q>��b.�
���1����~�R;�����/� �����#W��o�.��к�r�M쾛��d�����6�z�B�}� ��Z��B�]�E����=��}��j�gԕjҌ$����o�B�˦�!�5�}]�E�I��k�݅ٷ*j�]����ɺ���ۃ��͚LL��jj
J��^a�#��b���6�3�Y��$W�#j���	��mZ��x���B�]��h&u�������UEl(�s�L 6<LMU��O�bCv ��S�<L���Q�G�?L�|�>�I�TI��AOSA���+�	UD��fզ�5��68j�j����~�I��*�\���TO4_����Qޒ��n�N5�`	䠭�߮5zYk���
��y�;З�^�v�cȋ%����oPq���H>k��I�'��(j�]֫Z�`rMpq����������}����!Y?�A����M��4:�F���-N������7/#�w��i����Q��u�aWi?ok���q�9�ݚ��گ�j6jı���S�a��;B����Z+eσ-P�����B��x���YLUG��\D�Q@YƹG�Q�Tp�Zm-VA��F�JXTԊ�T����&�EE�j�K�i���C���Y�&�ɤt3��.M���d2߼L�7���06�0Z����e�W����zլ�cM��]d���1�B�X)AJ��$�tK�/="�|ɏ(�"(��h6ͥf�'ݖ��By�\![�I�p�L�,>���`Ν|��x"O�x���.����c�8o�g�o���/E��B�"^$�$�"J�nqHt�n�'�ŀ�⺸��r
��t�9ӝ���x)~J���(\�QV*���3�|��˲F��R�ã�`�]�=��=a�K�R�GyM�)}"}C /[9�VN��)!�Er�|���qD8�7��y<�G�8>�'�e|5�湼�W�Z��<�!�q�2@LaBx�s�|��\���.�k+ϋKbH\�(Ӝ9��a+'�ʩ)�x��(��κk
Y�V��f�Y�V���ʷҬ�V�k>4���.�y�l5[���<`�e֘U&7}ܿ�G�W�C��9w�{���]�.7ڍSF��d4
�a㠱Ϩ5��F�Qb�4�F��i�7���
}��X_�/�$=Q��c�(}����D{�}�}�}�}�}�=�h�i��
�L+Ҷk۴<-Y��6���A�^�S��5j���.Q>��W��������%��.l,�ҟ��g����N�8xc<|0�v���1���D�1S�P�3��c��'LGf �!
3�<�X�a�1s��0�1IH�,�",�,�2,G
^�
���X�W�*V�5�b
^�Z�Cұ��Ld!9؈M�E6#(���pGq�Ёt��Ї~�LJ���K��A\�0>�\�u\�M�-ܦl�c�ڈ=�B)ޤ#�D����N��:�=l�n;�m�ʆ�v��2އoc+J����Yj�.��&�c�G=N� LkieP&��z|L]��P!UQ>P/�Q��ʢ\@�p��]4�8ъ6[؂38��aGY�X3;�ZP�N�V����ewxڍW[o��R{�U�6��v�)�����U#!�ڵ.��ҮR�Sr/��&�Ӌ�Q��umL��o���yY��~ȏ�P�3�]]�%���9g�9sn3n�������O�:����o�xr��7���/?��O?�����ƣ� M~��{ww���;�����lksc�F�6k�E+��Z�5�--��VG���h�RK�5P�
�
�#wk'j�9�;�U�*xmzӑN1X`��VOlm�F�-��nd��3\�Sv��N�љ�
=�
�/�7�h��J9�؜x�d��[���X�A \�A�UX��'-�Ӟ�o�#�4���C1���n�x����ٞҭ7a?OL?Q|ȹ*ybЍ���D8�x'�Ŭԑ�pyON^/�p��f���^lg����A��/��K۲[�j���h™
5�&(i�i��,x�]���$d�Xc��C�B�ѫ�Yl8�
�i�$����S�`;6����`��y�l�)�4�τ�bX	�aÞ����_cU�}Ӱ�-'�
�X�Y5t&��NNyJ��`М��0�<��ۧ+��}�`௿�X�gi���7q����ά�A�Ц���k�"�M�<�{mi���Gb�8{�m���5��-�B #�t�ei�OiB�M4W�s��Pt��
�@�;<Q�$@�7;�CQ�5���s^f<�=��Vj�����X�a�g�L�0e���+��m��W�P�a7�w���U(RU�NV`�ȗ������k�B�
�w��d.��‚�S���{����Z|fF�K���X#l���`e,��	twwiN7���	X8e�e;|;2j�c>TcK����'�r��ჴ$b`��a�{�:�$N�-����=��H�!�\>�MȰ�����:C��S�\6:Y�4���̆zX�]+��S�E���Q���$U�.yS����7�MT��aJũD��&< �����i�aZ��IR��X��Z}��=Z�:��$�I(��u�*��R
.*�]��.j?~��a.�rT;�^:.����5�'Ў�"�)�TT�: {_��
��=
D:�IO�zn�j�7�-�$��m	áZ�3��Fu�V�.�˒_��Z�Qp��N�m�7y�kW��d2��b02�U�1_7_}d���)D���!�h��l'R�)IY7t>���e i���GA;��W�6`�Q��l��~��G�ߠ���af ��Ҷ�N��}�Вn
ݪ��xp�*@�.�rN�}(m��iu�Ї(�c�B�|P��zMf;�T>qPH�����]��D��$����Z�d�!�d�\�iujz	g�5��Zg™%�>���-�����y��yލ� FfV)���{��Ow�
�-��a��*�z6���ƪ��:PTZ�:���î0�ĺE�����p�/mfU�2��b9��2�=��|�^��٨ae��\��QI;��}��JS?*:�X����<��q0�RN����NΐE���Ć��7Β��OX%���jU#��ݢ挃6��6m�y�ԉM�i)��e�ߢm���ծA�k���͗P�K�+��H�2�c��Ձh���	�:�Mh��1Th�����6F��5��y��g��<b�:�& �ЛgR=��ƅ���7>��G�3��Ō#�2��3p�)B�ϛ0׊��U1�+�U�s�"�ފ��i������%��E�:�?��7c*���{y~�'`������B{S��]���ۼ�����h��Y�U�}yZӹS�����^���#@�R��N�,���K�C���(��A����T�{p~�sV��i�mU��+�.r��4�uH_c��,�C�c�D�[��us�={@���;�b�+&'�Y�M������KΛ����2.�6o��]���T��gHNCG�7l�Ճ�FV[vjt˛^����i>�Ԅ=O\�ń}$��q�%�P��O����R���ԝ�|	iM؏�|@g���pW;h,P॓�.���T�W3���K=9<a�oK!g�5����2a؍�Q����=���"�? �>4~k!�\��_I���&y�x�M�INBA@���f12C1
ڎ8O��^(b'4,�p�ʄ
��d�qŎ�x\�|����We�T.˲�g��X\�Ca����o�n��	\�.s��"��8�,�,�p�F8I!�Q�'8�#�c�(D�a�D!D�l�� ��V��ڋ,���#�2��j[x�]ؤGٔ��[�-�I�D�W}x5�b
X��Y��ٜ}3dN��T�i�1��:N�w�t*�|h����D7�6�F�;3�	��2����[4jM��M"���Tӆ�s0 ��0G�ƗN����>�S�>T�.�s�Ԫ���������o�/W�ok¿`�h�x�c���t���ɚA�������o �����qA�"DAu D��� R�A�A�I���q�Ռ{����]x�]�mH���s��9�\333{33SS3{s}��s�L���oε�k�<�+g��9��1"�DDDDDHĈ��!#FD����CDDDĽ?/��IJJb�i�-i�/�_K0"�����I�lv����%�庵
�A��?���=}{�vC �{�c�3�IF��V��7�8�,HV$�&G�)�s���TL�0Ր:�K=B�P
D�P�(7*���[u�}7�&�e�t}s�~Oq�uo�����b�0��E�]����i�4n�H[I�~��/ك),k�N`W�6<\O�e�P�3� �����Q��Σ}g�9pn�� �A�ɘ�8θƣ�$</«�~����2Q��LV�-ӝʌd.d�g���L��*��0I8ςg�gQ�xY�,]�I�%1�H 2�UD)�@����Y6<;=���ϖd۳���d��`$,�B����Q�$)J���}�i,�C���Hrt9]9��ќ-2�,$��f��<H#O������*�K�e�
s����w�����@
��h�
p! �K����ˣ�y
y�<G�'o4/����KAQ�EDQQl7%DY�G���U��|s�3?NS5�N��:J��F�?����u�[@)��
���g48
K������M��´q�m��%h��B|!���PZh(�-<�#�:�.�G�WE�E���EEsE�E���E�E�3(>C�Xdl2��L83�Ie�������0G���(�'s�y̼f�Y$�%b)YV��`���X��_�#�u1��V,*�;��œ���X�	���E����aG���y����}�I�q�2���s �;N�3�9�s�\�+�B�Q�w�{R�*J�%�{��d�$^rƃ��x<���Y�T�,ŗK�+��ҭ���>��͟�/�7�{��2DX&,S��ʾ��)�Ԁ>p��+`<��3�R�*��O���/d�J0*�=�>6<<���
^EC��"P�V��dW
+��#�˕{��ʛ*D��Z����Z�ګFVӪ����S!O�.
c��5�A��f�&\3^3Ys,�� �K��~�.jy�]�������:X��Qg���K��]�#����bP�o>�>�>�|y�#�K@I�$"ْH.�R�*�~{��A���(m47�=����ƛ&^��)�o:l�z�xV���ٞ�B:׌o&7s��C��͉�K\��2��.��Ee��,!;�#�89IN��r�\&��;��|B�(�)Rb�FaS�!ED�Ђh��[-��o-3-�-�-�-�J���(�J�R��R�*��Ӟ۟O=�S1TUP�MQM��UK�M�չ�ƪIj�Z�֫�A��z^���S�kP@j���[ӫ�|�,h65	ͥ��i�Z��A��ڵ>�7�vU�[{�Kёu�N��鼺��݊.�K�.ZSZ���֦V���u�5ںѺ�z�G�z�^������y�����Pنj#����ڦږ�6��N
p�@7T��m1��;�c�M{Z;�loj7�{�Gۧۗ�7��O�IF��j�F��e������ڄ1&�IbҘ�L^�Wӌi�7����f�YdV���w�y�<g^1�͇�+�B��,B��Y\��e�2k�aٶ$,"@T�$��?��B��,��A�I@�����c�c��~��Xc��͋�Ћ�W6��a[�ݼ����\|��I����u�b�
��v���]���^����þ���z��y7���{���
����p8��X������	�Dz.�B'�tF�?���o�o�o�.���ҹ����?�4�L�ü�g�׽�y��ƺ
�Yw̽���A�!�a���^s�x�a�'������]x��G�1{���G�G���/���J�^�7�=����}�������_�O����.���}�;�X��~�����|�|R|�|Z�����C�������P|hw�`�x�l�*�ā�|�3�3�y��F�t���/�/�/#_vB�� 	�����Ìa�kxd8:�5���¸0f�aqX6�;þ�a�5Cxڼ�y`�E�8>3O��l��h����$m��iz��n���˲˲��]@�En�EDD9D@<�}_A\XoQ_o�U�_�O3�<I������H��g>��33�iP*�	���>�7��eXO���2�/��h�Ia����j��c}��{�V��;����T��G,�ŏ�^�a�BiFG�ga�`�.t0@
LUb�H߀LD"i�H��:V'Ͳ�-�Z���������H~�^��v<.G��
k;�N��	��K�%��*��?��߮�c�7�T]��������b�\����/�Ո�JVa��B"�qh��ߒ)蓲&�ԗ��,K_�����Mt����7���S�u��+nH�O��H<���|.��/��-���@KCCL��I	ʠZ튧�9Qѣ�H�b��(�D"�4� �c,[�����zK!��[L��.�cX��g|^���25���`�Ű�\6���l��4n=�(����I��Άg�'�-�����Μ�ف���Ď��=�����]x��e��w3��Żuv�j�?�ti�щjj4i��|���Q�f�Z]x�0��0tہ���D���</	Pà�j���B�.ychpP�UF�"�N���'�k<�&�xT0�.C2�W�`�\,�9|���C��B�{��u:�v{���
��a�.���禠v��׸?Ç���`��t&���wr��`(4��y3頟:8
\�g�Oބ �ip3��ΪV�%���[�`�xԘ#i,dJ=py��x�D����(�
�J>��3��(-��;"sb}:1eקz�C驞�B�_LΜ?T��Ϯ��GBŘ'���#�:xa| k��þJ86��v�=�~wj�`e�3
�M����ͺ�iGܮ��c�:�a$G�l*G�\ڎ�R9\B�g�%m�K?��_-�=̨A�!��[4��h�H�(���1Ƃ�Z�
W|p����t��ٗ\�{��Q��xU���0I�t�fn���N�j�PԔ-���+G�T�_X�ܷg�չ��o� ��	4���W�TjIerCsDL�!m)����%�%�"�H���HM9�zа��
G��l�ٺ�e���_�g#	�g�"$+�2�`��b%b�|Y�90i�ٗU.����{�5�?yv����. �Ǡa@��f�6&�&�e�s����<
�7���t�=H`U��zL���J�~�e�B�'�L��J�v���X?V�~d��q�?FD'Sr胨ʅ��K��b7��4��5�f��j�4��
�HM �ς�M�m�9��@ct��FG��
�܆D�|�C��uk�\77w�ڵ�͍��?02r���l�_�#��^U+�J�V��3R�~u�R�J��ɲ:
��b�ȳ:��s�!��FK.�E�r�?�rX��6�K�1<��O�<�RU*�@�)n������`peFPs#!�j��Uys�r��,E�2!�<"��'b��q_�dMT&<�;\�8:����3�������FF�=��[i��"�2�'��.�{T�c�*�b����Fa<�B����*r�M��:���

k{�#j*
8�v�
O6�	����t�}jC` \�5Gu�M��\W�uiz2ٷ%ݟ�D�c���hoO��¾�3�.�ũ-�,Eυ��l��	R���450�E0���Iq֓��7��~���=
w���'��=���\�����t|Kg�EӋ�@�a��QԐF懌�5��T����1y��
J&.q�;�鵉�T2>m������R���Y塃7O�{S}�5lj"���,9��3�Kd\��	�<p�wۃ"���n���z��_`h)ep�%������J�[��-v��J�����Ț��i��N��6=Ͳӯ
���U�~��
��l{��-W��{az:�nL��?���^�F��T=&�HD��>��z������>��*�ELW��-����z��l�T�`ooՔ�E6��aQ��	n��?�ˤ.��	�Dd���>x����FΩD��\W��6\;��_���l�+��ugȏ�xb��=����#������m��XZ��}ѡ����J�:;������/4�k�` �p惁��u�Kg���a�!3涋�)8� �'&2���</LTs����k�405ۗ߂'�:����'���+=���;
GȌ�x��i~ƶ^52x��\��Fq$��Rl�o�}R,R4�4�%1����b~r�.n��Ա���>� �K%"�D����i���(o��1���
x���CZlCLU���v7X<�ğ0�Mj�E��}V�����s�N�Mp����<��z@1�����ǯ�s߇�R�R���^n����lf��e�Uwyϟߞx���wH^�	�u�0�x ���f�UX> ��MS	CA�!^	#�n5���T�,�|�dG�0�!��=�`�f	�
�oE+q���c���=�t�]��H*��4�|�[g�M�,�t�F`���n[gg0�V*��Ov���bž�e	�1=,�i�LJ��5��YAK��2Q�	�~/V�+�>��g(�~خ[r����)���\��S3�����ޙhtHkʥ��N}��x�@�Bj��{,���C��C[2��C��_�	O���B����r8�ꡤ�t$��4Z��y���8X
��Vgx��;u��hO�9hut��vu�;�պ}��۲�w��\�-k�u��{�_?sݮ��՞�>MڞnGآ&4T�o�`�#�<\�e"F�(��@Ĉ��g)�*�\$�
�He�ߑ&�OzA����V��G^��,�=RTB�-��	��
7��W�	n��zo�}.�[�=���5��l;$�a�x��Q�'h>��C�D*�,�
��t-]���-万��X0���w�}�_�����.��/���x��nL�cٍ��f�~W��?��-Џ�׷�}��R7�������-��U��n�q�L�S^!M^�!&�M��e���o�n>
�6]�n�5]yK}m��k��YM����-���.�O�}���?[�&�Vv�\�Ɣ�we����Ky���L#0CU�Z��/Bp��F�1"<-��8�ɍ�5�C����ܡ2:���]g�\9��Ě��	���$��I
$aP	Л�Ԅ�,�P��r
���[�0�K�ĽXKN�3�LDmxR�c[P������W�{�3��/_=�0'��Z���:�_�P`��	���%,�&^F����v�4IX��|�K6�Rs�Fκқ�6��5_h|g��=��IIܿ�Hm���M�݃���B����K`4���c��I$�B �HQCBGEEg�|:~����u��B��%�'���1�9���w
�{�2t�t�u���`݌��b�
��ҁ�N�*�͍���c��WU�ƷL�&��;̾��#�b�uW�Ș͠5�+�lU���KD@���A���'X@��R�|^3ŽSk�7�B_�΀羁g���_n�+`xb�#h�D`E<���[�x�[�3F���3rH,�5T������#d�(�:�mn)�q�Q�),#h���g�Ƅ�������3-^H*B
9������wg��_@Ë���z�],Q�"���7�����Y]�1�zA^�[�^<q�\2�p���%����K�G�����݁�ž��~q�ޣ���{J�}G���"�W<{c��ٟ/�N�g���E
�d4�
XO"9����-�(�a >���n)��W�74�9:X�S�[�ކ��x$:T׶�7�u��\��J�:ٸ��`���N�H��1.�°��̕��Ё7	���0���
�R�Svt;&���4�|�o%��ɂ;8�|p��=�Dp ��<%��e�'(��G�b4/�6�ǴH���&q�i�M�6���/ɸv�҅���=s��s��m��=���$\rG}�Lv�1N�ph�!�F�G�鳞�g̥P,ƶ�Y�Їݗ�����ETE�.B��t-�o��@'yΨ�9 h��%�D`j^��K�/���-����<k�w�4�}{���ܭ���)v���}�]T��e��7�!�	�A2eG�����1��*�,}7�s��~�"%�]��F�D�#�Z&A�A
�Z����i5�Z�,c ΅Ce��1xƞ�ˮ�X��|�G��N@t
z�w��q_Fb�
���OK1���.��P$g�X���uF[N;�Ù�n-vdk��:(�u��0�}���p/�mpW��^���0?�DR��jY�L�������I��ܟ0�+��� �O��_�0��F�Ӱ�$'1Bj�N� �	bꆿ�(�������r~��e����K�;��4"�H���L���k��|>Ĩ
�gx��_�`�poP��%&�Y��In��R�m����8lh�&�ҽ��Btk᝿�#0�B�C�8ov�`���L�ȱ���{���;�r���W��Tc�&iW��'9�w��e�F
���	��">�v�(|�"M��E��[uT�{�ބEz��zA�j��r�	�H߭lt�
MG�R/��jB\!o@i,�49+�f
�-&
{�+��ː��%�����=�еf8�>jcw�;��J�����`1�>�*U�1��fW1���Hj$�RE׸]I�oh�0�.] ����46ŤZSL;YO�gb�M4��m�#�j\JiCbE���{#�4�!��C�6·c&��9�k�]��r��6?�8{C�Y���**�=�e�ف��N6�c"����w��K�O�^#�� �G���Ed�
�rLM�j�	�=�V�x�0V�>�hj�}м6���f6e���lH30��L�ʏ_2:T0�b�m}�k���/y0�ZD��O�i#�H�h��إiX(�)�s��nx�$x����C��
����u�T*�����_�-����Xw���9s�[/�����)X^<D拁���}�ɝ��1u|}���d���K��˘x�:��y��t���՜6b߶�g�f؟w@��m"���u`�wG=8t�����gg�삾���<*ʒ�GV���;v���QY��w�̈́��>6�R�-��gc9�R��ba��6����e>3H�z�$J��h�3FG��	w�dR�M	���?�i�[R���R5^����	-y���rx�z��b�	a��a�X������h���i����|ۼAGv�@�o`.7���?|��9��{o��a]��B�K��;�'l��4:������Z����t5�I%��{S�����(y�����D����ļf�t�h�J�N�P�T*x��}�O�/�Hum��`�\LT����J��C��|p(�=������,�k��
T�I���[�C�J�dq]H�i�V�!��[�3� t]z���~F�cB�F�Z"da�SҶ,5됦�<%��#h���h=^{\o�kֈ
u/�
1
���VGU��P!�%
1h(E¨y���R=Y�~��sk5�x��P��<<=t�����,�
u^�<!Va��Ɉ�&���tJ ���0��*C���x{�*�e�\����R7�W�b�[�03M'f#IC
�4on)7	�"!���5��,���V,��j���6C���[X'��S���qD��iz��*�m��0�gM~Q��x�`����m�=�4�����a\k��bhMI]+�j�⑾n-�g�E�BW�^�Dq?��m��dڶ�3�򾰧w�p P��ۻ�o�ݔ��g2Xc���9�����;����ڞ�=z;x�F��'j�0gh�eDy���y��=��F�����Z�{_)�y�_ڿ9ҦdE�܈���>�+{R��ɝ��K�|��'�^�?n��_�Q�A.�W���4�r�[;�;�`�*cE|�U
Ƨ���f�QA�@h�Ζ����L�^l#���b��7]tD�3�Դ+�l���<s�.���zﶧ����`�B�/�Z��g��������J�@��0�K[���^S�j�O+:��8�p_B�w�k�#4fy>��!1�^�f)ze[�bi[fj�PV`�Hެ�rD�����dn����8=��DW����)�%�Q�#�*�T�����.�.�u�M*�'�ۀ����=�����*�z�ρY$ v�� 	��:~%���g˼I��u���B~�#.�d�*s�/�=�P����0���X�H��Y�PX�Įlhu�����'���W����*�}�^�n[�^��M;��Wi$F'D�k�����s���ƨ'��X�5H�,�M�;����$v�eX��2����#��ɹ���[���\�9Y���EZ�Z"�PA���Hx�N�2����a
� 	u��ӡWK�:Pzu��s��C}�;�������x���
�����9���b<2��-�1�a�b�%`�����d�:vl���׾��/tt����->��<l�(�.�����X�+��ء�I��?e:�d�S��M*	���$*����/?T�*u���]���Z$��gw<�ߢ}��~�ъ}4���*���}~��n�f��Sl��c)���/���_���dJ`W��V�h��D� Z%f�}��J�t�R�U��:��N�oC���֨�*�/�v=(c�ɠƠ,�~6-]nd��u���t�JW0׽s1b�_��.F��.Y,�&Qј5�/�$�1�	Io�FD����my�V�@�)(
�_e6Cy���t�Ԫ�jM�
�q?��
�4����	�Z|�.'�j��*M���L�A����A�-�reX{�[Q�"O>�iq��wN�Ն�ˏq8!o��8p'z��)�Ǥa7%A�k˛|�;���Y��"0"K�b޹
�oV�F��T(���nQjJЬ�j�$��q��nbE���]Af0�R7�f�ihdg*�¾Q��ǀe4b�KJ����o������й���B�v����^SOqۡ9�i��KRs}Rx�(P�k�o�oб1���X��atQVް��L��4�G�Umo�NԳ|��w�W���R��B��t�6�s;]!뚞���t�C���Z�a���`wernk�/�q��G*]���Z �&ޛ
����O�:��T�"��˨�*�QB�,x7�
��q�4%�ƇV�-R~%�"����`>��l�[V���O�R����z��k�\�x���H�^W����z�wO�_5��Ϩ��v,��a�٤v����ˈ�%������h�ʉ��ñH�j�V�R�Ռ���`�QCA˫p��=�o�x]�������B'���j��s=7�X����M/M���)xN2gO>�TҙI�9�x�yz��MT��@�8#�@�b���6���uS__4qg�[�_�w��)��/��5&:�cU�Ժ�.�,d:��_Q�kPH��^A
4z>�C�2$�U�m���.�Ҝ��&x���{���PG�?��%g�|�Cir6'�ŘG�S��VO>�GJ^�3w��7�����*5�j���PԬ�y:�>�-��5�����b�"Z�W�i�)l)o!
��bđ��6H�2e���R���%ЏC��V�5���2Z!�<I��bڥ`��#�?�Y~���f�W����\{��|~��k�^sF>�5k�of��F��S��Ck��AG���^ˠ:�4���g�`��D���:inוk��ܙ��rj͕�r�Ħ�F�/�K��.�_8����Ɇ7�z
9�˭t��]�j�b�Z�\��Pn��1����E��NgX&�y�=����`���������u�D��t+єk�3	K��\+�d�/5<=P��c�^��>\_'W�UR���1���CeLZc��\I$���Hڄ}��
J�`[k��t{c�J��K�ng���!I�N
�iu�D��2�eA,��hiY�g���!o�ZL�
�?z���3���>��B�#�k�.}�� �=.Gb�xD�� �_S��d�㮂��PY�������$uq�6�
��:U_If2�rЉY+�[�ZŠ�I����*Ѵ��X��,�k�Y��^M8��[n�M�_<2r�<YR���P��w�[�a�ˡH*p�	�Խ��QN��F�𠯫�|�S��Qo(��2���΢cXv�s�Fq��!��]@�^�d��fZ{I��+�<fvq�d<� a�t��K&}�6j�A-�J��܀��%��dj@�3��j�V.�J�^���~�>d�t���hTr�D� ZGB'�u��е�B�¡+*W\Q�/�d�����Ӎu�V&�m���t�,2��8�j���u���+
_��s�6�5u;�W5²��W��ɱ1G4i�F;�o�ǵ*����mJ��c���C/��	"|}�n�GI5N@��aqʄ�y�0�	�,���ģ�"抧�32;��v�j�,��h%����RŊ]��D4��7&{�Z�9���x�<Aw����p���ɥ��7m#:R�Y�y���a)�B�����.���F�V�P��`&�J�4���
�PX�2�6��f@#5;u�5aw�K!�aG�Ҭ�h����e��@'�K���K�]{��U�&�]�P�T��N�D$�=��K=(b��.:�8����@�{�Uo��K�.���[r���5�������`��&�����w��}@��}\Fk�x�?N؍T����HL;��$XL���^��6�c-���+�A-� <��_��"`Y��4�N>�{��륞��u�ೱ�ʬ������r�:�fLR+��H��C&h퓔��r�^�n���gs��{�^_��B�^�9=�LM���t�q��n_���q��R�Ĉ�ҽ~i6�Z: ���-��ϕ����A��]zq�ڀH�6���T$��sO?DzʂHW;�\�
��T�P����W!cU`)�o	a��0��e�������\��N�<I��!Ԓ#u{8a�D5Z|gy��������5ؔ]R*��^�	��Qx����>�\�Oy��J�@��y ��F��÷i=��*��C�YC�h9��L��E�􋌝�=�l�;�Ɉ#X�v��q=�g�X)����[��h%��m��Ӟp�(hӸ��6�/��bn���:)�<����c��)8Y�۠��Q�����s���4m>�·Zm��6�G:h#ܪ��s�6���6�G�F#iD8�����cT�� V5˔��Z$U�/�!k�4�:Wl�!e�&�EJ����L���_r�i��&��[��$��+������+�7q�t�IRDž����Z�G�}Z�D�h�,�<��mn�
�Fu�6����6��|���n�F������~�‰�,��‘�p���܆�<�F�ֆ��lks�ҏiE[<3�W��ݴ��DZ1��}��k��,2�Q�$j+� ���9i
���F㖉ehp<��8��E��P�Y�'yZ�hI�Xh��0o��6ũ��ӴM�4mn?�m�i�qp�)�|���n�CJ�(mDZAP��q���z�\��b�H�E#�-�hn
K�z�D�8�Q:�>z����CыG�9|8z�r8z,�����J�q���P܋�^��;%˸�ns��6�Ӵ��H�t���C�6wS�x�E�Mk$(�����C��|��t�+TGذg�aStv(�J�*��N��*^�l���Ъ��ɂ����z�{�~op0�<*��…�U�}�{O|�'2�"����D�1R���NS6�N+ɝ����M��v�o"�Km����&�z02�2�}y7��}΁��bv:�H:�7�F��hb*1,;Yow�34椈)mN���jL�={�]�u"L7��᧘nuL7	��0�T��S��>Y��Е왒=\�/���6x�.Ңr
��x���/�>�{7ij�O���-<���x���/���c��7���
 Q��q:7��d~�ti�'����5��osʩ`XZ�Y���ڹ֚��M��4k�h�'�f���ϴH����򻪾a���}��uﶁ-��}��� W��2삮O;8���L�s��f�ɕ�Y����E�egr�MF�'�!���e��\�Z>�(���-�W2=ik&���Y�Bї�ʺ�R�K��
��Al��H��8*ث��Z��<�'�ȗ�o�r��m�)/N��vp%m=��K�6w�6d��PK��M��|��l���d]�e���m�l�����JlY��,[)���C����߀+,_�H��Z��ު!�H�c�t���5�t�I���E�x�ԝkn��i�8d]�x�ri
VJ�Ƕ�/����s�2��6�ذ���U�3�ܦYD�e�3͗��C�Y�=��f��䶭[c��.�xwzc*;˦�&���٤{L:H�,��1n��n-���%w��/���9*V�U�˜�Wt>�OӦ9��S����k�������U�'B݊��0���k���*�M �����|��C�v� ��\*�~o�7,,p��y�c��*^��M*V�v�#�h��	ap	�B��5�t��t��)�>�%P�544X�ye[��0^h���������Qi��L������<Y#����;J��yvCg�l��E��%�VI�m�0o���i�6/���~F��u�6XF�M�%#��/�>��r2#^l�����M�维S��%�Ylw�ڲN���D
����ՖA�e�_��\���2��
eahxK.?kvN���zl}.4��u�
��k�0�{2���~��ƽ*&��L����v=d�u}}��
����dl�����V�q��	1o���l��+m��8�N�5����w^B`T�a,����>Tg?#<7Nj����g{�@�	~K��Wʣ��9�B�=�v�s%�۩�}���\E�O�.����~�o�W�'|8�
���(�����<J���d��~��#mD6d�p�O����"���8�Dp�Ck���.��k�G)�%�ʆN� %d��ˤ�V�����2���,³�Y|��V��Ίǹ[�屢���h+f��s�c_�O8&�	X�v���Ib�;�|��9�?r'���CL~��.<�'�e�]��
�i����J��qR��?K�'>�I��W�Gu��^��F�+cě)�� �/P81E;?�ZIgRhs-�ӯ85�;��O�YWù�E�O�.�E�O�.�>�W�)�=[-8��.�F�
��K�=D��$�>�Ha�+�:�SL��y=,]nC�%��fJh�a��iU˶c��B�x�Z�)j�L�� u��6�瓘D�m�������.k6��M\�F�	eh��ի��M҆4�ͺ��]HX�
'�ռ����P"�����H��}��@{[^��K���,}�Q����0����s��?WS��aܱ��	0p?��2�ø�~;5���q�ҟy�ۦ����i���W�r�.��p<�>�:o�u���sk�s��jtNE5��������o�b|��#��5k��z�	ZIKu�?��>-�f2�O�ǖ&�A���_^�y��&��+Y��.M�1
��-���Z���t�I^^�_���*/�n��n'�tX'����N�ܮU�+���bI�R7}�Jݯ�ՠJ�ԕs������R����$��y���T��m�T���]����ς���W�q�R���$�i+����?¦^(�_�����Q pj=��7P�Ij�i�[�k>.�1p��|��3}\
�תXj���3W䤚�A�{��(���=�h�|�oa�Ȁ��o�᭿	-9gk/$
�g7��DGZe���	)t���a��<�c������*����3��,�>I�6X���*=ڊ;��V��y��+�0?�jt�Bj;7
�u��]���j�����o_�׽�/�2^K�+ۈ�K~ڦS�,��Kt�s��cP�-�¾f��նCt�>�;�Y���X=�)Z�A�5�@C�O�i|M,z�P�t��������T�t8�
��aR%��*�QNVN���W�G뭒}X>�N��B|4Ԗ�>��G�9!g����Z�>�-����wb{M`$N�Sh�m����aen�$9�O�[W��^]�=�%M��;ͨas:�=:������_޲�X��1��TG�if��H�UuF�9.d^��o��y����o���]7r���[���\~,�1��؛�a��N"v��|q���V�1�c��""U+C�tt����|��4'YgN�Y^lr�\��$�V���h�4ah��Z�1vnP�x����$Y�܂���ͥқG��ڦTv��d3$��gr3,��e#�LL]:�3Ʈ�:�A�!��e2am���K�c����ž�������t/�
yA��Fm���o���̬��
�3��zg/�ͼ�O^�}J�J�1���Z�`a���ZG/n��'��^�<�*�/	���`e�4��f>�?�������2�>����<��U��mV¹�L�N	�	��y�I�w��A�÷	�M���s�Zb���{�>{O�罴�T�O�s=������s���a�E��<�g\��Ȟe*�����C�6�d�ٴ�yޮ�'�5y�m��J�"#��IQ�@
)U��;5��n�?O��‹Ë�3�,�vAx6�O}�sWU��ȬVtZ�MF��r��r�걜j���̉{�5[:�~����}�}��������2�-G[0���Ʊ�;���2w���0<�S�"���뇫�>ׂs]�S=��$������`���@�`��[��'��Y�f�:��IpX��p����И^ }v9����V3g(R�~�x�{(=����6=�r���Ţ��3o�q6�gdmpV�^�,��=������C-8wS8�G�rY{m�H��>�����CA��.�/R�W�Y�.�s��O�^p�	��J8X�lm-pb��$=磊d�d��X���۳r|2Kݣ��8)�w�E����[Yф8:2�&g5��F����p���h�������
���k4���5���+''�ؙ�_<5yh��s.���~M�#R{�n9���4���7+�,��)6�b��]%�E�nl�?�p1�aS"}�
�6������ک���m���C=/#Qq��x9��m-?��ñ<n�ݵ"�r�X{K�@c���q�����;mm��𞥟�vne[~UD������!7�[�ٔ�aW��!>���:�o;����4)s��}�[k���'�BR��?�Sb���z�x�3�ྙ�����'�gѕ��ifF�[t��ȹJ�f���B�n�vJ�%9ߕ�.W�~���,��J�c����i���~��������	�\�7m�8���儽�P��d.WP���#�4+iN�H�(j
�����+��:K!�^9����'�e�	��5�����F�*">�?��h�hDx����k���`����I-$Gt3���pQs+mϿ�Vx��
���
���i�
�ݾ��ڶZb�4�A��Q��M��l����ŧ���|_���c=+�����1�sN�?8�'䃃�&N.�6�O+LN��ki�R�MlX��W�2�Z*רj���%�Q��J�R����r�R&�!`��=V�ZD*n��Y̱���	�xOΖ㏗��[G̭����$��nx �7������ ���4]N������t�@<���6��i7[m��?J����Z�}=�i�yl}����9VZ�H�_ϷC�_�X���\Mi�i���q�F�)bg<c��J��uy�K^�����S�z�>L}�~��su��}c����OXo]�s��V�q����Zi��TkB��X�֔�9��Z��~�KOLކ�j8�kK�Ӭ��/�(�m9[��z�-�|��S���c.���f[��}����y���4y�i^\O�w��9�%�8U��r6�%Q���B�&z��M�6�Uk2{���b�@<�{s������ڊ��S|�fɪ�j�����1x�ib�6ɩ�0��8=��0.g\<��yZ
�~!r�&�_����=f.,��4O�*��̙�3�|�帜���o�������t^+Ʀ�^��)�y�N�s�����S�*oNy@4*� _������>�<�p	�
�`�C�3A�Ƈ>�|?=�r���o�Ckd�~އ1��g�#�V�}H����p��W��[�O
�.\?Z=� ���C�H[���h+���ge]j+�;֊��X�^A��
t���q)PK�#�ٓ�Ţ\�j��է�и�M�-���"��TFi��v\��%Ҹ-o^j����Eމ�� ���(7����1Ala{=8x�df}���6)�.�hĽ��L�6P�F&v��]2�a�zsi2v������1���wп�h�{�>Es���sA�h�υ��Xi�m�j�	p�+P�G��B�F��g�=YYެ�.c0�F^��b�%���	ϫ�����J�\`ـ��0���ߟ��,&�W� �P�o_����,<(�
��!K�K7�1R����ﵟUF�R9�D��kA�8	9h�I:\�6�Z8y� k�jm��@�*CӉ��{��"�B�g:�;��it��E�&4{��}�;�4Z�˟��.��i|��,�ѓLE:͟%�G�V*e���l6I�2C���[�iXj�ˍF���<�&�Ŋ�N����@�O��3�g��'�鶲s���)�����`|������q����%wC�w�wgf�U33�J�<W��?D��YU�1&��H���8-�M2H�>'!�͊Ib:9V�����Hq�����t.�R��n�����zz
a/�h�.�¶=����u$ω��;wb}#���C�������Bކ�Q|~�v������Q*��DM| T�@I� �*!v����fҩ�jz̮�:�A�UkU��
����GU�|E/o����;��4q�pc%���'�r�o""Nt��x����X$��8'�
������p�P%\ta�U|���#b›i�>^�Ǵ�?��������6�pa@���R��Z�?�0���#�}
x�>��8���&���xГ!�oG����w��}H�6��҉^���U���6�6:
:��Kʼ@d��$,�ϗ���B.�E(Q+U�$|�U)UN���Ԩ
r���Ypp�-�t������f�ϖf�j�q���i����->{@`3��T����ǁ�Hs��U��(�>>99��KA���/<��`Ȅb�"��0����0�VOw��L�>���N�-h0X�`(Ɵ#C�"9��1�ꈸ5lrYD�4����A���u���,wɭunj�(&�tѹ\���t�9����T�{�����8����0�~8���;+����/d]���	���,#�w�Ĩ!A�/\�ȡɓ����;a��P�,��/б�s�Yt��!��x`����y��W�y�L��"d4Z,�?�7�ܭ'\X��f
wB�h%�,�ؗ{7DSs��#��R�
�Os�HO��C�Jۇ���5��s�×�*v]><p�Vg��)OoOf�ܐJm83��>�ߠk�Q��}Uc�U�@���t(
]�o�YZt��T��8Ş�����-�yX(�q�g©ʆ`$i �p\���_�"9�"�g�!�9]N��Vy�r�y.�/����@GL�<��W"�i�1���΁�{�Y�K���gUx�:��	�=2��A֐
i�H�:t�ib�ye����~�1k;<��
ѩd|{��Y$�^O�N
�-](K
�d��ɀ��}]��Ͻ�t�<ЪU��_~S�]�E�BI[-�)�}�j��b���i���	��g���adɉ��y!��^���νg���=yk}COߎ!�Nq3���츥h�֐��rd�X���D������#���Tq�'!�_�&
����_��sA�W
5d7�v	j�K�
z�]�H��r`��8��ւ��=��s�<&�ȿ|v X����
�{����p��`~��_�r�+ף2Lx����vV�vѵ���3��GGC��hs�uz����$1j�@ʸ�z���b�Uz�;���DM׆�|�[���8���'踆1:Ǹ���s7�n�%G�µ��j�}};��B�ޠP	]E�h
�6�G��i��	G:�,\��oc�Mͧv���7�?���ά��'�k�vP>������|�n���C�n#��maOǟ�ӫڀ%���m~Bk���|}���6��IϠ�T�2F!F�Y��P�%�Z�L���:|��o������k��6�p���}��g���*��4`E�;��$̏/�~~�ϸ��]x0�{�/�/ֻ#�ߠc��5[ؚ/����+��Υ��g��ש}�<�v�C�yx�(�x��!�pք��R�t�A�QFW���y�,6P.'Ř��{ �#�6`W�����+5x����1�=�������ch�?�y���.�x�)��d��}�Ƚ�P��d���R�z�J�(>�q�o�C�@q2��Zh�ؠ�[�������{׿�kx�;�8G*���S܇�8�yQ۹�����4�с���bZ
�M����L�7ҴN�cxr��z'�dm���嫄�5ֽw�!�MW��ΒWz=����@w���,z�=�|9��77k��(�')}(o7�S�1PJ�O�NU�/��'��/sS�oEg.�����q�)"�>�}߹po�z���a�J �����^V�}�~���s���Mܻ�B�&�����#�=�L��5P��:=����a*T�^�����`_�S$��B�~䦯��(��x������;+0���k��߱{�%$'%����":�7�xh��<�ֹ�q��b��n�p��gз�ߡ�:�y��C����I.!܀���"=�
$��d�Ţqsߛ���c܏��*�l��%�����Q�o跠{1�jbv�F�b�m6+$��ljf�c��'�!zBC�;��:���K��ڡ6����C��֋F/��o;��o�����j�筏"�k�߇�u14x���*m�!T=8QZ�C~?(9�Ӣ_У��cT���F.^�Huͻ�VɄ.Z�U^2��kUz�k4�����7LS�F,6�Qø|�� ����|�I�F�[s���`m���Y�i�^����qҬ�3�Z7�M%
�
�ILe���Ћ``gچ�}/��y��;���Q�0Z������cf.x�7ȶaC�:��k�i�쌲W��[�N�� j_�׺�L������̰gL<��҈�5R����{=�k�tF��G�ͻ�ަ��=c2k�XNt(��E2'�
R=6u&�>c��F=����lU��u�k���m,��Y8i����$���
�O����G�g�tX�[�����G���Se���LZe-��ᚾs�m%��Hq�x���;�ڮrd}�R�_�{�{f����3�hə�>P4�잵I[o�W���{���{���ҿ�O��͌}OU��3��`2ZOgi��+��>�S�]��ru�)ڳ�������3���
�nڲ��`c|���A������=Z���ϻkSe��MW�N\=����}{���m����j`�h)O��"�Dn��Q�v����S�F6��Z��~���5���ϙ���bvs?ñm����B��I=�#u�Gi�M��a	 {_U]z=P�aö:�N.��Ă}i�mŹ�[|a��]��O%?�[���L��[:o�����Td���v^=۫-
��'���9���U��n���.�6�u��ԯ��;qH]�F�p��8���j[�Y��s��C"p��}�P ��3�[���}�a[Ȝ�?��'<�Sג�7e�Zm[��v�x=F�9�����Ǽ��Ӎ�ߐ���zꖮ�g�i�/��)7O������a��䖀Kψ��z?�+��g�������n�2O>��a��w����]2��/��3�y*���I���8��g�Z�g�z`�'
<����k���k�������j��"����V��E:�r��t`��j;��9G+Q�洜Գ���3�Q���f�nc>-�3����D��+Φ�$�t�/؛�d`��&}^G<��+ZM=��u�s�d�Le�Ӊ�rE�$'���k����}ɸi��ŷ���/�Kا�Y���{t<_���Ÿ�`�w���w����k���ck������yZ.�?�54�ǩ����,$7����G8�鴇=FF7Ծ�D�D�);�n����7Nw7�5(~��3�LĈܕ�Xy������1��w�;4���H�}�����ֹ�-9x��š�!�(��}��X=Y>"�t
�j܏���W��\�Zw'<;݂�?&�u��5�-;����z���熞Ǐa̴�&��r�<���Q��!i;L�-�t�~�?��Dp�9��or�hU�P���/_����t�Χ�T����{r�?����JER"ˤ����}o��)쇈 Rs�	�A���P�F���($
?v5I����5�DDh4�m�"��ԇ�Y�%��#�,S�r�1i�Y&�rcʲ�ٙ�N&�o��ɍyۋ/�^X�h���h�~���U�H~k�wK6���
�����i*�=�kA:�T�0�cLA�4��l�6�k܎��FƜ����8�3�C�E�@�E"�A���ڑֶ��&��M�M�®zh�l�P��͵�;:�n��^ժ�&'�7y��M������h�+|�k����WjM��q��z<F�Nϑ�ޠ�R�b�<~��/ze��6C��������0q�-7A�Q�Zj|trO�M|����v~sh�������&6v~����xΓu�X7o/���w3����j)�e�<I/����ѥ
����:L�]a!�-��_Wά'}b��q�B��6^����Ҫn���-$Az�a���h�wd��K��'�)��	}$��v�-u(E�ٺ!o�Od�s��*Nn($�۳����C���v��7ԙ�g�3XH���=;�ڑbw���|�7ѯ0.+|H��1�!�'�!�\��!��kgU�j�}��Y�S˕�&rb�
v]4�NQ~��o��w��F/�Z{x�/��`[&��R�N��!��)p�b���"r�lg,2�e��<��S�-;��|�v�M��P�̾(���Ëo~�[܏J�x���%/��ܥ�yI����_hi���k(.��c���mX�`ҝ��ҭ]��;?s|���ܔbj��Z�n�4����>=t�V7�k��^�l�XHڲk���he>�&8��w|wf��I�{�?�f���/ݚ�=����?y��i�=�|)�w:�|��d��B�p��/W��Jց|��a�����L�g����I��&��d���y|�N6�c*6��'{�Xsg��dg�@۞%b��ct︄��^}~�V|�z?��$�n-�m�w0�cb��Վn96����M�C׺��郘����iKs7ݒ��X����,uN�gIO�n�wfj���\I�=��u
����E�D�':��r�ƶt���A�5��!�~����]�ysp�������bN�.D����୷rB�tn&���?��H���W�wHV���so圫+��V�����gz�'g
�a`\� ÚXPQ���"J�EPYҊ"��������o�sν��{�}��L�����'��ϟ�P(�`ֵ-����:��-I�^ݴ�O�%��Uٱ�V���t�b��s'�f��95U�a~G4�����w	b�m��E_�dQd�2އ�װ2�W�e�U���5�ե��5̳�7�B���fe̖��]5�U��q~/�}���"��؄c6�vfD5�,B!_ͦ�'�Y�3
�DZ)�!��{�N��=�ygψ�6R����Ϯ�.�کH@~�珑�I����43����Jy��}fV9�N���C]��'�9�E� �կƏ,;�Hl?��Ԑ�+y@��d��$��e�r�jY̵.�[ͩ�c@?}l������ŝ`��|��
�0�����q�c�a���>Op�47-�w�����}����w�x�}G>���in��@�
�<Dt���Lj��3�6��)���h������G˝Y�Q�C>r�ܪ��G�"�B���]�6ѐ���W͆2���-��zr��P�i����Wb7؝I�~��m�K���`��c���D	P�'md}CSk������g|�����d!:j&i8Lb��ʋ�8�Oֹe�UͪI��s
���d>;a�[wG����d-[��j�>̈́q����8SE�e|�2'U�ͅ�'薟������%�Z�����k�?r9�yk��&8���,�ՊbA��0���E�e�3�K�}%܇p�_z�{�wT�W����6@����:"HDa�&�Z4	�Bz)������X#�C�![��"�5��bnӀ�]�/�Y�q}�݉���5^���~��h���u��J5��Iv` �A~�u%������G7�i�y�Ĥ<�wK#�(�<`���w
�؅bWx��,�EnF����s�ݠ7�b~�:1�d �L�bK��E#�f,t���x�/�5����39�kIرV��63Y7��VjkJ�-ڻ�F4��m���R�R
�ݸ>�1ߕ8�s�è��=<���;���%S��\x�@�pώ�a�P��W����f}��x
N^̶̔>�A���.�[=^�R�_��F��u��F���T�%�]s�^��GgL�8=uN�?��¼t�z�{-]1i�
�� ��Z."뺮.�$�1�-rJ|�����#�U=��g��\սz�p�����"��a,7��2wIt���mTcEЦ����\n�kUK ��ѓ�+́�9��&H��s���"R��D�Z���y�: I��'n4�!�a�`6������u}�'o�w�Gps���J����:���� ƶ��S�G�VC	Y&�hL���ƣ�h��x�O1ٗ8m��m�\<�+��$����\jP��yP"Wv�a��5�֚8�Xx/Sm�d�Y~�S�_H�����RIQR�1;�Ҹ[�qB�杦�:���/?;��7�~y���z�!P�]�d�>
J,�+)�vH�I�z�b[铏���"��׎㇓w-��_~v��/b�
�tV��T(T�?
�u9��F¡����cO���h�r��><5�u���3z��,A���q?B�ۘ�r���L�ٙf�fM7Wv��
�ہZ�hb�|���<��z,;7��C�Op�P��~��?6,!ͥbk�*k�n��zvf�y���'z{�/���Q|6t<C��!8�3Z�B]_���4^]�G��L���p��A�/(�<��,��kK)Ȏ\l�ևH1��o�:��:a�<��c=�մ�:*�gG�QҮPl�hG^>�d�i���T*-+j��N�7��
�/�G��QJ��>h�q�c5�_��Y�Ysr��͞�PpD�.d1�Y,
�^<��(L���۽�I���F�7�\N~:Q+]ʑ5�c��Q:�7wn#���4�;gͅ�8��5��%�%�}�w	��E+��h�R=;�����t��AO��M
|�7��*{����6���~�����-�!}����x�3Ko�B�D�""�@���T=Y,
�U,�Ӕ��F����+8,�&��ŮEv�&�8�U�Go�FO��^0���o�����}�5gU�{��i�1���Fg��6|��h��5�r�����2;*��g��Y��(*Uf�g6��ߞ%j�=WN��m����Gv�I*�zw�cs����6�W:��oS&RK��*�]�OX�j���@P,���XZOP�V�ի����-l�ʷ��q�$z�j�޲��L��)gO������ioymB������`�>>vZ��Mb�81�|+?��х���t�h�Je�ы��[�C���B�����cg���
����U.N�R��
Yy{��&Hp�碘1�A[�N�[jg�������μqh:P�5����΍ztӻӟ�L0��P+>�^wr��om���'����Fw�����^�XXwu
��	��U�
����I����3-U�t2��άϸ�	р�0;x�hbm��n}0���[����ҹ����Z��|F�����m��j�#_���Op�u���yz8�����PoBv;�y! ���رg̲^*�������<K��xt�g�u�;�#z*J&#E|$A����!���/�M*����2B�����)=�6•d����9B��җ�Ez��l%'��e��ڋ�}�O��>R}��s���`�S���;Й�,��	7��T!O)Vc�L�l�X<n, H��R�r����輦7�pꗿ�B�
$�Q��c �|��D�g�6pڳ"8Gob�L�����D<�T��jB.g��UO�˞�o��e���:|�(��ȋW�8���(�GWE��J"9�N�L��ē,H�̺���^=��F��Z��8mh<�����E�uG~�	��
ӗ|�\,����#Ӳ�b�)h���?�\s=d�ޮ
�so�_ʕ��t-�^�îmc����.�99�T�:�Q���U�`z*!�C�J ��6�"�r9O���-����=�T��`�˨����t4nGg#ޱԈ�S�Z�Ҫ�y��j���b�=��݃��g�n�w8jP�xR�n�1_���k@
P�_(��ާ��ǡd�$��F͚�2Y�dR��zJ�΋ ����.�9lH�X1a[6@��4"��+N5ڸR��왝�?:K��G؊B��~�z���tz�y��Y5>I�F���S�֧t����H{}�JО�^Y_�"�KoA>������I��^�v�h���W5�tq��/m5
;�N([P�V�$��o�@m
���<Զ��T3���%3�ս����Z�ӺH�Vm�[����B~�hd��
��קR�vNܛ�8_UKd�>�w(U�6[DG-��;"�guܴ��'Ԩ7?��N^��sn)19�6��%��g�<�V|b�'��W|<�+>�jg�I��ÇW����p�Ep�P�R,&�2�6��~]�.��IbA�O��i�}�V�_�|YaV���c.Q��RI̷����<n�L��挟[��7kP�6���:4g�?����*y*8.�+<��+�"�W0��B`c����\N[W�@�|�k��P�9
ek���65�@Z��K,j��ն��L�D.4ĕz��Ԭ�
.ֆt�U��XC��2���诳KC�J�ٟE�~t�Pܷ&�j�C=�1G'}ff�>,�����0,��$�wI�
��܊l�qXC���a��4�egb���ܮR��Hj.S����_��Y=sf�wsZ ,�F�ՓK�Z �%;nK��G0�~���w�<]��M����l�z�ƥ8�A�:%�p.�C���$
�!�6���G��q=~>��*����i���u��,c�16�b��l։�Zq#S�N����i!�	<��O*jrE���QN:�s�E�+2�@ �F�^��2�*ÇB�t�eP<�8jޞ�@O�S�L��;
UhM�ˆ�j��od��gþ���'��Ċ1�.���cD�V���;�כm�r�:�흛�Z�O��׫��r�q�IX��e�M|.��i�
|��"l�'�j!���m������7c��l[t�=p5�40���jY�חq���/�>�/�����f_�{`_�Ӹk.�b)t�kX�uu�o����c6�j��|�߂t~��1�b���9���5�`:鸳y
�kEcۃ�$��&��������p"�$�Q�xYW���j��u�vN���SyTaMU���Ҿ��C�y[17ٱm�i�~p�[�6o�dhpO��wER�����‹�<�岥�,y񞱣�R�^�Ѣ8>e{#�U/��fM�!%�L�o͛7�LNړ�9>�������]�xd*5�!�Ǿ�?��ݖ^��j�\��!�&��k]�‡�OJ����qu3��&x֠�PHZ��X�5�8T��41�OV�dldz?.��#FR(Az\�X솚�
�n���5i�2*��k8��ɵ���o�Ŧ��ߛ�g���,�ך��,s[��t餅�����K�"ӧ�%��Niԙ�XY���ƍW!�[yQ�ǛZ�:j�����9P�B��z�fA�0.�;� 4��N�����а��g{�E���Nt�b"�z�$���s�|�ms
����xM����a�g��(+��P�=��Is[�'67�Fn&\�;s3��#G�#�٣m�#MW7h��\�ۢ�D�kX�5h��Naq�d+��&�/���M:_�p%��ĵ�zLǤo��!j�"۞m�N��Gk��A����ax�s��&jj����p�a�k��kp�nϯ8�,��qZ;��f<W�k���;,-�Y�R�T���+dG�B& %��TÚk�VPV�^�Dj�=����imبR;�����瘻��������R�k�)�kE�c.��S��q�ܳ�����Q.������g{�ȩ�]2�U9���?��^
��
�X_o_�|��ص��x��(C_�l'�*2�ڨ�
�9�9�
'�b���G���\N�mĠ�Y�)��}ůg�����k�L3o�r%'���'���X�A�G`7�
&���l�e&��
(7��y�J���S�u���a"okF�@� �q���a�%}
�B-щ}q��_,���=2�%�����D���	E>�7��LI�?"Q(avл�ɉ��k]�<�PK)�<�\�03���#�`��ٷ�v2'-3o��X\�Ҽ��[��/`����@!h��R-��Ca��ts<t�i+NgnC��ч��}�~��xXW��2��|`�Ӊ<�,	��+�*��N��X��Jf#�R[;�w�/ӝ�Q��
S������%�&�M9�~qrc���0�+�M���P���x
�pu:u�lm-(��C���8p�K)���C<�X�mN�Z��
�y���wo��qK@�^OG�2ʔԗ���Xc�r/��)�2c���d���H�+䮸-���8�F�*���|�5<�t�կ�(�կ��!ܿj�SX,���q�P#�˿�[u��|��V��[��9��|��y���8;5�CX:L&�-��wY[�ͫ^�|�(��ONq���9۠�S����Ql$9����^g��_��op<.e}��*��Y��o��x��1��޷�@p��A���O�
�T'Z����O]
�T'��7��Tg�
۰�p�����T�a��m����c�oŊ��Ҹcl�̷�a+_e�K;�,n\�����
���]�FO�8���w;�%r�5�\�����?�;�2�B��'�ᚚc���Ѭ��c~�N�������W�J���裑��:��>��fU<wt`���yk�S��~�����E͚��s�y+1�r5��m����6�w�Bs���<�4����Z�]�0��N�v�7�'u�;�y�~��c��:.��m���M���,��)[q�ĭ�Dq��S7sq�~�[����
����؎�u+�ȶE�/k�/�֭�*�
�,�n���>�߷/]�m�����~�<�}�G���sj
�c��ۇ���K>��FS���n$~�
��|�ԭ ��C]�?5߁?u+�{�i�Z����8�|5z�у㴹�ڑ�UOXQ��K �uO����)ڗT�t�
�P���+i����[���H��1����6=��[��x�0oI�ڇ/4�w����}XI����ڰ��+��>Z#�XA�o��ܶOo�+�V3�S�
� 8���� .j��8���{������k[#˱wn$~���A7b���A���o%^c�nfy��Z÷����:k
�v���0�,�ޫ:�����ؘ�F�v7p��ɵ�i�z�Fqs[�w�ǘCl�1���B���	D�~0�2t�;�ƸB�x<��k��]���H7�c�5��[��\o��1R��X����̷b�<�i��6�|Gm�[��E�[^�Y
�Y�\?��Qk[?&�ζ�ѻC�F��g�֘�p��&n�e0/�-�1�Nc�q}k<ޛX>1�@ G�����ƛ�?ݤ�q�0gy�c�������`�q�V�]y��߽�|H��݁�s-8��
�
\���<�b��F�Q뾃Η+�h>��K`�9
XN��&�����~eдlS,��tn"��mMˎ�'�F��ǩ/��h��x����5���r'��;� ��6�{n%�u��]{�k#��W���n�7sQ��Z�Q8��NңIǺ�B�����+�qhĦ�.N�ڣ�|���pLv��O�O�"�R}��d~ԛ\{RNNŇ#��H���%[�^Q='NDl�P���p$���A�t��tŧ�9Kz]�����w|&�%R�B�S/U�2��5��1�|N��@�B�[8�m2��Ec�_�1c}1�5�n&��]��y��p���L,��<Ҡ��1����Vm{�ŝ�7��ԢJ�\�t�M����B�%��~Uz�&�P�8�������Ǻ*=g�^x�;�W��"G�wa5z�&�H�8�Es��@<�!���*s1�¢���)�k��ٽk=7;M]�m�o�m���m6-h4+�m��{�yx�RYm~Ӥ烲'�U酛�|����q�ߤ����Y�^�I��7{zj������[������
^��#��
���sw��-�#$��X�X? Vŧ
����xo?���ѱ�Y��mMz7��+��o4qIn~#��:�<vM�D�dt�����#
�?���B[�hV��^p�*V�FW�`���Ř�aUz�&��&D/yz/4酉�0=۪�Mz�s��q�ڤ!>��wa5z�&��.�߅�кh�g�u���?���w��Q��\'-�^'��K	����曻��?��
��r���sE�,!�q7Os�/����ˮ��na�#��{�o�r5����[�x5��ks��|K
�?��CĊ��Ė���!}�:�ϻ�I�f8N����2o4�i�_�+�H�\�_�s����+�@y�/8�Z��ë�xmg���5L/�*=a����ǡ�B�^��t�J�٤Ǯ��q�ڤ�z�X�Z�^�I�]ۑ�����0���5�4^ۍ��k}cVZk�����s�k��X��8B`�hG�*��#�:l���p�9:�B��)���B�ε\���
:�5�4�`u�5���`i%�5G�:.��}j��6�,&#G������ֶf�{��v�=��&�)��0ԉ�~hiii`�bz?C5���2z��&���	�G�
��7�XI7��?���RF<N��ܳv��2g�q!$�񝸱t�%����V�y�I�Z�*<��tnk�i�)����F�
��S��>n����6�,~&G�1Wdd�\a�L�O��"�s�\?������Z�����%.����v�
���*q�{�]CAǚdi�YZX����ּ�f���֭h�M�����!j���\G�cu��Ľ��7i�o�@R#@`�K�n�l�HA.�~P�\�>g���k~N�V����������?���K8�>���0?ކ�qH�5`"�?e��S��_���`�
�z�bX�U5��SO<�T|����+�W^�![�W���N:�ēX9�?�0)Ļ��A6��>~���U�2>�de�O[ϧۚ1�j���p{䄡"��Y���,%c%���V�-E9G�Π�����'�$I��h'�p��	Λ�~��\r1���Ϙ@�����΂�#�\*)��<��E�I��&�m���߸�RL�u�O/�C̥��<����nB���d]3�����+��2���.�	�6uM� �	]N��`�D)�6>�L�r�8��7���ݓ=��?HCHė����,K"A��ib;q���w�p�L��ad�&���]��^�Ql�C~���Sp]k��=�m��Z�9��>�� T�`����֘��Xb���0�����������}p�u���5���N5��ٟ[҂������`����?A�fҊ?���	�f;ss�2,-�u�m�0��ڎx ��0^'!�
\�(���X@��I����5����@蝇z��*^~Y��2��и�����	��@�
�>�л�F�ˋw�x���1P'���>��A�[�ڏ<��#Py��3���H~p
��
ý�#G\�jQ�������qE�ة%_M�$����hr�N
?��Oz�^��?�~�k|}Cn�p���7���x��&�ɜ�r$�,���.�|	�����JR,��������CB��!
��c������#�K{��bd���D؟������ <ΪR)ѯ��l�Fu��$���K�;��Pt,����5�@��-��*D�r	��Nu������u��&�3��tf�2�]K��(��_Ap%8��uG[E����Ǔ��c�9pB���F���=*#\������DpD	��^�E3�ڶe41��Yp��.w��ʑV��c�s�mn�3�}�%j6G����8p�7��	�=���`�МO�Ey��]��d��Yp��5�^k!"P
4U�N�4�,h�A^sd�F�2�V��L

tĊ
�^8��P���x<�H���<Y�5��̶������+���>R��ڜ9g -��Θ�+�t�����˥Ѻ�&�V�}TgU*�:�M�aך�ɩܜ��a��=���[���h��|;OG�W�3��F�5VE��{(GB��Ht<>�uۈ+�3��;]yp��m�8��m>o�(�6���9j2G-f8!QW̿�up(��~n���:�G��.�-��	��<�Z�H��F�*�H�ʪ��H�|��^�*��	� 1�A�V��6
���kׂ�7Y�QUԀ�<��4���R���3�xR]��	KpT�~�d9ɖ`B�`p�{�����iW�-�C��Qk$��Ɣo�d�j���pD�f�S��hGĢ(�aM��bξ���GQM5�Z�0:�"���1�$w���E����(�։,���M����r$ԧ��b=��`(�b��!��m8=����8Ln���i�'*v��)3�����x��"P2���[����]��f �;���|�q=��G\������#Y�����o:����\f���A��R��.V(q߂�=g�jcoy8V��⼾����|��'�jƢS۷B>��+��9�3��y����bs�g7�J=pKY"��ނ|��f8N��w�9�{��-��`��k�|.i�:�����9�3>�@l.���\��es�˭�x�]^���΂ٜU���}�ך���o�@��q�� �+�z����X8:ۺmԝs�sn'��u>���X;n�z����r�sogO43�r.]N
ȏN‹+�%QM�p"�i�Vi��sR)O�(M�8W�C������H{�*�r���cgZ�u��y��c(�|�n|�ʢ��+2�n�q�+�_�ֵ
��x6r�=&��E"�("�l��M�"�����s�4s�M�O-1�0�]�*�QDj�
p�|��VB��R�(��N��tEa���y6�ce�.[��]xM�7vQ�	��9�=hO�M�w�]Sag�a�tq�֫�&�F}آ6��l��U4�s�LJ���h��OL��p(�̺\��x�U��y|1����e2�|6�fu��S>c-d��P���IR���u���B�Q׀+���34�o�|��v�}�P��P?PFJ���'�.�AN/	��=_��쥡��Wq&lҺB�D���QYpt4(�@-�]���!E��ط�`k	����8��l���U\���'����D����7�6\rC=c��/rC=������;���1��{|���X���M���t~��n��snSƟ����Jſ��R*�!����#�\o�jy�ڽ�.:Dx��ӡ��N��Ệ�1D�7WR�A��(�Z��.�JEB�1�48-.�F ��d�l��U,oa4�g�J������y����#!R��+��^c,�_��9a�c�r��I��kJ�3��H��ph�c�b�K����37�%�IЏ���� ��<���h����i�v�xA�1K�<��~B/���c)��3�h��o _��2��,>�~Ws;����j2�N�w:N.VN�_�w����x��M��5�g�7A��1�;�<��ş+ G�������ޢ'5K�Gu����n����#_����(�#�Pd䎠����*t��G�w	�BW�x�"0�?�4�Im^�D4��ւ1l9+7z��$�E"WE"���d��/!<��f>�BN��O�e<Y���F��C��Z�md��
�Ó��Aj�y��d���3{�u�#L���h<8�*<JT�T,�+ȺT����f}z��M�^�������"YT����J�PG	�e���0�Uﯨ	J��y��%&�"��w�e]x�9��m�$;����9�؊���x��_���%2Y$����љ������X����ɫ�nS���JW\�DD����i�:��I�p�L���ר�U�ˆ���+�ds�!�����q��4|��Tj�y�'_
O�Pq{��Y�?'{¦�V����k.�/���P�hO�Ao���;���Ե���� �c�[�_Z�O(/%Pe�X4h��({(D�uT��HDAl�[í\���Z�d^[
\�>�
§���M�F�\����I;��sc��������P�MĜ!_Q�S��l9Hgu���4;�+f��p����H8��N���E�
ṇl�;�AQp��A��|v�%�Ҋ	Vj4���2�ćn7n��|�~k�!Fd��%�����'�"q���@w�"��BR���"�Ԇ�\q�n��i!(�`�vY�n\D
Α�I˺Y�K�Z���ۑm�x'�9�d�-O�	\Μ�~�˝�T�0��}<�m	FX^��`2-���R�uz��h��|�W:�TQcu��{|p����/gJɐ*�y��
8�������ٖ��M�6�A߆1�����a�\�^�[m6�� �f�N(�GZ�1d��L��˸�e��(�5�a琁�X�n��s��qr*��
�&�e<ےB���%w�t�2��B��x�J�ΊҠ��pɉ�M���{x�Ո_�B��M����OM�m��G�L�Y]��[��T:��zi�A#K��
�
�>ܨ#O	]���<BUf�8 �$��C��?c�K�r�\R���v���2����}��=��w���T���6�Gw(p�΍�����|�@U�C���Ev�į�(�N��H�;e�h��+��˲�oʁg��@97��fr�����۝G_�nYC�(�$��`Kz.�^��_���=�^����/B-�����8��eP¤+ր9l��I��JBB��K��$�J�I
.!�R��:��"�U򨞡�@C	�.�hx:��	���n 9�KV?����N�5�*VRޒɨ̸mNg4��#MJ�g^���ح!�F�Vk�R_40�J�Z�Ӌe�@(�XQ�N~���С�"T=��H�j�B'S�)T�,�;�!��b�Y���	#�nOn��p�\G~�/I����O,���
W*)
"���$T��#���`o�G@�f~���I"���C"��D��6�RK�]ba�R��p���5�
�|�Fҩy;�����S�'{���
�N��!�f�c����\0��t9��x���l�����|A��P���P	y"�G�����G�uD�b����C����'L��~�[�tN����}�=�]p�*�Ѱ�K��F6
{����r8�v�\?0��D�HT��7Y��k̟H�*��^U��,:�3�q���gwD4f�C��xa�F����'M�P�7��U�T�z$hL��5�痱��N.�}���t���Ulm#�yn�>�p�Y�K+\W\�.�/ຊ ����&����R�p5�m��̺xٽ]�]�6�K[Q���H:>��N�9��y���98I���C������@���z��Ɯ�?pտ_vߖ^G��

S��p-��wx���!x�z�܆�>�D�
tA٢�~2]�d���@��!��C�{��i�)KPu��.T�aW~Yu��̝dQ�x�������*�R!O�����᪝p�Z+�������l��,�s��r�������8�z�3 v��KIT�)�m�,��<$`!ϙ���/�ɗK�E;���	�\��'Q�'�R��]�p��ZJ�D"-�u�_0�/��d>��G�V�h���]����Հ��������
l�w����.����4u�|yp�E$^|�N��^����"�;����3�Dc+�]C!�(#B�D£M+�C�����{��;<��z�����4�)�c���h�vbķ�KI>�q��LR��zy<gWA$
b4
5`�4.���s@XN�]�&-��[ʶ�mu	�䣁�_��f��!h(���r_>������S�pF�]	�=r���79#��!���՚�A�<6���f�c"�1t�lv�nL������ߟ4:3k҆�P��x���eww�q�6�sM�J`�ڎ�.*��tj�Gjv�!*����*�Sjq���DY&N
D>��:Ӄ��1V�7���?Q־L!\�4�ݾ`�(�'i��i��@�2��>8d����"����l~�S`�	��a�2ުo�DR�Ψ�z�D-�I�z��+��b���i1��9;����]E")AQB!OJ$�De������m�k��� �<�����t���R���LB�H;�#�Dȣ|�HL�=�$����+#����WU�;�������A����ծ�p_���[�xB	%�|,���#�9��_eD�z]�3�7�>8;���<�?bT5Cx"%�SbJe�2�|Z�CY��׷�5��o}����H>�\�\	N���a[�f@�{��8o�ў��X��xxp��v�ZW����:;�n�
a&h"U�R�ņ��mv�!M�L	� ��R�e\�n��?�ĺ�4A�6���+?���f=�F�6���̲���GF�����Ґ>���O�љ�ZA�%zwP#�11����%�Q����!|�+�)_�ڕ��0�$u`���Z�6��V-��+퀷����jl�!6���R���gM�_{������R��U�o���]z���
!���n�A[��\[��*s��J�Z�-��68
m���xN��Fp�鵑��L�Mf��/��]^A>^4�]�jPΎ�����Pc�>��*�D|���/�,���g�g�bI�)&� �@F�F��iN�ƍ�|ؤ~�(�2�x`{#�v��]}��|�E�>ՈJ�)��T�_<O�,�z0��E�q� �{Vn.Uv�rm�Z�wy�`O�cYo��o��,��d4�.�1u-x�$.�j�(Ӊ}�oQN��.�T����̦���H��%H�Ƅ�BRZ�"�l��;�Ҧ��a²À�
c�O!��P�i����<m0�H
�R�x��0����T�<	�����*��JZ���k���X#i�w�����g��֤�q$�]�m��wUMr�c�/�k���3��3��oa|��;b̈́�T�m҄�v�ND�L0\�j�]���·=%P���S��&=���VXW`=x�P�W����TDQ| $���+��X�����g4����L��\������ȝ蛫��>��7���x-�3m��o�cRm;�b��

;�)��t���OF��Ha л�eڝEz��X� ��,~�ދ�N(���L)��^wj>ʺ���&Z��j^�
i�C�����(6��E!�8��g�ʚ4��NI= ��ta=�^h-Ҩ�����=��>д��E���ד���S�܌nj00���ն&ש=c^KO���v�+�5�hd4�k4��Z�=fd��1�9[�Y����a�;cCUY�[��K�	wE�����Ư���D�i9�z��ڦv�I-�����W�@��h������Px(mI�χi�$:�3[�5Ȝ����tl
�}}��W��l�c�p��:�T<^�6
�&��6�9�M��KT�-�̃l{�s�|}�j�=�ZM�3�m�]u�njg��ؙ�`l0J�~0�+�=}���y�f�u�k�)ևq/��		T
*Yȼ�1�<�5���/���nFkz��j�!!;"D5���d������|~��;J��|X�<��:���
'$'��1!�3��_p(O®�|��A�e�Kn���L�^[�L.ъ
��=�ZC��=��`ƚ���1��^WN���1� �F@��u�7YR��w"P�э�f�?B�����|>���X��>irr��!�X�;JL����j�Z*
=������>��j��-��\|�ZC>��t��a��S�t9:<�W���[���4�|j&���2���I���b�(�b�E2a�;|Z�o���O�7|�'�?y��}�ff)f&�=�F��"�cj�+Ee�O4J��֋�'��R�ʼn��y�nR��~�ɁGq|�[�	�LZC�+6��@��l���[�F�b�LP�浟F���n���8��γh�K��d8c%w�p�'NmJ
�)��$�vͤƒ)�=3��iрrpC��c����IZ���ު���C^pS��	
��R�T���h����.�c�M;'�F����7��[��|�D�O�'�p\�R��%"�@,"����"�D*�J�|���å�)�U4�ح���/�Ik=RH��˼S�`����H�������~�oR���
���"U�l�*(�M�:*���\�}�%z̬�M�
��M&��W��
�Ų9f�����٢殰�ӡ���ݡA�b,d�Z��i��&k؄�V��)2@x��C*㗱��́+}��9��FO�M׭i�dvM��*�$]C���nr{�o�x�;fYg.�/O�3e�>������G�Q��!����(���\�k��#��{|�Bexa�/2�G>��=i�;v���C5���,0�{�}��B�R�"L��m:
߅������o��'����y�P ���3s4^�4Ą�^>*�T�m+7т����̽������;�Oѥcd���-]	�2Ԓr `�Ǝ��^J[����C��z�ϰ�,�{���;�w_z��x��=���h5�J�}��pl�ϓ���د��ͱ cx,���y<A���=�i��X��J���5{�����+I�1����6WB��3�K�-�5!��RJE�h")�h������G]�����	���=�k��#A�� n+�sJ,���]
����y
�s%P�; �~���0����@������'�w��	�w��}㤗��������Qb�I�%A�y.5T�ѱ���������W_�w3w�if��
�[|�9Σx�h�#�@H�Ā[q^�+KIpY9ngf��^<���
�
�IG<��	X��J���`���{�J{ǂ���k���dz��p��$ҳ�v^bz7\*S���n:�g2���_�
E�K^_e�ۏ���a��^.�;W}cOBN�n9��ά�E&���'mu�\����t$6��!���9�Y'�}� �]Ru�p����u�Z�<m��po{_a�w��/�]�3M̲]�f{��u�{���>+��
��D�R(̠$cWǏ[][{�3�qW1x��'�����:r��jI��?Dc�w8�.�9��R��#[s���E�V��5�U�%,�l�=mޖ��1�
u��3>�)�6�=����RCy:V�N�ֆs;��ۼ�^�EA���L��I�}�@ W,��d
W>J{�������PyY�K$�|���Z����KπW��c��uZ��x�	�ZB.�	J��C��
�
��XXS����1������K�XY|jw����	�b���<�e^p�,$
7���OU�ͽw��F�����ÿ�HS	�j>)��J��э���΄���$�y@��O>㧃��C�
�j��#�>��o�s�/�|R�
�fK�W	y���aޡ�!m��У��>���o~>x���~����3�1�կ��q�AZNHKD���	� d��d�
}o�wex;�s�f���c`#�ׇ6.�;�#1�$���g
�ym���O1�g���2Ɵ���Pݮ[:����(P����$"�T"RP$k�c�18�	:(ѥϻ(]�����ŗ�5�^~���mC�ե$�MR��G�X��������L#o�k�g/~ۑ�KG)ٶ	J%�7�X2)U���]@����D��7CN�$"�ԜS�epv�-tn���[���ء����s��EZcO��m�xz�%�h2����.�]s1��r5vٖ��&�$o�㛆Θ����\�5�uxU# �\�8�_��K���s\�_%�8��~)�մ���Zz�䑏����t�lDPD�
���&����;�����V§��*�u�t�6^�Y���jz����p�8$8�T.mJ�G3�1�r���DϺ��5_]�)uw���16�[�y�CF���p�,2�2
�6ձQ@�s'/���<��z0��)�<�Ol)=�Mw�SQg-?95Y��Y���$��H�;�UX�6�Wm�u��X4��2�X��uE�D[]OT[w�A��(�d�(��U2��j�z�B��H$��@�Y�C� uh�ێ �@y�+�x/�����ے��T���S��D�C؆��
��[�֘տ
�c)צs�~�pf��oj��ʚ��9�-��A$L�R#�l���J����g��4�Ӧ�{rD[�=�/�����<�Y8/��w�~���;��b��5�ĖG:6����n
Y�� ֪ɧG����
f���f-N4Wktq�O����Q�a�)a�(
q�\P׈�u�K����� ��#Z�f���_E�'�f���skk�j}���eM.M<(���[������<�0�L+G����	���V5E�Һ�$��%�!b��j�v�8�n��4��d;p3�j�=�-�Zwwq��Vr��ψ='V��~T�_ڼ~�
J�K[֭�����{Ƌ՚���F�����`��M���.��)�^`VJ=bi��#S~�F'p�am���l�z�vⱢ֙�:�yr?nT�ϧ��t�ij��^�,���`o��,�Z��� �p�o`,B��v	OPWs�BӀ=�"ԣ���d_����ڕ����^�J
ML]9.8e7�~���b��JO��gp��!�\��!l�bd��@P��N��1V}�E{Ϻ�嫸��?7�(�^�~-�&�8�P�k�c�h����qi��2o���^��_f��q���	ψ2ю�- cm��ў�:~^��8��G�% 2BY]A�D;|[f�0.=Sv����ȹ��`"Mύb1����
�ͮ��(F���IJ�e�jU%4P�
DC4(�6<tz�76�˯K$��s�1��$ƙ;�e}�}	Y75��a
 RN���k-]f���c�����ic���i��I[a6_��[�=k��sy�����������ھ���2؛9y>[ؼ7�~wo�����"����#嫨���C1�4g�b�Dh��j&+~�9rX�'u�\�K�9(�Y4���@�b8JH7e^EU��@	���C8(
p1Tw�B%t���k�"�Z��Ϊb_y�glW*�?�L�d\]�1���=Ᾰ�p'uQa0��ޒώ��*[�P���%��&��i�"���x���ݡ��V��<d�r3�B�A���'VDa2=_H�&
'��;ό�G�۴	���d��>g)��)�����/-���J���ĽkfCw���3��	�&�p̴pM�\F(c
(�TL���מ�ʘ(8��|.58�|�60���ǘ\�c`�?�㓐��Ei����ctd�<d��r�76����reqˮ��t">��ϙ+3`�y1m�����W=C2^r�z��tj<��+�KVG�	��YL���Xk_�xZ�E\�i�R1�Y�p�3my��<�噍d���Zl�G��P,l�GmgO�V���G��i�=�hz�*Ξ��O�����m��ˆ�g���K�k��'�b�`c%8nJ~�/l����(�\��|a�<\^�A�hz���"hbe��@�Wѓ�$�9��ey�8T�#\�N
3�����1�1x����H�ۑs*��t���:�egd�vdЯs$1�'��A�p����{[Ol4-�Gz<с���z��<;��:�@ܓ�|5p�?o������]�"�+捂�&��چ[�ˍv6>������VT�i3DlgM���O�]�Ӗ�3���zz�Y���h_:P��g�^:�ƹ4���4����1pηF@��Ņ�<l�z~��P�קq1�8��>��r���3�F�_����8�>��a�y��u�������\�D�7
_��夿�wE{N������t��%�j�oB����콍�t�&�G�%��}�?��� m�߷r�!�gS�����HG1�ù���GW)�8]�/����a�v�9F<�Z���� �7�Uҗ壿���u7����L:���߇�J��l��;�n��*��IGo��p:s�~@:��5�\t8P��a;6Y�2��T��(碿����ܐ���E?�#�}�Sع���HE�[�����Lt����
4��?���Ї׻��
�/@�	����(r�19�mcn����Y�+�6D�1pv,��.u�l�0_�`+�訵1Ь���0Ɩ��+�[4��F���0}6>
���m���i���
�'C6���[ �v�8�fK;�11bni3[Wh��J]���TWh|y]�!����o��B�^W�
�ƹ�+�

�_�+�hu��fG��X���7u���^x�*<n�O]!���2B&�6��P���I[͍�P]����BՏRW�3/�Dw�"E�#��p�2��7��m���O��r��o�]��G�[���8�,�ښh���X:��G��9^Iك~g����H�ʤJ$w�x"���� �Y�ZA~/5�y�e�𗻟"m���촍���#~G�Bz���ĂV�ۏ��,�Sy�j�^���~_ *�xc����l� �����! 4�
�Pi���
�h獐�
�%�i���nG�X_�R����ʖ?���F+����Q��)aŐg��"qQ O�ry[�{����P�,�Ѱ�u
[O�b>��c|�a�VT�,\KQ�$[$����~��^ξI,$�iýw7�pBA�ʭ[�|�p�at]��"փO�y��'z}7�y��^�N!/1�	"���In ^P	���X�09M��
���y�\��w��ϨF<��%�M=ML�9���W��\�Í��
�)9|���_�P��%�^ZZz�\f(!z?�2������|�D���7�!��2��CE�]�D�8���9r��7��%y�Q���2����E�p��#��x��V�nG�36��
l",P�+���G,$�"XG#�)���]�S���TU{�H��(�|�,��*�(�|B��|@9u��x&Ġ�bk�oW�ǹ�*"��*�E�_J�F�E�[�E�
��H���������"}������Gt��I�/ӝ���^�O�D����)ҝ���B�i��U���F�M���w�D��\z$��+���Q�E�Z��n��"�s��:���H_�/�G�#���D�2��"�@�����B��g���ߘ�3ҋ�y��H/Q��M���D��H_�ͥ����j��)�!y�Ak����gXQx�����O�o�V�ئ
�!�,9|߆���Ϡ��@k�� g�u���c-H;
�
�'x�X�_�6�!;b4�3x������:z����&�
�8���Z<��J�خ��X'n�Q)�\Z� I��3��c��P9eOT*vL�ž)��,�ʴa�;�3�q�UVA?�&��!�w�>8���i-+�қ�������ݏV��fb�pt���9G�!�!�� z��Ӧl���H4g^��/�=���k�x���s6�P} 
�³9���NH�L�Hڗ�Ğ�^�%�B�B�`�HS�+T�1���b�#g���{ÕVA���̩�'af�nW<�ǹ�I�tšIQuF�T�x-s��7��Z�
�;�)�ZhzRs=�J|��p?�3C_�,
�8t��~;)wv𧈝}���*��T�- ���0-4c�{2�����FR�)G�`�)��L�zoFô/��KD��5q73v㜴��g���O��������c��TߥL�����4���q���7�Z�I���!,(�x��f*𥜃��|Jc��<+�і=v�� �p��9�o�}�P���z�)D��e�=�5�Hɨ<#sLM&N�U�p܂��L��������K�T�썏ّю��(�S�)82<
�ó��{��\5}�;�nз��s�^q��M�U�=Dj�ѕ|fۓX�L�B�\eǟ��[�y��ץ�D����~��Ƥ�E���
��̜2r��,W�u!�*�]��cS���H!�o�z/2D+A��T���
¹���q��x��.PY]h`��ђjW��
��Ԍ���T��UN\L�
��a̡��DQ�����b�Ҧ���U���5x�FQ&K��Z�Q��+��Z�eb�$09x��1h0�6��=ܑ�х+�m�D��Hy�wd�+�R{'
eV2k�r��sjR�U��PZ��J@�brw��E��ofF��!�j����׎c�5<����rku�͕�*e#s��L�+׬�P��l��&�iVa�OU�N�6J��Y��G���9`c�8U��.vI�{n:a���}�S�w�4�I2{�Z�u��o�M�};�O�}x��wa�v��)�A3sq��<z�!ܭ�ɰ�]h�������D�`!׉*��BZ��8(U�0�6]1�'���{��EYn�\�CV��;�O��["�
�K�z�lc�Ճ�]�on\��o?x�m�xG��2�!���{�XҞ,��%�!�BdY��DT&���{��{���������x�ٻ�yg��4+AB���P���?kL�aVR�h����R#5Q3
������4��ehYZ�F���H+�ʴ
�J����Ik�ڴ�K���mH�ƴ	����)�P�Ώ�!�b�JqJ�f�9mA[�V�5mCIr(Eir)C�h<M���-M��h2M��i�J�h:�ю4�v��4�v�]hWڍf��e�.���`��N���:�����r�����H'r��hJ�у�7�9t�L?�/t]M�ӣt
�S���z���=A��S�4=C�S'�H���t-u�wt<�B/���M_��t8ͥ͡^�"�G%ڃ�Q�*T�*��|���B�=ioڋn��i_ڇ����+����&n�a<����7��#yi��пL�,/ǣ�yy^�W�xe^�W��xu^����7����ux]^���
xCވ7�Mx��M����?�U��a�c��qN�f�9o�[�V�5o�I��>d�S�f�3<�������$ގ'�ޞ���y���x:��<�w�<�����#��w�]xWލg���v�q繓���<��r�r�K<���=����'�)������y!��{�޼���|��|ʇ��|�G��|����|��'��|
�ʧ��|��g��|����|_���|	_ʗ��|_�W��|
_���|��7��|�ʷ��|��w������|��Л��M����.?���?ʏ��?�O��?������/��
�ʯ����o��t&����{�>��G�1Ÿ�g�9�_�W�5���w�=��?�O�3�¿�o�;���_�7�������X2DB� C�Q��Y��pYJF�HYZF�2��,'�eyYAV��deYEV��duYC֔�dmYG֕�d}�@6��dc�D��X�TZ$,��[b�*qI�f��l![�V��l#Iq$%iq%#�d�L����L��d�L��e�*�d��Ɏ2Cv��2Kv�]dW�Mf�v�I��S��[
2G�J��JQJ2O���T�*5��@�e��){�޲��+��r�(�r�*���r�)G��r�+���r��('��r��*���r��)g��r��+��r�\(��r�\*���r�\)W��r�\+��r��(7��r��*���r��)w��r��+���<(���<*����<)O���<+����(/���*����)o���+���|(���|*����|)_���|+���(?���*����)���[��fU�t���A�j�6i��Ẕ�Б����etY]NG�򺂮�+�ʺ�����꺆��k�ں������n��ƺ��ѱ���hX#U��ƴU���ts�B�ԭtk�F��hJ��jF��x��u[����d����:U��tm�u��3u�论����5����k�vi�t����բ�t��e�hUkڧ�u�@7j?�B��Ct�L��JW�#�P��{�^�K�ҽu�W���=P҃�=T��=R�ң�W=F����x=AOԓ�d=EO���t=C�Գ�l=G����|:J/��"�X/�K�2��N�+�J:�N�o�*��.��,������d�]��k�>�_����Qoқ��Uo���S�һ��W���}P҇�}T��	}R�ҧ�}V���}Q_җ�}U_��
}S�ҷ�}W����P?ҏ��T?���R�ү��V����Qҟ��U���S�ҿ���"�-�Բ�!V�j��Z�V��l
��[KY#�����(kkYk9k���������������������������������������������5�kmj�Xa+bE-cMn�4IRSj�BKK��ԉ@�P�hH�fs�R�!h(�^��CY_���R1?�!hs*W(�j��=�͹�vS��T��r�b�)��J粞ˎ@�u��j�`@7�}ir;�g6�#h�
<�}i7 ��A�[�k�//�p$�6�0�{�m�oϖ��z�P-�t�C_& ���_l"-*&JaN���9�� �h�:lnW9�/�d��\hR6W��C=�`�M�&K��5����SoB��Y���
��&������J�j�4�;�n�K�Ů�)H����|>��V�ʖk�=�Zuxi`/45 ��m�f����r ӂ�_��
X�����QŢ���j��t�U��<�Z�ڐA
��|�V.��Լvx������ k�3�8�=s�ݿ��
2\�KӬ�[qᠭ���]*�����ok^�O(�b
k�j�ơ	h���J�����Kp��(�2a(V;
�2�
2Hz+��̆�h6<�)��l�;�K�m�g���F�Q������&�I�MA�P�	4~�0�a����?~�0�a�#�G�O�D���?
~��E
��:�� ?�a'D�"�	�H*��U��s��F��x�/�i�ߞW4m�Ƈw�Js�����P���E��Q�y4������N"@F���C���X�h4xP��%�ģX �
g��6���3H�`��j����3�pI$iZq�P$m���7H�`�l8�
g��6���3�p�`Ù0�a�����U�D��z��Xw�u7Xw�`�lp�
n�|L|lx��e��
6�����hP	
^?
~|�A?
~�(�|�߀o�G�4|�߀o�7��
�|�
�
�
�
�
�
>ʥ������������������G�41�b��V�o�V�ӊx��8xq����K ��M����'�o�&�o�&�O��?~��8��$�I��'�O��?	~||��$�I��'Ӎm�sS�P�7�Y#p�;Q����%��\�
���AL8�19��AL(���E�u�E��(��$�5I��������xaPT��AQ1(*&~
��)���O��?
~�4�i���O��?
~�4�i�]�]�]�]�]�]�]�]�]�]�qp288|||��8`�L���3�g�π�?~���3�g��d�٨A6j���b��ب)6j��a�Fب6j��a�FبvP�nPC뚀��i���&�ՆƠ�P�c~P���b~�UW
ޢ�����(�G1>�u�B����|����k�A�|���m�o�g�g#�ؘoc~�c����o��o��o��o����׊�ߊ�Z���t�Ȍ���|_gt��|�Pi���
���?�	ğ@�	ę��$�M"�$�'1>�|��7�|��D�IğD�I�o�'�r�9�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�O��?~
��)�S�O��?~
��)�S�O��?
~�4�i���O��?
~�4�i�������������������g�τC3�������=z��y�q��B��E�P'�pKSg��V�wԿb��-�_U��ˊ��������V[�c^<E�q��8���/q��'��J=�bo���f�VO��
n%c�y�J�*�	��T��Z��+i���X�� 18`:����T]���5�\ɗ�
�|o�<7��5�+�Bo��V0lc�m�9�]���a��rv���з�V����Ϋ��3���~^�k���շ7����;��f��G+���c+��Dh\]����؞R�g��mCY�z8�H�Óhh�'&���ÓX��Ik��I<4?���k���Uw��ڽ&�5^���N���n�)x����5=^��5E�)y�<���k�^S��Լ��k�{�����f�	��9㦢�,ُ����i�я/�O&����%�׏F�����Gc������A�Ē};=�~rPP��̒}3(^3(3�o�MjP?��Π�LZOg�z�����N��|�4��3Ty<��zC��n4t�je_�/�w�RX���#���%o@��;h�Uj핡�G��|zFS��3}���y��y��q�w���}�o���b��g����0<3`����y\��̀����3��޲��
��`xf�,���������3<k�|�P��>^�G���%�7���ٞj�����\��{l.[ɇ��r��j�Г�oz����R`w�+uDG�\w1��o��˗��\��=���_x��2�N���#�G����Ѧ���?z�!���x��=�`Dg��А�G �N
c�`-���o���m�d�@$�\�՞ClA�9۾�A5j�t��ީ�Z�V�/�`�q���
D�V2�\�0g�=�9r��3���{�>��iSxڭ�{P�U����]D��+��
��&j (����E�ZVb}��ӤcM�86�8T�8f�����L󑩩��2++_�ԌL:�ً�R�D�;��{��=�=�[ ��Yr�KNu��=�����^�ųPQ
Y l[�
6�z�!�\#hM 
���A44���<���d8`HҠ�Xл�`
�Hr��j�jF6�Y�c����k�z��!�W�����r@q���^���Q�X��Y<��Hqa����Ե�R���j�֩Fl�jĆU#6��������L�Rw��
W��(7�����A��	��S��F;da��;)[x&�=�F'�$�.L��	]�L�a��\�'f{q��w��}y����w�K>_\<.`&�Bf\�Lĥ̎X��k��q�nbv�m>_|�b��~ߤ�><�T��ΐ!Y2���|�c�̴�#��sf�-���pa�����0Th�k
��5�������Q�.L����0Z��[	[��
c���	�va$@xa2̆y0r,�����8%p
�C�����
1�`v�$LE����d��s�e|�2\�p3��xO�i���9Ņ�7��~Ʉ�U�5_�"�쨖j�2K�ƒ�e-�k���-�����K��ZN�r��/j�X�2-��jh��S�Z&�wj�f�G����zf�u���?�����kY���Ҧ�lK�r��.-�j��h�g�����m��6}v�t-gi�߱�Пܴ�>�M�	m�Oi+m��>����v�����>�O� _�s�n�^��9H5�i8g�����2}C'�[:I����H?��t���Y:G��y:EG��.*��*�
R5T���j��*��ٟoj���|���mnϷ8��-:@G���t�n�0<=�'���@*G���I
�a$��|��cp�<�g���R����^�+x
o�M��\��n8���
UuT]�•]�S��ⷄ=�k��geB.����6q��#p���TWO�����O��
�V�B��|�P�f��n��sPf��+�I����������nqn�`
[�hUp��i[ש@��N9l�F�(�գ�lݠBep.#(���ɧ��Z���*��J�IO�Aq0hma~��+�KP����ski��5ZM[�p��m<��v܎x�v3ߣ��is�a�t�y��3�Q	�]�w�o�@N�\�����A:�a��0ʈ5z=�}��,rJ?6{����E�\�}��uc�Kx�W��j\Ǟw���\�9��� ������G@cՖW|C�a.Q��E����p�GK�h!�*��o�ʎ����_a�p�fU����۴Ң��wt��>��ByDU�ÿ̘�%>��F
S�3�'�q�H%���v�6
ΐE��Q�x�"U�gۃ]w���33���[ٲ�!��{�B����Lsm���B�(��S.�rWL�=��{�tɆ��/I
T�^�y�;M��H�*M<L͢��&��ۮ�3��4����
�{/U}���o�{�,��7(�m$�K�μ��^�\.g� g~E�prw���'v2�cӎ�Z�K쇬�Xk�s�{�Iַ�$;g$Z�
~N
��"��m�H�����)��yb���U�}��D+z��Y���J#E"�pч�^��s��;���a2;J�٢NJ~�Nn�oX��x�ԽxTչ���l �5����(*� 
�ZQꩭE��N���z�����rQk�9-UDEi�n��kI�Lr��L&3I&����}��;! (��=���|���ٗuy��{���0��ď��y�M���k�C��o-ƈN�*�&��o�n���k�ɯ<���b�+/�������ڋ�:�b��J����+�e�B}>��)�E����o�S�t�՟����t���ѭ�U����x�S��M�S����ޞ/�,�^���0費/˼�Ǘ�.4e���W��w�H�"����2H�5c����b�bÓ��?<W}1e���i�k#o�ws����:��qSǭ���fNH�P<�3'�N��$&
�tߤ���02�[ʈ��S�����7��M~{�����z01�1%�g�M��)��+��]3f�|J��T	�ߐ]��n�\~�>�o��l���=�3���5���X;���=��'����͘4�Eʤ�&O�0r�+��	+̈<�3d���g!癮Cr��y͘	�mx�ƒ�v<��������&����ְ؋?yq�l���b��'
�;��?�|��K���s��a�Is����/�1eҎ6�+��2��˛G���_�ֲ�WS�o_� e�M�RҾ�׾}�}3�>?y���o�a�UcU�G.��u��r���ET������T��5`�������|y͘�9~W=�~K7~��|���g=��e֎�}g/�P<;��N�m'
�i���	#ߘ�����&�À?ܧ����7����Ô?|�fω�o���
of�#'OKI�ϫt��6�7�>��#��Zu�j��#k�z��wT��_R��Z͛�Χ��%T{��
ə���K�Y��n���_۠ک�o����\�U�֜<�gq��f��3o�[��}0o��)�/�w��{���c�0�>���W�?���}K��ݿT���_����o��U/|>e���O�c���{�yɁ���o�?>�b����ˎ/~����VFVծ.Y�a���Z���FL�Z�{KX:��aq���	3S��ޒ�|���%ua��MCŏE��`����K��Ub�<%��,& �d�S�Z<�|��怹`����B��}w����m���.�3d�E��d�1� =�XYj����]����5�'e�1C��g+���H�e"�AT��`��r�+K����
Nj�%Y�#���"~�XV;�ٷ��U|�F��n�GV��d��"]����Ge�9����cna�6Yif�3��9|>
�d�,:�z�r��/�r�&1H֋�dP\'�b��#6�T�~�SDEc�l�f˩U�qH�0ܲը�^�)[�e���lq\*�p�b�z�<,[�fyf(C���U\��^����|1L�����~q��Ї��a���+O�ib"�=)��_����:����9`.��w��b����?�\��g�s��s�`�n�����>pD��ar?����u#eĸ�nc�`�̦��{�^G���p�@9�I ��}�b�AY�g�,ν���n$�F/���ы:��؏^��i������KbzQ�^ԡu�E6z�G/������F/��E6z�w��7}�aʎ���#u�H:R���#��H	:҄�ԙ�Dw3���ٞ��EWrEW��̧�q��'1�F+��7F�1�0�m�݀���<@K?��MA����a�T�O���|~B6��
�p#=,�� �+�]A�
zWл������+�?@~���"�	X�o_��`X�+�J��k�k�Z��g�F���̀V[�6�v�tʹd�]`7���r\���� 8DYs\6�2y���C��'���E�$(e��}*��Y��F��n�Y��M֋�E#���Ro4�Z�������L1�#���p#�	�n����N0����F�.�x4�[�l��!O#���r�Y|�
��cֲ��i��I���8ߝ����ȓ�r�n��ǹ��B���l�B�F��q��J�C�f�쀙I����=A�:� '`	َ5:�]?�	�J8^/������/�/��L�����|�G�3���#���}?����|&ruP~G%�b[5҅�Xa�I���`����	C`�A��&:j��&:j��&:j��9f-r���F��M�c�a�As��\an��f��#\;G6c��X���������,�|圫T�^P���4�F��7�-ؾ!z�+�;�8��c���7� BNENCN�^�R���s�\0��w�
�~9�R�,_�`%XŹV�5`-���U}��.د��a�>�ׇ���_��ó�Y��yyy�ߎ�� ��'���E�$���K6���آ;�Zm����a�6���}��a>l�g\��^�ׁa�*�v��Y6v�hb���6C�0�F>�9fr�,m_�ڶvʿ[�ž�ᳲ�6�rs�;��nl�g�9o�b诩lH6aC>lȇ
���A쨳���|�lG��p���/"�|I�p��2��o����}��|>ƹ���h��>�K��}��
��e�1s%��\'�����>b�t�]�'��C���zb��y�cK���~�����D ���r9Q�@��+�mA�hB�CȈ��VQ�헞$JP\zm�}xg��i�*�{���r	;N:m���4��'��/a�j�����6z�z[��`�;���N�b�KE]��+J	NR��ĭ>J�$f��7�z� ��0���B��@)��6�d�m�$EF��[���,ӑ�}��h�U2@IZ)I��H��DG)Q%�7sa�<�4��/(��=��m���;���H>'�(�-|�E
mQM[,%-!��+i�����ɯ�6<D�3"�G�=�y:��S���<y0O��!�x�Ϗp�l{9�m�!�����I"��`�ĉ*�x�y���s�<0�ޕ�@<D�ч���C��!����U{�^ŰW1�U{�^ŰW>�{��^��W�}t����&ʵ�m[�V�
�� ���`h�@(W�އ܏<�<�<�>�9����'�r�D �.�˃��`�|�.�ˇ��a�|"l�G���@<�^��˃���z�٬��ѕ|��z���I}d>ш&�'�D#1��>����*4�jYlA^���Z�P�uț8f����;U�#��Y���I�^�}"�'�W0i1L�&-&Z����;��sa�M��H�cl׬�6���aG,"���������؜�|���{A����c�l�e�V@4��7#à���iE5��o�H����O#%9� �2�`bם��e>l�[�;.�{7dwY�#��|���G^���(p+���y`�|��a����W�|1,�,_�/��a�|��8�u0��f�}6�
d�(�=~`x�<;Z
:>e�r�g �r
�C�9��)hGNA�~��x�|�'"������O�K�e`9��ؙEy�$�x�<<I�$ώ�<�SЎ���ƥf�a;��@��� �ﻐ�A�\h�A�Y`��������ɩ�$`�V�.�%T�D��!��}y��<x�<�/ї���c�ӛn��s
�ZP�6?�
��n��f�:���Q��n2��t��,@>��I����dՙpyu�%@F�GL�ä��%�x�ms�\0��we��%�`�V�J��I���_�$."�C�Ǹ��F����h�,��
vr�n$�d�72�t3�t��3��u4.�������f������9T<:	�u?X�<@����/z�Zї�T�QPY�u!K�E
�ˣ����
)�
���cf���0��O9~1�|�p�v�����T�g�3Ȣ5�h�,c$5��nc�*��Gi�LZ)SgN3�PZ&��ɲ�d���G�e�h�LZ&Sg+/�,e(-s��ɢe��2Gi���e2i�L�'D���zq
�������}�wQ���Nm���}�~��G)�ݬ<J�G	�S�}�p��G�Q�}�l%ˣdy��;%Rw��Q"ugJݕRw��(M��k���3N�D����y�UP"/%�L�S���f'�٩��Ŷ��љ��4;)�NJ����4;)�aJs��t�ˊ٦�dnYJiS�Ô�/�o����h_�>�84d<�p7� s(�)���n+A�rh�Jw���tG)]1�ˡt9�N��9J�R����(�;J�R�J�C��+�tG)]1�+�tŔ.����s��\+�t�7)]��)뭤t
�����R�0�KP�������(Y%%��d���l]�R�ZJ֕�UR�JJVI�*)Y%%��d�����u�d���������8q<s?�	���H��ָI\�a�fm7N���z�~�ms�\0��w��77<��4�#��8N��8N��)����Fx#B��:N��pF#%�S�8%�Sr7%w��pF#���� N
�A=5��nj�M[�U����k��L���]ρ��f#9� �lߣ������q3�Z����~�>d:��5=FM�Q�c��5=FM��9~;������#�
�j�ya�85>F�Q�&j��fR�&j}�Z7Q�&j�Dm�Q�c�5m���M%}SiN���`Pq�Hj��	�竻�aJ��aJ��aJ��Q�G�S�0%S��MP����n�
S�(�MP�%MP�0%MP�%M�?.��E�Ô8L���O�R'����k��b�Y�e�i�5��c�,��6o�`��S�-�l%�B�
�yu߷�ݠ����m<�HR�-���R��v�\%q�FΪ�r��8ʣ#�<��_uvhe�g��2�3{�d1
��O&�(&S�Z�UK�4Q�M�'�z�R/�]��9B�!z���i�w��&z���i�hq~�8?D/����Em����Dy6���!�cqp�6�Bo5�촉��D�l��T���o"�'�h�M��걅^S~�f�?��0,���q!�pm�K��s��B�e.1[���Bl�M����G����U��8+DXG\�H\�@\�#Dg<@w�ZQ�;D2���ԑ��W`mW�C�J��=mH����+�گ�c�!��7��I���P#.5�h~�#����U���|�jYo*<��؂�Ȗ��f�����f�f���|DP��+�II��qrȄx<�����yd���S\�U�Ui�u�x@d�]�9E�>�udNr.�'%ȑ�G	r�z�l��l\��6b܈��}���[�hp;�S�m�EƑ�߅?��y���3�~����04#��'%Уfc���ft��f�ftIݝ���$Ч�Ԍ>U�O�X�}��O1�)�>�Ч9@�jv����C�b����W>�*�I�,�:�c��X�D�b��^�8���?N�'���'��fz8nnRw"���2�i3���Q�e�f9��#��3U�@������cbC�s}߯�TI�kP��y��9z��p�@���V����,@���#�v�ϝa�.����7���~9g�&�\�mM�<#W�?����u���j͹�l��hf{T?�<�m���f�~��
c
�iP6W:B���<
�Шb�^�5aY�j��ǟ.�^��V1����]�^���ί�~�Š��:��'���f�|	Fɷ��`,���q`��>S�?d�C|~��`*�ENc�c��҉�E�lW5
�7[}��<�>�����oj/��-fb���b&���-fb��q���`!�,��P�/(�R�,_�`%XŵW�5`-X�=���q���b���o[�V�
�� �`�M�����/�k�C�G@D�\��/y��<��E�!�Q����"p��2P�>�V��BV#]H7҃����*}o���1BEaծD��@��A��,3�"�!������!��`p%�J6�]Nc�$��4�"�CGˮ��1n��Q�V0���F�1N���$p/�>�?I�̀��l<�|��?����L�=�s�%ZOc�v��o�_��q�;A1ps\
������A��-|�R�2���@��:�.�̑.�s7dw�t��s_�$��G^���(p+��d�1�cF�̀O3?G�$���e~���f��,��F���#����}�n;>���o��)ߗ�9y��8�	G��<���z�� 8h0�~�����zbQ?��&9I<��xt)��R�9Ye>O����o�|��`%x��ӟa���F�
#m�ܛ�g��N�/�4�On��`'���n�)��܃���>��!p��d��p�6v˵��'�>��BP�	���s�
P	\dm*s��xA-�c�Y��^0����h�k?�B��{�Ͱ��e��9|�\�G�Y|Ѣ�����~� ��i�:�zs���:�^	Z�Gkԛ���{�vHsv29c>_���)�^��M�I�uE�����/UM
�*�მ`oe�W�U�F�p���{��ц�u�WB7��j�V���t���X��R\�ų���^(�VJ�"�{����ޡ$	�� ������O��Ӗ\9ʕ�s�\yWq�\yW^�}o=-Wc�^��W��O�/���J-\��+��к%|��k+��[ׯ�\�g���q�m\�����x�E���h��R4M*����x-x�0ޮ/�õ��R=/��"����o�m�5��|�xW�!�l�[��V1�Uo�[��V1�UL��k5Xւu�ҧZ�S��;��Na�S-�����Y�cr?�� �0�GA8F�O'���IP
�@۫�x��'�a�I�x�0$��-�K�������ճR�Ga�̿握�a�΅�wrN�	��`�0���Æ���i����g�a�����(��q�¸1w
��qðl�
;��1s�<��l?�l��m%��O�~����}�a�0L&�m0S��O�d�OШG�=�M����`�e�iȊl�g-��C+׃�@E��ڹ
�\����-�Sv
�Naq�Y�0۴l���&�f�0��;�]zj�O��?Z�G�؎�°mG����'M�������[&]�M
��K�1�_�֓`q�F�U���8��|��k�}��QW��P*��8sj[6�(�=�N\�r�H��V����D΀~Ml�ƺ~�͎�[9sg��4����T��'��6j�N-�)l���W�5v�*m�t��
f�$z�N��y'=����7�'���=o�Tk(�x���&:�c��"N�� ����o�Fg��M4���'"ہm-Įu5�'es���S�r��K�e�̗�����'��:j��[�G]K-ù��i65=LM�i&5S�v^=�o�*m��L�8�k�_t���(W?LO�mOV�UʹJ�x�v;E��v�@���'��-vц��a-m���i�Bڰ���~%d!�d!��c��E�"q����B\d!.���ֳ�e6��/g���d"A�9�L�I&℣��D��t���>D&&)�������g�`a���o(�k|~S�biYXZ����eaiYXZ<����EF�"#q����H\d$.���>����p|6�M�g���p|6�
ǧ���p|:�ǧw�H�Џ���V2'������K:���M�����������4��4c�Y��l�?�
d���H\��t2� ��ą?H'#q���	��|B:>!���OH�'�����d$.|C���AF��Gd������m�q���]N"+q��8�J�d%N��$��ą?I'+q�S��J\��t�'Y�('+	�g����Cd%��!���q��$�}��J�d%�d%�d%�d%�d%�d%���>���������{��~Y��l|�j|S6Q�NJ'+	�����=d%.���j=L�EV�"+q����]�d%N�'>,���IV�$+q��8�J���t�'Y���NVҌK'+q��8�J�d%N�'Y�����K'+q���}��J�d%N�'YI3Y����IV�$+q��8�J�d%N�'Y�_��g�#�a�,|d6>r5>2�NV�$+q�����d%.|f:YI3YI3YI3Y����IV��f軌�����IV�$+	�K�����Gu��|�?�g������d%�d%�d%�ѓ�ѓz��4�?�?�?z����� $3	�sAx.��=Df���f�c3���;3)���5�o�a��d&�d&9d&�d&�d&�d&9d&�d&��6��T��T��T��T��䐙T��䐙T�p��P/�#q����B\d!.�wYH!YH!YH!Y��,�IRHRHRHRH��ϧ�������V����i��17m,�f���f�R͎���H�n��ӪX�Ky�&�
�l�-�,t4�U[��Nee�ȃX�v�@�u�XyC3-ڬ[tQ�j��a���5�Ƭ�č��2��`��ū��N�w�.��K���;���Q�;
���Q�������q��z��9���>o{�m������2x�^.�����2x�����	x9/'��-����rB�������gZSEɴf���K��x�^.��K��x�/��e�샗��NN��*W�'��2��>.��K��2��>.��K��R��>.��K����>.�����R��>.�����R��>.�{[�%Gow��c:*�J��
��@o��>�..��K��2��..��K��(\EK�pq¸�sQq?�{*�GU���6\n7I\샋}p�.����ζ.v�e.�7�&��2x��M3�e�Wc(�ؾ�mǑNP�|��,^���4� h!�7#à��Q�C&�~H�o��m��·%�m	|�oK�h�(|�o����·Q�6
�F��(|�o��m�-�oK��<��cpl	�c�pl[ǖ��%p��uñn86
�F��28V�*qñQ8���±Q86�8��3��T�x�~-�_K��2��~���n��
���W�\�z����i>����4�F̕z$N|��OK��R��T�рO}X��wç%�h�Y?���e�ވu'AE�-ĕ-�c�X?���e�c)��}�~�Q��?��G����c	�X?���a�b	GVt��հ�^8�YG��#�����8�G�#��YGV��Cqn3,P��/��a�_ؑyض�K��ϱ�/���mK�%݂%u’vjK�����p��s	�Y�V�(�Q<�ŝu�^�~��M��\wf�b�-�+O�jq��Q�w��l�W�O_`�3��w���]��Ϲd/��1��O��p��B�+D�('�:\ �H0ܡf~���=�#l���Sg�=�ŵ�����#���;j��j����R��U��	�8�li@��9ԝ/4G��	2<A�'r���q����{8	JA(�V��BV#]H7҃��=v��������~�d��ez�O��9@im� �S̀>5��5�(�f8��
 I�m3&�;z<Pw��H��1�o���.D��k�4� 0XY��M��X_�ܪf��T��@!�M�b}� l�ӛ��A�Q�L=��5ȇ��{}�^�'7�����S�f?k��Z�j�+ħ�s|
�q�{���!X>��'�S�|>K8�nηt�u�߲A��z>��K����M>�������ar>&j�@�d����A����-�6@]
�j������.��S`܍�����z�}fq�ٜc+2�ﻑ�\�.�~�gʍ���_*��r���-zLD��c
�/eAL�Y�s)p���
>ǽr�k���㨱��6��}�y`���"S��b�?�1�|��{5҅t#=�� x�65>fI����G�Fs:X%����+�{>J���Q8<jf�6_�/r�9)�����>xܧ���`��d����"s�̰_ӛ@��@��{xu���D?ѓh���8���a�{`��/��j��O��y>[gj�Lk9���b�
�	z��U#��>ΒУž�gh�j��>�~�n��
�N~D\�G�[��bm����T�N���Yp/Y�5�k�q
�>/ �좏��
\�P{�ʹ��v�A��cu��x����݁W*���
X�F��R��)�436Lߩ���K���(ך�ط'e:��P�(媂�/c��4�mQ�������O����T�����q�.�#]���h��]���� :w����x�=������r���[�]A5�)E�G9��ʮ]Ԧ��v��j�i�J��C#�j����w�^�~����r����.�;y�FM����~jVz`�a�h�H=щ�<F�cGZ��P͇�>�����4[���]Z�WѪg�ѯG'�����is�d�'WM�Z�}7W�7A�����W�Q�j�cd-���u��Y߃{�Z��VkDu��o�3EkhT=��q�>�G'��}�.o
{ږ�'ty;Z�2��ҖЇ�/��	�Q��F?����'k8[��DI]���b���wk�Y�(#@~����D1��_���mM�m�7��|�xW�R�0>���9�����m���w���⌭`H;�^�m�5+�皕�s��b�9X�h$@$ ����`r�QH�$@� �P�7�Kȣ�P�'u憎�ɸ\�G�����w��Z��M'�K'�{�ߠ݌�$y�5�,מ[��G5��蹛[�;��n$��?��'����|�- &�6r�yM��]�V\C�����t�e�+�������+r�KVi"jQ�y��Ik`�&�	�Q���!�9�;x?t������I��4�f>f��Ԭ��̫��ye��QP��#@� /��ڢ���F;8�F��#��h^ȶ�V��X�*�X�yF��I�qQ��(L\&.
ۣ���Av?L�vk͑�ں��Iz�y��Y_����}>�P�X(�G�}����e`9��+�ݸ�k�:`�����^�֋�z�[/:G_��j��)��z��Գ=/q�z��%�R���Iz�]/��Ew�讗X+��JV"�|�j��3�Fz���+�.{���3?/1�z��%S���>������H��#?���55r�)G���Za�ث�{5t���#B�خF�G:���-�Za5B}���^�ً>{�g/��E���W��j�"�|o�����q�8�{����@/q�z&�%�
[s!e�5��X�O��s@7�5�g/�z��#�Ԩ�3#)J�����Χ��r��9�^b�01U��*LL��Dz�m/��%"hc�6���}OA����i�J���\kE=jeD��X�����|�v���!�k%��D�|���=��~C��j�z�v��j�z�D}����}ߞ�]rV�w�/����%ߐ۵�Q���ZфV4��"s�ֳr�N���jL�xq^X�^�J�Zq�h+^�/ڊmŋ��E[a�8�o׊�k�ρ��V�J�8�V<I+ǂ�x�V<B+���'��V��
�bFC�7�%ݡDw���E�3�o��mF-qHD��E8{5�Y�G�����c_��jޭ_�_�Al�
�k�����r=B3N~�2�D@��b�r�C؉�+ZM�V���n�"vJuR�F#[�S���I���{9^�E,_+ˍ:Ym�e-%�1Ⲕ�s�2D�����8iuG,H�UG�Uen�n3��4�|'G�Q�Sf�,�6�|l4��iñ���z�
�F0��7!o���[����h0��oGށ�9�:��K���
:{��,j��7k��Ueb2-�Ѧ5*�\���P�2���?���#��|�S0����|���u�c�q��	�$��S��֌[�x���
�����jA�Z���O��}�g�_���������o��C�|�O���m1�|�P����?(��o)X��/�
��{5Xւu`=�|6��@�U��!��r|j9>�����r�N�v��즾�z/Vӂ�-�rZ�eXO���[��-�V�{����r|o�P���Sv5��8�S�<��D"���ȓ�d)��Y�����j{�g�=�Z���a?/e��}�:���d=�و"��!d3�#�E=A��=�V�itAO
�6��	�.�qۺ�/AvCvG�@❌^��XL,�/�2�9y�r��~����W �D^��]-+�!�k��C^���9L.1�S���7�#ƍz՟*�&���Q�[��"oC�F�Aގ�y'r��2��Xn�1���n�=��#�Ƙ�LAދ�>l�$�)���j�r�u�4�2͢,�9�=���L]��X|	1L����v�=]�^��,�uZ�|?��8ξ��N5L��X�ZB�Sf�pn����� �O�A���4�zݕr#�c�r#���@�:���s%��q�^������C��ȁ�A��ӫy0��:0\F�[��GKw�ǝ|&�j�r��fXr��a�M�E�����E�ϑ��䷗�w���^ϥ�����������G�=����Уa�,�Dz��)ۖq5*v�v�Df ��G����<���n��t�U[�t!�H��8�G�E�f.7�!�#�[s�^��د�D�L���L!N�9�Tz��z��\V�
<E>�_5�_Y��Y�Ȅ���s��_('.,�cB��猠��0���<#h+��F�V�G�~��(�%&̓x%�l��D��A��A��A�͓��I�2+@%�b�����5�jA��_�$5��I��׊�_�y�=�Ӛ�zfT���
#;�_Wۜ�y��t��K��j��z�#�^I����H�E�M?���}�8J�+��#Ԡ��S�� ��"�r}�H��5��?MM��s��xH7ҍ�t�!�xH�x��j���+_��<{�^��X�)G����[*��R�2�5�zCuv�<b�^9���%h�,��֫��ja:��Bq�Z!�u���͎�k,�`G`0�=��^�)�����G�,z$Kw[+6!��MңWl�#���"�5_gYG�rz���+�k�,�*A/faU	s��4��ŏ�y:���������Bm#��ϞgC�x�]5�>D��Y����@eD7!o��[�m`4P���H�-݉Tc��;��\��w���]��Db���;�MP�-�b��5�%�V�ЊZB+BhE�鹝*��y���o�?�/�`��B�٧�k1�|�]�����P	�I!�(���l;SX>���p
��Ke^*�RW
�jAP�� b�H!����b��C��!B��YZ_;;S���l��6�`�N�1�T�n@��#��o���pK3_�8D�JQs��'O�r�;�kh��G����;�2Ķq�8�����mQ��]e�jL���bE�$�����#��~>��K�Tg��죲�rdT��jf����D*�l㷩|�YNj@��%�g�Yf��"���S���a_�F��Ŝ_��d�*��F��n�I^����"��~/�3���l�<={Dq��A�(��q}��+z�u���g�sh���3[���o�՝��NW}/��݇O%�Swl��[��W�Kfhͣ����k�����8{����|�U���&�ޚ�!�വ������=�F�w=:�C����_�7��v�kka�äz��IP����F�(�.�V)���������Z��a�:qܢ�b�5���n7���(�k'`�����0v�N��j���N�K��q~]�5;Q�)i���|`���a������j�F=L]S���0u=L]Sa�,����t�N��	X:K'�3AX:q�uMKa�n��\g��9��k�c�@!(%����`��q؊q0n�M��*h�u�n�M��	=N[�P�����A�
p��òq6��aV�*aV�*��7"/��j5��b������1����YO��1��f
ªq��J5�����4�&`�qG#�����è	C�+�}`�l��I=��
àa��&��ꝪV��_/� 와5ðf��Q>����}�	�A��Ö�R��R��G���B�yÖ-��)�2[&`�l���oUk���5~ðcvL��	�1;&�:o��p��1l��V���eD��*sA"�"3HDC�n��e#h�ЋzR�����i���%��G���L?������6��&~=ϰ�\B���>��^�!�J���OS�oZ#`7���
����^5*�F�Ԩ��R#��'J��Z=�6��a1��6���՜�A0��]���7�A�%�1)�!z�>�z�~��/����(�z4|=J<��|�xLœ�Rk��q��Z��9�������V��y��x���c�ߏ��G��a��:��t���/�N����5Rx4�`4�`4�`4�`4�`�`�`�`l3������c0�R�i{�q=�\h�5ol��R�${����?G�6j���2e4� �O�)#�2��WI�t�����D������ю��_�v�:��x�ę���z@9��A��o�o��_W�X��e�5��ښ�j�7�A�:��5h/�s�\ֺ�z���b�^1A�+�����Xw�'��Oށ���y�-}%F�;G��"���	ڗ�>k��*�s=���:�fJ/{}�o
3�}����Ů[���+����~���P\v��,]�x��`����=�<oLA�P6�3A1��Ӑ��q<�:7�j/�Ǫl��`!�,��O9�b��|�9��e`9��+�*���k�:`�M���g5~f+���Nv��d�{��r�8��O6�2y���C�3�����"p��2P�~�V��BV#]H7҃��zm�Yzë}d��������y5�p-��_�7��j�;�1
IDf܊$"3F#� oG❍;�*2PQ�������3\�Y�3�ϳ�Z1#�mǁ7���'Z@L����H݀Z�~�{"�_�[�/�}&�g!g#�@�ώ��
��c�sR�Q�����ɸ9I���oތ7oƛ7�͛M��\;k����F5.I�?Q���V���is;��gs?8�]����"@}�R�S�~�x@
����s�z�@_��c���$z���&�d�f4�f�Z�/���Iž���2]�*3��ae��H�S$��E��IB���Vf��'H�$�	T���'H�t�h��	��	��	���I0nl��&��I0m�{&��I�_���>vf��
�%ٙA��7�IMz�1�Z��c�Ο�
�m`����P�F�g�Qmמw���d����U���軇��Ŏ����&�OEp����y����-!���k	,᷶���Ed$����dK�6>&�X�10��su���a��"2�Ed��>&��h	Q�""�%D�K���L���9U~��(x9���ɿ^�Z/�6�쮛��Cъ�g�Pk뵴b��%�!ɴko4$
I�oV����#���nh��ͮ綽m��hR2��l�D�9e��Wu�/OkV�Pق�TAhQd�hV2���f%�Y����7�u{�]�{��au���HF��Ѿd�/�K�w��*40���TʩW��x����I,����h�D>���};����&'c����8�cKw��˲����ΎK�n	U�sk{NMu��V�6�И��V�X��Y��yG�>,����Q��s_�z��`����P�Hն;:��sG�*�s1�V���Z}��F�>`[^۽�d]��z�1g�۽X؅�=��&�ͽڽ��/E5Oy�V�6_�����Z�eI�����J�:pyԶ�δx�v.Om��5�ߧ=g�^Ї�/}�Oe�2�W2�Z��Ԋ���GP��@���O��<��M�OBu����O�T�=��ƶǐj��X�u�B��P�5��K�b
�*�
x��o�Q�yb����g߳��C�|�O�?8�ʶ,��`X	VQ��*wk�:��*�&�L�"T��li@�h�N=v��K�G�P#��菋}��ȃ�C��0�e#� s�G���<=Z������^�Q�C��5*�A��O�U"���Hҍ��,��$"�ZE����@����������L�������ܑ�j��d�h?H�$����6K��K��K��K�
O�<������3\�Y��W��'g���Z�=�8�g'(n���^�c��4� h!�7#à��Q=�H�4���0�t]dYC��>wC��н���������pp=nw�q`�=Q�<�G�q��"��HkV�q������u0�}g�}6�
�9�0�����Q{�O�����#@��>˓�R25B��$2��� �%�w	�?�5�#@�2M�03�sl{�bͦo$�i$�i$�i$�i$�	��9�Z��u|_6���&=�My$5���f��m��w �N=�(n�B�jՑ=Ƚ ��3���=�(nBFZ���ڳ#f��&�j0�e�y���"�>�5�Ɋ�dEA�%���ђɎ�dGA��m~�Q�H�n�3&[���}��胺¦���٪�ؤ�����Uk�ˈ��D�^<�[�!R���f㐔�[:N'e�QJ��;�f���[�_�(+6�2���H�K�D�^"U���bֻ����\�4yt��Ÿ�i{�ZB]�a�c:s�K���1G~׵w�Z����U_�K���-R��{�┲UF���.YD���S��s%�/�׋|Ӛl�O%m��a}�A�髕5�,F�"�t�!J�Kr�`]�+���v�=@/Y�#�=��$}�B�SW5���~��5xCNGk���'�}o���Zm��Y{�UZA�F���5��G�Ӗt=>�TfP�F�n��~XD���
�I!m�V�����O�����0��c���O��W�j-�n{s�]�L-%?�;��$(M��;1���*��+����[����'9s9=r��v��,�8��3r�-Z/�+JG8��Q����g�4�~z�[�o\��UzO�x�'��G|����F��
J�t�B�R��P�Bgf�7���D�&�8=QQk��m��C�%4s�#]��D�Ei�(�I�̕�mG�[�n��:m�v�*|��y���;�j3��Wt�~�R�l�����:��vΊlߑ/��JgF��ҏ�\������/���*bV�ˎÿ�q���#_[Y�U���ڥW{S�����}�9-���@�rT�<�~��BZ���=�J���P���r+:��^�F�/���J�|DK���lѫ��D�v�'>YI|���ڊf������U�*���x+K�#��U�D	��C?���(�O��4#%�$�|��?��M]�u�A�M���~�3N񲯭��V̱W��#���)U\ɭ5��~����Gۇ��}m.hm_
�9��?���m6�=o�Y�T}�>��_{��P�Y��g�~��uS�g���]�9�b�&ZP���k����Z�N?���l�%h������"+��L)՛����G��B}ZM����=C0d�7�c�N
�|UקC�cH�b����A�wP�7�F5ս�Ԥ�k�V��Z��׍r��uO��^ա�!���m�8��m|T{���]��Vb�.Ǯ]�^��ܱT�NP�o�D���2��c��>���o��{��(>�
E\��>�NG��s���E߱?3�Ҟ!�g�����f�=�o1�SZ-���Xc�f�o��NKi��D��ݴu��n���Z�Z���V����ВM_kI��j��i�Mlﳶ�絟�|w��3���=��������3�s��)��g�ߥ.����(�z�t�*>]mox�>Q}�;|Q+�\
s
��>��Z��UYNz�
?ob��V��/��2ۣ�bX��}��h})��.���
��r�V�� �v-8Kw�z�������1}��q����y��fe!e�	Z=l�\aZ=���Y>�͏HJ[KI�u��W�)I�������YO�;��þ1�N��_��Y܄�>�K����Z�G���z����?W�:�r:��a���-
Em�@7��o[_�vU���1��<@���\!� (��C|���H��?��O����?S��Q�4�{9�~-|�l�I�O���Z]�����k-�r�%XV�U�o5Xւu`=�
l�Zaw���o[�V�
�� �k�`P+�dr]�O�����{y�u8�|.'A)(l�.�^��S�%�<��4�fq~;M�B�b8@'�t��F7������\�m0�\Mz
�\�cM׃�Md����`4��	�I�^�g��7&�{������i�,טɹfs�9:�R�E��=�ў�h��=5\�T��������A�&�fd��Y�
C&�~H��0��ha'����E�p$����q	ۺ����ANw)�	z����E�ju����pp=nw�q`"�Q����������s��2���}^����
�{l|$W8>�Nǧ|^��}��#�e<)U���&u!��a�CF�֣���DK�}X�+�J��\+����
s=@��
�}+`����7˓z#��]g��}��f�@��� �ﻐ�A&��A�Y`���������nr	7�Yk�����<�f>�z�凜���W�JP�6��5������m~�W����.`��x�w|wq�����Ag�����%���L�)[ϣ��6Sz�~k���|���)��]�c
��%ĺ�����)�#7iV@�`�]�gj��ڵ�im���`5e���5x�<�Z9��H�*2��q�^1����՞���	x�\��?e���\N�3�Vo��� �7(��4B��0�|~u$Ev3y���^�ډ�(�{8�z�C|~�x�`*�ENc�c�����z��3��+zm=�i��i����;��|�x�X�=���,�E�`=
s�e�x'^Ɖ�q�e�x'^�/S��)���e
:<�Lk^B���T�e
�2x��L^�/S�7cux����0N���e���9��Hb��<��E�!���	��s8	JA(g�
~�D�8�	�7�LJ�#�;U"B�DEg�L^�
/S���2z��}`��~�dd��eȁ�3Xs�#x�"c���"�"�Cv|�{�� O ������@Nc�܉r�p�g���s&眭���Hc�v���t��i��aN�R^�
�T�7��U፪�FUx�*�Qި
oT�7R��OT�'��Uቪ�DUx�*<P��S��)���8Ux�*�M��
OS�����T�i��4Ux�*<M�c�l��8~�x�~^�;�6N�Mަ
oS�ɾ��>���4Ux�*z��Q��
O���T�e�����(�[�#���x��]#ޥ@�y�'�!����4x�q0�5Z���v�od�J�5�Y���Fu�~�V�fQk�l�۔�m��6�x�f�M	ަo�+��4�m��6�x�f�M	ަoS��i�5=x�����F��/�<��Ux���q�
S��)�����w�=�ɰ���u�RP��=��q7��Zcٔ�v�&=wU�ҙw��;����9`.��w��_ε��i��ƳދWg�a�����9�~�>�f�a2`�7�w��Z�+��{Wr�[���9�=gur�^�=h�Fr<i����ݩծJ�%hg�=W�Ξ���v|��W�����*�l���k���k��N�׷�~�]����
h^�ׂ浐�^`.HH�_M�w�;��������9y��<d����1�	߈��깜����n���j���V�Q����\���Q�ъ}�����:<�F��y��jfT#�%!����?���
���U�����Ճ�C�|�O�;+j���֖F�����'$�	|AB����[5o��R��{%�n5K�m�M�j\{��r���C�@+�h���y53
\���j� rľ P3��6\ԜT5U�E���=�}{��͔ڇV���.3�;L�F��v�����	=�t��sM�&�1��>�����=]���}��0�}�cj#53J�d��׽�oP�z}�oD���w�Ջ�,�eX�2�T��R�`Ķ�z�T#�߈�7�j��>,�с�;��;q��WZ��9����F�}X�z+�>,�ˈ�je�n�r�R�,�eXK#ֲki4��w}f��!���
XKk�a-1�%�����}_�E��	o&��R���r��8��,���Ѳ8Z?�������R�^��Kqz)N�$�=�����^E��1��w .�⟺��Y���o]��oVT��C��F(��y@
Ѫ��zM�qD����zO��Z�QG��h5d��T�A�Cz-�W9�7��M��T%���P�o��7T�*�
z����I�)�4%��$ҔD��HSi��4CD�!"��f���MT"�U��*CD�!�J�>�J�H��$����J�HI"z9��Cz�h�^4���IP
�@�^�.�׈V�C����!���_��O����.¢��V��9gUF����T�I"�V[�GlEZk&�Ի����"�4It"����T�"�
e�w�5��L�zO1�I�^'�O�DO�TA�$��BDL!��P��Xb���b�h(D$�fm{�0O�h�G��I>ɇOR�~*�������Ms�^OYԊz4aO�v�2}������Y�d�G����V��ڟ
z�i��!r���~bZD���w�f���^5�i�����Ua�*�V�Ѫ0ZF��B��~5Xւu@�܌���m M�}Z�k�i�Ѫ����^KQ��S��S��3�V5�UMhU�
�UA�*�V��s6�UMhUZՄV�G��[6�6��5��
ar�0�B�\A��{=�
[�a��4�
k�V����v�aj�� �@-[�Fܢe�Ѳ�h�z{e��h�z�,��Ѳ ZD˂hY-�eA=ve�\��;���F��֪�=�N4-���7T��S��P�5?������G��:9A�M�a2�a�O�9ɣ�m+C��ж2����|���h_�ׄ�5�}�m�Mh_��}A�y�h�s9�5���a�-�
�A{�w!X�����߬�g�V��wX}֥��}���h`!D�h`
��A40��@?�G�h�
�۫x��z.�li`�V�
ګ���g�b�h�
�5����~4Џ��@?�?��[�@?�G�h��W����npq3m���+��g�;Z��Yyv�yV�
��jL���G�xK?��Z�;�<�G�B{�٠��l�^y6���@?��+�v\u�V�Qȏ��@?X��?�U�rN�3>f��ԻM/��l�f��J�~4Џ�ů���$<g`��R��h?�v����k�gנ��������eh��q�x�k=jÍ�5�����{��;~��,�E��)�,����w��� �rP	��[������������U�*��j��j��j��j��j��j�eh�4b1i
=���^EZCo�"ά!Ƭ��Wc��Wѣ��+k��������b�b�e��*�e�+ˈW���T�k��Z#��b�b���c��]%n�b�rny��\�G�#����� yt
SS.��.��b�b�b��6�iz)WD�Tq�	�G��azg��9�6��s�<0���3Ec�S�[>��%������0�J��©�Hb�1�l� 3ƀ;�z�y��6Zxv���z��r*-��=Eh�TZ6��M�U�Ѫ۰�6�>�j��J��Ѫy�j�y�~�6Zt�~�<]��ϐ��h�Z��V�7s�<b�|�I������r�ŴN	�SB�l�e��W��N��I�:	Z'A�$Ļ�%��	Z"!�h1-���XL���{۩�vj�0f�}15^L�Sc��,�Ƌ��bj��o��	j�p��׸)�Ƌ��Z�M��VBm�S����˫���-UѯϻDo�g�jt(qH�u�|�B�~:�8w�F�;�_+������`��v&��ڟ���s�\0��w��M*�]O����*�*R8ߺ]+i����JZ-�V[O�����psn҂jE�V�JZq�=B)Jk���m�ڦ�r%����\Ok��5���je���k�õ�4w-�QT�<v71 AED��o�j)�T�֪Ū����^�������+J{{��zM��+�������W6�����lH6�s��?ggg7���_g~ߙ�gfg�8��s�9��EW���U��|6�:;MϬ��
��5w��;A��@�͐��8���N�&�q�z�.�Q+�q%�z`[l�m�5#>fm�z`U�
�M0)&�����z�ތ���fDƌ��Pk�FQ����H�[�_c>d���A�ﴱx-6ox^	�gs�o�E��>Gm�[P�&�|��+��J�|����Y��<��+����/�l��g����f��,�j�f%lsgV��=�
v�3��[�CK���T����c!W��@�/�i���؛�cmJl��DG0r�ҌT���QI3"�r��x�^̔k�L��jJ�Xg����0�gN��i�{��p�>�y|�l${(1� ��c_�]�۔q�`<�?H�u�'�|?�Bg0�cu�R�)�	�g�X?����͗��b4�3}���f�ZhGH�EX����O<	x
�4����y8��7������B�Y<��u�YǬ�cV�i��XO!�.ޅඉ�/4ߔ�}p_n7������
A�:Р4�S�:�`����gc�R�w����nW���C��C��C��
`�����$
�#
�#
�#
�#
�#
���M�6��6��6��6��6��6��6�������T��D��*�Q�(����(���EE�W�����@<�(���(뇑�@�@�
xF曀ud~;d~;�C���L��'���#�QxQxQxQq7��N1d��tK@�֟�ZaP+j�A�l��*�H.d$�ˁl��\�\1��T\.,q�§[malc&(eàl�
��aP6ʆц�І�І�І�@�P:J�A�0(�àt���aP:J�A�0(��A�lP:m�
m�
m�
m�
m�
m�
��.�9hs��D��'���08�
N���08�ͨ�j'��'��D8����	n���0��L�#ِ�\�d.d2�	�mV�C9�P8�Z�6Z.��6Z�6�1��Z�����’,,�r}���"hóІg�
�	.���0���hk���6�+т���5�mv߄]��E׆�6l'�w��
OÆ}	��E�b1��b�}#�D5��ې�|F6��'�m��uJ�+j9F����3��3��3��3��3��3ց�%�����հo����a>x�^ՀW%�U	�F-�F-�F-�F5��:�-|ˇ�x|ˇ�淩��|�+�*�J�;��;��;ցOf�|�|��j�;�^��o�.��X����Y�,�,_�^�L���|8c{Wr��O�}"э��?�5���_���vP|�59>�̄����]�������~��56Sm޼vki����n�K?�;����020�kQ�y^��|��&הty�!9�������?�cp�x46td`��G.���n�a&�=��}���]v��U�5��_.�����Y�/��Jo�_�+�ڹO��T����O��=�R�G��a֦���@�<Pnj͖�:���ۣ���@�<�P(���*y�H)(R
�j�\���FP$��lE6���D)�PO���ȯ�ued����Go�6c5tDZ��b����Z��u�5~�]�R؇հ	
�z-�^���z-�^�`�ycؼ-�z�=`]�ˀuY�aަ-�e�����ˀ�Z`^�ˀy06o��7SK�m��	�\�y-0��)�f�O���/�tq|+������N_�{�3�e���"v^y������,�e�l�
��XF����m�m�\p����{j�J�f���`��'w޷�ow���@�P �9]׃��s�f7o1ك�ֻ��o�$���=}p�딃φ
5����(�r��̱�=�rۃ��4��U�1o9<ƾt
�S�Ԁ:5�N
�SÑF3���i�f
�V�մ�/M�mr涛�l��,��A�rP|?(�7k�uq͚�5	�%[Z9(_��K��9(j8��A��9�rp���;�G��#5�H
G��s�f��푖�#͜/�6g<�3pLJ�����Y	y]	y]	y�b�n&ߟY�9�Ɖ�r��?Ox��U7l��'[�t��՝p��r��rv��\ζvb����$���p6�=.��)��NᬫM�9[F#��2�YWø�mg}G:Ζ�8k��l��OmgW��+����z�.gW��p6b9g#i9{���Dl�'����փkm��!���#1p$���8Gb�H�b�B\��1p!.Ąy��(@_�t�pg=(�7�m��@�(��]��@��fԌ���AM�N��F�zP3j���m�`���f���9��^(g�I��r���^OT�*m���B��8(�b�P���|�8!�f�c��X�l���{Mg8�}���؈�?������wbݖv�])w�$a��UA�g�񬖀�K@�%���D��k5�Z�j	8���G��b�LxVK�g��Yb=��Lܪ.M�6Ẉ]=;1&���`g�c2��Hs=�Bp/�!�ap0�j�U
c��N,o,���O��`�Ȭ�P*�
E��M�D���"`\L��]0+fE�*�"��M��ֱ	ֱ	���kD�E�WW�ٔ���J�_g��V�R+d�|�q'�m����U�46��ݽw�z��f��xf\�>��7>�׀E����~7o�/�%��Y�~}*��C�����;xN� 2��^���<ܡ
��Ƿn���7�#�m�Cލ�G�{���hK`W�\�x"ী��+5�nQ��N�j!���vo3�ݜ������V�vJ�(�\%֬�'���
�~,��]q�/n������/�_#n�~���O��د�������cد����A4��J�I->�A�]l�=��Vy��I���)r��*��C�\9_�$�Gr�\,��i�X��3d�\!ϖ���'+�Z9J���r��1r���c��N^(wHG~OI%�uJ�L9Qe��F�[-���a�?ԙ�,y�:W��w���;r����{�E�by��L]&�.W��Օ�J���Z]#T7�����Vu�|DMV�����|J=��O����r�������S�)��zF=#��ij���zI�*��^S����M���ʗ/���"��*W+�k�B}"_W�TX樭j������m�2Wg�n򟺿>N��92__��+���9OO�W��j=Q.�7�[�b=EO�K�s�9��~Y�,��=S.ӳt�\���ur�ޠ7ɨެ7�&]���f���\��:]'�K�RB��z%u��R)�Q�u�
阎��@�@?u�P#n�������ߢ6���mh™a���a�
Z�=��'��[�1���SZ�9�s���;k�����=�y�|�O��
S���͇N3�w�Ù�':�p>��u�ng����D}�GͯD
�=���i�'�8
�^haᴙ�x�;��,�|�.߹����u�O���|����X����О~x~c>_���g5��n�y'�����4;��g�ᾳ���MrK`�^����r����ʖ󆳌r��^�R���xw&
�
<~e���\?�L
7�%�m	���\bV"��ʽ�5����zz�'�)1O�DS�@�;���*��l���q[;�����{?�U�_9���t������疛�����de�Se�mi�O�v9�%��Uq����S�ltu��DieB��mU��ն�-Ύ��a\�h�VWGS��o?]��!t��L�|ÙòO�ij~mc;��R�g6쟫S_�^�|�9�|w��4�,��c��ؒF��];^;u��Z{:�9��cޱJ���<J�W��
xO���ILw>`Y![�K��/�s�Ѯ����k�`~���~Ǚ�U�'j�|�ԻψK��ۻ&.o���C�7t�G����g��%�����-�Б�`m�W	������Ԗb��v5ۜ�Ztfc�����UQX����
���̿�L}�伛���^Yp��󺓓�)���~ꔡu-��*<��j���s4��ᡬ2we>�֧�Y��i��۳���k)�_R+����駕'k�Le�϶�|�^/qm{-`Z�!pv��q��D��^��8+��|n�qڬ'`�$dW�ҜN����U�I'��{���l[���<i���:�Hb,!/�.�K1�˝��e���C+�Ѕk����=lz�Q��l>�����[r���޲%��o�i��m_�?�����yn����S�sI��]yX��d���W����ʄn��9��u{��wh�|��j��^��p�E��Q�jm;�T��
=9�=l8�2֔��z}�V�����$���ԡ�ߢ��v�1�:+��g�a�O�.|�ya#��ޅ�>Z���&�"n)X����}϶������w���kDx��l{9��}Nm\�%�=�]�7q)�g�%�V����z���hWj؅��}�ސ�]΢��%�Z���7�;���[kן��:ot�]q/>�B����ʿy��v�y��g���=���^
h[����v�)p����^�їء��v6��5�ف�;�©�,+J��I�����!N���ӹ2@|�`�a {���R�*z��q�c1H�}E�ǚ�Ù�Ė)��W8B�����'4�c�Ѣ��u�Eq�=��v�|r��s��,_�{X�.�>�8�w�K��{ۺ'��0+���� �]��;ܬ�����AA�/�U� A7t;0۩8���G����=��`�P�8��
����C_�&����Xp�7�5��:��`�dj�|t���iꦿƽn�1�#P�u���]1*�~�Г�l�z�n�9��Kً{#���Lf���,�z�Cy�1L���s�I,?���2i�Gf�X�폽�у����r�I���D�����]��0�c@�q��i��ϧ�zvBY�x��KFO�th��qyN�6{t�u&��;e8�6��-�7��#��[��Ĉ����T�5����N8�^�H>CI��u���:9��G��i�25�yb�����Ŀ�v(s4!���M�؝%�z���ϙ���J���#��~�k��J�d�t�⡉1�ø�c}��}�o�a��w�aIRi"Uֶ��!��
X�w�4�m�H�d����>H�����2�&4��5�����ǖ}��N���6��uO�'zX$�ɶ���{�LV����y��qHx��Fz�k�G0�Dž�V$0w����B$��ŅP;��ϛV�����i��$��n��H�&݀Y:8
�s}�c��8�f�t����
nMS�п\�:���˶���9��9�Ә��C��	�Gz~��x��W���I��`�ڑ^�1�`�^S�e�`�gΦdf�VjG�'6W�H��α�F�.����	I��ē�� �ڈ��m�6���,��m�U��u�T���I��t��$|����o��E���7��guP�:��$��-UzM}��Z�㾦|�c�kB��%�m���p<5�)��4n��:���Bo�i�h��9
�E�z���t���rL����Md�O����6$��<�2���kk�6��%��[o	��A�	xj��3#��Lh�s��Q�W�c�c�wоƋI���g����yL�까Z=���:Z<!^A�"G\)�!��5b�(����5�Xg0��mƱ�f�|�*v�8V��ı�&���'b�@�VY�]�b�Y�=(��2�h�,F�vc4k�	{oY��(Y%�e�U�ʣ��_F�y��%���e����Ue�ST�:F�V���bu�:K^���+�c5N],�aL�DƴNbL�i��1�?cL덌i�]ݣfd띌l�
#[�ed�}�l�-#[�gd��l}���S�(#[cd���8#[�2��)F�>����GF��7#[����/3��UF������ٚ�oַ�7���|[��<����9r���r�����w�|=_��B�X��?���T���x-П�Mr!#^1�P�wȥz���e��r����f�N3/��M�SЄ���F�<��lR��͚=���3�~`T�^n���^W"ݪ�&��i����j�{�i��%�]
�830*0&0.p)~]������	psw�	<�rOx&�Y�t�^�����
�B���e���@9��
H�j�F���48?TAkk�ԙ���c��]�G"e#�M�X�.
� ������ׯX��}�=���8>�S�����;^r6�}�>1WX��Z�&檽xq0Aon.������W���=C�d�^�y���@{��!;F:7t�Wv����~���r�~��Ͻ�۽�d/w�=N	��+{��=����^�r���!�c�]g_Cyg!����A2C�Fyv���0���4D9
��A%���ڊHl%6�A��@4��W�c����+�N��^n���<gP�3�HX~y�Z���Wa�C,y��똿��_�[�N`�^?��w��!��e���1׋)�DL���:���5���a�1�W=�^��C���U�IY2��Oe�A�cj�W��د|��:������O�~��s��s������y�g�|�CÛk.f:��1��!C�lޫC���),9���&�~Ȓ�n�4�:�%#]�0=�%糞C-�f�NR���e~��F����,�<�{���r��V�ޕkL�%w���Ky�_�>M�G��Oi`�*��]�1�$F'������8��E>��y��6�T��e���'2?�r�}R����D
�3t�6ӝL0=�w����S�+�Dz�{LO��#}��ۙ��[y�g����3��L{2ն�됿�%G1L��=�3?�M�KO�Gݖ }�w���Inj[��?�ȋ��Nf�d����_�1����%�|�X�e�<�Ѥ̟�kNe�Q�[�?��L����y���э'ã�����c�ѹ��<����ÿC�n��T|_�@�P\.�?�U���j�q�2	���~#~'��(|�bY*��}���Qn�5r��/�N�U���UmJ*
��u�^���z��'t�^���b�L/�e�\�Ы�]�+�v��W�c���`d��p����6��jhi�J=�Ux��6Z�xF?��	׃���V@`7`����[�?��}�Ь=ȾQ{�]�ͬ�6�x^�љKH�L72-f:��{W�ә������"���ǹ��}�lc3�^�4�i>�iL����3�N������2��p��1]���^����腾��?���<��4�W��cf�B�#se��mz��ϔ��)l��F���ov����ˡ�؄z�L����1�w$m��I�&���!eO@Φ��}�{�&/��t#�b�ils��դ~򏨈w�8���H_�1��<=�=i�2�]�WQSOUh� �G�g�"K�%��(�ݭ��eeԝS1^��I�7b4�ћSIv�5з�K��`%i �2�����Wʷ�Tp��2���դ'��^#�+tvjquery/jquery-ui-1.12.1.js000064400000753634151215013470011112 0ustar00/*! jQuery UI - v1.12.1 - 2021-01-02
* http://jqueryui.com
* Includes: widget.js, position.js, data.js, disable-selection.js, focusable.js, form-reset-mixin.js, jquery-1-7.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/draggable.js, widgets/droppable.js, widgets/resizable.js, widgets/selectable.js, widgets/sortable.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, widgets/menu.js, widgets/mouse.js, widgets/progressbar.js, widgets/selectmenu.js, widgets/slider.js, widgets/spinner.js, widgets/tabs.js, widgets/tooltip.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js
* Copyright jQuery Foundation and other contributors; Licensed MIT */

!function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)}(function(k){k.ui=k.ui||{};k.ui.version="1.12.1";var n,i=0,r=Array.prototype.slice;k.cleanData=(n=k.cleanData,function(t){for(var e,i,s=0;null!=(i=t[s]);s++)try{(e=k._data(i,"events"))&&e.remove&&k(i).triggerHandler("remove")}catch(t){}n(t)}),k.widget=function(t,i,e){var s,n,o,a={},r=t.split(".")[0],h=r+"-"+(t=t.split(".")[1]);return e||(e=i,i=k.Widget),k.isArray(e)&&(e=k.extend.apply(null,[{}].concat(e))),k.expr[":"][h.toLowerCase()]=function(t){return!!k.data(t,h)},k[r]=k[r]||{},s=k[r][t],n=k[r][t]=function(t,e){if(!this._createWidget)return new n(t,e);arguments.length&&this._createWidget(t,e)},k.extend(n,s,{version:e.version,_proto:k.extend({},e),_childConstructors:[]}),(o=new i).options=k.widget.extend({},o.options),k.each(e,function(e,s){function n(){return i.prototype[e].apply(this,arguments)}function o(t){return i.prototype[e].apply(this,t)}k.isFunction(s)?a[e]=function(){var t,e=this._super,i=this._superApply;return this._super=n,this._superApply=o,t=s.apply(this,arguments),this._super=e,this._superApply=i,t}:a[e]=s}),n.prototype=k.widget.extend(o,{widgetEventPrefix:s&&o.widgetEventPrefix||t},a,{constructor:n,namespace:r,widgetName:t,widgetFullName:h}),s?(k.each(s._childConstructors,function(t,e){var i=e.prototype;k.widget(i.namespace+"."+i.widgetName,n,e._proto)}),delete s._childConstructors):i._childConstructors.push(n),k.widget.bridge(t,n),n},k.widget.extend=function(t){for(var e,i,s=r.call(arguments,1),n=0,o=s.length;n<o;n++)for(e in s[n])i=s[n][e],s[n].hasOwnProperty(e)&&void 0!==i&&(k.isPlainObject(i)?t[e]=k.isPlainObject(t[e])?k.widget.extend({},t[e],i):k.widget.extend({},i):t[e]=i);return t},k.widget.bridge=function(o,e){var a=e.prototype.widgetFullName||o;k.fn[o]=function(i){var t="string"==typeof i,s=r.call(arguments,1),n=this;return t?this.length||"instance"!==i?this.each(function(){var t,e=k.data(this,a);return"instance"===i?(n=e,!1):e?k.isFunction(e[i])&&"_"!==i.charAt(0)?(t=e[i].apply(e,s))!==e&&void 0!==t?(n=t&&t.jquery?n.pushStack(t.get()):t,!1):void 0:k.error("no such method '"+i+"' for "+o+" widget instance"):k.error("cannot call methods on "+o+" prior to initialization; attempted to call method '"+i+"'")}):n=void 0:(s.length&&(i=k.widget.extend.apply(null,[i].concat(s))),this.each(function(){var t=k.data(this,a);t?(t.option(i||{}),t._init&&t._init()):k.data(this,a,new e(i,this))})),n}},k.Widget=function(){},k.Widget._childConstructors=[],k.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=k(e||this.defaultElement||this)[0],this.element=k(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=k(),this.hoverable=k(),this.focusable=k(),this.classesElementLookup={},e!==this&&(k.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=k(e.style?e.ownerDocument:e.document||e),this.window=k(this.document[0].defaultView||this.document[0].parentWindow)),this.options=k.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:k.noop,_create:k.noop,_init:k.noop,destroy:function(){var i=this;this._destroy(),k.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:k.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return k.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=k.widget.extend({},this.options[t]),n=0;n<i.length-1;n++)s[i[n]]=s[i[n]]||{},s=s[i[n]];if(t=i.pop(),1===arguments.length)return void 0===s[t]?null:s[t];s[t]=e}else{if(1===arguments.length)return void 0===this.options[t]?null:this.options[t];o[t]=e}return this._setOptions(o),this},_setOptions:function(t){for(var e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(t){var e,i,s;for(e in t)s=this.classesElementLookup[e],t[e]!==this.options.classes[e]&&s&&s.length&&(i=k(s.get()),this._removeClass(s,e),i.addClass(this._classes({element:i,keys:e,classes:t,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(n){var o=[],a=this;function t(t,e){for(var i,s=0;s<t.length;s++)i=a.classesElementLookup[t[s]]||k(),i=n.add?k(k.unique(i.get().concat(n.element.get()))):k(i.not(n.element).get()),a.classesElementLookup[t[s]]=i,o.push(t[s]),e&&n.classes[t[s]]&&o.push(n.classes[t[s]])}return n=k.extend({element:this.element,classes:this.options.classes||{}},n),this._on(n.element,{remove:"_untrackClassesElement"}),n.keys&&t(n.keys.match(/\S+/g)||[],!0),n.extra&&t(n.extra.match(/\S+/g)||[]),o.join(" ")},_untrackClassesElement:function(i){var s=this;k.each(s.classesElementLookup,function(t,e){-1!==k.inArray(i.target,e)&&(s.classesElementLookup[t]=k(e.not(i.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,t={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return t.element.toggleClass(this._classes(t),s),this},_on:function(n,o,t){var a,r=this;"boolean"!=typeof n&&(t=o,o=n,n=!1),t?(o=a=k(o),this.bindings=this.bindings.add(o)):(t=o,o=this.element,a=this.widget()),k.each(t,function(t,e){function i(){if(n||!0!==r.options.disabled&&!k(this).hasClass("ui-state-disabled"))return("string"==typeof e?r[e]:e).apply(r,arguments)}"string"!=typeof e&&(i.guid=e.guid=e.guid||i.guid||k.guid++);var s=t.match(/^([\w:-]*)\s*(.*)$/),t=s[1]+r.eventNamespace,s=s[2];s?a.on(t,s,i):o.on(t,i)})},_off:function(t,e){e=(e||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,t.off(e).off(e),this.bindings=k(this.bindings.not(t).get()),this.focusable=k(this.focusable.not(t).get()),this.hoverable=k(this.hoverable.not(t).get())},_delay:function(t,e){var i=this;return setTimeout(function(){return("string"==typeof t?i[t]:t).apply(i,arguments)},e||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){this._addClass(k(t.currentTarget),null,"ui-state-hover")},mouseleave:function(t){this._removeClass(k(t.currentTarget),null,"ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){this._addClass(k(t.currentTarget),null,"ui-state-focus")},focusout:function(t){this._removeClass(k(t.currentTarget),null,"ui-state-focus")}})},_trigger:function(t,e,i){var s,n,o=this.options[t];if(i=i||{},(e=k.Event(e)).type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),e.target=this.element[0],n=e.originalEvent)for(s in n)s in e||(e[s]=n[s]);return this.element.trigger(e,i),!(k.isFunction(o)&&!1===o.apply(this.element[0],[e].concat(i))||e.isDefaultPrevented())}},k.each({show:"fadeIn",hide:"fadeOut"},function(o,a){k.Widget.prototype["_"+o]=function(e,t,i){var s;"string"==typeof t&&(t={effect:t});var n=t?!0!==t&&"number"!=typeof t&&t.effect||a:o;"number"==typeof(t=t||{})&&(t={duration:t}),s=!k.isEmptyObject(t),t.complete=i,t.delay&&e.delay(t.delay),s&&k.effects&&k.effects.effect[n]?e[o](t):n!==o&&e[n]?e[n](t.duration,t.easing,i):e.queue(function(t){k(this)[o](),i&&i.call(e[0]),t()})}});var s,x,C,o,a,h,l,c,D;k.widget;function I(t,e,i){return[parseFloat(t[0])*(c.test(t[0])?e/100:1),parseFloat(t[1])*(c.test(t[1])?i/100:1)]}function T(t,e){return parseInt(k.css(t,e),10)||0}x=Math.max,C=Math.abs,o=/left|center|right/,a=/top|center|bottom/,h=/[\+\-]\d+(\.[\d]+)?%?/,l=/^\w+/,c=/%$/,D=k.fn.position,k.position={scrollbarWidth:function(){if(void 0!==s)return s;var t,e=k("<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),i=e.children()[0];return k("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.width<t.element[0].scrollWidth;return{width:"scroll"===i||"auto"===i&&t.height<t.element[0].scrollHeight?k.position.scrollbarWidth():0,height:e?k.position.scrollbarWidth():0}},getWithinInfo:function(t){var e=k(t||window),i=k.isWindow(e[0]),s=!!e[0]&&9===e[0].nodeType;return{element:e,isWindow:i,isDocument:s,offset:!i&&!s?k(t).offset():{left:0,top:0},scrollLeft:e.scrollLeft(),scrollTop:e.scrollTop(),width:e.outerWidth(),height:e.outerHeight()}}},k.fn.position=function(u){if(!u||!u.of)return D.apply(this,arguments);u=k.extend({},u);var d,p,f,g,m,t,_=k(u.of),v=k.position.getWithinInfo(u.within),b=k.position.getScrollInfo(v),y=(u.collision||"flip").split(" "),w={},e=9===(t=(e=_)[0]).nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:k.isWindow(t)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:t.preventDefault?{width:0,height:0,offset:{top:t.pageY,left:t.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()};return _[0].preventDefault&&(u.at="left top"),p=e.width,f=e.height,g=e.offset,m=k.extend({},g),k.each(["my","at"],function(){var t,e,i=(u[this]||"").split(" ");1===i.length&&(i=o.test(i[0])?i.concat(["center"]):a.test(i[0])?["center"].concat(i):["center","center"]),i[0]=o.test(i[0])?i[0]:"center",i[1]=a.test(i[1])?i[1]:"center",t=h.exec(i[0]),e=h.exec(i[1]),w[this]=[t?t[0]:0,e?e[0]:0],u[this]=[l.exec(i[0])[0],l.exec(i[1])[0]]}),1===y.length&&(y[1]=y[0]),"right"===u.at[0]?m.left+=p:"center"===u.at[0]&&(m.left+=p/2),"bottom"===u.at[1]?m.top+=f:"center"===u.at[1]&&(m.top+=f/2),d=I(w.at,p,f),m.left+=d[0],m.top+=d[1],this.each(function(){var i,t,a=k(this),r=a.outerWidth(),h=a.outerHeight(),e=T(this,"marginLeft"),s=T(this,"marginTop"),n=r+e+T(this,"marginRight")+b.width,o=h+s+T(this,"marginBottom")+b.height,l=k.extend({},m),c=I(w.my,a.outerWidth(),a.outerHeight());"right"===u.my[0]?l.left-=r:"center"===u.my[0]&&(l.left-=r/2),"bottom"===u.my[1]?l.top-=h:"center"===u.my[1]&&(l.top-=h/2),l.left+=c[0],l.top+=c[1],i={marginLeft:e,marginTop:s},k.each(["left","top"],function(t,e){k.ui.position[y[t]]&&k.ui.position[y[t]][e](l,{targetWidth:p,targetHeight:f,elemWidth:r,elemHeight:h,collisionPosition:i,collisionWidth:n,collisionHeight:o,offset:[d[0]+c[0],d[1]+c[1]],my:u.my,at:u.at,within:v,elem:a})}),u.using&&(t=function(t){var e=g.left-l.left,i=e+p-r,s=g.top-l.top,n=s+f-h,o={target:{element:_,left:g.left,top:g.top,width:p,height:f},element:{element:a,left:l.left,top:l.top,width:r,height:h},horizontal:i<0?"left":0<e?"right":"center",vertical:n<0?"top":0<s?"bottom":"middle"};p<r&&C(e+i)<p&&(o.horizontal="center"),f<h&&C(s+n)<f&&(o.vertical="middle"),x(C(e),C(i))>x(C(s),C(n))?o.important="horizontal":o.important="vertical",u.using.call(this,t,o)}),a.offset(k.extend(l,{using:t}))})},k.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,a=s-o,r=o+e.collisionWidth-n-s;e.collisionWidth>n?0<a&&r<=0?(i=t.left+a+e.collisionWidth-n-s,t.left+=a-i):t.left=!(0<r&&a<=0)&&r<a?s+n-e.collisionWidth:s:0<a?t.left+=a:0<r?t.left-=r:t.left=x(t.left-o,t.left)},top:function(t,e){var i=e.within,s=i.isWindow?i.scrollTop:i.offset.top,n=e.within.height,o=t.top-e.collisionPosition.marginTop,a=s-o,r=o+e.collisionHeight-n-s;e.collisionHeight>n?0<a&&r<=0?(i=t.top+a+e.collisionHeight-n-s,t.top+=a-i):t.top=!(0<r&&a<=0)&&r<a?s+n-e.collisionHeight:s:0<a?t.top+=a:0<r?t.top-=r:t.top=x(t.top-o,t.top)}},flip:{left:function(t,e){var i=e.within,s=i.offset.left+i.scrollLeft,n=i.width,o=i.isWindow?i.scrollLeft:i.offset.left,a=t.left-e.collisionPosition.marginLeft,r=a-o,h=a+e.collisionWidth-n-o,l="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,i="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,a=-2*e.offset[0];r<0?((s=t.left+l+i+a+e.collisionWidth-n-s)<0||s<C(r))&&(t.left+=l+i+a):0<h&&(0<(o=t.left-e.collisionPosition.marginLeft+l+i+a-o)||C(o)<h)&&(t.left+=l+i+a)},top:function(t,e){var i=e.within,s=i.offset.top+i.scrollTop,n=i.height,o=i.isWindow?i.scrollTop:i.offset.top,a=t.top-e.collisionPosition.marginTop,r=a-o,h=a+e.collisionHeight-n-o,l="top"===e.my[1]?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,i="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,a=-2*e.offset[1];r<0?((s=t.top+l+i+a+e.collisionHeight-n-s)<0||s<C(r))&&(t.top+=l+i+a):0<h&&(0<(o=t.top-e.collisionPosition.marginTop+l+i+a-o)||C(o)<h)&&(t.top+=l+i+a)}},flipfit:{left:function(){k.ui.position.flip.left.apply(this,arguments),k.ui.position.fit.left.apply(this,arguments)},top:function(){k.ui.position.flip.top.apply(this,arguments),k.ui.position.fit.top.apply(this,arguments)}}};var t;k.ui.position,k.extend(k.expr[":"],{data:k.expr.createPseudo?k.expr.createPseudo(function(e){return function(t){return!!k.data(t,e)}}):function(t,e,i){return!!k.data(t,i[3])}}),k.fn.extend({disableSelection:(t="onselectstart"in document.createElement("div")?"selectstart":"mousedown",function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}),enableSelection:function(){return this.off(".ui-disableSelection")}});k.ui.focusable=function(t,e){var i,s,n,o,a=t.nodeName.toLowerCase();return"area"===a?(s=(i=t.parentNode).name,!(!t.href||!s||"map"!==i.nodeName.toLowerCase())&&(0<(s=k("img[usemap='#"+s+"']")).length&&s.is(":visible"))):(/^(input|select|textarea|button|object)$/.test(a)?(n=!t.disabled)&&(o=k(t).closest("fieldset")[0])&&(n=!o.disabled):n="a"===a&&t.href||e,n&&k(t).is(":visible")&&function(t){var e=t.css("visibility");for(;"inherit"===e;)t=t.parent(),e=t.css("visibility");return"hidden"!==e}(k(t)))},k.extend(k.expr[":"],{focusable:function(t){return k.ui.focusable(t,null!=k.attr(t,"tabindex"))}});k.ui.focusable,k.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):k(this[0].form)},k.ui.formResetMixin={_formResetHandler:function(){var e=k(this);setTimeout(function(){var t=e.data("ui-form-reset-instances");k.each(t,function(){this.refresh()})})},_bindFormResetHandler:function(){var t;this.form=this.element.form(),this.form.length&&((t=this.form.data("ui-form-reset-instances")||[]).length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t))},_unbindFormResetHandler:function(){var t;this.form.length&&((t=this.form.data("ui-form-reset-instances")).splice(k.inArray(this,t),1),t.length?this.form.data("ui-form-reset-instances",t):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset"))}};"1.7"===k.fn.jquery.substring(0,3)&&(k.each(["Width","Height"],function(t,i){var n="Width"===i?["Left","Right"]:["Top","Bottom"],s=i.toLowerCase(),o={innerWidth:k.fn.innerWidth,innerHeight:k.fn.innerHeight,outerWidth:k.fn.outerWidth,outerHeight:k.fn.outerHeight};function a(t,e,i,s){return k.each(n,function(){e-=parseFloat(k.css(t,"padding"+this))||0,i&&(e-=parseFloat(k.css(t,"border"+this+"Width"))||0),s&&(e-=parseFloat(k.css(t,"margin"+this))||0)}),e}k.fn["inner"+i]=function(t){return void 0===t?o["inner"+i].call(this):this.each(function(){k(this).css(s,a(this,t)+"px")})},k.fn["outer"+i]=function(t,e){return"number"!=typeof t?o["outer"+i].call(this,t):this.each(function(){k(this).css(s,a(this,t,!0,e)+"px")})}}),k.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))});k.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},k.ui.escapeSelector=(e=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g,function(t){return t.replace(e,"\\$1")}),k.fn.labels=function(){var t,e,i;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(e=this.eq(0).parents("label"),(t=this.attr("id"))&&(i=(i=this.eq(0).parents().last()).add((i.length?i:this).siblings()),t="label[for='"+k.ui.escapeSelector(t)+"']",e=e.add(i.find(t).addBack(t))),this.pushStack(e))},k.fn.scrollParent=function(t){var e=this.css("position"),i="absolute"===e,s=t?/(auto|scroll|hidden)/:/(auto|scroll)/,t=this.parents().filter(function(){var t=k(this);return(!i||"static"!==t.css("position"))&&s.test(t.css("overflow")+t.css("overflow-y")+t.css("overflow-x"))}).eq(0);return"fixed"!==e&&t.length?t:k(this[0].ownerDocument||document)},k.extend(k.expr[":"],{tabbable:function(t){var e=k.attr(t,"tabindex"),i=null!=e;return(!i||0<=e)&&k.ui.focusable(t,i)}}),k.fn.extend({uniqueId:(u=0,function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++u)})}),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&k(this).removeAttr("id")})}}),k.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var e,u,d=!1;k(document).on("mouseup",function(){d=!1});k.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(t){if(!0===k.data(t.target,e.widgetName+".preventClickEvent"))return k.removeData(t.target,e.widgetName+".preventClickEvent"),t.stopImmediatePropagation(),!1}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(t){if(!d){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(t),this._mouseDownEvent=t;var e=this,i=1===t.which,s=!("string"!=typeof this.options.cancel||!t.target.nodeName)&&k(t.target).closest(this.options.cancel).length;return i&&!s&&this._mouseCapture(t)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=!1!==this._mouseStart(t),!this._mouseStarted)?(t.preventDefault(),!0):(!0===k.data(t.target,this.widgetName+".preventClickEvent")&&k.removeData(t.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return e._mouseMove(t)},this._mouseUpDelegate=function(t){return e._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),t.preventDefault(),d=!0)):!0}},_mouseMove:function(t){if(this._mouseMoved){if(k.ui.ie&&(!document.documentMode||document.documentMode<9)&&!t.button)return this._mouseUp(t);if(!t.which)if(t.originalEvent.altKey||t.originalEvent.ctrlKey||t.originalEvent.metaKey||t.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(t)}return(t.which||t.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=!1!==this._mouseStart(this._mouseDownEvent,t),this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted)},_mouseUp:function(t){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&k.data(t.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(t)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,d=!1,t.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),k.ui.plugin={add:function(t,e,i){var s,n=k.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n<o.length;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},k.ui.safeActiveElement=function(e){var i;try{i=e.activeElement}catch(t){i=e.body}return(i=i||e.body).nodeName||(i=e.body),i},k.ui.safeBlur=function(t){t&&"body"!==t.nodeName.toLowerCase()&&k(t).trigger("blur")};k.widget("ui.draggable",k.ui.mouse,{version:"1.12.1",widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1,drag:null,start:null,stop:null},_create:function(){"original"===this.options.helper&&this._setPositionRelative(),this.options.addClasses&&this._addClass("ui-draggable"),this._setHandleClassName(),this._mouseInit()},_setOption:function(t,e){this._super(t,e),"handle"===t&&(this._removeHandleClassName(),this._setHandleClassName())},_destroy:function(){(this.helper||this.element).is(".ui-draggable-dragging")?this.destroyOnClear=!0:(this._removeHandleClassName(),this._mouseDestroy())},_mouseCapture:function(t){var e=this.options;return!(this.helper||e.disabled||0<k(t.target).closest(".ui-resizable-handle").length)&&(this.handle=this._getHandle(t),!!this.handle&&(this._blurActiveElement(t),this._blockFrames(!0===e.iframeFix?"iframe":e.iframeFix),!0))},_blockFrames:function(t){this.iframeBlocks=this.document.find(t).map(function(){var t=k(this);return k("<div>").css("position","absolute").appendTo(t.parent()).outerWidth(t.outerWidth()).outerHeight(t.outerHeight()).offset(t.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_blurActiveElement:function(t){var e=k.ui.safeActiveElement(this.document[0]);k(t.target).closest(e).length||k.ui.safeBlur(e)},_mouseStart:function(t){var e=this.options;return this.helper=this._createHelper(t),this._addClass(this.helper,"ui-draggable-dragging"),this._cacheHelperProportions(),k.ui.ddmanager&&(k.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(!0),this.offsetParent=this.helper.offsetParent(),this.hasFixedAncestor=0<this.helper.parents().filter(function(){return"fixed"===k(this).css("position")}).length,this.positionAbs=this.element.offset(),this._refreshOffsets(t),this.originalPosition=this.position=this._generatePosition(t,!1),this.originalPageX=t.pageX,this.originalPageY=t.pageY,e.cursorAt&&this._adjustOffsetFromHelper(e.cursorAt),this._setContainment(),!1===this._trigger("start",t)?(this._clear(),!1):(this._cacheHelperProportions(),k.ui.ddmanager&&!e.dropBehaviour&&k.ui.ddmanager.prepareOffsets(this,t),this._mouseDrag(t,!0),k.ui.ddmanager&&k.ui.ddmanager.dragStart(this,t),!0)},_refreshOffsets:function(t){this.offset={top:this.positionAbs.top-this.margins.top,left:this.positionAbs.left-this.margins.left,scroll:!1,parent:this._getParentOffset(),relative:this._getRelativeOffset()},this.offset.click={left:t.pageX-this.offset.left,top:t.pageY-this.offset.top}},_mouseDrag:function(t,e){if(this.hasFixedAncestor&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(t,!0),this.positionAbs=this._convertPositionTo("absolute"),!e){e=this._uiHash();if(!1===this._trigger("drag",t,e))return this._mouseUp(new k.Event("mouseup",t)),!1;this.position=e.position}return this.helper[0].style.left=this.position.left+"px",this.helper[0].style.top=this.position.top+"px",k.ui.ddmanager&&k.ui.ddmanager.drag(this,t),!1},_mouseStop:function(t){var e=this,i=!1;return k.ui.ddmanager&&!this.options.dropBehaviour&&(i=k.ui.ddmanager.drop(this,t)),this.dropped&&(i=this.dropped,this.dropped=!1),"invalid"===this.options.revert&&!i||"valid"===this.options.revert&&i||!0===this.options.revert||k.isFunction(this.options.revert)&&this.options.revert.call(this.element,i)?k(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){!1!==e._trigger("stop",t)&&e._clear()}):!1!==this._trigger("stop",t)&&this._clear(),!1},_mouseUp:function(t){return this._unblockFrames(),k.ui.ddmanager&&k.ui.ddmanager.dragStop(this,t),this.handleElement.is(t.target)&&this.element.trigger("focus"),k.ui.mouse.prototype._mouseUp.call(this,t)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp(new k.Event("mouseup",{target:this.element[0]})):this._clear(),this},_getHandle:function(t){return!this.options.handle||!!k(t.target).closest(this.element.find(this.options.handle)).length},_setHandleClassName:function(){this.handleElement=this.options.handle?this.element.find(this.options.handle):this.element,this._addClass(this.handleElement,"ui-draggable-handle")},_removeHandleClassName:function(){this._removeClass(this.handleElement,"ui-draggable-handle")},_createHelper:function(t){var e=this.options,i=k.isFunction(e.helper),t=i?k(e.helper.apply(this.element[0],[t])):"clone"===e.helper?this.element.clone().removeAttr("id"):this.element;return t.parents("body").length||t.appendTo("parent"===e.appendTo?this.element[0].parentNode:e.appendTo),i&&t[0]===this.element[0]&&this._setPositionRelative(),t[0]===this.element[0]||/(fixed|absolute)/.test(t.css("position"))||t.css("position","absolute"),t},_setPositionRelative:function(){/^(?:r|a|f)/.test(this.element.css("position"))||(this.element[0].style.position="relative")},_adjustOffsetFromHelper:function(t){"string"==typeof t&&(t=t.split(" ")),k.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_isRootNode:function(t){return/(html|body)/i.test(t.tagName)||t===this.document[0]},_getParentOffset:function(){var t=this.offsetParent.offset(),e=this.document[0];return"absolute"===this.cssPosition&&this.scrollParent[0]!==e&&k.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),this._isRootNode(this.offsetParent[0])&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"!==this.cssPosition)return{top:0,left:0};var t=this.element.position(),e=this._isRootNode(this.scrollParent[0]);return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+(e?0:this.scrollParent.scrollTop()),left:t.left-(parseInt(this.helper.css("left"),10)||0)+(e?0:this.scrollParent.scrollLeft())}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t,e,i,s=this.options,n=this.document[0];this.relativeContainer=null,s.containment?"window"!==s.containment?"document"!==s.containment?s.containment.constructor!==Array?("parent"===s.containment&&(s.containment=this.helper[0].parentNode),(i=(e=k(s.containment))[0])&&(t=/(scroll|auto)/.test(e.css("overflow")),this.containment=[(parseInt(e.css("borderLeftWidth"),10)||0)+(parseInt(e.css("paddingLeft"),10)||0),(parseInt(e.css("borderTopWidth"),10)||0)+(parseInt(e.css("paddingTop"),10)||0),(t?Math.max(i.scrollWidth,i.offsetWidth):i.offsetWidth)-(parseInt(e.css("borderRightWidth"),10)||0)-(parseInt(e.css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(t?Math.max(i.scrollHeight,i.offsetHeight):i.offsetHeight)-(parseInt(e.css("borderBottomWidth"),10)||0)-(parseInt(e.css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relativeContainer=e)):this.containment=s.containment:this.containment=[0,0,k(n).width()-this.helperProportions.width-this.margins.left,(k(n).height()||n.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]:this.containment=[k(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,k(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,k(window).scrollLeft()+k(window).width()-this.helperProportions.width-this.margins.left,k(window).scrollTop()+(k(window).height()||n.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]:this.containment=null},_convertPositionTo:function(t,e){e=e||this.position;var i="absolute"===t?1:-1,t=this._isRootNode(this.scrollParent[0]);return{top:e.top+this.offset.relative.top*i+this.offset.parent.top*i-("fixed"===this.cssPosition?-this.offset.scroll.top:t?0:this.offset.scroll.top)*i,left:e.left+this.offset.relative.left*i+this.offset.parent.left*i-("fixed"===this.cssPosition?-this.offset.scroll.left:t?0:this.offset.scroll.left)*i}},_generatePosition:function(t,e){var i,s=this.options,n=this._isRootNode(this.scrollParent[0]),o=t.pageX,a=t.pageY;return n&&this.offset.scroll||(this.offset.scroll={top:this.scrollParent.scrollTop(),left:this.scrollParent.scrollLeft()}),e&&(this.containment&&(i=this.relativeContainer?(i=this.relativeContainer.offset(),[this.containment[0]+i.left,this.containment[1]+i.top,this.containment[2]+i.left,this.containment[3]+i.top]):this.containment,t.pageX-this.offset.click.left<i[0]&&(o=i[0]+this.offset.click.left),t.pageY-this.offset.click.top<i[1]&&(a=i[1]+this.offset.click.top),t.pageX-this.offset.click.left>i[2]&&(o=i[2]+this.offset.click.left),t.pageY-this.offset.click.top>i[3]&&(a=i[3]+this.offset.click.top)),s.grid&&(t=s.grid[1]?this.originalPageY+Math.round((a-this.originalPageY)/s.grid[1])*s.grid[1]:this.originalPageY,a=!i||t-this.offset.click.top>=i[1]||t-this.offset.click.top>i[3]?t:t-this.offset.click.top>=i[1]?t-s.grid[1]:t+s.grid[1],t=s.grid[0]?this.originalPageX+Math.round((o-this.originalPageX)/s.grid[0])*s.grid[0]:this.originalPageX,o=!i||t-this.offset.click.left>=i[0]||t-this.offset.click.left>i[2]?t:t-this.offset.click.left>=i[0]?t-s.grid[0]:t+s.grid[0]),"y"===s.axis&&(o=this.originalPageX),"x"===s.axis&&(a=this.originalPageY)),{top:a-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.offset.scroll.top:n?0:this.offset.scroll.top),left:o-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.offset.scroll.left:n?0:this.offset.scroll.left)}},_clear:function(){this._removeClass(this.helper,"ui-draggable-dragging"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1,this.destroyOnClear&&this.destroy()},_trigger:function(t,e,i){return i=i||this._uiHash(),k.ui.plugin.call(this,t,[e,i,this],!0),/^(drag|start|stop)/.test(t)&&(this.positionAbs=this._convertPositionTo("absolute"),i.offset=this.positionAbs),k.Widget.prototype._trigger.call(this,t,e,i)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),k.ui.plugin.add("draggable","connectToSortable",{start:function(e,t,i){var s=k.extend({},t,{item:i.element});i.sortables=[],k(i.options.connectToSortable).each(function(){var t=k(this).sortable("instance");t&&!t.options.disabled&&(i.sortables.push(t),t.refreshPositions(),t._trigger("activate",e,s))})},stop:function(e,t,i){var s=k.extend({},t,{item:i.element});i.cancelHelperRemoval=!1,k.each(i.sortables,function(){var t=this;t.isOver?(t.isOver=0,i.cancelHelperRemoval=!0,t.cancelHelperRemoval=!1,t._storedCSS={position:t.placeholder.css("position"),top:t.placeholder.css("top"),left:t.placeholder.css("left")},t._mouseStop(e),t.options.helper=t.options._helper):(t.cancelHelperRemoval=!0,t._trigger("deactivate",e,s))})},drag:function(i,s,n){k.each(n.sortables,function(){var t=!1,e=this;e.positionAbs=n.positionAbs,e.helperProportions=n.helperProportions,e.offset.click=n.offset.click,e._intersectsWith(e.containerCache)&&(t=!0,k.each(n.sortables,function(){return this.positionAbs=n.positionAbs,this.helperProportions=n.helperProportions,this.offset.click=n.offset.click,this!==e&&this._intersectsWith(this.containerCache)&&k.contains(e.element[0],this.element[0])&&(t=!1),t})),t?(e.isOver||(e.isOver=1,n._parent=s.helper.parent(),e.currentItem=s.helper.appendTo(e.element).data("ui-sortable-item",!0),e.options._helper=e.options.helper,e.options.helper=function(){return s.helper[0]},i.target=e.currentItem[0],e._mouseCapture(i,!0),e._mouseStart(i,!0,!0),e.offset.click.top=n.offset.click.top,e.offset.click.left=n.offset.click.left,e.offset.parent.left-=n.offset.parent.left-e.offset.parent.left,e.offset.parent.top-=n.offset.parent.top-e.offset.parent.top,n._trigger("toSortable",i),n.dropped=e.element,k.each(n.sortables,function(){this.refreshPositions()}),n.currentItem=n.element,e.fromOutside=n),e.currentItem&&(e._mouseDrag(i),s.position=e.position)):e.isOver&&(e.isOver=0,e.cancelHelperRemoval=!0,e.options._revert=e.options.revert,e.options.revert=!1,e._trigger("out",i,e._uiHash(e)),e._mouseStop(i,!0),e.options.revert=e.options._revert,e.options.helper=e.options._helper,e.placeholder&&e.placeholder.remove(),s.helper.appendTo(n._parent),n._refreshOffsets(i),s.position=n._generatePosition(i,!0),n._trigger("fromSortable",i),n.dropped=!1,k.each(n.sortables,function(){this.refreshPositions()}))})}}),k.ui.plugin.add("draggable","cursor",{start:function(t,e,i){var s=k("body"),i=i.options;s.css("cursor")&&(i._cursor=s.css("cursor")),s.css("cursor",i.cursor)},stop:function(t,e,i){i=i.options;i._cursor&&k("body").css("cursor",i._cursor)}}),k.ui.plugin.add("draggable","opacity",{start:function(t,e,i){e=k(e.helper),i=i.options;e.css("opacity")&&(i._opacity=e.css("opacity")),e.css("opacity",i.opacity)},stop:function(t,e,i){i=i.options;i._opacity&&k(e.helper).css("opacity",i._opacity)}}),k.ui.plugin.add("draggable","scroll",{start:function(t,e,i){i.scrollParentNotHidden||(i.scrollParentNotHidden=i.helper.scrollParent(!1)),i.scrollParentNotHidden[0]!==i.document[0]&&"HTML"!==i.scrollParentNotHidden[0].tagName&&(i.overflowOffset=i.scrollParentNotHidden.offset())},drag:function(t,e,i){var s=i.options,n=!1,o=i.scrollParentNotHidden[0],a=i.document[0];o!==a&&"HTML"!==o.tagName?(s.axis&&"x"===s.axis||(i.overflowOffset.top+o.offsetHeight-t.pageY<s.scrollSensitivity?o.scrollTop=n=o.scrollTop+s.scrollSpeed:t.pageY-i.overflowOffset.top<s.scrollSensitivity&&(o.scrollTop=n=o.scrollTop-s.scrollSpeed)),s.axis&&"y"===s.axis||(i.overflowOffset.left+o.offsetWidth-t.pageX<s.scrollSensitivity?o.scrollLeft=n=o.scrollLeft+s.scrollSpeed:t.pageX-i.overflowOffset.left<s.scrollSensitivity&&(o.scrollLeft=n=o.scrollLeft-s.scrollSpeed))):(s.axis&&"x"===s.axis||(t.pageY-k(a).scrollTop()<s.scrollSensitivity?n=k(a).scrollTop(k(a).scrollTop()-s.scrollSpeed):k(window).height()-(t.pageY-k(a).scrollTop())<s.scrollSensitivity&&(n=k(a).scrollTop(k(a).scrollTop()+s.scrollSpeed))),s.axis&&"y"===s.axis||(t.pageX-k(a).scrollLeft()<s.scrollSensitivity?n=k(a).scrollLeft(k(a).scrollLeft()-s.scrollSpeed):k(window).width()-(t.pageX-k(a).scrollLeft())<s.scrollSensitivity&&(n=k(a).scrollLeft(k(a).scrollLeft()+s.scrollSpeed)))),!1!==n&&k.ui.ddmanager&&!s.dropBehaviour&&k.ui.ddmanager.prepareOffsets(i,t)}}),k.ui.plugin.add("draggable","snap",{start:function(t,e,i){var s=i.options;i.snapElements=[],k(s.snap.constructor!==String?s.snap.items||":data(ui-draggable)":s.snap).each(function(){var t=k(this),e=t.offset();this!==i.element[0]&&i.snapElements.push({item:this,width:t.outerWidth(),height:t.outerHeight(),top:e.top,left:e.left})})},drag:function(t,e,i){for(var s,n,o,a,r,h,l,c,u,d=i.options,p=d.snapTolerance,f=e.offset.left,g=f+i.helperProportions.width,m=e.offset.top,_=m+i.helperProportions.height,v=i.snapElements.length-1;0<=v;v--)h=(r=i.snapElements[v].left-i.margins.left)+i.snapElements[v].width,c=(l=i.snapElements[v].top-i.margins.top)+i.snapElements[v].height,g<r-p||h+p<f||_<l-p||c+p<m||!k.contains(i.snapElements[v].item.ownerDocument,i.snapElements[v].item)?(i.snapElements[v].snapping&&i.options.snap.release&&i.options.snap.release.call(i.element,t,k.extend(i._uiHash(),{snapItem:i.snapElements[v].item})),i.snapElements[v].snapping=!1):("inner"!==d.snapMode&&(s=Math.abs(l-_)<=p,n=Math.abs(c-m)<=p,o=Math.abs(r-g)<=p,a=Math.abs(h-f)<=p,s&&(e.position.top=i._convertPositionTo("relative",{top:l-i.helperProportions.height,left:0}).top),n&&(e.position.top=i._convertPositionTo("relative",{top:c,left:0}).top),o&&(e.position.left=i._convertPositionTo("relative",{top:0,left:r-i.helperProportions.width}).left),a&&(e.position.left=i._convertPositionTo("relative",{top:0,left:h}).left)),u=s||n||o||a,"outer"!==d.snapMode&&(s=Math.abs(l-m)<=p,n=Math.abs(c-_)<=p,o=Math.abs(r-f)<=p,a=Math.abs(h-g)<=p,s&&(e.position.top=i._convertPositionTo("relative",{top:l,left:0}).top),n&&(e.position.top=i._convertPositionTo("relative",{top:c-i.helperProportions.height,left:0}).top),o&&(e.position.left=i._convertPositionTo("relative",{top:0,left:r}).left),a&&(e.position.left=i._convertPositionTo("relative",{top:0,left:h-i.helperProportions.width}).left)),!i.snapElements[v].snapping&&(s||n||o||a||u)&&i.options.snap.snap&&i.options.snap.snap.call(i.element,t,k.extend(i._uiHash(),{snapItem:i.snapElements[v].item})),i.snapElements[v].snapping=s||n||o||a||u)}}),k.ui.plugin.add("draggable","stack",{start:function(t,e,i){var s,i=i.options,i=k.makeArray(k(i.stack)).sort(function(t,e){return(parseInt(k(t).css("zIndex"),10)||0)-(parseInt(k(e).css("zIndex"),10)||0)});i.length&&(s=parseInt(k(i[0]).css("zIndex"),10)||0,k(i).each(function(t){k(this).css("zIndex",s+t)}),this.css("zIndex",s+i.length))}}),k.ui.plugin.add("draggable","zIndex",{start:function(t,e,i){e=k(e.helper),i=i.options;e.css("zIndex")&&(i._zIndex=e.css("zIndex")),e.css("zIndex",i.zIndex)},stop:function(t,e,i){i=i.options;i._zIndex&&k(e.helper).css("zIndex",i._zIndex)}});k.ui.draggable;k.widget("ui.droppable",{version:"1.12.1",widgetEventPrefix:"drop",options:{accept:"*",addClasses:!0,greedy:!1,scope:"default",tolerance:"intersect",activate:null,deactivate:null,drop:null,out:null,over:null},_create:function(){var t,e=this.options,i=e.accept;this.isover=!1,this.isout=!0,this.accept=k.isFunction(i)?i:function(t){return t.is(i)},this.proportions=function(){if(!arguments.length)return t||(t={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight});t=arguments[0]},this._addToManager(e.scope),e.addClasses&&this._addClass("ui-droppable")},_addToManager:function(t){k.ui.ddmanager.droppables[t]=k.ui.ddmanager.droppables[t]||[],k.ui.ddmanager.droppables[t].push(this)},_splice:function(t){for(var e=0;e<t.length;e++)t[e]===this&&t.splice(e,1)},_destroy:function(){var t=k.ui.ddmanager.droppables[this.options.scope];this._splice(t)},_setOption:function(t,e){var i;"accept"===t?this.accept=k.isFunction(e)?e:function(t){return t.is(e)}:"scope"===t&&(i=k.ui.ddmanager.droppables[this.options.scope],this._splice(i),this._addToManager(e)),this._super(t,e)},_activate:function(t){var e=k.ui.ddmanager.current;this._addActiveClass(),e&&this._trigger("activate",t,this.ui(e))},_deactivate:function(t){var e=k.ui.ddmanager.current;this._removeActiveClass(),e&&this._trigger("deactivate",t,this.ui(e))},_over:function(t){var e=k.ui.ddmanager.current;e&&(e.currentItem||e.element)[0]!==this.element[0]&&this.accept.call(this.element[0],e.currentItem||e.element)&&(this._addHoverClass(),this._trigger("over",t,this.ui(e)))},_out:function(t){var e=k.ui.ddmanager.current;e&&(e.currentItem||e.element)[0]!==this.element[0]&&this.accept.call(this.element[0],e.currentItem||e.element)&&(this._removeHoverClass(),this._trigger("out",t,this.ui(e)))},_drop:function(e,t){var i=t||k.ui.ddmanager.current,s=!1;return!(!i||(i.currentItem||i.element)[0]===this.element[0])&&(this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function(){var t=k(this).droppable("instance");if(t.options.greedy&&!t.options.disabled&&t.options.scope===i.options.scope&&t.accept.call(t.element[0],i.currentItem||i.element)&&p(i,k.extend(t,{offset:t.element.offset()}),t.options.tolerance,e))return!(s=!0)}),!s&&(!!this.accept.call(this.element[0],i.currentItem||i.element)&&(this._removeActiveClass(),this._removeHoverClass(),this._trigger("drop",e,this.ui(i)),this.element)))},ui:function(t){return{draggable:t.currentItem||t.element,helper:t.helper,position:t.position,offset:t.positionAbs}},_addHoverClass:function(){this._addClass("ui-droppable-hover")},_removeHoverClass:function(){this._removeClass("ui-droppable-hover")},_addActiveClass:function(){this._addClass("ui-droppable-active")},_removeActiveClass:function(){this._removeClass("ui-droppable-active")}});var p=k.ui.intersect=function(t,e,i,s){if(!e.offset)return!1;var n=(t.positionAbs||t.position.absolute).left+t.margins.left,o=(t.positionAbs||t.position.absolute).top+t.margins.top,a=n+t.helperProportions.width,r=o+t.helperProportions.height,h=e.offset.left,l=e.offset.top,c=h+e.proportions().width,u=l+e.proportions().height;switch(i){case"fit":return h<=n&&a<=c&&l<=o&&r<=u;case"intersect":return h<n+t.helperProportions.width/2&&a-t.helperProportions.width/2<c&&l<o+t.helperProportions.height/2&&r-t.helperProportions.height/2<u;case"pointer":return f(s.pageY,l,e.proportions().height)&&f(s.pageX,h,e.proportions().width);case"touch":return(l<=o&&o<=u||l<=r&&r<=u||o<l&&u<r)&&(h<=n&&n<=c||h<=a&&a<=c||n<h&&c<a);default:return!1}};function f(t,e,i){return e<=t&&t<e+i}!(k.ui.ddmanager={current:null,droppables:{default:[]},prepareOffsets:function(t,e){var i,s,n=k.ui.ddmanager.droppables[t.options.scope]||[],o=e?e.type:null,a=(t.currentItem||t.element).find(":data(ui-droppable)").addBack();t:for(i=0;i<n.length;i++)if(!(n[i].options.disabled||t&&!n[i].accept.call(n[i].element[0],t.currentItem||t.element))){for(s=0;s<a.length;s++)if(a[s]===n[i].element[0]){n[i].proportions().height=0;continue t}n[i].visible="none"!==n[i].element.css("display"),n[i].visible&&("mousedown"===o&&n[i]._activate.call(n[i],e),n[i].offset=n[i].element.offset(),n[i].proportions({width:n[i].element[0].offsetWidth,height:n[i].element[0].offsetHeight}))}},drop:function(t,e){var i=!1;return k.each((k.ui.ddmanager.droppables[t.options.scope]||[]).slice(),function(){this.options&&(!this.options.disabled&&this.visible&&p(t,this,this.options.tolerance,e)&&(i=this._drop.call(this,e)||i),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],t.currentItem||t.element)&&(this.isout=!0,this.isover=!1,this._deactivate.call(this,e)))}),i},dragStart:function(t,e){t.element.parentsUntil("body").on("scroll.droppable",function(){t.options.refreshPositions||k.ui.ddmanager.prepareOffsets(t,e)})},drag:function(n,o){n.options.refreshPositions&&k.ui.ddmanager.prepareOffsets(n,o),k.each(k.ui.ddmanager.droppables[n.options.scope]||[],function(){var t,e,i,s;this.options.disabled||this.greedyChild||!this.visible||(s=!(i=p(n,this,this.options.tolerance,o))&&this.isover?"isout":i&&!this.isover?"isover":null)&&(this.options.greedy&&(e=this.options.scope,(i=this.element.parents(":data(ui-droppable)").filter(function(){return k(this).droppable("instance").options.scope===e})).length&&((t=k(i[0]).droppable("instance")).greedyChild="isover"===s)),t&&"isover"===s&&(t.isover=!1,t.isout=!0,t._out.call(t,o)),this[s]=!0,this["isout"===s?"isover":"isout"]=!1,this["isover"===s?"_over":"_out"].call(this,o),t&&"isout"===s&&(t.isout=!1,t.isover=!0,t._over.call(t,o)))})},dragStop:function(t,e){t.element.parentsUntil("body").off("scroll.droppable"),t.options.refreshPositions||k.ui.ddmanager.prepareOffsets(t,e)}})!==k.uiBackCompat&&k.widget("ui.droppable",k.ui.droppable,{options:{hoverClass:!1,activeClass:!1},_addActiveClass:function(){this._super(),this.options.activeClass&&this.element.addClass(this.options.activeClass)},_removeActiveClass:function(){this._super(),this.options.activeClass&&this.element.removeClass(this.options.activeClass)},_addHoverClass:function(){this._super(),this.options.hoverClass&&this.element.addClass(this.options.hoverClass)},_removeHoverClass:function(){this._super(),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass)}});k.ui.droppable;k.widget("ui.resizable",k.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(t,e){if("hidden"===k(t).css("overflow"))return!1;var i=e&&"left"===e?"scrollLeft":"scrollTop",e=!1;return 0<t[i]||(t[i]=1,e=0<t[i],t[i]=0,e)},_create:function(){var t,e=this.options,i=this;this._addClass("ui-resizable"),k.extend(this,{_aspectRatio:!!e.aspectRatio,aspectRatio:e.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:e.helper||e.ghost||e.animate?e.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(k("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&k(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();function t(t){k(t).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){this._super(t,e),"handles"===t&&(this._removeHandles(),this._setupHandles())},_setupHandles:function(){var t,e,i,s,n,o=this.options,a=this;if(this.handles=o.handles||(k(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=k(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e<i.length;e++)s="ui-resizable-"+(t=k.trim(i[e])),n=k("<div>"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.append(n);this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=k(this.handles[e]),this._on(this.handles[e],{mousedown:a._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=k(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){a.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),a.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=k(this.handles[e])[0])!==t.target&&!k.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=k(s.containment).scrollLeft()||0,i+=k(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=k(".ui-resizable-"+this.axis).css("cursor"),k("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),k.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(k.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),k("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),s<n.maxWidth&&(n.maxWidth=s),t<n.maxHeight&&(n.maxHeight=t)),this._vBoundaries=n},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidth<t.width,n=this._isNumber(t.height)&&e.maxHeight&&e.maxHeight<t.height,o=this._isNumber(t.width)&&e.minWidth&&e.minWidth>t.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&i&&(t.top=h-e.minHeight),n&&i&&(t.top=h-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e<this._proportionallyResizeElements.length;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var t=this.element,e=this.options;this.elementOffset=t.offset(),this._helper?(this.helper=this.helper||k("<div style='overflow:hidden;'></div>"),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return k.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return k.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return k.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return k.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){k.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),k.ui.plugin.add("resizable","animate",{stop:function(e){var i=k(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,a=n?0:i.sizeDiff.width,n={width:i.size.width-a,height:i.size.height-o},a=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(k.extend(n,o&&a?{top:o,left:a}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&k(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),k.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=k(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,a=o instanceof k?o.get(0):/parent/.test(o)?e.parent().get(0):o;a&&(n.containerElement=k(a),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:k(document),left:0,top:0,width:k(document).width(),height:k(document).height()||document.body.parentNode.scrollHeight}):(i=k(a),s=[],k(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(a,"left")?a.scrollWidth:o,e=n._hasScroll(a)?a.scrollHeight:e,n.parentData={element:a,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=k(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,a={top:0,left:0},r=e.containerElement,t=!0;r[0]!==document&&/static/.test(r.css("position"))&&(a=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-a.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-a.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-a.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=k(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=k(t.helper),a=o.offset(),r=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&k(this).css({left:a.left-s.left-i.left,width:r,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&k(this).css({left:a.left-s.left-i.left,width:r,height:o})}}),k.ui.plugin.add("resizable","alsoResize",{start:function(){var t=k(this).resizable("instance").options;k(t.alsoResize).each(function(){var t=k(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=k(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,a={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};k(s.alsoResize).each(function(){var t=k(this),s=k(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];k.each(e,function(t,e){var i=(s[e]||0)+(a[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){k(this).removeData("ui-resizable-alsoresize")}}),k.ui.plugin.add("resizable","ghost",{start:function(){var t=k(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==k.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=k(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=k(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),k.ui.plugin.add("resizable","grid",{resize:function(){var t,e=k(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,a=e.axis,r="number"==typeof i.grid?[i.grid,i.grid]:i.grid,h=r[0]||1,l=r[1]||1,c=Math.round((s.width-n.width)/h)*h,u=Math.round((s.height-n.height)/l)*l,d=n.width+c,p=n.height+u,f=i.maxWidth&&i.maxWidth<d,g=i.maxHeight&&i.maxHeight<p,m=i.minWidth&&i.minWidth>d,s=i.minHeight&&i.minHeight>p;i.grid=r,m&&(d+=h),s&&(p+=l),f&&(d-=h),g&&(p-=l),/^(se|s|e)$/.test(a)?(e.size.width=d,e.size.height=p):/^(ne)$/.test(a)?(e.size.width=d,e.size.height=p,e.position.top=o.top-u):/^(sw)$/.test(a)?(e.size.width=d,e.size.height=p,e.position.left=o.left-c):((p-l<=0||d-h<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0<p-l?(e.size.height=p,e.position.top=o.top-u):(p=l-t.height,e.size.height=p,e.position.top=o.top+n.height-p),0<d-h?(e.size.width=d,e.position.left=o.left-c):(d=h-t.width,e.size.width=d,e.position.left=o.left+n.width-d))}});k.ui.resizable,k.widget("ui.selectable",k.ui.mouse,{version:"1.12.1",options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch",selected:null,selecting:null,start:null,stop:null,unselected:null,unselecting:null},_create:function(){var i=this;this._addClass("ui-selectable"),this.dragged=!1,this.refresh=function(){i.elementPos=k(i.element[0]).offset(),i.selectees=k(i.options.filter,i.element[0]),i._addClass(i.selectees,"ui-selectee"),i.selectees.each(function(){var t=k(this),e=t.offset(),e={left:e.left-i.elementPos.left,top:e.top-i.elementPos.top};k.data(this,"selectable-item",{element:this,$element:t,left:e.left,top:e.top,right:e.left+t.outerWidth(),bottom:e.top+t.outerHeight(),startselected:!1,selected:t.hasClass("ui-selected"),selecting:t.hasClass("ui-selecting"),unselecting:t.hasClass("ui-unselecting")})})},this.refresh(),this._mouseInit(),this.helper=k("<div>"),this._addClass(this.helper,"ui-selectable-helper")},_destroy:function(){this.selectees.removeData("selectable-item"),this._mouseDestroy()},_mouseStart:function(i){var s=this,t=this.options;this.opos=[i.pageX,i.pageY],this.elementPos=k(this.element[0]).offset(),this.options.disabled||(this.selectees=k(t.filter,this.element[0]),this._trigger("start",i),k(t.appendTo).append(this.helper),this.helper.css({left:i.pageX,top:i.pageY,width:0,height:0}),t.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var t=k.data(this,"selectable-item");t.startselected=!0,i.metaKey||i.ctrlKey||(s._removeClass(t.$element,"ui-selected"),t.selected=!1,s._addClass(t.$element,"ui-unselecting"),t.unselecting=!0,s._trigger("unselecting",i,{unselecting:t.element}))}),k(i.target).parents().addBack().each(function(){var t,e=k.data(this,"selectable-item");if(e)return t=!i.metaKey&&!i.ctrlKey||!e.$element.hasClass("ui-selected"),s._removeClass(e.$element,t?"ui-unselecting":"ui-selected")._addClass(e.$element,t?"ui-selecting":"ui-unselecting"),e.unselecting=!t,e.selecting=t,(e.selected=t)?s._trigger("selecting",i,{selecting:e.element}):s._trigger("unselecting",i,{unselecting:e.element}),!1}))},_mouseDrag:function(s){if(this.dragged=!0,!this.options.disabled){var t,n=this,o=this.options,a=this.opos[0],r=this.opos[1],h=s.pageX,l=s.pageY;return h<a&&(t=h,h=a,a=t),l<r&&(t=l,l=r,r=t),this.helper.css({left:a,top:r,width:h-a,height:l-r}),this.selectees.each(function(){var t=k.data(this,"selectable-item"),e=!1,i={};t&&t.element!==n.element[0]&&(i.left=t.left+n.elementPos.left,i.right=t.right+n.elementPos.left,i.top=t.top+n.elementPos.top,i.bottom=t.bottom+n.elementPos.top,"touch"===o.tolerance?e=!(i.left>h||i.right<a||i.top>l||i.bottom<r):"fit"===o.tolerance&&(e=i.left>a&&i.right<h&&i.top>r&&i.bottom<l),e?(t.selected&&(n._removeClass(t.$element,"ui-selected"),t.selected=!1),t.unselecting&&(n._removeClass(t.$element,"ui-unselecting"),t.unselecting=!1),t.selecting||(n._addClass(t.$element,"ui-selecting"),t.selecting=!0,n._trigger("selecting",s,{selecting:t.element}))):(t.selecting&&((s.metaKey||s.ctrlKey)&&t.startselected?(n._removeClass(t.$element,"ui-selecting"),t.selecting=!1,n._addClass(t.$element,"ui-selected"),t.selected=!0):(n._removeClass(t.$element,"ui-selecting"),t.selecting=!1,t.startselected&&(n._addClass(t.$element,"ui-unselecting"),t.unselecting=!0),n._trigger("unselecting",s,{unselecting:t.element}))),t.selected&&(s.metaKey||s.ctrlKey||t.startselected||(n._removeClass(t.$element,"ui-selected"),t.selected=!1,n._addClass(t.$element,"ui-unselecting"),t.unselecting=!0,n._trigger("unselecting",s,{unselecting:t.element})))))}),!1}},_mouseStop:function(e){var i=this;return this.dragged=!1,k(".ui-unselecting",this.element[0]).each(function(){var t=k.data(this,"selectable-item");i._removeClass(t.$element,"ui-unselecting"),t.unselecting=!1,t.startselected=!1,i._trigger("unselected",e,{unselected:t.element})}),k(".ui-selecting",this.element[0]).each(function(){var t=k.data(this,"selectable-item");i._removeClass(t.$element,"ui-selecting")._addClass(t.$element,"ui-selected"),t.selecting=!1,t.selected=!0,t.startselected=!0,i._trigger("selected",e,{selected:t.element})}),this._trigger("stop",e),this.helper.remove(),!1}}),k.widget("ui.sortable",k.ui.mouse,{version:"1.12.1",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_isOverAxis:function(t,e,i){return e<=t&&t<e+i},_isFloating:function(t){return/left|right/.test(t.css("float"))||/inline|table-cell/.test(t.css("display"))},_create:function(){this.containerCache={},this._addClass("ui-sortable"),this.refresh(),this.offset=this.element.offset(),this._mouseInit(),this._setHandleClassName(),this.ready=!0},_setOption:function(t,e){this._super(t,e),"handle"===t&&this._setHandleClassName()},_setHandleClassName:function(){var t=this;this._removeClass(this.element.find(".ui-sortable-handle"),"ui-sortable-handle"),k.each(this.items,function(){t._addClass(this.instance.options.handle?this.item.find(this.instance.options.handle):this.item,"ui-sortable-handle")})},_destroy:function(){this._mouseDestroy();for(var t=this.items.length-1;0<=t;t--)this.items[t].item.removeData(this.widgetName+"-item");return this},_mouseCapture:function(t,e){var i=null,s=!1,n=this;return!this.reverting&&(!this.options.disabled&&"static"!==this.options.type&&(this._refreshItems(t),k(t.target).parents().each(function(){if(k.data(this,n.widgetName+"-item")===n)return i=k(this),!1}),k.data(t.target,n.widgetName+"-item")===n&&(i=k(t.target)),!!i&&(!(this.options.handle&&!e&&(k(this.options.handle,i).find("*").addBack().each(function(){this===t.target&&(s=!0)}),!s))&&(this.currentItem=i,this._removeCurrentsFromItems(),!0))))},_mouseStart:function(t,e,i){var s,n,o=this.options;if((this.currentContainer=this).refreshPositions(),this.helper=this._createHelper(t),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},k.extend(this.offset,{click:{left:t.pageX-this.offset.left,top:t.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(t),this.originalPageX=t.pageX,this.originalPageY=t.pageY,o.cursorAt&&this._adjustOffsetFromHelper(o.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),o.containment&&this._setContainment(),o.cursor&&"auto"!==o.cursor&&(n=this.document.find("body"),this.storedCursor=n.css("cursor"),n.css("cursor",o.cursor),this.storedStylesheet=k("<style>*{ cursor: "+o.cursor+" !important; }</style>").appendTo(n)),o.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",o.opacity)),o.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",o.zIndex)),this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",t,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!i)for(s=this.containers.length-1;0<=s;s--)this.containers[s]._trigger("activate",t,this._uiHash(this));return k.ui.ddmanager&&(k.ui.ddmanager.current=this),k.ui.ddmanager&&!o.dropBehaviour&&k.ui.ddmanager.prepareOffsets(this,t),this.dragging=!0,this._addClass(this.helper,"ui-sortable-helper"),this._mouseDrag(t),!0},_mouseDrag:function(t){var e,i,s,n,o=this.options,a=!1;for(this.position=this._generatePosition(t),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-t.pageY<o.scrollSensitivity?this.scrollParent[0].scrollTop=a=this.scrollParent[0].scrollTop+o.scrollSpeed:t.pageY-this.overflowOffset.top<o.scrollSensitivity&&(this.scrollParent[0].scrollTop=a=this.scrollParent[0].scrollTop-o.scrollSpeed),this.overflowOffset.left+this.scrollParent[0].offsetWidth-t.pageX<o.scrollSensitivity?this.scrollParent[0].scrollLeft=a=this.scrollParent[0].scrollLeft+o.scrollSpeed:t.pageX-this.overflowOffset.left<o.scrollSensitivity&&(this.scrollParent[0].scrollLeft=a=this.scrollParent[0].scrollLeft-o.scrollSpeed)):(t.pageY-this.document.scrollTop()<o.scrollSensitivity?a=this.document.scrollTop(this.document.scrollTop()-o.scrollSpeed):this.window.height()-(t.pageY-this.document.scrollTop())<o.scrollSensitivity&&(a=this.document.scrollTop(this.document.scrollTop()+o.scrollSpeed)),t.pageX-this.document.scrollLeft()<o.scrollSensitivity?a=this.document.scrollLeft(this.document.scrollLeft()-o.scrollSpeed):this.window.width()-(t.pageX-this.document.scrollLeft())<o.scrollSensitivity&&(a=this.document.scrollLeft(this.document.scrollLeft()+o.scrollSpeed))),!1!==a&&k.ui.ddmanager&&!o.dropBehaviour&&k.ui.ddmanager.prepareOffsets(this,t)),this.positionAbs=this._convertPositionTo("absolute"),this.options.axis&&"y"===this.options.axis||(this.helper[0].style.left=this.position.left+"px"),this.options.axis&&"x"===this.options.axis||(this.helper[0].style.top=this.position.top+"px"),e=this.items.length-1;0<=e;e--)if(s=(i=this.items[e]).item[0],(n=this._intersectsWithPointer(i))&&i.instance===this.currentContainer&&!(s===this.currentItem[0]||this.placeholder[1===n?"next":"prev"]()[0]===s||k.contains(this.placeholder[0],s)||"semi-dynamic"===this.options.type&&k.contains(this.element[0],s))){if(this.direction=1===n?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(i))break;this._rearrange(t,i),this._trigger("change",t,this._uiHash());break}return this._contactContainers(t),k.ui.ddmanager&&k.ui.ddmanager.drag(this,t),this._trigger("sort",t,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(t,e){var i,s,n,o;if(t)return k.ui.ddmanager&&!this.options.dropBehaviour&&k.ui.ddmanager.drop(this,t),this.options.revert?(s=(i=this).placeholder.offset(),o={},(n=this.options.axis)&&"x"!==n||(o.left=s.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollLeft)),n&&"y"!==n||(o.top=s.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,k(this.helper).animate(o,parseInt(this.options.revert,10)||500,function(){i._clear(t)})):this._clear(t,e),!1},cancel:function(){if(this.dragging){this._mouseUp(new k.Event("mouseup",{target:null})),"original"===this.options.helper?(this.currentItem.css(this._storedCSS),this._removeClass(this.currentItem,"ui-sortable-helper")):this.currentItem.show();for(var t=this.containers.length-1;0<=t;t--)this.containers[t]._trigger("deactivate",null,this._uiHash(this)),this.containers[t].containerCache.over&&(this.containers[t]._trigger("out",null,this._uiHash(this)),this.containers[t].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),k.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?k(this.domPosition.prev).after(this.currentItem):k(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(e){var t=this._getItemsAsjQuery(e&&e.connected),i=[];return e=e||{},k(t).each(function(){var t=(k(e.item||this).attr(e.attribute||"id")||"").match(e.expression||/(.+)[\-=_](.+)/);t&&i.push((e.key||t[1]+"[]")+"="+(e.key&&e.expression?t[1]:t[2]))}),!i.length&&e.key&&i.push(e.key+"="),i.join("&")},toArray:function(t){var e=this._getItemsAsjQuery(t&&t.connected),i=[];return t=t||{},e.each(function(){i.push(k(t.item||this).attr(t.attribute||"id")||"")}),i},_intersectsWith:function(t){var e=this.positionAbs.left,i=e+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,o=t.left,a=o+t.width,r=t.top,h=r+t.height,l=this.offset.click.top,c=this.offset.click.left,l="x"===this.options.axis||r<s+l&&s+l<h,c="y"===this.options.axis||o<e+c&&e+c<a,c=l&&c;return"pointer"===this.options.tolerance||this.options.forcePointerForContainers||"pointer"!==this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>t[this.floating?"width":"height"]?c:o<e+this.helperProportions.width/2&&i-this.helperProportions.width/2<a&&r<s+this.helperProportions.height/2&&n-this.helperProportions.height/2<h},_intersectsWithPointer:function(t){var e="x"===this.options.axis||this._isOverAxis(this.positionAbs.top+this.offset.click.top,t.top,t.height),t="y"===this.options.axis||this._isOverAxis(this.positionAbs.left+this.offset.click.left,t.left,t.width);return!(!e||!t)&&(e=this._getDragVerticalDirection(),t=this._getDragHorizontalDirection(),this.floating?"right"===t||"down"===e?2:1:e&&("down"===e?2:1))},_intersectsWithSides:function(t){var e=this._isOverAxis(this.positionAbs.top+this.offset.click.top,t.top+t.height/2,t.height),i=this._isOverAxis(this.positionAbs.left+this.offset.click.left,t.left+t.width/2,t.width),s=this._getDragVerticalDirection(),t=this._getDragHorizontalDirection();return this.floating&&t?"right"===t&&i||"left"===t&&!i:s&&("down"===s&&e||"up"===s&&!e)},_getDragVerticalDirection:function(){var t=this.positionAbs.top-this.lastPositionAbs.top;return 0!=t&&(0<t?"down":"up")},_getDragHorizontalDirection:function(){var t=this.positionAbs.left-this.lastPositionAbs.left;return 0!=t&&(0<t?"right":"left")},refresh:function(t){return this._refreshItems(t),this._setHandleClassName(),this.refreshPositions(),this},_connectWith:function(){var t=this.options;return t.connectWith.constructor===String?[t.connectWith]:t.connectWith},_getItemsAsjQuery:function(t){var e,i,s,n,o=[],a=[],r=this._connectWith();if(r&&t)for(e=r.length-1;0<=e;e--)for(i=(s=k(r[e],this.document[0])).length-1;0<=i;i--)(n=k.data(s[i],this.widgetFullName))&&n!==this&&!n.options.disabled&&a.push([k.isFunction(n.options.items)?n.options.items.call(n.element):k(n.options.items,n.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),n]);function h(){o.push(this)}for(a.push([k.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):k(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]),e=a.length-1;0<=e;e--)a[e][0].each(h);return k(o)},_removeCurrentsFromItems:function(){var i=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=k.grep(this.items,function(t){for(var e=0;e<i.length;e++)if(i[e]===t.item[0])return!1;return!0})},_refreshItems:function(t){this.items=[],this.containers=[this];var e,i,s,n,o,a,r,h,l=this.items,c=[[k.isFunction(this.options.items)?this.options.items.call(this.element[0],t,{item:this.currentItem}):k(this.options.items,this.element),this]],u=this._connectWith();if(u&&this.ready)for(e=u.length-1;0<=e;e--)for(i=(s=k(u[e],this.document[0])).length-1;0<=i;i--)(n=k.data(s[i],this.widgetFullName))&&n!==this&&!n.options.disabled&&(c.push([k.isFunction(n.options.items)?n.options.items.call(n.element[0],t,{item:this.currentItem}):k(n.options.items,n.element),n]),this.containers.push(n));for(e=c.length-1;0<=e;e--)for(o=c[e][1],i=0,h=(a=c[e][0]).length;i<h;i++)(r=k(a[i])).data(this.widgetName+"-item",o),l.push({item:r,instance:o,width:0,height:0,left:0,top:0})},refreshPositions:function(t){var e,i,s,n;for(this.floating=!!this.items.length&&("x"===this.options.axis||this._isFloating(this.items[0].item)),this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset()),e=this.items.length-1;0<=e;e--)(i=this.items[e]).instance!==this.currentContainer&&this.currentContainer&&i.item[0]!==this.currentItem[0]||(s=this.options.toleranceElement?k(this.options.toleranceElement,i.item):i.item,t||(i.width=s.outerWidth(),i.height=s.outerHeight()),n=s.offset(),i.left=n.left,i.top=n.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(e=this.containers.length-1;0<=e;e--)n=this.containers[e].element.offset(),this.containers[e].containerCache.left=n.left,this.containers[e].containerCache.top=n.top,this.containers[e].containerCache.width=this.containers[e].element.outerWidth(),this.containers[e].containerCache.height=this.containers[e].element.outerHeight();return this},_createPlaceholder:function(i){var s,n=(i=i||this).options;n.placeholder&&n.placeholder.constructor!==String||(s=n.placeholder,n.placeholder={element:function(){var t=i.currentItem[0].nodeName.toLowerCase(),e=k("<"+t+">",i.document[0]);return i._addClass(e,"ui-sortable-placeholder",s||i.currentItem[0].className)._removeClass(e,"ui-sortable-helper"),"tbody"===t?i._createTrPlaceholder(i.currentItem.find("tr").eq(0),k("<tr>",i.document[0]).appendTo(e)):"tr"===t?i._createTrPlaceholder(i.currentItem,e):"img"===t&&e.attr("src",i.currentItem.attr("src")),s||e.css("visibility","hidden"),e},update:function(t,e){s&&!n.forcePlaceholderSize||(e.height()||e.height(i.currentItem.innerHeight()-parseInt(i.currentItem.css("paddingTop")||0,10)-parseInt(i.currentItem.css("paddingBottom")||0,10)),e.width()||e.width(i.currentItem.innerWidth()-parseInt(i.currentItem.css("paddingLeft")||0,10)-parseInt(i.currentItem.css("paddingRight")||0,10)))}}),i.placeholder=k(n.placeholder.element.call(i.element,i.currentItem)),i.currentItem.after(i.placeholder),n.placeholder.update(i,i.placeholder)},_createTrPlaceholder:function(t,e){var i=this;t.children().each(function(){k("<td>&#160;</td>",i.document[0]).attr("colspan",k(this).attr("colspan")||1).appendTo(e)})},_contactContainers:function(t){for(var e,i,s,n,o,a,r,h,l,c=null,u=null,d=this.containers.length-1;0<=d;d--)k.contains(this.currentItem[0],this.containers[d].element[0])||(this._intersectsWith(this.containers[d].containerCache)?c&&k.contains(this.containers[d].element[0],c.element[0])||(c=this.containers[d],u=d):this.containers[d].containerCache.over&&(this.containers[d]._trigger("out",t,this._uiHash(this)),this.containers[d].containerCache.over=0));if(c)if(1===this.containers.length)this.containers[u].containerCache.over||(this.containers[u]._trigger("over",t,this._uiHash(this)),this.containers[u].containerCache.over=1);else{for(i=1e4,s=null,n=(h=c.floating||this._isFloating(this.currentItem))?"left":"top",o=h?"width":"height",l=h?"pageX":"pageY",e=this.items.length-1;0<=e;e--)k.contains(this.containers[u].element[0],this.items[e].item[0])&&this.items[e].item[0]!==this.currentItem[0]&&(a=this.items[e].item.offset()[n],r=!1,t[l]-a>this.items[e][o]/2&&(r=!0),Math.abs(t[l]-a)<i&&(i=Math.abs(t[l]-a),s=this.items[e],this.direction=r?"up":"down"));(s||this.options.dropOnEmpty)&&(this.currentContainer!==this.containers[u]?(s?this._rearrange(t,s,null,!0):this._rearrange(t,null,this.containers[u].element,!0),this._trigger("change",t,this._uiHash()),this.containers[u]._trigger("change",t,this._uiHash(this)),this.currentContainer=this.containers[u],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[u]._trigger("over",t,this._uiHash(this)),this.containers[u].containerCache.over=1):this.currentContainer.containerCache.over||(this.containers[u]._trigger("over",t,this._uiHash()),this.currentContainer.containerCache.over=1))}},_createHelper:function(t){var e=this.options,t=k.isFunction(e.helper)?k(e.helper.apply(this.element[0],[t,this.currentItem])):"clone"===e.helper?this.currentItem.clone():this.currentItem;return t.parents("body").length||k("parent"!==e.appendTo?e.appendTo:this.currentItem[0].parentNode)[0].appendChild(t[0]),t[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),t[0].style.width&&!e.forceHelperSize||t.width(this.currentItem.width()),t[0].style.height&&!e.forceHelperSize||t.height(this.currentItem.height()),t},_adjustOffsetFromHelper:function(t){"string"==typeof t&&(t=t.split(" ")),k.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var t=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==this.document[0]&&k.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===this.document[0].body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&k.ui.ie)&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"!==this.cssPosition)return{top:0,left:0};var t=this.currentItem.position();return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:t.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t,e,i=this.options;"parent"===i.containment&&(i.containment=this.helper[0].parentNode),"document"!==i.containment&&"window"!==i.containment||(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,"document"===i.containment?this.document.width():this.window.width()-this.helperProportions.width-this.margins.left,("document"===i.containment?this.document.height()||document.body.parentNode.scrollHeight:this.window.height()||this.document[0].body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(i.containment)||(t=k(i.containment)[0],e=k(i.containment).offset(),i="hidden"!==k(t).css("overflow"),this.containment=[e.left+(parseInt(k(t).css("borderLeftWidth"),10)||0)+(parseInt(k(t).css("paddingLeft"),10)||0)-this.margins.left,e.top+(parseInt(k(t).css("borderTopWidth"),10)||0)+(parseInt(k(t).css("paddingTop"),10)||0)-this.margins.top,e.left+(i?Math.max(t.scrollWidth,t.offsetWidth):t.offsetWidth)-(parseInt(k(t).css("borderLeftWidth"),10)||0)-(parseInt(k(t).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,e.top+(i?Math.max(t.scrollHeight,t.offsetHeight):t.offsetHeight)-(parseInt(k(t).css("borderTopWidth"),10)||0)-(parseInt(k(t).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(t,e){e=e||this.position;var i="absolute"===t?1:-1,s="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&k.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,t=/(html|body)/i.test(s[0].tagName);return{top:e.top+this.offset.relative.top*i+this.offset.parent.top*i-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():t?0:s.scrollTop())*i,left:e.left+this.offset.relative.left*i+this.offset.parent.left*i-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():t?0:s.scrollLeft())*i}},_generatePosition:function(t){var e=this.options,i=t.pageX,s=t.pageY,n="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&k.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,o=/(html|body)/i.test(n[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(t.pageX-this.offset.click.left<this.containment[0]&&(i=this.containment[0]+this.offset.click.left),t.pageY-this.offset.click.top<this.containment[1]&&(s=this.containment[1]+this.offset.click.top),t.pageX-this.offset.click.left>this.containment[2]&&(i=this.containment[2]+this.offset.click.left),t.pageY-this.offset.click.top>this.containment[3]&&(s=this.containment[3]+this.offset.click.top)),e.grid&&(t=this.originalPageY+Math.round((s-this.originalPageY)/e.grid[1])*e.grid[1],s=!this.containment||t-this.offset.click.top>=this.containment[1]&&t-this.offset.click.top<=this.containment[3]?t:t-this.offset.click.top>=this.containment[1]?t-e.grid[1]:t+e.grid[1],t=this.originalPageX+Math.round((i-this.originalPageX)/e.grid[0])*e.grid[0],i=!this.containment||t-this.offset.click.left>=this.containment[0]&&t-this.offset.click.left<=this.containment[2]?t:t-this.offset.click.left>=this.containment[0]?t-e.grid[0]:t+e.grid[0])),{top:s-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():o?0:n.scrollTop()),left:i-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():o?0:n.scrollLeft())}},_rearrange:function(t,e,i,s){i?i[0].appendChild(this.placeholder[0]):e.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?e.item[0]:e.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(t,e){this.reverting=!1;var i,s=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(i in this._storedCSS)"auto"!==this._storedCSS[i]&&"static"!==this._storedCSS[i]||(this._storedCSS[i]="");this.currentItem.css(this._storedCSS),this._removeClass(this.currentItem,"ui-sortable-helper")}else this.currentItem.show();function n(e,i,s){return function(t){s._trigger(e,t,i._uiHash(i))}}for(this.fromOutside&&!e&&s.push(function(t){this._trigger("receive",t,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||e||s.push(function(t){this._trigger("update",t,this._uiHash())}),this!==this.currentContainer&&(e||(s.push(function(t){this._trigger("remove",t,this._uiHash())}),s.push(function(e){return function(t){e._trigger("receive",t,this._uiHash(this))}}.call(this,this.currentContainer)),s.push(function(e){return function(t){e._trigger("update",t,this._uiHash(this))}}.call(this,this.currentContainer)))),i=this.containers.length-1;0<=i;i--)e||s.push(n("deactivate",this,this.containers[i])),this.containers[i].containerCache.over&&(s.push(n("out",this,this.containers[i])),this.containers[i].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,e||this._trigger("beforeStop",t,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.cancelHelperRemoval||(this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null),!e){for(i=0;i<s.length;i++)s[i].call(this,t);this._trigger("stop",t,this._uiHash())}return this.fromOutside=!1,!this.cancelHelperRemoval},_trigger:function(){!1===k.Widget.prototype._trigger.apply(this,arguments)&&this.cancel()},_uiHash:function(t){var e=t||this;return{helper:e.helper,placeholder:e.placeholder||k([]),position:e.position,originalPosition:e.originalPosition,offset:e.positionAbs,item:e.currentItem,sender:t?t.element:null}}}),k.widget("ui.accordion",{version:"1.12.1",options:{active:0,animate:{},classes:{"ui-accordion-header":"ui-corner-top","ui-accordion-header-collapsed":"ui-corner-all","ui-accordion-content":"ui-corner-bottom"},collapsible:!1,event:"click",header:"> li > :first-child, > :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},hideProps:{borderTopWidth:"hide",borderBottomWidth:"hide",paddingTop:"hide",paddingBottom:"hide",height:"hide"},showProps:{borderTopWidth:"show",borderBottomWidth:"show",paddingTop:"show",paddingBottom:"show",height:"show"},_create:function(){var t=this.options;this.prevShow=this.prevHide=k(),this._addClass("ui-accordion","ui-widget ui-helper-reset"),this.element.attr("role","tablist"),t.collapsible||!1!==t.active&&null!=t.active||(t.active=0),this._processPanels(),t.active<0&&(t.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():k()}},_createIcons:function(){var t,e=this.options.icons;e&&(t=k("<span>"),this._addClass(t,"ui-accordion-header-icon","ui-icon "+e.header),t.prependTo(this.headers),t=this.active.children(".ui-accordion-header-icon"),this._removeClass(t,e.header)._addClass(t,null,e.activeHeader)._addClass(this.headers,"ui-accordion-icons"))},_destroyIcons:function(){this._removeClass(this.headers,"ui-accordion-icons"),this.headers.children(".ui-accordion-header-icon").remove()},_destroy:function(){var t;this.element.removeAttr("role"),this.headers.removeAttr("role aria-expanded aria-selected aria-controls tabIndex").removeUniqueId(),this._destroyIcons(),t=this.headers.next().css("display","").removeAttr("role aria-hidden aria-labelledby").removeUniqueId(),"content"!==this.options.heightStyle&&t.css("height","")},_setOption:function(t,e){"active"!==t?("event"===t&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(e)),this._super(t,e),"collapsible"!==t||e||!1!==this.options.active||this._activate(0),"icons"===t&&(this._destroyIcons(),e&&this._createIcons())):this._activate(e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t),this._toggleClass(null,"ui-state-disabled",!!t),this._toggleClass(this.headers.add(this.headers.next()),null,"ui-state-disabled",!!t)},_keydown:function(t){if(!t.altKey&&!t.ctrlKey){var e=k.ui.keyCode,i=this.headers.length,s=this.headers.index(t.target),n=!1;switch(t.keyCode){case e.RIGHT:case e.DOWN:n=this.headers[(s+1)%i];break;case e.LEFT:case e.UP:n=this.headers[(s-1+i)%i];break;case e.SPACE:case e.ENTER:this._eventHandler(t);break;case e.HOME:n=this.headers[0];break;case e.END:n=this.headers[i-1]}n&&(k(t.target).attr("tabIndex",-1),k(n).attr("tabIndex",0),k(n).trigger("focus"),t.preventDefault())}},_panelKeyDown:function(t){t.keyCode===k.ui.keyCode.UP&&t.ctrlKey&&k(t.currentTarget).prev().trigger("focus")},refresh:function(){var t=this.options;this._processPanels(),!1===t.active&&!0===t.collapsible||!this.headers.length?(t.active=!1,this.active=k()):!1===t.active?this._activate(0):this.active.length&&!k.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(t.active=!1,this.active=k()):this._activate(Math.max(0,t.active-1)):t.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){var t=this.headers,e=this.panels;this.headers=this.element.find(this.options.header),this._addClass(this.headers,"ui-accordion-header ui-accordion-header-collapsed","ui-state-default"),this.panels=this.headers.next().filter(":not(.ui-accordion-content-active)").hide(),this._addClass(this.panels,"ui-accordion-content","ui-helper-reset ui-widget-content"),e&&(this._off(t.not(this.headers)),this._off(e.not(this.panels)))},_refresh:function(){var i,t=this.options,e=t.heightStyle,s=this.element.parent();this.active=this._findActive(t.active),this._addClass(this.active,"ui-accordion-header-active","ui-state-active")._removeClass(this.active,"ui-accordion-header-collapsed"),this._addClass(this.active.next(),"ui-accordion-content-active"),this.active.next().show(),this.headers.attr("role","tab").each(function(){var t=k(this),e=t.uniqueId().attr("id"),i=t.next(),s=i.uniqueId().attr("id");t.attr("aria-controls",s),i.attr("aria-labelledby",e)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}).next().attr({"aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}).next().attr({"aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(t.event),"fill"===e?(i=s.height(),this.element.siblings(":visible").each(function(){var t=k(this),e=t.css("position");"absolute"!==e&&"fixed"!==e&&(i-=t.outerHeight(!0))}),this.headers.each(function(){i-=k(this).outerHeight(!0)}),this.headers.next().each(function(){k(this).height(Math.max(0,i-k(this).innerHeight()+k(this).height()))}).css("overflow","auto")):"auto"===e&&(i=0,this.headers.next().each(function(){var t=k(this).is(":visible");t||k(this).show(),i=Math.max(i,k(this).css("height","").height()),t||k(this).hide()}).height(i))},_activate:function(t){t=this._findActive(t)[0];t!==this.active[0]&&(t=t||this.active[0],this._eventHandler({target:t,currentTarget:t,preventDefault:k.noop}))},_findActive:function(t){return"number"==typeof t?this.headers.eq(t):k()},_setupEvents:function(t){var i={keydown:"_keydown"};t&&k.each(t.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(t){var e=this.options,i=this.active,s=k(t.currentTarget),n=s[0]===i[0],o=n&&e.collapsible,a=o?k():s.next(),r=i.next(),a={oldHeader:i,oldPanel:r,newHeader:o?k():s,newPanel:a};t.preventDefault(),n&&!e.collapsible||!1===this._trigger("beforeActivate",t,a)||(e.active=!o&&this.headers.index(s),this.active=n?k():s,this._toggle(a),this._removeClass(i,"ui-accordion-header-active","ui-state-active"),e.icons&&(i=i.children(".ui-accordion-header-icon"),this._removeClass(i,null,e.icons.activeHeader)._addClass(i,null,e.icons.header)),n||(this._removeClass(s,"ui-accordion-header-collapsed")._addClass(s,"ui-accordion-header-active","ui-state-active"),e.icons&&(n=s.children(".ui-accordion-header-icon"),this._removeClass(n,null,e.icons.header)._addClass(n,null,e.icons.activeHeader)),this._addClass(s.next(),"ui-accordion-content-active")))},_toggle:function(t){var e=t.newPanel,i=this.prevShow.length?this.prevShow:t.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=e,this.prevHide=i,this.options.animate?this._animate(e,i,t):(i.hide(),e.show(),this._toggleComplete(t)),i.attr({"aria-hidden":"true"}),i.prev().attr({"aria-selected":"false","aria-expanded":"false"}),e.length&&i.length?i.prev().attr({tabIndex:-1,"aria-expanded":"false"}):e.length&&this.headers.filter(function(){return 0===parseInt(k(this).attr("tabIndex"),10)}).attr("tabIndex",-1),e.attr("aria-hidden","false").prev().attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_animate:function(t,i,e){var s,n,o,a=this,r=0,h=t.css("box-sizing"),l=t.length&&(!i.length||t.index()<i.index()),c=this.options.animate||{},u=l&&c.down||c,l=function(){a._toggleComplete(e)};return"number"==typeof u&&(o=u),"string"==typeof u&&(n=u),n=n||u.easing||c.easing,o=o||u.duration||c.duration,i.length?t.length?(s=t.show().outerHeight(),i.animate(this.hideProps,{duration:o,easing:n,step:function(t,e){e.now=Math.round(t)}}),void t.hide().animate(this.showProps,{duration:o,easing:n,complete:l,step:function(t,e){e.now=Math.round(t),"height"!==e.prop?"content-box"===h&&(r+=e.now):"content"!==a.options.heightStyle&&(e.now=Math.round(s-i.outerHeight()-r),r=0)}})):i.animate(this.hideProps,o,n,l):t.animate(this.showProps,o,n,l)},_toggleComplete:function(t){var e=t.oldPanel,i=e.prev();this._removeClass(e,"ui-accordion-content-active"),this._removeClass(i,"ui-accordion-header-active")._addClass(i,"ui-accordion-header-collapsed"),e.length&&(e.parent()[0].className=e.parent()[0].className),this._trigger("activate",null,t)}}),k.widget("ui.menu",{version:"1.12.1",defaultElement:"<ul>",delay:300,options:{icons:{submenu:"ui-icon-caret-1-e"},items:"> *",menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().attr({role:this.options.role,tabIndex:0}),this._addClass("ui-menu","ui-widget ui-widget-content"),this._on({"mousedown .ui-menu-item":function(t){t.preventDefault()},"click .ui-menu-item":function(t){var e=k(t.target),i=k(k.ui.safeActiveElement(this.document[0]));!this.mouseHandled&&e.not(".ui-state-disabled").length&&(this.select(t),t.isPropagationStopped()||(this.mouseHandled=!0),e.has(".ui-menu").length?this.expand(t):!this.element.is(":focus")&&i.closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(t){var e,i;this.previousFilter||(e=k(t.target).closest(".ui-menu-item"),i=k(t.currentTarget),e[0]===i[0]&&(this._removeClass(i.siblings().children(".ui-state-active"),null,"ui-state-active"),this.focus(t,i)))},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(t,e){var i=this.active||this.element.find(this.options.items).eq(0);e||this.focus(t,i)},blur:function(t){this._delay(function(){k.contains(this.element[0],k.ui.safeActiveElement(this.document[0]))||this.collapseAll(t)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(t){this._closeOnDocumentClick(t)&&this.collapseAll(t),this.mouseHandled=!1}})},_destroy:function(){var t=this.element.find(".ui-menu-item").removeAttr("role aria-disabled").children(".ui-menu-item-wrapper").removeUniqueId().removeAttr("tabIndex role aria-haspopup");this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeAttr("role aria-labelledby aria-expanded aria-hidden aria-disabled tabIndex").removeUniqueId().show(),t.children().each(function(){var t=k(this);t.data("ui-menu-submenu-caret")&&t.remove()})},_keydown:function(t){var e,i,s,n=!0;switch(t.keyCode){case k.ui.keyCode.PAGE_UP:this.previousPage(t);break;case k.ui.keyCode.PAGE_DOWN:this.nextPage(t);break;case k.ui.keyCode.HOME:this._move("first","first",t);break;case k.ui.keyCode.END:this._move("last","last",t);break;case k.ui.keyCode.UP:this.previous(t);break;case k.ui.keyCode.DOWN:this.next(t);break;case k.ui.keyCode.LEFT:this.collapse(t);break;case k.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(t);break;case k.ui.keyCode.ENTER:case k.ui.keyCode.SPACE:this._activate(t);break;case k.ui.keyCode.ESCAPE:this.collapse(t);break;default:n=!1,e=this.previousFilter||"",s=!1,i=96<=t.keyCode&&t.keyCode<=105?(t.keyCode-96).toString():String.fromCharCode(t.keyCode),clearTimeout(this.filterTimer),i===e?s=!0:i=e+i,e=this._filterMenuItems(i),(e=s&&-1!==e.index(this.active.next())?this.active.nextAll(".ui-menu-item"):e).length||(i=String.fromCharCode(t.keyCode),e=this._filterMenuItems(i)),e.length?(this.focus(t,e),this.previousFilter=i,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}n&&t.preventDefault()},_activate:function(t){this.active&&!this.active.is(".ui-state-disabled")&&(this.active.children("[aria-haspopup='true']").length?this.expand(t):this.select(t))},refresh:function(){var t,e,s=this,n=this.options.icons.submenu,i=this.element.find(this.options.menus);this._toggleClass("ui-menu-icons",null,!!this.element.find(".ui-icon").length),e=i.filter(":not(.ui-menu)").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var t=k(this),e=t.prev(),i=k("<span>").data("ui-menu-submenu-caret",!0);s._addClass(i,"ui-menu-icon","ui-icon "+n),e.attr("aria-haspopup","true").prepend(i),t.attr("aria-labelledby",e.attr("id"))}),this._addClass(e,"ui-menu","ui-widget ui-widget-content ui-front"),(t=i.add(this.element).find(this.options.items)).not(".ui-menu-item").each(function(){var t=k(this);s._isDivider(t)&&s._addClass(t,"ui-menu-divider","ui-widget-content")}),i=(e=t.not(".ui-menu-item, .ui-menu-divider")).children().not(".ui-menu").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),this._addClass(e,"ui-menu-item")._addClass(i,"ui-menu-item-wrapper"),t.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!k.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(t,e){var i;"icons"===t&&(i=this.element.find(".ui-menu-icon"),this._removeClass(i,null,this.options.icons.submenu)._addClass(i,null,e.submenu)),this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",String(t)),this._toggleClass(null,"ui-state-disabled",!!t)},focus:function(t,e){var i;this.blur(t,t&&"focus"===t.type),this._scrollIntoView(e),this.active=e.first(),i=this.active.children(".ui-menu-item-wrapper"),this._addClass(i,null,"ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",i.attr("id")),i=this.active.parent().closest(".ui-menu-item").children(".ui-menu-item-wrapper"),this._addClass(i,null,"ui-state-active"),t&&"keydown"===t.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),(i=e.children(".ui-menu")).length&&t&&/^mouse/.test(t.type)&&this._startOpening(i),this.activeMenu=e.parent(),this._trigger("focus",t,{item:e})},_scrollIntoView:function(t){var e,i,s;this._hasScroll()&&(i=parseFloat(k.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(k.css(this.activeMenu[0],"paddingTop"))||0,e=t.offset().top-this.activeMenu.offset().top-i-s,i=this.activeMenu.scrollTop(),s=this.activeMenu.height(),t=t.outerHeight(),e<0?this.activeMenu.scrollTop(i+e):s<e+t&&this.activeMenu.scrollTop(i+e-s+t))},blur:function(t,e){e||clearTimeout(this.timer),this.active&&(this._removeClass(this.active.children(".ui-menu-item-wrapper"),null,"ui-state-active"),this._trigger("blur",t,{item:this.active}),this.active=null)},_startOpening:function(t){clearTimeout(this.timer),"true"===t.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(t)},this.delay))},_open:function(t){var e=k.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(t.parents(".ui-menu")).hide().attr("aria-hidden","true"),t.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(e)},collapseAll:function(e,i){clearTimeout(this.timer),this.timer=this._delay(function(){var t=i?this.element:k(e&&e.target).closest(this.element.find(".ui-menu"));t.length||(t=this.element),this._close(t),this.blur(e),this._removeClass(t.find(".ui-state-active"),null,"ui-state-active"),this.activeMenu=t},this.delay)},_close:function(t){(t=t||(this.active?this.active.parent():this.element)).find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false")},_closeOnDocumentClick:function(t){return!k(t.target).closest(".ui-menu").length},_isDivider:function(t){return!/[^\-\u2014\u2013\s]/.test(t.text())},collapse:function(t){var e=this.active&&this.active.parent().closest(".ui-menu-item",this.element);e&&e.length&&(this._close(),this.focus(t,e))},expand:function(t){var e=this.active&&this.active.children(".ui-menu ").find(this.options.items).first();e&&e.length&&(this._open(e.parent()),this._delay(function(){this.focus(t,e)}))},next:function(t){this._move("next","first",t)},previous:function(t){this._move("prev","last",t)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(t,e,i){var s;this.active&&(s="first"===t||"last"===t?this.active["first"===t?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[t+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.find(this.options.items)[e]()),this.focus(i,s)},nextPage:function(t){var e,i,s;this.active?this.isLastItem()||(this._hasScroll()?(i=this.active.offset().top,s=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return(e=k(this)).offset().top-i-s<0}),this.focus(t,e)):this.focus(t,this.activeMenu.find(this.options.items)[this.active?"last":"first"]())):this.next(t)},previousPage:function(t){var e,i,s;this.active?this.isFirstItem()||(this._hasScroll()?(i=this.active.offset().top,s=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return 0<(e=k(this)).offset().top-i+s}),this.focus(t,e)):this.focus(t,this.activeMenu.find(this.options.items).first())):this.next(t)},_hasScroll:function(){return this.element.outerHeight()<this.element.prop("scrollHeight")},select:function(t){this.active=this.active||k(t.target).closest(".ui-menu-item");var e={item:this.active};this.active.has(".ui-menu").length||this.collapseAll(t,!0),this._trigger("select",t,e)},_filterMenuItems:function(t){var t=t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&"),e=new RegExp("^"+t,"i");return this.activeMenu.find(this.options.items).filter(".ui-menu-item").filter(function(){return e.test(k.trim(k(this).children(".ui-menu-item-wrapper").text()))})}});k.widget("ui.autocomplete",{version:"1.12.1",defaultElement:"<input>",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var i,s,n,t=this.element[0].nodeName.toLowerCase(),e="textarea"===t,t="input"===t;this.isMultiLine=e||!t&&this._isContentEditable(this.element),this.valueMethod=this.element[e||t?"val":"text"],this.isNewMenu=!0,this._addClass("ui-autocomplete-input"),this.element.attr("autocomplete","off"),this._on(this.element,{keydown:function(t){if(this.element.prop("readOnly"))s=n=i=!0;else{s=n=i=!1;var e=k.ui.keyCode;switch(t.keyCode){case e.PAGE_UP:i=!0,this._move("previousPage",t);break;case e.PAGE_DOWN:i=!0,this._move("nextPage",t);break;case e.UP:i=!0,this._keyEvent("previous",t);break;case e.DOWN:i=!0,this._keyEvent("next",t);break;case e.ENTER:this.menu.active&&(i=!0,t.preventDefault(),this.menu.select(t));break;case e.TAB:this.menu.active&&this.menu.select(t);break;case e.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(t),t.preventDefault());break;default:s=!0,this._searchTimeout(t)}}},keypress:function(t){if(i)return i=!1,void(this.isMultiLine&&!this.menu.element.is(":visible")||t.preventDefault());if(!s){var e=k.ui.keyCode;switch(t.keyCode){case e.PAGE_UP:this._move("previousPage",t);break;case e.PAGE_DOWN:this._move("nextPage",t);break;case e.UP:this._keyEvent("previous",t);break;case e.DOWN:this._keyEvent("next",t)}}},input:function(t){if(n)return n=!1,void t.preventDefault();this._searchTimeout(t)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(t){this.cancelBlur?delete this.cancelBlur:(clearTimeout(this.searching),this.close(t),this._change(t))}}),this._initSource(),this.menu=k("<ul>").appendTo(this._appendTo()).menu({role:null}).hide().menu("instance"),this._addClass(this.menu.element,"ui-autocomplete","ui-front"),this._on(this.menu.element,{mousedown:function(t){t.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,this.element[0]!==k.ui.safeActiveElement(this.document[0])&&this.element.trigger("focus")})},menufocus:function(t,e){var i;if(this.isNewMenu&&(this.isNewMenu=!1,t.originalEvent&&/^mouse/.test(t.originalEvent.type)))return this.menu.blur(),void this.document.one("mousemove",function(){k(t.target).trigger(t.originalEvent)});i=e.item.data("ui-autocomplete-item"),!1!==this._trigger("focus",t,{item:i})&&t.originalEvent&&/^key/.test(t.originalEvent.type)&&this._value(i.value),(i=e.item.attr("aria-label")||i.value)&&k.trim(i).length&&(this.liveRegion.children().hide(),k("<div>").text(i).appendTo(this.liveRegion))},menuselect:function(t,e){var i=e.item.data("ui-autocomplete-item"),s=this.previous;this.element[0]!==k.ui.safeActiveElement(this.document[0])&&(this.element.trigger("focus"),this.previous=s,this._delay(function(){this.previous=s,this.selectedItem=i})),!1!==this._trigger("select",t,{item:i})&&this._value(i.value),this.term=this._value(),this.close(t),this.selectedItem=i}}),this.liveRegion=k("<div>",{role:"status","aria-live":"assertive","aria-relevant":"additions"}).appendTo(this.document[0].body),this._addClass(this.liveRegion,null,"ui-helper-hidden-accessible"),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(t,e){this._super(t,e),"source"===t&&this._initSource(),"appendTo"===t&&this.menu.element.appendTo(this._appendTo()),"disabled"===t&&e&&this.xhr&&this.xhr.abort()},_isEventTargetInWidget:function(t){var e=this.menu.element[0];return t.target===this.element[0]||t.target===e||k.contains(e,t.target)},_closeOnClickOutside:function(t){this._isEventTargetInWidget(t)||this.close()},_appendTo:function(){var t=this.options.appendTo;return(t=t&&(t.jquery||t.nodeType?k(t):this.document.find(t).eq(0)))&&t[0]||(t=this.element.closest(".ui-front, dialog")),t.length||(t=this.document[0].body),t},_initSource:function(){var i,s,n=this;k.isArray(this.options.source)?(i=this.options.source,this.source=function(t,e){e(k.ui.autocomplete.filter(i,t.term))}):"string"==typeof this.options.source?(s=this.options.source,this.source=function(t,e){n.xhr&&n.xhr.abort(),n.xhr=k.ajax({url:s,data:t,dataType:"json",success:function(t){e(t)},error:function(){e([])}})}):this.source=this.options.source},_searchTimeout:function(s){clearTimeout(this.searching),this.searching=this._delay(function(){var t=this.term===this._value(),e=this.menu.element.is(":visible"),i=s.altKey||s.ctrlKey||s.metaKey||s.shiftKey;t&&(!t||e||i)||(this.selectedItem=null,this.search(null,s))},this.options.delay)},search:function(t,e){return t=null!=t?t:this._value(),this.term=this._value(),t.length<this.options.minLength?this.close(e):!1!==this._trigger("search",e)?this._search(t):void 0},_search:function(t){this.pending++,this._addClass("ui-autocomplete-loading"),this.cancelSearch=!1,this.source({term:t},this._response())},_response:function(){var e=++this.requestIndex;return k.proxy(function(t){e===this.requestIndex&&this.__response(t),this.pending--,this.pending||this._removeClass("ui-autocomplete-loading")},this)},__response:function(t){t=t&&this._normalize(t),this._trigger("response",null,{content:t}),!this.options.disabled&&t&&t.length&&!this.cancelSearch?(this._suggest(t),this._trigger("open")):this._close()},close:function(t){this.cancelSearch=!0,this._close(t)},_close:function(t){this._off(this.document,"mousedown"),this.menu.element.is(":visible")&&(this.menu.element.hide(),this.menu.blur(),this.isNewMenu=!0,this._trigger("close",t))},_change:function(t){this.previous!==this._value()&&this._trigger("change",t,{item:this.selectedItem})},_normalize:function(t){return t.length&&t[0].label&&t[0].value?t:k.map(t,function(t){return"string"==typeof t?{label:t,value:t}:k.extend({},t,{label:t.label||t.value,value:t.value||t.label})})},_suggest:function(t){var e=this.menu.element.empty();this._renderMenu(e,t),this.isNewMenu=!0,this.menu.refresh(),e.show(),this._resizeMenu(),e.position(k.extend({of:this.element},this.options.position)),this.options.autoFocus&&this.menu.next(),this._on(this.document,{mousedown:"_closeOnClickOutside"})},_resizeMenu:function(){var t=this.menu.element;t.outerWidth(Math.max(t.width("").outerWidth()+1,this.element.outerWidth()))},_renderMenu:function(i,t){var s=this;k.each(t,function(t,e){s._renderItemData(i,e)})},_renderItemData:function(t,e){return this._renderItem(t,e).data("ui-autocomplete-item",e)},_renderItem:function(t,e){return k("<li>").append(k("<div>").text(e.label)).appendTo(t)},_move:function(t,e){if(this.menu.element.is(":visible"))return this.menu.isFirstItem()&&/^previous/.test(t)||this.menu.isLastItem()&&/^next/.test(t)?(this.isMultiLine||this._value(this.term),void this.menu.blur()):void this.menu[t](e);this.search(null,e)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(t,e){this.isMultiLine&&!this.menu.element.is(":visible")||(this._move(t,e),e.preventDefault())},_isContentEditable:function(t){if(!t.length)return!1;var e=t.prop("contentEditable");return"inherit"===e?this._isContentEditable(t.parent()):"true"===e}}),k.extend(k.ui.autocomplete,{escapeRegex:function(t){return t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(t,e){var i=new RegExp(k.ui.autocomplete.escapeRegex(e),"i");return k.grep(t,function(t){return i.test(t.label||t.value||t)})}}),k.widget("ui.autocomplete",k.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(t){return t+(1<t?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(t){var e;this._superApply(arguments),this.options.disabled||this.cancelSearch||(e=t&&t.length?this.options.messages.results(t.length):this.options.messages.noResults,this.liveRegion.children().hide(),k("<div>").text(e).appendTo(this.liveRegion))}});k.ui.autocomplete;var g=/ui-corner-([a-z]){2,6}/g;k.widget("ui.controlgroup",{version:"1.12.1",defaultElement:"<div>",options:{direction:"horizontal",disabled:null,onlyVisible:!0,items:{button:"input[type=button], input[type=submit], input[type=reset], button, a",controlgroupLabel:".ui-controlgroup-label",checkboxradio:"input[type='checkbox'], input[type='radio']",selectmenu:"select",spinner:".ui-spinner-input"}},_create:function(){this._enhance()},_enhance:function(){this.element.attr("role","toolbar"),this.refresh()},_destroy:function(){this._callChildMethod("destroy"),this.childWidgets.removeData("ui-controlgroup-data"),this.element.removeAttr("role"),this.options.items.controlgroupLabel&&this.element.find(this.options.items.controlgroupLabel).find(".ui-controlgroup-label-contents").contents().unwrap()},_initWidgets:function(){var o=this,a=[];k.each(this.options.items,function(s,t){var e,n={};if(t)return"controlgroupLabel"===s?((e=o.element.find(t)).each(function(){var t=k(this);t.children(".ui-controlgroup-label-contents").length||t.contents().wrapAll("<span class='ui-controlgroup-label-contents'></span>")}),o._addClass(e,null,"ui-widget ui-widget-content ui-state-default"),void(a=a.concat(e.get()))):void(k.fn[s]&&(n=o["_"+s+"Options"]?o["_"+s+"Options"]("middle"):{classes:{}},o.element.find(t).each(function(){var t=k(this),e=t[s]("instance"),i=k.widget.extend({},n);"button"===s&&t.parent(".ui-spinner").length||((e=e||t[s]()[s]("instance"))&&(i.classes=o._resolveClassesValues(i.classes,e)),t[s](i),i=t[s]("widget"),k.data(i[0],"ui-controlgroup-data",e||t[s]("instance")),a.push(i[0]))})))}),this.childWidgets=k(k.unique(a)),this._addClass(this.childWidgets,"ui-controlgroup-item")},_callChildMethod:function(e){this.childWidgets.each(function(){var t=k(this).data("ui-controlgroup-data");t&&t[e]&&t[e]()})},_updateCornerClass:function(t,e){e=this._buildSimpleOptions(e,"label").classes.label;this._removeClass(t,null,"ui-corner-top ui-corner-bottom ui-corner-left ui-corner-right ui-corner-all"),this._addClass(t,null,e)},_buildSimpleOptions:function(t,e){var i="vertical"===this.options.direction,s={classes:{}};return s.classes[e]={middle:"",first:"ui-corner-"+(i?"top":"left"),last:"ui-corner-"+(i?"bottom":"right"),only:"ui-corner-all"}[t],s},_spinnerOptions:function(t){t=this._buildSimpleOptions(t,"ui-spinner");return t.classes["ui-spinner-up"]="",t.classes["ui-spinner-down"]="",t},_buttonOptions:function(t){return this._buildSimpleOptions(t,"ui-button")},_checkboxradioOptions:function(t){return this._buildSimpleOptions(t,"ui-checkboxradio-label")},_selectmenuOptions:function(t){var e="vertical"===this.options.direction;return{width:e&&"auto",classes:{middle:{"ui-selectmenu-button-open":"","ui-selectmenu-button-closed":""},first:{"ui-selectmenu-button-open":"ui-corner-"+(e?"top":"tl"),"ui-selectmenu-button-closed":"ui-corner-"+(e?"top":"left")},last:{"ui-selectmenu-button-open":e?"":"ui-corner-tr","ui-selectmenu-button-closed":"ui-corner-"+(e?"bottom":"right")},only:{"ui-selectmenu-button-open":"ui-corner-top","ui-selectmenu-button-closed":"ui-corner-all"}}[t]}},_resolveClassesValues:function(i,s){var n={};return k.each(i,function(t){var e=s.options.classes[t]||"",e=k.trim(e.replace(g,""));n[t]=(e+" "+i[t]).replace(/\s+/g," ")}),n},_setOption:function(t,e){"direction"===t&&this._removeClass("ui-controlgroup-"+this.options.direction),this._super(t,e),"disabled"!==t?this.refresh():this._callChildMethod(e?"disable":"enable")},refresh:function(){var n,o=this;this._addClass("ui-controlgroup ui-controlgroup-"+this.options.direction),"horizontal"===this.options.direction&&this._addClass(null,"ui-helper-clearfix"),this._initWidgets(),n=this.childWidgets,this.options.onlyVisible&&(n=n.filter(":visible")),n.length&&(k.each(["first","last"],function(t,e){var i,s=n[e]().data("ui-controlgroup-data");s&&o["_"+s.widgetName+"Options"]?((i=o["_"+s.widgetName+"Options"](1===n.length?"only":e)).classes=o._resolveClassesValues(i.classes,s),s.element[s.widgetName](i)):o._updateCornerClass(n[e](),e)}),this._callChildMethod("refresh"))}});k.widget("ui.checkboxradio",[k.ui.formResetMixin,{version:"1.12.1",options:{disabled:null,label:null,icon:!0,classes:{"ui-checkboxradio-label":"ui-corner-all","ui-checkboxradio-icon":"ui-corner-all"}},_getCreateOptions:function(){var t,e=this,i=this._super()||{};return this._readType(),t=this.element.labels(),this.label=k(t[t.length-1]),this.label.length||k.error("No label found for checkboxradio widget"),this.originalLabel="",this.label.contents().not(this.element[0]).each(function(){e.originalLabel+=3===this.nodeType?k(this).text():this.outerHTML}),this.originalLabel&&(i.label=this.originalLabel),null!=(t=this.element[0].disabled)&&(i.disabled=t),i},_create:function(){var t=this.element[0].checked;this._bindFormResetHandler(),null==this.options.disabled&&(this.options.disabled=this.element[0].disabled),this._setOption("disabled",this.options.disabled),this._addClass("ui-checkboxradio","ui-helper-hidden-accessible"),this._addClass(this.label,"ui-checkboxradio-label","ui-button ui-widget"),"radio"===this.type&&this._addClass(this.label,"ui-checkboxradio-radio-label"),this.options.label&&this.options.label!==this.originalLabel?this._updateLabel():this.originalLabel&&(this.options.label=this.originalLabel),this._enhance(),t&&(this._addClass(this.label,"ui-checkboxradio-checked","ui-state-active"),this.icon&&this._addClass(this.icon,null,"ui-state-hover")),this._on({change:"_toggleClasses",focus:function(){this._addClass(this.label,null,"ui-state-focus ui-visual-focus")},blur:function(){this._removeClass(this.label,null,"ui-state-focus ui-visual-focus")}})},_readType:function(){var t=this.element[0].nodeName.toLowerCase();this.type=this.element[0].type,"input"===t&&/radio|checkbox/.test(this.type)||k.error("Can't create checkboxradio on element.nodeName="+t+" and element.type="+this.type)},_enhance:function(){this._updateIcon(this.element[0].checked)},widget:function(){return this.label},_getRadioGroup:function(){var t=this.element[0].name,e="input[name='"+k.ui.escapeSelector(t)+"']";return t?(this.form.length?k(this.form[0].elements).filter(e):k(e).filter(function(){return 0===k(this).form().length})).not(this.element):k([])},_toggleClasses:function(){var t=this.element[0].checked;this._toggleClass(this.label,"ui-checkboxradio-checked","ui-state-active",t),this.options.icon&&"checkbox"===this.type&&this._toggleClass(this.icon,null,"ui-icon-check ui-state-checked",t)._toggleClass(this.icon,null,"ui-icon-blank",!t),"radio"===this.type&&this._getRadioGroup().each(function(){var t=k(this).checkboxradio("instance");t&&t._removeClass(t.label,"ui-checkboxradio-checked","ui-state-active")})},_destroy:function(){this._unbindFormResetHandler(),this.icon&&(this.icon.remove(),this.iconSpace.remove())},_setOption:function(t,e){if("label"!==t||e){if(this._super(t,e),"disabled"===t)return this._toggleClass(this.label,null,"ui-state-disabled",e),void(this.element[0].disabled=e);this.refresh()}},_updateIcon:function(t){var e="ui-icon ui-icon-background ";this.options.icon?(this.icon||(this.icon=k("<span>"),this.iconSpace=k("<span> </span>"),this._addClass(this.iconSpace,"ui-checkboxradio-icon-space")),"checkbox"===this.type?(e+=t?"ui-icon-check ui-state-checked":"ui-icon-blank",this._removeClass(this.icon,null,t?"ui-icon-blank":"ui-icon-check")):e+="ui-icon-blank",this._addClass(this.icon,"ui-checkboxradio-icon",e),t||this._removeClass(this.icon,null,"ui-icon-check ui-state-checked"),this.icon.prependTo(this.label).after(this.iconSpace)):void 0!==this.icon&&(this.icon.remove(),this.iconSpace.remove(),delete this.icon)},_updateLabel:function(){var t=this.label.contents().not(this.element[0]);this.icon&&(t=t.not(this.icon[0])),this.iconSpace&&(t=t.not(this.iconSpace[0])),t.remove(),this.label.append(this.options.label)},refresh:function(){var t=this.element[0].checked,e=this.element[0].disabled;this._updateIcon(t),this._toggleClass(this.label,"ui-checkboxradio-checked","ui-state-active",t),null!==this.options.label&&this._updateLabel(),e!==this.options.disabled&&this._setOptions({disabled:e})}}]);var m;k.ui.checkboxradio;k.widget("ui.button",{version:"1.12.1",defaultElement:"<button>",options:{classes:{"ui-button":"ui-corner-all"},disabled:null,icon:null,iconPosition:"beginning",label:null,showLabel:!0},_getCreateOptions:function(){var t,e=this._super()||{};return this.isInput=this.element.is("input"),null!=(t=this.element[0].disabled)&&(e.disabled=t),this.originalLabel=this.isInput?this.element.val():this.element.html(),this.originalLabel&&(e.label=this.originalLabel),e},_create:function(){!this.option.showLabel&!this.options.icon&&(this.options.showLabel=!0),null==this.options.disabled&&(this.options.disabled=this.element[0].disabled||!1),this.hasTitle=!!this.element.attr("title"),this.options.label&&this.options.label!==this.originalLabel&&(this.isInput?this.element.val(this.options.label):this.element.html(this.options.label)),this._addClass("ui-button","ui-widget"),this._setOption("disabled",this.options.disabled),this._enhance(),this.element.is("a")&&this._on({keyup:function(t){t.keyCode===k.ui.keyCode.SPACE&&(t.preventDefault(),this.element[0].click?this.element[0].click():this.element.trigger("click"))}})},_enhance:function(){this.element.is("button")||this.element.attr("role","button"),this.options.icon&&(this._updateIcon("icon",this.options.icon),this._updateTooltip())},_updateTooltip:function(){this.title=this.element.attr("title"),this.options.showLabel||this.title||this.element.attr("title",this.options.label)},_updateIcon:function(t,e){var i="iconPosition"!==t,s=i?this.options.iconPosition:e,t="top"===s||"bottom"===s;this.icon?i&&this._removeClass(this.icon,null,this.options.icon):(this.icon=k("<span>"),this._addClass(this.icon,"ui-button-icon","ui-icon"),this.options.showLabel||this._addClass("ui-button-icon-only")),i&&this._addClass(this.icon,null,e),this._attachIcon(s),t?(this._addClass(this.icon,null,"ui-widget-icon-block"),this.iconSpace&&this.iconSpace.remove()):(this.iconSpace||(this.iconSpace=k("<span> </span>"),this._addClass(this.iconSpace,"ui-button-icon-space")),this._removeClass(this.icon,null,"ui-wiget-icon-block"),this._attachIconSpace(s))},_destroy:function(){this.element.removeAttr("role"),this.icon&&this.icon.remove(),this.iconSpace&&this.iconSpace.remove(),this.hasTitle||this.element.removeAttr("title")},_attachIconSpace:function(t){this.icon[/^(?:end|bottom)/.test(t)?"before":"after"](this.iconSpace)},_attachIcon:function(t){this.element[/^(?:end|bottom)/.test(t)?"append":"prepend"](this.icon)},_setOptions:function(t){var e=(void 0===t.showLabel?this.options:t).showLabel,i=(void 0===t.icon?this.options:t).icon;e||i||(t.showLabel=!0),this._super(t)},_setOption:function(t,e){"icon"===t&&(e?this._updateIcon(t,e):this.icon&&(this.icon.remove(),this.iconSpace&&this.iconSpace.remove())),"iconPosition"===t&&this._updateIcon(t,e),"showLabel"===t&&(this._toggleClass("ui-button-icon-only",null,!e),this._updateTooltip()),"label"===t&&(this.isInput?this.element.val(e):(this.element.html(e),this.icon&&(this._attachIcon(this.options.iconPosition),this._attachIconSpace(this.options.iconPosition)))),this._super(t,e),"disabled"===t&&(this._toggleClass(null,"ui-state-disabled",e),(this.element[0].disabled=e)&&this.element.blur())},refresh:function(){var t=this.element.is("input, button")?this.element[0].disabled:this.element.hasClass("ui-button-disabled");t!==this.options.disabled&&this._setOptions({disabled:t}),this._updateTooltip()}}),!1!==k.uiBackCompat&&(k.widget("ui.button",k.ui.button,{options:{text:!0,icons:{primary:null,secondary:null}},_create:function(){this.options.showLabel&&!this.options.text&&(this.options.showLabel=this.options.text),!this.options.showLabel&&this.options.text&&(this.options.text=this.options.showLabel),this.options.icon||!this.options.icons.primary&&!this.options.icons.secondary?this.options.icon&&(this.options.icons.primary=this.options.icon):this.options.icons.primary?this.options.icon=this.options.icons.primary:(this.options.icon=this.options.icons.secondary,this.options.iconPosition="end"),this._super()},_setOption:function(t,e){"text"!==t?("showLabel"===t&&(this.options.text=e),"icon"===t&&(this.options.icons.primary=e),"icons"===t&&(e.primary?(this._super("icon",e.primary),this._super("iconPosition","beginning")):e.secondary&&(this._super("icon",e.secondary),this._super("iconPosition","end"))),this._superApply(arguments)):this._super("showLabel",e)}}),k.fn.button=(m=k.fn.button,function(){return!this.length||this.length&&"INPUT"!==this[0].tagName||this.length&&"INPUT"===this[0].tagName&&"checkbox"!==this.attr("type")&&"radio"!==this.attr("type")?m.apply(this,arguments):(k.ui.checkboxradio||k.error("Checkboxradio widget missing"),0===arguments.length?this.checkboxradio({icon:!1}):this.checkboxradio.apply(this,arguments))}),k.fn.buttonset=function(){return k.ui.controlgroup||k.error("Controlgroup widget missing"),"option"===arguments[0]&&"items"===arguments[1]&&arguments[2]?this.controlgroup.apply(this,[arguments[0],"items.button",arguments[2]]):"option"===arguments[0]&&"items"===arguments[1]?this.controlgroup.apply(this,[arguments[0],"items.button"]):("object"==typeof arguments[0]&&arguments[0].items&&(arguments[0].items={button:arguments[0].items}),this.controlgroup.apply(this,arguments))});var _;k.ui.button;function v(){this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},k.extend(this._defaults,this.regional[""]),this.regional.en=k.extend(!0,{},this.regional[""]),this.regional["en-US"]=k.extend(!0,{},this.regional.en),this.dpDiv=b(k("<div id='"+this._mainDivId+"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"))}function b(t){var e="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return t.on("mouseout",e,function(){k(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&k(this).removeClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&k(this).removeClass("ui-datepicker-next-hover")}).on("mouseover",e,y)}function y(){k.datepicker._isDisabledDatepicker((_.inline?_.dpDiv.parent():_.input)[0])||(k(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),k(this).addClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&k(this).addClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&k(this).addClass("ui-datepicker-next-hover"))}function w(t,e){for(var i in k.extend(t,e),e)null==e[i]&&(t[i]=e[i]);return t}k.extend(k.ui,{datepicker:{version:"1.12.1"}}),k.extend(v.prototype,{markerClassName:"hasDatepicker",maxRows:4,_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(t){return w(this._defaults,t||{}),this},_attachDatepicker:function(t,e){var i,s=t.nodeName.toLowerCase(),n="div"===s||"span"===s;t.id||(this.uuid+=1,t.id="dp"+this.uuid),(i=this._newInst(k(t),n)).settings=k.extend({},e||{}),"input"===s?this._connectDatepicker(t,i):n&&this._inlineDatepicker(t,i)},_newInst:function(t,e){return{id:t[0].id.replace(/([^A-Za-z0-9_\-])/g,"\\\\$1"),input:t,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:e,dpDiv:e?b(k("<div class='"+this._inlineClass+" ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")):this.dpDiv}},_connectDatepicker:function(t,e){var i=k(t);e.append=k([]),e.trigger=k([]),i.hasClass(this.markerClassName)||(this._attachments(i,e),i.addClass(this.markerClassName).on("keydown",this._doKeyDown).on("keypress",this._doKeyPress).on("keyup",this._doKeyUp),this._autoSize(e),k.data(t,"datepicker",e),e.settings.disabled&&this._disableDatepicker(t))},_attachments:function(t,e){var i,s=this._get(e,"appendText"),n=this._get(e,"isRTL");e.append&&e.append.remove(),s&&(e.append=k("<span class='"+this._appendClass+"'>"+s+"</span>"),t[n?"before":"after"](e.append)),t.off("focus",this._showDatepicker),e.trigger&&e.trigger.remove(),"focus"!==(i=this._get(e,"showOn"))&&"both"!==i||t.on("focus",this._showDatepicker),"button"!==i&&"both"!==i||(s=this._get(e,"buttonText"),i=this._get(e,"buttonImage"),e.trigger=k(this._get(e,"buttonImageOnly")?k("<img/>").addClass(this._triggerClass).attr({src:i,alt:s,title:s}):k("<button type='button'></button>").addClass(this._triggerClass).html(i?k("<img/>").attr({src:i,alt:s,title:s}):s)),t[n?"before":"after"](e.trigger),e.trigger.on("click",function(){return k.datepicker._datepickerShowing&&k.datepicker._lastInput===t[0]?k.datepicker._hideDatepicker():(k.datepicker._datepickerShowing&&k.datepicker._lastInput!==t[0]&&k.datepicker._hideDatepicker(),k.datepicker._showDatepicker(t[0])),!1}))},_autoSize:function(t){var e,i,s,n,o,a;this._get(t,"autoSize")&&!t.inline&&(o=new Date(2009,11,20),(a=this._get(t,"dateFormat")).match(/[DM]/)&&(e=function(t){for(n=s=i=0;n<t.length;n++)t[n].length>i&&(i=t[n].length,s=n);return s},o.setMonth(e(this._get(t,a.match(/MM/)?"monthNames":"monthNamesShort"))),o.setDate(e(this._get(t,a.match(/DD/)?"dayNames":"dayNamesShort"))+20-o.getDay())),t.input.attr("size",this._formatDate(t,o).length))},_inlineDatepicker:function(t,e){var i=k(t);i.hasClass(this.markerClassName)||(i.addClass(this.markerClassName).append(e.dpDiv),k.data(t,"datepicker",e),this._setDate(e,this._getDefaultDate(e),!0),this._updateDatepicker(e),this._updateAlternate(e),e.settings.disabled&&this._disableDatepicker(t),e.dpDiv.css("display","block"))},_dialogDatepicker:function(t,e,i,s,n){var o,a=this._dialogInst;return a||(this.uuid+=1,o="dp"+this.uuid,this._dialogInput=k("<input type='text' id='"+o+"' style='position: absolute; top: -100px; width: 0px;'/>"),this._dialogInput.on("keydown",this._doKeyDown),k("body").append(this._dialogInput),(a=this._dialogInst=this._newInst(this._dialogInput,!1)).settings={},k.data(this._dialogInput[0],"datepicker",a)),w(a.settings,s||{}),e=e&&e.constructor===Date?this._formatDate(a,e):e,this._dialogInput.val(e),this._pos=n?n.length?n:[n.pageX,n.pageY]:null,this._pos||(o=document.documentElement.clientWidth,s=document.documentElement.clientHeight,e=document.documentElement.scrollLeft||document.body.scrollLeft,n=document.documentElement.scrollTop||document.body.scrollTop,this._pos=[o/2-100+e,s/2-150+n]),this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),a.settings.onSelect=i,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),k.blockUI&&k.blockUI(this.dpDiv),k.data(this._dialogInput[0],"datepicker",a),this},_destroyDatepicker:function(t){var e,i=k(t),s=k.data(t,"datepicker");i.hasClass(this.markerClassName)&&(e=t.nodeName.toLowerCase(),k.removeData(t,"datepicker"),"input"===e?(s.append.remove(),s.trigger.remove(),i.removeClass(this.markerClassName).off("focus",this._showDatepicker).off("keydown",this._doKeyDown).off("keypress",this._doKeyPress).off("keyup",this._doKeyUp)):"div"!==e&&"span"!==e||i.removeClass(this.markerClassName).empty(),_===s&&(_=null))},_enableDatepicker:function(e){var t,i=k(e),s=k.data(e,"datepicker");i.hasClass(this.markerClassName)&&("input"===(t=e.nodeName.toLowerCase())?(e.disabled=!1,s.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""})):"div"!==t&&"span"!==t||((i=i.children("."+this._inlineClass)).children().removeClass("ui-state-disabled"),i.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!1)),this._disabledInputs=k.map(this._disabledInputs,function(t){return t===e?null:t}))},_disableDatepicker:function(e){var t,i=k(e),s=k.data(e,"datepicker");i.hasClass(this.markerClassName)&&("input"===(t=e.nodeName.toLowerCase())?(e.disabled=!0,s.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"})):"div"!==t&&"span"!==t||((i=i.children("."+this._inlineClass)).children().addClass("ui-state-disabled"),i.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!0)),this._disabledInputs=k.map(this._disabledInputs,function(t){return t===e?null:t}),this._disabledInputs[this._disabledInputs.length]=e)},_isDisabledDatepicker:function(t){if(!t)return!1;for(var e=0;e<this._disabledInputs.length;e++)if(this._disabledInputs[e]===t)return!0;return!1},_getInst:function(t){try{return k.data(t,"datepicker")}catch(t){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(t,e,i){var s,n,o,a,r=this._getInst(t);if(2===arguments.length&&"string"==typeof e)return"defaults"===e?k.extend({},k.datepicker._defaults):r?"all"===e?k.extend({},r.settings):this._get(r,e):null;s=e||{},"string"==typeof e&&((s={})[e]=i),r&&(this._curInst===r&&this._hideDatepicker(),n=this._getDateDatepicker(t,!0),o=this._getMinMaxDate(r,"min"),a=this._getMinMaxDate(r,"max"),w(r.settings,s),null!==o&&void 0!==s.dateFormat&&void 0===s.minDate&&(r.settings.minDate=this._formatDate(r,o)),null!==a&&void 0!==s.dateFormat&&void 0===s.maxDate&&(r.settings.maxDate=this._formatDate(r,a)),"disabled"in s&&(s.disabled?this._disableDatepicker(t):this._enableDatepicker(t)),this._attachments(k(t),r),this._autoSize(r),this._setDate(r,n),this._updateAlternate(r),this._updateDatepicker(r))},_changeDatepicker:function(t,e,i){this._optionDatepicker(t,e,i)},_refreshDatepicker:function(t){t=this._getInst(t);t&&this._updateDatepicker(t)},_setDateDatepicker:function(t,e){t=this._getInst(t);t&&(this._setDate(t,e),this._updateDatepicker(t),this._updateAlternate(t))},_getDateDatepicker:function(t,e){t=this._getInst(t);return t&&!t.inline&&this._setDateFromField(t,e),t?this._getDate(t):null},_doKeyDown:function(t){var e,i,s=k.datepicker._getInst(t.target),n=!0,o=s.dpDiv.is(".ui-datepicker-rtl");if(s._keyEvent=!0,k.datepicker._datepickerShowing)switch(t.keyCode){case 9:k.datepicker._hideDatepicker(),n=!1;break;case 13:return(i=k("td."+k.datepicker._dayOverClass+":not(."+k.datepicker._currentClass+")",s.dpDiv))[0]&&k.datepicker._selectDay(t.target,s.selectedMonth,s.selectedYear,i[0]),(e=k.datepicker._get(s,"onSelect"))?(i=k.datepicker._formatDate(s),e.apply(s.input?s.input[0]:null,[i,s])):k.datepicker._hideDatepicker(),!1;case 27:k.datepicker._hideDatepicker();break;case 33:k.datepicker._adjustDate(t.target,t.ctrlKey?-k.datepicker._get(s,"stepBigMonths"):-k.datepicker._get(s,"stepMonths"),"M");break;case 34:k.datepicker._adjustDate(t.target,t.ctrlKey?+k.datepicker._get(s,"stepBigMonths"):+k.datepicker._get(s,"stepMonths"),"M");break;case 35:(t.ctrlKey||t.metaKey)&&k.datepicker._clearDate(t.target),n=t.ctrlKey||t.metaKey;break;case 36:(t.ctrlKey||t.metaKey)&&k.datepicker._gotoToday(t.target),n=t.ctrlKey||t.metaKey;break;case 37:(t.ctrlKey||t.metaKey)&&k.datepicker._adjustDate(t.target,o?1:-1,"D"),n=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&k.datepicker._adjustDate(t.target,t.ctrlKey?-k.datepicker._get(s,"stepBigMonths"):-k.datepicker._get(s,"stepMonths"),"M");break;case 38:(t.ctrlKey||t.metaKey)&&k.datepicker._adjustDate(t.target,-7,"D"),n=t.ctrlKey||t.metaKey;break;case 39:(t.ctrlKey||t.metaKey)&&k.datepicker._adjustDate(t.target,o?-1:1,"D"),n=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&k.datepicker._adjustDate(t.target,t.ctrlKey?+k.datepicker._get(s,"stepBigMonths"):+k.datepicker._get(s,"stepMonths"),"M");break;case 40:(t.ctrlKey||t.metaKey)&&k.datepicker._adjustDate(t.target,7,"D"),n=t.ctrlKey||t.metaKey;break;default:n=!1}else 36===t.keyCode&&t.ctrlKey?k.datepicker._showDatepicker(this):n=!1;n&&(t.preventDefault(),t.stopPropagation())},_doKeyPress:function(t){var e,i=k.datepicker._getInst(t.target);if(k.datepicker._get(i,"constrainInput"))return e=k.datepicker._possibleChars(k.datepicker._get(i,"dateFormat")),i=String.fromCharCode(null==t.charCode?t.keyCode:t.charCode),t.ctrlKey||t.metaKey||i<" "||!e||-1<e.indexOf(i)},_doKeyUp:function(t){var e=k.datepicker._getInst(t.target);if(e.input.val()!==e.lastVal)try{k.datepicker.parseDate(k.datepicker._get(e,"dateFormat"),e.input?e.input.val():null,k.datepicker._getFormatConfig(e))&&(k.datepicker._setDateFromField(e),k.datepicker._updateAlternate(e),k.datepicker._updateDatepicker(e))}catch(t){}return!0},_showDatepicker:function(t){var e,i,s,n;"input"!==(t=t.target||t).nodeName.toLowerCase()&&(t=k("input",t.parentNode)[0]),k.datepicker._isDisabledDatepicker(t)||k.datepicker._lastInput===t||(n=k.datepicker._getInst(t),k.datepicker._curInst&&k.datepicker._curInst!==n&&(k.datepicker._curInst.dpDiv.stop(!0,!0),n&&k.datepicker._datepickerShowing&&k.datepicker._hideDatepicker(k.datepicker._curInst.input[0])),!1!==(i=(s=k.datepicker._get(n,"beforeShow"))?s.apply(t,[t,n]):{})&&(w(n.settings,i),n.lastVal=null,k.datepicker._lastInput=t,k.datepicker._setDateFromField(n),k.datepicker._inDialog&&(t.value=""),k.datepicker._pos||(k.datepicker._pos=k.datepicker._findPos(t),k.datepicker._pos[1]+=t.offsetHeight),e=!1,k(t).parents().each(function(){return!(e|="fixed"===k(this).css("position"))}),s={left:k.datepicker._pos[0],top:k.datepicker._pos[1]},k.datepicker._pos=null,n.dpDiv.empty(),n.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),k.datepicker._updateDatepicker(n),s=k.datepicker._checkOffset(n,s,e),n.dpDiv.css({position:k.datepicker._inDialog&&k.blockUI?"static":e?"fixed":"absolute",display:"none",left:s.left+"px",top:s.top+"px"}),n.inline||(i=k.datepicker._get(n,"showAnim"),s=k.datepicker._get(n,"duration"),n.dpDiv.css("z-index",function(t){for(var e,i;t.length&&t[0]!==document;){if(("absolute"===(e=t.css("position"))||"relative"===e||"fixed"===e)&&(i=parseInt(t.css("zIndex"),10),!isNaN(i)&&0!==i))return i;t=t.parent()}return 0}(k(t))+1),k.datepicker._datepickerShowing=!0,k.effects&&k.effects.effect[i]?n.dpDiv.show(i,k.datepicker._get(n,"showOptions"),s):n.dpDiv[i||"show"](i?s:null),k.datepicker._shouldFocusInput(n)&&n.input.trigger("focus"),k.datepicker._curInst=n)))},_updateDatepicker:function(t){this.maxRows=4,(_=t).dpDiv.empty().append(this._generateHTML(t)),this._attachHandlers(t);var e,i=this._getNumberOfMonths(t),s=i[1],n=t.dpDiv.find("."+this._dayOverClass+" a");0<n.length&&y.apply(n.get(0)),t.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),1<s&&t.dpDiv.addClass("ui-datepicker-multi-"+s).css("width",17*s+"em"),t.dpDiv[(1!==i[0]||1!==i[1]?"add":"remove")+"Class"]("ui-datepicker-multi"),t.dpDiv[(this._get(t,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),t===k.datepicker._curInst&&k.datepicker._datepickerShowing&&k.datepicker._shouldFocusInput(t)&&t.input.trigger("focus"),t.yearshtml&&(e=t.yearshtml,setTimeout(function(){e===t.yearshtml&&t.yearshtml&&t.dpDiv.find("select.ui-datepicker-year:first").replaceWith(t.yearshtml),e=t.yearshtml=null},0))},_shouldFocusInput:function(t){return t.input&&t.input.is(":visible")&&!t.input.is(":disabled")&&!t.input.is(":focus")},_checkOffset:function(t,e,i){var s=t.dpDiv.outerWidth(),n=t.dpDiv.outerHeight(),o=t.input?t.input.outerWidth():0,a=t.input?t.input.outerHeight():0,r=document.documentElement.clientWidth+(i?0:k(document).scrollLeft()),h=document.documentElement.clientHeight+(i?0:k(document).scrollTop());return e.left-=this._get(t,"isRTL")?s-o:0,e.left-=i&&e.left===t.input.offset().left?k(document).scrollLeft():0,e.top-=i&&e.top===t.input.offset().top+a?k(document).scrollTop():0,e.left-=Math.min(e.left,e.left+s>r&&s<r?Math.abs(e.left+s-r):0),e.top-=Math.min(e.top,e.top+n>h&&n<h?Math.abs(n+a):0),e},_findPos:function(t){for(var e=this._getInst(t),i=this._get(e,"isRTL");t&&("hidden"===t.type||1!==t.nodeType||k.expr.filters.hidden(t));)t=t[i?"previousSibling":"nextSibling"];return[(e=k(t).offset()).left,e.top]},_hideDatepicker:function(t){var e,i,s=this._curInst;!s||t&&s!==k.data(t,"datepicker")||this._datepickerShowing&&(e=this._get(s,"showAnim"),i=this._get(s,"duration"),t=function(){k.datepicker._tidyDialog(s)},k.effects&&(k.effects.effect[e]||k.effects[e])?s.dpDiv.hide(e,k.datepicker._get(s,"showOptions"),i,t):s.dpDiv["slideDown"===e?"slideUp":"fadeIn"===e?"fadeOut":"hide"](e?i:null,t),e||t(),this._datepickerShowing=!1,(t=this._get(s,"onClose"))&&t.apply(s.input?s.input[0]:null,[s.input?s.input.val():"",s]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),k.blockUI&&(k.unblockUI(),k("body").append(this.dpDiv))),this._inDialog=!1)},_tidyDialog:function(t){t.dpDiv.removeClass(this._dialogClass).off(".ui-datepicker-calendar")},_checkExternalClick:function(t){var e;k.datepicker._curInst&&(e=k(t.target),t=k.datepicker._getInst(e[0]),(e[0].id===k.datepicker._mainDivId||0!==e.parents("#"+k.datepicker._mainDivId).length||e.hasClass(k.datepicker.markerClassName)||e.closest("."+k.datepicker._triggerClass).length||!k.datepicker._datepickerShowing||k.datepicker._inDialog&&k.blockUI)&&(!e.hasClass(k.datepicker.markerClassName)||k.datepicker._curInst===t)||k.datepicker._hideDatepicker())},_adjustDate:function(t,e,i){var s=k(t),t=this._getInst(s[0]);this._isDisabledDatepicker(s[0])||(this._adjustInstDate(t,e+("M"===i?this._get(t,"showCurrentAtPos"):0),i),this._updateDatepicker(t))},_gotoToday:function(t){var e=k(t),i=this._getInst(e[0]);this._get(i,"gotoCurrent")&&i.currentDay?(i.selectedDay=i.currentDay,i.drawMonth=i.selectedMonth=i.currentMonth,i.drawYear=i.selectedYear=i.currentYear):(t=new Date,i.selectedDay=t.getDate(),i.drawMonth=i.selectedMonth=t.getMonth(),i.drawYear=i.selectedYear=t.getFullYear()),this._notifyChange(i),this._adjustDate(e)},_selectMonthYear:function(t,e,i){var s=k(t),t=this._getInst(s[0]);t["selected"+("M"===i?"Month":"Year")]=t["draw"+("M"===i?"Month":"Year")]=parseInt(e.options[e.selectedIndex].value,10),this._notifyChange(t),this._adjustDate(s)},_selectDay:function(t,e,i,s){var n=k(t);k(s).hasClass(this._unselectableClass)||this._isDisabledDatepicker(n[0])||((n=this._getInst(n[0])).selectedDay=n.currentDay=k("a",s).html(),n.selectedMonth=n.currentMonth=e,n.selectedYear=n.currentYear=i,this._selectDate(t,this._formatDate(n,n.currentDay,n.currentMonth,n.currentYear)))},_clearDate:function(t){t=k(t);this._selectDate(t,"")},_selectDate:function(t,e){var i=k(t),t=this._getInst(i[0]);e=null!=e?e:this._formatDate(t),t.input&&t.input.val(e),this._updateAlternate(t),(i=this._get(t,"onSelect"))?i.apply(t.input?t.input[0]:null,[e,t]):t.input&&t.input.trigger("change"),t.inline?this._updateDatepicker(t):(this._hideDatepicker(),this._lastInput=t.input[0],"object"!=typeof t.input[0]&&t.input.trigger("focus"),this._lastInput=null)},_updateAlternate:function(t){var e,i,s=this._get(t,"altField");s&&(e=this._get(t,"altFormat")||this._get(t,"dateFormat"),i=this._getDate(t),t=this.formatDate(e,i,this._getFormatConfig(t)),k(s).val(t))},noWeekends:function(t){t=t.getDay();return[0<t&&t<6,""]},iso8601Week:function(t){var e=new Date(t.getTime());return e.setDate(e.getDate()+4-(e.getDay()||7)),t=e.getTime(),e.setMonth(0),e.setDate(1),Math.floor(Math.round((t-e)/864e5)/7)+1},parseDate:function(e,n,t){if(null==e||null==n)throw"Invalid arguments";if(""===(n="object"==typeof n?n.toString():n+""))return null;function o(t){return(t=w+1<e.length&&e.charAt(w+1)===t)&&w++,t}function i(t){var e=o(t),e="@"===t?14:"!"===t?20:"y"===t&&e?4:"o"===t?3:2,e=new RegExp("^\\d{"+("y"===t?e:1)+","+e+"}");if(!(e=n.substring(c).match(e)))throw"Missing number at position "+c;return c+=e[0].length,parseInt(e[0],10)}function s(t,e,i){var s=-1,e=k.map(o(t)?i:e,function(t,e){return[[e,t]]}).sort(function(t,e){return-(t[1].length-e[1].length)});if(k.each(e,function(t,e){var i=e[1];if(n.substr(c,i.length).toLowerCase()===i.toLowerCase())return s=e[0],c+=i.length,!1}),-1!==s)return s+1;throw"Unknown name at position "+c}function a(){if(n.charAt(c)!==e.charAt(w))throw"Unexpected literal at position "+c;c++}for(var r,h,l,c=0,u=(t?t.shortYearCutoff:null)||this._defaults.shortYearCutoff,u="string"!=typeof u?u:(new Date).getFullYear()%100+parseInt(u,10),d=(t?t.dayNamesShort:null)||this._defaults.dayNamesShort,p=(t?t.dayNames:null)||this._defaults.dayNames,f=(t?t.monthNamesShort:null)||this._defaults.monthNamesShort,g=(t?t.monthNames:null)||this._defaults.monthNames,m=-1,_=-1,v=-1,b=-1,y=!1,w=0;w<e.length;w++)if(y)"'"!==e.charAt(w)||o("'")?a():y=!1;else switch(e.charAt(w)){case"d":v=i("d");break;case"D":s("D",d,p);break;case"o":b=i("o");break;case"m":_=i("m");break;case"M":_=s("M",f,g);break;case"y":m=i("y");break;case"@":m=(l=new Date(i("@"))).getFullYear(),_=l.getMonth()+1,v=l.getDate();break;case"!":m=(l=new Date((i("!")-this._ticksTo1970)/1e4)).getFullYear(),_=l.getMonth()+1,v=l.getDate();break;case"'":o("'")?a():y=!0;break;default:a()}if(c<n.length&&(h=n.substr(c),!/^\s+/.test(h)))throw"Extra/unparsed characters found in date: "+h;if(-1===m?m=(new Date).getFullYear():m<100&&(m+=(new Date).getFullYear()-(new Date).getFullYear()%100+(m<=u?0:-100)),-1<b)for(_=1,v=b;;){if(v<=(r=this._getDaysInMonth(m,_-1)))break;_++,v-=r}if((l=this._daylightSavingAdjust(new Date(m,_-1,v))).getFullYear()!==m||l.getMonth()+1!==_||l.getDate()!==v)throw"Invalid date";return l},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:24*(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*60*60*1e7,formatDate:function(e,t,i){if(!t)return"";function n(t){return(t=a+1<e.length&&e.charAt(a+1)===t)&&a++,t}function s(t,e,i){var s=""+e;if(n(t))for(;s.length<i;)s="0"+s;return s}function o(t,e,i,s){return(n(t)?s:i)[e]}var a,r=(i?i.dayNamesShort:null)||this._defaults.dayNamesShort,h=(i?i.dayNames:null)||this._defaults.dayNames,l=(i?i.monthNamesShort:null)||this._defaults.monthNamesShort,c=(i?i.monthNames:null)||this._defaults.monthNames,u="",d=!1;if(t)for(a=0;a<e.length;a++)if(d)"'"!==e.charAt(a)||n("'")?u+=e.charAt(a):d=!1;else switch(e.charAt(a)){case"d":u+=s("d",t.getDate(),2);break;case"D":u+=o("D",t.getDay(),r,h);break;case"o":u+=s("o",Math.round((new Date(t.getFullYear(),t.getMonth(),t.getDate()).getTime()-new Date(t.getFullYear(),0,0).getTime())/864e5),3);break;case"m":u+=s("m",t.getMonth()+1,2);break;case"M":u+=o("M",t.getMonth(),l,c);break;case"y":u+=n("y")?t.getFullYear():(t.getFullYear()%100<10?"0":"")+t.getFullYear()%100;break;case"@":u+=t.getTime();break;case"!":u+=1e4*t.getTime()+this._ticksTo1970;break;case"'":n("'")?u+="'":d=!0;break;default:u+=e.charAt(a)}return u},_possibleChars:function(e){function t(t){return(t=n+1<e.length&&e.charAt(n+1)===t)&&n++,t}for(var i="",s=!1,n=0;n<e.length;n++)if(s)"'"!==e.charAt(n)||t("'")?i+=e.charAt(n):s=!1;else switch(e.charAt(n)){case"d":case"m":case"y":case"@":i+="0123456789";break;case"D":case"M":return null;case"'":t("'")?i+="'":s=!0;break;default:i+=e.charAt(n)}return i},_get:function(t,e){return(void 0!==t.settings[e]?t.settings:this._defaults)[e]},_setDateFromField:function(t,e){if(t.input.val()!==t.lastVal){var i=this._get(t,"dateFormat"),s=t.lastVal=t.input?t.input.val():null,n=this._getDefaultDate(t),o=n,a=this._getFormatConfig(t);try{o=this.parseDate(i,s,a)||n}catch(t){s=e?"":s}t.selectedDay=o.getDate(),t.drawMonth=t.selectedMonth=o.getMonth(),t.drawYear=t.selectedYear=o.getFullYear(),t.currentDay=s?o.getDate():0,t.currentMonth=s?o.getMonth():0,t.currentYear=s?o.getFullYear():0,this._adjustInstDate(t)}},_getDefaultDate:function(t){return this._restrictMinMax(t,this._determineDate(t,this._get(t,"defaultDate"),new Date))},_determineDate:function(r,t,e){var i,s,t=null==t||""===t?e:"string"==typeof t?function(t){try{return k.datepicker.parseDate(k.datepicker._get(r,"dateFormat"),t,k.datepicker._getFormatConfig(r))}catch(t){}for(var e=(t.toLowerCase().match(/^c/)?k.datepicker._getDate(r):null)||new Date,i=e.getFullYear(),s=e.getMonth(),n=e.getDate(),o=/([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,a=o.exec(t);a;){switch(a[2]||"d"){case"d":case"D":n+=parseInt(a[1],10);break;case"w":case"W":n+=7*parseInt(a[1],10);break;case"m":case"M":s+=parseInt(a[1],10),n=Math.min(n,k.datepicker._getDaysInMonth(i,s));break;case"y":case"Y":i+=parseInt(a[1],10),n=Math.min(n,k.datepicker._getDaysInMonth(i,s))}a=o.exec(t)}return new Date(i,s,n)}(t):"number"==typeof t?isNaN(t)?e:(i=t,(s=new Date).setDate(s.getDate()+i),s):new Date(t.getTime());return(t=t&&"Invalid Date"===t.toString()?e:t)&&(t.setHours(0),t.setMinutes(0),t.setSeconds(0),t.setMilliseconds(0)),this._daylightSavingAdjust(t)},_daylightSavingAdjust:function(t){return t?(t.setHours(12<t.getHours()?t.getHours()+2:0),t):null},_setDate:function(t,e,i){var s=!e,n=t.selectedMonth,o=t.selectedYear,e=this._restrictMinMax(t,this._determineDate(t,e,new Date));t.selectedDay=t.currentDay=e.getDate(),t.drawMonth=t.selectedMonth=t.currentMonth=e.getMonth(),t.drawYear=t.selectedYear=t.currentYear=e.getFullYear(),n===t.selectedMonth&&o===t.selectedYear||i||this._notifyChange(t),this._adjustInstDate(t),t.input&&t.input.val(s?"":this._formatDate(t))},_getDate:function(t){return!t.currentYear||t.input&&""===t.input.val()?null:this._daylightSavingAdjust(new Date(t.currentYear,t.currentMonth,t.currentDay))},_attachHandlers:function(t){var e=this._get(t,"stepMonths"),i="#"+t.id.replace(/\\\\/g,"\\");t.dpDiv.find("[data-handler]").map(function(){var t={prev:function(){k.datepicker._adjustDate(i,-e,"M")},next:function(){k.datepicker._adjustDate(i,+e,"M")},hide:function(){k.datepicker._hideDatepicker()},today:function(){k.datepicker._gotoToday(i)},selectDay:function(){return k.datepicker._selectDay(i,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this),!1},selectMonth:function(){return k.datepicker._selectMonthYear(i,this,"M"),!1},selectYear:function(){return k.datepicker._selectMonthYear(i,this,"Y"),!1}};k(this).on(this.getAttribute("data-event"),t[this.getAttribute("data-handler")])})},_generateHTML:function(t){var e,i,s,n,o,a,r,h,l,c,u,d,p,f,g,m,_,v,b,y,w,k,x,C,D,I,T,P,M,S,H,z=new Date,O=this._daylightSavingAdjust(new Date(z.getFullYear(),z.getMonth(),z.getDate())),A=this._get(t,"isRTL"),N=this._get(t,"showButtonPanel"),W=this._get(t,"hideIfNoPrevNext"),E=this._get(t,"navigationAsDateFormat"),F=this._getNumberOfMonths(t),R=this._get(t,"showCurrentAtPos"),z=this._get(t,"stepMonths"),L=1!==F[0]||1!==F[1],B=this._daylightSavingAdjust(t.currentDay?new Date(t.currentYear,t.currentMonth,t.currentDay):new Date(9999,9,9)),Y=this._getMinMaxDate(t,"min"),j=this._getMinMaxDate(t,"max"),q=t.drawMonth-R,K=t.drawYear;if(q<0&&(q+=12,K--),j)for(e=this._daylightSavingAdjust(new Date(j.getFullYear(),j.getMonth()-F[0]*F[1]+1,j.getDate())),e=Y&&e<Y?Y:e;this._daylightSavingAdjust(new Date(K,q,1))>e;)--q<0&&(q=11,K--);for(t.drawMonth=q,t.drawYear=K,R=this._get(t,"prevText"),R=E?this.formatDate(R,this._daylightSavingAdjust(new Date(K,q-z,1)),this._getFormatConfig(t)):R,i=this._canAdjustMonth(t,-1,K,q)?"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click' title='"+R+"'><span class='ui-icon ui-icon-circle-triangle-"+(A?"e":"w")+"'>"+R+"</span></a>":W?"":"<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='"+R+"'><span class='ui-icon ui-icon-circle-triangle-"+(A?"e":"w")+"'>"+R+"</span></a>",R=this._get(t,"nextText"),R=E?this.formatDate(R,this._daylightSavingAdjust(new Date(K,q+z,1)),this._getFormatConfig(t)):R,s=this._canAdjustMonth(t,1,K,q)?"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click' title='"+R+"'><span class='ui-icon ui-icon-circle-triangle-"+(A?"w":"e")+"'>"+R+"</span></a>":W?"":"<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='"+R+"'><span class='ui-icon ui-icon-circle-triangle-"+(A?"w":"e")+"'>"+R+"</span></a>",W=this._get(t,"currentText"),R=this._get(t,"gotoCurrent")&&t.currentDay?B:O,W=E?this.formatDate(W,R,this._getFormatConfig(t)):W,E=t.inline?"":"<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>"+this._get(t,"closeText")+"</button>",E=N?"<div class='ui-datepicker-buttonpane ui-widget-content'>"+(A?E:"")+(this._isInRange(t,R)?"<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'>"+W+"</button>":"")+(A?"":E)+"</div>":"",n=parseInt(this._get(t,"firstDay"),10),n=isNaN(n)?0:n,o=this._get(t,"showWeek"),a=this._get(t,"dayNames"),r=this._get(t,"dayNamesMin"),h=this._get(t,"monthNames"),l=this._get(t,"monthNamesShort"),c=this._get(t,"beforeShowDay"),u=this._get(t,"showOtherMonths"),d=this._get(t,"selectOtherMonths"),p=this._getDefaultDate(t),f="",m=0;m<F[0];m++){for(_="",this.maxRows=4,v=0;v<F[1];v++){if(b=this._daylightSavingAdjust(new Date(K,q,t.selectedDay)),x=" ui-corner-all",y="",L){if(y+="<div class='ui-datepicker-group",1<F[1])switch(v){case 0:y+=" ui-datepicker-group-first",x=" ui-corner-"+(A?"right":"left");break;case F[1]-1:y+=" ui-datepicker-group-last",x=" ui-corner-"+(A?"left":"right");break;default:y+=" ui-datepicker-group-middle",x=""}y+="'>"}for(y+="<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix"+x+"'>"+(/all|left/.test(x)&&0===m?A?s:i:"")+(/all|right/.test(x)&&0===m?A?i:s:"")+this._generateMonthYearHeader(t,q,K,Y,j,0<m||0<v,h,l)+"</div><table class='ui-datepicker-calendar'><thead><tr>",w=o?"<th class='ui-datepicker-week-col'>"+this._get(t,"weekHeader")+"</th>":"",g=0;g<7;g++)w+="<th scope='col'"+(5<=(g+n+6)%7?" class='ui-datepicker-week-end'":"")+"><span title='"+a[k=(g+n)%7]+"'>"+r[k]+"</span></th>";for(y+=w+"</tr></thead><tbody>",C=this._getDaysInMonth(K,q),K===t.selectedYear&&q===t.selectedMonth&&(t.selectedDay=Math.min(t.selectedDay,C)),x=(this._getFirstDayOfMonth(K,q)-n+7)%7,C=Math.ceil((x+C)/7),D=L&&this.maxRows>C?this.maxRows:C,this.maxRows=D,I=this._daylightSavingAdjust(new Date(K,q,1-x)),T=0;T<D;T++){for(y+="<tr>",P=o?"<td class='ui-datepicker-week-col'>"+this._get(t,"calculateWeek")(I)+"</td>":"",g=0;g<7;g++)M=c?c.apply(t.input?t.input[0]:null,[I]):[!0,""],H=(S=I.getMonth()!==q)&&!d||!M[0]||Y&&I<Y||j&&j<I,P+="<td class='"+(5<=(g+n+6)%7?" ui-datepicker-week-end":"")+(S?" ui-datepicker-other-month":"")+(I.getTime()===b.getTime()&&q===t.selectedMonth&&t._keyEvent||p.getTime()===I.getTime()&&p.getTime()===b.getTime()?" "+this._dayOverClass:"")+(H?" "+this._unselectableClass+" ui-state-disabled":"")+(S&&!u?"":" "+M[1]+(I.getTime()===B.getTime()?" "+this._currentClass:"")+(I.getTime()===O.getTime()?" ui-datepicker-today":""))+"'"+(S&&!u||!M[2]?"":" title='"+M[2].replace(/'/g,"&#39;")+"'")+(H?"":" data-handler='selectDay' data-event='click' data-month='"+I.getMonth()+"' data-year='"+I.getFullYear()+"'")+">"+(S&&!u?"&#xa0;":H?"<span class='ui-state-default'>"+I.getDate()+"</span>":"<a class='ui-state-default"+(I.getTime()===O.getTime()?" ui-state-highlight":"")+(I.getTime()===B.getTime()?" ui-state-active":"")+(S?" ui-priority-secondary":"")+"' href='#'>"+I.getDate()+"</a>")+"</td>",I.setDate(I.getDate()+1),I=this._daylightSavingAdjust(I);y+=P+"</tr>"}11<++q&&(q=0,K++),_+=y+="</tbody></table>"+(L?"</div>"+(0<F[0]&&v===F[1]-1?"<div class='ui-datepicker-row-break'></div>":""):"")}f+=_}return f+=E,t._keyEvent=!1,f},_generateMonthYearHeader:function(t,e,i,s,n,o,a,r){var h,l,c,u,d,p,f,g=this._get(t,"changeMonth"),m=this._get(t,"changeYear"),_=this._get(t,"showMonthAfterYear"),v="<div class='ui-datepicker-title'>",b="";if(o||!g)b+="<span class='ui-datepicker-month'>"+a[e]+"</span>";else{for(h=s&&s.getFullYear()===i,l=n&&n.getFullYear()===i,b+="<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>",c=0;c<12;c++)(!h||c>=s.getMonth())&&(!l||c<=n.getMonth())&&(b+="<option value='"+c+"'"+(c===e?" selected='selected'":"")+">"+r[c]+"</option>");b+="</select>"}if(_||(v+=b+(!o&&g&&m?"":"&#xa0;")),!t.yearshtml)if(t.yearshtml="",o||!m)v+="<span class='ui-datepicker-year'>"+i+"</span>";else{for(u=this._get(t,"yearRange").split(":"),d=(new Date).getFullYear(),p=(a=function(t){t=t.match(/c[+\-].*/)?i+parseInt(t.substring(1),10):t.match(/[+\-].*/)?d+parseInt(t,10):parseInt(t,10);return isNaN(t)?d:t})(u[0]),f=Math.max(p,a(u[1]||"")),p=s?Math.max(p,s.getFullYear()):p,f=n?Math.min(f,n.getFullYear()):f,t.yearshtml+="<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";p<=f;p++)t.yearshtml+="<option value='"+p+"'"+(p===i?" selected='selected'":"")+">"+p+"</option>";t.yearshtml+="</select>",v+=t.yearshtml,t.yearshtml=null}return v+=this._get(t,"yearSuffix"),_&&(v+=(!o&&g&&m?"":"&#xa0;")+b),v+="</div>"},_adjustInstDate:function(t,e,i){var s=t.selectedYear+("Y"===i?e:0),n=t.selectedMonth+("M"===i?e:0),e=Math.min(t.selectedDay,this._getDaysInMonth(s,n))+("D"===i?e:0),e=this._restrictMinMax(t,this._daylightSavingAdjust(new Date(s,n,e)));t.selectedDay=e.getDate(),t.drawMonth=t.selectedMonth=e.getMonth(),t.drawYear=t.selectedYear=e.getFullYear(),"M"!==i&&"Y"!==i||this._notifyChange(t)},_restrictMinMax:function(t,e){var i=this._getMinMaxDate(t,"min"),t=this._getMinMaxDate(t,"max"),e=i&&e<i?i:e;return t&&t<e?t:e},_notifyChange:function(t){var e=this._get(t,"onChangeMonthYear");e&&e.apply(t.input?t.input[0]:null,[t.selectedYear,t.selectedMonth+1,t])},_getNumberOfMonths:function(t){t=this._get(t,"numberOfMonths");return null==t?[1,1]:"number"==typeof t?[1,t]:t},_getMinMaxDate:function(t,e){return this._determineDate(t,this._get(t,e+"Date"),null)},_getDaysInMonth:function(t,e){return 32-this._daylightSavingAdjust(new Date(t,e,32)).getDate()},_getFirstDayOfMonth:function(t,e){return new Date(t,e,1).getDay()},_canAdjustMonth:function(t,e,i,s){var n=this._getNumberOfMonths(t),n=this._daylightSavingAdjust(new Date(i,s+(e<0?e:n[0]*n[1]),1));return e<0&&n.setDate(this._getDaysInMonth(n.getFullYear(),n.getMonth())),this._isInRange(t,n)},_isInRange:function(t,e){var i=this._getMinMaxDate(t,"min"),s=this._getMinMaxDate(t,"max"),n=null,o=null,a=this._get(t,"yearRange");return a&&(t=a.split(":"),a=(new Date).getFullYear(),n=parseInt(t[0],10),o=parseInt(t[1],10),t[0].match(/[+\-].*/)&&(n+=a),t[1].match(/[+\-].*/)&&(o+=a)),(!i||e.getTime()>=i.getTime())&&(!s||e.getTime()<=s.getTime())&&(!n||e.getFullYear()>=n)&&(!o||e.getFullYear()<=o)},_getFormatConfig:function(t){var e=this._get(t,"shortYearCutoff");return{shortYearCutoff:e="string"!=typeof e?e:(new Date).getFullYear()%100+parseInt(e,10),dayNamesShort:this._get(t,"dayNamesShort"),dayNames:this._get(t,"dayNames"),monthNamesShort:this._get(t,"monthNamesShort"),monthNames:this._get(t,"monthNames")}},_formatDate:function(t,e,i,s){e||(t.currentDay=t.selectedDay,t.currentMonth=t.selectedMonth,t.currentYear=t.selectedYear);e=e?"object"==typeof e?e:this._daylightSavingAdjust(new Date(s,i,e)):this._daylightSavingAdjust(new Date(t.currentYear,t.currentMonth,t.currentDay));return this.formatDate(this._get(t,"dateFormat"),e,this._getFormatConfig(t))}}),k.fn.datepicker=function(t){if(!this.length)return this;k.datepicker.initialized||(k(document).on("mousedown",k.datepicker._checkExternalClick),k.datepicker.initialized=!0),0===k("#"+k.datepicker._mainDivId).length&&k("body").append(k.datepicker.dpDiv);var e=Array.prototype.slice.call(arguments,1);return"string"==typeof t&&("isDisabled"===t||"getDate"===t||"widget"===t)||"option"===t&&2===arguments.length&&"string"==typeof arguments[1]?k.datepicker["_"+t+"Datepicker"].apply(k.datepicker,[this[0]].concat(e)):this.each(function(){"string"==typeof t?k.datepicker["_"+t+"Datepicker"].apply(k.datepicker,[this].concat(e)):k.datepicker._attachDatepicker(this,t)})},k.datepicker=new v,k.datepicker.initialized=!1,k.datepicker.uuid=(new Date).getTime(),k.datepicker.version="1.12.1";k.datepicker;k.widget("ui.dialog",{version:"1.12.1",options:{appendTo:"body",autoOpen:!0,buttons:[],classes:{"ui-dialog":"ui-corner-all","ui-dialog-titlebar":"ui-corner-all"},closeOnEscape:!0,closeText:"Close",draggable:!0,hide:null,height:"auto",maxHeight:null,maxWidth:null,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",of:window,collision:"fit",using:function(t){var e=k(this).css(t).offset().top;e<0&&k(this).css("top",t.top-e)}},resizable:!0,show:null,title:null,width:300,beforeClose:null,close:null,drag:null,dragStart:null,dragStop:null,focus:null,open:null,resize:null,resizeStart:null,resizeStop:null},sizeRelatedOptions:{buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},resizableRelatedOptions:{maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0},_create:function(){this.originalCss={display:this.element[0].style.display,width:this.element[0].style.width,minHeight:this.element[0].style.minHeight,maxHeight:this.element[0].style.maxHeight,height:this.element[0].style.height},this.originalPosition={parent:this.element.parent(),index:this.element.parent().children().index(this.element)},this.originalTitle=this.element.attr("title"),null==this.options.title&&null!=this.originalTitle&&(this.options.title=this.originalTitle),this.options.disabled&&(this.options.disabled=!1),this._createWrapper(),this.element.show().removeAttr("title").appendTo(this.uiDialog),this._addClass("ui-dialog-content","ui-widget-content"),this._createTitlebar(),this._createButtonPane(),this.options.draggable&&k.fn.draggable&&this._makeDraggable(),this.options.resizable&&k.fn.resizable&&this._makeResizable(),this._isOpen=!1,this._trackFocus()},_init:function(){this.options.autoOpen&&this.open()},_appendTo:function(){var t=this.options.appendTo;return t&&(t.jquery||t.nodeType)?k(t):this.document.find(t||"body").eq(0)},_destroy:function(){var t,e=this.originalPosition;this._untrackInstance(),this._destroyOverlay(),this.element.removeUniqueId().css(this.originalCss).detach(),this.uiDialog.remove(),this.originalTitle&&this.element.attr("title",this.originalTitle),(t=e.parent.children().eq(e.index)).length&&t[0]!==this.element[0]?t.before(this.element):e.parent.append(this.element)},widget:function(){return this.uiDialog},disable:k.noop,enable:k.noop,close:function(t){var e=this;this._isOpen&&!1!==this._trigger("beforeClose",t)&&(this._isOpen=!1,this._focusedElement=null,this._destroyOverlay(),this._untrackInstance(),this.opener.filter(":focusable").trigger("focus").length||k.ui.safeBlur(k.ui.safeActiveElement(this.document[0])),this._hide(this.uiDialog,this.options.hide,function(){e._trigger("close",t)}))},isOpen:function(){return this._isOpen},moveToTop:function(){this._moveToTop()},_moveToTop:function(t,e){var i=!1,s=this.uiDialog.siblings(".ui-front:visible").map(function(){return+k(this).css("z-index")}).get(),s=Math.max.apply(null,s);return s>=+this.uiDialog.css("z-index")&&(this.uiDialog.css("z-index",s+1),i=!0),i&&!e&&this._trigger("focus",t),i},open:function(){var t=this;this._isOpen?this._moveToTop()&&this._focusTabbable():(this._isOpen=!0,this.opener=k(k.ui.safeActiveElement(this.document[0])),this._size(),this._position(),this._createOverlay(),this._moveToTop(null,!0),this.overlay&&this.overlay.css("z-index",this.uiDialog.css("z-index")-1),this._show(this.uiDialog,this.options.show,function(){t._focusTabbable(),t._trigger("focus")}),this._makeFocusTarget(),this._trigger("open"))},_focusTabbable:function(){var t=this._focusedElement;(t=t||this.element.find("[autofocus]")).length||(t=this.element.find(":tabbable")),t.length||(t=this.uiDialogButtonPane.find(":tabbable")),t.length||(t=this.uiDialogTitlebarClose.filter(":tabbable")),t.length||(t=this.uiDialog),t.eq(0).trigger("focus")},_keepFocus:function(t){function e(){var t=k.ui.safeActiveElement(this.document[0]);this.uiDialog[0]===t||k.contains(this.uiDialog[0],t)||this._focusTabbable()}t.preventDefault(),e.call(this),this._delay(e)},_createWrapper:function(){this.uiDialog=k("<div>").hide().attr({tabIndex:-1,role:"dialog"}).appendTo(this._appendTo()),this._addClass(this.uiDialog,"ui-dialog","ui-widget ui-widget-content ui-front"),this._on(this.uiDialog,{keydown:function(t){if(this.options.closeOnEscape&&!t.isDefaultPrevented()&&t.keyCode&&t.keyCode===k.ui.keyCode.ESCAPE)return t.preventDefault(),void this.close(t);var e,i,s;t.keyCode!==k.ui.keyCode.TAB||t.isDefaultPrevented()||(e=this.uiDialog.find(":tabbable"),i=e.filter(":first"),s=e.filter(":last"),t.target!==s[0]&&t.target!==this.uiDialog[0]||t.shiftKey?t.target!==i[0]&&t.target!==this.uiDialog[0]||!t.shiftKey||(this._delay(function(){s.trigger("focus")}),t.preventDefault()):(this._delay(function(){i.trigger("focus")}),t.preventDefault()))},mousedown:function(t){this._moveToTop(t)&&this._focusTabbable()}}),this.element.find("[aria-describedby]").length||this.uiDialog.attr({"aria-describedby":this.element.uniqueId().attr("id")})},_createTitlebar:function(){var t;this.uiDialogTitlebar=k("<div>"),this._addClass(this.uiDialogTitlebar,"ui-dialog-titlebar","ui-widget-header ui-helper-clearfix"),this._on(this.uiDialogTitlebar,{mousedown:function(t){k(t.target).closest(".ui-dialog-titlebar-close")||this.uiDialog.trigger("focus")}}),this.uiDialogTitlebarClose=k("<button type='button'></button>").button({label:k("<a>").text(this.options.closeText).html(),icon:"ui-icon-closethick",showLabel:!1}).appendTo(this.uiDialogTitlebar),this._addClass(this.uiDialogTitlebarClose,"ui-dialog-titlebar-close"),this._on(this.uiDialogTitlebarClose,{click:function(t){t.preventDefault(),this.close(t)}}),t=k("<span>").uniqueId().prependTo(this.uiDialogTitlebar),this._addClass(t,"ui-dialog-title"),this._title(t),this.uiDialogTitlebar.prependTo(this.uiDialog),this.uiDialog.attr({"aria-labelledby":t.attr("id")})},_title:function(t){this.options.title?t.text(this.options.title):t.html("&#160;")},_createButtonPane:function(){this.uiDialogButtonPane=k("<div>"),this._addClass(this.uiDialogButtonPane,"ui-dialog-buttonpane","ui-widget-content ui-helper-clearfix"),this.uiButtonSet=k("<div>").appendTo(this.uiDialogButtonPane),this._addClass(this.uiButtonSet,"ui-dialog-buttonset"),this._createButtons()},_createButtons:function(){var s=this,t=this.options.buttons;this.uiDialogButtonPane.remove(),this.uiButtonSet.empty(),k.isEmptyObject(t)||k.isArray(t)&&!t.length?this._removeClass(this.uiDialog,"ui-dialog-buttons"):(k.each(t,function(t,e){var i;e=k.isFunction(e)?{click:e,text:t}:e,e=k.extend({type:"button"},e),i=e.click,t={icon:e.icon,iconPosition:e.iconPosition,showLabel:e.showLabel,icons:e.icons,text:e.text},delete e.click,delete e.icon,delete e.iconPosition,delete e.showLabel,delete e.icons,"boolean"==typeof e.text&&delete e.text,k("<button></button>",e).button(t).appendTo(s.uiButtonSet).on("click",function(){i.apply(s.element[0],arguments)})}),this._addClass(this.uiDialog,"ui-dialog-buttons"),this.uiDialogButtonPane.appendTo(this.uiDialog))},_makeDraggable:function(){var n=this,o=this.options;function a(t){return{position:t.position,offset:t.offset}}this.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(t,e){n._addClass(k(this),"ui-dialog-dragging"),n._blockFrames(),n._trigger("dragStart",t,a(e))},drag:function(t,e){n._trigger("drag",t,a(e))},stop:function(t,e){var i=e.offset.left-n.document.scrollLeft(),s=e.offset.top-n.document.scrollTop();o.position={my:"left top",at:"left"+(0<=i?"+":"")+i+" top"+(0<=s?"+":"")+s,of:n.window},n._removeClass(k(this),"ui-dialog-dragging"),n._unblockFrames(),n._trigger("dragStop",t,a(e))}})},_makeResizable:function(){var n=this,o=this.options,t=o.resizable,e=this.uiDialog.css("position"),t="string"==typeof t?t:"n,e,s,w,se,sw,ne,nw";function a(t){return{originalPosition:t.originalPosition,originalSize:t.originalSize,position:t.position,size:t.size}}this.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:this.element,maxWidth:o.maxWidth,maxHeight:o.maxHeight,minWidth:o.minWidth,minHeight:this._minHeight(),handles:t,start:function(t,e){n._addClass(k(this),"ui-dialog-resizing"),n._blockFrames(),n._trigger("resizeStart",t,a(e))},resize:function(t,e){n._trigger("resize",t,a(e))},stop:function(t,e){var i=n.uiDialog.offset(),s=i.left-n.document.scrollLeft(),i=i.top-n.document.scrollTop();o.height=n.uiDialog.height(),o.width=n.uiDialog.width(),o.position={my:"left top",at:"left"+(0<=s?"+":"")+s+" top"+(0<=i?"+":"")+i,of:n.window},n._removeClass(k(this),"ui-dialog-resizing"),n._unblockFrames(),n._trigger("resizeStop",t,a(e))}}).css("position",e)},_trackFocus:function(){this._on(this.widget(),{focusin:function(t){this._makeFocusTarget(),this._focusedElement=k(t.target)}})},_makeFocusTarget:function(){this._untrackInstance(),this._trackingInstances().unshift(this)},_untrackInstance:function(){var t=this._trackingInstances(),e=k.inArray(this,t);-1!==e&&t.splice(e,1)},_trackingInstances:function(){var t=this.document.data("ui-dialog-instances");return t||(t=[],this.document.data("ui-dialog-instances",t)),t},_minHeight:function(){var t=this.options;return"auto"===t.height?t.minHeight:Math.min(t.minHeight,t.height)},_position:function(){var t=this.uiDialog.is(":visible");t||this.uiDialog.show(),this.uiDialog.position(this.options.position),t||this.uiDialog.hide()},_setOptions:function(t){var i=this,s=!1,n={};k.each(t,function(t,e){i._setOption(t,e),t in i.sizeRelatedOptions&&(s=!0),t in i.resizableRelatedOptions&&(n[t]=e)}),s&&(this._size(),this._position()),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option",n)},_setOption:function(t,e){var i,s=this.uiDialog;"disabled"!==t&&(this._super(t,e),"appendTo"===t&&this.uiDialog.appendTo(this._appendTo()),"buttons"===t&&this._createButtons(),"closeText"===t&&this.uiDialogTitlebarClose.button({label:k("<a>").text(""+this.options.closeText).html()}),"draggable"===t&&((i=s.is(":data(ui-draggable)"))&&!e&&s.draggable("destroy"),!i&&e&&this._makeDraggable()),"position"===t&&this._position(),"resizable"===t&&((i=s.is(":data(ui-resizable)"))&&!e&&s.resizable("destroy"),i&&"string"==typeof e&&s.resizable("option","handles",e),i||!1===e||this._makeResizable()),"title"===t&&this._title(this.uiDialogTitlebar.find(".ui-dialog-title")))},_size:function(){var t,e,i,s=this.options;this.element.show().css({width:"auto",minHeight:0,maxHeight:"none",height:0}),s.minWidth>s.width&&(s.width=s.minWidth),t=this.uiDialog.css({height:"auto",width:s.width}).outerHeight(),e=Math.max(0,s.minHeight-t),i="number"==typeof s.maxHeight?Math.max(0,s.maxHeight-t):"none","auto"===s.height?this.element.css({minHeight:e,maxHeight:i,height:"auto"}):this.element.height(Math.max(0,s.height-t)),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())},_blockFrames:function(){this.iframeBlocks=this.document.find("iframe").map(function(){var t=k(this);return k("<div>").css({position:"absolute",width:t.outerWidth(),height:t.outerHeight()}).appendTo(t.parent()).offset(t.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_allowInteraction:function(t){return!!k(t.target).closest(".ui-dialog").length||!!k(t.target).closest(".ui-datepicker").length},_createOverlay:function(){var e;this.options.modal&&(e=!0,this._delay(function(){e=!1}),this.document.data("ui-dialog-overlays")||this._on(this.document,{focusin:function(t){e||this._allowInteraction(t)||(t.preventDefault(),this._trackingInstances()[0]._focusTabbable())}}),this.overlay=k("<div>").appendTo(this._appendTo()),this._addClass(this.overlay,null,"ui-widget-overlay ui-front"),this._on(this.overlay,{mousedown:"_keepFocus"}),this.document.data("ui-dialog-overlays",(this.document.data("ui-dialog-overlays")||0)+1))},_destroyOverlay:function(){var t;this.options.modal&&this.overlay&&((t=this.document.data("ui-dialog-overlays")-1)?this.document.data("ui-dialog-overlays",t):(this._off(this.document,"focusin"),this.document.removeData("ui-dialog-overlays")),this.overlay.remove(),this.overlay=null)}}),!1!==k.uiBackCompat&&k.widget("ui.dialog",k.ui.dialog,{options:{dialogClass:""},_createWrapper:function(){this._super(),this.uiDialog.addClass(this.options.dialogClass)},_setOption:function(t,e){"dialogClass"===t&&this.uiDialog.removeClass(this.options.dialogClass).addClass(e),this._superApply(arguments)}});k.ui.dialog,k.widget("ui.progressbar",{version:"1.12.1",options:{classes:{"ui-progressbar":"ui-corner-all","ui-progressbar-value":"ui-corner-left","ui-progressbar-complete":"ui-corner-right"},max:100,value:0,change:null,complete:null},min:0,_create:function(){this.oldValue=this.options.value=this._constrainedValue(),this.element.attr({role:"progressbar","aria-valuemin":this.min}),this._addClass("ui-progressbar","ui-widget ui-widget-content"),this.valueDiv=k("<div>").appendTo(this.element),this._addClass(this.valueDiv,"ui-progressbar-value","ui-widget-header"),this._refreshValue()},_destroy:function(){this.element.removeAttr("role aria-valuemin aria-valuemax aria-valuenow"),this.valueDiv.remove()},value:function(t){if(void 0===t)return this.options.value;this.options.value=this._constrainedValue(t),this._refreshValue()},_constrainedValue:function(t){return void 0===t&&(t=this.options.value),this.indeterminate=!1===t,"number"!=typeof t&&(t=0),!this.indeterminate&&Math.min(this.options.max,Math.max(this.min,t))},_setOptions:function(t){var e=t.value;delete t.value,this._super(t),this.options.value=this._constrainedValue(e),this._refreshValue()},_setOption:function(t,e){"max"===t&&(e=Math.max(this.min,e)),this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t),this._toggleClass(null,"ui-state-disabled",!!t)},_percentage:function(){return this.indeterminate?100:100*(this.options.value-this.min)/(this.options.max-this.min)},_refreshValue:function(){var t=this.options.value,e=this._percentage();this.valueDiv.toggle(this.indeterminate||t>this.min).width(e.toFixed(0)+"%"),this._toggleClass(this.valueDiv,"ui-progressbar-complete",null,t===this.options.max)._toggleClass("ui-progressbar-indeterminate",null,this.indeterminate),this.indeterminate?(this.element.removeAttr("aria-valuenow"),this.overlayDiv||(this.overlayDiv=k("<div>").appendTo(this.valueDiv),this._addClass(this.overlayDiv,"ui-progressbar-overlay"))):(this.element.attr({"aria-valuemax":this.options.max,"aria-valuenow":t}),this.overlayDiv&&(this.overlayDiv.remove(),this.overlayDiv=null)),this.oldValue!==t&&(this.oldValue=t,this._trigger("change")),t===this.options.max&&this._trigger("complete")}}),k.widget("ui.selectmenu",[k.ui.formResetMixin,{version:"1.12.1",defaultElement:"<select>",options:{appendTo:null,classes:{"ui-selectmenu-button-open":"ui-corner-top","ui-selectmenu-button-closed":"ui-corner-all"},disabled:null,icons:{button:"ui-icon-triangle-1-s"},position:{my:"left top",at:"left bottom",collision:"none"},width:!1,change:null,close:null,focus:null,open:null,select:null},_create:function(){var t=this.element.uniqueId().attr("id");this.ids={element:t,button:t+"-button",menu:t+"-menu"},this._drawButton(),this._drawMenu(),this._bindFormResetHandler(),this._rendered=!1,this.menuItems=k()},_drawButton:function(){var t,e=this,i=this._parseOption(this.element.find("option:selected"),this.element[0].selectedIndex);this.labels=this.element.labels().attr("for",this.ids.button),this._on(this.labels,{click:function(t){this.button.focus(),t.preventDefault()}}),this.element.hide(),this.button=k("<span>",{tabindex:this.options.disabled?-1:0,id:this.ids.button,role:"combobox","aria-expanded":"false","aria-autocomplete":"list","aria-owns":this.ids.menu,"aria-haspopup":"true",title:this.element.attr("title")}).insertAfter(this.element),this._addClass(this.button,"ui-selectmenu-button ui-selectmenu-button-closed","ui-button ui-widget"),t=k("<span>").appendTo(this.button),this._addClass(t,"ui-selectmenu-icon","ui-icon "+this.options.icons.button),this.buttonItem=this._renderButtonItem(i).appendTo(this.button),!1!==this.options.width&&this._resizeButton(),this._on(this.button,this._buttonEvents),this.button.one("focusin",function(){e._rendered||e._refreshMenu()})},_drawMenu:function(){var i=this;this.menu=k("<ul>",{"aria-hidden":"true","aria-labelledby":this.ids.button,id:this.ids.menu}),this.menuWrap=k("<div>").append(this.menu),this._addClass(this.menuWrap,"ui-selectmenu-menu","ui-front"),this.menuWrap.appendTo(this._appendTo()),this.menuInstance=this.menu.menu({classes:{"ui-menu":"ui-corner-bottom"},role:"listbox",select:function(t,e){t.preventDefault(),i._setSelection(),i._select(e.item.data("ui-selectmenu-item"),t)},focus:function(t,e){e=e.item.data("ui-selectmenu-item");null!=i.focusIndex&&e.index!==i.focusIndex&&(i._trigger("focus",t,{item:e}),i.isOpen||i._select(e,t)),i.focusIndex=e.index,i.button.attr("aria-activedescendant",i.menuItems.eq(e.index).attr("id"))}}).menu("instance"),this.menuInstance._off(this.menu,"mouseleave"),this.menuInstance._closeOnDocumentClick=function(){return!1},this.menuInstance._isDivider=function(){return!1}},refresh:function(){this._refreshMenu(),this.buttonItem.replaceWith(this.buttonItem=this._renderButtonItem(this._getSelectedItem().data("ui-selectmenu-item")||{})),null===this.options.width&&this._resizeButton()},_refreshMenu:function(){var t=this.element.find("option");this.menu.empty(),this._parseOptions(t),this._renderMenu(this.menu,this.items),this.menuInstance.refresh(),this.menuItems=this.menu.find("li").not(".ui-selectmenu-optgroup").find(".ui-menu-item-wrapper"),this._rendered=!0,t.length&&(t=this._getSelectedItem(),this.menuInstance.focus(null,t),this._setAria(t.data("ui-selectmenu-item")),this._setOption("disabled",this.element.prop("disabled")))},open:function(t){this.options.disabled||(this._rendered?(this._removeClass(this.menu.find(".ui-state-active"),null,"ui-state-active"),this.menuInstance.focus(null,this._getSelectedItem())):this._refreshMenu(),this.menuItems.length&&(this.isOpen=!0,this._toggleAttr(),this._resizeMenu(),this._position(),this._on(this.document,this._documentClick),this._trigger("open",t)))},_position:function(){this.menuWrap.position(k.extend({of:this.button},this.options.position))},close:function(t){this.isOpen&&(this.isOpen=!1,this._toggleAttr(),this.range=null,this._off(this.document),this._trigger("close",t))},widget:function(){return this.button},menuWidget:function(){return this.menu},_renderButtonItem:function(t){var e=k("<span>");return this._setText(e,t.label),this._addClass(e,"ui-selectmenu-text"),e},_renderMenu:function(s,t){var n=this,o="";k.each(t,function(t,e){var i;e.optgroup!==o&&(i=k("<li>",{text:e.optgroup}),n._addClass(i,"ui-selectmenu-optgroup","ui-menu-divider"+(e.element.parent("optgroup").prop("disabled")?" ui-state-disabled":"")),i.appendTo(s),o=e.optgroup),n._renderItemData(s,e)})},_renderItemData:function(t,e){return this._renderItem(t,e).data("ui-selectmenu-item",e)},_renderItem:function(t,e){var i=k("<li>"),s=k("<div>",{title:e.element.attr("title")});return e.disabled&&this._addClass(i,null,"ui-state-disabled"),this._setText(s,e.label),i.append(s).appendTo(t)},_setText:function(t,e){e?t.text(e):t.html("&#160;")},_move:function(t,e){var i,s=".ui-menu-item";this.isOpen?i=this.menuItems.eq(this.focusIndex).parent("li"):(i=this.menuItems.eq(this.element[0].selectedIndex).parent("li"),s+=":not(.ui-state-disabled)"),(s="first"===t||"last"===t?i["first"===t?"prevAll":"nextAll"](s).eq(-1):i[t+"All"](s).eq(0)).length&&this.menuInstance.focus(e,s)},_getSelectedItem:function(){return this.menuItems.eq(this.element[0].selectedIndex).parent("li")},_toggle:function(t){this[this.isOpen?"close":"open"](t)},_setSelection:function(){var t;this.range&&(window.getSelection?((t=window.getSelection()).removeAllRanges(),t.addRange(this.range)):this.range.select(),this.button.focus())},_documentClick:{mousedown:function(t){this.isOpen&&(k(t.target).closest(".ui-selectmenu-menu, #"+k.ui.escapeSelector(this.ids.button)).length||this.close(t))}},_buttonEvents:{mousedown:function(){var t;window.getSelection?(t=window.getSelection()).rangeCount&&(this.range=t.getRangeAt(0)):this.range=document.selection.createRange()},click:function(t){this._setSelection(),this._toggle(t)},keydown:function(t){var e=!0;switch(t.keyCode){case k.ui.keyCode.TAB:case k.ui.keyCode.ESCAPE:this.close(t),e=!1;break;case k.ui.keyCode.ENTER:this.isOpen&&this._selectFocusedItem(t);break;case k.ui.keyCode.UP:t.altKey?this._toggle(t):this._move("prev",t);break;case k.ui.keyCode.DOWN:t.altKey?this._toggle(t):this._move("next",t);break;case k.ui.keyCode.SPACE:this.isOpen?this._selectFocusedItem(t):this._toggle(t);break;case k.ui.keyCode.LEFT:this._move("prev",t);break;case k.ui.keyCode.RIGHT:this._move("next",t);break;case k.ui.keyCode.HOME:case k.ui.keyCode.PAGE_UP:this._move("first",t);break;case k.ui.keyCode.END:case k.ui.keyCode.PAGE_DOWN:this._move("last",t);break;default:this.menu.trigger(t),e=!1}e&&t.preventDefault()}},_selectFocusedItem:function(t){var e=this.menuItems.eq(this.focusIndex).parent("li");e.hasClass("ui-state-disabled")||this._select(e.data("ui-selectmenu-item"),t)},_select:function(t,e){var i=this.element[0].selectedIndex;this.element[0].selectedIndex=t.index,this.buttonItem.replaceWith(this.buttonItem=this._renderButtonItem(t)),this._setAria(t),this._trigger("select",e,{item:t}),t.index!==i&&this._trigger("change",e,{item:t}),this.close(e)},_setAria:function(t){t=this.menuItems.eq(t.index).attr("id");this.button.attr({"aria-labelledby":t,"aria-activedescendant":t}),this.menu.attr("aria-activedescendant",t)},_setOption:function(t,e){var i;"icons"===t&&(i=this.button.find("span.ui-icon"),this._removeClass(i,null,this.options.icons.button)._addClass(i,null,e.button)),this._super(t,e),"appendTo"===t&&this.menuWrap.appendTo(this._appendTo()),"width"===t&&this._resizeButton()},_setOptionDisabled:function(t){this._super(t),this.menuInstance.option("disabled",t),this.button.attr("aria-disabled",t),this._toggleClass(this.button,null,"ui-state-disabled",t),this.element.prop("disabled",t),t?(this.button.attr("tabindex",-1),this.close()):this.button.attr("tabindex",0)},_appendTo:function(){var t=this.options.appendTo;return(t=t&&(t.jquery||t.nodeType?k(t):this.document.find(t).eq(0)))&&t[0]||(t=this.element.closest(".ui-front, dialog")),t.length||(t=this.document[0].body),t},_toggleAttr:function(){this.button.attr("aria-expanded",this.isOpen),this._removeClass(this.button,"ui-selectmenu-button-"+(this.isOpen?"closed":"open"))._addClass(this.button,"ui-selectmenu-button-"+(this.isOpen?"open":"closed"))._toggleClass(this.menuWrap,"ui-selectmenu-open",null,this.isOpen),this.menu.attr("aria-hidden",!this.isOpen)},_resizeButton:function(){var t=this.options.width;!1!==t?(null===t&&(t=this.element.show().outerWidth(),this.element.hide()),this.button.outerWidth(t)):this.button.css("width","")},_resizeMenu:function(){this.menu.outerWidth(Math.max(this.button.outerWidth(),this.menu.width("").outerWidth()+1))},_getCreateOptions:function(){var t=this._super();return t.disabled=this.element.prop("disabled"),t},_parseOptions:function(t){var i=this,s=[];t.each(function(t,e){s.push(i._parseOption(k(e),t))}),this.items=s},_parseOption:function(t,e){var i=t.parent("optgroup");return{element:t,index:e,value:t.val(),label:t.text(),optgroup:i.attr("label")||"",disabled:i.prop("disabled")||t.prop("disabled")}},_destroy:function(){this._unbindFormResetHandler(),this.menuWrap.remove(),this.button.remove(),this.element.show(),this.element.removeUniqueId(),this.labels.attr("for",this.ids.element)}}]),k.widget("ui.slider",k.ui.mouse,{version:"1.12.1",widgetEventPrefix:"slide",options:{animate:!1,classes:{"ui-slider":"ui-corner-all","ui-slider-handle":"ui-corner-all","ui-slider-range":"ui-corner-all ui-widget-header"},distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null,change:null,slide:null,start:null,stop:null},numPages:5,_create:function(){this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this._calculateNewMax(),this._addClass("ui-slider ui-slider-"+this.orientation,"ui-widget ui-widget-content"),this._refresh(),this._animateOff=!1},_refresh:function(){this._createRange(),this._createHandles(),this._setupEvents(),this._refreshValue()},_createHandles:function(){var t,e=this.options,i=this.element.find(".ui-slider-handle"),s=[],n=e.values&&e.values.length||1;for(i.length>n&&(i.slice(n).remove(),i=i.slice(0,n)),t=i.length;t<n;t++)s.push("<span tabindex='0'></span>");this.handles=i.add(k(s.join("")).appendTo(this.element)),this._addClass(this.handles,"ui-slider-handle","ui-state-default"),this.handle=this.handles.eq(0),this.handles.each(function(t){k(this).data("ui-slider-handle-index",t).attr("tabIndex",0)})},_createRange:function(){var t=this.options;t.range?(!0===t.range&&(t.values?t.values.length&&2!==t.values.length?t.values=[t.values[0],t.values[0]]:k.isArray(t.values)&&(t.values=t.values.slice(0)):t.values=[this._valueMin(),this._valueMin()]),this.range&&this.range.length?(this._removeClass(this.range,"ui-slider-range-min ui-slider-range-max"),this.range.css({left:"",bottom:""})):(this.range=k("<div>").appendTo(this.element),this._addClass(this.range,"ui-slider-range")),"min"!==t.range&&"max"!==t.range||this._addClass(this.range,"ui-slider-range-"+t.range)):(this.range&&this.range.remove(),this.range=null)},_setupEvents:function(){this._off(this.handles),this._on(this.handles,this._handleEvents),this._hoverable(this.handles),this._focusable(this.handles)},_destroy:function(){this.handles.remove(),this.range&&this.range.remove(),this._mouseDestroy()},_mouseCapture:function(t){var i,s,n,o,e,a,r=this,h=this.options;return!h.disabled&&(this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),a={x:t.pageX,y:t.pageY},i=this._normValueFromMouse(a),s=this._valueMax()-this._valueMin()+1,this.handles.each(function(t){var e=Math.abs(i-r.values(t));(e<s||s===e&&(t===r._lastChangedValue||r.values(t)===h.min))&&(s=e,n=k(this),o=t)}),!1!==this._start(t,o)&&(this._mouseSliding=!0,this._handleIndex=o,this._addClass(n,null,"ui-state-active"),n.trigger("focus"),e=n.offset(),a=!k(t.target).parents().addBack().is(".ui-slider-handle"),this._clickOffset=a?{left:0,top:0}:{left:t.pageX-e.left-n.width()/2,top:t.pageY-e.top-n.height()/2-(parseInt(n.css("borderTopWidth"),10)||0)-(parseInt(n.css("borderBottomWidth"),10)||0)+(parseInt(n.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(t,o,i),this._animateOff=!0))},_mouseStart:function(){return!0},_mouseDrag:function(t){var e={x:t.pageX,y:t.pageY},e=this._normValueFromMouse(e);return this._slide(t,this._handleIndex,e),!1},_mouseStop:function(t){return this._removeClass(this.handles,null,"ui-state-active"),this._mouseSliding=!1,this._stop(t,this._handleIndex),this._change(t,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1},_detectOrientation:function(){this.orientation="vertical"===this.options.orientation?"vertical":"horizontal"},_normValueFromMouse:function(t){var e,t="horizontal"===this.orientation?(e=this.elementSize.width,t.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(e=this.elementSize.height,t.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),t=t/e;return 1<t&&(t=1),t<0&&(t=0),"vertical"===this.orientation&&(t=1-t),e=this._valueMax()-this._valueMin(),e=this._valueMin()+t*e,this._trimAlignValue(e)},_uiHash:function(t,e,i){var s={handle:this.handles[t],handleIndex:t,value:void 0!==e?e:this.value()};return this._hasMultipleValues()&&(s.value=void 0!==e?e:this.values(t),s.values=i||this.values()),s},_hasMultipleValues:function(){return this.options.values&&this.options.values.length},_start:function(t,e){return this._trigger("start",t,this._uiHash(e))},_slide:function(t,e,i){var s,n=this.value(),o=this.values();this._hasMultipleValues()&&(s=this.values(e?0:1),n=this.values(e),2===this.options.values.length&&!0===this.options.range&&(i=0===e?Math.min(s,i):Math.max(s,i)),o[e]=i),i!==n&&!1!==this._trigger("slide",t,this._uiHash(e,i,o))&&(this._hasMultipleValues()?this.values(e,i):this.value(i))},_stop:function(t,e){this._trigger("stop",t,this._uiHash(e))},_change:function(t,e){this._keySliding||this._mouseSliding||(this._lastChangedValue=e,this._trigger("change",t,this._uiHash(e)))},value:function(t){return arguments.length?(this.options.value=this._trimAlignValue(t),this._refreshValue(),void this._change(null,0)):this._value()},values:function(t,e){var i,s,n;if(1<arguments.length)return this.options.values[t]=this._trimAlignValue(e),this._refreshValue(),void this._change(null,t);if(!arguments.length)return this._values();if(!k.isArray(t))return this._hasMultipleValues()?this._values(t):this.value();for(i=this.options.values,s=t,n=0;n<i.length;n+=1)i[n]=this._trimAlignValue(s[n]),this._change(null,n);this._refreshValue()},_setOption:function(t,e){var i,s=0;switch("range"===t&&!0===this.options.range&&("min"===e?(this.options.value=this._values(0),this.options.values=null):"max"===e&&(this.options.value=this._values(this.options.values.length-1),this.options.values=null)),k.isArray(this.options.values)&&(s=this.options.values.length),this._super(t,e),t){case"orientation":this._detectOrientation(),this._removeClass("ui-slider-horizontal ui-slider-vertical")._addClass("ui-slider-"+this.orientation),this._refreshValue(),this.options.range&&this._refreshRange(e),this.handles.css("horizontal"===e?"bottom":"left","");break;case"value":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case"values":for(this._animateOff=!0,this._refreshValue(),i=s-1;0<=i;i--)this._change(null,i);this._animateOff=!1;break;case"step":case"min":case"max":this._animateOff=!0,this._calculateNewMax(),this._refreshValue(),this._animateOff=!1;break;case"range":this._animateOff=!0,this._refresh(),this._animateOff=!1}},_setOptionDisabled:function(t){this._super(t),this._toggleClass(null,"ui-state-disabled",!!t)},_value:function(){var t=this.options.value;return t=this._trimAlignValue(t)},_values:function(t){var e,i,s;if(arguments.length)return e=this.options.values[t],this._trimAlignValue(e);if(this._hasMultipleValues()){for(i=this.options.values.slice(),s=0;s<i.length;s+=1)i[s]=this._trimAlignValue(i[s]);return i}return[]},_trimAlignValue:function(t){if(t<=this._valueMin())return this._valueMin();if(t>=this._valueMax())return this._valueMax();var e=0<this.options.step?this.options.step:1,i=(t-this._valueMin())%e,t=t-i;return 2*Math.abs(i)>=e&&(t+=0<i?e:-e),parseFloat(t.toFixed(5))},_calculateNewMax:function(){var t=this.options.max,e=this._valueMin(),i=this.options.step;(t=Math.round((t-e)/i)*i+e)>this.options.max&&(t-=i),this.max=parseFloat(t.toFixed(this._precision()))},_precision:function(){var t=this._precisionOf(this.options.step);return null!==this.options.min&&(t=Math.max(t,this._precisionOf(this.options.min))),t},_precisionOf:function(t){var e=t.toString(),t=e.indexOf(".");return-1===t?0:e.length-t-1},_valueMin:function(){return this.options.min},_valueMax:function(){return this.max},_refreshRange:function(t){"vertical"===t&&this.range.css({width:"",left:""}),"horizontal"===t&&this.range.css({height:"",bottom:""})},_refreshValue:function(){var e,i,t,s,n,o=this.options.range,a=this.options,r=this,h=!this._animateOff&&a.animate,l={};this._hasMultipleValues()?this.handles.each(function(t){i=(r.values(t)-r._valueMin())/(r._valueMax()-r._valueMin())*100,l["horizontal"===r.orientation?"left":"bottom"]=i+"%",k(this).stop(1,1)[h?"animate":"css"](l,a.animate),!0===r.options.range&&("horizontal"===r.orientation?(0===t&&r.range.stop(1,1)[h?"animate":"css"]({left:i+"%"},a.animate),1===t&&r.range[h?"animate":"css"]({width:i-e+"%"},{queue:!1,duration:a.animate})):(0===t&&r.range.stop(1,1)[h?"animate":"css"]({bottom:i+"%"},a.animate),1===t&&r.range[h?"animate":"css"]({height:i-e+"%"},{queue:!1,duration:a.animate}))),e=i}):(t=this.value(),s=this._valueMin(),n=this._valueMax(),i=n!==s?(t-s)/(n-s)*100:0,l["horizontal"===this.orientation?"left":"bottom"]=i+"%",this.handle.stop(1,1)[h?"animate":"css"](l,a.animate),"min"===o&&"horizontal"===this.orientation&&this.range.stop(1,1)[h?"animate":"css"]({width:i+"%"},a.animate),"max"===o&&"horizontal"===this.orientation&&this.range.stop(1,1)[h?"animate":"css"]({width:100-i+"%"},a.animate),"min"===o&&"vertical"===this.orientation&&this.range.stop(1,1)[h?"animate":"css"]({height:i+"%"},a.animate),"max"===o&&"vertical"===this.orientation&&this.range.stop(1,1)[h?"animate":"css"]({height:100-i+"%"},a.animate))},_handleEvents:{keydown:function(t){var e,i,s,n=k(t.target).data("ui-slider-handle-index");switch(t.keyCode){case k.ui.keyCode.HOME:case k.ui.keyCode.END:case k.ui.keyCode.PAGE_UP:case k.ui.keyCode.PAGE_DOWN:case k.ui.keyCode.UP:case k.ui.keyCode.RIGHT:case k.ui.keyCode.DOWN:case k.ui.keyCode.LEFT:if(t.preventDefault(),!this._keySliding&&(this._keySliding=!0,this._addClass(k(t.target),null,"ui-state-active"),!1===this._start(t,n)))return}switch(s=this.options.step,e=i=this._hasMultipleValues()?this.values(n):this.value(),t.keyCode){case k.ui.keyCode.HOME:i=this._valueMin();break;case k.ui.keyCode.END:i=this._valueMax();break;case k.ui.keyCode.PAGE_UP:i=this._trimAlignValue(e+(this._valueMax()-this._valueMin())/this.numPages);break;case k.ui.keyCode.PAGE_DOWN:i=this._trimAlignValue(e-(this._valueMax()-this._valueMin())/this.numPages);break;case k.ui.keyCode.UP:case k.ui.keyCode.RIGHT:if(e===this._valueMax())return;i=this._trimAlignValue(e+s);break;case k.ui.keyCode.DOWN:case k.ui.keyCode.LEFT:if(e===this._valueMin())return;i=this._trimAlignValue(e-s)}this._slide(t,n,i)},keyup:function(t){var e=k(t.target).data("ui-slider-handle-index");this._keySliding&&(this._keySliding=!1,this._stop(t,e),this._change(t,e),this._removeClass(k(t.target),null,"ui-state-active"))}}});function P(e){return function(){var t=this.element.val();e.apply(this,arguments),this._refresh(),t!==this.element.val()&&this._trigger("change")}}k.widget("ui.spinner",{version:"1.12.1",defaultElement:"<input>",widgetEventPrefix:"spin",options:{classes:{"ui-spinner":"ui-corner-all","ui-spinner-down":"ui-corner-br","ui-spinner-up":"ui-corner-tr"},culture:null,icons:{down:"ui-icon-triangle-1-s",up:"ui-icon-triangle-1-n"},incremental:!0,max:null,min:null,numberFormat:null,page:10,step:1,change:null,spin:null,start:null,stop:null},_create:function(){this._setOption("max",this.options.max),this._setOption("min",this.options.min),this._setOption("step",this.options.step),""!==this.value()&&this._value(this.element.val(),!0),this._draw(),this._on(this._events),this._refresh(),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_getCreateOptions:function(){var s=this._super(),n=this.element;return k.each(["min","max","step"],function(t,e){var i=n.attr(e);null!=i&&i.length&&(s[e]=i)}),s},_events:{keydown:function(t){this._start(t)&&this._keydown(t)&&t.preventDefault()},keyup:"_stop",focus:function(){this.previous=this.element.val()},blur:function(t){this.cancelBlur?delete this.cancelBlur:(this._stop(),this._refresh(),this.previous!==this.element.val()&&this._trigger("change",t))},mousewheel:function(t,e){if(e){if(!this.spinning&&!this._start(t))return!1;this._spin((0<e?1:-1)*this.options.step,t),clearTimeout(this.mousewheelTimer),this.mousewheelTimer=this._delay(function(){this.spinning&&this._stop(t)},100),t.preventDefault()}},"mousedown .ui-spinner-button":function(t){var e;function i(){this.element[0]===k.ui.safeActiveElement(this.document[0])||(this.element.trigger("focus"),this.previous=e,this._delay(function(){this.previous=e}))}e=this.element[0]===k.ui.safeActiveElement(this.document[0])?this.previous:this.element.val(),t.preventDefault(),i.call(this),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,i.call(this)}),!1!==this._start(t)&&this._repeat(null,k(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t)},"mouseup .ui-spinner-button":"_stop","mouseenter .ui-spinner-button":function(t){if(k(t.currentTarget).hasClass("ui-state-active"))return!1!==this._start(t)&&void this._repeat(null,k(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t)},"mouseleave .ui-spinner-button":"_stop"},_enhance:function(){this.uiSpinner=this.element.attr("autocomplete","off").wrap("<span>").parent().append("<a></a><a></a>")},_draw:function(){this._enhance(),this._addClass(this.uiSpinner,"ui-spinner","ui-widget ui-widget-content"),this._addClass("ui-spinner-input"),this.element.attr("role","spinbutton"),this.buttons=this.uiSpinner.children("a").attr("tabIndex",-1).attr("aria-hidden",!0).button({classes:{"ui-button":""}}),this._removeClass(this.buttons,"ui-corner-all"),this._addClass(this.buttons.first(),"ui-spinner-button ui-spinner-up"),this._addClass(this.buttons.last(),"ui-spinner-button ui-spinner-down"),this.buttons.first().button({icon:this.options.icons.up,showLabel:!1}),this.buttons.last().button({icon:this.options.icons.down,showLabel:!1}),this.buttons.height()>Math.ceil(.5*this.uiSpinner.height())&&0<this.uiSpinner.height()&&this.uiSpinner.height(this.uiSpinner.height())},_keydown:function(t){var e=this.options,i=k.ui.keyCode;switch(t.keyCode){case i.UP:return this._repeat(null,1,t),!0;case i.DOWN:return this._repeat(null,-1,t),!0;case i.PAGE_UP:return this._repeat(null,e.page,t),!0;case i.PAGE_DOWN:return this._repeat(null,-e.page,t),!0}return!1},_start:function(t){return!(!this.spinning&&!1===this._trigger("start",t))&&(this.counter||(this.counter=1),this.spinning=!0)},_repeat:function(t,e,i){t=t||500,clearTimeout(this.timer),this.timer=this._delay(function(){this._repeat(40,e,i)},t),this._spin(e*this.options.step,i)},_spin:function(t,e){var i=this.value()||0;this.counter||(this.counter=1),i=this._adjustValue(i+t*this._increment(this.counter)),this.spinning&&!1===this._trigger("spin",e,{value:i})||(this._value(i),this.counter++)},_increment:function(t){var e=this.options.incremental;return e?k.isFunction(e)?e(t):Math.floor(t*t*t/5e4-t*t/500+17*t/200+1):1},_precision:function(){var t=this._precisionOf(this.options.step);return null!==this.options.min&&(t=Math.max(t,this._precisionOf(this.options.min))),t},_precisionOf:function(t){var e=t.toString(),t=e.indexOf(".");return-1===t?0:e.length-t-1},_adjustValue:function(t){var e=this.options,i=null!==e.min?e.min:0,s=t-i;return t=i+Math.round(s/e.step)*e.step,t=parseFloat(t.toFixed(this._precision())),null!==e.max&&t>e.max?e.max:null!==e.min&&t<e.min?e.min:t},_stop:function(t){this.spinning&&(clearTimeout(this.timer),clearTimeout(this.mousewheelTimer),this.counter=0,this.spinning=!1,this._trigger("stop",t))},_setOption:function(t,e){var i;if("culture"===t||"numberFormat"===t)return i=this._parse(this.element.val()),this.options[t]=e,void this.element.val(this._format(i));"max"!==t&&"min"!==t&&"step"!==t||"string"==typeof e&&(e=this._parse(e)),"icons"===t&&(i=this.buttons.first().find(".ui-icon"),this._removeClass(i,null,this.options.icons.up),this._addClass(i,null,e.up),i=this.buttons.last().find(".ui-icon"),this._removeClass(i,null,this.options.icons.down),this._addClass(i,null,e.down)),this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this._toggleClass(this.uiSpinner,null,"ui-state-disabled",!!t),this.element.prop("disabled",!!t),this.buttons.button(t?"disable":"enable")},_setOptions:P(function(t){this._super(t)}),_parse:function(t){return"string"==typeof t&&""!==t&&(t=window.Globalize&&this.options.numberFormat?Globalize.parseFloat(t,10,this.options.culture):+t),""===t||isNaN(t)?null:t},_format:function(t){return""===t?"":window.Globalize&&this.options.numberFormat?Globalize.format(t,this.options.numberFormat,this.options.culture):t},_refresh:function(){this.element.attr({"aria-valuemin":this.options.min,"aria-valuemax":this.options.max,"aria-valuenow":this._parse(this.element.val())})},isValid:function(){var t=this.value();return null!==t&&t===this._adjustValue(t)},_value:function(t,e){var i;""!==t&&null!==(i=this._parse(t))&&(e||(i=this._adjustValue(i)),t=this._format(i)),this.element.val(t),this._refresh()},_destroy:function(){this.element.prop("disabled",!1).removeAttr("autocomplete role aria-valuemin aria-valuemax aria-valuenow"),this.uiSpinner.replaceWith(this.element)},stepUp:P(function(t){this._stepUp(t)}),_stepUp:function(t){this._start()&&(this._spin((t||1)*this.options.step),this._stop())},stepDown:P(function(t){this._stepDown(t)}),_stepDown:function(t){this._start()&&(this._spin((t||1)*-this.options.step),this._stop())},pageUp:P(function(t){this._stepUp((t||1)*this.options.page)}),pageDown:P(function(t){this._stepDown((t||1)*this.options.page)}),value:function(t){if(!arguments.length)return this._parse(this.element.val());P(this._value).call(this,t)},widget:function(){return this.uiSpinner}}),!1!==k.uiBackCompat&&k.widget("ui.spinner",k.ui.spinner,{_enhance:function(){this.uiSpinner=this.element.attr("autocomplete","off").wrap(this._uiSpinnerHtml()).parent().append(this._buttonHtml())},_uiSpinnerHtml:function(){return"<span>"},_buttonHtml:function(){return"<a></a><a></a>"}});var M;k.ui.spinner;k.widget("ui.tabs",{version:"1.12.1",delay:300,options:{active:null,classes:{"ui-tabs":"ui-corner-all","ui-tabs-nav":"ui-corner-all","ui-tabs-panel":"ui-corner-bottom","ui-tabs-tab":"ui-corner-top"},collapsible:!1,event:"click",heightStyle:"content",hide:null,show:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_isLocal:(M=/#.*$/,function(t){var e=t.href.replace(M,""),i=location.href.replace(M,"");try{e=decodeURIComponent(e)}catch(t){}try{i=decodeURIComponent(i)}catch(t){}return 1<t.hash.length&&e===i}),_create:function(){var e=this,t=this.options;this.running=!1,this._addClass("ui-tabs","ui-widget ui-widget-content"),this._toggleClass("ui-tabs-collapsible",null,t.collapsible),this._processTabs(),t.active=this._initialActive(),k.isArray(t.disabled)&&(t.disabled=k.unique(t.disabled.concat(k.map(this.tabs.filter(".ui-state-disabled"),function(t){return e.tabs.index(t)}))).sort()),!1!==this.options.active&&this.anchors.length?this.active=this._findActive(t.active):this.active=k(),this._refresh(),this.active.length&&this.load(t.active)},_initialActive:function(){var i=this.options.active,t=this.options.collapsible,s=location.hash.substring(1);return null===i&&(s&&this.tabs.each(function(t,e){if(k(e).attr("aria-controls")===s)return i=t,!1}),null===i&&(i=this.tabs.index(this.tabs.filter(".ui-tabs-active"))),null!==i&&-1!==i||(i=!!this.tabs.length&&0)),!1!==i&&-1===(i=this.tabs.index(this.tabs.eq(i)))&&(i=!t&&0),!t&&!1===i&&this.anchors.length&&(i=0),i},_getCreateEventData:function(){return{tab:this.active,panel:this.active.length?this._getPanelForTab(this.active):k()}},_tabKeydown:function(t){var e=k(k.ui.safeActiveElement(this.document[0])).closest("li"),i=this.tabs.index(e),s=!0;if(!this._handlePageNav(t)){switch(t.keyCode){case k.ui.keyCode.RIGHT:case k.ui.keyCode.DOWN:i++;break;case k.ui.keyCode.UP:case k.ui.keyCode.LEFT:s=!1,i--;break;case k.ui.keyCode.END:i=this.anchors.length-1;break;case k.ui.keyCode.HOME:i=0;break;case k.ui.keyCode.SPACE:return t.preventDefault(),clearTimeout(this.activating),void this._activate(i);case k.ui.keyCode.ENTER:return t.preventDefault(),clearTimeout(this.activating),void this._activate(i!==this.options.active&&i);default:return}t.preventDefault(),clearTimeout(this.activating),i=this._focusNextTab(i,s),t.ctrlKey||t.metaKey||(e.attr("aria-selected","false"),this.tabs.eq(i).attr("aria-selected","true"),this.activating=this._delay(function(){this.option("active",i)},this.delay))}},_panelKeydown:function(t){this._handlePageNav(t)||t.ctrlKey&&t.keyCode===k.ui.keyCode.UP&&(t.preventDefault(),this.active.trigger("focus"))},_handlePageNav:function(t){return t.altKey&&t.keyCode===k.ui.keyCode.PAGE_UP?(this._activate(this._focusNextTab(this.options.active-1,!1)),!0):t.altKey&&t.keyCode===k.ui.keyCode.PAGE_DOWN?(this._activate(this._focusNextTab(this.options.active+1,!0)),!0):void 0},_findNextTab:function(t,e){var i=this.tabs.length-1;for(;-1!==k.inArray((i<t&&(t=0),t<0&&(t=i),t),this.options.disabled);)t=e?t+1:t-1;return t},_focusNextTab:function(t,e){return t=this._findNextTab(t,e),this.tabs.eq(t).trigger("focus"),t},_setOption:function(t,e){"active"!==t?(this._super(t,e),"collapsible"===t&&(this._toggleClass("ui-tabs-collapsible",null,e),e||!1!==this.options.active||this._activate(0)),"event"===t&&this._setupEvents(e),"heightStyle"===t&&this._setupHeightStyle(e)):this._activate(e)},_sanitizeSelector:function(t){return t?t.replace(/[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g,"\\$&"):""},refresh:function(){var t=this.options,e=this.tablist.children(":has(a[href])");t.disabled=k.map(e.filter(".ui-state-disabled"),function(t){return e.index(t)}),this._processTabs(),!1!==t.active&&this.anchors.length?this.active.length&&!k.contains(this.tablist[0],this.active[0])?this.tabs.length===t.disabled.length?(t.active=!1,this.active=k()):this._activate(this._findNextTab(Math.max(0,t.active-1),!1)):t.active=this.tabs.index(this.active):(t.active=!1,this.active=k()),this._refresh()},_refresh:function(){this._setOptionDisabled(this.options.disabled),this._setupEvents(this.options.event),this._setupHeightStyle(this.options.heightStyle),this.tabs.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}),this.panels.not(this._getPanelForTab(this.active)).hide().attr({"aria-hidden":"true"}),this.active.length?(this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}),this._addClass(this.active,"ui-tabs-active","ui-state-active"),this._getPanelForTab(this.active).show().attr({"aria-hidden":"false"})):this.tabs.eq(0).attr("tabIndex",0)},_processTabs:function(){var h=this,t=this.tabs,e=this.anchors,i=this.panels;this.tablist=this._getList().attr("role","tablist"),this._addClass(this.tablist,"ui-tabs-nav","ui-helper-reset ui-helper-clearfix ui-widget-header"),this.tablist.on("mousedown"+this.eventNamespace,"> li",function(t){k(this).is(".ui-state-disabled")&&t.preventDefault()}).on("focus"+this.eventNamespace,".ui-tabs-anchor",function(){k(this).closest("li").is(".ui-state-disabled")&&this.blur()}),this.tabs=this.tablist.find("> li:has(a[href])").attr({role:"tab",tabIndex:-1}),this._addClass(this.tabs,"ui-tabs-tab","ui-state-default"),this.anchors=this.tabs.map(function(){return k("a",this)[0]}).attr({role:"presentation",tabIndex:-1}),this._addClass(this.anchors,"ui-tabs-anchor"),this.panels=k(),this.anchors.each(function(t,e){var i,s,n,o=k(e).uniqueId().attr("id"),a=k(e).closest("li"),r=a.attr("aria-controls");h._isLocal(e)?(n=(i=e.hash).substring(1),s=h.element.find(h._sanitizeSelector(i))):(i="#"+(n=a.attr("aria-controls")||k({}).uniqueId()[0].id),(s=h.element.find(i)).length||(s=h._createPanel(n)).insertAfter(h.panels[t-1]||h.tablist),s.attr("aria-live","polite")),s.length&&(h.panels=h.panels.add(s)),r&&a.data("ui-tabs-aria-controls",r),a.attr({"aria-controls":n,"aria-labelledby":o}),s.attr("aria-labelledby",o)}),this.panels.attr("role","tabpanel"),this._addClass(this.panels,"ui-tabs-panel","ui-widget-content"),t&&(this._off(t.not(this.tabs)),this._off(e.not(this.anchors)),this._off(i.not(this.panels)))},_getList:function(){return this.tablist||this.element.find("ol, ul").eq(0)},_createPanel:function(t){return k("<div>").attr("id",t).data("ui-tabs-destroy",!0)},_setOptionDisabled:function(t){var e,i;for(k.isArray(t)&&(t.length?t.length===this.anchors.length&&(t=!0):t=!1),i=0;e=this.tabs[i];i++)e=k(e),!0===t||-1!==k.inArray(i,t)?(e.attr("aria-disabled","true"),this._addClass(e,null,"ui-state-disabled")):(e.removeAttr("aria-disabled"),this._removeClass(e,null,"ui-state-disabled"));this.options.disabled=t,this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!0===t)},_setupEvents:function(t){var i={};t&&k.each(t.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.anchors.add(this.tabs).add(this.panels)),this._on(!0,this.anchors,{click:function(t){t.preventDefault()}}),this._on(this.anchors,i),this._on(this.tabs,{keydown:"_tabKeydown"}),this._on(this.panels,{keydown:"_panelKeydown"}),this._focusable(this.tabs),this._hoverable(this.tabs)},_setupHeightStyle:function(t){var i,e=this.element.parent();"fill"===t?(i=e.height(),i-=this.element.outerHeight()-this.element.height(),this.element.siblings(":visible").each(function(){var t=k(this),e=t.css("position");"absolute"!==e&&"fixed"!==e&&(i-=t.outerHeight(!0))}),this.element.children().not(this.panels).each(function(){i-=k(this).outerHeight(!0)}),this.panels.each(function(){k(this).height(Math.max(0,i-k(this).innerHeight()+k(this).height()))}).css("overflow","auto")):"auto"===t&&(i=0,this.panels.each(function(){i=Math.max(i,k(this).height("").height())}).height(i))},_eventHandler:function(t){var e=this.options,i=this.active,s=k(t.currentTarget).closest("li"),n=s[0]===i[0],o=n&&e.collapsible,a=o?k():this._getPanelForTab(s),r=i.length?this._getPanelForTab(i):k(),i={oldTab:i,oldPanel:r,newTab:o?k():s,newPanel:a};t.preventDefault(),s.hasClass("ui-state-disabled")||s.hasClass("ui-tabs-loading")||this.running||n&&!e.collapsible||!1===this._trigger("beforeActivate",t,i)||(e.active=!o&&this.tabs.index(s),this.active=n?k():s,this.xhr&&this.xhr.abort(),r.length||a.length||k.error("jQuery UI Tabs: Mismatching fragment identifier."),a.length&&this.load(this.tabs.index(s),t),this._toggle(t,i))},_toggle:function(t,e){var i=this,s=e.newPanel,n=e.oldPanel;function o(){i.running=!1,i._trigger("activate",t,e)}function a(){i._addClass(e.newTab.closest("li"),"ui-tabs-active","ui-state-active"),s.length&&i.options.show?i._show(s,i.options.show,o):(s.show(),o())}this.running=!0,n.length&&this.options.hide?this._hide(n,this.options.hide,function(){i._removeClass(e.oldTab.closest("li"),"ui-tabs-active","ui-state-active"),a()}):(this._removeClass(e.oldTab.closest("li"),"ui-tabs-active","ui-state-active"),n.hide(),a()),n.attr("aria-hidden","true"),e.oldTab.attr({"aria-selected":"false","aria-expanded":"false"}),s.length&&n.length?e.oldTab.attr("tabIndex",-1):s.length&&this.tabs.filter(function(){return 0===k(this).attr("tabIndex")}).attr("tabIndex",-1),s.attr("aria-hidden","false"),e.newTab.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_activate:function(t){var t=this._findActive(t);t[0]!==this.active[0]&&(t.length||(t=this.active),t=t.find(".ui-tabs-anchor")[0],this._eventHandler({target:t,currentTarget:t,preventDefault:k.noop}))},_findActive:function(t){return!1===t?k():this.tabs.eq(t)},_getIndex:function(t){return"string"==typeof t&&(t=this.anchors.index(this.anchors.filter("[href$='"+k.ui.escapeSelector(t)+"']"))),t},_destroy:function(){this.xhr&&this.xhr.abort(),this.tablist.removeAttr("role").off(this.eventNamespace),this.anchors.removeAttr("role tabIndex").removeUniqueId(),this.tabs.add(this.panels).each(function(){k.data(this,"ui-tabs-destroy")?k(this).remove():k(this).removeAttr("role tabIndex aria-live aria-busy aria-selected aria-labelledby aria-hidden aria-expanded")}),this.tabs.each(function(){var t=k(this),e=t.data("ui-tabs-aria-controls");e?t.attr("aria-controls",e).removeData("ui-tabs-aria-controls"):t.removeAttr("aria-controls")}),this.panels.show(),"content"!==this.options.heightStyle&&this.panels.css("height","")},enable:function(i){var t=this.options.disabled;!1!==t&&(t=void 0!==i&&(i=this._getIndex(i),k.isArray(t)?k.map(t,function(t){return t!==i?t:null}):k.map(this.tabs,function(t,e){return e!==i?e:null})),this._setOptionDisabled(t))},disable:function(t){var e=this.options.disabled;if(!0!==e){if(void 0===t)e=!0;else{if(t=this._getIndex(t),-1!==k.inArray(t,e))return;e=k.isArray(e)?k.merge([t],e).sort():[t]}this._setOptionDisabled(e)}},load:function(t,s){t=this._getIndex(t);function n(t,e){"abort"===e&&o.panels.stop(!1,!0),o._removeClass(i,"ui-tabs-loading"),a.removeAttr("aria-busy"),t===o.xhr&&delete o.xhr}var o=this,i=this.tabs.eq(t),t=i.find(".ui-tabs-anchor"),a=this._getPanelForTab(i),r={tab:i,panel:a};this._isLocal(t[0])||(this.xhr=k.ajax(this._ajaxSettings(t,s,r)),this.xhr&&"canceled"!==this.xhr.statusText&&(this._addClass(i,"ui-tabs-loading"),a.attr("aria-busy","true"),this.xhr.done(function(t,e,i){setTimeout(function(){a.html(t),o._trigger("load",s,r),n(i,e)},1)}).fail(function(t,e){setTimeout(function(){n(t,e)},1)})))},_ajaxSettings:function(t,i,s){var n=this;return{url:t.attr("href").replace(/#.*$/,""),beforeSend:function(t,e){return n._trigger("beforeLoad",i,k.extend({jqXHR:t,ajaxSettings:e},s))}}},_getPanelForTab:function(t){t=k(t).attr("aria-controls");return this.element.find(this._sanitizeSelector("#"+t))}}),!1!==k.uiBackCompat&&k.widget("ui.tabs",k.ui.tabs,{_processTabs:function(){this._superApply(arguments),this._addClass(this.tabs,"ui-tab")}});k.ui.tabs;k.widget("ui.tooltip",{version:"1.12.1",options:{classes:{"ui-tooltip":"ui-corner-all ui-widget-shadow"},content:function(){var t=k(this).attr("title")||"";return k("<a>").text(t).html()},hide:!0,items:"[title]:not([disabled])",position:{my:"left top+15",at:"left bottom",collision:"flipfit flip"},show:!0,track:!1,close:null,open:null},_addDescribedBy:function(t,e){var i=(t.attr("aria-describedby")||"").split(/\s+/);i.push(e),t.data("ui-tooltip-id",e).attr("aria-describedby",k.trim(i.join(" ")))},_removeDescribedBy:function(t){var e=t.data("ui-tooltip-id"),i=(t.attr("aria-describedby")||"").split(/\s+/),e=k.inArray(e,i);-1!==e&&i.splice(e,1),t.removeData("ui-tooltip-id"),(i=k.trim(i.join(" ")))?t.attr("aria-describedby",i):t.removeAttr("aria-describedby")},_create:function(){this._on({mouseover:"open",focusin:"open"}),this.tooltips={},this.parents={},this.liveRegion=k("<div>").attr({role:"log","aria-live":"assertive","aria-relevant":"additions"}).appendTo(this.document[0].body),this._addClass(this.liveRegion,null,"ui-helper-hidden-accessible"),this.disabledTitles=k([])},_setOption:function(t,e){var i=this;this._super(t,e),"content"===t&&k.each(this.tooltips,function(t,e){i._updateContent(e.element)})},_setOptionDisabled:function(t){this[t?"_disable":"_enable"]()},_disable:function(){var s=this;k.each(this.tooltips,function(t,e){var i=k.Event("blur");i.target=i.currentTarget=e.element[0],s.close(i,!0)}),this.disabledTitles=this.disabledTitles.add(this.element.find(this.options.items).addBack().filter(function(){var t=k(this);if(t.is("[title]"))return t.data("ui-tooltip-title",t.attr("title")).removeAttr("title")}))},_enable:function(){this.disabledTitles.each(function(){var t=k(this);t.data("ui-tooltip-title")&&t.attr("title",t.data("ui-tooltip-title"))}),this.disabledTitles=k([])},open:function(t){var i=this,e=k(t?t.target:this.element).closest(this.options.items);e.length&&!e.data("ui-tooltip-id")&&(e.attr("title")&&e.data("ui-tooltip-title",e.attr("title")),e.data("ui-tooltip-open",!0),t&&"mouseover"===t.type&&e.parents().each(function(){var t,e=k(this);e.data("ui-tooltip-open")&&((t=k.Event("blur")).target=t.currentTarget=this,i.close(t,!0)),e.attr("title")&&(e.uniqueId(),i.parents[this.id]={element:this,title:e.attr("title")},e.attr("title",""))}),this._registerCloseHandlers(t,e),this._updateContent(e,t))},_updateContent:function(e,i){var t=this.options.content,s=this,n=i?i.type:null;if("string"==typeof t||t.nodeType||t.jquery)return this._open(i,e,t);(t=t.call(e[0],function(t){s._delay(function(){e.data("ui-tooltip-open")&&(i&&(i.type=n),this._open(i,e,t))})}))&&this._open(i,e,t)},_open:function(t,e,i){var s,n,o,a=k.extend({},this.options.position);function r(t){a.of=t,n.is(":hidden")||n.position(a)}i&&((s=this._find(e))?s.tooltip.find(".ui-tooltip-content").html(i):(e.is("[title]")&&(t&&"mouseover"===t.type?e.attr("title",""):e.removeAttr("title")),s=this._tooltip(e),n=s.tooltip,this._addDescribedBy(e,n.attr("id")),n.find(".ui-tooltip-content").html(i),this.liveRegion.children().hide(),(i=k("<div>").html(n.find(".ui-tooltip-content").html())).removeAttr("name").find("[name]").removeAttr("name"),i.removeAttr("id").find("[id]").removeAttr("id"),i.appendTo(this.liveRegion),this.options.track&&t&&/^mouse/.test(t.type)?(this._on(this.document,{mousemove:r}),r(t)):n.position(k.extend({of:e},this.options.position)),n.hide(),this._show(n,this.options.show),this.options.track&&this.options.show&&this.options.show.delay&&(o=this.delayedShow=setInterval(function(){n.is(":visible")&&(r(a.of),clearInterval(o))},k.fx.interval)),this._trigger("open",t,{tooltip:n})))},_registerCloseHandlers:function(t,e){var i={keyup:function(t){t.keyCode===k.ui.keyCode.ESCAPE&&((t=k.Event(t)).currentTarget=e[0],this.close(t,!0))}};e[0]!==this.element[0]&&(i.remove=function(){this._removeTooltip(this._find(e).tooltip)}),t&&"mouseover"!==t.type||(i.mouseleave="close"),t&&"focusin"!==t.type||(i.focusout="close"),this._on(!0,e,i)},close:function(t){var e,i=this,s=k(t?t.currentTarget:this.element),n=this._find(s);n?(e=n.tooltip,n.closing||(clearInterval(this.delayedShow),s.data("ui-tooltip-title")&&!s.attr("title")&&s.attr("title",s.data("ui-tooltip-title")),this._removeDescribedBy(s),n.hiding=!0,e.stop(!0),this._hide(e,this.options.hide,function(){i._removeTooltip(k(this))}),s.removeData("ui-tooltip-open"),this._off(s,"mouseleave focusout keyup"),s[0]!==this.element[0]&&this._off(s,"remove"),this._off(this.document,"mousemove"),t&&"mouseleave"===t.type&&k.each(this.parents,function(t,e){k(e.element).attr("title",e.title),delete i.parents[t]}),n.closing=!0,this._trigger("close",t,{tooltip:e}),n.hiding||(n.closing=!1))):s.removeData("ui-tooltip-open")},_tooltip:function(t){var e=k("<div>").attr("role","tooltip"),i=k("<div>").appendTo(e),s=e.uniqueId().attr("id");return this._addClass(i,"ui-tooltip-content"),this._addClass(e,"ui-tooltip","ui-widget ui-widget-content"),e.appendTo(this._appendTo(t)),this.tooltips[s]={element:t,tooltip:e}},_find:function(t){t=t.data("ui-tooltip-id");return t?this.tooltips[t]:null},_removeTooltip:function(t){t.remove(),delete this.tooltips[t.attr("id")]},_appendTo:function(t){t=t.closest(".ui-front, dialog");return t.length||(t=this.document[0].body),t},_destroy:function(){var s=this;k.each(this.tooltips,function(t,e){var i=k.Event("blur"),e=e.element;i.target=i.currentTarget=e[0],s.close(i,!0),k("#"+t).remove(),e.data("ui-tooltip-title")&&(e.attr("title")||e.attr("title",e.data("ui-tooltip-title")),e.removeData("ui-tooltip-title"))}),this.liveRegion.remove()}}),!1!==k.uiBackCompat&&k.widget("ui.tooltip",k.ui.tooltip,{options:{tooltipClass:null},_tooltip:function(){var t=this._superApply(arguments);return this.options.tooltipClass&&t.tooltip.addClass(this.options.tooltipClass),t}});k.ui.tooltip;var S,H,z,O,A,N,W,E,F,R,L,B,Y,j,q,K,U,V,$,X,G="ui-effects-",Q="ui-effects-style",J="ui-effects-animated",Z=k;function tt(t,e,i){var s=E[e.type]||{};return null==t?i||!e.def?null:e.def:(t=s.floor?~~t:parseFloat(t),isNaN(t)?e.def:s.mod?(t+s.mod)%s.mod:t<0?0:s.max<t?s.max:t)}function et(s){var n=N(),o=n._rgba=[];return s=s.toLowerCase(),R(A,function(t,e){var i=e.re.exec(s),i=i&&e.parse(i),e=e.space||"rgba";if(i)return i=n[e](i),n[W[e].cache]=i[W[e].cache],o=n._rgba=i._rgba,!1}),o.length?("0,0,0,0"===o.join()&&S.extend(o,z.transparent),n):z[s]}function it(t,e,i){return 6*(i=(i+1)%1)<1?t+(e-t)*i*6:2*i<1?e:3*i<2?t+(e-t)*(2/3-i)*6:t}function st(t){var e,i,s=t.ownerDocument.defaultView?t.ownerDocument.defaultView.getComputedStyle(t,null):t.currentStyle,n={};if(s&&s.length&&s[0]&&s[s[0]])for(i=s.length;i--;)"string"==typeof s[e=s[i]]&&(n[k.camelCase(e)]=s[e]);else for(e in s)"string"==typeof s[e]&&(n[e]=s[e]);return n}function nt(t,e,i,s){return k.isPlainObject(t)&&(t=(e=t).effect),t={effect:t},null==e&&(e={}),k.isFunction(e)&&(s=e,i=null,e={}),"number"!=typeof e&&!k.fx.speeds[e]||(s=i,i=e,e={}),k.isFunction(i)&&(s=i,i=null),e&&k.extend(t,e),i=i||e.duration,t.duration=k.fx.off?0:"number"==typeof i?i:i in k.fx.speeds?k.fx.speeds[i]:k.fx.speeds._default,t.complete=s||e.complete,t}function ot(t){return!t||"number"==typeof t||k.fx.speeds[t]||("string"==typeof t&&!k.effects.effect[t]||(k.isFunction(t)||"object"==typeof t&&!t.effect))}function at(t,e){var i=e.outerWidth(),e=e.outerHeight(),t=/^rect\((-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto)\)$/.exec(t)||["",0,i,e,0];return{top:parseFloat(t[1])||0,right:"auto"===t[2]?i:parseFloat(t[2]),bottom:"auto"===t[3]?e:parseFloat(t[3]),left:parseFloat(t[4])||0}}k.effects={effect:{}},O=/^([\-+])=\s*(\d+\.?\d*)/,A=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[t[1],t[2],t[3],t[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[2.55*t[1],2.55*t[2],2.55*t[3],t[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(t){return[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(t){return[parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16),parseInt(t[3]+t[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(t){return[t[1],t[2]/100,t[3]/100,t[4]]}}],N=(S=Z).Color=function(t,e,i,s){return new S.Color.fn.parse(t,e,i,s)},W={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},E={byte:{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},F=N.support={},rt=S("<p>")[0],R=S.each,rt.style.cssText="background-color:rgba(1,1,1,.5)",F.rgba=-1<rt.style.backgroundColor.indexOf("rgba"),R(W,function(t,e){e.cache="_"+t,e.props.alpha={idx:3,type:"percent",def:1}}),N.fn=S.extend(N.prototype,{parse:function(n,t,e,i){if(n===H)return this._rgba=[null,null,null,null],this;(n.jquery||n.nodeType)&&(n=S(n).css(t),t=H);var o=this,s=S.type(n),a=this._rgba=[];return t!==H&&(n=[n,t,e,i],s="array"),"string"===s?this.parse(et(n)||z._default):"array"===s?(R(W.rgba.props,function(t,e){a[e.idx]=tt(n[e.idx],e)}),this):"object"===s?(R(W,n instanceof N?function(t,e){n[e.cache]&&(o[e.cache]=n[e.cache].slice())}:function(t,i){var s=i.cache;R(i.props,function(t,e){if(!o[s]&&i.to){if("alpha"===t||null==n[t])return;o[s]=i.to(o._rgba)}o[s][e.idx]=tt(n[t],e,!0)}),o[s]&&S.inArray(null,o[s].slice(0,3))<0&&(o[s][3]=1,i.from&&(o._rgba=i.from(o[s])))}),this):void 0},is:function(t){var n=N(t),o=!0,a=this;return R(W,function(t,e){var i,s=n[e.cache];return s&&(i=a[e.cache]||e.to&&e.to(a._rgba)||[],R(e.props,function(t,e){if(null!=s[e.idx])return o=s[e.idx]===i[e.idx]})),o}),o},_space:function(){var i=[],s=this;return R(W,function(t,e){s[e.cache]&&i.push(t)}),i.pop()},transition:function(t,a){var e=(l=N(t))._space(),i=W[e],t=0===this.alpha()?N("transparent"):this,r=t[i.cache]||i.to(t._rgba),h=r.slice(),l=l[i.cache];return R(i.props,function(t,e){var i=e.idx,s=r[i],n=l[i],o=E[e.type]||{};null!==n&&(null===s?h[i]=n:(o.mod&&(o.mod/2<n-s?s+=o.mod:o.mod/2<s-n&&(s-=o.mod)),h[i]=tt((n-s)*a+s,e)))}),this[e](h)},blend:function(t){if(1===this._rgba[3])return this;var e=this._rgba.slice(),i=e.pop(),s=N(t)._rgba;return N(S.map(e,function(t,e){return(1-i)*s[e]+i*t}))},toRgbaString:function(){var t="rgba(",e=S.map(this._rgba,function(t,e){return null==t?2<e?1:0:t});return 1===e[3]&&(e.pop(),t="rgb("),t+e.join()+")"},toHslaString:function(){var t="hsla(",e=S.map(this.hsla(),function(t,e){return null==t&&(t=2<e?1:0),e&&e<3&&(t=Math.round(100*t)+"%"),t});return 1===e[3]&&(e.pop(),t="hsl("),t+e.join()+")"},toHexString:function(t){var e=this._rgba.slice(),i=e.pop();return t&&e.push(~~(255*i)),"#"+S.map(e,function(t){return 1===(t=(t||0).toString(16)).length?"0"+t:t}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),N.fn.parse.prototype=N.fn,W.hsla.to=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e=t[0]/255,i=t[1]/255,s=t[2]/255,n=t[3],o=Math.max(e,i,s),a=Math.min(e,i,s),r=o-a,h=o+a,t=.5*h,i=a===o?0:e===o?60*(i-s)/r+360:i===o?60*(s-e)/r+120:60*(e-i)/r+240,h=0==r?0:t<=.5?r/h:r/(2-h);return[Math.round(i)%360,h,t,null==n?1:n]},W.hsla.from=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e=t[0]/360,i=t[1],s=t[2],t=t[3],i=s<=.5?s*(1+i):s+i-s*i,s=2*s-i;return[Math.round(255*it(s,i,e+1/3)),Math.round(255*it(s,i,e)),Math.round(255*it(s,i,e-1/3)),t]},R(W,function(h,t){var o=t.props,a=t.cache,r=t.to,l=t.from;N.fn[h]=function(t){if(r&&!this[a]&&(this[a]=r(this._rgba)),t===H)return this[a].slice();var e,i=S.type(t),s="array"===i||"object"===i?t:arguments,n=this[a].slice();return R(o,function(t,e){t=s["object"===i?t:e.idx];null==t&&(t=n[e.idx]),n[e.idx]=tt(t,e)}),l?((e=N(l(n)))[a]=n,e):N(n)},R(o,function(a,r){N.fn[a]||(N.fn[a]=function(t){var e,i=S.type(t),s="alpha"===a?this._hsla?"hsla":"rgba":h,n=this[s](),o=n[r.idx];return"undefined"===i?o:("function"===i&&(t=t.call(this,o),i=S.type(t)),null==t&&r.empty?this:("string"===i&&(e=O.exec(t))&&(t=o+parseFloat(e[2])*("+"===e[1]?1:-1)),n[r.idx]=t,this[s](n)))})})}),N.hook=function(t){t=t.split(" ");R(t,function(t,o){S.cssHooks[o]={set:function(t,e){var i,s,n="";if("transparent"!==e&&("string"!==S.type(e)||(i=et(e)))){if(e=N(i||e),!F.rgba&&1!==e._rgba[3]){for(s="backgroundColor"===o?t.parentNode:t;(""===n||"transparent"===n)&&s&&s.style;)try{n=S.css(s,"backgroundColor"),s=s.parentNode}catch(t){}e=e.blend(n&&"transparent"!==n?n:"_default")}e=e.toRgbaString()}try{t.style[o]=e}catch(t){}}},S.fx.step[o]=function(t){t.colorInit||(t.start=N(t.elem,o),t.end=N(t.end),t.colorInit=!0),S.cssHooks[o].set(t.elem,t.start.transition(t.end,t.pos))}})},N.hook("backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor"),S.cssHooks.borderColor={expand:function(i){var s={};return R(["Top","Right","Bottom","Left"],function(t,e){s["border"+e+"Color"]=i}),s}},z=S.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"},j=["add","remove","toggle"],q={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1},k.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(t,e){k.fx.step[e]=function(t){("none"!==t.end&&!t.setAttr||1===t.pos&&!t.setAttr)&&(Z.style(t.elem,e,t.end),t.setAttr=!0)}}),k.fn.addBack||(k.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),k.effects.animateClass=function(n,t,e,i){var o=k.speed(t,e,i);return this.queue(function(){var i=k(this),t=i.attr("class")||"",e=(e=o.children?i.find("*").addBack():i).map(function(){return{el:k(this),start:st(this)}}),s=function(){k.each(j,function(t,e){n[e]&&i[e+"Class"](n[e])})};s(),e=e.map(function(){return this.end=st(this.el[0]),this.diff=function(t,e){var i,s,n={};for(i in e)s=e[i],t[i]!==s&&(q[i]||!k.fx.step[i]&&isNaN(parseFloat(s))||(n[i]=s));return n}(this.start,this.end),this}),i.attr("class",t),e=e.map(function(){var t=this,e=k.Deferred(),i=k.extend({},o,{queue:!1,complete:function(){e.resolve(t)}});return this.el.animate(this.diff,i),e.promise()}),k.when.apply(k,e.get()).done(function(){s(),k.each(arguments,function(){var e=this.el;k.each(this.diff,function(t){e.css(t,"")})}),o.complete.call(i[0])})})},k.fn.extend({addClass:(Y=k.fn.addClass,function(t,e,i,s){return e?k.effects.animateClass.call(this,{add:t},e,i,s):Y.apply(this,arguments)}),removeClass:(B=k.fn.removeClass,function(t,e,i,s){return 1<arguments.length?k.effects.animateClass.call(this,{remove:t},e,i,s):B.apply(this,arguments)}),toggleClass:(L=k.fn.toggleClass,function(t,e,i,s,n){return"boolean"==typeof e||void 0===e?i?k.effects.animateClass.call(this,e?{add:t}:{remove:t},i,s,n):L.apply(this,arguments):k.effects.animateClass.call(this,{toggle:t},e,i,s)}),switchClass:function(t,e,i,s,n){return k.effects.animateClass.call(this,{add:e,remove:t},i,s,n)}}),k.expr&&k.expr.filters&&k.expr.filters.animated&&(k.expr.filters.animated=(K=k.expr.filters.animated,function(t){return!!k(t).data(J)||K(t)})),!1!==k.uiBackCompat&&k.extend(k.effects,{save:function(t,e){for(var i=0,s=e.length;i<s;i++)null!==e[i]&&t.data(G+e[i],t[0].style[e[i]])},restore:function(t,e){for(var i,s=0,n=e.length;s<n;s++)null!==e[s]&&(i=t.data(G+e[s]),t.css(e[s],i))},setMode:function(t,e){return"toggle"===e&&(e=t.is(":hidden")?"show":"hide"),e},createWrapper:function(i){if(i.parent().is(".ui-effects-wrapper"))return i.parent();var s={width:i.outerWidth(!0),height:i.outerHeight(!0),float:i.css("float")},t=k("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),e={width:i.width(),height:i.height()},n=document.activeElement;try{n.id}catch(t){n=document.body}return i.wrap(t),i[0]!==n&&!k.contains(i[0],n)||k(n).trigger("focus"),t=i.parent(),"static"===i.css("position")?(t.css({position:"relative"}),i.css({position:"relative"})):(k.extend(s,{position:i.css("position"),zIndex:i.css("z-index")}),k.each(["top","left","bottom","right"],function(t,e){s[e]=i.css(e),isNaN(parseInt(s[e],10))&&(s[e]="auto")}),i.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),i.css(e),t.css(s).show()},removeWrapper:function(t){var e=document.activeElement;return t.parent().is(".ui-effects-wrapper")&&(t.parent().replaceWith(t),t[0]!==e&&!k.contains(t[0],e)||k(e).trigger("focus")),t}}),k.extend(k.effects,{version:"1.12.1",define:function(t,e,i){return i||(i=e,e="effect"),k.effects.effect[t]=i,k.effects.effect[t].mode=e,i},scaledDimensions:function(t,e,i){if(0===e)return{height:0,width:0,outerHeight:0,outerWidth:0};var s="horizontal"!==i?(e||100)/100:1,e="vertical"!==i?(e||100)/100:1;return{height:t.height()*e,width:t.width()*s,outerHeight:t.outerHeight()*e,outerWidth:t.outerWidth()*s}},clipToBox:function(t){return{width:t.clip.right-t.clip.left,height:t.clip.bottom-t.clip.top,left:t.clip.left,top:t.clip.top}},unshift:function(t,e,i){var s=t.queue();1<e&&s.splice.apply(s,[1,0].concat(s.splice(e,i))),t.dequeue()},saveStyle:function(t){t.data(Q,t[0].style.cssText)},restoreStyle:function(t){t[0].style.cssText=t.data(Q)||"",t.removeData(Q)},mode:function(t,e){t=t.is(":hidden");return"toggle"===e&&(e=t?"show":"hide"),(t?"hide"===e:"show"===e)&&(e="none"),e},getBaseline:function(t,e){var i,s;switch(t[0]){case"top":i=0;break;case"middle":i=.5;break;case"bottom":i=1;break;default:i=t[0]/e.height}switch(t[1]){case"left":s=0;break;case"center":s=.5;break;case"right":s=1;break;default:s=t[1]/e.width}return{x:s,y:i}},createPlaceholder:function(t){var e,i=t.css("position"),s=t.position();return t.css({marginTop:t.css("marginTop"),marginBottom:t.css("marginBottom"),marginLeft:t.css("marginLeft"),marginRight:t.css("marginRight")}).outerWidth(t.outerWidth()).outerHeight(t.outerHeight()),/^(static|relative)/.test(i)&&(i="absolute",e=k("<"+t[0].nodeName+">").insertAfter(t).css({display:/^(inline|ruby)/.test(t.css("display"))?"inline-block":"block",visibility:"hidden",marginTop:t.css("marginTop"),marginBottom:t.css("marginBottom"),marginLeft:t.css("marginLeft"),marginRight:t.css("marginRight"),float:t.css("float")}).outerWidth(t.outerWidth()).outerHeight(t.outerHeight()).addClass("ui-effects-placeholder"),t.data(G+"placeholder",e)),t.css({position:i,left:s.left,top:s.top}),e},removePlaceholder:function(t){var e=G+"placeholder",i=t.data(e);i&&(i.remove(),t.removeData(e))},cleanUp:function(t){k.effects.restoreStyle(t),k.effects.removePlaceholder(t)},setTransition:function(s,t,n,o){return o=o||{},k.each(t,function(t,e){var i=s.cssUnit(e);0<i[0]&&(o[e]=i[0]*n+i[1])}),o}}),k.fn.extend({effect:function(){function t(t){var e=k(this),i=k.effects.mode(e,r)||o;e.data(J,!0),h.push(i),o&&("show"===i||i===o&&"hide"===i)&&e.show(),o&&"none"===i||k.effects.saveStyle(e),k.isFunction(t)&&t()}var s=nt.apply(this,arguments),n=k.effects.effect[s.effect],o=n.mode,e=s.queue,i=e||"fx",a=s.complete,r=s.mode,h=[];return k.fx.off||!n?r?this[r](s.duration,a):this.each(function(){a&&a.call(this)}):!1===e?this.each(t).each(l):this.queue(i,t).queue(i,l);function l(t){var e=k(this);function i(){k.isFunction(a)&&a.call(e[0]),k.isFunction(t)&&t()}s.mode=h.shift(),!1===k.uiBackCompat||o?"none"===s.mode?(e[r](),i()):n.call(e[0],s,function(){e.removeData(J),k.effects.cleanUp(e),"hide"===s.mode&&e.hide(),i()}):(e.is(":hidden")?"hide"===r:"show"===r)?(e[r](),i()):n.call(e[0],s,i)}},show:($=k.fn.show,function(t){if(ot(t))return $.apply(this,arguments);var e=nt.apply(this,arguments);return e.mode="show",this.effect.call(this,e)}),hide:(V=k.fn.hide,function(t){if(ot(t))return V.apply(this,arguments);var e=nt.apply(this,arguments);return e.mode="hide",this.effect.call(this,e)}),toggle:(U=k.fn.toggle,function(t){if(ot(t)||"boolean"==typeof t)return U.apply(this,arguments);var e=nt.apply(this,arguments);return e.mode="toggle",this.effect.call(this,e)}),cssUnit:function(t){var i=this.css(t),s=[];return k.each(["em","px","%","pt"],function(t,e){0<i.indexOf(e)&&(s=[parseFloat(i),e])}),s},cssClip:function(t){return t?this.css("clip","rect("+t.top+"px "+t.right+"px "+t.bottom+"px "+t.left+"px)"):at(this.css("clip"),this)},transfer:function(t,e){var i=k(this),s=k(t.to),n="fixed"===s.css("position"),o=k("body"),a=n?o.scrollTop():0,r=n?o.scrollLeft():0,o=s.offset(),o={top:o.top-a,left:o.left-r,height:s.innerHeight(),width:s.innerWidth()},s=i.offset(),h=k("<div class='ui-effects-transfer'></div>").appendTo("body").addClass(t.className).css({top:s.top-a,left:s.left-r,height:i.innerHeight(),width:i.innerWidth(),position:n?"fixed":"absolute"}).animate(o,t.duration,t.easing,function(){h.remove(),k.isFunction(e)&&e()})}}),k.fx.step.clip=function(t){t.clipInit||(t.start=k(t.elem).cssClip(),"string"==typeof t.end&&(t.end=at(t.end,t.elem)),t.clipInit=!0),k(t.elem).cssClip({top:t.pos*(t.end.top-t.start.top)+t.start.top,right:t.pos*(t.end.right-t.start.right)+t.start.right,bottom:t.pos*(t.end.bottom-t.start.bottom)+t.start.bottom,left:t.pos*(t.end.left-t.start.left)+t.start.left})},X={},k.each(["Quad","Cubic","Quart","Quint","Expo"],function(e,t){X[t]=function(t){return Math.pow(t,e+2)}}),k.extend(X,{Sine:function(t){return 1-Math.cos(t*Math.PI/2)},Circ:function(t){return 1-Math.sqrt(1-t*t)},Elastic:function(t){return 0===t||1===t?t:-Math.pow(2,8*(t-1))*Math.sin((80*(t-1)-7.5)*Math.PI/15)},Back:function(t){return t*t*(3*t-2)},Bounce:function(t){for(var e,i=4;t<((e=Math.pow(2,--i))-1)/11;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*e-2)/22-t,2)}}),k.each(X,function(t,e){k.easing["easeIn"+t]=e,k.easing["easeOut"+t]=function(t){return 1-e(1-t)},k.easing["easeInOut"+t]=function(t){return t<.5?e(2*t)/2:1-e(-2*t+2)/2}});var rt=k.effects;k.effects.define("blind","hide",function(t,e){var i={up:["bottom","top"],vertical:["bottom","top"],down:["top","bottom"],left:["right","left"],horizontal:["right","left"],right:["left","right"]},s=k(this),n=t.direction||"up",o=s.cssClip(),a={clip:k.extend({},o)},r=k.effects.createPlaceholder(s);a.clip[i[n][0]]=a.clip[i[n][1]],"show"===t.mode&&(s.cssClip(a.clip),r&&r.css(k.effects.clipToBox(a)),a.clip=o),r&&r.animate(k.effects.clipToBox(a),t.duration,t.easing),s.animate(a,{queue:!1,duration:t.duration,easing:t.easing,complete:e})}),k.effects.define("bounce",function(t,e){var i,s,n=k(this),o=t.mode,a="hide"===o,r="show"===o,h=t.direction||"up",l=t.distance,c=t.times||5,o=2*c+(r||a?1:0),u=t.duration/o,d=t.easing,p="up"===h||"down"===h?"top":"left",f="up"===h||"left"===h,g=0,t=n.queue().length;for(k.effects.createPlaceholder(n),h=n.css(p),l=l||n["top"==p?"outerHeight":"outerWidth"]()/3,r&&((s={opacity:1})[p]=h,n.css("opacity",0).css(p,f?2*-l:2*l).animate(s,u,d)),a&&(l/=Math.pow(2,c-1)),(s={})[p]=h;g<c;g++)(i={})[p]=(f?"-=":"+=")+l,n.animate(i,u,d).animate(s,u,d),l=a?2*l:l/2;a&&((i={opacity:0})[p]=(f?"-=":"+=")+l,n.animate(i,u,d)),n.queue(e),k.effects.unshift(n,t,1+o)}),k.effects.define("clip","hide",function(t,e){var i={},s=k(this),n=t.direction||"vertical",o="both"===n,a=o||"horizontal"===n,o=o||"vertical"===n,n=s.cssClip();i.clip={top:o?(n.bottom-n.top)/2:n.top,right:a?(n.right-n.left)/2:n.right,bottom:o?(n.bottom-n.top)/2:n.bottom,left:a?(n.right-n.left)/2:n.left},k.effects.createPlaceholder(s),"show"===t.mode&&(s.cssClip(i.clip),i.clip=n),s.animate(i,{queue:!1,duration:t.duration,easing:t.easing,complete:e})}),k.effects.define("drop","hide",function(t,e){var i=k(this),s="show"===t.mode,n=t.direction||"left",o="up"===n||"down"===n?"top":"left",a="up"===n||"left"===n?"-=":"+=",r="+="==a?"-=":"+=",h={opacity:0};k.effects.createPlaceholder(i),n=t.distance||i["top"==o?"outerHeight":"outerWidth"](!0)/2,h[o]=a+n,s&&(i.css(h),h[o]=r+n,h.opacity=1),i.animate(h,{queue:!1,duration:t.duration,easing:t.easing,complete:e})}),k.effects.define("explode","hide",function(t,e){var i,s,n,o,a,r,h=t.pieces?Math.round(Math.sqrt(t.pieces)):3,l=h,c=k(this),u="show"===t.mode,d=c.show().css("visibility","hidden").offset(),p=Math.ceil(c.outerWidth()/l),f=Math.ceil(c.outerHeight()/h),g=[];function m(){g.push(this),g.length===h*l&&(c.css({visibility:"visible"}),k(g).remove(),e())}for(i=0;i<h;i++)for(o=d.top+i*f,r=i-(h-1)/2,s=0;s<l;s++)n=d.left+s*p,a=s-(l-1)/2,c.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-s*p,top:-i*f}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:p,height:f,left:n+(u?a*p:0),top:o+(u?r*f:0),opacity:u?0:1}).animate({left:n+(u?0:a*p),top:o+(u?0:r*f),opacity:u?1:0},t.duration||500,t.easing,m)}),k.effects.define("fade","toggle",function(t,e){var i="show"===t.mode;k(this).css("opacity",i?0:1).animate({opacity:i?1:0},{queue:!1,duration:t.duration,easing:t.easing,complete:e})}),k.effects.define("fold","hide",function(e,t){var i=k(this),s=e.mode,n="show"===s,o="hide"===s,a=e.size||15,r=/([0-9]+)%/.exec(a),h=!!e.horizFirst?["right","bottom"]:["bottom","right"],l=e.duration/2,c=k.effects.createPlaceholder(i),u=i.cssClip(),d={clip:k.extend({},u)},p={clip:k.extend({},u)},f=[u[h[0]],u[h[1]]],s=i.queue().length;r&&(a=parseInt(r[1],10)/100*f[o?0:1]),d.clip[h[0]]=a,p.clip[h[0]]=a,p.clip[h[1]]=0,n&&(i.cssClip(p.clip),c&&c.css(k.effects.clipToBox(p)),p.clip=u),i.queue(function(t){c&&c.animate(k.effects.clipToBox(d),l,e.easing).animate(k.effects.clipToBox(p),l,e.easing),t()}).animate(d,l,e.easing).animate(p,l,e.easing).queue(t),k.effects.unshift(i,s,4)}),k.effects.define("highlight","show",function(t,e){var i=k(this),s={backgroundColor:i.css("backgroundColor")};"hide"===t.mode&&(s.opacity=0),k.effects.saveStyle(i),i.css({backgroundImage:"none",backgroundColor:t.color||"#ffff99"}).animate(s,{queue:!1,duration:t.duration,easing:t.easing,complete:e})}),k.effects.define("size",function(s,e){var n,i=k(this),t=["fontSize"],o=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],a=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],r=s.mode,h="effect"!==r,l=s.scale||"both",c=s.origin||["middle","center"],u=i.css("position"),d=i.position(),p=k.effects.scaledDimensions(i),f=s.from||p,g=s.to||k.effects.scaledDimensions(i,0);k.effects.createPlaceholder(i),"show"===r&&(r=f,f=g,g=r),n={from:{y:f.height/p.height,x:f.width/p.width},to:{y:g.height/p.height,x:g.width/p.width}},"box"!==l&&"both"!==l||(n.from.y!==n.to.y&&(f=k.effects.setTransition(i,o,n.from.y,f),g=k.effects.setTransition(i,o,n.to.y,g)),n.from.x!==n.to.x&&(f=k.effects.setTransition(i,a,n.from.x,f),g=k.effects.setTransition(i,a,n.to.x,g))),"content"!==l&&"both"!==l||n.from.y!==n.to.y&&(f=k.effects.setTransition(i,t,n.from.y,f),g=k.effects.setTransition(i,t,n.to.y,g)),c&&(c=k.effects.getBaseline(c,p),f.top=(p.outerHeight-f.outerHeight)*c.y+d.top,f.left=(p.outerWidth-f.outerWidth)*c.x+d.left,g.top=(p.outerHeight-g.outerHeight)*c.y+d.top,g.left=(p.outerWidth-g.outerWidth)*c.x+d.left),i.css(f),"content"!==l&&"both"!==l||(o=o.concat(["marginTop","marginBottom"]).concat(t),a=a.concat(["marginLeft","marginRight"]),i.find("*[width]").each(function(){var t=k(this),e=k.effects.scaledDimensions(t),i={height:e.height*n.from.y,width:e.width*n.from.x,outerHeight:e.outerHeight*n.from.y,outerWidth:e.outerWidth*n.from.x},e={height:e.height*n.to.y,width:e.width*n.to.x,outerHeight:e.height*n.to.y,outerWidth:e.width*n.to.x};n.from.y!==n.to.y&&(i=k.effects.setTransition(t,o,n.from.y,i),e=k.effects.setTransition(t,o,n.to.y,e)),n.from.x!==n.to.x&&(i=k.effects.setTransition(t,a,n.from.x,i),e=k.effects.setTransition(t,a,n.to.x,e)),h&&k.effects.saveStyle(t),t.css(i),t.animate(e,s.duration,s.easing,function(){h&&k.effects.restoreStyle(t)})})),i.animate(g,{queue:!1,duration:s.duration,easing:s.easing,complete:function(){var t=i.offset();0===g.opacity&&i.css("opacity",f.opacity),h||(i.css("position","static"===u?"relative":u).offset(t),k.effects.saveStyle(i)),e()}})}),k.effects.define("scale",function(t,e){var i=k(this),s=t.mode,s=parseInt(t.percent,10)||(0===parseInt(t.percent,10)||"effect"!==s?0:100),s=k.extend(!0,{from:k.effects.scaledDimensions(i),to:k.effects.scaledDimensions(i,s,t.direction||"both"),origin:t.origin||["middle","center"]},t);t.fade&&(s.from.opacity=1,s.to.opacity=0),k.effects.effect.size.call(this,s,e)}),k.effects.define("puff","hide",function(t,e){t=k.extend(!0,{},t,{fade:!0,percent:parseInt(t.percent,10)||150});k.effects.effect.scale.call(this,t,e)}),k.effects.define("pulsate","show",function(t,e){var i=k(this),s=t.mode,n="show"===s,s=n||"hide"===s,o=2*(t.times||5)+(s?1:0),a=t.duration/o,r=0,h=1,s=i.queue().length;for(!n&&i.is(":visible")||(i.css("opacity",0).show(),r=1);h<o;h++)i.animate({opacity:r},a,t.easing),r=1-r;i.animate({opacity:r},a,t.easing),i.queue(e),k.effects.unshift(i,s,1+o)}),k.effects.define("shake",function(t,e){var i=1,s=k(this),n=t.direction||"left",o=t.distance||20,a=t.times||3,r=2*a+1,h=Math.round(t.duration/r),l="up"===n||"down"===n?"top":"left",c="up"===n||"left"===n,u={},d={},p={},n=s.queue().length;for(k.effects.createPlaceholder(s),u[l]=(c?"-=":"+=")+o,d[l]=(c?"+=":"-=")+2*o,p[l]=(c?"-=":"+=")+2*o,s.animate(u,h,t.easing);i<a;i++)s.animate(d,h,t.easing).animate(p,h,t.easing);s.animate(d,h,t.easing).animate(u,h/2,t.easing).queue(e),k.effects.unshift(s,n,1+r)}),k.effects.define("slide","show",function(t,e){var i,s,n=k(this),o={up:["bottom","top"],down:["top","bottom"],left:["right","left"],right:["left","right"]},a=t.mode,r=t.direction||"left",h="up"===r||"down"===r?"top":"left",l="up"===r||"left"===r,c=t.distance||n["top"==h?"outerHeight":"outerWidth"](!0),u={};k.effects.createPlaceholder(n),i=n.cssClip(),s=n.position()[h],u[h]=(l?-1:1)*c+s,u.clip=n.cssClip(),u.clip[o[r][1]]=u.clip[o[r][0]],"show"===a&&(n.cssClip(u.clip),n.css(h,u[h]),u.clip=i,u[h]=s),n.animate(u,{queue:!1,duration:t.duration,easing:t.easing,complete:e})});!1!==k.uiBackCompat&&(rt=k.effects.define("transfer",function(t,e){k(this).transfer(t,e)}))});jquery/jquery-ui-1.11.4.js000064400000725472151215013470011113 0ustar00/*! jQuery UI - v1.11.4 - 2015-03-11
* http://jqueryui.com
* Includes: core.js, widget.js, mouse.js, position.js, accordion.js, autocomplete.js, button.js, datepicker.js, dialog.js, draggable.js, droppable.js, effect.js, effect-blind.js, effect-bounce.js, effect-clip.js, effect-drop.js, effect-explode.js, effect-fade.js, effect-fold.js, effect-highlight.js, effect-puff.js, effect-pulsate.js, effect-scale.js, effect-shake.js, effect-size.js, effect-slide.js, effect-transfer.js, menu.js, progressbar.js, resizable.js, selectable.js, selectmenu.js, slider.js, sortable.js, spinner.js, tabs.js, tooltip.js
* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */

(function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e(jQuery)})(function(e){function t(t,s){var n,a,o,r=t.nodeName.toLowerCase();return"area"===r?(n=t.parentNode,a=n.name,t.href&&a&&"map"===n.nodeName.toLowerCase()?(o=e("img[usemap='#"+a+"']")[0],!!o&&i(o)):!1):(/^(input|select|textarea|button|object)$/.test(r)?!t.disabled:"a"===r?t.href||s:s)&&i(t)}function i(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return"hidden"===e.css(this,"visibility")}).length}function s(e){for(var t,i;e.length&&e[0]!==document;){if(t=e.css("position"),("absolute"===t||"relative"===t||"fixed"===t)&&(i=parseInt(e.css("zIndex"),10),!isNaN(i)&&0!==i))return i;e=e.parent()}return 0}function n(){this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},e.extend(this._defaults,this.regional[""]),this.regional.en=e.extend(!0,{},this.regional[""]),this.regional["en-US"]=e.extend(!0,{},this.regional.en),this.dpDiv=a(e("<div id='"+this._mainDivId+"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"))}function a(t){var i="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return t.delegate(i,"mouseout",function(){e(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&e(this).removeClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&e(this).removeClass("ui-datepicker-next-hover")}).delegate(i,"mouseover",o)}function o(){e.datepicker._isDisabledDatepicker(v.inline?v.dpDiv.parent()[0]:v.input[0])||(e(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),e(this).addClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&e(this).addClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&e(this).addClass("ui-datepicker-next-hover"))}function r(t,i){e.extend(t,i);for(var s in i)null==i[s]&&(t[s]=i[s]);return t}function h(e){return function(){var t=this.element.val();e.apply(this,arguments),this._refresh(),t!==this.element.val()&&this._trigger("change")}}e.ui=e.ui||{},e.extend(e.ui,{version:"1.11.4",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({scrollParent:function(t){var i=this.css("position"),s="absolute"===i,n=t?/(auto|scroll|hidden)/:/(auto|scroll)/,a=this.parents().filter(function(){var t=e(this);return s&&"static"===t.css("position")?!1:n.test(t.css("overflow")+t.css("overflow-y")+t.css("overflow-x"))}).eq(0);return"fixed"!==i&&a.length?a:e(this[0].ownerDocument||document)},uniqueId:function(){var e=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++e)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(i){return!!e.data(i,t)}}):function(t,i,s){return!!e.data(t,s[3])},focusable:function(i){return t(i,!isNaN(e.attr(i,"tabindex")))},tabbable:function(i){var s=e.attr(i,"tabindex"),n=isNaN(s);return(n||s>=0)&&t(i,!n)}}),e("<a>").outerWidth(1).jquery||e.each(["Width","Height"],function(t,i){function s(t,i,s,a){return e.each(n,function(){i-=parseFloat(e.css(t,"padding"+this))||0,s&&(i-=parseFloat(e.css(t,"border"+this+"Width"))||0),a&&(i-=parseFloat(e.css(t,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],a=i.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+i]=function(t){return void 0===t?o["inner"+i].call(this):this.each(function(){e(this).css(a,s(this,t)+"px")})},e.fn["outer"+i]=function(t,n){return"number"!=typeof t?o["outer"+i].call(this,t):this.each(function(){e(this).css(a,s(this,t,!0,n)+"px")})}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e("<a>").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(i){return arguments.length?t.call(this,e.camelCase(i)):t.call(this)}}(e.fn.removeData)),e.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),e.fn.extend({focus:function(t){return function(i,s){return"number"==typeof i?this.each(function(){var t=this;setTimeout(function(){e(t).focus(),s&&s.call(t)},i)}):t.apply(this,arguments)}}(e.fn.focus),disableSelection:function(){var e="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.bind(e+".ui-disableSelection",function(e){e.preventDefault()})}}(),enableSelection:function(){return this.unbind(".ui-disableSelection")},zIndex:function(t){if(void 0!==t)return this.css("zIndex",t);if(this.length)for(var i,s,n=e(this[0]);n.length&&n[0]!==document;){if(i=n.css("position"),("absolute"===i||"relative"===i||"fixed"===i)&&(s=parseInt(n.css("zIndex"),10),!isNaN(s)&&0!==s))return s;n=n.parent()}return 0}}),e.ui.plugin={add:function(t,i,s){var n,a=e.ui[t].prototype;for(n in s)a.plugins[n]=a.plugins[n]||[],a.plugins[n].push([i,s[n]])},call:function(e,t,i,s){var n,a=e.plugins[t];if(a&&(s||e.element[0].parentNode&&11!==e.element[0].parentNode.nodeType))for(n=0;a.length>n;n++)e.options[a[n][0]]&&a[n][1].apply(e.element,i)}};var l=0,u=Array.prototype.slice;e.cleanData=function(t){return function(i){var s,n,a;for(a=0;null!=(n=i[a]);a++)try{s=e._data(n,"events"),s&&s.remove&&e(n).triggerHandler("remove")}catch(o){}t(i)}}(e.cleanData),e.widget=function(t,i,s){var n,a,o,r,h={},l=t.split(".")[0];return t=t.split(".")[1],n=l+"-"+t,s||(s=i,i=e.Widget),e.expr[":"][n.toLowerCase()]=function(t){return!!e.data(t,n)},e[l]=e[l]||{},a=e[l][t],o=e[l][t]=function(e,t){return this._createWidget?(arguments.length&&this._createWidget(e,t),void 0):new o(e,t)},e.extend(o,a,{version:s.version,_proto:e.extend({},s),_childConstructors:[]}),r=new i,r.options=e.widget.extend({},r.options),e.each(s,function(t,s){return e.isFunction(s)?(h[t]=function(){var e=function(){return i.prototype[t].apply(this,arguments)},n=function(e){return i.prototype[t].apply(this,e)};return function(){var t,i=this._super,a=this._superApply;return this._super=e,this._superApply=n,t=s.apply(this,arguments),this._super=i,this._superApply=a,t}}(),void 0):(h[t]=s,void 0)}),o.prototype=e.widget.extend(r,{widgetEventPrefix:a?r.widgetEventPrefix||t:t},h,{constructor:o,namespace:l,widgetName:t,widgetFullName:n}),a?(e.each(a._childConstructors,function(t,i){var s=i.prototype;e.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete a._childConstructors):i._childConstructors.push(o),e.widget.bridge(t,o),o},e.widget.extend=function(t){for(var i,s,n=u.call(arguments,1),a=0,o=n.length;o>a;a++)for(i in n[a])s=n[a][i],n[a].hasOwnProperty(i)&&void 0!==s&&(t[i]=e.isPlainObject(s)?e.isPlainObject(t[i])?e.widget.extend({},t[i],s):e.widget.extend({},s):s);return t},e.widget.bridge=function(t,i){var s=i.prototype.widgetFullName||t;e.fn[t]=function(n){var a="string"==typeof n,o=u.call(arguments,1),r=this;return a?this.each(function(){var i,a=e.data(this,s);return"instance"===n?(r=a,!1):a?e.isFunction(a[n])&&"_"!==n.charAt(0)?(i=a[n].apply(a,o),i!==a&&void 0!==i?(r=i&&i.jquery?r.pushStack(i.get()):i,!1):void 0):e.error("no such method '"+n+"' for "+t+" widget instance"):e.error("cannot call methods on "+t+" prior to initialization; "+"attempted to call method '"+n+"'")}):(o.length&&(n=e.widget.extend.apply(null,[n].concat(o))),this.each(function(){var t=e.data(this,s);t?(t.option(n||{}),t._init&&t._init()):e.data(this,s,new i(n,this))})),r}},e.Widget=function(){},e.Widget._childConstructors=[],e.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{disabled:!1,create:null},_createWidget:function(t,i){i=e(i||this.defaultElement||this)[0],this.element=e(i),this.uuid=l++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=e(),this.hoverable=e(),this.focusable=e(),i!==this&&(e.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(e){e.target===i&&this.destroy()}}),this.document=e(i.style?i.ownerDocument:i.document||i),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this.options=e.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:e.noop,widget:function(){return this.element},option:function(t,i){var s,n,a,o=t;if(0===arguments.length)return e.widget.extend({},this.options);if("string"==typeof t)if(o={},s=t.split("."),t=s.shift(),s.length){for(n=o[t]=e.widget.extend({},this.options[t]),a=0;s.length-1>a;a++)n[s[a]]=n[s[a]]||{},n=n[s[a]];if(t=s.pop(),1===arguments.length)return void 0===n[t]?null:n[t];n[t]=i}else{if(1===arguments.length)return void 0===this.options[t]?null:this.options[t];o[t]=i}return this._setOptions(o),this},_setOptions:function(e){var t;for(t in e)this._setOption(t,e[t]);return this},_setOption:function(e,t){return this.options[e]=t,"disabled"===e&&(this.widget().toggleClass(this.widgetFullName+"-disabled",!!t),t&&(this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus"))),this},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_on:function(t,i,s){var n,a=this;"boolean"!=typeof t&&(s=i,i=t,t=!1),s?(i=n=e(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),e.each(s,function(s,o){function r(){return t||a.options.disabled!==!0&&!e(this).hasClass("ui-state-disabled")?("string"==typeof o?a[o]:o).apply(a,arguments):void 0}"string"!=typeof o&&(r.guid=o.guid=o.guid||r.guid||e.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+a.eventNamespace,u=h[2];u?n.delegate(u,l,r):i.bind(l,r)})},_off:function(t,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,t.unbind(i).undelegate(i),this.bindings=e(this.bindings.not(t).get()),this.focusable=e(this.focusable.not(t).get()),this.hoverable=e(this.hoverable.not(t).get())},_delay:function(e,t){function i(){return("string"==typeof e?s[e]:e).apply(s,arguments)}var s=this;return setTimeout(i,t||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){e(t.currentTarget).addClass("ui-state-hover")},mouseleave:function(t){e(t.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){e(t.currentTarget).addClass("ui-state-focus")},focusout:function(t){e(t.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(t,i,s){var n,a,o=this.options[t];if(s=s||{},i=e.Event(i),i.type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),i.target=this.element[0],a=i.originalEvent)for(n in a)n in i||(i[n]=a[n]);return this.element.trigger(i,s),!(e.isFunction(o)&&o.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},e.each({show:"fadeIn",hide:"fadeOut"},function(t,i){e.Widget.prototype["_"+t]=function(s,n,a){"string"==typeof n&&(n={effect:n});var o,r=n?n===!0||"number"==typeof n?i:n.effect||i:t;n=n||{},"number"==typeof n&&(n={duration:n}),o=!e.isEmptyObject(n),n.complete=a,n.delay&&s.delay(n.delay),o&&e.effects&&e.effects.effect[r]?s[t](n):r!==t&&s[r]?s[r](n.duration,n.easing,a):s.queue(function(i){e(this)[t](),a&&a.call(s[0]),i()})}}),e.widget;var d=!1;e(document).mouseup(function(){d=!1}),e.widget("ui.mouse",{version:"1.11.4",options:{cancel:"input,textarea,button,select,option",distance:1,delay:0},_mouseInit:function(){var t=this;this.element.bind("mousedown."+this.widgetName,function(e){return t._mouseDown(e)}).bind("click."+this.widgetName,function(i){return!0===e.data(i.target,t.widgetName+".preventClickEvent")?(e.removeData(i.target,t.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),this._mouseMoveDelegate&&this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(t){if(!d){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(t),this._mouseDownEvent=t;var i=this,s=1===t.which,n="string"==typeof this.options.cancel&&t.target.nodeName?e(t.target).closest(this.options.cancel).length:!1;return s&&!n&&this._mouseCapture(t)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(t)!==!1,!this._mouseStarted)?(t.preventDefault(),!0):(!0===e.data(t.target,this.widgetName+".preventClickEvent")&&e.removeData(t.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(e){return i._mouseMove(e)},this._mouseUpDelegate=function(e){return i._mouseUp(e)},this.document.bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),t.preventDefault(),d=!0,!0)):!0}},_mouseMove:function(t){if(this._mouseMoved){if(e.ui.ie&&(!document.documentMode||9>document.documentMode)&&!t.button)return this._mouseUp(t);if(!t.which)return this._mouseUp(t)}return(t.which||t.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,t)!==!1,this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted)},_mouseUp:function(t){return this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&e.data(t.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(t)),d=!1,!1},_mouseDistanceMet:function(e){return Math.max(Math.abs(this._mouseDownEvent.pageX-e.pageX),Math.abs(this._mouseDownEvent.pageY-e.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),function(){function t(e,t,i){return[parseFloat(e[0])*(p.test(e[0])?t/100:1),parseFloat(e[1])*(p.test(e[1])?i/100:1)]}function i(t,i){return parseInt(e.css(t,i),10)||0}function s(t){var i=t[0];return 9===i.nodeType?{width:t.width(),height:t.height(),offset:{top:0,left:0}}:e.isWindow(i)?{width:t.width(),height:t.height(),offset:{top:t.scrollTop(),left:t.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:t.outerWidth(),height:t.outerHeight(),offset:t.offset()}}e.ui=e.ui||{};var n,a,o=Math.max,r=Math.abs,h=Math.round,l=/left|center|right/,u=/top|center|bottom/,d=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,p=/%$/,f=e.fn.position;e.position={scrollbarWidth:function(){if(void 0!==n)return n;var t,i,s=e("<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),a=s.children()[0];return e("body").append(s),t=a.offsetWidth,s.css("overflow","scroll"),i=a.offsetWidth,t===i&&(i=s[0].clientWidth),s.remove(),n=t-i},getScrollInfo:function(t){var i=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),s=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),n="scroll"===i||"auto"===i&&t.width<t.element[0].scrollWidth,a="scroll"===s||"auto"===s&&t.height<t.element[0].scrollHeight;return{width:a?e.position.scrollbarWidth():0,height:n?e.position.scrollbarWidth():0}},getWithinInfo:function(t){var i=e(t||window),s=e.isWindow(i[0]),n=!!i[0]&&9===i[0].nodeType;return{element:i,isWindow:s,isDocument:n,offset:i.offset()||{left:0,top:0},scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:s||n?i.width():i.outerWidth(),height:s||n?i.height():i.outerHeight()}}},e.fn.position=function(n){if(!n||!n.of)return f.apply(this,arguments);n=e.extend({},n);var p,m,g,v,y,b,_=e(n.of),x=e.position.getWithinInfo(n.within),w=e.position.getScrollInfo(x),k=(n.collision||"flip").split(" "),T={};return b=s(_),_[0].preventDefault&&(n.at="left top"),m=b.width,g=b.height,v=b.offset,y=e.extend({},v),e.each(["my","at"],function(){var e,t,i=(n[this]||"").split(" ");1===i.length&&(i=l.test(i[0])?i.concat(["center"]):u.test(i[0])?["center"].concat(i):["center","center"]),i[0]=l.test(i[0])?i[0]:"center",i[1]=u.test(i[1])?i[1]:"center",e=d.exec(i[0]),t=d.exec(i[1]),T[this]=[e?e[0]:0,t?t[0]:0],n[this]=[c.exec(i[0])[0],c.exec(i[1])[0]]}),1===k.length&&(k[1]=k[0]),"right"===n.at[0]?y.left+=m:"center"===n.at[0]&&(y.left+=m/2),"bottom"===n.at[1]?y.top+=g:"center"===n.at[1]&&(y.top+=g/2),p=t(T.at,m,g),y.left+=p[0],y.top+=p[1],this.each(function(){var s,l,u=e(this),d=u.outerWidth(),c=u.outerHeight(),f=i(this,"marginLeft"),b=i(this,"marginTop"),D=d+f+i(this,"marginRight")+w.width,S=c+b+i(this,"marginBottom")+w.height,M=e.extend({},y),C=t(T.my,u.outerWidth(),u.outerHeight());"right"===n.my[0]?M.left-=d:"center"===n.my[0]&&(M.left-=d/2),"bottom"===n.my[1]?M.top-=c:"center"===n.my[1]&&(M.top-=c/2),M.left+=C[0],M.top+=C[1],a||(M.left=h(M.left),M.top=h(M.top)),s={marginLeft:f,marginTop:b},e.each(["left","top"],function(t,i){e.ui.position[k[t]]&&e.ui.position[k[t]][i](M,{targetWidth:m,targetHeight:g,elemWidth:d,elemHeight:c,collisionPosition:s,collisionWidth:D,collisionHeight:S,offset:[p[0]+C[0],p[1]+C[1]],my:n.my,at:n.at,within:x,elem:u})}),n.using&&(l=function(e){var t=v.left-M.left,i=t+m-d,s=v.top-M.top,a=s+g-c,h={target:{element:_,left:v.left,top:v.top,width:m,height:g},element:{element:u,left:M.left,top:M.top,width:d,height:c},horizontal:0>i?"left":t>0?"right":"center",vertical:0>a?"top":s>0?"bottom":"middle"};d>m&&m>r(t+i)&&(h.horizontal="center"),c>g&&g>r(s+a)&&(h.vertical="middle"),h.important=o(r(t),r(i))>o(r(s),r(a))?"horizontal":"vertical",n.using.call(this,e,h)}),u.offset(e.extend(M,{using:l}))})},e.ui.position={fit:{left:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=e.left-t.collisionPosition.marginLeft,h=n-r,l=r+t.collisionWidth-a-n;t.collisionWidth>a?h>0&&0>=l?(i=e.left+h+t.collisionWidth-a-n,e.left+=h-i):e.left=l>0&&0>=h?n:h>l?n+a-t.collisionWidth:n:h>0?e.left+=h:l>0?e.left-=l:e.left=o(e.left-r,e.left)},top:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollTop:s.offset.top,a=t.within.height,r=e.top-t.collisionPosition.marginTop,h=n-r,l=r+t.collisionHeight-a-n;t.collisionHeight>a?h>0&&0>=l?(i=e.top+h+t.collisionHeight-a-n,e.top+=h-i):e.top=l>0&&0>=h?n:h>l?n+a-t.collisionHeight:n:h>0?e.top+=h:l>0?e.top-=l:e.top=o(e.top-r,e.top)}},flip:{left:function(e,t){var i,s,n=t.within,a=n.offset.left+n.scrollLeft,o=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=e.left-t.collisionPosition.marginLeft,u=l-h,d=l+t.collisionWidth-o-h,c="left"===t.my[0]?-t.elemWidth:"right"===t.my[0]?t.elemWidth:0,p="left"===t.at[0]?t.targetWidth:"right"===t.at[0]?-t.targetWidth:0,f=-2*t.offset[0];0>u?(i=e.left+c+p+f+t.collisionWidth-o-a,(0>i||r(u)>i)&&(e.left+=c+p+f)):d>0&&(s=e.left-t.collisionPosition.marginLeft+c+p+f-h,(s>0||d>r(s))&&(e.left+=c+p+f))},top:function(e,t){var i,s,n=t.within,a=n.offset.top+n.scrollTop,o=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=e.top-t.collisionPosition.marginTop,u=l-h,d=l+t.collisionHeight-o-h,c="top"===t.my[1],p=c?-t.elemHeight:"bottom"===t.my[1]?t.elemHeight:0,f="top"===t.at[1]?t.targetHeight:"bottom"===t.at[1]?-t.targetHeight:0,m=-2*t.offset[1];0>u?(s=e.top+p+f+m+t.collisionHeight-o-a,(0>s||r(u)>s)&&(e.top+=p+f+m)):d>0&&(i=e.top-t.collisionPosition.marginTop+p+f+m-h,(i>0||d>r(i))&&(e.top+=p+f+m))}},flipfit:{left:function(){e.ui.position.flip.left.apply(this,arguments),e.ui.position.fit.left.apply(this,arguments)},top:function(){e.ui.position.flip.top.apply(this,arguments),e.ui.position.fit.top.apply(this,arguments)}}},function(){var t,i,s,n,o,r=document.getElementsByTagName("body")[0],h=document.createElement("div");t=document.createElement(r?"div":"body"),s={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},r&&e.extend(s,{position:"absolute",left:"-1000px",top:"-1000px"});for(o in s)t.style[o]=s[o];t.appendChild(h),i=r||document.documentElement,i.insertBefore(t,i.firstChild),h.style.cssText="position: absolute; left: 10.7432222px;",n=e(h).offset().left,a=n>10&&11>n,t.innerHTML="",i.removeChild(t)}()}(),e.ui.position,e.widget("ui.accordion",{version:"1.11.4",options:{active:0,animate:{},collapsible:!1,event:"click",header:"> li > :first-child,> :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},hideProps:{borderTopWidth:"hide",borderBottomWidth:"hide",paddingTop:"hide",paddingBottom:"hide",height:"hide"},showProps:{borderTopWidth:"show",borderBottomWidth:"show",paddingTop:"show",paddingBottom:"show",height:"show"},_create:function(){var t=this.options;this.prevShow=this.prevHide=e(),this.element.addClass("ui-accordion ui-widget ui-helper-reset").attr("role","tablist"),t.collapsible||t.active!==!1&&null!=t.active||(t.active=0),this._processPanels(),0>t.active&&(t.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():e()}},_createIcons:function(){var t=this.options.icons;t&&(e("<span>").addClass("ui-accordion-header-icon ui-icon "+t.header).prependTo(this.headers),this.active.children(".ui-accordion-header-icon").removeClass(t.header).addClass(t.activeHeader),this.headers.addClass("ui-accordion-icons"))},_destroyIcons:function(){this.headers.removeClass("ui-accordion-icons").children(".ui-accordion-header-icon").remove()},_destroy:function(){var e;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role"),this.headers.removeClass("ui-accordion-header ui-accordion-header-active ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("aria-controls").removeAttr("tabIndex").removeUniqueId(),this._destroyIcons(),e=this.headers.next().removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled").css("display","").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeUniqueId(),"content"!==this.options.heightStyle&&e.css("height","")},_setOption:function(e,t){return"active"===e?(this._activate(t),void 0):("event"===e&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(t)),this._super(e,t),"collapsible"!==e||t||this.options.active!==!1||this._activate(0),"icons"===e&&(this._destroyIcons(),t&&this._createIcons()),"disabled"===e&&(this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this.headers.add(this.headers.next()).toggleClass("ui-state-disabled",!!t)),void 0)},_keydown:function(t){if(!t.altKey&&!t.ctrlKey){var i=e.ui.keyCode,s=this.headers.length,n=this.headers.index(t.target),a=!1;switch(t.keyCode){case i.RIGHT:case i.DOWN:a=this.headers[(n+1)%s];break;case i.LEFT:case i.UP:a=this.headers[(n-1+s)%s];break;case i.SPACE:case i.ENTER:this._eventHandler(t);break;case i.HOME:a=this.headers[0];break;case i.END:a=this.headers[s-1]}a&&(e(t.target).attr("tabIndex",-1),e(a).attr("tabIndex",0),a.focus(),t.preventDefault())}},_panelKeyDown:function(t){t.keyCode===e.ui.keyCode.UP&&t.ctrlKey&&e(t.currentTarget).prev().focus()},refresh:function(){var t=this.options;this._processPanels(),t.active===!1&&t.collapsible===!0||!this.headers.length?(t.active=!1,this.active=e()):t.active===!1?this._activate(0):this.active.length&&!e.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(t.active=!1,this.active=e()):this._activate(Math.max(0,t.active-1)):t.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){var e=this.headers,t=this.panels;this.headers=this.element.find(this.options.header).addClass("ui-accordion-header ui-state-default ui-corner-all"),this.panels=this.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom").filter(":not(.ui-accordion-content-active)").hide(),t&&(this._off(e.not(this.headers)),this._off(t.not(this.panels)))},_refresh:function(){var t,i=this.options,s=i.heightStyle,n=this.element.parent();this.active=this._findActive(i.active).addClass("ui-accordion-header-active ui-state-active ui-corner-top").removeClass("ui-corner-all"),this.active.next().addClass("ui-accordion-content-active").show(),this.headers.attr("role","tab").each(function(){var t=e(this),i=t.uniqueId().attr("id"),s=t.next(),n=s.uniqueId().attr("id");t.attr("aria-controls",n),s.attr("aria-labelledby",i)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}).next().attr({"aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}).next().attr({"aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(i.event),"fill"===s?(t=n.height(),this.element.siblings(":visible").each(function(){var i=e(this),s=i.css("position");"absolute"!==s&&"fixed"!==s&&(t-=i.outerHeight(!0))}),this.headers.each(function(){t-=e(this).outerHeight(!0)}),this.headers.next().each(function(){e(this).height(Math.max(0,t-e(this).innerHeight()+e(this).height()))}).css("overflow","auto")):"auto"===s&&(t=0,this.headers.next().each(function(){t=Math.max(t,e(this).css("height","").height())}).height(t))},_activate:function(t){var i=this._findActive(t)[0];i!==this.active[0]&&(i=i||this.active[0],this._eventHandler({target:i,currentTarget:i,preventDefault:e.noop}))},_findActive:function(t){return"number"==typeof t?this.headers.eq(t):e()},_setupEvents:function(t){var i={keydown:"_keydown"};t&&e.each(t.split(" "),function(e,t){i[t]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(t){var i=this.options,s=this.active,n=e(t.currentTarget),a=n[0]===s[0],o=a&&i.collapsible,r=o?e():n.next(),h=s.next(),l={oldHeader:s,oldPanel:h,newHeader:o?e():n,newPanel:r};t.preventDefault(),a&&!i.collapsible||this._trigger("beforeActivate",t,l)===!1||(i.active=o?!1:this.headers.index(n),this.active=a?e():n,this._toggle(l),s.removeClass("ui-accordion-header-active ui-state-active"),i.icons&&s.children(".ui-accordion-header-icon").removeClass(i.icons.activeHeader).addClass(i.icons.header),a||(n.removeClass("ui-corner-all").addClass("ui-accordion-header-active ui-state-active ui-corner-top"),i.icons&&n.children(".ui-accordion-header-icon").removeClass(i.icons.header).addClass(i.icons.activeHeader),n.next().addClass("ui-accordion-content-active")))},_toggle:function(t){var i=t.newPanel,s=this.prevShow.length?this.prevShow:t.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=i,this.prevHide=s,this.options.animate?this._animate(i,s,t):(s.hide(),i.show(),this._toggleComplete(t)),s.attr({"aria-hidden":"true"}),s.prev().attr({"aria-selected":"false","aria-expanded":"false"}),i.length&&s.length?s.prev().attr({tabIndex:-1,"aria-expanded":"false"}):i.length&&this.headers.filter(function(){return 0===parseInt(e(this).attr("tabIndex"),10)}).attr("tabIndex",-1),i.attr("aria-hidden","false").prev().attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_animate:function(e,t,i){var s,n,a,o=this,r=0,h=e.css("box-sizing"),l=e.length&&(!t.length||e.index()<t.index()),u=this.options.animate||{},d=l&&u.down||u,c=function(){o._toggleComplete(i)};return"number"==typeof d&&(a=d),"string"==typeof d&&(n=d),n=n||d.easing||u.easing,a=a||d.duration||u.duration,t.length?e.length?(s=e.show().outerHeight(),t.animate(this.hideProps,{duration:a,easing:n,step:function(e,t){t.now=Math.round(e)}}),e.hide().animate(this.showProps,{duration:a,easing:n,complete:c,step:function(e,i){i.now=Math.round(e),"height"!==i.prop?"content-box"===h&&(r+=i.now):"content"!==o.options.heightStyle&&(i.now=Math.round(s-t.outerHeight()-r),r=0)}}),void 0):t.animate(this.hideProps,a,n,c):e.animate(this.showProps,a,n,c)},_toggleComplete:function(e){var t=e.oldPanel;t.removeClass("ui-accordion-content-active").prev().removeClass("ui-corner-top").addClass("ui-corner-all"),t.length&&(t.parent()[0].className=t.parent()[0].className),this._trigger("activate",null,e)}}),e.widget("ui.menu",{version:"1.11.4",defaultElement:"<ul>",delay:300,options:{icons:{submenu:"ui-icon-carat-1-e"},items:"> *",menus:"ul",position:{my:"left-1 top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().addClass("ui-menu ui-widget ui-widget-content").toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length).attr({role:this.options.role,tabIndex:0}),this.options.disabled&&this.element.addClass("ui-state-disabled").attr("aria-disabled","true"),this._on({"mousedown .ui-menu-item":function(e){e.preventDefault()},"click .ui-menu-item":function(t){var i=e(t.target);!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.select(t),t.isPropagationStopped()||(this.mouseHandled=!0),i.has(".ui-menu").length?this.expand(t):!this.element.is(":focus")&&e(this.document[0].activeElement).closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(t){if(!this.previousFilter){var i=e(t.currentTarget);
i.siblings(".ui-state-active").removeClass("ui-state-active"),this.focus(t,i)}},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(e,t){var i=this.active||this.element.find(this.options.items).eq(0);t||this.focus(e,i)},blur:function(t){this._delay(function(){e.contains(this.element[0],this.document[0].activeElement)||this.collapseAll(t)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(e){this._closeOnDocumentClick(e)&&this.collapseAll(e),this.mouseHandled=!1}})},_destroy:function(){this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeClass("ui-menu ui-widget ui-widget-content ui-menu-icons ui-front").removeAttr("role").removeAttr("tabIndex").removeAttr("aria-labelledby").removeAttr("aria-expanded").removeAttr("aria-hidden").removeAttr("aria-disabled").removeUniqueId().show(),this.element.find(".ui-menu-item").removeClass("ui-menu-item").removeAttr("role").removeAttr("aria-disabled").removeUniqueId().removeClass("ui-state-hover").removeAttr("tabIndex").removeAttr("role").removeAttr("aria-haspopup").children().each(function(){var t=e(this);t.data("ui-menu-submenu-carat")&&t.remove()}),this.element.find(".ui-menu-divider").removeClass("ui-menu-divider ui-widget-content")},_keydown:function(t){var i,s,n,a,o=!0;switch(t.keyCode){case e.ui.keyCode.PAGE_UP:this.previousPage(t);break;case e.ui.keyCode.PAGE_DOWN:this.nextPage(t);break;case e.ui.keyCode.HOME:this._move("first","first",t);break;case e.ui.keyCode.END:this._move("last","last",t);break;case e.ui.keyCode.UP:this.previous(t);break;case e.ui.keyCode.DOWN:this.next(t);break;case e.ui.keyCode.LEFT:this.collapse(t);break;case e.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(t);break;case e.ui.keyCode.ENTER:case e.ui.keyCode.SPACE:this._activate(t);break;case e.ui.keyCode.ESCAPE:this.collapse(t);break;default:o=!1,s=this.previousFilter||"",n=String.fromCharCode(t.keyCode),a=!1,clearTimeout(this.filterTimer),n===s?a=!0:n=s+n,i=this._filterMenuItems(n),i=a&&-1!==i.index(this.active.next())?this.active.nextAll(".ui-menu-item"):i,i.length||(n=String.fromCharCode(t.keyCode),i=this._filterMenuItems(n)),i.length?(this.focus(t,i),this.previousFilter=n,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}o&&t.preventDefault()},_activate:function(e){this.active.is(".ui-state-disabled")||(this.active.is("[aria-haspopup='true']")?this.expand(e):this.select(e))},refresh:function(){var t,i,s=this,n=this.options.icons.submenu,a=this.element.find(this.options.menus);this.element.toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length),a.filter(":not(.ui-menu)").addClass("ui-menu ui-widget ui-widget-content ui-front").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var t=e(this),i=t.parent(),s=e("<span>").addClass("ui-menu-icon ui-icon "+n).data("ui-menu-submenu-carat",!0);i.attr("aria-haspopup","true").prepend(s),t.attr("aria-labelledby",i.attr("id"))}),t=a.add(this.element),i=t.find(this.options.items),i.not(".ui-menu-item").each(function(){var t=e(this);s._isDivider(t)&&t.addClass("ui-widget-content ui-menu-divider")}),i.not(".ui-menu-item, .ui-menu-divider").addClass("ui-menu-item").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),i.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!e.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(e,t){"icons"===e&&this.element.find(".ui-menu-icon").removeClass(this.options.icons.submenu).addClass(t.submenu),"disabled"===e&&this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this._super(e,t)},focus:function(e,t){var i,s;this.blur(e,e&&"focus"===e.type),this._scrollIntoView(t),this.active=t.first(),s=this.active.addClass("ui-state-focus").removeClass("ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),this.active.parent().closest(".ui-menu-item").addClass("ui-state-active"),e&&"keydown"===e.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=t.children(".ui-menu"),i.length&&e&&/^mouse/.test(e.type)&&this._startOpening(i),this.activeMenu=t.parent(),this._trigger("focus",e,{item:t})},_scrollIntoView:function(t){var i,s,n,a,o,r;this._hasScroll()&&(i=parseFloat(e.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(e.css(this.activeMenu[0],"paddingTop"))||0,n=t.offset().top-this.activeMenu.offset().top-i-s,a=this.activeMenu.scrollTop(),o=this.activeMenu.height(),r=t.outerHeight(),0>n?this.activeMenu.scrollTop(a+n):n+r>o&&this.activeMenu.scrollTop(a+n-o+r))},blur:function(e,t){t||clearTimeout(this.timer),this.active&&(this.active.removeClass("ui-state-focus"),this.active=null,this._trigger("blur",e,{item:this.active}))},_startOpening:function(e){clearTimeout(this.timer),"true"===e.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(e)},this.delay))},_open:function(t){var i=e.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(t.parents(".ui-menu")).hide().attr("aria-hidden","true"),t.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(t,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:e(t&&t.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(t),this.activeMenu=s},this.delay)},_close:function(e){e||(e=this.active?this.active.parent():this.element),e.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false").end().find(".ui-state-active").not(".ui-state-focus").removeClass("ui-state-active")},_closeOnDocumentClick:function(t){return!e(t.target).closest(".ui-menu").length},_isDivider:function(e){return!/[^\-\u2014\u2013\s]/.test(e.text())},collapse:function(e){var t=this.active&&this.active.parent().closest(".ui-menu-item",this.element);t&&t.length&&(this._close(),this.focus(e,t))},expand:function(e){var t=this.active&&this.active.children(".ui-menu ").find(this.options.items).first();t&&t.length&&(this._open(t.parent()),this._delay(function(){this.focus(e,t)}))},next:function(e){this._move("next","first",e)},previous:function(e){this._move("prev","last",e)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(e,t,i){var s;this.active&&(s="first"===e||"last"===e?this.active["first"===e?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[e+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.find(this.options.items)[t]()),this.focus(i,s)},nextPage:function(t){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=e(this),0>i.offset().top-s-n}),this.focus(t,i)):this.focus(t,this.activeMenu.find(this.options.items)[this.active?"last":"first"]())),void 0):(this.next(t),void 0)},previousPage:function(t){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=e(this),i.offset().top-s+n>0}),this.focus(t,i)):this.focus(t,this.activeMenu.find(this.options.items).first())),void 0):(this.next(t),void 0)},_hasScroll:function(){return this.element.outerHeight()<this.element.prop("scrollHeight")},select:function(t){this.active=this.active||e(t.target).closest(".ui-menu-item");var i={item:this.active};this.active.has(".ui-menu").length||this.collapseAll(t,!0),this._trigger("select",t,i)},_filterMenuItems:function(t){var i=t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&"),s=RegExp("^"+i,"i");return this.activeMenu.find(this.options.items).filter(".ui-menu-item").filter(function(){return s.test(e.trim(e(this).text()))})}}),e.widget("ui.autocomplete",{version:"1.11.4",defaultElement:"<input>",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var t,i,s,n=this.element[0].nodeName.toLowerCase(),a="textarea"===n,o="input"===n;this.isMultiLine=a?!0:o?!1:this.element.prop("isContentEditable"),this.valueMethod=this.element[a||o?"val":"text"],this.isNewMenu=!0,this.element.addClass("ui-autocomplete-input").attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return t=!0,s=!0,i=!0,void 0;t=!1,s=!1,i=!1;var a=e.ui.keyCode;switch(n.keyCode){case a.PAGE_UP:t=!0,this._move("previousPage",n);break;case a.PAGE_DOWN:t=!0,this._move("nextPage",n);break;case a.UP:t=!0,this._keyEvent("previous",n);break;case a.DOWN:t=!0,this._keyEvent("next",n);break;case a.ENTER:this.menu.active&&(t=!0,n.preventDefault(),this.menu.select(n));break;case a.TAB:this.menu.active&&this.menu.select(n);break;case a.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(t)return t=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),void 0;if(!i){var n=e.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(e){return s?(s=!1,e.preventDefault(),void 0):(this._searchTimeout(e),void 0)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(e){return this.cancelBlur?(delete this.cancelBlur,void 0):(clearTimeout(this.searching),this.close(e),this._change(e),void 0)}}),this._initSource(),this.menu=e("<ul>").addClass("ui-autocomplete ui-front").appendTo(this._appendTo()).menu({role:null}).hide().menu("instance"),this._on(this.menu.element,{mousedown:function(t){t.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur});var i=this.menu.element[0];e(t.target).closest(".ui-menu-item").length||this._delay(function(){var t=this;this.document.one("mousedown",function(s){s.target===t.element[0]||s.target===i||e.contains(i,s.target)||t.close()})})},menufocus:function(t,i){var s,n;return this.isNewMenu&&(this.isNewMenu=!1,t.originalEvent&&/^mouse/.test(t.originalEvent.type))?(this.menu.blur(),this.document.one("mousemove",function(){e(t.target).trigger(t.originalEvent)}),void 0):(n=i.item.data("ui-autocomplete-item"),!1!==this._trigger("focus",t,{item:n})&&t.originalEvent&&/^key/.test(t.originalEvent.type)&&this._value(n.value),s=i.item.attr("aria-label")||n.value,s&&e.trim(s).length&&(this.liveRegion.children().hide(),e("<div>").text(s).appendTo(this.liveRegion)),void 0)},menuselect:function(e,t){var i=t.item.data("ui-autocomplete-item"),s=this.previous;this.element[0]!==this.document[0].activeElement&&(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s,this.selectedItem=i})),!1!==this._trigger("select",e,{item:i})&&this._value(i.value),this.term=this._value(),this.close(e),this.selectedItem=i}}),this.liveRegion=e("<span>",{role:"status","aria-live":"assertive","aria-relevant":"additions"}).addClass("ui-helper-hidden-accessible").appendTo(this.document[0].body),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(e,t){this._super(e,t),"source"===e&&this._initSource(),"appendTo"===e&&this.menu.element.appendTo(this._appendTo()),"disabled"===e&&t&&this.xhr&&this.xhr.abort()},_appendTo:function(){var t=this.options.appendTo;return t&&(t=t.jquery||t.nodeType?e(t):this.document.find(t).eq(0)),t&&t[0]||(t=this.element.closest(".ui-front")),t.length||(t=this.document[0].body),t},_initSource:function(){var t,i,s=this;e.isArray(this.options.source)?(t=this.options.source,this.source=function(i,s){s(e.ui.autocomplete.filter(t,i.term))}):"string"==typeof this.options.source?(i=this.options.source,this.source=function(t,n){s.xhr&&s.xhr.abort(),s.xhr=e.ajax({url:i,data:t,dataType:"json",success:function(e){n(e)},error:function(){n([])}})}):this.source=this.options.source},_searchTimeout:function(e){clearTimeout(this.searching),this.searching=this._delay(function(){var t=this.term===this._value(),i=this.menu.element.is(":visible"),s=e.altKey||e.ctrlKey||e.metaKey||e.shiftKey;(!t||t&&!i&&!s)&&(this.selectedItem=null,this.search(null,e))},this.options.delay)},search:function(e,t){return e=null!=e?e:this._value(),this.term=this._value(),e.length<this.options.minLength?this.close(t):this._trigger("search",t)!==!1?this._search(e):void 0},_search:function(e){this.pending++,this.element.addClass("ui-autocomplete-loading"),this.cancelSearch=!1,this.source({term:e},this._response())},_response:function(){var t=++this.requestIndex;return e.proxy(function(e){t===this.requestIndex&&this.__response(e),this.pending--,this.pending||this.element.removeClass("ui-autocomplete-loading")},this)},__response:function(e){e&&(e=this._normalize(e)),this._trigger("response",null,{content:e}),!this.options.disabled&&e&&e.length&&!this.cancelSearch?(this._suggest(e),this._trigger("open")):this._close()},close:function(e){this.cancelSearch=!0,this._close(e)},_close:function(e){this.menu.element.is(":visible")&&(this.menu.element.hide(),this.menu.blur(),this.isNewMenu=!0,this._trigger("close",e))},_change:function(e){this.previous!==this._value()&&this._trigger("change",e,{item:this.selectedItem})},_normalize:function(t){return t.length&&t[0].label&&t[0].value?t:e.map(t,function(t){return"string"==typeof t?{label:t,value:t}:e.extend({},t,{label:t.label||t.value,value:t.value||t.label})})},_suggest:function(t){var i=this.menu.element.empty();this._renderMenu(i,t),this.isNewMenu=!0,this.menu.refresh(),i.show(),this._resizeMenu(),i.position(e.extend({of:this.element},this.options.position)),this.options.autoFocus&&this.menu.next()},_resizeMenu:function(){var e=this.menu.element;e.outerWidth(Math.max(e.width("").outerWidth()+1,this.element.outerWidth()))},_renderMenu:function(t,i){var s=this;e.each(i,function(e,i){s._renderItemData(t,i)})},_renderItemData:function(e,t){return this._renderItem(e,t).data("ui-autocomplete-item",t)},_renderItem:function(t,i){return e("<li>").text(i.label).appendTo(t)},_move:function(e,t){return this.menu.element.is(":visible")?this.menu.isFirstItem()&&/^previous/.test(e)||this.menu.isLastItem()&&/^next/.test(e)?(this.isMultiLine||this._value(this.term),this.menu.blur(),void 0):(this.menu[e](t),void 0):(this.search(null,t),void 0)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(e,t){(!this.isMultiLine||this.menu.element.is(":visible"))&&(this._move(e,t),t.preventDefault())}}),e.extend(e.ui.autocomplete,{escapeRegex:function(e){return e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(t,i){var s=RegExp(e.ui.autocomplete.escapeRegex(i),"i");return e.grep(t,function(e){return s.test(e.label||e.value||e)})}}),e.widget("ui.autocomplete",e.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(e){return e+(e>1?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(t){var i;this._superApply(arguments),this.options.disabled||this.cancelSearch||(i=t&&t.length?this.options.messages.results(t.length):this.options.messages.noResults,this.liveRegion.children().hide(),e("<div>").text(i).appendTo(this.liveRegion))}}),e.ui.autocomplete;var c,p="ui-button ui-widget ui-state-default ui-corner-all",f="ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",m=function(){var t=e(this);setTimeout(function(){t.find(":ui-button").button("refresh")},1)},g=function(t){var i=t.name,s=t.form,n=e([]);return i&&(i=i.replace(/'/g,"\\'"),n=s?e(s).find("[name='"+i+"'][type=radio]"):e("[name='"+i+"'][type=radio]",t.ownerDocument).filter(function(){return!this.form})),n};e.widget("ui.button",{version:"1.11.4",defaultElement:"<button>",options:{disabled:null,text:!0,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset"+this.eventNamespace).bind("reset"+this.eventNamespace,m),"boolean"!=typeof this.options.disabled?this.options.disabled=!!this.element.prop("disabled"):this.element.prop("disabled",this.options.disabled),this._determineButtonType(),this.hasTitle=!!this.buttonElement.attr("title");var t=this,i=this.options,s="checkbox"===this.type||"radio"===this.type,n=s?"":"ui-state-active";null===i.label&&(i.label="input"===this.type?this.buttonElement.val():this.buttonElement.html()),this._hoverable(this.buttonElement),this.buttonElement.addClass(p).attr("role","button").bind("mouseenter"+this.eventNamespace,function(){i.disabled||this===c&&e(this).addClass("ui-state-active")}).bind("mouseleave"+this.eventNamespace,function(){i.disabled||e(this).removeClass(n)}).bind("click"+this.eventNamespace,function(e){i.disabled&&(e.preventDefault(),e.stopImmediatePropagation())}),this._on({focus:function(){this.buttonElement.addClass("ui-state-focus")},blur:function(){this.buttonElement.removeClass("ui-state-focus")}}),s&&this.element.bind("change"+this.eventNamespace,function(){t.refresh()}),"checkbox"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){return i.disabled?!1:void 0}):"radio"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){if(i.disabled)return!1;e(this).addClass("ui-state-active"),t.buttonElement.attr("aria-pressed","true");var s=t.element[0];g(s).not(s).map(function(){return e(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed","false")}):(this.buttonElement.bind("mousedown"+this.eventNamespace,function(){return i.disabled?!1:(e(this).addClass("ui-state-active"),c=this,t.document.one("mouseup",function(){c=null}),void 0)}).bind("mouseup"+this.eventNamespace,function(){return i.disabled?!1:(e(this).removeClass("ui-state-active"),void 0)}).bind("keydown"+this.eventNamespace,function(t){return i.disabled?!1:((t.keyCode===e.ui.keyCode.SPACE||t.keyCode===e.ui.keyCode.ENTER)&&e(this).addClass("ui-state-active"),void 0)}).bind("keyup"+this.eventNamespace+" blur"+this.eventNamespace,function(){e(this).removeClass("ui-state-active")}),this.buttonElement.is("a")&&this.buttonElement.keyup(function(t){t.keyCode===e.ui.keyCode.SPACE&&e(this).click()})),this._setOption("disabled",i.disabled),this._resetButton()},_determineButtonType:function(){var e,t,i;this.type=this.element.is("[type=checkbox]")?"checkbox":this.element.is("[type=radio]")?"radio":this.element.is("input")?"input":"button","checkbox"===this.type||"radio"===this.type?(e=this.element.parents().last(),t="label[for='"+this.element.attr("id")+"']",this.buttonElement=e.find(t),this.buttonElement.length||(e=e.length?e.siblings():this.element.siblings(),this.buttonElement=e.filter(t),this.buttonElement.length||(this.buttonElement=e.find(t))),this.element.addClass("ui-helper-hidden-accessible"),i=this.element.is(":checked"),i&&this.buttonElement.addClass("ui-state-active"),this.buttonElement.prop("aria-pressed",i)):this.buttonElement=this.element},widget:function(){return this.buttonElement},_destroy:function(){this.element.removeClass("ui-helper-hidden-accessible"),this.buttonElement.removeClass(p+" ui-state-active "+f).removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html()),this.hasTitle||this.buttonElement.removeAttr("title")},_setOption:function(e,t){return this._super(e,t),"disabled"===e?(this.widget().toggleClass("ui-state-disabled",!!t),this.element.prop("disabled",!!t),t&&("checkbox"===this.type||"radio"===this.type?this.buttonElement.removeClass("ui-state-focus"):this.buttonElement.removeClass("ui-state-focus ui-state-active")),void 0):(this._resetButton(),void 0)},refresh:function(){var t=this.element.is("input, button")?this.element.is(":disabled"):this.element.hasClass("ui-button-disabled");t!==this.options.disabled&&this._setOption("disabled",t),"radio"===this.type?g(this.element[0]).each(function(){e(this).is(":checked")?e(this).button("widget").addClass("ui-state-active").attr("aria-pressed","true"):e(this).button("widget").removeClass("ui-state-active").attr("aria-pressed","false")}):"checkbox"===this.type&&(this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed","true"):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed","false"))},_resetButton:function(){if("input"===this.type)return this.options.label&&this.element.val(this.options.label),void 0;var t=this.buttonElement.removeClass(f),i=e("<span></span>",this.document[0]).addClass("ui-button-text").html(this.options.label).appendTo(t.empty()).text(),s=this.options.icons,n=s.primary&&s.secondary,a=[];s.primary||s.secondary?(this.options.text&&a.push("ui-button-text-icon"+(n?"s":s.primary?"-primary":"-secondary")),s.primary&&t.prepend("<span class='ui-button-icon-primary ui-icon "+s.primary+"'></span>"),s.secondary&&t.append("<span class='ui-button-icon-secondary ui-icon "+s.secondary+"'></span>"),this.options.text||(a.push(n?"ui-button-icons-only":"ui-button-icon-only"),this.hasTitle||t.attr("title",e.trim(i)))):a.push("ui-button-text-only"),t.addClass(a.join(" "))}}),e.widget("ui.buttonset",{version:"1.11.4",options:{items:"button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(e,t){"disabled"===e&&this.buttons.button("option",e,t),this._super(e,t)},refresh:function(){var t="rtl"===this.element.css("direction"),i=this.element.find(this.options.items),s=i.filter(":ui-button");i.not(":ui-button").button(),s.button("refresh"),this.buttons=i.map(function(){return e(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(t?"ui-corner-right":"ui-corner-left").end().filter(":last").addClass(t?"ui-corner-left":"ui-corner-right").end().end()},_destroy:function(){this.element.removeClass("ui-buttonset"),this.buttons.map(function(){return e(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy")}}),e.ui.button,e.extend(e.ui,{datepicker:{version:"1.11.4"}});var v;e.extend(n.prototype,{markerClassName:"hasDatepicker",maxRows:4,_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(e){return r(this._defaults,e||{}),this},_attachDatepicker:function(t,i){var s,n,a;s=t.nodeName.toLowerCase(),n="div"===s||"span"===s,t.id||(this.uuid+=1,t.id="dp"+this.uuid),a=this._newInst(e(t),n),a.settings=e.extend({},i||{}),"input"===s?this._connectDatepicker(t,a):n&&this._inlineDatepicker(t,a)},_newInst:function(t,i){var s=t[0].id.replace(/([^A-Za-z0-9_\-])/g,"\\\\$1");return{id:s,input:t,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:i,dpDiv:i?a(e("<div class='"+this._inlineClass+" ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")):this.dpDiv}},_connectDatepicker:function(t,i){var s=e(t);i.append=e([]),i.trigger=e([]),s.hasClass(this.markerClassName)||(this._attachments(s,i),s.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp),this._autoSize(i),e.data(t,"datepicker",i),i.settings.disabled&&this._disableDatepicker(t))},_attachments:function(t,i){var s,n,a,o=this._get(i,"appendText"),r=this._get(i,"isRTL");i.append&&i.append.remove(),o&&(i.append=e("<span class='"+this._appendClass+"'>"+o+"</span>"),t[r?"before":"after"](i.append)),t.unbind("focus",this._showDatepicker),i.trigger&&i.trigger.remove(),s=this._get(i,"showOn"),("focus"===s||"both"===s)&&t.focus(this._showDatepicker),("button"===s||"both"===s)&&(n=this._get(i,"buttonText"),a=this._get(i,"buttonImage"),i.trigger=e(this._get(i,"buttonImageOnly")?e("<img/>").addClass(this._triggerClass).attr({src:a,alt:n,title:n}):e("<button type='button'></button>").addClass(this._triggerClass).html(a?e("<img/>").attr({src:a,alt:n,title:n}):n)),t[r?"before":"after"](i.trigger),i.trigger.click(function(){return e.datepicker._datepickerShowing&&e.datepicker._lastInput===t[0]?e.datepicker._hideDatepicker():e.datepicker._datepickerShowing&&e.datepicker._lastInput!==t[0]?(e.datepicker._hideDatepicker(),e.datepicker._showDatepicker(t[0])):e.datepicker._showDatepicker(t[0]),!1}))},_autoSize:function(e){if(this._get(e,"autoSize")&&!e.inline){var t,i,s,n,a=new Date(2009,11,20),o=this._get(e,"dateFormat");o.match(/[DM]/)&&(t=function(e){for(i=0,s=0,n=0;e.length>n;n++)e[n].length>i&&(i=e[n].length,s=n);return s},a.setMonth(t(this._get(e,o.match(/MM/)?"monthNames":"monthNamesShort"))),a.setDate(t(this._get(e,o.match(/DD/)?"dayNames":"dayNamesShort"))+20-a.getDay())),e.input.attr("size",this._formatDate(e,a).length)}},_inlineDatepicker:function(t,i){var s=e(t);s.hasClass(this.markerClassName)||(s.addClass(this.markerClassName).append(i.dpDiv),e.data(t,"datepicker",i),this._setDate(i,this._getDefaultDate(i),!0),this._updateDatepicker(i),this._updateAlternate(i),i.settings.disabled&&this._disableDatepicker(t),i.dpDiv.css("display","block"))},_dialogDatepicker:function(t,i,s,n,a){var o,h,l,u,d,c=this._dialogInst;return c||(this.uuid+=1,o="dp"+this.uuid,this._dialogInput=e("<input type='text' id='"+o+"' style='position: absolute; top: -100px; width: 0px;'/>"),this._dialogInput.keydown(this._doKeyDown),e("body").append(this._dialogInput),c=this._dialogInst=this._newInst(this._dialogInput,!1),c.settings={},e.data(this._dialogInput[0],"datepicker",c)),r(c.settings,n||{}),i=i&&i.constructor===Date?this._formatDate(c,i):i,this._dialogInput.val(i),this._pos=a?a.length?a:[a.pageX,a.pageY]:null,this._pos||(h=document.documentElement.clientWidth,l=document.documentElement.clientHeight,u=document.documentElement.scrollLeft||document.body.scrollLeft,d=document.documentElement.scrollTop||document.body.scrollTop,this._pos=[h/2-100+u,l/2-150+d]),this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),c.settings.onSelect=s,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),e.blockUI&&e.blockUI(this.dpDiv),e.data(this._dialogInput[0],"datepicker",c),this},_destroyDatepicker:function(t){var i,s=e(t),n=e.data(t,"datepicker");s.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),e.removeData(t,"datepicker"),"input"===i?(n.append.remove(),n.trigger.remove(),s.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)):("div"===i||"span"===i)&&s.removeClass(this.markerClassName).empty(),v===n&&(v=null))},_enableDatepicker:function(t){var i,s,n=e(t),a=e.data(t,"datepicker");n.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),"input"===i?(t.disabled=!1,a.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().removeClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!1)),this._disabledInputs=e.map(this._disabledInputs,function(e){return e===t?null:e}))},_disableDatepicker:function(t){var i,s,n=e(t),a=e.data(t,"datepicker");n.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),"input"===i?(t.disabled=!0,a.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().addClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!0)),this._disabledInputs=e.map(this._disabledInputs,function(e){return e===t?null:e}),this._disabledInputs[this._disabledInputs.length]=t)},_isDisabledDatepicker:function(e){if(!e)return!1;for(var t=0;this._disabledInputs.length>t;t++)if(this._disabledInputs[t]===e)return!0;return!1},_getInst:function(t){try{return e.data(t,"datepicker")}catch(i){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(t,i,s){var n,a,o,h,l=this._getInst(t);return 2===arguments.length&&"string"==typeof i?"defaults"===i?e.extend({},e.datepicker._defaults):l?"all"===i?e.extend({},l.settings):this._get(l,i):null:(n=i||{},"string"==typeof i&&(n={},n[i]=s),l&&(this._curInst===l&&this._hideDatepicker(),a=this._getDateDatepicker(t,!0),o=this._getMinMaxDate(l,"min"),h=this._getMinMaxDate(l,"max"),r(l.settings,n),null!==o&&void 0!==n.dateFormat&&void 0===n.minDate&&(l.settings.minDate=this._formatDate(l,o)),null!==h&&void 0!==n.dateFormat&&void 0===n.maxDate&&(l.settings.maxDate=this._formatDate(l,h)),"disabled"in n&&(n.disabled?this._disableDatepicker(t):this._enableDatepicker(t)),this._attachments(e(t),l),this._autoSize(l),this._setDate(l,a),this._updateAlternate(l),this._updateDatepicker(l)),void 0)},_changeDatepicker:function(e,t,i){this._optionDatepicker(e,t,i)},_refreshDatepicker:function(e){var t=this._getInst(e);t&&this._updateDatepicker(t)},_setDateDatepicker:function(e,t){var i=this._getInst(e);i&&(this._setDate(i,t),this._updateDatepicker(i),this._updateAlternate(i))},_getDateDatepicker:function(e,t){var i=this._getInst(e);return i&&!i.inline&&this._setDateFromField(i,t),i?this._getDate(i):null},_doKeyDown:function(t){var i,s,n,a=e.datepicker._getInst(t.target),o=!0,r=a.dpDiv.is(".ui-datepicker-rtl");if(a._keyEvent=!0,e.datepicker._datepickerShowing)switch(t.keyCode){case 9:e.datepicker._hideDatepicker(),o=!1;break;case 13:return n=e("td."+e.datepicker._dayOverClass+":not(."+e.datepicker._currentClass+")",a.dpDiv),n[0]&&e.datepicker._selectDay(t.target,a.selectedMonth,a.selectedYear,n[0]),i=e.datepicker._get(a,"onSelect"),i?(s=e.datepicker._formatDate(a),i.apply(a.input?a.input[0]:null,[s,a])):e.datepicker._hideDatepicker(),!1;case 27:e.datepicker._hideDatepicker();break;case 33:e.datepicker._adjustDate(t.target,t.ctrlKey?-e.datepicker._get(a,"stepBigMonths"):-e.datepicker._get(a,"stepMonths"),"M");break;case 34:e.datepicker._adjustDate(t.target,t.ctrlKey?+e.datepicker._get(a,"stepBigMonths"):+e.datepicker._get(a,"stepMonths"),"M");break;case 35:(t.ctrlKey||t.metaKey)&&e.datepicker._clearDate(t.target),o=t.ctrlKey||t.metaKey;break;case 36:(t.ctrlKey||t.metaKey)&&e.datepicker._gotoToday(t.target),o=t.ctrlKey||t.metaKey;break;case 37:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,r?1:-1,"D"),o=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&e.datepicker._adjustDate(t.target,t.ctrlKey?-e.datepicker._get(a,"stepBigMonths"):-e.datepicker._get(a,"stepMonths"),"M");break;case 38:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,-7,"D"),o=t.ctrlKey||t.metaKey;break;case 39:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,r?-1:1,"D"),o=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&e.datepicker._adjustDate(t.target,t.ctrlKey?+e.datepicker._get(a,"stepBigMonths"):+e.datepicker._get(a,"stepMonths"),"M");break;case 40:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,7,"D"),o=t.ctrlKey||t.metaKey;break;default:o=!1}else 36===t.keyCode&&t.ctrlKey?e.datepicker._showDatepicker(this):o=!1;o&&(t.preventDefault(),t.stopPropagation())},_doKeyPress:function(t){var i,s,n=e.datepicker._getInst(t.target);
return e.datepicker._get(n,"constrainInput")?(i=e.datepicker._possibleChars(e.datepicker._get(n,"dateFormat")),s=String.fromCharCode(null==t.charCode?t.keyCode:t.charCode),t.ctrlKey||t.metaKey||" ">s||!i||i.indexOf(s)>-1):void 0},_doKeyUp:function(t){var i,s=e.datepicker._getInst(t.target);if(s.input.val()!==s.lastVal)try{i=e.datepicker.parseDate(e.datepicker._get(s,"dateFormat"),s.input?s.input.val():null,e.datepicker._getFormatConfig(s)),i&&(e.datepicker._setDateFromField(s),e.datepicker._updateAlternate(s),e.datepicker._updateDatepicker(s))}catch(n){}return!0},_showDatepicker:function(t){if(t=t.target||t,"input"!==t.nodeName.toLowerCase()&&(t=e("input",t.parentNode)[0]),!e.datepicker._isDisabledDatepicker(t)&&e.datepicker._lastInput!==t){var i,n,a,o,h,l,u;i=e.datepicker._getInst(t),e.datepicker._curInst&&e.datepicker._curInst!==i&&(e.datepicker._curInst.dpDiv.stop(!0,!0),i&&e.datepicker._datepickerShowing&&e.datepicker._hideDatepicker(e.datepicker._curInst.input[0])),n=e.datepicker._get(i,"beforeShow"),a=n?n.apply(t,[t,i]):{},a!==!1&&(r(i.settings,a),i.lastVal=null,e.datepicker._lastInput=t,e.datepicker._setDateFromField(i),e.datepicker._inDialog&&(t.value=""),e.datepicker._pos||(e.datepicker._pos=e.datepicker._findPos(t),e.datepicker._pos[1]+=t.offsetHeight),o=!1,e(t).parents().each(function(){return o|="fixed"===e(this).css("position"),!o}),h={left:e.datepicker._pos[0],top:e.datepicker._pos[1]},e.datepicker._pos=null,i.dpDiv.empty(),i.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),e.datepicker._updateDatepicker(i),h=e.datepicker._checkOffset(i,h,o),i.dpDiv.css({position:e.datepicker._inDialog&&e.blockUI?"static":o?"fixed":"absolute",display:"none",left:h.left+"px",top:h.top+"px"}),i.inline||(l=e.datepicker._get(i,"showAnim"),u=e.datepicker._get(i,"duration"),i.dpDiv.css("z-index",s(e(t))+1),e.datepicker._datepickerShowing=!0,e.effects&&e.effects.effect[l]?i.dpDiv.show(l,e.datepicker._get(i,"showOptions"),u):i.dpDiv[l||"show"](l?u:null),e.datepicker._shouldFocusInput(i)&&i.input.focus(),e.datepicker._curInst=i))}},_updateDatepicker:function(t){this.maxRows=4,v=t,t.dpDiv.empty().append(this._generateHTML(t)),this._attachHandlers(t);var i,s=this._getNumberOfMonths(t),n=s[1],a=17,r=t.dpDiv.find("."+this._dayOverClass+" a");r.length>0&&o.apply(r.get(0)),t.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),n>1&&t.dpDiv.addClass("ui-datepicker-multi-"+n).css("width",a*n+"em"),t.dpDiv[(1!==s[0]||1!==s[1]?"add":"remove")+"Class"]("ui-datepicker-multi"),t.dpDiv[(this._get(t,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),t===e.datepicker._curInst&&e.datepicker._datepickerShowing&&e.datepicker._shouldFocusInput(t)&&t.input.focus(),t.yearshtml&&(i=t.yearshtml,setTimeout(function(){i===t.yearshtml&&t.yearshtml&&t.dpDiv.find("select.ui-datepicker-year:first").replaceWith(t.yearshtml),i=t.yearshtml=null},0))},_shouldFocusInput:function(e){return e.input&&e.input.is(":visible")&&!e.input.is(":disabled")&&!e.input.is(":focus")},_checkOffset:function(t,i,s){var n=t.dpDiv.outerWidth(),a=t.dpDiv.outerHeight(),o=t.input?t.input.outerWidth():0,r=t.input?t.input.outerHeight():0,h=document.documentElement.clientWidth+(s?0:e(document).scrollLeft()),l=document.documentElement.clientHeight+(s?0:e(document).scrollTop());return i.left-=this._get(t,"isRTL")?n-o:0,i.left-=s&&i.left===t.input.offset().left?e(document).scrollLeft():0,i.top-=s&&i.top===t.input.offset().top+r?e(document).scrollTop():0,i.left-=Math.min(i.left,i.left+n>h&&h>n?Math.abs(i.left+n-h):0),i.top-=Math.min(i.top,i.top+a>l&&l>a?Math.abs(a+r):0),i},_findPos:function(t){for(var i,s=this._getInst(t),n=this._get(s,"isRTL");t&&("hidden"===t.type||1!==t.nodeType||e.expr.filters.hidden(t));)t=t[n?"previousSibling":"nextSibling"];return i=e(t).offset(),[i.left,i.top]},_hideDatepicker:function(t){var i,s,n,a,o=this._curInst;!o||t&&o!==e.data(t,"datepicker")||this._datepickerShowing&&(i=this._get(o,"showAnim"),s=this._get(o,"duration"),n=function(){e.datepicker._tidyDialog(o)},e.effects&&(e.effects.effect[i]||e.effects[i])?o.dpDiv.hide(i,e.datepicker._get(o,"showOptions"),s,n):o.dpDiv["slideDown"===i?"slideUp":"fadeIn"===i?"fadeOut":"hide"](i?s:null,n),i||n(),this._datepickerShowing=!1,a=this._get(o,"onClose"),a&&a.apply(o.input?o.input[0]:null,[o.input?o.input.val():"",o]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),e.blockUI&&(e.unblockUI(),e("body").append(this.dpDiv))),this._inDialog=!1)},_tidyDialog:function(e){e.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(t){if(e.datepicker._curInst){var i=e(t.target),s=e.datepicker._getInst(i[0]);(i[0].id!==e.datepicker._mainDivId&&0===i.parents("#"+e.datepicker._mainDivId).length&&!i.hasClass(e.datepicker.markerClassName)&&!i.closest("."+e.datepicker._triggerClass).length&&e.datepicker._datepickerShowing&&(!e.datepicker._inDialog||!e.blockUI)||i.hasClass(e.datepicker.markerClassName)&&e.datepicker._curInst!==s)&&e.datepicker._hideDatepicker()}},_adjustDate:function(t,i,s){var n=e(t),a=this._getInst(n[0]);this._isDisabledDatepicker(n[0])||(this._adjustInstDate(a,i+("M"===s?this._get(a,"showCurrentAtPos"):0),s),this._updateDatepicker(a))},_gotoToday:function(t){var i,s=e(t),n=this._getInst(s[0]);this._get(n,"gotoCurrent")&&n.currentDay?(n.selectedDay=n.currentDay,n.drawMonth=n.selectedMonth=n.currentMonth,n.drawYear=n.selectedYear=n.currentYear):(i=new Date,n.selectedDay=i.getDate(),n.drawMonth=n.selectedMonth=i.getMonth(),n.drawYear=n.selectedYear=i.getFullYear()),this._notifyChange(n),this._adjustDate(s)},_selectMonthYear:function(t,i,s){var n=e(t),a=this._getInst(n[0]);a["selected"+("M"===s?"Month":"Year")]=a["draw"+("M"===s?"Month":"Year")]=parseInt(i.options[i.selectedIndex].value,10),this._notifyChange(a),this._adjustDate(n)},_selectDay:function(t,i,s,n){var a,o=e(t);e(n).hasClass(this._unselectableClass)||this._isDisabledDatepicker(o[0])||(a=this._getInst(o[0]),a.selectedDay=a.currentDay=e("a",n).html(),a.selectedMonth=a.currentMonth=i,a.selectedYear=a.currentYear=s,this._selectDate(t,this._formatDate(a,a.currentDay,a.currentMonth,a.currentYear)))},_clearDate:function(t){var i=e(t);this._selectDate(i,"")},_selectDate:function(t,i){var s,n=e(t),a=this._getInst(n[0]);i=null!=i?i:this._formatDate(a),a.input&&a.input.val(i),this._updateAlternate(a),s=this._get(a,"onSelect"),s?s.apply(a.input?a.input[0]:null,[i,a]):a.input&&a.input.trigger("change"),a.inline?this._updateDatepicker(a):(this._hideDatepicker(),this._lastInput=a.input[0],"object"!=typeof a.input[0]&&a.input.focus(),this._lastInput=null)},_updateAlternate:function(t){var i,s,n,a=this._get(t,"altField");a&&(i=this._get(t,"altFormat")||this._get(t,"dateFormat"),s=this._getDate(t),n=this.formatDate(i,s,this._getFormatConfig(t)),e(a).each(function(){e(this).val(n)}))},noWeekends:function(e){var t=e.getDay();return[t>0&&6>t,""]},iso8601Week:function(e){var t,i=new Date(e.getTime());return i.setDate(i.getDate()+4-(i.getDay()||7)),t=i.getTime(),i.setMonth(0),i.setDate(1),Math.floor(Math.round((t-i)/864e5)/7)+1},parseDate:function(t,i,s){if(null==t||null==i)throw"Invalid arguments";if(i="object"==typeof i?""+i:i+"",""===i)return null;var n,a,o,r,h=0,l=(s?s.shortYearCutoff:null)||this._defaults.shortYearCutoff,u="string"!=typeof l?l:(new Date).getFullYear()%100+parseInt(l,10),d=(s?s.dayNamesShort:null)||this._defaults.dayNamesShort,c=(s?s.dayNames:null)||this._defaults.dayNames,p=(s?s.monthNamesShort:null)||this._defaults.monthNamesShort,f=(s?s.monthNames:null)||this._defaults.monthNames,m=-1,g=-1,v=-1,y=-1,b=!1,_=function(e){var i=t.length>n+1&&t.charAt(n+1)===e;return i&&n++,i},x=function(e){var t=_(e),s="@"===e?14:"!"===e?20:"y"===e&&t?4:"o"===e?3:2,n="y"===e?s:1,a=RegExp("^\\d{"+n+","+s+"}"),o=i.substring(h).match(a);if(!o)throw"Missing number at position "+h;return h+=o[0].length,parseInt(o[0],10)},w=function(t,s,n){var a=-1,o=e.map(_(t)?n:s,function(e,t){return[[t,e]]}).sort(function(e,t){return-(e[1].length-t[1].length)});if(e.each(o,function(e,t){var s=t[1];return i.substr(h,s.length).toLowerCase()===s.toLowerCase()?(a=t[0],h+=s.length,!1):void 0}),-1!==a)return a+1;throw"Unknown name at position "+h},k=function(){if(i.charAt(h)!==t.charAt(n))throw"Unexpected literal at position "+h;h++};for(n=0;t.length>n;n++)if(b)"'"!==t.charAt(n)||_("'")?k():b=!1;else switch(t.charAt(n)){case"d":v=x("d");break;case"D":w("D",d,c);break;case"o":y=x("o");break;case"m":g=x("m");break;case"M":g=w("M",p,f);break;case"y":m=x("y");break;case"@":r=new Date(x("@")),m=r.getFullYear(),g=r.getMonth()+1,v=r.getDate();break;case"!":r=new Date((x("!")-this._ticksTo1970)/1e4),m=r.getFullYear(),g=r.getMonth()+1,v=r.getDate();break;case"'":_("'")?k():b=!0;break;default:k()}if(i.length>h&&(o=i.substr(h),!/^\s+/.test(o)))throw"Extra/unparsed characters found in date: "+o;if(-1===m?m=(new Date).getFullYear():100>m&&(m+=(new Date).getFullYear()-(new Date).getFullYear()%100+(u>=m?0:-100)),y>-1)for(g=1,v=y;;){if(a=this._getDaysInMonth(m,g-1),a>=v)break;g++,v-=a}if(r=this._daylightSavingAdjust(new Date(m,g-1,v)),r.getFullYear()!==m||r.getMonth()+1!==g||r.getDate()!==v)throw"Invalid date";return r},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:1e7*60*60*24*(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925)),formatDate:function(e,t,i){if(!t)return"";var s,n=(i?i.dayNamesShort:null)||this._defaults.dayNamesShort,a=(i?i.dayNames:null)||this._defaults.dayNames,o=(i?i.monthNamesShort:null)||this._defaults.monthNamesShort,r=(i?i.monthNames:null)||this._defaults.monthNames,h=function(t){var i=e.length>s+1&&e.charAt(s+1)===t;return i&&s++,i},l=function(e,t,i){var s=""+t;if(h(e))for(;i>s.length;)s="0"+s;return s},u=function(e,t,i,s){return h(e)?s[t]:i[t]},d="",c=!1;if(t)for(s=0;e.length>s;s++)if(c)"'"!==e.charAt(s)||h("'")?d+=e.charAt(s):c=!1;else switch(e.charAt(s)){case"d":d+=l("d",t.getDate(),2);break;case"D":d+=u("D",t.getDay(),n,a);break;case"o":d+=l("o",Math.round((new Date(t.getFullYear(),t.getMonth(),t.getDate()).getTime()-new Date(t.getFullYear(),0,0).getTime())/864e5),3);break;case"m":d+=l("m",t.getMonth()+1,2);break;case"M":d+=u("M",t.getMonth(),o,r);break;case"y":d+=h("y")?t.getFullYear():(10>t.getYear()%100?"0":"")+t.getYear()%100;break;case"@":d+=t.getTime();break;case"!":d+=1e4*t.getTime()+this._ticksTo1970;break;case"'":h("'")?d+="'":c=!0;break;default:d+=e.charAt(s)}return d},_possibleChars:function(e){var t,i="",s=!1,n=function(i){var s=e.length>t+1&&e.charAt(t+1)===i;return s&&t++,s};for(t=0;e.length>t;t++)if(s)"'"!==e.charAt(t)||n("'")?i+=e.charAt(t):s=!1;else switch(e.charAt(t)){case"d":case"m":case"y":case"@":i+="0123456789";break;case"D":case"M":return null;case"'":n("'")?i+="'":s=!0;break;default:i+=e.charAt(t)}return i},_get:function(e,t){return void 0!==e.settings[t]?e.settings[t]:this._defaults[t]},_setDateFromField:function(e,t){if(e.input.val()!==e.lastVal){var i=this._get(e,"dateFormat"),s=e.lastVal=e.input?e.input.val():null,n=this._getDefaultDate(e),a=n,o=this._getFormatConfig(e);try{a=this.parseDate(i,s,o)||n}catch(r){s=t?"":s}e.selectedDay=a.getDate(),e.drawMonth=e.selectedMonth=a.getMonth(),e.drawYear=e.selectedYear=a.getFullYear(),e.currentDay=s?a.getDate():0,e.currentMonth=s?a.getMonth():0,e.currentYear=s?a.getFullYear():0,this._adjustInstDate(e)}},_getDefaultDate:function(e){return this._restrictMinMax(e,this._determineDate(e,this._get(e,"defaultDate"),new Date))},_determineDate:function(t,i,s){var n=function(e){var t=new Date;return t.setDate(t.getDate()+e),t},a=function(i){try{return e.datepicker.parseDate(e.datepicker._get(t,"dateFormat"),i,e.datepicker._getFormatConfig(t))}catch(s){}for(var n=(i.toLowerCase().match(/^c/)?e.datepicker._getDate(t):null)||new Date,a=n.getFullYear(),o=n.getMonth(),r=n.getDate(),h=/([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,l=h.exec(i);l;){switch(l[2]||"d"){case"d":case"D":r+=parseInt(l[1],10);break;case"w":case"W":r+=7*parseInt(l[1],10);break;case"m":case"M":o+=parseInt(l[1],10),r=Math.min(r,e.datepicker._getDaysInMonth(a,o));break;case"y":case"Y":a+=parseInt(l[1],10),r=Math.min(r,e.datepicker._getDaysInMonth(a,o))}l=h.exec(i)}return new Date(a,o,r)},o=null==i||""===i?s:"string"==typeof i?a(i):"number"==typeof i?isNaN(i)?s:n(i):new Date(i.getTime());return o=o&&"Invalid Date"==""+o?s:o,o&&(o.setHours(0),o.setMinutes(0),o.setSeconds(0),o.setMilliseconds(0)),this._daylightSavingAdjust(o)},_daylightSavingAdjust:function(e){return e?(e.setHours(e.getHours()>12?e.getHours()+2:0),e):null},_setDate:function(e,t,i){var s=!t,n=e.selectedMonth,a=e.selectedYear,o=this._restrictMinMax(e,this._determineDate(e,t,new Date));e.selectedDay=e.currentDay=o.getDate(),e.drawMonth=e.selectedMonth=e.currentMonth=o.getMonth(),e.drawYear=e.selectedYear=e.currentYear=o.getFullYear(),n===e.selectedMonth&&a===e.selectedYear||i||this._notifyChange(e),this._adjustInstDate(e),e.input&&e.input.val(s?"":this._formatDate(e))},_getDate:function(e){var t=!e.currentYear||e.input&&""===e.input.val()?null:this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return t},_attachHandlers:function(t){var i=this._get(t,"stepMonths"),s="#"+t.id.replace(/\\\\/g,"\\");t.dpDiv.find("[data-handler]").map(function(){var t={prev:function(){e.datepicker._adjustDate(s,-i,"M")},next:function(){e.datepicker._adjustDate(s,+i,"M")},hide:function(){e.datepicker._hideDatepicker()},today:function(){e.datepicker._gotoToday(s)},selectDay:function(){return e.datepicker._selectDay(s,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this),!1},selectMonth:function(){return e.datepicker._selectMonthYear(s,this,"M"),!1},selectYear:function(){return e.datepicker._selectMonthYear(s,this,"Y"),!1}};e(this).bind(this.getAttribute("data-event"),t[this.getAttribute("data-handler")])})},_generateHTML:function(e){var t,i,s,n,a,o,r,h,l,u,d,c,p,f,m,g,v,y,b,_,x,w,k,T,D,S,M,C,N,A,P,I,H,z,F,E,O,j,W,L=new Date,R=this._daylightSavingAdjust(new Date(L.getFullYear(),L.getMonth(),L.getDate())),Y=this._get(e,"isRTL"),B=this._get(e,"showButtonPanel"),J=this._get(e,"hideIfNoPrevNext"),q=this._get(e,"navigationAsDateFormat"),K=this._getNumberOfMonths(e),V=this._get(e,"showCurrentAtPos"),U=this._get(e,"stepMonths"),Q=1!==K[0]||1!==K[1],G=this._daylightSavingAdjust(e.currentDay?new Date(e.currentYear,e.currentMonth,e.currentDay):new Date(9999,9,9)),X=this._getMinMaxDate(e,"min"),$=this._getMinMaxDate(e,"max"),Z=e.drawMonth-V,et=e.drawYear;if(0>Z&&(Z+=12,et--),$)for(t=this._daylightSavingAdjust(new Date(jQuery.getFullYear(),jQuery.getMonth()-K[0]*K[1]+1,jQuery.getDate())),t=X&&X>t?X:t;this._daylightSavingAdjust(new Date(et,Z,1))>t;)Z--,0>Z&&(Z=11,et--);for(e.drawMonth=Z,e.drawYear=et,i=this._get(e,"prevText"),i=q?this.formatDate(i,this._daylightSavingAdjust(new Date(et,Z-U,1)),this._getFormatConfig(e)):i,s=this._canAdjustMonth(e,-1,et,Z)?"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>":J?"":"<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>",n=this._get(e,"nextText"),n=q?this.formatDate(n,this._daylightSavingAdjust(new Date(et,Z+U,1)),this._getFormatConfig(e)):n,a=this._canAdjustMonth(e,1,et,Z)?"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>":J?"":"<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>",o=this._get(e,"currentText"),r=this._get(e,"gotoCurrent")&&e.currentDay?G:R,o=q?this.formatDate(o,r,this._getFormatConfig(e)):o,h=e.inline?"":"<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>"+this._get(e,"closeText")+"</button>",l=B?"<div class='ui-datepicker-buttonpane ui-widget-content'>"+(Y?h:"")+(this._isInRange(e,r)?"<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'>"+o+"</button>":"")+(Y?"":h)+"</div>":"",u=parseInt(this._get(e,"firstDay"),10),u=isNaN(u)?0:u,d=this._get(e,"showWeek"),c=this._get(e,"dayNames"),p=this._get(e,"dayNamesMin"),f=this._get(e,"monthNames"),m=this._get(e,"monthNamesShort"),g=this._get(e,"beforeShowDay"),v=this._get(e,"showOtherMonths"),y=this._get(e,"selectOtherMonths"),b=this._getDefaultDate(e),_="",w=0;K[0]>w;w++){for(k="",this.maxRows=4,T=0;K[1]>T;T++){if(D=this._daylightSavingAdjust(new Date(et,Z,e.selectedDay)),S=" ui-corner-all",M="",Q){if(M+="<div class='ui-datepicker-group",K[1]>1)switch(T){case 0:M+=" ui-datepicker-group-first",S=" ui-corner-"+(Y?"right":"left");break;case K[1]-1:M+=" ui-datepicker-group-last",S=" ui-corner-"+(Y?"left":"right");break;default:M+=" ui-datepicker-group-middle",S=""}M+="'>"}for(M+="<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix"+S+"'>"+(/all|left/.test(S)&&0===w?Y?a:s:"")+(/all|right/.test(S)&&0===w?Y?s:a:"")+this._generateMonthYearHeader(e,Z,et,X,$,w>0||T>0,f,m)+"</div><table class='ui-datepicker-calendar'><thead>"+"<tr>",C=d?"<th class='ui-datepicker-week-col'>"+this._get(e,"weekHeader")+"</th>":"",x=0;7>x;x++)N=(x+u)%7,C+="<th scope='col'"+((x+u+6)%7>=5?" class='ui-datepicker-week-end'":"")+">"+"<span title='"+c[N]+"'>"+p[N]+"</span></th>";for(M+=C+"</tr></thead><tbody>",A=this._getDaysInMonth(et,Z),et===e.selectedYear&&Z===e.selectedMonth&&(e.selectedDay=Math.min(e.selectedDay,A)),P=(this._getFirstDayOfMonth(et,Z)-u+7)%7,I=Math.ceil((P+A)/7),H=Q?this.maxRows>I?this.maxRows:I:I,this.maxRows=H,z=this._daylightSavingAdjust(new Date(et,Z,1-P)),F=0;H>F;F++){for(M+="<tr>",E=d?"<td class='ui-datepicker-week-col'>"+this._get(e,"calculateWeek")(z)+"</td>":"",x=0;7>x;x++)O=g?g.apply(e.input?e.input[0]:null,[z]):[!0,""],j=z.getMonth()!==Z,W=j&&!y||!O[0]||X&&X>z||$&&z>$,E+="<td class='"+((x+u+6)%7>=5?" ui-datepicker-week-end":"")+(j?" ui-datepicker-other-month":"")+(z.getTime()===D.getTime()&&Z===e.selectedMonth&&e._keyEvent||b.getTime()===z.getTime()&&b.getTime()===D.getTime()?" "+this._dayOverClass:"")+(W?" "+this._unselectableClass+" ui-state-disabled":"")+(j&&!v?"":" "+O[1]+(z.getTime()===G.getTime()?" "+this._currentClass:"")+(z.getTime()===R.getTime()?" ui-datepicker-today":""))+"'"+(j&&!v||!O[2]?"":" title='"+O[2].replace(/'/g,"&#39;")+"'")+(W?"":" data-handler='selectDay' data-event='click' data-month='"+z.getMonth()+"' data-year='"+z.getFullYear()+"'")+">"+(j&&!v?"&#xa0;":W?"<span class='ui-state-default'>"+z.getDate()+"</span>":"<a class='ui-state-default"+(z.getTime()===R.getTime()?" ui-state-highlight":"")+(z.getTime()===G.getTime()?" ui-state-active":"")+(j?" ui-priority-secondary":"")+"' href='#'>"+z.getDate()+"</a>")+"</td>",z.setDate(z.getDate()+1),z=this._daylightSavingAdjust(z);M+=E+"</tr>"}Z++,Z>11&&(Z=0,et++),M+="</tbody></table>"+(Q?"</div>"+(K[0]>0&&T===K[1]-1?"<div class='ui-datepicker-row-break'></div>":""):""),k+=M}_+=k}return _+=l,e._keyEvent=!1,_},_generateMonthYearHeader:function(e,t,i,s,n,a,o,r){var h,l,u,d,c,p,f,m,g=this._get(e,"changeMonth"),v=this._get(e,"changeYear"),y=this._get(e,"showMonthAfterYear"),b="<div class='ui-datepicker-title'>",_="";if(a||!g)_+="<span class='ui-datepicker-month'>"+o[t]+"</span>";else{for(h=s&&s.getFullYear()===i,l=n&&n.getFullYear()===i,_+="<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>",u=0;12>u;u++)(!h||u>=s.getMonth())&&(!l||n.getMonth()>=u)&&(_+="<option value='"+u+"'"+(u===t?" selected='selected'":"")+">"+r[u]+"</option>");_+="</select>"}if(y||(b+=_+(!a&&g&&v?"":"&#xa0;")),!e.yearshtml)if(e.yearshtml="",a||!v)b+="<span class='ui-datepicker-year'>"+i+"</span>";else{for(d=this._get(e,"yearRange").split(":"),c=(new Date).getFullYear(),p=function(e){var t=e.match(/c[+\-].*/)?i+parseInt(e.substring(1),10):e.match(/[+\-].*/)?c+parseInt(e,10):parseInt(e,10);return isNaN(t)?c:t},f=p(d[0]),m=Math.max(f,p(d[1]||"")),f=s?Math.max(f,s.getFullYear()):f,m=n?Math.min(m,n.getFullYear()):m,e.yearshtml+="<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";m>=f;f++)e.yearshtml+="<option value='"+f+"'"+(f===i?" selected='selected'":"")+">"+f+"</option>";e.yearshtml+="</select>",b+=e.yearshtml,e.yearshtml=null}return b+=this._get(e,"yearSuffix"),y&&(b+=(!a&&g&&v?"":"&#xa0;")+_),b+="</div>"},_adjustInstDate:function(e,t,i){var s=e.drawYear+("Y"===i?t:0),n=e.drawMonth+("M"===i?t:0),a=Math.min(e.selectedDay,this._getDaysInMonth(s,n))+("D"===i?t:0),o=this._restrictMinMax(e,this._daylightSavingAdjust(new Date(s,n,a)));e.selectedDay=o.getDate(),e.drawMonth=e.selectedMonth=o.getMonth(),e.drawYear=e.selectedYear=o.getFullYear(),("M"===i||"Y"===i)&&this._notifyChange(e)},_restrictMinMax:function(e,t){var i=this._getMinMaxDate(e,"min"),s=this._getMinMaxDate(e,"max"),n=i&&i>t?i:t;return s&&n>s?s:n},_notifyChange:function(e){var t=this._get(e,"onChangeMonthYear");t&&t.apply(e.input?e.input[0]:null,[e.selectedYear,e.selectedMonth+1,e])},_getNumberOfMonths:function(e){var t=this._get(e,"numberOfMonths");return null==t?[1,1]:"number"==typeof t?[1,t]:t},_getMinMaxDate:function(e,t){return this._determineDate(e,this._get(e,t+"Date"),null)},_getDaysInMonth:function(e,t){return 32-this._daylightSavingAdjust(new Date(e,t,32)).getDate()},_getFirstDayOfMonth:function(e,t){return new Date(e,t,1).getDay()},_canAdjustMonth:function(e,t,i,s){var n=this._getNumberOfMonths(e),a=this._daylightSavingAdjust(new Date(i,s+(0>t?t:n[0]*n[1]),1));return 0>t&&a.setDate(this._getDaysInMonth(a.getFullYear(),a.getMonth())),this._isInRange(e,a)},_isInRange:function(e,t){var i,s,n=this._getMinMaxDate(e,"min"),a=this._getMinMaxDate(e,"max"),o=null,r=null,h=this._get(e,"yearRange");return h&&(i=h.split(":"),s=(new Date).getFullYear(),o=parseInt(i[0],10),r=parseInt(i[1],10),i[0].match(/[+\-].*/)&&(o+=s),i[1].match(/[+\-].*/)&&(r+=s)),(!n||t.getTime()>=n.getTime())&&(!a||t.getTime()<=a.getTime())&&(!o||t.getFullYear()>=o)&&(!r||r>=t.getFullYear())},_getFormatConfig:function(e){var t=this._get(e,"shortYearCutoff");return t="string"!=typeof t?t:(new Date).getFullYear()%100+parseInt(t,10),{shortYearCutoff:t,dayNamesShort:this._get(e,"dayNamesShort"),dayNames:this._get(e,"dayNames"),monthNamesShort:this._get(e,"monthNamesShort"),monthNames:this._get(e,"monthNames")}},_formatDate:function(e,t,i,s){t||(e.currentDay=e.selectedDay,e.currentMonth=e.selectedMonth,e.currentYear=e.selectedYear);var n=t?"object"==typeof t?t:this._daylightSavingAdjust(new Date(s,i,t)):this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return this.formatDate(this._get(e,"dateFormat"),n,this._getFormatConfig(e))}}),e.fn.datepicker=function(t){if(!this.length)return this;e.datepicker.initialized||(e(document).mousedown(e.datepicker._checkExternalClick),e.datepicker.initialized=!0),0===e("#"+e.datepicker._mainDivId).length&&e("body").append(e.datepicker.dpDiv);var i=Array.prototype.slice.call(arguments,1);return"string"!=typeof t||"isDisabled"!==t&&"getDate"!==t&&"widget"!==t?"option"===t&&2===arguments.length&&"string"==typeof arguments[1]?e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this[0]].concat(i)):this.each(function(){"string"==typeof t?e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this].concat(i)):e.datepicker._attachDatepicker(this,t)}):e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this[0]].concat(i))},e.datepicker=new n,e.datepicker.initialized=!1,e.datepicker.uuid=(new Date).getTime(),e.datepicker.version="1.11.4",e.datepicker,e.widget("ui.draggable",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1,drag:null,start:null,stop:null},_create:function(){"original"===this.options.helper&&this._setPositionRelative(),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._setHandleClassName(),this._mouseInit()},_setOption:function(e,t){this._super(e,t),"handle"===e&&(this._removeHandleClassName(),this._setHandleClassName())},_destroy:function(){return(this.helper||this.element).is(".ui-draggable-dragging")?(this.destroyOnClear=!0,void 0):(this.element.removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._removeHandleClassName(),this._mouseDestroy(),void 0)},_mouseCapture:function(t){var i=this.options;return this._blurActiveElement(t),this.helper||i.disabled||e(t.target).closest(".ui-resizable-handle").length>0?!1:(this.handle=this._getHandle(t),this.handle?(this._blockFrames(i.iframeFix===!0?"iframe":i.iframeFix),!0):!1)},_blockFrames:function(t){this.iframeBlocks=this.document.find(t).map(function(){var t=e(this);return e("<div>").css("position","absolute").appendTo(t.parent()).outerWidth(t.outerWidth()).outerHeight(t.outerHeight()).offset(t.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_blurActiveElement:function(t){var i=this.document[0];if(this.handleElement.is(t.target))try{i.activeElement&&"body"!==i.activeElement.nodeName.toLowerCase()&&e(i.activeElement).blur()}catch(s){}},_mouseStart:function(t){var i=this.options;return this.helper=this._createHelper(t),this.helper.addClass("ui-draggable-dragging"),this._cacheHelperProportions(),e.ui.ddmanager&&(e.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(!0),this.offsetParent=this.helper.offsetParent(),this.hasFixedAncestor=this.helper.parents().filter(function(){return"fixed"===e(this).css("position")}).length>0,this.positionAbs=this.element.offset(),this._refreshOffsets(t),this.originalPosition=this.position=this._generatePosition(t,!1),this.originalPageX=t.pageX,this.originalPageY=t.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this._setContainment(),this._trigger("start",t)===!1?(this._clear(),!1):(this._cacheHelperProportions(),e.ui.ddmanager&&!i.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this._normalizeRightBottom(),this._mouseDrag(t,!0),e.ui.ddmanager&&e.ui.ddmanager.dragStart(this,t),!0)},_refreshOffsets:function(e){this.offset={top:this.positionAbs.top-this.margins.top,left:this.positionAbs.left-this.margins.left,scroll:!1,parent:this._getParentOffset(),relative:this._getRelativeOffset()},this.offset.click={left:e.pageX-this.offset.left,top:e.pageY-this.offset.top}},_mouseDrag:function(t,i){if(this.hasFixedAncestor&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(t,!0),this.positionAbs=this._convertPositionTo("absolute"),!i){var s=this._uiHash();if(this._trigger("drag",t,s)===!1)return this._mouseUp({}),!1;this.position=s.position}return this.helper[0].style.left=this.position.left+"px",this.helper[0].style.top=this.position.top+"px",e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),!1},_mouseStop:function(t){var i=this,s=!1;return e.ui.ddmanager&&!this.options.dropBehaviour&&(s=e.ui.ddmanager.drop(this,t)),this.dropped&&(s=this.dropped,this.dropped=!1),"invalid"===this.options.revert&&!s||"valid"===this.options.revert&&s||this.options.revert===!0||e.isFunction(this.options.revert)&&this.options.revert.call(this.element,s)?e(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){i._trigger("stop",t)!==!1&&i._clear()}):this._trigger("stop",t)!==!1&&this._clear(),!1},_mouseUp:function(t){return this._unblockFrames(),e.ui.ddmanager&&e.ui.ddmanager.dragStop(this,t),this.handleElement.is(t.target)&&this.element.focus(),e.ui.mouse.prototype._mouseUp.call(this,t)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear(),this},_getHandle:function(t){return this.options.handle?!!e(t.target).closest(this.element.find(this.options.handle)).length:!0},_setHandleClassName:function(){this.handleElement=this.options.handle?this.element.find(this.options.handle):this.element,this.handleElement.addClass("ui-draggable-handle")},_removeHandleClassName:function(){this.handleElement.removeClass("ui-draggable-handle")},_createHelper:function(t){var i=this.options,s=e.isFunction(i.helper),n=s?e(i.helper.apply(this.element[0],[t])):"clone"===i.helper?this.element.clone().removeAttr("id"):this.element;return n.parents("body").length||n.appendTo("parent"===i.appendTo?this.element[0].parentNode:i.appendTo),s&&n[0]===this.element[0]&&this._setPositionRelative(),n[0]===this.element[0]||/(fixed|absolute)/.test(n.css("position"))||n.css("position","absolute"),n},_setPositionRelative:function(){/^(?:r|a|f)/.test(this.element.css("position"))||(this.element[0].style.position="relative")},_adjustOffsetFromHelper:function(t){"string"==typeof t&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_isRootNode:function(e){return/(html|body)/i.test(e.tagName)||e===this.document[0]},_getParentOffset:function(){var t=this.offsetParent.offset(),i=this.document[0];return"absolute"===this.cssPosition&&this.scrollParent[0]!==i&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),this._isRootNode(this.offsetParent[0])&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"!==this.cssPosition)return{top:0,left:0};var e=this.element.position(),t=this._isRootNode(this.scrollParent[0]);return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+(t?0:this.scrollParent.scrollTop()),left:e.left-(parseInt(this.helper.css("left"),10)||0)+(t?0:this.scrollParent.scrollLeft())}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t,i,s,n=this.options,a=this.document[0];return this.relativeContainer=null,n.containment?"window"===n.containment?(this.containment=[e(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,e(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,e(window).scrollLeft()+e(window).width()-this.helperProportions.width-this.margins.left,e(window).scrollTop()+(e(window).height()||a.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):"document"===n.containment?(this.containment=[0,0,e(a).width()-this.helperProportions.width-this.margins.left,(e(a).height()||a.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):n.containment.constructor===Array?(this.containment=n.containment,void 0):("parent"===n.containment&&(n.containment=this.helper[0].parentNode),i=e(n.containment),s=i[0],s&&(t=/(scroll|auto)/.test(i.css("overflow")),this.containment=[(parseInt(i.css("borderLeftWidth"),10)||0)+(parseInt(i.css("paddingLeft"),10)||0),(parseInt(i.css("borderTopWidth"),10)||0)+(parseInt(i.css("paddingTop"),10)||0),(t?Math.max(s.scrollWidth,s.offsetWidth):s.offsetWidth)-(parseInt(i.css("borderRightWidth"),10)||0)-(parseInt(i.css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(t?Math.max(s.scrollHeight,s.offsetHeight):s.offsetHeight)-(parseInt(i.css("borderBottomWidth"),10)||0)-(parseInt(i.css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relativeContainer=i),void 0):(this.containment=null,void 0)
},_convertPositionTo:function(e,t){t||(t=this.position);var i="absolute"===e?1:-1,s=this._isRootNode(this.scrollParent[0]);return{top:t.top+this.offset.relative.top*i+this.offset.parent.top*i-("fixed"===this.cssPosition?-this.offset.scroll.top:s?0:this.offset.scroll.top)*i,left:t.left+this.offset.relative.left*i+this.offset.parent.left*i-("fixed"===this.cssPosition?-this.offset.scroll.left:s?0:this.offset.scroll.left)*i}},_generatePosition:function(e,t){var i,s,n,a,o=this.options,r=this._isRootNode(this.scrollParent[0]),h=e.pageX,l=e.pageY;return r&&this.offset.scroll||(this.offset.scroll={top:this.scrollParent.scrollTop(),left:this.scrollParent.scrollLeft()}),t&&(this.containment&&(this.relativeContainer?(s=this.relativeContainer.offset(),i=[this.containment[0]+s.left,this.containment[1]+s.top,this.containment[2]+s.left,this.containment[3]+s.top]):i=this.containment,e.pageX-this.offset.click.left<i[0]&&(h=i[0]+this.offset.click.left),e.pageY-this.offset.click.top<i[1]&&(l=i[1]+this.offset.click.top),e.pageX-this.offset.click.left>i[2]&&(h=i[2]+this.offset.click.left),e.pageY-this.offset.click.top>i[3]&&(l=i[3]+this.offset.click.top)),o.grid&&(n=o.grid[1]?this.originalPageY+Math.round((l-this.originalPageY)/o.grid[1])*o.grid[1]:this.originalPageY,l=i?n-this.offset.click.top>=i[1]||n-this.offset.click.top>i[3]?n:n-this.offset.click.top>=i[1]?n-o.grid[1]:n+o.grid[1]:n,a=o.grid[0]?this.originalPageX+Math.round((h-this.originalPageX)/o.grid[0])*o.grid[0]:this.originalPageX,h=i?a-this.offset.click.left>=i[0]||a-this.offset.click.left>i[2]?a:a-this.offset.click.left>=i[0]?a-o.grid[0]:a+o.grid[0]:a),"y"===o.axis&&(h=this.originalPageX),"x"===o.axis&&(l=this.originalPageY)),{top:l-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.offset.scroll.top:r?0:this.offset.scroll.top),left:h-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.offset.scroll.left:r?0:this.offset.scroll.left)}},_clear:function(){this.helper.removeClass("ui-draggable-dragging"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1,this.destroyOnClear&&this.destroy()},_normalizeRightBottom:function(){"y"!==this.options.axis&&"auto"!==this.helper.css("right")&&(this.helper.width(this.helper.width()),this.helper.css("right","auto")),"x"!==this.options.axis&&"auto"!==this.helper.css("bottom")&&(this.helper.height(this.helper.height()),this.helper.css("bottom","auto"))},_trigger:function(t,i,s){return s=s||this._uiHash(),e.ui.plugin.call(this,t,[i,s,this],!0),/^(drag|start|stop)/.test(t)&&(this.positionAbs=this._convertPositionTo("absolute"),s.offset=this.positionAbs),e.Widget.prototype._trigger.call(this,t,i,s)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),e.ui.plugin.add("draggable","connectToSortable",{start:function(t,i,s){var n=e.extend({},i,{item:s.element});s.sortables=[],e(s.options.connectToSortable).each(function(){var i=e(this).sortable("instance");i&&!i.options.disabled&&(s.sortables.push(i),i.refreshPositions(),i._trigger("activate",t,n))})},stop:function(t,i,s){var n=e.extend({},i,{item:s.element});s.cancelHelperRemoval=!1,e.each(s.sortables,function(){var e=this;e.isOver?(e.isOver=0,s.cancelHelperRemoval=!0,e.cancelHelperRemoval=!1,e._storedCSS={position:e.placeholder.css("position"),top:e.placeholder.css("top"),left:e.placeholder.css("left")},e._mouseStop(t),e.options.helper=e.options._helper):(e.cancelHelperRemoval=!0,e._trigger("deactivate",t,n))})},drag:function(t,i,s){e.each(s.sortables,function(){var n=!1,a=this;a.positionAbs=s.positionAbs,a.helperProportions=s.helperProportions,a.offset.click=s.offset.click,a._intersectsWith(a.containerCache)&&(n=!0,e.each(s.sortables,function(){return this.positionAbs=s.positionAbs,this.helperProportions=s.helperProportions,this.offset.click=s.offset.click,this!==a&&this._intersectsWith(this.containerCache)&&e.contains(a.element[0],this.element[0])&&(n=!1),n})),n?(a.isOver||(a.isOver=1,s._parent=i.helper.parent(),a.currentItem=i.helper.appendTo(a.element).data("ui-sortable-item",!0),a.options._helper=a.options.helper,a.options.helper=function(){return i.helper[0]},t.target=a.currentItem[0],a._mouseCapture(t,!0),a._mouseStart(t,!0,!0),a.offset.click.top=s.offset.click.top,a.offset.click.left=s.offset.click.left,a.offset.parent.left-=s.offset.parent.left-a.offset.parent.left,a.offset.parent.top-=s.offset.parent.top-a.offset.parent.top,s._trigger("toSortable",t),s.dropped=a.element,e.each(s.sortables,function(){this.refreshPositions()}),s.currentItem=s.element,a.fromOutside=s),a.currentItem&&(a._mouseDrag(t),i.position=a.position)):a.isOver&&(a.isOver=0,a.cancelHelperRemoval=!0,a.options._revert=a.options.revert,a.options.revert=!1,a._trigger("out",t,a._uiHash(a)),a._mouseStop(t,!0),a.options.revert=a.options._revert,a.options.helper=a.options._helper,a.placeholder&&a.placeholder.remove(),i.helper.appendTo(s._parent),s._refreshOffsets(t),i.position=s._generatePosition(t,!0),s._trigger("fromSortable",t),s.dropped=!1,e.each(s.sortables,function(){this.refreshPositions()}))})}}),e.ui.plugin.add("draggable","cursor",{start:function(t,i,s){var n=e("body"),a=s.options;n.css("cursor")&&(a._cursor=n.css("cursor")),n.css("cursor",a.cursor)},stop:function(t,i,s){var n=s.options;n._cursor&&e("body").css("cursor",n._cursor)}}),e.ui.plugin.add("draggable","opacity",{start:function(t,i,s){var n=e(i.helper),a=s.options;n.css("opacity")&&(a._opacity=n.css("opacity")),n.css("opacity",a.opacity)},stop:function(t,i,s){var n=s.options;n._opacity&&e(i.helper).css("opacity",n._opacity)}}),e.ui.plugin.add("draggable","scroll",{start:function(e,t,i){i.scrollParentNotHidden||(i.scrollParentNotHidden=i.helper.scrollParent(!1)),i.scrollParentNotHidden[0]!==i.document[0]&&"HTML"!==i.scrollParentNotHidden[0].tagName&&(i.overflowOffset=i.scrollParentNotHidden.offset())},drag:function(t,i,s){var n=s.options,a=!1,o=s.scrollParentNotHidden[0],r=s.document[0];o!==r&&"HTML"!==o.tagName?(n.axis&&"x"===n.axis||(s.overflowOffset.top+o.offsetHeight-t.pageY<n.scrollSensitivity?o.scrollTop=a=o.scrollTop+n.scrollSpeed:t.pageY-s.overflowOffset.top<n.scrollSensitivity&&(o.scrollTop=a=o.scrollTop-n.scrollSpeed)),n.axis&&"y"===n.axis||(s.overflowOffset.left+o.offsetWidth-t.pageX<n.scrollSensitivity?o.scrollLeft=a=o.scrollLeft+n.scrollSpeed:t.pageX-s.overflowOffset.left<n.scrollSensitivity&&(o.scrollLeft=a=o.scrollLeft-n.scrollSpeed))):(n.axis&&"x"===n.axis||(t.pageY-e(r).scrollTop()<n.scrollSensitivity?a=e(r).scrollTop(e(r).scrollTop()-n.scrollSpeed):e(window).height()-(t.pageY-e(r).scrollTop())<n.scrollSensitivity&&(a=e(r).scrollTop(e(r).scrollTop()+n.scrollSpeed))),n.axis&&"y"===n.axis||(t.pageX-e(r).scrollLeft()<n.scrollSensitivity?a=e(r).scrollLeft(e(r).scrollLeft()-n.scrollSpeed):e(window).width()-(t.pageX-e(r).scrollLeft())<n.scrollSensitivity&&(a=e(r).scrollLeft(e(r).scrollLeft()+n.scrollSpeed)))),a!==!1&&e.ui.ddmanager&&!n.dropBehaviour&&e.ui.ddmanager.prepareOffsets(s,t)}}),e.ui.plugin.add("draggable","snap",{start:function(t,i,s){var n=s.options;s.snapElements=[],e(n.snap.constructor!==String?n.snap.items||":data(ui-draggable)":n.snap).each(function(){var t=e(this),i=t.offset();this!==s.element[0]&&s.snapElements.push({item:this,width:t.outerWidth(),height:t.outerHeight(),top:i.top,left:i.left})})},drag:function(t,i,s){var n,a,o,r,h,l,u,d,c,p,f=s.options,m=f.snapTolerance,g=i.offset.left,v=g+s.helperProportions.width,y=i.offset.top,b=y+s.helperProportions.height;for(c=s.snapElements.length-1;c>=0;c--)h=s.snapElements[c].left-s.margins.left,l=h+s.snapElements[c].width,u=s.snapElements[c].top-s.margins.top,d=u+s.snapElements[c].height,h-m>v||g>l+m||u-m>b||y>d+m||!e.contains(s.snapElements[c].item.ownerDocument,s.snapElements[c].item)?(s.snapElements[c].snapping&&s.options.snap.release&&s.options.snap.release.call(s.element,t,e.extend(s._uiHash(),{snapItem:s.snapElements[c].item})),s.snapElements[c].snapping=!1):("inner"!==f.snapMode&&(n=m>=Math.abs(u-b),a=m>=Math.abs(d-y),o=m>=Math.abs(h-v),r=m>=Math.abs(l-g),n&&(i.position.top=s._convertPositionTo("relative",{top:u-s.helperProportions.height,left:0}).top),a&&(i.position.top=s._convertPositionTo("relative",{top:d,left:0}).top),o&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h-s.helperProportions.width}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l}).left)),p=n||a||o||r,"outer"!==f.snapMode&&(n=m>=Math.abs(u-y),a=m>=Math.abs(d-b),o=m>=Math.abs(h-g),r=m>=Math.abs(l-v),n&&(i.position.top=s._convertPositionTo("relative",{top:u,left:0}).top),a&&(i.position.top=s._convertPositionTo("relative",{top:d-s.helperProportions.height,left:0}).top),o&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l-s.helperProportions.width}).left)),!s.snapElements[c].snapping&&(n||a||o||r||p)&&s.options.snap.snap&&s.options.snap.snap.call(s.element,t,e.extend(s._uiHash(),{snapItem:s.snapElements[c].item})),s.snapElements[c].snapping=n||a||o||r||p)}}),e.ui.plugin.add("draggable","stack",{start:function(t,i,s){var n,a=s.options,o=e.makeArray(e(a.stack)).sort(function(t,i){return(parseInt(e(t).css("zIndex"),10)||0)-(parseInt(e(i).css("zIndex"),10)||0)});o.length&&(n=parseInt(e(o[0]).css("zIndex"),10)||0,e(o).each(function(t){e(this).css("zIndex",n+t)}),this.css("zIndex",n+o.length))}}),e.ui.plugin.add("draggable","zIndex",{start:function(t,i,s){var n=e(i.helper),a=s.options;n.css("zIndex")&&(a._zIndex=n.css("zIndex")),n.css("zIndex",a.zIndex)},stop:function(t,i,s){var n=s.options;n._zIndex&&e(i.helper).css("zIndex",n._zIndex)}}),e.ui.draggable,e.widget("ui.resizable",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(e){return parseInt(e,10)||0},_isNumber:function(e){return!isNaN(parseInt(e,10))},_hasScroll:function(t,i){if("hidden"===e(t).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return t[s]>0?!0:(t[s]=1,n=t[s]>0,t[s]=0,n)},_create:function(){var t,i,s,n,a,o=this,r=this.options;if(this.element.addClass("ui-resizable"),e.extend(this,{_aspectRatio:!!r.aspectRatio,aspectRatio:r.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:r.helper||r.ghost||r.animate?r.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(e("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=r.handles||(e(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=e(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),t=this.handles.split(","),this.handles={},i=0;t.length>i;i++)s=e.trim(t[i]),a="ui-resizable-"+s,n=e("<div class='ui-resizable-handle "+a+"'></div>"),n.css({zIndex:r.zIndex}),"se"===s&&n.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[s]=".ui-resizable-"+s,this.element.append(n);this._renderAxis=function(t){var i,s,n,a;t=t||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=e(this.handles[i]),this._on(this.handles[i],{mousedown:o._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=e(this.handles[i],this.element),a=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),t.css(n,a),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.mouseover(function(){o.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),o.axis=n&&n[1]?n[1]:"se")}),r.autoHide&&(this._handles.hide(),e(this.element).addClass("ui-resizable-autohide").mouseenter(function(){r.disabled||(e(this).removeClass("ui-resizable-autohide"),o._handles.show())}).mouseleave(function(){r.disabled||o.resizing||(e(this).addClass("ui-resizable-autohide"),o._handles.hide())})),this._mouseInit()},_destroy:function(){this._mouseDestroy();var t,i=function(t){e(t).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").removeData("ui-resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),t=this.element,this.originalElement.css({position:t.css("position"),width:t.outerWidth(),height:t.outerHeight(),top:t.css("top"),left:t.css("left")}).insertAfter(t),t.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_mouseCapture:function(t){var i,s,n=!1;for(i in this.handles)s=e(this.handles[i])[0],(s===t.target||e.contains(s,t.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(t){var i,s,n,a=this.options,o=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),a.containment&&(i+=e(a.containment).scrollLeft()||0,s+=e(a.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:o.width(),height:o.height()},this.originalSize=this._helper?{width:o.outerWidth(),height:o.outerHeight()}:{width:o.width(),height:o.height()},this.sizeDiff={width:o.outerWidth()-o.width(),height:o.outerHeight()-o.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof a.aspectRatio?a.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=e(".ui-resizable-"+this.axis).css("cursor"),e("body").css("cursor","auto"===n?this.axis+"-resize":n),o.addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var i,s,n=this.originalMousePosition,a=this.axis,o=t.pageX-n.left||0,r=t.pageY-n.top||0,h=this._change[a];return this._updatePrevProperties(),h?(i=h.apply(this,[t,o,r]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(i=this._updateRatio(i,t)),i=this._respectSize(i,t),this._updateCache(i),this._propagate("resize",t),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),e.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(t){this.resizing=!1;var i,s,n,a,o,r,h,l=this.options,u=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:u.sizeDiff.height,a=s?0:u.sizeDiff.width,o={width:u.helper.width()-a,height:u.helper.height()-n},r=parseInt(u.element.css("left"),10)+(u.position.left-u.originalPosition.left)||null,h=parseInt(u.element.css("top"),10)+(u.position.top-u.originalPosition.top)||null,l.animate||this.element.css(e.extend(o,{top:h,left:r})),u.helper.height(u.size.height),u.helper.width(u.size.width),this._helper&&!l.animate&&this._proportionallyResize()),e("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var e={};return this.position.top!==this.prevPosition.top&&(e.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(e.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(e.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(e.height=this.size.height+"px"),this.helper.css(e),e},_updateVirtualBoundaries:function(e){var t,i,s,n,a,o=this.options;a={minWidth:this._isNumber(o.minWidth)?o.minWidth:0,maxWidth:this._isNumber(o.maxWidth)?o.maxWidth:1/0,minHeight:this._isNumber(o.minHeight)?o.minHeight:0,maxHeight:this._isNumber(o.maxHeight)?o.maxHeight:1/0},(this._aspectRatio||e)&&(t=a.minHeight*this.aspectRatio,s=a.minWidth/this.aspectRatio,i=a.maxHeight*this.aspectRatio,n=a.maxWidth/this.aspectRatio,t>a.minWidth&&(a.minWidth=t),s>a.minHeight&&(a.minHeight=s),a.maxWidth>i&&(a.maxWidth=i),a.maxHeight>n&&(a.maxHeight=n)),this._vBoundaries=a},_updateCache:function(e){this.offset=this.helper.offset(),this._isNumber(e.left)&&(this.position.left=e.left),this._isNumber(e.top)&&(this.position.top=e.top),this._isNumber(e.height)&&(this.size.height=e.height),this._isNumber(e.width)&&(this.size.width=e.width)},_updateRatio:function(e){var t=this.position,i=this.size,s=this.axis;return this._isNumber(e.height)?e.width=e.height*this.aspectRatio:this._isNumber(e.width)&&(e.height=e.width/this.aspectRatio),"sw"===s&&(e.left=t.left+(i.width-e.width),e.top=null),"nw"===s&&(e.top=t.top+(i.height-e.height),e.left=t.left+(i.width-e.width)),e},_respectSize:function(e){var t=this._vBoundaries,i=this.axis,s=this._isNumber(e.width)&&t.maxWidth&&t.maxWidth<e.width,n=this._isNumber(e.height)&&t.maxHeight&&t.maxHeight<e.height,a=this._isNumber(e.width)&&t.minWidth&&t.minWidth>e.width,o=this._isNumber(e.height)&&t.minHeight&&t.minHeight>e.height,r=this.originalPosition.left+this.originalSize.width,h=this.position.top+this.size.height,l=/sw|nw|w/.test(i),u=/nw|ne|n/.test(i);return a&&(e.width=t.minWidth),o&&(e.height=t.minHeight),s&&(e.width=t.maxWidth),n&&(e.height=t.maxHeight),a&&l&&(e.left=r-t.minWidth),s&&l&&(e.left=r-t.maxWidth),o&&u&&(e.top=h-t.minHeight),n&&u&&(e.top=h-t.maxHeight),e.width||e.height||e.left||!e.top?e.width||e.height||e.top||!e.left||(e.left=null):e.top=null,e},_getPaddingPlusBorderDimensions:function(e){for(var t=0,i=[],s=[e.css("borderTopWidth"),e.css("borderRightWidth"),e.css("borderBottomWidth"),e.css("borderLeftWidth")],n=[e.css("paddingTop"),e.css("paddingRight"),e.css("paddingBottom"),e.css("paddingLeft")];4>t;t++)i[t]=parseInt(s[t],10)||0,i[t]+=parseInt(n[t],10)||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var e,t=0,i=this.helper||this.element;this._proportionallyResizeElements.length>t;t++)e=this._proportionallyResizeElements[t],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(e)),e.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var t=this.element,i=this.options;this.elementOffset=t.offset(),this._helper?(this.helper=this.helper||e("<div style='overflow:hidden;'></div>"),this.helper.addClass(this._helper).css({width:this.element.outerWidth()-1,height:this.element.outerHeight()-1,position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(e,t){return{width:this.originalSize.width+t}},w:function(e,t){var i=this.originalSize,s=this.originalPosition;return{left:s.left+t,width:i.width-t}},n:function(e,t,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(e,t,i){return{height:this.originalSize.height+i}},se:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},sw:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,i,s]))},ne:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},nw:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,i,s]))}},_propagate:function(t,i){e.ui.plugin.call(this,t,[i,this.ui()]),"resize"!==t&&this._trigger(t,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),e.ui.plugin.add("resizable","animate",{stop:function(t){var i=e(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,a=n.length&&/textarea/i.test(n[0].nodeName),o=a&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=a?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-o},l=parseInt(i.element.css("left"),10)+(i.position.left-i.originalPosition.left)||null,u=parseInt(i.element.css("top"),10)+(i.position.top-i.originalPosition.top)||null;i.element.animate(e.extend(h,u&&l?{top:u,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseInt(i.element.css("width"),10),height:parseInt(i.element.css("height"),10),top:parseInt(i.element.css("top"),10),left:parseInt(i.element.css("left"),10)};n&&n.length&&e(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",t)}})}}),e.ui.plugin.add("resizable","containment",{start:function(){var t,i,s,n,a,o,r,h=e(this).resizable("instance"),l=h.options,u=h.element,d=l.containment,c=d instanceof e?d.get(0):/parent/.test(d)?u.parent().get(0):d;c&&(h.containerElement=e(c),/document/.test(d)||d===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}):(t=e(c),i=[],e(["Top","Right","Left","Bottom"]).each(function(e,s){i[e]=h._num(t.css("padding"+s))}),h.containerOffset=t.offset(),h.containerPosition=t.position(),h.containerSize={height:t.innerHeight()-i[3],width:t.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,a=h.containerSize.width,o=h._hasScroll(c,"left")?c.scrollWidth:a,r=h._hasScroll(c)?c.scrollHeight:n,h.parentData={element:c,left:s.left,top:s.top,width:o,height:r}))},resize:function(t){var i,s,n,a,o=e(this).resizable("instance"),r=o.options,h=o.containerOffset,l=o.position,u=o._aspectRatio||t.shiftKey,d={top:0,left:0},c=o.containerElement,p=!0;c[0]!==document&&/static/.test(c.css("position"))&&(d=h),l.left<(o._helper?h.left:0)&&(o.size.width=o.size.width+(o._helper?o.position.left-h.left:o.position.left-d.left),u&&(o.size.height=o.size.width/o.aspectRatio,p=!1),o.position.left=r.helper?h.left:0),l.top<(o._helper?h.top:0)&&(o.size.height=o.size.height+(o._helper?o.position.top-h.top:o.position.top),u&&(o.size.width=o.size.height*o.aspectRatio,p=!1),o.position.top=o._helper?h.top:0),n=o.containerElement.get(0)===o.element.parent().get(0),a=/relative|absolute/.test(o.containerElement.css("position")),n&&a?(o.offset.left=o.parentData.left+o.position.left,o.offset.top=o.parentData.top+o.position.top):(o.offset.left=o.element.offset().left,o.offset.top=o.element.offset().top),i=Math.abs(o.sizeDiff.width+(o._helper?o.offset.left-d.left:o.offset.left-h.left)),s=Math.abs(o.sizeDiff.height+(o._helper?o.offset.top-d.top:o.offset.top-h.top)),i+o.size.width>=o.parentData.width&&(o.size.width=o.parentData.width-i,u&&(o.size.height=o.size.width/o.aspectRatio,p=!1)),s+o.size.height>=o.parentData.height&&(o.size.height=o.parentData.height-s,u&&(o.size.width=o.size.height*o.aspectRatio,p=!1)),p||(o.position.left=o.prevPosition.left,o.position.top=o.prevPosition.top,o.size.width=o.prevSize.width,o.size.height=o.prevSize.height)},stop:function(){var t=e(this).resizable("instance"),i=t.options,s=t.containerOffset,n=t.containerPosition,a=t.containerElement,o=e(t.helper),r=o.offset(),h=o.outerWidth()-t.sizeDiff.width,l=o.outerHeight()-t.sizeDiff.height;t._helper&&!i.animate&&/relative/.test(a.css("position"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l}),t._helper&&!i.animate&&/static/.test(a.css("position"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),e.ui.plugin.add("resizable","alsoResize",{start:function(){var t=e(this).resizable("instance"),i=t.options;e(i.alsoResize).each(function(){var t=e(this);t.data("ui-resizable-alsoresize",{width:parseInt(t.width(),10),height:parseInt(t.height(),10),left:parseInt(t.css("left"),10),top:parseInt(t.css("top"),10)})})},resize:function(t,i){var s=e(this).resizable("instance"),n=s.options,a=s.originalSize,o=s.originalPosition,r={height:s.size.height-a.height||0,width:s.size.width-a.width||0,top:s.position.top-o.top||0,left:s.position.left-o.left||0};e(n.alsoResize).each(function(){var t=e(this),s=e(this).data("ui-resizable-alsoresize"),n={},a=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(a,function(e,t){var i=(s[t]||0)+(r[t]||0);i&&i>=0&&(n[t]=i||null)}),t.css(n)})},stop:function(){e(this).removeData("resizable-alsoresize")}}),e.ui.plugin.add("resizable","ghost",{start:function(){var t=e(this).resizable("instance"),i=t.options,s=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:s.height,width:s.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass("string"==typeof i.ghost?i.ghost:""),t.ghost.appendTo(t.helper)},resize:function(){var t=e(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=e(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),e.ui.plugin.add("resizable","grid",{resize:function(){var t,i=e(this).resizable("instance"),s=i.options,n=i.size,a=i.originalSize,o=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,u=h[1]||1,d=Math.round((n.width-a.width)/l)*l,c=Math.round((n.height-a.height)/u)*u,p=a.width+d,f=a.height+c,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,v=s.minWidth&&s.minWidth>p,y=s.minHeight&&s.minHeight>f;s.grid=h,v&&(p+=l),y&&(f+=u),m&&(p-=l),g&&(f-=u),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=o.top-c):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=o.left-d):((0>=f-u||0>=p-l)&&(t=i._getPaddingPlusBorderDimensions(this)),f-u>0?(i.size.height=f,i.position.top=o.top-c):(f=u-t.height,i.size.height=f,i.position.top=o.top+a.height-f),p-l>0?(i.size.width=p,i.position.left=o.left-d):(p=l-t.width,i.size.width=p,i.position.left=o.left+a.width-p))}}),e.ui.resizable,e.widget("ui.dialog",{version:"1.11.4",options:{appendTo:"body",autoOpen:!0,buttons:[],closeOnEscape:!0,closeText:"Close",dialogClass:"",draggable:!0,hide:null,height:"auto",maxHeight:null,maxWidth:null,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",of:window,collision:"fit",using:function(t){var i=e(this).css(t).offset().top;0>i&&e(this).css("top",t.top-i)}},resizable:!0,show:null,title:null,width:300,beforeClose:null,close:null,drag:null,dragStart:null,dragStop:null,focus:null,open:null,resize:null,resizeStart:null,resizeStop:null},sizeRelatedOptions:{buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},resizableRelatedOptions:{maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0},_create:function(){this.originalCss={display:this.element[0].style.display,width:this.element[0].style.width,minHeight:this.element[0].style.minHeight,maxHeight:this.element[0].style.maxHeight,height:this.element[0].style.height},this.originalPosition={parent:this.element.parent(),index:this.element.parent().children().index(this.element)},this.originalTitle=this.element.attr("title"),this.options.title=this.options.title||this.originalTitle,this._createWrapper(),this.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(this.uiDialog),this._createTitlebar(),this._createButtonPane(),this.options.draggable&&e.fn.draggable&&this._makeDraggable(),this.options.resizable&&e.fn.resizable&&this._makeResizable(),this._isOpen=!1,this._trackFocus()},_init:function(){this.options.autoOpen&&this.open()},_appendTo:function(){var t=this.options.appendTo;return t&&(t.jquery||t.nodeType)?e(t):this.document.find(t||"body").eq(0)},_destroy:function(){var e,t=this.originalPosition;this._untrackInstance(),this._destroyOverlay(),this.element.removeUniqueId().removeClass("ui-dialog-content ui-widget-content").css(this.originalCss).detach(),this.uiDialog.stop(!0,!0).remove(),this.originalTitle&&this.element.attr("title",this.originalTitle),e=t.parent.children().eq(t.index),e.length&&e[0]!==this.element[0]?e.before(this.element):t.parent.append(this.element)},widget:function(){return this.uiDialog},disable:e.noop,enable:e.noop,close:function(t){var i,s=this;if(this._isOpen&&this._trigger("beforeClose",t)!==!1){if(this._isOpen=!1,this._focusedElement=null,this._destroyOverlay(),this._untrackInstance(),!this.opener.filter(":focusable").focus().length)try{i=this.document[0].activeElement,i&&"body"!==i.nodeName.toLowerCase()&&e(i).blur()}catch(n){}this._hide(this.uiDialog,this.options.hide,function(){s._trigger("close",t)})}},isOpen:function(){return this._isOpen},moveToTop:function(){this._moveToTop()},_moveToTop:function(t,i){var s=!1,n=this.uiDialog.siblings(".ui-front:visible").map(function(){return+e(this).css("z-index")}).get(),a=Math.max.apply(null,n);return a>=+this.uiDialog.css("z-index")&&(this.uiDialog.css("z-index",a+1),s=!0),s&&!i&&this._trigger("focus",t),s},open:function(){var t=this;return this._isOpen?(this._moveToTop()&&this._focusTabbable(),void 0):(this._isOpen=!0,this.opener=e(this.document[0].activeElement),this._size(),this._position(),this._createOverlay(),this._moveToTop(null,!0),this.overlay&&this.overlay.css("z-index",this.uiDialog.css("z-index")-1),this._show(this.uiDialog,this.options.show,function(){t._focusTabbable(),t._trigger("focus")}),this._makeFocusTarget(),this._trigger("open"),void 0)},_focusTabbable:function(){var e=this._focusedElement;e||(e=this.element.find("[autofocus]")),e.length||(e=this.element.find(":tabbable")),e.length||(e=this.uiDialogButtonPane.find(":tabbable")),e.length||(e=this.uiDialogTitlebarClose.filter(":tabbable")),e.length||(e=this.uiDialog),e.eq(0).focus()},_keepFocus:function(t){function i(){var t=this.document[0].activeElement,i=this.uiDialog[0]===t||e.contains(this.uiDialog[0],t);i||this._focusTabbable()}t.preventDefault(),i.call(this),this._delay(i)},_createWrapper:function(){this.uiDialog=e("<div>").addClass("ui-dialog ui-widget ui-widget-content ui-corner-all ui-front "+this.options.dialogClass).hide().attr({tabIndex:-1,role:"dialog"}).appendTo(this._appendTo()),this._on(this.uiDialog,{keydown:function(t){if(this.options.closeOnEscape&&!t.isDefaultPrevented()&&t.keyCode&&t.keyCode===e.ui.keyCode.ESCAPE)return t.preventDefault(),this.close(t),void 0;
if(t.keyCode===e.ui.keyCode.TAB&&!t.isDefaultPrevented()){var i=this.uiDialog.find(":tabbable"),s=i.filter(":first"),n=i.filter(":last");t.target!==n[0]&&t.target!==this.uiDialog[0]||t.shiftKey?t.target!==s[0]&&t.target!==this.uiDialog[0]||!t.shiftKey||(this._delay(function(){n.focus()}),t.preventDefault()):(this._delay(function(){s.focus()}),t.preventDefault())}},mousedown:function(e){this._moveToTop(e)&&this._focusTabbable()}}),this.element.find("[aria-describedby]").length||this.uiDialog.attr({"aria-describedby":this.element.uniqueId().attr("id")})},_createTitlebar:function(){var t;this.uiDialogTitlebar=e("<div>").addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(this.uiDialog),this._on(this.uiDialogTitlebar,{mousedown:function(t){e(t.target).closest(".ui-dialog-titlebar-close")||this.uiDialog.focus()}}),this.uiDialogTitlebarClose=e("<button type='button'></button>").button({label:this.options.closeText,icons:{primary:"ui-icon-closethick"},text:!1}).addClass("ui-dialog-titlebar-close").appendTo(this.uiDialogTitlebar),this._on(this.uiDialogTitlebarClose,{click:function(e){e.preventDefault(),this.close(e)}}),t=e("<span>").uniqueId().addClass("ui-dialog-title").prependTo(this.uiDialogTitlebar),this._title(t),this.uiDialog.attr({"aria-labelledby":t.attr("id")})},_title:function(e){this.options.title||e.html("&#160;"),e.text(this.options.title)},_createButtonPane:function(){this.uiDialogButtonPane=e("<div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),this.uiButtonSet=e("<div>").addClass("ui-dialog-buttonset").appendTo(this.uiDialogButtonPane),this._createButtons()},_createButtons:function(){var t=this,i=this.options.buttons;return this.uiDialogButtonPane.remove(),this.uiButtonSet.empty(),e.isEmptyObject(i)||e.isArray(i)&&!i.length?(this.uiDialog.removeClass("ui-dialog-buttons"),void 0):(e.each(i,function(i,s){var n,a;s=e.isFunction(s)?{click:s,text:i}:s,s=e.extend({type:"button"},s),n=s.click,s.click=function(){n.apply(t.element[0],arguments)},a={icons:s.icons,text:s.showText},delete s.icons,delete s.showText,e("<button></button>",s).button(a).appendTo(t.uiButtonSet)}),this.uiDialog.addClass("ui-dialog-buttons"),this.uiDialogButtonPane.appendTo(this.uiDialog),void 0)},_makeDraggable:function(){function t(e){return{position:e.position,offset:e.offset}}var i=this,s=this.options;this.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(s,n){e(this).addClass("ui-dialog-dragging"),i._blockFrames(),i._trigger("dragStart",s,t(n))},drag:function(e,s){i._trigger("drag",e,t(s))},stop:function(n,a){var o=a.offset.left-i.document.scrollLeft(),r=a.offset.top-i.document.scrollTop();s.position={my:"left top",at:"left"+(o>=0?"+":"")+o+" "+"top"+(r>=0?"+":"")+r,of:i.window},e(this).removeClass("ui-dialog-dragging"),i._unblockFrames(),i._trigger("dragStop",n,t(a))}})},_makeResizable:function(){function t(e){return{originalPosition:e.originalPosition,originalSize:e.originalSize,position:e.position,size:e.size}}var i=this,s=this.options,n=s.resizable,a=this.uiDialog.css("position"),o="string"==typeof n?n:"n,e,s,w,se,sw,ne,nw";this.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:this.element,maxWidth:s.maxWidth,maxHeight:s.maxHeight,minWidth:s.minWidth,minHeight:this._minHeight(),handles:o,start:function(s,n){e(this).addClass("ui-dialog-resizing"),i._blockFrames(),i._trigger("resizeStart",s,t(n))},resize:function(e,s){i._trigger("resize",e,t(s))},stop:function(n,a){var o=i.uiDialog.offset(),r=o.left-i.document.scrollLeft(),h=o.top-i.document.scrollTop();s.height=i.uiDialog.height(),s.width=i.uiDialog.width(),s.position={my:"left top",at:"left"+(r>=0?"+":"")+r+" "+"top"+(h>=0?"+":"")+h,of:i.window},e(this).removeClass("ui-dialog-resizing"),i._unblockFrames(),i._trigger("resizeStop",n,t(a))}}).css("position",a)},_trackFocus:function(){this._on(this.widget(),{focusin:function(t){this._makeFocusTarget(),this._focusedElement=e(t.target)}})},_makeFocusTarget:function(){this._untrackInstance(),this._trackingInstances().unshift(this)},_untrackInstance:function(){var t=this._trackingInstances(),i=e.inArray(this,t);-1!==i&&t.splice(i,1)},_trackingInstances:function(){var e=this.document.data("ui-dialog-instances");return e||(e=[],this.document.data("ui-dialog-instances",e)),e},_minHeight:function(){var e=this.options;return"auto"===e.height?e.minHeight:Math.min(e.minHeight,e.height)},_position:function(){var e=this.uiDialog.is(":visible");e||this.uiDialog.show(),this.uiDialog.position(this.options.position),e||this.uiDialog.hide()},_setOptions:function(t){var i=this,s=!1,n={};e.each(t,function(e,t){i._setOption(e,t),e in i.sizeRelatedOptions&&(s=!0),e in i.resizableRelatedOptions&&(n[e]=t)}),s&&(this._size(),this._position()),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option",n)},_setOption:function(e,t){var i,s,n=this.uiDialog;"dialogClass"===e&&n.removeClass(this.options.dialogClass).addClass(t),"disabled"!==e&&(this._super(e,t),"appendTo"===e&&this.uiDialog.appendTo(this._appendTo()),"buttons"===e&&this._createButtons(),"closeText"===e&&this.uiDialogTitlebarClose.button({label:""+t}),"draggable"===e&&(i=n.is(":data(ui-draggable)"),i&&!t&&n.draggable("destroy"),!i&&t&&this._makeDraggable()),"position"===e&&this._position(),"resizable"===e&&(s=n.is(":data(ui-resizable)"),s&&!t&&n.resizable("destroy"),s&&"string"==typeof t&&n.resizable("option","handles",t),s||t===!1||this._makeResizable()),"title"===e&&this._title(this.uiDialogTitlebar.find(".ui-dialog-title")))},_size:function(){var e,t,i,s=this.options;this.element.show().css({width:"auto",minHeight:0,maxHeight:"none",height:0}),s.minWidth>s.width&&(s.width=s.minWidth),e=this.uiDialog.css({height:"auto",width:s.width}).outerHeight(),t=Math.max(0,s.minHeight-e),i="number"==typeof s.maxHeight?Math.max(0,s.maxHeight-e):"none","auto"===s.height?this.element.css({minHeight:t,maxHeight:i,height:"auto"}):this.element.height(Math.max(0,s.height-e)),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())},_blockFrames:function(){this.iframeBlocks=this.document.find("iframe").map(function(){var t=e(this);return e("<div>").css({position:"absolute",width:t.outerWidth(),height:t.outerHeight()}).appendTo(t.parent()).offset(t.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_allowInteraction:function(t){return e(t.target).closest(".ui-dialog").length?!0:!!e(t.target).closest(".ui-datepicker").length},_createOverlay:function(){if(this.options.modal){var t=!0;this._delay(function(){t=!1}),this.document.data("ui-dialog-overlays")||this._on(this.document,{focusin:function(e){t||this._allowInteraction(e)||(e.preventDefault(),this._trackingInstances()[0]._focusTabbable())}}),this.overlay=e("<div>").addClass("ui-widget-overlay ui-front").appendTo(this._appendTo()),this._on(this.overlay,{mousedown:"_keepFocus"}),this.document.data("ui-dialog-overlays",(this.document.data("ui-dialog-overlays")||0)+1)}},_destroyOverlay:function(){if(this.options.modal&&this.overlay){var e=this.document.data("ui-dialog-overlays")-1;e?this.document.data("ui-dialog-overlays",e):this.document.unbind("focusin").removeData("ui-dialog-overlays"),this.overlay.remove(),this.overlay=null}}}),e.widget("ui.droppable",{version:"1.11.4",widgetEventPrefix:"drop",options:{accept:"*",activeClass:!1,addClasses:!0,greedy:!1,hoverClass:!1,scope:"default",tolerance:"intersect",activate:null,deactivate:null,drop:null,out:null,over:null},_create:function(){var t,i=this.options,s=i.accept;this.isover=!1,this.isout=!0,this.accept=e.isFunction(s)?s:function(e){return e.is(s)},this.proportions=function(){return arguments.length?(t=arguments[0],void 0):t?t:t={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight}},this._addToManager(i.scope),i.addClasses&&this.element.addClass("ui-droppable")},_addToManager:function(t){e.ui.ddmanager.droppables[t]=e.ui.ddmanager.droppables[t]||[],e.ui.ddmanager.droppables[t].push(this)},_splice:function(e){for(var t=0;e.length>t;t++)e[t]===this&&e.splice(t,1)},_destroy:function(){var t=e.ui.ddmanager.droppables[this.options.scope];this._splice(t),this.element.removeClass("ui-droppable ui-droppable-disabled")},_setOption:function(t,i){if("accept"===t)this.accept=e.isFunction(i)?i:function(e){return e.is(i)};else if("scope"===t){var s=e.ui.ddmanager.droppables[this.options.scope];this._splice(s),this._addToManager(i)}this._super(t,i)},_activate:function(t){var i=e.ui.ddmanager.current;this.options.activeClass&&this.element.addClass(this.options.activeClass),i&&this._trigger("activate",t,this.ui(i))},_deactivate:function(t){var i=e.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass),i&&this._trigger("deactivate",t,this.ui(i))},_over:function(t){var i=e.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.addClass(this.options.hoverClass),this._trigger("over",t,this.ui(i)))},_out:function(t){var i=e.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("out",t,this.ui(i)))},_drop:function(t,i){var s=i||e.ui.ddmanager.current,n=!1;return s&&(s.currentItem||s.element)[0]!==this.element[0]?(this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function(){var i=e(this).droppable("instance");return i.options.greedy&&!i.options.disabled&&i.options.scope===s.options.scope&&i.accept.call(i.element[0],s.currentItem||s.element)&&e.ui.intersect(s,e.extend(i,{offset:i.element.offset()}),i.options.tolerance,t)?(n=!0,!1):void 0}),n?!1:this.accept.call(this.element[0],s.currentItem||s.element)?(this.options.activeClass&&this.element.removeClass(this.options.activeClass),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("drop",t,this.ui(s)),this.element):!1):!1},ui:function(e){return{draggable:e.currentItem||e.element,helper:e.helper,position:e.position,offset:e.positionAbs}}}),e.ui.intersect=function(){function e(e,t,i){return e>=t&&t+i>e}return function(t,i,s,n){if(!i.offset)return!1;var a=(t.positionAbs||t.position.absolute).left+t.margins.left,o=(t.positionAbs||t.position.absolute).top+t.margins.top,r=a+t.helperProportions.width,h=o+t.helperProportions.height,l=i.offset.left,u=i.offset.top,d=l+i.proportions().width,c=u+i.proportions().height;switch(s){case"fit":return a>=l&&d>=r&&o>=u&&c>=h;case"intersect":return a+t.helperProportions.width/2>l&&d>r-t.helperProportions.width/2&&o+t.helperProportions.height/2>u&&c>h-t.helperProportions.height/2;case"pointer":return e(n.pageY,u,i.proportions().height)&&e(n.pageX,l,i.proportions().width);case"touch":return(o>=u&&c>=o||h>=u&&c>=h||u>o&&h>c)&&(a>=l&&d>=a||r>=l&&d>=r||l>a&&r>d);default:return!1}}}(),e.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(t,i){var s,n,a=e.ui.ddmanager.droppables[t.options.scope]||[],o=i?i.type:null,r=(t.currentItem||t.element).find(":data(ui-droppable)").addBack();e:for(s=0;a.length>s;s++)if(!(a[s].options.disabled||t&&!a[s].accept.call(a[s].element[0],t.currentItem||t.element))){for(n=0;r.length>n;n++)if(r[n]===a[s].element[0]){a[s].proportions().height=0;continue e}a[s].visible="none"!==a[s].element.css("display"),a[s].visible&&("mousedown"===o&&a[s]._activate.call(a[s],i),a[s].offset=a[s].element.offset(),a[s].proportions({width:a[s].element[0].offsetWidth,height:a[s].element[0].offsetHeight}))}},drop:function(t,i){var s=!1;return e.each((e.ui.ddmanager.droppables[t.options.scope]||[]).slice(),function(){this.options&&(!this.options.disabled&&this.visible&&e.ui.intersect(t,this,this.options.tolerance,i)&&(s=this._drop.call(this,i)||s),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],t.currentItem||t.element)&&(this.isout=!0,this.isover=!1,this._deactivate.call(this,i)))}),s},dragStart:function(t,i){t.element.parentsUntil("body").bind("scroll.droppable",function(){t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,i)})},drag:function(t,i){t.options.refreshPositions&&e.ui.ddmanager.prepareOffsets(t,i),e.each(e.ui.ddmanager.droppables[t.options.scope]||[],function(){if(!this.options.disabled&&!this.greedyChild&&this.visible){var s,n,a,o=e.ui.intersect(t,this,this.options.tolerance,i),r=!o&&this.isover?"isout":o&&!this.isover?"isover":null;r&&(this.options.greedy&&(n=this.options.scope,a=this.element.parents(":data(ui-droppable)").filter(function(){return e(this).droppable("instance").options.scope===n}),a.length&&(s=e(a[0]).droppable("instance"),s.greedyChild="isover"===r)),s&&"isover"===r&&(s.isover=!1,s.isout=!0,s._out.call(s,i)),this[r]=!0,this["isout"===r?"isover":"isout"]=!1,this["isover"===r?"_over":"_out"].call(this,i),s&&"isout"===r&&(s.isout=!1,s.isover=!0,s._over.call(s,i)))}})},dragStop:function(t,i){t.element.parentsUntil("body").unbind("scroll.droppable"),t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,i)}},e.ui.droppable;var y="ui-effects-",b=e;e.effects={effect:{}},function(e,t){function i(e,t,i){var s=d[t.type]||{};return null==e?i||!t.def?null:t.def:(e=s.floor?~~e:parseFloat(e),isNaN(e)?t.def:s.mod?(e+s.mod)%s.mod:0>e?0:e>s.max?s.max:e)}function s(i){var s=l(),n=s._rgba=[];return i=i.toLowerCase(),f(h,function(e,a){var o,r=a.re.exec(i),h=r&&a.parse(r),l=a.space||"rgba";return h?(o=s[l](h),s[u[l].cache]=o[u[l].cache],n=s._rgba=o._rgba,!1):t}),n.length?("0,0,0,0"===n.join()&&e.extend(n,a.transparent),s):a[i]}function n(e,t,i){return i=(i+1)%1,1>6*i?e+6*(t-e)*i:1>2*i?t:2>3*i?e+6*(t-e)*(2/3-i):e}var a,o="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",r=/^([\-+])=\s*(\d+\.?\d*)/,h=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(e){return[e[1],e[2],e[3],e[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(e){return[2.55*e[1],2.55*e[2],2.55*e[3],e[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(e){return[parseInt(e[1],16),parseInt(e[2],16),parseInt(e[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(e){return[parseInt(e[1]+e[1],16),parseInt(e[2]+e[2],16),parseInt(e[3]+e[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(e){return[e[1],e[2]/100,e[3]/100,e[4]]}}],l=e.Color=function(t,i,s,n){return new e.Color.fn.parse(t,i,s,n)},u={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},d={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},c=l.support={},p=e("<p>")[0],f=e.each;p.style.cssText="background-color:rgba(1,1,1,.5)",c.rgba=p.style.backgroundColor.indexOf("rgba")>-1,f(u,function(e,t){t.cache="_"+e,t.props.alpha={idx:3,type:"percent",def:1}}),l.fn=e.extend(l.prototype,{parse:function(n,o,r,h){if(n===t)return this._rgba=[null,null,null,null],this;(n.jquery||n.nodeType)&&(n=e(n).css(o),o=t);var d=this,c=e.type(n),p=this._rgba=[];return o!==t&&(n=[n,o,r,h],c="array"),"string"===c?this.parse(s(n)||a._default):"array"===c?(f(u.rgba.props,function(e,t){p[t.idx]=i(n[t.idx],t)}),this):"object"===c?(n instanceof l?f(u,function(e,t){n[t.cache]&&(d[t.cache]=n[t.cache].slice())}):f(u,function(t,s){var a=s.cache;f(s.props,function(e,t){if(!d[a]&&s.to){if("alpha"===e||null==n[e])return;d[a]=s.to(d._rgba)}d[a][t.idx]=i(n[e],t,!0)}),d[a]&&0>e.inArray(null,d[a].slice(0,3))&&(d[a][3]=1,s.from&&(d._rgba=s.from(d[a])))}),this):t},is:function(e){var i=l(e),s=!0,n=this;return f(u,function(e,a){var o,r=i[a.cache];return r&&(o=n[a.cache]||a.to&&a.to(n._rgba)||[],f(a.props,function(e,i){return null!=r[i.idx]?s=r[i.idx]===o[i.idx]:t})),s}),s},_space:function(){var e=[],t=this;return f(u,function(i,s){t[s.cache]&&e.push(i)}),e.pop()},transition:function(e,t){var s=l(e),n=s._space(),a=u[n],o=0===this.alpha()?l("transparent"):this,r=o[a.cache]||a.to(o._rgba),h=r.slice();return s=s[a.cache],f(a.props,function(e,n){var a=n.idx,o=r[a],l=s[a],u=d[n.type]||{};null!==l&&(null===o?h[a]=l:(u.mod&&(l-o>u.mod/2?o+=u.mod:o-l>u.mod/2&&(o-=u.mod)),h[a]=i((l-o)*t+o,n)))}),this[n](h)},blend:function(t){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),n=l(t)._rgba;return l(e.map(i,function(e,t){return(1-s)*n[t]+s*e}))},toRgbaString:function(){var t="rgba(",i=e.map(this._rgba,function(e,t){return null==e?t>2?1:0:e});return 1===i[3]&&(i.pop(),t="rgb("),t+i.join()+")"},toHslaString:function(){var t="hsla(",i=e.map(this.hsla(),function(e,t){return null==e&&(e=t>2?1:0),t&&3>t&&(e=Math.round(100*e)+"%"),e});return 1===i[3]&&(i.pop(),t="hsl("),t+i.join()+")"},toHexString:function(t){var i=this._rgba.slice(),s=i.pop();return t&&i.push(~~(255*s)),"#"+e.map(i,function(e){return e=(e||0).toString(16),1===e.length?"0"+e:e}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),l.fn.parse.prototype=l.fn,u.hsla.to=function(e){if(null==e[0]||null==e[1]||null==e[2])return[null,null,null,e[3]];var t,i,s=e[0]/255,n=e[1]/255,a=e[2]/255,o=e[3],r=Math.max(s,n,a),h=Math.min(s,n,a),l=r-h,u=r+h,d=.5*u;return t=h===r?0:s===r?60*(n-a)/l+360:n===r?60*(a-s)/l+120:60*(s-n)/l+240,i=0===l?0:.5>=d?l/u:l/(2-u),[Math.round(t)%360,i,d,null==o?1:o]},u.hsla.from=function(e){if(null==e[0]||null==e[1]||null==e[2])return[null,null,null,e[3]];var t=e[0]/360,i=e[1],s=e[2],a=e[3],o=.5>=s?s*(1+i):s+i-s*i,r=2*s-o;return[Math.round(255*n(r,o,t+1/3)),Math.round(255*n(r,o,t)),Math.round(255*n(r,o,t-1/3)),a]},f(u,function(s,n){var a=n.props,o=n.cache,h=n.to,u=n.from;l.fn[s]=function(s){if(h&&!this[o]&&(this[o]=h(this._rgba)),s===t)return this[o].slice();var n,r=e.type(s),d="array"===r||"object"===r?s:arguments,c=this[o].slice();return f(a,function(e,t){var s=d["object"===r?e:t.idx];null==s&&(s=c[t.idx]),c[t.idx]=i(s,t)}),u?(n=l(u(c)),n[o]=c,n):l(c)},f(a,function(t,i){l.fn[t]||(l.fn[t]=function(n){var a,o=e.type(n),h="alpha"===t?this._hsla?"hsla":"rgba":s,l=this[h](),u=l[i.idx];return"undefined"===o?u:("function"===o&&(n=n.call(this,u),o=e.type(n)),null==n&&i.empty?this:("string"===o&&(a=r.exec(n),a&&(n=u+parseFloat(a[2])*("+"===a[1]?1:-1))),l[i.idx]=n,this[h](l)))})})}),l.hook=function(t){var i=t.split(" ");f(i,function(t,i){e.cssHooks[i]={set:function(t,n){var a,o,r="";if("transparent"!==n&&("string"!==e.type(n)||(a=s(n)))){if(n=l(a||n),!c.rgba&&1!==n._rgba[3]){for(o="backgroundColor"===i?t.parentNode:t;(""===r||"transparent"===r)&&o&&o.style;)try{r=e.css(o,"backgroundColor"),o=o.parentNode}catch(h){}n=n.blend(r&&"transparent"!==r?r:"_default")}n=n.toRgbaString()}try{t.style[i]=n}catch(h){}}},e.fx.step[i]=function(t){t.colorInit||(t.start=l(t.elem,i),t.end=l(t.end),t.colorInit=!0),e.cssHooks[i].set(t.elem,t.start.transition(t.end,t.pos))}})},l.hook(o),e.cssHooks.borderColor={expand:function(e){var t={};return f(["Top","Right","Bottom","Left"],function(i,s){t["border"+s+"Color"]=e}),t}},a=e.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(b),function(){function t(t){var i,s,n=t.ownerDocument.defaultView?t.ownerDocument.defaultView.getComputedStyle(t,null):t.currentStyle,a={};if(n&&n.length&&n[0]&&n[n[0]])for(s=n.length;s--;)i=n[s],"string"==typeof n[i]&&(a[e.camelCase(i)]=n[i]);else for(i in n)"string"==typeof n[i]&&(a[i]=n[i]);return a}function i(t,i){var s,a,o={};for(s in i)a=i[s],t[s]!==a&&(n[s]||(e.fx.step[s]||!isNaN(parseFloat(a)))&&(o[s]=a));return o}var s=["add","remove","toggle"],n={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};e.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(t,i){e.fx.step[i]=function(e){("none"!==e.end&&!e.setAttr||1===e.pos&&!e.setAttr)&&(b.style(e.elem,i,e.end),e.setAttr=!0)}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e.effects.animateClass=function(n,a,o,r){var h=e.speed(a,o,r);return this.queue(function(){var a,o=e(this),r=o.attr("class")||"",l=h.children?o.find("*").addBack():o;l=l.map(function(){var i=e(this);return{el:i,start:t(this)}}),a=function(){e.each(s,function(e,t){n[t]&&o[t+"Class"](n[t])})},a(),l=l.map(function(){return this.end=t(this.el[0]),this.diff=i(this.start,this.end),this}),o.attr("class",r),l=l.map(function(){var t=this,i=e.Deferred(),s=e.extend({},h,{queue:!1,complete:function(){i.resolve(t)}});return this.el.animate(this.diff,s),i.promise()}),e.when.apply(e,l.get()).done(function(){a(),e.each(arguments,function(){var t=this.el;e.each(this.diff,function(e){t.css(e,"")})}),h.complete.call(o[0])})})},e.fn.extend({addClass:function(t){return function(i,s,n,a){return s?e.effects.animateClass.call(this,{add:i},s,n,a):t.apply(this,arguments)}}(e.fn.addClass),removeClass:function(t){return function(i,s,n,a){return arguments.length>1?e.effects.animateClass.call(this,{remove:i},s,n,a):t.apply(this,arguments)}}(e.fn.removeClass),toggleClass:function(t){return function(i,s,n,a,o){return"boolean"==typeof s||void 0===s?n?e.effects.animateClass.call(this,s?{add:i}:{remove:i},n,a,o):t.apply(this,arguments):e.effects.animateClass.call(this,{toggle:i},s,n,a)}}(e.fn.toggleClass),switchClass:function(t,i,s,n,a){return e.effects.animateClass.call(this,{add:i,remove:t},s,n,a)}})}(),function(){function t(t,i,s,n){return e.isPlainObject(t)&&(i=t,t=t.effect),t={effect:t},null==i&&(i={}),e.isFunction(i)&&(n=i,s=null,i={}),("number"==typeof i||e.fx.speeds[i])&&(n=s,s=i,i={}),e.isFunction(s)&&(n=s,s=null),i&&e.extend(t,i),s=s||i.duration,t.duration=e.fx.off?0:"number"==typeof s?s:s in e.fx.speeds?e.fx.speeds[s]:e.fx.speeds._default,t.complete=n||i.complete,t}function i(t){return!t||"number"==typeof t||e.fx.speeds[t]?!0:"string"!=typeof t||e.effects.effect[t]?e.isFunction(t)?!0:"object"!=typeof t||t.effect?!1:!0:!0}e.extend(e.effects,{version:"1.11.4",save:function(e,t){for(var i=0;t.length>i;i++)null!==t[i]&&e.data(y+t[i],e[0].style[t[i]])},restore:function(e,t){var i,s;for(s=0;t.length>s;s++)null!==t[s]&&(i=e.data(y+t[s]),void 0===i&&(i=""),e.css(t[s],i))},setMode:function(e,t){return"toggle"===t&&(t=e.is(":hidden")?"show":"hide"),t},getBaseline:function(e,t){var i,s;switch(e[0]){case"top":i=0;break;case"middle":i=.5;break;case"bottom":i=1;break;default:i=e[0]/t.height}switch(e[1]){case"left":s=0;break;case"center":s=.5;break;case"right":s=1;break;default:s=e[1]/t.width}return{x:s,y:i}},createWrapper:function(t){if(t.parent().is(".ui-effects-wrapper"))return t.parent();var i={width:t.outerWidth(!0),height:t.outerHeight(!0),"float":t.css("float")},s=e("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),n={width:t.width(),height:t.height()},a=document.activeElement;try{a.id}catch(o){a=document.body}return t.wrap(s),(t[0]===a||e.contains(t[0],a))&&e(a).focus(),s=t.parent(),"static"===t.css("position")?(s.css({position:"relative"}),t.css({position:"relative"})):(e.extend(i,{position:t.css("position"),zIndex:t.css("z-index")}),e.each(["top","left","bottom","right"],function(e,s){i[s]=t.css(s),isNaN(parseInt(i[s],10))&&(i[s]="auto")}),t.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),t.css(n),s.css(i).show()},removeWrapper:function(t){var i=document.activeElement;return t.parent().is(".ui-effects-wrapper")&&(t.parent().replaceWith(t),(t[0]===i||e.contains(t[0],i))&&e(i).focus()),t},setTransition:function(t,i,s,n){return n=n||{},e.each(i,function(e,i){var a=t.cssUnit(i);a[0]>0&&(n[i]=a[0]*s+a[1])}),n}}),e.fn.extend({effect:function(){function i(t){function i(){e.isFunction(a)&&a.call(n[0]),e.isFunction(t)&&t()}var n=e(this),a=s.complete,r=s.mode;(n.is(":hidden")?"hide"===r:"show"===r)?(n[r](),i()):o.call(n[0],s,i)}var s=t.apply(this,arguments),n=s.mode,a=s.queue,o=e.effects.effect[s.effect];return e.fx.off||!o?n?this[n](s.duration,s.complete):this.each(function(){s.complete&&s.complete.call(this)}):a===!1?this.each(i):this.queue(a||"fx",i)},show:function(e){return function(s){if(i(s))return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="show",this.effect.call(this,n)}}(e.fn.show),hide:function(e){return function(s){if(i(s))return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="hide",this.effect.call(this,n)}}(e.fn.hide),toggle:function(e){return function(s){if(i(s)||"boolean"==typeof s)return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="toggle",this.effect.call(this,n)}}(e.fn.toggle),cssUnit:function(t){var i=this.css(t),s=[];return e.each(["em","px","%","pt"],function(e,t){i.indexOf(t)>0&&(s=[parseFloat(i),t])}),s}})}(),function(){var t={};e.each(["Quad","Cubic","Quart","Quint","Expo"],function(e,i){t[i]=function(t){return Math.pow(t,e+2)}}),e.extend(t,{Sine:function(e){return 1-Math.cos(e*Math.PI/2)},Circ:function(e){return 1-Math.sqrt(1-e*e)},Elastic:function(e){return 0===e||1===e?e:-Math.pow(2,8*(e-1))*Math.sin((80*(e-1)-7.5)*Math.PI/15)},Back:function(e){return e*e*(3*e-2)},Bounce:function(e){for(var t,i=4;((t=Math.pow(2,--i))-1)/11>e;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*t-2)/22-e,2)}}),e.each(t,function(t,i){e.easing["easeIn"+t]=i,e.easing["easeOut"+t]=function(e){return 1-i(1-e)},e.easing["easeInOut"+t]=function(e){return.5>e?i(2*e)/2:1-i(-2*e+2)/2}})}(),e.effects,e.effects.effect.blind=function(t,i){var s,n,a,o=e(this),r=/up|down|vertical/,h=/up|left|vertical|horizontal/,l=["position","top","bottom","left","right","height","width"],u=e.effects.setMode(o,t.mode||"hide"),d=t.direction||"up",c=r.test(d),p=c?"height":"width",f=c?"top":"left",m=h.test(d),g={},v="show"===u;o.parent().is(".ui-effects-wrapper")?e.effects.save(o.parent(),l):e.effects.save(o,l),o.show(),s=e.effects.createWrapper(o).css({overflow:"hidden"}),n=s[p](),a=parseFloat(s.css(f))||0,g[p]=v?n:0,m||(o.css(c?"bottom":"right",0).css(c?"top":"left","auto").css({position:"absolute"}),g[f]=v?a:n+a),v&&(s.css(p,0),m||s.css(f,a+n)),s.animate(g,{duration:t.duration,easing:t.easing,queue:!1,complete:function(){"hide"===u&&o.hide(),e.effects.restore(o,l),e.effects.removeWrapper(o),i()}})},e.effects.effect.bounce=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","height","width"],h=e.effects.setMode(o,t.mode||"effect"),l="hide"===h,u="show"===h,d=t.direction||"up",c=t.distance,p=t.times||5,f=2*p+(u||l?1:0),m=t.duration/f,g=t.easing,v="up"===d||"down"===d?"top":"left",y="up"===d||"left"===d,b=o.queue(),_=b.length;for((u||l)&&r.push("opacity"),e.effects.save(o,r),o.show(),e.effects.createWrapper(o),c||(c=o["top"===v?"outerHeight":"outerWidth"]()/3),u&&(a={opacity:1},a[v]=0,o.css("opacity",0).css(v,y?2*-c:2*c).animate(a,m,g)),l&&(c/=Math.pow(2,p-1)),a={},a[v]=0,s=0;p>s;s++)n={},n[v]=(y?"-=":"+=")+c,o.animate(n,m,g).animate(a,m,g),c=l?2*c:c/2;l&&(n={opacity:0},n[v]=(y?"-=":"+=")+c,o.animate(n,m,g)),o.queue(function(){l&&o.hide(),e.effects.restore(o,r),e.effects.removeWrapper(o),i()}),_>1&&b.splice.apply(b,[1,0].concat(b.splice(_,f+1))),o.dequeue()},e.effects.effect.clip=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","height","width"],h=e.effects.setMode(o,t.mode||"hide"),l="show"===h,u=t.direction||"vertical",d="vertical"===u,c=d?"height":"width",p=d?"top":"left",f={};e.effects.save(o,r),o.show(),s=e.effects.createWrapper(o).css({overflow:"hidden"}),n="IMG"===o[0].tagName?s:o,a=n[c](),l&&(n.css(c,0),n.css(p,a/2)),f[c]=l?a:0,f[p]=l?0:a/2,n.animate(f,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){l||o.hide(),e.effects.restore(o,r),e.effects.removeWrapper(o),i()}})},e.effects.effect.drop=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","opacity","height","width"],o=e.effects.setMode(n,t.mode||"hide"),r="show"===o,h=t.direction||"left",l="up"===h||"down"===h?"top":"left",u="up"===h||"left"===h?"pos":"neg",d={opacity:r?1:0};e.effects.save(n,a),n.show(),e.effects.createWrapper(n),s=t.distance||n["top"===l?"outerHeight":"outerWidth"](!0)/2,r&&n.css("opacity",0).css(l,"pos"===u?-s:s),d[l]=(r?"pos"===u?"+=":"-=":"pos"===u?"-=":"+=")+s,n.animate(d,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}})},e.effects.effect.explode=function(t,i){function s(){b.push(this),b.length===d*c&&n()}function n(){p.css({visibility:"visible"}),e(b).remove(),m||p.hide(),i()}var a,o,r,h,l,u,d=t.pieces?Math.round(Math.sqrt(t.pieces)):3,c=d,p=e(this),f=e.effects.setMode(p,t.mode||"hide"),m="show"===f,g=p.show().css("visibility","hidden").offset(),v=Math.ceil(p.outerWidth()/c),y=Math.ceil(p.outerHeight()/d),b=[];for(a=0;d>a;a++)for(h=g.top+a*y,u=a-(d-1)/2,o=0;c>o;o++)r=g.left+o*v,l=o-(c-1)/2,p.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-o*v,top:-a*y}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:v,height:y,left:r+(m?l*v:0),top:h+(m?u*y:0),opacity:m?0:1}).animate({left:r+(m?0:l*v),top:h+(m?0:u*y),opacity:m?1:0},t.duration||500,t.easing,s)},e.effects.effect.fade=function(t,i){var s=e(this),n=e.effects.setMode(s,t.mode||"toggle");s.animate({opacity:n},{queue:!1,duration:t.duration,easing:t.easing,complete:i})},e.effects.effect.fold=function(t,i){var s,n,a=e(this),o=["position","top","bottom","left","right","height","width"],r=e.effects.setMode(a,t.mode||"hide"),h="show"===r,l="hide"===r,u=t.size||15,d=/([0-9]+)%/.exec(u),c=!!t.horizFirst,p=h!==c,f=p?["width","height"]:["height","width"],m=t.duration/2,g={},v={};e.effects.save(a,o),a.show(),s=e.effects.createWrapper(a).css({overflow:"hidden"}),n=p?[s.width(),s.height()]:[s.height(),s.width()],d&&(u=parseInt(d[1],10)/100*n[l?0:1]),h&&s.css(c?{height:0,width:u}:{height:u,width:0}),g[f[0]]=h?n[0]:u,v[f[1]]=h?n[1]:0,s.animate(g,m,t.easing).animate(v,m,t.easing,function(){l&&a.hide(),e.effects.restore(a,o),e.effects.removeWrapper(a),i()})},e.effects.effect.highlight=function(t,i){var s=e(this),n=["backgroundImage","backgroundColor","opacity"],a=e.effects.setMode(s,t.mode||"show"),o={backgroundColor:s.css("backgroundColor")};"hide"===a&&(o.opacity=0),e.effects.save(s,n),s.show().css({backgroundImage:"none",backgroundColor:t.color||"#ffff99"}).animate(o,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===a&&s.hide(),e.effects.restore(s,n),i()}})},e.effects.effect.size=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","width","height","overflow","opacity"],h=["position","top","bottom","left","right","overflow","opacity"],l=["width","height","overflow"],u=["fontSize"],d=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],c=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],p=e.effects.setMode(o,t.mode||"effect"),f=t.restore||"effect"!==p,m=t.scale||"both",g=t.origin||["middle","center"],v=o.css("position"),y=f?r:h,b={height:0,width:0,outerHeight:0,outerWidth:0};"show"===p&&o.show(),s={height:o.height(),width:o.width(),outerHeight:o.outerHeight(),outerWidth:o.outerWidth()},"toggle"===t.mode&&"show"===p?(o.from=t.to||b,o.to=t.from||s):(o.from=t.from||("show"===p?b:s),o.to=t.to||("hide"===p?b:s)),a={from:{y:o.from.height/s.height,x:o.from.width/s.width},to:{y:o.to.height/s.height,x:o.to.width/s.width}},("box"===m||"both"===m)&&(a.from.y!==a.to.y&&(y=y.concat(d),o.from=e.effects.setTransition(o,d,a.from.y,o.from),o.to=e.effects.setTransition(o,d,a.to.y,o.to)),a.from.x!==a.to.x&&(y=y.concat(c),o.from=e.effects.setTransition(o,c,a.from.x,o.from),o.to=e.effects.setTransition(o,c,a.to.x,o.to))),("content"===m||"both"===m)&&a.from.y!==a.to.y&&(y=y.concat(u).concat(l),o.from=e.effects.setTransition(o,u,a.from.y,o.from),o.to=e.effects.setTransition(o,u,a.to.y,o.to)),e.effects.save(o,y),o.show(),e.effects.createWrapper(o),o.css("overflow","hidden").css(o.from),g&&(n=e.effects.getBaseline(g,s),o.from.top=(s.outerHeight-o.outerHeight())*n.y,o.from.left=(s.outerWidth-o.outerWidth())*n.x,o.to.top=(s.outerHeight-o.to.outerHeight)*n.y,o.to.left=(s.outerWidth-o.to.outerWidth)*n.x),o.css(o.from),("content"===m||"both"===m)&&(d=d.concat(["marginTop","marginBottom"]).concat(u),c=c.concat(["marginLeft","marginRight"]),l=r.concat(d).concat(c),o.find("*[width]").each(function(){var i=e(this),s={height:i.height(),width:i.width(),outerHeight:i.outerHeight(),outerWidth:i.outerWidth()};
f&&e.effects.save(i,l),i.from={height:s.height*a.from.y,width:s.width*a.from.x,outerHeight:s.outerHeight*a.from.y,outerWidth:s.outerWidth*a.from.x},i.to={height:s.height*a.to.y,width:s.width*a.to.x,outerHeight:s.height*a.to.y,outerWidth:s.width*a.to.x},a.from.y!==a.to.y&&(i.from=e.effects.setTransition(i,d,a.from.y,i.from),i.to=e.effects.setTransition(i,d,a.to.y,i.to)),a.from.x!==a.to.x&&(i.from=e.effects.setTransition(i,c,a.from.x,i.from),i.to=e.effects.setTransition(i,c,a.to.x,i.to)),i.css(i.from),i.animate(i.to,t.duration,t.easing,function(){f&&e.effects.restore(i,l)})})),o.animate(o.to,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){0===o.to.opacity&&o.css("opacity",o.from.opacity),"hide"===p&&o.hide(),e.effects.restore(o,y),f||("static"===v?o.css({position:"relative",top:o.to.top,left:o.to.left}):e.each(["top","left"],function(e,t){o.css(t,function(t,i){var s=parseInt(i,10),n=e?o.to.left:o.to.top;return"auto"===i?n+"px":s+n+"px"})})),e.effects.removeWrapper(o),i()}})},e.effects.effect.scale=function(t,i){var s=e(this),n=e.extend(!0,{},t),a=e.effects.setMode(s,t.mode||"effect"),o=parseInt(t.percent,10)||(0===parseInt(t.percent,10)?0:"hide"===a?0:100),r=t.direction||"both",h=t.origin,l={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()},u={y:"horizontal"!==r?o/100:1,x:"vertical"!==r?o/100:1};n.effect="size",n.queue=!1,n.complete=i,"effect"!==a&&(n.origin=h||["middle","center"],n.restore=!0),n.from=t.from||("show"===a?{height:0,width:0,outerHeight:0,outerWidth:0}:l),n.to={height:l.height*u.y,width:l.width*u.x,outerHeight:l.outerHeight*u.y,outerWidth:l.outerWidth*u.x},n.fade&&("show"===a&&(n.from.opacity=0,n.to.opacity=1),"hide"===a&&(n.from.opacity=1,n.to.opacity=0)),s.effect(n)},e.effects.effect.puff=function(t,i){var s=e(this),n=e.effects.setMode(s,t.mode||"hide"),a="hide"===n,o=parseInt(t.percent,10)||150,r=o/100,h={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()};e.extend(t,{effect:"scale",queue:!1,fade:!0,mode:n,complete:i,percent:a?o:100,from:a?h:{height:h.height*r,width:h.width*r,outerHeight:h.outerHeight*r,outerWidth:h.outerWidth*r}}),s.effect(t)},e.effects.effect.pulsate=function(t,i){var s,n=e(this),a=e.effects.setMode(n,t.mode||"show"),o="show"===a,r="hide"===a,h=o||"hide"===a,l=2*(t.times||5)+(h?1:0),u=t.duration/l,d=0,c=n.queue(),p=c.length;for((o||!n.is(":visible"))&&(n.css("opacity",0).show(),d=1),s=1;l>s;s++)n.animate({opacity:d},u,t.easing),d=1-d;n.animate({opacity:d},u,t.easing),n.queue(function(){r&&n.hide(),i()}),p>1&&c.splice.apply(c,[1,0].concat(c.splice(p,l+1))),n.dequeue()},e.effects.effect.shake=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","height","width"],o=e.effects.setMode(n,t.mode||"effect"),r=t.direction||"left",h=t.distance||20,l=t.times||3,u=2*l+1,d=Math.round(t.duration/u),c="up"===r||"down"===r?"top":"left",p="up"===r||"left"===r,f={},m={},g={},v=n.queue(),y=v.length;for(e.effects.save(n,a),n.show(),e.effects.createWrapper(n),f[c]=(p?"-=":"+=")+h,m[c]=(p?"+=":"-=")+2*h,g[c]=(p?"-=":"+=")+2*h,n.animate(f,d,t.easing),s=1;l>s;s++)n.animate(m,d,t.easing).animate(g,d,t.easing);n.animate(m,d,t.easing).animate(f,d/2,t.easing).queue(function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}),y>1&&v.splice.apply(v,[1,0].concat(v.splice(y,u+1))),n.dequeue()},e.effects.effect.slide=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","width","height"],o=e.effects.setMode(n,t.mode||"show"),r="show"===o,h=t.direction||"left",l="up"===h||"down"===h?"top":"left",u="up"===h||"left"===h,d={};e.effects.save(n,a),n.show(),s=t.distance||n["top"===l?"outerHeight":"outerWidth"](!0),e.effects.createWrapper(n).css({overflow:"hidden"}),r&&n.css(l,u?isNaN(s)?"-"+s:-s:s),d[l]=(r?u?"+=":"-=":u?"-=":"+=")+s,n.animate(d,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}})},e.effects.effect.transfer=function(t,i){var s=e(this),n=e(t.to),a="fixed"===n.css("position"),o=e("body"),r=a?o.scrollTop():0,h=a?o.scrollLeft():0,l=n.offset(),u={top:l.top-r,left:l.left-h,height:n.innerHeight(),width:n.innerWidth()},d=s.offset(),c=e("<div class='ui-effects-transfer'></div>").appendTo(document.body).addClass(t.className).css({top:d.top-r,left:d.left-h,height:s.innerHeight(),width:s.innerWidth(),position:a?"fixed":"absolute"}).animate(u,t.duration,t.easing,function(){c.remove(),i()})},e.widget("ui.progressbar",{version:"1.11.4",options:{max:100,value:0,change:null,complete:null},min:0,_create:function(){this.oldValue=this.options.value=this._constrainedValue(),this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min}),this.valueDiv=e("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element),this._refreshValue()},_destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.valueDiv.remove()},value:function(e){return void 0===e?this.options.value:(this.options.value=this._constrainedValue(e),this._refreshValue(),void 0)},_constrainedValue:function(e){return void 0===e&&(e=this.options.value),this.indeterminate=e===!1,"number"!=typeof e&&(e=0),this.indeterminate?!1:Math.min(this.options.max,Math.max(this.min,e))},_setOptions:function(e){var t=e.value;delete e.value,this._super(e),this.options.value=this._constrainedValue(t),this._refreshValue()},_setOption:function(e,t){"max"===e&&(t=Math.max(this.min,t)),"disabled"===e&&this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this._super(e,t)},_percentage:function(){return this.indeterminate?100:100*(this.options.value-this.min)/(this.options.max-this.min)},_refreshValue:function(){var t=this.options.value,i=this._percentage();this.valueDiv.toggle(this.indeterminate||t>this.min).toggleClass("ui-corner-right",t===this.options.max).width(i.toFixed(0)+"%"),this.element.toggleClass("ui-progressbar-indeterminate",this.indeterminate),this.indeterminate?(this.element.removeAttr("aria-valuenow"),this.overlayDiv||(this.overlayDiv=e("<div class='ui-progressbar-overlay'></div>").appendTo(this.valueDiv))):(this.element.attr({"aria-valuemax":this.options.max,"aria-valuenow":t}),this.overlayDiv&&(this.overlayDiv.remove(),this.overlayDiv=null)),this.oldValue!==t&&(this.oldValue=t,this._trigger("change")),t===this.options.max&&this._trigger("complete")}}),e.widget("ui.selectable",e.ui.mouse,{version:"1.11.4",options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch",selected:null,selecting:null,start:null,stop:null,unselected:null,unselecting:null},_create:function(){var t,i=this;this.element.addClass("ui-selectable"),this.dragged=!1,this.refresh=function(){t=e(i.options.filter,i.element[0]),t.addClass("ui-selectee"),t.each(function(){var t=e(this),i=t.offset();e.data(this,"selectable-item",{element:this,$element:t,left:i.left,top:i.top,right:i.left+t.outerWidth(),bottom:i.top+t.outerHeight(),startselected:!1,selected:t.hasClass("ui-selected"),selecting:t.hasClass("ui-selecting"),unselecting:t.hasClass("ui-unselecting")})})},this.refresh(),this.selectees=t.addClass("ui-selectee"),this._mouseInit(),this.helper=e("<div class='ui-selectable-helper'></div>")},_destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item"),this.element.removeClass("ui-selectable ui-selectable-disabled"),this._mouseDestroy()},_mouseStart:function(t){var i=this,s=this.options;this.opos=[t.pageX,t.pageY],this.options.disabled||(this.selectees=e(s.filter,this.element[0]),this._trigger("start",t),e(s.appendTo).append(this.helper),this.helper.css({left:t.pageX,top:t.pageY,width:0,height:0}),s.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var s=e.data(this,"selectable-item");s.startselected=!0,t.metaKey||t.ctrlKey||(s.$element.removeClass("ui-selected"),s.selected=!1,s.$element.addClass("ui-unselecting"),s.unselecting=!0,i._trigger("unselecting",t,{unselecting:s.element}))}),e(t.target).parents().addBack().each(function(){var s,n=e.data(this,"selectable-item");return n?(s=!t.metaKey&&!t.ctrlKey||!n.$element.hasClass("ui-selected"),n.$element.removeClass(s?"ui-unselecting":"ui-selected").addClass(s?"ui-selecting":"ui-unselecting"),n.unselecting=!s,n.selecting=s,n.selected=s,s?i._trigger("selecting",t,{selecting:n.element}):i._trigger("unselecting",t,{unselecting:n.element}),!1):void 0}))},_mouseDrag:function(t){if(this.dragged=!0,!this.options.disabled){var i,s=this,n=this.options,a=this.opos[0],o=this.opos[1],r=t.pageX,h=t.pageY;return a>r&&(i=r,r=a,a=i),o>h&&(i=h,h=o,o=i),this.helper.css({left:a,top:o,width:r-a,height:h-o}),this.selectees.each(function(){var i=e.data(this,"selectable-item"),l=!1;i&&i.element!==s.element[0]&&("touch"===n.tolerance?l=!(i.left>r||a>i.right||i.top>h||o>i.bottom):"fit"===n.tolerance&&(l=i.left>a&&r>i.right&&i.top>o&&h>i.bottom),l?(i.selected&&(i.$element.removeClass("ui-selected"),i.selected=!1),i.unselecting&&(i.$element.removeClass("ui-unselecting"),i.unselecting=!1),i.selecting||(i.$element.addClass("ui-selecting"),i.selecting=!0,s._trigger("selecting",t,{selecting:i.element}))):(i.selecting&&((t.metaKey||t.ctrlKey)&&i.startselected?(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.$element.addClass("ui-selected"),i.selected=!0):(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.startselected&&(i.$element.addClass("ui-unselecting"),i.unselecting=!0),s._trigger("unselecting",t,{unselecting:i.element}))),i.selected&&(t.metaKey||t.ctrlKey||i.startselected||(i.$element.removeClass("ui-selected"),i.selected=!1,i.$element.addClass("ui-unselecting"),i.unselecting=!0,s._trigger("unselecting",t,{unselecting:i.element})))))}),!1}},_mouseStop:function(t){var i=this;return this.dragged=!1,e(".ui-unselecting",this.element[0]).each(function(){var s=e.data(this,"selectable-item");s.$element.removeClass("ui-unselecting"),s.unselecting=!1,s.startselected=!1,i._trigger("unselected",t,{unselected:s.element})}),e(".ui-selecting",this.element[0]).each(function(){var s=e.data(this,"selectable-item");s.$element.removeClass("ui-selecting").addClass("ui-selected"),s.selecting=!1,s.selected=!0,s.startselected=!0,i._trigger("selected",t,{selected:s.element})}),this._trigger("stop",t),this.helper.remove(),!1}}),e.widget("ui.selectmenu",{version:"1.11.4",defaultElement:"<select>",options:{appendTo:null,disabled:null,icons:{button:"ui-icon-triangle-1-s"},position:{my:"left top",at:"left bottom",collision:"none"},width:null,change:null,close:null,focus:null,open:null,select:null},_create:function(){var e=this.element.uniqueId().attr("id");this.ids={element:e,button:e+"-button",menu:e+"-menu"},this._drawButton(),this._drawMenu(),this.options.disabled&&this.disable()},_drawButton:function(){var t=this;this.label=e("label[for='"+this.ids.element+"']").attr("for",this.ids.button),this._on(this.label,{click:function(e){this.button.focus(),e.preventDefault()}}),this.element.hide(),this.button=e("<span>",{"class":"ui-selectmenu-button ui-widget ui-state-default ui-corner-all",tabindex:this.options.disabled?-1:0,id:this.ids.button,role:"combobox","aria-expanded":"false","aria-autocomplete":"list","aria-owns":this.ids.menu,"aria-haspopup":"true"}).insertAfter(this.element),e("<span>",{"class":"ui-icon "+this.options.icons.button}).prependTo(this.button),this.buttonText=e("<span>",{"class":"ui-selectmenu-text"}).appendTo(this.button),this._setText(this.buttonText,this.element.find("option:selected").text()),this._resizeButton(),this._on(this.button,this._buttonEvents),this.button.one("focusin",function(){t.menuItems||t._refreshMenu()}),this._hoverable(this.button),this._focusable(this.button)},_drawMenu:function(){var t=this;this.menu=e("<ul>",{"aria-hidden":"true","aria-labelledby":this.ids.button,id:this.ids.menu}),this.menuWrap=e("<div>",{"class":"ui-selectmenu-menu ui-front"}).append(this.menu).appendTo(this._appendTo()),this.menuInstance=this.menu.menu({role:"listbox",select:function(e,i){e.preventDefault(),t._setSelection(),t._select(i.item.data("ui-selectmenu-item"),e)},focus:function(e,i){var s=i.item.data("ui-selectmenu-item");null!=t.focusIndex&&s.index!==t.focusIndex&&(t._trigger("focus",e,{item:s}),t.isOpen||t._select(s,e)),t.focusIndex=s.index,t.button.attr("aria-activedescendant",t.menuItems.eq(s.index).attr("id"))}}).menu("instance"),this.menu.addClass("ui-corner-bottom").removeClass("ui-corner-all"),this.menuInstance._off(this.menu,"mouseleave"),this.menuInstance._closeOnDocumentClick=function(){return!1},this.menuInstance._isDivider=function(){return!1}},refresh:function(){this._refreshMenu(),this._setText(this.buttonText,this._getSelectedItem().text()),this.options.width||this._resizeButton()},_refreshMenu:function(){this.menu.empty();var e,t=this.element.find("option");t.length&&(this._parseOptions(t),this._renderMenu(this.menu,this.items),this.menuInstance.refresh(),this.menuItems=this.menu.find("li").not(".ui-selectmenu-optgroup"),e=this._getSelectedItem(),this.menuInstance.focus(null,e),this._setAria(e.data("ui-selectmenu-item")),this._setOption("disabled",this.element.prop("disabled")))},open:function(e){this.options.disabled||(this.menuItems?(this.menu.find(".ui-state-focus").removeClass("ui-state-focus"),this.menuInstance.focus(null,this._getSelectedItem())):this._refreshMenu(),this.isOpen=!0,this._toggleAttr(),this._resizeMenu(),this._position(),this._on(this.document,this._documentClick),this._trigger("open",e))},_position:function(){this.menuWrap.position(e.extend({of:this.button},this.options.position))},close:function(e){this.isOpen&&(this.isOpen=!1,this._toggleAttr(),this.range=null,this._off(this.document),this._trigger("close",e))},widget:function(){return this.button},menuWidget:function(){return this.menu},_renderMenu:function(t,i){var s=this,n="";e.each(i,function(i,a){a.optgroup!==n&&(e("<li>",{"class":"ui-selectmenu-optgroup ui-menu-divider"+(a.element.parent("optgroup").prop("disabled")?" ui-state-disabled":""),text:a.optgroup}).appendTo(t),n=a.optgroup),s._renderItemData(t,a)})},_renderItemData:function(e,t){return this._renderItem(e,t).data("ui-selectmenu-item",t)},_renderItem:function(t,i){var s=e("<li>");return i.disabled&&s.addClass("ui-state-disabled"),this._setText(s,i.label),s.appendTo(t)},_setText:function(e,t){t?e.text(t):e.html("&#160;")},_move:function(e,t){var i,s,n=".ui-menu-item";this.isOpen?i=this.menuItems.eq(this.focusIndex):(i=this.menuItems.eq(this.element[0].selectedIndex),n+=":not(.ui-state-disabled)"),s="first"===e||"last"===e?i["first"===e?"prevAll":"nextAll"](n).eq(-1):i[e+"All"](n).eq(0),s.length&&this.menuInstance.focus(t,s)},_getSelectedItem:function(){return this.menuItems.eq(this.element[0].selectedIndex)},_toggle:function(e){this[this.isOpen?"close":"open"](e)},_setSelection:function(){var e;this.range&&(window.getSelection?(e=window.getSelection(),e.removeAllRanges(),e.addRange(this.range)):this.range.select(),this.button.focus())},_documentClick:{mousedown:function(t){this.isOpen&&(e(t.target).closest(".ui-selectmenu-menu, #"+this.ids.button).length||this.close(t))}},_buttonEvents:{mousedown:function(){var e;window.getSelection?(e=window.getSelection(),e.rangeCount&&(this.range=e.getRangeAt(0))):this.range=document.selection.createRange()},click:function(e){this._setSelection(),this._toggle(e)},keydown:function(t){var i=!0;switch(t.keyCode){case e.ui.keyCode.TAB:case e.ui.keyCode.ESCAPE:this.close(t),i=!1;break;case e.ui.keyCode.ENTER:this.isOpen&&this._selectFocusedItem(t);break;case e.ui.keyCode.UP:t.altKey?this._toggle(t):this._move("prev",t);break;case e.ui.keyCode.DOWN:t.altKey?this._toggle(t):this._move("next",t);break;case e.ui.keyCode.SPACE:this.isOpen?this._selectFocusedItem(t):this._toggle(t);break;case e.ui.keyCode.LEFT:this._move("prev",t);break;case e.ui.keyCode.RIGHT:this._move("next",t);break;case e.ui.keyCode.HOME:case e.ui.keyCode.PAGE_UP:this._move("first",t);break;case e.ui.keyCode.END:case e.ui.keyCode.PAGE_DOWN:this._move("last",t);break;default:this.menu.trigger(t),i=!1}i&&t.preventDefault()}},_selectFocusedItem:function(e){var t=this.menuItems.eq(this.focusIndex);t.hasClass("ui-state-disabled")||this._select(t.data("ui-selectmenu-item"),e)},_select:function(e,t){var i=this.element[0].selectedIndex;this.element[0].selectedIndex=e.index,this._setText(this.buttonText,e.label),this._setAria(e),this._trigger("select",t,{item:e}),e.index!==i&&this._trigger("change",t,{item:e}),this.close(t)},_setAria:function(e){var t=this.menuItems.eq(e.index).attr("id");this.button.attr({"aria-labelledby":t,"aria-activedescendant":t}),this.menu.attr("aria-activedescendant",t)},_setOption:function(e,t){"icons"===e&&this.button.find("span.ui-icon").removeClass(this.options.icons.button).addClass(t.button),this._super(e,t),"appendTo"===e&&this.menuWrap.appendTo(this._appendTo()),"disabled"===e&&(this.menuInstance.option("disabled",t),this.button.toggleClass("ui-state-disabled",t).attr("aria-disabled",t),this.element.prop("disabled",t),t?(this.button.attr("tabindex",-1),this.close()):this.button.attr("tabindex",0)),"width"===e&&this._resizeButton()},_appendTo:function(){var t=this.options.appendTo;return t&&(t=t.jquery||t.nodeType?e(t):this.document.find(t).eq(0)),t&&t[0]||(t=this.element.closest(".ui-front")),t.length||(t=this.document[0].body),t},_toggleAttr:function(){this.button.toggleClass("ui-corner-top",this.isOpen).toggleClass("ui-corner-all",!this.isOpen).attr("aria-expanded",this.isOpen),this.menuWrap.toggleClass("ui-selectmenu-open",this.isOpen),this.menu.attr("aria-hidden",!this.isOpen)},_resizeButton:function(){var e=this.options.width;e||(e=this.element.show().outerWidth(),this.element.hide()),this.button.outerWidth(e)},_resizeMenu:function(){this.menu.outerWidth(Math.max(this.button.outerWidth(),this.menu.width("").outerWidth()+1))},_getCreateOptions:function(){return{disabled:this.element.prop("disabled")}},_parseOptions:function(t){var i=[];t.each(function(t,s){var n=e(s),a=n.parent("optgroup");i.push({element:n,index:t,value:n.val(),label:n.text(),optgroup:a.attr("label")||"",disabled:a.prop("disabled")||n.prop("disabled")})}),this.items=i},_destroy:function(){this.menuWrap.remove(),this.button.remove(),this.element.show(),this.element.removeUniqueId(),this.label.attr("for",this.ids.element)}}),e.widget("ui.slider",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"slide",options:{animate:!1,distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null,change:null,slide:null,start:null,stop:null},numPages:5,_create:function(){this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this._calculateNewMax(),this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget"+" ui-widget-content"+" ui-corner-all"),this._refresh(),this._setOption("disabled",this.options.disabled),this._animateOff=!1},_refresh:function(){this._createRange(),this._createHandles(),this._setupEvents(),this._refreshValue()},_createHandles:function(){var t,i,s=this.options,n=this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),a="<span class='ui-slider-handle ui-state-default ui-corner-all' tabindex='0'></span>",o=[];for(i=s.values&&s.values.length||1,n.length>i&&(n.slice(i).remove(),n=n.slice(0,i)),t=n.length;i>t;t++)o.push(a);this.handles=n.add(e(o.join("")).appendTo(this.element)),this.handle=this.handles.eq(0),this.handles.each(function(t){e(this).data("ui-slider-handle-index",t)})},_createRange:function(){var t=this.options,i="";t.range?(t.range===!0&&(t.values?t.values.length&&2!==t.values.length?t.values=[t.values[0],t.values[0]]:e.isArray(t.values)&&(t.values=t.values.slice(0)):t.values=[this._valueMin(),this._valueMin()]),this.range&&this.range.length?this.range.removeClass("ui-slider-range-min ui-slider-range-max").css({left:"",bottom:""}):(this.range=e("<div></div>").appendTo(this.element),i="ui-slider-range ui-widget-header ui-corner-all"),this.range.addClass(i+("min"===t.range||"max"===t.range?" ui-slider-range-"+t.range:""))):(this.range&&this.range.remove(),this.range=null)},_setupEvents:function(){this._off(this.handles),this._on(this.handles,this._handleEvents),this._hoverable(this.handles),this._focusable(this.handles)},_destroy:function(){this.handles.remove(),this.range&&this.range.remove(),this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-widget ui-widget-content ui-corner-all"),this._mouseDestroy()},_mouseCapture:function(t){var i,s,n,a,o,r,h,l,u=this,d=this.options;return d.disabled?!1:(this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),i={x:t.pageX,y:t.pageY},s=this._normValueFromMouse(i),n=this._valueMax()-this._valueMin()+1,this.handles.each(function(t){var i=Math.abs(s-u.values(t));(n>i||n===i&&(t===u._lastChangedValue||u.values(t)===d.min))&&(n=i,a=e(this),o=t)}),r=this._start(t,o),r===!1?!1:(this._mouseSliding=!0,this._handleIndex=o,a.addClass("ui-state-active").focus(),h=a.offset(),l=!e(t.target).parents().addBack().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:t.pageX-h.left-a.width()/2,top:t.pageY-h.top-a.height()/2-(parseInt(a.css("borderTopWidth"),10)||0)-(parseInt(a.css("borderBottomWidth"),10)||0)+(parseInt(a.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(t,o,s),this._animateOff=!0,!0))},_mouseStart:function(){return!0},_mouseDrag:function(e){var t={x:e.pageX,y:e.pageY},i=this._normValueFromMouse(t);return this._slide(e,this._handleIndex,i),!1},_mouseStop:function(e){return this.handles.removeClass("ui-state-active"),this._mouseSliding=!1,this._stop(e,this._handleIndex),this._change(e,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation="vertical"===this.options.orientation?"vertical":"horizontal"},_normValueFromMouse:function(e){var t,i,s,n,a;return"horizontal"===this.orientation?(t=this.elementSize.width,i=e.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(t=this.elementSize.height,i=e.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),s=i/t,s>1&&(s=1),0>s&&(s=0),"vertical"===this.orientation&&(s=1-s),n=this._valueMax()-this._valueMin(),a=this._valueMin()+s*n,this._trimAlignValue(a)},_start:function(e,t){var i={handle:this.handles[t],value:this.value()};return this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._trigger("start",e,i)},_slide:function(e,t,i){var s,n,a;this.options.values&&this.options.values.length?(s=this.values(t?0:1),2===this.options.values.length&&this.options.range===!0&&(0===t&&i>s||1===t&&s>i)&&(i=s),i!==this.values(t)&&(n=this.values(),n[t]=i,a=this._trigger("slide",e,{handle:this.handles[t],value:i,values:n}),s=this.values(t?0:1),a!==!1&&this.values(t,i))):i!==this.value()&&(a=this._trigger("slide",e,{handle:this.handles[t],value:i}),a!==!1&&this.value(i))},_stop:function(e,t){var i={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._trigger("stop",e,i)},_change:function(e,t){if(!this._keySliding&&!this._mouseSliding){var i={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._lastChangedValue=t,this._trigger("change",e,i)}},value:function(e){return arguments.length?(this.options.value=this._trimAlignValue(e),this._refreshValue(),this._change(null,0),void 0):this._value()},values:function(t,i){var s,n,a;if(arguments.length>1)return this.options.values[t]=this._trimAlignValue(i),this._refreshValue(),this._change(null,t),void 0;if(!arguments.length)return this._values();if(!e.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(t):this.value();for(s=this.options.values,n=arguments[0],a=0;s.length>a;a+=1)s[a]=this._trimAlignValue(n[a]),this._change(null,a);this._refreshValue()},_setOption:function(t,i){var s,n=0;switch("range"===t&&this.options.range===!0&&("min"===i?(this.options.value=this._values(0),this.options.values=null):"max"===i&&(this.options.value=this._values(this.options.values.length-1),this.options.values=null)),e.isArray(this.options.values)&&(n=this.options.values.length),"disabled"===t&&this.element.toggleClass("ui-state-disabled",!!i),this._super(t,i),t){case"orientation":this._detectOrientation(),this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation),this._refreshValue(),this.handles.css("horizontal"===i?"bottom":"left","");break;case"value":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case"values":for(this._animateOff=!0,this._refreshValue(),s=0;n>s;s+=1)this._change(null,s);this._animateOff=!1;break;case"step":case"min":case"max":this._animateOff=!0,this._calculateNewMax(),this._refreshValue(),this._animateOff=!1;break;case"range":this._animateOff=!0,this._refresh(),this._animateOff=!1}},_value:function(){var e=this.options.value;return e=this._trimAlignValue(e)},_values:function(e){var t,i,s;if(arguments.length)return t=this.options.values[e],t=this._trimAlignValue(t);if(this.options.values&&this.options.values.length){for(i=this.options.values.slice(),s=0;i.length>s;s+=1)i[s]=this._trimAlignValue(i[s]);return i}return[]},_trimAlignValue:function(e){if(this._valueMin()>=e)return this._valueMin();if(e>=this._valueMax())return this._valueMax();var t=this.options.step>0?this.options.step:1,i=(e-this._valueMin())%t,s=e-i;return 2*Math.abs(i)>=t&&(s+=i>0?t:-t),parseFloat(s.toFixed(5))},_calculateNewMax:function(){var e=this.options.max,t=this._valueMin(),i=this.options.step,s=Math.floor(+(e-t).toFixed(this._precision())/i)*i;e=s+t,this.max=parseFloat(e.toFixed(this._precision()))},_precision:function(){var e=this._precisionOf(this.options.step);return null!==this.options.min&&(e=Math.max(e,this._precisionOf(this.options.min))),e},_precisionOf:function(e){var t=""+e,i=t.indexOf(".");return-1===i?0:t.length-i-1},_valueMin:function(){return this.options.min},_valueMax:function(){return this.max},_refreshValue:function(){var t,i,s,n,a,o=this.options.range,r=this.options,h=this,l=this._animateOff?!1:r.animate,u={};this.options.values&&this.options.values.length?this.handles.each(function(s){i=100*((h.values(s)-h._valueMin())/(h._valueMax()-h._valueMin())),u["horizontal"===h.orientation?"left":"bottom"]=i+"%",e(this).stop(1,1)[l?"animate":"css"](u,r.animate),h.options.range===!0&&("horizontal"===h.orientation?(0===s&&h.range.stop(1,1)[l?"animate":"css"]({left:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({width:i-t+"%"},{queue:!1,duration:r.animate})):(0===s&&h.range.stop(1,1)[l?"animate":"css"]({bottom:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({height:i-t+"%"},{queue:!1,duration:r.animate}))),t=i}):(s=this.value(),n=this._valueMin(),a=this._valueMax(),i=a!==n?100*((s-n)/(a-n)):0,u["horizontal"===this.orientation?"left":"bottom"]=i+"%",this.handle.stop(1,1)[l?"animate":"css"](u,r.animate),"min"===o&&"horizontal"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({width:i+"%"},r.animate),"max"===o&&"horizontal"===this.orientation&&this.range[l?"animate":"css"]({width:100-i+"%"},{queue:!1,duration:r.animate}),"min"===o&&"vertical"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({height:i+"%"},r.animate),"max"===o&&"vertical"===this.orientation&&this.range[l?"animate":"css"]({height:100-i+"%"},{queue:!1,duration:r.animate}))},_handleEvents:{keydown:function(t){var i,s,n,a,o=e(t.target).data("ui-slider-handle-index");switch(t.keyCode){case e.ui.keyCode.HOME:case e.ui.keyCode.END:case e.ui.keyCode.PAGE_UP:case e.ui.keyCode.PAGE_DOWN:case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:if(t.preventDefault(),!this._keySliding&&(this._keySliding=!0,e(t.target).addClass("ui-state-active"),i=this._start(t,o),i===!1))return}switch(a=this.options.step,s=n=this.options.values&&this.options.values.length?this.values(o):this.value(),t.keyCode){case e.ui.keyCode.HOME:n=this._valueMin();break;case e.ui.keyCode.END:n=this._valueMax();break;case e.ui.keyCode.PAGE_UP:n=this._trimAlignValue(s+(this._valueMax()-this._valueMin())/this.numPages);break;case e.ui.keyCode.PAGE_DOWN:n=this._trimAlignValue(s-(this._valueMax()-this._valueMin())/this.numPages);break;case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:if(s===this._valueMax())return;n=this._trimAlignValue(s+a);break;case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:if(s===this._valueMin())return;n=this._trimAlignValue(s-a)}this._slide(t,o,n)},keyup:function(t){var i=e(t.target).data("ui-slider-handle-index");this._keySliding&&(this._keySliding=!1,this._stop(t,i),this._change(t,i),e(t.target).removeClass("ui-state-active"))}}}),e.widget("ui.sortable",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_isOverAxis:function(e,t,i){return e>=t&&t+i>e},_isFloating:function(e){return/left|right/.test(e.css("float"))||/inline|table-cell/.test(e.css("display"))},_create:function(){this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.offset=this.element.offset(),this._mouseInit(),this._setHandleClassName(),this.ready=!0},_setOption:function(e,t){this._super(e,t),"handle"===e&&this._setHandleClassName()},_setHandleClassName:function(){this.element.find(".ui-sortable-handle").removeClass("ui-sortable-handle"),e.each(this.items,function(){(this.instance.options.handle?this.item.find(this.instance.options.handle):this.item).addClass("ui-sortable-handle")})},_destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").find(".ui-sortable-handle").removeClass("ui-sortable-handle"),this._mouseDestroy();for(var e=this.items.length-1;e>=0;e--)this.items[e].item.removeData(this.widgetName+"-item");return this},_mouseCapture:function(t,i){var s=null,n=!1,a=this;return this.reverting?!1:this.options.disabled||"static"===this.options.type?!1:(this._refreshItems(t),e(t.target).parents().each(function(){return e.data(this,a.widgetName+"-item")===a?(s=e(this),!1):void 0}),e.data(t.target,a.widgetName+"-item")===a&&(s=e(t.target)),s?!this.options.handle||i||(e(this.options.handle,s).find("*").addBack().each(function(){this===t.target&&(n=!0)}),n)?(this.currentItem=s,this._removeCurrentsFromItems(),!0):!1:!1)},_mouseStart:function(t,i,s){var n,a,o=this.options;if(this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(t),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},e.extend(this.offset,{click:{left:t.pageX-this.offset.left,top:t.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(t),this.originalPageX=t.pageX,this.originalPageY=t.pageY,o.cursorAt&&this._adjustOffsetFromHelper(o.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),o.containment&&this._setContainment(),o.cursor&&"auto"!==o.cursor&&(a=this.document.find("body"),this.storedCursor=a.css("cursor"),a.css("cursor",o.cursor),this.storedStylesheet=e("<style>*{ cursor: "+o.cursor+" !important; }</style>").appendTo(a)),o.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",o.opacity)),o.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",o.zIndex)),this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",t,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!s)for(n=this.containers.length-1;n>=0;n--)this.containers[n]._trigger("activate",t,this._uiHash(this));
return e.ui.ddmanager&&(e.ui.ddmanager.current=this),e.ui.ddmanager&&!o.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(t),!0},_mouseDrag:function(t){var i,s,n,a,o=this.options,r=!1;for(this.position=this._generatePosition(t),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-t.pageY<o.scrollSensitivity?this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop+o.scrollSpeed:t.pageY-this.overflowOffset.top<o.scrollSensitivity&&(this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop-o.scrollSpeed),this.overflowOffset.left+this.scrollParent[0].offsetWidth-t.pageX<o.scrollSensitivity?this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft+o.scrollSpeed:t.pageX-this.overflowOffset.left<o.scrollSensitivity&&(this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft-o.scrollSpeed)):(t.pageY-this.document.scrollTop()<o.scrollSensitivity?r=this.document.scrollTop(this.document.scrollTop()-o.scrollSpeed):this.window.height()-(t.pageY-this.document.scrollTop())<o.scrollSensitivity&&(r=this.document.scrollTop(this.document.scrollTop()+o.scrollSpeed)),t.pageX-this.document.scrollLeft()<o.scrollSensitivity?r=this.document.scrollLeft(this.document.scrollLeft()-o.scrollSpeed):this.window.width()-(t.pageX-this.document.scrollLeft())<o.scrollSensitivity&&(r=this.document.scrollLeft(this.document.scrollLeft()+o.scrollSpeed))),r!==!1&&e.ui.ddmanager&&!o.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t)),this.positionAbs=this._convertPositionTo("absolute"),this.options.axis&&"y"===this.options.axis||(this.helper[0].style.left=this.position.left+"px"),this.options.axis&&"x"===this.options.axis||(this.helper[0].style.top=this.position.top+"px"),i=this.items.length-1;i>=0;i--)if(s=this.items[i],n=s.item[0],a=this._intersectsWithPointer(s),a&&s.instance===this.currentContainer&&n!==this.currentItem[0]&&this.placeholder[1===a?"next":"prev"]()[0]!==n&&!e.contains(this.placeholder[0],n)&&("semi-dynamic"===this.options.type?!e.contains(this.element[0],n):!0)){if(this.direction=1===a?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(s))break;this._rearrange(t,s),this._trigger("change",t,this._uiHash());break}return this._contactContainers(t),e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),this._trigger("sort",t,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(t,i){if(t){if(e.ui.ddmanager&&!this.options.dropBehaviour&&e.ui.ddmanager.drop(this,t),this.options.revert){var s=this,n=this.placeholder.offset(),a=this.options.axis,o={};a&&"x"!==a||(o.left=n.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollLeft)),a&&"y"!==a||(o.top=n.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,e(this.helper).animate(o,parseInt(this.options.revert,10)||500,function(){s._clear(t)})}else this._clear(t,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp({target:null}),"original"===this.options.helper?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var t=this.containers.length-1;t>=0;t--)this.containers[t]._trigger("deactivate",null,this._uiHash(this)),this.containers[t].containerCache.over&&(this.containers[t]._trigger("out",null,this._uiHash(this)),this.containers[t].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),e.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?e(this.domPosition.prev).after(this.currentItem):e(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(t){var i=this._getItemsAsjQuery(t&&t.connected),s=[];return t=t||{},e(i).each(function(){var i=(e(t.item||this).attr(t.attribute||"id")||"").match(t.expression||/(.+)[\-=_](.+)/);i&&s.push((t.key||i[1]+"[]")+"="+(t.key&&t.expression?i[1]:i[2]))}),!s.length&&t.key&&s.push(t.key+"="),s.join("&")},toArray:function(t){var i=this._getItemsAsjQuery(t&&t.connected),s=[];return t=t||{},i.each(function(){s.push(e(t.item||this).attr(t.attribute||"id")||"")}),s},_intersectsWith:function(e){var t=this.positionAbs.left,i=t+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,a=e.left,o=a+e.width,r=e.top,h=r+e.height,l=this.offset.click.top,u=this.offset.click.left,d="x"===this.options.axis||s+l>r&&h>s+l,c="y"===this.options.axis||t+u>a&&o>t+u,p=d&&c;return"pointer"===this.options.tolerance||this.options.forcePointerForContainers||"pointer"!==this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>e[this.floating?"width":"height"]?p:t+this.helperProportions.width/2>a&&o>i-this.helperProportions.width/2&&s+this.helperProportions.height/2>r&&h>n-this.helperProportions.height/2},_intersectsWithPointer:function(e){var t="x"===this.options.axis||this._isOverAxis(this.positionAbs.top+this.offset.click.top,e.top,e.height),i="y"===this.options.axis||this._isOverAxis(this.positionAbs.left+this.offset.click.left,e.left,e.width),s=t&&i,n=this._getDragVerticalDirection(),a=this._getDragHorizontalDirection();return s?this.floating?a&&"right"===a||"down"===n?2:1:n&&("down"===n?2:1):!1},_intersectsWithSides:function(e){var t=this._isOverAxis(this.positionAbs.top+this.offset.click.top,e.top+e.height/2,e.height),i=this._isOverAxis(this.positionAbs.left+this.offset.click.left,e.left+e.width/2,e.width),s=this._getDragVerticalDirection(),n=this._getDragHorizontalDirection();return this.floating&&n?"right"===n&&i||"left"===n&&!i:s&&("down"===s&&t||"up"===s&&!t)},_getDragVerticalDirection:function(){var e=this.positionAbs.top-this.lastPositionAbs.top;return 0!==e&&(e>0?"down":"up")},_getDragHorizontalDirection:function(){var e=this.positionAbs.left-this.lastPositionAbs.left;return 0!==e&&(e>0?"right":"left")},refresh:function(e){return this._refreshItems(e),this._setHandleClassName(),this.refreshPositions(),this},_connectWith:function(){var e=this.options;return e.connectWith.constructor===String?[e.connectWith]:e.connectWith},_getItemsAsjQuery:function(t){function i(){r.push(this)}var s,n,a,o,r=[],h=[],l=this._connectWith();if(l&&t)for(s=l.length-1;s>=0;s--)for(a=e(l[s],this.document[0]),n=a.length-1;n>=0;n--)o=e.data(a[n],this.widgetFullName),o&&o!==this&&!o.options.disabled&&h.push([e.isFunction(o.options.items)?o.options.items.call(o.element):e(o.options.items,o.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),o]);for(h.push([e.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):e(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]),s=h.length-1;s>=0;s--)h[s][0].each(i);return e(r)},_removeCurrentsFromItems:function(){var t=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=e.grep(this.items,function(e){for(var i=0;t.length>i;i++)if(t[i]===e.item[0])return!1;return!0})},_refreshItems:function(t){this.items=[],this.containers=[this];var i,s,n,a,o,r,h,l,u=this.items,d=[[e.isFunction(this.options.items)?this.options.items.call(this.element[0],t,{item:this.currentItem}):e(this.options.items,this.element),this]],c=this._connectWith();if(c&&this.ready)for(i=c.length-1;i>=0;i--)for(n=e(c[i],this.document[0]),s=n.length-1;s>=0;s--)a=e.data(n[s],this.widgetFullName),a&&a!==this&&!a.options.disabled&&(d.push([e.isFunction(a.options.items)?a.options.items.call(a.element[0],t,{item:this.currentItem}):e(a.options.items,a.element),a]),this.containers.push(a));for(i=d.length-1;i>=0;i--)for(o=d[i][1],r=d[i][0],s=0,l=r.length;l>s;s++)h=e(r[s]),h.data(this.widgetName+"-item",o),u.push({item:h,instance:o,width:0,height:0,left:0,top:0})},refreshPositions:function(t){this.floating=this.items.length?"x"===this.options.axis||this._isFloating(this.items[0].item):!1,this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());var i,s,n,a;for(i=this.items.length-1;i>=0;i--)s=this.items[i],s.instance!==this.currentContainer&&this.currentContainer&&s.item[0]!==this.currentItem[0]||(n=this.options.toleranceElement?e(this.options.toleranceElement,s.item):s.item,t||(s.width=n.outerWidth(),s.height=n.outerHeight()),a=n.offset(),s.left=a.left,s.top=a.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(i=this.containers.length-1;i>=0;i--)a=this.containers[i].element.offset(),this.containers[i].containerCache.left=a.left,this.containers[i].containerCache.top=a.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight();return this},_createPlaceholder:function(t){t=t||this;var i,s=t.options;s.placeholder&&s.placeholder.constructor!==String||(i=s.placeholder,s.placeholder={element:function(){var s=t.currentItem[0].nodeName.toLowerCase(),n=e("<"+s+">",t.document[0]).addClass(i||t.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper");return"tbody"===s?t._createTrPlaceholder(t.currentItem.find("tr").eq(0),e("<tr>",t.document[0]).appendTo(n)):"tr"===s?t._createTrPlaceholder(t.currentItem,n):"img"===s&&n.attr("src",t.currentItem.attr("src")),i||n.css("visibility","hidden"),n},update:function(e,n){(!i||s.forcePlaceholderSize)&&(n.height()||n.height(t.currentItem.innerHeight()-parseInt(t.currentItem.css("paddingTop")||0,10)-parseInt(t.currentItem.css("paddingBottom")||0,10)),n.width()||n.width(t.currentItem.innerWidth()-parseInt(t.currentItem.css("paddingLeft")||0,10)-parseInt(t.currentItem.css("paddingRight")||0,10)))}}),t.placeholder=e(s.placeholder.element.call(t.element,t.currentItem)),t.currentItem.after(t.placeholder),s.placeholder.update(t,t.placeholder)},_createTrPlaceholder:function(t,i){var s=this;t.children().each(function(){e("<td>&#160;</td>",s.document[0]).attr("colspan",e(this).attr("colspan")||1).appendTo(i)})},_contactContainers:function(t){var i,s,n,a,o,r,h,l,u,d,c=null,p=null;for(i=this.containers.length-1;i>=0;i--)if(!e.contains(this.currentItem[0],this.containers[i].element[0]))if(this._intersectsWith(this.containers[i].containerCache)){if(c&&e.contains(this.containers[i].element[0],c.element[0]))continue;c=this.containers[i],p=i}else this.containers[i].containerCache.over&&(this.containers[i]._trigger("out",t,this._uiHash(this)),this.containers[i].containerCache.over=0);if(c)if(1===this.containers.length)this.containers[p].containerCache.over||(this.containers[p]._trigger("over",t,this._uiHash(this)),this.containers[p].containerCache.over=1);else{for(n=1e4,a=null,u=c.floating||this._isFloating(this.currentItem),o=u?"left":"top",r=u?"width":"height",d=u?"clientX":"clientY",s=this.items.length-1;s>=0;s--)e.contains(this.containers[p].element[0],this.items[s].item[0])&&this.items[s].item[0]!==this.currentItem[0]&&(h=this.items[s].item.offset()[o],l=!1,t[d]-h>this.items[s][r]/2&&(l=!0),n>Math.abs(t[d]-h)&&(n=Math.abs(t[d]-h),a=this.items[s],this.direction=l?"up":"down"));if(!a&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[p])return this.currentContainer.containerCache.over||(this.containers[p]._trigger("over",t,this._uiHash()),this.currentContainer.containerCache.over=1),void 0;a?this._rearrange(t,a,null,!0):this._rearrange(t,null,this.containers[p].element,!0),this._trigger("change",t,this._uiHash()),this.containers[p]._trigger("change",t,this._uiHash(this)),this.currentContainer=this.containers[p],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[p]._trigger("over",t,this._uiHash(this)),this.containers[p].containerCache.over=1}},_createHelper:function(t){var i=this.options,s=e.isFunction(i.helper)?e(i.helper.apply(this.element[0],[t,this.currentItem])):"clone"===i.helper?this.currentItem.clone():this.currentItem;return s.parents("body").length||e("parent"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(s[0]),s[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(!s[0].style.width||i.forceHelperSize)&&s.width(this.currentItem.width()),(!s[0].style.height||i.forceHelperSize)&&s.height(this.currentItem.height()),s},_adjustOffsetFromHelper:function(t){"string"==typeof t&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var t=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==this.document[0]&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===this.document[0].body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&e.ui.ie)&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var e=this.currentItem.position();return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:e.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t,i,s,n=this.options;"parent"===n.containment&&(n.containment=this.helper[0].parentNode),("document"===n.containment||"window"===n.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,"document"===n.containment?this.document.width():this.window.width()-this.helperProportions.width-this.margins.left,("document"===n.containment?this.document.width():this.window.height()||this.document[0].body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(n.containment)||(t=e(n.containment)[0],i=e(n.containment).offset(),s="hidden"!==e(t).css("overflow"),this.containment=[i.left+(parseInt(e(t).css("borderLeftWidth"),10)||0)+(parseInt(e(t).css("paddingLeft"),10)||0)-this.margins.left,i.top+(parseInt(e(t).css("borderTopWidth"),10)||0)+(parseInt(e(t).css("paddingTop"),10)||0)-this.margins.top,i.left+(s?Math.max(t.scrollWidth,t.offsetWidth):t.offsetWidth)-(parseInt(e(t).css("borderLeftWidth"),10)||0)-(parseInt(e(t).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(s?Math.max(t.scrollHeight,t.offsetHeight):t.offsetHeight)-(parseInt(e(t).css("borderTopWidth"),10)||0)-(parseInt(e(t).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(t,i){i||(i=this.position);var s="absolute"===t?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,a=/(html|body)/i.test(n[0].tagName);return{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():a?0:n.scrollTop())*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():a?0:n.scrollLeft())*s}},_generatePosition:function(t){var i,s,n=this.options,a=t.pageX,o=t.pageY,r="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,h=/(html|body)/i.test(r[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(t.pageX-this.offset.click.left<this.containment[0]&&(a=this.containment[0]+this.offset.click.left),t.pageY-this.offset.click.top<this.containment[1]&&(o=this.containment[1]+this.offset.click.top),t.pageX-this.offset.click.left>this.containment[2]&&(a=this.containment[2]+this.offset.click.left),t.pageY-this.offset.click.top>this.containment[3]&&(o=this.containment[3]+this.offset.click.top)),n.grid&&(i=this.originalPageY+Math.round((o-this.originalPageY)/n.grid[1])*n.grid[1],o=this.containment?i-this.offset.click.top>=this.containment[1]&&i-this.offset.click.top<=this.containment[3]?i:i-this.offset.click.top>=this.containment[1]?i-n.grid[1]:i+n.grid[1]:i,s=this.originalPageX+Math.round((a-this.originalPageX)/n.grid[0])*n.grid[0],a=this.containment?s-this.offset.click.left>=this.containment[0]&&s-this.offset.click.left<=this.containment[2]?s:s-this.offset.click.left>=this.containment[0]?s-n.grid[0]:s+n.grid[0]:s)),{top:o-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():h?0:r.scrollTop()),left:a-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():h?0:r.scrollLeft())}},_rearrange:function(e,t,i,s){i?i[0].appendChild(this.placeholder[0]):t.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?t.item[0]:t.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(e,t){function i(e,t,i){return function(s){i._trigger(e,s,t._uiHash(t))}}this.reverting=!1;var s,n=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(s in this._storedCSS)("auto"===this._storedCSS[s]||"static"===this._storedCSS[s])&&(this._storedCSS[s]="");this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();for(this.fromOutside&&!t&&n.push(function(e){this._trigger("receive",e,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||t||n.push(function(e){this._trigger("update",e,this._uiHash())}),this!==this.currentContainer&&(t||(n.push(function(e){this._trigger("remove",e,this._uiHash())}),n.push(function(e){return function(t){e._trigger("receive",t,this._uiHash(this))}}.call(this,this.currentContainer)),n.push(function(e){return function(t){e._trigger("update",t,this._uiHash(this))}}.call(this,this.currentContainer)))),s=this.containers.length-1;s>=0;s--)t||n.push(i("deactivate",this,this.containers[s])),this.containers[s].containerCache.over&&(n.push(i("out",this,this.containers[s])),this.containers[s].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,t||this._trigger("beforeStop",e,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.cancelHelperRemoval||(this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null),!t){for(s=0;n.length>s;s++)n[s].call(this,e);this._trigger("stop",e,this._uiHash())}return this.fromOutside=!1,!this.cancelHelperRemoval},_trigger:function(){e.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(t){var i=t||this;return{helper:i.helper,placeholder:i.placeholder||e([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:t?t.element:null}}}),e.widget("ui.spinner",{version:"1.11.4",defaultElement:"<input>",widgetEventPrefix:"spin",options:{culture:null,icons:{down:"ui-icon-triangle-1-s",up:"ui-icon-triangle-1-n"},incremental:!0,max:null,min:null,numberFormat:null,page:10,step:1,change:null,spin:null,start:null,stop:null},_create:function(){this._setOption("max",this.options.max),this._setOption("min",this.options.min),this._setOption("step",this.options.step),""!==this.value()&&this._value(this.element.val(),!0),this._draw(),this._on(this._events),this._refresh(),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_getCreateOptions:function(){var t={},i=this.element;return e.each(["min","max","step"],function(e,s){var n=i.attr(s);void 0!==n&&n.length&&(t[s]=n)}),t},_events:{keydown:function(e){this._start(e)&&this._keydown(e)&&e.preventDefault()},keyup:"_stop",focus:function(){this.previous=this.element.val()},blur:function(e){return this.cancelBlur?(delete this.cancelBlur,void 0):(this._stop(),this._refresh(),this.previous!==this.element.val()&&this._trigger("change",e),void 0)},mousewheel:function(e,t){if(t){if(!this.spinning&&!this._start(e))return!1;this._spin((t>0?1:-1)*this.options.step,e),clearTimeout(this.mousewheelTimer),this.mousewheelTimer=this._delay(function(){this.spinning&&this._stop(e)},100),e.preventDefault()}},"mousedown .ui-spinner-button":function(t){function i(){var e=this.element[0]===this.document[0].activeElement;e||(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s}))}var s;s=this.element[0]===this.document[0].activeElement?this.previous:this.element.val(),t.preventDefault(),i.call(this),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,i.call(this)}),this._start(t)!==!1&&this._repeat(null,e(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t)},"mouseup .ui-spinner-button":"_stop","mouseenter .ui-spinner-button":function(t){return e(t.currentTarget).hasClass("ui-state-active")?this._start(t)===!1?!1:(this._repeat(null,e(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t),void 0):void 0},"mouseleave .ui-spinner-button":"_stop"},_draw:function(){var e=this.uiSpinner=this.element.addClass("ui-spinner-input").attr("autocomplete","off").wrap(this._uiSpinnerHtml()).parent().append(this._buttonHtml());this.element.attr("role","spinbutton"),this.buttons=e.find(".ui-spinner-button").attr("tabIndex",-1).button().removeClass("ui-corner-all"),this.buttons.height()>Math.ceil(.5*e.height())&&e.height()>0&&e.height(e.height()),this.options.disabled&&this.disable()},_keydown:function(t){var i=this.options,s=e.ui.keyCode;switch(t.keyCode){case s.UP:return this._repeat(null,1,t),!0;case s.DOWN:return this._repeat(null,-1,t),!0;case s.PAGE_UP:return this._repeat(null,i.page,t),!0;case s.PAGE_DOWN:return this._repeat(null,-i.page,t),!0}return!1},_uiSpinnerHtml:function(){return"<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>"},_buttonHtml:function(){return"<a class='ui-spinner-button ui-spinner-up ui-corner-tr'><span class='ui-icon "+this.options.icons.up+"'>&#9650;</span>"+"</a>"+"<a class='ui-spinner-button ui-spinner-down ui-corner-br'>"+"<span class='ui-icon "+this.options.icons.down+"'>&#9660;</span>"+"</a>"},_start:function(e){return this.spinning||this._trigger("start",e)!==!1?(this.counter||(this.counter=1),this.spinning=!0,!0):!1},_repeat:function(e,t,i){e=e||500,clearTimeout(this.timer),this.timer=this._delay(function(){this._repeat(40,t,i)},e),this._spin(t*this.options.step,i)},_spin:function(e,t){var i=this.value()||0;this.counter||(this.counter=1),i=this._adjustValue(i+e*this._increment(this.counter)),this.spinning&&this._trigger("spin",t,{value:i})===!1||(this._value(i),this.counter++)},_increment:function(t){var i=this.options.incremental;return i?e.isFunction(i)?i(t):Math.floor(t*t*t/5e4-t*t/500+17*t/200+1):1},_precision:function(){var e=this._precisionOf(this.options.step);return null!==this.options.min&&(e=Math.max(e,this._precisionOf(this.options.min))),e},_precisionOf:function(e){var t=""+e,i=t.indexOf(".");return-1===i?0:t.length-i-1},_adjustValue:function(e){var t,i,s=this.options;return t=null!==s.min?s.min:0,i=e-t,i=Math.round(i/s.step)*s.step,e=t+i,e=parseFloat(e.toFixed(this._precision())),null!==s.max&&e>s.max?s.max:null!==s.min&&s.min>e?s.min:e},_stop:function(e){this.spinning&&(clearTimeout(this.timer),clearTimeout(this.mousewheelTimer),this.counter=0,this.spinning=!1,this._trigger("stop",e))},_setOption:function(e,t){if("culture"===e||"numberFormat"===e){var i=this._parse(this.element.val());return this.options[e]=t,this.element.val(this._format(i)),void 0}("max"===e||"min"===e||"step"===e)&&"string"==typeof t&&(t=this._parse(t)),"icons"===e&&(this.buttons.first().find(".ui-icon").removeClass(this.options.icons.up).addClass(t.up),this.buttons.last().find(".ui-icon").removeClass(this.options.icons.down).addClass(t.down)),this._super(e,t),"disabled"===e&&(this.widget().toggleClass("ui-state-disabled",!!t),this.element.prop("disabled",!!t),this.buttons.button(t?"disable":"enable"))},_setOptions:h(function(e){this._super(e)}),_parse:function(e){return"string"==typeof e&&""!==e&&(e=window.Globalize&&this.options.numberFormat?Globalize.parseFloat(e,10,this.options.culture):+e),""===e||isNaN(e)?null:e},_format:function(e){return""===e?"":window.Globalize&&this.options.numberFormat?Globalize.format(e,this.options.numberFormat,this.options.culture):e},_refresh:function(){this.element.attr({"aria-valuemin":this.options.min,"aria-valuemax":this.options.max,"aria-valuenow":this._parse(this.element.val())})},isValid:function(){var e=this.value();return null===e?!1:e===this._adjustValue(e)},_value:function(e,t){var i;""!==e&&(i=this._parse(e),null!==i&&(t||(i=this._adjustValue(i)),e=this._format(i))),this.element.val(e),this._refresh()},_destroy:function(){this.element.removeClass("ui-spinner-input").prop("disabled",!1).removeAttr("autocomplete").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.uiSpinner.replaceWith(this.element)},stepUp:h(function(e){this._stepUp(e)}),_stepUp:function(e){this._start()&&(this._spin((e||1)*this.options.step),this._stop())},stepDown:h(function(e){this._stepDown(e)}),_stepDown:function(e){this._start()&&(this._spin((e||1)*-this.options.step),this._stop())},pageUp:h(function(e){this._stepUp((e||1)*this.options.page)}),pageDown:h(function(e){this._stepDown((e||1)*this.options.page)}),value:function(e){return arguments.length?(h(this._value).call(this,e),void 0):this._parse(this.element.val())},widget:function(){return this.uiSpinner}}),e.widget("ui.tabs",{version:"1.11.4",delay:300,options:{active:null,collapsible:!1,event:"click",heightStyle:"content",hide:null,show:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_isLocal:function(){var e=/#.*$/;return function(t){var i,s;t=t.cloneNode(!1),i=t.href.replace(e,""),s=location.href.replace(e,"");try{i=decodeURIComponent(i)}catch(n){}try{s=decodeURIComponent(s)}catch(n){}return t.hash.length>1&&i===s}}(),_create:function(){var t=this,i=this.options;this.running=!1,this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all").toggleClass("ui-tabs-collapsible",i.collapsible),this._processTabs(),i.active=this._initialActive(),e.isArray(i.disabled)&&(i.disabled=e.unique(i.disabled.concat(e.map(this.tabs.filter(".ui-state-disabled"),function(e){return t.tabs.index(e)}))).sort()),this.active=this.options.active!==!1&&this.anchors.length?this._findActive(i.active):e(),this._refresh(),this.active.length&&this.load(i.active)},_initialActive:function(){var t=this.options.active,i=this.options.collapsible,s=location.hash.substring(1);return null===t&&(s&&this.tabs.each(function(i,n){return e(n).attr("aria-controls")===s?(t=i,!1):void 0}),null===t&&(t=this.tabs.index(this.tabs.filter(".ui-tabs-active"))),(null===t||-1===t)&&(t=this.tabs.length?0:!1)),t!==!1&&(t=this.tabs.index(this.tabs.eq(t)),-1===t&&(t=i?!1:0)),!i&&t===!1&&this.anchors.length&&(t=0),t},_getCreateEventData:function(){return{tab:this.active,panel:this.active.length?this._getPanelForTab(this.active):e()}},_tabKeydown:function(t){var i=e(this.document[0].activeElement).closest("li"),s=this.tabs.index(i),n=!0;if(!this._handlePageNav(t)){switch(t.keyCode){case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:s++;break;case e.ui.keyCode.UP:case e.ui.keyCode.LEFT:n=!1,s--;break;case e.ui.keyCode.END:s=this.anchors.length-1;break;case e.ui.keyCode.HOME:s=0;break;case e.ui.keyCode.SPACE:return t.preventDefault(),clearTimeout(this.activating),this._activate(s),void 0;case e.ui.keyCode.ENTER:return t.preventDefault(),clearTimeout(this.activating),this._activate(s===this.options.active?!1:s),void 0;default:return}t.preventDefault(),clearTimeout(this.activating),s=this._focusNextTab(s,n),t.ctrlKey||t.metaKey||(i.attr("aria-selected","false"),this.tabs.eq(s).attr("aria-selected","true"),this.activating=this._delay(function(){this.option("active",s)},this.delay))}},_panelKeydown:function(t){this._handlePageNav(t)||t.ctrlKey&&t.keyCode===e.ui.keyCode.UP&&(t.preventDefault(),this.active.focus())},_handlePageNav:function(t){return t.altKey&&t.keyCode===e.ui.keyCode.PAGE_UP?(this._activate(this._focusNextTab(this.options.active-1,!1)),!0):t.altKey&&t.keyCode===e.ui.keyCode.PAGE_DOWN?(this._activate(this._focusNextTab(this.options.active+1,!0)),!0):void 0},_findNextTab:function(t,i){function s(){return t>n&&(t=0),0>t&&(t=n),t}for(var n=this.tabs.length-1;-1!==e.inArray(s(),this.options.disabled);)t=i?t+1:t-1;return t},_focusNextTab:function(e,t){return e=this._findNextTab(e,t),this.tabs.eq(e).focus(),e},_setOption:function(e,t){return"active"===e?(this._activate(t),void 0):"disabled"===e?(this._setupDisabled(t),void 0):(this._super(e,t),"collapsible"===e&&(this.element.toggleClass("ui-tabs-collapsible",t),t||this.options.active!==!1||this._activate(0)),"event"===e&&this._setupEvents(t),"heightStyle"===e&&this._setupHeightStyle(t),void 0)},_sanitizeSelector:function(e){return e?e.replace(/[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g,"\\$&"):""},refresh:function(){var t=this.options,i=this.tablist.children(":has(a[href])");t.disabled=e.map(i.filter(".ui-state-disabled"),function(e){return i.index(e)}),this._processTabs(),t.active!==!1&&this.anchors.length?this.active.length&&!e.contains(this.tablist[0],this.active[0])?this.tabs.length===t.disabled.length?(t.active=!1,this.active=e()):this._activate(this._findNextTab(Math.max(0,t.active-1),!1)):t.active=this.tabs.index(this.active):(t.active=!1,this.active=e()),this._refresh()},_refresh:function(){this._setupDisabled(this.options.disabled),this._setupEvents(this.options.event),this._setupHeightStyle(this.options.heightStyle),this.tabs.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}),this.panels.not(this._getPanelForTab(this.active)).hide().attr({"aria-hidden":"true"}),this.active.length?(this.active.addClass("ui-tabs-active ui-state-active").attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}),this._getPanelForTab(this.active).show().attr({"aria-hidden":"false"})):this.tabs.eq(0).attr("tabIndex",0)},_processTabs:function(){var t=this,i=this.tabs,s=this.anchors,n=this.panels;
this.tablist=this._getList().addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").attr("role","tablist").delegate("> li","mousedown"+this.eventNamespace,function(t){e(this).is(".ui-state-disabled")&&t.preventDefault()}).delegate(".ui-tabs-anchor","focus"+this.eventNamespace,function(){e(this).closest("li").is(".ui-state-disabled")&&this.blur()}),this.tabs=this.tablist.find("> li:has(a[href])").addClass("ui-state-default ui-corner-top").attr({role:"tab",tabIndex:-1}),this.anchors=this.tabs.map(function(){return e("a",this)[0]}).addClass("ui-tabs-anchor").attr({role:"presentation",tabIndex:-1}),this.panels=e(),this.anchors.each(function(i,s){var n,a,o,r=e(s).uniqueId().attr("id"),h=e(s).closest("li"),l=h.attr("aria-controls");t._isLocal(s)?(n=s.hash,o=n.substring(1),a=t.element.find(t._sanitizeSelector(n))):(o=h.attr("aria-controls")||e({}).uniqueId()[0].id,n="#"+o,a=t.element.find(n),a.length||(a=t._createPanel(o),a.insertAfter(t.panels[i-1]||t.tablist)),a.attr("aria-live","polite")),a.length&&(t.panels=t.panels.add(a)),l&&h.data("ui-tabs-aria-controls",l),h.attr({"aria-controls":o,"aria-labelledby":r}),a.attr("aria-labelledby",r)}),this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").attr("role","tabpanel"),i&&(this._off(i.not(this.tabs)),this._off(s.not(this.anchors)),this._off(n.not(this.panels)))},_getList:function(){return this.tablist||this.element.find("ol,ul").eq(0)},_createPanel:function(t){return e("<div>").attr("id",t).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").data("ui-tabs-destroy",!0)},_setupDisabled:function(t){e.isArray(t)&&(t.length?t.length===this.anchors.length&&(t=!0):t=!1);for(var i,s=0;i=this.tabs[s];s++)t===!0||-1!==e.inArray(s,t)?e(i).addClass("ui-state-disabled").attr("aria-disabled","true"):e(i).removeClass("ui-state-disabled").removeAttr("aria-disabled");this.options.disabled=t},_setupEvents:function(t){var i={};t&&e.each(t.split(" "),function(e,t){i[t]="_eventHandler"}),this._off(this.anchors.add(this.tabs).add(this.panels)),this._on(!0,this.anchors,{click:function(e){e.preventDefault()}}),this._on(this.anchors,i),this._on(this.tabs,{keydown:"_tabKeydown"}),this._on(this.panels,{keydown:"_panelKeydown"}),this._focusable(this.tabs),this._hoverable(this.tabs)},_setupHeightStyle:function(t){var i,s=this.element.parent();"fill"===t?(i=s.height(),i-=this.element.outerHeight()-this.element.height(),this.element.siblings(":visible").each(function(){var t=e(this),s=t.css("position");"absolute"!==s&&"fixed"!==s&&(i-=t.outerHeight(!0))}),this.element.children().not(this.panels).each(function(){i-=e(this).outerHeight(!0)}),this.panels.each(function(){e(this).height(Math.max(0,i-e(this).innerHeight()+e(this).height()))}).css("overflow","auto")):"auto"===t&&(i=0,this.panels.each(function(){i=Math.max(i,e(this).height("").height())}).height(i))},_eventHandler:function(t){var i=this.options,s=this.active,n=e(t.currentTarget),a=n.closest("li"),o=a[0]===s[0],r=o&&i.collapsible,h=r?e():this._getPanelForTab(a),l=s.length?this._getPanelForTab(s):e(),u={oldTab:s,oldPanel:l,newTab:r?e():a,newPanel:h};t.preventDefault(),a.hasClass("ui-state-disabled")||a.hasClass("ui-tabs-loading")||this.running||o&&!i.collapsible||this._trigger("beforeActivate",t,u)===!1||(i.active=r?!1:this.tabs.index(a),this.active=o?e():a,this.xhr&&this.xhr.abort(),l.length||h.length||e.error("jQuery UI Tabs: Mismatching fragment identifier."),h.length&&this.load(this.tabs.index(a),t),this._toggle(t,u))},_toggle:function(t,i){function s(){a.running=!1,a._trigger("activate",t,i)}function n(){i.newTab.closest("li").addClass("ui-tabs-active ui-state-active"),o.length&&a.options.show?a._show(o,a.options.show,s):(o.show(),s())}var a=this,o=i.newPanel,r=i.oldPanel;this.running=!0,r.length&&this.options.hide?this._hide(r,this.options.hide,function(){i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),n()}):(i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),r.hide(),n()),r.attr("aria-hidden","true"),i.oldTab.attr({"aria-selected":"false","aria-expanded":"false"}),o.length&&r.length?i.oldTab.attr("tabIndex",-1):o.length&&this.tabs.filter(function(){return 0===e(this).attr("tabIndex")}).attr("tabIndex",-1),o.attr("aria-hidden","false"),i.newTab.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_activate:function(t){var i,s=this._findActive(t);s[0]!==this.active[0]&&(s.length||(s=this.active),i=s.find(".ui-tabs-anchor")[0],this._eventHandler({target:i,currentTarget:i,preventDefault:e.noop}))},_findActive:function(t){return t===!1?e():this.tabs.eq(t)},_getIndex:function(e){return"string"==typeof e&&(e=this.anchors.index(this.anchors.filter("[href$='"+e+"']"))),e},_destroy:function(){this.xhr&&this.xhr.abort(),this.element.removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible"),this.tablist.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").removeAttr("role"),this.anchors.removeClass("ui-tabs-anchor").removeAttr("role").removeAttr("tabIndex").removeUniqueId(),this.tablist.unbind(this.eventNamespace),this.tabs.add(this.panels).each(function(){e.data(this,"ui-tabs-destroy")?e(this).remove():e(this).removeClass("ui-state-default ui-state-active ui-state-disabled ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel").removeAttr("tabIndex").removeAttr("aria-live").removeAttr("aria-busy").removeAttr("aria-selected").removeAttr("aria-labelledby").removeAttr("aria-hidden").removeAttr("aria-expanded").removeAttr("role")}),this.tabs.each(function(){var t=e(this),i=t.data("ui-tabs-aria-controls");i?t.attr("aria-controls",i).removeData("ui-tabs-aria-controls"):t.removeAttr("aria-controls")}),this.panels.show(),"content"!==this.options.heightStyle&&this.panels.css("height","")},enable:function(t){var i=this.options.disabled;i!==!1&&(void 0===t?i=!1:(t=this._getIndex(t),i=e.isArray(i)?e.map(i,function(e){return e!==t?e:null}):e.map(this.tabs,function(e,i){return i!==t?i:null})),this._setupDisabled(i))},disable:function(t){var i=this.options.disabled;if(i!==!0){if(void 0===t)i=!0;else{if(t=this._getIndex(t),-1!==e.inArray(t,i))return;i=e.isArray(i)?e.merge([t],i).sort():[t]}this._setupDisabled(i)}},load:function(t,i){t=this._getIndex(t);var s=this,n=this.tabs.eq(t),a=n.find(".ui-tabs-anchor"),o=this._getPanelForTab(n),r={tab:n,panel:o},h=function(e,t){"abort"===t&&s.panels.stop(!1,!0),n.removeClass("ui-tabs-loading"),o.removeAttr("aria-busy"),e===s.xhr&&delete s.xhr};this._isLocal(a[0])||(this.xhr=e.ajax(this._ajaxSettings(a,i,r)),this.xhr&&"canceled"!==this.xhr.statusText&&(n.addClass("ui-tabs-loading"),o.attr("aria-busy","true"),this.xhr.done(function(e,t,n){setTimeout(function(){o.html(e),s._trigger("load",i,r),h(n,t)},1)}).fail(function(e,t){setTimeout(function(){h(e,t)},1)})))},_ajaxSettings:function(t,i,s){var n=this;return{url:t.attr("href"),beforeSend:function(t,a){return n._trigger("beforeLoad",i,e.extend({jqXHR:t,ajaxSettings:a},s))}}},_getPanelForTab:function(t){var i=e(t).attr("aria-controls");return this.element.find(this._sanitizeSelector("#"+i))}}),e.widget("ui.tooltip",{version:"1.11.4",options:{content:function(){var t=e(this).attr("title")||"";return e("<a>").text(t).html()},hide:!0,items:"[title]:not([disabled])",position:{my:"left top+15",at:"left bottom",collision:"flipfit flip"},show:!0,tooltipClass:null,track:!1,close:null,open:null},_addDescribedBy:function(t,i){var s=(t.attr("aria-describedby")||"").split(/\s+/);s.push(i),t.data("ui-tooltip-id",i).attr("aria-describedby",e.trim(s.join(" ")))},_removeDescribedBy:function(t){var i=t.data("ui-tooltip-id"),s=(t.attr("aria-describedby")||"").split(/\s+/),n=e.inArray(i,s);-1!==n&&s.splice(n,1),t.removeData("ui-tooltip-id"),s=e.trim(s.join(" ")),s?t.attr("aria-describedby",s):t.removeAttr("aria-describedby")},_create:function(){this._on({mouseover:"open",focusin:"open"}),this.tooltips={},this.parents={},this.options.disabled&&this._disable(),this.liveRegion=e("<div>").attr({role:"log","aria-live":"assertive","aria-relevant":"additions"}).addClass("ui-helper-hidden-accessible").appendTo(this.document[0].body)},_setOption:function(t,i){var s=this;return"disabled"===t?(this[i?"_disable":"_enable"](),this.options[t]=i,void 0):(this._super(t,i),"content"===t&&e.each(this.tooltips,function(e,t){s._updateContent(t.element)}),void 0)},_disable:function(){var t=this;e.each(this.tooltips,function(i,s){var n=e.Event("blur");n.target=n.currentTarget=s.element[0],t.close(n,!0)}),this.element.find(this.options.items).addBack().each(function(){var t=e(this);t.is("[title]")&&t.data("ui-tooltip-title",t.attr("title")).removeAttr("title")})},_enable:function(){this.element.find(this.options.items).addBack().each(function(){var t=e(this);t.data("ui-tooltip-title")&&t.attr("title",t.data("ui-tooltip-title"))})},open:function(t){var i=this,s=e(t?t.target:this.element).closest(this.options.items);s.length&&!s.data("ui-tooltip-id")&&(s.attr("title")&&s.data("ui-tooltip-title",s.attr("title")),s.data("ui-tooltip-open",!0),t&&"mouseover"===t.type&&s.parents().each(function(){var t,s=e(this);s.data("ui-tooltip-open")&&(t=e.Event("blur"),t.target=t.currentTarget=this,i.close(t,!0)),s.attr("title")&&(s.uniqueId(),i.parents[this.id]={element:this,title:s.attr("title")},s.attr("title",""))}),this._registerCloseHandlers(t,s),this._updateContent(s,t))},_updateContent:function(e,t){var i,s=this.options.content,n=this,a=t?t.type:null;return"string"==typeof s?this._open(t,e,s):(i=s.call(e[0],function(i){n._delay(function(){e.data("ui-tooltip-open")&&(t&&(t.type=a),this._open(t,e,i))})}),i&&this._open(t,e,i),void 0)},_open:function(t,i,s){function n(e){l.of=e,o.is(":hidden")||o.position(l)}var a,o,r,h,l=e.extend({},this.options.position);if(s){if(a=this._find(i))return a.tooltip.find(".ui-tooltip-content").html(s),void 0;i.is("[title]")&&(t&&"mouseover"===t.type?i.attr("title",""):i.removeAttr("title")),a=this._tooltip(i),o=a.tooltip,this._addDescribedBy(i,o.attr("id")),o.find(".ui-tooltip-content").html(s),this.liveRegion.children().hide(),s.clone?(h=s.clone(),h.removeAttr("id").find("[id]").removeAttr("id")):h=s,e("<div>").html(h).appendTo(this.liveRegion),this.options.track&&t&&/^mouse/.test(t.type)?(this._on(this.document,{mousemove:n}),n(t)):o.position(e.extend({of:i},this.options.position)),o.hide(),this._show(o,this.options.show),this.options.show&&this.options.show.delay&&(r=this.delayedShow=setInterval(function(){o.is(":visible")&&(n(l.of),clearInterval(r))},e.fx.interval)),this._trigger("open",t,{tooltip:o})}},_registerCloseHandlers:function(t,i){var s={keyup:function(t){if(t.keyCode===e.ui.keyCode.ESCAPE){var s=e.Event(t);s.currentTarget=i[0],this.close(s,!0)}}};i[0]!==this.element[0]&&(s.remove=function(){this._removeTooltip(this._find(i).tooltip)}),t&&"mouseover"!==t.type||(s.mouseleave="close"),t&&"focusin"!==t.type||(s.focusout="close"),this._on(!0,i,s)},close:function(t){var i,s=this,n=e(t?t.currentTarget:this.element),a=this._find(n);return a?(i=a.tooltip,a.closing||(clearInterval(this.delayedShow),n.data("ui-tooltip-title")&&!n.attr("title")&&n.attr("title",n.data("ui-tooltip-title")),this._removeDescribedBy(n),a.hiding=!0,i.stop(!0),this._hide(i,this.options.hide,function(){s._removeTooltip(e(this))}),n.removeData("ui-tooltip-open"),this._off(n,"mouseleave focusout keyup"),n[0]!==this.element[0]&&this._off(n,"remove"),this._off(this.document,"mousemove"),t&&"mouseleave"===t.type&&e.each(this.parents,function(t,i){e(i.element).attr("title",i.title),delete s.parents[t]}),a.closing=!0,this._trigger("close",t,{tooltip:i}),a.hiding||(a.closing=!1)),void 0):(n.removeData("ui-tooltip-open"),void 0)},_tooltip:function(t){var i=e("<div>").attr("role","tooltip").addClass("ui-tooltip ui-widget ui-corner-all ui-widget-content "+(this.options.tooltipClass||"")),s=i.uniqueId().attr("id");return e("<div>").addClass("ui-tooltip-content").appendTo(i),i.appendTo(this.document[0].body),this.tooltips[s]={element:t,tooltip:i}},_find:function(e){var t=e.data("ui-tooltip-id");return t?this.tooltips[t]:null},_removeTooltip:function(e){e.remove(),delete this.tooltips[e.attr("id")]},_destroy:function(){var t=this;e.each(this.tooltips,function(i,s){var n=e.Event("blur"),a=s.element;n.target=n.currentTarget=a[0],t.close(n,!0),e("#"+i).remove(),a.data("ui-tooltip-title")&&(a.attr("title")||a.attr("title",a.data("ui-tooltip-title")),a.removeData("ui-tooltip-title"))}),this.liveRegion.remove()}})});jquery/images/ui-bg_highlight-soft_75_cccccc_1x100.png000064400000000172151215013500016457 0ustar00�PNG


IHDRd2��AIDATxcz|����.��{&{�_��'0���4ӿ3 � s����I�J��4��=p��G&a��!IEND�B`�jquery/images/ui-bg_glass_95_fef1ec_1x400.png000064400000000147151215013500014607 0ustar00�PNG


IHDR��:��.IDATxc���<�G�(���###��A46\�H�Q<�d�	V�
IEND�B`�jquery/images/ui-icons_2e83ff_256x240.png000064400000007257151215013500013657 0ustar00�PNG


IHDR��IJ�PLTE.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.����oZtRNS�3P���/"Uq@f`2�
!<BHK Z#'1S,�4���j���8E���|��������)��Q$�
��b�J��mߜGc?o�h�#�-�IDATx���v�8�a��ϼ�1�ȩ����&0���0w���7w@���VT���q�- &�j���b�[0�}+��9��fz����)d�m�^�&�����?�k0�<r�
h
����%FAP�b/��
�!�W���a�ax�;��׍�wT���P�e}�%Y@���ܯ�T��CY_q#��3��*��]ŕ��pu~f�~|=����5瀹
�0�0<=ޗ
�}_�@�vG���eA�����e��mCnj��0~ߏ�C��@l{!
�]A� �����;�;����A``9�u��%�k�f��,����j;B�q}AgHʹ�W�w��`
�0�0$E�w�+8р��W<V�
h��P��YI�t����Uzs�~��
����E*��D�}�9�������g�Yd�+XN
�{��?F~葟2��l06�A�
8)�t
/ɴ��+��h�X�!PԕC�?�+"N������$��Qs�i)�W��9��#�A����a�a�Ϥ�f�������=T�暇�L��Z6L�P�g�Ů��,�{�{aH�~ld�H�N��q͌Y��"��(�)�Bm?_���Ѣ�6�ZP�B��g\c@dD�����O��E��(��x@��!��r=���9^��>g�an�ቮ�����}��u��LlS�����^�u,����N2���a�!���hܧ{����l3�_ǀ=����r/t�v�����8�Ǭ���A�+�-�Z?�ӛɎ��s@�����p������V�����8�e�z"���a����C�m#���w7c�A�J�3MJ�1����?��9X��f�ж��z�:�@* 궹�8�>����~��k�Wb�Y�~UP�M ���{��Ÿ��-`%�_�%X P��$&d/f�M�^��;+t{��uQQTE��

f]1`r�-��u.p��;$	P���4=E�r�2P\�@qp�i��L(����H8,����`7��3r@I�C��sDw�8l8xp�N?��p�u��`x$
�0
���@���i�D9e�R�(������>�3E��"��qI��{$�Ƚ F��t4B�<?0��PN��4��$�7n��A�=� ��j�Is�s�
��9���͛Pd; N�r�.<����QŃU��u�B+x�CP�
��X��hO��Z�(r��D2N	�t�ɪ��+*�.���nj�������_lt�	0�ٓ����ۼ{��&Pk{�؜������~��50000pex�i� (H�~"Q+���H�'+��۳����,(����!�K�4i�1�	��*���	L���f���$�3��~���
\�1�	�L4� ��]�@3o�6���x������$&����^2�������a�j�ir;0i}��T�3"@$��F/�x���n�I�����^�5^�@�r�Tꅊ�_�b �z{O�&���&\ȵ�Z.	����
�&����@o�-�]��u@�J�u@C�Z�$������wd����biMi<��釫�?!��.���c<�*r��9�L�nG�?=�<E�9P���p����େ���ʧ��[�I�2�!`���&0�@�$����,ϤH�CxJ	k]�~���H����i����
�gy��Q:����u�����a����$��Ӡ�
��t�����A�Z��k������;I	���<�H����M`)iI��#hx�O?��3>Jvg���s$-㥗xl�yޢdE�ܿP�]�b\��w��@C���Xj�����_"�eI���ܸ�Sd�~!����P�f����s���K��m_}��'_��KQ7�(@���6퓾���	$�2=%��e�
#W��^P)M �?�
�3�L�
0��=@�9��)�dB�Rs�0���J�XTU��d�_Q.������^��#��{���,�a���#�d���G^ye�ʂ#��s��x{������jy�\�a���@瘟���'�|��1`�8;�Q�yY���=��/��P%,�2X�s�$���d؋tx�էk��P��b���ip�g�c��겜L�i�ZԡM��G�ʞ��i���(�`��V��%l]Q�$�<(�'6���F���)����H,��u�����$��I��������v(�D~���tu�	~��3+~�U�Q�GW������~j9jm��]6@X���뺿}�RSg�셼3��fn��l	k�W�|�P�}p���7�죠;B�Z�&������ϔ#hB��&���;@͊:���/�d�՟
 tZ�BR��"�ٌ����I�`�o�v?�!`5|���
l�V�������x9;���o[g	�I�n��z��M�.���7��;�2�x�%���wHl�k�|�x�%�"	�xB:C=g���7�|r1S����Z]G^��+�Et��v����i6=@W����6�d���Tn�4�n��8��K���+�t��ǀK{���,0\��
�}$8
W�~�⯚ ����J��?���R��-�K%�1>�ϸ�ߕ^����B���kLPm!�aQ�~��C{��u�^P`~�9�GD����3L�MG�|�ht�6�)��Ng�M�;;@�hDž%��M����~w2���0�*��.�K;V���P����[>��T??U�z����?D��������u�ݦ�׷_�`�������_�.���sH�w�~_���{s��t[�۞��;}&)u�Z�Z����K��.k����7]¹����?���: -`����q~�~w;,z�/�w~������[���L����6w�ؠ����MӷC���X�!=�B��`���5��RxWfzf��w�����5�4�׷�e�2~}��<�����ۉ��[�{�3X�;�� uPB�V@��|@H��Cc�p���нB����?ҽ�H����L�W��^�f0��L�zQ�/��n�#_?���V?���@d�*g�L�W�:��'ǀ������9�����h@IEND�B`�jquery/images/ui-bg_glass_55_fbf9ee_1x400.png000064400000000147151215013500014612 0ustar00�PNG


IHDR��:��.IDATxc��<�G�(���###�#*͈�3���x�bY@	E�0IEND�B`�jquery/images/ui-icons_454545_256x240.png000064400000007257151215013500013434 0ustar00�PNG


IHDR��IJ�PLTEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEv��\ZtRNS�3P���/"Uq@f`2�
!<BHK Z#'1S,�4���j���8E���|��������)��Q$�
��b�J��mߜGc?o�h�#�-�IDATx���v�8�a��ϼ�1�ȩ����&0���0w���7w@���VT���q�- &�j���b�[0�}+��9��fz����)d�m�^�&�����?�k0�<r�
h
����%FAP�b/��
�!�W���a�ax�;��׍�wT���P�e}�%Y@���ܯ�T��CY_q#��3��*��]ŕ��pu~f�~|=����5瀹
�0�0<=ޗ
�}_�@�vG���eA�����e��mCnj��0~ߏ�C��@l{!
�]A� �����;�;����A``9�u��%�k�f��,����j;B�q}AgHʹ�W�w��`
�0�0$E�w�+8р��W<V�
h��P��YI�t����Uzs�~��
����E*��D�}�9�������g�Yd�+XN
�{��?F~葟2��l06�A�
8)�t
/ɴ��+��h�X�!PԕC�?�+"N������$��Qs�i)�W��9��#�A����a�a�Ϥ�f�������=T�暇�L��Z6L�P�g�Ů��,�{�{aH�~ld�H�N��q͌Y��"��(�)�Bm?_���Ѣ�6�ZP�B��g\c@dD�����O��E��(��x@��!��r=���9^��>g�an�ቮ�����}��u��LlS�����^�u,����N2���a�!���hܧ{����l3�_ǀ=����r/t�v�����8�Ǭ���A�+�-�Z?�ӛɎ��s@�����p������V�����8�e�z"���a����C�m#���w7c�A�J�3MJ�1����?��9X��f�ж��z�:�@* 궹�8�>����~��k�Wb�Y�~UP�M ���{��Ÿ��-`%�_�%X P��$&d/f�M�^��;+t{��uQQTE��

f]1`r�-��u.p��;$	P���4=E�r�2P\�@qp�i��L(����H8,����`7��3r@I�C��sDw�8l8xp�N?��p�u��`x$
�0
���@���i�D9e�R�(������>�3E��"��qI��{$�Ƚ F��t4B�<?0��PN��4��$�7n��A�=� ��j�Is�s�
��9���͛Pd; N�r�.<����QŃU��u�B+x�CP�
��X��hO��Z�(r��D2N	�t�ɪ��+*�.���nj�������_lt�	0�ٓ����ۼ{��&Pk{�؜������~��50000pex�i� (H�~"Q+���H�'+��۳����,(����!�K�4i�1�	��*���	L���f���$�3��~���
\�1�	�L4� ��]�@3o�6���x������$&����^2�������a�j�ir;0i}��T�3"@$��F/�x���n�I�����^�5^�@�r�Tꅊ�_�b �z{O�&���&\ȵ�Z.	����
�&����@o�-�]��u@�J�u@C�Z�$������wd����biMi<��釫�?!��.���c<�*r��9�L�nG�?=�<E�9P���p����େ���ʧ��[�I�2�!`���&0�@�$����,ϤH�CxJ	k]�~���H����i����
�gy��Q:����u�����a����$��Ӡ�
��t�����A�Z��k������;I	���<�H����M`)iI��#hx�O?��3>Jvg���s$-㥗xl�yޢdE�ܿP�]�b\��w��@C���Xj�����_"�eI���ܸ�Sd�~!����P�f����s���K��m_}��'_��KQ7�(@���6퓾���	$�2=%��e�
#W��^P)M �?�
�3�L�
0��=@�9��)�dB�Rs�0���J�XTU��d�_Q.������^��#��{���,�a���#�d���G^ye�ʂ#��s��x{������jy�\�a���@瘟���'�|��1`�8;�Q�yY���=��/��P%,�2X�s�$���d؋tx�էk��P��b���ip�g�c��겜L�i�ZԡM��G�ʞ��i���(�`��V��%l]Q�$�<(�'6���F���)����H,��u�����$��I��������v(�D~���tu�	~��3+~�U�Q�GW������~j9jm��]6@X���뺿}�RSg�셼3��fn��l	k�W�|�P�}p���7�죠;B�Z�&������ϔ#hB��&���;@͊:���/�d�՟
 tZ�BR��"�ٌ����I�`�o�v?�!`5|���
l�V�������x9;���o[g	�I�n��z��M�.���7��;�2�x�%���wHl�k�|�x�%�"	�xB:C=g���7�|r1S����Z]G^��+�Et��v����i6=@W����6�d���Tn�4�n��8��K���+�t��ǀK{���,0\��
�}$8
W�~�⯚ ����J��?���R��-�K%�1>�ϸ�ߕ^����B���kLPm!�aQ�~��C{��u�^P`~�9�GD����3L�MG�|�ht�6�)��Ng�M�;;@�hDž%��M����~w2���0�*��.�K;V���P����[>��T??U�z����?D��������u�ݦ�׷_�`�������_�.���sH�w�~_���{s��t[�۞��;}&)u�Z�Z����K��.k����7]¹����?���: -`����q~�~w;,z�/�w~������[���L����6w�ؠ����MӷC���X�!=�B��`���5��RxWfzf��w�����5�4�׷�e�2~}��<�����ۉ��[�{�3X�;�� uPB�V@��|@H��Cc�p���нB����?ҽ�H����L�W��^�f0��L�zQ�/��n�#_?���V?���@d�*g�L�W�:��'ǀ������9�����h@IEND�B`�jquery/images/ui-bg_glass_65_ffffff_1x400.png000064400000000111151215013500014665 0ustar00�PNG


IHDR�G#7vIDATxch�G�(��h���o�IEND�B`�jquery/images/ui-icons_222222_256x240.png000064400000007257151215013500013415 0ustar00�PNG


IHDR��IJ�PLTE"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""���SZtRNS�3P���/"Uq@f`2�
!<BHK Z#'1S,�4���j���8E���|��������)��Q$�
��b�J��mߜGc?o�h�#�-�IDATx���v�8�a��ϼ�1�ȩ����&0���0w���7w@���VT���q�- &�j���b�[0�}+��9��fz����)d�m�^�&�����?�k0�<r�
h
����%FAP�b/��
�!�W���a�ax�;��׍�wT���P�e}�%Y@���ܯ�T��CY_q#��3��*��]ŕ��pu~f�~|=����5瀹
�0�0<=ޗ
�}_�@�vG���eA�����e��mCnj��0~ߏ�C��@l{!
�]A� �����;�;����A``9�u��%�k�f��,����j;B�q}AgHʹ�W�w��`
�0�0$E�w�+8р��W<V�
h��P��YI�t����Uzs�~��
����E*��D�}�9�������g�Yd�+XN
�{��?F~葟2��l06�A�
8)�t
/ɴ��+��h�X�!PԕC�?�+"N������$��Qs�i)�W��9��#�A����a�a�Ϥ�f�������=T�暇�L��Z6L�P�g�Ů��,�{�{aH�~ld�H�N��q͌Y��"��(�)�Bm?_���Ѣ�6�ZP�B��g\c@dD�����O��E��(��x@��!��r=���9^��>g�an�ቮ�����}��u��LlS�����^�u,����N2���a�!���hܧ{����l3�_ǀ=����r/t�v�����8�Ǭ���A�+�-�Z?�ӛɎ��s@�����p������V�����8�e�z"���a����C�m#���w7c�A�J�3MJ�1����?��9X��f�ж��z�:�@* 궹�8�>����~��k�Wb�Y�~UP�M ���{��Ÿ��-`%�_�%X P��$&d/f�M�^��;+t{��uQQTE��

f]1`r�-��u.p��;$	P���4=E�r�2P\�@qp�i��L(����H8,����`7��3r@I�C��sDw�8l8xp�N?��p�u��`x$
�0
���@���i�D9e�R�(������>�3E��"��qI��{$�Ƚ F��t4B�<?0��PN��4��$�7n��A�=� ��j�Is�s�
��9���͛Pd; N�r�.<����QŃU��u�B+x�CP�
��X��hO��Z�(r��D2N	�t�ɪ��+*�.���nj�������_lt�	0�ٓ����ۼ{��&Pk{�؜������~��50000pex�i� (H�~"Q+���H�'+��۳����,(����!�K�4i�1�	��*���	L���f���$�3��~���
\�1�	�L4� ��]�@3o�6���x������$&����^2�������a�j�ir;0i}��T�3"@$��F/�x���n�I�����^�5^�@�r�Tꅊ�_�b �z{O�&���&\ȵ�Z.	����
�&����@o�-�]��u@�J�u@C�Z�$������wd����biMi<��釫�?!��.���c<�*r��9�L�nG�?=�<E�9P���p����େ���ʧ��[�I�2�!`���&0�@�$����,ϤH�CxJ	k]�~���H����i����
�gy��Q:����u�����a����$��Ӡ�
��t�����A�Z��k������;I	���<�H����M`)iI��#hx�O?��3>Jvg���s$-㥗xl�yޢdE�ܿP�]�b\��w��@C���Xj�����_"�eI���ܸ�Sd�~!����P�f����s���K��m_}��'_��KQ7�(@���6퓾���	$�2=%��e�
#W��^P)M �?�
�3�L�
0��=@�9��)�dB�Rs�0���J�XTU��d�_Q.������^��#��{���,�a���#�d���G^ye�ʂ#��s��x{������jy�\�a���@瘟���'�|��1`�8;�Q�yY���=��/��P%,�2X�s�$���d؋tx�էk��P��b���ip�g�c��겜L�i�ZԡM��G�ʞ��i���(�`��V��%l]Q�$�<(�'6���F���)����H,��u�����$��I��������v(�D~���tu�	~��3+~�U�Q�GW������~j9jm��]6@X���뺿}�RSg�셼3��fn��l	k�W�|�P�}p���7�죠;B�Z�&������ϔ#hB��&���;@͊:���/�d�՟
 tZ�BR��"�ٌ����I�`�o�v?�!`5|���
l�V�������x9;���o[g	�I�n��z��M�.���7��;�2�x�%���wHl�k�|�x�%�"	�xB:C=g���7�|r1S����Z]G^��+�Et��v����i6=@W����6�d���Tn�4�n��8��K���+�t��ǀK{���,0\��
�}$8
W�~�⯚ ����J��?���R��-�K%�1>�ϸ�ߕ^����B���kLPm!�aQ�~��C{��u�^P`~�9�GD����3L�MG�|�ht�6�)��Ng�M�;;@�hDž%��M����~w2���0�*��.�K;V���P����[>��T??U�z����?D��������u�ݦ�׷_�`�������_�.���sH�w�~_���{s��t[�۞��;}&)u�Z�Z����K��.k����7]¹����?���: -`����q~�~w;,z�/�w~������[���L����6w�ؠ����MӷC���X�!=�B��`���5��RxWfzf��w�����5�4�׷�e�2~}��<�����ۉ��[�{�3X�;�� uPB�V@��|@H��Cc�p���нB����?ҽ�H����L�W��^�f0��L�zQ�/��n�#_?���V?���@d�*g�L�W�:��'ǀ������9�����h@IEND�B`�jquery/images/ui-icons_888888_256x240.png000064400000007257151215013500013461 0ustar00�PNG


IHDR��IJ�PLTE���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#b|�ZtRNS�3P���/"Uq@f`2�
!<BHK Z#'1S,�4���j���8E���|��������)��Q$�
��b�J��mߜGc?o�h�#�-�IDATx���v�8�a��ϼ�1�ȩ����&0���0w���7w@���VT���q�- &�j���b�[0�}+��9��fz����)d�m�^�&�����?�k0�<r�
h
����%FAP�b/��
�!�W���a�ax�;��׍�wT���P�e}�%Y@���ܯ�T��CY_q#��3��*��]ŕ��pu~f�~|=����5瀹
�0�0<=ޗ
�}_�@�vG���eA�����e��mCnj��0~ߏ�C��@l{!
�]A� �����;�;����A``9�u��%�k�f��,����j;B�q}AgHʹ�W�w��`
�0�0$E�w�+8р��W<V�
h��P��YI�t����Uzs�~��
����E*��D�}�9�������g�Yd�+XN
�{��?F~葟2��l06�A�
8)�t
/ɴ��+��h�X�!PԕC�?�+"N������$��Qs�i)�W��9��#�A����a�a�Ϥ�f�������=T�暇�L��Z6L�P�g�Ů��,�{�{aH�~ld�H�N��q͌Y��"��(�)�Bm?_���Ѣ�6�ZP�B��g\c@dD�����O��E��(��x@��!��r=���9^��>g�an�ቮ�����}��u��LlS�����^�u,����N2���a�!���hܧ{����l3�_ǀ=����r/t�v�����8�Ǭ���A�+�-�Z?�ӛɎ��s@�����p������V�����8�e�z"���a����C�m#���w7c�A�J�3MJ�1����?��9X��f�ж��z�:�@* 궹�8�>����~��k�Wb�Y�~UP�M ���{��Ÿ��-`%�_�%X P��$&d/f�M�^��;+t{��uQQTE��

f]1`r�-��u.p��;$	P���4=E�r�2P\�@qp�i��L(����H8,����`7��3r@I�C��sDw�8l8xp�N?��p�u��`x$
�0
���@���i�D9e�R�(������>�3E��"��qI��{$�Ƚ F��t4B�<?0��PN��4��$�7n��A�=� ��j�Is�s�
��9���͛Pd; N�r�.<����QŃU��u�B+x�CP�
��X��hO��Z�(r��D2N	�t�ɪ��+*�.���nj�������_lt�	0�ٓ����ۼ{��&Pk{�؜������~��50000pex�i� (H�~"Q+���H�'+��۳����,(����!�K�4i�1�	��*���	L���f���$�3��~���
\�1�	�L4� ��]�@3o�6���x������$&����^2�������a�j�ir;0i}��T�3"@$��F/�x���n�I�����^�5^�@�r�Tꅊ�_�b �z{O�&���&\ȵ�Z.	����
�&����@o�-�]��u@�J�u@C�Z�$������wd����biMi<��釫�?!��.���c<�*r��9�L�nG�?=�<E�9P���p����େ���ʧ��[�I�2�!`���&0�@�$����,ϤH�CxJ	k]�~���H����i����
�gy��Q:����u�����a����$��Ӡ�
��t�����A�Z��k������;I	���<�H����M`)iI��#hx�O?��3>Jvg���s$-㥗xl�yޢdE�ܿP�]�b\��w��@C���Xj�����_"�eI���ܸ�Sd�~!����P�f����s���K��m_}��'_��KQ7�(@���6퓾���	$�2=%��e�
#W��^P)M �?�
�3�L�
0��=@�9��)�dB�Rs�0���J�XTU��d�_Q.������^��#��{���,�a���#�d���G^ye�ʂ#��s��x{������jy�\�a���@瘟���'�|��1`�8;�Q�yY���=��/��P%,�2X�s�$���d؋tx�էk��P��b���ip�g�c��겜L�i�ZԡM��G�ʞ��i���(�`��V��%l]Q�$�<(�'6���F���)����H,��u�����$��I��������v(�D~���tu�	~��3+~�U�Q�GW������~j9jm��]6@X���뺿}�RSg�셼3��fn��l	k�W�|�P�}p���7�죠;B�Z�&������ϔ#hB��&���;@͊:���/�d�՟
 tZ�BR��"�ٌ����I�`�o�v?�!`5|���
l�V�������x9;���o[g	�I�n��z��M�.���7��;�2�x�%���wHl�k�|�x�%�"	�xB:C=g���7�|r1S����Z]G^��+�Et��v����i6=@W����6�d���Tn�4�n��8��K���+�t��ǀK{���,0\��
�}$8
W�~�⯚ ����J��?���R��-�K%�1>�ϸ�ߕ^����B���kLPm!�aQ�~��C{��u�^P`~�9�GD����3L�MG�|�ht�6�)��Ng�M�;;@�hDž%��M����~w2���0�*��.�K;V���P����[>��T??U�z����?D��������u�ݦ�׷_�`�������_�.���sH�w�~_���{s��t[�۞��;}&)u�Z�Z����K��.k����7]¹����?���: -`����q~�~w;,z�/�w~������[���L����6w�ؠ����MӷC���X�!=�B��`���5��RxWfzf��w�����5�4�׷�e�2~}��<�����ۉ��[�{�3X�;�� uPB�V@��|@H��Cc�p���нB����?ҽ�H����L�W��^�f0��L�zQ�/��n�#_?���V?���@d�*g�L�W�:��'ǀ������9�����h@IEND�B`�jquery/images/ui-bg_glass_75_dadada_1x400.png000064400000000175151215013500014653 0ustar00�PNG


IHDR���DDIDATx�cx���h��[�����řM����r�;��ڙs�����⿙��d��Q4�`C��m��NIEND�B`�jquery/images/ui-icons_cd0a0a_256x240.png000064400000007257151215013500013712 0ustar00�PNG


IHDR��IJ�PLTE�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

4�v�ZtRNS�3P���/"Uq@f`2�
!<BHK Z#'1S,�4���j���8E���|��������)��Q$�
��b�J��mߜGc?o�h�#�-�IDATx���v�8�a��ϼ�1�ȩ����&0���0w���7w@���VT���q�- &�j���b�[0�}+��9��fz����)d�m�^�&�����?�k0�<r�
h
����%FAP�b/��
�!�W���a�ax�;��׍�wT���P�e}�%Y@���ܯ�T��CY_q#��3��*��]ŕ��pu~f�~|=����5瀹
�0�0<=ޗ
�}_�@�vG���eA�����e��mCnj��0~ߏ�C��@l{!
�]A� �����;�;����A``9�u��%�k�f��,����j;B�q}AgHʹ�W�w��`
�0�0$E�w�+8р��W<V�
h��P��YI�t����Uzs�~��
����E*��D�}�9�������g�Yd�+XN
�{��?F~葟2��l06�A�
8)�t
/ɴ��+��h�X�!PԕC�?�+"N������$��Qs�i)�W��9��#�A����a�a�Ϥ�f�������=T�暇�L��Z6L�P�g�Ů��,�{�{aH�~ld�H�N��q͌Y��"��(�)�Bm?_���Ѣ�6�ZP�B��g\c@dD�����O��E��(��x@��!��r=���9^��>g�an�ቮ�����}��u��LlS�����^�u,����N2���a�!���hܧ{����l3�_ǀ=����r/t�v�����8�Ǭ���A�+�-�Z?�ӛɎ��s@�����p������V�����8�e�z"���a����C�m#���w7c�A�J�3MJ�1����?��9X��f�ж��z�:�@* 궹�8�>����~��k�Wb�Y�~UP�M ���{��Ÿ��-`%�_�%X P��$&d/f�M�^��;+t{��uQQTE��

f]1`r�-��u.p��;$	P���4=E�r�2P\�@qp�i��L(����H8,����`7��3r@I�C��sDw�8l8xp�N?��p�u��`x$
�0
���@���i�D9e�R�(������>�3E��"��qI��{$�Ƚ F��t4B�<?0��PN��4��$�7n��A�=� ��j�Is�s�
��9���͛Pd; N�r�.<����QŃU��u�B+x�CP�
��X��hO��Z�(r��D2N	�t�ɪ��+*�.���nj�������_lt�	0�ٓ����ۼ{��&Pk{�؜������~��50000pex�i� (H�~"Q+���H�'+��۳����,(����!�K�4i�1�	��*���	L���f���$�3��~���
\�1�	�L4� ��]�@3o�6���x������$&����^2�������a�j�ir;0i}��T�3"@$��F/�x���n�I�����^�5^�@�r�Tꅊ�_�b �z{O�&���&\ȵ�Z.	����
�&����@o�-�]��u@�J�u@C�Z�$������wd����biMi<��釫�?!��.���c<�*r��9�L�nG�?=�<E�9P���p����େ���ʧ��[�I�2�!`���&0�@�$����,ϤH�CxJ	k]�~���H����i����
�gy��Q:����u�����a����$��Ӡ�
��t�����A�Z��k������;I	���<�H����M`)iI��#hx�O?��3>Jvg���s$-㥗xl�yޢdE�ܿP�]�b\��w��@C���Xj�����_"�eI���ܸ�Sd�~!����P�f����s���K��m_}��'_��KQ7�(@���6퓾���	$�2=%��e�
#W��^P)M �?�
�3�L�
0��=@�9��)�dB�Rs�0���J�XTU��d�_Q.������^��#��{���,�a���#�d���G^ye�ʂ#��s��x{������jy�\�a���@瘟���'�|��1`�8;�Q�yY���=��/��P%,�2X�s�$���d؋tx�էk��P��b���ip�g�c��겜L�i�ZԡM��G�ʞ��i���(�`��V��%l]Q�$�<(�'6���F���)����H,��u�����$��I��������v(�D~���tu�	~��3+~�U�Q�GW������~j9jm��]6@X���뺿}�RSg�셼3��fn��l	k�W�|�P�}p���7�죠;B�Z�&������ϔ#hB��&���;@͊:���/�d�՟
 tZ�BR��"�ٌ����I�`�o�v?�!`5|���
l�V�������x9;���o[g	�I�n��z��M�.���7��;�2�x�%���wHl�k�|�x�%�"	�xB:C=g���7�|r1S����Z]G^��+�Et��v����i6=@W����6�d���Tn�4�n��8��K���+�t��ǀK{���,0\��
�}$8
W�~�⯚ ����J��?���R��-�K%�1>�ϸ�ߕ^����B���kLPm!�aQ�~��C{��u�^P`~�9�GD����3L�MG�|�ht�6�)��Ng�M�;;@�hDž%��M����~w2���0�*��.�K;V���P����[>��T??U�z����?D��������u�ݦ�׷_�`�������_�.���sH�w�~_���{s��t[�۞��;}&)u�Z�Z����K��.k����7]¹����?���: -`����q~�~w;,z�/�w~������[���L����6w�ؠ����MӷC���X�!=�B��`���5��RxWfzf��w�����5�4�׷�e�2~}��<�����ۉ��[�{�3X�;�� uPB�V@��|@H��Cc�p���нB����?ҽ�H����L�W��^�f0��L�zQ�/��n�#_?���V?���@d�*g�L�W�:��'ǀ������9�����h@IEND�B`�jquery/images/ui-bg_glass_75_e6e6e6_1x400.png000064400000000171151215013500014451 0ustar00�PNG


IHDR���D@IDAT8�cz���0�F�я
&F&�UL�{�/01~eb������	f��A� �L£!6��A�D%`�IEND�B`�index.php000064400000000000151215013500006343 0ustar00codemirror/mode/haskell-literate/index.html000064400000022245151215013500015062 0ustar00<!doctype html>

<title>CodeMirror: Haskell-literate mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="haskell-literate.js"></script>
<script src="../haskell/haskell.js"></script>
<style>.CodeMirror {
  border-top    : 1px solid #DDDDDD;
  border-bottom : 1px solid #DDDDDD;
}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo
                                                          src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Haskell-literate</a>
  </ul>
</div>

<article>
  <h2>Haskell literate mode</h2>
  <form>
    <textarea id="code" name="code">
> {-# LANGUAGE OverloadedStrings #-}
> {-# OPTIONS_GHC -fno-warn-unused-do-bind #-}
> import Control.Applicative ((<$>), (<*>))
> import Data.Maybe (isJust)

> import Data.Text (Text)
> import Text.Blaze ((!))
> import qualified Data.Text as T
> import qualified Happstack.Server as Happstack
> import qualified Text.Blaze.Html5 as H
> import qualified Text.Blaze.Html5.Attributes as A

> import Text.Digestive
> import Text.Digestive.Blaze.Html5
> import Text.Digestive.Happstack
> import Text.Digestive.Util

Simple forms and validation
---------------------------

Let's start by creating a very simple datatype to represent a user:

> data User = User
>     { userName :: Text
>     , userMail :: Text
>     } deriving (Show)

And dive in immediately to create a `Form` for a user. The `Form v m a` type
has three parameters:

- `v`: the type for messages and errors (usually a `String`-like type, `Text` in
  this case);
- `m`: the monad we are operating in, not specified here;
- `a`: the return type of the `Form`, in this case, this is obviously `User`.

> userForm :: Monad m => Form Text m User

We create forms by using the `Applicative` interface. A few form types are
provided in the `Text.Digestive.Form` module, such as `text`, `string`,
`bool`...

In the `digestive-functors` library, the developer is required to label each
field using the `.:` operator. This might look like a bit of a burden, but it
allows you to do some really useful stuff, like separating the `Form` from the
actual HTML layout.

> userForm = User
>     <$> "name" .: text Nothing
>     <*> "mail" .: check "Not a valid email address" checkEmail (text Nothing)

The `check` function enables you to validate the result of a form. For example,
we can validate the email address with a really naive `checkEmail` function.

> checkEmail :: Text -> Bool
> checkEmail = isJust . T.find (== '@')

More validation
---------------

For our example, we also want descriptions of Haskell libraries, and in order to
do that, we need package versions...

> type Version = [Int]

We want to let the user input a version number such as `0.1.0.0`. This means we
need to validate if the input `Text` is of this form, and then we need to parse
it to a `Version` type. Fortunately, we can do this in a single function:
`validate` allows conversion between values, which can optionally fail.

`readMaybe :: Read a => String -> Maybe a` is a utility function imported from
`Text.Digestive.Util`.

> validateVersion :: Text -> Result Text Version
> validateVersion = maybe (Error "Cannot parse version") Success .
>     mapM (readMaybe . T.unpack) . T.split (== '.')

A quick test in GHCi:

    ghci> validateVersion (T.pack "0.3.2.1")
    Success [0,3,2,1]
    ghci> validateVersion (T.pack "0.oops")
    Error "Cannot parse version"

It works! This means we can now easily add a `Package` type and a `Form` for it:

> data Category = Web | Text | Math
>     deriving (Bounded, Enum, Eq, Show)

> data Package = Package Text Version Category
>     deriving (Show)

> packageForm :: Monad m => Form Text m Package
> packageForm = Package
>     <$> "name"     .: text Nothing
>     <*> "version"  .: validate validateVersion (text (Just "0.0.0.1"))
>     <*> "category" .: choice categories Nothing
>   where
>     categories = [(x, T.pack (show x)) | x <- [minBound .. maxBound]]

Composing forms
---------------

A release has an author and a package. Let's use this to illustrate the
composability of the digestive-functors library: we can reuse the forms we have
written earlier on.

> data Release = Release User Package
>     deriving (Show)

> releaseForm :: Monad m => Form Text m Release
> releaseForm = Release
>     <$> "author"  .: userForm
>     <*> "package" .: packageForm

Views
-----

As mentioned before, one of the advantages of using digestive-functors is
separation of forms and their actual HTML layout. In order to do this, we have
another type, `View`.

We can get a `View` from a `Form` by supplying input. A `View` contains more
information than a `Form`, it has:

- the original form;
- the input given by the user;
- any errors that have occurred.

It is this view that we convert to HTML. For this tutorial, we use the
[blaze-html] library, and some helpers from the `digestive-functors-blaze`
library.

[blaze-html]: http://jaspervdj.be/blaze/

Let's write a view for the `User` form. As you can see, we here refer to the
different fields in the `userForm`. The `errorList` will generate a list of
errors for the `"mail"` field.

> userView :: View H.Html -> H.Html
> userView view = do
>     label     "name" view "Name: "
>     inputText "name" view
>     H.br
>
>     errorList "mail" view
>     label     "mail" view "Email address: "
>     inputText "mail" view
>     H.br

Like forms, views are also composable: let's illustrate that by adding a view
for the `releaseForm`, in which we reuse `userView`. In order to do this, we
take only the parts relevant to the author from the view by using `subView`. We
can then pass the resulting view to our own `userView`.
We have no special view code for `Package`, so we can just add that to
`releaseView` as well. `childErrorList` will generate a list of errors for each
child of the specified form. In this case, this means a list of errors from
`"package.name"` and `"package.version"`. Note how we use `foo.bar` to refer to
nested forms.

> releaseView :: View H.Html -> H.Html
> releaseView view = do
>     H.h2 "Author"
>     userView $ subView "author" view
>
>     H.h2 "Package"
>     childErrorList "package" view
>
>     label     "package.name" view "Name: "
>     inputText "package.name" view
>     H.br
>
>     label     "package.version" view "Version: "
>     inputText "package.version" view
>     H.br
>
>     label       "package.category" view "Category: "
>     inputSelect "package.category" view
>     H.br

The attentive reader might have wondered what the type parameter for `View` is:
it is the `String`-like type used for e.g. error messages.
But wait! We have
    releaseForm :: Monad m => Form Text m Release
    releaseView :: View H.Html -> H.Html
... doesn't this mean that we need a `View Text` rather than a `View Html`?  The
answer is yes -- but having `View Html` allows us to write these views more
easily with the `digestive-functors-blaze` library. Fortunately, we will be able
to fix this using the `Functor` instance of `View`.
    fmap :: Monad m => (v -> w) -> View v -> View w
A backend
---------
To finish this tutorial, we need to be able to actually run this code. We need
an HTTP server for that, and we use [Happstack] for this tutorial. The
`digestive-functors-happstack` library gives about everything we need for this.
[Happstack]: http://happstack.com/

> site :: Happstack.ServerPart Happstack.Response
> site = do
>     Happstack.decodeBody $ Happstack.defaultBodyPolicy "/tmp" 4096 4096 4096
>     r <- runForm "test" releaseForm
>     case r of
>         (view, Nothing) -> do
>             let view' = fmap H.toHtml view
>             Happstack.ok $ Happstack.toResponse $
>                 template $
>                     form view' "/" $ do
>                         releaseView view'
>                         H.br
>                         inputSubmit "Submit"
>         (_, Just release) -> Happstack.ok $ Happstack.toResponse $
>             template $ do
>                 css
>                 H.h1 "Release received"
>                 H.p $ H.toHtml $ show release
>
> main :: IO ()
> main = Happstack.simpleHTTP Happstack.nullConf site

Utilities
---------

> template :: H.Html -> H.Html
> template body = H.docTypeHtml $ do
>     H.head $ do
>         H.title "digestive-functors tutorial"
>         css
>     H.body body
> css :: H.Html
> css = H.style ! A.type_ "text/css" $ do
>     "label {width: 130px; float: left; clear: both}"
>     "ul.digestive-functors-error-list {"
>     "    color: red;"
>     "    list-style-type: none;"
>     "    padding-left: 0px;"
>     "}"
    </textarea>
  </form>

  <p><strong>MIME types
  defined:</strong> <code>text/x-literate-haskell</code>.</p>

  <p>Parser configuration parameters recognized: <code>base</code> to
  set the base mode (defaults to <code>"haskell"</code>).</p>

  <script>
    var editor = CodeMirror.fromTextArea(document.getElementById("code"), {mode: "haskell-literate"});
  </script>

</article>
codemirror/mode/haskell-literate/haskell-literate.js000064400000002556151215013500016660 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function (mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"), require("../haskell/haskell"))
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror", "../haskell/haskell"], mod)
  else // Plain browser env
    mod(CodeMirror)
})(function (CodeMirror) {
  "use strict"

  CodeMirror.defineMode("haskell-literate", function (config, parserConfig) {
    var baseMode = CodeMirror.getMode(config, (parserConfig && parserConfig.base) || "haskell")

    return {
      startState: function () {
        return {
          inCode: false,
          baseState: CodeMirror.startState(baseMode)
        }
      },
      token: function (stream, state) {
        if (stream.sol()) {
          if (state.inCode = stream.eat(">"))
            return "meta"
        }
        if (state.inCode) {
          return baseMode.token(stream, state.baseState)
        } else {
          stream.skipToEnd()
          return "comment"
        }
      },
      innerMode: function (state) {
        return state.inCode ? {state: state.baseState, mode: baseMode} : null
      }
    }
  }, "haskell")

  CodeMirror.defineMIME("text/x-literate-haskell", "haskell-literate")
});
codemirror/mode/go/go.js000064400000013501151215013500011176 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("go", function(config) {
  var indentUnit = config.indentUnit;

  var keywords = {
    "break":true, "case":true, "chan":true, "const":true, "continue":true,
    "default":true, "defer":true, "else":true, "fallthrough":true, "for":true,
    "func":true, "go":true, "goto":true, "if":true, "import":true,
    "interface":true, "map":true, "package":true, "range":true, "return":true,
    "select":true, "struct":true, "switch":true, "type":true, "var":true,
    "bool":true, "byte":true, "complex64":true, "complex128":true,
    "float32":true, "float64":true, "int8":true, "int16":true, "int32":true,
    "int64":true, "string":true, "uint8":true, "uint16":true, "uint32":true,
    "uint64":true, "int":true, "uint":true, "uintptr":true, "error": true
  };

  var atoms = {
    "true":true, "false":true, "iota":true, "nil":true, "append":true,
    "cap":true, "close":true, "complex":true, "copy":true, "imag":true,
    "len":true, "make":true, "new":true, "panic":true, "print":true,
    "println":true, "real":true, "recover":true
  };

  var isOperatorChar = /[+\-*&^%:=<>!|\/]/;

  var curPunc;

  function tokenBase(stream, state) {
    var ch = stream.next();
    if (ch == '"' || ch == "'" || ch == "`") {
      state.tokenize = tokenString(ch);
      return state.tokenize(stream, state);
    }
    if (/[\d\.]/.test(ch)) {
      if (ch == ".") {
        stream.match(/^[0-9]+([eE][\-+]?[0-9]+)?/);
      } else if (ch == "0") {
        stream.match(/^[xX][0-9a-fA-F]+/) || stream.match(/^0[0-7]+/);
      } else {
        stream.match(/^[0-9]*\.?[0-9]*([eE][\-+]?[0-9]+)?/);
      }
      return "number";
    }
    if (/[\[\]{}\(\),;\:\.]/.test(ch)) {
      curPunc = ch;
      return null;
    }
    if (ch == "/") {
      if (stream.eat("*")) {
        state.tokenize = tokenComment;
        return tokenComment(stream, state);
      }
      if (stream.eat("/")) {
        stream.skipToEnd();
        return "comment";
      }
    }
    if (isOperatorChar.test(ch)) {
      stream.eatWhile(isOperatorChar);
      return "operator";
    }
    stream.eatWhile(/[\w\$_\xa1-\uffff]/);
    var cur = stream.current();
    if (keywords.propertyIsEnumerable(cur)) {
      if (cur == "case" || cur == "default") curPunc = "case";
      return "keyword";
    }
    if (atoms.propertyIsEnumerable(cur)) return "atom";
    return "variable";
  }

  function tokenString(quote) {
    return function(stream, state) {
      var escaped = false, next, end = false;
      while ((next = stream.next()) != null) {
        if (next == quote && !escaped) {end = true; break;}
        escaped = !escaped && quote != "`" && next == "\\";
      }
      if (end || !(escaped || quote == "`"))
        state.tokenize = tokenBase;
      return "string";
    };
  }

  function tokenComment(stream, state) {
    var maybeEnd = false, ch;
    while (ch = stream.next()) {
      if (ch == "/" && maybeEnd) {
        state.tokenize = tokenBase;
        break;
      }
      maybeEnd = (ch == "*");
    }
    return "comment";
  }

  function Context(indented, column, type, align, prev) {
    this.indented = indented;
    this.column = column;
    this.type = type;
    this.align = align;
    this.prev = prev;
  }
  function pushContext(state, col, type) {
    return state.context = new Context(state.indented, col, type, null, state.context);
  }
  function popContext(state) {
    if (!state.context.prev) return;
    var t = state.context.type;
    if (t == ")" || t == "]" || t == "}")
      state.indented = state.context.indented;
    return state.context = state.context.prev;
  }

  // Interface

  return {
    startState: function(basecolumn) {
      return {
        tokenize: null,
        context: new Context((basecolumn || 0) - indentUnit, 0, "top", false),
        indented: 0,
        startOfLine: true
      };
    },

    token: function(stream, state) {
      var ctx = state.context;
      if (stream.sol()) {
        if (ctx.align == null) ctx.align = false;
        state.indented = stream.indentation();
        state.startOfLine = true;
        if (ctx.type == "case") ctx.type = "}";
      }
      if (stream.eatSpace()) return null;
      curPunc = null;
      var style = (state.tokenize || tokenBase)(stream, state);
      if (style == "comment") return style;
      if (ctx.align == null) ctx.align = true;

      if (curPunc == "{") pushContext(state, stream.column(), "}");
      else if (curPunc == "[") pushContext(state, stream.column(), "]");
      else if (curPunc == "(") pushContext(state, stream.column(), ")");
      else if (curPunc == "case") ctx.type = "case";
      else if (curPunc == "}" && ctx.type == "}") ctx = popContext(state);
      else if (curPunc == ctx.type) popContext(state);
      state.startOfLine = false;
      return style;
    },

    indent: function(state, textAfter) {
      if (state.tokenize != tokenBase && state.tokenize != null) return 0;
      var ctx = state.context, firstChar = textAfter && textAfter.charAt(0);
      if (ctx.type == "case" && /^(?:case|default)\b/.test(textAfter)) {
        state.context.type = "}";
        return ctx.indented;
      }
      var closing = firstChar == ctx.type;
      if (ctx.align) return ctx.column + (closing ? 0 : 1);
      else return ctx.indented + (closing ? 0 : indentUnit);
    },

    electricChars: "{}):",
    fold: "brace",
    blockCommentStart: "/*",
    blockCommentEnd: "*/",
    lineComment: "//"
  };
});

CodeMirror.defineMIME("text/x-go", "go");

});
codemirror/mode/go/index.html000064400000004176151215013500012240 0ustar00<!doctype html>

<title>CodeMirror: Go mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<link rel="stylesheet" href="../../theme/elegant.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="go.js"></script>
<style>.CodeMirror {border:1px solid #999; background:#ffc}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Go</a>
  </ul>
</div>

<article>
<h2>Go mode</h2>
<form><textarea id="code" name="code">
// Prime Sieve in Go.
// Taken from the Go specification.
// Copyright © The Go Authors.

package main

import "fmt"

// Send the sequence 2, 3, 4, ... to channel 'ch'.
func generate(ch chan&lt;- int) {
	for i := 2; ; i++ {
		ch &lt;- i  // Send 'i' to channel 'ch'
	}
}

// Copy the values from channel 'src' to channel 'dst',
// removing those divisible by 'prime'.
func filter(src &lt;-chan int, dst chan&lt;- int, prime int) {
	for i := range src {    // Loop over values received from 'src'.
		if i%prime != 0 {
			dst &lt;- i  // Send 'i' to channel 'dst'.
		}
	}
}

// The prime sieve: Daisy-chain filter processes together.
func sieve() {
	ch := make(chan int)  // Create a new channel.
	go generate(ch)       // Start generate() as a subprocess.
	for {
		prime := &lt;-ch
		fmt.Print(prime, "\n")
		ch1 := make(chan int)
		go filter(ch, ch1, prime)
		ch = ch1
	}
}

func main() {
	sieve()
}
</textarea></form>

    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        theme: "elegant",
        matchBrackets: true,
        indentUnit: 8,
        tabSize: 8,
        indentWithTabs: true,
        mode: "text/x-go"
      });
    </script>

    <p><strong>MIME type:</strong> <code>text/x-go</code></p>
  </article>
codemirror/mode/ttcn-cfg/ttcn-cfg.js000064400000017261151215013500013405 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  CodeMirror.defineMode("ttcn-cfg", function(config, parserConfig) {
    var indentUnit = config.indentUnit,
        keywords = parserConfig.keywords || {},
        fileNCtrlMaskOptions = parserConfig.fileNCtrlMaskOptions || {},
        externalCommands = parserConfig.externalCommands || {},
        multiLineStrings = parserConfig.multiLineStrings,
        indentStatements = parserConfig.indentStatements !== false;
    var isOperatorChar = /[\|]/;
    var curPunc;

    function tokenBase(stream, state) {
      var ch = stream.next();
      if (ch == '"' || ch == "'") {
        state.tokenize = tokenString(ch);
        return state.tokenize(stream, state);
      }
      if (/[:=]/.test(ch)) {
        curPunc = ch;
        return "punctuation";
      }
      if (ch == "#"){
        stream.skipToEnd();
        return "comment";
      }
      if (/\d/.test(ch)) {
        stream.eatWhile(/[\w\.]/);
        return "number";
      }
      if (isOperatorChar.test(ch)) {
        stream.eatWhile(isOperatorChar);
        return "operator";
      }
      if (ch == "["){
        stream.eatWhile(/[\w_\]]/);
        return "number sectionTitle";
      }

      stream.eatWhile(/[\w\$_]/);
      var cur = stream.current();
      if (keywords.propertyIsEnumerable(cur)) return "keyword";
      if (fileNCtrlMaskOptions.propertyIsEnumerable(cur))
        return "negative fileNCtrlMaskOptions";
      if (externalCommands.propertyIsEnumerable(cur)) return "negative externalCommands";

      return "variable";
    }

    function tokenString(quote) {
      return function(stream, state) {
        var escaped = false, next, end = false;
        while ((next = stream.next()) != null) {
          if (next == quote && !escaped){
            var afterNext = stream.peek();
            //look if the character if the quote is like the B in '10100010'B
            if (afterNext){
              afterNext = afterNext.toLowerCase();
              if(afterNext == "b" || afterNext == "h" || afterNext == "o")
                stream.next();
            }
            end = true; break;
          }
          escaped = !escaped && next == "\\";
        }
        if (end || !(escaped || multiLineStrings))
          state.tokenize = null;
        return "string";
      };
    }

    function Context(indented, column, type, align, prev) {
      this.indented = indented;
      this.column = column;
      this.type = type;
      this.align = align;
      this.prev = prev;
    }
    function pushContext(state, col, type) {
      var indent = state.indented;
      if (state.context && state.context.type == "statement")
        indent = state.context.indented;
      return state.context = new Context(indent, col, type, null, state.context);
    }
    function popContext(state) {
      var t = state.context.type;
      if (t == ")" || t == "]" || t == "}")
        state.indented = state.context.indented;
      return state.context = state.context.prev;
    }

    //Interface
    return {
      startState: function(basecolumn) {
        return {
          tokenize: null,
          context: new Context((basecolumn || 0) - indentUnit, 0, "top", false),
          indented: 0,
          startOfLine: true
        };
      },

      token: function(stream, state) {
        var ctx = state.context;
        if (stream.sol()) {
          if (ctx.align == null) ctx.align = false;
          state.indented = stream.indentation();
          state.startOfLine = true;
        }
        if (stream.eatSpace()) return null;
        curPunc = null;
        var style = (state.tokenize || tokenBase)(stream, state);
        if (style == "comment") return style;
        if (ctx.align == null) ctx.align = true;

        if ((curPunc == ";" || curPunc == ":" || curPunc == ",")
            && ctx.type == "statement"){
          popContext(state);
        }
        else if (curPunc == "{") pushContext(state, stream.column(), "}");
        else if (curPunc == "[") pushContext(state, stream.column(), "]");
        else if (curPunc == "(") pushContext(state, stream.column(), ")");
        else if (curPunc == "}") {
          while (ctx.type == "statement") ctx = popContext(state);
          if (ctx.type == "}") ctx = popContext(state);
          while (ctx.type == "statement") ctx = popContext(state);
        }
        else if (curPunc == ctx.type) popContext(state);
        else if (indentStatements && (((ctx.type == "}" || ctx.type == "top")
            && curPunc != ';') || (ctx.type == "statement"
            && curPunc == "newstatement")))
          pushContext(state, stream.column(), "statement");
        state.startOfLine = false;
        return style;
      },

      electricChars: "{}",
      lineComment: "#",
      fold: "brace"
    };
  });

  function words(str) {
    var obj = {}, words = str.split(" ");
    for (var i = 0; i < words.length; ++i)
      obj[words[i]] = true;
    return obj;
  }

  CodeMirror.defineMIME("text/x-ttcn-cfg", {
    name: "ttcn-cfg",
    keywords: words("Yes No LogFile FileMask ConsoleMask AppendFile" +
    " TimeStampFormat LogEventTypes SourceInfoFormat" +
    " LogEntityName LogSourceInfo DiskFullAction" +
    " LogFileNumber LogFileSize MatchingHints Detailed" +
    " Compact SubCategories Stack Single None Seconds" +
    " DateTime Time Stop Error Retry Delete TCPPort KillTimer" +
    " NumHCs UnixSocketsEnabled LocalAddress"),
    fileNCtrlMaskOptions: words("TTCN_EXECUTOR TTCN_ERROR TTCN_WARNING" +
    " TTCN_PORTEVENT TTCN_TIMEROP TTCN_VERDICTOP" +
    " TTCN_DEFAULTOP TTCN_TESTCASE TTCN_ACTION" +
    " TTCN_USER TTCN_FUNCTION TTCN_STATISTICS" +
    " TTCN_PARALLEL TTCN_MATCHING TTCN_DEBUG" +
    " EXECUTOR ERROR WARNING PORTEVENT TIMEROP" +
    " VERDICTOP DEFAULTOP TESTCASE ACTION USER" +
    " FUNCTION STATISTICS PARALLEL MATCHING DEBUG" +
    " LOG_ALL LOG_NOTHING ACTION_UNQUALIFIED" +
    " DEBUG_ENCDEC DEBUG_TESTPORT" +
    " DEBUG_UNQUALIFIED DEFAULTOP_ACTIVATE" +
    " DEFAULTOP_DEACTIVATE DEFAULTOP_EXIT" +
    " DEFAULTOP_UNQUALIFIED ERROR_UNQUALIFIED" +
    " EXECUTOR_COMPONENT EXECUTOR_CONFIGDATA" +
    " EXECUTOR_EXTCOMMAND EXECUTOR_LOGOPTIONS" +
    " EXECUTOR_RUNTIME EXECUTOR_UNQUALIFIED" +
    " FUNCTION_RND FUNCTION_UNQUALIFIED" +
    " MATCHING_DONE MATCHING_MCSUCCESS" +
    " MATCHING_MCUNSUCC MATCHING_MMSUCCESS" +
    " MATCHING_MMUNSUCC MATCHING_PCSUCCESS" +
    " MATCHING_PCUNSUCC MATCHING_PMSUCCESS" +
    " MATCHING_PMUNSUCC MATCHING_PROBLEM" +
    " MATCHING_TIMEOUT MATCHING_UNQUALIFIED" +
    " PARALLEL_PORTCONN PARALLEL_PORTMAP" +
    " PARALLEL_PTC PARALLEL_UNQUALIFIED" +
    " PORTEVENT_DUALRECV PORTEVENT_DUALSEND" +
    " PORTEVENT_MCRECV PORTEVENT_MCSEND" +
    " PORTEVENT_MMRECV PORTEVENT_MMSEND" +
    " PORTEVENT_MQUEUE PORTEVENT_PCIN" +
    " PORTEVENT_PCOUT PORTEVENT_PMIN" +
    " PORTEVENT_PMOUT PORTEVENT_PQUEUE" +
    " PORTEVENT_STATE PORTEVENT_UNQUALIFIED" +
    " STATISTICS_UNQUALIFIED STATISTICS_VERDICT" +
    " TESTCASE_FINISH TESTCASE_START" +
    " TESTCASE_UNQUALIFIED TIMEROP_GUARD" +
    " TIMEROP_READ TIMEROP_START TIMEROP_STOP" +
    " TIMEROP_TIMEOUT TIMEROP_UNQUALIFIED" +
    " USER_UNQUALIFIED VERDICTOP_FINAL" +
    " VERDICTOP_GETVERDICT VERDICTOP_SETVERDICT" +
    " VERDICTOP_UNQUALIFIED WARNING_UNQUALIFIED"),
    externalCommands: words("BeginControlPart EndControlPart BeginTestCase" +
    " EndTestCase"),
    multiLineStrings: true
  });
});codemirror/mode/ttcn-cfg/index.html000064400000007025151215013500013334 0ustar00<!doctype html>

<title>CodeMirror: TTCN-CFG mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="ttcn-cfg.js"></script>
<style type="text/css">
    .CodeMirror {
        border-top: 1px solid black;
        border-bottom: 1px solid black;
    }
</style>
<div id=nav>
    <a href="http://codemirror.net"><h1>CodeMirror</h1>
        <img id=logo src="../../doc/logo.png">
    </a>

    <ul>
        <li><a href="../../index.html">Home</a>
        <li><a href="../../doc/manual.html">Manual</a>
        <li><a href="https://github.com/codemirror/codemirror">Code</a>
    </ul>
    <ul>
        <li><a href="../index.html">Language modes</a>
        <li><a class=active href="http://en.wikipedia.org/wiki/TTCN">TTCN-CFG</a>
    </ul>
</div>
<article>
    <h2>TTCN-CFG example</h2>
    <div>
        <textarea id="ttcn-cfg-code">
[MODULE_PARAMETERS]
# This section shall contain the values of all parameters that are defined in your TTCN-3 modules.

[LOGGING]
# In this section you can specify the name of the log file and the classes of events
# you want to log into the file or display on console (standard error).

LogFile := "logs/%e.%h-%r.%s"
FileMask := LOG_ALL | DEBUG | MATCHING
ConsoleMask := ERROR | WARNING | TESTCASE | STATISTICS | PORTEVENT

LogSourceInfo := Yes
AppendFile := No
TimeStampFormat := DateTime
LogEventTypes := Yes
SourceInfoFormat := Single
LogEntityName := Yes

[TESTPORT_PARAMETERS]
# In this section you can specify parameters that are passed to Test Ports.

[DEFINE]
# In this section you can create macro definitions,
# that can be used in other configuration file sections except [INCLUDE].

[INCLUDE]
# To use configuration settings given in other configuration files,
# the configuration files just need to be listed in this section, with their full or relative pathnames.

[EXTERNAL_COMMANDS]
# This section can define external commands (shell scripts) to be executed by the ETS
# whenever a control part or test case is started or terminated.

BeginTestCase := ""
EndTestCase := ""
BeginControlPart := ""
EndControlPart := ""

[EXECUTE]
# In this section you can specify what parts of your test suite you want to execute.

[GROUPS]
# In this section you can specify groups of hosts. These groups can be used inside the
# [COMPONENTS] section to restrict the creation of certain PTCs to a given set of hosts.

[COMPONENTS]
# This section consists of rules restricting the location of created PTCs.

[MAIN_CONTROLLER]
# The options herein control the behavior of MC.

TCPPort := 0
KillTimer := 10.0
NumHCs := 0
LocalAddress :=
        </textarea>
    </div>

    <script> 
      var ttcnEditor = CodeMirror.fromTextArea(document.getElementById("ttcn-cfg-code"), {
        lineNumbers: true,
        matchBrackets: true,
        mode: "text/x-ttcn-cfg"
      });
      ttcnEditor.setSize(600, 860);
      var mac = CodeMirror.keyMap.default == CodeMirror.keyMap.macDefault;
      CodeMirror.keyMap.default[(mac ? "Cmd" : "Ctrl") + "-Space"] = "autocomplete";
    </script>
    <br/>
    <p><strong>Language:</strong> Testing and Test Control Notation -
        Configuration files
        (<a href="http://en.wikipedia.org/wiki/TTCN">TTCN-CFG</a>)
    </p>
    <p><strong>MIME types defined:</strong> <code>text/x-ttcn-cfg</code>.</p>

    <br/>
    <p>The development of this mode has been sponsored by <a href="http://www.ericsson.com/">Ericsson
    </a>.</p>
    <p>Coded by Asmelash Tsegay Gebretsadkan </p>
</article>

codemirror/mode/textile/index.html000064400000010373151215013500013305 0ustar00<!doctype html>

<title>CodeMirror: Textile mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="textile.js"></script>
<style>.CodeMirror {background: #f8f8f8;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/marijnh/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class="active" href="#">Textile</a>
  </ul>
</div>

<article>
    <h2>Textile mode</h2>
    <form><textarea id="code" name="code">
h1. Textile Mode

A paragraph without formatting.

p. A simple Paragraph.


h2. Phrase Modifiers

Here are some simple phrase modifiers: *strong*, _emphasis_, **bold**, and __italic__.

A ??citation??, -deleted text-, +inserted text+, some ^superscript^, and some ~subscript~.

A %span element% and @code element@

A "link":http://example.com, a "link with (alt text)":urlAlias

[urlAlias]http://example.com/

An image: !http://example.com/image.png! and an image with a link: !http://example.com/image.png!:http://example.com

A sentence with a footnote.[123]

fn123. The footnote is defined here.

Registered(r), Trademark(tm), and Copyright(c)


h2. Headers

h1. Top level
h2. Second level
h3. Third level
h4. Fourth level
h5. Fifth level
h6. Lowest level


h2.  Lists

* An unordered list
** foo bar
*** foo bar
**** foo bar
** foo bar

# An ordered list
## foo bar
### foo bar
#### foo bar
## foo bar

- definition list := description
- another item    := foo bar
- spanning ines   :=
                     foo bar

                     foo bar =:


h2. Attributes

Layouts and phrase modifiers can be modified with various kinds of attributes: alignment, CSS ID, CSS class names, language, padding, and CSS styles.

h3. Alignment

div<. left align
div>. right align

h3. CSS ID and class name

You are a %(my-id#my-classname) rad% person.

h3. Language

p[en_CA]. Strange weather, eh?

h3. Horizontal Padding

p(())). 2em left padding, 3em right padding

h3. CSS styling

p{background: red}. Fire!


h2. Table

|_.              Header 1               |_.      Header 2        |
|{background:#ddd}. Cell with background|         Normal         |
|\2.         Cell spanning 2 columns                             |
|/2.         Cell spanning 2 rows       |(cell-class). one       |
|                                                two             |
|>.                  Right aligned cell |<. Left aligned cell    |


h3. A table with attributes:

table(#prices).
|Adults|$5|
|Children|$2|


h2. Code blocks

bc.
function factorial(n) {
    if (n === 0) {
        return 1;
    }
    return n * factorial(n - 1);
}

pre..
                ,,,,,,
            o#'9MMHb':'-,o,
         .oH":HH$' "' ' -*R&o,
        dMMM*""'`'      .oM"HM?.
       ,MMM'          "HLbd< ?&H\
      .:MH ."\          ` MM  MM&b
     . "*H    -        &MMMMMMMMMH:
     .    dboo        MMMMMMMMMMMM.
     .   dMMMMMMb      *MMMMMMMMMP.
     .    MMMMMMMP        *MMMMMP .
          `#MMMMM           MM6P ,
       '    `MMMP"           HM*`,
        '    :MM             .- ,
         '.   `#?..  .       ..'
            -.   .         .-
              ''-.oo,oo.-''

\. _(9>
 \==_)
  -'=

h2. Temporarily disabling textile markup

notextile. Don't __touch this!__

Surround text with double-equals to disable textile inline. Example: Use ==*asterisks*== for *strong* text.


h2. HTML

Some block layouts are simply textile versions of HTML tags with the same name, like @div@, @pre@, and @p@. HTML tags can also exist on their own line:

<section>
  <h1>Title</h1>
  <p>Hello!</p>
</section>

</textarea></form>
    <script>
        var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
            lineNumbers: true,
            mode: "text/x-textile"
        });
    </script>

    <p><strong>MIME types defined:</strong> <code>text/x-textile</code>.</p>

    <p><strong>Parsing/Highlighting Tests:</strong> <a href="../../test/index.html#textile_*">normal</a>,  <a href="../../test/index.html#verbose,textile_*">verbose</a>.</p>

</article>
codemirror/mode/textile/test.js000064400000022335151215013500012626 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function() {
  var mode = CodeMirror.getMode({tabSize: 4}, 'textile');
  function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); }

  MT('simpleParagraphs',
      'Some text.',
      '',
      'Some more text.');

  /*
   * Phrase Modifiers
   */

  MT('em',
      'foo [em _bar_]');

  MT('emBoogus',
      'code_mirror');

  MT('strong',
      'foo [strong *bar*]');

  MT('strongBogus',
      '3 * 3 = 9');

  MT('italic',
      'foo [em __bar__]');

  MT('italicBogus',
      'code__mirror');

  MT('bold',
      'foo [strong **bar**]');

  MT('boldBogus',
      '3 ** 3 = 27');

  MT('simpleLink',
      '[link "CodeMirror":http://codemirror.net]');

  MT('referenceLink',
      '[link "CodeMirror":code_mirror]',
      'Normal Text.',
      '[link [[code_mirror]]http://codemirror.net]');

  MT('footCite',
      'foo bar[qualifier [[1]]]');

  MT('footCiteBogus',
      'foo bar[[1a2]]');

  MT('special-characters',
          'Registered [tag (r)], ' +
          'Trademark [tag (tm)], and ' +
          'Copyright [tag (c)] 2008');

  MT('cite',
      "A book is [keyword ??The Count of Monte Cristo??] by Dumas.");

  MT('additionAndDeletion',
      'The news networks declared [negative -Al Gore-] ' +
        '[positive +George W. Bush+] the winner in Florida.');

  MT('subAndSup',
      'f(x, n) = log [builtin ~4~] x [builtin ^n^]');

  MT('spanAndCode',
      'A [quote %span element%] and [atom @code element@]');

  MT('spanBogus',
      'Percentage 25% is not a span.');

  MT('citeBogus',
      'Question? is not a citation.');

  MT('codeBogus',
      'user@example.com');

  MT('subBogus',
      '~username');

  MT('supBogus',
      'foo ^ bar');

  MT('deletionBogus',
      '3 - 3 = 0');

  MT('additionBogus',
      '3 + 3 = 6');

  MT('image',
      'An image: [string !http://www.example.com/image.png!]');

  MT('imageWithAltText',
      'An image: [string !http://www.example.com/image.png (Alt Text)!]');

  MT('imageWithUrl',
      'An image: [string !http://www.example.com/image.png!:http://www.example.com/]');

  /*
   * Headers
   */

  MT('h1',
      '[header&header-1 h1. foo]');

  MT('h2',
      '[header&header-2 h2. foo]');

  MT('h3',
      '[header&header-3 h3. foo]');

  MT('h4',
      '[header&header-4 h4. foo]');

  MT('h5',
      '[header&header-5 h5. foo]');

  MT('h6',
      '[header&header-6 h6. foo]');

  MT('h7Bogus',
      'h7. foo');

  MT('multipleHeaders',
      '[header&header-1 h1. Heading 1]',
      '',
      'Some text.',
      '',
      '[header&header-2 h2. Heading 2]',
      '',
      'More text.');

  MT('h1inline',
      '[header&header-1 h1. foo ][header&header-1&em _bar_][header&header-1  baz]');

  /*
   * Lists
   */

  MT('ul',
      'foo',
      'bar',
      '',
      '[variable-2 * foo]',
      '[variable-2 * bar]');

  MT('ulNoBlank',
      'foo',
      'bar',
      '[variable-2 * foo]',
      '[variable-2 * bar]');

  MT('ol',
      'foo',
      'bar',
      '',
      '[variable-2 # foo]',
      '[variable-2 # bar]');

  MT('olNoBlank',
      'foo',
      'bar',
      '[variable-2 # foo]',
      '[variable-2 # bar]');

  MT('ulFormatting',
      '[variable-2 * ][variable-2&em _foo_][variable-2  bar]',
      '[variable-2 * ][variable-2&strong *][variable-2&em&strong _foo_]' +
        '[variable-2&strong *][variable-2  bar]',
      '[variable-2 * ][variable-2&strong *foo*][variable-2  bar]');

  MT('olFormatting',
      '[variable-2 # ][variable-2&em _foo_][variable-2  bar]',
      '[variable-2 # ][variable-2&strong *][variable-2&em&strong _foo_]' +
        '[variable-2&strong *][variable-2  bar]',
      '[variable-2 # ][variable-2&strong *foo*][variable-2  bar]');

  MT('ulNested',
      '[variable-2 * foo]',
      '[variable-3 ** bar]',
      '[keyword *** bar]',
      '[variable-2 **** bar]',
      '[variable-3 ** bar]');

  MT('olNested',
      '[variable-2 # foo]',
      '[variable-3 ## bar]',
      '[keyword ### bar]',
      '[variable-2 #### bar]',
      '[variable-3 ## bar]');

  MT('ulNestedWithOl',
      '[variable-2 * foo]',
      '[variable-3 ## bar]',
      '[keyword *** bar]',
      '[variable-2 #### bar]',
      '[variable-3 ** bar]');

  MT('olNestedWithUl',
      '[variable-2 # foo]',
      '[variable-3 ** bar]',
      '[keyword ### bar]',
      '[variable-2 **** bar]',
      '[variable-3 ## bar]');

  MT('definitionList',
      '[number - coffee := Hot ][number&em _and_][number  black]',
      '',
      'Normal text.');

  MT('definitionListSpan',
      '[number - coffee :=]',
      '',
      '[number Hot ][number&em _and_][number  black =:]',
      '',
      'Normal text.');

  MT('boo',
      '[number - dog := woof woof]',
      '[number - cat := meow meow]',
      '[number - whale :=]',
      '[number Whale noises.]',
      '',
      '[number Also, ][number&em _splashing_][number . =:]');

  /*
   * Attributes
   */

  MT('divWithAttribute',
      '[punctuation div][punctuation&attribute (#my-id)][punctuation . foo bar]');

  MT('divWithAttributeAnd2emRightPadding',
      '[punctuation div][punctuation&attribute (#my-id)((][punctuation . foo bar]');

  MT('divWithClassAndId',
      '[punctuation div][punctuation&attribute (my-class#my-id)][punctuation . foo bar]');

  MT('paragraphWithCss',
      'p[attribute {color:red;}]. foo bar');

  MT('paragraphNestedStyles',
      'p. [strong *foo ][strong&em _bar_][strong *]');

  MT('paragraphWithLanguage',
      'p[attribute [[fr]]]. Parlez-vous français?');

  MT('paragraphLeftAlign',
      'p[attribute <]. Left');

  MT('paragraphRightAlign',
      'p[attribute >]. Right');

  MT('paragraphRightAlign',
      'p[attribute =]. Center');

  MT('paragraphJustified',
      'p[attribute <>]. Justified');

  MT('paragraphWithLeftIndent1em',
      'p[attribute (]. Left');

  MT('paragraphWithRightIndent1em',
      'p[attribute )]. Right');

  MT('paragraphWithLeftIndent2em',
      'p[attribute ((]. Left');

  MT('paragraphWithRightIndent2em',
      'p[attribute ))]. Right');

  MT('paragraphWithLeftIndent3emRightIndent2em',
      'p[attribute ((())]. Right');

  MT('divFormatting',
      '[punctuation div. ][punctuation&strong *foo ]' +
        '[punctuation&strong&em _bar_][punctuation&strong *]');

  MT('phraseModifierAttributes',
      'p[attribute (my-class)]. This is a paragraph that has a class and' +
      ' this [em _][em&attribute (#special-phrase)][em emphasized phrase_]' +
      ' has an id.');

  MT('linkWithClass',
      '[link "(my-class). This is a link with class":http://redcloth.org]');

  /*
   * Layouts
   */

  MT('paragraphLayouts',
      'p. This is one paragraph.',
      '',
      'p. This is another.');

  MT('div',
      '[punctuation div. foo bar]');

  MT('pre',
      '[operator pre. Text]');

  MT('bq.',
      '[bracket bq. foo bar]',
      '',
      'Normal text.');

  MT('footnote',
      '[variable fn123. foo ][variable&strong *bar*]');

  /*
   * Spanning Layouts
   */

  MT('bq..ThenParagraph',
      '[bracket bq.. foo bar]',
      '',
      '[bracket More quote.]',
      'p. Normal Text');

  MT('bq..ThenH1',
      '[bracket bq.. foo bar]',
      '',
      '[bracket More quote.]',
      '[header&header-1 h1. Header Text]');

  MT('bc..ThenParagraph',
      '[atom bc.. # Some ruby code]',
      '[atom obj = {foo: :bar}]',
      '[atom puts obj]',
      '',
      '[atom obj[[:love]] = "*love*"]',
      '[atom puts obj.love.upcase]',
      '',
      'p. Normal text.');

  MT('fn1..ThenParagraph',
      '[variable fn1.. foo bar]',
      '',
      '[variable More.]',
      'p. Normal Text');

  MT('pre..ThenParagraph',
      '[operator pre.. foo bar]',
      '',
      '[operator More.]',
      'p. Normal Text');

  /*
   * Tables
   */

  MT('table',
      '[variable-3&operator |_. name |_. age|]',
      '[variable-3 |][variable-3&strong *Walter*][variable-3 |   5  |]',
      '[variable-3 |Florence|   6  |]',
      '',
      'p. Normal text.');

  MT('tableWithAttributes',
      '[variable-3&operator |_. name |_. age|]',
      '[variable-3 |][variable-3&attribute /2.][variable-3  Jim |]',
      '[variable-3 |][variable-3&attribute \\2{color: red}.][variable-3  Sam |]');

  /*
   * HTML
   */

  MT('html',
      '[comment <div id="wrapper">]',
      '[comment <section id="introduction">]',
      '',
      '[header&header-1 h1. Welcome]',
      '',
      '[variable-2 * Item one]',
      '[variable-2 * Item two]',
      '',
      '[comment <a href="http://example.com">Example</a>]',
      '',
      '[comment </section>]',
      '[comment </div>]');

  MT('inlineHtml',
      'I can use HTML directly in my [comment <span class="youbetcha">Textile</span>].');

  /*
   * No-Textile
   */

  MT('notextile',
    '[string-2 notextile. *No* formatting]');

  MT('notextileInline',
      'Use [string-2 ==*asterisks*==] for [strong *strong*] text.');

  MT('notextileWithPre',
      '[operator pre. *No* formatting]');

  MT('notextileWithSpanningPre',
      '[operator pre.. *No* formatting]',
      '',
      '[operator *No* formatting]');

  /* Only toggling phrases between non-word chars. */

  MT('phrase-in-word',
     'foo_bar_baz');

  MT('phrase-non-word',
     '[negative -x-] aaa-bbb ccc-ddd [negative -eee-] fff [negative -ggg-]');

  MT('phrase-lone-dash',
     'foo - bar - baz');
})();
codemirror/mode/textile/textile.js000064400000033022151215013500013320 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") { // CommonJS
    mod(require("../../lib/codemirror"));
  } else if (typeof define == "function" && define.amd) { // AMD
    define(["../../lib/codemirror"], mod);
  } else { // Plain browser env
    mod(CodeMirror);
  }
})(function(CodeMirror) {
  "use strict";

  var TOKEN_STYLES = {
    addition: "positive",
    attributes: "attribute",
    bold: "strong",
    cite: "keyword",
    code: "atom",
    definitionList: "number",
    deletion: "negative",
    div: "punctuation",
    em: "em",
    footnote: "variable",
    footCite: "qualifier",
    header: "header",
    html: "comment",
    image: "string",
    italic: "em",
    link: "link",
    linkDefinition: "link",
    list1: "variable-2",
    list2: "variable-3",
    list3: "keyword",
    notextile: "string-2",
    pre: "operator",
    p: "property",
    quote: "bracket",
    span: "quote",
    specialChar: "tag",
    strong: "strong",
    sub: "builtin",
    sup: "builtin",
    table: "variable-3",
    tableHeading: "operator"
  };

  function startNewLine(stream, state) {
    state.mode = Modes.newLayout;
    state.tableHeading = false;

    if (state.layoutType === "definitionList" && state.spanningLayout &&
        stream.match(RE("definitionListEnd"), false))
      state.spanningLayout = false;
  }

  function handlePhraseModifier(stream, state, ch) {
    if (ch === "_") {
      if (stream.eat("_"))
        return togglePhraseModifier(stream, state, "italic", /__/, 2);
      else
        return togglePhraseModifier(stream, state, "em", /_/, 1);
    }

    if (ch === "*") {
      if (stream.eat("*")) {
        return togglePhraseModifier(stream, state, "bold", /\*\*/, 2);
      }
      return togglePhraseModifier(stream, state, "strong", /\*/, 1);
    }

    if (ch === "[") {
      if (stream.match(/\d+\]/)) state.footCite = true;
      return tokenStyles(state);
    }

    if (ch === "(") {
      var spec = stream.match(/^(r|tm|c)\)/);
      if (spec)
        return tokenStylesWith(state, TOKEN_STYLES.specialChar);
    }

    if (ch === "<" && stream.match(/(\w+)[^>]+>[^<]+<\/\1>/))
      return tokenStylesWith(state, TOKEN_STYLES.html);

    if (ch === "?" && stream.eat("?"))
      return togglePhraseModifier(stream, state, "cite", /\?\?/, 2);

    if (ch === "=" && stream.eat("="))
      return togglePhraseModifier(stream, state, "notextile", /==/, 2);

    if (ch === "-" && !stream.eat("-"))
      return togglePhraseModifier(stream, state, "deletion", /-/, 1);

    if (ch === "+")
      return togglePhraseModifier(stream, state, "addition", /\+/, 1);

    if (ch === "~")
      return togglePhraseModifier(stream, state, "sub", /~/, 1);

    if (ch === "^")
      return togglePhraseModifier(stream, state, "sup", /\^/, 1);

    if (ch === "%")
      return togglePhraseModifier(stream, state, "span", /%/, 1);

    if (ch === "@")
      return togglePhraseModifier(stream, state, "code", /@/, 1);

    if (ch === "!") {
      var type = togglePhraseModifier(stream, state, "image", /(?:\([^\)]+\))?!/, 1);
      stream.match(/^:\S+/); // optional Url portion
      return type;
    }
    return tokenStyles(state);
  }

  function togglePhraseModifier(stream, state, phraseModifier, closeRE, openSize) {
    var charBefore = stream.pos > openSize ? stream.string.charAt(stream.pos - openSize - 1) : null;
    var charAfter = stream.peek();
    if (state[phraseModifier]) {
      if ((!charAfter || /\W/.test(charAfter)) && charBefore && /\S/.test(charBefore)) {
        var type = tokenStyles(state);
        state[phraseModifier] = false;
        return type;
      }
    } else if ((!charBefore || /\W/.test(charBefore)) && charAfter && /\S/.test(charAfter) &&
               stream.match(new RegExp("^.*\\S" + closeRE.source + "(?:\\W|$)"), false)) {
      state[phraseModifier] = true;
      state.mode = Modes.attributes;
    }
    return tokenStyles(state);
  };

  function tokenStyles(state) {
    var disabled = textileDisabled(state);
    if (disabled) return disabled;

    var styles = [];
    if (state.layoutType) styles.push(TOKEN_STYLES[state.layoutType]);

    styles = styles.concat(activeStyles(
      state, "addition", "bold", "cite", "code", "deletion", "em", "footCite",
      "image", "italic", "link", "span", "strong", "sub", "sup", "table", "tableHeading"));

    if (state.layoutType === "header")
      styles.push(TOKEN_STYLES.header + "-" + state.header);

    return styles.length ? styles.join(" ") : null;
  }

  function textileDisabled(state) {
    var type = state.layoutType;

    switch(type) {
    case "notextile":
    case "code":
    case "pre":
      return TOKEN_STYLES[type];
    default:
      if (state.notextile)
        return TOKEN_STYLES.notextile + (type ? (" " + TOKEN_STYLES[type]) : "");
      return null;
    }
  }

  function tokenStylesWith(state, extraStyles) {
    var disabled = textileDisabled(state);
    if (disabled) return disabled;

    var type = tokenStyles(state);
    if (extraStyles)
      return type ? (type + " " + extraStyles) : extraStyles;
    else
      return type;
  }

  function activeStyles(state) {
    var styles = [];
    for (var i = 1; i < arguments.length; ++i) {
      if (state[arguments[i]])
        styles.push(TOKEN_STYLES[arguments[i]]);
    }
    return styles;
  }

  function blankLine(state) {
    var spanningLayout = state.spanningLayout, type = state.layoutType;

    for (var key in state) if (state.hasOwnProperty(key))
      delete state[key];

    state.mode = Modes.newLayout;
    if (spanningLayout) {
      state.layoutType = type;
      state.spanningLayout = true;
    }
  }

  var REs = {
    cache: {},
    single: {
      bc: "bc",
      bq: "bq",
      definitionList: /- [^(?::=)]+:=+/,
      definitionListEnd: /.*=:\s*$/,
      div: "div",
      drawTable: /\|.*\|/,
      foot: /fn\d+/,
      header: /h[1-6]/,
      html: /\s*<(?:\/)?(\w+)(?:[^>]+)?>(?:[^<]+<\/\1>)?/,
      link: /[^"]+":\S/,
      linkDefinition: /\[[^\s\]]+\]\S+/,
      list: /(?:#+|\*+)/,
      notextile: "notextile",
      para: "p",
      pre: "pre",
      table: "table",
      tableCellAttributes: /[\/\\]\d+/,
      tableHeading: /\|_\./,
      tableText: /[^"_\*\[\(\?\+~\^%@|-]+/,
      text: /[^!"_=\*\[\(<\?\+~\^%@-]+/
    },
    attributes: {
      align: /(?:<>|<|>|=)/,
      selector: /\([^\(][^\)]+\)/,
      lang: /\[[^\[\]]+\]/,
      pad: /(?:\(+|\)+){1,2}/,
      css: /\{[^\}]+\}/
    },
    createRe: function(name) {
      switch (name) {
      case "drawTable":
        return REs.makeRe("^", REs.single.drawTable, "$");
      case "html":
        return REs.makeRe("^", REs.single.html, "(?:", REs.single.html, ")*", "$");
      case "linkDefinition":
        return REs.makeRe("^", REs.single.linkDefinition, "$");
      case "listLayout":
        return REs.makeRe("^", REs.single.list, RE("allAttributes"), "*\\s+");
      case "tableCellAttributes":
        return REs.makeRe("^", REs.choiceRe(REs.single.tableCellAttributes,
                                            RE("allAttributes")), "+\\.");
      case "type":
        return REs.makeRe("^", RE("allTypes"));
      case "typeLayout":
        return REs.makeRe("^", RE("allTypes"), RE("allAttributes"),
                          "*\\.\\.?", "(\\s+|$)");
      case "attributes":
        return REs.makeRe("^", RE("allAttributes"), "+");

      case "allTypes":
        return REs.choiceRe(REs.single.div, REs.single.foot,
                            REs.single.header, REs.single.bc, REs.single.bq,
                            REs.single.notextile, REs.single.pre, REs.single.table,
                            REs.single.para);

      case "allAttributes":
        return REs.choiceRe(REs.attributes.selector, REs.attributes.css,
                            REs.attributes.lang, REs.attributes.align, REs.attributes.pad);

      default:
        return REs.makeRe("^", REs.single[name]);
      }
    },
    makeRe: function() {
      var pattern = "";
      for (var i = 0; i < arguments.length; ++i) {
        var arg = arguments[i];
        pattern += (typeof arg === "string") ? arg : arg.source;
      }
      return new RegExp(pattern);
    },
    choiceRe: function() {
      var parts = [arguments[0]];
      for (var i = 1; i < arguments.length; ++i) {
        parts[i * 2 - 1] = "|";
        parts[i * 2] = arguments[i];
      }

      parts.unshift("(?:");
      parts.push(")");
      return REs.makeRe.apply(null, parts);
    }
  };

  function RE(name) {
    return (REs.cache[name] || (REs.cache[name] = REs.createRe(name)));
  }

  var Modes = {
    newLayout: function(stream, state) {
      if (stream.match(RE("typeLayout"), false)) {
        state.spanningLayout = false;
        return (state.mode = Modes.blockType)(stream, state);
      }
      var newMode;
      if (!textileDisabled(state)) {
        if (stream.match(RE("listLayout"), false))
          newMode = Modes.list;
        else if (stream.match(RE("drawTable"), false))
          newMode = Modes.table;
        else if (stream.match(RE("linkDefinition"), false))
          newMode = Modes.linkDefinition;
        else if (stream.match(RE("definitionList")))
          newMode = Modes.definitionList;
        else if (stream.match(RE("html"), false))
          newMode = Modes.html;
      }
      return (state.mode = (newMode || Modes.text))(stream, state);
    },

    blockType: function(stream, state) {
      var match, type;
      state.layoutType = null;

      if (match = stream.match(RE("type")))
        type = match[0];
      else
        return (state.mode = Modes.text)(stream, state);

      if (match = type.match(RE("header"))) {
        state.layoutType = "header";
        state.header = parseInt(match[0][1]);
      } else if (type.match(RE("bq"))) {
        state.layoutType = "quote";
      } else if (type.match(RE("bc"))) {
        state.layoutType = "code";
      } else if (type.match(RE("foot"))) {
        state.layoutType = "footnote";
      } else if (type.match(RE("notextile"))) {
        state.layoutType = "notextile";
      } else if (type.match(RE("pre"))) {
        state.layoutType = "pre";
      } else if (type.match(RE("div"))) {
        state.layoutType = "div";
      } else if (type.match(RE("table"))) {
        state.layoutType = "table";
      }

      state.mode = Modes.attributes;
      return tokenStyles(state);
    },

    text: function(stream, state) {
      if (stream.match(RE("text"))) return tokenStyles(state);

      var ch = stream.next();
      if (ch === '"')
        return (state.mode = Modes.link)(stream, state);
      return handlePhraseModifier(stream, state, ch);
    },

    attributes: function(stream, state) {
      state.mode = Modes.layoutLength;

      if (stream.match(RE("attributes")))
        return tokenStylesWith(state, TOKEN_STYLES.attributes);
      else
        return tokenStyles(state);
    },

    layoutLength: function(stream, state) {
      if (stream.eat(".") && stream.eat("."))
        state.spanningLayout = true;

      state.mode = Modes.text;
      return tokenStyles(state);
    },

    list: function(stream, state) {
      var match = stream.match(RE("list"));
      state.listDepth = match[0].length;
      var listMod = (state.listDepth - 1) % 3;
      if (!listMod)
        state.layoutType = "list1";
      else if (listMod === 1)
        state.layoutType = "list2";
      else
        state.layoutType = "list3";

      state.mode = Modes.attributes;
      return tokenStyles(state);
    },

    link: function(stream, state) {
      state.mode = Modes.text;
      if (stream.match(RE("link"))) {
        stream.match(/\S+/);
        return tokenStylesWith(state, TOKEN_STYLES.link);
      }
      return tokenStyles(state);
    },

    linkDefinition: function(stream, state) {
      stream.skipToEnd();
      return tokenStylesWith(state, TOKEN_STYLES.linkDefinition);
    },

    definitionList: function(stream, state) {
      stream.match(RE("definitionList"));

      state.layoutType = "definitionList";

      if (stream.match(/\s*$/))
        state.spanningLayout = true;
      else
        state.mode = Modes.attributes;

      return tokenStyles(state);
    },

    html: function(stream, state) {
      stream.skipToEnd();
      return tokenStylesWith(state, TOKEN_STYLES.html);
    },

    table: function(stream, state) {
      state.layoutType = "table";
      return (state.mode = Modes.tableCell)(stream, state);
    },

    tableCell: function(stream, state) {
      if (stream.match(RE("tableHeading")))
        state.tableHeading = true;
      else
        stream.eat("|");

      state.mode = Modes.tableCellAttributes;
      return tokenStyles(state);
    },

    tableCellAttributes: function(stream, state) {
      state.mode = Modes.tableText;

      if (stream.match(RE("tableCellAttributes")))
        return tokenStylesWith(state, TOKEN_STYLES.attributes);
      else
        return tokenStyles(state);
    },

    tableText: function(stream, state) {
      if (stream.match(RE("tableText")))
        return tokenStyles(state);

      if (stream.peek() === "|") { // end of cell
        state.mode = Modes.tableCell;
        return tokenStyles(state);
      }
      return handlePhraseModifier(stream, state, stream.next());
    }
  };

  CodeMirror.defineMode("textile", function() {
    return {
      startState: function() {
        return { mode: Modes.newLayout };
      },
      token: function(stream, state) {
        if (stream.sol()) startNewLine(stream, state);
        return state.mode(stream, state);
      },
      blankLine: blankLine
    };
  });

  CodeMirror.defineMIME("text/x-textile", "textile");
});
codemirror/mode/xml/index.html000064400000004173151215013500012430 0ustar00<!doctype html>

<title>CodeMirror: XML mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="xml.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">XML</a>
  </ul>
</div>

<article>
<h2>XML mode</h2>
<form><textarea id="code" name="code">
&lt;html style="color: green"&gt;
  &lt;!-- this is a comment --&gt;
  &lt;head&gt;
    &lt;title&gt;HTML Example&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    The indentation tries to be &lt;em&gt;somewhat &amp;quot;do what
    I mean&amp;quot;&lt;/em&gt;... but might not match your style.
  &lt;/body&gt;
&lt;/html&gt;
</textarea></form>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        mode: "text/html",
        lineNumbers: true
      });
    </script>
    <p>The XML mode supports these configuration parameters:</p>
    <dl>
      <dt><code>htmlMode (boolean)</code></dt>
      <dd>This switches the mode to parse HTML instead of XML. This
      means attributes do not have to be quoted, and some elements
      (such as <code>br</code>) do not require a closing tag.</dd>
      <dt><code>matchClosing (boolean)</code></dt>
      <dd>Controls whether the mode checks that close tags match the
      corresponding opening tag, and highlights mismatches as errors.
      Defaults to true.</dd>
      <dt><code>alignCDATA (boolean)</code></dt>
      <dd>Setting this to true will force the opening tag of CDATA
      blocks to not be indented.</dd>
    </dl>

    <p><strong>MIME types defined:</strong> <code>application/xml</code>, <code>text/html</code>.</p>
  </article>
codemirror/mode/xml/test.js000064400000003336151215013500011750 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function() {
  var mode = CodeMirror.getMode({indentUnit: 2}, "xml"), mname = "xml";
  function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1), mname); }

  MT("matching",
     "[tag&bracket <][tag top][tag&bracket >]",
     "  text",
     "  [tag&bracket <][tag inner][tag&bracket />]",
     "[tag&bracket </][tag top][tag&bracket >]");

  MT("nonmatching",
     "[tag&bracket <][tag top][tag&bracket >]",
     "  [tag&bracket <][tag inner][tag&bracket />]",
     "  [tag&bracket </][tag&error tip][tag&bracket&error >]");

  MT("doctype",
     "[meta <!doctype foobar>]",
     "[tag&bracket <][tag top][tag&bracket />]");

  MT("cdata",
     "[tag&bracket <][tag top][tag&bracket >]",
     "  [atom <![CDATA[foo]",
     "[atom barbazguh]]]]>]",
     "[tag&bracket </][tag top][tag&bracket >]");

  // HTML tests
  mode = CodeMirror.getMode({indentUnit: 2}, "text/html");

  MT("selfclose",
     "[tag&bracket <][tag html][tag&bracket >]",
     "  [tag&bracket <][tag link] [attribute rel]=[string stylesheet] [attribute href]=[string \"/foobar\"][tag&bracket >]",
     "[tag&bracket </][tag html][tag&bracket >]");

  MT("list",
     "[tag&bracket <][tag ol][tag&bracket >]",
     "  [tag&bracket <][tag li][tag&bracket >]one",
     "  [tag&bracket <][tag li][tag&bracket >]two",
     "[tag&bracket </][tag ol][tag&bracket >]");

  MT("valueless",
     "[tag&bracket <][tag input] [attribute type]=[string checkbox] [attribute checked][tag&bracket />]");

  MT("pThenArticle",
     "[tag&bracket <][tag p][tag&bracket >]",
     "  foo",
     "[tag&bracket <][tag article][tag&bracket >]bar");

})();
codemirror/mode/xml/xml.js000064400000030432151215013500011566 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

var htmlConfig = {
  autoSelfClosers: {'area': true, 'base': true, 'br': true, 'col': true, 'command': true,
                    'embed': true, 'frame': true, 'hr': true, 'img': true, 'input': true,
                    'keygen': true, 'link': true, 'meta': true, 'param': true, 'source': true,
                    'track': true, 'wbr': true, 'menuitem': true},
  implicitlyClosed: {'dd': true, 'li': true, 'optgroup': true, 'option': true, 'p': true,
                     'rp': true, 'rt': true, 'tbody': true, 'td': true, 'tfoot': true,
                     'th': true, 'tr': true},
  contextGrabbers: {
    'dd': {'dd': true, 'dt': true},
    'dt': {'dd': true, 'dt': true},
    'li': {'li': true},
    'option': {'option': true, 'optgroup': true},
    'optgroup': {'optgroup': true},
    'p': {'address': true, 'article': true, 'aside': true, 'blockquote': true, 'dir': true,
          'div': true, 'dl': true, 'fieldset': true, 'footer': true, 'form': true,
          'h1': true, 'h2': true, 'h3': true, 'h4': true, 'h5': true, 'h6': true,
          'header': true, 'hgroup': true, 'hr': true, 'menu': true, 'nav': true, 'ol': true,
          'p': true, 'pre': true, 'section': true, 'table': true, 'ul': true},
    'rp': {'rp': true, 'rt': true},
    'rt': {'rp': true, 'rt': true},
    'tbody': {'tbody': true, 'tfoot': true},
    'td': {'td': true, 'th': true},
    'tfoot': {'tbody': true},
    'th': {'td': true, 'th': true},
    'thead': {'tbody': true, 'tfoot': true},
    'tr': {'tr': true}
  },
  doNotIndent: {"pre": true},
  allowUnquoted: true,
  allowMissing: true,
  caseFold: true
}

var xmlConfig = {
  autoSelfClosers: {},
  implicitlyClosed: {},
  contextGrabbers: {},
  doNotIndent: {},
  allowUnquoted: false,
  allowMissing: false,
  caseFold: false
}

CodeMirror.defineMode("xml", function(editorConf, config_) {
  var indentUnit = editorConf.indentUnit
  var config = {}
  var defaults = config_.htmlMode ? htmlConfig : xmlConfig
  for (var prop in defaults) config[prop] = defaults[prop]
  for (var prop in config_) config[prop] = config_[prop]

  // Return variables for tokenizers
  var type, setStyle;

  function inText(stream, state) {
    function chain(parser) {
      state.tokenize = parser;
      return parser(stream, state);
    }

    var ch = stream.next();
    if (ch == "<") {
      if (stream.eat("!")) {
        if (stream.eat("[")) {
          if (stream.match("CDATA[")) return chain(inBlock("atom", "]]>"));
          else return null;
        } else if (stream.match("--")) {
          return chain(inBlock("comment", "-->"));
        } else if (stream.match("DOCTYPE", true, true)) {
          stream.eatWhile(/[\w\._\-]/);
          return chain(doctype(1));
        } else {
          return null;
        }
      } else if (stream.eat("?")) {
        stream.eatWhile(/[\w\._\-]/);
        state.tokenize = inBlock("meta", "?>");
        return "meta";
      } else {
        type = stream.eat("/") ? "closeTag" : "openTag";
        state.tokenize = inTag;
        return "tag bracket";
      }
    } else if (ch == "&") {
      var ok;
      if (stream.eat("#")) {
        if (stream.eat("x")) {
          ok = stream.eatWhile(/[a-fA-F\d]/) && stream.eat(";");
        } else {
          ok = stream.eatWhile(/[\d]/) && stream.eat(";");
        }
      } else {
        ok = stream.eatWhile(/[\w\.\-:]/) && stream.eat(";");
      }
      return ok ? "atom" : "error";
    } else {
      stream.eatWhile(/[^&<]/);
      return null;
    }
  }
  inText.isInText = true;

  function inTag(stream, state) {
    var ch = stream.next();
    if (ch == ">" || (ch == "/" && stream.eat(">"))) {
      state.tokenize = inText;
      type = ch == ">" ? "endTag" : "selfcloseTag";
      return "tag bracket";
    } else if (ch == "=") {
      type = "equals";
      return null;
    } else if (ch == "<") {
      state.tokenize = inText;
      state.state = baseState;
      state.tagName = state.tagStart = null;
      var next = state.tokenize(stream, state);
      return next ? next + " tag error" : "tag error";
    } else if (/[\'\"]/.test(ch)) {
      state.tokenize = inAttribute(ch);
      state.stringStartCol = stream.column();
      return state.tokenize(stream, state);
    } else {
      stream.match(/^[^\s\u00a0=<>\"\']*[^\s\u00a0=<>\"\'\/]/);
      return "word";
    }
  }

  function inAttribute(quote) {
    var closure = function(stream, state) {
      while (!stream.eol()) {
        if (stream.next() == quote) {
          state.tokenize = inTag;
          break;
        }
      }
      return "string";
    };
    closure.isInAttribute = true;
    return closure;
  }

  function inBlock(style, terminator) {
    return function(stream, state) {
      while (!stream.eol()) {
        if (stream.match(terminator)) {
          state.tokenize = inText;
          break;
        }
        stream.next();
      }
      return style;
    };
  }
  function doctype(depth) {
    return function(stream, state) {
      var ch;
      while ((ch = stream.next()) != null) {
        if (ch == "<") {
          state.tokenize = doctype(depth + 1);
          return state.tokenize(stream, state);
        } else if (ch == ">") {
          if (depth == 1) {
            state.tokenize = inText;
            break;
          } else {
            state.tokenize = doctype(depth - 1);
            return state.tokenize(stream, state);
          }
        }
      }
      return "meta";
    };
  }

  function Context(state, tagName, startOfLine) {
    this.prev = state.context;
    this.tagName = tagName;
    this.indent = state.indented;
    this.startOfLine = startOfLine;
    if (config.doNotIndent.hasOwnProperty(tagName) || (state.context && state.context.noIndent))
      this.noIndent = true;
  }
  function popContext(state) {
    if (state.context) state.context = state.context.prev;
  }
  function maybePopContext(state, nextTagName) {
    var parentTagName;
    while (true) {
      if (!state.context) {
        return;
      }
      parentTagName = state.context.tagName;
      if (!config.contextGrabbers.hasOwnProperty(parentTagName) ||
          !config.contextGrabbers[parentTagName].hasOwnProperty(nextTagName)) {
        return;
      }
      popContext(state);
    }
  }

  function baseState(type, stream, state) {
    if (type == "openTag") {
      state.tagStart = stream.column();
      return tagNameState;
    } else if (type == "closeTag") {
      return closeTagNameState;
    } else {
      return baseState;
    }
  }
  function tagNameState(type, stream, state) {
    if (type == "word") {
      state.tagName = stream.current();
      setStyle = "tag";
      return attrState;
    } else {
      setStyle = "error";
      return tagNameState;
    }
  }
  function closeTagNameState(type, stream, state) {
    if (type == "word") {
      var tagName = stream.current();
      if (state.context && state.context.tagName != tagName &&
          config.implicitlyClosed.hasOwnProperty(state.context.tagName))
        popContext(state);
      if ((state.context && state.context.tagName == tagName) || config.matchClosing === false) {
        setStyle = "tag";
        return closeState;
      } else {
        setStyle = "tag error";
        return closeStateErr;
      }
    } else {
      setStyle = "error";
      return closeStateErr;
    }
  }

  function closeState(type, _stream, state) {
    if (type != "endTag") {
      setStyle = "error";
      return closeState;
    }
    popContext(state);
    return baseState;
  }
  function closeStateErr(type, stream, state) {
    setStyle = "error";
    return closeState(type, stream, state);
  }

  function attrState(type, _stream, state) {
    if (type == "word") {
      setStyle = "attribute";
      return attrEqState;
    } else if (type == "endTag" || type == "selfcloseTag") {
      var tagName = state.tagName, tagStart = state.tagStart;
      state.tagName = state.tagStart = null;
      if (type == "selfcloseTag" ||
          config.autoSelfClosers.hasOwnProperty(tagName)) {
        maybePopContext(state, tagName);
      } else {
        maybePopContext(state, tagName);
        state.context = new Context(state, tagName, tagStart == state.indented);
      }
      return baseState;
    }
    setStyle = "error";
    return attrState;
  }
  function attrEqState(type, stream, state) {
    if (type == "equals") return attrValueState;
    if (!config.allowMissing) setStyle = "error";
    return attrState(type, stream, state);
  }
  function attrValueState(type, stream, state) {
    if (type == "string") return attrContinuedState;
    if (type == "word" && config.allowUnquoted) {setStyle = "string"; return attrState;}
    setStyle = "error";
    return attrState(type, stream, state);
  }
  function attrContinuedState(type, stream, state) {
    if (type == "string") return attrContinuedState;
    return attrState(type, stream, state);
  }

  return {
    startState: function(baseIndent) {
      var state = {tokenize: inText,
                   state: baseState,
                   indented: baseIndent || 0,
                   tagName: null, tagStart: null,
                   context: null}
      if (baseIndent != null) state.baseIndent = baseIndent
      return state
    },

    token: function(stream, state) {
      if (!state.tagName && stream.sol())
        state.indented = stream.indentation();

      if (stream.eatSpace()) return null;
      type = null;
      var style = state.tokenize(stream, state);
      if ((style || type) && style != "comment") {
        setStyle = null;
        state.state = state.state(type || style, stream, state);
        if (setStyle)
          style = setStyle == "error" ? style + " error" : setStyle;
      }
      return style;
    },

    indent: function(state, textAfter, fullLine) {
      var context = state.context;
      // Indent multi-line strings (e.g. css).
      if (state.tokenize.isInAttribute) {
        if (state.tagStart == state.indented)
          return state.stringStartCol + 1;
        else
          return state.indented + indentUnit;
      }
      if (context && context.noIndent) return CodeMirror.Pass;
      if (state.tokenize != inTag && state.tokenize != inText)
        return fullLine ? fullLine.match(/^(\s*)/)[0].length : 0;
      // Indent the starts of attribute names.
      if (state.tagName) {
        if (config.multilineTagIndentPastTag !== false)
          return state.tagStart + state.tagName.length + 2;
        else
          return state.tagStart + indentUnit * (config.multilineTagIndentFactor || 1);
      }
      if (config.alignCDATA && /<!\[CDATA\[/.test(textAfter)) return 0;
      var tagAfter = textAfter && /^<(\/)?([\w_:\.-]*)/.exec(textAfter);
      if (tagAfter && tagAfter[1]) { // Closing tag spotted
        while (context) {
          if (context.tagName == tagAfter[2]) {
            context = context.prev;
            break;
          } else if (config.implicitlyClosed.hasOwnProperty(context.tagName)) {
            context = context.prev;
          } else {
            break;
          }
        }
      } else if (tagAfter) { // Opening tag spotted
        while (context) {
          var grabbers = config.contextGrabbers[context.tagName];
          if (grabbers && grabbers.hasOwnProperty(tagAfter[2]))
            context = context.prev;
          else
            break;
        }
      }
      while (context && context.prev && !context.startOfLine)
        context = context.prev;
      if (context) return context.indent + indentUnit;
      else return state.baseIndent || 0;
    },

    electricInput: /<\/[\s\w:]+>$/,
    blockCommentStart: "<!--",
    blockCommentEnd: "-->",

    configuration: config.htmlMode ? "html" : "xml",
    helperType: config.htmlMode ? "html" : "xml",

    skipAttribute: function(state) {
      if (state.state == attrValueState)
        state.state = attrState
    }
  };
});

CodeMirror.defineMIME("text/xml", "xml");
CodeMirror.defineMIME("application/xml", "xml");
if (!CodeMirror.mimeModes.hasOwnProperty("text/html"))
  CodeMirror.defineMIME("text/html", {name: "xml", htmlMode: true});

});
codemirror/mode/powershell/powershell.js000064400000031054151215013500014537 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  'use strict';
  if (typeof exports == 'object' && typeof module == 'object') // CommonJS
    mod(require('codemirror'));
  else if (typeof define == 'function' && define.amd) // AMD
    define(['codemirror'], mod);
  else // Plain browser env
    mod(window.CodeMirror);
})(function(CodeMirror) {
'use strict';

CodeMirror.defineMode('powershell', function() {
  function buildRegexp(patterns, options) {
    options = options || {};
    var prefix = options.prefix !== undefined ? options.prefix : '^';
    var suffix = options.suffix !== undefined ? options.suffix : '\\b';

    for (var i = 0; i < patterns.length; i++) {
      if (patterns[i] instanceof RegExp) {
        patterns[i] = patterns[i].source;
      }
      else {
        patterns[i] = patterns[i].replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
      }
    }

    return new RegExp(prefix + '(' + patterns.join('|') + ')' + suffix, 'i');
  }

  var notCharacterOrDash = '(?=[^A-Za-z\\d\\-_]|$)';
  var varNames = /[\w\-:]/
  var keywords = buildRegexp([
    /begin|break|catch|continue|data|default|do|dynamicparam/,
    /else|elseif|end|exit|filter|finally|for|foreach|from|function|if|in/,
    /param|process|return|switch|throw|trap|try|until|where|while/
  ], { suffix: notCharacterOrDash });

  var punctuation = /[\[\]{},;`\.]|@[({]/;
  var wordOperators = buildRegexp([
    'f',
    /b?not/,
    /[ic]?split/, 'join',
    /is(not)?/, 'as',
    /[ic]?(eq|ne|[gl][te])/,
    /[ic]?(not)?(like|match|contains)/,
    /[ic]?replace/,
    /b?(and|or|xor)/
  ], { prefix: '-' });
  var symbolOperators = /[+\-*\/%]=|\+\+|--|\.\.|[+\-*&^%:=!|\/]|<(?!#)|(?!#)>/;
  var operators = buildRegexp([wordOperators, symbolOperators], { suffix: '' });

  var numbers = /^((0x[\da-f]+)|((\d+\.\d+|\d\.|\.\d+|\d+)(e[\+\-]?\d+)?))[ld]?([kmgtp]b)?/i;

  var identifiers = /^[A-Za-z\_][A-Za-z\-\_\d]*\b/;

  var symbolBuiltins = /[A-Z]:|%|\?/i;
  var namedBuiltins = buildRegexp([
    /Add-(Computer|Content|History|Member|PSSnapin|Type)/,
    /Checkpoint-Computer/,
    /Clear-(Content|EventLog|History|Host|Item(Property)?|Variable)/,
    /Compare-Object/,
    /Complete-Transaction/,
    /Connect-PSSession/,
    /ConvertFrom-(Csv|Json|SecureString|StringData)/,
    /Convert-Path/,
    /ConvertTo-(Csv|Html|Json|SecureString|Xml)/,
    /Copy-Item(Property)?/,
    /Debug-Process/,
    /Disable-(ComputerRestore|PSBreakpoint|PSRemoting|PSSessionConfiguration)/,
    /Disconnect-PSSession/,
    /Enable-(ComputerRestore|PSBreakpoint|PSRemoting|PSSessionConfiguration)/,
    /(Enter|Exit)-PSSession/,
    /Export-(Alias|Clixml|Console|Counter|Csv|FormatData|ModuleMember|PSSession)/,
    /ForEach-Object/,
    /Format-(Custom|List|Table|Wide)/,
    new RegExp('Get-(Acl|Alias|AuthenticodeSignature|ChildItem|Command|ComputerRestorePoint|Content|ControlPanelItem|Counter|Credential'
      + '|Culture|Date|Event|EventLog|EventSubscriber|ExecutionPolicy|FormatData|Help|History|Host|HotFix|Item|ItemProperty|Job'
      + '|Location|Member|Module|PfxCertificate|Process|PSBreakpoint|PSCallStack|PSDrive|PSProvider|PSSession|PSSessionConfiguration'
      + '|PSSnapin|Random|Service|TraceSource|Transaction|TypeData|UICulture|Unique|Variable|Verb|WinEvent|WmiObject)'),
    /Group-Object/,
    /Import-(Alias|Clixml|Counter|Csv|LocalizedData|Module|PSSession)/,
    /ImportSystemModules/,
    /Invoke-(Command|Expression|History|Item|RestMethod|WebRequest|WmiMethod)/,
    /Join-Path/,
    /Limit-EventLog/,
    /Measure-(Command|Object)/,
    /Move-Item(Property)?/,
    new RegExp('New-(Alias|Event|EventLog|Item(Property)?|Module|ModuleManifest|Object|PSDrive|PSSession|PSSessionConfigurationFile'
      + '|PSSessionOption|PSTransportOption|Service|TimeSpan|Variable|WebServiceProxy|WinEvent)'),
    /Out-(Default|File|GridView|Host|Null|Printer|String)/,
    /Pause/,
    /(Pop|Push)-Location/,
    /Read-Host/,
    /Receive-(Job|PSSession)/,
    /Register-(EngineEvent|ObjectEvent|PSSessionConfiguration|WmiEvent)/,
    /Remove-(Computer|Event|EventLog|Item(Property)?|Job|Module|PSBreakpoint|PSDrive|PSSession|PSSnapin|TypeData|Variable|WmiObject)/,
    /Rename-(Computer|Item(Property)?)/,
    /Reset-ComputerMachinePassword/,
    /Resolve-Path/,
    /Restart-(Computer|Service)/,
    /Restore-Computer/,
    /Resume-(Job|Service)/,
    /Save-Help/,
    /Select-(Object|String|Xml)/,
    /Send-MailMessage/,
    new RegExp('Set-(Acl|Alias|AuthenticodeSignature|Content|Date|ExecutionPolicy|Item(Property)?|Location|PSBreakpoint|PSDebug' +
               '|PSSessionConfiguration|Service|StrictMode|TraceSource|Variable|WmiInstance)'),
    /Show-(Command|ControlPanelItem|EventLog)/,
    /Sort-Object/,
    /Split-Path/,
    /Start-(Job|Process|Service|Sleep|Transaction|Transcript)/,
    /Stop-(Computer|Job|Process|Service|Transcript)/,
    /Suspend-(Job|Service)/,
    /TabExpansion2/,
    /Tee-Object/,
    /Test-(ComputerSecureChannel|Connection|ModuleManifest|Path|PSSessionConfigurationFile)/,
    /Trace-Command/,
    /Unblock-File/,
    /Undo-Transaction/,
    /Unregister-(Event|PSSessionConfiguration)/,
    /Update-(FormatData|Help|List|TypeData)/,
    /Use-Transaction/,
    /Wait-(Event|Job|Process)/,
    /Where-Object/,
    /Write-(Debug|Error|EventLog|Host|Output|Progress|Verbose|Warning)/,
    /cd|help|mkdir|more|oss|prompt/,
    /ac|asnp|cat|cd|chdir|clc|clear|clhy|cli|clp|cls|clv|cnsn|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|dnsn|ebp/,
    /echo|epal|epcsv|epsn|erase|etsn|exsn|fc|fl|foreach|ft|fw|gal|gbp|gc|gci|gcm|gcs|gdr|ghy|gi|gjb|gl|gm|gmo|gp|gps/,
    /group|gsn|gsnp|gsv|gu|gv|gwmi|h|history|icm|iex|ihy|ii|ipal|ipcsv|ipmo|ipsn|irm|ise|iwmi|iwr|kill|lp|ls|man|md/,
    /measure|mi|mount|move|mp|mv|nal|ndr|ni|nmo|npssc|nsn|nv|ogv|oh|popd|ps|pushd|pwd|r|rbp|rcjb|rcsn|rd|rdr|ren|ri/,
    /rjb|rm|rmdir|rmo|rni|rnp|rp|rsn|rsnp|rujb|rv|rvpa|rwmi|sajb|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls/,
    /sort|sp|spjb|spps|spsv|start|sujb|sv|swmi|tee|trcm|type|where|wjb|write/
  ], { prefix: '', suffix: '' });
  var variableBuiltins = buildRegexp([
    /[$?^_]|Args|ConfirmPreference|ConsoleFileName|DebugPreference|Error|ErrorActionPreference|ErrorView|ExecutionContext/,
    /FormatEnumerationLimit|Home|Host|Input|MaximumAliasCount|MaximumDriveCount|MaximumErrorCount|MaximumFunctionCount/,
    /MaximumHistoryCount|MaximumVariableCount|MyInvocation|NestedPromptLevel|OutputEncoding|Pid|Profile|ProgressPreference/,
    /PSBoundParameters|PSCommandPath|PSCulture|PSDefaultParameterValues|PSEmailServer|PSHome|PSScriptRoot|PSSessionApplicationName/,
    /PSSessionConfigurationName|PSSessionOption|PSUICulture|PSVersionTable|Pwd|ShellId|StackTrace|VerbosePreference/,
    /WarningPreference|WhatIfPreference/,

    /Event|EventArgs|EventSubscriber|Sender/,
    /Matches|Ofs|ForEach|LastExitCode|PSCmdlet|PSItem|PSSenderInfo|This/,
    /true|false|null/
  ], { prefix: '\\$', suffix: '' });

  var builtins = buildRegexp([symbolBuiltins, namedBuiltins, variableBuiltins], { suffix: notCharacterOrDash });

  var grammar = {
    keyword: keywords,
    number: numbers,
    operator: operators,
    builtin: builtins,
    punctuation: punctuation,
    identifier: identifiers
  };

  // tokenizers
  function tokenBase(stream, state) {
    // Handle Comments
    //var ch = stream.peek();

    var parent = state.returnStack[state.returnStack.length - 1];
    if (parent && parent.shouldReturnFrom(state)) {
      state.tokenize = parent.tokenize;
      state.returnStack.pop();
      return state.tokenize(stream, state);
    }

    if (stream.eatSpace()) {
      return null;
    }

    if (stream.eat('(')) {
      state.bracketNesting += 1;
      return 'punctuation';
    }

    if (stream.eat(')')) {
      state.bracketNesting -= 1;
      return 'punctuation';
    }

    for (var key in grammar) {
      if (stream.match(grammar[key])) {
        return key;
      }
    }

    var ch = stream.next();

    // single-quote string
    if (ch === "'") {
      return tokenSingleQuoteString(stream, state);
    }

    if (ch === '$') {
      return tokenVariable(stream, state);
    }

    // double-quote string
    if (ch === '"') {
      return tokenDoubleQuoteString(stream, state);
    }

    if (ch === '<' && stream.eat('#')) {
      state.tokenize = tokenComment;
      return tokenComment(stream, state);
    }

    if (ch === '#') {
      stream.skipToEnd();
      return 'comment';
    }

    if (ch === '@') {
      var quoteMatch = stream.eat(/["']/);
      if (quoteMatch && stream.eol()) {
        state.tokenize = tokenMultiString;
        state.startQuote = quoteMatch[0];
        return tokenMultiString(stream, state);
      } else if (stream.peek().match(/[({]/)) {
        return 'punctuation';
      } else if (stream.peek().match(varNames)) {
        // splatted variable
        return tokenVariable(stream, state);
      }
    }
    return 'error';
  }

  function tokenSingleQuoteString(stream, state) {
    var ch;
    while ((ch = stream.peek()) != null) {
      stream.next();

      if (ch === "'" && !stream.eat("'")) {
        state.tokenize = tokenBase;
        return 'string';
      }
    }

    return 'error';
  }

  function tokenDoubleQuoteString(stream, state) {
    var ch;
    while ((ch = stream.peek()) != null) {
      if (ch === '$') {
        state.tokenize = tokenStringInterpolation;
        return 'string';
      }

      stream.next();
      if (ch === '`') {
        stream.next();
        continue;
      }

      if (ch === '"' && !stream.eat('"')) {
        state.tokenize = tokenBase;
        return 'string';
      }
    }

    return 'error';
  }

  function tokenStringInterpolation(stream, state) {
    return tokenInterpolation(stream, state, tokenDoubleQuoteString);
  }

  function tokenMultiStringReturn(stream, state) {
    state.tokenize = tokenMultiString;
    state.startQuote = '"'
    return tokenMultiString(stream, state);
  }

  function tokenHereStringInterpolation(stream, state) {
    return tokenInterpolation(stream, state, tokenMultiStringReturn);
  }

  function tokenInterpolation(stream, state, parentTokenize) {
    if (stream.match('jQuery(')) {
      var savedBracketNesting = state.bracketNesting;
      state.returnStack.push({
        /*jshint loopfunc:true */
        shouldReturnFrom: function(state) {
          return state.bracketNesting === savedBracketNesting;
        },
        tokenize: parentTokenize
      });
      state.tokenize = tokenBase;
      state.bracketNesting += 1;
      return 'punctuation';
    } else {
      stream.next();
      state.returnStack.push({
        shouldReturnFrom: function() { return true; },
        tokenize: parentTokenize
      });
      state.tokenize = tokenVariable;
      return state.tokenize(stream, state);
    }
  }

  function tokenComment(stream, state) {
    var maybeEnd = false, ch;
    while ((ch = stream.next()) != null) {
      if (maybeEnd && ch == '>') {
          state.tokenize = tokenBase;
          break;
      }
      maybeEnd = (ch === '#');
    }
    return 'comment';
  }

  function tokenVariable(stream, state) {
    var ch = stream.peek();
    if (stream.eat('{')) {
      state.tokenize = tokenVariableWithBraces;
      return tokenVariableWithBraces(stream, state);
    } else if (ch != undefined && ch.match(varNames)) {
      stream.eatWhile(varNames);
      state.tokenize = tokenBase;
      return 'variable-2';
    } else {
      state.tokenize = tokenBase;
      return 'error';
    }
  }

  function tokenVariableWithBraces(stream, state) {
    var ch;
    while ((ch = stream.next()) != null) {
      if (ch === '}') {
        state.tokenize = tokenBase;
        break;
      }
    }
    return 'variable-2';
  }

  function tokenMultiString(stream, state) {
    var quote = state.startQuote;
    if (stream.sol() && stream.match(new RegExp(quote + '@'))) {
      state.tokenize = tokenBase;
    }
    else if (quote === '"') {
      while (!stream.eol()) {
        var ch = stream.peek();
        if (ch === '$') {
          state.tokenize = tokenHereStringInterpolation;
          return 'string';
        }

        stream.next();
        if (ch === '`') {
          stream.next();
        }
      }
    }
    else {
      stream.skipToEnd();
    }

    return 'string';
  }

  var external = {
    startState: function() {
      return {
        returnStack: [],
        bracketNesting: 0,
        tokenize: tokenBase
      };
    },

    token: function(stream, state) {
      return state.tokenize(stream, state);
    },

    blockCommentStart: '<#',
    blockCommentEnd: '#>',
    lineComment: '#',
    fold: 'brace'
  };
  return external;
});

CodeMirror.defineMIME('application/x-powershell', 'powershell');
});
codemirror/mode/powershell/index.html000064400000016333151215013500014015 0ustar00<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>CodeMirror: Powershell mode</title>
    <link rel="stylesheet" href="../../doc/docs.css">
    <link rel="stylesheet" href="../../lib/codemirror.css">
    <script src="../../lib/codemirror.js"></script>
    <script src="powershell.js"></script>
    <style>.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
  </head>
  <body>
    <div id=nav>
      <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

      <ul>
        <li><a href="../../index.html">Home</a>
        <li><a href="../../doc/manual.html">Manual</a>
        <li><a href="https://github.com/codemirror/codemirror">Code</a>
      </ul>
      <ul>
        <li><a href="../index.html">Language modes</a>
        <li><a class=active href="#">JavaScript</a>
      </ul>
    </div>
    <article>
      <h2>PowerShell mode</h2>

      <div><textarea id="code" name="code">
# Number Literals
0 12345
12kb 12mb 12gB 12Tb 12PB 12L 12D 12lkb 12dtb
1.234 1.234e56 1. 1.e2 .2 .2e34
1.2MB 1.kb .1dTb 1.e1gb
0x1 0xabcdef 0x3tb 0xelmb

# String Literals
'Literal escaping'''
'Literal $variable'
"Escaping 1`""
"Escaping 2"""
"Escaped `$variable"
"Text, $variable and more text"
"Text, ${variable with spaces} and more text."
"Text, jQuery($expression + 3) and more text."
"Text, jQuery("interpolation jQuery("inception")") and more text."

@"
Multiline
string
"@
# --
@"
Multiline
string with quotes "'
"@
# --
@'
Multiline literal
string with quotes "'
'@

# Array and Hash literals
@( 'a','b','c' )
@{ 'key': 'value' }

# Variables
$Variable = 5
$global:variable = 5
${Variable with spaces} = 5

# Operators
= += -= *= /= %=
++ -- .. -f * / % + -
-not ! -bnot
-split -isplit -csplit
-join
-is -isnot -as
-eq -ieq -ceq -ne -ine -cne
-gt -igt -cgt -ge -ige -cge
-lt -ilt -clt -le -ile -cle
-like -ilike -clike -notlike -inotlike -cnotlike
-match -imatch -cmatch -notmatch -inotmatch -cnotmatch
-contains -icontains -ccontains -notcontains -inotcontains -cnotcontains
-replace -ireplace -creplace
-band	-bor -bxor
-and -or -xor

# Punctuation
() [] {} , : ` = ; .

# Keywords
elseif begin function for foreach return else trap while do data dynamicparam
until end break if throw param continue finally in switch exit filter from try
process catch

# Built-in variables
$$ $? $^ $_
$args $ConfirmPreference $ConsoleFileName $DebugPreference $Error
$ErrorActionPreference $ErrorView $ExecutionContext $false $FormatEnumerationLimit
$HOME $Host $input $MaximumAliasCount $MaximumDriveCount $MaximumErrorCount
$MaximumFunctionCount $MaximumHistoryCount $MaximumVariableCount $MyInvocation
$NestedPromptLevel $null $OutputEncoding $PID $PROFILE $ProgressPreference
$PSBoundParameters $PSCommandPath $PSCulture $PSDefaultParameterValues
$PSEmailServer $PSHOME $PSScriptRoot $PSSessionApplicationName
$PSSessionConfigurationName $PSSessionOption $PSUICulture $PSVersionTable $PWD
$ShellId $StackTrace $true $VerbosePreference $WarningPreference $WhatIfPreference
$true $false $null

# Built-in functions
A:
Add-Computer Add-Content Add-History Add-Member Add-PSSnapin Add-Type
B:
C:
Checkpoint-Computer Clear-Content Clear-EventLog Clear-History Clear-Host Clear-Item
Clear-ItemProperty Clear-Variable Compare-Object Complete-Transaction Connect-PSSession
ConvertFrom-Csv ConvertFrom-Json ConvertFrom-SecureString ConvertFrom-StringData
Convert-Path ConvertTo-Csv ConvertTo-Html ConvertTo-Json ConvertTo-SecureString
ConvertTo-Xml Copy-Item Copy-ItemProperty
D:
Debug-Process Disable-ComputerRestore Disable-PSBreakpoint Disable-PSRemoting
Disable-PSSessionConfiguration Disconnect-PSSession
E:
Enable-ComputerRestore Enable-PSBreakpoint Enable-PSRemoting Enable-PSSessionConfiguration
Enter-PSSession Exit-PSSession Export-Alias Export-Clixml Export-Console Export-Counter
Export-Csv Export-FormatData Export-ModuleMember Export-PSSession
F:
ForEach-Object Format-Custom Format-List Format-Table Format-Wide
G:
Get-Acl Get-Alias Get-AuthenticodeSignature Get-ChildItem Get-Command Get-ComputerRestorePoint
Get-Content Get-ControlPanelItem Get-Counter Get-Credential Get-Culture Get-Date
Get-Event Get-EventLog Get-EventSubscriber Get-ExecutionPolicy Get-FormatData Get-Help
Get-History Get-Host Get-HotFix Get-Item Get-ItemProperty Get-Job Get-Location Get-Member
Get-Module Get-PfxCertificate Get-Process Get-PSBreakpoint Get-PSCallStack Get-PSDrive
Get-PSProvider Get-PSSession Get-PSSessionConfiguration Get-PSSnapin Get-Random Get-Service
Get-TraceSource Get-Transaction Get-TypeData Get-UICulture  Get-Unique Get-Variable Get-Verb
Get-WinEvent Get-WmiObject Group-Object
H:
help
I:
Import-Alias Import-Clixml Import-Counter Import-Csv Import-LocalizedData Import-Module
Import-PSSession ImportSystemModules Invoke-Command Invoke-Expression Invoke-History
Invoke-Item Invoke-RestMethod Invoke-WebRequest Invoke-WmiMethod
J:
Join-Path
K:
L:
Limit-EventLog
M:
Measure-Command Measure-Object mkdir more Move-Item Move-ItemProperty
N:
New-Alias New-Event New-EventLog New-Item New-ItemProperty New-Module New-ModuleManifest
New-Object New-PSDrive New-PSSession New-PSSessionConfigurationFile New-PSSessionOption
New-PSTransportOption New-Service New-TimeSpan New-Variable New-WebServiceProxy
New-WinEvent
O:
oss Out-Default Out-File Out-GridView Out-Host Out-Null Out-Printer Out-String
P:
Pause Pop-Location prompt Push-Location
Q:
R:
Read-Host Receive-Job Receive-PSSession Register-EngineEvent Register-ObjectEvent
Register-PSSessionConfiguration Register-WmiEvent Remove-Computer Remove-Event
Remove-EventLog Remove-Item Remove-ItemProperty Remove-Job Remove-Module
Remove-PSBreakpoint Remove-PSDrive Remove-PSSession Remove-PSSnapin Remove-TypeData
Remove-Variable Remove-WmiObject Rename-Computer Rename-Item Rename-ItemProperty
Reset-ComputerMachinePassword Resolve-Path Restart-Computer Restart-Service
Restore-Computer Resume-Job Resume-Service
S:
Save-Help Select-Object Select-String Select-Xml Send-MailMessage Set-Acl Set-Alias
Set-AuthenticodeSignature Set-Content Set-Date Set-ExecutionPolicy Set-Item
Set-ItemProperty Set-Location Set-PSBreakpoint Set-PSDebug
Set-PSSessionConfiguration Set-Service Set-StrictMode Set-TraceSource Set-Variable
Set-WmiInstance Show-Command Show-ControlPanelItem Show-EventLog Sort-Object
Split-Path Start-Job Start-Process Start-Service Start-Sleep Start-Transaction
Start-Transcript Stop-Computer Stop-Job Stop-Process Stop-Service Stop-Transcript
Suspend-Job Suspend-Service
T:
TabExpansion2 Tee-Object Test-ComputerSecureChannel Test-Connection
Test-ModuleManifest Test-Path Test-PSSessionConfigurationFile Trace-Command
U:
Unblock-File Undo-Transaction Unregister-Event Unregister-PSSessionConfiguration
Update-FormatData Update-Help Update-List Update-TypeData Use-Transaction
V:
W:
Wait-Event Wait-Job Wait-Process Where-Object Write-Debug Write-Error Write-EventLog
Write-Host Write-Output Write-Progress Write-Verbose Write-Warning
X:
Y:
Z:</textarea></div>
      <script>
        var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
          mode: "powershell",
          lineNumbers: true,
          indentUnit: 4,
          tabMode: "shift",
          matchBrackets: true
        });
      </script>

      <p><strong>MIME types defined:</strong> <code>application/x-powershell</code>.</p>
    </article>
  </body>
</html>
codemirror/mode/powershell/test.js000064400000005517151215013500013337 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function() {
  var mode = CodeMirror.getMode({indentUnit: 2}, "powershell");
  function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); }

  MT('comment', '[number 1][comment # A]');
  MT('comment_multiline', '[number 1][comment <#]',
    '[comment ABC]',
  '[comment #>][number 2]');

  [
    '0', '1234',
    '12kb', '12mb', '12Gb', '12Tb', '12PB', '12L', '12D', '12lkb', '12dtb',
    '1.234', '1.234e56', '1.', '1.e2', '.2', '.2e34',
    '1.2MB', '1.kb', '.1dTB', '1.e1gb', '.2', '.2e34',
    '0x1', '0xabcdef', '0x3tb', '0xelmb'
  ].forEach(function(number) {
    MT("number_" + number, "[number " + number + "]");
  });

  MT('string_literal_escaping', "[string 'a''']");
  MT('string_literal_variable', "[string 'a $x']");
  MT('string_escaping_1', '[string "a `""]');
  MT('string_escaping_2', '[string "a """]');
  MT('string_variable_escaping', '[string "a `$x"]');
  MT('string_variable', '[string "a ][variable-2 $x][string  b"]');
  MT('string_variable_spaces', '[string "a ][variable-2 ${x y}][string  b"]');
  MT('string_expression', '[string "a ][punctuation jQuery(][variable-2 $x][operator +][number 3][punctuation )][string  b"]');
  MT('string_expression_nested', '[string "A][punctuation jQuery(][string "a][punctuation jQuery(][string "w"][punctuation )][string b"][punctuation )][string B"]');

  MT('string_heredoc', '[string @"]',
    '[string abc]',
  '[string "@]');
  MT('string_heredoc_quotes', '[string @"]',
    '[string abc "\']',
  '[string "@]');
  MT('string_heredoc_variable', '[string @"]',
    '[string a ][variable-2 $x][string  b]',
  '[string "@]');
  MT('string_heredoc_nested_string', '[string @"]',
    '[string a][punctuation jQuery(][string "w"][punctuation )][string b]',
  '[string "@]');
  MT('string_heredoc_literal_quotes', "[string @']",
    '[string abc "\']',
  "[string '@]");

  MT('array', "[punctuation @(][string 'a'][punctuation ,][string 'b'][punctuation )]");
  MT('hash', "[punctuation @{][string 'key'][operator :][string 'value'][punctuation }]");

  MT('variable', "[variable-2 $test]");
  MT('variable_global',  "[variable-2 $global:test]");
  MT('variable_spaces',  "[variable-2 ${test test}]");
  MT('operator_splat',   "[variable-2 @x]");
  MT('variable_builtin', "[builtin $ErrorActionPreference]");
  MT('variable_builtin_symbols', "[builtin $$]");

  MT('operator', "[operator +]");
  MT('operator_unary', "[operator +][number 3]");
  MT('operator_long', "[operator -match]");

  [
    '(', ')', '[[', ']]', '{', '}', ',', '`', ';', '.'
  ].forEach(function(punctuation) {
    MT("punctuation_" + punctuation.replace(/^[\[\]]/,''), "[punctuation " + punctuation + "]");
  });

  MT('keyword', "[keyword if]");

  MT('call_builtin', "[builtin Get-ChildItem]");
})();
codemirror/mode/clike/scala.html000064400000067546151215013500012710 0ustar00<!doctype html>

<title>CodeMirror: Scala mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<link rel="stylesheet" href="../../theme/ambiance.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="clike.js"></script>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Scala</a>
  </ul>
</div>

<article>
<h2>Scala mode</h2>
<form>
<textarea id="code" name="code">

  /*                     __                                               *\
  **     ________ ___   / /  ___     Scala API                            **
  **    / __/ __// _ | / /  / _ |    (c) 2003-2011, LAMP/EPFL             **
  **  __\ \/ /__/ __ |/ /__/ __ |    http://scala-lang.org/               **
  ** /____/\___/_/ |_/____/_/ | |                                         **
  **                          |/                                          **
  \*                                                                      */

  package scala.collection

  import generic._
  import mutable.{ Builder, ListBuffer }
  import annotation.{tailrec, migration, bridge}
  import annotation.unchecked.{ uncheckedVariance => uV }
  import parallel.ParIterable

  /** A template trait for traversable collections of type `Traversable[A]`.
   *  
   *  $traversableInfo
   *  @define mutability
   *  @define traversableInfo
   *  This is a base trait of all kinds of $mutability Scala collections. It
   *  implements the behavior common to all collections, in terms of a method
   *  `foreach` with signature:
   * {{{
   *     def foreach[U](f: Elem => U): Unit
   * }}}
   *  Collection classes mixing in this trait provide a concrete 
   *  `foreach` method which traverses all the
   *  elements contained in the collection, applying a given function to each.
   *  They also need to provide a method `newBuilder`
   *  which creates a builder for collections of the same kind.
   *  
   *  A traversable class might or might not have two properties: strictness
   *  and orderedness. Neither is represented as a type.
   *  
   *  The instances of a strict collection class have all their elements
   *  computed before they can be used as values. By contrast, instances of
   *  a non-strict collection class may defer computation of some of their
   *  elements until after the instance is available as a value.
   *  A typical example of a non-strict collection class is a
   *  <a href="../immutable/Stream.html" target="ContentFrame">
   *  `scala.collection.immutable.Stream`</a>.
   *  A more general class of examples are `TraversableViews`.
   *  
   *  If a collection is an instance of an ordered collection class, traversing
   *  its elements with `foreach` will always visit elements in the
   *  same order, even for different runs of the program. If the class is not
   *  ordered, `foreach` can visit elements in different orders for
   *  different runs (but it will keep the same order in the same run).'
   * 
   *  A typical example of a collection class which is not ordered is a
   *  `HashMap` of objects. The traversal order for hash maps will
   *  depend on the hash codes of its elements, and these hash codes might
   *  differ from one run to the next. By contrast, a `LinkedHashMap`
   *  is ordered because it's `foreach` method visits elements in the
   *  order they were inserted into the `HashMap`.
   *
   *  @author Martin Odersky
   *  @version 2.8
   *  @since   2.8
   *  @tparam A    the element type of the collection
   *  @tparam Repr the type of the actual collection containing the elements.
   *
   *  @define Coll Traversable
   *  @define coll traversable collection
   */
  trait TraversableLike[+A, +Repr] extends HasNewBuilder[A, Repr] 
                                      with FilterMonadic[A, Repr]
                                      with TraversableOnce[A]
                                      with GenTraversableLike[A, Repr]
                                      with Parallelizable[A, ParIterable[A]]
  {
    self =>

    import Traversable.breaks._

    /** The type implementing this traversable */
    protected type Self = Repr

    /** The collection of type $coll underlying this `TraversableLike` object.
     *  By default this is implemented as the `TraversableLike` object itself,
     *  but this can be overridden.
     */
    def repr: Repr = this.asInstanceOf[Repr]

    /** The underlying collection seen as an instance of `$Coll`.
     *  By default this is implemented as the current collection object itself,
     *  but this can be overridden.
     */
    protected[this] def thisCollection: Traversable[A] = this.asInstanceOf[Traversable[A]]

    /** A conversion from collections of type `Repr` to `$Coll` objects.
     *  By default this is implemented as just a cast, but this can be overridden.
     */
    protected[this] def toCollection(repr: Repr): Traversable[A] = repr.asInstanceOf[Traversable[A]]

    /** Creates a new builder for this collection type.
     */
    protected[this] def newBuilder: Builder[A, Repr]

    protected[this] def parCombiner = ParIterable.newCombiner[A]

    /** Applies a function `f` to all elements of this $coll.
     *  
     *    Note: this method underlies the implementation of most other bulk operations.
     *    It's important to implement this method in an efficient way.
     *  
     *
     *  @param  f   the function that is applied for its side-effect to every element.
     *              The result of function `f` is discarded.
     *              
     *  @tparam  U  the type parameter describing the result of function `f`. 
     *              This result will always be ignored. Typically `U` is `Unit`,
     *              but this is not necessary.
     *
     *  @usecase def foreach(f: A => Unit): Unit
     */
    def foreach[U](f: A => U): Unit

    /** Tests whether this $coll is empty.
     *
     *  @return    `true` if the $coll contain no elements, `false` otherwise.
     */
    def isEmpty: Boolean = {
      var result = true
      breakable {
        for (x <- this) {
          result = false
          break
        }
      }
      result
    }

    /** Tests whether this $coll is known to have a finite size.
     *  All strict collections are known to have finite size. For a non-strict collection
     *  such as `Stream`, the predicate returns `true` if all elements have been computed.
     *  It returns `false` if the stream is not yet evaluated to the end.
     *
     *  Note: many collection methods will not work on collections of infinite sizes. 
     *
     *  @return  `true` if this collection is known to have finite size, `false` otherwise.
     */
    def hasDefiniteSize = true

    def ++[B >: A, That](that: GenTraversableOnce[B])(implicit bf: CanBuildFrom[Repr, B, That]): That = {
      val b = bf(repr)
      if (that.isInstanceOf[IndexedSeqLike[_, _]]) b.sizeHint(this, that.seq.size)
      b ++= thisCollection
      b ++= that.seq
      b.result
    }

    @bridge
    def ++[B >: A, That](that: TraversableOnce[B])(implicit bf: CanBuildFrom[Repr, B, That]): That =
      ++(that: GenTraversableOnce[B])(bf)

    /** Concatenates this $coll with the elements of a traversable collection.
     *  It differs from ++ in that the right operand determines the type of the
     *  resulting collection rather than the left one.
     * 
     *  @param that   the traversable to append.
     *  @tparam B     the element type of the returned collection. 
     *  @tparam That  $thatinfo
     *  @param bf     $bfinfo
     *  @return       a new collection of type `That` which contains all elements
     *                of this $coll followed by all elements of `that`.
     * 
     *  @usecase def ++:[B](that: TraversableOnce[B]): $Coll[B]
     *  
     *  @return       a new $coll which contains all elements of this $coll
     *                followed by all elements of `that`.
     */
    def ++:[B >: A, That](that: TraversableOnce[B])(implicit bf: CanBuildFrom[Repr, B, That]): That = {
      val b = bf(repr)
      if (that.isInstanceOf[IndexedSeqLike[_, _]]) b.sizeHint(this, that.size)
      b ++= that
      b ++= thisCollection
      b.result
    }

    /** This overload exists because: for the implementation of ++: we should reuse
     *  that of ++ because many collections override it with more efficient versions.
     *  Since TraversableOnce has no '++' method, we have to implement that directly,
     *  but Traversable and down can use the overload.
     */
    def ++:[B >: A, That](that: Traversable[B])(implicit bf: CanBuildFrom[Repr, B, That]): That =
      (that ++ seq)(breakOut)

    def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That = {
      val b = bf(repr)
      b.sizeHint(this) 
      for (x <- this) b += f(x)
      b.result
    }

    def flatMap[B, That](f: A => GenTraversableOnce[B])(implicit bf: CanBuildFrom[Repr, B, That]): That = {
      val b = bf(repr)
      for (x <- this) b ++= f(x).seq
      b.result
    }

    /** Selects all elements of this $coll which satisfy a predicate.
     *
     *  @param p     the predicate used to test elements.
     *  @return      a new $coll consisting of all elements of this $coll that satisfy the given
     *               predicate `p`. The order of the elements is preserved.
     */
    def filter(p: A => Boolean): Repr = {
      val b = newBuilder
      for (x <- this) 
        if (p(x)) b += x
      b.result
    }

    /** Selects all elements of this $coll which do not satisfy a predicate.
     *
     *  @param p     the predicate used to test elements.
     *  @return      a new $coll consisting of all elements of this $coll that do not satisfy the given
     *               predicate `p`. The order of the elements is preserved.
     */
    def filterNot(p: A => Boolean): Repr = filter(!p(_))

    def collect[B, That](pf: PartialFunction[A, B])(implicit bf: CanBuildFrom[Repr, B, That]): That = {
      val b = bf(repr)
      for (x <- this) if (pf.isDefinedAt(x)) b += pf(x)
      b.result
    }

    /** Builds a new collection by applying an option-valued function to all
     *  elements of this $coll on which the function is defined.
     *
     *  @param f      the option-valued function which filters and maps the $coll.
     *  @tparam B     the element type of the returned collection.
     *  @tparam That  $thatinfo
     *  @param bf     $bfinfo
     *  @return       a new collection of type `That` resulting from applying the option-valued function
     *                `f` to each element and collecting all defined results.
     *                The order of the elements is preserved.
     *
     *  @usecase def filterMap[B](f: A => Option[B]): $Coll[B]
     *  
     *  @param pf     the partial function which filters and maps the $coll.
     *  @return       a new $coll resulting from applying the given option-valued function
     *                `f` to each element and collecting all defined results.
     *                The order of the elements is preserved.
    def filterMap[B, That](f: A => Option[B])(implicit bf: CanBuildFrom[Repr, B, That]): That = {
      val b = bf(repr)
      for (x <- this) 
        f(x) match {
          case Some(y) => b += y
          case _ =>
        }
      b.result
    }
     */

    /** Partitions this $coll in two ${coll}s according to a predicate.
     *
     *  @param p the predicate on which to partition.
     *  @return  a pair of ${coll}s: the first $coll consists of all elements that 
     *           satisfy the predicate `p` and the second $coll consists of all elements
     *           that don't. The relative order of the elements in the resulting ${coll}s
     *           is the same as in the original $coll.
     */
    def partition(p: A => Boolean): (Repr, Repr) = {
      val l, r = newBuilder
      for (x <- this) (if (p(x)) l else r) += x
      (l.result, r.result)
    }

    def groupBy[K](f: A => K): immutable.Map[K, Repr] = {
      val m = mutable.Map.empty[K, Builder[A, Repr]]
      for (elem <- this) {
        val key = f(elem)
        val bldr = m.getOrElseUpdate(key, newBuilder)
        bldr += elem
      }
      val b = immutable.Map.newBuilder[K, Repr]
      for ((k, v) <- m)
        b += ((k, v.result))

      b.result
    }

    /** Tests whether a predicate holds for all elements of this $coll.
     *
     *  $mayNotTerminateInf
     *
     *  @param   p     the predicate used to test elements.
     *  @return        `true` if the given predicate `p` holds for all elements
     *                 of this $coll, otherwise `false`.
     */
    def forall(p: A => Boolean): Boolean = {
      var result = true
      breakable {
        for (x <- this)
          if (!p(x)) { result = false; break }
      }
      result
    }

    /** Tests whether a predicate holds for some of the elements of this $coll.
     *
     *  $mayNotTerminateInf
     *
     *  @param   p     the predicate used to test elements.
     *  @return        `true` if the given predicate `p` holds for some of the
     *                 elements of this $coll, otherwise `false`.
     */
    def exists(p: A => Boolean): Boolean = {
      var result = false
      breakable {
        for (x <- this)
          if (p(x)) { result = true; break }
      }
      result
    }

    /** Finds the first element of the $coll satisfying a predicate, if any.
     * 
     *  $mayNotTerminateInf
     *  $orderDependent
     *
     *  @param p    the predicate used to test elements.
     *  @return     an option value containing the first element in the $coll
     *              that satisfies `p`, or `None` if none exists.
     */
    def find(p: A => Boolean): Option[A] = {
      var result: Option[A] = None
      breakable {
        for (x <- this)
          if (p(x)) { result = Some(x); break }
      }
      result
    }

    def scan[B >: A, That](z: B)(op: (B, B) => B)(implicit cbf: CanBuildFrom[Repr, B, That]): That = scanLeft(z)(op)

    def scanLeft[B, That](z: B)(op: (B, A) => B)(implicit bf: CanBuildFrom[Repr, B, That]): That = {
      val b = bf(repr)
      b.sizeHint(this, 1)
      var acc = z
      b += acc
      for (x <- this) { acc = op(acc, x); b += acc }
      b.result
    }

    @migration(2, 9,
      "This scanRight definition has changed in 2.9.\n" +
      "The previous behavior can be reproduced with scanRight.reverse."
    )
    def scanRight[B, That](z: B)(op: (A, B) => B)(implicit bf: CanBuildFrom[Repr, B, That]): That = {
      var scanned = List(z)
      var acc = z
      for (x <- reversed) {
        acc = op(x, acc)
        scanned ::= acc
      }
      val b = bf(repr)
      for (elem <- scanned) b += elem
      b.result
    }

    /** Selects the first element of this $coll.
     *  $orderDependent
     *  @return  the first element of this $coll.
     *  @throws `NoSuchElementException` if the $coll is empty.
     */
    def head: A = {
      var result: () => A = () => throw new NoSuchElementException
      breakable {
        for (x <- this) {
          result = () => x
          break
        }
      }
      result()
    }

    /** Optionally selects the first element.
     *  $orderDependent
     *  @return  the first element of this $coll if it is nonempty, `None` if it is empty.
     */
    def headOption: Option[A] = if (isEmpty) None else Some(head)

    /** Selects all elements except the first.
     *  $orderDependent
     *  @return  a $coll consisting of all elements of this $coll
     *           except the first one.
     *  @throws `UnsupportedOperationException` if the $coll is empty.
     */ 
    override def tail: Repr = {
      if (isEmpty) throw new UnsupportedOperationException("empty.tail")
      drop(1)
    }

    /** Selects the last element.
      * $orderDependent
      * @return The last element of this $coll.
      * @throws NoSuchElementException If the $coll is empty.
      */
    def last: A = {
      var lst = head
      for (x <- this)
        lst = x
      lst
    }

    /** Optionally selects the last element.
     *  $orderDependent
     *  @return  the last element of this $coll$ if it is nonempty, `None` if it is empty.
     */
    def lastOption: Option[A] = if (isEmpty) None else Some(last)

    /** Selects all elements except the last.
     *  $orderDependent
     *  @return  a $coll consisting of all elements of this $coll
     *           except the last one.
     *  @throws `UnsupportedOperationException` if the $coll is empty.
     */
    def init: Repr = {
      if (isEmpty) throw new UnsupportedOperationException("empty.init")
      var lst = head
      var follow = false
      val b = newBuilder
      b.sizeHint(this, -1)
      for (x <- this.seq) {
        if (follow) b += lst
        else follow = true
        lst = x
      }
      b.result
    }

    def take(n: Int): Repr = slice(0, n)

    def drop(n: Int): Repr = 
      if (n <= 0) {
        val b = newBuilder
        b.sizeHint(this)
        b ++= thisCollection result
      }
      else sliceWithKnownDelta(n, Int.MaxValue, -n)

    def slice(from: Int, until: Int): Repr = sliceWithKnownBound(math.max(from, 0), until)

    // Precondition: from >= 0, until > 0, builder already configured for building.
    private[this] def sliceInternal(from: Int, until: Int, b: Builder[A, Repr]): Repr = {
      var i = 0
      breakable {
        for (x <- this.seq) {
          if (i >= from) b += x
          i += 1
          if (i >= until) break
        }
      }
      b.result
    }
    // Precondition: from >= 0
    private[scala] def sliceWithKnownDelta(from: Int, until: Int, delta: Int): Repr = {
      val b = newBuilder
      if (until <= from) b.result
      else {
        b.sizeHint(this, delta)
        sliceInternal(from, until, b)
      }
    }
    // Precondition: from >= 0
    private[scala] def sliceWithKnownBound(from: Int, until: Int): Repr = {
      val b = newBuilder
      if (until <= from) b.result
      else {
        b.sizeHintBounded(until - from, this)      
        sliceInternal(from, until, b)
      }
    }

    def takeWhile(p: A => Boolean): Repr = {
      val b = newBuilder
      breakable {
        for (x <- this) {
          if (!p(x)) break
          b += x
        }
      }
      b.result
    }

    def dropWhile(p: A => Boolean): Repr = {
      val b = newBuilder
      var go = false
      for (x <- this) {
        if (!p(x)) go = true
        if (go) b += x
      }
      b.result
    }

    def span(p: A => Boolean): (Repr, Repr) = {
      val l, r = newBuilder
      var toLeft = true
      for (x <- this) {
        toLeft = toLeft && p(x)
        (if (toLeft) l else r) += x
      }
      (l.result, r.result)
    }

    def splitAt(n: Int): (Repr, Repr) = {
      val l, r = newBuilder
      l.sizeHintBounded(n, this)
      if (n >= 0) r.sizeHint(this, -n)
      var i = 0
      for (x <- this) {
        (if (i < n) l else r) += x
        i += 1
      }
      (l.result, r.result)
    }

    /** Iterates over the tails of this $coll. The first value will be this
     *  $coll and the final one will be an empty $coll, with the intervening
     *  values the results of successive applications of `tail`.
     *
     *  @return   an iterator over all the tails of this $coll
     *  @example  `List(1,2,3).tails = Iterator(List(1,2,3), List(2,3), List(3), Nil)`
     */  
    def tails: Iterator[Repr] = iterateUntilEmpty(_.tail)

    /** Iterates over the inits of this $coll. The first value will be this
     *  $coll and the final one will be an empty $coll, with the intervening
     *  values the results of successive applications of `init`.
     *
     *  @return  an iterator over all the inits of this $coll
     *  @example  `List(1,2,3).inits = Iterator(List(1,2,3), List(1,2), List(1), Nil)`
     */
    def inits: Iterator[Repr] = iterateUntilEmpty(_.init)

    /** Copies elements of this $coll to an array.
     *  Fills the given array `xs` with at most `len` elements of
     *  this $coll, starting at position `start`.
     *  Copying will stop once either the end of the current $coll is reached,
     *  or the end of the array is reached, or `len` elements have been copied.
     *
     *  $willNotTerminateInf
     * 
     *  @param  xs     the array to fill.
     *  @param  start  the starting index.
     *  @param  len    the maximal number of elements to copy.
     *  @tparam B      the type of the elements of the array. 
     * 
     *
     *  @usecase def copyToArray(xs: Array[A], start: Int, len: Int): Unit
     */
    def copyToArray[B >: A](xs: Array[B], start: Int, len: Int) {
      var i = start
      val end = (start + len) min xs.length
      breakable {
        for (x <- this) {
          if (i >= end) break
          xs(i) = x
          i += 1
        }
      }
    }

    def toTraversable: Traversable[A] = thisCollection
    def toIterator: Iterator[A] = toStream.iterator
    def toStream: Stream[A] = toBuffer.toStream

    /** Converts this $coll to a string.
     *
     *  @return   a string representation of this collection. By default this
     *            string consists of the `stringPrefix` of this $coll,
     *            followed by all elements separated by commas and enclosed in parentheses.
     */
    override def toString = mkString(stringPrefix + "(", ", ", ")")

    /** Defines the prefix of this object's `toString` representation.
     *
     *  @return  a string representation which starts the result of `toString`
     *           applied to this $coll. By default the string prefix is the
     *           simple name of the collection class $coll.
     */
    def stringPrefix : String = {
      var string = repr.asInstanceOf[AnyRef].getClass.getName
      val idx1 = string.lastIndexOf('.' : Int)
      if (idx1 != -1) string = string.substring(idx1 + 1)
      val idx2 = string.indexOf('$')
      if (idx2 != -1) string = string.substring(0, idx2)
      string
    }

    /** Creates a non-strict view of this $coll.
     * 
     *  @return a non-strict view of this $coll.
     */
    def view = new TraversableView[A, Repr] {
      protected lazy val underlying = self.repr
      override def foreach[U](f: A => U) = self foreach f
    }

    /** Creates a non-strict view of a slice of this $coll.
     *
     *  Note: the difference between `view` and `slice` is that `view` produces
     *        a view of the current $coll, whereas `slice` produces a new $coll.
     * 
     *  Note: `view(from, to)` is equivalent to `view.slice(from, to)`
     *  $orderDependent
     * 
     *  @param from   the index of the first element of the view
     *  @param until  the index of the element following the view
     *  @return a non-strict view of a slice of this $coll, starting at index `from`
     *  and extending up to (but not including) index `until`.
     */
    def view(from: Int, until: Int): TraversableView[A, Repr] = view.slice(from, until)

    /** Creates a non-strict filter of this $coll.
     *
     *  Note: the difference between `c filter p` and `c withFilter p` is that
     *        the former creates a new collection, whereas the latter only
     *        restricts the domain of subsequent `map`, `flatMap`, `foreach`,
     *        and `withFilter` operations.
     *  $orderDependent
     * 
     *  @param p   the predicate used to test elements.
     *  @return    an object of class `WithFilter`, which supports
     *             `map`, `flatMap`, `foreach`, and `withFilter` operations.
     *             All these operations apply to those elements of this $coll which
     *             satisfy the predicate `p`.
     */
    def withFilter(p: A => Boolean): FilterMonadic[A, Repr] = new WithFilter(p)

    /** A class supporting filtered operations. Instances of this class are
     *  returned by method `withFilter`.
     */
    class WithFilter(p: A => Boolean) extends FilterMonadic[A, Repr] {

      /** Builds a new collection by applying a function to all elements of the
       *  outer $coll containing this `WithFilter` instance that satisfy predicate `p`.
       *
       *  @param f      the function to apply to each element.
       *  @tparam B     the element type of the returned collection.
       *  @tparam That  $thatinfo
       *  @param bf     $bfinfo
       *  @return       a new collection of type `That` resulting from applying
       *                the given function `f` to each element of the outer $coll
       *                that satisfies predicate `p` and collecting the results.
       *
       *  @usecase def map[B](f: A => B): $Coll[B] 
       *  
       *  @return       a new $coll resulting from applying the given function
       *                `f` to each element of the outer $coll that satisfies
       *                predicate `p` and collecting the results.
       */
      def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That = {
        val b = bf(repr)
        for (x <- self) 
          if (p(x)) b += f(x)
        b.result
      }

      /** Builds a new collection by applying a function to all elements of the
       *  outer $coll containing this `WithFilter` instance that satisfy
       *  predicate `p` and concatenating the results. 
       *
       *  @param f      the function to apply to each element.
       *  @tparam B     the element type of the returned collection.
       *  @tparam That  $thatinfo
       *  @param bf     $bfinfo
       *  @return       a new collection of type `That` resulting from applying
       *                the given collection-valued function `f` to each element
       *                of the outer $coll that satisfies predicate `p` and
       *                concatenating the results.
       *
       *  @usecase def flatMap[B](f: A => TraversableOnce[B]): $Coll[B]
       * 
       *  @return       a new $coll resulting from applying the given collection-valued function
       *                `f` to each element of the outer $coll that satisfies predicate `p` and concatenating the results.
       */
      def flatMap[B, That](f: A => GenTraversableOnce[B])(implicit bf: CanBuildFrom[Repr, B, That]): That = {
        val b = bf(repr)
        for (x <- self) 
          if (p(x)) b ++= f(x).seq
        b.result
      }

      /** Applies a function `f` to all elements of the outer $coll containing
       *  this `WithFilter` instance that satisfy predicate `p`.
       *
       *  @param  f   the function that is applied for its side-effect to every element.
       *              The result of function `f` is discarded.
       *              
       *  @tparam  U  the type parameter describing the result of function `f`. 
       *              This result will always be ignored. Typically `U` is `Unit`,
       *              but this is not necessary.
       *
       *  @usecase def foreach(f: A => Unit): Unit
       */   
      def foreach[U](f: A => U): Unit = 
        for (x <- self) 
          if (p(x)) f(x)

      /** Further refines the filter for this $coll.
       *
       *  @param q   the predicate used to test elements.
       *  @return    an object of class `WithFilter`, which supports
       *             `map`, `flatMap`, `foreach`, and `withFilter` operations.
       *             All these operations apply to those elements of this $coll which
       *             satisfy the predicate `q` in addition to the predicate `p`.
       */
      def withFilter(q: A => Boolean): WithFilter = 
        new WithFilter(x => p(x) && q(x))
    }

    // A helper for tails and inits.
    private def iterateUntilEmpty(f: Traversable[A @uV] => Traversable[A @uV]): Iterator[Repr] = {
      val it = Iterator.iterate(thisCollection)(f) takeWhile (x => !x.isEmpty)
      it ++ Iterator(Nil) map (newBuilder ++= _ result)
    }
  }


</textarea>
</form>

    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        lineNumbers: true,
        matchBrackets: true,
        theme: "ambiance",
        mode: "text/x-scala"
      });
    </script>
  </article>
codemirror/mode/clike/clike.js000064400000074016151215013500012352 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

function Context(indented, column, type, info, align, prev) {
  this.indented = indented;
  this.column = column;
  this.type = type;
  this.info = info;
  this.align = align;
  this.prev = prev;
}
function pushContext(state, col, type, info) {
  var indent = state.indented;
  if (state.context && state.context.type != "statement" && type != "statement")
    indent = state.context.indented;
  return state.context = new Context(indent, col, type, info, null, state.context);
}
function popContext(state) {
  var t = state.context.type;
  if (t == ")" || t == "]" || t == "}")
    state.indented = state.context.indented;
  return state.context = state.context.prev;
}

function typeBefore(stream, state, pos) {
  if (state.prevToken == "variable" || state.prevToken == "variable-3") return true;
  if (/\S(?:[^- ]>|[*\]])\s*$|\*$/.test(stream.string.slice(0, pos))) return true;
  if (state.typeAtEndOfLine && stream.column() == stream.indentation()) return true;
}

function isTopScope(context) {
  for (;;) {
    if (!context || context.type == "top") return true;
    if (context.type == "}" && context.prev.info != "namespace") return false;
    context = context.prev;
  }
}

CodeMirror.defineMode("clike", function(config, parserConfig) {
  var indentUnit = config.indentUnit,
      statementIndentUnit = parserConfig.statementIndentUnit || indentUnit,
      dontAlignCalls = parserConfig.dontAlignCalls,
      keywords = parserConfig.keywords || {},
      types = parserConfig.types || {},
      builtin = parserConfig.builtin || {},
      blockKeywords = parserConfig.blockKeywords || {},
      defKeywords = parserConfig.defKeywords || {},
      atoms = parserConfig.atoms || {},
      hooks = parserConfig.hooks || {},
      multiLineStrings = parserConfig.multiLineStrings,
      indentStatements = parserConfig.indentStatements !== false,
      indentSwitch = parserConfig.indentSwitch !== false,
      namespaceSeparator = parserConfig.namespaceSeparator,
      isPunctuationChar = parserConfig.isPunctuationChar || /[\[\]{}\(\),;\:\.]/,
      numberStart = parserConfig.numberStart || /[\d\.]/,
      number = parserConfig.number || /^(?:0x[a-f\d]+|0b[01]+|(?:\d+\.?\d*|\.\d+)(?:e[-+]?\d+)?)(u|ll?|l|f)?/i,
      isOperatorChar = parserConfig.isOperatorChar || /[+\-*&%=<>!?|\/]/,
      endStatement = parserConfig.endStatement || /^[;:,]$/;

  var curPunc, isDefKeyword;

  function tokenBase(stream, state) {
    var ch = stream.next();
    if (hooks[ch]) {
      var result = hooks[ch](stream, state);
      if (result !== false) return result;
    }
    if (ch == '"' || ch == "'") {
      state.tokenize = tokenString(ch);
      return state.tokenize(stream, state);
    }
    if (isPunctuationChar.test(ch)) {
      curPunc = ch;
      return null;
    }
    if (numberStart.test(ch)) {
      stream.backUp(1)
      if (stream.match(number)) return "number"
      stream.next()
    }
    if (ch == "/") {
      if (stream.eat("*")) {
        state.tokenize = tokenComment;
        return tokenComment(stream, state);
      }
      if (stream.eat("/")) {
        stream.skipToEnd();
        return "comment";
      }
    }
    if (isOperatorChar.test(ch)) {
      while (!stream.match(/^\/[\/*]/, false) && stream.eat(isOperatorChar)) {}
      return "operator";
    }
    stream.eatWhile(/[\w\$_\xa1-\uffff]/);
    if (namespaceSeparator) while (stream.match(namespaceSeparator))
      stream.eatWhile(/[\w\$_\xa1-\uffff]/);

    var cur = stream.current();
    if (contains(keywords, cur)) {
      if (contains(blockKeywords, cur)) curPunc = "newstatement";
      if (contains(defKeywords, cur)) isDefKeyword = true;
      return "keyword";
    }
    if (contains(types, cur)) return "variable-3";
    if (contains(builtin, cur)) {
      if (contains(blockKeywords, cur)) curPunc = "newstatement";
      return "builtin";
    }
    if (contains(atoms, cur)) return "atom";
    return "variable";
  }

  function tokenString(quote) {
    return function(stream, state) {
      var escaped = false, next, end = false;
      while ((next = stream.next()) != null) {
        if (next == quote && !escaped) {end = true; break;}
        escaped = !escaped && next == "\\";
      }
      if (end || !(escaped || multiLineStrings))
        state.tokenize = null;
      return "string";
    };
  }

  function tokenComment(stream, state) {
    var maybeEnd = false, ch;
    while (ch = stream.next()) {
      if (ch == "/" && maybeEnd) {
        state.tokenize = null;
        break;
      }
      maybeEnd = (ch == "*");
    }
    return "comment";
  }

  function maybeEOL(stream, state) {
    if (parserConfig.typeFirstDefinitions && stream.eol() && isTopScope(state.context))
      state.typeAtEndOfLine = typeBefore(stream, state, stream.pos)
  }

  // Interface

  return {
    startState: function(basecolumn) {
      return {
        tokenize: null,
        context: new Context((basecolumn || 0) - indentUnit, 0, "top", null, false),
        indented: 0,
        startOfLine: true,
        prevToken: null
      };
    },

    token: function(stream, state) {
      var ctx = state.context;
      if (stream.sol()) {
        if (ctx.align == null) ctx.align = false;
        state.indented = stream.indentation();
        state.startOfLine = true;
      }
      if (stream.eatSpace()) { maybeEOL(stream, state); return null; }
      curPunc = isDefKeyword = null;
      var style = (state.tokenize || tokenBase)(stream, state);
      if (style == "comment" || style == "meta") return style;
      if (ctx.align == null) ctx.align = true;

      if (endStatement.test(curPunc)) while (state.context.type == "statement") popContext(state);
      else if (curPunc == "{") pushContext(state, stream.column(), "}");
      else if (curPunc == "[") pushContext(state, stream.column(), "]");
      else if (curPunc == "(") pushContext(state, stream.column(), ")");
      else if (curPunc == "}") {
        while (ctx.type == "statement") ctx = popContext(state);
        if (ctx.type == "}") ctx = popContext(state);
        while (ctx.type == "statement") ctx = popContext(state);
      }
      else if (curPunc == ctx.type) popContext(state);
      else if (indentStatements &&
               (((ctx.type == "}" || ctx.type == "top") && curPunc != ";") ||
                (ctx.type == "statement" && curPunc == "newstatement"))) {
        pushContext(state, stream.column(), "statement", stream.current());
      }

      if (style == "variable" &&
          ((state.prevToken == "def" ||
            (parserConfig.typeFirstDefinitions && typeBefore(stream, state, stream.start) &&
             isTopScope(state.context) && stream.match(/^\s*\(/, false)))))
        style = "def";

      if (hooks.token) {
        var result = hooks.token(stream, state, style);
        if (result !== undefined) style = result;
      }

      if (style == "def" && parserConfig.styleDefs === false) style = "variable";

      state.startOfLine = false;
      state.prevToken = isDefKeyword ? "def" : style || curPunc;
      maybeEOL(stream, state);
      return style;
    },

    indent: function(state, textAfter) {
      if (state.tokenize != tokenBase && state.tokenize != null || state.typeAtEndOfLine) return CodeMirror.Pass;
      var ctx = state.context, firstChar = textAfter && textAfter.charAt(0);
      if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev;
      if (parserConfig.dontIndentStatements)
        while (ctx.type == "statement" && parserConfig.dontIndentStatements.test(ctx.info))
          ctx = ctx.prev
      if (hooks.indent) {
        var hook = hooks.indent(state, ctx, textAfter);
        if (typeof hook == "number") return hook
      }
      var closing = firstChar == ctx.type;
      var switchBlock = ctx.prev && ctx.prev.info == "switch";
      if (parserConfig.allmanIndentation && /[{(]/.test(firstChar)) {
        while (ctx.type != "top" && ctx.type != "}") ctx = ctx.prev
        return ctx.indented
      }
      if (ctx.type == "statement")
        return ctx.indented + (firstChar == "{" ? 0 : statementIndentUnit);
      if (ctx.align && (!dontAlignCalls || ctx.type != ")"))
        return ctx.column + (closing ? 0 : 1);
      if (ctx.type == ")" && !closing)
        return ctx.indented + statementIndentUnit;

      return ctx.indented + (closing ? 0 : indentUnit) +
        (!closing && switchBlock && !/^(?:case|default)\b/.test(textAfter) ? indentUnit : 0);
    },

    electricInput: indentSwitch ? /^\s*(?:case .*?:|default:|\{\}?|\})$/ : /^\s*[{}]$/,
    blockCommentStart: "/*",
    blockCommentEnd: "*/",
    lineComment: "//",
    fold: "brace"
  };
});

  function words(str) {
    var obj = {}, words = str.split(" ");
    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
    return obj;
  }
  function contains(words, word) {
    if (typeof words === "function") {
      return words(word);
    } else {
      return words.propertyIsEnumerable(word);
    }
  }
  var cKeywords = "auto if break case register continue return default do sizeof " +
    "static else struct switch extern typedef union for goto while enum const volatile";
  var cTypes = "int long char short double float unsigned signed void size_t ptrdiff_t";

  function cppHook(stream, state) {
    if (!state.startOfLine) return false
    for (var ch, next = null; ch = stream.peek();) {
      if (ch == "\\" && stream.match(/^.$/)) {
        next = cppHook
        break
      } else if (ch == "/" && stream.match(/^\/[\/\*]/, false)) {
        break
      }
      stream.next()
    }
    state.tokenize = next
    return "meta"
  }

  function pointerHook(_stream, state) {
    if (state.prevToken == "variable-3") return "variable-3";
    return false;
  }

  function cpp14Literal(stream) {
    stream.eatWhile(/[\w\.']/);
    return "number";
  }

  function cpp11StringHook(stream, state) {
    stream.backUp(1);
    // Raw strings.
    if (stream.match(/(R|u8R|uR|UR|LR)/)) {
      var match = stream.match(/"([^\s\\()]{0,16})\(/);
      if (!match) {
        return false;
      }
      state.cpp11RawStringDelim = match[1];
      state.tokenize = tokenRawString;
      return tokenRawString(stream, state);
    }
    // Unicode strings/chars.
    if (stream.match(/(u8|u|U|L)/)) {
      if (stream.match(/["']/, /* eat */ false)) {
        return "string";
      }
      return false;
    }
    // Ignore this hook.
    stream.next();
    return false;
  }

  function cppLooksLikeConstructor(word) {
    var lastTwo = /(\w+)::(\w+)$/.exec(word);
    return lastTwo && lastTwo[1] == lastTwo[2];
  }

  // C#-style strings where "" escapes a quote.
  function tokenAtString(stream, state) {
    var next;
    while ((next = stream.next()) != null) {
      if (next == '"' && !stream.eat('"')) {
        state.tokenize = null;
        break;
      }
    }
    return "string";
  }

  // C++11 raw string literal is <prefix>"<delim>( anything )<delim>", where
  // <delim> can be a string up to 16 characters long.
  function tokenRawString(stream, state) {
    // Escape characters that have special regex meanings.
    var delim = state.cpp11RawStringDelim.replace(/[^\w\s]/g, '\\$&');
    var match = stream.match(new RegExp(".*?\\)" + delim + '"'));
    if (match)
      state.tokenize = null;
    else
      stream.skipToEnd();
    return "string";
  }

  function def(mimes, mode) {
    if (typeof mimes == "string") mimes = [mimes];
    var words = [];
    function add(obj) {
      if (obj) for (var prop in obj) if (obj.hasOwnProperty(prop))
        words.push(prop);
    }
    add(mode.keywords);
    add(mode.types);
    add(mode.builtin);
    add(mode.atoms);
    if (words.length) {
      mode.helperType = mimes[0];
      CodeMirror.registerHelper("hintWords", mimes[0], words);
    }

    for (var i = 0; i < mimes.length; ++i)
      CodeMirror.defineMIME(mimes[i], mode);
  }

  def(["text/x-csrc", "text/x-c", "text/x-chdr"], {
    name: "clike",
    keywords: words(cKeywords),
    types: words(cTypes + " bool _Complex _Bool float_t double_t intptr_t intmax_t " +
                 "int8_t int16_t int32_t int64_t uintptr_t uintmax_t uint8_t uint16_t " +
                 "uint32_t uint64_t"),
    blockKeywords: words("case do else for if switch while struct"),
    defKeywords: words("struct"),
    typeFirstDefinitions: true,
    atoms: words("null true false"),
    hooks: {"#": cppHook, "*": pointerHook},
    modeProps: {fold: ["brace", "include"]}
  });

  def(["text/x-c++src", "text/x-c++hdr"], {
    name: "clike",
    keywords: words(cKeywords + " asm dynamic_cast namespace reinterpret_cast try explicit new " +
                    "static_cast typeid catch operator template typename class friend private " +
                    "this using const_cast inline public throw virtual delete mutable protected " +
                    "alignas alignof constexpr decltype nullptr noexcept thread_local final " +
                    "static_assert override"),
    types: words(cTypes + " bool wchar_t"),
    blockKeywords: words("catch class do else finally for if struct switch try while"),
    defKeywords: words("class namespace struct enum union"),
    typeFirstDefinitions: true,
    atoms: words("true false null"),
    dontIndentStatements: /^template$/,
    hooks: {
      "#": cppHook,
      "*": pointerHook,
      "u": cpp11StringHook,
      "U": cpp11StringHook,
      "L": cpp11StringHook,
      "R": cpp11StringHook,
      "0": cpp14Literal,
      "1": cpp14Literal,
      "2": cpp14Literal,
      "3": cpp14Literal,
      "4": cpp14Literal,
      "5": cpp14Literal,
      "6": cpp14Literal,
      "7": cpp14Literal,
      "8": cpp14Literal,
      "9": cpp14Literal,
      token: function(stream, state, style) {
        if (style == "variable" && stream.peek() == "(" &&
            (state.prevToken == ";" || state.prevToken == null ||
             state.prevToken == "}") &&
            cppLooksLikeConstructor(stream.current()))
          return "def";
      }
    },
    namespaceSeparator: "::",
    modeProps: {fold: ["brace", "include"]}
  });

  def("text/x-java", {
    name: "clike",
    keywords: words("abstract assert break case catch class const continue default " +
                    "do else enum extends final finally float for goto if implements import " +
                    "instanceof interface native new package private protected public " +
                    "return static strictfp super switch synchronized this throw throws transient " +
                    "try volatile while"),
    types: words("byte short int long float double boolean char void Boolean Byte Character Double Float " +
                 "Integer Long Number Object Short String StringBuffer StringBuilder Void"),
    blockKeywords: words("catch class do else finally for if switch try while"),
    defKeywords: words("class interface package enum"),
    typeFirstDefinitions: true,
    atoms: words("true false null"),
    endStatement: /^[;:]$/,
    number: /^(?:0x[a-f\d_]+|0b[01_]+|(?:[\d_]+\.?\d*|\.\d+)(?:e[-+]?[\d_]+)?)(u|ll?|l|f)?/i,
    hooks: {
      "@": function(stream) {
        stream.eatWhile(/[\w\$_]/);
        return "meta";
      }
    },
    modeProps: {fold: ["brace", "import"]}
  });

  def("text/x-csharp", {
    name: "clike",
    keywords: words("abstract as async await base break case catch checked class const continue" +
                    " default delegate do else enum event explicit extern finally fixed for" +
                    " foreach goto if implicit in interface internal is lock namespace new" +
                    " operator out override params private protected public readonly ref return sealed" +
                    " sizeof stackalloc static struct switch this throw try typeof unchecked" +
                    " unsafe using virtual void volatile while add alias ascending descending dynamic from get" +
                    " global group into join let orderby partial remove select set value var yield"),
    types: words("Action Boolean Byte Char DateTime DateTimeOffset Decimal Double Func" +
                 " Guid Int16 Int32 Int64 Object SByte Single String Task TimeSpan UInt16 UInt32" +
                 " UInt64 bool byte char decimal double short int long object"  +
                 " sbyte float string ushort uint ulong"),
    blockKeywords: words("catch class do else finally for foreach if struct switch try while"),
    defKeywords: words("class interface namespace struct var"),
    typeFirstDefinitions: true,
    atoms: words("true false null"),
    hooks: {
      "@": function(stream, state) {
        if (stream.eat('"')) {
          state.tokenize = tokenAtString;
          return tokenAtString(stream, state);
        }
        stream.eatWhile(/[\w\$_]/);
        return "meta";
      }
    }
  });

  function tokenTripleString(stream, state) {
    var escaped = false;
    while (!stream.eol()) {
      if (!escaped && stream.match('"""')) {
        state.tokenize = null;
        break;
      }
      escaped = stream.next() == "\\" && !escaped;
    }
    return "string";
  }

  def("text/x-scala", {
    name: "clike",
    keywords: words(

      /* scala */
      "abstract case catch class def do else extends final finally for forSome if " +
      "implicit import lazy match new null object override package private protected return " +
      "sealed super this throw trait try type val var while with yield _ : = => <- <: " +
      "<% >: # @ " +

      /* package scala */
      "assert assume require print println printf readLine readBoolean readByte readShort " +
      "readChar readInt readLong readFloat readDouble " +

      ":: #:: "
    ),
    types: words(
      "AnyVal App Application Array BufferedIterator BigDecimal BigInt Char Console Either " +
      "Enumeration Equiv Error Exception Fractional Function IndexedSeq Int Integral Iterable " +
      "Iterator List Map Numeric Nil NotNull Option Ordered Ordering PartialFunction PartialOrdering " +
      "Product Proxy Range Responder Seq Serializable Set Specializable Stream StringBuilder " +
      "StringContext Symbol Throwable Traversable TraversableOnce Tuple Unit Vector " +

      /* package java.lang */
      "Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable " +
      "Compiler Double Exception Float Integer Long Math Number Object Package Pair Process " +
      "Runtime Runnable SecurityManager Short StackTraceElement StrictMath String " +
      "StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void"
    ),
    multiLineStrings: true,
    blockKeywords: words("catch class do else finally for forSome if match switch try while"),
    defKeywords: words("class def object package trait type val var"),
    atoms: words("true false null"),
    indentStatements: false,
    indentSwitch: false,
    hooks: {
      "@": function(stream) {
        stream.eatWhile(/[\w\$_]/);
        return "meta";
      },
      '"': function(stream, state) {
        if (!stream.match('""')) return false;
        state.tokenize = tokenTripleString;
        return state.tokenize(stream, state);
      },
      "'": function(stream) {
        stream.eatWhile(/[\w\$_\xa1-\uffff]/);
        return "atom";
      },
      "=": function(stream, state) {
        var cx = state.context
        if (cx.type == "}" && cx.align && stream.eat(">")) {
          state.context = new Context(cx.indented, cx.column, cx.type, cx.info, null, cx.prev)
          return "operator"
        } else {
          return false
        }
      }
    },
    modeProps: {closeBrackets: {triples: '"'}}
  });

  function tokenKotlinString(tripleString){
    return function (stream, state) {
      var escaped = false, next, end = false;
      while (!stream.eol()) {
        if (!tripleString && !escaped && stream.match('"') ) {end = true; break;}
        if (tripleString && stream.match('"""')) {end = true; break;}
        next = stream.next();
        if(!escaped && next == "$" && stream.match('{'))
          stream.skipTo("}");
        escaped = !escaped && next == "\\" && !tripleString;
      }
      if (end || !tripleString)
        state.tokenize = null;
      return "string";
    }
  }

  def("text/x-kotlin", {
    name: "clike",
    keywords: words(
      /*keywords*/
      "package as typealias class interface this super val " +
      "var fun for is in This throw return " +
      "break continue object if else while do try when !in !is as? " +

      /*soft keywords*/
      "file import where by get set abstract enum open inner override private public internal " +
      "protected catch finally out final vararg reified dynamic companion constructor init " +
      "sealed field property receiver param sparam lateinit data inline noinline tailrec " +
      "external annotation crossinline const operator infix"
    ),
    types: words(
      /* package java.lang */
      "Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable " +
      "Compiler Double Exception Float Integer Long Math Number Object Package Pair Process " +
      "Runtime Runnable SecurityManager Short StackTraceElement StrictMath String " +
      "StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void"
    ),
    intendSwitch: false,
    indentStatements: false,
    multiLineStrings: true,
    blockKeywords: words("catch class do else finally for if where try while enum"),
    defKeywords: words("class val var object package interface fun"),
    atoms: words("true false null this"),
    hooks: {
      '"': function(stream, state) {
        state.tokenize = tokenKotlinString(stream.match('""'));
        return state.tokenize(stream, state);
      }
    },
    modeProps: {closeBrackets: {triples: '"'}}
  });

  def(["x-shader/x-vertex", "x-shader/x-fragment"], {
    name: "clike",
    keywords: words("sampler1D sampler2D sampler3D samplerCube " +
                    "sampler1DShadow sampler2DShadow " +
                    "const attribute uniform varying " +
                    "break continue discard return " +
                    "for while do if else struct " +
                    "in out inout"),
    types: words("float int bool void " +
                 "vec2 vec3 vec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4 " +
                 "mat2 mat3 mat4"),
    blockKeywords: words("for while do if else struct"),
    builtin: words("radians degrees sin cos tan asin acos atan " +
                    "pow exp log exp2 sqrt inversesqrt " +
                    "abs sign floor ceil fract mod min max clamp mix step smoothstep " +
                    "length distance dot cross normalize ftransform faceforward " +
                    "reflect refract matrixCompMult " +
                    "lessThan lessThanEqual greaterThan greaterThanEqual " +
                    "equal notEqual any all not " +
                    "texture1D texture1DProj texture1DLod texture1DProjLod " +
                    "texture2D texture2DProj texture2DLod texture2DProjLod " +
                    "texture3D texture3DProj texture3DLod texture3DProjLod " +
                    "textureCube textureCubeLod " +
                    "shadow1D shadow2D shadow1DProj shadow2DProj " +
                    "shadow1DLod shadow2DLod shadow1DProjLod shadow2DProjLod " +
                    "dFdx dFdy fwidth " +
                    "noise1 noise2 noise3 noise4"),
    atoms: words("true false " +
                "gl_FragColor gl_SecondaryColor gl_Normal gl_Vertex " +
                "gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 " +
                "gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 " +
                "gl_FogCoord gl_PointCoord " +
                "gl_Position gl_PointSize gl_ClipVertex " +
                "gl_FrontColor gl_BackColor gl_FrontSecondaryColor gl_BackSecondaryColor " +
                "gl_TexCoord gl_FogFragCoord " +
                "gl_FragCoord gl_FrontFacing " +
                "gl_FragData gl_FragDepth " +
                "gl_ModelViewMatrix gl_ProjectionMatrix gl_ModelViewProjectionMatrix " +
                "gl_TextureMatrix gl_NormalMatrix gl_ModelViewMatrixInverse " +
                "gl_ProjectionMatrixInverse gl_ModelViewProjectionMatrixInverse " +
                "gl_TexureMatrixTranspose gl_ModelViewMatrixInverseTranspose " +
                "gl_ProjectionMatrixInverseTranspose " +
                "gl_ModelViewProjectionMatrixInverseTranspose " +
                "gl_TextureMatrixInverseTranspose " +
                "gl_NormalScale gl_DepthRange gl_ClipPlane " +
                "gl_Point gl_FrontMaterial gl_BackMaterial gl_LightSource gl_LightModel " +
                "gl_FrontLightModelProduct gl_BackLightModelProduct " +
                "gl_TextureColor gl_EyePlaneS gl_EyePlaneT gl_EyePlaneR gl_EyePlaneQ " +
                "gl_FogParameters " +
                "gl_MaxLights gl_MaxClipPlanes gl_MaxTextureUnits gl_MaxTextureCoords " +
                "gl_MaxVertexAttribs gl_MaxVertexUniformComponents gl_MaxVaryingFloats " +
                "gl_MaxVertexTextureImageUnits gl_MaxTextureImageUnits " +
                "gl_MaxFragmentUniformComponents gl_MaxCombineTextureImageUnits " +
                "gl_MaxDrawBuffers"),
    indentSwitch: false,
    hooks: {"#": cppHook},
    modeProps: {fold: ["brace", "include"]}
  });

  def("text/x-nesc", {
    name: "clike",
    keywords: words(cKeywords + "as atomic async call command component components configuration event generic " +
                    "implementation includes interface module new norace nx_struct nx_union post provides " +
                    "signal task uses abstract extends"),
    types: words(cTypes),
    blockKeywords: words("case do else for if switch while struct"),
    atoms: words("null true false"),
    hooks: {"#": cppHook},
    modeProps: {fold: ["brace", "include"]}
  });

  def("text/x-objectivec", {
    name: "clike",
    keywords: words(cKeywords + "inline restrict _Bool _Complex _Imaginary BOOL Class bycopy byref id IMP in " +
                    "inout nil oneway out Protocol SEL self super atomic nonatomic retain copy readwrite readonly"),
    types: words(cTypes),
    atoms: words("YES NO NULL NILL ON OFF true false"),
    hooks: {
      "@": function(stream) {
        stream.eatWhile(/[\w\$]/);
        return "keyword";
      },
      "#": cppHook,
      indent: function(_state, ctx, textAfter) {
        if (ctx.type == "statement" && /^@\w/.test(textAfter)) return ctx.indented
      }
    },
    modeProps: {fold: "brace"}
  });

  def("text/x-squirrel", {
    name: "clike",
    keywords: words("base break clone continue const default delete enum extends function in class" +
                    " foreach local resume return this throw typeof yield constructor instanceof static"),
    types: words(cTypes),
    blockKeywords: words("case catch class else for foreach if switch try while"),
    defKeywords: words("function local class"),
    typeFirstDefinitions: true,
    atoms: words("true false null"),
    hooks: {"#": cppHook},
    modeProps: {fold: ["brace", "include"]}
  });

  // Ceylon Strings need to deal with interpolation
  var stringTokenizer = null;
  function tokenCeylonString(type) {
    return function(stream, state) {
      var escaped = false, next, end = false;
      while (!stream.eol()) {
        if (!escaped && stream.match('"') &&
              (type == "single" || stream.match('""'))) {
          end = true;
          break;
        }
        if (!escaped && stream.match('``')) {
          stringTokenizer = tokenCeylonString(type);
          end = true;
          break;
        }
        next = stream.next();
        escaped = type == "single" && !escaped && next == "\\";
      }
      if (end)
          state.tokenize = null;
      return "string";
    }
  }

  def("text/x-ceylon", {
    name: "clike",
    keywords: words("abstracts alias assembly assert assign break case catch class continue dynamic else" +
                    " exists extends finally for function given if import in interface is let module new" +
                    " nonempty object of out outer package return satisfies super switch then this throw" +
                    " try value void while"),
    types: function(word) {
        // In Ceylon all identifiers that start with an uppercase are types
        var first = word.charAt(0);
        return (first === first.toUpperCase() && first !== first.toLowerCase());
    },
    blockKeywords: words("case catch class dynamic else finally for function if interface module new object switch try while"),
    defKeywords: words("class dynamic function interface module object package value"),
    builtin: words("abstract actual aliased annotation by default deprecated doc final formal late license" +
                   " native optional sealed see serializable shared suppressWarnings tagged throws variable"),
    isPunctuationChar: /[\[\]{}\(\),;\:\.`]/,
    isOperatorChar: /[+\-*&%=<>!?|^~:\/]/,
    numberStart: /[\d#$]/,
    number: /^(?:#[\da-fA-F_]+|\$[01_]+|[\d_]+[kMGTPmunpf]?|[\d_]+\.[\d_]+(?:[eE][-+]?\d+|[kMGTPmunpf]|)|)/i,
    multiLineStrings: true,
    typeFirstDefinitions: true,
    atoms: words("true false null larger smaller equal empty finished"),
    indentSwitch: false,
    styleDefs: false,
    hooks: {
      "@": function(stream) {
        stream.eatWhile(/[\w\$_]/);
        return "meta";
      },
      '"': function(stream, state) {
          state.tokenize = tokenCeylonString(stream.match('""') ? "triple" : "single");
          return state.tokenize(stream, state);
        },
      '`': function(stream, state) {
          if (!stringTokenizer || !stream.match('`')) return false;
          state.tokenize = stringTokenizer;
          stringTokenizer = null;
          return state.tokenize(stream, state);
        },
      "'": function(stream) {
        stream.eatWhile(/[\w\$_\xa1-\uffff]/);
        return "atom";
      },
      token: function(_stream, state, style) {
          if ((style == "variable" || style == "variable-3") &&
              state.prevToken == ".") {
            return "variable-2";
          }
        }
    },
    modeProps: {
        fold: ["brace", "import"],
        closeBrackets: {triples: '"'}
    }
  });

});
codemirror/mode/clike/index.html000064400000023571151215013500012722 0ustar00<!doctype html>

<title>CodeMirror: C-like mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<link rel="stylesheet" href="../../addon/hint/show-hint.css">
<script src="../../addon/hint/show-hint.js"></script>
<script src="clike.js"></script>
<style>.CodeMirror {border: 2px inset #dee;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">C-like</a>
  </ul>
</div>

<article>
<h2>C-like mode</h2>

<div><textarea id="c-code">
/* C demo code */

#include <zmq.h>
#include <pthread.h>
#include <semaphore.h>
#include <time.h>
#include <stdio.h>
#include <fcntl.h>
#include <malloc.h>

typedef struct {
  void* arg_socket;
  zmq_msg_t* arg_msg;
  char* arg_string;
  unsigned long arg_len;
  int arg_int, arg_command;

  int signal_fd;
  int pad;
  void* context;
  sem_t sem;
} acl_zmq_context;

#define p(X) (context->arg_##X)

void* zmq_thread(void* context_pointer) {
  acl_zmq_context* context = (acl_zmq_context*)context_pointer;
  char ok = 'K', err = 'X';
  int res;

  while (1) {
    while ((res = sem_wait(&amp;context->sem)) == EINTR);
    if (res) {write(context->signal_fd, &amp;err, 1); goto cleanup;}
    switch(p(command)) {
    case 0: goto cleanup;
    case 1: p(socket) = zmq_socket(context->context, p(int)); break;
    case 2: p(int) = zmq_close(p(socket)); break;
    case 3: p(int) = zmq_bind(p(socket), p(string)); break;
    case 4: p(int) = zmq_connect(p(socket), p(string)); break;
    case 5: p(int) = zmq_getsockopt(p(socket), p(int), (void*)p(string), &amp;p(len)); break;
    case 6: p(int) = zmq_setsockopt(p(socket), p(int), (void*)p(string), p(len)); break;
    case 7: p(int) = zmq_send(p(socket), p(msg), p(int)); break;
    case 8: p(int) = zmq_recv(p(socket), p(msg), p(int)); break;
    case 9: p(int) = zmq_poll(p(socket), p(int), p(len)); break;
    }
    p(command) = errno;
    write(context->signal_fd, &amp;ok, 1);
  }
 cleanup:
  close(context->signal_fd);
  free(context_pointer);
  return 0;
}

void* zmq_thread_init(void* zmq_context, int signal_fd) {
  acl_zmq_context* context = malloc(sizeof(acl_zmq_context));
  pthread_t thread;

  context->context = zmq_context;
  context->signal_fd = signal_fd;
  sem_init(&amp;context->sem, 1, 0);
  pthread_create(&amp;thread, 0, &amp;zmq_thread, context);
  pthread_detach(thread);
  return context;
}
</textarea></div>

<h2>C++ example</h2>

<div><textarea id="cpp-code">
#include <iostream>
#include "mystuff/util.h"

namespace {
enum Enum {
  VAL1, VAL2, VAL3
};

char32_t unicode_string = U"\U0010FFFF";
string raw_string = R"delim(anything
you
want)delim";

int Helper(const MyType& param) {
  return 0;
}
} // namespace

class ForwardDec;

template <class T, class V>
class Class : public BaseClass {
  const MyType<T, V> member_;

 public:
  const MyType<T, V>& Method() const {
    return member_;
  }

  void Method2(MyType<T, V>* value);
}

template <class T, class V>
void Class::Method2(MyType<T, V>* value) {
  std::out << 1 >> method();
  value->Method3(member_);
  member_ = value;
}
</textarea></div>

<h2>Objective-C example</h2>

<div><textarea id="objectivec-code">
/*
This is a longer comment
That spans two lines
*/

#import <Test/Test.h>
@implementation YourAppDelegate

// This is a one-line comment

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
  char myString[] = "This is a C character array";
  int test = 5;
  return YES;
}
</textarea></div>

<h2>Java example</h2>

<div><textarea id="java-code">
import com.demo.util.MyType;
import com.demo.util.MyInterface;

public enum Enum {
  VAL1, VAL2, VAL3
}

public class Class<T, V> implements MyInterface {
  public static final MyType<T, V> member;
  
  private class InnerClass {
    public int zero() {
      return 0;
    }
  }

  @Override
  public MyType method() {
    return member;
  }

  public void method2(MyType<T, V> value) {
    method();
    value.method3();
    member = value;
  }
}
</textarea></div>

<h2>Scala example</h2>

<div><textarea id="scala-code">
object FilterTest extends App {
  def filter(xs: List[Int], threshold: Int) = {
    def process(ys: List[Int]): List[Int] =
      if (ys.isEmpty) ys
      else if (ys.head < threshold) ys.head :: process(ys.tail)
      else process(ys.tail)
    process(xs)
  }
  println(filter(List(1, 9, 2, 8, 3, 7, 4), 5))
}
</textarea></div>

<h2>Kotlin mode</h2>

<div><textarea id="kotlin-code">
package org.wasabi.http

import java.util.concurrent.Executors
import java.net.InetSocketAddress
import org.wasabi.app.AppConfiguration
import io.netty.bootstrap.ServerBootstrap
import io.netty.channel.nio.NioEventLoopGroup
import io.netty.channel.socket.nio.NioServerSocketChannel
import org.wasabi.app.AppServer

public class HttpServer(private val appServer: AppServer) {

    val bootstrap: ServerBootstrap
    val primaryGroup: NioEventLoopGroup
    val workerGroup:  NioEventLoopGroup

    init {
        // Define worker groups
        primaryGroup = NioEventLoopGroup()
        workerGroup = NioEventLoopGroup()

        // Initialize bootstrap of server
        bootstrap = ServerBootstrap()

        bootstrap.group(primaryGroup, workerGroup)
        bootstrap.channel(javaClass<NioServerSocketChannel>())
        bootstrap.childHandler(NettyPipelineInitializer(appServer))
    }

    public fun start(wait: Boolean = true) {
        val channel = bootstrap.bind(appServer.configuration.port)?.sync()?.channel()

        if (wait) {
            channel?.closeFuture()?.sync()
        }
    }

    public fun stop() {
        // Shutdown all event loops
        primaryGroup.shutdownGracefully()
        workerGroup.shutdownGracefully()

        // Wait till all threads are terminated
        primaryGroup.terminationFuture().sync()
        workerGroup.terminationFuture().sync()
    }
}
</textarea></div>

<h2>Ceylon mode</h2>

<div><textarea id="ceylon-code">
"Produces the [[stream|Iterable]] that results from repeated
 application of the given [[function|next]] to the given
 [[first]] element of the stream, until the function first
 returns [[finished]]. If the given function never returns 
 `finished`, the resulting stream is infinite.

 For example:

     loop(0)(2.plus).takeWhile(10.largerThan)

 produces the stream `{ 0, 2, 4, 6, 8 }`."
tagged("Streams")
shared {Element+} loop&lt;Element&gt;(
        "The first element of the resulting stream."
        Element first)(
        "The function that produces the next element of the
         stream, given the current element. The function may
         return [[finished]] to indicate the end of the 
         stream."
        Element|Finished next(Element element))
    =&gt; let (start = first)
    object satisfies {Element+} {
        first =&gt; start;
        empty =&gt; false;
        function nextElement(Element element)
                =&gt; next(element);
        iterator()
                =&gt; object satisfies Iterator&lt;Element&gt; {
            variable Element|Finished current = start;
            shared actual Element|Finished next() {
                if (!is Finished result = current) {
                    current = nextElement(result);
                    return result;
                }
                else {
                    return finished;
                }
            }
        };
    };
</textarea></div>

    <script>
      var cEditor = CodeMirror.fromTextArea(document.getElementById("c-code"), {
        lineNumbers: true,
        matchBrackets: true,
        mode: "text/x-csrc"
      });
      var cppEditor = CodeMirror.fromTextArea(document.getElementById("cpp-code"), {
        lineNumbers: true,
        matchBrackets: true,
        mode: "text/x-c++src"
      });
      var javaEditor = CodeMirror.fromTextArea(document.getElementById("java-code"), {
        lineNumbers: true,
        matchBrackets: true,
        mode: "text/x-java"
      });
      var objectivecEditor = CodeMirror.fromTextArea(document.getElementById("objectivec-code"), {
        lineNumbers: true,
        matchBrackets: true,
        mode: "text/x-objectivec"
      });
      var scalaEditor = CodeMirror.fromTextArea(document.getElementById("scala-code"), {
        lineNumbers: true,
        matchBrackets: true,
        mode: "text/x-scala"
      });
      var kotlinEditor = CodeMirror.fromTextArea(document.getElementById("kotlin-code"), {
          lineNumbers: true,
          matchBrackets: true,
          mode: "text/x-kotlin"
      });
      var ceylonEditor = CodeMirror.fromTextArea(document.getElementById("ceylon-code"), {
          lineNumbers: true,
          matchBrackets: true,
          mode: "text/x-ceylon"
      });
      var mac = CodeMirror.keyMap.default == CodeMirror.keyMap.macDefault;
      CodeMirror.keyMap.default[(mac ? "Cmd" : "Ctrl") + "-Space"] = "autocomplete";
    </script>

    <p>Simple mode that tries to handle C-like languages as well as it
    can. Takes two configuration parameters: <code>keywords</code>, an
    object whose property names are the keywords in the language,
    and <code>useCPP</code>, which determines whether C preprocessor
    directives are recognized.</p>

    <p><strong>MIME types defined:</strong> <code>text/x-csrc</code>
    (C), <code>text/x-c++src</code> (C++), <code>text/x-java</code>
    (Java), <code>text/x-csharp</code> (C#),
    <code>text/x-objectivec</code> (Objective-C),
    <code>text/x-scala</code> (Scala), <code>text/x-vertex</code>
    <code>x-shader/x-fragment</code> (shader programs),
    <code>text/x-squirrel</code> (Squirrel) and
    <code>text/x-ceylon</code> (Ceylon)</p>
</article>
codemirror/mode/clike/test.js000064400000003617151215013500012241 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function() {
  var mode = CodeMirror.getMode({indentUnit: 2}, "text/x-c");
  function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); }

  MT("indent",
     "[variable-3 void] [def foo]([variable-3 void*] [variable a], [variable-3 int] [variable b]) {",
     "  [variable-3 int] [variable c] [operator =] [variable b] [operator +]",
     "    [number 1];",
     "  [keyword return] [operator *][variable a];",
     "}");

  MT("indent_switch",
     "[keyword switch] ([variable x]) {",
     "  [keyword case] [number 10]:",
     "    [keyword return] [number 20];",
     "  [keyword default]:",
     "    [variable printf]([string \"foo %c\"], [variable x]);",
     "}");

  MT("def",
     "[variable-3 void] [def foo]() {}",
     "[keyword struct] [def bar]{}",
     "[variable-3 int] [variable-3 *][def baz]() {}");

  MT("def_new_line",
     "::[variable std]::[variable SomeTerribleType][operator <][variable T][operator >]",
     "[def SomeLongMethodNameThatDoesntFitIntoOneLine]([keyword const] [variable MyType][operator &] [variable param]) {}")

  MT("double_block",
     "[keyword for] (;;)",
     "  [keyword for] (;;)",
     "    [variable x][operator ++];",
     "[keyword return];");

  MT("preprocessor",
     "[meta #define FOO 3]",
     "[variable-3 int] [variable foo];",
     "[meta #define BAR\\]",
     "[meta 4]",
     "[variable-3 unsigned] [variable-3 int] [variable bar] [operator =] [number 8];",
     "[meta #include <baz> ][comment // comment]")


  var mode_cpp = CodeMirror.getMode({indentUnit: 2}, "text/x-c++src");
  function MTCPP(name) { test.mode(name, mode_cpp, Array.prototype.slice.call(arguments, 1)); }

  MTCPP("cpp14_literal",
    "[number 10'000];",
    "[number 0b10'000];",
    "[number 0x10'000];",
    "[string '100000'];");
})();
codemirror/mode/d/index.html000064400000014325151215013500012053 0ustar00<!doctype html>

<title>CodeMirror: D mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="d.js"></script>
<style>.CodeMirror {border: 2px inset #dee;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">D</a>
  </ul>
</div>

<article>
<h2>D mode</h2>
<form><textarea id="code" name="code">
/* D demo code // copied from phobos/sd/metastrings.d */
// Written in the D programming language.

/**
Templates with which to do compile-time manipulation of strings.

Macros:
 WIKI = Phobos/StdMetastrings

Copyright: Copyright Digital Mars 2007 - 2009.
License:   <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>.
Authors:   jQuery(WEB digitalmars.com, Walter Bright),
           Don Clugston
Source:    jQuery(PHOBOSSRC std/_metastrings.d)
*/
/*
         Copyright Digital Mars 2007 - 2009.
Distributed under the Boost Software License, Version 1.0.
   (See accompanying file LICENSE_1_0.txt or copy at
         http://www.boost.org/LICENSE_1_0.txt)
 */
module std.metastrings;

/**
Formats constants into a string at compile time.  Analogous to jQuery(XREF
string,format).

Parameters:

A = tuple of constants, which can be strings, characters, or integral
    values.

Formats:
 *    The formats supported are %s for strings, and %%
 *    for the % character.
Example:
---
import std.metastrings;
import std.stdio;

void main()
{
  string s = Format!("Arg %s = %s", "foo", 27);
  writefln(s); // "Arg foo = 27"
}
 * ---
 */

template Format(A...)
{
    static if (A.length == 0)
        enum Format = "";
    else static if (is(typeof(A[0]) : const(char)[]))
        enum Format = FormatString!(A[0], A[1..$]);
    else
        enum Format = toStringNow!(A[0]) ~ Format!(A[1..$]);
}

template FormatString(const(char)[] F, A...)
{
    static if (F.length == 0)
        enum FormatString = Format!(A);
    else static if (F.length == 1)
        enum FormatString = F[0] ~ Format!(A);
    else static if (F[0..2] == "%s")
        enum FormatString
            = toStringNow!(A[0]) ~ FormatString!(F[2..$],A[1..$]);
    else static if (F[0..2] == "%%")
        enum FormatString = "%" ~ FormatString!(F[2..$],A);
    else
    {
        static assert(F[0] != '%', "unrecognized format %" ~ F[1]);
        enum FormatString = F[0] ~ FormatString!(F[1..$],A);
    }
}

unittest
{
    auto s = Format!("hel%slo", "world", -138, 'c', true);
    assert(s == "helworldlo-138ctrue", "[" ~ s ~ "]");
}

/**
 * Convert constant argument to a string.
 */

template toStringNow(ulong v)
{
    static if (v < 10)
        enum toStringNow = "" ~ cast(char)(v + '0');
    else
        enum toStringNow = toStringNow!(v / 10) ~ toStringNow!(v % 10);
}

unittest
{
    static assert(toStringNow!(1uL << 62) == "4611686018427387904");
}

/// ditto
template toStringNow(long v)
{
    static if (v < 0)
        enum toStringNow = "-" ~ toStringNow!(cast(ulong) -v);
    else
        enum toStringNow = toStringNow!(cast(ulong) v);
}

unittest
{
    static assert(toStringNow!(0x100000000) == "4294967296");
    static assert(toStringNow!(-138L) == "-138");
}

/// ditto
template toStringNow(uint U)
{
    enum toStringNow = toStringNow!(cast(ulong)U);
}

/// ditto
template toStringNow(int I)
{
    enum toStringNow = toStringNow!(cast(long)I);
}

/// ditto
template toStringNow(bool B)
{
    enum toStringNow = B ? "true" : "false";
}

/// ditto
template toStringNow(string S)
{
    enum toStringNow = S;
}

/// ditto
template toStringNow(char C)
{
    enum toStringNow = "" ~ C;
}


/********
 * Parse unsigned integer literal from the start of string s.
 * returns:
 *    .value = the integer literal as a string,
 *    .rest = the string following the integer literal
 * Otherwise:
 *    .value = null,
 *    .rest = s
 */

template parseUinteger(const(char)[] s)
{
    static if (s.length == 0)
    {
        enum value = "";
        enum rest = "";
    }
    else static if (s[0] >= '0' && s[0] <= '9')
    {
        enum value = s[0] ~ parseUinteger!(s[1..$]).value;
        enum rest = parseUinteger!(s[1..$]).rest;
    }
    else
    {
        enum value = "";
        enum rest = s;
    }
}

/********
Parse integer literal optionally preceded by jQuery(D '-') from the start
of string jQuery(D s).

Returns:
   .value = the integer literal as a string,
   .rest = the string following the integer literal

Otherwise:
   .value = null,
   .rest = s
*/

template parseInteger(const(char)[] s)
{
    static if (s.length == 0)
    {
        enum value = "";
        enum rest = "";
    }
    else static if (s[0] >= '0' && s[0] <= '9')
    {
        enum value = s[0] ~ parseUinteger!(s[1..$]).value;
        enum rest = parseUinteger!(s[1..$]).rest;
    }
    else static if (s.length >= 2 &&
            s[0] == '-' && s[1] >= '0' && s[1] <= '9')
    {
        enum value = s[0..2] ~ parseUinteger!(s[2..$]).value;
        enum rest = parseUinteger!(s[2..$]).rest;
    }
    else
    {
        enum value = "";
        enum rest = s;
    }
}

unittest
{
    assert(parseUinteger!("1234abc").value == "1234");
    assert(parseUinteger!("1234abc").rest == "abc");
    assert(parseInteger!("-1234abc").value == "-1234");
    assert(parseInteger!("-1234abc").rest == "abc");
}

/**
Deprecated aliases held for backward compatibility.
*/
deprecated alias toStringNow ToString;
/// Ditto
deprecated alias parseUinteger ParseUinteger;
/// Ditto
deprecated alias parseUinteger ParseInteger;

</textarea></form>

    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        lineNumbers: true,
        matchBrackets: true,
        indentUnit: 4,
        mode: "text/x-d"
      });
    </script>

    <p>Simple mode that handle D-Syntax (<a href="http://www.dlang.org">DLang Homepage</a>).</p>

    <p><strong>MIME types defined:</strong> <code>text/x-d</code>
    .</p>
  </article>
codemirror/mode/d/d.js000064400000016616151215013500010644 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("d", function(config, parserConfig) {
  var indentUnit = config.indentUnit,
      statementIndentUnit = parserConfig.statementIndentUnit || indentUnit,
      keywords = parserConfig.keywords || {},
      builtin = parserConfig.builtin || {},
      blockKeywords = parserConfig.blockKeywords || {},
      atoms = parserConfig.atoms || {},
      hooks = parserConfig.hooks || {},
      multiLineStrings = parserConfig.multiLineStrings;
  var isOperatorChar = /[+\-*&%=<>!?|\/]/;

  var curPunc;

  function tokenBase(stream, state) {
    var ch = stream.next();
    if (hooks[ch]) {
      var result = hooks[ch](stream, state);
      if (result !== false) return result;
    }
    if (ch == '"' || ch == "'" || ch == "`") {
      state.tokenize = tokenString(ch);
      return state.tokenize(stream, state);
    }
    if (/[\[\]{}\(\),;\:\.]/.test(ch)) {
      curPunc = ch;
      return null;
    }
    if (/\d/.test(ch)) {
      stream.eatWhile(/[\w\.]/);
      return "number";
    }
    if (ch == "/") {
      if (stream.eat("+")) {
        state.tokenize = tokenComment;
        return tokenNestedComment(stream, state);
      }
      if (stream.eat("*")) {
        state.tokenize = tokenComment;
        return tokenComment(stream, state);
      }
      if (stream.eat("/")) {
        stream.skipToEnd();
        return "comment";
      }
    }
    if (isOperatorChar.test(ch)) {
      stream.eatWhile(isOperatorChar);
      return "operator";
    }
    stream.eatWhile(/[\w\$_\xa1-\uffff]/);
    var cur = stream.current();
    if (keywords.propertyIsEnumerable(cur)) {
      if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement";
      return "keyword";
    }
    if (builtin.propertyIsEnumerable(cur)) {
      if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement";
      return "builtin";
    }
    if (atoms.propertyIsEnumerable(cur)) return "atom";
    return "variable";
  }

  function tokenString(quote) {
    return function(stream, state) {
      var escaped = false, next, end = false;
      while ((next = stream.next()) != null) {
        if (next == quote && !escaped) {end = true; break;}
        escaped = !escaped && next == "\\";
      }
      if (end || !(escaped || multiLineStrings))
        state.tokenize = null;
      return "string";
    };
  }

  function tokenComment(stream, state) {
    var maybeEnd = false, ch;
    while (ch = stream.next()) {
      if (ch == "/" && maybeEnd) {
        state.tokenize = null;
        break;
      }
      maybeEnd = (ch == "*");
    }
    return "comment";
  }

  function tokenNestedComment(stream, state) {
    var maybeEnd = false, ch;
    while (ch = stream.next()) {
      if (ch == "/" && maybeEnd) {
        state.tokenize = null;
        break;
      }
      maybeEnd = (ch == "+");
    }
    return "comment";
  }

  function Context(indented, column, type, align, prev) {
    this.indented = indented;
    this.column = column;
    this.type = type;
    this.align = align;
    this.prev = prev;
  }
  function pushContext(state, col, type) {
    var indent = state.indented;
    if (state.context && state.context.type == "statement")
      indent = state.context.indented;
    return state.context = new Context(indent, col, type, null, state.context);
  }
  function popContext(state) {
    var t = state.context.type;
    if (t == ")" || t == "]" || t == "}")
      state.indented = state.context.indented;
    return state.context = state.context.prev;
  }

  // Interface

  return {
    startState: function(basecolumn) {
      return {
        tokenize: null,
        context: new Context((basecolumn || 0) - indentUnit, 0, "top", false),
        indented: 0,
        startOfLine: true
      };
    },

    token: function(stream, state) {
      var ctx = state.context;
      if (stream.sol()) {
        if (ctx.align == null) ctx.align = false;
        state.indented = stream.indentation();
        state.startOfLine = true;
      }
      if (stream.eatSpace()) return null;
      curPunc = null;
      var style = (state.tokenize || tokenBase)(stream, state);
      if (style == "comment" || style == "meta") return style;
      if (ctx.align == null) ctx.align = true;

      if ((curPunc == ";" || curPunc == ":" || curPunc == ",") && ctx.type == "statement") popContext(state);
      else if (curPunc == "{") pushContext(state, stream.column(), "}");
      else if (curPunc == "[") pushContext(state, stream.column(), "]");
      else if (curPunc == "(") pushContext(state, stream.column(), ")");
      else if (curPunc == "}") {
        while (ctx.type == "statement") ctx = popContext(state);
        if (ctx.type == "}") ctx = popContext(state);
        while (ctx.type == "statement") ctx = popContext(state);
      }
      else if (curPunc == ctx.type) popContext(state);
      else if (((ctx.type == "}" || ctx.type == "top") && curPunc != ';') || (ctx.type == "statement" && curPunc == "newstatement"))
        pushContext(state, stream.column(), "statement");
      state.startOfLine = false;
      return style;
    },

    indent: function(state, textAfter) {
      if (state.tokenize != tokenBase && state.tokenize != null) return CodeMirror.Pass;
      var ctx = state.context, firstChar = textAfter && textAfter.charAt(0);
      if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev;
      var closing = firstChar == ctx.type;
      if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : statementIndentUnit);
      else if (ctx.align) return ctx.column + (closing ? 0 : 1);
      else return ctx.indented + (closing ? 0 : indentUnit);
    },

    electricChars: "{}"
  };
});

  function words(str) {
    var obj = {}, words = str.split(" ");
    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
    return obj;
  }

  var blockKeywords = "body catch class do else enum for foreach foreach_reverse if in interface mixin " +
                      "out scope struct switch try union unittest version while with";

  CodeMirror.defineMIME("text/x-d", {
    name: "d",
    keywords: words("abstract alias align asm assert auto break case cast cdouble cent cfloat const continue " +
                    "debug default delegate delete deprecated export extern final finally function goto immutable " +
                    "import inout invariant is lazy macro module new nothrow override package pragma private " +
                    "protected public pure ref return shared short static super synchronized template this " +
                    "throw typedef typeid typeof volatile __FILE__ __LINE__ __gshared __traits __vector __parameters " +
                    blockKeywords),
    blockKeywords: words(blockKeywords),
    builtin: words("bool byte char creal dchar double float idouble ifloat int ireal long real short ubyte " +
                   "ucent uint ulong ushort wchar wstring void size_t sizediff_t"),
    atoms: words("exit failure success true false null"),
    hooks: {
      "@": function(stream, _state) {
        stream.eatWhile(/[\w\$_]/);
        return "meta";
      }
    }
  });

});
codemirror/mode/pegjs/index.html000064400000003542151215013500012737 0ustar00<!doctype html>
<html>
  <head>
    <title>CodeMirror: PEG.js Mode</title>
    <meta charset="utf-8"/>
    <link rel=stylesheet href="../../doc/docs.css">

    <link rel="stylesheet" href="../../lib/codemirror.css">
    <script src="../../lib/codemirror.js"></script>
    <script src="../javascript/javascript.js"></script>
    <script src="pegjs.js"></script>
    <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
  </head>
  <body>
    <div id=nav>
      <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

      <ul>
        <li><a href="../../index.html">Home</a>
        <li><a href="../../doc/manual.html">Manual</a>
        <li><a href="https://github.com/codemirror/codemirror">Code</a>
      </ul>
      <ul>
        <li><a href="../index.html">Language modes</a>
        <li><a class=active href="#">PEG.js Mode</a>
      </ul>
    </div>

    <article>
      <h2>PEG.js Mode</h2>
      <form><textarea id="code" name="code">
/*
 * Classic example grammar, which recognizes simple arithmetic expressions like
 * "2*(3+4)". The parser generated from this grammar then computes their value.
 */

start
  = additive

additive
  = left:multiplicative "+" right:additive { return left + right; }
  / multiplicative

multiplicative
  = left:primary "*" right:multiplicative { return left * right; }
  / primary

primary
  = integer
  / "(" additive:additive ")" { return additive; }

integer "integer"
  = digits:[0-9]+ { return parseInt(digits.join(""), 10); }

letter = [a-z]+</textarea></form>
      <script>
        var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
          mode: {name: "pegjs"},
          lineNumbers: true
        });
      </script>
      <h3>The PEG.js Mode</h3>
      <p> Created by Forbes Lindesay.</p>
    </article>
  </body>
</html>
codemirror/mode/pegjs/pegjs.js000064400000006771151215013500012417 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"), require("../javascript/javascript"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror", "../javascript/javascript"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("pegjs", function (config) {
  var jsMode = CodeMirror.getMode(config, "javascript");

  function identifier(stream) {
    return stream.match(/^[a-zA-Z_][a-zA-Z0-9_]*/);
  }

  return {
    startState: function () {
      return {
        inString: false,
        stringType: null,
        inComment: false,
        inCharacterClass: false,
        braced: 0,
        lhs: true,
        localState: null
      };
    },
    token: function (stream, state) {
      if (stream)

      //check for state changes
      if (!state.inString && !state.inComment && ((stream.peek() == '"') || (stream.peek() == "'"))) {
        state.stringType = stream.peek();
        stream.next(); // Skip quote
        state.inString = true; // Update state
      }
      if (!state.inString && !state.inComment && stream.match(/^\/\*/)) {
        state.inComment = true;
      }

      //return state
      if (state.inString) {
        while (state.inString && !stream.eol()) {
          if (stream.peek() === state.stringType) {
            stream.next(); // Skip quote
            state.inString = false; // Clear flag
          } else if (stream.peek() === '\\') {
            stream.next();
            stream.next();
          } else {
            stream.match(/^.[^\\\"\']*/);
          }
        }
        return state.lhs ? "property string" : "string"; // Token style
      } else if (state.inComment) {
        while (state.inComment && !stream.eol()) {
          if (stream.match(/\*\//)) {
            state.inComment = false; // Clear flag
          } else {
            stream.match(/^.[^\*]*/);
          }
        }
        return "comment";
      } else if (state.inCharacterClass) {
          while (state.inCharacterClass && !stream.eol()) {
            if (!(stream.match(/^[^\]\\]+/) || stream.match(/^\\./))) {
              state.inCharacterClass = false;
            }
          }
      } else if (stream.peek() === '[') {
        stream.next();
        state.inCharacterClass = true;
        return 'bracket';
      } else if (stream.match(/^\/\//)) {
        stream.skipToEnd();
        return "comment";
      } else if (state.braced || stream.peek() === '{') {
        if (state.localState === null) {
          state.localState = CodeMirror.startState(jsMode);
        }
        var token = jsMode.token(stream, state.localState);
        var text = stream.current();
        if (!token) {
          for (var i = 0; i < text.length; i++) {
            if (text[i] === '{') {
              state.braced++;
            } else if (text[i] === '}') {
              state.braced--;
            }
          };
        }
        return token;
      } else if (identifier(stream)) {
        if (stream.peek() === ':') {
          return 'variable';
        }
        return 'variable-2';
      } else if (['[', ']', '(', ')'].indexOf(stream.peek()) != -1) {
        stream.next();
        return 'bracket';
      } else if (!stream.eatSpace()) {
        stream.next();
      }
      return null;
    }
  };
}, "javascript");

});
codemirror/mode/asciiarmor/asciiarmor.js000064400000004512151215013500014450 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  function errorIfNotEmpty(stream) {
    var nonWS = stream.match(/^\s*\S/);
    stream.skipToEnd();
    return nonWS ? "error" : null;
  }

  CodeMirror.defineMode("asciiarmor", function() {
    return {
      token: function(stream, state) {
        var m;
        if (state.state == "top") {
          if (stream.sol() && (m = stream.match(/^-----BEGIN (.*)?-----\s*$/))) {
            state.state = "headers";
            state.type = m[1];
            return "tag";
          }
          return errorIfNotEmpty(stream);
        } else if (state.state == "headers") {
          if (stream.sol() && stream.match(/^\w+:/)) {
            state.state = "header";
            return "atom";
          } else {
            var result = errorIfNotEmpty(stream);
            if (result) state.state = "body";
            return result;
          }
        } else if (state.state == "header") {
          stream.skipToEnd();
          state.state = "headers";
          return "string";
        } else if (state.state == "body") {
          if (stream.sol() && (m = stream.match(/^-----END (.*)?-----\s*$/))) {
            if (m[1] != state.type) return "error";
            state.state = "end";
            return "tag";
          } else {
            if (stream.eatWhile(/[A-Za-z0-9+\/=]/)) {
              return null;
            } else {
              stream.next();
              return "error";
            }
          }
        } else if (state.state == "end") {
          return errorIfNotEmpty(stream);
        }
      },
      blankLine: function(state) {
        if (state.state == "headers") state.state = "body";
      },
      startState: function() {
        return {state: "top", type: null};
      }
    };
  });

  CodeMirror.defineMIME("application/pgp", "asciiarmor");
  CodeMirror.defineMIME("application/pgp-keys", "asciiarmor");
  CodeMirror.defineMIME("application/pgp-signature", "asciiarmor");
});
codemirror/mode/asciiarmor/index.html000064400000002411151215013500013752 0ustar00<!doctype html>

<title>CodeMirror: ASCII Armor (PGP) mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="asciiarmor.js"></script>
<style>.CodeMirror {background: #f8f8f8;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">ASCII Armor</a>
  </ul>
</div>

<article>
<h2>ASCII Armor (PGP) mode</h2>
<form><textarea id="code" name="code">
-----BEGIN PGP MESSAGE-----
Version: OpenPrivacy 0.99

yDgBO22WxBHv7O8X7O/jygAEzol56iUKiXmV+XmpCtmpqQUKiQrFqclFqUDBovzS
vBSFjNSiVHsuAA==
=njUN
-----END PGP MESSAGE-----
</textarea></form>

<script>
var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
  lineNumbers: true
});
</script>

<p><strong>MIME types
defined:</strong> <code>application/pgp</code>, <code>application/pgp-keys</code>, <code>application/pgp-signature</code></p>

</article>
codemirror/mode/sass/index.html000064400000003043151215013500012574 0ustar00<!doctype html>

<title>CodeMirror: Sass mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="sass.js"></script>
<style>.CodeMirror {border: 1px solid #ddd; font-size:12px; height: 400px}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Sass</a>
  </ul>
</div>

<article>
<h2>Sass mode</h2>
<form><textarea id="code" name="code">// Variable Definitions

$page-width:    800px
$sidebar-width: 200px
$primary-color: #eeeeee

// Global Attributes

body
  font:
    family: sans-serif
    size: 30em
    weight: bold

// Scoped Styles

#contents
  width: $page-width
  #sidebar
    float: right
    width: $sidebar-width
  #main
    width: $page-width - $sidebar-width
    background: $primary-color
    h2
      color: blue

#footer
  height: 200px
</textarea></form>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        lineNumbers : true,
        matchBrackets : true
      });
    </script>

    <p><strong>MIME types defined:</strong> <code>text/x-sass</code>.</p>
  </article>
codemirror/mode/sass/sass.js000064400000023513151215013500012112 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("sass", function(config) {
  function tokenRegexp(words) {
    return new RegExp("^" + words.join("|"));
  }

  var keywords = ["true", "false", "null", "auto"];
  var keywordsRegexp = new RegExp("^" + keywords.join("|"));

  var operators = ["\\(", "\\)", "=", ">", "<", "==", ">=", "<=", "\\+", "-",
                   "\\!=", "/", "\\*", "%", "and", "or", "not", ";","\\{","\\}",":"];
  var opRegexp = tokenRegexp(operators);

  var pseudoElementsRegexp = /^::?[a-zA-Z_][\w\-]*/;

  function urlTokens(stream, state) {
    var ch = stream.peek();

    if (ch === ")") {
      stream.next();
      state.tokenizer = tokenBase;
      return "operator";
    } else if (ch === "(") {
      stream.next();
      stream.eatSpace();

      return "operator";
    } else if (ch === "'" || ch === '"') {
      state.tokenizer = buildStringTokenizer(stream.next());
      return "string";
    } else {
      state.tokenizer = buildStringTokenizer(")", false);
      return "string";
    }
  }
  function comment(indentation, multiLine) {
    return function(stream, state) {
      if (stream.sol() && stream.indentation() <= indentation) {
        state.tokenizer = tokenBase;
        return tokenBase(stream, state);
      }

      if (multiLine && stream.skipTo("*/")) {
        stream.next();
        stream.next();
        state.tokenizer = tokenBase;
      } else {
        stream.skipToEnd();
      }

      return "comment";
    };
  }

  function buildStringTokenizer(quote, greedy) {
    if (greedy == null) { greedy = true; }

    function stringTokenizer(stream, state) {
      var nextChar = stream.next();
      var peekChar = stream.peek();
      var previousChar = stream.string.charAt(stream.pos-2);

      var endingString = ((nextChar !== "\\" && peekChar === quote) || (nextChar === quote && previousChar !== "\\"));

      if (endingString) {
        if (nextChar !== quote && greedy) { stream.next(); }
        state.tokenizer = tokenBase;
        return "string";
      } else if (nextChar === "#" && peekChar === "{") {
        state.tokenizer = buildInterpolationTokenizer(stringTokenizer);
        stream.next();
        return "operator";
      } else {
        return "string";
      }
    }

    return stringTokenizer;
  }

  function buildInterpolationTokenizer(currentTokenizer) {
    return function(stream, state) {
      if (stream.peek() === "}") {
        stream.next();
        state.tokenizer = currentTokenizer;
        return "operator";
      } else {
        return tokenBase(stream, state);
      }
    };
  }

  function indent(state) {
    if (state.indentCount == 0) {
      state.indentCount++;
      var lastScopeOffset = state.scopes[0].offset;
      var currentOffset = lastScopeOffset + config.indentUnit;
      state.scopes.unshift({ offset:currentOffset });
    }
  }

  function dedent(state) {
    if (state.scopes.length == 1) return;

    state.scopes.shift();
  }

  function tokenBase(stream, state) {
    var ch = stream.peek();

    // Comment
    if (stream.match("/*")) {
      state.tokenizer = comment(stream.indentation(), true);
      return state.tokenizer(stream, state);
    }
    if (stream.match("//")) {
      state.tokenizer = comment(stream.indentation(), false);
      return state.tokenizer(stream, state);
    }

    // Interpolation
    if (stream.match("#{")) {
      state.tokenizer = buildInterpolationTokenizer(tokenBase);
      return "operator";
    }

    // Strings
    if (ch === '"' || ch === "'") {
      stream.next();
      state.tokenizer = buildStringTokenizer(ch);
      return "string";
    }

    if(!state.cursorHalf){// state.cursorHalf === 0
    // first half i.e. before : for key-value pairs
    // including selectors

      if (ch === ".") {
        stream.next();
        if (stream.match(/^[\w-]+/)) {
          indent(state);
          return "atom";
        } else if (stream.peek() === "#") {
          indent(state);
          return "atom";
        }
      }

      if (ch === "#") {
        stream.next();
        // ID selectors
        if (stream.match(/^[\w-]+/)) {
          indent(state);
          return "atom";
        }
        if (stream.peek() === "#") {
          indent(state);
          return "atom";
        }
      }

      // Variables
      if (ch === "$") {
        stream.next();
        stream.eatWhile(/[\w-]/);
        return "variable-2";
      }

      // Numbers
      if (stream.match(/^-?[0-9\.]+/))
        return "number";

      // Units
      if (stream.match(/^(px|em|in)\b/))
        return "unit";

      if (stream.match(keywordsRegexp))
        return "keyword";

      if (stream.match(/^url/) && stream.peek() === "(") {
        state.tokenizer = urlTokens;
        return "atom";
      }

      if (ch === "=") {
        // Match shortcut mixin definition
        if (stream.match(/^=[\w-]+/)) {
          indent(state);
          return "meta";
        }
      }

      if (ch === "+") {
        // Match shortcut mixin definition
        if (stream.match(/^\+[\w-]+/)){
          return "variable-3";
        }
      }

      if(ch === "@"){
        if(stream.match(/@extend/)){
          if(!stream.match(/\s*[\w]/))
            dedent(state);
        }
      }


      // Indent Directives
      if (stream.match(/^@(else if|if|media|else|for|each|while|mixin|function)/)) {
        indent(state);
        return "meta";
      }

      // Other Directives
      if (ch === "@") {
        stream.next();
        stream.eatWhile(/[\w-]/);
        return "meta";
      }

      if (stream.eatWhile(/[\w-]/)){
        if(stream.match(/ *: *[\w-\+\$#!\("']/,false)){
          return "property";
        }
        else if(stream.match(/ *:/,false)){
          indent(state);
          state.cursorHalf = 1;
          return "atom";
        }
        else if(stream.match(/ *,/,false)){
          return "atom";
        }
        else{
          indent(state);
          return "atom";
        }
      }

      if(ch === ":"){
        if (stream.match(pseudoElementsRegexp)){ // could be a pseudo-element
          return "keyword";
        }
        stream.next();
        state.cursorHalf=1;
        return "operator";
      }

    } // cursorHalf===0 ends here
    else{

      if (ch === "#") {
        stream.next();
        // Hex numbers
        if (stream.match(/[0-9a-fA-F]{6}|[0-9a-fA-F]{3}/)){
          if(!stream.peek()){
            state.cursorHalf = 0;
          }
          return "number";
        }
      }

      // Numbers
      if (stream.match(/^-?[0-9\.]+/)){
        if(!stream.peek()){
          state.cursorHalf = 0;
        }
        return "number";
      }

      // Units
      if (stream.match(/^(px|em|in)\b/)){
        if(!stream.peek()){
          state.cursorHalf = 0;
        }
        return "unit";
      }

      if (stream.match(keywordsRegexp)){
        if(!stream.peek()){
          state.cursorHalf = 0;
        }
        return "keyword";
      }

      if (stream.match(/^url/) && stream.peek() === "(") {
        state.tokenizer = urlTokens;
        if(!stream.peek()){
          state.cursorHalf = 0;
        }
        return "atom";
      }

      // Variables
      if (ch === "$") {
        stream.next();
        stream.eatWhile(/[\w-]/);
        if(!stream.peek()){
          state.cursorHalf = 0;
        }
        return "variable-3";
      }

      // bang character for !important, !default, etc.
      if (ch === "!") {
        stream.next();
        if(!stream.peek()){
          state.cursorHalf = 0;
        }
        return stream.match(/^[\w]+/) ? "keyword": "operator";
      }

      if (stream.match(opRegexp)){
        if(!stream.peek()){
          state.cursorHalf = 0;
        }
        return "operator";
      }

      // attributes
      if (stream.eatWhile(/[\w-]/)) {
        if(!stream.peek()){
          state.cursorHalf = 0;
        }
        return "attribute";
      }

      //stream.eatSpace();
      if(!stream.peek()){
        state.cursorHalf = 0;
        return null;
      }

    } // else ends here

    if (stream.match(opRegexp))
      return "operator";

    // If we haven't returned by now, we move 1 character
    // and return an error
    stream.next();
    return null;
  }

  function tokenLexer(stream, state) {
    if (stream.sol()) state.indentCount = 0;
    var style = state.tokenizer(stream, state);
    var current = stream.current();

    if (current === "@return" || current === "}"){
      dedent(state);
    }

    if (style !== null) {
      var startOfToken = stream.pos - current.length;

      var withCurrentIndent = startOfToken + (config.indentUnit * state.indentCount);

      var newScopes = [];

      for (var i = 0; i < state.scopes.length; i++) {
        var scope = state.scopes[i];

        if (scope.offset <= withCurrentIndent)
          newScopes.push(scope);
      }

      state.scopes = newScopes;
    }


    return style;
  }

  return {
    startState: function() {
      return {
        tokenizer: tokenBase,
        scopes: [{offset: 0, type: "sass"}],
        indentCount: 0,
        cursorHalf: 0,  // cursor half tells us if cursor lies after (1)
                        // or before (0) colon (well... more or less)
        definedVars: [],
        definedMixins: []
      };
    },
    token: function(stream, state) {
      var style = tokenLexer(stream, state);

      state.lastToken = { style: style, content: stream.current() };

      return style;
    },

    indent: function(state) {
      return state.scopes[0].offset;
    }
  };
});

CodeMirror.defineMIME("text/x-sass", "sass");

});
codemirror/mode/apl/index.html000064400000004203151215013500012376 0ustar00<!doctype html>

<title>CodeMirror: APL mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="./apl.js"></script>
<style>
	.CodeMirror { border: 2px inset #dee; }
    </style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">APL</a>
  </ul>
</div>

<article>
<h2>APL mode</h2>
<form><textarea id="code" name="code">
⍝ Conway's game of life

⍝ This example was inspired by the impressive demo at
⍝ http://www.youtube.com/watch?v=a9xAKttWgP4

⍝ Create a matrix:
⍝     0 1 1
⍝     1 1 0
⍝     0 1 0
creature ← (3 3 ⍴ ⍳ 9) ∈ 1 2 3 4 7   ⍝ Original creature from demo
creature ← (3 3 ⍴ ⍳ 9) ∈ 1 3 6 7 8   ⍝ Glider

⍝ Place the creature on a larger board, near the centre
board ← ¯1 ⊖ ¯2 ⌽ 5 7 ↑ creature

⍝ A function to move from one generation to the next
life ← {∨/ 1 ⍵ ∧ 3 4 = ⊂+/ +⌿ 1 0 ¯1 ∘.⊖ 1 0 ¯1 ⌽¨ ⊂⍵}

⍝ Compute n-th generation and format it as a
⍝ character matrix
gen ← {' #'[(life ⍣ ⍵) board]}

⍝ Show first three generations
(gen 1) (gen 2) (gen 3)
</textarea></form>

    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        lineNumbers: true,
        matchBrackets: true,
        mode: "text/apl"
      });
    </script>

    <p>Simple mode that tries to handle APL as well as it can.</p>
    <p>It attempts to label functions/operators based upon
    monadic/dyadic usage (but this is far from fully fleshed out).
    This means there are meaningful classnames so hover states can
    have popups etc.</p>

    <p><strong>MIME types defined:</strong> <code>text/apl</code> (APL code)</p>
  </article>
codemirror/mode/apl/apl.js000064400000011200151215013500011506 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("apl", function() {
  var builtInOps = {
    ".": "innerProduct",
    "\\": "scan",
    "/": "reduce",
    "⌿": "reduce1Axis",
    "⍀": "scan1Axis",
    "¨": "each",
    "⍣": "power"
  };
  var builtInFuncs = {
    "+": ["conjugate", "add"],
    "−": ["negate", "subtract"],
    "×": ["signOf", "multiply"],
    "÷": ["reciprocal", "divide"],
    "⌈": ["ceiling", "greaterOf"],
    "⌊": ["floor", "lesserOf"],
    "∣": ["absolute", "residue"],
    "⍳": ["indexGenerate", "indexOf"],
    "?": ["roll", "deal"],
    "⋆": ["exponentiate", "toThePowerOf"],
    "⍟": ["naturalLog", "logToTheBase"],
    "○": ["piTimes", "circularFuncs"],
    "!": ["factorial", "binomial"],
    "⌹": ["matrixInverse", "matrixDivide"],
    "<": [null, "lessThan"],
    "≤": [null, "lessThanOrEqual"],
    "=": [null, "equals"],
    ">": [null, "greaterThan"],
    "≥": [null, "greaterThanOrEqual"],
    "≠": [null, "notEqual"],
    "≡": ["depth", "match"],
    "≢": [null, "notMatch"],
    "∈": ["enlist", "membership"],
    "⍷": [null, "find"],
    "∪": ["unique", "union"],
    "∩": [null, "intersection"],
    "∼": ["not", "without"],
    "∨": [null, "or"],
    "∧": [null, "and"],
    "⍱": [null, "nor"],
    "⍲": [null, "nand"],
    "⍴": ["shapeOf", "reshape"],
    ",": ["ravel", "catenate"],
    "⍪": [null, "firstAxisCatenate"],
    "⌽": ["reverse", "rotate"],
    "⊖": ["axis1Reverse", "axis1Rotate"],
    "⍉": ["transpose", null],
    "↑": ["first", "take"],
    "↓": [null, "drop"],
    "⊂": ["enclose", "partitionWithAxis"],
    "⊃": ["diclose", "pick"],
    "⌷": [null, "index"],
    "⍋": ["gradeUp", null],
    "⍒": ["gradeDown", null],
    "⊤": ["encode", null],
    "⊥": ["decode", null],
    "⍕": ["format", "formatByExample"],
    "⍎": ["execute", null],
    "⊣": ["stop", "left"],
    "⊢": ["pass", "right"]
  };

  var isOperator = /[\.\/⌿⍀¨⍣]/;
  var isNiladic = /⍬/;
  var isFunction = /[\+−×÷⌈⌊∣⍳\?⋆⍟○!⌹<≤=>≥≠≡≢∈⍷∪∩∼∨∧⍱⍲⍴,⍪⌽⊖⍉↑↓⊂⊃⌷⍋⍒⊤⊥⍕⍎⊣⊢]/;
  var isArrow = /←/;
  var isComment = /[⍝#].*$/;

  var stringEater = function(type) {
    var prev;
    prev = false;
    return function(c) {
      prev = c;
      if (c === type) {
        return prev === "\\";
      }
      return true;
    };
  };
  return {
    startState: function() {
      return {
        prev: false,
        func: false,
        op: false,
        string: false,
        escape: false
      };
    },
    token: function(stream, state) {
      var ch, funcName;
      if (stream.eatSpace()) {
        return null;
      }
      ch = stream.next();
      if (ch === '"' || ch === "'") {
        stream.eatWhile(stringEater(ch));
        stream.next();
        state.prev = true;
        return "string";
      }
      if (/[\[{\(]/.test(ch)) {
        state.prev = false;
        return null;
      }
      if (/[\]}\)]/.test(ch)) {
        state.prev = true;
        return null;
      }
      if (isNiladic.test(ch)) {
        state.prev = false;
        return "niladic";
      }
      if (/[¯\d]/.test(ch)) {
        if (state.func) {
          state.func = false;
          state.prev = false;
        } else {
          state.prev = true;
        }
        stream.eatWhile(/[\w\.]/);
        return "number";
      }
      if (isOperator.test(ch)) {
        return "operator apl-" + builtInOps[ch];
      }
      if (isArrow.test(ch)) {
        return "apl-arrow";
      }
      if (isFunction.test(ch)) {
        funcName = "apl-";
        if (builtInFuncs[ch] != null) {
          if (state.prev) {
            funcName += builtInFuncs[ch][1];
          } else {
            funcName += builtInFuncs[ch][0];
          }
        }
        state.func = true;
        state.prev = false;
        return "function " + funcName;
      }
      if (isComment.test(ch)) {
        stream.skipToEnd();
        return "comment";
      }
      if (ch === "∘" && stream.peek() === ".") {
        stream.next();
        return "function jot-dot";
      }
      stream.eatWhile(/[\w\$_]/);
      state.prev = true;
      return "keyword";
    }
  };
});

CodeMirror.defineMIME("text/apl", "apl");

});
codemirror/mode/eiffel/eiffel.js000064400000007240151215013500012653 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("eiffel", function() {
  function wordObj(words) {
    var o = {};
    for (var i = 0, e = words.length; i < e; ++i) o[words[i]] = true;
    return o;
  }
  var keywords = wordObj([
    'note',
    'across',
    'when',
    'variant',
    'until',
    'unique',
    'undefine',
    'then',
    'strip',
    'select',
    'retry',
    'rescue',
    'require',
    'rename',
    'reference',
    'redefine',
    'prefix',
    'once',
    'old',
    'obsolete',
    'loop',
    'local',
    'like',
    'is',
    'inspect',
    'infix',
    'include',
    'if',
    'frozen',
    'from',
    'external',
    'export',
    'ensure',
    'end',
    'elseif',
    'else',
    'do',
    'creation',
    'create',
    'check',
    'alias',
    'agent',
    'separate',
    'invariant',
    'inherit',
    'indexing',
    'feature',
    'expanded',
    'deferred',
    'class',
    'Void',
    'True',
    'Result',
    'Precursor',
    'False',
    'Current',
    'create',
    'attached',
    'detachable',
    'as',
    'and',
    'implies',
    'not',
    'or'
  ]);
  var operators = wordObj([":=", "and then","and", "or","<<",">>"]);

  function chain(newtok, stream, state) {
    state.tokenize.push(newtok);
    return newtok(stream, state);
  }

  function tokenBase(stream, state) {
    if (stream.eatSpace()) return null;
    var ch = stream.next();
    if (ch == '"'||ch == "'") {
      return chain(readQuoted(ch, "string"), stream, state);
    } else if (ch == "-"&&stream.eat("-")) {
      stream.skipToEnd();
      return "comment";
    } else if (ch == ":"&&stream.eat("=")) {
      return "operator";
    } else if (/[0-9]/.test(ch)) {
      stream.eatWhile(/[xXbBCc0-9\.]/);
      stream.eat(/[\?\!]/);
      return "ident";
    } else if (/[a-zA-Z_0-9]/.test(ch)) {
      stream.eatWhile(/[a-zA-Z_0-9]/);
      stream.eat(/[\?\!]/);
      return "ident";
    } else if (/[=+\-\/*^%<>~]/.test(ch)) {
      stream.eatWhile(/[=+\-\/*^%<>~]/);
      return "operator";
    } else {
      return null;
    }
  }

  function readQuoted(quote, style,  unescaped) {
    return function(stream, state) {
      var escaped = false, ch;
      while ((ch = stream.next()) != null) {
        if (ch == quote && (unescaped || !escaped)) {
          state.tokenize.pop();
          break;
        }
        escaped = !escaped && ch == "%";
      }
      return style;
    };
  }

  return {
    startState: function() {
      return {tokenize: [tokenBase]};
    },

    token: function(stream, state) {
      var style = state.tokenize[state.tokenize.length-1](stream, state);
      if (style == "ident") {
        var word = stream.current();
        style = keywords.propertyIsEnumerable(stream.current()) ? "keyword"
          : operators.propertyIsEnumerable(stream.current()) ? "operator"
          : /^[A-Z][A-Z_0-9]*$/g.test(word) ? "tag"
          : /^0[bB][0-1]+$/g.test(word) ? "number"
          : /^0[cC][0-7]+$/g.test(word) ? "number"
          : /^0[xX][a-fA-F0-9]+$/g.test(word) ? "number"
          : /^([0-9]+\.[0-9]*)|([0-9]*\.[0-9]+)$/g.test(word) ? "number"
          : /^[0-9]+$/g.test(word) ? "number"
          : "variable";
      }
      return style;
    },
    lineComment: "--"
  };
});

CodeMirror.defineMIME("text/x-eiffel", "eiffel");

});
codemirror/mode/eiffel/index.html000064400000031616151215013500013064 0ustar00<!doctype html>

<title>CodeMirror: Eiffel mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<link rel="stylesheet" href="../../theme/neat.css">
<script src="../../lib/codemirror.js"></script>
<script src="eiffel.js"></script>
<style>
      .CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}
      .cm-s-default span.cm-arrow { color: red; }
    </style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Eiffel</a>
  </ul>
</div>

<article>
<h2>Eiffel mode</h2>
<form><textarea id="code" name="code">
note
    description: "[
        Project-wide universal properties.
        This class is an ancestor to all developer-written classes.
        ANY may be customized for individual projects or teams.
        ]"

    library: "Free implementation of ELKS library"
    status: "See notice at end of class."
    legal: "See notice at end of class."
    date: "$Date: 2013-01-25 11:49:00 -0800 (Fri, 25 Jan 2013) $"
    revision: "$Revision: 712 $"

class
    ANY

feature -- Customization

feature -- Access

    generator: STRING
            -- Name of current object's generating class
            -- (base class of the type of which it is a direct instance)
        external
            "built_in"
        ensure
            generator_not_void: Result /= Void
            generator_not_empty: not Result.is_empty
        end

    generating_type: TYPE [detachable like Current]
            -- Type of current object
            -- (type of which it is a direct instance)
        do
            Result := {detachable like Current}
        ensure
            generating_type_not_void: Result /= Void
        end

feature -- Status report

    conforms_to (other: ANY): BOOLEAN
            -- Does type of current object conform to type
            -- of `other' (as per Eiffel: The Language, chapter 13)?
        require
            other_not_void: other /= Void
        external
            "built_in"
        end

    same_type (other: ANY): BOOLEAN
            -- Is type of current object identical to type of `other'?
        require
            other_not_void: other /= Void
        external
            "built_in"
        ensure
            definition: Result = (conforms_to (other) and
                                        other.conforms_to (Current))
        end

feature -- Comparison

    is_equal (other: like Current): BOOLEAN
            -- Is `other' attached to an object considered
            -- equal to current object?
        require
            other_not_void: other /= Void
        external
            "built_in"
        ensure
            symmetric: Result implies other ~ Current
            consistent: standard_is_equal (other) implies Result
        end

    frozen standard_is_equal (other: like Current): BOOLEAN
            -- Is `other' attached to an object of the same type
            -- as current object, and field-by-field identical to it?
        require
            other_not_void: other /= Void
        external
            "built_in"
        ensure
            same_type: Result implies same_type (other)
            symmetric: Result implies other.standard_is_equal (Current)
        end

    frozen equal (a: detachable ANY; b: like a): BOOLEAN
            -- Are `a' and `b' either both void or attached
            -- to objects considered equal?
        do
            if a = Void then
                Result := b = Void
            else
                Result := b /= Void and then
                            a.is_equal (b)
            end
        ensure
            definition: Result = (a = Void and b = Void) or else
                        ((a /= Void and b /= Void) and then
                        a.is_equal (b))
        end

    frozen standard_equal (a: detachable ANY; b: like a): BOOLEAN
            -- Are `a' and `b' either both void or attached to
            -- field-by-field identical objects of the same type?
            -- Always uses default object comparison criterion.
        do
            if a = Void then
                Result := b = Void
            else
                Result := b /= Void and then
                            a.standard_is_equal (b)
            end
        ensure
            definition: Result = (a = Void and b = Void) or else
                        ((a /= Void and b /= Void) and then
                        a.standard_is_equal (b))
        end

    frozen is_deep_equal (other: like Current): BOOLEAN
            -- Are `Current' and `other' attached to isomorphic object structures?
        require
            other_not_void: other /= Void
        external
            "built_in"
        ensure
            shallow_implies_deep: standard_is_equal (other) implies Result
            same_type: Result implies same_type (other)
            symmetric: Result implies other.is_deep_equal (Current)
        end

    frozen deep_equal (a: detachable ANY; b: like a): BOOLEAN
            -- Are `a' and `b' either both void
            -- or attached to isomorphic object structures?
        do
            if a = Void then
                Result := b = Void
            else
                Result := b /= Void and then a.is_deep_equal (b)
            end
        ensure
            shallow_implies_deep: standard_equal (a, b) implies Result
            both_or_none_void: (a = Void) implies (Result = (b = Void))
            same_type: (Result and (a /= Void)) implies (b /= Void and then a.same_type (b))
            symmetric: Result implies deep_equal (b, a)
        end

feature -- Duplication

    frozen twin: like Current
            -- New object equal to `Current'
            -- `twin' calls `copy'; to change copying/twinning semantics, redefine `copy'.
        external
            "built_in"
        ensure
            twin_not_void: Result /= Void
            is_equal: Result ~ Current
        end

    copy (other: like Current)
            -- Update current object using fields of object attached
            -- to `other', so as to yield equal objects.
        require
            other_not_void: other /= Void
            type_identity: same_type (other)
        external
            "built_in"
        ensure
            is_equal: Current ~ other
        end

    frozen standard_copy (other: like Current)
            -- Copy every field of `other' onto corresponding field
            -- of current object.
        require
            other_not_void: other /= Void
            type_identity: same_type (other)
        external
            "built_in"
        ensure
            is_standard_equal: standard_is_equal (other)
        end

    frozen clone (other: detachable ANY): like other
            -- Void if `other' is void; otherwise new object
            -- equal to `other'
            --
            -- For non-void `other', `clone' calls `copy';
            -- to change copying/cloning semantics, redefine `copy'.
        obsolete
            "Use `twin' instead."
        do
            if other /= Void then
                Result := other.twin
            end
        ensure
            equal: Result ~ other
        end

    frozen standard_clone (other: detachable ANY): like other
            -- Void if `other' is void; otherwise new object
            -- field-by-field identical to `other'.
            -- Always uses default copying semantics.
        obsolete
            "Use `standard_twin' instead."
        do
            if other /= Void then
                Result := other.standard_twin
            end
        ensure
            equal: standard_equal (Result, other)
        end

    frozen standard_twin: like Current
            -- New object field-by-field identical to `other'.
            -- Always uses default copying semantics.
        external
            "built_in"
        ensure
            standard_twin_not_void: Result /= Void
            equal: standard_equal (Result, Current)
        end

    frozen deep_twin: like Current
            -- New object structure recursively duplicated from Current.
        external
            "built_in"
        ensure
            deep_twin_not_void: Result /= Void
            deep_equal: deep_equal (Current, Result)
        end

    frozen deep_clone (other: detachable ANY): like other
            -- Void if `other' is void: otherwise, new object structure
            -- recursively duplicated from the one attached to `other'
        obsolete
            "Use `deep_twin' instead."
        do
            if other /= Void then
                Result := other.deep_twin
            end
        ensure
            deep_equal: deep_equal (other, Result)
        end

    frozen deep_copy (other: like Current)
            -- Effect equivalent to that of:
            --      `copy' (`other' . `deep_twin')
        require
            other_not_void: other /= Void
        do
            copy (other.deep_twin)
        ensure
            deep_equal: deep_equal (Current, other)
        end

feature {NONE} -- Retrieval

    frozen internal_correct_mismatch
            -- Called from runtime to perform a proper dynamic dispatch on `correct_mismatch'
            -- from MISMATCH_CORRECTOR.
        local
            l_msg: STRING
            l_exc: EXCEPTIONS
        do
            if attached {MISMATCH_CORRECTOR} Current as l_corrector then
                l_corrector.correct_mismatch
            else
                create l_msg.make_from_string ("Mismatch: ")
                create l_exc
                l_msg.append (generating_type.name)
                l_exc.raise_retrieval_exception (l_msg)
            end
        end

feature -- Output

    io: STD_FILES
            -- Handle to standard file setup
        once
            create Result
            Result.set_output_default
        ensure
            io_not_void: Result /= Void
        end

    out: STRING
            -- New string containing terse printable representation
            -- of current object
        do
            Result := tagged_out
        ensure
            out_not_void: Result /= Void
        end

    frozen tagged_out: STRING
            -- New string containing terse printable representation
            -- of current object
        external
            "built_in"
        ensure
            tagged_out_not_void: Result /= Void
        end

    print (o: detachable ANY)
            -- Write terse external representation of `o'
            -- on standard output.
        do
            if o /= Void then
                io.put_string (o.out)
            end
        end

feature -- Platform

    Operating_environment: OPERATING_ENVIRONMENT
            -- Objects available from the operating system
        once
            create Result
        ensure
            operating_environment_not_void: Result /= Void
        end

feature {NONE} -- Initialization

    default_create
            -- Process instances of classes with no creation clause.
            -- (Default: do nothing.)
        do
        end

feature -- Basic operations

    default_rescue
            -- Process exception for routines with no Rescue clause.
            -- (Default: do nothing.)
        do
        end

    frozen do_nothing
            -- Execute a null action.
        do
        end

    frozen default: detachable like Current
            -- Default value of object's type
        do
        end

    frozen default_pointer: POINTER
            -- Default value of type `POINTER'
            -- (Avoid the need to write `p'.`default' for
            -- some `p' of type `POINTER'.)
        do
        ensure
            -- Result = Result.default
        end

    frozen as_attached: attached like Current
            -- Attached version of Current
            -- (Can be used during transitional period to convert
            -- non-void-safe classes to void-safe ones.)
        do
            Result := Current
        end

invariant
    reflexive_equality: standard_is_equal (Current)
    reflexive_conformance: conforms_to (Current)

note
    copyright: "Copyright (c) 1984-2012, Eiffel Software and others"
    license:   "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
    source: "[
            Eiffel Software
            5949 Hollister Ave., Goleta, CA 93117 USA
            Telephone 805-685-1006, Fax 805-685-6869
            Website http://www.eiffel.com
            Customer support http://support.eiffel.com
        ]"

end

</textarea></form>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        mode: "text/x-eiffel",
        indentUnit: 4,
        lineNumbers: true,
        theme: "neat"
      });
    </script>

    <p><strong>MIME types defined:</strong> <code>text/x-eiffel</code>.</p>
 
 <p> Created by <a href="https://github.com/ynh">YNH</a>.</p>
  </article>
codemirror/mode/haml/index.html000064400000004027151215013500012547 0ustar00<!doctype html>

<title>CodeMirror: HAML mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../xml/xml.js"></script>
<script src="../htmlmixed/htmlmixed.js"></script>
<script src="../javascript/javascript.js"></script>
<script src="../ruby/ruby.js"></script>
<script src="haml.js"></script>
<style>.CodeMirror {background: #f8f8f8;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">HAML</a>
  </ul>
</div>

<article>
<h2>HAML mode</h2>
<form><textarea id="code" name="code">
!!!
#content
.left.column(title="title"){:href => "/hello", :test => "#{hello}_#{world}"}
    <!-- This is a comment -->
    %h2 Welcome to our site!
    %p= puts "HAML MODE"
  .right.column
    = render :partial => "sidebar"

.container
  .row
    .span8
      %h1.title= @page_title
%p.title= @page_title
%p
  /
    The same as HTML comment
    Hello multiline comment

  -# haml comment
      This wont be displayed
      nor will this
  Date/Time:
  - now = DateTime.now
  %strong= now
  - if now > DateTime.parse("December 31, 2006")
    = "Happy new " + "year!"

%title
  = @title
  \= @title
  <h1>Title</h1>
  <h1 title="HELLO">
    Title
  </h1>
    </textarea></form>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        lineNumbers: true,
        mode: "text/x-haml"
      });
    </script>

    <p><strong>MIME types defined:</strong> <code>text/x-haml</code>.</p>

    <p><strong>Parsing/Highlighting Tests:</strong> <a href="../../test/index.html#haml_*">normal</a>,  <a href="../../test/index.html#verbose,haml_*">verbose</a>.</p>

  </article>
codemirror/mode/haml/test.js000064400000005702151215013500012070 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function() {
  var mode = CodeMirror.getMode({tabSize: 4, indentUnit: 2}, "haml");
  function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); }

  // Requires at least one media query
  MT("elementName",
     "[tag %h1] Hey There");

  MT("oneElementPerLine",
     "[tag %h1] Hey There %h2");

  MT("idSelector",
     "[tag %h1][attribute #test] Hey There");

  MT("classSelector",
     "[tag %h1][attribute .hello] Hey There");

  MT("docType",
     "[tag !!! XML]");

  MT("comment",
     "[comment / Hello WORLD]");

  MT("notComment",
     "[tag %h1] This is not a / comment ");

  MT("attributes",
     "[tag %a]([variable title][operator =][string \"test\"]){[atom :title] [operator =>] [string \"test\"]}");

  MT("htmlCode",
     "[tag&bracket <][tag h1][tag&bracket >]Title[tag&bracket </][tag h1][tag&bracket >]");

  MT("rubyBlock",
     "[operator =][variable-2 @item]");

  MT("selectorRubyBlock",
     "[tag %a.selector=] [variable-2 @item]");

  MT("nestedRubyBlock",
      "[tag %a]",
      "   [operator =][variable puts] [string \"test\"]");

  MT("multilinePlaintext",
      "[tag %p]",
      "  Hello,",
      "  World");

  MT("multilineRuby",
      "[tag %p]",
      "  [comment -# this is a comment]",
      "     [comment and this is a comment too]",
      "  Date/Time",
      "  [operator -] [variable now] [operator =] [tag DateTime][operator .][property now]",
      "  [tag %strong=] [variable now]",
      "  [operator -] [keyword if] [variable now] [operator >] [tag DateTime][operator .][property parse]([string \"December 31, 2006\"])",
      "     [operator =][string \"Happy\"]",
      "     [operator =][string \"Belated\"]",
      "     [operator =][string \"Birthday\"]");

  MT("multilineComment",
      "[comment /]",
      "  [comment Multiline]",
      "  [comment Comment]");

  MT("hamlComment",
     "[comment -# this is a comment]");

  MT("multilineHamlComment",
     "[comment -# this is a comment]",
     "   [comment and this is a comment too]");

  MT("multilineHTMLComment",
    "[comment <!--]",
    "  [comment what a comment]",
    "  [comment -->]");

  MT("hamlAfterRubyTag",
    "[attribute .block]",
    "  [tag %strong=] [variable now]",
    "  [attribute .test]",
    "     [operator =][variable now]",
    "  [attribute .right]");

  MT("stretchedRuby",
     "[operator =] [variable puts] [string \"Hello\"],",
     "   [string \"World\"]");

  MT("interpolationInHashAttribute",
     //"[tag %div]{[atom :id] [operator =>] [string \"#{][variable test][string }_#{][variable ting][string }\"]} test");
     "[tag %div]{[atom :id] [operator =>] [string \"#{][variable test][string }_#{][variable ting][string }\"]} test");

  MT("interpolationInHTMLAttribute",
     "[tag %div]([variable title][operator =][string \"#{][variable test][string }_#{][variable ting]()[string }\"]) Test");
})();
codemirror/mode/haml/haml.js000064400000012351151215013500012030 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"), require("../ruby/ruby"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror", "../htmlmixed/htmlmixed", "../ruby/ruby"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

  // full haml mode. This handled embedded ruby and html fragments too
  CodeMirror.defineMode("haml", function(config) {
    var htmlMode = CodeMirror.getMode(config, {name: "htmlmixed"});
    var rubyMode = CodeMirror.getMode(config, "ruby");

    function rubyInQuote(endQuote) {
      return function(stream, state) {
        var ch = stream.peek();
        if (ch == endQuote && state.rubyState.tokenize.length == 1) {
          // step out of ruby context as it seems to complete processing all the braces
          stream.next();
          state.tokenize = html;
          return "closeAttributeTag";
        } else {
          return ruby(stream, state);
        }
      };
    }

    function ruby(stream, state) {
      if (stream.match("-#")) {
        stream.skipToEnd();
        return "comment";
      }
      return rubyMode.token(stream, state.rubyState);
    }

    function html(stream, state) {
      var ch = stream.peek();

      // handle haml declarations. All declarations that cant be handled here
      // will be passed to html mode
      if (state.previousToken.style == "comment" ) {
        if (state.indented > state.previousToken.indented) {
          stream.skipToEnd();
          return "commentLine";
        }
      }

      if (state.startOfLine) {
        if (ch == "!" && stream.match("!!")) {
          stream.skipToEnd();
          return "tag";
        } else if (stream.match(/^%[\w:#\.]+=/)) {
          state.tokenize = ruby;
          return "hamlTag";
        } else if (stream.match(/^%[\w:]+/)) {
          return "hamlTag";
        } else if (ch == "/" ) {
          stream.skipToEnd();
          return "comment";
        }
      }

      if (state.startOfLine || state.previousToken.style == "hamlTag") {
        if ( ch == "#" || ch == ".") {
          stream.match(/[\w-#\.]*/);
          return "hamlAttribute";
        }
      }

      // donot handle --> as valid ruby, make it HTML close comment instead
      if (state.startOfLine && !stream.match("-->", false) && (ch == "=" || ch == "-" )) {
        state.tokenize = ruby;
        return state.tokenize(stream, state);
      }

      if (state.previousToken.style == "hamlTag" ||
          state.previousToken.style == "closeAttributeTag" ||
          state.previousToken.style == "hamlAttribute") {
        if (ch == "(") {
          state.tokenize = rubyInQuote(")");
          return state.tokenize(stream, state);
        } else if (ch == "{") {
          if (!stream.match(/^\{%.*/)) {
            state.tokenize = rubyInQuote("}");
            return state.tokenize(stream, state);
          }
        }
      }

      return htmlMode.token(stream, state.htmlState);
    }

    return {
      // default to html mode
      startState: function() {
        var htmlState = CodeMirror.startState(htmlMode);
        var rubyState = CodeMirror.startState(rubyMode);
        return {
          htmlState: htmlState,
          rubyState: rubyState,
          indented: 0,
          previousToken: { style: null, indented: 0},
          tokenize: html
        };
      },

      copyState: function(state) {
        return {
          htmlState : CodeMirror.copyState(htmlMode, state.htmlState),
          rubyState: CodeMirror.copyState(rubyMode, state.rubyState),
          indented: state.indented,
          previousToken: state.previousToken,
          tokenize: state.tokenize
        };
      },

      token: function(stream, state) {
        if (stream.sol()) {
          state.indented = stream.indentation();
          state.startOfLine = true;
        }
        if (stream.eatSpace()) return null;
        var style = state.tokenize(stream, state);
        state.startOfLine = false;
        // dont record comment line as we only want to measure comment line with
        // the opening comment block
        if (style && style != "commentLine") {
          state.previousToken = { style: style, indented: state.indented };
        }
        // if current state is ruby and the previous token is not `,` reset the
        // tokenize to html
        if (stream.eol() && state.tokenize == ruby) {
          stream.backUp(1);
          var ch = stream.peek();
          stream.next();
          if (ch && ch != ",") {
            state.tokenize = html;
          }
        }
        // reprocess some of the specific style tag when finish setting previousToken
        if (style == "hamlTag") {
          style = "tag";
        } else if (style == "commentLine") {
          style = "comment";
        } else if (style == "hamlAttribute") {
          style = "attribute";
        } else if (style == "closeAttributeTag") {
          style = null;
        }
        return style;
      }
    };
  }, "htmlmixed", "ruby");

  CodeMirror.defineMIME("text/x-haml", "haml");
});
codemirror/mode/dart/index.html000064400000003133151215013500012555 0ustar00<!doctype html>

<title>CodeMirror: Dart mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../clike/clike.js"></script>
<script src="dart.js"></script>
<style>.CodeMirror {border: 1px solid #dee;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Dart</a>
  </ul>
</div>

<article>
<h2>Dart mode</h2>
<form>
<textarea id="code" name="code">
import 'dart:math' show Random;

void main() {
  print(new Die(n: 12).roll());
}

// Define a class.
class Die {
  // Define a class variable.
  static Random shaker = new Random();

  // Define instance variables.
  int sides, value;

  // Define a method using shorthand syntax.
  String toString() => '$value';

  // Define a constructor.
  Die({int n: 6}) {
    if (4 <= n && n <= 20) {
      sides = n;
    } else {
      // Support for errors and exceptions.
      throw new ArgumentError(/* */);
    }
  }

  // Define an instance method.
  int roll() {
    return value = shaker.nextInt(sides) + 1;
  }
}
</textarea>
</form>

<script>
  var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
    lineNumbers: true,
    mode: "application/dart"
  });
</script>

</article>
codemirror/mode/dart/dart.js000064400000011772151215013500012060 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"), require("../clike/clike"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror", "../clike/clike"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  var keywords = ("this super static final const abstract class extends external factory " +
    "implements get native operator set typedef with enum throw rethrow " +
    "assert break case continue default in return new deferred async await " +
    "try catch finally do else for if switch while import library export " +
    "part of show hide is as").split(" ");
  var blockKeywords = "try catch finally do else for if switch while".split(" ");
  var atoms = "true false null".split(" ");
  var builtins = "void bool num int double dynamic var String".split(" ");

  function set(words) {
    var obj = {};
    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
    return obj;
  }

  function pushInterpolationStack(state) {
    (state.interpolationStack || (state.interpolationStack = [])).push(state.tokenize);
  }

  function popInterpolationStack(state) {
    return (state.interpolationStack || (state.interpolationStack = [])).pop();
  }

  function sizeInterpolationStack(state) {
    return state.interpolationStack ? state.interpolationStack.length : 0;
  }

  CodeMirror.defineMIME("application/dart", {
    name: "clike",
    keywords: set(keywords),
    blockKeywords: set(blockKeywords),
    builtin: set(builtins),
    atoms: set(atoms),
    hooks: {
      "@": function(stream) {
        stream.eatWhile(/[\w\$_\.]/);
        return "meta";
      },

      // custom string handling to deal with triple-quoted strings and string interpolation
      "'": function(stream, state) {
        return tokenString("'", stream, state, false);
      },
      "\"": function(stream, state) {
        return tokenString("\"", stream, state, false);
      },
      "r": function(stream, state) {
        var peek = stream.peek();
        if (peek == "'" || peek == "\"") {
          return tokenString(stream.next(), stream, state, true);
        }
        return false;
      },

      "}": function(_stream, state) {
        // "}" is end of interpolation, if interpolation stack is non-empty
        if (sizeInterpolationStack(state) > 0) {
          state.tokenize = popInterpolationStack(state);
          return null;
        }
        return false;
      },

      "/": function(stream, state) {
        if (!stream.eat("*")) return false
        state.tokenize = tokenNestedComment(1)
        return state.tokenize(stream, state)
      }
    }
  });

  function tokenString(quote, stream, state, raw) {
    var tripleQuoted = false;
    if (stream.eat(quote)) {
      if (stream.eat(quote)) tripleQuoted = true;
      else return "string"; //empty string
    }
    function tokenStringHelper(stream, state) {
      var escaped = false;
      while (!stream.eol()) {
        if (!raw && !escaped && stream.peek() == "$") {
          pushInterpolationStack(state);
          state.tokenize = tokenInterpolation;
          return "string";
        }
        var next = stream.next();
        if (next == quote && !escaped && (!tripleQuoted || stream.match(quote + quote))) {
          state.tokenize = null;
          break;
        }
        escaped = !raw && !escaped && next == "\\";
      }
      return "string";
    }
    state.tokenize = tokenStringHelper;
    return tokenStringHelper(stream, state);
  }

  function tokenInterpolation(stream, state) {
    stream.eat("$");
    if (stream.eat("{")) {
      // let clike handle the content of ${...},
      // we take over again when "}" appears (see hooks).
      state.tokenize = null;
    } else {
      state.tokenize = tokenInterpolationIdentifier;
    }
    return null;
  }

  function tokenInterpolationIdentifier(stream, state) {
    stream.eatWhile(/[\w_]/);
    state.tokenize = popInterpolationStack(state);
    return "variable";
  }

  function tokenNestedComment(depth) {
    return function (stream, state) {
      var ch
      while (ch = stream.next()) {
        if (ch == "*" && stream.eat("/")) {
          if (depth == 1) {
            state.tokenize = null
            break
          } else {
            state.tokenize = tokenNestedComment(depth - 1)
            return state.tokenize(stream, state)
          }
        } else if (ch == "/" && stream.eat("*")) {
          state.tokenize = tokenNestedComment(depth + 1)
          return state.tokenize(stream, state)
        }
      }
      return "comment"
    }
  }

  CodeMirror.registerHelper("hintWords", "application/dart", keywords.concat(atoms).concat(builtins));

  // This is needed to make loading through meta.js work.
  CodeMirror.defineMode("dart", function(conf) {
    return CodeMirror.getMode(conf, "application/dart");
  }, "clike");
});
codemirror/mode/swift/index.html000064400000004045151215013500012762 0ustar00<!doctype html>

<title>CodeMirror: Swift mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="./swift.js"></script>
<style>
	.CodeMirror { border: 2px inset #dee; }
    </style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Swift</a>
  </ul>
</div>

<article>
<h2>Swift mode</h2>
<form><textarea id="code" name="code">
//
//  TipCalculatorModel.swift
//  TipCalculator
//
//  Created by Main Account on 12/18/14.
//  Copyright (c) 2014 Razeware LLC. All rights reserved.
//

import Foundation

class TipCalculatorModel {

  var total: Double
  var taxPct: Double
  var subtotal: Double {
    get {
      return total / (taxPct + 1)
    }
  }

  init(total: Double, taxPct: Double) {
    self.total = total
    self.taxPct = taxPct
  }

  func calcTipWithTipPct(tipPct: Double) -> Double {
    return subtotal * tipPct
  }

  func returnPossibleTips() -> [Int: Double] {

    let possibleTipsInferred = [0.15, 0.18, 0.20]
    let possibleTipsExplicit:[Double] = [0.15, 0.18, 0.20]

    var retval = [Int: Double]()
    for possibleTip in possibleTipsInferred {
      let intPct = Int(possibleTip*100)
      retval[intPct] = calcTipWithTipPct(possibleTip)
    }
    return retval

  }

}
</textarea></form>

    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        lineNumbers: true,
        matchBrackets: true,
        mode: "text/x-swift"
      });
    </script>

    <p>A simple mode for Swift</p>

    <p><strong>MIME types defined:</strong> <code>text/x-swift</code> (Swift code)</p>
  </article>
codemirror/mode/swift/swift.js000064400000014430151215013500012456 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

// Swift mode created by Michael Kaminsky https://github.com/mkaminsky11

(function(mod) {
  if (typeof exports == "object" && typeof module == "object")
    mod(require("../../lib/codemirror"))
  else if (typeof define == "function" && define.amd)
    define(["../../lib/codemirror"], mod)
  else
    mod(CodeMirror)
})(function(CodeMirror) {
  "use strict"

  function wordSet(words) {
    var set = {}
    for (var i = 0; i < words.length; i++) set[words[i]] = true
    return set
  }

  var keywords = wordSet(["var","let","class","deinit","enum","extension","func","import","init","protocol",
                          "static","struct","subscript","typealias","as","dynamicType","is","new","super",
                          "self","Self","Type","__COLUMN__","__FILE__","__FUNCTION__","__LINE__","break","case",
                          "continue","default","do","else","fallthrough","if","in","for","return","switch",
                          "where","while","associativity","didSet","get","infix","inout","left","mutating",
                          "none","nonmutating","operator","override","postfix","precedence","prefix","right",
                          "set","unowned","weak","willSet"])
  var definingKeywords = wordSet(["var","let","class","enum","extension","func","import","protocol","struct",
                                  "typealias","dynamicType","for"])
  var atoms = wordSet(["Infinity","NaN","undefined","null","true","false","on","off","yes","no","nil","null",
                       "this","super"])
  var types = wordSet(["String","bool","int","string","double","Double","Int","Float","float","public",
                       "private","extension"])
  var operators = "+-/*%=|&<>#"
  var punc = ";,.(){}[]"
  var number = /^-?(?:(?:[\d_]+\.[_\d]*|\.[_\d]+|0o[0-7_\.]+|0b[01_\.]+)(?:e-?[\d_]+)?|0x[\d_a-f\.]+(?:p-?[\d_]+)?)/i
  var identifier = /^[_A-Za-z$][_A-Za-z$0-9]*/
  var property = /^[@\.][_A-Za-z$][_A-Za-z$0-9]*/
  var regexp = /^\/(?!\s)(?:\/\/)?(?:\\.|[^\/])+\//

  function tokenBase(stream, state, prev) {
    if (stream.sol()) state.indented = stream.indentation()
    if (stream.eatSpace()) return null

    var ch = stream.peek()
    if (ch == "/") {
      if (stream.match("//")) {
        stream.skipToEnd()
        return "comment"
      }
      if (stream.match("/*")) {
        state.tokenize.push(tokenComment)
        return tokenComment(stream, state)
      }
      if (stream.match(regexp)) return "string-2"
    }
    if (operators.indexOf(ch) > -1) {
      stream.next()
      return "operator"
    }
    if (punc.indexOf(ch) > -1) {
      stream.next()
      stream.match("..")
      return "punctuation"
    }
    if (ch == '"' || ch == "'") {
      stream.next()
      var tokenize = tokenString(ch)
      state.tokenize.push(tokenize)
      return tokenize(stream, state)
    }

    if (stream.match(number)) return "number"
    if (stream.match(property)) return "property"

    if (stream.match(identifier)) {
      var ident = stream.current()
      if (keywords.hasOwnProperty(ident)) {
        if (definingKeywords.hasOwnProperty(ident))
          state.prev = "define"
        return "keyword"
      }
      if (types.hasOwnProperty(ident)) return "variable-2"
      if (atoms.hasOwnProperty(ident)) return "atom"
      if (prev == "define") return "def"
      return "variable"
    }

    stream.next()
    return null
  }

  function tokenUntilClosingParen() {
    var depth = 0
    return function(stream, state, prev) {
      var inner = tokenBase(stream, state, prev)
      if (inner == "punctuation") {
        if (stream.current() == "(") ++depth
        else if (stream.current() == ")") {
          if (depth == 0) {
            stream.backUp(1)
            state.tokenize.pop()
            return state.tokenize[state.tokenize.length - 1](stream, state)
          }
          else --depth
        }
      }
      return inner
    }
  }

  function tokenString(quote) {
    return function(stream, state) {
      var ch, escaped = false
      while (ch = stream.next()) {
        if (escaped) {
          if (ch == "(") {
            state.tokenize.push(tokenUntilClosingParen())
            return "string"
          }
          escaped = false
        } else if (ch == quote) {
          break
        } else {
          escaped = ch == "\\"
        }
      }
      state.tokenize.pop()
      return "string"
    }
  }

  function tokenComment(stream, state) {
    stream.match(/^(?:[^*]|\*(?!\/))*/)
    if (stream.match("*/")) state.tokenize.pop()
    return "comment"
  }

  function Context(prev, align, indented) {
    this.prev = prev
    this.align = align
    this.indented = indented
  }

  function pushContext(state, stream) {
    var align = stream.match(/^\s*($|\/[\/\*])/, false) ? null : stream.column() + 1
    state.context = new Context(state.context, align, state.indented)
  }

  function popContext(state) {
    if (state.context) {
      state.indented = state.context.indented
      state.context = state.context.prev
    }
  }

  CodeMirror.defineMode("swift", function(config) {
    return {
      startState: function() {
        return {
          prev: null,
          context: null,
          indented: 0,
          tokenize: []
        }
      },

      token: function(stream, state) {
        var prev = state.prev
        state.prev = null
        var tokenize = state.tokenize[state.tokenize.length - 1] || tokenBase
        var style = tokenize(stream, state, prev)
        if (!style || style == "comment") state.prev = prev
        else if (!state.prev) state.prev = style

        if (style == "punctuation") {
          var bracket = /[\(\[\{]|([\]\)\}])/.exec(stream.current())
          if (bracket) (bracket[1] ? popContext : pushContext)(state, stream)
        }

        return style
      },

      indent: function(state, textAfter) {
        var cx = state.context
        if (!cx) return 0
        var closing = /^[\]\}\)]/.test(textAfter)
        if (cx.align != null) return cx.align - (closing ? 1 : 0)
        return cx.indented + (closing ? 0 : config.indentUnit)
      },

      electricInput: /^\s*[\)\}\]]$/,

      lineComment: "//",
      blockCommentStart: "/*",
      blockCommentEnd: "*/"
    }
  })

  CodeMirror.defineMIME("text/x-swift","swift")
});
codemirror/mode/dtd/index.html000064400000006411151215013500012400 0ustar00<!doctype html>

<title>CodeMirror: DTD mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="dtd.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">DTD</a>
  </ul>
</div>

<article>
<h2>DTD mode</h2>
<form><textarea id="code" name="code"><?xml version="1.0" encoding="UTF-8"?>

<!ATTLIST title
  xmlns	CDATA	#FIXED	"http://docbook.org/ns/docbook"
  role	CDATA	#IMPLIED
  %db.common.attributes;
  %db.common.linking.attributes;
>

<!--
  Try: http://docbook.org/xml/5.0/dtd/docbook.dtd
-->

<!DOCTYPE xsl:stylesheet
  [
    <!ENTITY nbsp   "&amp;#160;">
    <!ENTITY copy   "&amp;#169;">
    <!ENTITY reg    "&amp;#174;">
    <!ENTITY trade  "&amp;#8482;">
    <!ENTITY mdash  "&amp;#8212;">
    <!ENTITY ldquo  "&amp;#8220;">
    <!ENTITY rdquo  "&amp;#8221;">
    <!ENTITY pound  "&amp;#163;">
    <!ENTITY yen    "&amp;#165;">
    <!ENTITY euro   "&amp;#8364;">
    <!ENTITY mathml "http://www.w3.org/1998/Math/MathML">
  ]
>

<!ELEMENT title (#PCDATA|inlinemediaobject|remark|superscript|subscript|xref|link|olink|anchor|biblioref|alt|annotation|indexterm|abbrev|acronym|date|emphasis|footnote|footnoteref|foreignphrase|phrase|quote|wordasword|firstterm|glossterm|coref|trademark|productnumber|productname|database|application|hardware|citation|citerefentry|citetitle|citebiblioid|author|person|personname|org|orgname|editor|jobtitle|replaceable|package|parameter|termdef|nonterminal|systemitem|option|optional|property|inlineequation|tag|markup|token|symbol|literal|code|constant|email|uri|guiicon|guibutton|guimenuitem|guimenu|guisubmenu|guilabel|menuchoice|mousebutton|keycombo|keycap|keycode|keysym|shortcut|accel|prompt|envar|filename|command|computeroutput|userinput|function|varname|returnvalue|type|classname|exceptionname|interfacename|methodname|modifier|initializer|ooclass|ooexception|oointerface|errorcode|errortext|errorname|errortype)*>

<!ENTITY % db.common.attributes "
  xml:id	ID	#IMPLIED
  version	CDATA	#IMPLIED
  xml:lang	CDATA	#IMPLIED
  xml:base	CDATA	#IMPLIED
  remap	CDATA	#IMPLIED
  xreflabel	CDATA	#IMPLIED
  revisionflag	(changed|added|deleted|off)	#IMPLIED
  dir	(ltr|rtl|lro|rlo)	#IMPLIED
  arch	CDATA	#IMPLIED
  audience	CDATA	#IMPLIED
  condition	CDATA	#IMPLIED
  conformance	CDATA	#IMPLIED
  os	CDATA	#IMPLIED
  revision	CDATA	#IMPLIED
  security	CDATA	#IMPLIED
  userlevel	CDATA	#IMPLIED
  vendor	CDATA	#IMPLIED
  wordsize	CDATA	#IMPLIED
  annotations	CDATA	#IMPLIED

"></textarea></form>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        mode: {name: "dtd", alignCDATA: true},
        lineNumbers: true,
        lineWrapping: true
      });
    </script>

    <p><strong>MIME types defined:</strong> <code>application/xml-dtd</code>.</p>
  </article>
codemirror/mode/dtd/dtd.js000064400000011316151215013500011514 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

/*
  DTD mode
  Ported to CodeMirror by Peter Kroon <plakroon@gmail.com>
  Report bugs/issues here: https://github.com/codemirror/CodeMirror/issues
  GitHub: @peterkroon
*/

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("dtd", function(config) {
  var indentUnit = config.indentUnit, type;
  function ret(style, tp) {type = tp; return style;}

  function tokenBase(stream, state) {
    var ch = stream.next();

    if (ch == "<" && stream.eat("!") ) {
      if (stream.eatWhile(/[\-]/)) {
        state.tokenize = tokenSGMLComment;
        return tokenSGMLComment(stream, state);
      } else if (stream.eatWhile(/[\w]/)) return ret("keyword", "doindent");
    } else if (ch == "<" && stream.eat("?")) { //xml declaration
      state.tokenize = inBlock("meta", "?>");
      return ret("meta", ch);
    } else if (ch == "#" && stream.eatWhile(/[\w]/)) return ret("atom", "tag");
    else if (ch == "|") return ret("keyword", "seperator");
    else if (ch.match(/[\(\)\[\]\-\.,\+\?>]/)) return ret(null, ch);//if(ch === ">") return ret(null, "endtag"); else
    else if (ch.match(/[\[\]]/)) return ret("rule", ch);
    else if (ch == "\"" || ch == "'") {
      state.tokenize = tokenString(ch);
      return state.tokenize(stream, state);
    } else if (stream.eatWhile(/[a-zA-Z\?\+\d]/)) {
      var sc = stream.current();
      if( sc.substr(sc.length-1,sc.length).match(/\?|\+/) !== null )stream.backUp(1);
      return ret("tag", "tag");
    } else if (ch == "%" || ch == "*" ) return ret("number", "number");
    else {
      stream.eatWhile(/[\w\\\-_%.{,]/);
      return ret(null, null);
    }
  }

  function tokenSGMLComment(stream, state) {
    var dashes = 0, ch;
    while ((ch = stream.next()) != null) {
      if (dashes >= 2 && ch == ">") {
        state.tokenize = tokenBase;
        break;
      }
      dashes = (ch == "-") ? dashes + 1 : 0;
    }
    return ret("comment", "comment");
  }

  function tokenString(quote) {
    return function(stream, state) {
      var escaped = false, ch;
      while ((ch = stream.next()) != null) {
        if (ch == quote && !escaped) {
          state.tokenize = tokenBase;
          break;
        }
        escaped = !escaped && ch == "\\";
      }
      return ret("string", "tag");
    };
  }

  function inBlock(style, terminator) {
    return function(stream, state) {
      while (!stream.eol()) {
        if (stream.match(terminator)) {
          state.tokenize = tokenBase;
          break;
        }
        stream.next();
      }
      return style;
    };
  }

  return {
    startState: function(base) {
      return {tokenize: tokenBase,
              baseIndent: base || 0,
              stack: []};
    },

    token: function(stream, state) {
      if (stream.eatSpace()) return null;
      var style = state.tokenize(stream, state);

      var context = state.stack[state.stack.length-1];
      if (stream.current() == "[" || type === "doindent" || type == "[") state.stack.push("rule");
      else if (type === "endtag") state.stack[state.stack.length-1] = "endtag";
      else if (stream.current() == "]" || type == "]" || (type == ">" && context == "rule")) state.stack.pop();
      else if (type == "[") state.stack.push("[");
      return style;
    },

    indent: function(state, textAfter) {
      var n = state.stack.length;

      if( textAfter.match(/\]\s+|\]/) )n=n-1;
      else if(textAfter.substr(textAfter.length-1, textAfter.length) === ">"){
        if(textAfter.substr(0,1) === "<") {}
        else if( type == "doindent" && textAfter.length > 1 ) {}
        else if( type == "doindent")n--;
        else if( type == ">" && textAfter.length > 1) {}
        else if( type == "tag" && textAfter !== ">") {}
        else if( type == "tag" && state.stack[state.stack.length-1] == "rule")n--;
        else if( type == "tag")n++;
        else if( textAfter === ">" && state.stack[state.stack.length-1] == "rule" && type === ">")n--;
        else if( textAfter === ">" && state.stack[state.stack.length-1] == "rule") {}
        else if( textAfter.substr(0,1) !== "<" && textAfter.substr(0,1) === ">" )n=n-1;
        else if( textAfter === ">") {}
        else n=n-1;
        //over rule them all
        if(type == null || type == "]")n--;
      }

      return state.baseIndent + n * indentUnit;
    },

    electricChars: "]>"
  };
});

CodeMirror.defineMIME("application/xml-dtd", "dtd");

});
codemirror/mode/tiddlywiki/index.html000064400000010743151215013500014005 0ustar00<!doctype html>

<title>CodeMirror: TiddlyWiki mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<link rel="stylesheet" href="tiddlywiki.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="tiddlywiki.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">TiddlyWiki</a>
  </ul>
</div>

<article>
<h2>TiddlyWiki mode</h2>


<div><textarea id="code" name="code">
!TiddlyWiki Formatting
* Rendered versions can be found at: http://www.tiddlywiki.com/#Reference

|!Option            | !Syntax            |
|bold font          | ''bold''           |
|italic type        | //italic//         |
|underlined text    | __underlined__     |
|strikethrough text | --strikethrough--  |
|superscript text   | super^^script^^    |
|subscript text     | sub~~script~~      |
|highlighted text   | @@highlighted@@    |
|preformatted text  | {{{preformatted}}} |

!Block Elements
<<<
!Heading 1

!!Heading 2

!!!Heading 3

!!!!Heading 4

!!!!!Heading 5
<<<

!!Lists
<<<
* unordered list, level 1
** unordered list, level 2
*** unordered list, level 3

# ordered list, level 1
## ordered list, level 2
### unordered list, level 3

; definition list, term
: definition list, description
<<<

!!Blockquotes
<<<
> blockquote, level 1
>> blockquote, level 2
>>> blockquote, level 3

> blockquote
<<<

!!Preformatted Text
<<<
{{{
preformatted (e.g. code)
}}}
<<<

!!Code Sections
<<<
{{{
Text style code
}}}

//{{{
JS styled code. TiddlyWiki mixed mode should support highlighter switching in the future.
//}}}

<!--{{{-->
XML styled code. TiddlyWiki mixed mode should support highlighter switching in the future.
<!--}}}-->
<<<

!!Tables
<<<
|CssClass|k
|!heading column 1|!heading column 2|
|row 1, column 1|row 1, column 2|
|row 2, column 1|row 2, column 2|
|>|COLSPAN|
|ROWSPAN| ... |
|~| ... |
|CssProperty:value;...| ... |
|caption|c

''Annotation:''
* The {{{>}}} marker creates a "colspan", causing the current cell to merge with the one to the right.
* The {{{~}}} marker creates a "rowspan", causing the current cell to merge with the one above.
<<<
!!Images /% TODO %/
cf. [[TiddlyWiki.com|http://www.tiddlywiki.com/#EmbeddedImages]]

!Hyperlinks
* [[WikiWords|WikiWord]] are automatically transformed to hyperlinks to the respective tiddler
** the automatic transformation can be suppressed by preceding the respective WikiWord with a tilde ({{{~}}}): {{{~WikiWord}}}
* [[PrettyLinks]] are enclosed in square brackets and contain the desired tiddler name: {{{[[tiddler name]]}}}
** optionally, a custom title or description can be added, separated by a pipe character ({{{|}}}): {{{[[title|target]]}}}<br>'''N.B.:''' In this case, the target can also be any website (i.e. URL).

!Custom Styling
* {{{@@CssProperty:value;CssProperty:value;...@@}}}<br>''N.B.:'' CSS color definitions should use lowercase letters to prevent the inadvertent creation of WikiWords.
* <html><code>{{customCssClass{...}}}</code></html>
* raw HTML can be inserted by enclosing the respective code in HTML tags: {{{<html> ... </html>}}}

!Special Markers
* {{{<br>}}} forces a manual line break
* {{{----}}} creates a horizontal ruler
* [[HTML entities|http://www.tiddlywiki.com/#HtmlEntities]]
* [[HTML entities local|HtmlEntities]]
* {{{<<macroName>>}}} calls the respective [[macro|Macros]]
* To hide text within a tiddler so that it is not displayed, it can be wrapped in {{{/%}}} and {{{%/}}}.<br/>This can be a useful trick for hiding drafts or annotating complex markup.
* To prevent wiki markup from taking effect for a particular section, that section can be enclosed in three double quotes: e.g. {{{"""WikiWord"""}}}.
</textarea></div>

    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        mode: 'tiddlywiki',      
        lineNumbers: true,
        matchBrackets: true
      });
    </script>

    <p>TiddlyWiki mode supports a single configuration.</p>

    <p><strong>MIME types defined:</strong> <code>text/x-tiddlywiki</code>.</p>
  </article>
codemirror/mode/tiddlywiki/tiddlywiki.css000064400000000334151215013500014672 0ustar00span.cm-underlined {
  text-decoration: underline;
}
span.cm-strikethrough {
  text-decoration: line-through;
}
span.cm-brace {
  color: #170;
  font-weight: bold;
}
span.cm-table {
  color: blue;
  font-weight: bold;
}
codemirror/mode/tiddlywiki/tiddlywiki.js000064400000020476151215013500014527 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

/***
    |''Name''|tiddlywiki.js|
    |''Description''|Enables TiddlyWikiy syntax highlighting using CodeMirror|
    |''Author''|PMario|
    |''Version''|0.1.7|
    |''Status''|''stable''|
    |''Source''|[[GitHub|https://github.com/pmario/CodeMirror2/blob/tw-syntax/mode/tiddlywiki]]|
    |''Documentation''|http://codemirror.tiddlyspace.com/|
    |''License''|[[MIT License|http://www.opensource.org/licenses/mit-license.php]]|
    |''CoreVersion''|2.5.0|
    |''Requires''|codemirror.js|
    |''Keywords''|syntax highlighting color code mirror codemirror|
    ! Info
    CoreVersion parameter is needed for TiddlyWiki only!
***/

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("tiddlywiki", function () {
  // Tokenizer
  var textwords = {};

  var keywords = {
    "allTags": true, "closeAll": true, "list": true,
    "newJournal": true, "newTiddler": true,
    "permaview": true, "saveChanges": true,
    "search": true, "slider": true, "tabs": true,
    "tag": true, "tagging": true, "tags": true,
    "tiddler": true, "timeline": true,
    "today": true, "version": true, "option": true,
    "with": true, "filter": true
  };

  var isSpaceName = /[\w_\-]/i,
      reHR = /^\-\-\-\-+$/,                                 // <hr>
      reWikiCommentStart = /^\/\*\*\*$/,            // /***
      reWikiCommentStop = /^\*\*\*\/$/,             // ***/
      reBlockQuote = /^<<<$/,

      reJsCodeStart = /^\/\/\{\{\{$/,                       // //{{{ js block start
      reJsCodeStop = /^\/\/\}\}\}$/,                        // //}}} js stop
      reXmlCodeStart = /^<!--\{\{\{-->$/,           // xml block start
      reXmlCodeStop = /^<!--\}\}\}-->$/,            // xml stop

      reCodeBlockStart = /^\{\{\{$/,                        // {{{ TW text div block start
      reCodeBlockStop = /^\}\}\}$/,                 // }}} TW text stop

      reUntilCodeStop = /.*?\}\}\}/;

  function chain(stream, state, f) {
    state.tokenize = f;
    return f(stream, state);
  }

  function tokenBase(stream, state) {
    var sol = stream.sol(), ch = stream.peek();

    state.block = false;        // indicates the start of a code block.

    // check start of  blocks
    if (sol && /[<\/\*{}\-]/.test(ch)) {
      if (stream.match(reCodeBlockStart)) {
        state.block = true;
        return chain(stream, state, twTokenCode);
      }
      if (stream.match(reBlockQuote))
        return 'quote';
      if (stream.match(reWikiCommentStart) || stream.match(reWikiCommentStop))
        return 'comment';
      if (stream.match(reJsCodeStart) || stream.match(reJsCodeStop) || stream.match(reXmlCodeStart) || stream.match(reXmlCodeStop))
        return 'comment';
      if (stream.match(reHR))
        return 'hr';
    }

    stream.next();
    if (sol && /[\/\*!#;:>|]/.test(ch)) {
      if (ch == "!") { // tw header
        stream.skipToEnd();
        return "header";
      }
      if (ch == "*") { // tw list
        stream.eatWhile('*');
        return "comment";
      }
      if (ch == "#") { // tw numbered list
        stream.eatWhile('#');
        return "comment";
      }
      if (ch == ";") { // definition list, term
        stream.eatWhile(';');
        return "comment";
      }
      if (ch == ":") { // definition list, description
        stream.eatWhile(':');
        return "comment";
      }
      if (ch == ">") { // single line quote
        stream.eatWhile(">");
        return "quote";
      }
      if (ch == '|')
        return 'header';
    }

    if (ch == '{' && stream.match(/\{\{/))
      return chain(stream, state, twTokenCode);

    // rudimentary html:// file:// link matching. TW knows much more ...
    if (/[hf]/i.test(ch) &&
        /[ti]/i.test(stream.peek()) &&
        stream.match(/\b(ttps?|tp|ile):\/\/[\-A-Z0-9+&@#\/%?=~_|$!:,.;]*[A-Z0-9+&@#\/%=~_|$]/i))
      return "link";

    // just a little string indicator, don't want to have the whole string covered
    if (ch == '"')
      return 'string';

    if (ch == '~')    // _no_ CamelCase indicator should be bold
      return 'brace';

    if (/[\[\]]/.test(ch) && stream.match(ch)) // check for [[..]]
      return 'brace';

    if (ch == "@") {    // check for space link. TODO fix @@...@@ highlighting
      stream.eatWhile(isSpaceName);
      return "link";
    }

    if (/\d/.test(ch)) {        // numbers
      stream.eatWhile(/\d/);
      return "number";
    }

    if (ch == "/") { // tw invisible comment
      if (stream.eat("%")) {
        return chain(stream, state, twTokenComment);
      } else if (stream.eat("/")) { //
        return chain(stream, state, twTokenEm);
      }
    }

    if (ch == "_" && stream.eat("_")) // tw underline
        return chain(stream, state, twTokenUnderline);

    // strikethrough and mdash handling
    if (ch == "-" && stream.eat("-")) {
      // if strikethrough looks ugly, change CSS.
      if (stream.peek() != ' ')
        return chain(stream, state, twTokenStrike);
      // mdash
      if (stream.peek() == ' ')
        return 'brace';
    }

    if (ch == "'" && stream.eat("'")) // tw bold
      return chain(stream, state, twTokenStrong);

    if (ch == "<" && stream.eat("<")) // tw macro
      return chain(stream, state, twTokenMacro);

    // core macro handling
    stream.eatWhile(/[\w\$_]/);
    return textwords.propertyIsEnumerable(stream.current()) ? "keyword" : null
  }

  // tw invisible comment
  function twTokenComment(stream, state) {
    var maybeEnd = false, ch;
    while (ch = stream.next()) {
      if (ch == "/" && maybeEnd) {
        state.tokenize = tokenBase;
        break;
      }
      maybeEnd = (ch == "%");
    }
    return "comment";
  }

  // tw strong / bold
  function twTokenStrong(stream, state) {
    var maybeEnd = false,
    ch;
    while (ch = stream.next()) {
      if (ch == "'" && maybeEnd) {
        state.tokenize = tokenBase;
        break;
      }
      maybeEnd = (ch == "'");
    }
    return "strong";
  }

  // tw code
  function twTokenCode(stream, state) {
    var sb = state.block;

    if (sb && stream.current()) {
      return "comment";
    }

    if (!sb && stream.match(reUntilCodeStop)) {
      state.tokenize = tokenBase;
      return "comment";
    }

    if (sb && stream.sol() && stream.match(reCodeBlockStop)) {
      state.tokenize = tokenBase;
      return "comment";
    }

    stream.next();
    return "comment";
  }

  // tw em / italic
  function twTokenEm(stream, state) {
    var maybeEnd = false,
    ch;
    while (ch = stream.next()) {
      if (ch == "/" && maybeEnd) {
        state.tokenize = tokenBase;
        break;
      }
      maybeEnd = (ch == "/");
    }
    return "em";
  }

  // tw underlined text
  function twTokenUnderline(stream, state) {
    var maybeEnd = false,
    ch;
    while (ch = stream.next()) {
      if (ch == "_" && maybeEnd) {
        state.tokenize = tokenBase;
        break;
      }
      maybeEnd = (ch == "_");
    }
    return "underlined";
  }

  // tw strike through text looks ugly
  // change CSS if needed
  function twTokenStrike(stream, state) {
    var maybeEnd = false, ch;

    while (ch = stream.next()) {
      if (ch == "-" && maybeEnd) {
        state.tokenize = tokenBase;
        break;
      }
      maybeEnd = (ch == "-");
    }
    return "strikethrough";
  }

  // macro
  function twTokenMacro(stream, state) {
    if (stream.current() == '<<') {
      return 'macro';
    }

    var ch = stream.next();
    if (!ch) {
      state.tokenize = tokenBase;
      return null;
    }
    if (ch == ">") {
      if (stream.peek() == '>') {
        stream.next();
        state.tokenize = tokenBase;
        return "macro";
      }
    }

    stream.eatWhile(/[\w\$_]/);
    return keywords.propertyIsEnumerable(stream.current()) ? "keyword" : null
  }

  // Interface
  return {
    startState: function () {
      return {tokenize: tokenBase};
    },

    token: function (stream, state) {
      if (stream.eatSpace()) return null;
      var style = state.tokenize(stream, state);
      return style;
    }
  };
});

CodeMirror.defineMIME("text/x-tiddlywiki", "tiddlywiki");
});
codemirror/mode/lua/index.html000064400000004031151215013500012402 0ustar00<!doctype html>

<title>CodeMirror: Lua mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<link rel="stylesheet" href="../../theme/neat.css">
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="../../lib/codemirror.js"></script>
<script src="lua.js"></script>
<style>.CodeMirror {border: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Lua</a>
  </ul>
</div>

<article>
<h2>Lua mode</h2>
<form><textarea id="code" name="code">
--[[
example useless code to show lua syntax highlighting
this is multiline comment
]]

function blahblahblah(x)

  local table = {
    "asd" = 123,
    "x" = 0.34,  
  }
  if x ~= 3 then
    print( x )
  elseif x == "string"
    my_custom_function( 0x34 )
  else
    unknown_function( "some string" )
  end

  --single line comment
  
end

function blablabla3()

  for k,v in ipairs( table ) do
    --abcde..
    y=[=[
  x=[[
      x is a multi line string
   ]]
  but its definition is iside a highest level string!
  ]=]
    print(" \"\" ")

    s = math.sin( x )
  end

end
</textarea></form>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        matchBrackets: true,
        theme: "neat"
      });
    </script>

    <p>Loosely based on Franciszek
    Wawrzak's <a href="http://codemirror.net/1/contrib/lua">CodeMirror
    1 mode</a>. One configuration parameter is
    supported, <code>specials</code>, to which you can provide an
    array of strings to have those identifiers highlighted with
    the <code>lua-special</code> style.</p>
    <p><strong>MIME types defined:</strong> <code>text/x-lua</code>.</p>

  </article>
codemirror/mode/lua/lua.js000064400000013476151215013500011541 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

// LUA mode. Ported to CodeMirror 2 from Franciszek Wawrzak's
// CodeMirror 1 mode.
// highlights keywords, strings, comments (no leveling supported! ("[==[")), tokens, basic indenting

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("lua", function(config, parserConfig) {
  var indentUnit = config.indentUnit;

  function prefixRE(words) {
    return new RegExp("^(?:" + words.join("|") + ")", "i");
  }
  function wordRE(words) {
    return new RegExp("^(?:" + words.join("|") + ")$", "i");
  }
  var specials = wordRE(parserConfig.specials || []);

  // long list of standard functions from lua manual
  var builtins = wordRE([
    "_G","_VERSION","assert","collectgarbage","dofile","error","getfenv","getmetatable","ipairs","load",
    "loadfile","loadstring","module","next","pairs","pcall","print","rawequal","rawget","rawset","require",
    "select","setfenv","setmetatable","tonumber","tostring","type","unpack","xpcall",

    "coroutine.create","coroutine.resume","coroutine.running","coroutine.status","coroutine.wrap","coroutine.yield",

    "debug.debug","debug.getfenv","debug.gethook","debug.getinfo","debug.getlocal","debug.getmetatable",
    "debug.getregistry","debug.getupvalue","debug.setfenv","debug.sethook","debug.setlocal","debug.setmetatable",
    "debug.setupvalue","debug.traceback",

    "close","flush","lines","read","seek","setvbuf","write",

    "io.close","io.flush","io.input","io.lines","io.open","io.output","io.popen","io.read","io.stderr","io.stdin",
    "io.stdout","io.tmpfile","io.type","io.write",

    "math.abs","math.acos","math.asin","math.atan","math.atan2","math.ceil","math.cos","math.cosh","math.deg",
    "math.exp","math.floor","math.fmod","math.frexp","math.huge","math.ldexp","math.log","math.log10","math.max",
    "math.min","math.modf","math.pi","math.pow","math.rad","math.random","math.randomseed","math.sin","math.sinh",
    "math.sqrt","math.tan","math.tanh",

    "os.clock","os.date","os.difftime","os.execute","os.exit","os.getenv","os.remove","os.rename","os.setlocale",
    "os.time","os.tmpname",

    "package.cpath","package.loaded","package.loaders","package.loadlib","package.path","package.preload",
    "package.seeall",

    "string.byte","string.char","string.dump","string.find","string.format","string.gmatch","string.gsub",
    "string.len","string.lower","string.match","string.rep","string.reverse","string.sub","string.upper",

    "table.concat","table.insert","table.maxn","table.remove","table.sort"
  ]);
  var keywords = wordRE(["and","break","elseif","false","nil","not","or","return",
                         "true","function", "end", "if", "then", "else", "do",
                         "while", "repeat", "until", "for", "in", "local" ]);

  var indentTokens = wordRE(["function", "if","repeat","do", "\\(", "{"]);
  var dedentTokens = wordRE(["end", "until", "\\)", "}"]);
  var dedentPartial = prefixRE(["end", "until", "\\)", "}", "else", "elseif"]);

  function readBracket(stream) {
    var level = 0;
    while (stream.eat("=")) ++level;
    stream.eat("[");
    return level;
  }

  function normal(stream, state) {
    var ch = stream.next();
    if (ch == "-" && stream.eat("-")) {
      if (stream.eat("[") && stream.eat("["))
        return (state.cur = bracketed(readBracket(stream), "comment"))(stream, state);
      stream.skipToEnd();
      return "comment";
    }
    if (ch == "\"" || ch == "'")
      return (state.cur = string(ch))(stream, state);
    if (ch == "[" && /[\[=]/.test(stream.peek()))
      return (state.cur = bracketed(readBracket(stream), "string"))(stream, state);
    if (/\d/.test(ch)) {
      stream.eatWhile(/[\w.%]/);
      return "number";
    }
    if (/[\w_]/.test(ch)) {
      stream.eatWhile(/[\w\\\-_.]/);
      return "variable";
    }
    return null;
  }

  function bracketed(level, style) {
    return function(stream, state) {
      var curlev = null, ch;
      while ((ch = stream.next()) != null) {
        if (curlev == null) {if (ch == "]") curlev = 0;}
        else if (ch == "=") ++curlev;
        else if (ch == "]" && curlev == level) { state.cur = normal; break; }
        else curlev = null;
      }
      return style;
    };
  }

  function string(quote) {
    return function(stream, state) {
      var escaped = false, ch;
      while ((ch = stream.next()) != null) {
        if (ch == quote && !escaped) break;
        escaped = !escaped && ch == "\\";
      }
      if (!escaped) state.cur = normal;
      return "string";
    };
  }

  return {
    startState: function(basecol) {
      return {basecol: basecol || 0, indentDepth: 0, cur: normal};
    },

    token: function(stream, state) {
      if (stream.eatSpace()) return null;
      var style = state.cur(stream, state);
      var word = stream.current();
      if (style == "variable") {
        if (keywords.test(word)) style = "keyword";
        else if (builtins.test(word)) style = "builtin";
        else if (specials.test(word)) style = "variable-2";
      }
      if ((style != "comment") && (style != "string")){
        if (indentTokens.test(word)) ++state.indentDepth;
        else if (dedentTokens.test(word)) --state.indentDepth;
      }
      return style;
    },

    indent: function(state, textAfter) {
      var closing = dedentPartial.test(textAfter);
      return state.basecol + indentUnit * (state.indentDepth - (closing ? 1 : 0));
    },

    lineComment: "--",
    blockCommentStart: "--[[",
    blockCommentEnd: "]]"
  };
});

CodeMirror.defineMIME("text/x-lua", "lua");

});
codemirror/mode/gfm/index.html000064400000005027151215013500012400 0ustar00<!doctype html>

<title>CodeMirror: GFM mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/mode/overlay.js"></script>
<script src="../xml/xml.js"></script>
<script src="../markdown/markdown.js"></script>
<script src="gfm.js"></script>
<script src="../javascript/javascript.js"></script>
<script src="../css/css.js"></script>
<script src="../htmlmixed/htmlmixed.js"></script>
<script src="../clike/clike.js"></script>
<script src="../meta.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">GFM</a>
  </ul>
</div>

<article>
<h2>GFM mode</h2>
<form><textarea id="code" name="code">
GitHub Flavored Markdown
========================

Everything from markdown plus GFM features:

## URL autolinking

Underscores_are_allowed_between_words.

## Strikethrough text

GFM adds syntax to strikethrough text, which is missing from standard Markdown.

~~Mistaken text.~~
~~**works with other formatting**~~

~~spans across
lines~~

## Fenced code blocks (and syntax highlighting)

```javascript
for (var i = 0; i &lt; items.length; i++) {
    console.log(items[i], i); // log them
}
```

## Task Lists

- [ ] Incomplete task list item
- [x] **Completed** task list item

## A bit of GitHub spice

* SHA: be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2
* User@SHA ref: mojombo@be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2
* User/Project@SHA: mojombo/god@be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2
* \#Num: #1
* User/#Num: mojombo#1
* User/Project#Num: mojombo/god#1

See http://github.github.com/github-flavored-markdown/.

</textarea></form>

    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        mode: 'gfm',
        lineNumbers: true,
        theme: "default"
      });
    </script>

    <p>Optionally depends on other modes for properly highlighted code blocks.</p>

    <p><strong>Parsing/Highlighting Tests:</strong> <a href="../../test/index.html#gfm_*">normal</a>,  <a href="../../test/index.html#verbose,gfm_*">verbose</a>.</p>

  </article>
codemirror/mode/gfm/test.js000064400000016624151215013500011725 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function() {
  var mode = CodeMirror.getMode({tabSize: 4}, "gfm");
  function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); }
  var modeHighlightFormatting = CodeMirror.getMode({tabSize: 4}, {name: "gfm", highlightFormatting: true});
  function FT(name) { test.mode(name, modeHighlightFormatting, Array.prototype.slice.call(arguments, 1)); }

  FT("codeBackticks",
     "[comment&formatting&formatting-code `][comment foo][comment&formatting&formatting-code `]");

  FT("doubleBackticks",
     "[comment&formatting&formatting-code ``][comment foo ` bar][comment&formatting&formatting-code ``]");

  FT("codeBlock",
     "[comment&formatting&formatting-code-block ```css]",
     "[tag foo]",
     "[comment&formatting&formatting-code-block ```]");

  FT("taskList",
     "[variable-2&formatting&formatting-list&formatting-list-ul - ][meta&formatting&formatting-task [ ]]][variable-2  foo]",
     "[variable-2&formatting&formatting-list&formatting-list-ul - ][property&formatting&formatting-task [x]]][variable-2  foo]");

  FT("formatting_strikethrough",
     "[strikethrough&formatting&formatting-strikethrough ~~][strikethrough foo][strikethrough&formatting&formatting-strikethrough ~~]");

  FT("formatting_strikethrough",
     "foo [strikethrough&formatting&formatting-strikethrough ~~][strikethrough bar][strikethrough&formatting&formatting-strikethrough ~~]");

  MT("emInWordAsterisk",
     "foo[em *bar*]hello");

  MT("emInWordUnderscore",
     "foo_bar_hello");

  MT("emStrongUnderscore",
     "[strong __][em&strong _foo__][em _] bar");

  MT("fencedCodeBlocks",
     "[comment ```]",
     "[comment foo]",
     "",
     "[comment ```]",
     "bar");

  MT("fencedCodeBlockModeSwitching",
     "[comment ```javascript]",
     "[variable foo]",
     "",
     "[comment ```]",
     "bar");

  MT("fencedCodeBlockModeSwitchingObjc",
     "[comment ```objective-c]",
     "[keyword @property] [variable NSString] [operator *] [variable foo];",
     "[comment ```]",
     "bar");

  MT("fencedCodeBlocksNoTildes",
     "~~~",
     "foo",
     "~~~");

  MT("taskListAsterisk",
     "[variable-2 * []] foo]", // Invalid; must have space or x between []
     "[variable-2 * [ ]]bar]", // Invalid; must have space after ]
     "[variable-2 * [x]]hello]", // Invalid; must have space after ]
     "[variable-2 * ][meta [ ]]][variable-2  [world]]]", // Valid; tests reference style links
     "    [variable-3 * ][property [x]]][variable-3  foo]"); // Valid; can be nested

  MT("taskListPlus",
     "[variable-2 + []] foo]", // Invalid; must have space or x between []
     "[variable-2 + [ ]]bar]", // Invalid; must have space after ]
     "[variable-2 + [x]]hello]", // Invalid; must have space after ]
     "[variable-2 + ][meta [ ]]][variable-2  [world]]]", // Valid; tests reference style links
     "    [variable-3 + ][property [x]]][variable-3  foo]"); // Valid; can be nested

  MT("taskListDash",
     "[variable-2 - []] foo]", // Invalid; must have space or x between []
     "[variable-2 - [ ]]bar]", // Invalid; must have space after ]
     "[variable-2 - [x]]hello]", // Invalid; must have space after ]
     "[variable-2 - ][meta [ ]]][variable-2  [world]]]", // Valid; tests reference style links
     "    [variable-3 - ][property [x]]][variable-3  foo]"); // Valid; can be nested

  MT("taskListNumber",
     "[variable-2 1. []] foo]", // Invalid; must have space or x between []
     "[variable-2 2. [ ]]bar]", // Invalid; must have space after ]
     "[variable-2 3. [x]]hello]", // Invalid; must have space after ]
     "[variable-2 4. ][meta [ ]]][variable-2  [world]]]", // Valid; tests reference style links
     "    [variable-3 1. ][property [x]]][variable-3  foo]"); // Valid; can be nested

  MT("SHA",
     "foo [link be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2] bar");

  MT("SHAEmphasis",
     "[em *foo ][em&link be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2][em *]");

  MT("shortSHA",
     "foo [link be6a8cc] bar");

  MT("tooShortSHA",
     "foo be6a8c bar");

  MT("longSHA",
     "foo be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd22 bar");

  MT("badSHA",
     "foo be6a8cc1c1ecfe9489fb51e4869af15a13fc2cg2 bar");

  MT("userSHA",
     "foo [link bar@be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2] hello");

  MT("userSHAEmphasis",
     "[em *foo ][em&link bar@be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2][em *]");

  MT("userProjectSHA",
     "foo [link bar/hello@be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2] world");

  MT("userProjectSHAEmphasis",
     "[em *foo ][em&link bar/hello@be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2][em *]");

  MT("num",
     "foo [link #1] bar");

  MT("numEmphasis",
     "[em *foo ][em&link #1][em *]");

  MT("badNum",
     "foo #1bar hello");

  MT("userNum",
     "foo [link bar#1] hello");

  MT("userNumEmphasis",
     "[em *foo ][em&link bar#1][em *]");

  MT("userProjectNum",
     "foo [link bar/hello#1] world");

  MT("userProjectNumEmphasis",
     "[em *foo ][em&link bar/hello#1][em *]");

  MT("vanillaLink",
     "foo [link http://www.example.com/] bar");

  MT("vanillaLinkNoScheme",
     "foo [link www.example.com] bar");

  MT("vanillaLinkHttps",
     "foo [link https://www.example.com/] bar");

  MT("vanillaLinkDataSchema",
     "foo [link data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==] bar");

  MT("vanillaLinkPunctuation",
     "foo [link http://www.example.com/]. bar");

  MT("vanillaLinkExtension",
     "foo [link http://www.example.com/index.html] bar");

  MT("vanillaLinkEmphasis",
     "foo [em *][em&link http://www.example.com/index.html][em *] bar");

  MT("notALink",
     "foo asfd:asdf bar");

  MT("notALink",
     "[comment ```css]",
     "[tag foo] {[property color]:[keyword black];}",
     "[comment ```][link http://www.example.com/]");

  MT("notALink",
     "[comment ``foo `bar` http://www.example.com/``] hello");

  MT("notALink",
     "[comment `foo]",
     "[comment&link http://www.example.com/]",
     "[comment `] foo",
     "",
     "[link http://www.example.com/]");

  MT("headerCodeBlockGithub",
     "[header&header-1 # heading]",
     "",
     "[comment ```]",
     "[comment code]",
     "[comment ```]",
     "",
     "Commit: [link be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2]",
     "Issue: [link #1]",
     "Link: [link http://www.example.com/]");

  MT("strikethrough",
     "[strikethrough ~~foo~~]");

  MT("strikethroughWithStartingSpace",
     "~~ foo~~");

  MT("strikethroughUnclosedStrayTildes",
    "[strikethrough ~~foo~~~]");

  MT("strikethroughUnclosedStrayTildes",
     "[strikethrough ~~foo ~~]");

  MT("strikethroughUnclosedStrayTildes",
    "[strikethrough ~~foo ~~ bar]");

  MT("strikethroughUnclosedStrayTildes",
    "[strikethrough ~~foo ~~ bar~~]hello");

  MT("strikethroughOneLetter",
     "[strikethrough ~~a~~]");

  MT("strikethroughWrapped",
     "[strikethrough ~~foo]",
     "[strikethrough foo~~]");

  MT("strikethroughParagraph",
     "[strikethrough ~~foo]",
     "",
     "foo[strikethrough ~~bar]");

  MT("strikethroughEm",
     "[strikethrough ~~foo][em&strikethrough *bar*][strikethrough ~~]");

  MT("strikethroughEm",
     "[em *][em&strikethrough ~~foo~~][em *]");

  MT("strikethroughStrong",
     "[strikethrough ~~][strong&strikethrough **foo**][strikethrough ~~]");

  MT("strikethroughStrong",
     "[strong **][strong&strikethrough ~~foo~~][strong **]");

})();
codemirror/mode/gfm/gfm.js000064400000012021151215013500011502 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"), require("../markdown/markdown"), require("../../addon/mode/overlay"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror", "../markdown/markdown", "../../addon/mode/overlay"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

var urlRE = /^((?:(?:aaas?|about|acap|adiumxtra|af[ps]|aim|apt|attachment|aw|beshare|bitcoin|bolo|callto|cap|chrome(?:-extension)?|cid|coap|com-eventbrite-attendee|content|crid|cvs|data|dav|dict|dlna-(?:playcontainer|playsingle)|dns|doi|dtn|dvb|ed2k|facetime|feed|file|finger|fish|ftp|geo|gg|git|gizmoproject|go|gopher|gtalk|h323|hcp|https?|iax|icap|icon|im|imap|info|ipn|ipp|irc[6s]?|iris(?:\.beep|\.lwz|\.xpc|\.xpcs)?|itms|jar|javascript|jms|keyparc|lastfm|ldaps?|magnet|mailto|maps|market|message|mid|mms|ms-help|msnim|msrps?|mtqp|mumble|mupdate|mvn|news|nfs|nih?|nntp|notes|oid|opaquelocktoken|palm|paparazzi|platform|pop|pres|proxy|psyc|query|res(?:ource)?|rmi|rsync|rtmp|rtsp|secondlife|service|session|sftp|sgn|shttp|sieve|sips?|skype|sm[bs]|snmp|soap\.beeps?|soldat|spotify|ssh|steam|svn|tag|teamspeak|tel(?:net)?|tftp|things|thismessage|tip|tn3270|tv|udp|unreal|urn|ut2004|vemmi|ventrilo|view-source|webcal|wss?|wtai|wyciwyg|xcon(?:-userid)?|xfire|xmlrpc\.beeps?|xmpp|xri|ymsgr|z39\.50[rs]?):(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]|\([^\s()<>]*\))+(?:\([^\s()<>]*\)|[^\s`*!()\[\]{};:'".,<>?«»“”‘’]))/i

CodeMirror.defineMode("gfm", function(config, modeConfig) {
  var codeDepth = 0;
  function blankLine(state) {
    state.code = false;
    return null;
  }
  var gfmOverlay = {
    startState: function() {
      return {
        code: false,
        codeBlock: false,
        ateSpace: false
      };
    },
    copyState: function(s) {
      return {
        code: s.code,
        codeBlock: s.codeBlock,
        ateSpace: s.ateSpace
      };
    },
    token: function(stream, state) {
      state.combineTokens = null;

      // Hack to prevent formatting override inside code blocks (block and inline)
      if (state.codeBlock) {
        if (stream.match(/^```+/)) {
          state.codeBlock = false;
          return null;
        }
        stream.skipToEnd();
        return null;
      }
      if (stream.sol()) {
        state.code = false;
      }
      if (stream.sol() && stream.match(/^```+/)) {
        stream.skipToEnd();
        state.codeBlock = true;
        return null;
      }
      // If this block is changed, it may need to be updated in Markdown mode
      if (stream.peek() === '`') {
        stream.next();
        var before = stream.pos;
        stream.eatWhile('`');
        var difference = 1 + stream.pos - before;
        if (!state.code) {
          codeDepth = difference;
          state.code = true;
        } else {
          if (difference === codeDepth) { // Must be exact
            state.code = false;
          }
        }
        return null;
      } else if (state.code) {
        stream.next();
        return null;
      }
      // Check if space. If so, links can be formatted later on
      if (stream.eatSpace()) {
        state.ateSpace = true;
        return null;
      }
      if (stream.sol() || state.ateSpace) {
        state.ateSpace = false;
        if (modeConfig.gitHubSpice !== false) {
          if(stream.match(/^(?:[a-zA-Z0-9\-_]+\/)?(?:[a-zA-Z0-9\-_]+@)?(?:[a-f0-9]{7,40}\b)/)) {
            // User/Project@SHA
            // User@SHA
            // SHA
            state.combineTokens = true;
            return "link";
          } else if (stream.match(/^(?:[a-zA-Z0-9\-_]+\/)?(?:[a-zA-Z0-9\-_]+)?#[0-9]+\b/)) {
            // User/Project#Num
            // User#Num
            // #Num
            state.combineTokens = true;
            return "link";
          }
        }
      }
      if (stream.match(urlRE) &&
          stream.string.slice(stream.start - 2, stream.start) != "](" &&
          (stream.start == 0 || /\W/.test(stream.string.charAt(stream.start - 1)))) {
        // URLs
        // Taken from http://daringfireball.net/2010/07/improved_regex_for_matching_urls
        // And then (issue #1160) simplified to make it not crash the Chrome Regexp engine
        // And then limited url schemes to the CommonMark list, so foo:bar isn't matched as a URL
        state.combineTokens = true;
        return "link";
      }
      stream.next();
      return null;
    },
    blankLine: blankLine
  };

  var markdownConfig = {
    underscoresBreakWords: false,
    taskLists: true,
    fencedCodeBlocks: '```',
    strikethrough: true
  };
  for (var attr in modeConfig) {
    markdownConfig[attr] = modeConfig[attr];
  }
  markdownConfig.name = "markdown";
  return CodeMirror.overlayMode(CodeMirror.getMode(config, markdownConfig), gfmOverlay);

}, "markdown");

  CodeMirror.defineMIME("text/x-gfm", "gfm");
});
codemirror/mode/haskell/index.html000064400000004222151215013500013246 0ustar00<!doctype html>

<title>CodeMirror: Haskell mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<link rel="stylesheet" href="../../theme/elegant.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="haskell.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Haskell</a>
  </ul>
</div>

<article>
<h2>Haskell mode</h2>
<form><textarea id="code" name="code">
module UniquePerms (
    uniquePerms
    )
where

-- | Find all unique permutations of a list where there might be duplicates.
uniquePerms :: (Eq a) => [a] -> [[a]]
uniquePerms = permBag . makeBag

-- | An unordered collection where duplicate values are allowed,
-- but represented with a single value and a count.
type Bag a = [(a, Int)]

makeBag :: (Eq a) => [a] -> Bag a
makeBag [] = []
makeBag (a:as) = mix a $ makeBag as
  where
    mix a []                        = [(a,1)]
    mix a (bn@(b,n):bs) | a == b    = (b,n+1):bs
                        | otherwise = bn : mix a bs

permBag :: Bag a -> [[a]]
permBag [] = [[]]
permBag bs = concatMap (\(f,cs) -> map (f:) $ permBag cs) . oneOfEach $ bs
  where
    oneOfEach [] = []
    oneOfEach (an@(a,n):bs) =
        let bs' = if n == 1 then bs else (a,n-1):bs
        in (a,bs') : mapSnd (an:) (oneOfEach bs)
    
    apSnd f (a,b) = (a, f b)
    mapSnd = map . apSnd
</textarea></form>

    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        lineNumbers: true,
        matchBrackets: true,
        theme: "elegant"
      });
    </script>

    <p><strong>MIME types defined:</strong> <code>text/x-haskell</code>.</p>
  </article>
codemirror/mode/haskell/haskell.js000064400000017645151215013500013247 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("haskell", function(_config, modeConfig) {

  function switchState(source, setState, f) {
    setState(f);
    return f(source, setState);
  }

  // These should all be Unicode extended, as per the Haskell 2010 report
  var smallRE = /[a-z_]/;
  var largeRE = /[A-Z]/;
  var digitRE = /\d/;
  var hexitRE = /[0-9A-Fa-f]/;
  var octitRE = /[0-7]/;
  var idRE = /[a-z_A-Z0-9'\xa1-\uffff]/;
  var symbolRE = /[-!#$%&*+.\/<=>?@\\^|~:]/;
  var specialRE = /[(),;[\]`{}]/;
  var whiteCharRE = /[ \t\v\f]/; // newlines are handled in tokenizer

  function normal(source, setState) {
    if (source.eatWhile(whiteCharRE)) {
      return null;
    }

    var ch = source.next();
    if (specialRE.test(ch)) {
      if (ch == '{' && source.eat('-')) {
        var t = "comment";
        if (source.eat('#')) {
          t = "meta";
        }
        return switchState(source, setState, ncomment(t, 1));
      }
      return null;
    }

    if (ch == '\'') {
      if (source.eat('\\')) {
        source.next();  // should handle other escapes here
      }
      else {
        source.next();
      }
      if (source.eat('\'')) {
        return "string";
      }
      return "error";
    }

    if (ch == '"') {
      return switchState(source, setState, stringLiteral);
    }

    if (largeRE.test(ch)) {
      source.eatWhile(idRE);
      if (source.eat('.')) {
        return "qualifier";
      }
      return "variable-2";
    }

    if (smallRE.test(ch)) {
      source.eatWhile(idRE);
      return "variable";
    }

    if (digitRE.test(ch)) {
      if (ch == '0') {
        if (source.eat(/[xX]/)) {
          source.eatWhile(hexitRE); // should require at least 1
          return "integer";
        }
        if (source.eat(/[oO]/)) {
          source.eatWhile(octitRE); // should require at least 1
          return "number";
        }
      }
      source.eatWhile(digitRE);
      var t = "number";
      if (source.match(/^\.\d+/)) {
        t = "number";
      }
      if (source.eat(/[eE]/)) {
        t = "number";
        source.eat(/[-+]/);
        source.eatWhile(digitRE); // should require at least 1
      }
      return t;
    }

    if (ch == "." && source.eat("."))
      return "keyword";

    if (symbolRE.test(ch)) {
      if (ch == '-' && source.eat(/-/)) {
        source.eatWhile(/-/);
        if (!source.eat(symbolRE)) {
          source.skipToEnd();
          return "comment";
        }
      }
      var t = "variable";
      if (ch == ':') {
        t = "variable-2";
      }
      source.eatWhile(symbolRE);
      return t;
    }

    return "error";
  }

  function ncomment(type, nest) {
    if (nest == 0) {
      return normal;
    }
    return function(source, setState) {
      var currNest = nest;
      while (!source.eol()) {
        var ch = source.next();
        if (ch == '{' && source.eat('-')) {
          ++currNest;
        }
        else if (ch == '-' && source.eat('}')) {
          --currNest;
          if (currNest == 0) {
            setState(normal);
            return type;
          }
        }
      }
      setState(ncomment(type, currNest));
      return type;
    };
  }

  function stringLiteral(source, setState) {
    while (!source.eol()) {
      var ch = source.next();
      if (ch == '"') {
        setState(normal);
        return "string";
      }
      if (ch == '\\') {
        if (source.eol() || source.eat(whiteCharRE)) {
          setState(stringGap);
          return "string";
        }
        if (source.eat('&')) {
        }
        else {
          source.next(); // should handle other escapes here
        }
      }
    }
    setState(normal);
    return "error";
  }

  function stringGap(source, setState) {
    if (source.eat('\\')) {
      return switchState(source, setState, stringLiteral);
    }
    source.next();
    setState(normal);
    return "error";
  }


  var wellKnownWords = (function() {
    var wkw = {};
    function setType(t) {
      return function () {
        for (var i = 0; i < arguments.length; i++)
          wkw[arguments[i]] = t;
      };
    }

    setType("keyword")(
      "case", "class", "data", "default", "deriving", "do", "else", "foreign",
      "if", "import", "in", "infix", "infixl", "infixr", "instance", "let",
      "module", "newtype", "of", "then", "type", "where", "_");

    setType("keyword")(
      "\.\.", ":", "::", "=", "\\", "\"", "<-", "->", "@", "~", "=>");

    setType("builtin")(
      "!!", "$!", "$", "&&", "+", "++", "-", ".", "/", "/=", "<", "<=", "=<<",
      "==", ">", ">=", ">>", ">>=", "^", "^^", "||", "*", "**");

    setType("builtin")(
      "Bool", "Bounded", "Char", "Double", "EQ", "Either", "Enum", "Eq",
      "False", "FilePath", "Float", "Floating", "Fractional", "Functor", "GT",
      "IO", "IOError", "Int", "Integer", "Integral", "Just", "LT", "Left",
      "Maybe", "Monad", "Nothing", "Num", "Ord", "Ordering", "Rational", "Read",
      "ReadS", "Real", "RealFloat", "RealFrac", "Right", "Show", "ShowS",
      "String", "True");

    setType("builtin")(
      "abs", "acos", "acosh", "all", "and", "any", "appendFile", "asTypeOf",
      "asin", "asinh", "atan", "atan2", "atanh", "break", "catch", "ceiling",
      "compare", "concat", "concatMap", "const", "cos", "cosh", "curry",
      "cycle", "decodeFloat", "div", "divMod", "drop", "dropWhile", "either",
      "elem", "encodeFloat", "enumFrom", "enumFromThen", "enumFromThenTo",
      "enumFromTo", "error", "even", "exp", "exponent", "fail", "filter",
      "flip", "floatDigits", "floatRadix", "floatRange", "floor", "fmap",
      "foldl", "foldl1", "foldr", "foldr1", "fromEnum", "fromInteger",
      "fromIntegral", "fromRational", "fst", "gcd", "getChar", "getContents",
      "getLine", "head", "id", "init", "interact", "ioError", "isDenormalized",
      "isIEEE", "isInfinite", "isNaN", "isNegativeZero", "iterate", "last",
      "lcm", "length", "lex", "lines", "log", "logBase", "lookup", "map",
      "mapM", "mapM_", "max", "maxBound", "maximum", "maybe", "min", "minBound",
      "minimum", "mod", "negate", "not", "notElem", "null", "odd", "or",
      "otherwise", "pi", "pred", "print", "product", "properFraction",
      "putChar", "putStr", "putStrLn", "quot", "quotRem", "read", "readFile",
      "readIO", "readList", "readLn", "readParen", "reads", "readsPrec",
      "realToFrac", "recip", "rem", "repeat", "replicate", "return", "reverse",
      "round", "scaleFloat", "scanl", "scanl1", "scanr", "scanr1", "seq",
      "sequence", "sequence_", "show", "showChar", "showList", "showParen",
      "showString", "shows", "showsPrec", "significand", "signum", "sin",
      "sinh", "snd", "span", "splitAt", "sqrt", "subtract", "succ", "sum",
      "tail", "take", "takeWhile", "tan", "tanh", "toEnum", "toInteger",
      "toRational", "truncate", "uncurry", "undefined", "unlines", "until",
      "unwords", "unzip", "unzip3", "userError", "words", "writeFile", "zip",
      "zip3", "zipWith", "zipWith3");

    var override = modeConfig.overrideKeywords;
    if (override) for (var word in override) if (override.hasOwnProperty(word))
      wkw[word] = override[word];

    return wkw;
  })();



  return {
    startState: function ()  { return { f: normal }; },
    copyState:  function (s) { return { f: s.f }; },

    token: function(stream, state) {
      var t = state.f(stream, function(s) { state.f = s; });
      var w = stream.current();
      return wellKnownWords.hasOwnProperty(w) ? wellKnownWords[w] : t;
    },

    blockCommentStart: "{-",
    blockCommentEnd: "-}",
    lineComment: "--"
  };

});

CodeMirror.defineMIME("text/x-haskell", "haskell");

});
codemirror/mode/dylan/index.html000064400000031350151215013500012734 0ustar00<!doctype html>

<title>CodeMirror: Dylan mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="../../addon/comment/continuecomment.js"></script>
<script src="../../addon/comment/comment.js"></script>
<script src="dylan.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Dylan</a>
  </ul>
</div>

<article>
<h2>Dylan mode</h2>


<div><textarea id="code" name="code">
Module:       locators-internals
Synopsis:     Abstract modeling of locations
Author:       Andy Armstrong
Copyright:    Original Code is Copyright (c) 1995-2004 Functional Objects, Inc.
              All rights reserved.
License:      See License.txt in this distribution for details.
Warranty:     Distributed WITHOUT WARRANTY OF ANY KIND

define open generic locator-server
    (locator :: <locator>) => (server :: false-or(<server-locator>));
define open generic locator-host
    (locator :: <locator>) => (host :: false-or(<string>));
define open generic locator-volume
    (locator :: <locator>) => (volume :: false-or(<string>));
define open generic locator-directory
    (locator :: <locator>) => (directory :: false-or(<directory-locator>));
define open generic locator-relative?
    (locator :: <locator>) => (relative? :: <boolean>);
define open generic locator-path
    (locator :: <locator>) => (path :: <sequence>);
define open generic locator-base
    (locator :: <locator>) => (base :: false-or(<string>));
define open generic locator-extension
    (locator :: <locator>) => (extension :: false-or(<string>));

/// Locator classes

define open abstract class <directory-locator> (<physical-locator>)
end class <directory-locator>;

define open abstract class <file-locator> (<physical-locator>)
end class <file-locator>;

define method as
    (class == <directory-locator>, string :: <string>)
 => (locator :: <directory-locator>)
  as(<native-directory-locator>, string)
end method as;

define method make
    (class == <directory-locator>,
     #key server :: false-or(<server-locator>) = #f,
          path :: <sequence> = #[],
          relative? :: <boolean> = #f,
          name :: false-or(<string>) = #f)
 => (locator :: <directory-locator>)
  make(<native-directory-locator>,
       server:    server,
       path:      path,
       relative?: relative?,
       name:      name)
end method make;

define method as
    (class == <file-locator>, string :: <string>)
 => (locator :: <file-locator>)
  as(<native-file-locator>, string)
end method as;

define method make
    (class == <file-locator>,
     #key directory :: false-or(<directory-locator>) = #f,
          base :: false-or(<string>) = #f,
          extension :: false-or(<string>) = #f,
          name :: false-or(<string>) = #f)
 => (locator :: <file-locator>)
  make(<native-file-locator>,
       directory: directory,
       base:      base,
       extension: extension,
       name:      name)
end method make;

/// Locator coercion

//---*** andrewa: This caching scheme doesn't work yet, so disable it.
define constant $cache-locators?        = #f;
define constant $cache-locator-strings? = #f;

define constant $locator-to-string-cache = make(<object-table>, weak: #"key");
define constant $string-to-locator-cache = make(<string-table>, weak: #"value");

define open generic locator-as-string
    (class :: subclass(<string>), locator :: <locator>)
 => (string :: <string>);

define open generic string-as-locator
    (class :: subclass(<locator>), string :: <string>)
 => (locator :: <locator>);

define sealed sideways method as
    (class :: subclass(<string>), locator :: <locator>)
 => (string :: <string>)
  let string = element($locator-to-string-cache, locator, default: #f);
  if (string)
    as(class, string)
  else
    let string = locator-as-string(class, locator);
    if ($cache-locator-strings?)
      element($locator-to-string-cache, locator) := string;
    else
      string
    end
  end
end method as;

define sealed sideways method as
    (class :: subclass(<locator>), string :: <string>)
 => (locator :: <locator>)
  let locator = element($string-to-locator-cache, string, default: #f);
  if (instance?(locator, class))
    locator
  else
    let locator = string-as-locator(class, string);
    if ($cache-locators?)
      element($string-to-locator-cache, string) := locator;
    else
      locator
    end
  end
end method as;

/// Locator conditions

define class <locator-error> (<format-string-condition>, <error>)
end class <locator-error>;

define function locator-error
    (format-string :: <string>, #rest format-arguments)
  error(make(<locator-error>, 
             format-string:    format-string,
             format-arguments: format-arguments))
end function locator-error;

/// Useful locator protocols

define open generic locator-test
    (locator :: <directory-locator>) => (test :: <function>);

define method locator-test
    (locator :: <directory-locator>) => (test :: <function>)
  \=
end method locator-test;

define open generic locator-might-have-links?
    (locator :: <directory-locator>) => (links? :: <boolean>);

define method locator-might-have-links?
    (locator :: <directory-locator>) => (links? :: singleton(#f))
  #f
end method locator-might-have-links?;

define method locator-relative?
    (locator :: <file-locator>) => (relative? :: <boolean>)
  let directory = locator.locator-directory;
  ~directory | directory.locator-relative?
end method locator-relative?;

define method current-directory-locator?
    (locator :: <directory-locator>) => (current-directory? :: <boolean>)
  locator.locator-relative?
    & locator.locator-path = #[#"self"]
end method current-directory-locator?;

define method locator-directory
    (locator :: <directory-locator>) => (parent :: false-or(<directory-locator>))
  let path = locator.locator-path;
  unless (empty?(path))
    make(object-class(locator),
         server:    locator.locator-server,
         path:      copy-sequence(path, end: path.size - 1),
         relative?: locator.locator-relative?)
  end
end method locator-directory;

/// Simplify locator

define open generic simplify-locator
    (locator :: <physical-locator>)
 => (simplified-locator :: <physical-locator>);

define method simplify-locator
    (locator :: <directory-locator>)
 => (simplified-locator :: <directory-locator>)
  let path = locator.locator-path;
  let relative? = locator.locator-relative?;
  let resolve-parent? = ~locator.locator-might-have-links?;
  let simplified-path
    = simplify-path(path, 
                    resolve-parent?: resolve-parent?,
                    relative?: relative?);
  if (path ~= simplified-path)
    make(object-class(locator),
         server:    locator.locator-server,
         path:      simplified-path,
         relative?: locator.locator-relative?)
  else
    locator
  end
end method simplify-locator;

define method simplify-locator
    (locator :: <file-locator>) => (simplified-locator :: <file-locator>)
  let directory = locator.locator-directory;
  let simplified-directory = directory & simplify-locator(directory);
  if (directory ~= simplified-directory)
    make(object-class(locator),
         directory: simplified-directory,
         base:      locator.locator-base,
         extension: locator.locator-extension)
  else
    locator
  end
end method simplify-locator;

/// Subdirectory locator

define open generic subdirectory-locator
    (locator :: <directory-locator>, #rest sub-path)
 => (subdirectory :: <directory-locator>);

define method subdirectory-locator
    (locator :: <directory-locator>, #rest sub-path)
 => (subdirectory :: <directory-locator>)
  let old-path = locator.locator-path;
  let new-path = concatenate-as(<simple-object-vector>, old-path, sub-path);
  make(object-class(locator),
       server:    locator.locator-server,
       path:      new-path,
       relative?: locator.locator-relative?)
end method subdirectory-locator;

/// Relative locator

define open generic relative-locator
    (locator :: <physical-locator>, from-locator :: <physical-locator>)
 => (relative-locator :: <physical-locator>);

define method relative-locator
    (locator :: <directory-locator>, from-locator :: <directory-locator>)
 => (relative-locator :: <directory-locator>)
  let path = locator.locator-path;
  let from-path = from-locator.locator-path;
  case
    ~locator.locator-relative? & from-locator.locator-relative? =>
      locator-error
        ("Cannot find relative path of absolute locator %= from relative locator %=",
         locator, from-locator);
    locator.locator-server ~= from-locator.locator-server =>
      locator;
    path = from-path =>
      make(object-class(locator),
           path: vector(#"self"),
           relative?: #t);
    otherwise =>
      make(object-class(locator),
           path: relative-path(path, from-path, test: locator.locator-test),
           relative?: #t);
  end
end method relative-locator;

define method relative-locator
    (locator :: <file-locator>, from-directory :: <directory-locator>)
 => (relative-locator :: <file-locator>)
  let directory = locator.locator-directory;
  let relative-directory = directory & relative-locator(directory, from-directory);
  if (relative-directory ~= directory)
    simplify-locator
      (make(object-class(locator),
            directory: relative-directory,
            base:      locator.locator-base,
            extension: locator.locator-extension))
  else
    locator
  end
end method relative-locator;

define method relative-locator
    (locator :: <physical-locator>, from-locator :: <file-locator>)
 => (relative-locator :: <physical-locator>)
  let from-directory = from-locator.locator-directory;
  case
    from-directory =>
      relative-locator(locator, from-directory);
    ~locator.locator-relative? =>
      locator-error
        ("Cannot find relative path of absolute locator %= from relative locator %=",
         locator, from-locator);
    otherwise =>
      locator;
  end
end method relative-locator;

/// Merge locators

define open generic merge-locators
    (locator :: <physical-locator>, from-locator :: <physical-locator>)
 => (merged-locator :: <physical-locator>);

/// Merge locators

define method merge-locators
    (locator :: <directory-locator>, from-locator :: <directory-locator>)
 => (merged-locator :: <directory-locator>)
  if (locator.locator-relative?)
    let path = concatenate(from-locator.locator-path, locator.locator-path);
    simplify-locator
      (make(object-class(locator),
            server:    from-locator.locator-server,
            path:      path,
            relative?: from-locator.locator-relative?))
  else
    locator
  end
end method merge-locators;

define method merge-locators
    (locator :: <file-locator>, from-locator :: <directory-locator>)
 => (merged-locator :: <file-locator>)
  let directory = locator.locator-directory;
  let merged-directory 
    = if (directory)
        merge-locators(directory, from-locator)
      else
        simplify-locator(from-locator)
      end;
  if (merged-directory ~= directory)
    make(object-class(locator),
         directory: merged-directory,
         base:      locator.locator-base,
         extension: locator.locator-extension)
  else
    locator
  end
end method merge-locators;

define method merge-locators
    (locator :: <physical-locator>, from-locator :: <file-locator>)
 => (merged-locator :: <physical-locator>)
  let from-directory = from-locator.locator-directory;
  if (from-directory)
    merge-locators(locator, from-directory)
  else
    locator
  end
end method merge-locators;

/// Locator protocols

define sideways method supports-open-locator?
    (locator :: <file-locator>) => (openable? :: <boolean>)
  ~locator.locator-relative?
end method supports-open-locator?;

define sideways method open-locator
    (locator :: <file-locator>, #rest keywords, #key, #all-keys)
 => (stream :: <stream>)
  apply(open-file-stream, locator, keywords)
end method open-locator;
</textarea></div>

    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        mode: "text/x-dylan",
        lineNumbers: true,
        matchBrackets: true,
        continueComments: "Enter",
        extraKeys: {"Ctrl-Q": "toggleComment"},
        tabMode: "indent",
        indentUnit: 2
      });
    </script>

    <p><strong>MIME types defined:</strong> <code>text/x-dylan</code>.</p>
</article>
codemirror/mode/dylan/test.js000064400000005262151215013500012257 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function() {
  var mode = CodeMirror.getMode({indentUnit: 2}, "dylan");
  function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); }

  MT('comments',
     '[comment // This is a line comment]',
     '[comment /* This is a block comment */]',
     '[comment /* This is a multi]',
     '[comment line comment]',
     '[comment */]',
     '[comment /* And this is a /*]',
     '[comment /* nested */ comment */]');

  MT('unary_operators',
     '[operator -][variable a]',
     '[operator -] [variable a]',
     '[operator ~][variable a]',
     '[operator ~] [variable a]');

  MT('binary_operators',
     '[variable a] [operator +] [variable b]',
     '[variable a] [operator -] [variable b]',
     '[variable a] [operator *] [variable b]',
     '[variable a] [operator /] [variable b]',
     '[variable a] [operator ^] [variable b]',
     '[variable a] [operator =] [variable b]',
     '[variable a] [operator ==] [variable b]',
     '[variable a] [operator ~=] [variable b]',
     '[variable a] [operator ~==] [variable b]',
     '[variable a] [operator <] [variable b]',
     '[variable a] [operator <=] [variable b]',
     '[variable a] [operator >] [variable b]',
     '[variable a] [operator >=] [variable b]',
     '[variable a] [operator &] [variable b]',
     '[variable a] [operator |] [variable b]',
     '[variable a] [operator :=] [variable b]');

  MT('integers',
     '[number 1]',
     '[number 123]',
     '[number -123]',
     '[number +456]',
     '[number #b010]',
     '[number #o073]',
     '[number #xabcDEF123]');

  MT('floats',
     '[number .3]',
     '[number -1.]',
     '[number -2.335]',
     '[number +3.78d1]',
     '[number 3.78s-1]',
     '[number -3.32e+5]');

  MT('characters_and_strings',
     "[string 'a']",
     "[string '\\\\'']",
     '[string ""]',
     '[string "a"]',
     '[string "abc def"]',
     '[string "More escaped characters: \\\\\\\\ \\\\a \\\\b \\\\e \\\\f \\\\n \\\\r \\\\t \\\\0 ..."]');

  MT('brackets',
     '[bracket #[[]]]',
     '[bracket #()]',
     '[bracket #(][number 1][bracket )]',
     '[bracket [[][number 1][punctuation ,] [number 3][bracket ]]]',
     '[bracket ()]',
     '[bracket {}]',
     '[keyword if] [bracket (][variable foo][bracket )]',
     '[bracket (][number 1][bracket )]',
     '[bracket [[][number 1][bracket ]]]');

  MT('hash_words',
     '[punctuation ##]',
     '[atom #f]', '[atom #F]',
     '[atom #t]', '[atom #T]',
     '[atom #all-keys]',
     '[atom #include]',
     '[atom #key]',
     '[atom #next]',
     '[atom #rest]',
     '[string #"foo"]',
     '[error #invalid]');
})();
codemirror/mode/dylan/dylan.js000064400000023256151215013500012412 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("dylan", function(_config) {
  // Words
  var words = {
    // Words that introduce unnamed definitions like "define interface"
    unnamedDefinition: ["interface"],

    // Words that introduce simple named definitions like "define library"
    namedDefinition: ["module", "library", "macro",
                      "C-struct", "C-union",
                      "C-function", "C-callable-wrapper"
                     ],

    // Words that introduce type definitions like "define class".
    // These are also parameterized like "define method" and are
    // appended to otherParameterizedDefinitionWords
    typeParameterizedDefinition: ["class", "C-subtype", "C-mapped-subtype"],

    // Words that introduce trickier definitions like "define method".
    // These require special definitions to be added to startExpressions
    otherParameterizedDefinition: ["method", "function",
                                   "C-variable", "C-address"
                                  ],

    // Words that introduce module constant definitions.
    // These must also be simple definitions and are
    // appended to otherSimpleDefinitionWords
    constantSimpleDefinition: ["constant"],

    // Words that introduce module variable definitions.
    // These must also be simple definitions and are
    // appended to otherSimpleDefinitionWords
    variableSimpleDefinition: ["variable"],

    // Other words that introduce simple definitions
    // (without implicit bodies).
    otherSimpleDefinition: ["generic", "domain",
                            "C-pointer-type",
                            "table"
                           ],

    // Words that begin statements with implicit bodies.
    statement: ["if", "block", "begin", "method", "case",
                "for", "select", "when", "unless", "until",
                "while", "iterate", "profiling", "dynamic-bind"
               ],

    // Patterns that act as separators in compound statements.
    // This may include any general pattern that must be indented
    // specially.
    separator: ["finally", "exception", "cleanup", "else",
                "elseif", "afterwards"
               ],

    // Keywords that do not require special indentation handling,
    // but which should be highlighted
    other: ["above", "below", "by", "from", "handler", "in",
            "instance", "let", "local", "otherwise", "slot",
            "subclass", "then", "to", "keyed-by", "virtual"
           ],

    // Condition signaling function calls
    signalingCalls: ["signal", "error", "cerror",
                     "break", "check-type", "abort"
                    ]
  };

  words["otherDefinition"] =
    words["unnamedDefinition"]
    .concat(words["namedDefinition"])
    .concat(words["otherParameterizedDefinition"]);

  words["definition"] =
    words["typeParameterizedDefinition"]
    .concat(words["otherDefinition"]);

  words["parameterizedDefinition"] =
    words["typeParameterizedDefinition"]
    .concat(words["otherParameterizedDefinition"]);

  words["simpleDefinition"] =
    words["constantSimpleDefinition"]
    .concat(words["variableSimpleDefinition"])
    .concat(words["otherSimpleDefinition"]);

  words["keyword"] =
    words["statement"]
    .concat(words["separator"])
    .concat(words["other"]);

  // Patterns
  var symbolPattern = "[-_a-zA-Z?!*@<>$%]+";
  var symbol = new RegExp("^" + symbolPattern);
  var patterns = {
    // Symbols with special syntax
    symbolKeyword: symbolPattern + ":",
    symbolClass: "<" + symbolPattern + ">",
    symbolGlobal: "\\*" + symbolPattern + "\\*",
    symbolConstant: "\\$" + symbolPattern
  };
  var patternStyles = {
    symbolKeyword: "atom",
    symbolClass: "tag",
    symbolGlobal: "variable-2",
    symbolConstant: "variable-3"
  };

  // Compile all patterns to regular expressions
  for (var patternName in patterns)
    if (patterns.hasOwnProperty(patternName))
      patterns[patternName] = new RegExp("^" + patterns[patternName]);

  // Names beginning "with-" and "without-" are commonly
  // used as statement macro
  patterns["keyword"] = [/^with(?:out)?-[-_a-zA-Z?!*@<>$%]+/];

  var styles = {};
  styles["keyword"] = "keyword";
  styles["definition"] = "def";
  styles["simpleDefinition"] = "def";
  styles["signalingCalls"] = "builtin";

  // protected words lookup table
  var wordLookup = {};
  var styleLookup = {};

  [
    "keyword",
    "definition",
    "simpleDefinition",
    "signalingCalls"
  ].forEach(function(type) {
    words[type].forEach(function(word) {
      wordLookup[word] = type;
      styleLookup[word] = styles[type];
    });
  });


  function chain(stream, state, f) {
    state.tokenize = f;
    return f(stream, state);
  }

  function tokenBase(stream, state) {
    // String
    var ch = stream.peek();
    if (ch == "'" || ch == '"') {
      stream.next();
      return chain(stream, state, tokenString(ch, "string"));
    }
    // Comment
    else if (ch == "/") {
      stream.next();
      if (stream.eat("*")) {
        return chain(stream, state, tokenComment);
      } else if (stream.eat("/")) {
        stream.skipToEnd();
        return "comment";
      }
      stream.backUp(1);
    }
    // Decimal
    else if (/[+\-\d\.]/.test(ch)) {
      if (stream.match(/^[+-]?[0-9]*\.[0-9]*([esdx][+-]?[0-9]+)?/i) ||
          stream.match(/^[+-]?[0-9]+([esdx][+-]?[0-9]+)/i) ||
          stream.match(/^[+-]?\d+/)) {
        return "number";
      }
    }
    // Hash
    else if (ch == "#") {
      stream.next();
      // Symbol with string syntax
      ch = stream.peek();
      if (ch == '"') {
        stream.next();
        return chain(stream, state, tokenString('"', "string"));
      }
      // Binary number
      else if (ch == "b") {
        stream.next();
        stream.eatWhile(/[01]/);
        return "number";
      }
      // Hex number
      else if (ch == "x") {
        stream.next();
        stream.eatWhile(/[\da-f]/i);
        return "number";
      }
      // Octal number
      else if (ch == "o") {
        stream.next();
        stream.eatWhile(/[0-7]/);
        return "number";
      }
      // Token concatenation in macros
      else if (ch == '#') {
        stream.next();
        return "punctuation";
      }
      // Sequence literals
      else if ((ch == '[') || (ch == '(')) {
        stream.next();
        return "bracket";
      // Hash symbol
      } else if (stream.match(/f|t|all-keys|include|key|next|rest/i)) {
        return "atom";
      } else {
        stream.eatWhile(/[-a-zA-Z]/);
        return "error";
      }
    } else if (ch == "~") {
      stream.next();
      ch = stream.peek();
      if (ch == "=") {
        stream.next();
        ch = stream.peek();
        if (ch == "=") {
          stream.next();
          return "operator";
        }
        return "operator";
      }
      return "operator";
    } else if (ch == ":") {
      stream.next();
      ch = stream.peek();
      if (ch == "=") {
        stream.next();
        return "operator";
      } else if (ch == ":") {
        stream.next();
        return "punctuation";
      }
    } else if ("[](){}".indexOf(ch) != -1) {
      stream.next();
      return "bracket";
    } else if (".,".indexOf(ch) != -1) {
      stream.next();
      return "punctuation";
    } else if (stream.match("end")) {
      return "keyword";
    }
    for (var name in patterns) {
      if (patterns.hasOwnProperty(name)) {
        var pattern = patterns[name];
        if ((pattern instanceof Array && pattern.some(function(p) {
          return stream.match(p);
        })) || stream.match(pattern))
          return patternStyles[name];
      }
    }
    if (/[+\-*\/^=<>&|]/.test(ch)) {
      stream.next();
      return "operator";
    }
    if (stream.match("define")) {
      return "def";
    } else {
      stream.eatWhile(/[\w\-]/);
      // Keyword
      if (wordLookup[stream.current()]) {
        return styleLookup[stream.current()];
      } else if (stream.current().match(symbol)) {
        return "variable";
      } else {
        stream.next();
        return "variable-2";
      }
    }
  }

  function tokenComment(stream, state) {
    var maybeEnd = false, maybeNested = false, nestedCount = 0, ch;
    while ((ch = stream.next())) {
      if (ch == "/" && maybeEnd) {
        if (nestedCount > 0) {
          nestedCount--;
        } else {
          state.tokenize = tokenBase;
          break;
        }
      } else if (ch == "*" && maybeNested) {
        nestedCount++;
      }
      maybeEnd = (ch == "*");
      maybeNested = (ch == "/");
    }
    return "comment";
  }

  function tokenString(quote, style) {
    return function(stream, state) {
      var escaped = false, next, end = false;
      while ((next = stream.next()) != null) {
        if (next == quote && !escaped) {
          end = true;
          break;
        }
        escaped = !escaped && next == "\\";
      }
      if (end || !escaped) {
        state.tokenize = tokenBase;
      }
      return style;
    };
  }

  // Interface
  return {
    startState: function() {
      return {
        tokenize: tokenBase,
        currentIndent: 0
      };
    },
    token: function(stream, state) {
      if (stream.eatSpace())
        return null;
      var style = state.tokenize(stream, state);
      return style;
    },
    blockCommentStart: "/*",
    blockCommentEnd: "*/"
  };
});

CodeMirror.defineMIME("text/x-dylan", "dylan");

});
codemirror/mode/cobol/cobol.js000064400000024060151215013500012362 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

/**
 * Author: Gautam Mehta
 * Branched from CodeMirror's Scheme mode
 */
(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("cobol", function () {
  var BUILTIN = "builtin", COMMENT = "comment", STRING = "string",
      ATOM = "atom", NUMBER = "number", KEYWORD = "keyword", MODTAG = "header",
      COBOLLINENUM = "def", PERIOD = "link";
  function makeKeywords(str) {
    var obj = {}, words = str.split(" ");
    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
    return obj;
  }
  var atoms = makeKeywords("TRUE FALSE ZEROES ZEROS ZERO SPACES SPACE LOW-VALUE LOW-VALUES ");
  var keywords = makeKeywords(
      "ACCEPT ACCESS ACQUIRE ADD ADDRESS " +
      "ADVANCING AFTER ALIAS ALL ALPHABET " +
      "ALPHABETIC ALPHABETIC-LOWER ALPHABETIC-UPPER ALPHANUMERIC ALPHANUMERIC-EDITED " +
      "ALSO ALTER ALTERNATE AND ANY " +
      "ARE AREA AREAS ARITHMETIC ASCENDING " +
      "ASSIGN AT ATTRIBUTE AUTHOR AUTO " +
      "AUTO-SKIP AUTOMATIC B-AND B-EXOR B-LESS " +
      "B-NOT B-OR BACKGROUND-COLOR BACKGROUND-COLOUR BEEP " +
      "BEFORE BELL BINARY BIT BITS " +
      "BLANK BLINK BLOCK BOOLEAN BOTTOM " +
      "BY CALL CANCEL CD CF " +
      "CH CHARACTER CHARACTERS CLASS CLOCK-UNITS " +
      "CLOSE COBOL CODE CODE-SET COL " +
      "COLLATING COLUMN COMMA COMMIT COMMITMENT " +
      "COMMON COMMUNICATION COMP COMP-0 COMP-1 " +
      "COMP-2 COMP-3 COMP-4 COMP-5 COMP-6 " +
      "COMP-7 COMP-8 COMP-9 COMPUTATIONAL COMPUTATIONAL-0 " +
      "COMPUTATIONAL-1 COMPUTATIONAL-2 COMPUTATIONAL-3 COMPUTATIONAL-4 COMPUTATIONAL-5 " +
      "COMPUTATIONAL-6 COMPUTATIONAL-7 COMPUTATIONAL-8 COMPUTATIONAL-9 COMPUTE " +
      "CONFIGURATION CONNECT CONSOLE CONTAINED CONTAINS " +
      "CONTENT CONTINUE CONTROL CONTROL-AREA CONTROLS " +
      "CONVERTING COPY CORR CORRESPONDING COUNT " +
      "CRT CRT-UNDER CURRENCY CURRENT CURSOR " +
      "DATA DATE DATE-COMPILED DATE-WRITTEN DAY " +
      "DAY-OF-WEEK DB DB-ACCESS-CONTROL-KEY DB-DATA-NAME DB-EXCEPTION " +
      "DB-FORMAT-NAME DB-RECORD-NAME DB-SET-NAME DB-STATUS DBCS " +
      "DBCS-EDITED DE DEBUG-CONTENTS DEBUG-ITEM DEBUG-LINE " +
      "DEBUG-NAME DEBUG-SUB-1 DEBUG-SUB-2 DEBUG-SUB-3 DEBUGGING " +
      "DECIMAL-POINT DECLARATIVES DEFAULT DELETE DELIMITED " +
      "DELIMITER DEPENDING DESCENDING DESCRIBED DESTINATION " +
      "DETAIL DISABLE DISCONNECT DISPLAY DISPLAY-1 " +
      "DISPLAY-2 DISPLAY-3 DISPLAY-4 DISPLAY-5 DISPLAY-6 " +
      "DISPLAY-7 DISPLAY-8 DISPLAY-9 DIVIDE DIVISION " +
      "DOWN DROP DUPLICATE DUPLICATES DYNAMIC " +
      "EBCDIC EGI EJECT ELSE EMI " +
      "EMPTY EMPTY-CHECK ENABLE END END. END-ACCEPT END-ACCEPT. " +
      "END-ADD END-CALL END-COMPUTE END-DELETE END-DISPLAY " +
      "END-DIVIDE END-EVALUATE END-IF END-INVOKE END-MULTIPLY " +
      "END-OF-PAGE END-PERFORM END-READ END-RECEIVE END-RETURN " +
      "END-REWRITE END-SEARCH END-START END-STRING END-SUBTRACT " +
      "END-UNSTRING END-WRITE END-XML ENTER ENTRY " +
      "ENVIRONMENT EOP EQUAL EQUALS ERASE " +
      "ERROR ESI EVALUATE EVERY EXCEEDS " +
      "EXCEPTION EXCLUSIVE EXIT EXTEND EXTERNAL " +
      "EXTERNALLY-DESCRIBED-KEY FD FETCH FILE FILE-CONTROL " +
      "FILE-STREAM FILES FILLER FINAL FIND " +
      "FINISH FIRST FOOTING FOR FOREGROUND-COLOR " +
      "FOREGROUND-COLOUR FORMAT FREE FROM FULL " +
      "FUNCTION GENERATE GET GIVING GLOBAL " +
      "GO GOBACK GREATER GROUP HEADING " +
      "HIGH-VALUE HIGH-VALUES HIGHLIGHT I-O I-O-CONTROL " +
      "ID IDENTIFICATION IF IN INDEX " +
      "INDEX-1 INDEX-2 INDEX-3 INDEX-4 INDEX-5 " +
      "INDEX-6 INDEX-7 INDEX-8 INDEX-9 INDEXED " +
      "INDIC INDICATE INDICATOR INDICATORS INITIAL " +
      "INITIALIZE INITIATE INPUT INPUT-OUTPUT INSPECT " +
      "INSTALLATION INTO INVALID INVOKE IS " +
      "JUST JUSTIFIED KANJI KEEP KEY " +
      "LABEL LAST LD LEADING LEFT " +
      "LEFT-JUSTIFY LENGTH LENGTH-CHECK LESS LIBRARY " +
      "LIKE LIMIT LIMITS LINAGE LINAGE-COUNTER " +
      "LINE LINE-COUNTER LINES LINKAGE LOCAL-STORAGE " +
      "LOCALE LOCALLY LOCK " +
      "MEMBER MEMORY MERGE MESSAGE METACLASS " +
      "MODE MODIFIED MODIFY MODULES MOVE " +
      "MULTIPLE MULTIPLY NATIONAL NATIVE NEGATIVE " +
      "NEXT NO NO-ECHO NONE NOT " +
      "NULL NULL-KEY-MAP NULL-MAP NULLS NUMBER " +
      "NUMERIC NUMERIC-EDITED OBJECT OBJECT-COMPUTER OCCURS " +
      "OF OFF OMITTED ON ONLY " +
      "OPEN OPTIONAL OR ORDER ORGANIZATION " +
      "OTHER OUTPUT OVERFLOW OWNER PACKED-DECIMAL " +
      "PADDING PAGE PAGE-COUNTER PARSE PERFORM " +
      "PF PH PIC PICTURE PLUS " +
      "POINTER POSITION POSITIVE PREFIX PRESENT " +
      "PRINTING PRIOR PROCEDURE PROCEDURE-POINTER PROCEDURES " +
      "PROCEED PROCESS PROCESSING PROGRAM PROGRAM-ID " +
      "PROMPT PROTECTED PURGE QUEUE QUOTE " +
      "QUOTES RANDOM RD READ READY " +
      "REALM RECEIVE RECONNECT RECORD RECORD-NAME " +
      "RECORDS RECURSIVE REDEFINES REEL REFERENCE " +
      "REFERENCE-MONITOR REFERENCES RELATION RELATIVE RELEASE " +
      "REMAINDER REMOVAL RENAMES REPEATED REPLACE " +
      "REPLACING REPORT REPORTING REPORTS REPOSITORY " +
      "REQUIRED RERUN RESERVE RESET RETAINING " +
      "RETRIEVAL RETURN RETURN-CODE RETURNING REVERSE-VIDEO " +
      "REVERSED REWIND REWRITE RF RH " +
      "RIGHT RIGHT-JUSTIFY ROLLBACK ROLLING ROUNDED " +
      "RUN SAME SCREEN SD SEARCH " +
      "SECTION SECURE SECURITY SEGMENT SEGMENT-LIMIT " +
      "SELECT SEND SENTENCE SEPARATE SEQUENCE " +
      "SEQUENTIAL SET SHARED SIGN SIZE " +
      "SKIP1 SKIP2 SKIP3 SORT SORT-MERGE " +
      "SORT-RETURN SOURCE SOURCE-COMPUTER SPACE-FILL " +
      "SPECIAL-NAMES STANDARD STANDARD-1 STANDARD-2 " +
      "START STARTING STATUS STOP STORE " +
      "STRING SUB-QUEUE-1 SUB-QUEUE-2 SUB-QUEUE-3 SUB-SCHEMA " +
      "SUBFILE SUBSTITUTE SUBTRACT SUM SUPPRESS " +
      "SYMBOLIC SYNC SYNCHRONIZED SYSIN SYSOUT " +
      "TABLE TALLYING TAPE TENANT TERMINAL " +
      "TERMINATE TEST TEXT THAN THEN " +
      "THROUGH THRU TIME TIMES TITLE " +
      "TO TOP TRAILING TRAILING-SIGN TRANSACTION " +
      "TYPE TYPEDEF UNDERLINE UNEQUAL UNIT " +
      "UNSTRING UNTIL UP UPDATE UPON " +
      "USAGE USAGE-MODE USE USING VALID " +
      "VALIDATE VALUE VALUES VARYING VLR " +
      "WAIT WHEN WHEN-COMPILED WITH WITHIN " +
      "WORDS WORKING-STORAGE WRITE XML XML-CODE " +
      "XML-EVENT XML-NTEXT XML-TEXT ZERO ZERO-FILL " );

  var builtins = makeKeywords("- * ** / + < <= = > >= ");
  var tests = {
    digit: /\d/,
    digit_or_colon: /[\d:]/,
    hex: /[0-9a-f]/i,
    sign: /[+-]/,
    exponent: /e/i,
    keyword_char: /[^\s\(\[\;\)\]]/,
    symbol: /[\w*+\-]/
  };
  function isNumber(ch, stream){
    // hex
    if ( ch === '0' && stream.eat(/x/i) ) {
      stream.eatWhile(tests.hex);
      return true;
    }
    // leading sign
    if ( ( ch == '+' || ch == '-' ) && ( tests.digit.test(stream.peek()) ) ) {
      stream.eat(tests.sign);
      ch = stream.next();
    }
    if ( tests.digit.test(ch) ) {
      stream.eat(ch);
      stream.eatWhile(tests.digit);
      if ( '.' == stream.peek()) {
        stream.eat('.');
        stream.eatWhile(tests.digit);
      }
      if ( stream.eat(tests.exponent) ) {
        stream.eat(tests.sign);
        stream.eatWhile(tests.digit);
      }
      return true;
    }
    return false;
  }
  return {
    startState: function () {
      return {
        indentStack: null,
        indentation: 0,
        mode: false
      };
    },
    token: function (stream, state) {
      if (state.indentStack == null && stream.sol()) {
        // update indentation, but only if indentStack is empty
        state.indentation = 6 ; //stream.indentation();
      }
      // skip spaces
      if (stream.eatSpace()) {
        return null;
      }
      var returnType = null;
      switch(state.mode){
      case "string": // multi-line string parsing mode
        var next = false;
        while ((next = stream.next()) != null) {
          if (next == "\"" || next == "\'") {
            state.mode = false;
            break;
          }
        }
        returnType = STRING; // continue on in string mode
        break;
      default: // default parsing mode
        var ch = stream.next();
        var col = stream.column();
        if (col >= 0 && col <= 5) {
          returnType = COBOLLINENUM;
        } else if (col >= 72 && col <= 79) {
          stream.skipToEnd();
          returnType = MODTAG;
        } else if (ch == "*" && col == 6) { // comment
          stream.skipToEnd(); // rest of the line is a comment
          returnType = COMMENT;
        } else if (ch == "\"" || ch == "\'") {
          state.mode = "string";
          returnType = STRING;
        } else if (ch == "'" && !( tests.digit_or_colon.test(stream.peek()) )) {
          returnType = ATOM;
        } else if (ch == ".") {
          returnType = PERIOD;
        } else if (isNumber(ch,stream)){
          returnType = NUMBER;
        } else {
          if (stream.current().match(tests.symbol)) {
            while (col < 71) {
              if (stream.eat(tests.symbol) === undefined) {
                break;
              } else {
                col++;
              }
            }
          }
          if (keywords && keywords.propertyIsEnumerable(stream.current().toUpperCase())) {
            returnType = KEYWORD;
          } else if (builtins && builtins.propertyIsEnumerable(stream.current().toUpperCase())) {
            returnType = BUILTIN;
          } else if (atoms && atoms.propertyIsEnumerable(stream.current().toUpperCase())) {
            returnType = ATOM;
          } else returnType = null;
        }
      }
      return returnType;
    },
    indent: function (state) {
      if (state.indentStack == null) return state.indentation;
      return state.indentStack.indent;
    }
  };
});

CodeMirror.defineMIME("text/x-cobol", "cobol");

});
codemirror/mode/cobol/index.html000064400000017624151215013500012733 0ustar00<!doctype html>

<title>CodeMirror: COBOL mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<link rel="stylesheet" href="../../theme/neat.css">
<link rel="stylesheet" href="../../theme/elegant.css">
<link rel="stylesheet" href="../../theme/erlang-dark.css">
<link rel="stylesheet" href="../../theme/night.css">
<link rel="stylesheet" href="../../theme/monokai.css">
<link rel="stylesheet" href="../../theme/cobalt.css">
<link rel="stylesheet" href="../../theme/eclipse.css">
<link rel="stylesheet" href="../../theme/rubyblue.css">
<link rel="stylesheet" href="../../theme/lesser-dark.css">
<link rel="stylesheet" href="../../theme/xq-dark.css">
<link rel="stylesheet" href="../../theme/xq-light.css">
<link rel="stylesheet" href="../../theme/ambiance.css">
<link rel="stylesheet" href="../../theme/blackboard.css">
<link rel="stylesheet" href="../../theme/vibrant-ink.css">
<link rel="stylesheet" href="../../theme/solarized.css">
<link rel="stylesheet" href="../../theme/twilight.css">
<link rel="stylesheet" href="../../theme/midnight.css">
<link rel="stylesheet" href="../../addon/dialog/dialog.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="cobol.js"></script>
<script src="../../addon/selection/active-line.js"></script>
<script src="../../addon/search/search.js"></script>
<script src="../../addon/dialog/dialog.js"></script>
<script src="../../addon/search/searchcursor.js"></script>
<style>
        .CodeMirror {
          border: 1px solid #eee;
          font-size : 20px;
          height : auto !important;
        }
        .CodeMirror-activeline-background {background: #555555 !important;}
    </style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">COBOL</a>
  </ul>
</div>

<article>
<h2>COBOL mode</h2>

    <p> Select Theme <select onchange="selectTheme()" id="selectTheme">
        <option>default</option>
        <option>ambiance</option>
        <option>blackboard</option>
        <option>cobalt</option>
        <option>eclipse</option>
        <option>elegant</option>
        <option>erlang-dark</option>
        <option>lesser-dark</option>
        <option>midnight</option>
        <option>monokai</option>
        <option>neat</option>
        <option>night</option>
        <option>rubyblue</option>
        <option>solarized dark</option>
        <option>solarized light</option>
        <option selected>twilight</option>
        <option>vibrant-ink</option>
        <option>xq-dark</option>
        <option>xq-light</option>
    </select>    Select Font Size <select onchange="selectFontsize()" id="selectFontSize">
          <option value="13px">13px</option>
          <option value="14px">14px</option>
          <option value="16px">16px</option>
          <option value="18px">18px</option>
          <option value="20px" selected="selected">20px</option>
          <option value="24px">24px</option>
          <option value="26px">26px</option>
          <option value="28px">28px</option>
          <option value="30px">30px</option>
          <option value="32px">32px</option>
          <option value="34px">34px</option>
          <option value="36px">36px</option>
        </select>
<label for="checkBoxReadOnly">Read-only</label>
<input type="checkbox" id="checkBoxReadOnly" onchange="selectReadOnly()">
<label for="id_tabToIndentSpace">Insert Spaces on Tab</label>
<input type="checkbox" id="id_tabToIndentSpace" onchange="tabToIndentSpace()">
</p>
<textarea id="code" name="code">
---------1---------2---------3---------4---------5---------6---------7---------8
12345678911234567892123456789312345678941234567895123456789612345678971234567898
000010 IDENTIFICATION DIVISION.                                        MODTGHERE
000020 PROGRAM-ID.       SAMPLE.
000030 AUTHOR.           TEST SAM. 
000040 DATE-WRITTEN.     5 February 2013
000041
000042* A sample program just to show the form.
000043* The program copies its input to the output,
000044* and counts the number of records.
000045* At the end this number is printed.
000046
000050 ENVIRONMENT DIVISION.
000060 INPUT-OUTPUT SECTION.
000070 FILE-CONTROL.
000080     SELECT STUDENT-FILE     ASSIGN TO SYSIN
000090         ORGANIZATION IS LINE SEQUENTIAL.
000100     SELECT PRINT-FILE       ASSIGN TO SYSOUT
000110         ORGANIZATION IS LINE SEQUENTIAL.
000120
000130 DATA DIVISION.
000140 FILE SECTION.
000150 FD  STUDENT-FILE
000160     RECORD CONTAINS 43 CHARACTERS
000170     DATA RECORD IS STUDENT-IN.
000180 01  STUDENT-IN              PIC X(43).
000190
000200 FD  PRINT-FILE
000210     RECORD CONTAINS 80 CHARACTERS
000220     DATA RECORD IS PRINT-LINE.
000230 01  PRINT-LINE              PIC X(80).
000240
000250 WORKING-STORAGE SECTION.
000260 01  DATA-REMAINS-SWITCH     PIC X(2)      VALUE SPACES.
000261 01  RECORDS-WRITTEN         PIC 99.
000270
000280 01  DETAIL-LINE.
000290     05  FILLER              PIC X(7)      VALUE SPACES.
000300     05  RECORD-IMAGE        PIC X(43).
000310     05  FILLER              PIC X(30)     VALUE SPACES.
000311 
000312 01  SUMMARY-LINE.
000313     05  FILLER              PIC X(7)      VALUE SPACES.
000314     05  TOTAL-READ          PIC 99.
000315     05  FILLER              PIC X         VALUE SPACE.
000316     05  FILLER              PIC X(17)     
000317                 VALUE  'Records were read'.
000318     05  FILLER              PIC X(53)     VALUE SPACES.
000319
000320 PROCEDURE DIVISION.
000321
000330 PREPARE-SENIOR-REPORT.
000340     OPEN INPUT  STUDENT-FILE
000350          OUTPUT PRINT-FILE.
000351     MOVE ZERO TO RECORDS-WRITTEN.
000360     READ STUDENT-FILE
000370         AT END MOVE 'NO' TO DATA-REMAINS-SWITCH
000380     END-READ.
000390     PERFORM PROCESS-RECORDS
000410         UNTIL DATA-REMAINS-SWITCH = 'NO'.
000411     PERFORM PRINT-SUMMARY.
000420     CLOSE STUDENT-FILE
000430           PRINT-FILE.
000440     STOP RUN.
000450
000460 PROCESS-RECORDS.
000470     MOVE STUDENT-IN TO RECORD-IMAGE.
000480     MOVE DETAIL-LINE TO PRINT-LINE.
000490     WRITE PRINT-LINE.
000500     ADD 1 TO RECORDS-WRITTEN.
000510     READ STUDENT-FILE
000520         AT END MOVE 'NO' TO DATA-REMAINS-SWITCH
000530     END-READ. 
000540
000550 PRINT-SUMMARY.
000560     MOVE RECORDS-WRITTEN TO TOTAL-READ.
000570     MOVE SUMMARY-LINE TO PRINT-LINE.
000571     WRITE PRINT-LINE. 
000572
000580
</textarea>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        lineNumbers: true,
        matchBrackets: true,
        mode: "text/x-cobol",
        theme : "twilight",
        styleActiveLine: true,
        showCursorWhenSelecting : true,  
      });
      function selectTheme() {
        var themeInput = document.getElementById("selectTheme");
        var theme = themeInput.options[themeInput.selectedIndex].innerHTML;
        editor.setOption("theme", theme);
      }
      function selectFontsize() {
        var fontSizeInput = document.getElementById("selectFontSize");
        var fontSize = fontSizeInput.options[fontSizeInput.selectedIndex].innerHTML;
        editor.getWrapperElement().style.fontSize = fontSize;
        editor.refresh();
      }
      function selectReadOnly() {
        editor.setOption("readOnly", document.getElementById("checkBoxReadOnly").checked);
      }
      function tabToIndentSpace() {
        if (document.getElementById("id_tabToIndentSpace").checked) {
            editor.setOption("extraKeys", {Tab: function(cm) { cm.replaceSelection("    ", "end"); }});
        } else {
            editor.setOption("extraKeys", {Tab: function(cm) { cm.replaceSelection("    ", "end"); }});
        }
      }
    </script>
  </article>
codemirror/mode/verilog/verilog.js000064400000045414151215013500013312 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("verilog", function(config, parserConfig) {

  var indentUnit = config.indentUnit,
      statementIndentUnit = parserConfig.statementIndentUnit || indentUnit,
      dontAlignCalls = parserConfig.dontAlignCalls,
      noIndentKeywords = parserConfig.noIndentKeywords || [],
      multiLineStrings = parserConfig.multiLineStrings,
      hooks = parserConfig.hooks || {};

  function words(str) {
    var obj = {}, words = str.split(" ");
    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
    return obj;
  }

  /**
   * Keywords from IEEE 1800-2012
   */
  var keywords = words(
    "accept_on alias always always_comb always_ff always_latch and assert assign assume automatic before begin bind " +
    "bins binsof bit break buf bufif0 bufif1 byte case casex casez cell chandle checker class clocking cmos config " +
    "const constraint context continue cover covergroup coverpoint cross deassign default defparam design disable " +
    "dist do edge else end endcase endchecker endclass endclocking endconfig endfunction endgenerate endgroup " +
    "endinterface endmodule endpackage endprimitive endprogram endproperty endspecify endsequence endtable endtask " +
    "enum event eventually expect export extends extern final first_match for force foreach forever fork forkjoin " +
    "function generate genvar global highz0 highz1 if iff ifnone ignore_bins illegal_bins implements implies import " +
    "incdir include initial inout input inside instance int integer interconnect interface intersect join join_any " +
    "join_none large let liblist library local localparam logic longint macromodule matches medium modport module " +
    "nand negedge nettype new nexttime nmos nor noshowcancelled not notif0 notif1 null or output package packed " +
    "parameter pmos posedge primitive priority program property protected pull0 pull1 pulldown pullup " +
    "pulsestyle_ondetect pulsestyle_onevent pure rand randc randcase randsequence rcmos real realtime ref reg " +
    "reject_on release repeat restrict return rnmos rpmos rtran rtranif0 rtranif1 s_always s_eventually s_nexttime " +
    "s_until s_until_with scalared sequence shortint shortreal showcancelled signed small soft solve specify " +
    "specparam static string strong strong0 strong1 struct super supply0 supply1 sync_accept_on sync_reject_on " +
    "table tagged task this throughout time timeprecision timeunit tran tranif0 tranif1 tri tri0 tri1 triand trior " +
    "trireg type typedef union unique unique0 unsigned until until_with untyped use uwire var vectored virtual void " +
    "wait wait_order wand weak weak0 weak1 while wildcard wire with within wor xnor xor");

  /** Operators from IEEE 1800-2012
     unary_operator ::=
       + | - | ! | ~ | & | ~& | | | ~| | ^ | ~^ | ^~
     binary_operator ::=
       + | - | * | / | % | == | != | === | !== | ==? | !=? | && | || | **
       | < | <= | > | >= | & | | | ^ | ^~ | ~^ | >> | << | >>> | <<<
       | -> | <->
     inc_or_dec_operator ::= ++ | --
     unary_module_path_operator ::=
       ! | ~ | & | ~& | | | ~| | ^ | ~^ | ^~
     binary_module_path_operator ::=
       == | != | && | || | & | | | ^ | ^~ | ~^
  */
  var isOperatorChar = /[\+\-\*\/!~&|^%=?:]/;
  var isBracketChar = /[\[\]{}()]/;

  var unsignedNumber = /\d[0-9_]*/;
  var decimalLiteral = /\d*\s*'s?d\s*\d[0-9_]*/i;
  var binaryLiteral = /\d*\s*'s?b\s*[xz01][xz01_]*/i;
  var octLiteral = /\d*\s*'s?o\s*[xz0-7][xz0-7_]*/i;
  var hexLiteral = /\d*\s*'s?h\s*[0-9a-fxz?][0-9a-fxz?_]*/i;
  var realLiteral = /(\d[\d_]*(\.\d[\d_]*)?E-?[\d_]+)|(\d[\d_]*\.\d[\d_]*)/i;

  var closingBracketOrWord = /^((\w+)|[)}\]])/;
  var closingBracket = /[)}\]]/;

  var curPunc;
  var curKeyword;

  // Block openings which are closed by a matching keyword in the form of ("end" + keyword)
  // E.g. "task" => "endtask"
  var blockKeywords = words(
    "case checker class clocking config function generate interface module package" +
    "primitive program property specify sequence table task"
  );

  // Opening/closing pairs
  var openClose = {};
  for (var keyword in blockKeywords) {
    openClose[keyword] = "end" + keyword;
  }
  openClose["begin"] = "end";
  openClose["casex"] = "endcase";
  openClose["casez"] = "endcase";
  openClose["do"   ] = "while";
  openClose["fork" ] = "join;join_any;join_none";
  openClose["covergroup"] = "endgroup";

  for (var i in noIndentKeywords) {
    var keyword = noIndentKeywords[i];
    if (openClose[keyword]) {
      openClose[keyword] = undefined;
    }
  }

  // Keywords which open statements that are ended with a semi-colon
  var statementKeywords = words("always always_comb always_ff always_latch assert assign assume else export for foreach forever if import initial repeat while");

  function tokenBase(stream, state) {
    var ch = stream.peek(), style;
    if (hooks[ch] && (style = hooks[ch](stream, state)) != false) return style;
    if (hooks.tokenBase && (style = hooks.tokenBase(stream, state)) != false)
      return style;

    if (/[,;:\.]/.test(ch)) {
      curPunc = stream.next();
      return null;
    }
    if (isBracketChar.test(ch)) {
      curPunc = stream.next();
      return "bracket";
    }
    // Macros (tick-defines)
    if (ch == '`') {
      stream.next();
      if (stream.eatWhile(/[\w\$_]/)) {
        return "def";
      } else {
        return null;
      }
    }
    // System calls
    if (ch == '$') {
      stream.next();
      if (stream.eatWhile(/[\w\$_]/)) {
        return "meta";
      } else {
        return null;
      }
    }
    // Time literals
    if (ch == '#') {
      stream.next();
      stream.eatWhile(/[\d_.]/);
      return "def";
    }
    // Strings
    if (ch == '"') {
      stream.next();
      state.tokenize = tokenString(ch);
      return state.tokenize(stream, state);
    }
    // Comments
    if (ch == "/") {
      stream.next();
      if (stream.eat("*")) {
        state.tokenize = tokenComment;
        return tokenComment(stream, state);
      }
      if (stream.eat("/")) {
        stream.skipToEnd();
        return "comment";
      }
      stream.backUp(1);
    }

    // Numeric literals
    if (stream.match(realLiteral) ||
        stream.match(decimalLiteral) ||
        stream.match(binaryLiteral) ||
        stream.match(octLiteral) ||
        stream.match(hexLiteral) ||
        stream.match(unsignedNumber) ||
        stream.match(realLiteral)) {
      return "number";
    }

    // Operators
    if (stream.eatWhile(isOperatorChar)) {
      return "meta";
    }

    // Keywords / plain variables
    if (stream.eatWhile(/[\w\$_]/)) {
      var cur = stream.current();
      if (keywords[cur]) {
        if (openClose[cur]) {
          curPunc = "newblock";
        }
        if (statementKeywords[cur]) {
          curPunc = "newstatement";
        }
        curKeyword = cur;
        return "keyword";
      }
      return "variable";
    }

    stream.next();
    return null;
  }

  function tokenString(quote) {
    return function(stream, state) {
      var escaped = false, next, end = false;
      while ((next = stream.next()) != null) {
        if (next == quote && !escaped) {end = true; break;}
        escaped = !escaped && next == "\\";
      }
      if (end || !(escaped || multiLineStrings))
        state.tokenize = tokenBase;
      return "string";
    };
  }

  function tokenComment(stream, state) {
    var maybeEnd = false, ch;
    while (ch = stream.next()) {
      if (ch == "/" && maybeEnd) {
        state.tokenize = tokenBase;
        break;
      }
      maybeEnd = (ch == "*");
    }
    return "comment";
  }

  function Context(indented, column, type, align, prev) {
    this.indented = indented;
    this.column = column;
    this.type = type;
    this.align = align;
    this.prev = prev;
  }
  function pushContext(state, col, type) {
    var indent = state.indented;
    var c = new Context(indent, col, type, null, state.context);
    return state.context = c;
  }
  function popContext(state) {
    var t = state.context.type;
    if (t == ")" || t == "]" || t == "}") {
      state.indented = state.context.indented;
    }
    return state.context = state.context.prev;
  }

  function isClosing(text, contextClosing) {
    if (text == contextClosing) {
      return true;
    } else {
      // contextClosing may be multiple keywords separated by ;
      var closingKeywords = contextClosing.split(";");
      for (var i in closingKeywords) {
        if (text == closingKeywords[i]) {
          return true;
        }
      }
      return false;
    }
  }

  function buildElectricInputRegEx() {
    // Reindentation should occur on any bracket char: {}()[]
    // or on a match of any of the block closing keywords, at
    // the end of a line
    var allClosings = [];
    for (var i in openClose) {
      if (openClose[i]) {
        var closings = openClose[i].split(";");
        for (var j in closings) {
          allClosings.push(closings[j]);
        }
      }
    }
    var re = new RegExp("[{}()\\[\\]]|(" + allClosings.join("|") + ")$");
    return re;
  }

  // Interface
  return {

    // Regex to force current line to reindent
    electricInput: buildElectricInputRegEx(),

    startState: function(basecolumn) {
      var state = {
        tokenize: null,
        context: new Context((basecolumn || 0) - indentUnit, 0, "top", false),
        indented: 0,
        startOfLine: true
      };
      if (hooks.startState) hooks.startState(state);
      return state;
    },

    token: function(stream, state) {
      var ctx = state.context;
      if (stream.sol()) {
        if (ctx.align == null) ctx.align = false;
        state.indented = stream.indentation();
        state.startOfLine = true;
      }
      if (hooks.token) hooks.token(stream, state);
      if (stream.eatSpace()) return null;
      curPunc = null;
      curKeyword = null;
      var style = (state.tokenize || tokenBase)(stream, state);
      if (style == "comment" || style == "meta" || style == "variable") return style;
      if (ctx.align == null) ctx.align = true;

      if (curPunc == ctx.type) {
        popContext(state);
      } else if ((curPunc == ";" && ctx.type == "statement") ||
               (ctx.type && isClosing(curKeyword, ctx.type))) {
        ctx = popContext(state);
        while (ctx && ctx.type == "statement") ctx = popContext(state);
      } else if (curPunc == "{") {
        pushContext(state, stream.column(), "}");
      } else if (curPunc == "[") {
        pushContext(state, stream.column(), "]");
      } else if (curPunc == "(") {
        pushContext(state, stream.column(), ")");
      } else if (ctx && ctx.type == "endcase" && curPunc == ":") {
        pushContext(state, stream.column(), "statement");
      } else if (curPunc == "newstatement") {
        pushContext(state, stream.column(), "statement");
      } else if (curPunc == "newblock") {
        if (curKeyword == "function" && ctx && (ctx.type == "statement" || ctx.type == "endgroup")) {
          // The 'function' keyword can appear in some other contexts where it actually does not
          // indicate a function (import/export DPI and covergroup definitions).
          // Do nothing in this case
        } else if (curKeyword == "task" && ctx && ctx.type == "statement") {
          // Same thing for task
        } else {
          var close = openClose[curKeyword];
          pushContext(state, stream.column(), close);
        }
      }

      state.startOfLine = false;
      return style;
    },

    indent: function(state, textAfter) {
      if (state.tokenize != tokenBase && state.tokenize != null) return CodeMirror.Pass;
      if (hooks.indent) {
        var fromHook = hooks.indent(state);
        if (fromHook >= 0) return fromHook;
      }
      var ctx = state.context, firstChar = textAfter && textAfter.charAt(0);
      if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev;
      var closing = false;
      var possibleClosing = textAfter.match(closingBracketOrWord);
      if (possibleClosing)
        closing = isClosing(possibleClosing[0], ctx.type);
      if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : statementIndentUnit);
      else if (closingBracket.test(ctx.type) && ctx.align && !dontAlignCalls) return ctx.column + (closing ? 0 : 1);
      else if (ctx.type == ")" && !closing) return ctx.indented + statementIndentUnit;
      else return ctx.indented + (closing ? 0 : indentUnit);
    },

    blockCommentStart: "/*",
    blockCommentEnd: "*/",
    lineComment: "//"
  };
});

  CodeMirror.defineMIME("text/x-verilog", {
    name: "verilog"
  });

  CodeMirror.defineMIME("text/x-systemverilog", {
    name: "verilog"
  });

  // TLVVerilog mode

  var tlvchScopePrefixes = {
    ">": "property", "->": "property", "-": "hr", "|": "link", "?$": "qualifier", "?*": "qualifier",
    "@-": "variable-3", "@": "variable-3", "?": "qualifier"
  };

  function tlvGenIndent(stream, state) {
    var tlvindentUnit = 2;
    var rtnIndent = -1, indentUnitRq = 0, curIndent = stream.indentation();
    switch (state.tlvCurCtlFlowChar) {
    case "\\":
      curIndent = 0;
      break;
    case "|":
      if (state.tlvPrevPrevCtlFlowChar == "@") {
        indentUnitRq = -2; //-2 new pipe rq after cur pipe
        break;
      }
      if (tlvchScopePrefixes[state.tlvPrevCtlFlowChar])
        indentUnitRq = 1; // +1 new scope
      break;
    case "M":  // m4
      if (state.tlvPrevPrevCtlFlowChar == "@") {
        indentUnitRq = -2; //-2 new inst rq after  pipe
        break;
      }
      if (tlvchScopePrefixes[state.tlvPrevCtlFlowChar])
        indentUnitRq = 1; // +1 new scope
      break;
    case "@":
      if (state.tlvPrevCtlFlowChar == "S")
        indentUnitRq = -1; // new pipe stage after stmts
      if (state.tlvPrevCtlFlowChar == "|")
        indentUnitRq = 1; // 1st pipe stage
      break;
    case "S":
      if (state.tlvPrevCtlFlowChar == "@")
        indentUnitRq = 1; // flow in pipe stage
      if (tlvchScopePrefixes[state.tlvPrevCtlFlowChar])
        indentUnitRq = 1; // +1 new scope
      break;
    }
    var statementIndentUnit = tlvindentUnit;
    rtnIndent = curIndent + (indentUnitRq*statementIndentUnit);
    return rtnIndent >= 0 ? rtnIndent : curIndent;
  }

  CodeMirror.defineMIME("text/x-tlv", {
    name: "verilog",
    hooks: {
      "\\": function(stream, state) {
        var vxIndent = 0, style = false;
        var curPunc  = stream.string;
        if ((stream.sol()) && ((/\\SV/.test(stream.string)) || (/\\TLV/.test(stream.string)))) {
          curPunc = (/\\TLV_version/.test(stream.string))
            ? "\\TLV_version" : stream.string;
          stream.skipToEnd();
          if (curPunc == "\\SV" && state.vxCodeActive) {state.vxCodeActive = false;};
          if ((/\\TLV/.test(curPunc) && !state.vxCodeActive)
            || (curPunc=="\\TLV_version" && state.vxCodeActive)) {state.vxCodeActive = true;};
          style = "keyword";
          state.tlvCurCtlFlowChar  = state.tlvPrevPrevCtlFlowChar
            = state.tlvPrevCtlFlowChar = "";
          if (state.vxCodeActive == true) {
            state.tlvCurCtlFlowChar  = "\\";
            vxIndent = tlvGenIndent(stream, state);
          }
          state.vxIndentRq = vxIndent;
        }
        return style;
      },
      tokenBase: function(stream, state) {
        var vxIndent = 0, style = false;
        var tlvisOperatorChar = /[\[\]=:]/;
        var tlvkpScopePrefixs = {
          "**":"variable-2", "*":"variable-2", "$$":"variable", "$":"variable",
          "^^":"attribute", "^":"attribute"};
        var ch = stream.peek();
        var vxCurCtlFlowCharValueAtStart = state.tlvCurCtlFlowChar;
        if (state.vxCodeActive == true) {
          if (/[\[\]{}\(\);\:]/.test(ch)) {
            // bypass nesting and 1 char punc
            style = "meta";
            stream.next();
          } else if (ch == "/") {
            stream.next();
            if (stream.eat("/")) {
              stream.skipToEnd();
              style = "comment";
              state.tlvCurCtlFlowChar = "S";
            } else {
              stream.backUp(1);
            }
          } else if (ch == "@") {
            // pipeline stage
            style = tlvchScopePrefixes[ch];
            state.tlvCurCtlFlowChar = "@";
            stream.next();
            stream.eatWhile(/[\w\$_]/);
          } else if (stream.match(/\b[mM]4+/, true)) { // match: function(pattern, consume, caseInsensitive)
            // m4 pre proc
            stream.skipTo("(");
            style = "def";
            state.tlvCurCtlFlowChar = "M";
          } else if (ch == "!" && stream.sol()) {
            // v stmt in tlv region
            // state.tlvCurCtlFlowChar  = "S";
            style = "comment";
            stream.next();
          } else if (tlvisOperatorChar.test(ch)) {
            // operators
            stream.eatWhile(tlvisOperatorChar);
            style = "operator";
          } else if (ch == "#") {
            // phy hier
            state.tlvCurCtlFlowChar  = (state.tlvCurCtlFlowChar == "")
              ? ch : state.tlvCurCtlFlowChar;
            stream.next();
            stream.eatWhile(/[+-]\d/);
            style = "tag";
          } else if (tlvkpScopePrefixs.propertyIsEnumerable(ch)) {
            // special TLV operators
            style = tlvkpScopePrefixs[ch];
            state.tlvCurCtlFlowChar = state.tlvCurCtlFlowChar == "" ? "S" : state.tlvCurCtlFlowChar;  // stmt
            stream.next();
            stream.match(/[a-zA-Z_0-9]+/);
          } else if (style = tlvchScopePrefixes[ch] || false) {
            // special TLV operators
            state.tlvCurCtlFlowChar = state.tlvCurCtlFlowChar == "" ? ch : state.tlvCurCtlFlowChar;
            stream.next();
            stream.match(/[a-zA-Z_0-9]+/);
          }
          if (state.tlvCurCtlFlowChar != vxCurCtlFlowCharValueAtStart) { // flow change
            vxIndent = tlvGenIndent(stream, state);
            state.vxIndentRq = vxIndent;
          }
        }
        return style;
      },
      token: function(stream, state) {
        if (state.vxCodeActive == true && stream.sol() && state.tlvCurCtlFlowChar != "") {
          state.tlvPrevPrevCtlFlowChar = state.tlvPrevCtlFlowChar;
          state.tlvPrevCtlFlowChar = state.tlvCurCtlFlowChar;
          state.tlvCurCtlFlowChar = "";
        }
      },
      indent: function(state) {
        return (state.vxCodeActive == true) ? state.vxIndentRq : -1;
      },
      startState: function(state) {
        state.tlvCurCtlFlowChar = "";
        state.tlvPrevCtlFlowChar = "";
        state.tlvPrevPrevCtlFlowChar = "";
        state.vxCodeActive = true;
        state.vxIndentRq = 0;
      }
    }
  });
});
codemirror/mode/verilog/index.html000064400000005073151215013500013277 0ustar00<!doctype html>

<title>CodeMirror: Verilog/SystemVerilog mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="verilog.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Verilog/SystemVerilog</a>
  </ul>
</div>

<article>
<h2>SystemVerilog mode</h2>

<div><textarea id="code" name="code">
// Literals
1'b0
1'bx
1'bz
16'hDC78
'hdeadbeef
'b0011xxzz
1234
32'd5678
3.4e6
-128.7

// Macro definition
`define BUS_WIDTH = 8;

// Module definition
module block(
  input                   clk,
  input                   rst_n,
  input  [`BUS_WIDTH-1:0] data_in,
  output [`BUS_WIDTH-1:0] data_out
);
  
  always @(posedge clk or negedge rst_n) begin

    if (~rst_n) begin
      data_out <= 8'b0;
    end else begin
      data_out <= data_in;
    end
    
    if (~rst_n)
      data_out <= 8'b0;
    else
      data_out <= data_in;
    
    if (~rst_n)
      begin
        data_out <= 8'b0;
      end
    else
      begin
        data_out <= data_in;
      end

  end
  
endmodule

// Class definition
class test;

  /**
   * Sum two integers
   */
  function int sum(int a, int b);
    int result = a + b;
    string msg = $sformatf("%d + %d = %d", a, b, result);
    $display(msg);
    return result;
  endfunction
  
  task delay(int num_cycles);
    repeat(num_cycles) #1;
  endtask
  
endclass

</textarea></div>

<script>
  var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
    lineNumbers: true,
    matchBrackets: true,
    mode: {
      name: "verilog",
      noIndentKeywords: ["package"]
    }
  });
</script>

<p>
Syntax highlighting and indentation for the Verilog and SystemVerilog languages (IEEE 1800).
<h2>Configuration options:</h2>
  <ul>
    <li><strong>noIndentKeywords</strong> - List of keywords which should not cause indentation to increase. E.g. ["package", "module"]. Default: None</li>
  </ul>
</p>

<p><strong>MIME types defined:</strong> <code>text/x-verilog</code> and <code>text/x-systemverilog</code>.</p>
</article>
codemirror/mode/verilog/test.js000064400000015171151215013500012617 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function() {
  var mode = CodeMirror.getMode({indentUnit: 4}, "verilog");
  function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); }

  MT("binary_literals",
     "[number 1'b0]",
     "[number 1'b1]",
     "[number 1'bx]",
     "[number 1'bz]",
     "[number 1'bX]",
     "[number 1'bZ]",
     "[number 1'B0]",
     "[number 1'B1]",
     "[number 1'Bx]",
     "[number 1'Bz]",
     "[number 1'BX]",
     "[number 1'BZ]",
     "[number 1'b0]",
     "[number 1'b1]",
     "[number 2'b01]",
     "[number 2'bxz]",
     "[number 2'b11]",
     "[number 2'b10]",
     "[number 2'b1Z]",
     "[number 12'b0101_0101_0101]",
     "[number 1'b 0]",
     "[number 'b0101]"
  );

  MT("octal_literals",
     "[number 3'o7]",
     "[number 3'O7]",
     "[number 3'so7]",
     "[number 3'SO7]"
  );

  MT("decimal_literals",
     "[number 0]",
     "[number 1]",
     "[number 7]",
     "[number 123_456]",
     "[number 'd33]",
     "[number 8'd255]",
     "[number 8'D255]",
     "[number 8'sd255]",
     "[number 8'SD255]",
     "[number 32'd123]",
     "[number 32 'd123]",
     "[number 32 'd 123]"
  );

  MT("hex_literals",
     "[number 4'h0]",
     "[number 4'ha]",
     "[number 4'hF]",
     "[number 4'hx]",
     "[number 4'hz]",
     "[number 4'hX]",
     "[number 4'hZ]",
     "[number 32'hdc78]",
     "[number 32'hDC78]",
     "[number 32 'hDC78]",
     "[number 32'h DC78]",
     "[number 32 'h DC78]",
     "[number 32'h44x7]",
     "[number 32'hFFF?]"
  );

  MT("real_number_literals",
     "[number 1.2]",
     "[number 0.1]",
     "[number 2394.26331]",
     "[number 1.2E12]",
     "[number 1.2e12]",
     "[number 1.30e-2]",
     "[number 0.1e-0]",
     "[number 23E10]",
     "[number 29E-2]",
     "[number 236.123_763_e-12]"
  );

  MT("operators",
     "[meta ^]"
  );

  MT("keywords",
     "[keyword logic]",
     "[keyword logic] [variable foo]",
     "[keyword reg] [variable abc]"
  );

  MT("variables",
     "[variable _leading_underscore]",
     "[variable _if]",
     "[number 12] [variable foo]",
     "[variable foo] [number 14]"
  );

  MT("tick_defines",
     "[def `FOO]",
     "[def `foo]",
     "[def `FOO_bar]"
  );

  MT("system_calls",
     "[meta $display]",
     "[meta $vpi_printf]"
  );

  MT("line_comment", "[comment // Hello world]");

  // Alignment tests
  MT("align_port_map_style1",
     /**
      * mod mod(.a(a),
      *         .b(b)
      *        );
      */
     "[variable mod] [variable mod][bracket (].[variable a][bracket (][variable a][bracket )],",
     "        .[variable b][bracket (][variable b][bracket )]",
     "       [bracket )];",
     ""
  );

  MT("align_port_map_style2",
     /**
      * mod mod(
      *     .a(a),
      *     .b(b)
      * );
      */
     "[variable mod] [variable mod][bracket (]",
     "    .[variable a][bracket (][variable a][bracket )],",
     "    .[variable b][bracket (][variable b][bracket )]",
     "[bracket )];",
     ""
  );

  // Indentation tests
  MT("indent_single_statement_if",
      "[keyword if] [bracket (][variable foo][bracket )]",
      "    [keyword break];",
      ""
  );

  MT("no_indent_after_single_line_if",
      "[keyword if] [bracket (][variable foo][bracket )] [keyword break];",
      ""
  );

  MT("indent_after_if_begin_same_line",
      "[keyword if] [bracket (][variable foo][bracket )] [keyword begin]",
      "    [keyword break];",
      "    [keyword break];",
      "[keyword end]",
      ""
  );

  MT("indent_after_if_begin_next_line",
      "[keyword if] [bracket (][variable foo][bracket )]",
      "    [keyword begin]",
      "        [keyword break];",
      "        [keyword break];",
      "    [keyword end]",
      ""
  );

  MT("indent_single_statement_if_else",
      "[keyword if] [bracket (][variable foo][bracket )]",
      "    [keyword break];",
      "[keyword else]",
      "    [keyword break];",
      ""
  );

  MT("indent_if_else_begin_same_line",
      "[keyword if] [bracket (][variable foo][bracket )] [keyword begin]",
      "    [keyword break];",
      "    [keyword break];",
      "[keyword end] [keyword else] [keyword begin]",
      "    [keyword break];",
      "    [keyword break];",
      "[keyword end]",
      ""
  );

  MT("indent_if_else_begin_next_line",
      "[keyword if] [bracket (][variable foo][bracket )]",
      "    [keyword begin]",
      "        [keyword break];",
      "        [keyword break];",
      "    [keyword end]",
      "[keyword else]",
      "    [keyword begin]",
      "        [keyword break];",
      "        [keyword break];",
      "    [keyword end]",
      ""
  );

  MT("indent_if_nested_without_begin",
      "[keyword if] [bracket (][variable foo][bracket )]",
      "    [keyword if] [bracket (][variable foo][bracket )]",
      "        [keyword if] [bracket (][variable foo][bracket )]",
      "            [keyword break];",
      ""
  );

  MT("indent_case",
      "[keyword case] [bracket (][variable state][bracket )]",
      "    [variable FOO]:",
      "        [keyword break];",
      "    [variable BAR]:",
      "        [keyword break];",
      "[keyword endcase]",
      ""
  );

  MT("unindent_after_end_with_preceding_text",
      "[keyword begin]",
      "    [keyword break]; [keyword end]",
      ""
  );

  MT("export_function_one_line_does_not_indent",
     "[keyword export] [string \"DPI-C\"] [keyword function] [variable helloFromSV];",
     ""
  );

  MT("export_task_one_line_does_not_indent",
     "[keyword export] [string \"DPI-C\"] [keyword task] [variable helloFromSV];",
     ""
  );

  MT("export_function_two_lines_indents_properly",
    "[keyword export]",
    "    [string \"DPI-C\"] [keyword function] [variable helloFromSV];",
    ""
  );

  MT("export_task_two_lines_indents_properly",
    "[keyword export]",
    "    [string \"DPI-C\"] [keyword task] [variable helloFromSV];",
    ""
  );

  MT("import_function_one_line_does_not_indent",
    "[keyword import] [string \"DPI-C\"] [keyword function] [variable helloFromC];",
    ""
  );

  MT("import_task_one_line_does_not_indent",
    "[keyword import] [string \"DPI-C\"] [keyword task] [variable helloFromC];",
    ""
  );

  MT("import_package_single_line_does_not_indent",
    "[keyword import] [variable p]::[variable x];",
    "[keyword import] [variable p]::[variable y];",
    ""
  );

  MT("covergroup_with_function_indents_properly",
    "[keyword covergroup] [variable cg] [keyword with] [keyword function] [variable sample][bracket (][keyword bit] [variable b][bracket )];",
    "    [variable c] : [keyword coverpoint] [variable c];",
    "[keyword endgroup]: [variable cg]",
    ""
  );

})();
codemirror/mode/twig/twig.js000064400000010732151215013500012113 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"),  require("../../addon/mode/multiplex"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror", "../../addon/mode/multiplex"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  CodeMirror.defineMode("twig:inner", function() {
    var keywords = ["and", "as", "autoescape", "endautoescape", "block", "do", "endblock", "else", "elseif", "extends", "for", "endfor", "embed", "endembed", "filter", "endfilter", "flush", "from", "if", "endif", "in", "is", "include", "import", "not", "or", "set", "spaceless", "endspaceless", "with", "endwith", "trans", "endtrans", "blocktrans", "endblocktrans", "macro", "endmacro", "use", "verbatim", "endverbatim"],
        operator = /^[+\-*&%=<>!?|~^]/,
        sign = /^[:\[\(\{]/,
        atom = ["true", "false", "null", "empty", "defined", "divisibleby", "divisible by", "even", "odd", "iterable", "sameas", "same as"],
        number = /^(\d[+\-\*\/])?\d+(\.\d+)?/;

    keywords = new RegExp("((" + keywords.join(")|(") + "))\\b");
    atom = new RegExp("((" + atom.join(")|(") + "))\\b");

    function tokenBase (stream, state) {
      var ch = stream.peek();

      //Comment
      if (state.incomment) {
        if (!stream.skipTo("#}")) {
          stream.skipToEnd();
        } else {
          stream.eatWhile(/\#|}/);
          state.incomment = false;
        }
        return "comment";
      //Tag
      } else if (state.intag) {
        //After operator
        if (state.operator) {
          state.operator = false;
          if (stream.match(atom)) {
            return "atom";
          }
          if (stream.match(number)) {
            return "number";
          }
        }
        //After sign
        if (state.sign) {
          state.sign = false;
          if (stream.match(atom)) {
            return "atom";
          }
          if (stream.match(number)) {
            return "number";
          }
        }

        if (state.instring) {
          if (ch == state.instring) {
            state.instring = false;
          }
          stream.next();
          return "string";
        } else if (ch == "'" || ch == '"') {
          state.instring = ch;
          stream.next();
          return "string";
        } else if (stream.match(state.intag + "}") || stream.eat("-") && stream.match(state.intag + "}")) {
          state.intag = false;
          return "tag";
        } else if (stream.match(operator)) {
          state.operator = true;
          return "operator";
        } else if (stream.match(sign)) {
          state.sign = true;
        } else {
          if (stream.eat(" ") || stream.sol()) {
            if (stream.match(keywords)) {
              return "keyword";
            }
            if (stream.match(atom)) {
              return "atom";
            }
            if (stream.match(number)) {
              return "number";
            }
            if (stream.sol()) {
              stream.next();
            }
          } else {
            stream.next();
          }

        }
        return "variable";
      } else if (stream.eat("{")) {
        if (ch = stream.eat("#")) {
          state.incomment = true;
          if (!stream.skipTo("#}")) {
            stream.skipToEnd();
          } else {
            stream.eatWhile(/\#|}/);
            state.incomment = false;
          }
          return "comment";
        //Open tag
        } else if (ch = stream.eat(/\{|%/)) {
          //Cache close tag
          state.intag = ch;
          if (ch == "{") {
            state.intag = "}";
          }
          stream.eat("-");
          return "tag";
        }
      }
      stream.next();
    };

    return {
      startState: function () {
        return {};
      },
      token: function (stream, state) {
        return tokenBase(stream, state);
      }
    };
  });

  CodeMirror.defineMode("twig", function(config, parserConfig) {
    var twigInner = CodeMirror.getMode(config, "twig:inner");
    if (!parserConfig || !parserConfig.base) return twigInner;
    return CodeMirror.multiplexingMode(
      CodeMirror.getMode(config, parserConfig.base), {
        open: /\{[{#%]/, close: /[}#%]\}/, mode: twigInner, parseDelimiters: true
      }
    );
  });
  CodeMirror.defineMIME("text/x-twig", "twig");
});
codemirror/mode/twig/index.html000064400000002532151215013500012577 0ustar00<!doctype html>

<title>CodeMirror: Twig mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="twig.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Twig</a>
  </ul>
</div>

<article>
<h2>Twig mode</h2>
<form><textarea id="code" name="code">
{% extends "layout.twig" %}
{% block title %}CodeMirror: Twig mode{% endblock %}
{# this is a comment #}
{% block content %}
  {% for foo in bar if foo.baz is divisible by(3) %}
    Hello {{ foo.world }}
  {% else %}
    {% set msg = "Result not found" %}
    {% include "empty.twig" with { message: msg } %}
  {% endfor %}
{% endblock %}
</textarea></form>
    <script>
      var editor =
      CodeMirror.fromTextArea(document.getElementById("code"), {mode:
        {name: "twig", htmlMode: true}});
    </script>
  </article>
codemirror/mode/haxe/index.html000064400000005021151215013500012546 0ustar00<!doctype html>

<title>CodeMirror: Haxe mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="haxe.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Haxe</a>
  </ul>
</div>

<article>
<h2>Haxe mode</h2>


<div><p><textarea id="code-haxe" name="code">
import one.two.Three;

@attr("test")
class Foo&lt;T&gt; extends Three
{
	public function new()
	{
		noFoo = 12;
	}
	
	public static inline function doFoo(obj:{k:Int, l:Float}):Int
	{
		for(i in 0...10)
		{
			obj.k++;
			trace(i);
			var var1 = new Array();
			if(var1.length > 1)
				throw "Error";
		}
		// The following line should not be colored, the variable is scoped out
		var1;
		/* Multi line
		 * Comment test
		 */
		return obj.k;
	}
	private function bar():Void
	{
		#if flash
		var t1:String = "1.21";
		#end
		try {
			doFoo({k:3, l:1.2});
		}
		catch (e : String) {
			trace(e);
		}
		var t2:Float = cast(3.2);
		var t3:haxe.Timer = new haxe.Timer();
		var t4 = {k:Std.int(t2), l:Std.parseFloat(t1)};
		var t5 = ~/123+.*$/i;
		doFoo(t4);
		untyped t1 = 4;
		bob = new Foo&lt;Int&gt;
	}
	public var okFoo(default, never):Float;
	var noFoo(getFoo, null):Int;
	function getFoo():Int {
		return noFoo;
	}
	
	public var three:Int;
}
enum Color
{
	red;
	green;
	blue;
	grey( v : Int );
	rgb (r:Int,g:Int,b:Int);
}
</textarea></p>

<p>Hxml mode:</p>

<p><textarea id="code-hxml">
-cp test
-js path/to/file.js
#-remap nme:flash
--next
-D source-map-content
-cmd 'test'
-lib lime
</textarea></p>
</div>

    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code-haxe"), {
      	mode: "haxe",
        lineNumbers: true,
        indentUnit: 4,
        indentWithTabs: true
      });
      
      editor = CodeMirror.fromTextArea(document.getElementById("code-hxml"), {
      	mode: "hxml",
        lineNumbers: true,
        indentUnit: 4,
        indentWithTabs: true
      });
    </script>

    <p><strong>MIME types defined:</strong> <code>text/x-haxe, text/x-hxml</code>.</p>
  </article>
codemirror/mode/haxe/haxe.js000064400000042240151215013500012040 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("haxe", function(config, parserConfig) {
  var indentUnit = config.indentUnit;

  // Tokenizer

  function kw(type) {return {type: type, style: "keyword"};}
  var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c");
  var operator = kw("operator"), atom = {type: "atom", style: "atom"}, attribute = {type:"attribute", style: "attribute"};
  var type = kw("typedef");
  var keywords = {
    "if": A, "while": A, "else": B, "do": B, "try": B,
    "return": C, "break": C, "continue": C, "new": C, "throw": C,
    "var": kw("var"), "inline":attribute, "static": attribute, "using":kw("import"),
    "public": attribute, "private": attribute, "cast": kw("cast"), "import": kw("import"), "macro": kw("macro"),
    "function": kw("function"), "catch": kw("catch"), "untyped": kw("untyped"), "callback": kw("cb"),
    "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"),
    "in": operator, "never": kw("property_access"), "trace":kw("trace"),
    "class": type, "abstract":type, "enum":type, "interface":type, "typedef":type, "extends":type, "implements":type, "dynamic":type,
    "true": atom, "false": atom, "null": atom
  };

  var isOperatorChar = /[+\-*&%=<>!?|]/;

  function chain(stream, state, f) {
    state.tokenize = f;
    return f(stream, state);
  }

  function toUnescaped(stream, end) {
    var escaped = false, next;
    while ((next = stream.next()) != null) {
      if (next == end && !escaped)
        return true;
      escaped = !escaped && next == "\\";
    }
  }

  // Used as scratch variables to communicate multiple values without
  // consing up tons of objects.
  var type, content;
  function ret(tp, style, cont) {
    type = tp; content = cont;
    return style;
  }

  function haxeTokenBase(stream, state) {
    var ch = stream.next();
    if (ch == '"' || ch == "'") {
      return chain(stream, state, haxeTokenString(ch));
    } else if (/[\[\]{}\(\),;\:\.]/.test(ch)) {
      return ret(ch);
    } else if (ch == "0" && stream.eat(/x/i)) {
      stream.eatWhile(/[\da-f]/i);
      return ret("number", "number");
    } else if (/\d/.test(ch) || ch == "-" && stream.eat(/\d/)) {
      stream.match(/^\d*(?:\.\d*(?!\.))?(?:[eE][+\-]?\d+)?/);
      return ret("number", "number");
    } else if (state.reAllowed && (ch == "~" && stream.eat(/\//))) {
      toUnescaped(stream, "/");
      stream.eatWhile(/[gimsu]/);
      return ret("regexp", "string-2");
    } else if (ch == "/") {
      if (stream.eat("*")) {
        return chain(stream, state, haxeTokenComment);
      } else if (stream.eat("/")) {
        stream.skipToEnd();
        return ret("comment", "comment");
      } else {
        stream.eatWhile(isOperatorChar);
        return ret("operator", null, stream.current());
      }
    } else if (ch == "#") {
        stream.skipToEnd();
        return ret("conditional", "meta");
    } else if (ch == "@") {
      stream.eat(/:/);
      stream.eatWhile(/[\w_]/);
      return ret ("metadata", "meta");
    } else if (isOperatorChar.test(ch)) {
      stream.eatWhile(isOperatorChar);
      return ret("operator", null, stream.current());
    } else {
      var word;
      if(/[A-Z]/.test(ch)) {
        stream.eatWhile(/[\w_<>]/);
        word = stream.current();
        return ret("type", "variable-3", word);
      } else {
        stream.eatWhile(/[\w_]/);
        var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word];
        return (known && state.kwAllowed) ? ret(known.type, known.style, word) :
                       ret("variable", "variable", word);
      }
    }
  }

  function haxeTokenString(quote) {
    return function(stream, state) {
      if (toUnescaped(stream, quote))
        state.tokenize = haxeTokenBase;
      return ret("string", "string");
    };
  }

  function haxeTokenComment(stream, state) {
    var maybeEnd = false, ch;
    while (ch = stream.next()) {
      if (ch == "/" && maybeEnd) {
        state.tokenize = haxeTokenBase;
        break;
      }
      maybeEnd = (ch == "*");
    }
    return ret("comment", "comment");
  }

  // Parser

  var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true};

  function HaxeLexical(indented, column, type, align, prev, info) {
    this.indented = indented;
    this.column = column;
    this.type = type;
    this.prev = prev;
    this.info = info;
    if (align != null) this.align = align;
  }

  function inScope(state, varname) {
    for (var v = state.localVars; v; v = v.next)
      if (v.name == varname) return true;
  }

  function parseHaxe(state, style, type, content, stream) {
    var cc = state.cc;
    // Communicate our context to the combinators.
    // (Less wasteful than consing up a hundred closures on every call.)
    cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc;

    if (!state.lexical.hasOwnProperty("align"))
      state.lexical.align = true;

    while(true) {
      var combinator = cc.length ? cc.pop() : statement;
      if (combinator(type, content)) {
        while(cc.length && cc[cc.length - 1].lex)
          cc.pop()();
        if (cx.marked) return cx.marked;
        if (type == "variable" && inScope(state, content)) return "variable-2";
        if (type == "variable" && imported(state, content)) return "variable-3";
        return style;
      }
    }
  }

  function imported(state, typename) {
    if (/[a-z]/.test(typename.charAt(0)))
      return false;
    var len = state.importedtypes.length;
    for (var i = 0; i<len; i++)
      if(state.importedtypes[i]==typename) return true;
  }

  function registerimport(importname) {
    var state = cx.state;
    for (var t = state.importedtypes; t; t = t.next)
      if(t.name == importname) return;
    state.importedtypes = { name: importname, next: state.importedtypes };
  }
  // Combinator utils

  var cx = {state: null, column: null, marked: null, cc: null};
  function pass() {
    for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]);
  }
  function cont() {
    pass.apply(null, arguments);
    return true;
  }
  function inList(name, list) {
    for (var v = list; v; v = v.next)
      if (v.name == name) return true;
    return false;
  }
  function register(varname) {
    var state = cx.state;
    if (state.context) {
      cx.marked = "def";
      if (inList(varname, state.localVars)) return;
      state.localVars = {name: varname, next: state.localVars};
    } else if (state.globalVars) {
      if (inList(varname, state.globalVars)) return;
      state.globalVars = {name: varname, next: state.globalVars};
    }
  }

  // Combinators

  var defaultVars = {name: "this", next: null};
  function pushcontext() {
    if (!cx.state.context) cx.state.localVars = defaultVars;
    cx.state.context = {prev: cx.state.context, vars: cx.state.localVars};
  }
  function popcontext() {
    cx.state.localVars = cx.state.context.vars;
    cx.state.context = cx.state.context.prev;
  }
  popcontext.lex = true;
  function pushlex(type, info) {
    var result = function() {
      var state = cx.state;
      state.lexical = new HaxeLexical(state.indented, cx.stream.column(), type, null, state.lexical, info);
    };
    result.lex = true;
    return result;
  }
  function poplex() {
    var state = cx.state;
    if (state.lexical.prev) {
      if (state.lexical.type == ")")
        state.indented = state.lexical.indented;
      state.lexical = state.lexical.prev;
    }
  }
  poplex.lex = true;

  function expect(wanted) {
    function f(type) {
      if (type == wanted) return cont();
      else if (wanted == ";") return pass();
      else return cont(f);
    }
    return f;
  }

  function statement(type) {
    if (type == "@") return cont(metadef);
    if (type == "var") return cont(pushlex("vardef"), vardef1, expect(";"), poplex);
    if (type == "keyword a") return cont(pushlex("form"), expression, statement, poplex);
    if (type == "keyword b") return cont(pushlex("form"), statement, poplex);
    if (type == "{") return cont(pushlex("}"), pushcontext, block, poplex, popcontext);
    if (type == ";") return cont();
    if (type == "attribute") return cont(maybeattribute);
    if (type == "function") return cont(functiondef);
    if (type == "for") return cont(pushlex("form"), expect("("), pushlex(")"), forspec1, expect(")"),
                                   poplex, statement, poplex);
    if (type == "variable") return cont(pushlex("stat"), maybelabel);
    if (type == "switch") return cont(pushlex("form"), expression, pushlex("}", "switch"), expect("{"),
                                      block, poplex, poplex);
    if (type == "case") return cont(expression, expect(":"));
    if (type == "default") return cont(expect(":"));
    if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"),
                                     statement, poplex, popcontext);
    if (type == "import") return cont(importdef, expect(";"));
    if (type == "typedef") return cont(typedef);
    return pass(pushlex("stat"), expression, expect(";"), poplex);
  }
  function expression(type) {
    if (atomicTypes.hasOwnProperty(type)) return cont(maybeoperator);
    if (type == "type" ) return cont(maybeoperator);
    if (type == "function") return cont(functiondef);
    if (type == "keyword c") return cont(maybeexpression);
    if (type == "(") return cont(pushlex(")"), maybeexpression, expect(")"), poplex, maybeoperator);
    if (type == "operator") return cont(expression);
    if (type == "[") return cont(pushlex("]"), commasep(maybeexpression, "]"), poplex, maybeoperator);
    if (type == "{") return cont(pushlex("}"), commasep(objprop, "}"), poplex, maybeoperator);
    return cont();
  }
  function maybeexpression(type) {
    if (type.match(/[;\}\)\],]/)) return pass();
    return pass(expression);
  }

  function maybeoperator(type, value) {
    if (type == "operator" && /\+\+|--/.test(value)) return cont(maybeoperator);
    if (type == "operator" || type == ":") return cont(expression);
    if (type == ";") return;
    if (type == "(") return cont(pushlex(")"), commasep(expression, ")"), poplex, maybeoperator);
    if (type == ".") return cont(property, maybeoperator);
    if (type == "[") return cont(pushlex("]"), expression, expect("]"), poplex, maybeoperator);
  }

  function maybeattribute(type) {
    if (type == "attribute") return cont(maybeattribute);
    if (type == "function") return cont(functiondef);
    if (type == "var") return cont(vardef1);
  }

  function metadef(type) {
    if(type == ":") return cont(metadef);
    if(type == "variable") return cont(metadef);
    if(type == "(") return cont(pushlex(")"), commasep(metaargs, ")"), poplex, statement);
  }
  function metaargs(type) {
    if(type == "variable") return cont();
  }

  function importdef (type, value) {
    if(type == "variable" && /[A-Z]/.test(value.charAt(0))) { registerimport(value); return cont(); }
    else if(type == "variable" || type == "property" || type == "." || value == "*") return cont(importdef);
  }

  function typedef (type, value)
  {
    if(type == "variable" && /[A-Z]/.test(value.charAt(0))) { registerimport(value); return cont(); }
    else if (type == "type" && /[A-Z]/.test(value.charAt(0))) { return cont(); }
  }

  function maybelabel(type) {
    if (type == ":") return cont(poplex, statement);
    return pass(maybeoperator, expect(";"), poplex);
  }
  function property(type) {
    if (type == "variable") {cx.marked = "property"; return cont();}
  }
  function objprop(type) {
    if (type == "variable") cx.marked = "property";
    if (atomicTypes.hasOwnProperty(type)) return cont(expect(":"), expression);
  }
  function commasep(what, end) {
    function proceed(type) {
      if (type == ",") return cont(what, proceed);
      if (type == end) return cont();
      return cont(expect(end));
    }
    return function(type) {
      if (type == end) return cont();
      else return pass(what, proceed);
    };
  }
  function block(type) {
    if (type == "}") return cont();
    return pass(statement, block);
  }
  function vardef1(type, value) {
    if (type == "variable"){register(value); return cont(typeuse, vardef2);}
    return cont();
  }
  function vardef2(type, value) {
    if (value == "=") return cont(expression, vardef2);
    if (type == ",") return cont(vardef1);
  }
  function forspec1(type, value) {
    if (type == "variable") {
      register(value);
      return cont(forin, expression)
    } else {
      return pass()
    }
  }
  function forin(_type, value) {
    if (value == "in") return cont();
  }
  function functiondef(type, value) {
    //function names starting with upper-case letters are recognised as types, so cludging them together here.
    if (type == "variable" || type == "type") {register(value); return cont(functiondef);}
    if (value == "new") return cont(functiondef);
    if (type == "(") return cont(pushlex(")"), pushcontext, commasep(funarg, ")"), poplex, typeuse, statement, popcontext);
  }
  function typeuse(type) {
    if(type == ":") return cont(typestring);
  }
  function typestring(type) {
    if(type == "type") return cont();
    if(type == "variable") return cont();
    if(type == "{") return cont(pushlex("}"), commasep(typeprop, "}"), poplex);
  }
  function typeprop(type) {
    if(type == "variable") return cont(typeuse);
  }
  function funarg(type, value) {
    if (type == "variable") {register(value); return cont(typeuse);}
  }

  // Interface
  return {
    startState: function(basecolumn) {
      var defaulttypes = ["Int", "Float", "String", "Void", "Std", "Bool", "Dynamic", "Array"];
      var state = {
        tokenize: haxeTokenBase,
        reAllowed: true,
        kwAllowed: true,
        cc: [],
        lexical: new HaxeLexical((basecolumn || 0) - indentUnit, 0, "block", false),
        localVars: parserConfig.localVars,
        importedtypes: defaulttypes,
        context: parserConfig.localVars && {vars: parserConfig.localVars},
        indented: 0
      };
      if (parserConfig.globalVars && typeof parserConfig.globalVars == "object")
        state.globalVars = parserConfig.globalVars;
      return state;
    },

    token: function(stream, state) {
      if (stream.sol()) {
        if (!state.lexical.hasOwnProperty("align"))
          state.lexical.align = false;
        state.indented = stream.indentation();
      }
      if (stream.eatSpace()) return null;
      var style = state.tokenize(stream, state);
      if (type == "comment") return style;
      state.reAllowed = !!(type == "operator" || type == "keyword c" || type.match(/^[\[{}\(,;:]$/));
      state.kwAllowed = type != '.';
      return parseHaxe(state, style, type, content, stream);
    },

    indent: function(state, textAfter) {
      if (state.tokenize != haxeTokenBase) return 0;
      var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical;
      if (lexical.type == "stat" && firstChar == "}") lexical = lexical.prev;
      var type = lexical.type, closing = firstChar == type;
      if (type == "vardef") return lexical.indented + 4;
      else if (type == "form" && firstChar == "{") return lexical.indented;
      else if (type == "stat" || type == "form") return lexical.indented + indentUnit;
      else if (lexical.info == "switch" && !closing)
        return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit);
      else if (lexical.align) return lexical.column + (closing ? 0 : 1);
      else return lexical.indented + (closing ? 0 : indentUnit);
    },

    electricChars: "{}",
    blockCommentStart: "/*",
    blockCommentEnd: "*/",
    lineComment: "//"
  };
});

CodeMirror.defineMIME("text/x-haxe", "haxe");

CodeMirror.defineMode("hxml", function () {

  return {
    startState: function () {
      return {
        define: false,
        inString: false
      };
    },
    token: function (stream, state) {
      var ch = stream.peek();
      var sol = stream.sol();

      ///* comments */
      if (ch == "#") {
        stream.skipToEnd();
        return "comment";
      }
      if (sol && ch == "-") {
        var style = "variable-2";

        stream.eat(/-/);

        if (stream.peek() == "-") {
          stream.eat(/-/);
          style = "keyword a";
        }

        if (stream.peek() == "D") {
          stream.eat(/[D]/);
          style = "keyword c";
          state.define = true;
        }

        stream.eatWhile(/[A-Z]/i);
        return style;
      }

      var ch = stream.peek();

      if (state.inString == false && ch == "'") {
        state.inString = true;
        ch = stream.next();
      }

      if (state.inString == true) {
        if (stream.skipTo("'")) {

        } else {
          stream.skipToEnd();
        }

        if (stream.peek() == "'") {
          stream.next();
          state.inString = false;
        }

        return "string";
      }

      stream.next();
      return null;
    },
    lineComment: "#"
  };
});

CodeMirror.defineMIME("text/x-hxml", "hxml");

});
codemirror/mode/scheme/scheme.js000064400000032177151215013500012706 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

/**
 * Author: Koh Zi Han, based on implementation by Koh Zi Chun
 */

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("scheme", function () {
    var BUILTIN = "builtin", COMMENT = "comment", STRING = "string",
        ATOM = "atom", NUMBER = "number", BRACKET = "bracket";
    var INDENT_WORD_SKIP = 2;

    function makeKeywords(str) {
        var obj = {}, words = str.split(" ");
        for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
        return obj;
    }

    var keywords = makeKeywords("λ case-lambda call/cc class define-class exit-handler field import inherit init-field interface let*-values let-values let/ec mixin opt-lambda override protect provide public rename require require-for-syntax syntax syntax-case syntax-error unit/sig unless when with-syntax and begin call-with-current-continuation call-with-input-file call-with-output-file case cond define define-syntax delay do dynamic-wind else for-each if lambda let let* let-syntax letrec letrec-syntax map or syntax-rules abs acos angle append apply asin assoc assq assv atan boolean? caar cadr call-with-input-file call-with-output-file call-with-values car cdddar cddddr cdr ceiling char->integer char-alphabetic? char-ci<=? char-ci<? char-ci=? char-ci>=? char-ci>? char-downcase char-lower-case? char-numeric? char-ready? char-upcase char-upper-case? char-whitespace? char<=? char<? char=? char>=? char>? char? close-input-port close-output-port complex? cons cos current-input-port current-output-port denominator display eof-object? eq? equal? eqv? eval even? exact->inexact exact? exp expt #f floor force gcd imag-part inexact->exact inexact? input-port? integer->char integer? interaction-environment lcm length list list->string list->vector list-ref list-tail list? load log magnitude make-polar make-rectangular make-string make-vector max member memq memv min modulo negative? newline not null-environment null? number->string number? numerator odd? open-input-file open-output-file output-port? pair? peek-char port? positive? procedure? quasiquote quote quotient rational? rationalize read read-char real-part real? remainder reverse round scheme-report-environment set! set-car! set-cdr! sin sqrt string string->list string->number string->symbol string-append string-ci<=? string-ci<? string-ci=? string-ci>=? string-ci>? string-copy string-fill! string-length string-ref string-set! string<=? string<? string=? string>=? string>? string? substring symbol->string symbol? #t tan transcript-off transcript-on truncate values vector vector->list vector-fill! vector-length vector-ref vector-set! with-input-from-file with-output-to-file write write-char zero?");
    var indentKeys = makeKeywords("define let letrec let* lambda");

    function stateStack(indent, type, prev) { // represents a state stack object
        this.indent = indent;
        this.type = type;
        this.prev = prev;
    }

    function pushStack(state, indent, type) {
        state.indentStack = new stateStack(indent, type, state.indentStack);
    }

    function popStack(state) {
        state.indentStack = state.indentStack.prev;
    }

    var binaryMatcher = new RegExp(/^(?:[-+]i|[-+][01]+#*(?:\/[01]+#*)?i|[-+]?[01]+#*(?:\/[01]+#*)?@[-+]?[01]+#*(?:\/[01]+#*)?|[-+]?[01]+#*(?:\/[01]+#*)?[-+](?:[01]+#*(?:\/[01]+#*)?)?i|[-+]?[01]+#*(?:\/[01]+#*)?)(?=[()\s;"]|$)/i);
    var octalMatcher = new RegExp(/^(?:[-+]i|[-+][0-7]+#*(?:\/[0-7]+#*)?i|[-+]?[0-7]+#*(?:\/[0-7]+#*)?@[-+]?[0-7]+#*(?:\/[0-7]+#*)?|[-+]?[0-7]+#*(?:\/[0-7]+#*)?[-+](?:[0-7]+#*(?:\/[0-7]+#*)?)?i|[-+]?[0-7]+#*(?:\/[0-7]+#*)?)(?=[()\s;"]|$)/i);
    var hexMatcher = new RegExp(/^(?:[-+]i|[-+][\da-f]+#*(?:\/[\da-f]+#*)?i|[-+]?[\da-f]+#*(?:\/[\da-f]+#*)?@[-+]?[\da-f]+#*(?:\/[\da-f]+#*)?|[-+]?[\da-f]+#*(?:\/[\da-f]+#*)?[-+](?:[\da-f]+#*(?:\/[\da-f]+#*)?)?i|[-+]?[\da-f]+#*(?:\/[\da-f]+#*)?)(?=[()\s;"]|$)/i);
    var decimalMatcher = new RegExp(/^(?:[-+]i|[-+](?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)i|[-+]?(?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)@[-+]?(?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)|[-+]?(?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)[-+](?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)?i|(?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*))(?=[()\s;"]|$)/i);

    function isBinaryNumber (stream) {
        return stream.match(binaryMatcher);
    }

    function isOctalNumber (stream) {
        return stream.match(octalMatcher);
    }

    function isDecimalNumber (stream, backup) {
        if (backup === true) {
            stream.backUp(1);
        }
        return stream.match(decimalMatcher);
    }

    function isHexNumber (stream) {
        return stream.match(hexMatcher);
    }

    return {
        startState: function () {
            return {
                indentStack: null,
                indentation: 0,
                mode: false,
                sExprComment: false
            };
        },

        token: function (stream, state) {
            if (state.indentStack == null && stream.sol()) {
                // update indentation, but only if indentStack is empty
                state.indentation = stream.indentation();
            }

            // skip spaces
            if (stream.eatSpace()) {
                return null;
            }
            var returnType = null;

            switch(state.mode){
                case "string": // multi-line string parsing mode
                    var next, escaped = false;
                    while ((next = stream.next()) != null) {
                        if (next == "\"" && !escaped) {

                            state.mode = false;
                            break;
                        }
                        escaped = !escaped && next == "\\";
                    }
                    returnType = STRING; // continue on in scheme-string mode
                    break;
                case "comment": // comment parsing mode
                    var next, maybeEnd = false;
                    while ((next = stream.next()) != null) {
                        if (next == "#" && maybeEnd) {

                            state.mode = false;
                            break;
                        }
                        maybeEnd = (next == "|");
                    }
                    returnType = COMMENT;
                    break;
                case "s-expr-comment": // s-expr commenting mode
                    state.mode = false;
                    if(stream.peek() == "(" || stream.peek() == "["){
                        // actually start scheme s-expr commenting mode
                        state.sExprComment = 0;
                    }else{
                        // if not we just comment the entire of the next token
                        stream.eatWhile(/[^/s]/); // eat non spaces
                        returnType = COMMENT;
                        break;
                    }
                default: // default parsing mode
                    var ch = stream.next();

                    if (ch == "\"") {
                        state.mode = "string";
                        returnType = STRING;

                    } else if (ch == "'") {
                        returnType = ATOM;
                    } else if (ch == '#') {
                        if (stream.eat("|")) {                    // Multi-line comment
                            state.mode = "comment"; // toggle to comment mode
                            returnType = COMMENT;
                        } else if (stream.eat(/[tf]/i)) {            // #t/#f (atom)
                            returnType = ATOM;
                        } else if (stream.eat(';')) {                // S-Expr comment
                            state.mode = "s-expr-comment";
                            returnType = COMMENT;
                        } else {
                            var numTest = null, hasExactness = false, hasRadix = true;
                            if (stream.eat(/[ei]/i)) {
                                hasExactness = true;
                            } else {
                                stream.backUp(1);       // must be radix specifier
                            }
                            if (stream.match(/^#b/i)) {
                                numTest = isBinaryNumber;
                            } else if (stream.match(/^#o/i)) {
                                numTest = isOctalNumber;
                            } else if (stream.match(/^#x/i)) {
                                numTest = isHexNumber;
                            } else if (stream.match(/^#d/i)) {
                                numTest = isDecimalNumber;
                            } else if (stream.match(/^[-+0-9.]/, false)) {
                                hasRadix = false;
                                numTest = isDecimalNumber;
                            // re-consume the intial # if all matches failed
                            } else if (!hasExactness) {
                                stream.eat('#');
                            }
                            if (numTest != null) {
                                if (hasRadix && !hasExactness) {
                                    // consume optional exactness after radix
                                    stream.match(/^#[ei]/i);
                                }
                                if (numTest(stream))
                                    returnType = NUMBER;
                            }
                        }
                    } else if (/^[-+0-9.]/.test(ch) && isDecimalNumber(stream, true)) { // match non-prefixed number, must be decimal
                        returnType = NUMBER;
                    } else if (ch == ";") { // comment
                        stream.skipToEnd(); // rest of the line is a comment
                        returnType = COMMENT;
                    } else if (ch == "(" || ch == "[") {
                      var keyWord = ''; var indentTemp = stream.column(), letter;
                        /**
                        Either
                        (indent-word ..
                        (non-indent-word ..
                        (;something else, bracket, etc.
                        */

                        while ((letter = stream.eat(/[^\s\(\[\;\)\]]/)) != null) {
                            keyWord += letter;
                        }

                        if (keyWord.length > 0 && indentKeys.propertyIsEnumerable(keyWord)) { // indent-word

                            pushStack(state, indentTemp + INDENT_WORD_SKIP, ch);
                        } else { // non-indent word
                            // we continue eating the spaces
                            stream.eatSpace();
                            if (stream.eol() || stream.peek() == ";") {
                                // nothing significant after
                                // we restart indentation 1 space after
                                pushStack(state, indentTemp + 1, ch);
                            } else {
                                pushStack(state, indentTemp + stream.current().length, ch); // else we match
                            }
                        }
                        stream.backUp(stream.current().length - 1); // undo all the eating

                        if(typeof state.sExprComment == "number") state.sExprComment++;

                        returnType = BRACKET;
                    } else if (ch == ")" || ch == "]") {
                        returnType = BRACKET;
                        if (state.indentStack != null && state.indentStack.type == (ch == ")" ? "(" : "[")) {
                            popStack(state);

                            if(typeof state.sExprComment == "number"){
                                if(--state.sExprComment == 0){
                                    returnType = COMMENT; // final closing bracket
                                    state.sExprComment = false; // turn off s-expr commenting mode
                                }
                            }
                        }
                    } else {
                        stream.eatWhile(/[\w\$_\-!$%&*+\.\/:<=>?@\^~]/);

                        if (keywords && keywords.propertyIsEnumerable(stream.current())) {
                            returnType = BUILTIN;
                        } else returnType = "variable";
                    }
            }
            return (typeof state.sExprComment == "number") ? COMMENT : returnType;
        },

        indent: function (state) {
            if (state.indentStack == null) return state.indentation;
            return state.indentStack.indent;
        },

        closeBrackets: {pairs: "()[]{}\"\""},
        lineComment: ";;"
    };
});

CodeMirror.defineMIME("text/x-scheme", "scheme");

});
codemirror/mode/scheme/index.html000064400000004772151215013500013101 0ustar00<!doctype html>

<title>CodeMirror: Scheme mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="scheme.js"></script>
<style>.CodeMirror {background: #f8f8f8;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Scheme</a>
  </ul>
</div>

<article>
<h2>Scheme mode</h2>
<form><textarea id="code" name="code">
; See if the input starts with a given symbol.
(define (match-symbol input pattern)
  (cond ((null? (remain input)) #f)
	((eqv? (car (remain input)) pattern) (r-cdr input))
	(else #f)))

; Allow the input to start with one of a list of patterns.
(define (match-or input pattern)
  (cond ((null? pattern) #f)
	((match-pattern input (car pattern)))
	(else (match-or input (cdr pattern)))))

; Allow a sequence of patterns.
(define (match-seq input pattern)
  (if (null? pattern)
      input
      (let ((match (match-pattern input (car pattern))))
	(if match (match-seq match (cdr pattern)) #f))))

; Match with the pattern but no problem if it does not match.
(define (match-opt input pattern)
  (let ((match (match-pattern input (car pattern))))
    (if match match input)))

; Match anything (other than '()), until pattern is found. The rather
; clumsy form of requiring an ending pattern is needed to decide where
; the end of the match is. If none is given, this will match the rest
; of the sentence.
(define (match-any input pattern)
  (cond ((null? (remain input)) #f)
	((null? pattern) (f-cons (remain input) (clear-remain input)))
	(else
	 (let ((accum-any (collector)))
	   (define (match-pattern-any input pattern)
	     (cond ((null? (remain input)) #f)
		   (else (accum-any (car (remain input)))
			 (cond ((match-pattern (r-cdr input) pattern))
			       (else (match-pattern-any (r-cdr input) pattern))))))
	   (let ((retval (match-pattern-any input (car pattern))))
	     (if retval
		 (f-cons (accum-any) retval)
		 #f))))))
</textarea></form>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {});
    </script>

    <p><strong>MIME types defined:</strong> <code>text/x-scheme</code>.</p>

  </article>
codemirror/mode/groovy/index.html000064400000004201151215013500013145 0ustar00<!doctype html>

<title>CodeMirror: Groovy mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="groovy.js"></script>
<style>.CodeMirror {border-top: 1px solid #500; border-bottom: 1px solid #500;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Groovy</a>
  </ul>
</div>

<article>
<h2>Groovy mode</h2>
<form><textarea id="code" name="code">
//Pattern for groovy script
def p = ~/.*\.groovy/
new File( 'd:\\scripts' ).eachFileMatch(p) {f ->
  // imports list
  def imports = []
  f.eachLine {
    // condition to detect an import instruction
    ln -> if ( ln =~ '^import .*' ) {
      imports << "${ln - 'import '}"
    }
  }
  // print thmen
  if ( ! imports.empty ) {
    println f
    imports.each{ println "   $it" }
  }
}

/* Coin changer demo code from http://groovy.codehaus.org */

enum UsCoin {
  quarter(25), dime(10), nickel(5), penny(1)
  UsCoin(v) { value = v }
  final value
}

enum OzzieCoin {
  fifty(50), twenty(20), ten(10), five(5)
  OzzieCoin(v) { value = v }
  final value
}

def plural(word, count) {
  if (count == 1) return word
  word[-1] == 'y' ? word[0..-2] + "ies" : word + "s"
}

def change(currency, amount) {
  currency.values().inject([]){ list, coin ->
     int count = amount / coin.value
     amount = amount % coin.value
     list += "$count ${plural(coin.toString(), count)}"
  }
}
</textarea></form>

    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        lineNumbers: true,
        matchBrackets: true,
        mode: "text/x-groovy"
      });
    </script>

    <p><strong>MIME types defined:</strong> <code>text/x-groovy</code></p>
  </article>
codemirror/mode/groovy/groovy.js000064400000017306151215013500013045 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("groovy", function(config) {
  function words(str) {
    var obj = {}, words = str.split(" ");
    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
    return obj;
  }
  var keywords = words(
    "abstract as assert boolean break byte case catch char class const continue def default " +
    "do double else enum extends final finally float for goto if implements import in " +
    "instanceof int interface long native new package private protected public return " +
    "short static strictfp super switch synchronized threadsafe throw throws transient " +
    "try void volatile while");
  var blockKeywords = words("catch class do else finally for if switch try while enum interface def");
  var standaloneKeywords = words("return break continue");
  var atoms = words("null true false this");

  var curPunc;
  function tokenBase(stream, state) {
    var ch = stream.next();
    if (ch == '"' || ch == "'") {
      return startString(ch, stream, state);
    }
    if (/[\[\]{}\(\),;\:\.]/.test(ch)) {
      curPunc = ch;
      return null;
    }
    if (/\d/.test(ch)) {
      stream.eatWhile(/[\w\.]/);
      if (stream.eat(/eE/)) { stream.eat(/\+\-/); stream.eatWhile(/\d/); }
      return "number";
    }
    if (ch == "/") {
      if (stream.eat("*")) {
        state.tokenize.push(tokenComment);
        return tokenComment(stream, state);
      }
      if (stream.eat("/")) {
        stream.skipToEnd();
        return "comment";
      }
      if (expectExpression(state.lastToken, false)) {
        return startString(ch, stream, state);
      }
    }
    if (ch == "-" && stream.eat(">")) {
      curPunc = "->";
      return null;
    }
    if (/[+\-*&%=<>!?|\/~]/.test(ch)) {
      stream.eatWhile(/[+\-*&%=<>|~]/);
      return "operator";
    }
    stream.eatWhile(/[\w\$_]/);
    if (ch == "@") { stream.eatWhile(/[\w\$_\.]/); return "meta"; }
    if (state.lastToken == ".") return "property";
    if (stream.eat(":")) { curPunc = "proplabel"; return "property"; }
    var cur = stream.current();
    if (atoms.propertyIsEnumerable(cur)) { return "atom"; }
    if (keywords.propertyIsEnumerable(cur)) {
      if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement";
      else if (standaloneKeywords.propertyIsEnumerable(cur)) curPunc = "standalone";
      return "keyword";
    }
    return "variable";
  }
  tokenBase.isBase = true;

  function startString(quote, stream, state) {
    var tripleQuoted = false;
    if (quote != "/" && stream.eat(quote)) {
      if (stream.eat(quote)) tripleQuoted = true;
      else return "string";
    }
    function t(stream, state) {
      var escaped = false, next, end = !tripleQuoted;
      while ((next = stream.next()) != null) {
        if (next == quote && !escaped) {
          if (!tripleQuoted) { break; }
          if (stream.match(quote + quote)) { end = true; break; }
        }
        if (quote == '"' && next == "$" && !escaped && stream.eat("{")) {
          state.tokenize.push(tokenBaseUntilBrace());
          return "string";
        }
        escaped = !escaped && next == "\\";
      }
      if (end) state.tokenize.pop();
      return "string";
    }
    state.tokenize.push(t);
    return t(stream, state);
  }

  function tokenBaseUntilBrace() {
    var depth = 1;
    function t(stream, state) {
      if (stream.peek() == "}") {
        depth--;
        if (depth == 0) {
          state.tokenize.pop();
          return state.tokenize[state.tokenize.length-1](stream, state);
        }
      } else if (stream.peek() == "{") {
        depth++;
      }
      return tokenBase(stream, state);
    }
    t.isBase = true;
    return t;
  }

  function tokenComment(stream, state) {
    var maybeEnd = false, ch;
    while (ch = stream.next()) {
      if (ch == "/" && maybeEnd) {
        state.tokenize.pop();
        break;
      }
      maybeEnd = (ch == "*");
    }
    return "comment";
  }

  function expectExpression(last, newline) {
    return !last || last == "operator" || last == "->" || /[\.\[\{\(,;:]/.test(last) ||
      last == "newstatement" || last == "keyword" || last == "proplabel" ||
      (last == "standalone" && !newline);
  }

  function Context(indented, column, type, align, prev) {
    this.indented = indented;
    this.column = column;
    this.type = type;
    this.align = align;
    this.prev = prev;
  }
  function pushContext(state, col, type) {
    return state.context = new Context(state.indented, col, type, null, state.context);
  }
  function popContext(state) {
    var t = state.context.type;
    if (t == ")" || t == "]" || t == "}")
      state.indented = state.context.indented;
    return state.context = state.context.prev;
  }

  // Interface

  return {
    startState: function(basecolumn) {
      return {
        tokenize: [tokenBase],
        context: new Context((basecolumn || 0) - config.indentUnit, 0, "top", false),
        indented: 0,
        startOfLine: true,
        lastToken: null
      };
    },

    token: function(stream, state) {
      var ctx = state.context;
      if (stream.sol()) {
        if (ctx.align == null) ctx.align = false;
        state.indented = stream.indentation();
        state.startOfLine = true;
        // Automatic semicolon insertion
        if (ctx.type == "statement" && !expectExpression(state.lastToken, true)) {
          popContext(state); ctx = state.context;
        }
      }
      if (stream.eatSpace()) return null;
      curPunc = null;
      var style = state.tokenize[state.tokenize.length-1](stream, state);
      if (style == "comment") return style;
      if (ctx.align == null) ctx.align = true;

      if ((curPunc == ";" || curPunc == ":") && ctx.type == "statement") popContext(state);
      // Handle indentation for {x -> \n ... }
      else if (curPunc == "->" && ctx.type == "statement" && ctx.prev.type == "}") {
        popContext(state);
        state.context.align = false;
      }
      else if (curPunc == "{") pushContext(state, stream.column(), "}");
      else if (curPunc == "[") pushContext(state, stream.column(), "]");
      else if (curPunc == "(") pushContext(state, stream.column(), ")");
      else if (curPunc == "}") {
        while (ctx.type == "statement") ctx = popContext(state);
        if (ctx.type == "}") ctx = popContext(state);
        while (ctx.type == "statement") ctx = popContext(state);
      }
      else if (curPunc == ctx.type) popContext(state);
      else if (ctx.type == "}" || ctx.type == "top" || (ctx.type == "statement" && curPunc == "newstatement"))
        pushContext(state, stream.column(), "statement");
      state.startOfLine = false;
      state.lastToken = curPunc || style;
      return style;
    },

    indent: function(state, textAfter) {
      if (!state.tokenize[state.tokenize.length-1].isBase) return 0;
      var firstChar = textAfter && textAfter.charAt(0), ctx = state.context;
      if (ctx.type == "statement" && !expectExpression(state.lastToken, true)) ctx = ctx.prev;
      var closing = firstChar == ctx.type;
      if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : config.indentUnit);
      else if (ctx.align) return ctx.column + (closing ? 0 : 1);
      else return ctx.indented + (closing ? 0 : config.indentUnit);
    },

    electricChars: "{}",
    closeBrackets: {triples: "'\""},
    fold: "brace"
  };
});

CodeMirror.defineMIME("text/x-groovy", "groovy");

});
codemirror/mode/rust/rust.js000064400000005721151215013500012163 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"), require("../../addon/mode/simple"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror", "../../addon/mode/simple"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineSimpleMode("rust",{
  start: [
    // string and byte string
    {regex: /b?"/, token: "string", next: "string"},
    // raw string and raw byte string
    {regex: /b?r"/, token: "string", next: "string_raw"},
    {regex: /b?r#+"/, token: "string", next: "string_raw_hash"},
    // character
    {regex: /'(?:[^'\\]|\\(?:[nrt0'"]|x[\da-fA-F]{2}|u\{[\da-fA-F]{6}\}))'/, token: "string-2"},
    // byte
    {regex: /b'(?:[^']|\\(?:['\\nrt0]|x[\da-fA-F]{2}))'/, token: "string-2"},

    {regex: /(?:(?:[0-9][0-9_]*)(?:(?:[Ee][+-]?[0-9_]+)|\.[0-9_]+(?:[Ee][+-]?[0-9_]+)?)(?:f32|f64)?)|(?:0(?:b[01_]+|(?:o[0-7_]+)|(?:x[0-9a-fA-F_]+))|(?:[0-9][0-9_]*))(?:u8|u16|u32|u64|i8|i16|i32|i64|isize|usize)?/,
     token: "number"},
    {regex: /(let(?:\s+mut)?|fn|enum|mod|struct|type)(\s+)([a-zA-Z_][a-zA-Z0-9_]*)/, token: ["keyword", null, "def"]},
    {regex: /(?:abstract|alignof|as|box|break|continue|const|crate|do|else|enum|extern|fn|for|final|if|impl|in|loop|macro|match|mod|move|offsetof|override|priv|proc|pub|pure|ref|return|self|sizeof|static|struct|super|trait|type|typeof|unsafe|unsized|use|virtual|where|while|yield)\b/, token: "keyword"},
    {regex: /\b(?:Self|isize|usize|char|bool|u8|u16|u32|u64|f16|f32|f64|i8|i16|i32|i64|str|Option)\b/, token: "atom"},
    {regex: /\b(?:true|false|Some|None|Ok|Err)\b/, token: "builtin"},
    {regex: /\b(fn)(\s+)([a-zA-Z_][a-zA-Z0-9_]*)/,
     token: ["keyword", null ,"def"]},
    {regex: /#!?\[.*\]/, token: "meta"},
    {regex: /\/\/.*/, token: "comment"},
    {regex: /\/\*/, token: "comment", next: "comment"},
    {regex: /[-+\/*=<>!]+/, token: "operator"},
    {regex: /[a-zA-Z_]\w*!/,token: "variable-3"},
    {regex: /[a-zA-Z_]\w*/, token: "variable"},
    {regex: /[\{\[\(]/, indent: true},
    {regex: /[\}\]\)]/, dedent: true}
  ],
  string: [
    {regex: /"/, token: "string", next: "start"},
    {regex: /(?:[^\\"]|\\(?:.|$))*/, token: "string"}
  ],
  string_raw: [
    {regex: /"/, token: "string", next: "start"},
    {regex: /[^"]*/, token: "string"}
  ],
  string_raw_hash: [
    {regex: /"#+/, token: "string", next: "start"},
    {regex: /(?:[^"]|"(?!#))*/, token: "string"}
  ],
  comment: [
    {regex: /.*?\*\//, token: "comment", next: "start"},
    {regex: /.*/, token: "comment"}
  ],
  meta: {
    dontIndentStates: ["comment"],
    electricInput: /^\s*\}$/,
    blockCommentStart: "/*",
    blockCommentEnd: "*/",
    lineComment: "//",
    fold: "brace"
  }
});


CodeMirror.defineMIME("text/x-rustsrc", "rust");
});
codemirror/mode/rust/index.html000064400000002774151215013500012632 0ustar00<!doctype html>

<title>CodeMirror: Rust mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/mode/simple.js"></script>
<script src="rust.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Rust</a>
  </ul>
</div>

<article>
<h2>Rust mode</h2>


<div><textarea id="code" name="code">
// Demo code.

type foo<T> = int;
enum bar {
    some(int, foo<float>),
    none
}

fn check_crate(x: int) {
    let v = 10;
    match foo {
        1 ... 3 {
            print_foo();
            if x {
                blah().to_string();
            }
        }
        (x, y) { "bye" }
        _ { "hi" }
    }
}
</textarea></div>

    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        lineNumbers: true,
        lineWrapping: true,
        indentUnit: 4,
        mode: "rust"
      });
    </script>

    <p><strong>MIME types defined:</strong> <code>text/x-rustsrc</code>.</p>
  </article>
codemirror/mode/rust/test.js000064400000001740151215013500012142 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function() {
  var mode = CodeMirror.getMode({indentUnit: 4}, "rust");
  function MT(name) {test.mode(name, mode, Array.prototype.slice.call(arguments, 1));}

  MT('integer_test',
     '[number 123i32]',
     '[number 123u32]',
     '[number 123_u32]',
     '[number 0xff_u8]',
     '[number 0o70_i16]',
     '[number 0b1111_1111_1001_0000_i32]',
     '[number 0usize]');

  MT('float_test',
     '[number 123.0f64]',
     '[number 0.1f64]',
     '[number 0.1f32]',
     '[number 12E+99_f64]');

  MT('string-literals-test',
     '[string "foo"]',
     '[string r"foo"]',
     '[string "\\"foo\\""]',
     '[string r#""foo""#]',
     '[string "foo #\\"# bar"]',

     '[string b"foo"]',
     '[string br"foo"]',
     '[string b"\\"foo\\""]',
     '[string br#""foo""#]',
     '[string br##"foo #" bar"##]',

     "[string-2 'h']",
     "[string-2 b'h']");

})();
codemirror/mode/erlang/erlang.js000064400000044645151215013500012721 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

/*jshint unused:true, eqnull:true, curly:true, bitwise:true */
/*jshint undef:true, latedef:true, trailing:true */
/*global CodeMirror:true */

// erlang mode.
// tokenizer -> token types -> CodeMirror styles
// tokenizer maintains a parse stack
// indenter uses the parse stack

// TODO indenter:
//   bit syntax
//   old guard/bif/conversion clashes (e.g. "float/1")
//   type/spec/opaque

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMIME("text/x-erlang", "erlang");

CodeMirror.defineMode("erlang", function(cmCfg) {
  "use strict";

/////////////////////////////////////////////////////////////////////////////
// constants

  var typeWords = [
    "-type", "-spec", "-export_type", "-opaque"];

  var keywordWords = [
    "after","begin","catch","case","cond","end","fun","if",
    "let","of","query","receive","try","when"];

  var separatorRE    = /[\->,;]/;
  var separatorWords = [
    "->",";",","];

  var operatorAtomWords = [
    "and","andalso","band","bnot","bor","bsl","bsr","bxor",
    "div","not","or","orelse","rem","xor"];

  var operatorSymbolRE    = /[\+\-\*\/<>=\|:!]/;
  var operatorSymbolWords = [
    "=","+","-","*","/",">",">=","<","=<","=:=","==","=/=","/=","||","<-","!"];

  var openParenRE    = /[<\(\[\{]/;
  var openParenWords = [
    "<<","(","[","{"];

  var closeParenRE    = /[>\)\]\}]/;
  var closeParenWords = [
    "}","]",")",">>"];

  var guardWords = [
    "is_atom","is_binary","is_bitstring","is_boolean","is_float",
    "is_function","is_integer","is_list","is_number","is_pid",
    "is_port","is_record","is_reference","is_tuple",
    "atom","binary","bitstring","boolean","function","integer","list",
    "number","pid","port","record","reference","tuple"];

  var bifWords = [
    "abs","adler32","adler32_combine","alive","apply","atom_to_binary",
    "atom_to_list","binary_to_atom","binary_to_existing_atom",
    "binary_to_list","binary_to_term","bit_size","bitstring_to_list",
    "byte_size","check_process_code","contact_binary","crc32",
    "crc32_combine","date","decode_packet","delete_module",
    "disconnect_node","element","erase","exit","float","float_to_list",
    "garbage_collect","get","get_keys","group_leader","halt","hd",
    "integer_to_list","internal_bif","iolist_size","iolist_to_binary",
    "is_alive","is_atom","is_binary","is_bitstring","is_boolean",
    "is_float","is_function","is_integer","is_list","is_number","is_pid",
    "is_port","is_process_alive","is_record","is_reference","is_tuple",
    "length","link","list_to_atom","list_to_binary","list_to_bitstring",
    "list_to_existing_atom","list_to_float","list_to_integer",
    "list_to_pid","list_to_tuple","load_module","make_ref","module_loaded",
    "monitor_node","node","node_link","node_unlink","nodes","notalive",
    "now","open_port","pid_to_list","port_close","port_command",
    "port_connect","port_control","pre_loaded","process_flag",
    "process_info","processes","purge_module","put","register",
    "registered","round","self","setelement","size","spawn","spawn_link",
    "spawn_monitor","spawn_opt","split_binary","statistics",
    "term_to_binary","time","throw","tl","trunc","tuple_size",
    "tuple_to_list","unlink","unregister","whereis"];

// upper case: [A-Z] [Ø-Þ] [À-Ö]
// lower case: [a-z] [ß-ö] [ø-ÿ]
  var anumRE       = /[\w@Ø-ÞÀ-Öß-öø-ÿ]/;
  var escapesRE    =
    /[0-7]{1,3}|[bdefnrstv\\"']|\^[a-zA-Z]|x[0-9a-zA-Z]{2}|x{[0-9a-zA-Z]+}/;

/////////////////////////////////////////////////////////////////////////////
// tokenizer

  function tokenizer(stream,state) {
    // in multi-line string
    if (state.in_string) {
      state.in_string = (!doubleQuote(stream));
      return rval(state,stream,"string");
    }

    // in multi-line atom
    if (state.in_atom) {
      state.in_atom = (!singleQuote(stream));
      return rval(state,stream,"atom");
    }

    // whitespace
    if (stream.eatSpace()) {
      return rval(state,stream,"whitespace");
    }

    // attributes and type specs
    if (!peekToken(state) &&
        stream.match(/-\s*[a-zß-öø-ÿ][\wØ-ÞÀ-Öß-öø-ÿ]*/)) {
      if (is_member(stream.current(),typeWords)) {
        return rval(state,stream,"type");
      }else{
        return rval(state,stream,"attribute");
      }
    }

    var ch = stream.next();

    // comment
    if (ch == '%') {
      stream.skipToEnd();
      return rval(state,stream,"comment");
    }

    // colon
    if (ch == ":") {
      return rval(state,stream,"colon");
    }

    // macro
    if (ch == '?') {
      stream.eatSpace();
      stream.eatWhile(anumRE);
      return rval(state,stream,"macro");
    }

    // record
    if (ch == "#") {
      stream.eatSpace();
      stream.eatWhile(anumRE);
      return rval(state,stream,"record");
    }

    // dollar escape
    if (ch == "$") {
      if (stream.next() == "\\" && !stream.match(escapesRE)) {
        return rval(state,stream,"error");
      }
      return rval(state,stream,"number");
    }

    // dot
    if (ch == ".") {
      return rval(state,stream,"dot");
    }

    // quoted atom
    if (ch == '\'') {
      if (!(state.in_atom = (!singleQuote(stream)))) {
        if (stream.match(/\s*\/\s*[0-9]/,false)) {
          stream.match(/\s*\/\s*[0-9]/,true);
          return rval(state,stream,"fun");      // 'f'/0 style fun
        }
        if (stream.match(/\s*\(/,false) || stream.match(/\s*:/,false)) {
          return rval(state,stream,"function");
        }
      }
      return rval(state,stream,"atom");
    }

    // string
    if (ch == '"') {
      state.in_string = (!doubleQuote(stream));
      return rval(state,stream,"string");
    }

    // variable
    if (/[A-Z_Ø-ÞÀ-Ö]/.test(ch)) {
      stream.eatWhile(anumRE);
      return rval(state,stream,"variable");
    }

    // atom/keyword/BIF/function
    if (/[a-z_ß-öø-ÿ]/.test(ch)) {
      stream.eatWhile(anumRE);

      if (stream.match(/\s*\/\s*[0-9]/,false)) {
        stream.match(/\s*\/\s*[0-9]/,true);
        return rval(state,stream,"fun");      // f/0 style fun
      }

      var w = stream.current();

      if (is_member(w,keywordWords)) {
        return rval(state,stream,"keyword");
      }else if (is_member(w,operatorAtomWords)) {
        return rval(state,stream,"operator");
      }else if (stream.match(/\s*\(/,false)) {
        // 'put' and 'erlang:put' are bifs, 'foo:put' is not
        if (is_member(w,bifWords) &&
            ((peekToken(state).token != ":") ||
             (peekToken(state,2).token == "erlang"))) {
          return rval(state,stream,"builtin");
        }else if (is_member(w,guardWords)) {
          return rval(state,stream,"guard");
        }else{
          return rval(state,stream,"function");
        }
      }else if (lookahead(stream) == ":") {
        if (w == "erlang") {
          return rval(state,stream,"builtin");
        } else {
          return rval(state,stream,"function");
        }
      }else if (is_member(w,["true","false"])) {
        return rval(state,stream,"boolean");
      }else{
        return rval(state,stream,"atom");
      }
    }

    // number
    var digitRE      = /[0-9]/;
    var radixRE      = /[0-9a-zA-Z]/;         // 36#zZ style int
    if (digitRE.test(ch)) {
      stream.eatWhile(digitRE);
      if (stream.eat('#')) {                // 36#aZ  style integer
        if (!stream.eatWhile(radixRE)) {
          stream.backUp(1);                 //"36#" - syntax error
        }
      } else if (stream.eat('.')) {       // float
        if (!stream.eatWhile(digitRE)) {
          stream.backUp(1);        // "3." - probably end of function
        } else {
          if (stream.eat(/[eE]/)) {        // float with exponent
            if (stream.eat(/[-+]/)) {
              if (!stream.eatWhile(digitRE)) {
                stream.backUp(2);            // "2e-" - syntax error
              }
            } else {
              if (!stream.eatWhile(digitRE)) {
                stream.backUp(1);            // "2e" - syntax error
              }
            }
          }
        }
      }
      return rval(state,stream,"number");   // normal integer
    }

    // open parens
    if (nongreedy(stream,openParenRE,openParenWords)) {
      return rval(state,stream,"open_paren");
    }

    // close parens
    if (nongreedy(stream,closeParenRE,closeParenWords)) {
      return rval(state,stream,"close_paren");
    }

    // separators
    if (greedy(stream,separatorRE,separatorWords)) {
      return rval(state,stream,"separator");
    }

    // operators
    if (greedy(stream,operatorSymbolRE,operatorSymbolWords)) {
      return rval(state,stream,"operator");
    }

    return rval(state,stream,null);
  }

/////////////////////////////////////////////////////////////////////////////
// utilities
  function nongreedy(stream,re,words) {
    if (stream.current().length == 1 && re.test(stream.current())) {
      stream.backUp(1);
      while (re.test(stream.peek())) {
        stream.next();
        if (is_member(stream.current(),words)) {
          return true;
        }
      }
      stream.backUp(stream.current().length-1);
    }
    return false;
  }

  function greedy(stream,re,words) {
    if (stream.current().length == 1 && re.test(stream.current())) {
      while (re.test(stream.peek())) {
        stream.next();
      }
      while (0 < stream.current().length) {
        if (is_member(stream.current(),words)) {
          return true;
        }else{
          stream.backUp(1);
        }
      }
      stream.next();
    }
    return false;
  }

  function doubleQuote(stream) {
    return quote(stream, '"', '\\');
  }

  function singleQuote(stream) {
    return quote(stream,'\'','\\');
  }

  function quote(stream,quoteChar,escapeChar) {
    while (!stream.eol()) {
      var ch = stream.next();
      if (ch == quoteChar) {
        return true;
      }else if (ch == escapeChar) {
        stream.next();
      }
    }
    return false;
  }

  function lookahead(stream) {
    var m = stream.match(/([\n\s]+|%[^\n]*\n)*(.)/,false);
    return m ? m.pop() : "";
  }

  function is_member(element,list) {
    return (-1 < list.indexOf(element));
  }

  function rval(state,stream,type) {

    // parse stack
    pushToken(state,realToken(type,stream));

    // map erlang token type to CodeMirror style class
    //     erlang             -> CodeMirror tag
    switch (type) {
      case "atom":        return "atom";
      case "attribute":   return "attribute";
      case "boolean":     return "atom";
      case "builtin":     return "builtin";
      case "close_paren": return null;
      case "colon":       return null;
      case "comment":     return "comment";
      case "dot":         return null;
      case "error":       return "error";
      case "fun":         return "meta";
      case "function":    return "tag";
      case "guard":       return "property";
      case "keyword":     return "keyword";
      case "macro":       return "variable-2";
      case "number":      return "number";
      case "open_paren":  return null;
      case "operator":    return "operator";
      case "record":      return "bracket";
      case "separator":   return null;
      case "string":      return "string";
      case "type":        return "def";
      case "variable":    return "variable";
      default:            return null;
    }
  }

  function aToken(tok,col,ind,typ) {
    return {token:  tok,
            column: col,
            indent: ind,
            type:   typ};
  }

  function realToken(type,stream) {
    return aToken(stream.current(),
                 stream.column(),
                 stream.indentation(),
                 type);
  }

  function fakeToken(type) {
    return aToken(type,0,0,type);
  }

  function peekToken(state,depth) {
    var len = state.tokenStack.length;
    var dep = (depth ? depth : 1);

    if (len < dep) {
      return false;
    }else{
      return state.tokenStack[len-dep];
    }
  }

  function pushToken(state,token) {

    if (!(token.type == "comment" || token.type == "whitespace")) {
      state.tokenStack = maybe_drop_pre(state.tokenStack,token);
      state.tokenStack = maybe_drop_post(state.tokenStack);
    }
  }

  function maybe_drop_pre(s,token) {
    var last = s.length-1;

    if (0 < last && s[last].type === "record" && token.type === "dot") {
      s.pop();
    }else if (0 < last && s[last].type === "group") {
      s.pop();
      s.push(token);
    }else{
      s.push(token);
    }
    return s;
  }

  function maybe_drop_post(s) {
    var last = s.length-1;

    if (s[last].type === "dot") {
      return [];
    }
    if (s[last].type === "fun" && s[last-1].token === "fun") {
      return s.slice(0,last-1);
    }
    switch (s[s.length-1].token) {
      case "}":    return d(s,{g:["{"]});
      case "]":    return d(s,{i:["["]});
      case ")":    return d(s,{i:["("]});
      case ">>":   return d(s,{i:["<<"]});
      case "end":  return d(s,{i:["begin","case","fun","if","receive","try"]});
      case ",":    return d(s,{e:["begin","try","when","->",
                                  ",","(","[","{","<<"]});
      case "->":   return d(s,{r:["when"],
                               m:["try","if","case","receive"]});
      case ";":    return d(s,{E:["case","fun","if","receive","try","when"]});
      case "catch":return d(s,{e:["try"]});
      case "of":   return d(s,{e:["case"]});
      case "after":return d(s,{e:["receive","try"]});
      default:     return s;
    }
  }

  function d(stack,tt) {
    // stack is a stack of Token objects.
    // tt is an object; {type:tokens}
    // type is a char, tokens is a list of token strings.
    // The function returns (possibly truncated) stack.
    // It will descend the stack, looking for a Token such that Token.token
    //  is a member of tokens. If it does not find that, it will normally (but
    //  see "E" below) return stack. If it does find a match, it will remove
    //  all the Tokens between the top and the matched Token.
    // If type is "m", that is all it does.
    // If type is "i", it will also remove the matched Token and the top Token.
    // If type is "g", like "i", but add a fake "group" token at the top.
    // If type is "r", it will remove the matched Token, but not the top Token.
    // If type is "e", it will keep the matched Token but not the top Token.
    // If type is "E", it behaves as for type "e", except if there is no match,
    //  in which case it will return an empty stack.

    for (var type in tt) {
      var len = stack.length-1;
      var tokens = tt[type];
      for (var i = len-1; -1 < i ; i--) {
        if (is_member(stack[i].token,tokens)) {
          var ss = stack.slice(0,i);
          switch (type) {
              case "m": return ss.concat(stack[i]).concat(stack[len]);
              case "r": return ss.concat(stack[len]);
              case "i": return ss;
              case "g": return ss.concat(fakeToken("group"));
              case "E": return ss.concat(stack[i]);
              case "e": return ss.concat(stack[i]);
          }
        }
      }
    }
    return (type == "E" ? [] : stack);
  }

/////////////////////////////////////////////////////////////////////////////
// indenter

  function indenter(state,textAfter) {
    var t;
    var unit = cmCfg.indentUnit;
    var wordAfter = wordafter(textAfter);
    var currT = peekToken(state,1);
    var prevT = peekToken(state,2);

    if (state.in_string || state.in_atom) {
      return CodeMirror.Pass;
    }else if (!prevT) {
      return 0;
    }else if (currT.token == "when") {
      return currT.column+unit;
    }else if (wordAfter === "when" && prevT.type === "function") {
      return prevT.indent+unit;
    }else if (wordAfter === "(" && currT.token === "fun") {
      return  currT.column+3;
    }else if (wordAfter === "catch" && (t = getToken(state,["try"]))) {
      return t.column;
    }else if (is_member(wordAfter,["end","after","of"])) {
      t = getToken(state,["begin","case","fun","if","receive","try"]);
      return t ? t.column : CodeMirror.Pass;
    }else if (is_member(wordAfter,closeParenWords)) {
      t = getToken(state,openParenWords);
      return t ? t.column : CodeMirror.Pass;
    }else if (is_member(currT.token,[",","|","||"]) ||
              is_member(wordAfter,[",","|","||"])) {
      t = postcommaToken(state);
      return t ? t.column+t.token.length : unit;
    }else if (currT.token == "->") {
      if (is_member(prevT.token, ["receive","case","if","try"])) {
        return prevT.column+unit+unit;
      }else{
        return prevT.column+unit;
      }
    }else if (is_member(currT.token,openParenWords)) {
      return currT.column+currT.token.length;
    }else{
      t = defaultToken(state);
      return truthy(t) ? t.column+unit : 0;
    }
  }

  function wordafter(str) {
    var m = str.match(/,|[a-z]+|\}|\]|\)|>>|\|+|\(/);

    return truthy(m) && (m.index === 0) ? m[0] : "";
  }

  function postcommaToken(state) {
    var objs = state.tokenStack.slice(0,-1);
    var i = getTokenIndex(objs,"type",["open_paren"]);

    return truthy(objs[i]) ? objs[i] : false;
  }

  function defaultToken(state) {
    var objs = state.tokenStack;
    var stop = getTokenIndex(objs,"type",["open_paren","separator","keyword"]);
    var oper = getTokenIndex(objs,"type",["operator"]);

    if (truthy(stop) && truthy(oper) && stop < oper) {
      return objs[stop+1];
    } else if (truthy(stop)) {
      return objs[stop];
    } else {
      return false;
    }
  }

  function getToken(state,tokens) {
    var objs = state.tokenStack;
    var i = getTokenIndex(objs,"token",tokens);

    return truthy(objs[i]) ? objs[i] : false;
  }

  function getTokenIndex(objs,propname,propvals) {

    for (var i = objs.length-1; -1 < i ; i--) {
      if (is_member(objs[i][propname],propvals)) {
        return i;
      }
    }
    return false;
  }

  function truthy(x) {
    return (x !== false) && (x != null);
  }

/////////////////////////////////////////////////////////////////////////////
// this object defines the mode

  return {
    startState:
      function() {
        return {tokenStack: [],
                in_string:  false,
                in_atom:    false};
      },

    token:
      function(stream, state) {
        return tokenizer(stream, state);
      },

    indent:
      function(state, textAfter) {
        return indenter(state,textAfter);
      },

    lineComment: "%"
  };
});

});
codemirror/mode/erlang/index.html000064400000004170151215013500013075 0ustar00<!doctype html>

<title>CodeMirror: Erlang mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<link rel="stylesheet" href="../../theme/erlang-dark.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="erlang.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Erlang</a>
  </ul>
</div>

<article>
<h2>Erlang mode</h2>
<form><textarea id="code" name="code">
%% -*- mode: erlang; erlang-indent-level: 2 -*-
%%% Created :  7 May 2012 by mats cronqvist <masse@klarna.com>

%% @doc
%% Demonstrates how to print a record.
%% @end

-module('ex').
-author('mats cronqvist').
-export([demo/0,
         rec_info/1]).

-record(demo,{a="One",b="Two",c="Three",d="Four"}).

rec_info(demo) -> record_info(fields,demo).

demo() -> expand_recs(?MODULE,#demo{a="A",b="BB"}).

expand_recs(M,List) when is_list(List) ->
  [expand_recs(M,L)||L<-List];
expand_recs(M,Tup) when is_tuple(Tup) ->
  case tuple_size(Tup) of
    L when L < 1 -> Tup;
    L ->
      try
        Fields = M:rec_info(element(1,Tup)),
        L = length(Fields)+1,
        lists:zip(Fields,expand_recs(M,tl(tuple_to_list(Tup))))
      catch
        _:_ -> list_to_tuple(expand_recs(M,tuple_to_list(Tup)))
      end
  end;
expand_recs(_,Term) ->
  Term.
</textarea></form>

    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        lineNumbers: true,
        matchBrackets: true,
        extraKeys: {"Tab":  "indentAuto"},
        theme: "erlang-dark"
      });
    </script>

    <p><strong>MIME types defined:</strong> <code>text/x-erlang</code>.</p>
  </article>
codemirror/mode/tiki/tiki.js000064400000020452151215013500012067 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode('tiki', function(config) {
  function inBlock(style, terminator, returnTokenizer) {
    return function(stream, state) {
      while (!stream.eol()) {
        if (stream.match(terminator)) {
          state.tokenize = inText;
          break;
        }
        stream.next();
      }

      if (returnTokenizer) state.tokenize = returnTokenizer;

      return style;
    };
  }

  function inLine(style) {
    return function(stream, state) {
      while(!stream.eol()) {
        stream.next();
      }
      state.tokenize = inText;
      return style;
    };
  }

  function inText(stream, state) {
    function chain(parser) {
      state.tokenize = parser;
      return parser(stream, state);
    }

    var sol = stream.sol();
    var ch = stream.next();

    //non start of line
    switch (ch) { //switch is generally much faster than if, so it is used here
    case "{": //plugin
      stream.eat("/");
      stream.eatSpace();
      stream.eatWhile(/[^\s\u00a0=\"\'\/?(}]/);
      state.tokenize = inPlugin;
      return "tag";
    case "_": //bold
      if (stream.eat("_"))
        return chain(inBlock("strong", "__", inText));
      break;
    case "'": //italics
      if (stream.eat("'"))
        return chain(inBlock("em", "''", inText));
      break;
    case "(":// Wiki Link
      if (stream.eat("("))
        return chain(inBlock("variable-2", "))", inText));
      break;
    case "[":// Weblink
      return chain(inBlock("variable-3", "]", inText));
      break;
    case "|": //table
      if (stream.eat("|"))
        return chain(inBlock("comment", "||"));
      break;
    case "-":
      if (stream.eat("=")) {//titleBar
        return chain(inBlock("header string", "=-", inText));
      } else if (stream.eat("-")) {//deleted
        return chain(inBlock("error tw-deleted", "--", inText));
      }
      break;
    case "=": //underline
      if (stream.match("=="))
        return chain(inBlock("tw-underline", "===", inText));
      break;
    case ":":
      if (stream.eat(":"))
        return chain(inBlock("comment", "::"));
      break;
    case "^": //box
      return chain(inBlock("tw-box", "^"));
      break;
    case "~": //np
      if (stream.match("np~"))
        return chain(inBlock("meta", "~/np~"));
      break;
    }

    //start of line types
    if (sol) {
      switch (ch) {
      case "!": //header at start of line
        if (stream.match('!!!!!')) {
          return chain(inLine("header string"));
        } else if (stream.match('!!!!')) {
          return chain(inLine("header string"));
        } else if (stream.match('!!!')) {
          return chain(inLine("header string"));
        } else if (stream.match('!!')) {
          return chain(inLine("header string"));
        } else {
          return chain(inLine("header string"));
        }
        break;
      case "*": //unordered list line item, or <li /> at start of line
      case "#": //ordered list line item, or <li /> at start of line
      case "+": //ordered list line item, or <li /> at start of line
        return chain(inLine("tw-listitem bracket"));
        break;
      }
    }

    //stream.eatWhile(/[&{]/); was eating up plugins, turned off to act less like html and more like tiki
    return null;
  }

  var indentUnit = config.indentUnit;

  // Return variables for tokenizers
  var pluginName, type;
  function inPlugin(stream, state) {
    var ch = stream.next();
    var peek = stream.peek();

    if (ch == "}") {
      state.tokenize = inText;
      //type = ch == ")" ? "endPlugin" : "selfclosePlugin"; inPlugin
      return "tag";
    } else if (ch == "(" || ch == ")") {
      return "bracket";
    } else if (ch == "=") {
      type = "equals";

      if (peek == ">") {
        ch = stream.next();
        peek = stream.peek();
      }

      //here we detect values directly after equal character with no quotes
      if (!/[\'\"]/.test(peek)) {
        state.tokenize = inAttributeNoQuote();
      }
      //end detect values

      return "operator";
    } else if (/[\'\"]/.test(ch)) {
      state.tokenize = inAttribute(ch);
      return state.tokenize(stream, state);
    } else {
      stream.eatWhile(/[^\s\u00a0=\"\'\/?]/);
      return "keyword";
    }
  }

  function inAttribute(quote) {
    return function(stream, state) {
      while (!stream.eol()) {
        if (stream.next() == quote) {
          state.tokenize = inPlugin;
          break;
        }
      }
      return "string";
    };
  }

  function inAttributeNoQuote() {
    return function(stream, state) {
      while (!stream.eol()) {
        var ch = stream.next();
        var peek = stream.peek();
        if (ch == " " || ch == "," || /[ )}]/.test(peek)) {
      state.tokenize = inPlugin;
      break;
    }
  }
  return "string";
};
                     }

var curState, setStyle;
function pass() {
  for (var i = arguments.length - 1; i >= 0; i--) curState.cc.push(arguments[i]);
}

function cont() {
  pass.apply(null, arguments);
  return true;
}

function pushContext(pluginName, startOfLine) {
  var noIndent = curState.context && curState.context.noIndent;
  curState.context = {
    prev: curState.context,
    pluginName: pluginName,
    indent: curState.indented,
    startOfLine: startOfLine,
    noIndent: noIndent
  };
}

function popContext() {
  if (curState.context) curState.context = curState.context.prev;
}

function element(type) {
  if (type == "openPlugin") {curState.pluginName = pluginName; return cont(attributes, endplugin(curState.startOfLine));}
  else if (type == "closePlugin") {
    var err = false;
    if (curState.context) {
      err = curState.context.pluginName != pluginName;
      popContext();
    } else {
      err = true;
    }
    if (err) setStyle = "error";
    return cont(endcloseplugin(err));
  }
  else if (type == "string") {
    if (!curState.context || curState.context.name != "!cdata") pushContext("!cdata");
    if (curState.tokenize == inText) popContext();
    return cont();
  }
  else return cont();
}

function endplugin(startOfLine) {
  return function(type) {
    if (
      type == "selfclosePlugin" ||
        type == "endPlugin"
    )
      return cont();
    if (type == "endPlugin") {pushContext(curState.pluginName, startOfLine); return cont();}
    return cont();
  };
}

function endcloseplugin(err) {
  return function(type) {
    if (err) setStyle = "error";
    if (type == "endPlugin") return cont();
    return pass();
  };
}

function attributes(type) {
  if (type == "keyword") {setStyle = "attribute"; return cont(attributes);}
  if (type == "equals") return cont(attvalue, attributes);
  return pass();
}
function attvalue(type) {
  if (type == "keyword") {setStyle = "string"; return cont();}
  if (type == "string") return cont(attvaluemaybe);
  return pass();
}
function attvaluemaybe(type) {
  if (type == "string") return cont(attvaluemaybe);
  else return pass();
}
return {
  startState: function() {
    return {tokenize: inText, cc: [], indented: 0, startOfLine: true, pluginName: null, context: null};
  },
  token: function(stream, state) {
    if (stream.sol()) {
      state.startOfLine = true;
      state.indented = stream.indentation();
    }
    if (stream.eatSpace()) return null;

    setStyle = type = pluginName = null;
    var style = state.tokenize(stream, state);
    if ((style || type) && style != "comment") {
      curState = state;
      while (true) {
        var comb = state.cc.pop() || element;
        if (comb(type || style)) break;
      }
    }
    state.startOfLine = false;
    return setStyle || style;
  },
  indent: function(state, textAfter) {
    var context = state.context;
    if (context && context.noIndent) return 0;
    if (context && /^{\//.test(textAfter))
        context = context.prev;
        while (context && !context.startOfLine)
          context = context.prev;
        if (context) return context.indent + indentUnit;
        else return 0;
       },
    electricChars: "/"
  };
});

CodeMirror.defineMIME("text/tiki", "tiki");

});
codemirror/mode/tiki/index.html000064400000003321151215013500012562 0ustar00<!doctype html>

<title>CodeMirror: Tiki wiki mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<link rel="stylesheet" href="tiki.css">
<script src="../../lib/codemirror.js"></script>
<script src="tiki.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Tiki wiki</a>
  </ul>
</div>

<article>
<h2>Tiki wiki mode</h2>


<div><textarea id="code" name="code">
Headings
!Header 1
!!Header 2
!!!Header 3
!!!!Header 4
!!!!!Header 5
!!!!!!Header 6

Styling
-=titlebar=-
^^ Box on multi
lines
of content^^
__bold__
''italic''
===underline===
::center::
--Line Through--

Operators
~np~No parse~/np~

Link
[link|desc|nocache]

Wiki
((Wiki))
((Wiki|desc))
((Wiki|desc|timeout))

Table
||row1 col1|row1 col2|row1 col3
row2 col1|row2 col2|row2 col3
row3 col1|row3 col2|row3 col3||

Lists:
*bla
**bla-1
++continue-bla-1
***bla-2
++continue-bla-1
*bla
+continue-bla
#bla
** tra-la-la
+continue-bla
#bla

Plugin (standard):
{PLUGIN(attr="my attr")}
Plugin Body
{PLUGIN}

Plugin (inline):
{plugin attr="my attr"}
</textarea></div>

<script type="text/javascript">
	var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        mode: 'tiki',      
        lineNumbers: true
    });
</script>

</article>
codemirror/mode/tiki/tiki.css000064400000000667151215013500012251 0ustar00.cm-tw-syntaxerror {
	color: #FFF;
	background-color: #900;
}

.cm-tw-deleted {
	text-decoration: line-through;
}

.cm-tw-header5 {
	font-weight: bold;
}
.cm-tw-listitem:first-child { /*Added first child to fix duplicate padding when highlighting*/
	padding-left: 10px;
}

.cm-tw-box {
	border-top-width: 0px !important;
	border-style: solid;
	border-width: 1px;
	border-color: inherit;
}

.cm-tw-underline {
	text-decoration: underline;
}codemirror/mode/rpm/rpm.js000064400000007277151215013500011575 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("rpm-changes", function() {
  var headerSeperator = /^-+$/;
  var headerLine = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)  ?\d{1,2} \d{2}:\d{2}(:\d{2})? [A-Z]{3,4} \d{4} - /;
  var simpleEmail = /^[\w+.-]+@[\w.-]+/;

  return {
    token: function(stream) {
      if (stream.sol()) {
        if (stream.match(headerSeperator)) { return 'tag'; }
        if (stream.match(headerLine)) { return 'tag'; }
      }
      if (stream.match(simpleEmail)) { return 'string'; }
      stream.next();
      return null;
    }
  };
});

CodeMirror.defineMIME("text/x-rpm-changes", "rpm-changes");

// Quick and dirty spec file highlighting

CodeMirror.defineMode("rpm-spec", function() {
  var arch = /^(i386|i586|i686|x86_64|ppc64le|ppc64|ppc|ia64|s390x|s390|sparc64|sparcv9|sparc|noarch|alphaev6|alpha|hppa|mipsel)/;

  var preamble = /^[a-zA-Z0-9()]+:/;
  var section = /^%(debug_package|package|description|prep|build|install|files|clean|changelog|preinstall|preun|postinstall|postun|pretrans|posttrans|pre|post|triggerin|triggerun|verifyscript|check|triggerpostun|triggerprein|trigger)/;
  var control_flow_complex = /^%(ifnarch|ifarch|if)/; // rpm control flow macros
  var control_flow_simple = /^%(else|endif)/; // rpm control flow macros
  var operators = /^(\!|\?|\<\=|\<|\>\=|\>|\=\=|\&\&|\|\|)/; // operators in control flow macros

  return {
    startState: function () {
        return {
          controlFlow: false,
          macroParameters: false,
          section: false
        };
    },
    token: function (stream, state) {
      var ch = stream.peek();
      if (ch == "#") { stream.skipToEnd(); return "comment"; }

      if (stream.sol()) {
        if (stream.match(preamble)) { return "header"; }
        if (stream.match(section)) { return "atom"; }
      }

      if (stream.match(/^\$\w+/)) { return "def"; } // Variables like '$RPM_BUILD_ROOT'
      if (stream.match(/^\$\{\w+\}/)) { return "def"; } // Variables like '${RPM_BUILD_ROOT}'

      if (stream.match(control_flow_simple)) { return "keyword"; }
      if (stream.match(control_flow_complex)) {
        state.controlFlow = true;
        return "keyword";
      }
      if (state.controlFlow) {
        if (stream.match(operators)) { return "operator"; }
        if (stream.match(/^(\d+)/)) { return "number"; }
        if (stream.eol()) { state.controlFlow = false; }
      }

      if (stream.match(arch)) {
        if (stream.eol()) { state.controlFlow = false; }
        return "number";
      }

      // Macros like '%make_install' or '%attr(0775,root,root)'
      if (stream.match(/^%[\w]+/)) {
        if (stream.match(/^\(/)) { state.macroParameters = true; }
        return "keyword";
      }
      if (state.macroParameters) {
        if (stream.match(/^\d+/)) { return "number";}
        if (stream.match(/^\)/)) {
          state.macroParameters = false;
          return "keyword";
        }
      }

      // Macros like '%{defined fedora}'
      if (stream.match(/^%\{\??[\w \-\:\!]+\}/)) {
        if (stream.eol()) { state.controlFlow = false; }
        return "def";
      }

      //TODO: Include bash script sub-parser (CodeMirror supports that)
      stream.next();
      return null;
    }
  };
});

CodeMirror.defineMIME("text/x-rpm-spec", "rpm-spec");

});
codemirror/mode/rpm/changes/index.html000064400000004204151215013500014031 0ustar00<!doctype html>

<title>CodeMirror: RPM changes mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

    <link rel="stylesheet" href="../../../lib/codemirror.css">
    <script src="../../../lib/codemirror.js"></script>
    <script src="changes.js"></script>
    <link rel="stylesheet" href="../../../doc/docs.css">
    <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>

<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../../doc/logo.png"></a>

  <ul>
    <li><a href="../../../index.html">Home</a>
    <li><a href="../../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../../index.html">Language modes</a>
    <li><a class=active href="#">RPM changes</a>
  </ul>
</div>

<article>
<h2>RPM changes mode</h2>

    <div><textarea id="code" name="code">
-------------------------------------------------------------------
Tue Oct 18 13:58:40 UTC 2011 - misterx@example.com

- Update to r60.3
- Fixes bug in the reflect package
  * disallow Interface method on Value obtained via unexported name

-------------------------------------------------------------------
Thu Oct  6 08:14:24 UTC 2011 - misterx@example.com

- Update to r60.2
- Fixes memory leak in certain map types

-------------------------------------------------------------------
Wed Oct  5 14:34:10 UTC 2011 - misterx@example.com

- Tweaks for gdb debugging
- go.spec changes:
  - move %go_arch definition to %prep section
  - pass correct location of go specific gdb pretty printer and
    functions to cpp as HOST_EXTRA_CFLAGS macro
  - install go gdb functions & printer
- gdb-printer.patch
  - patch linker (src/cmd/ld/dwarf.c) to emit correct location of go
    gdb functions and pretty printer
</textarea></div>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        mode: {name: "changes"},
        lineNumbers: true,
        indentUnit: 4
      });
    </script>

    <p><strong>MIME types defined:</strong> <code>text/x-rpm-changes</code>.</p>
</article>
codemirror/mode/rpm/index.html000064400000011017151215013500012421 0ustar00<!doctype html>

<title>CodeMirror: RPM changes mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

    <link rel="stylesheet" href="../../lib/codemirror.css">
    <script src="../../lib/codemirror.js"></script>
    <script src="rpm.js"></script>
    <link rel="stylesheet" href="../../doc/docs.css">
    <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>

<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">RPM</a>
  </ul>
</div>

<article>
<h2>RPM changes mode</h2>

    <div><textarea id="code" name="code">
-------------------------------------------------------------------
Tue Oct 18 13:58:40 UTC 2011 - misterx@example.com

- Update to r60.3
- Fixes bug in the reflect package
  * disallow Interface method on Value obtained via unexported name

-------------------------------------------------------------------
Thu Oct  6 08:14:24 UTC 2011 - misterx@example.com

- Update to r60.2
- Fixes memory leak in certain map types

-------------------------------------------------------------------
Wed Oct  5 14:34:10 UTC 2011 - misterx@example.com

- Tweaks for gdb debugging
- go.spec changes:
  - move %go_arch definition to %prep section
  - pass correct location of go specific gdb pretty printer and
    functions to cpp as HOST_EXTRA_CFLAGS macro
  - install go gdb functions & printer
- gdb-printer.patch
  - patch linker (src/cmd/ld/dwarf.c) to emit correct location of go
    gdb functions and pretty printer
</textarea></div>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        mode: {name: "rpm-changes"},
        lineNumbers: true,
        indentUnit: 4
      });
    </script>

<h2>RPM spec mode</h2>
    
    <div><textarea id="code2" name="code2">
#
# spec file for package minidlna
#
# Copyright (c) 2011, Sascha Peilicke <saschpe@gmx.de>
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon. The license for this file, and modifications and additions to the
# file, is the same license as for the pristine package itself (unless the
# license for the pristine package is not an Open Source License, in which
# case the license is the MIT License). An "Open Source License" is a
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.


Name:           libupnp6
Version:        1.6.13
Release:        0
Summary:        Portable Universal Plug and Play (UPnP) SDK
Group:          System/Libraries
License:        BSD-3-Clause
Url:            http://sourceforge.net/projects/pupnp/
Source0:        http://downloads.sourceforge.net/pupnp/libupnp-%{version}.tar.bz2
BuildRoot:      %{_tmppath}/%{name}-%{version}-build

%description
The portable Universal Plug and Play (UPnP) SDK provides support for building
UPnP-compliant control points, devices, and bridges on several operating
systems.

%package -n libupnp-devel
Summary:        Portable Universal Plug and Play (UPnP) SDK
Group:          Development/Libraries/C and C++
Provides:       pkgconfig(libupnp)
Requires:       %{name} = %{version}

%description -n libupnp-devel
The portable Universal Plug and Play (UPnP) SDK provides support for building
UPnP-compliant control points, devices, and bridges on several operating
systems.

%prep
%setup -n libupnp-%{version}

%build
%configure --disable-static
make %{?_smp_mflags}

%install
%makeinstall
find %{buildroot} -type f -name '*.la' -exec rm -f {} ';'

%post -p /sbin/ldconfig

%postun -p /sbin/ldconfig

%files
%defattr(-,root,root,-)
%doc ChangeLog NEWS README TODO
%{_libdir}/libixml.so.*
%{_libdir}/libthreadutil.so.*
%{_libdir}/libupnp.so.*

%files -n libupnp-devel
%defattr(-,root,root,-)
%{_libdir}/pkgconfig/libupnp.pc
%{_libdir}/libixml.so
%{_libdir}/libthreadutil.so
%{_libdir}/libupnp.so
%{_includedir}/upnp/

%changelog</textarea></div>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code2"), {
        mode: {name: "rpm-spec"},
        lineNumbers: true,
        indentUnit: 4
      });
    </script>

    <p><strong>MIME types defined:</strong> <code>text/x-rpm-spec</code>, <code>text/x-rpm-changes</code>.</p>
</article>
codemirror/mode/livescript/index.html000064400000023163151215013500014014 0ustar00<!doctype html>

<title>CodeMirror: LiveScript mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<link rel="stylesheet" href="../../theme/solarized.css">
<script src="../../lib/codemirror.js"></script>
<script src="livescript.js"></script>
<style>.CodeMirror {font-size: 80%;border-top: 1px solid silver; border-bottom: 1px solid silver;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">LiveScript</a>
  </ul>
</div>

<article>
<h2>LiveScript mode</h2>
<form><textarea id="code" name="code">
# LiveScript mode for CodeMirror
# The following script, prelude.ls, is used to
# demonstrate LiveScript mode for CodeMirror.
#   https://github.com/gkz/prelude-ls

export objToFunc = objToFunc = (obj) ->
  (key) -> obj[key]

export each = (f, xs) -->
  if typeof! xs is \Object
    for , x of xs then f x
  else
    for x in xs then f x
  xs

export map = (f, xs) -->
  f = objToFunc f if typeof! f isnt \Function
  type = typeof! xs
  if type is \Object
    {[key, f x] for key, x of xs}
  else
    result = [f x for x in xs]
    if type is \String then result * '' else result

export filter = (f, xs) -->
  f = objToFunc f if typeof! f isnt \Function
  type = typeof! xs
  if type is \Object
    {[key, x] for key, x of xs when f x}
  else
    result = [x for x in xs when f x]
    if type is \String then result * '' else result

export reject = (f, xs) -->
  f = objToFunc f if typeof! f isnt \Function
  type = typeof! xs
  if type is \Object
    {[key, x] for key, x of xs when not f x}
  else
    result = [x for x in xs when not f x]
    if type is \String then result * '' else result

export partition = (f, xs) -->
  f = objToFunc f if typeof! f isnt \Function
  type = typeof! xs
  if type is \Object
    passed = {}
    failed = {}
    for key, x of xs
      (if f x then passed else failed)[key] = x
  else
    passed = []
    failed = []
    for x in xs
      (if f x then passed else failed)push x
    if type is \String
      passed *= ''
      failed *= ''
  [passed, failed]

export find = (f, xs) -->
  f = objToFunc f if typeof! f isnt \Function
  if typeof! xs is \Object
    for , x of xs when f x then return x
  else
    for x in xs when f x then return x
  void

export head = export first = (xs) ->
  return void if not xs.length
  xs.0

export tail = (xs) ->
  return void if not xs.length
  xs.slice 1

export last = (xs) ->
  return void if not xs.length
  xs[*-1]

export initial = (xs) ->
  return void if not xs.length
  xs.slice 0 xs.length - 1

export empty = (xs) ->
  if typeof! xs is \Object
    for x of xs then return false
    return yes
  not xs.length

export values = (obj) ->
  [x for , x of obj]

export keys = (obj) ->
  [x for x of obj]

export len = (xs) ->
  xs = values xs if typeof! xs is \Object
  xs.length

export cons = (x, xs) -->
  if typeof! xs is \String then x + xs else [x] ++ xs

export append = (xs, ys) -->
  if typeof! ys is \String then xs + ys else xs ++ ys

export join = (sep, xs) -->
  xs = values xs if typeof! xs is \Object
  xs.join sep

export reverse = (xs) ->
  if typeof! xs is \String
  then (xs / '')reverse! * ''
  else xs.slice!reverse!

export fold = export foldl = (f, memo, xs) -->
  if typeof! xs is \Object
    for , x of xs then memo = f memo, x
  else
    for x in xs then memo = f memo, x
  memo

export fold1 = export foldl1 = (f, xs) --> fold f, xs.0, xs.slice 1

export foldr = (f, memo, xs) --> fold f, memo, xs.slice!reverse!

export foldr1 = (f, xs) -->
  xs.=slice!reverse!
  fold f, xs.0, xs.slice 1

export unfoldr = export unfold = (f, b) -->
  if (f b)?
    [that.0] ++ unfoldr f, that.1
  else
    []

export andList = (xs) ->
  for x in xs when not x
    return false
  true

export orList = (xs) ->
  for x in xs when x
    return true
  false

export any = (f, xs) -->
  f = objToFunc f if typeof! f isnt \Function
  for x in xs when f x
    return yes
  no

export all = (f, xs) -->
  f = objToFunc f if typeof! f isnt \Function
  for x in xs when not f x
    return no
  yes

export unique = (xs) ->
  result = []
  if typeof! xs is \Object
    for , x of xs when x not in result then result.push x
  else
    for x   in xs when x not in result then result.push x
  if typeof! xs is \String then result * '' else result

export sort = (xs) ->
  xs.concat!sort (x, y) ->
    | x > y =>  1
    | x < y => -1
    | _     =>  0

export sortBy = (f, xs) -->
  return [] unless xs.length
  xs.concat!sort f

export compare = (f, x, y) -->
  | (f x) > (f y) =>  1
  | (f x) < (f y) => -1
  | otherwise     =>  0

export sum = (xs) ->
  result = 0
  if typeof! xs is \Object
    for , x of xs then result += x
  else
    for x   in xs then result += x
  result

export product = (xs) ->
  result = 1
  if typeof! xs is \Object
    for , x of xs then result *= x
  else
    for x   in xs then result *= x
  result

export mean = export average = (xs) -> (sum xs) / len xs

export concat = (xss) -> fold append, [], xss

export concatMap = (f, xs) --> fold ((memo, x) -> append memo, f x), [], xs

export listToObj = (xs) ->
  {[x.0, x.1] for x in xs}

export maximum = (xs) -> fold1 (>?), xs

export minimum = (xs) -> fold1 (<?), xs

export scan = export scanl = (f, memo, xs) -->
  last = memo
  if typeof! xs is \Object
  then [memo] ++ [last = f last, x for , x of xs]
  else [memo] ++ [last = f last, x for x in xs]

export scan1 = export scanl1 = (f, xs) --> scan f, xs.0, xs.slice 1

export scanr = (f, memo, xs) -->
  xs.=slice!reverse!
  scan f, memo, xs .reverse!

export scanr1 = (f, xs) -->
  xs.=slice!reverse!
  scan f, xs.0, xs.slice 1 .reverse!

export replicate = (n, x) -->
  result = []
  i = 0
  while i < n, ++i then result.push x
  result

export take = (n, xs) -->
  | n <= 0
    if typeof! xs is \String then '' else []
  | not xs.length => xs
  | otherwise     => xs.slice 0, n

export drop = (n, xs) -->
  | n <= 0        => xs
  | not xs.length => xs
  | otherwise     => xs.slice n

export splitAt = (n, xs) --> [(take n, xs), (drop n, xs)]

export takeWhile = (p, xs) -->
  return xs if not xs.length
  p = objToFunc p if typeof! p isnt \Function
  result = []
  for x in xs
    break if not p x
    result.push x
  if typeof! xs is \String then result * '' else result

export dropWhile = (p, xs) -->
  return xs if not xs.length
  p = objToFunc p if typeof! p isnt \Function
  i = 0
  for x in xs
    break if not p x
    ++i
  drop i, xs

export span = (p, xs) --> [(takeWhile p, xs), (dropWhile p, xs)]

export breakIt = (p, xs) --> span (not) << p, xs

export zip = (xs, ys) -->
  result = []
  for zs, i in [xs, ys]
    for z, j in zs
      result.push [] if i is 0
      result[j]?push z
  result

export zipWith = (f,xs, ys) -->
  f = objToFunc f if typeof! f isnt \Function
  if not xs.length or not ys.length
    []
  else
    [f.apply this, zs for zs in zip.call this, xs, ys]

export zipAll = (...xss) ->
  result = []
  for xs, i in xss
    for x, j in xs
      result.push [] if i is 0
      result[j]?push x
  result

export zipAllWith = (f, ...xss) ->
  f = objToFunc f if typeof! f isnt \Function
  if not xss.0.length or not xss.1.length
    []
  else
    [f.apply this, xs for xs in zipAll.apply this, xss]

export compose = (...funcs) ->
  ->
    args = arguments
    for f in funcs
      args = [f.apply this, args]
    args.0

export curry = (f) ->
  curry$ f # using util method curry$ from livescript

export id = (x) -> x

export flip = (f, x, y) --> f y, x

export fix = (f) ->
  ( (g, x) -> -> f(g g) ...arguments ) do
    (g, x) -> -> f(g g) ...arguments

export lines = (str) ->
  return [] if not str.length
  str / \\n

export unlines = (strs) -> strs * \\n

export words = (str) ->
  return [] if not str.length
  str / /[ ]+/

export unwords = (strs) -> strs * ' '

export max = (>?)

export min = (<?)

export negate = (x) -> -x

export abs = Math.abs

export signum = (x) ->
  | x < 0     => -1
  | x > 0     =>  1
  | otherwise =>  0

export quot = (x, y) --> ~~(x / y)

export rem = (%)

export div = (x, y) --> Math.floor x / y

export mod = (%%)

export recip = (1 /)

export pi = Math.PI

export tau = pi * 2

export exp = Math.exp

export sqrt = Math.sqrt

# changed from log as log is a
# common function for logging things
export ln = Math.log

export pow = (^)

export sin = Math.sin

export tan = Math.tan

export cos = Math.cos

export asin = Math.asin

export acos = Math.acos

export atan = Math.atan

export atan2 = (x, y) --> Math.atan2 x, y

# sinh
# tanh
# cosh
# asinh
# atanh
# acosh

export truncate = (x) -> ~~x

export round = Math.round

export ceiling = Math.ceil

export floor = Math.floor

export isItNaN = (x) -> x isnt x

export even = (x) -> x % 2 == 0

export odd = (x) -> x % 2 != 0

export gcd = (x, y) -->
  x = Math.abs x
  y = Math.abs y
  until y is 0
    z = x % y
    x = y
    y = z
  x

export lcm = (x, y) -->
  Math.abs Math.floor (x / (gcd x, y) * y)

# meta
export installPrelude = !(target) ->
  unless target.prelude?isInstalled
    target <<< out$ # using out$ generated by livescript
    target <<< target.prelude.isInstalled = true

export prelude = out$
</textarea></form>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        theme: "solarized light",
        lineNumbers: true
      });
    </script>

    <p><strong>MIME types defined:</strong> <code>text/x-livescript</code>.</p>

    <p>The LiveScript mode was written by Kenneth Bentley.</p>

  </article>
codemirror/mode/livescript/livescript.js000064400000016764151215013500014552 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

/**
 * Link to the project's GitHub page:
 * https://github.com/duralog/CodeMirror
 */

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  CodeMirror.defineMode('livescript', function(){
    var tokenBase = function(stream, state) {
      var next_rule = state.next || "start";
      if (next_rule) {
        state.next = state.next;
        var nr = Rules[next_rule];
        if (nr.splice) {
          for (var i$ = 0; i$ < nr.length; ++i$) {
            var r = nr[i$];
            if (r.regex && stream.match(r.regex)) {
              state.next = r.next || state.next;
              return r.token;
            }
          }
          stream.next();
          return 'error';
        }
        if (stream.match(r = Rules[next_rule])) {
          if (r.regex && stream.match(r.regex)) {
            state.next = r.next;
            return r.token;
          } else {
            stream.next();
            return 'error';
          }
        }
      }
      stream.next();
      return 'error';
    };
    var external = {
      startState: function(){
        return {
          next: 'start',
          lastToken: {style: null, indent: 0, content: ""}
        };
      },
      token: function(stream, state){
        while (stream.pos == stream.start)
          var style = tokenBase(stream, state);
        state.lastToken = {
          style: style,
          indent: stream.indentation(),
          content: stream.current()
        };
        return style.replace(/\./g, ' ');
      },
      indent: function(state){
        var indentation = state.lastToken.indent;
        if (state.lastToken.content.match(indenter)) {
          indentation += 2;
        }
        return indentation;
      }
    };
    return external;
  });

  var identifier = '(?![\\d\\s])[$\\w\\xAA-\\uFFDC](?:(?!\\s)[$\\w\\xAA-\\uFFDC]|-[A-Za-z])*';
  var indenter = RegExp('(?:[({[=:]|[-~]>|\\b(?:e(?:lse|xport)|d(?:o|efault)|t(?:ry|hen)|finally|import(?:\\s*all)?|const|var|let|new|catch(?:\\s*' + identifier + ')?))\\s*$');
  var keywordend = '(?![$\\w]|-[A-Za-z]|\\s*:(?![:=]))';
  var stringfill = {
    token: 'string',
    regex: '.+'
  };
  var Rules = {
    start: [
      {
        token: 'comment.doc',
        regex: '/\\*',
        next: 'comment'
      }, {
        token: 'comment',
        regex: '#.*'
      }, {
        token: 'keyword',
        regex: '(?:t(?:h(?:is|row|en)|ry|ypeof!?)|c(?:on(?:tinue|st)|a(?:se|tch)|lass)|i(?:n(?:stanceof)?|mp(?:ort(?:\\s+all)?|lements)|[fs])|d(?:e(?:fault|lete|bugger)|o)|f(?:or(?:\\s+own)?|inally|unction)|s(?:uper|witch)|e(?:lse|x(?:tends|port)|val)|a(?:nd|rguments)|n(?:ew|ot)|un(?:less|til)|w(?:hile|ith)|o[fr]|return|break|let|var|loop)' + keywordend
      }, {
        token: 'constant.language',
        regex: '(?:true|false|yes|no|on|off|null|void|undefined)' + keywordend
      }, {
        token: 'invalid.illegal',
        regex: '(?:p(?:ackage|r(?:ivate|otected)|ublic)|i(?:mplements|nterface)|enum|static|yield)' + keywordend
      }, {
        token: 'language.support.class',
        regex: '(?:R(?:e(?:gExp|ferenceError)|angeError)|S(?:tring|yntaxError)|E(?:rror|valError)|Array|Boolean|Date|Function|Number|Object|TypeError|URIError)' + keywordend
      }, {
        token: 'language.support.function',
        regex: '(?:is(?:NaN|Finite)|parse(?:Int|Float)|Math|JSON|(?:en|de)codeURI(?:Component)?)' + keywordend
      }, {
        token: 'variable.language',
        regex: '(?:t(?:hat|il|o)|f(?:rom|allthrough)|it|by|e)' + keywordend
      }, {
        token: 'identifier',
        regex: identifier + '\\s*:(?![:=])'
      }, {
        token: 'variable',
        regex: identifier
      }, {
        token: 'keyword.operator',
        regex: '(?:\\.{3}|\\s+\\?)'
      }, {
        token: 'keyword.variable',
        regex: '(?:@+|::|\\.\\.)',
        next: 'key'
      }, {
        token: 'keyword.operator',
        regex: '\\.\\s*',
        next: 'key'
      }, {
        token: 'string',
        regex: '\\\\\\S[^\\s,;)}\\]]*'
      }, {
        token: 'string.doc',
        regex: '\'\'\'',
        next: 'qdoc'
      }, {
        token: 'string.doc',
        regex: '"""',
        next: 'qqdoc'
      }, {
        token: 'string',
        regex: '\'',
        next: 'qstring'
      }, {
        token: 'string',
        regex: '"',
        next: 'qqstring'
      }, {
        token: 'string',
        regex: '`',
        next: 'js'
      }, {
        token: 'string',
        regex: '<\\[',
        next: 'words'
      }, {
        token: 'string.regex',
        regex: '//',
        next: 'heregex'
      }, {
        token: 'string.regex',
        regex: '\\/(?:[^[\\/\\n\\\\]*(?:(?:\\\\.|\\[[^\\]\\n\\\\]*(?:\\\\.[^\\]\\n\\\\]*)*\\])[^[\\/\\n\\\\]*)*)\\/[gimy$]{0,4}',
        next: 'key'
      }, {
        token: 'constant.numeric',
        regex: '(?:0x[\\da-fA-F][\\da-fA-F_]*|(?:[2-9]|[12]\\d|3[0-6])r[\\da-zA-Z][\\da-zA-Z_]*|(?:\\d[\\d_]*(?:\\.\\d[\\d_]*)?|\\.\\d[\\d_]*)(?:e[+-]?\\d[\\d_]*)?[\\w$]*)'
      }, {
        token: 'lparen',
        regex: '[({[]'
      }, {
        token: 'rparen',
        regex: '[)}\\]]',
        next: 'key'
      }, {
        token: 'keyword.operator',
        regex: '\\S+'
      }, {
        token: 'text',
        regex: '\\s+'
      }
    ],
    heregex: [
      {
        token: 'string.regex',
        regex: '.*?//[gimy$?]{0,4}',
        next: 'start'
      }, {
        token: 'string.regex',
        regex: '\\s*#{'
      }, {
        token: 'comment.regex',
        regex: '\\s+(?:#.*)?'
      }, {
        token: 'string.regex',
        regex: '\\S+'
      }
    ],
    key: [
      {
        token: 'keyword.operator',
        regex: '[.?@!]+'
      }, {
        token: 'identifier',
        regex: identifier,
        next: 'start'
      }, {
        token: 'text',
        regex: '',
        next: 'start'
      }
    ],
    comment: [
      {
        token: 'comment.doc',
        regex: '.*?\\*/',
        next: 'start'
      }, {
        token: 'comment.doc',
        regex: '.+'
      }
    ],
    qdoc: [
      {
        token: 'string',
        regex: ".*?'''",
        next: 'key'
      }, stringfill
    ],
    qqdoc: [
      {
        token: 'string',
        regex: '.*?"""',
        next: 'key'
      }, stringfill
    ],
    qstring: [
      {
        token: 'string',
        regex: '[^\\\\\']*(?:\\\\.[^\\\\\']*)*\'',
        next: 'key'
      }, stringfill
    ],
    qqstring: [
      {
        token: 'string',
        regex: '[^\\\\"]*(?:\\\\.[^\\\\"]*)*"',
        next: 'key'
      }, stringfill
    ],
    js: [
      {
        token: 'string',
        regex: '[^\\\\`]*(?:\\\\.[^\\\\`]*)*`',
        next: 'key'
      }, stringfill
    ],
    words: [
      {
        token: 'string',
        regex: '.*?\\]>',
        next: 'key'
      }, stringfill
    ]
  };
  for (var idx in Rules) {
    var r = Rules[idx];
    if (r.splice) {
      for (var i = 0, len = r.length; i < len; ++i) {
        var rr = r[i];
        if (typeof rr.regex === 'string') {
          Rules[idx][i].regex = new RegExp('^' + rr.regex);
        }
      }
    } else if (typeof rr.regex === 'string') {
      Rules[idx].regex = new RegExp('^' + r.regex);
    }
  }

  CodeMirror.defineMIME('text/x-livescript', 'livescript');

});
codemirror/mode/z80/index.html000064400000002576151215013500012256 0ustar00<!doctype html>

<title>CodeMirror: Z80 assembly mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="z80.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Z80 assembly</a>
  </ul>
</div>

<article>
<h2>Z80 assembly mode</h2>


<div><textarea id="code" name="code">
#include    "ti83plus.inc"
#define     progStart   $9D95
    .org progStart-2
    .db $BB,$6D

    bcall(_ClrLCDFull)
    ld hl,0
    ld (CurCol),hl
    ld hl,Message
    bcall(_PutS) ; Displays the string
    bcall(_NewLine)
    ret
Message:
    .db "Hello world!",0
</textarea></div>

    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        lineNumbers: true
      });
    </script>

    <p><strong>MIME types defined:</strong> <code>text/x-z80</code>, <code>text/x-ez80</code>.</p>
  </article>
codemirror/mode/z80/z80.js000064400000006771151215013500011241 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
  mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
  define(["../../lib/codemirror"], mod);
  else // Plain browser env
  mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode('z80', function(_config, parserConfig) {
  var ez80 = parserConfig.ez80;
  var keywords1, keywords2;
  if (ez80) {
    keywords1 = /^(exx?|(ld|cp)([di]r?)?|[lp]ea|pop|push|ad[cd]|cpl|daa|dec|inc|neg|sbc|sub|and|bit|[cs]cf|x?or|res|set|r[lr]c?a?|r[lr]d|s[lr]a|srl|djnz|nop|[de]i|halt|im|in([di]mr?|ir?|irx|2r?)|ot(dmr?|[id]rx|imr?)|out(0?|[di]r?|[di]2r?)|tst(io)?|slp)(\.([sl]?i)?[sl])?\b/i;
    keywords2 = /^(((call|j[pr]|rst|ret[in]?)(\.([sl]?i)?[sl])?)|(rs|st)mix)\b/i;
  } else {
    keywords1 = /^(exx?|(ld|cp|in)([di]r?)?|pop|push|ad[cd]|cpl|daa|dec|inc|neg|sbc|sub|and|bit|[cs]cf|x?or|res|set|r[lr]c?a?|r[lr]d|s[lr]a|srl|djnz|nop|rst|[de]i|halt|im|ot[di]r|out[di]?)\b/i;
    keywords2 = /^(call|j[pr]|ret[in]?|b_?(call|jump))\b/i;
  }

  var variables1 = /^(af?|bc?|c|de?|e|hl?|l|i[xy]?|r|sp)\b/i;
  var variables2 = /^(n?[zc]|p[oe]?|m)\b/i;
  var errors = /^([hl][xy]|i[xy][hl]|slia|sll)\b/i;
  var numbers = /^([\da-f]+h|[0-7]+o|[01]+b|\d+d?)\b/i;

  return {
    startState: function() {
      return {
        context: 0
      };
    },
    token: function(stream, state) {
      if (!stream.column())
        state.context = 0;

      if (stream.eatSpace())
        return null;

      var w;

      if (stream.eatWhile(/\w/)) {
        if (ez80 && stream.eat('.')) {
          stream.eatWhile(/\w/);
        }
        w = stream.current();

        if (stream.indentation()) {
          if ((state.context == 1 || state.context == 4) && variables1.test(w)) {
            state.context = 4;
            return 'var2';
          }

          if (state.context == 2 && variables2.test(w)) {
            state.context = 4;
            return 'var3';
          }

          if (keywords1.test(w)) {
            state.context = 1;
            return 'keyword';
          } else if (keywords2.test(w)) {
            state.context = 2;
            return 'keyword';
          } else if (state.context == 4 && numbers.test(w)) {
            return 'number';
          }

          if (errors.test(w))
            return 'error';
        } else if (stream.match(numbers)) {
          return 'number';
        } else {
          return null;
        }
      } else if (stream.eat(';')) {
        stream.skipToEnd();
        return 'comment';
      } else if (stream.eat('"')) {
        while (w = stream.next()) {
          if (w == '"')
            break;

          if (w == '\\')
            stream.next();
        }
        return 'string';
      } else if (stream.eat('\'')) {
        if (stream.match(/\\?.'/))
          return 'number';
      } else if (stream.eat('.') || stream.sol() && stream.eat('#')) {
        state.context = 5;

        if (stream.eatWhile(/\w/))
          return 'def';
      } else if (stream.eat('$')) {
        if (stream.eatWhile(/[\da-f]/i))
          return 'number';
      } else if (stream.eat('%')) {
        if (stream.eatWhile(/[01]/))
          return 'number';
      } else {
        stream.next();
      }
      return null;
    }
  };
});

CodeMirror.defineMIME("text/x-z80", "z80");
CodeMirror.defineMIME("text/x-ez80", { name: "z80", ez80: true });

});
codemirror/mode/django/index.html000064400000004035151215013500013067 0ustar00<!doctype html>

<title>CodeMirror: Django template mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<link rel="stylesheet" href="../../theme/mdn-like.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/mode/overlay.js"></script>
<script src="../xml/xml.js"></script>
<script src="../htmlmixed/htmlmixed.js"></script>
<script src="django.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Django</a>
  </ul>
</div>

<article>
<h2>Django template mode</h2>
<form><textarea id="code" name="code">
<!doctype html>
<html>
  <head>
    <title>My Django web application</title>
  </head>
  <body>
    <h1>
      {{ page.title|capfirst }}
    </h1>
    <ul class="my-list">
      {# traverse a list of items and produce links to their views. #}
      {% for item in items %}
      <li>
        <a href="{% url 'item_view' item.name|slugify %}">
          {{ item.name }}
        </a>
      </li>
      {% empty %}
      <li>You have no items in your list.</li>
      {% endfor %}
    </ul>
    {% comment "this is a forgotten footer" %}
    <footer></footer>
    {% endcomment %}
  </body>
</html>
</textarea></form>

    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        lineNumbers: true,
        mode: "django",
        indentUnit: 2,
        indentWithTabs: true,
        theme: "mdn-like"
      });
    </script>

    <p>Mode for HTML with embedded Django template markup.</p>

    <p><strong>MIME types defined:</strong> <code>text/x-django</code></p>
  </article>
codemirror/mode/django/django.js000064400000027017151215013500012677 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"),
        require("../../addon/mode/overlay"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror", "../htmlmixed/htmlmixed",
            "../../addon/mode/overlay"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  CodeMirror.defineMode("django:inner", function() {
    var keywords = ["block", "endblock", "for", "endfor", "true", "false", "filter", "endfilter",
                    "loop", "none", "self", "super", "if", "elif", "endif", "as", "else", "import",
                    "with", "endwith", "without", "context", "ifequal", "endifequal", "ifnotequal",
                    "endifnotequal", "extends", "include", "load", "comment", "endcomment",
                    "empty", "url", "static", "trans", "blocktrans", "endblocktrans", "now",
                    "regroup", "lorem", "ifchanged", "endifchanged", "firstof", "debug", "cycle",
                    "csrf_token", "autoescape", "endautoescape", "spaceless", "endspaceless",
                    "ssi", "templatetag", "verbatim", "endverbatim", "widthratio"],
        filters = ["add", "addslashes", "capfirst", "center", "cut", "date",
                   "default", "default_if_none", "dictsort",
                   "dictsortreversed", "divisibleby", "escape", "escapejs",
                   "filesizeformat", "first", "floatformat", "force_escape",
                   "get_digit", "iriencode", "join", "last", "length",
                   "length_is", "linebreaks", "linebreaksbr", "linenumbers",
                   "ljust", "lower", "make_list", "phone2numeric", "pluralize",
                   "pprint", "random", "removetags", "rjust", "safe",
                   "safeseq", "slice", "slugify", "stringformat", "striptags",
                   "time", "timesince", "timeuntil", "title", "truncatechars",
                   "truncatechars_html", "truncatewords", "truncatewords_html",
                   "unordered_list", "upper", "urlencode", "urlize",
                   "urlizetrunc", "wordcount", "wordwrap", "yesno"],
        operators = ["==", "!=", "<", ">", "<=", ">="],
        wordOperators = ["in", "not", "or", "and"];

    keywords = new RegExp("^\\b(" + keywords.join("|") + ")\\b");
    filters = new RegExp("^\\b(" + filters.join("|") + ")\\b");
    operators = new RegExp("^\\b(" + operators.join("|") + ")\\b");
    wordOperators = new RegExp("^\\b(" + wordOperators.join("|") + ")\\b");

    // We have to return "null" instead of null, in order to avoid string
    // styling as the default, when using Django templates inside HTML
    // element attributes
    function tokenBase (stream, state) {
      // Attempt to identify a variable, template or comment tag respectively
      if (stream.match("{{")) {
        state.tokenize = inVariable;
        return "tag";
      } else if (stream.match("{%")) {
        state.tokenize = inTag;
        return "tag";
      } else if (stream.match("{#")) {
        state.tokenize = inComment;
        return "comment";
      }

      // Ignore completely any stream series that do not match the
      // Django template opening tags.
      while (stream.next() != null && !stream.match(/\{[{%#]/, false)) {}
      return null;
    }

    // A string can be included in either single or double quotes (this is
    // the delimiter). Mark everything as a string until the start delimiter
    // occurs again.
    function inString (delimiter, previousTokenizer) {
      return function (stream, state) {
        if (!state.escapeNext && stream.eat(delimiter)) {
          state.tokenize = previousTokenizer;
        } else {
          if (state.escapeNext) {
            state.escapeNext = false;
          }

          var ch = stream.next();

          // Take into account the backslash for escaping characters, such as
          // the string delimiter.
          if (ch == "\\") {
            state.escapeNext = true;
          }
        }

        return "string";
      };
    }

    // Apply Django template variable syntax highlighting
    function inVariable (stream, state) {
      // Attempt to match a dot that precedes a property
      if (state.waitDot) {
        state.waitDot = false;

        if (stream.peek() != ".") {
          return "null";
        }

        // Dot followed by a non-word character should be considered an error.
        if (stream.match(/\.\W+/)) {
          return "error";
        } else if (stream.eat(".")) {
          state.waitProperty = true;
          return "null";
        } else {
          throw Error ("Unexpected error while waiting for property.");
        }
      }

      // Attempt to match a pipe that precedes a filter
      if (state.waitPipe) {
        state.waitPipe = false;

        if (stream.peek() != "|") {
          return "null";
        }

        // Pipe followed by a non-word character should be considered an error.
        if (stream.match(/\.\W+/)) {
          return "error";
        } else if (stream.eat("|")) {
          state.waitFilter = true;
          return "null";
        } else {
          throw Error ("Unexpected error while waiting for filter.");
        }
      }

      // Highlight properties
      if (state.waitProperty) {
        state.waitProperty = false;
        if (stream.match(/\b(\w+)\b/)) {
          state.waitDot = true;  // A property can be followed by another property
          state.waitPipe = true;  // A property can be followed by a filter
          return "property";
        }
      }

      // Highlight filters
      if (state.waitFilter) {
          state.waitFilter = false;
        if (stream.match(filters)) {
          return "variable-2";
        }
      }

      // Ignore all white spaces
      if (stream.eatSpace()) {
        state.waitProperty = false;
        return "null";
      }

      // Identify numbers
      if (stream.match(/\b\d+(\.\d+)?\b/)) {
        return "number";
      }

      // Identify strings
      if (stream.match("'")) {
        state.tokenize = inString("'", state.tokenize);
        return "string";
      } else if (stream.match('"')) {
        state.tokenize = inString('"', state.tokenize);
        return "string";
      }

      // Attempt to find the variable
      if (stream.match(/\b(\w+)\b/) && !state.foundVariable) {
        state.waitDot = true;
        state.waitPipe = true;  // A property can be followed by a filter
        return "variable";
      }

      // If found closing tag reset
      if (stream.match("}}")) {
        state.waitProperty = null;
        state.waitFilter = null;
        state.waitDot = null;
        state.waitPipe = null;
        state.tokenize = tokenBase;
        return "tag";
      }

      // If nothing was found, advance to the next character
      stream.next();
      return "null";
    }

    function inTag (stream, state) {
      // Attempt to match a dot that precedes a property
      if (state.waitDot) {
        state.waitDot = false;

        if (stream.peek() != ".") {
          return "null";
        }

        // Dot followed by a non-word character should be considered an error.
        if (stream.match(/\.\W+/)) {
          return "error";
        } else if (stream.eat(".")) {
          state.waitProperty = true;
          return "null";
        } else {
          throw Error ("Unexpected error while waiting for property.");
        }
      }

      // Attempt to match a pipe that precedes a filter
      if (state.waitPipe) {
        state.waitPipe = false;

        if (stream.peek() != "|") {
          return "null";
        }

        // Pipe followed by a non-word character should be considered an error.
        if (stream.match(/\.\W+/)) {
          return "error";
        } else if (stream.eat("|")) {
          state.waitFilter = true;
          return "null";
        } else {
          throw Error ("Unexpected error while waiting for filter.");
        }
      }

      // Highlight properties
      if (state.waitProperty) {
        state.waitProperty = false;
        if (stream.match(/\b(\w+)\b/)) {
          state.waitDot = true;  // A property can be followed by another property
          state.waitPipe = true;  // A property can be followed by a filter
          return "property";
        }
      }

      // Highlight filters
      if (state.waitFilter) {
          state.waitFilter = false;
        if (stream.match(filters)) {
          return "variable-2";
        }
      }

      // Ignore all white spaces
      if (stream.eatSpace()) {
        state.waitProperty = false;
        return "null";
      }

      // Identify numbers
      if (stream.match(/\b\d+(\.\d+)?\b/)) {
        return "number";
      }

      // Identify strings
      if (stream.match("'")) {
        state.tokenize = inString("'", state.tokenize);
        return "string";
      } else if (stream.match('"')) {
        state.tokenize = inString('"', state.tokenize);
        return "string";
      }

      // Attempt to match an operator
      if (stream.match(operators)) {
        return "operator";
      }

      // Attempt to match a word operator
      if (stream.match(wordOperators)) {
        return "keyword";
      }

      // Attempt to match a keyword
      var keywordMatch = stream.match(keywords);
      if (keywordMatch) {
        if (keywordMatch[0] == "comment") {
          state.blockCommentTag = true;
        }
        return "keyword";
      }

      // Attempt to match a variable
      if (stream.match(/\b(\w+)\b/)) {
        state.waitDot = true;
        state.waitPipe = true;  // A property can be followed by a filter
        return "variable";
      }

      // If found closing tag reset
      if (stream.match("%}")) {
        state.waitProperty = null;
        state.waitFilter = null;
        state.waitDot = null;
        state.waitPipe = null;
        // If the tag that closes is a block comment tag, we want to mark the
        // following code as comment, until the tag closes.
        if (state.blockCommentTag) {
          state.blockCommentTag = false;  // Release the "lock"
          state.tokenize = inBlockComment;
        } else {
          state.tokenize = tokenBase;
        }
        return "tag";
      }

      // If nothing was found, advance to the next character
      stream.next();
      return "null";
    }

    // Mark everything as comment inside the tag and the tag itself.
    function inComment (stream, state) {
      if (stream.match(/^.*?#\}/)) state.tokenize = tokenBase
      else stream.skipToEnd()
      return "comment";
    }

    // Mark everything as a comment until the `blockcomment` tag closes.
    function inBlockComment (stream, state) {
      if (stream.match(/\{%\s*endcomment\s*%\}/, false)) {
        state.tokenize = inTag;
        stream.match("{%");
        return "tag";
      } else {
        stream.next();
        return "comment";
      }
    }

    return {
      startState: function () {
        return {tokenize: tokenBase};
      },
      token: function (stream, state) {
        return state.tokenize(stream, state);
      },
      blockCommentStart: "{% comment %}",
      blockCommentEnd: "{% endcomment %}"
    };
  });

  CodeMirror.defineMode("django", function(config) {
    var htmlBase = CodeMirror.getMode(config, "text/html");
    var djangoInner = CodeMirror.getMode(config, "django:inner");
    return CodeMirror.overlayMode(htmlBase, djangoInner);
  });

  CodeMirror.defineMIME("text/x-django", "django");
});
codemirror/mode/stylus/stylus.js000064400000122210151215013500013070 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

// Stylus mode created by Dmitry Kiselyov http://git.io/AaRB

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  CodeMirror.defineMode("stylus", function(config) {
    var indentUnit = config.indentUnit,
        tagKeywords = keySet(tagKeywords_),
        tagVariablesRegexp = /^(a|b|i|s|col|em)$/i,
        propertyKeywords = keySet(propertyKeywords_),
        nonStandardPropertyKeywords = keySet(nonStandardPropertyKeywords_),
        valueKeywords = keySet(valueKeywords_),
        colorKeywords = keySet(colorKeywords_),
        documentTypes = keySet(documentTypes_),
        documentTypesRegexp = wordRegexp(documentTypes_),
        mediaFeatures = keySet(mediaFeatures_),
        mediaTypes = keySet(mediaTypes_),
        fontProperties = keySet(fontProperties_),
        operatorsRegexp = /^\s*([.]{2,3}|&&|\|\||\*\*|[?!=:]?=|[-+*\/%<>]=?|\?:|\~)/,
        wordOperatorKeywordsRegexp = wordRegexp(wordOperatorKeywords_),
        blockKeywords = keySet(blockKeywords_),
        vendorPrefixesRegexp = new RegExp(/^\-(moz|ms|o|webkit)-/i),
        commonAtoms = keySet(commonAtoms_),
        firstWordMatch = "",
        states = {},
        ch,
        style,
        type,
        override;

    /**
     * Tokenizers
     */
    function tokenBase(stream, state) {
      firstWordMatch = stream.string.match(/(^[\w-]+\s*=\s*$)|(^\s*[\w-]+\s*=\s*[\w-])|(^\s*(\.|#|@|\$|\&|\[|\d|\+|::?|\{|\>|~|\/)?\s*[\w-]*([a-z0-9-]|\*|\/\*)(\(|,)?)/);
      state.context.line.firstWord = firstWordMatch ? firstWordMatch[0].replace(/^\s*/, "") : "";
      state.context.line.indent = stream.indentation();
      ch = stream.peek();

      // Line comment
      if (stream.match("//")) {
        stream.skipToEnd();
        return ["comment", "comment"];
      }
      // Block comment
      if (stream.match("/*")) {
        state.tokenize = tokenCComment;
        return tokenCComment(stream, state);
      }
      // String
      if (ch == "\"" || ch == "'") {
        stream.next();
        state.tokenize = tokenString(ch);
        return state.tokenize(stream, state);
      }
      // Def
      if (ch == "@") {
        stream.next();
        stream.eatWhile(/[\w\\-]/);
        return ["def", stream.current()];
      }
      // ID selector or Hex color
      if (ch == "#") {
        stream.next();
        // Hex color
        if (stream.match(/^[0-9a-f]{6}|[0-9a-f]{3}/i)) {
          return ["atom", "atom"];
        }
        // ID selector
        if (stream.match(/^[a-z][\w-]*/i)) {
          return ["builtin", "hash"];
        }
      }
      // Vendor prefixes
      if (stream.match(vendorPrefixesRegexp)) {
        return ["meta", "vendor-prefixes"];
      }
      // Numbers
      if (stream.match(/^-?[0-9]?\.?[0-9]/)) {
        stream.eatWhile(/[a-z%]/i);
        return ["number", "unit"];
      }
      // !important|optional
      if (ch == "!") {
        stream.next();
        return [stream.match(/^(important|optional)/i) ? "keyword": "operator", "important"];
      }
      // Class
      if (ch == "." && stream.match(/^\.[a-z][\w-]*/i)) {
        return ["qualifier", "qualifier"];
      }
      // url url-prefix domain regexp
      if (stream.match(documentTypesRegexp)) {
        if (stream.peek() == "(") state.tokenize = tokenParenthesized;
        return ["property", "word"];
      }
      // Mixins / Functions
      if (stream.match(/^[a-z][\w-]*\(/i)) {
        stream.backUp(1);
        return ["keyword", "mixin"];
      }
      // Block mixins
      if (stream.match(/^(\+|-)[a-z][\w-]*\(/i)) {
        stream.backUp(1);
        return ["keyword", "block-mixin"];
      }
      // Parent Reference BEM naming
      if (stream.string.match(/^\s*&/) && stream.match(/^[-_]+[a-z][\w-]*/)) {
        return ["qualifier", "qualifier"];
      }
      // / Root Reference & Parent Reference
      if (stream.match(/^(\/|&)(-|_|:|\.|#|[a-z])/)) {
        stream.backUp(1);
        return ["variable-3", "reference"];
      }
      if (stream.match(/^&{1}\s*$/)) {
        return ["variable-3", "reference"];
      }
      // Word operator
      if (stream.match(wordOperatorKeywordsRegexp)) {
        return ["operator", "operator"];
      }
      // Word
      if (stream.match(/^\$?[-_]*[a-z0-9]+[\w-]*/i)) {
        // Variable
        if (stream.match(/^(\.|\[)[\w-\'\"\]]+/i, false)) {
          if (!wordIsTag(stream.current())) {
            stream.match(/\./);
            return ["variable-2", "variable-name"];
          }
        }
        return ["variable-2", "word"];
      }
      // Operators
      if (stream.match(operatorsRegexp)) {
        return ["operator", stream.current()];
      }
      // Delimiters
      if (/[:;,{}\[\]\(\)]/.test(ch)) {
        stream.next();
        return [null, ch];
      }
      // Non-detected items
      stream.next();
      return [null, null];
    }

    /**
     * Token comment
     */
    function tokenCComment(stream, state) {
      var maybeEnd = false, ch;
      while ((ch = stream.next()) != null) {
        if (maybeEnd && ch == "/") {
          state.tokenize = null;
          break;
        }
        maybeEnd = (ch == "*");
      }
      return ["comment", "comment"];
    }

    /**
     * Token string
     */
    function tokenString(quote) {
      return function(stream, state) {
        var escaped = false, ch;
        while ((ch = stream.next()) != null) {
          if (ch == quote && !escaped) {
            if (quote == ")") stream.backUp(1);
            break;
          }
          escaped = !escaped && ch == "\\";
        }
        if (ch == quote || !escaped && quote != ")") state.tokenize = null;
        return ["string", "string"];
      };
    }

    /**
     * Token parenthesized
     */
    function tokenParenthesized(stream, state) {
      stream.next(); // Must be "("
      if (!stream.match(/\s*[\"\')]/, false))
        state.tokenize = tokenString(")");
      else
        state.tokenize = null;
      return [null, "("];
    }

    /**
     * Context management
     */
    function Context(type, indent, prev, line) {
      this.type = type;
      this.indent = indent;
      this.prev = prev;
      this.line = line || {firstWord: "", indent: 0};
    }

    function pushContext(state, stream, type, indent) {
      indent = indent >= 0 ? indent : indentUnit;
      state.context = new Context(type, stream.indentation() + indent, state.context);
      return type;
    }

    function popContext(state, currentIndent) {
      var contextIndent = state.context.indent - indentUnit;
      currentIndent = currentIndent || false;
      state.context = state.context.prev;
      if (currentIndent) state.context.indent = contextIndent;
      return state.context.type;
    }

    function pass(type, stream, state) {
      return states[state.context.type](type, stream, state);
    }

    function popAndPass(type, stream, state, n) {
      for (var i = n || 1; i > 0; i--)
        state.context = state.context.prev;
      return pass(type, stream, state);
    }


    /**
     * Parser
     */
    function wordIsTag(word) {
      return word.toLowerCase() in tagKeywords;
    }

    function wordIsProperty(word) {
      word = word.toLowerCase();
      return word in propertyKeywords || word in fontProperties;
    }

    function wordIsBlock(word) {
      return word.toLowerCase() in blockKeywords;
    }

    function wordIsVendorPrefix(word) {
      return word.toLowerCase().match(vendorPrefixesRegexp);
    }

    function wordAsValue(word) {
      var wordLC = word.toLowerCase();
      var override = "variable-2";
      if (wordIsTag(word)) override = "tag";
      else if (wordIsBlock(word)) override = "block-keyword";
      else if (wordIsProperty(word)) override = "property";
      else if (wordLC in valueKeywords || wordLC in commonAtoms) override = "atom";
      else if (wordLC == "return" || wordLC in colorKeywords) override = "keyword";

      // Font family
      else if (word.match(/^[A-Z]/)) override = "string";
      return override;
    }

    function typeIsBlock(type, stream) {
      return ((endOfLine(stream) && (type == "{" || type == "]" || type == "hash" || type == "qualifier")) || type == "block-mixin");
    }

    function typeIsInterpolation(type, stream) {
      return type == "{" && stream.match(/^\s*\$?[\w-]+/i, false);
    }

    function typeIsPseudo(type, stream) {
      return type == ":" && stream.match(/^[a-z-]+/, false);
    }

    function startOfLine(stream) {
      return stream.sol() || stream.string.match(new RegExp("^\\s*" + escapeRegExp(stream.current())));
    }

    function endOfLine(stream) {
      return stream.eol() || stream.match(/^\s*$/, false);
    }

    function firstWordOfLine(line) {
      var re = /^\s*[-_]*[a-z0-9]+[\w-]*/i;
      var result = typeof line == "string" ? line.match(re) : line.string.match(re);
      return result ? result[0].replace(/^\s*/, "") : "";
    }


    /**
     * Block
     */
    states.block = function(type, stream, state) {
      if ((type == "comment" && startOfLine(stream)) ||
          (type == "," && endOfLine(stream)) ||
          type == "mixin") {
        return pushContext(state, stream, "block", 0);
      }
      if (typeIsInterpolation(type, stream)) {
        return pushContext(state, stream, "interpolation");
      }
      if (endOfLine(stream) && type == "]") {
        if (!/^\s*(\.|#|:|\[|\*|&)/.test(stream.string) && !wordIsTag(firstWordOfLine(stream))) {
          return pushContext(state, stream, "block", 0);
        }
      }
      if (typeIsBlock(type, stream, state)) {
        return pushContext(state, stream, "block");
      }
      if (type == "}" && endOfLine(stream)) {
        return pushContext(state, stream, "block", 0);
      }
      if (type == "variable-name") {
        if (stream.string.match(/^\s?\$[\w-\.\[\]\'\"]+$/) || wordIsBlock(firstWordOfLine(stream))) {
          return pushContext(state, stream, "variableName");
        }
        else {
          return pushContext(state, stream, "variableName", 0);
        }
      }
      if (type == "=") {
        if (!endOfLine(stream) && !wordIsBlock(firstWordOfLine(stream))) {
          return pushContext(state, stream, "block", 0);
        }
        return pushContext(state, stream, "block");
      }
      if (type == "*") {
        if (endOfLine(stream) || stream.match(/\s*(,|\.|#|\[|:|{)/,false)) {
          override = "tag";
          return pushContext(state, stream, "block");
        }
      }
      if (typeIsPseudo(type, stream)) {
        return pushContext(state, stream, "pseudo");
      }
      if (/@(font-face|media|supports|(-moz-)?document)/.test(type)) {
        return pushContext(state, stream, endOfLine(stream) ? "block" : "atBlock");
      }
      if (/@(-(moz|ms|o|webkit)-)?keyframes$/.test(type)) {
        return pushContext(state, stream, "keyframes");
      }
      if (/@extends?/.test(type)) {
        return pushContext(state, stream, "extend", 0);
      }
      if (type && type.charAt(0) == "@") {

        // Property Lookup
        if (stream.indentation() > 0 && wordIsProperty(stream.current().slice(1))) {
          override = "variable-2";
          return "block";
        }
        if (/(@import|@require|@charset)/.test(type)) {
          return pushContext(state, stream, "block", 0);
        }
        return pushContext(state, stream, "block");
      }
      if (type == "reference" && endOfLine(stream)) {
        return pushContext(state, stream, "block");
      }
      if (type == "(") {
        return pushContext(state, stream, "parens");
      }

      if (type == "vendor-prefixes") {
        return pushContext(state, stream, "vendorPrefixes");
      }
      if (type == "word") {
        var word = stream.current();
        override = wordAsValue(word);

        if (override == "property") {
          if (startOfLine(stream)) {
            return pushContext(state, stream, "block", 0);
          } else {
            override = "atom";
            return "block";
          }
        }

        if (override == "tag") {

          // tag is a css value
          if (/embed|menu|pre|progress|sub|table/.test(word)) {
            if (wordIsProperty(firstWordOfLine(stream))) {
              override = "atom";
              return "block";
            }
          }

          // tag is an attribute
          if (stream.string.match(new RegExp("\\[\\s*" + word + "|" + word +"\\s*\\]"))) {
            override = "atom";
            return "block";
          }

          // tag is a variable
          if (tagVariablesRegexp.test(word)) {
            if ((startOfLine(stream) && stream.string.match(/=/)) ||
                (!startOfLine(stream) &&
                 !stream.string.match(/^(\s*\.|#|\&|\[|\/|>|\*)/) &&
                 !wordIsTag(firstWordOfLine(stream)))) {
              override = "variable-2";
              if (wordIsBlock(firstWordOfLine(stream)))  return "block";
              return pushContext(state, stream, "block", 0);
            }
          }

          if (endOfLine(stream)) return pushContext(state, stream, "block");
        }
        if (override == "block-keyword") {
          override = "keyword";

          // Postfix conditionals
          if (stream.current(/(if|unless)/) && !startOfLine(stream)) {
            return "block";
          }
          return pushContext(state, stream, "block");
        }
        if (word == "return") return pushContext(state, stream, "block", 0);

        // Placeholder selector
        if (override == "variable-2" && stream.string.match(/^\s?\$[\w-\.\[\]\'\"]+$/)) {
          return pushContext(state, stream, "block");
        }
      }
      return state.context.type;
    };


    /**
     * Parens
     */
    states.parens = function(type, stream, state) {
      if (type == "(") return pushContext(state, stream, "parens");
      if (type == ")") {
        if (state.context.prev.type == "parens") {
          return popContext(state);
        }
        if ((stream.string.match(/^[a-z][\w-]*\(/i) && endOfLine(stream)) ||
            wordIsBlock(firstWordOfLine(stream)) ||
            /(\.|#|:|\[|\*|&|>|~|\+|\/)/.test(firstWordOfLine(stream)) ||
            (!stream.string.match(/^-?[a-z][\w-\.\[\]\'\"]*\s*=/) &&
             wordIsTag(firstWordOfLine(stream)))) {
          return pushContext(state, stream, "block");
        }
        if (stream.string.match(/^[\$-]?[a-z][\w-\.\[\]\'\"]*\s*=/) ||
            stream.string.match(/^\s*(\(|\)|[0-9])/) ||
            stream.string.match(/^\s+[a-z][\w-]*\(/i) ||
            stream.string.match(/^\s+[\$-]?[a-z]/i)) {
          return pushContext(state, stream, "block", 0);
        }
        if (endOfLine(stream)) return pushContext(state, stream, "block");
        else return pushContext(state, stream, "block", 0);
      }
      if (type && type.charAt(0) == "@" && wordIsProperty(stream.current().slice(1))) {
        override = "variable-2";
      }
      if (type == "word") {
        var word = stream.current();
        override = wordAsValue(word);
        if (override == "tag" && tagVariablesRegexp.test(word)) {
          override = "variable-2";
        }
        if (override == "property" || word == "to") override = "atom";
      }
      if (type == "variable-name") {
        return pushContext(state, stream, "variableName");
      }
      if (typeIsPseudo(type, stream)) {
        return pushContext(state, stream, "pseudo");
      }
      return state.context.type;
    };


    /**
     * Vendor prefixes
     */
    states.vendorPrefixes = function(type, stream, state) {
      if (type == "word") {
        override = "property";
        return pushContext(state, stream, "block", 0);
      }
      return popContext(state);
    };


    /**
     * Pseudo
     */
    states.pseudo = function(type, stream, state) {
      if (!wordIsProperty(firstWordOfLine(stream.string))) {
        stream.match(/^[a-z-]+/);
        override = "variable-3";
        if (endOfLine(stream)) return pushContext(state, stream, "block");
        return popContext(state);
      }
      return popAndPass(type, stream, state);
    };


    /**
     * atBlock
     */
    states.atBlock = function(type, stream, state) {
      if (type == "(") return pushContext(state, stream, "atBlock_parens");
      if (typeIsBlock(type, stream, state)) {
        return pushContext(state, stream, "block");
      }
      if (typeIsInterpolation(type, stream)) {
        return pushContext(state, stream, "interpolation");
      }
      if (type == "word") {
        var word = stream.current().toLowerCase();
        if (/^(only|not|and|or)$/.test(word))
          override = "keyword";
        else if (documentTypes.hasOwnProperty(word))
          override = "tag";
        else if (mediaTypes.hasOwnProperty(word))
          override = "attribute";
        else if (mediaFeatures.hasOwnProperty(word))
          override = "property";
        else if (nonStandardPropertyKeywords.hasOwnProperty(word))
          override = "string-2";
        else override = wordAsValue(stream.current());
        if (override == "tag" && endOfLine(stream)) {
          return pushContext(state, stream, "block");
        }
      }
      if (type == "operator" && /^(not|and|or)$/.test(stream.current())) {
        override = "keyword";
      }
      return state.context.type;
    };

    states.atBlock_parens = function(type, stream, state) {
      if (type == "{" || type == "}") return state.context.type;
      if (type == ")") {
        if (endOfLine(stream)) return pushContext(state, stream, "block");
        else return pushContext(state, stream, "atBlock");
      }
      if (type == "word") {
        var word = stream.current().toLowerCase();
        override = wordAsValue(word);
        if (/^(max|min)/.test(word)) override = "property";
        if (override == "tag") {
          tagVariablesRegexp.test(word) ? override = "variable-2" : override = "atom";
        }
        return state.context.type;
      }
      return states.atBlock(type, stream, state);
    };


    /**
     * Keyframes
     */
    states.keyframes = function(type, stream, state) {
      if (stream.indentation() == "0" && ((type == "}" && startOfLine(stream)) || type == "]" || type == "hash"
                                          || type == "qualifier" || wordIsTag(stream.current()))) {
        return popAndPass(type, stream, state);
      }
      if (type == "{") return pushContext(state, stream, "keyframes");
      if (type == "}") {
        if (startOfLine(stream)) return popContext(state, true);
        else return pushContext(state, stream, "keyframes");
      }
      if (type == "unit" && /^[0-9]+\%$/.test(stream.current())) {
        return pushContext(state, stream, "keyframes");
      }
      if (type == "word") {
        override = wordAsValue(stream.current());
        if (override == "block-keyword") {
          override = "keyword";
          return pushContext(state, stream, "keyframes");
        }
      }
      if (/@(font-face|media|supports|(-moz-)?document)/.test(type)) {
        return pushContext(state, stream, endOfLine(stream) ? "block" : "atBlock");
      }
      if (type == "mixin") {
        return pushContext(state, stream, "block", 0);
      }
      return state.context.type;
    };


    /**
     * Interpolation
     */
    states.interpolation = function(type, stream, state) {
      if (type == "{") popContext(state) && pushContext(state, stream, "block");
      if (type == "}") {
        if (stream.string.match(/^\s*(\.|#|:|\[|\*|&|>|~|\+|\/)/i) ||
            (stream.string.match(/^\s*[a-z]/i) && wordIsTag(firstWordOfLine(stream)))) {
          return pushContext(state, stream, "block");
        }
        if (!stream.string.match(/^(\{|\s*\&)/) ||
            stream.match(/\s*[\w-]/,false)) {
          return pushContext(state, stream, "block", 0);
        }
        return pushContext(state, stream, "block");
      }
      if (type == "variable-name") {
        return pushContext(state, stream, "variableName", 0);
      }
      if (type == "word") {
        override = wordAsValue(stream.current());
        if (override == "tag") override = "atom";
      }
      return state.context.type;
    };


    /**
     * Extend/s
     */
    states.extend = function(type, stream, state) {
      if (type == "[" || type == "=") return "extend";
      if (type == "]") return popContext(state);
      if (type == "word") {
        override = wordAsValue(stream.current());
        return "extend";
      }
      return popContext(state);
    };


    /**
     * Variable name
     */
    states.variableName = function(type, stream, state) {
      if (type == "string" || type == "[" || type == "]" || stream.current().match(/^(\.|\$)/)) {
        if (stream.current().match(/^\.[\w-]+/i)) override = "variable-2";
        return "variableName";
      }
      return popAndPass(type, stream, state);
    };


    return {
      startState: function(base) {
        return {
          tokenize: null,
          state: "block",
          context: new Context("block", base || 0, null)
        };
      },
      token: function(stream, state) {
        if (!state.tokenize && stream.eatSpace()) return null;
        style = (state.tokenize || tokenBase)(stream, state);
        if (style && typeof style == "object") {
          type = style[1];
          style = style[0];
        }
        override = style;
        state.state = states[state.state](type, stream, state);
        return override;
      },
      indent: function(state, textAfter, line) {

        var cx = state.context,
            ch = textAfter && textAfter.charAt(0),
            indent = cx.indent,
            lineFirstWord = firstWordOfLine(textAfter),
            lineIndent = line.length - line.replace(/^\s*/, "").length,
            prevLineFirstWord = state.context.prev ? state.context.prev.line.firstWord : "",
            prevLineIndent = state.context.prev ? state.context.prev.line.indent : lineIndent;

        if (cx.prev &&
            (ch == "}" && (cx.type == "block" || cx.type == "atBlock" || cx.type == "keyframes") ||
             ch == ")" && (cx.type == "parens" || cx.type == "atBlock_parens") ||
             ch == "{" && (cx.type == "at"))) {
          indent = cx.indent - indentUnit;
          cx = cx.prev;
        } else if (!(/(\})/.test(ch))) {
          if (/@|\$|\d/.test(ch) ||
              /^\{/.test(textAfter) ||
/^\s*\/(\/|\*)/.test(textAfter) ||
              /^\s*\/\*/.test(prevLineFirstWord) ||
              /^\s*[\w-\.\[\]\'\"]+\s*(\?|:|\+)?=/i.test(textAfter) ||
/^(\+|-)?[a-z][\w-]*\(/i.test(textAfter) ||
/^return/.test(textAfter) ||
              wordIsBlock(lineFirstWord)) {
            indent = lineIndent;
          } else if (/(\.|#|:|\[|\*|&|>|~|\+|\/)/.test(ch) || wordIsTag(lineFirstWord)) {
            if (/\,\s*$/.test(prevLineFirstWord)) {
              indent = prevLineIndent;
            } else if (/^\s+/.test(line) && (/(\.|#|:|\[|\*|&|>|~|\+|\/)/.test(prevLineFirstWord) || wordIsTag(prevLineFirstWord))) {
              indent = lineIndent <= prevLineIndent ? prevLineIndent : prevLineIndent + indentUnit;
            } else {
              indent = lineIndent;
            }
          } else if (!/,\s*$/.test(line) && (wordIsVendorPrefix(lineFirstWord) || wordIsProperty(lineFirstWord))) {
            if (wordIsBlock(prevLineFirstWord)) {
              indent = lineIndent <= prevLineIndent ? prevLineIndent : prevLineIndent + indentUnit;
            } else if (/^\{/.test(prevLineFirstWord)) {
              indent = lineIndent <= prevLineIndent ? lineIndent : prevLineIndent + indentUnit;
            } else if (wordIsVendorPrefix(prevLineFirstWord) || wordIsProperty(prevLineFirstWord)) {
              indent = lineIndent >= prevLineIndent ? prevLineIndent : lineIndent;
            } else if (/^(\.|#|:|\[|\*|&|@|\+|\-|>|~|\/)/.test(prevLineFirstWord) ||
                      /=\s*$/.test(prevLineFirstWord) ||
                      wordIsTag(prevLineFirstWord) ||
                      /^\$[\w-\.\[\]\'\"]/.test(prevLineFirstWord)) {
              indent = prevLineIndent + indentUnit;
            } else {
              indent = lineIndent;
            }
          }
        }
        return indent;
      },
      electricChars: "}",
      lineComment: "//",
      fold: "indent"
    };
  });

  // developer.mozilla.org/en-US/docs/Web/HTML/Element
  var tagKeywords_ = ["a","abbr","address","area","article","aside","audio", "b", "base","bdi", "bdo","bgsound","blockquote","body","br","button","canvas","caption","cite", "code","col","colgroup","data","datalist","dd","del","details","dfn","div", "dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1", "h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe", "img","input","ins","kbd","keygen","label","legend","li","link","main","map", "mark","marquee","menu","menuitem","meta","meter","nav","nobr","noframes", "noscript","object","ol","optgroup","option","output","p","param","pre", "progress","q","rp","rt","ruby","s","samp","script","section","select", "small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","track", "u","ul","var","video"];

  // github.com/codemirror/CodeMirror/blob/master/mode/css/css.js
  var documentTypes_ = ["domain", "regexp", "url", "url-prefix"];
  var mediaTypes_ = ["all","aural","braille","handheld","print","projection","screen","tty","tv","embossed"];
  var mediaFeatures_ = ["width","min-width","max-width","height","min-height","max-height","device-width","min-device-width","max-device-width","device-height","min-device-height","max-device-height","aspect-ratio","min-aspect-ratio","max-aspect-ratio","device-aspect-ratio","min-device-aspect-ratio","max-device-aspect-ratio","color","min-color","max-color","color-index","min-color-index","max-color-index","monochrome","min-monochrome","max-monochrome","resolution","min-resolution","max-resolution","scan","grid"];
  var propertyKeywords_ = ["align-content","align-items","align-self","alignment-adjust","alignment-baseline","anchor-point","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","appearance","azimuth","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","baseline-shift","binding","bleed","bookmark-label","bookmark-level","bookmark-state","bookmark-target","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","clear","clip","color","color-profile","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","crop","cue","cue-after","cue-before","cursor","direction","display","dominant-baseline","drop-initial-after-adjust","drop-initial-after-align","drop-initial-before-adjust","drop-initial-before-align","drop-initial-size","drop-initial-value","elevation","empty-cells","fit","fit-position","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","float-offset","flow-from","flow-into","font","font-feature-settings","font-family","font-kerning","font-language-override","font-size","font-size-adjust","font-stretch","font-style","font-synthesis","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-weight","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-position","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","inline-box-align","justify-content","left","letter-spacing","line-break","line-height","line-stacking","line-stacking-ruby","line-stacking-shift","line-stacking-strategy","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marker-offset","marks","marquee-direction","marquee-loop","marquee-play-count","marquee-speed","marquee-style","max-height","max-width","min-height","min-width","move-to","nav-down","nav-index","nav-left","nav-right","nav-up","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-style","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","page-policy","pause","pause-after","pause-before","perspective","perspective-origin","pitch","pitch-range","play-during","position","presentation-level","punctuation-trim","quotes","region-break-after","region-break-before","region-break-inside","region-fragment","rendering-intent","resize","rest","rest-after","rest-before","richness","right","rotation","rotation-point","ruby-align","ruby-overhang","ruby-position","ruby-span","shape-image-threshold","shape-inside","shape-margin","shape-outside","size","speak","speak-as","speak-header","speak-numeral","speak-punctuation","speech-rate","stress","string-set","tab-size","table-layout","target","target-name","target-new","target-position","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-style","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-height","text-indent","text-justify","text-outline","text-overflow","text-shadow","text-size-adjust","text-space-collapse","text-transform","text-underline-position","text-wrap","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","volume","white-space","widows","width","word-break","word-spacing","word-wrap","z-index","clip-path","clip-rule","mask","enable-background","filter","flood-color","flood-opacity","lighting-color","stop-color","stop-opacity","pointer-events","color-interpolation","color-interpolation-filters","color-rendering","fill","fill-opacity","fill-rule","image-rendering","marker","marker-end","marker-mid","marker-start","shape-rendering","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","text-rendering","baseline-shift","dominant-baseline","glyph-orientation-horizontal","glyph-orientation-vertical","text-anchor","writing-mode","font-smoothing","osx-font-smoothing"];
  var nonStandardPropertyKeywords_ = ["scrollbar-arrow-color","scrollbar-base-color","scrollbar-dark-shadow-color","scrollbar-face-color","scrollbar-highlight-color","scrollbar-shadow-color","scrollbar-3d-light-color","scrollbar-track-color","shape-inside","searchfield-cancel-button","searchfield-decoration","searchfield-results-button","searchfield-results-decoration","zoom"];
  var fontProperties_ = ["font-family","src","unicode-range","font-variant","font-feature-settings","font-stretch","font-weight","font-style"];
  var colorKeywords_ = ["aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen"];
  var valueKeywords_ = ["above","absolute","activeborder","additive","activecaption","afar","after-white-space","ahead","alias","all","all-scroll","alphabetic","alternate","always","amharic","amharic-abegede","antialiased","appworkspace","arabic-indic","armenian","asterisks","attr","auto","avoid","avoid-column","avoid-page","avoid-region","background","backwards","baseline","below","bidi-override","binary","bengali","blink","block","block-axis","bold","bolder","border","border-box","both","bottom","break","break-all","break-word","bullets","button","button-bevel","buttonface","buttonhighlight","buttonshadow","buttontext","calc","cambodian","capitalize","caps-lock-indicator","caption","captiontext","caret","cell","center","checkbox","circle","cjk-decimal","cjk-earthly-branch","cjk-heavenly-stem","cjk-ideographic","clear","clip","close-quote","col-resize","collapse","column","compact","condensed","contain","content","content-box","context-menu","continuous","copy","counter","counters","cover","crop","cross","crosshair","currentcolor","cursive","cyclic","dashed","decimal","decimal-leading-zero","default","default-button","destination-atop","destination-in","destination-out","destination-over","devanagari","disc","discard","disclosure-closed","disclosure-open","document","dot-dash","dot-dot-dash","dotted","double","down","e-resize","ease","ease-in","ease-in-out","ease-out","element","ellipse","ellipsis","embed","end","ethiopic","ethiopic-abegede","ethiopic-abegede-am-et","ethiopic-abegede-gez","ethiopic-abegede-ti-er","ethiopic-abegede-ti-et","ethiopic-halehame-aa-er","ethiopic-halehame-aa-et","ethiopic-halehame-am-et","ethiopic-halehame-gez","ethiopic-halehame-om-et","ethiopic-halehame-sid-et","ethiopic-halehame-so-et","ethiopic-halehame-ti-er","ethiopic-halehame-ti-et","ethiopic-halehame-tig","ethiopic-numeric","ew-resize","expanded","extends","extra-condensed","extra-expanded","fantasy","fast","fill","fixed","flat","flex","footnotes","forwards","from","geometricPrecision","georgian","graytext","groove","gujarati","gurmukhi","hand","hangul","hangul-consonant","hebrew","help","hidden","hide","higher","highlight","highlighttext","hiragana","hiragana-iroha","horizontal","hsl","hsla","icon","ignore","inactiveborder","inactivecaption","inactivecaptiontext","infinite","infobackground","infotext","inherit","initial","inline","inline-axis","inline-block","inline-flex","inline-table","inset","inside","intrinsic","invert","italic","japanese-formal","japanese-informal","justify","kannada","katakana","katakana-iroha","keep-all","khmer","korean-hangul-formal","korean-hanja-formal","korean-hanja-informal","landscape","lao","large","larger","left","level","lighter","line-through","linear","linear-gradient","lines","list-item","listbox","listitem","local","logical","loud","lower","lower-alpha","lower-armenian","lower-greek","lower-hexadecimal","lower-latin","lower-norwegian","lower-roman","lowercase","ltr","malayalam","match","matrix","matrix3d","media-controls-background","media-current-time-display","media-fullscreen-button","media-mute-button","media-play-button","media-return-to-realtime-button","media-rewind-button","media-seek-back-button","media-seek-forward-button","media-slider","media-sliderthumb","media-time-remaining-display","media-volume-slider","media-volume-slider-container","media-volume-sliderthumb","medium","menu","menulist","menulist-button","menulist-text","menulist-textfield","menutext","message-box","middle","min-intrinsic","mix","mongolian","monospace","move","multiple","myanmar","n-resize","narrower","ne-resize","nesw-resize","no-close-quote","no-drop","no-open-quote","no-repeat","none","normal","not-allowed","nowrap","ns-resize","numbers","numeric","nw-resize","nwse-resize","oblique","octal","open-quote","optimizeLegibility","optimizeSpeed","oriya","oromo","outset","outside","outside-shape","overlay","overline","padding","padding-box","painted","page","paused","persian","perspective","plus-darker","plus-lighter","pointer","polygon","portrait","pre","pre-line","pre-wrap","preserve-3d","progress","push-button","radial-gradient","radio","read-only","read-write","read-write-plaintext-only","rectangle","region","relative","repeat","repeating-linear-gradient","repeating-radial-gradient","repeat-x","repeat-y","reset","reverse","rgb","rgba","ridge","right","rotate","rotate3d","rotateX","rotateY","rotateZ","round","row-resize","rtl","run-in","running","s-resize","sans-serif","scale","scale3d","scaleX","scaleY","scaleZ","scroll","scrollbar","se-resize","searchfield","searchfield-cancel-button","searchfield-decoration","searchfield-results-button","searchfield-results-decoration","semi-condensed","semi-expanded","separate","serif","show","sidama","simp-chinese-formal","simp-chinese-informal","single","skew","skewX","skewY","skip-white-space","slide","slider-horizontal","slider-vertical","sliderthumb-horizontal","sliderthumb-vertical","slow","small","small-caps","small-caption","smaller","solid","somali","source-atop","source-in","source-out","source-over","space","spell-out","square","square-button","start","static","status-bar","stretch","stroke","sub","subpixel-antialiased","super","sw-resize","symbolic","symbols","table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row","table-row-group","tamil","telugu","text","text-bottom","text-top","textarea","textfield","thai","thick","thin","threeddarkshadow","threedface","threedhighlight","threedlightshadow","threedshadow","tibetan","tigre","tigrinya-er","tigrinya-er-abegede","tigrinya-et","tigrinya-et-abegede","to","top","trad-chinese-formal","trad-chinese-informal","translate","translate3d","translateX","translateY","translateZ","transparent","ultra-condensed","ultra-expanded","underline","up","upper-alpha","upper-armenian","upper-greek","upper-hexadecimal","upper-latin","upper-norwegian","upper-roman","uppercase","urdu","url","var","vertical","vertical-text","visible","visibleFill","visiblePainted","visibleStroke","visual","w-resize","wait","wave","wider","window","windowframe","windowtext","words","x-large","x-small","xor","xx-large","xx-small","bicubic","optimizespeed","grayscale","row","row-reverse","wrap","wrap-reverse","column-reverse","flex-start","flex-end","space-between","space-around"];

  var wordOperatorKeywords_ = ["in","and","or","not","is not","is a","is","isnt","defined","if unless"],
      blockKeywords_ = ["for","if","else","unless", "from", "to"],
      commonAtoms_ = ["null","true","false","href","title","type","not-allowed","readonly","disabled"],
      commonDef_ = ["@font-face", "@keyframes", "@media", "@viewport", "@page", "@host", "@supports", "@block", "@css"];

  var hintWords = tagKeywords_.concat(documentTypes_,mediaTypes_,mediaFeatures_,
                                      propertyKeywords_,nonStandardPropertyKeywords_,
                                      colorKeywords_,valueKeywords_,fontProperties_,
                                      wordOperatorKeywords_,blockKeywords_,
                                      commonAtoms_,commonDef_);

  function wordRegexp(words) {
    words = words.sort(function(a,b){return b > a;});
    return new RegExp("^((" + words.join(")|(") + "))\\b");
  }

  function keySet(array) {
    var keys = {};
    for (var i = 0; i < array.length; ++i) keys[array[i]] = true;
    return keys;
  }

  function escapeRegExp(text) {
    return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
  }

  CodeMirror.registerHelper("hintWords", "stylus", hintWords);
  CodeMirror.defineMIME("text/x-styl", "stylus");
});
codemirror/mode/stylus/index.html000064400000004650151215013500013173 0ustar00<!doctype html>

<title>CodeMirror: Stylus mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">
<link rel="stylesheet" href="../../lib/codemirror.css">
<link rel="stylesheet" href="../../addon/hint/show-hint.css">
<script src="../../lib/codemirror.js"></script>
<script src="stylus.js"></script>
<script src="../../addon/hint/show-hint.js"></script>
<script src="../../addon/hint/css-hint.js"></script>
<style>.CodeMirror {background: #f8f8f8;} form{margin-bottom: .7em;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Stylus</a>
  </ul>
</div>

<article>
<h2>Stylus mode</h2>
<form><textarea id="code" name="code">
/* Stylus mode */

#id,
.class,
article
  font-family Arial, sans-serif

#id,
.class,
article {
  font-family: Arial, sans-serif;
}

// Variables
font-size-base = 16px
line-height-base = 1.5
font-family-base = "Helvetica Neue", Helvetica, Arial, sans-serif
text-color = lighten(#000, 20%)

body
  font font-size-base/line-height-base font-family-base
  color text-color

body {
  font: 400 16px/1.5 "Helvetica Neue", Helvetica, Arial, sans-serif;
  color: #333;
}

// Variables
link-color = darken(#428bca, 6.5%)
link-hover-color = darken(link-color, 15%)
link-decoration = none
link-hover-decoration = false

// Mixin
tab-focus()
  outline thin dotted
  outline 5px auto -webkit-focus-ring-color
  outline-offset -2px

a
  color link-color
  if link-decoration
    text-decoration link-decoration
  &:hover
  &:focus
    color link-hover-color
    if link-hover-decoration
      text-decoration link-hover-decoration
  &:focus
    tab-focus()

a {
  color: #3782c4;
  text-decoration: none;
}
a:hover,
a:focus {
  color: #2f6ea7;
}
a:focus {
  outline: thin dotted;
  outline: 5px auto -webkit-focus-ring-color;
  outline-offset: -2px;
}
</textarea>
</form>
<script>
  var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
    extraKeys: {"Ctrl-Space": "autocomplete"},
    tabSize: 2
  });
</script>

<p><strong>MIME types defined:</strong> <code>text/x-styl</code>.</p>
<p>Created by <a href="https://github.com/dmitrykiselyov">Dmitry Kiselyov</a></p>
</article>
codemirror/mode/handlebars/handlebars.js000064400000004174151215013500014400 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"), require("../../addon/mode/simple"), require("../../addon/mode/multiplex"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror", "../../addon/mode/simple", "../../addon/mode/multiplex"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  CodeMirror.defineSimpleMode("handlebars-tags", {
    start: [
      { regex: /\{\{!--/, push: "dash_comment", token: "comment" },
      { regex: /\{\{!/,   push: "comment", token: "comment" },
      { regex: /\{\{/,    push: "handlebars", token: "tag" }
    ],
    handlebars: [
      { regex: /\}\}/, pop: true, token: "tag" },

      // Double and single quotes
      { regex: /"(?:[^\\"]|\\.)*"?/, token: "string" },
      { regex: /'(?:[^\\']|\\.)*'?/, token: "string" },

      // Handlebars keywords
      { regex: />|[#\/]([A-Za-z_]\w*)/, token: "keyword" },
      { regex: /(?:else|this)\b/, token: "keyword" },

      // Numeral
      { regex: /\d+/i, token: "number" },

      // Atoms like = and .
      { regex: /=|~|@|true|false/, token: "atom" },

      // Paths
      { regex: /(?:\.\.\/)*(?:[A-Za-z_][\w\.]*)+/, token: "variable-2" }
    ],
    dash_comment: [
      { regex: /--\}\}/, pop: true, token: "comment" },

      // Commented code
      { regex: /./, token: "comment"}
    ],
    comment: [
      { regex: /\}\}/, pop: true, token: "comment" },
      { regex: /./, token: "comment" }
    ]
  });

  CodeMirror.defineMode("handlebars", function(config, parserConfig) {
    var handlebars = CodeMirror.getMode(config, "handlebars-tags");
    if (!parserConfig || !parserConfig.base) return handlebars;
    return CodeMirror.multiplexingMode(
      CodeMirror.getMode(config, parserConfig.base),
      {open: "{{", close: "}}", mode: handlebars, parseDelimiters: true}
    );
  });

  CodeMirror.defineMIME("text/x-handlebars-template", "handlebars");
});
codemirror/mode/handlebars/index.html000064400000004224151215013500013730 0ustar00<!doctype html>

<title>CodeMirror: Handlebars mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/mode/simple.js"></script>
<script src="../../addon/mode/multiplex.js"></script>
<script src="../xml/xml.js"></script>
<script src="handlebars.js"></script>
<style>.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">HTML mixed</a>
  </ul>
</div>

<article>
<h2>Handlebars</h2>
<form><textarea id="code" name="code">
{{> breadcrumbs}}

{{!--
  You can use the t function to get
  content translated to the current locale, es:
  {{t 'article_list'}}
--}}

<h1>{{t 'article_list'}}</h1>

{{! one line comment }}

{{#each articles}}
  {{~title}}
  <p>{{excerpt body size=120 ellipsis=true}}</p>

  {{#with author}}
    written by {{first_name}} {{last_name}}
    from category: {{../category.title}}
    {{#if @../last}}foobar!{{/if}}
  {{/with~}}

  {{#if promoted.latest}}Read this one! {{else}} This is ok! {{/if}}

  {{#if @last}}<hr>{{/if}}
{{/each}}

{{#form new_comment}}
  <input type="text" name="body">
{{/form}}

</textarea></form>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        lineNumbers: true,
        matchBrackets: true,
        mode: {name: "handlebars", base: "text/html"}
      });
    </script>
    
    <p>Handlebars syntax highlighting for CodeMirror.</p>

    <p><strong>MIME types defined:</strong> <code>text/x-handlebars-template</code></p>

    <p>Supported options: <code>base</code> to set the mode to
    wrap. For example, use</p>
    <pre>mode: {name: "handlebars", base: "text/html"}</pre>
    <p>to highlight an HTML template.</p>
</article>
codemirror/mode/brainfuck/brainfuck.js000064400000004176151215013500014104 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

// Brainfuck mode created by Michael Kaminsky https://github.com/mkaminsky11

(function(mod) {
  if (typeof exports == "object" && typeof module == "object")
    mod(require("../../lib/codemirror"))
  else if (typeof define == "function" && define.amd)
    define(["../../lib/codemirror"], mod)
  else
    mod(CodeMirror)
})(function(CodeMirror) {
  "use strict"
  var reserve = "><+-.,[]".split("");
  /*
  comments can be either:
  placed behind lines

        +++    this is a comment

  where reserved characters cannot be used
  or in a loop
  [
    this is ok to use [ ] and stuff
  ]
  or preceded by #
  */
  CodeMirror.defineMode("brainfuck", function() {
    return {
      startState: function() {
        return {
          commentLine: false,
          left: 0,
          right: 0,
          commentLoop: false
        }
      },
      token: function(stream, state) {
        if (stream.eatSpace()) return null
        if(stream.sol()){
          state.commentLine = false;
        }
        var ch = stream.next().toString();
        if(reserve.indexOf(ch) !== -1){
          if(state.commentLine === true){
            if(stream.eol()){
              state.commentLine = false;
            }
            return "comment";
          }
          if(ch === "]" || ch === "["){
            if(ch === "["){
              state.left++;
            }
            else{
              state.right++;
            }
            return "bracket";
          }
          else if(ch === "+" || ch === "-"){
            return "keyword";
          }
          else if(ch === "<" || ch === ">"){
            return "atom";
          }
          else if(ch === "." || ch === ","){
            return "def";
          }
        }
        else{
          state.commentLine = true;
          if(stream.eol()){
            state.commentLine = false;
          }
          return "comment";
        }
        if(stream.eol()){
          state.commentLine = false;
        }
      }
    };
  });
CodeMirror.defineMIME("text/x-brainfuck","brainfuck")
});
codemirror/mode/brainfuck/index.html000064400000006412151215013500013572 0ustar00<!doctype html>

<title>CodeMirror: Brainfuck mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="./brainfuck.js"></script>
<style>
	.CodeMirror { border: 2px inset #dee; }
    </style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#"></a>
  </ul>
</div>

<article>
<h2>Brainfuck mode</h2>
<form><textarea id="code" name="code">
[ This program prints "Hello World!" and a newline to the screen, its
  length is 106 active command characters [it is not the shortest.]

  This loop is a "comment loop", it's a simple way of adding a comment
  to a BF program such that you don't have to worry about any command
  characters. Any ".", ",", "+", "-", "&lt;" and "&gt;" characters are simply
  ignored, the "[" and "]" characters just have to be balanced.
]
+++++ +++               Set Cell #0 to 8
[
    &gt;++++               Add 4 to Cell #1; this will always set Cell #1 to 4
    [                   as the cell will be cleared by the loop
        &gt;++             Add 2 to Cell #2
        &gt;+++            Add 3 to Cell #3
        &gt;+++            Add 3 to Cell #4
        &gt;+              Add 1 to Cell #5
        &lt;&lt;&lt;&lt;-           Decrement the loop counter in Cell #1
    ]                   Loop till Cell #1 is zero; number of iterations is 4
    &gt;+                  Add 1 to Cell #2
    &gt;+                  Add 1 to Cell #3
    &gt;-                  Subtract 1 from Cell #4
    &gt;&gt;+                 Add 1 to Cell #6
    [&lt;]                 Move back to the first zero cell you find; this will
                        be Cell #1 which was cleared by the previous loop
    &lt;-                  Decrement the loop Counter in Cell #0
]                       Loop till Cell #0 is zero; number of iterations is 8

The result of this is:
Cell No :   0   1   2   3   4   5   6
Contents:   0   0  72 104  88  32   8
Pointer :   ^

&gt;&gt;.                     Cell #2 has value 72 which is 'H'
&gt;---.                   Subtract 3 from Cell #3 to get 101 which is 'e'
+++++++..+++.           Likewise for 'llo' from Cell #3
&gt;&gt;.                     Cell #5 is 32 for the space
&lt;-.                     Subtract 1 from Cell #4 for 87 to give a 'W'
&lt;.                      Cell #3 was set to 'o' from the end of 'Hello'
+++.------.--------.    Cell #3 for 'rl' and 'd'
&gt;&gt;+.                    Add 1 to Cell #5 gives us an exclamation point
&gt;++.                    And finally a newline from Cell #6
</textarea></form>

    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        lineNumbers: true,
        matchBrackets: true,
        mode: "text/x-brainfuck"
      });
    </script>

    <p>A mode for Brainfuck</p>

    <p><strong>MIME types defined:</strong> <code>text/x-brainfuck</code></p>
  </article>
codemirror/mode/markdown/index.html000064400000025315151215013500013453 0ustar00<!doctype html>

<title>CodeMirror: Markdown mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/continuelist.js"></script>
<script src="../xml/xml.js"></script>
<script src="markdown.js"></script>
<style type="text/css">
      .CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}
      .cm-s-default .cm-trailing-space-a:before,
      .cm-s-default .cm-trailing-space-b:before {position: absolute; content: "\00B7"; color: #777;}
      .cm-s-default .cm-trailing-space-new-line:before {position: absolute; content: "\21B5"; color: #777;}
    </style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Markdown</a>
  </ul>
</div>

<article>
<h2>Markdown mode</h2>
<form><textarea id="code" name="code">
Markdown: Basics
================

&lt;ul id="ProjectSubmenu"&gt;
    &lt;li&gt;&lt;a href="/projects/markdown/" title="Markdown Project Page"&gt;Main&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a class="selected" title="Markdown Basics"&gt;Basics&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="/projects/markdown/syntax" title="Markdown Syntax Documentation"&gt;Syntax&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="/projects/markdown/license" title="Pricing and License Information"&gt;License&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="/projects/markdown/dingus" title="Online Markdown Web Form"&gt;Dingus&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


Getting the Gist of Markdown's Formatting Syntax
------------------------------------------------

This page offers a brief overview of what it's like to use Markdown.
The [syntax page] [s] provides complete, detailed documentation for
every feature, but Markdown should be very easy to pick up simply by
looking at a few examples of it in action. The examples on this page
are written in a before/after style, showing example syntax and the
HTML output produced by Markdown.

It's also helpful to simply try Markdown out; the [Dingus] [d] is a
web application that allows you type your own Markdown-formatted text
and translate it to XHTML.

**Note:** This document is itself written using Markdown; you
can [see the source for it by adding '.text' to the URL] [src].

  [s]: /projects/markdown/syntax  "Markdown Syntax"
  [d]: /projects/markdown/dingus  "Markdown Dingus"
  [src]: /projects/markdown/basics.text


## Paragraphs, Headers, Blockquotes ##

A paragraph is simply one or more consecutive lines of text, separated
by one or more blank lines. (A blank line is any line that looks like
a blank line -- a line containing nothing but spaces or tabs is
considered blank.) Normal paragraphs should not be indented with
spaces or tabs.

Markdown offers two styles of headers: *Setext* and *atx*.
Setext-style headers for `&lt;h1&gt;` and `&lt;h2&gt;` are created by
"underlining" with equal signs (`=`) and hyphens (`-`), respectively.
To create an atx-style header, you put 1-6 hash marks (`#`) at the
beginning of the line -- the number of hashes equals the resulting
HTML header level.

Blockquotes are indicated using email-style '`&gt;`' angle brackets.

Markdown:

    A First Level Header
    ====================
    
    A Second Level Header
    ---------------------

    Now is the time for all good men to come to
    the aid of their country. This is just a
    regular paragraph.

    The quick brown fox jumped over the lazy
    dog's back.
    
    ### Header 3

    &gt; This is a blockquote.
    &gt; 
    &gt; This is the second paragraph in the blockquote.
    &gt;
    &gt; ## This is an H2 in a blockquote


Output:

    &lt;h1&gt;A First Level Header&lt;/h1&gt;
    
    &lt;h2&gt;A Second Level Header&lt;/h2&gt;
    
    &lt;p&gt;Now is the time for all good men to come to
    the aid of their country. This is just a
    regular paragraph.&lt;/p&gt;
    
    &lt;p&gt;The quick brown fox jumped over the lazy
    dog's back.&lt;/p&gt;
    
    &lt;h3&gt;Header 3&lt;/h3&gt;
    
    &lt;blockquote&gt;
        &lt;p&gt;This is a blockquote.&lt;/p&gt;
        
        &lt;p&gt;This is the second paragraph in the blockquote.&lt;/p&gt;
        
        &lt;h2&gt;This is an H2 in a blockquote&lt;/h2&gt;
    &lt;/blockquote&gt;



### Phrase Emphasis ###

Markdown uses asterisks and underscores to indicate spans of emphasis.

Markdown:

    Some of these words *are emphasized*.
    Some of these words _are emphasized also_.
    
    Use two asterisks for **strong emphasis**.
    Or, if you prefer, __use two underscores instead__.

Output:

    &lt;p&gt;Some of these words &lt;em&gt;are emphasized&lt;/em&gt;.
    Some of these words &lt;em&gt;are emphasized also&lt;/em&gt;.&lt;/p&gt;
    
    &lt;p&gt;Use two asterisks for &lt;strong&gt;strong emphasis&lt;/strong&gt;.
    Or, if you prefer, &lt;strong&gt;use two underscores instead&lt;/strong&gt;.&lt;/p&gt;
   


## Lists ##

Unordered (bulleted) lists use asterisks, pluses, and hyphens (`*`,
`+`, and `-`) as list markers. These three markers are
interchangable; this:

    *   Candy.
    *   Gum.
    *   Booze.

this:

    +   Candy.
    +   Gum.
    +   Booze.

and this:

    -   Candy.
    -   Gum.
    -   Booze.

all produce the same output:

    &lt;ul&gt;
    &lt;li&gt;Candy.&lt;/li&gt;
    &lt;li&gt;Gum.&lt;/li&gt;
    &lt;li&gt;Booze.&lt;/li&gt;
    &lt;/ul&gt;

Ordered (numbered) lists use regular numbers, followed by periods, as
list markers:

    1.  Red
    2.  Green
    3.  Blue

Output:

    &lt;ol&gt;
    &lt;li&gt;Red&lt;/li&gt;
    &lt;li&gt;Green&lt;/li&gt;
    &lt;li&gt;Blue&lt;/li&gt;
    &lt;/ol&gt;

If you put blank lines between items, you'll get `&lt;p&gt;` tags for the
list item text. You can create multi-paragraph list items by indenting
the paragraphs by 4 spaces or 1 tab:

    *   A list item.
    
        With multiple paragraphs.

    *   Another item in the list.

Output:

    &lt;ul&gt;
    &lt;li&gt;&lt;p&gt;A list item.&lt;/p&gt;
    &lt;p&gt;With multiple paragraphs.&lt;/p&gt;&lt;/li&gt;
    &lt;li&gt;&lt;p&gt;Another item in the list.&lt;/p&gt;&lt;/li&gt;
    &lt;/ul&gt;
    


### Links ###

Markdown supports two styles for creating links: *inline* and
*reference*. With both styles, you use square brackets to delimit the
text you want to turn into a link.

Inline-style links use parentheses immediately after the link text.
For example:

    This is an [example link](http://example.com/).

Output:

    &lt;p&gt;This is an &lt;a href="http://example.com/"&gt;
    example link&lt;/a&gt;.&lt;/p&gt;

Optionally, you may include a title attribute in the parentheses:

    This is an [example link](http://example.com/ "With a Title").

Output:

    &lt;p&gt;This is an &lt;a href="http://example.com/" title="With a Title"&gt;
    example link&lt;/a&gt;.&lt;/p&gt;

Reference-style links allow you to refer to your links by names, which
you define elsewhere in your document:

    I get 10 times more traffic from [Google][1] than from
    [Yahoo][2] or [MSN][3].

    [1]: http://google.com/        "Google"
    [2]: http://search.yahoo.com/  "Yahoo Search"
    [3]: http://search.msn.com/    "MSN Search"

Output:

    &lt;p&gt;I get 10 times more traffic from &lt;a href="http://google.com/"
    title="Google"&gt;Google&lt;/a&gt; than from &lt;a href="http://search.yahoo.com/"
    title="Yahoo Search"&gt;Yahoo&lt;/a&gt; or &lt;a href="http://search.msn.com/"
    title="MSN Search"&gt;MSN&lt;/a&gt;.&lt;/p&gt;

The title attribute is optional. Link names may contain letters,
numbers and spaces, but are *not* case sensitive:

    I start my morning with a cup of coffee and
    [The New York Times][NY Times].

    [ny times]: http://www.nytimes.com/

Output:

    &lt;p&gt;I start my morning with a cup of coffee and
    &lt;a href="http://www.nytimes.com/"&gt;The New York Times&lt;/a&gt;.&lt;/p&gt;


### Images ###

Image syntax is very much like link syntax.

Inline (titles are optional):

    ![alt text](/path/to/img.jpg "Title")

Reference-style:

    ![alt text][id]

    [id]: /path/to/img.jpg "Title"

Both of the above examples produce the same output:

    &lt;img src="/path/to/img.jpg" alt="alt text" title="Title" /&gt;



### Code ###

In a regular paragraph, you can create code span by wrapping text in
backtick quotes. Any ampersands (`&amp;`) and angle brackets (`&lt;` or
`&gt;`) will automatically be translated into HTML entities. This makes
it easy to use Markdown to write about HTML example code:

    I strongly recommend against using any `&lt;blink&gt;` tags.

    I wish SmartyPants used named entities like `&amp;mdash;`
    instead of decimal-encoded entites like `&amp;#8212;`.

Output:

    &lt;p&gt;I strongly recommend against using any
    &lt;code&gt;&amp;lt;blink&amp;gt;&lt;/code&gt; tags.&lt;/p&gt;
    
    &lt;p&gt;I wish SmartyPants used named entities like
    &lt;code&gt;&amp;amp;mdash;&lt;/code&gt; instead of decimal-encoded
    entites like &lt;code&gt;&amp;amp;#8212;&lt;/code&gt;.&lt;/p&gt;


To specify an entire block of pre-formatted code, indent every line of
the block by 4 spaces or 1 tab. Just like with code spans, `&amp;`, `&lt;`,
and `&gt;` characters will be escaped automatically.

Markdown:

    If you want your page to validate under XHTML 1.0 Strict,
    you've got to put paragraph tags in your blockquotes:

        &lt;blockquote&gt;
            &lt;p&gt;For example.&lt;/p&gt;
        &lt;/blockquote&gt;

Output:

    &lt;p&gt;If you want your page to validate under XHTML 1.0 Strict,
    you've got to put paragraph tags in your blockquotes:&lt;/p&gt;
    
    &lt;pre&gt;&lt;code&gt;&amp;lt;blockquote&amp;gt;
        &amp;lt;p&amp;gt;For example.&amp;lt;/p&amp;gt;
    &amp;lt;/blockquote&amp;gt;
    &lt;/code&gt;&lt;/pre&gt;
</textarea></form>

    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        mode: 'markdown',
        lineNumbers: true,
        theme: "default",
        extraKeys: {"Enter": "newlineAndIndentContinueMarkdownList"}
      });
    </script>

    <p>You might want to use the <a href="../gfm/index.html">Github-Flavored Markdown mode</a> instead, which adds support for fenced code blocks and a few other things.</p>

    <p>Optionally depends on the XML mode for properly highlighted inline XML blocks.</p>
    
    <p><strong>MIME types defined:</strong> <code>text/x-markdown</code>.</p>

    <p><strong>Parsing/Highlighting Tests:</strong> <a href="../../test/index.html#markdown_*">normal</a>,  <a href="../../test/index.html#verbose,markdown_*">verbose</a>.</p>

  </article>
codemirror/mode/markdown/markdown.js000064400000062252151215013500013637 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"), require("../xml/xml"), require("../meta"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror", "../xml/xml", "../meta"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {

  var htmlMode = CodeMirror.getMode(cmCfg, "text/html");
  var htmlModeMissing = htmlMode.name == "null"

  function getMode(name) {
    if (CodeMirror.findModeByName) {
      var found = CodeMirror.findModeByName(name);
      if (found) name = found.mime || found.mimes[0];
    }
    var mode = CodeMirror.getMode(cmCfg, name);
    return mode.name == "null" ? null : mode;
  }

  // Should characters that affect highlighting be highlighted separate?
  // Does not include characters that will be output (such as `1.` and `-` for lists)
  if (modeCfg.highlightFormatting === undefined)
    modeCfg.highlightFormatting = false;

  // Maximum number of nested blockquotes. Set to 0 for infinite nesting.
  // Excess `>` will emit `error` token.
  if (modeCfg.maxBlockquoteDepth === undefined)
    modeCfg.maxBlockquoteDepth = 0;

  // Should underscores in words open/close em/strong?
  if (modeCfg.underscoresBreakWords === undefined)
    modeCfg.underscoresBreakWords = true;

  // Use `fencedCodeBlocks` to configure fenced code blocks. false to
  // disable, string to specify a precise regexp that the fence should
  // match, and true to allow three or more backticks or tildes (as
  // per CommonMark).

  // Turn on task lists? ("- [ ] " and "- [x] ")
  if (modeCfg.taskLists === undefined) modeCfg.taskLists = false;

  // Turn on strikethrough syntax
  if (modeCfg.strikethrough === undefined)
    modeCfg.strikethrough = false;

  // Allow token types to be overridden by user-provided token types.
  if (modeCfg.tokenTypeOverrides === undefined)
    modeCfg.tokenTypeOverrides = {};

  var tokenTypes = {
    header: "header",
    code: "comment",
    quote: "quote",
    list1: "variable-2",
    list2: "variable-3",
    list3: "keyword",
    hr: "hr",
    image: "image",
    imageAltText: "image-alt-text",
    imageMarker: "image-marker",
    formatting: "formatting",
    linkInline: "link",
    linkEmail: "link",
    linkText: "link",
    linkHref: "string",
    em: "em",
    strong: "strong",
    strikethrough: "strikethrough"
  };

  for (var tokenType in tokenTypes) {
    if (tokenTypes.hasOwnProperty(tokenType) && modeCfg.tokenTypeOverrides[tokenType]) {
      tokenTypes[tokenType] = modeCfg.tokenTypeOverrides[tokenType];
    }
  }

  var hrRE = /^([*\-_])(?:\s*\1){2,}\s*$/
  ,   ulRE = /^[*\-+]\s+/
  ,   olRE = /^[0-9]+([.)])\s+/
  ,   taskListRE = /^\[(x| )\](?=\s)/ // Must follow ulRE or olRE
  ,   atxHeaderRE = modeCfg.allowAtxHeaderWithoutSpace ? /^(#+)/ : /^(#+)(?: |$)/
  ,   setextHeaderRE = /^ *(?:\={1,}|-{1,})\s*$/
  ,   textRE = /^[^#!\[\]*_\\<>` "'(~]+/
  ,   fencedCodeRE = new RegExp("^(" + (modeCfg.fencedCodeBlocks === true ? "~~~+|```+" : modeCfg.fencedCodeBlocks) +
                                ")[ \\t]*([\\w+#\-]*)");

  function switchInline(stream, state, f) {
    state.f = state.inline = f;
    return f(stream, state);
  }

  function switchBlock(stream, state, f) {
    state.f = state.block = f;
    return f(stream, state);
  }

  function lineIsEmpty(line) {
    return !line || !/\S/.test(line.string)
  }

  // Blocks

  function blankLine(state) {
    // Reset linkTitle state
    state.linkTitle = false;
    // Reset EM state
    state.em = false;
    // Reset STRONG state
    state.strong = false;
    // Reset strikethrough state
    state.strikethrough = false;
    // Reset state.quote
    state.quote = 0;
    // Reset state.indentedCode
    state.indentedCode = false;
    if (htmlModeMissing && state.f == htmlBlock) {
      state.f = inlineNormal;
      state.block = blockNormal;
    }
    // Reset state.trailingSpace
    state.trailingSpace = 0;
    state.trailingSpaceNewLine = false;
    // Mark this line as blank
    state.prevLine = state.thisLine
    state.thisLine = null
    return null;
  }

  function blockNormal(stream, state) {

    var sol = stream.sol();

    var prevLineIsList = state.list !== false,
        prevLineIsIndentedCode = state.indentedCode;

    state.indentedCode = false;

    if (prevLineIsList) {
      if (state.indentationDiff >= 0) { // Continued list
        if (state.indentationDiff < 4) { // Only adjust indentation if *not* a code block
          state.indentation -= state.indentationDiff;
        }
        state.list = null;
      } else if (state.indentation > 0) {
        state.list = null;
      } else { // No longer a list
        state.list = false;
      }
    }

    var match = null;
    if (state.indentationDiff >= 4) {
      stream.skipToEnd();
      if (prevLineIsIndentedCode || lineIsEmpty(state.prevLine)) {
        state.indentation -= 4;
        state.indentedCode = true;
        return tokenTypes.code;
      } else {
        return null;
      }
    } else if (stream.eatSpace()) {
      return null;
    } else if ((match = stream.match(atxHeaderRE)) && match[1].length <= 6) {
      state.header = match[1].length;
      if (modeCfg.highlightFormatting) state.formatting = "header";
      state.f = state.inline;
      return getType(state);
    } else if (!lineIsEmpty(state.prevLine) && !state.quote && !prevLineIsList &&
               !prevLineIsIndentedCode && (match = stream.match(setextHeaderRE))) {
      state.header = match[0].charAt(0) == '=' ? 1 : 2;
      if (modeCfg.highlightFormatting) state.formatting = "header";
      state.f = state.inline;
      return getType(state);
    } else if (stream.eat('>')) {
      state.quote = sol ? 1 : state.quote + 1;
      if (modeCfg.highlightFormatting) state.formatting = "quote";
      stream.eatSpace();
      return getType(state);
    } else if (stream.peek() === '[') {
      return switchInline(stream, state, footnoteLink);
    } else if (stream.match(hrRE, true)) {
      state.hr = true;
      return tokenTypes.hr;
    } else if ((lineIsEmpty(state.prevLine) || prevLineIsList) && (stream.match(ulRE, false) || stream.match(olRE, false))) {
      var listType = null;
      if (stream.match(ulRE, true)) {
        listType = 'ul';
      } else {
        stream.match(olRE, true);
        listType = 'ol';
      }
      state.indentation = stream.column() + stream.current().length;
      state.list = true;

      // While this list item's marker's indentation
      // is less than the deepest list item's content's indentation,
      // pop the deepest list item indentation off the stack.
      while (state.listStack && stream.column() < state.listStack[state.listStack.length - 1]) {
        state.listStack.pop();
      }

      // Add this list item's content's indentation to the stack
      state.listStack.push(state.indentation);

      if (modeCfg.taskLists && stream.match(taskListRE, false)) {
        state.taskList = true;
      }
      state.f = state.inline;
      if (modeCfg.highlightFormatting) state.formatting = ["list", "list-" + listType];
      return getType(state);
    } else if (modeCfg.fencedCodeBlocks && (match = stream.match(fencedCodeRE, true))) {
      state.fencedChars = match[1]
      // try switching mode
      state.localMode = getMode(match[2]);
      if (state.localMode) state.localState = CodeMirror.startState(state.localMode);
      state.f = state.block = local;
      if (modeCfg.highlightFormatting) state.formatting = "code-block";
      state.code = -1
      return getType(state);
    }

    return switchInline(stream, state, state.inline);
  }

  function htmlBlock(stream, state) {
    var style = htmlMode.token(stream, state.htmlState);
    if (!htmlModeMissing) {
      var inner = CodeMirror.innerMode(htmlMode, state.htmlState)
      if ((inner.mode.name == "xml" && inner.state.tagStart === null &&
           (!inner.state.context && inner.state.tokenize.isInText)) ||
          (state.md_inside && stream.current().indexOf(">") > -1)) {
        state.f = inlineNormal;
        state.block = blockNormal;
        state.htmlState = null;
      }
    }
    return style;
  }

  function local(stream, state) {
    if (state.fencedChars && stream.match(state.fencedChars, false)) {
      state.localMode = state.localState = null;
      state.f = state.block = leavingLocal;
      return null;
    } else if (state.localMode) {
      return state.localMode.token(stream, state.localState);
    } else {
      stream.skipToEnd();
      return tokenTypes.code;
    }
  }

  function leavingLocal(stream, state) {
    stream.match(state.fencedChars);
    state.block = blockNormal;
    state.f = inlineNormal;
    state.fencedChars = null;
    if (modeCfg.highlightFormatting) state.formatting = "code-block";
    state.code = 1
    var returnType = getType(state);
    state.code = 0
    return returnType;
  }

  // Inline
  function getType(state) {
    var styles = [];

    if (state.formatting) {
      styles.push(tokenTypes.formatting);

      if (typeof state.formatting === "string") state.formatting = [state.formatting];

      for (var i = 0; i < state.formatting.length; i++) {
        styles.push(tokenTypes.formatting + "-" + state.formatting[i]);

        if (state.formatting[i] === "header") {
          styles.push(tokenTypes.formatting + "-" + state.formatting[i] + "-" + state.header);
        }

        // Add `formatting-quote` and `formatting-quote-#` for blockquotes
        // Add `error` instead if the maximum blockquote nesting depth is passed
        if (state.formatting[i] === "quote") {
          if (!modeCfg.maxBlockquoteDepth || modeCfg.maxBlockquoteDepth >= state.quote) {
            styles.push(tokenTypes.formatting + "-" + state.formatting[i] + "-" + state.quote);
          } else {
            styles.push("error");
          }
        }
      }
    }

    if (state.taskOpen) {
      styles.push("meta");
      return styles.length ? styles.join(' ') : null;
    }
    if (state.taskClosed) {
      styles.push("property");
      return styles.length ? styles.join(' ') : null;
    }

    if (state.linkHref) {
      styles.push(tokenTypes.linkHref, "url");
    } else { // Only apply inline styles to non-url text
      if (state.strong) { styles.push(tokenTypes.strong); }
      if (state.em) { styles.push(tokenTypes.em); }
      if (state.strikethrough) { styles.push(tokenTypes.strikethrough); }
      if (state.linkText) { styles.push(tokenTypes.linkText); }
      if (state.code) { styles.push(tokenTypes.code); }
      if (state.image) { styles.push(tokenTypes.image); }
      if (state.imageAltText) { styles.push(tokenTypes.imageAltText, "link"); }
      if (state.imageMarker) { styles.push(tokenTypes.imageMarker); }
    }

    if (state.header) { styles.push(tokenTypes.header, tokenTypes.header + "-" + state.header); }

    if (state.quote) {
      styles.push(tokenTypes.quote);

      // Add `quote-#` where the maximum for `#` is modeCfg.maxBlockquoteDepth
      if (!modeCfg.maxBlockquoteDepth || modeCfg.maxBlockquoteDepth >= state.quote) {
        styles.push(tokenTypes.quote + "-" + state.quote);
      } else {
        styles.push(tokenTypes.quote + "-" + modeCfg.maxBlockquoteDepth);
      }
    }

    if (state.list !== false) {
      var listMod = (state.listStack.length - 1) % 3;
      if (!listMod) {
        styles.push(tokenTypes.list1);
      } else if (listMod === 1) {
        styles.push(tokenTypes.list2);
      } else {
        styles.push(tokenTypes.list3);
      }
    }

    if (state.trailingSpaceNewLine) {
      styles.push("trailing-space-new-line");
    } else if (state.trailingSpace) {
      styles.push("trailing-space-" + (state.trailingSpace % 2 ? "a" : "b"));
    }

    return styles.length ? styles.join(' ') : null;
  }

  function handleText(stream, state) {
    if (stream.match(textRE, true)) {
      return getType(state);
    }
    return undefined;
  }

  function inlineNormal(stream, state) {
    var style = state.text(stream, state);
    if (typeof style !== 'undefined')
      return style;

    if (state.list) { // List marker (*, +, -, 1., etc)
      state.list = null;
      return getType(state);
    }

    if (state.taskList) {
      var taskOpen = stream.match(taskListRE, true)[1] !== "x";
      if (taskOpen) state.taskOpen = true;
      else state.taskClosed = true;
      if (modeCfg.highlightFormatting) state.formatting = "task";
      state.taskList = false;
      return getType(state);
    }

    state.taskOpen = false;
    state.taskClosed = false;

    if (state.header && stream.match(/^#+$/, true)) {
      if (modeCfg.highlightFormatting) state.formatting = "header";
      return getType(state);
    }

    // Get sol() value now, before character is consumed
    var sol = stream.sol();

    var ch = stream.next();

    // Matches link titles present on next line
    if (state.linkTitle) {
      state.linkTitle = false;
      var matchCh = ch;
      if (ch === '(') {
        matchCh = ')';
      }
      matchCh = (matchCh+'').replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
      var regex = '^\\s*(?:[^' + matchCh + '\\\\]+|\\\\\\\\|\\\\.)' + matchCh;
      if (stream.match(new RegExp(regex), true)) {
        return tokenTypes.linkHref;
      }
    }

    // If this block is changed, it may need to be updated in GFM mode
    if (ch === '`') {
      var previousFormatting = state.formatting;
      if (modeCfg.highlightFormatting) state.formatting = "code";
      stream.eatWhile('`');
      var count = stream.current().length
      if (state.code == 0) {
        state.code = count
        return getType(state)
      } else if (count == state.code) { // Must be exact
        var t = getType(state)
        state.code = 0
        return t
      } else {
        state.formatting = previousFormatting
        return getType(state)
      }
    } else if (state.code) {
      return getType(state);
    }

    if (ch === '\\') {
      stream.next();
      if (modeCfg.highlightFormatting) {
        var type = getType(state);
        var formattingEscape = tokenTypes.formatting + "-escape";
        return type ? type + " " + formattingEscape : formattingEscape;
      }
    }

    if (ch === '!' && stream.match(/\[[^\]]*\] ?(?:\(|\[)/, false)) {
      state.imageMarker = true;
      state.image = true;
      if (modeCfg.highlightFormatting) state.formatting = "image";
      return getType(state);
    }

    if (ch === '[' && state.imageMarker) {
      state.imageMarker = false;
      state.imageAltText = true
      if (modeCfg.highlightFormatting) state.formatting = "image";
      return getType(state);
    }

    if (ch === ']' && state.imageAltText) {
      if (modeCfg.highlightFormatting) state.formatting = "image";
      var type = getType(state);
      state.imageAltText = false;
      state.image = false;
      state.inline = state.f = linkHref;
      return type;
    }

    if (ch === '[' && stream.match(/[^\]]*\](\(.*\)| ?\[.*?\])/, false) && !state.image) {
      state.linkText = true;
      if (modeCfg.highlightFormatting) state.formatting = "link";
      return getType(state);
    }

    if (ch === ']' && state.linkText && stream.match(/\(.*?\)| ?\[.*?\]/, false)) {
      if (modeCfg.highlightFormatting) state.formatting = "link";
      var type = getType(state);
      state.linkText = false;
      state.inline = state.f = linkHref;
      return type;
    }

    if (ch === '<' && stream.match(/^(https?|ftps?):\/\/(?:[^\\>]|\\.)+>/, false)) {
      state.f = state.inline = linkInline;
      if (modeCfg.highlightFormatting) state.formatting = "link";
      var type = getType(state);
      if (type){
        type += " ";
      } else {
        type = "";
      }
      return type + tokenTypes.linkInline;
    }

    if (ch === '<' && stream.match(/^[^> \\]+@(?:[^\\>]|\\.)+>/, false)) {
      state.f = state.inline = linkInline;
      if (modeCfg.highlightFormatting) state.formatting = "link";
      var type = getType(state);
      if (type){
        type += " ";
      } else {
        type = "";
      }
      return type + tokenTypes.linkEmail;
    }

    if (ch === '<' && stream.match(/^(!--|\w)/, false)) {
      var end = stream.string.indexOf(">", stream.pos);
      if (end != -1) {
        var atts = stream.string.substring(stream.start, end);
        if (/markdown\s*=\s*('|"){0,1}1('|"){0,1}/.test(atts)) state.md_inside = true;
      }
      stream.backUp(1);
      state.htmlState = CodeMirror.startState(htmlMode);
      return switchBlock(stream, state, htmlBlock);
    }

    if (ch === '<' && stream.match(/^\/\w*?>/)) {
      state.md_inside = false;
      return "tag";
    }

    var ignoreUnderscore = false;
    if (!modeCfg.underscoresBreakWords) {
      if (ch === '_' && stream.peek() !== '_' && stream.match(/(\w)/, false)) {
        var prevPos = stream.pos - 2;
        if (prevPos >= 0) {
          var prevCh = stream.string.charAt(prevPos);
          if (prevCh !== '_' && prevCh.match(/(\w)/, false)) {
            ignoreUnderscore = true;
          }
        }
      }
    }
    if (ch === '*' || (ch === '_' && !ignoreUnderscore)) {
      if (sol && stream.peek() === ' ') {
        // Do nothing, surrounded by newline and space
      } else if (state.strong === ch && stream.eat(ch)) { // Remove STRONG
        if (modeCfg.highlightFormatting) state.formatting = "strong";
        var t = getType(state);
        state.strong = false;
        return t;
      } else if (!state.strong && stream.eat(ch)) { // Add STRONG
        state.strong = ch;
        if (modeCfg.highlightFormatting) state.formatting = "strong";
        return getType(state);
      } else if (state.em === ch) { // Remove EM
        if (modeCfg.highlightFormatting) state.formatting = "em";
        var t = getType(state);
        state.em = false;
        return t;
      } else if (!state.em) { // Add EM
        state.em = ch;
        if (modeCfg.highlightFormatting) state.formatting = "em";
        return getType(state);
      }
    } else if (ch === ' ') {
      if (stream.eat('*') || stream.eat('_')) { // Probably surrounded by spaces
        if (stream.peek() === ' ') { // Surrounded by spaces, ignore
          return getType(state);
        } else { // Not surrounded by spaces, back up pointer
          stream.backUp(1);
        }
      }
    }

    if (modeCfg.strikethrough) {
      if (ch === '~' && stream.eatWhile(ch)) {
        if (state.strikethrough) {// Remove strikethrough
          if (modeCfg.highlightFormatting) state.formatting = "strikethrough";
          var t = getType(state);
          state.strikethrough = false;
          return t;
        } else if (stream.match(/^[^\s]/, false)) {// Add strikethrough
          state.strikethrough = true;
          if (modeCfg.highlightFormatting) state.formatting = "strikethrough";
          return getType(state);
        }
      } else if (ch === ' ') {
        if (stream.match(/^~~/, true)) { // Probably surrounded by space
          if (stream.peek() === ' ') { // Surrounded by spaces, ignore
            return getType(state);
          } else { // Not surrounded by spaces, back up pointer
            stream.backUp(2);
          }
        }
      }
    }

    if (ch === ' ') {
      if (stream.match(/ +$/, false)) {
        state.trailingSpace++;
      } else if (state.trailingSpace) {
        state.trailingSpaceNewLine = true;
      }
    }

    return getType(state);
  }

  function linkInline(stream, state) {
    var ch = stream.next();

    if (ch === ">") {
      state.f = state.inline = inlineNormal;
      if (modeCfg.highlightFormatting) state.formatting = "link";
      var type = getType(state);
      if (type){
        type += " ";
      } else {
        type = "";
      }
      return type + tokenTypes.linkInline;
    }

    stream.match(/^[^>]+/, true);

    return tokenTypes.linkInline;
  }

  function linkHref(stream, state) {
    // Check if space, and return NULL if so (to avoid marking the space)
    if(stream.eatSpace()){
      return null;
    }
    var ch = stream.next();
    if (ch === '(' || ch === '[') {
      state.f = state.inline = getLinkHrefInside(ch === "(" ? ")" : "]", 0);
      if (modeCfg.highlightFormatting) state.formatting = "link-string";
      state.linkHref = true;
      return getType(state);
    }
    return 'error';
  }

  var linkRE = {
    ")": /^(?:[^\\\(\)]|\\.|\((?:[^\\\(\)]|\\.)*\))*?(?=\))/,
    "]": /^(?:[^\\\[\]]|\\.|\[(?:[^\\\[\\]]|\\.)*\])*?(?=\])/
  }

  function getLinkHrefInside(endChar) {
    return function(stream, state) {
      var ch = stream.next();

      if (ch === endChar) {
        state.f = state.inline = inlineNormal;
        if (modeCfg.highlightFormatting) state.formatting = "link-string";
        var returnState = getType(state);
        state.linkHref = false;
        return returnState;
      }

      stream.match(linkRE[endChar])
      state.linkHref = true;
      return getType(state);
    };
  }

  function footnoteLink(stream, state) {
    if (stream.match(/^([^\]\\]|\\.)*\]:/, false)) {
      state.f = footnoteLinkInside;
      stream.next(); // Consume [
      if (modeCfg.highlightFormatting) state.formatting = "link";
      state.linkText = true;
      return getType(state);
    }
    return switchInline(stream, state, inlineNormal);
  }

  function footnoteLinkInside(stream, state) {
    if (stream.match(/^\]:/, true)) {
      state.f = state.inline = footnoteUrl;
      if (modeCfg.highlightFormatting) state.formatting = "link";
      var returnType = getType(state);
      state.linkText = false;
      return returnType;
    }

    stream.match(/^([^\]\\]|\\.)+/, true);

    return tokenTypes.linkText;
  }

  function footnoteUrl(stream, state) {
    // Check if space, and return NULL if so (to avoid marking the space)
    if(stream.eatSpace()){
      return null;
    }
    // Match URL
    stream.match(/^[^\s]+/, true);
    // Check for link title
    if (stream.peek() === undefined) { // End of line, set flag to check next line
      state.linkTitle = true;
    } else { // More content on line, check if link title
      stream.match(/^(?:\s+(?:"(?:[^"\\]|\\\\|\\.)+"|'(?:[^'\\]|\\\\|\\.)+'|\((?:[^)\\]|\\\\|\\.)+\)))?/, true);
    }
    state.f = state.inline = inlineNormal;
    return tokenTypes.linkHref + " url";
  }

  var mode = {
    startState: function() {
      return {
        f: blockNormal,

        prevLine: null,
        thisLine: null,

        block: blockNormal,
        htmlState: null,
        indentation: 0,

        inline: inlineNormal,
        text: handleText,

        formatting: false,
        linkText: false,
        linkHref: false,
        linkTitle: false,
        code: 0,
        em: false,
        strong: false,
        header: 0,
        hr: false,
        taskList: false,
        list: false,
        listStack: [],
        quote: 0,
        trailingSpace: 0,
        trailingSpaceNewLine: false,
        strikethrough: false,
        fencedChars: null
      };
    },

    copyState: function(s) {
      return {
        f: s.f,

        prevLine: s.prevLine,
        thisLine: s.thisLine,

        block: s.block,
        htmlState: s.htmlState && CodeMirror.copyState(htmlMode, s.htmlState),
        indentation: s.indentation,

        localMode: s.localMode,
        localState: s.localMode ? CodeMirror.copyState(s.localMode, s.localState) : null,

        inline: s.inline,
        text: s.text,
        formatting: false,
        linkTitle: s.linkTitle,
        code: s.code,
        em: s.em,
        strong: s.strong,
        strikethrough: s.strikethrough,
        header: s.header,
        hr: s.hr,
        taskList: s.taskList,
        list: s.list,
        listStack: s.listStack.slice(0),
        quote: s.quote,
        indentedCode: s.indentedCode,
        trailingSpace: s.trailingSpace,
        trailingSpaceNewLine: s.trailingSpaceNewLine,
        md_inside: s.md_inside,
        fencedChars: s.fencedChars
      };
    },

    token: function(stream, state) {

      // Reset state.formatting
      state.formatting = false;

      if (stream != state.thisLine) {
        var forceBlankLine = state.header || state.hr;

        // Reset state.header and state.hr
        state.header = 0;
        state.hr = false;

        if (stream.match(/^\s*$/, true) || forceBlankLine) {
          blankLine(state);
          if (!forceBlankLine) return null
          state.prevLine = null
        }

        state.prevLine = state.thisLine
        state.thisLine = stream

        // Reset state.taskList
        state.taskList = false;

        // Reset state.trailingSpace
        state.trailingSpace = 0;
        state.trailingSpaceNewLine = false;

        state.f = state.block;
        var indentation = stream.match(/^\s*/, true)[0].replace(/\t/g, '    ').length;
        state.indentationDiff = Math.min(indentation - state.indentation, 4);
        state.indentation = state.indentation + state.indentationDiff;
        if (indentation > 0) return null;
      }
      return state.f(stream, state);
    },

    innerMode: function(state) {
      if (state.block == htmlBlock) return {state: state.htmlState, mode: htmlMode};
      if (state.localState) return {state: state.localState, mode: state.localMode};
      return {state: state, mode: mode};
    },

    blankLine: blankLine,

    getType: getType,

    fold: "markdown"
  };
  return mode;
}, "xml");

CodeMirror.defineMIME("text/x-markdown", "markdown");

});
codemirror/mode/markdown/test.js000064400000071736151215013500013003 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function() {
  var mode = CodeMirror.getMode({tabSize: 4}, "markdown");
  function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); }
  var modeHighlightFormatting = CodeMirror.getMode({tabSize: 4}, {name: "markdown", highlightFormatting: true});
  function FT(name) { test.mode(name, modeHighlightFormatting, Array.prototype.slice.call(arguments, 1)); }
  var modeAtxNoSpace = CodeMirror.getMode({tabSize: 4}, {name: "markdown", allowAtxHeaderWithoutSpace: true});
  function AtxNoSpaceTest(name) { test.mode(name, modeAtxNoSpace, Array.prototype.slice.call(arguments, 1)); }
  var modeFenced = CodeMirror.getMode({tabSize: 4}, {name: "markdown", fencedCodeBlocks: true});
  function FencedTest(name) { test.mode(name, modeFenced, Array.prototype.slice.call(arguments, 1)); }
  var modeOverrideClasses = CodeMirror.getMode({tabsize: 4}, {
    name: "markdown",
    strikethrough: true,
    tokenTypeOverrides: {
      "header" : "override-header",
      "code" : "override-code",
      "quote" : "override-quote",
      "list1" : "override-list1",
      "list2" : "override-list2",
      "list3" : "override-list3",
      "hr" : "override-hr",
      "image" : "override-image",
      "imageAltText": "override-image-alt-text",
      "imageMarker": "override-image-marker",
      "linkInline" : "override-link-inline",
      "linkEmail" : "override-link-email",
      "linkText" : "override-link-text",
      "linkHref" : "override-link-href",
      "em" : "override-em",
      "strong" : "override-strong",
      "strikethrough" : "override-strikethrough"
  }});
  function TokenTypeOverrideTest(name) { test.mode(name, modeOverrideClasses, Array.prototype.slice.call(arguments, 1)); }
  var modeFormattingOverride = CodeMirror.getMode({tabsize: 4}, {
    name: "markdown",
    highlightFormatting: true,
    tokenTypeOverrides: {
      "formatting" : "override-formatting"
  }});
  function FormatTokenTypeOverrideTest(name) { test.mode(name, modeFormattingOverride, Array.prototype.slice.call(arguments, 1)); }


  FT("formatting_emAsterisk",
     "[em&formatting&formatting-em *][em foo][em&formatting&formatting-em *]");

  FT("formatting_emUnderscore",
     "[em&formatting&formatting-em _][em foo][em&formatting&formatting-em _]");

  FT("formatting_strongAsterisk",
     "[strong&formatting&formatting-strong **][strong foo][strong&formatting&formatting-strong **]");

  FT("formatting_strongUnderscore",
     "[strong&formatting&formatting-strong __][strong foo][strong&formatting&formatting-strong __]");

  FT("formatting_codeBackticks",
     "[comment&formatting&formatting-code `][comment foo][comment&formatting&formatting-code `]");

  FT("formatting_doubleBackticks",
     "[comment&formatting&formatting-code ``][comment foo ` bar][comment&formatting&formatting-code ``]");

  FT("formatting_atxHeader",
     "[header&header-1&formatting&formatting-header&formatting-header-1 # ][header&header-1 foo # bar ][header&header-1&formatting&formatting-header&formatting-header-1 #]");

  FT("formatting_setextHeader",
     "foo",
     "[header&header-1&formatting&formatting-header&formatting-header-1 =]");

  FT("formatting_blockquote",
     "[quote&quote-1&formatting&formatting-quote&formatting-quote-1 > ][quote&quote-1 foo]");

  FT("formatting_list",
     "[variable-2&formatting&formatting-list&formatting-list-ul - ][variable-2 foo]");
  FT("formatting_list",
     "[variable-2&formatting&formatting-list&formatting-list-ol 1. ][variable-2 foo]");

  FT("formatting_link",
     "[link&formatting&formatting-link [][link foo][link&formatting&formatting-link ]]][string&formatting&formatting-link-string&url (][string&url http://example.com/][string&formatting&formatting-link-string&url )]");

  FT("formatting_linkReference",
     "[link&formatting&formatting-link [][link foo][link&formatting&formatting-link ]]][string&formatting&formatting-link-string&url [][string&url bar][string&formatting&formatting-link-string&url ]]]",
     "[link&formatting&formatting-link [][link bar][link&formatting&formatting-link ]]:] [string&url http://example.com/]");

  FT("formatting_linkWeb",
     "[link&formatting&formatting-link <][link http://example.com/][link&formatting&formatting-link >]");

  FT("formatting_linkEmail",
     "[link&formatting&formatting-link <][link user@example.com][link&formatting&formatting-link >]");

  FT("formatting_escape",
     "[formatting-escape \\*]");

  FT("formatting_image",
     "[formatting&formatting-image&image&image-marker !][formatting&formatting-image&image&image-alt-text&link [[][image&image-alt-text&link alt text][formatting&formatting-image&image&image-alt-text&link ]]][formatting&formatting-link-string&string&url (][url&string http://link.to/image.jpg][formatting&formatting-link-string&string&url )]");

  MT("plainText",
     "foo");

  // Don't style single trailing space
  MT("trailingSpace1",
     "foo ");

  // Two or more trailing spaces should be styled with line break character
  MT("trailingSpace2",
     "foo[trailing-space-a  ][trailing-space-new-line  ]");

  MT("trailingSpace3",
     "foo[trailing-space-a  ][trailing-space-b  ][trailing-space-new-line  ]");

  MT("trailingSpace4",
     "foo[trailing-space-a  ][trailing-space-b  ][trailing-space-a  ][trailing-space-new-line  ]");

  // Code blocks using 4 spaces (regardless of CodeMirror.tabSize value)
  MT("codeBlocksUsing4Spaces",
     "    [comment foo]");

  // Code blocks using 4 spaces with internal indentation
  MT("codeBlocksUsing4SpacesIndentation",
     "    [comment bar]",
     "        [comment hello]",
     "            [comment world]",
     "    [comment foo]",
     "bar");

  // Code blocks should end even after extra indented lines
  MT("codeBlocksWithTrailingIndentedLine",
     "    [comment foo]",
     "        [comment bar]",
     "    [comment baz]",
     "    ",
     "hello");

  // Code blocks using 1 tab (regardless of CodeMirror.indentWithTabs value)
  MT("codeBlocksUsing1Tab",
     "\t[comment foo]");

  // No code blocks directly after paragraph
  // http://spec.commonmark.org/0.19/#example-65
  MT("noCodeBlocksAfterParagraph",
     "Foo",
     "    Bar");

  // Inline code using backticks
  MT("inlineCodeUsingBackticks",
     "foo [comment `bar`]");

  // Block code using single backtick (shouldn't work)
  MT("blockCodeSingleBacktick",
     "[comment `]",
     "[comment foo]",
     "[comment `]");

  // Unclosed backticks
  // Instead of simply marking as CODE, it would be nice to have an
  // incomplete flag for CODE, that is styled slightly different.
  MT("unclosedBackticks",
     "foo [comment `bar]");

  // Per documentation: "To include a literal backtick character within a
  // code span, you can use multiple backticks as the opening and closing
  // delimiters"
  MT("doubleBackticks",
     "[comment ``foo ` bar``]");

  // Tests based on Dingus
  // http://daringfireball.net/projects/markdown/dingus
  //
  // Multiple backticks within an inline code block
  MT("consecutiveBackticks",
     "[comment `foo```bar`]");

  // Multiple backticks within an inline code block with a second code block
  MT("consecutiveBackticks",
     "[comment `foo```bar`] hello [comment `world`]");

  // Unclosed with several different groups of backticks
  MT("unclosedBackticks",
     "[comment ``foo ``` bar` hello]");

  // Closed with several different groups of backticks
  MT("closedBackticks",
     "[comment ``foo ``` bar` hello``] world");

  // atx headers
  // http://daringfireball.net/projects/markdown/syntax#header

  MT("atxH1",
     "[header&header-1 # foo]");

  MT("atxH2",
     "[header&header-2 ## foo]");

  MT("atxH3",
     "[header&header-3 ### foo]");

  MT("atxH4",
     "[header&header-4 #### foo]");

  MT("atxH5",
     "[header&header-5 ##### foo]");

  MT("atxH6",
     "[header&header-6 ###### foo]");

  // http://spec.commonmark.org/0.19/#example-24
  MT("noAtxH7",
     "####### foo");

  // http://spec.commonmark.org/0.19/#example-25
  MT("noAtxH1WithoutSpace",
     "#5 bolt");

  // CommonMark requires a space after # but most parsers don't
  AtxNoSpaceTest("atxNoSpaceAllowed_H1NoSpace",
     "[header&header-1 #foo]");

  AtxNoSpaceTest("atxNoSpaceAllowed_H4NoSpace",
     "[header&header-4 ####foo]");

  AtxNoSpaceTest("atxNoSpaceAllowed_H1Space",
     "[header&header-1 # foo]");

  // Inline styles should be parsed inside headers
  MT("atxH1inline",
     "[header&header-1 # foo ][header&header-1&em *bar*]");

  // Setext headers - H1, H2
  // Per documentation, "Any number of underlining =’s or -’s will work."
  // http://daringfireball.net/projects/markdown/syntax#header
  // Ideally, the text would be marked as `header` as well, but this is
  // not really feasible at the moment. So, instead, we're testing against
  // what works today, to avoid any regressions.
  //
  // Check if single underlining = works
  MT("setextH1",
     "foo",
     "[header&header-1 =]");

  // Check if 3+ ='s work
  MT("setextH1",
     "foo",
     "[header&header-1 ===]");

  // Check if single underlining - works
  MT("setextH2",
     "foo",
     "[header&header-2 -]");

  // Check if 3+ -'s work
  MT("setextH2",
     "foo",
     "[header&header-2 ---]");

  // http://spec.commonmark.org/0.19/#example-45
  MT("setextH2AllowSpaces",
     "foo",
     "   [header&header-2 ----      ]");

  // http://spec.commonmark.org/0.19/#example-44
  MT("noSetextAfterIndentedCodeBlock",
     "     [comment foo]",
     "[hr ---]");

  // http://spec.commonmark.org/0.19/#example-51
  MT("noSetextAfterQuote",
     "[quote&quote-1 > foo]",
     "[hr ---]");

  MT("noSetextAfterList",
     "[variable-2 - foo]",
     "[hr ---]");

  // Single-line blockquote with trailing space
  MT("blockquoteSpace",
     "[quote&quote-1 > foo]");

  // Single-line blockquote
  MT("blockquoteNoSpace",
     "[quote&quote-1 >foo]");

  // No blank line before blockquote
  MT("blockquoteNoBlankLine",
     "foo",
     "[quote&quote-1 > bar]");

  // Nested blockquote
  MT("blockquoteSpace",
     "[quote&quote-1 > foo]",
     "[quote&quote-1 >][quote&quote-2 > foo]",
     "[quote&quote-1 >][quote&quote-2 >][quote&quote-3 > foo]");

  // Single-line blockquote followed by normal paragraph
  MT("blockquoteThenParagraph",
     "[quote&quote-1 >foo]",
     "",
     "bar");

  // Multi-line blockquote (lazy mode)
  MT("multiBlockquoteLazy",
     "[quote&quote-1 >foo]",
     "[quote&quote-1 bar]");

  // Multi-line blockquote followed by normal paragraph (lazy mode)
  MT("multiBlockquoteLazyThenParagraph",
     "[quote&quote-1 >foo]",
     "[quote&quote-1 bar]",
     "",
     "hello");

  // Multi-line blockquote (non-lazy mode)
  MT("multiBlockquote",
     "[quote&quote-1 >foo]",
     "[quote&quote-1 >bar]");

  // Multi-line blockquote followed by normal paragraph (non-lazy mode)
  MT("multiBlockquoteThenParagraph",
     "[quote&quote-1 >foo]",
     "[quote&quote-1 >bar]",
     "",
     "hello");

  // Header with leading space after continued blockquote (#3287, negative indentation)
  MT("headerAfterContinuedBlockquote",
     "[quote&quote-1 > foo]",
     "[quote&quote-1 bar]",
     "",
     " [header&header-1 # hello]");

  // Check list types

  MT("listAsterisk",
     "foo",
     "bar",
     "",
     "[variable-2 * foo]",
     "[variable-2 * bar]");

  MT("listPlus",
     "foo",
     "bar",
     "",
     "[variable-2 + foo]",
     "[variable-2 + bar]");

  MT("listDash",
     "foo",
     "bar",
     "",
     "[variable-2 - foo]",
     "[variable-2 - bar]");

  MT("listNumber",
     "foo",
     "bar",
     "",
     "[variable-2 1. foo]",
     "[variable-2 2. bar]");

  // Lists require a preceding blank line (per Dingus)
  MT("listBogus",
     "foo",
     "1. bar",
     "2. hello");

  // List after hr
  MT("listAfterHr",
     "[hr ---]",
     "[variable-2 - bar]");

  // List after header
  MT("listAfterHeader",
     "[header&header-1 # foo]",
     "[variable-2 - bar]");

  // hr after list
  MT("hrAfterList",
     "[variable-2 - foo]",
     "[hr -----]");

  // Formatting in lists (*)
  MT("listAsteriskFormatting",
     "[variable-2 * ][variable-2&em *foo*][variable-2  bar]",
     "[variable-2 * ][variable-2&strong **foo**][variable-2  bar]",
     "[variable-2 * ][variable-2&strong **][variable-2&em&strong *foo**][variable-2&em *][variable-2  bar]",
     "[variable-2 * ][variable-2&comment `foo`][variable-2  bar]");

  // Formatting in lists (+)
  MT("listPlusFormatting",
     "[variable-2 + ][variable-2&em *foo*][variable-2  bar]",
     "[variable-2 + ][variable-2&strong **foo**][variable-2  bar]",
     "[variable-2 + ][variable-2&strong **][variable-2&em&strong *foo**][variable-2&em *][variable-2  bar]",
     "[variable-2 + ][variable-2&comment `foo`][variable-2  bar]");

  // Formatting in lists (-)
  MT("listDashFormatting",
     "[variable-2 - ][variable-2&em *foo*][variable-2  bar]",
     "[variable-2 - ][variable-2&strong **foo**][variable-2  bar]",
     "[variable-2 - ][variable-2&strong **][variable-2&em&strong *foo**][variable-2&em *][variable-2  bar]",
     "[variable-2 - ][variable-2&comment `foo`][variable-2  bar]");

  // Formatting in lists (1.)
  MT("listNumberFormatting",
     "[variable-2 1. ][variable-2&em *foo*][variable-2  bar]",
     "[variable-2 2. ][variable-2&strong **foo**][variable-2  bar]",
     "[variable-2 3. ][variable-2&strong **][variable-2&em&strong *foo**][variable-2&em *][variable-2  bar]",
     "[variable-2 4. ][variable-2&comment `foo`][variable-2  bar]");

  // Paragraph lists
  MT("listParagraph",
     "[variable-2 * foo]",
     "",
     "[variable-2 * bar]");

  // Multi-paragraph lists
  //
  // 4 spaces
  MT("listMultiParagraph",
     "[variable-2 * foo]",
     "",
     "[variable-2 * bar]",
     "",
     "    [variable-2 hello]");

  // 4 spaces, extra blank lines (should still be list, per Dingus)
  MT("listMultiParagraphExtra",
     "[variable-2 * foo]",
     "",
     "[variable-2 * bar]",
     "",
     "",
     "    [variable-2 hello]");

  // 4 spaces, plus 1 space (should still be list, per Dingus)
  MT("listMultiParagraphExtraSpace",
     "[variable-2 * foo]",
     "",
     "[variable-2 * bar]",
     "",
     "     [variable-2 hello]",
     "",
     "    [variable-2 world]");

  // 1 tab
  MT("listTab",
     "[variable-2 * foo]",
     "",
     "[variable-2 * bar]",
     "",
     "\t[variable-2 hello]");

  // No indent
  MT("listNoIndent",
     "[variable-2 * foo]",
     "",
     "[variable-2 * bar]",
     "",
     "hello");

  MT("listCommonMarkIndentationCode",
     "[variable-2 * Code blocks also affect]",
     "  [variable-3 * The next level starts where the contents start.]",
     "   [variable-3 *    Anything less than that will keep the item on the same level.]",
     "       [variable-3 * Each list item can indent the first level further and further.]",
     "  [variable-3 * For the most part, this makes sense while writing a list.]",
     "    [keyword * This means two items with same indentation can be different levels.]",
     "     [keyword *  Each level has an indent requirement that can change between items.]",
     "       [keyword * A list item that meets this will be part of the next level.]",
     "   [variable-3 * Otherwise, it will be part of the level where it does meet this.]",
     " [variable-2 * World]");

  // Blockquote
  MT("blockquote",
     "[variable-2 * foo]",
     "",
     "[variable-2 * bar]",
     "",
     "    [variable-2&quote&quote-1 > hello]");

  // Code block
  MT("blockquoteCode",
     "[variable-2 * foo]",
     "",
     "[variable-2 * bar]",
     "",
     "        [comment > hello]",
     "",
     "    [variable-2 world]");

  // Code block followed by text
  MT("blockquoteCodeText",
     "[variable-2 * foo]",
     "",
     "    [variable-2 bar]",
     "",
     "        [comment hello]",
     "",
     "    [variable-2 world]");

  // Nested list

  MT("listAsteriskNested",
     "[variable-2 * foo]",
     "",
     "    [variable-3 * bar]");

  MT("listPlusNested",
     "[variable-2 + foo]",
     "",
     "    [variable-3 + bar]");

  MT("listDashNested",
     "[variable-2 - foo]",
     "",
     "    [variable-3 - bar]");

  MT("listNumberNested",
     "[variable-2 1. foo]",
     "",
     "    [variable-3 2. bar]");

  MT("listMixed",
     "[variable-2 * foo]",
     "",
     "    [variable-3 + bar]",
     "",
     "        [keyword - hello]",
     "",
     "            [variable-2 1. world]");

  MT("listBlockquote",
     "[variable-2 * foo]",
     "",
     "    [variable-3 + bar]",
     "",
     "        [quote&quote-1&variable-3 > hello]");

  MT("listCode",
     "[variable-2 * foo]",
     "",
     "    [variable-3 + bar]",
     "",
     "            [comment hello]");

  // Code with internal indentation
  MT("listCodeIndentation",
     "[variable-2 * foo]",
     "",
     "        [comment bar]",
     "            [comment hello]",
     "                [comment world]",
     "        [comment foo]",
     "    [variable-2 bar]");

  // List nesting edge cases
  MT("listNested",
    "[variable-2 * foo]",
    "",
    "    [variable-3 * bar]",
    "",
    "       [variable-3 hello]"
  );
  MT("listNested",
    "[variable-2 * foo]",
    "",
    "    [variable-3 * bar]",
    "",
    "      [keyword * foo]"
  );

  // Code followed by text
  MT("listCodeText",
     "[variable-2 * foo]",
     "",
     "        [comment bar]",
     "",
     "hello");

  // Following tests directly from official Markdown documentation
  // http://daringfireball.net/projects/markdown/syntax#hr

  MT("hrSpace",
     "[hr * * *]");

  MT("hr",
     "[hr ***]");

  MT("hrLong",
     "[hr *****]");

  MT("hrSpaceDash",
     "[hr - - -]");

  MT("hrDashLong",
     "[hr ---------------------------------------]");

  //Images
  MT("Images",
     "[image&image-marker !][image&image-alt-text&link [[alt text]]][string&url (http://link.to/image.jpg)]")

  //Images with highlight alt text
  MT("imageEm",
     "[image&image-marker !][image&image-alt-text&link [[][image-alt-text&em&image&link *alt text*][image&image-alt-text&link ]]][string&url (http://link.to/image.jpg)]");

  MT("imageStrong",
     "[image&image-marker !][image&image-alt-text&link [[][image-alt-text&strong&image&link **alt text**][image&image-alt-text&link ]]][string&url (http://link.to/image.jpg)]");

  MT("imageEmStrong",
     "[image&image-marker !][image&image-alt-text&link [[][image-alt-text&image&strong&link **][image&image-alt-text&em&strong&link *alt text**][image&image-alt-text&em&link *][image&image-alt-text&link ]]][string&url (http://link.to/image.jpg)]");

  // Inline link with title
  MT("linkTitle",
     "[link [[foo]]][string&url (http://example.com/ \"bar\")] hello");

  // Inline link without title
  MT("linkNoTitle",
     "[link [[foo]]][string&url (http://example.com/)] bar");

  // Inline link with image
  MT("linkImage",
     "[link [[][link&image&image-marker !][link&image&image-alt-text&link [[alt text]]][string&url (http://link.to/image.jpg)][link ]]][string&url (http://example.com/)] bar");

  // Inline link with Em
  MT("linkEm",
     "[link [[][link&em *foo*][link ]]][string&url (http://example.com/)] bar");

  // Inline link with Strong
  MT("linkStrong",
     "[link [[][link&strong **foo**][link ]]][string&url (http://example.com/)] bar");

  // Inline link with EmStrong
  MT("linkEmStrong",
     "[link [[][link&strong **][link&em&strong *foo**][link&em *][link ]]][string&url (http://example.com/)] bar");

  // Image with title
  MT("imageTitle",
     "[image&image-marker !][image&image-alt-text&link [[alt text]]][string&url (http://example.com/ \"bar\")] hello");

  // Image without title
  MT("imageNoTitle",
     "[image&image-marker !][image&image-alt-text&link [[alt text]]][string&url (http://example.com/)] bar");

  // Image with asterisks
  MT("imageAsterisks",
     "[image&image-marker !][image&image-alt-text&link [[ ][image&image-alt-text&em&link *alt text*][image&image-alt-text&link ]]][string&url (http://link.to/image.jpg)] bar");

  // Not a link. Should be normal text due to square brackets being used
  // regularly in text, especially in quoted material, and no space is allowed
  // between square brackets and parentheses (per Dingus).
  MT("notALink",
     "[[foo]] (bar)");

  // Reference-style links
  MT("linkReference",
     "[link [[foo]]][string&url [[bar]]] hello");

  // Reference-style links with Em
  MT("linkReferenceEm",
     "[link [[][link&em *foo*][link ]]][string&url [[bar]]] hello");

  // Reference-style links with Strong
  MT("linkReferenceStrong",
     "[link [[][link&strong **foo**][link ]]][string&url [[bar]]] hello");

  // Reference-style links with EmStrong
  MT("linkReferenceEmStrong",
     "[link [[][link&strong **][link&em&strong *foo**][link&em *][link ]]][string&url [[bar]]] hello");

  // Reference-style links with optional space separator (per documentation)
  // "You can optionally use a space to separate the sets of brackets"
  MT("linkReferenceSpace",
     "[link [[foo]]] [string&url [[bar]]] hello");

  // Should only allow a single space ("...use *a* space...")
  MT("linkReferenceDoubleSpace",
     "[[foo]]  [[bar]] hello");

  // Reference-style links with implicit link name
  MT("linkImplicit",
     "[link [[foo]]][string&url [[]]] hello");

  // @todo It would be nice if, at some point, the document was actually
  // checked to see if the referenced link exists

  // Link label, for reference-style links (taken from documentation)

  MT("labelNoTitle",
     "[link [[foo]]:] [string&url http://example.com/]");

  MT("labelIndented",
     "   [link [[foo]]:] [string&url http://example.com/]");

  MT("labelSpaceTitle",
     "[link [[foo bar]]:] [string&url http://example.com/ \"hello\"]");

  MT("labelDoubleTitle",
     "[link [[foo bar]]:] [string&url http://example.com/ \"hello\"] \"world\"");

  MT("labelTitleDoubleQuotes",
     "[link [[foo]]:] [string&url http://example.com/  \"bar\"]");

  MT("labelTitleSingleQuotes",
     "[link [[foo]]:] [string&url http://example.com/  'bar']");

  MT("labelTitleParentheses",
     "[link [[foo]]:] [string&url http://example.com/  (bar)]");

  MT("labelTitleInvalid",
     "[link [[foo]]:] [string&url http://example.com/] bar");

  MT("labelLinkAngleBrackets",
     "[link [[foo]]:] [string&url <http://example.com/>  \"bar\"]");

  MT("labelTitleNextDoubleQuotes",
     "[link [[foo]]:] [string&url http://example.com/]",
     "[string \"bar\"] hello");

  MT("labelTitleNextSingleQuotes",
     "[link [[foo]]:] [string&url http://example.com/]",
     "[string 'bar'] hello");

  MT("labelTitleNextParentheses",
     "[link [[foo]]:] [string&url http://example.com/]",
     "[string (bar)] hello");

  MT("labelTitleNextMixed",
     "[link [[foo]]:] [string&url http://example.com/]",
     "(bar\" hello");

  MT("labelEscape",
     "[link [[foo \\]] ]]:] [string&url http://example.com/]");

  MT("labelEscapeColon",
     "[link [[foo \\]]: bar]]:] [string&url http://example.com/]");

  MT("labelEscapeEnd",
     "[[foo\\]]: http://example.com/");

  MT("linkWeb",
     "[link <http://example.com/>] foo");

  MT("linkWebDouble",
     "[link <http://example.com/>] foo [link <http://example.com/>]");

  MT("linkEmail",
     "[link <user@example.com>] foo");

  MT("linkEmailDouble",
     "[link <user@example.com>] foo [link <user@example.com>]");

  MT("emAsterisk",
     "[em *foo*] bar");

  MT("emUnderscore",
     "[em _foo_] bar");

  MT("emInWordAsterisk",
     "foo[em *bar*]hello");

  MT("emInWordUnderscore",
     "foo[em _bar_]hello");

  // Per documentation: "...surround an * or _ with spaces, it’ll be
  // treated as a literal asterisk or underscore."

  MT("emEscapedBySpaceIn",
     "foo [em _bar _ hello_] world");

  MT("emEscapedBySpaceOut",
     "foo _ bar[em _hello_]world");

  MT("emEscapedByNewline",
     "foo",
     "_ bar[em _hello_]world");

  // Unclosed emphasis characters
  // Instead of simply marking as EM / STRONG, it would be nice to have an
  // incomplete flag for EM and STRONG, that is styled slightly different.
  MT("emIncompleteAsterisk",
     "foo [em *bar]");

  MT("emIncompleteUnderscore",
     "foo [em _bar]");

  MT("strongAsterisk",
     "[strong **foo**] bar");

  MT("strongUnderscore",
     "[strong __foo__] bar");

  MT("emStrongAsterisk",
     "[em *foo][em&strong **bar*][strong hello**] world");

  MT("emStrongUnderscore",
     "[em _foo][em&strong __bar_][strong hello__] world");

  // "...same character must be used to open and close an emphasis span.""
  MT("emStrongMixed",
     "[em _foo][em&strong **bar*hello__ world]");

  MT("emStrongMixed",
     "[em *foo][em&strong __bar_hello** world]");

  MT("linkWithNestedParens",
     "[link [[foo]]][string&url (bar(baz))]")

  // These characters should be escaped:
  // \   backslash
  // `   backtick
  // *   asterisk
  // _   underscore
  // {}  curly braces
  // []  square brackets
  // ()  parentheses
  // #   hash mark
  // +   plus sign
  // -   minus sign (hyphen)
  // .   dot
  // !   exclamation mark

  MT("escapeBacktick",
     "foo \\`bar\\`");

  MT("doubleEscapeBacktick",
     "foo \\\\[comment `bar\\\\`]");

  MT("escapeAsterisk",
     "foo \\*bar\\*");

  MT("doubleEscapeAsterisk",
     "foo \\\\[em *bar\\\\*]");

  MT("escapeUnderscore",
     "foo \\_bar\\_");

  MT("doubleEscapeUnderscore",
     "foo \\\\[em _bar\\\\_]");

  MT("escapeHash",
     "\\# foo");

  MT("doubleEscapeHash",
     "\\\\# foo");

  MT("escapeNewline",
     "\\",
     "[em *foo*]");

  // Class override tests
  TokenTypeOverrideTest("overrideHeader1",
    "[override-header&override-header-1 # Foo]");

  TokenTypeOverrideTest("overrideHeader2",
    "[override-header&override-header-2 ## Foo]");

  TokenTypeOverrideTest("overrideHeader3",
    "[override-header&override-header-3 ### Foo]");

  TokenTypeOverrideTest("overrideHeader4",
    "[override-header&override-header-4 #### Foo]");

  TokenTypeOverrideTest("overrideHeader5",
    "[override-header&override-header-5 ##### Foo]");

  TokenTypeOverrideTest("overrideHeader6",
    "[override-header&override-header-6 ###### Foo]");

  TokenTypeOverrideTest("overrideCode",
    "[override-code `foo`]");

  TokenTypeOverrideTest("overrideCodeBlock",
    "[override-code ```]",
    "[override-code foo]",
    "[override-code ```]");

  TokenTypeOverrideTest("overrideQuote",
    "[override-quote&override-quote-1 > foo]",
    "[override-quote&override-quote-1 > bar]");

  TokenTypeOverrideTest("overrideQuoteNested",
    "[override-quote&override-quote-1 > foo]",
    "[override-quote&override-quote-1 >][override-quote&override-quote-2 > bar]",
    "[override-quote&override-quote-1 >][override-quote&override-quote-2 >][override-quote&override-quote-3 > baz]");

  TokenTypeOverrideTest("overrideLists",
    "[override-list1 - foo]",
    "",
    "    [override-list2 + bar]",
    "",
    "        [override-list3 * baz]",
    "",
    "            [override-list1 1. qux]",
    "",
    "                [override-list2 - quux]");

  TokenTypeOverrideTest("overrideHr",
    "[override-hr * * *]");

  TokenTypeOverrideTest("overrideImage",
    "[override-image&override-image-marker !][override-image&override-image-alt-text&link [[alt text]]][override-link-href&url (http://link.to/image.jpg)]");

  TokenTypeOverrideTest("overrideLinkText",
    "[override-link-text [[foo]]][override-link-href&url (http://example.com)]");

  TokenTypeOverrideTest("overrideLinkEmailAndInline",
    "[override-link-email <][override-link-inline foo@example.com>]");

  TokenTypeOverrideTest("overrideEm",
    "[override-em *foo*]");

  TokenTypeOverrideTest("overrideStrong",
    "[override-strong **foo**]");

  TokenTypeOverrideTest("overrideStrikethrough",
    "[override-strikethrough ~~foo~~]");

  FormatTokenTypeOverrideTest("overrideFormatting",
    "[override-formatting-escape \\*]");

  // Tests to make sure GFM-specific things aren't getting through

  MT("taskList",
     "[variable-2 * [ ]] bar]");

  MT("noFencedCodeBlocks",
     "~~~",
     "foo",
     "~~~");

  FencedTest("fencedCodeBlocks",
     "[comment ```]",
     "[comment foo]",
     "[comment ```]",
     "bar");

  FencedTest("fencedCodeBlocksMultipleChars",
     "[comment `````]",
     "[comment foo]",
     "[comment ```]",
     "[comment foo]",
     "[comment `````]",
     "bar");

  FencedTest("fencedCodeBlocksTildes",
     "[comment ~~~]",
     "[comment foo]",
     "[comment ~~~]",
     "bar");

  FencedTest("fencedCodeBlocksTildesMultipleChars",
     "[comment ~~~~~]",
     "[comment ~~~]",
     "[comment foo]",
     "[comment ~~~~~]",
     "bar");

  FencedTest("fencedCodeBlocksMultipleChars",
     "[comment `````]",
     "[comment foo]",
     "[comment ```]",
     "[comment foo]",
     "[comment `````]",
     "bar");

  FencedTest("fencedCodeBlocksMixed",
     "[comment ~~~]",
     "[comment ```]",
     "[comment foo]",
     "[comment ~~~]",
     "bar");

  // Tests that require XML mode

  MT("xmlMode",
     "[tag&bracket <][tag div][tag&bracket >]",
     "*foo*",
     "[tag&bracket <][tag http://github.com][tag&bracket />]",
     "[tag&bracket </][tag div][tag&bracket >]",
     "[link <http://github.com/>]");

  MT("xmlModeWithMarkdownInside",
     "[tag&bracket <][tag div] [attribute markdown]=[string 1][tag&bracket >]",
     "[em *foo*]",
     "[link <http://github.com/>]",
     "[tag </div>]",
     "[link <http://github.com/>]",
     "[tag&bracket <][tag div][tag&bracket >]",
     "[tag&bracket </][tag div][tag&bracket >]");

})();
codemirror/mode/php/php.js000064400000043460151215013500011551 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"), require("../clike/clike"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror", "../htmlmixed/htmlmixed", "../clike/clike"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  function keywords(str) {
    var obj = {}, words = str.split(" ");
    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
    return obj;
  }

  // Helper for phpString
  function matchSequence(list, end, escapes) {
    if (list.length == 0) return phpString(end);
    return function (stream, state) {
      var patterns = list[0];
      for (var i = 0; i < patterns.length; i++) if (stream.match(patterns[i][0])) {
        state.tokenize = matchSequence(list.slice(1), end);
        return patterns[i][1];
      }
      state.tokenize = phpString(end, escapes);
      return "string";
    };
  }
  function phpString(closing, escapes) {
    return function(stream, state) { return phpString_(stream, state, closing, escapes); };
  }
  function phpString_(stream, state, closing, escapes) {
    // "Complex" syntax
    if (escapes !== false && stream.match("${", false) || stream.match("{$", false)) {
      state.tokenize = null;
      return "string";
    }

    // Simple syntax
    if (escapes !== false && stream.match(/^\$[a-zA-Z_][a-zA-Z0-9_]*/)) {
      // After the variable name there may appear array or object operator.
      if (stream.match("[", false)) {
        // Match array operator
        state.tokenize = matchSequence([
          [["[", null]],
          [[/\d[\w\.]*/, "number"],
           [/\$[a-zA-Z_][a-zA-Z0-9_]*/, "variable-2"],
           [/[\w\$]+/, "variable"]],
          [["]", null]]
        ], closing, escapes);
      }
      if (stream.match(/\-\>\w/, false)) {
        // Match object operator
        state.tokenize = matchSequence([
          [["->", null]],
          [[/[\w]+/, "variable"]]
        ], closing, escapes);
      }
      return "variable-2";
    }

    var escaped = false;
    // Normal string
    while (!stream.eol() &&
           (escaped || escapes === false ||
            (!stream.match("{$", false) &&
             !stream.match(/^(\$[a-zA-Z_][a-zA-Z0-9_]*|\$\{)/, false)))) {
      if (!escaped && stream.match(closing)) {
        state.tokenize = null;
        state.tokStack.pop(); state.tokStack.pop();
        break;
      }
      escaped = stream.next() == "\\" && !escaped;
    }
    return "string";
  }

  var phpKeywords = "abstract and array as break case catch class clone const continue declare default " +
    "do else elseif enddeclare endfor endforeach endif endswitch endwhile extends final " +
    "for foreach function global goto if implements interface instanceof namespace " +
    "new or private protected public static switch throw trait try use var while xor " +
    "die echo empty exit eval include include_once isset list require require_once return " +
    "print unset __halt_compiler self static parent yield insteadof finally";
  var phpAtoms = "true false null TRUE FALSE NULL __CLASS__ __DIR__ __FILE__ __LINE__ __METHOD__ __FUNCTION__ __NAMESPACE__ __TRAIT__";
  var phpBuiltin = "func_num_args func_get_arg func_get_args strlen strcmp strncmp strcasecmp strncasecmp each error_reporting define defined trigger_error user_error set_error_handler restore_error_handler get_declared_classes get_loaded_extensions extension_loaded get_extension_funcs debug_backtrace constant bin2hex hex2bin sleep usleep time mktime gmmktime strftime gmstrftime strtotime date gmdate getdate localtime checkdate flush wordwrap htmlspecialchars htmlentities html_entity_decode md5 md5_file crc32 getimagesize image_type_to_mime_type phpinfo phpversion phpcredits strnatcmp strnatcasecmp substr_count strspn strcspn strtok strtoupper strtolower strpos strrpos strrev hebrev hebrevc nl2br basename dirname pathinfo stripslashes stripcslashes strstr stristr strrchr str_shuffle str_word_count strcoll substr substr_replace quotemeta ucfirst ucwords strtr addslashes addcslashes rtrim str_replace str_repeat count_chars chunk_split trim ltrim strip_tags similar_text explode implode setlocale localeconv parse_str str_pad chop strchr sprintf printf vprintf vsprintf sscanf fscanf parse_url urlencode urldecode rawurlencode rawurldecode readlink linkinfo link unlink exec system escapeshellcmd escapeshellarg passthru shell_exec proc_open proc_close rand srand getrandmax mt_rand mt_srand mt_getrandmax base64_decode base64_encode abs ceil floor round is_finite is_nan is_infinite bindec hexdec octdec decbin decoct dechex base_convert number_format fmod ip2long long2ip getenv putenv getopt microtime gettimeofday getrusage uniqid quoted_printable_decode set_time_limit get_cfg_var magic_quotes_runtime set_magic_quotes_runtime get_magic_quotes_gpc get_magic_quotes_runtime import_request_variables error_log serialize unserialize memory_get_usage var_dump var_export debug_zval_dump print_r highlight_file show_source highlight_string ini_get ini_get_all ini_set ini_alter ini_restore get_include_path set_include_path restore_include_path setcookie header headers_sent connection_aborted connection_status ignore_user_abort parse_ini_file is_uploaded_file move_uploaded_file intval floatval doubleval strval gettype settype is_null is_resource is_bool is_long is_float is_int is_integer is_double is_real is_numeric is_string is_array is_object is_scalar ereg ereg_replace eregi eregi_replace split spliti join sql_regcase dl pclose popen readfile rewind rmdir umask fclose feof fgetc fgets fgetss fread fopen fpassthru ftruncate fstat fseek ftell fflush fwrite fputs mkdir rename copy tempnam tmpfile file file_get_contents file_put_contents stream_select stream_context_create stream_context_set_params stream_context_set_option stream_context_get_options stream_filter_prepend stream_filter_append fgetcsv flock get_meta_tags stream_set_write_buffer set_file_buffer set_socket_blocking stream_set_blocking socket_set_blocking stream_get_meta_data stream_register_wrapper stream_wrapper_register stream_set_timeout socket_set_timeout socket_get_status realpath fnmatch fsockopen pfsockopen pack unpack get_browser crypt opendir closedir chdir getcwd rewinddir readdir dir glob fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype file_exists is_writable is_writeable is_readable is_executable is_file is_dir is_link stat lstat chown touch clearstatcache mail ob_start ob_flush ob_clean ob_end_flush ob_end_clean ob_get_flush ob_get_clean ob_get_length ob_get_level ob_get_status ob_get_contents ob_implicit_flush ob_list_handlers ksort krsort natsort natcasesort asort arsort sort rsort usort uasort uksort shuffle array_walk count end prev next reset current key min max in_array array_search extract compact array_fill range array_multisort array_push array_pop array_shift array_unshift array_splice array_slice array_merge array_merge_recursive array_keys array_values array_count_values array_reverse array_reduce array_pad array_flip array_change_key_case array_rand array_unique array_intersect array_intersect_assoc array_diff array_diff_assoc array_sum array_filter array_map array_chunk array_key_exists array_intersect_key array_combine array_column pos sizeof key_exists assert assert_options version_compare ftok str_rot13 aggregate session_name session_module_name session_save_path session_id session_regenerate_id session_decode session_register session_unregister session_is_registered session_encode session_start session_destroy session_unset session_set_save_handler session_cache_limiter session_cache_expire session_set_cookie_params session_get_cookie_params session_write_close preg_match preg_match_all preg_replace preg_replace_callback preg_split preg_quote preg_grep overload ctype_alnum ctype_alpha ctype_cntrl ctype_digit ctype_lower ctype_graph ctype_print ctype_punct ctype_space ctype_upper ctype_xdigit virtual apache_request_headers apache_note apache_lookup_uri apache_child_terminate apache_setenv apache_response_headers apache_get_version getallheaders mysql_connect mysql_pconnect mysql_close mysql_select_db mysql_create_db mysql_drop_db mysql_query mysql_unbuffered_query mysql_db_query mysql_list_dbs mysql_list_tables mysql_list_fields mysql_list_processes mysql_error mysql_errno mysql_affected_rows mysql_insert_id mysql_result mysql_num_rows mysql_num_fields mysql_fetch_row mysql_fetch_array mysql_fetch_assoc mysql_fetch_object mysql_data_seek mysql_fetch_lengths mysql_fetch_field mysql_field_seek mysql_free_result mysql_field_name mysql_field_table mysql_field_len mysql_field_type mysql_field_flags mysql_escape_string mysql_real_escape_string mysql_stat mysql_thread_id mysql_client_encoding mysql_get_client_info mysql_get_host_info mysql_get_proto_info mysql_get_server_info mysql_info mysql mysql_fieldname mysql_fieldtable mysql_fieldlen mysql_fieldtype mysql_fieldflags mysql_selectdb mysql_createdb mysql_dropdb mysql_freeresult mysql_numfields mysql_numrows mysql_listdbs mysql_listtables mysql_listfields mysql_db_name mysql_dbname mysql_tablename mysql_table_name pg_connect pg_pconnect pg_close pg_connection_status pg_connection_busy pg_connection_reset pg_host pg_dbname pg_port pg_tty pg_options pg_ping pg_query pg_send_query pg_cancel_query pg_fetch_result pg_fetch_row pg_fetch_assoc pg_fetch_array pg_fetch_object pg_fetch_all pg_affected_rows pg_get_result pg_result_seek pg_result_status pg_free_result pg_last_oid pg_num_rows pg_num_fields pg_field_name pg_field_num pg_field_size pg_field_type pg_field_prtlen pg_field_is_null pg_get_notify pg_get_pid pg_result_error pg_last_error pg_last_notice pg_put_line pg_end_copy pg_copy_to pg_copy_from pg_trace pg_untrace pg_lo_create pg_lo_unlink pg_lo_open pg_lo_close pg_lo_read pg_lo_write pg_lo_read_all pg_lo_import pg_lo_export pg_lo_seek pg_lo_tell pg_escape_string pg_escape_bytea pg_unescape_bytea pg_client_encoding pg_set_client_encoding pg_meta_data pg_convert pg_insert pg_update pg_delete pg_select pg_exec pg_getlastoid pg_cmdtuples pg_errormessage pg_numrows pg_numfields pg_fieldname pg_fieldsize pg_fieldtype pg_fieldnum pg_fieldprtlen pg_fieldisnull pg_freeresult pg_result pg_loreadall pg_locreate pg_lounlink pg_loopen pg_loclose pg_loread pg_lowrite pg_loimport pg_loexport http_response_code get_declared_traits getimagesizefromstring socket_import_stream stream_set_chunk_size trait_exists header_register_callback class_uses session_status session_register_shutdown echo print global static exit array empty eval isset unset die include require include_once require_once json_decode json_encode json_last_error json_last_error_msg curl_close curl_copy_handle curl_errno curl_error curl_escape curl_exec curl_file_create curl_getinfo curl_init curl_multi_add_handle curl_multi_close curl_multi_exec curl_multi_getcontent curl_multi_info_read curl_multi_init curl_multi_remove_handle curl_multi_select curl_multi_setopt curl_multi_strerror curl_pause curl_reset curl_setopt_array curl_setopt curl_share_close curl_share_init curl_share_setopt curl_strerror curl_unescape curl_version mysqli_affected_rows mysqli_autocommit mysqli_change_user mysqli_character_set_name mysqli_close mysqli_commit mysqli_connect_errno mysqli_connect_error mysqli_connect mysqli_data_seek mysqli_debug mysqli_dump_debug_info mysqli_errno mysqli_error_list mysqli_error mysqli_fetch_all mysqli_fetch_array mysqli_fetch_assoc mysqli_fetch_field_direct mysqli_fetch_field mysqli_fetch_fields mysqli_fetch_lengths mysqli_fetch_object mysqli_fetch_row mysqli_field_count mysqli_field_seek mysqli_field_tell mysqli_free_result mysqli_get_charset mysqli_get_client_info mysqli_get_client_stats mysqli_get_client_version mysqli_get_connection_stats mysqli_get_host_info mysqli_get_proto_info mysqli_get_server_info mysqli_get_server_version mysqli_info mysqli_init mysqli_insert_id mysqli_kill mysqli_more_results mysqli_multi_query mysqli_next_result mysqli_num_fields mysqli_num_rows mysqli_options mysqli_ping mysqli_prepare mysqli_query mysqli_real_connect mysqli_real_escape_string mysqli_real_query mysqli_reap_async_query mysqli_refresh mysqli_rollback mysqli_select_db mysqli_set_charset mysqli_set_local_infile_default mysqli_set_local_infile_handler mysqli_sqlstate mysqli_ssl_set mysqli_stat mysqli_stmt_init mysqli_store_result mysqli_thread_id mysqli_thread_safe mysqli_use_result mysqli_warning_count";
  CodeMirror.registerHelper("hintWords", "php", [phpKeywords, phpAtoms, phpBuiltin].join(" ").split(" "));
  CodeMirror.registerHelper("wordChars", "php", /[\w$]/);

  var phpConfig = {
    name: "clike",
    helperType: "php",
    keywords: keywords(phpKeywords),
    blockKeywords: keywords("catch do else elseif for foreach if switch try while finally"),
    defKeywords: keywords("class function interface namespace trait"),
    atoms: keywords(phpAtoms),
    builtin: keywords(phpBuiltin),
    multiLineStrings: true,
    hooks: {
      "$": function(stream) {
        stream.eatWhile(/[\w\$_]/);
        return "variable-2";
      },
      "<": function(stream, state) {
        var before;
        if (before = stream.match(/<<\s*/)) {
          var quoted = stream.eat(/['"]/);
          stream.eatWhile(/[\w\.]/);
          var delim = stream.current().slice(before[0].length + (quoted ? 2 : 1));
          if (quoted) stream.eat(quoted);
          if (delim) {
            (state.tokStack || (state.tokStack = [])).push(delim, 0);
            state.tokenize = phpString(delim, quoted != "'");
            return "string";
          }
        }
        return false;
      },
      "#": function(stream) {
        while (!stream.eol() && !stream.match("?>", false)) stream.next();
        return "comment";
      },
      "/": function(stream) {
        if (stream.eat("/")) {
          while (!stream.eol() && !stream.match("?>", false)) stream.next();
          return "comment";
        }
        return false;
      },
      '"': function(_stream, state) {
        (state.tokStack || (state.tokStack = [])).push('"', 0);
        state.tokenize = phpString('"');
        return "string";
      },
      "{": function(_stream, state) {
        if (state.tokStack && state.tokStack.length)
          state.tokStack[state.tokStack.length - 1]++;
        return false;
      },
      "}": function(_stream, state) {
        if (state.tokStack && state.tokStack.length > 0 &&
            !--state.tokStack[state.tokStack.length - 1]) {
          state.tokenize = phpString(state.tokStack[state.tokStack.length - 2]);
        }
        return false;
      }
    }
  };

  CodeMirror.defineMode("php", function(config, parserConfig) {
    var htmlMode = CodeMirror.getMode(config, "text/html");
    var phpMode = CodeMirror.getMode(config, phpConfig);

    function dispatch(stream, state) {
      var isPHP = state.curMode == phpMode;
      if (stream.sol() && state.pending && state.pending != '"' && state.pending != "'") state.pending = null;
      if (!isPHP) {
        if (stream.match(/^<\?\w*/)) {
          state.curMode = phpMode;
          if (!state.php) state.php = CodeMirror.startState(phpMode, htmlMode.indent(state.html, ""))
          state.curState = state.php;
          return "meta";
        }
        if (state.pending == '"' || state.pending == "'") {
          while (!stream.eol() && stream.next() != state.pending) {}
          var style = "string";
        } else if (state.pending && stream.pos < state.pending.end) {
          stream.pos = state.pending.end;
          var style = state.pending.style;
        } else {
          var style = htmlMode.token(stream, state.curState);
        }
        if (state.pending) state.pending = null;
        var cur = stream.current(), openPHP = cur.search(/<\?/), m;
        if (openPHP != -1) {
          if (style == "string" && (m = cur.match(/[\'\"]$/)) && !/\?>/.test(cur)) state.pending = m[0];
          else state.pending = {end: stream.pos, style: style};
          stream.backUp(cur.length - openPHP);
        }
        return style;
      } else if (isPHP && state.php.tokenize == null && stream.match("?>")) {
        state.curMode = htmlMode;
        state.curState = state.html;
        if (!state.php.context.prev) state.php = null;
        return "meta";
      } else {
        return phpMode.token(stream, state.curState);
      }
    }

    return {
      startState: function() {
        var html = CodeMirror.startState(htmlMode)
        var php = parserConfig.startOpen ? CodeMirror.startState(phpMode) : null
        return {html: html,
                php: php,
                curMode: parserConfig.startOpen ? phpMode : htmlMode,
                curState: parserConfig.startOpen ? php : html,
                pending: null};
      },

      copyState: function(state) {
        var html = state.html, htmlNew = CodeMirror.copyState(htmlMode, html),
            php = state.php, phpNew = php && CodeMirror.copyState(phpMode, php), cur;
        if (state.curMode == htmlMode) cur = htmlNew;
        else cur = phpNew;
        return {html: htmlNew, php: phpNew, curMode: state.curMode, curState: cur,
                pending: state.pending};
      },

      token: dispatch,

      indent: function(state, textAfter) {
        if ((state.curMode != phpMode && /^\s*<\//.test(textAfter)) ||
            (state.curMode == phpMode && /^\?>/.test(textAfter)))
          return htmlMode.indent(state.html, textAfter);
        return state.curMode.indent(state.curState, textAfter);
      },

      blockCommentStart: "/*",
      blockCommentEnd: "*/",
      lineComment: "//",

      innerMode: function(state) { return {state: state.curState, mode: state.curMode}; }
    };
  }, "htmlmixed", "clike");

  CodeMirror.defineMIME("application/x-httpd-php", "php");
  CodeMirror.defineMIME("application/x-httpd-php-open", {name: "php", startOpen: true});
  CodeMirror.defineMIME("text/x-php", phpConfig);
});
codemirror/mode/php/index.html000064400000003720151215013500012414 0ustar00<!doctype html>

<title>CodeMirror: PHP mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="../htmlmixed/htmlmixed.js"></script>
<script src="../xml/xml.js"></script>
<script src="../javascript/javascript.js"></script>
<script src="../css/css.js"></script>
<script src="../clike/clike.js"></script>
<script src="php.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">PHP</a>
  </ul>
</div>

<article>
<h2>PHP mode</h2>
<form><textarea id="code" name="code">
<?php
$a = array('a' => 1, 'b' => 2, 3 => 'c');

echo "$a[a] ${a[3] /* } comment */} {$a[b]} \$a[a]";

function hello($who) {
	return "Hello $who!";
}
?>
<p>The program says <?= hello("World") ?>.</p>
<script>
	alert("And here is some JS code"); // also colored
</script>
</textarea></form>

    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        lineNumbers: true,
        matchBrackets: true,
        mode: "application/x-httpd-php",
        indentUnit: 4,
        indentWithTabs: true
      });
    </script>

    <p>Simple HTML/PHP mode based on
    the <a href="../clike/">C-like</a> mode. Depends on XML,
    JavaScript, CSS, HTMLMixed, and C-like modes.</p>

    <p><strong>MIME types defined:</strong> <code>application/x-httpd-php</code> (HTML with PHP code), <code>text/x-php</code> (plain, non-wrapped PHP code).</p>
  </article>
codemirror/mode/php/test.js000064400000014767151215013500011751 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function() {
  var mode = CodeMirror.getMode({indentUnit: 2}, "php");
  function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); }

  MT('simple_test',
     '[meta <?php] ' +
     '[keyword echo] [string "aaa"]; ' +
     '[meta ?>]');

  MT('variable_interpolation_non_alphanumeric',
     '[meta <?php]',
     '[keyword echo] [string "aaa$~$!$@$#$$$%$^$&$*jQuery($)jQuery.$<$>$/$\\$}$\\\"$:$;$?$|$[[$]]$+$=aaa"]',
     '[meta ?>]');

  MT('variable_interpolation_digits',
     '[meta <?php]',
     '[keyword echo] [string "aaa$1$2$3$4$5$6$7$8$9$0aaa"]',
     '[meta ?>]');

  MT('variable_interpolation_simple_syntax_1',
     '[meta <?php]',
     '[keyword echo] [string "aaa][variable-2 $aaa][string .aaa"];',
     '[meta ?>]');

  MT('variable_interpolation_simple_syntax_2',
     '[meta <?php]',
     '[keyword echo] [string "][variable-2 $aaaa][[','[number 2]',         ']][string aa"];',
     '[keyword echo] [string "][variable-2 $aaaa][[','[number 2345]',      ']][string aa"];',
     '[keyword echo] [string "][variable-2 $aaaa][[','[number 2.3]',       ']][string aa"];',
     '[keyword echo] [string "][variable-2 $aaaa][[','[variable aaaaa]',   ']][string aa"];',
     '[keyword echo] [string "][variable-2 $aaaa][[','[variable-2 $aaaaa]',']][string aa"];',

     '[keyword echo] [string "1aaa][variable-2 $aaaa][[','[number 2]',         ']][string aa"];',
     '[keyword echo] [string "aaa][variable-2 $aaaa][[','[number 2345]',      ']][string aa"];',
     '[keyword echo] [string "aaa][variable-2 $aaaa][[','[number 2.3]',       ']][string aa"];',
     '[keyword echo] [string "aaa][variable-2 $aaaa][[','[variable aaaaa]',   ']][string aa"];',
     '[keyword echo] [string "aaa][variable-2 $aaaa][[','[variable-2 $aaaaa]',']][string aa"];',
     '[meta ?>]');

  MT('variable_interpolation_simple_syntax_3',
     '[meta <?php]',
     '[keyword echo] [string "aaa][variable-2 $aaaa]->[variable aaaaa][string .aaaaaa"];',
     '[keyword echo] [string "aaa][variable-2 $aaaa][string ->][variable-2 $aaaaa][string .aaaaaa"];',
     '[keyword echo] [string "aaa][variable-2 $aaaa]->[variable aaaaa][string [[2]].aaaaaa"];',
     '[keyword echo] [string "aaa][variable-2 $aaaa]->[variable aaaaa][string ->aaaa2.aaaaaa"];',
     '[meta ?>]');

  MT('variable_interpolation_escaping',
     '[meta <?php] [comment /* Escaping */]',
     '[keyword echo] [string "aaa\\$aaaa->aaa.aaa"];',
     '[keyword echo] [string "aaa\\$aaaa[[2]]aaa.aaa"];',
     '[keyword echo] [string "aaa\\$aaaa[[asd]]aaa.aaa"];',
     '[keyword echo] [string "aaa{\\$aaaa->aaa.aaa"];',
     '[keyword echo] [string "aaa{\\$aaaa[[2]]aaa.aaa"];',
     '[keyword echo] [string "aaa{\\aaaaa[[asd]]aaa.aaa"];',
     '[keyword echo] [string "aaa\\${aaaa->aaa.aaa"];',
     '[keyword echo] [string "aaa\\${aaaa[[2]]aaa.aaa"];',
     '[keyword echo] [string "aaa\\${aaaa[[asd]]aaa.aaa"];',
     '[meta ?>]');

  MT('variable_interpolation_complex_syntax_1',
     '[meta <?php]',
     '[keyword echo] [string "aaa][variable-2 $]{[variable aaaa]}[string ->aaa.aaa"];',
     '[keyword echo] [string "aaa][variable-2 $]{[variable-2 $aaaa]}[string ->aaa.aaa"];',
     '[keyword echo] [string "aaa][variable-2 $]{[variable-2 $aaaa][[','  [number 42]',']]}[string ->aaa.aaa"];',
     '[keyword echo] [string "aaa][variable-2 $]{[variable aaaa][meta ?>]aaaaaa');

  MT('variable_interpolation_complex_syntax_2',
     '[meta <?php] [comment /* Monsters */]',
     '[keyword echo] [string "][variable-2 $]{[variable aaa][comment /*}?>} $aaa<?php } */]}[string ->aaa.aaa"];',
     '[keyword echo] [string "][variable-2 $]{[variable aaa][comment /*}?>*/][[','  [string "aaa][variable-2 $aaa][string {}][variable-2 $]{[variable aaa]}[string "]',']]}[string ->aaa.aaa"];',
     '[keyword echo] [string "][variable-2 $]{[variable aaa][comment /*} } $aaa } */]}[string ->aaa.aaa"];');


  function build_recursive_monsters(nt, t, n){
    var monsters = [t];
    for (var i = 1; i <= n; ++i)
      monsters[i] = nt.join(monsters[i - 1]);
    return monsters;
  }

  var m1 = build_recursive_monsters(
    ['[string "][variable-2 $]{[variable aaa] [operator +] ', '}[string "]'],
    '[comment /* }?>} */] [string "aaa][variable-2 $aaa][string .aaa"]',
    10
  );

  MT('variable_interpolation_complex_syntax_3_1',
     '[meta <?php] [comment /* Recursive monsters */]',
     '[keyword echo] ' + m1[4] + ';',
     '[keyword echo] ' + m1[7] + ';',
     '[keyword echo] ' + m1[8] + ';',
     '[keyword echo] ' + m1[5] + ';',
     '[keyword echo] ' + m1[1] + ';',
     '[keyword echo] ' + m1[6] + ';',
     '[keyword echo] ' + m1[9] + ';',
     '[keyword echo] ' + m1[0] + ';',
     '[keyword echo] ' + m1[10] + ';',
     '[keyword echo] ' + m1[2] + ';',
     '[keyword echo] ' + m1[3] + ';',
     '[keyword echo] [string "end"];',
     '[meta ?>]');

  var m2 = build_recursive_monsters(
    ['[string "a][variable-2 $]{[variable aaa] [operator +] ', ' [operator +] ', '}[string .a"]'],
    '[comment /* }?>{{ */] [string "a?>}{{aa][variable-2 $aaa][string .a}a?>a"]',
    5
  );

  MT('variable_interpolation_complex_syntax_3_2',
     '[meta <?php] [comment /* Recursive monsters 2 */]',
     '[keyword echo] ' + m2[0] + ';',
     '[keyword echo] ' + m2[1] + ';',
     '[keyword echo] ' + m2[5] + ';',
     '[keyword echo] ' + m2[4] + ';',
     '[keyword echo] ' + m2[2] + ';',
     '[keyword echo] ' + m2[3] + ';',
     '[keyword echo] [string "end"];',
     '[meta ?>]');

  function build_recursive_monsters_2(mf1, mf2, nt, t, n){
    var monsters = [t];
    for (var i = 1; i <= n; ++i)
      monsters[i] = nt[0] + mf1[i - 1] + nt[1] + mf2[i - 1] + nt[2] + monsters[i - 1] + nt[3];
    return monsters;
  }

  var m3 = build_recursive_monsters_2(
    m1,
    m2,
    ['[string "a][variable-2 $]{[variable aaa] [operator +] ', ' [operator +] ', ' [operator +] ', '}[string .a"]'],
    '[comment /* }?>{{ */] [string "a?>}{{aa][variable-2 $aaa][string .a}a?>a"]',
    4
  );

  MT('variable_interpolation_complex_syntax_3_3',
     '[meta <?php] [comment /* Recursive monsters 2 */]',
     '[keyword echo] ' + m3[4] + ';',
     '[keyword echo] ' + m3[0] + ';',
     '[keyword echo] ' + m3[3] + ';',
     '[keyword echo] ' + m3[1] + ';',
     '[keyword echo] ' + m3[2] + ';',
     '[keyword echo] [string "end"];',
     '[meta ?>]');

  MT("variable_interpolation_heredoc",
     "[meta <?php]",
     "[string <<<here]",
     "[string doc ][variable-2 $]{[variable yay]}[string more]",
     "[string here]; [comment // normal]");
})();
codemirror/mode/solr/solr.js000064400000005166151215013510012133 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("solr", function() {
  "use strict";

  var isStringChar = /[^\s\|\!\+\-\*\?\~\^\&\:\(\)\[\]\{\}\^\"\\]/;
  var isOperatorChar = /[\|\!\+\-\*\?\~\^\&]/;
  var isOperatorString = /^(OR|AND|NOT|TO)$/i;

  function isNumber(word) {
    return parseFloat(word, 10).toString() === word;
  }

  function tokenString(quote) {
    return function(stream, state) {
      var escaped = false, next;
      while ((next = stream.next()) != null) {
        if (next == quote && !escaped) break;
        escaped = !escaped && next == "\\";
      }

      if (!escaped) state.tokenize = tokenBase;
      return "string";
    };
  }

  function tokenOperator(operator) {
    return function(stream, state) {
      var style = "operator";
      if (operator == "+")
        style += " positive";
      else if (operator == "-")
        style += " negative";
      else if (operator == "|")
        stream.eat(/\|/);
      else if (operator == "&")
        stream.eat(/\&/);
      else if (operator == "^")
        style += " boost";

      state.tokenize = tokenBase;
      return style;
    };
  }

  function tokenWord(ch) {
    return function(stream, state) {
      var word = ch;
      while ((ch = stream.peek()) && ch.match(isStringChar) != null) {
        word += stream.next();
      }

      state.tokenize = tokenBase;
      if (isOperatorString.test(word))
        return "operator";
      else if (isNumber(word))
        return "number";
      else if (stream.peek() == ":")
        return "field";
      else
        return "string";
    };
  }

  function tokenBase(stream, state) {
    var ch = stream.next();
    if (ch == '"')
      state.tokenize = tokenString(ch);
    else if (isOperatorChar.test(ch))
      state.tokenize = tokenOperator(ch);
    else if (isStringChar.test(ch))
      state.tokenize = tokenWord(ch);

    return (state.tokenize != tokenBase) ? state.tokenize(stream, state) : null;
  }

  return {
    startState: function() {
      return {
        tokenize: tokenBase
      };
    },

    token: function(stream, state) {
      if (stream.eatSpace()) return null;
      return state.tokenize(stream, state);
    }
  };
});

CodeMirror.defineMIME("text/x-solr", "solr");

});
codemirror/mode/solr/index.html000064400000002525151215013510012607 0ustar00<!doctype html>

<title>CodeMirror: Solr mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="solr.js"></script>
<style type="text/css">
  .CodeMirror {
    border-top: 1px solid black;
    border-bottom: 1px solid black;
  }

  .CodeMirror .cm-operator {
    color: orange;
  }
</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Solr</a>
  </ul>
</div>

<article>
  <h2>Solr mode</h2>

  <div>
    <textarea id="code" name="code">author:Camus

title:"The Rebel" and author:Camus

philosophy:Existentialism -author:Kierkegaard

hardToSpell:Dostoevsky~

published:[194* TO 1960] and author:(Sartre or "Simone de Beauvoir")</textarea>
  </div>

  <script>
    var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
      mode: 'solr',
      lineNumbers: true
    });
  </script>

  <p><strong>MIME types defined:</strong> <code>text/x-solr</code>.</p>
</article>
codemirror/mode/crystal/crystal.js000064400000026112151215013510013331 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  CodeMirror.defineMode("crystal", function(config) {
    function wordRegExp(words, end) {
      return new RegExp((end ? "" : "^") + "(?:" + words.join("|") + ")" + (end ? "$" : "\\b"));
    }

    function chain(tokenize, stream, state) {
      state.tokenize.push(tokenize);
      return tokenize(stream, state);
    }

    var operators = /^(?:[-+/%|&^]|\*\*?|[<>]{2})/;
    var conditionalOperators = /^(?:[=!]~|===|<=>|[<>=!]=?|[|&]{2}|~)/;
    var indexingOperators = /^(?:\[\][?=]?)/;
    var anotherOperators = /^(?:\.(?:\.{2})?|->|[?:])/;
    var idents = /^[a-z_\u009F-\uFFFF][a-zA-Z0-9_\u009F-\uFFFF]*/;
    var types = /^[A-Z_\u009F-\uFFFF][a-zA-Z0-9_\u009F-\uFFFF]*/;
    var keywords = wordRegExp([
      "abstract", "alias", "as", "asm", "begin", "break", "case", "class", "def", "do",
      "else", "elsif", "end", "ensure", "enum", "extend", "for", "fun", "if", "ifdef",
      "include", "instance_sizeof", "lib", "macro", "module", "next", "of", "out", "pointerof",
      "private", "protected", "rescue", "return", "require", "sizeof", "struct",
      "super", "then", "type", "typeof", "union", "unless", "until", "when", "while", "with",
      "yield", "__DIR__", "__FILE__", "__LINE__"
    ]);
    var atomWords = wordRegExp(["true", "false", "nil", "self"]);
    var indentKeywordsArray = [
      "def", "fun", "macro",
      "class", "module", "struct", "lib", "enum", "union",
      "if", "unless", "case", "while", "until", "begin", "then",
      "do",
      "for", "ifdef"
    ];
    var indentKeywords = wordRegExp(indentKeywordsArray);
    var dedentKeywordsArray = [
      "end",
      "else", "elsif",
      "rescue", "ensure"
    ];
    var dedentKeywords = wordRegExp(dedentKeywordsArray);
    var dedentPunctualsArray = ["\\)", "\\}", "\\]"];
    var dedentPunctuals = new RegExp("^(?:" + dedentPunctualsArray.join("|") + ")$");
    var nextTokenizer = {
      "def": tokenFollowIdent, "fun": tokenFollowIdent, "macro": tokenMacroDef,
      "class": tokenFollowType, "module": tokenFollowType, "struct": tokenFollowType,
      "lib": tokenFollowType, "enum": tokenFollowType, "union": tokenFollowType
    };
    var matching = {"[": "]", "{": "}", "(": ")", "<": ">"};

    function tokenBase(stream, state) {
      if (stream.eatSpace()) {
        return null;
      }

      // Macros
      if (state.lastToken != "\\" && stream.match("{%", false)) {
        return chain(tokenMacro("%", "%"), stream, state);
      }

      if (state.lastToken != "\\" && stream.match("{{", false)) {
        return chain(tokenMacro("{", "}"), stream, state);
      }

      // Comments
      if (stream.peek() == "#") {
        stream.skipToEnd();
        return "comment";
      }

      // Variables and keywords
      var matched;
      if (stream.match(idents)) {
        stream.eat(/[?!]/);

        matched = stream.current();
        if (stream.eat(":")) {
          return "atom";
        } else if (state.lastToken == ".") {
          return "property";
        } else if (keywords.test(matched)) {
          if (state.lastToken != "abstract" && indentKeywords.test(matched)) {
            if (!(matched == "fun" && state.blocks.indexOf("lib") >= 0)) {
              state.blocks.push(matched);
              state.currentIndent += 1;
            }
          } else if (dedentKeywords.test(matched)) {
            state.blocks.pop();
            state.currentIndent -= 1;
          }

          if (nextTokenizer.hasOwnProperty(matched)) {
            state.tokenize.push(nextTokenizer[matched]);
          }

          return "keyword";
        } else if (atomWords.test(matched)) {
          return "atom";
        }

        return "variable";
      }

      // Class variables and instance variables
      // or attributes
      if (stream.eat("@")) {
        if (stream.peek() == "[") {
          return chain(tokenNest("[", "]", "meta"), stream, state);
        }

        stream.eat("@");
        stream.match(idents) || stream.match(types);
        return "variable-2";
      }

      // Global variables
      if (stream.eat("$")) {
        stream.eat(/[0-9]+|\?/) || stream.match(idents) || stream.match(types);
        return "variable-3";
      }

      // Constants and types
      if (stream.match(types)) {
        return "tag";
      }

      // Symbols or ':' operator
      if (stream.eat(":")) {
        if (stream.eat("\"")) {
          return chain(tokenQuote("\"", "atom", false), stream, state);
        } else if (stream.match(idents) || stream.match(types) ||
                   stream.match(operators) || stream.match(conditionalOperators) || stream.match(indexingOperators)) {
          return "atom";
        }
        stream.eat(":");
        return "operator";
      }

      // Strings
      if (stream.eat("\"")) {
        return chain(tokenQuote("\"", "string", true), stream, state);
      }

      // Strings or regexps or macro variables or '%' operator
      if (stream.peek() == "%") {
        var style = "string";
        var embed = true;
        var delim;

        if (stream.match("%r")) {
          // Regexps
          style = "string-2";
          delim = stream.next();
        } else if (stream.match("%w")) {
          embed = false;
          delim = stream.next();
        } else {
          if(delim = stream.match(/^%([^\w\s=])/)) {
            delim = delim[1];
          } else if (stream.match(/^%[a-zA-Z0-9_\u009F-\uFFFF]*/)) {
            // Macro variables
            return "meta";
          } else {
            // '%' operator
            return "operator";
          }
        }

        if (matching.hasOwnProperty(delim)) {
          delim = matching[delim];
        }
        return chain(tokenQuote(delim, style, embed), stream, state);
      }

      // Characters
      if (stream.eat("'")) {
        stream.match(/^(?:[^']|\\(?:[befnrtv0'"]|[0-7]{3}|u(?:[0-9a-fA-F]{4}|\{[0-9a-fA-F]{1,6}\})))/);
        stream.eat("'");
        return "atom";
      }

      // Numbers
      if (stream.eat("0")) {
        if (stream.eat("x")) {
          stream.match(/^[0-9a-fA-F]+/);
        } else if (stream.eat("o")) {
          stream.match(/^[0-7]+/);
        } else if (stream.eat("b")) {
          stream.match(/^[01]+/);
        }
        return "number";
      }

      if (stream.eat(/\d/)) {
        stream.match(/^\d*(?:\.\d+)?(?:[eE][+-]?\d+)?/);
        return "number";
      }

      // Operators
      if (stream.match(operators)) {
        stream.eat("="); // Operators can follow assign symbol.
        return "operator";
      }

      if (stream.match(conditionalOperators) || stream.match(anotherOperators)) {
        return "operator";
      }

      // Parens and braces
      if (matched = stream.match(/[({[]/, false)) {
        matched = matched[0];
        return chain(tokenNest(matched, matching[matched], null), stream, state);
      }

      // Escapes
      if (stream.eat("\\")) {
        stream.next();
        return "meta";
      }

      stream.next();
      return null;
    }

    function tokenNest(begin, end, style, started) {
      return function (stream, state) {
        if (!started && stream.match(begin)) {
          state.tokenize[state.tokenize.length - 1] = tokenNest(begin, end, style, true);
          state.currentIndent += 1;
          return style;
        }

        var nextStyle = tokenBase(stream, state);
        if (stream.current() === end) {
          state.tokenize.pop();
          state.currentIndent -= 1;
          nextStyle = style;
        }

        return nextStyle;
      };
    }

    function tokenMacro(begin, end, started) {
      return function (stream, state) {
        if (!started && stream.match("{" + begin)) {
          state.currentIndent += 1;
          state.tokenize[state.tokenize.length - 1] = tokenMacro(begin, end, true);
          return "meta";
        }

        if (stream.match(end + "}")) {
          state.currentIndent -= 1;
          state.tokenize.pop();
          return "meta";
        }

        return tokenBase(stream, state);
      };
    }

    function tokenMacroDef(stream, state) {
      if (stream.eatSpace()) {
        return null;
      }

      var matched;
      if (matched = stream.match(idents)) {
        if (matched == "def") {
          return "keyword";
        }
        stream.eat(/[?!]/);
      }

      state.tokenize.pop();
      return "def";
    }

    function tokenFollowIdent(stream, state) {
      if (stream.eatSpace()) {
        return null;
      }

      if (stream.match(idents)) {
        stream.eat(/[!?]/);
      } else {
        stream.match(operators) || stream.match(conditionalOperators) || stream.match(indexingOperators);
      }
      state.tokenize.pop();
      return "def";
    }

    function tokenFollowType(stream, state) {
      if (stream.eatSpace()) {
        return null;
      }

      stream.match(types);
      state.tokenize.pop();
      return "def";
    }

    function tokenQuote(end, style, embed) {
      return function (stream, state) {
        var escaped = false;

        while (stream.peek()) {
          if (!escaped) {
            if (stream.match("{%", false)) {
              state.tokenize.push(tokenMacro("%", "%"));
              return style;
            }

            if (stream.match("{{", false)) {
              state.tokenize.push(tokenMacro("{", "}"));
              return style;
            }

            if (embed && stream.match("#{", false)) {
              state.tokenize.push(tokenNest("#{", "}", "meta"));
              return style;
            }

            var ch = stream.next();

            if (ch == end) {
              state.tokenize.pop();
              return style;
            }

            escaped = ch == "\\";
          } else {
            stream.next();
            escaped = false;
          }
        }

        return style;
      };
    }

    return {
      startState: function () {
        return {
          tokenize: [tokenBase],
          currentIndent: 0,
          lastToken: null,
          blocks: []
        };
      },

      token: function (stream, state) {
        var style = state.tokenize[state.tokenize.length - 1](stream, state);
        var token = stream.current();

        if (style && style != "comment") {
          state.lastToken = token;
        }

        return style;
      },

      indent: function (state, textAfter) {
        textAfter = textAfter.replace(/^\s*(?:\{%)?\s*|\s*(?:%\})?\s*$/g, "");

        if (dedentKeywords.test(textAfter) || dedentPunctuals.test(textAfter)) {
          return config.indentUnit * (state.currentIndent - 1);
        }

        return config.indentUnit * state.currentIndent;
      },

      fold: "indent",
      electricInput: wordRegExp(dedentPunctualsArray.concat(dedentKeywordsArray), true),
      lineComment: '#'
    };
  });

  CodeMirror.defineMIME("text/x-crystal", "crystal");
});
codemirror/mode/crystal/index.html000064400000005147151215013510013314 0ustar00<!doctype html>

<title>CodeMirror: Crystal mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="crystal.js"></script>
<style>
  .CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}
  .cm-s-default span.cm-arrow { color: red; }
</style>

<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Crystal</a>
  </ul>
</div>

<article>
<h2>Crystal mode</h2>
<form><textarea id="code" name="code">
# Features of Crystal
# - Ruby-inspired syntax.
# - Statically type-checked but without having to specify the type of variables or method arguments.
# - Be able to call C code by writing bindings to it in Crystal.
# - Have compile-time evaluation and generation of code, to avoid boilerplate code.
# - Compile to efficient native code.

# A very basic HTTP server
require "http/server"

server = HTTP::Server.new(8080) do |request|
  HTTP::Response.ok "text/plain", "Hello world, got #{request.path}!"
end

puts "Listening on http://0.0.0.0:8080"
server.listen

module Foo
  def initialize(@foo); end

  abstract def abstract_method : String

  @[AlwaysInline]
  def with_foofoo
    with Foo.new(self) yield
  end

  struct Foo
    def initialize(@foo); end

    def hello_world
      @foo.abstract_method
    end
  end
end

class Bar
  include Foo

  @@foobar = 12345

  def initialize(@bar)
    super(@bar.not_nil! + 100)
  end

  macro alias_method(name, method)
    def {{ name }}(*args)
      {{ method }}(*args)
    end
  end

  def a_method
    "Hello, World"
  end

  alias_method abstract_method, a_method

  macro def show_instance_vars : Nil
    {% for var in @type.instance_vars %}
      puts "@{{ var }} = #{ @{{ var }} }"
    {% end %}
    nil
  end
end

class Baz &lt; Bar; end

lib LibC
  fun c_puts = "puts"(str : Char*) : Int
end

$baz = Baz.new(100)
$baz.show_instance_vars
$baz.with_foofoo do
  LibC.c_puts hello_world
end
</textarea></form>
<script>
  var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
    mode: "text/x-crystal",
    matchBrackets: true,
    indentUnit: 2
  });
</script>

<p><strong>MIME types defined:</strong> <code>text/x-crystal</code>.</p>
</article>
codemirror/mode/modelica/index.html000064400000003727151215013510013412 0ustar00<!doctype html>

<title>CodeMirror: Modelica mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<link rel="stylesheet" href="../../addon/hint/show-hint.css">
<script src="../../addon/hint/show-hint.js"></script>
<script src="modelica.js"></script>
<style>.CodeMirror {border: 2px inset #dee;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Modelica</a>
  </ul>
</div>

<article>
<h2>Modelica mode</h2>

<div><textarea id="modelica">
model BouncingBall
  parameter Real e = 0.7;
  parameter Real g = 9.81;
  Real h(start=1);
  Real v;
  Boolean flying(start=true);
  Boolean impact;
  Real v_new;
equation
  impact = h <= 0.0;
  der(v) = if flying then -g else 0;
  der(h) = v;
  when {h <= 0.0 and v <= 0.0, impact} then
    v_new = if edge(impact) then -e*pre(v) else 0;
    flying = v_new > 0;
    reinit(v, v_new);
  end when;
  annotation (uses(Modelica(version="3.2")));
end BouncingBall;
</textarea></div>

    <script>
      var modelicaEditor = CodeMirror.fromTextArea(document.getElementById("modelica"), {
        lineNumbers: true,
        matchBrackets: true,
        mode: "text/x-modelica"
      });
      var mac = CodeMirror.keyMap.default == CodeMirror.keyMap.macDefault;
      CodeMirror.keyMap.default[(mac ? "Cmd" : "Ctrl") + "-Space"] = "autocomplete";
    </script>

    <p>Simple mode that tries to handle Modelica as well as it can.</p>

    <p><strong>MIME types defined:</strong> <code>text/x-modelica</code>
    (Modlica code).</p>
</article>
codemirror/mode/modelica/modelica.js000064400000015422151215013510013523 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

// Modelica support for CodeMirror, copyright (c) by Lennart Ochel

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})

(function(CodeMirror) {
  "use strict";

  CodeMirror.defineMode("modelica", function(config, parserConfig) {

    var indentUnit = config.indentUnit;
    var keywords = parserConfig.keywords || {};
    var builtin = parserConfig.builtin || {};
    var atoms = parserConfig.atoms || {};

    var isSingleOperatorChar = /[;=\(:\),{}.*<>+\-\/^\[\]]/;
    var isDoubleOperatorChar = /(:=|<=|>=|==|<>|\.\+|\.\-|\.\*|\.\/|\.\^)/;
    var isDigit = /[0-9]/;
    var isNonDigit = /[_a-zA-Z]/;

    function tokenLineComment(stream, state) {
      stream.skipToEnd();
      state.tokenize = null;
      return "comment";
    }

    function tokenBlockComment(stream, state) {
      var maybeEnd = false, ch;
      while (ch = stream.next()) {
        if (maybeEnd && ch == "/") {
          state.tokenize = null;
          break;
        }
        maybeEnd = (ch == "*");
      }
      return "comment";
    }

    function tokenString(stream, state) {
      var escaped = false, ch;
      while ((ch = stream.next()) != null) {
        if (ch == '"' && !escaped) {
          state.tokenize = null;
          state.sol = false;
          break;
        }
        escaped = !escaped && ch == "\\";
      }

      return "string";
    }

    function tokenIdent(stream, state) {
      stream.eatWhile(isDigit);
      while (stream.eat(isDigit) || stream.eat(isNonDigit)) { }


      var cur = stream.current();

      if(state.sol && (cur == "package" || cur == "model" || cur == "when" || cur == "connector")) state.level++;
      else if(state.sol && cur == "end" && state.level > 0) state.level--;

      state.tokenize = null;
      state.sol = false;

      if (keywords.propertyIsEnumerable(cur)) return "keyword";
      else if (builtin.propertyIsEnumerable(cur)) return "builtin";
      else if (atoms.propertyIsEnumerable(cur)) return "atom";
      else return "variable";
    }

    function tokenQIdent(stream, state) {
      while (stream.eat(/[^']/)) { }

      state.tokenize = null;
      state.sol = false;

      if(stream.eat("'"))
        return "variable";
      else
        return "error";
    }

    function tokenUnsignedNuber(stream, state) {
      stream.eatWhile(isDigit);
      if (stream.eat('.')) {
        stream.eatWhile(isDigit);
      }
      if (stream.eat('e') || stream.eat('E')) {
        if (!stream.eat('-'))
          stream.eat('+');
        stream.eatWhile(isDigit);
      }

      state.tokenize = null;
      state.sol = false;
      return "number";
    }

    // Interface
    return {
      startState: function() {
        return {
          tokenize: null,
          level: 0,
          sol: true
        };
      },

      token: function(stream, state) {
        if(state.tokenize != null) {
          return state.tokenize(stream, state);
        }

        if(stream.sol()) {
          state.sol = true;
        }

        // WHITESPACE
        if(stream.eatSpace()) {
          state.tokenize = null;
          return null;
        }

        var ch = stream.next();

        // LINECOMMENT
        if(ch == '/' && stream.eat('/')) {
          state.tokenize = tokenLineComment;
        }
        // BLOCKCOMMENT
        else if(ch == '/' && stream.eat('*')) {
          state.tokenize = tokenBlockComment;
        }
        // TWO SYMBOL TOKENS
        else if(isDoubleOperatorChar.test(ch+stream.peek())) {
          stream.next();
          state.tokenize = null;
          return "operator";
        }
        // SINGLE SYMBOL TOKENS
        else if(isSingleOperatorChar.test(ch)) {
          state.tokenize = null;
          return "operator";
        }
        // IDENT
        else if(isNonDigit.test(ch)) {
          state.tokenize = tokenIdent;
        }
        // Q-IDENT
        else if(ch == "'" && stream.peek() && stream.peek() != "'") {
          state.tokenize = tokenQIdent;
        }
        // STRING
        else if(ch == '"') {
          state.tokenize = tokenString;
        }
        // UNSIGNED_NUBER
        else if(isDigit.test(ch)) {
          state.tokenize = tokenUnsignedNuber;
        }
        // ERROR
        else {
          state.tokenize = null;
          return "error";
        }

        return state.tokenize(stream, state);
      },

      indent: function(state, textAfter) {
        if (state.tokenize != null) return CodeMirror.Pass;

        var level = state.level;
        if(/(algorithm)/.test(textAfter)) level--;
        if(/(equation)/.test(textAfter)) level--;
        if(/(initial algorithm)/.test(textAfter)) level--;
        if(/(initial equation)/.test(textAfter)) level--;
        if(/(end)/.test(textAfter)) level--;

        if(level > 0)
          return indentUnit*level;
        else
          return 0;
      },

      blockCommentStart: "/*",
      blockCommentEnd: "*/",
      lineComment: "//"
    };
  });

  function words(str) {
    var obj = {}, words = str.split(" ");
    for (var i=0; i<words.length; ++i)
      obj[words[i]] = true;
    return obj;
  }

  var modelicaKeywords = "algorithm and annotation assert block break class connect connector constant constrainedby der discrete each else elseif elsewhen encapsulated end enumeration equation expandable extends external false final flow for function if import impure in initial inner input loop model not operator or outer output package parameter partial protected public pure record redeclare replaceable return stream then true type when while within";
  var modelicaBuiltin = "abs acos actualStream asin atan atan2 cardinality ceil cos cosh delay div edge exp floor getInstanceName homotopy inStream integer log log10 mod pre reinit rem semiLinear sign sin sinh spatialDistribution sqrt tan tanh";
  var modelicaAtoms = "Real Boolean Integer String";

  function def(mimes, mode) {
    if (typeof mimes == "string")
      mimes = [mimes];

    var words = [];

    function add(obj) {
      if (obj)
        for (var prop in obj)
          if (obj.hasOwnProperty(prop))
            words.push(prop);
    }

    add(mode.keywords);
    add(mode.builtin);
    add(mode.atoms);

    if (words.length) {
      mode.helperType = mimes[0];
      CodeMirror.registerHelper("hintWords", mimes[0], words);
    }

    for (var i=0; i<mimes.length; ++i)
      CodeMirror.defineMIME(mimes[i], mode);
  }

  def(["text/x-modelica"], {
    name: "modelica",
    keywords: words(modelicaKeywords),
    builtin: words(modelicaBuiltin),
    atoms: words(modelicaAtoms)
  });
});
codemirror/mode/smalltalk/index.html000064400000003560151215013510013614 0ustar00<!doctype html>

<title>CodeMirror: Smalltalk mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="smalltalk.js"></script>
<style>
      .CodeMirror {border: 2px solid #dee; border-right-width: 10px;}
      .CodeMirror-gutter {border: none; background: #dee;}
      .CodeMirror-gutter pre {color: white; font-weight: bold;}
    </style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Smalltalk</a>
  </ul>
</div>

<article>
<h2>Smalltalk mode</h2>
<form><textarea id="code" name="code">
" 
    This is a test of the Smalltalk code
"
Seaside.WAComponent subclass: #MyCounter [
    | count |
    MyCounter class &gt;&gt; canBeRoot [ ^true ]

    initialize [
        super initialize.
        count := 0.
    ]
    states [ ^{ self } ]
    renderContentOn: html [
        html heading: count.
        html anchor callback: [ count := count + 1 ]; with: '++'.
        html space.
        html anchor callback: [ count := count - 1 ]; with: '--'.
    ]
]

MyCounter registerAsApplication: 'mycounter'
</textarea></form>

    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        lineNumbers: true,
        matchBrackets: true,
        mode: "text/x-stsrc",
        indentUnit: 4
      });
    </script>

    <p>Simple Smalltalk mode.</p>

    <p><strong>MIME types defined:</strong> <code>text/x-stsrc</code>.</p>
  </article>
codemirror/mode/smalltalk/smalltalk.js000064400000010677151215013510014150 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode('smalltalk', function(config) {

  var specialChars = /[+\-\/\\*~<>=@%|&?!.,:;^]/;
  var keywords = /true|false|nil|self|super|thisContext/;

  var Context = function(tokenizer, parent) {
    this.next = tokenizer;
    this.parent = parent;
  };

  var Token = function(name, context, eos) {
    this.name = name;
    this.context = context;
    this.eos = eos;
  };

  var State = function() {
    this.context = new Context(next, null);
    this.expectVariable = true;
    this.indentation = 0;
    this.userIndentationDelta = 0;
  };

  State.prototype.userIndent = function(indentation) {
    this.userIndentationDelta = indentation > 0 ? (indentation / config.indentUnit - this.indentation) : 0;
  };

  var next = function(stream, context, state) {
    var token = new Token(null, context, false);
    var aChar = stream.next();

    if (aChar === '"') {
      token = nextComment(stream, new Context(nextComment, context));

    } else if (aChar === '\'') {
      token = nextString(stream, new Context(nextString, context));

    } else if (aChar === '#') {
      if (stream.peek() === '\'') {
        stream.next();
        token = nextSymbol(stream, new Context(nextSymbol, context));
      } else {
        if (stream.eatWhile(/[^\s.{}\[\]()]/))
          token.name = 'string-2';
        else
          token.name = 'meta';
      }

    } else if (aChar === '$') {
      if (stream.next() === '<') {
        stream.eatWhile(/[^\s>]/);
        stream.next();
      }
      token.name = 'string-2';

    } else if (aChar === '|' && state.expectVariable) {
      token.context = new Context(nextTemporaries, context);

    } else if (/[\[\]{}()]/.test(aChar)) {
      token.name = 'bracket';
      token.eos = /[\[{(]/.test(aChar);

      if (aChar === '[') {
        state.indentation++;
      } else if (aChar === ']') {
        state.indentation = Math.max(0, state.indentation - 1);
      }

    } else if (specialChars.test(aChar)) {
      stream.eatWhile(specialChars);
      token.name = 'operator';
      token.eos = aChar !== ';'; // ; cascaded message expression

    } else if (/\d/.test(aChar)) {
      stream.eatWhile(/[\w\d]/);
      token.name = 'number';

    } else if (/[\w_]/.test(aChar)) {
      stream.eatWhile(/[\w\d_]/);
      token.name = state.expectVariable ? (keywords.test(stream.current()) ? 'keyword' : 'variable') : null;

    } else {
      token.eos = state.expectVariable;
    }

    return token;
  };

  var nextComment = function(stream, context) {
    stream.eatWhile(/[^"]/);
    return new Token('comment', stream.eat('"') ? context.parent : context, true);
  };

  var nextString = function(stream, context) {
    stream.eatWhile(/[^']/);
    return new Token('string', stream.eat('\'') ? context.parent : context, false);
  };

  var nextSymbol = function(stream, context) {
    stream.eatWhile(/[^']/);
    return new Token('string-2', stream.eat('\'') ? context.parent : context, false);
  };

  var nextTemporaries = function(stream, context) {
    var token = new Token(null, context, false);
    var aChar = stream.next();

    if (aChar === '|') {
      token.context = context.parent;
      token.eos = true;

    } else {
      stream.eatWhile(/[^|]/);
      token.name = 'variable';
    }

    return token;
  };

  return {
    startState: function() {
      return new State;
    },

    token: function(stream, state) {
      state.userIndent(stream.indentation());

      if (stream.eatSpace()) {
        return null;
      }

      var token = state.context.next(stream, state.context, state);
      state.context = token.context;
      state.expectVariable = token.eos;

      return token.name;
    },

    blankLine: function(state) {
      state.userIndent(0);
    },

    indent: function(state, textAfter) {
      var i = state.context.next === next && textAfter && textAfter.charAt(0) === ']' ? -1 : state.userIndentationDelta;
      return (state.indentation + i) * config.indentUnit;
    },

    electricChars: ']'
  };

});

CodeMirror.defineMIME('text/x-stsrc', {name: 'smalltalk'});

});
codemirror/mode/protobuf/protobuf.js000064400000004101151215013510013661 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  function wordRegexp(words) {
    return new RegExp("^((" + words.join(")|(") + "))\\b", "i");
  };

  var keywordArray = [
    "package", "message", "import", "syntax",
    "required", "optional", "repeated", "reserved", "default", "extensions", "packed",
    "bool", "bytes", "double", "enum", "float", "string",
    "int32", "int64", "uint32", "uint64", "sint32", "sint64", "fixed32", "fixed64", "sfixed32", "sfixed64"
  ];
  var keywords = wordRegexp(keywordArray);

  CodeMirror.registerHelper("hintWords", "protobuf", keywordArray);

  var identifiers = new RegExp("^[_A-Za-z\xa1-\uffff][_A-Za-z0-9\xa1-\uffff]*");

  function tokenBase(stream) {
    // whitespaces
    if (stream.eatSpace()) return null;

    // Handle one line Comments
    if (stream.match("//")) {
      stream.skipToEnd();
      return "comment";
    }

    // Handle Number Literals
    if (stream.match(/^[0-9\.+-]/, false)) {
      if (stream.match(/^[+-]?0x[0-9a-fA-F]+/))
        return "number";
      if (stream.match(/^[+-]?\d*\.\d+([EeDd][+-]?\d+)?/))
        return "number";
      if (stream.match(/^[+-]?\d+([EeDd][+-]?\d+)?/))
        return "number";
    }

    // Handle Strings
    if (stream.match(/^"([^"]|(""))*"/)) { return "string"; }
    if (stream.match(/^'([^']|(''))*'/)) { return "string"; }

    // Handle words
    if (stream.match(keywords)) { return "keyword"; }
    if (stream.match(identifiers)) { return "variable"; } ;

    // Handle non-detected items
    stream.next();
    return null;
  };

  CodeMirror.defineMode("protobuf", function() {
    return {token: tokenBase};
  });

  CodeMirror.defineMIME("text/x-protobuf", "protobuf");
});
codemirror/mode/protobuf/index.html000064400000003220151215013510013461 0ustar00<!doctype html>

<title>CodeMirror: ProtoBuf mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="protobuf.js"></script>
<style>.CodeMirror { border-top: 1px solid #ddd; border-bottom: 1px solid #ddd; }</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">ProtoBuf</a>
  </ul>
</div>

<article>
<h2>ProtoBuf mode</h2>
<form><textarea id="code" name="code">
package addressbook;

message Address {
   required string street = 1;
   required string postCode = 2;
}

message PhoneNumber {
   required string number = 1;
}

message Person {
   optional int32 id = 1;
   required string name = 2;
   required string surname = 3;
   optional Address address = 4;
   repeated PhoneNumber phoneNumbers = 5;
   optional uint32 age = 6;
   repeated uint32 favouriteNumbers = 7;
   optional string license = 8;
   enum Gender {
      MALE = 0;
      FEMALE = 1;
   }
   optional Gender gender = 9;
   optional fixed64 lastUpdate = 10;
   required bool deleted = 11 [default = false];
}

</textarea></form>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {});
    </script>

    <p><strong>MIME types defined:</strong> <code>text/x-protobuf</code>.</p>

  </article>
codemirror/mode/asterisk/asterisk.js000064400000016415151215013510013646 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

/*
 * =====================================================================================
 *
 *       Filename:  mode/asterisk/asterisk.js
 *
 *    Description:  CodeMirror mode for Asterisk dialplan
 *
 *        Created:  05/17/2012 09:20:25 PM
 *       Revision:  none
 *
 *         Author:  Stas Kobzar (stas@modulis.ca),
 *        Company:  Modulis.ca Inc.
 *
 * =====================================================================================
 */

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("asterisk", function() {
  var atoms    = ["exten", "same", "include","ignorepat","switch"],
      dpcmd    = ["#include","#exec"],
      apps     = [
                  "addqueuemember","adsiprog","aelsub","agentlogin","agentmonitoroutgoing","agi",
                  "alarmreceiver","amd","answer","authenticate","background","backgrounddetect",
                  "bridge","busy","callcompletioncancel","callcompletionrequest","celgenuserevent",
                  "changemonitor","chanisavail","channelredirect","chanspy","clearhash","confbridge",
                  "congestion","continuewhile","controlplayback","dahdiacceptr2call","dahdibarge",
                  "dahdiras","dahdiscan","dahdisendcallreroutingfacility","dahdisendkeypadfacility",
                  "datetime","dbdel","dbdeltree","deadagi","dial","dictate","directory","disa",
                  "dumpchan","eagi","echo","endwhile","exec","execif","execiftime","exitwhile","extenspy",
                  "externalivr","festival","flash","followme","forkcdr","getcpeid","gosub","gosubif",
                  "goto","gotoif","gotoiftime","hangup","iax2provision","ices","importvar","incomplete",
                  "ivrdemo","jabberjoin","jabberleave","jabbersend","jabbersendgroup","jabberstatus",
                  "jack","log","macro","macroexclusive","macroexit","macroif","mailboxexists","meetme",
                  "meetmeadmin","meetmechanneladmin","meetmecount","milliwatt","minivmaccmess","minivmdelete",
                  "minivmgreet","minivmmwi","minivmnotify","minivmrecord","mixmonitor","monitor","morsecode",
                  "mp3player","mset","musiconhold","nbscat","nocdr","noop","odbc","odbc","odbcfinish",
                  "originate","ospauth","ospfinish","osplookup","ospnext","page","park","parkandannounce",
                  "parkedcall","pausemonitor","pausequeuemember","pickup","pickupchan","playback","playtones",
                  "privacymanager","proceeding","progress","queue","queuelog","raiseexception","read","readexten",
                  "readfile","receivefax","receivefax","receivefax","record","removequeuemember",
                  "resetcdr","retrydial","return","ringing","sayalpha","saycountedadj","saycountednoun",
                  "saycountpl","saydigits","saynumber","sayphonetic","sayunixtime","senddtmf","sendfax",
                  "sendfax","sendfax","sendimage","sendtext","sendurl","set","setamaflags",
                  "setcallerpres","setmusiconhold","sipaddheader","sipdtmfmode","sipremoveheader","skel",
                  "slastation","slatrunk","sms","softhangup","speechactivategrammar","speechbackground",
                  "speechcreate","speechdeactivategrammar","speechdestroy","speechloadgrammar","speechprocessingsound",
                  "speechstart","speechunloadgrammar","stackpop","startmusiconhold","stopmixmonitor","stopmonitor",
                  "stopmusiconhold","stopplaytones","system","testclient","testserver","transfer","tryexec",
                  "trysystem","unpausemonitor","unpausequeuemember","userevent","verbose","vmauthenticate",
                  "vmsayname","voicemail","voicemailmain","wait","waitexten","waitfornoise","waitforring",
                  "waitforsilence","waitmusiconhold","waituntil","while","zapateller"
                 ];

  function basicToken(stream,state){
    var cur = '';
    var ch = stream.next();
    // comment
    if(ch == ";") {
      stream.skipToEnd();
      return "comment";
    }
    // context
    if(ch == '[') {
      stream.skipTo(']');
      stream.eat(']');
      return "header";
    }
    // string
    if(ch == '"') {
      stream.skipTo('"');
      return "string";
    }
    if(ch == "'") {
      stream.skipTo("'");
      return "string-2";
    }
    // dialplan commands
    if(ch == '#') {
      stream.eatWhile(/\w/);
      cur = stream.current();
      if(dpcmd.indexOf(cur) !== -1) {
        stream.skipToEnd();
        return "strong";
      }
    }
    // application args
    if(ch == '$'){
      var ch1 = stream.peek();
      if(ch1 == '{'){
        stream.skipTo('}');
        stream.eat('}');
        return "variable-3";
      }
    }
    // extension
    stream.eatWhile(/\w/);
    cur = stream.current();
    if(atoms.indexOf(cur) !== -1) {
      state.extenStart = true;
      switch(cur) {
        case 'same': state.extenSame = true; break;
        case 'include':
        case 'switch':
        case 'ignorepat':
          state.extenInclude = true;break;
        default:break;
      }
      return "atom";
    }
  }

  return {
    startState: function() {
      return {
        extenStart: false,
        extenSame:  false,
        extenInclude: false,
        extenExten: false,
        extenPriority: false,
        extenApplication: false
      };
    },
    token: function(stream, state) {

      var cur = '';
      if(stream.eatSpace()) return null;
      // extension started
      if(state.extenStart){
        stream.eatWhile(/[^\s]/);
        cur = stream.current();
        if(/^=>?$/.test(cur)){
          state.extenExten = true;
          state.extenStart = false;
          return "strong";
        } else {
          state.extenStart = false;
          stream.skipToEnd();
          return "error";
        }
      } else if(state.extenExten) {
        // set exten and priority
        state.extenExten = false;
        state.extenPriority = true;
        stream.eatWhile(/[^,]/);
        if(state.extenInclude) {
          stream.skipToEnd();
          state.extenPriority = false;
          state.extenInclude = false;
        }
        if(state.extenSame) {
          state.extenPriority = false;
          state.extenSame = false;
          state.extenApplication = true;
        }
        return "tag";
      } else if(state.extenPriority) {
        state.extenPriority = false;
        state.extenApplication = true;
        stream.next(); // get comma
        if(state.extenSame) return null;
        stream.eatWhile(/[^,]/);
        return "number";
      } else if(state.extenApplication) {
        stream.eatWhile(/,/);
        cur = stream.current();
        if(cur === ',') return null;
        stream.eatWhile(/\w/);
        cur = stream.current().toLowerCase();
        state.extenApplication = false;
        if(apps.indexOf(cur) !== -1){
          return "def strong";
        }
      } else{
        return basicToken(stream,state);
      }

      return null;
    }
  };
});

CodeMirror.defineMIME("text/x-asterisk", "asterisk");

});
codemirror/mode/asterisk/index.html000064400000010757151215013510013463 0ustar00<!doctype html>

<title>CodeMirror: Asterisk dialplan mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="asterisk.js"></script>
<style>
      .CodeMirror {border: 1px solid #999;}
      .cm-s-default span.cm-arrow { color: red; }
    </style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Asterisk dialplan</a>
  </ul>
</div>

<article>
<h2>Asterisk dialplan mode</h2>
<form><textarea id="code" name="code">
; extensions.conf - the Asterisk dial plan
;

[general]
;
; If static is set to no, or omitted, then the pbx_config will rewrite
; this file when extensions are modified.  Remember that all comments
; made in the file will be lost when that happens.
static=yes

#include "/etc/asterisk/additional_general.conf

[iaxprovider]
switch => IAX2/user:[key]@myserver/mycontext

[dynamic]
#exec /usr/bin/dynamic-peers.pl

[trunkint]
;
; International long distance through trunk
;
exten => _9011.,1,Macro(dundi-e164,${EXTEN:4})
exten => _9011.,n,Dial(${GLOBAL(TRUNK)}/${FILTER(0-9,${EXTEN:${GLOBAL(TRUNKMSD)}})})

[local]
;
; Master context for local, toll-free, and iaxtel calls only
;
ignorepat => 9
include => default

[demo]
include => stdexten
;
; We start with what to do when a call first comes in.
;
exten => s,1,Wait(1)			; Wait a second, just for fun
same  => n,Answer			; Answer the line
same  => n,Set(TIMEOUT(digit)=5)	; Set Digit Timeout to 5 seconds
same  => n,Set(TIMEOUT(response)=10)	; Set Response Timeout to 10 seconds
same  => n(restart),BackGround(demo-congrats)	; Play a congratulatory message
same  => n(instruct),BackGround(demo-instruct)	; Play some instructions
same  => n,WaitExten			; Wait for an extension to be dialed.

exten => 2,1,BackGround(demo-moreinfo)	; Give some more information.
exten => 2,n,Goto(s,instruct)

exten => 3,1,Set(LANGUAGE()=fr)		; Set language to french
exten => 3,n,Goto(s,restart)		; Start with the congratulations

exten => 1000,1,Goto(default,s,1)
;
; We also create an example user, 1234, who is on the console and has
; voicemail, etc.
;
exten => 1234,1,Playback(transfer,skip)		; "Please hold while..."
					; (but skip if channel is not up)
exten => 1234,n,Gosub(${EXTEN},stdexten(${GLOBAL(CONSOLE)}))
exten => 1234,n,Goto(default,s,1)		; exited Voicemail

exten => 1235,1,Voicemail(1234,u)		; Right to voicemail

exten => 1236,1,Dial(Console/dsp)		; Ring forever
exten => 1236,n,Voicemail(1234,b)		; Unless busy

;
; # for when they're done with the demo
;
exten => #,1,Playback(demo-thanks)	; "Thanks for trying the demo"
exten => #,n,Hangup			; Hang them up.

;
; A timeout and "invalid extension rule"
;
exten => t,1,Goto(#,1)			; If they take too long, give up
exten => i,1,Playback(invalid)		; "That's not valid, try again"

;
; Create an extension, 500, for dialing the
; Asterisk demo.
;
exten => 500,1,Playback(demo-abouttotry); Let them know what's going on
exten => 500,n,Dial(IAX2/guest@pbx.digium.com/s@default)	; Call the Asterisk demo
exten => 500,n,Playback(demo-nogo)	; Couldn't connect to the demo site
exten => 500,n,Goto(s,6)		; Return to the start over message.

;
; Create an extension, 600, for evaluating echo latency.
;
exten => 600,1,Playback(demo-echotest)	; Let them know what's going on
exten => 600,n,Echo			; Do the echo test
exten => 600,n,Playback(demo-echodone)	; Let them know it's over
exten => 600,n,Goto(s,6)		; Start over

;
;	You can use the Macro Page to intercom a individual user
exten => 76245,1,Macro(page,SIP/Grandstream1)
; or if your peernames are the same as extensions
exten => _7XXX,1,Macro(page,SIP/${EXTEN})
;
;
; System Wide Page at extension 7999
;
exten => 7999,1,Set(TIMEOUT(absolute)=60)
exten => 7999,2,Page(Local/Grandstream1@page&Local/Xlite1@page&Local/1234@page/n,d)

; Give voicemail at extension 8500
;
exten => 8500,1,VoicemailMain
exten => 8500,n,Goto(s,6)

    </textarea></form>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        mode: "text/x-asterisk",
        matchBrackets: true,
        lineNumber: true
      });
    </script>

    <p><strong>MIME types defined:</strong> <code>text/x-asterisk</code>.</p>

  </article>
codemirror/mode/smarty/smarty.js000064400000015254151215013510013032 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

/**
 * Smarty 2 and 3 mode.
 */

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  CodeMirror.defineMode("smarty", function(config, parserConf) {
    var rightDelimiter = parserConf.rightDelimiter || "}";
    var leftDelimiter = parserConf.leftDelimiter || "{";
    var version = parserConf.version || 2;
    var baseMode = CodeMirror.getMode(config, parserConf.baseMode || "null");

    var keyFunctions = ["debug", "extends", "function", "include", "literal"];
    var regs = {
      operatorChars: /[+\-*&%=<>!?]/,
      validIdentifier: /[a-zA-Z0-9_]/,
      stringChar: /['"]/
    };

    var last;
    function cont(style, lastType) {
      last = lastType;
      return style;
    }

    function chain(stream, state, parser) {
      state.tokenize = parser;
      return parser(stream, state);
    }

    // Smarty 3 allows { and } surrounded by whitespace to NOT slip into Smarty mode
    function doesNotCount(stream, pos) {
      if (pos == null) pos = stream.pos;
      return version === 3 && leftDelimiter == "{" &&
        (pos == stream.string.length || /\s/.test(stream.string.charAt(pos)));
    }

    function tokenTop(stream, state) {
      var string = stream.string;
      for (var scan = stream.pos;;) {
        var nextMatch = string.indexOf(leftDelimiter, scan);
        scan = nextMatch + leftDelimiter.length;
        if (nextMatch == -1 || !doesNotCount(stream, nextMatch + leftDelimiter.length)) break;
      }
      if (nextMatch == stream.pos) {
        stream.match(leftDelimiter);
        if (stream.eat("*")) {
          return chain(stream, state, tokenBlock("comment", "*" + rightDelimiter));
        } else {
          state.depth++;
          state.tokenize = tokenSmarty;
          last = "startTag";
          return "tag";
        }
      }

      if (nextMatch > -1) stream.string = string.slice(0, nextMatch);
      var token = baseMode.token(stream, state.base);
      if (nextMatch > -1) stream.string = string;
      return token;
    }

    // parsing Smarty content
    function tokenSmarty(stream, state) {
      if (stream.match(rightDelimiter, true)) {
        if (version === 3) {
          state.depth--;
          if (state.depth <= 0) {
            state.tokenize = tokenTop;
          }
        } else {
          state.tokenize = tokenTop;
        }
        return cont("tag", null);
      }

      if (stream.match(leftDelimiter, true)) {
        state.depth++;
        return cont("tag", "startTag");
      }

      var ch = stream.next();
      if (ch == "$") {
        stream.eatWhile(regs.validIdentifier);
        return cont("variable-2", "variable");
      } else if (ch == "|") {
        return cont("operator", "pipe");
      } else if (ch == ".") {
        return cont("operator", "property");
      } else if (regs.stringChar.test(ch)) {
        state.tokenize = tokenAttribute(ch);
        return cont("string", "string");
      } else if (regs.operatorChars.test(ch)) {
        stream.eatWhile(regs.operatorChars);
        return cont("operator", "operator");
      } else if (ch == "[" || ch == "]") {
        return cont("bracket", "bracket");
      } else if (ch == "(" || ch == ")") {
        return cont("bracket", "operator");
      } else if (/\d/.test(ch)) {
        stream.eatWhile(/\d/);
        return cont("number", "number");
      } else {

        if (state.last == "variable") {
          if (ch == "@") {
            stream.eatWhile(regs.validIdentifier);
            return cont("property", "property");
          } else if (ch == "|") {
            stream.eatWhile(regs.validIdentifier);
            return cont("qualifier", "modifier");
          }
        } else if (state.last == "pipe") {
          stream.eatWhile(regs.validIdentifier);
          return cont("qualifier", "modifier");
        } else if (state.last == "whitespace") {
          stream.eatWhile(regs.validIdentifier);
          return cont("attribute", "modifier");
        } if (state.last == "property") {
          stream.eatWhile(regs.validIdentifier);
          return cont("property", null);
        } else if (/\s/.test(ch)) {
          last = "whitespace";
          return null;
        }

        var str = "";
        if (ch != "/") {
          str += ch;
        }
        var c = null;
        while (c = stream.eat(regs.validIdentifier)) {
          str += c;
        }
        for (var i=0, j=keyFunctions.length; i<j; i++) {
          if (keyFunctions[i] == str) {
            return cont("keyword", "keyword");
          }
        }
        if (/\s/.test(ch)) {
          return null;
        }
        return cont("tag", "tag");
      }
    }

    function tokenAttribute(quote) {
      return function(stream, state) {
        var prevChar = null;
        var currChar = null;
        while (!stream.eol()) {
          currChar = stream.peek();
          if (stream.next() == quote && prevChar !== '\\') {
            state.tokenize = tokenSmarty;
            break;
          }
          prevChar = currChar;
        }
        return "string";
      };
    }

    function tokenBlock(style, terminator) {
      return function(stream, state) {
        while (!stream.eol()) {
          if (stream.match(terminator)) {
            state.tokenize = tokenTop;
            break;
          }
          stream.next();
        }
        return style;
      };
    }

    return {
      startState: function() {
        return {
          base: CodeMirror.startState(baseMode),
          tokenize: tokenTop,
          last: null,
          depth: 0
        };
      },
      copyState: function(state) {
        return {
          base: CodeMirror.copyState(baseMode, state.base),
          tokenize: state.tokenize,
          last: state.last,
          depth: state.depth
        };
      },
      innerMode: function(state) {
        if (state.tokenize == tokenTop)
          return {mode: baseMode, state: state.base};
      },
      token: function(stream, state) {
        var style = state.tokenize(stream, state);
        state.last = last;
        return style;
      },
      indent: function(state, text) {
        if (state.tokenize == tokenTop && baseMode.indent)
          return baseMode.indent(state.base, text);
        else
          return CodeMirror.Pass;
      },
      blockCommentStart: leftDelimiter + "*",
      blockCommentEnd: "*" + rightDelimiter
    };
  });

  CodeMirror.defineMIME("text/x-smarty", "smarty");
});
codemirror/mode/smarty/index.html000064400000007605151215013510013153 0ustar00<!doctype html>

<title>CodeMirror: Smarty mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../xml/xml.js"></script>
<script src="smarty.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Smarty</a>
  </ul>
</div>

<article>
<h2>Smarty mode</h2>
<form><textarea id="code" name="code">
{extends file="parent.tpl"}
{include file="template.tpl"}

{* some example Smarty content *}
{if isset($name) && $name == 'Blog'}
  This is a {$var}.
  {$integer = 451}, {$array[] = "a"}, {$stringvar = "string"}
  {assign var='bob' value=$var.prop}
{elseif $name == $foo}
  {function name=menu level=0}
    {foreach $data as $entry}
      {if is_array($entry)}
        - {$entry@key}
        {menu data=$entry level=$level+1}
      {else}
        {$entry}
      {/if}
    {/foreach}
  {/function}
{/if}</textarea></form>

<p>Mode for Smarty version 2 or 3, which allows for custom delimiter tags.</p>

<p>Several configuration parameters are supported:</p>

<ul>
  <li><code>leftDelimiter</code> and <code>rightDelimiter</code>,
  which should be strings that determine where the Smarty syntax
  starts and ends.</li>
  <li><code>version</code>, which should be 2 or 3.</li>
  <li><code>baseMode</code>, which can be a mode spec
  like <code>"text/html"</code> to set a different background mode.</li>
</ul>

<p><strong>MIME types defined:</strong> <code>text/x-smarty</code></p>

<h3>Smarty 2, custom delimiters</h3>

<form><textarea id="code2" name="code2">
{--extends file="parent.tpl"--}
{--include file="template.tpl"--}

{--* some example Smarty content *--}
{--if isset($name) && $name == 'Blog'--}
  This is a {--$var--}.
  {--$integer = 451--}, {--$array[] = "a"--}, {--$stringvar = "string"--}
  {--assign var='bob' value=$var.prop--}
{--elseif $name == $foo--}
  {--function name=menu level=0--}
    {--foreach $data as $entry--}
      {--if is_array($entry)--}
        - {--$entry@key--}
        {--menu data=$entry level=$level+1--}
      {--else--}
        {--$entry--}
      {--/if--}
    {--/foreach--}
  {--/function--}
{--/if--}</textarea></form>

<h3>Smarty 3</h3>

<textarea id="code3" name="code3">
Nested tags {$foo={counter one=1 two={inception}}+3} are now valid in Smarty 3.

<script>
function test() {
  console.log("Smarty 3 permits single curly braces followed by whitespace to NOT slip into Smarty mode.");
}
</script>

{assign var=foo value=[1,2,3]}
{assign var=foo value=['y'=>'yellow','b'=>'blue']}
{assign var=foo value=[1,[9,8],3]}

{$foo=$bar+2} {* a comment *}
{$foo.bar=1}  {* another comment *}
{$foo = myfunct(($x+$y)*3)}
{$foo = strlen($bar)}
{$foo.bar.baz=1}, {$foo[]=1}

Smarty "dot" syntax (note: embedded {} are used to address ambiguities):

{$foo.a.b.c}      => $foo['a']['b']['c']
{$foo.a.$b.c}     => $foo['a'][$b]['c']
{$foo.a.{$b+4}.c} => $foo['a'][$b+4]['c']
{$foo.a.{$b.c}}   => $foo['a'][$b['c']]

{$object->method1($x)->method2($y)}</textarea>

<script>
var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
  lineNumbers: true,
  mode: "smarty"
});
var editor = CodeMirror.fromTextArea(document.getElementById("code2"), {
  lineNumbers: true,
  mode: {
    name: "smarty",
    leftDelimiter: "{--",
    rightDelimiter: "--}"
  }
});
var editor = CodeMirror.fromTextArea(document.getElementById("code3"), {
  lineNumbers: true,
  mode: {name: "smarty", version: 3, baseMode: "text/html"}
});
</script>

</article>
codemirror/mode/diff/index.html000064400000010471151215013510012537 0ustar00<!doctype html>

<title>CodeMirror: Diff mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="diff.js"></script>
<style>
      .CodeMirror {border-top: 1px solid #ddd; border-bottom: 1px solid #ddd;}
      span.cm-meta {color: #a0b !important;}
      span.cm-error { background-color: black; opacity: 0.4;}
      span.cm-error.cm-string { background-color: red; }
      span.cm-error.cm-tag { background-color: #2b2; }
    </style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Diff</a>
  </ul>
</div>

<article>
<h2>Diff mode</h2>
<form><textarea id="code" name="code">
diff --git a/index.html b/index.html
index c1d9156..7764744 100644
--- a/index.html
+++ b/index.html
@@ -95,7 +95,8 @@ StringStream.prototype = {
     <script>
       var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
         lineNumbers: true,
-        autoMatchBrackets: true
+        autoMatchBrackets: true,
+      onGutterClick: function(x){console.log(x);}
       });
     </script>
   </body>
diff --git a/lib/codemirror.js b/lib/codemirror.js
index 04646a9..9a39cc7 100644
--- a/lib/codemirror.js
+++ b/lib/codemirror.js
@@ -399,10 +399,16 @@ var CodeMirror = (function() {
     }
 
     function onMouseDown(e) {
-      var start = posFromMouse(e), last = start;    
+      var start = posFromMouse(e), last = start, target = e.target();
       if (!start) return;
       setCursor(start.line, start.ch, false);
       if (e.button() != 1) return;
+      if (target.parentNode == gutter) {    
+        if (options.onGutterClick)
+          options.onGutterClick(indexOf(gutter.childNodes, target) + showingFrom);
+        return;
+      }
+
       if (!focused) onFocus();
 
       e.stop();
@@ -808,7 +814,7 @@ var CodeMirror = (function() {
       for (var i = showingFrom; i < showingTo; ++i) {
         var marker = lines[i].gutterMarker;
         if (marker) html.push('<div class="' + marker.style + '">' + htmlEscape(marker.text) + '</div>');
-        else html.push("<div>" + (options.lineNumbers ? i + 1 : "\u00a0") + "</div>");
+        else html.push("<div>" + (options.lineNumbers ? i + options.firstLineNumber : "\u00a0") + "</div>");
       }
       gutter.style.display = "none"; // TODO test whether this actually helps
       gutter.innerHTML = html.join("");
@@ -1371,10 +1377,8 @@ var CodeMirror = (function() {
         if (option == "parser") setParser(value);
         else if (option === "lineNumbers") setLineNumbers(value);
         else if (option === "gutter") setGutter(value);
-        else if (option === "readOnly") options.readOnly = value;
-        else if (option === "indentUnit") {options.indentUnit = indentUnit = value; setParser(options.parser);}
-        else if (/^(?:enterMode|tabMode|indentWithTabs|readOnly|autoMatchBrackets|undoDepth)$/.test(option)) options[option] = value;
-        else throw new Error("Can't set option " + option);
+        else if (option === "indentUnit") {options.indentUnit = value; setParser(options.parser);}
+        else options[option] = value;
       },
       cursorCoords: cursorCoords,
       undo: operation(undo),
@@ -1402,7 +1406,8 @@ var CodeMirror = (function() {
       replaceRange: operation(replaceRange),
 
       operation: function(f){return operation(f)();},
-      refresh: function(){updateDisplay([{from: 0, to: lines.length}]);}
+      refresh: function(){updateDisplay([{from: 0, to: lines.length}]);},
+      getInputField: function(){return input;}
     };
     return instance;
   }
@@ -1420,6 +1425,7 @@ var CodeMirror = (function() {
     readOnly: false,
     onChange: null,
     onCursorActivity: null,
+    onGutterClick: null,
     autoMatchBrackets: false,
     workTime: 200,
     workDelay: 300,
</textarea></form>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {});
    </script>

    <p><strong>MIME types defined:</strong> <code>text/x-diff</code>.</p>

  </article>
codemirror/mode/diff/diff.js000064400000002162151215013510012006 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("diff", function() {

  var TOKEN_NAMES = {
    '+': 'positive',
    '-': 'negative',
    '@': 'meta'
  };

  return {
    token: function(stream) {
      var tw_pos = stream.string.search(/[\t ]+?$/);

      if (!stream.sol() || tw_pos === 0) {
        stream.skipToEnd();
        return ("error " + (
          TOKEN_NAMES[stream.string.charAt(0)] || '')).replace(/ $/, '');
      }

      var token_name = TOKEN_NAMES[stream.peek()] || stream.skipToEnd();

      if (tw_pos === -1) {
        stream.skipToEnd();
      } else {
        stream.pos = tw_pos;
      }

      return token_name;
    }
  };
});

CodeMirror.defineMIME("text/x-diff", "diff");

});
codemirror/mode/xquery/xquery.js000064400000034206151215013510013064 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("xquery", function() {

  // The keywords object is set to the result of this self executing
  // function. Each keyword is a property of the keywords object whose
  // value is {type: atype, style: astyle}
  var keywords = function(){
    // convenience functions used to build keywords object
    function kw(type) {return {type: type, style: "keyword"};}
    var A = kw("keyword a")
      , B = kw("keyword b")
      , C = kw("keyword c")
      , operator = kw("operator")
      , atom = {type: "atom", style: "atom"}
      , punctuation = {type: "punctuation", style: null}
      , qualifier = {type: "axis_specifier", style: "qualifier"};

    // kwObj is what is return from this function at the end
    var kwObj = {
      'if': A, 'switch': A, 'while': A, 'for': A,
      'else': B, 'then': B, 'try': B, 'finally': B, 'catch': B,
      'element': C, 'attribute': C, 'let': C, 'implements': C, 'import': C, 'module': C, 'namespace': C,
      'return': C, 'super': C, 'this': C, 'throws': C, 'where': C, 'private': C,
      ',': punctuation,
      'null': atom, 'fn:false()': atom, 'fn:true()': atom
    };

    // a list of 'basic' keywords. For each add a property to kwObj with the value of
    // {type: basic[i], style: "keyword"} e.g. 'after' --> {type: "after", style: "keyword"}
    var basic = ['after','ancestor','ancestor-or-self','and','as','ascending','assert','attribute','before',
    'by','case','cast','child','comment','declare','default','define','descendant','descendant-or-self',
    'descending','document','document-node','element','else','eq','every','except','external','following',
    'following-sibling','follows','for','function','if','import','in','instance','intersect','item',
    'let','module','namespace','node','node','of','only','or','order','parent','precedes','preceding',
    'preceding-sibling','processing-instruction','ref','return','returns','satisfies','schema','schema-element',
    'self','some','sortby','stable','text','then','to','treat','typeswitch','union','variable','version','where',
    'xquery', 'empty-sequence'];
    for(var i=0, l=basic.length; i < l; i++) { kwObj[basic[i]] = kw(basic[i]);};

    // a list of types. For each add a property to kwObj with the value of
    // {type: "atom", style: "atom"}
    var types = ['xs:string', 'xs:float', 'xs:decimal', 'xs:double', 'xs:integer', 'xs:boolean', 'xs:date', 'xs:dateTime',
    'xs:time', 'xs:duration', 'xs:dayTimeDuration', 'xs:time', 'xs:yearMonthDuration', 'numeric', 'xs:hexBinary',
    'xs:base64Binary', 'xs:anyURI', 'xs:QName', 'xs:byte','xs:boolean','xs:anyURI','xf:yearMonthDuration'];
    for(var i=0, l=types.length; i < l; i++) { kwObj[types[i]] = atom;};

    // each operator will add a property to kwObj with value of {type: "operator", style: "keyword"}
    var operators = ['eq', 'ne', 'lt', 'le', 'gt', 'ge', ':=', '=', '>', '>=', '<', '<=', '.', '|', '?', 'and', 'or', 'div', 'idiv', 'mod', '*', '/', '+', '-'];
    for(var i=0, l=operators.length; i < l; i++) { kwObj[operators[i]] = operator;};

    // each axis_specifiers will add a property to kwObj with value of {type: "axis_specifier", style: "qualifier"}
    var axis_specifiers = ["self::", "attribute::", "child::", "descendant::", "descendant-or-self::", "parent::",
    "ancestor::", "ancestor-or-self::", "following::", "preceding::", "following-sibling::", "preceding-sibling::"];
    for(var i=0, l=axis_specifiers.length; i < l; i++) { kwObj[axis_specifiers[i]] = qualifier; };

    return kwObj;
  }();

  function chain(stream, state, f) {
    state.tokenize = f;
    return f(stream, state);
  }

  // the primary mode tokenizer
  function tokenBase(stream, state) {
    var ch = stream.next(),
        mightBeFunction = false,
        isEQName = isEQNameAhead(stream);

    // an XML tag (if not in some sub, chained tokenizer)
    if (ch == "<") {
      if(stream.match("!--", true))
        return chain(stream, state, tokenXMLComment);

      if(stream.match("![CDATA", false)) {
        state.tokenize = tokenCDATA;
        return "tag";
      }

      if(stream.match("?", false)) {
        return chain(stream, state, tokenPreProcessing);
      }

      var isclose = stream.eat("/");
      stream.eatSpace();
      var tagName = "", c;
      while ((c = stream.eat(/[^\s\u00a0=<>\"\'\/?]/))) tagName += c;

      return chain(stream, state, tokenTag(tagName, isclose));
    }
    // start code block
    else if(ch == "{") {
      pushStateStack(state,{ type: "codeblock"});
      return null;
    }
    // end code block
    else if(ch == "}") {
      popStateStack(state);
      return null;
    }
    // if we're in an XML block
    else if(isInXmlBlock(state)) {
      if(ch == ">")
        return "tag";
      else if(ch == "/" && stream.eat(">")) {
        popStateStack(state);
        return "tag";
      }
      else
        return "variable";
    }
    // if a number
    else if (/\d/.test(ch)) {
      stream.match(/^\d*(?:\.\d*)?(?:E[+\-]?\d+)?/);
      return "atom";
    }
    // comment start
    else if (ch === "(" && stream.eat(":")) {
      pushStateStack(state, { type: "comment"});
      return chain(stream, state, tokenComment);
    }
    // quoted string
    else if (  !isEQName && (ch === '"' || ch === "'"))
      return chain(stream, state, tokenString(ch));
    // variable
    else if(ch === "$") {
      return chain(stream, state, tokenVariable);
    }
    // assignment
    else if(ch ===":" && stream.eat("=")) {
      return "keyword";
    }
    // open paren
    else if(ch === "(") {
      pushStateStack(state, { type: "paren"});
      return null;
    }
    // close paren
    else if(ch === ")") {
      popStateStack(state);
      return null;
    }
    // open paren
    else if(ch === "[") {
      pushStateStack(state, { type: "bracket"});
      return null;
    }
    // close paren
    else if(ch === "]") {
      popStateStack(state);
      return null;
    }
    else {
      var known = keywords.propertyIsEnumerable(ch) && keywords[ch];

      // if there's a EQName ahead, consume the rest of the string portion, it's likely a function
      if(isEQName && ch === '\"') while(stream.next() !== '"'){}
      if(isEQName && ch === '\'') while(stream.next() !== '\''){}

      // gobble up a word if the character is not known
      if(!known) stream.eatWhile(/[\w\$_-]/);

      // gobble a colon in the case that is a lib func type call fn:doc
      var foundColon = stream.eat(":");

      // if there's not a second colon, gobble another word. Otherwise, it's probably an axis specifier
      // which should get matched as a keyword
      if(!stream.eat(":") && foundColon) {
        stream.eatWhile(/[\w\$_-]/);
      }
      // if the next non whitespace character is an open paren, this is probably a function (if not a keyword of other sort)
      if(stream.match(/^[ \t]*\(/, false)) {
        mightBeFunction = true;
      }
      // is the word a keyword?
      var word = stream.current();
      known = keywords.propertyIsEnumerable(word) && keywords[word];

      // if we think it's a function call but not yet known,
      // set style to variable for now for lack of something better
      if(mightBeFunction && !known) known = {type: "function_call", style: "variable def"};

      // if the previous word was element, attribute, axis specifier, this word should be the name of that
      if(isInXmlConstructor(state)) {
        popStateStack(state);
        return "variable";
      }
      // as previously checked, if the word is element,attribute, axis specifier, call it an "xmlconstructor" and
      // push the stack so we know to look for it on the next word
      if(word == "element" || word == "attribute" || known.type == "axis_specifier") pushStateStack(state, {type: "xmlconstructor"});

      // if the word is known, return the details of that else just call this a generic 'word'
      return known ? known.style : "variable";
    }
  }

  // handle comments, including nested
  function tokenComment(stream, state) {
    var maybeEnd = false, maybeNested = false, nestedCount = 0, ch;
    while (ch = stream.next()) {
      if (ch == ")" && maybeEnd) {
        if(nestedCount > 0)
          nestedCount--;
        else {
          popStateStack(state);
          break;
        }
      }
      else if(ch == ":" && maybeNested) {
        nestedCount++;
      }
      maybeEnd = (ch == ":");
      maybeNested = (ch == "(");
    }

    return "comment";
  }

  // tokenizer for string literals
  // optionally pass a tokenizer function to set state.tokenize back to when finished
  function tokenString(quote, f) {
    return function(stream, state) {
      var ch;

      if(isInString(state) && stream.current() == quote) {
        popStateStack(state);
        if(f) state.tokenize = f;
        return "string";
      }

      pushStateStack(state, { type: "string", name: quote, tokenize: tokenString(quote, f) });

      // if we're in a string and in an XML block, allow an embedded code block
      if(stream.match("{", false) && isInXmlAttributeBlock(state)) {
        state.tokenize = tokenBase;
        return "string";
      }


      while (ch = stream.next()) {
        if (ch ==  quote) {
          popStateStack(state);
          if(f) state.tokenize = f;
          break;
        }
        else {
          // if we're in a string and in an XML block, allow an embedded code block in an attribute
          if(stream.match("{", false) && isInXmlAttributeBlock(state)) {
            state.tokenize = tokenBase;
            return "string";
          }

        }
      }

      return "string";
    };
  }

  // tokenizer for variables
  function tokenVariable(stream, state) {
    var isVariableChar = /[\w\$_-]/;

    // a variable may start with a quoted EQName so if the next character is quote, consume to the next quote
    if(stream.eat("\"")) {
      while(stream.next() !== '\"'){};
      stream.eat(":");
    } else {
      stream.eatWhile(isVariableChar);
      if(!stream.match(":=", false)) stream.eat(":");
    }
    stream.eatWhile(isVariableChar);
    state.tokenize = tokenBase;
    return "variable";
  }

  // tokenizer for XML tags
  function tokenTag(name, isclose) {
    return function(stream, state) {
      stream.eatSpace();
      if(isclose && stream.eat(">")) {
        popStateStack(state);
        state.tokenize = tokenBase;
        return "tag";
      }
      // self closing tag without attributes?
      if(!stream.eat("/"))
        pushStateStack(state, { type: "tag", name: name, tokenize: tokenBase});
      if(!stream.eat(">")) {
        state.tokenize = tokenAttribute;
        return "tag";
      }
      else {
        state.tokenize = tokenBase;
      }
      return "tag";
    };
  }

  // tokenizer for XML attributes
  function tokenAttribute(stream, state) {
    var ch = stream.next();

    if(ch == "/" && stream.eat(">")) {
      if(isInXmlAttributeBlock(state)) popStateStack(state);
      if(isInXmlBlock(state)) popStateStack(state);
      return "tag";
    }
    if(ch == ">") {
      if(isInXmlAttributeBlock(state)) popStateStack(state);
      return "tag";
    }
    if(ch == "=")
      return null;
    // quoted string
    if (ch == '"' || ch == "'")
      return chain(stream, state, tokenString(ch, tokenAttribute));

    if(!isInXmlAttributeBlock(state))
      pushStateStack(state, { type: "attribute", tokenize: tokenAttribute});

    stream.eat(/[a-zA-Z_:]/);
    stream.eatWhile(/[-a-zA-Z0-9_:.]/);
    stream.eatSpace();

    // the case where the attribute has not value and the tag was closed
    if(stream.match(">", false) || stream.match("/", false)) {
      popStateStack(state);
      state.tokenize = tokenBase;
    }

    return "attribute";
  }

  // handle comments, including nested
  function tokenXMLComment(stream, state) {
    var ch;
    while (ch = stream.next()) {
      if (ch == "-" && stream.match("->", true)) {
        state.tokenize = tokenBase;
        return "comment";
      }
    }
  }


  // handle CDATA
  function tokenCDATA(stream, state) {
    var ch;
    while (ch = stream.next()) {
      if (ch == "]" && stream.match("]", true)) {
        state.tokenize = tokenBase;
        return "comment";
      }
    }
  }

  // handle preprocessing instructions
  function tokenPreProcessing(stream, state) {
    var ch;
    while (ch = stream.next()) {
      if (ch == "?" && stream.match(">", true)) {
        state.tokenize = tokenBase;
        return "comment meta";
      }
    }
  }


  // functions to test the current context of the state
  function isInXmlBlock(state) { return isIn(state, "tag"); }
  function isInXmlAttributeBlock(state) { return isIn(state, "attribute"); }
  function isInXmlConstructor(state) { return isIn(state, "xmlconstructor"); }
  function isInString(state) { return isIn(state, "string"); }

  function isEQNameAhead(stream) {
    // assume we've already eaten a quote (")
    if(stream.current() === '"')
      return stream.match(/^[^\"]+\"\:/, false);
    else if(stream.current() === '\'')
      return stream.match(/^[^\"]+\'\:/, false);
    else
      return false;
  }

  function isIn(state, type) {
    return (state.stack.length && state.stack[state.stack.length - 1].type == type);
  }

  function pushStateStack(state, newState) {
    state.stack.push(newState);
  }

  function popStateStack(state) {
    state.stack.pop();
    var reinstateTokenize = state.stack.length && state.stack[state.stack.length-1].tokenize;
    state.tokenize = reinstateTokenize || tokenBase;
  }

  // the interface for the mode API
  return {
    startState: function() {
      return {
        tokenize: tokenBase,
        cc: [],
        stack: []
      };
    },

    token: function(stream, state) {
      if (stream.eatSpace()) return null;
      var style = state.tokenize(stream, state);
      return style;
    },

    blockCommentStart: "(:",
    blockCommentEnd: ":)"

  };

});

CodeMirror.defineMIME("application/xquery", "xquery");

});
codemirror/mode/xquery/index.html000064400000020641151215013510013164 0ustar00<!doctype html>

<title>CodeMirror: XQuery mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<link rel="stylesheet" href="../../theme/xq-dark.css">
<script src="../../lib/codemirror.js"></script>
<script src="xquery.js"></script>
<style type="text/css">
	.CodeMirror {
	  border-top: 1px solid black; border-bottom: 1px solid black;
	  height:400px;
	}
    </style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">XQuery</a>
  </ul>
</div>

<article>
<h2>XQuery mode</h2>
 
 
<div class="cm-s-default"> 
	<textarea id="code" name="code"> 
xquery version &quot;1.0-ml&quot;;
(: this is
 : a 
   "comment" :)
let $let := &lt;x attr=&quot;value&quot;&gt;&quot;test&quot;&lt;func&gt;function() $var {function()} {$var}&lt;/func&gt;&lt;/x&gt;
let $joe:=1
return element element {
	attribute attribute { 1 },
	element test { &#39;a&#39; }, 
	attribute foo { &quot;bar&quot; },
	fn:doc()[ foo/@bar eq $let ],
	//x }    
 
(: a more 'evil' test :)
(: Modified Blakeley example (: with nested comment :) ... :)
declare private function local:declare() {()};
declare private function local:private() {()};
declare private function local:function() {()};
declare private function local:local() {()};
let $let := &lt;let&gt;let $let := &quot;let&quot;&lt;/let&gt;
return element element {
	attribute attribute { try { xdmp:version() } catch($e) { xdmp:log($e) } },
	attribute fn:doc { &quot;bar&quot; castable as xs:string },
	element text { text { &quot;text&quot; } },
	fn:doc()[ child::eq/(@bar | attribute::attribute) eq $let ],
	//fn:doc
}



xquery version &quot;1.0-ml&quot;;

(: Copyright 2006-2010 Mark Logic Corporation. :)

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

module namespace json = &quot;http://marklogic.com/json&quot;;
declare default function namespace &quot;http://www.w3.org/2005/xpath-functions&quot;;

(: Need to backslash escape any double quotes, backslashes, and newlines :)
declare function json:escape($s as xs:string) as xs:string {
  let $s := replace($s, &quot;\\&quot;, &quot;\\\\&quot;)
  let $s := replace($s, &quot;&quot;&quot;&quot;, &quot;\\&quot;&quot;&quot;)
  let $s := replace($s, codepoints-to-string((13, 10)), &quot;\\n&quot;)
  let $s := replace($s, codepoints-to-string(13), &quot;\\n&quot;)
  let $s := replace($s, codepoints-to-string(10), &quot;\\n&quot;)
  return $s
};

declare function json:atomize($x as element()) as xs:string {
  if (count($x/node()) = 0) then 'null'
  else if ($x/@type = &quot;number&quot;) then
    let $castable := $x castable as xs:float or
                     $x castable as xs:double or
                     $x castable as xs:decimal
    return
    if ($castable) then xs:string($x)
    else error(concat(&quot;Not a number: &quot;, xdmp:describe($x)))
  else if ($x/@type = &quot;boolean&quot;) then
    let $castable := $x castable as xs:boolean
    return
    if ($castable) then xs:string(xs:boolean($x))
    else error(concat(&quot;Not a boolean: &quot;, xdmp:describe($x)))
  else concat('&quot;', json:escape($x), '&quot;')
};

(: Print the thing that comes after the colon :)
declare function json:print-value($x as element()) as xs:string {
  if (count($x/*) = 0) then
    json:atomize($x)
  else if ($x/@quote = &quot;true&quot;) then
    concat('&quot;', json:escape(xdmp:quote($x/node())), '&quot;')
  else
    string-join(('{',
      string-join(for $i in $x/* return json:print-name-value($i), &quot;,&quot;),
    '}'), &quot;&quot;)
};

(: Print the name and value both :)
declare function json:print-name-value($x as element()) as xs:string? {
  let $name := name($x)
  let $first-in-array :=
    count($x/preceding-sibling::*[name(.) = $name]) = 0 and
    (count($x/following-sibling::*[name(.) = $name]) &gt; 0 or $x/@array = &quot;true&quot;)
  let $later-in-array := count($x/preceding-sibling::*[name(.) = $name]) &gt; 0
  return

  if ($later-in-array) then
    ()  (: I was handled previously :)
  else if ($first-in-array) then
    string-join(('&quot;', json:escape($name), '&quot;:[',
      string-join((for $i in ($x, $x/following-sibling::*[name(.) = $name]) return json:print-value($i)), &quot;,&quot;),
    ']'), &quot;&quot;)
   else
     string-join(('&quot;', json:escape($name), '&quot;:', json:print-value($x)), &quot;&quot;)
};

(:~
  Transforms an XML element into a JSON string representation.  See http://json.org.
  &lt;p/&gt;
  Sample usage:
  &lt;pre&gt;
    xquery version &quot;1.0-ml&quot;;
    import module namespace json=&quot;http://marklogic.com/json&quot; at &quot;json.xqy&quot;;
    json:serialize(&amp;lt;foo&amp;gt;&amp;lt;bar&amp;gt;kid&amp;lt;/bar&amp;gt;&amp;lt;/foo&amp;gt;)
  &lt;/pre&gt;
  Sample transformations:
  &lt;pre&gt;
  &amp;lt;e/&amp;gt; becomes {&quot;e&quot;:null}
  &amp;lt;e&amp;gt;text&amp;lt;/e&amp;gt; becomes {&quot;e&quot;:&quot;text&quot;}
  &amp;lt;e&amp;gt;quote &quot; escaping&amp;lt;/e&amp;gt; becomes {&quot;e&quot;:&quot;quote \&quot; escaping&quot;}
  &amp;lt;e&amp;gt;backslash \ escaping&amp;lt;/e&amp;gt; becomes {&quot;e&quot;:&quot;backslash \\ escaping&quot;}
  &amp;lt;e&amp;gt;&amp;lt;a&amp;gt;text1&amp;lt;/a&amp;gt;&amp;lt;b&amp;gt;text2&amp;lt;/b&amp;gt;&amp;lt;/e&amp;gt; becomes {&quot;e&quot;:{&quot;a&quot;:&quot;text1&quot;,&quot;b&quot;:&quot;text2&quot;}}
  &amp;lt;e&amp;gt;&amp;lt;a&amp;gt;text1&amp;lt;/a&amp;gt;&amp;lt;a&amp;gt;text2&amp;lt;/a&amp;gt;&amp;lt;/e&amp;gt; becomes {&quot;e&quot;:{&quot;a&quot;:[&quot;text1&quot;,&quot;text2&quot;]}}
  &amp;lt;e&amp;gt;&amp;lt;a array=&quot;true&quot;&amp;gt;text1&amp;lt;/a&amp;gt;&amp;lt;/e&amp;gt; becomes {&quot;e&quot;:{&quot;a&quot;:[&quot;text1&quot;]}}
  &amp;lt;e&amp;gt;&amp;lt;a type=&quot;boolean&quot;&amp;gt;false&amp;lt;/a&amp;gt;&amp;lt;/e&amp;gt; becomes {&quot;e&quot;:{&quot;a&quot;:false}}
  &amp;lt;e&amp;gt;&amp;lt;a type=&quot;number&quot;&amp;gt;123.5&amp;lt;/a&amp;gt;&amp;lt;/e&amp;gt; becomes {&quot;e&quot;:{&quot;a&quot;:123.5}}
  &amp;lt;e quote=&quot;true&quot;&amp;gt;&amp;lt;div attrib=&quot;value&quot;/&amp;gt;&amp;lt;/e&amp;gt; becomes {&quot;e&quot;:&quot;&amp;lt;div attrib=\&quot;value\&quot;/&amp;gt;&quot;}
  &lt;/pre&gt;
  &lt;p/&gt;
  Namespace URIs are ignored.  Namespace prefixes are included in the JSON name.
  &lt;p/&gt;
  Attributes are ignored, except for the special attribute @array=&quot;true&quot; that
  indicates the JSON serialization should write the node, even if single, as an
  array, and the attribute @type that can be set to &quot;boolean&quot; or &quot;number&quot; to
  dictate the value should be written as that type (unquoted).  There's also
  an @quote attribute that when set to true writes the inner content as text
  rather than as structured JSON, useful for sending some XHTML over the
  wire.
  &lt;p/&gt;
  Text nodes within mixed content are ignored.

  @param $x Element node to convert
  @return String holding JSON serialized representation of $x

  @author Jason Hunter
  @version 1.0.1
  
  Ported to xquery 1.0-ml; double escaped backslashes in json:escape
:)
declare function json:serialize($x as element())  as xs:string {
  string-join(('{', json:print-name-value($x), '}'), &quot;&quot;)
};
  </textarea> 
</div> 
 
    <script> 
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        lineNumbers: true,
        matchBrackets: true,
        theme: "xq-dark"
      });
    </script> 
 
    <p><strong>MIME types defined:</strong> <code>application/xquery</code>.</p> 
 
    <p>Development of the CodeMirror XQuery mode was sponsored by 
      <a href="http://marklogic.com">MarkLogic</a> and developed by 
      <a href="https://twitter.com/mbrevoort">Mike Brevoort</a>.
    </p>
 
  </article>
codemirror/mode/xquery/test.js000064400000011764151215013510012512 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

// Don't take these too seriously -- the expected results appear to be
// based on the results of actual runs without any serious manual
// verification. If a change you made causes them to fail, the test is
// as likely to wrong as the code.

(function() {
  var mode = CodeMirror.getMode({tabSize: 4}, "xquery");
  function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); }

  MT("eviltest",
     "[keyword xquery] [keyword version] [variable &quot;1][keyword .][atom 0][keyword -][variable ml&quot;][def&variable ;]      [comment (: this is       : a          \"comment\" :)]",
     "      [keyword let] [variable $let] [keyword :=] [variable &lt;x] [variable attr][keyword =][variable &quot;value&quot;&gt;&quot;test&quot;&lt;func&gt][def&variable ;function]() [variable $var] {[keyword function]()} {[variable $var]}[variable &lt;][keyword /][variable func&gt;&lt;][keyword /][variable x&gt;]",
     "      [keyword let] [variable $joe][keyword :=][atom 1]",
     "      [keyword return] [keyword element] [variable element] {",
     "          [keyword attribute] [variable attribute] { [atom 1] },",
     "          [keyword element] [variable test] { [variable &#39;a&#39;] },           [keyword attribute] [variable foo] { [variable &quot;bar&quot;] },",
     "          [def&variable fn:doc]()[[ [variable foo][keyword /][variable @bar] [keyword eq] [variable $let] ]],",
     "          [keyword //][variable x] }                 [comment (: a more 'evil' test :)]",
     "      [comment (: Modified Blakeley example (: with nested comment :) ... :)]",
     "      [keyword declare] [keyword private] [keyword function] [def&variable local:declare]() {()}[variable ;]",
     "      [keyword declare] [keyword private] [keyword function] [def&variable local:private]() {()}[variable ;]",
     "      [keyword declare] [keyword private] [keyword function] [def&variable local:function]() {()}[variable ;]",
     "      [keyword declare] [keyword private] [keyword function] [def&variable local:local]() {()}[variable ;]",
     "      [keyword let] [variable $let] [keyword :=] [variable &lt;let&gt;let] [variable $let] [keyword :=] [variable &quot;let&quot;&lt;][keyword /let][variable &gt;]",
     "      [keyword return] [keyword element] [variable element] {",
     "          [keyword attribute] [variable attribute] { [keyword try] { [def&variable xdmp:version]() } [keyword catch]([variable $e]) { [def&variable xdmp:log]([variable $e]) } },",
     "          [keyword attribute] [variable fn:doc] { [variable &quot;bar&quot;] [variable castable] [keyword as] [atom xs:string] },",
     "          [keyword element] [variable text] { [keyword text] { [variable &quot;text&quot;] } },",
     "          [def&variable fn:doc]()[[ [qualifier child::][variable eq][keyword /]([variable @bar] [keyword |] [qualifier attribute::][variable attribute]) [keyword eq] [variable $let] ]],",
     "          [keyword //][variable fn:doc]",
     "      }");

  MT("testEmptySequenceKeyword",
     "[string \"foo\"] [keyword instance] [keyword of] [keyword empty-sequence]()");

  MT("testMultiAttr",
     "[tag <p ][attribute a1]=[string \"foo\"] [attribute a2]=[string \"bar\"][tag >][variable hello] [variable world][tag </p>]");

  MT("test namespaced variable",
     "[keyword declare] [keyword namespace] [variable e] [keyword =] [string \"http://example.com/ANamespace\"][variable ;declare] [keyword variable] [variable $e:exampleComThisVarIsNotRecognized] [keyword as] [keyword element]([keyword *]) [variable external;]");

  MT("test EQName variable",
     "[keyword declare] [keyword variable] [variable $\"http://www.example.com/ns/my\":var] [keyword :=] [atom 12][variable ;]",
     "[tag <out>]{[variable $\"http://www.example.com/ns/my\":var]}[tag </out>]");

  MT("test EQName function",
     "[keyword declare] [keyword function] [def&variable \"http://www.example.com/ns/my\":fn] ([variable $a] [keyword as] [atom xs:integer]) [keyword as] [atom xs:integer] {",
     "   [variable $a] [keyword +] [atom 2]",
     "}[variable ;]",
     "[tag <out>]{[def&variable \"http://www.example.com/ns/my\":fn]([atom 12])}[tag </out>]");

  MT("test EQName function with single quotes",
     "[keyword declare] [keyword function] [def&variable 'http://www.example.com/ns/my':fn] ([variable $a] [keyword as] [atom xs:integer]) [keyword as] [atom xs:integer] {",
     "   [variable $a] [keyword +] [atom 2]",
     "}[variable ;]",
     "[tag <out>]{[def&variable 'http://www.example.com/ns/my':fn]([atom 12])}[tag </out>]");

  MT("testProcessingInstructions",
     "[def&variable data]([comment&meta <?target content?>]) [keyword instance] [keyword of] [atom xs:string]");

  MT("testQuoteEscapeDouble",
     "[keyword let] [variable $rootfolder] [keyword :=] [string \"c:\\builds\\winnt\\HEAD\\qa\\scripts\\\"]",
     "[keyword let] [variable $keysfolder] [keyword :=] [def&variable concat]([variable $rootfolder], [string \"keys\\\"])");
})();
codemirror/mode/yaml/index.html000064400000004062151215013510012570 0ustar00<!doctype html>

<title>CodeMirror: YAML mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="yaml.js"></script>
<style>.CodeMirror { border-top: 1px solid #ddd; border-bottom: 1px solid #ddd; }</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">YAML</a>
  </ul>
</div>

<article>
<h2>YAML mode</h2>
<form><textarea id="code" name="code">
--- # Favorite movies
- Casablanca
- North by Northwest
- The Man Who Wasn't There
--- # Shopping list
[milk, pumpkin pie, eggs, juice]
--- # Indented Blocks, common in YAML data files, use indentation and new lines to separate the key: value pairs
  name: John Smith
  age: 33
--- # Inline Blocks, common in YAML data streams, use commas to separate the key: value pairs between braces
{name: John Smith, age: 33}
---
receipt:     Oz-Ware Purchase Invoice
date:        2007-08-06
customer:
    given:   Dorothy
    family:  Gale

items:
    - part_no:   A4786
      descrip:   Water Bucket (Filled)
      price:     1.47
      quantity:  4

    - part_no:   E1628
      descrip:   High Heeled "Ruby" Slippers
      size:       8
      price:     100.27
      quantity:  1

bill-to:  &id001
    street: |
            123 Tornado Alley
            Suite 16
    city:   East Centerville
    state:  KS

ship-to:  *id001

specialDelivery:  >
    Follow the Yellow Brick
    Road to the Emerald City.
    Pay no attention to the
    man behind the curtain.
...
</textarea></form>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {});
    </script>

    <p><strong>MIME types defined:</strong> <code>text/x-yaml</code>.</p>

  </article>
codemirror/mode/yaml/yaml.js000064400000007101151215013510012070 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("yaml", function() {

  var cons = ['true', 'false', 'on', 'off', 'yes', 'no'];
  var keywordRegex = new RegExp("\\b(("+cons.join(")|(")+"))$", 'i');

  return {
    token: function(stream, state) {
      var ch = stream.peek();
      var esc = state.escaped;
      state.escaped = false;
      /* comments */
      if (ch == "#" && (stream.pos == 0 || /\s/.test(stream.string.charAt(stream.pos - 1)))) {
        stream.skipToEnd();
        return "comment";
      }

      if (stream.match(/^('([^']|\\.)*'?|"([^"]|\\.)*"?)/))
        return "string";

      if (state.literal && stream.indentation() > state.keyCol) {
        stream.skipToEnd(); return "string";
      } else if (state.literal) { state.literal = false; }
      if (stream.sol()) {
        state.keyCol = 0;
        state.pair = false;
        state.pairStart = false;
        /* document start */
        if(stream.match(/---/)) { return "def"; }
        /* document end */
        if (stream.match(/\.\.\./)) { return "def"; }
        /* array list item */
        if (stream.match(/\s*-\s+/)) { return 'meta'; }
      }
      /* inline pairs/lists */
      if (stream.match(/^(\{|\}|\[|\])/)) {
        if (ch == '{')
          state.inlinePairs++;
        else if (ch == '}')
          state.inlinePairs--;
        else if (ch == '[')
          state.inlineList++;
        else
          state.inlineList--;
        return 'meta';
      }

      /* list seperator */
      if (state.inlineList > 0 && !esc && ch == ',') {
        stream.next();
        return 'meta';
      }
      /* pairs seperator */
      if (state.inlinePairs > 0 && !esc && ch == ',') {
        state.keyCol = 0;
        state.pair = false;
        state.pairStart = false;
        stream.next();
        return 'meta';
      }

      /* start of value of a pair */
      if (state.pairStart) {
        /* block literals */
        if (stream.match(/^\s*(\||\>)\s*/)) { state.literal = true; return 'meta'; };
        /* references */
        if (stream.match(/^\s*(\&|\*)[a-z0-9\._-]+\b/i)) { return 'variable-2'; }
        /* numbers */
        if (state.inlinePairs == 0 && stream.match(/^\s*-?[0-9\.\,]+\s?$/)) { return 'number'; }
        if (state.inlinePairs > 0 && stream.match(/^\s*-?[0-9\.\,]+\s?(?=(,|}))/)) { return 'number'; }
        /* keywords */
        if (stream.match(keywordRegex)) { return 'keyword'; }
      }

      /* pairs (associative arrays) -> key */
      if (!state.pair && stream.match(/^\s*(?:[,\[\]{}&*!|>'"%@`][^\s'":]|[^,\[\]{}#&*!|>'"%@`])[^#]*?(?=\s*:($|\s))/)) {
        state.pair = true;
        state.keyCol = stream.indentation();
        return "atom";
      }
      if (state.pair && stream.match(/^:\s*/)) { state.pairStart = true; return 'meta'; }

      /* nothing found, continue */
      state.pairStart = false;
      state.escaped = (ch == '\\');
      stream.next();
      return null;
    },
    startState: function() {
      return {
        pair: false,
        pairStart: false,
        keyCol: 0,
        inlinePairs: 0,
        inlineList: 0,
        literal: false,
        escaped: false
      };
    }
  };
});

CodeMirror.defineMIME("text/x-yaml", "yaml");

});
codemirror/mode/meta.js000064400000034327151215013510011124 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  CodeMirror.modeInfo = [
    {name: "APL", mime: "text/apl", mode: "apl", ext: ["dyalog", "apl"]},
    {name: "PGP", mimes: ["application/pgp", "application/pgp-keys", "application/pgp-signature"], mode: "asciiarmor", ext: ["pgp"]},
    {name: "ASN.1", mime: "text/x-ttcn-asn", mode: "asn.1", ext: ["asn", "asn1"]},
    {name: "Asterisk", mime: "text/x-asterisk", mode: "asterisk", file: /^extensions\.conf$/i},
    {name: "Brainfuck", mime: "text/x-brainfuck", mode: "brainfuck", ext: ["b", "bf"]},
    {name: "C", mime: "text/x-csrc", mode: "clike", ext: ["c", "h"]},
    {name: "C++", mime: "text/x-c++src", mode: "clike", ext: ["cpp", "c++", "cc", "cxx", "hpp", "h++", "hh", "hxx"], alias: ["cpp"]},
    {name: "Cobol", mime: "text/x-cobol", mode: "cobol", ext: ["cob", "cpy"]},
    {name: "C#", mime: "text/x-csharp", mode: "clike", ext: ["cs"], alias: ["csharp"]},
    {name: "Clojure", mime: "text/x-clojure", mode: "clojure", ext: ["clj", "cljc", "cljx"]},
    {name: "ClojureScript", mime: "text/x-clojurescript", mode: "clojure", ext: ["cljs"]},
    {name: "Closure Stylesheets (GSS)", mime: "text/x-gss", mode: "css", ext: ["gss"]},
    {name: "CMake", mime: "text/x-cmake", mode: "cmake", ext: ["cmake", "cmake.in"], file: /^CMakeLists.txt$/},
    {name: "CoffeeScript", mime: "text/x-coffeescript", mode: "coffeescript", ext: ["coffee"], alias: ["coffee", "coffee-script"]},
    {name: "Common Lisp", mime: "text/x-common-lisp", mode: "commonlisp", ext: ["cl", "lisp", "el"], alias: ["lisp"]},
    {name: "Cypher", mime: "application/x-cypher-query", mode: "cypher", ext: ["cyp", "cypher"]},
    {name: "Cython", mime: "text/x-cython", mode: "python", ext: ["pyx", "pxd", "pxi"]},
    {name: "Crystal", mime: "text/x-crystal", mode: "crystal", ext: ["cr"]},
    {name: "CSS", mime: "text/css", mode: "css", ext: ["css"]},
    {name: "CQL", mime: "text/x-cassandra", mode: "sql", ext: ["cql"]},
    {name: "D", mime: "text/x-d", mode: "d", ext: ["d"]},
    {name: "Dart", mimes: ["application/dart", "text/x-dart"], mode: "dart", ext: ["dart"]},
    {name: "diff", mime: "text/x-diff", mode: "diff", ext: ["diff", "patch"]},
    {name: "Django", mime: "text/x-django", mode: "django"},
    {name: "Dockerfile", mime: "text/x-dockerfile", mode: "dockerfile", file: /^Dockerfile$/},
    {name: "DTD", mime: "application/xml-dtd", mode: "dtd", ext: ["dtd"]},
    {name: "Dylan", mime: "text/x-dylan", mode: "dylan", ext: ["dylan", "dyl", "intr"]},
    {name: "EBNF", mime: "text/x-ebnf", mode: "ebnf"},
    {name: "ECL", mime: "text/x-ecl", mode: "ecl", ext: ["ecl"]},
    {name: "edn", mime: "application/edn", mode: "clojure", ext: ["edn"]},
    {name: "Eiffel", mime: "text/x-eiffel", mode: "eiffel", ext: ["e"]},
    {name: "Elm", mime: "text/x-elm", mode: "elm", ext: ["elm"]},
    {name: "Embedded Javascript", mime: "application/x-ejs", mode: "htmlembedded", ext: ["ejs"]},
    {name: "Embedded Ruby", mime: "application/x-erb", mode: "htmlembedded", ext: ["erb"]},
    {name: "Erlang", mime: "text/x-erlang", mode: "erlang", ext: ["erl"]},
    {name: "Factor", mime: "text/x-factor", mode: "factor", ext: ["factor"]},
    {name: "FCL", mime: "text/x-fcl", mode: "fcl"},
    {name: "Forth", mime: "text/x-forth", mode: "forth", ext: ["forth", "fth", "4th"]},
    {name: "Fortran", mime: "text/x-fortran", mode: "fortran", ext: ["f", "for", "f77", "f90"]},
    {name: "F#", mime: "text/x-fsharp", mode: "mllike", ext: ["fs"], alias: ["fsharp"]},
    {name: "Gas", mime: "text/x-gas", mode: "gas", ext: ["s"]},
    {name: "Gherkin", mime: "text/x-feature", mode: "gherkin", ext: ["feature"]},
    {name: "GitHub Flavored Markdown", mime: "text/x-gfm", mode: "gfm", file: /^(readme|contributing|history).md$/i},
    {name: "Go", mime: "text/x-go", mode: "go", ext: ["go"]},
    {name: "Groovy", mime: "text/x-groovy", mode: "groovy", ext: ["groovy", "gradle"]},
    {name: "HAML", mime: "text/x-haml", mode: "haml", ext: ["haml"]},
    {name: "Haskell", mime: "text/x-haskell", mode: "haskell", ext: ["hs"]},
    {name: "Haskell (Literate)", mime: "text/x-literate-haskell", mode: "haskell-literate", ext: ["lhs"]},
    {name: "Haxe", mime: "text/x-haxe", mode: "haxe", ext: ["hx"]},
    {name: "HXML", mime: "text/x-hxml", mode: "haxe", ext: ["hxml"]},
    {name: "ASP.NET", mime: "application/x-aspx", mode: "htmlembedded", ext: ["aspx"], alias: ["asp", "aspx"]},
    {name: "HTML", mime: "text/html", mode: "htmlmixed", ext: ["html", "htm"], alias: ["xhtml"]},
    {name: "HTTP", mime: "message/http", mode: "http"},
    {name: "IDL", mime: "text/x-idl", mode: "idl", ext: ["pro"]},
    {name: "Pug", mime: "text/x-pug", mode: "pug", ext: ["jade", "pug"], alias: ["jade"]},
    {name: "Java", mime: "text/x-java", mode: "clike", ext: ["java"]},
    {name: "Java Server Pages", mime: "application/x-jsp", mode: "htmlembedded", ext: ["jsp"], alias: ["jsp"]},
    {name: "JavaScript", mimes: ["text/javascript", "text/ecmascript", "application/javascript", "application/x-javascript", "application/ecmascript"],
     mode: "javascript", ext: ["js"], alias: ["ecmascript", "js", "node"]},
    {name: "JSON", mimes: ["application/json", "application/x-json"], mode: "javascript", ext: ["json", "map"], alias: ["json5"]},
    {name: "JSON-LD", mime: "application/ld+json", mode: "javascript", ext: ["jsonld"], alias: ["jsonld"]},
    {name: "JSX", mime: "text/jsx", mode: "jsx", ext: ["jsx"]},
    {name: "Jinja2", mime: "null", mode: "jinja2"},
    {name: "Julia", mime: "text/x-julia", mode: "julia", ext: ["jl"]},
    {name: "Kotlin", mime: "text/x-kotlin", mode: "clike", ext: ["kt"]},
    {name: "LESS", mime: "text/x-less", mode: "css", ext: ["less"]},
    {name: "LiveScript", mime: "text/x-livescript", mode: "livescript", ext: ["ls"], alias: ["ls"]},
    {name: "Lua", mime: "text/x-lua", mode: "lua", ext: ["lua"]},
    {name: "Markdown", mime: "text/x-markdown", mode: "markdown", ext: ["markdown", "md", "mkd"]},
    {name: "mIRC", mime: "text/mirc", mode: "mirc"},
    {name: "MariaDB SQL", mime: "text/x-mariadb", mode: "sql"},
    {name: "Mathematica", mime: "text/x-mathematica", mode: "mathematica", ext: ["m", "nb"]},
    {name: "Modelica", mime: "text/x-modelica", mode: "modelica", ext: ["mo"]},
    {name: "MUMPS", mime: "text/x-mumps", mode: "mumps", ext: ["mps"]},
    {name: "MS SQL", mime: "text/x-mssql", mode: "sql"},
    {name: "mbox", mime: "application/mbox", mode: "mbox", ext: ["mbox"]},
    {name: "MySQL", mime: "text/x-mysql", mode: "sql"},
    {name: "Nginx", mime: "text/x-nginx-conf", mode: "nginx", file: /nginx.*\.conf$/i},
    {name: "NSIS", mime: "text/x-nsis", mode: "nsis", ext: ["nsh", "nsi"]},
    {name: "NTriples", mime: "text/n-triples", mode: "ntriples", ext: ["nt"]},
    {name: "Objective C", mime: "text/x-objectivec", mode: "clike", ext: ["m", "mm"], alias: ["objective-c", "objc"]},
    {name: "OCaml", mime: "text/x-ocaml", mode: "mllike", ext: ["ml", "mli", "mll", "mly"]},
    {name: "Octave", mime: "text/x-octave", mode: "octave", ext: ["m"]},
    {name: "Oz", mime: "text/x-oz", mode: "oz", ext: ["oz"]},
    {name: "Pascal", mime: "text/x-pascal", mode: "pascal", ext: ["p", "pas"]},
    {name: "PEG.js", mime: "null", mode: "pegjs", ext: ["jsonld"]},
    {name: "Perl", mime: "text/x-perl", mode: "perl", ext: ["pl", "pm"]},
    {name: "PHP", mime: "application/x-httpd-php", mode: "php", ext: ["php", "php3", "php4", "php5", "phtml"]},
    {name: "Pig", mime: "text/x-pig", mode: "pig", ext: ["pig"]},
    {name: "Plain Text", mime: "text/plain", mode: "null", ext: ["txt", "text", "conf", "def", "list", "log"]},
    {name: "PLSQL", mime: "text/x-plsql", mode: "sql", ext: ["pls"]},
    {name: "PowerShell", mime: "application/x-powershell", mode: "powershell", ext: ["ps1", "psd1", "psm1"]},
    {name: "Properties files", mime: "text/x-properties", mode: "properties", ext: ["properties", "ini", "in"], alias: ["ini", "properties"]},
    {name: "ProtoBuf", mime: "text/x-protobuf", mode: "protobuf", ext: ["proto"]},
    {name: "Python", mime: "text/x-python", mode: "python", ext: ["BUILD", "bzl", "py", "pyw"], file: /^(BUCK|BUILD)$/},
    {name: "Puppet", mime: "text/x-puppet", mode: "puppet", ext: ["pp"]},
    {name: "Q", mime: "text/x-q", mode: "q", ext: ["q"]},
    {name: "R", mime: "text/x-rsrc", mode: "r", ext: ["r"], alias: ["rscript"]},
    {name: "reStructuredText", mime: "text/x-rst", mode: "rst", ext: ["rst"], alias: ["rst"]},
    {name: "RPM Changes", mime: "text/x-rpm-changes", mode: "rpm"},
    {name: "RPM Spec", mime: "text/x-rpm-spec", mode: "rpm", ext: ["spec"]},
    {name: "Ruby", mime: "text/x-ruby", mode: "ruby", ext: ["rb"], alias: ["jruby", "macruby", "rake", "rb", "rbx"]},
    {name: "Rust", mime: "text/x-rustsrc", mode: "rust", ext: ["rs"]},
    {name: "SAS", mime: "text/x-sas", mode: "sas", ext: ["sas"]},
    {name: "Sass", mime: "text/x-sass", mode: "sass", ext: ["sass"]},
    {name: "Scala", mime: "text/x-scala", mode: "clike", ext: ["scala"]},
    {name: "Scheme", mime: "text/x-scheme", mode: "scheme", ext: ["scm", "ss"]},
    {name: "SCSS", mime: "text/x-scss", mode: "css", ext: ["scss"]},
    {name: "Shell", mime: "text/x-sh", mode: "shell", ext: ["sh", "ksh", "bash"], alias: ["bash", "sh", "zsh"], file: /^PKGBUILD$/},
    {name: "Sieve", mime: "application/sieve", mode: "sieve", ext: ["siv", "sieve"]},
    {name: "Slim", mimes: ["text/x-slim", "application/x-slim"], mode: "slim", ext: ["slim"]},
    {name: "Smalltalk", mime: "text/x-stsrc", mode: "smalltalk", ext: ["st"]},
    {name: "Smarty", mime: "text/x-smarty", mode: "smarty", ext: ["tpl"]},
    {name: "Solr", mime: "text/x-solr", mode: "solr"},
    {name: "Soy", mime: "text/x-soy", mode: "soy", ext: ["soy"], alias: ["closure template"]},
    {name: "SPARQL", mime: "application/sparql-query", mode: "sparql", ext: ["rq", "sparql"], alias: ["sparul"]},
    {name: "Spreadsheet", mime: "text/x-spreadsheet", mode: "spreadsheet", alias: ["excel", "formula"]},
    {name: "SQL", mime: "text/x-sql", mode: "sql", ext: ["sql"]},
    {name: "Squirrel", mime: "text/x-squirrel", mode: "clike", ext: ["nut"]},
    {name: "Swift", mime: "text/x-swift", mode: "swift", ext: ["swift"]},
    {name: "sTeX", mime: "text/x-stex", mode: "stex"},
    {name: "LaTeX", mime: "text/x-latex", mode: "stex", ext: ["text", "ltx"], alias: ["tex"]},
    {name: "SystemVerilog", mime: "text/x-systemverilog", mode: "verilog", ext: ["v"]},
    {name: "Tcl", mime: "text/x-tcl", mode: "tcl", ext: ["tcl"]},
    {name: "Textile", mime: "text/x-textile", mode: "textile", ext: ["textile"]},
    {name: "TiddlyWiki ", mime: "text/x-tiddlywiki", mode: "tiddlywiki"},
    {name: "Tiki wiki", mime: "text/tiki", mode: "tiki"},
    {name: "TOML", mime: "text/x-toml", mode: "toml", ext: ["toml"]},
    {name: "Tornado", mime: "text/x-tornado", mode: "tornado"},
    {name: "troff", mime: "text/troff", mode: "troff", ext: ["1", "2", "3", "4", "5", "6", "7", "8", "9"]},
    {name: "TTCN", mime: "text/x-ttcn", mode: "ttcn", ext: ["ttcn", "ttcn3", "ttcnpp"]},
    {name: "TTCN_CFG", mime: "text/x-ttcn-cfg", mode: "ttcn-cfg", ext: ["cfg"]},
    {name: "Turtle", mime: "text/turtle", mode: "turtle", ext: ["ttl"]},
    {name: "TypeScript", mime: "application/typescript", mode: "javascript", ext: ["ts"], alias: ["ts"]},
    {name: "Twig", mime: "text/x-twig", mode: "twig"},
    {name: "Web IDL", mime: "text/x-webidl", mode: "webidl", ext: ["webidl"]},
    {name: "VB.NET", mime: "text/x-vb", mode: "vb", ext: ["vb"]},
    {name: "VBScript", mime: "text/vbscript", mode: "vbscript", ext: ["vbs"]},
    {name: "Velocity", mime: "text/velocity", mode: "velocity", ext: ["vtl"]},
    {name: "Verilog", mime: "text/x-verilog", mode: "verilog", ext: ["v"]},
    {name: "VHDL", mime: "text/x-vhdl", mode: "vhdl", ext: ["vhd", "vhdl"]},
    {name: "XML", mimes: ["application/xml", "text/xml"], mode: "xml", ext: ["xml", "xsl", "xsd"], alias: ["rss", "wsdl", "xsd"]},
    {name: "XQuery", mime: "application/xquery", mode: "xquery", ext: ["xy", "xquery"]},
    {name: "Yacas", mime: "text/x-yacas", mode: "yacas", ext: ["ys"]},
    {name: "YAML", mime: "text/x-yaml", mode: "yaml", ext: ["yaml", "yml"], alias: ["yml"]},
    {name: "Z80", mime: "text/x-z80", mode: "z80", ext: ["z80"]},
    {name: "mscgen", mime: "text/x-mscgen", mode: "mscgen", ext: ["mscgen", "mscin", "msc"]},
    {name: "xu", mime: "text/x-xu", mode: "mscgen", ext: ["xu"]},
    {name: "msgenny", mime: "text/x-msgenny", mode: "mscgen", ext: ["msgenny"]}
  ];
  // Ensure all modes have a mime property for backwards compatibility
  for (var i = 0; i < CodeMirror.modeInfo.length; i++) {
    var info = CodeMirror.modeInfo[i];
    if (info.mimes) info.mime = info.mimes[0];
  }

  CodeMirror.findModeByMIME = function(mime) {
    mime = mime.toLowerCase();
    for (var i = 0; i < CodeMirror.modeInfo.length; i++) {
      var info = CodeMirror.modeInfo[i];
      if (info.mime == mime) return info;
      if (info.mimes) for (var j = 0; j < info.mimes.length; j++)
        if (info.mimes[j] == mime) return info;
    }
  };

  CodeMirror.findModeByExtension = function(ext) {
    for (var i = 0; i < CodeMirror.modeInfo.length; i++) {
      var info = CodeMirror.modeInfo[i];
      if (info.ext) for (var j = 0; j < info.ext.length; j++)
        if (info.ext[j] == ext) return info;
    }
  };

  CodeMirror.findModeByFileName = function(filename) {
    for (var i = 0; i < CodeMirror.modeInfo.length; i++) {
      var info = CodeMirror.modeInfo[i];
      if (info.file && info.file.test(filename)) return info;
    }
    var dot = filename.lastIndexOf(".");
    var ext = dot > -1 && filename.substring(dot + 1, filename.length);
    if (ext) return CodeMirror.findModeByExtension(ext);
  };

  CodeMirror.findModeByName = function(name) {
    name = name.toLowerCase();
    for (var i = 0; i < CodeMirror.modeInfo.length; i++) {
      var info = CodeMirror.modeInfo[i];
      if (info.name.toLowerCase() == name) return info;
      if (info.alias) for (var j = 0; j < info.alias.length; j++)
        if (info.alias[j].toLowerCase() == name) return info;
    }
  };
});
codemirror/mode/vbscript/vbscript.js000064400000032741151215013510013664 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

/*
For extra ASP classic objects, initialize CodeMirror instance with this option:
    isASP: true

E.G.:
    var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        lineNumbers: true,
        isASP: true
      });
*/

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("vbscript", function(conf, parserConf) {
    var ERRORCLASS = 'error';

    function wordRegexp(words) {
        return new RegExp("^((" + words.join(")|(") + "))\\b", "i");
    }

    var singleOperators = new RegExp("^[\\+\\-\\*/&\\\\\\^<>=]");
    var doubleOperators = new RegExp("^((<>)|(<=)|(>=))");
    var singleDelimiters = new RegExp('^[\\.,]');
    var brakets = new RegExp('^[\\(\\)]');
    var identifiers = new RegExp("^[A-Za-z][_A-Za-z0-9]*");

    var openingKeywords = ['class','sub','select','while','if','function', 'property', 'with', 'for'];
    var middleKeywords = ['else','elseif','case'];
    var endKeywords = ['next','loop','wend'];

    var wordOperators = wordRegexp(['and', 'or', 'not', 'xor', 'is', 'mod', 'eqv', 'imp']);
    var commonkeywords = ['dim', 'redim', 'then',  'until', 'randomize',
                          'byval','byref','new','property', 'exit', 'in',
                          'const','private', 'public',
                          'get','set','let', 'stop', 'on error resume next', 'on error goto 0', 'option explicit', 'call', 'me'];

    //This list was from: http://msdn.microsoft.com/en-us/library/f8tbc79x(v=vs.84).aspx
    var atomWords = ['true', 'false', 'nothing', 'empty', 'null'];
    //This list was from: http://msdn.microsoft.com/en-us/library/3ca8tfek(v=vs.84).aspx
    var builtinFuncsWords = ['abs', 'array', 'asc', 'atn', 'cbool', 'cbyte', 'ccur', 'cdate', 'cdbl', 'chr', 'cint', 'clng', 'cos', 'csng', 'cstr', 'date', 'dateadd', 'datediff', 'datepart',
                        'dateserial', 'datevalue', 'day', 'escape', 'eval', 'execute', 'exp', 'filter', 'formatcurrency', 'formatdatetime', 'formatnumber', 'formatpercent', 'getlocale', 'getobject',
                        'getref', 'hex', 'hour', 'inputbox', 'instr', 'instrrev', 'int', 'fix', 'isarray', 'isdate', 'isempty', 'isnull', 'isnumeric', 'isobject', 'join', 'lbound', 'lcase', 'left',
                        'len', 'loadpicture', 'log', 'ltrim', 'rtrim', 'trim', 'maths', 'mid', 'minute', 'month', 'monthname', 'msgbox', 'now', 'oct', 'replace', 'rgb', 'right', 'rnd', 'round',
                        'scriptengine', 'scriptenginebuildversion', 'scriptenginemajorversion', 'scriptengineminorversion', 'second', 'setlocale', 'sgn', 'sin', 'space', 'split', 'sqr', 'strcomp',
                        'string', 'strreverse', 'tan', 'time', 'timer', 'timeserial', 'timevalue', 'typename', 'ubound', 'ucase', 'unescape', 'vartype', 'weekday', 'weekdayname', 'year'];

    //This list was from: http://msdn.microsoft.com/en-us/library/ydz4cfk3(v=vs.84).aspx
    var builtinConsts = ['vbBlack', 'vbRed', 'vbGreen', 'vbYellow', 'vbBlue', 'vbMagenta', 'vbCyan', 'vbWhite', 'vbBinaryCompare', 'vbTextCompare',
                         'vbSunday', 'vbMonday', 'vbTuesday', 'vbWednesday', 'vbThursday', 'vbFriday', 'vbSaturday', 'vbUseSystemDayOfWeek', 'vbFirstJan1', 'vbFirstFourDays', 'vbFirstFullWeek',
                         'vbGeneralDate', 'vbLongDate', 'vbShortDate', 'vbLongTime', 'vbShortTime', 'vbObjectError',
                         'vbOKOnly', 'vbOKCancel', 'vbAbortRetryIgnore', 'vbYesNoCancel', 'vbYesNo', 'vbRetryCancel', 'vbCritical', 'vbQuestion', 'vbExclamation', 'vbInformation', 'vbDefaultButton1', 'vbDefaultButton2',
                         'vbDefaultButton3', 'vbDefaultButton4', 'vbApplicationModal', 'vbSystemModal', 'vbOK', 'vbCancel', 'vbAbort', 'vbRetry', 'vbIgnore', 'vbYes', 'vbNo',
                         'vbCr', 'VbCrLf', 'vbFormFeed', 'vbLf', 'vbNewLine', 'vbNullChar', 'vbNullString', 'vbTab', 'vbVerticalTab', 'vbUseDefault', 'vbTrue', 'vbFalse',
                         'vbEmpty', 'vbNull', 'vbInteger', 'vbLong', 'vbSingle', 'vbDouble', 'vbCurrency', 'vbDate', 'vbString', 'vbObject', 'vbError', 'vbBoolean', 'vbVariant', 'vbDataObject', 'vbDecimal', 'vbByte', 'vbArray'];
    //This list was from: http://msdn.microsoft.com/en-us/library/hkc375ea(v=vs.84).aspx
    var builtinObjsWords = ['WScript', 'err', 'debug', 'RegExp'];
    var knownProperties = ['description', 'firstindex', 'global', 'helpcontext', 'helpfile', 'ignorecase', 'length', 'number', 'pattern', 'source', 'value', 'count'];
    var knownMethods = ['clear', 'execute', 'raise', 'replace', 'test', 'write', 'writeline', 'close', 'open', 'state', 'eof', 'update', 'addnew', 'end', 'createobject', 'quit'];

    var aspBuiltinObjsWords = ['server', 'response', 'request', 'session', 'application'];
    var aspKnownProperties = ['buffer', 'cachecontrol', 'charset', 'contenttype', 'expires', 'expiresabsolute', 'isclientconnected', 'pics', 'status', //response
                              'clientcertificate', 'cookies', 'form', 'querystring', 'servervariables', 'totalbytes', //request
                              'contents', 'staticobjects', //application
                              'codepage', 'lcid', 'sessionid', 'timeout', //session
                              'scripttimeout']; //server
    var aspKnownMethods = ['addheader', 'appendtolog', 'binarywrite', 'end', 'flush', 'redirect', //response
                           'binaryread', //request
                           'remove', 'removeall', 'lock', 'unlock', //application
                           'abandon', //session
                           'getlasterror', 'htmlencode', 'mappath', 'transfer', 'urlencode']; //server

    var knownWords = knownMethods.concat(knownProperties);

    builtinObjsWords = builtinObjsWords.concat(builtinConsts);

    if (conf.isASP){
        builtinObjsWords = builtinObjsWords.concat(aspBuiltinObjsWords);
        knownWords = knownWords.concat(aspKnownMethods, aspKnownProperties);
    };

    var keywords = wordRegexp(commonkeywords);
    var atoms = wordRegexp(atomWords);
    var builtinFuncs = wordRegexp(builtinFuncsWords);
    var builtinObjs = wordRegexp(builtinObjsWords);
    var known = wordRegexp(knownWords);
    var stringPrefixes = '"';

    var opening = wordRegexp(openingKeywords);
    var middle = wordRegexp(middleKeywords);
    var closing = wordRegexp(endKeywords);
    var doubleClosing = wordRegexp(['end']);
    var doOpening = wordRegexp(['do']);
    var noIndentWords = wordRegexp(['on error resume next', 'exit']);
    var comment = wordRegexp(['rem']);


    function indent(_stream, state) {
      state.currentIndent++;
    }

    function dedent(_stream, state) {
      state.currentIndent--;
    }
    // tokenizers
    function tokenBase(stream, state) {
        if (stream.eatSpace()) {
            return 'space';
            //return null;
        }

        var ch = stream.peek();

        // Handle Comments
        if (ch === "'") {
            stream.skipToEnd();
            return 'comment';
        }
        if (stream.match(comment)){
            stream.skipToEnd();
            return 'comment';
        }


        // Handle Number Literals
        if (stream.match(/^((&H)|(&O))?[0-9\.]/i, false) && !stream.match(/^((&H)|(&O))?[0-9\.]+[a-z_]/i, false)) {
            var floatLiteral = false;
            // Floats
            if (stream.match(/^\d*\.\d+/i)) { floatLiteral = true; }
            else if (stream.match(/^\d+\.\d*/)) { floatLiteral = true; }
            else if (stream.match(/^\.\d+/)) { floatLiteral = true; }

            if (floatLiteral) {
                // Float literals may be "imaginary"
                stream.eat(/J/i);
                return 'number';
            }
            // Integers
            var intLiteral = false;
            // Hex
            if (stream.match(/^&H[0-9a-f]+/i)) { intLiteral = true; }
            // Octal
            else if (stream.match(/^&O[0-7]+/i)) { intLiteral = true; }
            // Decimal
            else if (stream.match(/^[1-9]\d*F?/)) {
                // Decimal literals may be "imaginary"
                stream.eat(/J/i);
                // TODO - Can you have imaginary longs?
                intLiteral = true;
            }
            // Zero by itself with no other piece of number.
            else if (stream.match(/^0(?![\dx])/i)) { intLiteral = true; }
            if (intLiteral) {
                // Integer literals may be "long"
                stream.eat(/L/i);
                return 'number';
            }
        }

        // Handle Strings
        if (stream.match(stringPrefixes)) {
            state.tokenize = tokenStringFactory(stream.current());
            return state.tokenize(stream, state);
        }

        // Handle operators and Delimiters
        if (stream.match(doubleOperators)
            || stream.match(singleOperators)
            || stream.match(wordOperators)) {
            return 'operator';
        }
        if (stream.match(singleDelimiters)) {
            return null;
        }

        if (stream.match(brakets)) {
            return "bracket";
        }

        if (stream.match(noIndentWords)) {
            state.doInCurrentLine = true;

            return 'keyword';
        }

        if (stream.match(doOpening)) {
            indent(stream,state);
            state.doInCurrentLine = true;

            return 'keyword';
        }
        if (stream.match(opening)) {
            if (! state.doInCurrentLine)
              indent(stream,state);
            else
              state.doInCurrentLine = false;

            return 'keyword';
        }
        if (stream.match(middle)) {
            return 'keyword';
        }


        if (stream.match(doubleClosing)) {
            dedent(stream,state);
            dedent(stream,state);

            return 'keyword';
        }
        if (stream.match(closing)) {
            if (! state.doInCurrentLine)
              dedent(stream,state);
            else
              state.doInCurrentLine = false;

            return 'keyword';
        }

        if (stream.match(keywords)) {
            return 'keyword';
        }

        if (stream.match(atoms)) {
            return 'atom';
        }

        if (stream.match(known)) {
            return 'variable-2';
        }

        if (stream.match(builtinFuncs)) {
            return 'builtin';
        }

        if (stream.match(builtinObjs)){
            return 'variable-2';
        }

        if (stream.match(identifiers)) {
            return 'variable';
        }

        // Handle non-detected items
        stream.next();
        return ERRORCLASS;
    }

    function tokenStringFactory(delimiter) {
        var singleline = delimiter.length == 1;
        var OUTCLASS = 'string';

        return function(stream, state) {
            while (!stream.eol()) {
                stream.eatWhile(/[^'"]/);
                if (stream.match(delimiter)) {
                    state.tokenize = tokenBase;
                    return OUTCLASS;
                } else {
                    stream.eat(/['"]/);
                }
            }
            if (singleline) {
                if (parserConf.singleLineStringErrors) {
                    return ERRORCLASS;
                } else {
                    state.tokenize = tokenBase;
                }
            }
            return OUTCLASS;
        };
    }


    function tokenLexer(stream, state) {
        var style = state.tokenize(stream, state);
        var current = stream.current();

        // Handle '.' connected identifiers
        if (current === '.') {
            style = state.tokenize(stream, state);

            current = stream.current();
            if (style && (style.substr(0, 8) === 'variable' || style==='builtin' || style==='keyword')){//|| knownWords.indexOf(current.substring(1)) > -1) {
                if (style === 'builtin' || style === 'keyword') style='variable';
                if (knownWords.indexOf(current.substr(1)) > -1) style='variable-2';

                return style;
            } else {
                return ERRORCLASS;
            }
        }

        return style;
    }

    var external = {
        electricChars:"dDpPtTfFeE ",
        startState: function() {
            return {
              tokenize: tokenBase,
              lastToken: null,
              currentIndent: 0,
              nextLineIndent: 0,
              doInCurrentLine: false,
              ignoreKeyword: false


          };
        },

        token: function(stream, state) {
            if (stream.sol()) {
              state.currentIndent += state.nextLineIndent;
              state.nextLineIndent = 0;
              state.doInCurrentLine = 0;
            }
            var style = tokenLexer(stream, state);

            state.lastToken = {style:style, content: stream.current()};

            if (style==='space') style=null;

            return style;
        },

        indent: function(state, textAfter) {
            var trueText = textAfter.replace(/^\s+|\s+$/g, '') ;
            if (trueText.match(closing) || trueText.match(doubleClosing) || trueText.match(middle)) return conf.indentUnit*(state.currentIndent-1);
            if(state.currentIndent < 0) return 0;
            return state.currentIndent * conf.indentUnit;
        }

    };
    return external;
});

CodeMirror.defineMIME("text/vbscript", "vbscript");

});
codemirror/mode/vbscript/index.html000064400000002755151215013510013471 0ustar00<!doctype html>

<title>CodeMirror: VBScript mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="vbscript.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">VBScript</a>
  </ul>
</div>

<article>
<h2>VBScript mode</h2>


<div><textarea id="code" name="code">
' Pete Guhl
' 03-04-2012
'
' Basic VBScript support for codemirror2

Const ForReading = 1, ForWriting = 2, ForAppending = 8

Call Sub020_PostBroadcastToUrbanAirship(strUserName, strPassword, intTransmitID, strResponse)

If Not IsNull(strResponse) AND Len(strResponse) = 0 Then
	boolTransmitOkYN = False
Else
	' WScript.Echo "Oh Happy Day! Oh Happy DAY!"
	boolTransmitOkYN = True
End If
</textarea></div>

    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        lineNumbers: true,
        indentUnit: 4
      });
    </script>

    <p><strong>MIME types defined:</strong> <code>text/vbscript</code>.</p>
  </article>
codemirror/mode/htmlembedded/index.html000064400000004046151215013510014246 0ustar00<!doctype html>

<title>CodeMirror: Html Embedded Scripts mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../xml/xml.js"></script>
<script src="../javascript/javascript.js"></script>
<script src="../css/css.js"></script>
<script src="../htmlmixed/htmlmixed.js"></script>
<script src="../../addon/mode/multiplex.js"></script>
<script src="htmlembedded.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Html Embedded Scripts</a>
  </ul>
</div>

<article>
<h2>Html Embedded Scripts mode</h2>
<form><textarea id="code" name="code">
<%
function hello(who) {
	return "Hello " + who;
}
%>
This is an example of EJS (embedded javascript)
<p>The program says <%= hello("world") %>.</p>
<script>
	alert("And here is some normal JS code"); // also colored
</script>
</textarea></form>

    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        lineNumbers: true,
        mode: "application/x-ejs",
        indentUnit: 4,
        indentWithTabs: true
      });
    </script>

    <p>Mode for html embedded scripts like JSP and ASP.NET. Depends on multiplex and HtmlMixed which in turn depends on
    JavaScript, CSS and XML.<br />Other dependencies include those of the scripting language chosen.</p>

    <p><strong>MIME types defined:</strong> <code>application/x-aspx</code> (ASP.NET),
    <code>application/x-ejs</code> (Embedded Javascript), <code>application/x-jsp</code> (JavaServer Pages)
    and <code>application/x-erb</code></p>
  </article>
codemirror/mode/htmlembedded/htmlembedded.js000064400000002611151215013510015221 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"),
        require("../../addon/mode/multiplex"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror", "../htmlmixed/htmlmixed",
            "../../addon/mode/multiplex"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  CodeMirror.defineMode("htmlembedded", function(config, parserConfig) {
    return CodeMirror.multiplexingMode(CodeMirror.getMode(config, "htmlmixed"), {
      open: parserConfig.open || parserConfig.scriptStartRegex || "<%",
      close: parserConfig.close || parserConfig.scriptEndRegex || "%>",
      mode: CodeMirror.getMode(config, parserConfig.scriptingModeSpec)
    });
  }, "htmlmixed");

  CodeMirror.defineMIME("application/x-ejs", {name: "htmlembedded", scriptingModeSpec:"javascript"});
  CodeMirror.defineMIME("application/x-aspx", {name: "htmlembedded", scriptingModeSpec:"text/x-csharp"});
  CodeMirror.defineMIME("application/x-jsp", {name: "htmlembedded", scriptingModeSpec:"text/x-java"});
  CodeMirror.defineMIME("application/x-erb", {name: "htmlembedded", scriptingModeSpec:"ruby"});
});
codemirror/mode/properties/properties.js000064400000004173151215013510014562 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("properties", function() {
  return {
    token: function(stream, state) {
      var sol = stream.sol() || state.afterSection;
      var eol = stream.eol();

      state.afterSection = false;

      if (sol) {
        if (state.nextMultiline) {
          state.inMultiline = true;
          state.nextMultiline = false;
        } else {
          state.position = "def";
        }
      }

      if (eol && ! state.nextMultiline) {
        state.inMultiline = false;
        state.position = "def";
      }

      if (sol) {
        while(stream.eatSpace()) {}
      }

      var ch = stream.next();

      if (sol && (ch === "#" || ch === "!" || ch === ";")) {
        state.position = "comment";
        stream.skipToEnd();
        return "comment";
      } else if (sol && ch === "[") {
        state.afterSection = true;
        stream.skipTo("]"); stream.eat("]");
        return "header";
      } else if (ch === "=" || ch === ":") {
        state.position = "quote";
        return null;
      } else if (ch === "\\" && state.position === "quote") {
        if (stream.eol()) {  // end of line?
          // Multiline value
          state.nextMultiline = true;
        }
      }

      return state.position;
    },

    startState: function() {
      return {
        position : "def",       // Current position, "def", "quote" or "comment"
        nextMultiline : false,  // Is the next line multiline value
        inMultiline : false,    // Is the current line a multiline value
        afterSection : false    // Did we just open a section
      };
    }

  };
});

CodeMirror.defineMIME("text/x-properties", "properties");
CodeMirror.defineMIME("text/x-ini", "properties");

});
codemirror/mode/properties/index.html000064400000003023151215013510014016 0ustar00<!doctype html>

<title>CodeMirror: Properties files mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="properties.js"></script>
<style>.CodeMirror {border-top: 1px solid #ddd; border-bottom: 1px solid #ddd;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Properties files</a>
  </ul>
</div>

<article>
<h2>Properties files mode</h2>
<form><textarea id="code" name="code">
# This is a properties file
a.key = A value
another.key = http://example.com
! Exclamation mark as comment
but.not=Within ! A value # indeed
   # Spaces at the beginning of a line
   spaces.before.key=value
backslash=Used for multi\
          line entries,\
          that's convenient.
# Unicode sequences
unicode.key=This is \u0020 Unicode
no.multiline=here
# Colons
colons : can be used too
# Spaces
spaces\ in\ keys=Not very common...
</textarea></form>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {});
    </script>

    <p><strong>MIME types defined:</strong> <code>text/x-properties</code>,
    <code>text/x-ini</code>.</p>

  </article>
codemirror/mode/yaml-frontmatter/yaml-frontmatter.js000064400000004364151215013510017006 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function (mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"), require("../yaml/yaml"))
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror", "../yaml/yaml"], mod)
  else // Plain browser env
    mod(CodeMirror)
})(function (CodeMirror) {

  var START = 0, FRONTMATTER = 1, BODY = 2

  // a mixed mode for Markdown text with an optional YAML front matter
  CodeMirror.defineMode("yaml-frontmatter", function (config, parserConfig) {
    var yamlMode = CodeMirror.getMode(config, "yaml")
    var innerMode = CodeMirror.getMode(config, parserConfig && parserConfig.base || "gfm")

    function curMode(state) {
      return state.state == BODY ? innerMode : yamlMode
    }

    return {
      startState: function () {
        return {
          state: START,
          inner: CodeMirror.startState(yamlMode)
        }
      },
      copyState: function (state) {
        return {
          state: state.state,
          inner: CodeMirror.copyState(curMode(state), state.inner)
        }
      },
      token: function (stream, state) {
        if (state.state == START) {
          if (stream.match(/---/, false)) {
            state.state = FRONTMATTER
            return yamlMode.token(stream, state.inner)
          } else {
            state.state = BODY
            state.inner = CodeMirror.startState(innerMode)
            return innerMode.token(stream, state.inner)
          }
        } else if (state.state == FRONTMATTER) {
          var end = stream.sol() && stream.match(/---/, false)
          var style = yamlMode.token(stream, state.inner)
          if (end) {
            state.state = BODY
            state.inner = CodeMirror.startState(innerMode)
          }
          return style
        } else {
          return innerMode.token(stream, state.inner)
        }
      },
      innerMode: function (state) {
        return {mode: curMode(state), state: state.inner}
      },
      blankLine: function (state) {
        var mode = curMode(state)
        if (mode.blankLine) return mode.blankLine(state.inner)
      }
    }
  })
});
codemirror/mode/yaml-frontmatter/index.html000064400000006000151215013510015125 0ustar00<!doctype html>

<title>CodeMirror: YAML front matter mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/mode/overlay.js"></script>
<script src="../markdown/markdown.js"></script>
<script src="../gfm/gfm.js"></script>
<script src="../yaml/yaml.js"></script>
<script src="yaml-frontmatter.js"></script>
<style>.CodeMirror { border-top: 1px solid #ddd; border-bottom: 1px solid #ddd; }</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">YAML-Frontmatter</a>
  </ul>
</div>

<article>
<h2>YAML front matter mode</h2>
<form><textarea id="code" name="code">
---
receipt:     Oz-Ware Purchase Invoice
date:        2007-08-06
customer:
    given:   Dorothy
    family:  Gale

items:
    - part_no:   A4786
      descrip:   Water Bucket (Filled)
      price:     1.47
      quantity:  4

    - part_no:   E1628
      descrip:   High Heeled "Ruby" Slippers
      size:       8
      price:     100.27
      quantity:  1

bill-to:  &id001
    street: |
            123 Tornado Alley
            Suite 16
    city:   East Centerville
    state:  KS

ship-to:  *id001

specialDelivery:  >
    Follow the Yellow Brick
    Road to the Emerald City.
    Pay no attention to the
    man behind the curtain.
---

GitHub Flavored Markdown
========================

Everything from markdown plus GFM features:

## URL autolinking

Underscores_are_allowed_between_words.

## Strikethrough text

GFM adds syntax to strikethrough text, which is missing from standard Markdown.

~~Mistaken text.~~
~~**works with other formatting**~~

~~spans across
lines~~

## Fenced code blocks (and syntax highlighting)

```javascript
for (var i = 0; i &lt; items.length; i++) {
    console.log(items[i], i); // log them
}
```

## Task Lists

- [ ] Incomplete task list item
- [x] **Completed** task list item

## A bit of GitHub spice

* SHA: be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2
* User@SHA ref: mojombo@be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2
* User/Project@SHA: mojombo/god@be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2
* \#Num: #1
* User/#Num: mojombo#1
* User/Project#Num: mojombo/god#1

See http://github.github.com/github-flavored-markdown/.
</textarea></form>

<p>Defines a mode that parses
a <a href="http://jekyllrb.com/docs/frontmatter/">YAML frontmatter</a>
at the start of a file, switching to a base mode at the end of that.
Takes a mode configuration option <code>base</code> to configure the
base mode, which defaults to <code>"gfm"</code>.</p>

    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {mode: "yaml-frontmatter"});
    </script>

  </article>
codemirror/mode/troff/index.html000064400000010561151215013510012747 0ustar00<!doctype html>

<title>CodeMirror: troff mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel=stylesheet href=../../lib/codemirror.css>
<script src=../../lib/codemirror.js></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src=troff.js></script>
<style type=text/css>
  .CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}
</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">troff</a>
  </ul>
</div>

<article>
<h2>troff</h2>


<textarea id=code>
'\" t
.\"     Title: mkvextract
.TH "MKVEXTRACT" "1" "2015\-02\-28" "MKVToolNix 7\&.7\&.0" "User Commands"
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.ie \n(.g .ds Aq \(aq
.el       .ds Aq '
.\" -----------------------------------------------------------------
.nh
.\" disable justification (adjust text to left margin only)
.ad l
.\" -----------------------------------------------------------------
.SH "NAME"
mkvextract \- extract tracks from Matroska(TM) files into other files
.SH "SYNOPSIS"
.HP \w'\fBmkvextract\fR\ 'u
\fBmkvextract\fR {mode} {source\-filename} [options] [extraction\-spec]
.SH "DESCRIPTION"
.PP
.B mkvextract
extracts specific parts from a
.I Matroska(TM)
file to other useful formats\&. The first argument,
\fBmode\fR, tells
\fBmkvextract\fR(1)
what to extract\&. Currently supported is the extraction of
tracks,
tags,
attachments,
chapters,
CUE sheets,
timecodes
and
cues\&. The second argument is the name of the source file\&. It must be a
Matroska(TM)
file\&. All following arguments are options and extraction specifications; both of which depend on the selected mode\&.
.SS "Common options"
.PP
The following options are available in all modes and only described once in this section\&.
.PP
\fB\-f\fR, \fB\-\-parse\-fully\fR
.RS 4
Sets the parse mode to \*(Aqfull\*(Aq\&. The default mode does not parse the whole file but uses the meta seek elements for locating the required elements of a source file\&. In 99% of all cases this is enough\&. But for files that do not contain meta seek elements or which are damaged the user might have to use this mode\&. A full scan of a file can take a couple of minutes while a fast scan only takes seconds\&.
.RE
.PP
\fB\-\-command\-line\-charset\fR \fIcharacter\-set\fR
.RS 4
Sets the character set to convert strings given on the command line from\&. It defaults to the character set given by system\*(Aqs current locale\&.
.RE
.PP
\fB\-\-output\-charset\fR \fIcharacter\-set\fR
.RS 4
Sets the character set to which strings are converted that are to be output\&. It defaults to the character set given by system\*(Aqs current locale\&.
.RE
.PP
\fB\-r\fR, \fB\-\-redirect\-output\fR \fIfile\-name\fR
.RS 4
Writes all messages to the file
\fIfile\-name\fR
instead of to the console\&. While this can be done easily with output redirection there are cases in which this option is needed: when the terminal reinterprets the output before writing it to a file\&. The character set set with
\fB\-\-output\-charset\fR
is honored\&.
.RE
.PP
\fB\-\-ui\-language\fR \fIcode\fR
.RS 4
Forces the translations for the language
\fIcode\fR
to be used (e\&.g\&. \*(Aqde_DE\*(Aq for the German translations)\&. It is preferable to use the environment variables
\fILANG\fR,
\fILC_MESSAGES\fR
and
\fILC_ALL\fR
though\&. Entering \*(Aqlist\*(Aq as the
\fIcode\fR
will cause
\fBmkvextract\fR(1)
to output a list of available translations\&.

.\" [...]

.SH "SEE ALSO"
.PP
\fBmkvmerge\fR(1),
\fBmkvinfo\fR(1),
\fBmkvpropedit\fR(1),
\fBmmg\fR(1)
.SH "WWW"
.PP
The latest version can always be found at
\m[blue]\fBthe MKVToolNix homepage\fR\m[]\&\s-2\u[1]\d\s+2\&.
.SH "AUTHOR"
.PP
\(co \fBMoritz Bunkus\fR <\&moritz@bunkus\&.org\&>
.RS 4
Developer
.RE
.SH "NOTES"
.IP " 1." 4
the MKVToolNix homepage
.RS 4
\%https://www.bunkus.org/videotools/mkvtoolnix/
.RE
</textarea>

<script>
  var editor = CodeMirror.fromTextArea(document.getElementById('code'), {
    mode: 'troff',
    lineNumbers: true,
    matchBrackets: false
  });
</script>

<p><strong>MIME types defined:</strong> <code>troff</code>.</p>
</article>
codemirror/mode/troff/troff.js000064400000004530151215013510012427 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object")
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd)
    define(["../../lib/codemirror"], mod);
  else
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode('troff', function() {

  var words = {};

  function tokenBase(stream) {
    if (stream.eatSpace()) return null;

    var sol = stream.sol();
    var ch = stream.next();

    if (ch === '\\') {
      if (stream.match('fB') || stream.match('fR') || stream.match('fI') ||
          stream.match('u')  || stream.match('d')  ||
          stream.match('%')  || stream.match('&')) {
        return 'string';
      }
      if (stream.match('m[')) {
        stream.skipTo(']');
        stream.next();
        return 'string';
      }
      if (stream.match('s+') || stream.match('s-')) {
        stream.eatWhile(/[\d-]/);
        return 'string';
      }
      if (stream.match('\(') || stream.match('*\(')) {
        stream.eatWhile(/[\w-]/);
        return 'string';
      }
      return 'string';
    }
    if (sol && (ch === '.' || ch === '\'')) {
      if (stream.eat('\\') && stream.eat('\"')) {
        stream.skipToEnd();
        return 'comment';
      }
    }
    if (sol && ch === '.') {
      if (stream.match('B ') || stream.match('I ') || stream.match('R ')) {
        return 'attribute';
      }
      if (stream.match('TH ') || stream.match('SH ') || stream.match('SS ') || stream.match('HP ')) {
        stream.skipToEnd();
        return 'quote';
      }
      if ((stream.match(/[A-Z]/) && stream.match(/[A-Z]/)) || (stream.match(/[a-z]/) && stream.match(/[a-z]/))) {
        return 'attribute';
      }
    }
    stream.eatWhile(/[\w-]/);
    var cur = stream.current();
    return words.hasOwnProperty(cur) ? words[cur] : null;
  }

  function tokenize(stream, state) {
    return (state.tokens[0] || tokenBase) (stream, state);
  };

  return {
    startState: function() {return {tokens:[]};},
    token: function(stream, state) {
      return tokenize(stream, state);
    }
  };
});

CodeMirror.defineMIME('text/troff', 'troff');
CodeMirror.defineMIME('text/x-troff', 'troff');
CodeMirror.defineMIME('application/x-troff', 'troff');

});
codemirror/mode/ttcn/ttcn.js000064400000023653151215013510012116 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  CodeMirror.defineMode("ttcn", function(config, parserConfig) {
    var indentUnit = config.indentUnit,
        keywords = parserConfig.keywords || {},
        builtin = parserConfig.builtin || {},
        timerOps = parserConfig.timerOps || {},
        portOps  = parserConfig.portOps || {},
        configOps = parserConfig.configOps || {},
        verdictOps = parserConfig.verdictOps || {},
        sutOps = parserConfig.sutOps || {},
        functionOps = parserConfig.functionOps || {},

        verdictConsts = parserConfig.verdictConsts || {},
        booleanConsts = parserConfig.booleanConsts || {},
        otherConsts   = parserConfig.otherConsts || {},

        types = parserConfig.types || {},
        visibilityModifiers = parserConfig.visibilityModifiers || {},
        templateMatch = parserConfig.templateMatch || {},
        multiLineStrings = parserConfig.multiLineStrings,
        indentStatements = parserConfig.indentStatements !== false;
    var isOperatorChar = /[+\-*&@=<>!\/]/;
    var curPunc;

    function tokenBase(stream, state) {
      var ch = stream.next();

      if (ch == '"' || ch == "'") {
        state.tokenize = tokenString(ch);
        return state.tokenize(stream, state);
      }
      if (/[\[\]{}\(\),;\\:\?\.]/.test(ch)) {
        curPunc = ch;
        return "punctuation";
      }
      if (ch == "#"){
        stream.skipToEnd();
        return "atom preprocessor";
      }
      if (ch == "%"){
        stream.eatWhile(/\b/);
        return "atom ttcn3Macros";
      }
      if (/\d/.test(ch)) {
        stream.eatWhile(/[\w\.]/);
        return "number";
      }
      if (ch == "/") {
        if (stream.eat("*")) {
          state.tokenize = tokenComment;
          return tokenComment(stream, state);
        }
        if (stream.eat("/")) {
          stream.skipToEnd();
          return "comment";
        }
      }
      if (isOperatorChar.test(ch)) {
        if(ch == "@"){
          if(stream.match("try") || stream.match("catch")
              || stream.match("lazy")){
            return "keyword";
          }
        }
        stream.eatWhile(isOperatorChar);
        return "operator";
      }
      stream.eatWhile(/[\w\$_\xa1-\uffff]/);
      var cur = stream.current();

      if (keywords.propertyIsEnumerable(cur)) return "keyword";
      if (builtin.propertyIsEnumerable(cur)) return "builtin";

      if (timerOps.propertyIsEnumerable(cur)) return "def timerOps";
      if (configOps.propertyIsEnumerable(cur)) return "def configOps";
      if (verdictOps.propertyIsEnumerable(cur)) return "def verdictOps";
      if (portOps.propertyIsEnumerable(cur)) return "def portOps";
      if (sutOps.propertyIsEnumerable(cur)) return "def sutOps";
      if (functionOps.propertyIsEnumerable(cur)) return "def functionOps";

      if (verdictConsts.propertyIsEnumerable(cur)) return "string verdictConsts";
      if (booleanConsts.propertyIsEnumerable(cur)) return "string booleanConsts";
      if (otherConsts.propertyIsEnumerable(cur)) return "string otherConsts";

      if (types.propertyIsEnumerable(cur)) return "builtin types";
      if (visibilityModifiers.propertyIsEnumerable(cur))
        return "builtin visibilityModifiers";
      if (templateMatch.propertyIsEnumerable(cur)) return "atom templateMatch";

      return "variable";
    }

    function tokenString(quote) {
      return function(stream, state) {
        var escaped = false, next, end = false;
        while ((next = stream.next()) != null) {
          if (next == quote && !escaped){
            var afterQuote = stream.peek();
            //look if the character after the quote is like the B in '10100010'B
            if (afterQuote){
              afterQuote = afterQuote.toLowerCase();
              if(afterQuote == "b" || afterQuote == "h" || afterQuote == "o")
                stream.next();
            }
            end = true; break;
          }
          escaped = !escaped && next == "\\";
        }
        if (end || !(escaped || multiLineStrings))
          state.tokenize = null;
        return "string";
      };
    }

    function tokenComment(stream, state) {
      var maybeEnd = false, ch;
      while (ch = stream.next()) {
        if (ch == "/" && maybeEnd) {
          state.tokenize = null;
          break;
        }
        maybeEnd = (ch == "*");
      }
      return "comment";
    }

    function Context(indented, column, type, align, prev) {
      this.indented = indented;
      this.column = column;
      this.type = type;
      this.align = align;
      this.prev = prev;
    }

    function pushContext(state, col, type) {
      var indent = state.indented;
      if (state.context && state.context.type == "statement")
        indent = state.context.indented;
      return state.context = new Context(indent, col, type, null, state.context);
    }

    function popContext(state) {
      var t = state.context.type;
      if (t == ")" || t == "]" || t == "}")
        state.indented = state.context.indented;
      return state.context = state.context.prev;
    }

    //Interface
    return {
      startState: function(basecolumn) {
        return {
          tokenize: null,
          context: new Context((basecolumn || 0) - indentUnit, 0, "top", false),
          indented: 0,
          startOfLine: true
        };
      },

      token: function(stream, state) {
        var ctx = state.context;
        if (stream.sol()) {
          if (ctx.align == null) ctx.align = false;
          state.indented = stream.indentation();
          state.startOfLine = true;
        }
        if (stream.eatSpace()) return null;
        curPunc = null;
        var style = (state.tokenize || tokenBase)(stream, state);
        if (style == "comment") return style;
        if (ctx.align == null) ctx.align = true;

        if ((curPunc == ";" || curPunc == ":" || curPunc == ",")
            && ctx.type == "statement"){
          popContext(state);
        }
        else if (curPunc == "{") pushContext(state, stream.column(), "}");
        else if (curPunc == "[") pushContext(state, stream.column(), "]");
        else if (curPunc == "(") pushContext(state, stream.column(), ")");
        else if (curPunc == "}") {
          while (ctx.type == "statement") ctx = popContext(state);
          if (ctx.type == "}") ctx = popContext(state);
          while (ctx.type == "statement") ctx = popContext(state);
        }
        else if (curPunc == ctx.type) popContext(state);
        else if (indentStatements &&
            (((ctx.type == "}" || ctx.type == "top") && curPunc != ';') ||
            (ctx.type == "statement" && curPunc == "newstatement")))
          pushContext(state, stream.column(), "statement");

        state.startOfLine = false;

        return style;
      },

      electricChars: "{}",
      blockCommentStart: "/*",
      blockCommentEnd: "*/",
      lineComment: "//",
      fold: "brace"
    };
  });

  function words(str) {
    var obj = {}, words = str.split(" ");
    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
    return obj;
  }

  function def(mimes, mode) {
    if (typeof mimes == "string") mimes = [mimes];
    var words = [];
    function add(obj) {
      if (obj) for (var prop in obj) if (obj.hasOwnProperty(prop))
        words.push(prop);
    }

    add(mode.keywords);
    add(mode.builtin);
    add(mode.timerOps);
    add(mode.portOps);

    if (words.length) {
      mode.helperType = mimes[0];
      CodeMirror.registerHelper("hintWords", mimes[0], words);
    }

    for (var i = 0; i < mimes.length; ++i)
      CodeMirror.defineMIME(mimes[i], mode);
  }

  def(["text/x-ttcn", "text/x-ttcn3", "text/x-ttcnpp"], {
    name: "ttcn",
    keywords: words("activate address alive all alt altstep and and4b any" +
    " break case component const continue control deactivate" +
    " display do else encode enumerated except exception" +
    " execute extends extension external for from function" +
    " goto group if import in infinity inout interleave" +
    " label language length log match message mixed mod" +
    " modifies module modulepar mtc noblock not not4b nowait" +
    " of on optional or or4b out override param pattern port" +
    " procedure record recursive rem repeat return runs select" +
    " self sender set signature system template testcase to" +
    " type union value valueof var variant while with xor xor4b"),
    builtin: words("bit2hex bit2int bit2oct bit2str char2int char2oct encvalue" +
    " decomp decvalue float2int float2str hex2bit hex2int" +
    " hex2oct hex2str int2bit int2char int2float int2hex" +
    " int2oct int2str int2unichar isbound ischosen ispresent" +
    " isvalue lengthof log2str oct2bit oct2char oct2hex oct2int" +
    " oct2str regexp replace rnd sizeof str2bit str2float" +
    " str2hex str2int str2oct substr unichar2int unichar2char" +
    " enum2int"),
    types: words("anytype bitstring boolean char charstring default float" +
    " hexstring integer objid octetstring universal verdicttype timer"),
    timerOps: words("read running start stop timeout"),
    portOps: words("call catch check clear getcall getreply halt raise receive" +
    " reply send trigger"),
    configOps: words("create connect disconnect done kill killed map unmap"),
    verdictOps: words("getverdict setverdict"),
    sutOps: words("action"),
    functionOps: words("apply derefers refers"),

    verdictConsts: words("error fail inconc none pass"),
    booleanConsts: words("true false"),
    otherConsts: words("null NULL omit"),

    visibilityModifiers: words("private public friend"),
    templateMatch: words("complement ifpresent subset superset permutation"),
    multiLineStrings: true
  });
});
codemirror/mode/ttcn/index.html000064400000006642151215013510012604 0ustar00<!doctype html>

<title>CodeMirror: TTCN mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="ttcn.js"></script>
<style type="text/css">
    .CodeMirror {
        border-top: 1px solid black;
        border-bottom: 1px solid black;
    }
</style>
<div id=nav>
    <a href="http://codemirror.net"><h1>CodeMirror</h1>
        <img id=logo src="../../doc/logo.png">
    </a>

    <ul>
        <li><a href="../../index.html">Home</a>
        <li><a href="../../doc/manual.html">Manual</a>
        <li><a href="https://github.com/codemirror/codemirror">Code</a>
    </ul>
    <ul>
        <li><a href="../index.html">Language modes</a>
        <li><a class=active href="http://en.wikipedia.org/wiki/TTCN">TTCN</a>
    </ul>
</div>
<article>
    <h2>TTCN example</h2>
    <div>
        <textarea id="ttcn-code">
module Templates {
  /* import types from ASN.1 */
  import from Types language "ASN.1:1997" all;

  /* During the conversion phase from ASN.1 to TTCN-3 */
  /* - the minus sign (Message-Type) within the identifiers will be replaced by underscore (Message_Type)*/
  /* - the ASN.1 identifiers matching a TTCN-3 keyword (objid) will be postfixed with an underscore (objid_)*/

  // simple types

  template SenderID localObjid := objid {itu_t(0) identified_organization(4) etsi(0)};

  // complex types

  /* ASN.1 Message-Type mapped to TTCN-3 Message_Type */
  template Message receiveMsg(template (present) Message_Type p_messageType) := {
    header := p_messageType,
    body := ?
  }

  /* ASN.1 objid mapped to TTCN-3 objid_ */
  template Message sendInviteMsg := {
      header := inviteType,
      body := {
        /* optional fields may be assigned by omit or may be ignored/skipped */
        description := "Invite Message",
        data := 'FF'O,
        objid_ := localObjid
      }
  }

  template Message sendAcceptMsg modifies sendInviteMsg := {
      header := acceptType,
      body := {
        description := "Accept Message"
      }
    };

  template Message sendErrorMsg modifies sendInviteMsg := {
      header := errorType,
      body := {
        description := "Error Message"
      }
    };

  template Message expectedErrorMsg := {
      header := errorType,
      body := ?
    };

  template Message expectedInviteMsg modifies expectedErrorMsg := {
      header := inviteType
    };

  template Message expectedAcceptMsg modifies expectedErrorMsg := {
      header := acceptType
    };

} with { encode "BER:1997" }
        </textarea>
    </div>

    <script> 
      var ttcnEditor = CodeMirror.fromTextArea(document.getElementById("ttcn-code"), {
        lineNumbers: true,
        matchBrackets: true,
        mode: "text/x-ttcn"
      });
      ttcnEditor.setSize(600, 860);
      var mac = CodeMirror.keyMap.default == CodeMirror.keyMap.macDefault;
      CodeMirror.keyMap.default[(mac ? "Cmd" : "Ctrl") + "-Space"] = "autocomplete";
    </script>
    <br/>
    <p><strong>Language:</strong> Testing and Test Control Notation
        (<a href="http://en.wikipedia.org/wiki/TTCN">TTCN</a>)
    </p>
    <p><strong>MIME types defined:</strong> <code>text/x-ttcn,
        text/x-ttcn3, text/x-ttcnpp</code>.</p>
    <br/>
    <p>The development of this mode has been sponsored by <a href="http://www.ericsson.com/">Ericsson
    </a>.</p>
    <p>Coded by Asmelash Tsegay Gebretsadkan </p>
</article>

codemirror/mode/forth/forth.js000064400000012156151215013510012436 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

// Author: Aliaksei Chapyzhenka

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  function toWordList(words) {
    var ret = [];
    words.split(' ').forEach(function(e){
      ret.push({name: e});
    });
    return ret;
  }

  var coreWordList = toWordList(
'INVERT AND OR XOR\
 2* 2/ LSHIFT RSHIFT\
 0= = 0< < > U< MIN MAX\
 2DROP 2DUP 2OVER 2SWAP ?DUP DEPTH DROP DUP OVER ROT SWAP\
 >R R> R@\
 + - 1+ 1- ABS NEGATE\
 S>D * M* UM*\
 FM/MOD SM/REM UM/MOD */ */MOD / /MOD MOD\
 HERE , @ ! CELL+ CELLS C, C@ C! CHARS 2@ 2!\
 ALIGN ALIGNED +! ALLOT\
 CHAR [CHAR] [ ] BL\
 FIND EXECUTE IMMEDIATE COUNT LITERAL STATE\
 ; DOES> >BODY\
 EVALUATE\
 SOURCE >IN\
 <# # #S #> HOLD SIGN BASE >NUMBER HEX DECIMAL\
 FILL MOVE\
 . CR EMIT SPACE SPACES TYPE U. .R U.R\
 ACCEPT\
 TRUE FALSE\
 <> U> 0<> 0>\
 NIP TUCK ROLL PICK\
 2>R 2R@ 2R>\
 WITHIN UNUSED MARKER\
 I J\
 TO\
 COMPILE, [COMPILE]\
 SAVE-INPUT RESTORE-INPUT\
 PAD ERASE\
 2LITERAL DNEGATE\
 D- D+ D0< D0= D2* D2/ D< D= DMAX DMIN D>S DABS\
 M+ M*/ D. D.R 2ROT DU<\
 CATCH THROW\
 FREE RESIZE ALLOCATE\
 CS-PICK CS-ROLL\
 GET-CURRENT SET-CURRENT FORTH-WORDLIST GET-ORDER SET-ORDER\
 PREVIOUS SEARCH-WORDLIST WORDLIST FIND ALSO ONLY FORTH DEFINITIONS ORDER\
 -TRAILING /STRING SEARCH COMPARE CMOVE CMOVE> BLANK SLITERAL');

  var immediateWordList = toWordList('IF ELSE THEN BEGIN WHILE REPEAT UNTIL RECURSE [IF] [ELSE] [THEN] ?DO DO LOOP +LOOP UNLOOP LEAVE EXIT AGAIN CASE OF ENDOF ENDCASE');

  CodeMirror.defineMode('forth', function() {
    function searchWordList (wordList, word) {
      var i;
      for (i = wordList.length - 1; i >= 0; i--) {
        if (wordList[i].name === word.toUpperCase()) {
          return wordList[i];
        }
      }
      return undefined;
    }
  return {
    startState: function() {
      return {
        state: '',
        base: 10,
        coreWordList: coreWordList,
        immediateWordList: immediateWordList,
        wordList: []
      };
    },
    token: function (stream, stt) {
      var mat;
      if (stream.eatSpace()) {
        return null;
      }
      if (stt.state === '') { // interpretation
        if (stream.match(/^(\]|:NONAME)(\s|$)/i)) {
          stt.state = ' compilation';
          return 'builtin compilation';
        }
        mat = stream.match(/^(\:)\s+(\S+)(\s|$)+/);
        if (mat) {
          stt.wordList.push({name: mat[2].toUpperCase()});
          stt.state = ' compilation';
          return 'def' + stt.state;
        }
        mat = stream.match(/^(VARIABLE|2VARIABLE|CONSTANT|2CONSTANT|CREATE|POSTPONE|VALUE|WORD)\s+(\S+)(\s|$)+/i);
        if (mat) {
          stt.wordList.push({name: mat[2].toUpperCase()});
          return 'def' + stt.state;
        }
        mat = stream.match(/^(\'|\[\'\])\s+(\S+)(\s|$)+/);
        if (mat) {
          return 'builtin' + stt.state;
        }
        } else { // compilation
        // ; [
        if (stream.match(/^(\;|\[)(\s)/)) {
          stt.state = '';
          stream.backUp(1);
          return 'builtin compilation';
        }
        if (stream.match(/^(\;|\[)($)/)) {
          stt.state = '';
          return 'builtin compilation';
        }
        if (stream.match(/^(POSTPONE)\s+\S+(\s|$)+/)) {
          return 'builtin';
        }
      }

      // dynamic wordlist
      mat = stream.match(/^(\S+)(\s+|$)/);
      if (mat) {
        if (searchWordList(stt.wordList, mat[1]) !== undefined) {
          return 'variable' + stt.state;
        }

        // comments
        if (mat[1] === '\\') {
          stream.skipToEnd();
            return 'comment' + stt.state;
          }

          // core words
          if (searchWordList(stt.coreWordList, mat[1]) !== undefined) {
            return 'builtin' + stt.state;
          }
          if (searchWordList(stt.immediateWordList, mat[1]) !== undefined) {
            return 'keyword' + stt.state;
          }

          if (mat[1] === '(') {
            stream.eatWhile(function (s) { return s !== ')'; });
            stream.eat(')');
            return 'comment' + stt.state;
          }

          // // strings
          if (mat[1] === '.(') {
            stream.eatWhile(function (s) { return s !== ')'; });
            stream.eat(')');
            return 'string' + stt.state;
          }
          if (mat[1] === 'S"' || mat[1] === '."' || mat[1] === 'C"') {
            stream.eatWhile(function (s) { return s !== '"'; });
            stream.eat('"');
            return 'string' + stt.state;
          }

          // numbers
          if (mat[1] - 0xfffffffff) {
            return 'number' + stt.state;
          }
          // if (mat[1].match(/^[-+]?[0-9]+\.[0-9]*/)) {
          //     return 'number' + stt.state;
          // }

          return 'atom' + stt.state;
        }
      }
    };
  });
  CodeMirror.defineMIME("text/x-forth", "forth");
});
codemirror/mode/forth/index.html000064400000003367151215013510012757 0ustar00<!doctype html>

<title>CodeMirror: Forth mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link href='http://fonts.googleapis.com/css?family=Droid+Sans+Mono' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="../../lib/codemirror.css">
<link rel=stylesheet href="../../theme/colorforth.css">
<script src="../../lib/codemirror.js"></script>
<script src="forth.js"></script>
<style>
.CodeMirror {
    font-family: 'Droid Sans Mono', monospace;
    font-size: 14px;
}
</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Forth</a>
  </ul>
</div>

<article>

<h2>Forth mode</h2>

<form><textarea id="code" name="code">
\ Insertion sort

: cell-  1 cells - ;

: insert ( start end -- start )
  dup @ >r ( r: v )
  begin
    2dup <
  while
    r@ over cell- @ <
  while
    cell-
    dup @ over cell+ !
  repeat then
  r> swap ! ;

: sort ( array len -- )
  1 ?do
    dup i cells + insert
  loop drop ;</textarea>
  </form>

<script>
  var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
    lineNumbers: true,
    lineWrapping: true,
    indentUnit: 2,
    tabSize: 2,
    autofocus: true,
    theme: "colorforth",
    mode: "text/x-forth"
  });
</script>

<p>Simple mode that handle Forth-Syntax (<a href="http://en.wikipedia.org/wiki/Forth_%28programming_language%29">Forth on WikiPedia</a>).</p>

<p><strong>MIME types defined:</strong> <code>text/x-forth</code>.</p>

</article>
codemirror/mode/sparql/index.html000064400000003355151215013510013134 0ustar00<!doctype html>

<title>CodeMirror: SPARQL mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="sparql.js"></script>
<style>.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">SPARQL</a>
  </ul>
</div>

<article>
<h2>SPARQL mode</h2>
<form><textarea id="code" name="code">
PREFIX a: &lt;http://www.w3.org/2000/10/annotation-ns#>
PREFIX dc: &lt;http://purl.org/dc/elements/1.1/>
PREFIX foaf: &lt;http://xmlns.com/foaf/0.1/>
PREFIX rdfs: &lt;http://www.w3.org/2000/01/rdf-schema#>

# Comment!

SELECT ?given ?family
WHERE {
  {
    ?annot a:annotates &lt;http://www.w3.org/TR/rdf-sparql-query/> .
    ?annot dc:creator ?c .
    OPTIONAL {?c foaf:givenName ?given ;
                 foaf:familyName ?family }
  } UNION {
    ?c !foaf:knows/foaf:knows? ?thing.
    ?thing rdfs
  } MINUS {
    ?thing rdfs:label "剛柔流"@jp
  }
  FILTER isBlank(?c)
}
</textarea></form>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        mode: "application/sparql-query",
        matchBrackets: true
      });
    </script>

    <p><strong>MIME types defined:</strong> <code>application/sparql-query</code>.</p>

  </article>
codemirror/mode/sparql/sparql.js000064400000014277151215013510013004 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("sparql", function(config) {
  var indentUnit = config.indentUnit;
  var curPunc;

  function wordRegexp(words) {
    return new RegExp("^(?:" + words.join("|") + ")$", "i");
  }
  var ops = wordRegexp(["str", "lang", "langmatches", "datatype", "bound", "sameterm", "isiri", "isuri",
                        "iri", "uri", "bnode", "count", "sum", "min", "max", "avg", "sample",
                        "group_concat", "rand", "abs", "ceil", "floor", "round", "concat", "substr", "strlen",
                        "replace", "ucase", "lcase", "encode_for_uri", "contains", "strstarts", "strends",
                        "strbefore", "strafter", "year", "month", "day", "hours", "minutes", "seconds",
                        "timezone", "tz", "now", "uuid", "struuid", "md5", "sha1", "sha256", "sha384",
                        "sha512", "coalesce", "if", "strlang", "strdt", "isnumeric", "regex", "exists",
                        "isblank", "isliteral", "a", "bind"]);
  var keywords = wordRegexp(["base", "prefix", "select", "distinct", "reduced", "construct", "describe",
                             "ask", "from", "named", "where", "order", "limit", "offset", "filter", "optional",
                             "graph", "by", "asc", "desc", "as", "having", "undef", "values", "group",
                             "minus", "in", "not", "service", "silent", "using", "insert", "delete", "union",
                             "true", "false", "with",
                             "data", "copy", "to", "move", "add", "create", "drop", "clear", "load"]);
  var operatorChars = /[*+\-<>=&|\^\/!\?]/;

  function tokenBase(stream, state) {
    var ch = stream.next();
    curPunc = null;
    if (ch == "$" || ch == "?") {
      if(ch == "?" && stream.match(/\s/, false)){
        return "operator";
      }
      stream.match(/^[\w\d]*/);
      return "variable-2";
    }
    else if (ch == "<" && !stream.match(/^[\s\u00a0=]/, false)) {
      stream.match(/^[^\s\u00a0>]*>?/);
      return "atom";
    }
    else if (ch == "\"" || ch == "'") {
      state.tokenize = tokenLiteral(ch);
      return state.tokenize(stream, state);
    }
    else if (/[{}\(\),\.;\[\]]/.test(ch)) {
      curPunc = ch;
      return "bracket";
    }
    else if (ch == "#") {
      stream.skipToEnd();
      return "comment";
    }
    else if (operatorChars.test(ch)) {
      stream.eatWhile(operatorChars);
      return "operator";
    }
    else if (ch == ":") {
      stream.eatWhile(/[\w\d\._\-]/);
      return "atom";
    }
    else if (ch == "@") {
      stream.eatWhile(/[a-z\d\-]/i);
      return "meta";
    }
    else {
      stream.eatWhile(/[_\w\d]/);
      if (stream.eat(":")) {
        stream.eatWhile(/[\w\d_\-]/);
        return "atom";
      }
      var word = stream.current();
      if (ops.test(word))
        return "builtin";
      else if (keywords.test(word))
        return "keyword";
      else
        return "variable";
    }
  }

  function tokenLiteral(quote) {
    return function(stream, state) {
      var escaped = false, ch;
      while ((ch = stream.next()) != null) {
        if (ch == quote && !escaped) {
          state.tokenize = tokenBase;
          break;
        }
        escaped = !escaped && ch == "\\";
      }
      return "string";
    };
  }

  function pushContext(state, type, col) {
    state.context = {prev: state.context, indent: state.indent, col: col, type: type};
  }
  function popContext(state) {
    state.indent = state.context.indent;
    state.context = state.context.prev;
  }

  return {
    startState: function() {
      return {tokenize: tokenBase,
              context: null,
              indent: 0,
              col: 0};
    },

    token: function(stream, state) {
      if (stream.sol()) {
        if (state.context && state.context.align == null) state.context.align = false;
        state.indent = stream.indentation();
      }
      if (stream.eatSpace()) return null;
      var style = state.tokenize(stream, state);

      if (style != "comment" && state.context && state.context.align == null && state.context.type != "pattern") {
        state.context.align = true;
      }

      if (curPunc == "(") pushContext(state, ")", stream.column());
      else if (curPunc == "[") pushContext(state, "]", stream.column());
      else if (curPunc == "{") pushContext(state, "}", stream.column());
      else if (/[\]\}\)]/.test(curPunc)) {
        while (state.context && state.context.type == "pattern") popContext(state);
        if (state.context && curPunc == state.context.type) {
          popContext(state);
          if (curPunc == "}" && state.context && state.context.type == "pattern")
            popContext(state);
        }
      }
      else if (curPunc == "." && state.context && state.context.type == "pattern") popContext(state);
      else if (/atom|string|variable/.test(style) && state.context) {
        if (/[\}\]]/.test(state.context.type))
          pushContext(state, "pattern", stream.column());
        else if (state.context.type == "pattern" && !state.context.align) {
          state.context.align = true;
          state.context.col = stream.column();
        }
      }

      return style;
    },

    indent: function(state, textAfter) {
      var firstChar = textAfter && textAfter.charAt(0);
      var context = state.context;
      if (/[\]\}]/.test(firstChar))
        while (context && context.type == "pattern") context = context.prev;

      var closing = context && firstChar == context.type;
      if (!context)
        return 0;
      else if (context.type == "pattern")
        return context.col;
      else if (context.align)
        return context.col + (closing ? 0 : 1);
      else
        return context.indent + (closing ? 0 : indentUnit);
    },

    lineComment: "#"
  };
});

CodeMirror.defineMIME("application/sparql-query", "sparql");

});
codemirror/mode/puppet/puppet.js000064400000016620151215013510013024 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("puppet", function () {
  // Stores the words from the define method
  var words = {};
  // Taken, mostly, from the Puppet official variable standards regex
  var variable_regex = /({)?([a-z][a-z0-9_]*)?((::[a-z][a-z0-9_]*)*::)?[a-zA-Z0-9_]+(})?/;

  // Takes a string of words separated by spaces and adds them as
  // keys with the value of the first argument 'style'
  function define(style, string) {
    var split = string.split(' ');
    for (var i = 0; i < split.length; i++) {
      words[split[i]] = style;
    }
  }

  // Takes commonly known puppet types/words and classifies them to a style
  define('keyword', 'class define site node include import inherits');
  define('keyword', 'case if else in and elsif default or');
  define('atom', 'false true running present absent file directory undef');
  define('builtin', 'action augeas burst chain computer cron destination dport exec ' +
    'file filebucket group host icmp iniface interface jump k5login limit log_level ' +
    'log_prefix macauthorization mailalias maillist mcx mount nagios_command ' +
    'nagios_contact nagios_contactgroup nagios_host nagios_hostdependency ' +
    'nagios_hostescalation nagios_hostextinfo nagios_hostgroup nagios_service ' +
    'nagios_servicedependency nagios_serviceescalation nagios_serviceextinfo ' +
    'nagios_servicegroup nagios_timeperiod name notify outiface package proto reject ' +
    'resources router schedule scheduled_task selboolean selmodule service source ' +
    'sport ssh_authorized_key sshkey stage state table tidy todest toports tosource ' +
    'user vlan yumrepo zfs zone zpool');

  // After finding a start of a string ('|") this function attempts to find the end;
  // If a variable is encountered along the way, we display it differently when it
  // is encapsulated in a double-quoted string.
  function tokenString(stream, state) {
    var current, prev, found_var = false;
    while (!stream.eol() && (current = stream.next()) != state.pending) {
      if (current === '$' && prev != '\\' && state.pending == '"') {
        found_var = true;
        break;
      }
      prev = current;
    }
    if (found_var) {
      stream.backUp(1);
    }
    if (current == state.pending) {
      state.continueString = false;
    } else {
      state.continueString = true;
    }
    return "string";
  }

  // Main function
  function tokenize(stream, state) {
    // Matches one whole word
    var word = stream.match(/[\w]+/, false);
    // Matches attributes (i.e. ensure => present ; 'ensure' would be matched)
    var attribute = stream.match(/(\s+)?\w+\s+=>.*/, false);
    // Matches non-builtin resource declarations
    // (i.e. "apache::vhost {" or "mycustomclasss {" would be matched)
    var resource = stream.match(/(\s+)?[\w:_]+(\s+)?{/, false);
    // Matches virtual and exported resources (i.e. @@user { ; and the like)
    var special_resource = stream.match(/(\s+)?[@]{1,2}[\w:_]+(\s+)?{/, false);

    // Finally advance the stream
    var ch = stream.next();

    // Have we found a variable?
    if (ch === '$') {
      if (stream.match(variable_regex)) {
        // If so, and its in a string, assign it a different color
        return state.continueString ? 'variable-2' : 'variable';
      }
      // Otherwise return an invalid variable
      return "error";
    }
    // Should we still be looking for the end of a string?
    if (state.continueString) {
      // If so, go through the loop again
      stream.backUp(1);
      return tokenString(stream, state);
    }
    // Are we in a definition (class, node, define)?
    if (state.inDefinition) {
      // If so, return def (i.e. for 'class myclass {' ; 'myclass' would be matched)
      if (stream.match(/(\s+)?[\w:_]+(\s+)?/)) {
        return 'def';
      }
      // Match the rest it the next time around
      stream.match(/\s+{/);
      state.inDefinition = false;
    }
    // Are we in an 'include' statement?
    if (state.inInclude) {
      // Match and return the included class
      stream.match(/(\s+)?\S+(\s+)?/);
      state.inInclude = false;
      return 'def';
    }
    // Do we just have a function on our hands?
    // In 'ensure_resource("myclass")', 'ensure_resource' is matched
    if (stream.match(/(\s+)?\w+\(/)) {
      stream.backUp(1);
      return 'def';
    }
    // Have we matched the prior attribute regex?
    if (attribute) {
      stream.match(/(\s+)?\w+/);
      return 'tag';
    }
    // Do we have Puppet specific words?
    if (word && words.hasOwnProperty(word)) {
      // Negates the initial next()
      stream.backUp(1);
      // rs move the stream
      stream.match(/[\w]+/);
      // We want to process these words differently
      // do to the importance they have in Puppet
      if (stream.match(/\s+\S+\s+{/, false)) {
        state.inDefinition = true;
      }
      if (word == 'include') {
        state.inInclude = true;
      }
      // Returns their value as state in the prior define methods
      return words[word];
    }
    // Is there a match on a reference?
    if (/(^|\s+)[A-Z][\w:_]+/.test(word)) {
      // Negate the next()
      stream.backUp(1);
      // Match the full reference
      stream.match(/(^|\s+)[A-Z][\w:_]+/);
      return 'def';
    }
    // Have we matched the prior resource regex?
    if (resource) {
      stream.match(/(\s+)?[\w:_]+/);
      return 'def';
    }
    // Have we matched the prior special_resource regex?
    if (special_resource) {
      stream.match(/(\s+)?[@]{1,2}/);
      return 'special';
    }
    // Match all the comments. All of them.
    if (ch == "#") {
      stream.skipToEnd();
      return "comment";
    }
    // Have we found a string?
    if (ch == "'" || ch == '"') {
      // Store the type (single or double)
      state.pending = ch;
      // Perform the looping function to find the end
      return tokenString(stream, state);
    }
    // Match all the brackets
    if (ch == '{' || ch == '}') {
      return 'bracket';
    }
    // Match characters that we are going to assume
    // are trying to be regex
    if (ch == '/') {
      stream.match(/.*?\//);
      return 'variable-3';
    }
    // Match all the numbers
    if (ch.match(/[0-9]/)) {
      stream.eatWhile(/[0-9]+/);
      return 'number';
    }
    // Match the '=' and '=>' operators
    if (ch == '=') {
      if (stream.peek() == '>') {
          stream.next();
      }
      return "operator";
    }
    // Keep advancing through all the rest
    stream.eatWhile(/[\w-]/);
    // Return a blank line for everything else
    return null;
  }
  // Start it all
  return {
    startState: function () {
      var state = {};
      state.inDefinition = false;
      state.inInclude = false;
      state.continueString = false;
      state.pending = false;
      return state;
    },
    token: function (stream, state) {
      // Strip the spaces, but regex will account for them eitherway
      if (stream.eatSpace()) return null;
      // Go through the main process
      return tokenize(stream, state);
    }
  };
});

CodeMirror.defineMIME("text/x-puppet", "puppet");

});
codemirror/mode/puppet/index.html000064400000006274151215013510013152 0ustar00<!doctype html>

<title>CodeMirror: Puppet mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="puppet.js"></script>
<style>
      .CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}
      .cm-s-default span.cm-arrow { color: red; }
    </style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Puppet</a>
  </ul>
</div>

<article>
<h2>Puppet mode</h2>
<form><textarea id="code" name="code">
# == Class: automysqlbackup
#
# Puppet module to install AutoMySQLBackup for periodic MySQL backups.
#
# class { 'automysqlbackup':
#   backup_dir => '/mnt/backups',
# }
#

class automysqlbackup (
  $bin_dir = $automysqlbackup::params::bin_dir,
  $etc_dir = $automysqlbackup::params::etc_dir,
  $backup_dir = $automysqlbackup::params::backup_dir,
  $install_multicore = undef,
  $config = {},
  $config_defaults = {},
) inherits automysqlbackup::params {

# Ensure valid paths are assigned
  validate_absolute_path($bin_dir)
  validate_absolute_path($etc_dir)
  validate_absolute_path($backup_dir)

# Create a subdirectory in /etc for config files
  file { $etc_dir:
    ensure => directory,
    owner => 'root',
    group => 'root',
    mode => '0750',
  }

# Create an example backup file, useful for reference
  file { "${etc_dir}/automysqlbackup.conf.example":
    ensure => file,
    owner => 'root',
    group => 'root',
    mode => '0660',
    source => 'puppet:///modules/automysqlbackup/automysqlbackup.conf',
  }

# Add files from the developer
  file { "${etc_dir}/AMB_README":
    ensure => file,
    source => 'puppet:///modules/automysqlbackup/AMB_README',
  }
  file { "${etc_dir}/AMB_LICENSE":
    ensure => file,
    source => 'puppet:///modules/automysqlbackup/AMB_LICENSE',
  }

# Install the actual binary file
  file { "${bin_dir}/automysqlbackup":
    ensure => file,
    owner => 'root',
    group => 'root',
    mode => '0755',
    source => 'puppet:///modules/automysqlbackup/automysqlbackup',
  }

# Create the base backup directory
  file { $backup_dir:
    ensure => directory,
    owner => 'root',
    group => 'root',
    mode => '0755',
  }

# If you'd like to keep your config in hiera and pass it to this class
  if !empty($config) {
    create_resources('automysqlbackup::backup', $config, $config_defaults)
  }

# If using RedHat family, must have the RPMforge repo's enabled
  if $install_multicore {
    package { ['pigz', 'pbzip2']: ensure => installed }
  }

}
</textarea></form>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        mode: "text/x-puppet",
        matchBrackets: true,
        indentUnit: 4
      });
    </script>

    <p><strong>MIME types defined:</strong> <code>text/x-puppet</code>.</p>

  </article>
codemirror/mode/css/scss_test.js000064400000006064151215013510012775 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function() {
  var mode = CodeMirror.getMode({indentUnit: 2}, "text/x-scss");
  function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1), "scss"); }

  MT('url_with_quotation',
    "[tag foo] { [property background]:[atom url]([string test.jpg]) }");

  MT('url_with_double_quotes',
    "[tag foo] { [property background]:[atom url]([string \"test.jpg\"]) }");

  MT('url_with_single_quotes',
    "[tag foo] { [property background]:[atom url]([string \'test.jpg\']) }");

  MT('string',
    "[def @import] [string \"compass/css3\"]");

  MT('important_keyword',
    "[tag foo] { [property background]:[atom url]([string \'test.jpg\']) [keyword !important] }");

  MT('variable',
    "[variable-2 $blue]:[atom #333]");

  MT('variable_as_attribute',
    "[tag foo] { [property color]:[variable-2 $blue] }");

  MT('numbers',
    "[tag foo] { [property padding]:[number 10px] [number 10] [number 10em] [number 8in] }");

  MT('number_percentage',
    "[tag foo] { [property width]:[number 80%] }");

  MT('selector',
    "[builtin #hello][qualifier .world]{}");

  MT('singleline_comment',
    "[comment // this is a comment]");

  MT('multiline_comment',
    "[comment /*foobar*/]");

  MT('attribute_with_hyphen',
    "[tag foo] { [property font-size]:[number 10px] }");

  MT('string_after_attribute',
    "[tag foo] { [property content]:[string \"::\"] }");

  MT('directives',
    "[def @include] [qualifier .mixin]");

  MT('basic_structure',
    "[tag p] { [property background]:[keyword red]; }");

  MT('nested_structure',
    "[tag p] { [tag a] { [property color]:[keyword red]; } }");

  MT('mixin',
    "[def @mixin] [tag table-base] {}");

  MT('number_without_semicolon',
    "[tag p] {[property width]:[number 12]}",
    "[tag a] {[property color]:[keyword red];}");

  MT('atom_in_nested_block',
    "[tag p] { [tag a] { [property color]:[atom #000]; } }");

  MT('interpolation_in_property',
    "[tag foo] { #{[variable-2 $hello]}:[number 2]; }");

  MT('interpolation_in_selector',
    "[tag foo]#{[variable-2 $hello]} { [property color]:[atom #000]; }");

  MT('interpolation_error',
    "[tag foo]#{[variable foo]} { [property color]:[atom #000]; }");

  MT("divide_operator",
    "[tag foo] { [property width]:[number 4] [operator /] [number 2] }");

  MT('nested_structure_with_id_selector',
    "[tag p] { [builtin #hello] { [property color]:[keyword red]; } }");

  MT('indent_mixin',
     "[def @mixin] [tag container] (",
     "  [variable-2 $a]: [number 10],",
     "  [variable-2 $b]: [number 10])",
     "{}");

  MT('indent_nested',
     "[tag foo] {",
     "  [tag bar] {",
     "  }",
     "}");

  MT('indent_parentheses',
     "[tag foo] {",
     "  [property color]: [atom darken]([variable-2 $blue],",
     "    [number 9%]);",
     "}");

  MT('indent_vardef',
     "[variable-2 $name]:",
     "  [string 'val'];",
     "[tag tag] {",
     "  [tag inner] {",
     "    [property margin]: [number 3px];",
     "  }",
     "}");
})();
codemirror/mode/css/index.html000064400000003570151215013510012421 0ustar00<!doctype html>

<title>CodeMirror: CSS mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<link rel="stylesheet" href="../../addon/hint/show-hint.css">
<script src="../../lib/codemirror.js"></script>
<script src="css.js"></script>
<script src="../../addon/hint/show-hint.js"></script>
<script src="../../addon/hint/css-hint.js"></script>
<style>.CodeMirror {background: #f8f8f8;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">CSS</a>
  </ul>
</div>

<article>
<h2>CSS mode</h2>
<form><textarea id="code" name="code">
/* Some example CSS */

@import url("something.css");

body {
  margin: 0;
  padding: 3em 6em;
  font-family: tahoma, arial, sans-serif;
  color: #000;
}

#navigation a {
  font-weight: bold;
  text-decoration: none !important;
}

h1 {
  font-size: 2.5em;
}

h2 {
  font-size: 1.7em;
}

h1:before, h2:before {
  content: "::";
}

code {
  font-family: courier, monospace;
  font-size: 80%;
  color: #418A8A;
}
</textarea></form>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        extraKeys: {"Ctrl-Space": "autocomplete"},
      });
    </script>

    <p><strong>MIME types defined:</strong> <code>text/css</code>, <code>text/x-scss</code> (<a href="scss.html">demo</a>), <code>text/x-less</code> (<a href="less.html">demo</a>).</p>

    <p><strong>Parsing/Highlighting Tests:</strong> <a href="../../test/index.html#css_*">normal</a>,  <a href="../../test/index.html#verbose,css_*">verbose</a>.</p>

  </article>
codemirror/mode/css/scss.html000064400000005266151215013510012271 0ustar00<!doctype html>

<title>CodeMirror: SCSS mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="css.js"></script>
<style>.CodeMirror {background: #f8f8f8;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">SCSS</a>
  </ul>
</div>

<article>
<h2>SCSS mode</h2>
<form><textarea id="code" name="code">
/* Some example SCSS */

@import "compass/css3";
$variable: #333;

$blue: #3bbfce;
$margin: 16px;

.content-navigation {
  #nested {
    background-color: black;
  }
  border-color: $blue;
  color:
    darken($blue, 9%);
}

.border {
  padding: $margin / 2;
  margin: $margin / 2;
  border-color: $blue;
}

@mixin table-base {
  th {
    text-align: center;
    font-weight: bold;
  }
  td, th {padding: 2px}
}

table.hl {
  margin: 2em 0;
  td.ln {
    text-align: right;
  }
}

li {
  font: {
    family: serif;
    weight: bold;
    size: 1.2em;
  }
}

@mixin left($dist) {
  float: left;
  margin-left: $dist;
}

#data {
  @include left(10px);
  @include table-base;
}

.source {
  @include flow-into(target);
  border: 10px solid green;
  margin: 20px;
  width: 200px; }

.new-container {
  @include flow-from(target);
  border: 10px solid red;
  margin: 20px;
  width: 200px; }

body {
  margin: 0;
  padding: 3em 6em;
  font-family: tahoma, arial, sans-serif;
  color: #000;
}

@mixin yellow() {
  background: yellow;
}

.big {
  font-size: 14px;
}

.nested {
  @include border-radius(3px);
  @extend .big;
  p {
    background: whitesmoke;
    a {
      color: red;
    }
  }
}

#navigation a {
  font-weight: bold;
  text-decoration: none !important;
}

h1 {
  font-size: 2.5em;
}

h2 {
  font-size: 1.7em;
}

h1:before, h2:before {
  content: "::";
}

code {
  font-family: courier, monospace;
  font-size: 80%;
  color: #418A8A;
}
</textarea></form>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        lineNumbers: true,
        matchBrackets: true,
        mode: "text/x-scss"
      });
    </script>

    <p>The SCSS mode is a sub-mode of the <a href="index.html">CSS mode</a> (defined in <code>css.js</code>).</p>

    <p><strong>Parsing/Highlighting Tests:</strong> <a href="../../test/index.html#scss_*">normal</a>,  <a href="../../test/index.html#verbose,scss_*">verbose</a>.</p>

  </article>
codemirror/mode/css/test.js000064400000015201151215013510011733 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function() {
  var mode = CodeMirror.getMode({indentUnit: 2}, "css");
  function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); }

  // Error, because "foobarhello" is neither a known type or property, but
  // property was expected (after "and"), and it should be in parentheses.
  MT("atMediaUnknownType",
     "[def @media] [attribute screen] [keyword and] [error foobarhello] { }");

  // Soft error, because "foobarhello" is not a known property or type.
  MT("atMediaUnknownProperty",
     "[def @media] [attribute screen] [keyword and] ([error foobarhello]) { }");

  // Make sure nesting works with media queries
  MT("atMediaMaxWidthNested",
     "[def @media] [attribute screen] [keyword and] ([property max-width]: [number 25px]) { [tag foo] { } }");

  MT("atMediaFeatureValueKeyword",
     "[def @media] ([property orientation]: [keyword landscape]) { }");

  MT("atMediaUnknownFeatureValueKeyword",
     "[def @media] ([property orientation]: [error upsidedown]) { }");

  MT("tagSelector",
     "[tag foo] { }");

  MT("classSelector",
     "[qualifier .foo-bar_hello] { }");

  MT("idSelector",
     "[builtin #foo] { [error #foo] }");

  MT("tagSelectorUnclosed",
     "[tag foo] { [property margin]: [number 0] } [tag bar] { }");

  MT("tagStringNoQuotes",
     "[tag foo] { [property font-family]: [variable hello] [variable world]; }");

  MT("tagStringDouble",
     "[tag foo] { [property font-family]: [string \"hello world\"]; }");

  MT("tagStringSingle",
     "[tag foo] { [property font-family]: [string 'hello world']; }");

  MT("tagColorKeyword",
     "[tag foo] {",
     "  [property color]: [keyword black];",
     "  [property color]: [keyword navy];",
     "  [property color]: [keyword yellow];",
     "}");

  MT("tagColorHex3",
     "[tag foo] { [property background]: [atom #fff]; }");

  MT("tagColorHex4",
     "[tag foo] { [property background]: [atom #ffff]; }");

  MT("tagColorHex6",
     "[tag foo] { [property background]: [atom #ffffff]; }");

  MT("tagColorHex8",
     "[tag foo] { [property background]: [atom #ffffffff]; }");

  MT("tagColorHex5Invalid",
     "[tag foo] { [property background]: [atom&error #fffff]; }");

  MT("tagColorHexInvalid",
     "[tag foo] { [property background]: [atom&error #ffg]; }");

  MT("tagNegativeNumber",
     "[tag foo] { [property margin]: [number -5px]; }");

  MT("tagPositiveNumber",
     "[tag foo] { [property padding]: [number 5px]; }");

  MT("tagVendor",
     "[tag foo] { [meta -foo-][property box-sizing]: [meta -foo-][atom border-box]; }");

  MT("tagBogusProperty",
     "[tag foo] { [property&error barhelloworld]: [number 0]; }");

  MT("tagTwoProperties",
     "[tag foo] { [property margin]: [number 0]; [property padding]: [number 0]; }");

  MT("tagTwoPropertiesURL",
     "[tag foo] { [property background]: [atom url]([string //example.com/foo.png]); [property padding]: [number 0]; }");

  MT("indent_tagSelector",
     "[tag strong], [tag em] {",
     "  [property background]: [atom rgba](",
     "    [number 255], [number 255], [number 0], [number .2]",
     "  );",
     "}");

  MT("indent_atMedia",
     "[def @media] {",
     "  [tag foo] {",
     "    [property color]:",
     "      [keyword yellow];",
     "  }",
     "}");

  MT("indent_comma",
     "[tag foo] {",
     "  [property font-family]: [variable verdana],",
     "    [atom sans-serif];",
     "}");

  MT("indent_parentheses",
     "[tag foo]:[variable-3 before] {",
     "  [property background]: [atom url](",
     "[string     blahblah]",
     "[string     etc]",
     "[string   ]) [keyword !important];",
     "}");

  MT("font_face",
     "[def @font-face] {",
     "  [property font-family]: [string 'myfont'];",
     "  [error nonsense]: [string 'abc'];",
     "  [property src]: [atom url]([string http://blah]),",
     "    [atom url]([string http://foo]);",
     "}");

  MT("empty_url",
     "[def @import] [atom url]() [attribute screen];");

  MT("parens",
     "[qualifier .foo] {",
     "  [property background-image]: [variable fade]([atom #000], [number 20%]);",
     "  [property border-image]: [atom linear-gradient](",
     "    [atom to] [atom bottom],",
     "    [variable fade]([atom #000], [number 20%]) [number 0%],",
     "    [variable fade]([atom #000], [number 20%]) [number 100%]",
     "  );",
     "}");

  MT("css_variable",
     ":[variable-3 root] {",
     "  [variable-2 --main-color]: [atom #06c];",
     "}",
     "[tag h1][builtin #foo] {",
     "  [property color]: [atom var]([variable-2 --main-color]);",
     "}");

  MT("supports",
     "[def @supports] ([keyword not] (([property text-align-last]: [atom justify]) [keyword or] ([meta -moz-][property text-align-last]: [atom justify])) {",
     "  [property text-align-last]: [atom justify];",
     "}");

   MT("document",
      "[def @document] [tag url]([string http://blah]),",
      "  [tag url-prefix]([string https://]),",
      "  [tag domain]([string blah.com]),",
      "  [tag regexp]([string \".*blah.+\"]) {",
      "    [builtin #id] {",
      "      [property background-color]: [keyword white];",
      "    }",
      "    [tag foo] {",
      "      [property font-family]: [variable Verdana], [atom sans-serif];",
      "    }",
      "}");

   MT("document_url",
      "[def @document] [tag url]([string http://blah]) { [qualifier .class] { } }");

   MT("document_urlPrefix",
      "[def @document] [tag url-prefix]([string https://]) { [builtin #id] { } }");

   MT("document_domain",
      "[def @document] [tag domain]([string blah.com]) { [tag foo] { } }");

   MT("document_regexp",
      "[def @document] [tag regexp]([string \".*blah.+\"]) { [builtin #id] { } }");

   MT("counter-style",
      "[def @counter-style] [variable binary] {",
      "  [property system]: [atom numeric];",
      "  [property symbols]: [number 0] [number 1];",
      "  [property suffix]: [string \".\"];",
      "  [property range]: [atom infinite];",
      "  [property speak-as]: [atom numeric];",
      "}");

   MT("counter-style-additive-symbols",
      "[def @counter-style] [variable simple-roman] {",
      "  [property system]: [atom additive];",
      "  [property additive-symbols]: [number 10] [variable X], [number 5] [variable V], [number 1] [variable I];",
      "  [property range]: [number 1] [number 49];",
      "}");

   MT("counter-style-use",
      "[tag ol][qualifier .roman] { [property list-style]: [variable simple-roman]; }");

   MT("counter-style-symbols",
      "[tag ol] { [property list-style]: [atom symbols]([atom cyclic] [string \"*\"] [string \"\\2020\"] [string \"\\2021\"] [string \"\\A7\"]); }");
})();
codemirror/mode/css/less.html000064400000007742151215013510012265 0ustar00<!doctype html>

<title>CodeMirror: LESS mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="css.js"></script>
<style>.CodeMirror {border: 1px solid #ddd; line-height: 1.2;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">LESS</a>
  </ul>
</div>

<article>
<h2>LESS mode</h2>
<form><textarea id="code" name="code">@media screen and (device-aspect-ratio: 16/9) { … }
@media screen and (device-aspect-ratio: 1280/720) { … }
@media screen and (device-aspect-ratio: 2560/1440) { … }

html:lang(fr-be)

tr:nth-child(2n+1) /* represents every odd row of an HTML table */

img:nth-of-type(2n+1) { float: right; }
img:nth-of-type(2n) { float: left; }

body > h2:not(:first-of-type):not(:last-of-type)

html|*:not(:link):not(:visited)
*|*:not(:hover)
p::first-line { text-transform: uppercase }

@namespace foo url(http://www.example.com);
foo|h1 { color: blue }  /* first rule */

span[hello="Ocean"][goodbye="Land"]

E[foo]{
  padding:65px;
}

input[type="search"]::-webkit-search-decoration,
input[type="search"]::-webkit-search-cancel-button {
  -webkit-appearance: none; // Inner-padding issues in Chrome OSX, Safari 5
}
button::-moz-focus-inner,
input::-moz-focus-inner { // Inner padding and border oddities in FF3/4
  padding: 0;
  border: 0;
}
.btn {
  // reset here as of 2.0.3 due to Recess property order
  border-color: #ccc;
  border-color: rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);
}
fieldset span button, fieldset span input[type="file"] {
  font-size:12px;
	font-family:Arial, Helvetica, sans-serif;
}

.rounded-corners (@radius: 5px) {
  border-radius: @radius;
  -webkit-border-radius: @radius;
  -moz-border-radius: @radius;
}

@import url("something.css");

@light-blue:   hsl(190, 50%, 65%);

#menu {
  position: absolute;
  width: 100%;
  z-index: 3;
  clear: both;
  display: block;
  background-color: @blue;
  height: 42px;
  border-top: 2px solid lighten(@alpha-blue, 20%);
  border-bottom: 2px solid darken(@alpha-blue, 25%);
  .box-shadow(0, 1px, 8px, 0.6);
  -moz-box-shadow: 0 0 0 #000; // Because firefox sucks.

  &.docked {
    background-color: hsla(210, 60%, 40%, 0.4);
  }
  &:hover {
    background-color: @blue;
  }

  #dropdown {
    margin: 0 0 0 117px;
    padding: 0;
    padding-top: 5px;
    display: none;
    width: 190px;
    border-top: 2px solid @medium;
    color: @highlight;
    border: 2px solid darken(@medium, 25%);
    border-left-color: darken(@medium, 15%);
    border-right-color: darken(@medium, 15%);
    border-top-width: 0;
    background-color: darken(@medium, 10%);
    ul {
      padding: 0px;  
    }
    li {
      font-size: 14px;
      display: block;
      text-align: left;
      padding: 0;
      border: 0;
      a {
        display: block;
        padding: 0px 15px;  
        text-decoration: none;
        color: white;  
        &:hover {
          background-color: darken(@medium, 15%);
          text-decoration: none;
        }
      }
    }
    .border-radius(5px, bottom);
    .box-shadow(0, 6px, 8px, 0.5);
  }
}
</textarea></form>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        lineNumbers : true,
        matchBrackets : true,
        mode: "text/x-less"
      });
    </script>

    <p>The LESS mode is a sub-mode of the <a href="index.html">CSS mode</a> (defined in <code>css.js</code>).</p>

    <p><strong>Parsing/Highlighting Tests:</strong> <a href="../../test/index.html#less_*">normal</a>,  <a href="../../test/index.html#verbose,less_*">verbose</a>.</p>
  </article>
codemirror/mode/css/css.js000064400000110535151215013510011552 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("css", function(config, parserConfig) {
  var inline = parserConfig.inline
  if (!parserConfig.propertyKeywords) parserConfig = CodeMirror.resolveMode("text/css");

  var indentUnit = config.indentUnit,
      tokenHooks = parserConfig.tokenHooks,
      documentTypes = parserConfig.documentTypes || {},
      mediaTypes = parserConfig.mediaTypes || {},
      mediaFeatures = parserConfig.mediaFeatures || {},
      mediaValueKeywords = parserConfig.mediaValueKeywords || {},
      propertyKeywords = parserConfig.propertyKeywords || {},
      nonStandardPropertyKeywords = parserConfig.nonStandardPropertyKeywords || {},
      fontProperties = parserConfig.fontProperties || {},
      counterDescriptors = parserConfig.counterDescriptors || {},
      colorKeywords = parserConfig.colorKeywords || {},
      valueKeywords = parserConfig.valueKeywords || {},
      allowNested = parserConfig.allowNested,
      supportsAtComponent = parserConfig.supportsAtComponent === true;

  var type, override;
  function ret(style, tp) { type = tp; return style; }

  // Tokenizers

  function tokenBase(stream, state) {
    var ch = stream.next();
    if (tokenHooks[ch]) {
      var result = tokenHooks[ch](stream, state);
      if (result !== false) return result;
    }
    if (ch == "@") {
      stream.eatWhile(/[\w\\\-]/);
      return ret("def", stream.current());
    } else if (ch == "=" || (ch == "~" || ch == "|") && stream.eat("=")) {
      return ret(null, "compare");
    } else if (ch == "\"" || ch == "'") {
      state.tokenize = tokenString(ch);
      return state.tokenize(stream, state);
    } else if (ch == "#") {
      stream.eatWhile(/[\w\\\-]/);
      return ret("atom", "hash");
    } else if (ch == "!") {
      stream.match(/^\s*\w*/);
      return ret("keyword", "important");
    } else if (/\d/.test(ch) || ch == "." && stream.eat(/\d/)) {
      stream.eatWhile(/[\w.%]/);
      return ret("number", "unit");
    } else if (ch === "-") {
      if (/[\d.]/.test(stream.peek())) {
        stream.eatWhile(/[\w.%]/);
        return ret("number", "unit");
      } else if (stream.match(/^-[\w\\\-]+/)) {
        stream.eatWhile(/[\w\\\-]/);
        if (stream.match(/^\s*:/, false))
          return ret("variable-2", "variable-definition");
        return ret("variable-2", "variable");
      } else if (stream.match(/^\w+-/)) {
        return ret("meta", "meta");
      }
    } else if (/[,+>*\/]/.test(ch)) {
      return ret(null, "select-op");
    } else if (ch == "." && stream.match(/^-?[_a-z][_a-z0-9-]*/i)) {
      return ret("qualifier", "qualifier");
    } else if (/[:;{}\[\]\(\)]/.test(ch)) {
      return ret(null, ch);
    } else if ((ch == "u" && stream.match(/rl(-prefix)?\(/)) ||
               (ch == "d" && stream.match("omain(")) ||
               (ch == "r" && stream.match("egexp("))) {
      stream.backUp(1);
      state.tokenize = tokenParenthesized;
      return ret("property", "word");
    } else if (/[\w\\\-]/.test(ch)) {
      stream.eatWhile(/[\w\\\-]/);
      return ret("property", "word");
    } else {
      return ret(null, null);
    }
  }

  function tokenString(quote) {
    return function(stream, state) {
      var escaped = false, ch;
      while ((ch = stream.next()) != null) {
        if (ch == quote && !escaped) {
          if (quote == ")") stream.backUp(1);
          break;
        }
        escaped = !escaped && ch == "\\";
      }
      if (ch == quote || !escaped && quote != ")") state.tokenize = null;
      return ret("string", "string");
    };
  }

  function tokenParenthesized(stream, state) {
    stream.next(); // Must be '('
    if (!stream.match(/\s*[\"\')]/, false))
      state.tokenize = tokenString(")");
    else
      state.tokenize = null;
    return ret(null, "(");
  }

  // Context management

  function Context(type, indent, prev) {
    this.type = type;
    this.indent = indent;
    this.prev = prev;
  }

  function pushContext(state, stream, type, indent) {
    state.context = new Context(type, stream.indentation() + (indent === false ? 0 : indentUnit), state.context);
    return type;
  }

  function popContext(state) {
    if (state.context.prev)
      state.context = state.context.prev;
    return state.context.type;
  }

  function pass(type, stream, state) {
    return states[state.context.type](type, stream, state);
  }
  function popAndPass(type, stream, state, n) {
    for (var i = n || 1; i > 0; i--)
      state.context = state.context.prev;
    return pass(type, stream, state);
  }

  // Parser

  function wordAsValue(stream) {
    var word = stream.current().toLowerCase();
    if (valueKeywords.hasOwnProperty(word))
      override = "atom";
    else if (colorKeywords.hasOwnProperty(word))
      override = "keyword";
    else
      override = "variable";
  }

  var states = {};

  states.top = function(type, stream, state) {
    if (type == "{") {
      return pushContext(state, stream, "block");
    } else if (type == "}" && state.context.prev) {
      return popContext(state);
    } else if (supportsAtComponent && /@component/.test(type)) {
      return pushContext(state, stream, "atComponentBlock");
    } else if (/^@(-moz-)?document$/.test(type)) {
      return pushContext(state, stream, "documentTypes");
    } else if (/^@(media|supports|(-moz-)?document|import)$/.test(type)) {
      return pushContext(state, stream, "atBlock");
    } else if (/^@(font-face|counter-style)/.test(type)) {
      state.stateArg = type;
      return "restricted_atBlock_before";
    } else if (/^@(-(moz|ms|o|webkit)-)?keyframes$/.test(type)) {
      return "keyframes";
    } else if (type && type.charAt(0) == "@") {
      return pushContext(state, stream, "at");
    } else if (type == "hash") {
      override = "builtin";
    } else if (type == "word") {
      override = "tag";
    } else if (type == "variable-definition") {
      return "maybeprop";
    } else if (type == "interpolation") {
      return pushContext(state, stream, "interpolation");
    } else if (type == ":") {
      return "pseudo";
    } else if (allowNested && type == "(") {
      return pushContext(state, stream, "parens");
    }
    return state.context.type;
  };

  states.block = function(type, stream, state) {
    if (type == "word") {
      var word = stream.current().toLowerCase();
      if (propertyKeywords.hasOwnProperty(word)) {
        override = "property";
        return "maybeprop";
      } else if (nonStandardPropertyKeywords.hasOwnProperty(word)) {
        override = "string-2";
        return "maybeprop";
      } else if (allowNested) {
        override = stream.match(/^\s*:(?:\s|$)/, false) ? "property" : "tag";
        return "block";
      } else {
        override += " error";
        return "maybeprop";
      }
    } else if (type == "meta") {
      return "block";
    } else if (!allowNested && (type == "hash" || type == "qualifier")) {
      override = "error";
      return "block";
    } else {
      return states.top(type, stream, state);
    }
  };

  states.maybeprop = function(type, stream, state) {
    if (type == ":") return pushContext(state, stream, "prop");
    return pass(type, stream, state);
  };

  states.prop = function(type, stream, state) {
    if (type == ";") return popContext(state);
    if (type == "{" && allowNested) return pushContext(state, stream, "propBlock");
    if (type == "}" || type == "{") return popAndPass(type, stream, state);
    if (type == "(") return pushContext(state, stream, "parens");

    if (type == "hash" && !/^#([0-9a-fA-f]{3,4}|[0-9a-fA-f]{6}|[0-9a-fA-f]{8})$/.test(stream.current())) {
      override += " error";
    } else if (type == "word") {
      wordAsValue(stream);
    } else if (type == "interpolation") {
      return pushContext(state, stream, "interpolation");
    }
    return "prop";
  };

  states.propBlock = function(type, _stream, state) {
    if (type == "}") return popContext(state);
    if (type == "word") { override = "property"; return "maybeprop"; }
    return state.context.type;
  };

  states.parens = function(type, stream, state) {
    if (type == "{" || type == "}") return popAndPass(type, stream, state);
    if (type == ")") return popContext(state);
    if (type == "(") return pushContext(state, stream, "parens");
    if (type == "interpolation") return pushContext(state, stream, "interpolation");
    if (type == "word") wordAsValue(stream);
    return "parens";
  };

  states.pseudo = function(type, stream, state) {
    if (type == "word") {
      override = "variable-3";
      return state.context.type;
    }
    return pass(type, stream, state);
  };

  states.documentTypes = function(type, stream, state) {
    if (type == "word" && documentTypes.hasOwnProperty(stream.current())) {
      override = "tag";
      return state.context.type;
    } else {
      return states.atBlock(type, stream, state);
    }
  };

  states.atBlock = function(type, stream, state) {
    if (type == "(") return pushContext(state, stream, "atBlock_parens");
    if (type == "}" || type == ";") return popAndPass(type, stream, state);
    if (type == "{") return popContext(state) && pushContext(state, stream, allowNested ? "block" : "top");

    if (type == "interpolation") return pushContext(state, stream, "interpolation");

    if (type == "word") {
      var word = stream.current().toLowerCase();
      if (word == "only" || word == "not" || word == "and" || word == "or")
        override = "keyword";
      else if (mediaTypes.hasOwnProperty(word))
        override = "attribute";
      else if (mediaFeatures.hasOwnProperty(word))
        override = "property";
      else if (mediaValueKeywords.hasOwnProperty(word))
        override = "keyword";
      else if (propertyKeywords.hasOwnProperty(word))
        override = "property";
      else if (nonStandardPropertyKeywords.hasOwnProperty(word))
        override = "string-2";
      else if (valueKeywords.hasOwnProperty(word))
        override = "atom";
      else if (colorKeywords.hasOwnProperty(word))
        override = "keyword";
      else
        override = "error";
    }
    return state.context.type;
  };

  states.atComponentBlock = function(type, stream, state) {
    if (type == "}")
      return popAndPass(type, stream, state);
    if (type == "{")
      return popContext(state) && pushContext(state, stream, allowNested ? "block" : "top", false);
    if (type == "word")
      override = "error";
    return state.context.type;
  };

  states.atBlock_parens = function(type, stream, state) {
    if (type == ")") return popContext(state);
    if (type == "{" || type == "}") return popAndPass(type, stream, state, 2);
    return states.atBlock(type, stream, state);
  };

  states.restricted_atBlock_before = function(type, stream, state) {
    if (type == "{")
      return pushContext(state, stream, "restricted_atBlock");
    if (type == "word" && state.stateArg == "@counter-style") {
      override = "variable";
      return "restricted_atBlock_before";
    }
    return pass(type, stream, state);
  };

  states.restricted_atBlock = function(type, stream, state) {
    if (type == "}") {
      state.stateArg = null;
      return popContext(state);
    }
    if (type == "word") {
      if ((state.stateArg == "@font-face" && !fontProperties.hasOwnProperty(stream.current().toLowerCase())) ||
          (state.stateArg == "@counter-style" && !counterDescriptors.hasOwnProperty(stream.current().toLowerCase())))
        override = "error";
      else
        override = "property";
      return "maybeprop";
    }
    return "restricted_atBlock";
  };

  states.keyframes = function(type, stream, state) {
    if (type == "word") { override = "variable"; return "keyframes"; }
    if (type == "{") return pushContext(state, stream, "top");
    return pass(type, stream, state);
  };

  states.at = function(type, stream, state) {
    if (type == ";") return popContext(state);
    if (type == "{" || type == "}") return popAndPass(type, stream, state);
    if (type == "word") override = "tag";
    else if (type == "hash") override = "builtin";
    return "at";
  };

  states.interpolation = function(type, stream, state) {
    if (type == "}") return popContext(state);
    if (type == "{" || type == ";") return popAndPass(type, stream, state);
    if (type == "word") override = "variable";
    else if (type != "variable" && type != "(" && type != ")") override = "error";
    return "interpolation";
  };

  return {
    startState: function(base) {
      return {tokenize: null,
              state: inline ? "block" : "top",
              stateArg: null,
              context: new Context(inline ? "block" : "top", base || 0, null)};
    },

    token: function(stream, state) {
      if (!state.tokenize && stream.eatSpace()) return null;
      var style = (state.tokenize || tokenBase)(stream, state);
      if (style && typeof style == "object") {
        type = style[1];
        style = style[0];
      }
      override = style;
      state.state = states[state.state](type, stream, state);
      return override;
    },

    indent: function(state, textAfter) {
      var cx = state.context, ch = textAfter && textAfter.charAt(0);
      var indent = cx.indent;
      if (cx.type == "prop" && (ch == "}" || ch == ")")) cx = cx.prev;
      if (cx.prev) {
        if (ch == "}" && (cx.type == "block" || cx.type == "top" ||
                          cx.type == "interpolation" || cx.type == "restricted_atBlock")) {
          // Resume indentation from parent context.
          cx = cx.prev;
          indent = cx.indent;
        } else if (ch == ")" && (cx.type == "parens" || cx.type == "atBlock_parens") ||
            ch == "{" && (cx.type == "at" || cx.type == "atBlock")) {
          // Dedent relative to current context.
          indent = Math.max(0, cx.indent - indentUnit);
          cx = cx.prev;
        }
      }
      return indent;
    },

    electricChars: "}",
    blockCommentStart: "/*",
    blockCommentEnd: "*/",
    fold: "brace"
  };
});

  function keySet(array) {
    var keys = {};
    for (var i = 0; i < array.length; ++i) {
      keys[array[i]] = true;
    }
    return keys;
  }

  var documentTypes_ = [
    "domain", "regexp", "url", "url-prefix"
  ], documentTypes = keySet(documentTypes_);

  var mediaTypes_ = [
    "all", "aural", "braille", "handheld", "print", "projection", "screen",
    "tty", "tv", "embossed"
  ], mediaTypes = keySet(mediaTypes_);

  var mediaFeatures_ = [
    "width", "min-width", "max-width", "height", "min-height", "max-height",
    "device-width", "min-device-width", "max-device-width", "device-height",
    "min-device-height", "max-device-height", "aspect-ratio",
    "min-aspect-ratio", "max-aspect-ratio", "device-aspect-ratio",
    "min-device-aspect-ratio", "max-device-aspect-ratio", "color", "min-color",
    "max-color", "color-index", "min-color-index", "max-color-index",
    "monochrome", "min-monochrome", "max-monochrome", "resolution",
    "min-resolution", "max-resolution", "scan", "grid", "orientation",
    "device-pixel-ratio", "min-device-pixel-ratio", "max-device-pixel-ratio",
    "pointer", "any-pointer", "hover", "any-hover"
  ], mediaFeatures = keySet(mediaFeatures_);

  var mediaValueKeywords_ = [
    "landscape", "portrait", "none", "coarse", "fine", "on-demand", "hover",
    "interlace", "progressive"
  ], mediaValueKeywords = keySet(mediaValueKeywords_);

  var propertyKeywords_ = [
    "align-content", "align-items", "align-self", "alignment-adjust",
    "alignment-baseline", "anchor-point", "animation", "animation-delay",
    "animation-direction", "animation-duration", "animation-fill-mode",
    "animation-iteration-count", "animation-name", "animation-play-state",
    "animation-timing-function", "appearance", "azimuth", "backface-visibility",
    "background", "background-attachment", "background-blend-mode", "background-clip",
    "background-color", "background-image", "background-origin", "background-position",
    "background-repeat", "background-size", "baseline-shift", "binding",
    "bleed", "bookmark-label", "bookmark-level", "bookmark-state",
    "bookmark-target", "border", "border-bottom", "border-bottom-color",
    "border-bottom-left-radius", "border-bottom-right-radius",
    "border-bottom-style", "border-bottom-width", "border-collapse",
    "border-color", "border-image", "border-image-outset",
    "border-image-repeat", "border-image-slice", "border-image-source",
    "border-image-width", "border-left", "border-left-color",
    "border-left-style", "border-left-width", "border-radius", "border-right",
    "border-right-color", "border-right-style", "border-right-width",
    "border-spacing", "border-style", "border-top", "border-top-color",
    "border-top-left-radius", "border-top-right-radius", "border-top-style",
    "border-top-width", "border-width", "bottom", "box-decoration-break",
    "box-shadow", "box-sizing", "break-after", "break-before", "break-inside",
    "caption-side", "clear", "clip", "color", "color-profile", "column-count",
    "column-fill", "column-gap", "column-rule", "column-rule-color",
    "column-rule-style", "column-rule-width", "column-span", "column-width",
    "columns", "content", "counter-increment", "counter-reset", "crop", "cue",
    "cue-after", "cue-before", "cursor", "direction", "display",
    "dominant-baseline", "drop-initial-after-adjust",
    "drop-initial-after-align", "drop-initial-before-adjust",
    "drop-initial-before-align", "drop-initial-size", "drop-initial-value",
    "elevation", "empty-cells", "fit", "fit-position", "flex", "flex-basis",
    "flex-direction", "flex-flow", "flex-grow", "flex-shrink", "flex-wrap",
    "float", "float-offset", "flow-from", "flow-into", "font", "font-feature-settings",
    "font-family", "font-kerning", "font-language-override", "font-size", "font-size-adjust",
    "font-stretch", "font-style", "font-synthesis", "font-variant",
    "font-variant-alternates", "font-variant-caps", "font-variant-east-asian",
    "font-variant-ligatures", "font-variant-numeric", "font-variant-position",
    "font-weight", "grid", "grid-area", "grid-auto-columns", "grid-auto-flow",
    "grid-auto-rows", "grid-column", "grid-column-end", "grid-column-gap",
    "grid-column-start", "grid-gap", "grid-row", "grid-row-end", "grid-row-gap",
    "grid-row-start", "grid-template", "grid-template-areas", "grid-template-columns",
    "grid-template-rows", "hanging-punctuation", "height", "hyphens",
    "icon", "image-orientation", "image-rendering", "image-resolution",
    "inline-box-align", "justify-content", "left", "letter-spacing",
    "line-break", "line-height", "line-stacking", "line-stacking-ruby",
    "line-stacking-shift", "line-stacking-strategy", "list-style",
    "list-style-image", "list-style-position", "list-style-type", "margin",
    "margin-bottom", "margin-left", "margin-right", "margin-top",
    "marker-offset", "marks", "marquee-direction", "marquee-loop",
    "marquee-play-count", "marquee-speed", "marquee-style", "max-height",
    "max-width", "min-height", "min-width", "move-to", "nav-down", "nav-index",
    "nav-left", "nav-right", "nav-up", "object-fit", "object-position",
    "opacity", "order", "orphans", "outline",
    "outline-color", "outline-offset", "outline-style", "outline-width",
    "overflow", "overflow-style", "overflow-wrap", "overflow-x", "overflow-y",
    "padding", "padding-bottom", "padding-left", "padding-right", "padding-top",
    "page", "page-break-after", "page-break-before", "page-break-inside",
    "page-policy", "pause", "pause-after", "pause-before", "perspective",
    "perspective-origin", "pitch", "pitch-range", "play-during", "position",
    "presentation-level", "punctuation-trim", "quotes", "region-break-after",
    "region-break-before", "region-break-inside", "region-fragment",
    "rendering-intent", "resize", "rest", "rest-after", "rest-before", "richness",
    "right", "rotation", "rotation-point", "ruby-align", "ruby-overhang",
    "ruby-position", "ruby-span", "shape-image-threshold", "shape-inside", "shape-margin",
    "shape-outside", "size", "speak", "speak-as", "speak-header",
    "speak-numeral", "speak-punctuation", "speech-rate", "stress", "string-set",
    "tab-size", "table-layout", "target", "target-name", "target-new",
    "target-position", "text-align", "text-align-last", "text-decoration",
    "text-decoration-color", "text-decoration-line", "text-decoration-skip",
    "text-decoration-style", "text-emphasis", "text-emphasis-color",
    "text-emphasis-position", "text-emphasis-style", "text-height",
    "text-indent", "text-justify", "text-outline", "text-overflow", "text-shadow",
    "text-size-adjust", "text-space-collapse", "text-transform", "text-underline-position",
    "text-wrap", "top", "transform", "transform-origin", "transform-style",
    "transition", "transition-delay", "transition-duration",
    "transition-property", "transition-timing-function", "unicode-bidi",
    "vertical-align", "visibility", "voice-balance", "voice-duration",
    "voice-family", "voice-pitch", "voice-range", "voice-rate", "voice-stress",
    "voice-volume", "volume", "white-space", "widows", "width", "word-break",
    "word-spacing", "word-wrap", "z-index",
    // SVG-specific
    "clip-path", "clip-rule", "mask", "enable-background", "filter", "flood-color",
    "flood-opacity", "lighting-color", "stop-color", "stop-opacity", "pointer-events",
    "color-interpolation", "color-interpolation-filters",
    "color-rendering", "fill", "fill-opacity", "fill-rule", "image-rendering",
    "marker", "marker-end", "marker-mid", "marker-start", "shape-rendering", "stroke",
    "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin",
    "stroke-miterlimit", "stroke-opacity", "stroke-width", "text-rendering",
    "baseline-shift", "dominant-baseline", "glyph-orientation-horizontal",
    "glyph-orientation-vertical", "text-anchor", "writing-mode"
  ], propertyKeywords = keySet(propertyKeywords_);

  var nonStandardPropertyKeywords_ = [
    "scrollbar-arrow-color", "scrollbar-base-color", "scrollbar-dark-shadow-color",
    "scrollbar-face-color", "scrollbar-highlight-color", "scrollbar-shadow-color",
    "scrollbar-3d-light-color", "scrollbar-track-color", "shape-inside",
    "searchfield-cancel-button", "searchfield-decoration", "searchfield-results-button",
    "searchfield-results-decoration", "zoom"
  ], nonStandardPropertyKeywords = keySet(nonStandardPropertyKeywords_);

  var fontProperties_ = [
    "font-family", "src", "unicode-range", "font-variant", "font-feature-settings",
    "font-stretch", "font-weight", "font-style"
  ], fontProperties = keySet(fontProperties_);

  var counterDescriptors_ = [
    "additive-symbols", "fallback", "negative", "pad", "prefix", "range",
    "speak-as", "suffix", "symbols", "system"
  ], counterDescriptors = keySet(counterDescriptors_);

  var colorKeywords_ = [
    "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige",
    "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown",
    "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue",
    "cornsilk", "crimson", "cyan", "darkblue", "darkcyan", "darkgoldenrod",
    "darkgray", "darkgreen", "darkkhaki", "darkmagenta", "darkolivegreen",
    "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen",
    "darkslateblue", "darkslategray", "darkturquoise", "darkviolet",
    "deeppink", "deepskyblue", "dimgray", "dodgerblue", "firebrick",
    "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite",
    "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew",
    "hotpink", "indianred", "indigo", "ivory", "khaki", "lavender",
    "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral",
    "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightpink",
    "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray",
    "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta",
    "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple",
    "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise",
    "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin",
    "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered",
    "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred",
    "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue",
    "purple", "rebeccapurple", "red", "rosybrown", "royalblue", "saddlebrown",
    "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue",
    "slateblue", "slategray", "snow", "springgreen", "steelblue", "tan",
    "teal", "thistle", "tomato", "turquoise", "violet", "wheat", "white",
    "whitesmoke", "yellow", "yellowgreen"
  ], colorKeywords = keySet(colorKeywords_);

  var valueKeywords_ = [
    "above", "absolute", "activeborder", "additive", "activecaption", "afar",
    "after-white-space", "ahead", "alias", "all", "all-scroll", "alphabetic", "alternate",
    "always", "amharic", "amharic-abegede", "antialiased", "appworkspace",
    "arabic-indic", "armenian", "asterisks", "attr", "auto", "avoid", "avoid-column", "avoid-page",
    "avoid-region", "background", "backwards", "baseline", "below", "bidi-override", "binary",
    "bengali", "blink", "block", "block-axis", "bold", "bolder", "border", "border-box",
    "both", "bottom", "break", "break-all", "break-word", "bullets", "button", "button-bevel",
    "buttonface", "buttonhighlight", "buttonshadow", "buttontext", "calc", "cambodian",
    "capitalize", "caps-lock-indicator", "caption", "captiontext", "caret",
    "cell", "center", "checkbox", "circle", "cjk-decimal", "cjk-earthly-branch",
    "cjk-heavenly-stem", "cjk-ideographic", "clear", "clip", "close-quote",
    "col-resize", "collapse", "color", "color-burn", "color-dodge", "column", "column-reverse",
    "compact", "condensed", "contain", "content",
    "content-box", "context-menu", "continuous", "copy", "counter", "counters", "cover", "crop",
    "cross", "crosshair", "currentcolor", "cursive", "cyclic", "darken", "dashed", "decimal",
    "decimal-leading-zero", "default", "default-button", "dense", "destination-atop",
    "destination-in", "destination-out", "destination-over", "devanagari", "difference",
    "disc", "discard", "disclosure-closed", "disclosure-open", "document",
    "dot-dash", "dot-dot-dash",
    "dotted", "double", "down", "e-resize", "ease", "ease-in", "ease-in-out", "ease-out",
    "element", "ellipse", "ellipsis", "embed", "end", "ethiopic", "ethiopic-abegede",
    "ethiopic-abegede-am-et", "ethiopic-abegede-gez", "ethiopic-abegede-ti-er",
    "ethiopic-abegede-ti-et", "ethiopic-halehame-aa-er",
    "ethiopic-halehame-aa-et", "ethiopic-halehame-am-et",
    "ethiopic-halehame-gez", "ethiopic-halehame-om-et",
    "ethiopic-halehame-sid-et", "ethiopic-halehame-so-et",
    "ethiopic-halehame-ti-er", "ethiopic-halehame-ti-et", "ethiopic-halehame-tig",
    "ethiopic-numeric", "ew-resize", "exclusion", "expanded", "extends", "extra-condensed",
    "extra-expanded", "fantasy", "fast", "fill", "fixed", "flat", "flex", "flex-end", "flex-start", "footnotes",
    "forwards", "from", "geometricPrecision", "georgian", "graytext", "grid", "groove",
    "gujarati", "gurmukhi", "hand", "hangul", "hangul-consonant", "hard-light", "hebrew",
    "help", "hidden", "hide", "higher", "highlight", "highlighttext",
    "hiragana", "hiragana-iroha", "horizontal", "hsl", "hsla", "hue", "icon", "ignore",
    "inactiveborder", "inactivecaption", "inactivecaptiontext", "infinite",
    "infobackground", "infotext", "inherit", "initial", "inline", "inline-axis",
    "inline-block", "inline-flex", "inline-grid", "inline-table", "inset", "inside", "intrinsic", "invert",
    "italic", "japanese-formal", "japanese-informal", "justify", "kannada",
    "katakana", "katakana-iroha", "keep-all", "khmer",
    "korean-hangul-formal", "korean-hanja-formal", "korean-hanja-informal",
    "landscape", "lao", "large", "larger", "left", "level", "lighter", "lighten",
    "line-through", "linear", "linear-gradient", "lines", "list-item", "listbox", "listitem",
    "local", "logical", "loud", "lower", "lower-alpha", "lower-armenian",
    "lower-greek", "lower-hexadecimal", "lower-latin", "lower-norwegian",
    "lower-roman", "lowercase", "ltr", "luminosity", "malayalam", "match", "matrix", "matrix3d",
    "media-controls-background", "media-current-time-display",
    "media-fullscreen-button", "media-mute-button", "media-play-button",
    "media-return-to-realtime-button", "media-rewind-button",
    "media-seek-back-button", "media-seek-forward-button", "media-slider",
    "media-sliderthumb", "media-time-remaining-display", "media-volume-slider",
    "media-volume-slider-container", "media-volume-sliderthumb", "medium",
    "menu", "menulist", "menulist-button", "menulist-text",
    "menulist-textfield", "menutext", "message-box", "middle", "min-intrinsic",
    "mix", "mongolian", "monospace", "move", "multiple", "multiply", "myanmar", "n-resize",
    "narrower", "ne-resize", "nesw-resize", "no-close-quote", "no-drop",
    "no-open-quote", "no-repeat", "none", "normal", "not-allowed", "nowrap",
    "ns-resize", "numbers", "numeric", "nw-resize", "nwse-resize", "oblique", "octal", "open-quote",
    "optimizeLegibility", "optimizeSpeed", "oriya", "oromo", "outset",
    "outside", "outside-shape", "overlay", "overline", "padding", "padding-box",
    "painted", "page", "paused", "persian", "perspective", "plus-darker", "plus-lighter",
    "pointer", "polygon", "portrait", "pre", "pre-line", "pre-wrap", "preserve-3d",
    "progress", "push-button", "radial-gradient", "radio", "read-only",
    "read-write", "read-write-plaintext-only", "rectangle", "region",
    "relative", "repeat", "repeating-linear-gradient",
    "repeating-radial-gradient", "repeat-x", "repeat-y", "reset", "reverse",
    "rgb", "rgba", "ridge", "right", "rotate", "rotate3d", "rotateX", "rotateY",
    "rotateZ", "round", "row", "row-resize", "row-reverse", "rtl", "run-in", "running",
    "s-resize", "sans-serif", "saturation", "scale", "scale3d", "scaleX", "scaleY", "scaleZ", "screen",
    "scroll", "scrollbar", "se-resize", "searchfield",
    "searchfield-cancel-button", "searchfield-decoration",
    "searchfield-results-button", "searchfield-results-decoration",
    "semi-condensed", "semi-expanded", "separate", "serif", "show", "sidama",
    "simp-chinese-formal", "simp-chinese-informal", "single",
    "skew", "skewX", "skewY", "skip-white-space", "slide", "slider-horizontal",
    "slider-vertical", "sliderthumb-horizontal", "sliderthumb-vertical", "slow",
    "small", "small-caps", "small-caption", "smaller", "soft-light", "solid", "somali",
    "source-atop", "source-in", "source-out", "source-over", "space", "space-around", "space-between", "spell-out", "square",
    "square-button", "start", "static", "status-bar", "stretch", "stroke", "sub",
    "subpixel-antialiased", "super", "sw-resize", "symbolic", "symbols", "table",
    "table-caption", "table-cell", "table-column", "table-column-group",
    "table-footer-group", "table-header-group", "table-row", "table-row-group",
    "tamil",
    "telugu", "text", "text-bottom", "text-top", "textarea", "textfield", "thai",
    "thick", "thin", "threeddarkshadow", "threedface", "threedhighlight",
    "threedlightshadow", "threedshadow", "tibetan", "tigre", "tigrinya-er",
    "tigrinya-er-abegede", "tigrinya-et", "tigrinya-et-abegede", "to", "top",
    "trad-chinese-formal", "trad-chinese-informal",
    "translate", "translate3d", "translateX", "translateY", "translateZ",
    "transparent", "ultra-condensed", "ultra-expanded", "underline", "up",
    "upper-alpha", "upper-armenian", "upper-greek", "upper-hexadecimal",
    "upper-latin", "upper-norwegian", "upper-roman", "uppercase", "urdu", "url",
    "var", "vertical", "vertical-text", "visible", "visibleFill", "visiblePainted",
    "visibleStroke", "visual", "w-resize", "wait", "wave", "wider",
    "window", "windowframe", "windowtext", "words", "wrap", "wrap-reverse", "x-large", "x-small", "xor",
    "xx-large", "xx-small"
  ], valueKeywords = keySet(valueKeywords_);

  var allWords = documentTypes_.concat(mediaTypes_).concat(mediaFeatures_).concat(mediaValueKeywords_)
    .concat(propertyKeywords_).concat(nonStandardPropertyKeywords_).concat(colorKeywords_)
    .concat(valueKeywords_);
  CodeMirror.registerHelper("hintWords", "css", allWords);

  function tokenCComment(stream, state) {
    var maybeEnd = false, ch;
    while ((ch = stream.next()) != null) {
      if (maybeEnd && ch == "/") {
        state.tokenize = null;
        break;
      }
      maybeEnd = (ch == "*");
    }
    return ["comment", "comment"];
  }

  CodeMirror.defineMIME("text/css", {
    documentTypes: documentTypes,
    mediaTypes: mediaTypes,
    mediaFeatures: mediaFeatures,
    mediaValueKeywords: mediaValueKeywords,
    propertyKeywords: propertyKeywords,
    nonStandardPropertyKeywords: nonStandardPropertyKeywords,
    fontProperties: fontProperties,
    counterDescriptors: counterDescriptors,
    colorKeywords: colorKeywords,
    valueKeywords: valueKeywords,
    tokenHooks: {
      "/": function(stream, state) {
        if (!stream.eat("*")) return false;
        state.tokenize = tokenCComment;
        return tokenCComment(stream, state);
      }
    },
    name: "css"
  });

  CodeMirror.defineMIME("text/x-scss", {
    mediaTypes: mediaTypes,
    mediaFeatures: mediaFeatures,
    mediaValueKeywords: mediaValueKeywords,
    propertyKeywords: propertyKeywords,
    nonStandardPropertyKeywords: nonStandardPropertyKeywords,
    colorKeywords: colorKeywords,
    valueKeywords: valueKeywords,
    fontProperties: fontProperties,
    allowNested: true,
    tokenHooks: {
      "/": function(stream, state) {
        if (stream.eat("/")) {
          stream.skipToEnd();
          return ["comment", "comment"];
        } else if (stream.eat("*")) {
          state.tokenize = tokenCComment;
          return tokenCComment(stream, state);
        } else {
          return ["operator", "operator"];
        }
      },
      ":": function(stream) {
        if (stream.match(/\s*\{/))
          return [null, "{"];
        return false;
      },
      "$": function(stream) {
        stream.match(/^[\w-]+/);
        if (stream.match(/^\s*:/, false))
          return ["variable-2", "variable-definition"];
        return ["variable-2", "variable"];
      },
      "#": function(stream) {
        if (!stream.eat("{")) return false;
        return [null, "interpolation"];
      }
    },
    name: "css",
    helperType: "scss"
  });

  CodeMirror.defineMIME("text/x-less", {
    mediaTypes: mediaTypes,
    mediaFeatures: mediaFeatures,
    mediaValueKeywords: mediaValueKeywords,
    propertyKeywords: propertyKeywords,
    nonStandardPropertyKeywords: nonStandardPropertyKeywords,
    colorKeywords: colorKeywords,
    valueKeywords: valueKeywords,
    fontProperties: fontProperties,
    allowNested: true,
    tokenHooks: {
      "/": function(stream, state) {
        if (stream.eat("/")) {
          stream.skipToEnd();
          return ["comment", "comment"];
        } else if (stream.eat("*")) {
          state.tokenize = tokenCComment;
          return tokenCComment(stream, state);
        } else {
          return ["operator", "operator"];
        }
      },
      "@": function(stream) {
        if (stream.eat("{")) return [null, "interpolation"];
        if (stream.match(/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\b/, false)) return false;
        stream.eatWhile(/[\w\\\-]/);
        if (stream.match(/^\s*:/, false))
          return ["variable-2", "variable-definition"];
        return ["variable-2", "variable"];
      },
      "&": function() {
        return ["atom", "atom"];
      }
    },
    name: "css",
    helperType: "less"
  });

  CodeMirror.defineMIME("text/x-gss", {
    documentTypes: documentTypes,
    mediaTypes: mediaTypes,
    mediaFeatures: mediaFeatures,
    propertyKeywords: propertyKeywords,
    nonStandardPropertyKeywords: nonStandardPropertyKeywords,
    fontProperties: fontProperties,
    counterDescriptors: counterDescriptors,
    colorKeywords: colorKeywords,
    valueKeywords: valueKeywords,
    supportsAtComponent: true,
    tokenHooks: {
      "/": function(stream, state) {
        if (!stream.eat("*")) return false;
        state.tokenize = tokenCComment;
        return tokenCComment(stream, state);
      }
    },
    name: "css",
    helperType: "gss"
  });

});
codemirror/mode/css/less_test.js000064400000003517151215013510012770 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function() {
  "use strict";

  var mode = CodeMirror.getMode({indentUnit: 2}, "text/x-less");
  function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1), "less"); }

  MT("variable",
     "[variable-2 @base]: [atom #f04615];",
     "[qualifier .class] {",
     "  [property width]: [variable percentage]([number 0.5]); [comment // returns `50%`]",
     "  [property color]: [variable saturate]([variable-2 @base], [number 5%]);",
     "}");

  MT("amp",
     "[qualifier .child], [qualifier .sibling] {",
     "  [qualifier .parent] [atom &] {",
     "    [property color]: [keyword black];",
     "  }",
     "  [atom &] + [atom &] {",
     "    [property color]: [keyword red];",
     "  }",
     "}");

  MT("mixin",
     "[qualifier .mixin] ([variable dark]; [variable-2 @color]) {",
     "  [property color]: [atom darken]([variable-2 @color], [number 10%]);",
     "}",
     "[qualifier .mixin] ([variable light]; [variable-2 @color]) {",
     "  [property color]: [atom lighten]([variable-2 @color], [number 10%]);",
     "}",
     "[qualifier .mixin] ([variable-2 @_]; [variable-2 @color]) {",
     "  [property display]: [atom block];",
     "}",
     "[variable-2 @switch]: [variable light];",
     "[qualifier .class] {",
     "  [qualifier .mixin]([variable-2 @switch]; [atom #888]);",
     "}");

  MT("nest",
     "[qualifier .one] {",
     "  [def @media] ([property width]: [number 400px]) {",
     "    [property font-size]: [number 1.2em];",
     "    [def @media] [attribute print] [keyword and] [property color] {",
     "      [property color]: [keyword blue];",
     "    }",
     "  }",
     "}");


  MT("interpolation", ".@{[variable foo]} { [property font-weight]: [atom bold]; }");
})();
codemirror/mode/css/gss.html000064400000005334151215013510012106 0ustar00<!doctype html>

<title>CodeMirror: Closure Stylesheets (GSS) mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<link rel="stylesheet" href="../../addon/hint/show-hint.css">
<script src="../../lib/codemirror.js"></script>
<script src="css.js"></script>
<script src="../../addon/hint/show-hint.js"></script>
<script src="../../addon/hint/css-hint.js"></script>
<style>.CodeMirror {background: #f8f8f8;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Closure Stylesheets (GSS)</a>
  </ul>
</div>

<article>
<h2>Closure Stylesheets (GSS) mode</h2>
<form><textarea id="code" name="code">
/* Some example Closure Stylesheets */

@provide 'some.styles';

@require 'other.styles';

@component {

@def FONT_FAMILY           "Times New Roman", Georgia, Serif;
@def FONT_SIZE_NORMAL      15px;
@def FONT_NORMAL           normal FONT_SIZE_NORMAL FONT_FAMILY;

@def BG_COLOR              rgb(235, 239, 249);

@def DIALOG_BORDER_COLOR   rgb(107, 144, 218);
@def DIALOG_BG_COLOR       BG_COLOR;

@def LEFT_HAND_NAV_WIDTH    180px;
@def LEFT_HAND_NAV_PADDING  3px;

@defmixin size(WIDTH, HEIGHT) {
  width: WIDTH;
  height: HEIGHT;
}

body {
  background-color: BG_COLOR;
  margin: 0;
  padding: 3em 6em;
  font: FONT_NORMAL;
  color: #000;
}

#navigation a {
  font-weight: bold;
  text-decoration: none !important;
}

.dialog {
  background-color: DIALOG_BG_COLOR;
  border: 1px solid DIALOG_BORDER_COLOR;
}

.content {
  position: absolute;
  margin-left: add(LEFT_HAND_NAV_PADDING,  /* padding left */
                   LEFT_HAND_NAV_WIDTH,
                   LEFT_HAND_NAV_PADDING); /* padding right */

}

.logo {
  @mixin size(150px, 55px);
  background-image: url('http://www.google.com/images/logo_sm.gif');
}

}
</textarea></form>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        extraKeys: {"Ctrl-Space": "autocomplete"},
        lineNumbers: true,
        matchBrackets: "text/x-less",
        mode: "text/x-gss"
      });
    </script>

    <p>A mode for <a href="https://github.com/google/closure-stylesheets">Closure Stylesheets</a> (GSS).</p>
    <p><strong>MIME type defined:</strong> <code>text/x-gss</code>.</p>

    <p><strong>Parsing/Highlighting Tests:</strong> <a href="../../test/index.html#gss_*">normal</a>,  <a href="../../test/index.html#verbose,gss_*">verbose</a>.</p>

  </article>
codemirror/mode/css/gss_test.js000064400000000714151215013510012612 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function() {
  "use strict";

  var mode = CodeMirror.getMode({indentUnit: 2}, "text/x-gss");
  function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1), "gss"); }

  MT("atComponent",
     "[def @component] {",
     "[tag foo] {",
     "  [property color]: [keyword black];",
     "}",
     "}");

})();
codemirror/mode/cypher/cypher.js000064400000014205151215013510012753 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

// By the Neo4j Team and contributors.
// https://github.com/neo4j-contrib/CodeMirror

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";
  var wordRegexp = function(words) {
    return new RegExp("^(?:" + words.join("|") + ")$", "i");
  };

  CodeMirror.defineMode("cypher", function(config) {
    var tokenBase = function(stream/*, state*/) {
      var ch = stream.next();
      if (ch === "\"" || ch === "'") {
        stream.match(/.+?["']/);
        return "string";
      }
      if (/[{}\(\),\.;\[\]]/.test(ch)) {
        curPunc = ch;
        return "node";
      } else if (ch === "/" && stream.eat("/")) {
        stream.skipToEnd();
        return "comment";
      } else if (operatorChars.test(ch)) {
        stream.eatWhile(operatorChars);
        return null;
      } else {
        stream.eatWhile(/[_\w\d]/);
        if (stream.eat(":")) {
          stream.eatWhile(/[\w\d_\-]/);
          return "atom";
        }
        var word = stream.current();
        if (funcs.test(word)) return "builtin";
        if (preds.test(word)) return "def";
        if (keywords.test(word)) return "keyword";
        return "variable";
      }
    };
    var pushContext = function(state, type, col) {
      return state.context = {
        prev: state.context,
        indent: state.indent,
        col: col,
        type: type
      };
    };
    var popContext = function(state) {
      state.indent = state.context.indent;
      return state.context = state.context.prev;
    };
    var indentUnit = config.indentUnit;
    var curPunc;
    var funcs = wordRegexp(["abs", "acos", "allShortestPaths", "asin", "atan", "atan2", "avg", "ceil", "coalesce", "collect", "cos", "cot", "count", "degrees", "e", "endnode", "exp", "extract", "filter", "floor", "haversin", "head", "id", "keys", "labels", "last", "left", "length", "log", "log10", "lower", "ltrim", "max", "min", "node", "nodes", "percentileCont", "percentileDisc", "pi", "radians", "rand", "range", "reduce", "rel", "relationship", "relationships", "replace", "reverse", "right", "round", "rtrim", "shortestPath", "sign", "sin", "size", "split", "sqrt", "startnode", "stdev", "stdevp", "str", "substring", "sum", "tail", "tan", "timestamp", "toFloat", "toInt", "toString", "trim", "type", "upper"]);
    var preds = wordRegexp(["all", "and", "any", "contains", "exists", "has", "in", "none", "not", "or", "single", "xor"]);
    var keywords = wordRegexp(["as", "asc", "ascending", "assert", "by", "case", "commit", "constraint", "create", "csv", "cypher", "delete", "desc", "descending", "detach", "distinct", "drop", "else", "end", "ends", "explain", "false", "fieldterminator", "foreach", "from", "headers", "in", "index", "is", "join", "limit", "load", "match", "merge", "null", "on", "optional", "order", "periodic", "profile", "remove", "return", "scan", "set", "skip", "start", "starts", "then", "true", "union", "unique", "unwind", "using", "when", "where", "with"]);
    var operatorChars = /[*+\-<>=&|~%^]/;

    return {
      startState: function(/*base*/) {
        return {
          tokenize: tokenBase,
          context: null,
          indent: 0,
          col: 0
        };
      },
      token: function(stream, state) {
        if (stream.sol()) {
          if (state.context && (state.context.align == null)) {
            state.context.align = false;
          }
          state.indent = stream.indentation();
        }
        if (stream.eatSpace()) {
          return null;
        }
        var style = state.tokenize(stream, state);
        if (style !== "comment" && state.context && (state.context.align == null) && state.context.type !== "pattern") {
          state.context.align = true;
        }
        if (curPunc === "(") {
          pushContext(state, ")", stream.column());
        } else if (curPunc === "[") {
          pushContext(state, "]", stream.column());
        } else if (curPunc === "{") {
          pushContext(state, "}", stream.column());
        } else if (/[\]\}\)]/.test(curPunc)) {
          while (state.context && state.context.type === "pattern") {
            popContext(state);
          }
          if (state.context && curPunc === state.context.type) {
            popContext(state);
          }
        } else if (curPunc === "." && state.context && state.context.type === "pattern") {
          popContext(state);
        } else if (/atom|string|variable/.test(style) && state.context) {
          if (/[\}\]]/.test(state.context.type)) {
            pushContext(state, "pattern", stream.column());
          } else if (state.context.type === "pattern" && !state.context.align) {
            state.context.align = true;
            state.context.col = stream.column();
          }
        }
        return style;
      },
      indent: function(state, textAfter) {
        var firstChar = textAfter && textAfter.charAt(0);
        var context = state.context;
        if (/[\]\}]/.test(firstChar)) {
          while (context && context.type === "pattern") {
            context = context.prev;
          }
        }
        var closing = context && firstChar === context.type;
        if (!context) return 0;
        if (context.type === "keywords") return CodeMirror.commands.newlineAndIndent;
        if (context.align) return context.col + (closing ? 0 : 1);
        return context.indent + (closing ? 0 : indentUnit);
      }
    };
  });

  CodeMirror.modeExtensions["cypher"] = {
    autoFormatLineBreaks: function(text) {
      var i, lines, reProcessedPortion;
      var lines = text.split("\n");
      var reProcessedPortion = /\s+\b(return|where|order by|match|with|skip|limit|create|delete|set)\b\s/g;
      for (var i = 0; i < lines.length; i++)
        lines[i] = lines[i].replace(reProcessedPortion, " \n$1 ").trim();
      return lines.join("\n");
    }
  };

  CodeMirror.defineMIME("application/x-cypher-query", "cypher");

});
codemirror/mode/cypher/index.html000064400000003564151215013510013126 0ustar00<!doctype html>

<title>CodeMirror: Cypher Mode for CodeMirror</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css" />
<link rel="stylesheet" href="../../theme/neo.css" />
<script src="../../lib/codemirror.js"></script>
<script src="cypher.js"></script>
<style>
.CodeMirror {
    border-top: 1px solid black;
    border-bottom: 1px solid black;
}
        </style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Cypher Mode for CodeMirror</a>
  </ul>
</div>

<article>
<h2>Cypher Mode for CodeMirror</h2>
<form>
            <textarea id="code" name="code">// Cypher Mode for CodeMirror, using the neo theme
MATCH (joe { name: 'Joe' })-[:knows*2..2]-(friend_of_friend)
WHERE NOT (joe)-[:knows]-(friend_of_friend)
RETURN friend_of_friend.name, COUNT(*)
ORDER BY COUNT(*) DESC , friend_of_friend.name
</textarea>
            </form>
            <p><strong>MIME types defined:</strong> 
            <code><a href="?mime=application/x-cypher-query">application/x-cypher-query</a></code>
        </p>
<script>
window.onload = function() {
  var mime = 'application/x-cypher-query';
  // get mime type
  if (window.location.href.indexOf('mime=') > -1) {
    mime = window.location.href.substr(window.location.href.indexOf('mime=') + 5);
  }
  window.editor = CodeMirror.fromTextArea(document.getElementById('code'), {
    mode: mime,
    indentWithTabs: true,
    smartIndent: true,
    lineNumbers: true,
    matchBrackets : true,
    autofocus: true,
    theme: 'neo'
  });
};
</script>

</article>
codemirror/mode/ntriples/ntriples.js000064400000014763151215013510013700 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

/**********************************************************
* This script provides syntax highlighting support for
* the Ntriples format.
* Ntriples format specification:
*     http://www.w3.org/TR/rdf-testcases/#ntriples
***********************************************************/

/*
    The following expression defines the defined ASF grammar transitions.

    pre_subject ->
        {
        ( writing_subject_uri | writing_bnode_uri )
            -> pre_predicate
                -> writing_predicate_uri
                    -> pre_object
                        -> writing_object_uri | writing_object_bnode |
                          (
                            writing_object_literal
                                -> writing_literal_lang | writing_literal_type
                          )
                            -> post_object
                                -> BEGIN
         } otherwise {
             -> ERROR
         }
*/

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("ntriples", function() {

  var Location = {
    PRE_SUBJECT         : 0,
    WRITING_SUB_URI     : 1,
    WRITING_BNODE_URI   : 2,
    PRE_PRED            : 3,
    WRITING_PRED_URI    : 4,
    PRE_OBJ             : 5,
    WRITING_OBJ_URI     : 6,
    WRITING_OBJ_BNODE   : 7,
    WRITING_OBJ_LITERAL : 8,
    WRITING_LIT_LANG    : 9,
    WRITING_LIT_TYPE    : 10,
    POST_OBJ            : 11,
    ERROR               : 12
  };
  function transitState(currState, c) {
    var currLocation = currState.location;
    var ret;

    // Opening.
    if     (currLocation == Location.PRE_SUBJECT && c == '<') ret = Location.WRITING_SUB_URI;
    else if(currLocation == Location.PRE_SUBJECT && c == '_') ret = Location.WRITING_BNODE_URI;
    else if(currLocation == Location.PRE_PRED    && c == '<') ret = Location.WRITING_PRED_URI;
    else if(currLocation == Location.PRE_OBJ     && c == '<') ret = Location.WRITING_OBJ_URI;
    else if(currLocation == Location.PRE_OBJ     && c == '_') ret = Location.WRITING_OBJ_BNODE;
    else if(currLocation == Location.PRE_OBJ     && c == '"') ret = Location.WRITING_OBJ_LITERAL;

    // Closing.
    else if(currLocation == Location.WRITING_SUB_URI     && c == '>') ret = Location.PRE_PRED;
    else if(currLocation == Location.WRITING_BNODE_URI   && c == ' ') ret = Location.PRE_PRED;
    else if(currLocation == Location.WRITING_PRED_URI    && c == '>') ret = Location.PRE_OBJ;
    else if(currLocation == Location.WRITING_OBJ_URI     && c == '>') ret = Location.POST_OBJ;
    else if(currLocation == Location.WRITING_OBJ_BNODE   && c == ' ') ret = Location.POST_OBJ;
    else if(currLocation == Location.WRITING_OBJ_LITERAL && c == '"') ret = Location.POST_OBJ;
    else if(currLocation == Location.WRITING_LIT_LANG && c == ' ') ret = Location.POST_OBJ;
    else if(currLocation == Location.WRITING_LIT_TYPE && c == '>') ret = Location.POST_OBJ;

    // Closing typed and language literal.
    else if(currLocation == Location.WRITING_OBJ_LITERAL && c == '@') ret = Location.WRITING_LIT_LANG;
    else if(currLocation == Location.WRITING_OBJ_LITERAL && c == '^') ret = Location.WRITING_LIT_TYPE;

    // Spaces.
    else if( c == ' ' &&
             (
               currLocation == Location.PRE_SUBJECT ||
               currLocation == Location.PRE_PRED    ||
               currLocation == Location.PRE_OBJ     ||
               currLocation == Location.POST_OBJ
             )
           ) ret = currLocation;

    // Reset.
    else if(currLocation == Location.POST_OBJ && c == '.') ret = Location.PRE_SUBJECT;

    // Error
    else ret = Location.ERROR;

    currState.location=ret;
  }

  return {
    startState: function() {
       return {
           location : Location.PRE_SUBJECT,
           uris     : [],
           anchors  : [],
           bnodes   : [],
           langs    : [],
           types    : []
       };
    },
    token: function(stream, state) {
      var ch = stream.next();
      if(ch == '<') {
         transitState(state, ch);
         var parsedURI = '';
         stream.eatWhile( function(c) { if( c != '#' && c != '>' ) { parsedURI += c; return true; } return false;} );
         state.uris.push(parsedURI);
         if( stream.match('#', false) ) return 'variable';
         stream.next();
         transitState(state, '>');
         return 'variable';
      }
      if(ch == '#') {
        var parsedAnchor = '';
        stream.eatWhile(function(c) { if(c != '>' && c != ' ') { parsedAnchor+= c; return true; } return false;});
        state.anchors.push(parsedAnchor);
        return 'variable-2';
      }
      if(ch == '>') {
          transitState(state, '>');
          return 'variable';
      }
      if(ch == '_') {
          transitState(state, ch);
          var parsedBNode = '';
          stream.eatWhile(function(c) { if( c != ' ' ) { parsedBNode += c; return true; } return false;});
          state.bnodes.push(parsedBNode);
          stream.next();
          transitState(state, ' ');
          return 'builtin';
      }
      if(ch == '"') {
          transitState(state, ch);
          stream.eatWhile( function(c) { return c != '"'; } );
          stream.next();
          if( stream.peek() != '@' && stream.peek() != '^' ) {
              transitState(state, '"');
          }
          return 'string';
      }
      if( ch == '@' ) {
          transitState(state, '@');
          var parsedLang = '';
          stream.eatWhile(function(c) { if( c != ' ' ) { parsedLang += c; return true; } return false;});
          state.langs.push(parsedLang);
          stream.next();
          transitState(state, ' ');
          return 'string-2';
      }
      if( ch == '^' ) {
          stream.next();
          transitState(state, '^');
          var parsedType = '';
          stream.eatWhile(function(c) { if( c != '>' ) { parsedType += c; return true; } return false;} );
          state.types.push(parsedType);
          stream.next();
          transitState(state, '>');
          return 'variable';
      }
      if( ch == ' ' ) {
          transitState(state, ch);
      }
      if( ch == '.' ) {
          transitState(state, ch);
      }
    }
  };
});

CodeMirror.defineMIME("text/n-triples", "ntriples");

});
codemirror/mode/ntriples/index.html000064400000002515151215013510013467 0ustar00<!doctype html>

<title>CodeMirror: NTriples mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="ntriples.js"></script>
<style type="text/css">
      .CodeMirror {
        border: 1px solid #eee;
      }
    </style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">NTriples</a>
  </ul>
</div>

<article>
<h2>NTriples mode</h2>
<form>
<textarea id="ntriples" name="ntriples">    
<http://Sub1>     <http://pred1>     <http://obj> .
<http://Sub2>     <http://pred2#an2> "literal 1" .
<http://Sub3#an3> <http://pred3>     _:bnode3 .
_:bnode4          <http://pred4>     "literal 2"@lang .
_:bnode5          <http://pred5>     "literal 3"^^<http://type> .
</textarea>
</form>

    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("ntriples"), {});
    </script>
    <p><strong>MIME types defined:</strong> <code>text/n-triples</code>.</p>
  </article>
codemirror/mode/perl/perl.js000064400000155521151215013510012102 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

// CodeMirror2 mode/perl/perl.js (text/x-perl) beta 0.10 (2011-11-08)
// This is a part of CodeMirror from https://github.com/sabaca/CodeMirror_mode_perl (mail@sabaca.com)

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("perl",function(){
        // http://perldoc.perl.org
        var PERL={                                      //   null - magic touch
                                                        //   1 - keyword
                                                        //   2 - def
                                                        //   3 - atom
                                                        //   4 - operator
                                                        //   5 - variable-2 (predefined)
                                                        //   [x,y] - x=1,2,3; y=must be defined if x{...}
                                                //      PERL operators
                '->'                            :   4,
                '++'                            :   4,
                '--'                            :   4,
                '**'                            :   4,
                                                        //   ! ~ \ and unary + and -
                '=~'                            :   4,
                '!~'                            :   4,
                '*'                             :   4,
                '/'                             :   4,
                '%'                             :   4,
                'x'                             :   4,
                '+'                             :   4,
                '-'                             :   4,
                '.'                             :   4,
                '<<'                            :   4,
                '>>'                            :   4,
                                                        //   named unary operators
                '<'                             :   4,
                '>'                             :   4,
                '<='                            :   4,
                '>='                            :   4,
                'lt'                            :   4,
                'gt'                            :   4,
                'le'                            :   4,
                'ge'                            :   4,
                '=='                            :   4,
                '!='                            :   4,
                '<=>'                           :   4,
                'eq'                            :   4,
                'ne'                            :   4,
                'cmp'                           :   4,
                '~~'                            :   4,
                '&'                             :   4,
                '|'                             :   4,
                '^'                             :   4,
                '&&'                            :   4,
                '||'                            :   4,
                '//'                            :   4,
                '..'                            :   4,
                '...'                           :   4,
                '?'                             :   4,
                ':'                             :   4,
                '='                             :   4,
                '+='                            :   4,
                '-='                            :   4,
                '*='                            :   4,  //   etc. ???
                ','                             :   4,
                '=>'                            :   4,
                '::'                            :   4,
                                                        //   list operators (rightward)
                'not'                           :   4,
                'and'                           :   4,
                'or'                            :   4,
                'xor'                           :   4,
                                                //      PERL predefined variables (I know, what this is a paranoid idea, but may be needed for people, who learn PERL, and for me as well, ...and may be for you?;)
                'BEGIN'                         :   [5,1],
                'END'                           :   [5,1],
                'PRINT'                         :   [5,1],
                'PRINTF'                        :   [5,1],
                'GETC'                          :   [5,1],
                'READ'                          :   [5,1],
                'READLINE'                      :   [5,1],
                'DESTROY'                       :   [5,1],
                'TIE'                           :   [5,1],
                'TIEHANDLE'                     :   [5,1],
                'UNTIE'                         :   [5,1],
                'STDIN'                         :    5,
                'STDIN_TOP'                     :    5,
                'STDOUT'                        :    5,
                'STDOUT_TOP'                    :    5,
                'STDERR'                        :    5,
                'STDERR_TOP'                    :    5,
                '$ARG'                          :    5,
                '$_'                            :    5,
                '@ARG'                          :    5,
                '@_'                            :    5,
                '$LIST_SEPARATOR'               :    5,
                '$"'                            :    5,
                '$PROCESS_ID'                   :    5,
                '$PID'                          :    5,
                '$$'                            :    5,
                '$REAL_GROUP_ID'                :    5,
                '$GID'                          :    5,
                'jQuery('                            :    5,
                '$EFFECTIVE_GROUP_ID'           :    5,
                '$EGID'                         :    5,
                '$)'                            :    5,
                '$PROGRAM_NAME'                 :    5,
                '$0'                            :    5,
                '$SUBSCRIPT_SEPARATOR'          :    5,
                '$SUBSEP'                       :    5,
                '$;'                            :    5,
                '$REAL_USER_ID'                 :    5,
                '$UID'                          :    5,
                '$<'                            :    5,
                '$EFFECTIVE_USER_ID'            :    5,
                '$EUID'                         :    5,
                '$>'                            :    5,
                '$a'                            :    5,
                '$b'                            :    5,
                '$COMPILING'                    :    5,
                '$^C'                           :    5,
                '$DEBUGGING'                    :    5,
                '$^D'                           :    5,
                '${^ENCODING}'                  :    5,
                '$ENV'                          :    5,
                '%ENV'                          :    5,
                '$SYSTEM_FD_MAX'                :    5,
                '$^F'                           :    5,
                '@F'                            :    5,
                '${^GLOBAL_PHASE}'              :    5,
                '$^H'                           :    5,
                '%^H'                           :    5,
                '@INC'                          :    5,
                '%INC'                          :    5,
                '$INPLACE_EDIT'                 :    5,
                '$^I'                           :    5,
                '$^M'                           :    5,
                '$OSNAME'                       :    5,
                '$^O'                           :    5,
                '${^OPEN}'                      :    5,
                '$PERLDB'                       :    5,
                '$^P'                           :    5,
                '$SIG'                          :    5,
                '%SIG'                          :    5,
                '$BASETIME'                     :    5,
                '$^T'                           :    5,
                '${^TAINT}'                     :    5,
                '${^UNICODE}'                   :    5,
                '${^UTF8CACHE}'                 :    5,
                '${^UTF8LOCALE}'                :    5,
                '$PERL_VERSION'                 :    5,
                '$^V'                           :    5,
                '${^WIN32_SLOPPY_STAT}'         :    5,
                '$EXECUTABLE_NAME'              :    5,
                '$^X'                           :    5,
                '$1'                            :    5, // - regexp $1, $2...
                '$MATCH'                        :    5,
                '$&'                            :    5,
                '${^MATCH}'                     :    5,
                '$PREMATCH'                     :    5,
                '$`'                            :    5,
                '${^PREMATCH}'                  :    5,
                '$POSTMATCH'                    :    5,
                "$'"                            :    5,
                '${^POSTMATCH}'                 :    5,
                '$LAST_PAREN_MATCH'             :    5,
                '$+'                            :    5,
                '$LAST_SUBMATCH_RESULT'         :    5,
                '$^N'                           :    5,
                '@LAST_MATCH_END'               :    5,
                '@+'                            :    5,
                '%LAST_PAREN_MATCH'             :    5,
                '%+'                            :    5,
                '@LAST_MATCH_START'             :    5,
                '@-'                            :    5,
                '%LAST_MATCH_START'             :    5,
                '%-'                            :    5,
                '$LAST_REGEXP_CODE_RESULT'      :    5,
                '$^R'                           :    5,
                '${^RE_DEBUG_FLAGS}'            :    5,
                '${^RE_TRIE_MAXBUF}'            :    5,
                '$ARGV'                         :    5,
                '@ARGV'                         :    5,
                'ARGV'                          :    5,
                'ARGVOUT'                       :    5,
                '$OUTPUT_FIELD_SEPARATOR'       :    5,
                '$OFS'                          :    5,
                '$,'                            :    5,
                '$INPUT_LINE_NUMBER'            :    5,
                '$NR'                           :    5,
                'jQuery.'                            :    5,
                '$INPUT_RECORD_SEPARATOR'       :    5,
                '$RS'                           :    5,
                '$/'                            :    5,
                '$OUTPUT_RECORD_SEPARATOR'      :    5,
                '$ORS'                          :    5,
                '$\\'                           :    5,
                '$OUTPUT_AUTOFLUSH'             :    5,
                '$|'                            :    5,
                '$ACCUMULATOR'                  :    5,
                '$^A'                           :    5,
                '$FORMAT_FORMFEED'              :    5,
                '$^L'                           :    5,
                '$FORMAT_PAGE_NUMBER'           :    5,
                '$%'                            :    5,
                '$FORMAT_LINES_LEFT'            :    5,
                '$-'                            :    5,
                '$FORMAT_LINE_BREAK_CHARACTERS' :    5,
                '$:'                            :    5,
                '$FORMAT_LINES_PER_PAGE'        :    5,
                '$='                            :    5,
                '$FORMAT_TOP_NAME'              :    5,
                '$^'                            :    5,
                '$FORMAT_NAME'                  :    5,
                '$~'                            :    5,
                '${^CHILD_ERROR_NATIVE}'        :    5,
                '$EXTENDED_OS_ERROR'            :    5,
                '$^E'                           :    5,
                '$EXCEPTIONS_BEING_CAUGHT'      :    5,
                '$^S'                           :    5,
                '$WARNING'                      :    5,
                '$^W'                           :    5,
                '${^WARNING_BITS}'              :    5,
                '$OS_ERROR'                     :    5,
                '$ERRNO'                        :    5,
                '$!'                            :    5,
                '%OS_ERROR'                     :    5,
                '%ERRNO'                        :    5,
                '%!'                            :    5,
                '$CHILD_ERROR'                  :    5,
                '$?'                            :    5,
                '$EVAL_ERROR'                   :    5,
                '$@'                            :    5,
                '$OFMT'                         :    5,
                '$#'                            :    5,
                '$*'                            :    5,
                '$ARRAY_BASE'                   :    5,
                '$['                            :    5,
                '$OLD_PERL_VERSION'             :    5,
                '$]'                            :    5,
                                                //      PERL blocks
                'if'                            :[1,1],
                elsif                           :[1,1],
                'else'                          :[1,1],
                'while'                         :[1,1],
                unless                          :[1,1],
                'for'                           :[1,1],
                foreach                         :[1,1],
                                                //      PERL functions
                'abs'                           :1,     // - absolute value function
                accept                          :1,     // - accept an incoming socket connect
                alarm                           :1,     // - schedule a SIGALRM
                'atan2'                         :1,     // - arctangent of Y/X in the range -PI to PI
                bind                            :1,     // - binds an address to a socket
                binmode                         :1,     // - prepare binary files for I/O
                bless                           :1,     // - create an object
                bootstrap                       :1,     //
                'break'                         :1,     // - break out of a "given" block
                caller                          :1,     // - get context of the current subroutine call
                chdir                           :1,     // - change your current working directory
                chmod                           :1,     // - changes the permissions on a list of files
                chomp                           :1,     // - remove a trailing record separator from a string
                chop                            :1,     // - remove the last character from a string
                chown                           :1,     // - change the ownership on a list of files
                chr                             :1,     // - get character this number represents
                chroot                          :1,     // - make directory new root for path lookups
                close                           :1,     // - close file (or pipe or socket) handle
                closedir                        :1,     // - close directory handle
                connect                         :1,     // - connect to a remote socket
                'continue'                      :[1,1], // - optional trailing block in a while or foreach
                'cos'                           :1,     // - cosine function
                crypt                           :1,     // - one-way passwd-style encryption
                dbmclose                        :1,     // - breaks binding on a tied dbm file
                dbmopen                         :1,     // - create binding on a tied dbm file
                'default'                       :1,     //
                defined                         :1,     // - test whether a value, variable, or function is defined
                'delete'                        :1,     // - deletes a value from a hash
                die                             :1,     // - raise an exception or bail out
                'do'                            :1,     // - turn a BLOCK into a TERM
                dump                            :1,     // - create an immediate core dump
                each                            :1,     // - retrieve the next key/value pair from a hash
                endgrent                        :1,     // - be done using group file
                endhostent                      :1,     // - be done using hosts file
                endnetent                       :1,     // - be done using networks file
                endprotoent                     :1,     // - be done using protocols file
                endpwent                        :1,     // - be done using passwd file
                endservent                      :1,     // - be done using services file
                eof                             :1,     // - test a filehandle for its end
                'eval'                          :1,     // - catch exceptions or compile and run code
                'exec'                          :1,     // - abandon this program to run another
                exists                          :1,     // - test whether a hash key is present
                exit                            :1,     // - terminate this program
                'exp'                           :1,     // - raise I to a power
                fcntl                           :1,     // - file control system call
                fileno                          :1,     // - return file descriptor from filehandle
                flock                           :1,     // - lock an entire file with an advisory lock
                fork                            :1,     // - create a new process just like this one
                format                          :1,     // - declare a picture format with use by the write() function
                formline                        :1,     // - internal function used for formats
                getc                            :1,     // - get the next character from the filehandle
                getgrent                        :1,     // - get next group record
                getgrgid                        :1,     // - get group record given group user ID
                getgrnam                        :1,     // - get group record given group name
                gethostbyaddr                   :1,     // - get host record given its address
                gethostbyname                   :1,     // - get host record given name
                gethostent                      :1,     // - get next hosts record
                getlogin                        :1,     // - return who logged in at this tty
                getnetbyaddr                    :1,     // - get network record given its address
                getnetbyname                    :1,     // - get networks record given name
                getnetent                       :1,     // - get next networks record
                getpeername                     :1,     // - find the other end of a socket connection
                getpgrp                         :1,     // - get process group
                getppid                         :1,     // - get parent process ID
                getpriority                     :1,     // - get current nice value
                getprotobyname                  :1,     // - get protocol record given name
                getprotobynumber                :1,     // - get protocol record numeric protocol
                getprotoent                     :1,     // - get next protocols record
                getpwent                        :1,     // - get next passwd record
                getpwnam                        :1,     // - get passwd record given user login name
                getpwuid                        :1,     // - get passwd record given user ID
                getservbyname                   :1,     // - get services record given its name
                getservbyport                   :1,     // - get services record given numeric port
                getservent                      :1,     // - get next services record
                getsockname                     :1,     // - retrieve the sockaddr for a given socket
                getsockopt                      :1,     // - get socket options on a given socket
                given                           :1,     //
                glob                            :1,     // - expand filenames using wildcards
                gmtime                          :1,     // - convert UNIX time into record or string using Greenwich time
                'goto'                          :1,     // - create spaghetti code
                grep                            :1,     // - locate elements in a list test true against a given criterion
                hex                             :1,     // - convert a string to a hexadecimal number
                'import'                        :1,     // - patch a module's namespace into your own
                index                           :1,     // - find a substring within a string
                'int'                           :1,     // - get the integer portion of a number
                ioctl                           :1,     // - system-dependent device control system call
                'join'                          :1,     // - join a list into a string using a separator
                keys                            :1,     // - retrieve list of indices from a hash
                kill                            :1,     // - send a signal to a process or process group
                last                            :1,     // - exit a block prematurely
                lc                              :1,     // - return lower-case version of a string
                lcfirst                         :1,     // - return a string with just the next letter in lower case
                length                          :1,     // - return the number of bytes in a string
                'link'                          :1,     // - create a hard link in the filesytem
                listen                          :1,     // - register your socket as a server
                local                           : 2,    // - create a temporary value for a global variable (dynamic scoping)
                localtime                       :1,     // - convert UNIX time into record or string using local time
                lock                            :1,     // - get a thread lock on a variable, subroutine, or method
                'log'                           :1,     // - retrieve the natural logarithm for a number
                lstat                           :1,     // - stat a symbolic link
                m                               :null,  // - match a string with a regular expression pattern
                map                             :1,     // - apply a change to a list to get back a new list with the changes
                mkdir                           :1,     // - create a directory
                msgctl                          :1,     // - SysV IPC message control operations
                msgget                          :1,     // - get SysV IPC message queue
                msgrcv                          :1,     // - receive a SysV IPC message from a message queue
                msgsnd                          :1,     // - send a SysV IPC message to a message queue
                my                              : 2,    // - declare and assign a local variable (lexical scoping)
                'new'                           :1,     //
                next                            :1,     // - iterate a block prematurely
                no                              :1,     // - unimport some module symbols or semantics at compile time
                oct                             :1,     // - convert a string to an octal number
                open                            :1,     // - open a file, pipe, or descriptor
                opendir                         :1,     // - open a directory
                ord                             :1,     // - find a character's numeric representation
                our                             : 2,    // - declare and assign a package variable (lexical scoping)
                pack                            :1,     // - convert a list into a binary representation
                'package'                       :1,     // - declare a separate global namespace
                pipe                            :1,     // - open a pair of connected filehandles
                pop                             :1,     // - remove the last element from an array and return it
                pos                             :1,     // - find or set the offset for the last/next m//g search
                print                           :1,     // - output a list to a filehandle
                printf                          :1,     // - output a formatted list to a filehandle
                prototype                       :1,     // - get the prototype (if any) of a subroutine
                push                            :1,     // - append one or more elements to an array
                q                               :null,  // - singly quote a string
                qq                              :null,  // - doubly quote a string
                qr                              :null,  // - Compile pattern
                quotemeta                       :null,  // - quote regular expression magic characters
                qw                              :null,  // - quote a list of words
                qx                              :null,  // - backquote quote a string
                rand                            :1,     // - retrieve the next pseudorandom number
                read                            :1,     // - fixed-length buffered input from a filehandle
                readdir                         :1,     // - get a directory from a directory handle
                readline                        :1,     // - fetch a record from a file
                readlink                        :1,     // - determine where a symbolic link is pointing
                readpipe                        :1,     // - execute a system command and collect standard output
                recv                            :1,     // - receive a message over a Socket
                redo                            :1,     // - start this loop iteration over again
                ref                             :1,     // - find out the type of thing being referenced
                rename                          :1,     // - change a filename
                require                         :1,     // - load in external functions from a library at runtime
                reset                           :1,     // - clear all variables of a given name
                'return'                        :1,     // - get out of a function early
                reverse                         :1,     // - flip a string or a list
                rewinddir                       :1,     // - reset directory handle
                rindex                          :1,     // - right-to-left substring search
                rmdir                           :1,     // - remove a directory
                s                               :null,  // - replace a pattern with a string
                say                             :1,     // - print with newline
                scalar                          :1,     // - force a scalar context
                seek                            :1,     // - reposition file pointer for random-access I/O
                seekdir                         :1,     // - reposition directory pointer
                select                          :1,     // - reset default output or do I/O multiplexing
                semctl                          :1,     // - SysV semaphore control operations
                semget                          :1,     // - get set of SysV semaphores
                semop                           :1,     // - SysV semaphore operations
                send                            :1,     // - send a message over a socket
                setgrent                        :1,     // - prepare group file for use
                sethostent                      :1,     // - prepare hosts file for use
                setnetent                       :1,     // - prepare networks file for use
                setpgrp                         :1,     // - set the process group of a process
                setpriority                     :1,     // - set a process's nice value
                setprotoent                     :1,     // - prepare protocols file for use
                setpwent                        :1,     // - prepare passwd file for use
                setservent                      :1,     // - prepare services file for use
                setsockopt                      :1,     // - set some socket options
                shift                           :1,     // - remove the first element of an array, and return it
                shmctl                          :1,     // - SysV shared memory operations
                shmget                          :1,     // - get SysV shared memory segment identifier
                shmread                         :1,     // - read SysV shared memory
                shmwrite                        :1,     // - write SysV shared memory
                shutdown                        :1,     // - close down just half of a socket connection
                'sin'                           :1,     // - return the sine of a number
                sleep                           :1,     // - block for some number of seconds
                socket                          :1,     // - create a socket
                socketpair                      :1,     // - create a pair of sockets
                'sort'                          :1,     // - sort a list of values
                splice                          :1,     // - add or remove elements anywhere in an array
                'split'                         :1,     // - split up a string using a regexp delimiter
                sprintf                         :1,     // - formatted print into a string
                'sqrt'                          :1,     // - square root function
                srand                           :1,     // - seed the random number generator
                stat                            :1,     // - get a file's status information
                state                           :1,     // - declare and assign a state variable (persistent lexical scoping)
                study                           :1,     // - optimize input data for repeated searches
                'sub'                           :1,     // - declare a subroutine, possibly anonymously
                'substr'                        :1,     // - get or alter a portion of a stirng
                symlink                         :1,     // - create a symbolic link to a file
                syscall                         :1,     // - execute an arbitrary system call
                sysopen                         :1,     // - open a file, pipe, or descriptor
                sysread                         :1,     // - fixed-length unbuffered input from a filehandle
                sysseek                         :1,     // - position I/O pointer on handle used with sysread and syswrite
                system                          :1,     // - run a separate program
                syswrite                        :1,     // - fixed-length unbuffered output to a filehandle
                tell                            :1,     // - get current seekpointer on a filehandle
                telldir                         :1,     // - get current seekpointer on a directory handle
                tie                             :1,     // - bind a variable to an object class
                tied                            :1,     // - get a reference to the object underlying a tied variable
                time                            :1,     // - return number of seconds since 1970
                times                           :1,     // - return elapsed time for self and child processes
                tr                              :null,  // - transliterate a string
                truncate                        :1,     // - shorten a file
                uc                              :1,     // - return upper-case version of a string
                ucfirst                         :1,     // - return a string with just the next letter in upper case
                umask                           :1,     // - set file creation mode mask
                undef                           :1,     // - remove a variable or function definition
                unlink                          :1,     // - remove one link to a file
                unpack                          :1,     // - convert binary structure into normal perl variables
                unshift                         :1,     // - prepend more elements to the beginning of a list
                untie                           :1,     // - break a tie binding to a variable
                use                             :1,     // - load in a module at compile time
                utime                           :1,     // - set a file's last access and modify times
                values                          :1,     // - return a list of the values in a hash
                vec                             :1,     // - test or set particular bits in a string
                wait                            :1,     // - wait for any child process to die
                waitpid                         :1,     // - wait for a particular child process to die
                wantarray                       :1,     // - get void vs scalar vs list context of current subroutine call
                warn                            :1,     // - print debugging info
                when                            :1,     //
                write                           :1,     // - print a picture record
                y                               :null}; // - transliterate a string

        var RXstyle="string-2";
        var RXmodifiers=/[goseximacplud]/;              // NOTE: "m", "s", "y" and "tr" need to correct real modifiers for each regexp type

        function tokenChain(stream,state,chain,style,tail){     // NOTE: chain.length > 2 is not working now (it's for s[...][...]geos;)
                state.chain=null;                               //                                                          12   3tail
                state.style=null;
                state.tail=null;
                state.tokenize=function(stream,state){
                        var e=false,c,i=0;
                        while(c=stream.next()){
                                if(c===chain[i]&&!e){
                                        if(chain[++i]!==undefined){
                                                state.chain=chain[i];
                                                state.style=style;
                                                state.tail=tail;}
                                        else if(tail)
                                                stream.eatWhile(tail);
                                        state.tokenize=tokenPerl;
                                        return style;}
                                e=!e&&c=="\\";}
                        return style;};
                return state.tokenize(stream,state);}

        function tokenSOMETHING(stream,state,string){
                state.tokenize=function(stream,state){
                        if(stream.string==string)
                                state.tokenize=tokenPerl;
                        stream.skipToEnd();
                        return "string";};
                return state.tokenize(stream,state);}

        function tokenPerl(stream,state){
                if(stream.eatSpace())
                        return null;
                if(state.chain)
                        return tokenChain(stream,state,state.chain,state.style,state.tail);
                if(stream.match(/^\-?[\d\.]/,false))
                        if(stream.match(/^(\-?(\d*\.\d+(e[+-]?\d+)?|\d+\.\d*)|0x[\da-fA-F]+|0b[01]+|\d+(e[+-]?\d+)?)/))
                                return 'number';
                if(stream.match(/^<<(?=\w)/)){                  // NOTE: <<SOMETHING\n...\nSOMETHING\n
                        stream.eatWhile(/\w/);
                        return tokenSOMETHING(stream,state,stream.current().substr(2));}
                if(stream.sol()&&stream.match(/^\=item(?!\w)/)){// NOTE: \n=item...\n=cut\n
                        return tokenSOMETHING(stream,state,'=cut');}
                var ch=stream.next();
                if(ch=='"'||ch=="'"){                           // NOTE: ' or " or <<'SOMETHING'\n...\nSOMETHING\n or <<"SOMETHING"\n...\nSOMETHING\n
                        if(prefix(stream, 3)=="<<"+ch){
                                var p=stream.pos;
                                stream.eatWhile(/\w/);
                                var n=stream.current().substr(1);
                                if(n&&stream.eat(ch))
                                        return tokenSOMETHING(stream,state,n);
                                stream.pos=p;}
                        return tokenChain(stream,state,[ch],"string");}
                if(ch=="q"){
                        var c=look(stream, -2);
                        if(!(c&&/\w/.test(c))){
                                c=look(stream, 0);
                                if(c=="x"){
                                        c=look(stream, 1);
                                        if(c=="("){
                                                eatSuffix(stream, 2);
                                                return tokenChain(stream,state,[")"],RXstyle,RXmodifiers);}
                                        if(c=="["){
                                                eatSuffix(stream, 2);
                                                return tokenChain(stream,state,["]"],RXstyle,RXmodifiers);}
                                        if(c=="{"){
                                                eatSuffix(stream, 2);
                                                return tokenChain(stream,state,["}"],RXstyle,RXmodifiers);}
                                        if(c=="<"){
                                                eatSuffix(stream, 2);
                                                return tokenChain(stream,state,[">"],RXstyle,RXmodifiers);}
                                        if(/[\^'"!~\/]/.test(c)){
                                                eatSuffix(stream, 1);
                                                return tokenChain(stream,state,[stream.eat(c)],RXstyle,RXmodifiers);}}
                                else if(c=="q"){
                                        c=look(stream, 1);
                                        if(c=="("){
                                                eatSuffix(stream, 2);
                                                return tokenChain(stream,state,[")"],"string");}
                                        if(c=="["){
                                                eatSuffix(stream, 2);
                                                return tokenChain(stream,state,["]"],"string");}
                                        if(c=="{"){
                                                eatSuffix(stream, 2);
                                                return tokenChain(stream,state,["}"],"string");}
                                        if(c=="<"){
                                                eatSuffix(stream, 2);
                                                return tokenChain(stream,state,[">"],"string");}
                                        if(/[\^'"!~\/]/.test(c)){
                                                eatSuffix(stream, 1);
                                                return tokenChain(stream,state,[stream.eat(c)],"string");}}
                                else if(c=="w"){
                                        c=look(stream, 1);
                                        if(c=="("){
                                                eatSuffix(stream, 2);
                                                return tokenChain(stream,state,[")"],"bracket");}
                                        if(c=="["){
                                                eatSuffix(stream, 2);
                                                return tokenChain(stream,state,["]"],"bracket");}
                                        if(c=="{"){
                                                eatSuffix(stream, 2);
                                                return tokenChain(stream,state,["}"],"bracket");}
                                        if(c=="<"){
                                                eatSuffix(stream, 2);
                                                return tokenChain(stream,state,[">"],"bracket");}
                                        if(/[\^'"!~\/]/.test(c)){
                                                eatSuffix(stream, 1);
                                                return tokenChain(stream,state,[stream.eat(c)],"bracket");}}
                                else if(c=="r"){
                                        c=look(stream, 1);
                                        if(c=="("){
                                                eatSuffix(stream, 2);
                                                return tokenChain(stream,state,[")"],RXstyle,RXmodifiers);}
                                        if(c=="["){
                                                eatSuffix(stream, 2);
                                                return tokenChain(stream,state,["]"],RXstyle,RXmodifiers);}
                                        if(c=="{"){
                                                eatSuffix(stream, 2);
                                                return tokenChain(stream,state,["}"],RXstyle,RXmodifiers);}
                                        if(c=="<"){
                                                eatSuffix(stream, 2);
                                                return tokenChain(stream,state,[">"],RXstyle,RXmodifiers);}
                                        if(/[\^'"!~\/]/.test(c)){
                                                eatSuffix(stream, 1);
                                                return tokenChain(stream,state,[stream.eat(c)],RXstyle,RXmodifiers);}}
                                else if(/[\^'"!~\/(\[{<]/.test(c)){
                                        if(c=="("){
                                                eatSuffix(stream, 1);
                                                return tokenChain(stream,state,[")"],"string");}
                                        if(c=="["){
                                                eatSuffix(stream, 1);
                                                return tokenChain(stream,state,["]"],"string");}
                                        if(c=="{"){
                                                eatSuffix(stream, 1);
                                                return tokenChain(stream,state,["}"],"string");}
                                        if(c=="<"){
                                                eatSuffix(stream, 1);
                                                return tokenChain(stream,state,[">"],"string");}
                                        if(/[\^'"!~\/]/.test(c)){
                                                return tokenChain(stream,state,[stream.eat(c)],"string");}}}}
                if(ch=="m"){
                        var c=look(stream, -2);
                        if(!(c&&/\w/.test(c))){
                                c=stream.eat(/[(\[{<\^'"!~\/]/);
                                if(c){
                                        if(/[\^'"!~\/]/.test(c)){
                                                return tokenChain(stream,state,[c],RXstyle,RXmodifiers);}
                                        if(c=="("){
                                                return tokenChain(stream,state,[")"],RXstyle,RXmodifiers);}
                                        if(c=="["){
                                                return tokenChain(stream,state,["]"],RXstyle,RXmodifiers);}
                                        if(c=="{"){
                                                return tokenChain(stream,state,["}"],RXstyle,RXmodifiers);}
                                        if(c=="<"){
                                                return tokenChain(stream,state,[">"],RXstyle,RXmodifiers);}}}}
                if(ch=="s"){
                        var c=/[\/>\]})\w]/.test(look(stream, -2));
                        if(!c){
                                c=stream.eat(/[(\[{<\^'"!~\/]/);
                                if(c){
                                        if(c=="[")
                                                return tokenChain(stream,state,["]","]"],RXstyle,RXmodifiers);
                                        if(c=="{")
                                                return tokenChain(stream,state,["}","}"],RXstyle,RXmodifiers);
                                        if(c=="<")
                                                return tokenChain(stream,state,[">",">"],RXstyle,RXmodifiers);
                                        if(c=="(")
                                                return tokenChain(stream,state,[")",")"],RXstyle,RXmodifiers);
                                        return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers);}}}
                if(ch=="y"){
                        var c=/[\/>\]})\w]/.test(look(stream, -2));
                        if(!c){
                                c=stream.eat(/[(\[{<\^'"!~\/]/);
                                if(c){
                                        if(c=="[")
                                                return tokenChain(stream,state,["]","]"],RXstyle,RXmodifiers);
                                        if(c=="{")
                                                return tokenChain(stream,state,["}","}"],RXstyle,RXmodifiers);
                                        if(c=="<")
                                                return tokenChain(stream,state,[">",">"],RXstyle,RXmodifiers);
                                        if(c=="(")
                                                return tokenChain(stream,state,[")",")"],RXstyle,RXmodifiers);
                                        return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers);}}}
                if(ch=="t"){
                        var c=/[\/>\]})\w]/.test(look(stream, -2));
                        if(!c){
                                c=stream.eat("r");if(c){
                                c=stream.eat(/[(\[{<\^'"!~\/]/);
                                if(c){
                                        if(c=="[")
                                                return tokenChain(stream,state,["]","]"],RXstyle,RXmodifiers);
                                        if(c=="{")
                                                return tokenChain(stream,state,["}","}"],RXstyle,RXmodifiers);
                                        if(c=="<")
                                                return tokenChain(stream,state,[">",">"],RXstyle,RXmodifiers);
                                        if(c=="(")
                                                return tokenChain(stream,state,[")",")"],RXstyle,RXmodifiers);
                                        return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers);}}}}
                if(ch=="`"){
                        return tokenChain(stream,state,[ch],"variable-2");}
                if(ch=="/"){
                        if(!/~\s*$/.test(prefix(stream)))
                                return "operator";
                        else
                                return tokenChain(stream,state,[ch],RXstyle,RXmodifiers);}
                if(ch=="$"){
                        var p=stream.pos;
                        if(stream.eatWhile(/\d/)||stream.eat("{")&&stream.eatWhile(/\d/)&&stream.eat("}"))
                                return "variable-2";
                        else
                                stream.pos=p;}
                if(/[$@%]/.test(ch)){
                        var p=stream.pos;
                        if(stream.eat("^")&&stream.eat(/[A-Z]/)||!/[@$%&]/.test(look(stream, -2))&&stream.eat(/[=|\\\-#?@;:&`~\^!\[\]*'"$+.,\/<>()]/)){
                                var c=stream.current();
                                if(PERL[c])
                                        return "variable-2";}
                        stream.pos=p;}
                if(/[$@%&]/.test(ch)){
                        if(stream.eatWhile(/[\w$\[\]]/)||stream.eat("{")&&stream.eatWhile(/[\w$\[\]]/)&&stream.eat("}")){
                                var c=stream.current();
                                if(PERL[c])
                                        return "variable-2";
                                else
                                        return "variable";}}
                if(ch=="#"){
                        if(look(stream, -2)!="$"){
                                stream.skipToEnd();
                                return "comment";}}
                if(/[:+\-\^*$&%@=<>!?|\/~\.]/.test(ch)){
                        var p=stream.pos;
                        stream.eatWhile(/[:+\-\^*$&%@=<>!?|\/~\.]/);
                        if(PERL[stream.current()])
                                return "operator";
                        else
                                stream.pos=p;}
                if(ch=="_"){
                        if(stream.pos==1){
                                if(suffix(stream, 6)=="_END__"){
                                        return tokenChain(stream,state,['\0'],"comment");}
                                else if(suffix(stream, 7)=="_DATA__"){
                                        return tokenChain(stream,state,['\0'],"variable-2");}
                                else if(suffix(stream, 7)=="_C__"){
                                        return tokenChain(stream,state,['\0'],"string");}}}
                if(/\w/.test(ch)){
                        var p=stream.pos;
                        if(look(stream, -2)=="{"&&(look(stream, 0)=="}"||stream.eatWhile(/\w/)&&look(stream, 0)=="}"))
                                return "string";
                        else
                                stream.pos=p;}
                if(/[A-Z]/.test(ch)){
                        var l=look(stream, -2);
                        var p=stream.pos;
                        stream.eatWhile(/[A-Z_]/);
                        if(/[\da-z]/.test(look(stream, 0))){
                                stream.pos=p;}
                        else{
                                var c=PERL[stream.current()];
                                if(!c)
                                        return "meta";
                                if(c[1])
                                        c=c[0];
                                if(l!=":"){
                                        if(c==1)
                                                return "keyword";
                                        else if(c==2)
                                                return "def";
                                        else if(c==3)
                                                return "atom";
                                        else if(c==4)
                                                return "operator";
                                        else if(c==5)
                                                return "variable-2";
                                        else
                                                return "meta";}
                                else
                                        return "meta";}}
                if(/[a-zA-Z_]/.test(ch)){
                        var l=look(stream, -2);
                        stream.eatWhile(/\w/);
                        var c=PERL[stream.current()];
                        if(!c)
                                return "meta";
                        if(c[1])
                                c=c[0];
                        if(l!=":"){
                                if(c==1)
                                        return "keyword";
                                else if(c==2)
                                        return "def";
                                else if(c==3)
                                        return "atom";
                                else if(c==4)
                                        return "operator";
                                else if(c==5)
                                        return "variable-2";
                                else
                                        return "meta";}
                        else
                                return "meta";}
                return null;}

        return {
            startState: function() {
                return {
                    tokenize: tokenPerl,
                    chain: null,
                    style: null,
                    tail: null
                };
            },
            token: function(stream, state) {
                return (state.tokenize || tokenPerl)(stream, state);
            },
            lineComment: '#'
        };
});

CodeMirror.registerHelper("wordChars", "perl", /[\w$]/);

CodeMirror.defineMIME("text/x-perl", "perl");

// it's like "peek", but need for look-ahead or look-behind if index < 0
function look(stream, c){
  return stream.string.charAt(stream.pos+(c||0));
}

// return a part of prefix of current stream from current position
function prefix(stream, c){
  if(c){
    var x=stream.pos-c;
    return stream.string.substr((x>=0?x:0),c);}
  else{
    return stream.string.substr(0,stream.pos-1);
  }
}

// return a part of suffix of current stream from current position
function suffix(stream, c){
  var y=stream.string.length;
  var x=y-stream.pos+1;
  return stream.string.substr(stream.pos,(c&&c<y?c:x));
}

// eating and vomiting a part of stream from current position
function eatSuffix(stream, c){
  var x=stream.pos+c;
  var y;
  if(x<=0)
    stream.pos=0;
  else if(x>=(y=stream.string.length-1))
    stream.pos=y;
  else
    stream.pos=x;
}

});
codemirror/mode/perl/index.html000064400000003013151215013510012563 0ustar00<!doctype html>

<title>CodeMirror: Perl mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="perl.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Perl</a>
  </ul>
</div>

<article>
<h2>Perl mode</h2>


<div><textarea id="code" name="code">
#!/usr/bin/perl

use Something qw(func1 func2);

# strings
my $s1 = qq'single line';
our $s2 = q(multi-
              line);

=item Something
	Example.
=cut

my $html=<<'HTML'
<html>
<title>hi!</title>
</html>
HTML

print "first,".join(',', 'second', qq~third~);

if($s1 =~ m[(?<!\s)(l.ne)\z]o) {
	$h->{$1}=$jQuery.' predefined variables';
	$s2 =~ s/\-line//ox;
	$s1 =~ s[
		  line ]
		[
		  block
		]ox;
}

1; # numbers and comments

__END__
something...

</textarea></div>

    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        lineNumbers: true
      });
    </script>

    <p><strong>MIME types defined:</strong> <code>text/x-perl</code>.</p>
  </article>
codemirror/mode/jinja2/jinja2.js000064400000010274151215013510012523 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  CodeMirror.defineMode("jinja2", function() {
    var keywords = ["and", "as", "block", "endblock", "by", "cycle", "debug", "else", "elif",
      "extends", "filter", "endfilter", "firstof", "for",
      "endfor", "if", "endif", "ifchanged", "endifchanged",
      "ifequal", "endifequal", "ifnotequal",
      "endifnotequal", "in", "include", "load", "not", "now", "or",
      "parsed", "regroup", "reversed", "spaceless",
      "endspaceless", "ssi", "templatetag", "openblock",
      "closeblock", "openvariable", "closevariable",
      "openbrace", "closebrace", "opencomment",
      "closecomment", "widthratio", "url", "with", "endwith",
      "get_current_language", "trans", "endtrans", "noop", "blocktrans",
      "endblocktrans", "get_available_languages",
      "get_current_language_bidi", "plural"],
    operator = /^[+\-*&%=<>!?|~^]/,
    sign = /^[:\[\(\{]/,
    atom = ["true", "false"],
    number = /^(\d[+\-\*\/])?\d+(\.\d+)?/;

    keywords = new RegExp("((" + keywords.join(")|(") + "))\\b");
    atom = new RegExp("((" + atom.join(")|(") + "))\\b");

    function tokenBase (stream, state) {
      var ch = stream.peek();

      //Comment
      if (state.incomment) {
        if(!stream.skipTo("#}")) {
          stream.skipToEnd();
        } else {
          stream.eatWhile(/\#|}/);
          state.incomment = false;
        }
        return "comment";
      //Tag
      } else if (state.intag) {
        //After operator
        if(state.operator) {
          state.operator = false;
          if(stream.match(atom)) {
            return "atom";
          }
          if(stream.match(number)) {
            return "number";
          }
        }
        //After sign
        if(state.sign) {
          state.sign = false;
          if(stream.match(atom)) {
            return "atom";
          }
          if(stream.match(number)) {
            return "number";
          }
        }

        if(state.instring) {
          if(ch == state.instring) {
            state.instring = false;
          }
          stream.next();
          return "string";
        } else if(ch == "'" || ch == '"') {
          state.instring = ch;
          stream.next();
          return "string";
        } else if(stream.match(state.intag + "}") || stream.eat("-") && stream.match(state.intag + "}")) {
          state.intag = false;
          return "tag";
        } else if(stream.match(operator)) {
          state.operator = true;
          return "operator";
        } else if(stream.match(sign)) {
          state.sign = true;
        } else {
          if(stream.eat(" ") || stream.sol()) {
            if(stream.match(keywords)) {
              return "keyword";
            }
            if(stream.match(atom)) {
              return "atom";
            }
            if(stream.match(number)) {
              return "number";
            }
            if(stream.sol()) {
              stream.next();
            }
          } else {
            stream.next();
          }

        }
        return "variable";
      } else if (stream.eat("{")) {
        if (ch = stream.eat("#")) {
          state.incomment = true;
          if(!stream.skipTo("#}")) {
            stream.skipToEnd();
          } else {
            stream.eatWhile(/\#|}/);
            state.incomment = false;
          }
          return "comment";
        //Open tag
        } else if (ch = stream.eat(/\{|%/)) {
          //Cache close tag
          state.intag = ch;
          if(ch == "{") {
            state.intag = "}";
          }
          stream.eat("-");
          return "tag";
        }
      }
      stream.next();
    };

    return {
      startState: function () {
        return {tokenize: tokenBase};
      },
      token: function (stream, state) {
        return state.tokenize(stream, state);
      }
    };
  });
});
codemirror/mode/jinja2/index.html000064400000003333151215013510013003 0ustar00<!doctype html>

<title>CodeMirror: Jinja2 mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="jinja2.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Jinja2</a>
  </ul>
</div>

<article>
<h2>Jinja2 mode</h2>
<form><textarea id="code" name="code">
{# this is a comment #}
{%- for item in li -%}
  &lt;li&gt;{{ item.label }}&lt;/li&gt;
{% endfor -%}
{{ item.sand == true and item.keyword == false ? 1 : 0 }}
{{ app.get(55, 1.2, true) }}
{% if app.get(&#39;_route&#39;) == (&#39;_home&#39;) %}home{% endif %}
{% if app.session.flashbag.has(&#39;message&#39;) %}
  {% for message in app.session.flashbag.get(&#39;message&#39;) %}
    {{ message.content }}
  {% endfor %}
{% endif %}
{{ path(&#39;_home&#39;, {&#39;section&#39;: app.request.get(&#39;section&#39;)}) }}
{{ path(&#39;_home&#39;, {
    &#39;section&#39;: app.request.get(&#39;section&#39;),
    &#39;boolean&#39;: true,
    &#39;number&#39;: 55.33
  })
}}
{% include (&#39;test.incl.html.twig&#39;) %}
</textarea></form>
    <script>
      var editor =
      CodeMirror.fromTextArea(document.getElementById("code"), {mode:
        {name: "jinja2", htmlMode: true}});
    </script>
  </article>
codemirror/mode/mirc/index.html000064400000013260151215013510012560 0ustar00<!doctype html>

<title>CodeMirror: mIRC mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<link rel="stylesheet" href="../../theme/twilight.css">
<script src="../../lib/codemirror.js"></script>
<script src="mirc.js"></script>
<style>.CodeMirror {border: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">mIRC</a>
  </ul>
</div>

<article>
<h2>mIRC mode</h2>
<form><textarea id="code" name="code">
;AKA Nick Tracker by Ford_Lawnmower irc.GeekShed.net #Script-Help
;*****************************************************************************;
;**Start Setup
;Change JoinDisplay, below, for On Join AKA Display. On = 1 - Off = 0
alias -l JoinDisplay { return 1 }
;Change MaxNicks, below, to the number of nicknames you want to store for each hostmask. I wouldn't go over 400 with this ;/
alias -l MaxNicks { return 20 }
;Change AKALogo, below, To the text you want displayed before each AKA result.
alias -l AKALogo { return 06 05A06K07A 06 }
;**End Setup
;*****************************************************************************;
On *:Join:#: {
  if ($nick == $me) { .timer 1 1 ialupdateCheck $chan }
  NickNamesAdd $nick $+($network,$wildsite)
  if ($JoinDisplay) { .timerNickNames $+ $nick 1 2 NickNames.display $nick $chan $network $wildsite }
}
on *:Nick: { NickNamesAdd $newnick $+($network,$wildsite) $nick }
alias -l NickNames.display {
  if ($gettok($hget(NickNames,$+($3,$4)),0,126) > 1) {
    echo -g $2 $AKALogo $+(09,$1) $AKALogo 07 $mid($replace($hget(NickNames,$+($3,$4)),$chr(126),$chr(44)),2,-1)
  }
}
alias -l NickNamesAdd {
  if ($hget(NickNames,$2)) {
    if (!$regex($hget(NickNames,$2),/~\Q $+ $replacecs($1,\E,\E\\E\Q) $+ \E~/i)) {
      if ($gettok($hget(NickNames,$2),0,126) <= $MaxNicks) {
        hadd NickNames $2 $+($hget(NickNames,$2),$1,~)
      }
      else {
        hadd NickNames $2 $+($mid($hget(NickNames,$2),$pos($hget(NickNames,$2),~,2)),$1,~)
      }
    }
  }
  else {
    hadd -m NickNames $2 $+(~,$1,~,$iif($3,$+($3,~)))
  }
}
alias -l Fix.All.MindUser {
  var %Fix.Count = $hfind(NickNames,/[^~]+[0-9]{4}~/,0,r).data
  while (%Fix.Count) {
    if ($Fix.MindUser($hget(NickNames,$hfind(NickNames,/[^~]+[0-9]{4}~/,%Fix.Count,r).data))) {
      echo -ag Record %Fix.Count - $v1 - Was Cleaned
      hadd NickNames $hfind(NickNames,/[^~]+[0-9]{4}~/,%Fix.Count,r).data $v1
    }
    dec %Fix.Count
  }
}
alias -l Fix.MindUser { return $regsubex($1,/[^~]+[0-9]{4}~/g,$null) }
menu nicklist,query {
  -
  .AKA
  ..Check $$1: {
    if ($gettok($hget(NickNames,$+($network,$address($1,2))),0,126) > 1) {
      NickNames.display $1 $active $network $address($1,2)
    }
    else { echo -ag $AKALogo $+(09,$1) 07has not been known by any other nicknames while I have been watching. }
  }
  ..Cleanup $$1:hadd NickNames $+($network,$address($1,2)) $fix.minduser($hget(NickNames,$+($network,$address($1,2))))
  ..Clear $$1:hadd NickNames $+($network,$address($1,2)) $+(~,$1,~)
  ..AKA Search Dialog:dialog $iif($dialog(AKA_Search),-v,-m) AKA_Search AKA_Search
  -
}
menu status,channel {
  -
  .AKA
  ..AKA Search Dialog:dialog $iif($dialog(AKA_Search),-v,-m) AKA_Search AKA_Search
  ..Clean All Records:Fix.All.Minduser
  -
}
dialog AKA_Search {
  title "AKA Search Engine"
  size -1 -1 206 221
  option dbu
  edit "", 1, 8 5 149 10, autohs
  button "Search", 2, 163 4 32 12
  radio "Search HostMask", 4, 61 22 55 10
  radio "Search Nicknames", 5, 123 22 56 10
  list 6, 8 38 190 169, sort extsel vsbar
  button "Check Selected", 7, 67 206 40 12
  button "Close", 8, 160 206 38 12, cancel
  box "Search Type", 3, 11 17 183 18
  button "Copy to Clipboard", 9, 111 206 46 12
}
On *:Dialog:Aka_Search:init:*: { did -c $dname 5 }
On *:Dialog:Aka_Search:Sclick:2,7,9: {
  if ($did == 2) && ($did($dname,1)) {
    did -r $dname 6
    var %search $+(*,$v1,*), %type $iif($did($dname,5).state,data,item), %matches = $hfind(NickNames,%search,0,w). [ $+ [ %type ] ]
    while (%matches) {
      did -a $dname 6 $hfind(NickNames,%search,%matches,w). [ $+ [ %type ] ]
      dec %matches
    }
    did -c $dname 6 1
  }
  elseif ($did == 7) && ($did($dname,6).seltext) { echo -ga $AKALogo 07 $mid($replace($hget(NickNames,$v1),$chr(126),$chr(44)),2,-1) }
  elseif ($did == 9) && ($did($dname,6).seltext) { clipboard $mid($v1,$pos($v1,*,1)) }
}
On *:Start:{
  if (!$hget(NickNames)) { hmake NickNames 10 }
  if ($isfile(NickNames.hsh)) { hload  NickNames NickNames.hsh }
}
On *:Exit: { if ($hget(NickNames)) { hsave NickNames NickNames.hsh } }
On *:Disconnect: { if ($hget(NickNames)) { hsave NickNames NickNames.hsh } }
On *:Unload: { hfree NickNames }
alias -l ialupdateCheck {
  inc -z $+(%,ialupdateCheck,$network) $calc($nick($1,0) / 4)
  ;If your ial is already being updated on join .who $1 out.
  ;If you are using /names to update ial you will still need this line.
  .who $1
}
Raw 352:*: {
  if (jQuery($+(%,ialupdateCheck,$network),2)) haltdef
  NickNamesAdd $6 $+($network,$address($6,2))
}
Raw 315:*: {
  if (jQuery($+(%,ialupdateCheck,$network),2)) haltdef
}

</textarea></form>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        theme: "twilight",
        lineNumbers: true,
        matchBrackets: true,
        indentUnit: 4,
        mode: "text/mirc"
      });
    </script>

    <p><strong>MIME types defined:</strong> <code>text/mirc</code>.</p>

  </article>
codemirror/mode/mirc/mirc.js000064400000023542151215013510012057 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

//mIRC mode by Ford_Lawnmower :: Based on Velocity mode by Steve O'Hara

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMIME("text/mirc", "mirc");
CodeMirror.defineMode("mirc", function() {
  function parseWords(str) {
    var obj = {}, words = str.split(" ");
    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
    return obj;
  }
  var specials = parseWords("$! $$ $& $? $+ $abook $abs $active $activecid " +
                            "$activewid $address $addtok $agent $agentname $agentstat $agentver " +
                            "$alias $and $anick $ansi2mirc $aop $appactive $appstate $asc $asctime " +
                            "$asin $atan $avoice $away $awaymsg $awaytime $banmask $base $bfind " +
                            "$binoff $biton $bnick $bvar $bytes $calc $cb $cd $ceil $chan $chanmodes " +
                            "$chantypes $chat $chr $cid $clevel $click $cmdbox $cmdline $cnick $color " +
                            "$com $comcall $comchan $comerr $compact $compress $comval $cos $count " +
                            "$cr $crc $creq $crlf $ctime $ctimer $ctrlenter $date $day $daylight " +
                            "$dbuh $dbuw $dccignore $dccport $dde $ddename $debug $decode $decompress " +
                            "$deltok $devent $dialog $did $didreg $didtok $didwm $disk $dlevel $dll " +
                            "$dllcall $dname $dns $duration $ebeeps $editbox $emailaddr $encode $error " +
                            "$eval $event $exist $feof $ferr $fgetc $file $filename $filtered $finddir " +
                            "$finddirn $findfile $findfilen $findtok $fline $floor $fopen $fread $fserve " +
                            "$fulladdress $fulldate $fullname $fullscreen $get $getdir $getdot $gettok $gmt " +
                            "$group $halted $hash $height $hfind $hget $highlight $hnick $hotline " +
                            "$hotlinepos $ial $ialchan $ibl $idle $iel $ifmatch $ignore $iif $iil " +
                            "$inelipse $ini $inmidi $inpaste $inpoly $input $inrect $inroundrect " +
                            "$insong $instok $int $inwave $ip $isalias $isbit $isdde $isdir $isfile " +
                            "$isid $islower $istok $isupper $keychar $keyrpt $keyval $knick $lactive " +
                            "$lactivecid $lactivewid $left $len $level $lf $line $lines $link $lock " +
                            "$lock $locked $log $logstamp $logstampfmt $longfn $longip $lower $ltimer " +
                            "$maddress $mask $matchkey $matchtok $md5 $me $menu $menubar $menucontext " +
                            "$menutype $mid $middir $mircdir $mircexe $mircini $mklogfn $mnick $mode " +
                            "$modefirst $modelast $modespl $mouse $msfile $network $newnick $nick $nofile " +
                            "$nopath $noqt $not $notags $notify $null $numeric $numok $oline $onpoly " +
                            "$opnick $or $ord $os $passivedcc $pic $play $pnick $port $portable $portfree " +
                            "$pos $prefix $prop $protect $puttok $qt $query $rand $r $rawmsg $read $readomo " +
                            "$readn $regex $regml $regsub $regsubex $remove $remtok $replace $replacex " +
                            "$reptok $result $rgb $right $round $scid $scon $script $scriptdir $scriptline " +
                            "$sdir $send $server $serverip $sfile $sha1 $shortfn $show $signal $sin " +
                            "$site $sline $snick $snicks $snotify $sock $sockbr $sockerr $sockname " +
                            "$sorttok $sound $sqrt $ssl $sreq $sslready $status $strip $str $stripped " +
                            "$syle $submenu $switchbar $tan $target $ticks $time $timer $timestamp " +
                            "$timestampfmt $timezone $tip $titlebar $toolbar $treebar $trust $ulevel " +
                            "$ulist $upper $uptime $url $usermode $v1 $v2 $var $vcmd $vcmdstat $vcmdver " +
                            "$version $vnick $vol $wid $width $wildsite $wildtok $window $wrap $xor");
  var keywords = parseWords("abook ajinvite alias aline ame amsg anick aop auser autojoin avoice " +
                            "away background ban bcopy beep bread break breplace bset btrunc bunset bwrite " +
                            "channel clear clearall cline clipboard close cnick color comclose comopen " +
                            "comreg continue copy creq ctcpreply ctcps dcc dccserver dde ddeserver " +
                            "debug dec describe dialog did didtok disable disconnect dlevel dline dll " +
                            "dns dqwindow drawcopy drawdot drawfill drawline drawpic drawrect drawreplace " +
                            "drawrot drawsave drawscroll drawtext ebeeps echo editbox emailaddr enable " +
                            "events exit fclose filter findtext finger firewall flash flist flood flush " +
                            "flushini font fopen fseek fsend fserve fullname fwrite ghide gload gmove " +
                            "gopts goto gplay gpoint gqreq groups gshow gsize gstop gtalk gunload hadd " +
                            "halt haltdef hdec hdel help hfree hinc hload hmake hop hsave ial ialclear " +
                            "ialmark identd if ignore iline inc invite iuser join kick linesep links list " +
                            "load loadbuf localinfo log mdi me menubar mkdir mnick mode msg nick noop notice " +
                            "notify omsg onotice part partall pdcc perform play playctrl pop protect pvoice " +
                            "qme qmsg query queryn quit raw reload remini remote remove rename renwin " +
                            "reseterror resetidle return rlevel rline rmdir run ruser save savebuf saveini " +
                            "say scid scon server set showmirc signam sline sockaccept sockclose socklist " +
                            "socklisten sockmark sockopen sockpause sockread sockrename sockudp sockwrite " +
                            "sound speak splay sreq strip switchbar timer timestamp titlebar tnick tokenize " +
                            "toolbar topic tray treebar ulist unload unset unsetall updatenl url uwho " +
                            "var vcadd vcmd vcrem vol while whois window winhelp write writeint if isalnum " +
                            "isalpha isaop isavoice isban ischan ishop isignore isin isincs isletter islower " +
                            "isnotify isnum ison isop isprotect isreg isupper isvoice iswm iswmcs " +
                            "elseif else goto menu nicklist status title icon size option text edit " +
                            "button check radio box scroll list combo link tab item");
  var functions = parseWords("if elseif else and not or eq ne in ni for foreach while switch");
  var isOperatorChar = /[+\-*&%=<>!?^\/\|]/;
  function chain(stream, state, f) {
    state.tokenize = f;
    return f(stream, state);
  }
  function tokenBase(stream, state) {
    var beforeParams = state.beforeParams;
    state.beforeParams = false;
    var ch = stream.next();
    if (/[\[\]{}\(\),\.]/.test(ch)) {
      if (ch == "(" && beforeParams) state.inParams = true;
      else if (ch == ")") state.inParams = false;
      return null;
    }
    else if (/\d/.test(ch)) {
      stream.eatWhile(/[\w\.]/);
      return "number";
    }
    else if (ch == "\\") {
      stream.eat("\\");
      stream.eat(/./);
      return "number";
    }
    else if (ch == "/" && stream.eat("*")) {
      return chain(stream, state, tokenComment);
    }
    else if (ch == ";" && stream.match(/ *\( *\(/)) {
      return chain(stream, state, tokenUnparsed);
    }
    else if (ch == ";" && !state.inParams) {
      stream.skipToEnd();
      return "comment";
    }
    else if (ch == '"') {
      stream.eat(/"/);
      return "keyword";
    }
    else if (ch == "$") {
      stream.eatWhile(/[$_a-z0-9A-Z\.:]/);
      if (specials && specials.propertyIsEnumerable(stream.current().toLowerCase())) {
        return "keyword";
      }
      else {
        state.beforeParams = true;
        return "builtin";
      }
    }
    else if (ch == "%") {
      stream.eatWhile(/[^,^\s^\(^\)]/);
      state.beforeParams = true;
      return "string";
    }
    else if (isOperatorChar.test(ch)) {
      stream.eatWhile(isOperatorChar);
      return "operator";
    }
    else {
      stream.eatWhile(/[\w\$_{}]/);
      var word = stream.current().toLowerCase();
      if (keywords && keywords.propertyIsEnumerable(word))
        return "keyword";
      if (functions && functions.propertyIsEnumerable(word)) {
        state.beforeParams = true;
        return "keyword";
      }
      return null;
    }
  }
  function tokenComment(stream, state) {
    var maybeEnd = false, ch;
    while (ch = stream.next()) {
      if (ch == "/" && maybeEnd) {
        state.tokenize = tokenBase;
        break;
      }
      maybeEnd = (ch == "*");
    }
    return "comment";
  }
  function tokenUnparsed(stream, state) {
    var maybeEnd = 0, ch;
    while (ch = stream.next()) {
      if (ch == ";" && maybeEnd == 2) {
        state.tokenize = tokenBase;
        break;
      }
      if (ch == ")")
        maybeEnd++;
      else if (ch != " ")
        maybeEnd = 0;
    }
    return "meta";
  }
  return {
    startState: function() {
      return {
        tokenize: tokenBase,
        beforeParams: false,
        inParams: false
      };
    },
    token: function(stream, state) {
      if (stream.eatSpace()) return null;
      return state.tokenize(stream, state);
    }
  };
});

});
codemirror/mode/index.html000064400000020011151215013510011616 0ustar00<!doctype html>

<title>CodeMirror: Language Modes</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../doc/docs.css">

<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../doc/logo.png"></a>

  <ul>
    <li><a href="../index.html">Home</a>
    <li><a href="../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a class=active href="#">Language modes</a>
  </ul>
</div>

<article>

  <h2>Language modes</h2>

  <p>This is a list of every mode in the distribution. Each mode lives
in a subdirectory of the <code>mode/</code> directory, and typically
defines a single JavaScript file that implements the mode. Loading
such file will make the language available to CodeMirror, through
the <a href="../doc/manual.html#option_mode"><code>mode</code></a>
option.</p>

  <div style="-webkit-columns: 100px 2; -moz-columns: 100px 2; columns: 100px 2;">
    <ul style="margin-top: 0">
      <li><a href="apl/index.html">APL</a></li>
      <li><a href="asn.1/index.html">ASN.1</a></li>
      <li><a href="asterisk/index.html">Asterisk dialplan</a></li>
      <li><a href="brainfuck/index.html">Brainfuck</a></li>
      <li><a href="clike/index.html">C, C++, C#</a></li>
      <li><a href="clike/index.html">Ceylon</a></li>
      <li><a href="clojure/index.html">Clojure</a></li>
      <li><a href="css/gss.html">Closure Stylesheets (GSS)</a></li>
      <li><a href="cmake/index.html">CMake</a></li>
      <li><a href="cobol/index.html">COBOL</a></li>
      <li><a href="coffeescript/index.html">CoffeeScript</a></li>
      <li><a href="commonlisp/index.html">Common Lisp</a></li>
      <li><a href="crystal/index.html">Crystal</a></li>
      <li><a href="css/index.html">CSS</a></li>
      <li><a href="cypher/index.html">Cypher</a></li>
      <li><a href="python/index.html">Cython</a></li>
      <li><a href="d/index.html">D</a></li>
      <li><a href="dart/index.html">Dart</a></li>
      <li><a href="django/index.html">Django</a> (templating language)</li>
      <li><a href="dockerfile/index.html">Dockerfile</a></li>
      <li><a href="diff/index.html">diff</a></li>
      <li><a href="dtd/index.html">DTD</a></li>
      <li><a href="dylan/index.html">Dylan</a></li>
      <li><a href="ebnf/index.html">EBNF</a></li>
      <li><a href="ecl/index.html">ECL</a></li>
      <li><a href="eiffel/index.html">Eiffel</a></li>
      <li><a href="elm/index.html">Elm</a></li>
      <li><a href="erlang/index.html">Erlang</a></li>
      <li><a href="factor/index.html">Factor</a></li>
      <li><a href="fcl/index.html">FCL</a></li>
      <li><a href="forth/index.html">Forth</a></li>
      <li><a href="fortran/index.html">Fortran</a></li>
      <li><a href="mllike/index.html">F#</a></li>
      <li><a href="gas/index.html">Gas</a> (AT&amp;T-style assembly)</li>
      <li><a href="gherkin/index.html">Gherkin</a></li>
      <li><a href="go/index.html">Go</a></li>
      <li><a href="groovy/index.html">Groovy</a></li>
      <li><a href="haml/index.html">HAML</a></li>
      <li><a href="handlebars/index.html">Handlebars</a></li>
      <li><a href="haskell/index.html">Haskell</a> (<a href="haskell-literate/index.html">Literate</a>)</li>
      <li><a href="haxe/index.html">Haxe</a></li>
      <li><a href="htmlembedded/index.html">HTML embedded</a> (JSP, ASP.NET)</li>
      <li><a href="htmlmixed/index.html">HTML mixed-mode</a></li>
      <li><a href="http/index.html">HTTP</a></li>
      <li><a href="idl/index.html">IDL</a></li>
      <li><a href="clike/index.html">Java</a></li>
      <li><a href="javascript/index.html">JavaScript</a> (<a href="jsx/index.html">JSX</a>)</li>
      <li><a href="jinja2/index.html">Jinja2</a></li>
      <li><a href="julia/index.html">Julia</a></li>
      <li><a href="kotlin/index.html">Kotlin</a></li>
      <li><a href="css/less.html">LESS</a></li>
      <li><a href="livescript/index.html">LiveScript</a></li>
      <li><a href="lua/index.html">Lua</a></li>
      <li><a href="markdown/index.html">Markdown</a> (<a href="gfm/index.html">GitHub-flavour</a>)</li>
      <li><a href="mathematica/index.html">Mathematica</a></li>
      <li><a href="mbox/index.html">mbox</a></li>
      <li><a href="mirc/index.html">mIRC</a></li>
      <li><a href="modelica/index.html">Modelica</a></li>
      <li><a href="mscgen/index.html">MscGen</a></li>
      <li><a href="mumps/index.html">MUMPS</a></li>
      <li><a href="nginx/index.html">Nginx</a></li>
      <li><a href="nsis/index.html">NSIS</a></li>
      <li><a href="ntriples/index.html">NTriples</a></li>
      <li><a href="clike/index.html">Objective C</a></li>
      <li><a href="mllike/index.html">OCaml</a></li>
      <li><a href="octave/index.html">Octave</a> (MATLAB)</li>
      <li><a href="oz/index.html">Oz</a></li>
      <li><a href="pascal/index.html">Pascal</a></li>
      <li><a href="pegjs/index.html">PEG.js</a></li>
      <li><a href="perl/index.html">Perl</a></li>
      <li><a href="asciiarmor/index.html">PGP (ASCII armor)</a></li>
      <li><a href="php/index.html">PHP</a></li>
      <li><a href="pig/index.html">Pig Latin</a></li>
      <li><a href="powershell/index.html">PowerShell</a></li>
      <li><a href="properties/index.html">Properties files</a></li>
      <li><a href="protobuf/index.html">ProtoBuf</a></li>
      <li><a href="pug/index.html">Pug</a></li>
      <li><a href="puppet/index.html">Puppet</a></li>
      <li><a href="python/index.html">Python</a></li>
      <li><a href="q/index.html">Q</a></li>
      <li><a href="r/index.html">R</a></li>
      <li><a href="rpm/index.html">RPM</a></li>
      <li><a href="rst/index.html">reStructuredText</a></li>
      <li><a href="ruby/index.html">Ruby</a></li>
      <li><a href="rust/index.html">Rust</a></li>
      <li><a href="sas/index.html">SAS</a></li>
      <li><a href="sass/index.html">Sass</a></li>
      <li><a href="spreadsheet/index.html">Spreadsheet</a></li>
      <li><a href="clike/scala.html">Scala</a></li>
      <li><a href="scheme/index.html">Scheme</a></li>
      <li><a href="css/scss.html">SCSS</a></li>
      <li><a href="shell/index.html">Shell</a></li>
      <li><a href="sieve/index.html">Sieve</a></li>
      <li><a href="slim/index.html">Slim</a></li>
      <li><a href="smalltalk/index.html">Smalltalk</a></li>
      <li><a href="smarty/index.html">Smarty</a></li>
      <li><a href="solr/index.html">Solr</a></li>
      <li><a href="soy/index.html">Soy</a></li>
      <li><a href="stylus/index.html">Stylus</a></li>
      <li><a href="sql/index.html">SQL</a> (several dialects)</li>
      <li><a href="sparql/index.html">SPARQL</a></li>
      <li><a href="clike/index.html">Squirrel</a></li>
      <li><a href="swift/index.html">Swift</a></li>
      <li><a href="stex/index.html">sTeX, LaTeX</a></li>
      <li><a href="tcl/index.html">Tcl</a></li>
      <li><a href="textile/index.html">Textile</a></li>
      <li><a href="tiddlywiki/index.html">Tiddlywiki</a></li>
      <li><a href="tiki/index.html">Tiki wiki</a></li>
      <li><a href="toml/index.html">TOML</a></li>
      <li><a href="tornado/index.html">Tornado</a> (templating language)</li>
      <li><a href="troff/index.html">troff</a> (for manpages)</li>
      <li><a href="ttcn/index.html">TTCN</a></li>
      <li><a href="ttcn-cfg/index.html">TTCN Configuration</a></li>
      <li><a href="turtle/index.html">Turtle</a></li>
      <li><a href="twig/index.html">Twig</a></li>
      <li><a href="vb/index.html">VB.NET</a></li>
      <li><a href="vbscript/index.html">VBScript</a></li>
      <li><a href="velocity/index.html">Velocity</a></li>
      <li><a href="verilog/index.html">Verilog/SystemVerilog</a></li>
      <li><a href="vhdl/index.html">VHDL</a></li>
      <li><a href="vue/index.html">Vue.js app</a></li>
      <li><a href="webidl/index.html">Web IDL</a></li>
      <li><a href="xml/index.html">XML/HTML</a></li>
      <li><a href="xquery/index.html">XQuery</a></li>
      <li><a href="yacas/index.html">Yacas</a></li>
      <li><a href="yaml/index.html">YAML</a></li>
      <li><a href="yaml-frontmatter/index.html">YAML frontmatter</a></li>
      <li><a href="z80/index.html">Z80</a></li>
    </ul>
  </div>

</article>
codemirror/mode/nginx/nginx.js000064400000023664151215013510012446 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("nginx", function(config) {

  function words(str) {
    var obj = {}, words = str.split(" ");
    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
    return obj;
  }

  var keywords = words(
    /* ngxDirectiveControl */ "break return rewrite set" +
    /* ngxDirective */ " accept_mutex accept_mutex_delay access_log add_after_body add_before_body add_header addition_types aio alias allow ancient_browser ancient_browser_value auth_basic auth_basic_user_file auth_http auth_http_header auth_http_timeout autoindex autoindex_exact_size autoindex_localtime charset charset_types client_body_buffer_size client_body_in_file_only client_body_in_single_buffer client_body_temp_path client_body_timeout client_header_buffer_size client_header_timeout client_max_body_size connection_pool_size create_full_put_path daemon dav_access dav_methods debug_connection debug_points default_type degradation degrade deny devpoll_changes devpoll_events directio directio_alignment empty_gif env epoll_events error_log eventport_events expires fastcgi_bind fastcgi_buffer_size fastcgi_buffers fastcgi_busy_buffers_size fastcgi_cache fastcgi_cache_key fastcgi_cache_methods fastcgi_cache_min_uses fastcgi_cache_path fastcgi_cache_use_stale fastcgi_cache_valid fastcgi_catch_stderr fastcgi_connect_timeout fastcgi_hide_header fastcgi_ignore_client_abort fastcgi_ignore_headers fastcgi_index fastcgi_intercept_errors fastcgi_max_temp_file_size fastcgi_next_upstream fastcgi_param fastcgi_pass_header fastcgi_pass_request_body fastcgi_pass_request_headers fastcgi_read_timeout fastcgi_send_lowat fastcgi_send_timeout fastcgi_split_path_info fastcgi_store fastcgi_store_access fastcgi_temp_file_write_size fastcgi_temp_path fastcgi_upstream_fail_timeout fastcgi_upstream_max_fails flv geoip_city geoip_country google_perftools_profiles gzip gzip_buffers gzip_comp_level gzip_disable gzip_hash gzip_http_version gzip_min_length gzip_no_buffer gzip_proxied gzip_static gzip_types gzip_vary gzip_window if_modified_since ignore_invalid_headers image_filter image_filter_buffer image_filter_jpeg_quality image_filter_transparency imap_auth imap_capabilities imap_client_buffer index ip_hash keepalive_requests keepalive_timeout kqueue_changes kqueue_events large_client_header_buffers limit_conn limit_conn_log_level limit_rate limit_rate_after limit_req limit_req_log_level limit_req_zone limit_zone lingering_time lingering_timeout lock_file log_format log_not_found log_subrequest map_hash_bucket_size map_hash_max_size master_process memcached_bind memcached_buffer_size memcached_connect_timeout memcached_next_upstream memcached_read_timeout memcached_send_timeout memcached_upstream_fail_timeout memcached_upstream_max_fails merge_slashes min_delete_depth modern_browser modern_browser_value msie_padding msie_refresh multi_accept open_file_cache open_file_cache_errors open_file_cache_events open_file_cache_min_uses open_file_cache_valid open_log_file_cache output_buffers override_charset perl perl_modules perl_require perl_set pid pop3_auth pop3_capabilities port_in_redirect postpone_gzipping postpone_output protocol proxy proxy_bind proxy_buffer proxy_buffer_size proxy_buffering proxy_buffers proxy_busy_buffers_size proxy_cache proxy_cache_key proxy_cache_methods proxy_cache_min_uses proxy_cache_path proxy_cache_use_stale proxy_cache_valid proxy_connect_timeout proxy_headers_hash_bucket_size proxy_headers_hash_max_size proxy_hide_header proxy_ignore_client_abort proxy_ignore_headers proxy_intercept_errors proxy_max_temp_file_size proxy_method proxy_next_upstream proxy_pass_error_message proxy_pass_header proxy_pass_request_body proxy_pass_request_headers proxy_read_timeout proxy_redirect proxy_send_lowat proxy_send_timeout proxy_set_body proxy_set_header proxy_ssl_session_reuse proxy_store proxy_store_access proxy_temp_file_write_size proxy_temp_path proxy_timeout proxy_upstream_fail_timeout proxy_upstream_max_fails random_index read_ahead real_ip_header recursive_error_pages request_pool_size reset_timedout_connection resolver resolver_timeout rewrite_log rtsig_overflow_events rtsig_overflow_test rtsig_overflow_threshold rtsig_signo satisfy secure_link_secret send_lowat send_timeout sendfile sendfile_max_chunk server_name_in_redirect server_names_hash_bucket_size server_names_hash_max_size server_tokens set_real_ip_from smtp_auth smtp_capabilities smtp_client_buffer smtp_greeting_delay so_keepalive source_charset ssi ssi_ignore_recycled_buffers ssi_min_file_chunk ssi_silent_errors ssi_types ssi_value_length ssl ssl_certificate ssl_certificate_key ssl_ciphers ssl_client_certificate ssl_crl ssl_dhparam ssl_engine ssl_prefer_server_ciphers ssl_protocols ssl_session_cache ssl_session_timeout ssl_verify_client ssl_verify_depth starttls stub_status sub_filter sub_filter_once sub_filter_types tcp_nodelay tcp_nopush thread_stack_size timeout timer_resolution types_hash_bucket_size types_hash_max_size underscores_in_headers uninitialized_variable_warn use user userid userid_domain userid_expires userid_mark userid_name userid_p3p userid_path userid_service valid_referers variables_hash_bucket_size variables_hash_max_size worker_connections worker_cpu_affinity worker_priority worker_processes worker_rlimit_core worker_rlimit_nofile worker_rlimit_sigpending worker_threads working_directory xclient xml_entities xslt_stylesheet xslt_typesdrew@li229-23"
    );

  var keywords_block = words(
    /* ngxDirectiveBlock */ "http mail events server types location upstream charset_map limit_except if geo map"
    );

  var keywords_important = words(
    /* ngxDirectiveImportant */ "include root server server_name listen internal proxy_pass memcached_pass fastcgi_pass try_files"
    );

  var indentUnit = config.indentUnit, type;
  function ret(style, tp) {type = tp; return style;}

  function tokenBase(stream, state) {


    stream.eatWhile(/[\w\$_]/);

    var cur = stream.current();


    if (keywords.propertyIsEnumerable(cur)) {
      return "keyword";
    }
    else if (keywords_block.propertyIsEnumerable(cur)) {
      return "variable-2";
    }
    else if (keywords_important.propertyIsEnumerable(cur)) {
      return "string-2";
    }
    /**/

    var ch = stream.next();
    if (ch == "@") {stream.eatWhile(/[\w\\\-]/); return ret("meta", stream.current());}
    else if (ch == "/" && stream.eat("*")) {
      state.tokenize = tokenCComment;
      return tokenCComment(stream, state);
    }
    else if (ch == "<" && stream.eat("!")) {
      state.tokenize = tokenSGMLComment;
      return tokenSGMLComment(stream, state);
    }
    else if (ch == "=") ret(null, "compare");
    else if ((ch == "~" || ch == "|") && stream.eat("=")) return ret(null, "compare");
    else if (ch == "\"" || ch == "'") {
      state.tokenize = tokenString(ch);
      return state.tokenize(stream, state);
    }
    else if (ch == "#") {
      stream.skipToEnd();
      return ret("comment", "comment");
    }
    else if (ch == "!") {
      stream.match(/^\s*\w*/);
      return ret("keyword", "important");
    }
    else if (/\d/.test(ch)) {
      stream.eatWhile(/[\w.%]/);
      return ret("number", "unit");
    }
    else if (/[,.+>*\/]/.test(ch)) {
      return ret(null, "select-op");
    }
    else if (/[;{}:\[\]]/.test(ch)) {
      return ret(null, ch);
    }
    else {
      stream.eatWhile(/[\w\\\-]/);
      return ret("variable", "variable");
    }
  }

  function tokenCComment(stream, state) {
    var maybeEnd = false, ch;
    while ((ch = stream.next()) != null) {
      if (maybeEnd && ch == "/") {
        state.tokenize = tokenBase;
        break;
      }
      maybeEnd = (ch == "*");
    }
    return ret("comment", "comment");
  }

  function tokenSGMLComment(stream, state) {
    var dashes = 0, ch;
    while ((ch = stream.next()) != null) {
      if (dashes >= 2 && ch == ">") {
        state.tokenize = tokenBase;
        break;
      }
      dashes = (ch == "-") ? dashes + 1 : 0;
    }
    return ret("comment", "comment");
  }

  function tokenString(quote) {
    return function(stream, state) {
      var escaped = false, ch;
      while ((ch = stream.next()) != null) {
        if (ch == quote && !escaped)
          break;
        escaped = !escaped && ch == "\\";
      }
      if (!escaped) state.tokenize = tokenBase;
      return ret("string", "string");
    };
  }

  return {
    startState: function(base) {
      return {tokenize: tokenBase,
              baseIndent: base || 0,
              stack: []};
    },

    token: function(stream, state) {
      if (stream.eatSpace()) return null;
      type = null;
      var style = state.tokenize(stream, state);

      var context = state.stack[state.stack.length-1];
      if (type == "hash" && context == "rule") style = "atom";
      else if (style == "variable") {
        if (context == "rule") style = "number";
        else if (!context || context == "@media{") style = "tag";
      }

      if (context == "rule" && /^[\{\};]$/.test(type))
        state.stack.pop();
      if (type == "{") {
        if (context == "@media") state.stack[state.stack.length-1] = "@media{";
        else state.stack.push("{");
      }
      else if (type == "}") state.stack.pop();
      else if (type == "@media") state.stack.push("@media");
      else if (context == "{" && type != "comment") state.stack.push("rule");
      return style;
    },

    indent: function(state, textAfter) {
      var n = state.stack.length;
      if (/^\}/.test(textAfter))
        n -= state.stack[state.stack.length-1] == "rule" ? 2 : 1;
      return state.baseIndent + n * indentUnit;
    },

    electricChars: "}"
  };
});

CodeMirror.defineMIME("text/x-nginx-conf", "nginx");

});
codemirror/mode/nginx/index.html000064400000012167151215013510012756 0ustar00<!doctype html>
<head>
<title>CodeMirror: NGINX mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="nginx.js"></script>
<style>.CodeMirror {background: #f8f8f8;}</style>
    <link rel="stylesheet" href="../../doc/docs.css">
  </head>

  <style>
    body {
      margin: 0em auto;
    }

    .CodeMirror, .CodeMirror-scroll {
      height: 600px;
    }
  </style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">NGINX</a>
  </ul>
</div>

<article>
<h2>NGINX mode</h2>
<form><textarea id="code" name="code" style="height: 800px;">
server {
  listen 173.255.219.235:80;
  server_name website.com.au;
  rewrite / $scheme://www.$host$request_uri permanent; ## Forcibly prepend a www
}

server {
  listen 173.255.219.235:443;
  server_name website.com.au;
  rewrite / $scheme://www.$host$request_uri permanent; ## Forcibly prepend a www
}

server {

  listen      173.255.219.235:80;
  server_name www.website.com.au;



  root        /data/www;
  index       index.html index.php;

  location / {
    index index.html index.php;     ## Allow a static html file to be shown first
    try_files $uri $uri/ @handler;  ## If missing pass the URI to Magento's front handler
    expires 30d;                    ## Assume all files are cachable
  }

  ## These locations would be hidden by .htaccess normally
  location /app/                { deny all; }
  location /includes/           { deny all; }
  location /lib/                { deny all; }
  location /media/downloadable/ { deny all; }
  location /pkginfo/            { deny all; }
  location /report/config.xml   { deny all; }
  location /var/                { deny all; }

  location /var/export/ { ## Allow admins only to view export folder
    auth_basic           "Restricted"; ## Message shown in login window
    auth_basic_user_file /rs/passwords/testfile; ## See /etc/nginx/htpassword
    autoindex            on;
  }

  location  /. { ## Disable .htaccess and other hidden files
    return 404;
  }

  location @handler { ## Magento uses a common front handler
    rewrite / /index.php;
  }

  location ~ .php/ { ## Forward paths like /js/index.php/x.js to relevant handler
    rewrite ^/(.*.php)/ /$1 last;
  }

  location ~ \.php$ {
    if (!-e $request_filename) { rewrite / /index.php last; } ## Catch 404s that try_files miss

    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param PATH_INFO $fastcgi_script_name;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include        /rs/confs/nginx/fastcgi_params;
  }

}


server {

  listen              173.255.219.235:443;
  server_name         website.com.au www.website.com.au;

  root   /data/www;
  index index.html index.php;

  ssl                 on;
  ssl_certificate     /rs/ssl/ssl.crt;
  ssl_certificate_key /rs/ssl/ssl.key;

  ssl_session_timeout  5m;

  ssl_protocols  SSLv2 SSLv3 TLSv1;
  ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
  ssl_prefer_server_ciphers   on;



  location / {
    index index.html index.php; ## Allow a static html file to be shown first
    try_files $uri $uri/ @handler; ## If missing pass the URI to Magento's front handler
    expires 30d; ## Assume all files are cachable
  }

  ## These locations would be hidden by .htaccess normally
  location /app/                { deny all; }
  location /includes/           { deny all; }
  location /lib/                { deny all; }
  location /media/downloadable/ { deny all; }
  location /pkginfo/            { deny all; }
  location /report/config.xml   { deny all; }
  location /var/                { deny all; }

  location /var/export/ { ## Allow admins only to view export folder
    auth_basic           "Restricted"; ## Message shown in login window
    auth_basic_user_file htpasswd; ## See /etc/nginx/htpassword
    autoindex            on;
  }

  location  /. { ## Disable .htaccess and other hidden files
    return 404;
  }

  location @handler { ## Magento uses a common front handler
    rewrite / /index.php;
  }

  location ~ .php/ { ## Forward paths like /js/index.php/x.js to relevant handler
    rewrite ^/(.*.php)/ /$1 last;
  }

  location ~ .php$ { ## Execute PHP scripts
    if (!-e $request_filename) { rewrite  /index.php last; } ## Catch 404s that try_files miss

    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param PATH_INFO $fastcgi_script_name;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include        /rs/confs/nginx/fastcgi_params;

    fastcgi_param HTTPS on;
  }

}
</textarea></form>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {});
    </script>

    <p><strong>MIME types defined:</strong> <code>text/nginx</code>.</p>

  </article>
codemirror/mode/mscgen/mscgen_test.js000064400000006777151215013510013775 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function() {
  var mode = CodeMirror.getMode({indentUnit: 2}, "mscgen");
  function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); }

  MT("empty chart",
     "[keyword msc][bracket {]",
     "[base   ]",
     "[bracket }]"
   );

  MT("comments",
    "[comment // a single line comment]",
    "[comment # another  single line comment /* and */ ignored here]",
    "[comment /* A multi-line comment even though it contains]",
    "[comment msc keywords and \"quoted text\"*/]");

  MT("strings",
    "[string \"// a string\"]",
    "[string \"a string running over]",
    "[string two lines\"]",
    "[string \"with \\\"escaped quote\"]"
  );

  MT("xù/ msgenny keywords classify as 'base'",
    "[base watermark]",
    "[base alt loop opt ref else break par seq assert]"
  );

  MT("mscgen options classify as keyword",
    "[keyword hscale]", "[keyword width]", "[keyword arcgradient]", "[keyword wordwraparcs]"
  );

  MT("mscgen arcs classify as keyword",
    "[keyword note]","[keyword abox]","[keyword rbox]","[keyword box]",
    "[keyword |||...---]", "[keyword ..--==::]",
    "[keyword ->]", "[keyword <-]", "[keyword <->]",
    "[keyword =>]", "[keyword <=]", "[keyword <=>]",
    "[keyword =>>]", "[keyword <<=]", "[keyword <<=>>]",
    "[keyword >>]", "[keyword <<]", "[keyword <<>>]",
    "[keyword -x]", "[keyword x-]", "[keyword -X]", "[keyword X-]",
    "[keyword :>]", "[keyword <:]", "[keyword <:>]"
  );

  MT("within an attribute list, attributes classify as attribute",
    "[bracket [[][attribute label]",
    "[attribute id]","[attribute url]","[attribute idurl]",
    "[attribute linecolor]","[attribute linecolour]","[attribute textcolor]","[attribute textcolour]","[attribute textbgcolor]","[attribute textbgcolour]",
    "[attribute arclinecolor]","[attribute arclinecolour]","[attribute arctextcolor]","[attribute arctextcolour]","[attribute arctextbgcolor]","[attribute arctextbgcolour]",
    "[attribute arcskip][bracket ]]]"
  );

  MT("outside an attribute list, attributes classify as base",
    "[base label]",
    "[base id]","[base url]","[base idurl]",
    "[base linecolor]","[base linecolour]","[base textcolor]","[base textcolour]","[base textbgcolor]","[base textbgcolour]",
    "[base arclinecolor]","[base arclinecolour]","[base arctextcolor]","[base arctextcolour]","[base arctextbgcolor]","[base arctextbgcolour]",
    "[base arcskip]"
  );

  MT("a typical program",
    "[comment # typical mscgen program]",
    "[keyword msc][base  ][bracket {]",
    "[keyword wordwraparcs][operator =][string \"true\"][base , ][keyword hscale][operator =][string \"0.8\"][keyword arcgradient][operator =][base 30;]",
    "[base   a][bracket [[][attribute label][operator =][string \"Entity A\"][bracket ]]][base ,]",
    "[base   b][bracket [[][attribute label][operator =][string \"Entity B\"][bracket ]]][base ,]",
    "[base   c][bracket [[][attribute label][operator =][string \"Entity C\"][bracket ]]][base ;]",
    "[base   a ][keyword =>>][base  b][bracket [[][attribute label][operator =][string \"Hello entity B\"][bracket ]]][base ;]",
    "[base   a ][keyword <<][base  b][bracket [[][attribute label][operator =][string \"Here's an answer dude!\"][bracket ]]][base ;]",
    "[base   c ][keyword :>][base  *][bracket [[][attribute label][operator =][string \"What about me?\"][base , ][attribute textcolor][operator =][base red][bracket ]]][base ;]",
    "[bracket }]"
  );
})();
codemirror/mode/mscgen/msgenny_test.js000064400000006031151215013510014160 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function() {
  var mode = CodeMirror.getMode({indentUnit: 2}, "text/x-msgenny");
  function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1), "msgenny"); }

  MT("comments",
    "[comment // a single line comment]",
    "[comment # another  single line comment /* and */ ignored here]",
    "[comment /* A multi-line comment even though it contains]",
    "[comment msc keywords and \"quoted text\"*/]");

  MT("strings",
    "[string \"// a string\"]",
    "[string \"a string running over]",
    "[string two lines\"]",
    "[string \"with \\\"escaped quote\"]"
  );

  MT("xù/ msgenny keywords classify as 'keyword'",
    "[keyword watermark]",
    "[keyword alt]","[keyword loop]","[keyword opt]","[keyword ref]","[keyword else]","[keyword break]","[keyword par]","[keyword seq]","[keyword assert]"
  );

  MT("mscgen options classify as keyword",
    "[keyword hscale]", "[keyword width]", "[keyword arcgradient]", "[keyword wordwraparcs]"
  );

  MT("mscgen arcs classify as keyword",
    "[keyword note]","[keyword abox]","[keyword rbox]","[keyword box]",
    "[keyword |||...---]", "[keyword ..--==::]",
    "[keyword ->]", "[keyword <-]", "[keyword <->]",
    "[keyword =>]", "[keyword <=]", "[keyword <=>]",
    "[keyword =>>]", "[keyword <<=]", "[keyword <<=>>]",
    "[keyword >>]", "[keyword <<]", "[keyword <<>>]",
    "[keyword -x]", "[keyword x-]", "[keyword -X]", "[keyword X-]",
    "[keyword :>]", "[keyword <:]", "[keyword <:>]"
  );

  MT("within an attribute list, mscgen/ xù attributes classify as base",
    "[base [[label]",
    "[base idurl id url]",
    "[base linecolor linecolour textcolor textcolour textbgcolor textbgcolour]",
    "[base arclinecolor arclinecolour arctextcolor arctextcolour arctextbgcolor arctextbgcolour]",
    "[base arcskip]]]"
  );

  MT("outside an attribute list, mscgen/ xù attributes classify as base",
    "[base label]",
    "[base idurl id url]",
    "[base linecolor linecolour textcolor textcolour textbgcolor textbgcolour]",
    "[base arclinecolor arclinecolour arctextcolor arctextcolour arctextbgcolor arctextbgcolour]",
    "[base arcskip]"
  );

  MT("a typical program",
    "[comment # typical msgenny program]",
    "[keyword wordwraparcs][operator =][string \"true\"][base , ][keyword hscale][operator =][string \"0.8\"][base , ][keyword arcgradient][operator =][base 30;]",
    "[base   a : ][string \"Entity A\"][base ,]",
    "[base   b : Entity B,]",
    "[base   c : Entity C;]",
    "[base   a ][keyword =>>][base  b: ][string \"Hello entity B\"][base ;]",
    "[base   a ][keyword alt][base  c][bracket {]",
    "[base     a ][keyword <<][base  b: ][string \"Here's an answer dude!\"][base ;]",
    "[keyword ---][base : ][string \"sorry, won't march - comm glitch\"]",
    "[base     a ][keyword x-][base  b: ][string \"Here's an answer dude! (won't arrive...)\"][base ;]",
    "[bracket }]",
    "[base   c ][keyword :>][base  *: What about me?;]"
  );
})();
codemirror/mode/mscgen/mscgen.js000064400000014573151215013510012727 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

// mode(s) for the sequence chart dsl's mscgen, xù and msgenny
// For more information on mscgen, see the site of the original author:
// http://www.mcternan.me.uk/mscgen
//
// This mode for mscgen and the two derivative languages were
// originally made for use in the mscgen_js interpreter
// (https://sverweij.github.io/mscgen_js)

(function(mod) {
  if ( typeof exports == "object" && typeof module == "object")// CommonJS
    mod(require("../../lib/codemirror"));
  else if ( typeof define == "function" && define.amd)// AMD
    define(["../../lib/codemirror"], mod);
  else// Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  var languages = {
    mscgen: {
      "keywords" : ["msc"],
      "options" : ["hscale", "width", "arcgradient", "wordwraparcs"],
      "attributes" : ["label", "idurl", "id", "url", "linecolor", "linecolour", "textcolor", "textcolour", "textbgcolor", "textbgcolour", "arclinecolor", "arclinecolour", "arctextcolor", "arctextcolour", "arctextbgcolor", "arctextbgcolour", "arcskip"],
      "brackets" : ["\\{", "\\}"], // [ and  ] are brackets too, but these get handled in with lists
      "arcsWords" : ["note", "abox", "rbox", "box"],
      "arcsOthers" : ["\\|\\|\\|", "\\.\\.\\.", "---", "--", "<->", "==", "<<=>>", "<=>", "\\.\\.", "<<>>", "::", "<:>", "->", "=>>", "=>", ">>", ":>", "<-", "<<=", "<=", "<<", "<:", "x-", "-x"],
      "singlecomment" : ["//", "#"],
      "operators" : ["="]
    },
    xu: {
      "keywords" : ["msc"],
      "options" : ["hscale", "width", "arcgradient", "wordwraparcs", "watermark"],
      "attributes" : ["label", "idurl", "id", "url", "linecolor", "linecolour", "textcolor", "textcolour", "textbgcolor", "textbgcolour", "arclinecolor", "arclinecolour", "arctextcolor", "arctextcolour", "arctextbgcolor", "arctextbgcolour", "arcskip"],
      "brackets" : ["\\{", "\\}"],  // [ and  ] are brackets too, but these get handled in with lists
      "arcsWords" : ["note", "abox", "rbox", "box", "alt", "else", "opt", "break", "par", "seq", "strict", "neg", "critical", "ignore", "consider", "assert", "loop", "ref", "exc"],
      "arcsOthers" : ["\\|\\|\\|", "\\.\\.\\.", "---", "--", "<->", "==", "<<=>>", "<=>", "\\.\\.", "<<>>", "::", "<:>", "->", "=>>", "=>", ">>", ":>", "<-", "<<=", "<=", "<<", "<:", "x-", "-x"],
      "singlecomment" : ["//", "#"],
      "operators" : ["="]
    },
    msgenny: {
      "keywords" : null,
      "options" : ["hscale", "width", "arcgradient", "wordwraparcs", "watermark"],
      "attributes" : null,
      "brackets" : ["\\{", "\\}"],
      "arcsWords" : ["note", "abox", "rbox", "box", "alt", "else", "opt", "break", "par", "seq", "strict", "neg", "critical", "ignore", "consider", "assert", "loop", "ref", "exc"],
      "arcsOthers" : ["\\|\\|\\|", "\\.\\.\\.", "---", "--", "<->", "==", "<<=>>", "<=>", "\\.\\.", "<<>>", "::", "<:>", "->", "=>>", "=>", ">>", ":>", "<-", "<<=", "<=", "<<", "<:", "x-", "-x"],
      "singlecomment" : ["//", "#"],
      "operators" : ["="]
    }
  }

  CodeMirror.defineMode("mscgen", function(_, modeConfig) {
    var language = languages[modeConfig && modeConfig.language || "mscgen"]
    return {
      startState: startStateFn,
      copyState: copyStateFn,
      token: produceTokenFunction(language),
      lineComment : "#",
      blockCommentStart : "/*",
      blockCommentEnd : "*/"
    };
  });

  CodeMirror.defineMIME("text/x-mscgen", "mscgen");
  CodeMirror.defineMIME("text/x-xu", {name: "mscgen", language: "xu"});
  CodeMirror.defineMIME("text/x-msgenny", {name: "mscgen", language: "msgenny"});

  function wordRegexpBoundary(pWords) {
    return new RegExp("\\b(" + pWords.join("|") + ")\\b", "i");
  }

  function wordRegexp(pWords) {
    return new RegExp("(" + pWords.join("|") + ")", "i");
  }

  function startStateFn() {
    return {
      inComment : false,
      inString : false,
      inAttributeList : false,
      inScript : false
    };
  }

  function copyStateFn(pState) {
    return {
      inComment : pState.inComment,
      inString : pState.inString,
      inAttributeList : pState.inAttributeList,
      inScript : pState.inScript
    };
  }

  function produceTokenFunction(pConfig) {

    return function(pStream, pState) {
      if (pStream.match(wordRegexp(pConfig.brackets), true, true)) {
        return "bracket";
      }
      /* comments */
      if (!pState.inComment) {
        if (pStream.match(/\/\*[^\*\/]*/, true, true)) {
          pState.inComment = true;
          return "comment";
        }
        if (pStream.match(wordRegexp(pConfig.singlecomment), true, true)) {
          pStream.skipToEnd();
          return "comment";
        }
      }
      if (pState.inComment) {
        if (pStream.match(/[^\*\/]*\*\//, true, true))
          pState.inComment = false;
        else
          pStream.skipToEnd();
        return "comment";
      }
      /* strings */
      if (!pState.inString && pStream.match(/\"(\\\"|[^\"])*/, true, true)) {
        pState.inString = true;
        return "string";
      }
      if (pState.inString) {
        if (pStream.match(/[^\"]*\"/, true, true))
          pState.inString = false;
        else
          pStream.skipToEnd();
        return "string";
      }
      /* keywords & operators */
      if (!!pConfig.keywords && pStream.match(wordRegexpBoundary(pConfig.keywords), true, true))
        return "keyword";

      if (pStream.match(wordRegexpBoundary(pConfig.options), true, true))
        return "keyword";

      if (pStream.match(wordRegexpBoundary(pConfig.arcsWords), true, true))
        return "keyword";

      if (pStream.match(wordRegexp(pConfig.arcsOthers), true, true))
        return "keyword";

      if (!!pConfig.operators && pStream.match(wordRegexp(pConfig.operators), true, true))
        return "operator";

      /* attribute lists */
      if (!pConfig.inAttributeList && !!pConfig.attributes && pStream.match(/\[/, true, true)) {
        pConfig.inAttributeList = true;
        return "bracket";
      }
      if (pConfig.inAttributeList) {
        if (pConfig.attributes !== null && pStream.match(wordRegexpBoundary(pConfig.attributes), true, true)) {
          return "attribute";
        }
        if (pStream.match(/]/, true, true)) {
          pConfig.inAttributeList = false;
          return "bracket";
        }
      }

      pStream.next();
      return "base";
    };
  }

});
codemirror/mode/mscgen/index.html000064400000010327151215013510013103 0ustar00<!doctype html>

<title>CodeMirror: MscGen mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="mscgen.js"></script>
<style>.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">MscGen</a>
  </ul>
</div>

<article>
<h2>MscGen mode</h2>

<div><textarea id="mscgen-code">
# Sample mscgen program
# See http://www.mcternan.me.uk/mscgen or
# https://sverweij.github.io/mscgen_js for more samples
msc {
  # options
  hscale="1.2";

  # entities/ lifelines
  a [label="Entity A"],
  b [label="Entity B", linecolor="red", arclinecolor="red", textbgcolor="pink"],
  c [label="Entity C"];

  # arcs/ messages
  a => c [label="doSomething(args)"];
  b => c [label="doSomething(args)"];
  c >> * [label="everyone asked me", arcskip="1"];
  c =>> c [label="doing something"];
  c -x * [label="report back", arcskip="1"];
  |||;
  --- [label="shows's over, however ..."];
  b => a [label="did you see c doing something?"];
  a -> b [label="nope"];
  b :> a [label="shall we ask again?"];
  a => b [label="naah"];
  ...;
}
</textarea></div>

<h2>Xù mode</h2>

<div><textarea id="xu-code">
# Xù - expansions to MscGen to support inline expressions
#      https://github.com/sverweij/mscgen_js/blob/master/wikum/xu.md
# More samples: https://sverweij.github.io/mscgen_js
msc {
  hscale="0.8",
  width="700";

  a,
  b [label="change store"],
  c,
  d [label="necro queue"],
  e [label="natalis queue"],
  f;

  a =>> b [label="get change list()"];
  a alt f [label="changes found"] { /* alt is a xu specific keyword*/
    b >> a [label="list of changes"];
    a =>> c [label="cull old stuff (list of changes)"];
    b loop e [label="for each change"] { // loop is xu specific as well...
      /*
       * Interesting stuff happens.
       */
      c =>> b [label="get change()"];
      b >> c [label="change"];
      c alt e [label="change too old"] {
        c =>> d [label="queue(change)"];
        --- [label="change newer than latest run"];
        c =>> e [label="queue(change)"];
        --- [label="all other cases"];
        ||| [label="leave well alone"];
      };
    };

    c >> a [label="done
    processing"];

    /* shucks! nothing found ...*/
    --- [label="nothing found"];
    b >> a [label="nothing"];
    a note a [label="silent exit"];
  };
}
</textarea></div>

<h2>MsGenny mode</h2>
<div><textarea id="msgenny-code">
# MsGenny - simplified version of MscGen / Xù
#           https://github.com/sverweij/mscgen_js/blob/master/wikum/msgenny.md
# More samples: https://sverweij.github.io/mscgen_js
a -> b   : a -> b  (signal);
a => b   : a => b  (method);
b >> a   : b >> a  (return value);
a =>> b  : a =>> b (callback);
a -x b   : a -x b  (lost);
a :> b   : a :> b  (emphasis);
a .. b   : a .. b  (dotted);
a -- b   : "a -- b straight line";
a note a : a note a\n(note),
b box b  : b box b\n(action);
a rbox a : a rbox a\n(reference),
b abox b : b abox b\n(state/ condition);
|||      : ||| (empty row);
...      : ... (omitted row);
---      : --- (comment);
</textarea></div>

    <p>
      Simple mode for highlighting MscGen and two derived sequence
      chart languages.
    </p>

    <script>
      var mscgenEditor = CodeMirror.fromTextArea(document.getElementById("mscgen-code"), {
        lineNumbers: true,
        mode: "text/x-mscgen",
      });
      var xuEditor = CodeMirror.fromTextArea(document.getElementById("xu-code"), {
        lineNumbers: true,
        mode: "text/x-xu",
      });
      var msgennyEditor = CodeMirror.fromTextArea(document.getElementById("msgenny-code"), {
        lineNumbers: true,
        mode: "text/x-msgenny",
      });
    </script>

    <p><strong>MIME types defined:</strong>
      <code>text/x-mscgen</code>
      <code>text/x-xu</code>
      <code>text/x-msgenny</code>
    </p>

</article>
codemirror/mode/mscgen/xu_test.js000064400000007150151215013510013137 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function() {
  var mode = CodeMirror.getMode({indentUnit: 2}, "text/x-xu");
  function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1), "xu"); }

  MT("empty chart",
     "[keyword msc][bracket {]",
     "[base   ]",
     "[bracket }]"
   );

  MT("comments",
    "[comment // a single line comment]",
    "[comment # another  single line comment /* and */ ignored here]",
    "[comment /* A multi-line comment even though it contains]",
    "[comment msc keywords and \"quoted text\"*/]");

  MT("strings",
    "[string \"// a string\"]",
    "[string \"a string running over]",
    "[string two lines\"]",
    "[string \"with \\\"escaped quote\"]"
  );

  MT("xù/ msgenny keywords classify as 'keyword'",
    "[keyword watermark]",
    "[keyword alt]","[keyword loop]","[keyword opt]","[keyword ref]","[keyword else]","[keyword break]","[keyword par]","[keyword seq]","[keyword assert]"
  );

  MT("mscgen options classify as keyword",
    "[keyword hscale]", "[keyword width]", "[keyword arcgradient]", "[keyword wordwraparcs]"
  );

  MT("mscgen arcs classify as keyword",
    "[keyword note]","[keyword abox]","[keyword rbox]","[keyword box]",
    "[keyword |||...---]", "[keyword ..--==::]",
    "[keyword ->]", "[keyword <-]", "[keyword <->]",
    "[keyword =>]", "[keyword <=]", "[keyword <=>]",
    "[keyword =>>]", "[keyword <<=]", "[keyword <<=>>]",
    "[keyword >>]", "[keyword <<]", "[keyword <<>>]",
    "[keyword -x]", "[keyword x-]", "[keyword -X]", "[keyword X-]",
    "[keyword :>]", "[keyword <:]", "[keyword <:>]"
  );

  MT("within an attribute list, attributes classify as attribute",
    "[bracket [[][attribute label]",
    "[attribute id]","[attribute url]","[attribute idurl]",
    "[attribute linecolor]","[attribute linecolour]","[attribute textcolor]","[attribute textcolour]","[attribute textbgcolor]","[attribute textbgcolour]",
    "[attribute arclinecolor]","[attribute arclinecolour]","[attribute arctextcolor]","[attribute arctextcolour]","[attribute arctextbgcolor]","[attribute arctextbgcolour]",
    "[attribute arcskip][bracket ]]]"
  );

  MT("outside an attribute list, attributes classify as base",
    "[base label]",
    "[base id]","[base url]","[base idurl]",
    "[base linecolor]","[base linecolour]","[base textcolor]","[base textcolour]","[base textbgcolor]","[base textbgcolour]",
    "[base arclinecolor]","[base arclinecolour]","[base arctextcolor]","[base arctextcolour]","[base arctextbgcolor]","[base arctextbgcolour]",
    "[base arcskip]"
  );

  MT("a typical program",
    "[comment # typical mscgen program]",
    "[keyword msc][base  ][bracket {]",
    "[keyword wordwraparcs][operator =][string \"true\"][keyword hscale][operator =][string \"0.8\"][keyword arcgradient][operator =][base 30;]",
    "[base   a][bracket [[][attribute label][operator =][string \"Entity A\"][bracket ]]][base ,]",
    "[base   b][bracket [[][attribute label][operator =][string \"Entity B\"][bracket ]]][base ,]",
    "[base   c][bracket [[][attribute label][operator =][string \"Entity C\"][bracket ]]][base ;]",
    "[base   a ][keyword =>>][base  b][bracket [[][attribute label][operator =][string \"Hello entity B\"][bracket ]]][base ;]",
    "[base   a ][keyword <<][base  b][bracket [[][attribute label][operator =][string \"Here's an answer dude!\"][bracket ]]][base ;]",
    "[base   c ][keyword :>][base  *][bracket [[][attribute label][operator =][string \"What about me?\"][base , ][attribute textcolor][operator =][base red][bracket ]]][base ;]",
    "[bracket }]"
  );
})();
codemirror/mode/vb/vb.js000064400000021106151215013510011203 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("vb", function(conf, parserConf) {
    var ERRORCLASS = 'error';

    function wordRegexp(words) {
        return new RegExp("^((" + words.join(")|(") + "))\\b", "i");
    }

    var singleOperators = new RegExp("^[\\+\\-\\*/%&\\\\|\\^~<>!]");
    var singleDelimiters = new RegExp('^[\\(\\)\\[\\]\\{\\}@,:`=;\\.]');
    var doubleOperators = new RegExp("^((==)|(<>)|(<=)|(>=)|(<>)|(<<)|(>>)|(//)|(\\*\\*))");
    var doubleDelimiters = new RegExp("^((\\+=)|(\\-=)|(\\*=)|(%=)|(/=)|(&=)|(\\|=)|(\\^=))");
    var tripleDelimiters = new RegExp("^((//=)|(>>=)|(<<=)|(\\*\\*=))");
    var identifiers = new RegExp("^[_A-Za-z][_A-Za-z0-9]*");

    var openingKeywords = ['class','module', 'sub','enum','select','while','if','function',  'get','set','property', 'try'];
    var middleKeywords = ['else','elseif','case', 'catch'];
    var endKeywords = ['next','loop'];

    var operatorKeywords = ['and', 'or', 'not', 'xor', 'in'];
    var wordOperators = wordRegexp(operatorKeywords);
    var commonKeywords = ['as', 'dim', 'break',  'continue','optional', 'then',  'until',
                          'goto', 'byval','byref','new','handles','property', 'return',
                          'const','private', 'protected', 'friend', 'public', 'shared', 'static', 'true','false'];
    var commontypes = ['integer','string','double','decimal','boolean','short','char', 'float','single'];

    var keywords = wordRegexp(commonKeywords);
    var types = wordRegexp(commontypes);
    var stringPrefixes = '"';

    var opening = wordRegexp(openingKeywords);
    var middle = wordRegexp(middleKeywords);
    var closing = wordRegexp(endKeywords);
    var doubleClosing = wordRegexp(['end']);
    var doOpening = wordRegexp(['do']);

    var indentInfo = null;

    CodeMirror.registerHelper("hintWords", "vb", openingKeywords.concat(middleKeywords).concat(endKeywords)
                                .concat(operatorKeywords).concat(commonKeywords).concat(commontypes));

    function indent(_stream, state) {
      state.currentIndent++;
    }

    function dedent(_stream, state) {
      state.currentIndent--;
    }
    // tokenizers
    function tokenBase(stream, state) {
        if (stream.eatSpace()) {
            return null;
        }

        var ch = stream.peek();

        // Handle Comments
        if (ch === "'") {
            stream.skipToEnd();
            return 'comment';
        }


        // Handle Number Literals
        if (stream.match(/^((&H)|(&O))?[0-9\.a-f]/i, false)) {
            var floatLiteral = false;
            // Floats
            if (stream.match(/^\d*\.\d+F?/i)) { floatLiteral = true; }
            else if (stream.match(/^\d+\.\d*F?/)) { floatLiteral = true; }
            else if (stream.match(/^\.\d+F?/)) { floatLiteral = true; }

            if (floatLiteral) {
                // Float literals may be "imaginary"
                stream.eat(/J/i);
                return 'number';
            }
            // Integers
            var intLiteral = false;
            // Hex
            if (stream.match(/^&H[0-9a-f]+/i)) { intLiteral = true; }
            // Octal
            else if (stream.match(/^&O[0-7]+/i)) { intLiteral = true; }
            // Decimal
            else if (stream.match(/^[1-9]\d*F?/)) {
                // Decimal literals may be "imaginary"
                stream.eat(/J/i);
                // TODO - Can you have imaginary longs?
                intLiteral = true;
            }
            // Zero by itself with no other piece of number.
            else if (stream.match(/^0(?![\dx])/i)) { intLiteral = true; }
            if (intLiteral) {
                // Integer literals may be "long"
                stream.eat(/L/i);
                return 'number';
            }
        }

        // Handle Strings
        if (stream.match(stringPrefixes)) {
            state.tokenize = tokenStringFactory(stream.current());
            return state.tokenize(stream, state);
        }

        // Handle operators and Delimiters
        if (stream.match(tripleDelimiters) || stream.match(doubleDelimiters)) {
            return null;
        }
        if (stream.match(doubleOperators)
            || stream.match(singleOperators)
            || stream.match(wordOperators)) {
            return 'operator';
        }
        if (stream.match(singleDelimiters)) {
            return null;
        }
        if (stream.match(doOpening)) {
            indent(stream,state);
            state.doInCurrentLine = true;
            return 'keyword';
        }
        if (stream.match(opening)) {
            if (! state.doInCurrentLine)
              indent(stream,state);
            else
              state.doInCurrentLine = false;
            return 'keyword';
        }
        if (stream.match(middle)) {
            return 'keyword';
        }

        if (stream.match(doubleClosing)) {
            dedent(stream,state);
            dedent(stream,state);
            return 'keyword';
        }
        if (stream.match(closing)) {
            dedent(stream,state);
            return 'keyword';
        }

        if (stream.match(types)) {
            return 'keyword';
        }

        if (stream.match(keywords)) {
            return 'keyword';
        }

        if (stream.match(identifiers)) {
            return 'variable';
        }

        // Handle non-detected items
        stream.next();
        return ERRORCLASS;
    }

    function tokenStringFactory(delimiter) {
        var singleline = delimiter.length == 1;
        var OUTCLASS = 'string';

        return function(stream, state) {
            while (!stream.eol()) {
                stream.eatWhile(/[^'"]/);
                if (stream.match(delimiter)) {
                    state.tokenize = tokenBase;
                    return OUTCLASS;
                } else {
                    stream.eat(/['"]/);
                }
            }
            if (singleline) {
                if (parserConf.singleLineStringErrors) {
                    return ERRORCLASS;
                } else {
                    state.tokenize = tokenBase;
                }
            }
            return OUTCLASS;
        };
    }


    function tokenLexer(stream, state) {
        var style = state.tokenize(stream, state);
        var current = stream.current();

        // Handle '.' connected identifiers
        if (current === '.') {
            style = state.tokenize(stream, state);
            current = stream.current();
            if (style === 'variable') {
                return 'variable';
            } else {
                return ERRORCLASS;
            }
        }


        var delimiter_index = '[({'.indexOf(current);
        if (delimiter_index !== -1) {
            indent(stream, state );
        }
        if (indentInfo === 'dedent') {
            if (dedent(stream, state)) {
                return ERRORCLASS;
            }
        }
        delimiter_index = '])}'.indexOf(current);
        if (delimiter_index !== -1) {
            if (dedent(stream, state)) {
                return ERRORCLASS;
            }
        }

        return style;
    }

    var external = {
        electricChars:"dDpPtTfFeE ",
        startState: function() {
            return {
              tokenize: tokenBase,
              lastToken: null,
              currentIndent: 0,
              nextLineIndent: 0,
              doInCurrentLine: false


          };
        },

        token: function(stream, state) {
            if (stream.sol()) {
              state.currentIndent += state.nextLineIndent;
              state.nextLineIndent = 0;
              state.doInCurrentLine = 0;
            }
            var style = tokenLexer(stream, state);

            state.lastToken = {style:style, content: stream.current()};



            return style;
        },

        indent: function(state, textAfter) {
            var trueText = textAfter.replace(/^\s+|\s+$/g, '') ;
            if (trueText.match(closing) || trueText.match(doubleClosing) || trueText.match(middle)) return conf.indentUnit*(state.currentIndent-1);
            if(state.currentIndent < 0) return 0;
            return state.currentIndent * conf.indentUnit;
        },

        lineComment: "'"
    };
    return external;
});

CodeMirror.defineMIME("text/x-vb", "vb");

});
codemirror/mode/vb/index.html000064400000006304151215013510012236 0ustar00<!doctype html>

<title>CodeMirror: VB.NET mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<link href="http://fonts.googleapis.com/css?family=Inconsolata" rel="stylesheet" type="text/css">
<script src="../../lib/codemirror.js"></script>
<script src="vb.js"></script>
<script type="text/javascript" src="../../addon/runmode/runmode.js"></script>
<style>
      .CodeMirror {border: 1px solid #aaa; height:210px; height: auto;}
      .CodeMirror-scroll { overflow-x: auto; overflow-y: hidden;}
      .CodeMirror pre { font-family: Inconsolata; font-size: 14px}
    </style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">VB.NET</a>
  </ul>
</div>

<article>
<h2>VB.NET mode</h2>

<script type="text/javascript">
function test(golden, text) {
  var ok = true;
  var i = 0;
  function callback(token, style, lineNo, pos){
		//console.log(String(token) + " " + String(style) + " " + String(lineNo) + " " + String(pos));
    var result = [String(token), String(style)];
    if (golden[i][0] != result[0] || golden[i][1] != result[1]){
      return "Error, expected: " + String(golden[i]) + ", got: " + String(result);
      ok = false;
    }
    i++;
  }
  CodeMirror.runMode(text, "text/x-vb",callback); 

  if (ok) return "Tests OK";
}
function testTypes() {
  var golden = [['Integer','keyword'],[' ','null'],['Float','keyword']]
  var text =  "Integer Float";
  return test(golden,text);
}
function testIf(){
  var golden = [['If','keyword'],[' ','null'],['True','keyword'],[' ','null'],['End','keyword'],[' ','null'],['If','keyword']];
  var text = 'If True End If';
  return test(golden, text);
}
function testDecl(){
   var golden = [['Dim','keyword'],[' ','null'],['x','variable'],[' ','null'],['as','keyword'],[' ','null'],['Integer','keyword']];
   var text = 'Dim x as Integer';
   return test(golden, text);
}
function testAll(){
  var result = "";

  result += testTypes() + "\n";
  result += testIf() + "\n";
  result += testDecl() + "\n";
  return result;

}
function initText(editor) {
  var content = 'Class rocket\nPrivate quality as Double\nPublic Sub launch() as String\nif quality > 0.8\nlaunch = "Successful"\nElse\nlaunch = "Failed"\nEnd If\nEnd sub\nEnd class\n';
  editor.setValue(content);
  for (var i =0; i< editor.lineCount(); i++) editor.indentLine(i);
}
function init() {
    editor = CodeMirror.fromTextArea(document.getElementById("solution"), {
        lineNumbers: true,
        mode: "text/x-vb",
        readOnly: false
    });
    runTest();
}
function runTest() {
	document.getElementById('testresult').innerHTML = testAll();
  initText(editor);
	
}
document.body.onload = init;
</script>

  <div id="edit">
  <textarea style="width:95%;height:200px;padding:5px;" name="solution" id="solution" ></textarea>
  </div>
  <pre id="testresult"></pre>
  <p>MIME type defined: <code>text/x-vb</code>.</p>

</article>
codemirror/mode/mumps/mumps.js000064400000012352151215013510012472 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

/*
  This MUMPS Language script was constructed using vbscript.js as a template.
*/

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  CodeMirror.defineMode("mumps", function() {
    function wordRegexp(words) {
      return new RegExp("^((" + words.join(")|(") + "))\\b", "i");
    }

    var singleOperators = new RegExp("^[\\+\\-\\*/&#!_?\\\\<>=\\'\\[\\]]");
    var doubleOperators = new RegExp("^(('=)|(<=)|(>=)|('>)|('<)|([[)|(]])|(^$))");
    var singleDelimiters = new RegExp("^[\\.,:]");
    var brackets = new RegExp("[()]");
    var identifiers = new RegExp("^[%A-Za-z][A-Za-z0-9]*");
    var commandKeywords = ["break","close","do","else","for","goto", "halt", "hang", "if", "job","kill","lock","merge","new","open", "quit", "read", "set", "tcommit", "trollback", "tstart", "use", "view", "write", "xecute", "b","c","d","e","f","g", "h", "i", "j","k","l","m","n","o", "q", "r", "s", "tc", "tro", "ts", "u", "v", "w", "x"];
    // The following list includes instrinsic functions _and_ special variables
    var intrinsicFuncsWords = ["\\$ascii", "\\$char", "\\$data", "\\$ecode", "\\$estack", "\\$etrap", "\\$extract", "\\$find", "\\$fnumber", "\\$get", "\\$horolog", "\\$io", "\\$increment", "\\$job", "\\$justify", "\\$length", "\\$name", "\\$next", "\\$order", "\\$piece", "\\$qlength", "\\$qsubscript", "\\$query", "\\$quit", "\\$random", "\\$reverse", "\\$select", "\\$stack", "\\$test", "\\$text", "\\$translate", "\\$view", "\\$x", "\\$y", "\\$a", "\\$c", "\\$d", "\\$e", "\\$ec", "\\$es", "\\$et", "\\$f", "\\$fn", "\\$g", "\\$h", "\\$i", "\\$j", "\\$l", "\\$n", "\\$na", "\\$o", "\\$p", "\\$q", "\\$ql", "\\$qs", "\\$r", "\\$re", "\\$s", "\\$st", "\\$t", "\\$tr", "\\$v", "\\$z"];
    var intrinsicFuncs = wordRegexp(intrinsicFuncsWords);
    var command = wordRegexp(commandKeywords);

    function tokenBase(stream, state) {
      if (stream.sol()) {
        state.label = true;
        state.commandMode = 0;
      }

      // The <space> character has meaning in MUMPS. Ignoring consecutive
      // spaces would interfere with interpreting whether the next non-space
      // character belongs to the command or argument context.

      // Examine each character and update a mode variable whose interpretation is:
      //   >0 => command    0 => argument    <0 => command post-conditional
      var ch = stream.peek();

      if (ch == " " || ch == "\t") { // Pre-process <space>
        state.label = false;
        if (state.commandMode == 0)
          state.commandMode = 1;
        else if ((state.commandMode < 0) || (state.commandMode == 2))
          state.commandMode = 0;
      } else if ((ch != ".") && (state.commandMode > 0)) {
        if (ch == ":")
          state.commandMode = -1;   // SIS - Command post-conditional
        else
          state.commandMode = 2;
      }

      // Do not color parameter list as line tag
      if ((ch === "(") || (ch === "\u0009"))
        state.label = false;

      // MUMPS comment starts with ";"
      if (ch === ";") {
        stream.skipToEnd();
        return "comment";
      }

      // Number Literals // SIS/RLM - MUMPS permits canonic number followed by concatenate operator
      if (stream.match(/^[-+]?\d+(\.\d+)?([eE][-+]?\d+)?/))
        return "number";

      // Handle Strings
      if (ch == '"') {
        if (stream.skipTo('"')) {
          stream.next();
          return "string";
        } else {
          stream.skipToEnd();
          return "error";
        }
      }

      // Handle operators and Delimiters
      if (stream.match(doubleOperators) || stream.match(singleOperators))
        return "operator";

      // Prevents leading "." in DO block from falling through to error
      if (stream.match(singleDelimiters))
        return null;

      if (brackets.test(ch)) {
        stream.next();
        return "bracket";
      }

      if (state.commandMode > 0 && stream.match(command))
        return "variable-2";

      if (stream.match(intrinsicFuncs))
        return "builtin";

      if (stream.match(identifiers))
        return "variable";

      // Detect dollar-sign when not a documented intrinsic function
      // "^" may introduce a GVN or SSVN - Color same as function
      if (ch === "$" || ch === "^") {
        stream.next();
        return "builtin";
      }

      // MUMPS Indirection
      if (ch === "@") {
        stream.next();
        return "string-2";
      }

      if (/[\w%]/.test(ch)) {
        stream.eatWhile(/[\w%]/);
        return "variable";
      }

      // Handle non-detected items
      stream.next();
      return "error";
    }

    return {
      startState: function() {
        return {
          label: false,
          commandMode: 0
        };
      },

      token: function(stream, state) {
        var style = tokenBase(stream, state);
        if (state.label) return "tag";
        return style;
      }
    };
  });

  CodeMirror.defineMIME("text/x-mumps", "mumps");
});
codemirror/mode/mumps/index.html000064400000005060151215013510012766 0ustar00<!doctype html>

<title>CodeMirror: MUMPS mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="mumps.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">MUMPS</a>
  </ul>
</div>

<article>
<h2>MUMPS mode</h2>


<div><textarea id="code" name="code">
 ; Lloyd Milligan
 ; 03-30-2015
 ;
 ; MUMPS support for Code Mirror - Excerpts below from routine ^XUS
 ;
CHECKAV(X1) ;Check A/V code return DUZ or Zero. (Called from XUSRB)
 N %,%1,X,Y,IEN,DA,DIK
 S IEN=0
 ;Start CCOW
 I $E(X1,1,7)="~~TOK~~" D  Q:IEN>0 IEN
 . I $E(X1,8,9)="~1" S IEN=$$CHKASH^XUSRB4($E(X1,8,255))
 . I $E(X1,8,9)="~2" S IEN=$$CHKCCOW^XUSRB4($E(X1,8,255))
 . Q
 ;End CCOW
 S X1=$$UP(X1) S:X1[":" XUTT=1,X1=$TR(X1,":")
 S X=$P(X1,";") Q:X="^" -1 S:XUF %1="Access: "_X
 Q:X'?1.20ANP 0
 S X=$$EN^XUSHSH(X) I '$D(^VA(200,"A",X)) D LBAV Q 0
 S %1="",IEN=$O(^VA(200,"A",X,0)),XUF(.3)=IEN D USER(IEN)
 S X=$P(X1,";",2) S:XUF %1="Verify: "_X S X=$$EN^XUSHSH(X)
 I $P(XUSER(1),"^",2)'=X D LBAV Q 0
 I $G(XUFAC(1)) S DIK="^XUSEC(4,",DA=XUFAC(1) D ^DIK
 Q IEN
 ;
 ; Spell out commands
 ;
SET2() ;EF. Return error code (also called from XUSRB)
 NEW %,X
 SET XUNOW=$$HTFM^XLFDT($H),DT=$P(XUNOW,".")
 KILL DUZ,XUSER
 SET (DUZ,DUZ(2))=0,(DUZ(0),DUZ("AG"),XUSER(0),XUSER(1),XUTT,%UCI)=""
 SET %=$$INHIBIT^XUSRB() IF %>0 QUIT %
 SET X=$G(^%ZIS(1,XUDEV,"XUS")),XU1=$G(^(1))
 IF $L(X) FOR I=1:1:15 IF $L($P(X,U,I)) SET $P(XOPT,U,I)=$P(X,U,I)
 SET DTIME=600
 IF '$P(XOPT,U,11),$D(^%ZIS(1,XUDEV,90)),^(90)>2800000,^(90)'>DT QUIT 8
 QUIT 0
 ;
 ; Spell out commands and functions
 ;
 IF $PIECE(XUSER(0),U,11),$PIECE(XUSER(0),U,11)'>DT QUIT 11 ;Terminated
 IF $DATA(DUZ("ASH")) QUIT 0 ;If auto handle, Allow to sign-on p434
 IF $PIECE(XUSER(0),U,7) QUIT 5 ;Disuser flag set
 IF '$LENGTH($PIECE(XUSER(1),U,2)) QUIT 21 ;p419, p434
 Q 0
 ;
  </textarea></div>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
         mode: "mumps",
         lineNumbers: true,
         lineWrapping: true
      });
    </script>

  </article>
codemirror/mode/commonlisp/index.html000064400000015043151215013510014007 0ustar00<!doctype html>

<title>CodeMirror: Common Lisp mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="commonlisp.js"></script>
<style>.CodeMirror {background: #f8f8f8;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Common Lisp</a>
  </ul>
</div>

<article>
<h2>Common Lisp mode</h2>
<form><textarea id="code" name="code">(in-package :cl-postgres)

;; These are used to synthesize reader and writer names for integer
;; reading/writing functions when the amount of bytes and the
;; signedness is known. Both the macro that creates the functions and
;; some macros that use them create names this way.
(eval-when (:compile-toplevel :load-toplevel :execute)
  (defun integer-reader-name (bytes signed)
    (intern (with-standard-io-syntax
              (format nil "~a~a~a~a" '#:read- (if signed "" '#:u) '#:int bytes))))
  (defun integer-writer-name (bytes signed)
    (intern (with-standard-io-syntax
              (format nil "~a~a~a~a" '#:write- (if signed "" '#:u) '#:int bytes)))))

(defmacro integer-reader (bytes)
  "Create a function to read integers from a binary stream."
  (let ((bits (* bytes 8)))
    (labels ((return-form (signed)
               (if signed
                   `(if (logbitp ,(1- bits) result)
                        (dpb result (byte ,(1- bits) 0) -1)
                        result)
                   `result))
             (generate-reader (signed)
               `(defun ,(integer-reader-name bytes signed) (socket)
                  (declare (type stream socket)
                           #.*optimize*)
                  ,(if (= bytes 1)
                       `(let ((result (the (unsigned-byte 8) (read-byte socket))))
                          (declare (type (unsigned-byte 8) result))
                          ,(return-form signed))
                       `(let ((result 0))
                          (declare (type (unsigned-byte ,bits) result))
                          ,@(loop :for byte :from (1- bytes) :downto 0
                                   :collect `(setf (ldb (byte 8 ,(* 8 byte)) result)
                                                   (the (unsigned-byte 8) (read-byte socket))))
                          ,(return-form signed))))))
      `(progn
;; This causes weird errors on SBCL in some circumstances. Disabled for now.
;;         (declaim (inline ,(integer-reader-name bytes t)
;;                          ,(integer-reader-name bytes nil)))
         (declaim (ftype (function (t) (signed-byte ,bits))
                         ,(integer-reader-name bytes t)))
         ,(generate-reader t)
         (declaim (ftype (function (t) (unsigned-byte ,bits))
                         ,(integer-reader-name bytes nil)))
         ,(generate-reader nil)))))

(defmacro integer-writer (bytes)
  "Create a function to write integers to a binary stream."
  (let ((bits (* 8 bytes)))
    `(progn
      (declaim (inline ,(integer-writer-name bytes t)
                       ,(integer-writer-name bytes nil)))
      (defun ,(integer-writer-name bytes nil) (socket value)
        (declare (type stream socket)
                 (type (unsigned-byte ,bits) value)
                 #.*optimize*)
        ,@(if (= bytes 1)
              `((write-byte value socket))
              (loop :for byte :from (1- bytes) :downto 0
                    :collect `(write-byte (ldb (byte 8 ,(* byte 8)) value)
                               socket)))
        (values))
      (defun ,(integer-writer-name bytes t) (socket value)
        (declare (type stream socket)
                 (type (signed-byte ,bits) value)
                 #.*optimize*)
        ,@(if (= bytes 1)
              `((write-byte (ldb (byte 8 0) value) socket))
              (loop :for byte :from (1- bytes) :downto 0
                    :collect `(write-byte (ldb (byte 8 ,(* byte 8)) value)
                               socket)))
        (values)))))

;; All the instances of the above that we need.

(integer-reader 1)
(integer-reader 2)
(integer-reader 4)
(integer-reader 8)

(integer-writer 1)
(integer-writer 2)
(integer-writer 4)

(defun write-bytes (socket bytes)
  "Write a byte-array to a stream."
  (declare (type stream socket)
           (type (simple-array (unsigned-byte 8)) bytes)
           #.*optimize*)
  (write-sequence bytes socket))

(defun write-str (socket string)
  "Write a null-terminated string to a stream \(encoding it when UTF-8
support is enabled.)."
  (declare (type stream socket)
           (type string string)
           #.*optimize*)
  (enc-write-string string socket)
  (write-uint1 socket 0))

(declaim (ftype (function (t unsigned-byte)
                          (simple-array (unsigned-byte 8) (*)))
                read-bytes))
(defun read-bytes (socket length)
  "Read a byte array of the given length from a stream."
  (declare (type stream socket)
           (type fixnum length)
           #.*optimize*)
  (let ((result (make-array length :element-type '(unsigned-byte 8))))
    (read-sequence result socket)
    result))

(declaim (ftype (function (t) string) read-str))
(defun read-str (socket)
  "Read a null-terminated string from a stream. Takes care of encoding
when UTF-8 support is enabled."
  (declare (type stream socket)
           #.*optimize*)
  (enc-read-string socket :null-terminated t))

(defun skip-bytes (socket length)
  "Skip a given number of bytes in a binary stream."
  (declare (type stream socket)
           (type (unsigned-byte 32) length)
           #.*optimize*)
  (dotimes (i length)
    (read-byte socket)))

(defun skip-str (socket)
  "Skip a null-terminated string."
  (declare (type stream socket)
           #.*optimize*)
  (loop :for char :of-type fixnum = (read-byte socket)
        :until (zerop char)))

(defun ensure-socket-is-closed (socket &amp;key abort)
  (when (open-stream-p socket)
    (handler-case
        (close socket :abort abort)
      (error (error)
        (warn "Ignoring the error which happened while trying to close PostgreSQL socket: ~A" error)))))
</textarea></form>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {lineNumbers: true});
    </script>

    <p><strong>MIME types defined:</strong> <code>text/x-common-lisp</code>.</p>

  </article>
codemirror/mode/commonlisp/commonlisp.js000064400000010610151215013510014523 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("commonlisp", function (config) {
  var specialForm = /^(block|let*|return-from|catch|load-time-value|setq|eval-when|locally|symbol-macrolet|flet|macrolet|tagbody|function|multiple-value-call|the|go|multiple-value-prog1|throw|if|progn|unwind-protect|labels|progv|let|quote)$/;
  var assumeBody = /^with|^def|^do|^prog|case$|^cond$|bind$|when$|unless$/;
  var numLiteral = /^(?:[+\-]?(?:\d+|\d*\.\d+)(?:[efd][+\-]?\d+)?|[+\-]?\d+(?:\/[+\-]?\d+)?|#b[+\-]?[01]+|#o[+\-]?[0-7]+|#x[+\-]?[\da-f]+)/;
  var symbol = /[^\s'`,@()\[\]";]/;
  var type;

  function readSym(stream) {
    var ch;
    while (ch = stream.next()) {
      if (ch == "\\") stream.next();
      else if (!symbol.test(ch)) { stream.backUp(1); break; }
    }
    return stream.current();
  }

  function base(stream, state) {
    if (stream.eatSpace()) {type = "ws"; return null;}
    if (stream.match(numLiteral)) return "number";
    var ch = stream.next();
    if (ch == "\\") ch = stream.next();

    if (ch == '"') return (state.tokenize = inString)(stream, state);
    else if (ch == "(") { type = "open"; return "bracket"; }
    else if (ch == ")" || ch == "]") { type = "close"; return "bracket"; }
    else if (ch == ";") { stream.skipToEnd(); type = "ws"; return "comment"; }
    else if (/['`,@]/.test(ch)) return null;
    else if (ch == "|") {
      if (stream.skipTo("|")) { stream.next(); return "symbol"; }
      else { stream.skipToEnd(); return "error"; }
    } else if (ch == "#") {
      var ch = stream.next();
      if (ch == "[") { type = "open"; return "bracket"; }
      else if (/[+\-=\.']/.test(ch)) return null;
      else if (/\d/.test(ch) && stream.match(/^\d*#/)) return null;
      else if (ch == "|") return (state.tokenize = inComment)(stream, state);
      else if (ch == ":") { readSym(stream); return "meta"; }
      else return "error";
    } else {
      var name = readSym(stream);
      if (name == ".") return null;
      type = "symbol";
      if (name == "nil" || name == "t" || name.charAt(0) == ":") return "atom";
      if (state.lastType == "open" && (specialForm.test(name) || assumeBody.test(name))) return "keyword";
      if (name.charAt(0) == "&") return "variable-2";
      return "variable";
    }
  }

  function inString(stream, state) {
    var escaped = false, next;
    while (next = stream.next()) {
      if (next == '"' && !escaped) { state.tokenize = base; break; }
      escaped = !escaped && next == "\\";
    }
    return "string";
  }

  function inComment(stream, state) {
    var next, last;
    while (next = stream.next()) {
      if (next == "#" && last == "|") { state.tokenize = base; break; }
      last = next;
    }
    type = "ws";
    return "comment";
  }

  return {
    startState: function () {
      return {ctx: {prev: null, start: 0, indentTo: 0}, lastType: null, tokenize: base};
    },

    token: function (stream, state) {
      if (stream.sol() && typeof state.ctx.indentTo != "number")
        state.ctx.indentTo = state.ctx.start + 1;

      type = null;
      var style = state.tokenize(stream, state);
      if (type != "ws") {
        if (state.ctx.indentTo == null) {
          if (type == "symbol" && assumeBody.test(stream.current()))
            state.ctx.indentTo = state.ctx.start + config.indentUnit;
          else
            state.ctx.indentTo = "next";
        } else if (state.ctx.indentTo == "next") {
          state.ctx.indentTo = stream.column();
        }
        state.lastType = type;
      }
      if (type == "open") state.ctx = {prev: state.ctx, start: stream.column(), indentTo: null};
      else if (type == "close") state.ctx = state.ctx.prev || state.ctx;
      return style;
    },

    indent: function (state, _textAfter) {
      var i = state.ctx.indentTo;
      return typeof i == "number" ? i : state.ctx.start + 1;
    },

    closeBrackets: {pairs: "()[]{}\"\""},
    lineComment: ";;",
    blockCommentStart: "#|",
    blockCommentEnd: "|#"
  };
});

CodeMirror.defineMIME("text/x-common-lisp", "commonlisp");

});
codemirror/mode/http/http.js000064400000005353151215013510012131 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("http", function() {
  function failFirstLine(stream, state) {
    stream.skipToEnd();
    state.cur = header;
    return "error";
  }

  function start(stream, state) {
    if (stream.match(/^HTTP\/\d\.\d/)) {
      state.cur = responseStatusCode;
      return "keyword";
    } else if (stream.match(/^[A-Z]+/) && /[ \t]/.test(stream.peek())) {
      state.cur = requestPath;
      return "keyword";
    } else {
      return failFirstLine(stream, state);
    }
  }

  function responseStatusCode(stream, state) {
    var code = stream.match(/^\d+/);
    if (!code) return failFirstLine(stream, state);

    state.cur = responseStatusText;
    var status = Number(code[0]);
    if (status >= 100 && status < 200) {
      return "positive informational";
    } else if (status >= 200 && status < 300) {
      return "positive success";
    } else if (status >= 300 && status < 400) {
      return "positive redirect";
    } else if (status >= 400 && status < 500) {
      return "negative client-error";
    } else if (status >= 500 && status < 600) {
      return "negative server-error";
    } else {
      return "error";
    }
  }

  function responseStatusText(stream, state) {
    stream.skipToEnd();
    state.cur = header;
    return null;
  }

  function requestPath(stream, state) {
    stream.eatWhile(/\S/);
    state.cur = requestProtocol;
    return "string-2";
  }

  function requestProtocol(stream, state) {
    if (stream.match(/^HTTP\/\d\.\d$/)) {
      state.cur = header;
      return "keyword";
    } else {
      return failFirstLine(stream, state);
    }
  }

  function header(stream) {
    if (stream.sol() && !stream.eat(/[ \t]/)) {
      if (stream.match(/^.*?:/)) {
        return "atom";
      } else {
        stream.skipToEnd();
        return "error";
      }
    } else {
      stream.skipToEnd();
      return "string";
    }
  }

  function body(stream) {
    stream.skipToEnd();
    return null;
  }

  return {
    token: function(stream, state) {
      var cur = state.cur;
      if (cur != header && cur != body && stream.eatSpace()) return null;
      return cur(stream, state);
    },

    blankLine: function(state) {
      state.cur = body;
    },

    startState: function() {
      return {cur: start};
    }
  };
});

CodeMirror.defineMIME("message/http", "http");

});
codemirror/mode/http/index.html000064400000002561151215013510012607 0ustar00<!doctype html>

<title>CodeMirror: HTTP mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="http.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">HTTP</a>
  </ul>
</div>

<article>
<h2>HTTP mode</h2>


<div><textarea id="code" name="code">
POST /somewhere HTTP/1.1
Host: example.com
If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT
Content-Type: application/x-www-form-urlencoded;
	charset=utf-8
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.11 (KHTML, like Gecko) Ubuntu/12.04 Chromium/20.0.1132.47 Chrome/20.0.1132.47 Safari/536.11

This is the request body!
</textarea></div>

    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {});
    </script>

    <p><strong>MIME types defined:</strong> <code>message/http</code>.</p>
  </article>
codemirror/mode/octave/octave.js000064400000010557151215013510012737 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("octave", function() {
  function wordRegexp(words) {
    return new RegExp("^((" + words.join(")|(") + "))\\b");
  }

  var singleOperators = new RegExp("^[\\+\\-\\*/&|\\^~<>!@'\\\\]");
  var singleDelimiters = new RegExp('^[\\(\\[\\{\\},:=;]');
  var doubleOperators = new RegExp("^((==)|(~=)|(<=)|(>=)|(<<)|(>>)|(\\.[\\+\\-\\*/\\^\\\\]))");
  var doubleDelimiters = new RegExp("^((!=)|(\\+=)|(\\-=)|(\\*=)|(/=)|(&=)|(\\|=)|(\\^=))");
  var tripleDelimiters = new RegExp("^((>>=)|(<<=))");
  var expressionEnd = new RegExp("^[\\]\\)]");
  var identifiers = new RegExp("^[_A-Za-z\xa1-\uffff][_A-Za-z0-9\xa1-\uffff]*");

  var builtins = wordRegexp([
    'error', 'eval', 'function', 'abs', 'acos', 'atan', 'asin', 'cos',
    'cosh', 'exp', 'log', 'prod', 'sum', 'log10', 'max', 'min', 'sign', 'sin', 'sinh',
    'sqrt', 'tan', 'reshape', 'break', 'zeros', 'default', 'margin', 'round', 'ones',
    'rand', 'syn', 'ceil', 'floor', 'size', 'clear', 'zeros', 'eye', 'mean', 'std', 'cov',
    'det', 'eig', 'inv', 'norm', 'rank', 'trace', 'expm', 'logm', 'sqrtm', 'linspace', 'plot',
    'title', 'xlabel', 'ylabel', 'legend', 'text', 'grid', 'meshgrid', 'mesh', 'num2str',
    'fft', 'ifft', 'arrayfun', 'cellfun', 'input', 'fliplr', 'flipud', 'ismember'
  ]);

  var keywords = wordRegexp([
    'return', 'case', 'switch', 'else', 'elseif', 'end', 'endif', 'endfunction',
    'if', 'otherwise', 'do', 'for', 'while', 'try', 'catch', 'classdef', 'properties', 'events',
    'methods', 'global', 'persistent', 'endfor', 'endwhile', 'printf', 'sprintf', 'disp', 'until',
    'continue', 'pkg'
  ]);


  // tokenizers
  function tokenTranspose(stream, state) {
    if (!stream.sol() && stream.peek() === '\'') {
      stream.next();
      state.tokenize = tokenBase;
      return 'operator';
    }
    state.tokenize = tokenBase;
    return tokenBase(stream, state);
  }


  function tokenComment(stream, state) {
    if (stream.match(/^.*%}/)) {
      state.tokenize = tokenBase;
      return 'comment';
    };
    stream.skipToEnd();
    return 'comment';
  }

  function tokenBase(stream, state) {
    // whitespaces
    if (stream.eatSpace()) return null;

    // Handle one line Comments
    if (stream.match('%{')){
      state.tokenize = tokenComment;
      stream.skipToEnd();
      return 'comment';
    }

    if (stream.match(/^[%#]/)){
      stream.skipToEnd();
      return 'comment';
    }

    // Handle Number Literals
    if (stream.match(/^[0-9\.+-]/, false)) {
      if (stream.match(/^[+-]?0x[0-9a-fA-F]+[ij]?/)) {
        stream.tokenize = tokenBase;
        return 'number'; };
      if (stream.match(/^[+-]?\d*\.\d+([EeDd][+-]?\d+)?[ij]?/)) { return 'number'; };
      if (stream.match(/^[+-]?\d+([EeDd][+-]?\d+)?[ij]?/)) { return 'number'; };
    }
    if (stream.match(wordRegexp(['nan','NaN','inf','Inf']))) { return 'number'; };

    // Handle Strings
    if (stream.match(/^"([^"]|(""))*"/)) { return 'string'; } ;
    if (stream.match(/^'([^']|(''))*'/)) { return 'string'; } ;

    // Handle words
    if (stream.match(keywords)) { return 'keyword'; } ;
    if (stream.match(builtins)) { return 'builtin'; } ;
    if (stream.match(identifiers)) { return 'variable'; } ;

    if (stream.match(singleOperators) || stream.match(doubleOperators)) { return 'operator'; };
    if (stream.match(singleDelimiters) || stream.match(doubleDelimiters) || stream.match(tripleDelimiters)) { return null; };

    if (stream.match(expressionEnd)) {
      state.tokenize = tokenTranspose;
      return null;
    };


    // Handle non-detected items
    stream.next();
    return 'error';
  };


  return {
    startState: function() {
      return {
        tokenize: tokenBase
      };
    },

    token: function(stream, state) {
      var style = state.tokenize(stream, state);
      if (style === 'number' || style === 'variable'){
        state.tokenize = tokenTranspose;
      }
      return style;
    }
  };
});

CodeMirror.defineMIME("text/x-octave", "octave");

});
codemirror/mode/octave/index.html000064400000003415151215013510013110 0ustar00<!doctype html>

<title>CodeMirror: Octave mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="octave.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Octave</a>
  </ul>
</div>

<article>
<h2>Octave mode</h2>

    <div><textarea id="code" name="code">
%numbers
[1234 1234i 1234j]
[.234 .234j 2.23i]
[23e2 12E1j 123D-4 0x234]

%strings
'asda''a'
"asda""a"

%identifiers
a + as123 - __asd__

%operators
-
+
=
==
>
<
>=
<=
&
~
...
break zeros default margin round ones rand
ceil floor size clear zeros eye mean std cov
error eval function
abs acos atan asin cos cosh exp log prod sum
log10 max min sign sin sinh sqrt tan reshape
return
case switch
else elseif end if otherwise
do for while
try catch
classdef properties events methods
global persistent

%one line comment
%{ multi 
line comment %}

    </textarea></div>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        mode: {name: "octave",
               version: 2,
               singleLineStringErrors: false},
        lineNumbers: true,
        indentUnit: 4,
        matchBrackets: true
      });
    </script>

    <p><strong>MIME types defined:</strong> <code>text/x-octave</code>.</p>
</article>
codemirror/mode/q/index.html000064400000021406151215013510012067 0ustar00<!doctype html>

<title>CodeMirror: Q mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="q.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Q</a>
  </ul>
</div>

<article>
<h2>Q mode</h2>


<div><textarea id="code" name="code">
/ utilities to quickly load a csv file - for more exhaustive analysis of the csv contents see csvguess.q
/ 2009.09.20 - updated to match latest csvguess.q 

/ .csv.colhdrs[file] - return a list of colhdrs from file
/ info:.csv.info[file] - return a table of information about the file
/ columns are: 
/	c - column name; ci - column index; t - load type; mw - max width; 
/	dchar - distinct characters in values; rule - rule that caught the type
/	maybe - needs checking, _could_ be say a date, but perhaps just a float?
/ .csv.info0[file;onlycols] - like .csv.info except that it only analyses <onlycols>
/ example:
/	info:.csv.info0[file;(.csv.colhdrs file)like"*price"]
/	info:.csv.infolike[file;"*price"]
/	show delete from info where t=" "
/ .csv.data[file;info] - use the info from .csv.info to read the data
/ .csv.data10[file;info] - like .csv.data but only returns the first 10 rows
/ bulkload[file;info] - bulk loads file into table DATA (which must be already defined :: DATA:() )
/ .csv.read[file]/read10[file] - for when you don't care about checking/tweaking the <info> before reading 

\d .csv
DELIM:","
ZAPHDRS:0b / lowercase and remove _ from colhdrs (junk characters are always removed)
WIDTHHDR:25000 / number of characters read to get the header
READLINES:222 / number of lines read and used to guess the types
SYMMAXWIDTH:11 / character columns narrower than this are stored as symbols
SYMMAXGR:10 / max symbol granularity% before we give up and keep as a * string
FORCECHARWIDTH:30 / every field (of any type) with values this wide or more is forced to character "*"
DISCARDEMPTY:0b / completely ignore empty columns if true else set them to "C"
CHUNKSIZE:50000000 / used in fs2 (modified .Q.fs)

k)nameltrim:{$[~@x;.z.s'x;~(*x)in aA:.Q.a,.Q.A;(+/&\~x in aA)_x;x]}
k)fs2:{[f;s]((-7!s)>){[f;s;x]i:1+last@&0xa=r:1:(s;x;CHUNKSIZE);f@`\:i#r;x+i}[f;s]/0j}
cleanhdrs:{{$[ZAPHDRS;lower x except"_";x]}x where x in DELIM,.Q.an}
cancast:{nw:x$"";if[not x in"BXCS";nw:(min 0#;max 0#;::)@\:nw];$[not any nw in xjQuery(11&count y)#y;$[11<count y;not any nw in x$y;1b];0b]}

read:{[file]data[file;info[file]]}  
read10:{[file]data10[file;info[file]]}  

colhdrs:{[file]
	`$nameltrim DELIM vs cleanhdrs first read0(file;0;1+first where 0xa=read1(file;0;WIDTHHDR))}
data:{[file;info]
	(exec c from info where not t=" ")xcol(exec t from info;enlist DELIM)0:file}
data10:{[file;info]
	data[;info](file;0;1+last 11#where 0xa=read1(file;0;15*WIDTHHDR))}
info0:{[file;onlycols]
	colhdrs:`$nameltrim DELIM vs cleanhdrs first head:read0(file;0;1+last where 0xa=read1(file;0;WIDTHHDR));
	loadfmts:(count colhdrs)#"S";if[count onlycols;loadfmts[where not colhdrs in onlycols]:"C"];
	breaks:where 0xa=read1(file;0;floor(10+READLINES)*WIDTHHDR%count head);
	nas:count as:colhdrs xcol(loadfmts;enlist DELIM)0:(file;0;1+last((1+READLINES)&count breaks)#breaks);
	info:([]c:key flip as;v:value flip as);as:();
	reserved:key`.q;reserved,:.Q.res;reserved,:`i;
	info:update res:c in reserved from info;
	info:update ci:i,t:"?",ipa:0b,mdot:0,mw:0,rule:0,gr:0,ndv:0,maybe:0b,empty:0b,j10:0b,j12:0b from info;
	info:update ci:`s#ci from info;
	if[count onlycols;info:update t:" ",rule:10 from info where not c in onlycols];
	info:update sdv:{string(distinct x)except`}peach v from info; 
	info:update ndv:count each sdv from info;
	info:update gr:floor 0.5+100*ndv%nas,mw:{max count each x}peach sdv from info where 0<ndv;
	info:update t:"*",rule:20 from info where mw>.csv.FORCECHARWIDTH; / long values
	info:update t:"C "[.csv.DISCARDEMPTY],rule:30,empty:1b from info where t="?",mw=0; / empty columns
	info:update dchar:{asc distinct raze x}peach sdv from info where t="?";
	info:update mdot:{max sum each"."=x}peach sdv from info where t="?",{"."in x}each dchar;
	info:update t:"n",rule:40 from info where t="?",{any x in"0123456789"}each dchar; / vaguely numeric..
	info:update t:"I",rule:50,ipa:1b from info where t="n",mw within 7 15,mdot=3,{all x in".0123456789"}each dchar,.csv.cancast["I"]peach sdv; / ip-address
	info:update t:"J",rule:60 from info where t="n",mdot=0,{all x in"+-0123456789"}each dchar,.csv.cancast["J"]peach sdv;
	info:update t:"I",rule:70 from info where t="J",mw<12,.csv.cancast["I"]peach sdv;
	info:update t:"H",rule:80 from info where t="I",mw<7,.csv.cancast["H"]peach sdv;
	info:update t:"F",rule:90 from info where t="n",mdot<2,mw>1,.csv.cancast["F"]peach sdv;
	info:update t:"E",rule:100,maybe:1b from info where t="F",mw<9;
	info:update t:"M",rule:110,maybe:1b from info where t in"nIHEF",mdot<2,mw within 4 7,.csv.cancast["M"]peach sdv; 
	info:update t:"D",rule:120,maybe:1b from info where t in"nI",mdot in 0 2,mw within 6 11,.csv.cancast["D"]peach sdv; 
	info:update t:"V",rule:130,maybe:1b from info where t="I",mw in 5 6,7<count each dchar,{all x like"*[0-9][0-5][0-9][0-5][0-9]"}peach sdv,.csv.cancast["V"]peach sdv; / 235959 12345        
	info:update t:"U",rule:140,maybe:1b from info where t="H",mw in 3 4,7<count each dchar,{all x like"*[0-9][0-5][0-9]"}peach sdv,.csv.cancast["U"]peach sdv; /2359
	info:update t:"U",rule:150,maybe:0b from info where t="n",mw in 4 5,mdot=0,{all x like"*[0-9]:[0-5][0-9]"}peach sdv,.csv.cancast["U"]peach sdv;
	info:update t:"T",rule:160,maybe:0b from info where t="n",mw within 7 12,mdot<2,{all x like"*[0-9]:[0-5][0-9]:[0-5][0-9]*"}peach sdv,.csv.cancast["T"]peach sdv;
	info:update t:"V",rule:170,maybe:0b from info where t="T",mw in 7 8,mdot=0,.csv.cancast["V"]peach sdv;
	info:update t:"T",rule:180,maybe:1b from info where t in"EF",mw within 7 10,mdot=1,{all x like"*[0-9][0-5][0-9][0-5][0-9].*"}peach sdv,.csv.cancast["T"]peach sdv;
	info:update t:"Z",rule:190,maybe:0b from info where t="n",mw within 11 24,mdot<4,.csv.cancast["Z"]peach sdv;
	info:update t:"P",rule:200,maybe:1b from info where t="n",mw within 12 29,mdot<4,{all x like"[12]*"}peach sdv,.csv.cancast["P"]peach sdv;
	info:update t:"N",rule:210,maybe:1b from info where t="n",mw within 3 28,mdot=1,.csv.cancast["N"]peach sdv;
	info:update t:"?",rule:220,maybe:0b from info where t="n"; / reset remaining maybe numeric
	info:update t:"C",rule:230,maybe:0b from info where t="?",mw=1; / char
	info:update t:"B",rule:240,maybe:0b from info where t in"HC",mw=1,mdot=0,{$[all x in"01tTfFyYnN";(any"0fFnN"in x)and any"1tTyY"in x;0b]}each dchar; / boolean
	info:update t:"B",rule:250,maybe:1b from info where t in"HC",mw=1,mdot=0,{all x in"01tTfFyYnN"}each dchar; / boolean
	info:update t:"X",rule:260,maybe:0b from info where t="?",mw=2,{$[all x in"0123456789abcdefABCDEF";(any .Q.n in x)and any"abcdefABCDEF"in x;0b]}each dchar; /hex
	info:update t:"S",rule:270,maybe:1b from info where t="?",mw<.csv.SYMMAXWIDTH,mw>1,gr<.csv.SYMMAXGR; / symbols (max width permitting)
	info:update t:"*",rule:280,maybe:0b from info where t="?"; / the rest as strings
	/ flag those S/* columns which could be encoded to integers (.Q.j10/x10/j12/x12) to avoid symbols
	info:update j12:1b from info where t in"S*",mw<13,{all x in .Q.nA}each dchar;
	info:update j10:1b from info where t in"S*",mw<11,{all x in .Q.b6}each dchar; 
	select c,ci,t,maybe,empty,res,j10,j12,ipa,mw,mdot,rule,gr,ndv,dchar from info}
info:info0[;()] / by default don't restrict columns
infolike:{[file;pattern] info0[file;{x where x like y}[lower colhdrs[file];pattern]]} / .csv.infolike[file;"*time"]

\d .
/ DATA:()
bulkload:{[file;info]
	if[not`DATA in system"v";'`DATA.not.defined];
	if[count DATA;'`DATA.not.empty];
	loadhdrs:exec c from info where not t=" ";loadfmts:exec t from info;
	.csv.fs2[{[file;loadhdrs;loadfmts] `DATA insert $[count DATA;flip loadhdrs!(loadfmts;.csv.DELIM)0:file;loadhdrs xcol(loadfmts;enlist .csv.DELIM)0:file]}[file;loadhdrs;loadfmts]];
	count DATA}
@[.:;"\\l csvutil.custom.q";::]; / save your custom settings in csvutil.custom.q to override those set at the beginning of the file 
</textarea></div>

    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        lineNumbers: true,
        matchBrackets: true
      });
    </script>

    <p><strong>MIME type defined:</strong> <code>text/x-q</code>.</p>
  </article>
codemirror/mode/q/q.js000064400000014731151215013510010673 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("q",function(config){
  var indentUnit=config.indentUnit,
      curPunc,
      keywords=buildRE(["abs","acos","aj","aj0","all","and","any","asc","asin","asof","atan","attr","avg","avgs","bin","by","ceiling","cols","cor","cos","count","cov","cross","csv","cut","delete","deltas","desc","dev","differ","distinct","div","do","each","ej","enlist","eval","except","exec","exit","exp","fby","fills","first","fkeys","flip","floor","from","get","getenv","group","gtime","hclose","hcount","hdel","hopen","hsym","iasc","idesc","if","ij","in","insert","inter","inv","key","keys","last","like","list","lj","load","log","lower","lsq","ltime","ltrim","mavg","max","maxs","mcount","md5","mdev","med","meta","min","mins","mmax","mmin","mmu","mod","msum","neg","next","not","null","or","over","parse","peach","pj","plist","prd","prds","prev","prior","rand","rank","ratios","raze","read0","read1","reciprocal","reverse","rload","rotate","rsave","rtrim","save","scan","select","set","setenv","show","signum","sin","sqrt","ss","ssr","string","sublist","sum","sums","sv","system","tables","tan","til","trim","txf","type","uj","ungroup","union","update","upper","upsert","value","var","view","views","vs","wavg","where","where","while","within","wj","wj1","wsum","xasc","xbar","xcol","xcols","xdesc","xexp","xgroup","xkey","xlog","xprev","xrank"]),
      E=/[|/&^!+:\\\-*%$=~#;@><,?_\'\"\[\(\]\)\s{}]/;
  function buildRE(w){return new RegExp("^("+w.join("|")+")$");}
  function tokenBase(stream,state){
    var sol=stream.sol(),c=stream.next();
    curPunc=null;
    if(sol)
      if(c=="/")
        return(state.tokenize=tokenLineComment)(stream,state);
      else if(c=="\\"){
        if(stream.eol()||/\s/.test(stream.peek()))
          return stream.skipToEnd(),/^\\\s*$/.test(stream.current())?(state.tokenize=tokenCommentToEOF)(stream, state):state.tokenize=tokenBase,"comment";
        else
          return state.tokenize=tokenBase,"builtin";
      }
    if(/\s/.test(c))
      return stream.peek()=="/"?(stream.skipToEnd(),"comment"):"whitespace";
    if(c=='"')
      return(state.tokenize=tokenString)(stream,state);
    if(c=='`')
      return stream.eatWhile(/[A-Z|a-z|\d|_|:|\/|\.]/),"symbol";
    if(("."==c&&/\d/.test(stream.peek()))||/\d/.test(c)){
      var t=null;
      stream.backUp(1);
      if(stream.match(/^\d{4}\.\d{2}(m|\.\d{2}([D|T](\d{2}(:\d{2}(:\d{2}(\.\d{1,9})?)?)?)?)?)/)
      || stream.match(/^\d+D(\d{2}(:\d{2}(:\d{2}(\.\d{1,9})?)?)?)/)
      || stream.match(/^\d{2}:\d{2}(:\d{2}(\.\d{1,9})?)?/)
      || stream.match(/^\d+[ptuv]{1}/))
        t="temporal";
      else if(stream.match(/^0[NwW]{1}/)
      || stream.match(/^0x[\d|a-f|A-F]*/)
      || stream.match(/^[0|1]+[b]{1}/)
      || stream.match(/^\d+[chijn]{1}/)
      || stream.match(/-?\d*(\.\d*)?(e[+\-]?\d+)?(e|f)?/))
        t="number";
      return(t&&(!(c=stream.peek())||E.test(c)))?t:(stream.next(),"error");
    }
    if(/[A-Z|a-z]|\./.test(c))
      return stream.eatWhile(/[A-Z|a-z|\.|_|\d]/),keywords.test(stream.current())?"keyword":"variable";
    if(/[|/&^!+:\\\-*%$=~#;@><\.,?_\']/.test(c))
      return null;
    if(/[{}\(\[\]\)]/.test(c))
      return null;
    return"error";
  }
  function tokenLineComment(stream,state){
    return stream.skipToEnd(),/\/\s*$/.test(stream.current())?(state.tokenize=tokenBlockComment)(stream,state):(state.tokenize=tokenBase),"comment";
  }
  function tokenBlockComment(stream,state){
    var f=stream.sol()&&stream.peek()=="\\";
    stream.skipToEnd();
    if(f&&/^\\\s*$/.test(stream.current()))
      state.tokenize=tokenBase;
    return"comment";
  }
  function tokenCommentToEOF(stream){return stream.skipToEnd(),"comment";}
  function tokenString(stream,state){
    var escaped=false,next,end=false;
    while((next=stream.next())){
      if(next=="\""&&!escaped){end=true;break;}
      escaped=!escaped&&next=="\\";
    }
    if(end)state.tokenize=tokenBase;
    return"string";
  }
  function pushContext(state,type,col){state.context={prev:state.context,indent:state.indent,col:col,type:type};}
  function popContext(state){state.indent=state.context.indent;state.context=state.context.prev;}
  return{
    startState:function(){
      return{tokenize:tokenBase,
             context:null,
             indent:0,
             col:0};
    },
    token:function(stream,state){
      if(stream.sol()){
        if(state.context&&state.context.align==null)
          state.context.align=false;
        state.indent=stream.indentation();
      }
      //if (stream.eatSpace()) return null;
      var style=state.tokenize(stream,state);
      if(style!="comment"&&state.context&&state.context.align==null&&state.context.type!="pattern"){
        state.context.align=true;
      }
      if(curPunc=="(")pushContext(state,")",stream.column());
      else if(curPunc=="[")pushContext(state,"]",stream.column());
      else if(curPunc=="{")pushContext(state,"}",stream.column());
      else if(/[\]\}\)]/.test(curPunc)){
        while(state.context&&state.context.type=="pattern")popContext(state);
        if(state.context&&curPunc==state.context.type)popContext(state);
      }
      else if(curPunc=="."&&state.context&&state.context.type=="pattern")popContext(state);
      else if(/atom|string|variable/.test(style)&&state.context){
        if(/[\}\]]/.test(state.context.type))
          pushContext(state,"pattern",stream.column());
        else if(state.context.type=="pattern"&&!state.context.align){
          state.context.align=true;
          state.context.col=stream.column();
        }
      }
      return style;
    },
    indent:function(state,textAfter){
      var firstChar=textAfter&&textAfter.charAt(0);
      var context=state.context;
      if(/[\]\}]/.test(firstChar))
        while (context&&context.type=="pattern")context=context.prev;
      var closing=context&&firstChar==context.type;
      if(!context)
        return 0;
      else if(context.type=="pattern")
        return context.col;
      else if(context.align)
        return context.col+(closing?0:1);
      else
        return context.indent+(closing?0:indentUnit);
    }
  };
});
CodeMirror.defineMIME("text/x-q","q");

});
codemirror/mode/r/r.js000064400000013055151215013510010673 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.registerHelper("wordChars", "r", /[\w.]/);

CodeMirror.defineMode("r", function(config) {
  function wordObj(str) {
    var words = str.split(" "), res = {};
    for (var i = 0; i < words.length; ++i) res[words[i]] = true;
    return res;
  }
  var atoms = wordObj("NULL NA Inf NaN NA_integer_ NA_real_ NA_complex_ NA_character_");
  var builtins = wordObj("list quote bquote eval return call parse deparse");
  var keywords = wordObj("if else repeat while function for in next break");
  var blockkeywords = wordObj("if else repeat while function for");
  var opChars = /[+\-*\/^<>=!&|~$:]/;
  var curPunc;

  function tokenBase(stream, state) {
    curPunc = null;
    var ch = stream.next();
    if (ch == "#") {
      stream.skipToEnd();
      return "comment";
    } else if (ch == "0" && stream.eat("x")) {
      stream.eatWhile(/[\da-f]/i);
      return "number";
    } else if (ch == "." && stream.eat(/\d/)) {
      stream.match(/\d*(?:e[+\-]?\d+)?/);
      return "number";
    } else if (/\d/.test(ch)) {
      stream.match(/\d*(?:\.\d+)?(?:e[+\-]\d+)?L?/);
      return "number";
    } else if (ch == "'" || ch == '"') {
      state.tokenize = tokenString(ch);
      return "string";
    } else if (ch == "." && stream.match(/.[.\d]+/)) {
      return "keyword";
    } else if (/[\w\.]/.test(ch) && ch != "_") {
      stream.eatWhile(/[\w\.]/);
      var word = stream.current();
      if (atoms.propertyIsEnumerable(word)) return "atom";
      if (keywords.propertyIsEnumerable(word)) {
        // Block keywords start new blocks, except 'else if', which only starts
        // one new block for the 'if', no block for the 'else'.
        if (blockkeywords.propertyIsEnumerable(word) &&
            !stream.match(/\s*if(\s+|$)/, false))
          curPunc = "block";
        return "keyword";
      }
      if (builtins.propertyIsEnumerable(word)) return "builtin";
      return "variable";
    } else if (ch == "%") {
      if (stream.skipTo("%")) stream.next();
      return "variable-2";
    } else if (ch == "<" && stream.eat("-")) {
      return "arrow";
    } else if (ch == "=" && state.ctx.argList) {
      return "arg-is";
    } else if (opChars.test(ch)) {
      if (ch == "$") return "dollar";
      stream.eatWhile(opChars);
      return "operator";
    } else if (/[\(\){}\[\];]/.test(ch)) {
      curPunc = ch;
      if (ch == ";") return "semi";
      return null;
    } else {
      return null;
    }
  }

  function tokenString(quote) {
    return function(stream, state) {
      if (stream.eat("\\")) {
        var ch = stream.next();
        if (ch == "x") stream.match(/^[a-f0-9]{2}/i);
        else if ((ch == "u" || ch == "U") && stream.eat("{") && stream.skipTo("}")) stream.next();
        else if (ch == "u") stream.match(/^[a-f0-9]{4}/i);
        else if (ch == "U") stream.match(/^[a-f0-9]{8}/i);
        else if (/[0-7]/.test(ch)) stream.match(/^[0-7]{1,2}/);
        return "string-2";
      } else {
        var next;
        while ((next = stream.next()) != null) {
          if (next == quote) { state.tokenize = tokenBase; break; }
          if (next == "\\") { stream.backUp(1); break; }
        }
        return "string";
      }
    };
  }

  function push(state, type, stream) {
    state.ctx = {type: type,
                 indent: state.indent,
                 align: null,
                 column: stream.column(),
                 prev: state.ctx};
  }
  function pop(state) {
    state.indent = state.ctx.indent;
    state.ctx = state.ctx.prev;
  }

  return {
    startState: function() {
      return {tokenize: tokenBase,
              ctx: {type: "top",
                    indent: -config.indentUnit,
                    align: false},
              indent: 0,
              afterIdent: false};
    },

    token: function(stream, state) {
      if (stream.sol()) {
        if (state.ctx.align == null) state.ctx.align = false;
        state.indent = stream.indentation();
      }
      if (stream.eatSpace()) return null;
      var style = state.tokenize(stream, state);
      if (style != "comment" && state.ctx.align == null) state.ctx.align = true;

      var ctype = state.ctx.type;
      if ((curPunc == ";" || curPunc == "{" || curPunc == "}") && ctype == "block") pop(state);
      if (curPunc == "{") push(state, "}", stream);
      else if (curPunc == "(") {
        push(state, ")", stream);
        if (state.afterIdent) state.ctx.argList = true;
      }
      else if (curPunc == "[") push(state, "]", stream);
      else if (curPunc == "block") push(state, "block", stream);
      else if (curPunc == ctype) pop(state);
      state.afterIdent = style == "variable" || style == "keyword";
      return style;
    },

    indent: function(state, textAfter) {
      if (state.tokenize != tokenBase) return 0;
      var firstChar = textAfter && textAfter.charAt(0), ctx = state.ctx,
          closing = firstChar == ctx.type;
      if (ctx.type == "block") return ctx.indent + (firstChar == "{" ? 0 : config.indentUnit);
      else if (ctx.align) return ctx.column + (closing ? 0 : 1);
      else return ctx.indent + (closing ? 0 : config.indentUnit);
    },

    lineComment: "#"
  };
});

CodeMirror.defineMIME("text/x-rsrc", "r");

});
codemirror/mode/r/index.html000064400000005016151215013510012067 0ustar00<!doctype html>

<title>CodeMirror: R mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="r.js"></script>
<style>
      .CodeMirror { border-top: 1px solid silver; border-bottom: 1px solid silver; }
      .cm-s-default span.cm-semi { color: blue; font-weight: bold; }
      .cm-s-default span.cm-dollar { color: orange; font-weight: bold; }
      .cm-s-default span.cm-arrow { color: brown; }
      .cm-s-default span.cm-arg-is { color: brown; }
    </style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">R</a>
  </ul>
</div>

<article>
<h2>R mode</h2>
<form><textarea id="code" name="code">
# Code from http://www.mayin.org/ajayshah/KB/R/

# FIRST LEARN ABOUT LISTS --
X = list(height=5.4, weight=54)
print("Use default printing --")
print(X)
print("Accessing individual elements --")
cat("Your height is ", X$height, " and your weight is ", X$weight, "\n")

# FUNCTIONS --
square <- function(x) {
  return(x*x)
}
cat("The square of 3 is ", square(3), "\n")

                 # default value of the arg is set to 5.
cube <- function(x=5) {
  return(x*x*x);
}
cat("Calling cube with 2 : ", cube(2), "\n")    # will give 2^3
cat("Calling cube        : ", cube(), "\n")     # will default to 5^3.

# LEARN ABOUT FUNCTIONS THAT RETURN MULTIPLE OBJECTS --
powers <- function(x) {
  parcel = list(x2=x*x, x3=x*x*x, x4=x*x*x*x);
  return(parcel);
}

X = powers(3);
print("Showing powers of 3 --"); print(X);

# WRITING THIS COMPACTLY (4 lines instead of 7)

powerful <- function(x) {
  return(list(x2=x*x, x3=x*x*x, x4=x*x*x*x));
}
print("Showing powers of 3 --"); print(powerful(3));

# In R, the last expression in a function is, by default, what is
# returned. So you could equally just say:
powerful <- function(x) {list(x2=x*x, x3=x*x*x, x4=x*x*x*x)}
</textarea></form>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {});
    </script>

    <p><strong>MIME types defined:</strong> <code>text/x-rsrc</code>.</p>

    <p>Development of the CodeMirror R mode was kindly sponsored
    by <a href="https://twitter.com/ubalo">Ubalo</a>.</p>

  </article>
codemirror/mode/python/index.html000064400000013476151215013510013160 0ustar00<!doctype html>

<title>CodeMirror: Python mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="python.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Python</a>
  </ul>
</div>

<article>
<h2>Python mode</h2>

    <div><textarea id="code" name="code">
# Literals
1234
0.0e101
.123
0b01010011100
0o01234567
0x0987654321abcdef
7
2147483647
3L
79228162514264337593543950336L
0x100000000L
79228162514264337593543950336
0xdeadbeef
3.14j
10.j
10j
.001j
1e100j
3.14e-10j


# String Literals
'For\''
"God\""
"""so loved
the world"""
'''that he gave
his only begotten\' '''
'that whosoever believeth \
in him'
''

# Identifiers
__a__
a.b
a.b.c

#Unicode identifiers on Python3
# a = x\ddot
a⃗ = ẍ
# a = v\dot
a⃗ = v̇

#F\vec = m \cdot a\vec
F⃗ = m•a⃗ 

# Operators
+ - * / % & | ^ ~ < >
== != <= >= <> << >> // **
and or not in is

#infix matrix multiplication operator (PEP 465)
A @ B

# Delimiters
() [] {} , : ` = ; @ .  # Note that @ and . require the proper context on Python 2.
+= -= *= /= %= &= |= ^=
//= >>= <<= **=

# Keywords
as assert break class continue def del elif else except
finally for from global if import lambda pass raise
return try while with yield

# Python 2 Keywords (otherwise Identifiers)
exec print

# Python 3 Keywords (otherwise Identifiers)
nonlocal

# Types
bool classmethod complex dict enumerate float frozenset int list object
property reversed set slice staticmethod str super tuple type

# Python 2 Types (otherwise Identifiers)
basestring buffer file long unicode xrange

# Python 3 Types (otherwise Identifiers)
bytearray bytes filter map memoryview open range zip

# Some Example code
import os
from package import ParentClass

@nonsenseDecorator
def doesNothing():
    pass

class ExampleClass(ParentClass):
    @staticmethod
    def example(inputStr):
        a = list(inputStr)
        a.reverse()
        return ''.join(a)

    def __init__(self, mixin = 'Hello'):
        self.mixin = mixin

</textarea></div>


<h2>Cython mode</h2>

<div><textarea id="code-cython" name="code-cython">

import numpy as np
cimport cython
from libc.math cimport sqrt

@cython.boundscheck(False)
@cython.wraparound(False)
def pairwise_cython(double[:, ::1] X):
    cdef int M = X.shape[0]
    cdef int N = X.shape[1]
    cdef double tmp, d
    cdef double[:, ::1] D = np.empty((M, M), dtype=np.float64)
    for i in range(M):
        for j in range(M):
            d = 0.0
            for k in range(N):
                tmp = X[i, k] - X[j, k]
                d += tmp * tmp
            D[i, j] = sqrt(d)
    return np.asarray(D)

</textarea></div>

    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        mode: {name: "python",
               version: 3,
               singleLineStringErrors: false},
        lineNumbers: true,
        indentUnit: 4,
        matchBrackets: true
    });

    CodeMirror.fromTextArea(document.getElementById("code-cython"), {
        mode: {name: "text/x-cython",
               version: 2,
               singleLineStringErrors: false},
        lineNumbers: true,
        indentUnit: 4,
        matchBrackets: true
      });
    </script>
    <h2>Configuration Options for Python mode:</h2>
    <ul>
      <li>version - 2/3 - The version of Python to recognize.  Default is 2.</li>
      <li>singleLineStringErrors - true/false - If you have a single-line string that is not terminated at the end of the line, this will show subsequent lines as errors if true, otherwise it will consider the newline as the end of the string. Default is false.</li>
      <li>hangingIndent - int - If you want to write long arguments to a function starting on a new line, how much that line should be indented. Defaults to one normal indentation unit.</li>
    </ul>
    <h2>Advanced Configuration Options:</h2>
    <p>Usefull for superset of python syntax like Enthought enaml, IPython magics and  questionmark help</p>
    <ul>
      <li>singleOperators - RegEx - Regular Expression for single operator matching,  default : <pre>^[\\+\\-\\*/%&amp;|\\^~&lt;&gt;!]</pre> including <pre>@</pre> on Python 3</li>
      <li>singleDelimiters - RegEx - Regular Expression for single delimiter matching, default :  <pre>^[\\(\\)\\[\\]\\{\\}@,:`=;\\.]</pre></li>
      <li>doubleOperators - RegEx - Regular Expression for double operators matching, default : <pre>^((==)|(!=)|(&lt;=)|(&gt;=)|(&lt;&gt;)|(&lt;&lt;)|(&gt;&gt;)|(//)|(\\*\\*))</pre></li>
      <li>doubleDelimiters - RegEx - Regular Expression for double delimiters matching, default : <pre>^((\\+=)|(\\-=)|(\\*=)|(%=)|(/=)|(&amp;=)|(\\|=)|(\\^=))</pre></li>
      <li>tripleDelimiters - RegEx - Regular Expression for triple delimiters matching, default : <pre>^((//=)|(&gt;&gt;=)|(&lt;&lt;=)|(\\*\\*=))</pre></li>
      <li>identifiers - RegEx - Regular Expression for identifier, default : <pre>^[_A-Za-z][_A-Za-z0-9]*</pre> on Python 2 and <pre>^[_A-Za-z\u00A1-\uFFFF][_A-Za-z0-9\u00A1-\uFFFF]*</pre> on Python 3.</li>
      <li>extra_keywords - list of string - List of extra words ton consider as keywords</li>
      <li>extra_builtins - list of string - List of extra words ton consider as builtins</li>
    </ul>


    <p><strong>MIME types defined:</strong> <code>text/x-python</code> and <code>text/x-cython</code>.</p>
  </article>
codemirror/mode/python/test.js000064400000002223151215013510012464 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function() {
  var mode = CodeMirror.getMode({indentUnit: 4},
              {name: "python",
               version: 3,
               singleLineStringErrors: false});
  function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); }

  // Error, because "foobarhello" is neither a known type or property, but
  // property was expected (after "and"), and it should be in parentheses.
  MT("decoratorStartOfLine",
     "[meta @dec]",
     "[keyword def] [def function]():",
     "    [keyword pass]");

  MT("decoratorIndented",
     "[keyword class] [def Foo]:",
     "    [meta @dec]",
     "    [keyword def] [def function]():",
     "        [keyword pass]");

  MT("matmulWithSpace:", "[variable a] [operator @] [variable b]");
  MT("matmulWithoutSpace:", "[variable a][operator @][variable b]");
  MT("matmulSpaceBefore:", "[variable a] [operator @][variable b]");

  MT("fValidStringPrefix", "[string f'this is a {formatted} string']");
  MT("uValidStringPrefix", "[string u'this is an unicode string']");
})();
codemirror/mode/python/python.js000064400000030225151215013510013031 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  function wordRegexp(words) {
    return new RegExp("^((" + words.join(")|(") + "))\\b");
  }

  var wordOperators = wordRegexp(["and", "or", "not", "is"]);
  var commonKeywords = ["as", "assert", "break", "class", "continue",
                        "def", "del", "elif", "else", "except", "finally",
                        "for", "from", "global", "if", "import",
                        "lambda", "pass", "raise", "return",
                        "try", "while", "with", "yield", "in"];
  var commonBuiltins = ["abs", "all", "any", "bin", "bool", "bytearray", "callable", "chr",
                        "classmethod", "compile", "complex", "delattr", "dict", "dir", "divmod",
                        "enumerate", "eval", "filter", "float", "format", "frozenset",
                        "getattr", "globals", "hasattr", "hash", "help", "hex", "id",
                        "input", "int", "isinstance", "issubclass", "iter", "len",
                        "list", "locals", "map", "max", "memoryview", "min", "next",
                        "object", "oct", "open", "ord", "pow", "property", "range",
                        "repr", "reversed", "round", "set", "setattr", "slice",
                        "sorted", "staticmethod", "str", "sum", "super", "tuple",
                        "type", "vars", "zip", "__import__", "NotImplemented",
                        "Ellipsis", "__debug__"];
  CodeMirror.registerHelper("hintWords", "python", commonKeywords.concat(commonBuiltins));

  function top(state) {
    return state.scopes[state.scopes.length - 1];
  }

  CodeMirror.defineMode("python", function(conf, parserConf) {
    var ERRORCLASS = "error";

    var singleDelimiters = parserConf.singleDelimiters || /^[\(\)\[\]\{\}@,:`=;\.]/;
    var doubleOperators = parserConf.doubleOperators || /^([!<>]==|<>|<<|>>|\/\/|\*\*)/;
    var doubleDelimiters = parserConf.doubleDelimiters || /^(\+=|\-=|\*=|%=|\/=|&=|\|=|\^=)/;
    var tripleDelimiters = parserConf.tripleDelimiters || /^(\/\/=|>>=|<<=|\*\*=)/;

    var hangingIndent = parserConf.hangingIndent || conf.indentUnit;

    var myKeywords = commonKeywords, myBuiltins = commonBuiltins;
    if (parserConf.extra_keywords != undefined)
      myKeywords = myKeywords.concat(parserConf.extra_keywords);

    if (parserConf.extra_builtins != undefined)
      myBuiltins = myBuiltins.concat(parserConf.extra_builtins);

    var py3 = !(parserConf.version && Number(parserConf.version) < 3)
    if (py3) {
      // since http://legacy.python.org/dev/peps/pep-0465/ @ is also an operator
      var singleOperators = parserConf.singleOperators || /^[\+\-\*\/%&|\^~<>!@]/;
      var identifiers = parserConf.identifiers|| /^[_A-Za-z\u00A1-\uFFFF][_A-Za-z0-9\u00A1-\uFFFF]*/;
      myKeywords = myKeywords.concat(["nonlocal", "False", "True", "None", "async", "await"]);
      myBuiltins = myBuiltins.concat(["ascii", "bytes", "exec", "print"]);
      var stringPrefixes = new RegExp("^(([rbuf]|(br))?('{3}|\"{3}|['\"]))", "i");
    } else {
      var singleOperators = parserConf.singleOperators || /^[\+\-\*\/%&|\^~<>!]/;
      var identifiers = parserConf.identifiers|| /^[_A-Za-z][_A-Za-z0-9]*/;
      myKeywords = myKeywords.concat(["exec", "print"]);
      myBuiltins = myBuiltins.concat(["apply", "basestring", "buffer", "cmp", "coerce", "execfile",
                                      "file", "intern", "long", "raw_input", "reduce", "reload",
                                      "unichr", "unicode", "xrange", "False", "True", "None"]);
      var stringPrefixes = new RegExp("^(([rub]|(ur)|(br))?('{3}|\"{3}|['\"]))", "i");
    }
    var keywords = wordRegexp(myKeywords);
    var builtins = wordRegexp(myBuiltins);

    // tokenizers
    function tokenBase(stream, state) {
      if (stream.sol()) state.indent = stream.indentation()
      // Handle scope changes
      if (stream.sol() && top(state).type == "py") {
        var scopeOffset = top(state).offset;
        if (stream.eatSpace()) {
          var lineOffset = stream.indentation();
          if (lineOffset > scopeOffset)
            pushPyScope(state);
          else if (lineOffset < scopeOffset && dedent(stream, state))
            state.errorToken = true;
          return null;
        } else {
          var style = tokenBaseInner(stream, state);
          if (scopeOffset > 0 && dedent(stream, state))
            style += " " + ERRORCLASS;
          return style;
        }
      }
      return tokenBaseInner(stream, state);
    }

    function tokenBaseInner(stream, state) {
      if (stream.eatSpace()) return null;

      var ch = stream.peek();

      // Handle Comments
      if (ch == "#") {
        stream.skipToEnd();
        return "comment";
      }

      // Handle Number Literals
      if (stream.match(/^[0-9\.]/, false)) {
        var floatLiteral = false;
        // Floats
        if (stream.match(/^\d*\.\d+(e[\+\-]?\d+)?/i)) { floatLiteral = true; }
        if (stream.match(/^\d+\.\d*/)) { floatLiteral = true; }
        if (stream.match(/^\.\d+/)) { floatLiteral = true; }
        if (floatLiteral) {
          // Float literals may be "imaginary"
          stream.eat(/J/i);
          return "number";
        }
        // Integers
        var intLiteral = false;
        // Hex
        if (stream.match(/^0x[0-9a-f]+/i)) intLiteral = true;
        // Binary
        if (stream.match(/^0b[01]+/i)) intLiteral = true;
        // Octal
        if (stream.match(/^0o[0-7]+/i)) intLiteral = true;
        // Decimal
        if (stream.match(/^[1-9]\d*(e[\+\-]?\d+)?/)) {
          // Decimal literals may be "imaginary"
          stream.eat(/J/i);
          // TODO - Can you have imaginary longs?
          intLiteral = true;
        }
        // Zero by itself with no other piece of number.
        if (stream.match(/^0(?![\dx])/i)) intLiteral = true;
        if (intLiteral) {
          // Integer literals may be "long"
          stream.eat(/L/i);
          return "number";
        }
      }

      // Handle Strings
      if (stream.match(stringPrefixes)) {
        state.tokenize = tokenStringFactory(stream.current());
        return state.tokenize(stream, state);
      }

      // Handle operators and Delimiters
      if (stream.match(tripleDelimiters) || stream.match(doubleDelimiters))
        return "punctuation";

      if (stream.match(doubleOperators) || stream.match(singleOperators))
        return "operator";

      if (stream.match(singleDelimiters))
        return "punctuation";

      if (state.lastToken == "." && stream.match(identifiers))
        return "property";

      if (stream.match(keywords) || stream.match(wordOperators))
        return "keyword";

      if (stream.match(builtins))
        return "builtin";

      if (stream.match(/^(self|cls)\b/))
        return "variable-2";

      if (stream.match(identifiers)) {
        if (state.lastToken == "def" || state.lastToken == "class")
          return "def";
        return "variable";
      }

      // Handle non-detected items
      stream.next();
      return ERRORCLASS;
    }

    function tokenStringFactory(delimiter) {
      while ("rubf".indexOf(delimiter.charAt(0).toLowerCase()) >= 0)
        delimiter = delimiter.substr(1);

      var singleline = delimiter.length == 1;
      var OUTCLASS = "string";

      function tokenString(stream, state) {
        while (!stream.eol()) {
          stream.eatWhile(/[^'"\\]/);
          if (stream.eat("\\")) {
            stream.next();
            if (singleline && stream.eol())
              return OUTCLASS;
          } else if (stream.match(delimiter)) {
            state.tokenize = tokenBase;
            return OUTCLASS;
          } else {
            stream.eat(/['"]/);
          }
        }
        if (singleline) {
          if (parserConf.singleLineStringErrors)
            return ERRORCLASS;
          else
            state.tokenize = tokenBase;
        }
        return OUTCLASS;
      }
      tokenString.isString = true;
      return tokenString;
    }

    function pushPyScope(state) {
      while (top(state).type != "py") state.scopes.pop()
      state.scopes.push({offset: top(state).offset + conf.indentUnit,
                         type: "py",
                         align: null})
    }

    function pushBracketScope(stream, state, type) {
      var align = stream.match(/^([\s\[\{\(]|#.*)*$/, false) ? null : stream.column() + 1
      state.scopes.push({offset: state.indent + hangingIndent,
                         type: type,
                         align: align})
    }

    function dedent(stream, state) {
      var indented = stream.indentation();
      while (state.scopes.length > 1 && top(state).offset > indented) {
        if (top(state).type != "py") return true;
        state.scopes.pop();
      }
      return top(state).offset != indented;
    }

    function tokenLexer(stream, state) {
      if (stream.sol()) state.beginningOfLine = true;

      var style = state.tokenize(stream, state);
      var current = stream.current();

      // Handle decorators
      if (state.beginningOfLine && current == "@")
        return stream.match(identifiers, false) ? "meta" : py3 ? "operator" : ERRORCLASS;

      if (/\S/.test(current)) state.beginningOfLine = false;

      if ((style == "variable" || style == "builtin")
          && state.lastToken == "meta")
        style = "meta";

      // Handle scope changes.
      if (current == "pass" || current == "return")
        state.dedent += 1;

      if (current == "lambda") state.lambda = true;
      if (current == ":" && !state.lambda && top(state).type == "py")
        pushPyScope(state);

      var delimiter_index = current.length == 1 ? "[({".indexOf(current) : -1;
      if (delimiter_index != -1)
        pushBracketScope(stream, state, "])}".slice(delimiter_index, delimiter_index+1));

      delimiter_index = "])}".indexOf(current);
      if (delimiter_index != -1) {
        if (top(state).type == current) state.indent = state.scopes.pop().offset - hangingIndent
        else return ERRORCLASS;
      }
      if (state.dedent > 0 && stream.eol() && top(state).type == "py") {
        if (state.scopes.length > 1) state.scopes.pop();
        state.dedent -= 1;
      }

      return style;
    }

    var external = {
      startState: function(basecolumn) {
        return {
          tokenize: tokenBase,
          scopes: [{offset: basecolumn || 0, type: "py", align: null}],
          indent: basecolumn || 0,
          lastToken: null,
          lambda: false,
          dedent: 0
        };
      },

      token: function(stream, state) {
        var addErr = state.errorToken;
        if (addErr) state.errorToken = false;
        var style = tokenLexer(stream, state);

        if (style && style != "comment")
          state.lastToken = (style == "keyword" || style == "punctuation") ? stream.current() : style;
        if (style == "punctuation") style = null;

        if (stream.eol() && state.lambda)
          state.lambda = false;
        return addErr ? style + " " + ERRORCLASS : style;
      },

      indent: function(state, textAfter) {
        if (state.tokenize != tokenBase)
          return state.tokenize.isString ? CodeMirror.Pass : 0;

        var scope = top(state), closing = scope.type == textAfter.charAt(0)
        if (scope.align != null)
          return scope.align - (closing ? 1 : 0)
        else
          return scope.offset - (closing ? hangingIndent : 0)
      },

      electricInput: /^\s*[\}\]\)]$/,
      closeBrackets: {triples: "'\""},
      lineComment: "#",
      fold: "indent"
    };
    return external;
  });

  CodeMirror.defineMIME("text/x-python", "python");

  var words = function(str) { return str.split(" "); };

  CodeMirror.defineMIME("text/x-cython", {
    name: "python",
    extra_keywords: words("by cdef cimport cpdef ctypedef enum except"+
                          "extern gil include nogil property public"+
                          "readonly struct union DEF IF ELIF ELSE")
  });

});
codemirror/mode/oz/oz.js000064400000015002151215013510011243 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("oz", function (conf) {

  function wordRegexp(words) {
    return new RegExp("^((" + words.join(")|(") + "))\\b");
  }

  var singleOperators = /[\^@!\|<>#~\.\*\-\+\\/,=]/;
  var doubleOperators = /(<-)|(:=)|(=<)|(>=)|(<=)|(<:)|(>:)|(=:)|(\\=)|(\\=:)|(!!)|(==)|(::)/;
  var tripleOperators = /(:::)|(\.\.\.)|(=<:)|(>=:)/;

  var middle = ["in", "then", "else", "of", "elseof", "elsecase", "elseif", "catch",
    "finally", "with", "require", "prepare", "import", "export", "define", "do"];
  var end = ["end"];

  var atoms = wordRegexp(["true", "false", "nil", "unit"]);
  var commonKeywords = wordRegexp(["andthen", "at", "attr", "declare", "feat", "from", "lex",
    "mod", "mode", "orelse", "parser", "prod", "prop", "scanner", "self", "syn", "token"]);
  var openingKeywords = wordRegexp(["local", "proc", "fun", "case", "class", "if", "cond", "or", "dis",
    "choice", "not", "thread", "try", "raise", "lock", "for", "suchthat", "meth", "functor"]);
  var middleKeywords = wordRegexp(middle);
  var endKeywords = wordRegexp(end);

  // Tokenizers
  function tokenBase(stream, state) {
    if (stream.eatSpace()) {
      return null;
    }

    // Brackets
    if(stream.match(/[{}]/)) {
      return "bracket";
    }

    // Special [] keyword
    if (stream.match(/(\[])/)) {
        return "keyword"
    }

    // Operators
    if (stream.match(tripleOperators) || stream.match(doubleOperators)) {
      return "operator";
    }

    // Atoms
    if(stream.match(atoms)) {
      return 'atom';
    }

    // Opening keywords
    var matched = stream.match(openingKeywords);
    if (matched) {
      if (!state.doInCurrentLine)
        state.currentIndent++;
      else
        state.doInCurrentLine = false;

      // Special matching for signatures
      if(matched[0] == "proc" || matched[0] == "fun")
        state.tokenize = tokenFunProc;
      else if(matched[0] == "class")
        state.tokenize = tokenClass;
      else if(matched[0] == "meth")
        state.tokenize = tokenMeth;

      return 'keyword';
    }

    // Middle and other keywords
    if (stream.match(middleKeywords) || stream.match(commonKeywords)) {
      return "keyword"
    }

    // End keywords
    if (stream.match(endKeywords)) {
      state.currentIndent--;
      return 'keyword';
    }

    // Eat the next char for next comparisons
    var ch = stream.next();

    // Strings
    if (ch == '"' || ch == "'") {
      state.tokenize = tokenString(ch);
      return state.tokenize(stream, state);
    }

    // Numbers
    if (/[~\d]/.test(ch)) {
      if (ch == "~") {
        if(! /^[0-9]/.test(stream.peek()))
          return null;
        else if (( stream.next() == "0" && stream.match(/^[xX][0-9a-fA-F]+/)) || stream.match(/^[0-9]*(\.[0-9]+)?([eE][~+]?[0-9]+)?/))
          return "number";
      }

      if ((ch == "0" && stream.match(/^[xX][0-9a-fA-F]+/)) || stream.match(/^[0-9]*(\.[0-9]+)?([eE][~+]?[0-9]+)?/))
        return "number";

      return null;
    }

    // Comments
    if (ch == "%") {
      stream.skipToEnd();
      return 'comment';
    }
    else if (ch == "/") {
      if (stream.eat("*")) {
        state.tokenize = tokenComment;
        return tokenComment(stream, state);
      }
    }

    // Single operators
    if(singleOperators.test(ch)) {
      return "operator";
    }

    // If nothing match, we skip the entire alphanumerical block
    stream.eatWhile(/\w/);

    return "variable";
  }

  function tokenClass(stream, state) {
    if (stream.eatSpace()) {
      return null;
    }
    stream.match(/([A-Z][A-Za-z0-9_]*)|(`.+`)/);
    state.tokenize = tokenBase;
    return "variable-3"
  }

  function tokenMeth(stream, state) {
    if (stream.eatSpace()) {
      return null;
    }
    stream.match(/([a-zA-Z][A-Za-z0-9_]*)|(`.+`)/);
    state.tokenize = tokenBase;
    return "def"
  }

  function tokenFunProc(stream, state) {
    if (stream.eatSpace()) {
      return null;
    }

    if(!state.hasPassedFirstStage && stream.eat("{")) {
      state.hasPassedFirstStage = true;
      return "bracket";
    }
    else if(state.hasPassedFirstStage) {
      stream.match(/([A-Z][A-Za-z0-9_]*)|(`.+`)|\$/);
      state.hasPassedFirstStage = false;
      state.tokenize = tokenBase;
      return "def"
    }
    else {
      state.tokenize = tokenBase;
      return null;
    }
  }

  function tokenComment(stream, state) {
    var maybeEnd = false, ch;
    while (ch = stream.next()) {
      if (ch == "/" && maybeEnd) {
        state.tokenize = tokenBase;
        break;
      }
      maybeEnd = (ch == "*");
    }
    return "comment";
  }

  function tokenString(quote) {
    return function (stream, state) {
      var escaped = false, next, end = false;
      while ((next = stream.next()) != null) {
        if (next == quote && !escaped) {
          end = true;
          break;
        }
        escaped = !escaped && next == "\\";
      }
      if (end || !escaped)
        state.tokenize = tokenBase;
      return "string";
    };
  }

  function buildElectricInputRegEx() {
    // Reindentation should occur on [] or on a match of any of
    // the block closing keywords, at the end of a line.
    var allClosings = middle.concat(end);
    return new RegExp("[\\[\\]]|(" + allClosings.join("|") + ")$");
  }

  return {

    startState: function () {
      return {
        tokenize: tokenBase,
        currentIndent: 0,
        doInCurrentLine: false,
        hasPassedFirstStage: false
      };
    },

    token: function (stream, state) {
      if (stream.sol())
        state.doInCurrentLine = 0;

      return state.tokenize(stream, state);
    },

    indent: function (state, textAfter) {
      var trueText = textAfter.replace(/^\s+|\s+$/g, '');

      if (trueText.match(endKeywords) || trueText.match(middleKeywords) || trueText.match(/(\[])/))
        return conf.indentUnit * (state.currentIndent - 1);

      if (state.currentIndent < 0)
        return 0;

      return state.currentIndent * conf.indentUnit;
    },
    fold: "indent",
    electricInput: buildElectricInputRegEx(),
    lineComment: "%",
    blockCommentStart: "/*",
    blockCommentEnd: "*/"
  };
});

CodeMirror.defineMIME("text/x-oz", "oz");

});
codemirror/mode/oz/index.html000064400000002555151215013510012263 0ustar00<!doctype html>

<title>CodeMirror: Oz mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="oz.js"></script>
<script type="text/javascript" src="../../addon/runmode/runmode.js"></script>
<style>
  .CodeMirror {border: 1px solid #aaa;}
</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Oz</a>
  </ul>
</div>

<article>
<h2>Oz mode</h2>
<textarea id="code" name="code">
declare
fun {Ints N Max}
  if N == Max then nil
  else
    {Delay 1000}
    N|{Ints N+1 Max}
  end
end

fun {Sum S Stream}
  case Stream of nil then S
  [] H|T then S|{Sum H+S T} end
end

local X Y in
  thread X = {Ints 0 1000} end
  thread Y = {Sum 0 X} end
  {Browse Y}
end
</textarea>
<p>MIME type defined: <code>text/x-oz</code>.</p>

<script type="text/javascript">
var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
    lineNumbers: true,
    mode: "text/x-oz",
    readOnly: false
});
</script>
</article>
codemirror/mode/fortran/index.html000064400000004674151215013510013312 0ustar00<!doctype html>

<title>CodeMirror: Fortran mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="fortran.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Fortran</a>
  </ul>
</div>

<article>
<h2>Fortran mode</h2>


<div><textarea id="code" name="code">
! Example Fortran code
  program average

  ! Read in some numbers and take the average
  ! As written, if there are no data points, an average of zero is returned
  ! While this may not be desired behavior, it keeps this example simple

  implicit none

  real, dimension(:), allocatable :: points
  integer                         :: number_of_points
  real                            :: average_points=0., positive_average=0., negative_average=0.

  write (*,*) "Input number of points to average:"
  read  (*,*) number_of_points

  allocate (points(number_of_points))

  write (*,*) "Enter the points to average:"
  read  (*,*) points

  ! Take the average by summing points and dividing by number_of_points
  if (number_of_points > 0) average_points = sum(points) / number_of_points

  ! Now form average over positive and negative points only
  if (count(points > 0.) > 0) then
     positive_average = sum(points, points > 0.) / count(points > 0.)
  end if

  if (count(points < 0.) > 0) then
     negative_average = sum(points, points < 0.) / count(points < 0.)
  end if

  deallocate (points)

  ! Print result to terminal
  write (*,'(a,g12.4)') 'Average = ', average_points
  write (*,'(a,g12.4)') 'Average of positive points = ', positive_average
  write (*,'(a,g12.4)') 'Average of negative points = ', negative_average

  end program average
</textarea></div>

    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        lineNumbers: true,
        mode: "text/x-fortran"
      });
    </script>

    <p><strong>MIME types defined:</strong> <code>text/x-fortran</code>.</p>
  </article>
codemirror/mode/fortran/fortran.js000064400000020756151215013510013325 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("fortran", function() {
  function words(array) {
    var keys = {};
    for (var i = 0; i < array.length; ++i) {
      keys[array[i]] = true;
    }
    return keys;
  }

  var keywords = words([
                  "abstract", "accept", "allocatable", "allocate",
                  "array", "assign", "asynchronous", "backspace",
                  "bind", "block", "byte", "call", "case",
                  "class", "close", "common", "contains",
                  "continue", "cycle", "data", "deallocate",
                  "decode", "deferred", "dimension", "do",
                  "elemental", "else", "encode", "end",
                  "endif", "entry", "enumerator", "equivalence",
                  "exit", "external", "extrinsic", "final",
                  "forall", "format", "function", "generic",
                  "go", "goto", "if", "implicit", "import", "include",
                  "inquire", "intent", "interface", "intrinsic",
                  "module", "namelist", "non_intrinsic",
                  "non_overridable", "none", "nopass",
                  "nullify", "open", "optional", "options",
                  "parameter", "pass", "pause", "pointer",
                  "print", "private", "program", "protected",
                  "public", "pure", "read", "recursive", "result",
                  "return", "rewind", "save", "select", "sequence",
                  "stop", "subroutine", "target", "then", "to", "type",
                  "use", "value", "volatile", "where", "while",
                  "write"]);
  var builtins = words(["abort", "abs", "access", "achar", "acos",
                          "adjustl", "adjustr", "aimag", "aint", "alarm",
                          "all", "allocated", "alog", "amax", "amin",
                          "amod", "and", "anint", "any", "asin",
                          "associated", "atan", "besj", "besjn", "besy",
                          "besyn", "bit_size", "btest", "cabs", "ccos",
                          "ceiling", "cexp", "char", "chdir", "chmod",
                          "clog", "cmplx", "command_argument_count",
                          "complex", "conjg", "cos", "cosh", "count",
                          "cpu_time", "cshift", "csin", "csqrt", "ctime",
                          "c_funloc", "c_loc", "c_associated", "c_null_ptr",
                          "c_null_funptr", "c_f_pointer", "c_null_char",
                          "c_alert", "c_backspace", "c_form_feed",
                          "c_new_line", "c_carriage_return",
                          "c_horizontal_tab", "c_vertical_tab", "dabs",
                          "dacos", "dasin", "datan", "date_and_time",
                          "dbesj", "dbesj", "dbesjn", "dbesy", "dbesy",
                          "dbesyn", "dble", "dcos", "dcosh", "ddim", "derf",
                          "derfc", "dexp", "digits", "dim", "dint", "dlog",
                          "dlog", "dmax", "dmin", "dmod", "dnint",
                          "dot_product", "dprod", "dsign", "dsinh",
                          "dsin", "dsqrt", "dtanh", "dtan", "dtime",
                          "eoshift", "epsilon", "erf", "erfc", "etime",
                          "exit", "exp", "exponent", "extends_type_of",
                          "fdate", "fget", "fgetc", "float", "floor",
                          "flush", "fnum", "fputc", "fput", "fraction",
                          "fseek", "fstat", "ftell", "gerror", "getarg",
                          "get_command", "get_command_argument",
                          "get_environment_variable", "getcwd",
                          "getenv", "getgid", "getlog", "getpid",
                          "getuid", "gmtime", "hostnm", "huge", "iabs",
                          "iachar", "iand", "iargc", "ibclr", "ibits",
                          "ibset", "ichar", "idate", "idim", "idint",
                          "idnint", "ieor", "ierrno", "ifix", "imag",
                          "imagpart", "index", "int", "ior", "irand",
                          "isatty", "ishft", "ishftc", "isign",
                          "iso_c_binding", "is_iostat_end", "is_iostat_eor",
                          "itime", "kill", "kind", "lbound", "len", "len_trim",
                          "lge", "lgt", "link", "lle", "llt", "lnblnk", "loc",
                          "log", "logical", "long", "lshift", "lstat", "ltime",
                          "matmul", "max", "maxexponent", "maxloc", "maxval",
                          "mclock", "merge", "move_alloc", "min", "minexponent",
                          "minloc", "minval", "mod", "modulo", "mvbits",
                          "nearest", "new_line", "nint", "not", "or", "pack",
                          "perror", "precision", "present", "product", "radix",
                          "rand", "random_number", "random_seed", "range",
                          "real", "realpart", "rename", "repeat", "reshape",
                          "rrspacing", "rshift", "same_type_as", "scale",
                          "scan", "second", "selected_int_kind",
                          "selected_real_kind", "set_exponent", "shape",
                          "short", "sign", "signal", "sinh", "sin", "sleep",
                          "sngl", "spacing", "spread", "sqrt", "srand", "stat",
                          "sum", "symlnk", "system", "system_clock", "tan",
                          "tanh", "time", "tiny", "transfer", "transpose",
                          "trim", "ttynam", "ubound", "umask", "unlink",
                          "unpack", "verify", "xor", "zabs", "zcos", "zexp",
                          "zlog", "zsin", "zsqrt"]);

    var dataTypes =  words(["c_bool", "c_char", "c_double", "c_double_complex",
                     "c_float", "c_float_complex", "c_funptr", "c_int",
                     "c_int16_t", "c_int32_t", "c_int64_t", "c_int8_t",
                     "c_int_fast16_t", "c_int_fast32_t", "c_int_fast64_t",
                     "c_int_fast8_t", "c_int_least16_t", "c_int_least32_t",
                     "c_int_least64_t", "c_int_least8_t", "c_intmax_t",
                     "c_intptr_t", "c_long", "c_long_double",
                     "c_long_double_complex", "c_long_long", "c_ptr",
                     "c_short", "c_signed_char", "c_size_t", "character",
                     "complex", "double", "integer", "logical", "real"]);
  var isOperatorChar = /[+\-*&=<>\/\:]/;
  var litOperator = new RegExp("(\.and\.|\.or\.|\.eq\.|\.lt\.|\.le\.|\.gt\.|\.ge\.|\.ne\.|\.not\.|\.eqv\.|\.neqv\.)", "i");

  function tokenBase(stream, state) {

    if (stream.match(litOperator)){
        return 'operator';
    }

    var ch = stream.next();
    if (ch == "!") {
      stream.skipToEnd();
      return "comment";
    }
    if (ch == '"' || ch == "'") {
      state.tokenize = tokenString(ch);
      return state.tokenize(stream, state);
    }
    if (/[\[\]\(\),]/.test(ch)) {
      return null;
    }
    if (/\d/.test(ch)) {
      stream.eatWhile(/[\w\.]/);
      return "number";
    }
    if (isOperatorChar.test(ch)) {
      stream.eatWhile(isOperatorChar);
      return "operator";
    }
    stream.eatWhile(/[\w\$_]/);
    var word = stream.current().toLowerCase();

    if (keywords.hasOwnProperty(word)){
            return 'keyword';
    }
    if (builtins.hasOwnProperty(word) || dataTypes.hasOwnProperty(word)) {
            return 'builtin';
    }
    return "variable";
  }

  function tokenString(quote) {
    return function(stream, state) {
      var escaped = false, next, end = false;
      while ((next = stream.next()) != null) {
        if (next == quote && !escaped) {
            end = true;
            break;
        }
        escaped = !escaped && next == "\\";
      }
      if (end || !escaped) state.tokenize = null;
      return "string";
    };
  }

  // Interface

  return {
    startState: function() {
      return {tokenize: null};
    },

    token: function(stream, state) {
      if (stream.eatSpace()) return null;
      var style = (state.tokenize || tokenBase)(stream, state);
      if (style == "comment" || style == "meta") return style;
      return style;
    }
  };
});

CodeMirror.defineMIME("text/x-fortran", "fortran");

});
codemirror/mode/sieve/sieve.js000064400000010275151215013510012420 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("sieve", function(config) {
  function words(str) {
    var obj = {}, words = str.split(" ");
    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
    return obj;
  }

  var keywords = words("if elsif else stop require");
  var atoms = words("true false not");
  var indentUnit = config.indentUnit;

  function tokenBase(stream, state) {

    var ch = stream.next();
    if (ch == "/" && stream.eat("*")) {
      state.tokenize = tokenCComment;
      return tokenCComment(stream, state);
    }

    if (ch === '#') {
      stream.skipToEnd();
      return "comment";
    }

    if (ch == "\"") {
      state.tokenize = tokenString(ch);
      return state.tokenize(stream, state);
    }

    if (ch == "(") {
      state._indent.push("(");
      // add virtual angel wings so that editor behaves...
      // ...more sane incase of broken brackets
      state._indent.push("{");
      return null;
    }

    if (ch === "{") {
      state._indent.push("{");
      return null;
    }

    if (ch == ")")  {
      state._indent.pop();
      state._indent.pop();
    }

    if (ch === "}") {
      state._indent.pop();
      return null;
    }

    if (ch == ",")
      return null;

    if (ch == ";")
      return null;


    if (/[{}\(\),;]/.test(ch))
      return null;

    // 1*DIGIT "K" / "M" / "G"
    if (/\d/.test(ch)) {
      stream.eatWhile(/[\d]/);
      stream.eat(/[KkMmGg]/);
      return "number";
    }

    // ":" (ALPHA / "_") *(ALPHA / DIGIT / "_")
    if (ch == ":") {
      stream.eatWhile(/[a-zA-Z_]/);
      stream.eatWhile(/[a-zA-Z0-9_]/);

      return "operator";
    }

    stream.eatWhile(/\w/);
    var cur = stream.current();

    // "text:" *(SP / HTAB) (hash-comment / CRLF)
    // *(multiline-literal / multiline-dotstart)
    // "." CRLF
    if ((cur == "text") && stream.eat(":"))
    {
      state.tokenize = tokenMultiLineString;
      return "string";
    }

    if (keywords.propertyIsEnumerable(cur))
      return "keyword";

    if (atoms.propertyIsEnumerable(cur))
      return "atom";

    return null;
  }

  function tokenMultiLineString(stream, state)
  {
    state._multiLineString = true;
    // the first line is special it may contain a comment
    if (!stream.sol()) {
      stream.eatSpace();

      if (stream.peek() == "#") {
        stream.skipToEnd();
        return "comment";
      }

      stream.skipToEnd();
      return "string";
    }

    if ((stream.next() == ".")  && (stream.eol()))
    {
      state._multiLineString = false;
      state.tokenize = tokenBase;
    }

    return "string";
  }

  function tokenCComment(stream, state) {
    var maybeEnd = false, ch;
    while ((ch = stream.next()) != null) {
      if (maybeEnd && ch == "/") {
        state.tokenize = tokenBase;
        break;
      }
      maybeEnd = (ch == "*");
    }
    return "comment";
  }

  function tokenString(quote) {
    return function(stream, state) {
      var escaped = false, ch;
      while ((ch = stream.next()) != null) {
        if (ch == quote && !escaped)
          break;
        escaped = !escaped && ch == "\\";
      }
      if (!escaped) state.tokenize = tokenBase;
      return "string";
    };
  }

  return {
    startState: function(base) {
      return {tokenize: tokenBase,
              baseIndent: base || 0,
              _indent: []};
    },

    token: function(stream, state) {
      if (stream.eatSpace())
        return null;

      return (state.tokenize || tokenBase)(stream, state);;
    },

    indent: function(state, _textAfter) {
      var length = state._indent.length;
      if (_textAfter && (_textAfter[0] == "}"))
        length--;

      if (length <0)
        length = 0;

      return length * indentUnit;
    },

    electricChars: "}"
  };
});

CodeMirror.defineMIME("application/sieve", "sieve");

});
codemirror/mode/sieve/index.html000064400000004437151215013510012747 0ustar00<!doctype html>

<title>CodeMirror: Sieve (RFC5228) mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="sieve.js"></script>
<style>.CodeMirror {background: #f8f8f8;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Sieve (RFC5228)</a>
  </ul>
</div>

<article>
<h2>Sieve (RFC5228) mode</h2>
<form><textarea id="code" name="code">
#
# Example Sieve Filter
# Declare any optional features or extension used by the script
#

require ["fileinto", "reject"];

#
# Reject any large messages (note that the four leading dots get
# "stuffed" to three)
#
if size :over 1M
{
  reject text:
Please do not send me large attachments.
Put your file on a server and send me the URL.
Thank you.
.... Fred
.
;
  stop;
}

#
# Handle messages from known mailing lists
# Move messages from IETF filter discussion list to filter folder
#
if header :is "Sender" "owner-ietf-mta-filters@imc.org"
{
  fileinto "filter";  # move to "filter" folder
}
#
# Keep all messages to or from people in my company
#
elsif address :domain :is ["From", "To"] "example.com"
{
  keep;               # keep in "In" folder
}

#
# Try and catch unsolicited email.  If a message is not to me,
# or it contains a subject known to be spam, file it away.
#
elsif anyof (not address :all :contains
               ["To", "Cc", "Bcc"] "me@example.com",
             header :matches "subject"
               ["*make*money*fast*", "*university*dipl*mas*"])
{
  # If message header does not contain my address,
  # it's from a list.
  fileinto "spam";   # move to "spam" folder
}
else
{
  # Move all other (non-company) mail to "personal"
  # folder.
  fileinto "personal";
}
</textarea></form>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {});
    </script>

    <p><strong>MIME types defined:</strong> <code>application/sieve</code>.</p>

  </article>
codemirror/mode/slim/index.html000064400000005567151215013510012605 0ustar00<!doctype html>

<title>CodeMirror: SLIM mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<link rel="stylesheet" href="../../theme/ambiance.css">
<script src="https://code.jquery.com/jquery-1.11.1.min.js"></script>
<script src="https://code.jquery.com/ui/1.11.0/jquery-ui.min.js"></script>
<link rel="stylesheet" href="https://code.jquery.com/ui/1.11.0/themes/smoothness/jquery-ui.css">
<script src="../../lib/codemirror.js"></script>
<script src="../xml/xml.js"></script>
<script src="../htmlembedded/htmlembedded.js"></script>
<script src="../htmlmixed/htmlmixed.js"></script>
<script src="../coffeescript/coffeescript.js"></script>
<script src="../javascript/javascript.js"></script>
<script src="../ruby/ruby.js"></script>
<script src="../markdown/markdown.js"></script>
<script src="slim.js"></script>
<style>.CodeMirror {background: #f8f8f8;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">SLIM</a>
  </ul>
</div>

<article>
  <h2>SLIM mode</h2>
  <form><textarea id="code" name="code">
body
  table
    - for user in users
      td id="user_#{user.id}" class=user.role
        a href=user_action(user, :edit) Edit #{user.name}
        a href=(path_to_user user) = user.name
body
  h1(id="logo") = page_logo
  h2[id="tagline" class="small tagline"] = page_tagline

h2[id="tagline"
   class="small tagline"] = page_tagline

h1 id = "logo" = page_logo
h2 [ id = "tagline" ] = page_tagline

/ comment
  second line
/! html comment
   second line
<!-- html comment -->
<a href="#{'hello' if set}">link</a>
a.slim href="work" disabled=false running==:atom Text <b>bold</b>
.clazz data-id="test" == 'hello' unless quark
 | Text mode #{12}
   Second line
= x ||= :ruby_atom
#menu.left
  - @env.each do |x|
    li: a = x
*@dyntag attr="val"
.first *{:class => [:second, :third]} Text
.second class=["text","more"]
.third class=:text,:symbol

  </textarea></form>
  <script>
    var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
      lineNumbers: true,
      theme: "ambiance",
      mode: "application/x-slim"
    });
    jQuery('.CodeMirror').resizable({
      resize: function() {
        editor.setSize(jQuery(this).width(), jQuery(this).height());
        //editor.refresh();
      }
    });
  </script>

  <p><strong>MIME types defined:</strong> <code>application/x-slim</code>.</p>

  <p>
    <strong>Parsing/Highlighting Tests:</strong>
    <a href="../../test/index.html#slim_*">normal</a>,
    <a href="../../test/index.html#verbose,slim_*">verbose</a>.
  </p>
</article>
codemirror/mode/slim/test.js000064400000006072151215013510012115 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

// Slim Highlighting for CodeMirror copyright (c) HicknHack Software Gmbh

(function() {
  var mode = CodeMirror.getMode({tabSize: 4, indentUnit: 2}, "slim");
  function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); }

  // Requires at least one media query
  MT("elementName",
     "[tag h1] Hey There");

  MT("oneElementPerLine",
     "[tag h1] Hey There .h2");

  MT("idShortcut",
     "[attribute&def #test] Hey There");

  MT("tagWithIdShortcuts",
     "[tag h1][attribute&def #test] Hey There");

  MT("classShortcut",
     "[attribute&qualifier .hello] Hey There");

  MT("tagWithIdAndClassShortcuts",
     "[tag h1][attribute&def #test][attribute&qualifier .hello] Hey There");

  MT("docType",
     "[keyword doctype] xml");

  MT("comment",
     "[comment / Hello WORLD]");

  MT("notComment",
     "[tag h1] This is not a / comment ");

  MT("attributes",
     "[tag a]([attribute title]=[string \"test\"]) [attribute href]=[string \"link\"]}");

  MT("multiLineAttributes",
     "[tag a]([attribute title]=[string \"test\"]",
     "  ) [attribute href]=[string \"link\"]}");

  MT("htmlCode",
     "[tag&bracket <][tag h1][tag&bracket >]Title[tag&bracket </][tag h1][tag&bracket >]");

  MT("rubyBlock",
     "[operator&special =][variable-2 @item]");

  MT("selectorRubyBlock",
     "[tag a][attribute&qualifier .test][operator&special =] [variable-2 @item]");

  MT("nestedRubyBlock",
      "[tag a]",
      "  [operator&special =][variable puts] [string \"test\"]");

  MT("multilinePlaintext",
      "[tag p]",
      "  | Hello,",
      "    World");

  MT("multilineRuby",
      "[tag p]",
      "  [comment /# this is a comment]",
      "     [comment and this is a comment too]",
      "  | Date/Time",
      "  [operator&special -] [variable now] [operator =] [tag DateTime][operator .][property now]",
      "  [tag strong][operator&special =] [variable now]",
      "  [operator&special -] [keyword if] [variable now] [operator >] [tag DateTime][operator .][property parse]([string \"December 31, 2006\"])",
      "     [operator&special =][string \"Happy\"]",
      "     [operator&special =][string \"Belated\"]",
      "     [operator&special =][string \"Birthday\"]");

  MT("multilineComment",
      "[comment /]",
      "  [comment Multiline]",
      "  [comment Comment]");

  MT("hamlAfterRubyTag",
    "[attribute&qualifier .block]",
    "  [tag strong][operator&special =] [variable now]",
    "  [attribute&qualifier .test]",
    "     [operator&special =][variable now]",
    "  [attribute&qualifier .right]");

  MT("stretchedRuby",
     "[operator&special =] [variable puts] [string \"Hello\"],",
     "   [string \"World\"]");

  MT("interpolationInHashAttribute",
     "[tag div]{[attribute id] = [string \"]#{[variable test]}[string _]#{[variable ting]}[string \"]} test");

  MT("interpolationInHTMLAttribute",
     "[tag div]([attribute title]=[string \"]#{[variable test]}[string _]#{[variable ting]()}[string \"]) Test");
})();
codemirror/mode/slim/slim.js000064400000043152151215013510012102 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

// Slim Highlighting for CodeMirror copyright (c) HicknHack Software Gmbh

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"), require("../ruby/ruby"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror", "../htmlmixed/htmlmixed", "../ruby/ruby"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

  CodeMirror.defineMode("slim", function(config) {
    var htmlMode = CodeMirror.getMode(config, {name: "htmlmixed"});
    var rubyMode = CodeMirror.getMode(config, "ruby");
    var modes = { html: htmlMode, ruby: rubyMode };
    var embedded = {
      ruby: "ruby",
      javascript: "javascript",
      css: "text/css",
      sass: "text/x-sass",
      scss: "text/x-scss",
      less: "text/x-less",
      styl: "text/x-styl", // no highlighting so far
      coffee: "coffeescript",
      asciidoc: "text/x-asciidoc",
      markdown: "text/x-markdown",
      textile: "text/x-textile", // no highlighting so far
      creole: "text/x-creole", // no highlighting so far
      wiki: "text/x-wiki", // no highlighting so far
      mediawiki: "text/x-mediawiki", // no highlighting so far
      rdoc: "text/x-rdoc", // no highlighting so far
      builder: "text/x-builder", // no highlighting so far
      nokogiri: "text/x-nokogiri", // no highlighting so far
      erb: "application/x-erb"
    };
    var embeddedRegexp = function(map){
      var arr = [];
      for(var key in map) arr.push(key);
      return new RegExp("^("+arr.join('|')+"):");
    }(embedded);

    var styleMap = {
      "commentLine": "comment",
      "slimSwitch": "operator special",
      "slimTag": "tag",
      "slimId": "attribute def",
      "slimClass": "attribute qualifier",
      "slimAttribute": "attribute",
      "slimSubmode": "keyword special",
      "closeAttributeTag": null,
      "slimDoctype": null,
      "lineContinuation": null
    };
    var closing = {
      "{": "}",
      "[": "]",
      "(": ")"
    };

    var nameStartChar = "_a-zA-Z\xC0-\xD6\xD8-\xF6\xF8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD";
    var nameChar = nameStartChar + "\\-0-9\xB7\u0300-\u036F\u203F-\u2040";
    var nameRegexp = new RegExp("^[:"+nameStartChar+"](?::["+nameChar+"]|["+nameChar+"]*)");
    var attributeNameRegexp = new RegExp("^[:"+nameStartChar+"][:\\."+nameChar+"]*(?=\\s*=)");
    var wrappedAttributeNameRegexp = new RegExp("^[:"+nameStartChar+"][:\\."+nameChar+"]*");
    var classNameRegexp = /^\.-?[_a-zA-Z]+[\w\-]*/;
    var classIdRegexp = /^#[_a-zA-Z]+[\w\-]*/;

    function backup(pos, tokenize, style) {
      var restore = function(stream, state) {
        state.tokenize = tokenize;
        if (stream.pos < pos) {
          stream.pos = pos;
          return style;
        }
        return state.tokenize(stream, state);
      };
      return function(stream, state) {
        state.tokenize = restore;
        return tokenize(stream, state);
      };
    }

    function maybeBackup(stream, state, pat, offset, style) {
      var cur = stream.current();
      var idx = cur.search(pat);
      if (idx > -1) {
        state.tokenize = backup(stream.pos, state.tokenize, style);
        stream.backUp(cur.length - idx - offset);
      }
      return style;
    }

    function continueLine(state, column) {
      state.stack = {
        parent: state.stack,
        style: "continuation",
        indented: column,
        tokenize: state.line
      };
      state.line = state.tokenize;
    }
    function finishContinue(state) {
      if (state.line == state.tokenize) {
        state.line = state.stack.tokenize;
        state.stack = state.stack.parent;
      }
    }

    function lineContinuable(column, tokenize) {
      return function(stream, state) {
        finishContinue(state);
        if (stream.match(/^\\$/)) {
          continueLine(state, column);
          return "lineContinuation";
        }
        var style = tokenize(stream, state);
        if (stream.eol() && stream.current().match(/(?:^|[^\\])(?:\\\\)*\\$/)) {
          stream.backUp(1);
        }
        return style;
      };
    }
    function commaContinuable(column, tokenize) {
      return function(stream, state) {
        finishContinue(state);
        var style = tokenize(stream, state);
        if (stream.eol() && stream.current().match(/,$/)) {
          continueLine(state, column);
        }
        return style;
      };
    }

    function rubyInQuote(endQuote, tokenize) {
      // TODO: add multi line support
      return function(stream, state) {
        var ch = stream.peek();
        if (ch == endQuote && state.rubyState.tokenize.length == 1) {
          // step out of ruby context as it seems to complete processing all the braces
          stream.next();
          state.tokenize = tokenize;
          return "closeAttributeTag";
        } else {
          return ruby(stream, state);
        }
      };
    }
    function startRubySplat(tokenize) {
      var rubyState;
      var runSplat = function(stream, state) {
        if (state.rubyState.tokenize.length == 1 && !state.rubyState.context.prev) {
          stream.backUp(1);
          if (stream.eatSpace()) {
            state.rubyState = rubyState;
            state.tokenize = tokenize;
            return tokenize(stream, state);
          }
          stream.next();
        }
        return ruby(stream, state);
      };
      return function(stream, state) {
        rubyState = state.rubyState;
        state.rubyState = CodeMirror.startState(rubyMode);
        state.tokenize = runSplat;
        return ruby(stream, state);
      };
    }

    function ruby(stream, state) {
      return rubyMode.token(stream, state.rubyState);
    }

    function htmlLine(stream, state) {
      if (stream.match(/^\\$/)) {
        return "lineContinuation";
      }
      return html(stream, state);
    }
    function html(stream, state) {
      if (stream.match(/^#\{/)) {
        state.tokenize = rubyInQuote("}", state.tokenize);
        return null;
      }
      return maybeBackup(stream, state, /[^\\]#\{/, 1, htmlMode.token(stream, state.htmlState));
    }

    function startHtmlLine(lastTokenize) {
      return function(stream, state) {
        var style = htmlLine(stream, state);
        if (stream.eol()) state.tokenize = lastTokenize;
        return style;
      };
    }

    function startHtmlMode(stream, state, offset) {
      state.stack = {
        parent: state.stack,
        style: "html",
        indented: stream.column() + offset, // pipe + space
        tokenize: state.line
      };
      state.line = state.tokenize = html;
      return null;
    }

    function comment(stream, state) {
      stream.skipToEnd();
      return state.stack.style;
    }

    function commentMode(stream, state) {
      state.stack = {
        parent: state.stack,
        style: "comment",
        indented: state.indented + 1,
        tokenize: state.line
      };
      state.line = comment;
      return comment(stream, state);
    }

    function attributeWrapper(stream, state) {
      if (stream.eat(state.stack.endQuote)) {
        state.line = state.stack.line;
        state.tokenize = state.stack.tokenize;
        state.stack = state.stack.parent;
        return null;
      }
      if (stream.match(wrappedAttributeNameRegexp)) {
        state.tokenize = attributeWrapperAssign;
        return "slimAttribute";
      }
      stream.next();
      return null;
    }
    function attributeWrapperAssign(stream, state) {
      if (stream.match(/^==?/)) {
        state.tokenize = attributeWrapperValue;
        return null;
      }
      return attributeWrapper(stream, state);
    }
    function attributeWrapperValue(stream, state) {
      var ch = stream.peek();
      if (ch == '"' || ch == "\'") {
        state.tokenize = readQuoted(ch, "string", true, false, attributeWrapper);
        stream.next();
        return state.tokenize(stream, state);
      }
      if (ch == '[') {
        return startRubySplat(attributeWrapper)(stream, state);
      }
      if (stream.match(/^(true|false|nil)\b/)) {
        state.tokenize = attributeWrapper;
        return "keyword";
      }
      return startRubySplat(attributeWrapper)(stream, state);
    }

    function startAttributeWrapperMode(state, endQuote, tokenize) {
      state.stack = {
        parent: state.stack,
        style: "wrapper",
        indented: state.indented + 1,
        tokenize: tokenize,
        line: state.line,
        endQuote: endQuote
      };
      state.line = state.tokenize = attributeWrapper;
      return null;
    }

    function sub(stream, state) {
      if (stream.match(/^#\{/)) {
        state.tokenize = rubyInQuote("}", state.tokenize);
        return null;
      }
      var subStream = new CodeMirror.StringStream(stream.string.slice(state.stack.indented), stream.tabSize);
      subStream.pos = stream.pos - state.stack.indented;
      subStream.start = stream.start - state.stack.indented;
      subStream.lastColumnPos = stream.lastColumnPos - state.stack.indented;
      subStream.lastColumnValue = stream.lastColumnValue - state.stack.indented;
      var style = state.subMode.token(subStream, state.subState);
      stream.pos = subStream.pos + state.stack.indented;
      return style;
    }
    function firstSub(stream, state) {
      state.stack.indented = stream.column();
      state.line = state.tokenize = sub;
      return state.tokenize(stream, state);
    }

    function createMode(mode) {
      var query = embedded[mode];
      var spec = CodeMirror.mimeModes[query];
      if (spec) {
        return CodeMirror.getMode(config, spec);
      }
      var factory = CodeMirror.modes[query];
      if (factory) {
        return factory(config, {name: query});
      }
      return CodeMirror.getMode(config, "null");
    }

    function getMode(mode) {
      if (!modes.hasOwnProperty(mode)) {
        return modes[mode] = createMode(mode);
      }
      return modes[mode];
    }

    function startSubMode(mode, state) {
      var subMode = getMode(mode);
      var subState = CodeMirror.startState(subMode);

      state.subMode = subMode;
      state.subState = subState;

      state.stack = {
        parent: state.stack,
        style: "sub",
        indented: state.indented + 1,
        tokenize: state.line
      };
      state.line = state.tokenize = firstSub;
      return "slimSubmode";
    }

    function doctypeLine(stream, _state) {
      stream.skipToEnd();
      return "slimDoctype";
    }

    function startLine(stream, state) {
      var ch = stream.peek();
      if (ch == '<') {
        return (state.tokenize = startHtmlLine(state.tokenize))(stream, state);
      }
      if (stream.match(/^[|']/)) {
        return startHtmlMode(stream, state, 1);
      }
      if (stream.match(/^\/(!|\[\w+])?/)) {
        return commentMode(stream, state);
      }
      if (stream.match(/^(-|==?[<>]?)/)) {
        state.tokenize = lineContinuable(stream.column(), commaContinuable(stream.column(), ruby));
        return "slimSwitch";
      }
      if (stream.match(/^doctype\b/)) {
        state.tokenize = doctypeLine;
        return "keyword";
      }

      var m = stream.match(embeddedRegexp);
      if (m) {
        return startSubMode(m[1], state);
      }

      return slimTag(stream, state);
    }

    function slim(stream, state) {
      if (state.startOfLine) {
        return startLine(stream, state);
      }
      return slimTag(stream, state);
    }

    function slimTag(stream, state) {
      if (stream.eat('*')) {
        state.tokenize = startRubySplat(slimTagExtras);
        return null;
      }
      if (stream.match(nameRegexp)) {
        state.tokenize = slimTagExtras;
        return "slimTag";
      }
      return slimClass(stream, state);
    }
    function slimTagExtras(stream, state) {
      if (stream.match(/^(<>?|><?)/)) {
        state.tokenize = slimClass;
        return null;
      }
      return slimClass(stream, state);
    }
    function slimClass(stream, state) {
      if (stream.match(classIdRegexp)) {
        state.tokenize = slimClass;
        return "slimId";
      }
      if (stream.match(classNameRegexp)) {
        state.tokenize = slimClass;
        return "slimClass";
      }
      return slimAttribute(stream, state);
    }
    function slimAttribute(stream, state) {
      if (stream.match(/^([\[\{\(])/)) {
        return startAttributeWrapperMode(state, closing[RegExp.$1], slimAttribute);
      }
      if (stream.match(attributeNameRegexp)) {
        state.tokenize = slimAttributeAssign;
        return "slimAttribute";
      }
      if (stream.peek() == '*') {
        stream.next();
        state.tokenize = startRubySplat(slimContent);
        return null;
      }
      return slimContent(stream, state);
    }
    function slimAttributeAssign(stream, state) {
      if (stream.match(/^==?/)) {
        state.tokenize = slimAttributeValue;
        return null;
      }
      // should never happen, because of forward lookup
      return slimAttribute(stream, state);
    }

    function slimAttributeValue(stream, state) {
      var ch = stream.peek();
      if (ch == '"' || ch == "\'") {
        state.tokenize = readQuoted(ch, "string", true, false, slimAttribute);
        stream.next();
        return state.tokenize(stream, state);
      }
      if (ch == '[') {
        return startRubySplat(slimAttribute)(stream, state);
      }
      if (ch == ':') {
        return startRubySplat(slimAttributeSymbols)(stream, state);
      }
      if (stream.match(/^(true|false|nil)\b/)) {
        state.tokenize = slimAttribute;
        return "keyword";
      }
      return startRubySplat(slimAttribute)(stream, state);
    }
    function slimAttributeSymbols(stream, state) {
      stream.backUp(1);
      if (stream.match(/^[^\s],(?=:)/)) {
        state.tokenize = startRubySplat(slimAttributeSymbols);
        return null;
      }
      stream.next();
      return slimAttribute(stream, state);
    }
    function readQuoted(quote, style, embed, unescaped, nextTokenize) {
      return function(stream, state) {
        finishContinue(state);
        var fresh = stream.current().length == 0;
        if (stream.match(/^\\$/, fresh)) {
          if (!fresh) return style;
          continueLine(state, state.indented);
          return "lineContinuation";
        }
        if (stream.match(/^#\{/, fresh)) {
          if (!fresh) return style;
          state.tokenize = rubyInQuote("}", state.tokenize);
          return null;
        }
        var escaped = false, ch;
        while ((ch = stream.next()) != null) {
          if (ch == quote && (unescaped || !escaped)) {
            state.tokenize = nextTokenize;
            break;
          }
          if (embed && ch == "#" && !escaped) {
            if (stream.eat("{")) {
              stream.backUp(2);
              break;
            }
          }
          escaped = !escaped && ch == "\\";
        }
        if (stream.eol() && escaped) {
          stream.backUp(1);
        }
        return style;
      };
    }
    function slimContent(stream, state) {
      if (stream.match(/^==?/)) {
        state.tokenize = ruby;
        return "slimSwitch";
      }
      if (stream.match(/^\/$/)) { // tag close hint
        state.tokenize = slim;
        return null;
      }
      if (stream.match(/^:/)) { // inline tag
        state.tokenize = slimTag;
        return "slimSwitch";
      }
      startHtmlMode(stream, state, 0);
      return state.tokenize(stream, state);
    }

    var mode = {
      // default to html mode
      startState: function() {
        var htmlState = CodeMirror.startState(htmlMode);
        var rubyState = CodeMirror.startState(rubyMode);
        return {
          htmlState: htmlState,
          rubyState: rubyState,
          stack: null,
          last: null,
          tokenize: slim,
          line: slim,
          indented: 0
        };
      },

      copyState: function(state) {
        return {
          htmlState : CodeMirror.copyState(htmlMode, state.htmlState),
          rubyState: CodeMirror.copyState(rubyMode, state.rubyState),
          subMode: state.subMode,
          subState: state.subMode && CodeMirror.copyState(state.subMode, state.subState),
          stack: state.stack,
          last: state.last,
          tokenize: state.tokenize,
          line: state.line
        };
      },

      token: function(stream, state) {
        if (stream.sol()) {
          state.indented = stream.indentation();
          state.startOfLine = true;
          state.tokenize = state.line;
          while (state.stack && state.stack.indented > state.indented && state.last != "slimSubmode") {
            state.line = state.tokenize = state.stack.tokenize;
            state.stack = state.stack.parent;
            state.subMode = null;
            state.subState = null;
          }
        }
        if (stream.eatSpace()) return null;
        var style = state.tokenize(stream, state);
        state.startOfLine = false;
        if (style) state.last = style;
        return styleMap.hasOwnProperty(style) ? styleMap[style] : style;
      },

      blankLine: function(state) {
        if (state.subMode && state.subMode.blankLine) {
          return state.subMode.blankLine(state.subState);
        }
      },

      innerMode: function(state) {
        if (state.subMode) return {state: state.subState, mode: state.subMode};
        return {state: state, mode: mode};
      }

      //indent: function(state) {
      //  return state.indented;
      //}
    };
    return mode;
  }, "htmlmixed", "ruby");

  CodeMirror.defineMIME("text/x-slim", "slim");
  CodeMirror.defineMIME("application/x-slim", "slim");
});
codemirror/mode/gas/index.html000064400000003460151215013510012401 0ustar00<!doctype html>

<title>CodeMirror: Gas mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="gas.js"></script>
<style>.CodeMirror {border: 2px inset #dee;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Gas</a>
  </ul>
</div>

<article>
<h2>Gas mode</h2>
<form>
<textarea id="code" name="code">
.syntax unified
.global main

/* 
 *  A
 *  multi-line
 *  comment.
 */

@ A single line comment.

main:
        push    {sp, lr}
        ldr     r0, =message
        bl      puts
        mov     r0, #0
        pop     {sp, pc}

message:
        .asciz "Hello world!<br />"
</textarea>
        </form>

        <script>
            var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
                lineNumbers: true,
                mode: {name: "gas", architecture: "ARMv6"},
            });
        </script>

        <p>Handles AT&amp;T assembler syntax (more specifically this handles
        the GNU Assembler (gas) syntax.)
        It takes a single optional configuration parameter:
        <code>architecture</code>, which can be one of <code>"ARM"</code>,
        <code>"ARMv6"</code> or <code>"x86"</code>.
        Including the parameter adds syntax for the registers and special
        directives for the supplied architecture.

        <p><strong>MIME types defined:</strong> <code>text/x-gas</code></p>
    </article>
codemirror/mode/gas/gas.js000064400000021266151215013510011520 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("gas", function(_config, parserConfig) {
  'use strict';

  // If an architecture is specified, its initialization function may
  // populate this array with custom parsing functions which will be
  // tried in the event that the standard functions do not find a match.
  var custom = [];

  // The symbol used to start a line comment changes based on the target
  // architecture.
  // If no architecture is pased in "parserConfig" then only multiline
  // comments will have syntax support.
  var lineCommentStartSymbol = "";

  // These directives are architecture independent.
  // Machine specific directives should go in their respective
  // architecture initialization function.
  // Reference:
  // http://sourceware.org/binutils/docs/as/Pseudo-Ops.html#Pseudo-Ops
  var directives = {
    ".abort" : "builtin",
    ".align" : "builtin",
    ".altmacro" : "builtin",
    ".ascii" : "builtin",
    ".asciz" : "builtin",
    ".balign" : "builtin",
    ".balignw" : "builtin",
    ".balignl" : "builtin",
    ".bundle_align_mode" : "builtin",
    ".bundle_lock" : "builtin",
    ".bundle_unlock" : "builtin",
    ".byte" : "builtin",
    ".cfi_startproc" : "builtin",
    ".comm" : "builtin",
    ".data" : "builtin",
    ".def" : "builtin",
    ".desc" : "builtin",
    ".dim" : "builtin",
    ".double" : "builtin",
    ".eject" : "builtin",
    ".else" : "builtin",
    ".elseif" : "builtin",
    ".end" : "builtin",
    ".endef" : "builtin",
    ".endfunc" : "builtin",
    ".endif" : "builtin",
    ".equ" : "builtin",
    ".equiv" : "builtin",
    ".eqv" : "builtin",
    ".err" : "builtin",
    ".error" : "builtin",
    ".exitm" : "builtin",
    ".extern" : "builtin",
    ".fail" : "builtin",
    ".file" : "builtin",
    ".fill" : "builtin",
    ".float" : "builtin",
    ".func" : "builtin",
    ".global" : "builtin",
    ".gnu_attribute" : "builtin",
    ".hidden" : "builtin",
    ".hword" : "builtin",
    ".ident" : "builtin",
    ".if" : "builtin",
    ".incbin" : "builtin",
    ".include" : "builtin",
    ".int" : "builtin",
    ".internal" : "builtin",
    ".irp" : "builtin",
    ".irpc" : "builtin",
    ".lcomm" : "builtin",
    ".lflags" : "builtin",
    ".line" : "builtin",
    ".linkonce" : "builtin",
    ".list" : "builtin",
    ".ln" : "builtin",
    ".loc" : "builtin",
    ".loc_mark_labels" : "builtin",
    ".local" : "builtin",
    ".long" : "builtin",
    ".macro" : "builtin",
    ".mri" : "builtin",
    ".noaltmacro" : "builtin",
    ".nolist" : "builtin",
    ".octa" : "builtin",
    ".offset" : "builtin",
    ".org" : "builtin",
    ".p2align" : "builtin",
    ".popsection" : "builtin",
    ".previous" : "builtin",
    ".print" : "builtin",
    ".protected" : "builtin",
    ".psize" : "builtin",
    ".purgem" : "builtin",
    ".pushsection" : "builtin",
    ".quad" : "builtin",
    ".reloc" : "builtin",
    ".rept" : "builtin",
    ".sbttl" : "builtin",
    ".scl" : "builtin",
    ".section" : "builtin",
    ".set" : "builtin",
    ".short" : "builtin",
    ".single" : "builtin",
    ".size" : "builtin",
    ".skip" : "builtin",
    ".sleb128" : "builtin",
    ".space" : "builtin",
    ".stab" : "builtin",
    ".string" : "builtin",
    ".struct" : "builtin",
    ".subsection" : "builtin",
    ".symver" : "builtin",
    ".tag" : "builtin",
    ".text" : "builtin",
    ".title" : "builtin",
    ".type" : "builtin",
    ".uleb128" : "builtin",
    ".val" : "builtin",
    ".version" : "builtin",
    ".vtable_entry" : "builtin",
    ".vtable_inherit" : "builtin",
    ".warning" : "builtin",
    ".weak" : "builtin",
    ".weakref" : "builtin",
    ".word" : "builtin"
  };

  var registers = {};

  function x86(_parserConfig) {
    lineCommentStartSymbol = "#";

    registers.ax  = "variable";
    registers.eax = "variable-2";
    registers.rax = "variable-3";

    registers.bx  = "variable";
    registers.ebx = "variable-2";
    registers.rbx = "variable-3";

    registers.cx  = "variable";
    registers.ecx = "variable-2";
    registers.rcx = "variable-3";

    registers.dx  = "variable";
    registers.edx = "variable-2";
    registers.rdx = "variable-3";

    registers.si  = "variable";
    registers.esi = "variable-2";
    registers.rsi = "variable-3";

    registers.di  = "variable";
    registers.edi = "variable-2";
    registers.rdi = "variable-3";

    registers.sp  = "variable";
    registers.esp = "variable-2";
    registers.rsp = "variable-3";

    registers.bp  = "variable";
    registers.ebp = "variable-2";
    registers.rbp = "variable-3";

    registers.ip  = "variable";
    registers.eip = "variable-2";
    registers.rip = "variable-3";

    registers.cs  = "keyword";
    registers.ds  = "keyword";
    registers.ss  = "keyword";
    registers.es  = "keyword";
    registers.fs  = "keyword";
    registers.gs  = "keyword";
  }

  function armv6(_parserConfig) {
    // Reference:
    // http://infocenter.arm.com/help/topic/com.arm.doc.qrc0001l/QRC0001_UAL.pdf
    // http://infocenter.arm.com/help/topic/com.arm.doc.ddi0301h/DDI0301H_arm1176jzfs_r0p7_trm.pdf
    lineCommentStartSymbol = "@";
    directives.syntax = "builtin";

    registers.r0  = "variable";
    registers.r1  = "variable";
    registers.r2  = "variable";
    registers.r3  = "variable";
    registers.r4  = "variable";
    registers.r5  = "variable";
    registers.r6  = "variable";
    registers.r7  = "variable";
    registers.r8  = "variable";
    registers.r9  = "variable";
    registers.r10 = "variable";
    registers.r11 = "variable";
    registers.r12 = "variable";

    registers.sp  = "variable-2";
    registers.lr  = "variable-2";
    registers.pc  = "variable-2";
    registers.r13 = registers.sp;
    registers.r14 = registers.lr;
    registers.r15 = registers.pc;

    custom.push(function(ch, stream) {
      if (ch === '#') {
        stream.eatWhile(/\w/);
        return "number";
      }
    });
  }

  var arch = (parserConfig.architecture || "x86").toLowerCase();
  if (arch === "x86") {
    x86(parserConfig);
  } else if (arch === "arm" || arch === "armv6") {
    armv6(parserConfig);
  }

  function nextUntilUnescaped(stream, end) {
    var escaped = false, next;
    while ((next = stream.next()) != null) {
      if (next === end && !escaped) {
        return false;
      }
      escaped = !escaped && next === "\\";
    }
    return escaped;
  }

  function clikeComment(stream, state) {
    var maybeEnd = false, ch;
    while ((ch = stream.next()) != null) {
      if (ch === "/" && maybeEnd) {
        state.tokenize = null;
        break;
      }
      maybeEnd = (ch === "*");
    }
    return "comment";
  }

  return {
    startState: function() {
      return {
        tokenize: null
      };
    },

    token: function(stream, state) {
      if (state.tokenize) {
        return state.tokenize(stream, state);
      }

      if (stream.eatSpace()) {
        return null;
      }

      var style, cur, ch = stream.next();

      if (ch === "/") {
        if (stream.eat("*")) {
          state.tokenize = clikeComment;
          return clikeComment(stream, state);
        }
      }

      if (ch === lineCommentStartSymbol) {
        stream.skipToEnd();
        return "comment";
      }

      if (ch === '"') {
        nextUntilUnescaped(stream, '"');
        return "string";
      }

      if (ch === '.') {
        stream.eatWhile(/\w/);
        cur = stream.current().toLowerCase();
        style = directives[cur];
        return style || null;
      }

      if (ch === '=') {
        stream.eatWhile(/\w/);
        return "tag";
      }

      if (ch === '{') {
        return "braket";
      }

      if (ch === '}') {
        return "braket";
      }

      if (/\d/.test(ch)) {
        if (ch === "0" && stream.eat("x")) {
          stream.eatWhile(/[0-9a-fA-F]/);
          return "number";
        }
        stream.eatWhile(/\d/);
        return "number";
      }

      if (/\w/.test(ch)) {
        stream.eatWhile(/\w/);
        if (stream.eat(":")) {
          return 'tag';
        }
        cur = stream.current().toLowerCase();
        style = registers[cur];
        return style || null;
      }

      for (var i = 0; i < custom.length; i++) {
        style = custom[i](ch, stream, state);
        if (style) {
          return style;
        }
      }
    },

    lineComment: lineCommentStartSymbol,
    blockCommentStart: "/*",
    blockCommentEnd: "*/"
  };
});

});
codemirror/mode/ruby/index.html000064400000013165151215013510012613 0ustar00<!doctype html>

<title>CodeMirror: Ruby mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="ruby.js"></script>
<style>
      .CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}
      .cm-s-default span.cm-arrow { color: red; }
    </style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Ruby</a>
  </ul>
</div>

<article>
<h2>Ruby mode</h2>
<form><textarea id="code" name="code">
# Code from http://sandbox.mc.edu/~bennet/ruby/code/poly_rb.html
#
# This program evaluates polynomials.  It first asks for the coefficients
# of a polynomial, which must be entered on one line, highest-order first.
# It then requests values of x and will compute the value of the poly for
# each x.  It will repeatly ask for x values, unless you the user enters
# a blank line.  It that case, it will ask for another polynomial.  If the
# user types quit for either input, the program immediately exits.
#

#
# Function to evaluate a polynomial at x.  The polynomial is given
# as a list of coefficients, from the greatest to the least.
def polyval(x, coef)
    sum = 0
    coef = coef.clone           # Don't want to destroy the original
    while true
        sum += coef.shift       # Add and remove the next coef
        break if coef.empty?    # If no more, done entirely.
        sum *= x                # This happens the right number of times.
    end
    return sum
end

#
# Function to read a line containing a list of integers and return
# them as an array of integers.  If the string conversion fails, it
# throws TypeError.  If the input line is the word 'quit', then it
# converts it to an end-of-file exception
def readints(prompt)
    # Read a line
    print prompt
    line = readline.chomp
    raise EOFError.new if line == 'quit' # You can also use a real EOF.
            
    # Go through each item on the line, converting each one and adding it
    # to retval.
    retval = [ ]
    for str in line.split(/\s+/)
        if str =~ /^\-?\d+$/
            retval.push(str.to_i)
        else
            raise TypeError.new
        end
    end

    return retval
end

#
# Take a coeff and an exponent and return the string representation, ignoring
# the sign of the coefficient.
def term_to_str(coef, exp)
    ret = ""

    # Show coeff, unless it's 1 or at the right
    coef = coef.abs
    ret = coef.to_s     unless coef == 1 && exp > 0
    ret += "x" if exp > 0                               # x if exponent not 0
    ret += "^" + exp.to_s if exp > 1                    # ^exponent, if > 1.

    return ret
end

#
# Create a string of the polynomial in sort-of-readable form.
def polystr(p)
    # Get the exponent of first coefficient, plus 1.
    exp = p.length

    # Assign exponents to each term, making pairs of coeff and exponent,
    # Then get rid of the zero terms.
    p = (p.map { |c| exp -= 1; [ c, exp ] }).select { |p| p[0] != 0 }

    # If there's nothing left, it's a zero
    return "0" if p.empty?

    # *** Now p is a non-empty list of [ coef, exponent ] pairs. ***

    # Convert the first term, preceded by a "-" if it's negative.
    result = (if p[0][0] < 0 then "-" else "" end) + term_to_str(*p[0])

    # Convert the rest of the terms, in each case adding the appropriate
    # + or - separating them.  
    for term in p[1...p.length]
        # Add the separator then the rep. of the term.
        result += (if term[0] < 0 then " - " else " + " end) + 
                term_to_str(*term)
    end

    return result
end
        
#
# Run until some kind of endfile.
begin
    # Repeat until an exception or quit gets us out.
    while true
        # Read a poly until it works.  An EOF will except out of the
        # program.
        print "\n"
        begin
            poly = readints("Enter a polynomial coefficients: ")
        rescue TypeError
            print "Try again.\n"
            retry
        end
        break if poly.empty?

        # Read and evaluate x values until the user types a blank line.
        # Again, an EOF will except out of the pgm.
        while true
            # Request an integer.
            print "Enter x value or blank line: "
            x = readline.chomp
            break if x == ''
            raise EOFError.new if x == 'quit'

            # If it looks bad, let's try again.
            if x !~ /^\-?\d+$/
                print "That doesn't look like an integer.  Please try again.\n"
                next
            end

            # Convert to an integer and print the result.
            x = x.to_i
            print "p(x) = ", polystr(poly), "\n"
            print "p(", x, ") = ", polyval(x, poly), "\n"
        end
    end
rescue EOFError
    print "\n=== EOF ===\n"
rescue Interrupt, SignalException
    print "\n=== Interrupted ===\n"
else
    print "--- Bye ---\n"
end
</textarea></form>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        mode: "text/x-ruby",
        matchBrackets: true,
        indentUnit: 4
      });
    </script>

    <p><strong>MIME types defined:</strong> <code>text/x-ruby</code>.</p>

    <p>Development of the CodeMirror Ruby mode was kindly sponsored
    by <a href="http://ubalo.com/">Ubalo</a>.</p>

  </article>
codemirror/mode/ruby/test.js000064400000000726151215013510012132 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function() {
  var mode = CodeMirror.getMode({indentUnit: 2}, "ruby");
  function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); }

  MT("divide_equal_operator",
     "[variable bar] [operator /=] [variable foo]");

  MT("divide_equal_operator_no_spacing",
     "[variable foo][operator /=][number 42]");

})();
codemirror/mode/ruby/ruby.js000064400000024331151215013510012132 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("ruby", function(config) {
  function wordObj(words) {
    var o = {};
    for (var i = 0, e = words.length; i < e; ++i) o[words[i]] = true;
    return o;
  }
  var keywords = wordObj([
    "alias", "and", "BEGIN", "begin", "break", "case", "class", "def", "defined?", "do", "else",
    "elsif", "END", "end", "ensure", "false", "for", "if", "in", "module", "next", "not", "or",
    "redo", "rescue", "retry", "return", "self", "super", "then", "true", "undef", "unless",
    "until", "when", "while", "yield", "nil", "raise", "throw", "catch", "fail", "loop", "callcc",
    "caller", "lambda", "proc", "public", "protected", "private", "require", "load",
    "require_relative", "extend", "autoload", "__END__", "__FILE__", "__LINE__", "__dir__"
  ]);
  var indentWords = wordObj(["def", "class", "case", "for", "while", "until", "module", "then",
                             "catch", "loop", "proc", "begin"]);
  var dedentWords = wordObj(["end", "until"]);
  var matching = {"[": "]", "{": "}", "(": ")"};
  var curPunc;

  function chain(newtok, stream, state) {
    state.tokenize.push(newtok);
    return newtok(stream, state);
  }

  function tokenBase(stream, state) {
    if (stream.sol() && stream.match("=begin") && stream.eol()) {
      state.tokenize.push(readBlockComment);
      return "comment";
    }
    if (stream.eatSpace()) return null;
    var ch = stream.next(), m;
    if (ch == "`" || ch == "'" || ch == '"') {
      return chain(readQuoted(ch, "string", ch == '"' || ch == "`"), stream, state);
    } else if (ch == "/") {
      var currentIndex = stream.current().length;
      if (stream.skipTo("/")) {
        var search_till = stream.current().length;
        stream.backUp(stream.current().length - currentIndex);
        var balance = 0;  // balance brackets
        while (stream.current().length < search_till) {
          var chchr = stream.next();
          if (chchr == "(") balance += 1;
          else if (chchr == ")") balance -= 1;
          if (balance < 0) break;
        }
        stream.backUp(stream.current().length - currentIndex);
        if (balance == 0)
          return chain(readQuoted(ch, "string-2", true), stream, state);
      }
      return "operator";
    } else if (ch == "%") {
      var style = "string", embed = true;
      if (stream.eat("s")) style = "atom";
      else if (stream.eat(/[WQ]/)) style = "string";
      else if (stream.eat(/[r]/)) style = "string-2";
      else if (stream.eat(/[wxq]/)) { style = "string"; embed = false; }
      var delim = stream.eat(/[^\w\s=]/);
      if (!delim) return "operator";
      if (matching.propertyIsEnumerable(delim)) delim = matching[delim];
      return chain(readQuoted(delim, style, embed, true), stream, state);
    } else if (ch == "#") {
      stream.skipToEnd();
      return "comment";
    } else if (ch == "<" && (m = stream.match(/^<-?[\`\"\']?([a-zA-Z_?]\w*)[\`\"\']?(?:;|$)/))) {
      return chain(readHereDoc(m[1]), stream, state);
    } else if (ch == "0") {
      if (stream.eat("x")) stream.eatWhile(/[\da-fA-F]/);
      else if (stream.eat("b")) stream.eatWhile(/[01]/);
      else stream.eatWhile(/[0-7]/);
      return "number";
    } else if (/\d/.test(ch)) {
      stream.match(/^[\d_]*(?:\.[\d_]+)?(?:[eE][+\-]?[\d_]+)?/);
      return "number";
    } else if (ch == "?") {
      while (stream.match(/^\\[CM]-/)) {}
      if (stream.eat("\\")) stream.eatWhile(/\w/);
      else stream.next();
      return "string";
    } else if (ch == ":") {
      if (stream.eat("'")) return chain(readQuoted("'", "atom", false), stream, state);
      if (stream.eat('"')) return chain(readQuoted('"', "atom", true), stream, state);

      // :> :>> :< :<< are valid symbols
      if (stream.eat(/[\<\>]/)) {
        stream.eat(/[\<\>]/);
        return "atom";
      }

      // :+ :- :/ :* :| :& :! are valid symbols
      if (stream.eat(/[\+\-\*\/\&\|\:\!]/)) {
        return "atom";
      }

      // Symbols can't start by a digit
      if (stream.eat(/[a-zA-Z$@_\xa1-\uffff]/)) {
        stream.eatWhile(/[\w$\xa1-\uffff]/);
        // Only one ? ! = is allowed and only as the last character
        stream.eat(/[\?\!\=]/);
        return "atom";
      }
      return "operator";
    } else if (ch == "@" && stream.match(/^@?[a-zA-Z_\xa1-\uffff]/)) {
      stream.eat("@");
      stream.eatWhile(/[\w\xa1-\uffff]/);
      return "variable-2";
    } else if (ch == "$") {
      if (stream.eat(/[a-zA-Z_]/)) {
        stream.eatWhile(/[\w]/);
      } else if (stream.eat(/\d/)) {
        stream.eat(/\d/);
      } else {
        stream.next(); // Must be a special global like $: or $!
      }
      return "variable-3";
    } else if (/[a-zA-Z_\xa1-\uffff]/.test(ch)) {
      stream.eatWhile(/[\w\xa1-\uffff]/);
      stream.eat(/[\?\!]/);
      if (stream.eat(":")) return "atom";
      return "ident";
    } else if (ch == "|" && (state.varList || state.lastTok == "{" || state.lastTok == "do")) {
      curPunc = "|";
      return null;
    } else if (/[\(\)\[\]{}\\;]/.test(ch)) {
      curPunc = ch;
      return null;
    } else if (ch == "-" && stream.eat(">")) {
      return "arrow";
    } else if (/[=+\-\/*:\.^%<>~|]/.test(ch)) {
      var more = stream.eatWhile(/[=+\-\/*:\.^%<>~|]/);
      if (ch == "." && !more) curPunc = ".";
      return "operator";
    } else {
      return null;
    }
  }

  function tokenBaseUntilBrace(depth) {
    if (!depth) depth = 1;
    return function(stream, state) {
      if (stream.peek() == "}") {
        if (depth == 1) {
          state.tokenize.pop();
          return state.tokenize[state.tokenize.length-1](stream, state);
        } else {
          state.tokenize[state.tokenize.length - 1] = tokenBaseUntilBrace(depth - 1);
        }
      } else if (stream.peek() == "{") {
        state.tokenize[state.tokenize.length - 1] = tokenBaseUntilBrace(depth + 1);
      }
      return tokenBase(stream, state);
    };
  }
  function tokenBaseOnce() {
    var alreadyCalled = false;
    return function(stream, state) {
      if (alreadyCalled) {
        state.tokenize.pop();
        return state.tokenize[state.tokenize.length-1](stream, state);
      }
      alreadyCalled = true;
      return tokenBase(stream, state);
    };
  }
  function readQuoted(quote, style, embed, unescaped) {
    return function(stream, state) {
      var escaped = false, ch;

      if (state.context.type === 'read-quoted-paused') {
        state.context = state.context.prev;
        stream.eat("}");
      }

      while ((ch = stream.next()) != null) {
        if (ch == quote && (unescaped || !escaped)) {
          state.tokenize.pop();
          break;
        }
        if (embed && ch == "#" && !escaped) {
          if (stream.eat("{")) {
            if (quote == "}") {
              state.context = {prev: state.context, type: 'read-quoted-paused'};
            }
            state.tokenize.push(tokenBaseUntilBrace());
            break;
          } else if (/[@\$]/.test(stream.peek())) {
            state.tokenize.push(tokenBaseOnce());
            break;
          }
        }
        escaped = !escaped && ch == "\\";
      }
      return style;
    };
  }
  function readHereDoc(phrase) {
    return function(stream, state) {
      if (stream.match(phrase)) state.tokenize.pop();
      else stream.skipToEnd();
      return "string";
    };
  }
  function readBlockComment(stream, state) {
    if (stream.sol() && stream.match("=end") && stream.eol())
      state.tokenize.pop();
    stream.skipToEnd();
    return "comment";
  }

  return {
    startState: function() {
      return {tokenize: [tokenBase],
              indented: 0,
              context: {type: "top", indented: -config.indentUnit},
              continuedLine: false,
              lastTok: null,
              varList: false};
    },

    token: function(stream, state) {
      curPunc = null;
      if (stream.sol()) state.indented = stream.indentation();
      var style = state.tokenize[state.tokenize.length-1](stream, state), kwtype;
      var thisTok = curPunc;
      if (style == "ident") {
        var word = stream.current();
        style = state.lastTok == "." ? "property"
          : keywords.propertyIsEnumerable(stream.current()) ? "keyword"
          : /^[A-Z]/.test(word) ? "tag"
          : (state.lastTok == "def" || state.lastTok == "class" || state.varList) ? "def"
          : "variable";
        if (style == "keyword") {
          thisTok = word;
          if (indentWords.propertyIsEnumerable(word)) kwtype = "indent";
          else if (dedentWords.propertyIsEnumerable(word)) kwtype = "dedent";
          else if ((word == "if" || word == "unless") && stream.column() == stream.indentation())
            kwtype = "indent";
          else if (word == "do" && state.context.indented < state.indented)
            kwtype = "indent";
        }
      }
      if (curPunc || (style && style != "comment")) state.lastTok = thisTok;
      if (curPunc == "|") state.varList = !state.varList;

      if (kwtype == "indent" || /[\(\[\{]/.test(curPunc))
        state.context = {prev: state.context, type: curPunc || style, indented: state.indented};
      else if ((kwtype == "dedent" || /[\)\]\}]/.test(curPunc)) && state.context.prev)
        state.context = state.context.prev;

      if (stream.eol())
        state.continuedLine = (curPunc == "\\" || style == "operator");
      return style;
    },

    indent: function(state, textAfter) {
      if (state.tokenize[state.tokenize.length-1] != tokenBase) return 0;
      var firstChar = textAfter && textAfter.charAt(0);
      var ct = state.context;
      var closing = ct.type == matching[firstChar] ||
        ct.type == "keyword" && /^(?:end|until|else|elsif|when|rescue)\b/.test(textAfter);
      return ct.indented + (closing ? 0 : config.indentUnit) +
        (state.continuedLine ? config.indentUnit : 0);
    },

    electricInput: /^\s*(?:end|rescue|\})$/,
    lineComment: "#"
  };
});

CodeMirror.defineMIME("text/x-ruby", "ruby");

});
codemirror/mode/rst/rst.js000064400000042213151215013510011607 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"), require("../python/python"), require("../stex/stex"), require("../../addon/mode/overlay"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror", "../python/python", "../stex/stex", "../../addon/mode/overlay"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode('rst', function (config, options) {

  var rx_strong = /^\*\*[^\*\s](?:[^\*]*[^\*\s])?\*\*/;
  var rx_emphasis = /^\*[^\*\s](?:[^\*]*[^\*\s])?\*/;
  var rx_literal = /^``[^`\s](?:[^`]*[^`\s])``/;

  var rx_number = /^(?:[\d]+(?:[\.,]\d+)*)/;
  var rx_positive = /^(?:\s\+[\d]+(?:[\.,]\d+)*)/;
  var rx_negative = /^(?:\s\-[\d]+(?:[\.,]\d+)*)/;

  var rx_uri_protocol = "[Hh][Tt][Tt][Pp][Ss]?://";
  var rx_uri_domain = "(?:[\\d\\w.-]+)\\.(?:\\w{2,6})";
  var rx_uri_path = "(?:/[\\d\\w\\#\\%\\&\\-\\.\\,\\/\\:\\=\\?\\~]+)*";
  var rx_uri = new RegExp("^" + rx_uri_protocol + rx_uri_domain + rx_uri_path);

  var overlay = {
    token: function (stream) {

      if (stream.match(rx_strong) && stream.match (/\W+|$/, false))
        return 'strong';
      if (stream.match(rx_emphasis) && stream.match (/\W+|$/, false))
        return 'em';
      if (stream.match(rx_literal) && stream.match (/\W+|$/, false))
        return 'string-2';
      if (stream.match(rx_number))
        return 'number';
      if (stream.match(rx_positive))
        return 'positive';
      if (stream.match(rx_negative))
        return 'negative';
      if (stream.match(rx_uri))
        return 'link';

      while (stream.next() != null) {
        if (stream.match(rx_strong, false)) break;
        if (stream.match(rx_emphasis, false)) break;
        if (stream.match(rx_literal, false)) break;
        if (stream.match(rx_number, false)) break;
        if (stream.match(rx_positive, false)) break;
        if (stream.match(rx_negative, false)) break;
        if (stream.match(rx_uri, false)) break;
      }

      return null;
    }
  };

  var mode = CodeMirror.getMode(
    config, options.backdrop || 'rst-base'
  );

  return CodeMirror.overlayMode(mode, overlay, true); // combine
}, 'python', 'stex');

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

CodeMirror.defineMode('rst-base', function (config) {

  ///////////////////////////////////////////////////////////////////////////
  ///////////////////////////////////////////////////////////////////////////

  function format(string) {
    var args = Array.prototype.slice.call(arguments, 1);
    return string.replace(/{(\d+)}/g, function (match, n) {
      return typeof args[n] != 'undefined' ? args[n] : match;
    });
  }

  ///////////////////////////////////////////////////////////////////////////
  ///////////////////////////////////////////////////////////////////////////

  var mode_python = CodeMirror.getMode(config, 'python');
  var mode_stex = CodeMirror.getMode(config, 'stex');

  ///////////////////////////////////////////////////////////////////////////
  ///////////////////////////////////////////////////////////////////////////

  var SEPA = "\\s+";
  var TAIL = "(?:\\s*|\\W|$)",
  rx_TAIL = new RegExp(format('^{0}', TAIL));

  var NAME =
    "(?:[^\\W\\d_](?:[\\w!\"#$%&'()\\*\\+,\\-\\.\/:;<=>\\?]*[^\\W_])?)",
  rx_NAME = new RegExp(format('^{0}', NAME));
  var NAME_WWS =
    "(?:[^\\W\\d_](?:[\\w\\s!\"#$%&'()\\*\\+,\\-\\.\/:;<=>\\?]*[^\\W_])?)";
  var REF_NAME = format('(?:{0}|`{1}`)', NAME, NAME_WWS);

  var TEXT1 = "(?:[^\\s\\|](?:[^\\|]*[^\\s\\|])?)";
  var TEXT2 = "(?:[^\\`]+)",
  rx_TEXT2 = new RegExp(format('^{0}', TEXT2));

  var rx_section = new RegExp(
    "^([!'#$%&\"()*+,-./:;<=>?@\\[\\\\\\]^_`{|}~])\\1{3,}\\s*$");
  var rx_explicit = new RegExp(
    format('^\\.\\.{0}', SEPA));
  var rx_link = new RegExp(
    format('^_{0}:{1}|^__:{1}', REF_NAME, TAIL));
  var rx_directive = new RegExp(
    format('^{0}::{1}', REF_NAME, TAIL));
  var rx_substitution = new RegExp(
    format('^\\|{0}\\|{1}{2}::{3}', TEXT1, SEPA, REF_NAME, TAIL));
  var rx_footnote = new RegExp(
    format('^\\[(?:\\d+|#{0}?|\\*)]{1}', REF_NAME, TAIL));
  var rx_citation = new RegExp(
    format('^\\[{0}\\]{1}', REF_NAME, TAIL));

  var rx_substitution_ref = new RegExp(
    format('^\\|{0}\\|', TEXT1));
  var rx_footnote_ref = new RegExp(
    format('^\\[(?:\\d+|#{0}?|\\*)]_', REF_NAME));
  var rx_citation_ref = new RegExp(
    format('^\\[{0}\\]_', REF_NAME));
  var rx_link_ref1 = new RegExp(
    format('^{0}__?', REF_NAME));
  var rx_link_ref2 = new RegExp(
    format('^`{0}`_', TEXT2));

  var rx_role_pre = new RegExp(
    format('^:{0}:`{1}`{2}', NAME, TEXT2, TAIL));
  var rx_role_suf = new RegExp(
    format('^`{1}`:{0}:{2}', NAME, TEXT2, TAIL));
  var rx_role = new RegExp(
    format('^:{0}:{1}', NAME, TAIL));

  var rx_directive_name = new RegExp(format('^{0}', REF_NAME));
  var rx_directive_tail = new RegExp(format('^::{0}', TAIL));
  var rx_substitution_text = new RegExp(format('^\\|{0}\\|', TEXT1));
  var rx_substitution_sepa = new RegExp(format('^{0}', SEPA));
  var rx_substitution_name = new RegExp(format('^{0}', REF_NAME));
  var rx_substitution_tail = new RegExp(format('^::{0}', TAIL));
  var rx_link_head = new RegExp("^_");
  var rx_link_name = new RegExp(format('^{0}|_', REF_NAME));
  var rx_link_tail = new RegExp(format('^:{0}', TAIL));

  var rx_verbatim = new RegExp('^::\\s*$');
  var rx_examples = new RegExp('^\\s+(?:>>>|In \\[\\d+\\]:)\\s');

  ///////////////////////////////////////////////////////////////////////////
  ///////////////////////////////////////////////////////////////////////////

  function to_normal(stream, state) {
    var token = null;

    if (stream.sol() && stream.match(rx_examples, false)) {
      change(state, to_mode, {
        mode: mode_python, local: CodeMirror.startState(mode_python)
      });
    } else if (stream.sol() && stream.match(rx_explicit)) {
      change(state, to_explicit);
      token = 'meta';
    } else if (stream.sol() && stream.match(rx_section)) {
      change(state, to_normal);
      token = 'header';
    } else if (phase(state) == rx_role_pre ||
               stream.match(rx_role_pre, false)) {

      switch (stage(state)) {
      case 0:
        change(state, to_normal, context(rx_role_pre, 1));
        stream.match(/^:/);
        token = 'meta';
        break;
      case 1:
        change(state, to_normal, context(rx_role_pre, 2));
        stream.match(rx_NAME);
        token = 'keyword';

        if (stream.current().match(/^(?:math|latex)/)) {
          state.tmp_stex = true;
        }
        break;
      case 2:
        change(state, to_normal, context(rx_role_pre, 3));
        stream.match(/^:`/);
        token = 'meta';
        break;
      case 3:
        if (state.tmp_stex) {
          state.tmp_stex = undefined; state.tmp = {
            mode: mode_stex, local: CodeMirror.startState(mode_stex)
          };
        }

        if (state.tmp) {
          if (stream.peek() == '`') {
            change(state, to_normal, context(rx_role_pre, 4));
            state.tmp = undefined;
            break;
          }

          token = state.tmp.mode.token(stream, state.tmp.local);
          break;
        }

        change(state, to_normal, context(rx_role_pre, 4));
        stream.match(rx_TEXT2);
        token = 'string';
        break;
      case 4:
        change(state, to_normal, context(rx_role_pre, 5));
        stream.match(/^`/);
        token = 'meta';
        break;
      case 5:
        change(state, to_normal, context(rx_role_pre, 6));
        stream.match(rx_TAIL);
        break;
      default:
        change(state, to_normal);
      }
    } else if (phase(state) == rx_role_suf ||
               stream.match(rx_role_suf, false)) {

      switch (stage(state)) {
      case 0:
        change(state, to_normal, context(rx_role_suf, 1));
        stream.match(/^`/);
        token = 'meta';
        break;
      case 1:
        change(state, to_normal, context(rx_role_suf, 2));
        stream.match(rx_TEXT2);
        token = 'string';
        break;
      case 2:
        change(state, to_normal, context(rx_role_suf, 3));
        stream.match(/^`:/);
        token = 'meta';
        break;
      case 3:
        change(state, to_normal, context(rx_role_suf, 4));
        stream.match(rx_NAME);
        token = 'keyword';
        break;
      case 4:
        change(state, to_normal, context(rx_role_suf, 5));
        stream.match(/^:/);
        token = 'meta';
        break;
      case 5:
        change(state, to_normal, context(rx_role_suf, 6));
        stream.match(rx_TAIL);
        break;
      default:
        change(state, to_normal);
      }
    } else if (phase(state) == rx_role || stream.match(rx_role, false)) {

      switch (stage(state)) {
      case 0:
        change(state, to_normal, context(rx_role, 1));
        stream.match(/^:/);
        token = 'meta';
        break;
      case 1:
        change(state, to_normal, context(rx_role, 2));
        stream.match(rx_NAME);
        token = 'keyword';
        break;
      case 2:
        change(state, to_normal, context(rx_role, 3));
        stream.match(/^:/);
        token = 'meta';
        break;
      case 3:
        change(state, to_normal, context(rx_role, 4));
        stream.match(rx_TAIL);
        break;
      default:
        change(state, to_normal);
      }
    } else if (phase(state) == rx_substitution_ref ||
               stream.match(rx_substitution_ref, false)) {

      switch (stage(state)) {
      case 0:
        change(state, to_normal, context(rx_substitution_ref, 1));
        stream.match(rx_substitution_text);
        token = 'variable-2';
        break;
      case 1:
        change(state, to_normal, context(rx_substitution_ref, 2));
        if (stream.match(/^_?_?/)) token = 'link';
        break;
      default:
        change(state, to_normal);
      }
    } else if (stream.match(rx_footnote_ref)) {
      change(state, to_normal);
      token = 'quote';
    } else if (stream.match(rx_citation_ref)) {
      change(state, to_normal);
      token = 'quote';
    } else if (stream.match(rx_link_ref1)) {
      change(state, to_normal);
      if (!stream.peek() || stream.peek().match(/^\W$/)) {
        token = 'link';
      }
    } else if (phase(state) == rx_link_ref2 ||
               stream.match(rx_link_ref2, false)) {

      switch (stage(state)) {
      case 0:
        if (!stream.peek() || stream.peek().match(/^\W$/)) {
          change(state, to_normal, context(rx_link_ref2, 1));
        } else {
          stream.match(rx_link_ref2);
        }
        break;
      case 1:
        change(state, to_normal, context(rx_link_ref2, 2));
        stream.match(/^`/);
        token = 'link';
        break;
      case 2:
        change(state, to_normal, context(rx_link_ref2, 3));
        stream.match(rx_TEXT2);
        break;
      case 3:
        change(state, to_normal, context(rx_link_ref2, 4));
        stream.match(/^`_/);
        token = 'link';
        break;
      default:
        change(state, to_normal);
      }
    } else if (stream.match(rx_verbatim)) {
      change(state, to_verbatim);
    }

    else {
      if (stream.next()) change(state, to_normal);
    }

    return token;
  }

  ///////////////////////////////////////////////////////////////////////////
  ///////////////////////////////////////////////////////////////////////////

  function to_explicit(stream, state) {
    var token = null;

    if (phase(state) == rx_substitution ||
        stream.match(rx_substitution, false)) {

      switch (stage(state)) {
      case 0:
        change(state, to_explicit, context(rx_substitution, 1));
        stream.match(rx_substitution_text);
        token = 'variable-2';
        break;
      case 1:
        change(state, to_explicit, context(rx_substitution, 2));
        stream.match(rx_substitution_sepa);
        break;
      case 2:
        change(state, to_explicit, context(rx_substitution, 3));
        stream.match(rx_substitution_name);
        token = 'keyword';
        break;
      case 3:
        change(state, to_explicit, context(rx_substitution, 4));
        stream.match(rx_substitution_tail);
        token = 'meta';
        break;
      default:
        change(state, to_normal);
      }
    } else if (phase(state) == rx_directive ||
               stream.match(rx_directive, false)) {

      switch (stage(state)) {
      case 0:
        change(state, to_explicit, context(rx_directive, 1));
        stream.match(rx_directive_name);
        token = 'keyword';

        if (stream.current().match(/^(?:math|latex)/))
          state.tmp_stex = true;
        else if (stream.current().match(/^python/))
          state.tmp_py = true;
        break;
      case 1:
        change(state, to_explicit, context(rx_directive, 2));
        stream.match(rx_directive_tail);
        token = 'meta';

        if (stream.match(/^latex\s*$/) || state.tmp_stex) {
          state.tmp_stex = undefined; change(state, to_mode, {
            mode: mode_stex, local: CodeMirror.startState(mode_stex)
          });
        }
        break;
      case 2:
        change(state, to_explicit, context(rx_directive, 3));
        if (stream.match(/^python\s*$/) || state.tmp_py) {
          state.tmp_py = undefined; change(state, to_mode, {
            mode: mode_python, local: CodeMirror.startState(mode_python)
          });
        }
        break;
      default:
        change(state, to_normal);
      }
    } else if (phase(state) == rx_link || stream.match(rx_link, false)) {

      switch (stage(state)) {
      case 0:
        change(state, to_explicit, context(rx_link, 1));
        stream.match(rx_link_head);
        stream.match(rx_link_name);
        token = 'link';
        break;
      case 1:
        change(state, to_explicit, context(rx_link, 2));
        stream.match(rx_link_tail);
        token = 'meta';
        break;
      default:
        change(state, to_normal);
      }
    } else if (stream.match(rx_footnote)) {
      change(state, to_normal);
      token = 'quote';
    } else if (stream.match(rx_citation)) {
      change(state, to_normal);
      token = 'quote';
    }

    else {
      stream.eatSpace();
      if (stream.eol()) {
        change(state, to_normal);
      } else {
        stream.skipToEnd();
        change(state, to_comment);
        token = 'comment';
      }
    }

    return token;
  }

  ///////////////////////////////////////////////////////////////////////////
  ///////////////////////////////////////////////////////////////////////////

  function to_comment(stream, state) {
    return as_block(stream, state, 'comment');
  }

  function to_verbatim(stream, state) {
    return as_block(stream, state, 'meta');
  }

  function as_block(stream, state, token) {
    if (stream.eol() || stream.eatSpace()) {
      stream.skipToEnd();
      return token;
    } else {
      change(state, to_normal);
      return null;
    }
  }

  ///////////////////////////////////////////////////////////////////////////
  ///////////////////////////////////////////////////////////////////////////

  function to_mode(stream, state) {

    if (state.ctx.mode && state.ctx.local) {

      if (stream.sol()) {
        if (!stream.eatSpace()) change(state, to_normal);
        return null;
      }

      return state.ctx.mode.token(stream, state.ctx.local);
    }

    change(state, to_normal);
    return null;
  }

  ///////////////////////////////////////////////////////////////////////////
  ///////////////////////////////////////////////////////////////////////////

  function context(phase, stage, mode, local) {
    return {phase: phase, stage: stage, mode: mode, local: local};
  }

  function change(state, tok, ctx) {
    state.tok = tok;
    state.ctx = ctx || {};
  }

  function stage(state) {
    return state.ctx.stage || 0;
  }

  function phase(state) {
    return state.ctx.phase;
  }

  ///////////////////////////////////////////////////////////////////////////
  ///////////////////////////////////////////////////////////////////////////

  return {
    startState: function () {
      return {tok: to_normal, ctx: context(undefined, 0)};
    },

    copyState: function (state) {
      var ctx = state.ctx, tmp = state.tmp;
      if (ctx.local)
        ctx = {mode: ctx.mode, local: CodeMirror.copyState(ctx.mode, ctx.local)};
      if (tmp)
        tmp = {mode: tmp.mode, local: CodeMirror.copyState(tmp.mode, tmp.local)};
      return {tok: state.tok, ctx: ctx, tmp: tmp};
    },

    innerMode: function (state) {
      return state.tmp      ? {state: state.tmp.local, mode: state.tmp.mode}
      : state.ctx.mode ? {state: state.ctx.local, mode: state.ctx.mode}
      : null;
    },

    token: function (stream, state) {
      return state.tok(stream, state);
    }
  };
}, 'python', 'stex');

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

CodeMirror.defineMIME('text/x-rst', 'rst');

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

});
codemirror/mode/rst/index.html000064400000042551151215013510012443 0ustar00<!doctype html>

<title>CodeMirror: reStructuredText mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/mode/overlay.js"></script>
<script src="rst.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">reStructuredText</a>
  </ul>
</div>

<article>
<h2>reStructuredText mode</h2>
<form><textarea id="code" name="code">
.. This is an excerpt from Sphinx documentation: http://sphinx.pocoo.org/_sources/rest.txt

.. highlightlang:: rest

.. _rst-primer:

reStructuredText Primer
=======================

This section is a brief introduction to reStructuredText (reST) concepts and
syntax, intended to provide authors with enough information to author documents
productively.  Since reST was designed to be a simple, unobtrusive markup
language, this will not take too long.

.. seealso::

   The authoritative `reStructuredText User Documentation
   &lt;http://docutils.sourceforge.net/rst.html&gt;`_.  The "ref" links in this
   document link to the description of the individual constructs in the reST
   reference.


Paragraphs
----------

The paragraph (:duref:`ref &lt;paragraphs&gt;`) is the most basic block in a reST
document.  Paragraphs are simply chunks of text separated by one or more blank
lines.  As in Python, indentation is significant in reST, so all lines of the
same paragraph must be left-aligned to the same level of indentation.


.. _inlinemarkup:

Inline markup
-------------

The standard reST inline markup is quite simple: use

* one asterisk: ``*text*`` for emphasis (italics),
* two asterisks: ``**text**`` for strong emphasis (boldface), and
* backquotes: ````text```` for code samples.

If asterisks or backquotes appear in running text and could be confused with
inline markup delimiters, they have to be escaped with a backslash.

Be aware of some restrictions of this markup:

* it may not be nested,
* content may not start or end with whitespace: ``* text*`` is wrong,
* it must be separated from surrounding text by non-word characters.  Use a
  backslash escaped space to work around that: ``thisis\ *one*\ word``.

These restrictions may be lifted in future versions of the docutils.

reST also allows for custom "interpreted text roles"', which signify that the
enclosed text should be interpreted in a specific way.  Sphinx uses this to
provide semantic markup and cross-referencing of identifiers, as described in
the appropriate section.  The general syntax is ``:rolename:`content```.

Standard reST provides the following roles:

* :durole:`emphasis` -- alternate spelling for ``*emphasis*``
* :durole:`strong` -- alternate spelling for ``**strong**``
* :durole:`literal` -- alternate spelling for ````literal````
* :durole:`subscript` -- subscript text
* :durole:`superscript` -- superscript text
* :durole:`title-reference` -- for titles of books, periodicals, and other
  materials

See :ref:`inline-markup` for roles added by Sphinx.


Lists and Quote-like blocks
---------------------------

List markup (:duref:`ref &lt;bullet-lists&gt;`) is natural: just place an asterisk at
the start of a paragraph and indent properly.  The same goes for numbered lists;
they can also be autonumbered using a ``#`` sign::

   * This is a bulleted list.
   * It has two items, the second
     item uses two lines.

   1. This is a numbered list.
   2. It has two items too.

   #. This is a numbered list.
   #. It has two items too.


Nested lists are possible, but be aware that they must be separated from the
parent list items by blank lines::

   * this is
   * a list

     * with a nested list
     * and some subitems

   * and here the parent list continues

Definition lists (:duref:`ref &lt;definition-lists&gt;`) are created as follows::

   term (up to a line of text)
      Definition of the term, which must be indented

      and can even consist of multiple paragraphs

   next term
      Description.

Note that the term cannot have more than one line of text.

Quoted paragraphs (:duref:`ref &lt;block-quotes&gt;`) are created by just indenting
them more than the surrounding paragraphs.

Line blocks (:duref:`ref &lt;line-blocks&gt;`) are a way of preserving line breaks::

   | These lines are
   | broken exactly like in
   | the source file.

There are also several more special blocks available:

* field lists (:duref:`ref &lt;field-lists&gt;`)
* option lists (:duref:`ref &lt;option-lists&gt;`)
* quoted literal blocks (:duref:`ref &lt;quoted-literal-blocks&gt;`)
* doctest blocks (:duref:`ref &lt;doctest-blocks&gt;`)


Source Code
-----------

Literal code blocks (:duref:`ref &lt;literal-blocks&gt;`) are introduced by ending a
paragraph with the special marker ``::``.  The literal block must be indented
(and, like all paragraphs, separated from the surrounding ones by blank lines)::

   This is a normal text paragraph. The next paragraph is a code sample::

      It is not processed in any way, except
      that the indentation is removed.

      It can span multiple lines.

   This is a normal text paragraph again.

The handling of the ``::`` marker is smart:

* If it occurs as a paragraph of its own, that paragraph is completely left
  out of the document.
* If it is preceded by whitespace, the marker is removed.
* If it is preceded by non-whitespace, the marker is replaced by a single
  colon.

That way, the second sentence in the above example's first paragraph would be
rendered as "The next paragraph is a code sample:".


.. _rst-tables:

Tables
------

Two forms of tables are supported.  For *grid tables* (:duref:`ref
&lt;grid-tables&gt;`), you have to "paint" the cell grid yourself.  They look like
this::

   +------------------------+------------+----------+----------+
   | Header row, column 1   | Header 2   | Header 3 | Header 4 |
   | (header rows optional) |            |          |          |
   +========================+============+==========+==========+
   | body row 1, column 1   | column 2   | column 3 | column 4 |
   +------------------------+------------+----------+----------+
   | body row 2             | ...        | ...      |          |
   +------------------------+------------+----------+----------+

*Simple tables* (:duref:`ref &lt;simple-tables&gt;`) are easier to write, but
limited: they must contain more than one row, and the first column cannot
contain multiple lines.  They look like this::

   =====  =====  =======
   A      B      A and B
   =====  =====  =======
   False  False  False
   True   False  False
   False  True   False
   True   True   True
   =====  =====  =======


Hyperlinks
----------

External links
^^^^^^^^^^^^^^

Use ```Link text &lt;http://example.com/&gt;`_`` for inline web links.  If the link
text should be the web address, you don't need special markup at all, the parser
finds links and mail addresses in ordinary text.

You can also separate the link and the target definition (:duref:`ref
&lt;hyperlink-targets&gt;`), like this::

   This is a paragraph that contains `a link`_.

   .. _a link: http://example.com/


Internal links
^^^^^^^^^^^^^^

Internal linking is done via a special reST role provided by Sphinx, see the
section on specific markup, :ref:`ref-role`.


Sections
--------

Section headers (:duref:`ref &lt;sections&gt;`) are created by underlining (and
optionally overlining) the section title with a punctuation character, at least
as long as the text::

   =================
   This is a heading
   =================

Normally, there are no heading levels assigned to certain characters as the
structure is determined from the succession of headings.  However, for the
Python documentation, this convention is used which you may follow:

* ``#`` with overline, for parts
* ``*`` with overline, for chapters
* ``=``, for sections
* ``-``, for subsections
* ``^``, for subsubsections
* ``"``, for paragraphs

Of course, you are free to use your own marker characters (see the reST
documentation), and use a deeper nesting level, but keep in mind that most
target formats (HTML, LaTeX) have a limited supported nesting depth.


Explicit Markup
---------------

"Explicit markup" (:duref:`ref &lt;explicit-markup-blocks&gt;`) is used in reST for
most constructs that need special handling, such as footnotes,
specially-highlighted paragraphs, comments, and generic directives.

An explicit markup block begins with a line starting with ``..`` followed by
whitespace and is terminated by the next paragraph at the same level of
indentation.  (There needs to be a blank line between explicit markup and normal
paragraphs.  This may all sound a bit complicated, but it is intuitive enough
when you write it.)


.. _directives:

Directives
----------

A directive (:duref:`ref &lt;directives&gt;`) is a generic block of explicit markup.
Besides roles, it is one of the extension mechanisms of reST, and Sphinx makes
heavy use of it.

Docutils supports the following directives:

* Admonitions: :dudir:`attention`, :dudir:`caution`, :dudir:`danger`,
  :dudir:`error`, :dudir:`hint`, :dudir:`important`, :dudir:`note`,
  :dudir:`tip`, :dudir:`warning` and the generic :dudir:`admonition`.
  (Most themes style only "note" and "warning" specially.)

* Images:

  - :dudir:`image` (see also Images_ below)
  - :dudir:`figure` (an image with caption and optional legend)

* Additional body elements:

  - :dudir:`contents` (a local, i.e. for the current file only, table of
    contents)
  - :dudir:`container` (a container with a custom class, useful to generate an
    outer ``&lt;div&gt;`` in HTML)
  - :dudir:`rubric` (a heading without relation to the document sectioning)
  - :dudir:`topic`, :dudir:`sidebar` (special highlighted body elements)
  - :dudir:`parsed-literal` (literal block that supports inline markup)
  - :dudir:`epigraph` (a block quote with optional attribution line)
  - :dudir:`highlights`, :dudir:`pull-quote` (block quotes with their own
    class attribute)
  - :dudir:`compound` (a compound paragraph)

* Special tables:

  - :dudir:`table` (a table with title)
  - :dudir:`csv-table` (a table generated from comma-separated values)
  - :dudir:`list-table` (a table generated from a list of lists)

* Special directives:

  - :dudir:`raw` (include raw target-format markup)
  - :dudir:`include` (include reStructuredText from another file)
    -- in Sphinx, when given an absolute include file path, this directive takes
    it as relative to the source directory
  - :dudir:`class` (assign a class attribute to the next element) [1]_

* HTML specifics:

  - :dudir:`meta` (generation of HTML ``&lt;meta&gt;`` tags)
  - :dudir:`title` (override document title)

* Influencing markup:

  - :dudir:`default-role` (set a new default role)
  - :dudir:`role` (create a new role)

  Since these are only per-file, better use Sphinx' facilities for setting the
  :confval:`default_role`.

Do *not* use the directives :dudir:`sectnum`, :dudir:`header` and
:dudir:`footer`.

Directives added by Sphinx are described in :ref:`sphinxmarkup`.

Basically, a directive consists of a name, arguments, options and content. (Keep
this terminology in mind, it is used in the next chapter describing custom
directives.)  Looking at this example, ::

   .. function:: foo(x)
                 foo(y, z)
      :module: some.module.name

      Return a line of text input from the user.

``function`` is the directive name.  It is given two arguments here, the
remainder of the first line and the second line, as well as one option
``module`` (as you can see, options are given in the lines immediately following
the arguments and indicated by the colons).  Options must be indented to the
same level as the directive content.

The directive content follows after a blank line and is indented relative to the
directive start.


Images
------

reST supports an image directive (:dudir:`ref &lt;image&gt;`), used like so::

   .. image:: gnu.png
      (options)

When used within Sphinx, the file name given (here ``gnu.png``) must either be
relative to the source file, or absolute which means that they are relative to
the top source directory.  For example, the file ``sketch/spam.rst`` could refer
to the image ``images/spam.png`` as ``../images/spam.png`` or
``/images/spam.png``.

Sphinx will automatically copy image files over to a subdirectory of the output
directory on building (e.g. the ``_static`` directory for HTML output.)

Interpretation of image size options (``width`` and ``height``) is as follows:
if the size has no unit or the unit is pixels, the given size will only be
respected for output channels that support pixels (i.e. not in LaTeX output).
Other units (like ``pt`` for points) will be used for HTML and LaTeX output.

Sphinx extends the standard docutils behavior by allowing an asterisk for the
extension::

   .. image:: gnu.*

Sphinx then searches for all images matching the provided pattern and determines
their type.  Each builder then chooses the best image out of these candidates.
For instance, if the file name ``gnu.*`` was given and two files :file:`gnu.pdf`
and :file:`gnu.png` existed in the source tree, the LaTeX builder would choose
the former, while the HTML builder would prefer the latter.

.. versionchanged:: 0.4
   Added the support for file names ending in an asterisk.

.. versionchanged:: 0.6
   Image paths can now be absolute.


Footnotes
---------

For footnotes (:duref:`ref &lt;footnotes&gt;`), use ``[#name]_`` to mark the footnote
location, and add the footnote body at the bottom of the document after a
"Footnotes" rubric heading, like so::

   Lorem ipsum [#f1]_ dolor sit amet ... [#f2]_

   .. rubric:: Footnotes

   .. [#f1] Text of the first footnote.
   .. [#f2] Text of the second footnote.

You can also explicitly number the footnotes (``[1]_``) or use auto-numbered
footnotes without names (``[#]_``).


Citations
---------

Standard reST citations (:duref:`ref &lt;citations&gt;`) are supported, with the
additional feature that they are "global", i.e. all citations can be referenced
from all files.  Use them like so::

   Lorem ipsum [Ref]_ dolor sit amet.

   .. [Ref] Book or article reference, URL or whatever.

Citation usage is similar to footnote usage, but with a label that is not
numeric or begins with ``#``.


Substitutions
-------------

reST supports "substitutions" (:duref:`ref &lt;substitution-definitions&gt;`), which
are pieces of text and/or markup referred to in the text by ``|name|``.  They
are defined like footnotes with explicit markup blocks, like this::

   .. |name| replace:: replacement *text*

or this::

   .. |caution| image:: warning.png
                :alt: Warning!

See the :duref:`reST reference for substitutions &lt;substitution-definitions&gt;`
for details.

If you want to use some substitutions for all documents, put them into
:confval:`rst_prolog` or put them into a separate file and include it into all
documents you want to use them in, using the :rst:dir:`include` directive.  (Be
sure to give the include file a file name extension differing from that of other
source files, to avoid Sphinx finding it as a standalone document.)

Sphinx defines some default substitutions, see :ref:`default-substitutions`.


Comments
--------

Every explicit markup block which isn't a valid markup construct (like the
footnotes above) is regarded as a comment (:duref:`ref &lt;comments&gt;`).  For
example::

   .. This is a comment.

You can indent text after a comment start to form multiline comments::

   ..
      This whole indented block
      is a comment.

      Still in the comment.


Source encoding
---------------

Since the easiest way to include special characters like em dashes or copyright
signs in reST is to directly write them as Unicode characters, one has to
specify an encoding.  Sphinx assumes source files to be encoded in UTF-8 by
default; you can change this with the :confval:`source_encoding` config value.


Gotchas
-------

There are some problems one commonly runs into while authoring reST documents:

* **Separation of inline markup:** As said above, inline markup spans must be
  separated from the surrounding text by non-word characters, you have to use a
  backslash-escaped space to get around that.  See `the reference
  &lt;http://docutils.sf.net/docs/ref/rst/restructuredtext.html#inline-markup&gt;`_
  for the details.

* **No nested inline markup:** Something like ``*see :func:`foo`*`` is not
  possible.


.. rubric:: Footnotes

.. [1] When the default domain contains a :rst:dir:`class` directive, this directive
       will be shadowed.  Therefore, Sphinx re-exports it as :rst:dir:`rst-class`.
</textarea></form>

    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        lineNumbers: true,
      });
    </script>
    <p>
        The <code>python</code> mode will be used for highlighting blocks
        containing Python/IPython terminal sessions: blocks starting with
        <code>&gt;&gt;&gt;</code> (for Python) or <code>In [num]:</code> (for
        IPython).

        Further, the <code>stex</code> mode will be used for highlighting
        blocks containing LaTex code.
    </p>

    <p><strong>MIME types defined:</strong> <code>text/x-rst</code>.</p>
  </article>
codemirror/mode/toml/index.html000064400000003460151215013510012602 0ustar00<!doctype html>

<title>CodeMirror: TOML Mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="toml.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">TOML Mode</a>
  </ul>
</div>

<article>
<h2>TOML Mode</h2>
<form><textarea id="code" name="code">
# This is a TOML document. Boom.

title = "TOML Example"

[owner]
name = "Tom Preston-Werner"
organization = "GitHub"
bio = "GitHub Cofounder &amp; CEO\nLikes tater tots and beer."
dob = 1979-05-27T07:32:00Z # First class dates? Why not?

[database]
server = "192.168.1.1"
ports = [ 8001, 8001, 8002 ]
connection_max = 5000
enabled = true

[servers]

  # You can indent as you please. Tabs or spaces. TOML don't care.
  [servers.alpha]
  ip = "10.0.0.1"
  dc = "eqdc10"
  
  [servers.beta]
  ip = "10.0.0.2"
  dc = "eqdc10"
  
[clients]
data = [ ["gamma", "delta"], [1, 2] ]

# Line breaks are OK when inside arrays
hosts = [
  "alpha",
  "omega"
]
</textarea></form>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        mode: {name: "toml"},
        lineNumbers: true
      });
    </script>
    <h3>The TOML Mode</h3>
      <p> Created by Forbes Lindesay.</p>
    <p><strong>MIME type defined:</strong> <code>text/x-toml</code>.</p>
  </article>
codemirror/mode/toml/toml.js000064400000005521151215013510012116 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("toml", function () {
  return {
    startState: function () {
      return {
        inString: false,
        stringType: "",
        lhs: true,
        inArray: 0
      };
    },
    token: function (stream, state) {
      //check for state changes
      if (!state.inString && ((stream.peek() == '"') || (stream.peek() == "'"))) {
        state.stringType = stream.peek();
        stream.next(); // Skip quote
        state.inString = true; // Update state
      }
      if (stream.sol() && state.inArray === 0) {
        state.lhs = true;
      }
      //return state
      if (state.inString) {
        while (state.inString && !stream.eol()) {
          if (stream.peek() === state.stringType) {
            stream.next(); // Skip quote
            state.inString = false; // Clear flag
          } else if (stream.peek() === '\\') {
            stream.next();
            stream.next();
          } else {
            stream.match(/^.[^\\\"\']*/);
          }
        }
        return state.lhs ? "property string" : "string"; // Token style
      } else if (state.inArray && stream.peek() === ']') {
        stream.next();
        state.inArray--;
        return 'bracket';
      } else if (state.lhs && stream.peek() === '[' && stream.skipTo(']')) {
        stream.next();//skip closing ]
        // array of objects has an extra open & close []
        if (stream.peek() === ']') stream.next();
        return "atom";
      } else if (stream.peek() === "#") {
        stream.skipToEnd();
        return "comment";
      } else if (stream.eatSpace()) {
        return null;
      } else if (state.lhs && stream.eatWhile(function (c) { return c != '=' && c != ' '; })) {
        return "property";
      } else if (state.lhs && stream.peek() === "=") {
        stream.next();
        state.lhs = false;
        return null;
      } else if (!state.lhs && stream.match(/^\d\d\d\d[\d\-\:\.T]*Z/)) {
        return 'atom'; //date
      } else if (!state.lhs && (stream.match('true') || stream.match('false'))) {
        return 'atom';
      } else if (!state.lhs && stream.peek() === '[') {
        state.inArray++;
        stream.next();
        return 'bracket';
      } else if (!state.lhs && stream.match(/^\-?\d+(?:\.\d+)?/)) {
        return 'number';
      } else if (!stream.eatSpace()) {
        stream.next();
      }
      return null;
    }
  };
});

CodeMirror.defineMIME('text/x-toml', 'toml');

});
codemirror/mode/vue/index.html000064400000004020151215013510012417 0ustar00<!doctype html>

<title>CodeMirror: Vue.js mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/mode/overlay.js"></script>
<script src="../../addon/mode/simple.js"></script>
<script src="../../addon/selection/selection-pointer.js"></script>
<script src="../xml/xml.js"></script>
<script src="../javascript/javascript.js"></script>
<script src="../css/css.js"></script>
<script src="../coffeescript/coffeescript.js"></script>
<script src="../sass/sass.js"></script>
<script src="../pug/pug.js"></script>

<script src="../handlebars/handlebars.js"></script>
<script src="../htmlmixed/htmlmixed.js"></script>
<script src="vue.js"></script>
<style>.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Vue.js mode</a>
  </ul>
</div>

<article>
<h2>Vue.js mode</h2>
<form><textarea id="code" name="code">
<template>
  <div class="sass">Im am a {{mustache-like}} template</div>
</template>

<script lang="coffee">
  module.exports =
    props: ['one', 'two', 'three']
</script>

<style lang="sass">
.sass
  font-size: 18px
</style>

</textarea></form>
    <script>
      // Define an extended mixed-mode that understands vbscript and
      // leaves mustache/handlebars embedded templates in html mode
      var mixedMode = {
        name: "vue"
      };
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        mode: mixedMode,
        selectionPointer: true
      });
    </script>

    <p><strong>MIME types defined:</strong> <code>text/x-vue</code></p>

  </article>
codemirror/mode/vue/vue.js000064400000004702151215013510011566 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function (mod) {
  "use strict";
  if (typeof exports === "object" && typeof module === "object") {// CommonJS
    mod(require("../../lib/codemirror"),
        require("../../addon/mode/overlay"),
        require("../xml/xml"),
        require("../javascript/javascript"),
        require("../coffeescript/coffeescript"),
        require("../css/css"),
        require("../sass/sass"),
        require("../stylus/stylus"),
        require("../pug/pug"),
        require("../handlebars/handlebars"));
  } else if (typeof define === "function" && define.amd) { // AMD
    define(["../../lib/codemirror",
            "../../addon/mode/overlay",
            "../xml/xml",
            "../javascript/javascript",
            "../coffeescript/coffeescript",
            "../css/css",
            "../sass/sass",
            "../stylus/stylus",
            "../pug/pug",
            "../handlebars/handlebars"], mod);
  } else { // Plain browser env
    mod(CodeMirror);
  }
})(function (CodeMirror) {
  var tagLanguages = {
    script: [
      ["lang", /coffee(script)?/, "coffeescript"],
      ["type", /^(?:text|application)\/(?:x-)?coffee(?:script)?$/, "coffeescript"]
    ],
    style: [
      ["lang", /^stylus$/i, "stylus"],
      ["lang", /^sass$/i, "sass"],
      ["type", /^(text\/)?(x-)?styl(us)?$/i, "stylus"],
      ["type", /^text\/sass/i, "sass"]
    ],
    template: [
      ["lang", /^vue-template$/i, "vue"],
      ["lang", /^pug$/i, "pug"],
      ["lang", /^handlebars$/i, "handlebars"],
      ["type", /^(text\/)?(x-)?pug$/i, "pug"],
      ["type", /^text\/x-handlebars-template$/i, "handlebars"],
      [null, null, "vue-template"]
    ]
  };

  CodeMirror.defineMode("vue-template", function (config, parserConfig) {
    var mustacheOverlay = {
      token: function (stream) {
        if (stream.match(/^\{\{.*?\}\}/)) return "meta mustache";
        while (stream.next() && !stream.match("{{", false)) {}
        return null;
      }
    };
    return CodeMirror.overlayMode(CodeMirror.getMode(config, parserConfig.backdrop || "text/html"), mustacheOverlay);
  });

  CodeMirror.defineMode("vue", function (config) {
    return CodeMirror.getMode(config, {name: "htmlmixed", tags: tagLanguages});
  }, "htmlmixed", "xml", "javascript", "coffeescript", "css", "sass", "stylus", "pug", "handlebars");

  CodeMirror.defineMIME("script/x-vue", "vue");
});
codemirror/mode/vhdl/vhdl.js000064400000015060151215013510012061 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

// Originally written by Alf Nielsen, re-written by Michael Zhou
(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

function words(str) {
  var obj = {}, words = str.split(",");
  for (var i = 0; i < words.length; ++i) {
    var allCaps = words[i].toUpperCase();
    var firstCap = words[i].charAt(0).toUpperCase() + words[i].slice(1);
    obj[words[i]] = true;
    obj[allCaps] = true;
    obj[firstCap] = true;
  }
  return obj;
}

function metaHook(stream) {
  stream.eatWhile(/[\w\$_]/);
  return "meta";
}

CodeMirror.defineMode("vhdl", function(config, parserConfig) {
  var indentUnit = config.indentUnit,
      atoms = parserConfig.atoms || words("null"),
      hooks = parserConfig.hooks || {"`": metaHook, "$": metaHook},
      multiLineStrings = parserConfig.multiLineStrings;

  var keywords = words("abs,access,after,alias,all,and,architecture,array,assert,attribute,begin,block," +
      "body,buffer,bus,case,component,configuration,constant,disconnect,downto,else,elsif,end,end block,end case," +
      "end component,end for,end generate,end if,end loop,end process,end record,end units,entity,exit,file,for," +
      "function,generate,generic,generic map,group,guarded,if,impure,in,inertial,inout,is,label,library,linkage," +
      "literal,loop,map,mod,nand,new,next,nor,null,of,on,open,or,others,out,package,package body,port,port map," +
      "postponed,procedure,process,pure,range,record,register,reject,rem,report,return,rol,ror,select,severity,signal," +
      "sla,sll,sra,srl,subtype,then,to,transport,type,unaffected,units,until,use,variable,wait,when,while,with,xnor,xor");

  var blockKeywords = words("architecture,entity,begin,case,port,else,elsif,end,for,function,if");

  var isOperatorChar = /[&|~><!\)\(*#%@+\/=?\:;}{,\.\^\-\[\]]/;
  var curPunc;

  function tokenBase(stream, state) {
    var ch = stream.next();
    if (hooks[ch]) {
      var result = hooks[ch](stream, state);
      if (result !== false) return result;
    }
    if (ch == '"') {
      state.tokenize = tokenString2(ch);
      return state.tokenize(stream, state);
    }
    if (ch == "'") {
      state.tokenize = tokenString(ch);
      return state.tokenize(stream, state);
    }
    if (/[\[\]{}\(\),;\:\.]/.test(ch)) {
      curPunc = ch;
      return null;
    }
    if (/[\d']/.test(ch)) {
      stream.eatWhile(/[\w\.']/);
      return "number";
    }
    if (ch == "-") {
      if (stream.eat("-")) {
        stream.skipToEnd();
        return "comment";
      }
    }
    if (isOperatorChar.test(ch)) {
      stream.eatWhile(isOperatorChar);
      return "operator";
    }
    stream.eatWhile(/[\w\$_]/);
    var cur = stream.current();
    if (keywords.propertyIsEnumerable(cur.toLowerCase())) {
      if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement";
      return "keyword";
    }
    if (atoms.propertyIsEnumerable(cur)) return "atom";
    return "variable";
  }

  function tokenString(quote) {
    return function(stream, state) {
      var escaped = false, next, end = false;
      while ((next = stream.next()) != null) {
        if (next == quote && !escaped) {end = true; break;}
        escaped = !escaped && next == "--";
      }
      if (end || !(escaped || multiLineStrings))
        state.tokenize = tokenBase;
      return "string";
    };
  }
  function tokenString2(quote) {
    return function(stream, state) {
      var escaped = false, next, end = false;
      while ((next = stream.next()) != null) {
        if (next == quote && !escaped) {end = true; break;}
        escaped = !escaped && next == "--";
      }
      if (end || !(escaped || multiLineStrings))
        state.tokenize = tokenBase;
      return "string-2";
    };
  }

  function Context(indented, column, type, align, prev) {
    this.indented = indented;
    this.column = column;
    this.type = type;
    this.align = align;
    this.prev = prev;
  }
  function pushContext(state, col, type) {
    return state.context = new Context(state.indented, col, type, null, state.context);
  }
  function popContext(state) {
    var t = state.context.type;
    if (t == ")" || t == "]" || t == "}")
      state.indented = state.context.indented;
    return state.context = state.context.prev;
  }

  // Interface
  return {
    startState: function(basecolumn) {
      return {
        tokenize: null,
        context: new Context((basecolumn || 0) - indentUnit, 0, "top", false),
        indented: 0,
        startOfLine: true
      };
    },

    token: function(stream, state) {
      var ctx = state.context;
      if (stream.sol()) {
        if (ctx.align == null) ctx.align = false;
        state.indented = stream.indentation();
        state.startOfLine = true;
      }
      if (stream.eatSpace()) return null;
      curPunc = null;
      var style = (state.tokenize || tokenBase)(stream, state);
      if (style == "comment" || style == "meta") return style;
      if (ctx.align == null) ctx.align = true;

      if ((curPunc == ";" || curPunc == ":") && ctx.type == "statement") popContext(state);
      else if (curPunc == "{") pushContext(state, stream.column(), "}");
      else if (curPunc == "[") pushContext(state, stream.column(), "]");
      else if (curPunc == "(") pushContext(state, stream.column(), ")");
      else if (curPunc == "}") {
        while (ctx.type == "statement") ctx = popContext(state);
        if (ctx.type == "}") ctx = popContext(state);
        while (ctx.type == "statement") ctx = popContext(state);
      }
      else if (curPunc == ctx.type) popContext(state);
      else if (ctx.type == "}" || ctx.type == "top" || (ctx.type == "statement" && curPunc == "newstatement"))
        pushContext(state, stream.column(), "statement");
      state.startOfLine = false;
      return style;
    },

    indent: function(state, textAfter) {
      if (state.tokenize != tokenBase && state.tokenize != null) return 0;
      var firstChar = textAfter && textAfter.charAt(0), ctx = state.context, closing = firstChar == ctx.type;
      if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : indentUnit);
      else if (ctx.align) return ctx.column + (closing ? 0 : 1);
      else return ctx.indented + (closing ? 0 : indentUnit);
    },

    electricChars: "{}"
  };
});

CodeMirror.defineMIME("text/x-vhdl", "vhdl");

});
codemirror/mode/vhdl/index.html000064400000004666151215013510012575 0ustar00<!doctype html>

<title>CodeMirror: VHDL mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="vhdl.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">VHDL</a>
  </ul>
</div>

<article>
<h2>VHDL mode</h2>

<div><textarea id="code" name="code">
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;

ENTITY tb IS
END tb;

ARCHITECTURE behavior OF tb IS
   --Inputs
   signal a : unsigned(2 downto 0) := (others => '0');
   signal b : unsigned(2 downto 0) := (others => '0');
    --Outputs
   signal a_eq_b : std_logic;
   signal a_le_b : std_logic;
   signal a_gt_b : std_logic;

    signal i,j : integer;

BEGIN

    -- Instantiate the Unit Under Test (UUT)
   uut: entity work.comparator PORT MAP (
          a => a,
          b => b,
          a_eq_b => a_eq_b,
          a_le_b => a_le_b,
          a_gt_b => a_gt_b
        );

   -- Stimulus process
   stim_proc: process
   begin
        for i in 0 to 8 loop
            for j in 0 to 8 loop
                a <= to_unsigned(i,3); --integer to unsigned type conversion
                b <= to_unsigned(j,3);
                wait for 10 ns;
            end loop;
        end loop;
   end process;

END;
</textarea></div>

<script>
  var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
    lineNumbers: true,
    matchBrackets: true,
    mode: {
      name: "vhdl",
    }
  });
</script>

<p>
Syntax highlighting and indentation for the VHDL language.
<h2>Configuration options:</h2>
  <ul>
    <li><strong>atoms</strong> - List of atom words. Default: "null"</li>
    <li><strong>hooks</strong> - List of meta hooks. Default: ["`", "$"]</li>
    <li><strong>multiLineStrings</strong> - Whether multi-line strings are accepted. Default: false</li>
  </ul>
</p>

<p><strong>MIME types defined:</strong> <code>text/x-vhdl</code>.</p>
</article>
codemirror/mode/idl/index.html000064400000003141151215013510012373 0ustar00<!doctype html>

<title>CodeMirror: IDL mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="idl.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">IDL</a>
  </ul>
</div>

<article>
<h2>IDL mode</h2>

    <div><textarea id="code" name="code">
;; Example IDL code
FUNCTION mean_and_stddev,array
  ;; This program reads in an array of numbers
  ;; and returns a structure containing the
  ;; average and standard deviation

  ave = 0.0
  count = 0.0

  for i=0,N_ELEMENTS(array)-1 do begin
      ave = ave + array[i]
      count = count + 1
  endfor
  
  ave = ave/count

  std = stddev(array)  

  return, {average:ave,std:std}

END

    </textarea></div>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        mode: {name: "idl",
               version: 1,
               singleLineStringErrors: false},
        lineNumbers: true,
        indentUnit: 4,
        matchBrackets: true
      });
    </script>

    <p><strong>MIME types defined:</strong> <code>text/x-idl</code>.</p>
</article>
codemirror/mode/idl/idl.js000064400000035051151215013510011511 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  function wordRegexp(words) {
    return new RegExp('^((' + words.join(')|(') + '))\\b', 'i');
  };

  var builtinArray = [
    'a_correlate', 'abs', 'acos', 'adapt_hist_equal', 'alog',
    'alog2', 'alog10', 'amoeba', 'annotate', 'app_user_dir',
    'app_user_dir_query', 'arg_present', 'array_equal', 'array_indices',
    'arrow', 'ascii_template', 'asin', 'assoc', 'atan',
    'axis', 'axis', 'bandpass_filter', 'bandreject_filter', 'barplot',
    'bar_plot', 'beseli', 'beselj', 'beselk', 'besely',
    'beta', 'biginteger', 'bilinear', 'bin_date', 'binary_template',
    'bindgen', 'binomial', 'bit_ffs', 'bit_population', 'blas_axpy',
    'blk_con', 'boolarr', 'boolean', 'boxplot', 'box_cursor',
    'breakpoint', 'broyden', 'bubbleplot', 'butterworth', 'bytarr',
    'byte', 'byteorder', 'bytscl', 'c_correlate', 'calendar',
    'caldat', 'call_external', 'call_function', 'call_method',
    'call_procedure', 'canny', 'catch', 'cd', 'cdf', 'ceil',
    'chebyshev', 'check_math', 'chisqr_cvf', 'chisqr_pdf', 'choldc',
    'cholsol', 'cindgen', 'cir_3pnt', 'clipboard', 'close',
    'clust_wts', 'cluster', 'cluster_tree', 'cmyk_convert', 'code_coverage',
    'color_convert', 'color_exchange', 'color_quan', 'color_range_map',
    'colorbar', 'colorize_sample', 'colormap_applicable',
    'colormap_gradient', 'colormap_rotation', 'colortable',
    'comfit', 'command_line_args', 'common', 'compile_opt', 'complex',
    'complexarr', 'complexround', 'compute_mesh_normals', 'cond', 'congrid',
    'conj', 'constrained_min', 'contour', 'contour', 'convert_coord',
    'convol', 'convol_fft', 'coord2to3', 'copy_lun', 'correlate',
    'cos', 'cosh', 'cpu', 'cramer', 'createboxplotdata',
    'create_cursor', 'create_struct', 'create_view', 'crossp', 'crvlength',
    'ct_luminance', 'cti_test', 'cursor', 'curvefit', 'cv_coord',
    'cvttobm', 'cw_animate', 'cw_animate_getp', 'cw_animate_load',
    'cw_animate_run', 'cw_arcball', 'cw_bgroup', 'cw_clr_index',
    'cw_colorsel', 'cw_defroi', 'cw_field', 'cw_filesel', 'cw_form',
    'cw_fslider', 'cw_light_editor', 'cw_light_editor_get',
    'cw_light_editor_set', 'cw_orient', 'cw_palette_editor',
    'cw_palette_editor_get', 'cw_palette_editor_set', 'cw_pdmenu',
    'cw_rgbslider', 'cw_tmpl', 'cw_zoom', 'db_exists',
    'dblarr', 'dcindgen', 'dcomplex', 'dcomplexarr', 'define_key',
    'define_msgblk', 'define_msgblk_from_file', 'defroi', 'defsysv',
    'delvar', 'dendro_plot', 'dendrogram', 'deriv', 'derivsig',
    'determ', 'device', 'dfpmin', 'diag_matrix', 'dialog_dbconnect',
    'dialog_message', 'dialog_pickfile', 'dialog_printersetup',
    'dialog_printjob', 'dialog_read_image',
    'dialog_write_image', 'dictionary', 'digital_filter', 'dilate', 'dindgen',
    'dissolve', 'dist', 'distance_measure', 'dlm_load', 'dlm_register',
    'doc_library', 'double', 'draw_roi', 'edge_dog', 'efont',
    'eigenql', 'eigenvec', 'ellipse', 'elmhes', 'emboss',
    'empty', 'enable_sysrtn', 'eof', 'eos', 'erase',
    'erf', 'erfc', 'erfcx', 'erode', 'errorplot',
    'errplot', 'estimator_filter', 'execute', 'exit', 'exp',
    'expand', 'expand_path', 'expint', 'extrac', 'extract_slice',
    'f_cvf', 'f_pdf', 'factorial', 'fft', 'file_basename',
    'file_chmod', 'file_copy', 'file_delete', 'file_dirname',
    'file_expand_path', 'file_gunzip', 'file_gzip', 'file_info',
    'file_lines', 'file_link', 'file_mkdir', 'file_move',
    'file_poll_input', 'file_readlink', 'file_same',
    'file_search', 'file_tar', 'file_test', 'file_untar', 'file_unzip',
    'file_which', 'file_zip', 'filepath', 'findgen', 'finite',
    'fix', 'flick', 'float', 'floor', 'flow3',
    'fltarr', 'flush', 'format_axis_values', 'forward_function', 'free_lun',
    'fstat', 'fulstr', 'funct', 'function', 'fv_test',
    'fx_root', 'fz_roots', 'gamma', 'gamma_ct', 'gauss_cvf',
    'gauss_pdf', 'gauss_smooth', 'gauss2dfit', 'gaussfit',
    'gaussian_function', 'gaussint', 'get_drive_list', 'get_dxf_objects',
    'get_kbrd', 'get_login_info',
    'get_lun', 'get_screen_size', 'getenv', 'getwindows', 'greg2jul',
    'grib', 'grid_input', 'grid_tps', 'grid3', 'griddata',
    'gs_iter', 'h_eq_ct', 'h_eq_int', 'hanning', 'hash',
    'hdf', 'hdf5', 'heap_free', 'heap_gc', 'heap_nosave',
    'heap_refcount', 'heap_save', 'help', 'hilbert', 'hist_2d',
    'hist_equal', 'histogram', 'hls', 'hough', 'hqr',
    'hsv', 'i18n_multibytetoutf8',
    'i18n_multibytetowidechar', 'i18n_utf8tomultibyte',
    'i18n_widechartomultibyte',
    'ibeta', 'icontour', 'iconvertcoord', 'idelete', 'identity',
    'idl_base64', 'idl_container', 'idl_validname',
    'idlexbr_assistant', 'idlitsys_createtool',
    'idlunit', 'iellipse', 'igamma', 'igetcurrent', 'igetdata',
    'igetid', 'igetproperty', 'iimage', 'image', 'image_cont',
    'image_statistics', 'image_threshold', 'imaginary', 'imap', 'indgen',
    'int_2d', 'int_3d', 'int_tabulated', 'intarr', 'interpol',
    'interpolate', 'interval_volume', 'invert', 'ioctl', 'iopen',
    'ir_filter', 'iplot', 'ipolygon', 'ipolyline', 'iputdata',
    'iregister', 'ireset', 'iresolve', 'irotate', 'isa',
    'isave', 'iscale', 'isetcurrent', 'isetproperty', 'ishft',
    'isocontour', 'isosurface', 'isurface', 'itext', 'itranslate',
    'ivector', 'ivolume', 'izoom', 'journal', 'json_parse',
    'json_serialize', 'jul2greg', 'julday', 'keyword_set', 'krig2d',
    'kurtosis', 'kw_test', 'l64indgen', 'la_choldc', 'la_cholmprove',
    'la_cholsol', 'la_determ', 'la_eigenproblem', 'la_eigenql', 'la_eigenvec',
    'la_elmhes', 'la_gm_linear_model', 'la_hqr', 'la_invert',
    'la_least_square_equality', 'la_least_squares', 'la_linear_equation',
    'la_ludc', 'la_lumprove', 'la_lusol',
    'la_svd', 'la_tridc', 'la_trimprove', 'la_triql', 'la_trired',
    'la_trisol', 'label_date', 'label_region', 'ladfit', 'laguerre',
    'lambda', 'lambdap', 'lambertw', 'laplacian', 'least_squares_filter',
    'leefilt', 'legend', 'legendre', 'linbcg', 'lindgen',
    'linfit', 'linkimage', 'list', 'll_arc_distance', 'lmfit',
    'lmgr', 'lngamma', 'lnp_test', 'loadct', 'locale_get',
    'logical_and', 'logical_or', 'logical_true', 'lon64arr', 'lonarr',
    'long', 'long64', 'lsode', 'lu_complex', 'ludc',
    'lumprove', 'lusol', 'm_correlate', 'machar', 'make_array',
    'make_dll', 'make_rt', 'map', 'mapcontinents', 'mapgrid',
    'map_2points', 'map_continents', 'map_grid', 'map_image', 'map_patch',
    'map_proj_forward', 'map_proj_image', 'map_proj_info',
    'map_proj_init', 'map_proj_inverse',
    'map_set', 'matrix_multiply', 'matrix_power', 'max', 'md_test',
    'mean', 'meanabsdev', 'mean_filter', 'median', 'memory',
    'mesh_clip', 'mesh_decimate', 'mesh_issolid',
    'mesh_merge', 'mesh_numtriangles',
    'mesh_obj', 'mesh_smooth', 'mesh_surfacearea',
    'mesh_validate', 'mesh_volume',
    'message', 'min', 'min_curve_surf', 'mk_html_help', 'modifyct',
    'moment', 'morph_close', 'morph_distance',
    'morph_gradient', 'morph_hitormiss',
    'morph_open', 'morph_thin', 'morph_tophat', 'multi', 'n_elements',
    'n_params', 'n_tags', 'ncdf', 'newton', 'noise_hurl',
    'noise_pick', 'noise_scatter', 'noise_slur', 'norm', 'obj_class',
    'obj_destroy', 'obj_hasmethod', 'obj_isa', 'obj_new', 'obj_valid',
    'objarr', 'on_error', 'on_ioerror', 'online_help', 'openr',
    'openu', 'openw', 'oplot', 'oploterr', 'orderedhash',
    'p_correlate', 'parse_url', 'particle_trace', 'path_cache', 'path_sep',
    'pcomp', 'plot', 'plot3d', 'plot', 'plot_3dbox',
    'plot_field', 'ploterr', 'plots', 'polar_contour', 'polar_surface',
    'polyfill', 'polyshade', 'pnt_line', 'point_lun', 'polarplot',
    'poly', 'poly_2d', 'poly_area', 'poly_fit', 'polyfillv',
    'polygon', 'polyline', 'polywarp', 'popd', 'powell',
    'pref_commit', 'pref_get', 'pref_set', 'prewitt', 'primes',
    'print', 'printf', 'printd', 'pro', 'product',
    'profile', 'profiler', 'profiles', 'project_vol', 'ps_show_fonts',
    'psafm', 'pseudo', 'ptr_free', 'ptr_new', 'ptr_valid',
    'ptrarr', 'pushd', 'qgrid3', 'qhull', 'qromb',
    'qromo', 'qsimp', 'query_*', 'query_ascii', 'query_bmp',
    'query_csv', 'query_dicom', 'query_gif', 'query_image', 'query_jpeg',
    'query_jpeg2000', 'query_mrsid', 'query_pict', 'query_png', 'query_ppm',
    'query_srf', 'query_tiff', 'query_video', 'query_wav', 'r_correlate',
    'r_test', 'radon', 'randomn', 'randomu', 'ranks',
    'rdpix', 'read', 'readf', 'read_ascii', 'read_binary',
    'read_bmp', 'read_csv', 'read_dicom', 'read_gif', 'read_image',
    'read_interfile', 'read_jpeg', 'read_jpeg2000', 'read_mrsid', 'read_pict',
    'read_png', 'read_ppm', 'read_spr', 'read_srf', 'read_sylk',
    'read_tiff', 'read_video', 'read_wav', 'read_wave', 'read_x11_bitmap',
    'read_xwd', 'reads', 'readu', 'real_part', 'rebin',
    'recall_commands', 'recon3', 'reduce_colors', 'reform', 'region_grow',
    'register_cursor', 'regress', 'replicate',
    'replicate_inplace', 'resolve_all',
    'resolve_routine', 'restore', 'retall', 'return', 'reverse',
    'rk4', 'roberts', 'rot', 'rotate', 'round',
    'routine_filepath', 'routine_info', 'rs_test', 's_test', 'save',
    'savgol', 'scale3', 'scale3d', 'scatterplot', 'scatterplot3d',
    'scope_level', 'scope_traceback', 'scope_varfetch',
    'scope_varname', 'search2d',
    'search3d', 'sem_create', 'sem_delete', 'sem_lock', 'sem_release',
    'set_plot', 'set_shading', 'setenv', 'sfit', 'shade_surf',
    'shade_surf_irr', 'shade_volume', 'shift', 'shift_diff', 'shmdebug',
    'shmmap', 'shmunmap', 'shmvar', 'show3', 'showfont',
    'signum', 'simplex', 'sin', 'sindgen', 'sinh',
    'size', 'skewness', 'skip_lun', 'slicer3', 'slide_image',
    'smooth', 'sobel', 'socket', 'sort', 'spawn',
    'sph_4pnt', 'sph_scat', 'spher_harm', 'spl_init', 'spl_interp',
    'spline', 'spline_p', 'sprsab', 'sprsax', 'sprsin',
    'sprstp', 'sqrt', 'standardize', 'stddev', 'stop',
    'strarr', 'strcmp', 'strcompress', 'streamline', 'streamline',
    'stregex', 'stretch', 'string', 'strjoin', 'strlen',
    'strlowcase', 'strmatch', 'strmessage', 'strmid', 'strpos',
    'strput', 'strsplit', 'strtrim', 'struct_assign', 'struct_hide',
    'strupcase', 'surface', 'surface', 'surfr', 'svdc',
    'svdfit', 'svsol', 'swap_endian', 'swap_endian_inplace', 'symbol',
    'systime', 't_cvf', 't_pdf', 't3d', 'tag_names',
    'tan', 'tanh', 'tek_color', 'temporary', 'terminal_size',
    'tetra_clip', 'tetra_surface', 'tetra_volume', 'text', 'thin',
    'thread', 'threed', 'tic', 'time_test2', 'timegen',
    'timer', 'timestamp', 'timestamptovalues', 'tm_test', 'toc',
    'total', 'trace', 'transpose', 'tri_surf', 'triangulate',
    'trigrid', 'triql', 'trired', 'trisol', 'truncate_lun',
    'ts_coef', 'ts_diff', 'ts_fcast', 'ts_smooth', 'tv',
    'tvcrs', 'tvlct', 'tvrd', 'tvscl', 'typename',
    'uindgen', 'uint', 'uintarr', 'ul64indgen', 'ulindgen',
    'ulon64arr', 'ulonarr', 'ulong', 'ulong64', 'uniq',
    'unsharp_mask', 'usersym', 'value_locate', 'variance', 'vector',
    'vector_field', 'vel', 'velovect', 'vert_t3d', 'voigt',
    'volume', 'voronoi', 'voxel_proj', 'wait', 'warp_tri',
    'watershed', 'wdelete', 'wf_draw', 'where', 'widget_base',
    'widget_button', 'widget_combobox', 'widget_control',
    'widget_displaycontextmenu', 'widget_draw',
    'widget_droplist', 'widget_event', 'widget_info',
    'widget_label', 'widget_list',
    'widget_propertysheet', 'widget_slider', 'widget_tab',
    'widget_table', 'widget_text',
    'widget_tree', 'widget_tree_move', 'widget_window',
    'wiener_filter', 'window',
    'window', 'write_bmp', 'write_csv', 'write_gif', 'write_image',
    'write_jpeg', 'write_jpeg2000', 'write_nrif', 'write_pict', 'write_png',
    'write_ppm', 'write_spr', 'write_srf', 'write_sylk', 'write_tiff',
    'write_video', 'write_wav', 'write_wave', 'writeu', 'wset',
    'wshow', 'wtn', 'wv_applet', 'wv_cwt', 'wv_cw_wavelet',
    'wv_denoise', 'wv_dwt', 'wv_fn_coiflet',
    'wv_fn_daubechies', 'wv_fn_gaussian',
    'wv_fn_haar', 'wv_fn_morlet', 'wv_fn_paul',
    'wv_fn_symlet', 'wv_import_data',
    'wv_import_wavelet', 'wv_plot3d_wps', 'wv_plot_multires',
    'wv_pwt', 'wv_tool_denoise',
    'xbm_edit', 'xdisplayfile', 'xdxf', 'xfont', 'xinteranimate',
    'xloadct', 'xmanager', 'xmng_tmpl', 'xmtool', 'xobjview',
    'xobjview_rotate', 'xobjview_write_image',
    'xpalette', 'xpcolor', 'xplot3d',
    'xregistered', 'xroi', 'xsq_test', 'xsurface', 'xvaredit',
    'xvolume', 'xvolume_rotate', 'xvolume_write_image',
    'xyouts', 'zlib_compress', 'zlib_uncompress', 'zoom', 'zoom_24'
  ];
  var builtins = wordRegexp(builtinArray);

  var keywordArray = [
    'begin', 'end', 'endcase', 'endfor',
    'endwhile', 'endif', 'endrep', 'endforeach',
    'break', 'case', 'continue', 'for',
    'foreach', 'goto', 'if', 'then', 'else',
    'repeat', 'until', 'switch', 'while',
    'do', 'pro', 'function'
  ];
  var keywords = wordRegexp(keywordArray);

  CodeMirror.registerHelper("hintWords", "idl", builtinArray.concat(keywordArray));

  var identifiers = new RegExp('^[_a-z\xa1-\uffff][_a-z0-9\xa1-\uffff]*', 'i');

  var singleOperators = /[+\-*&=<>\/@#~$]/;
  var boolOperators = new RegExp('(and|or|eq|lt|le|gt|ge|ne|not)', 'i');

  function tokenBase(stream) {
    // whitespaces
    if (stream.eatSpace()) return null;

    // Handle one line Comments
    if (stream.match(';')) {
      stream.skipToEnd();
      return 'comment';
    }

    // Handle Number Literals
    if (stream.match(/^[0-9\.+-]/, false)) {
      if (stream.match(/^[+-]?0x[0-9a-fA-F]+/))
        return 'number';
      if (stream.match(/^[+-]?\d*\.\d+([EeDd][+-]?\d+)?/))
        return 'number';
      if (stream.match(/^[+-]?\d+([EeDd][+-]?\d+)?/))
        return 'number';
    }

    // Handle Strings
    if (stream.match(/^"([^"]|(""))*"/)) { return 'string'; }
    if (stream.match(/^'([^']|(''))*'/)) { return 'string'; }

    // Handle words
    if (stream.match(keywords)) { return 'keyword'; }
    if (stream.match(builtins)) { return 'builtin'; }
    if (stream.match(identifiers)) { return 'variable'; }

    if (stream.match(singleOperators) || stream.match(boolOperators)) {
      return 'operator'; }

    // Handle non-detected items
    stream.next();
    return null;
  };

  CodeMirror.defineMode('idl', function() {
    return {
      token: function(stream) {
        return tokenBase(stream);
      }
    };
  });

  CodeMirror.defineMIME('text/x-idl', 'idl');
});
codemirror/mode/shell/index.html000064400000003321151215013510012732 0ustar00<!doctype html>

<title>CodeMirror: Shell mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel=stylesheet href=../../lib/codemirror.css>
<script src=../../lib/codemirror.js></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src=shell.js></script>
<style type=text/css>
  .CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}
</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Shell</a>
  </ul>
</div>

<article>
<h2>Shell mode</h2>


<textarea id=code>
#!/bin/bash

# clone the repository
git clone http://github.com/garden/tree

# generate HTTPS credentials
cd tree
openssl genrsa -aes256 -out https.key 1024
openssl req -new -nodes -key https.key -out https.csr
openssl x509 -req -days 365 -in https.csr -signkey https.key -out https.crt
cp https.key{,.orig}
openssl rsa -in https.key.orig -out https.key

# start the server in HTTPS mode
cd web
sudo node ../server.js 443 'yes' &gt;&gt; ../node.log &amp;

# here is how to stop the server
for pid in `ps aux | grep 'node ../server.js' | awk '{print $2}'` ; do
  sudo kill -9 $pid 2&gt; /dev/null
done

exit 0</textarea>

<script>
  var editor = CodeMirror.fromTextArea(document.getElementById('code'), {
    mode: 'shell',
    lineNumbers: true,
    matchBrackets: true
  });
</script>

<p><strong>MIME types defined:</strong> <code>text/x-sh</code>.</p>
</article>
codemirror/mode/shell/test.js000064400000003366151215013510012263 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function() {
  var mode = CodeMirror.getMode({}, "shell");
  function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); }

  MT("var",
     "text [def $var] text");
  MT("varBraces",
     "text[def ${var}]text");
  MT("varVar",
     "text [def $a$b] text");
  MT("varBracesVarBraces",
     "text[def ${a}${b}]text");

  MT("singleQuotedVar",
     "[string 'text $var text']");
  MT("singleQuotedVarBraces",
     "[string 'text ${var} text']");

  MT("doubleQuotedVar",
     '[string "text ][def $var][string  text"]');
  MT("doubleQuotedVarBraces",
     '[string "text][def ${var}][string text"]');
  MT("doubleQuotedVarPunct",
     '[string "text ][def $@][string  text"]');
  MT("doubleQuotedVarVar",
     '[string "][def $a$b][string "]');
  MT("doubleQuotedVarBracesVarBraces",
     '[string "][def ${a}${b}][string "]');

  MT("notAString",
     "text\\'text");
  MT("escapes",
     "outside\\'\\\"\\`\\\\[string \"inside\\`\\'\\\"\\\\`\\$notAVar\"]outside\\$\\(notASubShell\\)");

  MT("subshell",
     "[builtin echo] [quote jQuery(whoami)] s log, stardate [quote `date`].");
  MT("doubleQuotedSubshell",
     "[builtin echo] [string \"][quote jQuery(whoami)][string 's log, stardate `date`.\"]");

  MT("hashbang",
     "[meta #!/bin/bash]");
  MT("comment",
     "text [comment # Blurb]");

  MT("numbers",
     "[number 0] [number 1] [number 2]");
  MT("keywords",
     "[keyword while] [atom true]; [keyword do]",
     "  [builtin sleep] [number 3]",
     "[keyword done]");
  MT("options",
     "[builtin ls] [attribute -l] [attribute --human-readable]");
  MT("operator",
     "[def var][operator =]value");
})();
codemirror/mode/shell/shell.js000064400000007320151215013510012405 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode('shell', function() {

  var words = {};
  function define(style, string) {
    var split = string.split(' ');
    for(var i = 0; i < split.length; i++) {
      words[split[i]] = style;
    }
  };

  // Atoms
  define('atom', 'true false');

  // Keywords
  define('keyword', 'if then do else elif while until for in esac fi fin ' +
    'fil done exit set unset export function');

  // Commands
  define('builtin', 'ab awk bash beep cat cc cd chown chmod chroot clear cp ' +
    'curl cut diff echo find gawk gcc get git grep kill killall ln ls make ' +
    'mkdir openssl mv nc node npm ping ps restart rm rmdir sed service sh ' +
    'shopt shred source sort sleep ssh start stop su sudo tee telnet top ' +
    'touch vi vim wall wc wget who write yes zsh');

  function tokenBase(stream, state) {
    if (stream.eatSpace()) return null;

    var sol = stream.sol();
    var ch = stream.next();

    if (ch === '\\') {
      stream.next();
      return null;
    }
    if (ch === '\'' || ch === '"' || ch === '`') {
      state.tokens.unshift(tokenString(ch));
      return tokenize(stream, state);
    }
    if (ch === '#') {
      if (sol && stream.eat('!')) {
        stream.skipToEnd();
        return 'meta'; // 'comment'?
      }
      stream.skipToEnd();
      return 'comment';
    }
    if (ch === '$') {
      state.tokens.unshift(tokenDollar);
      return tokenize(stream, state);
    }
    if (ch === '+' || ch === '=') {
      return 'operator';
    }
    if (ch === '-') {
      stream.eat('-');
      stream.eatWhile(/\w/);
      return 'attribute';
    }
    if (/\d/.test(ch)) {
      stream.eatWhile(/\d/);
      if(stream.eol() || !/\w/.test(stream.peek())) {
        return 'number';
      }
    }
    stream.eatWhile(/[\w-]/);
    var cur = stream.current();
    if (stream.peek() === '=' && /\w+/.test(cur)) return 'def';
    return words.hasOwnProperty(cur) ? words[cur] : null;
  }

  function tokenString(quote) {
    return function(stream, state) {
      var next, end = false, escaped = false;
      while ((next = stream.next()) != null) {
        if (next === quote && !escaped) {
          end = true;
          break;
        }
        if (next === '$' && !escaped && quote !== '\'') {
          escaped = true;
          stream.backUp(1);
          state.tokens.unshift(tokenDollar);
          break;
        }
        escaped = !escaped && next === '\\';
      }
      if (end || !escaped) {
        state.tokens.shift();
      }
      return (quote === '`' || quote === ')' ? 'quote' : 'string');
    };
  };

  var tokenDollar = function(stream, state) {
    if (state.tokens.length > 1) stream.eat('$');
    var ch = stream.next(), hungry = /\w/;
    if (ch === '{') hungry = /[^}]/;
    if (ch === '(') {
      state.tokens[0] = tokenString(')');
      return tokenize(stream, state);
    }
    if (!/\d/.test(ch)) {
      stream.eatWhile(hungry);
      stream.eat('}');
    }
    state.tokens.shift();
    return 'def';
  };

  function tokenize(stream, state) {
    return (state.tokens[0] || tokenBase) (stream, state);
  };

  return {
    startState: function() {return {tokens:[]};},
    token: function(stream, state) {
      return tokenize(stream, state);
    },
    lineComment: '#',
    fold: "brace"
  };
});

CodeMirror.defineMIME('text/x-sh', 'shell');

});
codemirror/mode/elm/index.html000064400000003150151215013510012400 0ustar00<!doctype html>

<title>CodeMirror: Elm mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="elm.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Elm</a>
  </ul>
</div>

<article>
<h2>Elm mode</h2>

<div><textarea id="code" name="code">
import Color exposing (..)
import Graphics.Collage exposing (..)
import Graphics.Element exposing (..)
import Time exposing (..)

main =
  Signal.map clock (every second)

clock t =
  collage 400 400
    [ filled    lightGrey   (ngon 12 110)
    , outlined (solid grey) (ngon 12 110)
    , hand orange   100  t
    , hand charcoal 100 (t/60)
    , hand charcoal 60  (t/720)
    ]

hand clr len time =
  let angle = degrees (90 - 6 * inSeconds time)
  in
      segment (0,0) (fromPolar (len,angle))
        |> traced (solid clr)
</textarea></div>

    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        lineNumbers: true,
        mode: "text/x-elm"
      });
    </script>

    <p><strong>MIME types defined:</strong> <code>text/x-elm</code>.</p>
  </article>
codemirror/mode/elm/elm.js000064400000012660151215013510011524 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  CodeMirror.defineMode("elm", function() {

    function switchState(source, setState, f) {
      setState(f);
      return f(source, setState);
    }

    // These should all be Unicode extended, as per the Haskell 2010 report
    var smallRE = /[a-z_]/;
    var largeRE = /[A-Z]/;
    var digitRE = /[0-9]/;
    var hexitRE = /[0-9A-Fa-f]/;
    var octitRE = /[0-7]/;
    var idRE = /[a-z_A-Z0-9\']/;
    var symbolRE = /[-!#$%&*+.\/<=>?@\\^|~:\u03BB\u2192]/;
    var specialRE = /[(),;[\]`{}]/;
    var whiteCharRE = /[ \t\v\f]/; // newlines are handled in tokenizer

    function normal() {
      return function (source, setState) {
        if (source.eatWhile(whiteCharRE)) {
          return null;
        }

        var ch = source.next();
        if (specialRE.test(ch)) {
          if (ch == '{' && source.eat('-')) {
            var t = "comment";
            if (source.eat('#')) t = "meta";
            return switchState(source, setState, ncomment(t, 1));
          }
          return null;
        }

        if (ch == '\'') {
          if (source.eat('\\'))
            source.next();  // should handle other escapes here
          else
            source.next();

          if (source.eat('\''))
            return "string";
          return "error";
        }

        if (ch == '"') {
          return switchState(source, setState, stringLiteral);
        }

        if (largeRE.test(ch)) {
          source.eatWhile(idRE);
          if (source.eat('.'))
            return "qualifier";
          return "variable-2";
        }

        if (smallRE.test(ch)) {
          var isDef = source.pos === 1;
          source.eatWhile(idRE);
          return isDef ? "variable-3" : "variable";
        }

        if (digitRE.test(ch)) {
          if (ch == '0') {
            if (source.eat(/[xX]/)) {
              source.eatWhile(hexitRE); // should require at least 1
              return "integer";
            }
            if (source.eat(/[oO]/)) {
              source.eatWhile(octitRE); // should require at least 1
              return "number";
            }
          }
          source.eatWhile(digitRE);
          var t = "number";
          if (source.eat('.')) {
            t = "number";
            source.eatWhile(digitRE); // should require at least 1
          }
          if (source.eat(/[eE]/)) {
            t = "number";
            source.eat(/[-+]/);
            source.eatWhile(digitRE); // should require at least 1
          }
          return t;
        }

        if (symbolRE.test(ch)) {
          if (ch == '-' && source.eat(/-/)) {
            source.eatWhile(/-/);
            if (!source.eat(symbolRE)) {
              source.skipToEnd();
              return "comment";
            }
          }
          source.eatWhile(symbolRE);
          return "builtin";
        }

        return "error";
      }
    }

    function ncomment(type, nest) {
      if (nest == 0) {
        return normal();
      }
      return function(source, setState) {
        var currNest = nest;
        while (!source.eol()) {
          var ch = source.next();
          if (ch == '{' && source.eat('-')) {
            ++currNest;
          } else if (ch == '-' && source.eat('}')) {
            --currNest;
            if (currNest == 0) {
              setState(normal());
              return type;
            }
          }
        }
        setState(ncomment(type, currNest));
        return type;
      }
    }

    function stringLiteral(source, setState) {
      while (!source.eol()) {
        var ch = source.next();
        if (ch == '"') {
          setState(normal());
          return "string";
        }
        if (ch == '\\') {
          if (source.eol() || source.eat(whiteCharRE)) {
            setState(stringGap);
            return "string";
          }
          if (!source.eat('&')) source.next(); // should handle other escapes here
        }
      }
      setState(normal());
      return "error";
    }

    function stringGap(source, setState) {
      if (source.eat('\\')) {
        return switchState(source, setState, stringLiteral);
      }
      source.next();
      setState(normal());
      return "error";
    }


    var wellKnownWords = (function() {
      var wkw = {};

      var keywords = [
        "case", "of", "as",
        "if", "then", "else",
        "let", "in",
        "infix", "infixl", "infixr",
        "type", "alias",
        "input", "output", "foreign", "loopback",
        "module", "where", "import", "exposing",
        "_", "..", "|", ":", "=", "\\", "\"", "->", "<-"
      ];

      for (var i = keywords.length; i--;)
        wkw[keywords[i]] = "keyword";

      return wkw;
    })();



    return {
      startState: function ()  { return { f: normal() }; },
      copyState:  function (s) { return { f: s.f }; },

      token: function(stream, state) {
        var t = state.f(stream, function(s) { state.f = s; });
        var w = stream.current();
        return (wellKnownWords.hasOwnProperty(w)) ? wellKnownWords[w] : t;
      }
    };

  });

  CodeMirror.defineMIME("text/x-elm", "elm");
});
codemirror/mode/fcl/index.html000064400000006023151215013510012371 0ustar00<!doctype html>

<title>CodeMirror: FCL mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<link rel="stylesheet" href="../../theme/elegant.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="fcl.js"></script>
<style>.CodeMirror {border:1px solid #999; background:#ffc}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">FCL</a>
  </ul>
</div>

<article>
<h2>FCL mode</h2>
<form><textarea id="code" name="code">
  FUNCTION_BLOCK Fuzzy_FB
      VAR_INPUT
          TimeDay : REAL; (* RANGE(0 .. 23) *)
          ApplicateHost: REAL;
          TimeConfiguration: REAL;
          TimeRequirements: REAL;
      END_VAR

      VAR_OUTPUT
          ProbabilityDistribution: REAL;
          ProbabilityAccess: REAL;
      END_VAR

      FUZZIFY TimeDay
          TERM inside := (0, 0) (8, 1) (22,0);
          TERM outside := (0, 1) (8, 0) (22, 1);
      END_FUZZIFY

      FUZZIFY ApplicateHost
          TERM few := (0, 1) (100, 0) (200, 0);
          TERM many := (0, 0) (100, 0) (200, 1);
      END_FUZZIFY

      FUZZIFY TimeConfiguration
          TERM recently := (0, 1) (30, 1) (120, 0);
          TERM long := (0, 0) (30, 0) (120, 1);
      END_FUZZIFY

      FUZZIFY TimeRequirements
          TERM recently := (0, 1) (30, 1) (365, 0);
          TERM long := (0, 0) (30, 0) (365, 1);
      END_FUZZIFY

      DEFUZZIFY ProbabilityAccess
          TERM hight := 1;
          TERM medium := 0.5;
          TERM low := 0;
          ACCU: MAX;
          METHOD: COGS;
          DEFAULT := 0;
      END_DEFUZZIFY

      DEFUZZIFY ProbabilityDistribution
          TERM hight := 1;
          TERM medium := 0.5;
          TERM low := 0;
          ACCU: MAX;
          METHOD: COGS;
          DEFAULT := 0;
      END_DEFUZZIFY

      RULEBLOCK No1
          AND : MIN;
          RULE 1 : IF TimeDay IS outside AND ApplicateHost IS few THEN ProbabilityAccess IS hight;
          RULE 2 : IF ApplicateHost IS many THEN ProbabilityAccess IS hight;
          RULE 3 : IF TimeDay IS inside AND ApplicateHost IS few THEN ProbabilityAccess IS low;
      END_RULEBLOCK

      RULEBLOCK No2
          AND : MIN;
          RULE 1 : IF ApplicateHost IS many THEN ProbabilityDistribution IS hight;
      END_RULEBLOCK

  END_FUNCTION_BLOCK
</textarea></form>

    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        theme: "elegant",
        matchBrackets: true,
        indentUnit: 8,
        tabSize: 8,
        indentWithTabs: true,
        mode: "text/x-fcl"
      });
    </script>

    <p><strong>MIME type:</strong> <code>text/x-fcl</code></p>
  </article>
codemirror/mode/fcl/fcl.js000064400000011137151215013510011500 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("fcl", function(config) {
  var indentUnit = config.indentUnit;

  var keywords = {
      "term": true,
      "method": true, "accu": true,
      "rule": true, "then": true, "is": true, "and": true, "or": true,
      "if": true, "default": true
  };

  var start_blocks = {
      "var_input": true,
      "var_output": true,
      "fuzzify": true,
      "defuzzify": true,
      "function_block": true,
      "ruleblock": true
  };

  var end_blocks = {
      "end_ruleblock": true,
      "end_defuzzify": true,
      "end_function_block": true,
      "end_fuzzify": true,
      "end_var": true
  };

  var atoms = {
      "true": true, "false": true, "nan": true,
      "real": true, "min": true, "max": true, "cog": true, "cogs": true
  };

  var isOperatorChar = /[+\-*&^%:=<>!|\/]/;

  function tokenBase(stream, state) {
    var ch = stream.next();

    if (/[\d\.]/.test(ch)) {
      if (ch == ".") {
        stream.match(/^[0-9]+([eE][\-+]?[0-9]+)?/);
      } else if (ch == "0") {
        stream.match(/^[xX][0-9a-fA-F]+/) || stream.match(/^0[0-7]+/);
      } else {
        stream.match(/^[0-9]*\.?[0-9]*([eE][\-+]?[0-9]+)?/);
      }
      return "number";
    }

    if (ch == "/" || ch == "(") {
      if (stream.eat("*")) {
        state.tokenize = tokenComment;
        return tokenComment(stream, state);
      }
      if (stream.eat("/")) {
        stream.skipToEnd();
        return "comment";
      }
    }
    if (isOperatorChar.test(ch)) {
      stream.eatWhile(isOperatorChar);
      return "operator";
    }
    stream.eatWhile(/[\w\$_\xa1-\uffff]/);

    var cur = stream.current().toLowerCase();
    if (keywords.propertyIsEnumerable(cur) ||
        start_blocks.propertyIsEnumerable(cur) ||
        end_blocks.propertyIsEnumerable(cur)) {
      return "keyword";
    }
    if (atoms.propertyIsEnumerable(cur)) return "atom";
    return "variable";
  }


  function tokenComment(stream, state) {
    var maybeEnd = false, ch;
    while (ch = stream.next()) {
      if ((ch == "/" || ch == ")") && maybeEnd) {
        state.tokenize = tokenBase;
        break;
      }
      maybeEnd = (ch == "*");
    }
    return "comment";
  }

  function Context(indented, column, type, align, prev) {
    this.indented = indented;
    this.column = column;
    this.type = type;
    this.align = align;
    this.prev = prev;
  }

  function pushContext(state, col, type) {
    return state.context = new Context(state.indented, col, type, null, state.context);
  }

  function popContext(state) {
    if (!state.context.prev) return;
    var t = state.context.type;
    if (t == "end_block")
      state.indented = state.context.indented;
    return state.context = state.context.prev;
  }

  // Interface

  return {
    startState: function(basecolumn) {
      return {
        tokenize: null,
        context: new Context((basecolumn || 0) - indentUnit, 0, "top", false),
        indented: 0,
        startOfLine: true
      };
    },

    token: function(stream, state) {
        var ctx = state.context;
        if (stream.sol()) {
            if (ctx.align == null) ctx.align = false;
            state.indented = stream.indentation();
            state.startOfLine = true;
        }
        if (stream.eatSpace()) return null;

        var style = (state.tokenize || tokenBase)(stream, state);
        if (style == "comment") return style;
        if (ctx.align == null) ctx.align = true;

        var cur = stream.current().toLowerCase();

        if (start_blocks.propertyIsEnumerable(cur)) pushContext(state, stream.column(), "end_block");
        else if (end_blocks.propertyIsEnumerable(cur))  popContext(state);

        state.startOfLine = false;
        return style;
    },

    indent: function(state, textAfter) {
      if (state.tokenize != tokenBase && state.tokenize != null) return 0;
      var ctx = state.context;

      var closing = end_blocks.propertyIsEnumerable(textAfter);
      if (ctx.align) return ctx.column + (closing ? 0 : 1);
      else return ctx.indented + (closing ? 0 : indentUnit);
    },

    electricChars: "ryk",
    fold: "brace",
    blockCommentStart: "(*",
    blockCommentEnd: "*)",
    lineComment: "//"
  };
});

CodeMirror.defineMIME("text/x-fcl", "fcl");
});
codemirror/mode/ecl/ecl.js000064400000021213151215013510011472 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("ecl", function(config) {

  function words(str) {
    var obj = {}, words = str.split(" ");
    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
    return obj;
  }

  function metaHook(stream, state) {
    if (!state.startOfLine) return false;
    stream.skipToEnd();
    return "meta";
  }

  var indentUnit = config.indentUnit;
  var keyword = words("abs acos allnodes ascii asin asstring atan atan2 ave case choose choosen choosesets clustersize combine correlation cos cosh count covariance cron dataset dedup define denormalize distribute distributed distribution ebcdic enth error evaluate event eventextra eventname exists exp failcode failmessage fetch fromunicode getisvalid global graph group hash hash32 hash64 hashcrc hashmd5 having if index intformat isvalid iterate join keyunicode length library limit ln local log loop map matched matchlength matchposition matchtext matchunicode max merge mergejoin min nolocal nonempty normalize parse pipe power preload process project pull random range rank ranked realformat recordof regexfind regexreplace regroup rejected rollup round roundup row rowdiff sample set sin sinh sizeof soapcall sort sorted sqrt stepped stored sum table tan tanh thisnode topn tounicode transfer trim truncate typeof ungroup unicodeorder variance which workunit xmldecode xmlencode xmltext xmlunicode");
  var variable = words("apply assert build buildindex evaluate fail keydiff keypatch loadxml nothor notify output parallel sequential soapcall wait");
  var variable_2 = words("__compressed__ all and any as atmost before beginc++ best between case const counter csv descend encrypt end endc++ endmacro except exclusive expire export extend false few first flat from full function group header heading hole ifblock import in interface joined keep keyed last left limit load local locale lookup macro many maxcount maxlength min skew module named nocase noroot noscan nosort not of only opt or outer overwrite packed partition penalty physicallength pipe quote record relationship repeat return right scan self separator service shared skew skip sql store terminator thor threshold token transform trim true type unicodeorder unsorted validate virtual whole wild within xml xpath");
  var variable_3 = words("ascii big_endian boolean data decimal ebcdic integer pattern qstring real record rule set of string token udecimal unicode unsigned varstring varunicode");
  var builtin = words("checkpoint deprecated failcode failmessage failure global independent onwarning persist priority recovery stored success wait when");
  var blockKeywords = words("catch class do else finally for if switch try while");
  var atoms = words("true false null");
  var hooks = {"#": metaHook};
  var isOperatorChar = /[+\-*&%=<>!?|\/]/;

  var curPunc;

  function tokenBase(stream, state) {
    var ch = stream.next();
    if (hooks[ch]) {
      var result = hooks[ch](stream, state);
      if (result !== false) return result;
    }
    if (ch == '"' || ch == "'") {
      state.tokenize = tokenString(ch);
      return state.tokenize(stream, state);
    }
    if (/[\[\]{}\(\),;\:\.]/.test(ch)) {
      curPunc = ch;
      return null;
    }
    if (/\d/.test(ch)) {
      stream.eatWhile(/[\w\.]/);
      return "number";
    }
    if (ch == "/") {
      if (stream.eat("*")) {
        state.tokenize = tokenComment;
        return tokenComment(stream, state);
      }
      if (stream.eat("/")) {
        stream.skipToEnd();
        return "comment";
      }
    }
    if (isOperatorChar.test(ch)) {
      stream.eatWhile(isOperatorChar);
      return "operator";
    }
    stream.eatWhile(/[\w\$_]/);
    var cur = stream.current().toLowerCase();
    if (keyword.propertyIsEnumerable(cur)) {
      if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement";
      return "keyword";
    } else if (variable.propertyIsEnumerable(cur)) {
      if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement";
      return "variable";
    } else if (variable_2.propertyIsEnumerable(cur)) {
      if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement";
      return "variable-2";
    } else if (variable_3.propertyIsEnumerable(cur)) {
      if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement";
      return "variable-3";
    } else if (builtin.propertyIsEnumerable(cur)) {
      if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement";
      return "builtin";
    } else { //Data types are of from KEYWORD##
                var i = cur.length - 1;
                while(i >= 0 && (!isNaN(cur[i]) || cur[i] == '_'))
                        --i;

                if (i > 0) {
                        var cur2 = cur.substr(0, i + 1);
                if (variable_3.propertyIsEnumerable(cur2)) {
                        if (blockKeywords.propertyIsEnumerable(cur2)) curPunc = "newstatement";
                        return "variable-3";
                }
            }
    }
    if (atoms.propertyIsEnumerable(cur)) return "atom";
    return null;
  }

  function tokenString(quote) {
    return function(stream, state) {
      var escaped = false, next, end = false;
      while ((next = stream.next()) != null) {
        if (next == quote && !escaped) {end = true; break;}
        escaped = !escaped && next == "\\";
      }
      if (end || !escaped)
        state.tokenize = tokenBase;
      return "string";
    };
  }

  function tokenComment(stream, state) {
    var maybeEnd = false, ch;
    while (ch = stream.next()) {
      if (ch == "/" && maybeEnd) {
        state.tokenize = tokenBase;
        break;
      }
      maybeEnd = (ch == "*");
    }
    return "comment";
  }

  function Context(indented, column, type, align, prev) {
    this.indented = indented;
    this.column = column;
    this.type = type;
    this.align = align;
    this.prev = prev;
  }
  function pushContext(state, col, type) {
    return state.context = new Context(state.indented, col, type, null, state.context);
  }
  function popContext(state) {
    var t = state.context.type;
    if (t == ")" || t == "]" || t == "}")
      state.indented = state.context.indented;
    return state.context = state.context.prev;
  }

  // Interface

  return {
    startState: function(basecolumn) {
      return {
        tokenize: null,
        context: new Context((basecolumn || 0) - indentUnit, 0, "top", false),
        indented: 0,
        startOfLine: true
      };
    },

    token: function(stream, state) {
      var ctx = state.context;
      if (stream.sol()) {
        if (ctx.align == null) ctx.align = false;
        state.indented = stream.indentation();
        state.startOfLine = true;
      }
      if (stream.eatSpace()) return null;
      curPunc = null;
      var style = (state.tokenize || tokenBase)(stream, state);
      if (style == "comment" || style == "meta") return style;
      if (ctx.align == null) ctx.align = true;

      if ((curPunc == ";" || curPunc == ":") && ctx.type == "statement") popContext(state);
      else if (curPunc == "{") pushContext(state, stream.column(), "}");
      else if (curPunc == "[") pushContext(state, stream.column(), "]");
      else if (curPunc == "(") pushContext(state, stream.column(), ")");
      else if (curPunc == "}") {
        while (ctx.type == "statement") ctx = popContext(state);
        if (ctx.type == "}") ctx = popContext(state);
        while (ctx.type == "statement") ctx = popContext(state);
      }
      else if (curPunc == ctx.type) popContext(state);
      else if (ctx.type == "}" || ctx.type == "top" || (ctx.type == "statement" && curPunc == "newstatement"))
        pushContext(state, stream.column(), "statement");
      state.startOfLine = false;
      return style;
    },

    indent: function(state, textAfter) {
      if (state.tokenize != tokenBase && state.tokenize != null) return 0;
      var ctx = state.context, firstChar = textAfter && textAfter.charAt(0);
      if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev;
      var closing = firstChar == ctx.type;
      if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : indentUnit);
      else if (ctx.align) return ctx.column + (closing ? 0 : 1);
      else return ctx.indented + (closing ? 0 : indentUnit);
    },

    electricChars: "{}"
  };
});

CodeMirror.defineMIME("text/x-ecl", "ecl");

});
codemirror/mode/ecl/index.html000064400000002601151215013510012366 0ustar00<!doctype html>

<title>CodeMirror: ECL mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="ecl.js"></script>
<style>.CodeMirror {border: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">ECL</a>
  </ul>
</div>

<article>
<h2>ECL mode</h2>
<form><textarea id="code" name="code">
/*
sample useless code to demonstrate ecl syntax highlighting
this is a multiline comment!
*/

//  this is a singleline comment!

import ut;
r := 
  record
   string22 s1 := '123';
   integer4 i1 := 123;
  end;
#option('tmp', true);
d := dataset('tmp::qb', r, thor);
output(d);
</textarea></form>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {});
    </script>

    <p>Based on CodeMirror's clike mode.  For more information see <a href="http://hpccsystems.com">HPCC Systems</a> web site.</p>
    <p><strong>MIME types defined:</strong> <code>text/x-ecl</code>.</p>

  </article>
codemirror/mode/sas/sas.js000064400000037351151215013510011552 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE


// SAS mode copyright (c) 2016 Jared Dean, SAS Institute
// Created by Jared Dean

// TODO
// indent and de-indent
// identify macro variables


//Definitions
//  comment -- text withing * ; or /* */
//  keyword -- SAS language variable
//  variable -- macro variables starts with '&' or variable formats
//  variable-2 -- DATA Step, proc, or macro names
//  string -- text within ' ' or " "
//  operator -- numeric operator + / - * ** le eq ge ... and so on
//  builtin -- proc %macro data run mend
//  atom
//  def

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  CodeMirror.defineMode("sas", function () {
    var words = {};
    var isDoubleOperatorSym = {
      eq: 'operator',
      lt: 'operator',
      le: 'operator',
      gt: 'operator',
      ge: 'operator',
      "in": 'operator',
      ne: 'operator',
      or: 'operator'
    };
    var isDoubleOperatorChar = /(<=|>=|!=|<>)/;
    var isSingleOperatorChar = /[=\(:\),{}.*<>+\-\/^\[\]]/;

    // Takes a string of words separated by spaces and adds them as
    // keys with the value of the first argument 'style'
    function define(style, string, context) {
      if (context) {
        var split = string.split(' ');
        for (var i = 0; i < split.length; i++) {
          words[split[i]] = {style: style, state: context};
        }
      }
    }
    //datastep
    define('def', 'stack pgm view source debug nesting nolist', ['inDataStep']);
    define('def', 'if while until for do do; end end; then else cancel', ['inDataStep']);
    define('def', 'label format _n_ _error_', ['inDataStep']);
    define('def', 'ALTER BUFNO BUFSIZE CNTLLEV COMPRESS DLDMGACTION ENCRYPT ENCRYPTKEY EXTENDOBSCOUNTER GENMAX GENNUM INDEX LABEL OBSBUF OUTREP PW PWREQ READ REPEMPTY REPLACE REUSE ROLE SORTEDBY SPILL TOBSNO TYPE WRITE FILECLOSE FIRSTOBS IN OBS POINTOBS WHERE WHEREUP IDXNAME IDXWHERE DROP KEEP RENAME', ['inDataStep']);
    define('def', 'filevar finfo finv fipname fipnamel fipstate first firstobs floor', ['inDataStep']);
    define('def', 'varfmt varinfmt varlabel varlen varname varnum varray varrayx vartype verify vformat vformatd vformatdx vformatn vformatnx vformatw vformatwx vformatx vinarray vinarrayx vinformat vinformatd vinformatdx vinformatn vinformatnx vinformatw vinformatwx vinformatx vlabel vlabelx vlength vlengthx vname vnamex vnferr vtype vtypex weekday', ['inDataStep']);
    define('def', 'zipfips zipname zipnamel zipstate', ['inDataStep']);
    define('def', 'put putc putn', ['inDataStep']);
    define('builtin', 'data run', ['inDataStep']);


    //proc
    define('def', 'data', ['inProc']);

    // flow control for macros
    define('def', '%if %end %end; %else %else; %do %do; %then', ['inMacro']);

    //everywhere
    define('builtin', 'proc run; quit; libname filename %macro %mend option options', ['ALL']);

    define('def', 'footnote title libname ods', ['ALL']);
    define('def', '%let %put %global %sysfunc %eval ', ['ALL']);
    // automatic macro variables http://support.sas.com/documentation/cdl/en/mcrolref/61885/HTML/default/viewer.htm#a003167023.htm
    define('variable', '&sysbuffr &syscc &syscharwidth &syscmd &sysdate &sysdate9 &sysday &sysdevic &sysdmg &sysdsn &sysencoding &sysenv &syserr &syserrortext &sysfilrc &syshostname &sysindex &sysinfo &sysjobid &syslast &syslckrc &syslibrc &syslogapplname &sysmacroname &sysmenv &sysmsg &sysncpu &sysodspath &sysparm &syspbuff &sysprocessid &sysprocessname &sysprocname &sysrc &sysscp &sysscpl &sysscpl &syssite &sysstartid &sysstartname &systcpiphostname &systime &sysuserid &sysver &sysvlong &sysvlong4 &syswarningtext', ['ALL']);

    //footnote[1-9]? title[1-9]?

    //options statement
    define('def', 'source2 nosource2 page pageno pagesize', ['ALL']);

    //proc and datastep
    define('def', '_all_ _character_ _cmd_ _freq_ _i_ _infile_ _last_ _msg_ _null_ _numeric_ _temporary_ _type_ abort abs addr adjrsq airy alpha alter altlog altprint and arcos array arsin as atan attrc attrib attrn authserver autoexec awscontrol awsdef awsmenu awsmenumerge awstitle backward band base betainv between blocksize blshift bnot bor brshift bufno bufsize bxor by byerr byline byte calculated call cards cards4 catcache cbufno cdf ceil center cexist change chisq cinv class cleanup close cnonct cntllev coalesce codegen col collate collin column comamid comaux1 comaux2 comdef compbl compound compress config continue convert cos cosh cpuid create cross crosstab css curobs cv daccdb daccdbsl daccsl daccsyd dacctab dairy datalines datalines4 datejul datepart datetime day dbcslang dbcstype dclose ddm delete delimiter depdb depdbsl depsl depsyd deptab dequote descending descript design= device dflang dhms dif digamma dim dinfo display distinct dkricond dkrocond dlm dnum do dopen doptname doptnum dread drop dropnote dsname dsnferr echo else emaildlg emailid emailpw emailserver emailsys encrypt end endsas engine eof eov erf erfc error errorcheck errors exist exp fappend fclose fcol fdelete feedback fetch fetchobs fexist fget file fileclose fileexist filefmt filename fileref  fmterr fmtsearch fnonct fnote font fontalias  fopen foptname foptnum force formatted formchar formdelim formdlim forward fpoint fpos fput fread frewind frlen from fsep fuzz fwrite gaminv gamma getoption getvarc getvarn go goto group gwindow hbar hbound helpenv helploc hms honorappearance hosthelp hostprint hour hpct html hvar ibessel ibr id if index indexc indexw initcmd initstmt inner input inputc inputn inr insert int intck intnx into intrr invaliddata irr is jbessel join juldate keep kentb kurtosis label lag last lbound leave left length levels lgamma lib  library libref line linesize link list log log10 log2 logpdf logpmf logsdf lostcard lowcase lrecl ls macro macrogen maps mautosource max maxdec maxr mdy mean measures median memtype merge merror min minute missing missover mlogic mod mode model modify month mopen mort mprint mrecall msglevel msymtabmax mvarsize myy n nest netpv new news nmiss no nobatch nobs nocaps nocardimage nocenter nocharcode nocmdmac nocol nocum nodate nodbcs nodetails nodmr nodms nodmsbatch nodup nodupkey noduplicates noechoauto noequals noerrorabend noexitwindows nofullstimer noicon noimplmac noint nolist noloadlist nomiss nomlogic nomprint nomrecall nomsgcase nomstored nomultenvappl nonotes nonumber noobs noovp nopad nopercent noprint noprintinit normal norow norsasuser nosetinit  nosplash nosymbolgen note notes notitle notitles notsorted noverbose noxsync noxwait npv null number numkeys nummousekeys nway obs  on open     order ordinal otherwise out outer outp= output over ovp p(1 5 10 25 50 75 90 95 99) pad pad2  paired parm parmcards path pathdll pathname pdf peek peekc pfkey pmf point poisson poke position printer probbeta probbnml probchi probf probgam probhypr probit probnegb probnorm probsig probt procleave prt ps  pw pwreq qtr quote r ranbin rancau ranexp rangam range ranks rannor ranpoi rantbl rantri ranuni read recfm register regr remote remove rename repeat replace resolve retain return reuse reverse rewind right round rsquare rtf rtrace rtraceloc s s2 samploc sasautos sascontrol sasfrscr sasmsg sasmstore sasscript sasuser saving scan sdf second select selection separated seq serror set setcomm setot sign simple sin sinh siteinfo skewness skip sle sls sortedby sortpgm sortseq sortsize soundex  spedis splashlocation split spool sqrt start std stderr stdin stfips stimer stname stnamel stop stopover subgroup subpopn substr sum sumwgt symbol symbolgen symget symput sysget sysin sysleave sysmsg sysparm sysprint sysprintfont sysprod sysrc system t table tables tan tanh tapeclose tbufsize terminal test then timepart tinv  tnonct to today tol tooldef totper transformout translate trantab tranwrd trigamma trim trimn trunc truncover type unformatted uniform union until upcase update user usericon uss validate value var  weight when where while wincharset window work workinit workterm write wsum xsync xwait yearcutoff yes yyq  min max', ['inDataStep', 'inProc']);
    define('operator', 'and not ', ['inDataStep', 'inProc']);

    // Main function
    function tokenize(stream, state) {
      // Finally advance the stream
      var ch = stream.next();

      // BLOCKCOMMENT
      if (ch === '/' && stream.eat('*')) {
        state.continueComment = true;
        return "comment";
      } else if (state.continueComment === true) { // in comment block
        //comment ends at the beginning of the line
        if (ch === '*' && stream.peek() === '/') {
          stream.next();
          state.continueComment = false;
        } else if (stream.skipTo('*')) { //comment is potentially later in line
          stream.skipTo('*');
          stream.next();
          if (stream.eat('/'))
            state.continueComment = false;
        } else {
          stream.skipToEnd();
        }
        return "comment";
      }

      // DoubleOperator match
      var doubleOperator = ch + stream.peek();

      // Match all line comments.
      var myString = stream.string;
      var myRegexp = /(?:^\s*|[;]\s*)(\*.*?);/ig;
      var match = myRegexp.exec(myString);
      if (match !== null) {
        if (match.index === 0 && (stream.column() !== (match.index + match[0].length - 1))) {
          stream.backUp(stream.column());
          stream.skipTo(';');
          stream.next();
          return 'comment';
        } else if (match.index + 1 < stream.column() && stream.column() < match.index + match[0].length - 1) {
          // the ';' triggers the match so move one past it to start
          // the comment block that is why match.index+1
          stream.backUp(stream.column() - match.index - 1);
          stream.skipTo(';');
          stream.next();
          return 'comment';
        }
      } else if ((ch === '"' || ch === "'") && !state.continueString) {
        state.continueString = ch
        return "string"
      } else if (state.continueString) {
        if (state.continueString == ch) {
          state.continueString = null;
        } else if (stream.skipTo(state.continueString)) {
          // quote found on this line
          stream.next();
          state.continueString = null;
        } else {
          stream.skipToEnd();
        }
        return "string";
      } else if (state.continueString !== null && stream.eol()) {
        stream.skipTo(state.continueString) || stream.skipToEnd();
        return "string";
      } else if (/[\d\.]/.test(ch)) { //find numbers
        if (ch === ".")
          stream.match(/^[0-9]+([eE][\-+]?[0-9]+)?/);
        else if (ch === "0")
          stream.match(/^[xX][0-9a-fA-F]+/) || stream.match(/^0[0-7]+/);
        else
          stream.match(/^[0-9]*\.?[0-9]*([eE][\-+]?[0-9]+)?/);
        return "number";
      } else if (isDoubleOperatorChar.test(ch + stream.peek())) { // TWO SYMBOL TOKENS
        stream.next();
        return "operator";
      } else if (isDoubleOperatorSym.hasOwnProperty(doubleOperator)) {
        stream.next();
        if (stream.peek() === ' ')
          return isDoubleOperatorSym[doubleOperator.toLowerCase()];
      } else if (isSingleOperatorChar.test(ch)) { // SINGLE SYMBOL TOKENS
        return "operator";
      }

      // Matches one whole word -- even if the word is a character
      var word;
      if (stream.match(/[%&;\w]+/, false) != null) {
        word = ch + stream.match(/[%&;\w]+/, true);
        if (/&/.test(word)) return 'variable'
      } else {
        word = ch;
      }
      // the word after DATA PROC or MACRO
      if (state.nextword) {
        stream.match(/[\w]+/);
        // match memname.libname
        if (stream.peek() === '.') stream.skipTo(' ');
        state.nextword = false;
        return 'variable-2';
      }

      word = word.toLowerCase()
      // Are we in a DATA Step?
      if (state.inDataStep) {
        if (word === 'run;' || stream.match(/run\s;/)) {
          state.inDataStep = false;
          return 'builtin';
        }
        // variable formats
        if ((word) && stream.next() === '.') {
          //either a format or libname.memname
          if (/\w/.test(stream.peek())) return 'variable-2';
          else return 'variable';
        }
        // do we have a DATA Step keyword
        if (word && words.hasOwnProperty(word) &&
            (words[word].state.indexOf("inDataStep") !== -1 ||
             words[word].state.indexOf("ALL") !== -1)) {
          //backup to the start of the word
          if (stream.start < stream.pos)
            stream.backUp(stream.pos - stream.start);
          //advance the length of the word and return
          for (var i = 0; i < word.length; ++i) stream.next();
          return words[word].style;
        }
      }
      // Are we in an Proc statement?
      if (state.inProc) {
        if (word === 'run;' || word === 'quit;') {
          state.inProc = false;
          return 'builtin';
        }
        // do we have a proc keyword
        if (word && words.hasOwnProperty(word) &&
            (words[word].state.indexOf("inProc") !== -1 ||
             words[word].state.indexOf("ALL") !== -1)) {
          stream.match(/[\w]+/);
          return words[word].style;
        }
      }
      // Are we in a Macro statement?
      if (state.inMacro) {
        if (word === '%mend') {
          if (stream.peek() === ';') stream.next();
          state.inMacro = false;
          return 'builtin';
        }
        if (word && words.hasOwnProperty(word) &&
            (words[word].state.indexOf("inMacro") !== -1 ||
             words[word].state.indexOf("ALL") !== -1)) {
          stream.match(/[\w]+/);
          return words[word].style;
        }

        return 'atom';
      }
      // Do we have Keywords specific words?
      if (word && words.hasOwnProperty(word)) {
        // Negates the initial next()
        stream.backUp(1);
        // Actually move the stream
        stream.match(/[\w]+/);
        if (word === 'data' && /=/.test(stream.peek()) === false) {
          state.inDataStep = true;
          state.nextword = true;
          return 'builtin';
        }
        if (word === 'proc') {
          state.inProc = true;
          state.nextword = true;
          return 'builtin';
        }
        if (word === '%macro') {
          state.inMacro = true;
          state.nextword = true;
          return 'builtin';
        }
        if (/title[1-9]/.test(word)) return 'def';

        if (word === 'footnote') {
          stream.eat(/[1-9]/);
          return 'def';
        }

        // Returns their value as state in the prior define methods
        if (state.inDataStep === true && words[word].state.indexOf("inDataStep") !== -1)
          return words[word].style;
        if (state.inProc === true && words[word].state.indexOf("inProc") !== -1)
          return words[word].style;
        if (state.inMacro === true && words[word].state.indexOf("inMacro") !== -1)
          return words[word].style;
        if (words[word].state.indexOf("ALL") !== -1)
          return words[word].style;
        return null;
      }
      // Unrecognized syntax
      return null;
    }

    return {
      startState: function () {
        return {
          inDataStep: false,
          inProc: false,
          inMacro: false,
          nextword: false,
          continueString: null,
          continueComment: false
        };
      },
      token: function (stream, state) {
        // Strip the spaces, but regex will account for them either way
        if (stream.eatSpace()) return null;
        // Go through the main process
        return tokenize(stream, state);
      },

      blockCommentStart: "/*",
      blockCommentEnd: "*/"
    };

  });

  CodeMirror.defineMIME("text/x-sas", "sas");
});
codemirror/mode/sas/index.html000064400000003476151215013510012424 0ustar00<!doctype html>

<title>CodeMirror: SAS mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../xml/xml.js"></script>
<script src="sas.js"></script>
<style type="text/css">
  .CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}
  .cm-s-default .cm-trailing-space-a:before,
  .cm-s-default .cm-trailing-space-b:before {position: absolute; content: "\00B7"; color: #777;}
  .cm-s-default .cm-trailing-space-new-line:before {position: absolute; content: "\21B5"; color: #777;}
</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">SAS</a>
  </ul>
</div>

<article>
<h2>SAS mode</h2>
<form><textarea id="code" name="code">
libname foo "/tmp/foobar";
%let count=1;

/* Multi line
Comment
*/
data _null_;
    x=ranuni();
    * single comment;
    x2=x**2;
    sx=sqrt(x);
    if x=x2 then put "x must be 1";
    else do;
        put x=;
    end;
run;

/* embedded comment
* comment;
*/

proc glm data=sashelp.class;
    class sex;
    model weight = height sex;
run;

proc sql;
    select count(*)
    from sashelp.class;

    create table foo as
    select * from sashelp.class;

    select *
    from foo;
quit;
</textarea></form>

<script>
  var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
    mode: 'sas',
    lineNumbers: true
  });
</script>

<p><strong>MIME types defined:</strong> <code>text/x-sas</code>.</p>

</article>
codemirror/mode/spreadsheet/index.html000064400000002560151215013510014136 0ustar00<!doctype html>

<title>CodeMirror: Spreadsheet mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="spreadsheet.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Spreadsheet</a>
  </ul>
</div>

<article>
  <h2>Spreadsheet mode</h2>
  <form><textarea id="code" name="code">=IF(A1:B2, TRUE, FALSE) / 100</textarea></form>

  <script>
    var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
      lineNumbers: true,
      matchBrackets: true,
      extraKeys: {"Tab":  "indentAuto"}
    });
  </script>

  <p><strong>MIME types defined:</strong> <code>text/x-spreadsheet</code>.</p>
  
  <h3>The Spreadsheet Mode</h3>
  <p> Created by <a href="https://github.com/robertleeplummerjr">Robert Plummer</a></p>
</article>
codemirror/mode/spreadsheet/spreadsheet.js000064400000006103151215013510015003 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  CodeMirror.defineMode("spreadsheet", function () {
    return {
      startState: function () {
        return {
          stringType: null,
          stack: []
        };
      },
      token: function (stream, state) {
        if (!stream) return;

        //check for state changes
        if (state.stack.length === 0) {
          //strings
          if ((stream.peek() == '"') || (stream.peek() == "'")) {
            state.stringType = stream.peek();
            stream.next(); // Skip quote
            state.stack.unshift("string");
          }
        }

        //return state
        //stack has
        switch (state.stack[0]) {
        case "string":
          while (state.stack[0] === "string" && !stream.eol()) {
            if (stream.peek() === state.stringType) {
              stream.next(); // Skip quote
              state.stack.shift(); // Clear flag
            } else if (stream.peek() === "\\") {
              stream.next();
              stream.next();
            } else {
              stream.match(/^.[^\\\"\']*/);
            }
          }
          return "string";

        case "characterClass":
          while (state.stack[0] === "characterClass" && !stream.eol()) {
            if (!(stream.match(/^[^\]\\]+/) || stream.match(/^\\./)))
              state.stack.shift();
          }
          return "operator";
        }

        var peek = stream.peek();

        //no stack
        switch (peek) {
        case "[":
          stream.next();
          state.stack.unshift("characterClass");
          return "bracket";
        case ":":
          stream.next();
          return "operator";
        case "\\":
          if (stream.match(/\\[a-z]+/)) return "string-2";
          else {
            stream.next();
            return "atom";
          }
        case ".":
        case ",":
        case ";":
        case "*":
        case "-":
        case "+":
        case "^":
        case "<":
        case "/":
        case "=":
          stream.next();
          return "atom";
        case "$":
          stream.next();
          return "builtin";
        }

        if (stream.match(/\d+/)) {
          if (stream.match(/^\w+/)) return "error";
          return "number";
        } else if (stream.match(/^[a-zA-Z_]\w*/)) {
          if (stream.match(/(?=[\(.])/, false)) return "keyword";
          return "variable-2";
        } else if (["[", "]", "(", ")", "{", "}"].indexOf(peek) != -1) {
          stream.next();
          return "bracket";
        } else if (!stream.eatSpace()) {
          stream.next();
        }
        return null;
      }
    };
  });

  CodeMirror.defineMIME("text/x-spreadsheet", "spreadsheet");
});
codemirror/mode/nsis/nsis.js000064400000016720151215013510012123 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

// Author: Jan T. Sott (http://github.com/idleberg)

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"), require("../../addon/mode/simple"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror", "../../addon/mode/simple"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineSimpleMode("nsis",{
  start:[
    // Numbers
    {regex: /(?:[+-]?)(?:0x[\d,a-f]+)|(?:0o[0-7]+)|(?:0b[0,1]+)|(?:\d+.?\d*)/, token: "number"},

    // Strings
    { regex: /"(?:[^\\"]|\\.)*"?/, token: "string" },
    { regex: /'(?:[^\\']|\\.)*'?/, token: "string" },
    { regex: /`(?:[^\\`]|\\.)*`?/, token: "string" },

    // Compile Time Commands
    {regex: /(?:\!(include|addincludedir|addplugindir|appendfile|cd|delfile|echo|error|execute|packhdr|finalize|getdllversion|system|tempfile|warning|verbose|define|undef|insertmacro|makensis|searchparse|searchreplace))\b/, token: "keyword"},

    // Conditional Compilation
    {regex: /(?:\!(if(?:n?def)?|ifmacron?def|macro))\b/, token: "keyword", indent: true},
    {regex: /(?:\!(else|endif|macroend))\b/, token: "keyword", dedent: true},

    // Runtime Commands
    {regex: /\b(?:Abort|AddBrandingImage|AddSize|AllowRootDirInstall|AllowSkipFiles|AutoCloseWindow|BGFont|BGGradient|BrandingText|BringToFront|Call|CallInstDLL|Caption|ChangeUI|CheckBitmap|ClearErrors|CompletedText|ComponentText|CopyFiles|CRCCheck|CreateDirectory|CreateFont|CreateShortCut|Delete|DeleteINISec|DeleteINIStr|DeleteRegKey|DeleteRegValue|DetailPrint|DetailsButtonText|DirText|DirVar|DirVerify|EnableWindow|EnumRegKey|EnumRegValue|Exch|Exec|ExecShell|ExecWait|ExpandEnvStrings|File|FileBufSize|FileClose|FileErrorText|FileOpen|FileRead|FileReadByte|FileReadUTF16LE|FileReadWord|FileWriteUTF16LE|FileSeek|FileWrite|FileWriteByte|FileWriteWord|FindClose|FindFirst|FindNext|FindWindow|FlushINI|GetCurInstType|GetCurrentAddress|GetDlgItem|GetDLLVersion|GetDLLVersionLocal|GetErrorLevel|GetFileTime|GetFileTimeLocal|GetFullPathName|GetFunctionAddress|GetInstDirError|GetLabelAddress|GetTempFileName|Goto|HideWindow|Icon|IfAbort|IfErrors|IfFileExists|IfRebootFlag|IfSilent|InitPluginsDir|InstallButtonText|InstallColors|InstallDir|InstallDirRegKey|InstProgressFlags|InstType|InstTypeGetText|InstTypeSetText|IntCmp|IntCmpU|IntFmt|IntOp|IsWindow|LangString|LicenseBkColor|LicenseData|LicenseForceSelection|LicenseLangString|LicenseText|LoadLanguageFile|LockWindow|LogSet|LogText|ManifestDPIAware|ManifestSupportedOS|MessageBox|MiscButtonText|Name|Nop|OutFile|Page|PageCallbacks|Pop|Push|Quit|ReadEnvStr|ReadINIStr|ReadRegDWORD|ReadRegStr|Reboot|RegDLL|Rename|RequestExecutionLevel|ReserveFile|Return|RMDir|SearchPath|SectionGetFlags|SectionGetInstTypes|SectionGetSize|SectionGetText|SectionIn|SectionSetFlags|SectionSetInstTypes|SectionSetSize|SectionSetText|SendMessage|SetAutoClose|SetBrandingImage|SetCompress|SetCompressor|SetCompressorDictSize|SetCtlColors|SetCurInstType|SetDatablockOptimize|SetDateSave|SetDetailsPrint|SetDetailsView|SetErrorLevel|SetErrors|SetFileAttributes|SetFont|SetOutPath|SetOverwrite|SetPluginUnload|SetRebootFlag|SetRegView|SetShellVarContext|SetSilent|ShowInstDetails|ShowUninstDetails|ShowWindow|SilentInstall|SilentUnInstall|Sleep|SpaceTexts|StrCmp|StrCmpS|StrCpy|StrLen|SubCaption|Unicode|UninstallButtonText|UninstallCaption|UninstallIcon|UninstallSubCaption|UninstallText|UninstPage|UnRegDLL|Var|VIAddVersionKey|VIFileVersion|VIProductVersion|WindowIcon|WriteINIStr|WriteRegBin|WriteRegDWORD|WriteRegExpandStr|WriteRegStr|WriteUninstaller|XPStyle)\b/, token: "keyword"},
    {regex: /\b(?:Function|PageEx|Section(?:Group)?)\b/, token: "keyword", indent: true},
    {regex: /\b(?:(Function|PageEx|Section(?:Group)?)End)\b/, token: "keyword", dedent: true},

    // Command Options
    {regex: /\b(?:ARCHIVE|FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_OFFLINE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_TEMPORARY|HIDDEN|HKCC|HKCR|HKCU|HKDD|HKEY_CLASSES_ROOT|HKEY_CURRENT_CONFIG|HKEY_CURRENT_USER|HKEY_DYN_DATA|HKEY_LOCAL_MACHINE|HKEY_PERFORMANCE_DATA|HKEY_USERS|HKLM|HKPD|HKU|IDABORT|IDCANCEL|IDD_DIR|IDD_INST|IDD_INSTFILES|IDD_LICENSE|IDD_SELCOM|IDD_UNINST|IDD_VERIFY|IDIGNORE|IDNO|IDOK|IDRETRY|IDYES|MB_ABORTRETRYIGNORE|MB_DEFBUTTON1|MB_DEFBUTTON2|MB_DEFBUTTON3|MB_DEFBUTTON4|MB_ICONEXCLAMATION|MB_ICONINFORMATION|MB_ICONQUESTION|MB_ICONSTOP|MB_OK|MB_OKCANCEL|MB_RETRYCANCEL|MB_RIGHT|MB_RTLREADING|MB_SETFOREGROUND|MB_TOPMOST|MB_USERICON|MB_YESNO|MB_YESNOCANCEL|NORMAL|OFFLINE|READONLY|SHCTX|SHELL_CONTEXT|SW_HIDE|SW_SHOWDEFAULT|SW_SHOWMAXIMIZED|SW_SHOWMINIMIZED|SW_SHOWNORMAL|SYSTEM|TEMPORARY)\b/, token: "atom"},
    {regex: /\b(?:admin|all|auto|both|bottom|bzip2|components|current|custom|directory|force|hide|highest|ifdiff|ifnewer|instfiles|lastused|leave|left|license|listonly|lzma|nevershow|none|normal|notset|right|show|silent|silentlog|textonly|top|try|un\.components|un\.custom|un\.directory|un\.instfiles|un\.license|uninstConfirm|user|Win10|Win7|Win8|WinVista|zlib)\b/, token: "builtin"},

    // LogicLib.nsh
    {regex: /\$\{(?:And(?:If(?:Not)?|Unless)|Break|Case(?:Else)?|Continue|Default|Do(?:Until|While)?|Else(?:If(?:Not)?|Unless)?|End(?:If|Select|Switch)|Exit(?:Do|For|While)|For(?:Each)?|If(?:Cmd|Not(?:Then)?|Then)?|Loop(?:Until|While)?|Or(?:If(?:Not)?|Unless)|Select|Switch|Unless|While)\}/, token: "variable-2", indent: true},

    // FileFunc.nsh
    {regex: /\$\{(?:BannerTrimPath|DirState|DriveSpace|Get(BaseName|Drives|ExeName|ExePath|FileAttributes|FileExt|FileName|FileVersion|Options|OptionsS|Parameters|Parent|Root|Size|Time)|Locate|RefreshShellIcons)\}/, token: "variable-2", dedent: true},

    // Memento.nsh
    {regex: /\$\{(?:Memento(?:Section(?:Done|End|Restore|Save)?|UnselectedSection))\}/, token: "variable-2", dedent: true},

    // TextFunc.nsh
    {regex: /\$\{(?:Config(?:Read|ReadS|Write|WriteS)|File(?:Join|ReadFromEnd|Recode)|Line(?:Find|Read|Sum)|Text(?:Compare|CompareS)|TrimNewLines)\}/, token: "variable-2", dedent: true},

    // WinVer.nsh
    {regex: /\$\{(?:(?:At(?:Least|Most)|Is)(?:ServicePack|Win(?:7|8|10|95|98|200(?:0|3|8(?:R2)?)|ME|NT4|Vista|XP))|Is(?:NT|Server))\}/, token: "variable", dedent: true},

    // WordFunc.nsh
    {regex: /\$\{(?:StrFilterS?|Version(?:Compare|Convert)|Word(?:AddS?|Find(?:(?:2|3)X)?S?|InsertS?|ReplaceS?))\}/, token: "variable-2", dedent: true},

    // x64.nsh
    {regex: /\$\{(?:RunningX64)\}/, token: "variable", dedent: true},
    {regex: /\$\{(?:Disable|Enable)X64FSRedirection\}/, token: "variable-2", dedent: true},

    // Line Comment
    {regex: /(#|;).*/, token: "comment"},

    // Block Comment
    {regex: /\/\*/, token: "comment", next: "comment"},

    // Operator
    {regex: /[-+\/*=<>!]+/, token: "operator"},

    // Variable
    {regex: /\$[\w]+/, token: "variable"},

    // Constant
    {regex: /\${[\w]+}/,token: "variable-2"},

    // Language String
    {regex: /\$\([\w]+\)/,token: "variable-3"}
  ],
  comment: [
    {regex: /.*?\*\//, token: "comment", next: "start"},
    {regex: /.*/, token: "comment"}
  ],
  meta: {
    electricInput: /^\s*((Function|PageEx|Section|Section(Group)?)End|(\!(endif|macroend))|\$\{(End(If|Unless|While)|Loop(Until)|Next)\})$/,
    blockCommentStart: "/*",
    blockCommentEnd: "*/",
    lineComment: ["#", ";"]
  }
});

CodeMirror.defineMIME("text/x-nsis", "nsis");
});
codemirror/mode/nsis/index.html000064400000003344151215013510012604 0ustar00<!doctype html>

<title>CodeMirror: NSIS mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel=stylesheet href=../../lib/codemirror.css>
<script src=../../lib/codemirror.js></script>
<script src="../../addon/mode/simple.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src=nsis.js></script>
<style type=text/css>
  .CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}
</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">NSIS</a>
  </ul>
</div>

<article>
<h2>NSIS mode</h2>


<textarea id=code>
; This is a comment
!ifdef ERROR
    !error "Something went wrong"
!endif

OutFile "demo.exe"
RequestExecutionLevel user
SetDetailsPrint listonly

!include "LogicLib.nsh"
!include "WinVer.nsh"

Section -mandatory

    Call logWinVer

    ${If} 1 > 0
      MessageBox MB_OK "Hello world"
    ${EndIf}

SectionEnd

Function logWinVer

    ${If} ${IsWin10}
        DetailPrint "Windows 10!"
    ${ElseIf} ${AtLeastWinVista}
        DetailPrint "We're post-XP"
    ${Else}
        DetailPrint "Legacy system"
    ${EndIf}

FunctionEnd
</textarea>

<script>
  var editor = CodeMirror.fromTextArea(document.getElementById('code'), {
    mode: 'nsis',
    indentWithTabs: true,
    smartIndent: true,
    lineNumbers: true,
    matchBrackets: true
  });
</script>

<p><strong>MIME types defined:</strong> <code>text/x-nsis</code>.</p>
</article>codemirror/mode/asn.1/asn.1.js000064400000017067151215013510012040 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  CodeMirror.defineMode("asn.1", function(config, parserConfig) {
    var indentUnit = config.indentUnit,
        keywords = parserConfig.keywords || {},
        cmipVerbs = parserConfig.cmipVerbs || {},
        compareTypes = parserConfig.compareTypes || {},
        status = parserConfig.status || {},
        tags = parserConfig.tags || {},
        storage = parserConfig.storage || {},
        modifier = parserConfig.modifier || {},
        accessTypes = parserConfig.accessTypes|| {},
        multiLineStrings = parserConfig.multiLineStrings,
        indentStatements = parserConfig.indentStatements !== false;
    var isOperatorChar = /[\|\^]/;
    var curPunc;

    function tokenBase(stream, state) {
      var ch = stream.next();
      if (ch == '"' || ch == "'") {
        state.tokenize = tokenString(ch);
        return state.tokenize(stream, state);
      }
      if (/[\[\]\(\){}:=,;]/.test(ch)) {
        curPunc = ch;
        return "punctuation";
      }
      if (ch == "-"){
        if (stream.eat("-")) {
          stream.skipToEnd();
          return "comment";
        }
      }
      if (/\d/.test(ch)) {
        stream.eatWhile(/[\w\.]/);
        return "number";
      }
      if (isOperatorChar.test(ch)) {
        stream.eatWhile(isOperatorChar);
        return "operator";
      }

      stream.eatWhile(/[\w\-]/);
      var cur = stream.current();
      if (keywords.propertyIsEnumerable(cur)) return "keyword";
      if (cmipVerbs.propertyIsEnumerable(cur)) return "variable cmipVerbs";
      if (compareTypes.propertyIsEnumerable(cur)) return "atom compareTypes";
      if (status.propertyIsEnumerable(cur)) return "comment status";
      if (tags.propertyIsEnumerable(cur)) return "variable-3 tags";
      if (storage.propertyIsEnumerable(cur)) return "builtin storage";
      if (modifier.propertyIsEnumerable(cur)) return "string-2 modifier";
      if (accessTypes.propertyIsEnumerable(cur)) return "atom accessTypes";

      return "variable";
    }

    function tokenString(quote) {
      return function(stream, state) {
        var escaped = false, next, end = false;
        while ((next = stream.next()) != null) {
          if (next == quote && !escaped){
            var afterNext = stream.peek();
            //look if the character if the quote is like the B in '10100010'B
            if (afterNext){
              afterNext = afterNext.toLowerCase();
              if(afterNext == "b" || afterNext == "h" || afterNext == "o")
                stream.next();
            }
            end = true; break;
          }
          escaped = !escaped && next == "\\";
        }
        if (end || !(escaped || multiLineStrings))
          state.tokenize = null;
        return "string";
      };
    }

    function Context(indented, column, type, align, prev) {
      this.indented = indented;
      this.column = column;
      this.type = type;
      this.align = align;
      this.prev = prev;
    }
    function pushContext(state, col, type) {
      var indent = state.indented;
      if (state.context && state.context.type == "statement")
        indent = state.context.indented;
      return state.context = new Context(indent, col, type, null, state.context);
    }
    function popContext(state) {
      var t = state.context.type;
      if (t == ")" || t == "]" || t == "}")
        state.indented = state.context.indented;
      return state.context = state.context.prev;
    }

    //Interface
    return {
      startState: function(basecolumn) {
        return {
          tokenize: null,
          context: new Context((basecolumn || 0) - indentUnit, 0, "top", false),
          indented: 0,
          startOfLine: true
        };
      },

      token: function(stream, state) {
        var ctx = state.context;
        if (stream.sol()) {
          if (ctx.align == null) ctx.align = false;
          state.indented = stream.indentation();
          state.startOfLine = true;
        }
        if (stream.eatSpace()) return null;
        curPunc = null;
        var style = (state.tokenize || tokenBase)(stream, state);
        if (style == "comment") return style;
        if (ctx.align == null) ctx.align = true;

        if ((curPunc == ";" || curPunc == ":" || curPunc == ",")
            && ctx.type == "statement"){
          popContext(state);
        }
        else if (curPunc == "{") pushContext(state, stream.column(), "}");
        else if (curPunc == "[") pushContext(state, stream.column(), "]");
        else if (curPunc == "(") pushContext(state, stream.column(), ")");
        else if (curPunc == "}") {
          while (ctx.type == "statement") ctx = popContext(state);
          if (ctx.type == "}") ctx = popContext(state);
          while (ctx.type == "statement") ctx = popContext(state);
        }
        else if (curPunc == ctx.type) popContext(state);
        else if (indentStatements && (((ctx.type == "}" || ctx.type == "top")
            && curPunc != ';') || (ctx.type == "statement"
            && curPunc == "newstatement")))
          pushContext(state, stream.column(), "statement");

        state.startOfLine = false;
        return style;
      },

      electricChars: "{}",
      lineComment: "--",
      fold: "brace"
    };
  });

  function words(str) {
    var obj = {}, words = str.split(" ");
    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
    return obj;
  }

  CodeMirror.defineMIME("text/x-ttcn-asn", {
    name: "asn.1",
    keywords: words("DEFINITIONS OBJECTS IF DERIVED INFORMATION ACTION" +
    " REPLY ANY NAMED CHARACTERIZED BEHAVIOUR REGISTERED" +
    " WITH AS IDENTIFIED CONSTRAINED BY PRESENT BEGIN" +
    " IMPORTS FROM UNITS SYNTAX MIN-ACCESS MAX-ACCESS" +
    " MINACCESS MAXACCESS REVISION STATUS DESCRIPTION" +
    " SEQUENCE SET COMPONENTS OF CHOICE DistinguishedName" +
    " ENUMERATED SIZE MODULE END INDEX AUGMENTS EXTENSIBILITY" +
    " IMPLIED EXPORTS"),
    cmipVerbs: words("ACTIONS ADD GET NOTIFICATIONS REPLACE REMOVE"),
    compareTypes: words("OPTIONAL DEFAULT MANAGED MODULE-TYPE MODULE_IDENTITY" +
    " MODULE-COMPLIANCE OBJECT-TYPE OBJECT-IDENTITY" +
    " OBJECT-COMPLIANCE MODE CONFIRMED CONDITIONAL" +
    " SUBORDINATE SUPERIOR CLASS TRUE FALSE NULL" +
    " TEXTUAL-CONVENTION"),
    status: words("current deprecated mandatory obsolete"),
    tags: words("APPLICATION AUTOMATIC EXPLICIT IMPLICIT PRIVATE TAGS" +
    " UNIVERSAL"),
    storage: words("BOOLEAN INTEGER OBJECT IDENTIFIER BIT OCTET STRING" +
    " UTCTime InterfaceIndex IANAifType CMIP-Attribute" +
    " REAL PACKAGE PACKAGES IpAddress PhysAddress" +
    " NetworkAddress BITS BMPString TimeStamp TimeTicks" +
    " TruthValue RowStatus DisplayString GeneralString" +
    " GraphicString IA5String NumericString" +
    " PrintableString SnmpAdminAtring TeletexString" +
    " UTF8String VideotexString VisibleString StringStore" +
    " ISO646String T61String UniversalString Unsigned32" +
    " Integer32 Gauge Gauge32 Counter Counter32 Counter64"),
    modifier: words("ATTRIBUTE ATTRIBUTES MANDATORY-GROUP MANDATORY-GROUPS" +
    " GROUP GROUPS ELEMENTS EQUALITY ORDERING SUBSTRINGS" +
    " DEFINED"),
    accessTypes: words("not-accessible accessible-for-notify read-only" +
    " read-create read-write"),
    multiLineStrings: true
  });
});
codemirror/mode/asn.1/index.html000064400000004256151215013510012553 0ustar00<!doctype html>

<title>CodeMirror: ASN.1 mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="asn.1.js"></script>
<style type="text/css">
    .CodeMirror {
        border-top: 1px solid black;
        border-bottom: 1px solid black;
    }
</style>
<div id=nav>
    <a href="http://codemirror.net"><h1>CodeMirror</h1>
        <img id=logo src="../../doc/logo.png">
    </a>

    <ul>
        <li><a href="../../index.html">Home</a>
        <li><a href="../../doc/manual.html">Manual</a>
        <li><a href="https://github.com/codemirror/codemirror">Code</a>
    </ul>
    <ul>
        <li><a href="../index.html">Language modes</a>
        <li><a class=active href="http://en.wikipedia.org/wiki/Abstract_Syntax_Notation_One">ASN.1</a>
    </ul>
</div>
<article>
    <h2>ASN.1 example</h2>
    <div>
        <textarea id="ttcn-asn-code">
 --
 -- Sample ASN.1 Code
 --
 MyModule DEFINITIONS ::=
 BEGIN

 MyTypes ::= SEQUENCE {
     myObjectId   OBJECT IDENTIFIER,
     mySeqOf      SEQUENCE OF MyInt,
     myBitString  BIT STRING {
                         muxToken(0),
                         modemToken(1)
                  }
 }

 MyInt ::= INTEGER (0..65535)

 END
        </textarea>
    </div>

    <script>
        var ttcnEditor = CodeMirror.fromTextArea(document.getElementById("ttcn-asn-code"), {
            lineNumbers: true,
            matchBrackets: true,
            mode: "text/x-ttcn-asn"
        });
        ttcnEditor.setSize(400, 400);
        var mac = CodeMirror.keyMap.default == CodeMirror.keyMap.macDefault;
        CodeMirror.keyMap.default[(mac ? "Cmd" : "Ctrl") + "-Space"] = "autocomplete";
    </script>
    <br/>
    <p><strong>Language:</strong> Abstract Syntax Notation One
        (<a href="http://www.itu.int/en/ITU-T/asn1/Pages/introduction.aspx">ASN.1</a>)
    </p>
    <p><strong>MIME types defined:</strong> <code>text/x-ttcn-asn</code></p>

    <br/>
    <p>The development of this mode has been sponsored by <a href="http://www.ericsson.com/">Ericsson
    </a>.</p>
    <p>Coded by Asmelash Tsegay Gebretsadkan </p>
</article>

codemirror/mode/gherkin/index.html000064400000003036151215013510013255 0ustar00<!doctype html>

<title>CodeMirror: Gherkin mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="gherkin.js"></script>
<style>.CodeMirror { border-top: 1px solid #ddd; border-bottom: 1px solid #ddd; }</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Gherkin</a>
  </ul>
</div>

<article>
<h2>Gherkin mode</h2>
<form><textarea id="code" name="code">
Feature: Using Google
  Background: 
    Something something
    Something else
  Scenario: Has a homepage
    When I navigate to the google home page
    Then the home page should contain the menu and the search form
  Scenario: Searching for a term 
    When I navigate to the google home page
    When I search for Tofu
    Then the search results page is displayed
    Then the search results page contains 10 individual search results
    Then the search results contain a link to the wikipedia tofu page
</textarea></form>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {});
    </script>

    <p><strong>MIME types defined:</strong> <code>text/x-feature</code>.</p>

  </article>
codemirror/mode/gherkin/gherkin.js000064400000031711151215013510013246 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

/*
Gherkin mode - http://www.cukes.info/
Report bugs/issues here: https://github.com/codemirror/CodeMirror/issues
*/

// Following Objs from Brackets implementation: https://github.com/tregusti/brackets-gherkin/blob/master/main.js
//var Quotes = {
//  SINGLE: 1,
//  DOUBLE: 2
//};

//var regex = {
//  keywords: /(Feature| {2}(Scenario|In order to|As|I)| {4}(Given|When|Then|And))/
//};

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("gherkin", function () {
  return {
    startState: function () {
      return {
        lineNumber: 0,
        tableHeaderLine: false,
        allowFeature: true,
        allowBackground: false,
        allowScenario: false,
        allowSteps: false,
        allowPlaceholders: false,
        allowMultilineArgument: false,
        inMultilineString: false,
        inMultilineTable: false,
        inKeywordLine: false
      };
    },
    token: function (stream, state) {
      if (stream.sol()) {
        state.lineNumber++;
        state.inKeywordLine = false;
        if (state.inMultilineTable) {
            state.tableHeaderLine = false;
            if (!stream.match(/\s*\|/, false)) {
              state.allowMultilineArgument = false;
              state.inMultilineTable = false;
            }
        }
      }

      stream.eatSpace();

      if (state.allowMultilineArgument) {

        // STRING
        if (state.inMultilineString) {
          if (stream.match('"""')) {
            state.inMultilineString = false;
            state.allowMultilineArgument = false;
          } else {
            stream.match(/.*/);
          }
          return "string";
        }

        // TABLE
        if (state.inMultilineTable) {
          if (stream.match(/\|\s*/)) {
            return "bracket";
          } else {
            stream.match(/[^\|]*/);
            return state.tableHeaderLine ? "header" : "string";
          }
        }

        // DETECT START
        if (stream.match('"""')) {
          // String
          state.inMultilineString = true;
          return "string";
        } else if (stream.match("|")) {
          // Table
          state.inMultilineTable = true;
          state.tableHeaderLine = true;
          return "bracket";
        }

      }

      // LINE COMMENT
      if (stream.match(/#.*/)) {
        return "comment";

      // TAG
      } else if (!state.inKeywordLine && stream.match(/@\S+/)) {
        return "tag";

      // FEATURE
      } else if (!state.inKeywordLine && state.allowFeature && stream.match(/(機能|功能|フィーチャ|기능|โครงหลัก|ความสามารถ|ความต้องการทางธุรกิจ|ಹೆಚ್ಚಳ|గుణము|ਮੁਹਾਂਦਰਾ|ਨਕਸ਼ ਨੁਹਾਰ|ਖਾਸੀਅਤ|रूप लेख|وِیژگی|خاصية|תכונה|Функціонал|Функция|Функционалност|Функционал|Үзенчәлеклелек|Свойство|Особина|Мөмкинлек|Могућност|Λειτουργία|Δυνατότητα|Właściwość|Vlastnosť|Trajto|Tính năng|Savybė|Pretty much|Požiadavka|Požadavek|Potrzeba biznesowa|Özellik|Osobina|Ominaisuus|Omadus|OH HAI|Mogućnost|Mogucnost|Jellemző|Hwæt|Hwaet|Funzionalità|Funktionalitéit|Funktionalität|Funkcja|Funkcionalnost|Funkcionalitāte|Funkcia|Fungsi|Functionaliteit|Funcționalitate|Funcţionalitate|Functionalitate|Funcionalitat|Funcionalidade|Fonctionnalité|Fitur|Fīča|Feature|Eiginleiki|Egenskap|Egenskab|Característica|Caracteristica|Business Need|Aspekt|Arwedd|Ahoy matey!|Ability):/)) {
        state.allowScenario = true;
        state.allowBackground = true;
        state.allowPlaceholders = false;
        state.allowSteps = false;
        state.allowMultilineArgument = false;
        state.inKeywordLine = true;
        return "keyword";

      // BACKGROUND
      } else if (!state.inKeywordLine && state.allowBackground && stream.match(/(背景|배경|แนวคิด|ಹಿನ್ನೆಲೆ|నేపథ్యం|ਪਿਛੋਕੜ|पृष्ठभूमि|زمینه|الخلفية|רקע|Тарих|Предыстория|Предистория|Позадина|Передумова|Основа|Контекст|Кереш|Υπόβαθρο|Założenia|Yo\-ho\-ho|Tausta|Taust|Situācija|Rerefons|Pozadina|Pozadie|Pozadí|Osnova|Latar Belakang|Kontext|Konteksts|Kontekstas|Kontekst|Háttér|Hannergrond|Grundlage|Geçmiş|Fundo|Fono|First off|Dis is what went down|Dasar|Contexto|Contexte|Context|Contesto|Cenário de Fundo|Cenario de Fundo|Cefndir|Bối cảnh|Bakgrunnur|Bakgrunn|Bakgrund|Baggrund|Background|B4|Antecedents|Antecedentes|Ær|Aer|Achtergrond):/)) {
        state.allowPlaceholders = false;
        state.allowSteps = true;
        state.allowBackground = false;
        state.allowMultilineArgument = false;
        state.inKeywordLine = true;
        return "keyword";

      // SCENARIO OUTLINE
      } else if (!state.inKeywordLine && state.allowScenario && stream.match(/(場景大綱|场景大纲|劇本大綱|剧本大纲|テンプレ|シナリオテンプレート|シナリオテンプレ|シナリオアウトライン|시나리오 개요|สรุปเหตุการณ์|โครงสร้างของเหตุการณ์|ವಿವರಣೆ|కథనం|ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ|ਪਟਕਥਾ ਢਾਂਚਾ|परिदृश्य रूपरेखा|سيناريو مخطط|الگوی سناریو|תבנית תרחיש|Сценарийның төзелеше|Сценарий структураси|Структура сценарію|Структура сценария|Структура сценарија|Скица|Рамка на сценарий|Концепт|Περιγραφή Σεναρίου|Wharrimean is|Template Situai|Template Senario|Template Keadaan|Tapausaihio|Szenariogrundriss|Szablon scenariusza|Swa hwær swa|Swa hwaer swa|Struktura scenarija|Structură scenariu|Structura scenariu|Skica|Skenario konsep|Shiver me timbers|Senaryo taslağı|Schema dello scenario|Scenariomall|Scenariomal|Scenario Template|Scenario Outline|Scenario Amlinellol|Scenārijs pēc parauga|Scenarijaus šablonas|Reckon it's like|Raamstsenaarium|Plang vum Szenario|Plan du Scénario|Plan du scénario|Osnova scénáře|Osnova Scenára|Náčrt Scenáru|Náčrt Scénáře|Náčrt Scenára|MISHUN SRSLY|Menggariskan Senario|Lýsing Dæma|Lýsing Atburðarásar|Konturo de la scenaro|Koncept|Khung tình huống|Khung kịch bản|Forgatókönyv vázlat|Esquema do Cenário|Esquema do Cenario|Esquema del escenario|Esquema de l'escenari|Esbozo do escenario|Delineação do Cenário|Delineacao do Cenario|All y'all|Abstrakt Scenario|Abstract Scenario):/)) {
        state.allowPlaceholders = true;
        state.allowSteps = true;
        state.allowMultilineArgument = false;
        state.inKeywordLine = true;
        return "keyword";

      // EXAMPLES
      } else if (state.allowScenario && stream.match(/(例子|例|サンプル|예|ชุดของเหตุการณ์|ชุดของตัวอย่าง|ಉದಾಹರಣೆಗಳು|ఉదాహరణలు|ਉਦਾਹਰਨਾਂ|उदाहरण|نمونه ها|امثلة|דוגמאות|Үрнәкләр|Сценарији|Примеры|Примери|Приклади|Мисоллар|Мисаллар|Σενάρια|Παραδείγματα|You'll wanna|Voorbeelden|Variantai|Tapaukset|Se þe|Se the|Se ðe|Scenarios|Scenariji|Scenarijai|Przykłady|Primjeri|Primeri|Příklady|Príklady|Piemēri|Példák|Pavyzdžiai|Paraugs|Örnekler|Juhtumid|Exemplos|Exemples|Exemple|Exempel|EXAMPLZ|Examples|Esempi|Enghreifftiau|Ekzemploj|Eksempler|Ejemplos|Dữ liệu|Dead men tell no tales|Dæmi|Contoh|Cenários|Cenarios|Beispiller|Beispiele|Atburðarásir):/)) {
        state.allowPlaceholders = false;
        state.allowSteps = true;
        state.allowBackground = false;
        state.allowMultilineArgument = true;
        return "keyword";

      // SCENARIO
      } else if (!state.inKeywordLine && state.allowScenario && stream.match(/(場景|场景|劇本|剧本|シナリオ|시나리오|เหตุการณ์|ಕಥಾಸಾರಾಂಶ|సన్నివేశం|ਪਟਕਥਾ|परिदृश्य|سيناريو|سناریو|תרחיש|Сценарій|Сценарио|Сценарий|Пример|Σενάριο|Tình huống|The thing of it is|Tapaus|Szenario|Swa|Stsenaarium|Skenario|Situai|Senaryo|Senario|Scenaro|Scenariusz|Scenariu|Scénario|Scenario|Scenarijus|Scenārijs|Scenarij|Scenarie|Scénář|Scenár|Primer|MISHUN|Kịch bản|Keadaan|Heave to|Forgatókönyv|Escenario|Escenari|Cenário|Cenario|Awww, look mate|Atburðarás):/)) {
        state.allowPlaceholders = false;
        state.allowSteps = true;
        state.allowBackground = false;
        state.allowMultilineArgument = false;
        state.inKeywordLine = true;
        return "keyword";

      // STEPS
      } else if (!state.inKeywordLine && state.allowSteps && stream.match(/(那麼|那么|而且|當|当|并且|同時|同时|前提|假设|假設|假定|假如|但是|但し|並且|もし|ならば|ただし|しかし|かつ|하지만|조건|먼저|만일|만약|단|그리고|그러면|และ |เมื่อ |แต่ |ดังนั้น |กำหนดให้ |ಸ್ಥಿತಿಯನ್ನು |ಮತ್ತು |ನೀಡಿದ |ನಂತರ |ಆದರೆ |మరియు |చెప్పబడినది |కాని |ఈ పరిస్థితిలో |అప్పుడు |ਪਰ |ਤਦ |ਜੇਕਰ |ਜਿਵੇਂ ਕਿ |ਜਦੋਂ |ਅਤੇ |यदि |परन्तु |पर |तब |तदा |तथा |जब |चूंकि |किन्तु |कदा |और |अगर |و |هنگامی |متى |لكن |عندما |ثم |بفرض |با فرض |اما |اذاً |آنگاه |כאשר |וגם |בהינתן |אזי |אז |אבל |Якщо |Һәм |Унда |Тоді |Тогда |То |Также |Та |Пусть |Припустимо, що |Припустимо |Онда |Но |Нехай |Нәтиҗәдә |Лекин |Ләкин |Коли |Когда |Когато |Када |Кад |К тому же |І |И |Задато |Задати |Задате |Если |Допустим |Дано |Дадено |Вә |Ва |Бирок |Әмма |Әйтик |Әгәр |Аммо |Али |Але |Агар |А також |А |Τότε |Όταν |Και |Δεδομένου |Αλλά |Þurh |Þegar |Þa þe |Þá |Þa |Zatati |Zakładając |Zadato |Zadate |Zadano |Zadani |Zadan |Za předpokladu |Za predpokladu |Youse know when youse got |Youse know like when |Yna |Yeah nah |Y'know |Y |Wun |Wtedy |When y'all |When |Wenn |WEN |wann |Ve |Và |Und |Un |ugeholl |Too right |Thurh |Thì |Then y'all |Then |Tha the |Tha |Tetapi |Tapi |Tak |Tada |Tad |Stel |Soit |Siis |Și |Şi |Si |Sed |Se |Så |Quando |Quand |Quan |Pryd |Potom |Pokud |Pokiaľ |Però |Pero |Pak |Oraz |Onda |Ond |Oletetaan |Og |Och |O zaman |Niin |Nhưng |När |Når |Mutta |Men |Mas |Maka |Majd |Mając |Mais |Maar |mä |Ma |Lorsque |Lorsqu'|Logo |Let go and haul |Kun |Kuid |Kui |Kiedy |Khi |Ketika |Kemudian |Keď |Když |Kaj |Kai |Kada |Kad |Jeżeli |Jeśli |Ja |It's just unbelievable |Ir |I CAN HAZ |I |Ha |Givun |Givet |Given y'all |Given |Gitt |Gegeven |Gegeben seien |Gegeben sei |Gdy |Gangway! |Fakat |Étant donnés |Etant donnés |Étant données |Etant données |Étant donnée |Etant donnée |Étant donné |Etant donné |Et |És |Entonces |Entón |Então |Entao |En |Eğer ki |Ef |Eeldades |E |Ðurh |Duota |Dun |Donitaĵo |Donat |Donada |Do |Diyelim ki |Diberi |Dengan |Den youse gotta |DEN |De |Dato |Dați fiind |Daţi fiind |Dati fiind |Dati |Date fiind |Date |Data |Dat fiind |Dar |Dann |dann |Dan |Dados |Dado |Dadas |Dada |Ða ðe |Ða |Cuando |Cho |Cando |Când |Cand |Cal |But y'all |But at the end of the day I reckon |BUT |But |Buh |Blimey! |Biết |Bet |Bagi |Aye |awer |Avast! |Atunci |Atesa |Atès |Apabila |Anrhegedig a |Angenommen |And y'all |And |AN |An |an |Amikor |Amennyiben |Ama |Als |Alors |Allora |Ali |Aleshores |Ale |Akkor |Ak |Adott |Ac |Aber |A zároveň |A tiež |A taktiež |A také |A |a |7 |\* )/)) {
        state.inStep = true;
        state.allowPlaceholders = true;
        state.allowMultilineArgument = true;
        state.inKeywordLine = true;
        return "keyword";

      // INLINE STRING
      } else if (stream.match(/"[^"]*"?/)) {
        return "string";

      // PLACEHOLDER
      } else if (state.allowPlaceholders && stream.match(/<[^>]*>?/)) {
        return "variable";

      // Fall through
      } else {
        stream.next();
        stream.eatWhile(/[^@"<#]/);
        return null;
      }
    }
  };
});

CodeMirror.defineMIME("text/x-feature", "gherkin");

});
codemirror/mode/pig/index.html000064400000002703151215013510012405 0ustar00<!doctype html>
<title>CodeMirror: Pig Latin mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="pig.js"></script>
<style>.CodeMirror {border: 2px inset #dee;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Pig Latin</a>
  </ul>
</div>

<article>
<h2>Pig Latin mode</h2>
<form><textarea id="code" name="code">
-- Apache Pig (Pig Latin Language) Demo
/* 
This is a multiline comment.
*/
a = LOAD "\path\to\input" USING PigStorage('\t') AS (x:long, y:chararray, z:bytearray);
b = GROUP a BY (x,y,3+4);
c = FOREACH b GENERATE flatten(group) as (x,y), SUM(group.$2) as z;
STORE c INTO "\path\to\output";

--
</textarea></form>

    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        lineNumbers: true,
        indentUnit: 4,
        mode: "text/x-pig"
      });
    </script>

    <p>
        Simple mode that handles Pig Latin language.
    </p>

    <p><strong>MIME type defined:</strong> <code>text/x-pig</code>
    (PIG code)
</article>
codemirror/mode/pig/pig.js000064400000013262151215013510011527 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

/*
 *      Pig Latin Mode for CodeMirror 2
 *      @author Prasanth Jayachandran
 *      @link   https://github.com/prasanthj/pig-codemirror-2
 *  This implementation is adapted from PL/SQL mode in CodeMirror 2.
 */
(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("pig", function(_config, parserConfig) {
  var keywords = parserConfig.keywords,
  builtins = parserConfig.builtins,
  types = parserConfig.types,
  multiLineStrings = parserConfig.multiLineStrings;

  var isOperatorChar = /[*+\-%<>=&?:\/!|]/;

  function chain(stream, state, f) {
    state.tokenize = f;
    return f(stream, state);
  }

  function tokenComment(stream, state) {
    var isEnd = false;
    var ch;
    while(ch = stream.next()) {
      if(ch == "/" && isEnd) {
        state.tokenize = tokenBase;
        break;
      }
      isEnd = (ch == "*");
    }
    return "comment";
  }

  function tokenString(quote) {
    return function(stream, state) {
      var escaped = false, next, end = false;
      while((next = stream.next()) != null) {
        if (next == quote && !escaped) {
          end = true; break;
        }
        escaped = !escaped && next == "\\";
      }
      if (end || !(escaped || multiLineStrings))
        state.tokenize = tokenBase;
      return "error";
    };
  }


  function tokenBase(stream, state) {
    var ch = stream.next();

    // is a start of string?
    if (ch == '"' || ch == "'")
      return chain(stream, state, tokenString(ch));
    // is it one of the special chars
    else if(/[\[\]{}\(\),;\.]/.test(ch))
      return null;
    // is it a number?
    else if(/\d/.test(ch)) {
      stream.eatWhile(/[\w\.]/);
      return "number";
    }
    // multi line comment or operator
    else if (ch == "/") {
      if (stream.eat("*")) {
        return chain(stream, state, tokenComment);
      }
      else {
        stream.eatWhile(isOperatorChar);
        return "operator";
      }
    }
    // single line comment or operator
    else if (ch=="-") {
      if(stream.eat("-")){
        stream.skipToEnd();
        return "comment";
      }
      else {
        stream.eatWhile(isOperatorChar);
        return "operator";
      }
    }
    // is it an operator
    else if (isOperatorChar.test(ch)) {
      stream.eatWhile(isOperatorChar);
      return "operator";
    }
    else {
      // get the while word
      stream.eatWhile(/[\w\$_]/);
      // is it one of the listed keywords?
      if (keywords && keywords.propertyIsEnumerable(stream.current().toUpperCase())) {
        //keywords can be used as variables like flatten(group), group.$0 etc..
        if (!stream.eat(")") && !stream.eat("."))
          return "keyword";
      }
      // is it one of the builtin functions?
      if (builtins && builtins.propertyIsEnumerable(stream.current().toUpperCase()))
        return "variable-2";
      // is it one of the listed types?
      if (types && types.propertyIsEnumerable(stream.current().toUpperCase()))
        return "variable-3";
      // default is a 'variable'
      return "variable";
    }
  }

  // Interface
  return {
    startState: function() {
      return {
        tokenize: tokenBase,
        startOfLine: true
      };
    },

    token: function(stream, state) {
      if(stream.eatSpace()) return null;
      var style = state.tokenize(stream, state);
      return style;
    }
  };
});

(function() {
  function keywords(str) {
    var obj = {}, words = str.split(" ");
    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
    return obj;
  }

  // builtin funcs taken from trunk revision 1303237
  var pBuiltins = "ABS ACOS ARITY ASIN ATAN AVG BAGSIZE BINSTORAGE BLOOM BUILDBLOOM CBRT CEIL "
    + "CONCAT COR COS COSH COUNT COUNT_STAR COV CONSTANTSIZE CUBEDIMENSIONS DIFF DISTINCT DOUBLEABS "
    + "DOUBLEAVG DOUBLEBASE DOUBLEMAX DOUBLEMIN DOUBLEROUND DOUBLESUM EXP FLOOR FLOATABS FLOATAVG "
    + "FLOATMAX FLOATMIN FLOATROUND FLOATSUM GENERICINVOKER INDEXOF INTABS INTAVG INTMAX INTMIN "
    + "INTSUM INVOKEFORDOUBLE INVOKEFORFLOAT INVOKEFORINT INVOKEFORLONG INVOKEFORSTRING INVOKER "
    + "ISEMPTY JSONLOADER JSONMETADATA JSONSTORAGE LAST_INDEX_OF LCFIRST LOG LOG10 LOWER LONGABS "
    + "LONGAVG LONGMAX LONGMIN LONGSUM MAX MIN MAPSIZE MONITOREDUDF NONDETERMINISTIC OUTPUTSCHEMA  "
    + "PIGSTORAGE PIGSTREAMING RANDOM REGEX_EXTRACT REGEX_EXTRACT_ALL REPLACE ROUND SIN SINH SIZE "
    + "SQRT STRSPLIT SUBSTRING SUM STRINGCONCAT STRINGMAX STRINGMIN STRINGSIZE TAN TANH TOBAG "
    + "TOKENIZE TOMAP TOP TOTUPLE TRIM TEXTLOADER TUPLESIZE UCFIRST UPPER UTF8STORAGECONVERTER ";

  // taken from QueryLexer.g
  var pKeywords = "VOID IMPORT RETURNS DEFINE LOAD FILTER FOREACH ORDER CUBE DISTINCT COGROUP "
    + "JOIN CROSS UNION SPLIT INTO IF OTHERWISE ALL AS BY USING INNER OUTER ONSCHEMA PARALLEL "
    + "PARTITION GROUP AND OR NOT GENERATE FLATTEN ASC DESC IS STREAM THROUGH STORE MAPREDUCE "
    + "SHIP CACHE INPUT OUTPUT STDERROR STDIN STDOUT LIMIT SAMPLE LEFT RIGHT FULL EQ GT LT GTE LTE "
    + "NEQ MATCHES TRUE FALSE DUMP";

  // data types
  var pTypes = "BOOLEAN INT LONG FLOAT DOUBLE CHARARRAY BYTEARRAY BAG TUPLE MAP ";

  CodeMirror.defineMIME("text/x-pig", {
    name: "pig",
    builtins: keywords(pBuiltins),
    keywords: keywords(pKeywords),
    types: keywords(pTypes)
  });

  CodeMirror.registerHelper("hintWords", "pig", (pBuiltins + pTypes + pKeywords).split(" "));
}());

});
codemirror/mode/clojure/index.html000064400000004766151215013510013304 0ustar00<!doctype html>

<title>CodeMirror: Clojure mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="clojure.js"></script>
<style>.CodeMirror {background: #f8f8f8;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Clojure</a>
  </ul>
</div>

<article>
<h2>Clojure mode</h2>
<form><textarea id="code" name="code">
; Conway's Game of Life, based on the work of:
;; Laurent Petit https://gist.github.com/1200343
;; Christophe Grand http://clj-me.cgrand.net/2011/08/19/conways-game-of-life

(ns ^{:doc "Conway's Game of Life."}
 game-of-life)

;; Core game of life's algorithm functions

(defn neighbours
  "Given a cell's coordinates, returns the coordinates of its neighbours."
  [[x y]]
  (for [dx [-1 0 1] dy (if (zero? dx) [-1 1] [-1 0 1])]
    [(+ dx x) (+ dy y)]))

(defn step
  "Given a set of living cells, computes the new set of living cells."
  [cells]
  (set (for [[cell n] (frequencies (mapcat neighbours cells))
             :when (or (= n 3) (and (= n 2) (cells cell)))]
         cell)))

;; Utility methods for displaying game on a text terminal

(defn print-board
  "Prints a board on *out*, representing a step in the game."
  [board w h]
  (doseq [x (range (inc w)) y (range (inc h))]
    (if (= y 0) (print "\n"))
    (print (if (board [x y]) "[X]" " . "))))

(defn display-grids
  "Prints a squence of boards on *out*, representing several steps."
  [grids w h]
  (doseq [board grids]
    (print-board board w h)
    (print "\n")))

;; Launches an example board

(def
  ^{:doc "board represents the initial set of living cells"}
   board #{[2 1] [2 2] [2 3]})

(display-grids (take 3 (iterate step board)) 5 5)

;; Let's play with characters
(println \1 \a \# \\
         \" \( \newline
         \} \" \space
         \tab \return \backspace
         \u1000 \uAaAa \u9F9F)

;; Let's play with numbers
(+ 1 -1 1/2 -1/2 -0.5 0.5)

</textarea></form>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {});
    </script>

    <p><strong>MIME types defined:</strong> <code>text/x-clojure</code>.</p>

  </article>
codemirror/mode/clojure/clojure.js000064400000037205151215013510013302 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

/**
 * Author: Hans Engel
 * Branched from CodeMirror's Scheme mode (by Koh Zi Han, based on implementation by Koh Zi Chun)
 */

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("clojure", function (options) {
    var BUILTIN = "builtin", COMMENT = "comment", STRING = "string", CHARACTER = "string-2",
        ATOM = "atom", NUMBER = "number", BRACKET = "bracket", KEYWORD = "keyword", VAR = "variable";
    var INDENT_WORD_SKIP = options.indentUnit || 2;
    var NORMAL_INDENT_UNIT = options.indentUnit || 2;

    function makeKeywords(str) {
        var obj = {}, words = str.split(" ");
        for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
        return obj;
    }

    var atoms = makeKeywords("true false nil");

    var keywords = makeKeywords(
      "defn defn- def def- defonce defmulti defmethod defmacro defstruct deftype defprotocol defrecord defproject deftest " +
      "slice defalias defhinted defmacro- defn-memo defnk defnk defonce- defunbound defunbound- defvar defvar- let letfn " +
      "do case cond condp for loop recur when when-not when-let when-first if if-let if-not . .. -> ->> doto and or dosync " +
      "doseq dotimes dorun doall load import unimport ns in-ns refer try catch finally throw with-open with-local-vars " +
      "binding gen-class gen-and-load-class gen-and-save-class handler-case handle");

    var builtins = makeKeywords(
        "* *' *1 *2 *3 *agent* *allow-unresolved-vars* *assert* *clojure-version* *command-line-args* *compile-files* " +
        "*compile-path* *compiler-options* *data-readers* *e *err* *file* *flush-on-newline* *fn-loader* *in* " +
        "*math-context* *ns* *out* *print-dup* *print-length* *print-level* *print-meta* *print-readably* *read-eval* " +
        "*source-path* *unchecked-math* *use-context-classloader* *verbose-defrecords* *warn-on-reflection* + +' - -' -> " +
        "->> ->ArrayChunk ->Vec ->VecNode ->VecSeq -cache-protocol-fn -reset-methods .. / < <= = == > >= EMPTY-NODE accessor " +
        "aclone add-classpath add-watch agent agent-error agent-errors aget alength alias all-ns alter alter-meta! " +
        "alter-var-root amap ancestors and apply areduce array-map aset aset-boolean aset-byte aset-char aset-double " +
        "aset-float aset-int aset-long aset-short assert assoc assoc! assoc-in associative? atom await await-for await1 " +
        "bases bean bigdec bigint biginteger binding bit-and bit-and-not bit-clear bit-flip bit-not bit-or bit-set " +
        "bit-shift-left bit-shift-right bit-test bit-xor boolean boolean-array booleans bound-fn bound-fn* bound? butlast " +
        "byte byte-array bytes case cat cast char char-array char-escape-string char-name-string char? chars chunk chunk-append " +
        "chunk-buffer chunk-cons chunk-first chunk-next chunk-rest chunked-seq? class class? clear-agent-errors " +
        "clojure-version coll? comment commute comp comparator compare compare-and-set! compile complement completing concat cond condp " +
        "conj conj! cons constantly construct-proxy contains? count counted? create-ns create-struct cycle dec dec' decimal? " +
        "declare dedupe default-data-readers definline definterface defmacro defmethod defmulti defn defn- defonce defprotocol " +
        "defrecord defstruct deftype delay delay? deliver denominator deref derive descendants destructure disj disj! dissoc " +
        "dissoc! distinct distinct? doall dorun doseq dosync dotimes doto double double-array doubles drop drop-last " +
        "drop-while eduction empty empty? ensure enumeration-seq error-handler error-mode eval even? every-pred every? ex-data ex-info " +
        "extend extend-protocol extend-type extenders extends? false? ffirst file-seq filter filterv find find-keyword " +
        "find-ns find-protocol-impl find-protocol-method find-var first flatten float float-array float? floats flush fn fn? " +
        "fnext fnil for force format frequencies future future-call future-cancel future-cancelled? future-done? future? " +
        "gen-class gen-interface gensym get get-in get-method get-proxy-class get-thread-bindings get-validator group-by hash " +
        "hash-combine hash-map hash-set identical? identity if-let if-not ifn? import in-ns inc inc' init-proxy instance? " +
        "int int-array integer? interleave intern interpose into into-array ints io! isa? iterate iterator-seq juxt keep " +
        "keep-indexed key keys keyword keyword? last lazy-cat lazy-seq let letfn line-seq list list* list? load load-file " +
        "load-reader load-string loaded-libs locking long long-array longs loop macroexpand macroexpand-1 make-array " +
        "make-hierarchy map map-indexed map? mapcat mapv max max-key memfn memoize merge merge-with meta method-sig methods " +
        "min min-key mod munge name namespace namespace-munge neg? newline next nfirst nil? nnext not not-any? not-empty " +
        "not-every? not= ns ns-aliases ns-imports ns-interns ns-map ns-name ns-publics ns-refers ns-resolve ns-unalias " +
        "ns-unmap nth nthnext nthrest num number? numerator object-array odd? or parents partial partition partition-all " +
        "partition-by pcalls peek persistent! pmap pop pop! pop-thread-bindings pos? pr pr-str prefer-method prefers " +
        "primitives-classnames print print-ctor print-dup print-method print-simple print-str printf println println-str " +
        "prn prn-str promise proxy proxy-call-with-super proxy-mappings proxy-name proxy-super push-thread-bindings pvalues " +
        "quot rand rand-int rand-nth random-sample range ratio? rational? rationalize re-find re-groups re-matcher re-matches re-pattern " +
        "re-seq read read-line read-string realized? reduce reduce-kv reductions ref ref-history-count ref-max-history " +
        "ref-min-history ref-set refer refer-clojure reify release-pending-sends rem remove remove-all-methods " +
        "remove-method remove-ns remove-watch repeat repeatedly replace replicate require reset! reset-meta! resolve rest " +
        "restart-agent resultset-seq reverse reversible? rseq rsubseq satisfies? second select-keys send send-off seq seq? " +
        "seque sequence sequential? set set-error-handler! set-error-mode! set-validator! set? short short-array shorts " +
        "shuffle shutdown-agents slurp some some-fn sort sort-by sorted-map sorted-map-by sorted-set sorted-set-by sorted? " +
        "special-symbol? spit split-at split-with str string? struct struct-map subs subseq subvec supers swap! symbol " +
        "symbol? sync take take-last take-nth take-while test the-ns thread-bound? time to-array to-array-2d trampoline transduce " +
        "transient tree-seq true? type unchecked-add unchecked-add-int unchecked-byte unchecked-char unchecked-dec " +
        "unchecked-dec-int unchecked-divide-int unchecked-double unchecked-float unchecked-inc unchecked-inc-int " +
        "unchecked-int unchecked-long unchecked-multiply unchecked-multiply-int unchecked-negate unchecked-negate-int "+
        "unchecked-remainder-int unchecked-short unchecked-subtract unchecked-subtract-int underive unquote " +
        "unquote-splicing update update-in update-proxy use val vals var-get var-set var? vary-meta vec vector vector-of " +
        "vector? volatile! volatile? vreset! vswap! when when-first when-let when-not while with-bindings with-bindings* with-in-str with-loading-context " +
        "with-local-vars with-meta with-open with-out-str with-precision with-redefs with-redefs-fn xml-seq zero? zipmap " +
        "*default-data-reader-fn* as-> cond-> cond->> reduced reduced? send-via set-agent-send-executor! " +
        "set-agent-send-off-executor! some-> some->>");

    var indentKeys = makeKeywords(
        // Built-ins
        "ns fn def defn defmethod bound-fn if if-not case condp when while when-not when-first do future comment doto " +
        "locking proxy with-open with-precision reify deftype defrecord defprotocol extend extend-protocol extend-type " +
        "try catch " +

        // Binding forms
        "let letfn binding loop for doseq dotimes when-let if-let " +

        // Data structures
        "defstruct struct-map assoc " +

        // clojure.test
        "testing deftest " +

        // contrib
        "handler-case handle dotrace deftrace");

    var tests = {
        digit: /\d/,
        digit_or_colon: /[\d:]/,
        hex: /[0-9a-f]/i,
        sign: /[+-]/,
        exponent: /e/i,
        keyword_char: /[^\s\(\[\;\)\]]/,
        symbol: /[\w*+!\-\._?:<>\/\xa1-\uffff]/,
        block_indent: /^(?:def|with)[^\/]+$|\/(?:def|with)/
    };

    function stateStack(indent, type, prev) { // represents a state stack object
        this.indent = indent;
        this.type = type;
        this.prev = prev;
    }

    function pushStack(state, indent, type) {
        state.indentStack = new stateStack(indent, type, state.indentStack);
    }

    function popStack(state) {
        state.indentStack = state.indentStack.prev;
    }

    function isNumber(ch, stream){
        // hex
        if ( ch === '0' && stream.eat(/x/i) ) {
            stream.eatWhile(tests.hex);
            return true;
        }

        // leading sign
        if ( ( ch == '+' || ch == '-' ) && ( tests.digit.test(stream.peek()) ) ) {
          stream.eat(tests.sign);
          ch = stream.next();
        }

        if ( tests.digit.test(ch) ) {
            stream.eat(ch);
            stream.eatWhile(tests.digit);

            if ( '.' == stream.peek() ) {
                stream.eat('.');
                stream.eatWhile(tests.digit);
            } else if ('/' == stream.peek() ) {
                stream.eat('/');
                stream.eatWhile(tests.digit);
            }

            if ( stream.eat(tests.exponent) ) {
                stream.eat(tests.sign);
                stream.eatWhile(tests.digit);
            }

            return true;
        }

        return false;
    }

    // Eat character that starts after backslash \
    function eatCharacter(stream) {
        var first = stream.next();
        // Read special literals: backspace, newline, space, return.
        // Just read all lowercase letters.
        if (first && first.match(/[a-z]/) && stream.match(/[a-z]+/, true)) {
            return;
        }
        // Read unicode character: \u1000 \uA0a1
        if (first === "u") {
            stream.match(/[0-9a-z]{4}/i, true);
        }
    }

    return {
        startState: function () {
            return {
                indentStack: null,
                indentation: 0,
                mode: false
            };
        },

        token: function (stream, state) {
            if (state.indentStack == null && stream.sol()) {
                // update indentation, but only if indentStack is empty
                state.indentation = stream.indentation();
            }

            // skip spaces
            if (state.mode != "string" && stream.eatSpace()) {
                return null;
            }
            var returnType = null;

            switch(state.mode){
                case "string": // multi-line string parsing mode
                    var next, escaped = false;
                    while ((next = stream.next()) != null) {
                        if (next == "\"" && !escaped) {

                            state.mode = false;
                            break;
                        }
                        escaped = !escaped && next == "\\";
                    }
                    returnType = STRING; // continue on in string mode
                    break;
                default: // default parsing mode
                    var ch = stream.next();

                    if (ch == "\"") {
                        state.mode = "string";
                        returnType = STRING;
                    } else if (ch == "\\") {
                        eatCharacter(stream);
                        returnType = CHARACTER;
                    } else if (ch == "'" && !( tests.digit_or_colon.test(stream.peek()) )) {
                        returnType = ATOM;
                    } else if (ch == ";") { // comment
                        stream.skipToEnd(); // rest of the line is a comment
                        returnType = COMMENT;
                    } else if (isNumber(ch,stream)){
                        returnType = NUMBER;
                    } else if (ch == "(" || ch == "[" || ch == "{" ) {
                        var keyWord = '', indentTemp = stream.column(), letter;
                        /**
                        Either
                        (indent-word ..
                        (non-indent-word ..
                        (;something else, bracket, etc.
                        */

                        if (ch == "(") while ((letter = stream.eat(tests.keyword_char)) != null) {
                            keyWord += letter;
                        }

                        if (keyWord.length > 0 && (indentKeys.propertyIsEnumerable(keyWord) ||
                                                   tests.block_indent.test(keyWord))) { // indent-word
                            pushStack(state, indentTemp + INDENT_WORD_SKIP, ch);
                        } else { // non-indent word
                            // we continue eating the spaces
                            stream.eatSpace();
                            if (stream.eol() || stream.peek() == ";") {
                                // nothing significant after
                                // we restart indentation the user defined spaces after
                                pushStack(state, indentTemp + NORMAL_INDENT_UNIT, ch);
                            } else {
                                pushStack(state, indentTemp + stream.current().length, ch); // else we match
                            }
                        }
                        stream.backUp(stream.current().length - 1); // undo all the eating

                        returnType = BRACKET;
                    } else if (ch == ")" || ch == "]" || ch == "}") {
                        returnType = BRACKET;
                        if (state.indentStack != null && state.indentStack.type == (ch == ")" ? "(" : (ch == "]" ? "[" :"{"))) {
                            popStack(state);
                        }
                    } else if ( ch == ":" ) {
                        stream.eatWhile(tests.symbol);
                        return ATOM;
                    } else {
                        stream.eatWhile(tests.symbol);

                        if (keywords && keywords.propertyIsEnumerable(stream.current())) {
                            returnType = KEYWORD;
                        } else if (builtins && builtins.propertyIsEnumerable(stream.current())) {
                            returnType = BUILTIN;
                        } else if (atoms && atoms.propertyIsEnumerable(stream.current())) {
                            returnType = ATOM;
                        } else {
                          returnType = VAR;
                        }
                    }
            }

            return returnType;
        },

        indent: function (state) {
            if (state.indentStack == null) return state.indentation;
            return state.indentStack.indent;
        },

        closeBrackets: {pairs: "()[]{}\"\""},
        lineComment: ";;"
    };
});

CodeMirror.defineMIME("text/x-clojure", "clojure");
CodeMirror.defineMIME("text/x-clojurescript", "clojure");
CodeMirror.defineMIME("application/edn", "clojure");

});
codemirror/mode/dockerfile/index.html000064400000004333151215013510013736 0ustar00<!doctype html>

<title>CodeMirror: Dockerfile mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/mode/simple.js"></script>
<script src="dockerfile.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Dockerfile</a>
  </ul>
</div>

<article>
<h2>Dockerfile mode</h2>
<form><textarea id="code" name="code"># Install Ghost blogging platform and run development environment
#
# VERSION 1.0.0

FROM ubuntu:12.10
MAINTAINER Amer Grgic "amer@livebyt.es"
WORKDIR /data/ghost

# Install dependencies for nginx installation
RUN apt-get update
RUN apt-get install -y python g++ make software-properties-common --force-yes
RUN add-apt-repository ppa:chris-lea/node.js
RUN apt-get update
# Install unzip
RUN apt-get install -y unzip
# Install curl
RUN apt-get install -y curl
# Install nodejs & npm
RUN apt-get install -y rlwrap
RUN apt-get install -y nodejs 
# Download Ghost v0.4.1
RUN curl -L https://ghost.org/zip/ghost-latest.zip -o /tmp/ghost.zip
# Unzip Ghost zip to /data/ghost
RUN unzip -uo /tmp/ghost.zip -d /data/ghost
# Add custom config js to /data/ghost
ADD ./config.example.js /data/ghost/config.js
# Install Ghost with NPM
RUN cd /data/ghost/ && npm install --production
# Expose port 2368
EXPOSE 2368
# Run Ghost
CMD ["npm","start"]
</textarea></form>

    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        lineNumbers: true,
        mode: "dockerfile"
      });
    </script>

    <p>Dockerfile syntax highlighting for CodeMirror. Depends on
    the <a href="../../demo/simplemode.html">simplemode</a> addon.</p>

    <p><strong>MIME types defined:</strong> <code>text/x-dockerfile</code></p>
  </article>
codemirror/mode/dockerfile/dockerfile.js000064400000004255151215013510014411 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"), require("../../addon/mode/simple"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror", "../../addon/mode/simple"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  // Collect all Dockerfile directives
  var instructions = ["from", "maintainer", "run", "cmd", "expose", "env",
                      "add", "copy", "entrypoint", "volume", "user",
                      "workdir", "onbuild"],
      instructionRegex = "(" + instructions.join('|') + ")",
      instructionOnlyLine = new RegExp(instructionRegex + "\\s*$", "i"),
      instructionWithArguments = new RegExp(instructionRegex + "(\\s+)", "i");

  CodeMirror.defineSimpleMode("dockerfile", {
    start: [
      // Block comment: This is a line starting with a comment
      {
        regex: /#.*$/,
        token: "comment"
      },
      // Highlight an instruction without any arguments (for convenience)
      {
        regex: instructionOnlyLine,
        token: "variable-2"
      },
      // Highlight an instruction followed by arguments
      {
        regex: instructionWithArguments,
        token: ["variable-2", null],
        next: "arguments"
      },
      {
        regex: /./,
        token: null
      }
    ],
    arguments: [
      {
        // Line comment without instruction arguments is an error
        regex: /#.*$/,
        token: "error",
        next: "start"
      },
      {
        regex: /[^#]+\\$/,
        token: null
      },
      {
        // Match everything except for the inline comment
        regex: /[^#]+/,
        token: null,
        next: "start"
      },
      {
        regex: /$/,
        token: null,
        next: "start"
      },
      // Fail safe return to start
      {
        token: null,
        next: "start"
      }
    ],
      meta: {
          lineComment: "#"
      }
  });

  CodeMirror.defineMIME("text/x-dockerfile", "dockerfile");
});
codemirror/mode/webidl/webidl.js000064400000013230151215013510012700 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

function wordRegexp(words) {
  return new RegExp("^((" + words.join(")|(") + "))\\b");
};

var builtinArray = [
  "Clamp",
  "Constructor",
  "EnforceRange",
  "Exposed",
  "ImplicitThis",
  "Global", "PrimaryGlobal",
  "LegacyArrayClass",
  "LegacyUnenumerableNamedProperties",
  "LenientThis",
  "NamedConstructor",
  "NewObject",
  "NoInterfaceObject",
  "OverrideBuiltins",
  "PutForwards",
  "Replaceable",
  "SameObject",
  "TreatNonObjectAsNull",
  "TreatNullAs",
    "EmptyString",
  "Unforgeable",
  "Unscopeable"
];
var builtins = wordRegexp(builtinArray);

var typeArray = [
  "unsigned", "short", "long",                  // UnsignedIntegerType
  "unrestricted", "float", "double",            // UnrestrictedFloatType
  "boolean", "byte", "octet",                   // Rest of PrimitiveType
  "Promise",                                    // PromiseType
  "ArrayBuffer", "DataView", "Int8Array", "Int16Array", "Int32Array",
  "Uint8Array", "Uint16Array", "Uint32Array", "Uint8ClampedArray",
  "Float32Array", "Float64Array",               // BufferRelatedType
  "ByteString", "DOMString", "USVString", "sequence", "object", "RegExp",
  "Error", "DOMException", "FrozenArray",       // Rest of NonAnyType
  "any",                                        // Rest of SingleType
  "void"                                        // Rest of ReturnType
];
var types = wordRegexp(typeArray);

var keywordArray = [
  "attribute", "callback", "const", "deleter", "dictionary", "enum", "getter",
  "implements", "inherit", "interface", "iterable", "legacycaller", "maplike",
  "partial", "required", "serializer", "setlike", "setter", "static",
  "stringifier", "typedef",                     // ArgumentNameKeyword except
                                                // "unrestricted"
  "optional", "readonly", "or"
];
var keywords = wordRegexp(keywordArray);

var atomArray = [
  "true", "false",                              // BooleanLiteral
  "Infinity", "NaN",                            // FloatLiteral
  "null"                                        // Rest of ConstValue
];
var atoms = wordRegexp(atomArray);

CodeMirror.registerHelper("hintWords", "webidl",
    builtinArray.concat(typeArray).concat(keywordArray).concat(atomArray));

var startDefArray = ["callback", "dictionary", "enum", "interface"];
var startDefs = wordRegexp(startDefArray);

var endDefArray = ["typedef"];
var endDefs = wordRegexp(endDefArray);

var singleOperators = /^[:<=>?]/;
var integers = /^-?([1-9][0-9]*|0[Xx][0-9A-Fa-f]+|0[0-7]*)/;
var floats = /^-?(([0-9]+\.[0-9]*|[0-9]*\.[0-9]+)([Ee][+-]?[0-9]+)?|[0-9]+[Ee][+-]?[0-9]+)/;
var identifiers = /^_?[A-Za-z][0-9A-Z_a-z-]*/;
var identifiersEnd = /^_?[A-Za-z][0-9A-Z_a-z-]*(?=\s*;)/;
var strings = /^"[^"]*"/;
var multilineComments = /^\/\*.*?\*\//;
var multilineCommentsStart = /^\/\*.*/;
var multilineCommentsEnd = /^.*?\*\//;

function readToken(stream, state) {
  // whitespace
  if (stream.eatSpace()) return null;

  // comment
  if (state.inComment) {
    if (stream.match(multilineCommentsEnd)) {
      state.inComment = false;
      return "comment";
    }
    stream.skipToEnd();
    return "comment";
  }
  if (stream.match("//")) {
    stream.skipToEnd();
    return "comment";
  }
  if (stream.match(multilineComments)) return "comment";
  if (stream.match(multilineCommentsStart)) {
    state.inComment = true;
    return "comment";
  }

  // integer and float
  if (stream.match(/^-?[0-9\.]/, false)) {
    if (stream.match(integers) || stream.match(floats)) return "number";
  }

  // string
  if (stream.match(strings)) return "string";

  // identifier
  if (state.startDef && stream.match(identifiers)) return "def";

  if (state.endDef && stream.match(identifiersEnd)) {
    state.endDef = false;
    return "def";
  }

  if (stream.match(keywords)) return "keyword";

  if (stream.match(types)) {
    var lastToken = state.lastToken;
    var nextToken = (stream.match(/^\s*(.+?)\b/, false) || [])[1];

    if (lastToken === ":" || lastToken === "implements" ||
        nextToken === "implements" || nextToken === "=") {
      // Used as identifier
      return "builtin";
    } else {
      // Used as type
      return "variable-3";
    }
  }

  if (stream.match(builtins)) return "builtin";
  if (stream.match(atoms)) return "atom";
  if (stream.match(identifiers)) return "variable";

  // other
  if (stream.match(singleOperators)) return "operator";

  // unrecognized
  stream.next();
  return null;
};

CodeMirror.defineMode("webidl", function() {
  return {
    startState: function() {
      return {
        // Is in multiline comment
        inComment: false,
        // Last non-whitespace, matched token
        lastToken: "",
        // Next token is a definition
        startDef: false,
        // Last token of the statement is a definition
        endDef: false
      };
    },
    token: function(stream, state) {
      var style = readToken(stream, state);

      if (style) {
        var cur = stream.current();
        state.lastToken = cur;
        if (style === "keyword") {
          state.startDef = startDefs.test(cur);
          state.endDef = state.endDef || endDefs.test(cur);
        } else {
          state.startDef = false;
        }
      }

      return style;
    }
  };
});

CodeMirror.defineMIME("text/x-webidl", "webidl");
});
codemirror/mode/webidl/index.html000064400000004173151215013510013077 0ustar00<!doctype html>

<title>CodeMirror: Web IDL mode</title>
<meta charset="utf-8">
<link rel="stylesheet" href="../../doc/docs.css">
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="webidl.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>

<div id="nav">
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id="logo" src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class="active" href="#">Web IDL</a>
  </ul>
</div>

<article>
  <h2>Web IDL mode</h2>

  <div>
<textarea id="code" name="code">
[NamedConstructor=Image(optional unsigned long width, optional unsigned long height)]
interface HTMLImageElement : HTMLElement {
           attribute DOMString alt;
           attribute DOMString src;
           attribute DOMString srcset;
           attribute DOMString sizes;
           attribute DOMString? crossOrigin;
           attribute DOMString useMap;
           attribute boolean isMap;
           attribute unsigned long width;
           attribute unsigned long height;
  readonly attribute unsigned long naturalWidth;
  readonly attribute unsigned long naturalHeight;
  readonly attribute boolean complete;
  readonly attribute DOMString currentSrc;

  // also has obsolete members
};

partial interface HTMLImageElement {
  attribute DOMString name;
  attribute DOMString lowsrc;
  attribute DOMString align;
  attribute unsigned long hspace;
  attribute unsigned long vspace;
  attribute DOMString longDesc;

  [TreatNullAs=EmptyString] attribute DOMString border;
};
</textarea>
  </div>

  <script>
    var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
      lineNumbers: true,
      matchBrackets: true
    });
  </script>

  <p><strong>MIME type defined:</strong> <code>text/x-webidl</code>.</p>
</article>
codemirror/mode/yacas/yacas.js000064400000012460151215013510012370 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

// Yacas mode copyright (c) 2015 by Grzegorz Mazur
// Loosely based on mathematica mode by Calin Barbat

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode('yacas', function(_config, _parserConfig) {

  function words(str) {
    var obj = {}, words = str.split(" ");
    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
    return obj;
  }

  var bodiedOps = words("Assert BackQuote D Defun Deriv For ForEach FromFile " +
                        "FromString Function Integrate InverseTaylor Limit " +
                        "LocalSymbols Macro MacroRule MacroRulePattern " +
                        "NIntegrate Rule RulePattern Subst TD TExplicitSum " +
                        "TSum Taylor Taylor1 Taylor2 Taylor3 ToFile " +
                        "ToStdout ToString TraceRule Until While");

  // patterns
  var pFloatForm  = "(?:(?:\\.\\d+|\\d+\\.\\d*|\\d+)(?:[eE][+-]?\\d+)?)";
  var pIdentifier = "(?:[a-zA-Z\\$'][a-zA-Z0-9\\$']*)";

  // regular expressions
  var reFloatForm    = new RegExp(pFloatForm);
  var reIdentifier   = new RegExp(pIdentifier);
  var rePattern      = new RegExp(pIdentifier + "?_" + pIdentifier);
  var reFunctionLike = new RegExp(pIdentifier + "\\s*\\(");

  function tokenBase(stream, state) {
    var ch;

    // get next character
    ch = stream.next();

    // string
    if (ch === '"') {
      state.tokenize = tokenString;
      return state.tokenize(stream, state);
    }

    // comment
    if (ch === '/') {
      if (stream.eat('*')) {
        state.tokenize = tokenComment;
        return state.tokenize(stream, state);
      }
      if (stream.eat("/")) {
        stream.skipToEnd();
        return "comment";
      }
    }

    // go back one character
    stream.backUp(1);

    // update scope info
    var m = stream.match(/^(\w+)\s*\(/, false);
    if (m !== null && bodiedOps.hasOwnProperty(m[1]))
      state.scopes.push('bodied');

    var scope = currentScope(state);

    if (scope === 'bodied' && ch === '[')
      state.scopes.pop();

    if (ch === '[' || ch === '{' || ch === '(')
      state.scopes.push(ch);

    scope = currentScope(state);

    if (scope === '[' && ch === ']' ||
        scope === '{' && ch === '}' ||
        scope === '(' && ch === ')')
      state.scopes.pop();

    if (ch === ';') {
      while (scope === 'bodied') {
        state.scopes.pop();
        scope = currentScope(state);
      }
    }

    // look for ordered rules
    if (stream.match(/\d+ *#/, true, false)) {
      return 'qualifier';
    }

    // look for numbers
    if (stream.match(reFloatForm, true, false)) {
      return 'number';
    }

    // look for placeholders
    if (stream.match(rePattern, true, false)) {
      return 'variable-3';
    }

    // match all braces separately
    if (stream.match(/(?:\[|\]|{|}|\(|\))/, true, false)) {
      return 'bracket';
    }

    // literals looking like function calls
    if (stream.match(reFunctionLike, true, false)) {
      stream.backUp(1);
      return 'variable';
    }

    // all other identifiers
    if (stream.match(reIdentifier, true, false)) {
      return 'variable-2';
    }

    // operators; note that operators like @@ or /; are matched separately for each symbol.
    if (stream.match(/(?:\\|\+|\-|\*|\/|,|;|\.|:|@|~|=|>|<|&|\||_|`|'|\^|\?|!|%)/, true, false)) {
      return 'operator';
    }

    // everything else is an error
    return 'error';
  }

  function tokenString(stream, state) {
    var next, end = false, escaped = false;
    while ((next = stream.next()) != null) {
      if (next === '"' && !escaped) {
        end = true;
        break;
      }
      escaped = !escaped && next === '\\';
    }
    if (end && !escaped) {
      state.tokenize = tokenBase;
    }
    return 'string';
  };

  function tokenComment(stream, state) {
    var prev, next;
    while((next = stream.next()) != null) {
      if (prev === '*' && next === '/') {
        state.tokenize = tokenBase;
        break;
      }
      prev = next;
    }
    return 'comment';
  }

  function currentScope(state) {
    var scope = null;
    if (state.scopes.length > 0)
      scope = state.scopes[state.scopes.length - 1];
    return scope;
  }

  return {
    startState: function() {
      return {
        tokenize: tokenBase,
        scopes: []
      };
    },
    token: function(stream, state) {
      if (stream.eatSpace()) return null;
      return state.tokenize(stream, state);
    },
    indent: function(state, textAfter) {
      if (state.tokenize !== tokenBase && state.tokenize !== null)
        return CodeMirror.Pass;

      var delta = 0;
      if (textAfter === ']' || textAfter === '];' ||
          textAfter === '}' || textAfter === '};' ||
          textAfter === ');')
        delta = -1;

      return (state.scopes.length + delta) * _config.indentUnit;
    },
    electricChars: "{}[]();",
    blockCommentStart: "/*",
    blockCommentEnd: "*/",
    lineComment: "//"
  };
});

CodeMirror.defineMIME('text/x-yacas', {
  name: 'yacas'
});

});
codemirror/mode/yacas/index.html000064400000004200151215013510012720 0ustar00<!doctype html>

<title>CodeMirror: yacas mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel=stylesheet href=../../lib/codemirror.css>
<script src=../../lib/codemirror.js></script>
<script src=../../addon/edit/matchbrackets.js></script>
<script src=yacas.js></script>
<style type=text/css>
  .CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}
</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">yacas</a>
  </ul>
</div>

<article>
<h2>yacas mode</h2>


<textarea id="yacasCode">
// example yacas code
Graph(edges_IsList) <-- [
    Local(v, e, f, t);

    vertices := {};

    ForEach (e, edges) [
        If (IsList(e), e := Head(e));
        {f, t} := Tail(Listify(e));

        DestructiveAppend(vertices, f);
        DestructiveAppend(vertices, t);
    ];

    Graph(RemoveDuplicates(vertices), edges);
];

10 # IsGraph(Graph(vertices_IsList, edges_IsList)) <-- True;
20 # IsGraph(_x) <-- False;

Edges(Graph(vertices_IsList, edges_IsList)) <-- edges;
Vertices(Graph(vertices_IsList, edges_IsList)) <-- vertices;

AdjacencyList(g_IsGraph) <-- [
    Local(l, vertices, edges, e, op, f, t);

    l := Association'Create();

    vertices := Vertices(g);
    ForEach (v, vertices)
        Association'Set(l, v, {});

    edges := Edges(g);

    ForEach(e, edges) [
        If (IsList(e), e := Head(e));
        {op, f, t} := Listify(e);
        DestructiveAppend(Association'Get(l, f), t);
        If (String(op) = "<->", DestructiveAppend(Association'Get(l, t), f));
    ];

    l;
];
</textarea>

<script>
  var yacasEditor = CodeMirror.fromTextArea(document.getElementById('yacasCode'), {
    mode: 'text/x-yacas',
    lineNumbers: true,
    matchBrackets: true
  });
</script>

<p><strong>MIME types defined:</strong> <code>text/x-yacas</code> (yacas).</p>
</article>
codemirror/mode/factor/index.html000064400000003750151215013510013107 0ustar00<!doctype html>

<title>CodeMirror: Factor mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link href='http://fonts.googleapis.com/css?family=Droid+Sans+Mono' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/mode/simple.js"></script>
<script src="factor.js"></script>
<style>
.CodeMirror {
    font-family: 'Droid Sans Mono', monospace;
    font-size: 14px;
}
</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Factor</a>
  </ul>
</div>

<article>

<h2>Factor mode</h2>

<form><textarea id="code" name="code">
! Copyright (C) 2008 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.

! A simple time server

USING: accessors calendar calendar.format io io.encodings.ascii
io.servers kernel threads ;
IN: time-server

: handle-time-client ( -- )
    now timestamp>rfc822 print ;

: <time-server> ( -- threaded-server )
    ascii <threaded-server>
        "time-server" >>name
        1234 >>insecure
        [ handle-time-client ] >>handler ;

: start-time-server ( -- )
    <time-server> start-server drop ;

MAIN: start-time-server
</textarea>
  </form>

<script>
  var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
    lineNumbers: true,
    lineWrapping: true,
    indentUnit: 2,
    tabSize: 2,
    autofocus: true,
    mode: "text/x-factor"
  });
</script>
<p/>
<p>Simple mode that handles Factor Syntax (<a href="http://en.wikipedia.org/wiki/Factor_(programming_language)">Factor on WikiPedia</a>).</p>

<p><strong>MIME types defined:</strong> <code>text/x-factor</code>.</p>

</article>
codemirror/mode/factor/factor.js000064400000005547151215013510012734 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

// Factor syntax highlight - simple mode
//
// by Dimage Sapelkin (https://github.com/kerabromsmu)

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"), require("../../addon/mode/simple"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror", "../../addon/mode/simple"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  CodeMirror.defineSimpleMode("factor", {
    // The start state contains the rules that are intially used
    start: [
      // comments
      {regex: /#?!.*/, token: "comment"},
      // strings """, multiline --> state
      {regex: /"""/, token: "string", next: "string3"},
      {regex: /"/, token: "string", next: "string"},
      // numbers: dec, hex, unicode, bin, fractional, complex
      {regex: /(?:[+-]?)(?:0x[\d,a-f]+)|(?:0o[0-7]+)|(?:0b[0,1]+)|(?:\d+.?\d*)/, token: "number"},
      //{regex: /[+-]?/} //fractional
      // definition: defining word, defined word, etc
      {regex: /(\:)(\s+)(\S+)(\s+)(\()/, token: ["keyword", null, "def", null, "keyword"], next: "stack"},
      // vocabulary using --> state
      {regex: /USING\:/, token: "keyword", next: "vocabulary"},
      // vocabulary definition/use
      {regex: /(USE\:|IN\:)(\s+)(\S+)/, token: ["keyword", null, "variable-2"]},
      // <constructors>
      {regex: /<\S+>/, token: "builtin"},
      // "keywords", incl. ; t f . [ ] { } defining words
      {regex: /;|t|f|if|\.|\[|\]|\{|\}|MAIN:/, token: "keyword"},
      // any id (?)
      {regex: /\S+/, token: "variable"},

      {
        regex: /./,
        token: null
      }
    ],
    vocabulary: [
      {regex: /;/, token: "keyword", next: "start"},
      {regex: /\S+/, token: "variable-2"},
      {
        regex: /./,
        token: null
      }
    ],
    string: [
      {regex: /(?:[^\\]|\\.)*?"/, token: "string", next: "start"},
      {regex: /.*/, token: "string"}
    ],
    string3: [
      {regex: /(?:[^\\]|\\.)*?"""/, token: "string", next: "start"},
      {regex: /.*/, token: "string"}
    ],
    stack: [
      {regex: /\)/, token: "meta", next: "start"},
      {regex: /--/, token: "meta"},
      {regex: /\S+/, token: "variable-3"},
      {
        regex: /./,
        token: null
      }
    ],
    // The meta property contains global information about the mode. It
    // can contain properties like lineComment, which are supported by
    // all modes, and also directives like dontIndentStates, which are
    // specific to simple modes.
    meta: {
      dontIndentStates: ["start", "vocabulary", "string", "string3", "stack"],
      lineComment: [ "!", "#!" ]
    }
  });

  CodeMirror.defineMIME("text/x-factor", "factor");
});
codemirror/mode/stex/stex.js000064400000015424151215013510012141 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

/*
 * Author: Constantin Jucovschi (c.jucovschi@jacobs-university.de)
 * Licence: MIT
 */

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  CodeMirror.defineMode("stex", function() {
    "use strict";

    function pushCommand(state, command) {
      state.cmdState.push(command);
    }

    function peekCommand(state) {
      if (state.cmdState.length > 0) {
        return state.cmdState[state.cmdState.length - 1];
      } else {
        return null;
      }
    }

    function popCommand(state) {
      var plug = state.cmdState.pop();
      if (plug) {
        plug.closeBracket();
      }
    }

    // returns the non-default plugin closest to the end of the list
    function getMostPowerful(state) {
      var context = state.cmdState;
      for (var i = context.length - 1; i >= 0; i--) {
        var plug = context[i];
        if (plug.name == "DEFAULT") {
          continue;
        }
        return plug;
      }
      return { styleIdentifier: function() { return null; } };
    }

    function addPluginPattern(pluginName, cmdStyle, styles) {
      return function () {
        this.name = pluginName;
        this.bracketNo = 0;
        this.style = cmdStyle;
        this.styles = styles;
        this.argument = null;   // \begin and \end have arguments that follow. These are stored in the plugin

        this.styleIdentifier = function() {
          return this.styles[this.bracketNo - 1] || null;
        };
        this.openBracket = function() {
          this.bracketNo++;
          return "bracket";
        };
        this.closeBracket = function() {};
      };
    }

    var plugins = {};

    plugins["importmodule"] = addPluginPattern("importmodule", "tag", ["string", "builtin"]);
    plugins["documentclass"] = addPluginPattern("documentclass", "tag", ["", "atom"]);
    plugins["usepackage"] = addPluginPattern("usepackage", "tag", ["atom"]);
    plugins["begin"] = addPluginPattern("begin", "tag", ["atom"]);
    plugins["end"] = addPluginPattern("end", "tag", ["atom"]);

    plugins["DEFAULT"] = function () {
      this.name = "DEFAULT";
      this.style = "tag";

      this.styleIdentifier = this.openBracket = this.closeBracket = function() {};
    };

    function setState(state, f) {
      state.f = f;
    }

    // called when in a normal (no environment) context
    function normal(source, state) {
      var plug;
      // Do we look like '\command' ?  If so, attempt to apply the plugin 'command'
      if (source.match(/^\\[a-zA-Z@]+/)) {
        var cmdName = source.current().slice(1);
        plug = plugins[cmdName] || plugins["DEFAULT"];
        plug = new plug();
        pushCommand(state, plug);
        setState(state, beginParams);
        return plug.style;
      }

      // escape characters
      if (source.match(/^\\[$&%#{}_]/)) {
        return "tag";
      }

      // white space control characters
      if (source.match(/^\\[,;!\/\\]/)) {
        return "tag";
      }

      // find if we're starting various math modes
      if (source.match("\\[")) {
        setState(state, function(source, state){ return inMathMode(source, state, "\\]"); });
        return "keyword";
      }
      if (source.match("$$")) {
        setState(state, function(source, state){ return inMathMode(source, state, "$$"); });
        return "keyword";
      }
      if (source.match("$")) {
        setState(state, function(source, state){ return inMathMode(source, state, "$"); });
        return "keyword";
      }

      var ch = source.next();
      if (ch == "%") {
        source.skipToEnd();
        return "comment";
      } else if (ch == '}' || ch == ']') {
        plug = peekCommand(state);
        if (plug) {
          plug.closeBracket(ch);
          setState(state, beginParams);
        } else {
          return "error";
        }
        return "bracket";
      } else if (ch == '{' || ch == '[') {
        plug = plugins["DEFAULT"];
        plug = new plug();
        pushCommand(state, plug);
        return "bracket";
      } else if (/\d/.test(ch)) {
        source.eatWhile(/[\w.%]/);
        return "atom";
      } else {
        source.eatWhile(/[\w\-_]/);
        plug = getMostPowerful(state);
        if (plug.name == 'begin') {
          plug.argument = source.current();
        }
        return plug.styleIdentifier();
      }
    }

    function inMathMode(source, state, endModeSeq) {
      if (source.eatSpace()) {
        return null;
      }
      if (source.match(endModeSeq)) {
        setState(state, normal);
        return "keyword";
      }
      if (source.match(/^\\[a-zA-Z@]+/)) {
        return "tag";
      }
      if (source.match(/^[a-zA-Z]+/)) {
        return "variable-2";
      }
      // escape characters
      if (source.match(/^\\[$&%#{}_]/)) {
        return "tag";
      }
      // white space control characters
      if (source.match(/^\\[,;!\/]/)) {
        return "tag";
      }
      // special math-mode characters
      if (source.match(/^[\^_&]/)) {
        return "tag";
      }
      // non-special characters
      if (source.match(/^[+\-<>|=,\/@!*:;'"`~#?]/)) {
        return null;
      }
      if (source.match(/^(\d+\.\d*|\d*\.\d+|\d+)/)) {
        return "number";
      }
      var ch = source.next();
      if (ch == "{" || ch == "}" || ch == "[" || ch == "]" || ch == "(" || ch == ")") {
        return "bracket";
      }

      if (ch == "%") {
        source.skipToEnd();
        return "comment";
      }
      return "error";
    }

    function beginParams(source, state) {
      var ch = source.peek(), lastPlug;
      if (ch == '{' || ch == '[') {
        lastPlug = peekCommand(state);
        lastPlug.openBracket(ch);
        source.eat(ch);
        setState(state, normal);
        return "bracket";
      }
      if (/[ \t\r]/.test(ch)) {
        source.eat(ch);
        return null;
      }
      setState(state, normal);
      popCommand(state);

      return normal(source, state);
    }

    return {
      startState: function() {
        return {
          cmdState: [],
          f: normal
        };
      },
      copyState: function(s) {
        return {
          cmdState: s.cmdState.slice(),
          f: s.f
        };
      },
      token: function(stream, state) {
        return state.f(stream, state);
      },
      blankLine: function(state) {
        state.f = normal;
        state.cmdState.length = 0;
      },
      lineComment: "%"
    };
  });

  CodeMirror.defineMIME("text/x-stex", "stex");
  CodeMirror.defineMIME("text/x-latex", "stex");

});
codemirror/mode/stex/index.html000064400000010102151215013510012601 0ustar00<!doctype html>

<title>CodeMirror: sTeX mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="stex.js"></script>
<style>.CodeMirror {background: #f8f8f8;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">sTeX</a>
  </ul>
</div>

<article>
<h2>sTeX mode</h2>
<form><textarea id="code" name="code">
\begin{module}[id=bbt-size]
\importmodule[balanced-binary-trees]{balanced-binary-trees}
\importmodule[\KWARCslides{dmath/en/cardinality}]{cardinality}

\begin{frame}
  \frametitle{Size Lemma for Balanced Trees}
  \begin{itemize}
  \item
    \begin{assertion}[id=size-lemma,type=lemma] 
    Let $G=\tup{V,E}$ be a \termref[cd=binary-trees]{balanced binary tree} 
    of \termref[cd=graph-depth,name=vertex-depth]{depth}$n>i$, then the set
     $\defeq{\livar{V}i}{\setst{\inset{v}{V}}{\gdepth{v} = i}}$ of
    \termref[cd=graphs-intro,name=node]{nodes} at 
    \termref[cd=graph-depth,name=vertex-depth]{depth} $i$ has
    \termref[cd=cardinality,name=cardinality]{cardinality} $\power2ijQuery.
   \end{assertion}
  \item
    \begin{sproof}[id=size-lemma-pf,proofend=,for=size-lemma]{via induction over the depth $ijQuery.}
      \begin{spfcases}{We have to consider two cases}
        \begin{spfcase}{$i=0$}
          \begin{spfstep}[display=flow]
            then $\livar{V}i=\set{\livar{v}r}$, where $\livar{v}r$ is the root, so
            $\eq{\card{\livar{V}0},\card{\set{\livar{v}r}},1,\power20}jQuery.
          \end{spfstep}
        \end{spfcase}
        \begin{spfcase}{$i>0$}
          \begin{spfstep}[display=flow]
           then $\livar{V}{i-1}$ contains $\power2{i-1}$ vertexes 
           \begin{justification}[method=byIH](IH)\end{justification}
          \end{spfstep}
          \begin{spfstep}
           By the \begin{justification}[method=byDef]definition of a binary
              tree\end{justification}, each $\inset{v}{\livar{V}{i-1}}$ is a leaf or has
            two children that are at depth $ijQuery.
          \end{spfstep}
          \begin{spfstep}
           As $G$ is \termref[cd=balanced-binary-trees,name=balanced-binary-tree]{balanced} and $\gdepth{G}=n>i$, $\livar{V}{i-1}$ cannot contain
            leaves.
          \end{spfstep}
          \begin{spfstep}[type=conclusion]
           Thus $\eq{\card{\livar{V}i},{\atimes[cdot]{2,\card{\livar{V}{i-1}}}},{\atimes[cdot]{2,\power2{i-1}}},\power2i}jQuery.
          \end{spfstep}
        \end{spfcase}
      \end{spfcases}
    \end{sproof}
  \item 
    \begin{assertion}[id=fbbt,type=corollary]	
      A fully balanced tree of depth $d$ has $\power2{d+1}-1$ nodes.
    \end{assertion}
  \item
      \begin{sproof}[for=fbbt,id=fbbt-pf]{}
        \begin{spfstep}
          Let $\defeq{G}{\tup{V,E}}$ be a fully balanced tree
        \end{spfstep}
        \begin{spfstep}
          Then $\card{V}=\Sumfromto{i}1d{\power2i}= \power2{d+1}-1jQuery.
        \end{spfstep}
      \end{sproof}
    \end{itemize}
  \end{frame}
\begin{note}
  \begin{omtext}[type=conclusion,for=binary-tree]
    This shows that balanced binary trees grow in breadth very quickly, a consequence of
    this is that they are very shallow (and this compute very fast), which is the essence of
    the next result.
  \end{omtext}
\end{note}
\end{module}

%%% Local Variables: 
%%% mode: LaTeX
%%% TeX-master: "all"
%%% End: \end{document}
</textarea></form>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {});
    </script>

    <p><strong>MIME types defined:</strong> <code>text/x-stex</code>.</p>

    <p><strong>Parsing/Highlighting Tests:</strong> <a href="../../test/index.html#stex_*">normal</a>,  <a href="../../test/index.html#verbose,stex_*">verbose</a>.</p>

  </article>
codemirror/mode/stex/test.js000064400000006042151215013510012131 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function() {
  var mode = CodeMirror.getMode({tabSize: 4}, "stex");
  function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); }

  MT("word",
     "foo");

  MT("twoWords",
     "foo bar");

  MT("beginEndDocument",
     "[tag \\begin][bracket {][atom document][bracket }]",
     "[tag \\end][bracket {][atom document][bracket }]");

  MT("beginEndEquation",
     "[tag \\begin][bracket {][atom equation][bracket }]",
     "  E=mc^2",
     "[tag \\end][bracket {][atom equation][bracket }]");

  MT("beginModule",
     "[tag \\begin][bracket {][atom module][bracket }[[]]]");

  MT("beginModuleId",
     "[tag \\begin][bracket {][atom module][bracket }[[]id=bbt-size[bracket ]]]");

  MT("importModule",
     "[tag \\importmodule][bracket [[][string b-b-t][bracket ]]{][builtin b-b-t][bracket }]");

  MT("importModulePath",
     "[tag \\importmodule][bracket [[][tag \\KWARCslides][bracket {][string dmath/en/cardinality][bracket }]]{][builtin card][bracket }]");

  MT("psForPDF",
     "[tag \\PSforPDF][bracket [[][atom 1][bracket ]]{]#1[bracket }]");

  MT("comment",
     "[comment % foo]");

  MT("tagComment",
     "[tag \\item][comment % bar]");

  MT("commentTag",
     " [comment % \\item]");

  MT("commentLineBreak",
     "[comment %]",
     "foo");

  MT("tagErrorCurly",
     "[tag \\begin][error }][bracket {]");

  MT("tagErrorSquare",
     "[tag \\item][error ]]][bracket {]");

  MT("commentCurly",
     "[comment % }]");

  MT("tagHash",
     "the [tag \\#] key");

  MT("tagNumber",
     "a [tag \\$][atom 5] stetson");

  MT("tagPercent",
     "[atom 100][tag \\%] beef");

  MT("tagAmpersand",
     "L [tag \\&] N");

  MT("tagUnderscore",
     "foo[tag \\_]bar");

  MT("tagBracketOpen",
     "[tag \\emph][bracket {][tag \\{][bracket }]");

  MT("tagBracketClose",
     "[tag \\emph][bracket {][tag \\}][bracket }]");

  MT("tagLetterNumber",
     "section [tag \\S][atom 1]");

  MT("textTagNumber",
     "para [tag \\P][atom 2]");

  MT("thinspace",
     "x[tag \\,]y");

  MT("thickspace",
     "x[tag \\;]y");

  MT("negativeThinspace",
     "x[tag \\!]y");

  MT("periodNotSentence",
     "J.\\ L.\\ is");

  MT("periodSentence",
     "X[tag \\@]. The");

  MT("italicCorrection",
     "[bracket {][tag \\em] If[tag \\/][bracket }] I");

  MT("tagBracket",
     "[tag \\newcommand][bracket {][tag \\pop][bracket }]");

  MT("inlineMathTagFollowedByNumber",
     "[keyword $][tag \\pi][number 2][keyword $]");

  MT("inlineMath",
     "[keyword $][number 3][variable-2 x][tag ^][number 2.45]-[tag \\sqrt][bracket {][tag \\$\\alpha][bracket }] = [number 2][keyword $] other text");

  MT("displayMath",
     "More [keyword $$]\t[variable-2 S][tag ^][variable-2 n][tag \\sum] [variable-2 i][keyword $$] other text");

  MT("mathWithComment",
     "[keyword $][variable-2 x] [comment % $]",
     "[variable-2 y][keyword $] other text");

  MT("lineBreakArgument",
    "[tag \\\\][bracket [[][atom 1cm][bracket ]]]");
})();
codemirror/mode/pascal/pascal.js000064400000005757151215013510012711 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("pascal", function() {
  function words(str) {
    var obj = {}, words = str.split(" ");
    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
    return obj;
  }
  var keywords = words("and array begin case const div do downto else end file for forward integer " +
                       "boolean char function goto if in label mod nil not of or packed procedure " +
                       "program record repeat set string then to type until var while with");
  var atoms = {"null": true};

  var isOperatorChar = /[+\-*&%=<>!?|\/]/;

  function tokenBase(stream, state) {
    var ch = stream.next();
    if (ch == "#" && state.startOfLine) {
      stream.skipToEnd();
      return "meta";
    }
    if (ch == '"' || ch == "'") {
      state.tokenize = tokenString(ch);
      return state.tokenize(stream, state);
    }
    if (ch == "(" && stream.eat("*")) {
      state.tokenize = tokenComment;
      return tokenComment(stream, state);
    }
    if (/[\[\]{}\(\),;\:\.]/.test(ch)) {
      return null;
    }
    if (/\d/.test(ch)) {
      stream.eatWhile(/[\w\.]/);
      return "number";
    }
    if (ch == "/") {
      if (stream.eat("/")) {
        stream.skipToEnd();
        return "comment";
      }
    }
    if (isOperatorChar.test(ch)) {
      stream.eatWhile(isOperatorChar);
      return "operator";
    }
    stream.eatWhile(/[\w\$_]/);
    var cur = stream.current();
    if (keywords.propertyIsEnumerable(cur)) return "keyword";
    if (atoms.propertyIsEnumerable(cur)) return "atom";
    return "variable";
  }

  function tokenString(quote) {
    return function(stream, state) {
      var escaped = false, next, end = false;
      while ((next = stream.next()) != null) {
        if (next == quote && !escaped) {end = true; break;}
        escaped = !escaped && next == "\\";
      }
      if (end || !escaped) state.tokenize = null;
      return "string";
    };
  }

  function tokenComment(stream, state) {
    var maybeEnd = false, ch;
    while (ch = stream.next()) {
      if (ch == ")" && maybeEnd) {
        state.tokenize = null;
        break;
      }
      maybeEnd = (ch == "*");
    }
    return "comment";
  }

  // Interface

  return {
    startState: function() {
      return {tokenize: null};
    },

    token: function(stream, state) {
      if (stream.eatSpace()) return null;
      var style = (state.tokenize || tokenBase)(stream, state);
      if (style == "comment" || style == "meta") return style;
      return style;
    },

    electricChars: "{}"
  };
});

CodeMirror.defineMIME("text/x-pascal", "pascal");

});
codemirror/mode/pascal/index.html000064400000002640151215013510013071 0ustar00<!doctype html>

<title>CodeMirror: Pascal mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="pascal.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Pascal</a>
  </ul>
</div>

<article>
<h2>Pascal mode</h2>


<div><textarea id="code" name="code">
(* Example Pascal code *)

while a <> b do writeln('Waiting');
 
if a > b then 
  writeln('Condition met')
else 
  writeln('Condition not met');
 
for i := 1 to 10 do 
  writeln('Iteration: ', i:1);
 
repeat
  a := a + 1
until a = 10;
 
case i of
  0: write('zero');
  1: write('one');
  2: write('two')
end;
</textarea></div>

    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        lineNumbers: true,
        mode: "text/x-pascal"
      });
    </script>

    <p><strong>MIME types defined:</strong> <code>text/x-pascal</code>.</p>
  </article>
codemirror/mode/pug/index.html000064400000004671151215013510012427 0ustar00<!doctype html>

<title>CodeMirror: Pug Templating Mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../javascript/javascript.js"></script>
<script src="../css/css.js"></script>
<script src="../xml/xml.js"></script>
<script src="../htmlmixed/htmlmixed.js"></script>
<script src="pug.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Pug Templating Mode</a>
  </ul>
</div>

<article>
<h2>Pug Templating Mode</h2>
<form><textarea id="code" name="code">
doctype html
  html
    head
      title= "Pug Templating CodeMirror Mode Example"
      link(rel='stylesheet', href='/css/bootstrap.min.css')
      link(rel='stylesheet', href='/css/index.css')
      script(type='text/javascript', src='/js/jquery-1.9.1.min.js')
      script(type='text/javascript', src='/js/bootstrap.min.js')
    body
      div.header
        h1 Welcome to this Example
      div.spots
        if locals.spots
          each spot in spots
            div.spot.well
         div
           if spot.logo
             img.img-rounded.logo(src=spot.logo)
           else
             img.img-rounded.logo(src="img/placeholder.png")
         h3
           a(href=spot.hash) ##{spot.hash}
           if spot.title
             span.title #{spot.title}
           if spot.desc
             div #{spot.desc}
        else
          h3 There are no spots currently available.
</textarea></form>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        mode: {name: "pug", alignCDATA: true},
        lineNumbers: true
      });
    </script>
    <h3>The Pug Templating Mode</h3>
      <p> Created by Forbes Lindesay. Managed as part of a Brackets extension at <a href="https://github.com/ForbesLindesay/jade-brackets">https://github.com/ForbesLindesay/jade-brackets</a>.</p>
    <p><strong>MIME type defined:</strong> <code>text/x-pug</code>, <code>text/x-jade</code>.</p>
  </article>
codemirror/mode/pug/pug.js000064400000037256151215013510011570 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"), require("../javascript/javascript"), require("../css/css"), require("../htmlmixed/htmlmixed"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror", "../javascript/javascript", "../css/css", "../htmlmixed/htmlmixed"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("pug", function (config) {
  // token types
  var KEYWORD = 'keyword';
  var DOCTYPE = 'meta';
  var ID = 'builtin';
  var CLASS = 'qualifier';

  var ATTRS_NEST = {
    '{': '}',
    '(': ')',
    '[': ']'
  };

  var jsMode = CodeMirror.getMode(config, 'javascript');

  function State() {
    this.javaScriptLine = false;
    this.javaScriptLineExcludesColon = false;

    this.javaScriptArguments = false;
    this.javaScriptArgumentsDepth = 0;

    this.isInterpolating = false;
    this.interpolationNesting = 0;

    this.jsState = CodeMirror.startState(jsMode);

    this.restOfLine = '';

    this.isIncludeFiltered = false;
    this.isEach = false;

    this.lastTag = '';
    this.scriptType = '';

    // Attributes Mode
    this.isAttrs = false;
    this.attrsNest = [];
    this.inAttributeName = true;
    this.attributeIsType = false;
    this.attrValue = '';

    // Indented Mode
    this.indentOf = Infinity;
    this.indentToken = '';

    this.innerMode = null;
    this.innerState = null;

    this.innerModeForLine = false;
  }
  /**
   * Safely copy a state
   *
   * @return {State}
   */
  State.prototype.copy = function () {
    var res = new State();
    res.javaScriptLine = this.javaScriptLine;
    res.javaScriptLineExcludesColon = this.javaScriptLineExcludesColon;
    res.javaScriptArguments = this.javaScriptArguments;
    res.javaScriptArgumentsDepth = this.javaScriptArgumentsDepth;
    res.isInterpolating = this.isInterpolating;
    res.interpolationNesting = this.interpolationNesting;

    res.jsState = CodeMirror.copyState(jsMode, this.jsState);

    res.innerMode = this.innerMode;
    if (this.innerMode && this.innerState) {
      res.innerState = CodeMirror.copyState(this.innerMode, this.innerState);
    }

    res.restOfLine = this.restOfLine;

    res.isIncludeFiltered = this.isIncludeFiltered;
    res.isEach = this.isEach;
    res.lastTag = this.lastTag;
    res.scriptType = this.scriptType;
    res.isAttrs = this.isAttrs;
    res.attrsNest = this.attrsNest.slice();
    res.inAttributeName = this.inAttributeName;
    res.attributeIsType = this.attributeIsType;
    res.attrValue = this.attrValue;
    res.indentOf = this.indentOf;
    res.indentToken = this.indentToken;

    res.innerModeForLine = this.innerModeForLine;

    return res;
  };

  function javaScript(stream, state) {
    if (stream.sol()) {
      // if javaScriptLine was set at end of line, ignore it
      state.javaScriptLine = false;
      state.javaScriptLineExcludesColon = false;
    }
    if (state.javaScriptLine) {
      if (state.javaScriptLineExcludesColon && stream.peek() === ':') {
        state.javaScriptLine = false;
        state.javaScriptLineExcludesColon = false;
        return;
      }
      var tok = jsMode.token(stream, state.jsState);
      if (stream.eol()) state.javaScriptLine = false;
      return tok || true;
    }
  }
  function javaScriptArguments(stream, state) {
    if (state.javaScriptArguments) {
      if (state.javaScriptArgumentsDepth === 0 && stream.peek() !== '(') {
        state.javaScriptArguments = false;
        return;
      }
      if (stream.peek() === '(') {
        state.javaScriptArgumentsDepth++;
      } else if (stream.peek() === ')') {
        state.javaScriptArgumentsDepth--;
      }
      if (state.javaScriptArgumentsDepth === 0) {
        state.javaScriptArguments = false;
        return;
      }

      var tok = jsMode.token(stream, state.jsState);
      return tok || true;
    }
  }

  function yieldStatement(stream) {
    if (stream.match(/^yield\b/)) {
        return 'keyword';
    }
  }

  function doctype(stream) {
    if (stream.match(/^(?:doctype) *([^\n]+)?/)) {
        return DOCTYPE;
    }
  }

  function interpolation(stream, state) {
    if (stream.match('#{')) {
      state.isInterpolating = true;
      state.interpolationNesting = 0;
      return 'punctuation';
    }
  }

  function interpolationContinued(stream, state) {
    if (state.isInterpolating) {
      if (stream.peek() === '}') {
        state.interpolationNesting--;
        if (state.interpolationNesting < 0) {
          stream.next();
          state.isInterpolating = false;
          return 'punctuation';
        }
      } else if (stream.peek() === '{') {
        state.interpolationNesting++;
      }
      return jsMode.token(stream, state.jsState) || true;
    }
  }

  function caseStatement(stream, state) {
    if (stream.match(/^case\b/)) {
      state.javaScriptLine = true;
      return KEYWORD;
    }
  }

  function when(stream, state) {
    if (stream.match(/^when\b/)) {
      state.javaScriptLine = true;
      state.javaScriptLineExcludesColon = true;
      return KEYWORD;
    }
  }

  function defaultStatement(stream) {
    if (stream.match(/^default\b/)) {
      return KEYWORD;
    }
  }

  function extendsStatement(stream, state) {
    if (stream.match(/^extends?\b/)) {
      state.restOfLine = 'string';
      return KEYWORD;
    }
  }

  function append(stream, state) {
    if (stream.match(/^append\b/)) {
      state.restOfLine = 'variable';
      return KEYWORD;
    }
  }
  function prepend(stream, state) {
    if (stream.match(/^prepend\b/)) {
      state.restOfLine = 'variable';
      return KEYWORD;
    }
  }
  function block(stream, state) {
    if (stream.match(/^block\b *(?:(prepend|append)\b)?/)) {
      state.restOfLine = 'variable';
      return KEYWORD;
    }
  }

  function include(stream, state) {
    if (stream.match(/^include\b/)) {
      state.restOfLine = 'string';
      return KEYWORD;
    }
  }

  function includeFiltered(stream, state) {
    if (stream.match(/^include:([a-zA-Z0-9\-]+)/, false) && stream.match('include')) {
      state.isIncludeFiltered = true;
      return KEYWORD;
    }
  }

  function includeFilteredContinued(stream, state) {
    if (state.isIncludeFiltered) {
      var tok = filter(stream, state);
      state.isIncludeFiltered = false;
      state.restOfLine = 'string';
      return tok;
    }
  }

  function mixin(stream, state) {
    if (stream.match(/^mixin\b/)) {
      state.javaScriptLine = true;
      return KEYWORD;
    }
  }

  function call(stream, state) {
    if (stream.match(/^\+([-\w]+)/)) {
      if (!stream.match(/^\( *[-\w]+ *=/, false)) {
        state.javaScriptArguments = true;
        state.javaScriptArgumentsDepth = 0;
      }
      return 'variable';
    }
    if (stream.match(/^\+#{/, false)) {
      stream.next();
      state.mixinCallAfter = true;
      return interpolation(stream, state);
    }
  }
  function callArguments(stream, state) {
    if (state.mixinCallAfter) {
      state.mixinCallAfter = false;
      if (!stream.match(/^\( *[-\w]+ *=/, false)) {
        state.javaScriptArguments = true;
        state.javaScriptArgumentsDepth = 0;
      }
      return true;
    }
  }

  function conditional(stream, state) {
    if (stream.match(/^(if|unless|else if|else)\b/)) {
      state.javaScriptLine = true;
      return KEYWORD;
    }
  }

  function each(stream, state) {
    if (stream.match(/^(- *)?(each|for)\b/)) {
      state.isEach = true;
      return KEYWORD;
    }
  }
  function eachContinued(stream, state) {
    if (state.isEach) {
      if (stream.match(/^ in\b/)) {
        state.javaScriptLine = true;
        state.isEach = false;
        return KEYWORD;
      } else if (stream.sol() || stream.eol()) {
        state.isEach = false;
      } else if (stream.next()) {
        while (!stream.match(/^ in\b/, false) && stream.next());
        return 'variable';
      }
    }
  }

  function whileStatement(stream, state) {
    if (stream.match(/^while\b/)) {
      state.javaScriptLine = true;
      return KEYWORD;
    }
  }

  function tag(stream, state) {
    var captures;
    if (captures = stream.match(/^(\w(?:[-:\w]*\w)?)\/?/)) {
      state.lastTag = captures[1].toLowerCase();
      if (state.lastTag === 'script') {
        state.scriptType = 'application/javascript';
      }
      return 'tag';
    }
  }

  function filter(stream, state) {
    if (stream.match(/^:([\w\-]+)/)) {
      var innerMode;
      if (config && config.innerModes) {
        innerMode = config.innerModes(stream.current().substring(1));
      }
      if (!innerMode) {
        innerMode = stream.current().substring(1);
      }
      if (typeof innerMode === 'string') {
        innerMode = CodeMirror.getMode(config, innerMode);
      }
      setInnerMode(stream, state, innerMode);
      return 'atom';
    }
  }

  function code(stream, state) {
    if (stream.match(/^(!?=|-)/)) {
      state.javaScriptLine = true;
      return 'punctuation';
    }
  }

  function id(stream) {
    if (stream.match(/^#([\w-]+)/)) {
      return ID;
    }
  }

  function className(stream) {
    if (stream.match(/^\.([\w-]+)/)) {
      return CLASS;
    }
  }

  function attrs(stream, state) {
    if (stream.peek() == '(') {
      stream.next();
      state.isAttrs = true;
      state.attrsNest = [];
      state.inAttributeName = true;
      state.attrValue = '';
      state.attributeIsType = false;
      return 'punctuation';
    }
  }

  function attrsContinued(stream, state) {
    if (state.isAttrs) {
      if (ATTRS_NEST[stream.peek()]) {
        state.attrsNest.push(ATTRS_NEST[stream.peek()]);
      }
      if (state.attrsNest[state.attrsNest.length - 1] === stream.peek()) {
        state.attrsNest.pop();
      } else  if (stream.eat(')')) {
        state.isAttrs = false;
        return 'punctuation';
      }
      if (state.inAttributeName && stream.match(/^[^=,\)!]+/)) {
        if (stream.peek() === '=' || stream.peek() === '!') {
          state.inAttributeName = false;
          state.jsState = CodeMirror.startState(jsMode);
          if (state.lastTag === 'script' && stream.current().trim().toLowerCase() === 'type') {
            state.attributeIsType = true;
          } else {
            state.attributeIsType = false;
          }
        }
        return 'attribute';
      }

      var tok = jsMode.token(stream, state.jsState);
      if (state.attributeIsType && tok === 'string') {
        state.scriptType = stream.current().toString();
      }
      if (state.attrsNest.length === 0 && (tok === 'string' || tok === 'variable' || tok === 'keyword')) {
        try {
          Function('', 'var x ' + state.attrValue.replace(/,\s*$/, '').replace(/^!/, ''));
          state.inAttributeName = true;
          state.attrValue = '';
          stream.backUp(stream.current().length);
          return attrsContinued(stream, state);
        } catch (ex) {
          //not the end of an attribute
        }
      }
      state.attrValue += stream.current();
      return tok || true;
    }
  }

  function attributesBlock(stream, state) {
    if (stream.match(/^&attributes\b/)) {
      state.javaScriptArguments = true;
      state.javaScriptArgumentsDepth = 0;
      return 'keyword';
    }
  }

  function indent(stream) {
    if (stream.sol() && stream.eatSpace()) {
      return 'indent';
    }
  }

  function comment(stream, state) {
    if (stream.match(/^ *\/\/(-)?([^\n]*)/)) {
      state.indentOf = stream.indentation();
      state.indentToken = 'comment';
      return 'comment';
    }
  }

  function colon(stream) {
    if (stream.match(/^: */)) {
      return 'colon';
    }
  }

  function text(stream, state) {
    if (stream.match(/^(?:\| ?| )([^\n]+)/)) {
      return 'string';
    }
    if (stream.match(/^(<[^\n]*)/, false)) {
      // html string
      setInnerMode(stream, state, 'htmlmixed');
      state.innerModeForLine = true;
      return innerMode(stream, state, true);
    }
  }

  function dot(stream, state) {
    if (stream.eat('.')) {
      var innerMode = null;
      if (state.lastTag === 'script' && state.scriptType.toLowerCase().indexOf('javascript') != -1) {
        innerMode = state.scriptType.toLowerCase().replace(/"|'/g, '');
      } else if (state.lastTag === 'style') {
        innerMode = 'css';
      }
      setInnerMode(stream, state, innerMode);
      return 'dot';
    }
  }

  function fail(stream) {
    stream.next();
    return null;
  }


  function setInnerMode(stream, state, mode) {
    mode = CodeMirror.mimeModes[mode] || mode;
    mode = config.innerModes ? config.innerModes(mode) || mode : mode;
    mode = CodeMirror.mimeModes[mode] || mode;
    mode = CodeMirror.getMode(config, mode);
    state.indentOf = stream.indentation();

    if (mode && mode.name !== 'null') {
      state.innerMode = mode;
    } else {
      state.indentToken = 'string';
    }
  }
  function innerMode(stream, state, force) {
    if (stream.indentation() > state.indentOf || (state.innerModeForLine && !stream.sol()) || force) {
      if (state.innerMode) {
        if (!state.innerState) {
          state.innerState = state.innerMode.startState ? CodeMirror.startState(state.innerMode, stream.indentation()) : {};
        }
        return stream.hideFirstChars(state.indentOf + 2, function () {
          return state.innerMode.token(stream, state.innerState) || true;
        });
      } else {
        stream.skipToEnd();
        return state.indentToken;
      }
    } else if (stream.sol()) {
      state.indentOf = Infinity;
      state.indentToken = null;
      state.innerMode = null;
      state.innerState = null;
    }
  }
  function restOfLine(stream, state) {
    if (stream.sol()) {
      // if restOfLine was set at end of line, ignore it
      state.restOfLine = '';
    }
    if (state.restOfLine) {
      stream.skipToEnd();
      var tok = state.restOfLine;
      state.restOfLine = '';
      return tok;
    }
  }


  function startState() {
    return new State();
  }
  function copyState(state) {
    return state.copy();
  }
  /**
   * Get the next token in the stream
   *
   * @param {Stream} stream
   * @param {State} state
   */
  function nextToken(stream, state) {
    var tok = innerMode(stream, state)
      || restOfLine(stream, state)
      || interpolationContinued(stream, state)
      || includeFilteredContinued(stream, state)
      || eachContinued(stream, state)
      || attrsContinued(stream, state)
      || javaScript(stream, state)
      || javaScriptArguments(stream, state)
      || callArguments(stream, state)

      || yieldStatement(stream, state)
      || doctype(stream, state)
      || interpolation(stream, state)
      || caseStatement(stream, state)
      || when(stream, state)
      || defaultStatement(stream, state)
      || extendsStatement(stream, state)
      || append(stream, state)
      || prepend(stream, state)
      || block(stream, state)
      || include(stream, state)
      || includeFiltered(stream, state)
      || mixin(stream, state)
      || call(stream, state)
      || conditional(stream, state)
      || each(stream, state)
      || whileStatement(stream, state)
      || tag(stream, state)
      || filter(stream, state)
      || code(stream, state)
      || id(stream, state)
      || className(stream, state)
      || attrs(stream, state)
      || attributesBlock(stream, state)
      || indent(stream, state)
      || text(stream, state)
      || comment(stream, state)
      || colon(stream, state)
      || dot(stream, state)
      || fail(stream, state);

    return tok === true ? null : tok;
  }
  return {
    startState: startState,
    copyState: copyState,
    token: nextToken
  };
}, 'javascript', 'css', 'htmlmixed');

CodeMirror.defineMIME('text/x-pug', 'pug');
CodeMirror.defineMIME('text/x-jade', 'pug');

});
codemirror/mode/tcl/tcl.js000064400000011470151215013510011534 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

//tcl mode by Ford_Lawnmower :: Based on Velocity mode by Steve O'Hara

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("tcl", function() {
  function parseWords(str) {
    var obj = {}, words = str.split(" ");
    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
    return obj;
  }
  var keywords = parseWords("Tcl safe after append array auto_execok auto_import auto_load " +
        "auto_mkindex auto_mkindex_old auto_qualify auto_reset bgerror " +
        "binary break catch cd close concat continue dde eof encoding error " +
        "eval exec exit expr fblocked fconfigure fcopy file fileevent filename " +
        "filename flush for foreach format gets glob global history http if " +
        "incr info interp join lappend lindex linsert list llength load lrange " +
        "lreplace lsearch lset lsort memory msgcat namespace open package parray " +
        "pid pkg::create pkg_mkIndex proc puts pwd re_syntax read regex regexp " +
        "registry regsub rename resource return scan seek set socket source split " +
        "string subst switch tcl_endOfWord tcl_findLibrary tcl_startOfNextWord " +
        "tcl_wordBreakAfter tcl_startOfPreviousWord tcl_wordBreakBefore tcltest " +
        "tclvars tell time trace unknown unset update uplevel upvar variable " +
    "vwait");
    var functions = parseWords("if elseif else and not or eq ne in ni for foreach while switch");
    var isOperatorChar = /[+\-*&%=<>!?^\/\|]/;
    function chain(stream, state, f) {
      state.tokenize = f;
      return f(stream, state);
    }
    function tokenBase(stream, state) {
      var beforeParams = state.beforeParams;
      state.beforeParams = false;
      var ch = stream.next();
      if ((ch == '"' || ch == "'") && state.inParams) {
        return chain(stream, state, tokenString(ch));
      } else if (/[\[\]{}\(\),;\.]/.test(ch)) {
        if (ch == "(" && beforeParams) state.inParams = true;
        else if (ch == ")") state.inParams = false;
          return null;
      } else if (/\d/.test(ch)) {
        stream.eatWhile(/[\w\.]/);
        return "number";
      } else if (ch == "#") {
        if (stream.eat("*"))
          return chain(stream, state, tokenComment);
        if (ch == "#" && stream.match(/ *\[ *\[/))
          return chain(stream, state, tokenUnparsed);
        stream.skipToEnd();
        return "comment";
      } else if (ch == '"') {
        stream.skipTo(/"/);
        return "comment";
      } else if (ch == "$") {
        stream.eatWhile(/[$_a-z0-9A-Z\.{:]/);
        stream.eatWhile(/}/);
        state.beforeParams = true;
        return "builtin";
      } else if (isOperatorChar.test(ch)) {
        stream.eatWhile(isOperatorChar);
        return "comment";
      } else {
        stream.eatWhile(/[\w\$_{}\xa1-\uffff]/);
        var word = stream.current().toLowerCase();
        if (keywords && keywords.propertyIsEnumerable(word))
          return "keyword";
        if (functions && functions.propertyIsEnumerable(word)) {
          state.beforeParams = true;
          return "keyword";
        }
        return null;
      }
    }
    function tokenString(quote) {
      return function(stream, state) {
      var escaped = false, next, end = false;
      while ((next = stream.next()) != null) {
        if (next == quote && !escaped) {
          end = true;
          break;
        }
        escaped = !escaped && next == "\\";
      }
      if (end) state.tokenize = tokenBase;
        return "string";
      };
    }
    function tokenComment(stream, state) {
      var maybeEnd = false, ch;
      while (ch = stream.next()) {
        if (ch == "#" && maybeEnd) {
          state.tokenize = tokenBase;
          break;
        }
        maybeEnd = (ch == "*");
      }
      return "comment";
    }
    function tokenUnparsed(stream, state) {
      var maybeEnd = 0, ch;
      while (ch = stream.next()) {
        if (ch == "#" && maybeEnd == 2) {
          state.tokenize = tokenBase;
          break;
        }
        if (ch == "]")
          maybeEnd++;
        else if (ch != " ")
          maybeEnd = 0;
      }
      return "meta";
    }
    return {
      startState: function() {
        return {
          tokenize: tokenBase,
          beforeParams: false,
          inParams: false
        };
      },
      token: function(stream, state) {
        if (stream.eatSpace()) return null;
        return state.tokenize(stream, state);
      }
    };
});
CodeMirror.defineMIME("text/x-tcl", "tcl");

});
codemirror/mode/tcl/index.html000064400000014231151215013510012407 0ustar00<!doctype html>

<title>CodeMirror: Tcl mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<link rel="stylesheet" href="../../theme/night.css">
<script src="../../lib/codemirror.js"></script>
<script src="tcl.js"></script>
<script src="../../addon/scroll/scrollpastend.js"></script>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Tcl</a>
  </ul>
</div>

<article>
<h2>Tcl mode</h2>
<form><textarea id="code" name="code">
##############################################################################################
##  ##     whois.tcl for eggdrop by Ford_Lawnmower irc.geekshed.net #Script-Help        ##  ##
##############################################################################################
## To use this script you must set channel flag +whois (ie .chanset #chan +whois)           ##
##############################################################################################
##      ____                __                 ###########################################  ##
##     / __/___ _ ___ _ ___/ /____ ___   ___   ###########################################  ##
##    / _/ / _ `// _ `// _  // __// _ \ / _ \  ###########################################  ##
##   /___/ \_, / \_, / \_,_//_/   \___// .__/  ###########################################  ##
##        /___/ /___/                 /_/      ###########################################  ##
##                                             ###########################################  ##
##############################################################################################
##  ##                             Start Setup.                                         ##  ##
##############################################################################################
namespace eval whois {
## change cmdchar to the trigger you want to use                                        ##  ##
  variable cmdchar "!"
## change command to the word trigger you would like to use.                            ##  ##
## Keep in mind, This will also change the .chanset +/-command                          ##  ##
  variable command "whois"
## change textf to the colors you want for the text.                                    ##  ##
  variable textf "\017\00304"
## change tagf to the colors you want for tags:                                         ##  ##
  variable tagf "\017\002"
## Change logo to the logo you want at the start of the line.                           ##  ##
  variable logo "\017\00304\002\[\00306W\003hois\00304\]\017"
## Change lineout to the results you want. Valid results are channel users modes topic  ##  ##
  variable lineout "channel users modes topic"
##############################################################################################
##  ##                           End Setup.                                              ## ##
##############################################################################################
  variable channel ""
  setudef flag $whois::command
  bind pub -|- [string trimleft $whois::cmdchar]${whois::command} whois::list
  bind raw -|- "311" whois::311
  bind raw -|- "312" whois::312
  bind raw -|- "319" whois::319
  bind raw -|- "317" whois::317
  bind raw -|- "313" whois::multi
  bind raw -|- "310" whois::multi
  bind raw -|- "335" whois::multi
  bind raw -|- "301" whois::301
  bind raw -|- "671" whois::multi
  bind raw -|- "320" whois::multi
  bind raw -|- "401" whois::multi
  bind raw -|- "318" whois::318
  bind raw -|- "307" whois::307
}
proc whois::311 {from key text} {
  if {[regexp -- {^[^\s]+\s(.+?)\s(.+?)\s(.+?)\s\*\s\:(.+)$} $text wholematch nick ident host realname]} {
    putserv "PRIVMSG $whois::channel :${whois::logo} ${whois::tagf}Host:${whois::textf} \
        $nick \(${ident}@${host}\) ${whois::tagf}Realname:${whois::textf} $realname"
  }
}
proc whois::multi {from key text} {
  if {[regexp {\:(.*)$} $text match $key]} {
    putserv "PRIVMSG $whois::channel :${whois::logo} ${whois::tagf}Note:${whois::textf} [subst $$key]"
        return 1
  }
}
proc whois::312 {from key text} {
  regexp {([^\s]+)\s\:} $text match server
  putserv "PRIVMSG $whois::channel :${whois::logo} ${whois::tagf}Server:${whois::textf} $server"
}
proc whois::319 {from key text} {
  if {[regexp {.+\:(.+)$} $text match channels]} {
    putserv "PRIVMSG $whois::channel :${whois::logo} ${whois::tagf}Channels:${whois::textf} $channels"
  }
}
proc whois::317 {from key text} {
  if {[regexp -- {.*\s(\d+)\s(\d+)\s\:} $text wholematch idle signon]} {
    putserv "PRIVMSG $whois::channel :${whois::logo} ${whois::tagf}Connected:${whois::textf} \
        [ctime $signon] ${whois::tagf}Idle:${whois::textf} [duration $idle]"
  }
}
proc whois::301 {from key text} {
  if {[regexp {^.+\s[^\s]+\s\:(.*)$} $text match awaymsg]} {
    putserv "PRIVMSG $whois::channel :${whois::logo} ${whois::tagf}Away:${whois::textf} $awaymsg"
  }
}
proc whois::318 {from key text} {
  namespace eval whois {
        variable channel ""
  }
  variable whois::channel ""
}
proc whois::307 {from key text} {
  putserv "PRIVMSG $whois::channel :${whois::logo} ${whois::tagf}Services:${whois::textf} Registered Nick"
}
proc whois::list {nick host hand chan text} {
  if {[lsearch -exact [channel info $chan] "+${whois::command}"] != -1} {
    namespace eval whois {
          variable channel ""
        }
    variable whois::channel $chan
    putserv "WHOIS $text"
  }
}
putlog "\002*Loaded* \017\00304\002\[\00306W\003hois\00304\]\017 \002by \
Ford_Lawnmower irc.GeekShed.net #Script-Help"
</textarea></form>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        theme: "night",
        lineNumbers: true,
        indentUnit: 2,
        scrollPastEnd: true,
        mode: "text/x-tcl"
      });
    </script>

    <p><strong>MIME types defined:</strong> <code>text/x-tcl</code>.</p>

  </article>
codemirror/mode/jsx/jsx.js000064400000012113151215013510011573 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"), require("../xml/xml"), require("../javascript/javascript"))
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror", "../xml/xml", "../javascript/javascript"], mod)
  else // Plain browser env
    mod(CodeMirror)
})(function(CodeMirror) {
  "use strict"

  // Depth means the amount of open braces in JS context, in XML
  // context 0 means not in tag, 1 means in tag, and 2 means in tag
  // and js block comment.
  function Context(state, mode, depth, prev) {
    this.state = state; this.mode = mode; this.depth = depth; this.prev = prev
  }

  function copyContext(context) {
    return new Context(CodeMirror.copyState(context.mode, context.state),
                       context.mode,
                       context.depth,
                       context.prev && copyContext(context.prev))
  }

  CodeMirror.defineMode("jsx", function(config, modeConfig) {
    var xmlMode = CodeMirror.getMode(config, {name: "xml", allowMissing: true, multilineTagIndentPastTag: false})
    var jsMode = CodeMirror.getMode(config, modeConfig && modeConfig.base || "javascript")

    function flatXMLIndent(state) {
      var tagName = state.tagName
      state.tagName = null
      var result = xmlMode.indent(state, "")
      state.tagName = tagName
      return result
    }

    function token(stream, state) {
      if (state.context.mode == xmlMode)
        return xmlToken(stream, state, state.context)
      else
        return jsToken(stream, state, state.context)
    }

    function xmlToken(stream, state, cx) {
      if (cx.depth == 2) { // Inside a JS /* */ comment
        if (stream.match(/^.*?\*\//)) cx.depth = 1
        else stream.skipToEnd()
        return "comment"
      }

      if (stream.peek() == "{") {
        xmlMode.skipAttribute(cx.state)

        var indent = flatXMLIndent(cx.state), xmlContext = cx.state.context
        // If JS starts on same line as tag
        if (xmlContext && stream.match(/^[^>]*>\s*$/, false)) {
          while (xmlContext.prev && !xmlContext.startOfLine)
            xmlContext = xmlContext.prev
          // If tag starts the line, use XML indentation level
          if (xmlContext.startOfLine) indent -= config.indentUnit
          // Else use JS indentation level
          else if (cx.prev.state.lexical) indent = cx.prev.state.lexical.indented
        // Else if inside of tag
        } else if (cx.depth == 1) {
          indent += config.indentUnit
        }

        state.context = new Context(CodeMirror.startState(jsMode, indent),
                                    jsMode, 0, state.context)
        return null
      }

      if (cx.depth == 1) { // Inside of tag
        if (stream.peek() == "<") { // Tag inside of tag
          xmlMode.skipAttribute(cx.state)
          state.context = new Context(CodeMirror.startState(xmlMode, flatXMLIndent(cx.state)),
                                      xmlMode, 0, state.context)
          return null
        } else if (stream.match("//")) {
          stream.skipToEnd()
          return "comment"
        } else if (stream.match("/*")) {
          cx.depth = 2
          return token(stream, state)
        }
      }

      var style = xmlMode.token(stream, cx.state), cur = stream.current(), stop
      if (/\btag\b/.test(style)) {
        if (/>$/.test(cur)) {
          if (cx.state.context) cx.depth = 0
          else state.context = state.context.prev
        } else if (/^</.test(cur)) {
          cx.depth = 1
        }
      } else if (!style && (stop = cur.indexOf("{")) > -1) {
        stream.backUp(cur.length - stop)
      }
      return style
    }

    function jsToken(stream, state, cx) {
      if (stream.peek() == "<" && jsMode.expressionAllowed(stream, cx.state)) {
        jsMode.skipExpression(cx.state)
        state.context = new Context(CodeMirror.startState(xmlMode, jsMode.indent(cx.state, "")),
                                    xmlMode, 0, state.context)
        return null
      }

      var style = jsMode.token(stream, cx.state)
      if (!style && cx.depth != null) {
        var cur = stream.current()
        if (cur == "{") {
          cx.depth++
        } else if (cur == "}") {
          if (--cx.depth == 0) state.context = state.context.prev
        }
      }
      return style
    }

    return {
      startState: function() {
        return {context: new Context(CodeMirror.startState(jsMode), jsMode)}
      },

      copyState: function(state) {
        return {context: copyContext(state.context)}
      },

      token: token,

      indent: function(state, textAfter, fullLine) {
        return state.context.mode.indent(state.context.state, textAfter, fullLine)
      },

      innerMode: function(state) {
        return state.context
      }
    }
  }, "xml", "javascript")

  CodeMirror.defineMIME("text/jsx", "jsx")
  CodeMirror.defineMIME("text/typescript-jsx", {name: "jsx", base: {name: "javascript", typescript: true}})
});
codemirror/mode/jsx/index.html000064400000004552151215013510012436 0ustar00<!doctype html>

<title>CodeMirror: JSX mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../javascript/javascript.js"></script>
<script src="../xml/xml.js"></script>
<script src="jsx.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">JSX</a>
  </ul>
</div>

<article>
<h2>JSX mode</h2>

<div><textarea id="code" name="code">// Code snippets from http://facebook.github.io/react/docs/jsx-in-depth.html

// Rendering HTML tags
var myDivElement = <div className="foo" />;
ReactDOM.render(myDivElement, document.getElementById('example'));

// Rendering React components
var MyComponent = React.createClass({/*...*/});
var myElement = <MyComponent someProperty={true} />;
ReactDOM.render(myElement, document.getElementById('example'));

// Namespaced components
var Form = MyFormComponent;

var App = (
  <Form>
    <Form.Row>
      <Form.Label />
      <Form.Input />
    </Form.Row>
  </Form>
);

// Attribute JavaScript expressions
var person = <Person name={window.isLoggedIn ? window.name : ''} />;

// Boolean attributes
<input type="button" disabled />;
<input type="button" disabled={true} />;

// Child JavaScript expressions
var content = <Container>{window.isLoggedIn ? <Nav /> : <Login />}</Container>;

// Comments
var content = (
  <Nav>
    {/* child comment, put {} around */}
    <Person
      /* multi
         line
         comment */
      name={window.isLoggedIn ? window.name : ''} // end of line comment
    />
  </Nav>
);
</textarea></div>

<script>
var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
  lineNumbers: true,
  mode: "jsx"
})
</script>

<p>JSX Mode for <a href="http://facebook.github.io/react">React</a>'s
JavaScript syntax extension.</p>

<p><strong>MIME types defined:</strong> <code>text/jsx</code>, <code>text/typescript-jsx</code>.</p>

</article>
codemirror/mode/jsx/test.js000064400000005626151215013510011761 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function() {
  var mode = CodeMirror.getMode({indentUnit: 2}, "jsx")
  function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)) }

  MT("selfclose",
     "[keyword var] [def x] [operator =] [bracket&tag <] [tag foo] [bracket&tag />] [operator +] [number 1];")

  MT("openclose",
     "([bracket&tag <][tag foo][bracket&tag >]hello [atom &amp;][bracket&tag </][tag foo][bracket&tag >][operator ++])")

  MT("attr",
     "([bracket&tag <][tag foo] [attribute abc]=[string 'value'][bracket&tag >]hello [atom &amp;][bracket&tag </][tag foo][bracket&tag >][operator ++])")

  MT("braced_attr",
     "([bracket&tag <][tag foo] [attribute abc]={[number 10]}[bracket&tag >]hello [atom &amp;][bracket&tag </][tag foo][bracket&tag >][operator ++])")

  MT("braced_text",
     "([bracket&tag <][tag foo][bracket&tag >]hello {[number 10]} [atom &amp;][bracket&tag </][tag foo][bracket&tag >][operator ++])")

  MT("nested_tag",
     "([bracket&tag <][tag foo][bracket&tag ><][tag bar][bracket&tag ></][tag bar][bracket&tag ></][tag foo][bracket&tag >][operator ++])")

  MT("nested_jsx",
     "[keyword return] (",
     "  [bracket&tag <][tag foo][bracket&tag >]",
     "    say {[number 1] [operator +] [bracket&tag <][tag bar] [attribute attr]={[number 10]}[bracket&tag />]}!",
     "  [bracket&tag </][tag foo][bracket&tag >][operator ++]",
     ")")

  MT("preserve_js_context",
     "[variable x] [operator =] [string-2 `quasi${][bracket&tag <][tag foo][bracket&tag />][string-2 }quoted`]")

  MT("line_comment",
     "([bracket&tag <][tag foo] [comment // hello]",
     "   [bracket&tag ></][tag foo][bracket&tag >][operator ++])")

  MT("line_comment_not_in_tag",
     "([bracket&tag <][tag foo][bracket&tag >] // hello",
     "  [bracket&tag </][tag foo][bracket&tag >][operator ++])")

  MT("block_comment",
     "([bracket&tag <][tag foo] [comment /* hello]",
     "[comment    line 2]",
     "[comment    line 3 */] [bracket&tag ></][tag foo][bracket&tag >][operator ++])")

  MT("block_comment_not_in_tag",
     "([bracket&tag <][tag foo][bracket&tag >]/* hello",
     "    line 2",
     "    line 3 */ [bracket&tag </][tag foo][bracket&tag >][operator ++])")

  MT("missing_attr",
     "([bracket&tag <][tag foo] [attribute selected][bracket&tag />][operator ++])")

  MT("indent_js",
     "([bracket&tag <][tag foo][bracket&tag >]",
     "    [bracket&tag <][tag bar] [attribute baz]={[keyword function]() {",
     "        [keyword return] [number 10]",
     "      }}[bracket&tag />]",
     "  [bracket&tag </][tag foo][bracket&tag >])")

  MT("spread",
     "([bracket&tag <][tag foo] [attribute bar]={[meta ...][variable baz] [operator /][number 2]}[bracket&tag />])")

  MT("tag_attribute",
     "([bracket&tag <][tag foo] [attribute bar]=[bracket&tag <][tag foo][bracket&tag />/>][operator ++])")
})()
codemirror/mode/htmlmixed/htmlmixed.js000064400000012726151215013510014163 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"), require("../xml/xml"), require("../javascript/javascript"), require("../css/css"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror", "../xml/xml", "../javascript/javascript", "../css/css"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  var defaultTags = {
    script: [
      ["lang", /(javascript|babel)/i, "javascript"],
      ["type", /^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^$/i, "javascript"],
      ["type", /./, "text/plain"],
      [null, null, "javascript"]
    ],
    style:  [
      ["lang", /^css$/i, "css"],
      ["type", /^(text\/)?(x-)?(stylesheet|css)$/i, "css"],
      ["type", /./, "text/plain"],
      [null, null, "css"]
    ]
  };

  function maybeBackup(stream, pat, style) {
    var cur = stream.current(), close = cur.search(pat);
    if (close > -1) {
      stream.backUp(cur.length - close);
    } else if (cur.match(/<\/?$/)) {
      stream.backUp(cur.length);
      if (!stream.match(pat, false)) stream.match(cur);
    }
    return style;
  }

  var attrRegexpCache = {};
  function getAttrRegexp(attr) {
    var regexp = attrRegexpCache[attr];
    if (regexp) return regexp;
    return attrRegexpCache[attr] = new RegExp("\\s+" + attr + "\\s*=\\s*('|\")?([^'\"]+)('|\")?\\s*");
  }

  function getAttrValue(text, attr) {
    var match = text.match(getAttrRegexp(attr))
    return match ? /^\s*(.*?)\s*$/.exec(match[2])[1] : ""
  }

  function getTagRegexp(tagName, anchored) {
    return new RegExp((anchored ? "^" : "") + "<\/\s*" + tagName + "\s*>", "i");
  }

  function addTags(from, to) {
    for (var tag in from) {
      var dest = to[tag] || (to[tag] = []);
      var source = from[tag];
      for (var i = source.length - 1; i >= 0; i--)
        dest.unshift(source[i])
    }
  }

  function findMatchingMode(tagInfo, tagText) {
    for (var i = 0; i < tagInfo.length; i++) {
      var spec = tagInfo[i];
      if (!spec[0] || spec[1].test(getAttrValue(tagText, spec[0]))) return spec[2];
    }
  }

  CodeMirror.defineMode("htmlmixed", function (config, parserConfig) {
    var htmlMode = CodeMirror.getMode(config, {
      name: "xml",
      htmlMode: true,
      multilineTagIndentFactor: parserConfig.multilineTagIndentFactor,
      multilineTagIndentPastTag: parserConfig.multilineTagIndentPastTag
    });

    var tags = {};
    var configTags = parserConfig && parserConfig.tags, configScript = parserConfig && parserConfig.scriptTypes;
    addTags(defaultTags, tags);
    if (configTags) addTags(configTags, tags);
    if (configScript) for (var i = configScript.length - 1; i >= 0; i--)
      tags.script.unshift(["type", configScript[i].matches, configScript[i].mode])

    function html(stream, state) {
      var style = htmlMode.token(stream, state.htmlState), tag = /\btag\b/.test(style), tagName
      if (tag && !/[<>\s\/]/.test(stream.current()) &&
          (tagName = state.htmlState.tagName && state.htmlState.tagName.toLowerCase()) &&
          tags.hasOwnProperty(tagName)) {
        state.inTag = tagName + " "
      } else if (state.inTag && tag && />$/.test(stream.current())) {
        var inTag = /^([\S]+) (.*)/.exec(state.inTag)
        state.inTag = null
        var modeSpec = stream.current() == ">" && findMatchingMode(tags[inTag[1]], inTag[2])
        var mode = CodeMirror.getMode(config, modeSpec)
        var endTagA = getTagRegexp(inTag[1], true), endTag = getTagRegexp(inTag[1], false);
        state.token = function (stream, state) {
          if (stream.match(endTagA, false)) {
            state.token = html;
            state.localState = state.localMode = null;
            return null;
          }
          return maybeBackup(stream, endTag, state.localMode.token(stream, state.localState));
        };
        state.localMode = mode;
        state.localState = CodeMirror.startState(mode, htmlMode.indent(state.htmlState, ""));
      } else if (state.inTag) {
        state.inTag += stream.current()
        if (stream.eol()) state.inTag += " "
      }
      return style;
    };

    return {
      startState: function () {
        var state = CodeMirror.startState(htmlMode);
        return {token: html, inTag: null, localMode: null, localState: null, htmlState: state};
      },

      copyState: function (state) {
        var local;
        if (state.localState) {
          local = CodeMirror.copyState(state.localMode, state.localState);
        }
        return {token: state.token, inTag: state.inTag,
                localMode: state.localMode, localState: local,
                htmlState: CodeMirror.copyState(htmlMode, state.htmlState)};
      },

      token: function (stream, state) {
        return state.token(stream, state);
      },

      indent: function (state, textAfter) {
        if (!state.localMode || /^\s*<\//.test(textAfter))
          return htmlMode.indent(state.htmlState, textAfter);
        else if (state.localMode.indent)
          return state.localMode.indent(state.localState, textAfter);
        else
          return CodeMirror.Pass;
      },

      innerMode: function (state) {
        return {state: state.localState || state.htmlState, mode: state.localMode || htmlMode};
      }
    };
  }, "xml", "javascript", "css");

  CodeMirror.defineMIME("text/html", "htmlmixed");
});
codemirror/mode/htmlmixed/index.html000064400000005772151215013510013632 0ustar00<!doctype html>

<title>CodeMirror: HTML mixed mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/selection/selection-pointer.js"></script>
<script src="../xml/xml.js"></script>
<script src="../javascript/javascript.js"></script>
<script src="../css/css.js"></script>
<script src="../vbscript/vbscript.js"></script>
<script src="htmlmixed.js"></script>
<style>.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">HTML mixed</a>
  </ul>
</div>

<article>
<h2>HTML mixed mode</h2>
<form><textarea id="code" name="code">
<html style="color: green">
  <!-- this is a comment -->
  <head>
    <title>Mixed HTML Example</title>
    <style type="text/css">
      h1 {font-family: comic sans; color: #f0f;}
      div {background: yellow !important;}
      body {
        max-width: 50em;
        margin: 1em 2em 1em 5em;
      }
    </style>
  </head>
  <body>
    <h1>Mixed HTML Example</h1>
    <script>
      function jsFunc(arg1, arg2) {
        if (arg1 && arg2) document.body.innerHTML = "achoo";
      }
    </script>
  </body>
</html>
</textarea></form>
    <script>
      // Define an extended mixed-mode that understands vbscript and
      // leaves mustache/handlebars embedded templates in html mode
      var mixedMode = {
        name: "htmlmixed",
        scriptTypes: [{matches: /\/x-handlebars-template|\/x-mustache/i,
                       mode: null},
                      {matches: /(text|application)\/(x-)?vb(a|script)/i,
                       mode: "vbscript"}]
      };
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        mode: mixedMode,
        selectionPointer: true
      });
    </script>

    <p>The HTML mixed mode depends on the XML, JavaScript, and CSS modes.</p>

    <p>It takes an optional mode configuration
    option, <code>scriptTypes</code>, which can be used to add custom
    behavior for specific <code>&lt;script type="..."></code> tags. If
    given, it should hold an array of <code>{matches, mode}</code>
    objects, where <code>matches</code> is a string or regexp that
    matches the script type, and <code>mode</code> is
    either <code>null</code>, for script types that should stay in
    HTML mode, or a <a href="../../doc/manual.html#option_mode">mode
    spec</a> corresponding to the mode that should be used for the
    script.</p>

    <p><strong>MIME types defined:</strong> <code>text/html</code>
    (redefined, only takes effect if you load this parser after the
    XML parser).</p>

  </article>
codemirror/mode/ebnf/ebnf.js000064400000013705151215013510012017 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  CodeMirror.defineMode("ebnf", function (config) {
    var commentType = {slash: 0, parenthesis: 1};
    var stateType = {comment: 0, _string: 1, characterClass: 2};
    var bracesMode = null;

    if (config.bracesMode)
      bracesMode = CodeMirror.getMode(config, config.bracesMode);

    return {
      startState: function () {
        return {
          stringType: null,
          commentType: null,
          braced: 0,
          lhs: true,
          localState: null,
          stack: [],
          inDefinition: false
        };
      },
      token: function (stream, state) {
        if (!stream) return;

        //check for state changes
        if (state.stack.length === 0) {
          //strings
          if ((stream.peek() == '"') || (stream.peek() == "'")) {
            state.stringType = stream.peek();
            stream.next(); // Skip quote
            state.stack.unshift(stateType._string);
          } else if (stream.match(/^\/\*/)) { //comments starting with /*
            state.stack.unshift(stateType.comment);
            state.commentType = commentType.slash;
          } else if (stream.match(/^\(\*/)) { //comments starting with (*
            state.stack.unshift(stateType.comment);
            state.commentType = commentType.parenthesis;
          }
        }

        //return state
        //stack has
        switch (state.stack[0]) {
        case stateType._string:
          while (state.stack[0] === stateType._string && !stream.eol()) {
            if (stream.peek() === state.stringType) {
              stream.next(); // Skip quote
              state.stack.shift(); // Clear flag
            } else if (stream.peek() === "\\") {
              stream.next();
              stream.next();
            } else {
              stream.match(/^.[^\\\"\']*/);
            }
          }
          return state.lhs ? "property string" : "string"; // Token style

        case stateType.comment:
          while (state.stack[0] === stateType.comment && !stream.eol()) {
            if (state.commentType === commentType.slash && stream.match(/\*\//)) {
              state.stack.shift(); // Clear flag
              state.commentType = null;
            } else if (state.commentType === commentType.parenthesis && stream.match(/\*\)/)) {
              state.stack.shift(); // Clear flag
              state.commentType = null;
            } else {
              stream.match(/^.[^\*]*/);
            }
          }
          return "comment";

        case stateType.characterClass:
          while (state.stack[0] === stateType.characterClass && !stream.eol()) {
            if (!(stream.match(/^[^\]\\]+/) || stream.match(/^\\./))) {
              state.stack.shift();
            }
          }
          return "operator";
        }

        var peek = stream.peek();

        if (bracesMode !== null && (state.braced || peek === "{")) {
          if (state.localState === null)
            state.localState = CodeMirror.startState(bracesMode);

          var token = bracesMode.token(stream, state.localState),
          text = stream.current();

          if (!token) {
            for (var i = 0; i < text.length; i++) {
              if (text[i] === "{") {
                if (state.braced === 0) {
                  token = "matchingbracket";
                }
                state.braced++;
              } else if (text[i] === "}") {
                state.braced--;
                if (state.braced === 0) {
                  token = "matchingbracket";
                }
              }
            }
          }
          return token;
        }

        //no stack
        switch (peek) {
        case "[":
          stream.next();
          state.stack.unshift(stateType.characterClass);
          return "bracket";
        case ":":
        case "|":
        case ";":
          stream.next();
          return "operator";
        case "%":
          if (stream.match("%%")) {
            return "header";
          } else if (stream.match(/[%][A-Za-z]+/)) {
            return "keyword";
          } else if (stream.match(/[%][}]/)) {
            return "matchingbracket";
          }
          break;
        case "/":
          if (stream.match(/[\/][A-Za-z]+/)) {
          return "keyword";
        }
        case "\\":
          if (stream.match(/[\][a-z]+/)) {
            return "string-2";
          }
        case ".":
          if (stream.match(".")) {
            return "atom";
          }
        case "*":
        case "-":
        case "+":
        case "^":
          if (stream.match(peek)) {
            return "atom";
          }
        case "$":
          if (stream.match("$$")) {
            return "builtin";
          } else if (stream.match(/[$][0-9]+/)) {
            return "variable-3";
          }
        case "<":
          if (stream.match(/<<[a-zA-Z_]+>>/)) {
            return "builtin";
          }
        }

        if (stream.match(/^\/\//)) {
          stream.skipToEnd();
          return "comment";
        } else if (stream.match(/return/)) {
          return "operator";
        } else if (stream.match(/^[a-zA-Z_][a-zA-Z0-9_]*/)) {
          if (stream.match(/(?=[\(.])/)) {
            return "variable";
          } else if (stream.match(/(?=[\s\n]*[:=])/)) {
            return "def";
          }
          return "variable-2";
        } else if (["[", "]", "(", ")"].indexOf(stream.peek()) != -1) {
          stream.next();
          return "bracket";
        } else if (!stream.eatSpace()) {
          stream.next();
        }
        return null;
      }
    };
  });

  CodeMirror.defineMIME("text/x-ebnf", "ebnf");
});
codemirror/mode/ebnf/index.html000064400000004622151215013510012542 0ustar00<!doctype html>
<html>
  <head>
    <title>CodeMirror: EBNF Mode</title>
    <meta charset="utf-8"/>
    <link rel=stylesheet href="../../doc/docs.css">

    <link rel="stylesheet" href="../../lib/codemirror.css">
    <script src="../../lib/codemirror.js"></script>
    <script src="../javascript/javascript.js"></script>
    <script src="ebnf.js"></script>
    <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
  </head>
  <body>
    <div id=nav>
      <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

      <ul>
        <li><a href="../../index.html">Home</a>
        <li><a href="../../doc/manual.html">Manual</a>
        <li><a href="https://github.com/codemirror/codemirror">Code</a>
      </ul>
      <ul>
        <li><a href="../index.html">Language modes</a>
        <li><a class=active href="#">EBNF Mode</a>
      </ul>
    </div>

    <article>
      <h2>EBNF Mode (bracesMode setting = "javascript")</h2>
      <form><textarea id="code" name="code">
/* description: Parses end executes mathematical expressions. */

/* lexical grammar */
%lex

%%
\s+                   /* skip whitespace */
[0-9]+("."[0-9]+)?\b  return 'NUMBER';
"*"                   return '*';
"/"                   return '/';
"-"                   return '-';
"+"                   return '+';
"^"                   return '^';
"("                   return '(';
")"                   return ')';
"PI"                  return 'PI';
"E"                   return 'E';
&lt;&lt;EOF&gt;&gt;               return 'EOF';

/lex

/* operator associations and precedence */

%left '+' '-'
%left '*' '/'
%left '^'
%left UMINUS

%start expressions

%% /* language grammar */

expressions
: e EOF
{print($1); return $1;}
;

e
: e '+' e
{$$ = $1+$3;}
| e '-' e
{$$ = $1-$3;}
| e '*' e
{$$ = $1*$3;}
| e '/' e
{$$ = $1/$3;}
| e '^' e
{$$ = Math.pow($1, $3);}
| '-' e %prec UMINUS
{$$ = -$2;}
| '(' e ')'
{$$ = $2;}
| NUMBER
{$$ = Number(yytext);}
| E
{$$ = Math.E;}
| PI
{$$ = Math.PI;}
;</textarea></form>
      <script>
        var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
          mode: {name: "ebnf"},
          lineNumbers: true,
          bracesMode: 'javascript'
        });
      </script>
      <h3>The EBNF Mode</h3>
      <p> Created by <a href="https://github.com/robertleeplummerjr">Robert Plummer</a></p>
    </article>
  </body>
</html>
codemirror/mode/sql/sql.js000064400000102632151215013510011567 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("sql", function(config, parserConfig) {
  "use strict";

  var client         = parserConfig.client || {},
      atoms          = parserConfig.atoms || {"false": true, "true": true, "null": true},
      builtin        = parserConfig.builtin || {},
      keywords       = parserConfig.keywords || {},
      operatorChars  = parserConfig.operatorChars || /^[*+\-%<>!=&|~^]/,
      support        = parserConfig.support || {},
      hooks          = parserConfig.hooks || {},
      dateSQL        = parserConfig.dateSQL || {"date" : true, "time" : true, "timestamp" : true};

  function tokenBase(stream, state) {
    var ch = stream.next();

    // call hooks from the mime type
    if (hooks[ch]) {
      var result = hooks[ch](stream, state);
      if (result !== false) return result;
    }

    if (support.hexNumber == true &&
      ((ch == "0" && stream.match(/^[xX][0-9a-fA-F]+/))
      || (ch == "x" || ch == "X") && stream.match(/^'[0-9a-fA-F]+'/))) {
      // hex
      // ref: http://dev.mysql.com/doc/refman/5.5/en/hexadecimal-literals.html
      return "number";
    } else if (support.binaryNumber == true &&
      (((ch == "b" || ch == "B") && stream.match(/^'[01]+'/))
      || (ch == "0" && stream.match(/^b[01]+/)))) {
      // bitstring
      // ref: http://dev.mysql.com/doc/refman/5.5/en/bit-field-literals.html
      return "number";
    } else if (ch.charCodeAt(0) > 47 && ch.charCodeAt(0) < 58) {
      // numbers
      // ref: http://dev.mysql.com/doc/refman/5.5/en/number-literals.html
          stream.match(/^[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?/);
      support.decimallessFloat == true && stream.eat('.');
      return "number";
    } else if (ch == "?" && (stream.eatSpace() || stream.eol() || stream.eat(";"))) {
      // placeholders
      return "variable-3";
    } else if (ch == "'" || (ch == '"' && support.doubleQuote)) {
      // strings
      // ref: http://dev.mysql.com/doc/refman/5.5/en/string-literals.html
      state.tokenize = tokenLiteral(ch);
      return state.tokenize(stream, state);
    } else if ((((support.nCharCast == true && (ch == "n" || ch == "N"))
        || (support.charsetCast == true && ch == "_" && stream.match(/[a-z][a-z0-9]*/i)))
        && (stream.peek() == "'" || stream.peek() == '"'))) {
      // charset casting: _utf8'str', N'str', n'str'
      // ref: http://dev.mysql.com/doc/refman/5.5/en/string-literals.html
      return "keyword";
    } else if (/^[\(\),\;\[\]]/.test(ch)) {
      // no highlighting
      return null;
    } else if (support.commentSlashSlash && ch == "/" && stream.eat("/")) {
      // 1-line comment
      stream.skipToEnd();
      return "comment";
    } else if ((support.commentHash && ch == "#")
        || (ch == "-" && stream.eat("-") && (!support.commentSpaceRequired || stream.eat(" ")))) {
      // 1-line comments
      // ref: https://kb.askmonty.org/en/comment-syntax/
      stream.skipToEnd();
      return "comment";
    } else if (ch == "/" && stream.eat("*")) {
      // multi-line comments
      // ref: https://kb.askmonty.org/en/comment-syntax/
      state.tokenize = tokenComment;
      return state.tokenize(stream, state);
    } else if (ch == ".") {
      // .1 for 0.1
      if (support.zerolessFloat == true && stream.match(/^(?:\d+(?:e[+-]?\d+)?)/i)) {
        return "number";
      }
      // .table_name (ODBC)
      // // ref: http://dev.mysql.com/doc/refman/5.6/en/identifier-qualifiers.html
      if (support.ODBCdotTable == true && stream.match(/^[a-zA-Z_]+/)) {
        return "variable-2";
      }
    } else if (operatorChars.test(ch)) {
      // operators
      stream.eatWhile(operatorChars);
      return null;
    } else if (ch == '{' &&
        (stream.match(/^( )*(d|D|t|T|ts|TS)( )*'[^']*'( )*}/) || stream.match(/^( )*(d|D|t|T|ts|TS)( )*"[^"]*"( )*}/))) {
      // dates (weird ODBC syntax)
      // ref: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-literals.html
      return "number";
    } else {
      stream.eatWhile(/^[_\w\d]/);
      var word = stream.current().toLowerCase();
      // dates (standard SQL syntax)
      // ref: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-literals.html
      if (dateSQL.hasOwnProperty(word) && (stream.match(/^( )+'[^']*'/) || stream.match(/^( )+"[^"]*"/)))
        return "number";
      if (atoms.hasOwnProperty(word)) return "atom";
      if (builtin.hasOwnProperty(word)) return "builtin";
      if (keywords.hasOwnProperty(word)) return "keyword";
      if (client.hasOwnProperty(word)) return "string-2";
      return null;
    }
  }

  // 'string', with char specified in quote escaped by '\'
  function tokenLiteral(quote) {
    return function(stream, state) {
      var escaped = false, ch;
      while ((ch = stream.next()) != null) {
        if (ch == quote && !escaped) {
          state.tokenize = tokenBase;
          break;
        }
        escaped = !escaped && ch == "\\";
      }
      return "string";
    };
  }
  function tokenComment(stream, state) {
    while (true) {
      if (stream.skipTo("*")) {
        stream.next();
        if (stream.eat("/")) {
          state.tokenize = tokenBase;
          break;
        }
      } else {
        stream.skipToEnd();
        break;
      }
    }
    return "comment";
  }

  function pushContext(stream, state, type) {
    state.context = {
      prev: state.context,
      indent: stream.indentation(),
      col: stream.column(),
      type: type
    };
  }

  function popContext(state) {
    state.indent = state.context.indent;
    state.context = state.context.prev;
  }

  return {
    startState: function() {
      return {tokenize: tokenBase, context: null};
    },

    token: function(stream, state) {
      if (stream.sol()) {
        if (state.context && state.context.align == null)
          state.context.align = false;
      }
      if (stream.eatSpace()) return null;

      var style = state.tokenize(stream, state);
      if (style == "comment") return style;

      if (state.context && state.context.align == null)
        state.context.align = true;

      var tok = stream.current();
      if (tok == "(")
        pushContext(stream, state, ")");
      else if (tok == "[")
        pushContext(stream, state, "]");
      else if (state.context && state.context.type == tok)
        popContext(state);
      return style;
    },

    indent: function(state, textAfter) {
      var cx = state.context;
      if (!cx) return CodeMirror.Pass;
      var closing = textAfter.charAt(0) == cx.type;
      if (cx.align) return cx.col + (closing ? 0 : 1);
      else return cx.indent + (closing ? 0 : config.indentUnit);
    },

    blockCommentStart: "/*",
    blockCommentEnd: "*/",
    lineComment: support.commentSlashSlash ? "//" : support.commentHash ? "#" : null
  };
});

(function() {
  "use strict";

  // `identifier`
  function hookIdentifier(stream) {
    // MySQL/MariaDB identifiers
    // ref: http://dev.mysql.com/doc/refman/5.6/en/identifier-qualifiers.html
    var ch;
    while ((ch = stream.next()) != null) {
      if (ch == "`" && !stream.eat("`")) return "variable-2";
    }
    stream.backUp(stream.current().length - 1);
    return stream.eatWhile(/\w/) ? "variable-2" : null;
  }

  // variable token
  function hookVar(stream) {
    // variables
    // @@prefix.varName @varName
    // varName can be quoted with ` or ' or "
    // ref: http://dev.mysql.com/doc/refman/5.5/en/user-variables.html
    if (stream.eat("@")) {
      stream.match(/^session\./);
      stream.match(/^local\./);
      stream.match(/^global\./);
    }

    if (stream.eat("'")) {
      stream.match(/^.*'/);
      return "variable-2";
    } else if (stream.eat('"')) {
      stream.match(/^.*"/);
      return "variable-2";
    } else if (stream.eat("`")) {
      stream.match(/^.*`/);
      return "variable-2";
    } else if (stream.match(/^[0-9a-zA-Z$\.\_]+/)) {
      return "variable-2";
    }
    return null;
  };

  // short client keyword token
  function hookClient(stream) {
    // \N means NULL
    // ref: http://dev.mysql.com/doc/refman/5.5/en/null-values.html
    if (stream.eat("N")) {
        return "atom";
    }
    // \g, etc
    // ref: http://dev.mysql.com/doc/refman/5.5/en/mysql-commands.html
    return stream.match(/^[a-zA-Z.#!?]/) ? "variable-2" : null;
  }

  // these keywords are used by all SQL dialects (however, a mode can still overwrite it)
  var sqlKeywords = "alter and as asc between by count create delete desc distinct drop from group having in insert into is join like not on or order select set table union update values where limit ";

  // turn a space-separated list into an array
  function set(str) {
    var obj = {}, words = str.split(" ");
    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
    return obj;
  }

  // A generic SQL Mode. It's not a standard, it just try to support what is generally supported
  CodeMirror.defineMIME("text/x-sql", {
    name: "sql",
    keywords: set(sqlKeywords + "begin"),
    builtin: set("bool boolean bit blob enum long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision real date datetime year unsigned signed decimal numeric"),
    atoms: set("false true null unknown"),
    operatorChars: /^[*+\-%<>!=]/,
    dateSQL: set("date time timestamp"),
    support: set("ODBCdotTable doubleQuote binaryNumber hexNumber")
  });

  CodeMirror.defineMIME("text/x-mssql", {
    name: "sql",
    client: set("charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee"),
    keywords: set(sqlKeywords + "begin trigger proc view index for add constraint key primary foreign collate clustered nonclustered declare"),
    builtin: set("bigint numeric bit smallint decimal smallmoney int tinyint money float real char varchar text nchar nvarchar ntext binary varbinary image cursor timestamp hierarchyid uniqueidentifier sql_variant xml table "),
    atoms: set("false true null unknown"),
    operatorChars: /^[*+\-%<>!=]/,
    dateSQL: set("date datetimeoffset datetime2 smalldatetime datetime time"),
    hooks: {
      "@":   hookVar
    }
  });

  CodeMirror.defineMIME("text/x-mysql", {
    name: "sql",
    client: set("charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee"),
    keywords: set(sqlKeywords + "accessible action add after algorithm all analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general get global grant grants group group_concat handler hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show signal slave slow smallint snapshot soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views warnings when while with work write xa xor year_month zerofill begin do then else loop repeat"),
    builtin: set("bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision date datetime year unsigned signed numeric"),
    atoms: set("false true null unknown"),
    operatorChars: /^[*+\-%<>!=&|^]/,
    dateSQL: set("date time timestamp"),
    support: set("ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired"),
    hooks: {
      "@":   hookVar,
      "`":   hookIdentifier,
      "\\":  hookClient
    }
  });

  CodeMirror.defineMIME("text/x-mariadb", {
    name: "sql",
    client: set("charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee"),
    keywords: set(sqlKeywords + "accessible action add after algorithm all always analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general generated get global grant grants group groupby_concat handler hard hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password persistent phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show shutdown signal slave slow smallint snapshot soft soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views virtual warnings when while with work write xa xor year_month zerofill begin do then else loop repeat"),
    builtin: set("bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision date datetime year unsigned signed numeric"),
    atoms: set("false true null unknown"),
    operatorChars: /^[*+\-%<>!=&|^]/,
    dateSQL: set("date time timestamp"),
    support: set("ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired"),
    hooks: {
      "@":   hookVar,
      "`":   hookIdentifier,
      "\\":  hookClient
    }
  });

  // the query language used by Apache Cassandra is called CQL, but this mime type
  // is called Cassandra to avoid confusion with Contextual Query Language
  CodeMirror.defineMIME("text/x-cassandra", {
    name: "sql",
    client: { },
    keywords: set("add all allow alter and any apply as asc authorize batch begin by clustering columnfamily compact consistency count create custom delete desc distinct drop each_quorum exists filtering from grant if in index insert into key keyspace keyspaces level limit local_one local_quorum modify nan norecursive nosuperuser not of on one order password permission permissions primary quorum rename revoke schema select set storage superuser table three to token truncate ttl two type unlogged update use user users using values where with writetime"),
    builtin: set("ascii bigint blob boolean counter decimal double float frozen inet int list map static text timestamp timeuuid tuple uuid varchar varint"),
    atoms: set("false true infinity NaN"),
    operatorChars: /^[<>=]/,
    dateSQL: { },
    support: set("commentSlashSlash decimallessFloat"),
    hooks: { }
  });

  // this is based on Peter Raganitsch's 'plsql' mode
  CodeMirror.defineMIME("text/x-plsql", {
    name:       "sql",
    client:     set("appinfo arraysize autocommit autoprint autorecovery autotrace blockterminator break btitle cmdsep colsep compatibility compute concat copycommit copytypecheck define describe echo editfile embedded escape exec execute feedback flagger flush heading headsep instance linesize lno loboffset logsource long longchunksize markup native newpage numformat numwidth pagesize pause pno recsep recsepchar release repfooter repheader serveroutput shiftinout show showmode size spool sqlblanklines sqlcase sqlcode sqlcontinue sqlnumber sqlpluscompatibility sqlprefix sqlprompt sqlterminator suffix tab term termout time timing trimout trimspool ttitle underline verify version wrap"),
    keywords:   set("abort accept access add all alter and any array arraylen as asc assert assign at attributes audit authorization avg base_table begin between binary_integer body boolean by case cast char char_base check close cluster clusters colauth column comment commit compress connect connected constant constraint crash create current currval cursor data_base database date dba deallocate debugoff debugon decimal declare default definition delay delete desc digits dispose distinct do drop else elseif elsif enable end entry escape exception exception_init exchange exclusive exists exit external fast fetch file for force form from function generic goto grant group having identified if immediate in increment index indexes indicator initial initrans insert interface intersect into is key level library like limited local lock log logging long loop master maxextents maxtrans member minextents minus mislabel mode modify multiset new next no noaudit nocompress nologging noparallel not nowait number_base object of off offline on online only open option or order out package parallel partition pctfree pctincrease pctused pls_integer positive positiven pragma primary prior private privileges procedure public raise range raw read rebuild record ref references refresh release rename replace resource restrict return returning returns reverse revoke rollback row rowid rowlabel rownum rows run savepoint schema segment select separate session set share snapshot some space split sql start statement storage subtype successful synonym tabauth table tables tablespace task terminate then to trigger truncate type union unique unlimited unrecoverable unusable update use using validate value values variable view views when whenever where while with work"),
    builtin:    set("abs acos add_months ascii asin atan atan2 average bfile bfilename bigserial bit blob ceil character chartorowid chr clob concat convert cos cosh count dec decode deref dual dump dup_val_on_index empty error exp false float floor found glb greatest hextoraw initcap instr instrb int integer isopen last_day least length lengthb ln lower lpad ltrim lub make_ref max min mlslabel mod months_between natural naturaln nchar nclob new_time next_day nextval nls_charset_decl_len nls_charset_id nls_charset_name nls_initcap nls_lower nls_sort nls_upper nlssort no_data_found notfound null number numeric nvarchar2 nvl others power rawtohex real reftohex round rowcount rowidtochar rowtype rpad rtrim serial sign signtype sin sinh smallint soundex sqlcode sqlerrm sqrt stddev string substr substrb sum sysdate tan tanh to_char text to_date to_label to_multi_byte to_number to_single_byte translate true trunc uid unlogged upper user userenv varchar varchar2 variance varying vsize xml"),
    operatorChars: /^[*+\-%<>!=~]/,
    dateSQL:    set("date time timestamp"),
    support:    set("doubleQuote nCharCast zerolessFloat binaryNumber hexNumber")
  });

  // Created to support specific hive keywords
  CodeMirror.defineMIME("text/x-hive", {
    name: "sql",
    keywords: set("select alter $elem$ $key$ $value$ add after all analyze and archive as asc before between binary both bucket buckets by cascade case cast change cluster clustered clusterstatus collection column columns comment compute concatenate continue create cross cursor data database databases dbproperties deferred delete delimited desc describe directory disable distinct distribute drop else enable end escaped exclusive exists explain export extended external false fetch fields fileformat first format formatted from full function functions grant group having hold_ddltime idxproperties if import in index indexes inpath inputdriver inputformat insert intersect into is items join keys lateral left like limit lines load local location lock locks mapjoin materialized minus msck no_drop nocompress not of offline on option or order out outer outputdriver outputformat overwrite partition partitioned partitions percent plus preserve procedure purge range rcfile read readonly reads rebuild recordreader recordwriter recover reduce regexp rename repair replace restrict revoke right rlike row schema schemas semi sequencefile serde serdeproperties set shared show show_database sort sorted ssl statistics stored streamtable table tables tablesample tblproperties temporary terminated textfile then tmp to touch transform trigger true unarchive undo union uniquejoin unlock update use using utc utc_tmestamp view when where while with"),
    builtin: set("bool boolean long timestamp tinyint smallint bigint int float double date datetime unsigned string array struct map uniontype"),
    atoms: set("false true null unknown"),
    operatorChars: /^[*+\-%<>!=]/,
    dateSQL: set("date timestamp"),
    support: set("ODBCdotTable doubleQuote binaryNumber hexNumber")
  });

  CodeMirror.defineMIME("text/x-pgsql", {
    name: "sql",
    client: set("source"),
    // http://www.postgresql.org/docs/9.5/static/sql-keywords-appendix.html
    keywords: set(sqlKeywords + "a abort abs absent absolute access according action ada add admin after aggregate all allocate also always analyse analyze any are array array_agg array_max_cardinality asensitive assertion assignment asymmetric at atomic attribute attributes authorization avg backward base64 before begin begin_frame begin_partition bernoulli binary bit_length blob blocked bom both breadth c cache call called cardinality cascade cascaded case cast catalog catalog_name ceil ceiling chain characteristics characters character_length character_set_catalog character_set_name character_set_schema char_length check checkpoint class class_origin clob close cluster coalesce cobol collate collation collation_catalog collation_name collation_schema collect column columns column_name command_function command_function_code comment comments commit committed concurrently condition condition_number configuration conflict connect connection connection_name constraint constraints constraint_catalog constraint_name constraint_schema constructor contains content continue control conversion convert copy corr corresponding cost covar_pop covar_samp cross csv cube cume_dist current current_catalog current_date current_default_transform_group current_path current_role current_row current_schema current_time current_timestamp current_transform_group_for_type current_user cursor cursor_name cycle data database datalink datetime_interval_code datetime_interval_precision day db deallocate dec declare default defaults deferrable deferred defined definer degree delimiter delimiters dense_rank depth deref derived describe descriptor deterministic diagnostics dictionary disable discard disconnect dispatch dlnewcopy dlpreviouscopy dlurlcomplete dlurlcompleteonly dlurlcompletewrite dlurlpath dlurlpathonly dlurlpathwrite dlurlscheme dlurlserver dlvalue do document domain dynamic dynamic_function dynamic_function_code each element else empty enable encoding encrypted end end-exec end_frame end_partition enforced enum equals escape event every except exception exclude excluding exclusive exec execute exists exp explain expression extension external extract false family fetch file filter final first first_value flag float floor following for force foreign fortran forward found frame_row free freeze fs full function functions fusion g general generated get global go goto grant granted greatest grouping groups handler header hex hierarchy hold hour id identity if ignore ilike immediate immediately immutable implementation implicit import including increment indent index indexes indicator inherit inherits initially inline inner inout input insensitive instance instantiable instead integrity intersect intersection invoker isnull isolation k key key_member key_type label lag language large last last_value lateral lead leading leakproof least left length level library like_regex link listen ln load local localtime localtimestamp location locator lock locked logged lower m map mapping match matched materialized max maxvalue max_cardinality member merge message_length message_octet_length message_text method min minute minvalue mod mode modifies module month more move multiset mumps name names namespace national natural nchar nclob nesting new next nfc nfd nfkc nfkd nil no none normalize normalized nothing notify notnull nowait nth_value ntile null nullable nullif nulls number object occurrences_regex octets octet_length of off offset oids old only open operator option options ordering ordinality others out outer output over overlaps overlay overriding owned owner p pad parameter parameter_mode parameter_name parameter_ordinal_position parameter_specific_catalog parameter_specific_name parameter_specific_schema parser partial partition pascal passing passthrough password percent percentile_cont percentile_disc percent_rank period permission placing plans pli policy portion position position_regex power precedes preceding prepare prepared preserve primary prior privileges procedural procedure program public quote range rank read reads reassign recheck recovery recursive ref references referencing refresh regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy regr_syy reindex relative release rename repeatable replace replica requiring reset respect restart restore restrict result return returned_cardinality returned_length returned_octet_length returned_sqlstate returning returns revoke right role rollback rollup routine routine_catalog routine_name routine_schema row rows row_count row_number rule savepoint scale schema schema_name scope scope_catalog scope_name scope_schema scroll search second section security selective self sensitive sequence sequences serializable server server_name session session_user setof sets share show similar simple size skip snapshot some source space specific specifictype specific_name sql sqlcode sqlerror sqlexception sqlstate sqlwarning sqrt stable standalone start state statement static statistics stddev_pop stddev_samp stdin stdout storage strict strip structure style subclass_origin submultiset substring substring_regex succeeds sum symmetric sysid system system_time system_user t tables tablesample tablespace table_name temp template temporary then ties timezone_hour timezone_minute to token top_level_count trailing transaction transactions_committed transactions_rolled_back transaction_active transform transforms translate translate_regex translation treat trigger trigger_catalog trigger_name trigger_schema trim trim_array true truncate trusted type types uescape unbounded uncommitted under unencrypted unique unknown unlink unlisten unlogged unnamed unnest until untyped upper uri usage user user_defined_type_catalog user_defined_type_code user_defined_type_name user_defined_type_schema using vacuum valid validate validator value value_of varbinary variadic var_pop var_samp verbose version versioning view views volatile when whenever whitespace width_bucket window within work wrapper write xmlagg xmlattributes xmlbinary xmlcast xmlcomment xmlconcat xmldeclaration xmldocument xmlelement xmlexists xmlforest xmliterate xmlnamespaces xmlparse xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltext xmlvalidate year yes loop repeat"),
    // http://www.postgresql.org/docs/9.5/static/datatype.html
    builtin: set("bigint int8 bigserial serial8 bit varying varbit boolean bool box bytea character char varchar cidr circle date double precision float8 inet integer int int4 interval json jsonb line lseg macaddr money numeric decimal path pg_lsn point polygon real float4 smallint int2 smallserial serial2 serial serial4 text time without zone with timetz timestamp timestamptz tsquery tsvector txid_snapshot uuid xml"),
    atoms: set("false true null unknown"),
    operatorChars: /^[*+\-%<>!=&|^\/#@?~]/,
    dateSQL: set("date time timestamp"),
    support: set("ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber nCharCast charsetCast")
  });

  // Google's SQL-like query language, GQL
  CodeMirror.defineMIME("text/x-gql", {
    name: "sql",
    keywords: set("ancestor and asc by contains desc descendant distinct from group has in is limit offset on order select superset where"),
    atoms: set("false true"),
    builtin: set("blob datetime first key __key__ string integer double boolean null"),
    operatorChars: /^[*+\-%<>!=]/
  });
}());

});

/*
  How Properties of Mime Types are used by SQL Mode
  =================================================

  keywords:
    A list of keywords you want to be highlighted.
  builtin:
    A list of builtin types you want to be highlighted (if you want types to be of class "builtin" instead of "keyword").
  operatorChars:
    All characters that must be handled as operators.
  client:
    Commands parsed and executed by the client (not the server).
  support:
    A list of supported syntaxes which are not common, but are supported by more than 1 DBMS.
    * ODBCdotTable: .tableName
    * zerolessFloat: .1
    * doubleQuote
    * nCharCast: N'string'
    * charsetCast: _utf8'string'
    * commentHash: use # char for comments
    * commentSlashSlash: use // for comments
    * commentSpaceRequired: require a space after -- for comments
  atoms:
    Keywords that must be highlighted as atoms,. Some DBMS's support more atoms than others:
    UNKNOWN, INFINITY, UNDERFLOW, NaN...
  dateSQL:
    Used for date/time SQL standard syntax, because not all DBMS's support same temporal types.
*/
codemirror/mode/sql/index.html000064400000005657151215013510012440 0ustar00<!doctype html>

<title>CodeMirror: SQL Mode for CodeMirror</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css" />
<script src="../../lib/codemirror.js"></script>
<script src="sql.js"></script>
<link rel="stylesheet" href="../../addon/hint/show-hint.css" />
<script src="../../addon/hint/show-hint.js"></script>
<script src="../../addon/hint/sql-hint.js"></script>
<style>
.CodeMirror {
    border-top: 1px solid black;
    border-bottom: 1px solid black;
}
        </style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">SQL Mode for CodeMirror</a>
  </ul>
</div>

<article>
<h2>SQL Mode for CodeMirror</h2>
<form>
            <textarea id="code" name="code">-- SQL Mode for CodeMirror
SELECT SQL_NO_CACHE DISTINCT
		@var1 AS `val1`, @'val2', @global.'sql_mode',
		1.1 AS `float_val`, .14 AS `another_float`, 0.09e3 AS `int_with_esp`,
		0xFA5 AS `hex`, x'fa5' AS `hex2`, 0b101 AS `bin`, b'101' AS `bin2`,
		DATE '1994-01-01' AS `sql_date`, { T "1994-01-01" } AS `odbc_date`,
		'my string', _utf8'your string', N'her string',
        TRUE, FALSE, UNKNOWN
	FROM DUAL
	-- space needed after '--'
	# 1 line comment
	/* multiline
	comment! */
	LIMIT 1 OFFSET 0;
</textarea>
            </form>
            <p><strong>MIME types defined:</strong> 
            <code><a href="?mime=text/x-sql">text/x-sql</a></code>,
            <code><a href="?mime=text/x-mysql">text/x-mysql</a></code>,
            <code><a href="?mime=text/x-mariadb">text/x-mariadb</a></code>,
            <code><a href="?mime=text/x-cassandra">text/x-cassandra</a></code>,
            <code><a href="?mime=text/x-plsql">text/x-plsql</a></code>,
            <code><a href="?mime=text/x-mssql">text/x-mssql</a></code>,
            <code><a href="?mime=text/x-hive">text/x-hive</a></code>,
            <code><a href="?mime=text/x-pgsql">text/x-pgsql</a></code>,
            <code><a href="?mime=text/x-gql">text/x-gql</a></code>.
        </p>
<script>
window.onload = function() {
  var mime = 'text/x-mariadb';
  // get mime type
  if (window.location.href.indexOf('mime=') > -1) {
    mime = window.location.href.substr(window.location.href.indexOf('mime=') + 5);
  }
  window.editor = CodeMirror.fromTextArea(document.getElementById('code'), {
    mode: mime,
    indentWithTabs: true,
    smartIndent: true,
    lineNumbers: true,
    matchBrackets : true,
    autofocus: true,
    extraKeys: {"Ctrl-Space": "autocomplete"},
    hintOptions: {tables: {
      users: {name: null, score: null, birthDate: null},
      countries: {name: null, population: null, size: null}
    }}
  });
};
</script>

</article>
codemirror/mode/tornado/index.html000064400000003413151215013510013273 0ustar00<!doctype html>

<title>CodeMirror: Tornado template mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/mode/overlay.js"></script>
<script src="../xml/xml.js"></script>
<script src="../htmlmixed/htmlmixed.js"></script>
<script src="tornado.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/marijnh/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Tornado</a>
  </ul>
</div>

<article>
<h2>Tornado template mode</h2>
<form><textarea id="code" name="code">
<!doctype html>
<html>
    <head>
        <title>My Tornado web application</title>
    </head>
    <body>
        <h1>
            {{ title }}
        </h1>
        <ul class="my-list">
            {% for item in items %}
                <li>{% item.name %}</li>
            {% empty %}
                <li>You have no items in your list.</li>
            {% end %}
        </ul>
    </body>
</html>
</textarea></form>

    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        lineNumbers: true,
        mode: "tornado",
        indentUnit: 4,
        indentWithTabs: true
      });
    </script>

    <p>Mode for HTML with embedded Tornado template markup.</p>

    <p><strong>MIME types defined:</strong> <code>text/x-tornado</code></p>
  </article>
codemirror/mode/tornado/tornado.js000064400000004700151215013510013302 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"),
        require("../../addon/mode/overlay"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror", "../htmlmixed/htmlmixed",
            "../../addon/mode/overlay"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  CodeMirror.defineMode("tornado:inner", function() {
    var keywords = ["and","as","assert","autoescape","block","break","class","comment","context",
                    "continue","datetime","def","del","elif","else","end","escape","except",
                    "exec","extends","false","finally","for","from","global","if","import","in",
                    "include","is","json_encode","lambda","length","linkify","load","module",
                    "none","not","or","pass","print","put","raise","raw","return","self","set",
                    "squeeze","super","true","try","url_escape","while","with","without","xhtml_escape","yield"];
    keywords = new RegExp("^((" + keywords.join(")|(") + "))\\b");

    function tokenBase (stream, state) {
      stream.eatWhile(/[^\{]/);
      var ch = stream.next();
      if (ch == "{") {
        if (ch = stream.eat(/\{|%|#/)) {
          state.tokenize = inTag(ch);
          return "tag";
        }
      }
    }
    function inTag (close) {
      if (close == "{") {
        close = "}";
      }
      return function (stream, state) {
        var ch = stream.next();
        if ((ch == close) && stream.eat("}")) {
          state.tokenize = tokenBase;
          return "tag";
        }
        if (stream.match(keywords)) {
          return "keyword";
        }
        return close == "#" ? "comment" : "string";
      };
    }
    return {
      startState: function () {
        return {tokenize: tokenBase};
      },
      token: function (stream, state) {
        return state.tokenize(stream, state);
      }
    };
  });

  CodeMirror.defineMode("tornado", function(config) {
    var htmlBase = CodeMirror.getMode(config, "text/html");
    var tornadoInner = CodeMirror.getMode(config, "tornado:inner");
    return CodeMirror.overlayMode(htmlBase, tornadoInner);
  });

  CodeMirror.defineMIME("text/x-tornado", "tornado");
});
codemirror/mode/javascript/json-ld.html000064400000004146151215013510014236 0ustar00<!doctype html>

<title>CodeMirror: JSON-LD mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="../../addon/comment/continuecomment.js"></script>
<script src="../../addon/comment/comment.js"></script>
<script src="javascript.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id="nav">
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"/></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">JSON-LD</a>
  </ul>
</div>

<article>
<h2>JSON-LD mode</h2>


<div><textarea id="code" name="code">
{
  "@context": {
    "name": "http://schema.org/name",
    "description": "http://schema.org/description",
    "image": {
      "@id": "http://schema.org/image",
      "@type": "@id"
    },
    "geo": "http://schema.org/geo",
    "latitude": {
      "@id": "http://schema.org/latitude",
      "@type": "xsd:float"
    },
    "longitude": {
      "@id": "http://schema.org/longitude",
      "@type": "xsd:float"
    },
    "xsd": "http://www.w3.org/2001/XMLSchema#"
  },
  "name": "The Empire State Building",
  "description": "The Empire State Building is a 102-story landmark in New York City.",
  "image": "http://www.civil.usherbrooke.ca/cours/gci215a/empire-state-building.jpg",
  "geo": {
    "latitude": "40.75",
    "longitude": "73.98"
  }
}
</textarea></div>

    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        matchBrackets: true,
        autoCloseBrackets: true,
        mode: "application/ld+json",
        lineWrapping: true
      });
    </script>
    
    <p>This is a specialization of the <a href="index.html">JavaScript mode</a>.</p>
  </article>
codemirror/mode/javascript/javascript.js000064400000070217151215013510014510 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

function expressionAllowed(stream, state, backUp) {
  return /^(?:operator|sof|keyword c|case|new|[\[{}\(,;:]|=>)$/.test(state.lastType) ||
    (state.lastType == "quasi" && /\{\s*$/.test(stream.string.slice(0, stream.pos - (backUp || 0))))
}

CodeMirror.defineMode("javascript", function(config, parserConfig) {
  var indentUnit = config.indentUnit;
  var statementIndent = parserConfig.statementIndent;
  var jsonldMode = parserConfig.jsonld;
  var jsonMode = parserConfig.json || jsonldMode;
  var isTS = parserConfig.typescript;
  var wordRE = parserConfig.wordCharacters || /[\w$\xa1-\uffff]/;

  // Tokenizer

  var keywords = function(){
    function kw(type) {return {type: type, style: "keyword"};}
    var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c");
    var operator = kw("operator"), atom = {type: "atom", style: "atom"};

    var jsKeywords = {
      "if": kw("if"), "while": A, "with": A, "else": B, "do": B, "try": B, "finally": B,
      "return": C, "break": C, "continue": C, "new": kw("new"), "delete": C, "throw": C, "debugger": C,
      "var": kw("var"), "const": kw("var"), "let": kw("var"),
      "function": kw("function"), "catch": kw("catch"),
      "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"),
      "in": operator, "typeof": operator, "instanceof": operator,
      "true": atom, "false": atom, "null": atom, "undefined": atom, "NaN": atom, "Infinity": atom,
      "this": kw("this"), "class": kw("class"), "super": kw("atom"),
      "yield": C, "export": kw("export"), "import": kw("import"), "extends": C,
      "await": C, "async": kw("async")
    };

    // Extend the 'normal' keywords with the TypeScript language extensions
    if (isTS) {
      var type = {type: "variable", style: "variable-3"};
      var tsKeywords = {
        // object-like things
        "interface": kw("class"),
        "implements": C,
        "namespace": C,
        "module": kw("module"),
        "enum": kw("module"),

        // scope modifiers
        "public": kw("modifier"),
        "private": kw("modifier"),
        "protected": kw("modifier"),
        "abstract": kw("modifier"),

        // operators
        "as": operator,

        // types
        "string": type, "number": type, "boolean": type, "any": type
      };

      for (var attr in tsKeywords) {
        jsKeywords[attr] = tsKeywords[attr];
      }
    }

    return jsKeywords;
  }();

  var isOperatorChar = /[+\-*&%=<>!?|~^]/;
  var isJsonldKeyword = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/;

  function readRegexp(stream) {
    var escaped = false, next, inSet = false;
    while ((next = stream.next()) != null) {
      if (!escaped) {
        if (next == "/" && !inSet) return;
        if (next == "[") inSet = true;
        else if (inSet && next == "]") inSet = false;
      }
      escaped = !escaped && next == "\\";
    }
  }

  // Used as scratch variables to communicate multiple values without
  // consing up tons of objects.
  var type, content;
  function ret(tp, style, cont) {
    type = tp; content = cont;
    return style;
  }
  function tokenBase(stream, state) {
    var ch = stream.next();
    if (ch == '"' || ch == "'") {
      state.tokenize = tokenString(ch);
      return state.tokenize(stream, state);
    } else if (ch == "." && stream.match(/^\d+(?:[eE][+\-]?\d+)?/)) {
      return ret("number", "number");
    } else if (ch == "." && stream.match("..")) {
      return ret("spread", "meta");
    } else if (/[\[\]{}\(\),;\:\.]/.test(ch)) {
      return ret(ch);
    } else if (ch == "=" && stream.eat(">")) {
      return ret("=>", "operator");
    } else if (ch == "0" && stream.eat(/x/i)) {
      stream.eatWhile(/[\da-f]/i);
      return ret("number", "number");
    } else if (ch == "0" && stream.eat(/o/i)) {
      stream.eatWhile(/[0-7]/i);
      return ret("number", "number");
    } else if (ch == "0" && stream.eat(/b/i)) {
      stream.eatWhile(/[01]/i);
      return ret("number", "number");
    } else if (/\d/.test(ch)) {
      stream.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/);
      return ret("number", "number");
    } else if (ch == "/") {
      if (stream.eat("*")) {
        state.tokenize = tokenComment;
        return tokenComment(stream, state);
      } else if (stream.eat("/")) {
        stream.skipToEnd();
        return ret("comment", "comment");
      } else if (expressionAllowed(stream, state, 1)) {
        readRegexp(stream);
        stream.match(/^\b(([gimyu])(?![gimyu]*\2))+\b/);
        return ret("regexp", "string-2");
      } else {
        stream.eatWhile(isOperatorChar);
        return ret("operator", "operator", stream.current());
      }
    } else if (ch == "`") {
      state.tokenize = tokenQuasi;
      return tokenQuasi(stream, state);
    } else if (ch == "#") {
      stream.skipToEnd();
      return ret("error", "error");
    } else if (isOperatorChar.test(ch)) {
      stream.eatWhile(isOperatorChar);
      return ret("operator", "operator", stream.current());
    } else if (wordRE.test(ch)) {
      stream.eatWhile(wordRE);
      var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word];
      return (known && state.lastType != ".") ? ret(known.type, known.style, word) :
                     ret("variable", "variable", word);
    }
  }

  function tokenString(quote) {
    return function(stream, state) {
      var escaped = false, next;
      if (jsonldMode && stream.peek() == "@" && stream.match(isJsonldKeyword)){
        state.tokenize = tokenBase;
        return ret("jsonld-keyword", "meta");
      }
      while ((next = stream.next()) != null) {
        if (next == quote && !escaped) break;
        escaped = !escaped && next == "\\";
      }
      if (!escaped) state.tokenize = tokenBase;
      return ret("string", "string");
    };
  }

  function tokenComment(stream, state) {
    var maybeEnd = false, ch;
    while (ch = stream.next()) {
      if (ch == "/" && maybeEnd) {
        state.tokenize = tokenBase;
        break;
      }
      maybeEnd = (ch == "*");
    }
    return ret("comment", "comment");
  }

  function tokenQuasi(stream, state) {
    var escaped = false, next;
    while ((next = stream.next()) != null) {
      if (!escaped && (next == "`" || next == "$" && stream.eat("{"))) {
        state.tokenize = tokenBase;
        break;
      }
      escaped = !escaped && next == "\\";
    }
    return ret("quasi", "string-2", stream.current());
  }

  var brackets = "([{}])";
  // This is a crude lookahead trick to try and notice that we're
  // parsing the argument patterns for a fat-arrow function before we
  // actually hit the arrow token. It only works if the arrow is on
  // the same line as the arguments and there's no strange noise
  // (comments) in between. Fallback is to only notice when we hit the
  // arrow, and not declare the arguments as locals for the arrow
  // body.
  function findFatArrow(stream, state) {
    if (state.fatArrowAt) state.fatArrowAt = null;
    var arrow = stream.string.indexOf("=>", stream.start);
    if (arrow < 0) return;

    var depth = 0, sawSomething = false;
    for (var pos = arrow - 1; pos >= 0; --pos) {
      var ch = stream.string.charAt(pos);
      var bracket = brackets.indexOf(ch);
      if (bracket >= 0 && bracket < 3) {
        if (!depth) { ++pos; break; }
        if (--depth == 0) { if (ch == "(") sawSomething = true; break; }
      } else if (bracket >= 3 && bracket < 6) {
        ++depth;
      } else if (wordRE.test(ch)) {
        sawSomething = true;
      } else if (/["'\/]/.test(ch)) {
        return;
      } else if (sawSomething && !depth) {
        ++pos;
        break;
      }
    }
    if (sawSomething && !depth) state.fatArrowAt = pos;
  }

  // Parser

  var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true, "this": true, "jsonld-keyword": true};

  function JSLexical(indented, column, type, align, prev, info) {
    this.indented = indented;
    this.column = column;
    this.type = type;
    this.prev = prev;
    this.info = info;
    if (align != null) this.align = align;
  }

  function inScope(state, varname) {
    for (var v = state.localVars; v; v = v.next)
      if (v.name == varname) return true;
    for (var cx = state.context; cx; cx = cx.prev) {
      for (var v = cx.vars; v; v = v.next)
        if (v.name == varname) return true;
    }
  }

  function parseJS(state, style, type, content, stream) {
    var cc = state.cc;
    // Communicate our context to the combinators.
    // (Less wasteful than consing up a hundred closures on every call.)
    cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc; cx.style = style;

    if (!state.lexical.hasOwnProperty("align"))
      state.lexical.align = true;

    while(true) {
      var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement;
      if (combinator(type, content)) {
        while(cc.length && cc[cc.length - 1].lex)
          cc.pop()();
        if (cx.marked) return cx.marked;
        if (type == "variable" && inScope(state, content)) return "variable-2";
        return style;
      }
    }
  }

  // Combinator utils

  var cx = {state: null, column: null, marked: null, cc: null};
  function pass() {
    for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]);
  }
  function cont() {
    pass.apply(null, arguments);
    return true;
  }
  function register(varname) {
    function inList(list) {
      for (var v = list; v; v = v.next)
        if (v.name == varname) return true;
      return false;
    }
    var state = cx.state;
    cx.marked = "def";
    if (state.context) {
      if (inList(state.localVars)) return;
      state.localVars = {name: varname, next: state.localVars};
    } else {
      if (inList(state.globalVars)) return;
      if (parserConfig.globalVars)
        state.globalVars = {name: varname, next: state.globalVars};
    }
  }

  // Combinators

  var defaultVars = {name: "this", next: {name: "arguments"}};
  function pushcontext() {
    cx.state.context = {prev: cx.state.context, vars: cx.state.localVars};
    cx.state.localVars = defaultVars;
  }
  function popcontext() {
    cx.state.localVars = cx.state.context.vars;
    cx.state.context = cx.state.context.prev;
  }
  function pushlex(type, info) {
    var result = function() {
      var state = cx.state, indent = state.indented;
      if (state.lexical.type == "stat") indent = state.lexical.indented;
      else for (var outer = state.lexical; outer && outer.type == ")" && outer.align; outer = outer.prev)
        indent = outer.indented;
      state.lexical = new JSLexical(indent, cx.stream.column(), type, null, state.lexical, info);
    };
    result.lex = true;
    return result;
  }
  function poplex() {
    var state = cx.state;
    if (state.lexical.prev) {
      if (state.lexical.type == ")")
        state.indented = state.lexical.indented;
      state.lexical = state.lexical.prev;
    }
  }
  poplex.lex = true;

  function expect(wanted) {
    function exp(type) {
      if (type == wanted) return cont();
      else if (wanted == ";") return pass();
      else return cont(exp);
    };
    return exp;
  }

  function statement(type, value) {
    if (type == "var") return cont(pushlex("vardef", value.length), vardef, expect(";"), poplex);
    if (type == "keyword a") return cont(pushlex("form"), expression, statement, poplex);
    if (type == "keyword b") return cont(pushlex("form"), statement, poplex);
    if (type == "{") return cont(pushlex("}"), block, poplex);
    if (type == ";") return cont();
    if (type == "if") {
      if (cx.state.lexical.info == "else" && cx.state.cc[cx.state.cc.length - 1] == poplex)
        cx.state.cc.pop()();
      return cont(pushlex("form"), expression, statement, poplex, maybeelse);
    }
    if (type == "function") return cont(functiondef);
    if (type == "for") return cont(pushlex("form"), forspec, statement, poplex);
    if (type == "variable") return cont(pushlex("stat"), maybelabel);
    if (type == "switch") return cont(pushlex("form"), expression, pushlex("}", "switch"), expect("{"),
                                      block, poplex, poplex);
    if (type == "case") return cont(expression, expect(":"));
    if (type == "default") return cont(expect(":"));
    if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"),
                                     statement, poplex, popcontext);
    if (type == "class") return cont(pushlex("form"), className, poplex);
    if (type == "export") return cont(pushlex("stat"), afterExport, poplex);
    if (type == "import") return cont(pushlex("stat"), afterImport, poplex);
    if (type == "module") return cont(pushlex("form"), pattern, pushlex("}"), expect("{"), block, poplex, poplex)
    if (type == "async") return cont(statement)
    return pass(pushlex("stat"), expression, expect(";"), poplex);
  }
  function expression(type) {
    return expressionInner(type, false);
  }
  function expressionNoComma(type) {
    return expressionInner(type, true);
  }
  function expressionInner(type, noComma) {
    if (cx.state.fatArrowAt == cx.stream.start) {
      var body = noComma ? arrowBodyNoComma : arrowBody;
      if (type == "(") return cont(pushcontext, pushlex(")"), commasep(pattern, ")"), poplex, expect("=>"), body, popcontext);
      else if (type == "variable") return pass(pushcontext, pattern, expect("=>"), body, popcontext);
    }

    var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma;
    if (atomicTypes.hasOwnProperty(type)) return cont(maybeop);
    if (type == "function") return cont(functiondef, maybeop);
    if (type == "keyword c" || type == "async") return cont(noComma ? maybeexpressionNoComma : maybeexpression);
    if (type == "(") return cont(pushlex(")"), maybeexpression, expect(")"), poplex, maybeop);
    if (type == "operator" || type == "spread") return cont(noComma ? expressionNoComma : expression);
    if (type == "[") return cont(pushlex("]"), arrayLiteral, poplex, maybeop);
    if (type == "{") return contCommasep(objprop, "}", null, maybeop);
    if (type == "quasi") return pass(quasi, maybeop);
    if (type == "new") return cont(maybeTarget(noComma));
    return cont();
  }
  function maybeexpression(type) {
    if (type.match(/[;\}\)\],]/)) return pass();
    return pass(expression);
  }
  function maybeexpressionNoComma(type) {
    if (type.match(/[;\}\)\],]/)) return pass();
    return pass(expressionNoComma);
  }

  function maybeoperatorComma(type, value) {
    if (type == ",") return cont(expression);
    return maybeoperatorNoComma(type, value, false);
  }
  function maybeoperatorNoComma(type, value, noComma) {
    var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma;
    var expr = noComma == false ? expression : expressionNoComma;
    if (type == "=>") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext);
    if (type == "operator") {
      if (/\+\+|--/.test(value)) return cont(me);
      if (value == "?") return cont(expression, expect(":"), expr);
      return cont(expr);
    }
    if (type == "quasi") { return pass(quasi, me); }
    if (type == ";") return;
    if (type == "(") return contCommasep(expressionNoComma, ")", "call", me);
    if (type == ".") return cont(property, me);
    if (type == "[") return cont(pushlex("]"), maybeexpression, expect("]"), poplex, me);
  }
  function quasi(type, value) {
    if (type != "quasi") return pass();
    if (value.slice(value.length - 2) != "${") return cont(quasi);
    return cont(expression, continueQuasi);
  }
  function continueQuasi(type) {
    if (type == "}") {
      cx.marked = "string-2";
      cx.state.tokenize = tokenQuasi;
      return cont(quasi);
    }
  }
  function arrowBody(type) {
    findFatArrow(cx.stream, cx.state);
    return pass(type == "{" ? statement : expression);
  }
  function arrowBodyNoComma(type) {
    findFatArrow(cx.stream, cx.state);
    return pass(type == "{" ? statement : expressionNoComma);
  }
  function maybeTarget(noComma) {
    return function(type) {
      if (type == ".") return cont(noComma ? targetNoComma : target);
      else return pass(noComma ? expressionNoComma : expression);
    };
  }
  function target(_, value) {
    if (value == "target") { cx.marked = "keyword"; return cont(maybeoperatorComma); }
  }
  function targetNoComma(_, value) {
    if (value == "target") { cx.marked = "keyword"; return cont(maybeoperatorNoComma); }
  }
  function maybelabel(type) {
    if (type == ":") return cont(poplex, statement);
    return pass(maybeoperatorComma, expect(";"), poplex);
  }
  function property(type) {
    if (type == "variable") {cx.marked = "property"; return cont();}
  }
  function objprop(type, value) {
    if (type == "async") {
      cx.marked = "property";
      return cont(objprop);
    } else if (type == "variable" || cx.style == "keyword") {
      cx.marked = "property";
      if (value == "get" || value == "set") return cont(getterSetter);
      return cont(afterprop);
    } else if (type == "number" || type == "string") {
      cx.marked = jsonldMode ? "property" : (cx.style + " property");
      return cont(afterprop);
    } else if (type == "jsonld-keyword") {
      return cont(afterprop);
    } else if (type == "modifier") {
      return cont(objprop)
    } else if (type == "[") {
      return cont(expression, expect("]"), afterprop);
    } else if (type == "spread") {
      return cont(expression);
    } else if (type == ":") {
      return pass(afterprop)
    }
  }
  function getterSetter(type) {
    if (type != "variable") return pass(afterprop);
    cx.marked = "property";
    return cont(functiondef);
  }
  function afterprop(type) {
    if (type == ":") return cont(expressionNoComma);
    if (type == "(") return pass(functiondef);
  }
  function commasep(what, end) {
    function proceed(type, value) {
      if (type == ",") {
        var lex = cx.state.lexical;
        if (lex.info == "call") lex.pos = (lex.pos || 0) + 1;
        return cont(function(type, value) {
          if (type == end || value == end) return pass()
          return pass(what)
        }, proceed);
      }
      if (type == end || value == end) return cont();
      return cont(expect(end));
    }
    return function(type, value) {
      if (type == end || value == end) return cont();
      return pass(what, proceed);
    };
  }
  function contCommasep(what, end, info) {
    for (var i = 3; i < arguments.length; i++)
      cx.cc.push(arguments[i]);
    return cont(pushlex(end, info), commasep(what, end), poplex);
  }
  function block(type) {
    if (type == "}") return cont();
    return pass(statement, block);
  }
  function maybetype(type) {
    if (isTS && type == ":") return cont(typeexpr);
  }
  function maybedefault(_, value) {
    if (value == "=") return cont(expressionNoComma);
  }
  function typeexpr(type) {
    if (type == "variable") {cx.marked = "variable-3"; return cont(afterType);}
    if (type == "{") return cont(commasep(typeprop, "}"))
    if (type == "(") return cont(commasep(typearg, ")"), maybeReturnType)
  }
  function maybeReturnType(type) {
    if (type == "=>") return cont(typeexpr)
  }
  function typeprop(type) {
    if (type == "variable" || cx.style == "keyword") {
      cx.marked = "property"
      return cont(typeprop)
    } else if (type == ":") {
      return cont(typeexpr)
    }
  }
  function typearg(type) {
    if (type == "variable") return cont(typearg)
    else if (type == ":") return cont(typeexpr)
  }
  function afterType(type, value) {
    if (value == "<") return cont(commasep(typeexpr, ">"), afterType)
    if (type == "[") return cont(expect("]"), afterType)
  }
  function vardef() {
    return pass(pattern, maybetype, maybeAssign, vardefCont);
  }
  function pattern(type, value) {
    if (type == "modifier") return cont(pattern)
    if (type == "variable") { register(value); return cont(); }
    if (type == "spread") return cont(pattern);
    if (type == "[") return contCommasep(pattern, "]");
    if (type == "{") return contCommasep(proppattern, "}");
  }
  function proppattern(type, value) {
    if (type == "variable" && !cx.stream.match(/^\s*:/, false)) {
      register(value);
      return cont(maybeAssign);
    }
    if (type == "variable") cx.marked = "property";
    if (type == "spread") return cont(pattern);
    if (type == "}") return pass();
    return cont(expect(":"), pattern, maybeAssign);
  }
  function maybeAssign(_type, value) {
    if (value == "=") return cont(expressionNoComma);
  }
  function vardefCont(type) {
    if (type == ",") return cont(vardef);
  }
  function maybeelse(type, value) {
    if (type == "keyword b" && value == "else") return cont(pushlex("form", "else"), statement, poplex);
  }
  function forspec(type) {
    if (type == "(") return cont(pushlex(")"), forspec1, expect(")"), poplex);
  }
  function forspec1(type) {
    if (type == "var") return cont(vardef, expect(";"), forspec2);
    if (type == ";") return cont(forspec2);
    if (type == "variable") return cont(formaybeinof);
    return pass(expression, expect(";"), forspec2);
  }
  function formaybeinof(_type, value) {
    if (value == "in" || value == "of") { cx.marked = "keyword"; return cont(expression); }
    return cont(maybeoperatorComma, forspec2);
  }
  function forspec2(type, value) {
    if (type == ";") return cont(forspec3);
    if (value == "in" || value == "of") { cx.marked = "keyword"; return cont(expression); }
    return pass(expression, expect(";"), forspec3);
  }
  function forspec3(type) {
    if (type != ")") cont(expression);
  }
  function functiondef(type, value) {
    if (value == "*") {cx.marked = "keyword"; return cont(functiondef);}
    if (type == "variable") {register(value); return cont(functiondef);}
    if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, maybetype, statement, popcontext);
  }
  function funarg(type) {
    if (type == "spread") return cont(funarg);
    return pass(pattern, maybetype, maybedefault);
  }
  function className(type, value) {
    if (type == "variable") {register(value); return cont(classNameAfter);}
  }
  function classNameAfter(type, value) {
    if (value == "extends") return cont(isTS ? typeexpr : expression, classNameAfter);
    if (type == "{") return cont(pushlex("}"), classBody, poplex);
  }
  function classBody(type, value) {
    if (type == "variable" || cx.style == "keyword") {
      if (value == "static") {
        cx.marked = "keyword";
        return cont(classBody);
      }
      cx.marked = "property";
      if (value == "get" || value == "set") return cont(classGetterSetter, functiondef, classBody);
      return cont(functiondef, classBody);
    }
    if (value == "*") {
      cx.marked = "keyword";
      return cont(classBody);
    }
    if (type == ";") return cont(classBody);
    if (type == "}") return cont();
  }
  function classGetterSetter(type) {
    if (type != "variable") return pass();
    cx.marked = "property";
    return cont();
  }
  function afterExport(_type, value) {
    if (value == "*") { cx.marked = "keyword"; return cont(maybeFrom, expect(";")); }
    if (value == "default") { cx.marked = "keyword"; return cont(expression, expect(";")); }
    return pass(statement);
  }
  function afterImport(type) {
    if (type == "string") return cont();
    return pass(importSpec, maybeFrom);
  }
  function importSpec(type, value) {
    if (type == "{") return contCommasep(importSpec, "}");
    if (type == "variable") register(value);
    if (value == "*") cx.marked = "keyword";
    return cont(maybeAs);
  }
  function maybeAs(_type, value) {
    if (value == "as") { cx.marked = "keyword"; return cont(importSpec); }
  }
  function maybeFrom(_type, value) {
    if (value == "from") { cx.marked = "keyword"; return cont(expression); }
  }
  function arrayLiteral(type) {
    if (type == "]") return cont();
    return pass(commasep(expressionNoComma, "]"));
  }

  function isContinuedStatement(state, textAfter) {
    return state.lastType == "operator" || state.lastType == "," ||
      isOperatorChar.test(textAfter.charAt(0)) ||
      /[,.]/.test(textAfter.charAt(0));
  }

  // Interface

  return {
    startState: function(basecolumn) {
      var state = {
        tokenize: tokenBase,
        lastType: "sof",
        cc: [],
        lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false),
        localVars: parserConfig.localVars,
        context: parserConfig.localVars && {vars: parserConfig.localVars},
        indented: basecolumn || 0
      };
      if (parserConfig.globalVars && typeof parserConfig.globalVars == "object")
        state.globalVars = parserConfig.globalVars;
      return state;
    },

    token: function(stream, state) {
      if (stream.sol()) {
        if (!state.lexical.hasOwnProperty("align"))
          state.lexical.align = false;
        state.indented = stream.indentation();
        findFatArrow(stream, state);
      }
      if (state.tokenize != tokenComment && stream.eatSpace()) return null;
      var style = state.tokenize(stream, state);
      if (type == "comment") return style;
      state.lastType = type == "operator" && (content == "++" || content == "--") ? "incdec" : type;
      return parseJS(state, style, type, content, stream);
    },

    indent: function(state, textAfter) {
      if (state.tokenize == tokenComment) return CodeMirror.Pass;
      if (state.tokenize != tokenBase) return 0;
      var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical;
      // Kludge to prevent 'maybelse' from blocking lexical scope pops
      if (!/^\s*else\b/.test(textAfter)) for (var i = state.cc.length - 1; i >= 0; --i) {
        var c = state.cc[i];
        if (c == poplex) lexical = lexical.prev;
        else if (c != maybeelse) break;
      }
      if (lexical.type == "stat" && firstChar == "}") lexical = lexical.prev;
      if (statementIndent && lexical.type == ")" && lexical.prev.type == "stat")
        lexical = lexical.prev;
      var type = lexical.type, closing = firstChar == type;

      if (type == "vardef") return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? lexical.info + 1 : 0);
      else if (type == "form" && firstChar == "{") return lexical.indented;
      else if (type == "form") return lexical.indented + indentUnit;
      else if (type == "stat")
        return lexical.indented + (isContinuedStatement(state, textAfter) ? statementIndent || indentUnit : 0);
      else if (lexical.info == "switch" && !closing && parserConfig.doubleIndentSwitch != false)
        return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit);
      else if (lexical.align) return lexical.column + (closing ? 0 : 1);
      else return lexical.indented + (closing ? 0 : indentUnit);
    },

    electricInput: /^\s*(?:case .*?:|default:|\{|\})$/,
    blockCommentStart: jsonMode ? null : "/*",
    blockCommentEnd: jsonMode ? null : "*/",
    lineComment: jsonMode ? null : "//",
    fold: "brace",
    closeBrackets: "()[]{}''\"\"``",

    helperType: jsonMode ? "json" : "javascript",
    jsonldMode: jsonldMode,
    jsonMode: jsonMode,

    expressionAllowed: expressionAllowed,
    skipExpression: function(state) {
      var top = state.cc[state.cc.length - 1]
      if (top == expression || top == expressionNoComma) state.cc.pop()
    }
  };
});

CodeMirror.registerHelper("wordChars", "javascript", /[\w$]/);

CodeMirror.defineMIME("text/javascript", "javascript");
CodeMirror.defineMIME("text/ecmascript", "javascript");
CodeMirror.defineMIME("application/javascript", "javascript");
CodeMirror.defineMIME("application/x-javascript", "javascript");
CodeMirror.defineMIME("application/ecmascript", "javascript");
CodeMirror.defineMIME("application/json", {name: "javascript", json: true});
CodeMirror.defineMIME("application/x-json", {name: "javascript", json: true});
CodeMirror.defineMIME("application/ld+json", {name: "javascript", jsonld: true});
CodeMirror.defineMIME("text/typescript", { name: "javascript", typescript: true });
CodeMirror.defineMIME("application/typescript", { name: "javascript", typescript: true });

});
codemirror/mode/javascript/index.html000064400000010141151215013510013767 0ustar00<!doctype html>

<title>CodeMirror: JavaScript mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="../../addon/comment/continuecomment.js"></script>
<script src="../../addon/comment/comment.js"></script>
<script src="javascript.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">JavaScript</a>
  </ul>
</div>

<article>
<h2>JavaScript mode</h2>


<div><textarea id="code" name="code">
// Demo code (the actual new parser character stream implementation)

function StringStream(string) {
  this.pos = 0;
  this.string = string;
}

StringStream.prototype = {
  done: function() {return this.pos >= this.string.length;},
  peek: function() {return this.string.charAt(this.pos);},
  next: function() {
    if (this.pos &lt; this.string.length)
      return this.string.charAt(this.pos++);
  },
  eat: function(match) {
    var ch = this.string.charAt(this.pos);
    if (typeof match == "string") var ok = ch == match;
    else var ok = ch &amp;&amp; match.test ? match.test(ch) : match(ch);
    if (ok) {this.pos++; return ch;}
  },
  eatWhile: function(match) {
    var start = this.pos;
    while (this.eat(match));
    if (this.pos > start) return this.string.slice(start, this.pos);
  },
  backUp: function(n) {this.pos -= n;},
  column: function() {return this.pos;},
  eatSpace: function() {
    var start = this.pos;
    while (/\s/.test(this.string.charAt(this.pos))) this.pos++;
    return this.pos - start;
  },
  match: function(pattern, consume, caseInsensitive) {
    if (typeof pattern == "string") {
      function cased(str) {return caseInsensitive ? str.toLowerCase() : str;}
      if (cased(this.string).indexOf(cased(pattern), this.pos) == this.pos) {
        if (consume !== false) this.pos += str.length;
        return true;
      }
    }
    else {
      var match = this.string.slice(this.pos).match(pattern);
      if (match &amp;&amp; consume !== false) this.pos += match[0].length;
      return match;
    }
  }
};
</textarea></div>

    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        lineNumbers: true,
        matchBrackets: true,
        continueComments: "Enter",
        extraKeys: {"Ctrl-Q": "toggleComment"}
      });
    </script>

    <p>
      JavaScript mode supports several configuration options:
      <ul>
        <li><code>json</code> which will set the mode to expect JSON
        data rather than a JavaScript program.</li>
        <li><code>jsonld</code> which will set the mode to expect
        <a href="http://json-ld.org">JSON-LD</a> linked data rather
        than a JavaScript program (<a href="json-ld.html">demo</a>).</li>
        <li><code>typescript</code> which will activate additional
        syntax highlighting and some other things for TypeScript code
        (<a href="typescript.html">demo</a>).</li>
        <li><code>statementIndent</code> which (given a number) will
        determine the amount of indentation to use for statements
        continued on a new line.</li>
        <li><code>wordCharacters</code>, a regexp that indicates which
        characters should be considered part of an identifier.
        Defaults to <code>/[\w$]/</code>, which does not handle
        non-ASCII identifiers. Can be set to something more elaborate
        to improve Unicode support.</li>
      </ul>
    </p>

    <p><strong>MIME types defined:</strong> <code>text/javascript</code>, <code>application/json</code>, <code>application/ld+json</code>, <code>text/typescript</code>, <code>application/typescript</code>.</p>
  </article>
codemirror/mode/javascript/test.js000064400000017221151215013510013315 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function() {
  var mode = CodeMirror.getMode({indentUnit: 2}, "javascript");
  function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); }

  MT("locals",
     "[keyword function] [def foo]([def a], [def b]) { [keyword var] [def c] [operator =] [number 10]; [keyword return] [variable-2 a] [operator +] [variable-2 c] [operator +] [variable d]; }");

  MT("comma-and-binop",
     "[keyword function](){ [keyword var] [def x] [operator =] [number 1] [operator +] [number 2], [def y]; }");

  MT("destructuring",
     "([keyword function]([def a], [[[def b], [def c] ]]) {",
     "  [keyword let] {[def d], [property foo]: [def c][operator =][number 10], [def x]} [operator =] [variable foo]([variable-2 a]);",
     "  [[[variable-2 c], [variable y] ]] [operator =] [variable-2 c];",
     "})();");

  MT("destructure_trailing_comma",
    "[keyword let] {[def a], [def b],} [operator =] [variable foo];",
    "[keyword let] [def c];"); // Parser still in good state?

  MT("class_body",
     "[keyword class] [def Foo] {",
     "  [property constructor]() {}",
     "  [property sayName]() {",
     "    [keyword return] [string-2 `foo${][variable foo][string-2 }oo`];",
     "  }",
     "}");

  MT("class",
     "[keyword class] [def Point] [keyword extends] [variable SuperThing] {",
     "  [property get] [property prop]() { [keyword return] [number 24]; }",
     "  [property constructor]([def x], [def y]) {",
     "    [keyword super]([string 'something']);",
     "    [keyword this].[property x] [operator =] [variable-2 x];",
     "  }",
     "}");

  MT("import",
     "[keyword function] [def foo]() {",
     "  [keyword import] [def $] [keyword from] [string 'jquery'];",
     "  [keyword import] { [def encrypt], [def decrypt] } [keyword from] [string 'crypto'];",
     "}");

  MT("import_trailing_comma",
     "[keyword import] {[def foo], [def bar],} [keyword from] [string 'baz']")

  MT("const",
     "[keyword function] [def f]() {",
     "  [keyword const] [[ [def a], [def b] ]] [operator =] [[ [number 1], [number 2] ]];",
     "}");

  MT("for/of",
     "[keyword for]([keyword let] [def of] [keyword of] [variable something]) {}");

  MT("generator",
     "[keyword function*] [def repeat]([def n]) {",
     "  [keyword for]([keyword var] [def i] [operator =] [number 0]; [variable-2 i] [operator <] [variable-2 n]; [operator ++][variable-2 i])",
     "    [keyword yield] [variable-2 i];",
     "}");

  MT("quotedStringAddition",
     "[keyword let] [def f] [operator =] [variable a] [operator +] [string 'fatarrow'] [operator +] [variable c];");

  MT("quotedFatArrow",
     "[keyword let] [def f] [operator =] [variable a] [operator +] [string '=>'] [operator +] [variable c];");

  MT("fatArrow",
     "[variable array].[property filter]([def a] [operator =>] [variable-2 a] [operator +] [number 1]);",
     "[variable a];", // No longer in scope
     "[keyword let] [def f] [operator =] ([[ [def a], [def b] ]], [def c]) [operator =>] [variable-2 a] [operator +] [variable-2 c];",
     "[variable c];");

  MT("spread",
     "[keyword function] [def f]([def a], [meta ...][def b]) {",
     "  [variable something]([variable-2 a], [meta ...][variable-2 b]);",
     "}");

  MT("quasi",
     "[variable re][string-2 `fofdlakj${][variable x] [operator +] ([variable re][string-2 `foo`]) [operator +] [number 1][string-2 }fdsa`] [operator +] [number 2]");

  MT("quasi_no_function",
     "[variable x] [operator =] [string-2 `fofdlakj${][variable x] [operator +] [string-2 `foo`] [operator +] [number 1][string-2 }fdsa`] [operator +] [number 2]");

  MT("indent_statement",
     "[keyword var] [def x] [operator =] [number 10]",
     "[variable x] [operator +=] [variable y] [operator +]",
     "  [atom Infinity]",
     "[keyword debugger];");

  MT("indent_if",
     "[keyword if] ([number 1])",
     "  [keyword break];",
     "[keyword else] [keyword if] ([number 2])",
     "  [keyword continue];",
     "[keyword else]",
     "  [number 10];",
     "[keyword if] ([number 1]) {",
     "  [keyword break];",
     "} [keyword else] [keyword if] ([number 2]) {",
     "  [keyword continue];",
     "} [keyword else] {",
     "  [number 10];",
     "}");

  MT("indent_for",
     "[keyword for] ([keyword var] [def i] [operator =] [number 0];",
     "     [variable i] [operator <] [number 100];",
     "     [variable i][operator ++])",
     "  [variable doSomething]([variable i]);",
     "[keyword debugger];");

  MT("indent_c_style",
     "[keyword function] [def foo]()",
     "{",
     "  [keyword debugger];",
     "}");

  MT("indent_else",
     "[keyword for] (;;)",
     "  [keyword if] ([variable foo])",
     "    [keyword if] ([variable bar])",
     "      [number 1];",
     "    [keyword else]",
     "      [number 2];",
     "  [keyword else]",
     "    [number 3];");

  MT("indent_funarg",
     "[variable foo]([number 10000],",
     "    [keyword function]([def a]) {",
     "  [keyword debugger];",
     "};");

  MT("indent_below_if",
     "[keyword for] (;;)",
     "  [keyword if] ([variable foo])",
     "    [number 1];",
     "[number 2];");

  MT("multilinestring",
     "[keyword var] [def x] [operator =] [string 'foo\\]",
     "[string bar'];");

  MT("scary_regexp",
     "[string-2 /foo[[/]]bar/];");

  MT("indent_strange_array",
     "[keyword var] [def x] [operator =] [[",
     "  [number 1],,",
     "  [number 2],",
     "]];",
     "[number 10];");

  MT("param_default",
     "[keyword function] [def foo]([def x] [operator =] [string-2 `foo${][number 10][string-2 }bar`]) {",
     "  [keyword return] [variable-2 x];",
     "}");

  MT("new_target",
     "[keyword function] [def F]([def target]) {",
     "  [keyword if] ([variable-2 target] [operator &&] [keyword new].[keyword target].[property name]) {",
     "    [keyword return] [keyword new]",
     "      .[keyword target];",
     "  }",
     "}");

  var ts_mode = CodeMirror.getMode({indentUnit: 2}, "application/typescript")
  function TS(name) {
    test.mode(name, ts_mode, Array.prototype.slice.call(arguments, 1))
  }

  TS("extend_type",
     "[keyword class] [def Foo] [keyword extends] [variable-3 Some][operator <][variable-3 Type][operator >] {}")

  TS("arrow_type",
     "[keyword let] [def x]: ([variable arg]: [variable-3 Type]) [operator =>] [variable-3 ReturnType]")

  var jsonld_mode = CodeMirror.getMode(
    {indentUnit: 2},
    {name: "javascript", jsonld: true}
  );
  function LD(name) {
    test.mode(name, jsonld_mode, Array.prototype.slice.call(arguments, 1));
  }

  LD("json_ld_keywords",
    '{',
    '  [meta "@context"]: {',
    '    [meta "@base"]: [string "http://example.com"],',
    '    [meta "@vocab"]: [string "http://xmlns.com/foaf/0.1/"],',
    '    [property "likesFlavor"]: {',
    '      [meta "@container"]: [meta "@list"]',
    '      [meta "@reverse"]: [string "@beFavoriteOf"]',
    '    },',
    '    [property "nick"]: { [meta "@container"]: [meta "@set"] },',
    '    [property "nick"]: { [meta "@container"]: [meta "@index"] }',
    '  },',
    '  [meta "@graph"]: [[ {',
    '    [meta "@id"]: [string "http://dbpedia.org/resource/John_Lennon"],',
    '    [property "name"]: [string "John Lennon"],',
    '    [property "modified"]: {',
    '      [meta "@value"]: [string "2010-05-29T14:17:39+02:00"],',
    '      [meta "@type"]: [string "http://www.w3.org/2001/XMLSchema#dateTime"]',
    '    }',
    '  } ]]',
    '}');

  LD("json_ld_fake",
    '{',
    '  [property "@fake"]: [string "@fake"],',
    '  [property "@contextual"]: [string "@identifier"],',
    '  [property "user@domain.com"]: [string "@graphical"],',
    '  [property "@ID"]: [string "@@ID"]',
    '}');
})();
codemirror/mode/javascript/typescript.html000064400000003013151215013510015066 0ustar00<!doctype html>

<title>CodeMirror: TypeScript mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="javascript.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">TypeScript</a>
  </ul>
</div>

<article>
<h2>TypeScript mode</h2>


<div><textarea id="code" name="code">
class Greeter {
	greeting: string;
	constructor (message: string) {
		this.greeting = message;
	}
	greet() {
		return "Hello, " + this.greeting;
	}
}   

var greeter = new Greeter("world");

var button = document.createElement('button')
button.innerText = "Say Hello"
button.onclick = function() {
	alert(greeter.greet())
}

document.body.appendChild(button)

</textarea></div>

    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        lineNumbers: true,
        matchBrackets: true,
        mode: "text/typescript"
      });
    </script>

    <p>This is a specialization of the <a href="index.html">JavaScript mode</a>.</p>
  </article>
codemirror/mode/mathematica/mathematica.js000064400000012754151215013510014730 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

// Mathematica mode copyright (c) 2015 by Calin Barbat
// Based on code by Patrick Scheibe (halirutan)
// See: https://github.com/halirutan/Mathematica-Source-Highlighting/tree/master/src/lang-mma.js

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode('mathematica', function(_config, _parserConfig) {

  // used pattern building blocks
  var Identifier = '[a-zA-Z\\$][a-zA-Z0-9\\$]*';
  var pBase      = "(?:\\d+)";
  var pFloat     = "(?:\\.\\d+|\\d+\\.\\d*|\\d+)";
  var pFloatBase = "(?:\\.\\w+|\\w+\\.\\w*|\\w+)";
  var pPrecision = "(?:`(?:`?"+pFloat+")?)";

  // regular expressions
  var reBaseForm        = new RegExp('(?:'+pBase+'(?:\\^\\^'+pFloatBase+pPrecision+'?(?:\\*\\^[+-]?\\d+)?))');
  var reFloatForm       = new RegExp('(?:' + pFloat + pPrecision + '?(?:\\*\\^[+-]?\\d+)?)');
  var reIdInContext     = new RegExp('(?:`?)(?:' + Identifier + ')(?:`(?:' + Identifier + '))*(?:`?)');

  function tokenBase(stream, state) {
    var ch;

    // get next character
    ch = stream.next();

    // string
    if (ch === '"') {
      state.tokenize = tokenString;
      return state.tokenize(stream, state);
    }

    // comment
    if (ch === '(') {
      if (stream.eat('*')) {
        state.commentLevel++;
        state.tokenize = tokenComment;
        return state.tokenize(stream, state);
      }
    }

    // go back one character
    stream.backUp(1);

    // look for numbers
    // Numbers in a baseform
    if (stream.match(reBaseForm, true, false)) {
      return 'number';
    }

    // Mathematica numbers. Floats (1.2, .2, 1.) can have optionally a precision (`float) or an accuracy definition
    // (``float). Note: while 1.2` is possible 1.2`` is not. At the end an exponent (float*^+12) can follow.
    if (stream.match(reFloatForm, true, false)) {
      return 'number';
    }

    /* In[23] and Out[34] */
    if (stream.match(/(?:In|Out)\[[0-9]*\]/, true, false)) {
      return 'atom';
    }

    // usage
    if (stream.match(/([a-zA-Z\$]+(?:`?[a-zA-Z0-9\$])*::usage)/, true, false)) {
      return 'meta';
    }

    // message
    if (stream.match(/([a-zA-Z\$]+(?:`?[a-zA-Z0-9\$])*::[a-zA-Z\$][a-zA-Z0-9\$]*):?/, true, false)) {
      return 'string-2';
    }

    // this makes a look-ahead match for something like variable:{_Integer}
    // the match is then forwarded to the mma-patterns tokenizer.
    if (stream.match(/([a-zA-Z\$][a-zA-Z0-9\$]*\s*:)(?:(?:[a-zA-Z\$][a-zA-Z0-9\$]*)|(?:[^:=>~@\^\&\*\)\[\]'\?,\|])).*/, true, false)) {
      return 'variable-2';
    }

    // catch variables which are used together with Blank (_), BlankSequence (__) or BlankNullSequence (___)
    // Cannot start with a number, but can have numbers at any other position. Examples
    // blub__Integer, a1_, b34_Integer32
    if (stream.match(/[a-zA-Z\$][a-zA-Z0-9\$]*_+[a-zA-Z\$][a-zA-Z0-9\$]*/, true, false)) {
      return 'variable-2';
    }
    if (stream.match(/[a-zA-Z\$][a-zA-Z0-9\$]*_+/, true, false)) {
      return 'variable-2';
    }
    if (stream.match(/_+[a-zA-Z\$][a-zA-Z0-9\$]*/, true, false)) {
      return 'variable-2';
    }

    // Named characters in Mathematica, like \[Gamma].
    if (stream.match(/\\\[[a-zA-Z\$][a-zA-Z0-9\$]*\]/, true, false)) {
      return 'variable-3';
    }

    // Match all braces separately
    if (stream.match(/(?:\[|\]|{|}|\(|\))/, true, false)) {
      return 'bracket';
    }

    // Catch Slots (#, ##, #3, ##9 and the V10 named slots #name). I have never seen someone using more than one digit after #, so we match
    // only one.
    if (stream.match(/(?:#[a-zA-Z\$][a-zA-Z0-9\$]*|#+[0-9]?)/, true, false)) {
      return 'variable-2';
    }

    // Literals like variables, keywords, functions
    if (stream.match(reIdInContext, true, false)) {
      return 'keyword';
    }

    // operators. Note that operators like @@ or /; are matched separately for each symbol.
    if (stream.match(/(?:\\|\+|\-|\*|\/|,|;|\.|:|@|~|=|>|<|&|\||_|`|'|\^|\?|!|%)/, true, false)) {
      return 'operator';
    }

    // everything else is an error
    stream.next(); // advance the stream.
    return 'error';
  }

  function tokenString(stream, state) {
    var next, end = false, escaped = false;
    while ((next = stream.next()) != null) {
      if (next === '"' && !escaped) {
        end = true;
        break;
      }
      escaped = !escaped && next === '\\';
    }
    if (end && !escaped) {
      state.tokenize = tokenBase;
    }
    return 'string';
  };

  function tokenComment(stream, state) {
    var prev, next;
    while(state.commentLevel > 0 && (next = stream.next()) != null) {
      if (prev === '(' && next === '*') state.commentLevel++;
      if (prev === '*' && next === ')') state.commentLevel--;
      prev = next;
    }
    if (state.commentLevel <= 0) {
      state.tokenize = tokenBase;
    }
    return 'comment';
  }

  return {
    startState: function() {return {tokenize: tokenBase, commentLevel: 0};},
    token: function(stream, state) {
      if (stream.eatSpace()) return null;
      return state.tokenize(stream, state);
    },
    blockCommentStart: "(*",
    blockCommentEnd: "*)"
  };
});

CodeMirror.defineMIME('text/x-mathematica', {
  name: 'mathematica'
});

});
codemirror/mode/mathematica/index.html000064400000004316151215013510014105 0ustar00<!doctype html>

<title>CodeMirror: Mathematica mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel=stylesheet href=../../lib/codemirror.css>
<script src=../../lib/codemirror.js></script>
<script src=../../addon/edit/matchbrackets.js></script>
<script src=mathematica.js></script>
<style type=text/css>
  .CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}
</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Mathematica</a>
  </ul>
</div>

<article>
<h2>Mathematica mode</h2>


<textarea id="mathematicaCode">
(* example Mathematica code *)
(* Dualisiert wird anhand einer Polarität an einer
   Quadrik $x^t Q x = 0$ mit regulärer Matrix $Q$ (also
   mit $det(Q) \neq 0$), z.B. die Identitätsmatrix.
   $p$ ist eine Liste von Polynomen - ein Ideal. *)
dualize::"singular" = "Q must be regular: found Det[Q]==0.";
dualize[ Q_, p_ ] := Block[
    { m, n, xv, lv, uv, vars, polys, dual },
    If[Det[Q] == 0,
      Message[dualize::"singular"],
      m = Length[p];
      n = Length[Q] - 1;
      xv = Table[Subscript[x, i], {i, 0, n}];
      lv = Table[Subscript[l, i], {i, 1, m}];
      uv = Table[Subscript[u, i], {i, 0, n}];
      (* Konstruiere Ideal polys. *)
      If[m == 0,
        polys = Q.uv,
        polys = Join[p, Q.uv - Transpose[Outer[D, p, xv]].lv]
        ];
      (* Eliminiere die ersten n + 1 + m Variablen xv und lv
         aus dem Ideal polys. *)
      vars = Join[xv, lv];
      dual = GroebnerBasis[polys, uv, vars];
      (* Ersetze u mit x im Ergebnis. *)
      ReplaceAll[dual, Rule[u, x]]
      ]
    ]
</textarea>

<script>
  var mathematicaEditor = CodeMirror.fromTextArea(document.getElementById('mathematicaCode'), {
    mode: 'text/x-mathematica',
    lineNumbers: true,
    matchBrackets: true
  });
</script>

<p><strong>MIME types defined:</strong> <code>text/x-mathematica</code> (Mathematica).</p>
</article>
codemirror/mode/velocity/velocity.js000064400000015672151215013510013674 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("velocity", function() {
    function parseWords(str) {
        var obj = {}, words = str.split(" ");
        for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
        return obj;
    }

    var keywords = parseWords("#end #else #break #stop #[[ #]] " +
                              "#{end} #{else} #{break} #{stop}");
    var functions = parseWords("#if #elseif #foreach #set #include #parse #macro #define #evaluate " +
                               "#{if} #{elseif} #{foreach} #{set} #{include} #{parse} #{macro} #{define} #{evaluate}");
    var specials = parseWords("$foreach.count $foreach.hasNext $foreach.first $foreach.last $foreach.topmost $foreach.parent.count $foreach.parent.hasNext $foreach.parent.first $foreach.parent.last $foreach.parent $velocityCount $!bodyContent $bodyContent");
    var isOperatorChar = /[+\-*&%=<>!?:\/|]/;

    function chain(stream, state, f) {
        state.tokenize = f;
        return f(stream, state);
    }
    function tokenBase(stream, state) {
        var beforeParams = state.beforeParams;
        state.beforeParams = false;
        var ch = stream.next();
        // start of unparsed string?
        if ((ch == "'") && !state.inString && state.inParams) {
            state.lastTokenWasBuiltin = false;
            return chain(stream, state, tokenString(ch));
        }
        // start of parsed string?
        else if ((ch == '"')) {
            state.lastTokenWasBuiltin = false;
            if (state.inString) {
                state.inString = false;
                return "string";
            }
            else if (state.inParams)
                return chain(stream, state, tokenString(ch));
        }
        // is it one of the special signs []{}().,;? Seperator?
        else if (/[\[\]{}\(\),;\.]/.test(ch)) {
            if (ch == "(" && beforeParams)
                state.inParams = true;
            else if (ch == ")") {
                state.inParams = false;
                state.lastTokenWasBuiltin = true;
            }
            return null;
        }
        // start of a number value?
        else if (/\d/.test(ch)) {
            state.lastTokenWasBuiltin = false;
            stream.eatWhile(/[\w\.]/);
            return "number";
        }
        // multi line comment?
        else if (ch == "#" && stream.eat("*")) {
            state.lastTokenWasBuiltin = false;
            return chain(stream, state, tokenComment);
        }
        // unparsed content?
        else if (ch == "#" && stream.match(/ *\[ *\[/)) {
            state.lastTokenWasBuiltin = false;
            return chain(stream, state, tokenUnparsed);
        }
        // single line comment?
        else if (ch == "#" && stream.eat("#")) {
            state.lastTokenWasBuiltin = false;
            stream.skipToEnd();
            return "comment";
        }
        // variable?
        else if (ch == "$") {
            stream.eatWhile(/[\w\d\$_\.{}]/);
            // is it one of the specials?
            if (specials && specials.propertyIsEnumerable(stream.current())) {
                return "keyword";
            }
            else {
                state.lastTokenWasBuiltin = true;
                state.beforeParams = true;
                return "builtin";
            }
        }
        // is it a operator?
        else if (isOperatorChar.test(ch)) {
            state.lastTokenWasBuiltin = false;
            stream.eatWhile(isOperatorChar);
            return "operator";
        }
        else {
            // get the whole word
            stream.eatWhile(/[\w\$_{}@]/);
            var word = stream.current();
            // is it one of the listed keywords?
            if (keywords && keywords.propertyIsEnumerable(word))
                return "keyword";
            // is it one of the listed functions?
            if (functions && functions.propertyIsEnumerable(word) ||
                    (stream.current().match(/^#@?[a-z0-9_]+ *$/i) && stream.peek()=="(") &&
                     !(functions && functions.propertyIsEnumerable(word.toLowerCase()))) {
                state.beforeParams = true;
                state.lastTokenWasBuiltin = false;
                return "keyword";
            }
            if (state.inString) {
                state.lastTokenWasBuiltin = false;
                return "string";
            }
            if (stream.pos > word.length && stream.string.charAt(stream.pos-word.length-1)=="." && state.lastTokenWasBuiltin)
                return "builtin";
            // default: just a "word"
            state.lastTokenWasBuiltin = false;
            return null;
        }
    }

    function tokenString(quote) {
        return function(stream, state) {
            var escaped = false, next, end = false;
            while ((next = stream.next()) != null) {
                if ((next == quote) && !escaped) {
                    end = true;
                    break;
                }
                if (quote=='"' && stream.peek() == '$' && !escaped) {
                    state.inString = true;
                    end = true;
                    break;
                }
                escaped = !escaped && next == "\\";
            }
            if (end) state.tokenize = tokenBase;
            return "string";
        };
    }

    function tokenComment(stream, state) {
        var maybeEnd = false, ch;
        while (ch = stream.next()) {
            if (ch == "#" && maybeEnd) {
                state.tokenize = tokenBase;
                break;
            }
            maybeEnd = (ch == "*");
        }
        return "comment";
    }

    function tokenUnparsed(stream, state) {
        var maybeEnd = 0, ch;
        while (ch = stream.next()) {
            if (ch == "#" && maybeEnd == 2) {
                state.tokenize = tokenBase;
                break;
            }
            if (ch == "]")
                maybeEnd++;
            else if (ch != " ")
                maybeEnd = 0;
        }
        return "meta";
    }
    // Interface

    return {
        startState: function() {
            return {
                tokenize: tokenBase,
                beforeParams: false,
                inParams: false,
                inString: false,
                lastTokenWasBuiltin: false
            };
        },

        token: function(stream, state) {
            if (stream.eatSpace()) return null;
            return state.tokenize(stream, state);
        },
        blockCommentStart: "#*",
        blockCommentEnd: "*#",
        lineComment: "##",
        fold: "velocity"
    };
});

CodeMirror.defineMIME("text/velocity", "velocity");

});
codemirror/mode/velocity/index.html000064400000006344151215013510013471 0ustar00<!doctype html>

<title>CodeMirror: Velocity mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<link rel="stylesheet" href="../../theme/night.css">
<script src="../../lib/codemirror.js"></script>
<script src="velocity.js"></script>
<style>.CodeMirror {border: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Velocity</a>
  </ul>
</div>

<article>
<h2>Velocity mode</h2>
<form><textarea id="code" name="code">
## Velocity Code Demo
#*
   based on PL/SQL mode by Peter Raganitsch, adapted to Velocity by Steve O'Hara ( http://www.pivotal-solutions.co.uk )
   August 2011
*#

#*
   This is a multiline comment.
   This is the second line
*#

#[[ hello steve
   This has invalid syntax that would normally need "poor man's escaping" like:

   #define()

   ${blah
]]#

#include( "disclaimer.txt" "opinion.txt" )
#include( $foo $bar )

#parse( "lecorbusier.vm" )
#parse( $foo )

#evaluate( 'string with VTL #if(true)will be displayed#end' )

#define( $hello ) Hello $who #end #set( $who = "World!") $hello ## displays Hello World!

#foreach( $customer in $customerList )

    $foreach.count $customer.Name

    #if( $foo == ${bar})
        it's true!
        #break
    #{else}
        it's not!
        #stop
    #end

    #if ($foreach.parent.hasNext)
        $velocityCount
    #end
#end

$someObject.getValues("this is a string split
        across lines")

$someObject("This plus $something in the middle").method(7567).property

#set($something = "Parseable string with '$quotes'!")

#macro( tablerows $color $somelist )
    #foreach( $something in $somelist )
        <tr><td bgcolor=$color>$something</td></tr>
        <tr><td bgcolor=$color>$bodyContent</td></tr>
    #end
#end

#tablerows("red" ["dadsdf","dsa"])
#@tablerows("red" ["dadsdf","dsa"]) some body content #end

   Variable reference: #set( $monkey = $bill )
   String literal: #set( $monkey.Friend = 'monica' )
   Property reference: #set( $monkey.Blame = $whitehouse.Leak )
   Method reference: #set( $monkey.Plan = $spindoctor.weave($web) )
   Number literal: #set( $monkey.Number = 123 )
   Range operator: #set( $monkey.Numbers = [1..3] )
   Object list: #set( $monkey.Say = ["Not", $my, "fault"] )
   Object map: #set( $monkey.Map = {"banana" : "good", "roast beef" : "bad"})

The RHS can also be a simple arithmetic expression, such as:
Addition: #set( $value = $foo + 1 )
   Subtraction: #set( $value = $bar - 1 )
   Multiplication: #set( $value = $foo * $bar )
   Division: #set( $value = $foo / $bar )
   Remainder: #set( $value = $foo % $bar )

</textarea></form>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        theme: "night",
        lineNumbers: true,
        indentUnit: 4,
        mode: "text/velocity"
      });
    </script>

    <p><strong>MIME types defined:</strong> <code>text/velocity</code>.</p>

  </article>
codemirror/mode/cmake/index.html000064400000010070151215013510012702 0ustar00<!doctype html>

<title>CodeMirror: CMake mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="cmake.js"></script>
<style>
      .CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}
      .cm-s-default span.cm-arrow { color: red; }
    </style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">CMake</a>
  </ul>
</div>

<article>
<h2>CMake mode</h2>
<form><textarea id="code" name="code">
# vim: syntax=cmake
if(NOT CMAKE_BUILD_TYPE)
    # default to Release build for GCC builds
    set(CMAKE_BUILD_TYPE Release CACHE STRING
        "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel."
        FORCE)
endif()
message(STATUS "cmake version ${CMAKE_VERSION}")
if(POLICY CMP0025)
    cmake_policy(SET CMP0025 OLD) # report Apple's Clang as just Clang
endif()
if(POLICY CMP0042)
    cmake_policy(SET CMP0042 NEW) # MACOSX_RPATH
endif()

project (x265)
cmake_minimum_required (VERSION 2.8.8) # OBJECT libraries require 2.8.8
include(CheckIncludeFiles)
include(CheckFunctionExists)
include(CheckSymbolExists)
include(CheckCXXCompilerFlag)

# X265_BUILD must be incremented each time the public API is changed
set(X265_BUILD 48)
configure_file("${PROJECT_SOURCE_DIR}/x265.def.in"
               "${PROJECT_BINARY_DIR}/x265.def")
configure_file("${PROJECT_SOURCE_DIR}/x265_config.h.in"
               "${PROJECT_BINARY_DIR}/x265_config.h")

SET(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake" "${CMAKE_MODULE_PATH}")

# System architecture detection
string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" SYSPROC)
set(X86_ALIASES x86 i386 i686 x86_64 amd64)
list(FIND X86_ALIASES "${SYSPROC}" X86MATCH)
if("${SYSPROC}" STREQUAL "" OR X86MATCH GREATER "-1")
    message(STATUS "Detected x86 target processor")
    set(X86 1)
    add_definitions(-DX265_ARCH_X86=1)
    if("${CMAKE_SIZEOF_VOID_P}" MATCHES 8)
        set(X64 1)
        add_definitions(-DX86_64=1)
    endif()
elseif(${SYSPROC} STREQUAL "armv6l")
    message(STATUS "Detected ARM target processor")
    set(ARM 1)
    add_definitions(-DX265_ARCH_ARM=1 -DHAVE_ARMV6=1)
else()
    message(STATUS "CMAKE_SYSTEM_PROCESSOR value `${CMAKE_SYSTEM_PROCESSOR}` is unknown")
    message(STATUS "Please add this value near ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE}")
endif()

if(UNIX)
    list(APPEND PLATFORM_LIBS pthread)
    find_library(LIBRT rt)
    if(LIBRT)
        list(APPEND PLATFORM_LIBS rt)
    endif()
    find_package(Numa)
    if(NUMA_FOUND)
        list(APPEND CMAKE_REQUIRED_LIBRARIES ${NUMA_LIBRARY})
        check_symbol_exists(numa_node_of_cpu numa.h NUMA_V2)
        if(NUMA_V2)
            add_definitions(-DHAVE_LIBNUMA)
            message(STATUS "libnuma found, building with support for NUMA nodes")
            list(APPEND PLATFORM_LIBS ${NUMA_LIBRARY})
            link_directories(${NUMA_LIBRARY_DIR})
            include_directories(${NUMA_INCLUDE_DIR})
        endif()
    endif()
    mark_as_advanced(LIBRT NUMA_FOUND)
endif(UNIX)

if(X64 AND NOT WIN32)
    option(ENABLE_PIC "Enable Position Independent Code" ON)
else()
    option(ENABLE_PIC "Enable Position Independent Code" OFF)
endif(X64 AND NOT WIN32)

# Compiler detection
if(CMAKE_GENERATOR STREQUAL "Xcode")
  set(XCODE 1)
endif()
if (APPLE)
  add_definitions(-DMACOS)
endif()
</textarea></form>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        mode: "text/x-cmake",
        matchBrackets: true,
        indentUnit: 4
      });
    </script>

    <p><strong>MIME types defined:</strong> <code>text/x-cmake</code>.</p>

  </article>
codemirror/mode/cmake/cmake.js000064400000005050151215013510012325 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object")
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd)
    define(["../../lib/codemirror"], mod);
  else
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("cmake", function () {
  var variable_regex = /({)?[a-zA-Z0-9_]+(})?/;

  function tokenString(stream, state) {
    var current, prev, found_var = false;
    while (!stream.eol() && (current = stream.next()) != state.pending) {
      if (current === '$' && prev != '\\' && state.pending == '"') {
        found_var = true;
        break;
      }
      prev = current;
    }
    if (found_var) {
      stream.backUp(1);
    }
    if (current == state.pending) {
      state.continueString = false;
    } else {
      state.continueString = true;
    }
    return "string";
  }

  function tokenize(stream, state) {
    var ch = stream.next();

    // Have we found a variable?
    if (ch === '$') {
      if (stream.match(variable_regex)) {
        return 'variable-2';
      }
      return 'variable';
    }
    // Should we still be looking for the end of a string?
    if (state.continueString) {
      // If so, go through the loop again
      stream.backUp(1);
      return tokenString(stream, state);
    }
    // Do we just have a function on our hands?
    // In 'cmake_minimum_required (VERSION 2.8.8)', 'cmake_minimum_required' is matched
    if (stream.match(/(\s+)?\w+\(/) || stream.match(/(\s+)?\w+\ \(/)) {
      stream.backUp(1);
      return 'def';
    }
    if (ch == "#") {
      stream.skipToEnd();
      return "comment";
    }
    // Have we found a string?
    if (ch == "'" || ch == '"') {
      // Store the type (single or double)
      state.pending = ch;
      // Perform the looping function to find the end
      return tokenString(stream, state);
    }
    if (ch == '(' || ch == ')') {
      return 'bracket';
    }
    if (ch.match(/[0-9]/)) {
      return 'number';
    }
    stream.eatWhile(/[\w-]/);
    return null;
  }
  return {
    startState: function () {
      var state = {};
      state.inDefinition = false;
      state.inInclude = false;
      state.continueString = false;
      state.pending = false;
      return state;
    },
    token: function (stream, state) {
      if (stream.eatSpace()) return null;
      return tokenize(stream, state);
    }
  };
});

CodeMirror.defineMIME("text/x-cmake", "cmake");

});
codemirror/mode/soy/soy.js000064400000016715151215013510011623 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror", "../htmlmixed/htmlmixed"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  var indentingTags = ["template", "literal", "msg", "fallbackmsg", "let", "if", "elseif",
                       "else", "switch", "case", "default", "foreach", "ifempty", "for",
                       "call", "param", "deltemplate", "delcall", "log"];

  CodeMirror.defineMode("soy", function(config) {
    var textMode = CodeMirror.getMode(config, "text/plain");
    var modes = {
      html: CodeMirror.getMode(config, {name: "text/html", multilineTagIndentFactor: 2, multilineTagIndentPastTag: false}),
      attributes: textMode,
      text: textMode,
      uri: textMode,
      css: CodeMirror.getMode(config, "text/css"),
      js: CodeMirror.getMode(config, {name: "text/javascript", statementIndent: 2 * config.indentUnit})
    };

    function last(array) {
      return array[array.length - 1];
    }

    function tokenUntil(stream, state, untilRegExp) {
      var oldString = stream.string;
      var match = untilRegExp.exec(oldString.substr(stream.pos));
      if (match) {
        // We don't use backUp because it backs up just the position, not the state.
        // This uses an undocumented API.
        stream.string = oldString.substr(0, stream.pos + match.index);
      }
      var result = stream.hideFirstChars(state.indent, function() {
        return state.localMode.token(stream, state.localState);
      });
      stream.string = oldString;
      return result;
    }

    return {
      startState: function() {
        return {
          kind: [],
          kindTag: [],
          soyState: [],
          indent: 0,
          localMode: modes.html,
          localState: CodeMirror.startState(modes.html)
        };
      },

      copyState: function(state) {
        return {
          tag: state.tag, // Last seen Soy tag.
          kind: state.kind.concat([]), // Values of kind="" attributes.
          kindTag: state.kindTag.concat([]), // Opened tags with kind="" attributes.
          soyState: state.soyState.concat([]),
          indent: state.indent, // Indentation of the following line.
          localMode: state.localMode,
          localState: CodeMirror.copyState(state.localMode, state.localState)
        };
      },

      token: function(stream, state) {
        var match;

        switch (last(state.soyState)) {
          case "comment":
            if (stream.match(/^.*?\*\//)) {
              state.soyState.pop();
            } else {
              stream.skipToEnd();
            }
            return "comment";

          case "variable":
            if (stream.match(/^}/)) {
              state.indent -= 2 * config.indentUnit;
              state.soyState.pop();
              return "variable-2";
            }
            stream.next();
            return null;

          case "tag":
            if (stream.match(/^\/?}/)) {
              if (state.tag == "/template" || state.tag == "/deltemplate") state.indent = 0;
              else state.indent -= (stream.current() == "/}" || indentingTags.indexOf(state.tag) == -1 ? 2 : 1) * config.indentUnit;
              state.soyState.pop();
              return "keyword";
            } else if (stream.match(/^([\w?]+)(?==)/)) {
              if (stream.current() == "kind" && (match = stream.match(/^="([^"]+)/, false))) {
                var kind = match[1];
                state.kind.push(kind);
                state.kindTag.push(state.tag);
                state.localMode = modes[kind] || modes.html;
                state.localState = CodeMirror.startState(state.localMode);
              }
              return "attribute";
            } else if (stream.match(/^"/)) {
              state.soyState.push("string");
              return "string";
            }
            stream.next();
            return null;

          case "literal":
            if (stream.match(/^(?=\{\/literal})/)) {
              state.indent -= config.indentUnit;
              state.soyState.pop();
              return this.token(stream, state);
            }
            return tokenUntil(stream, state, /\{\/literal}/);

          case "string":
            var match = stream.match(/^.*?("|\\[\s\S])/);
            if (!match) {
              stream.skipToEnd();
            } else if (match[1] == "\"") {
              state.soyState.pop();
            }
            return "string";
        }

        if (stream.match(/^\/\*/)) {
          state.soyState.push("comment");
          return "comment";
        } else if (stream.match(stream.sol() ? /^\s*\/\/.*/ : /^\s+\/\/.*/)) {
          return "comment";
        } else if (stream.match(/^\{\$[\w?]*/)) {
          state.indent += 2 * config.indentUnit;
          state.soyState.push("variable");
          return "variable-2";
        } else if (stream.match(/^\{literal}/)) {
          state.indent += config.indentUnit;
          state.soyState.push("literal");
          return "keyword";
        } else if (match = stream.match(/^\{([\/@\\]?[\w?]*)/)) {
          if (match[1] != "/switch")
            state.indent += (/^(\/|(else|elseif|case|default)$)/.test(match[1]) && state.tag != "switch" ? 1 : 2) * config.indentUnit;
          state.tag = match[1];
          if (state.tag == "/" + last(state.kindTag)) {
            // We found the tag that opened the current kind="".
            state.kind.pop();
            state.kindTag.pop();
            state.localMode = modes[last(state.kind)] || modes.html;
            state.localState = CodeMirror.startState(state.localMode);
          }
          state.soyState.push("tag");
          return "keyword";
        }

        return tokenUntil(stream, state, /\{|\s+\/\/|\/\*/);
      },

      indent: function(state, textAfter) {
        var indent = state.indent, top = last(state.soyState);
        if (top == "comment") return CodeMirror.Pass;

        if (top == "literal") {
          if (/^\{\/literal}/.test(textAfter)) indent -= config.indentUnit;
        } else {
          if (/^\s*\{\/(template|deltemplate)\b/.test(textAfter)) return 0;
          if (/^\{(\/|(fallbackmsg|elseif|else|ifempty)\b)/.test(textAfter)) indent -= config.indentUnit;
          if (state.tag != "switch" && /^\{(case|default)\b/.test(textAfter)) indent -= config.indentUnit;
          if (/^\{\/switch\b/.test(textAfter)) indent -= config.indentUnit;
        }
        if (indent && state.localMode.indent)
          indent += state.localMode.indent(state.localState, textAfter);
        return indent;
      },

      innerMode: function(state) {
        if (state.soyState.length && last(state.soyState) != "literal") return null;
        else return {state: state.localState, mode: state.localMode};
      },

      electricInput: /^\s*\{(\/|\/template|\/deltemplate|\/switch|fallbackmsg|elseif|else|case|default|ifempty|\/literal\})$/,
      lineComment: "//",
      blockCommentStart: "/*",
      blockCommentEnd: "*/",
      blockCommentContinue: " * ",
      fold: "indent"
    };
  }, "htmlmixed");

  CodeMirror.registerHelper("hintWords", "soy", indentingTags.concat(
      ["delpackage", "namespace", "alias", "print", "css", "debugger"]));

  CodeMirror.defineMIME("text/x-soy", "soy");
});
codemirror/mode/soy/index.html000064400000003623151215013510012442 0ustar00<!doctype html>

<title>CodeMirror: Soy (Closure Template) mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="../htmlmixed/htmlmixed.js"></script>
<script src="../xml/xml.js"></script>
<script src="../javascript/javascript.js"></script>
<script src="../css/css.js"></script>
<script src="soy.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Soy (Closure Template)</a>
  </ul>
</div>

<article>
<h2>Soy (Closure Template) mode</h2>
<form><textarea id="code" name="code">
{namespace example}

/**
 * Says hello to the world.
 */
{template .helloWorld}
  {@param name: string}
  {@param? score: number}
  Hello <b>{$name}</b>!
  <div>
    {if $score}
      <em>{$score} points</em>
    {else}
      no score
    {/if}
  </div>
{/template}

{template .alertHelloWorld kind="js"}
  alert('Hello World');
{/template}
</textarea></form>

    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        lineNumbers: true,
        matchBrackets: true,
        mode: "text/x-soy",
        indentUnit: 2,
        indentWithTabs: false
      });
    </script>

    <p>A mode for <a href="https://developers.google.com/closure/templates/">Closure Templates</a> (Soy).</p>
    <p><strong>MIME type defined:</strong> <code>text/x-soy</code>.</p>
  </article>
codemirror/mode/mllike/index.html000064400000010524151215013510013103 0ustar00<!doctype html>

<title>CodeMirror: ML-like mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel=stylesheet href=../../lib/codemirror.css>
<script src=../../lib/codemirror.js></script>
<script src=../../addon/edit/matchbrackets.js></script>
<script src=mllike.js></script>
<style type=text/css>
  .CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}
</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">ML-like</a>
  </ul>
</div>

<article>
<h2>OCaml mode</h2>


<textarea id="ocamlCode">
(* Summing a list of integers *)
let rec sum xs =
  match xs with
    | []       -&gt; 0
    | x :: xs' -&gt; x + sum xs'

(* Quicksort *)
let rec qsort = function
   | [] -&gt; []
   | pivot :: rest -&gt;
       let is_less x = x &lt; pivot in
       let left, right = List.partition is_less rest in
       qsort left @ [pivot] @ qsort right

(* Fibonacci Sequence *)
let rec fib_aux n a b =
  match n with
  | 0 -&gt; a
  | _ -&gt; fib_aux (n - 1) (a + b) a
let fib n = fib_aux n 0 1

(* Birthday paradox *)
let year_size = 365.

let rec birthday_paradox prob people =
    let prob' = (year_size -. float people) /. year_size *. prob  in
    if prob' &lt; 0.5 then
        Printf.printf "answer = %d\n" (people+1)
    else
        birthday_paradox prob' (people+1) ;;

birthday_paradox 1.0 1

(* Church numerals *)
let zero f x = x
let succ n f x = f (n f x)
let one = succ zero
let two = succ (succ zero)
let add n1 n2 f x = n1 f (n2 f x)
let to_string n = n (fun k -&gt; "S" ^ k) "0"
let _ = to_string (add (succ two) two)

(* Elementary functions *)
let square x = x * x;;
let rec fact x =
  if x &lt;= 1 then 1 else x * fact (x - 1);;

(* Automatic memory management *)
let l = 1 :: 2 :: 3 :: [];;
[1; 2; 3];;
5 :: l;;

(* Polymorphism: sorting lists *)
let rec sort = function
  | [] -&gt; []
  | x :: l -&gt; insert x (sort l)

and insert elem = function
  | [] -&gt; [elem]
  | x :: l -&gt;
      if elem &lt; x then elem :: x :: l else x :: insert elem l;;

(* Imperative features *)
let add_polynom p1 p2 =
  let n1 = Array.length p1
  and n2 = Array.length p2 in
  let result = Array.create (max n1 n2) 0 in
  for i = 0 to n1 - 1 do result.(i) &lt;- p1.(i) done;
  for i = 0 to n2 - 1 do result.(i) &lt;- result.(i) + p2.(i) done;
  result;;
add_polynom [| 1; 2 |] [| 1; 2; 3 |];;

(* We may redefine fact using a reference cell and a for loop *)
let fact n =
  let result = ref 1 in
  for i = 2 to n do
    result := i * !result
   done;
   !result;;
fact 5;;

(* Triangle (graphics) *)
let () =
  ignore( Glut.init Sys.argv );
  Glut.initDisplayMode ~double_buffer:true ();
  ignore (Glut.createWindow ~title:"OpenGL Demo");
  let angle t = 10. *. t *. t in
  let render () =
    GlClear.clear [ `color ];
    GlMat.load_identity ();
    GlMat.rotate ~angle: (angle (Sys.time ())) ~z:1. ();
    GlDraw.begins `triangles;
    List.iter GlDraw.vertex2 [-1., -1.; 0., 1.; 1., -1.];
    GlDraw.ends ();
    Glut.swapBuffers () in
  GlMat.mode `modelview;
  Glut.displayFunc ~cb:render;
  Glut.idleFunc ~cb:(Some Glut.postRedisplay);
  Glut.mainLoop ()

(* A Hundred Lines of Caml - http://caml.inria.fr/about/taste.en.html *)
(* OCaml page on Wikipedia - http://en.wikipedia.org/wiki/OCaml *)
</textarea>

<h2>F# mode</h2>
<textarea id="fsharpCode">
module CodeMirror.FSharp

let rec fib = function
    | 0 -> 0
    | 1 -> 1
    | n -> fib (n - 1) + fib (n - 2)

type Point =
    {
        x : int
        y : int
    }

type Color =
    | Red
    | Green
    | Blue

[0 .. 10]
|> List.map ((+) 2)
|> List.fold (fun x y -> x + y) 0
|> printf "%i"
</textarea>


<script>
  var ocamlEditor = CodeMirror.fromTextArea(document.getElementById('ocamlCode'), {
    mode: 'text/x-ocaml',
    lineNumbers: true,
    matchBrackets: true
  });

  var fsharpEditor = CodeMirror.fromTextArea(document.getElementById('fsharpCode'), {
    mode: 'text/x-fsharp',
    lineNumbers: true,
    matchBrackets: true
  });
</script>

<p><strong>MIME types defined:</strong> <code>text/x-ocaml</code> (OCaml) and <code>text/x-fsharp</code> (F#).</p>
</article>
codemirror/mode/mllike/mllike.js000064400000011632151215013510012722 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode('mllike', function(_config, parserConfig) {
  var words = {
    'let': 'keyword',
    'rec': 'keyword',
    'in': 'keyword',
    'of': 'keyword',
    'and': 'keyword',
    'if': 'keyword',
    'then': 'keyword',
    'else': 'keyword',
    'for': 'keyword',
    'to': 'keyword',
    'while': 'keyword',
    'do': 'keyword',
    'done': 'keyword',
    'fun': 'keyword',
    'function': 'keyword',
    'val': 'keyword',
    'type': 'keyword',
    'mutable': 'keyword',
    'match': 'keyword',
    'with': 'keyword',
    'try': 'keyword',
    'open': 'builtin',
    'ignore': 'builtin',
    'begin': 'keyword',
    'end': 'keyword'
  };

  var extraWords = parserConfig.extraWords || {};
  for (var prop in extraWords) {
    if (extraWords.hasOwnProperty(prop)) {
      words[prop] = parserConfig.extraWords[prop];
    }
  }

  function tokenBase(stream, state) {
    var ch = stream.next();

    if (ch === '"') {
      state.tokenize = tokenString;
      return state.tokenize(stream, state);
    }
    if (ch === '(') {
      if (stream.eat('*')) {
        state.commentLevel++;
        state.tokenize = tokenComment;
        return state.tokenize(stream, state);
      }
    }
    if (ch === '~') {
      stream.eatWhile(/\w/);
      return 'variable-2';
    }
    if (ch === '`') {
      stream.eatWhile(/\w/);
      return 'quote';
    }
    if (ch === '/' && parserConfig.slashComments && stream.eat('/')) {
      stream.skipToEnd();
      return 'comment';
    }
    if (/\d/.test(ch)) {
      stream.eatWhile(/[\d]/);
      if (stream.eat('.')) {
        stream.eatWhile(/[\d]/);
      }
      return 'number';
    }
    if ( /[+\-*&%=<>!?|]/.test(ch)) {
      return 'operator';
    }
    stream.eatWhile(/\w/);
    var cur = stream.current();
    return words.hasOwnProperty(cur) ? words[cur] : 'variable';
  }

  function tokenString(stream, state) {
    var next, end = false, escaped = false;
    while ((next = stream.next()) != null) {
      if (next === '"' && !escaped) {
        end = true;
        break;
      }
      escaped = !escaped && next === '\\';
    }
    if (end && !escaped) {
      state.tokenize = tokenBase;
    }
    return 'string';
  };

  function tokenComment(stream, state) {
    var prev, next;
    while(state.commentLevel > 0 && (next = stream.next()) != null) {
      if (prev === '(' && next === '*') state.commentLevel++;
      if (prev === '*' && next === ')') state.commentLevel--;
      prev = next;
    }
    if (state.commentLevel <= 0) {
      state.tokenize = tokenBase;
    }
    return 'comment';
  }

  return {
    startState: function() {return {tokenize: tokenBase, commentLevel: 0};},
    token: function(stream, state) {
      if (stream.eatSpace()) return null;
      return state.tokenize(stream, state);
    },

    blockCommentStart: "(*",
    blockCommentEnd: "*)",
    lineComment: parserConfig.slashComments ? "//" : null
  };
});

CodeMirror.defineMIME('text/x-ocaml', {
  name: 'mllike',
  extraWords: {
    'succ': 'keyword',
    'trace': 'builtin',
    'exit': 'builtin',
    'print_string': 'builtin',
    'print_endline': 'builtin',
    'true': 'atom',
    'false': 'atom',
    'raise': 'keyword'
  }
});

CodeMirror.defineMIME('text/x-fsharp', {
  name: 'mllike',
  extraWords: {
    'abstract': 'keyword',
    'as': 'keyword',
    'assert': 'keyword',
    'base': 'keyword',
    'class': 'keyword',
    'default': 'keyword',
    'delegate': 'keyword',
    'downcast': 'keyword',
    'downto': 'keyword',
    'elif': 'keyword',
    'exception': 'keyword',
    'extern': 'keyword',
    'finally': 'keyword',
    'global': 'keyword',
    'inherit': 'keyword',
    'inline': 'keyword',
    'interface': 'keyword',
    'internal': 'keyword',
    'lazy': 'keyword',
    'let!': 'keyword',
    'member' : 'keyword',
    'module': 'keyword',
    'namespace': 'keyword',
    'new': 'keyword',
    'null': 'keyword',
    'override': 'keyword',
    'private': 'keyword',
    'public': 'keyword',
    'return': 'keyword',
    'return!': 'keyword',
    'select': 'keyword',
    'static': 'keyword',
    'struct': 'keyword',
    'upcast': 'keyword',
    'use': 'keyword',
    'use!': 'keyword',
    'val': 'keyword',
    'when': 'keyword',
    'yield': 'keyword',
    'yield!': 'keyword',

    'List': 'builtin',
    'Seq': 'builtin',
    'Map': 'builtin',
    'Set': 'builtin',
    'int': 'builtin',
    'string': 'builtin',
    'raise': 'builtin',
    'failwith': 'builtin',
    'not': 'builtin',
    'true': 'builtin',
    'false': 'builtin'
  },
  slashComments: true
});

});
codemirror/mode/julia/index.html000064400000004507151215013510012736 0ustar00<!doctype html>

<title>CodeMirror: Julia mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="julia.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Julia</a>
  </ul>
</div>

<article>
<h2>Julia mode</h2>

    <div><textarea id="code" name="code">
#numbers
1234
1234im
.234
.234im
2.23im
2.3f3
23e2
0x234

#strings
'a'
"asdf"
r"regex"
b"bytestring"

"""
multiline string
"""

#identifiers
a
as123
function_name!

#unicode identifiers
# a = x\ddot
a⃗ = ẍ
# a = v\dot
a⃗ = v̇
#F\vec = m \cdotp a\vec
F⃗ = m·a⃗

#literal identifier multiples
3x
4[1, 2, 3]

#dicts and indexing
x=[1, 2, 3]
x[end-1]
x={"julia"=>"language of technical computing"}


#exception handling
try
  f()
catch
  @printf "Error"
finally
  g()
end

#types
immutable Color{T<:Number}
  r::T
  g::T
  b::T
end

#functions
function change!(x::Vector{Float64})
  for i = 1:length(x)
    x[i] *= 2
  end
end

#function invocation
f('b', (2, 3)...)

#operators
|=
&=
^=
\-
%=
*=
+=
-=
<=
>=
!=
==
%
*
+
-
<
>
!
=
|
&
^
\
?
~
:
$
<:
.<
.>
<<
<<=
>>
>>>>
>>=
>>>=
<<=
<<<=
.<=
.>=
.==
->
//
in
...
//
:=
.//=
.*=
./=
.^=
.%=
.+=
.-=
\=
\\=
||
===
&&
|=
.|=
<:
>:
|>
<|
::
x ? y : z

#macros
@spawnat 2 1+1
@eval(:x)

#keywords and operators
if else elseif while for
 begin let end do
try catch finally return break continue
global local const 
export import importall using
function macro module baremodule 
type immutable quote
true false enumerate


    </textarea></div>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        mode: {name: "julia",
               },
        lineNumbers: true,
        indentUnit: 4,
        matchBrackets: true
      });
    </script>

    <p><strong>MIME types defined:</strong> <code>text/x-julia</code>.</p>
</article>
codemirror/mode/julia/julia.js000064400000026246151215013510012407 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("julia", function(_conf, parserConf) {
  var ERRORCLASS = 'error';

  function wordRegexp(words, end) {
    if (typeof end === 'undefined') { end = "\\b"; }
    return new RegExp("^((" + words.join(")|(") + "))" + end);
  }

  var octChar = "\\\\[0-7]{1,3}";
  var hexChar = "\\\\x[A-Fa-f0-9]{1,2}";
  var specialChar = "\\\\[abfnrtv0%?'\"\\\\]";
  var singleChar = "([^\\u0027\\u005C\\uD800-\\uDFFF]|[\\uD800-\\uDFFF][\\uDC00-\\uDFFF])";
  var operators = parserConf.operators || /^\.?[|&^\\%*+\-<>!=\/]=?|\?|~|:|\$|\.[<>]|<<=?|>>>?=?|\.[<>=]=|->?|\/\/|\bin\b(?!\()|[\u2208\u2209](?!\()/;
  var delimiters = parserConf.delimiters || /^[;,()[\]{}]/;
  var identifiers = parserConf.identifiers || /^[_A-Za-z\u00A1-\uFFFF][\w\u00A1-\uFFFF]*!*/;
  var charsList = [octChar, hexChar, specialChar, singleChar];
  var blockOpeners = ["begin", "function", "type", "immutable", "let", "macro", "for", "while", "quote", "if", "else", "elseif", "try", "finally", "catch", "do"];
  var blockClosers = ["end", "else", "elseif", "catch", "finally"];
  var keywordList = ['if', 'else', 'elseif', 'while', 'for', 'begin', 'let', 'end', 'do', 'try', 'catch', 'finally', 'return', 'break', 'continue', 'global', 'local', 'const', 'export', 'import', 'importall', 'using', 'function', 'macro', 'module', 'baremodule', 'type', 'immutable', 'quote', 'typealias', 'abstract', 'bitstype'];
  var builtinList = ['true', 'false', 'nothing', 'NaN', 'Inf'];

  //var stringPrefixes = new RegExp("^[br]?('|\")")
  var stringPrefixes = /^(`|"{3}|([brv]?"))/;
  var chars = wordRegexp(charsList, "'");
  var keywords = wordRegexp(keywordList);
  var builtins = wordRegexp(builtinList);
  var openers = wordRegexp(blockOpeners);
  var closers = wordRegexp(blockClosers);
  var macro = /^@[_A-Za-z][\w]*/;
  var symbol = /^:[_A-Za-z\u00A1-\uFFFF][\w\u00A1-\uFFFF]*!*/;
  var typeAnnotation = /^::[^,;"{()=$\s]+({[^}]*}+)*/;

  function inArray(state) {
    var ch = currentScope(state);
    if (ch == '[') {
      return true;
    }
    return false;
  }

  function currentScope(state) {
    if (state.scopes.length == 0) {
      return null;
    }
    return state.scopes[state.scopes.length - 1];
  }

  // tokenizers
  function tokenBase(stream, state) {
    // Handle multiline comments
    if (stream.match(/^#=/, false)) {
      state.tokenize = tokenComment;
      return state.tokenize(stream, state);
    }

    // Handle scope changes
    var leavingExpr = state.leavingExpr;
    if (stream.sol()) {
      leavingExpr = false;
    }
    state.leavingExpr = false;
    if (leavingExpr) {
      if (stream.match(/^'+/)) {
        return 'operator';
      }
    }

    if (stream.match(/^\.{2,3}/)) {
      return 'operator';
    }

    if (stream.eatSpace()) {
      return null;
    }

    var ch = stream.peek();

    // Handle single line comments
    if (ch === '#') {
      stream.skipToEnd();
      return 'comment';
    }

    if (ch === '[') {
      state.scopes.push('[');
    }

    if (ch === '(') {
      state.scopes.push('(');
    }

    var scope = currentScope(state);

    if (scope == '[' && ch === ']') {
      state.scopes.pop();
      state.leavingExpr = true;
    }

    if (scope == '(' && ch === ')') {
      state.scopes.pop();
      state.leavingExpr = true;
    }

    var match;
    if (!inArray(state) && (match=stream.match(openers, false))) {
      state.scopes.push(match);
    }

    if (!inArray(state) && stream.match(closers, false)) {
      state.scopes.pop();
    }

    if (inArray(state)) {
      if (state.lastToken == 'end' && stream.match(/^:/)) {
        return 'operator';
      }
      if (stream.match(/^end/)) {
        return 'number';
      }
    }

    if (stream.match(/^=>/)) {
      return 'operator';
    }

    // Handle Number Literals
    if (stream.match(/^[0-9\.]/, false)) {
      var imMatcher = RegExp(/^im\b/);
      var numberLiteral = false;
      // Floats
      if (stream.match(/^\d*\.(?!\.)\d*([Eef][\+\-]?\d+)?/i)) { numberLiteral = true; }
      if (stream.match(/^\d+\.(?!\.)\d*/)) { numberLiteral = true; }
      if (stream.match(/^\.\d+/)) { numberLiteral = true; }
      if (stream.match(/^0x\.[0-9a-f]+p[\+\-]?\d+/i)) { numberLiteral = true; }
      // Integers
      if (stream.match(/^0x[0-9a-f]+/i)) { numberLiteral = true; } // Hex
      if (stream.match(/^0b[01]+/i)) { numberLiteral = true; } // Binary
      if (stream.match(/^0o[0-7]+/i)) { numberLiteral = true; } // Octal
      if (stream.match(/^[1-9]\d*(e[\+\-]?\d+)?/)) { numberLiteral = true; } // Decimal
      // Zero by itself with no other piece of number.
      if (stream.match(/^0(?![\dx])/i)) { numberLiteral = true; }
      if (numberLiteral) {
          // Integer literals may be "long"
          stream.match(imMatcher);
          state.leavingExpr = true;
          return 'number';
      }
    }

    if (stream.match(/^<:/)) {
      return 'operator';
    }

    if (stream.match(typeAnnotation)) {
      return 'builtin';
    }

    // Handle symbols
    if (!leavingExpr && stream.match(symbol) || stream.match(/:\./)) {
      return 'builtin';
    }

    // Handle parametric types
    if (stream.match(/^{[^}]*}(?=\()/)) {
      return 'builtin';
    }

    // Handle operators and Delimiters
    if (stream.match(operators)) {
      return 'operator';
    }

    // Handle Chars
    if (stream.match(/^'/)) {
      state.tokenize = tokenChar;
      return state.tokenize(stream, state);
    }

    // Handle Strings
    if (stream.match(stringPrefixes)) {
      state.tokenize = tokenStringFactory(stream.current());
      return state.tokenize(stream, state);
    }

    if (stream.match(macro)) {
      return 'meta';
    }

    if (stream.match(delimiters)) {
      return null;
    }

    if (stream.match(keywords)) {
      return 'keyword';
    }

    if (stream.match(builtins)) {
      return 'builtin';
    }

    var isDefinition = state.isDefinition ||
                       state.lastToken == 'function' ||
                       state.lastToken == 'macro' ||
                       state.lastToken == 'type' ||
                       state.lastToken == 'immutable';

    if (stream.match(identifiers)) {
      if (isDefinition) {
        if (stream.peek() === '.') {
          state.isDefinition = true;
          return 'variable';
        }
        state.isDefinition = false;
        return 'def';
      }
      if (stream.match(/^({[^}]*})*\(/, false)) {
        return callOrDef(stream, state);
      }
      state.leavingExpr = true;
      return 'variable';
    }

    // Handle non-detected items
    stream.next();
    return ERRORCLASS;
  }

  function callOrDef(stream, state) {
    var match = stream.match(/^(\(\s*)/);
    if (match) {
      if (state.firstParenPos < 0)
        state.firstParenPos = state.scopes.length;
      state.scopes.push('(');
      state.charsAdvanced += match[1].length;
    }
    if (currentScope(state) == '(' && stream.match(/^\)/)) {
      state.scopes.pop();
      state.charsAdvanced += 1;
      if (state.scopes.length <= state.firstParenPos) {
        var isDefinition = stream.match(/^\s*?=(?!=)/, false);
        stream.backUp(state.charsAdvanced);
        state.firstParenPos = -1;
        state.charsAdvanced = 0;
        if (isDefinition)
          return 'def';
        return 'builtin';
      }
    }
    // Unfortunately javascript does not support multiline strings, so we have
    // to undo anything done upto here if a function call or definition splits
    // over two or more lines.
    if (stream.match(/^$/g, false)) {
      stream.backUp(state.charsAdvanced);
      while (state.scopes.length > state.firstParenPos)
        state.scopes.pop();
      state.firstParenPos = -1;
      state.charsAdvanced = 0;
      return 'builtin';
    }
    state.charsAdvanced += stream.match(/^([^()]*)/)[1].length;
    return callOrDef(stream, state);
  }

  function tokenComment(stream, state) {
    if (stream.match(/^#=/)) {
      state.weakScopes++;
    }
    if (!stream.match(/.*?(?=(#=|=#))/)) {
      stream.skipToEnd();
    }
    if (stream.match(/^=#/)) {
      state.weakScopes--;
      if (state.weakScopes == 0)
        state.tokenize = tokenBase;
    }
    return 'comment';
  }

  function tokenChar(stream, state) {
    var isChar = false, match;
    if (stream.match(chars)) {
      isChar = true;
    } else if (match = stream.match(/\\u([a-f0-9]{1,4})(?=')/i)) {
      var value = parseInt(match[1], 16);
      if (value <= 55295 || value >= 57344) { // (U+0,U+D7FF), (U+E000,U+FFFF)
        isChar = true;
        stream.next();
      }
    } else if (match = stream.match(/\\U([A-Fa-f0-9]{5,8})(?=')/)) {
      var value = parseInt(match[1], 16);
      if (value <= 1114111) { // U+10FFFF
        isChar = true;
        stream.next();
      }
    }
    if (isChar) {
      state.leavingExpr = true;
      state.tokenize = tokenBase;
      return 'string';
    }
    if (!stream.match(/^[^']+(?=')/)) { stream.skipToEnd(); }
    if (stream.match(/^'/)) { state.tokenize = tokenBase; }
    return ERRORCLASS;
  }

  function tokenStringFactory(delimiter) {
    while ('bruv'.indexOf(delimiter.charAt(0).toLowerCase()) >= 0) {
      delimiter = delimiter.substr(1);
    }
    var OUTCLASS = 'string';

    function tokenString(stream, state) {
      while (!stream.eol()) {
        stream.eatWhile(/[^"\\]/);
        if (stream.eat('\\')) {
            stream.next();
        } else if (stream.match(delimiter)) {
            state.tokenize = tokenBase;
            state.leavingExpr = true;
            return OUTCLASS;
        } else {
            stream.eat(/["]/);
        }
      }
      return OUTCLASS;
    }
    tokenString.isString = true;
    return tokenString;
  }

  var external = {
    startState: function() {
      return {
        tokenize: tokenBase,
        scopes: [],
        weakScopes: 0,
        lastToken: null,
        leavingExpr: false,
        isDefinition: false,
        charsAdvanced: 0,
        firstParenPos: -1
      };
    },

    token: function(stream, state) {
      var style = state.tokenize(stream, state);
      var current = stream.current();

      if (current && style) {
        state.lastToken = current;
      }

      // Handle '.' connected identifiers
      if (current === '.') {
        style = stream.match(identifiers, false) || stream.match(macro, false) ||
                stream.match(/\(/, false) ? 'operator' : ERRORCLASS;
      }
      return style;
    },

    indent: function(state, textAfter) {
      var delta = 0;
      if (textAfter == "]" || textAfter == ")" || textAfter == "end" || textAfter == "else" || textAfter == "elseif" || textAfter == "catch" || textAfter == "finally") {
        delta = -1;
      }
      return (state.scopes.length + delta) * _conf.indentUnit;
    },

    electricInput: /(end|else(if)?|catch|finally)$/,
    lineComment: "#",
    fold: "indent"
  };
  return external;
});


CodeMirror.defineMIME("text/x-julia", "julia");

});
codemirror/mode/coffeescript/coffeescript.js000064400000023234151215013510015321 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

/**
 * Link to the project's GitHub page:
 * https://github.com/pickhardt/coffeescript-codemirror-mode
 */
(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("coffeescript", function(conf, parserConf) {
  var ERRORCLASS = "error";

  function wordRegexp(words) {
    return new RegExp("^((" + words.join(")|(") + "))\\b");
  }

  var operators = /^(?:->|=>|\+[+=]?|-[\-=]?|\*[\*=]?|\/[\/=]?|[=!]=|<[><]?=?|>>?=?|%=?|&=?|\|=?|\^=?|\~|!|\?|(or|and|\|\||&&|\?)=)/;
  var delimiters = /^(?:[()\[\]{},:`=;]|\.\.?\.?)/;
  var identifiers = /^[_A-Za-z$][_A-Za-z$0-9]*/;
  var atProp = /^@[_A-Za-z$][_A-Za-z$0-9]*/;

  var wordOperators = wordRegexp(["and", "or", "not",
                                  "is", "isnt", "in",
                                  "instanceof", "typeof"]);
  var indentKeywords = ["for", "while", "loop", "if", "unless", "else",
                        "switch", "try", "catch", "finally", "class"];
  var commonKeywords = ["break", "by", "continue", "debugger", "delete",
                        "do", "in", "of", "new", "return", "then",
                        "this", "@", "throw", "when", "until", "extends"];

  var keywords = wordRegexp(indentKeywords.concat(commonKeywords));

  indentKeywords = wordRegexp(indentKeywords);


  var stringPrefixes = /^('{3}|\"{3}|['\"])/;
  var regexPrefixes = /^(\/{3}|\/)/;
  var commonConstants = ["Infinity", "NaN", "undefined", "null", "true", "false", "on", "off", "yes", "no"];
  var constants = wordRegexp(commonConstants);

  // Tokenizers
  function tokenBase(stream, state) {
    // Handle scope changes
    if (stream.sol()) {
      if (state.scope.align === null) state.scope.align = false;
      var scopeOffset = state.scope.offset;
      if (stream.eatSpace()) {
        var lineOffset = stream.indentation();
        if (lineOffset > scopeOffset && state.scope.type == "coffee") {
          return "indent";
        } else if (lineOffset < scopeOffset) {
          return "dedent";
        }
        return null;
      } else {
        if (scopeOffset > 0) {
          dedent(stream, state);
        }
      }
    }
    if (stream.eatSpace()) {
      return null;
    }

    var ch = stream.peek();

    // Handle docco title comment (single line)
    if (stream.match("####")) {
      stream.skipToEnd();
      return "comment";
    }

    // Handle multi line comments
    if (stream.match("###")) {
      state.tokenize = longComment;
      return state.tokenize(stream, state);
    }

    // Single line comment
    if (ch === "#") {
      stream.skipToEnd();
      return "comment";
    }

    // Handle number literals
    if (stream.match(/^-?[0-9\.]/, false)) {
      var floatLiteral = false;
      // Floats
      if (stream.match(/^-?\d*\.\d+(e[\+\-]?\d+)?/i)) {
        floatLiteral = true;
      }
      if (stream.match(/^-?\d+\.\d*/)) {
        floatLiteral = true;
      }
      if (stream.match(/^-?\.\d+/)) {
        floatLiteral = true;
      }

      if (floatLiteral) {
        // prevent from getting extra . on 1..
        if (stream.peek() == "."){
          stream.backUp(1);
        }
        return "number";
      }
      // Integers
      var intLiteral = false;
      // Hex
      if (stream.match(/^-?0x[0-9a-f]+/i)) {
        intLiteral = true;
      }
      // Decimal
      if (stream.match(/^-?[1-9]\d*(e[\+\-]?\d+)?/)) {
        intLiteral = true;
      }
      // Zero by itself with no other piece of number.
      if (stream.match(/^-?0(?![\dx])/i)) {
        intLiteral = true;
      }
      if (intLiteral) {
        return "number";
      }
    }

    // Handle strings
    if (stream.match(stringPrefixes)) {
      state.tokenize = tokenFactory(stream.current(), false, "string");
      return state.tokenize(stream, state);
    }
    // Handle regex literals
    if (stream.match(regexPrefixes)) {
      if (stream.current() != "/" || stream.match(/^.*\//, false)) { // prevent highlight of division
        state.tokenize = tokenFactory(stream.current(), true, "string-2");
        return state.tokenize(stream, state);
      } else {
        stream.backUp(1);
      }
    }



    // Handle operators and delimiters
    if (stream.match(operators) || stream.match(wordOperators)) {
      return "operator";
    }
    if (stream.match(delimiters)) {
      return "punctuation";
    }

    if (stream.match(constants)) {
      return "atom";
    }

    if (stream.match(atProp) || state.prop && stream.match(identifiers)) {
      return "property";
    }

    if (stream.match(keywords)) {
      return "keyword";
    }

    if (stream.match(identifiers)) {
      return "variable";
    }

    // Handle non-detected items
    stream.next();
    return ERRORCLASS;
  }

  function tokenFactory(delimiter, singleline, outclass) {
    return function(stream, state) {
      while (!stream.eol()) {
        stream.eatWhile(/[^'"\/\\]/);
        if (stream.eat("\\")) {
          stream.next();
          if (singleline && stream.eol()) {
            return outclass;
          }
        } else if (stream.match(delimiter)) {
          state.tokenize = tokenBase;
          return outclass;
        } else {
          stream.eat(/['"\/]/);
        }
      }
      if (singleline) {
        if (parserConf.singleLineStringErrors) {
          outclass = ERRORCLASS;
        } else {
          state.tokenize = tokenBase;
        }
      }
      return outclass;
    };
  }

  function longComment(stream, state) {
    while (!stream.eol()) {
      stream.eatWhile(/[^#]/);
      if (stream.match("###")) {
        state.tokenize = tokenBase;
        break;
      }
      stream.eatWhile("#");
    }
    return "comment";
  }

  function indent(stream, state, type) {
    type = type || "coffee";
    var offset = 0, align = false, alignOffset = null;
    for (var scope = state.scope; scope; scope = scope.prev) {
      if (scope.type === "coffee" || scope.type == "}") {
        offset = scope.offset + conf.indentUnit;
        break;
      }
    }
    if (type !== "coffee") {
      align = null;
      alignOffset = stream.column() + stream.current().length;
    } else if (state.scope.align) {
      state.scope.align = false;
    }
    state.scope = {
      offset: offset,
      type: type,
      prev: state.scope,
      align: align,
      alignOffset: alignOffset
    };
  }

  function dedent(stream, state) {
    if (!state.scope.prev) return;
    if (state.scope.type === "coffee") {
      var _indent = stream.indentation();
      var matched = false;
      for (var scope = state.scope; scope; scope = scope.prev) {
        if (_indent === scope.offset) {
          matched = true;
          break;
        }
      }
      if (!matched) {
        return true;
      }
      while (state.scope.prev && state.scope.offset !== _indent) {
        state.scope = state.scope.prev;
      }
      return false;
    } else {
      state.scope = state.scope.prev;
      return false;
    }
  }

  function tokenLexer(stream, state) {
    var style = state.tokenize(stream, state);
    var current = stream.current();

    // Handle scope changes.
    if (current === "return") {
      state.dedent = true;
    }
    if (((current === "->" || current === "=>") && stream.eol())
        || style === "indent") {
      indent(stream, state);
    }
    var delimiter_index = "[({".indexOf(current);
    if (delimiter_index !== -1) {
      indent(stream, state, "])}".slice(delimiter_index, delimiter_index+1));
    }
    if (indentKeywords.exec(current)){
      indent(stream, state);
    }
    if (current == "then"){
      dedent(stream, state);
    }


    if (style === "dedent") {
      if (dedent(stream, state)) {
        return ERRORCLASS;
      }
    }
    delimiter_index = "])}".indexOf(current);
    if (delimiter_index !== -1) {
      while (state.scope.type == "coffee" && state.scope.prev)
        state.scope = state.scope.prev;
      if (state.scope.type == current)
        state.scope = state.scope.prev;
    }
    if (state.dedent && stream.eol()) {
      if (state.scope.type == "coffee" && state.scope.prev)
        state.scope = state.scope.prev;
      state.dedent = false;
    }

    return style;
  }

  var external = {
    startState: function(basecolumn) {
      return {
        tokenize: tokenBase,
        scope: {offset:basecolumn || 0, type:"coffee", prev: null, align: false},
        prop: false,
        dedent: 0
      };
    },

    token: function(stream, state) {
      var fillAlign = state.scope.align === null && state.scope;
      if (fillAlign && stream.sol()) fillAlign.align = false;

      var style = tokenLexer(stream, state);
      if (style && style != "comment") {
        if (fillAlign) fillAlign.align = true;
        state.prop = style == "punctuation" && stream.current() == "."
      }

      return style;
    },

    indent: function(state, text) {
      if (state.tokenize != tokenBase) return 0;
      var scope = state.scope;
      var closer = text && "])}".indexOf(text.charAt(0)) > -1;
      if (closer) while (scope.type == "coffee" && scope.prev) scope = scope.prev;
      var closes = closer && scope.type === text.charAt(0);
      if (scope.align)
        return scope.alignOffset - (closes ? 1 : 0);
      else
        return (closes ? scope.prev : scope).offset;
    },

    lineComment: "#",
    fold: "indent"
  };
  return external;
});

CodeMirror.defineMIME("text/x-coffeescript", "coffeescript");
CodeMirror.defineMIME("text/coffeescript", "coffeescript");

});
codemirror/mode/coffeescript/index.html000064400000053602151215013510014306 0ustar00<!doctype html>

<title>CodeMirror: CoffeeScript mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="coffeescript.js"></script>
<style>.CodeMirror {border-top: 1px solid silver; border-bottom: 1px solid silver;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">CoffeeScript</a>
  </ul>
</div>

<article>
<h2>CoffeeScript mode</h2>
<form><textarea id="code" name="code">
# CoffeeScript mode for CodeMirror
# Copyright (c) 2011 Jeff Pickhardt, released under
# the MIT License.
#
# Modified from the Python CodeMirror mode, which also is 
# under the MIT License Copyright (c) 2010 Timothy Farrell.
#
# The following script, Underscore.coffee, is used to 
# demonstrate CoffeeScript mode for CodeMirror.
#
# To download CoffeeScript mode for CodeMirror, go to:
# https://github.com/pickhardt/coffeescript-codemirror-mode

# **Underscore.coffee
# (c) 2011 Jeremy Ashkenas, DocumentCloud Inc.**
# Underscore is freely distributable under the terms of the
# [MIT license](http://en.wikipedia.org/wiki/MIT_License).
# Portions of Underscore are inspired by or borrowed from
# [Prototype.js](http://prototypejs.org/api), Oliver Steele's
# [Functional](http://osteele.com), and John Resig's
# [Micro-Templating](http://ejohn.org).
# For all details and documentation:
# http://documentcloud.github.com/underscore/


# Baseline setup
# --------------

# Establish the root object, `window` in the browser, or `global` on the server.
root = this


# Save the previous value of the `_` variable.
previousUnderscore = root._

### Multiline
    comment
###

# Establish the object that gets thrown to break out of a loop iteration.
# `StopIteration` is SOP on Mozilla.
breaker = if typeof(StopIteration) is 'undefined' then '__break__' else StopIteration


#### Docco style single line comment (title)


# Helper function to escape **RegExp** contents, because JS doesn't have one.
escapeRegExp = (string) -> string.replace(/([.*+?^${}()|[\]\/\\])/g, '\\$1')


# Save bytes in the minified (but not gzipped) version:
ArrayProto = Array.prototype
ObjProto = Object.prototype


# Create quick reference variables for speed access to core prototypes.
slice = ArrayProto.slice
unshift = ArrayProto.unshift
toString = ObjProto.toString
hasOwnProperty = ObjProto.hasOwnProperty
propertyIsEnumerable = ObjProto.propertyIsEnumerable


# All **ECMA5** native implementations we hope to use are declared here.
nativeForEach = ArrayProto.forEach
nativeMap = ArrayProto.map
nativeReduce = ArrayProto.reduce
nativeReduceRight = ArrayProto.reduceRight
nativeFilter = ArrayProto.filter
nativeEvery = ArrayProto.every
nativeSome = ArrayProto.some
nativeIndexOf = ArrayProto.indexOf
nativeLastIndexOf = ArrayProto.lastIndexOf
nativeIsArray = Array.isArray
nativeKeys = Object.keys


# Create a safe reference to the Underscore object for use below.
_ = (obj) -> new wrapper(obj)


# Export the Underscore object for **CommonJS**.
if typeof(exports) != 'undefined' then exports._ = _


# Export Underscore to global scope.
root._ = _


# Current version.
_.VERSION = '1.1.0'


# Collection Functions
# --------------------

# The cornerstone, an **each** implementation.
# Handles objects implementing **forEach**, arrays, and raw objects.
_.each = (obj, iterator, context) ->
  try
    if nativeForEach and obj.forEach is nativeForEach
      obj.forEach iterator, context
    else if _.isNumber obj.length
      iterator.call context, obj[i], i, obj for i in [0...obj.length]
    else
      iterator.call context, val, key, obj for own key, val of obj
  catch e
    throw e if e isnt breaker
  obj


# Return the results of applying the iterator to each element. Use JavaScript
# 1.6's version of **map**, if possible.
_.map = (obj, iterator, context) ->
  return obj.map(iterator, context) if nativeMap and obj.map is nativeMap
  results = []
  _.each obj, (value, index, list) ->
    results.push iterator.call context, value, index, list
  results


# **Reduce** builds up a single result from a list of values. Also known as
# **inject**, or **foldl**. Uses JavaScript 1.8's version of **reduce**, if possible.
_.reduce = (obj, iterator, memo, context) ->
  if nativeReduce and obj.reduce is nativeReduce
    iterator = _.bind iterator, context if context
    return obj.reduce iterator, memo
  _.each obj, (value, index, list) ->
    memo = iterator.call context, memo, value, index, list
  memo


# The right-associative version of **reduce**, also known as **foldr**. Uses
# JavaScript 1.8's version of **reduceRight**, if available.
_.reduceRight = (obj, iterator, memo, context) ->
  if nativeReduceRight and obj.reduceRight is nativeReduceRight
    iterator = _.bind iterator, context if context
    return obj.reduceRight iterator, memo
  reversed = _.clone(_.toArray(obj)).reverse()
  _.reduce reversed, iterator, memo, context


# Return the first value which passes a truth test.
_.detect = (obj, iterator, context) ->
  result = null
  _.each obj, (value, index, list) ->
    if iterator.call context, value, index, list
      result = value
      _.breakLoop()
  result


# Return all the elements that pass a truth test. Use JavaScript 1.6's
# **filter**, if it exists.
_.filter = (obj, iterator, context) ->
  return obj.filter iterator, context if nativeFilter and obj.filter is nativeFilter
  results = []
  _.each obj, (value, index, list) ->
    results.push value if iterator.call context, value, index, list
  results


# Return all the elements for which a truth test fails.
_.reject = (obj, iterator, context) ->
  results = []
  _.each obj, (value, index, list) ->
    results.push value if not iterator.call context, value, index, list
  results


# Determine whether all of the elements match a truth test. Delegate to
# JavaScript 1.6's **every**, if it is present.
_.every = (obj, iterator, context) ->
  iterator ||= _.identity
  return obj.every iterator, context if nativeEvery and obj.every is nativeEvery
  result = true
  _.each obj, (value, index, list) ->
    _.breakLoop() unless (result = result and iterator.call(context, value, index, list))
  result


# Determine if at least one element in the object matches a truth test. Use
# JavaScript 1.6's **some**, if it exists.
_.some = (obj, iterator, context) ->
  iterator ||= _.identity
  return obj.some iterator, context if nativeSome and obj.some is nativeSome
  result = false
  _.each obj, (value, index, list) ->
    _.breakLoop() if (result = iterator.call(context, value, index, list))
  result


# Determine if a given value is included in the array or object,
# based on `===`.
_.include = (obj, target) ->
  return _.indexOf(obj, target) isnt -1 if nativeIndexOf and obj.indexOf is nativeIndexOf
  return true for own key, val of obj when val is target
  false


# Invoke a method with arguments on every item in a collection.
_.invoke = (obj, method) ->
  args = _.rest arguments, 2
  (if method then val[method] else val).apply(val, args) for val in obj


# Convenience version of a common use case of **map**: fetching a property.
_.pluck = (obj, key) ->
  _.map(obj, (val) -> val[key])


# Return the maximum item or (item-based computation).
_.max = (obj, iterator, context) ->
  return Math.max.apply(Math, obj) if not iterator and _.isArray(obj)
  result = computed: -Infinity
  _.each obj, (value, index, list) ->
    computed = if iterator then iterator.call(context, value, index, list) else value
    computed >= result.computed and (result = {value: value, computed: computed})
  result.value


# Return the minimum element (or element-based computation).
_.min = (obj, iterator, context) ->
  return Math.min.apply(Math, obj) if not iterator and _.isArray(obj)
  result = computed: Infinity
  _.each obj, (value, index, list) ->
    computed = if iterator then iterator.call(context, value, index, list) else value
    computed < result.computed and (result = {value: value, computed: computed})
  result.value


# Sort the object's values by a criterion produced by an iterator.
_.sortBy = (obj, iterator, context) ->
  _.pluck(((_.map obj, (value, index, list) ->
    {value: value, criteria: iterator.call(context, value, index, list)}
  ).sort((left, right) ->
    a = left.criteria; b = right.criteria
    if a < b then -1 else if a > b then 1 else 0
  )), 'value')


# Use a comparator function to figure out at what index an object should
# be inserted so as to maintain order. Uses binary search.
_.sortedIndex = (array, obj, iterator) ->
  iterator ||= _.identity
  low = 0
  high = array.length
  while low < high
    mid = (low + high) >> 1
    if iterator(array[mid]) < iterator(obj) then low = mid + 1 else high = mid
  low


# Convert anything iterable into a real, live array.
_.toArray = (iterable) ->
  return [] if (!iterable)
  return iterable.toArray() if (iterable.toArray)
  return iterable if (_.isArray(iterable))
  return slice.call(iterable) if (_.isArguments(iterable))
  _.values(iterable)


# Return the number of elements in an object.
_.size = (obj) -> _.toArray(obj).length


# Array Functions
# ---------------

# Get the first element of an array. Passing `n` will return the first N
# values in the array. Aliased as **head**. The `guard` check allows it to work
# with **map**.
_.first = (array, n, guard) ->
  if n and not guard then slice.call(array, 0, n) else array[0]


# Returns everything but the first entry of the array. Aliased as **tail**.
# Especially useful on the arguments object. Passing an `index` will return
# the rest of the values in the array from that index onward. The `guard`
# check allows it to work with **map**.
_.rest = (array, index, guard) ->
  slice.call(array, if _.isUndefined(index) or guard then 1 else index)


# Get the last element of an array.
_.last = (array) -> array[array.length - 1]


# Trim out all falsy values from an array.
_.compact = (array) -> item for item in array when item


# Return a completely flattened version of an array.
_.flatten = (array) ->
  _.reduce array, (memo, value) ->
    return memo.concat(_.flatten(value)) if _.isArray value
    memo.push value
    memo
  , []


# Return a version of the array that does not contain the specified value(s).
_.without = (array) ->
  values = _.rest arguments
  val for val in _.toArray(array) when not _.include values, val


# Produce a duplicate-free version of the array. If the array has already
# been sorted, you have the option of using a faster algorithm.
_.uniq = (array, isSorted) ->
  memo = []
  for el, i in _.toArray array
    memo.push el if i is 0 || (if isSorted is true then _.last(memo) isnt el else not _.include(memo, el))
  memo


# Produce an array that contains every item shared between all the
# passed-in arrays.
_.intersect = (array) ->
  rest = _.rest arguments
  _.select _.uniq(array), (item) ->
    _.all rest, (other) ->
      _.indexOf(other, item) >= 0


# Zip together multiple lists into a single array -- elements that share
# an index go together.
_.zip = ->
  length = _.max _.pluck arguments, 'length'
  results = new Array length
  for i in [0...length]
    results[i] = _.pluck arguments, String i
  results


# If the browser doesn't supply us with **indexOf** (I'm looking at you, MSIE),
# we need this function. Return the position of the first occurrence of an
# item in an array, or -1 if the item is not included in the array.
_.indexOf = (array, item) ->
  return array.indexOf item if nativeIndexOf and array.indexOf is nativeIndexOf
  i = 0; l = array.length
  while l - i
    if array[i] is item then return i else i++
  -1


# Provide JavaScript 1.6's **lastIndexOf**, delegating to the native function,
# if possible.
_.lastIndexOf = (array, item) ->
  return array.lastIndexOf(item) if nativeLastIndexOf and array.lastIndexOf is nativeLastIndexOf
  i = array.length
  while i
    if array[i] is item then return i else i--
  -1


# Generate an integer Array containing an arithmetic progression. A port of
# [the native Python **range** function](http://docs.python.org/library/functions.html#range).
_.range = (start, stop, step) ->
  a = arguments
  solo = a.length <= 1
  i = start = if solo then 0 else a[0]
  stop = if solo then a[0] else a[1]
  step = a[2] or 1
  len = Math.ceil((stop - start) / step)
  return [] if len <= 0
  range = new Array len
  idx = 0
  loop
    return range if (if step > 0 then i - stop else stop - i) >= 0
    range[idx] = i
    idx++
    i+= step


# Function Functions
# ------------------

# Create a function bound to a given object (assigning `this`, and arguments,
# optionally). Binding with arguments is also known as **curry**.
_.bind = (func, obj) ->
  args = _.rest arguments, 2
  -> func.apply obj or root, args.concat arguments


# Bind all of an object's methods to that object. Useful for ensuring that
# all callbacks defined on an object belong to it.
_.bindAll = (obj) ->
  funcs = if arguments.length > 1 then _.rest(arguments) else _.functions(obj)
  _.each funcs, (f) -> obj[f] = _.bind obj[f], obj
  obj


# Delays a function for the given number of milliseconds, and then calls
# it with the arguments supplied.
_.delay = (func, wait) ->
  args = _.rest arguments, 2
  setTimeout((-> func.apply(func, args)), wait)


# Memoize an expensive function by storing its results.
_.memoize = (func, hasher) ->
  memo = {}
  hasher or= _.identity
  ->
    key = hasher.apply this, arguments
    return memo[key] if key of memo
    memo[key] = func.apply this, arguments


# Defers a function, scheduling it to run after the current call stack has
# cleared.
_.defer = (func) ->
  _.delay.apply _, [func, 1].concat _.rest arguments


# Returns the first function passed as an argument to the second,
# allowing you to adjust arguments, run code before and after, and
# conditionally execute the original function.
_.wrap = (func, wrapper) ->
  -> wrapper.apply wrapper, [func].concat arguments


# Returns a function that is the composition of a list of functions, each
# consuming the return value of the function that follows.
_.compose = ->
  funcs = arguments
  ->
    args = arguments
    for i in [funcs.length - 1..0] by -1
      args = [funcs[i].apply(this, args)]
    args[0]


# Object Functions
# ----------------

# Retrieve the names of an object's properties.
_.keys = nativeKeys or (obj) ->
  return _.range 0, obj.length if _.isArray(obj)
  key for key, val of obj


# Retrieve the values of an object's properties.
_.values = (obj) ->
  _.map obj, _.identity


# Return a sorted list of the function names available in Underscore.
_.functions = (obj) ->
  _.filter(_.keys(obj), (key) -> _.isFunction(obj[key])).sort()


# Extend a given object with all of the properties in a source object.
_.extend = (obj) ->
  for source in _.rest(arguments)
    obj[key] = val for key, val of source
  obj


# Create a (shallow-cloned) duplicate of an object.
_.clone = (obj) ->
  return obj.slice 0 if _.isArray obj
  _.extend {}, obj


# Invokes interceptor with the obj, and then returns obj.
# The primary purpose of this method is to "tap into" a method chain,
# in order to perform operations on intermediate results within
 the chain.
_.tap = (obj, interceptor) ->
  interceptor obj
  obj


# Perform a deep comparison to check if two objects are equal.
_.isEqual = (a, b) ->
  # Check object identity.
  return true if a is b
  # Different types?
  atype = typeof(a); btype = typeof(b)
  return false if atype isnt btype
  # Basic equality test (watch out for coercions).
  return true if `a == b`
  # One is falsy and the other truthy.
  return false if (!a and b) or (a and !b)
  # One of them implements an `isEqual()`?
  return a.isEqual(b) if a.isEqual
  # Check dates' integer values.
  return a.getTime() is b.getTime() if _.isDate(a) and _.isDate(b)
  # Both are NaN?
  return false if _.isNaN(a) and _.isNaN(b)
  # Compare regular expressions.
  if _.isRegExp(a) and _.isRegExp(b)
    return a.source is b.source and
           a.global is b.global and
           a.ignoreCase is b.ignoreCase and
           a.multiline is b.multiline
  # If a is not an object by this point, we can't handle it.
  return false if atype isnt 'object'
  # Check for different array lengths before comparing contents.
  return false if a.length and (a.length isnt b.length)
  # Nothing else worked, deep compare the contents.
  aKeys = _.keys(a); bKeys = _.keys(b)
  # Different object sizes?
  return false if aKeys.length isnt bKeys.length
  # Recursive comparison of contents.
  return false for key, val of a when !(key of b) or !_.isEqual(val, b[key])
  true


# Is a given array or object empty?
_.isEmpty = (obj) ->
  return obj.length is 0 if _.isArray(obj) or _.isString(obj)
  return false for own key of obj
  true


# Is a given value a DOM element?
_.isElement = (obj) -> obj and obj.nodeType is 1


# Is a given value an array?
_.isArray = nativeIsArray or (obj) -> !!(obj and obj.concat and obj.unshift and not obj.callee)


# Is a given variable an arguments object?
_.isArguments = (obj) -> obj and obj.callee


# Is the given value a function?
_.isFunction = (obj) -> !!(obj and obj.constructor and obj.call and obj.apply)


# Is the given value a string?
_.isString = (obj) -> !!(obj is '' or (obj and obj.charCodeAt and obj.substr))


# Is a given value a number?
_.isNumber = (obj) -> (obj is +obj) or toString.call(obj) is '[object Number]'


# Is a given value a boolean?
_.isBoolean = (obj) -> obj is true or obj is false


# Is a given value a Date?
_.isDate = (obj) -> !!(obj and obj.getTimezoneOffset and obj.setUTCFullYear)


# Is the given value a regular expression?
_.isRegExp = (obj) -> !!(obj and obj.exec and (obj.ignoreCase or obj.ignoreCase is false))


# Is the given value NaN -- this one is interesting. `NaN != NaN`, and
# `isNaN(undefined) == true`, so we make sure it's a number first.
_.isNaN = (obj) -> _.isNumber(obj) and window.isNaN(obj)


# Is a given value equal to null?
_.isNull = (obj) -> obj is null


# Is a given variable undefined?
_.isUndefined = (obj) -> typeof obj is 'undefined'


# Utility Functions
# -----------------

# Run Underscore.js in noConflict mode, returning the `_` variable to its
# previous owner. Returns a reference to the Underscore object.
_.noConflict = ->
  root._ = previousUnderscore
  this


# Keep the identity function around for default iterators.
_.identity = (value) -> value


# Run a function `n` times.
_.times = (n, iterator, context) ->
  iterator.call context, i for i in [0...n]


# Break out of the middle of an iteration.
_.breakLoop = -> throw breaker


# Add your own custom functions to the Underscore object, ensuring that
# they're correctly added to the OOP wrapper as well.
_.mixin = (obj) ->
  for name in _.functions(obj)
    addToWrapper name, _[name] = obj[name]


# Generate a unique integer id (unique within the entire client session).
# Useful for temporary DOM ids.
idCounter = 0
_.uniqueId = (prefix) ->
  (prefix or '') + idCounter++


# By default, Underscore uses **ERB**-style template delimiters, change the
# following template settings to use alternative delimiters.
_.templateSettings = {
  start: '<%'
  end: '%>'
  interpolate: /<%=(.+?)%>/g
}


# JavaScript templating a-la **ERB**, pilfered from John Resig's
# *Secrets of the JavaScript Ninja*, page 83.
# Single-quote fix from Rick Strahl.
# With alterations for arbitrary delimiters, and to preserve whitespace.
_.template = (str, data) ->
  c = _.templateSettings
  endMatch = new RegExp("'(?=[^"+c.end.substr(0, 1)+"]*"+escapeRegExp(c.end)+")","g")
  fn = new Function 'obj',
    'var p=[],print=function(){p.push.apply(p,arguments);};' +
    'with(obj||{}){p.push(\'' +
    str.replace(/\r/g, '\\r')
       .replace(/\n/g, '\\n')
       .replace(/\t/g, '\\t')
       .replace(endMatch,"���")
       .split("'").join("\\'")
       .split("���").join("'")
       .replace(c.interpolate, "',$1,'")
       .split(c.start).join("');")
       .split(c.end).join("p.push('") +
       "');}return p.join('');"
  if data then fn(data) else fn


# Aliases
# -------

_.forEach = _.each
_.foldl = _.inject = _.reduce
_.foldr = _.reduceRight
_.select = _.filter
_.all = _.every
_.any = _.some
_.contains = _.include
_.head = _.first
_.tail = _.rest
_.methods = _.functions


# Setup the OOP Wrapper
# ---------------------

# If Underscore is called as a function, it returns a wrapped object that
# can be used OO-style. This wrapper holds altered versions of all the
# underscore functions. Wrapped objects may be chained.
wrapper = (obj) ->
  this._wrapped = obj
  this


# Helper function to continue chaining intermediate results.
result = (obj, chain) ->
  if chain then _(obj).chain() else obj


# A method to easily add functions to the OOP wrapper.
addToWrapper = (name, func) ->
  wrapper.prototype[name] = ->
    args = _.toArray arguments
    unshift.call args, this._wrapped
    result func.apply(_, args), this._chain


# Add all ofthe Underscore functions to the wrapper object.
_.mixin _


# Add all mutator Array functions to the wrapper.
_.each ['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], (name) ->
  method = Array.prototype[name]
  wrapper.prototype[name] = ->
    method.apply(this._wrapped, arguments)
    result(this._wrapped, this._chain)


# Add all accessor Array functions to the wrapper.
_.each ['concat', 'join', 'slice'], (name) ->
  method = Array.prototype[name]
  wrapper.prototype[name] = ->
    result(method.apply(this._wrapped, arguments), this._chain)


# Start chaining a wrapped Underscore object.
wrapper::chain = ->
  this._chain = true
  this


# Extracts the result from a wrapped and chained object.
wrapper::value = -> this._wrapped
</textarea></form>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {});
    </script>

    <p><strong>MIME types defined:</strong> <code>text/x-coffeescript</code>.</p>

    <p>The CoffeeScript mode was written by Jeff Pickhardt.</p>

  </article>
codemirror/mode/mbox/index.html000064400000002415151215013510012573 0ustar00<!doctype html>

<title>CodeMirror: mbox mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="mbox.js"></script>
<style>.CodeMirror { border-top: 1px solid #ddd; border-bottom: 1px solid #ddd; }</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">mbox</a>
  </ul>
</div>

<article>
<h2>mbox mode</h2>
<form><textarea id="code" name="code">
From timothygu99@gmail.com Sun Apr 17 01:40:43 2016
From: Timothy Gu &lt;timothygu99@gmail.com&gt;
Date: Sat, 16 Apr 2016 18:40:43 -0700
Subject: mbox mode
Message-ID: &lt;Z8d+bTT50U/az94FZnyPkDjZmW0=@gmail.com&gt;

mbox mode is working!

Timothy
</textarea></form>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {});
    </script>

    <p><strong>MIME types defined:</strong> <code>application/mbox</code>.</p>

  </article>
codemirror/mode/mbox/mbox.js000064400000007101151215013510012076 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

var rfc2822 = [
  "From", "Sender", "Reply-To", "To", "Cc", "Bcc", "Message-ID",
  "In-Reply-To", "References", "Resent-From", "Resent-Sender", "Resent-To",
  "Resent-Cc", "Resent-Bcc", "Resent-Message-ID", "Return-Path", "Received"
];
var rfc2822NoEmail = [
  "Date", "Subject", "Comments", "Keywords", "Resent-Date"
];

CodeMirror.registerHelper("hintWords", "mbox", rfc2822.concat(rfc2822NoEmail));

var whitespace = /^[ \t]/;
var separator = /^From /; // See RFC 4155
var rfc2822Header = new RegExp("^(" + rfc2822.join("|") + "): ");
var rfc2822HeaderNoEmail = new RegExp("^(" + rfc2822NoEmail.join("|") + "): ");
var header = /^[^:]+:/; // Optional fields defined in RFC 2822
var email = /^[^ ]+@[^ ]+/;
var untilEmail = /^.*?(?=[^ ]+?@[^ ]+)/;
var bracketedEmail = /^<.*?>/;
var untilBracketedEmail = /^.*?(?=<.*>)/;

function styleForHeader(header) {
  if (header === "Subject") return "header";
  return "string";
}

function readToken(stream, state) {
  if (stream.sol()) {
    // From last line
    state.inSeparator = false;
    if (state.inHeader && stream.match(whitespace)) {
      // Header folding
      return null;
    } else {
      state.inHeader = false;
      state.header = null;
    }

    if (stream.match(separator)) {
      state.inHeaders = true;
      state.inSeparator = true;
      return "atom";
    }

    var match;
    var emailPermitted = false;
    if ((match = stream.match(rfc2822HeaderNoEmail)) ||
        (emailPermitted = true) && (match = stream.match(rfc2822Header))) {
      state.inHeaders = true;
      state.inHeader = true;
      state.emailPermitted = emailPermitted;
      state.header = match[1];
      return "atom";
    }

    // Use vim's heuristics: recognize custom headers only if the line is in a
    // block of legitimate headers.
    if (state.inHeaders && (match = stream.match(header))) {
      state.inHeader = true;
      state.emailPermitted = true;
      state.header = match[1];
      return "atom";
    }

    state.inHeaders = false;
    stream.skipToEnd();
    return null;
  }

  if (state.inSeparator) {
    if (stream.match(email)) return "link";
    if (stream.match(untilEmail)) return "atom";
    stream.skipToEnd();
    return "atom";
  }

  if (state.inHeader) {
    var style = styleForHeader(state.header);

    if (state.emailPermitted) {
      if (stream.match(bracketedEmail)) return style + " link";
      if (stream.match(untilBracketedEmail)) return style;
    }
    stream.skipToEnd();
    return style;
  }

  stream.skipToEnd();
  return null;
};

CodeMirror.defineMode("mbox", function() {
  return {
    startState: function() {
      return {
        // Is in a mbox separator
        inSeparator: false,
        // Is in a mail header
        inHeader: false,
        // If bracketed email is permitted. Only applicable when inHeader
        emailPermitted: false,
        // Name of current header
        header: null,
        // Is in a region of mail headers
        inHeaders: false
      };
    },
    token: readToken,
    blankLine: function(state) {
      state.inHeaders = state.inSeparator = state.inHeader = false;
    }
  };
});

CodeMirror.defineMIME("application/mbox", "mbox");
});
codemirror/mode/turtle/turtle.js000064400000011361151215013510013025 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("turtle", function(config) {
  var indentUnit = config.indentUnit;
  var curPunc;

  function wordRegexp(words) {
    return new RegExp("^(?:" + words.join("|") + ")$", "i");
  }
  var ops = wordRegexp([]);
  var keywords = wordRegexp(["@prefix", "@base", "a"]);
  var operatorChars = /[*+\-<>=&|]/;

  function tokenBase(stream, state) {
    var ch = stream.next();
    curPunc = null;
    if (ch == "<" && !stream.match(/^[\s\u00a0=]/, false)) {
      stream.match(/^[^\s\u00a0>]*>?/);
      return "atom";
    }
    else if (ch == "\"" || ch == "'") {
      state.tokenize = tokenLiteral(ch);
      return state.tokenize(stream, state);
    }
    else if (/[{}\(\),\.;\[\]]/.test(ch)) {
      curPunc = ch;
      return null;
    }
    else if (ch == "#") {
      stream.skipToEnd();
      return "comment";
    }
    else if (operatorChars.test(ch)) {
      stream.eatWhile(operatorChars);
      return null;
    }
    else if (ch == ":") {
          return "operator";
        } else {
      stream.eatWhile(/[_\w\d]/);
      if(stream.peek() == ":") {
        return "variable-3";
      } else {
             var word = stream.current();

             if(keywords.test(word)) {
                        return "meta";
             }

             if(ch >= "A" && ch <= "Z") {
                    return "comment";
                 } else {
                        return "keyword";
                 }
      }
      var word = stream.current();
      if (ops.test(word))
        return null;
      else if (keywords.test(word))
        return "meta";
      else
        return "variable";
    }
  }

  function tokenLiteral(quote) {
    return function(stream, state) {
      var escaped = false, ch;
      while ((ch = stream.next()) != null) {
        if (ch == quote && !escaped) {
          state.tokenize = tokenBase;
          break;
        }
        escaped = !escaped && ch == "\\";
      }
      return "string";
    };
  }

  function pushContext(state, type, col) {
    state.context = {prev: state.context, indent: state.indent, col: col, type: type};
  }
  function popContext(state) {
    state.indent = state.context.indent;
    state.context = state.context.prev;
  }

  return {
    startState: function() {
      return {tokenize: tokenBase,
              context: null,
              indent: 0,
              col: 0};
    },

    token: function(stream, state) {
      if (stream.sol()) {
        if (state.context && state.context.align == null) state.context.align = false;
        state.indent = stream.indentation();
      }
      if (stream.eatSpace()) return null;
      var style = state.tokenize(stream, state);

      if (style != "comment" && state.context && state.context.align == null && state.context.type != "pattern") {
        state.context.align = true;
      }

      if (curPunc == "(") pushContext(state, ")", stream.column());
      else if (curPunc == "[") pushContext(state, "]", stream.column());
      else if (curPunc == "{") pushContext(state, "}", stream.column());
      else if (/[\]\}\)]/.test(curPunc)) {
        while (state.context && state.context.type == "pattern") popContext(state);
        if (state.context && curPunc == state.context.type) popContext(state);
      }
      else if (curPunc == "." && state.context && state.context.type == "pattern") popContext(state);
      else if (/atom|string|variable/.test(style) && state.context) {
        if (/[\}\]]/.test(state.context.type))
          pushContext(state, "pattern", stream.column());
        else if (state.context.type == "pattern" && !state.context.align) {
          state.context.align = true;
          state.context.col = stream.column();
        }
      }

      return style;
    },

    indent: function(state, textAfter) {
      var firstChar = textAfter && textAfter.charAt(0);
      var context = state.context;
      if (/[\]\}]/.test(firstChar))
        while (context && context.type == "pattern") context = context.prev;

      var closing = context && firstChar == context.type;
      if (!context)
        return 0;
      else if (context.type == "pattern")
        return context.col;
      else if (context.align)
        return context.col + (closing ? 0 : 1);
      else
        return context.indent + (closing ? 0 : indentUnit);
    },

    lineComment: "#"
  };
});

CodeMirror.defineMIME("text/turtle", "turtle");

});
codemirror/mode/turtle/index.html000064400000002676151215013510013156 0ustar00<!doctype html>

<title>CodeMirror: Turtle mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">

<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="turtle.js"></script>
<style>.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>

  <ul>
    <li><a href="../../index.html">Home</a>
    <li><a href="../../doc/manual.html">Manual</a>
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
  </ul>
  <ul>
    <li><a href="../index.html">Language modes</a>
    <li><a class=active href="#">Turtle</a>
  </ul>
</div>

<article>
<h2>Turtle mode</h2>
<form><textarea id="code" name="code">
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

<http://purl.org/net/bsletten> 
    a foaf:Person;
    foaf:interest <http://www.w3.org/2000/01/sw/>;
    foaf:based_near [
        geo:lat "34.0736111" ;
        geo:lon "-118.3994444"
   ]

</textarea></form>
    <script>
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        mode: "text/turtle",
        matchBrackets: true
      });
    </script>

    <p><strong>MIME types defined:</strong> <code>text/turtle</code>.</p>

  </article>
codemirror/theme/3024-day.css000064400000003703151215013510011665 0ustar00/*

    Name:       3024 day
    Author:     Jan T. Sott (http://github.com/idleberg)

    CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror)
    Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16)

*/

.cm-s-3024-day.CodeMirror { background: #f7f7f7; color: #3a3432; }
.cm-s-3024-day div.CodeMirror-selected { background: #d6d5d4; }

.cm-s-3024-day .CodeMirror-line::selection, .cm-s-3024-day .CodeMirror-line > span::selection, .cm-s-3024-day .CodeMirror-line > span > span::selection { background: #d6d5d4; }
.cm-s-3024-day .CodeMirror-line::-moz-selection, .cm-s-3024-day .CodeMirror-line > span::-moz-selection, .cm-s-3024-day .CodeMirror-line > span > span::selection { background: #d9d9d9; }

.cm-s-3024-day .CodeMirror-gutters { background: #f7f7f7; border-right: 0px; }
.cm-s-3024-day .CodeMirror-guttermarker { color: #db2d20; }
.cm-s-3024-day .CodeMirror-guttermarker-subtle { color: #807d7c; }
.cm-s-3024-day .CodeMirror-linenumber { color: #807d7c; }

.cm-s-3024-day .CodeMirror-cursor { border-left: 1px solid #5c5855; }

.cm-s-3024-day span.cm-comment { color: #cdab53; }
.cm-s-3024-day span.cm-atom { color: #a16a94; }
.cm-s-3024-day span.cm-number { color: #a16a94; }

.cm-s-3024-day span.cm-property, .cm-s-3024-day span.cm-attribute { color: #01a252; }
.cm-s-3024-day span.cm-keyword { color: #db2d20; }
.cm-s-3024-day span.cm-string { color: #fded02; }

.cm-s-3024-day span.cm-variable { color: #01a252; }
.cm-s-3024-day span.cm-variable-2 { color: #01a0e4; }
.cm-s-3024-day span.cm-def { color: #e8bbd0; }
.cm-s-3024-day span.cm-bracket { color: #3a3432; }
.cm-s-3024-day span.cm-tag { color: #db2d20; }
.cm-s-3024-day span.cm-link { color: #a16a94; }
.cm-s-3024-day span.cm-error { background: #db2d20; color: #5c5855; }

.cm-s-3024-day .CodeMirror-activeline-background { background: #e8f2ff; }
.cm-s-3024-day .CodeMirror-matchingbracket { text-decoration: underline; color: #a16a94 !important; }
codemirror/lib/codemirror.js000064400001312712151215013510012163 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

// This is CodeMirror (http://codemirror.net), a code editor
// implemented in JavaScript on top of the browser's DOM.
//
// You can find some technical background for some of the code below
// at http://marijnhaverbeke.nl/blog/#cm-internals .

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    module.exports = mod();
  else if (typeof define == "function" && define.amd) // AMD
    return define([], mod);
  else // Plain browser env
    (this || window).CodeMirror = mod();
})(function() {
  "use strict";

  // BROWSER SNIFFING

  // Kludges for bugs and behavior differences that can't be feature
  // detected are enabled based on userAgent etc sniffing.
  var userAgent = navigator.userAgent;
  var platform = navigator.platform;

  var gecko = /gecko\/\d/i.test(userAgent);
  var ie_upto10 = /MSIE \d/.test(userAgent);
  var ie_11up = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(userAgent);
  var ie = ie_upto10 || ie_11up;
  var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : ie_11up[1]);
  var webkit = /WebKit\//.test(userAgent);
  var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(userAgent);
  var chrome = /Chrome\//.test(userAgent);
  var presto = /Opera\//.test(userAgent);
  var safari = /Apple Computer/.test(navigator.vendor);
  var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(userAgent);
  var phantom = /PhantomJS/.test(userAgent);

  var ios = /AppleWebKit/.test(userAgent) && /Mobile\/\w+/.test(userAgent);
  // This is woefully incomplete. Suggestions for alternative methods welcome.
  var mobile = ios || /Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent);
  var mac = ios || /Mac/.test(platform);
  var chromeOS = /\bCrOS\b/.test(userAgent);
  var windows = /win/i.test(platform);

  var presto_version = presto && userAgent.match(/Version\/(\d*\.\d*)/);
  if (presto_version) presto_version = Number(presto_version[1]);
  if (presto_version && presto_version >= 15) { presto = false; webkit = true; }
  // Some browsers use the wrong event properties to signal cmd/ctrl on OS X
  var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11));
  var captureRightClick = gecko || (ie && ie_version >= 9);

  // Optimize some code when these features are not used.
  var sawReadOnlySpans = false, sawCollapsedSpans = false;

  // EDITOR CONSTRUCTOR

  // A CodeMirror instance represents an editor. This is the object
  // that user code is usually dealing with.

  function CodeMirror(place, options) {
    if (!(this instanceof CodeMirror)) return new CodeMirror(place, options);

    this.options = options = options ? copyObj(options) : {};
    // Determine effective options based on given values and defaults.
    copyObj(defaults, options, false);
    setGuttersForLineNumbers(options);

    var doc = options.value;
    if (typeof doc == "string") doc = new Doc(doc, options.mode, null, options.lineSeparator);
    this.doc = doc;

    var input = new CodeMirror.inputStyles[options.inputStyle](this);
    var display = this.display = new Display(place, doc, input);
    display.wrapper.CodeMirror = this;
    updateGutters(this);
    themeChanged(this);
    if (options.lineWrapping)
      this.display.wrapper.className += " CodeMirror-wrap";
    if (options.autofocus && !mobile) display.input.focus();
    initScrollbars(this);

    this.state = {
      keyMaps: [],  // stores maps added by addKeyMap
      overlays: [], // highlighting overlays, as added by addOverlay
      modeGen: 0,   // bumped when mode/overlay changes, used to invalidate highlighting info
      overwrite: false,
      delayingBlurEvent: false,
      focused: false,
      suppressEdits: false, // used to disable editing during key handlers when in readOnly mode
      pasteIncoming: false, cutIncoming: false, // help recognize paste/cut edits in input.poll
      selectingText: false,
      draggingText: false,
      highlight: new Delayed(), // stores highlight worker timeout
      keySeq: null,  // Unfinished key sequence
      specialChars: null
    };

    var cm = this;

    // Override magic textarea content restore that IE sometimes does
    // on our hidden textarea on reload
    if (ie && ie_version < 11) setTimeout(function() { cm.display.input.reset(true); }, 20);

    registerEventHandlers(this);
    ensureGlobalHandlers();

    startOperation(this);
    this.curOp.forceUpdate = true;
    attachDoc(this, doc);

    if ((options.autofocus && !mobile) || cm.hasFocus())
      setTimeout(bind(onFocus, this), 20);
    else
      onBlur(this);

    for (var opt in optionHandlers) if (optionHandlers.hasOwnProperty(opt))
      optionHandlers[opt](this, options[opt], Init);
    maybeUpdateLineNumberWidth(this);
    if (options.finishInit) options.finishInit(this);
    for (var i = 0; i < initHooks.length; ++i) initHooks[i](this);
    endOperation(this);
    // Suppress optimizelegibility in Webkit, since it breaks text
    // measuring on line wrapping boundaries.
    if (webkit && options.lineWrapping &&
        getComputedStyle(display.lineDiv).textRendering == "optimizelegibility")
      display.lineDiv.style.textRendering = "auto";
  }

  // DISPLAY CONSTRUCTOR

  // The display handles the DOM integration, both for input reading
  // and content drawing. It holds references to DOM nodes and
  // display-related state.

  function Display(place, doc, input) {
    var d = this;
    this.input = input;

    // Covers bottom-right square when both scrollbars are present.
    d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler");
    d.scrollbarFiller.setAttribute("cm-not-content", "true");
    // Covers bottom of gutter when coverGutterNextToScrollbar is on
    // and h scrollbar is present.
    d.gutterFiller = elt("div", null, "CodeMirror-gutter-filler");
    d.gutterFiller.setAttribute("cm-not-content", "true");
    // Will contain the actual code, positioned to cover the viewport.
    d.lineDiv = elt("div", null, "CodeMirror-code");
    // Elements are added to these to represent selection and cursors.
    d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1");
    d.cursorDiv = elt("div", null, "CodeMirror-cursors");
    // A visibility: hidden element used to find the size of things.
    d.measure = elt("div", null, "CodeMirror-measure");
    // When lines outside of the viewport are measured, they are drawn in this.
    d.lineMeasure = elt("div", null, "CodeMirror-measure");
    // Wraps everything that needs to exist inside the vertically-padded coordinate system
    d.lineSpace = elt("div", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv],
                      null, "position: relative; outline: none");
    // Moved around its parent to cover visible view.
    d.mover = elt("div", [elt("div", [d.lineSpace], "CodeMirror-lines")], null, "position: relative");
    // Set to the height of the document, allowing scrolling.
    d.sizer = elt("div", [d.mover], "CodeMirror-sizer");
    d.sizerWidth = null;
    // Behavior of elts with overflow: auto and padding is
    // inconsistent across browsers. This is used to ensure the
    // scrollable area is big enough.
    d.heightForcer = elt("div", null, null, "position: absolute; height: " + scrollerGap + "px; width: 1px;");
    // Will contain the gutters, if any.
    d.gutters = elt("div", null, "CodeMirror-gutters");
    d.lineGutter = null;
    // Actual scrollable element.
    d.scroller = elt("div", [d.sizer, d.heightForcer, d.gutters], "CodeMirror-scroll");
    d.scroller.setAttribute("tabIndex", "-1");
    // The element in which the editor lives.
    d.wrapper = elt("div", [d.scrollbarFiller, d.gutterFiller, d.scroller], "CodeMirror");

    // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported)
    if (ie && ie_version < 8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; }
    if (!webkit && !(gecko && mobile)) d.scroller.draggable = true;

    if (place) {
      if (place.appendChild) place.appendChild(d.wrapper);
      else place(d.wrapper);
    }

    // Current rendered range (may be bigger than the view window).
    d.viewFrom = d.viewTo = doc.first;
    d.reportedViewFrom = d.reportedViewTo = doc.first;
    // Information about the rendered lines.
    d.view = [];
    d.renderedView = null;
    // Holds info about a single rendered line when it was rendered
    // for measurement, while not in view.
    d.externalMeasured = null;
    // Empty space (in pixels) above the view
    d.viewOffset = 0;
    d.lastWrapHeight = d.lastWrapWidth = 0;
    d.updateLineNumbers = null;

    d.nativeBarWidth = d.barHeight = d.barWidth = 0;
    d.scrollbarsClipped = false;

    // Used to only resize the line number gutter when necessary (when
    // the amount of lines crosses a boundary that makes its width change)
    d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null;
    // Set to true when a non-horizontal-scrolling line widget is
    // added. As an optimization, line widget aligning is skipped when
    // this is false.
    d.alignWidgets = false;

    d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;

    // Tracks the maximum line length so that the horizontal scrollbar
    // can be kept static when scrolling.
    d.maxLine = null;
    d.maxLineLength = 0;
    d.maxLineChanged = false;

    // Used for measuring wheel scrolling granularity
    d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null;

    // True when shift is held down.
    d.shift = false;

    // Used to track whether anything happened since the context menu
    // was opened.
    d.selForContextMenu = null;

    d.activeTouch = null;

    input.init(d);
  }

  // STATE UPDATES

  // Used to get the editor into a consistent state again when options change.

  function loadMode(cm) {
    cm.doc.mode = CodeMirror.getMode(cm.options, cm.doc.modeOption);
    resetModeState(cm);
  }

  function resetModeState(cm) {
    cm.doc.iter(function(line) {
      if (line.stateAfter) line.stateAfter = null;
      if (line.styles) line.styles = null;
    });
    cm.doc.frontier = cm.doc.first;
    startWorker(cm, 100);
    cm.state.modeGen++;
    if (cm.curOp) regChange(cm);
  }

  function wrappingChanged(cm) {
    if (cm.options.lineWrapping) {
      addClass(cm.display.wrapper, "CodeMirror-wrap");
      cm.display.sizer.style.minWidth = "";
      cm.display.sizerWidth = null;
    } else {
      rmClass(cm.display.wrapper, "CodeMirror-wrap");
      findMaxLine(cm);
    }
    estimateLineHeights(cm);
    regChange(cm);
    clearCaches(cm);
    setTimeout(function(){updateScrollbars(cm);}, 100);
  }

  // Returns a function that estimates the height of a line, to use as
  // first approximation until the line becomes visible (and is thus
  // properly measurable).
  function estimateHeight(cm) {
    var th = textHeight(cm.display), wrapping = cm.options.lineWrapping;
    var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3);
    return function(line) {
      if (lineIsHidden(cm.doc, line)) return 0;

      var widgetsHeight = 0;
      if (line.widgets) for (var i = 0; i < line.widgets.length; i++) {
        if (line.widgets[i].height) widgetsHeight += line.widgets[i].height;
      }

      if (wrapping)
        return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th;
      else
        return widgetsHeight + th;
    };
  }

  function estimateLineHeights(cm) {
    var doc = cm.doc, est = estimateHeight(cm);
    doc.iter(function(line) {
      var estHeight = est(line);
      if (estHeight != line.height) updateLineHeight(line, estHeight);
    });
  }

  function themeChanged(cm) {
    cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") +
      cm.options.theme.replace(/(^|\s)\s*/g, " cm-s-");
    clearCaches(cm);
  }

  function guttersChanged(cm) {
    updateGutters(cm);
    regChange(cm);
    setTimeout(function(){alignHorizontally(cm);}, 20);
  }

  // Rebuild the gutter elements, ensure the margin to the left of the
  // code matches their width.
  function updateGutters(cm) {
    var gutters = cm.display.gutters, specs = cm.options.gutters;
    removeChildren(gutters);
    for (var i = 0; i < specs.length; ++i) {
      var gutterClass = specs[i];
      var gElt = gutters.appendChild(elt("div", null, "CodeMirror-gutter " + gutterClass));
      if (gutterClass == "CodeMirror-linenumbers") {
        cm.display.lineGutter = gElt;
        gElt.style.width = (cm.display.lineNumWidth || 1) + "px";
      }
    }
    gutters.style.display = i ? "" : "none";
    updateGutterSpace(cm);
  }

  function updateGutterSpace(cm) {
    var width = cm.display.gutters.offsetWidth;
    cm.display.sizer.style.marginLeft = width + "px";
  }

  // Compute the character length of a line, taking into account
  // collapsed ranges (see markText) that might hide parts, and join
  // other lines onto it.
  function lineLength(line) {
    if (line.height == 0) return 0;
    var len = line.text.length, merged, cur = line;
    while (merged = collapsedSpanAtStart(cur)) {
      var found = merged.find(0, true);
      cur = found.from.line;
      len += found.from.ch - found.to.ch;
    }
    cur = line;
    while (merged = collapsedSpanAtEnd(cur)) {
      var found = merged.find(0, true);
      len -= cur.text.length - found.from.ch;
      cur = found.to.line;
      len += cur.text.length - found.to.ch;
    }
    return len;
  }

  // Find the longest line in the document.
  function findMaxLine(cm) {
    var d = cm.display, doc = cm.doc;
    d.maxLine = getLine(doc, doc.first);
    d.maxLineLength = lineLength(d.maxLine);
    d.maxLineChanged = true;
    doc.iter(function(line) {
      var len = lineLength(line);
      if (len > d.maxLineLength) {
        d.maxLineLength = len;
        d.maxLine = line;
      }
    });
  }

  // Make sure the gutters options contains the element
  // "CodeMirror-linenumbers" when the lineNumbers option is true.
  function setGuttersForLineNumbers(options) {
    var found = indexOf(options.gutters, "CodeMirror-linenumbers");
    if (found == -1 && options.lineNumbers) {
      options.gutters = options.gutters.concat(["CodeMirror-linenumbers"]);
    } else if (found > -1 && !options.lineNumbers) {
      options.gutters = options.gutters.slice(0);
      options.gutters.splice(found, 1);
    }
  }

  // SCROLLBARS

  // Prepare DOM reads needed to update the scrollbars. Done in one
  // shot to minimize update/measure roundtrips.
  function measureForScrollbars(cm) {
    var d = cm.display, gutterW = d.gutters.offsetWidth;
    var docH = Math.round(cm.doc.height + paddingVert(cm.display));
    return {
      clientHeight: d.scroller.clientHeight,
      viewHeight: d.wrapper.clientHeight,
      scrollWidth: d.scroller.scrollWidth, clientWidth: d.scroller.clientWidth,
      viewWidth: d.wrapper.clientWidth,
      barLeft: cm.options.fixedGutter ? gutterW : 0,
      docHeight: docH,
      scrollHeight: docH + scrollGap(cm) + d.barHeight,
      nativeBarWidth: d.nativeBarWidth,
      gutterWidth: gutterW
    };
  }

  function NativeScrollbars(place, scroll, cm) {
    this.cm = cm;
    var vert = this.vert = elt("div", [elt("div", null, null, "min-width: 1px")], "CodeMirror-vscrollbar");
    var horiz = this.horiz = elt("div", [elt("div", null, null, "height: 100%; min-height: 1px")], "CodeMirror-hscrollbar");
    place(vert); place(horiz);

    on(vert, "scroll", function() {
      if (vert.clientHeight) scroll(vert.scrollTop, "vertical");
    });
    on(horiz, "scroll", function() {
      if (horiz.clientWidth) scroll(horiz.scrollLeft, "horizontal");
    });

    this.checkedZeroWidth = false;
    // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8).
    if (ie && ie_version < 8) this.horiz.style.minHeight = this.vert.style.minWidth = "18px";
  }

  NativeScrollbars.prototype = copyObj({
    update: function(measure) {
      var needsH = measure.scrollWidth > measure.clientWidth + 1;
      var needsV = measure.scrollHeight > measure.clientHeight + 1;
      var sWidth = measure.nativeBarWidth;

      if (needsV) {
        this.vert.style.display = "block";
        this.vert.style.bottom = needsH ? sWidth + "px" : "0";
        var totalHeight = measure.viewHeight - (needsH ? sWidth : 0);
        // A bug in IE8 can cause this value to be negative, so guard it.
        this.vert.firstChild.style.height =
          Math.max(0, measure.scrollHeight - measure.clientHeight + totalHeight) + "px";
      } else {
        this.vert.style.display = "";
        this.vert.firstChild.style.height = "0";
      }

      if (needsH) {
        this.horiz.style.display = "block";
        this.horiz.style.right = needsV ? sWidth + "px" : "0";
        this.horiz.style.left = measure.barLeft + "px";
        var totalWidth = measure.viewWidth - measure.barLeft - (needsV ? sWidth : 0);
        this.horiz.firstChild.style.width =
          (measure.scrollWidth - measure.clientWidth + totalWidth) + "px";
      } else {
        this.horiz.style.display = "";
        this.horiz.firstChild.style.width = "0";
      }

      if (!this.checkedZeroWidth && measure.clientHeight > 0) {
        if (sWidth == 0) this.zeroWidthHack();
        this.checkedZeroWidth = true;
      }

      return {right: needsV ? sWidth : 0, bottom: needsH ? sWidth : 0};
    },
    setScrollLeft: function(pos) {
      if (this.horiz.scrollLeft != pos) this.horiz.scrollLeft = pos;
      if (this.disableHoriz) this.enableZeroWidthBar(this.horiz, this.disableHoriz);
    },
    setScrollTop: function(pos) {
      if (this.vert.scrollTop != pos) this.vert.scrollTop = pos;
      if (this.disableVert) this.enableZeroWidthBar(this.vert, this.disableVert);
    },
    zeroWidthHack: function() {
      var w = mac && !mac_geMountainLion ? "12px" : "18px";
      this.horiz.style.height = this.vert.style.width = w;
      this.horiz.style.pointerEvents = this.vert.style.pointerEvents = "none";
      this.disableHoriz = new Delayed;
      this.disableVert = new Delayed;
    },
    enableZeroWidthBar: function(bar, delay) {
      bar.style.pointerEvents = "auto";
      function maybeDisable() {
        // To find out whether the scrollbar is still visible, we
        // check whether the element under the pixel in the bottom
        // left corner of the scrollbar box is the scrollbar box
        // itself (when the bar is still visible) or its filler child
        // (when the bar is hidden). If it is still visible, we keep
        // it enabled, if it's hidden, we disable pointer events.
        var box = bar.getBoundingClientRect();
        var elt = document.elementFromPoint(box.left + 1, box.bottom - 1);
        if (elt != bar) bar.style.pointerEvents = "none";
        else delay.set(1000, maybeDisable);
      }
      delay.set(1000, maybeDisable);
    },
    clear: function() {
      var parent = this.horiz.parentNode;
      parent.removeChild(this.horiz);
      parent.removeChild(this.vert);
    }
  }, NativeScrollbars.prototype);

  function NullScrollbars() {}

  NullScrollbars.prototype = copyObj({
    update: function() { return {bottom: 0, right: 0}; },
    setScrollLeft: function() {},
    setScrollTop: function() {},
    clear: function() {}
  }, NullScrollbars.prototype);

  CodeMirror.scrollbarModel = {"native": NativeScrollbars, "null": NullScrollbars};

  function initScrollbars(cm) {
    if (cm.display.scrollbars) {
      cm.display.scrollbars.clear();
      if (cm.display.scrollbars.addClass)
        rmClass(cm.display.wrapper, cm.display.scrollbars.addClass);
    }

    cm.display.scrollbars = new CodeMirror.scrollbarModel[cm.options.scrollbarStyle](function(node) {
      cm.display.wrapper.insertBefore(node, cm.display.scrollbarFiller);
      // Prevent clicks in the scrollbars from killing focus
      on(node, "mousedown", function() {
        if (cm.state.focused) setTimeout(function() { cm.display.input.focus(); }, 0);
      });
      node.setAttribute("cm-not-content", "true");
    }, function(pos, axis) {
      if (axis == "horizontal") setScrollLeft(cm, pos);
      else setScrollTop(cm, pos);
    }, cm);
    if (cm.display.scrollbars.addClass)
      addClass(cm.display.wrapper, cm.display.scrollbars.addClass);
  }

  function updateScrollbars(cm, measure) {
    if (!measure) measure = measureForScrollbars(cm);
    var startWidth = cm.display.barWidth, startHeight = cm.display.barHeight;
    updateScrollbarsInner(cm, measure);
    for (var i = 0; i < 4 && startWidth != cm.display.barWidth || startHeight != cm.display.barHeight; i++) {
      if (startWidth != cm.display.barWidth && cm.options.lineWrapping)
        updateHeightsInViewport(cm);
      updateScrollbarsInner(cm, measureForScrollbars(cm));
      startWidth = cm.display.barWidth; startHeight = cm.display.barHeight;
    }
  }

  // Re-synchronize the fake scrollbars with the actual size of the
  // content.
  function updateScrollbarsInner(cm, measure) {
    var d = cm.display;
    var sizes = d.scrollbars.update(measure);

    d.sizer.style.paddingRight = (d.barWidth = sizes.right) + "px";
    d.sizer.style.paddingBottom = (d.barHeight = sizes.bottom) + "px";
    d.heightForcer.style.borderBottom = sizes.bottom + "px solid transparent"

    if (sizes.right && sizes.bottom) {
      d.scrollbarFiller.style.display = "block";
      d.scrollbarFiller.style.height = sizes.bottom + "px";
      d.scrollbarFiller.style.width = sizes.right + "px";
    } else d.scrollbarFiller.style.display = "";
    if (sizes.bottom && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) {
      d.gutterFiller.style.display = "block";
      d.gutterFiller.style.height = sizes.bottom + "px";
      d.gutterFiller.style.width = measure.gutterWidth + "px";
    } else d.gutterFiller.style.display = "";
  }

  // Compute the lines that are visible in a given viewport (defaults
  // the the current scroll position). viewport may contain top,
  // height, and ensure (see op.scrollToPos) properties.
  function visibleLines(display, doc, viewport) {
    var top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop;
    top = Math.floor(top - paddingTop(display));
    var bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight;

    var from = lineAtHeight(doc, top), to = lineAtHeight(doc, bottom);
    // Ensure is a {from: {line, ch}, to: {line, ch}} object, and
    // forces those lines into the viewport (if possible).
    if (viewport && viewport.ensure) {
      var ensureFrom = viewport.ensure.from.line, ensureTo = viewport.ensure.to.line;
      if (ensureFrom < from) {
        from = ensureFrom;
        to = lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight);
      } else if (Math.min(ensureTo, doc.lastLine()) >= to) {
        from = lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight);
        to = ensureTo;
      }
    }
    return {from: from, to: Math.max(to, from + 1)};
  }

  // LINE NUMBERS

  // Re-align line numbers and gutter marks to compensate for
  // horizontal scrolling.
  function alignHorizontally(cm) {
    var display = cm.display, view = display.view;
    if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) return;
    var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft;
    var gutterW = display.gutters.offsetWidth, left = comp + "px";
    for (var i = 0; i < view.length; i++) if (!view[i].hidden) {
      if (cm.options.fixedGutter) {
        if (view[i].gutter)
          view[i].gutter.style.left = left;
        if (view[i].gutterBackground)
          view[i].gutterBackground.style.left = left;
      }
      var align = view[i].alignable;
      if (align) for (var j = 0; j < align.length; j++)
        align[j].style.left = left;
    }
    if (cm.options.fixedGutter)
      display.gutters.style.left = (comp + gutterW) + "px";
  }

  // Used to ensure that the line number gutter is still the right
  // size for the current document size. Returns true when an update
  // is needed.
  function maybeUpdateLineNumberWidth(cm) {
    if (!cm.options.lineNumbers) return false;
    var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display;
    if (last.length != display.lineNumChars) {
      var test = display.measure.appendChild(elt("div", [elt("div", last)],
                                                 "CodeMirror-linenumber CodeMirror-gutter-elt"));
      var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW;
      display.lineGutter.style.width = "";
      display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding) + 1;
      display.lineNumWidth = display.lineNumInnerWidth + padding;
      display.lineNumChars = display.lineNumInnerWidth ? last.length : -1;
      display.lineGutter.style.width = display.lineNumWidth + "px";
      updateGutterSpace(cm);
      return true;
    }
    return false;
  }

  function lineNumberFor(options, i) {
    return String(options.lineNumberFormatter(i + options.firstLineNumber));
  }

  // Computes display.scroller.scrollLeft + display.gutters.offsetWidth,
  // but using getBoundingClientRect to get a sub-pixel-accurate
  // result.
  function compensateForHScroll(display) {
    return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left;
  }

  // DISPLAY DRAWING

  function DisplayUpdate(cm, viewport, force) {
    var display = cm.display;

    this.viewport = viewport;
    // Store some values that we'll need later (but don't want to force a relayout for)
    this.visible = visibleLines(display, cm.doc, viewport);
    this.editorIsHidden = !display.wrapper.offsetWidth;
    this.wrapperHeight = display.wrapper.clientHeight;
    this.wrapperWidth = display.wrapper.clientWidth;
    this.oldDisplayWidth = displayWidth(cm);
    this.force = force;
    this.dims = getDimensions(cm);
    this.events = [];
  }

  DisplayUpdate.prototype.signal = function(emitter, type) {
    if (hasHandler(emitter, type))
      this.events.push(arguments);
  };
  DisplayUpdate.prototype.finish = function() {
    for (var i = 0; i < this.events.length; i++)
      signal.apply(null, this.events[i]);
  };

  function maybeClipScrollbars(cm) {
    var display = cm.display;
    if (!display.scrollbarsClipped && display.scroller.offsetWidth) {
      display.nativeBarWidth = display.scroller.offsetWidth - display.scroller.clientWidth;
      display.heightForcer.style.height = scrollGap(cm) + "px";
      display.sizer.style.marginBottom = -display.nativeBarWidth + "px";
      display.sizer.style.borderRightWidth = scrollGap(cm) + "px";
      display.scrollbarsClipped = true;
    }
  }

  // Does the actual updating of the line display. Bails out
  // (returning false) when there is nothing to be done and forced is
  // false.
  function updateDisplayIfNeeded(cm, update) {
    var display = cm.display, doc = cm.doc;

    if (update.editorIsHidden) {
      resetView(cm);
      return false;
    }

    // Bail out if the visible area is already rendered and nothing changed.
    if (!update.force &&
        update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo &&
        (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) &&
        display.renderedView == display.view && countDirtyView(cm) == 0)
      return false;

    if (maybeUpdateLineNumberWidth(cm)) {
      resetView(cm);
      update.dims = getDimensions(cm);
    }

    // Compute a suitable new viewport (from & to)
    var end = doc.first + doc.size;
    var from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first);
    var to = Math.min(end, update.visible.to + cm.options.viewportMargin);
    if (display.viewFrom < from && from - display.viewFrom < 20) from = Math.max(doc.first, display.viewFrom);
    if (display.viewTo > to && display.viewTo - to < 20) to = Math.min(end, display.viewTo);
    if (sawCollapsedSpans) {
      from = visualLineNo(cm.doc, from);
      to = visualLineEndNo(cm.doc, to);
    }

    var different = from != display.viewFrom || to != display.viewTo ||
      display.lastWrapHeight != update.wrapperHeight || display.lastWrapWidth != update.wrapperWidth;
    adjustView(cm, from, to);

    display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom));
    // Position the mover div to align with the current scroll position
    cm.display.mover.style.top = display.viewOffset + "px";

    var toUpdate = countDirtyView(cm);
    if (!different && toUpdate == 0 && !update.force && display.renderedView == display.view &&
        (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo))
      return false;

    // For big changes, we hide the enclosing element during the
    // update, since that speeds up the operations on most browsers.
    var focused = activeElt();
    if (toUpdate > 4) display.lineDiv.style.display = "none";
    patchDisplay(cm, display.updateLineNumbers, update.dims);
    if (toUpdate > 4) display.lineDiv.style.display = "";
    display.renderedView = display.view;
    // There might have been a widget with a focused element that got
    // hidden or updated, if so re-focus it.
    if (focused && activeElt() != focused && focused.offsetHeight) focused.focus();

    // Prevent selection and cursors from interfering with the scroll
    // width and height.
    removeChildren(display.cursorDiv);
    removeChildren(display.selectionDiv);
    display.gutters.style.height = display.sizer.style.minHeight = 0;

    if (different) {
      display.lastWrapHeight = update.wrapperHeight;
      display.lastWrapWidth = update.wrapperWidth;
      startWorker(cm, 400);
    }

    display.updateLineNumbers = null;

    return true;
  }

  function postUpdateDisplay(cm, update) {
    var viewport = update.viewport;

    for (var first = true;; first = false) {
      if (!first || !cm.options.lineWrapping || update.oldDisplayWidth == displayWidth(cm)) {
        // Clip forced viewport to actual scrollable area.
        if (viewport && viewport.top != null)
          viewport = {top: Math.min(cm.doc.height + paddingVert(cm.display) - displayHeight(cm), viewport.top)};
        // Updated line heights might result in the drawn area not
        // actually covering the viewport. Keep looping until it does.
        update.visible = visibleLines(cm.display, cm.doc, viewport);
        if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo)
          break;
      }
      if (!updateDisplayIfNeeded(cm, update)) break;
      updateHeightsInViewport(cm);
      var barMeasure = measureForScrollbars(cm);
      updateSelection(cm);
      updateScrollbars(cm, barMeasure);
      setDocumentHeight(cm, barMeasure);
    }

    update.signal(cm, "update", cm);
    if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) {
      update.signal(cm, "viewportChange", cm, cm.display.viewFrom, cm.display.viewTo);
      cm.display.reportedViewFrom = cm.display.viewFrom; cm.display.reportedViewTo = cm.display.viewTo;
    }
  }

  function updateDisplaySimple(cm, viewport) {
    var update = new DisplayUpdate(cm, viewport);
    if (updateDisplayIfNeeded(cm, update)) {
      updateHeightsInViewport(cm);
      postUpdateDisplay(cm, update);
      var barMeasure = measureForScrollbars(cm);
      updateSelection(cm);
      updateScrollbars(cm, barMeasure);
      setDocumentHeight(cm, barMeasure);
      update.finish();
    }
  }

  function setDocumentHeight(cm, measure) {
    cm.display.sizer.style.minHeight = measure.docHeight + "px";
    cm.display.heightForcer.style.top = measure.docHeight + "px";
    cm.display.gutters.style.height = (measure.docHeight + cm.display.barHeight + scrollGap(cm)) + "px";
  }

  // Read the actual heights of the rendered lines, and update their
  // stored heights to match.
  function updateHeightsInViewport(cm) {
    var display = cm.display;
    var prevBottom = display.lineDiv.offsetTop;
    for (var i = 0; i < display.view.length; i++) {
      var cur = display.view[i], height;
      if (cur.hidden) continue;
      if (ie && ie_version < 8) {
        var bot = cur.node.offsetTop + cur.node.offsetHeight;
        height = bot - prevBottom;
        prevBottom = bot;
      } else {
        var box = cur.node.getBoundingClientRect();
        height = box.bottom - box.top;
      }
      var diff = cur.line.height - height;
      if (height < 2) height = textHeight(display);
      if (diff > .001 || diff < -.001) {
        updateLineHeight(cur.line, height);
        updateWidgetHeight(cur.line);
        if (cur.rest) for (var j = 0; j < cur.rest.length; j++)
          updateWidgetHeight(cur.rest[j]);
      }
    }
  }

  // Read and store the height of line widgets associated with the
  // given line.
  function updateWidgetHeight(line) {
    if (line.widgets) for (var i = 0; i < line.widgets.length; ++i)
      line.widgets[i].height = line.widgets[i].node.parentNode.offsetHeight;
  }

  // Do a bulk-read of the DOM positions and sizes needed to draw the
  // view, so that we don't interleave reading and writing to the DOM.
  function getDimensions(cm) {
    var d = cm.display, left = {}, width = {};
    var gutterLeft = d.gutters.clientLeft;
    for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) {
      left[cm.options.gutters[i]] = n.offsetLeft + n.clientLeft + gutterLeft;
      width[cm.options.gutters[i]] = n.clientWidth;
    }
    return {fixedPos: compensateForHScroll(d),
            gutterTotalWidth: d.gutters.offsetWidth,
            gutterLeft: left,
            gutterWidth: width,
            wrapperWidth: d.wrapper.clientWidth};
  }

  // Sync the actual display DOM structure with display.view, removing
  // nodes for lines that are no longer in view, and creating the ones
  // that are not there yet, and updating the ones that are out of
  // date.
  function patchDisplay(cm, updateNumbersFrom, dims) {
    var display = cm.display, lineNumbers = cm.options.lineNumbers;
    var container = display.lineDiv, cur = container.firstChild;

    function rm(node) {
      var next = node.nextSibling;
      // Works around a throw-scroll bug in OS X Webkit
      if (webkit && mac && cm.display.currentWheelTarget == node)
        node.style.display = "none";
      else
        node.parentNode.removeChild(node);
      return next;
    }

    var view = display.view, lineN = display.viewFrom;
    // Loop over the elements in the view, syncing cur (the DOM nodes
    // in display.lineDiv) with the view as we go.
    for (var i = 0; i < view.length; i++) {
      var lineView = view[i];
      if (lineView.hidden) {
      } else if (!lineView.node || lineView.node.parentNode != container) { // Not drawn yet
        var node = buildLineElement(cm, lineView, lineN, dims);
        container.insertBefore(node, cur);
      } else { // Already drawn
        while (cur != lineView.node) cur = rm(cur);
        var updateNumber = lineNumbers && updateNumbersFrom != null &&
          updateNumbersFrom <= lineN && lineView.lineNumber;
        if (lineView.changes) {
          if (indexOf(lineView.changes, "gutter") > -1) updateNumber = false;
          updateLineForChanges(cm, lineView, lineN, dims);
        }
        if (updateNumber) {
          removeChildren(lineView.lineNumber);
          lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN)));
        }
        cur = lineView.node.nextSibling;
      }
      lineN += lineView.size;
    }
    while (cur) cur = rm(cur);
  }

  // When an aspect of a line changes, a string is added to
  // lineView.changes. This updates the relevant part of the line's
  // DOM structure.
  function updateLineForChanges(cm, lineView, lineN, dims) {
    for (var j = 0; j < lineView.changes.length; j++) {
      var type = lineView.changes[j];
      if (type == "text") updateLineText(cm, lineView);
      else if (type == "gutter") updateLineGutter(cm, lineView, lineN, dims);
      else if (type == "class") updateLineClasses(lineView);
      else if (type == "widget") updateLineWidgets(cm, lineView, dims);
    }
    lineView.changes = null;
  }

  // Lines with gutter elements, widgets or a background class need to
  // be wrapped, and have the extra elements added to the wrapper div
  function ensureLineWrapped(lineView) {
    if (lineView.node == lineView.text) {
      lineView.node = elt("div", null, null, "position: relative");
      if (lineView.text.parentNode)
        lineView.text.parentNode.replaceChild(lineView.node, lineView.text);
      lineView.node.appendChild(lineView.text);
      if (ie && ie_version < 8) lineView.node.style.zIndex = 2;
    }
    return lineView.node;
  }

  function updateLineBackground(lineView) {
    var cls = lineView.bgClass ? lineView.bgClass + " " + (lineView.line.bgClass || "") : lineView.line.bgClass;
    if (cls) cls += " CodeMirror-linebackground";
    if (lineView.background) {
      if (cls) lineView.background.className = cls;
      else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null; }
    } else if (cls) {
      var wrap = ensureLineWrapped(lineView);
      lineView.background = wrap.insertBefore(elt("div", null, cls), wrap.firstChild);
    }
  }

  // Wrapper around buildLineContent which will reuse the structure
  // in display.externalMeasured when possible.
  function getLineContent(cm, lineView) {
    var ext = cm.display.externalMeasured;
    if (ext && ext.line == lineView.line) {
      cm.display.externalMeasured = null;
      lineView.measure = ext.measure;
      return ext.built;
    }
    return buildLineContent(cm, lineView);
  }

  // Redraw the line's text. Interacts with the background and text
  // classes because the mode may output tokens that influence these
  // classes.
  function updateLineText(cm, lineView) {
    var cls = lineView.text.className;
    var built = getLineContent(cm, lineView);
    if (lineView.text == lineView.node) lineView.node = built.pre;
    lineView.text.parentNode.replaceChild(built.pre, lineView.text);
    lineView.text = built.pre;
    if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) {
      lineView.bgClass = built.bgClass;
      lineView.textClass = built.textClass;
      updateLineClasses(lineView);
    } else if (cls) {
      lineView.text.className = cls;
    }
  }

  function updateLineClasses(lineView) {
    updateLineBackground(lineView);
    if (lineView.line.wrapClass)
      ensureLineWrapped(lineView).className = lineView.line.wrapClass;
    else if (lineView.node != lineView.text)
      lineView.node.className = "";
    var textClass = lineView.textClass ? lineView.textClass + " " + (lineView.line.textClass || "") : lineView.line.textClass;
    lineView.text.className = textClass || "";
  }

  function updateLineGutter(cm, lineView, lineN, dims) {
    if (lineView.gutter) {
      lineView.node.removeChild(lineView.gutter);
      lineView.gutter = null;
    }
    if (lineView.gutterBackground) {
      lineView.node.removeChild(lineView.gutterBackground);
      lineView.gutterBackground = null;
    }
    if (lineView.line.gutterClass) {
      var wrap = ensureLineWrapped(lineView);
      lineView.gutterBackground = elt("div", null, "CodeMirror-gutter-background " + lineView.line.gutterClass,
                                      "left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) +
                                      "px; width: " + dims.gutterTotalWidth + "px");
      wrap.insertBefore(lineView.gutterBackground, lineView.text);
    }
    var markers = lineView.line.gutterMarkers;
    if (cm.options.lineNumbers || markers) {
      var wrap = ensureLineWrapped(lineView);
      var gutterWrap = lineView.gutter = elt("div", null, "CodeMirror-gutter-wrapper", "left: " +
                                             (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px");
      cm.display.input.setUneditable(gutterWrap);
      wrap.insertBefore(gutterWrap, lineView.text);
      if (lineView.line.gutterClass)
        gutterWrap.className += " " + lineView.line.gutterClass;
      if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"]))
        lineView.lineNumber = gutterWrap.appendChild(
          elt("div", lineNumberFor(cm.options, lineN),
              "CodeMirror-linenumber CodeMirror-gutter-elt",
              "left: " + dims.gutterLeft["CodeMirror-linenumbers"] + "px; width: "
              + cm.display.lineNumInnerWidth + "px"));
      if (markers) for (var k = 0; k < cm.options.gutters.length; ++k) {
        var id = cm.options.gutters[k], found = markers.hasOwnProperty(id) && markers[id];
        if (found)
          gutterWrap.appendChild(elt("div", [found], "CodeMirror-gutter-elt", "left: " +
                                     dims.gutterLeft[id] + "px; width: " + dims.gutterWidth[id] + "px"));
      }
    }
  }

  function updateLineWidgets(cm, lineView, dims) {
    if (lineView.alignable) lineView.alignable = null;
    for (var node = lineView.node.firstChild, next; node; node = next) {
      var next = node.nextSibling;
      if (node.className == "CodeMirror-linewidget")
        lineView.node.removeChild(node);
    }
    insertLineWidgets(cm, lineView, dims);
  }

  // Build a line's DOM representation from scratch
  function buildLineElement(cm, lineView, lineN, dims) {
    var built = getLineContent(cm, lineView);
    lineView.text = lineView.node = built.pre;
    if (built.bgClass) lineView.bgClass = built.bgClass;
    if (built.textClass) lineView.textClass = built.textClass;

    updateLineClasses(lineView);
    updateLineGutter(cm, lineView, lineN, dims);
    insertLineWidgets(cm, lineView, dims);
    return lineView.node;
  }

  // A lineView may contain multiple logical lines (when merged by
  // collapsed spans). The widgets for all of them need to be drawn.
  function insertLineWidgets(cm, lineView, dims) {
    insertLineWidgetsFor(cm, lineView.line, lineView, dims, true);
    if (lineView.rest) for (var i = 0; i < lineView.rest.length; i++)
      insertLineWidgetsFor(cm, lineView.rest[i], lineView, dims, false);
  }

  function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) {
    if (!line.widgets) return;
    var wrap = ensureLineWrapped(lineView);
    for (var i = 0, ws = line.widgets; i < ws.length; ++i) {
      var widget = ws[i], node = elt("div", [widget.node], "CodeMirror-linewidget");
      if (!widget.handleMouseEvents) node.setAttribute("cm-ignore-events", "true");
      positionLineWidget(widget, node, lineView, dims);
      cm.display.input.setUneditable(node);
      if (allowAbove && widget.above)
        wrap.insertBefore(node, lineView.gutter || lineView.text);
      else
        wrap.appendChild(node);
      signalLater(widget, "redraw");
    }
  }

  function positionLineWidget(widget, node, lineView, dims) {
    if (widget.noHScroll) {
      (lineView.alignable || (lineView.alignable = [])).push(node);
      var width = dims.wrapperWidth;
      node.style.left = dims.fixedPos + "px";
      if (!widget.coverGutter) {
        width -= dims.gutterTotalWidth;
        node.style.paddingLeft = dims.gutterTotalWidth + "px";
      }
      node.style.width = width + "px";
    }
    if (widget.coverGutter) {
      node.style.zIndex = 5;
      node.style.position = "relative";
      if (!widget.noHScroll) node.style.marginLeft = -dims.gutterTotalWidth + "px";
    }
  }

  // POSITION OBJECT

  // A Pos instance represents a position within the text.
  var Pos = CodeMirror.Pos = function(line, ch) {
    if (!(this instanceof Pos)) return new Pos(line, ch);
    this.line = line; this.ch = ch;
  };

  // Compare two positions, return 0 if they are the same, a negative
  // number when a is less, and a positive number otherwise.
  var cmp = CodeMirror.cmpPos = function(a, b) { return a.line - b.line || a.ch - b.ch; };

  function copyPos(x) {return Pos(x.line, x.ch);}
  function maxPos(a, b) { return cmp(a, b) < 0 ? b : a; }
  function minPos(a, b) { return cmp(a, b) < 0 ? a : b; }

  // INPUT HANDLING

  function ensureFocus(cm) {
    if (!cm.state.focused) { cm.display.input.focus(); onFocus(cm); }
  }

  // This will be set to a {lineWise: bool, text: [string]} object, so
  // that, when pasting, we know what kind of selections the copied
  // text was made out of.
  var lastCopied = null;

  function applyTextInput(cm, inserted, deleted, sel, origin) {
    var doc = cm.doc;
    cm.display.shift = false;
    if (!sel) sel = doc.sel;

    var paste = cm.state.pasteIncoming || origin == "paste";
    var textLines = doc.splitLines(inserted), multiPaste = null
    // When pasing N lines into N selections, insert one line per selection
    if (paste && sel.ranges.length > 1) {
      if (lastCopied && lastCopied.text.join("\n") == inserted) {
        if (sel.ranges.length % lastCopied.text.length == 0) {
          multiPaste = [];
          for (var i = 0; i < lastCopied.text.length; i++)
            multiPaste.push(doc.splitLines(lastCopied.text[i]));
        }
      } else if (textLines.length == sel.ranges.length) {
        multiPaste = map(textLines, function(l) { return [l]; });
      }
    }

    // Normal behavior is to insert the new text into every selection
    for (var i = sel.ranges.length - 1; i >= 0; i--) {
      var range = sel.ranges[i];
      var from = range.from(), to = range.to();
      if (range.empty()) {
        if (deleted && deleted > 0) // Handle deletion
          from = Pos(from.line, from.ch - deleted);
        else if (cm.state.overwrite && !paste) // Handle overwrite
          to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length));
        else if (lastCopied && lastCopied.lineWise && lastCopied.text.join("\n") == inserted)
          from = to = Pos(from.line, 0)
      }
      var updateInput = cm.curOp.updateInput;
      var changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i % multiPaste.length] : textLines,
                         origin: origin || (paste ? "paste" : cm.state.cutIncoming ? "cut" : "+input")};
      makeChange(cm.doc, changeEvent);
      signalLater(cm, "inputRead", cm, changeEvent);
    }
    if (inserted && !paste)
      triggerElectric(cm, inserted);

    ensureCursorVisible(cm);
    cm.curOp.updateInput = updateInput;
    cm.curOp.typing = true;
    cm.state.pasteIncoming = cm.state.cutIncoming = false;
  }

  function handlePaste(e, cm) {
    var pasted = e.clipboardData && e.clipboardData.getData("Text");
    if (pasted) {
      e.preventDefault();
      if (!cm.isReadOnly() && !cm.options.disableInput)
        runInOp(cm, function() { applyTextInput(cm, pasted, 0, null, "paste"); });
      return true;
    }
  }

  function triggerElectric(cm, inserted) {
    // When an 'electric' character is inserted, immediately trigger a reindent
    if (!cm.options.electricChars || !cm.options.smartIndent) return;
    var sel = cm.doc.sel;

    for (var i = sel.ranges.length - 1; i >= 0; i--) {
      var range = sel.ranges[i];
      if (range.head.ch > 100 || (i && sel.ranges[i - 1].head.line == range.head.line)) continue;
      var mode = cm.getModeAt(range.head);
      var indented = false;
      if (mode.electricChars) {
        for (var j = 0; j < mode.electricChars.length; j++)
          if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) {
            indented = indentLine(cm, range.head.line, "smart");
            break;
          }
      } else if (mode.electricInput) {
        if (mode.electricInput.test(getLine(cm.doc, range.head.line).text.slice(0, range.head.ch)))
          indented = indentLine(cm, range.head.line, "smart");
      }
      if (indented) signalLater(cm, "electricInput", cm, range.head.line);
    }
  }

  function copyableRanges(cm) {
    var text = [], ranges = [];
    for (var i = 0; i < cm.doc.sel.ranges.length; i++) {
      var line = cm.doc.sel.ranges[i].head.line;
      var lineRange = {anchor: Pos(line, 0), head: Pos(line + 1, 0)};
      ranges.push(lineRange);
      text.push(cm.getRange(lineRange.anchor, lineRange.head));
    }
    return {text: text, ranges: ranges};
  }

  function disableBrowserMagic(field, spellcheck) {
    field.setAttribute("autocorrect", "off");
    field.setAttribute("autocapitalize", "off");
    field.setAttribute("spellcheck", !!spellcheck);
  }

  // TEXTAREA INPUT STYLE

  function TextareaInput(cm) {
    this.cm = cm;
    // See input.poll and input.reset
    this.prevInput = "";

    // Flag that indicates whether we expect input to appear real soon
    // now (after some event like 'keypress' or 'input') and are
    // polling intensively.
    this.pollingFast = false;
    // Self-resetting timeout for the poller
    this.polling = new Delayed();
    // Tracks when input.reset has punted to just putting a short
    // string into the textarea instead of the full selection.
    this.inaccurateSelection = false;
    // Used to work around IE issue with selection being forgotten when focus moves away from textarea
    this.hasSelection = false;
    this.composing = null;
  };

  function hiddenTextarea() {
    var te = elt("textarea", null, null, "position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; outline: none");
    var div = elt("div", [te], null, "overflow: hidden; position: relative; width: 3px; height: 0px;");
    // The textarea is kept positioned near the cursor to prevent the
    // fact that it'll be scrolled into view on input from scrolling
    // our fake cursor out of view. On webkit, when wrap=off, paste is
    // very slow. So make the area wide instead.
    if (webkit) te.style.width = "1000px";
    else te.setAttribute("wrap", "off");
    // If border: 0; -- iOS fails to open keyboard (issue #1287)
    if (ios) te.style.border = "1px solid black";
    disableBrowserMagic(te);
    return div;
  }

  TextareaInput.prototype = copyObj({
    init: function(display) {
      var input = this, cm = this.cm;

      // Wraps and hides input textarea
      var div = this.wrapper = hiddenTextarea();
      // The semihidden textarea that is focused when the editor is
      // focused, and receives input.
      var te = this.textarea = div.firstChild;
      display.wrapper.insertBefore(div, display.wrapper.firstChild);

      // Needed to hide big blue blinking cursor on Mobile Safari (doesn't seem to work in iOS 8 anymore)
      if (ios) te.style.width = "0px";

      on(te, "input", function() {
        if (ie && ie_version >= 9 && input.hasSelection) input.hasSelection = null;
        input.poll();
      });

      on(te, "paste", function(e) {
        if (signalDOMEvent(cm, e) || handlePaste(e, cm)) return

        cm.state.pasteIncoming = true;
        input.fastPoll();
      });

      function prepareCopyCut(e) {
        if (signalDOMEvent(cm, e)) return
        if (cm.somethingSelected()) {
          lastCopied = {lineWise: false, text: cm.getSelections()};
          if (input.inaccurateSelection) {
            input.prevInput = "";
            input.inaccurateSelection = false;
            te.value = lastCopied.text.join("\n");
            selectInput(te);
          }
        } else if (!cm.options.lineWiseCopyCut) {
          return;
        } else {
          var ranges = copyableRanges(cm);
          lastCopied = {lineWise: true, text: ranges.text};
          if (e.type == "cut") {
            cm.setSelections(ranges.ranges, null, sel_dontScroll);
          } else {
            input.prevInput = "";
            te.value = ranges.text.join("\n");
            selectInput(te);
          }
        }
        if (e.type == "cut") cm.state.cutIncoming = true;
      }
      on(te, "cut", prepareCopyCut);
      on(te, "copy", prepareCopyCut);

      on(display.scroller, "paste", function(e) {
        if (eventInWidget(display, e) || signalDOMEvent(cm, e)) return;
        cm.state.pasteIncoming = true;
        input.focus();
      });

      // Prevent normal selection in the editor (we handle our own)
      on(display.lineSpace, "selectstart", function(e) {
        if (!eventInWidget(display, e)) e_preventDefault(e);
      });

      on(te, "compositionstart", function() {
        var start = cm.getCursor("from");
        if (input.composing) input.composing.range.clear()
        input.composing = {
          start: start,
          range: cm.markText(start, cm.getCursor("to"), {className: "CodeMirror-composing"})
        };
      });
      on(te, "compositionend", function() {
        if (input.composing) {
          input.poll();
          input.composing.range.clear();
          input.composing = null;
        }
      });
    },

    prepareSelection: function() {
      // Redraw the selection and/or cursor
      var cm = this.cm, display = cm.display, doc = cm.doc;
      var result = prepareSelection(cm);

      // Move the hidden textarea near the cursor to prevent scrolling artifacts
      if (cm.options.moveInputWithCursor) {
        var headPos = cursorCoords(cm, doc.sel.primary().head, "div");
        var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect();
        result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10,
                                            headPos.top + lineOff.top - wrapOff.top));
        result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10,
                                             headPos.left + lineOff.left - wrapOff.left));
      }

      return result;
    },

    showSelection: function(drawn) {
      var cm = this.cm, display = cm.display;
      removeChildrenAndAdd(display.cursorDiv, drawn.cursors);
      removeChildrenAndAdd(display.selectionDiv, drawn.selection);
      if (drawn.teTop != null) {
        this.wrapper.style.top = drawn.teTop + "px";
        this.wrapper.style.left = drawn.teLeft + "px";
      }
    },

    // Reset the input to correspond to the selection (or to be empty,
    // when not typing and nothing is selected)
    reset: function(typing) {
      if (this.contextMenuPending) return;
      var minimal, selected, cm = this.cm, doc = cm.doc;
      if (cm.somethingSelected()) {
        this.prevInput = "";
        var range = doc.sel.primary();
        minimal = hasCopyEvent &&
          (range.to().line - range.from().line > 100 || (selected = cm.getSelection()).length > 1000);
        var content = minimal ? "-" : selected || cm.getSelection();
        this.textarea.value = content;
        if (cm.state.focused) selectInput(this.textarea);
        if (ie && ie_version >= 9) this.hasSelection = content;
      } else if (!typing) {
        this.prevInput = this.textarea.value = "";
        if (ie && ie_version >= 9) this.hasSelection = null;
      }
      this.inaccurateSelection = minimal;
    },

    getField: function() { return this.textarea; },

    supportsTouch: function() { return false; },

    focus: function() {
      if (this.cm.options.readOnly != "nocursor" && (!mobile || activeElt() != this.textarea)) {
        try { this.textarea.focus(); }
        catch (e) {} // IE8 will throw if the textarea is display: none or not in DOM
      }
    },

    blur: function() { this.textarea.blur(); },

    resetPosition: function() {
      this.wrapper.style.top = this.wrapper.style.left = 0;
    },

    receivedFocus: function() { this.slowPoll(); },

    // Poll for input changes, using the normal rate of polling. This
    // runs as long as the editor is focused.
    slowPoll: function() {
      var input = this;
      if (input.pollingFast) return;
      input.polling.set(this.cm.options.pollInterval, function() {
        input.poll();
        if (input.cm.state.focused) input.slowPoll();
      });
    },

    // When an event has just come in that is likely to add or change
    // something in the input textarea, we poll faster, to ensure that
    // the change appears on the screen quickly.
    fastPoll: function() {
      var missed = false, input = this;
      input.pollingFast = true;
      function p() {
        var changed = input.poll();
        if (!changed && !missed) {missed = true; input.polling.set(60, p);}
        else {input.pollingFast = false; input.slowPoll();}
      }
      input.polling.set(20, p);
    },

    // Read input from the textarea, and update the document to match.
    // When something is selected, it is present in the textarea, and
    // selected (unless it is huge, in which case a placeholder is
    // used). When nothing is selected, the cursor sits after previously
    // seen text (can be empty), which is stored in prevInput (we must
    // not reset the textarea when typing, because that breaks IME).
    poll: function() {
      var cm = this.cm, input = this.textarea, prevInput = this.prevInput;
      // Since this is called a *lot*, try to bail out as cheaply as
      // possible when it is clear that nothing happened. hasSelection
      // will be the case when there is a lot of text in the textarea,
      // in which case reading its value would be expensive.
      if (this.contextMenuPending || !cm.state.focused ||
          (hasSelection(input) && !prevInput && !this.composing) ||
          cm.isReadOnly() || cm.options.disableInput || cm.state.keySeq)
        return false;

      var text = input.value;
      // If nothing changed, bail.
      if (text == prevInput && !cm.somethingSelected()) return false;
      // Work around nonsensical selection resetting in IE9/10, and
      // inexplicable appearance of private area unicode characters on
      // some key combos in Mac (#2689).
      if (ie && ie_version >= 9 && this.hasSelection === text ||
          mac && /[\uf700-\uf7ff]/.test(text)) {
        cm.display.input.reset();
        return false;
      }

      if (cm.doc.sel == cm.display.selForContextMenu) {
        var first = text.charCodeAt(0);
        if (first == 0x200b && !prevInput) prevInput = "\u200b";
        if (first == 0x21da) { this.reset(); return this.cm.execCommand("undo"); }
      }
      // Find the part of the input that is actually new
      var same = 0, l = Math.min(prevInput.length, text.length);
      while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) ++same;

      var self = this;
      runInOp(cm, function() {
        applyTextInput(cm, text.slice(same), prevInput.length - same,
                       null, self.composing ? "*compose" : null);

        // Don't leave long text in the textarea, since it makes further polling slow
        if (text.length > 1000 || text.indexOf("\n") > -1) input.value = self.prevInput = "";
        else self.prevInput = text;

        if (self.composing) {
          self.composing.range.clear();
          self.composing.range = cm.markText(self.composing.start, cm.getCursor("to"),
                                             {className: "CodeMirror-composing"});
        }
      });
      return true;
    },

    ensurePolled: function() {
      if (this.pollingFast && this.poll()) this.pollingFast = false;
    },

    onKeyPress: function() {
      if (ie && ie_version >= 9) this.hasSelection = null;
      this.fastPoll();
    },

    onContextMenu: function(e) {
      var input = this, cm = input.cm, display = cm.display, te = input.textarea;
      var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop;
      if (!pos || presto) return; // Opera is difficult.

      // Reset the current text selection only if the click is done outside of the selection
      // and 'resetSelectionOnContextMenu' option is true.
      var reset = cm.options.resetSelectionOnContextMenu;
      if (reset && cm.doc.sel.contains(pos) == -1)
        operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll);

      var oldCSS = te.style.cssText, oldWrapperCSS = input.wrapper.style.cssText;
      input.wrapper.style.cssText = "position: absolute"
      var wrapperBox = input.wrapper.getBoundingClientRect()
      te.style.cssText = "position: absolute; width: 30px; height: 30px; top: " + (e.clientY - wrapperBox.top - 5) +
        "px; left: " + (e.clientX - wrapperBox.left - 5) + "px; z-index: 1000; background: " +
        (ie ? "rgba(255, 255, 255, .05)" : "transparent") +
        "; outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);";
      if (webkit) var oldScrollY = window.scrollY; // Work around Chrome issue (#2712)
      display.input.focus();
      if (webkit) window.scrollTo(null, oldScrollY);
      display.input.reset();
      // Adds "Select all" to context menu in FF
      if (!cm.somethingSelected()) te.value = input.prevInput = " ";
      input.contextMenuPending = true;
      display.selForContextMenu = cm.doc.sel;
      clearTimeout(display.detectingSelectAll);

      // Select-all will be greyed out if there's nothing to select, so
      // this adds a zero-width space so that we can later check whether
      // it got selected.
      function prepareSelectAllHack() {
        if (te.selectionStart != null) {
          var selected = cm.somethingSelected();
          var extval = "\u200b" + (selected ? te.value : "");
          te.value = "\u21da"; // Used to catch context-menu undo
          te.value = extval;
          input.prevInput = selected ? "" : "\u200b";
          te.selectionStart = 1; te.selectionEnd = extval.length;
          // Re-set this, in case some other handler touched the
          // selection in the meantime.
          display.selForContextMenu = cm.doc.sel;
        }
      }
      function rehide() {
        input.contextMenuPending = false;
        input.wrapper.style.cssText = oldWrapperCSS
        te.style.cssText = oldCSS;
        if (ie && ie_version < 9) display.scrollbars.setScrollTop(display.scroller.scrollTop = scrollPos);

        // Try to detect the user choosing select-all
        if (te.selectionStart != null) {
          if (!ie || (ie && ie_version < 9)) prepareSelectAllHack();
          var i = 0, poll = function() {
            if (display.selForContextMenu == cm.doc.sel && te.selectionStart == 0 &&
                te.selectionEnd > 0 && input.prevInput == "\u200b")
              operation(cm, commands.selectAll)(cm);
            else if (i++ < 10) display.detectingSelectAll = setTimeout(poll, 500);
            else display.input.reset();
          };
          display.detectingSelectAll = setTimeout(poll, 200);
        }
      }

      if (ie && ie_version >= 9) prepareSelectAllHack();
      if (captureRightClick) {
        e_stop(e);
        var mouseup = function() {
          off(window, "mouseup", mouseup);
          setTimeout(rehide, 20);
        };
        on(window, "mouseup", mouseup);
      } else {
        setTimeout(rehide, 50);
      }
    },

    readOnlyChanged: function(val) {
      if (!val) this.reset();
    },

    setUneditable: nothing,

    needsContentAttribute: false
  }, TextareaInput.prototype);

  // CONTENTEDITABLE INPUT STYLE

  function ContentEditableInput(cm) {
    this.cm = cm;
    this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null;
    this.polling = new Delayed();
    this.gracePeriod = false;
  }

  ContentEditableInput.prototype = copyObj({
    init: function(display) {
      var input = this, cm = input.cm;
      var div = input.div = display.lineDiv;
      disableBrowserMagic(div, cm.options.spellcheck);

      on(div, "paste", function(e) {
        if (signalDOMEvent(cm, e) || handlePaste(e, cm)) return
        // IE doesn't fire input events, so we schedule a read for the pasted content in this way
        if (ie_version <= 11) setTimeout(operation(cm, function() {
          if (!input.pollContent()) regChange(cm);
        }), 20)
      })

      on(div, "compositionstart", function(e) {
        var data = e.data;
        input.composing = {sel: cm.doc.sel, data: data, startData: data};
        if (!data) return;
        var prim = cm.doc.sel.primary();
        var line = cm.getLine(prim.head.line);
        var found = line.indexOf(data, Math.max(0, prim.head.ch - data.length));
        if (found > -1 && found <= prim.head.ch)
          input.composing.sel = simpleSelection(Pos(prim.head.line, found),
                                                Pos(prim.head.line, found + data.length));
      });
      on(div, "compositionupdate", function(e) {
        input.composing.data = e.data;
      });
      on(div, "compositionend", function(e) {
        var ours = input.composing;
        if (!ours) return;
        if (e.data != ours.startData && !/\u200b/.test(e.data))
          ours.data = e.data;
        // Need a small delay to prevent other code (input event,
        // selection polling) from doing damage when fired right after
        // compositionend.
        setTimeout(function() {
          if (!ours.handled)
            input.applyComposition(ours);
          if (input.composing == ours)
            input.composing = null;
        }, 50);
      });

      on(div, "touchstart", function() {
        input.forceCompositionEnd();
      });

      on(div, "input", function() {
        if (input.composing) return;
        if (cm.isReadOnly() || !input.pollContent())
          runInOp(input.cm, function() {regChange(cm);});
      });

      function onCopyCut(e) {
        if (signalDOMEvent(cm, e)) return
        if (cm.somethingSelected()) {
          lastCopied = {lineWise: false, text: cm.getSelections()};
          if (e.type == "cut") cm.replaceSelection("", null, "cut");
        } else if (!cm.options.lineWiseCopyCut) {
          return;
        } else {
          var ranges = copyableRanges(cm);
          lastCopied = {lineWise: true, text: ranges.text};
          if (e.type == "cut") {
            cm.operation(function() {
              cm.setSelections(ranges.ranges, 0, sel_dontScroll);
              cm.replaceSelection("", null, "cut");
            });
          }
        }
        if (e.clipboardData) {
          e.clipboardData.clearData();
          var content = lastCopied.text.join("\n")
          // iOS exposes the clipboard API, but seems to discard content inserted into it
          e.clipboardData.setData("Text", content);
          if (e.clipboardData.getData("Text") == content) {
            e.preventDefault();
            return
          }
        }
        // Old-fashioned briefly-focus-a-textarea hack
        var kludge = hiddenTextarea(), te = kludge.firstChild;
        cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild);
        te.value = lastCopied.text.join("\n");
        var hadFocus = document.activeElement;
        selectInput(te);
        setTimeout(function() {
          cm.display.lineSpace.removeChild(kludge);
          hadFocus.focus();
          if (hadFocus == div) input.showPrimarySelection()
        }, 50);
      }
      on(div, "copy", onCopyCut);
      on(div, "cut", onCopyCut);
    },

    prepareSelection: function() {
      var result = prepareSelection(this.cm, false);
      result.focus = this.cm.state.focused;
      return result;
    },

    showSelection: function(info, takeFocus) {
      if (!info || !this.cm.display.view.length) return;
      if (info.focus || takeFocus) this.showPrimarySelection();
      this.showMultipleSelections(info);
    },

    showPrimarySelection: function() {
      var sel = window.getSelection(), prim = this.cm.doc.sel.primary();
      var curAnchor = domToPos(this.cm, sel.anchorNode, sel.anchorOffset);
      var curFocus = domToPos(this.cm, sel.focusNode, sel.focusOffset);
      if (curAnchor && !curAnchor.bad && curFocus && !curFocus.bad &&
          cmp(minPos(curAnchor, curFocus), prim.from()) == 0 &&
          cmp(maxPos(curAnchor, curFocus), prim.to()) == 0)
        return;

      var start = posToDOM(this.cm, prim.from());
      var end = posToDOM(this.cm, prim.to());
      if (!start && !end) return;

      var view = this.cm.display.view;
      var old = sel.rangeCount && sel.getRangeAt(0);
      if (!start) {
        start = {node: view[0].measure.map[2], offset: 0};
      } else if (!end) { // FIXME dangerously hacky
        var measure = view[view.length - 1].measure;
        var map = measure.maps ? measure.maps[measure.maps.length - 1] : measure.map;
        end = {node: map[map.length - 1], offset: map[map.length - 2] - map[map.length - 3]};
      }

      try { var rng = range(start.node, start.offset, end.offset, end.node); }
      catch(e) {} // Our model of the DOM might be outdated, in which case the range we try to set can be impossible
      if (rng) {
        if (!gecko && this.cm.state.focused) {
          sel.collapse(start.node, start.offset);
          if (!rng.collapsed) sel.addRange(rng);
        } else {
          sel.removeAllRanges();
          sel.addRange(rng);
        }
        if (old && sel.anchorNode == null) sel.addRange(old);
        else if (gecko) this.startGracePeriod();
      }
      this.rememberSelection();
    },

    startGracePeriod: function() {
      var input = this;
      clearTimeout(this.gracePeriod);
      this.gracePeriod = setTimeout(function() {
        input.gracePeriod = false;
        if (input.selectionChanged())
          input.cm.operation(function() { input.cm.curOp.selectionChanged = true; });
      }, 20);
    },

    showMultipleSelections: function(info) {
      removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors);
      removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection);
    },

    rememberSelection: function() {
      var sel = window.getSelection();
      this.lastAnchorNode = sel.anchorNode; this.lastAnchorOffset = sel.anchorOffset;
      this.lastFocusNode = sel.focusNode; this.lastFocusOffset = sel.focusOffset;
    },

    selectionInEditor: function() {
      var sel = window.getSelection();
      if (!sel.rangeCount) return false;
      var node = sel.getRangeAt(0).commonAncestorContainer;
      return contains(this.div, node);
    },

    focus: function() {
      if (this.cm.options.readOnly != "nocursor") this.div.focus();
    },
    blur: function() { this.div.blur(); },
    getField: function() { return this.div; },

    supportsTouch: function() { return true; },

    receivedFocus: function() {
      var input = this;
      if (this.selectionInEditor())
        this.pollSelection();
      else
        runInOp(this.cm, function() { input.cm.curOp.selectionChanged = true; });

      function poll() {
        if (input.cm.state.focused) {
          input.pollSelection();
          input.polling.set(input.cm.options.pollInterval, poll);
        }
      }
      this.polling.set(this.cm.options.pollInterval, poll);
    },

    selectionChanged: function() {
      var sel = window.getSelection();
      return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset ||
        sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset;
    },

    pollSelection: function() {
      if (!this.composing && !this.gracePeriod && this.selectionChanged()) {
        var sel = window.getSelection(), cm = this.cm;
        this.rememberSelection();
        var anchor = domToPos(cm, sel.anchorNode, sel.anchorOffset);
        var head = domToPos(cm, sel.focusNode, sel.focusOffset);
        if (anchor && head) runInOp(cm, function() {
          setSelection(cm.doc, simpleSelection(anchor, head), sel_dontScroll);
          if (anchor.bad || head.bad) cm.curOp.selectionChanged = true;
        });
      }
    },

    pollContent: function() {
      var cm = this.cm, display = cm.display, sel = cm.doc.sel.primary();
      var from = sel.from(), to = sel.to();
      if (from.line < display.viewFrom || to.line > display.viewTo - 1) return false;

      var fromIndex;
      if (from.line == display.viewFrom || (fromIndex = findViewIndex(cm, from.line)) == 0) {
        var fromLine = lineNo(display.view[0].line);
        var fromNode = display.view[0].node;
      } else {
        var fromLine = lineNo(display.view[fromIndex].line);
        var fromNode = display.view[fromIndex - 1].node.nextSibling;
      }
      var toIndex = findViewIndex(cm, to.line);
      if (toIndex == display.view.length - 1) {
        var toLine = display.viewTo - 1;
        var toNode = display.lineDiv.lastChild;
      } else {
        var toLine = lineNo(display.view[toIndex + 1].line) - 1;
        var toNode = display.view[toIndex + 1].node.previousSibling;
      }

      var newText = cm.doc.splitLines(domTextBetween(cm, fromNode, toNode, fromLine, toLine));
      var oldText = getBetween(cm.doc, Pos(fromLine, 0), Pos(toLine, getLine(cm.doc, toLine).text.length));
      while (newText.length > 1 && oldText.length > 1) {
        if (lst(newText) == lst(oldText)) { newText.pop(); oldText.pop(); toLine--; }
        else if (newText[0] == oldText[0]) { newText.shift(); oldText.shift(); fromLine++; }
        else break;
      }

      var cutFront = 0, cutEnd = 0;
      var newTop = newText[0], oldTop = oldText[0], maxCutFront = Math.min(newTop.length, oldTop.length);
      while (cutFront < maxCutFront && newTop.charCodeAt(cutFront) == oldTop.charCodeAt(cutFront))
        ++cutFront;
      var newBot = lst(newText), oldBot = lst(oldText);
      var maxCutEnd = Math.min(newBot.length - (newText.length == 1 ? cutFront : 0),
                               oldBot.length - (oldText.length == 1 ? cutFront : 0));
      while (cutEnd < maxCutEnd &&
             newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1))
        ++cutEnd;

      newText[newText.length - 1] = newBot.slice(0, newBot.length - cutEnd);
      newText[0] = newText[0].slice(cutFront);

      var chFrom = Pos(fromLine, cutFront);
      var chTo = Pos(toLine, oldText.length ? lst(oldText).length - cutEnd : 0);
      if (newText.length > 1 || newText[0] || cmp(chFrom, chTo)) {
        replaceRange(cm.doc, newText, chFrom, chTo, "+input");
        return true;
      }
    },

    ensurePolled: function() {
      this.forceCompositionEnd();
    },
    reset: function() {
      this.forceCompositionEnd();
    },
    forceCompositionEnd: function() {
      if (!this.composing || this.composing.handled) return;
      this.applyComposition(this.composing);
      this.composing.handled = true;
      this.div.blur();
      this.div.focus();
    },
    applyComposition: function(composing) {
      if (this.cm.isReadOnly())
        operation(this.cm, regChange)(this.cm)
      else if (composing.data && composing.data != composing.startData)
        operation(this.cm, applyTextInput)(this.cm, composing.data, 0, composing.sel);
    },

    setUneditable: function(node) {
      node.contentEditable = "false"
    },

    onKeyPress: function(e) {
      e.preventDefault();
      if (!this.cm.isReadOnly())
        operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0);
    },

    readOnlyChanged: function(val) {
      this.div.contentEditable = String(val != "nocursor")
    },

    onContextMenu: nothing,
    resetPosition: nothing,

    needsContentAttribute: true
  }, ContentEditableInput.prototype);

  function posToDOM(cm, pos) {
    var view = findViewForLine(cm, pos.line);
    if (!view || view.hidden) return null;
    var line = getLine(cm.doc, pos.line);
    var info = mapFromLineView(view, line, pos.line);

    var order = getOrder(line), side = "left";
    if (order) {
      var partPos = getBidiPartAt(order, pos.ch);
      side = partPos % 2 ? "right" : "left";
    }
    var result = nodeAndOffsetInLineMap(info.map, pos.ch, side);
    result.offset = result.collapse == "right" ? result.end : result.start;
    return result;
  }

  function badPos(pos, bad) { if (bad) pos.bad = true; return pos; }

  function domToPos(cm, node, offset) {
    var lineNode;
    if (node == cm.display.lineDiv) {
      lineNode = cm.display.lineDiv.childNodes[offset];
      if (!lineNode) return badPos(cm.clipPos(Pos(cm.display.viewTo - 1)), true);
      node = null; offset = 0;
    } else {
      for (lineNode = node;; lineNode = lineNode.parentNode) {
        if (!lineNode || lineNode == cm.display.lineDiv) return null;
        if (lineNode.parentNode && lineNode.parentNode == cm.display.lineDiv) break;
      }
    }
    for (var i = 0; i < cm.display.view.length; i++) {
      var lineView = cm.display.view[i];
      if (lineView.node == lineNode)
        return locateNodeInLineView(lineView, node, offset);
    }
  }

  function locateNodeInLineView(lineView, node, offset) {
    var wrapper = lineView.text.firstChild, bad = false;
    if (!node || !contains(wrapper, node)) return badPos(Pos(lineNo(lineView.line), 0), true);
    if (node == wrapper) {
      bad = true;
      node = wrapper.childNodes[offset];
      offset = 0;
      if (!node) {
        var line = lineView.rest ? lst(lineView.rest) : lineView.line;
        return badPos(Pos(lineNo(line), line.text.length), bad);
      }
    }

    var textNode = node.nodeType == 3 ? node : null, topNode = node;
    if (!textNode && node.childNodes.length == 1 && node.firstChild.nodeType == 3) {
      textNode = node.firstChild;
      if (offset) offset = textNode.nodeValue.length;
    }
    while (topNode.parentNode != wrapper) topNode = topNode.parentNode;
    var measure = lineView.measure, maps = measure.maps;

    function find(textNode, topNode, offset) {
      for (var i = -1; i < (maps ? maps.length : 0); i++) {
        var map = i < 0 ? measure.map : maps[i];
        for (var j = 0; j < map.length; j += 3) {
          var curNode = map[j + 2];
          if (curNode == textNode || curNode == topNode) {
            var line = lineNo(i < 0 ? lineView.line : lineView.rest[i]);
            var ch = map[j] + offset;
            if (offset < 0 || curNode != textNode) ch = map[j + (offset ? 1 : 0)];
            return Pos(line, ch);
          }
        }
      }
    }
    var found = find(textNode, topNode, offset);
    if (found) return badPos(found, bad);

    // FIXME this is all really shaky. might handle the few cases it needs to handle, but likely to cause problems
    for (var after = topNode.nextSibling, dist = textNode ? textNode.nodeValue.length - offset : 0; after; after = after.nextSibling) {
      found = find(after, after.firstChild, 0);
      if (found)
        return badPos(Pos(found.line, found.ch - dist), bad);
      else
        dist += after.textContent.length;
    }
    for (var before = topNode.previousSibling, dist = offset; before; before = before.previousSibling) {
      found = find(before, before.firstChild, -1);
      if (found)
        return badPos(Pos(found.line, found.ch + dist), bad);
      else
        dist += before.textContent.length;
    }
  }

  function domTextBetween(cm, from, to, fromLine, toLine) {
    var text = "", closing = false, lineSep = cm.doc.lineSeparator();
    function recognizeMarker(id) { return function(marker) { return marker.id == id; }; }
    function walk(node) {
      if (node.nodeType == 1) {
        var cmText = node.getAttribute("cm-text");
        if (cmText != null) {
          if (cmText == "") cmText = node.textContent.replace(/\u200b/g, "");
          text += cmText;
          return;
        }
        var markerID = node.getAttribute("cm-marker"), range;
        if (markerID) {
          var found = cm.findMarks(Pos(fromLine, 0), Pos(toLine + 1, 0), recognizeMarker(+markerID));
          if (found.length && (range = found[0].find()))
            text += getBetween(cm.doc, range.from, range.to).join(lineSep);
          return;
        }
        if (node.getAttribute("contenteditable") == "false") return;
        for (var i = 0; i < node.childNodes.length; i++)
          walk(node.childNodes[i]);
        if (/^(pre|div|p)$/i.test(node.nodeName))
          closing = true;
      } else if (node.nodeType == 3) {
        var val = node.nodeValue;
        if (!val) return;
        if (closing) {
          text += lineSep;
          closing = false;
        }
        text += val;
      }
    }
    for (;;) {
      walk(from);
      if (from == to) break;
      from = from.nextSibling;
    }
    return text;
  }

  CodeMirror.inputStyles = {"textarea": TextareaInput, "contenteditable": ContentEditableInput};

  // SELECTION / CURSOR

  // Selection objects are immutable. A new one is created every time
  // the selection changes. A selection is one or more non-overlapping
  // (and non-touching) ranges, sorted, and an integer that indicates
  // which one is the primary selection (the one that's scrolled into
  // view, that getCursor returns, etc).
  function Selection(ranges, primIndex) {
    this.ranges = ranges;
    this.primIndex = primIndex;
  }

  Selection.prototype = {
    primary: function() { return this.ranges[this.primIndex]; },
    equals: function(other) {
      if (other == this) return true;
      if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) return false;
      for (var i = 0; i < this.ranges.length; i++) {
        var here = this.ranges[i], there = other.ranges[i];
        if (cmp(here.anchor, there.anchor) != 0 || cmp(here.head, there.head) != 0) return false;
      }
      return true;
    },
    deepCopy: function() {
      for (var out = [], i = 0; i < this.ranges.length; i++)
        out[i] = new Range(copyPos(this.ranges[i].anchor), copyPos(this.ranges[i].head));
      return new Selection(out, this.primIndex);
    },
    somethingSelected: function() {
      for (var i = 0; i < this.ranges.length; i++)
        if (!this.ranges[i].empty()) return true;
      return false;
    },
    contains: function(pos, end) {
      if (!end) end = pos;
      for (var i = 0; i < this.ranges.length; i++) {
        var range = this.ranges[i];
        if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0)
          return i;
      }
      return -1;
    }
  };

  function Range(anchor, head) {
    this.anchor = anchor; this.head = head;
  }

  Range.prototype = {
    from: function() { return minPos(this.anchor, this.head); },
    to: function() { return maxPos(this.anchor, this.head); },
    empty: function() {
      return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch;
    }
  };

  // Take an unsorted, potentially overlapping set of ranges, and
  // build a selection out of it. 'Consumes' ranges array (modifying
  // it).
  function normalizeSelection(ranges, primIndex) {
    var prim = ranges[primIndex];
    ranges.sort(function(a, b) { return cmp(a.from(), b.from()); });
    primIndex = indexOf(ranges, prim);
    for (var i = 1; i < ranges.length; i++) {
      var cur = ranges[i], prev = ranges[i - 1];
      if (cmp(prev.to(), cur.from()) >= 0) {
        var from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to());
        var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head;
        if (i <= primIndex) --primIndex;
        ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to));
      }
    }
    return new Selection(ranges, primIndex);
  }

  function simpleSelection(anchor, head) {
    return new Selection([new Range(anchor, head || anchor)], 0);
  }

  // Most of the external API clips given positions to make sure they
  // actually exist within the document.
  function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1));}
  function clipPos(doc, pos) {
    if (pos.line < doc.first) return Pos(doc.first, 0);
    var last = doc.first + doc.size - 1;
    if (pos.line > last) return Pos(last, getLine(doc, last).text.length);
    return clipToLen(pos, getLine(doc, pos.line).text.length);
  }
  function clipToLen(pos, linelen) {
    var ch = pos.ch;
    if (ch == null || ch > linelen) return Pos(pos.line, linelen);
    else if (ch < 0) return Pos(pos.line, 0);
    else return pos;
  }
  function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size;}
  function clipPosArray(doc, array) {
    for (var out = [], i = 0; i < array.length; i++) out[i] = clipPos(doc, array[i]);
    return out;
  }

  // SELECTION UPDATES

  // The 'scroll' parameter given to many of these indicated whether
  // the new cursor position should be scrolled into view after
  // modifying the selection.

  // If shift is held or the extend flag is set, extends a range to
  // include a given position (and optionally a second position).
  // Otherwise, simply returns the range between the given positions.
  // Used for cursor motion and such.
  function extendRange(doc, range, head, other) {
    if (doc.cm && doc.cm.display.shift || doc.extend) {
      var anchor = range.anchor;
      if (other) {
        var posBefore = cmp(head, anchor) < 0;
        if (posBefore != (cmp(other, anchor) < 0)) {
          anchor = head;
          head = other;
        } else if (posBefore != (cmp(head, other) < 0)) {
          head = other;
        }
      }
      return new Range(anchor, head);
    } else {
      return new Range(other || head, head);
    }
  }

  // Extend the primary selection range, discard the rest.
  function extendSelection(doc, head, other, options) {
    setSelection(doc, new Selection([extendRange(doc, doc.sel.primary(), head, other)], 0), options);
  }

  // Extend all selections (pos is an array of selections with length
  // equal the number of selections)
  function extendSelections(doc, heads, options) {
    for (var out = [], i = 0; i < doc.sel.ranges.length; i++)
      out[i] = extendRange(doc, doc.sel.ranges[i], heads[i], null);
    var newSel = normalizeSelection(out, doc.sel.primIndex);
    setSelection(doc, newSel, options);
  }

  // Updates a single range in the selection.
  function replaceOneSelection(doc, i, range, options) {
    var ranges = doc.sel.ranges.slice(0);
    ranges[i] = range;
    setSelection(doc, normalizeSelection(ranges, doc.sel.primIndex), options);
  }

  // Reset the selection to a single range.
  function setSimpleSelection(doc, anchor, head, options) {
    setSelection(doc, simpleSelection(anchor, head), options);
  }

  // Give beforeSelectionChange handlers a change to influence a
  // selection update.
  function filterSelectionChange(doc, sel, options) {
    var obj = {
      ranges: sel.ranges,
      update: function(ranges) {
        this.ranges = [];
        for (var i = 0; i < ranges.length; i++)
          this.ranges[i] = new Range(clipPos(doc, ranges[i].anchor),
                                     clipPos(doc, ranges[i].head));
      },
      origin: options && options.origin
    };
    signal(doc, "beforeSelectionChange", doc, obj);
    if (doc.cm) signal(doc.cm, "beforeSelectionChange", doc.cm, obj);
    if (obj.ranges != sel.ranges) return normalizeSelection(obj.ranges, obj.ranges.length - 1);
    else return sel;
  }

  function setSelectionReplaceHistory(doc, sel, options) {
    var done = doc.history.done, last = lst(done);
    if (last && last.ranges) {
      done[done.length - 1] = sel;
      setSelectionNoUndo(doc, sel, options);
    } else {
      setSelection(doc, sel, options);
    }
  }

  // Set a new selection.
  function setSelection(doc, sel, options) {
    setSelectionNoUndo(doc, sel, options);
    addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options);
  }

  function setSelectionNoUndo(doc, sel, options) {
    if (hasHandler(doc, "beforeSelectionChange") || doc.cm && hasHandler(doc.cm, "beforeSelectionChange"))
      sel = filterSelectionChange(doc, sel, options);

    var bias = options && options.bias ||
      (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1);
    setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true));

    if (!(options && options.scroll === false) && doc.cm)
      ensureCursorVisible(doc.cm);
  }

  function setSelectionInner(doc, sel) {
    if (sel.equals(doc.sel)) return;

    doc.sel = sel;

    if (doc.cm) {
      doc.cm.curOp.updateInput = doc.cm.curOp.selectionChanged = true;
      signalCursorActivity(doc.cm);
    }
    signalLater(doc, "cursorActivity", doc);
  }

  // Verify that the selection does not partially select any atomic
  // marked ranges.
  function reCheckSelection(doc) {
    setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false), sel_dontScroll);
  }

  // Return a selection that does not partially select any atomic
  // ranges.
  function skipAtomicInSelection(doc, sel, bias, mayClear) {
    var out;
    for (var i = 0; i < sel.ranges.length; i++) {
      var range = sel.ranges[i];
      var old = sel.ranges.length == doc.sel.ranges.length && doc.sel.ranges[i];
      var newAnchor = skipAtomic(doc, range.anchor, old && old.anchor, bias, mayClear);
      var newHead = skipAtomic(doc, range.head, old && old.head, bias, mayClear);
      if (out || newAnchor != range.anchor || newHead != range.head) {
        if (!out) out = sel.ranges.slice(0, i);
        out[i] = new Range(newAnchor, newHead);
      }
    }
    return out ? normalizeSelection(out, sel.primIndex) : sel;
  }

  function skipAtomicInner(doc, pos, oldPos, dir, mayClear) {
    var line = getLine(doc, pos.line);
    if (line.markedSpans) for (var i = 0; i < line.markedSpans.length; ++i) {
      var sp = line.markedSpans[i], m = sp.marker;
      if ((sp.from == null || (m.inclusiveLeft ? sp.from <= pos.ch : sp.from < pos.ch)) &&
          (sp.to == null || (m.inclusiveRight ? sp.to >= pos.ch : sp.to > pos.ch))) {
        if (mayClear) {
          signal(m, "beforeCursorEnter");
          if (m.explicitlyCleared) {
            if (!line.markedSpans) break;
            else {--i; continue;}
          }
        }
        if (!m.atomic) continue;

        if (oldPos) {
          var near = m.find(dir < 0 ? 1 : -1), diff;
          if (dir < 0 ? m.inclusiveRight : m.inclusiveLeft)
            near = movePos(doc, near, -dir, near && near.line == pos.line ? line : null);
          if (near && near.line == pos.line && (diff = cmp(near, oldPos)) && (dir < 0 ? diff < 0 : diff > 0))
            return skipAtomicInner(doc, near, pos, dir, mayClear);
        }

        var far = m.find(dir < 0 ? -1 : 1);
        if (dir < 0 ? m.inclusiveLeft : m.inclusiveRight)
          far = movePos(doc, far, dir, far.line == pos.line ? line : null);
        return far ? skipAtomicInner(doc, far, pos, dir, mayClear) : null;
      }
    }
    return pos;
  }

  // Ensure a given position is not inside an atomic range.
  function skipAtomic(doc, pos, oldPos, bias, mayClear) {
    var dir = bias || 1;
    var found = skipAtomicInner(doc, pos, oldPos, dir, mayClear) ||
        (!mayClear && skipAtomicInner(doc, pos, oldPos, dir, true)) ||
        skipAtomicInner(doc, pos, oldPos, -dir, mayClear) ||
        (!mayClear && skipAtomicInner(doc, pos, oldPos, -dir, true));
    if (!found) {
      doc.cantEdit = true;
      return Pos(doc.first, 0);
    }
    return found;
  }

  function movePos(doc, pos, dir, line) {
    if (dir < 0 && pos.ch == 0) {
      if (pos.line > doc.first) return clipPos(doc, Pos(pos.line - 1));
      else return null;
    } else if (dir > 0 && pos.ch == (line || getLine(doc, pos.line)).text.length) {
      if (pos.line < doc.first + doc.size - 1) return Pos(pos.line + 1, 0);
      else return null;
    } else {
      return new Pos(pos.line, pos.ch + dir);
    }
  }

  // SELECTION DRAWING

  function updateSelection(cm) {
    cm.display.input.showSelection(cm.display.input.prepareSelection());
  }

  function prepareSelection(cm, primary) {
    var doc = cm.doc, result = {};
    var curFragment = result.cursors = document.createDocumentFragment();
    var selFragment = result.selection = document.createDocumentFragment();

    for (var i = 0; i < doc.sel.ranges.length; i++) {
      if (primary === false && i == doc.sel.primIndex) continue;
      var range = doc.sel.ranges[i];
      if (range.from().line >= cm.display.viewTo || range.to().line < cm.display.viewFrom) continue;
      var collapsed = range.empty();
      if (collapsed || cm.options.showCursorWhenSelecting)
        drawSelectionCursor(cm, range.head, curFragment);
      if (!collapsed)
        drawSelectionRange(cm, range, selFragment);
    }
    return result;
  }

  // Draws a cursor for the given range
  function drawSelectionCursor(cm, head, output) {
    var pos = cursorCoords(cm, head, "div", null, null, !cm.options.singleCursorHeightPerLine);

    var cursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor"));
    cursor.style.left = pos.left + "px";
    cursor.style.top = pos.top + "px";
    cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + "px";

    if (pos.other) {
      // Secondary cursor, shown when on a 'jump' in bi-directional text
      var otherCursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor CodeMirror-secondarycursor"));
      otherCursor.style.display = "";
      otherCursor.style.left = pos.other.left + "px";
      otherCursor.style.top = pos.other.top + "px";
      otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + "px";
    }
  }

  // Draws the given range as a highlighted selection
  function drawSelectionRange(cm, range, output) {
    var display = cm.display, doc = cm.doc;
    var fragment = document.createDocumentFragment();
    var padding = paddingH(cm.display), leftSide = padding.left;
    var rightSide = Math.max(display.sizerWidth, displayWidth(cm) - display.sizer.offsetLeft) - padding.right;

    function add(left, top, width, bottom) {
      if (top < 0) top = 0;
      top = Math.round(top);
      bottom = Math.round(bottom);
      fragment.appendChild(elt("div", null, "CodeMirror-selected", "position: absolute; left: " + left +
                               "px; top: " + top + "px; width: " + (width == null ? rightSide - left : width) +
                               "px; height: " + (bottom - top) + "px"));
    }

    function drawForLine(line, fromArg, toArg) {
      var lineObj = getLine(doc, line);
      var lineLen = lineObj.text.length;
      var start, end;
      function coords(ch, bias) {
        return charCoords(cm, Pos(line, ch), "div", lineObj, bias);
      }

      iterateBidiSections(getOrder(lineObj), fromArg || 0, toArg == null ? lineLen : toArg, function(from, to, dir) {
        var leftPos = coords(from, "left"), rightPos, left, right;
        if (from == to) {
          rightPos = leftPos;
          left = right = leftPos.left;
        } else {
          rightPos = coords(to - 1, "right");
          if (dir == "rtl") { var tmp = leftPos; leftPos = rightPos; rightPos = tmp; }
          left = leftPos.left;
          right = rightPos.right;
        }
        if (fromArg == null && from == 0) left = leftSide;
        if (rightPos.top - leftPos.top > 3) { // Different lines, draw top part
          add(left, leftPos.top, null, leftPos.bottom);
          left = leftSide;
          if (leftPos.bottom < rightPos.top) add(left, leftPos.bottom, null, rightPos.top);
        }
        if (toArg == null && to == lineLen) right = rightSide;
        if (!start || leftPos.top < start.top || leftPos.top == start.top && leftPos.left < start.left)
          start = leftPos;
        if (!end || rightPos.bottom > end.bottom || rightPos.bottom == end.bottom && rightPos.right > end.right)
          end = rightPos;
        if (left < leftSide + 1) left = leftSide;
        add(left, rightPos.top, right - left, rightPos.bottom);
      });
      return {start: start, end: end};
    }

    var sFrom = range.from(), sTo = range.to();
    if (sFrom.line == sTo.line) {
      drawForLine(sFrom.line, sFrom.ch, sTo.ch);
    } else {
      var fromLine = getLine(doc, sFrom.line), toLine = getLine(doc, sTo.line);
      var singleVLine = visualLine(fromLine) == visualLine(toLine);
      var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end;
      var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start;
      if (singleVLine) {
        if (leftEnd.top < rightStart.top - 2) {
          add(leftEnd.right, leftEnd.top, null, leftEnd.bottom);
          add(leftSide, rightStart.top, rightStart.left, rightStart.bottom);
        } else {
          add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom);
        }
      }
      if (leftEnd.bottom < rightStart.top)
        add(leftSide, leftEnd.bottom, null, rightStart.top);
    }

    output.appendChild(fragment);
  }

  // Cursor-blinking
  function restartBlink(cm) {
    if (!cm.state.focused) return;
    var display = cm.display;
    clearInterval(display.blinker);
    var on = true;
    display.cursorDiv.style.visibility = "";
    if (cm.options.cursorBlinkRate > 0)
      display.blinker = setInterval(function() {
        display.cursorDiv.style.visibility = (on = !on) ? "" : "hidden";
      }, cm.options.cursorBlinkRate);
    else if (cm.options.cursorBlinkRate < 0)
      display.cursorDiv.style.visibility = "hidden";
  }

  // HIGHLIGHT WORKER

  function startWorker(cm, time) {
    if (cm.doc.mode.startState && cm.doc.frontier < cm.display.viewTo)
      cm.state.highlight.set(time, bind(highlightWorker, cm));
  }

  function highlightWorker(cm) {
    var doc = cm.doc;
    if (doc.frontier < doc.first) doc.frontier = doc.first;
    if (doc.frontier >= cm.display.viewTo) return;
    var end = +new Date + cm.options.workTime;
    var state = copyState(doc.mode, getStateBefore(cm, doc.frontier));
    var changedLines = [];

    doc.iter(doc.frontier, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function(line) {
      if (doc.frontier >= cm.display.viewFrom) { // Visible
        var oldStyles = line.styles, tooLong = line.text.length > cm.options.maxHighlightLength;
        var highlighted = highlightLine(cm, line, tooLong ? copyState(doc.mode, state) : state, true);
        line.styles = highlighted.styles;
        var oldCls = line.styleClasses, newCls = highlighted.classes;
        if (newCls) line.styleClasses = newCls;
        else if (oldCls) line.styleClasses = null;
        var ischange = !oldStyles || oldStyles.length != line.styles.length ||
          oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass);
        for (var i = 0; !ischange && i < oldStyles.length; ++i) ischange = oldStyles[i] != line.styles[i];
        if (ischange) changedLines.push(doc.frontier);
        line.stateAfter = tooLong ? state : copyState(doc.mode, state);
      } else {
        if (line.text.length <= cm.options.maxHighlightLength)
          processLine(cm, line.text, state);
        line.stateAfter = doc.frontier % 5 == 0 ? copyState(doc.mode, state) : null;
      }
      ++doc.frontier;
      if (+new Date > end) {
        startWorker(cm, cm.options.workDelay);
        return true;
      }
    });
    if (changedLines.length) runInOp(cm, function() {
      for (var i = 0; i < changedLines.length; i++)
        regLineChange(cm, changedLines[i], "text");
    });
  }

  // Finds the line to start with when starting a parse. Tries to
  // find a line with a stateAfter, so that it can start with a
  // valid state. If that fails, it returns the line with the
  // smallest indentation, which tends to need the least context to
  // parse correctly.
  function findStartLine(cm, n, precise) {
    var minindent, minline, doc = cm.doc;
    var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100);
    for (var search = n; search > lim; --search) {
      if (search <= doc.first) return doc.first;
      var line = getLine(doc, search - 1);
      if (line.stateAfter && (!precise || search <= doc.frontier)) return search;
      var indented = countColumn(line.text, null, cm.options.tabSize);
      if (minline == null || minindent > indented) {
        minline = search - 1;
        minindent = indented;
      }
    }
    return minline;
  }

  function getStateBefore(cm, n, precise) {
    var doc = cm.doc, display = cm.display;
    if (!doc.mode.startState) return true;
    var pos = findStartLine(cm, n, precise), state = pos > doc.first && getLine(doc, pos-1).stateAfter;
    if (!state) state = startState(doc.mode);
    else state = copyState(doc.mode, state);
    doc.iter(pos, n, function(line) {
      processLine(cm, line.text, state);
      var save = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo;
      line.stateAfter = save ? copyState(doc.mode, state) : null;
      ++pos;
    });
    if (precise) doc.frontier = pos;
    return state;
  }

  // POSITION MEASUREMENT

  function paddingTop(display) {return display.lineSpace.offsetTop;}
  function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight;}
  function paddingH(display) {
    if (display.cachedPaddingH) return display.cachedPaddingH;
    var e = removeChildrenAndAdd(display.measure, elt("pre", "x"));
    var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle;
    var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)};
    if (!isNaN(data.left) && !isNaN(data.right)) display.cachedPaddingH = data;
    return data;
  }

  function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth; }
  function displayWidth(cm) {
    return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth;
  }
  function displayHeight(cm) {
    return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight;
  }

  // Ensure the lineView.wrapping.heights array is populated. This is
  // an array of bottom offsets for the lines that make up a drawn
  // line. When lineWrapping is on, there might be more than one
  // height.
  function ensureLineHeights(cm, lineView, rect) {
    var wrapping = cm.options.lineWrapping;
    var curWidth = wrapping && displayWidth(cm);
    if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) {
      var heights = lineView.measure.heights = [];
      if (wrapping) {
        lineView.measure.width = curWidth;
        var rects = lineView.text.firstChild.getClientRects();
        for (var i = 0; i < rects.length - 1; i++) {
          var cur = rects[i], next = rects[i + 1];
          if (Math.abs(cur.bottom - next.bottom) > 2)
            heights.push((cur.bottom + next.top) / 2 - rect.top);
        }
      }
      heights.push(rect.bottom - rect.top);
    }
  }

  // Find a line map (mapping character offsets to text nodes) and a
  // measurement cache for the given line number. (A line view might
  // contain multiple lines when collapsed ranges are present.)
  function mapFromLineView(lineView, line, lineN) {
    if (lineView.line == line)
      return {map: lineView.measure.map, cache: lineView.measure.cache};
    for (var i = 0; i < lineView.rest.length; i++)
      if (lineView.rest[i] == line)
        return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]};
    for (var i = 0; i < lineView.rest.length; i++)
      if (lineNo(lineView.rest[i]) > lineN)
        return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i], before: true};
  }

  // Render a line into the hidden node display.externalMeasured. Used
  // when measurement is needed for a line that's not in the viewport.
  function updateExternalMeasurement(cm, line) {
    line = visualLine(line);
    var lineN = lineNo(line);
    var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN);
    view.lineN = lineN;
    var built = view.built = buildLineContent(cm, view);
    view.text = built.pre;
    removeChildrenAndAdd(cm.display.lineMeasure, built.pre);
    return view;
  }

  // Get a {top, bottom, left, right} box (in line-local coordinates)
  // for a given character.
  function measureChar(cm, line, ch, bias) {
    return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias);
  }

  // Find a line view that corresponds to the given line number.
  function findViewForLine(cm, lineN) {
    if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo)
      return cm.display.view[findViewIndex(cm, lineN)];
    var ext = cm.display.externalMeasured;
    if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size)
      return ext;
  }

  // Measurement can be split in two steps, the set-up work that
  // applies to the whole line, and the measurement of the actual
  // character. Functions like coordsChar, that need to do a lot of
  // measurements in a row, can thus ensure that the set-up work is
  // only done once.
  function prepareMeasureForLine(cm, line) {
    var lineN = lineNo(line);
    var view = findViewForLine(cm, lineN);
    if (view && !view.text) {
      view = null;
    } else if (view && view.changes) {
      updateLineForChanges(cm, view, lineN, getDimensions(cm));
      cm.curOp.forceUpdate = true;
    }
    if (!view)
      view = updateExternalMeasurement(cm, line);

    var info = mapFromLineView(view, line, lineN);
    return {
      line: line, view: view, rect: null,
      map: info.map, cache: info.cache, before: info.before,
      hasHeights: false
    };
  }

  // Given a prepared measurement object, measures the position of an
  // actual character (or fetches it from the cache).
  function measureCharPrepared(cm, prepared, ch, bias, varHeight) {
    if (prepared.before) ch = -1;
    var key = ch + (bias || ""), found;
    if (prepared.cache.hasOwnProperty(key)) {
      found = prepared.cache[key];
    } else {
      if (!prepared.rect)
        prepared.rect = prepared.view.text.getBoundingClientRect();
      if (!prepared.hasHeights) {
        ensureLineHeights(cm, prepared.view, prepared.rect);
        prepared.hasHeights = true;
      }
      found = measureCharInner(cm, prepared, ch, bias);
      if (!found.bogus) prepared.cache[key] = found;
    }
    return {left: found.left, right: found.right,
            top: varHeight ? found.rtop : found.top,
            bottom: varHeight ? found.rbottom : found.bottom};
  }

  var nullRect = {left: 0, right: 0, top: 0, bottom: 0};

  function nodeAndOffsetInLineMap(map, ch, bias) {
    var node, start, end, collapse;
    // First, search the line map for the text node corresponding to,
    // or closest to, the target character.
    for (var i = 0; i < map.length; i += 3) {
      var mStart = map[i], mEnd = map[i + 1];
      if (ch < mStart) {
        start = 0; end = 1;
        collapse = "left";
      } else if (ch < mEnd) {
        start = ch - mStart;
        end = start + 1;
      } else if (i == map.length - 3 || ch == mEnd && map[i + 3] > ch) {
        end = mEnd - mStart;
        start = end - 1;
        if (ch >= mEnd) collapse = "right";
      }
      if (start != null) {
        node = map[i + 2];
        if (mStart == mEnd && bias == (node.insertLeft ? "left" : "right"))
          collapse = bias;
        if (bias == "left" && start == 0)
          while (i && map[i - 2] == map[i - 3] && map[i - 1].insertLeft) {
            node = map[(i -= 3) + 2];
            collapse = "left";
          }
        if (bias == "right" && start == mEnd - mStart)
          while (i < map.length - 3 && map[i + 3] == map[i + 4] && !map[i + 5].insertLeft) {
            node = map[(i += 3) + 2];
            collapse = "right";
          }
        break;
      }
    }
    return {node: node, start: start, end: end, collapse: collapse, coverStart: mStart, coverEnd: mEnd};
  }

  function getUsefulRect(rects, bias) {
    var rect = nullRect
    if (bias == "left") for (var i = 0; i < rects.length; i++) {
      if ((rect = rects[i]).left != rect.right) break
    } else for (var i = rects.length - 1; i >= 0; i--) {
      if ((rect = rects[i]).left != rect.right) break
    }
    return rect
  }

  function measureCharInner(cm, prepared, ch, bias) {
    var place = nodeAndOffsetInLineMap(prepared.map, ch, bias);
    var node = place.node, start = place.start, end = place.end, collapse = place.collapse;

    var rect;
    if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates.
      for (var i = 0; i < 4; i++) { // Retry a maximum of 4 times when nonsense rectangles are returned
        while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) --start;
        while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) ++end;
        if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart)
          rect = node.parentNode.getBoundingClientRect();
        else
          rect = getUsefulRect(range(node, start, end).getClientRects(), bias)
        if (rect.left || rect.right || start == 0) break;
        end = start;
        start = start - 1;
        collapse = "right";
      }
      if (ie && ie_version < 11) rect = maybeUpdateRectForZooming(cm.display.measure, rect);
    } else { // If it is a widget, simply get the box for the whole widget.
      if (start > 0) collapse = bias = "right";
      var rects;
      if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1)
        rect = rects[bias == "right" ? rects.length - 1 : 0];
      else
        rect = node.getBoundingClientRect();
    }
    if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) {
      var rSpan = node.parentNode.getClientRects()[0];
      if (rSpan)
        rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom};
      else
        rect = nullRect;
    }

    var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top;
    var mid = (rtop + rbot) / 2;
    var heights = prepared.view.measure.heights;
    for (var i = 0; i < heights.length - 1; i++)
      if (mid < heights[i]) break;
    var top = i ? heights[i - 1] : 0, bot = heights[i];
    var result = {left: (collapse == "right" ? rect.right : rect.left) - prepared.rect.left,
                  right: (collapse == "left" ? rect.left : rect.right) - prepared.rect.left,
                  top: top, bottom: bot};
    if (!rect.left && !rect.right) result.bogus = true;
    if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot; }

    return result;
  }

  // Work around problem with bounding client rects on ranges being
  // returned incorrectly when zoomed on IE10 and below.
  function maybeUpdateRectForZooming(measure, rect) {
    if (!window.screen || screen.logicalXDPI == null ||
        screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure))
      return rect;
    var scaleX = screen.logicalXDPI / screen.deviceXDPI;
    var scaleY = screen.logicalYDPI / screen.deviceYDPI;
    return {left: rect.left * scaleX, right: rect.right * scaleX,
            top: rect.top * scaleY, bottom: rect.bottom * scaleY};
  }

  function clearLineMeasurementCacheFor(lineView) {
    if (lineView.measure) {
      lineView.measure.cache = {};
      lineView.measure.heights = null;
      if (lineView.rest) for (var i = 0; i < lineView.rest.length; i++)
        lineView.measure.caches[i] = {};
    }
  }

  function clearLineMeasurementCache(cm) {
    cm.display.externalMeasure = null;
    removeChildren(cm.display.lineMeasure);
    for (var i = 0; i < cm.display.view.length; i++)
      clearLineMeasurementCacheFor(cm.display.view[i]);
  }

  function clearCaches(cm) {
    clearLineMeasurementCache(cm);
    cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null;
    if (!cm.options.lineWrapping) cm.display.maxLineChanged = true;
    cm.display.lineNumChars = null;
  }

  function pageScrollX() { return window.pageXOffset || (document.documentElement || document.body).scrollLeft; }
  function pageScrollY() { return window.pageYOffset || (document.documentElement || document.body).scrollTop; }

  // Converts a {top, bottom, left, right} box from line-local
  // coordinates into another coordinate system. Context may be one of
  // "line", "div" (display.lineDiv), "local"/null (editor), "window",
  // or "page".
  function intoCoordSystem(cm, lineObj, rect, context) {
    if (lineObj.widgets) for (var i = 0; i < lineObj.widgets.length; ++i) if (lineObj.widgets[i].above) {
      var size = widgetHeight(lineObj.widgets[i]);
      rect.top += size; rect.bottom += size;
    }
    if (context == "line") return rect;
    if (!context) context = "local";
    var yOff = heightAtLine(lineObj);
    if (context == "local") yOff += paddingTop(cm.display);
    else yOff -= cm.display.viewOffset;
    if (context == "page" || context == "window") {
      var lOff = cm.display.lineSpace.getBoundingClientRect();
      yOff += lOff.top + (context == "window" ? 0 : pageScrollY());
      var xOff = lOff.left + (context == "window" ? 0 : pageScrollX());
      rect.left += xOff; rect.right += xOff;
    }
    rect.top += yOff; rect.bottom += yOff;
    return rect;
  }

  // Coverts a box from "div" coords to another coordinate system.
  // Context may be "window", "page", "div", or "local"/null.
  function fromCoordSystem(cm, coords, context) {
    if (context == "div") return coords;
    var left = coords.left, top = coords.top;
    // First move into "page" coordinate system
    if (context == "page") {
      left -= pageScrollX();
      top -= pageScrollY();
    } else if (context == "local" || !context) {
      var localBox = cm.display.sizer.getBoundingClientRect();
      left += localBox.left;
      top += localBox.top;
    }

    var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect();
    return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top};
  }

  function charCoords(cm, pos, context, lineObj, bias) {
    if (!lineObj) lineObj = getLine(cm.doc, pos.line);
    return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context);
  }

  // Returns a box for a given cursor position, which may have an
  // 'other' property containing the position of the secondary cursor
  // on a bidi boundary.
  function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) {
    lineObj = lineObj || getLine(cm.doc, pos.line);
    if (!preparedMeasure) preparedMeasure = prepareMeasureForLine(cm, lineObj);
    function get(ch, right) {
      var m = measureCharPrepared(cm, preparedMeasure, ch, right ? "right" : "left", varHeight);
      if (right) m.left = m.right; else m.right = m.left;
      return intoCoordSystem(cm, lineObj, m, context);
    }
    function getBidi(ch, partPos) {
      var part = order[partPos], right = part.level % 2;
      if (ch == bidiLeft(part) && partPos && part.level < order[partPos - 1].level) {
        part = order[--partPos];
        ch = bidiRight(part) - (part.level % 2 ? 0 : 1);
        right = true;
      } else if (ch == bidiRight(part) && partPos < order.length - 1 && part.level < order[partPos + 1].level) {
        part = order[++partPos];
        ch = bidiLeft(part) - part.level % 2;
        right = false;
      }
      if (right && ch == part.to && ch > part.from) return get(ch - 1);
      return get(ch, right);
    }
    var order = getOrder(lineObj), ch = pos.ch;
    if (!order) return get(ch);
    var partPos = getBidiPartAt(order, ch);
    var val = getBidi(ch, partPos);
    if (bidiOther != null) val.other = getBidi(ch, bidiOther);
    return val;
  }

  // Used to cheaply estimate the coordinates for a position. Used for
  // intermediate scroll updates.
  function estimateCoords(cm, pos) {
    var left = 0, pos = clipPos(cm.doc, pos);
    if (!cm.options.lineWrapping) left = charWidth(cm.display) * pos.ch;
    var lineObj = getLine(cm.doc, pos.line);
    var top = heightAtLine(lineObj) + paddingTop(cm.display);
    return {left: left, right: left, top: top, bottom: top + lineObj.height};
  }

  // Positions returned by coordsChar contain some extra information.
  // xRel is the relative x position of the input coordinates compared
  // to the found position (so xRel > 0 means the coordinates are to
  // the right of the character position, for example). When outside
  // is true, that means the coordinates lie outside the line's
  // vertical range.
  function PosWithInfo(line, ch, outside, xRel) {
    var pos = Pos(line, ch);
    pos.xRel = xRel;
    if (outside) pos.outside = true;
    return pos;
  }

  // Compute the character position closest to the given coordinates.
  // Input must be lineSpace-local ("div" coordinate system).
  function coordsChar(cm, x, y) {
    var doc = cm.doc;
    y += cm.display.viewOffset;
    if (y < 0) return PosWithInfo(doc.first, 0, true, -1);
    var lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1;
    if (lineN > last)
      return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, true, 1);
    if (x < 0) x = 0;

    var lineObj = getLine(doc, lineN);
    for (;;) {
      var found = coordsCharInner(cm, lineObj, lineN, x, y);
      var merged = collapsedSpanAtEnd(lineObj);
      var mergedPos = merged && merged.find(0, true);
      if (merged && (found.ch > mergedPos.from.ch || found.ch == mergedPos.from.ch && found.xRel > 0))
        lineN = lineNo(lineObj = mergedPos.to.line);
      else
        return found;
    }
  }

  function coordsCharInner(cm, lineObj, lineNo, x, y) {
    var innerOff = y - heightAtLine(lineObj);
    var wrongLine = false, adjust = 2 * cm.display.wrapper.clientWidth;
    var preparedMeasure = prepareMeasureForLine(cm, lineObj);

    function getX(ch) {
      var sp = cursorCoords(cm, Pos(lineNo, ch), "line", lineObj, preparedMeasure);
      wrongLine = true;
      if (innerOff > sp.bottom) return sp.left - adjust;
      else if (innerOff < sp.top) return sp.left + adjust;
      else wrongLine = false;
      return sp.left;
    }

    var bidi = getOrder(lineObj), dist = lineObj.text.length;
    var from = lineLeft(lineObj), to = lineRight(lineObj);
    var fromX = getX(from), fromOutside = wrongLine, toX = getX(to), toOutside = wrongLine;

    if (x > toX) return PosWithInfo(lineNo, to, toOutside, 1);
    // Do a binary search between these bounds.
    for (;;) {
      if (bidi ? to == from || to == moveVisually(lineObj, from, 1) : to - from <= 1) {
        var ch = x < fromX || x - fromX <= toX - x ? from : to;
        var outside = ch == from ? fromOutside : toOutside
        var xDiff = x - (ch == from ? fromX : toX);
        // This is a kludge to handle the case where the coordinates
        // are after a line-wrapped line. We should replace it with a
        // more general handling of cursor positions around line
        // breaks. (Issue #4078)
        if (toOutside && !bidi && !/\s/.test(lineObj.text.charAt(ch)) && xDiff > 0 &&
            ch < lineObj.text.length && preparedMeasure.view.measure.heights.length > 1) {
          var charSize = measureCharPrepared(cm, preparedMeasure, ch, "right");
          if (innerOff <= charSize.bottom && innerOff >= charSize.top && Math.abs(x - charSize.right) < xDiff) {
            outside = false
            ch++
            xDiff = x - charSize.right
          }
        }
        while (isExtendingChar(lineObj.text.charAt(ch))) ++ch;
        var pos = PosWithInfo(lineNo, ch, outside, xDiff < -1 ? -1 : xDiff > 1 ? 1 : 0);
        return pos;
      }
      var step = Math.ceil(dist / 2), middle = from + step;
      if (bidi) {
        middle = from;
        for (var i = 0; i < step; ++i) middle = moveVisually(lineObj, middle, 1);
      }
      var middleX = getX(middle);
      if (middleX > x) {to = middle; toX = middleX; if (toOutside = wrongLine) toX += 1000; dist = step;}
      else {from = middle; fromX = middleX; fromOutside = wrongLine; dist -= step;}
    }
  }

  var measureText;
  // Compute the default text height.
  function textHeight(display) {
    if (display.cachedTextHeight != null) return display.cachedTextHeight;
    if (measureText == null) {
      measureText = elt("pre");
      // Measure a bunch of lines, for browsers that compute
      // fractional heights.
      for (var i = 0; i < 49; ++i) {
        measureText.appendChild(document.createTextNode("x"));
        measureText.appendChild(elt("br"));
      }
      measureText.appendChild(document.createTextNode("x"));
    }
    removeChildrenAndAdd(display.measure, measureText);
    var height = measureText.offsetHeight / 50;
    if (height > 3) display.cachedTextHeight = height;
    removeChildren(display.measure);
    return height || 1;
  }

  // Compute the default character width.
  function charWidth(display) {
    if (display.cachedCharWidth != null) return display.cachedCharWidth;
    var anchor = elt("span", "xxxxxxxxxx");
    var pre = elt("pre", [anchor]);
    removeChildrenAndAdd(display.measure, pre);
    var rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10;
    if (width > 2) display.cachedCharWidth = width;
    return width || 10;
  }

  // OPERATIONS

  // Operations are used to wrap a series of changes to the editor
  // state in such a way that each change won't have to update the
  // cursor and display (which would be awkward, slow, and
  // error-prone). Instead, display updates are batched and then all
  // combined and executed at once.

  var operationGroup = null;

  var nextOpId = 0;
  // Start a new operation.
  function startOperation(cm) {
    cm.curOp = {
      cm: cm,
      viewChanged: false,      // Flag that indicates that lines might need to be redrawn
      startHeight: cm.doc.height, // Used to detect need to update scrollbar
      forceUpdate: false,      // Used to force a redraw
      updateInput: null,       // Whether to reset the input textarea
      typing: false,           // Whether this reset should be careful to leave existing text (for compositing)
      changeObjs: null,        // Accumulated changes, for firing change events
      cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on
      cursorActivityCalled: 0, // Tracks which cursorActivity handlers have been called already
      selectionChanged: false, // Whether the selection needs to be redrawn
      updateMaxLine: false,    // Set when the widest line needs to be determined anew
      scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet
      scrollToPos: null,       // Used to scroll to a specific position
      focus: false,
      id: ++nextOpId           // Unique ID
    };
    if (operationGroup) {
      operationGroup.ops.push(cm.curOp);
    } else {
      cm.curOp.ownsGroup = operationGroup = {
        ops: [cm.curOp],
        delayedCallbacks: []
      };
    }
  }

  function fireCallbacksForOps(group) {
    // Calls delayed callbacks and cursorActivity handlers until no
    // new ones appear
    var callbacks = group.delayedCallbacks, i = 0;
    do {
      for (; i < callbacks.length; i++)
        callbacks[i].call(null);
      for (var j = 0; j < group.ops.length; j++) {
        var op = group.ops[j];
        if (op.cursorActivityHandlers)
          while (op.cursorActivityCalled < op.cursorActivityHandlers.length)
            op.cursorActivityHandlers[op.cursorActivityCalled++].call(null, op.cm);
      }
    } while (i < callbacks.length);
  }

  // Finish an operation, updating the display and signalling delayed events
  function endOperation(cm) {
    var op = cm.curOp, group = op.ownsGroup;
    if (!group) return;

    try { fireCallbacksForOps(group); }
    finally {
      operationGroup = null;
      for (var i = 0; i < group.ops.length; i++)
        group.ops[i].cm.curOp = null;
      endOperations(group);
    }
  }

  // The DOM updates done when an operation finishes are batched so
  // that the minimum number of relayouts are required.
  function endOperations(group) {
    var ops = group.ops;
    for (var i = 0; i < ops.length; i++) // Read DOM
      endOperation_R1(ops[i]);
    for (var i = 0; i < ops.length; i++) // Write DOM (maybe)
      endOperation_W1(ops[i]);
    for (var i = 0; i < ops.length; i++) // Read DOM
      endOperation_R2(ops[i]);
    for (var i = 0; i < ops.length; i++) // Write DOM (maybe)
      endOperation_W2(ops[i]);
    for (var i = 0; i < ops.length; i++) // Read DOM
      endOperation_finish(ops[i]);
  }

  function endOperation_R1(op) {
    var cm = op.cm, display = cm.display;
    maybeClipScrollbars(cm);
    if (op.updateMaxLine) findMaxLine(cm);

    op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null ||
      op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom ||
                         op.scrollToPos.to.line >= display.viewTo) ||
      display.maxLineChanged && cm.options.lineWrapping;
    op.update = op.mustUpdate &&
      new DisplayUpdate(cm, op.mustUpdate && {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate);
  }

  function endOperation_W1(op) {
    op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update);
  }

  function endOperation_R2(op) {
    var cm = op.cm, display = cm.display;
    if (op.updatedDisplay) updateHeightsInViewport(cm);

    op.barMeasure = measureForScrollbars(cm);

    // If the max line changed since it was last measured, measure it,
    // and ensure the document's width matches it.
    // updateDisplay_W2 will use these properties to do the actual resizing
    if (display.maxLineChanged && !cm.options.lineWrapping) {
      op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3;
      cm.display.sizerWidth = op.adjustWidthTo;
      op.barMeasure.scrollWidth =
        Math.max(display.scroller.clientWidth, display.sizer.offsetLeft + op.adjustWidthTo + scrollGap(cm) + cm.display.barWidth);
      op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo - displayWidth(cm));
    }

    if (op.updatedDisplay || op.selectionChanged)
      op.preparedSelection = display.input.prepareSelection(op.focus);
  }

  function endOperation_W2(op) {
    var cm = op.cm;

    if (op.adjustWidthTo != null) {
      cm.display.sizer.style.minWidth = op.adjustWidthTo + "px";
      if (op.maxScrollLeft < cm.doc.scrollLeft)
        setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true);
      cm.display.maxLineChanged = false;
    }

    var takeFocus = op.focus && op.focus == activeElt() && (!document.hasFocus || document.hasFocus())
    if (op.preparedSelection)
      cm.display.input.showSelection(op.preparedSelection, takeFocus);
    if (op.updatedDisplay || op.startHeight != cm.doc.height)
      updateScrollbars(cm, op.barMeasure);
    if (op.updatedDisplay)
      setDocumentHeight(cm, op.barMeasure);

    if (op.selectionChanged) restartBlink(cm);

    if (cm.state.focused && op.updateInput)
      cm.display.input.reset(op.typing);
    if (takeFocus) ensureFocus(op.cm);
  }

  function endOperation_finish(op) {
    var cm = op.cm, display = cm.display, doc = cm.doc;

    if (op.updatedDisplay) postUpdateDisplay(cm, op.update);

    // Abort mouse wheel delta measurement, when scrolling explicitly
    if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos))
      display.wheelStartX = display.wheelStartY = null;

    // Propagate the scroll position to the actual DOM scroller
    if (op.scrollTop != null && (display.scroller.scrollTop != op.scrollTop || op.forceScroll)) {
      doc.scrollTop = Math.max(0, Math.min(display.scroller.scrollHeight - display.scroller.clientHeight, op.scrollTop));
      display.scrollbars.setScrollTop(doc.scrollTop);
      display.scroller.scrollTop = doc.scrollTop;
    }
    if (op.scrollLeft != null && (display.scroller.scrollLeft != op.scrollLeft || op.forceScroll)) {
      doc.scrollLeft = Math.max(0, Math.min(display.scroller.scrollWidth - display.scroller.clientWidth, op.scrollLeft));
      display.scrollbars.setScrollLeft(doc.scrollLeft);
      display.scroller.scrollLeft = doc.scrollLeft;
      alignHorizontally(cm);
    }
    // If we need to scroll a specific position into view, do so.
    if (op.scrollToPos) {
      var coords = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from),
                                     clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin);
      if (op.scrollToPos.isCursor && cm.state.focused) maybeScrollWindow(cm, coords);
    }

    // Fire events for markers that are hidden/unidden by editing or
    // undoing
    var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers;
    if (hidden) for (var i = 0; i < hidden.length; ++i)
      if (!hidden[i].lines.length) signal(hidden[i], "hide");
    if (unhidden) for (var i = 0; i < unhidden.length; ++i)
      if (unhidden[i].lines.length) signal(unhidden[i], "unhide");

    if (display.wrapper.offsetHeight)
      doc.scrollTop = cm.display.scroller.scrollTop;

    // Fire change events, and delayed event handlers
    if (op.changeObjs)
      signal(cm, "changes", cm, op.changeObjs);
    if (op.update)
      op.update.finish();
  }

  // Run the given function in an operation
  function runInOp(cm, f) {
    if (cm.curOp) return f();
    startOperation(cm);
    try { return f(); }
    finally { endOperation(cm); }
  }
  // Wraps a function in an operation. Returns the wrapped function.
  function operation(cm, f) {
    return function() {
      if (cm.curOp) return f.apply(cm, arguments);
      startOperation(cm);
      try { return f.apply(cm, arguments); }
      finally { endOperation(cm); }
    };
  }
  // Used to add methods to editor and doc instances, wrapping them in
  // operations.
  function methodOp(f) {
    return function() {
      if (this.curOp) return f.apply(this, arguments);
      startOperation(this);
      try { return f.apply(this, arguments); }
      finally { endOperation(this); }
    };
  }
  function docMethodOp(f) {
    return function() {
      var cm = this.cm;
      if (!cm || cm.curOp) return f.apply(this, arguments);
      startOperation(cm);
      try { return f.apply(this, arguments); }
      finally { endOperation(cm); }
    };
  }

  // VIEW TRACKING

  // These objects are used to represent the visible (currently drawn)
  // part of the document. A LineView may correspond to multiple
  // logical lines, if those are connected by collapsed ranges.
  function LineView(doc, line, lineN) {
    // The starting line
    this.line = line;
    // Continuing lines, if any
    this.rest = visualLineContinued(line);
    // Number of logical lines in this visual line
    this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1;
    this.node = this.text = null;
    this.hidden = lineIsHidden(doc, line);
  }

  // Create a range of LineView objects for the given lines.
  function buildViewArray(cm, from, to) {
    var array = [], nextPos;
    for (var pos = from; pos < to; pos = nextPos) {
      var view = new LineView(cm.doc, getLine(cm.doc, pos), pos);
      nextPos = pos + view.size;
      array.push(view);
    }
    return array;
  }

  // Updates the display.view data structure for a given change to the
  // document. From and to are in pre-change coordinates. Lendiff is
  // the amount of lines added or subtracted by the change. This is
  // used for changes that span multiple lines, or change the way
  // lines are divided into visual lines. regLineChange (below)
  // registers single-line changes.
  function regChange(cm, from, to, lendiff) {
    if (from == null) from = cm.doc.first;
    if (to == null) to = cm.doc.first + cm.doc.size;
    if (!lendiff) lendiff = 0;

    var display = cm.display;
    if (lendiff && to < display.viewTo &&
        (display.updateLineNumbers == null || display.updateLineNumbers > from))
      display.updateLineNumbers = from;

    cm.curOp.viewChanged = true;

    if (from >= display.viewTo) { // Change after
      if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo)
        resetView(cm);
    } else if (to <= display.viewFrom) { // Change before
      if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) {
        resetView(cm);
      } else {
        display.viewFrom += lendiff;
        display.viewTo += lendiff;
      }
    } else if (from <= display.viewFrom && to >= display.viewTo) { // Full overlap
      resetView(cm);
    } else if (from <= display.viewFrom) { // Top overlap
      var cut = viewCuttingPoint(cm, to, to + lendiff, 1);
      if (cut) {
        display.view = display.view.slice(cut.index);
        display.viewFrom = cut.lineN;
        display.viewTo += lendiff;
      } else {
        resetView(cm);
      }
    } else if (to >= display.viewTo) { // Bottom overlap
      var cut = viewCuttingPoint(cm, from, from, -1);
      if (cut) {
        display.view = display.view.slice(0, cut.index);
        display.viewTo = cut.lineN;
      } else {
        resetView(cm);
      }
    } else { // Gap in the middle
      var cutTop = viewCuttingPoint(cm, from, from, -1);
      var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1);
      if (cutTop && cutBot) {
        display.view = display.view.slice(0, cutTop.index)
          .concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN))
          .concat(display.view.slice(cutBot.index));
        display.viewTo += lendiff;
      } else {
        resetView(cm);
      }
    }

    var ext = display.externalMeasured;
    if (ext) {
      if (to < ext.lineN)
        ext.lineN += lendiff;
      else if (from < ext.lineN + ext.size)
        display.externalMeasured = null;
    }
  }

  // Register a change to a single line. Type must be one of "text",
  // "gutter", "class", "widget"
  function regLineChange(cm, line, type) {
    cm.curOp.viewChanged = true;
    var display = cm.display, ext = cm.display.externalMeasured;
    if (ext && line >= ext.lineN && line < ext.lineN + ext.size)
      display.externalMeasured = null;

    if (line < display.viewFrom || line >= display.viewTo) return;
    var lineView = display.view[findViewIndex(cm, line)];
    if (lineView.node == null) return;
    var arr = lineView.changes || (lineView.changes = []);
    if (indexOf(arr, type) == -1) arr.push(type);
  }

  // Clear the view.
  function resetView(cm) {
    cm.display.viewFrom = cm.display.viewTo = cm.doc.first;
    cm.display.view = [];
    cm.display.viewOffset = 0;
  }

  // Find the view element corresponding to a given line. Return null
  // when the line isn't visible.
  function findViewIndex(cm, n) {
    if (n >= cm.display.viewTo) return null;
    n -= cm.display.viewFrom;
    if (n < 0) return null;
    var view = cm.display.view;
    for (var i = 0; i < view.length; i++) {
      n -= view[i].size;
      if (n < 0) return i;
    }
  }

  function viewCuttingPoint(cm, oldN, newN, dir) {
    var index = findViewIndex(cm, oldN), diff, view = cm.display.view;
    if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size)
      return {index: index, lineN: newN};
    for (var i = 0, n = cm.display.viewFrom; i < index; i++)
      n += view[i].size;
    if (n != oldN) {
      if (dir > 0) {
        if (index == view.length - 1) return null;
        diff = (n + view[index].size) - oldN;
        index++;
      } else {
        diff = n - oldN;
      }
      oldN += diff; newN += diff;
    }
    while (visualLineNo(cm.doc, newN) != newN) {
      if (index == (dir < 0 ? 0 : view.length - 1)) return null;
      newN += dir * view[index - (dir < 0 ? 1 : 0)].size;
      index += dir;
    }
    return {index: index, lineN: newN};
  }

  // Force the view to cover a given range, adding empty view element
  // or clipping off existing ones as needed.
  function adjustView(cm, from, to) {
    var display = cm.display, view = display.view;
    if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) {
      display.view = buildViewArray(cm, from, to);
      display.viewFrom = from;
    } else {
      if (display.viewFrom > from)
        display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view);
      else if (display.viewFrom < from)
        display.view = display.view.slice(findViewIndex(cm, from));
      display.viewFrom = from;
      if (display.viewTo < to)
        display.view = display.view.concat(buildViewArray(cm, display.viewTo, to));
      else if (display.viewTo > to)
        display.view = display.view.slice(0, findViewIndex(cm, to));
    }
    display.viewTo = to;
  }

  // Count the number of lines in the view whose DOM representation is
  // out of date (or nonexistent).
  function countDirtyView(cm) {
    var view = cm.display.view, dirty = 0;
    for (var i = 0; i < view.length; i++) {
      var lineView = view[i];
      if (!lineView.hidden && (!lineView.node || lineView.changes)) ++dirty;
    }
    return dirty;
  }

  // EVENT HANDLERS

  // Attach the necessary event handlers when initializing the editor
  function registerEventHandlers(cm) {
    var d = cm.display;
    on(d.scroller, "mousedown", operation(cm, onMouseDown));
    // Older IE's will not fire a second mousedown for a double click
    if (ie && ie_version < 11)
      on(d.scroller, "dblclick", operation(cm, function(e) {
        if (signalDOMEvent(cm, e)) return;
        var pos = posFromMouse(cm, e);
        if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) return;
        e_preventDefault(e);
        var word = cm.findWordAt(pos);
        extendSelection(cm.doc, word.anchor, word.head);
      }));
    else
      on(d.scroller, "dblclick", function(e) { signalDOMEvent(cm, e) || e_preventDefault(e); });
    // Some browsers fire contextmenu *after* opening the menu, at
    // which point we can't mess with it anymore. Context menu is
    // handled in onMouseDown for these browsers.
    if (!captureRightClick) on(d.scroller, "contextmenu", function(e) {onContextMenu(cm, e);});

    // Used to suppress mouse event handling when a touch happens
    var touchFinished, prevTouch = {end: 0};
    function finishTouch() {
      if (d.activeTouch) {
        touchFinished = setTimeout(function() {d.activeTouch = null;}, 1000);
        prevTouch = d.activeTouch;
        prevTouch.end = +new Date;
      }
    };
    function isMouseLikeTouchEvent(e) {
      if (e.touches.length != 1) return false;
      var touch = e.touches[0];
      return touch.radiusX <= 1 && touch.radiusY <= 1;
    }
    function farAway(touch, other) {
      if (other.left == null) return true;
      var dx = other.left - touch.left, dy = other.top - touch.top;
      return dx * dx + dy * dy > 20 * 20;
    }
    on(d.scroller, "touchstart", function(e) {
      if (!signalDOMEvent(cm, e) && !isMouseLikeTouchEvent(e)) {
        clearTimeout(touchFinished);
        var now = +new Date;
        d.activeTouch = {start: now, moved: false,
                         prev: now - prevTouch.end <= 300 ? prevTouch : null};
        if (e.touches.length == 1) {
          d.activeTouch.left = e.touches[0].pageX;
          d.activeTouch.top = e.touches[0].pageY;
        }
      }
    });
    on(d.scroller, "touchmove", function() {
      if (d.activeTouch) d.activeTouch.moved = true;
    });
    on(d.scroller, "touchend", function(e) {
      var touch = d.activeTouch;
      if (touch && !eventInWidget(d, e) && touch.left != null &&
          !touch.moved && new Date - touch.start < 300) {
        var pos = cm.coordsChar(d.activeTouch, "page"), range;
        if (!touch.prev || farAway(touch, touch.prev)) // Single tap
          range = new Range(pos, pos);
        else if (!touch.prev.prev || farAway(touch, touch.prev.prev)) // Double tap
          range = cm.findWordAt(pos);
        else // Triple tap
          range = new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0)));
        cm.setSelection(range.anchor, range.head);
        cm.focus();
        e_preventDefault(e);
      }
      finishTouch();
    });
    on(d.scroller, "touchcancel", finishTouch);

    // Sync scrolling between fake scrollbars and real scrollable
    // area, ensure viewport is updated when scrolling.
    on(d.scroller, "scroll", function() {
      if (d.scroller.clientHeight) {
        setScrollTop(cm, d.scroller.scrollTop);
        setScrollLeft(cm, d.scroller.scrollLeft, true);
        signal(cm, "scroll", cm);
      }
    });

    // Listen to wheel events in order to try and update the viewport on time.
    on(d.scroller, "mousewheel", function(e){onScrollWheel(cm, e);});
    on(d.scroller, "DOMMouseScroll", function(e){onScrollWheel(cm, e);});

    // Prevent wrapper from ever scrolling
    on(d.wrapper, "scroll", function() { d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; });

    d.dragFunctions = {
      enter: function(e) {if (!signalDOMEvent(cm, e)) e_stop(e);},
      over: function(e) {if (!signalDOMEvent(cm, e)) { onDragOver(cm, e); e_stop(e); }},
      start: function(e){onDragStart(cm, e);},
      drop: operation(cm, onDrop),
      leave: function(e) {if (!signalDOMEvent(cm, e)) { clearDragCursor(cm); }}
    };

    var inp = d.input.getField();
    on(inp, "keyup", function(e) { onKeyUp.call(cm, e); });
    on(inp, "keydown", operation(cm, onKeyDown));
    on(inp, "keypress", operation(cm, onKeyPress));
    on(inp, "focus", bind(onFocus, cm));
    on(inp, "blur", bind(onBlur, cm));
  }

  function dragDropChanged(cm, value, old) {
    var wasOn = old && old != CodeMirror.Init;
    if (!value != !wasOn) {
      var funcs = cm.display.dragFunctions;
      var toggle = value ? on : off;
      toggle(cm.display.scroller, "dragstart", funcs.start);
      toggle(cm.display.scroller, "dragenter", funcs.enter);
      toggle(cm.display.scroller, "dragover", funcs.over);
      toggle(cm.display.scroller, "dragleave", funcs.leave);
      toggle(cm.display.scroller, "drop", funcs.drop);
    }
  }

  // Called when the window resizes
  function onResize(cm) {
    var d = cm.display;
    if (d.lastWrapHeight == d.wrapper.clientHeight && d.lastWrapWidth == d.wrapper.clientWidth)
      return;
    // Might be a text scaling operation, clear size caches.
    d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;
    d.scrollbarsClipped = false;
    cm.setSize();
  }

  // MOUSE EVENTS

  // Return true when the given mouse event happened in a widget
  function eventInWidget(display, e) {
    for (var n = e_target(e); n != display.wrapper; n = n.parentNode) {
      if (!n || (n.nodeType == 1 && n.getAttribute("cm-ignore-events") == "true") ||
          (n.parentNode == display.sizer && n != display.mover))
        return true;
    }
  }

  // Given a mouse event, find the corresponding position. If liberal
  // is false, it checks whether a gutter or scrollbar was clicked,
  // and returns null if it was. forRect is used by rectangular
  // selections, and tries to estimate a character position even for
  // coordinates beyond the right of the text.
  function posFromMouse(cm, e, liberal, forRect) {
    var display = cm.display;
    if (!liberal && e_target(e).getAttribute("cm-not-content") == "true") return null;

    var x, y, space = display.lineSpace.getBoundingClientRect();
    // Fails unpredictably on IE[67] when mouse is dragged around quickly.
    try { x = e.clientX - space.left; y = e.clientY - space.top; }
    catch (e) { return null; }
    var coords = coordsChar(cm, x, y), line;
    if (forRect && coords.xRel == 1 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) {
      var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length;
      coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff));
    }
    return coords;
  }

  // A mouse down can be a single click, double click, triple click,
  // start of selection drag, start of text drag, new cursor
  // (ctrl-click), rectangle drag (alt-drag), or xwin
  // middle-click-paste. Or it might be a click on something we should
  // not interfere with, such as a scrollbar or widget.
  function onMouseDown(e) {
    var cm = this, display = cm.display;
    if (signalDOMEvent(cm, e) || display.activeTouch && display.input.supportsTouch()) return;
    display.shift = e.shiftKey;

    if (eventInWidget(display, e)) {
      if (!webkit) {
        // Briefly turn off draggability, to allow widgets to do
        // normal dragging things.
        display.scroller.draggable = false;
        setTimeout(function(){display.scroller.draggable = true;}, 100);
      }
      return;
    }
    if (clickInGutter(cm, e)) return;
    var start = posFromMouse(cm, e);
    window.focus();

    switch (e_button(e)) {
    case 1:
      // #3261: make sure, that we're not starting a second selection
      if (cm.state.selectingText)
        cm.state.selectingText(e);
      else if (start)
        leftButtonDown(cm, e, start);
      else if (e_target(e) == display.scroller)
        e_preventDefault(e);
      break;
    case 2:
      if (webkit) cm.state.lastMiddleDown = +new Date;
      if (start) extendSelection(cm.doc, start);
      setTimeout(function() {display.input.focus();}, 20);
      e_preventDefault(e);
      break;
    case 3:
      if (captureRightClick) onContextMenu(cm, e);
      else delayBlurEvent(cm);
      break;
    }
  }

  var lastClick, lastDoubleClick;
  function leftButtonDown(cm, e, start) {
    if (ie) setTimeout(bind(ensureFocus, cm), 0);
    else cm.curOp.focus = activeElt();

    var now = +new Date, type;
    if (lastDoubleClick && lastDoubleClick.time > now - 400 && cmp(lastDoubleClick.pos, start) == 0) {
      type = "triple";
    } else if (lastClick && lastClick.time > now - 400 && cmp(lastClick.pos, start) == 0) {
      type = "double";
      lastDoubleClick = {time: now, pos: start};
    } else {
      type = "single";
      lastClick = {time: now, pos: start};
    }

    var sel = cm.doc.sel, modifier = mac ? e.metaKey : e.ctrlKey, contained;
    if (cm.options.dragDrop && dragAndDrop && !cm.isReadOnly() &&
        type == "single" && (contained = sel.contains(start)) > -1 &&
        (cmp((contained = sel.ranges[contained]).from(), start) < 0 || start.xRel > 0) &&
        (cmp(contained.to(), start) > 0 || start.xRel < 0))
      leftButtonStartDrag(cm, e, start, modifier);
    else
      leftButtonSelect(cm, e, start, type, modifier);
  }

  // Start a text drag. When it ends, see if any dragging actually
  // happen, and treat as a click if it didn't.
  function leftButtonStartDrag(cm, e, start, modifier) {
    var display = cm.display, startTime = +new Date;
    var dragEnd = operation(cm, function(e2) {
      if (webkit) display.scroller.draggable = false;
      cm.state.draggingText = false;
      off(document, "mouseup", dragEnd);
      off(display.scroller, "drop", dragEnd);
      if (Math.abs(e.clientX - e2.clientX) + Math.abs(e.clientY - e2.clientY) < 10) {
        e_preventDefault(e2);
        if (!modifier && +new Date - 200 < startTime)
          extendSelection(cm.doc, start);
        // Work around unexplainable focus problem in IE9 (#2127) and Chrome (#3081)
        if (webkit || ie && ie_version == 9)
          setTimeout(function() {document.body.focus(); display.input.focus();}, 20);
        else
          display.input.focus();
      }
    });
    // Let the drag handler handle this.
    if (webkit) display.scroller.draggable = true;
    cm.state.draggingText = dragEnd;
    dragEnd.copy = mac ? e.altKey : e.ctrlKey
    // IE's approach to draggable
    if (display.scroller.dragDrop) display.scroller.dragDrop();
    on(document, "mouseup", dragEnd);
    on(display.scroller, "drop", dragEnd);
  }

  // Normal selection, as opposed to text dragging.
  function leftButtonSelect(cm, e, start, type, addNew) {
    var display = cm.display, doc = cm.doc;
    e_preventDefault(e);

    var ourRange, ourIndex, startSel = doc.sel, ranges = startSel.ranges;
    if (addNew && !e.shiftKey) {
      ourIndex = doc.sel.contains(start);
      if (ourIndex > -1)
        ourRange = ranges[ourIndex];
      else
        ourRange = new Range(start, start);
    } else {
      ourRange = doc.sel.primary();
      ourIndex = doc.sel.primIndex;
    }

    if (chromeOS ? e.shiftKey && e.metaKey : e.altKey) {
      type = "rect";
      if (!addNew) ourRange = new Range(start, start);
      start = posFromMouse(cm, e, true, true);
      ourIndex = -1;
    } else if (type == "double") {
      var word = cm.findWordAt(start);
      if (cm.display.shift || doc.extend)
        ourRange = extendRange(doc, ourRange, word.anchor, word.head);
      else
        ourRange = word;
    } else if (type == "triple") {
      var line = new Range(Pos(start.line, 0), clipPos(doc, Pos(start.line + 1, 0)));
      if (cm.display.shift || doc.extend)
        ourRange = extendRange(doc, ourRange, line.anchor, line.head);
      else
        ourRange = line;
    } else {
      ourRange = extendRange(doc, ourRange, start);
    }

    if (!addNew) {
      ourIndex = 0;
      setSelection(doc, new Selection([ourRange], 0), sel_mouse);
      startSel = doc.sel;
    } else if (ourIndex == -1) {
      ourIndex = ranges.length;
      setSelection(doc, normalizeSelection(ranges.concat([ourRange]), ourIndex),
                   {scroll: false, origin: "*mouse"});
    } else if (ranges.length > 1 && ranges[ourIndex].empty() && type == "single" && !e.shiftKey) {
      setSelection(doc, normalizeSelection(ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0),
                   {scroll: false, origin: "*mouse"});
      startSel = doc.sel;
    } else {
      replaceOneSelection(doc, ourIndex, ourRange, sel_mouse);
    }

    var lastPos = start;
    function extendTo(pos) {
      if (cmp(lastPos, pos) == 0) return;
      lastPos = pos;

      if (type == "rect") {
        var ranges = [], tabSize = cm.options.tabSize;
        var startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize);
        var posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize);
        var left = Math.min(startCol, posCol), right = Math.max(startCol, posCol);
        for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line));
             line <= end; line++) {
          var text = getLine(doc, line).text, leftPos = findColumn(text, left, tabSize);
          if (left == right)
            ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos)));
          else if (text.length > leftPos)
            ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize))));
        }
        if (!ranges.length) ranges.push(new Range(start, start));
        setSelection(doc, normalizeSelection(startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex),
                     {origin: "*mouse", scroll: false});
        cm.scrollIntoView(pos);
      } else {
        var oldRange = ourRange;
        var anchor = oldRange.anchor, head = pos;
        if (type != "single") {
          if (type == "double")
            var range = cm.findWordAt(pos);
          else
            var range = new Range(Pos(pos.line, 0), clipPos(doc, Pos(pos.line + 1, 0)));
          if (cmp(range.anchor, anchor) > 0) {
            head = range.head;
            anchor = minPos(oldRange.from(), range.anchor);
          } else {
            head = range.anchor;
            anchor = maxPos(oldRange.to(), range.head);
          }
        }
        var ranges = startSel.ranges.slice(0);
        ranges[ourIndex] = new Range(clipPos(doc, anchor), head);
        setSelection(doc, normalizeSelection(ranges, ourIndex), sel_mouse);
      }
    }

    var editorSize = display.wrapper.getBoundingClientRect();
    // Used to ensure timeout re-tries don't fire when another extend
    // happened in the meantime (clearTimeout isn't reliable -- at
    // least on Chrome, the timeouts still happen even when cleared,
    // if the clear happens after their scheduled firing time).
    var counter = 0;

    function extend(e) {
      var curCount = ++counter;
      var cur = posFromMouse(cm, e, true, type == "rect");
      if (!cur) return;
      if (cmp(cur, lastPos) != 0) {
        cm.curOp.focus = activeElt();
        extendTo(cur);
        var visible = visibleLines(display, doc);
        if (cur.line >= visible.to || cur.line < visible.from)
          setTimeout(operation(cm, function(){if (counter == curCount) extend(e);}), 150);
      } else {
        var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0;
        if (outside) setTimeout(operation(cm, function() {
          if (counter != curCount) return;
          display.scroller.scrollTop += outside;
          extend(e);
        }), 50);
      }
    }

    function done(e) {
      cm.state.selectingText = false;
      counter = Infinity;
      e_preventDefault(e);
      display.input.focus();
      off(document, "mousemove", move);
      off(document, "mouseup", up);
      doc.history.lastSelOrigin = null;
    }

    var move = operation(cm, function(e) {
      if (!e_button(e)) done(e);
      else extend(e);
    });
    var up = operation(cm, done);
    cm.state.selectingText = up;
    on(document, "mousemove", move);
    on(document, "mouseup", up);
  }

  // Determines whether an event happened in the gutter, and fires the
  // handlers for the corresponding event.
  function gutterEvent(cm, e, type, prevent) {
    try { var mX = e.clientX, mY = e.clientY; }
    catch(e) { return false; }
    if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) return false;
    if (prevent) e_preventDefault(e);

    var display = cm.display;
    var lineBox = display.lineDiv.getBoundingClientRect();

    if (mY > lineBox.bottom || !hasHandler(cm, type)) return e_defaultPrevented(e);
    mY -= lineBox.top - display.viewOffset;

    for (var i = 0; i < cm.options.gutters.length; ++i) {
      var g = display.gutters.childNodes[i];
      if (g && g.getBoundingClientRect().right >= mX) {
        var line = lineAtHeight(cm.doc, mY);
        var gutter = cm.options.gutters[i];
        signal(cm, type, cm, line, gutter, e);
        return e_defaultPrevented(e);
      }
    }
  }

  function clickInGutter(cm, e) {
    return gutterEvent(cm, e, "gutterClick", true);
  }

  // Kludge to work around strange IE behavior where it'll sometimes
  // re-fire a series of drag-related events right after the drop (#1551)
  var lastDrop = 0;

  function onDrop(e) {
    var cm = this;
    clearDragCursor(cm);
    if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e))
      return;
    e_preventDefault(e);
    if (ie) lastDrop = +new Date;
    var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files;
    if (!pos || cm.isReadOnly()) return;
    // Might be a file drop, in which case we simply extract the text
    // and insert it.
    if (files && files.length && window.FileReader && window.File) {
      var n = files.length, text = Array(n), read = 0;
      var loadFile = function(file, i) {
        if (cm.options.allowDropFileTypes &&
            indexOf(cm.options.allowDropFileTypes, file.type) == -1)
          return;

        var reader = new FileReader;
        reader.onload = operation(cm, function() {
          var content = reader.result;
          if (/[\x00-\x08\x0e-\x1f]{2}/.test(content)) content = "";
          text[i] = content;
          if (++read == n) {
            pos = clipPos(cm.doc, pos);
            var change = {from: pos, to: pos,
                          text: cm.doc.splitLines(text.join(cm.doc.lineSeparator())),
                          origin: "paste"};
            makeChange(cm.doc, change);
            setSelectionReplaceHistory(cm.doc, simpleSelection(pos, changeEnd(change)));
          }
        });
        reader.readAsText(file);
      };
      for (var i = 0; i < n; ++i) loadFile(files[i], i);
    } else { // Normal drop
      // Don't do a replace if the drop happened inside of the selected text.
      if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) {
        cm.state.draggingText(e);
        // Ensure the editor is re-focused
        setTimeout(function() {cm.display.input.focus();}, 20);
        return;
      }
      try {
        var text = e.dataTransfer.getData("Text");
        if (text) {
          if (cm.state.draggingText && !cm.state.draggingText.copy)
            var selected = cm.listSelections();
          setSelectionNoUndo(cm.doc, simpleSelection(pos, pos));
          if (selected) for (var i = 0; i < selected.length; ++i)
            replaceRange(cm.doc, "", selected[i].anchor, selected[i].head, "drag");
          cm.replaceSelection(text, "around", "paste");
          cm.display.input.focus();
        }
      }
      catch(e){}
    }
  }

  function onDragStart(cm, e) {
    if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return; }
    if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) return;

    e.dataTransfer.setData("Text", cm.getSelection());
    e.dataTransfer.effectAllowed = "copyMove"

    // Use dummy image instead of default browsers image.
    // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there.
    if (e.dataTransfer.setDragImage && !safari) {
      var img = elt("img", null, null, "position: fixed; left: 0; top: 0;");
      img.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";
      if (presto) {
        img.width = img.height = 1;
        cm.display.wrapper.appendChild(img);
        // Force a relayout, or Opera won't use our image for some obscure reason
        img._top = img.offsetTop;
      }
      e.dataTransfer.setDragImage(img, 0, 0);
      if (presto) img.parentNode.removeChild(img);
    }
  }

  function onDragOver(cm, e) {
    var pos = posFromMouse(cm, e);
    if (!pos) return;
    var frag = document.createDocumentFragment();
    drawSelectionCursor(cm, pos, frag);
    if (!cm.display.dragCursor) {
      cm.display.dragCursor = elt("div", null, "CodeMirror-cursors CodeMirror-dragcursors");
      cm.display.lineSpace.insertBefore(cm.display.dragCursor, cm.display.cursorDiv);
    }
    removeChildrenAndAdd(cm.display.dragCursor, frag);
  }

  function clearDragCursor(cm) {
    if (cm.display.dragCursor) {
      cm.display.lineSpace.removeChild(cm.display.dragCursor);
      cm.display.dragCursor = null;
    }
  }

  // SCROLL EVENTS

  // Sync the scrollable area and scrollbars, ensure the viewport
  // covers the visible area.
  function setScrollTop(cm, val) {
    if (Math.abs(cm.doc.scrollTop - val) < 2) return;
    cm.doc.scrollTop = val;
    if (!gecko) updateDisplaySimple(cm, {top: val});
    if (cm.display.scroller.scrollTop != val) cm.display.scroller.scrollTop = val;
    cm.display.scrollbars.setScrollTop(val);
    if (gecko) updateDisplaySimple(cm);
    startWorker(cm, 100);
  }
  // Sync scroller and scrollbar, ensure the gutter elements are
  // aligned.
  function setScrollLeft(cm, val, isScroller) {
    if (isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) return;
    val = Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth);
    cm.doc.scrollLeft = val;
    alignHorizontally(cm);
    if (cm.display.scroller.scrollLeft != val) cm.display.scroller.scrollLeft = val;
    cm.display.scrollbars.setScrollLeft(val);
  }

  // Since the delta values reported on mouse wheel events are
  // unstandardized between browsers and even browser versions, and
  // generally horribly unpredictable, this code starts by measuring
  // the scroll effect that the first few mouse wheel events have,
  // and, from that, detects the way it can convert deltas to pixel
  // offsets afterwards.
  //
  // The reason we want to know the amount a wheel event will scroll
  // is that it gives us a chance to update the display before the
  // actual scrolling happens, reducing flickering.

  var wheelSamples = 0, wheelPixelsPerUnit = null;
  // Fill in a browser-detected starting value on browsers where we
  // know one. These don't have to be accurate -- the result of them
  // being wrong would just be a slight flicker on the first wheel
  // scroll (if it is large enough).
  if (ie) wheelPixelsPerUnit = -.53;
  else if (gecko) wheelPixelsPerUnit = 15;
  else if (chrome) wheelPixelsPerUnit = -.7;
  else if (safari) wheelPixelsPerUnit = -1/3;

  var wheelEventDelta = function(e) {
    var dx = e.wheelDeltaX, dy = e.wheelDeltaY;
    if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) dx = e.detail;
    if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) dy = e.detail;
    else if (dy == null) dy = e.wheelDelta;
    return {x: dx, y: dy};
  };
  CodeMirror.wheelEventPixels = function(e) {
    var delta = wheelEventDelta(e);
    delta.x *= wheelPixelsPerUnit;
    delta.y *= wheelPixelsPerUnit;
    return delta;
  };

  function onScrollWheel(cm, e) {
    var delta = wheelEventDelta(e), dx = delta.x, dy = delta.y;

    var display = cm.display, scroll = display.scroller;
    // Quit if there's nothing to scroll here
    var canScrollX = scroll.scrollWidth > scroll.clientWidth;
    var canScrollY = scroll.scrollHeight > scroll.clientHeight;
    if (!(dx && canScrollX || dy && canScrollY)) return;

    // Webkit browsers on OS X abort momentum scrolls when the target
    // of the scroll event is removed from the scrollable element.
    // This hack (see related code in patchDisplay) makes sure the
    // element is kept around.
    if (dy && mac && webkit) {
      outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) {
        for (var i = 0; i < view.length; i++) {
          if (view[i].node == cur) {
            cm.display.currentWheelTarget = cur;
            break outer;
          }
        }
      }
    }

    // On some browsers, horizontal scrolling will cause redraws to
    // happen before the gutter has been realigned, causing it to
    // wriggle around in a most unseemly way. When we have an
    // estimated pixels/delta value, we just handle horizontal
    // scrolling entirely here. It'll be slightly off from native, but
    // better than glitching out.
    if (dx && !gecko && !presto && wheelPixelsPerUnit != null) {
      if (dy && canScrollY)
        setScrollTop(cm, Math.max(0, Math.min(scroll.scrollTop + dy * wheelPixelsPerUnit, scroll.scrollHeight - scroll.clientHeight)));
      setScrollLeft(cm, Math.max(0, Math.min(scroll.scrollLeft + dx * wheelPixelsPerUnit, scroll.scrollWidth - scroll.clientWidth)));
      // Only prevent default scrolling if vertical scrolling is
      // actually possible. Otherwise, it causes vertical scroll
      // jitter on OSX trackpads when deltaX is small and deltaY
      // is large (issue #3579)
      if (!dy || (dy && canScrollY))
        e_preventDefault(e);
      display.wheelStartX = null; // Abort measurement, if in progress
      return;
    }

    // 'Project' the visible viewport to cover the area that is being
    // scrolled into view (if we know enough to estimate it).
    if (dy && wheelPixelsPerUnit != null) {
      var pixels = dy * wheelPixelsPerUnit;
      var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight;
      if (pixels < 0) top = Math.max(0, top + pixels - 50);
      else bot = Math.min(cm.doc.height, bot + pixels + 50);
      updateDisplaySimple(cm, {top: top, bottom: bot});
    }

    if (wheelSamples < 20) {
      if (display.wheelStartX == null) {
        display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop;
        display.wheelDX = dx; display.wheelDY = dy;
        setTimeout(function() {
          if (display.wheelStartX == null) return;
          var movedX = scroll.scrollLeft - display.wheelStartX;
          var movedY = scroll.scrollTop - display.wheelStartY;
          var sample = (movedY && display.wheelDY && movedY / display.wheelDY) ||
            (movedX && display.wheelDX && movedX / display.wheelDX);
          display.wheelStartX = display.wheelStartY = null;
          if (!sample) return;
          wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1);
          ++wheelSamples;
        }, 200);
      } else {
        display.wheelDX += dx; display.wheelDY += dy;
      }
    }
  }

  // KEY EVENTS

  // Run a handler that was bound to a key.
  function doHandleBinding(cm, bound, dropShift) {
    if (typeof bound == "string") {
      bound = commands[bound];
      if (!bound) return false;
    }
    // Ensure previous input has been read, so that the handler sees a
    // consistent view of the document
    cm.display.input.ensurePolled();
    var prevShift = cm.display.shift, done = false;
    try {
      if (cm.isReadOnly()) cm.state.suppressEdits = true;
      if (dropShift) cm.display.shift = false;
      done = bound(cm) != Pass;
    } finally {
      cm.display.shift = prevShift;
      cm.state.suppressEdits = false;
    }
    return done;
  }

  function lookupKeyForEditor(cm, name, handle) {
    for (var i = 0; i < cm.state.keyMaps.length; i++) {
      var result = lookupKey(name, cm.state.keyMaps[i], handle, cm);
      if (result) return result;
    }
    return (cm.options.extraKeys && lookupKey(name, cm.options.extraKeys, handle, cm))
      || lookupKey(name, cm.options.keyMap, handle, cm);
  }

  var stopSeq = new Delayed;
  function dispatchKey(cm, name, e, handle) {
    var seq = cm.state.keySeq;
    if (seq) {
      if (isModifierKey(name)) return "handled";
      stopSeq.set(50, function() {
        if (cm.state.keySeq == seq) {
          cm.state.keySeq = null;
          cm.display.input.reset();
        }
      });
      name = seq + " " + name;
    }
    var result = lookupKeyForEditor(cm, name, handle);

    if (result == "multi")
      cm.state.keySeq = name;
    if (result == "handled")
      signalLater(cm, "keyHandled", cm, name, e);

    if (result == "handled" || result == "multi") {
      e_preventDefault(e);
      restartBlink(cm);
    }

    if (seq && !result && /\'$/.test(name)) {
      e_preventDefault(e);
      return true;
    }
    return !!result;
  }

  // Handle a key from the keydown event.
  function handleKeyBinding(cm, e) {
    var name = keyName(e, true);
    if (!name) return false;

    if (e.shiftKey && !cm.state.keySeq) {
      // First try to resolve full name (including 'Shift-'). Failing
      // that, see if there is a cursor-motion command (starting with
      // 'go') bound to the keyname without 'Shift-'.
      return dispatchKey(cm, "Shift-" + name, e, function(b) {return doHandleBinding(cm, b, true);})
          || dispatchKey(cm, name, e, function(b) {
               if (typeof b == "string" ? /^go[A-Z]/.test(b) : b.motion)
                 return doHandleBinding(cm, b);
             });
    } else {
      return dispatchKey(cm, name, e, function(b) { return doHandleBinding(cm, b); });
    }
  }

  // Handle a key from the keypress event
  function handleCharBinding(cm, e, ch) {
    return dispatchKey(cm, "'" + ch + "'", e,
                       function(b) { return doHandleBinding(cm, b, true); });
  }

  var lastStoppedKey = null;
  function onKeyDown(e) {
    var cm = this;
    cm.curOp.focus = activeElt();
    if (signalDOMEvent(cm, e)) return;
    // IE does strange things with escape.
    if (ie && ie_version < 11 && e.keyCode == 27) e.returnValue = false;
    var code = e.keyCode;
    cm.display.shift = code == 16 || e.shiftKey;
    var handled = handleKeyBinding(cm, e);
    if (presto) {
      lastStoppedKey = handled ? code : null;
      // Opera has no cut event... we try to at least catch the key combo
      if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey))
        cm.replaceSelection("", null, "cut");
    }

    // Turn mouse into crosshair when Alt is held on Mac.
    if (code == 18 && !/\bCodeMirror-crosshair\b/.test(cm.display.lineDiv.className))
      showCrossHair(cm);
  }

  function showCrossHair(cm) {
    var lineDiv = cm.display.lineDiv;
    addClass(lineDiv, "CodeMirror-crosshair");

    function up(e) {
      if (e.keyCode == 18 || !e.altKey) {
        rmClass(lineDiv, "CodeMirror-crosshair");
        off(document, "keyup", up);
        off(document, "mouseover", up);
      }
    }
    on(document, "keyup", up);
    on(document, "mouseover", up);
  }

  function onKeyUp(e) {
    if (e.keyCode == 16) this.doc.sel.shift = false;
    signalDOMEvent(this, e);
  }

  function onKeyPress(e) {
    var cm = this;
    if (eventInWidget(cm.display, e) || signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) return;
    var keyCode = e.keyCode, charCode = e.charCode;
    if (presto && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return;}
    if ((presto && (!e.which || e.which < 10)) && handleKeyBinding(cm, e)) return;
    var ch = String.fromCharCode(charCode == null ? keyCode : charCode);
    if (handleCharBinding(cm, e, ch)) return;
    cm.display.input.onKeyPress(e);
  }

  // FOCUS/BLUR EVENTS

  function delayBlurEvent(cm) {
    cm.state.delayingBlurEvent = true;
    setTimeout(function() {
      if (cm.state.delayingBlurEvent) {
        cm.state.delayingBlurEvent = false;
        onBlur(cm);
      }
    }, 100);
  }

  function onFocus(cm) {
    if (cm.state.delayingBlurEvent) cm.state.delayingBlurEvent = false;

    if (cm.options.readOnly == "nocursor") return;
    if (!cm.state.focused) {
      signal(cm, "focus", cm);
      cm.state.focused = true;
      addClass(cm.display.wrapper, "CodeMirror-focused");
      // This test prevents this from firing when a context
      // menu is closed (since the input reset would kill the
      // select-all detection hack)
      if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) {
        cm.display.input.reset();
        if (webkit) setTimeout(function() { cm.display.input.reset(true); }, 20); // Issue #1730
      }
      cm.display.input.receivedFocus();
    }
    restartBlink(cm);
  }
  function onBlur(cm) {
    if (cm.state.delayingBlurEvent) return;

    if (cm.state.focused) {
      signal(cm, "blur", cm);
      cm.state.focused = false;
      rmClass(cm.display.wrapper, "CodeMirror-focused");
    }
    clearInterval(cm.display.blinker);
    setTimeout(function() {if (!cm.state.focused) cm.display.shift = false;}, 150);
  }

  // CONTEXT MENU HANDLING

  // To make the context menu work, we need to briefly unhide the
  // textarea (making it as unobtrusive as possible) to let the
  // right-click take effect on it.
  function onContextMenu(cm, e) {
    if (eventInWidget(cm.display, e) || contextMenuInGutter(cm, e)) return;
    if (signalDOMEvent(cm, e, "contextmenu")) return;
    cm.display.input.onContextMenu(e);
  }

  function contextMenuInGutter(cm, e) {
    if (!hasHandler(cm, "gutterContextMenu")) return false;
    return gutterEvent(cm, e, "gutterContextMenu", false);
  }

  // UPDATING

  // Compute the position of the end of a change (its 'to' property
  // refers to the pre-change end).
  var changeEnd = CodeMirror.changeEnd = function(change) {
    if (!change.text) return change.to;
    return Pos(change.from.line + change.text.length - 1,
               lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0));
  };

  // Adjust a position to refer to the post-change position of the
  // same text, or the end of the change if the change covers it.
  function adjustForChange(pos, change) {
    if (cmp(pos, change.from) < 0) return pos;
    if (cmp(pos, change.to) <= 0) return changeEnd(change);

    var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch;
    if (pos.line == change.to.line) ch += changeEnd(change).ch - change.to.ch;
    return Pos(line, ch);
  }

  function computeSelAfterChange(doc, change) {
    var out = [];
    for (var i = 0; i < doc.sel.ranges.length; i++) {
      var range = doc.sel.ranges[i];
      out.push(new Range(adjustForChange(range.anchor, change),
                         adjustForChange(range.head, change)));
    }
    return normalizeSelection(out, doc.sel.primIndex);
  }

  function offsetPos(pos, old, nw) {
    if (pos.line == old.line)
      return Pos(nw.line, pos.ch - old.ch + nw.ch);
    else
      return Pos(nw.line + (pos.line - old.line), pos.ch);
  }

  // Used by replaceSelections to allow moving the selection to the
  // start or around the replaced test. Hint may be "start" or "around".
  function computeReplacedSel(doc, changes, hint) {
    var out = [];
    var oldPrev = Pos(doc.first, 0), newPrev = oldPrev;
    for (var i = 0; i < changes.length; i++) {
      var change = changes[i];
      var from = offsetPos(change.from, oldPrev, newPrev);
      var to = offsetPos(changeEnd(change), oldPrev, newPrev);
      oldPrev = change.to;
      newPrev = to;
      if (hint == "around") {
        var range = doc.sel.ranges[i], inv = cmp(range.head, range.anchor) < 0;
        out[i] = new Range(inv ? to : from, inv ? from : to);
      } else {
        out[i] = new Range(from, from);
      }
    }
    return new Selection(out, doc.sel.primIndex);
  }

  // Allow "beforeChange" event handlers to influence a change
  function filterChange(doc, change, update) {
    var obj = {
      canceled: false,
      from: change.from,
      to: change.to,
      text: change.text,
      origin: change.origin,
      cancel: function() { this.canceled = true; }
    };
    if (update) obj.update = function(from, to, text, origin) {
      if (from) this.from = clipPos(doc, from);
      if (to) this.to = clipPos(doc, to);
      if (text) this.text = text;
      if (origin !== undefined) this.origin = origin;
    };
    signal(doc, "beforeChange", doc, obj);
    if (doc.cm) signal(doc.cm, "beforeChange", doc.cm, obj);

    if (obj.canceled) return null;
    return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin};
  }

  // Apply a change to a document, and add it to the document's
  // history, and propagating it to all linked documents.
  function makeChange(doc, change, ignoreReadOnly) {
    if (doc.cm) {
      if (!doc.cm.curOp) return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly);
      if (doc.cm.state.suppressEdits) return;
    }

    if (hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange")) {
      change = filterChange(doc, change, true);
      if (!change) return;
    }

    // Possibly split or suppress the update based on the presence
    // of read-only spans in its range.
    var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to);
    if (split) {
      for (var i = split.length - 1; i >= 0; --i)
        makeChangeInner(doc, {from: split[i].from, to: split[i].to, text: i ? [""] : change.text});
    } else {
      makeChangeInner(doc, change);
    }
  }

  function makeChangeInner(doc, change) {
    if (change.text.length == 1 && change.text[0] == "" && cmp(change.from, change.to) == 0) return;
    var selAfter = computeSelAfterChange(doc, change);
    addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN);

    makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change));
    var rebased = [];

    linkedDocs(doc, function(doc, sharedHist) {
      if (!sharedHist && indexOf(rebased, doc.history) == -1) {
        rebaseHist(doc.history, change);
        rebased.push(doc.history);
      }
      makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change));
    });
  }

  // Revert a change stored in a document's history.
  function makeChangeFromHistory(doc, type, allowSelectionOnly) {
    if (doc.cm && doc.cm.state.suppressEdits && !allowSelectionOnly) return;

    var hist = doc.history, event, selAfter = doc.sel;
    var source = type == "undo" ? hist.done : hist.undone, dest = type == "undo" ? hist.undone : hist.done;

    // Verify that there is a useable event (so that ctrl-z won't
    // needlessly clear selection events)
    for (var i = 0; i < source.length; i++) {
      event = source[i];
      if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges)
        break;
    }
    if (i == source.length) return;
    hist.lastOrigin = hist.lastSelOrigin = null;

    for (;;) {
      event = source.pop();
      if (event.ranges) {
        pushSelectionToHistory(event, dest);
        if (allowSelectionOnly && !event.equals(doc.sel)) {
          setSelection(doc, event, {clearRedo: false});
          return;
        }
        selAfter = event;
      }
      else break;
    }

    // Build up a reverse change object to add to the opposite history
    // stack (redo when undoing, and vice versa).
    var antiChanges = [];
    pushSelectionToHistory(selAfter, dest);
    dest.push({changes: antiChanges, generation: hist.generation});
    hist.generation = event.generation || ++hist.maxGeneration;

    var filter = hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange");

    for (var i = event.changes.length - 1; i >= 0; --i) {
      var change = event.changes[i];
      change.origin = type;
      if (filter && !filterChange(doc, change, false)) {
        source.length = 0;
        return;
      }

      antiChanges.push(historyChangeFromChange(doc, change));

      var after = i ? computeSelAfterChange(doc, change) : lst(source);
      makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change));
      if (!i && doc.cm) doc.cm.scrollIntoView({from: change.from, to: changeEnd(change)});
      var rebased = [];

      // Propagate to the linked documents
      linkedDocs(doc, function(doc, sharedHist) {
        if (!sharedHist && indexOf(rebased, doc.history) == -1) {
          rebaseHist(doc.history, change);
          rebased.push(doc.history);
        }
        makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change));
      });
    }
  }

  // Sub-views need their line numbers shifted when text is added
  // above or below them in the parent document.
  function shiftDoc(doc, distance) {
    if (distance == 0) return;
    doc.first += distance;
    doc.sel = new Selection(map(doc.sel.ranges, function(range) {
      return new Range(Pos(range.anchor.line + distance, range.anchor.ch),
                       Pos(range.head.line + distance, range.head.ch));
    }), doc.sel.primIndex);
    if (doc.cm) {
      regChange(doc.cm, doc.first, doc.first - distance, distance);
      for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++)
        regLineChange(doc.cm, l, "gutter");
    }
  }

  // More lower-level change function, handling only a single document
  // (not linked ones).
  function makeChangeSingleDoc(doc, change, selAfter, spans) {
    if (doc.cm && !doc.cm.curOp)
      return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans);

    if (change.to.line < doc.first) {
      shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line));
      return;
    }
    if (change.from.line > doc.lastLine()) return;

    // Clip the change to the size of this doc
    if (change.from.line < doc.first) {
      var shift = change.text.length - 1 - (doc.first - change.from.line);
      shiftDoc(doc, shift);
      change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch),
                text: [lst(change.text)], origin: change.origin};
    }
    var last = doc.lastLine();
    if (change.to.line > last) {
      change = {from: change.from, to: Pos(last, getLine(doc, last).text.length),
                text: [change.text[0]], origin: change.origin};
    }

    change.removed = getBetween(doc, change.from, change.to);

    if (!selAfter) selAfter = computeSelAfterChange(doc, change);
    if (doc.cm) makeChangeSingleDocInEditor(doc.cm, change, spans);
    else updateDoc(doc, change, spans);
    setSelectionNoUndo(doc, selAfter, sel_dontScroll);
  }

  // Handle the interaction of a change to a document with the editor
  // that this document is part of.
  function makeChangeSingleDocInEditor(cm, change, spans) {
    var doc = cm.doc, display = cm.display, from = change.from, to = change.to;

    var recomputeMaxLength = false, checkWidthStart = from.line;
    if (!cm.options.lineWrapping) {
      checkWidthStart = lineNo(visualLine(getLine(doc, from.line)));
      doc.iter(checkWidthStart, to.line + 1, function(line) {
        if (line == display.maxLine) {
          recomputeMaxLength = true;
          return true;
        }
      });
    }

    if (doc.sel.contains(change.from, change.to) > -1)
      signalCursorActivity(cm);

    updateDoc(doc, change, spans, estimateHeight(cm));

    if (!cm.options.lineWrapping) {
      doc.iter(checkWidthStart, from.line + change.text.length, function(line) {
        var len = lineLength(line);
        if (len > display.maxLineLength) {
          display.maxLine = line;
          display.maxLineLength = len;
          display.maxLineChanged = true;
          recomputeMaxLength = false;
        }
      });
      if (recomputeMaxLength) cm.curOp.updateMaxLine = true;
    }

    // Adjust frontier, schedule worker
    doc.frontier = Math.min(doc.frontier, from.line);
    startWorker(cm, 400);

    var lendiff = change.text.length - (to.line - from.line) - 1;
    // Remember that these lines changed, for updating the display
    if (change.full)
      regChange(cm);
    else if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change))
      regLineChange(cm, from.line, "text");
    else
      regChange(cm, from.line, to.line + 1, lendiff);

    var changesHandler = hasHandler(cm, "changes"), changeHandler = hasHandler(cm, "change");
    if (changeHandler || changesHandler) {
      var obj = {
        from: from, to: to,
        text: change.text,
        removed: change.removed,
        origin: change.origin
      };
      if (changeHandler) signalLater(cm, "change", cm, obj);
      if (changesHandler) (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj);
    }
    cm.display.selForContextMenu = null;
  }

  function replaceRange(doc, code, from, to, origin) {
    if (!to) to = from;
    if (cmp(to, from) < 0) { var tmp = to; to = from; from = tmp; }
    if (typeof code == "string") code = doc.splitLines(code);
    makeChange(doc, {from: from, to: to, text: code, origin: origin});
  }

  // SCROLLING THINGS INTO VIEW

  // If an editor sits on the top or bottom of the window, partially
  // scrolled out of view, this ensures that the cursor is visible.
  function maybeScrollWindow(cm, coords) {
    if (signalDOMEvent(cm, "scrollCursorIntoView")) return;

    var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null;
    if (coords.top + box.top < 0) doScroll = true;
    else if (coords.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) doScroll = false;
    if (doScroll != null && !phantom) {
      var scrollNode = elt("div", "\u200b", null, "position: absolute; top: " +
                           (coords.top - display.viewOffset - paddingTop(cm.display)) + "px; height: " +
                           (coords.bottom - coords.top + scrollGap(cm) + display.barHeight) + "px; left: " +
                           coords.left + "px; width: 2px;");
      cm.display.lineSpace.appendChild(scrollNode);
      scrollNode.scrollIntoView(doScroll);
      cm.display.lineSpace.removeChild(scrollNode);
    }
  }

  // Scroll a given position into view (immediately), verifying that
  // it actually became visible (as line heights are accurately
  // measured, the position of something may 'drift' during drawing).
  function scrollPosIntoView(cm, pos, end, margin) {
    if (margin == null) margin = 0;
    for (var limit = 0; limit < 5; limit++) {
      var changed = false, coords = cursorCoords(cm, pos);
      var endCoords = !end || end == pos ? coords : cursorCoords(cm, end);
      var scrollPos = calculateScrollPos(cm, Math.min(coords.left, endCoords.left),
                                         Math.min(coords.top, endCoords.top) - margin,
                                         Math.max(coords.left, endCoords.left),
                                         Math.max(coords.bottom, endCoords.bottom) + margin);
      var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft;
      if (scrollPos.scrollTop != null) {
        setScrollTop(cm, scrollPos.scrollTop);
        if (Math.abs(cm.doc.scrollTop - startTop) > 1) changed = true;
      }
      if (scrollPos.scrollLeft != null) {
        setScrollLeft(cm, scrollPos.scrollLeft);
        if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) changed = true;
      }
      if (!changed) break;
    }
    return coords;
  }

  // Scroll a given set of coordinates into view (immediately).
  function scrollIntoView(cm, x1, y1, x2, y2) {
    var scrollPos = calculateScrollPos(cm, x1, y1, x2, y2);
    if (scrollPos.scrollTop != null) setScrollTop(cm, scrollPos.scrollTop);
    if (scrollPos.scrollLeft != null) setScrollLeft(cm, scrollPos.scrollLeft);
  }

  // Calculate a new scroll position needed to scroll the given
  // rectangle into view. Returns an object with scrollTop and
  // scrollLeft properties. When these are undefined, the
  // vertical/horizontal position does not need to be adjusted.
  function calculateScrollPos(cm, x1, y1, x2, y2) {
    var display = cm.display, snapMargin = textHeight(cm.display);
    if (y1 < 0) y1 = 0;
    var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop;
    var screen = displayHeight(cm), result = {};
    if (y2 - y1 > screen) y2 = y1 + screen;
    var docBottom = cm.doc.height + paddingVert(display);
    var atTop = y1 < snapMargin, atBottom = y2 > docBottom - snapMargin;
    if (y1 < screentop) {
      result.scrollTop = atTop ? 0 : y1;
    } else if (y2 > screentop + screen) {
      var newTop = Math.min(y1, (atBottom ? docBottom : y2) - screen);
      if (newTop != screentop) result.scrollTop = newTop;
    }

    var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft;
    var screenw = displayWidth(cm) - (cm.options.fixedGutter ? display.gutters.offsetWidth : 0);
    var tooWide = x2 - x1 > screenw;
    if (tooWide) x2 = x1 + screenw;
    if (x1 < 10)
      result.scrollLeft = 0;
    else if (x1 < screenleft)
      result.scrollLeft = Math.max(0, x1 - (tooWide ? 0 : 10));
    else if (x2 > screenw + screenleft - 3)
      result.scrollLeft = x2 + (tooWide ? 0 : 10) - screenw;
    return result;
  }

  // Store a relative adjustment to the scroll position in the current
  // operation (to be applied when the operation finishes).
  function addToScrollPos(cm, left, top) {
    if (left != null || top != null) resolveScrollToPos(cm);
    if (left != null)
      cm.curOp.scrollLeft = (cm.curOp.scrollLeft == null ? cm.doc.scrollLeft : cm.curOp.scrollLeft) + left;
    if (top != null)
      cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top;
  }

  // Make sure that at the end of the operation the current cursor is
  // shown.
  function ensureCursorVisible(cm) {
    resolveScrollToPos(cm);
    var cur = cm.getCursor(), from = cur, to = cur;
    if (!cm.options.lineWrapping) {
      from = cur.ch ? Pos(cur.line, cur.ch - 1) : cur;
      to = Pos(cur.line, cur.ch + 1);
    }
    cm.curOp.scrollToPos = {from: from, to: to, margin: cm.options.cursorScrollMargin, isCursor: true};
  }

  // When an operation has its scrollToPos property set, and another
  // scroll action is applied before the end of the operation, this
  // 'simulates' scrolling that position into view in a cheap way, so
  // that the effect of intermediate scroll commands is not ignored.
  function resolveScrollToPos(cm) {
    var range = cm.curOp.scrollToPos;
    if (range) {
      cm.curOp.scrollToPos = null;
      var from = estimateCoords(cm, range.from), to = estimateCoords(cm, range.to);
      var sPos = calculateScrollPos(cm, Math.min(from.left, to.left),
                                    Math.min(from.top, to.top) - range.margin,
                                    Math.max(from.right, to.right),
                                    Math.max(from.bottom, to.bottom) + range.margin);
      cm.scrollTo(sPos.scrollLeft, sPos.scrollTop);
    }
  }

  // API UTILITIES

  // Indent the given line. The how parameter can be "smart",
  // "add"/null, "subtract", or "prev". When aggressive is false
  // (typically set to true for forced single-line indents), empty
  // lines are not indented, and places where the mode returns Pass
  // are left alone.
  function indentLine(cm, n, how, aggressive) {
    var doc = cm.doc, state;
    if (how == null) how = "add";
    if (how == "smart") {
      // Fall back to "prev" when the mode doesn't have an indentation
      // method.
      if (!doc.mode.indent) how = "prev";
      else state = getStateBefore(cm, n);
    }

    var tabSize = cm.options.tabSize;
    var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize);
    if (line.stateAfter) line.stateAfter = null;
    var curSpaceString = line.text.match(/^\s*/)[0], indentation;
    if (!aggressive && !/\S/.test(line.text)) {
      indentation = 0;
      how = "not";
    } else if (how == "smart") {
      indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text);
      if (indentation == Pass || indentation > 150) {
        if (!aggressive) return;
        how = "prev";
      }
    }
    if (how == "prev") {
      if (n > doc.first) indentation = countColumn(getLine(doc, n-1).text, null, tabSize);
      else indentation = 0;
    } else if (how == "add") {
      indentation = curSpace + cm.options.indentUnit;
    } else if (how == "subtract") {
      indentation = curSpace - cm.options.indentUnit;
    } else if (typeof how == "number") {
      indentation = curSpace + how;
    }
    indentation = Math.max(0, indentation);

    var indentString = "", pos = 0;
    if (cm.options.indentWithTabs)
      for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += "\t";}
    if (pos < indentation) indentString += spaceStr(indentation - pos);

    if (indentString != curSpaceString) {
      replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), "+input");
      line.stateAfter = null;
      return true;
    } else {
      // Ensure that, if the cursor was in the whitespace at the start
      // of the line, it is moved to the end of that space.
      for (var i = 0; i < doc.sel.ranges.length; i++) {
        var range = doc.sel.ranges[i];
        if (range.head.line == n && range.head.ch < curSpaceString.length) {
          var pos = Pos(n, curSpaceString.length);
          replaceOneSelection(doc, i, new Range(pos, pos));
          break;
        }
      }
    }
  }

  // Utility for applying a change to a line by handle or number,
  // returning the number and optionally registering the line as
  // changed.
  function changeLine(doc, handle, changeType, op) {
    var no = handle, line = handle;
    if (typeof handle == "number") line = getLine(doc, clipLine(doc, handle));
    else no = lineNo(handle);
    if (no == null) return null;
    if (op(line, no) && doc.cm) regLineChange(doc.cm, no, changeType);
    return line;
  }

  // Helper for deleting text near the selection(s), used to implement
  // backspace, delete, and similar functionality.
  function deleteNearSelection(cm, compute) {
    var ranges = cm.doc.sel.ranges, kill = [];
    // Build up a set of ranges to kill first, merging overlapping
    // ranges.
    for (var i = 0; i < ranges.length; i++) {
      var toKill = compute(ranges[i]);
      while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) {
        var replaced = kill.pop();
        if (cmp(replaced.from, toKill.from) < 0) {
          toKill.from = replaced.from;
          break;
        }
      }
      kill.push(toKill);
    }
    // Next, remove those actual ranges.
    runInOp(cm, function() {
      for (var i = kill.length - 1; i >= 0; i--)
        replaceRange(cm.doc, "", kill[i].from, kill[i].to, "+delete");
      ensureCursorVisible(cm);
    });
  }

  // Used for horizontal relative motion. Dir is -1 or 1 (left or
  // right), unit can be "char", "column" (like char, but doesn't
  // cross line boundaries), "word" (across next word), or "group" (to
  // the start of next group of word or non-word-non-whitespace
  // chars). The visually param controls whether, in right-to-left
  // text, direction 1 means to move towards the next index in the
  // string, or towards the character to the right of the current
  // position. The resulting position will have a hitSide=true
  // property if it reached the end of the document.
  function findPosH(doc, pos, dir, unit, visually) {
    var line = pos.line, ch = pos.ch, origDir = dir;
    var lineObj = getLine(doc, line);
    function findNextLine() {
      var l = line + dir;
      if (l < doc.first || l >= doc.first + doc.size) return false
      line = l;
      return lineObj = getLine(doc, l);
    }
    function moveOnce(boundToLine) {
      var next = (visually ? moveVisually : moveLogically)(lineObj, ch, dir, true);
      if (next == null) {
        if (!boundToLine && findNextLine()) {
          if (visually) ch = (dir < 0 ? lineRight : lineLeft)(lineObj);
          else ch = dir < 0 ? lineObj.text.length : 0;
        } else return false
      } else ch = next;
      return true;
    }

    if (unit == "char") {
      moveOnce()
    } else if (unit == "column") {
      moveOnce(true)
    } else if (unit == "word" || unit == "group") {
      var sawType = null, group = unit == "group";
      var helper = doc.cm && doc.cm.getHelper(pos, "wordChars");
      for (var first = true;; first = false) {
        if (dir < 0 && !moveOnce(!first)) break;
        var cur = lineObj.text.charAt(ch) || "\n";
        var type = isWordChar(cur, helper) ? "w"
          : group && cur == "\n" ? "n"
          : !group || /\s/.test(cur) ? null
          : "p";
        if (group && !first && !type) type = "s";
        if (sawType && sawType != type) {
          if (dir < 0) {dir = 1; moveOnce();}
          break;
        }

        if (type) sawType = type;
        if (dir > 0 && !moveOnce(!first)) break;
      }
    }
    var result = skipAtomic(doc, Pos(line, ch), pos, origDir, true);
    if (!cmp(pos, result)) result.hitSide = true;
    return result;
  }

  // For relative vertical movement. Dir may be -1 or 1. Unit can be
  // "page" or "line". The resulting position will have a hitSide=true
  // property if it reached the end of the document.
  function findPosV(cm, pos, dir, unit) {
    var doc = cm.doc, x = pos.left, y;
    if (unit == "page") {
      var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight);
      y = pos.top + dir * (pageSize - (dir < 0 ? 1.5 : .5) * textHeight(cm.display));
    } else if (unit == "line") {
      y = dir > 0 ? pos.bottom + 3 : pos.top - 3;
    }
    for (;;) {
      var target = coordsChar(cm, x, y);
      if (!target.outside) break;
      if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break; }
      y += dir * 5;
    }
    return target;
  }

  // EDITOR METHODS

  // The publicly visible API. Note that methodOp(f) means
  // 'wrap f in an operation, performed on its `this` parameter'.

  // This is not the complete set of editor methods. Most of the
  // methods defined on the Doc type are also injected into
  // CodeMirror.prototype, for backwards compatibility and
  // convenience.

  CodeMirror.prototype = {
    constructor: CodeMirror,
    focus: function(){window.focus(); this.display.input.focus();},

    setOption: function(option, value) {
      var options = this.options, old = options[option];
      if (options[option] == value && option != "mode") return;
      options[option] = value;
      if (optionHandlers.hasOwnProperty(option))
        operation(this, optionHandlers[option])(this, value, old);
    },

    getOption: function(option) {return this.options[option];},
    getDoc: function() {return this.doc;},

    addKeyMap: function(map, bottom) {
      this.state.keyMaps[bottom ? "push" : "unshift"](getKeyMap(map));
    },
    removeKeyMap: function(map) {
      var maps = this.state.keyMaps;
      for (var i = 0; i < maps.length; ++i)
        if (maps[i] == map || maps[i].name == map) {
          maps.splice(i, 1);
          return true;
        }
    },

    addOverlay: methodOp(function(spec, options) {
      var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec);
      if (mode.startState) throw new Error("Overlays may not be stateful.");
      insertSorted(this.state.overlays,
                   {mode: mode, modeSpec: spec, opaque: options && options.opaque,
                    priority: (options && options.priority) || 0},
                   function(overlay) { return overlay.priority })
      this.state.modeGen++;
      regChange(this);
    }),
    removeOverlay: methodOp(function(spec) {
      var overlays = this.state.overlays;
      for (var i = 0; i < overlays.length; ++i) {
        var cur = overlays[i].modeSpec;
        if (cur == spec || typeof spec == "string" && cur.name == spec) {
          overlays.splice(i, 1);
          this.state.modeGen++;
          regChange(this);
          return;
        }
      }
    }),

    indentLine: methodOp(function(n, dir, aggressive) {
      if (typeof dir != "string" && typeof dir != "number") {
        if (dir == null) dir = this.options.smartIndent ? "smart" : "prev";
        else dir = dir ? "add" : "subtract";
      }
      if (isLine(this.doc, n)) indentLine(this, n, dir, aggressive);
    }),
    indentSelection: methodOp(function(how) {
      var ranges = this.doc.sel.ranges, end = -1;
      for (var i = 0; i < ranges.length; i++) {
        var range = ranges[i];
        if (!range.empty()) {
          var from = range.from(), to = range.to();
          var start = Math.max(end, from.line);
          end = Math.min(this.lastLine(), to.line - (to.ch ? 0 : 1)) + 1;
          for (var j = start; j < end; ++j)
            indentLine(this, j, how);
          var newRanges = this.doc.sel.ranges;
          if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i].from().ch > 0)
            replaceOneSelection(this.doc, i, new Range(from, newRanges[i].to()), sel_dontScroll);
        } else if (range.head.line > end) {
          indentLine(this, range.head.line, how, true);
          end = range.head.line;
          if (i == this.doc.sel.primIndex) ensureCursorVisible(this);
        }
      }
    }),

    // Fetch the parser token for a given character. Useful for hacks
    // that want to inspect the mode state (say, for completion).
    getTokenAt: function(pos, precise) {
      return takeToken(this, pos, precise);
    },

    getLineTokens: function(line, precise) {
      return takeToken(this, Pos(line), precise, true);
    },

    getTokenTypeAt: function(pos) {
      pos = clipPos(this.doc, pos);
      var styles = getLineStyles(this, getLine(this.doc, pos.line));
      var before = 0, after = (styles.length - 1) / 2, ch = pos.ch;
      var type;
      if (ch == 0) type = styles[2];
      else for (;;) {
        var mid = (before + after) >> 1;
        if ((mid ? styles[mid * 2 - 1] : 0) >= ch) after = mid;
        else if (styles[mid * 2 + 1] < ch) before = mid + 1;
        else { type = styles[mid * 2 + 2]; break; }
      }
      var cut = type ? type.indexOf("cm-overlay ") : -1;
      return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1);
    },

    getModeAt: function(pos) {
      var mode = this.doc.mode;
      if (!mode.innerMode) return mode;
      return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode;
    },

    getHelper: function(pos, type) {
      return this.getHelpers(pos, type)[0];
    },

    getHelpers: function(pos, type) {
      var found = [];
      if (!helpers.hasOwnProperty(type)) return found;
      var help = helpers[type], mode = this.getModeAt(pos);
      if (typeof mode[type] == "string") {
        if (help[mode[type]]) found.push(help[mode[type]]);
      } else if (mode[type]) {
        for (var i = 0; i < mode[type].length; i++) {
          var val = help[mode[type][i]];
          if (val) found.push(val);
        }
      } else if (mode.helperType && help[mode.helperType]) {
        found.push(help[mode.helperType]);
      } else if (help[mode.name]) {
        found.push(help[mode.name]);
      }
      for (var i = 0; i < help._global.length; i++) {
        var cur = help._global[i];
        if (cur.pred(mode, this) && indexOf(found, cur.val) == -1)
          found.push(cur.val);
      }
      return found;
    },

    getStateAfter: function(line, precise) {
      var doc = this.doc;
      line = clipLine(doc, line == null ? doc.first + doc.size - 1: line);
      return getStateBefore(this, line + 1, precise);
    },

    cursorCoords: function(start, mode) {
      var pos, range = this.doc.sel.primary();
      if (start == null) pos = range.head;
      else if (typeof start == "object") pos = clipPos(this.doc, start);
      else pos = start ? range.from() : range.to();
      return cursorCoords(this, pos, mode || "page");
    },

    charCoords: function(pos, mode) {
      return charCoords(this, clipPos(this.doc, pos), mode || "page");
    },

    coordsChar: function(coords, mode) {
      coords = fromCoordSystem(this, coords, mode || "page");
      return coordsChar(this, coords.left, coords.top);
    },

    lineAtHeight: function(height, mode) {
      height = fromCoordSystem(this, {top: height, left: 0}, mode || "page").top;
      return lineAtHeight(this.doc, height + this.display.viewOffset);
    },
    heightAtLine: function(line, mode) {
      var end = false, lineObj;
      if (typeof line == "number") {
        var last = this.doc.first + this.doc.size - 1;
        if (line < this.doc.first) line = this.doc.first;
        else if (line > last) { line = last; end = true; }
        lineObj = getLine(this.doc, line);
      } else {
        lineObj = line;
      }
      return intoCoordSystem(this, lineObj, {top: 0, left: 0}, mode || "page").top +
        (end ? this.doc.height - heightAtLine(lineObj) : 0);
    },

    defaultTextHeight: function() { return textHeight(this.display); },
    defaultCharWidth: function() { return charWidth(this.display); },

    setGutterMarker: methodOp(function(line, gutterID, value) {
      return changeLine(this.doc, line, "gutter", function(line) {
        var markers = line.gutterMarkers || (line.gutterMarkers = {});
        markers[gutterID] = value;
        if (!value && isEmpty(markers)) line.gutterMarkers = null;
        return true;
      });
    }),

    clearGutter: methodOp(function(gutterID) {
      var cm = this, doc = cm.doc, i = doc.first;
      doc.iter(function(line) {
        if (line.gutterMarkers && line.gutterMarkers[gutterID]) {
          line.gutterMarkers[gutterID] = null;
          regLineChange(cm, i, "gutter");
          if (isEmpty(line.gutterMarkers)) line.gutterMarkers = null;
        }
        ++i;
      });
    }),

    lineInfo: function(line) {
      if (typeof line == "number") {
        if (!isLine(this.doc, line)) return null;
        var n = line;
        line = getLine(this.doc, line);
        if (!line) return null;
      } else {
        var n = lineNo(line);
        if (n == null) return null;
      }
      return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers,
              textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass,
              widgets: line.widgets};
    },

    getViewport: function() { return {from: this.display.viewFrom, to: this.display.viewTo};},

    addWidget: function(pos, node, scroll, vert, horiz) {
      var display = this.display;
      pos = cursorCoords(this, clipPos(this.doc, pos));
      var top = pos.bottom, left = pos.left;
      node.style.position = "absolute";
      node.setAttribute("cm-ignore-events", "true");
      this.display.input.setUneditable(node);
      display.sizer.appendChild(node);
      if (vert == "over") {
        top = pos.top;
      } else if (vert == "above" || vert == "near") {
        var vspace = Math.max(display.wrapper.clientHeight, this.doc.height),
        hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth);
        // Default to positioning above (if specified and possible); otherwise default to positioning below
        if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight)
          top = pos.top - node.offsetHeight;
        else if (pos.bottom + node.offsetHeight <= vspace)
          top = pos.bottom;
        if (left + node.offsetWidth > hspace)
          left = hspace - node.offsetWidth;
      }
      node.style.top = top + "px";
      node.style.left = node.style.right = "";
      if (horiz == "right") {
        left = display.sizer.clientWidth - node.offsetWidth;
        node.style.right = "0px";
      } else {
        if (horiz == "left") left = 0;
        else if (horiz == "middle") left = (display.sizer.clientWidth - node.offsetWidth) / 2;
        node.style.left = left + "px";
      }
      if (scroll)
        scrollIntoView(this, left, top, left + node.offsetWidth, top + node.offsetHeight);
    },

    triggerOnKeyDown: methodOp(onKeyDown),
    triggerOnKeyPress: methodOp(onKeyPress),
    triggerOnKeyUp: onKeyUp,

    execCommand: function(cmd) {
      if (commands.hasOwnProperty(cmd))
        return commands[cmd].call(null, this);
    },

    triggerElectric: methodOp(function(text) { triggerElectric(this, text); }),

    findPosH: function(from, amount, unit, visually) {
      var dir = 1;
      if (amount < 0) { dir = -1; amount = -amount; }
      for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) {
        cur = findPosH(this.doc, cur, dir, unit, visually);
        if (cur.hitSide) break;
      }
      return cur;
    },

    moveH: methodOp(function(dir, unit) {
      var cm = this;
      cm.extendSelectionsBy(function(range) {
        if (cm.display.shift || cm.doc.extend || range.empty())
          return findPosH(cm.doc, range.head, dir, unit, cm.options.rtlMoveVisually);
        else
          return dir < 0 ? range.from() : range.to();
      }, sel_move);
    }),

    deleteH: methodOp(function(dir, unit) {
      var sel = this.doc.sel, doc = this.doc;
      if (sel.somethingSelected())
        doc.replaceSelection("", null, "+delete");
      else
        deleteNearSelection(this, function(range) {
          var other = findPosH(doc, range.head, dir, unit, false);
          return dir < 0 ? {from: other, to: range.head} : {from: range.head, to: other};
        });
    }),

    findPosV: function(from, amount, unit, goalColumn) {
      var dir = 1, x = goalColumn;
      if (amount < 0) { dir = -1; amount = -amount; }
      for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) {
        var coords = cursorCoords(this, cur, "div");
        if (x == null) x = coords.left;
        else coords.left = x;
        cur = findPosV(this, coords, dir, unit);
        if (cur.hitSide) break;
      }
      return cur;
    },

    moveV: methodOp(function(dir, unit) {
      var cm = this, doc = this.doc, goals = [];
      var collapse = !cm.display.shift && !doc.extend && doc.sel.somethingSelected();
      doc.extendSelectionsBy(function(range) {
        if (collapse)
          return dir < 0 ? range.from() : range.to();
        var headPos = cursorCoords(cm, range.head, "div");
        if (range.goalColumn != null) headPos.left = range.goalColumn;
        goals.push(headPos.left);
        var pos = findPosV(cm, headPos, dir, unit);
        if (unit == "page" && range == doc.sel.primary())
          addToScrollPos(cm, null, charCoords(cm, pos, "div").top - headPos.top);
        return pos;
      }, sel_move);
      if (goals.length) for (var i = 0; i < doc.sel.ranges.length; i++)
        doc.sel.ranges[i].goalColumn = goals[i];
    }),

    // Find the word at the given position (as returned by coordsChar).
    findWordAt: function(pos) {
      var doc = this.doc, line = getLine(doc, pos.line).text;
      var start = pos.ch, end = pos.ch;
      if (line) {
        var helper = this.getHelper(pos, "wordChars");
        if ((pos.xRel < 0 || end == line.length) && start) --start; else ++end;
        var startChar = line.charAt(start);
        var check = isWordChar(startChar, helper)
          ? function(ch) { return isWordChar(ch, helper); }
          : /\s/.test(startChar) ? function(ch) {return /\s/.test(ch);}
          : function(ch) {return !/\s/.test(ch) && !isWordChar(ch);};
        while (start > 0 && check(line.charAt(start - 1))) --start;
        while (end < line.length && check(line.charAt(end))) ++end;
      }
      return new Range(Pos(pos.line, start), Pos(pos.line, end));
    },

    toggleOverwrite: function(value) {
      if (value != null && value == this.state.overwrite) return;
      if (this.state.overwrite = !this.state.overwrite)
        addClass(this.display.cursorDiv, "CodeMirror-overwrite");
      else
        rmClass(this.display.cursorDiv, "CodeMirror-overwrite");

      signal(this, "overwriteToggle", this, this.state.overwrite);
    },
    hasFocus: function() { return this.display.input.getField() == activeElt(); },
    isReadOnly: function() { return !!(this.options.readOnly || this.doc.cantEdit); },

    scrollTo: methodOp(function(x, y) {
      if (x != null || y != null) resolveScrollToPos(this);
      if (x != null) this.curOp.scrollLeft = x;
      if (y != null) this.curOp.scrollTop = y;
    }),
    getScrollInfo: function() {
      var scroller = this.display.scroller;
      return {left: scroller.scrollLeft, top: scroller.scrollTop,
              height: scroller.scrollHeight - scrollGap(this) - this.display.barHeight,
              width: scroller.scrollWidth - scrollGap(this) - this.display.barWidth,
              clientHeight: displayHeight(this), clientWidth: displayWidth(this)};
    },

    scrollIntoView: methodOp(function(range, margin) {
      if (range == null) {
        range = {from: this.doc.sel.primary().head, to: null};
        if (margin == null) margin = this.options.cursorScrollMargin;
      } else if (typeof range == "number") {
        range = {from: Pos(range, 0), to: null};
      } else if (range.from == null) {
        range = {from: range, to: null};
      }
      if (!range.to) range.to = range.from;
      range.margin = margin || 0;

      if (range.from.line != null) {
        resolveScrollToPos(this);
        this.curOp.scrollToPos = range;
      } else {
        var sPos = calculateScrollPos(this, Math.min(range.from.left, range.to.left),
                                      Math.min(range.from.top, range.to.top) - range.margin,
                                      Math.max(range.from.right, range.to.right),
                                      Math.max(range.from.bottom, range.to.bottom) + range.margin);
        this.scrollTo(sPos.scrollLeft, sPos.scrollTop);
      }
    }),

    setSize: methodOp(function(width, height) {
      var cm = this;
      function interpret(val) {
        return typeof val == "number" || /^\d+$/.test(String(val)) ? val + "px" : val;
      }
      if (width != null) cm.display.wrapper.style.width = interpret(width);
      if (height != null) cm.display.wrapper.style.height = interpret(height);
      if (cm.options.lineWrapping) clearLineMeasurementCache(this);
      var lineNo = cm.display.viewFrom;
      cm.doc.iter(lineNo, cm.display.viewTo, function(line) {
        if (line.widgets) for (var i = 0; i < line.widgets.length; i++)
          if (line.widgets[i].noHScroll) { regLineChange(cm, lineNo, "widget"); break; }
        ++lineNo;
      });
      cm.curOp.forceUpdate = true;
      signal(cm, "refresh", this);
    }),

    operation: function(f){return runInOp(this, f);},

    refresh: methodOp(function() {
      var oldHeight = this.display.cachedTextHeight;
      regChange(this);
      this.curOp.forceUpdate = true;
      clearCaches(this);
      this.scrollTo(this.doc.scrollLeft, this.doc.scrollTop);
      updateGutterSpace(this);
      if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5)
        estimateLineHeights(this);
      signal(this, "refresh", this);
    }),

    swapDoc: methodOp(function(doc) {
      var old = this.doc;
      old.cm = null;
      attachDoc(this, doc);
      clearCaches(this);
      this.display.input.reset();
      this.scrollTo(doc.scrollLeft, doc.scrollTop);
      this.curOp.forceScroll = true;
      signalLater(this, "swapDoc", this, old);
      return old;
    }),

    getInputField: function(){return this.display.input.getField();},
    getWrapperElement: function(){return this.display.wrapper;},
    getScrollerElement: function(){return this.display.scroller;},
    getGutterElement: function(){return this.display.gutters;}
  };
  eventMixin(CodeMirror);

  // OPTION DEFAULTS

  // The default configuration options.
  var defaults = CodeMirror.defaults = {};
  // Functions to run when options are changed.
  var optionHandlers = CodeMirror.optionHandlers = {};

  function option(name, deflt, handle, notOnInit) {
    CodeMirror.defaults[name] = deflt;
    if (handle) optionHandlers[name] =
      notOnInit ? function(cm, val, old) {if (old != Init) handle(cm, val, old);} : handle;
  }

  // Passed to option handlers when there is no old value.
  var Init = CodeMirror.Init = {toString: function(){return "CodeMirror.Init";}};

  // These two are, on init, called from the constructor because they
  // have to be initialized before the editor can start at all.
  option("value", "", function(cm, val) {
    cm.setValue(val);
  }, true);
  option("mode", null, function(cm, val) {
    cm.doc.modeOption = val;
    loadMode(cm);
  }, true);

  option("indentUnit", 2, loadMode, true);
  option("indentWithTabs", false);
  option("smartIndent", true);
  option("tabSize", 4, function(cm) {
    resetModeState(cm);
    clearCaches(cm);
    regChange(cm);
  }, true);
  option("lineSeparator", null, function(cm, val) {
    cm.doc.lineSep = val;
    if (!val) return;
    var newBreaks = [], lineNo = cm.doc.first;
    cm.doc.iter(function(line) {
      for (var pos = 0;;) {
        var found = line.text.indexOf(val, pos);
        if (found == -1) break;
        pos = found + val.length;
        newBreaks.push(Pos(lineNo, found));
      }
      lineNo++;
    });
    for (var i = newBreaks.length - 1; i >= 0; i--)
      replaceRange(cm.doc, val, newBreaks[i], Pos(newBreaks[i].line, newBreaks[i].ch + val.length))
  });
  option("specialChars", /[\u0000-\u001f\u007f\u00ad\u200b-\u200f\u2028\u2029\ufeff]/g, function(cm, val, old) {
    cm.state.specialChars = new RegExp(val.source + (val.test("\t") ? "" : "|\t"), "g");
    if (old != CodeMirror.Init) cm.refresh();
  });
  option("specialCharPlaceholder", defaultSpecialCharPlaceholder, function(cm) {cm.refresh();}, true);
  option("electricChars", true);
  option("inputStyle", mobile ? "contenteditable" : "textarea", function() {
    throw new Error("inputStyle can not (yet) be changed in a running editor"); // FIXME
  }, true);
  option("spellcheck", false, function(cm, val) {
    cm.getInputField().spellcheck = val
  }, true);
  option("rtlMoveVisually", !windows);
  option("wholeLineUpdateBefore", true);

  option("theme", "default", function(cm) {
    themeChanged(cm);
    guttersChanged(cm);
  }, true);
  option("keyMap", "default", function(cm, val, old) {
    var next = getKeyMap(val);
    var prev = old != CodeMirror.Init && getKeyMap(old);
    if (prev && prev.detach) prev.detach(cm, next);
    if (next.attach) next.attach(cm, prev || null);
  });
  option("extraKeys", null);

  option("lineWrapping", false, wrappingChanged, true);
  option("gutters", [], function(cm) {
    setGuttersForLineNumbers(cm.options);
    guttersChanged(cm);
  }, true);
  option("fixedGutter", true, function(cm, val) {
    cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + "px" : "0";
    cm.refresh();
  }, true);
  option("coverGutterNextToScrollbar", false, function(cm) {updateScrollbars(cm);}, true);
  option("scrollbarStyle", "native", function(cm) {
    initScrollbars(cm);
    updateScrollbars(cm);
    cm.display.scrollbars.setScrollTop(cm.doc.scrollTop);
    cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft);
  }, true);
  option("lineNumbers", false, function(cm) {
    setGuttersForLineNumbers(cm.options);
    guttersChanged(cm);
  }, true);
  option("firstLineNumber", 1, guttersChanged, true);
  option("lineNumberFormatter", function(integer) {return integer;}, guttersChanged, true);
  option("showCursorWhenSelecting", false, updateSelection, true);

  option("resetSelectionOnContextMenu", true);
  option("lineWiseCopyCut", true);

  option("readOnly", false, function(cm, val) {
    if (val == "nocursor") {
      onBlur(cm);
      cm.display.input.blur();
      cm.display.disabled = true;
    } else {
      cm.display.disabled = false;
    }
    cm.display.input.readOnlyChanged(val)
  });
  option("disableInput", false, function(cm, val) {if (!val) cm.display.input.reset();}, true);
  option("dragDrop", true, dragDropChanged);
  option("allowDropFileTypes", null);

  option("cursorBlinkRate", 530);
  option("cursorScrollMargin", 0);
  option("cursorHeight", 1, updateSelection, true);
  option("singleCursorHeightPerLine", true, updateSelection, true);
  option("workTime", 100);
  option("workDelay", 100);
  option("flattenSpans", true, resetModeState, true);
  option("addModeClass", false, resetModeState, true);
  option("pollInterval", 100);
  option("undoDepth", 200, function(cm, val){cm.doc.history.undoDepth = val;});
  option("historyEventDelay", 1250);
  option("viewportMargin", 10, function(cm){cm.refresh();}, true);
  option("maxHighlightLength", 10000, resetModeState, true);
  option("moveInputWithCursor", true, function(cm, val) {
    if (!val) cm.display.input.resetPosition();
  });

  option("tabindex", null, function(cm, val) {
    cm.display.input.getField().tabIndex = val || "";
  });
  option("autofocus", null);

  // MODE DEFINITION AND QUERYING

  // Known modes, by name and by MIME
  var modes = CodeMirror.modes = {}, mimeModes = CodeMirror.mimeModes = {};

  // Extra arguments are stored as the mode's dependencies, which is
  // used by (legacy) mechanisms like loadmode.js to automatically
  // load a mode. (Preferred mechanism is the require/define calls.)
  CodeMirror.defineMode = function(name, mode) {
    if (!CodeMirror.defaults.mode && name != "null") CodeMirror.defaults.mode = name;
    if (arguments.length > 2)
      mode.dependencies = Array.prototype.slice.call(arguments, 2);
    modes[name] = mode;
  };

  CodeMirror.defineMIME = function(mime, spec) {
    mimeModes[mime] = spec;
  };

  // Given a MIME type, a {name, ...options} config object, or a name
  // string, return a mode config object.
  CodeMirror.resolveMode = function(spec) {
    if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) {
      spec = mimeModes[spec];
    } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) {
      var found = mimeModes[spec.name];
      if (typeof found == "string") found = {name: found};
      spec = createObj(found, spec);
      spec.name = found.name;
    } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) {
      return CodeMirror.resolveMode("application/xml");
    } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+json$/.test(spec)) {
      return CodeMirror.resolveMode("application/json");
    }
    if (typeof spec == "string") return {name: spec};
    else return spec || {name: "null"};
  };

  // Given a mode spec (anything that resolveMode accepts), find and
  // initialize an actual mode object.
  CodeMirror.getMode = function(options, spec) {
    var spec = CodeMirror.resolveMode(spec);
    var mfactory = modes[spec.name];
    if (!mfactory) return CodeMirror.getMode(options, "text/plain");
    var modeObj = mfactory(options, spec);
    if (modeExtensions.hasOwnProperty(spec.name)) {
      var exts = modeExtensions[spec.name];
      for (var prop in exts) {
        if (!exts.hasOwnProperty(prop)) continue;
        if (modeObj.hasOwnProperty(prop)) modeObj["_" + prop] = modeObj[prop];
        modeObj[prop] = exts[prop];
      }
    }
    modeObj.name = spec.name;
    if (spec.helperType) modeObj.helperType = spec.helperType;
    if (spec.modeProps) for (var prop in spec.modeProps)
      modeObj[prop] = spec.modeProps[prop];

    return modeObj;
  };

  // Minimal default mode.
  CodeMirror.defineMode("null", function() {
    return {token: function(stream) {stream.skipToEnd();}};
  });
  CodeMirror.defineMIME("text/plain", "null");

  // This can be used to attach properties to mode objects from
  // outside the actual mode definition.
  var modeExtensions = CodeMirror.modeExtensions = {};
  CodeMirror.extendMode = function(mode, properties) {
    var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {});
    copyObj(properties, exts);
  };

  // EXTENSIONS

  CodeMirror.defineExtension = function(name, func) {
    CodeMirror.prototype[name] = func;
  };
  CodeMirror.defineDocExtension = function(name, func) {
    Doc.prototype[name] = func;
  };
  CodeMirror.defineOption = option;

  var initHooks = [];
  CodeMirror.defineInitHook = function(f) {initHooks.push(f);};

  var helpers = CodeMirror.helpers = {};
  CodeMirror.registerHelper = function(type, name, value) {
    if (!helpers.hasOwnProperty(type)) helpers[type] = CodeMirror[type] = {_global: []};
    helpers[type][name] = value;
  };
  CodeMirror.registerGlobalHelper = function(type, name, predicate, value) {
    CodeMirror.registerHelper(type, name, value);
    helpers[type]._global.push({pred: predicate, val: value});
  };

  // MODE STATE HANDLING

  // Utility functions for working with state. Exported because nested
  // modes need to do this for their inner modes.

  var copyState = CodeMirror.copyState = function(mode, state) {
    if (state === true) return state;
    if (mode.copyState) return mode.copyState(state);
    var nstate = {};
    for (var n in state) {
      var val = state[n];
      if (val instanceof Array) val = val.concat([]);
      nstate[n] = val;
    }
    return nstate;
  };

  var startState = CodeMirror.startState = function(mode, a1, a2) {
    return mode.startState ? mode.startState(a1, a2) : true;
  };

  // Given a mode and a state (for that mode), find the inner mode and
  // state at the position that the state refers to.
  CodeMirror.innerMode = function(mode, state) {
    while (mode.innerMode) {
      var info = mode.innerMode(state);
      if (!info || info.mode == mode) break;
      state = info.state;
      mode = info.mode;
    }
    return info || {mode: mode, state: state};
  };

  // STANDARD COMMANDS

  // Commands are parameter-less actions that can be performed on an
  // editor, mostly used for keybindings.
  var commands = CodeMirror.commands = {
    selectAll: function(cm) {cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll);},
    singleSelection: function(cm) {
      cm.setSelection(cm.getCursor("anchor"), cm.getCursor("head"), sel_dontScroll);
    },
    killLine: function(cm) {
      deleteNearSelection(cm, function(range) {
        if (range.empty()) {
          var len = getLine(cm.doc, range.head.line).text.length;
          if (range.head.ch == len && range.head.line < cm.lastLine())
            return {from: range.head, to: Pos(range.head.line + 1, 0)};
          else
            return {from: range.head, to: Pos(range.head.line, len)};
        } else {
          return {from: range.from(), to: range.to()};
        }
      });
    },
    deleteLine: function(cm) {
      deleteNearSelection(cm, function(range) {
        return {from: Pos(range.from().line, 0),
                to: clipPos(cm.doc, Pos(range.to().line + 1, 0))};
      });
    },
    delLineLeft: function(cm) {
      deleteNearSelection(cm, function(range) {
        return {from: Pos(range.from().line, 0), to: range.from()};
      });
    },
    delWrappedLineLeft: function(cm) {
      deleteNearSelection(cm, function(range) {
        var top = cm.charCoords(range.head, "div").top + 5;
        var leftPos = cm.coordsChar({left: 0, top: top}, "div");
        return {from: leftPos, to: range.from()};
      });
    },
    delWrappedLineRight: function(cm) {
      deleteNearSelection(cm, function(range) {
        var top = cm.charCoords(range.head, "div").top + 5;
        var rightPos = cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div");
        return {from: range.from(), to: rightPos };
      });
    },
    undo: function(cm) {cm.undo();},
    redo: function(cm) {cm.redo();},
    undoSelection: function(cm) {cm.undoSelection();},
    redoSelection: function(cm) {cm.redoSelection();},
    goDocStart: function(cm) {cm.extendSelection(Pos(cm.firstLine(), 0));},
    goDocEnd: function(cm) {cm.extendSelection(Pos(cm.lastLine()));},
    goLineStart: function(cm) {
      cm.extendSelectionsBy(function(range) { return lineStart(cm, range.head.line); },
                            {origin: "+move", bias: 1});
    },
    goLineStartSmart: function(cm) {
      cm.extendSelectionsBy(function(range) {
        return lineStartSmart(cm, range.head);
      }, {origin: "+move", bias: 1});
    },
    goLineEnd: function(cm) {
      cm.extendSelectionsBy(function(range) { return lineEnd(cm, range.head.line); },
                            {origin: "+move", bias: -1});
    },
    goLineRight: function(cm) {
      cm.extendSelectionsBy(function(range) {
        var top = cm.charCoords(range.head, "div").top + 5;
        return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div");
      }, sel_move);
    },
    goLineLeft: function(cm) {
      cm.extendSelectionsBy(function(range) {
        var top = cm.charCoords(range.head, "div").top + 5;
        return cm.coordsChar({left: 0, top: top}, "div");
      }, sel_move);
    },
    goLineLeftSmart: function(cm) {
      cm.extendSelectionsBy(function(range) {
        var top = cm.charCoords(range.head, "div").top + 5;
        var pos = cm.coordsChar({left: 0, top: top}, "div");
        if (pos.ch < cm.getLine(pos.line).search(/\S/)) return lineStartSmart(cm, range.head);
        return pos;
      }, sel_move);
    },
    goLineUp: function(cm) {cm.moveV(-1, "line");},
    goLineDown: function(cm) {cm.moveV(1, "line");},
    goPageUp: function(cm) {cm.moveV(-1, "page");},
    goPageDown: function(cm) {cm.moveV(1, "page");},
    goCharLeft: function(cm) {cm.moveH(-1, "char");},
    goCharRight: function(cm) {cm.moveH(1, "char");},
    goColumnLeft: function(cm) {cm.moveH(-1, "column");},
    goColumnRight: function(cm) {cm.moveH(1, "column");},
    goWordLeft: function(cm) {cm.moveH(-1, "word");},
    goGroupRight: function(cm) {cm.moveH(1, "group");},
    goGroupLeft: function(cm) {cm.moveH(-1, "group");},
    goWordRight: function(cm) {cm.moveH(1, "word");},
    delCharBefore: function(cm) {cm.deleteH(-1, "char");},
    delCharAfter: function(cm) {cm.deleteH(1, "char");},
    delWordBefore: function(cm) {cm.deleteH(-1, "word");},
    delWordAfter: function(cm) {cm.deleteH(1, "word");},
    delGroupBefore: function(cm) {cm.deleteH(-1, "group");},
    delGroupAfter: function(cm) {cm.deleteH(1, "group");},
    indentAuto: function(cm) {cm.indentSelection("smart");},
    indentMore: function(cm) {cm.indentSelection("add");},
    indentLess: function(cm) {cm.indentSelection("subtract");},
    insertTab: function(cm) {cm.replaceSelection("\t");},
    insertSoftTab: function(cm) {
      var spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize;
      for (var i = 0; i < ranges.length; i++) {
        var pos = ranges[i].from();
        var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize);
        spaces.push(spaceStr(tabSize - col % tabSize));
      }
      cm.replaceSelections(spaces);
    },
    defaultTab: function(cm) {
      if (cm.somethingSelected()) cm.indentSelection("add");
      else cm.execCommand("insertTab");
    },
    transposeChars: function(cm) {
      runInOp(cm, function() {
        var ranges = cm.listSelections(), newSel = [];
        for (var i = 0; i < ranges.length; i++) {
          var cur = ranges[i].head, line = getLine(cm.doc, cur.line).text;
          if (line) {
            if (cur.ch == line.length) cur = new Pos(cur.line, cur.ch - 1);
            if (cur.ch > 0) {
              cur = new Pos(cur.line, cur.ch + 1);
              cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2),
                              Pos(cur.line, cur.ch - 2), cur, "+transpose");
            } else if (cur.line > cm.doc.first) {
              var prev = getLine(cm.doc, cur.line - 1).text;
              if (prev)
                cm.replaceRange(line.charAt(0) + cm.doc.lineSeparator() +
                                prev.charAt(prev.length - 1),
                                Pos(cur.line - 1, prev.length - 1), Pos(cur.line, 1), "+transpose");
            }
          }
          newSel.push(new Range(cur, cur));
        }
        cm.setSelections(newSel);
      });
    },
    newlineAndIndent: function(cm) {
      runInOp(cm, function() {
        var len = cm.listSelections().length;
        for (var i = 0; i < len; i++) {
          var range = cm.listSelections()[i];
          cm.replaceRange(cm.doc.lineSeparator(), range.anchor, range.head, "+input");
          cm.indentLine(range.from().line + 1, null, true);
        }
        ensureCursorVisible(cm);
      });
    },
    openLine: function(cm) {cm.replaceSelection("\n", "start")},
    toggleOverwrite: function(cm) {cm.toggleOverwrite();}
  };


  // STANDARD KEYMAPS

  var keyMap = CodeMirror.keyMap = {};

  keyMap.basic = {
    "Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown",
    "End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown",
    "Delete": "delCharAfter", "Backspace": "delCharBefore", "Shift-Backspace": "delCharBefore",
    "Tab": "defaultTab", "Shift-Tab": "indentAuto",
    "Enter": "newlineAndIndent", "Insert": "toggleOverwrite",
    "Esc": "singleSelection"
  };
  // Note that the save and find-related commands aren't defined by
  // default. User code or addons can define them. Unknown commands
  // are simply ignored.
  keyMap.pcDefault = {
    "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo",
    "Ctrl-Home": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Up": "goLineUp", "Ctrl-Down": "goLineDown",
    "Ctrl-Left": "goGroupLeft", "Ctrl-Right": "goGroupRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd",
    "Ctrl-Backspace": "delGroupBefore", "Ctrl-Delete": "delGroupAfter", "Ctrl-S": "save", "Ctrl-F": "find",
    "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll",
    "Ctrl-[": "indentLess", "Ctrl-]": "indentMore",
    "Ctrl-U": "undoSelection", "Shift-Ctrl-U": "redoSelection", "Alt-U": "redoSelection",
    fallthrough: "basic"
  };
  // Very basic readline/emacs-style bindings, which are standard on Mac.
  keyMap.emacsy = {
    "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown",
    "Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd",
    "Ctrl-V": "goPageDown", "Shift-Ctrl-V": "goPageUp", "Ctrl-D": "delCharAfter", "Ctrl-H": "delCharBefore",
    "Alt-D": "delWordAfter", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars",
    "Ctrl-O": "openLine"
  };
  keyMap.macDefault = {
    "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo",
    "Cmd-Home": "goDocStart", "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goGroupLeft",
    "Alt-Right": "goGroupRight", "Cmd-Left": "goLineLeft", "Cmd-Right": "goLineRight", "Alt-Backspace": "delGroupBefore",
    "Ctrl-Alt-Backspace": "delGroupAfter", "Alt-Delete": "delGroupAfter", "Cmd-S": "save", "Cmd-F": "find",
    "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll",
    "Cmd-[": "indentLess", "Cmd-]": "indentMore", "Cmd-Backspace": "delWrappedLineLeft", "Cmd-Delete": "delWrappedLineRight",
    "Cmd-U": "undoSelection", "Shift-Cmd-U": "redoSelection", "Ctrl-Up": "goDocStart", "Ctrl-Down": "goDocEnd",
    fallthrough: ["basic", "emacsy"]
  };
  keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault;

  // KEYMAP DISPATCH

  function normalizeKeyName(name) {
    var parts = name.split(/-(?!$)/), name = parts[parts.length - 1];
    var alt, ctrl, shift, cmd;
    for (var i = 0; i < parts.length - 1; i++) {
      var mod = parts[i];
      if (/^(cmd|meta|m)$/i.test(mod)) cmd = true;
      else if (/^a(lt)?$/i.test(mod)) alt = true;
      else if (/^(c|ctrl|control)$/i.test(mod)) ctrl = true;
      else if (/^s(hift)$/i.test(mod)) shift = true;
      else throw new Error("Unrecognized modifier name: " + mod);
    }
    if (alt) name = "Alt-" + name;
    if (ctrl) name = "Ctrl-" + name;
    if (cmd) name = "Cmd-" + name;
    if (shift) name = "Shift-" + name;
    return name;
  }

  // This is a kludge to keep keymaps mostly working as raw objects
  // (backwards compatibility) while at the same time support features
  // like normalization and multi-stroke key bindings. It compiles a
  // new normalized keymap, and then updates the old object to reflect
  // this.
  CodeMirror.normalizeKeyMap = function(keymap) {
    var copy = {};
    for (var keyname in keymap) if (keymap.hasOwnProperty(keyname)) {
      var value = keymap[keyname];
      if (/^(name|fallthrough|(de|at)tach)$/.test(keyname)) continue;
      if (value == "...") { delete keymap[keyname]; continue; }

      var keys = map(keyname.split(" "), normalizeKeyName);
      for (var i = 0; i < keys.length; i++) {
        var val, name;
        if (i == keys.length - 1) {
          name = keys.join(" ");
          val = value;
        } else {
          name = keys.slice(0, i + 1).join(" ");
          val = "...";
        }
        var prev = copy[name];
        if (!prev) copy[name] = val;
        else if (prev != val) throw new Error("Inconsistent bindings for " + name);
      }
      delete keymap[keyname];
    }
    for (var prop in copy) keymap[prop] = copy[prop];
    return keymap;
  };

  var lookupKey = CodeMirror.lookupKey = function(key, map, handle, context) {
    map = getKeyMap(map);
    var found = map.call ? map.call(key, context) : map[key];
    if (found === false) return "nothing";
    if (found === "...") return "multi";
    if (found != null && handle(found)) return "handled";

    if (map.fallthrough) {
      if (Object.prototype.toString.call(map.fallthrough) != "[object Array]")
        return lookupKey(key, map.fallthrough, handle, context);
      for (var i = 0; i < map.fallthrough.length; i++) {
        var result = lookupKey(key, map.fallthrough[i], handle, context);
        if (result) return result;
      }
    }
  };

  // Modifier key presses don't count as 'real' key presses for the
  // purpose of keymap fallthrough.
  var isModifierKey = CodeMirror.isModifierKey = function(value) {
    var name = typeof value == "string" ? value : keyNames[value.keyCode];
    return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod";
  };

  // Look up the name of a key as indicated by an event object.
  var keyName = CodeMirror.keyName = function(event, noShift) {
    if (presto && event.keyCode == 34 && event["char"]) return false;
    var base = keyNames[event.keyCode], name = base;
    if (name == null || event.altGraphKey) return false;
    if (event.altKey && base != "Alt") name = "Alt-" + name;
    if ((flipCtrlCmd ? event.metaKey : event.ctrlKey) && base != "Ctrl") name = "Ctrl-" + name;
    if ((flipCtrlCmd ? event.ctrlKey : event.metaKey) && base != "Cmd") name = "Cmd-" + name;
    if (!noShift && event.shiftKey && base != "Shift") name = "Shift-" + name;
    return name;
  };

  function getKeyMap(val) {
    return typeof val == "string" ? keyMap[val] : val;
  }

  // FROMTEXTAREA

  CodeMirror.fromTextArea = function(textarea, options) {
    options = options ? copyObj(options) : {};
    options.value = textarea.value;
    if (!options.tabindex && textarea.tabIndex)
      options.tabindex = textarea.tabIndex;
    if (!options.placeholder && textarea.placeholder)
      options.placeholder = textarea.placeholder;
    // Set autofocus to true if this textarea is focused, or if it has
    // autofocus and no other element is focused.
    if (options.autofocus == null) {
      var hasFocus = activeElt();
      options.autofocus = hasFocus == textarea ||
        textarea.getAttribute("autofocus") != null && hasFocus == document.body;
    }

    function save() {textarea.value = cm.getValue();}
    if (textarea.form) {
      on(textarea.form, "submit", save);
      // Deplorable hack to make the submit method do the right thing.
      if (!options.leaveSubmitMethodAlone) {
        var form = textarea.form, realSubmit = form.submit;
        try {
          var wrappedSubmit = form.submit = function() {
            save();
            form.submit = realSubmit;
            form.submit();
            form.submit = wrappedSubmit;
          };
        } catch(e) {}
      }
    }

    options.finishInit = function(cm) {
      cm.save = save;
      cm.getTextArea = function() { return textarea; };
      cm.toTextArea = function() {
        cm.toTextArea = isNaN; // Prevent this from being ran twice
        save();
        textarea.parentNode.removeChild(cm.getWrapperElement());
        textarea.style.display = "";
        if (textarea.form) {
          off(textarea.form, "submit", save);
          if (typeof textarea.form.submit == "function")
            textarea.form.submit = realSubmit;
        }
      };
    };

    textarea.style.display = "none";
    var cm = CodeMirror(function(node) {
      textarea.parentNode.insertBefore(node, textarea.nextSibling);
    }, options);
    return cm;
  };

  // STRING STREAM

  // Fed to the mode parsers, provides helper functions to make
  // parsers more succinct.

  var StringStream = CodeMirror.StringStream = function(string, tabSize) {
    this.pos = this.start = 0;
    this.string = string;
    this.tabSize = tabSize || 8;
    this.lastColumnPos = this.lastColumnValue = 0;
    this.lineStart = 0;
  };

  StringStream.prototype = {
    eol: function() {return this.pos >= this.string.length;},
    sol: function() {return this.pos == this.lineStart;},
    peek: function() {return this.string.charAt(this.pos) || undefined;},
    next: function() {
      if (this.pos < this.string.length)
        return this.string.charAt(this.pos++);
    },
    eat: function(match) {
      var ch = this.string.charAt(this.pos);
      if (typeof match == "string") var ok = ch == match;
      else var ok = ch && (match.test ? match.test(ch) : match(ch));
      if (ok) {++this.pos; return ch;}
    },
    eatWhile: function(match) {
      var start = this.pos;
      while (this.eat(match)){}
      return this.pos > start;
    },
    eatSpace: function() {
      var start = this.pos;
      while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos;
      return this.pos > start;
    },
    skipToEnd: function() {this.pos = this.string.length;},
    skipTo: function(ch) {
      var found = this.string.indexOf(ch, this.pos);
      if (found > -1) {this.pos = found; return true;}
    },
    backUp: function(n) {this.pos -= n;},
    column: function() {
      if (this.lastColumnPos < this.start) {
        this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue);
        this.lastColumnPos = this.start;
      }
      return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0);
    },
    indentation: function() {
      return countColumn(this.string, null, this.tabSize) -
        (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0);
    },
    match: function(pattern, consume, caseInsensitive) {
      if (typeof pattern == "string") {
        var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;};
        var substr = this.string.substr(this.pos, pattern.length);
        if (cased(substr) == cased(pattern)) {
          if (consume !== false) this.pos += pattern.length;
          return true;
        }
      } else {
        var match = this.string.slice(this.pos).match(pattern);
        if (match && match.index > 0) return null;
        if (match && consume !== false) this.pos += match[0].length;
        return match;
      }
    },
    current: function(){return this.string.slice(this.start, this.pos);},
    hideFirstChars: function(n, inner) {
      this.lineStart += n;
      try { return inner(); }
      finally { this.lineStart -= n; }
    }
  };

  // TEXTMARKERS

  // Created with markText and setBookmark methods. A TextMarker is a
  // handle that can be used to clear or find a marked position in the
  // document. Line objects hold arrays (markedSpans) containing
  // {from, to, marker} object pointing to such marker objects, and
  // indicating that such a marker is present on that line. Multiple
  // lines may point to the same marker when it spans across lines.
  // The spans will have null for their from/to properties when the
  // marker continues beyond the start/end of the line. Markers have
  // links back to the lines they currently touch.

  var nextMarkerId = 0;

  var TextMarker = CodeMirror.TextMarker = function(doc, type) {
    this.lines = [];
    this.type = type;
    this.doc = doc;
    this.id = ++nextMarkerId;
  };
  eventMixin(TextMarker);

  // Clear the marker.
  TextMarker.prototype.clear = function() {
    if (this.explicitlyCleared) return;
    var cm = this.doc.cm, withOp = cm && !cm.curOp;
    if (withOp) startOperation(cm);
    if (hasHandler(this, "clear")) {
      var found = this.find();
      if (found) signalLater(this, "clear", found.from, found.to);
    }
    var min = null, max = null;
    for (var i = 0; i < this.lines.length; ++i) {
      var line = this.lines[i];
      var span = getMarkedSpanFor(line.markedSpans, this);
      if (cm && !this.collapsed) regLineChange(cm, lineNo(line), "text");
      else if (cm) {
        if (span.to != null) max = lineNo(line);
        if (span.from != null) min = lineNo(line);
      }
      line.markedSpans = removeMarkedSpan(line.markedSpans, span);
      if (span.from == null && this.collapsed && !lineIsHidden(this.doc, line) && cm)
        updateLineHeight(line, textHeight(cm.display));
    }
    if (cm && this.collapsed && !cm.options.lineWrapping) for (var i = 0; i < this.lines.length; ++i) {
      var visual = visualLine(this.lines[i]), len = lineLength(visual);
      if (len > cm.display.maxLineLength) {
        cm.display.maxLine = visual;
        cm.display.maxLineLength = len;
        cm.display.maxLineChanged = true;
      }
    }

    if (min != null && cm && this.collapsed) regChange(cm, min, max + 1);
    this.lines.length = 0;
    this.explicitlyCleared = true;
    if (this.atomic && this.doc.cantEdit) {
      this.doc.cantEdit = false;
      if (cm) reCheckSelection(cm.doc);
    }
    if (cm) signalLater(cm, "markerCleared", cm, this);
    if (withOp) endOperation(cm);
    if (this.parent) this.parent.clear();
  };

  // Find the position of the marker in the document. Returns a {from,
  // to} object by default. Side can be passed to get a specific side
  // -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the
  // Pos objects returned contain a line object, rather than a line
  // number (used to prevent looking up the same line twice).
  TextMarker.prototype.find = function(side, lineObj) {
    if (side == null && this.type == "bookmark") side = 1;
    var from, to;
    for (var i = 0; i < this.lines.length; ++i) {
      var line = this.lines[i];
      var span = getMarkedSpanFor(line.markedSpans, this);
      if (span.from != null) {
        from = Pos(lineObj ? line : lineNo(line), span.from);
        if (side == -1) return from;
      }
      if (span.to != null) {
        to = Pos(lineObj ? line : lineNo(line), span.to);
        if (side == 1) return to;
      }
    }
    return from && {from: from, to: to};
  };

  // Signals that the marker's widget changed, and surrounding layout
  // should be recomputed.
  TextMarker.prototype.changed = function() {
    var pos = this.find(-1, true), widget = this, cm = this.doc.cm;
    if (!pos || !cm) return;
    runInOp(cm, function() {
      var line = pos.line, lineN = lineNo(pos.line);
      var view = findViewForLine(cm, lineN);
      if (view) {
        clearLineMeasurementCacheFor(view);
        cm.curOp.selectionChanged = cm.curOp.forceUpdate = true;
      }
      cm.curOp.updateMaxLine = true;
      if (!lineIsHidden(widget.doc, line) && widget.height != null) {
        var oldHeight = widget.height;
        widget.height = null;
        var dHeight = widgetHeight(widget) - oldHeight;
        if (dHeight)
          updateLineHeight(line, line.height + dHeight);
      }
    });
  };

  TextMarker.prototype.attachLine = function(line) {
    if (!this.lines.length && this.doc.cm) {
      var op = this.doc.cm.curOp;
      if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1)
        (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this);
    }
    this.lines.push(line);
  };
  TextMarker.prototype.detachLine = function(line) {
    this.lines.splice(indexOf(this.lines, line), 1);
    if (!this.lines.length && this.doc.cm) {
      var op = this.doc.cm.curOp;
      (op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this);
    }
  };

  // Collapsed markers have unique ids, in order to be able to order
  // them, which is needed for uniquely determining an outer marker
  // when they overlap (they may nest, but not partially overlap).
  var nextMarkerId = 0;

  // Create a marker, wire it up to the right lines, and
  function markText(doc, from, to, options, type) {
    // Shared markers (across linked documents) are handled separately
    // (markTextShared will call out to this again, once per
    // document).
    if (options && options.shared) return markTextShared(doc, from, to, options, type);
    // Ensure we are in an operation.
    if (doc.cm && !doc.cm.curOp) return operation(doc.cm, markText)(doc, from, to, options, type);

    var marker = new TextMarker(doc, type), diff = cmp(from, to);
    if (options) copyObj(options, marker, false);
    // Don't connect empty markers unless clearWhenEmpty is false
    if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false)
      return marker;
    if (marker.replacedWith) {
      // Showing up as a widget implies collapsed (widget replaces text)
      marker.collapsed = true;
      marker.widgetNode = elt("span", [marker.replacedWith], "CodeMirror-widget");
      if (!options.handleMouseEvents) marker.widgetNode.setAttribute("cm-ignore-events", "true");
      if (options.insertLeft) marker.widgetNode.insertLeft = true;
    }
    if (marker.collapsed) {
      if (conflictingCollapsedRange(doc, from.line, from, to, marker) ||
          from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker))
        throw new Error("Inserting collapsed marker partially overlapping an existing one");
      sawCollapsedSpans = true;
    }

    if (marker.addToHistory)
      addChangeToHistory(doc, {from: from, to: to, origin: "markText"}, doc.sel, NaN);

    var curLine = from.line, cm = doc.cm, updateMaxLine;
    doc.iter(curLine, to.line + 1, function(line) {
      if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine)
        updateMaxLine = true;
      if (marker.collapsed && curLine != from.line) updateLineHeight(line, 0);
      addMarkedSpan(line, new MarkedSpan(marker,
                                         curLine == from.line ? from.ch : null,
                                         curLine == to.line ? to.ch : null));
      ++curLine;
    });
    // lineIsHidden depends on the presence of the spans, so needs a second pass
    if (marker.collapsed) doc.iter(from.line, to.line + 1, function(line) {
      if (lineIsHidden(doc, line)) updateLineHeight(line, 0);
    });

    if (marker.clearOnEnter) on(marker, "beforeCursorEnter", function() { marker.clear(); });

    if (marker.readOnly) {
      sawReadOnlySpans = true;
      if (doc.history.done.length || doc.history.undone.length)
        doc.clearHistory();
    }
    if (marker.collapsed) {
      marker.id = ++nextMarkerId;
      marker.atomic = true;
    }
    if (cm) {
      // Sync editor state
      if (updateMaxLine) cm.curOp.updateMaxLine = true;
      if (marker.collapsed)
        regChange(cm, from.line, to.line + 1);
      else if (marker.className || marker.title || marker.startStyle || marker.endStyle || marker.css)
        for (var i = from.line; i <= to.line; i++) regLineChange(cm, i, "text");
      if (marker.atomic) reCheckSelection(cm.doc);
      signalLater(cm, "markerAdded", cm, marker);
    }
    return marker;
  }

  // SHARED TEXTMARKERS

  // A shared marker spans multiple linked documents. It is
  // implemented as a meta-marker-object controlling multiple normal
  // markers.
  var SharedTextMarker = CodeMirror.SharedTextMarker = function(markers, primary) {
    this.markers = markers;
    this.primary = primary;
    for (var i = 0; i < markers.length; ++i)
      markers[i].parent = this;
  };
  eventMixin(SharedTextMarker);

  SharedTextMarker.prototype.clear = function() {
    if (this.explicitlyCleared) return;
    this.explicitlyCleared = true;
    for (var i = 0; i < this.markers.length; ++i)
      this.markers[i].clear();
    signalLater(this, "clear");
  };
  SharedTextMarker.prototype.find = function(side, lineObj) {
    return this.primary.find(side, lineObj);
  };

  function markTextShared(doc, from, to, options, type) {
    options = copyObj(options);
    options.shared = false;
    var markers = [markText(doc, from, to, options, type)], primary = markers[0];
    var widget = options.widgetNode;
    linkedDocs(doc, function(doc) {
      if (widget) options.widgetNode = widget.cloneNode(true);
      markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type));
      for (var i = 0; i < doc.linked.length; ++i)
        if (doc.linked[i].isParent) return;
      primary = lst(markers);
    });
    return new SharedTextMarker(markers, primary);
  }

  function findSharedMarkers(doc) {
    return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())),
                         function(m) { return m.parent; });
  }

  function copySharedMarkers(doc, markers) {
    for (var i = 0; i < markers.length; i++) {
      var marker = markers[i], pos = marker.find();
      var mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to);
      if (cmp(mFrom, mTo)) {
        var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type);
        marker.markers.push(subMark);
        subMark.parent = marker;
      }
    }
  }

  function detachSharedMarkers(markers) {
    for (var i = 0; i < markers.length; i++) {
      var marker = markers[i], linked = [marker.primary.doc];;
      linkedDocs(marker.primary.doc, function(d) { linked.push(d); });
      for (var j = 0; j < marker.markers.length; j++) {
        var subMarker = marker.markers[j];
        if (indexOf(linked, subMarker.doc) == -1) {
          subMarker.parent = null;
          marker.markers.splice(j--, 1);
        }
      }
    }
  }

  // TEXTMARKER SPANS

  function MarkedSpan(marker, from, to) {
    this.marker = marker;
    this.from = from; this.to = to;
  }

  // Search an array of spans for a span matching the given marker.
  function getMarkedSpanFor(spans, marker) {
    if (spans) for (var i = 0; i < spans.length; ++i) {
      var span = spans[i];
      if (span.marker == marker) return span;
    }
  }
  // Remove a span from an array, returning undefined if no spans are
  // left (we don't store arrays for lines without spans).
  function removeMarkedSpan(spans, span) {
    for (var r, i = 0; i < spans.length; ++i)
      if (spans[i] != span) (r || (r = [])).push(spans[i]);
    return r;
  }
  // Add a span to a line.
  function addMarkedSpan(line, span) {
    line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span];
    span.marker.attachLine(line);
  }

  // Used for the algorithm that adjusts markers for a change in the
  // document. These functions cut an array of spans at a given
  // character position, returning an array of remaining chunks (or
  // undefined if nothing remains).
  function markedSpansBefore(old, startCh, isInsert) {
    if (old) for (var i = 0, nw; i < old.length; ++i) {
      var span = old[i], marker = span.marker;
      var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh);
      if (startsBefore || span.from == startCh && marker.type == "bookmark" && (!isInsert || !span.marker.insertLeft)) {
        var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh);
        (nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to));
      }
    }
    return nw;
  }
  function markedSpansAfter(old, endCh, isInsert) {
    if (old) for (var i = 0, nw; i < old.length; ++i) {
      var span = old[i], marker = span.marker;
      var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh);
      if (endsAfter || span.from == endCh && marker.type == "bookmark" && (!isInsert || span.marker.insertLeft)) {
        var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh);
        (nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh,
                                              span.to == null ? null : span.to - endCh));
      }
    }
    return nw;
  }

  // Given a change object, compute the new set of marker spans that
  // cover the line in which the change took place. Removes spans
  // entirely within the change, reconnects spans belonging to the
  // same marker that appear on both sides of the change, and cuts off
  // spans partially within the change. Returns an array of span
  // arrays with one element for each line in (after) the change.
  function stretchSpansOverChange(doc, change) {
    if (change.full) return null;
    var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans;
    var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans;
    if (!oldFirst && !oldLast) return null;

    var startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0;
    // Get the spans that 'stick out' on both sides
    var first = markedSpansBefore(oldFirst, startCh, isInsert);
    var last = markedSpansAfter(oldLast, endCh, isInsert);

    // Next, merge those two ends
    var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0);
    if (first) {
      // Fix up .to properties of first
      for (var i = 0; i < first.length; ++i) {
        var span = first[i];
        if (span.to == null) {
          var found = getMarkedSpanFor(last, span.marker);
          if (!found) span.to = startCh;
          else if (sameLine) span.to = found.to == null ? null : found.to + offset;
        }
      }
    }
    if (last) {
      // Fix up .from in last (or move them into first in case of sameLine)
      for (var i = 0; i < last.length; ++i) {
        var span = last[i];
        if (span.to != null) span.to += offset;
        if (span.from == null) {
          var found = getMarkedSpanFor(first, span.marker);
          if (!found) {
            span.from = offset;
            if (sameLine) (first || (first = [])).push(span);
          }
        } else {
          span.from += offset;
          if (sameLine) (first || (first = [])).push(span);
        }
      }
    }
    // Make sure we didn't create any zero-length spans
    if (first) first = clearEmptySpans(first);
    if (last && last != first) last = clearEmptySpans(last);

    var newMarkers = [first];
    if (!sameLine) {
      // Fill gap with whole-line-spans
      var gap = change.text.length - 2, gapMarkers;
      if (gap > 0 && first)
        for (var i = 0; i < first.length; ++i)
          if (first[i].to == null)
            (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i].marker, null, null));
      for (var i = 0; i < gap; ++i)
        newMarkers.push(gapMarkers);
      newMarkers.push(last);
    }
    return newMarkers;
  }

  // Remove spans that are empty and don't have a clearWhenEmpty
  // option of false.
  function clearEmptySpans(spans) {
    for (var i = 0; i < spans.length; ++i) {
      var span = spans[i];
      if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false)
        spans.splice(i--, 1);
    }
    if (!spans.length) return null;
    return spans;
  }

  // Used for un/re-doing changes from the history. Combines the
  // result of computing the existing spans with the set of spans that
  // existed in the history (so that deleting around a span and then
  // undoing brings back the span).
  function mergeOldSpans(doc, change) {
    var old = getOldSpans(doc, change);
    var stretched = stretchSpansOverChange(doc, change);
    if (!old) return stretched;
    if (!stretched) return old;

    for (var i = 0; i < old.length; ++i) {
      var oldCur = old[i], stretchCur = stretched[i];
      if (oldCur && stretchCur) {
        spans: for (var j = 0; j < stretchCur.length; ++j) {
          var span = stretchCur[j];
          for (var k = 0; k < oldCur.length; ++k)
            if (oldCur[k].marker == span.marker) continue spans;
          oldCur.push(span);
        }
      } else if (stretchCur) {
        old[i] = stretchCur;
      }
    }
    return old;
  }

  // Used to 'clip' out readOnly ranges when making a change.
  function removeReadOnlyRanges(doc, from, to) {
    var markers = null;
    doc.iter(from.line, to.line + 1, function(line) {
      if (line.markedSpans) for (var i = 0; i < line.markedSpans.length; ++i) {
        var mark = line.markedSpans[i].marker;
        if (mark.readOnly && (!markers || indexOf(markers, mark) == -1))
          (markers || (markers = [])).push(mark);
      }
    });
    if (!markers) return null;
    var parts = [{from: from, to: to}];
    for (var i = 0; i < markers.length; ++i) {
      var mk = markers[i], m = mk.find(0);
      for (var j = 0; j < parts.length; ++j) {
        var p = parts[j];
        if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) continue;
        var newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to);
        if (dfrom < 0 || !mk.inclusiveLeft && !dfrom)
          newParts.push({from: p.from, to: m.from});
        if (dto > 0 || !mk.inclusiveRight && !dto)
          newParts.push({from: m.to, to: p.to});
        parts.splice.apply(parts, newParts);
        j += newParts.length - 1;
      }
    }
    return parts;
  }

  // Connect or disconnect spans from a line.
  function detachMarkedSpans(line) {
    var spans = line.markedSpans;
    if (!spans) return;
    for (var i = 0; i < spans.length; ++i)
      spans[i].marker.detachLine(line);
    line.markedSpans = null;
  }
  function attachMarkedSpans(line, spans) {
    if (!spans) return;
    for (var i = 0; i < spans.length; ++i)
      spans[i].marker.attachLine(line);
    line.markedSpans = spans;
  }

  // Helpers used when computing which overlapping collapsed span
  // counts as the larger one.
  function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0; }
  function extraRight(marker) { return marker.inclusiveRight ? 1 : 0; }

  // Returns a number indicating which of two overlapping collapsed
  // spans is larger (and thus includes the other). Falls back to
  // comparing ids when the spans cover exactly the same range.
  function compareCollapsedMarkers(a, b) {
    var lenDiff = a.lines.length - b.lines.length;
    if (lenDiff != 0) return lenDiff;
    var aPos = a.find(), bPos = b.find();
    var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b);
    if (fromCmp) return -fromCmp;
    var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b);
    if (toCmp) return toCmp;
    return b.id - a.id;
  }

  // Find out whether a line ends or starts in a collapsed span. If
  // so, return the marker for that span.
  function collapsedSpanAtSide(line, start) {
    var sps = sawCollapsedSpans && line.markedSpans, found;
    if (sps) for (var sp, i = 0; i < sps.length; ++i) {
      sp = sps[i];
      if (sp.marker.collapsed && (start ? sp.from : sp.to) == null &&
          (!found || compareCollapsedMarkers(found, sp.marker) < 0))
        found = sp.marker;
    }
    return found;
  }
  function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true); }
  function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false); }

  // Test whether there exists a collapsed span that partially
  // overlaps (covers the start or end, but not both) of a new span.
  // Such overlap is not allowed.
  function conflictingCollapsedRange(doc, lineNo, from, to, marker) {
    var line = getLine(doc, lineNo);
    var sps = sawCollapsedSpans && line.markedSpans;
    if (sps) for (var i = 0; i < sps.length; ++i) {
      var sp = sps[i];
      if (!sp.marker.collapsed) continue;
      var found = sp.marker.find(0);
      var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker);
      var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker);
      if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) continue;
      if (fromCmp <= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.to, from) >= 0 : cmp(found.to, from) > 0) ||
          fromCmp >= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.from, to) <= 0 : cmp(found.from, to) < 0))
        return true;
    }
  }

  // A visual line is a line as drawn on the screen. Folding, for
  // example, can cause multiple logical lines to appear on the same
  // visual line. This finds the start of the visual line that the
  // given line is part of (usually that is the line itself).
  function visualLine(line) {
    var merged;
    while (merged = collapsedSpanAtStart(line))
      line = merged.find(-1, true).line;
    return line;
  }

  // Returns an array of logical lines that continue the visual line
  // started by the argument, or undefined if there are no such lines.
  function visualLineContinued(line) {
    var merged, lines;
    while (merged = collapsedSpanAtEnd(line)) {
      line = merged.find(1, true).line;
      (lines || (lines = [])).push(line);
    }
    return lines;
  }

  // Get the line number of the start of the visual line that the
  // given line number is part of.
  function visualLineNo(doc, lineN) {
    var line = getLine(doc, lineN), vis = visualLine(line);
    if (line == vis) return lineN;
    return lineNo(vis);
  }
  // Get the line number of the start of the next visual line after
  // the given line.
  function visualLineEndNo(doc, lineN) {
    if (lineN > doc.lastLine()) return lineN;
    var line = getLine(doc, lineN), merged;
    if (!lineIsHidden(doc, line)) return lineN;
    while (merged = collapsedSpanAtEnd(line))
      line = merged.find(1, true).line;
    return lineNo(line) + 1;
  }

  // Compute whether a line is hidden. Lines count as hidden when they
  // are part of a visual line that starts with another line, or when
  // they are entirely covered by collapsed, non-widget span.
  function lineIsHidden(doc, line) {
    var sps = sawCollapsedSpans && line.markedSpans;
    if (sps) for (var sp, i = 0; i < sps.length; ++i) {
      sp = sps[i];
      if (!sp.marker.collapsed) continue;
      if (sp.from == null) return true;
      if (sp.marker.widgetNode) continue;
      if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp))
        return true;
    }
  }
  function lineIsHiddenInner(doc, line, span) {
    if (span.to == null) {
      var end = span.marker.find(1, true);
      return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker));
    }
    if (span.marker.inclusiveRight && span.to == line.text.length)
      return true;
    for (var sp, i = 0; i < line.markedSpans.length; ++i) {
      sp = line.markedSpans[i];
      if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to &&
          (sp.to == null || sp.to != span.from) &&
          (sp.marker.inclusiveLeft || span.marker.inclusiveRight) &&
          lineIsHiddenInner(doc, line, sp)) return true;
    }
  }

  // LINE WIDGETS

  // Line widgets are block elements displayed above or below a line.

  var LineWidget = CodeMirror.LineWidget = function(doc, node, options) {
    if (options) for (var opt in options) if (options.hasOwnProperty(opt))
      this[opt] = options[opt];
    this.doc = doc;
    this.node = node;
  };
  eventMixin(LineWidget);

  function adjustScrollWhenAboveVisible(cm, line, diff) {
    if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop))
      addToScrollPos(cm, null, diff);
  }

  LineWidget.prototype.clear = function() {
    var cm = this.doc.cm, ws = this.line.widgets, line = this.line, no = lineNo(line);
    if (no == null || !ws) return;
    for (var i = 0; i < ws.length; ++i) if (ws[i] == this) ws.splice(i--, 1);
    if (!ws.length) line.widgets = null;
    var height = widgetHeight(this);
    updateLineHeight(line, Math.max(0, line.height - height));
    if (cm) runInOp(cm, function() {
      adjustScrollWhenAboveVisible(cm, line, -height);
      regLineChange(cm, no, "widget");
    });
  };
  LineWidget.prototype.changed = function() {
    var oldH = this.height, cm = this.doc.cm, line = this.line;
    this.height = null;
    var diff = widgetHeight(this) - oldH;
    if (!diff) return;
    updateLineHeight(line, line.height + diff);
    if (cm) runInOp(cm, function() {
      cm.curOp.forceUpdate = true;
      adjustScrollWhenAboveVisible(cm, line, diff);
    });
  };

  function widgetHeight(widget) {
    if (widget.height != null) return widget.height;
    var cm = widget.doc.cm;
    if (!cm) return 0;
    if (!contains(document.body, widget.node)) {
      var parentStyle = "position: relative;";
      if (widget.coverGutter)
        parentStyle += "margin-left: -" + cm.display.gutters.offsetWidth + "px;";
      if (widget.noHScroll)
        parentStyle += "width: " + cm.display.wrapper.clientWidth + "px;";
      removeChildrenAndAdd(cm.display.measure, elt("div", [widget.node], null, parentStyle));
    }
    return widget.height = widget.node.parentNode.offsetHeight;
  }

  function addLineWidget(doc, handle, node, options) {
    var widget = new LineWidget(doc, node, options);
    var cm = doc.cm;
    if (cm && widget.noHScroll) cm.display.alignWidgets = true;
    changeLine(doc, handle, "widget", function(line) {
      var widgets = line.widgets || (line.widgets = []);
      if (widget.insertAt == null) widgets.push(widget);
      else widgets.splice(Math.min(widgets.length - 1, Math.max(0, widget.insertAt)), 0, widget);
      widget.line = line;
      if (cm && !lineIsHidden(doc, line)) {
        var aboveVisible = heightAtLine(line) < doc.scrollTop;
        updateLineHeight(line, line.height + widgetHeight(widget));
        if (aboveVisible) addToScrollPos(cm, null, widget.height);
        cm.curOp.forceUpdate = true;
      }
      return true;
    });
    return widget;
  }

  // LINE DATA STRUCTURE

  // Line objects. These hold state related to a line, including
  // highlighting info (the styles array).
  var Line = CodeMirror.Line = function(text, markedSpans, estimateHeight) {
    this.text = text;
    attachMarkedSpans(this, markedSpans);
    this.height = estimateHeight ? estimateHeight(this) : 1;
  };
  eventMixin(Line);
  Line.prototype.lineNo = function() { return lineNo(this); };

  // Change the content (text, markers) of a line. Automatically
  // invalidates cached information and tries to re-estimate the
  // line's height.
  function updateLine(line, text, markedSpans, estimateHeight) {
    line.text = text;
    if (line.stateAfter) line.stateAfter = null;
    if (line.styles) line.styles = null;
    if (line.order != null) line.order = null;
    detachMarkedSpans(line);
    attachMarkedSpans(line, markedSpans);
    var estHeight = estimateHeight ? estimateHeight(line) : 1;
    if (estHeight != line.height) updateLineHeight(line, estHeight);
  }

  // Detach a line from the document tree and its markers.
  function cleanUpLine(line) {
    line.parent = null;
    detachMarkedSpans(line);
  }

  function extractLineClasses(type, output) {
    if (type) for (;;) {
      var lineClass = type.match(/(?:^|\s+)line-(background-)?(\S+)/);
      if (!lineClass) break;
      type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length);
      var prop = lineClass[1] ? "bgClass" : "textClass";
      if (output[prop] == null)
        output[prop] = lineClass[2];
      else if (!(new RegExp("(?:^|\s)" + lineClass[2] + "(?:$|\s)")).test(output[prop]))
        output[prop] += " " + lineClass[2];
    }
    return type;
  }

  function callBlankLine(mode, state) {
    if (mode.blankLine) return mode.blankLine(state);
    if (!mode.innerMode) return;
    var inner = CodeMirror.innerMode(mode, state);
    if (inner.mode.blankLine) return inner.mode.blankLine(inner.state);
  }

  function readToken(mode, stream, state, inner) {
    for (var i = 0; i < 10; i++) {
      if (inner) inner[0] = CodeMirror.innerMode(mode, state).mode;
      var style = mode.token(stream, state);
      if (stream.pos > stream.start) return style;
    }
    throw new Error("Mode " + mode.name + " failed to advance stream.");
  }

  // Utility for getTokenAt and getLineTokens
  function takeToken(cm, pos, precise, asArray) {
    function getObj(copy) {
      return {start: stream.start, end: stream.pos,
              string: stream.current(),
              type: style || null,
              state: copy ? copyState(doc.mode, state) : state};
    }

    var doc = cm.doc, mode = doc.mode, style;
    pos = clipPos(doc, pos);
    var line = getLine(doc, pos.line), state = getStateBefore(cm, pos.line, precise);
    var stream = new StringStream(line.text, cm.options.tabSize), tokens;
    if (asArray) tokens = [];
    while ((asArray || stream.pos < pos.ch) && !stream.eol()) {
      stream.start = stream.pos;
      style = readToken(mode, stream, state);
      if (asArray) tokens.push(getObj(true));
    }
    return asArray ? tokens : getObj();
  }

  // Run the given mode's parser over a line, calling f for each token.
  function runMode(cm, text, mode, state, f, lineClasses, forceToEnd) {
    var flattenSpans = mode.flattenSpans;
    if (flattenSpans == null) flattenSpans = cm.options.flattenSpans;
    var curStart = 0, curStyle = null;
    var stream = new StringStream(text, cm.options.tabSize), style;
    var inner = cm.options.addModeClass && [null];
    if (text == "") extractLineClasses(callBlankLine(mode, state), lineClasses);
    while (!stream.eol()) {
      if (stream.pos > cm.options.maxHighlightLength) {
        flattenSpans = false;
        if (forceToEnd) processLine(cm, text, state, stream.pos);
        stream.pos = text.length;
        style = null;
      } else {
        style = extractLineClasses(readToken(mode, stream, state, inner), lineClasses);
      }
      if (inner) {
        var mName = inner[0].name;
        if (mName) style = "m-" + (style ? mName + " " + style : mName);
      }
      if (!flattenSpans || curStyle != style) {
        while (curStart < stream.start) {
          curStart = Math.min(stream.start, curStart + 50000);
          f(curStart, curStyle);
        }
        curStyle = style;
      }
      stream.start = stream.pos;
    }
    while (curStart < stream.pos) {
      // Webkit seems to refuse to render text nodes longer than 57444 characters
      var pos = Math.min(stream.pos, curStart + 50000);
      f(pos, curStyle);
      curStart = pos;
    }
  }

  // Compute a style array (an array starting with a mode generation
  // -- for invalidation -- followed by pairs of end positions and
  // style strings), which is used to highlight the tokens on the
  // line.
  function highlightLine(cm, line, state, forceToEnd) {
    // A styles array always starts with a number identifying the
    // mode/overlays that it is based on (for easy invalidation).
    var st = [cm.state.modeGen], lineClasses = {};
    // Compute the base array of styles
    runMode(cm, line.text, cm.doc.mode, state, function(end, style) {
      st.push(end, style);
    }, lineClasses, forceToEnd);

    // Run overlays, adjust style array.
    for (var o = 0; o < cm.state.overlays.length; ++o) {
      var overlay = cm.state.overlays[o], i = 1, at = 0;
      runMode(cm, line.text, overlay.mode, true, function(end, style) {
        var start = i;
        // Ensure there's a token end at the current position, and that i points at it
        while (at < end) {
          var i_end = st[i];
          if (i_end > end)
            st.splice(i, 1, end, st[i+1], i_end);
          i += 2;
          at = Math.min(end, i_end);
        }
        if (!style) return;
        if (overlay.opaque) {
          st.splice(start, i - start, end, "cm-overlay " + style);
          i = start + 2;
        } else {
          for (; start < i; start += 2) {
            var cur = st[start+1];
            st[start+1] = (cur ? cur + " " : "") + "cm-overlay " + style;
          }
        }
      }, lineClasses);
    }

    return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null};
  }

  function getLineStyles(cm, line, updateFrontier) {
    if (!line.styles || line.styles[0] != cm.state.modeGen) {
      var state = getStateBefore(cm, lineNo(line));
      var result = highlightLine(cm, line, line.text.length > cm.options.maxHighlightLength ? copyState(cm.doc.mode, state) : state);
      line.stateAfter = state;
      line.styles = result.styles;
      if (result.classes) line.styleClasses = result.classes;
      else if (line.styleClasses) line.styleClasses = null;
      if (updateFrontier === cm.doc.frontier) cm.doc.frontier++;
    }
    return line.styles;
  }

  // Lightweight form of highlight -- proceed over this line and
  // update state, but don't save a style array. Used for lines that
  // aren't currently visible.
  function processLine(cm, text, state, startAt) {
    var mode = cm.doc.mode;
    var stream = new StringStream(text, cm.options.tabSize);
    stream.start = stream.pos = startAt || 0;
    if (text == "") callBlankLine(mode, state);
    while (!stream.eol()) {
      readToken(mode, stream, state);
      stream.start = stream.pos;
    }
  }

  // Convert a style as returned by a mode (either null, or a string
  // containing one or more styles) to a CSS style. This is cached,
  // and also looks for line-wide styles.
  var styleToClassCache = {}, styleToClassCacheWithMode = {};
  function interpretTokenStyle(style, options) {
    if (!style || /^\s*$/.test(style)) return null;
    var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache;
    return cache[style] ||
      (cache[style] = style.replace(/\S+/g, "cm-$&"));
  }

  // Render the DOM representation of the text of a line. Also builds
  // up a 'line map', which points at the DOM nodes that represent
  // specific stretches of text, and is used by the measuring code.
  // The returned object contains the DOM node, this map, and
  // information about line-wide styles that were set by the mode.
  function buildLineContent(cm, lineView) {
    // The padding-right forces the element to have a 'border', which
    // is needed on Webkit to be able to get line-level bounding
    // rectangles for it (in measureChar).
    var content = elt("span", null, null, webkit ? "padding-right: .1px" : null);
    var builder = {pre: elt("pre", [content], "CodeMirror-line"), content: content,
                   col: 0, pos: 0, cm: cm,
                   trailingSpace: false,
                   splitSpaces: (ie || webkit) && cm.getOption("lineWrapping")};
    lineView.measure = {};

    // Iterate over the logical lines that make up this visual line.
    for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) {
      var line = i ? lineView.rest[i - 1] : lineView.line, order;
      builder.pos = 0;
      builder.addToken = buildToken;
      // Optionally wire in some hacks into the token-rendering
      // algorithm, to deal with browser quirks.
      if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line)))
        builder.addToken = buildTokenBadBidi(builder.addToken, order);
      builder.map = [];
      var allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line);
      insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate));
      if (line.styleClasses) {
        if (line.styleClasses.bgClass)
          builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || "");
        if (line.styleClasses.textClass)
          builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || "");
      }

      // Ensure at least a single node is present, for measuring.
      if (builder.map.length == 0)
        builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure)));

      // Store the map and a cache object for the current logical line
      if (i == 0) {
        lineView.measure.map = builder.map;
        lineView.measure.cache = {};
      } else {
        (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map);
        (lineView.measure.caches || (lineView.measure.caches = [])).push({});
      }
    }

    // See issue #2901
    if (webkit) {
      var last = builder.content.lastChild
      if (/\bcm-tab\b/.test(last.className) || (last.querySelector && last.querySelector(".cm-tab")))
        builder.content.className = "cm-tab-wrap-hack";
    }

    signal(cm, "renderLine", cm, lineView.line, builder.pre);
    if (builder.pre.className)
      builder.textClass = joinClasses(builder.pre.className, builder.textClass || "");

    return builder;
  }

  function defaultSpecialCharPlaceholder(ch) {
    var token = elt("span", "\u2022", "cm-invalidchar");
    token.title = "\\u" + ch.charCodeAt(0).toString(16);
    token.setAttribute("aria-label", token.title);
    return token;
  }

  // Build up the DOM representation for a single token, and add it to
  // the line map. Takes care to render special characters separately.
  function buildToken(builder, text, style, startStyle, endStyle, title, css) {
    if (!text) return;
    var displayText = builder.splitSpaces ? splitSpaces(text, builder.trailingSpace) : text
    var special = builder.cm.state.specialChars, mustWrap = false;
    if (!special.test(text)) {
      builder.col += text.length;
      var content = document.createTextNode(displayText);
      builder.map.push(builder.pos, builder.pos + text.length, content);
      if (ie && ie_version < 9) mustWrap = true;
      builder.pos += text.length;
    } else {
      var content = document.createDocumentFragment(), pos = 0;
      while (true) {
        special.lastIndex = pos;
        var m = special.exec(text);
        var skipped = m ? m.index - pos : text.length - pos;
        if (skipped) {
          var txt = document.createTextNode(displayText.slice(pos, pos + skipped));
          if (ie && ie_version < 9) content.appendChild(elt("span", [txt]));
          else content.appendChild(txt);
          builder.map.push(builder.pos, builder.pos + skipped, txt);
          builder.col += skipped;
          builder.pos += skipped;
        }
        if (!m) break;
        pos += skipped + 1;
        if (m[0] == "\t") {
          var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize;
          var txt = content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab"));
          txt.setAttribute("role", "presentation");
          txt.setAttribute("cm-text", "\t");
          builder.col += tabWidth;
        } else if (m[0] == "\r" || m[0] == "\n") {
          var txt = content.appendChild(elt("span", m[0] == "\r" ? "\u240d" : "\u2424", "cm-invalidchar"));
          txt.setAttribute("cm-text", m[0]);
          builder.col += 1;
        } else {
          var txt = builder.cm.options.specialCharPlaceholder(m[0]);
          txt.setAttribute("cm-text", m[0]);
          if (ie && ie_version < 9) content.appendChild(elt("span", [txt]));
          else content.appendChild(txt);
          builder.col += 1;
        }
        builder.map.push(builder.pos, builder.pos + 1, txt);
        builder.pos++;
      }
    }
    builder.trailingSpace = displayText.charCodeAt(text.length - 1) == 32
    if (style || startStyle || endStyle || mustWrap || css) {
      var fullStyle = style || "";
      if (startStyle) fullStyle += startStyle;
      if (endStyle) fullStyle += endStyle;
      var token = elt("span", [content], fullStyle, css);
      if (title) token.title = title;
      return builder.content.appendChild(token);
    }
    builder.content.appendChild(content);
  }

  function splitSpaces(text, trailingBefore) {
    if (text.length > 1 && !/  /.test(text)) return text
    var spaceBefore = trailingBefore, result = ""
    for (var i = 0; i < text.length; i++) {
      var ch = text.charAt(i)
      if (ch == " " && spaceBefore && (i == text.length - 1 || text.charCodeAt(i + 1) == 32))
        ch = "\u00a0"
      result += ch
      spaceBefore = ch == " "
    }
    return result
  }

  // Work around nonsense dimensions being reported for stretches of
  // right-to-left text.
  function buildTokenBadBidi(inner, order) {
    return function(builder, text, style, startStyle, endStyle, title, css) {
      style = style ? style + " cm-force-border" : "cm-force-border";
      var start = builder.pos, end = start + text.length;
      for (;;) {
        // Find the part that overlaps with the start of this text
        for (var i = 0; i < order.length; i++) {
          var part = order[i];
          if (part.to > start && part.from <= start) break;
        }
        if (part.to >= end) return inner(builder, text, style, startStyle, endStyle, title, css);
        inner(builder, text.slice(0, part.to - start), style, startStyle, null, title, css);
        startStyle = null;
        text = text.slice(part.to - start);
        start = part.to;
      }
    };
  }

  function buildCollapsedSpan(builder, size, marker, ignoreWidget) {
    var widget = !ignoreWidget && marker.widgetNode;
    if (widget) builder.map.push(builder.pos, builder.pos + size, widget);
    if (!ignoreWidget && builder.cm.display.input.needsContentAttribute) {
      if (!widget)
        widget = builder.content.appendChild(document.createElement("span"));
      widget.setAttribute("cm-marker", marker.id);
    }
    if (widget) {
      builder.cm.display.input.setUneditable(widget);
      builder.content.appendChild(widget);
    }
    builder.pos += size;
    builder.trailingSpace = false
  }

  // Outputs a number of spans to make up a line, taking highlighting
  // and marked text into account.
  function insertLineContent(line, builder, styles) {
    var spans = line.markedSpans, allText = line.text, at = 0;
    if (!spans) {
      for (var i = 1; i < styles.length; i+=2)
        builder.addToken(builder, allText.slice(at, at = styles[i]), interpretTokenStyle(styles[i+1], builder.cm.options));
      return;
    }

    var len = allText.length, pos = 0, i = 1, text = "", style, css;
    var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, title, collapsed;
    for (;;) {
      if (nextChange == pos) { // Update current marker set
        spanStyle = spanEndStyle = spanStartStyle = title = css = "";
        collapsed = null; nextChange = Infinity;
        var foundBookmarks = [], endStyles
        for (var j = 0; j < spans.length; ++j) {
          var sp = spans[j], m = sp.marker;
          if (m.type == "bookmark" && sp.from == pos && m.widgetNode) {
            foundBookmarks.push(m);
          } else if (sp.from <= pos && (sp.to == null || sp.to > pos || m.collapsed && sp.to == pos && sp.from == pos)) {
            if (sp.to != null && sp.to != pos && nextChange > sp.to) {
              nextChange = sp.to;
              spanEndStyle = "";
            }
            if (m.className) spanStyle += " " + m.className;
            if (m.css) css = (css ? css + ";" : "") + m.css;
            if (m.startStyle && sp.from == pos) spanStartStyle += " " + m.startStyle;
            if (m.endStyle && sp.to == nextChange) (endStyles || (endStyles = [])).push(m.endStyle, sp.to)
            if (m.title && !title) title = m.title;
            if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0))
              collapsed = sp;
          } else if (sp.from > pos && nextChange > sp.from) {
            nextChange = sp.from;
          }
        }
        if (endStyles) for (var j = 0; j < endStyles.length; j += 2)
          if (endStyles[j + 1] == nextChange) spanEndStyle += " " + endStyles[j]

        if (!collapsed || collapsed.from == pos) for (var j = 0; j < foundBookmarks.length; ++j)
          buildCollapsedSpan(builder, 0, foundBookmarks[j]);
        if (collapsed && (collapsed.from || 0) == pos) {
          buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos,
                             collapsed.marker, collapsed.from == null);
          if (collapsed.to == null) return;
          if (collapsed.to == pos) collapsed = false;
        }
      }
      if (pos >= len) break;

      var upto = Math.min(len, nextChange);
      while (true) {
        if (text) {
          var end = pos + text.length;
          if (!collapsed) {
            var tokenText = end > upto ? text.slice(0, upto - pos) : text;
            builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle,
                             spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : "", title, css);
          }
          if (end >= upto) {text = text.slice(upto - pos); pos = upto; break;}
          pos = end;
          spanStartStyle = "";
        }
        text = allText.slice(at, at = styles[i++]);
        style = interpretTokenStyle(styles[i++], builder.cm.options);
      }
    }
  }

  // DOCUMENT DATA STRUCTURE

  // By default, updates that start and end at the beginning of a line
  // are treated specially, in order to make the association of line
  // widgets and marker elements with the text behave more intuitive.
  function isWholeLineUpdate(doc, change) {
    return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == "" &&
      (!doc.cm || doc.cm.options.wholeLineUpdateBefore);
  }

  // Perform a change on the document data structure.
  function updateDoc(doc, change, markedSpans, estimateHeight) {
    function spansFor(n) {return markedSpans ? markedSpans[n] : null;}
    function update(line, text, spans) {
      updateLine(line, text, spans, estimateHeight);
      signalLater(line, "change", line, change);
    }
    function linesFor(start, end) {
      for (var i = start, result = []; i < end; ++i)
        result.push(new Line(text[i], spansFor(i), estimateHeight));
      return result;
    }

    var from = change.from, to = change.to, text = change.text;
    var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line);
    var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line;

    // Adjust the line structure
    if (change.full) {
      doc.insert(0, linesFor(0, text.length));
      doc.remove(text.length, doc.size - text.length);
    } else if (isWholeLineUpdate(doc, change)) {
      // This is a whole-line replace. Treated specially to make
      // sure line objects move the way they are supposed to.
      var added = linesFor(0, text.length - 1);
      update(lastLine, lastLine.text, lastSpans);
      if (nlines) doc.remove(from.line, nlines);
      if (added.length) doc.insert(from.line, added);
    } else if (firstLine == lastLine) {
      if (text.length == 1) {
        update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans);
      } else {
        var added = linesFor(1, text.length - 1);
        added.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight));
        update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));
        doc.insert(from.line + 1, added);
      }
    } else if (text.length == 1) {
      update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0));
      doc.remove(from.line + 1, nlines);
    } else {
      update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));
      update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans);
      var added = linesFor(1, text.length - 1);
      if (nlines > 1) doc.remove(from.line + 1, nlines - 1);
      doc.insert(from.line + 1, added);
    }

    signalLater(doc, "change", doc, change);
  }

  // The document is represented as a BTree consisting of leaves, with
  // chunk of lines in them, and branches, with up to ten leaves or
  // other branch nodes below them. The top node is always a branch
  // node, and is the document object itself (meaning it has
  // additional methods and properties).
  //
  // All nodes have parent links. The tree is used both to go from
  // line numbers to line objects, and to go from objects to numbers.
  // It also indexes by height, and is used to convert between height
  // and line object, and to find the total height of the document.
  //
  // See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html

  function LeafChunk(lines) {
    this.lines = lines;
    this.parent = null;
    for (var i = 0, height = 0; i < lines.length; ++i) {
      lines[i].parent = this;
      height += lines[i].height;
    }
    this.height = height;
  }

  LeafChunk.prototype = {
    chunkSize: function() { return this.lines.length; },
    // Remove the n lines at offset 'at'.
    removeInner: function(at, n) {
      for (var i = at, e = at + n; i < e; ++i) {
        var line = this.lines[i];
        this.height -= line.height;
        cleanUpLine(line);
        signalLater(line, "delete");
      }
      this.lines.splice(at, n);
    },
    // Helper used to collapse a small branch into a single leaf.
    collapse: function(lines) {
      lines.push.apply(lines, this.lines);
    },
    // Insert the given array of lines at offset 'at', count them as
    // having the given height.
    insertInner: function(at, lines, height) {
      this.height += height;
      this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at));
      for (var i = 0; i < lines.length; ++i) lines[i].parent = this;
    },
    // Used to iterate over a part of the tree.
    iterN: function(at, n, op) {
      for (var e = at + n; at < e; ++at)
        if (op(this.lines[at])) return true;
    }
  };

  function BranchChunk(children) {
    this.children = children;
    var size = 0, height = 0;
    for (var i = 0; i < children.length; ++i) {
      var ch = children[i];
      size += ch.chunkSize(); height += ch.height;
      ch.parent = this;
    }
    this.size = size;
    this.height = height;
    this.parent = null;
  }

  BranchChunk.prototype = {
    chunkSize: function() { return this.size; },
    removeInner: function(at, n) {
      this.size -= n;
      for (var i = 0; i < this.children.length; ++i) {
        var child = this.children[i], sz = child.chunkSize();
        if (at < sz) {
          var rm = Math.min(n, sz - at), oldHeight = child.height;
          child.removeInner(at, rm);
          this.height -= oldHeight - child.height;
          if (sz == rm) { this.children.splice(i--, 1); child.parent = null; }
          if ((n -= rm) == 0) break;
          at = 0;
        } else at -= sz;
      }
      // If the result is smaller than 25 lines, ensure that it is a
      // single leaf node.
      if (this.size - n < 25 &&
          (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) {
        var lines = [];
        this.collapse(lines);
        this.children = [new LeafChunk(lines)];
        this.children[0].parent = this;
      }
    },
    collapse: function(lines) {
      for (var i = 0; i < this.children.length; ++i) this.children[i].collapse(lines);
    },
    insertInner: function(at, lines, height) {
      this.size += lines.length;
      this.height += height;
      for (var i = 0; i < this.children.length; ++i) {
        var child = this.children[i], sz = child.chunkSize();
        if (at <= sz) {
          child.insertInner(at, lines, height);
          if (child.lines && child.lines.length > 50) {
            // To avoid memory thrashing when child.lines is huge (e.g. first view of a large file), it's never spliced.
            // Instead, small slices are taken. They're taken in order because sequential memory accesses are fastest.
            var remaining = child.lines.length % 25 + 25
            for (var pos = remaining; pos < child.lines.length;) {
              var leaf = new LeafChunk(child.lines.slice(pos, pos += 25));
              child.height -= leaf.height;
              this.children.splice(++i, 0, leaf);
              leaf.parent = this;
            }
            child.lines = child.lines.slice(0, remaining);
            this.maybeSpill();
          }
          break;
        }
        at -= sz;
      }
    },
    // When a node has grown, check whether it should be split.
    maybeSpill: function() {
      if (this.children.length <= 10) return;
      var me = this;
      do {
        var spilled = me.children.splice(me.children.length - 5, 5);
        var sibling = new BranchChunk(spilled);
        if (!me.parent) { // Become the parent node
          var copy = new BranchChunk(me.children);
          copy.parent = me;
          me.children = [copy, sibling];
          me = copy;
       } else {
          me.size -= sibling.size;
          me.height -= sibling.height;
          var myIndex = indexOf(me.parent.children, me);
          me.parent.children.splice(myIndex + 1, 0, sibling);
        }
        sibling.parent = me.parent;
      } while (me.children.length > 10);
      me.parent.maybeSpill();
    },
    iterN: function(at, n, op) {
      for (var i = 0; i < this.children.length; ++i) {
        var child = this.children[i], sz = child.chunkSize();
        if (at < sz) {
          var used = Math.min(n, sz - at);
          if (child.iterN(at, used, op)) return true;
          if ((n -= used) == 0) break;
          at = 0;
        } else at -= sz;
      }
    }
  };

  var nextDocId = 0;
  var Doc = CodeMirror.Doc = function(text, mode, firstLine, lineSep) {
    if (!(this instanceof Doc)) return new Doc(text, mode, firstLine, lineSep);
    if (firstLine == null) firstLine = 0;

    BranchChunk.call(this, [new LeafChunk([new Line("", null)])]);
    this.first = firstLine;
    this.scrollTop = this.scrollLeft = 0;
    this.cantEdit = false;
    this.cleanGeneration = 1;
    this.frontier = firstLine;
    var start = Pos(firstLine, 0);
    this.sel = simpleSelection(start);
    this.history = new History(null);
    this.id = ++nextDocId;
    this.modeOption = mode;
    this.lineSep = lineSep;
    this.extend = false;

    if (typeof text == "string") text = this.splitLines(text);
    updateDoc(this, {from: start, to: start, text: text});
    setSelection(this, simpleSelection(start), sel_dontScroll);
  };

  Doc.prototype = createObj(BranchChunk.prototype, {
    constructor: Doc,
    // Iterate over the document. Supports two forms -- with only one
    // argument, it calls that for each line in the document. With
    // three, it iterates over the range given by the first two (with
    // the second being non-inclusive).
    iter: function(from, to, op) {
      if (op) this.iterN(from - this.first, to - from, op);
      else this.iterN(this.first, this.first + this.size, from);
    },

    // Non-public interface for adding and removing lines.
    insert: function(at, lines) {
      var height = 0;
      for (var i = 0; i < lines.length; ++i) height += lines[i].height;
      this.insertInner(at - this.first, lines, height);
    },
    remove: function(at, n) { this.removeInner(at - this.first, n); },

    // From here, the methods are part of the public interface. Most
    // are also available from CodeMirror (editor) instances.

    getValue: function(lineSep) {
      var lines = getLines(this, this.first, this.first + this.size);
      if (lineSep === false) return lines;
      return lines.join(lineSep || this.lineSeparator());
    },
    setValue: docMethodOp(function(code) {
      var top = Pos(this.first, 0), last = this.first + this.size - 1;
      makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length),
                        text: this.splitLines(code), origin: "setValue", full: true}, true);
      setSelection(this, simpleSelection(top));
    }),
    replaceRange: function(code, from, to, origin) {
      from = clipPos(this, from);
      to = to ? clipPos(this, to) : from;
      replaceRange(this, code, from, to, origin);
    },
    getRange: function(from, to, lineSep) {
      var lines = getBetween(this, clipPos(this, from), clipPos(this, to));
      if (lineSep === false) return lines;
      return lines.join(lineSep || this.lineSeparator());
    },

    getLine: function(line) {var l = this.getLineHandle(line); return l && l.text;},

    getLineHandle: function(line) {if (isLine(this, line)) return getLine(this, line);},
    getLineNumber: function(line) {return lineNo(line);},

    getLineHandleVisualStart: function(line) {
      if (typeof line == "number") line = getLine(this, line);
      return visualLine(line);
    },

    lineCount: function() {return this.size;},
    firstLine: function() {return this.first;},
    lastLine: function() {return this.first + this.size - 1;},

    clipPos: function(pos) {return clipPos(this, pos);},

    getCursor: function(start) {
      var range = this.sel.primary(), pos;
      if (start == null || start == "head") pos = range.head;
      else if (start == "anchor") pos = range.anchor;
      else if (start == "end" || start == "to" || start === false) pos = range.to();
      else pos = range.from();
      return pos;
    },
    listSelections: function() { return this.sel.ranges; },
    somethingSelected: function() {return this.sel.somethingSelected();},

    setCursor: docMethodOp(function(line, ch, options) {
      setSimpleSelection(this, clipPos(this, typeof line == "number" ? Pos(line, ch || 0) : line), null, options);
    }),
    setSelection: docMethodOp(function(anchor, head, options) {
      setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options);
    }),
    extendSelection: docMethodOp(function(head, other, options) {
      extendSelection(this, clipPos(this, head), other && clipPos(this, other), options);
    }),
    extendSelections: docMethodOp(function(heads, options) {
      extendSelections(this, clipPosArray(this, heads), options);
    }),
    extendSelectionsBy: docMethodOp(function(f, options) {
      var heads = map(this.sel.ranges, f);
      extendSelections(this, clipPosArray(this, heads), options);
    }),
    setSelections: docMethodOp(function(ranges, primary, options) {
      if (!ranges.length) return;
      for (var i = 0, out = []; i < ranges.length; i++)
        out[i] = new Range(clipPos(this, ranges[i].anchor),
                           clipPos(this, ranges[i].head));
      if (primary == null) primary = Math.min(ranges.length - 1, this.sel.primIndex);
      setSelection(this, normalizeSelection(out, primary), options);
    }),
    addSelection: docMethodOp(function(anchor, head, options) {
      var ranges = this.sel.ranges.slice(0);
      ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor)));
      setSelection(this, normalizeSelection(ranges, ranges.length - 1), options);
    }),

    getSelection: function(lineSep) {
      var ranges = this.sel.ranges, lines;
      for (var i = 0; i < ranges.length; i++) {
        var sel = getBetween(this, ranges[i].from(), ranges[i].to());
        lines = lines ? lines.concat(sel) : sel;
      }
      if (lineSep === false) return lines;
      else return lines.join(lineSep || this.lineSeparator());
    },
    getSelections: function(lineSep) {
      var parts = [], ranges = this.sel.ranges;
      for (var i = 0; i < ranges.length; i++) {
        var sel = getBetween(this, ranges[i].from(), ranges[i].to());
        if (lineSep !== false) sel = sel.join(lineSep || this.lineSeparator());
        parts[i] = sel;
      }
      return parts;
    },
    replaceSelection: function(code, collapse, origin) {
      var dup = [];
      for (var i = 0; i < this.sel.ranges.length; i++)
        dup[i] = code;
      this.replaceSelections(dup, collapse, origin || "+input");
    },
    replaceSelections: docMethodOp(function(code, collapse, origin) {
      var changes = [], sel = this.sel;
      for (var i = 0; i < sel.ranges.length; i++) {
        var range = sel.ranges[i];
        changes[i] = {from: range.from(), to: range.to(), text: this.splitLines(code[i]), origin: origin};
      }
      var newSel = collapse && collapse != "end" && computeReplacedSel(this, changes, collapse);
      for (var i = changes.length - 1; i >= 0; i--)
        makeChange(this, changes[i]);
      if (newSel) setSelectionReplaceHistory(this, newSel);
      else if (this.cm) ensureCursorVisible(this.cm);
    }),
    undo: docMethodOp(function() {makeChangeFromHistory(this, "undo");}),
    redo: docMethodOp(function() {makeChangeFromHistory(this, "redo");}),
    undoSelection: docMethodOp(function() {makeChangeFromHistory(this, "undo", true);}),
    redoSelection: docMethodOp(function() {makeChangeFromHistory(this, "redo", true);}),

    setExtending: function(val) {this.extend = val;},
    getExtending: function() {return this.extend;},

    historySize: function() {
      var hist = this.history, done = 0, undone = 0;
      for (var i = 0; i < hist.done.length; i++) if (!hist.done[i].ranges) ++done;
      for (var i = 0; i < hist.undone.length; i++) if (!hist.undone[i].ranges) ++undone;
      return {undo: done, redo: undone};
    },
    clearHistory: function() {this.history = new History(this.history.maxGeneration);},

    markClean: function() {
      this.cleanGeneration = this.changeGeneration(true);
    },
    changeGeneration: function(forceSplit) {
      if (forceSplit)
        this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null;
      return this.history.generation;
    },
    isClean: function (gen) {
      return this.history.generation == (gen || this.cleanGeneration);
    },

    getHistory: function() {
      return {done: copyHistoryArray(this.history.done),
              undone: copyHistoryArray(this.history.undone)};
    },
    setHistory: function(histData) {
      var hist = this.history = new History(this.history.maxGeneration);
      hist.done = copyHistoryArray(histData.done.slice(0), null, true);
      hist.undone = copyHistoryArray(histData.undone.slice(0), null, true);
    },

    addLineClass: docMethodOp(function(handle, where, cls) {
      return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function(line) {
        var prop = where == "text" ? "textClass"
                 : where == "background" ? "bgClass"
                 : where == "gutter" ? "gutterClass" : "wrapClass";
        if (!line[prop]) line[prop] = cls;
        else if (classTest(cls).test(line[prop])) return false;
        else line[prop] += " " + cls;
        return true;
      });
    }),
    removeLineClass: docMethodOp(function(handle, where, cls) {
      return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function(line) {
        var prop = where == "text" ? "textClass"
                 : where == "background" ? "bgClass"
                 : where == "gutter" ? "gutterClass" : "wrapClass";
        var cur = line[prop];
        if (!cur) return false;
        else if (cls == null) line[prop] = null;
        else {
          var found = cur.match(classTest(cls));
          if (!found) return false;
          var end = found.index + found[0].length;
          line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? "" : " ") + cur.slice(end) || null;
        }
        return true;
      });
    }),

    addLineWidget: docMethodOp(function(handle, node, options) {
      return addLineWidget(this, handle, node, options);
    }),
    removeLineWidget: function(widget) { widget.clear(); },

    markText: function(from, to, options) {
      return markText(this, clipPos(this, from), clipPos(this, to), options, options && options.type || "range");
    },
    setBookmark: function(pos, options) {
      var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options),
                      insertLeft: options && options.insertLeft,
                      clearWhenEmpty: false, shared: options && options.shared,
                      handleMouseEvents: options && options.handleMouseEvents};
      pos = clipPos(this, pos);
      return markText(this, pos, pos, realOpts, "bookmark");
    },
    findMarksAt: function(pos) {
      pos = clipPos(this, pos);
      var markers = [], spans = getLine(this, pos.line).markedSpans;
      if (spans) for (var i = 0; i < spans.length; ++i) {
        var span = spans[i];
        if ((span.from == null || span.from <= pos.ch) &&
            (span.to == null || span.to >= pos.ch))
          markers.push(span.marker.parent || span.marker);
      }
      return markers;
    },
    findMarks: function(from, to, filter) {
      from = clipPos(this, from); to = clipPos(this, to);
      var found = [], lineNo = from.line;
      this.iter(from.line, to.line + 1, function(line) {
        var spans = line.markedSpans;
        if (spans) for (var i = 0; i < spans.length; i++) {
          var span = spans[i];
          if (!(span.to != null && lineNo == from.line && from.ch >= span.to ||
                span.from == null && lineNo != from.line ||
                span.from != null && lineNo == to.line && span.from >= to.ch) &&
              (!filter || filter(span.marker)))
            found.push(span.marker.parent || span.marker);
        }
        ++lineNo;
      });
      return found;
    },
    getAllMarks: function() {
      var markers = [];
      this.iter(function(line) {
        var sps = line.markedSpans;
        if (sps) for (var i = 0; i < sps.length; ++i)
          if (sps[i].from != null) markers.push(sps[i].marker);
      });
      return markers;
    },

    posFromIndex: function(off) {
      var ch, lineNo = this.first, sepSize = this.lineSeparator().length;
      this.iter(function(line) {
        var sz = line.text.length + sepSize;
        if (sz > off) { ch = off; return true; }
        off -= sz;
        ++lineNo;
      });
      return clipPos(this, Pos(lineNo, ch));
    },
    indexFromPos: function (coords) {
      coords = clipPos(this, coords);
      var index = coords.ch;
      if (coords.line < this.first || coords.ch < 0) return 0;
      var sepSize = this.lineSeparator().length;
      this.iter(this.first, coords.line, function (line) {
        index += line.text.length + sepSize;
      });
      return index;
    },

    copy: function(copyHistory) {
      var doc = new Doc(getLines(this, this.first, this.first + this.size),
                        this.modeOption, this.first, this.lineSep);
      doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft;
      doc.sel = this.sel;
      doc.extend = false;
      if (copyHistory) {
        doc.history.undoDepth = this.history.undoDepth;
        doc.setHistory(this.getHistory());
      }
      return doc;
    },

    linkedDoc: function(options) {
      if (!options) options = {};
      var from = this.first, to = this.first + this.size;
      if (options.from != null && options.from > from) from = options.from;
      if (options.to != null && options.to < to) to = options.to;
      var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from, this.lineSep);
      if (options.sharedHist) copy.history = this.history;
      (this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist});
      copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}];
      copySharedMarkers(copy, findSharedMarkers(this));
      return copy;
    },
    unlinkDoc: function(other) {
      if (other instanceof CodeMirror) other = other.doc;
      if (this.linked) for (var i = 0; i < this.linked.length; ++i) {
        var link = this.linked[i];
        if (link.doc != other) continue;
        this.linked.splice(i, 1);
        other.unlinkDoc(this);
        detachSharedMarkers(findSharedMarkers(this));
        break;
      }
      // If the histories were shared, split them again
      if (other.history == this.history) {
        var splitIds = [other.id];
        linkedDocs(other, function(doc) {splitIds.push(doc.id);}, true);
        other.history = new History(null);
        other.history.done = copyHistoryArray(this.history.done, splitIds);
        other.history.undone = copyHistoryArray(this.history.undone, splitIds);
      }
    },
    iterLinkedDocs: function(f) {linkedDocs(this, f);},

    getMode: function() {return this.mode;},
    getEditor: function() {return this.cm;},

    splitLines: function(str) {
      if (this.lineSep) return str.split(this.lineSep);
      return splitLinesAuto(str);
    },
    lineSeparator: function() { return this.lineSep || "\n"; }
  });

  // Public alias.
  Doc.prototype.eachLine = Doc.prototype.iter;

  // Set up methods on CodeMirror's prototype to redirect to the editor's document.
  var dontDelegate = "iter insert remove copy getEditor constructor".split(" ");
  for (var prop in Doc.prototype) if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0)
    CodeMirror.prototype[prop] = (function(method) {
      return function() {return method.apply(this.doc, arguments);};
    })(Doc.prototype[prop]);

  eventMixin(Doc);

  // Call f for all linked documents.
  function linkedDocs(doc, f, sharedHistOnly) {
    function propagate(doc, skip, sharedHist) {
      if (doc.linked) for (var i = 0; i < doc.linked.length; ++i) {
        var rel = doc.linked[i];
        if (rel.doc == skip) continue;
        var shared = sharedHist && rel.sharedHist;
        if (sharedHistOnly && !shared) continue;
        f(rel.doc, shared);
        propagate(rel.doc, doc, shared);
      }
    }
    propagate(doc, null, true);
  }

  // Attach a document to an editor.
  function attachDoc(cm, doc) {
    if (doc.cm) throw new Error("This document is already in use.");
    cm.doc = doc;
    doc.cm = cm;
    estimateLineHeights(cm);
    loadMode(cm);
    if (!cm.options.lineWrapping) findMaxLine(cm);
    cm.options.mode = doc.modeOption;
    regChange(cm);
  }

  // LINE UTILITIES

  // Find the line object corresponding to the given line number.
  function getLine(doc, n) {
    n -= doc.first;
    if (n < 0 || n >= doc.size) throw new Error("There is no line " + (n + doc.first) + " in the document.");
    for (var chunk = doc; !chunk.lines;) {
      for (var i = 0;; ++i) {
        var child = chunk.children[i], sz = child.chunkSize();
        if (n < sz) { chunk = child; break; }
        n -= sz;
      }
    }
    return chunk.lines[n];
  }

  // Get the part of a document between two positions, as an array of
  // strings.
  function getBetween(doc, start, end) {
    var out = [], n = start.line;
    doc.iter(start.line, end.line + 1, function(line) {
      var text = line.text;
      if (n == end.line) text = text.slice(0, end.ch);
      if (n == start.line) text = text.slice(start.ch);
      out.push(text);
      ++n;
    });
    return out;
  }
  // Get the lines between from and to, as array of strings.
  function getLines(doc, from, to) {
    var out = [];
    doc.iter(from, to, function(line) { out.push(line.text); });
    return out;
  }

  // Update the height of a line, propagating the height change
  // upwards to parent nodes.
  function updateLineHeight(line, height) {
    var diff = height - line.height;
    if (diff) for (var n = line; n; n = n.parent) n.height += diff;
  }

  // Given a line object, find its line number by walking up through
  // its parent links.
  function lineNo(line) {
    if (line.parent == null) return null;
    var cur = line.parent, no = indexOf(cur.lines, line);
    for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) {
      for (var i = 0;; ++i) {
        if (chunk.children[i] == cur) break;
        no += chunk.children[i].chunkSize();
      }
    }
    return no + cur.first;
  }

  // Find the line at the given vertical position, using the height
  // information in the document tree.
  function lineAtHeight(chunk, h) {
    var n = chunk.first;
    outer: do {
      for (var i = 0; i < chunk.children.length; ++i) {
        var child = chunk.children[i], ch = child.height;
        if (h < ch) { chunk = child; continue outer; }
        h -= ch;
        n += child.chunkSize();
      }
      return n;
    } while (!chunk.lines);
    for (var i = 0; i < chunk.lines.length; ++i) {
      var line = chunk.lines[i], lh = line.height;
      if (h < lh) break;
      h -= lh;
    }
    return n + i;
  }


  // Find the height above the given line.
  function heightAtLine(lineObj) {
    lineObj = visualLine(lineObj);

    var h = 0, chunk = lineObj.parent;
    for (var i = 0; i < chunk.lines.length; ++i) {
      var line = chunk.lines[i];
      if (line == lineObj) break;
      else h += line.height;
    }
    for (var p = chunk.parent; p; chunk = p, p = chunk.parent) {
      for (var i = 0; i < p.children.length; ++i) {
        var cur = p.children[i];
        if (cur == chunk) break;
        else h += cur.height;
      }
    }
    return h;
  }

  // Get the bidi ordering for the given line (and cache it). Returns
  // false for lines that are fully left-to-right, and an array of
  // BidiSpan objects otherwise.
  function getOrder(line) {
    var order = line.order;
    if (order == null) order = line.order = bidiOrdering(line.text);
    return order;
  }

  // HISTORY

  function History(startGen) {
    // Arrays of change events and selections. Doing something adds an
    // event to done and clears undo. Undoing moves events from done
    // to undone, redoing moves them in the other direction.
    this.done = []; this.undone = [];
    this.undoDepth = Infinity;
    // Used to track when changes can be merged into a single undo
    // event
    this.lastModTime = this.lastSelTime = 0;
    this.lastOp = this.lastSelOp = null;
    this.lastOrigin = this.lastSelOrigin = null;
    // Used by the isClean() method
    this.generation = this.maxGeneration = startGen || 1;
  }

  // Create a history change event from an updateDoc-style change
  // object.
  function historyChangeFromChange(doc, change) {
    var histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)};
    attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);
    linkedDocs(doc, function(doc) {attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);}, true);
    return histChange;
  }

  // Pop all selection events off the end of a history array. Stop at
  // a change event.
  function clearSelectionEvents(array) {
    while (array.length) {
      var last = lst(array);
      if (last.ranges) array.pop();
      else break;
    }
  }

  // Find the top change event in the history. Pop off selection
  // events that are in the way.
  function lastChangeEvent(hist, force) {
    if (force) {
      clearSelectionEvents(hist.done);
      return lst(hist.done);
    } else if (hist.done.length && !lst(hist.done).ranges) {
      return lst(hist.done);
    } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) {
      hist.done.pop();
      return lst(hist.done);
    }
  }

  // Register a change in the history. Merges changes that are within
  // a single operation, or are close together with an origin that
  // allows merging (starting with "+") into a single event.
  function addChangeToHistory(doc, change, selAfter, opId) {
    var hist = doc.history;
    hist.undone.length = 0;
    var time = +new Date, cur;

    if ((hist.lastOp == opId ||
         hist.lastOrigin == change.origin && change.origin &&
         ((change.origin.charAt(0) == "+" && doc.cm && hist.lastModTime > time - doc.cm.options.historyEventDelay) ||
          change.origin.charAt(0) == "*")) &&
        (cur = lastChangeEvent(hist, hist.lastOp == opId))) {
      // Merge this change into the last event
      var last = lst(cur.changes);
      if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) {
        // Optimized case for simple insertion -- don't want to add
        // new changesets for every character typed
        last.to = changeEnd(change);
      } else {
        // Add new sub-event
        cur.changes.push(historyChangeFromChange(doc, change));
      }
    } else {
      // Can not be merged, start a new event.
      var before = lst(hist.done);
      if (!before || !before.ranges)
        pushSelectionToHistory(doc.sel, hist.done);
      cur = {changes: [historyChangeFromChange(doc, change)],
             generation: hist.generation};
      hist.done.push(cur);
      while (hist.done.length > hist.undoDepth) {
        hist.done.shift();
        if (!hist.done[0].ranges) hist.done.shift();
      }
    }
    hist.done.push(selAfter);
    hist.generation = ++hist.maxGeneration;
    hist.lastModTime = hist.lastSelTime = time;
    hist.lastOp = hist.lastSelOp = opId;
    hist.lastOrigin = hist.lastSelOrigin = change.origin;

    if (!last) signal(doc, "historyAdded");
  }

  function selectionEventCanBeMerged(doc, origin, prev, sel) {
    var ch = origin.charAt(0);
    return ch == "*" ||
      ch == "+" &&
      prev.ranges.length == sel.ranges.length &&
      prev.somethingSelected() == sel.somethingSelected() &&
      new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500);
  }

  // Called whenever the selection changes, sets the new selection as
  // the pending selection in the history, and pushes the old pending
  // selection into the 'done' array when it was significantly
  // different (in number of selected ranges, emptiness, or time).
  function addSelectionToHistory(doc, sel, opId, options) {
    var hist = doc.history, origin = options && options.origin;

    // A new event is started when the previous origin does not match
    // the current, or the origins don't allow matching. Origins
    // starting with * are always merged, those starting with + are
    // merged when similar and close together in time.
    if (opId == hist.lastSelOp ||
        (origin && hist.lastSelOrigin == origin &&
         (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin ||
          selectionEventCanBeMerged(doc, origin, lst(hist.done), sel))))
      hist.done[hist.done.length - 1] = sel;
    else
      pushSelectionToHistory(sel, hist.done);

    hist.lastSelTime = +new Date;
    hist.lastSelOrigin = origin;
    hist.lastSelOp = opId;
    if (options && options.clearRedo !== false)
      clearSelectionEvents(hist.undone);
  }

  function pushSelectionToHistory(sel, dest) {
    var top = lst(dest);
    if (!(top && top.ranges && top.equals(sel)))
      dest.push(sel);
  }

  // Used to store marked span information in the history.
  function attachLocalSpans(doc, change, from, to) {
    var existing = change["spans_" + doc.id], n = 0;
    doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function(line) {
      if (line.markedSpans)
        (existing || (existing = change["spans_" + doc.id] = {}))[n] = line.markedSpans;
      ++n;
    });
  }

  // When un/re-doing restores text containing marked spans, those
  // that have been explicitly cleared should not be restored.
  function removeClearedSpans(spans) {
    if (!spans) return null;
    for (var i = 0, out; i < spans.length; ++i) {
      if (spans[i].marker.explicitlyCleared) { if (!out) out = spans.slice(0, i); }
      else if (out) out.push(spans[i]);
    }
    return !out ? spans : out.length ? out : null;
  }

  // Retrieve and filter the old marked spans stored in a change event.
  function getOldSpans(doc, change) {
    var found = change["spans_" + doc.id];
    if (!found) return null;
    for (var i = 0, nw = []; i < change.text.length; ++i)
      nw.push(removeClearedSpans(found[i]));
    return nw;
  }

  // Used both to provide a JSON-safe object in .getHistory, and, when
  // detaching a document, to split the history in two
  function copyHistoryArray(events, newGroup, instantiateSel) {
    for (var i = 0, copy = []; i < events.length; ++i) {
      var event = events[i];
      if (event.ranges) {
        copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event);
        continue;
      }
      var changes = event.changes, newChanges = [];
      copy.push({changes: newChanges});
      for (var j = 0; j < changes.length; ++j) {
        var change = changes[j], m;
        newChanges.push({from: change.from, to: change.to, text: change.text});
        if (newGroup) for (var prop in change) if (m = prop.match(/^spans_(\d+)$/)) {
          if (indexOf(newGroup, Number(m[1])) > -1) {
            lst(newChanges)[prop] = change[prop];
            delete change[prop];
          }
        }
      }
    }
    return copy;
  }

  // Rebasing/resetting history to deal with externally-sourced changes

  function rebaseHistSelSingle(pos, from, to, diff) {
    if (to < pos.line) {
      pos.line += diff;
    } else if (from < pos.line) {
      pos.line = from;
      pos.ch = 0;
    }
  }

  // Tries to rebase an array of history events given a change in the
  // document. If the change touches the same lines as the event, the
  // event, and everything 'behind' it, is discarded. If the change is
  // before the event, the event's positions are updated. Uses a
  // copy-on-write scheme for the positions, to avoid having to
  // reallocate them all on every rebase, but also avoid problems with
  // shared position objects being unsafely updated.
  function rebaseHistArray(array, from, to, diff) {
    for (var i = 0; i < array.length; ++i) {
      var sub = array[i], ok = true;
      if (sub.ranges) {
        if (!sub.copied) { sub = array[i] = sub.deepCopy(); sub.copied = true; }
        for (var j = 0; j < sub.ranges.length; j++) {
          rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff);
          rebaseHistSelSingle(sub.ranges[j].head, from, to, diff);
        }
        continue;
      }
      for (var j = 0; j < sub.changes.length; ++j) {
        var cur = sub.changes[j];
        if (to < cur.from.line) {
          cur.from = Pos(cur.from.line + diff, cur.from.ch);
          cur.to = Pos(cur.to.line + diff, cur.to.ch);
        } else if (from <= cur.to.line) {
          ok = false;
          break;
        }
      }
      if (!ok) {
        array.splice(0, i + 1);
        i = 0;
      }
    }
  }

  function rebaseHist(hist, change) {
    var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1;
    rebaseHistArray(hist.done, from, to, diff);
    rebaseHistArray(hist.undone, from, to, diff);
  }

  // EVENT UTILITIES

  // Due to the fact that we still support jurassic IE versions, some
  // compatibility wrappers are needed.

  var e_preventDefault = CodeMirror.e_preventDefault = function(e) {
    if (e.preventDefault) e.preventDefault();
    else e.returnValue = false;
  };
  var e_stopPropagation = CodeMirror.e_stopPropagation = function(e) {
    if (e.stopPropagation) e.stopPropagation();
    else e.cancelBubble = true;
  };
  function e_defaultPrevented(e) {
    return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false;
  }
  var e_stop = CodeMirror.e_stop = function(e) {e_preventDefault(e); e_stopPropagation(e);};

  function e_target(e) {return e.target || e.srcElement;}
  function e_button(e) {
    var b = e.which;
    if (b == null) {
      if (e.button & 1) b = 1;
      else if (e.button & 2) b = 3;
      else if (e.button & 4) b = 2;
    }
    if (mac && e.ctrlKey && b == 1) b = 3;
    return b;
  }

  // EVENT HANDLING

  // Lightweight event framework. on/off also work on DOM nodes,
  // registering native DOM handlers.

  var on = CodeMirror.on = function(emitter, type, f) {
    if (emitter.addEventListener)
      emitter.addEventListener(type, f, false);
    else if (emitter.attachEvent)
      emitter.attachEvent("on" + type, f);
    else {
      var map = emitter._handlers || (emitter._handlers = {});
      var arr = map[type] || (map[type] = []);
      arr.push(f);
    }
  };

  var noHandlers = []
  function getHandlers(emitter, type, copy) {
    var arr = emitter._handlers && emitter._handlers[type]
    if (copy) return arr && arr.length > 0 ? arr.slice() : noHandlers
    else return arr || noHandlers
  }

  var off = CodeMirror.off = function(emitter, type, f) {
    if (emitter.removeEventListener)
      emitter.removeEventListener(type, f, false);
    else if (emitter.detachEvent)
      emitter.detachEvent("on" + type, f);
    else {
      var handlers = getHandlers(emitter, type, false)
      for (var i = 0; i < handlers.length; ++i)
        if (handlers[i] == f) { handlers.splice(i, 1); break; }
    }
  };

  var signal = CodeMirror.signal = function(emitter, type /*, values...*/) {
    var handlers = getHandlers(emitter, type, true)
    if (!handlers.length) return;
    var args = Array.prototype.slice.call(arguments, 2);
    for (var i = 0; i < handlers.length; ++i) handlers[i].apply(null, args);
  };

  var orphanDelayedCallbacks = null;

  // Often, we want to signal events at a point where we are in the
  // middle of some work, but don't want the handler to start calling
  // other methods on the editor, which might be in an inconsistent
  // state or simply not expect any other events to happen.
  // signalLater looks whether there are any handlers, and schedules
  // them to be executed when the last operation ends, or, if no
  // operation is active, when a timeout fires.
  function signalLater(emitter, type /*, values...*/) {
    var arr = getHandlers(emitter, type, false)
    if (!arr.length) return;
    var args = Array.prototype.slice.call(arguments, 2), list;
    if (operationGroup) {
      list = operationGroup.delayedCallbacks;
    } else if (orphanDelayedCallbacks) {
      list = orphanDelayedCallbacks;
    } else {
      list = orphanDelayedCallbacks = [];
      setTimeout(fireOrphanDelayed, 0);
    }
    function bnd(f) {return function(){f.apply(null, args);};};
    for (var i = 0; i < arr.length; ++i)
      list.push(bnd(arr[i]));
  }

  function fireOrphanDelayed() {
    var delayed = orphanDelayedCallbacks;
    orphanDelayedCallbacks = null;
    for (var i = 0; i < delayed.length; ++i) delayed[i]();
  }

  // The DOM events that CodeMirror handles can be overridden by
  // registering a (non-DOM) handler on the editor for the event name,
  // and preventDefault-ing the event in that handler.
  function signalDOMEvent(cm, e, override) {
    if (typeof e == "string")
      e = {type: e, preventDefault: function() { this.defaultPrevented = true; }};
    signal(cm, override || e.type, cm, e);
    return e_defaultPrevented(e) || e.codemirrorIgnore;
  }

  function signalCursorActivity(cm) {
    var arr = cm._handlers && cm._handlers.cursorActivity;
    if (!arr) return;
    var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []);
    for (var i = 0; i < arr.length; ++i) if (indexOf(set, arr[i]) == -1)
      set.push(arr[i]);
  }

  function hasHandler(emitter, type) {
    return getHandlers(emitter, type).length > 0
  }

  // Add on and off methods to a constructor's prototype, to make
  // registering events on such objects more convenient.
  function eventMixin(ctor) {
    ctor.prototype.on = function(type, f) {on(this, type, f);};
    ctor.prototype.off = function(type, f) {off(this, type, f);};
  }

  // MISC UTILITIES

  // Number of pixels added to scroller and sizer to hide scrollbar
  var scrollerGap = 30;

  // Returned or thrown by various protocols to signal 'I'm not
  // handling this'.
  var Pass = CodeMirror.Pass = {toString: function(){return "CodeMirror.Pass";}};

  // Reused option objects for setSelection & friends
  var sel_dontScroll = {scroll: false}, sel_mouse = {origin: "*mouse"}, sel_move = {origin: "+move"};

  function Delayed() {this.id = null;}
  Delayed.prototype.set = function(ms, f) {
    clearTimeout(this.id);
    this.id = setTimeout(f, ms);
  };

  // Counts the column offset in a string, taking tabs into account.
  // Used mostly to find indentation.
  var countColumn = CodeMirror.countColumn = function(string, end, tabSize, startIndex, startValue) {
    if (end == null) {
      end = string.search(/[^\s\u00a0]/);
      if (end == -1) end = string.length;
    }
    for (var i = startIndex || 0, n = startValue || 0;;) {
      var nextTab = string.indexOf("\t", i);
      if (nextTab < 0 || nextTab >= end)
        return n + (end - i);
      n += nextTab - i;
      n += tabSize - (n % tabSize);
      i = nextTab + 1;
    }
  };

  // The inverse of countColumn -- find the offset that corresponds to
  // a particular column.
  var findColumn = CodeMirror.findColumn = function(string, goal, tabSize) {
    for (var pos = 0, col = 0;;) {
      var nextTab = string.indexOf("\t", pos);
      if (nextTab == -1) nextTab = string.length;
      var skipped = nextTab - pos;
      if (nextTab == string.length || col + skipped >= goal)
        return pos + Math.min(skipped, goal - col);
      col += nextTab - pos;
      col += tabSize - (col % tabSize);
      pos = nextTab + 1;
      if (col >= goal) return pos;
    }
  }

  var spaceStrs = [""];
  function spaceStr(n) {
    while (spaceStrs.length <= n)
      spaceStrs.push(lst(spaceStrs) + " ");
    return spaceStrs[n];
  }

  function lst(arr) { return arr[arr.length-1]; }

  var selectInput = function(node) { node.select(); };
  if (ios) // Mobile Safari apparently has a bug where select() is broken.
    selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length; };
  else if (ie) // Suppress mysterious IE10 errors
    selectInput = function(node) { try { node.select(); } catch(_e) {} };

  function indexOf(array, elt) {
    for (var i = 0; i < array.length; ++i)
      if (array[i] == elt) return i;
    return -1;
  }
  function map(array, f) {
    var out = [];
    for (var i = 0; i < array.length; i++) out[i] = f(array[i], i);
    return out;
  }

  function insertSorted(array, value, score) {
    var pos = 0, priority = score(value)
    while (pos < array.length && score(array[pos]) <= priority) pos++
    array.splice(pos, 0, value)
  }

  function nothing() {}

  function createObj(base, props) {
    var inst;
    if (Object.create) {
      inst = Object.create(base);
    } else {
      nothing.prototype = base;
      inst = new nothing();
    }
    if (props) copyObj(props, inst);
    return inst;
  };

  function copyObj(obj, target, overwrite) {
    if (!target) target = {};
    for (var prop in obj)
      if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop)))
        target[prop] = obj[prop];
    return target;
  }

  function bind(f) {
    var args = Array.prototype.slice.call(arguments, 1);
    return function(){return f.apply(null, args);};
  }

  var nonASCIISingleCaseWordChar = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;
  var isWordCharBasic = CodeMirror.isWordChar = function(ch) {
    return /\w/.test(ch) || ch > "\x80" &&
      (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch));
  };
  function isWordChar(ch, helper) {
    if (!helper) return isWordCharBasic(ch);
    if (helper.source.indexOf("\\w") > -1 && isWordCharBasic(ch)) return true;
    return helper.test(ch);
  }

  function isEmpty(obj) {
    for (var n in obj) if (obj.hasOwnProperty(n) && obj[n]) return false;
    return true;
  }

  // Extending unicode characters. A series of a non-extending char +
  // any number of extending chars is treated as a single unit as far
  // as editing and measuring is concerned. This is not fully correct,
  // since some scripts/fonts/browsers also treat other configurations
  // of code points as a group.
  var extendingChars = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;
  function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch); }

  // DOM UTILITIES

  function elt(tag, content, className, style) {
    var e = document.createElement(tag);
    if (className) e.className = className;
    if (style) e.style.cssText = style;
    if (typeof content == "string") e.appendChild(document.createTextNode(content));
    else if (content) for (var i = 0; i < content.length; ++i) e.appendChild(content[i]);
    return e;
  }

  var range;
  if (document.createRange) range = function(node, start, end, endNode) {
    var r = document.createRange();
    r.setEnd(endNode || node, end);
    r.setStart(node, start);
    return r;
  };
  else range = function(node, start, end) {
    var r = document.body.createTextRange();
    try { r.moveToElementText(node.parentNode); }
    catch(e) { return r; }
    r.collapse(true);
    r.moveEnd("character", end);
    r.moveStart("character", start);
    return r;
  };

  function removeChildren(e) {
    for (var count = e.childNodes.length; count > 0; --count)
      e.removeChild(e.firstChild);
    return e;
  }

  function removeChildrenAndAdd(parent, e) {
    return removeChildren(parent).appendChild(e);
  }

  var contains = CodeMirror.contains = function(parent, child) {
    if (child.nodeType == 3) // Android browser always returns false when child is a textnode
      child = child.parentNode;
    if (parent.contains)
      return parent.contains(child);
    do {
      if (child.nodeType == 11) child = child.host;
      if (child == parent) return true;
    } while (child = child.parentNode);
  };

  function activeElt() {
    var activeElement = document.activeElement;
    while (activeElement && activeElement.root && activeElement.root.activeElement)
      activeElement = activeElement.root.activeElement;
    return activeElement;
  }
  // Older versions of IE throws unspecified error when touching
  // document.activeElement in some cases (during loading, in iframe)
  if (ie && ie_version < 11) activeElt = function() {
    try { return document.activeElement; }
    catch(e) { return document.body; }
  };

  function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*"); }
  var rmClass = CodeMirror.rmClass = function(node, cls) {
    var current = node.className;
    var match = classTest(cls).exec(current);
    if (match) {
      var after = current.slice(match.index + match[0].length);
      node.className = current.slice(0, match.index) + (after ? match[1] + after : "");
    }
  };
  var addClass = CodeMirror.addClass = function(node, cls) {
    var current = node.className;
    if (!classTest(cls).test(current)) node.className += (current ? " " : "") + cls;
  };
  function joinClasses(a, b) {
    var as = a.split(" ");
    for (var i = 0; i < as.length; i++)
      if (as[i] && !classTest(as[i]).test(b)) b += " " + as[i];
    return b;
  }

  // WINDOW-WIDE EVENTS

  // These must be handled carefully, because naively registering a
  // handler for each editor will cause the editors to never be
  // garbage collected.

  function forEachCodeMirror(f) {
    if (!document.body.getElementsByClassName) return;
    var byClass = document.body.getElementsByClassName("CodeMirror");
    for (var i = 0; i < byClass.length; i++) {
      var cm = byClass[i].CodeMirror;
      if (cm) f(cm);
    }
  }

  var globalsRegistered = false;
  function ensureGlobalHandlers() {
    if (globalsRegistered) return;
    registerGlobalHandlers();
    globalsRegistered = true;
  }
  function registerGlobalHandlers() {
    // When the window resizes, we need to refresh active editors.
    var resizeTimer;
    on(window, "resize", function() {
      if (resizeTimer == null) resizeTimer = setTimeout(function() {
        resizeTimer = null;
        forEachCodeMirror(onResize);
      }, 100);
    });
    // When the window loses focus, we want to show the editor as blurred
    on(window, "blur", function() {
      forEachCodeMirror(onBlur);
    });
  }

  // FEATURE DETECTION

  // Detect drag-and-drop
  var dragAndDrop = function() {
    // There is *some* kind of drag-and-drop support in IE6-8, but I
    // couldn't get it to work yet.
    if (ie && ie_version < 9) return false;
    var div = elt('div');
    return "draggable" in div || "dragDrop" in div;
  }();

  var zwspSupported;
  function zeroWidthElement(measure) {
    if (zwspSupported == null) {
      var test = elt("span", "\u200b");
      removeChildrenAndAdd(measure, elt("span", [test, document.createTextNode("x")]));
      if (measure.firstChild.offsetHeight != 0)
        zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8);
    }
    var node = zwspSupported ? elt("span", "\u200b") :
      elt("span", "\u00a0", null, "display: inline-block; width: 1px; margin-right: -1px");
    node.setAttribute("cm-text", "");
    return node;
  }

  // Feature-detect IE's crummy client rect reporting for bidi text
  var badBidiRects;
  function hasBadBidiRects(measure) {
    if (badBidiRects != null) return badBidiRects;
    var txt = removeChildrenAndAdd(measure, document.createTextNode("A\u062eA"));
    var r0 = range(txt, 0, 1).getBoundingClientRect();
    var r1 = range(txt, 1, 2).getBoundingClientRect();
    removeChildren(measure);
    if (!r0 || r0.left == r0.right) return false; // Safari returns null in some cases (#2780)
    return badBidiRects = (r1.right - r0.right < 3);
  }

  // See if "".split is the broken IE version, if so, provide an
  // alternative way to split lines.
  var splitLinesAuto = CodeMirror.splitLines = "\n\nb".split(/\n/).length != 3 ? function(string) {
    var pos = 0, result = [], l = string.length;
    while (pos <= l) {
      var nl = string.indexOf("\n", pos);
      if (nl == -1) nl = string.length;
      var line = string.slice(pos, string.charAt(nl - 1) == "\r" ? nl - 1 : nl);
      var rt = line.indexOf("\r");
      if (rt != -1) {
        result.push(line.slice(0, rt));
        pos += rt + 1;
      } else {
        result.push(line);
        pos = nl + 1;
      }
    }
    return result;
  } : function(string){return string.split(/\r\n?|\n/);};

  var hasSelection = window.getSelection ? function(te) {
    try { return te.selectionStart != te.selectionEnd; }
    catch(e) { return false; }
  } : function(te) {
    try {var range = te.ownerDocument.selection.createRange();}
    catch(e) {}
    if (!range || range.parentElement() != te) return false;
    return range.compareEndPoints("StartToEnd", range) != 0;
  };

  var hasCopyEvent = (function() {
    var e = elt("div");
    if ("oncopy" in e) return true;
    e.setAttribute("oncopy", "return;");
    return typeof e.oncopy == "function";
  })();

  var badZoomedRects = null;
  function hasBadZoomedRects(measure) {
    if (badZoomedRects != null) return badZoomedRects;
    var node = removeChildrenAndAdd(measure, elt("span", "x"));
    var normal = node.getBoundingClientRect();
    var fromRange = range(node, 0, 1).getBoundingClientRect();
    return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1;
  }

  // KEY NAMES

  var keyNames = CodeMirror.keyNames = {
    3: "Enter", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt",
    19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End",
    36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert",
    46: "Delete", 59: ";", 61: "=", 91: "Mod", 92: "Mod", 93: "Mod",
    106: "*", 107: "=", 109: "-", 110: ".", 111: "/", 127: "Delete",
    173: "-", 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\",
    221: "]", 222: "'", 63232: "Up", 63233: "Down", 63234: "Left", 63235: "Right", 63272: "Delete",
    63273: "Home", 63275: "End", 63276: "PageUp", 63277: "PageDown", 63302: "Insert"
  };
  (function() {
    // Number keys
    for (var i = 0; i < 10; i++) keyNames[i + 48] = keyNames[i + 96] = String(i);
    // Alphabetic keys
    for (var i = 65; i <= 90; i++) keyNames[i] = String.fromCharCode(i);
    // Function keys
    for (var i = 1; i <= 12; i++) keyNames[i + 111] = keyNames[i + 63235] = "F" + i;
  })();

  // BIDI HELPERS

  function iterateBidiSections(order, from, to, f) {
    if (!order) return f(from, to, "ltr");
    var found = false;
    for (var i = 0; i < order.length; ++i) {
      var part = order[i];
      if (part.from < to && part.to > from || from == to && part.to == from) {
        f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr");
        found = true;
      }
    }
    if (!found) f(from, to, "ltr");
  }

  function bidiLeft(part) { return part.level % 2 ? part.to : part.from; }
  function bidiRight(part) { return part.level % 2 ? part.from : part.to; }

  function lineLeft(line) { var order = getOrder(line); return order ? bidiLeft(order[0]) : 0; }
  function lineRight(line) {
    var order = getOrder(line);
    if (!order) return line.text.length;
    return bidiRight(lst(order));
  }

  function lineStart(cm, lineN) {
    var line = getLine(cm.doc, lineN);
    var visual = visualLine(line);
    if (visual != line) lineN = lineNo(visual);
    var order = getOrder(visual);
    var ch = !order ? 0 : order[0].level % 2 ? lineRight(visual) : lineLeft(visual);
    return Pos(lineN, ch);
  }
  function lineEnd(cm, lineN) {
    var merged, line = getLine(cm.doc, lineN);
    while (merged = collapsedSpanAtEnd(line)) {
      line = merged.find(1, true).line;
      lineN = null;
    }
    var order = getOrder(line);
    var ch = !order ? line.text.length : order[0].level % 2 ? lineLeft(line) : lineRight(line);
    return Pos(lineN == null ? lineNo(line) : lineN, ch);
  }
  function lineStartSmart(cm, pos) {
    var start = lineStart(cm, pos.line);
    var line = getLine(cm.doc, start.line);
    var order = getOrder(line);
    if (!order || order[0].level == 0) {
      var firstNonWS = Math.max(0, line.text.search(/\S/));
      var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch;
      return Pos(start.line, inWS ? 0 : firstNonWS);
    }
    return start;
  }

  function compareBidiLevel(order, a, b) {
    var linedir = order[0].level;
    if (a == linedir) return true;
    if (b == linedir) return false;
    return a < b;
  }
  var bidiOther;
  function getBidiPartAt(order, pos) {
    bidiOther = null;
    for (var i = 0, found; i < order.length; ++i) {
      var cur = order[i];
      if (cur.from < pos && cur.to > pos) return i;
      if ((cur.from == pos || cur.to == pos)) {
        if (found == null) {
          found = i;
        } else if (compareBidiLevel(order, cur.level, order[found].level)) {
          if (cur.from != cur.to) bidiOther = found;
          return i;
        } else {
          if (cur.from != cur.to) bidiOther = i;
          return found;
        }
      }
    }
    return found;
  }

  function moveInLine(line, pos, dir, byUnit) {
    if (!byUnit) return pos + dir;
    do pos += dir;
    while (pos > 0 && isExtendingChar(line.text.charAt(pos)));
    return pos;
  }

  // This is needed in order to move 'visually' through bi-directional
  // text -- i.e., pressing left should make the cursor go left, even
  // when in RTL text. The tricky part is the 'jumps', where RTL and
  // LTR text touch each other. This often requires the cursor offset
  // to move more than one unit, in order to visually move one unit.
  function moveVisually(line, start, dir, byUnit) {
    var bidi = getOrder(line);
    if (!bidi) return moveLogically(line, start, dir, byUnit);
    var pos = getBidiPartAt(bidi, start), part = bidi[pos];
    var target = moveInLine(line, start, part.level % 2 ? -dir : dir, byUnit);

    for (;;) {
      if (target > part.from && target < part.to) return target;
      if (target == part.from || target == part.to) {
        if (getBidiPartAt(bidi, target) == pos) return target;
        part = bidi[pos += dir];
        return (dir > 0) == part.level % 2 ? part.to : part.from;
      } else {
        part = bidi[pos += dir];
        if (!part) return null;
        if ((dir > 0) == part.level % 2)
          target = moveInLine(line, part.to, -1, byUnit);
        else
          target = moveInLine(line, part.from, 1, byUnit);
      }
    }
  }

  function moveLogically(line, start, dir, byUnit) {
    var target = start + dir;
    if (byUnit) while (target > 0 && isExtendingChar(line.text.charAt(target))) target += dir;
    return target < 0 || target > line.text.length ? null : target;
  }

  // Bidirectional ordering algorithm
  // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm
  // that this (partially) implements.

  // One-char codes used for character types:
  // L (L):   Left-to-Right
  // R (R):   Right-to-Left
  // r (AL):  Right-to-Left Arabic
  // 1 (EN):  European Number
  // + (ES):  European Number Separator
  // % (ET):  European Number Terminator
  // n (AN):  Arabic Number
  // , (CS):  Common Number Separator
  // m (NSM): Non-Spacing Mark
  // b (BN):  Boundary Neutral
  // s (B):   Paragraph Separator
  // t (S):   Segment Separator
  // w (WS):  Whitespace
  // N (ON):  Other Neutrals

  // Returns null if characters are ordered as they appear
  // (left-to-right), or an array of sections ({from, to, level}
  // objects) in the order in which they occur visually.
  var bidiOrdering = (function() {
    // Character types for codepoints 0 to 0xff
    var lowTypes = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN";
    // Character types for codepoints 0x600 to 0x6ff
    var arabicTypes = "rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmm";
    function charType(code) {
      if (code <= 0xf7) return lowTypes.charAt(code);
      else if (0x590 <= code && code <= 0x5f4) return "R";
      else if (0x600 <= code && code <= 0x6ed) return arabicTypes.charAt(code - 0x600);
      else if (0x6ee <= code && code <= 0x8ac) return "r";
      else if (0x2000 <= code && code <= 0x200b) return "w";
      else if (code == 0x200c) return "b";
      else return "L";
    }

    var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/;
    var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/;
    // Browsers seem to always treat the boundaries of block elements as being L.
    var outerType = "L";

    function BidiSpan(level, from, to) {
      this.level = level;
      this.from = from; this.to = to;
    }

    return function(str) {
      if (!bidiRE.test(str)) return false;
      var len = str.length, types = [];
      for (var i = 0, type; i < len; ++i)
        types.push(type = charType(str.charCodeAt(i)));

      // W1. Examine each non-spacing mark (NSM) in the level run, and
      // change the type of the NSM to the type of the previous
      // character. If the NSM is at the start of the level run, it will
      // get the type of sor.
      for (var i = 0, prev = outerType; i < len; ++i) {
        var type = types[i];
        if (type == "m") types[i] = prev;
        else prev = type;
      }

      // W2. Search backwards from each instance of a European number
      // until the first strong type (R, L, AL, or sor) is found. If an
      // AL is found, change the type of the European number to Arabic
      // number.
      // W3. Change all ALs to R.
      for (var i = 0, cur = outerType; i < len; ++i) {
        var type = types[i];
        if (type == "1" && cur == "r") types[i] = "n";
        else if (isStrong.test(type)) { cur = type; if (type == "r") types[i] = "R"; }
      }

      // W4. A single European separator between two European numbers
      // changes to a European number. A single common separator between
      // two numbers of the same type changes to that type.
      for (var i = 1, prev = types[0]; i < len - 1; ++i) {
        var type = types[i];
        if (type == "+" && prev == "1" && types[i+1] == "1") types[i] = "1";
        else if (type == "," && prev == types[i+1] &&
                 (prev == "1" || prev == "n")) types[i] = prev;
        prev = type;
      }

      // W5. A sequence of European terminators adjacent to European
      // numbers changes to all European numbers.
      // W6. Otherwise, separators and terminators change to Other
      // Neutral.
      for (var i = 0; i < len; ++i) {
        var type = types[i];
        if (type == ",") types[i] = "N";
        else if (type == "%") {
          for (var end = i + 1; end < len && types[end] == "%"; ++end) {}
          var replace = (i && types[i-1] == "!") || (end < len && types[end] == "1") ? "1" : "N";
          for (var j = i; j < end; ++j) types[j] = replace;
          i = end - 1;
        }
      }

      // W7. Search backwards from each instance of a European number
      // until the first strong type (R, L, or sor) is found. If an L is
      // found, then change the type of the European number to L.
      for (var i = 0, cur = outerType; i < len; ++i) {
        var type = types[i];
        if (cur == "L" && type == "1") types[i] = "L";
        else if (isStrong.test(type)) cur = type;
      }

      // N1. A sequence of neutrals takes the direction of the
      // surrounding strong text if the text on both sides has the same
      // direction. European and Arabic numbers act as if they were R in
      // terms of their influence on neutrals. Start-of-level-run (sor)
      // and end-of-level-run (eor) are used at level run boundaries.
      // N2. Any remaining neutrals take the embedding direction.
      for (var i = 0; i < len; ++i) {
        if (isNeutral.test(types[i])) {
          for (var end = i + 1; end < len && isNeutral.test(types[end]); ++end) {}
          var before = (i ? types[i-1] : outerType) == "L";
          var after = (end < len ? types[end] : outerType) == "L";
          var replace = before || after ? "L" : "R";
          for (var j = i; j < end; ++j) types[j] = replace;
          i = end - 1;
        }
      }

      // Here we depart from the documented algorithm, in order to avoid
      // building up an actual levels array. Since there are only three
      // levels (0, 1, 2) in an implementation that doesn't take
      // explicit embedding into account, we can build up the order on
      // the fly, without following the level-based algorithm.
      var order = [], m;
      for (var i = 0; i < len;) {
        if (countsAsLeft.test(types[i])) {
          var start = i;
          for (++i; i < len && countsAsLeft.test(types[i]); ++i) {}
          order.push(new BidiSpan(0, start, i));
        } else {
          var pos = i, at = order.length;
          for (++i; i < len && types[i] != "L"; ++i) {}
          for (var j = pos; j < i;) {
            if (countsAsNum.test(types[j])) {
              if (pos < j) order.splice(at, 0, new BidiSpan(1, pos, j));
              var nstart = j;
              for (++j; j < i && countsAsNum.test(types[j]); ++j) {}
              order.splice(at, 0, new BidiSpan(2, nstart, j));
              pos = j;
            } else ++j;
          }
          if (pos < i) order.splice(at, 0, new BidiSpan(1, pos, i));
        }
      }
      if (order[0].level == 1 && (m = str.match(/^\s+/))) {
        order[0].from = m[0].length;
        order.unshift(new BidiSpan(0, 0, m[0].length));
      }
      if (lst(order).level == 1 && (m = str.match(/\s+$/))) {
        lst(order).to -= m[0].length;
        order.push(new BidiSpan(0, len - m[0].length, len));
      }
      if (order[0].level == 2)
        order.unshift(new BidiSpan(1, order[0].to, order[0].to));
      if (order[0].level != lst(order).level)
        order.push(new BidiSpan(order[0].level, len, len));

      return order;
    };
  })();

  // THE END

  CodeMirror.version = "5.18.2";

  return CodeMirror;
});
codemirror/lib/codemirror.css000064400000020721151215013520012333 0ustar00/* BASICS */

.CodeMirror {
  /* Set height, width, borders, and global font properties here */
  font-family: monospace;
  height: inherit;
  color: black;
}

/* PADDING */

.CodeMirror-lines {
  padding: 4px 0; /* Vertical padding around content */
}
.CodeMirror pre {
  padding: 0 4px; /* Horizontal padding of content */
}

.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
  background-color: white; /* The little square between H and V scrollbars */
}

/* GUTTER */

.CodeMirror-gutters {
  border-right: 1px solid #ddd;
  background-color: #f7f7f7;
  white-space: nowrap;
}
.CodeMirror-linenumbers {}
.CodeMirror-linenumber {
  padding: 0 3px 0 5px;
  min-width: 20px;
  text-align: right;
  color: #999;
  white-space: nowrap;
}

.CodeMirror-guttermarker { color: black; }
.CodeMirror-guttermarker-subtle { color: #999; }

/* CURSOR */

.CodeMirror-cursor {
  border-left: 1px solid black;
  border-right: none;
  width: 0;
}
/* Shown when moving in bi-directional text */
.CodeMirror div.CodeMirror-secondarycursor {
  border-left: 1px solid silver;
}
.cm-fat-cursor .CodeMirror-cursor {
  width: auto;
  border: 0 !important;
  background: #7e7;
}
.cm-fat-cursor div.CodeMirror-cursors {
  z-index: 1;
}

.cm-animate-fat-cursor {
  width: auto;
  border: 0;
  -webkit-animation: blink 1.06s steps(1) infinite;
  -moz-animation: blink 1.06s steps(1) infinite;
  animation: blink 1.06s steps(1) infinite;
  background-color: #7e7;
}
@-moz-keyframes blink {
  0% {}
  50% { background-color: transparent; }
  100% {}
}
@-webkit-keyframes blink {
  0% {}
  50% { background-color: transparent; }
  100% {}
}
@keyframes blink {
  0% {}
  50% { background-color: transparent; }
  100% {}
}

/* Can style cursor different in overwrite (non-insert) mode */
.CodeMirror-overwrite .CodeMirror-cursor {}

.cm-tab { display: inline-block; text-decoration: inherit; }

.CodeMirror-rulers {
  position: absolute;
  left: 0; right: 0; top: -50px; bottom: -20px;
  overflow: hidden;
}
.CodeMirror-ruler {
  border-left: 1px solid #ccc;
  top: 0; bottom: 0;
  position: absolute;
}

/* DEFAULT THEME */

.cm-s-default .cm-header {color: blue;}
.cm-s-default .cm-quote {color: #090;}
.cm-negative {color: #d44;}
.cm-positive {color: #292;}
.cm-header, .cm-strong {font-weight: bold;}
.cm-em {font-style: italic;}
.cm-link {text-decoration: underline;}
.cm-strikethrough {text-decoration: line-through;}

.cm-s-default .cm-keyword {color: #708;}
.cm-s-default .cm-atom {color: #219;}
.cm-s-default .cm-number {color: #164;}
.cm-s-default .cm-def {color: #00f;}
.cm-s-default .cm-variable,
.cm-s-default .cm-punctuation,
.cm-s-default .cm-property,
.cm-s-default .cm-operator {}
.cm-s-default .cm-variable-2 {color: #05a;}
.cm-s-default .cm-variable-3 {color: #085;}
.cm-s-default .cm-comment {color: #a50;}
.cm-s-default .cm-string {color: #a11;}
.cm-s-default .cm-string-2 {color: #f50;}
.cm-s-default .cm-meta {color: #555;}
.cm-s-default .cm-qualifier {color: #555;}
.cm-s-default .cm-builtin {color: #30a;}
.cm-s-default .cm-bracket {color: #997;}
.cm-s-default .cm-tag {color: #170;}
.cm-s-default .cm-attribute {color: #00c;}
.cm-s-default .cm-hr {color: #999;}
.cm-s-default .cm-link {color: #00c;}

.cm-s-default .cm-error {color: #f00;}
.cm-invalidchar {color: #f00;}

.CodeMirror-composing { border-bottom: 2px solid; }

/* Default styles for common addons */

div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }
.CodeMirror-activeline-background {background: #e8f2ff;}

/* STOP */

/* The rest of this file contains styles related to the mechanics of
   the editor. You probably shouldn't touch them. */

.CodeMirror {
  position: relative;
  overflow: hidden;
  background: white;
}

.CodeMirror-scroll {
  overflow: scroll !important; /* Things will break if this is overridden */
  /* 30px is the magic margin used to hide the element's real scrollbars */
  /* See overflow: hidden in .CodeMirror */
  margin-bottom: -30px; margin-right: -30px;
  padding-bottom: 30px;
  height: 100%;
  outline: none; /* Prevent dragging from highlighting the element */
  position: relative;
}
.CodeMirror-sizer {
  position: relative;
  border-right: 30px solid transparent;
}

/* The fake, visible scrollbars. Used to force redraw during scrolling
   before actual scrolling happens, thus preventing shaking and
   flickering artifacts. */
.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
  position: absolute;
  z-index: 6;
  display: none;
}
.CodeMirror-vscrollbar {
  right: 0; top: 0;
  overflow-x: hidden;
  overflow-y: scroll;
}
.CodeMirror-hscrollbar {
  bottom: 0; left: 0;
  overflow-y: hidden;
  overflow-x: scroll;
}
.CodeMirror-scrollbar-filler {
  right: 0; bottom: 0;
}
.CodeMirror-gutter-filler {
  left: 0; bottom: 0;
}

.CodeMirror-gutters {
  position: absolute; left: 0; top: 0;
  min-height: 100%;
  z-index: 3;
}
.CodeMirror-gutter {
  white-space: normal;
  height: 100%;
  display: inline-block;
  vertical-align: top;
  margin-bottom: -30px;
  /* Hack to make IE7 behave */
  *zoom:1;
  *display:inline;
}
.CodeMirror-gutter-wrapper {
  position: absolute;
  z-index: 4;
  background: none !important;
  border: none !important;
}
.CodeMirror-gutter-background {
  position: absolute;
  top: 0; bottom: 0;
  z-index: 4;
}
.CodeMirror-gutter-elt {
  position: absolute;
  cursor: default;
  z-index: 4;
}
.CodeMirror-gutter-wrapper {
  -webkit-user-select: none;
  -moz-user-select: none;
  user-select: none;
}

.CodeMirror-lines {
  cursor: text;
  min-height: 1px; /* prevents collapsing before first draw */
}
.CodeMirror pre {
  /* Reset some styles that the rest of the page might have set */
  -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;
  border-width: 0;
  background: transparent;
  font-family: inherit;
  font-size: inherit;
  margin: 0;
  white-space: pre;
  word-wrap: normal;
  line-height: inherit;
  color: inherit;
  z-index: 2;
  position: relative;
  overflow: visible;
  -webkit-tap-highlight-color: transparent;
  -webkit-font-variant-ligatures: none;
  font-variant-ligatures: none;
}
.CodeMirror-wrap pre {
  word-wrap: break-word;
  white-space: pre-wrap;
  word-break: normal;
}

.CodeMirror-linebackground {
  position: absolute;
  left: 0; right: 0; top: 0; bottom: 0;
  z-index: 0;
}

.CodeMirror-linewidget {
  position: relative;
  z-index: 2;
  overflow: auto;
}

.CodeMirror-widget {}

.CodeMirror-code {
  outline: none;
}

/* Force content-box sizing for the elements where we expect it */
.CodeMirror-scroll,
.CodeMirror-sizer,
.CodeMirror-gutter,
.CodeMirror-gutters,
.CodeMirror-linenumber {
  -moz-box-sizing: content-box;
  box-sizing: content-box;
}

.CodeMirror-measure {
  position: absolute;
  width: 100%;
  height: 0;
  overflow: hidden;
  visibility: hidden;
}

.CodeMirror-cursor {
  position: absolute;
  pointer-events: none;
}
.CodeMirror-measure pre { position: static; }

div.CodeMirror-cursors {
  visibility: hidden;
  position: relative;
  z-index: 3;
}
div.CodeMirror-dragcursors {
  visibility: visible;
}

.CodeMirror-focused div.CodeMirror-cursors {
  visibility: visible;
}

.CodeMirror-selected { background: #d9d9d9; }
.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }
.CodeMirror-crosshair { cursor: crosshair; }
.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }
.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; }

.cm-searching {
  background: #ffa;
  background: rgba(255, 255, 0, .4);
}

/* IE7 hack to prevent it from returning funny offsetTops on the spans */
.CodeMirror span { *vertical-align: text-bottom; }

/* Used to force a border model for a node */
.cm-force-border { padding-right: .1px; }

@media print {
  /* Hide the cursor when printing */
  .CodeMirror div.CodeMirror-cursors {
    visibility: hidden;
  }
}

/* See issue #2901 */
.cm-tab-wrap-hack:after { content: ''; }

/* Help users use markselection to safely style text background */
span.CodeMirror-selectedtext { background: none; }
themes/gray/icons/material.eot000064400000057200151215013520012414 0ustar00�^�]�LPd!ԗmaterialRegularVersion 1.0material�pGSUB �%z�TOS/2> I�PVcmap���\cvt �Q� fpgm���YQ�pgaspQ�glyf3Qk@�head��H�6hhea<�H�$hmtxg`H�plocaRJ\�maxp��K namew��K8�post��N�prep�A+�]P�
0>DFLTlatnliga��z��z��1PfEd@��ZR�jZR�,,
��Z�����	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[T[������������������	�	�	
�
�
����
�
�
������������������������������������ � � !�!�!"�"�"#�#�#$�$�$%�%�%&�&�&'�'�'(�(�()�)�)*�*�*+�+�+,�,�,-�-�-.�.�./�/�/0�0�01�1�12�2�23�3�34�4�45�5�56�6�67�7�78�8�89�9�9:�:�:;�;�;<�<�<=�=�=>�>�>?�?�?@�@�@A�A�AB�B�BC�C�CD�D�DE�E�EF�F�FG�G�GH�H�HI�I�IJ�J�JK�K�KL�L�LM�M�MN�N�NO�O�OP�P�PQ�Q�QR�R�RS�S�ST�T�TU�U�UV�V�VW�W�WX�X�XY�Y�YZ�Z�Z[����
%@"Eoof

+5333	3���}�_�_}��Mw����-�(@%GEDRVJ+!7'	7'!-�%�8��86����7���6�-�'@$GEDRVJ+!!�6�#��89�7�P�68-�@Ef+%#'	'R�8899�&��89��8���@oof%5 +#"3!2654&#!��#11#�#11#���1"�"11"�"1��k�GK�PX@#cmnTWK@"omnTWKY@
	+%!"&546;!2!!�!//!�O!.�fU�Z*#/!�!/P.!�w:��!�j��GK�	PX@(ec`TYMK�
PX@0mkk`TYM@*mk`TYMYY@!	+!2#7#54.#33!'!"&=3b=r��s4�;�s5M=��sgK����5(��5K���ZK�PX@c_RXL@o_RXLY@
+%!!5!'#"3!2654&A�f���S�#11#�#11d�SS1"�"11"�"1���K�
PX@-oec	^RYM@/omk	^RYMY@	
+!'#"3!2654&##5#53533A��S�#11#�#11L}T}}T}XS1"�"11"�"1��}}S}}��A���GK�
PX@0	ome
^RYM@1	omm
^RYMY@+3'%!#!"&5465##33535���M�1"�"11�S}}S}��?��#11#�#1��}}S}}S��9�	^K�PX@$cmnRWK@#omnRWKY@	2+73!265!%#'##!�6&r'5��Z�.�-��'56&,�..\����	
H@EG^^RXL




		3	+#!"&'!535'7��1 ��!1�hu^u�Y������	 ++ �X�n��ů�Ջ������)2O@LGm``TXL10-, 
	))	+"#7#47>2#"'3276764'&'&4&"260aSQ01w��w&%�@?%&&%?@KSM8-p=aTP/11/QS/B./A/�1/QS`��L@?J&%?@�@?%&48$%1/QR�SP/0��!./@/.��\�>@;m^^RXL		 +!"3!!"3!2656&!!��:,K�p�`,,�,, �`��,��M,��,,,������"+4=B�@�?@
	
GA"Fm
	
	m		km`
``
T
XL>>65-,$#>B>B:95=6=10,4-4('#+$+$%+654."327&#"2>54'735"&462"&462"&4625�-MZM--M-'bb(-M--MZM-b$}�e"11E00#"11E00�

�S$(-M--MZM-bb-MZM--M-'b��*�1E00E1�1E00E18

��S#*��J�&N@K`
	^^RXL&%$#"! 
+#."#"3!2654&!2"&46!3!53��:J:�,,,.�� ��K|K�!**!,��,,].  �T_ss�����-+���\����-��*5���V�'5CK�@1
	=G"FK�
PX@N	e
		
ee^	
	^

```RXLK�PX@H	e
		
e^	
	^

```RXLK�PX@N	e
		
ee^	
	^

```RXL@P		m
		
me^	
	^

```RXLYYY@KIFDA?;8530/,*)(''#3%6+'&+54/&#!";3!2654!;!5!2653;;2656&+"32+Rs4s�����jI
Y��KYv


�sr��\�y^\
��\�[
��Q����%.26s@p#G	`
^^
^TXL33&&363654210/&.&.-,+*)(%$!#!"!%!+32+327;5#"&=3#546;5#"&#!5!5!53#%35�SSS0$$/SS��SS/$$0����M�}}�6��S�S!!S*�*S!!�)��S�SS��TT����@
Gof+73'64/&"27S��2l&
U�*j��(&
lU�+�z,I@FG``TXL! '& ,!,
		+"27>7.'&".4>2"2654.�]UR}  }RU�UR}  }RU]3W44WfW44W35BbB5y$#�SS�#$$#�SS�#$�'4WfW44WfW415 1BB1 5��J�
#@ Eooof+%!3	3!!`&��������R�&X���xb��L�
3@0GooRVJ

+#!#!5L���X����&���bbb����-1G@D`^^	T	XL10/.$#--
+%35#"276764'&'&"'&'&47676235#�TT*ra^7997^a�b^7998^aqZNK,..,KN�NK,..,KN�TT��w97^a�a^7998^a�a^89�.,KN�NK,..,KN�NK,.�S���� A@>Gmk^RXL  83+'.#!"3!2656##5#7!�A
��	A6&�'5�^����?&,,�MM��'76&C��\\�..���� ?@<Gmn^RVJ  83+'.#!"3!2656'35337!�A
��	A6&�'5�^������&,,�MM��'76&C��\\E..��#'+/l@i	
^
^RVJ,,,/,/.-+*)('&%$#"! +35#35#35#35#'35#33535#35#35#35#35#35S����ۯ�ݯ�ݯ�ݯ,���m��ۯ�ݯ�ۯ���w�����+����w��v������������A@>
^^	R	VJ
+735#35#35#!5!!5!!5S������L��L��L��F�(�F�F��������-N_@\		m		k
``^TXL/.CB6532.N/N$#--
+%35#"276764'&'&"'&'&476762"34623476767654.�TT*qa^8998^a�a^8998^aqZNK,..,KN�NK,..,KNZ-M-T1D1

T 
-MdSH98^a�a^8998^a�a^89�.,KN�NK,..,KN�NK,.G-M-#11##$-M-����!%48<@IMQ�@
10GK�PX@s

em-e&%$#"		^('

^)^+*^,^/!.R/!.Y M@u


mm-m&%$#"		^('

^)^+*^,^/!.R/!.Y MY@NNJJAA==9955&&""

		NQNQPOJMJMLKAIAIFDCB=@=@?>9<9<;:585876&4&432/-*)('"%"%$#!! 

		
0+"353533533533533354&#35!353#;57335!3535#326=35335�"2T)TSSTSST)T1#�T�T�����2"��T��T�TTTT))#1�5TSS�1#))TTTTTTTT))#1�SSSS)T��"2��N}TTTT�SS�)T2"))TTTT�.,>@;
`^TX	L'%$",,!%!#+4>;5#";5#".!5!%#32+32>4.�#;#��9`88`9��#;#�N��w��#<##<#��9`88`^#;#O8_r_8O#;T�O#;F;#O8_r_8����)>@;GD`TXL$#)))+%#'6765.'&"32677%".4>2�%
#SFH�IF)++)FIT9h)�G��;b::cub9:c�*268T�)++)FI�HF**'$
%�G�:btc::buc9��a�
!k@h	GEDop^	^		R		V
	J!! 

	+7/##3#'3/#55#5!3�����t _}z�d�\
�¯&��{���Ƅ��n��j�U((((��4M6��M��R� &+@(E"Dof%$+'5.4>7&'67'767#��V�())(�W>d::d>�
:>�cH?2q>>	Z7Ȉ
bKN�MKa
Z
Jp�oJ
�,bI?,@��Z8?#a>QZ6��R�*$@!E"!
	Dof+'36#7&5&'55>764'.>>	ZX
:>$$L_<0���>ee>V�())(��?QZ7�bI>6�9Z
$ S��ĭ
J79�87J
Z
bKN�MKa����'F@C
o	oT^XL!
	'&+2+32!!+"&5!5!46;5#"&5463�#11#�)$�����$)�"22"�1#�`"2SSSS2"�#1���!.*@'#G`TXL/*+6'&'.7676%67676.'.�76]`�b_9;76]`�b`9;�/.LNZ9h)�%!"~�!"/-LN[9hVqb`9;76]`�b`9;76]`[MK*,'!�6+h��+j9[MK*,'��A�/@,GpTVJ
+!"3!2654&3'�"11"�"11���hh�1#�f#11#�#1T��??����@

	Df+%73%'}��7#�6��Ĕ���.S�wN��q�S�k��f����"@Gof
+"276764'&'&'7�ra^7997^b�a^8998^a��;�<;�97^a�a^8998^a�b^79���:�=:�s2@/^^RVJ+7!5!5!5!5!5SB��B��BI\�\�\\��@of+%3#3#!3y�����L�~��~��~����H@E
mk	^RVJ
+7#!5#3535!#!#33�w*�ww���˳*w��w��w��w�5w*w�*����C@@	op
^RVJ
+733!#!#3535!5#!5S�v�ִ�*vdw���ww*q�*ew*���ve���w��-�@GEof4+773#!"&-*��+�:���.3$��$4�K0KMl<��
���$44����0@-GE`TXL)!%#+
532#!!276764'&'&+w��$�4V11V4� �`RQ/00/QR`����}1VhV2�00PS�SP/0����0@-GE`TXL%!)!+#"3!5!".4>;%q�`SP0000PS`�!5V11V5�$�}0/QR�SP/1�1VjU1}�����GT7@4$?2GooofIHONHTIT97+654&57>/.&/.+"'&?;26?676?6&'".4>2*XSh*�#$hSZXSh*�#$hS�n(C''CPC''C6
E�*l

n*�DD�*n	
n*�$'CPC''CPC'��>@;Go^RXL	+%5#535!'#"3!2654&G���)��S�#11#�#11d}�}�$S1"�"11"�"1����!%)-159=AJSW[_�K�PX@v

e9#8  e.-,+*		^10/

^432^765 ^<);':%!R<);':%!W(&$"K@x


m9#8  m.-,+*		^10/

^432^765 ^<);':%!R<);':%!W(&$"KY@�\\XXTTKKBB>>::6622..**&&""

		\_\_^]X[X[ZYTWTWVUKSKSPNMLBJBJIHGE>A>A@?:=:=<;696987252543.1.10/*-*-,+&)&)('"%"%$#!! 

		
=+"353533533533533354&#353!5335353!5335353!5335;5#5!#326=35335335�"2T)TSSTSST)T1#�T}�}T��T}�}T��T}�}T��2"))�))#1��SSTSS�1#))TTTTTTTT))#1�SSSSSS�TTTTTT�SSSSSS�)"2T))T2"))TTTTTT����#'+/3�K�
PX@>e	e
^^
R
YM@@m	m
^^
R
YMY@'3210/.-,+*)('&%$" #!"+46;##%#5#53253+5!533#"&3#3#3#%3#S2"}}TBT}}#1TT1#}��T}}"2N�����TT�TT�#1T}}}}T1�C}}"2T}}T2T�fT�����;�@�opR	^	
	
^^^
^R

^VJ;:9876543210/.-,+*)('&%$#"! +33533533533#3#3#3##5##5##5##5#535#535#535#53�\[\\[\\d\\\\\\\\[\\[\d\\\\\\\\�\\\\\\\\[\\[\\d\\\\\\\\[\\[\d��3�",1T@Q`		^
`RXL.-
	0/-1.1,+'&	"
"
+%264&"#54."#"3!265.%4>2#!!�!..B..(5[l[5'!//!� //�w!8D8!�i�%݃/A//B.gO5[66[5O/!�u!//!�!/O"8!!8"O�#��u��3�",C@@``	T	XL)($#""

+#54."#"3!265."&462#54>2�(5[l[5'!//!� //��!..B..Z�!8D8!�O5[66[5O/!�u!//!�!/��/A//B.gO"8!!8"��3�*/[@Xm`		^
`RXL,+
	.-+/,/%"	*
*
+%264&"#54."34>2!"3!265.!!�!..B..(5[l[5K!8D8!��!//!� // �%݃/A//B.gO5[66[5"8!!8"O/!�u!//!�!/�#��u��
@E
Df+	>3����p'X��uE� ���zr�����=@:

^^	R	VJ+#535#53#535#53#53#53������������������C���������������-+'			7�T����TN��TMMT���T��NT����TN��TM����)@&opRVJ+!#!5!3!���v��evg"��evg���4@1GEpTXL
+"'!'>327.'&PJG9�o�+k;F~[`wQT�3����%(:fAU�%&��@RVJ+!5!���B$v����(�K�PX@8oo
	e
^TVJ@9oo
	m
^TVJY@2! %$ (!(

	+!!3353353353353353!%2"&46�TBT�B�)**)**)**)*�6\$$4%$�����$STTTTTTTTTT}}$6#$4%��A�8Tm�p@mD9_UznGF`{F
```	`		T		X	L��usgf[ZNM@>*)88+"32>7654'.2"'&'&'&=4767>32676?"'.'&5 76?"&'&'&532676?"&'&'&5�}b2## +ez?r^##\r?640$

#dm40$

#d�	b}?r.	
&#03p30E
_^


%#brb#
b}?r.	
'#brb#
�('(�,# &''&�,#&T		

	
		

	�	(	7
				 
o''6


p(6

����@
	-+%''%5'
7'77'���^�����_���M���{}}8<��<�������&�����������A@>G	F
DooRVJ+%!!7�����
����������1'����E���Z'Aq@n$ ?,	Gm
mkkm	`TXL)(><9852(A)A#!''+"&#";'&5467>32632."3!264&#4.#". 7^ !%=#'5=,S2'3M,)H6VB(D(&3=+�&44& 7 CZ;/$>$
;),<+F+H)!2S0�(D(:'+=5J4!6 
 '��%gqz�i@fMB�oUF)�2G5Foooo
	`TXLsrihwvrzszmlhqiqKJ?>43"&+&'&'.'&'&#";767>/.7&'.=46266?>&67667676%"2674&3"264&676&'&�75M
03A?56

((0
|N�<S*i@1-
+^=$1!@)-10%f+	

-�'%8%%�''8'(OmD%#	7#&#%<	V`.IYF6~�=
.4.7!�T
*,'	

;	&�&7$#&&6%$5(
7!
����5J@Gmk`^RXL0/,+)(
	+"276764'&'&#537#54?>54&"#4>2�ra^7997^a�b^7998^aGTTU%	
T04
0E1T-MZM-�97^a�a^7998^a�a^89�;T�%,B54#00#-M--M-1����`@]	
GEDoom	n
R
VJ
+353'3#5535'#3'##7#��s��s(r��s�rr��s��s�r���s��s�K�s�sMr������
A@>
G^`TXL5 +!"3!265".4>2!5!��%76&�'5�a&@&&@L@&&@f�/��6&�x'76&,��&@L@%%@L@&ѹ���"�%D@A
GED`TXL+7'"7&5&>#552767654�RGD()08<i=8=i=��RGD()Ar��s)(DGRZF819<h=C819=i=r��s)(DGRY����7@4^^RXL
+"276764'&'&#535#53�ra^7997^a�b^7998^aGTTTT�97^a�a^7998^a�a^89���SS�����-+'	7�d�`�b���b�_�_b?�����-+	Vb<��b��b����b�����	"@Gof		+'!'�_��������_��_��������
�-+'%'77Z�v;bv��[��v�;�w��v��;v���:w�;�v���� (@% Gof
+2"'&'&47676'77'7�ra^7997^a�a^7997^a��:��:��:���97^a�a^7997^a�a^79і�:��:��:������3@0GmnRVJ+35!333535�)�`)S�B�^MTT��ST��T���-+%'	'\�C	9C��E��9C���@Df+'#'�"K�h�IC"I�z���K���@Ef+	737���H�h�I���I���z�K�G@of1+&#!"27654��&m.l9-��o�G@of6+%4'&"3!26���.��
��o��+��s�	"@of		+###s^B^��_�_B�_�_B����"@Gof
+"276764'&'&77�qa^8998^a�a^8998^aq��<��<�98^a�a^8998^a�a^89��<��<��J� ;@8EDopRXL  +67676=#5"&463121�-,MOaaOM,-��K%���ha_CDDC_ah�i��(����
,@)
Eo^RVJ+#53#53!KKKK�9B�_���K������@of+	&"27654��,.m�l�&m����
@of+	62"'&4m,.���l�&m.����&/8Ah@e
m
kp`	T	XL:910('>=9A:A540818,+'/(/#"&&
+"3264'&46;2>56'&'&"&4627"&4623"&462"&462�qa^8998^aq))Q>k?97^a��))8))m((8)'�))8((m))8)(�98^a�a^89)76)>k>eWU13�_)9()8)�)8))9()8)(9)�)8))8)����*-@*GooTXL"!+#3"'&'&5467'2767654'&"\\�C8 ,,IL�KI+,?8AD&(98^a�a^89(&��1kC.@BJXLI,,,,ILXK�,C;QT]qa^8998^aq]TQ��!d_<����m{��m{���R�j��\��������������������������������������������������������������������������������������������*V���(�v�>�V
n��:h�6�		Z	�
&
�b�
4
�
�B��Z��P����J���^��Bf��������p�$p����>r����B��,R� E\�z�s/p�55=DLT_
+g�	j�			-	=	M	c	
Vs	&�Copyright (C) 2017 by original authors @ fontello.commaterialRegularmaterialmaterialVersion 1.0materialGenerated by svg2ttf from Fontello project.http://fontello.comCopyright (C) 2017 by original authors @ fontello.commaterialRegularmaterialmaterialVersion 1.0materialGenerated by svg2ttf from Fontello project.http://fontello.com
\	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]homebackforwardupdiropendirreloadopenmkdirmkfilermtrashrestorecopycutpastegetfile	duplicaterenameedit	quicklookuploaddownloadinfoextractarchiveview	view-listhelpresizelinksearchsortrotate-rrotate-lnetmount
netunmountplaceschmodacceptmenucolwidth
fullscreenunfullscreenemptyundoredo
preferencemkdirin	selectall
selectnoneselectinvertlockpermsunlockedsymlink	resizablecloseplusreturnminushddsqldropboxgoogledriveonedriveboxhelp-circlemovesaveloadinginfo-circleprevnext
ql-fullscreenql-fullscreen-offclose-circlepincheckarrowthick-1-sarrowthick-1-n
caret-downcaret-upmenu-resizearrow-circletn-error
warning-alertcaret-right
caret-leftthemelogout��R�jR�j�, �UXEY  K�QK�SZX�4�(Y`f �UX�%a�cc#b!!�Y�C#D�C`B-�,� `f-�, d ��P�&Z�(
CEcER[X!#!�X �PPX!�@Y �8PX!�8YY �
CEcEad�(PX!�
CEcE �0PX!�0Y ��PX f ��a �
PX` � PX!�
` �6PX!�6``YYY�+YY#�PXeYY-�, E �%ad �CPX�#B�#B!!Y�`-�,#!#! d�bB �#B�
CEc�
C�`Ec�*! �C � ��+�0%�&QX`PaRYX#Y! �@SX�+!�@Y#�PXeY-�,�C+�C`B-�,�#B# �#Ba�bf�c�`�*-�,  E �Cc�b �PX�@`Yf�c`D�`-�,�CEB*!�C`B-�	,�C#D�C`B-�
,  E �+#�C�%` E�#a d � PX!��0PX� �@YY#�PXeY�%#aDD�`-�,  E �+#�C�%` E�#a d�$PX��@Y#�PXeY�%#aDD�`-�, �#B�
EX!#!Y*!-�
,�E�daD-�,�`  �CJ�PX �#BY�
CJ�RX �
#BY-�, �bf�c �c�#a�C` �` �#B#-�,KTX�dDY$�
e#x-�,KQXKSX�dDY!Y$�e#x-�,�CUX�C�aB�+Y�C�%B�%B�
%B�# �%PX�C`�%B�� �#a�*!#�a �#a�*!�C`�%B�%a�*!Y�CG�
CG`�b �PX�@`Yf�c �Cc�b �PX�@`Yf�c`�#D�C�>�C`B-�,�ETX�#B E�#B�
#�`B `�a�BB�`�+�r+"Y-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�	+-�,�
+�ETX�#B E�#B�
#�`B `�a�BB�`�+�r+"Y-�,�+-� ,�+-�!,�+-�",�+-�#,�+-�$,�+-�%,�+-�&,�+-�',�+-�(,�	+-�), <�`-�*, `�` C#�`C�%a�`�)*!-�+,�*+�**-�,,  G  �Cc�b �PX�@`Yf�c`#a8# �UX G  �Cc�b �PX�@`Yf�c`#a8!Y-�-,�ETX��,*�0"Y-�.,�
+�ETX��,*�0"Y-�/, 5�`-�0,�Ec�b �PX�@`Yf�c�+�Cc�b �PX�@`Yf�c�+��D>#8�/*-�1, < G �Cc�b �PX�@`Yf�c`�Ca8-�2,.<-�3, < G �Cc�b �PX�@`Yf�c`�Ca�Cc8-�4,�% . G�#B�%I��G#G#a Xb!Y�#B�3*-�5,��%�%G#G#a�	C+e�.#  <�8-�6,��%�% .G#G#a �#B�	C+ �`PX �@QX�  �&YBB# �C �#G#G#a#F`�C�b �PX�@`Yf�c` �+ ��a �C`d#�CadPX�Ca�C`Y�%�b �PX�@`Yf�ca#  �&#Fa8#�CF�%�CG#G#a` �C�b �PX�@`Yf�c`# �+#�C`�+�%a�%�b �PX�@`Yf�c�&a �%`d#�%`dPX!#!Y#  �&#Fa8Y-�7,�   �& .G#G#a#<8-�8,� �#B   F#G�+#a8-�9,��%�%G#G#a�TX. <#!�%�%G#G#a �%�%G#G#a�%�%I�%a�cc# Xb!Yc�b �PX�@`Yf�c`#.#  <�8#!Y-�:,� �C .G#G#a `� `f�b �PX�@`Yf�c#  <�8-�;,# .F�%FRX <Y.�++-�<,# .F�%FPX <Y.�++-�=,# .F�%FRX <Y# .F�%FPX <Y.�++-�>,�5+# .F�%FRX <Y.�++-�?,�6+�  <�#B�8# .F�%FRX <Y.�++�C.�++-�@,��%�& .G#G#a�	C+# < .#8�++-�A,�%B��%�% .G#G#a �#B�	C+ �`PX �@QX�  �&YBB# G�C�b �PX�@`Yf�c` �+ ��a �C`d#�CadPX�Ca�C`Y�%�b �PX�@`Yf�ca�%Fa8# <#8!  F#G�+#a8!Y�++-�B,�5+.�++-�C,�6+!#  <�#B#8�++�C.�++-�D,� G�#B�.�1*-�E,� G�#B�.�1*-�F,��2*-�G,�4*-�H,�E# . F�#a8�++-�I,�#B�H+-�J,�A+-�K,�A+-�L,�A+-�M,�A+-�N,�B+-�O,�B+-�P,�B+-�Q,�B+-�R,�>+-�S,�>+-�T,�>+-�U,�>+-�V,�@+-�W,�@+-�X,�@+-�Y,�@+-�Z,�C+-�[,�C+-�\,�C+-�],�C+-�^,�?+-�_,�?+-�`,�?+-�a,�?+-�b,�7+.�++-�c,�7+�;+-�d,�7+�<+-�e,��7+�=+-�f,�8+.�++-�g,�8+�;+-�h,�8+�<+-�i,�8+�=+-�j,�9+.�++-�k,�9+�;+-�l,�9+�<+-�m,�9+�=+-�n,�:+.�++-�o,�:+�;+-�p,�:+�<+-�q,�:+�=+-�r,�	EX!#!YB+�e�$Px�0-K��RX��Y��cp�B�*�B�
*�B�*�B��	*�B�@	*�D�$�QX�@�X�dD�&�QX��@�cTX�DYYYY�*������Dthemes/gray/icons/material.svg000064400000062130151215013520012422 0ustar00<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg">
<defs>
<font id="material" horiz-adv-x="1000" >
<font-face font-family="material" font-weight="400" font-stretch="normal" units-per-em="1000" ascent="850" descent="-150" />
<missing-glyph horiz-adv-x="1000" />
<glyph glyph-name="home" unicode="&#xe800;" d="M417-4v250h166v-250h209v333h125l-417 375-417-375h125v-333h209z" horiz-adv-x="1000" />

<glyph glyph-name="back" unicode="&#xe801;" d="M813 390h-475l218 218-56 55-312-313 312-312 54 54-219 218h478v80z" horiz-adv-x="1000" />

<glyph glyph-name="forward" unicode="&#xe802;" d="M500 663l-54-55 219-218h-477v-80h475l-219-218 56-54 313 312-313 313z" horiz-adv-x="1000" />

<glyph glyph-name="up" unicode="&#xe803;" d="M540 38h-82v472l-214-216-56 56 312 313 313-313-57-56-216 216v-472z" horiz-adv-x="1000" />

<glyph glyph-name="dir" unicode="&#xe804;" d="M417 683h-250c-46 0-84-37-84-83l0-500c0-46 38-83 84-83h666c46 0 84 37 84 83v417c0 46-38 83-84 83h-333l-83 83z" horiz-adv-x="1000" />

<glyph glyph-name="opendir" unicode="&#xe805;" d="M752 35h-589c-44 0-80 36-80 80v470c0 44 36 80 80 80h235l79-80h273c44 0 79-35 79-79l0 0h-666v-393l85 314h669l-90-333c-8-34-39-59-75-59z" horiz-adv-x="1000" />

<glyph glyph-name="reload" unicode="&#xe806;" d="M354 615l61-75h275c20 0 37-17 37-38v-189h-114l152-190 152 190h-115v189c0 63-52 115-114 115l-334-2 0 0z m-119-38l-152-189h115v-190c0-63 52-115 115-115h333l-61 75h-275c-20 0-37 17-37 38v189h115l-153 192z" horiz-adv-x="1000" />

<glyph glyph-name="open" unicode="&#xe807;" d="M833 100h-666v417h666m0 83h-333l-83 83h-250c-46 0-84-37-84-83v-500c0-46 38-83 84-83h666c46 0 84 37 84 83v417c0 46-38 83-84 83z" horiz-adv-x="1000" />

<glyph glyph-name="mkdir" unicode="&#xe808;" d="M833 600h-333l-83 83h-250c-46 0-84-37-84-83l0-500c0-46 38-83 84-83h666c46 0 84 37 84 83v417c0 46-38 83-84 83z m-41-333h-125v-125h-84v125h-125v83h125v125h84v-125h125v-83z" horiz-adv-x="1000" />

<glyph glyph-name="mkfile" unicode="&#xe809;" d="M542 475h229l-229 229v-229m-292 292h333l250-250v-500c0-46-37-84-83-84h-500c-46 0-83 38-83 84v666c0 46 37 84 83 84m208-542v125h-83v-125h-125v-83h125v-125h83v125h125v83h-125z" horiz-adv-x="1000" />

<glyph glyph-name="rm" unicode="&#xe80a;" d="M223 25c0-52 42-92 92-92h370c53 0 92 42 92 92v556h-554v-556z m602 696h-162l-46 46h-234l-45-46h-163v-92h648l2 92 0 0z" horiz-adv-x="1000" />

<glyph glyph-name="trash" unicode="&#xe80b;" d="M896 767l-133-759c-9-41-44-75-88-75h-350c-44 0-81 32-87 75l-134 759h792m-688-88l117-658h350l117 658h-584m161-571v175h175v-175h-175m175 213l-140 139 140 140 139-140-139-139z" horiz-adv-x="1000" />

<glyph glyph-name="restore" unicode="&#xe80c;" d="M560 706c-197 0-358-160-358-356h-119l159-158 158 158h-119c0 154 125 277 277 277s277-125 277-277-125-277-277-277c-60 0-114 21-160 52l-56-56c60-48 137-73 218-73 198 0 357 160 357 356s-161 354-357 354m80-356c0 44-36 79-80 79s-79-37-79-79 36-79 79-79 80 35 80 79z" horiz-adv-x="1000" />

<glyph glyph-name="copy" unicode="&#xe80d;" d="M671 767h-454c-42 0-75-34-75-75v-532h75v532h454v75z m112-152h-416c-42 0-75-34-75-75v-532c0-41 33-75 75-75h416c42 0 75 34 75 75v532c2 41-33 75-75 75z m0-607h-416v532h416v-532z" horiz-adv-x="1000" />

<glyph glyph-name="cut" unicode="&#xe80e;" d="M402 531c11 21 15 44 15 69 0 92-75 167-167 167s-167-75-167-167 75-167 167-167c25 0 48 7 69 15l98-98-98-98c-21 11-44 15-69 15-92 0-167-75-167-167s75-167 167-167 167 75 167 167c0 25-7 48-15 69l98 98 292-292h125v42l-515 514z m-152-14c-46 0-83 37-83 83s37 83 83 83 83-37 83-83-37-83-83-83z m0-500c-46 0-83 37-83 83s37 83 83 83 83-37 83-83-37-83-83-83z m250 312c-10 0-21 11-21 21s11 21 21 21 21-11 21-21-11-21-21-21z m292 396l-250-250 83-83 292 291v42h-125z" horiz-adv-x="1000" />

<glyph glyph-name="paste" unicode="&#xe80f;" d="M765 692h-159c-14 43-56 75-106 75s-92-32-106-75h-159c-41 0-75-34-75-75v-607c0-41 34-75 75-75h532c41 0 75 34 75 75v605c0 41-36 77-77 77z m-265 0c21 0 38-17 38-38s-17-39-38-39-37 16-37 37 16 40 37 40z m265-684h-530v607h75v-115h380v115h75v-607z" horiz-adv-x="1000" />

<glyph glyph-name="getfile" unicode="&#xe810;" d="M250 767l500-467-242-21 138-304-92-42-133 309-171-163v688" horiz-adv-x="1000" />

<glyph glyph-name="duplicate" unicode="&#xe811;" d="M850 510l-115 115c-2 2-6 4-10 4h-52v6c0 5-2 7-4 11l-115 114c-2 5-6 7-10 7h-356c-23 0-42-19-42-42v-617c0-23 19-41 42-41h139v-92c0-23 19-42 42-42h444c22 0 41 19 41 42v527c0 2-2 6-4 8z m-658-395v606h329v-92c0-8 8-16 17-16h89v-498h-435z m618-136h-437v92h260c23 0 42 19 42 42v472h29v-91c0-9 9-17 17-17h89v-498z m-118 117v-81c0-7 4-11 10-11h31c30 0 52 23 52 52 3 27-22 50-52 50h-31c-6 0-10-4-10-10z m23-13h18c17 0 30-12 30-29 0-14-13-27-30-27h-18v56z" horiz-adv-x="1000" />

<glyph glyph-name="rename" unicode="&#xe812;" d="M500 725v-83h83c23 0 42-19 42-42v-500c0-23-19-42-42-42h-83v-83h83c32 0 61 12 84 33 23-21 52-33 83-33h83v83h-83c-23 0-42 19-42 42v42h167 42v41 334 41h-42-167v42c0 23 19 42 42 42h83v83h-83c-31 0-60-12-83-33-23 21-52 33-84 33h-83z m-417-167v-41-334-41h42 375v83h-333v250h333v83h-375-42z m625-83h125v-250h-125v250z m-458-83v-84h208v84h-208z" horiz-adv-x="1000" />

<glyph glyph-name="edit" unicode="&#xe813;" d="M83 106v-173h173l513 513-173 173-513-513z m819 473c19 19 19 48 0 65l-108 108c-19 19-48 19-65 0l-85-85 173-173c2 0 85 85 85 85z" horiz-adv-x="1000" />

<glyph glyph-name="quicklook" unicode="&#xe814;" d="M500 633c-190 0-352-116-417-283 65-167 227-283 417-283s352 116 417 283c-65 167-227 283-417 283z m0-473c-104 0-190 86-190 190s86 190 190 190 190-86 190-190-86-190-190-190z m0 305c-62 0-115-50-115-115s50-115 115-115 115 50 115 115-52 115-115 115z" horiz-adv-x="1000" />

<glyph glyph-name="upload" unicode="&#xe815;" d="M352 129h294v294h196l-342 344-344-344h196v-294z m-196-98h686v-98h-686v98z" horiz-adv-x="1000" />

<glyph glyph-name="download" unicode="&#xe816;" d="M844 473h-196v294h-296v-294h-196l344-344 344 344z m-688-442v-98h686v98h-686z" horiz-adv-x="1000" />

<glyph glyph-name="info" unicode="&#xe817;" d="M458 142h84v250h-84v-250z m42 625c-231 0-417-186-417-417s186-417 417-417 417 188 417 417-188 417-417 417z m0-750c-183 0-333 150-333 333s150 333 333 333 333-150 333-333-150-333-333-333z m-42 458h84v83h-84v-83z" horiz-adv-x="1000" />

<glyph glyph-name="extract" unicode="&#xe818;" d="M896 665l-65 77c-12 14-31 25-54 25h-554c-21 0-42-11-54-25l-65-77c-12-17-21-38-21-59v-579c0-52 42-94 92-94h648c52 0 92 42 92 92v579c2 23-7 44-19 61z m-396-198l254-254h-162v-92h-186v92h-162l256 254z m-319 208l38 46h556l44-46h-638z" horiz-adv-x="1000" />

<glyph glyph-name="archive" unicode="&#xe819;" d="M896 665l-65 77c-12 14-31 25-54 25h-554c-21 0-42-11-54-25l-65-77c-12-17-21-38-21-59v-579c0-52 42-94 92-94h648c52 0 92 42 92 92v579c2 23-7 44-19 61z m-396-569l-254 254h162v92h186v-92h162l-256-254z m-319 579l38 46h556l44-46h-638z" horiz-adv-x="1000" />

<glyph glyph-name="view" unicode="&#xe81a;" d="M83 481h175v175h-175v-175z m0-218h175v175h-175v-175z m219 0h175v175h-175v-175z m221 0h175v175h-175v-175z m-221 218h175v175h-175v-175z m221 175v-175h175v175h-175z m219-393h175v175h-175v-175z m-659-219h175v175h-175v-175z m219 0h175v175h-175v-175z m221 0h175v175h-175v-175z m219 0h175v175h-175v-175z m0 612v-175h175v175h-175z" horiz-adv-x="1000" />

<glyph glyph-name="view-list" unicode="&#xe81b;" d="M83 252h196v196h-196v-196z m0-246h196v196h-196v-196z m0 492h196v196h-196v-196z m246-246h588v196h-588v-196z m0-246h588v196h-588v-196z m0 688v-196h588v196h-588z" horiz-adv-x="1000" />

<glyph glyph-name="help" unicode="&#xe81c;" d="M458 100h84v83h-84v-83m42 667c-229 0-417-188-417-417s188-417 417-417 417 188 417 417-188 417-417 417m0-750c-183 0-333 150-333 333s150 333 333 333 333-150 333-333-150-333-333-333m0 583c-92 0-167-75-167-167h84c0 46 37 84 83 84s83-38 83-84c0-83-125-73-125-208h84c0 94 125 104 125 208 0 92-75 167-167 167z" horiz-adv-x="1000" />

<glyph glyph-name="resize" unicode="&#xe81d;" d="M167 767c-46 0-84-38-84-84v-41h84v41h41v84h-41z m125 0v-84h83v84h-83z m166 0v-84h84v84h-84z m167 0v-84h83v84h-83z m167 0v-84h41v-41h84v41c0 46-38 84-84 84h-41z m-709-209v-83h84v83h-84z m750 0v-83h84v83h-84z m-500-41v-84h192l-210-208h-232v-83-125c0-46 38-84 84-84h208v84 148l208 210v-192h84v292 42h-42-292z m-250-125v-84h84v84h-84z m750 0v-84h84v84h-84z m0-167v-83h84v83h-84z m0-167v-41h-41v-84h41c46 0 84 38 84 84v41h-84z m-375-41v-84h84v84h-84z m167 0v-84h83v84h-83z" horiz-adv-x="1000" />

<glyph glyph-name="link" unicode="&#xe81e;" d="M163 350c0 71 58 129 129 129h166v79h-166c-115 0-209-93-209-208s94-208 209-208h166v79h-166c-71 0-129 58-129 129z m170-42h334v84h-334v-84z m375 250h-166v-79h166c71 0 130-58 130-129s-59-129-130-129h-166v-79h166c115 0 209 93 209 208s-94 208-209 208z" horiz-adv-x="1000" />

<glyph glyph-name="search" unicode="&#xe81f;" d="M679 242h-37l-13 12c46 54 75 125 75 202-2 171-139 311-310 311s-311-140-311-311 140-310 311-310c77 0 148 27 202 75l12-13v-37l238-238 71 71-238 238z m-285 0c-119 0-215 96-215 214s96 215 215 215 214-96 214-215-98-214-214-214z" horiz-adv-x="1000" />

<glyph glyph-name="sort" unicode="&#xe820;" d="M394 635l133 132 131-132h-264m264-570l-131-132-131 132h262m-277 191h-116l-32-110h-95l125 406h122l128-406h-100l-32 110m-104 67h92l-25 85-11 40-10 40h-2l-8-40-11-40-25-85m273-177v52l194 275v2h-175v77h294v-54l-190-271v-2h192v-77l-315-2 0 0z" horiz-adv-x="1000" />

<glyph glyph-name="rotate-r" unicode="&#xe821;" d="M658 567l-200 200v-136c-173-21-308-168-308-350s133-327 308-348v90c-125 21-220 129-220 260s95 238 220 259v-171l200 196z m192-240c-8 61-31 121-71 171l-62-63c23-33 37-70 46-108h87z m-304-304v-90c60 9 121 32 171 71l-63 63c-33-23-71-38-108-44z m171 106l62-62c40 52 65 110 71 171h-90c-4-38-20-75-43-109z" horiz-adv-x="1000" />

<glyph glyph-name="rotate-l" unicode="&#xe822;" d="M283 435l-62 63c-40-52-65-110-71-171h90c4 38 20 75 43 108z m-45-197h-88c8-61 31-121 71-171l62 62c-23 34-39 71-45 109z m45-234c52-39 111-62 171-71v90c-37 6-75 21-108 46 0-2-63-65-63-65z m259 627v136l-200-200 200-196v173c125-21 221-129 221-261s-96-239-221-260v-90c173 21 308 169 308 350s-133 327-308 348z" horiz-adv-x="1000" />

<glyph glyph-name="netmount" unicode="&#xe823;" d="M708 767c46 0 84-38 84-84v-416c0-46-38-84-84-84h-166v-83h41c23 0 42-19 42-42h292v-83h-292c0-23-19-42-42-42h-166c-23 0-42 19-42 42h-292v83h292c0 23 19 42 42 42h41v83h-166c-46 0-84 38-84 84v416c0 46 38 84 84 84h416z" horiz-adv-x="1000" />

<glyph glyph-name="netunmount" unicode="&#xe824;" d="M917 342c4 229-179 421-409 425-231 4-420-179-425-409-4-229 180-421 409-425s421 180 425 409z m-750 14c4 184 156 332 339 327 77-2 148-29 202-73l-475-458c-43 56-68 127-66 204z m125-266l475 458c43-56 68-129 66-206-4-184-154-332-339-327-77 4-148 31-202 75z" horiz-adv-x="1000" />

<glyph glyph-name="places" unicode="&#xe825;" d="M750 767h-500c-46 0-83-38-83-84v-666c0-46 37-84 83-84h500c46 0 83 38 83 84v666c0 46-37 84-83 84z m-500-84h208v-333l-104 63-104-63v333z" horiz-adv-x="1000" />

<glyph glyph-name="chmod" unicode="&#xe826;" d="M381 302l-298 83 55 167 291-119-19 334h186l-19-334 286 113 54-173-298-83 196-250-148-107-173 273-167-262-148 102 202 256z" horiz-adv-x="1000" />

<glyph glyph-name="accept" unicode="&#xe827;" d="M500 767c-231 0-417-186-417-417 0-229 186-417 417-417 229 0 417 188 417 417 0 231-188 417-417 417z m-83-625l-209 208 59 58 150-150 316 317 59-58-375-375z" horiz-adv-x="1000" />

<glyph glyph-name="menu" unicode="&#xe828;" d="M83 73h834v92h-834v-92z m0 231h834v92h-834v-92z m0 323v-92h834v92h-834z" horiz-adv-x="1000" />

<glyph glyph-name="colwidth" unicode="&#xe829;" d="M377 31h246v638h-246v-638z m-294 0h246v638h-246v-638z m588 638v-638h246v638h-246z" horiz-adv-x="1000" />

<glyph glyph-name="fullscreen" unicode="&#xe82a;" d="M202 231h-119v-298h298v119h-179v179z m-119 238h119v179h179v119h-298v-298z m715-417h-179v-119h298v298h-119v-179z m-179 715v-119h179v-179h119v298h-298z" horiz-adv-x="1000" />

<glyph glyph-name="unfullscreen" unicode="&#xe82b;" d="M83 113h180v-180h118v298h-298v-118z m180 475h-180v-119h298v298h-118c0 0 0-179 0-179z m356-655h119v180h179v118h-298v-298z m119 655v179h-119v-298h298v119c0 0-179 0-179 0z" horiz-adv-x="1000" />

<glyph glyph-name="empty" unicode="&#xe82c;" d="M813 463l-42-75-531 304 43 75 134-77 58 18 190-108 16-60 132-77m-628-442v525h221l302-175v-350c0-48-39-88-87-88h-348c-48 0-88 40-88 88z" horiz-adv-x="1000" />

<glyph glyph-name="undo" unicode="&#xe82d;" d="M375 767l-292-209 292-208v125h188c106 0 187-81 187-187s-81-188-187-188h-480v-167h480c195 0 354 159 354 355s-159 354-354 354h-188v125z" horiz-adv-x="1000" />

<glyph glyph-name="redo" unicode="&#xe82e;" d="M625 767v-125h-187c-196 0-355-159-355-354s159-355 355-355h479v167h-479c-107 0-188 81-188 188s81 187 188 187h187v-125l292 208-292 209z" horiz-adv-x="1000" />

<glyph glyph-name="preference" unicode="&#xe82f;" d="M810 310c3 13 3 28 3 42s-3 27-3 42l88 69c8 6 10 16 4 27l-83 143c-6 9-17 13-25 9l-104-42c-21 17-46 31-71 42l-15 108c-2 8-10 17-21 17h-166c-11 0-19-9-21-17l-17-110c-25-11-48-25-71-42l-104 42c-8 4-21 0-25-9l-83-143c-6-9-2-21 4-28l90-68c0-15-2-27-2-42s2-27 2-42l-88-68c-8-7-10-17-4-27l83-144c7-9 17-13 25-9l104 42c21-17 46-31 71-42l17-110c2-10 10-17 21-17h166c11 0 19 9 21 17l17 110c25 11 48 25 71 42l104-42c10-4 21 0 25 9l83 144c7 8 2 20-4 27l-92 70z m-310-106c-81 0-146 65-146 146s65 146 146 146 146-65 146-146-65-146-146-146z" horiz-adv-x="1000" />

<glyph glyph-name="mkdirin" unicode="&#xe830;" d="M583 100v125h-166v167h166v125l209-209m41 292h-333l-83 83h-250c-46 0-84-37-84-83v-500c0-46 38-83 84-83h666c46 0 84 37 84 83v417c0 46-38 83-84 83z" horiz-adv-x="1000" />

<glyph glyph-name="selectall" unicode="&#xe831;" d="M167 767c-46 0-84-38-84-84v-41h84v41h41v84h-41z m125 0v-84h83v84h-83z m166 0v-84h84v84h-84z m167 0v-84h83v84h-83z m167 0v-84h41v-41h84v41c0 46-38 84-84 84h-41z m-709-209v-83h84v83h-84z m209 0v-83h416v83h-416z m541 0v-83h84v83h-84z m-750-166v-84h84v84h-84z m209 0v-84h416v84h-416z m541 0v-84h84v84h-84z m-750-167v-83h84v83h-84z m209 0v-83h416v83h-416z m541 0v-83h84v83h-84z m-750-167v-41c0-46 38-84 84-84h41v84h-41v41h-84z m750 0v-41h-41v-84h41c46 0 84 38 84 84v41h-84z m-541-41v-84h83v84h-83z m166 0v-84h84v84h-84z m167 0v-84h83v84h-83z" horiz-adv-x="1000" />

<glyph glyph-name="selectnone" unicode="&#xe832;" d="M83 683c0 46 38 84 84 84h125v-84h-125v-125h-84v125m834 0v-125h-84v125h-125v84h125c46 0 84-38 84-84m-84-666v125h84v-125c0-46-38-84-84-84h-125v84h125m-750 0v125h84v-125h125v-84h-125c-46 0-84 38-84 84m334 750h166v-84h-166v84m0-750h166v-84h-166v84m416 416h84v-166h-84v166m-750 0h84v-166h-84v166z" horiz-adv-x="1000" />

<glyph glyph-name="selectinvert" unicode="&#xe833;" d="M175 767h92v-92h91v92h92v-92h92v92h91v-92h92v92h92v-92h100v-92h-92v-91h92v-92h-92v-92h92v-91h-92v-92h92v-92h-92v-100h-92v92h-91v-92h-92v92h-92v-92h-91v92h-92v-92h-100v92h-92v92h92v91h-92v92h92v92h-92v91h92v92h-92v100h92v92z" horiz-adv-x="1000" />

<glyph glyph-name="lock" unicode="&#xe834;" d="M500 131c44 0 79 36 79 79s-35 80-79 80-79-36-79-80 35-79 79-79z m238 359h-40v79c0 108-88 198-198 198s-198-90-198-198v-79h-39c-44 0-80-36-80-80v-395c0-44 36-80 80-80h477c43 0 79 36 79 80v395c-2 44-38 80-81 80z m-361 79c0 69 54 123 123 123s123-54 123-123v-79h-246v79z m361-556h-475v395h477v-395z" horiz-adv-x="1000" />

<glyph glyph-name="perms" unicode="&#xe835;" d="M738 490h-40v79c0 108-88 198-198 198s-198-90-198-198v-79h-39c-44 0-80-36-80-80v-395c0-44 36-80 80-80h477c43 0 79 36 79 80v395c-2 44-38 80-81 80z m-238-359c-44 0-79 36-79 79s35 80 79 80 79-36 79-80-35-79-79-79z m123 359h-246v79c0 69 54 123 123 123s123-54 123-123v-79z" horiz-adv-x="1000" />

<glyph glyph-name="unlocked" unicode="&#xe836;" d="M500 131c44 0 79 36 79 79s-35 80-79 80-79-36-79-80 35-79 79-79z m238 359h-40v79c0 108-88 198-198 198s-198-90-198-198h75c0 69 54 123 123 123s123-54 123-123v-79h-360c-44 0-80-36-80-80v-395c0-44 36-80 80-80h477c43 0 79 36 79 80v395c-2 44-38 80-81 80z m0-477h-475v395h477v-395z" horiz-adv-x="1000" />

<glyph glyph-name="symlink" unicode="&#xe837;" d="M917 373l-325 325v-185c-323-46-463-280-509-511 117 163 277 236 509 236v-190l325 325z" horiz-adv-x="1000" />

<glyph glyph-name="resizable" unicode="&#xe838;" d="M917-67h-167v167h167v-167m0 334h-167v166h167v-166m-334-334h-166v167h166v-167m0 334h-166v166h166v-166m-333-334h-167v167h167v-167m667 667h-167v167h167v-167z" horiz-adv-x="1000" />

<glyph glyph-name="close" unicode="&#xe839;" d="M917 683l-84 84-333-334-333 334-84-84 334-333-334-333 84-84 333 334 333-334 84 84-334 333 334 333z" horiz-adv-x="1000" />

<glyph glyph-name="plus" unicode="&#xe83a;" d="M917 290h-357v-357h-118v357h-359v118h357v359h118v-357h359v-120z" horiz-adv-x="1000" />

<glyph glyph-name="return" unicode="&#xe83b;" d="M513 494c-109 0-207-40-282-106l-146 145v-366h367l-148 150c56 48 129 77 209 77 143 0 266-94 308-225l96 31c-54 171-215 294-404 294z" horiz-adv-x="1000" />

<glyph glyph-name="minus" unicode="&#xe83c;" d="M917 292h-834v118h834v-118z" horiz-adv-x="1000" />

<glyph glyph-name="hdd" unicode="&#xe83d;" d="M167 767l-84-500h834l-84 500h-666z m-84-542v-292h834v292h-834z m84-83h41v-84h42v84h42v-84h41v84h42v-84h42v84h41v-84h42v84h42v-84h41v84h42v-84-41h-42-41-42-42-41-42-42-41-42-42-41v41 84z m604 0c35 0 62-27 62-63s-27-62-62-62-63 27-63 62 27 63 63 63z" horiz-adv-x="1000" />

<glyph glyph-name="sql" unicode="&#xe83e;" d="M500 767c-85 0-162-15-223-40-29-12-56-27-75-48s-35-48-35-79v-333-167c0-31 14-58 35-79s46-38 75-50c61-23 138-38 223-38s163 15 223 40c29 12 56 29 75 50s35 46 35 77v167 333c0 31-14 58-35 79s-46 36-75 48c-60 25-138 40-223 40z m0-84c75 0 144-14 190-33 23-10 39-21 50-29s10-17 10-21 0-10-10-19-27-21-50-29c-46-21-115-35-190-35s-144 14-190 33c-22 10-39 21-50 29s-10 17-10 21 0 10 10 19 28 21 50 29c46 21 115 35 190 35z m-250-195c8-5 17-11 27-15 61-25 138-40 223-40s163 15 223 40c10 4 19 10 27 15v-55c0-4-2-10-10-20s-27-21-50-30c-46-20-113-33-190-33s-144 13-190 33c-22 11-39 21-50 30s-10 16-10 20v55z m0-167c8-4 17-11 27-15 61-25 138-39 223-39s163 14 223 39c10 4 19 11 27 15v-54c0-4-2-11-10-21s-27-21-50-29c-46-21-113-34-190-34s-144 13-190 34c-22 10-39 21-50 29s-10 17-10 21v54z m0-167c8-4 17-10 27-14 61-25 138-40 223-40s163 15 223 40c10 4 19 10 27 14v-54c0-4-2-10-10-21s-27-21-50-29c-46-21-113-33-190-33s-144 12-190 33c-22 10-39 21-50 29s-10 17-10 21v54z" horiz-adv-x="1000" />

<glyph glyph-name="dropbox" unicode="&#xe83f;" d="M665 123l-165 125-160-125-94 56v-60l254-169 256 167v60l-91-54z m252 471l-246 156-171-140 256-150 161 134z m-834-269l252-150 165 127-242 154-175-131z m252 425l-252-162 175-132 242 154-165 140z m165-448l167-127 250 150-161 135-256-158z" horiz-adv-x="1000" />

<glyph glyph-name="googledrive" unicode="&#xe840;" d="M898 254l-267 463h-262l0 0 266-463h263z m-488-39l-131-232h506l132 232h-507l0 0z m-77 443l-250-443 132-232 254 444-136 231z" horiz-adv-x="1000" />

<glyph glyph-name="onedrive" unicode="&#xe841;" d="M544 602c-75 0-142-44-173-106-19 10-42 17-65 17-75 0-133-61-133-134 0-6 2-10 2-16-52-7-92-50-92-105 0-58 46-104 105-104h83c-4 15-8 29-8 44 0 58 37 108 89 127 11 88 88 156 177 156 54 0 104-23 138-64 12 4 27 6 41 6 11 0 19 0 30-2-7 102-90 181-194 181z m-15-148c-81 0-148-66-148-148v-2c-50-6-89-50-89-102 0-58 46-104 104-104h431c50 0 90 40 90 90s-40 89-90 89c0 67-54 119-119 119-18 0-35-4-52-13-27 42-73 71-127 71z" horiz-adv-x="1000" />

<glyph glyph-name="box" unicode="&#xe842;" d="M898 365c-38 93-113 139-213 145-14 3-20 7-25 19-12 36-35 67-66 90-104 79-265 29-306-94-3-8-13-17-21-21-29-14-63-23-88-41-81-59-114-165-83-257 33-98 123-162 227-162h175c60 0 123-2 185 0 67 2 125 25 169 73 65 71 83 156 46 248z m-100-244c-15-11-29-6-40 8-14 19-29 40-45 61-17-21-30-40-44-59-9-12-21-23-38-12s-16 25-8 41c-58-62-117-58-198 11-23-29-50-48-85-54-67-13-138 43-138 110v192c0 21 13 33 27 33 17 0 27-12 27-33v-84c32 19 63 23 94 17 31-8 56-25 75-54 4 2 6 6 8 8 50 59 125 63 182 11l8-9c-10 17-10 32 2 40 17 10 29 2 40-10 14-19 29-38 45-59 13 15 25 29 36 44 4 6 8 12 12 17 13 14 27 16 40 6 15-13 12-25 2-40-15-18-29-39-44-58-8-10-8-17 0-27 17-19 32-40 46-61 11-16 8-31-4-39z m-473 179c-37 0-67-29-67-65 0-37 27-64 65-64s65 27 67 62c0 38-27 67-65 67z m202 0c-37 0-67-29-67-65 0-37 30-64 67-64 38 0 67 27 67 62 0 36-31 67-67 67z m106-4c2-6 5-13 5-19 14-37 10-75-13-108 17 19 31 37 46 58 4 4 2 15-2 19-11 17-23 33-36 50z" horiz-adv-x="1000" />

<glyph glyph-name="help-circle" unicode="&#xe843;" d="M500 767c-231 0-417-186-417-417s186-417 417-417 417 188 417 417-188 417-417 417z m42-709h-84v84h84v-84z m85 323l-37-37c-30-31-48-56-48-119h-84v21c0 46 19 87 48 119l52 52c15 14 25 35 25 58 0 46-37 83-83 83s-83-37-83-83h-84c0 92 75 167 167 167s167-75 167-167c0-37-15-71-40-94z" horiz-adv-x="1000" />

<glyph glyph-name="move" unicode="&#xe844;" d="M425 465h152v114h115l-192 188-190-190h115v-112z m-40-40h-114v115l-188-190 190-190v115h115v150z m532-75l-190 190v-115h-114v-152h114v-115l190 192z m-342-115h-152v-114h-115l192-188 190 190h-115v112z" horiz-adv-x="1000" />

<glyph glyph-name="save" unicode="&#xe845;" d="M731 767h-556c-50 0-92-42-92-92v-648c0-52 42-94 92-94h648c52 0 92 42 92 92v556l-184 186z m-231-742c-77 0-140 63-140 140s63 139 140 139 140-62 140-139-63-140-140-140z m140 465h-465v185h463v-185z" horiz-adv-x="1000" />

<glyph glyph-name="loading" unicode="&#xe846;" d="M500 577v-114l152 152-152 152v-115c-167 0-302-135-302-302 0-60 17-115 48-160l56 56c-17 31-27 67-27 106-2 123 100 225 225 225z m256-67l-56-56c17-31 27-66 27-106 0-125-102-227-227-227v114l-152-152 152-150v115c167 0 302 135 302 302 0 60-17 115-46 160z" horiz-adv-x="1000" />

<glyph glyph-name="info-circle" unicode="&#xe847;" d="M500 767c-231 0-417-186-417-417s186-417 417-417 417 188 417 417-188 417-417 417z m42-625h-84v250h84v-250z m0 333h-84v83h84v-83z" horiz-adv-x="1000" />

<glyph glyph-name="prev" unicode="&#xe848;" d="M758 669l-100 98-416-417 416-417 98 98-316 319 318 319z" horiz-adv-x="1000" />

<glyph glyph-name="next" unicode="&#xe849;" d="M342 767l-98-98 316-319-318-319 98-98 416 417-414 417z" horiz-adv-x="1000" />

<glyph glyph-name="ql-fullscreen" unicode="&#xe84a;" d="M500 767l171-171-417-417-171 171v-417h417l-171 171 417 417 171-171v417h-417z" horiz-adv-x="1000" />

<glyph glyph-name="ql-fullscreen-off" unicode="&#xe84b;" d="M858 767l-177-177-118 118-59-354 354 59-118 118 177 177-59 59z m-362-421l-354-58 118-119-177-177 59-59 177 177 119-118 58 354z" horiz-adv-x="1000" />

<glyph glyph-name="close-circle" unicode="&#xe84c;" d="M500 767c231 0 417-186 417-417s-186-417-417-417-417 186-417 417 186 417 417 417m150-209l-150-150-150 150-58-58 150-150-150-150 58-58 150 150 150-150 58 58-150 150 150 150-58 58z" horiz-adv-x="1000" />

<glyph glyph-name="pin" unicode="&#xe84d;" d="M667 350v333h41v84h-416v-84h41v-333l-83-83v-84h217v-250h66v250h217v84l-83 83z" horiz-adv-x="1000" />

<glyph glyph-name="check" unicode="&#xe84e;" d="M348 167l-198 198-67-69 265-265 569 569-67 67-502-500z" horiz-adv-x="1000" />

<glyph glyph-name="arrowthick-1-s" unicode="&#xe84f;" d="M498-67l290 290-75 73-163-163-2 634h-104l2-634-163 159-73-75 288-284z" horiz-adv-x="1000" />

<glyph glyph-name="arrowthick-1-n" unicode="&#xe850;" d="M502 767l-289-290 72-73 165 163v-634h104v634l163-163 73 75-288 288z" horiz-adv-x="1000" />

<glyph glyph-name="caret-down" unicode="&#xe851;" d="M902 569c-10 10-23 14-37 14h-730c-14 0-27-4-37-14s-15-23-15-38c0-14 5-27 15-37l365-365c10-10 22-14 37-14s27 4 38 14l364 367c11 10 15 23 15 37 0 13-4 25-15 36z" horiz-adv-x="1000" />

<glyph glyph-name="caret-up" unicode="&#xe852;" d="M917 165c0 14-4 27-15 37l-364 367c-11 10-23 14-38 14s-27-4-37-14l-365-365c-10-10-15-21-15-37s5-27 15-38 23-14 37-14h730c14 0 27 4 37 14s15 23 15 36z" horiz-adv-x="1000" />

<glyph glyph-name="menu-resize" unicode="&#xe853;" d="M627 767c0-277 0-554 0-834-31 0-62 0-94 0 0 277 0 557 0 834 32 0 63 0 94 0z m-160 0c0-277 0-554 0-834-32 0-63 0-94 0 0 277 0 555 0 834 31 0 62 0 94 0z" horiz-adv-x="1000" />

<glyph glyph-name="arrow-circle" unicode="&#xe854;" d="M500 767c-229 0-417-188-417-417s188-417 417-417 417 188 417 417-188 417-417 417z m0-577l-260 260 60 60 200-200 200 200 60-60-260-260z" horiz-adv-x="1000" />

<glyph glyph-name="tn-error" unicode="&#xe855;" d="M500 767l-342-152v-227c0-211 146-407 342-455 196 48 342 244 342 455v227l-342 152z m38-257v-227h-75v227h75z m-38-385c-27 0-50 23-50 50 0 27 23 50 50 50l0 0c27 0 50-23 50-50l0 0c0-27-23-50-50-50" horiz-adv-x="1000" />

<glyph glyph-name="warning-alert" unicode="&#xe856;" d="M538 256h-75v152h75m0-304h-75v75h75m-455-189h834l-417 720-417-720z" horiz-adv-x="1000" />

<glyph glyph-name="caret-right" unicode="&#xe857;" d="M719 388l-365 364c-10 11-23 15-35 15-13 0-27-4-38-15s-14-23-14-37v-730c0-14 4-27 14-37s23-15 38-15c14 0 27 4 37 15l365 365c10 10 14 22 14 37 0 15-6 27-16 38z" horiz-adv-x="1000" />

<glyph glyph-name="caret-left" unicode="&#xe858;" d="M281 388l365 364c10 11 23 15 35 15 15 0 27-4 38-15s14-23 14-37v-730c0-14-4-27-14-37s-23-15-38-15-27 4-37 15l-363 365c-10 10-14 22-14 37 0 15 4 27 14 38z" horiz-adv-x="1000" />

<glyph glyph-name="theme" unicode="&#xe859;" d="M500 767c-229 0-417-188-417-417s188-417 417-417c38 0 69 32 69 69 0 19-6 33-19 46-10 12-17 29-17 46 0 37 32 69 69 69h81c127 0 232 104 232 231 2 206-186 373-415 373z m-254-417c-38 0-69 31-69 69s31 69 69 69 69-32 69-69-32-69-69-69z m137 185c-37 0-68 32-68 69s31 69 68 69 69-31 69-69-29-69-69-69z m234 0c-38 0-69 32-69 69s31 69 69 69 68-31 68-69-31-69-68-69z m137-185c-37 0-69 31-69 69s32 69 69 69 69-32 69-69-29-69-69-69z" horiz-adv-x="1000" />

<glyph glyph-name="logout" unicode="&#xe85a;" d="M546 767h-92v-463h92v463z m225-100l-67-67c73-60 119-150 119-250 0-179-146-325-325-325s-323 146-323 325c0 102 46 192 119 250l-65 67c-89-77-146-190-146-317 0-229 188-417 417-417s417 188 417 417c0 127-57 240-146 317z" horiz-adv-x="1000" />
</font>
</defs>
</svg>themes/gray/icons/material.woff000064400000033410151215013520012563 0ustar00wOFF7]�GSUBX;T �%zOS/2�AV> I�cmap��\��cvt � �fpgm��p���Ygasp	`glyf	h(@�3Qkhead1h06��hhea1�$<�hmtx1�pg`loca1���Rmaxp2�  ��name2�}�w��post4 k���prep6�z��A+�x�c`d``�b0`�c`rq�	a��I,�c�b`a��<2�1'3=���ʱ�i f��&;Hx�c`d~�8�������iC�f|�`��e`ef�
�\S^0��b���$��Arox���nDџd��m�����̔R|�an��u���VޕIڙ1���
0���Ϙ��������N_3�׳�����0=����yֲ�:߷�E6���la+���v����a/���r���(�8�	Nr�Ӝ�,�8�_����U�q������]�q�<��y�S�����y�[��|����W��%~�_���L���,��a�g��ή����3��~j�S��2��)SBj�Y��]�4�2W�L)�F�ԑ2�L")3I�t�2��L,)�K��2ϤL6)3Nʴ�2��l)�@�V���l
);C���G�l)�Eʖ��o�l�qR����$eCI�UR����%e�I�iR���='e�I�}R�)����@ʍ �Z�r7H� ��R�
)���KC��!�r�H�H��&R�)����E�
#嚑r�H�p��:R�)���KH�M$�:�r'I����NR�()���UL�	0�x�c`@��?�l�x��Viw�FyI��,%-ja��i�F&l��	A�c ]�����;����_�d�s�7~Z�/$���p���w�����eZ��둔�/���&��<	�M�Q|(;{!e���Q��ڷ�DD"P���D�Y�d|�QF˶�WM�-=�.[�A�U�~:ʱ;��f3th=�%UU�H�=RҦe��+I+����W�PˆN"i���H�g��h5��(�l��(R$��Ay����	�͐�ʧ����أ�V�K���/y�w9?�_oQ��@Ȏ���t%_�[[aܴ��(Tv�wBl��T�f��F�+2�Ќ`�|�+?��!Y-�O��G�Z��A�eN�K>���)q�Y���	��3��>���)�x�zG%�)as4I�0r`%e�*����8�uZ�[�~��ї�h�Pwb<[[9Q��hR��L��Iͣ)
��t&x̯(?�I^mc5��G�8fƄD"-�KSA,;��)ͣ����v-Z���ܣ���V���S��FV�b:���i�/�i��"E��~L�A�2�-6Ô�o���ז������+�}�D���O�)	L��U�V@b�kY��լ���wC�V����rǾ�q�_33���߉ӳ#.=s�K�|�u=�ש�rqfyN�Y���4����Y���K[��,?�i��G:cyA�t���0��0��CX^�!,a�CXa�%��c�r����e��SI�ڙXlB`b���E�j*�TB�hTjC�n�TϪe�^<�9�H�Ț_1Ε�F��-o;W���o��9�R֋�?���T%�b�Ó����l'�6�xtM��U=��_TTX�H�X(ʲlpg"��:��j��C�l�<��u˚��71BP��7܃NYIY����۲�;�r8,I17�V�"#��~�Yʞ�|p�Je�j���'1��$�q[Q6H����
�y�&a�
�N�
�an�y'\�z�,��E��(��[��D��h����a��B�oq$4��~T��5�4Rn�_�ٺmB��#*vò�������m�|��գ���^�N��~f�� 51{�tq�ʻZ�2GmS��SךC�U���Q����9k�n�'z_Ӫ��\,��m�R&�a�
��ťP�e4I���P������|�+U��q$�NԷ��`��G��c�r
.���n��l�����70k��Y���t�!G����
|�qz���!�c���&���ݵ��S���9>���a�d�-�0�f��s�2��s|��u�/�� d��9�0'x�_1����a�
s�|�1s$�a����0�-^�]��AU�SOX���PSe�����A�� �����/�g����AL�Uӝ!�7^��1����L��e��|�
�]l>����@���x��{	x�}�9qc@$��A� @�C$A��C�H�ASm)rdZ�TK�[�I�n�]���8N�X�FL�ϑ9���j�/�m�~�ױ����M�n��S�]}�h�o�%���]�3�f�͛w����\{�{��D�$V�H@7s@	=F�cO�7�.EQD��S��Ԝ�3AN���^Y�����WaN뿡_`�뢟%2i/�x��d�(P؄��`؍Ua�뤂��ń	��0ץ�^��_�������E������o7Q��F���,�7hVq�J���|W
o���F���_���oS-�dIx�Jd3^>�A�i��=��u��>��_��k�aA���H����3D!���J�
8�8y�|�|��EDU�xs�B^�ka8{U�f5�$���3وn�d�8ɮ��9���_w�a|�9�-{JJ�v�s��ɢ�5�&��h�P��J8�M�K��޷�ޒB�Kqحf�DT����3�ı�A�{�jXq�9;�Y��d�c(�t��.�;��-�WÙ[�a�4�Z�l�~�8H���u��܄=o��ǁ񇐨Dn��#���D�BDQ�KQ��O>g�݄'�E"�e����RG����V޻�-U0�on������R�����+j��4h��S=ȅ87C���!p;�'�x�d�7��!��!��ޓ��^�/����_��{v�:/�Wt��s`ׁr��p�s;�$���S�R��Ա�V�[r��&��*��SD����p>���ܸ��a��~��Jsw��ry��5t�F�-Bc�c2�'���x��݄�$�D�#<�����%�������E����Go���R3��VKs�ϫz�.���DŌ����jy-�cB�]7������=�F�_XZ*/-CCY�"7J��H���|�J��� 7(ǰ�L�(��#�B�'S^ �)g��X�E6��
�q����-�*
�)�ʚ![d��;��6�K��>�#juFt�q�*��L?���c��Z��e66x��#Wukc�?3\6h�ۏ�5��M>׊���h��@P*`O��<PA�3x�­D��� �����dB���{D����X�pLKh���Z�ÉD��*����v=MnN�q�z$��e�����?�P%[K�q>8��q@B�)����AF���M��f3!vŮ8f��f�`C���M#
-6�	����%�(���~Bʆ�/���CG{���y��Z�����S��~��G���'yĘ?��G����(M�qQ�V\d:�ċ$��(#as"�P���y�_A����d��R�@K�Î�V$IH�mG$lAeb��8=>���a��HBBq�S,��x"��#���S���;���������gJ#�x<6R�,O�u:X�%��fv���X:3���c'�_��Tid��3�����w˷d����3�L����2iB�.
��D�-�ŧ�s�DN��a���a��)��Ѳ�ij�4)��dh��mN	��k���P<�/���$|��>L���T0��>O�k�`��g��=�	��g��ы`��q�c�t�^2D��gK���)%0�Lf'�4�,����������&0��`���'��(qފ�f�q�e���6��R��p75<\�w�������@~�0��N�v��'��h�O��T���	�;"v�K��Z�g�"����z��k܍��ç]�����������.V���.U���ݭ��M��6�^-C���V^Xی����؜խ�#�'vx��:j��n�Y%'�K�,L����L	�!�Ir�Ȣ ���8Cı�)�H<�"�P���
���B�����#J�	�07?�����h������d��_sz�!�Mշ&��&�ᎎ0R�Y��m��7�SCM�
=p�ˮ�H��q�D�����t���%�
W���O<C��]�~��O���n� 	�'�$|��̶Q�i씎GP�o�i��X�ģz0�D����]����i���Lfb�#Vb���y����<��d�����BVy,����Z�As�֜�.�k�����-�A"�k-"K��܋8,Nn۲itd�/��Τ:��D0�ys��ۉ��Nd�E�\#�APWh1�ʮ(>D>�J�8�T� �i����#0T3'y���������ܬ|�Y�o+M��6���?�+�mq�)s��A_�}.���\�㳈NH�J��J�,{�:x��tnV4�g���Kf������\�&gC�e�_�I�6)�����5�q���rE�̻mT��U�sP�Ӣ8�P��A�0����
���سS�\<NH��C�ӓ�����tW�'�
k�#�XX�:A�Y���R')��VA�[0�PP!�ĉ�?_N�b�<�J���\�F3e,��
;�D�ݺ��`��Ғ^�L��ܬ�V��c���0��I�7�W��˕J�09�#��6�Cbxd�W�¬�����P��@<�_O��,�g��n����z:>�.���]v��g;��20�}ą�G�l+m�#V�� ���e�dỌ���X�،�a��T8�qI�C�p
5Z�4��\u}mT�>o��bi����Uw<v�P��LK3�Wn�5�
-��f�p[����[�]킱��`�~8�}�\��m�D�� ȇ�cc�P>@�6a�33�J!��ʹ�@q�Cy�l<XQ\�S@-��3�94�a���ӿr��ju�c�=�W�-4ڝ���+u�L��ւ2�F��8~<���fB�$�dv+��hB���
��p�����v��M�
?���������U��֝C��E�d��	�$*�`@t!!��u�̙�wVL�{�;�Z��;՚�Z�v�IhR�ff����S��@����U��am�A��q��\���8w��V�;xϾ퓩t:5���F�J�?^�Ӭ���W������k]=�?(7��C��-
{��,!���HDs�2�#D��`"�萃����P[ȥ(޾�lȿ4��"J�5`J��W#�5�:��:�Q1�É<���_��Fp���-v�e:�V}1Q���,�i:M��ߑ��<g���"��ݍ�� ��ǃ�hA�&�e���a������ݛt���Y7���y�S�s�X�tw�#�k��;I��U����d1	�5��.��I�Y�PG�T��91��}������D*��2�L��	�D�j�LJ�+�9[P�����|�
ǩ1{�]�5�٦��y��q��O��立�+�?}^?�*���
����|��y�����#�Y-T0�
����>b�8�����{bÁ�a��?�
�t���{�NU_�m�^ҷ\�v�g���t�F���(�I6���&8jf�."�[0�0����U~Ϥ�o+�s=�������{&�sa�ƹa�JŚ�fB���+L~���t%�)�0�4Y\fK�m	�l���;�t뺇o**�8����&��㲸�~-��liu�F��O��|�H�N�!m$�:���
�D��i�>V2gA�vC���O>D�wҌz�F�q+͊�y�ښ���CqKL��A;��G�N��	Ά��i��%�C�^�s�����@U��\��*��Mi�˄�A��r�gj%�ko(�ʹ��i��[m��^���_�w|���۷OL��
�����x$�*�5��d���;o�11=1=59�mQ�Ʊ��Pid�C����|_�%Lo�7ד�b,�E�����ڦ�2'��Q<n��is:�&��j13?1�A�Fd�m�����n��eh*��GI3�ia�Ҹ,��p�0B���HO%Y)����ժ�
}�R�����=�˗����LjY=��赬�LV�?v��2���˗#=����`���\./'+=�Z՚�7dI��	��f�bQ�<�2�Ci"2�"3���d*�D,i�7�ZR�0ca͂�ߍpȀ���k��`y���I�d���A�ܹ������s���`��58��
������w�ā�ڠT9��-�+��œ�$�F�@Jk�:��tS�:��%J*�H�|�NڢZ[2�L6#��uƴ�ޭ
\��O�ck]��4��[�~eۖdggr˶J�������?.�~�B���o[;z
}�Gk��uKGG"j��5��¯�>0�p��
����
5q�-isQ��g�F��&��Ȭ�8���ȣ-.j�1q�i��L�n�����z9\do�F��3/�
�e��	������mѧH�$͝s�
�P��;�!�rH��x��:�t�G�@C�b����<�/�D�������
g�>����^p����tC7��<�1F�t�ڛ|7E=�9ĮY-l¥bNT5U[���.�"�Ƶ@��OS\��*���ǩ�bB,�
EM��~y�hO&��u����;��a�p��۷���3<l�'����&�mz�y�y�G�M��I-lI���}#��
k�+��u�-�
w��߰b8�S��.�nJ�R� i^_1����'<�;/���n�0Bž��Be�7z$�>F�S6t�|���C��@��@����}�O-l.\��3G!D��|�Y�D���}�	D}8u��	����lL�	X H6'�:�x��є2%e�0N?sF�.�o6�II�6�k�E��f+G��:�ۋ��:G/1Mv.�4CT�q�rNi��f%y.��a�I���MX�$�*�SZ���Y+��4�(%�`E
� 5���+�9�Ѭ���(��O#i���|�����
@M�c=��b�7�������f�S�!��p�#�F84�5�}��}��Z�(ݿz�#E!��G^�t~��v�K���38pD�R
u3�Ǚ�y��D���o��b$�ވy�w�	9%!ѷ��+�����#GؔV7�����!ki�NZJ�U^�`%��e�aAM�.��|�O�@��W�����@A��c�.?���i&��y�|�((����d-��H)h1�]e] 3�[qs_�E�̕����.�2x6�k�Y���}V}��X�Y'�������EeeX�0�B»٤LȲl�-�:%4��5G8��-7���ڶm������]����`�UDy�Lb�����X�_���V��C����w��#Տ׶����1���f3p<�O�@�	=�@<�}q0�᠘��b��y��r�\F�h=tG-AB �h�3��S~p:.�>}A����q�…ӿ�_=
g/����m:��ɍ���T2j�c"�0�nqh[К�`�&Bvi��b}��)�
{Z~��/@�)��u�4v�<�CXx������Bo]�/��H����q��8��S\os-؏j�PrB=��uuT��󡁋N�H����'�{r�u׆������x��t��p��P�[n3�`ad�F������mId�|�h('Wi��4����ݝ����C�W�3;3�ݙ�3�ߦ�^����}dw�rw�-�XT���/-��f���W��& ����"+�X86��jk��y
����|k�|Kw7{�<�T�Y��߂(��ĺ�z�]�������?��'R,���8�Q�pp��ύ�]O�;�C#�a��۷V
U����W�|q2(�g�u�(%���
�G�xU��A��#�e��^^v�'�u���#R�,��#mj����h�#��+#�tMeM��^��nߘHl���`k���f�.?�6JG��.�l��v�;8AzTt��$��/oҧj�M+>%8�h�)��qi=�."�F\*s1�Op�ֆ���˒�i1IMrK�AS׈z����s�^I��/-/���}�(��d����I?"�d��ɭd?9_�Y���d��Dž���С��KN��|�Z{.�t;2��i�V7�t����#���jv��m^hnm�M�榹
��@,,����I0pk{<����������Pp�ǫ�����ݳ�R��(zz�鎎�����n۳�}{+�Vnݽk�<Y�e������Ķ�㛇G�GK#CC����bO�'ߛKg���LGWGW�3�����Ρ��i�j��Mʆ=�0�u�M��%xj�����̠�O2����Q�&�h�|�ve�v��d�X5H
��s�N�
�^�\��ކ�r=dQ�e�U�Ć���4��ѩ���N�$y�(��^��J�4�/��
8�Q^��5���p�r,�R�0Oa���Z\-�;� 4��B+���qz�X-s�����2�7eup��Ǝ1�/-U����b;����X��s���*\�
}�.ᯒ�nd�YL�TW�
V\�Gə�gDT�LgnO��8�[A�ic����hAs��<G����o�C4`m�X�H3i�!����A��������8��918�䍒��yY�A�%������?��|�u��_�!������e�w�����������;\Π�I���v�F)'�K��c�njB<��B�y+Ȃ ��Af��,L���(
�3]�ҩ�D��Eu#�F̑��XZ]O���Z=/�m}F`b5ņ�!���N��Ҩ.���ڟO��;�I(C3��pߦ��;p���<��d���������LX�ר��pfG�/���5��~/i��x���"�Cz�H�"��.�Y�o���$�E��%�x�Y�4YZ7�J����S���;��kC��1.���D���8kcZ;���_b�(T��"�̋z�d�P�C���R�l�]��T&i�n.`���P�5,�~�܍�o�����C7Z��r�xc�VrB�I�,W�ɪ�f��̺&f֙@e��0��q�[���Ğ�*���z�t߉��	q��~5~0T������7�aF�jR숦��3�2q[���:Cš#۸Ǘ���-���2�������s����+�kd��������qk�	�h��u�_�0[��0]ѿF��l_wc];�R�*�[�����#�q@����%�!�iF�-��ϟ�?�N� ��(�_3�*���R��yw�ǯ7�k�E VT���vpB	'pq�j|F��-��c�u�����
�������3���ã�]��Ó,�RR�7o�zu��Y��Z��H����ky�}�ՠ�
A&/�^8���[Ͳ(>"�:*xp0O��N�K�7|Ա��?���!�%�h�=�~�Bp6ܒ��#��9EE�vsa����D}�iC�L]V]�XՕ��h��:����мѭp��3f��++���hA���e��l�Ckg�<L��7�S�;����}wSY�Ʒ?⯂�mA��i�CE���\����e�$ϣ�S� ZD�� ����=����m�.
w$[��}v+��մ@��wf�BD��4��@�����eD��!`�a��
G5�J��V$��,��B+w�a�����܂+K=͚�<t�ȉ9���͞)�vG���f�M�c�~���	hw�!P�iai�D����ָ֝;����4s�E<0'Z�f[L[8���3�h�ڢ�d�$��v՟h׭)-䊫�@"WRZ[\��L�K����6;�xfU�3���C�a�]u�&Z�l�Ä��M���D	*���h���;��a}N
�'�ax�A�<����(Y
ר�����XBJ��Xޝ�.��	��+*x����Ss:���<�z��/�=������ե��
�����#g~��OB�K>���g~��|�����Ұ��� �њ��g.4�p�`�s	��2�Z�5"�f�hf�Qv����ԯ�����V��ꃺ?Գ�_���o�%|{�N݇8{��S���ECT�GR&N�9�t@��-�I��E��/%��t��KT\dIޜ�x&U�$�{�ĩd;��
�}��������'	HN�XK�DkD5���j{��)�e_!��C�7�����KΏHi���\S(�h"?�*�ԓrө��f��m�
���7��sC�p>��C�fu#�7�Q��Q��	����o��b�ܚE�S�~��@�s(?�.�l��A8�/�O��r�eĝ���c(<�kKR�ď�P�D$�ROh��1�*{�}yp�"#�~�X��X#,��s��;��>u⾓�-�u�;��EZ�n+�q�������k�m;�`�zk�@̀�X�P�	��R��>j( �#�C��G�
B�Y�#��Fb��m\��j�޸�.�%��ܷo-�-f�՝�<�&����n���׶��P�m�_uwY=VY67qR��P4.%�M��l�;�)�`B�a�j�ʼ�c��E�Y��@k"�����&}���[$���(g��M1M����ŵ���	(�vϧ��E�R��sΦ!G�����--�e��~Ɂz��7[;@�)1a�!Z�9�`+B�ar{�-�U�ŭ��bT���X4��gZ���a�ƹ�25xɓ��8�e�X⿈|�eI�,Gv�}��c���ͬz꘽��L�d
��-7��[�8�XK����3(�juD�W髙L�ʮX��V��ں7g+F�Zs�_��4X��X�ښR�򽖀�uwkF�pWkv}^�H�F��|�6��2H�s��P�,��Mk��$չ�bA��̔}:2Î�[�'�	Yj�3���*�e;���口rOH9Ic��\^H�`B3���w�8��œ�'�}�$U.�`_��9���8y���3�O>qrO�k�컍� B�j^0"K�ԙc�%��9�+�j6`��a����A�coq��C����}X�dI3*}���b-�I?/��)�;�g��Z!^���Ӕ��9������7�Q��F��.�.�J�l.���ZQ�s�/7�����0W��G]{�?q�}��Ҍ
�<��ńZC_1��� !ⲃ1�=�����3�ړ�}~�p'�����_��l~���g�m��o82�X��gj���x��y�Y¥1�7g��1��~`7��J�T���r�����/p
ۢ�;��%�;��i���z}#g�0Dv/��{�����w��:?��E�j�6���6������<[0|h >�xβz���kbl"R��u����#��E|�7|ܾ�O
�©��N=?��iz�S��ʙ��x���	��1�xb,��[͚Zͤ��d����X]��i@>sf��vI�W��'k��,��!K,�l���T���^c�]E��m|����b��(R���'��d�Gc?�9��8,W�^���n�7�T�p&H��7���o\��f����XO��S��z�FNHH���ކ����}z�F�l{��W}苓���ml^i驈榯��?��#OoC��/�=]}����J�q^��}%ȥf
#�ȁ����U���j���E{�w9h���ˡ�n�cv�Jn��mX�M@<"ʟ�4�q���#m�?�pؚ�뾶/�XK�B�bo��=i�oT�@a=Y�"	&��V��.GQ�k��v��������ŔY��Wn�������7 E�71�;��{u�5aТ9e���@�YF�m|��"5=��a&o	7�z�N�'���n'j1�
-.��7���O]����=^5��{]���Nu�'c�@����ěGظ��i����y�o�ڍ�F�y��a'�I��4��m�̳� �X�7d,���7�F*8s�(�	a�-����
y�"��?5r�ѝ�%�	�5�W#;�C��T[[ڎt"ݵ����So�'�޽Q[�ZbIi����)���J���a[m$N2h���#�Cv��	"/�9�p��sG
O�����Ϲ&+g�k�Ѐ����D0�&�P��h���/ۗ�Ld�3Z$�U��Lڠ͹���NFJc�|��<��88��B�Q�|̵J���&�J�u���`RQ���d�/�\lmo�K&�����/���k����G�ݺ+��$�۱�7أF���vҗ\/�9�A�JM>���x}؇���Hد8y�;u%�f�uU�3K,Q�
���D����_o��R�mS�Mn�L��n����=�����ӥ��=S�R)Vs�����;+����m����kux�c`d``��W�9���|e�f~a�z,�A��������	$
k��x�c`d``��$_00�IFT]P�x�c~���<��
�Tu*V���(�v�>�V
n��:h�6�		Z	�
&
�b�
4
�
�B��Z��P����J���^��Bf��������p�$p����>r����B��,R� E\�z�s/px�u��J�0�O��@E�[s%���ɼћ!���vmG۔4�5|Ɨ�Y<m3��
m~��N�_��{�QU��C-��?X���,��_-7p��rxgQ?�Z�ò��8���qe�F��r�<���K�l���g����-7q->�*��(���d����F*ZQ���]�P�\��B�Əc�x*I\��ȍ�~��]���y��<R��:���觾&���u�3f!Z%rb��L���'4&�ۿ��
6ЈxU!$n�8��A}Ҝ��UU�.b:.V��+9���*��"&;�M8��-z���c*�guW�JΩ��ۭz$�������9�<�G�0a�R��$&;y%�X[���;���9���o-ꃱx�mR�r�0�J�H;qz�=a���{��
E�@�@������x&x vq�;���tu�_h��m���A=�1�Yl�f�a�b�cvbvc�b��������N�N���b��\�<.�2��*��:n�&n�6��.��>�!�1��)��9^�%^�5��-��=>�#>�3��+��;~�'~�7�r][L�0̴'&mVe+&�%)��
I����A1�O�a&$5M8��<4d�6ĸ.WZ�rA�XG�\��I�R
�8�T�Q*\g�|(��}�7�R=V�NBe:�e_��01<#b#A�N������$K_Ί�ĤPö�:�Ym\d���b�d���R��A�&�]ʄ�
x^贝pN�c�*�Z�E��nVIi�!R�J����ҭ�J��Ju�4����)�$Tǒ$�)�S����
5"��|�d
U�&��v���t&’EI��+ee�ZW?�*��Ӵe�d�].���@끤�x�"�jZu�6*��pI���H��(�}jЫ�^�z#���3K2^W;���:��G�^k�By�gc���~��|l7R���C���*{���t��I�j�ȩ�<73��T��q"�g��E#�[�')s�˩���]�F�&C�x�c��p"(b##c_�Ɲ�X�6102h����9 ,>0��i��4'����ffp٨�����#b#s��F5oG#�CGrHHI$l�ab�����uK�F&v#�themes/gray/icons/material.ttf000064400000056730151215013520012431 0ustar00�pGSUB �%z�TOS/2> I�PVcmap���\cvt �Q� fpgm���YQ�pgaspQ�glyf3Qk@�head��H�6hhea<�H�$hmtxg`H�plocaRJ\�maxp��K namew��K8�post��N�prep�A+�]P�
0>DFLTlatnliga��z��z��1PfEd@��ZR�jZR�,,
��Z�����	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[T[������������������	�	�	
�
�
����
�
�
������������������������������������ � � !�!�!"�"�"#�#�#$�$�$%�%�%&�&�&'�'�'(�(�()�)�)*�*�*+�+�+,�,�,-�-�-.�.�./�/�/0�0�01�1�12�2�23�3�34�4�45�5�56�6�67�7�78�8�89�9�9:�:�:;�;�;<�<�<=�=�=>�>�>?�?�?@�@�@A�A�AB�B�BC�C�CD�D�DE�E�EF�F�FG�G�GH�H�HI�I�IJ�J�JK�K�KL�L�LM�M�MN�N�NO�O�OP�P�PQ�Q�QR�R�RS�S�ST�T�TU�U�UV�V�VW�W�WX�X�XY�Y�YZ�Z�Z[����
%@"Eoof

+5333	3���}�_�_}��Mw����-�(@%GEDRVJ+!7'	7'!-�%�8��86����7���6�-�'@$GEDRVJ+!!�6�#��89�7�P�68-�@Ef+%#'	'R�8899�&��89��8���@oof%5 +#"3!2654&#!��#11#�#11#���1"�"11"�"1��k�GK�PX@#cmnTWK@"omnTWKY@
	+%!"&546;!2!!�!//!�O!.�fU�Z*#/!�!/P.!�w:��!�j��GK�	PX@(ec`TYMK�
PX@0mkk`TYM@*mk`TYMYY@!	+!2#7#54.#33!'!"&=3b=r��s4�;�s5M=��sgK����5(��5K���ZK�PX@c_RXL@o_RXLY@
+%!!5!'#"3!2654&A�f���S�#11#�#11d�SS1"�"11"�"1���K�
PX@-oec	^RYM@/omk	^RYMY@	
+!'#"3!2654&##5#53533A��S�#11#�#11L}T}}T}XS1"�"11"�"1��}}S}}��A���GK�
PX@0	ome
^RYM@1	omm
^RYMY@+3'%!#!"&5465##33535���M�1"�"11�S}}S}��?��#11#�#1��}}S}}S��9�	^K�PX@$cmnRWK@#omnRWKY@	2+73!265!%#'##!�6&r'5��Z�.�-��'56&,�..\����	
H@EG^^RXL




		3	+#!"&'!535'7��1 ��!1�hu^u�Y������	 ++ �X�n��ů�Ջ������)2O@LGm``TXL10-, 
	))	+"#7#47>2#"'3276764'&'&4&"260aSQ01w��w&%�@?%&&%?@KSM8-p=aTP/11/QS/B./A/�1/QS`��L@?J&%?@�@?%&48$%1/QR�SP/0��!./@/.��\�>@;m^^RXL		 +!"3!!"3!2656&!!��:,K�p�`,,�,, �`��,��M,��,,,������"+4=B�@�?@
	
GA"Fm
	
	m		km`
``
T
XL>>65-,$#>B>B:95=6=10,4-4('#+$+$%+654."327&#"2>54'735"&462"&462"&4625�-MZM--M-'bb(-M--MZM-b$}�e"11E00#"11E00�

�S$(-M--MZM-bb-MZM--M-'b��*�1E00E1�1E00E18

��S#*��J�&N@K`
	^^RXL&%$#"! 
+#."#"3!2654&!2"&46!3!53��:J:�,,,.�� ��K|K�!**!,��,,].  �T_ss�����-+���\����-��*5���V�'5CK�@1
	=G"FK�
PX@N	e
		
ee^	
	^

```RXLK�PX@H	e
		
e^	
	^

```RXLK�PX@N	e
		
ee^	
	^

```RXL@P		m
		
me^	
	^

```RXLYYY@KIFDA?;8530/,*)(''#3%6+'&+54/&#!";3!2654!;!5!2653;;2656&+"32+Rs4s�����jI
Y��KYv


�sr��\�y^\
��\�[
��Q����%.26s@p#G	`
^^
^TXL33&&363654210/&.&.-,+*)(%$!#!"!%!+32+327;5#"&=3#546;5#"&#!5!5!53#%35�SSS0$$/SS��SS/$$0����M�}}�6��S�S!!S*�*S!!�)��S�SS��TT����@
Gof+73'64/&"27S��2l&
U�*j��(&
lU�+�z,I@FG``TXL! '& ,!,
		+"27>7.'&".4>2"2654.�]UR}  }RU�UR}  }RU]3W44WfW44W35BbB5y$#�SS�#$$#�SS�#$�'4WfW44WfW415 1BB1 5��J�
#@ Eooof+%!3	3!!`&��������R�&X���xb��L�
3@0GooRVJ

+#!#!5L���X����&���bbb����-1G@D`^^	T	XL10/.$#--
+%35#"276764'&'&"'&'&47676235#�TT*ra^7997^a�b^7998^aqZNK,..,KN�NK,..,KN�TT��w97^a�a^7998^a�a^89�.,KN�NK,..,KN�NK,.�S���� A@>Gmk^RXL  83+'.#!"3!2656##5#7!�A
��	A6&�'5�^����?&,,�MM��'76&C��\\�..���� ?@<Gmn^RVJ  83+'.#!"3!2656'35337!�A
��	A6&�'5�^������&,,�MM��'76&C��\\E..��#'+/l@i	
^
^RVJ,,,/,/.-+*)('&%$#"! +35#35#35#35#'35#33535#35#35#35#35#35S����ۯ�ݯ�ݯ�ݯ,���m��ۯ�ݯ�ۯ���w�����+����w��v������������A@>
^^	R	VJ
+735#35#35#!5!!5!!5S������L��L��L��F�(�F�F��������-N_@\		m		k
``^TXL/.CB6532.N/N$#--
+%35#"276764'&'&"'&'&476762"34623476767654.�TT*qa^8998^a�a^8998^aqZNK,..,KN�NK,..,KNZ-M-T1D1

T 
-MdSH98^a�a^8998^a�a^89�.,KN�NK,..,KN�NK,.G-M-#11##$-M-����!%48<@IMQ�@
10GK�PX@s

em-e&%$#"		^('

^)^+*^,^/!.R/!.Y M@u


mm-m&%$#"		^('

^)^+*^,^/!.R/!.Y MY@NNJJAA==9955&&""

		NQNQPOJMJMLKAIAIFDCB=@=@?>9<9<;:585876&4&432/-*)('"%"%$#!! 

		
0+"353533533533533354&#35!353#;57335!3535#326=35335�"2T)TSSTSST)T1#�T�T�����2"��T��T�TTTT))#1�5TSS�1#))TTTTTTTT))#1�SSSS)T��"2��N}TTTT�SS�)T2"))TTTT�.,>@;
`^TX	L'%$",,!%!#+4>;5#";5#".!5!%#32+32>4.�#;#��9`88`9��#;#�N��w��#<##<#��9`88`^#;#O8_r_8O#;T�O#;F;#O8_r_8����)>@;GD`TXL$#)))+%#'6765.'&"32677%".4>2�%
#SFH�IF)++)FIT9h)�G��;b::cub9:c�*268T�)++)FI�HF**'$
%�G�:btc::buc9��a�
!k@h	GEDop^	^		R		V
	J!! 

	+7/##3#'3/#55#5!3�����t _}z�d�\
�¯&��{���Ƅ��n��j�U((((��4M6��M��R� &+@(E"Dof%$+'5.4>7&'67'767#��V�())(�W>d::d>�
:>�cH?2q>>	Z7Ȉ
bKN�MKa
Z
Jp�oJ
�,bI?,@��Z8?#a>QZ6��R�*$@!E"!
	Dof+'36#7&5&'55>764'.>>	ZX
:>$$L_<0���>ee>V�())(��?QZ7�bI>6�9Z
$ S��ĭ
J79�87J
Z
bKN�MKa����'F@C
o	oT^XL!
	'&+2+32!!+"&5!5!46;5#"&5463�#11#�)$�����$)�"22"�1#�`"2SSSS2"�#1���!.*@'#G`TXL/*+6'&'.7676%67676.'.�76]`�b_9;76]`�b`9;�/.LNZ9h)�%!"~�!"/-LN[9hVqb`9;76]`�b`9;76]`[MK*,'!�6+h��+j9[MK*,'��A�/@,GpTVJ
+!"3!2654&3'�"11"�"11���hh�1#�f#11#�#1T��??����@

	Df+%73%'}��7#�6��Ĕ���.S�wN��q�S�k��f����"@Gof
+"276764'&'&'7�ra^7997^b�a^8998^a��;�<;�97^a�a^8998^a�b^79���:�=:�s2@/^^RVJ+7!5!5!5!5!5SB��B��BI\�\�\\��@of+%3#3#!3y�����L�~��~��~����H@E
mk	^RVJ
+7#!5#3535!#!#33�w*�ww���˳*w��w��w��w�5w*w�*����C@@	op
^RVJ
+733!#!#3535!5#!5S�v�ִ�*vdw���ww*q�*ew*���ve���w��-�@GEof4+773#!"&-*��+�:���.3$��$4�K0KMl<��
���$44����0@-GE`TXL)!%#+
532#!!276764'&'&+w��$�4V11V4� �`RQ/00/QR`����}1VhV2�00PS�SP/0����0@-GE`TXL%!)!+#"3!5!".4>;%q�`SP0000PS`�!5V11V5�$�}0/QR�SP/1�1VjU1}�����GT7@4$?2GooofIHONHTIT97+654&57>/.&/.+"'&?;26?676?6&'".4>2*XSh*�#$hSZXSh*�#$hS�n(C''CPC''C6
E�*l

n*�DD�*n	
n*�$'CPC''CPC'��>@;Go^RXL	+%5#535!'#"3!2654&G���)��S�#11#�#11d}�}�$S1"�"11"�"1����!%)-159=AJSW[_�K�PX@v

e9#8  e.-,+*		^10/

^432^765 ^<);':%!R<);':%!W(&$"K@x


m9#8  m.-,+*		^10/

^432^765 ^<);':%!R<);':%!W(&$"KY@�\\XXTTKKBB>>::6622..**&&""

		\_\_^]X[X[ZYTWTWVUKSKSPNMLBJBJIHGE>A>A@?:=:=<;696987252543.1.10/*-*-,+&)&)('"%"%$#!! 

		
=+"353533533533533354&#353!5335353!5335353!5335;5#5!#326=35335335�"2T)TSSTSST)T1#�T}�}T��T}�}T��T}�}T��2"))�))#1��SSTSS�1#))TTTTTTTT))#1�SSSSSS�TTTTTT�SSSSSS�)"2T))T2"))TTTTTT����#'+/3�K�
PX@>e	e
^^
R
YM@@m	m
^^
R
YMY@'3210/.-,+*)('&%$" #!"+46;##%#5#53253+5!533#"&3#3#3#%3#S2"}}TBT}}#1TT1#}��T}}"2N�����TT�TT�#1T}}}}T1�C}}"2T}}T2T�fT�����;�@�opR	^	
	
^^^
^R

^VJ;:9876543210/.-,+*)('&%$#"! +33533533533#3#3#3##5##5##5##5#535#535#535#53�\[\\[\\d\\\\\\\\[\\[\d\\\\\\\\�\\\\\\\\[\\[\\d\\\\\\\\[\\[\d��3�",1T@Q`		^
`RXL.-
	0/-1.1,+'&	"
"
+%264&"#54."#"3!265.%4>2#!!�!..B..(5[l[5'!//!� //�w!8D8!�i�%݃/A//B.gO5[66[5O/!�u!//!�!/O"8!!8"O�#��u��3�",C@@``	T	XL)($#""

+#54."#"3!265."&462#54>2�(5[l[5'!//!� //��!..B..Z�!8D8!�O5[66[5O/!�u!//!�!/��/A//B.gO"8!!8"��3�*/[@Xm`		^
`RXL,+
	.-+/,/%"	*
*
+%264&"#54."34>2!"3!265.!!�!..B..(5[l[5K!8D8!��!//!� // �%݃/A//B.gO5[66[5"8!!8"O/!�u!//!�!/�#��u��
@E
Df+	>3����p'X��uE� ���zr�����=@:

^^	R	VJ+#535#53#535#53#53#53������������������C���������������-+'			7�T����TN��TMMT���T��NT����TN��TM����)@&opRVJ+!#!5!3!���v��evg"��evg���4@1GEpTXL
+"'!'>327.'&PJG9�o�+k;F~[`wQT�3����%(:fAU�%&��@RVJ+!5!���B$v����(�K�PX@8oo
	e
^TVJ@9oo
	m
^TVJY@2! %$ (!(

	+!!3353353353353353!%2"&46�TBT�B�)**)**)**)*�6\$$4%$�����$STTTTTTTTTT}}$6#$4%��A�8Tm�p@mD9_UznGF`{F
```	`		T		X	L��usgf[ZNM@>*)88+"32>7654'.2"'&'&'&=4767>32676?"'.'&5 76?"&'&'&532676?"&'&'&5�}b2## +ez?r^##\r?640$

#dm40$

#d�	b}?r.	
&#03p30E
_^


%#brb#
b}?r.	
'#brb#
�('(�,# &''&�,#&T		

	
		

	�	(	7
				 
o''6


p(6

����@
	-+%''%5'
7'77'���^�����_���M���{}}8<��<�������&�����������A@>G	F
DooRVJ+%!!7�����
����������1'����E���Z'Aq@n$ ?,	Gm
mkkm	`TXL)(><9852(A)A#!''+"&#";'&5467>32632."3!264&#4.#". 7^ !%=#'5=,S2'3M,)H6VB(D(&3=+�&44& 7 CZ;/$>$
;),<+F+H)!2S0�(D(:'+=5J4!6 
 '��%gqz�i@fMB�oUF)�2G5Foooo
	`TXLsrihwvrzszmlhqiqKJ?>43"&+&'&'.'&'&#";767>/.7&'.=46266?>&67667676%"2674&3"264&676&'&�75M
03A?56

((0
|N�<S*i@1-
+^=$1!@)-10%f+	

-�'%8%%�''8'(OmD%#	7#&#%<	V`.IYF6~�=
.4.7!�T
*,'	

;	&�&7$#&&6%$5(
7!
����5J@Gmk`^RXL0/,+)(
	+"276764'&'&#537#54?>54&"#4>2�ra^7997^a�b^7998^aGTTU%	
T04
0E1T-MZM-�97^a�a^7998^a�a^89�;T�%,B54#00#-M--M-1����`@]	
GEDoom	n
R
VJ
+353'3#5535'#3'##7#��s��s(r��s�rr��s��s�r���s��s�K�s�sMr������
A@>
G^`TXL5 +!"3!265".4>2!5!��%76&�'5�a&@&&@L@&&@f�/��6&�x'76&,��&@L@%%@L@&ѹ���"�%D@A
GED`TXL+7'"7&5&>#552767654�RGD()08<i=8=i=��RGD()Ar��s)(DGRZF819<h=C819=i=r��s)(DGRY����7@4^^RXL
+"276764'&'&#535#53�ra^7997^a�b^7998^aGTTTT�97^a�a^7998^a�a^89���SS�����-+'	7�d�`�b���b�_�_b?�����-+	Vb<��b��b����b�����	"@Gof		+'!'�_��������_��_��������
�-+'%'77Z�v;bv��[��v�;�w��v��;v���:w�;�v���� (@% Gof
+2"'&'&47676'77'7�ra^7997^a�a^7997^a��:��:��:���97^a�a^7997^a�a^79і�:��:��:������3@0GmnRVJ+35!333535�)�`)S�B�^MTT��ST��T���-+%'	'\�C	9C��E��9C���@Df+'#'�"K�h�IC"I�z���K���@Ef+	737���H�h�I���I���z�K�G@of1+&#!"27654��&m.l9-��o�G@of6+%4'&"3!26���.��
��o��+��s�	"@of		+###s^B^��_�_B�_�_B����"@Gof
+"276764'&'&77�qa^8998^a�a^8998^aq��<��<�98^a�a^8998^a�a^89��<��<��J� ;@8EDopRXL  +67676=#5"&463121�-,MOaaOM,-��K%���ha_CDDC_ah�i��(����
,@)
Eo^RVJ+#53#53!KKKK�9B�_���K������@of+	&"27654��,.m�l�&m����
@of+	62"'&4m,.���l�&m.����&/8Ah@e
m
kp`	T	XL:910('>=9A:A540818,+'/(/#"&&
+"3264'&46;2>56'&'&"&4627"&4623"&462"&462�qa^8998^aq))Q>k?97^a��))8))m((8)'�))8((m))8)(�98^a�a^89)76)>k>eWU13�_)9()8)�)8))9()8)(9)�)8))8)����*-@*GooTXL"!+#3"'&'&5467'2767654'&"\\�C8 ,,IL�KI+,?8AD&(98^a�a^89(&��1kC.@BJXLI,,,,ILXK�,C;QT]qa^8998^aq]TQ��!d_<����m{��m{���R�j��\��������������������������������������������������������������������������������������������*V���(�v�>�V
n��:h�6�		Z	�
&
�b�
4
�
�B��Z��P����J���^��Bf��������p�$p����>r����B��,R� E\�z�s/p�55=DLT_
+g�	j�			-	=	M	c	
Vs	&�Copyright (C) 2017 by original authors @ fontello.commaterialRegularmaterialmaterialVersion 1.0materialGenerated by svg2ttf from Fontello project.http://fontello.comCopyright (C) 2017 by original authors @ fontello.commaterialRegularmaterialmaterialVersion 1.0materialGenerated by svg2ttf from Fontello project.http://fontello.com
\	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]homebackforwardupdiropendirreloadopenmkdirmkfilermtrashrestorecopycutpastegetfile	duplicaterenameedit	quicklookuploaddownloadinfoextractarchiveview	view-listhelpresizelinksearchsortrotate-rrotate-lnetmount
netunmountplaceschmodacceptmenucolwidth
fullscreenunfullscreenemptyundoredo
preferencemkdirin	selectall
selectnoneselectinvertlockpermsunlockedsymlink	resizablecloseplusreturnminushddsqldropboxgoogledriveonedriveboxhelp-circlemovesaveloadinginfo-circleprevnext
ql-fullscreenql-fullscreen-offclose-circlepincheckarrowthick-1-sarrowthick-1-n
caret-downcaret-upmenu-resizearrow-circletn-error
warning-alertcaret-right
caret-leftthemelogout��R�jR�j�, �UXEY  K�QK�SZX�4�(Y`f �UX�%a�cc#b!!�Y�C#D�C`B-�,� `f-�, d ��P�&Z�(
CEcER[X!#!�X �PPX!�@Y �8PX!�8YY �
CEcEad�(PX!�
CEcE �0PX!�0Y ��PX f ��a �
PX` � PX!�
` �6PX!�6``YYY�+YY#�PXeYY-�, E �%ad �CPX�#B�#B!!Y�`-�,#!#! d�bB �#B�
CEc�
C�`Ec�*! �C � ��+�0%�&QX`PaRYX#Y! �@SX�+!�@Y#�PXeY-�,�C+�C`B-�,�#B# �#Ba�bf�c�`�*-�,  E �Cc�b �PX�@`Yf�c`D�`-�,�CEB*!�C`B-�	,�C#D�C`B-�
,  E �+#�C�%` E�#a d � PX!��0PX� �@YY#�PXeY�%#aDD�`-�,  E �+#�C�%` E�#a d�$PX��@Y#�PXeY�%#aDD�`-�, �#B�
EX!#!Y*!-�
,�E�daD-�,�`  �CJ�PX �#BY�
CJ�RX �
#BY-�, �bf�c �c�#a�C` �` �#B#-�,KTX�dDY$�
e#x-�,KQXKSX�dDY!Y$�e#x-�,�CUX�C�aB�+Y�C�%B�%B�
%B�# �%PX�C`�%B�� �#a�*!#�a �#a�*!�C`�%B�%a�*!Y�CG�
CG`�b �PX�@`Yf�c �Cc�b �PX�@`Yf�c`�#D�C�>�C`B-�,�ETX�#B E�#B�
#�`B `�a�BB�`�+�r+"Y-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�	+-�,�
+�ETX�#B E�#B�
#�`B `�a�BB�`�+�r+"Y-�,�+-� ,�+-�!,�+-�",�+-�#,�+-�$,�+-�%,�+-�&,�+-�',�+-�(,�	+-�), <�`-�*, `�` C#�`C�%a�`�)*!-�+,�*+�**-�,,  G  �Cc�b �PX�@`Yf�c`#a8# �UX G  �Cc�b �PX�@`Yf�c`#a8!Y-�-,�ETX��,*�0"Y-�.,�
+�ETX��,*�0"Y-�/, 5�`-�0,�Ec�b �PX�@`Yf�c�+�Cc�b �PX�@`Yf�c�+��D>#8�/*-�1, < G �Cc�b �PX�@`Yf�c`�Ca8-�2,.<-�3, < G �Cc�b �PX�@`Yf�c`�Ca�Cc8-�4,�% . G�#B�%I��G#G#a Xb!Y�#B�3*-�5,��%�%G#G#a�	C+e�.#  <�8-�6,��%�% .G#G#a �#B�	C+ �`PX �@QX�  �&YBB# �C �#G#G#a#F`�C�b �PX�@`Yf�c` �+ ��a �C`d#�CadPX�Ca�C`Y�%�b �PX�@`Yf�ca#  �&#Fa8#�CF�%�CG#G#a` �C�b �PX�@`Yf�c`# �+#�C`�+�%a�%�b �PX�@`Yf�c�&a �%`d#�%`dPX!#!Y#  �&#Fa8Y-�7,�   �& .G#G#a#<8-�8,� �#B   F#G�+#a8-�9,��%�%G#G#a�TX. <#!�%�%G#G#a �%�%G#G#a�%�%I�%a�cc# Xb!Yc�b �PX�@`Yf�c`#.#  <�8#!Y-�:,� �C .G#G#a `� `f�b �PX�@`Yf�c#  <�8-�;,# .F�%FRX <Y.�++-�<,# .F�%FPX <Y.�++-�=,# .F�%FRX <Y# .F�%FPX <Y.�++-�>,�5+# .F�%FRX <Y.�++-�?,�6+�  <�#B�8# .F�%FRX <Y.�++�C.�++-�@,��%�& .G#G#a�	C+# < .#8�++-�A,�%B��%�% .G#G#a �#B�	C+ �`PX �@QX�  �&YBB# G�C�b �PX�@`Yf�c` �+ ��a �C`d#�CadPX�Ca�C`Y�%�b �PX�@`Yf�ca�%Fa8# <#8!  F#G�+#a8!Y�++-�B,�5+.�++-�C,�6+!#  <�#B#8�++�C.�++-�D,� G�#B�.�1*-�E,� G�#B�.�1*-�F,��2*-�G,�4*-�H,�E# . F�#a8�++-�I,�#B�H+-�J,�A+-�K,�A+-�L,�A+-�M,�A+-�N,�B+-�O,�B+-�P,�B+-�Q,�B+-�R,�>+-�S,�>+-�T,�>+-�U,�>+-�V,�@+-�W,�@+-�X,�@+-�Y,�@+-�Z,�C+-�[,�C+-�\,�C+-�],�C+-�^,�?+-�_,�?+-�`,�?+-�a,�?+-�b,�7+.�++-�c,�7+�;+-�d,�7+�<+-�e,��7+�=+-�f,�8+.�++-�g,�8+�;+-�h,�8+�<+-�i,�8+�=+-�j,�9+.�++-�k,�9+�;+-�l,�9+�<+-�m,�9+�=+-�n,�:+.�++-�o,�:+�;+-�p,�:+�<+-�q,�:+�=+-�r,�	EX!#!YB+�e�$Px�0-K��RX��Y��cp�B�*�B�
*�B�*�B��	*�B�@	*�D�$�QX�@�X�dD�&�QX��@�cTX�DYYYY�*������Dthemes/gray/icons/material.woff2000064400000026720151215013520012653 0ustar00wOF2-�]�-tTV�\ 	�p
���6$�p�: �M�-��U5��2~��{�ڣADŪE�dm������!̂9M�!��<f0�n���H�f=X�m���b�:�e\��c�!>� �0��7�0�E��W�[��g�$R,I�%�ӳ_��Zvka90t?��v�fP�J�����*j2�F��L��s��ң$�_֔��%4���x`�[�m#��M�����uZ�2Lj%���rښq�� �d�ٺ-���R�Rr�+�w���
��S	�JI� @3~���j�%r�U�mF��IK�AL�&�����^ࢌE9�+�"�o�Õ��tk<��wz�P6����NC`��G�+e�jVy҅ȨO	�,%SQ����F����4@\�������i#�������IQ?i6���Y��A�i8t�6W�^w׮JW��6��k�;����y&�Ѧ
�$�B4O�B$Y	RY]*�n�*@�b��CUӛ�|�v���ɲ��v+z��<���K�
a`'$l�y3�͓{�:��͡t��I��̑S���H`7�8z������⤭"�#���?������H^.�
�*5W��g�$�;��^�{"%��#�����`;��!��,r��[�ؔ�j�[�)���S�HZ&�v�\�PD��K�S�����D��-W����ZX�����Љ����l�5N�!���a�$.�E��V�(����Z�B���ރ��7l7$�Bwr�\�bqZ�JC�����Δ vv���]<�,/+���̌$R�\�������U������[XZY����;8:9����{xzy�����I�fX�DIV��I5[�6���r{w_�:,���HB� ��,D"Q�(B� ��*D
QG4MD�х�F� z}�~�b1�F� Fc�q�b1��F� fs�y�b��XF� Vk�u�b���F� v{�}��q�8F�@�B�A�C\@\B\A\C�@�B�A�C<@<B<A<C� ^ ^!� �!> >!� �!~ ��jϕ_F��
 0�G#$��&Yz����ωܖ�O9Q��
�_T�wh�{`��x�Sb��N��4�<��M'[_�7��{�����8Q��K?Y-�S��	!R�E
}Q� �{��s*̅f�X)�B�dFq`�l�t:�9��:��)��o�Ŷ3��_G��F!��! Y��!�ţ�R/�FK�}�m����VN�3{K;�zd��B��Ѕ
N�b�xc�\O�_0�_B��:���ҮJW`)��el\��A�-u&��SC����At�^4�4&Y`e���maҞ�V�կFZ��W��گH�y�i��'����> ��J�~1(�哐�mQr����'�,��
(*z��GK{$g�PQ��E�x�����ovP�n3�۾b:��io^C��M)k0XD����c��X��J�Q΅z�yM���"�c�eA~"�pA� ��t�X�O��^���1(�1 �q�6�2׈�I(-j��"ST�ߪ�<(h�~�_ӈr�J�h����0B� ��!�B�Y�E �"D6E�슸�`O�hvbv�A�@=@�@}@�@@�@CP
�%YB_A�4j���]�DX�&�	�.��L��X}njj��DV��?�.�~�ZY�z5��t��b+�?o0T���vW�yK����!?=�uq���e�.,��P�y�h�d��N3�+�o����J�:b-�2����P�ҥ�u�O�����TH��9��Z�(��������~��j�lђc4!�z/�[i���.C�K�ʑ���9D�Y�]�V���MǍZ���F�iYi��U�x�ޢ9Hm0�- Azc�j SɁ��S�>�����@隃�":54#������|�d�]$�L�H��x���}U�ҒRk�
�޾@�xV|ae�]�I>NV1u�Xӭ��ܵhYw'P�vm�Kg���BO
�7
�B:��qPuD#��+�X������޹[4Qͣ�W�$�*�\�y�q�>w��)���)x��!��/�7�5�|���H_=�D���d,g�
�`��:M�[kQ4>yFZ<� �xA'@4y&@�N��l:����P��<�`��������[�Q��:�
`�������ޅ"��މI5���?�%b�::̕0�h��c~�N�/��W
��	�/]_aW��k���c��S\�hE�D7���ӥ�
�U����S�y�~w��	2���e��Y�bB��Q�(��!�Q�Bt��XeNܰ�����R�IBԞ3^�k'Yf�Ne4y���u7�P�l�wMi,<�xc6!��'1����јw�U�&����ȿ/e��P�Q��˰�����R��3k�ۙS��fױ3aQ�W������^��$Β}9���-�D׭��l5y�g�'I�Wf�Cf��>#�j6gUf׷5�aW.��L���Ui�2w� k^/Y�&����eOX�ߜ'��Uϗ��@5���P�,2���}��Ŷ_@��|���y��	�$ơh�����z�,�\g:G�kj�b�BBF��~nE5idRv��A�8L���f��!���Kq�a��I��p��TI��Z5t���m���Ikl�(�w~��Vf8C�{�	DG�!_���9it�k�`6_A��:r��|F�K�6n��I��\��1��哌�RVI��X����SH	u��e���T�+Q�J���iMb��b�]�e�ȇ+7vW�a�H�d�wL����e:^�o��1+1xak��`
�Z�����|$��#��@�i���7S�0ډ@����,������+?{Qi��ʉR�r^)u����J,�oEH�k]��t���� �q+a����Q����T��D���u LI� ��lg#Q��	e�'R@��ku_="�����T�E_��HʋAR�M���TC&�b�s̔��ݾ�F:�(���h�j�g,�$}�{�-H�Ô�	��EG6�
	G�'m,��w� �pZ�Z�祝�Eb�X4�\���&'0k��n��br�a8�Zx �9�~�� �=9*xL��md�e/,���0T~��x���������}�.va���������������?HX�����N�g��AR:@;a��I�j3��$�%Ʊ�%����e�����ѝy�W(s9`]�����O8����]KS��oz�(�O=f/��n3�	�27����P6�pU�`�{ܥ-��F�,҄��\%����u�ئ���3��]b�.yB�<�ϳ�,7}~:Cf���K��U@��עጜ�_��/��'
�V}��É#��D�t^"�8M�%]��f�F��
���I߼D8$k~^	?u)�E�VMy�hu�5)�O��m�Q5�a��|���f�Al�H�������k{؍V��$�佋6:�N#�.�!���s�v"����n+����KrBu�h��ٟ��/Uu��jcJ�@ťz
2:�c�;׼�ٍr�k�Z�fֵQ�
Z��^N"��Q��2⢖�}9}��Wo���F�g���vO�W�?��)5�us���k�N�f��\�5Z�1O�p���v�U�A�>{�8���NC��Kw�ʑ�v������m��^��@�z���y��H�/�m�^��s6\IQ%Zh��A��/�Uw�+0��׬���ϸ�ߵ[%=�Lv"��B	���w���O�a�9Iik�T�:m�7A�J��W��?̽�߮�r訟��f��_u��������k���(k�C�}������ٛ�H$7W#�Y����G�PRő������%7�*�)�IB�-��cϋϡ��=��i��;B'�x֋:�����N��V��G�~Z��(A�C��A#���ج�)P:P�����*����R�x)��R�R�{؈��-|XN����`��X=�|/��>\֌X9�.�»U�g�h߻r)A�F�P���d����x_Ni#�	�,Ӈ�o?�C��_FwY%��)�,ig�rY"�\r��	�1.#d�9�ӧ׫ִ-�T��$�CU�XB1/�|K
P[���Y�0�Ǥ��6R\���\��4�l��d�)�g��������li֐fUh����GF�Eb�(���(ݾ%�����gx�XD
������V����e�g2�4IB��"�T��&���_������I��:`Ɏ<e�
Sq�|&{���B.�Ǥ�����
�׾4�*��p��-���T X��P�r
���C���,��ccd��ӧ�<��*�0wnӨ?
����lf^׀��G�i�b���5=�#}����
�(Z������z���./#4��܁��!�-u��X�a��M) edˍJ�	
K�r3�2�����.��ǁѸ	�x�N�m����v�Ҳ!��ٽ�o�t��t[�d��6S�Wmr<�sε����i2��ff���H�$N'�!���E�j�<�<�<
��	�$f���,��^ˮ�2����:����"d9~����
��O�o�;x�r���Q_��wq"��먮���e��<���h=[=1N�+��Z�^׼w�W��:�v���>�����3<�6�9�~x'��5㏙�5�n�	���I/��<�l�9lf^�<{G�VFK?����A�g�=+<7�e�!���4�iE�,>���/�ު�ə�����z��$�|�lB�[dv�Q�ڹ�8$"�#��d�NS�S�7�r���U�����FnR�ԛ)�5L~�5�g��\o�B��86Ԯ�	��W&�Nd��H�D���jG�b�9����k��T������,F��)�.a�[��U��Ӳ�����~�6�=��>ұ/�r��1|.ô�3��cO1��d�C��)ZLO��J��M������9�M���ܔ�+�!��\7��������D{��H@��_m�T�߫{?�ӏ�|�M�����%3`�UR�-�3�� �mi�s�d:|ux��!�'i���pZ��<�/7�:6d�f�$�}z�������5�*1�D�z�M%���>�48��{�g&1��Jj}��.# pm"=��7�9n���L��L�|"#�KJ��.���'%y�G�$S�$?_�d��MM�D,혿|��eQK�/��ˍ�*����W��{zP-{>8�y�����K�QWU�w�g��6��t�q�2û���ꑂTI�bIul�*�L�$e�׿����E^�F[l�[�:�x|Ԩd�����m��+�Y�sv��`���84R�z�����OmD݌��pP�k!!�V�1U�9k,��򟤅�%%I2���B����^�MB�@��2�_\�1��!�\%G�`�Xy��%��O�yK�C�U�c��F.��w,F4�R�H�[�a�B+��Ku�W%�Vp����� �꼩(��WO!2I-6!a��C�����c���@ty��FPъ{�>�쟠l�����l9�lI߉�'N��~�,�=y���<Qxѭ�7h9y���\�cG�#�r/S�B��Rŗ�.�l��z
���D��!�"?+,,��kg���yn��e��<�*���R�ŰZ����s�4s���`��ٞg����0����f�`XD����t�I�CD�ڤ��Ɲ
�+|��Y��b��Q%p�
����]1�n9�0N��{Xl�����B�%�M�@�T*�a5s�D�T`�����{�,��*��sa�O�"���J�h݃6�0D
j�M�'��W�L�����7G����.ZD~���� ���
[��v�<���?qء�j������C��R�l��6���.�ՂJu(�4=�vy�����N���\kj]I��K���e�_��{|Vq���+~�^pu񤲊�۔V��
�5�̦��s��+zk-r潯;|�G���u�{Tvk���Tړ�ϯ��� H��	AФ<�"�$5���<1�J
J
\�a}uͦ����$�D]�g���+2(P(_�I���!��q�3�ł]2��,�F��cv��D���'٤���s�u�CTj��Pz��P�Qڹd�W(ޭ�=^�W�q���O�ׯ#���L4s��a��D���z�Gz-�c�kόb�5SOEꨙ�n��A%��Yoƫ`���˅���]w�䙰��������Z��|�;m��X�����ҽ��m�2�K��e�÷�}�2FLpx<vq������J>��|����'�E��!���P��B9���
��g�����J:��LX��7��(�x�M�x-���4�C�*_I%N��V��:1�*(�P:���}߅��p��psnۗ��,wøʂܴ#1 b})jn�����H:����+�6��+�nĺ:YI��y�?����G�x*�����V��T�{��|�t/jʙ�=3'i�ʋ��E�x1�xx�����AK��8(v+5��I���r5*�tv/	���a`2�#O�t"���{r���{���7\�p�R��%�
�aV���=���Z�?�:����E�2(
���@:U44|n��W���m�(�/	T�[,��%�11@|FlL)�Ÿ��gF^B�ʵ�gU5[4�����"��-u�r�"Vj:��bw��o�|
��Q(I00}�hSS��Uꚵ��$ij��~?��&�Fۏ]סn�M����T�3������8Rc�uHps���-@$�S��J�s`g��{�A &���_:�I�.Η���=�LTVڸ���~>����~����	��G��u����~=�/8���*�84���^��#��U)���+��x����+�c�m,}�s7�+�bo���j��[a
v�}��/��e?l��ї���?G�O��٢��v	-lΔ��z)�P�-�uaƈjKp�d��]ׯ<�*VQ�0�v�-��s�UEl-%:�����`~���sY
VJ��?*L�e�*�K��Q�4HWLjc�t4(4��hڕ��_�u�y�A���v��{ە��J^B�P�qIl1�ͯqm�{��<Y@M@,��e6���Al����he�q	�%Ҍ�zh=��PW+�1A;0ҳ^����f��\a�I`EN�ueW>`$Y�b��w�y-+�c<%��!��x��?����e+�6��l�?c5���a�5���FF��H�}#cg�{S�R ����jzon�
dc�
�k!�����iӾ�I����`��p
B�9"�v9T�N��8�^��N^�o_��ᦒC�]uR���R@��m�k�����8�y˽e�U�
�/�B
s�DU倊~���5ң �����Ԫ��ݺkjb�:�н<����j` �0�)(��R�3"��k>�N������L�;�I��<d��g�sNkZ�M�
C<<���]_�6��[�p�S�"��@s����n~�a�5ҡh�kj߉)��T!le�-49��iw�
���@��/ r�El��<CMv-I\Kg��K��������6��0�=F	��	n�M���֘k��W�#�alθE�ZsPBqR
Y)���4�ٮ��
!]�Vcw$V���eW�����Q�3��wه^�o	q!�^�_gb��
��i_�d��׌rH0�F�B�t�
N����f�Jd7-]�j}�ѷҸ��,_Ś
#�9�DBZ䄻�7?�;��V�*O�������bG��*�}��>�1�j�DI�g.Dȭ.�LB`kRLZ�7��K'�����dmn�:��p	����t�E����ʦ�3���n"��1�8�8'%�Lif�!ROX��u���ny}�W�r�\��żZ��᠜t'>�4��ii�M���ȑ@	/#IU&�B7���d�B����O'�G��aI�^�r}�I�"QS�)�Ȱ������gZ�ڜ��9#h�7�A�(�b	�21C�};�Us���|��v����8y;Jb�������#�u���1۩�'0��G��V�߬�j<f�Ko��x})��@JO��[�$�GE��֕�R�J.����m�l}t(�CX���\��Ȫ�W��ָ��z���SQWR�T��y�DD�'��줩S��A(�)x�-s���ʐ�t*\̧L�!�$<!�ݦ� L啨&С��wѻ�t�Q��p�L��}�a
q�R�Vo^��p
L��0=�u��jdݷ
~c/v�+B�)>����1��I�������0T8�a�nm/�I��ܠ@�L�x�숺�D�G��=��D�Z�T.?F�ۯ�sj��P�h�pF�}A;3I�beP,^�3vb�+:���Pb��va*K�qAZ�����?.�P���voEi5�5�������~$�O����]F�^�a�
�nc��Ƽ�}��V9De��V���C.�d��,����C|�	�~���uw�Y���ח��r�-�mG"��p4Ӿ�h���$���YR	��r�y�����n�وR�Մ�q��MW=���w���.
�`���`�z���V�B<�<"���ƒ �<.��u��4|�YU��5 $���x^ܢ�4�\&���H*�D��||<=g�rwG"�2��H��\�B�*�E��qH̕Jb�QqB$��+�<�8R(�8"Ω������A9y'+�Ե��6n(,_�+��v�$�����E4N:��N��J�A�[$<��
�y�*-1v�*0��MA��\UkUiMq^"z"�y�>��(�Bh�i�۱��t�5���u7�N��C��H�Ԑ��Z�Ԫ�!�1D��=M�GEʸ&@��\K��:�Q
|JT��N�H����e��e������(
l�V*�X�b2K�I9T��kQ���͕uR?�;��H�ff2L������� rd��RM�u
��Ν&�C�+=㟥�E��AW��LJ�[��Z�c)K���H�.�k���-ܹJ|5p���
b�/i"�k3l����ma��6���ʹ�;�JY4m��5�b.@rQGve�<-)t��c�1�]L��+�E����q�k��c��I��Hh
�A��b��~?�kQl8z���80U���n0�eL,��aUw�^�I</�Rq����@'�Vu�	ܚ�(Ż	�??�":,�HƝϑ�o
�&��#��#�伾%ți�_�讎[�}�b�&-��:���8UI���	kw��:�sN�Bsw��nj��￐G�[�U��
�������(B��>�M�
%��q8<x"��r�T
�	��}�ȵ�T���ޟ����x���jssaX��4*J(���r��6�5(���j�<8'����n.#M��7����(�%��F�&b����X!H�#��0���e���܋c����ȯ!�A�+qB�{+X�Pb]�b���u�}(҃�e�|6�%�]Vؾ�m�[f�7� �+��؁f��mGrJ"��Z3���(��n�ᦹGy��_��]!^���E�h^�id
��|��݋E9��Iy�jaE%���6�:!�ky?U�ԥ��b-Y���?��yR�]�C�ƔM��J�#���z�{ه�����u;_.�T�A?���޷�g��OC2$�SRE�0��ez�D@>���AQ�����b��˖�]�d�vH�W*�c����K�N��G4=�[p�#ؼߏ���5*�Ms��c+�(m�q!���r��@D�Kň���]zI>F(F튀���W(�y����4t��C�͢�/�]D�&1���;	_�E���Г�𧅁CQ�ܖ��%@?���q!Q�Fdy�K9�Kٮ��b��r�Yˈ\7���|(�򕅺D�Ru�P��ʟ��nY5��.q��KR��h&q��Oh��3��D �c"��,��j�	���~���V''Xc<��|�)�H)�l�@,�t����PZV'�����>���]W\�K�kj���j�,1un����xQ_�BI�uA3Rb��aN$>Cy g�H�]C ?;8�7��=|��4&�4� ��t>�É6q����~���cF����|�	��
�eW"�څF�25rBeXk+�nO��o_�^/ΏoNn�F�����ľ���ۓ3��A��쨃�S5Yo4ܝA�j2�;���Rb�
UK�
MW��K�a��v�lŲ̕R��$j�����1aj��_��X�̾�"�,�w��`���a�֥�сC�y��ܭ__�,��̚�����-�J�S҅��?���:��ऀ�W��I�`��J�^�!�r&��ɚ�d�ق���j�)�\e>&@t������[����W߫�V��H�!g�!�2��q�~��
ED�
Pzqݎ1u������6�
!i/[���N>Ng��6�b��Qmz%��ݭ�"�d�4��#�b��|��4g9$P@�Y�B�6�ƒ	xr��;�bJX���'w
g~�n�,��D�؁�o*�c��&��׈���p��@~vx�W�|��/�#̆��H�Y�a;�X�͑��74����*�ʞg���o��c���ơ������s�_�)��Q ��߉��$�S.�#�i�uB�|��0���!��=6�s�2ǰ]�����"�ӛ
��㻛Zn�P�&
�p�#w��-
Zx���M��hn"�UT|75����I���k7ip���j�~|��߸\$�Qͣ�c�I���݋���c"��6�,�|6�I���s�
�,������dti�Ajb2/)����|���W���l~��"|N�Q�|z�$q��ER�<BL=6���;�{s�<gÛ�"̵M��V�٠��>y�8�q���P�
�#�¢�&��'Z
���7/�/0�/NI�������ࡃ\:���Ϯ�MA����!^-�������s��
��sQT��da�W0���r��_�m�G�CF��0eƜKVXe�u�����V����Dc�D2��ds�B�T�Tk�F�I��u>ĔK?�S��uۏ�k��8r��aXNV����d�(�� [?=-��W+jH�3[�B�*L݄p�Ί�
�G��`rV��,�~��Zr2�4R����x^����w���b:N�V���TuKUg�t�c�a^+8�,�VB�d�$�̍t��9=���:s1�����A�ijK�xJ^�:4������m� �Ly�
x^��`A��'ZU���"��ib�����Sd7�
&s]6��/�%���z��f�´`�ڄ�*6��M������7=s��Ntٌv`7W�J7׹$��T���W��}2�S�Sb����h���T�!l[dqnJ"��
���4��t/�zZGkg��pz���ʆ��n�6�Q��T� Y��	�Z9����Bڬk��#�i�s䞛�L�|G��7�ۙ��w��񈅏�ߒb�O�%�~�W}�A�9PYٌ�g�������[�:�xدym������b��'���F_�Ythemes/gray/css/theme.css000064400000121675151215013520011406 0ustar00@font-face {
  font-family: 'Noto Sans';
  src: url('../../../fonts/notosans/NotoSans-Regular.eot');
  src: url('../../../fonts/notosans/NotoSans-Regular.eot?#iefix') format('embedded-opentype'),
      url('../../../fonts/notosans/NotoSans-Regular.woff2') format('woff2'),
      url('../../../fonts/notosans/NotoSans-Regular.woff') format('woff'),
      url('../../../fonts/notosans/NotoSans-Regular.ttf') format('truetype');
  font-weight: normal;
  font-style: normal;
  font-display: swap;
}
.elfinder {
  color: #546E7A;
  font-family: "Noto Sans";
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}
.elfinder.ui-widget.ui-widget-content {
  -webkit-box-shadow: 0 1px 8px rgba(0, 0, 0, 0.6);
  box-shadow: 0 1px 8px rgba(0, 0, 0, 0.6);
  -webkit-border-radius: 0;
  border-radius: 0;
  border: 0;
}
td{
  font-family: "Noto Sans";
}
/**
 * Input & Select
 */
input.elfinder-tabstop,
input.elfinder-tabstop.ui-state-hover,
select.elfinder-tabstop,
select.elfinder-tabstop.ui-state-hover {
  padding: 5px;
  color: #666666;
  background: #fff;
  border-radius: 3px;
  font-weight: normal;
  border-color: #888;
}
select.elfinder-tabstop,
select.elfinder-tabstop.ui-state-hover {
  width: 100%;
}
/**
 * Loading
 */
.elfinder-info-spinner,
.elfinder-navbar-spinner,
.elfinder-button-icon-spinner {
  background: url("../images/loading.svg") center center no-repeat !important;
  width: 16px;
  height: 16px;
}
/**
 * Progress Bar
 */
@-webkit-keyframes progress-animation {
  from {
    background-position: 1rem 0;
  }
  to {
    background-position: 0 0;
  }
}
@keyframes progress-animation {
  from {
    background-position: 1rem 0;
  }
  to {
    background-position: 0 0;
  }
}
.elfinder-notify-progressbar {
  border: 0;
}
.elfinder-notify-progress,
.elfinder-notify-progressbar {
  -webkit-border-radius: 0;
  border-radius: 0;
}
.elfinder-notify-progress,
.elfinder-resize-spinner {
  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
  background-size: 1rem 1rem;
  -webkit-animation: progress-animation 1s linear infinite;
  animation: progress-animation 1s linear infinite;
  background-color: #0275d8;
  height: 1rem;
}
/**
 * Quick Look
 */
.elfinder-quicklook {
  background: #232323;
  -webkit-border-radius: 2px;
  border-radius: 2px;
}
.elfinder-quicklook-titlebar {
  background: inherit;
}
.elfinder-quicklook-fullscreen .elfinder-quicklook-navbar {
  border: inherit;
  opacity: inherit;
  -webkit-border-radius: 4px;
  border-radius: 4px;
  background: rgba(66, 66, 66, 0.73);
}
.elfinder .elfinder-navdock {
  border: 0;
}
.std42-dialog .ui-dialog-titlebar .ui-dialog-titlebar-close:hover .ui-icon,
.elfinder-mobile .std42-dialog .ui-dialog-titlebar .ui-dialog-titlebar-close .ui-icon,
.elfinder-quicklook-titlebar-icon .ui-icon.elfinder-icon-close:hover,
.elfinder-mobile .elfinder-quicklook-titlebar-icon .ui-icon.elfinder-icon-close,
.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-minimize:hover .ui-icon,
.elfinder-mobile .std42-dialog .ui-dialog-titlebar .elfinder-titlebar-minimize .ui-icon,
.elfinder-quicklook-titlebar-icon .ui-icon.elfinder-icon-minimize:hover,
.elfinder-mobile .elfinder-quicklook-titlebar-icon .ui-icon.elfinder-icon-minimize,
.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-full:hover .ui-icon,
.elfinder-mobile .std42-dialog .ui-dialog-titlebar .elfinder-titlebar-full .ui-icon,
.elfinder-quicklook-titlebar-icon .ui-icon.elfinder-icon-full:hover,
.elfinder-mobile .elfinder-quicklook-titlebar-icon .ui-icon.elfinder-icon-full {
  background-image: none;
}
/**
 * Toast Notification
 */
.elfinder .elfinder-toast > div {
  background-color: #323232 !important;
  color: #d6d6d6;
  -webkit-box-shadow: none;
  box-shadow: none;
  opacity: inherit;
}
.elfinder .elfinder-toast > div button.ui-button {
  color: #fff;
}
.elfinder .elfinder-toast > .toast-info button.ui-button {
  background-color: #3498DB;
}
.elfinder .elfinder-toast > .toast-error button.ui-button {
  background-color: #F44336;
}
.elfinder .elfinder-toast > .toast-success button.ui-button {
  background-color: #4CAF50;
}
.elfinder .elfinder-toast > .toast-warning button.ui-button {
  background-color: #FF9800;
}
.elfinder-toast-msg {
  font-family: "Noto Sans";
  font-size: 14px;
}
/**
 * For Ace Editor
 */
#ace_settingsmenu {
  font-family: "Noto Sans";
  -webkit-box-shadow: 0 1px 30px rgba(0, 0, 0, 0.6) !important;
  box-shadow: 0 1px 30px rgba(0, 0, 0, 0.6) !important;
  background-color: #1d2736 !important;
  color: #e6e6e6 !important;
}
#ace_settingsmenu,
#kbshortcutmenu {
  padding: 0;
}
.ace_optionsMenuEntry {
  padding: 5px 10px;
}
.ace_optionsMenuEntry:hover {
  background-color: #111721;
}
.ace_optionsMenuEntry label {
  font-size: 13px;
}
#ace_settingsmenu input[type="text"],
#ace_settingsmenu select {
  margin: 1px 2px 2px;
  padding: 2px 5px;
  -webkit-border-radius: 3px;
  border-radius: 3px;
  border: 0;
  background: rgba(9, 53, 121, 0.75);
  color: white;
}
/**
 * Icons
 * Webfont is generated by Fontello http://fontello.com
 */
@font-face {
  font-family: material;
  src: url("../icons/material.eot?98361579");
  src: url("../icons/material.eot?98361579#iefix") format("embedded-opentype"), url("../icons/material.woff2?98361579") format("woff2"), url("../icons/material.woff?98361579") format("woff"), url("../icons/material.ttf?98361579") format("truetype"), url("../icons/material.svg?98361579#material") format("svg");
  font-weight: normal;
  font-style: normal;
}
.elfinder-button-menu {
	margin-top: 24px !important;
}
@media screen and (-webkit-min-device-pixel-ratio: 0) {
  @font-face {
    font-family: material;
    src: url("../icons/material.svg?98361579#material") format("svg");
  }
}
.ui-icon,
.elfinder-button-icon,
.ui-widget-header .ui-icon,
.ui-widget-content .ui-icon {
  font: normal normal normal 14px/1 material;
  background-image: inherit;
  text-indent: inherit;
}
.ui-button-icon-only .ui-icon {
  font: normal normal normal 14px/1 material;
  background-image: inherit !important;
  text-indent: 0;
  font-size: 16px;
}
.elfinder-toolbar .elfinder-button-icon {
  font-size: 20px;
  color: #ddd;
  margin-top: -2px;
}
.elfinder-button-icon {
  background: inherit;
}
.elfinder-button-icon-home:before {
  content: '\e800';
}
.elfinder-button-icon-back:before {
  content: '\e801';
}
.elfinder-button-icon-forward:before {
  content: '\e802';
}
.elfinder-button-icon-up:before {
  content: '\e803';
}
.elfinder-button-icon-dir:before {
  content: '\e804';
}
.elfinder-button-icon-opendir:before {
  content: '\e805';
}
.elfinder-button-icon-reload:before {
  content: '\e806';
}
.elfinder-button-icon-open:before {
  content: '\e807';
}
.elfinder-button-icon-mkdir:before {
  content: '\e808';
}
.elfinder-button-icon-mkfile:before {
  content: '\e809';
}
.elfinder-button-icon-rm:before {
  content: '\e80a';
}
.elfinder-button-icon-trash:before {
  content: '\e80b';
}
.elfinder-button-icon-restore:before {
  content: '\e80c';
}
.elfinder-button-icon-copy:before {
  content: '\e80d';
}
.elfinder-button-icon-cut:before {
  content: '\e80e';
}
.elfinder-button-icon-paste:before {
  content: '\e80f';
}
.elfinder-button-icon-getfile:before {
  content: '\e810';
}
.elfinder-button-icon-duplicate:before {
  content: '\e811';
}
.elfinder-button-icon-rename:before {
  content: '\e812';
}
.elfinder-button-icon-edit:before {
  content: '\e813';
}
.elfinder-button-icon-quicklook:before {
  content: '\e814';
}
.elfinder-button-icon-upload:before {
  content: '\e815';
}
.elfinder-button-icon-download:before {
  content: '\e816';
}
.elfinder-button-icon-info:before {
  content: '\e817';
}
.elfinder-button-icon-extract:before {
  content: '\e818';
}
.elfinder-button-icon-archive:before {
  content: '\e819';
}
.elfinder-button-icon-view:before {
  content: '\e81a';
}
.elfinder-button-icon-view-list:before {
  content: '\e81b';
}
.elfinder-button-icon-help:before {
  content: '\e81c';
}
.elfinder-button-icon-resize:before {
  content: '\e81d';
}
.elfinder-button-icon-link:before {
  content: '\e81e';
}
.elfinder-button-icon-search:before {
  content: '\e81f';
}
.elfinder-button-icon-sort:before {
  content: '\e820';
}
.elfinder-button-icon-rotate-r:before {
  content: '\e821';
}
.elfinder-button-icon-rotate-l:before {
  content: '\e822';
}
.elfinder-button-icon-netmount:before {
  content: '\e823';
}
.elfinder-button-icon-netunmount:before {
  content: '\e824';
}
.elfinder-button-icon-places:before {
  content: '\e825';
}
.elfinder-button-icon-chmod:before {
  content: '\e826';
}
.elfinder-button-icon-accept:before {
  content: '\e827';
}
.elfinder-button-icon-menu:before {
  content: '\e828';
}
.elfinder-button-icon-colwidth:before {
  content: '\e829';
}
.elfinder-button-icon-fullscreen:before {
  content: '\e82a';
}
.elfinder-button-icon-unfullscreen:before {
  content: '\e82b';
}
.elfinder-button-icon-empty:before {
  content: '\e82c';
}
.elfinder-button-icon-undo:before {
  content: '\e82d';
}
.elfinder-button-icon-redo:before {
  content: '\e82e';
}
.elfinder-button-icon-preference:before {
  content: '\e82f';
}
.elfinder-button-icon-mkdirin:before {
  content: '\e830';
}
.elfinder-button-icon-selectall:before {
  content: '\e831';
}
.elfinder-button-icon-selectnone:before {
  content: '\e832';
}
.elfinder-button-icon-selectinvert:before {
  content: '\e833';
}
.elfinder-button-icon-theme:before {
  content: '\e859';
}
.elfinder-button-icon-logout:before {
  content: '\e85a';
}
.elfinder-button-search .ui-icon.ui-icon-search {
  font-size: 17px;
}
.elfinder-button-search .ui-icon:hover {
  opacity: 1;
}
.elfinder-navbar-icon {
  font: normal normal normal 16px/1 material;
  background-image: inherit !important;
}
.elfinder-navbar-icon:before {
  content: '\e804';
}
.elfinder-droppable-active .elfinder-navbar-icon:before,
.ui-state-active .elfinder-navbar-icon:before,
.ui-state-hover .elfinder-navbar-icon:before {
  content: '\e805';
}
.elfinder-navbar-root-local .elfinder-navbar-icon:before {
  content: '\e83d';
}
.elfinder-navbar-root-ftp .elfinder-navbar-icon:before {
  content: '\e823';
}
.elfinder-navbar-root-sql .elfinder-navbar-icon:before {
  content: '\e83e';
}
.elfinder-navbar-root-dropbox .elfinder-navbar-icon:before {
  content: '\e83f';
}
.elfinder-navbar-root-googledrive .elfinder-navbar-icon:before {
  content: '\e840';
}
.elfinder-navbar-root-onedrive .elfinder-navbar-icon:before {
  content: '\e841';
}
.elfinder-navbar-root-box .elfinder-navbar-icon:before {
  content: '\e842';
}
.elfinder-navbar-root-trash .elfinder-navbar-icon:before {
  content: '\e80b';
}
.elfinder-places .elfinder-navbar-root .elfinder-navbar-icon:before {
  content: '\e825';
}
.elfinder-navbar-arrow {
  background-image: inherit !important;
  font: normal normal normal 14px/1 material;
  font-size: 10px;
  padding-top: 3px;
  padding-left: 2px;
  color: #a9a9a9;
}
.ui-state-active .elfinder-navbar-arrow {
  color: #fff;
}
.elfinder-ltr .elfinder-navbar-collapsed .elfinder-navbar-arrow:before {
  content: '\e857';
}
.elfinder-rtl .elfinder-navbar-collapsed .elfinder-navbar-arrow:before {
  content: '\e858';
}
.elfinder-ltr .elfinder-navbar-expanded .elfinder-navbar-arrow:before,
.elfinder-rtl .elfinder-navbar-expanded .elfinder-navbar-arrow:before {
  content: '\e851';
}
div.elfinder-cwd-wrapper-list tr.ui-state-default td span.ui-icon {
  font-size: 8px;
  margin-top: 5px;
  margin-right: 10px;
}
div.elfinder-cwd-wrapper-list .ui-icon-grip-dotted-vertical {
  margin: 2px;
}
.elfinder-cwd-view-list .elfinder-navbar-root-local td .elfinder-cwd-icon,
.elfinder-navbar-root-local .elfinder-cwd-icon,
.elfinder-cwd-view-list .elfinder-navbar-root-ftp td .elfinder-cwd-icon,
.elfinder-navbar-root-ftp .elfinder-cwd-icon,
.elfinder-cwd-view-list .elfinder-navbar-root-sql td .elfinder-cwd-icon,
.elfinder-navbar-root-sql .elfinder-cwd-icon,
.elfinder-cwd-view-list .elfinder-navbar-root-dropbox td .elfinder-cwd-icon,
.elfinder-navbar-root-dropbox .elfinder-cwd-icon,
.elfinder-cwd-view-list .elfinder-navbar-root-googledrive td .elfinder-cwd-icon,
.elfinder-navbar-root-googledrive .elfinder-cwd-icon,
.elfinder-cwd-view-list .elfinder-navbar-root-onedrive td .elfinder-cwd-icon,
.elfinder-navbar-root-onedrive .elfinder-cwd-icon,
.elfinder-cwd-view-list .elfinder-navbar-root-box td .elfinder-cwd-icon,
.elfinder-navbar-root-box .elfinder-cwd-icon,
.elfinder-cwd-view-list .elfinder-navbar-root-trash td .elfinder-cwd-icon,
.elfinder-navbar-root-trash .elfinder-cwd-icon {
  background-image: inherit;
}
.elfinder-cwd-view-list .elfinder-navbar-root-local td .elfinder-cwd-icon:before,
.elfinder-navbar-root-local .elfinder-cwd-icon:before,
.elfinder-cwd-view-list .elfinder-navbar-root-ftp td .elfinder-cwd-icon:before,
.elfinder-navbar-root-ftp .elfinder-cwd-icon:before,
.elfinder-cwd-view-list .elfinder-navbar-root-sql td .elfinder-cwd-icon:before,
.elfinder-navbar-root-sql .elfinder-cwd-icon:before,
.elfinder-cwd-view-list .elfinder-navbar-root-dropbox td .elfinder-cwd-icon:before,
.elfinder-navbar-root-dropbox .elfinder-cwd-icon:before,
.elfinder-cwd-view-list .elfinder-navbar-root-googledrive td .elfinder-cwd-icon:before,
.elfinder-navbar-root-googledrive .elfinder-cwd-icon:before,
.elfinder-cwd-view-list .elfinder-navbar-root-onedrive td .elfinder-cwd-icon:before,
.elfinder-navbar-root-onedrive .elfinder-cwd-icon:before,
.elfinder-cwd-view-list .elfinder-navbar-root-box td .elfinder-cwd-icon:before,
.elfinder-navbar-root-box .elfinder-cwd-icon:before,
.elfinder-cwd-view-list .elfinder-navbar-root-trash td .elfinder-cwd-icon:before,
.elfinder-navbar-root-trash .elfinder-cwd-icon:before {
  font-family: material;
  background-color: transparent;
  color: #525252;
  font-size: 55px;
  position: relative;
  top: -10px !important;
  padding: 0;
  display: contents !important;
}
.elfinder-cwd-view-list .elfinder-navbar-root-local td .elfinder-cwd-icon:before,
.elfinder-navbar-root-local .elfinder-cwd-icon:before {
  content: '\e83d';
}
.elfinder-cwd-view-list .elfinder-navbar-root-ftp td .elfinder-cwd-icon:before,
.elfinder-navbar-root-ftp .elfinder-cwd-icon:before {
  content: '\e823';
}
.elfinder-cwd-view-list .elfinder-navbar-root-sql td .elfinder-cwd-icon:before,
.elfinder-navbar-root-sql .elfinder-cwd-icon:before {
  content: '\e83e';
}
.elfinder-cwd-view-list .elfinder-navbar-roor-dropbox td .elfinder-cwd-icon:before,
.elfinder-navbar-roor-dropbox .elfinder-cwd-icon:before {
  content: '\e83f';
}
.elfinder-cwd-view-list .elfinder-navbar-roor-googledrive td .elfinder-cwd-icon:before,
.elfinder-navbar-roor-googledrive .elfinder-cwd-icon:before {
  content: '\e840';
}
.elfinder-cwd-view-list .elfinder-navbar-roor-onedrive td .elfinder-cwd-icon:before,
.elfinder-navbar-roor-onedrive .elfinder-cwd-icon:before {
  content: '\e841';
}
.elfinder-cwd-view-list .elfinder-navbar-roor-box td .elfinder-cwd-icon:before,
.elfinder-navbar-roor-box .elfinder-cwd-icon:before {
  content: '\e842';
}
.elfinder-cwd-view-list .elfinder-navbar-root-trash td .elfinder-cwd-icon:before,
.elfinder-navbar-root-trash .elfinder-cwd-icon:before {
  content: '\e80b';
}
.elfinder-dialog-icon {
  font: normal normal normal 14px/1 material;
  background: inherit;
  color: #524949;
  font-size: 37px;
}
.elfinder-dialog-icon:before {
  content: '\e843';
}
.elfinder-dialog-icon-mkdir:before {
  content: '\e808';
}
.elfinder-dialog-icon-mkfile:before {
  content: '\e809';
}
.elfinder-dialog-icon-copy:before {
  content: '\e80d';
}
.elfinder-dialog-icon-prepare:before,
.elfinder-dialog-icon-move:before {
  content: '\e844';
}
.elfinder-dialog-icon-upload:before,
.elfinder-dialog-icon-chunkmerge:before {
  content: '\e815';
}
.elfinder-dialog-icon-rm:before {
  content: '\e80a';
}
.elfinder-dialog-icon-open:before,
.elfinder-dialog-icon-readdir:before,
.elfinder-dialog-icon-file:before {
  content: '\e807';
}
.elfinder-dialog-icon-reload:before {
  content: '\e806';
}
.elfinder-dialog-icon-download:before {
  content: '\e816';
}
.elfinder-dialog-icon-save:before {
  content: '\e845';
}
.elfinder-dialog-icon-rename:before {
  content: '\e812';
}
.elfinder-dialog-icon-zipdl:before,
.elfinder-dialog-icon-archive:before {
  content: '\e819';
}
.elfinder-dialog-icon-extract:before {
  content: '\e818';
}
.elfinder-dialog-icon-search:before {
  content: '\e81f';
}
.elfinder-dialog-icon-loadimg:before {
  content: '\e846';
}
.elfinder-dialog-icon-url:before {
  content: '\e81e';
}
.elfinder-dialog-icon-resize:before {
  content: '\e81d';
}
.elfinder-dialog-icon-netmount:before {
  content: '\e823';
}
.elfinder-dialog-icon-netunmount:before {
  content: '\e824';
}
.elfinder-dialog-icon-chmod:before {
  content: '\e826';
}
.elfinder-dialog-icon-preupload:before,
.elfinder-dialog-icon-dim:before {
  content: '\e847';
}
.elfinder-contextmenu .elfinder-contextmenu-item span.elfinder-contextmenu-icon {
  font-size: 16px;
}
.elfinder-contextmenu .elfinder-contextmenu-item .elfinder-contextsubmenu-item .ui-icon {
  font-size: 15px;
}
.elfinder-contextmenu .elfinder-contextmenu-item .elfinder-button-icon-link:before {
  content: '\e837';
}
.elfinder .elfinder-contextmenu-extra-icon {
  margin-top: -6px;
}
.elfinder .elfinder-contextmenu-extra-icon a {
  padding: 5px;
  margin: -16px;
}
.elfinder-button-icon-link:before {
  content: '\e81e' !important;
}
.elfinder .elfinder-contextmenu-arrow {
  font: normal normal normal 14px/1 material;
  background-image: inherit;
  font-size: 10px !important;
  padding-top: 3px;
}
.elfinder .elfinder-contextmenu-arrow:before {
  content: '\e857';
}
.elfinder-contextmenu .ui-state-hover .elfinder-contextmenu-arrow {
  background-image: inherit;
}
.elfinder-quicklook .ui-resizable-se {
  background: inherit;
}
.elfinder-quicklook-navbar-icon {
  background: transparent;
  font: normal normal normal 14px/1 material;
  font-size: 32px;
  color: #fff;
}
.elfinder-quicklook-titlebar-icon {
  margin-top: -8px;
}
.elfinder-quicklook-titlebar-icon .ui-icon {
  border: 0;
  opacity: .8;
  font-size: 15px;
  padding: 1px;
}
.elfinder-quicklook-titlebar .ui-icon-circle-close,
.elfinder-quicklook .ui-icon-gripsmall-diagonal-se {
  color: #f1f1f1;
}
.elfinder-quicklook-navbar-icon-prev:before {
  content: '\e848';
}
.elfinder-quicklook-navbar-icon-next:before {
  content: '\e849';
}
.elfinder-quicklook-navbar-icon-fullscreen:before {
  content: '\e84a';
}
.elfinder-quicklook-navbar-icon-fullscreen-off:before {
  content: '\e84b';
}
.elfinder-quicklook-navbar-icon-close:before {
  content: '\e84c';
}
.ui-button-icon {
  background-image: inherit;
}
.ui-icon-search:before {
  content: '\e81f';
}
.ui-icon-closethick:before,
.ui-icon-close:before {
  content: '\e839';
}
.ui-icon-circle-close:before {
  content: '\e84c';
}
.ui-icon-gear:before {
  content: '\e82f';
}
.ui-icon-gripsmall-diagonal-se:before {
  content: '\e838';
}
.ui-icon-locked:before {
  content: '\e834';
}
.ui-icon-unlocked:before {
  content: '\e836';
}
.ui-icon-arrowrefresh-1-n:before {
  content: '\e821';
}
.ui-icon-plusthick:before {
  content: '\e83a';
}
.ui-icon-arrowreturnthick-1-s:before {
  content: '\e83b';
}
.ui-icon-minusthick:before {
  content: '\e83c';
}
.ui-icon-pin-s:before {
  content: '\e84d';
}
.ui-icon-check:before {
  content: '\e84e';
}
.ui-icon-arrowthick-1-s:before {
  content: '\e84f';
}
.ui-icon-arrowthick-1-n:before {
  content: '\e850';
}
.ui-icon-triangle-1-s:before {
  content: '\e851';
}
.ui-icon-triangle-1-n:before {
  content: '\e852';
}
.ui-icon-grip-dotted-vertical:before {
  content: '\e853';
}
.elfinder-lock,
.elfinder-perms,
.elfinder-symlink {
  background-image: inherit;
  font: normal normal normal 18px/1 material;
  color: #4d4d4d;
}
.elfinder-na .elfinder-perms:before {
  content: '\e824';
}
.elfinder-ro .elfinder-perms:before {
  content: '\e835';
}
.elfinder-wo .elfinder-perms:before {
  content: '\e854';
}
.elfinder-group .elfinder-perms:before {
  content: '\e800';
}
.elfinder-lock:before {
  content: '\e834';
}
.elfinder-symlink:before {
  content: '\e837';
}
.elfinder .elfinder-toast > div {
  font: normal normal normal 14px/1 material;
}
.elfinder .elfinder-toast > div:before {
  font-size: 24px;
  position: absolute;
  left: 15px;
  top: 3px;
}
.elfinder .elfinder-toast > .toast-info,
.elfinder .elfinder-toast > .toast-error,
.elfinder .elfinder-toast > .toast-success,
.elfinder .elfinder-toast > .toast-warning {
  background-image: inherit !important;
}
.elfinder .elfinder-toast > .toast-info:before {
  content: '\e817';
  color: #3498DB;
}
.elfinder .elfinder-toast > .toast-error:before {
  content: '\e855';
  color: #F44336;
}
.elfinder .elfinder-toast > .toast-success:before {
  content: '\e84e';
  color: #4CAF50;
}
.elfinder .elfinder-toast > .toast-warning:before {
  content: '\e856';
  color: #FF9800;
}
.elfinder-drag-helper-icon-status {
  font: normal normal normal 14px/1 material;
  background: inherit;
}
.elfinder-drag-helper-icon-status:before {
  content: '\e824';
}
.elfinder-drag-helper-move .elfinder-drag-helper-icon-status {
  -webkit-transform: rotate(180deg);
  -ms-transform: rotate(180deg);
  transform: rotate(180deg);
}
.elfinder-drag-helper-move .elfinder-drag-helper-icon-status:before {
  content: '\e854';
}
.elfinder-drag-helper-plus .elfinder-drag-helper-icon-status {
  -webkit-transform: rotate(90deg);
  -ms-transform: rotate(90deg);
  transform: rotate(90deg);
}
.elfinder-drag-helper-plus .elfinder-drag-helper-icon-status:before {
  content: '\e84c';
}
/**
 * MIME Types
 */
.elfinder-cwd-view-list td .elfinder-cwd-icon {
  background-image: url("../images/icons-small.png");
}
.elfinder-cwd-icon {
  background: url("../images/icons-big.png") 0 0 no-repeat;
}
.elfinder-cwd-icon:before {
  font-size: 10px;
  position: relative;
  top: 27px;
  left: inherit;
  padding: 1px;
  background-color: transparent;
}
.elfinder-info-title .elfinder-cwd-icon:before {
  top: 32px;
  display: block;
  margin: 0 auto;
}
.elfinder-info-title .elfinder-cwd-icon.elfinder-cwd-bgurl:before {
  background-color: #313131 !important;
}
.elfinder-cwd-view-icons .elfinder-cwd-icon.elfinder-cwd-bgurl:before {
  left: inherit;
  background-color: #313131;
  width: 60px;
}
.elfinder-quicklook .elfinder-cwd-icon:before {
  top: 33px;
  left: 50% !important;
  position: relative;
  display: block;
  -webkit-transform: translateX(-50%);
  -ms-transform: translateX(-50%);
  transform: translateX(-50%);
}
.elfinder-cwd-icon-zip:before,
.elfinder-cwd-icon-x-zip:before {
  content: 'zip' !important;
}
.elfinder-cwd-icon-x-xz:before {
  content: 'xz' !important;
}
.elfinder-cwd-icon-x-7z-compressed:before {
  content: '7z' !important;
}
.elfinder-cwd-icon-x-gzip:before {
  content: 'gzip' !important;
}
.elfinder-cwd-icon-x-tar:before {
  content: 'tar' !important;
}
.elfinder-cwd-icon-x-bzip:before,
.elfinder-cwd-icon-x-bzip2:before {
  content: 'bzip' !important;
}
.elfinder-cwd-icon-x-rar:before,
.elfinder-cwd-icon-x-rar-compressed:before {
  content: 'rar' !important;
}
.elfinder-cwd-icon-directory {
  background-position: 0 -50px;
}
.elfinder-cwd-icon-application {
  background-position: 0 -150px;
}
.elfinder-cwd-icon-text {
  background-position: 0 -200px;
}
.elfinder-cwd-icon-plain,
.elfinder-cwd-icon-x-empty {
  background-position: 0 -250px;
}
.elfinder-cwd-icon-image {
  background-position: 0 -300px;
}
.elfinder-cwd-icon-vnd-adobe-photoshop {
  background-position: 0 -350px;
}
.elfinder-cwd-icon-vnd-adobe-photoshop:before {
  content: none !important;
}
.elfinder-cwd-icon-postscript {
  background-position: 0 -400px;
}
.elfinder-cwd-icon-audio {
  background-position: 0 -450px;
}
.elfinder-cwd-icon-video,
.elfinder-cwd-icon-flash-video,
.elfinder-cwd-icon-dash-xml,
.elfinder-cwd-icon-vnd-apple-mpegurl,
.elfinder-cwd-icon-x-mpegurl {
  background-position: 0 -500px;
}
.elfinder-cwd-icon-rtf,
.elfinder-cwd-icon-rtfd {
  background-position: 0 -550px;
}
.elfinder-cwd-icon-pdf {
  background-position: 0 -600px;
}
.elfinder-cwd-icon-x-msaccess {
  background-position: 0 -650px;
}
.elfinder-cwd-icon-x-msaccess:before {
  content: none !important;
}
.elfinder-cwd-icon-msword,
.elfinder-cwd-icon-vnd-ms-word,
.elfinder-cwd-icon-vnd-ms-word-document-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-word-template-macroEnabled-12 {
  background-position: 0 -700px;
}
.elfinder-cwd-icon-msword:before,
.elfinder-cwd-icon-vnd-ms-word:before,
.elfinder-cwd-icon-vnd-ms-word-document-macroEnabled-12:before,
.elfinder-cwd-icon-vnd-ms-word-template-macroEnabled-12:before {
  content: none !important;
}
.elfinder-cwd-icon-ms-excel,
.elfinder-cwd-icon-vnd-ms-excel,
.elfinder-cwd-icon-vnd-ms-excel-addin-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-excel-sheet-binary-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-excel-sheet-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-excel-template-macroEnabled-12 {
  background-position: 0 -750px;
}
.elfinder-cwd-icon-ms-excel:before,
.elfinder-cwd-icon-vnd-ms-excel:before,
.elfinder-cwd-icon-vnd-ms-excel-addin-macroEnabled-12:before,
.elfinder-cwd-icon-vnd-ms-excel-sheet-binary-macroEnabled-12:before,
.elfinder-cwd-icon-vnd-ms-excel-sheet-macroEnabled-12:before,
.elfinder-cwd-icon-vnd-ms-excel-template-macroEnabled-12:before {
  content: none !important;
}
.elfinder-cwd-icon-vnd-ms-powerpoint,
.elfinder-cwd-icon-vnd-ms-powerpoint-addin-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-powerpoint-presentation-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-powerpoint-slide-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-powerpoint-slideshow-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-powerpoint-template-macroEnabled-12 {
  background-position: 0 -800px;
}
.elfinder-cwd-icon-vnd-ms-powerpoint:before,
.elfinder-cwd-icon-vnd-ms-powerpoint-addin-macroEnabled-12:before,
.elfinder-cwd-icon-vnd-ms-powerpoint-presentation-macroEnabled-12:before,
.elfinder-cwd-icon-vnd-ms-powerpoint-slide-macroEnabled-12:before,
.elfinder-cwd-icon-vnd-ms-powerpoint-slideshow-macroEnabled-12:before,
.elfinder-cwd-icon-vnd-ms-powerpoint-template-macroEnabled-12:before {
  content: none !important;
}
.elfinder-cwd-icon-vnd-ms-office,
.elfinder-cwd-icon-vnd-oasis-opendocument-chart,
.elfinder-cwd-icon-vnd-oasis-opendocument-database,
.elfinder-cwd-icon-vnd-oasis-opendocument-formula,
.elfinder-cwd-icon-vnd-oasis-opendocument-graphics,
.elfinder-cwd-icon-vnd-oasis-opendocument-graphics-template,
.elfinder-cwd-icon-vnd-oasis-opendocument-image,
.elfinder-cwd-icon-vnd-oasis-opendocument-presentation,
.elfinder-cwd-icon-vnd-oasis-opendocument-presentation-template,
.elfinder-cwd-icon-vnd-oasis-opendocument-spreadsheet,
.elfinder-cwd-icon-vnd-oasis-opendocument-spreadsheet-template,
.elfinder-cwd-icon-vnd-oasis-opendocument-text,
.elfinder-cwd-icon-vnd-oasis-opendocument-text-master,
.elfinder-cwd-icon-vnd-oasis-opendocument-text-template,
.elfinder-cwd-icon-vnd-oasis-opendocument-text-web,
.elfinder-cwd-icon-vnd-openofficeorg-extension,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-presentation,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-slide,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-slideshow,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-template,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-spreadsheetml-sheet,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-spreadsheetml-template,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-wordprocessingml-document,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-wordprocessingml-template {
  background-position: 0 -850px;
}
.elfinder-cwd-icon-html {
  background-position: 0 -900px;
}
.elfinder-cwd-icon-css {
  background-position: 0 -950px;
}
.elfinder-cwd-icon-javascript,
.elfinder-cwd-icon-x-javascript {
  background-position: 0 -1000px;
}
.elfinder-cwd-icon-x-perl {
  background-position: 0 -1050px;
}
.elfinder-cwd-icon-x-python:after,
.elfinder-cwd-icon-x-python {
  background-position: 0 -1100px;
}
.elfinder-cwd-icon-x-ruby {
  background-position: 0 -1150px;
}
.elfinder-cwd-icon-x-sh,
.elfinder-cwd-icon-x-shellscript {
  background-position: 0 -1200px;
}
.elfinder-cwd-icon-x-c,
.elfinder-cwd-icon-x-csrc,
.elfinder-cwd-icon-x-chdr,
.elfinder-cwd-icon-x-c--,
.elfinder-cwd-icon-x-c--src,
.elfinder-cwd-icon-x-c--hdr {
  background-position: 0 -1250px;
}
.elfinder-cwd-icon-x-jar,
.elfinder-cwd-icon-x-java,
.elfinder-cwd-icon-x-java-source {
  background-position: 0 -1300px;
}
.elfinder-cwd-icon-x-jar:before,
.elfinder-cwd-icon-x-java:before,
.elfinder-cwd-icon-x-java-source:before {
  content: none !important;
}
.elfinder-cwd-icon-x-php {
  background-position: 0 -1350px;
}
.elfinder-cwd-icon-xml:after,
.elfinder-cwd-icon-xml {
  background-position: 0 -1400px;
}
.elfinder-cwd-icon-zip,
.elfinder-cwd-icon-x-zip,
.elfinder-cwd-icon-x-xz,
.elfinder-cwd-icon-x-7z-compressed,
.elfinder-cwd-icon-x-gzip,
.elfinder-cwd-icon-x-tar,
.elfinder-cwd-icon-x-bzip,
.elfinder-cwd-icon-x-bzip2,
.elfinder-cwd-icon-x-rar,
.elfinder-cwd-icon-x-rar-compressed {
  background-position: 0 -1450px;
}
.elfinder-cwd-icon-x-shockwave-flash {
  background-position: 0 -1500px;
}
.elfinder-cwd-icon-group {
  background-position: 0 -1550px;
}
.elfinder-cwd-icon-json {
  background-position: 0 -1600px;
}
.elfinder-cwd-icon-json:before {
  content: none !important;
}
.elfinder-cwd-icon-markdown,
.elfinder-cwd-icon-x-markdown {
  background-position: 0 -1650px;
}
.elfinder-cwd-icon-markdown:before,
.elfinder-cwd-icon-x-markdown:before {
  content: none !important;
}
.elfinder-cwd-icon-sql {
  background-position: 0 -1700px;
}
.elfinder-cwd-icon-sql:before {
  content: none !important;
}
.elfinder-cwd-icon-svg,
.elfinder-cwd-icon-svg-xml {
  background-position: 0 -1750px;
}
.elfinder-cwd-icon-svg:before,
.elfinder-cwd-icon-svg-xml:before {
  content: none !important;
}
/**
 * Toolbar
 */
.elfinder-toolbar {
  background: #3b4047;
  -webkit-border-radius: 0;
  border-radius: 0;
  border: 0;
  padding: 5px 0;
}
.elfinder-buttonset {
  -webkit-border-radius: 0;
  border-radius: 0;
  border: 0;
  margin: 0 5px;
  height: 24px;
}
.elfinder .elfinder-button {
  background: transparent;
  -webkit-border-radius: 0;
  border-radius: 0;
  cursor: pointer;
  color: #efefef;
}
.elfinder-toolbar-button-separator {
  border: 0;
}
.elfinder-button-menu {
  -webkit-border-radius: 2px;
  border-radius: 2px;
  -webkit-box-shadow: 0 1px 6px rgba(0, 0, 0, 0.3);
  box-shadow: 0 1px 6px rgba(0, 0, 0, 0.3);
  border: none;
  margin-top: 5px;
}
.elfinder-button-menu-item {
  color: #666666;
  padding: 6px 19px;
}
.elfinder-button-menu-item.ui-state-hover {
  color: #141414;
  background-color: #f5f4f4;
}
.elfinder-button-menu-item-separated {
  border-top: 1px solid #e5e5e5;
}
.elfinder-button-menu-item-separated.ui-state-hover {
  border-top: 1px solid #e5e5e5;
}
.elfinder .elfinder-button-search {
  margin: 0 10px;
  min-height: inherit;
}
.elfinder .elfinder-button-search input {
  background: rgba(40, 42, 45, 0.79);
  -webkit-border-radius: 2px;
  border-radius: 2px;
  border: 0;
  margin: 0;
  padding: 0 23px;
  height: 24px;
  color: #fff;
  font-weight: 100;
}
.elfinder .elfinder-button-search .elfinder-button-menu {
  margin-top: 4px;
  border: none;
  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.5);
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.5);
}
/**
 * Navbar
 */
.elfinder .elfinder-navbar {
  background: #535e64;
  -webkit-box-shadow: 0 1px 8px rgba(0, 0, 0, 0.6);
  box-shadow: 0 1px 8px rgba(0, 0, 0, 0.6);
  border: none;
}
.elfinder-navbar-dir {
  color: #e6e6e6;
  cursor: pointer;
  -webkit-border-radius: 2px;
  border-radius: 2px;
  padding: 5px;
  border: none;
}
.elfinder-navbar-dir.ui-state-hover,
.elfinder-navbar-dir.ui-state-active.ui-state-hover {
  background: #3c4448;
  color: #e6e6e6;
  border: none;
}
.elfinder-navbar .ui-state-active,
.elfinder-disabled .elfinder-navbar .ui-state-active {
  background: #41494e;
  border: none;
}
/**
 * Workzone
 */
.elfinder-workzone {
  background: #cdcfd4;
}
.elfinder-cwd-file {
  color: #555;
}
.elfinder-cwd-file.ui-state-hover,
.elfinder-cwd-file.ui-selected.ui-state-hover {
  background: #4c5961;
  color: #ddd;
}
.elfinder-cwd-file.ui-selected {
  background: #455158;
  color: #555;
}
.elfinder-cwd-filename input,
.elfinder-cwd-filename textarea {
  padding: 2px;
  -webkit-border-radius: 2px !important;
  border-radius: 2px !important;
  width: 100px !important;
  background: #fff;
  color: #222;
}
.elfinder-cwd-filename input:focus,
.elfinder-cwd-filename textarea:focus {
  outline: none;
  border: 1px solid #555;
}
.elfinder-cwd-view-icons .elfinder-cwd-file .ui-state-hover,
.elfinder-cwd-view-icons .elfinder-cwd-file .elfinder-cwd-filename.ui-state-hover,
.elfinder-disabled .elfinder-cwd-view-icons .elfinder-cwd-file .elfinder-cwd-filename.ui-state-hover,
.elfinder-disabled .elfinder-cwd table td.ui-state-hover {
  background: transparent;
}
.elfinder-cwd table {
  padding: 0;
}
.elfinder-cwd table tr:nth-child(odd) {
  background-color: transparent;
}
.elfinder-cwd table tr:nth-child(odd).ui-state-hover {
  background-color: #4c5961;
}
#elfinder-elfinder-cwd-thead td {
  background: #353b42;
  color: #ddd;
}
#elfinder-elfinder-cwd-thead td.ui-state-hover,
#elfinder-elfinder-cwd-thead td.ui-state-active {
  background: #30363c;
}
#elfinder-elfinder-cwd-thead td.ui-state-active.ui-state-hover {
  background: #2e333a;
}
.ui-selectable-helper {
  border: 1px solid #3b4047;
  background-color: rgba(104, 111, 121, 0.5);
}
.elfinder-cwd-wrapper.elfinder-cwd-wrapper-trash {
  background-color: #e4e4e4;
}
.elfinder-cwd-wrapper.elfinder-cwd-wrapper-trash .elfinder-cwd-file {
  color: #333;
}
.elfinder-cwd-wrapper.elfinder-cwd-wrapper-trash .elfinder-cwd-file.ui-state-hover,
.elfinder-cwd-wrapper.elfinder-cwd-wrapper-trash .elfinder-cwd-file.ui-selected.ui-state-hover {
  background: #4c5961;
  color: #ddd;
}
.elfinder-cwd-wrapper.elfinder-cwd-wrapper-trash .elfinder-cwd-file.ui-selected {
  background: #455158;
  color: #555;
}
/**
 * Status Bar
 */
.elfinder .elfinder-statusbar {
  background: #3b4047;
  -webkit-border-radius: 0;
  border-radius: 0;
  border: 0;
  color: #cfd2d4;
}
.elfinder-path,
.elfinder-stat-size {
  margin: 0 15px;
}
/**
 * Buttons
 */
.ui-button,
.ui-button:active,
.ui-button.ui-state-default {
  display: inline-block;
  font-weight: normal;
  text-align: center;
  vertical-align: middle;
  cursor: pointer;
  white-space: nowrap;
  -webkit-border-radius: 3px;
  border-radius: 3px;
  text-transform: uppercase;
  -webkit-box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.4);
  box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.4);
  -webkit-transition: all 0.4s;
  -o-transition: all 0.4s;
  transition: all 0.4s;
  background: #fff;
  color: #222;
}
.ui-button .ui-icon,
.ui-button:active .ui-icon,
.ui-button.ui-state-default .ui-icon {
  color: #222;
}
.ui-button:hover,
a.ui-button:active,
.ui-button:active,
.ui-button:focus,
.ui-button.ui-state-hover,
.ui-button.ui-state-active {
  background: #3498DB;
  color: #fff;
}
.ui-button:hover .ui-icon,
a.ui-button:active .ui-icon,
.ui-button:active .ui-icon,
.ui-button:focus .ui-icon,
.ui-button.ui-state-hover .ui-icon,
.ui-button.ui-state-active .ui-icon {
  color: #fff;
}
.ui-button.ui-state-active:hover {

  background: #217dbb;
  color: #fff;
  border: none;
}
.ui-button:focus {
  outline: none !important;
}
.ui-controlgroup-horizontal .ui-button {
  -webkit-border-radius: 0;
  border-radius: 0;
  border: 0;
}
/**
 * Context Menu
 */
.elfinder .elfinder-contextmenu,
.elfinder .elfinder-contextmenu-sub {
  -webkit-border-radius: 2px;
  border-radius: 2px;
  -webkit-box-shadow: 0 1px 6px rgba(0, 0, 0, 0.3);
  box-shadow: 0 1px 6px rgba(0, 0, 0, 0.3);
  border: none;
}
.elfinder .elfinder-contextmenu-separator,
.elfinder .elfinder-contextmenu-sub-separator {
  border-top: 1px solid #e5e5e5;
}
.elfinder .elfinder-contextmenu-item {
  color: #666;
  padding: 5px 30px;
}
.elfinder .elfinder-contextmenu-item.ui-state-hover {
  background-color: #f5f4f4;
  color: #141414;
}
.elfinder .elfinder-contextmenu-item.ui-state-active {
  background-color: #2196F3;
  color: #fff;
}
/**
 * Dialogs
 */
.elfinder .elfinder-dialog {
  -webkit-border-radius: 0;
  border-radius: 0;
  border: 0;
  -webkit-box-shadow: 0 1px 30px rgba(0, 0, 0, 0.6);
  box-shadow: 0 1px 30px rgba(0, 0, 0, 0.6);
}
.elfinder .elfinder-dialog .ui-dialog-content[id*="edit-elfinder-elfinder-"] {
  padding: 0;
}
.elfinder .elfinder-dialog .ui-tabs {
  -webkit-border-radius: 0;
  border-radius: 0;
  border: 0;
}
.elfinder .elfinder-dialog .ui-tabs-nav {
  -webkit-border-radius: 0;
  border-radius: 0;
  border: 0;
  background: transparent;
  border-bottom: 1px solid #ddd;
}
.elfinder .elfinder-dialog .ui-tabs-nav li {
  border: 0;
  font-weight: normal;
  background: transparent;
  margin: 0;
  padding: 3px 0;
}
.elfinder .elfinder-dialog .ui-tabs-nav li.ui-tabs-active {
  padding-bottom: 7px;
}
.elfinder .elfinder-dialog .ui-tabs-nav .ui-tabs-selected a,
.elfinder .elfinder-dialog .ui-tabs-nav .ui-state-active a,
.elfinder .elfinder-dialog .ui-tabs-nav li:hover a {
  -webkit-box-shadow: inset 0 -2px 0 #3498DB;
  box-shadow: inset 0 -2px 0 #3498DB;
  color: #3498DB;
}
.std42-dialog .ui-dialog-titlebar {
  background: #353b44;
  -webkit-border-radius: 0;
  border-radius: 0;
  border: 0;
}
.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-button .ui-icon {
  border-color: inherit;
  -webkit-transition: 0.2s ease-out;
  -o-transition: 0.2s ease-out;
  transition: 0.2s ease-out;
  opacity: 0.8;
  color: #fff;
  width: auto;
  height: auto;
  font-size: 12px;
  padding: 3px;
}
.elfinder-mobile .std42-dialog .ui-dialog-titlebar .ui-dialog-titlebar-close .ui-icon,
.std42-dialog .ui-dialog-titlebar .ui-dialog-titlebar-close:hover .ui-icon {
  background-color: #F44336;
}
.elfinder-mobile .std42-dialog .ui-dialog-titlebar .elfinder-titlebar-full .ui-icon,
.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-full:hover .ui-icon {
  background-color: #4CAF50;
}
.elfinder-mobile .std42-dialog .ui-dialog-titlebar .elfinder-titlebar-minimize .ui-icon,
.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-minimize:hover .ui-icon {
  background-color: #FF9800;
}
.elfinder-dialog-title {
  color: #f1f1f1;
}
.std42-dialog .ui-dialog-content {
  background: #fff;
}
.ui-widget-content {
  font-family: "Noto Sans";
  color: #546E7A;
}
.std42-dialog .ui-dialog-buttonpane button {
  margin: 2px;
  padding: .4em .5em;
}
.std42-dialog .ui-dialog-buttonpane button span.ui-icon {
  padding: 0;
}
.elfinder-upload-dialog-wrapper .elfinder-upload-dirselect {
  width: inherit;
  height: inherit;
  padding: .4em;
  margin-left: 5px;
  color: #222;
}
.elfinder-upload-dialog-wrapper .elfinder-upload-dirselect.ui-state-hover {
  background: #888;
  color: #fff;
  outline: none;
  -webkit-border-radius: 2px;
  border-radius: 2px;
}
.elfinder-upload-dialog-wrapper .ui-button {
  padding: .4em 3px;
  margin: 0 2px;
}
.elfinder-upload-dialog-wrapper .ui-button {
  margin-left: 19px;
  margin-right: -15px;
}
.elfinder-upload-dropbox {
  border: 2px dashed #bbb;
}
.elfinder-upload-dropbox:focus {
  outline: none;
}
.elfinder-upload-dropbox.ui-state-hover {
  background: #f1f1f1;
  border: 2px dashed #bbb;
}
.elfinder-help *,
.elfinder-help a {
  color: #546E7A;
}
.elfinder-rtl .elfinder-cwd-size1 .elfinder-cwd-icon.elfinder-cwd-bgurl:before, .elfinder-rtl .elfinder-cwd-size2 .elfinder-cwd-icon.elfinder-cwd-bgurl:before, .elfinder-rtl .elfinder-cwd-size3 .elfinder-cwd-icon.elfinder-cwd-bgurl:before {
    left: 0;
    position: absolute;
}
.elfinder-cwd-view-icons .elfinder-cwd-file .ui-state-hover,
.elfinder-cwd-view-icons .elfinder-cwd-file .ui-state-active {
   color: #fff;
}
.elfinder-cwd-view-list thead td .ui-resizable-handle {top: 3px;}

.elfinder-button-menu.elfinder-button-search-menu {top:6px !important;}
.elfinder .elfinder-contextmenu-item .ui-icon.ui-icon-check {
    margin-top: -6px;
}
.elfinder-contextmenu .elfinder-contextmenu-item .elfinder-contextsubmenu-item .ui-icon.ui-icon-check {
    font-size: 13px;right: 1px;
}
.elfinder-ltr .elfinder-button-search .ui-icon-close{font-size: 17px;}
.elfinder .elfinder-contextmenu-rtl .elfinder-contextmenu-arrow:before {
    content: '\e858';
}

.elfinder .elfinder-cwd table thead td{ background: #cdcfd4; }

.elfinder-contextmenu-item .elfinder-button-icon-opennew:before {content: ''; background: url(../images/icon-new-window.png) no-repeat; height: 16px; width: 16px; display: block; background-size: 15px; }

.elfinder-contextmenu-item .elfinder-button-icon-hide:before {content: ''; background: url(../images/hide.png) no-repeat; height: 16px; width: 16px; display: block; background-size: 15px; }

/* New Css Added Here  */
.ui-front.elfinder-quicklook.elfinder-frontmost .ui-dialog-titlebar .ui-icon{ font-size: 11px; line-height: 17px; }
.elfinder-notify-cancel .elfinder-notify-button.ui-icon.ui-icon-close{ line-height: 19px; font-size: 11px; color:#ffffff} 
.elfinder-notify-cancel .elfinder-notify-button.ui-icon.ui-icon-close:hover{ background: #ff6252; }



/* icon set css */
.wrap.wp-filemanager-wrap .ui-front.ui-dialog.ui-widget.ui-widget-content.ui-corner-all.ui-draggable.std42-dialog .ui-dialog-content.ui-widget-content .ui-helper-clearfix.elfinder-rm-title span.elfinder-cwd-icon:before {
    left: inherit;
    background-color: #313131;
    top: 32px;
    display: block;
    margin: 0 auto;
}themes/gray/css/theme.min.css000064400000107405151215013520012163 0ustar00@font-face {
    font-family: 'Noto Sans';
    src: url('../lib/fonts/notosans/NotoSans-Regular.eot');
    src: url('../lib/fonts/notosans/NotoSans-Regular.eot?#iefix') format('embedded-opentype'),
        url('../lib/fonts/notosans/NotoSans-Regular.woff2') format('woff2'),
        url('../lib/fonts/notosans/NotoSans-Regular.woff') format('woff'),
        url('../lib/fonts/notosans/NotoSans-Regular.ttf') format('truetype');
    font-weight: normal;
    font-style: normal;
    font-display: swap;
  }
  @font-face {
    font-family: 'Noto Sans';
    src: url('../lib/fonts/notosans/NotoSans-BoldItalic.eot');
    src: url('../lib/fonts/notosans/NotoSans-BoldItalic.eot?#iefix') format('embedded-opentype'),
        url('../lib/fonts/notosans/NotoSans-BoldItalic.woff2') format('woff2'),
        url('../lib/fonts/notosans/NotoSans-BoldItalic.woff') format('woff'),
        url('../lib/fonts/notosans/NotoSans-BoldItalic.ttf') format('truetype');
    font-weight: bold;
    font-style: normal;
    font-display: swap;
  }
  @font-face {
    font-family: 'Noto Sans';
    src: url('../lib/fonts/notosans/NotoSans-Black.eot');
    src: url('../lib/fonts/notosans/NotoSans-Black.eot?#iefix') format('embedded-opentype'),
        url('../lib/fonts/notosans/NotoSans-Black.woff2') format('woff2'),
        url('../lib/fonts/notosans/NotoSans-Black.woff') format('woff'),
        url('../lib/fonts/notosans/NotoSans-Black.ttf') format('truetype');
    font-weight: 900;
    font-style: normal;
    font-display: swap;
  }
  .elfinder{color:#546E7A;font-family:"Noto Sans", sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.elfinder.ui-widget.ui-widget-content{font-family:"Noto Sans", sans-serif;-webkit-box-shadow:0 1px 8px rgba(0, 0, 0, 0.6);box-shadow:0 1px 8px rgba(0, 0, 0, 0.6);-webkit-border-radius:0;border-radius:0;border:0}input.elfinder-tabstop,input.elfinder-tabstop.ui-state-hover,select.elfinder-tabstop,select.elfinder-tabstop.ui-state-hover{padding:5px;color:#666666;background:#fff;border-radius:3px;font-weight:normal;border-color:#888}select.elfinder-tabstop,select.elfinder-tabstop.ui-state-hover{width:100%}.elfinder-button-icon-spinner,.elfinder-info-spinner,.elfinder-navbar-spinner{background:url("../images/loading.svg") center center no-repeat!important;width:16px;height:16px}@-webkit-keyframes progress-animation{0%{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-animation{0%{background-position:1rem 0}to{background-position:0 0}}.elfinder-notify-progressbar{border:0}.elfinder-notify-progress,.elfinder-notify-progressbar{-webkit-border-radius:0;border-radius:0}.elfinder-notify-progress,.elfinder-resize-spinner{background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-size:1rem 1rem;-webkit-animation:progress-animation 1s linear infinite;animation:progress-animation 1s linear infinite;background-color:#0275d8;height:1rem}.elfinder-quicklook{background:#232323;-webkit-border-radius:2px;border-radius:2px}.elfinder-quicklook-titlebar{background:inherit}.elfinder-quicklook-fullscreen .elfinder-quicklook-navbar{border:inherit;opacity:inherit;-webkit-border-radius:4px;border-radius:4px;background:rgba(66, 66, 66, 0.73)}.elfinder .elfinder-navdock{border:0}.elfinder-mobile .elfinder-quicklook-titlebar-icon .ui-icon.elfinder-icon-close,.elfinder-mobile .elfinder-quicklook-titlebar-icon .ui-icon.elfinder-icon-full,.elfinder-mobile .elfinder-quicklook-titlebar-icon .ui-icon.elfinder-icon-minimize,.elfinder-mobile .std42-dialog .ui-dialog-titlebar .elfinder-titlebar-full .ui-icon,.elfinder-mobile .std42-dialog .ui-dialog-titlebar .elfinder-titlebar-minimize .ui-icon,.elfinder-mobile .std42-dialog .ui-dialog-titlebar .ui-dialog-titlebar-close .ui-icon,.elfinder-quicklook-titlebar-icon .ui-icon.elfinder-icon-close:hover,.elfinder-quicklook-titlebar-icon .ui-icon.elfinder-icon-full:hover,.elfinder-quicklook-titlebar-icon .ui-icon.elfinder-icon-minimize:hover,.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-full:hover .ui-icon,.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-minimize:hover .ui-icon,.std42-dialog .ui-dialog-titlebar .ui-dialog-titlebar-close:hover .ui-icon{background-image:none}.elfinder .elfinder-toast>div{background-color:#323232!important;color:#d6d6d6;-webkit-box-shadow:none;box-shadow:none;opacity:inherit;padding:10px 60px}.elfinder .elfinder-toast>div button.ui-button{color:#fff}.elfinder .elfinder-toast>.toast-info button.ui-button{background-color:#3498DB}.elfinder .elfinder-toast>.toast-error button.ui-button{background-color:#F44336}.elfinder .elfinder-toast>.toast-success button.ui-button{background-color:#4CAF50}.elfinder .elfinder-toast>.toast-warning button.ui-button{background-color:#FF9800}.elfinder-toast-msg{font-family:"Noto Sans", sans-serif;font-size:17px}#ace_settingsmenu{font-family:"Noto Sans", sans-serif;-webkit-box-shadow:0 1px 30px rgba(0, 0, 0, 0.6)!important;box-shadow:0 1px 30px rgba(0, 0, 0, 0.6)!important;background-color:#1d2736!important;color:#e6e6e6!important}#ace_settingsmenu,#kbshortcutmenu{padding:0}.ace_optionsMenuEntry{padding:5px 10px}.ace_optionsMenuEntry:hover{background-color:#111721}.ace_optionsMenuEntry label{font-size:13px}#ace_settingsmenu input[type=text],#ace_settingsmenu select{margin:1px 2px 2px;padding:2px 5px;-webkit-border-radius:3px;border-radius:3px;border:0;background:rgba(9, 53, 121, 0.75);color:white}@font-face{font-family:material;src:url("../icons/material.eot?98361579");src:url("../icons/material.eot?98361579#iefix") format("embedded-opentype"), url("../icons/material.woff2?98361579") format("woff2"), url("../icons/material.woff?98361579") format("woff"), url("../icons/material.ttf?98361579") format("truetype"), url("../icons/material.svg?98361579#material") format("svg");font-weight:normal;font-style:normal}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:material;src:url("../icons/material.svg?98361579#material") format("svg")}}.elfinder-button-icon,.ui-icon,.ui-widget-content .ui-icon,.ui-widget-header .ui-icon{font:normal normal normal 14px/1 material;background-image:inherit;text-indent:inherit}.ui-button-icon-only .ui-icon{font:normal normal normal 14px/1 material;background-image:inherit!important;text-indent:0;font-size:16px}.elfinder-toolbar .elfinder-button-icon{font-size:20px;color:#ddd;margin-top:-2px}.elfinder-button-icon{background:inherit}.elfinder-button-icon-home:before{content:'\e800'}.elfinder-button-icon-back:before{content:'\e801'}.elfinder-button-icon-forward:before{content:'\e802'}.elfinder-button-icon-up:before{content:'\e803'}.elfinder-button-icon-dir:before{content:'\e804'}.elfinder-button-icon-opendir:before{content:'\e805'}.elfinder-button-icon-reload:before{content:'\e806'}.elfinder-button-icon-open:before{content:'\e807'}.elfinder-button-icon-mkdir:before{content:'\e808'}.elfinder-button-icon-mkfile:before{content:'\e809'}.elfinder-button-icon-rm:before{content:'\e80a'}.elfinder-button-icon-trash:before{content:'\e80b'}.elfinder-button-icon-restore:before{content:'\e80c'}.elfinder-button-icon-copy:before{content:'\e80d'}.elfinder-button-icon-cut:before{content:'\e80e'}.elfinder-button-icon-paste:before{content:'\e80f'}.elfinder-button-icon-getfile:before{content:'\e810'}.elfinder-button-icon-duplicate:before{content:'\e811'}.elfinder-button-icon-rename:before{content:'\e812'}.elfinder-button-icon-edit:before{content:'\e813'}.elfinder-button-icon-quicklook:before{content:'\e814'}.elfinder-button-icon-upload:before{content:'\e815'}.elfinder-button-icon-download:before{content:'\e816'}.elfinder-button-icon-info:before{content:'\e817'}.elfinder-button-icon-extract:before{content:'\e818'}.elfinder-button-icon-archive:before{content:'\e819'}.elfinder-button-icon-view:before{content:'\e81a'}.elfinder-button-icon-view-list:before{content:'\e81b'}.elfinder-button-icon-help:before{content:'\e81c'}.elfinder-button-icon-resize:before{content:'\e81d'}.elfinder-button-icon-link:before{content:'\e81e'}.elfinder-button-icon-search:before{content:'\e81f'}.elfinder-button-icon-sort:before{content:'\e820'}.elfinder-button-icon-rotate-r:before{content:'\e821'}.elfinder-button-icon-rotate-l:before{content:'\e822'}.elfinder-button-icon-netmount:before{content:'\e823'}.elfinder-button-icon-netunmount:before{content:'\e824'}.elfinder-button-icon-places:before{content:'\e825'}.elfinder-button-icon-chmod:before{content:'\e826'}.elfinder-button-icon-accept:before{content:'\e827'}.elfinder-button-icon-menu:before{content:'\e828'}.elfinder-button-icon-colwidth:before{content:'\e829'}.elfinder-button-icon-fullscreen:before{content:'\e82a'}.elfinder-button-icon-unfullscreen:before{content:'\e82b'}.elfinder-button-icon-empty:before{content:'\e82c'}.elfinder-button-icon-undo:before{content:'\e82d'}.elfinder-button-icon-redo:before{content:'\e82e'}.elfinder-button-icon-preference:before{content:'\e82f'}.elfinder-button-icon-mkdirin:before{content:'\e830'}.elfinder-button-icon-selectall:before{content:'\e831'}.elfinder-button-icon-selectnone:before{content:'\e832'}.elfinder-button-icon-selectinvert:before{content:'\e833'}.elfinder-button-icon-theme:before{content:'\e859'}.elfinder-button-icon-logout:before{content:'\e85a'}.elfinder-button-search .ui-icon.ui-icon-search{font-size:17px}.elfinder-button-search .ui-icon:hover{opacity:1}.elfinder-navbar-icon{font:normal normal normal 16px/1 material;background-image:inherit!important}.elfinder-navbar-icon:before{content:'\e804'}.elfinder-droppable-active .elfinder-navbar-icon:before,.ui-state-active .elfinder-navbar-icon:before,.ui-state-hover .elfinder-navbar-icon:before{content:'\e805'}.elfinder-navbar-root-local .elfinder-navbar-icon:before{content:'\e83d'}.elfinder-navbar-root-ftp .elfinder-navbar-icon:before{content:'\e823'}.elfinder-navbar-root-sql .elfinder-navbar-icon:before{content:'\e83e'}.elfinder-navbar-root-dropbox .elfinder-navbar-icon:before{content:'\e83f'}.elfinder-navbar-root-googledrive .elfinder-navbar-icon:before{content:'\e840'}.elfinder-navbar-root-onedrive .elfinder-navbar-icon:before{content:'\e841'}.elfinder-navbar-root-box .elfinder-navbar-icon:before{content:'\e842'}.elfinder-navbar-root-trash .elfinder-navbar-icon:before{content:'\e80b'}.elfinder-places .elfinder-navbar-root .elfinder-navbar-icon:before{content:'\e825'}.elfinder-navbar-arrow{background-image:inherit!important;font:normal normal normal 14px/1 material;font-size:10px;padding-top:3px;padding-left:2px;color:#a9a9a9}.ui-state-active .elfinder-navbar-arrow{color:#fff}.elfinder-ltr .elfinder-navbar-collapsed .elfinder-navbar-arrow:before{content:'\e857'}.elfinder-rtl .elfinder-navbar-collapsed .elfinder-navbar-arrow:before{content:'\e858'}.elfinder-ltr .elfinder-navbar-expanded .elfinder-navbar-arrow:before,.elfinder-rtl .elfinder-navbar-expanded .elfinder-navbar-arrow:before{content:'\e851'}div.elfinder-cwd-wrapper-list tr.ui-state-default td span.ui-icon{font-size:8px;margin-top:5px;margin-right:5px}div.elfinder-cwd-wrapper-list .ui-icon-grip-dotted-vertical{margin:2px}.elfinder-cwd-view-list .elfinder-navbar-root-box td .elfinder-cwd-icon,.elfinder-cwd-view-list .elfinder-navbar-root-dropbox td .elfinder-cwd-icon,.elfinder-cwd-view-list .elfinder-navbar-root-ftp td .elfinder-cwd-icon,.elfinder-cwd-view-list .elfinder-navbar-root-googledrive td .elfinder-cwd-icon,.elfinder-cwd-view-list .elfinder-navbar-root-local td .elfinder-cwd-icon,.elfinder-cwd-view-list .elfinder-navbar-root-onedrive td .elfinder-cwd-icon,.elfinder-cwd-view-list .elfinder-navbar-root-sql td .elfinder-cwd-icon,.elfinder-cwd-view-list .elfinder-navbar-root-trash td .elfinder-cwd-icon,.elfinder-navbar-root-box .elfinder-cwd-icon,.elfinder-navbar-root-dropbox .elfinder-cwd-icon,.elfinder-navbar-root-ftp .elfinder-cwd-icon,.elfinder-navbar-root-googledrive .elfinder-cwd-icon,.elfinder-navbar-root-local .elfinder-cwd-icon,.elfinder-navbar-root-onedrive .elfinder-cwd-icon,.elfinder-navbar-root-sql .elfinder-cwd-icon,.elfinder-navbar-root-trash .elfinder-cwd-icon{background-image:inherit}.elfinder-cwd-view-list .elfinder-navbar-root-box td .elfinder-cwd-icon:before,.elfinder-cwd-view-list .elfinder-navbar-root-dropbox td .elfinder-cwd-icon:before,.elfinder-cwd-view-list .elfinder-navbar-root-ftp td .elfinder-cwd-icon:before,.elfinder-cwd-view-list .elfinder-navbar-root-googledrive td .elfinder-cwd-icon:before,.elfinder-cwd-view-list .elfinder-navbar-root-local td .elfinder-cwd-icon:before,.elfinder-cwd-view-list .elfinder-navbar-root-onedrive td .elfinder-cwd-icon:before,.elfinder-cwd-view-list .elfinder-navbar-root-sql td .elfinder-cwd-icon:before,.elfinder-cwd-view-list .elfinder-navbar-root-trash td .elfinder-cwd-icon:before,.elfinder-navbar-root-box .elfinder-cwd-icon:before,.elfinder-navbar-root-dropbox .elfinder-cwd-icon:before,.elfinder-navbar-root-ftp .elfinder-cwd-icon:before,.elfinder-navbar-root-googledrive .elfinder-cwd-icon:before,.elfinder-navbar-root-local .elfinder-cwd-icon:before,.elfinder-navbar-root-onedrive .elfinder-cwd-icon:before,.elfinder-navbar-root-sql .elfinder-cwd-icon:before,.elfinder-navbar-root-trash .elfinder-cwd-icon:before{font-family:material;background-color:transparent;color:#525252;font-size:55px;position:relative;top:-10px!important;padding:0;display:contents!important}.elfinder-cwd-view-list .elfinder-navbar-root-local td .elfinder-cwd-icon:before,.elfinder-navbar-root-local .elfinder-cwd-icon:before{content:'\e83d'}.elfinder-cwd-view-list .elfinder-navbar-root-ftp td .elfinder-cwd-icon:before,.elfinder-navbar-root-ftp .elfinder-cwd-icon:before{content:'\e823'}.elfinder-cwd-view-list .elfinder-navbar-root-sql td .elfinder-cwd-icon:before,.elfinder-navbar-root-sql .elfinder-cwd-icon:before{content:'\e83e'}.elfinder-cwd-view-list .elfinder-navbar-roor-dropbox td .elfinder-cwd-icon:before,.elfinder-navbar-roor-dropbox .elfinder-cwd-icon:before{content:'\e83f'}.elfinder-cwd-view-list .elfinder-navbar-roor-googledrive td .elfinder-cwd-icon:before,.elfinder-navbar-roor-googledrive .elfinder-cwd-icon:before{content:'\e840'}.elfinder-cwd-view-list .elfinder-navbar-roor-onedrive td .elfinder-cwd-icon:before,.elfinder-navbar-roor-onedrive .elfinder-cwd-icon:before{content:'\e841'}.elfinder-cwd-view-list .elfinder-navbar-roor-box td .elfinder-cwd-icon:before,.elfinder-navbar-roor-box .elfinder-cwd-icon:before{content:'\e842'}.elfinder-cwd-view-list .elfinder-navbar-root-trash td .elfinder-cwd-icon:before,.elfinder-navbar-root-trash .elfinder-cwd-icon:before{content:'\e80b'}.elfinder-dialog-icon{font:normal normal normal 14px/1 material;background:inherit;color:#524949;font-size:37px}.elfinder-dialog-icon:before{content:'\e843'}.elfinder-dialog-icon-mkdir:before{content:'\e808'}.elfinder-dialog-icon-mkfile:before{content:'\e809'}.elfinder-dialog-icon-copy:before{content:'\e80d'}.elfinder-dialog-icon-move:before,.elfinder-dialog-icon-prepare:before{content:'\e844'}.elfinder-dialog-icon-chunkmerge:before,.elfinder-dialog-icon-upload:before{content:'\e815'}.elfinder-dialog-icon-rm:before{content:'\e80a'}.elfinder-dialog-icon-file:before,.elfinder-dialog-icon-open:before,.elfinder-dialog-icon-readdir:before{content:'\e807'}.elfinder-dialog-icon-reload:before{content:'\e806'}.elfinder-dialog-icon-download:before{content:'\e816'}.elfinder-dialog-icon-save:before{content:'\e845'}.elfinder-dialog-icon-rename:before{content:'\e812'}.elfinder-dialog-icon-archive:before,.elfinder-dialog-icon-zipdl:before{content:'\e819'}.elfinder-dialog-icon-extract:before{content:'\e818'}.elfinder-dialog-icon-search:before{content:'\e81f'}.elfinder-dialog-icon-loadimg:before{content:'\e846'}.elfinder-dialog-icon-url:before{content:'\e81e'}.elfinder-dialog-icon-resize:before{content:'\e81d'}.elfinder-dialog-icon-netmount:before{content:'\e823'}.elfinder-dialog-icon-netunmount:before{content:'\e824'}.elfinder-dialog-icon-chmod:before{content:'\e826'}.elfinder-dialog-icon-dim:before,.elfinder-dialog-icon-preupload:before{content:'\e847'}.elfinder-contextmenu .elfinder-contextmenu-item span.elfinder-contextmenu-icon{font-size:16px}.elfinder-contextmenu .elfinder-contextmenu-item .elfinder-contextsubmenu-item .ui-icon{font-size:15px}.elfinder-contextmenu .elfinder-contextmenu-item .elfinder-button-icon-link:before{content:'\e837'}.elfinder .elfinder-contextmenu-extra-icon{margin-top:-6px}.elfinder .elfinder-contextmenu-extra-icon a{padding:5px;margin:-16px}.elfinder-button-icon-link:before{content:'\e81e'!important}.elfinder .elfinder-contextmenu-arrow{font:normal normal normal 14px/1 material;background-image:inherit;font-size:10px!important;padding-top:3px}.elfinder .elfinder-contextmenu-arrow:before{content:'\e857'}.elfinder-contextmenu .ui-state-hover .elfinder-contextmenu-arrow{background-image:inherit}.elfinder-quicklook .ui-resizable-se{background:inherit}.elfinder-quicklook-navbar-icon{background:transparent;font:normal normal normal 14px/1 material;font-size:32px;color:#fff}.elfinder-quicklook-titlebar-icon{margin-top:-8px}.elfinder-quicklook-titlebar-icon .ui-icon{border:0;opacity:.8;font-size:15px;padding:1px}.elfinder-quicklook-titlebar .ui-icon-circle-close,.elfinder-quicklook .ui-icon-gripsmall-diagonal-se{color:#f1f1f1}.elfinder-quicklook-navbar-icon-prev:before{content:'\e848'}.elfinder-quicklook-navbar-icon-next:before{content:'\e849'}.elfinder-quicklook-navbar-icon-fullscreen:before{content:'\e84a'}.elfinder-quicklook-navbar-icon-fullscreen-off:before{content:'\e84b'}.elfinder-quicklook-navbar-icon-close:before{content:'\e84c'}.ui-button-icon{background-image:inherit}.ui-icon-search:before{content:'\e81f'}.ui-icon-close:before,.ui-icon-closethick:before{content:'\e839'}.ui-icon-circle-close:before{content:'\e84c'}.ui-icon-gear:before{content:'\e82f'}.ui-icon-gripsmall-diagonal-se:before{content:'\e838'}.ui-icon-locked:before{content:'\e834'}.ui-icon-unlocked:before{content:'\e836'}.ui-icon-arrowrefresh-1-n:before{content:'\e821'}.ui-icon-plusthick:before{content:'\e83a'}.ui-icon-arrowreturnthick-1-s:before{content:'\e83b'}.ui-icon-minusthick:before{content:'\e83c'}.ui-icon-pin-s:before{content:'\e84d'}.ui-icon-check:before{content:'\e84e'}.ui-icon-arrowthick-1-s:before{content:'\e84f'}.ui-icon-arrowthick-1-n:before{content:'\e850'}.ui-icon-triangle-1-s:before{content:'\e851'}.ui-icon-triangle-1-n:before{content:'\e852'}.ui-icon-grip-dotted-vertical:before{content:'\e853'}.elfinder-lock,.elfinder-perms,.elfinder-symlink{background-image:inherit;font:normal normal normal 18px/1 material;color:#4d4d4d}.elfinder-na .elfinder-perms:before{content:'\e824'}.elfinder-ro .elfinder-perms:before{content:'\e835'}.elfinder-wo .elfinder-perms:before{content:'\e854'}.elfinder-group .elfinder-perms:before{content:'\e800'}.elfinder-lock:before{content:'\e834'}.elfinder-symlink:before{content:'\e837'}.elfinder .elfinder-toast>div{font:normal normal normal 14px/1 material}.elfinder .elfinder-toast>div:before{font-size:45px;position:absolute;left:5px;top:15px}.elfinder .elfinder-toast>.toast-error,.elfinder .elfinder-toast>.toast-info,.elfinder .elfinder-toast>.toast-success,.elfinder .elfinder-toast>.toast-warning{background-image:inherit!important}.elfinder .elfinder-toast>.toast-info:before{content:'\e817';color:#3498DB}.elfinder .elfinder-toast>.toast-error:before{content:'\e855';color:#F44336}.elfinder .elfinder-toast>.toast-success:before{content:'\e84e';color:#4CAF50}.elfinder .elfinder-toast>.toast-warning:before{content:'\e856';color:#FF9800}.elfinder-drag-helper-icon-status{font:normal normal normal 14px/1 material;background:inherit}.elfinder-drag-helper-icon-status:before{content:'\e824'}.elfinder-drag-helper-move .elfinder-drag-helper-icon-status{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.elfinder-drag-helper-move .elfinder-drag-helper-icon-status:before{content:'\e854'}.elfinder-drag-helper-plus .elfinder-drag-helper-icon-status{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.elfinder-drag-helper-plus .elfinder-drag-helper-icon-status:before{content:'\e84c'}.elfinder-cwd-view-list td .elfinder-cwd-icon{background-image:url("../images/icons-small.png")}.elfinder-cwd-icon{background:url("../images/icons-big.png") 0 0 no-repeat}.elfinder-cwd-icon:before{font-size:10px;position:relative;top:27px;left:inherit;padding:1px;background-color:transparent}.elfinder-info-title .elfinder-cwd-icon:before{top:32px;display:block;margin:0 auto}.elfinder-info-title .elfinder-cwd-icon.elfinder-cwd-bgurl:before{background-color:#313131!important}.elfinder-cwd-view-icons .elfinder-cwd-icon.elfinder-cwd-bgurl:before{left:inherit;background-color:#313131}.elfinder-quicklook .elfinder-cwd-icon:before{top:33px;left:50%!important;position:relative;display:block;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.elfinder-cwd-icon-x-zip:before,.elfinder-cwd-icon-zip:before{content:'zip'!important}.elfinder-cwd-icon-x-xz:before{content:'xz'!important}.elfinder-cwd-icon-x-7z-compressed:before{content:'7z'!important}.elfinder-cwd-icon-x-gzip:before{content:'gzip'!important}.elfinder-cwd-icon-x-tar:before{content:'tar'!important}.elfinder-cwd-icon-x-bzip2:before,.elfinder-cwd-icon-x-bzip:before{content:'bzip'!important}.elfinder-cwd-icon-x-rar-compressed:before,.elfinder-cwd-icon-x-rar:before{content:'rar'!important}.elfinder-cwd-icon-directory{background-position:0 -50px}.elfinder-cwd-icon-application{background-position:0 -150px}.elfinder-cwd-icon-text{background-position:0 -200px}.elfinder-cwd-icon-plain,.elfinder-cwd-icon-x-empty{background-position:0 -250px}.elfinder-cwd-icon-image{background-position:0 -300px}.elfinder-cwd-icon-vnd-adobe-photoshop{background-position:0 -350px}.elfinder-cwd-icon-vnd-adobe-photoshop:before{content:none!important}.elfinder-cwd-icon-postscript{background-position:0 -400px}.elfinder-cwd-icon-audio{background-position:0 -450px}.elfinder-cwd-icon-dash-xml,.elfinder-cwd-icon-flash-video,.elfinder-cwd-icon-video,.elfinder-cwd-icon-vnd-apple-mpegurl,.elfinder-cwd-icon-x-mpegurl{background-position:0 -500px}.elfinder-cwd-icon-rtf,.elfinder-cwd-icon-rtfd{background-position:0 -550px}.elfinder-cwd-icon-pdf{background-position:0 -600px}.elfinder-cwd-icon-x-msaccess{background-position:0 -650px}.elfinder-cwd-icon-x-msaccess:before{content:none!important}.elfinder-cwd-icon-msword,.elfinder-cwd-icon-vnd-ms-word,.elfinder-cwd-icon-vnd-ms-word-document-macroEnabled-12,.elfinder-cwd-icon-vnd-ms-word-template-macroEnabled-12{background-position:0 -700px}.elfinder-cwd-icon-msword:before,.elfinder-cwd-icon-vnd-ms-word-document-macroEnabled-12:before,.elfinder-cwd-icon-vnd-ms-word-template-macroEnabled-12:before,.elfinder-cwd-icon-vnd-ms-word:before{content:none!important}.elfinder-cwd-icon-ms-excel,.elfinder-cwd-icon-vnd-ms-excel,.elfinder-cwd-icon-vnd-ms-excel-addin-macroEnabled-12,.elfinder-cwd-icon-vnd-ms-excel-sheet-binary-macroEnabled-12,.elfinder-cwd-icon-vnd-ms-excel-sheet-macroEnabled-12,.elfinder-cwd-icon-vnd-ms-excel-template-macroEnabled-12{background-position:0 -750px}.elfinder-cwd-icon-ms-excel:before,.elfinder-cwd-icon-vnd-ms-excel-addin-macroEnabled-12:before,.elfinder-cwd-icon-vnd-ms-excel-sheet-binary-macroEnabled-12:before,.elfinder-cwd-icon-vnd-ms-excel-sheet-macroEnabled-12:before,.elfinder-cwd-icon-vnd-ms-excel-template-macroEnabled-12:before,.elfinder-cwd-icon-vnd-ms-excel:before{content:none!important}.elfinder-cwd-icon-vnd-ms-powerpoint,.elfinder-cwd-icon-vnd-ms-powerpoint-addin-macroEnabled-12,.elfinder-cwd-icon-vnd-ms-powerpoint-presentation-macroEnabled-12,.elfinder-cwd-icon-vnd-ms-powerpoint-slide-macroEnabled-12,.elfinder-cwd-icon-vnd-ms-powerpoint-slideshow-macroEnabled-12,.elfinder-cwd-icon-vnd-ms-powerpoint-template-macroEnabled-12{background-position:0 -800px}.elfinder-cwd-icon-vnd-ms-powerpoint-addin-macroEnabled-12:before,.elfinder-cwd-icon-vnd-ms-powerpoint-presentation-macroEnabled-12:before,.elfinder-cwd-icon-vnd-ms-powerpoint-slide-macroEnabled-12:before,.elfinder-cwd-icon-vnd-ms-powerpoint-slideshow-macroEnabled-12:before,.elfinder-cwd-icon-vnd-ms-powerpoint-template-macroEnabled-12:before,.elfinder-cwd-icon-vnd-ms-powerpoint:before{content:none!important}.elfinder-cwd-icon-vnd-ms-office,.elfinder-cwd-icon-vnd-oasis-opendocument-chart,.elfinder-cwd-icon-vnd-oasis-opendocument-database,.elfinder-cwd-icon-vnd-oasis-opendocument-formula,.elfinder-cwd-icon-vnd-oasis-opendocument-graphics,.elfinder-cwd-icon-vnd-oasis-opendocument-graphics-template,.elfinder-cwd-icon-vnd-oasis-opendocument-image,.elfinder-cwd-icon-vnd-oasis-opendocument-presentation,.elfinder-cwd-icon-vnd-oasis-opendocument-presentation-template,.elfinder-cwd-icon-vnd-oasis-opendocument-spreadsheet,.elfinder-cwd-icon-vnd-oasis-opendocument-spreadsheet-template,.elfinder-cwd-icon-vnd-oasis-opendocument-text,.elfinder-cwd-icon-vnd-oasis-opendocument-text-master,.elfinder-cwd-icon-vnd-oasis-opendocument-text-template,.elfinder-cwd-icon-vnd-oasis-opendocument-text-web,.elfinder-cwd-icon-vnd-openofficeorg-extension,.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-presentation,.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-slide,.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-slideshow,.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-template,.elfinder-cwd-icon-vnd-openxmlformats-officedocument-spreadsheetml-sheet,.elfinder-cwd-icon-vnd-openxmlformats-officedocument-spreadsheetml-template,.elfinder-cwd-icon-vnd-openxmlformats-officedocument-wordprocessingml-document,.elfinder-cwd-icon-vnd-openxmlformats-officedocument-wordprocessingml-template{background-position:0 -850px}.elfinder-cwd-icon-html{background-position:0 -900px}.elfinder-cwd-icon-css{background-position:0 -950px}.elfinder-cwd-icon-javascript,.elfinder-cwd-icon-x-javascript{background-position:0 -1000px}.elfinder-cwd-icon-x-perl{background-position:0 -1050px}.elfinder-cwd-icon-x-python,.elfinder-cwd-icon-x-python:after{background-position:0 -1100px}.elfinder-cwd-icon-x-ruby{background-position:0 -1150px}.elfinder-cwd-icon-x-sh,.elfinder-cwd-icon-x-shellscript{background-position:0 -1200px}.elfinder-cwd-icon-x-c,.elfinder-cwd-icon-x-c--,.elfinder-cwd-icon-x-c--hdr,.elfinder-cwd-icon-x-c--src,.elfinder-cwd-icon-x-chdr,.elfinder-cwd-icon-x-csrc{background-position:0 -1250px}.elfinder-cwd-icon-x-jar,.elfinder-cwd-icon-x-java,.elfinder-cwd-icon-x-java-source{background-position:0 -1300px}.elfinder-cwd-icon-x-jar:before,.elfinder-cwd-icon-x-java-source:before,.elfinder-cwd-icon-x-java:before{content:none!important}.elfinder-cwd-icon-x-php{background-position:0 -1350px}.elfinder-cwd-icon-xml,.elfinder-cwd-icon-xml:after{background-position:0 -1400px}.elfinder-cwd-icon-x-7z-compressed,.elfinder-cwd-icon-x-bzip,.elfinder-cwd-icon-x-bzip2,.elfinder-cwd-icon-x-gzip,.elfinder-cwd-icon-x-rar,.elfinder-cwd-icon-x-rar-compressed,.elfinder-cwd-icon-x-tar,.elfinder-cwd-icon-x-xz,.elfinder-cwd-icon-x-zip,.elfinder-cwd-icon-zip{background-position:0 -1450px}.elfinder-cwd-icon-x-shockwave-flash{background-position:0 -1500px}.elfinder-cwd-icon-group{background-position:0 -1550px}.elfinder-cwd-icon-json{background-position:0 -1600px}.elfinder-cwd-icon-json:before{content:none!important}.elfinder-cwd-icon-markdown,.elfinder-cwd-icon-x-markdown{background-position:0 -1650px}.elfinder-cwd-icon-markdown:before,.elfinder-cwd-icon-x-markdown:before{content:none!important}.elfinder-cwd-icon-sql{background-position:0 -1700px}.elfinder-cwd-icon-sql:before{content:none!important}.elfinder-cwd-icon-svg,.elfinder-cwd-icon-svg-xml{background-position:0 -1750px}.elfinder-cwd-icon-svg-xml:before,.elfinder-cwd-icon-svg:before{content:none!important}.elfinder-toolbar{background:#3b4047;-webkit-border-radius:0;border-radius:0;border:0;padding:5px 0}.elfinder-buttonset{-webkit-border-radius:0;border-radius:0;border:0;margin:0 5px;height:24px}.elfinder .elfinder-button{background:transparent;-webkit-border-radius:0;border-radius:0;cursor:pointer;color:#efefef}.elfinder-toolbar-button-separator{border:0}.elfinder-button-menu{-webkit-border-radius:2px;border-radius:2px;-webkit-box-shadow:0 1px 6px rgba(0, 0, 0, 0.3);box-shadow:0 1px 6px rgba(0, 0, 0, 0.3);border:none;margin-top:5px}.elfinder-button-menu-item{color:#666666;padding:6px 19px}.elfinder-button-menu-item.ui-state-hover{color:#141414;background-color:#f5f4f4}.elfinder-button-menu-item-separated{border-top:1px solid #e5e5e5}.elfinder-button-menu-item-separated.ui-state-hover{border-top:1px solid #e5e5e5}.elfinder .elfinder-button-search{margin:0 10px;min-height:inherit}.elfinder .elfinder-button-search input{background:rgba(40, 42, 45, 0.79);-webkit-border-radius:2px;border-radius:2px;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;border:0;margin:0;padding:0 23px;height:24px;color:#fff}.elfinder .elfinder-button-search .elfinder-button-menu{margin-top:4px;border:none;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.5);box-shadow:0 1px 3px rgba(0, 0, 0, 0.5)}.elfinder .elfinder-navbar{background:#535e64;-webkit-box-shadow:0 1px 8px rgba(0, 0, 0, 0.6);box-shadow:0 1px 8px rgba(0, 0, 0, 0.6);border:none}.elfinder-navbar-dir{color:#e6e6e6;cursor:pointer;-webkit-border-radius:2px;border-radius:2px;padding:5px;border:none}.elfinder-navbar-dir.ui-state-active.ui-state-hover,.elfinder-navbar-dir.ui-state-hover{background:#3c4448;color:#e6e6e6;border:none}.elfinder-disabled .elfinder-navbar .ui-state-active,.elfinder-navbar .ui-state-active{background:#41494e;border:none}.elfinder-workzone{background:#cdcfd4}.elfinder-cwd-file{color:#555}.elfinder-cwd-file.ui-selected.ui-state-hover,.elfinder-cwd-file.ui-state-hover{background:#4c5961;color:#ddd}.elfinder-cwd-file.ui-selected{background:#455158;color:#555;width:120px!important}.elfinder-cwd-filename input,.elfinder-cwd-filename textarea{padding:2px;-webkit-border-radius:2px!important;border-radius:2px!important;width:100px!important;background:#fff;color:#222}.elfinder-cwd-filename input:focus,.elfinder-cwd-filename textarea:focus{outline:none;border:1px solid #555}.elfinder-cwd-view-icons .elfinder-cwd-file .elfinder-cwd-filename.ui-state-hover,.elfinder-cwd-view-icons .elfinder-cwd-file .ui-state-hover,.elfinder-disabled .elfinder-cwd-view-icons .elfinder-cwd-file .elfinder-cwd-filename.ui-state-hover,.elfinder-disabled .elfinder-cwd table td.ui-state-hover{background:transparent}.elfinder-cwd table{padding:0}.elfinder-cwd table tr:nth-child(odd){background-color:transparent}.elfinder-cwd table tr:nth-child(odd).ui-state-hover{background-color:#4c5961}#elfinder-elfinder-cwd-thead td{background:#353b42;color:#ddd}#elfinder-elfinder-cwd-thead td.ui-state-active,#elfinder-elfinder-cwd-thead td.ui-state-hover{background:#30363c}#elfinder-elfinder-cwd-thead td.ui-state-active.ui-state-hover{background:#2e333a}.ui-selectable-helper{border:1px solid #3b4047;background-color:rgba(104, 111, 121, 0.5)}.elfinder-cwd-wrapper.elfinder-cwd-wrapper-trash{background-color:#e4e4e4}.elfinder-cwd-wrapper.elfinder-cwd-wrapper-trash .elfinder-cwd-file{color:#333}.elfinder-cwd-wrapper.elfinder-cwd-wrapper-trash .elfinder-cwd-file.ui-selected.ui-state-hover,.elfinder-cwd-wrapper.elfinder-cwd-wrapper-trash .elfinder-cwd-file.ui-state-hover{background:#4c5961;color:#ddd}.elfinder-cwd-wrapper.elfinder-cwd-wrapper-trash .elfinder-cwd-file.ui-selected{background:#455158;color:#555}.elfinder .elfinder-statusbar{background:#3b4047;-webkit-border-radius:0;border-radius:0;border:0;color:#cfd2d4}.elfinder-path,.elfinder-stat-size{margin:0 15px}.ui-button,.ui-button.ui-state-default,.ui-button:active{display:inline-block;font-weight:normal;text-align:center;vertical-align:middle;cursor:pointer;white-space:nowrap;-webkit-border-radius:3px;border-radius:3px;text-transform:uppercase;-webkit-box-shadow:1px 1px 4px rgba(0, 0, 0, 0.4);box-shadow:1px 1px 4px rgba(0, 0, 0, 0.4);-webkit-transition:all 0.4s;-o-transition:all 0.4s;transition:all 0.4s;background:#fff;color:#222;border:none}.ui-button .ui-icon,.ui-button.ui-state-default .ui-icon,.ui-button:active .ui-icon{color:#222}.ui-button.ui-state-active,.ui-button.ui-state-hover,.ui-button:active,.ui-button:focus,.ui-button:hover,a.ui-button:active{background:#3498DB;color:#fff;border:none}.ui-button.ui-state-active .ui-icon,.ui-button.ui-state-hover .ui-icon,.ui-button:active .ui-icon,.ui-button:focus .ui-icon,.ui-button:hover .ui-icon,a.ui-button:active .ui-icon{color:#fff}.ui-button.ui-state-active:hover{background:#217dbb;color:#fff;border:none}.ui-button:focus{outline:none!important}.ui-controlgroup-horizontal .ui-button{-webkit-border-radius:0;border-radius:0;border:0}.elfinder .elfinder-contextmenu,.elfinder .elfinder-contextmenu-sub{-webkit-border-radius:2px;border-radius:2px;-webkit-box-shadow:0 1px 6px rgba(0, 0, 0, 0.3);box-shadow:0 1px 6px rgba(0, 0, 0, 0.3);border:none}.elfinder .elfinder-contextmenu-separator,.elfinder .elfinder-contextmenu-sub-separator{border-top:1px solid #e5e5e5}.elfinder .elfinder-contextmenu-item{color:#666;padding:5px 30px}.elfinder .elfinder-contextmenu-item.ui-state-hover{background-color:#f5f4f4;color:#141414}.elfinder .elfinder-contextmenu-item.ui-state-active{background-color:#2196F3;color:#fff}.elfinder .elfinder-dialog{-webkit-border-radius:0;border-radius:0;border:0;-webkit-box-shadow:0 1px 30px rgba(0, 0, 0, 0.6);box-shadow:0 1px 30px rgba(0, 0, 0, 0.6)}.elfinder .elfinder-dialog .ui-dialog-content[id*=edit-elfinder-elfinder-]{padding:0}.elfinder .elfinder-dialog .ui-tabs{-webkit-border-radius:0;border-radius:0;border:0}.elfinder .elfinder-dialog .ui-tabs-nav{-webkit-border-radius:0;border-radius:0;border:0;background:transparent;border-bottom:1px solid #ddd}.elfinder .elfinder-dialog .ui-tabs-nav li{border:0;font-weight:normal;background:transparent;margin:0;padding:3px 0}.elfinder .elfinder-dialog .ui-tabs-nav li.ui-tabs-active{padding-bottom:7px}.elfinder .elfinder-dialog .ui-tabs-nav .ui-state-active a,.elfinder .elfinder-dialog .ui-tabs-nav .ui-tabs-selected a,.elfinder .elfinder-dialog .ui-tabs-nav li:hover a{-webkit-box-shadow:inset 0 -2px 0 #3498DB;box-shadow:inset 0 -2px 0 #3498DB;color:#3498DB}.std42-dialog .ui-dialog-titlebar{background:#353b44;-webkit-border-radius:0;border-radius:0;border:0}.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-button .ui-icon{border-color:inherit;-webkit-transition:0.2s ease-out;-o-transition:0.2s ease-out;transition:0.2s ease-out;opacity:0.8;color:#fff;width:auto;height:auto;font-size:12px;padding:3px}.elfinder-mobile .std42-dialog .ui-dialog-titlebar .ui-dialog-titlebar-close .ui-icon,.std42-dialog .ui-dialog-titlebar .ui-dialog-titlebar-close:hover .ui-icon{background-color:#F44336}.elfinder-mobile .std42-dialog .ui-dialog-titlebar .elfinder-titlebar-full .ui-icon,.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-full:hover .ui-icon{background-color:#4CAF50}.elfinder-mobile .std42-dialog .ui-dialog-titlebar .elfinder-titlebar-minimize .ui-icon,.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-minimize:hover .ui-icon{background-color:#FF9800}.elfinder-dialog-title{color:#f1f1f1}.std42-dialog .ui-dialog-content{background:#fff}.ui-widget-content{font-family:"Noto Sans", sans-serif;color:#546E7A}.std42-dialog .ui-dialog-buttonpane button{margin:2px;padding:.4em .5em}.std42-dialog .ui-dialog-buttonpane button span.ui-icon{padding:0}.elfinder-upload-dialog-wrapper .elfinder-upload-dirselect{width:inherit;height:inherit;padding:.4em;margin-left:5px;color:#222}.elfinder-upload-dialog-wrapper .elfinder-upload-dirselect.ui-state-hover{background:#888;color:#fff;outline:none;-webkit-border-radius:2px;border-radius:2px}.elfinder-upload-dialog-wrapper .ui-button{padding:.4em 3px;margin:0 2px}.elfinder-upload-dialog-wrapper .ui-button{margin-left:19px;margin-right:-15px}.elfinder-upload-dropbox{border:2px dashed #bbb}.elfinder-upload-dropbox:focus{outline:none}.elfinder-upload-dropbox.ui-state-hover{background:#f1f1f1;border:2px dashed #bbb}.elfinder-help *,.elfinder-help a{color:#546E7A}themes/gray/images/hide.png000064400000003134151215013520011653 0ustar00�PNG


IHDR  szz�tEXtSoftwareAdobe ImageReadyq�e<%iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 6.0-c002 79.164460, 2020/05/12-16:04:17        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop 21.2 (Macintosh)" xmpMM:InstanceID="xmp.iid:1676E08A4C2911EBBA7FB7B3BDD03902" xmpMM:DocumentID="xmp.did:1676E08B4C2911EBBA7FB7B3BDD03902"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:52B4976B4C2511EBBA7FB7B3BDD03902" stRef:documentID="xmp.did:52B4976C4C2511EBBA7FB7B3BDD03902"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>g	{��IDATx��OH�A�����`Q�%("� Q�!��Kۖv�t�KX3{�Eaԡ"�"����<T���l�V�}|�N3���Z9��7���{o�{��Q�X�YΑ�Y��L&S-[�D%T�h��`/�^����ع�Z�HAFπ�`���V���Ϡ�
�ot�@�YpD��x�)��� ��)�Ԇ��s��Piz����g`�
{-�L��J���u��߃贌g(����j�9���q�,2�ң��u�0A9�JΑs��6p��v0]I�F �BJ8�&�/�$%�`XK'�����5G��t��Q�ݴ{R3�g?�>f�sSOI��6ꎘ�.�L�PHv�ˣ`H�#�����W�=�#Г��?8i>{�7*�c=�`�󜮁�1��@�1i(��Ѡk�t�+`g`�!�I����&���3�"�-\W�H^<�p��v۸4�M<rY��?�U!Ϙ�g�f�JϿ�X̚���,��8�1����lb%}@
�,�F�QpKT������ӎ��&Z��n��bc)��]t\ץU+�o�x�Q���|V[]�y��"�;�4S�pt��'�R�zu"����ކܹ�R�a�s瓼�;xBz�
#/��ezK�vi��FF�˴R�ȳ���(�a܄��j��3d��yp�����7�8�'���DK5>���������/��K�IEND�B`�themes/gray/images/loading.svg000064400000005234151215013520012375 0ustar00<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
	 viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve">
<style type="text/css">.st0{fill:#333333;}</style>
<path class="st0" d="M11.4,0.7c1.8,0.9,3.1,2.1,3.9,3.9l-1,0.5c-0.6-1.3-2-2.7-3.3-3.4">
<animate  accumulate="none" additive="replace" attributeName="fill" begin="0s" calcMode="linear" dur="1s" fill="remove" repeatCount="indefinite" restart="always" values="#333;#eee;#333;#333">
		</animate>
</path>
<path class="st0" d="M15.5,5.2c0.6,1.9,0.7,3.7,0,5.5l-1-0.4c0.5-1.4,0.5-3.3,0-4.8">
<animate  accumulate="none" additive="replace" attributeName="fill" begin="0.125s" calcMode="linear" dur="1s" fill="remove" repeatCount="indefinite" restart="always" values="#333;#eee;#333;#333">
		</animate>
</path>
<path class="st0" d="M15.2,11.4c-0.9,1.8-2.1,3.1-3.9,3.9l-0.5-1c1.3-0.6,2.7-2,3.3-3.4">
<animate  accumulate="none" additive="replace" attributeName="fill" begin="0.250s" calcMode="linear" dur="1s" fill="remove" repeatCount="indefinite" restart="always" values="#333;#eee;#333;#333">
		</animate>
</path>
<path class="st0" d="M10.7,15.5c-1.9,0.6-3.6,0.7-5.5,0l0.4-1.1c1.4,0.5,3.3,0.5,4.7,0">
<animate  accumulate="none" additive="replace" attributeName="fill" begin="0.375s" calcMode="linear" dur="1s" fill="remove" repeatCount="indefinite" restart="always" values="#333;#eee;#333;#333">
		</animate>
</path>
<path class="st0" d="M4.7,15.3c-1.8-0.9-3.1-2.1-3.9-3.9l1-0.5c0.6,1.3,2,2.7,3.3,3.4">
<animate  accumulate="none" additive="replace" attributeName="fill" begin="0.500s" calcMode="linear" dur="1s" fill="remove" repeatCount="indefinite" restart="always" values="#333;#eee;#333;#333">
		</animate>
</path>
<path class="st0" d="M0.5,10.8c-0.6-1.9-0.7-3.7,0-5.5l1.1,0.4c-0.5,1.4-0.5,3.3,0,4.8">
<animate  accumulate="none" additive="replace" attributeName="fill" begin="0.625s" calcMode="linear" dur="1s" fill="remove" repeatCount="indefinite" restart="always" values="#333;#eee;#333;#333">
		</animate>
</path>
<path class="st0" d="M0.7,4.7c0.9-1.8,2.1-3.1,3.9-3.9l0.5,1c-1.3,0.6-2.7,2-3.3,3.4">
<animate  accumulate="none" additive="replace" attributeName="fill" begin="0.750s" calcMode="linear" dur="1s" fill="remove" repeatCount="indefinite" restart="always" values="#333;#eee;#333;#333">
		</animate>
</path>
<path class="st0" d="M5.3,0.5c1.9-0.6,3.6-0.7,5.5,0l-0.4,1.1C9,1.1,7.1,1.1,5.7,1.6">
<animate  accumulate="none" additive="replace" attributeName="fill" begin="0.875s" calcMode="linear" dur="1s" fill="remove" repeatCount="indefinite" restart="always" values="#333;#eee;#333;#333">
		</animate>
</path>
</svg>
themes/gray/images/icon-new-window.png000064400000002450151215013520013766 0ustar00�PNG


IHDR..W�+7tEXtSoftwareAdobe ImageReadyq�e<%iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 6.0-c002 79.164460, 2020/05/12-16:04:17        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop 21.2 (Macintosh)" xmpMM:InstanceID="xmp.iid:52B497654C2511EBBA7FB7B3BDD03902" xmpMM:DocumentID="xmp.did:52B497664C2511EBBA7FB7B3BDD03902"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:52B497634C2511EBBA7FB7B3BDD03902" stRef:documentID="xmp.did:52B497644C2511EBBA7FB7B3BDD03902"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>�_Rc�IDATx��ٽJA��޵Z�
� ��Oacc�G%V���)|%`#B���2��[D��4^�30a��ݞw;���f/�K+Mӈ��!��-�uߐ�$�;�F�u�@0��X���N+�mq�_ ۈ��2�-愯�#���?Q��ñ�C	�9�w O��v{�AXl��.�Q�8!�+�m���Qe�P�>��u3~�:���GeM��;��E���c�@�T�xU����m��-O�>��O,��n�X���l�i{TL6"��]�q����g��F�Ѫc���z�MZ��3�W���xT.�#��?�|���;~c]7<���~	y�g%�M���g��r��J�x�x�x���p<��K�-p�����N�� 3��32�?!��%cgd@�W��C�<9��IEND�B`�themes/gray/images/icons-big.png000064400000061447151215013520012627 0ustar00�PNG


IHDR0@�#� IDATx^�	|�ǟ��$��[,�TLT�Jųh�Uo[��_%j=j�Dk�V�BxS/b�@��E����B8�$!!��?��L�ݝ㝝wf':��O��w�y����y�i�Ӧ}R&�8��zi����j�B�zji(����&L���G�U�h��=��ᒤ!TN���X$a�Ya���	���]Z}{���8n ������?�ְB�
�S�P�f7��­�n� ����w�Z�)��N��1+>J��-�uJ9�(F��i��v��	���W����S��ӥ\P1�:��-C�fѱCcW ���fVy�	��z�`58WU�m
m�����=�L�?�tJ>��ZXK���d�+w������{�zS����'�͆�fZ�~�u�ОtP߬@��O�a��
@M�ϯ�Bϯ��N���X�6�K��K��v��F���u��E�Dnj��3�MY(@/@��^:����R|��U}Vu%s�3WN���tj[��kם7�F�Z�K�b�@MxLd�kK��b�8qh��@�=�aiЊ�e��8nh/I���f�.���k�);�#?�L^f4��Z(^�X�by�lf}>�A�����j0�ƀ����
ʧ2/��4G-`EPWX ~������c�9j�n���9�BxlT>:b0�1JJ'2+��,��:<xp�ݬ���<�*��~?5�U�"�Q�ak��9�T%|���72|ʴ�K���!�X��b�T�ϋ̨��}5-�BYUE�Rm)���@�IK
E1��P�ֿ��y��Ʌ 8���_hq����d�y�x?:�G�"�Y�Q�Ϥ�yQ�UM�]���wR��Yxy8G �HH�Gx*H�����Bs�R͎�<eW�Ŕo����(��n
@D�����@W<x�+Ͱ��Y�USv��,`�fY�,��)��y�K���z`Ք]�<إY�q=�jʮ~���,븞X5eW?�vi�u\�����ߏ���R�]�y�9€�.��Wv0B��~�H�G>�R�xq��U��cb������	*A����_�к�=<x��υ,*���,����,*���1�ʴ���6H��uG��$��21�r5:�(9�;�W��.���]r�8)Q/��9�Q�����a�Z��#��V�gv<L�[K�n'��\b�uN���r�^�f��	{�u#���]\o��@����>	� Vn�T�COMA J���O�}'-)K=�eh�^eKz��	�l�������ZR"���nls�^�t��7J���`R��tlcoo{�t��nl5����t�}:���}�0�~ָ
�j������#�O^���Պ��N������,�HT�cvq)����%SA��\�DQ���Dp�.�
�VpT�X$��ODžl�9� ���Ž�ATp����|U�|=ݼ|P>ܫ����5ת��^��YN|�����>I�%�ڧ�4-���mQy������r${AK���@�s!��'�`��ˇ8H�z;4�;�;<u7�i����P;�>�߉�м�1=�і}=ءU3c�x-���ީ�j�Jѱ�ީ�]�H������M���;�1�'��;1����m���v����ޛ��ѱ�\p4ŌKF&���$!C'�e�c��N
��v��\�����y��'\�m����`S�Y='�G�w��i�?1��F�L9J��@Z�i���qɈ�cK�Ҡk-��
���g�&�R��R��U��hA\�—F�/��
.k�u@��f��K9���xOy���S8hM>d*�F�W;�ØS`$<u5fg��i�P]���cNq
ܔ�hM��r$C'��j����[��^9���e��?��;���#%��'F��!o�����<���-�3�0(��.�lU/���dk����a��S����w*"����Yr6��&�"�
���۳囚L���(��2�T�_h*���y�7$%
�
p�s����7�I�=K�'�ڏ�5��i!��-���"�3�\�i��?"2C��,�+�@�@�H��Y�욂��\Rf�����D��l'�|��U�쪟%�-$�ڕN�Q1���z���)�秴켢��~	�)���/	.�,7a�����l���X��T�mMں'�R.���4���c���5��̚�x���#������.T�=B�m'��X��~\� f0��P��R�b���14���.dk�^��^3���z.Ġ@ۺx3�73:��?� f�[�q�B�H�8���(ۺy�M��{`T�m�~Z(~�%����ӈ�WP}QfB�f��I/�)E��ٶ��0�\�{�d����ݢ�Q3)��UlY5�W���A'k%�3��Ul��H��D�eg)/�P��ҝY!\@x[V��^�V��#��sy��=�m뇻�od�߉\H���X���V�1����_hx�Vy�����/u]ky��z1�3iY�֥� ��j��\��rڛ�;}�ԧ<�8%K	�A���ɸ� �f�d,�3���8X^[��r��-_�XV��<XT���=XV��<XT���MY��ز����-�:�4�f���y%e"��{l�5Ոm��j~{l�1���G��[{�`��!T-��y%�D��[�DFV�tA��{l���/	���kY�c+U�qI`�p�)�3�[��f	"-+�|a�;��r2��l�pk�f0�?	>�ҳ��\�6�[N����HG��fA�����/y�m�-'L�(�o�V����P����(;-��8�6:��a&��_����5Oi]`�g
�H���]�$z *�:�Ň\H�+i�5;>OB<�Kd����?�ů��0���+���y�x��5(]( 	����A=hO��~ɍ��9z�i��@|P�K��UhX/�O��x�r�u]����NJ�#
����%WJ�)��U/K�J�)[)(4
�a�@��u�X?�K�����:�f�[>���m�n6���R�F�\���]���=��Y��,X�c��8��g��鶮F���r)�S��X�?R�!��1�?R���]=;�jfL�f�eG_�vh�̘��hˎ���Ъ�1�-P2�$�#Z���$�QAUi�[畔��=��,���2㯎�լ��k|�(�*bK[]�/##
�����kB�O�6ʳ�����IC�Z`@���EQt�b���gi(��z�V�H�!A�C{�Z��J@���|>��M.��7f��	��D��U���s[N�@k�N�DZ5ӵ@>
��w6�d��r@��w4�H:eg$P�2��,g��r�u�!�5���b�`U��~�L(˖�\,p�/� |i���M��[���r��p�m�����|F�,�;��(�,�9����-��-�]���u	#�7���;|(-^����/���y�]���C�>�+��X��>_��0n�����PL�+!�b��ݻ�
Jh)��kh��st�	�@ܨA8��z�t	���gЬ�������a��=�MV�Oj�Qc^=�RI�J�뿺�T��ŧt���?_|�2J/7\��.a�m���4���_)��F��-��p7\�@����j���-��r��k�whU�!F��N;�x����H��F.%���@^W��Ղ�UWM>���.�f�|��}��{�ܠ�[\��j34 ��N?�xif��2�VH)��Q���2J���AJ��m]J	��������v��v�:���)��y�K���z`Ք]�<إY�q=�jʮ~?5狢�U[�.��f������%�"
�P�5�ثز+>-��Y���ae$��ﱵ���&=S�����~��B� :R�����%
�j���?/�cK@�&OJGl��^��"J�P���c6�Z��J@�%BB@`�p�)s�H�����{:!r�B�ȺZs[N�@]��ZDQs2�QO�|���[N`g��0u�B���
T�S�]�u!�n�[Ŗ��B^�<�:���Uބ~�Zg����?�P��{�yJ;�j��Vj}� ����3�B��E�S�ϡ�wS�o&'%|4�:>p�j��RJ?ueV\'�~��C`4h_�7��y�/ٴY���Z�fV\O駞��M�yx��s��$��rL��}��L{T3й�P�͕{��#)��2A�lf�����ؠ����-z�0�H�@�=S�^�Kr�����i5:>�q��\7�}b��`⛞�-���u@RhqK@�j�H���V��.���� ��p�tɢ}��n�^��rC�
y���ɮ�ķ�k�b�V(�P)\V@��*�Jd��,�2�QӚ���M�/\L��
RΗS��b�֑[���A�_��<�zn�!��3��BH�x���@���)�"��}X[� (�,�w[,M|��ǵZs�0�&���F���ۚ��#����d��
���R^Z�}��P\\���7�}��`�:����NH��0O$#���i�4iǎ��ИԒ�<^lht�Fϧg�\��a�n.�zC�<�5;�g���߳o��ϳ�Y���Ӳ���C�������k�b���q����ݰQ�HT�w���-�q�e<͊�]甔�`����kj�	�v��9����B�8s*���"&�j�]���̩��D��@iA�SS@i>_��C�Yd�T�TtFuH��nr!eVb�p+`� � A䥧�<�䩈N��j	koO�ꙖV��&NEt "������#ڧ""/�W4���TD'��{��x*���C������=ѣ�Z���l����_?��G��|�_�we���"ۣG|�4' Pz�xJ3�KHf����ޗU��s ��R��Y��?��^���g�y�^�Y�God9U�kk)R�]�8��7#���+\��!�{������w�����
M!t��P*�j{H�Ll��q1�5���,�,d�B=.��҃Aiq�\���mh��j���9F&p��:���b��}�m�.��OY��+�L��\ξ嶮�SDM��F���j��;�gm��a�Y⟤X��}���j��q�D�,7>%��駨��ؓ�q��jX�Ax[��Y���:�V/�U�G������i_�: r����+?T��7��3�^Բ�������W1����[o��Ye�-��˟>=�XZy1/p��@�Y����Y��F͎�Y���x��,�[�f�3e���|��TD
SA�*�"�:����r*�@��_�NE4���׬�j?���OE�_��1�,��x*bӄх�c��{a��!T-�x��bA�8r*b'��3�WZP]c}��H{l��,Z^cm��Tt�}H|�nr!e�b�p+`� � A����՘�c�����F-a�b�^~�ϖ}ʾǖ��hG{;���3(�W���TD'X�L��W���$_���JK�_d��nI����/�Di��&)�X/j�	j{v���	,8�LV�T��?��"�}*��8����_#�GI=�lS
���C@R�V���@���r�#1�"H�}�Xa��d�n?$��,�9,�$���n�B^JuJֿY�s$XI������8�A���d��:[���#�b�#�>��>!<��7.�$-�=J�4�gK��p�gJ�4�gK��p�O�-�c������
�
2�W�ﱵ�1%�K*�D�*s���!��Y�u�����8�D����F�ݎ_:��N�w*���[(��9q�w;@�4���~pO�@�#[�DV^��O��z�V����p88����*�R�!�@�nr!e�`�p+`� � A���,��Ul9
�wS����YU&�'PfNf������b�I1"Ҟ]{(��Q� ���U���T��-'Xgy����c�d���X�j��g�2�u@v���A{�{i�m�׻��7�Nr
����%��M�h�?�v[�w�=4q�W�%N2�K�5����1Z�e�M���7W��
��G�;�+^(^uxl���Ɔ��#���a��W$B��� ƍ��
���]_S���T�w������Y���A��
�Q�5$���GC-q7�D7��.�B��c2ȳk��q�x���J��K�Q�	�����(�?.!�2O����@� ��_��`r�q<�V�T�ۖ,��[?�wku�5eY�1��y�Z��	�n ��왵ϻ��6�V�g
���&J���.N��%�:%��}<�Tj��,�Y��<��@˗{��B�x��@˗���}��^ew��*��S����bk��{J��; �ʻ��ӫ�2cq�jVl}��]F�8��5kE��-##X
��";��Dg*�j�{�$
�j�599ž�3{luH��b�{�Z��J�B>_��={�Ul�
�3�Cd�M.��\�n��$�\A(?���\Ŗ�1�UIڬP���(��+?~���-'�=��H�>_���rb]sD|���MMl[V-�;q"�5�¡���2�s��]��]}5���2�c�'�@C,��e��׳'5��&�߫_�B�8�ٽ�»wwOX`ϲe�r��҆�ak�R�ƍ�w�j
��5Ώ=҅�e�8�B��uu�����x�i]�HFp�G�,���e9_$Ł��(@�;����FߌiUv�zG���Z�ҍ��Q1�
������<�)�p�RF���P�K/�4�>d��p!@X	fG�� 9x�.BJ��R��p@N�J��F2������w��n;��΍M�y��B-����Ƌ�r�Z��##����K��Ϻ2ܩ�����+����_��?���l@�"x�d�`X̵�^���@���?��0��C�m�4���C�fo�``%���i�-��:w�����TiW�
�e\��d��
@����PH��V��y�	����_�i��Uu,.�D��]�Ps����/���>٥��ї�ٛ�����f2cyHFk<��,�S�Ɍ�Y ���e�/{�ȏ�|��c���P���,�Y���=������f�b�gLrKӅ�=�Lp�Tĭ{��|b���㩈/�>�0"8S��uo�T�d!T-��ر�qf��N	"ǗQ:�&q7?=s�!�!D���X<1E�}"3��,�pf���	��D��W~M�'�*�����ڨ-�*b��_>�ӕ�[N�n�����z�"
e���V2���$��'/[�x*"/��ÇQzN�$�-[�iK�a��H�͡�ÆS���(g�@�8��Y#��'��ճ�d�7�#/�?�H�fs��ÇS�a�F��&��F���F��zۧ�h׺u���/Mܚ�k0��᭷%R��	��:�L)N]s-�56%*!�F.�q�E�����~�	3�F�;-eK[q!��Ws���D0���J	�c�'����S�dtؚ�X�̮u���O�\�+�}�tkgT��KmM�R ]q�j2�\8�!s@{�|�J�^�^�k�7M���|�ɯ㛞�;AC��].�h�u��O�&:ٗ����&�A�e���~t�<�h<�q4a��R�
�0�!����bG~���Կ����`�„��}�xƒ�b��Uut�Iy���t�c��0O��Ns!���N�I�p��g�A��1Z.�Ȋ�ɬ���ى���"�E�Ag��5��56JYl���_F�q��	_�E�Nd��X�-��O���5���p�C~�+��?�?ؤ@���>�
{ IDAT�(�+=�"�0�J�Oe�@���X��f��S�Ҽ<`j�=�k�0�o�����N,1��<�n�.�� |�r��'�PS~V���*FK��Y�5Y�g�Y��b�USv��,`�fY�,��)����,��ر���ઊ��XP��ĩ�ύ9��\r*"�Py�G˽�-���Ҹ�[#ϟUF8��=��q{MGF8X[5��[#ϟUHUl�5��!iUv���H��ȩ�Q4�&��S�UU��=�R@$��!ۃ߼�x�V���]"�!��F�0C�����/�U�n���*����]	�iOf�@���nb��r���Vk#Q$��O/Z[U�v*���	�/�|�d�=�x��?�feH"��7��FFq��
���N��CcH����}si��}��83^�����9������!�}�!���+�=�(�漣�d��(�PV�&�\[���s���g�m�&_�r�U�NU���V�=���J��T�r�*���nVr�����I�JnUK�Is�Zۼ���.tnjj*)>X�r�X�T��R�m��v���76��y���!���?�Pi?�{e-=z�)t��|:�^�[�8V�Yn�s!hZ�����:�W�H�ˤ�� �M�f�pnj��2�/�Hn�Z���bdw] H�^9G�z�N��ߥۮ8�V~QG�^S�nH'��f��A@N=�.;�p��ąpc9xe?��פ�x�/�ƤP�u]˚{��5��Kf���~ɬ��Z����b3£o��s<�x�q�j�l|(�cQ��߸<���,��u��w���\�P�%(f_|Jq@?|�2H��
W��)?+����,�ŅX\Ů>�]�e׳�����Y�.Ͳ��Y�USv�3e�C.��k���/R�����"���%�k*��r��W{[v���q5+��o�PFD�Wl��j�Iӂ�s��Ul�O�PH>B٥�}W3�4���o>ٱ=�:�i����^��"|BHG���,�v*b�:�5D���&R�3�[��f	��#������*������V;�|=��Ϩf��r[��v#�)��M��_Q�j��-GX�J��}p1[����9h(�<� ��+���V���U��~vDJ���O�=�F�
�l�,|����\j �ءGH��³4WL9�2���X�M��=o̤�ޟg�Y`��GSu51``����Ϥ`F��}�Im�a��r!�@�	XM銀�h��@n��%�T[Z޴k��r�$۹��G[�y�$4������'�JiB���BI��Cc�����rmڵ����B�@��<{2]yb)�= �;��9
3_��TI�o�4S��o��p�xW��… �����ϗkj_�B�n$���&Z[���8��]Mt�s!h�{/���li���U2�\ �K��b�5���-�O����6�4ҩ�\e��ײ;��GB�
���Ԗ��J�{�Op#�Ŝ����k���P�p�Df�u�/�=w�) 8�e\�#�\��Y�f�4���A���{��i�ڧ�Ld�p<h�n��|&`I�)0r
���m�
�i��=حa��=i��=حa��MY`�i���j�-��j�/`��ʿ�ŧ�� �H����ڇz[l�r��f���	��H��bkcs[MG@�V���b°°�L����?I'
�j�5���Xt�T�N	"' ��k�Wl���!S����*�R��!_D`�p�)�3�[��f	"' ��k�Ul9�Z;hoX�TD�\�����[N�PkW{uhl���r�Ec}�V��$��C�����b�@��#ȟ�'�ؾm�m��*oB?[�@i�S�c��A#�Cxe��c���R�=��z�$p���=j�P���u�������igp���P������]�^7�u۶m�M&���%�l��e�g�����hj��rh�e×Կ��=��]�e�� ��I#��M
���b R��Ҷu���>��^��Be5+�����`�R�����H�{7D]b�k��z<:�z��@��-������4Z�z��M�}�)@�D�jěec�519?e�'�C�O9��~���\H	�x/e�`��!w��b����]�F�,\���4$� ֛f���̛2b��%�G}��
��TbO	r{Z���@�u����<������Z��1CGW���.�@�gW> ؍h�F��/V�'�<�ȟ6�a�>���#;�+�ϲIp��B����A�@
�>+B�_:�f/�2{S��=��Lf,��h��5�xj3��<$�5�ט�����G�U����|�^�����%D��I�<b�:�b��KsK�bk�	T&��Wl�o���0�j�_���Pph���-�1��P�@�/�8r*b'��3�JG� �[)�4�Ba��cV����TtFv��c�p�)33�[��f	"�O�#?"s[N�@]+Q�v���^*���+��@�֎vү��rTT�<1;�܅L�)�}�Cl[�- ������ۋږUQGb���:���)��W��E��R�*j}�30��R�7HBC�FM���#ު����? _8��7`�^F�+�o~����R}f����r5��i=8G x���t]�����UK��p�>˴�[Ⱥr*e�ߥ��o>�8��`Р�-�8���b���gE�3Z�y.�2U3����g��4��#�ʅ����#�Ψ�f1�y��8�
��#ң���ɸk�i<�����8�DzP��?��6�}�F�l��Z	N~�w��]X�������<���x6�8�l�8���5�8�7���mý�>V�5 t�7��g�!g����`+��l��T��:�1���dk����ap�J���g[��08��S~�Cڞ�/w�ѥ#@��(4�mv�@%�H.�c�*�����-��}M��dX� 
�������&�`��[�J����ȩ���{l%�j��K)&1�H�V'���F�E8챕"J�	�V��E��J@g��">b�p�)33�[��f	"/�_^��zs[N���j1�c�g�_>j��=��@��ζ�0(;���͸ǖ��k�<��+��-=�@�(k�9�5ӱ��שc��>\�2C}�d�tC��?\F��Gw�Ih�`���3�X�[�o� �ય��2�qS���yYw��J�u�gF@���=
Tw�hg�ek��7S,y�_L�>b@������H��)g�1b�f����P��?;c����x�Ԭ��[p���:[�t������c���o�2�9�E�>������r&�܋'��d&kP�:,4�.���z.�HR��Z>\L;ﻖE~RН�0*O�`"j�V}��
�5��Z�;�Z��n�j�~9N�ڿ���UĖ�'����B(-�Vp��R.W���p�Å���~�_ڥ(�ZFk.�3M�,��<����=Fc���F��Tâ/�}��ΗV�'1;,���R{�H	�֓�f�4�{s2aW|�I��<Z�([���
2H��w�Mf��Nbv�Ƅa�/?�������7Ks�4?�P^d���ˁ*C�YCV��V�@)�C	"n��z4N0k�LG������Y���ӳ�m��׳�Z53�|[rH~@���bK�T��c뻒�%�[*��<���cˌ�:�W�b�ۿ�D�آ6�D�#A�S��Dq�Q�ݒB�O
b���p��!T�-*��>G*�(
���+����J�/�Dڂ4���[)�Z"�3��\Ho�n`���$!#�<����Ul9��D���Z𑐑S~��}�-G�Q�n�H�.D$-�����v*���S�O�;�V���߻]q�@�ۚ��'[�v�^Ջ��;�7�wU�9�{��r�`����(��n�۴+��Y"��oN2�ޡ����5{�`�����3�]u$�;(���^�-���u���1�S��jd�nT�(��=<q�p��1ru+��N.�x`�Y�j������_�;�Ȟ:�\�$�?k-ݰ��d'3=�IT\c��H�gڗ^��pS1��h23��!�I����(ۨ�(�k�Fs�-��0���Ò|��Ȗq@�l�����JZF��-@U><������H�V[j�#��>�k���0%Fn�Lu��}�W���v���C-���x@�I��|��IZM�BjG�̀����e��\���zz���2�>{d_�"�ߌ&1G��MMhe?�� ��Z�y׉�ҨZg�I�Mf�d,��mr�)>���I
��Ū7�R�Q��B�7ħ2�#}*\��j$��������jm=���``�,k?�USv��,`�fY�,��)��y�K��㚲ݶ$�粊���+����"�oY\"
�;���2r�I�[���h?͊�-�R&�4���6lo�iæHSk�Ulmz|X�_�9R��a{t��d!T-�e&������ ���(q{bm��O�	��B�=	?��[)�������*(\�­`a�p3����+u��=����-�ji�ޟJ:13P>�o�+�����j4�c+���hx�[N0�;!8p2�[Z��<�u9�=��ؼ�Y����k.����̃�m���F���*������g)}P��HF�}��4}�7jZ��[Tw�����BNĀg�f�f\υx�P�q3�-~�[��}I��k,�d����U|ׂk��.�%'�V����<q5��n����Q���IHϥ��K��_EBF��j��3�.#[�c�W��=�Kx��?��и����7Bò<�҄w�A��o�M����В=�
)���zYP�@�_��H�r��۞-��~WFSk���x�c'&.9e�YG� l�Ӣ,����Ph;_)�\�_;��b�5.��Y�ȟ*��O{<�e�>��>�9G��@8e.�\ԨMP��T[�͌��XeI���0y��}1SRRj\�Y����OaM���c�7�y��S�Ɍ�Y ��ƳOm&3�O���(���RŔ!�`�d{l��^�#�iW@�B�k��*�LYܩΚ[�e$����Hۿ�!j�T�{l=����آ���XIC�[`�brj��(@"#��n�����Q8���X�c+eQK��f7��2q1C���n�Bdf�ӭ���r4Bۉ��آ̜r��,��-G��Vc�p�-�ѣ�*��r�u�!D�49ȶǖ���tè��Ot��ƽT��j�ٚ-�2�-PR�?M;~(A��7K�5�2*�p_�ʧS���L�2b�����5�z[�,SG����)��:��`��GP񠞪����$iTne�����ӈ$��A/|��J<���sh��u���F���d�
X�x�}{��c/��\r�(U8=�ʏ7�ԕ�yy�EK��p3�Y5�����@��$۪��I��о�nhO-;�R�d]����#�j����x`�y�J�x6Lh���Ț�����L�1�D����u!�  `	����:���\��>��q�3��p%� �z@�@��?�zsWJ����?�*WnLX�H���BZ�U.5�Q�)�B����!pu]�v]y�dM�wv��1ˑ��8
���1K�����M�`Xv��>���	Y�ʘؾ�dL�� �xqrtO"@Nˮ�����]�
<3���
��4���v��:I��U�)����8��3.��RB/=���K���|��RL<�4	���,��)�YA�`�T��+��ͻ���ٜ��/f�xW���JU��V��
���@�x�����P[��o|֥hWe!��C|y��?jI�%�|�1�,L2=�d����<���X����k<��f2c��@>��<��<$sc^���lb�-��~	��=�D��k�y[����8�[�}��D�+��wl�I�@�z:NJ�	��UH���[�;�O+��P����S,���	��SZ}�E�OEL	�@(n.�~����TtFwH$��M.��N�n��$������.6W��d���Aa�S�G�����?_�^��$�(F�}�n�a���e�UO-e;�I�u�(
��w��V�e`h�<5d?��#[��vZ��6ڶ��U�~�<x�1��z��ia�;̐�p��4��#�d��oզ-a;�e'��N�y�vOQ)3��~�������`�N�L��ҳ��X��J�#��G��$��3����3�N5�����ji��آA�2��R䨟�GC�*\��e��P���z阄<oH���`�8�ŪCqx���-	���23�^�"��v�R��E_Ҽ��*�ȹތ����C��_��0�-�=�~�`6�A��+h5��՛�I��[^�Z��XRk��u�ok��=�
ퟫ�N!,R�q��Ɛ�7O�����/��N����KI`u�������Ȫ�Wk��Ęm�z�1	7��Woܩ��"<+ C�5.���l< <��%[��-�֢՛��`���fH�p���Ż��?�g�%����H`[�=UjŇ�\�7>W���@�����]
 ?�c��J<#<{�8���+��`~h�q�gBJא&�E_2e&�9��j=�!���HXv$�l�d�2s�`F[v�,`�V͌�Y������Y���ӔN��pXtUŖ�/,��t�SO���Q WTl	�X���3��-3.�X_͊�OF^&�d�[��m�m����"~4zd�O�;R���^ic��!T-���Ê9�@���k8���"
B(�K�&�;�Tn��,cH���n3�[�!� Ad���|i�b�� ���N{#��"��'լe��r��j(j�ނ@�'����Y�V��$����?���b��Sk��A�g�ل���pS���Q���Z��(k���s�hڽ�=��5S�()����<�]5Y��ӕ���H;�|��_t)�=)[ۖ:Zs�i��F�x+�ut�0�?�
�4����Լ�kjۂӲ��s�-}G[��_S�'+ �����.�4A���I�U�Z����PƠA���7����)ɟ�[m�t�H/���ϰ@��A����u_Q�:�����	mB�4c� �~H�kɒ��XQd�,`$<�5n��yeLī��-�g�f"[�.C|$!�@8�9�`Ix4Y@� @ȁ���)��m�h~���
��m*��檦N�W��cYh�ӻ��Ԗ���jV������%�A���u���n���9��y@�}-Bh�t�%�?'W�<r�i��ӕ�kr։����G��~]B-뾖����F)�Ĭ*�{.�r}���1j�/��-�qSLJ����'�>p�ƕo*a�C�:r�OF'n�����Q
+l{�yiQ&/Ƞ}d5�d� 8,�	MM��g;��^��|��2��i.!�od��\���
���_i�Q���Dˠ��Zr@;�Br˳�2���shx���cf�xm�z�3`��J�ɚO��7����s򤥰2�W��s5����jk�#��h]�
��������"��*J FZ���x6��P[&옏�x�fn�r!�u9l�
!( �O�堆_�Ϧ�Q��O%�0��t<`	���\E^#!��`���1��͞��8�u&6r��綔�K@�q=#
��g�5l4�g#
��g�5l4�)�[����b+�/(ZQ�^���Q���K*�D*G�ګ�2rӔ��}*ⅳ�Q��b��Ո�A����屶n�ΟU(���c����OB���łH�TlutBd�RU��=�(5D�@H������J@��C"NEd�p�)#�­̖p3@"�G9U�l�b��h�h IDAT�En�I��iY�TU�^��(*�Z�"�{l�YE�ʵl[�0.@D��4w[�֏�Wv:�l�èH�n�k�h�����?�i@�Ɲ4��(�'1��<=y]1nek�Q>�}zf麄��,��4n�@[*_����<h�Ge�^�0�g����.q̅~�W�.iQ-�Y$�P��7>�H�.2�9���O��_J���?������Q�qx)P��K�n��l����
�F7�q��J'߅Ot��ڝ�@��]����C�a�S��
��Z �o�����C��MT��]1 ������}��R��1�����\`��ݔ��._�Y F���*W��~-T��
��V� �$�	Y�ը���-R]�py"Ú��LkG��v��T�� /�>:_��x6����Sh3cyf�eG_�vh�̘��hˎ���Ъ�1j��/�WUl�BG͝�^�E<Q"�8Q�22w�W�e&��Y�5������h�UӞ.CUs�Ulp��ˆO:���Ѹ�HB�.��X#�TluH��ҭU�^��"|>�b���9�*�R��!"��M.��7f��	����ޣ|{�Ls[N�@����p�v��(�Z5��b�IE��6���Q	�e�6�2��b�QƩR|��sd�زp`��чѡC~����鋍�	���?�v��F���;��9�P�//]I�����g?��6���L�>�B:�����0����gwsR������%���::���n����24w��n.O�m�,���2s��!� �<uSy�^�y݄��/j�T��
��cwĤ�;"�<��2��ҕ]�
�I�����пb�\)�j5n���E�ߤy#���}C3('�q"U^�Χ��EJ���~�К�*�8[ҤZ[���t���\�a��Y����#p@�Ԛ����^S����}nZ����R>��q��������^}�.���U��/7�.X8Yq�����8�{
�4)P��xaXW��WČ��eK�"�'���H�g0�i5L�H�yYѓY�
��n����Fk
�x�v��<�᚛�;E�:��+���cwtiQ�q�gyf��i���U��
�;�^�e1���K�����<��B��+�6t'-H�q�-��Bf����O$� f���Bᣕ�t�x��ƃ�o/3�ru@Y�!��ؑ�Ρ�S>��zd4�#G��I�} ��ƳOm&3�g�d����<���X&-0%_�b�^��̎kD!R�u�t���A�T"��b�n��^Ŗ�ayL͊����e�`����lk��ӂES9���6+�0!G*���&:�4��Zf��3{luH}��JV�Z��J���P�C:u����TtFt�'3��\H���!�
&7H={��v��*����M�:��M�@A�@�_��|�M߳Wl9	����ֆ�eg���UԲUl9	���E
fN�e���
 �?�ĝkYeU�R���S(��BK)H�x��<M�5O%m����J��ϣ��Q�.�	F2�y��<
w�$�ظ��^<!*wz	��M����y�~�K�ॶj�j�
K���Jտ3m
� 4����Ÿ<B��˥�#��}��$(��1���ފj�^~��A>�����m�H�?�.��&�$���Ii^v w0!eJ��@�{��d!9m�]�6B�A
D���iRb�N�[�*�6�:s= ���W%7���$�m�ï$_�I�Ȏ�Y��$4&1�d$�u_�)��k4;}�u|{ƥ�-J��M��Ҫ�m߱��#�3ok����#�5&;���R�5[pS@�N!
�Ưw������rB��MpĊ�u�,�O��6��˄�B��ehZ�\HŚ�l��d��R��^�{��z�d)�@�NbYZ�
 �v�?�ŝ_�p������QW�~����E�4VZ>G�JA+d�u����6�X���Hk�ãgHb����h:46֕���vQ4��+��%7\��qȸ�ۨ�7I~l�1�U��B'7�R��t���Yh:~���4+e�Ac�V�[!MnPZ
f��@��)��Nc�^���|�5�w(;�YZ��6�P���f�y N���_��5O3=^�
��3*�`�*RK��|���Vd'���O(`�(������k<��f2cyHFk<��,�S�Ɍe��� {��bK���ɉu��6���/E�v�B�2sr�W�����~���\�h�(�*bS㶚�/��y*b�ŏ�Bđ�����D��4��J.}�Xt�TD	MkҲ�K̽�z�VJ�d�󇨝��ޞj�b+U����q��|��V�0A�@�HO�,�ߛ��r2Z�C��>Q
dd�/x�v��-'DQ����#���@��Eo�r[Ŗ��k
A�`��ױUly�j5�ϳ�����ͣ�t�v���I���x�	��1GDC���޲����ў�V��:l�R��Ͽ�l
�+���!|�5�����Ow��vȇ�|Ks_����@q�&�������3��'����~�_6����ew0�X�חv�t~tֿu!�����˾
���Ք\w��L\X|_)��:6�N�q���)� @��n����|���vUų�A��������n7�g	�\�OӮ�ھ#Z'���貤��w?�&C� < X\Ȍ۠/�EMpy.��7���\�!�)�
A�k\pd"X��,��F躖�`�Fk(n�O��@X�<���$[�_�\#�Ǽ��:��`��'���:I��}��&d��y��M���Wt��'�d'��=����e-*��~ɥK���d��/�B�J�A�@Q���<*L)�v���r��fe���6�}������"���Nf;�io%,�`�Y�.�\NF���� ɾ�$�9^�y��d��,���x]�Y��&�dz@���u�g^�Lvs�pZ��wש�B���jn�[%�>暊-��X��u^�V��k�u�[N,+#'NE��X�!����UOE<����sf���=��4�����X g�؊�	5bFZ��s�Wl�^�BB�#����Z�V�:M�f�PL�b�p+h� � Ai�u_2W��d��6���K�(߼�E��-'�S�*��(���l[�0.4D��7�Uly�Z5�ͳ�m��7�x�ϷJL�o�A7M2)���<�g��JI�W����:�H��h�^L�0+..����g�M��1zwŧt���*��{�i��,b� ��;���.�/v�԰����k:��_�@Qpܯ-x���$-�v�]	2���>.��b�Wt��"����i��E���kr��_�N$�A��6Z����-���!+pjc�pP�4���F�X\�;���:����)�E��}�a���֔Ao%e.@��ggN7J�f�'������>X�U+3&WK�Z��EaYe�����*�Zυ�ҧ�2���
B(�Sb�����R1� ƀ�9�<�L�z�S��\��B��I*�ʹ�,K�r�B�.�L��^z�k-d�>YS��� �r��{a1ǒ>����3;kN(�ǩgb3�SO`�Ҩ�M��۹\�W�Fװ��X�I�����x^�Y��6�˳@2Z�y�g��Lf,��h��5�xj3��LY ��,?��=��*����^�u�IJr�[Q�wo��*��q]ۯѬ�Z�‘e"�?q��WӀï�|ՋG�Bl��ZC��`iE
���U/�$mj�%�{$
�j�U�],�"KLKOD9����~Gw]���s�|�a��a7ni��镝V�\c�b�
@<t�şt��u�,ڲ&�?������H���*��X�������݅���x�1C�@L�ҳQz�.�;is�$�Pn����k֘�زf�x��v�ۦ�=��G���V����b�
�~M�����Ѵm_j�1)G�H�hWCu蜊��l���5l[V�1�\#D|���>f�ز�g��=u	���b�i�'���}�$V���1�e�nJ-{N�g��v,�a���%����Q�Z۞-��B��:>];9�&r}@�Ŵ��c,0�ț)���=���.��=�b|�M�����+T?�2��bH�|�WJֲk��J���(��X�z�����g�4�:�gVM��ϳ�]�e׳�����Y�.Ͳ��Y�USv��,`�fY�,��)��y�K����,�Ra���=R~��l!�)(�(��B���ţJDQtǩ�D�G]�W��o���t�u-I�fw�vtԤ����P-���u�']�eV����T�B�Z��?/���Ul%����<�Wz����W��tQ��P8�R��Z�Vj,Х��0C��
Wa�p+X� � A����՚��r2��;h��T>"�)���l�e��r�f?D�ԡ!P�_(*�\�V��$�|����V��@ֱ�P��6x0�o�D
/������CG�7�@9�N�����/v7���U�t5�//�L{ A�JW@����ՍW��
�"

�ŗ������G�i�!��'�P|��ۧ�I7�(�II�r��ͳ6������ʷ��_�^r5�'��S�@�S����Gu}]�"��X*Ͱ�
n����0Y�Q��Υ?��ޛοX�@F�Q�AO�]w�R
�:��UӲ�Xf]�Z��ת��'��HC��Mekx�5j�~�Q8�F�R'2r��f{c}��Uk[o��yɐ�y)���OZߎgE�ҵ�Y�h�ɚe��`���,�Fm�)�����'#٘��
w�<��#�l���I8�N���{hY�4�6�:����ໞ�#	�\i��
� ��ʭ_���w�Uu,��K�r ZW�ӳ�g��\Ȣ-_�����|��][�p�`�J�f��׃����-���M��-ˁh��.����	��R%�(�A�-´�v1�L�RK��@5�/��Eƫ!��g����j�"��B��S��%T:��"ąX�}V�Կ|�
�S�s�g'�mJ�n��5�*��%e�@�JX٤}'ْ��ܛ)Cu@x"!����8��(LJ���f�n����
�V�r@���U}'UK�0�)1�q"��|��%���i
����j�iQ(���ex��
� ��`d�	��S��K{Eu����<E�<X���{1`Q��/�,`Y��,`Q��/�,`Y��,`Q��/�,`Y��,`Q��/�,`Y��,`Q��/����v�..5��J���LE�.˺�0�ҹ㉠����b�ֿ��y��fI��g�O�V"���g�?��rS;�5��
�X!�T���rS
`����2F7g���v��S�j�4�d���
���r!��$-M*�)�-���0Iu���e8��7#��}�w�k|�(�?Ѭ�ؼ�&=#38��:������o�����~��LDb��.�'9��VM�I�Y:��j�"���B���q�r�:Y@�V1D>?3�$wb�p);��������/[fn�-'��qG+���5ӵ�(#;P��%���r@��Լ��":�"
QZVZ�_/�f�c�I�������l{l%0b���#-�V}���\��H���������Fv��w������}�l��ޔ �5'Β�|��k�޺gU�h����4�I�r{���� �-
��n4a�9��P��S�[��]z�&q_�q�51}a������N6������>�f-���d6��Ō��O���؇�`�#�d�}��3+�A �� �kvd+�u;��ï����=Y�sɸP�^�������&�S(KZ<��\)��
�¸qb̼�_��1�>��j�e�����L|������ݑ�8�uB-[�ŕ4`�hE�Jg��&�8q�@<DS[>hi��ţ�^��������֮ś,�C�]b�Bj�1�X��R9Z@8~RJ&���N�ֳ3* ����Dg��Od�+Kl�%3�O~� ~9��f�0��qRٌP�8���	��7O2^EH=lp!�Q�E<&�=��g �j#&5@(��V���@L|j��&����ri��FjMv��[�6ȷ�"
Z�{������hL�����]�Y��*�ȳ@���v�gn�Lr �:�8�#�=������u��B�R	�K��"�����=���]{/�t��7��h�ֆ]�5-�Ω�W��}Ja!	�H��]��@OB��S
�E�P�i{ z��(���W��p
�L�	������Z�V*, kY 
�I`�p���p%@gL0Yµ2D^z�|�5�*������vj�т��'�������b�I��H����:�DnZZQ����-'X'A�`��5l[�ZM��,`BY�t�, �5��f�1�,2s�k���%��]$�$�����'^B���]�/	"�q�>���u����ԍm�l���7ͥ��S��I��fL���}�S~i���r�׵�)m����w=t!ul�Z�Y�&~�רlE�WcQ�R
��N�@�+��$��m ,
YJn����*k�@*�+u�T���:r< �">dX%��ʄ�(�������<���$����I��e�K9�R�jxV�cD)|JӨ�� CD~�B{ލ=��q�ɺ52�~x�ޙX^�!MFv�q5��� )
ۺ�C�Gz�8,h�r�#۶��r��qYN��'��Wu&1�g�$���\ՙ�`��P�K<pUg�yHBi\/1e�-S
��bK���$�T0pzb�f�Ͷ)�%�@8�(��@����*�xz���7	�ݴ2"�+�hW}
u�i�T~[�i�kΑ�-�Uk$
�n����C[�Q���R�~��=�(5D>��p�f��Z�V���"��!��B����VfK� 
�#���v���-Gc�1D�Ѯ=�a�Y����[��"QsQD{�0|D�E4���-GX"�
��--�^�Tv�H�U_���]
���ޏ��+&RᠾԫGf��k�b�R
�D�mm�>�����VP��#i��q��*Y�������$YƖ��_r�y�ǫ���BɡC)�w1���3^/y��k�������>l(���$,a���*������ゖ�^5�z�?��(:��0��O�0Vz
��\OXa��T��|I6�V��2O_p
?�p�oo��z�5S7�\܉'����IYI�M;k�7E�_�ؼ��.�ؕ�� `-�Z9�	�G��,ү%+��"�Yr>�V�ߔ|V�
�@F:E �4��ྦྷ�[C����[�a���+��FRs��XB��ճ�<��_�1x`�	�L���,f_�&[�fK=��s�9W�
!wUN�����>p#d��<���
��K ;�7��HZ�b����3�5���U,�K�Ƣ ��yu
� �Q.��d'XJд�]�B�eyRC� ��`I����E &.�&>4�X�����8	��:�ӝȆ�
@~�@̠���R�-Y�E�F}�nXf t!�h%@�,[��Ɇ�d�5Uw�t9�(�~߳��6߳����~߳��6ߔn��OawUl��
��:
�r�[���莊-����*���4%�k������H��]�n�ޚ�p����[��
�'p���q�յ	B����|"���`����_ϴ����^����B����kw�Ѳ�{, K(PHG�!� �;�;L@���Wv���e���r2�7�l��V�=�|��I+�s�
��-'"��7�S�Ω�>A���iE9$�ٚrb^D��P���-���|N$�<�p��o��=��@�aD���'�,0�_~��o�C�BC���;�?�5@������;L,�l�SDTxG��e�w��BP��G��eԸ@��Ӿ��O�m�W�J�IDAT�}DN������N~U[�U)�W�K������\����>qdm+ݺ��ۣ}N_�/.�ދ�B���W�x���/������{]���|M�:~N)��U��El4|��	!� ��1�\��d�S%�!  �@@م�=�Ox���	.z���Uj}�g^-�e��3�� *��>#!�A�R���\=��a7�L��p��c^�����o�5������-C(�e?��qdu����%��ޑ��;�%s��+�
�B�����
~��� $\
.�QT��L�;�X{h��\,��<fP��/G?�(���1O�M�]��a���E��0��2�����e���,(����
��0�a��x�Ki-��(g�xȂ��.�4���ZpLth�XP��d!yPY�r|�H��r��u,�Ѱ�Gl�к��Pf���Pp'����1O�!x!h��R���T�S ,�\�ʁ*��~�w�w[b@b�:fT��[<���������rvv̅��O9��@//��9-
&g���r�_j��Z���yK�o���e�Q�dq!������*p�����c�x��� ����[zֱ��,dE�d������<��d��xHVs����Y`l>����c�"��4��B��f�	%��b�-"�R8�?�[�5��n�D�SIEND�B`�themes/gray/images/icons-small.png000064400000044145151215013520013172 0ustar00�PNG


IHDR���0_ IDATx^�t����=s��JB��rEl���]��M��U�]��Q�^A��HQ��H�5@Bz99���מIHNr������Y�%I�<g�w�{����}��	x@w��w�/*��!o��T�{������.}��<�jzc��T4!�q��,!t�����o:�뛧���)!�*�}a0��YA�^x*�F Zm�����l3���2�����@���N�3��e D�(�.�ػ�a*cx�^�-^��c��1� @XM����y?�
|�@aM3�v�m���?�'��ى=����xyi�-SH��{����q�Y��������&��WGaՁj��>d&Z��[�
W��0Rc%<3�;.铌{�އUj�+�>�i�Mꅑ����#�zS)�'�����+����C5��N���mJ�ʀ�UQ���ۏU���؃X�P��m�p�.��\�;T��Df�����,�z�_�-A�Ŏm�]�mq�bgV���d�N|Q���f�����w��w���9�����Ѷs�x0Bf�|�u�mi#��{��Dj[T-��!ē�6C�NG�"���q�2�� yڊ��*�g"�MT`*���ㆤN����>Ȁ;+猜��0�|x�~���d	�9�	@�&�/���.@�����H�j_�=����!~�^�zׯ�L&Fl����Nf"��8��S�x:J��a��y`��y`�
F��X�*�f�DU	T�LT����Q�m�[�S��d�Ӝ�����y��hh2���;Q\��D�X�5�U<ITnh�`f��ɷq���.��`��l�L�k���Iu�S �T��X��ߦ� �h$����8�D�XAD6a�n뾈�3Ti���`�����@����� �K���'��8���Po�s7��@sc��E����O��F�c��[���Y�C7ש���۸�L����K�Hʝ�36��fj�f�Ѹ:3��r�ū4=h����`�P$}�{�����^�f�s�9Qa�!�i�@��4\a�`B��B��&�B�D�
(ޠBy8�U���!����*�XDY�42*����$�̄�j��j|�YM�S�Ǔ���f1i�
�����cd�$������4W@F�D=�GA�w��J��RS�̹�G������Ϡ;���H�3㋍�Z���Ƭ�`����5-�V�r�d����x�	�3�/>]_��~?�H�
*��ֳ���_ll�����I8o�z�=���َ-��C*f��k:[�����K���~oO�|{@��/��?�%�xu�o(��B���N'���m�n�`��J���c�%c��2|����݁�#+�BgN��@���H�����Ǚ�)x��C(�	��S���ka�UԴ��Uv�o7���yp���*4��� P@���&aeFTX[��տ�3�r:�h,���_0���NQ�L�;G�X+y,�d�*���,g��4�c��/�����"!�D���ҩ�s^d��Ͻ���[���kzQQB�S
y��(�����n�c� p(4�5��FU�
�LU"�)�ܕ�&�y,�b�>ɔ�5HK�@��H��K)��[�PX���̱�y,�f�n	���ߤԥq���X����0;U5�DrWL��y,�-3G�8J��{�ZX�O�Q��ƊM�Gpc��G��-� �](��o�_�	�����ͦf��	�^����S�P?�)m����2֭�;�C�[��	R!rM�hr'�R��C"��^�*PS��0���66S43��䯘l��XF��f���S�ca@@f�:�f���5�2���=0�������8C�ci��h�)R�f�3�+�Q����[��*j��UT��j���-1I���5A�.W14KD�jXn�c����2�z/C��(���0T�j|Ss��c1	�
���v���^@�����2�z!n.ф�c�
\A�m"��K�2�xbM��5�l0��O�3�������ΐ��7���ӹ� ����c// �N/ �}7a��F��
#"5�\A)��6}EsK�w�Vj��(B�!�+}�j��[��HK����Aj�5=��H��/��y�6!ŝ�|,�R��aZ�-��*���yV��BP(�Y�!
&Y%,��Iu�Y�A	��;�B��.��
i-�1�%;�ce�o  L Bޢ�t�T8Fd]D�_���)���o)���2���Ocu�5Œ�����t���^�t��w2�v���D@�ɮ%��p��T�'�d��o>��bM���t>��@�cR��h��~�j�7�6�N��y9�!cs�o�T��7橩���4\K��wA��w��%�`���xpͣxx���|[s��S������M}&k��8@�%�mv`|�q�u
\�#;���� ~-�
�AD���� ����.�����
WE
�OA��`��QF�{B7�d_�>�D9k�U�)�H�*�Ro)ª�HZ
5&*������,�5U�b��`�@��#&���u˸�U_#��m��L/8Q�������a�f�a�<"S�0u�N���0����FO L#�Zݘ@4�U�$�ΜZ���%=atX+���VjW�d��n߁H��.n�V_ݸ�b"BV<�˴?�Ė���h`,�8E�� /�� �f=�I�5�‚`<�D�D�-�]�3��@fI�'�?�EZ\(%Py�]�v淨��j^�k��X8@�����Ϧ|�82ۧi��C����s�̂B���t^���P�-u��	Gj����2�U�_B���u�q���ջ3x�f��22ۧ��_�߮ļ���j5��M��cG�EK�mS�D�~]qϽ�㽷�cz�$9�Z�S�Ǐ��	q1�ƎN����V��t#wڋ�c�n��I����;�'��.*+�j���|
W����_�
��~�|����7�� .ގ~��aİ;�zßj���.�*W�c����LÃ���ͻv�	���ǻ")9��
�=�!_�"�"� 8�A?��U і
�����~'|A/��Ip����dV��F�k"W"N��/�o.�P(�E�"c*�
;��m�r4���f�z��9W�%=vt6({ ��1Bf�;���`,c1��X����z�X��8	�}���C�	�K�~,!�JE�*5gp��挥*�G�y,!�R��e S���d,��Ok���*$JQ���am��)�?��hci `>/Xu
����UQd�':s�!���f����%���B(a?LY]!�q�9�>�;��,� ddA�ET%/���X�G��>j:o L���i��>s?��֛ �܍��?@����`�N�ܑ&���f��}'����쓈ml��q_j.��m*MKi��}�ZVꐲ/�q���/��v�n�4�����4�^uB��4�}nJq�8@�	��j��8��_x�{�lļ���
�|_~�
�����/��}�y<���A|^��)�V2;4�P�0
LV/�?��P+*ASS�P��9r,¿oTi��&B��j{h�s@-,����Ӏ ���5����,E���T)-�"�A,V�P,���M/�k��*���^����)h)��Y&r�[�SP�?o���f�vf�<�䢃:c�h�#��XN��c! 3R���`,c1��X��1X����?�s��A�5&������`P*r�%*��֣�8��P����S�-kV}���Q��*
L�Jw�Q���#�"埽xici�Ke%��
��j7��T��2�( ����E�5�7������A�1��2@�x�\ ���𮝌%&��[�yQy9b_x	��7S�Bx��$��&}W�����/������EP=.(��Ö�kV#�����&ͯ+k>�2ľ�:�?��'i�>�	�~y�N��2
�t�*U��4#;��w^���߃e�DXn��W/x�y��ˣOA�����q��v;Hb"\wMӾ9���O��}_�[��$%%r
��3��4��WN~�6�z��X��֙np�b��@�V���&�U���C�������9�d�Х�	��̀զ���)q0��Ҥ@2A9t490��VU���9��u�!T�>E����V=��ԈH��6SN~����k'fS�������H�ֈ
��=CN��Ř��H��Dc7�c�H�=h���O�ˌ��c��\���sΆ��},��C��J�0�T�dB�H���6��G�c��xM/P�q��^��K���k�50
�ʍL����?�]�X��LP�2�E�r�Vn�},�j�0h�
MM���W�a�E���P�
e�		y���>��󦣬�!^6�J�LIIi�1VS
V^�М� /]�"==7vş��E(�p��\F�������h	PYVZ�Ї�@^�TEZj��WPӄI Y@;w�P����E��/ /��+�ӚBY�C�l5M�
$-43+RU�PK����_��HOk,�!�QS�����ˢ,��D!XY)�KB��w�)��+6֯鄳�p���8 ��k��b��
f2��!
��Pp�Lk�I�mm��x$?f�F���=8�q�)9�ZazT��|��c1��F��a��h؉��hp���q�1��Ϝ@�r���`̾��q�1���
3�H�Ս��Ӄ��ZT��ș�X��0s:���>��`�w�Qs�Z���n�u�
��-��TB�xݰ
V��(Jr���	��D�y5'$�35C���	�\p��g���dž<�3@!h��ސ<�Lf
��Gm�j���G���xkۻ8�>��H��'�>���@QU�U��x)^�6��L�u
��Y�����|��c�d�j�H�ڀ��'�7���?5)�9�.��	y�
��9�3
݅�t��}�%�Y)��m�n��Ë�S��xv���V�?,�K=�y�k�2c2T�������������ڈ�P�)���!aё%���r�ZST	�
�}����u>�6�n�������CqY��XztV�)�����!�JTBH
!�����Ds��o���S�e&���Q��T�0fm%���g�m�&�����l
��r�n��f��X�b�c:cy��u���X�f<9�1����`,c9y�V�c������h,�߉|��N�
�9M���k����+���e�՚�Hˌ��7�P���	�:��d,�l����X�)��f3$�	���"��� ���X��XI����:tjm-�(j��<���< �l�Og,Md�1C��÷ߢ���^��͆�y�S���댥)���v�y���(�4	�m� ��,���7&�=���KS���!U�/F�]w��};D��qhQ+� ��6`zlߎ�����'��8qNh2�AM&UU�(#�M� ���.�|��q�G���v#�m��J8��ri�Jl�HJ�C	i0F�;�@�3�h�,#�+��*I8z����ܩ
Mh���>�	7ߌÃói�&3�}3I��<���2�"G �|���#i�_ʼn;�@ه�b���#\��t�0(�����:��ByX��R�6�Y�bPW�e$�d��� �[Z���*r��LўM����~��Xv�lٔ��AN-��0�f�
�b0����`,�NY��7�����7���
�j�H��-˒S�s��}Ks��ِa��
	�[�QōL�����X>2l:i�y�_��Ú�͍̘�$xe偀&o;��vln`,@DG�륞�Q�%1�;k7T���3�JLq��L��nڠ3���kJ
�y��H��
q: �ox������@��b8�aeLejޔ?6����L���;:�M/�pN�Z��ʰ�ɧ@D�]y�3Ek֪��ܛ7���P^��0j���(߶
|*]���cǰ2�~j��6�
��Ǒ�?����ܛ��h��8j������ؾ#_y	��X���P���=5�#��o��1t�oc�܏Q�u+�>�0�	�xH�L��Éu�������(c/����@�ぷ����#�b��wj$���	p=��?,T���M���ƌ��}�~��eeX?�Y(� �vAٖ��ڽW5��4�a�e��aOO��������!	ݺi#��ɧAQ`mA��U�hP�b�\Y���Э+� j���*&��ݮ�XA$@3Ur��܀55Y���O$@[�)�C���:c�|�l��e�N-�^�n�fܼi��X�b0����`,�����bm}&͞@Z��*���[
js��Ds����i��=�"��a_5��CK��d,�&͞��X�5�x|Z��c�}y*��KT��\�Hc��@^���!
I�Vtm����}���D �CH��`��e,w[u�����#-�Fo�=:&�S�x�#'��{���qfz<��ĉr73K4o��wꌥϤ��K*܎�э~�g�
��2�Y���o��f[!�m,PSm�{����X8@i��q���gO���R\� �f&���E�VT�<A)v��=%j|��9@Υ��o�^���}!��p>zwIƼ�{!+*�`Ӟl�ǫG�8��9m��u�6�)���s{�c��}������'�u_Yt�1C�Я���ZO5>tl�@P��m��e����Ͻ%�~�\Mh:��X��W�h5����n+��MGՔ�FB����)1t�g�W�2��<\T�=���j霙�}G�P\�V�����~"��$ 5���!�6�.���$�Za��TUQ#�2�`(�h+��!M�i#h�Q9w>9��6S4����;�N���u���*��`8�~,�����f0����`,c1��X�<i
�vư�����{����BjV|!I��r�?Zל�t�L�>"P(�dw�7��Z�ѺH���1Qa<� (���{�Bi�)`!��O-���9�0	���Ӓ�����$�l�� `����ɳ�lq�[l2�~t�r��po��h��No�p"z�넮�Y��G*
1���萚��'���Y�,��W�j]?p���1�ܑtA�6���;�Ň� �j��~�y9��ޠ��%�{m��X8@IM���/��罉='��]�z!��wW|�)8Tz�w��ʽմ���c��\:`8]����3�*:�9�|Z��xkŗ0�|�V�?�X���F�����c��r��a���GH�I�'�ǚ��tǺ�W�}!]��@�����LLErL�\�R�PZ[�U�6i#H�M��BKBt�=p,�\kə�{6`��_�BGJl"�z�%��uJ�������4�!m;&g��U�jo�*
b�*���
�4E�}s�V;:&�<�5��U1f��Y�U5 "����oЯ�o�kV�ި]ZT�I=hk3Ec, �?��2��t�o��XN��q}�W�~,g�{���|��4�g��W��]}:w�� ��6�ߐ|��st'jI%暐"U��q��c�>�G!-w�4�R_!���V+lº&�Xv�������<z�����
��!�Ћi��Ս��p"
�率�B-�ǔ�
s�.ڂ���Ԭ�����'C��d�*��-?�3��SrMʾ�n}a��k���8��ON�)1�$x�\���������eǘ��C�Ŏ��W�n�x�Ć+pd?�˿C�aX:����N��H5%��XV�
��+Jq����o.���5�ڃ��n׺�(.'J?~��?��lԮ�Ec�\J��9�s^D͊��`��K��nD���6�ڵ��b\+�o?
k�~H{
��P�H� IDAT��lH)��Z��%}
����RA-V�D��h��P��P�M���$����(��{`!?L���ۻ
�u�T1!���2z���2�X�����	�.=,:���n�b�LI)����R� �Xv@獍)\R�%C���ڲ�ޝ�4E�b�@$�
E���y�T��T�[s�I�u�L�yrmm�hFc�?{Y]?��c{d3�ezʙ��bF���~,c��ˠ<�=0�B���8���:*/��y�RucseRy9ö����|8�Zf,��	�����Ѥ��pDD��|j��ʓ�P��.|q"��݄F$��^l�y��[��4�#�YBp�!y�|@dȔ 7�w�u��@���X'��M�A���$e�z��Gx�@"�-���5�� Y�V�Z�/G��oA,6�7�@h�2�n|$>�Ϟ���G �.��s�Z�u���4��a����C᝻�>�H�x�ޮ�~��6�{	֜Ps� �Ӡx$}{�~�/š�8�5����x$��
�ĻPuiw��4,ɿ�
�P�A��^i��o[
��jm+A������� ^H�e�)VX��i�8����B9����Fp�*�$���*p�zEr*/PHCr��{@y{�%��e�_�ʼzM�tU��A[�)*c��֢���pd׵W:u��0#e��0�Z7��b�x1�7|1�q��3��X� �r|B�	�i/e��X$J�UAE��9#VD��V�Xx;����b_�SG�,�d,ǯ�9���P��������_�I��P��@�' �#
�E`zCS��80��$L0��r"t��M� ��n�|,��8��
���w��q��ܴ�3�IHa*%y���S`��8M{il#��݇?�%-иD$��a��,A��k ft�:v����I��c4��و+J�Άm�xP{,��
ۨ	pϟ��s!fv��\t�&L}	�z��O��Z�_�SO�F�G�;��v����i�HMF�|����v$?����1[����Y�?�<��^��o߃ؾkt���Z/�\����Ёm��X�� ��(��$��!53:�Z[EM]�"c�jm�����;���^�p��.���!�9�!f��R2���x}
��ڪ�@�!�Ֆ�r��4�u-TW
Č�ZGI��d!�,�͓VBA(�*
@HH$s��o'W���U-��p��X�&��f�V�����a��c9�N�S5&�}�00�P�G���%��h��1��Yoq��,��Z���d��)OM��-�},��y@�Ս!�_-�*!t���?#}p�tp�BU�A ��D7z�r��u�
�83 Y��w&70�j
]�fG�Մ���7p�T���S��L1W}�R�Ǣ�p��s�Ǹ>)Q���+q��[�x�Q�<�ő���0���y���k���Q�
C�=Smxpd'��T��goI��,W}���r��G_��_��+���.	�*>X{��Ϯ<�G���jS��Q-��ۯ���M��ߋ����ڀ�����;��Ü%A��-T��#:b���ho%R�W�����8�\��h;�^�lm������
Ę����""%ެeo|t]_���F�8X͗�O�feƢ�hSx�cP�GuFHQ�n�Z�T�Am�d��G�#;���!ެ�	��ߎ⽵E��Q�D��dj�����-QK�:p�*��hqu>Ƴ���ju�;��dP��D�A�):e�W_�Dg,�˳�+����K>��l<�Ϭ���X�s5���\
��`��ir�<���YW+�D����\�V�rO8g�Q|,�o��c��H"A�GAq���r��&>��wx�����B��/��.�H���8^�`KC\�5��G60
@UD�R1�@Dha[��>�PB
B��d�l��܎w��P\Ek�ki�OZ]X��8����̼�i�tƢ�s��L��,���j�u@b3r3�����Y7���[Aշ� P�\bڵ
:�ԖB�9k��P���tj�e����!,]F��zT-�dpj��>jO��_�GW���8�π�w�"���=ܿ�����0w��w�v�����w�Q[��h��5!�
�A�W��s<BE4睔q�����e�G�T�ALv*�BP{��YjM�$@�>�P�z0%�*F������D��4RemHL�!6�*����f���!���:K黽��������12#s�>���9���<[KհT
KհT�n��q&���Fg�;�[ͼ�h2����S��X�<��X ���.�ŗ�b�-�>��j:w�l���='����u6c���c��@�a����m�8+��@X�J`�0 �tn/"���ctƢ�GJ����_��,���=�
�p��J�Ջv��e@��xb`J�]�3
 (;�c-t���c���pE�$L�3���d=��ظ��rq���rR�~����%�=At����ׇ{Kqǒ]�դ��&���'@���7�1�~sgŠy[��X��s�p��������.ȴI���* ���GVp�}(������pEX����w�W�H�<B���n(lw�E�O�qM������Ƈ�;O��Ɒ�0�l
@e��}�Tb��q���C��)	�f�
�HaYk�e�Kq�>E�#i+Sh�猅��-�	@[�)ڢ2�c��ǂw�dCU�c�La0��h*dPC��Ǡ<
O[�L<c�ı3��H�y,T�!o�r;sֽ1�9c3sIZ�yOEB�Zj+@:uݬE2�13�L�A]z�@	<�>��$��@R��Tk�S�ٞ���[Kcnc��2Rb��oPơ���]��u�$�Ȕ���O\�3�zB@�#��8y0.>+S�ٟ���wW#39��PT��*�[�ȥ:c�T��`H��.?�%�0mL��JD���8^�w��?���.�[%��Ǯ��̡(�ޗ�C{�j��$
H�5c��R��Y�+3�_�՞�c"�\�E}2蛷
ӆ]�	��/#���x5��B�]B���jO��g�(v�W�ہ�W��X���;$�"	������u�k��
5%�	�
)�x�D>0J]�rpa�v((wk-v��l?V��~�
B�*Q	@)u��a���k����1	��TbO��5�2��CJs!rE���
�e�~̾c8��co�v���_���E��W��P��|Yx�@zd��&��W�Ԗ�ԵTi��7��
U�
j��	63�fQk+Sw5hu3Ee���/{�J�����$[�Χ��`�����`,��n0��fX(g����;�_�h,�A��^��A�'��b"�\#�RUXιfׁ����䁵�A�D����Pd�u�D2���o^+LS3&�!�Bp�'�!P�v��?n����P
#PT!&Rz:�p!(�Ad
�ۼKg,�� @��E��w���\
��9�=�,��!XVˆՖ7p�.���A���*�N'z�)W]
߁�l6HYY�(¡����UJJ��e��X�T����vs¨K*+E����] ��h#;��;P�n�*����sg$@�1�>�>tz�	Ԯ[
1)�� ;k�b��u�����s�>��J(䠢H;>���X`JIE��Qxw�@�%c5�c.B��P5��G�k�K���לO`JL<Y@!TR16��tm$;��"\Y�������
G̹��Y#XT���t��|
��bׄ+ �:U1&&@�S��i�eWh-���D�<�d��)#q���B�`�D�R�
�pU��l|L�!�� &Q+��/
qF���j�
�n�&�0U�<|�{�(���3�hk3E}P�ަ:c�<𬿘ǂB،A�v��`,c1��3�0�
s�0��^�)2��v����H�>�@H�Xx�{��r�ӣQ�®?���yOE �|�`�Nŏ�7�
�a�t����s<P��i�B^�Wɓ�$K>>�(*�P�/D�'HB}��H <��*Ɍ!�]vÜ������#�%-V{��J����č�\	w���f��n��
�4g:Jk�W�E=x�v��2���,�a�?`��1��jj]T(s9�MBᄡ/Κ1�;&j/�k<A�e����Od��5��ۢL�e(�t~g�x�;,�9��	kl�r��Sᇹ7c��c�t���w�4��xA7\��X5s<�܏s;'c�����d�u����w-���[��[.���1�㡸����~�j���w��Xv��~m���;��3'
���/�'BR��U�B��JX�Хx��m�f��&S���:2�闹��o�;�t%�/��
o����Wa35Z�:Eb�%*o�b�C]\�/T��������^�y���Y�@L\K������,_����g���{0`��j0����`,ci|ܟ!V�i� ��?���kb�'�D�yO��f��Y	�$��˩���%��},<}Y
�!������?�d,�n��$c����|�/w�[����!A�P��Z&�`��-��X�/6�JK+��������C��q�Q8x		��[�<�KrK���Kc��e�z�0|4�6����z��0��%�J&�M"O��+�߫:c��Q\ZI���\,y&�����*$Q/��+qϬO�.-IKC)��5��pYVN��.}�^\|N�/*Ŕ>��ex�1�{G�?���s1Vss�Z���!-��".�U��d�PJX�d6!59���4[9b.�ߑ�O���$�3.��E��bl3
���:%����]��@UTGy��.x�nL��\l9t�?�.��U��;'���?�K6��+���2ЄXYC��u��E2!��e�Z-�����!ғU"4"���@iщr�ۧ+>��6Mp:�T���?��jӳJ��S��+�@QRV��0��ٽ�cÎ#E((8�Ĕ�m(<<����w�*��W�<Pe6��v��UY�y������ �%_���Xү�/��u����!0 ���Ȍ��_5��X�b0���%�9cP��A�'8���{޳�k�U���%����9c	�י��Z�^�VX�[Aa��[�M=wfQ$c	��4Zqb=�%�RÐL&�
*�zI+��HQc�
@ �� &TE��u���M����}Tg,���1�@�s��K@�x6���)
�i:ci �o6e����P��D��{-㚰\˿��%�P��#��C��Y�%"��4�������n��I$�� �]@{A�5X�@��70li�Q�+�i�� igC�6B���]�s"���l��-������@,I�nX�b�jB�"�	�t��#����T�y
��S����5j���V!��������.J�zB8g�%(a��^`ad>W! Ŷ2�@
�I=$&Z��𕃅\Z��֗Q���SBz�0��p��=Y�������&˷L;�3���]�AԿԏ���0O;f0����`,c1��X�<i
�vư�	Sޜ�Z� I�h�R���Y����e��7�k��P*"�����SW.z.��\5�����X��e��^w��Dɚ��'K=O��/�}�Ba�1����0�LT5|�Vh��/�� UUie��qH���xa� �5^�$�!.�
YVS��￸Gg,�#��tӜ�b��4�_��6��-��;k7���A($#>���?|q��X8������-����-�_'Jj`�HHJ�k?o�U���Q��$�"Jʜ�q��M���E�3�\��Y��2͢
�q�����jB�-���;2�%�
163,	q��g��zꥅX�j��*!4�8N�:��ǐA]��jt�c�r�x�`t��C|T�ϑ�
g (S�]€�Y<�+RRb0��g0���1�拐s�(�p#����H�H��&�
jj}|����x��2J&�`X�r�"
@=w�
ÐUS&>l�|11-֋�6Z �9��6S4@F����{t�2q�[�*�:H2�f,�2�`,c1��X�b0������q����n��M��yT!Ԭ���s�[М�t̾5���c�y�j(������ ��tȾE� ��
 ������_�b^ci	��>�(�l2A��r�D&r�Dg,�Z4%(�����M�(j<�NR��0�1j^Ѣ�u�R -*���A�VT�޺߿�(v>����	%���LK�b�x��ş茅��8ZTJ/6>���w=�$�'���?�sw݂�_���뷠sV;UQ�H�/�萞B��8�!���5^z�q��fߊ����f\��$��+�X�%��;:g���o=�=�|�-~[�	v9�{��_\u�$�y����1��qvk�)P>�z�%��J��}�x�ې��l�TT����Âk�9+CU�&S�z@)�'�*ѷk�\6{uC�}Ocp��Z0׊?��}z
�Qk.D���3��jtHO�Y2���ՊU{|~��e�5��dk"��`ᰢEr���j��K����� ���u��q�m�*ӂ<{G��L�
c3��|l0����`,c1��X�r�2��_��4����tž:����_�Σ���%E��gΙp���e���X�<%�%�������7����e�l�u��ۤV��5G=c����'���s�F��j���"�T��ff�Mȿ2oW�ZaM԰RL&��O�ٞ�����[�
b�F�@)�|�ֺZaM��1Y�����q��{Puhl�Y�oL�%�Լsr���
k� ���ToGy��{P��k�c;���_4eK]��()=�Cb�1�88��@Ɏw`�=�f�umS�#c��AE+Jv�W��0Y�Om�P�J<燛�|)��К���
���n��~j���;����(�S�?w��Za��&z��|;��6c��-c1��X�b0����`,g*cٟ�mZ��U7V�RUr.-+l�X�eum5*L"ժ�Y�\a�eM�X�gv���!)J!�B�./�	�!91��?��xci	��&�e%`�l^��.<A�dJHn�Gt�
�W9CLKA�W_�v�?�=����}���^tXg,�T�,@��?�6l�r�?�(�_|
1%Y�ث�@g,�(E����}2�q��i3
��y=���z�Z#�XX�RY�Ϋ��v�?4��X��ɷ��y�^S�|��;j:���ϧ�ﯫP4i
h\,�(F �H����t�}
��D���P��#�R�@,��hSP**iܤ����:��6oE��1�?��bn
p��i���w�x~Y�7�
����,�Pq�+�X(Dͽ{�+����6;��vZ��&W�2��+��~����:z<b�+���
�G��.:�3��f���Sb,�ѳ�X�b0����`,c1˙�X�Ǖr�o������}x��H�3�U��j<���S� �77���&��l�яG�?C�o_=�u2���<���1�r}pL`dT�#
��H��U��ix	���f#`x�X�7F���/^rj�nj�]��!�i�=H5�:��N��mw�:�d�a� ���w&�ۧ
�Xy�@��� 儱W�J,�/�	�W>`z��S��['W ��-�ɵ�d(�G6�9aB�B��+'��#i����]�jl�!�2��_��L)w���0��nj���x�$�)N�ŏ�!���3
c
gL�����#c5���DhB�5�P�3F�.��
�Ս���Dj�Ն$�3��δ
�},�.�juc�D�
�U�j��{��Ȩ�G�>�y�+q�L�/����J��oBm�K&�����|,M�jd�@P��YIIDAT�CVC��jo1�$Q�pˣ¨ �>?q��ci��bdϛ1����ҫ��x`�7X�g6��
�6�=S��L�J��R�2���Ux��%)~<��*P<4v>,&;f���s"���e\?3n��c�`L�5�R��^�jo^]9���/|��ŗ ޚ����WJ�w��=�/6=�
G���p�t�
7
~�>�U?G�-�%�:��d\w�#���DZ��|-M}p�q�i��j�SX{�$��E�2���iS��ⵕ�5<��w����/�Dk:x)�2P�B=�<~���^���D(���̃]J��?_�Xsr�2��N.�=���3��=z�"���m,�>�{���'zCNd�u�?��Å���A�͉u���Uv�&�i~%����8FA������̸���х��y{%v�Qa�3����O&��\��匱PN�t�h,�A8�^��,��	u��Q�$s�O�*�rΰ��6g,��zuc���/�[�y?��&y,��LG�<��'�$�s�%�L��poc�h�]_e-�J��(�Yo��� �pS�w��y��&�y����♢�y)���p�:hb&����ߥ�0�4&	,�͠�I�,���@%��ܴY�t��g��v�T�?J����9�K�Z�8K!��ju1<?��
)#��R�eصTl�R�� �X��t�
��!��RqBjGx��
IY�L����>��AW¿n�/�Mh�:mjޟ�n�M��T�?
�ݫڻR�ڍ�?�W��D�-��WU!��X��R;R�E9Pݕ���P]� f�A���D�R�[���#ͅAp�������<�
`>�d�ǫ��H���(������Z8�'���66S��i�o�K�}gg��)���{6#}�v����`,c9y��a�����?5�����s�"��	P�2Ht��W�ϓ��������Z�{A�����T|�B����>�8�)|��m��}�mFA~�Y���6[�1��F=�9��8�b�t`V:���Y\��,
V����(dP1��_���<�����
�K`2�����8VR	$�� Z�v1�,/������M"��k\� R��1�k��O�9V��6LI��������8P�W
9�(b��U4ln��l�7|�uU��j�5��9ݳ��nüu۴aϘx1\��_�
�J�eu��}��G�E�`�>,]��3�¸xi�F��HI�g�flGN��e��6>���$��ݯ�=^�a�{���ʃ�����CIB(��@Ғ`�Yp�D�t�ۼ��k��/�
J��������Z&I0��:�kR<��8�?�BZh�Ey���֊T���r�T�� ��TG˦!|9�<�FBlc3E=4X>^�Og,x`V6�<v����X��t��X�b0�����!k�6���ۧa��X��lх�j-��yq!�ZWX*�
���)�l^���(���&�V�҆F�bD".�BA���
Q(�[эmw���(�JA��\�i�HqcZl�mR��%M�yrsE��謇3s߽o����O�{�%lX��y�Fȱg���
2�0y�O?I���Gm�b���3[\�'|cg8��t�7c� :��k�<⽒Hi27��P�lů"񿅍�由ޠV��Q�yz��)�{	����pe��e�Qg(��E�ݟ3���_�P;̌A�z�1�!�ޅ
	��XV����
��0�����r�uB�eX|
ٳ�.�cM@m9C�!y���<sK�^��h�Bn
/|��7az*K;�����g�:	�NAq�	��P)o��
����+o`�n���k���&!H�.�@t?,=�Ҕ��nP�J&� �m�i\D���ɐ82���69e`�����A��v�����Tz�����fD��:b�#�  �-��id��҂!�o35��9i'�U�b%�T�\�šl����y�%'5���h�e�.m�IEND�B`�themes/dark/icons/material.eot000064400000057200151215013520012373 0ustar00�^�]�LPd!ԗmaterialRegularVersion 1.0material�pGSUB �%z�TOS/2> I�PVcmap���\cvt �Q� fpgm���YQ�pgaspQ�glyf3Qk@�head��H�6hhea<�H�$hmtxg`H�plocaRJ\�maxp��K namew��K8�post��N�prep�A+�]P�
0>DFLTlatnliga��z��z��1PfEd@��ZR�jZR�,,
��Z�����	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[T[������������������	�	�	
�
�
����
�
�
������������������������������������ � � !�!�!"�"�"#�#�#$�$�$%�%�%&�&�&'�'�'(�(�()�)�)*�*�*+�+�+,�,�,-�-�-.�.�./�/�/0�0�01�1�12�2�23�3�34�4�45�5�56�6�67�7�78�8�89�9�9:�:�:;�;�;<�<�<=�=�=>�>�>?�?�?@�@�@A�A�AB�B�BC�C�CD�D�DE�E�EF�F�FG�G�GH�H�HI�I�IJ�J�JK�K�KL�L�LM�M�MN�N�NO�O�OP�P�PQ�Q�QR�R�RS�S�ST�T�TU�U�UV�V�VW�W�WX�X�XY�Y�YZ�Z�Z[����
%@"Eoof

+5333	3���}�_�_}��Mw����-�(@%GEDRVJ+!7'	7'!-�%�8��86����7���6�-�'@$GEDRVJ+!!�6�#��89�7�P�68-�@Ef+%#'	'R�8899�&��89��8���@oof%5 +#"3!2654&#!��#11#�#11#���1"�"11"�"1��k�GK�PX@#cmnTWK@"omnTWKY@
	+%!"&546;!2!!�!//!�O!.�fU�Z*#/!�!/P.!�w:��!�j��GK�	PX@(ec`TYMK�
PX@0mkk`TYM@*mk`TYMYY@!	+!2#7#54.#33!'!"&=3b=r��s4�;�s5M=��sgK����5(��5K���ZK�PX@c_RXL@o_RXLY@
+%!!5!'#"3!2654&A�f���S�#11#�#11d�SS1"�"11"�"1���K�
PX@-oec	^RYM@/omk	^RYMY@	
+!'#"3!2654&##5#53533A��S�#11#�#11L}T}}T}XS1"�"11"�"1��}}S}}��A���GK�
PX@0	ome
^RYM@1	omm
^RYMY@+3'%!#!"&5465##33535���M�1"�"11�S}}S}��?��#11#�#1��}}S}}S��9�	^K�PX@$cmnRWK@#omnRWKY@	2+73!265!%#'##!�6&r'5��Z�.�-��'56&,�..\����	
H@EG^^RXL




		3	+#!"&'!535'7��1 ��!1�hu^u�Y������	 ++ �X�n��ů�Ջ������)2O@LGm``TXL10-, 
	))	+"#7#47>2#"'3276764'&'&4&"260aSQ01w��w&%�@?%&&%?@KSM8-p=aTP/11/QS/B./A/�1/QS`��L@?J&%?@�@?%&48$%1/QR�SP/0��!./@/.��\�>@;m^^RXL		 +!"3!!"3!2656&!!��:,K�p�`,,�,, �`��,��M,��,,,������"+4=B�@�?@
	
GA"Fm
	
	m		km`
``
T
XL>>65-,$#>B>B:95=6=10,4-4('#+$+$%+654."327&#"2>54'735"&462"&462"&4625�-MZM--M-'bb(-M--MZM-b$}�e"11E00#"11E00�

�S$(-M--MZM-bb-MZM--M-'b��*�1E00E1�1E00E18

��S#*��J�&N@K`
	^^RXL&%$#"! 
+#."#"3!2654&!2"&46!3!53��:J:�,,,.�� ��K|K�!**!,��,,].  �T_ss�����-+���\����-��*5���V�'5CK�@1
	=G"FK�
PX@N	e
		
ee^	
	^

```RXLK�PX@H	e
		
e^	
	^

```RXLK�PX@N	e
		
ee^	
	^

```RXL@P		m
		
me^	
	^

```RXLYYY@KIFDA?;8530/,*)(''#3%6+'&+54/&#!";3!2654!;!5!2653;;2656&+"32+Rs4s�����jI
Y��KYv


�sr��\�y^\
��\�[
��Q����%.26s@p#G	`
^^
^TXL33&&363654210/&.&.-,+*)(%$!#!"!%!+32+327;5#"&=3#546;5#"&#!5!5!53#%35�SSS0$$/SS��SS/$$0����M�}}�6��S�S!!S*�*S!!�)��S�SS��TT����@
Gof+73'64/&"27S��2l&
U�*j��(&
lU�+�z,I@FG``TXL! '& ,!,
		+"27>7.'&".4>2"2654.�]UR}  }RU�UR}  }RU]3W44WfW44W35BbB5y$#�SS�#$$#�SS�#$�'4WfW44WfW415 1BB1 5��J�
#@ Eooof+%!3	3!!`&��������R�&X���xb��L�
3@0GooRVJ

+#!#!5L���X����&���bbb����-1G@D`^^	T	XL10/.$#--
+%35#"276764'&'&"'&'&47676235#�TT*ra^7997^a�b^7998^aqZNK,..,KN�NK,..,KN�TT��w97^a�a^7998^a�a^89�.,KN�NK,..,KN�NK,.�S���� A@>Gmk^RXL  83+'.#!"3!2656##5#7!�A
��	A6&�'5�^����?&,,�MM��'76&C��\\�..���� ?@<Gmn^RVJ  83+'.#!"3!2656'35337!�A
��	A6&�'5�^������&,,�MM��'76&C��\\E..��#'+/l@i	
^
^RVJ,,,/,/.-+*)('&%$#"! +35#35#35#35#'35#33535#35#35#35#35#35S����ۯ�ݯ�ݯ�ݯ,���m��ۯ�ݯ�ۯ���w�����+����w��v������������A@>
^^	R	VJ
+735#35#35#!5!!5!!5S������L��L��L��F�(�F�F��������-N_@\		m		k
``^TXL/.CB6532.N/N$#--
+%35#"276764'&'&"'&'&476762"34623476767654.�TT*qa^8998^a�a^8998^aqZNK,..,KN�NK,..,KNZ-M-T1D1

T 
-MdSH98^a�a^8998^a�a^89�.,KN�NK,..,KN�NK,.G-M-#11##$-M-����!%48<@IMQ�@
10GK�PX@s

em-e&%$#"		^('

^)^+*^,^/!.R/!.Y M@u


mm-m&%$#"		^('

^)^+*^,^/!.R/!.Y MY@NNJJAA==9955&&""

		NQNQPOJMJMLKAIAIFDCB=@=@?>9<9<;:585876&4&432/-*)('"%"%$#!! 

		
0+"353533533533533354&#35!353#;57335!3535#326=35335�"2T)TSSTSST)T1#�T�T�����2"��T��T�TTTT))#1�5TSS�1#))TTTTTTTT))#1�SSSS)T��"2��N}TTTT�SS�)T2"))TTTT�.,>@;
`^TX	L'%$",,!%!#+4>;5#";5#".!5!%#32+32>4.�#;#��9`88`9��#;#�N��w��#<##<#��9`88`^#;#O8_r_8O#;T�O#;F;#O8_r_8����)>@;GD`TXL$#)))+%#'6765.'&"32677%".4>2�%
#SFH�IF)++)FIT9h)�G��;b::cub9:c�*268T�)++)FI�HF**'$
%�G�:btc::buc9��a�
!k@h	GEDop^	^		R		V
	J!! 

	+7/##3#'3/#55#5!3�����t _}z�d�\
�¯&��{���Ƅ��n��j�U((((��4M6��M��R� &+@(E"Dof%$+'5.4>7&'67'767#��V�())(�W>d::d>�
:>�cH?2q>>	Z7Ȉ
bKN�MKa
Z
Jp�oJ
�,bI?,@��Z8?#a>QZ6��R�*$@!E"!
	Dof+'36#7&5&'55>764'.>>	ZX
:>$$L_<0���>ee>V�())(��?QZ7�bI>6�9Z
$ S��ĭ
J79�87J
Z
bKN�MKa����'F@C
o	oT^XL!
	'&+2+32!!+"&5!5!46;5#"&5463�#11#�)$�����$)�"22"�1#�`"2SSSS2"�#1���!.*@'#G`TXL/*+6'&'.7676%67676.'.�76]`�b_9;76]`�b`9;�/.LNZ9h)�%!"~�!"/-LN[9hVqb`9;76]`�b`9;76]`[MK*,'!�6+h��+j9[MK*,'��A�/@,GpTVJ
+!"3!2654&3'�"11"�"11���hh�1#�f#11#�#1T��??����@

	Df+%73%'}��7#�6��Ĕ���.S�wN��q�S�k��f����"@Gof
+"276764'&'&'7�ra^7997^b�a^8998^a��;�<;�97^a�a^8998^a�b^79���:�=:�s2@/^^RVJ+7!5!5!5!5!5SB��B��BI\�\�\\��@of+%3#3#!3y�����L�~��~��~����H@E
mk	^RVJ
+7#!5#3535!#!#33�w*�ww���˳*w��w��w��w�5w*w�*����C@@	op
^RVJ
+733!#!#3535!5#!5S�v�ִ�*vdw���ww*q�*ew*���ve���w��-�@GEof4+773#!"&-*��+�:���.3$��$4�K0KMl<��
���$44����0@-GE`TXL)!%#+
532#!!276764'&'&+w��$�4V11V4� �`RQ/00/QR`����}1VhV2�00PS�SP/0����0@-GE`TXL%!)!+#"3!5!".4>;%q�`SP0000PS`�!5V11V5�$�}0/QR�SP/1�1VjU1}�����GT7@4$?2GooofIHONHTIT97+654&57>/.&/.+"'&?;26?676?6&'".4>2*XSh*�#$hSZXSh*�#$hS�n(C''CPC''C6
E�*l

n*�DD�*n	
n*�$'CPC''CPC'��>@;Go^RXL	+%5#535!'#"3!2654&G���)��S�#11#�#11d}�}�$S1"�"11"�"1����!%)-159=AJSW[_�K�PX@v

e9#8  e.-,+*		^10/

^432^765 ^<);':%!R<);':%!W(&$"K@x


m9#8  m.-,+*		^10/

^432^765 ^<);':%!R<);':%!W(&$"KY@�\\XXTTKKBB>>::6622..**&&""

		\_\_^]X[X[ZYTWTWVUKSKSPNMLBJBJIHGE>A>A@?:=:=<;696987252543.1.10/*-*-,+&)&)('"%"%$#!! 

		
=+"353533533533533354&#353!5335353!5335353!5335;5#5!#326=35335335�"2T)TSSTSST)T1#�T}�}T��T}�}T��T}�}T��2"))�))#1��SSTSS�1#))TTTTTTTT))#1�SSSSSS�TTTTTT�SSSSSS�)"2T))T2"))TTTTTT����#'+/3�K�
PX@>e	e
^^
R
YM@@m	m
^^
R
YMY@'3210/.-,+*)('&%$" #!"+46;##%#5#53253+5!533#"&3#3#3#%3#S2"}}TBT}}#1TT1#}��T}}"2N�����TT�TT�#1T}}}}T1�C}}"2T}}T2T�fT�����;�@�opR	^	
	
^^^
^R

^VJ;:9876543210/.-,+*)('&%$#"! +33533533533#3#3#3##5##5##5##5#535#535#535#53�\[\\[\\d\\\\\\\\[\\[\d\\\\\\\\�\\\\\\\\[\\[\\d\\\\\\\\[\\[\d��3�",1T@Q`		^
`RXL.-
	0/-1.1,+'&	"
"
+%264&"#54."#"3!265.%4>2#!!�!..B..(5[l[5'!//!� //�w!8D8!�i�%݃/A//B.gO5[66[5O/!�u!//!�!/O"8!!8"O�#��u��3�",C@@``	T	XL)($#""

+#54."#"3!265."&462#54>2�(5[l[5'!//!� //��!..B..Z�!8D8!�O5[66[5O/!�u!//!�!/��/A//B.gO"8!!8"��3�*/[@Xm`		^
`RXL,+
	.-+/,/%"	*
*
+%264&"#54."34>2!"3!265.!!�!..B..(5[l[5K!8D8!��!//!� // �%݃/A//B.gO5[66[5"8!!8"O/!�u!//!�!/�#��u��
@E
Df+	>3����p'X��uE� ���zr�����=@:

^^	R	VJ+#535#53#535#53#53#53������������������C���������������-+'			7�T����TN��TMMT���T��NT����TN��TM����)@&opRVJ+!#!5!3!���v��evg"��evg���4@1GEpTXL
+"'!'>327.'&PJG9�o�+k;F~[`wQT�3����%(:fAU�%&��@RVJ+!5!���B$v����(�K�PX@8oo
	e
^TVJ@9oo
	m
^TVJY@2! %$ (!(

	+!!3353353353353353!%2"&46�TBT�B�)**)**)**)*�6\$$4%$�����$STTTTTTTTTT}}$6#$4%��A�8Tm�p@mD9_UznGF`{F
```	`		T		X	L��usgf[ZNM@>*)88+"32>7654'.2"'&'&'&=4767>32676?"'.'&5 76?"&'&'&532676?"&'&'&5�}b2## +ez?r^##\r?640$

#dm40$

#d�	b}?r.	
&#03p30E
_^


%#brb#
b}?r.	
'#brb#
�('(�,# &''&�,#&T		

	
		

	�	(	7
				 
o''6


p(6

����@
	-+%''%5'
7'77'���^�����_���M���{}}8<��<�������&�����������A@>G	F
DooRVJ+%!!7�����
����������1'����E���Z'Aq@n$ ?,	Gm
mkkm	`TXL)(><9852(A)A#!''+"&#";'&5467>32632."3!264&#4.#". 7^ !%=#'5=,S2'3M,)H6VB(D(&3=+�&44& 7 CZ;/$>$
;),<+F+H)!2S0�(D(:'+=5J4!6 
 '��%gqz�i@fMB�oUF)�2G5Foooo
	`TXLsrihwvrzszmlhqiqKJ?>43"&+&'&'.'&'&#";767>/.7&'.=46266?>&67667676%"2674&3"264&676&'&�75M
03A?56

((0
|N�<S*i@1-
+^=$1!@)-10%f+	

-�'%8%%�''8'(OmD%#	7#&#%<	V`.IYF6~�=
.4.7!�T
*,'	

;	&�&7$#&&6%$5(
7!
����5J@Gmk`^RXL0/,+)(
	+"276764'&'&#537#54?>54&"#4>2�ra^7997^a�b^7998^aGTTU%	
T04
0E1T-MZM-�97^a�a^7998^a�a^89�;T�%,B54#00#-M--M-1����`@]	
GEDoom	n
R
VJ
+353'3#5535'#3'##7#��s��s(r��s�rr��s��s�r���s��s�K�s�sMr������
A@>
G^`TXL5 +!"3!265".4>2!5!��%76&�'5�a&@&&@L@&&@f�/��6&�x'76&,��&@L@%%@L@&ѹ���"�%D@A
GED`TXL+7'"7&5&>#552767654�RGD()08<i=8=i=��RGD()Ar��s)(DGRZF819<h=C819=i=r��s)(DGRY����7@4^^RXL
+"276764'&'&#535#53�ra^7997^a�b^7998^aGTTTT�97^a�a^7998^a�a^89���SS�����-+'	7�d�`�b���b�_�_b?�����-+	Vb<��b��b����b�����	"@Gof		+'!'�_��������_��_��������
�-+'%'77Z�v;bv��[��v�;�w��v��;v���:w�;�v���� (@% Gof
+2"'&'&47676'77'7�ra^7997^a�a^7997^a��:��:��:���97^a�a^7997^a�a^79і�:��:��:������3@0GmnRVJ+35!333535�)�`)S�B�^MTT��ST��T���-+%'	'\�C	9C��E��9C���@Df+'#'�"K�h�IC"I�z���K���@Ef+	737���H�h�I���I���z�K�G@of1+&#!"27654��&m.l9-��o�G@of6+%4'&"3!26���.��
��o��+��s�	"@of		+###s^B^��_�_B�_�_B����"@Gof
+"276764'&'&77�qa^8998^a�a^8998^aq��<��<�98^a�a^8998^a�a^89��<��<��J� ;@8EDopRXL  +67676=#5"&463121�-,MOaaOM,-��K%���ha_CDDC_ah�i��(����
,@)
Eo^RVJ+#53#53!KKKK�9B�_���K������@of+	&"27654��,.m�l�&m����
@of+	62"'&4m,.���l�&m.����&/8Ah@e
m
kp`	T	XL:910('>=9A:A540818,+'/(/#"&&
+"3264'&46;2>56'&'&"&4627"&4623"&462"&462�qa^8998^aq))Q>k?97^a��))8))m((8)'�))8((m))8)(�98^a�a^89)76)>k>eWU13�_)9()8)�)8))9()8)(9)�)8))8)����*-@*GooTXL"!+#3"'&'&5467'2767654'&"\\�C8 ,,IL�KI+,?8AD&(98^a�a^89(&��1kC.@BJXLI,,,,ILXK�,C;QT]qa^8998^aq]TQ��!d_<����m{��m{���R�j��\��������������������������������������������������������������������������������������������*V���(�v�>�V
n��:h�6�		Z	�
&
�b�
4
�
�B��Z��P����J���^��Bf��������p�$p����>r����B��,R� E\�z�s/p�55=DLT_
+g�	j�			-	=	M	c	
Vs	&�Copyright (C) 2017 by original authors @ fontello.commaterialRegularmaterialmaterialVersion 1.0materialGenerated by svg2ttf from Fontello project.http://fontello.comCopyright (C) 2017 by original authors @ fontello.commaterialRegularmaterialmaterialVersion 1.0materialGenerated by svg2ttf from Fontello project.http://fontello.com
\	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]homebackforwardupdiropendirreloadopenmkdirmkfilermtrashrestorecopycutpastegetfile	duplicaterenameedit	quicklookuploaddownloadinfoextractarchiveview	view-listhelpresizelinksearchsortrotate-rrotate-lnetmount
netunmountplaceschmodacceptmenucolwidth
fullscreenunfullscreenemptyundoredo
preferencemkdirin	selectall
selectnoneselectinvertlockpermsunlockedsymlink	resizablecloseplusreturnminushddsqldropboxgoogledriveonedriveboxhelp-circlemovesaveloadinginfo-circleprevnext
ql-fullscreenql-fullscreen-offclose-circlepincheckarrowthick-1-sarrowthick-1-n
caret-downcaret-upmenu-resizearrow-circletn-error
warning-alertcaret-right
caret-leftthemelogout��R�jR�j�, �UXEY  K�QK�SZX�4�(Y`f �UX�%a�cc#b!!�Y�C#D�C`B-�,� `f-�, d ��P�&Z�(
CEcER[X!#!�X �PPX!�@Y �8PX!�8YY �
CEcEad�(PX!�
CEcE �0PX!�0Y ��PX f ��a �
PX` � PX!�
` �6PX!�6``YYY�+YY#�PXeYY-�, E �%ad �CPX�#B�#B!!Y�`-�,#!#! d�bB �#B�
CEc�
C�`Ec�*! �C � ��+�0%�&QX`PaRYX#Y! �@SX�+!�@Y#�PXeY-�,�C+�C`B-�,�#B# �#Ba�bf�c�`�*-�,  E �Cc�b �PX�@`Yf�c`D�`-�,�CEB*!�C`B-�	,�C#D�C`B-�
,  E �+#�C�%` E�#a d � PX!��0PX� �@YY#�PXeY�%#aDD�`-�,  E �+#�C�%` E�#a d�$PX��@Y#�PXeY�%#aDD�`-�, �#B�
EX!#!Y*!-�
,�E�daD-�,�`  �CJ�PX �#BY�
CJ�RX �
#BY-�, �bf�c �c�#a�C` �` �#B#-�,KTX�dDY$�
e#x-�,KQXKSX�dDY!Y$�e#x-�,�CUX�C�aB�+Y�C�%B�%B�
%B�# �%PX�C`�%B�� �#a�*!#�a �#a�*!�C`�%B�%a�*!Y�CG�
CG`�b �PX�@`Yf�c �Cc�b �PX�@`Yf�c`�#D�C�>�C`B-�,�ETX�#B E�#B�
#�`B `�a�BB�`�+�r+"Y-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�	+-�,�
+�ETX�#B E�#B�
#�`B `�a�BB�`�+�r+"Y-�,�+-� ,�+-�!,�+-�",�+-�#,�+-�$,�+-�%,�+-�&,�+-�',�+-�(,�	+-�), <�`-�*, `�` C#�`C�%a�`�)*!-�+,�*+�**-�,,  G  �Cc�b �PX�@`Yf�c`#a8# �UX G  �Cc�b �PX�@`Yf�c`#a8!Y-�-,�ETX��,*�0"Y-�.,�
+�ETX��,*�0"Y-�/, 5�`-�0,�Ec�b �PX�@`Yf�c�+�Cc�b �PX�@`Yf�c�+��D>#8�/*-�1, < G �Cc�b �PX�@`Yf�c`�Ca8-�2,.<-�3, < G �Cc�b �PX�@`Yf�c`�Ca�Cc8-�4,�% . G�#B�%I��G#G#a Xb!Y�#B�3*-�5,��%�%G#G#a�	C+e�.#  <�8-�6,��%�% .G#G#a �#B�	C+ �`PX �@QX�  �&YBB# �C �#G#G#a#F`�C�b �PX�@`Yf�c` �+ ��a �C`d#�CadPX�Ca�C`Y�%�b �PX�@`Yf�ca#  �&#Fa8#�CF�%�CG#G#a` �C�b �PX�@`Yf�c`# �+#�C`�+�%a�%�b �PX�@`Yf�c�&a �%`d#�%`dPX!#!Y#  �&#Fa8Y-�7,�   �& .G#G#a#<8-�8,� �#B   F#G�+#a8-�9,��%�%G#G#a�TX. <#!�%�%G#G#a �%�%G#G#a�%�%I�%a�cc# Xb!Yc�b �PX�@`Yf�c`#.#  <�8#!Y-�:,� �C .G#G#a `� `f�b �PX�@`Yf�c#  <�8-�;,# .F�%FRX <Y.�++-�<,# .F�%FPX <Y.�++-�=,# .F�%FRX <Y# .F�%FPX <Y.�++-�>,�5+# .F�%FRX <Y.�++-�?,�6+�  <�#B�8# .F�%FRX <Y.�++�C.�++-�@,��%�& .G#G#a�	C+# < .#8�++-�A,�%B��%�% .G#G#a �#B�	C+ �`PX �@QX�  �&YBB# G�C�b �PX�@`Yf�c` �+ ��a �C`d#�CadPX�Ca�C`Y�%�b �PX�@`Yf�ca�%Fa8# <#8!  F#G�+#a8!Y�++-�B,�5+.�++-�C,�6+!#  <�#B#8�++�C.�++-�D,� G�#B�.�1*-�E,� G�#B�.�1*-�F,��2*-�G,�4*-�H,�E# . F�#a8�++-�I,�#B�H+-�J,�A+-�K,�A+-�L,�A+-�M,�A+-�N,�B+-�O,�B+-�P,�B+-�Q,�B+-�R,�>+-�S,�>+-�T,�>+-�U,�>+-�V,�@+-�W,�@+-�X,�@+-�Y,�@+-�Z,�C+-�[,�C+-�\,�C+-�],�C+-�^,�?+-�_,�?+-�`,�?+-�a,�?+-�b,�7+.�++-�c,�7+�;+-�d,�7+�<+-�e,��7+�=+-�f,�8+.�++-�g,�8+�;+-�h,�8+�<+-�i,�8+�=+-�j,�9+.�++-�k,�9+�;+-�l,�9+�<+-�m,�9+�=+-�n,�:+.�++-�o,�:+�;+-�p,�:+�<+-�q,�:+�=+-�r,�	EX!#!YB+�e�$Px�0-K��RX��Y��cp�B�*�B�
*�B�*�B��	*�B�@	*�D�$�QX�@�X�dD�&�QX��@�cTX�DYYYY�*������Dthemes/dark/icons/material.svg000064400000062130151215013520012401 0ustar00<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg">
<defs>
<font id="material" horiz-adv-x="1000" >
<font-face font-family="material" font-weight="400" font-stretch="normal" units-per-em="1000" ascent="850" descent="-150" />
<missing-glyph horiz-adv-x="1000" />
<glyph glyph-name="home" unicode="&#xe800;" d="M417-4v250h166v-250h209v333h125l-417 375-417-375h125v-333h209z" horiz-adv-x="1000" />

<glyph glyph-name="back" unicode="&#xe801;" d="M813 390h-475l218 218-56 55-312-313 312-312 54 54-219 218h478v80z" horiz-adv-x="1000" />

<glyph glyph-name="forward" unicode="&#xe802;" d="M500 663l-54-55 219-218h-477v-80h475l-219-218 56-54 313 312-313 313z" horiz-adv-x="1000" />

<glyph glyph-name="up" unicode="&#xe803;" d="M540 38h-82v472l-214-216-56 56 312 313 313-313-57-56-216 216v-472z" horiz-adv-x="1000" />

<glyph glyph-name="dir" unicode="&#xe804;" d="M417 683h-250c-46 0-84-37-84-83l0-500c0-46 38-83 84-83h666c46 0 84 37 84 83v417c0 46-38 83-84 83h-333l-83 83z" horiz-adv-x="1000" />

<glyph glyph-name="opendir" unicode="&#xe805;" d="M752 35h-589c-44 0-80 36-80 80v470c0 44 36 80 80 80h235l79-80h273c44 0 79-35 79-79l0 0h-666v-393l85 314h669l-90-333c-8-34-39-59-75-59z" horiz-adv-x="1000" />

<glyph glyph-name="reload" unicode="&#xe806;" d="M354 615l61-75h275c20 0 37-17 37-38v-189h-114l152-190 152 190h-115v189c0 63-52 115-114 115l-334-2 0 0z m-119-38l-152-189h115v-190c0-63 52-115 115-115h333l-61 75h-275c-20 0-37 17-37 38v189h115l-153 192z" horiz-adv-x="1000" />

<glyph glyph-name="open" unicode="&#xe807;" d="M833 100h-666v417h666m0 83h-333l-83 83h-250c-46 0-84-37-84-83v-500c0-46 38-83 84-83h666c46 0 84 37 84 83v417c0 46-38 83-84 83z" horiz-adv-x="1000" />

<glyph glyph-name="mkdir" unicode="&#xe808;" d="M833 600h-333l-83 83h-250c-46 0-84-37-84-83l0-500c0-46 38-83 84-83h666c46 0 84 37 84 83v417c0 46-38 83-84 83z m-41-333h-125v-125h-84v125h-125v83h125v125h84v-125h125v-83z" horiz-adv-x="1000" />

<glyph glyph-name="mkfile" unicode="&#xe809;" d="M542 475h229l-229 229v-229m-292 292h333l250-250v-500c0-46-37-84-83-84h-500c-46 0-83 38-83 84v666c0 46 37 84 83 84m208-542v125h-83v-125h-125v-83h125v-125h83v125h125v83h-125z" horiz-adv-x="1000" />

<glyph glyph-name="rm" unicode="&#xe80a;" d="M223 25c0-52 42-92 92-92h370c53 0 92 42 92 92v556h-554v-556z m602 696h-162l-46 46h-234l-45-46h-163v-92h648l2 92 0 0z" horiz-adv-x="1000" />

<glyph glyph-name="trash" unicode="&#xe80b;" d="M896 767l-133-759c-9-41-44-75-88-75h-350c-44 0-81 32-87 75l-134 759h792m-688-88l117-658h350l117 658h-584m161-571v175h175v-175h-175m175 213l-140 139 140 140 139-140-139-139z" horiz-adv-x="1000" />

<glyph glyph-name="restore" unicode="&#xe80c;" d="M560 706c-197 0-358-160-358-356h-119l159-158 158 158h-119c0 154 125 277 277 277s277-125 277-277-125-277-277-277c-60 0-114 21-160 52l-56-56c60-48 137-73 218-73 198 0 357 160 357 356s-161 354-357 354m80-356c0 44-36 79-80 79s-79-37-79-79 36-79 79-79 80 35 80 79z" horiz-adv-x="1000" />

<glyph glyph-name="copy" unicode="&#xe80d;" d="M671 767h-454c-42 0-75-34-75-75v-532h75v532h454v75z m112-152h-416c-42 0-75-34-75-75v-532c0-41 33-75 75-75h416c42 0 75 34 75 75v532c2 41-33 75-75 75z m0-607h-416v532h416v-532z" horiz-adv-x="1000" />

<glyph glyph-name="cut" unicode="&#xe80e;" d="M402 531c11 21 15 44 15 69 0 92-75 167-167 167s-167-75-167-167 75-167 167-167c25 0 48 7 69 15l98-98-98-98c-21 11-44 15-69 15-92 0-167-75-167-167s75-167 167-167 167 75 167 167c0 25-7 48-15 69l98 98 292-292h125v42l-515 514z m-152-14c-46 0-83 37-83 83s37 83 83 83 83-37 83-83-37-83-83-83z m0-500c-46 0-83 37-83 83s37 83 83 83 83-37 83-83-37-83-83-83z m250 312c-10 0-21 11-21 21s11 21 21 21 21-11 21-21-11-21-21-21z m292 396l-250-250 83-83 292 291v42h-125z" horiz-adv-x="1000" />

<glyph glyph-name="paste" unicode="&#xe80f;" d="M765 692h-159c-14 43-56 75-106 75s-92-32-106-75h-159c-41 0-75-34-75-75v-607c0-41 34-75 75-75h532c41 0 75 34 75 75v605c0 41-36 77-77 77z m-265 0c21 0 38-17 38-38s-17-39-38-39-37 16-37 37 16 40 37 40z m265-684h-530v607h75v-115h380v115h75v-607z" horiz-adv-x="1000" />

<glyph glyph-name="getfile" unicode="&#xe810;" d="M250 767l500-467-242-21 138-304-92-42-133 309-171-163v688" horiz-adv-x="1000" />

<glyph glyph-name="duplicate" unicode="&#xe811;" d="M850 510l-115 115c-2 2-6 4-10 4h-52v6c0 5-2 7-4 11l-115 114c-2 5-6 7-10 7h-356c-23 0-42-19-42-42v-617c0-23 19-41 42-41h139v-92c0-23 19-42 42-42h444c22 0 41 19 41 42v527c0 2-2 6-4 8z m-658-395v606h329v-92c0-8 8-16 17-16h89v-498h-435z m618-136h-437v92h260c23 0 42 19 42 42v472h29v-91c0-9 9-17 17-17h89v-498z m-118 117v-81c0-7 4-11 10-11h31c30 0 52 23 52 52 3 27-22 50-52 50h-31c-6 0-10-4-10-10z m23-13h18c17 0 30-12 30-29 0-14-13-27-30-27h-18v56z" horiz-adv-x="1000" />

<glyph glyph-name="rename" unicode="&#xe812;" d="M500 725v-83h83c23 0 42-19 42-42v-500c0-23-19-42-42-42h-83v-83h83c32 0 61 12 84 33 23-21 52-33 83-33h83v83h-83c-23 0-42 19-42 42v42h167 42v41 334 41h-42-167v42c0 23 19 42 42 42h83v83h-83c-31 0-60-12-83-33-23 21-52 33-84 33h-83z m-417-167v-41-334-41h42 375v83h-333v250h333v83h-375-42z m625-83h125v-250h-125v250z m-458-83v-84h208v84h-208z" horiz-adv-x="1000" />

<glyph glyph-name="edit" unicode="&#xe813;" d="M83 106v-173h173l513 513-173 173-513-513z m819 473c19 19 19 48 0 65l-108 108c-19 19-48 19-65 0l-85-85 173-173c2 0 85 85 85 85z" horiz-adv-x="1000" />

<glyph glyph-name="quicklook" unicode="&#xe814;" d="M500 633c-190 0-352-116-417-283 65-167 227-283 417-283s352 116 417 283c-65 167-227 283-417 283z m0-473c-104 0-190 86-190 190s86 190 190 190 190-86 190-190-86-190-190-190z m0 305c-62 0-115-50-115-115s50-115 115-115 115 50 115 115-52 115-115 115z" horiz-adv-x="1000" />

<glyph glyph-name="upload" unicode="&#xe815;" d="M352 129h294v294h196l-342 344-344-344h196v-294z m-196-98h686v-98h-686v98z" horiz-adv-x="1000" />

<glyph glyph-name="download" unicode="&#xe816;" d="M844 473h-196v294h-296v-294h-196l344-344 344 344z m-688-442v-98h686v98h-686z" horiz-adv-x="1000" />

<glyph glyph-name="info" unicode="&#xe817;" d="M458 142h84v250h-84v-250z m42 625c-231 0-417-186-417-417s186-417 417-417 417 188 417 417-188 417-417 417z m0-750c-183 0-333 150-333 333s150 333 333 333 333-150 333-333-150-333-333-333z m-42 458h84v83h-84v-83z" horiz-adv-x="1000" />

<glyph glyph-name="extract" unicode="&#xe818;" d="M896 665l-65 77c-12 14-31 25-54 25h-554c-21 0-42-11-54-25l-65-77c-12-17-21-38-21-59v-579c0-52 42-94 92-94h648c52 0 92 42 92 92v579c2 23-7 44-19 61z m-396-198l254-254h-162v-92h-186v92h-162l256 254z m-319 208l38 46h556l44-46h-638z" horiz-adv-x="1000" />

<glyph glyph-name="archive" unicode="&#xe819;" d="M896 665l-65 77c-12 14-31 25-54 25h-554c-21 0-42-11-54-25l-65-77c-12-17-21-38-21-59v-579c0-52 42-94 92-94h648c52 0 92 42 92 92v579c2 23-7 44-19 61z m-396-569l-254 254h162v92h186v-92h162l-256-254z m-319 579l38 46h556l44-46h-638z" horiz-adv-x="1000" />

<glyph glyph-name="view" unicode="&#xe81a;" d="M83 481h175v175h-175v-175z m0-218h175v175h-175v-175z m219 0h175v175h-175v-175z m221 0h175v175h-175v-175z m-221 218h175v175h-175v-175z m221 175v-175h175v175h-175z m219-393h175v175h-175v-175z m-659-219h175v175h-175v-175z m219 0h175v175h-175v-175z m221 0h175v175h-175v-175z m219 0h175v175h-175v-175z m0 612v-175h175v175h-175z" horiz-adv-x="1000" />

<glyph glyph-name="view-list" unicode="&#xe81b;" d="M83 252h196v196h-196v-196z m0-246h196v196h-196v-196z m0 492h196v196h-196v-196z m246-246h588v196h-588v-196z m0-246h588v196h-588v-196z m0 688v-196h588v196h-588z" horiz-adv-x="1000" />

<glyph glyph-name="help" unicode="&#xe81c;" d="M458 100h84v83h-84v-83m42 667c-229 0-417-188-417-417s188-417 417-417 417 188 417 417-188 417-417 417m0-750c-183 0-333 150-333 333s150 333 333 333 333-150 333-333-150-333-333-333m0 583c-92 0-167-75-167-167h84c0 46 37 84 83 84s83-38 83-84c0-83-125-73-125-208h84c0 94 125 104 125 208 0 92-75 167-167 167z" horiz-adv-x="1000" />

<glyph glyph-name="resize" unicode="&#xe81d;" d="M167 767c-46 0-84-38-84-84v-41h84v41h41v84h-41z m125 0v-84h83v84h-83z m166 0v-84h84v84h-84z m167 0v-84h83v84h-83z m167 0v-84h41v-41h84v41c0 46-38 84-84 84h-41z m-709-209v-83h84v83h-84z m750 0v-83h84v83h-84z m-500-41v-84h192l-210-208h-232v-83-125c0-46 38-84 84-84h208v84 148l208 210v-192h84v292 42h-42-292z m-250-125v-84h84v84h-84z m750 0v-84h84v84h-84z m0-167v-83h84v83h-84z m0-167v-41h-41v-84h41c46 0 84 38 84 84v41h-84z m-375-41v-84h84v84h-84z m167 0v-84h83v84h-83z" horiz-adv-x="1000" />

<glyph glyph-name="link" unicode="&#xe81e;" d="M163 350c0 71 58 129 129 129h166v79h-166c-115 0-209-93-209-208s94-208 209-208h166v79h-166c-71 0-129 58-129 129z m170-42h334v84h-334v-84z m375 250h-166v-79h166c71 0 130-58 130-129s-59-129-130-129h-166v-79h166c115 0 209 93 209 208s-94 208-209 208z" horiz-adv-x="1000" />

<glyph glyph-name="search" unicode="&#xe81f;" d="M679 242h-37l-13 12c46 54 75 125 75 202-2 171-139 311-310 311s-311-140-311-311 140-310 311-310c77 0 148 27 202 75l12-13v-37l238-238 71 71-238 238z m-285 0c-119 0-215 96-215 214s96 215 215 215 214-96 214-215-98-214-214-214z" horiz-adv-x="1000" />

<glyph glyph-name="sort" unicode="&#xe820;" d="M394 635l133 132 131-132h-264m264-570l-131-132-131 132h262m-277 191h-116l-32-110h-95l125 406h122l128-406h-100l-32 110m-104 67h92l-25 85-11 40-10 40h-2l-8-40-11-40-25-85m273-177v52l194 275v2h-175v77h294v-54l-190-271v-2h192v-77l-315-2 0 0z" horiz-adv-x="1000" />

<glyph glyph-name="rotate-r" unicode="&#xe821;" d="M658 567l-200 200v-136c-173-21-308-168-308-350s133-327 308-348v90c-125 21-220 129-220 260s95 238 220 259v-171l200 196z m192-240c-8 61-31 121-71 171l-62-63c23-33 37-70 46-108h87z m-304-304v-90c60 9 121 32 171 71l-63 63c-33-23-71-38-108-44z m171 106l62-62c40 52 65 110 71 171h-90c-4-38-20-75-43-109z" horiz-adv-x="1000" />

<glyph glyph-name="rotate-l" unicode="&#xe822;" d="M283 435l-62 63c-40-52-65-110-71-171h90c4 38 20 75 43 108z m-45-197h-88c8-61 31-121 71-171l62 62c-23 34-39 71-45 109z m45-234c52-39 111-62 171-71v90c-37 6-75 21-108 46 0-2-63-65-63-65z m259 627v136l-200-200 200-196v173c125-21 221-129 221-261s-96-239-221-260v-90c173 21 308 169 308 350s-133 327-308 348z" horiz-adv-x="1000" />

<glyph glyph-name="netmount" unicode="&#xe823;" d="M708 767c46 0 84-38 84-84v-416c0-46-38-84-84-84h-166v-83h41c23 0 42-19 42-42h292v-83h-292c0-23-19-42-42-42h-166c-23 0-42 19-42 42h-292v83h292c0 23 19 42 42 42h41v83h-166c-46 0-84 38-84 84v416c0 46 38 84 84 84h416z" horiz-adv-x="1000" />

<glyph glyph-name="netunmount" unicode="&#xe824;" d="M917 342c4 229-179 421-409 425-231 4-420-179-425-409-4-229 180-421 409-425s421 180 425 409z m-750 14c4 184 156 332 339 327 77-2 148-29 202-73l-475-458c-43 56-68 127-66 204z m125-266l475 458c43-56 68-129 66-206-4-184-154-332-339-327-77 4-148 31-202 75z" horiz-adv-x="1000" />

<glyph glyph-name="places" unicode="&#xe825;" d="M750 767h-500c-46 0-83-38-83-84v-666c0-46 37-84 83-84h500c46 0 83 38 83 84v666c0 46-37 84-83 84z m-500-84h208v-333l-104 63-104-63v333z" horiz-adv-x="1000" />

<glyph glyph-name="chmod" unicode="&#xe826;" d="M381 302l-298 83 55 167 291-119-19 334h186l-19-334 286 113 54-173-298-83 196-250-148-107-173 273-167-262-148 102 202 256z" horiz-adv-x="1000" />

<glyph glyph-name="accept" unicode="&#xe827;" d="M500 767c-231 0-417-186-417-417 0-229 186-417 417-417 229 0 417 188 417 417 0 231-188 417-417 417z m-83-625l-209 208 59 58 150-150 316 317 59-58-375-375z" horiz-adv-x="1000" />

<glyph glyph-name="menu" unicode="&#xe828;" d="M83 73h834v92h-834v-92z m0 231h834v92h-834v-92z m0 323v-92h834v92h-834z" horiz-adv-x="1000" />

<glyph glyph-name="colwidth" unicode="&#xe829;" d="M377 31h246v638h-246v-638z m-294 0h246v638h-246v-638z m588 638v-638h246v638h-246z" horiz-adv-x="1000" />

<glyph glyph-name="fullscreen" unicode="&#xe82a;" d="M202 231h-119v-298h298v119h-179v179z m-119 238h119v179h179v119h-298v-298z m715-417h-179v-119h298v298h-119v-179z m-179 715v-119h179v-179h119v298h-298z" horiz-adv-x="1000" />

<glyph glyph-name="unfullscreen" unicode="&#xe82b;" d="M83 113h180v-180h118v298h-298v-118z m180 475h-180v-119h298v298h-118c0 0 0-179 0-179z m356-655h119v180h179v118h-298v-298z m119 655v179h-119v-298h298v119c0 0-179 0-179 0z" horiz-adv-x="1000" />

<glyph glyph-name="empty" unicode="&#xe82c;" d="M813 463l-42-75-531 304 43 75 134-77 58 18 190-108 16-60 132-77m-628-442v525h221l302-175v-350c0-48-39-88-87-88h-348c-48 0-88 40-88 88z" horiz-adv-x="1000" />

<glyph glyph-name="undo" unicode="&#xe82d;" d="M375 767l-292-209 292-208v125h188c106 0 187-81 187-187s-81-188-187-188h-480v-167h480c195 0 354 159 354 355s-159 354-354 354h-188v125z" horiz-adv-x="1000" />

<glyph glyph-name="redo" unicode="&#xe82e;" d="M625 767v-125h-187c-196 0-355-159-355-354s159-355 355-355h479v167h-479c-107 0-188 81-188 188s81 187 188 187h187v-125l292 208-292 209z" horiz-adv-x="1000" />

<glyph glyph-name="preference" unicode="&#xe82f;" d="M810 310c3 13 3 28 3 42s-3 27-3 42l88 69c8 6 10 16 4 27l-83 143c-6 9-17 13-25 9l-104-42c-21 17-46 31-71 42l-15 108c-2 8-10 17-21 17h-166c-11 0-19-9-21-17l-17-110c-25-11-48-25-71-42l-104 42c-8 4-21 0-25-9l-83-143c-6-9-2-21 4-28l90-68c0-15-2-27-2-42s2-27 2-42l-88-68c-8-7-10-17-4-27l83-144c7-9 17-13 25-9l104 42c21-17 46-31 71-42l17-110c2-10 10-17 21-17h166c11 0 19 9 21 17l17 110c25 11 48 25 71 42l104-42c10-4 21 0 25 9l83 144c7 8 2 20-4 27l-92 70z m-310-106c-81 0-146 65-146 146s65 146 146 146 146-65 146-146-65-146-146-146z" horiz-adv-x="1000" />

<glyph glyph-name="mkdirin" unicode="&#xe830;" d="M583 100v125h-166v167h166v125l209-209m41 292h-333l-83 83h-250c-46 0-84-37-84-83v-500c0-46 38-83 84-83h666c46 0 84 37 84 83v417c0 46-38 83-84 83z" horiz-adv-x="1000" />

<glyph glyph-name="selectall" unicode="&#xe831;" d="M167 767c-46 0-84-38-84-84v-41h84v41h41v84h-41z m125 0v-84h83v84h-83z m166 0v-84h84v84h-84z m167 0v-84h83v84h-83z m167 0v-84h41v-41h84v41c0 46-38 84-84 84h-41z m-709-209v-83h84v83h-84z m209 0v-83h416v83h-416z m541 0v-83h84v83h-84z m-750-166v-84h84v84h-84z m209 0v-84h416v84h-416z m541 0v-84h84v84h-84z m-750-167v-83h84v83h-84z m209 0v-83h416v83h-416z m541 0v-83h84v83h-84z m-750-167v-41c0-46 38-84 84-84h41v84h-41v41h-84z m750 0v-41h-41v-84h41c46 0 84 38 84 84v41h-84z m-541-41v-84h83v84h-83z m166 0v-84h84v84h-84z m167 0v-84h83v84h-83z" horiz-adv-x="1000" />

<glyph glyph-name="selectnone" unicode="&#xe832;" d="M83 683c0 46 38 84 84 84h125v-84h-125v-125h-84v125m834 0v-125h-84v125h-125v84h125c46 0 84-38 84-84m-84-666v125h84v-125c0-46-38-84-84-84h-125v84h125m-750 0v125h84v-125h125v-84h-125c-46 0-84 38-84 84m334 750h166v-84h-166v84m0-750h166v-84h-166v84m416 416h84v-166h-84v166m-750 0h84v-166h-84v166z" horiz-adv-x="1000" />

<glyph glyph-name="selectinvert" unicode="&#xe833;" d="M175 767h92v-92h91v92h92v-92h92v92h91v-92h92v92h92v-92h100v-92h-92v-91h92v-92h-92v-92h92v-91h-92v-92h92v-92h-92v-100h-92v92h-91v-92h-92v92h-92v-92h-91v92h-92v-92h-100v92h-92v92h92v91h-92v92h92v92h-92v91h92v92h-92v100h92v92z" horiz-adv-x="1000" />

<glyph glyph-name="lock" unicode="&#xe834;" d="M500 131c44 0 79 36 79 79s-35 80-79 80-79-36-79-80 35-79 79-79z m238 359h-40v79c0 108-88 198-198 198s-198-90-198-198v-79h-39c-44 0-80-36-80-80v-395c0-44 36-80 80-80h477c43 0 79 36 79 80v395c-2 44-38 80-81 80z m-361 79c0 69 54 123 123 123s123-54 123-123v-79h-246v79z m361-556h-475v395h477v-395z" horiz-adv-x="1000" />

<glyph glyph-name="perms" unicode="&#xe835;" d="M738 490h-40v79c0 108-88 198-198 198s-198-90-198-198v-79h-39c-44 0-80-36-80-80v-395c0-44 36-80 80-80h477c43 0 79 36 79 80v395c-2 44-38 80-81 80z m-238-359c-44 0-79 36-79 79s35 80 79 80 79-36 79-80-35-79-79-79z m123 359h-246v79c0 69 54 123 123 123s123-54 123-123v-79z" horiz-adv-x="1000" />

<glyph glyph-name="unlocked" unicode="&#xe836;" d="M500 131c44 0 79 36 79 79s-35 80-79 80-79-36-79-80 35-79 79-79z m238 359h-40v79c0 108-88 198-198 198s-198-90-198-198h75c0 69 54 123 123 123s123-54 123-123v-79h-360c-44 0-80-36-80-80v-395c0-44 36-80 80-80h477c43 0 79 36 79 80v395c-2 44-38 80-81 80z m0-477h-475v395h477v-395z" horiz-adv-x="1000" />

<glyph glyph-name="symlink" unicode="&#xe837;" d="M917 373l-325 325v-185c-323-46-463-280-509-511 117 163 277 236 509 236v-190l325 325z" horiz-adv-x="1000" />

<glyph glyph-name="resizable" unicode="&#xe838;" d="M917-67h-167v167h167v-167m0 334h-167v166h167v-166m-334-334h-166v167h166v-167m0 334h-166v166h166v-166m-333-334h-167v167h167v-167m667 667h-167v167h167v-167z" horiz-adv-x="1000" />

<glyph glyph-name="close" unicode="&#xe839;" d="M917 683l-84 84-333-334-333 334-84-84 334-333-334-333 84-84 333 334 333-334 84 84-334 333 334 333z" horiz-adv-x="1000" />

<glyph glyph-name="plus" unicode="&#xe83a;" d="M917 290h-357v-357h-118v357h-359v118h357v359h118v-357h359v-120z" horiz-adv-x="1000" />

<glyph glyph-name="return" unicode="&#xe83b;" d="M513 494c-109 0-207-40-282-106l-146 145v-366h367l-148 150c56 48 129 77 209 77 143 0 266-94 308-225l96 31c-54 171-215 294-404 294z" horiz-adv-x="1000" />

<glyph glyph-name="minus" unicode="&#xe83c;" d="M917 292h-834v118h834v-118z" horiz-adv-x="1000" />

<glyph glyph-name="hdd" unicode="&#xe83d;" d="M167 767l-84-500h834l-84 500h-666z m-84-542v-292h834v292h-834z m84-83h41v-84h42v84h42v-84h41v84h42v-84h42v84h41v-84h42v84h42v-84h41v84h42v-84-41h-42-41-42-42-41-42-42-41-42-42-41v41 84z m604 0c35 0 62-27 62-63s-27-62-62-62-63 27-63 62 27 63 63 63z" horiz-adv-x="1000" />

<glyph glyph-name="sql" unicode="&#xe83e;" d="M500 767c-85 0-162-15-223-40-29-12-56-27-75-48s-35-48-35-79v-333-167c0-31 14-58 35-79s46-38 75-50c61-23 138-38 223-38s163 15 223 40c29 12 56 29 75 50s35 46 35 77v167 333c0 31-14 58-35 79s-46 36-75 48c-60 25-138 40-223 40z m0-84c75 0 144-14 190-33 23-10 39-21 50-29s10-17 10-21 0-10-10-19-27-21-50-29c-46-21-115-35-190-35s-144 14-190 33c-22 10-39 21-50 29s-10 17-10 21 0 10 10 19 28 21 50 29c46 21 115 35 190 35z m-250-195c8-5 17-11 27-15 61-25 138-40 223-40s163 15 223 40c10 4 19 10 27 15v-55c0-4-2-10-10-20s-27-21-50-30c-46-20-113-33-190-33s-144 13-190 33c-22 11-39 21-50 30s-10 16-10 20v55z m0-167c8-4 17-11 27-15 61-25 138-39 223-39s163 14 223 39c10 4 19 11 27 15v-54c0-4-2-11-10-21s-27-21-50-29c-46-21-113-34-190-34s-144 13-190 34c-22 10-39 21-50 29s-10 17-10 21v54z m0-167c8-4 17-10 27-14 61-25 138-40 223-40s163 15 223 40c10 4 19 10 27 14v-54c0-4-2-10-10-21s-27-21-50-29c-46-21-113-33-190-33s-144 12-190 33c-22 10-39 21-50 29s-10 17-10 21v54z" horiz-adv-x="1000" />

<glyph glyph-name="dropbox" unicode="&#xe83f;" d="M665 123l-165 125-160-125-94 56v-60l254-169 256 167v60l-91-54z m252 471l-246 156-171-140 256-150 161 134z m-834-269l252-150 165 127-242 154-175-131z m252 425l-252-162 175-132 242 154-165 140z m165-448l167-127 250 150-161 135-256-158z" horiz-adv-x="1000" />

<glyph glyph-name="googledrive" unicode="&#xe840;" d="M898 254l-267 463h-262l0 0 266-463h263z m-488-39l-131-232h506l132 232h-507l0 0z m-77 443l-250-443 132-232 254 444-136 231z" horiz-adv-x="1000" />

<glyph glyph-name="onedrive" unicode="&#xe841;" d="M544 602c-75 0-142-44-173-106-19 10-42 17-65 17-75 0-133-61-133-134 0-6 2-10 2-16-52-7-92-50-92-105 0-58 46-104 105-104h83c-4 15-8 29-8 44 0 58 37 108 89 127 11 88 88 156 177 156 54 0 104-23 138-64 12 4 27 6 41 6 11 0 19 0 30-2-7 102-90 181-194 181z m-15-148c-81 0-148-66-148-148v-2c-50-6-89-50-89-102 0-58 46-104 104-104h431c50 0 90 40 90 90s-40 89-90 89c0 67-54 119-119 119-18 0-35-4-52-13-27 42-73 71-127 71z" horiz-adv-x="1000" />

<glyph glyph-name="box" unicode="&#xe842;" d="M898 365c-38 93-113 139-213 145-14 3-20 7-25 19-12 36-35 67-66 90-104 79-265 29-306-94-3-8-13-17-21-21-29-14-63-23-88-41-81-59-114-165-83-257 33-98 123-162 227-162h175c60 0 123-2 185 0 67 2 125 25 169 73 65 71 83 156 46 248z m-100-244c-15-11-29-6-40 8-14 19-29 40-45 61-17-21-30-40-44-59-9-12-21-23-38-12s-16 25-8 41c-58-62-117-58-198 11-23-29-50-48-85-54-67-13-138 43-138 110v192c0 21 13 33 27 33 17 0 27-12 27-33v-84c32 19 63 23 94 17 31-8 56-25 75-54 4 2 6 6 8 8 50 59 125 63 182 11l8-9c-10 17-10 32 2 40 17 10 29 2 40-10 14-19 29-38 45-59 13 15 25 29 36 44 4 6 8 12 12 17 13 14 27 16 40 6 15-13 12-25 2-40-15-18-29-39-44-58-8-10-8-17 0-27 17-19 32-40 46-61 11-16 8-31-4-39z m-473 179c-37 0-67-29-67-65 0-37 27-64 65-64s65 27 67 62c0 38-27 67-65 67z m202 0c-37 0-67-29-67-65 0-37 30-64 67-64 38 0 67 27 67 62 0 36-31 67-67 67z m106-4c2-6 5-13 5-19 14-37 10-75-13-108 17 19 31 37 46 58 4 4 2 15-2 19-11 17-23 33-36 50z" horiz-adv-x="1000" />

<glyph glyph-name="help-circle" unicode="&#xe843;" d="M500 767c-231 0-417-186-417-417s186-417 417-417 417 188 417 417-188 417-417 417z m42-709h-84v84h84v-84z m85 323l-37-37c-30-31-48-56-48-119h-84v21c0 46 19 87 48 119l52 52c15 14 25 35 25 58 0 46-37 83-83 83s-83-37-83-83h-84c0 92 75 167 167 167s167-75 167-167c0-37-15-71-40-94z" horiz-adv-x="1000" />

<glyph glyph-name="move" unicode="&#xe844;" d="M425 465h152v114h115l-192 188-190-190h115v-112z m-40-40h-114v115l-188-190 190-190v115h115v150z m532-75l-190 190v-115h-114v-152h114v-115l190 192z m-342-115h-152v-114h-115l192-188 190 190h-115v112z" horiz-adv-x="1000" />

<glyph glyph-name="save" unicode="&#xe845;" d="M731 767h-556c-50 0-92-42-92-92v-648c0-52 42-94 92-94h648c52 0 92 42 92 92v556l-184 186z m-231-742c-77 0-140 63-140 140s63 139 140 139 140-62 140-139-63-140-140-140z m140 465h-465v185h463v-185z" horiz-adv-x="1000" />

<glyph glyph-name="loading" unicode="&#xe846;" d="M500 577v-114l152 152-152 152v-115c-167 0-302-135-302-302 0-60 17-115 48-160l56 56c-17 31-27 67-27 106-2 123 100 225 225 225z m256-67l-56-56c17-31 27-66 27-106 0-125-102-227-227-227v114l-152-152 152-150v115c167 0 302 135 302 302 0 60-17 115-46 160z" horiz-adv-x="1000" />

<glyph glyph-name="info-circle" unicode="&#xe847;" d="M500 767c-231 0-417-186-417-417s186-417 417-417 417 188 417 417-188 417-417 417z m42-625h-84v250h84v-250z m0 333h-84v83h84v-83z" horiz-adv-x="1000" />

<glyph glyph-name="prev" unicode="&#xe848;" d="M758 669l-100 98-416-417 416-417 98 98-316 319 318 319z" horiz-adv-x="1000" />

<glyph glyph-name="next" unicode="&#xe849;" d="M342 767l-98-98 316-319-318-319 98-98 416 417-414 417z" horiz-adv-x="1000" />

<glyph glyph-name="ql-fullscreen" unicode="&#xe84a;" d="M500 767l171-171-417-417-171 171v-417h417l-171 171 417 417 171-171v417h-417z" horiz-adv-x="1000" />

<glyph glyph-name="ql-fullscreen-off" unicode="&#xe84b;" d="M858 767l-177-177-118 118-59-354 354 59-118 118 177 177-59 59z m-362-421l-354-58 118-119-177-177 59-59 177 177 119-118 58 354z" horiz-adv-x="1000" />

<glyph glyph-name="close-circle" unicode="&#xe84c;" d="M500 767c231 0 417-186 417-417s-186-417-417-417-417 186-417 417 186 417 417 417m150-209l-150-150-150 150-58-58 150-150-150-150 58-58 150 150 150-150 58 58-150 150 150 150-58 58z" horiz-adv-x="1000" />

<glyph glyph-name="pin" unicode="&#xe84d;" d="M667 350v333h41v84h-416v-84h41v-333l-83-83v-84h217v-250h66v250h217v84l-83 83z" horiz-adv-x="1000" />

<glyph glyph-name="check" unicode="&#xe84e;" d="M348 167l-198 198-67-69 265-265 569 569-67 67-502-500z" horiz-adv-x="1000" />

<glyph glyph-name="arrowthick-1-s" unicode="&#xe84f;" d="M498-67l290 290-75 73-163-163-2 634h-104l2-634-163 159-73-75 288-284z" horiz-adv-x="1000" />

<glyph glyph-name="arrowthick-1-n" unicode="&#xe850;" d="M502 767l-289-290 72-73 165 163v-634h104v634l163-163 73 75-288 288z" horiz-adv-x="1000" />

<glyph glyph-name="caret-down" unicode="&#xe851;" d="M902 569c-10 10-23 14-37 14h-730c-14 0-27-4-37-14s-15-23-15-38c0-14 5-27 15-37l365-365c10-10 22-14 37-14s27 4 38 14l364 367c11 10 15 23 15 37 0 13-4 25-15 36z" horiz-adv-x="1000" />

<glyph glyph-name="caret-up" unicode="&#xe852;" d="M917 165c0 14-4 27-15 37l-364 367c-11 10-23 14-38 14s-27-4-37-14l-365-365c-10-10-15-21-15-37s5-27 15-38 23-14 37-14h730c14 0 27 4 37 14s15 23 15 36z" horiz-adv-x="1000" />

<glyph glyph-name="menu-resize" unicode="&#xe853;" d="M627 767c0-277 0-554 0-834-31 0-62 0-94 0 0 277 0 557 0 834 32 0 63 0 94 0z m-160 0c0-277 0-554 0-834-32 0-63 0-94 0 0 277 0 555 0 834 31 0 62 0 94 0z" horiz-adv-x="1000" />

<glyph glyph-name="arrow-circle" unicode="&#xe854;" d="M500 767c-229 0-417-188-417-417s188-417 417-417 417 188 417 417-188 417-417 417z m0-577l-260 260 60 60 200-200 200 200 60-60-260-260z" horiz-adv-x="1000" />

<glyph glyph-name="tn-error" unicode="&#xe855;" d="M500 767l-342-152v-227c0-211 146-407 342-455 196 48 342 244 342 455v227l-342 152z m38-257v-227h-75v227h75z m-38-385c-27 0-50 23-50 50 0 27 23 50 50 50l0 0c27 0 50-23 50-50l0 0c0-27-23-50-50-50" horiz-adv-x="1000" />

<glyph glyph-name="warning-alert" unicode="&#xe856;" d="M538 256h-75v152h75m0-304h-75v75h75m-455-189h834l-417 720-417-720z" horiz-adv-x="1000" />

<glyph glyph-name="caret-right" unicode="&#xe857;" d="M719 388l-365 364c-10 11-23 15-35 15-13 0-27-4-38-15s-14-23-14-37v-730c0-14 4-27 14-37s23-15 38-15c14 0 27 4 37 15l365 365c10 10 14 22 14 37 0 15-6 27-16 38z" horiz-adv-x="1000" />

<glyph glyph-name="caret-left" unicode="&#xe858;" d="M281 388l365 364c10 11 23 15 35 15 15 0 27-4 38-15s14-23 14-37v-730c0-14-4-27-14-37s-23-15-38-15-27 4-37 15l-363 365c-10 10-14 22-14 37 0 15 4 27 14 38z" horiz-adv-x="1000" />

<glyph glyph-name="theme" unicode="&#xe859;" d="M500 767c-229 0-417-188-417-417s188-417 417-417c38 0 69 32 69 69 0 19-6 33-19 46-10 12-17 29-17 46 0 37 32 69 69 69h81c127 0 232 104 232 231 2 206-186 373-415 373z m-254-417c-38 0-69 31-69 69s31 69 69 69 69-32 69-69-32-69-69-69z m137 185c-37 0-68 32-68 69s31 69 68 69 69-31 69-69-29-69-69-69z m234 0c-38 0-69 32-69 69s31 69 69 69 68-31 68-69-31-69-68-69z m137-185c-37 0-69 31-69 69s32 69 69 69 69-32 69-69-29-69-69-69z" horiz-adv-x="1000" />

<glyph glyph-name="logout" unicode="&#xe85a;" d="M546 767h-92v-463h92v463z m225-100l-67-67c73-60 119-150 119-250 0-179-146-325-325-325s-323 146-323 325c0 102 46 192 119 250l-65 67c-89-77-146-190-146-317 0-229 188-417 417-417s417 188 417 417c0 127-57 240-146 317z" horiz-adv-x="1000" />
</font>
</defs>
</svg>themes/dark/icons/material.woff000064400000033410151215013520012542 0ustar00wOFF7]�GSUBX;T �%zOS/2�AV> I�cmap��\��cvt � �fpgm��p���Ygasp	`glyf	h(@�3Qkhead1h06��hhea1�$<�hmtx1�pg`loca1���Rmaxp2�  ��name2�}�w��post4 k���prep6�z��A+�x�c`d``�b0`�c`rq�	a��I,�c�b`a��<2�1'3=���ʱ�i f��&;Hx�c`d~�8�������iC�f|�`��e`ef�
�\S^0��b���$��Arox���nDџd��m�����̔R|�an��u���VޕIڙ1���
0���Ϙ��������N_3�׳�����0=����yֲ�:߷�E6���la+���v����a/���r���(�8�	Nr�Ӝ�,�8�_����U�q������]�q�<��y�S�����y�[��|����W��%~�_���L���,��a�g��ή����3��~j�S��2��)SBj�Y��]�4�2W�L)�F�ԑ2�L")3I�t�2��L,)�K��2ϤL6)3Nʴ�2��l)�@�V���l
);C���G�l)�Eʖ��o�l�qR����$eCI�UR����%e�I�iR���='e�I�}R�)����@ʍ �Z�r7H� ��R�
)���KC��!�r�H�H��&R�)����E�
#嚑r�H�p��:R�)���KH�M$�:�r'I����NR�()���UL�	0�x�c`@��?�l�x��Viw�FyI��,%-ja��i�F&l��	A�c ]�����;����_�d�s�7~Z�/$���p���w�����eZ��둔�/���&��<	�M�Q|(;{!e���Q��ڷ�DD"P���D�Y�d|�QF˶�WM�-=�.[�A�U�~:ʱ;��f3th=�%UU�H�=RҦe��+I+����W�PˆN"i���H�g��h5��(�l��(R$��Ay����	�͐�ʧ����أ�V�K���/y�w9?�_oQ��@Ȏ���t%_�[[aܴ��(Tv�wBl��T�f��F�+2�Ќ`�|�+?��!Y-�O��G�Z��A�eN�K>���)q�Y���	��3��>���)�x�zG%�)as4I�0r`%e�*����8�uZ�[�~��ї�h�Pwb<[[9Q��hR��L��Iͣ)
��t&x̯(?�I^mc5��G�8fƄD"-�KSA,;��)ͣ����v-Z���ܣ���V���S��FV�b:���i�/�i��"E��~L�A�2�-6Ô�o���ז������+�}�D���O�)	L��U�V@b�kY��լ���wC�V����rǾ�q�_33���߉ӳ#.=s�K�|�u=�ש�rqfyN�Y���4����Y���K[��,?�i��G:cyA�t���0��0��CX^�!,a�CXa�%��c�r����e��SI�ڙXlB`b���E�j*�TB�hTjC�n�TϪe�^<�9�H�Ț_1Ε�F��-o;W���o��9�R֋�?���T%�b�Ó����l'�6�xtM��U=��_TTX�H�X(ʲlpg"��:��j��C�l�<��u˚��71BP��7܃NYIY����۲�;�r8,I17�V�"#��~�Yʞ�|p�Je�j���'1��$�q[Q6H����
�y�&a�
�N�
�an�y'\�z�,��E��(��[��D��h����a��B�oq$4��~T��5�4Rn�_�ٺmB��#*vò�������m�|��գ���^�N��~f�� 51{�tq�ʻZ�2GmS��SךC�U���Q����9k�n�'z_Ӫ��\,��m�R&�a�
��ťP�e4I���P������|�+U��q$�NԷ��`��G��c�r
.���n��l�����70k��Y���t�!G����
|�qz���!�c���&���ݵ��S���9>���a�d�-�0�f��s�2��s|��u�/�� d��9�0'x�_1����a�
s�|�1s$�a����0�-^�]��AU�SOX���PSe�����A�� �����/�g����AL�Uӝ!�7^��1����L��e��|�
�]l>����@���x��{	x�}�9qc@$��A� @�C$A��C�H�ASm)rdZ�TK�[�I�n�]���8N�X�FL�ϑ9���j�/�m�~�ױ����M�n��S�]}�h�o�%���]�3�f�͛w����\{�{��D�$V�H@7s@	=F�cO�7�.EQD��S��Ԝ�3AN���^Y�����WaN뿡_`�뢟%2i/�x��d�(P؄��`؍Ua�뤂��ń	��0ץ�^��_�������E������o7Q��F���,�7hVq�J���|W
o���F���_���oS-�dIx�Jd3^>�A�i��=��u��>��_��k�aA���H����3D!���J�
8�8y�|�|��EDU�xs�B^�ka8{U�f5�$���3وn�d�8ɮ��9���_w�a|�9�-{JJ�v�s��ɢ�5�&��h�P��J8�M�K��޷�ޒB�Kqحf�DT����3�ı�A�{�jXq�9;�Y��d�c(�t��.�;��-�WÙ[�a�4�Z�l�~�8H���u��܄=o��ǁ񇐨Dn��#���D�BDQ�KQ��O>g�݄'�E"�e����RG����V޻�-U0�on������R�����+j��4h��S=ȅ87C���!p;�'�x�d�7��!��!��ޓ��^�/����_��{v�:/�Wt��s`ׁr��p�s;�$���S�R��Ա�V�[r��&��*��SD����p>���ܸ��a��~��Jsw��ry��5t�F�-Bc�c2�'���x��݄�$�D�#<�����%�������E����Go���R3��VKs�ϫz�.���DŌ����jy-�cB�]7������=�F�_XZ*/-CCY�"7J��H���|�J��� 7(ǰ�L�(��#�B�'S^ �)g��X�E6��
�q����-�*
�)�ʚ![d��;��6�K��>�#juFt�q�*��L?���c��Z��e66x��#Wukc�?3\6h�ۏ�5��M>׊���h��@P*`O��<PA�3x�­D��� �����dB���{D����X�pLKh���Z�ÉD��*����v=MnN�q�z$��e�����?�P%[K�q>8��q@B�)����AF���M��f3!vŮ8f��f�`C���M#
-6�	����%�(���~Bʆ�/���CG{���y��Z�����S��~��G���'yĘ?��G����(M�qQ�V\d:�ċ$��(#as"�P���y�_A����d��R�@K�Î�V$IH�mG$lAeb��8=>���a��HBBq�S,��x"��#���S���;���������gJ#�x<6R�,O�u:X�%��fv���X:3���c'�_��Tid��3�����w˷d����3�L����2iB�.
��D�-�ŧ�s�DN��a���a��)��Ѳ�ij�4)��dh��mN	��k���P<�/���$|��>L���T0��>O�k�`��g��=�	��g��ы`��q�c�t�^2D��gK���)%0�Lf'�4�,����������&0��`���'��(qފ�f�q�e���6��R��p75<\�w�������@~�0��N�v��'��h�O��T���	�;"v�K��Z�g�"����z��k܍��ç]�����������.V���.U���ݭ��M��6�^-C���V^Xی����؜խ�#�'vx��:j��n�Y%'�K�,L����L	�!�Ir�Ȣ ���8Cı�)�H<�"�P���
���B�����#J�	�07?�����h������d��_sz�!�Mշ&��&�ᎎ0R�Y��m��7�SCM�
=p�ˮ�H��q�D�����t���%�
W���O<C��]�~��O���n� 	�'�$|��̶Q�i씎GP�o�i��X�ģz0�D����]����i���Lfb�#Vb���y����<��d�����BVy,����Z�As�֜�.�k�����-�A"�k-"K��܋8,Nn۲itd�/��Τ:��D0�ys��ۉ��Nd�E�\#�APWh1�ʮ(>D>�J�8�T� �i����#0T3'y���������ܬ|�Y�o+M��6���?�+�mq�)s��A_�}.���\�㳈NH�J��J�,{�:x��tnV4�g���Kf������\�&gC�e�_�I�6)�����5�q���rE�̻mT��U�sP�Ӣ8�P��A�0����
���سS�\<NH��C�ӓ�����tW�'�
k�#�XX�:A�Y���R')��VA�[0�PP!�ĉ�?_N�b�<�J���\�F3e,��
;�D�ݺ��`��Ғ^�L��ܬ�V��c���0��I�7�W��˕J�09�#��6�Cbxd�W�¬�����P��@<�_O��,�g��n����z:>�.���]v��g;��20�}ą�G�l+m�#V�� ���e�dỌ���X�،�a��T8�qI�C�p
5Z�4��\u}mT�>o��bi����Uw<v�P��LK3�Wn�5�
-��f�p[����[�]킱��`�~8�}�\��m�D�� ȇ�cc�P>@�6a�33�J!��ʹ�@q�Cy�l<XQ\�S@-��3�94�a���ӿr��ju�c�=�W�-4ڝ���+u�L��ւ2�F��8~<���fB�$�dv+��hB���
��p�����v��M�
?���������U��֝C��E�d��	�$*�`@t!!��u�̙�wVL�{�;�Z��;՚�Z�v�IhR�ff����S��@����U��am�A��q��\���8w��V�;xϾ퓩t:5���F�J�?^�Ӭ���W������k]=�?(7��C��-
{��,!���HDs�2�#D��`"�萃����P[ȥ(޾�lȿ4��"J�5`J��W#�5�:��:�Q1�É<���_��Fp���-v�e:�V}1Q���,�i:M��ߑ��<g���"��ݍ�� ��ǃ�hA�&�e���a������ݛt���Y7���y�S�s�X�tw�#�k��;I��U����d1	�5��.��I�Y�PG�T��91��}������D*��2�L��	�D�j�LJ�+�9[P�����|�
ǩ1{�]�5�٦��y��q��O��立�+�?}^?�*���
����|��y�����#�Y-T0�
����>b�8�����{bÁ�a��?�
�t���{�NU_�m�^ҷ\�v�g���t�F���(�I6���&8jf�."�[0�0����U~Ϥ�o+�s=�������{&�sa�ƹa�JŚ�fB���+L~���t%�)�0�4Y\fK�m	�l���;�t뺇o**�8����&��㲸�~-��liu�F��O��|�H�N�!m$�:���
�D��i�>V2gA�vC���O>D�wҌz�F�q+͊�y�ښ���CqKL��A;��G�N��	Ά��i��%�C�^�s�����@U��\��*��Mi�˄�A��r�gj%�ko(�ʹ��i��[m��^���_�w|���۷OL��
�����x$�*�5��d���;o�11=1=59�mQ�Ʊ��Pid�C����|_�%Lo�7ד�b,�E�����ڦ�2'��Q<n��is:�&��j13?1�A�Fd�m�����n��eh*��GI3�ia�Ҹ,��p�0B���HO%Y)����ժ�
}�R�����=�˗����LjY=��赬�LV�?v��2���˗#=����`���\./'+=�Z՚�7dI��	��f�bQ�<�2�Ci"2�"3���d*�D,i�7�ZR�0ca͂�ߍpȀ���k��`y���I�d���A�ܹ������s���`��58��
������w�ā�ڠT9��-�+��œ�$�F�@Jk�:��tS�:��%J*�H�|�NڢZ[2�L6#��uƴ�ޭ
\��O�ck]��4��[�~eۖdggr˶J�������?.�~�B���o[;z
}�Gk��uKGG"j��5��¯�>0�p��
����
5q�-isQ��g�F��&��Ȭ�8���ȣ-.j�1q�i��L�n�����z9\do�F��3/�
�e��	������mѧH�$͝s�
�P��;�!�rH��x��:�t�G�@C�b����<�/�D�������
g�>����^p����tC7��<�1F�t�ڛ|7E=�9ĮY-l¥bNT5U[���.�"�Ƶ@��OS\��*���ǩ�bB,�
EM��~y�hO&��u����;��a�p��۷���3<l�'����&�mz�y�y�G�M��I-lI���}#��
k�+��u�-�
w��߰b8�S��.�nJ�R� i^_1����'<�;/���n�0Bž��Be�7z$�>F�S6t�|���C��@��@����}�O-l.\��3G!D��|�Y�D���}�	D}8u��	����lL�	X H6'�:�x��є2%e�0N?sF�.�o6�II�6�k�E��f+G��:�ۋ��:G/1Mv.�4CT�q�rNi��f%y.��a�I���MX�$�*�SZ���Y+��4�(%�`E
� 5���+�9�Ѭ���(��O#i���|�����
@M�c=��b�7�������f�S�!��p�#�F84�5�}��}��Z�(ݿz�#E!��G^�t~��v�K���38pD�R
u3�Ǚ�y��D���o��b$�ވy�w�	9%!ѷ��+�����#GؔV7�����!ki�NZJ�U^�`%��e�aAM�.��|�O�@��W�����@A��c�.?���i&��y�|�((����d-��H)h1�]e] 3�[qs_�E�̕����.�2x6�k�Y���}V}��X�Y'�������EeeX�0�B»٤LȲl�-�:%4��5G8��-7���ڶm������]����`�UDy�Lb�����X�_���V��C����w��#Տ׶����1���f3p<�O�@�	=�@<�}q0�᠘��b��y��r�\F�h=tG-AB �h�3��S~p:.�>}A����q�…ӿ�_=
g/����m:��ɍ���T2j�c"�0�nqh[К�`�&Bvi��b}��)�
{Z~��/@�)��u�4v�<�CXx������Bo]�/��H����q��8��S\os-؏j�PrB=��uuT��󡁋N�H����'�{r�u׆������x��t��p��P�[n3�`ad�F������mId�|�h('Wi��4����ݝ����C�W�3;3�ݙ�3�ߦ�^����}dw�rw�-�XT���/-��f���W��& ����"+�X86��jk��y
����|k�|Kw7{�<�T�Y��߂(��ĺ�z�]�������?��'R,���8�Q�pp��ύ�]O�;�C#�a��۷V
U����W�|q2(�g�u�(%���
�G�xU��A��#�e��^^v�'�u���#R�,��#mj����h�#��+#�tMeM��^��nߘHl���`k���f�.?�6JG��.�l��v�;8AzTt��$��/oҧj�M+>%8�h�)��qi=�."�F\*s1�Op�ֆ���˒�i1IMrK�AS׈z����s�^I��/-/���}�(��d����I?"�d��ɭd?9_�Y���d��Dž���С��KN��|�Z{.�t;2��i�V7�t����#���jv��m^hnm�M�榹
��@,,����I0pk{<����������Pp�ǫ�����ݳ�R��(zz�鎎�����n۳�}{+�Vnݽk�<Y�e������Ķ�㛇G�GK#CC����bO�'ߛKg���LGWGW�3�����Ρ��i�j��Mʆ=�0�u�M��%xj�����̠�O2����Q�&�h�|�ve�v��d�X5H
��s�N�
�^�\��ކ�r=dQ�e�U�Ć���4��ѩ���N�$y�(��^��J�4�/��
8�Q^��5���p�r,�R�0Oa���Z\-�;� 4��B+���qz�X-s�����2�7eup��Ǝ1�/-U����b;����X��s���*\�
}�.ᯒ�nd�YL�TW�
V\�Gə�gDT�LgnO��8�[A�ic����hAs��<G����o�C4`m�X�H3i�!����A��������8��918�䍒��yY�A�%������?��|�u��_�!������e�w�����������;\Π�I���v�F)'�K��c�njB<��B�y+Ȃ ��Af��,L���(
�3]�ҩ�D��Eu#�F̑��XZ]O���Z=/�m}F`b5ņ�!���N��Ҩ.���ڟO��;�I(C3��pߦ��;p���<��d���������LX�ר��pfG�/���5��~/i��x���"�Cz�H�"��.�Y�o���$�E��%�x�Y�4YZ7�J����S���;��kC��1.���D���8kcZ;���_b�(T��"�̋z�d�P�C���R�l�]��T&i�n.`���P�5,�~�܍�o�����C7Z��r�xc�VrB�I�,W�ɪ�f��̺&f֙@e��0��q�[���Ğ�*���z�t߉��	q��~5~0T������7�aF�jR숦��3�2q[���:Cš#۸Ǘ���-���2�������s����+�kd��������qk�	�h��u�_�0[��0]ѿF��l_wc];�R�*�[�����#�q@����%�!�iF�-��ϟ�?�N� ��(�_3�*���R��yw�ǯ7�k�E VT���vpB	'pq�j|F��-��c�u�����
�������3���ã�]��Ó,�RR�7o�zu��Y��Z��H����ky�}�ՠ�
A&/�^8���[Ͳ(>"�:*xp0O��N�K�7|Ա��?���!�%�h�=�~�Bp6ܒ��#��9EE�vsa����D}�iC�L]V]�XՕ��h��:����мѭp��3f��++���hA���e��l�Ckg�<L��7�S�;����}wSY�Ʒ?⯂�mA��i�CE���\����e�$ϣ�S� ZD�� ����=����m�.
w$[��}v+��մ@��wf�BD��4��@�����eD��!`�a��
G5�J��V$��,��B+w�a�����܂+K=͚�<t�ȉ9���͞)�vG���f�M�c�~���	hw�!P�iai�D����ָ֝;����4s�E<0'Z�f[L[8���3�h�ڢ�d�$��v՟h׭)-䊫�@"WRZ[\��L�K����6;�xfU�3���C�a�]u�&Z�l�Ä��M���D	*���h���;��a}N
�'�ax�A�<����(Y
ר�����XBJ��Xޝ�.��	��+*x����Ss:���<�z��/�=������ե��
�����#g~��OB�K>���g~��|�����Ұ��� �њ��g.4�p�`�s	��2�Z�5"�f�hf�Qv����ԯ�����V��ꃺ?Գ�_���o�%|{�N݇8{��S���ECT�GR&N�9�t@��-�I��E��/%��t��KT\dIޜ�x&U�$�{�ĩd;��
�}��������'	HN�XK�DkD5���j{��)�e_!��C�7�����KΏHi���\S(�h"?�*�ԓrө��f��m�
���7��sC�p>��C�fu#�7�Q��Q��	����o��b�ܚE�S�~��@�s(?�.�l��A8�/�O��r�eĝ���c(<�kKR�ď�P�D$�ROh��1�*{�}yp�"#�~�X��X#,��s��;��>u⾓�-�u�;��EZ�n+�q�������k�m;�`�zk�@̀�X�P�	��R��>j( �#�C��G�
B�Y�#��Fb��m\��j�޸�.�%��ܷo-�-f�՝�<�&����n���׶��P�m�_uwY=VY67qR��P4.%�M��l�;�)�`B�a�j�ʼ�c��E�Y��@k"�����&}���[$���(g��M1M����ŵ���	(�vϧ��E�R��sΦ!G�����--�e��~Ɂz��7[;@�)1a�!Z�9�`+B�ar{�-�U�ŭ��bT���X4��gZ���a�ƹ�25xɓ��8�e�X⿈|�eI�,Gv�}��c���ͬz꘽��L�d
��-7��[�8�XK����3(�juD�W髙L�ʮX��V��ں7g+F�Zs�_��4X��X�ښR�򽖀�uwkF�pWkv}^�H�F��|�6��2H�s��P�,��Mk��$չ�bA��̔}:2Î�[�'�	Yj�3���*�e;���口rOH9Ic��\^H�`B3���w�8��œ�'�}�$U.�`_��9���8y���3�O>qrO�k�컍� B�j^0"K�ԙc�%��9�+�j6`��a����A�coq��C����}X�dI3*}���b-�I?/��)�;�g��Z!^���Ӕ��9������7�Q��F��.�.�J�l.���ZQ�s�/7�����0W��G]{�?q�}��Ҍ
�<��ńZC_1��� !ⲃ1�=�����3�ړ�}~�p'�����_��l~���g�m��o82�X��gj���x��y�Y¥1�7g��1��~`7��J�T���r�����/p
ۢ�;��%�;��i���z}#g�0Dv/��{�����w��:?��E�j�6���6������<[0|h >�xβz���kbl"R��u����#��E|�7|ܾ�O
�©��N=?��iz�S��ʙ��x���	��1�xb,��[͚Zͤ��d����X]��i@>sf��vI�W��'k��,��!K,�l���T���^c�]E��m|����b��(R���'��d�Gc?�9��8,W�^���n�7�T�p&H��7���o\��f����XO��S��z�FNHH���ކ����}z�F�l{��W}苓���ml^i驈榯��?��#OoC��/�=]}����J�q^��}%ȥf
#�ȁ����U���j���E{�w9h���ˡ�n�cv�Jn��mX�M@<"ʟ�4�q���#m�?�pؚ�뾶/�XK�B�bo��=i�oT�@a=Y�"	&��V��.GQ�k��v��������ŔY��Wn�������7 E�71�;��{u�5aТ9e���@�YF�m|��"5=��a&o	7�z�N�'���n'j1�
-.��7���O]����=^5��{]���Nu�'c�@����ěGظ��i����y�o�ڍ�F�y��a'�I��4��m�̳� �X�7d,���7�F*8s�(�	a�-����
y�"��?5r�ѝ�%�	�5�W#;�C��T[[ڎt"ݵ����So�'�޽Q[�ZbIi����)���J���a[m$N2h���#�Cv��	"/�9�p��sG
O�����Ϲ&+g�k�Ѐ����D0�&�P��h���/ۗ�Ld�3Z$�U��Lڠ͹���NFJc�|��<��88��B�Q�|̵J���&�J�u���`RQ���d�/�\lmo�K&�����/���k����G�ݺ+��$�۱�7أF���vҗ\/�9�A�JM>���x}؇���Hد8y�;u%�f�uU�3K,Q�
���D����_o��R�mS�Mn�L��n����=�����ӥ��=S�R)Vs�����;+����m����kux�c`d``��W�9���|e�f~a�z,�A��������	$
k��x�c`d``��$_00�IFT]P�x�c~���<��
�Tu*V���(�v�>�V
n��:h�6�		Z	�
&
�b�
4
�
�B��Z��P����J���^��Bf��������p�$p����>r����B��,R� E\�z�s/px�u��J�0�O��@E�[s%���ɼћ!���vmG۔4�5|Ɨ�Y<m3��
m~��N�_��{�QU��C-��?X���,��_-7p��rxgQ?�Z�ò��8���qe�F��r�<���K�l���g����-7q->�*��(���d����F*ZQ���]�P�\��B�Əc�x*I\��ȍ�~��]���y��<R��:���觾&���u�3f!Z%rb��L���'4&�ۿ��
6ЈxU!$n�8��A}Ҝ��UU�.b:.V��+9���*��"&;�M8��-z���c*�guW�JΩ��ۭz$�������9�<�G�0a�R��$&;y%�X[���;���9���o-ꃱx�mR�r�0�J�H;qz�=a���{��
E�@�@������x&x vq�;���tu�_h��m���A=�1�Yl�f�a�b�cvbvc�b��������N�N���b��\�<.�2��*��:n�&n�6��.��>�!�1��)��9^�%^�5��-��=>�#>�3��+��;~�'~�7�r][L�0̴'&mVe+&�%)��
I����A1�O�a&$5M8��<4d�6ĸ.WZ�rA�XG�\��I�R
�8�T�Q*\g�|(��}�7�R=V�NBe:�e_��01<#b#A�N������$K_Ί�ĤPö�:�Ym\d���b�d���R��A�&�]ʄ�
x^贝pN�c�*�Z�E��nVIi�!R�J����ҭ�J��Ju�4����)�$Tǒ$�)�S����
5"��|�d
U�&��v���t&’EI��+ee�ZW?�*��Ӵe�d�].���@끤�x�"�jZu�6*��pI���H��(�}jЫ�^�z#���3K2^W;���:��G�^k�By�gc���~��|l7R���C���*{���t��I�j�ȩ�<73��T��q"�g��E#�[�')s�˩���]�F�&C�x�c��p"(b##c_�Ɲ�X�6102h����9 ,>0��i��4'����ffp٨�����#b#s��F5oG#�CGrHHI$l�ab�����uK�F&v#�themes/dark/icons/material.ttf000064400000056730151215013520012410 0ustar00�pGSUB �%z�TOS/2> I�PVcmap���\cvt �Q� fpgm���YQ�pgaspQ�glyf3Qk@�head��H�6hhea<�H�$hmtxg`H�plocaRJ\�maxp��K namew��K8�post��N�prep�A+�]P�
0>DFLTlatnliga��z��z��1PfEd@��ZR�jZR�,,
��Z�����	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[T[������������������	�	�	
�
�
����
�
�
������������������������������������ � � !�!�!"�"�"#�#�#$�$�$%�%�%&�&�&'�'�'(�(�()�)�)*�*�*+�+�+,�,�,-�-�-.�.�./�/�/0�0�01�1�12�2�23�3�34�4�45�5�56�6�67�7�78�8�89�9�9:�:�:;�;�;<�<�<=�=�=>�>�>?�?�?@�@�@A�A�AB�B�BC�C�CD�D�DE�E�EF�F�FG�G�GH�H�HI�I�IJ�J�JK�K�KL�L�LM�M�MN�N�NO�O�OP�P�PQ�Q�QR�R�RS�S�ST�T�TU�U�UV�V�VW�W�WX�X�XY�Y�YZ�Z�Z[����
%@"Eoof

+5333	3���}�_�_}��Mw����-�(@%GEDRVJ+!7'	7'!-�%�8��86����7���6�-�'@$GEDRVJ+!!�6�#��89�7�P�68-�@Ef+%#'	'R�8899�&��89��8���@oof%5 +#"3!2654&#!��#11#�#11#���1"�"11"�"1��k�GK�PX@#cmnTWK@"omnTWKY@
	+%!"&546;!2!!�!//!�O!.�fU�Z*#/!�!/P.!�w:��!�j��GK�	PX@(ec`TYMK�
PX@0mkk`TYM@*mk`TYMYY@!	+!2#7#54.#33!'!"&=3b=r��s4�;�s5M=��sgK����5(��5K���ZK�PX@c_RXL@o_RXLY@
+%!!5!'#"3!2654&A�f���S�#11#�#11d�SS1"�"11"�"1���K�
PX@-oec	^RYM@/omk	^RYMY@	
+!'#"3!2654&##5#53533A��S�#11#�#11L}T}}T}XS1"�"11"�"1��}}S}}��A���GK�
PX@0	ome
^RYM@1	omm
^RYMY@+3'%!#!"&5465##33535���M�1"�"11�S}}S}��?��#11#�#1��}}S}}S��9�	^K�PX@$cmnRWK@#omnRWKY@	2+73!265!%#'##!�6&r'5��Z�.�-��'56&,�..\����	
H@EG^^RXL




		3	+#!"&'!535'7��1 ��!1�hu^u�Y������	 ++ �X�n��ů�Ջ������)2O@LGm``TXL10-, 
	))	+"#7#47>2#"'3276764'&'&4&"260aSQ01w��w&%�@?%&&%?@KSM8-p=aTP/11/QS/B./A/�1/QS`��L@?J&%?@�@?%&48$%1/QR�SP/0��!./@/.��\�>@;m^^RXL		 +!"3!!"3!2656&!!��:,K�p�`,,�,, �`��,��M,��,,,������"+4=B�@�?@
	
GA"Fm
	
	m		km`
``
T
XL>>65-,$#>B>B:95=6=10,4-4('#+$+$%+654."327&#"2>54'735"&462"&462"&4625�-MZM--M-'bb(-M--MZM-b$}�e"11E00#"11E00�

�S$(-M--MZM-bb-MZM--M-'b��*�1E00E1�1E00E18

��S#*��J�&N@K`
	^^RXL&%$#"! 
+#."#"3!2654&!2"&46!3!53��:J:�,,,.�� ��K|K�!**!,��,,].  �T_ss�����-+���\����-��*5���V�'5CK�@1
	=G"FK�
PX@N	e
		
ee^	
	^

```RXLK�PX@H	e
		
e^	
	^

```RXLK�PX@N	e
		
ee^	
	^

```RXL@P		m
		
me^	
	^

```RXLYYY@KIFDA?;8530/,*)(''#3%6+'&+54/&#!";3!2654!;!5!2653;;2656&+"32+Rs4s�����jI
Y��KYv


�sr��\�y^\
��\�[
��Q����%.26s@p#G	`
^^
^TXL33&&363654210/&.&.-,+*)(%$!#!"!%!+32+327;5#"&=3#546;5#"&#!5!5!53#%35�SSS0$$/SS��SS/$$0����M�}}�6��S�S!!S*�*S!!�)��S�SS��TT����@
Gof+73'64/&"27S��2l&
U�*j��(&
lU�+�z,I@FG``TXL! '& ,!,
		+"27>7.'&".4>2"2654.�]UR}  }RU�UR}  }RU]3W44WfW44W35BbB5y$#�SS�#$$#�SS�#$�'4WfW44WfW415 1BB1 5��J�
#@ Eooof+%!3	3!!`&��������R�&X���xb��L�
3@0GooRVJ

+#!#!5L���X����&���bbb����-1G@D`^^	T	XL10/.$#--
+%35#"276764'&'&"'&'&47676235#�TT*ra^7997^a�b^7998^aqZNK,..,KN�NK,..,KN�TT��w97^a�a^7998^a�a^89�.,KN�NK,..,KN�NK,.�S���� A@>Gmk^RXL  83+'.#!"3!2656##5#7!�A
��	A6&�'5�^����?&,,�MM��'76&C��\\�..���� ?@<Gmn^RVJ  83+'.#!"3!2656'35337!�A
��	A6&�'5�^������&,,�MM��'76&C��\\E..��#'+/l@i	
^
^RVJ,,,/,/.-+*)('&%$#"! +35#35#35#35#'35#33535#35#35#35#35#35S����ۯ�ݯ�ݯ�ݯ,���m��ۯ�ݯ�ۯ���w�����+����w��v������������A@>
^^	R	VJ
+735#35#35#!5!!5!!5S������L��L��L��F�(�F�F��������-N_@\		m		k
``^TXL/.CB6532.N/N$#--
+%35#"276764'&'&"'&'&476762"34623476767654.�TT*qa^8998^a�a^8998^aqZNK,..,KN�NK,..,KNZ-M-T1D1

T 
-MdSH98^a�a^8998^a�a^89�.,KN�NK,..,KN�NK,.G-M-#11##$-M-����!%48<@IMQ�@
10GK�PX@s

em-e&%$#"		^('

^)^+*^,^/!.R/!.Y M@u


mm-m&%$#"		^('

^)^+*^,^/!.R/!.Y MY@NNJJAA==9955&&""

		NQNQPOJMJMLKAIAIFDCB=@=@?>9<9<;:585876&4&432/-*)('"%"%$#!! 

		
0+"353533533533533354&#35!353#;57335!3535#326=35335�"2T)TSSTSST)T1#�T�T�����2"��T��T�TTTT))#1�5TSS�1#))TTTTTTTT))#1�SSSS)T��"2��N}TTTT�SS�)T2"))TTTT�.,>@;
`^TX	L'%$",,!%!#+4>;5#";5#".!5!%#32+32>4.�#;#��9`88`9��#;#�N��w��#<##<#��9`88`^#;#O8_r_8O#;T�O#;F;#O8_r_8����)>@;GD`TXL$#)))+%#'6765.'&"32677%".4>2�%
#SFH�IF)++)FIT9h)�G��;b::cub9:c�*268T�)++)FI�HF**'$
%�G�:btc::buc9��a�
!k@h	GEDop^	^		R		V
	J!! 

	+7/##3#'3/#55#5!3�����t _}z�d�\
�¯&��{���Ƅ��n��j�U((((��4M6��M��R� &+@(E"Dof%$+'5.4>7&'67'767#��V�())(�W>d::d>�
:>�cH?2q>>	Z7Ȉ
bKN�MKa
Z
Jp�oJ
�,bI?,@��Z8?#a>QZ6��R�*$@!E"!
	Dof+'36#7&5&'55>764'.>>	ZX
:>$$L_<0���>ee>V�())(��?QZ7�bI>6�9Z
$ S��ĭ
J79�87J
Z
bKN�MKa����'F@C
o	oT^XL!
	'&+2+32!!+"&5!5!46;5#"&5463�#11#�)$�����$)�"22"�1#�`"2SSSS2"�#1���!.*@'#G`TXL/*+6'&'.7676%67676.'.�76]`�b_9;76]`�b`9;�/.LNZ9h)�%!"~�!"/-LN[9hVqb`9;76]`�b`9;76]`[MK*,'!�6+h��+j9[MK*,'��A�/@,GpTVJ
+!"3!2654&3'�"11"�"11���hh�1#�f#11#�#1T��??����@

	Df+%73%'}��7#�6��Ĕ���.S�wN��q�S�k��f����"@Gof
+"276764'&'&'7�ra^7997^b�a^8998^a��;�<;�97^a�a^8998^a�b^79���:�=:�s2@/^^RVJ+7!5!5!5!5!5SB��B��BI\�\�\\��@of+%3#3#!3y�����L�~��~��~����H@E
mk	^RVJ
+7#!5#3535!#!#33�w*�ww���˳*w��w��w��w�5w*w�*����C@@	op
^RVJ
+733!#!#3535!5#!5S�v�ִ�*vdw���ww*q�*ew*���ve���w��-�@GEof4+773#!"&-*��+�:���.3$��$4�K0KMl<��
���$44����0@-GE`TXL)!%#+
532#!!276764'&'&+w��$�4V11V4� �`RQ/00/QR`����}1VhV2�00PS�SP/0����0@-GE`TXL%!)!+#"3!5!".4>;%q�`SP0000PS`�!5V11V5�$�}0/QR�SP/1�1VjU1}�����GT7@4$?2GooofIHONHTIT97+654&57>/.&/.+"'&?;26?676?6&'".4>2*XSh*�#$hSZXSh*�#$hS�n(C''CPC''C6
E�*l

n*�DD�*n	
n*�$'CPC''CPC'��>@;Go^RXL	+%5#535!'#"3!2654&G���)��S�#11#�#11d}�}�$S1"�"11"�"1����!%)-159=AJSW[_�K�PX@v

e9#8  e.-,+*		^10/

^432^765 ^<);':%!R<);':%!W(&$"K@x


m9#8  m.-,+*		^10/

^432^765 ^<);':%!R<);':%!W(&$"KY@�\\XXTTKKBB>>::6622..**&&""

		\_\_^]X[X[ZYTWTWVUKSKSPNMLBJBJIHGE>A>A@?:=:=<;696987252543.1.10/*-*-,+&)&)('"%"%$#!! 

		
=+"353533533533533354&#353!5335353!5335353!5335;5#5!#326=35335335�"2T)TSSTSST)T1#�T}�}T��T}�}T��T}�}T��2"))�))#1��SSTSS�1#))TTTTTTTT))#1�SSSSSS�TTTTTT�SSSSSS�)"2T))T2"))TTTTTT����#'+/3�K�
PX@>e	e
^^
R
YM@@m	m
^^
R
YMY@'3210/.-,+*)('&%$" #!"+46;##%#5#53253+5!533#"&3#3#3#%3#S2"}}TBT}}#1TT1#}��T}}"2N�����TT�TT�#1T}}}}T1�C}}"2T}}T2T�fT�����;�@�opR	^	
	
^^^
^R

^VJ;:9876543210/.-,+*)('&%$#"! +33533533533#3#3#3##5##5##5##5#535#535#535#53�\[\\[\\d\\\\\\\\[\\[\d\\\\\\\\�\\\\\\\\[\\[\\d\\\\\\\\[\\[\d��3�",1T@Q`		^
`RXL.-
	0/-1.1,+'&	"
"
+%264&"#54."#"3!265.%4>2#!!�!..B..(5[l[5'!//!� //�w!8D8!�i�%݃/A//B.gO5[66[5O/!�u!//!�!/O"8!!8"O�#��u��3�",C@@``	T	XL)($#""

+#54."#"3!265."&462#54>2�(5[l[5'!//!� //��!..B..Z�!8D8!�O5[66[5O/!�u!//!�!/��/A//B.gO"8!!8"��3�*/[@Xm`		^
`RXL,+
	.-+/,/%"	*
*
+%264&"#54."34>2!"3!265.!!�!..B..(5[l[5K!8D8!��!//!� // �%݃/A//B.gO5[66[5"8!!8"O/!�u!//!�!/�#��u��
@E
Df+	>3����p'X��uE� ���zr�����=@:

^^	R	VJ+#535#53#535#53#53#53������������������C���������������-+'			7�T����TN��TMMT���T��NT����TN��TM����)@&opRVJ+!#!5!3!���v��evg"��evg���4@1GEpTXL
+"'!'>327.'&PJG9�o�+k;F~[`wQT�3����%(:fAU�%&��@RVJ+!5!���B$v����(�K�PX@8oo
	e
^TVJ@9oo
	m
^TVJY@2! %$ (!(

	+!!3353353353353353!%2"&46�TBT�B�)**)**)**)*�6\$$4%$�����$STTTTTTTTTT}}$6#$4%��A�8Tm�p@mD9_UznGF`{F
```	`		T		X	L��usgf[ZNM@>*)88+"32>7654'.2"'&'&'&=4767>32676?"'.'&5 76?"&'&'&532676?"&'&'&5�}b2## +ez?r^##\r?640$

#dm40$

#d�	b}?r.	
&#03p30E
_^


%#brb#
b}?r.	
'#brb#
�('(�,# &''&�,#&T		

	
		

	�	(	7
				 
o''6


p(6

����@
	-+%''%5'
7'77'���^�����_���M���{}}8<��<�������&�����������A@>G	F
DooRVJ+%!!7�����
����������1'����E���Z'Aq@n$ ?,	Gm
mkkm	`TXL)(><9852(A)A#!''+"&#";'&5467>32632."3!264&#4.#". 7^ !%=#'5=,S2'3M,)H6VB(D(&3=+�&44& 7 CZ;/$>$
;),<+F+H)!2S0�(D(:'+=5J4!6 
 '��%gqz�i@fMB�oUF)�2G5Foooo
	`TXLsrihwvrzszmlhqiqKJ?>43"&+&'&'.'&'&#";767>/.7&'.=46266?>&67667676%"2674&3"264&676&'&�75M
03A?56

((0
|N�<S*i@1-
+^=$1!@)-10%f+	

-�'%8%%�''8'(OmD%#	7#&#%<	V`.IYF6~�=
.4.7!�T
*,'	

;	&�&7$#&&6%$5(
7!
����5J@Gmk`^RXL0/,+)(
	+"276764'&'&#537#54?>54&"#4>2�ra^7997^a�b^7998^aGTTU%	
T04
0E1T-MZM-�97^a�a^7998^a�a^89�;T�%,B54#00#-M--M-1����`@]	
GEDoom	n
R
VJ
+353'3#5535'#3'##7#��s��s(r��s�rr��s��s�r���s��s�K�s�sMr������
A@>
G^`TXL5 +!"3!265".4>2!5!��%76&�'5�a&@&&@L@&&@f�/��6&�x'76&,��&@L@%%@L@&ѹ���"�%D@A
GED`TXL+7'"7&5&>#552767654�RGD()08<i=8=i=��RGD()Ar��s)(DGRZF819<h=C819=i=r��s)(DGRY����7@4^^RXL
+"276764'&'&#535#53�ra^7997^a�b^7998^aGTTTT�97^a�a^7998^a�a^89���SS�����-+'	7�d�`�b���b�_�_b?�����-+	Vb<��b��b����b�����	"@Gof		+'!'�_��������_��_��������
�-+'%'77Z�v;bv��[��v�;�w��v��;v���:w�;�v���� (@% Gof
+2"'&'&47676'77'7�ra^7997^a�a^7997^a��:��:��:���97^a�a^7997^a�a^79і�:��:��:������3@0GmnRVJ+35!333535�)�`)S�B�^MTT��ST��T���-+%'	'\�C	9C��E��9C���@Df+'#'�"K�h�IC"I�z���K���@Ef+	737���H�h�I���I���z�K�G@of1+&#!"27654��&m.l9-��o�G@of6+%4'&"3!26���.��
��o��+��s�	"@of		+###s^B^��_�_B�_�_B����"@Gof
+"276764'&'&77�qa^8998^a�a^8998^aq��<��<�98^a�a^8998^a�a^89��<��<��J� ;@8EDopRXL  +67676=#5"&463121�-,MOaaOM,-��K%���ha_CDDC_ah�i��(����
,@)
Eo^RVJ+#53#53!KKKK�9B�_���K������@of+	&"27654��,.m�l�&m����
@of+	62"'&4m,.���l�&m.����&/8Ah@e
m
kp`	T	XL:910('>=9A:A540818,+'/(/#"&&
+"3264'&46;2>56'&'&"&4627"&4623"&462"&462�qa^8998^aq))Q>k?97^a��))8))m((8)'�))8((m))8)(�98^a�a^89)76)>k>eWU13�_)9()8)�)8))9()8)(9)�)8))8)����*-@*GooTXL"!+#3"'&'&5467'2767654'&"\\�C8 ,,IL�KI+,?8AD&(98^a�a^89(&��1kC.@BJXLI,,,,ILXK�,C;QT]qa^8998^aq]TQ��!d_<����m{��m{���R�j��\��������������������������������������������������������������������������������������������*V���(�v�>�V
n��:h�6�		Z	�
&
�b�
4
�
�B��Z��P����J���^��Bf��������p�$p����>r����B��,R� E\�z�s/p�55=DLT_
+g�	j�			-	=	M	c	
Vs	&�Copyright (C) 2017 by original authors @ fontello.commaterialRegularmaterialmaterialVersion 1.0materialGenerated by svg2ttf from Fontello project.http://fontello.comCopyright (C) 2017 by original authors @ fontello.commaterialRegularmaterialmaterialVersion 1.0materialGenerated by svg2ttf from Fontello project.http://fontello.com
\	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]homebackforwardupdiropendirreloadopenmkdirmkfilermtrashrestorecopycutpastegetfile	duplicaterenameedit	quicklookuploaddownloadinfoextractarchiveview	view-listhelpresizelinksearchsortrotate-rrotate-lnetmount
netunmountplaceschmodacceptmenucolwidth
fullscreenunfullscreenemptyundoredo
preferencemkdirin	selectall
selectnoneselectinvertlockpermsunlockedsymlink	resizablecloseplusreturnminushddsqldropboxgoogledriveonedriveboxhelp-circlemovesaveloadinginfo-circleprevnext
ql-fullscreenql-fullscreen-offclose-circlepincheckarrowthick-1-sarrowthick-1-n
caret-downcaret-upmenu-resizearrow-circletn-error
warning-alertcaret-right
caret-leftthemelogout��R�jR�j�, �UXEY  K�QK�SZX�4�(Y`f �UX�%a�cc#b!!�Y�C#D�C`B-�,� `f-�, d ��P�&Z�(
CEcER[X!#!�X �PPX!�@Y �8PX!�8YY �
CEcEad�(PX!�
CEcE �0PX!�0Y ��PX f ��a �
PX` � PX!�
` �6PX!�6``YYY�+YY#�PXeYY-�, E �%ad �CPX�#B�#B!!Y�`-�,#!#! d�bB �#B�
CEc�
C�`Ec�*! �C � ��+�0%�&QX`PaRYX#Y! �@SX�+!�@Y#�PXeY-�,�C+�C`B-�,�#B# �#Ba�bf�c�`�*-�,  E �Cc�b �PX�@`Yf�c`D�`-�,�CEB*!�C`B-�	,�C#D�C`B-�
,  E �+#�C�%` E�#a d � PX!��0PX� �@YY#�PXeY�%#aDD�`-�,  E �+#�C�%` E�#a d�$PX��@Y#�PXeY�%#aDD�`-�, �#B�
EX!#!Y*!-�
,�E�daD-�,�`  �CJ�PX �#BY�
CJ�RX �
#BY-�, �bf�c �c�#a�C` �` �#B#-�,KTX�dDY$�
e#x-�,KQXKSX�dDY!Y$�e#x-�,�CUX�C�aB�+Y�C�%B�%B�
%B�# �%PX�C`�%B�� �#a�*!#�a �#a�*!�C`�%B�%a�*!Y�CG�
CG`�b �PX�@`Yf�c �Cc�b �PX�@`Yf�c`�#D�C�>�C`B-�,�ETX�#B E�#B�
#�`B `�a�BB�`�+�r+"Y-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�	+-�,�
+�ETX�#B E�#B�
#�`B `�a�BB�`�+�r+"Y-�,�+-� ,�+-�!,�+-�",�+-�#,�+-�$,�+-�%,�+-�&,�+-�',�+-�(,�	+-�), <�`-�*, `�` C#�`C�%a�`�)*!-�+,�*+�**-�,,  G  �Cc�b �PX�@`Yf�c`#a8# �UX G  �Cc�b �PX�@`Yf�c`#a8!Y-�-,�ETX��,*�0"Y-�.,�
+�ETX��,*�0"Y-�/, 5�`-�0,�Ec�b �PX�@`Yf�c�+�Cc�b �PX�@`Yf�c�+��D>#8�/*-�1, < G �Cc�b �PX�@`Yf�c`�Ca8-�2,.<-�3, < G �Cc�b �PX�@`Yf�c`�Ca�Cc8-�4,�% . G�#B�%I��G#G#a Xb!Y�#B�3*-�5,��%�%G#G#a�	C+e�.#  <�8-�6,��%�% .G#G#a �#B�	C+ �`PX �@QX�  �&YBB# �C �#G#G#a#F`�C�b �PX�@`Yf�c` �+ ��a �C`d#�CadPX�Ca�C`Y�%�b �PX�@`Yf�ca#  �&#Fa8#�CF�%�CG#G#a` �C�b �PX�@`Yf�c`# �+#�C`�+�%a�%�b �PX�@`Yf�c�&a �%`d#�%`dPX!#!Y#  �&#Fa8Y-�7,�   �& .G#G#a#<8-�8,� �#B   F#G�+#a8-�9,��%�%G#G#a�TX. <#!�%�%G#G#a �%�%G#G#a�%�%I�%a�cc# Xb!Yc�b �PX�@`Yf�c`#.#  <�8#!Y-�:,� �C .G#G#a `� `f�b �PX�@`Yf�c#  <�8-�;,# .F�%FRX <Y.�++-�<,# .F�%FPX <Y.�++-�=,# .F�%FRX <Y# .F�%FPX <Y.�++-�>,�5+# .F�%FRX <Y.�++-�?,�6+�  <�#B�8# .F�%FRX <Y.�++�C.�++-�@,��%�& .G#G#a�	C+# < .#8�++-�A,�%B��%�% .G#G#a �#B�	C+ �`PX �@QX�  �&YBB# G�C�b �PX�@`Yf�c` �+ ��a �C`d#�CadPX�Ca�C`Y�%�b �PX�@`Yf�ca�%Fa8# <#8!  F#G�+#a8!Y�++-�B,�5+.�++-�C,�6+!#  <�#B#8�++�C.�++-�D,� G�#B�.�1*-�E,� G�#B�.�1*-�F,��2*-�G,�4*-�H,�E# . F�#a8�++-�I,�#B�H+-�J,�A+-�K,�A+-�L,�A+-�M,�A+-�N,�B+-�O,�B+-�P,�B+-�Q,�B+-�R,�>+-�S,�>+-�T,�>+-�U,�>+-�V,�@+-�W,�@+-�X,�@+-�Y,�@+-�Z,�C+-�[,�C+-�\,�C+-�],�C+-�^,�?+-�_,�?+-�`,�?+-�a,�?+-�b,�7+.�++-�c,�7+�;+-�d,�7+�<+-�e,��7+�=+-�f,�8+.�++-�g,�8+�;+-�h,�8+�<+-�i,�8+�=+-�j,�9+.�++-�k,�9+�;+-�l,�9+�<+-�m,�9+�=+-�n,�:+.�++-�o,�:+�;+-�p,�:+�<+-�q,�:+�=+-�r,�	EX!#!YB+�e�$Px�0-K��RX��Y��cp�B�*�B�
*�B�*�B��	*�B�@	*�D�$�QX�@�X�dD�&�QX��@�cTX�DYYYY�*������Dthemes/dark/icons/material.woff2000064400000026720151215013520012632 0ustar00wOF2-�]�-tTV�\ 	�p
���6$�p�: �M�-��U5��2~��{�ڣADŪE�dm������!̂9M�!��<f0�n���H�f=X�m���b�:�e\��c�!>� �0��7�0�E��W�[��g�$R,I�%�ӳ_��Zvka90t?��v�fP�J�����*j2�F��L��s��ң$�_֔��%4���x`�[�m#��M�����uZ�2Lj%���rښq�� �d�ٺ-���R�Rr�+�w���
��S	�JI� @3~���j�%r�U�mF��IK�AL�&�����^ࢌE9�+�"�o�Õ��tk<��wz�P6����NC`��G�+e�jVy҅ȨO	�,%SQ����F����4@\�������i#�������IQ?i6���Y��A�i8t�6W�^w׮JW��6��k�;����y&�Ѧ
�$�B4O�B$Y	RY]*�n�*@�b��CUӛ�|�v���ɲ��v+z��<���K�
a`'$l�y3�͓{�:��͡t��I��̑S���H`7�8z������⤭"�#���?������H^.�
�*5W��g�$�;��^�{"%��#�����`;��!��,r��[�ؔ�j�[�)���S�HZ&�v�\�PD��K�S�����D��-W����ZX�����Љ����l�5N�!���a�$.�E��V�(����Z�B���ރ��7l7$�Bwr�\�bqZ�JC�����Δ vv���]<�,/+���̌$R�\�������U������[XZY����;8:9����{xzy�����I�fX�DIV��I5[�6���r{w_�:,���HB� ��,D"Q�(B� ��*D
QG4MD�х�F� z}�~�b1�F� Fc�q�b1��F� fs�y�b��XF� Vk�u�b���F� v{�}��q�8F�@�B�A�C\@\B\A\C�@�B�A�C<@<B<A<C� ^ ^!� �!> >!� �!~ ��jϕ_F��
 0�G#$��&Yz����ωܖ�O9Q��
�_T�wh�{`��x�Sb��N��4�<��M'[_�7��{�����8Q��K?Y-�S��	!R�E
}Q� �{��s*̅f�X)�B�dFq`�l�t:�9��:��)��o�Ŷ3��_G��F!��! Y��!�ţ�R/�FK�}�m����VN�3{K;�zd��B��Ѕ
N�b�xc�\O�_0�_B��:���ҮJW`)��el\��A�-u&��SC����At�^4�4&Y`e���maҞ�V�կFZ��W��گH�y�i��'����> ��J�~1(�哐�mQr����'�,��
(*z��GK{$g�PQ��E�x�����ovP�n3�۾b:��io^C��M)k0XD����c��X��J�Q΅z�yM���"�c�eA~"�pA� ��t�X�O��^���1(�1 �q�6�2׈�I(-j��"ST�ߪ�<(h�~�_ӈr�J�h����0B� ��!�B�Y�E �"D6E�슸�`O�hvbv�A�@=@�@}@�@@�@CP
�%YB_A�4j���]�DX�&�	�.��L��X}njj��DV��?�.�~�ZY�z5��t��b+�?o0T���vW�yK����!?=�uq���e�.,��P�y�h�d��N3�+�o����J�:b-�2����P�ҥ�u�O�����TH��9��Z�(��������~��j�lђc4!�z/�[i���.C�K�ʑ���9D�Y�]�V���MǍZ���F�iYi��U�x�ޢ9Hm0�- Azc�j SɁ��S�>�����@隃�":54#������|�d�]$�L�H��x���}U�ҒRk�
�޾@�xV|ae�]�I>NV1u�Xӭ��ܵhYw'P�vm�Kg���BO
�7
�B:��qPuD#��+�X������޹[4Qͣ�W�$�*�\�y�q�>w��)���)x��!��/�7�5�|���H_=�D���d,g�
�`��:M�[kQ4>yFZ<� �xA'@4y&@�N��l:����P��<�`��������[�Q��:�
`�������ޅ"��މI5���?�%b�::̕0�h��c~�N�/��W
��	�/]_aW��k���c��S\�hE�D7���ӥ�
�U����S�y�~w��	2���e��Y�bB��Q�(��!�Q�Bt��XeNܰ�����R�IBԞ3^�k'Yf�Ne4y���u7�P�l�wMi,<�xc6!��'1����јw�U�&����ȿ/e��P�Q��˰�����R��3k�ۙS��fױ3aQ�W������^��$Β}9���-�D׭��l5y�g�'I�Wf�Cf��>#�j6gUf׷5�aW.��L���Ui�2w� k^/Y�&����eOX�ߜ'��Uϗ��@5���P�,2���}��Ŷ_@��|���y��	�$ơh�����z�,�\g:G�kj�b�BBF��~nE5idRv��A�8L���f��!���Kq�a��I��p��TI��Z5t���m���Ikl�(�w~��Vf8C�{�	DG�!_���9it�k�`6_A��:r��|F�K�6n��I��\��1��哌�RVI��X����SH	u��e���T�+Q�J���iMb��b�]�e�ȇ+7vW�a�H�d�wL����e:^�o��1+1xak��`
�Z�����|$��#��@�i���7S�0ډ@����,������+?{Qi��ʉR�r^)u����J,�oEH�k]��t���� �q+a����Q����T��D���u LI� ��lg#Q��	e�'R@��ku_="�����T�E_��HʋAR�M���TC&�b�s̔��ݾ�F:�(���h�j�g,�$}�{�-H�Ô�	��EG6�
	G�'m,��w� �pZ�Z�祝�Eb�X4�\���&'0k��n��br�a8�Zx �9�~�� �=9*xL��md�e/,���0T~��x���������}�.va���������������?HX�����N�g��AR:@;a��I�j3��$�%Ʊ�%����e�����ѝy�W(s9`]�����O8����]KS��oz�(�O=f/��n3�	�27����P6�pU�`�{ܥ-��F�,҄��\%����u�ئ���3��]b�.yB�<�ϳ�,7}~:Cf���K��U@��עጜ�_��/��'
�V}��É#��D�t^"�8M�%]��f�F��
���I߼D8$k~^	?u)�E�VMy�hu�5)�O��m�Q5�a��|���f�Al�H�������k{؍V��$�佋6:�N#�.�!���s�v"����n+����KrBu�h��ٟ��/Uu��jcJ�@ťz
2:�c�;׼�ٍr�k�Z�fֵQ�
Z��^N"��Q��2⢖�}9}��Wo���F�g���vO�W�?��)5�us���k�N�f��\�5Z�1O�p���v�U�A�>{�8���NC��Kw�ʑ�v������m��^��@�z���y��H�/�m�^��s6\IQ%Zh��A��/�Uw�+0��׬���ϸ�ߵ[%=�Lv"��B	���w���O�a�9Iik�T�:m�7A�J��W��?̽�߮�r訟��f��_u��������k���(k�C�}������ٛ�H$7W#�Y����G�PRő������%7�*�)�IB�-��cϋϡ��=��i��;B'�x֋:�����N��V��G�~Z��(A�C��A#���ج�)P:P�����*����R�x)��R�R�{؈��-|XN����`��X=�|/��>\֌X9�.�»U�g�h߻r)A�F�P���d����x_Ni#�	�,Ӈ�o?�C��_FwY%��)�,ig�rY"�\r��	�1.#d�9�ӧ׫ִ-�T��$�CU�XB1/�|K
P[���Y�0�Ǥ��6R\���\��4�l��d�)�g��������li֐fUh����GF�Eb�(���(ݾ%�����gx�XD
������V����e�g2�4IB��"�T��&���_������I��:`Ɏ<e�
Sq�|&{���B.�Ǥ�����
�׾4�*��p��-���T X��P�r
���C���,��ccd��ӧ�<��*�0wnӨ?
����lf^׀��G�i�b���5=�#}����
�(Z������z���./#4��܁��!�-u��X�a��M) edˍJ�	
K�r3�2�����.��ǁѸ	�x�N�m����v�Ҳ!��ٽ�o�t��t[�d��6S�Wmr<�sε����i2��ff���H�$N'�!���E�j�<�<�<
��	�$f���,��^ˮ�2����:����"d9~����
��O�o�;x�r���Q_��wq"��먮���e��<���h=[=1N�+��Z�^׼w�W��:�v���>�����3<�6�9�~x'��5㏙�5�n�	���I/��<�l�9lf^�<{G�VFK?����A�g�=+<7�e�!���4�iE�,>���/�ު�ə�����z��$�|�lB�[dv�Q�ڹ�8$"�#��d�NS�S�7�r���U�����FnR�ԛ)�5L~�5�g��\o�B��86Ԯ�	��W&�Nd��H�D���jG�b�9����k��T������,F��)�.a�[��U��Ӳ�����~�6�=��>ұ/�r��1|.ô�3��cO1��d�C��)ZLO��J��M������9�M���ܔ�+�!��\7��������D{��H@��_m�T�߫{?�ӏ�|�M�����%3`�UR�-�3�� �mi�s�d:|ux��!�'i���pZ��<�/7�:6d�f�$�}z�������5�*1�D�z�M%���>�48��{�g&1��Jj}��.# pm"=��7�9n���L��L�|"#�KJ��.���'%y�G�$S�$?_�d��MM�D,혿|��eQK�/��ˍ�*����W��{zP-{>8�y�����K�QWU�w�g��6��t�q�2û���ꑂTI�bIul�*�L�$e�׿����E^�F[l�[�:�x|Ԩd�����m��+�Y�sv��`���84R�z�����OmD݌��pP�k!!�V�1U�9k,��򟤅�%%I2���B����^�MB�@��2�_\�1��!�\%G�`�Xy��%��O�yK�C�U�c��F.��w,F4�R�H�[�a�B+��Ku�W%�Vp����� �꼩(��WO!2I-6!a��C�����c���@ty��FPъ{�>�쟠l�����l9�lI߉�'N��~�,�=y���<Qxѭ�7h9y���\�cG�#�r/S�B��Rŗ�.�l��z
���D��!�"?+,,��kg���yn��e��<�*���R�ŰZ����s�4s���`��ٞg����0����f�`XD����t�I�CD�ڤ��Ɲ
�+|��Y��b��Q%p�
����]1�n9�0N��{Xl�����B�%�M�@�T*�a5s�D�T`�����{�,��*��sa�O�"���J�h݃6�0D
j�M�'��W�L�����7G����.ZD~���� ���
[��v�<���?qء�j������C��R�l��6���.�ՂJu(�4=�vy�����N���\kj]I��K���e�_��{|Vq���+~�^pu񤲊�۔V��
�5�̦��s��+zk-r潯;|�G���u�{Tvk���Tړ�ϯ��� H��	AФ<�"�$5���<1�J
J
\�a}uͦ����$�D]�g���+2(P(_�I���!��q�3�ł]2��,�F��cv��D���'٤���s�u�CTj��Pz��P�Qڹd�W(ޭ�=^�W�q���O�ׯ#���L4s��a��D���z�Gz-�c�kόb�5SOEꨙ�n��A%��Yoƫ`���˅���]w�䙰��������Z��|�;m��X�����ҽ��m�2�K��e�÷�}�2FLpx<vq������J>��|����'�E��!���P��B9���
��g�����J:��LX��7��(�x�M�x-���4�C�*_I%N��V��:1�*(�P:���}߅��p��psnۗ��,wøʂܴ#1 b})jn�����H:����+�6��+�nĺ:YI��y�?����G�x*�����V��T�{��|�t/jʙ�=3'i�ʋ��E�x1�xx�����AK��8(v+5��I���r5*�tv/	���a`2�#O�t"���{r���{���7\�p�R��%�
�aV���=���Z�?�:����E�2(
���@:U44|n��W���m�(�/	T�[,��%�11@|FlL)�Ÿ��gF^B�ʵ�gU5[4�����"��-u�r�"Vj:��bw��o�|
��Q(I00}�hSS��Uꚵ��$ij��~?��&�Fۏ]סn�M����T�3������8Rc�uHps���-@$�S��J�s`g��{�A &���_:�I�.Η���=�LTVڸ���~>����~����	��G��u����~=�/8���*�84���^��#��U)���+��x����+�c�m,}�s7�+�bo���j��[a
v�}��/��e?l��ї���?G�O��٢��v	-lΔ��z)�P�-�uaƈjKp�d��]ׯ<�*VQ�0�v�-��s�UEl-%:�����`~���sY
VJ��?*L�e�*�K��Q�4HWLjc�t4(4��hڕ��_�u�y�A���v��{ە��J^B�P�qIl1�ͯqm�{��<Y@M@,��e6���Al����he�q	�%Ҍ�zh=��PW+�1A;0ҳ^����f��\a�I`EN�ueW>`$Y�b��w�y-+�c<%��!��x��?����e+�6��l�?c5���a�5���FF��H�}#cg�{S�R ����jzon�
dc�
�k!�����iӾ�I����`��p
B�9"�v9T�N��8�^��N^�o_��ᦒC�]uR���R@��m�k�����8�y˽e�U�
�/�B
s�DU倊~���5ң �����Ԫ��ݺkjb�:�н<����j` �0�)(��R�3"��k>�N������L�;�I��<d��g�sNkZ�M�
C<<���]_�6��[�p�S�"��@s����n~�a�5ҡh�kj߉)��T!le�-49��iw�
���@��/ r�El��<CMv-I\Kg��K��������6��0�=F	��	n�M���֘k��W�#�alθE�ZsPBqR
Y)���4�ٮ��
!]�Vcw$V���eW�����Q�3��wه^�o	q!�^�_gb��
��i_�d��׌rH0�F�B�t�
N����f�Jd7-]�j}�ѷҸ��,_Ś
#�9�DBZ䄻�7?�;��V�*O�������bG��*�}��>�1�j�DI�g.Dȭ.�LB`kRLZ�7��K'�����dmn�:��p	����t�E����ʦ�3���n"��1�8�8'%�Lif�!ROX��u���ny}�W�r�\��żZ��᠜t'>�4��ii�M���ȑ@	/#IU&�B7���d�B����O'�G��aI�^�r}�I�"QS�)�Ȱ������gZ�ڜ��9#h�7�A�(�b	�21C�};�Us���|��v����8y;Jb�������#�u���1۩�'0��G��V�߬�j<f�Ko��x})��@JO��[�$�GE��֕�R�J.����m�l}t(�CX���\��Ȫ�W��ָ��z���SQWR�T��y�DD�'��줩S��A(�)x�-s���ʐ�t*\̧L�!�$<!�ݦ� L啨&С��wѻ�t�Q��p�L��}�a
q�R�Vo^��p
L��0=�u��jdݷ
~c/v�+B�)>����1��I�������0T8�a�nm/�I��ܠ@�L�x�숺�D�G��=��D�Z�T.?F�ۯ�sj��P�h�pF�}A;3I�beP,^�3vb�+:���Pb��va*K�qAZ�����?.�P���voEi5�5�������~$�O����]F�^�a�
�nc��Ƽ�}��V9De��V���C.�d��,����C|�	�~���uw�Y���ח��r�-�mG"��p4Ӿ�h���$���YR	��r�y�����n�وR�Մ�q��MW=���w���.
�`���`�z���V�B<�<"���ƒ �<.��u��4|�YU��5 $���x^ܢ�4�\&���H*�D��||<=g�rwG"�2��H��\�B�*�E��qH̕Jb�QqB$��+�<�8R(�8"Ω������A9y'+�Ե��6n(,_�+��v�$�����E4N:��N��J�A�[$<��
�y�*-1v�*0��MA��\UkUiMq^"z"�y�>��(�Bh�i�۱��t�5���u7�N��C��H�Ԑ��Z�Ԫ�!�1D��=M�GEʸ&@��\K��:�Q
|JT��N�H����e��e������(
l�V*�X�b2K�I9T��kQ���͕uR?�;��H�ff2L������� rd��RM�u
��Ν&�C�+=㟥�E��AW��LJ�[��Z�c)K���H�.�k���-ܹJ|5p���
b�/i"�k3l����ma��6���ʹ�;�JY4m��5�b.@rQGve�<-)t��c�1�]L��+�E����q�k��c��I��Hh
�A��b��~?�kQl8z���80U���n0�eL,��aUw�^�I</�Rq����@'�Vu�	ܚ�(Ż	�??�":,�HƝϑ�o
�&��#��#�伾%ți�_�讎[�}�b�&-��:���8UI���	kw��:�sN�Bsw��nj��￐G�[�U��
�������(B��>�M�
%��q8<x"��r�T
�	��}�ȵ�T���ޟ����x���jssaX��4*J(���r��6�5(���j�<8'����n.#M��7����(�%��F�&b����X!H�#��0���e���܋c����ȯ!�A�+qB�{+X�Pb]�b���u�}(҃�e�|6�%�]Vؾ�m�[f�7� �+��؁f��mGrJ"��Z3���(��n�ᦹGy��_��]!^���E�h^�id
��|��݋E9��Iy�jaE%���6�:!�ky?U�ԥ��b-Y���?��yR�]�C�ƔM��J�#���z�{ه�����u;_.�T�A?���޷�g��OC2$�SRE�0��ez�D@>���AQ�����b��˖�]�d�vH�W*�c����K�N��G4=�[p�#ؼߏ���5*�Ms��c+�(m�q!���r��@D�Kň���]zI>F(F튀���W(�y����4t��C�͢�/�]D�&1���;	_�E���Г�𧅁CQ�ܖ��%@?���q!Q�Fdy�K9�Kٮ��b��r�Yˈ\7���|(�򕅺D�Ru�P��ʟ��nY5��.q��KR��h&q��Oh��3��D �c"��,��j�	���~���V''Xc<��|�)�H)�l�@,�t����PZV'�����>���]W\�K�kj���j�,1un����xQ_�BI�uA3Rb��aN$>Cy g�H�]C ?;8�7��=|��4&�4� ��t>�É6q����~���cF����|�	��
�eW"�څF�25rBeXk+�nO��o_�^/ΏoNn�F�����ľ���ۓ3��A��쨃�S5Yo4ܝA�j2�;���Rb�
UK�
MW��K�a��v�lŲ̕R��$j�����1aj��_��X�̾�"�,�w��`���a�֥�сC�y��ܭ__�,��̚�����-�J�S҅��?���:��ऀ�W��I�`��J�^�!�r&��ɚ�d�ق���j�)�\e>&@t������[����W߫�V��H�!g�!�2��q�~��
ED�
Pzqݎ1u������6�
!i/[���N>Ng��6�b��Qmz%��ݭ�"�d�4��#�b��|��4g9$P@�Y�B�6�ƒ	xr��;�bJX���'w
g~�n�,��D�؁�o*�c��&��׈���p��@~vx�W�|��/�#̆��H�Y�a;�X�͑��74����*�ʞg���o��c���ơ������s�_�)��Q ��߉��$�S.�#�i�uB�|��0���!��=6�s�2ǰ]�����"�ӛ
��㻛Zn�P�&
�p�#w��-
Zx���M��hn"�UT|75����I���k7ip���j�~|��߸\$�Qͣ�c�I���݋���c"��6�,�|6�I���s�
�,������dti�Ajb2/)����|���W���l~��"|N�Q�|z�$q��ER�<BL=6���;�{s�<gÛ�"̵M��V�٠��>y�8�q���P�
�#�¢�&��'Z
���7/�/0�/NI�������ࡃ\:���Ϯ�MA����!^-�������s��
��sQT��da�W0���r��_�m�G�CF��0eƜKVXe�u�����V����Dc�D2��ds�B�T�Tk�F�I��u>ĔK?�S��uۏ�k��8r��aXNV����d�(�� [?=-��W+jH�3[�B�*L݄p�Ί�
�G��`rV��,�~��Zr2�4R����x^����w���b:N�V���TuKUg�t�c�a^+8�,�VB�d�$�̍t��9=���:s1�����A�ijK�xJ^�:4������m� �Ly�
x^��`A��'ZU���"��ib�����Sd7�
&s]6��/�%���z��f�´`�ڄ�*6��M������7=s��Ntٌv`7W�J7׹$��T���W��}2�S�Sb����h���T�!l[dqnJ"��
���4��t/�zZGkg��pz���ʆ��n�6�Q��T� Y��	�Z9����Bڬk��#�i�s䞛�L�|G��7�ۙ��w��񈅏�ߒb�O�%�~�W}�A�9PYٌ�g�������[�:�xدym������b��'���F_�Ythemes/dark/css/theme.css000064400000125175151215013520011364 0ustar00@font-face {
  font-family: 'Noto Sans';
  src: url('../../../fonts/notosans/NotoSans-Regular.eot');
  src: url('../../../fonts/notosans/NotoSans-Regular.eot?#iefix') format('embedded-opentype'),
      url('../../../fonts/notosans/NotoSans-Regular.woff2') format('woff2'),
      url('../../../fonts/notosans/NotoSans-Regular.woff') format('woff'),
      url('../../../fonts/notosans/NotoSans-Regular.ttf') format('truetype');
  font-weight: normal;
  font-style: normal;
  font-display: swap;
}
.elfinder {
  color: #546E7A;
  font-family: "Noto Sans";
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}
.elfinder.ui-widget.ui-widget-content {
  -webkit-box-shadow: 0 1px 8px rgba(0, 0, 0, 0.6);
  box-shadow: 0 1px 8px rgba(0, 0, 0, 0.6);
  -webkit-border-radius: 0;
  border-radius: 0;
  border: 0;
}
td{
  font-family: "Noto Sans";
}
/**
 * Input & Select
 */
input.elfinder-tabstop,
input.elfinder-tabstop.ui-state-hover,
select.elfinder-tabstop,
select.elfinder-tabstop.ui-state-hover {
  padding: 5px;
  color: #666666;
  background: #fff;
  border-radius: 3px;
  font-weight: normal;
  border-color: #888;
}
select.elfinder-tabstop,
select.elfinder-tabstop.ui-state-hover {
  width: 100%;
}
/**
 * Loading
 */
.elfinder-info-spinner,
.elfinder-navbar-spinner,
.elfinder-button-icon-spinner {
  background: url("../images/loading.svg") center center no-repeat !important;
  width: 16px;
  height: 16px;
}
/**
 * Progress Bar
 */
@-webkit-keyframes progress-animation {
  from {
    background-position: 1rem 0;
  }
  to {
    background-position: 0 0;
  }
}
@keyframes progress-animation {
  from {
    background-position: 1rem 0;
  }
  to {
    background-position: 0 0;
  }
}
.elfinder-notify-progressbar {
  border: 0;
}
.elfinder-notify-progress,
.elfinder-notify-progressbar {
  -webkit-border-radius: 0;
  border-radius: 0;
}
.elfinder-notify-progress,
.elfinder-resize-spinner {
  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
  background-size: 1rem 1rem;
  -webkit-animation: progress-animation 1s linear infinite;
  animation: progress-animation 1s linear infinite;
  background-color: #0275d8;
  height: 1rem;
}
/**
 * Quick Look
 */
.elfinder-quicklook {
  background: #232323;
  -webkit-border-radius: 2px;
  border-radius: 2px;
}
.elfinder-quicklook-titlebar {
  background: inherit;
}
.elfinder-quicklook-fullscreen .elfinder-quicklook-navbar {
  border: inherit;
  opacity: inherit;
  -webkit-border-radius: 4px;
  border-radius: 4px;
  background: rgba(66, 66, 66, 0.73);
}
.elfinder .elfinder-navdock {
  border: 0;
}
.std42-dialog .ui-dialog-titlebar .ui-dialog-titlebar-close:hover .ui-icon,
.elfinder-mobile .std42-dialog .ui-dialog-titlebar .ui-dialog-titlebar-close .ui-icon,
.elfinder-quicklook-titlebar-icon .ui-icon.elfinder-icon-close:hover,
.elfinder-mobile .elfinder-quicklook-titlebar-icon .ui-icon.elfinder-icon-close,
.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-minimize:hover .ui-icon,
.elfinder-mobile .std42-dialog .ui-dialog-titlebar .elfinder-titlebar-minimize .ui-icon,
.elfinder-quicklook-titlebar-icon .ui-icon.elfinder-icon-minimize:hover,
.elfinder-mobile .elfinder-quicklook-titlebar-icon .ui-icon.elfinder-icon-minimize,
.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-full:hover .ui-icon,
.elfinder-mobile .std42-dialog .ui-dialog-titlebar .elfinder-titlebar-full .ui-icon,
.elfinder-quicklook-titlebar-icon .ui-icon.elfinder-icon-full:hover,
.elfinder-mobile .elfinder-quicklook-titlebar-icon .ui-icon.elfinder-icon-full {
  background-image: none;
}
/**
 * Toast Notification
 */
.elfinder .elfinder-toast > div {
  background-color: #323232 !important;
  color: #d6d6d6;
  -webkit-box-shadow: none;
  box-shadow: none;
  opacity: inherit; 
}
.elfinder .elfinder-toast > div button.ui-button {
  color: #fff;
}
.elfinder .elfinder-toast > .toast-info button.ui-button {
  background-color: #3498DB;
}
.elfinder .elfinder-toast > .toast-error button.ui-button {
  background-color: #F44336;
}
.elfinder .elfinder-toast > .toast-success button.ui-button {
  background-color: #4CAF50;
}
.elfinder .elfinder-toast > .toast-warning button.ui-button {
  background-color: #FF9800;
}
.elfinder-toast-msg {
  font-family: "Noto Sans";
  font-size: 13px;
}
/**
 * For Ace Editor
 */
#ace_settingsmenu {
  font-family: "Noto Sans";
  -webkit-box-shadow: 0 1px 30px rgba(0, 0, 0, 0.6) !important;
  box-shadow: 0 1px 30px rgba(0, 0, 0, 0.6) !important;
  background-color: #1d2736 !important;
  color: #e6e6e6 !important;
}
#ace_settingsmenu,
#kbshortcutmenu {
  padding: 0;
}
.ace_optionsMenuEntry {
  padding: 5px 10px;
}
.ace_optionsMenuEntry:hover {
  background-color: #111721;
}
.ace_optionsMenuEntry label {
  font-size: 13px;
}
#ace_settingsmenu input[type="text"],
#ace_settingsmenu select {
  margin: 1px 2px 2px;
  padding: 2px 5px;
  -webkit-border-radius: 3px;
  border-radius: 3px;
  border: 0;
  background: rgba(9, 53, 121, 0.75);
  color: white;
}
/**
 * Icons
 * Webfont is generated by Fontello http://fontello.com
 */
@font-face {
  font-family: material;
  src: url("../icons/material.eot?98361579");
  src: url("../icons/material.eot?98361579#iefix") format("embedded-opentype"), url("../icons/material.woff2?98361579") format("woff2"), url("../icons/material.woff?98361579") format("woff"), url("../icons/material.ttf?98361579") format("truetype"), url("../icons/material.svg?98361579#material") format("svg");
  font-weight: normal;
  font-style: normal;
}
@media screen and (-webkit-min-device-pixel-ratio: 0) {
  @font-face {
    font-family: material;
    src: url("../icons/material.svg?98361579#material") format("svg");
  }
}
.elfinder-button-menu {
	margin-top: 24px !important;
}
.ui-icon,
.elfinder-button-icon,
.ui-widget-header .ui-icon,
.ui-widget-content .ui-icon {
  font: normal normal normal 14px/1 material;
  background-image: inherit;
  text-indent: inherit;
}
.ui-button-icon-only .ui-icon {
  font: normal normal normal 14px/1 material;
  background-image: inherit !important;
  text-indent: 0;
  font-size: 16px;
}
.elfinder-toolbar .elfinder-button-icon {
  font-size: 20px;
  color: #ddd;
  margin-top: -2px;
}
.elfinder-button-icon {
  background: inherit;
}
.elfinder-button-icon-home:before {
  content: '\e800';
}
.elfinder-button-icon-back:before {
  content: '\e801';
}
.elfinder-button-icon-forward:before {
  content: '\e802';
}
.elfinder-button-icon-up:before {
  content: '\e803';
}
.elfinder-button-icon-dir:before {
  content: '\e804';
}
.elfinder-button-icon-opendir:before {
  content: '\e805';
}
.elfinder-button-icon-reload:before {
  content: '\e806';
}
.elfinder-button-icon-open:before {
  content: '\e807';
}
.elfinder-button-icon-mkdir:before {
  content: '\e808';
}
.elfinder-button-icon-mkfile:before {
  content: '\e809';
}
.elfinder-button-icon-rm:before {
  content: '\e80a';
}
.elfinder-button-icon-trash:before {
  content: '\e80b';
}
.elfinder-button-icon-restore:before {
  content: '\e80c';
}
.elfinder-button-icon-copy:before {
  content: '\e80d';
}
.elfinder-button-icon-cut:before {
  content: '\e80e';
}
.elfinder-button-icon-paste:before {
  content: '\e80f';
}
.elfinder-button-icon-getfile:before {
  content: '\e810';
}
.elfinder-button-icon-duplicate:before {
  content: '\e811';
}
.elfinder-button-icon-rename:before {
  content: '\e812';
}
.elfinder-button-icon-edit:before {
  content: '\e813';
}
.elfinder-button-icon-quicklook:before {
  content: '\e814';
}
.elfinder-button-icon-upload:before {
  content: '\e815';
}
.elfinder-button-icon-download:before {
  content: '\e816';
}
.elfinder-button-icon-info:before {
  content: '\e817';
}
.elfinder-button-icon-extract:before {
  content: '\e818';
}
.elfinder-button-icon-archive:before {
  content: '\e819';
}
.elfinder-button-icon-view:before {
  content: '\e81a';
}
.elfinder-button-icon-view-list:before {
  content: '\e81b';
}
.elfinder-button-icon-help:before {
  content: '\e81c';
}
.elfinder-button-icon-resize:before {
  content: '\e81d';
}
.elfinder-button-icon-link:before {
  content: '\e81e';
}
.elfinder-button-icon-search:before {
  content: '\e81f';
}
.elfinder-button-icon-sort:before {
  content: '\e820';
}
.elfinder-button-icon-rotate-r:before {
  content: '\e821';
}
.elfinder-button-icon-rotate-l:before {
  content: '\e822';
}
.elfinder-button-icon-netmount:before {
  content: '\e823';
}
.elfinder-button-icon-netunmount:before {
  content: '\e824';
}
.elfinder-button-icon-places:before {
  content: '\e825';
}
.elfinder-button-icon-chmod:before {
  content: '\e826';
}
.elfinder-button-icon-accept:before {
  content: '\e827';
}
.elfinder-button-icon-menu:before {
  content: '\e828';
}
.elfinder-button-icon-colwidth:before {
  content: '\e829';
}
.elfinder-button-icon-fullscreen:before {
  content: '\e82a';
}
.elfinder-button-icon-unfullscreen:before {
  content: '\e82b';
}
.elfinder-button-icon-empty:before {
  content: '\e82c';
}
.elfinder-button-icon-undo:before {
  content: '\e82d';
}
.elfinder-button-icon-redo:before {
  content: '\e82e';
}
.elfinder-button-icon-preference:before {
  content: '\e82f';
}
.elfinder-button-icon-mkdirin:before {
  content: '\e830';
}
.elfinder-button-icon-selectall:before {
  content: '\e831';
}
.elfinder-button-icon-selectnone:before {
  content: '\e832';
}
.elfinder-button-icon-selectinvert:before {
  content: '\e833';
}
.elfinder-button-icon-theme:before {
  content: '\e859';
}
.elfinder-button-icon-logout:before {
  content: '\e85a';
}
.elfinder-button-search .ui-icon.ui-icon-search {
  font-size: 17px;
  background: inherit;
}
.elfinder-button-search .ui-icon:hover {
  opacity: 1;
}
.elfinder-navbar-icon {
  font: normal normal normal 16px/1 material;
  background-image: inherit !important;
}
.elfinder-navbar-icon:before {
  content: '\e804';
}
.elfinder-droppable-active .elfinder-navbar-icon:before,
.ui-state-active .elfinder-navbar-icon:before,
.ui-state-hover .elfinder-navbar-icon:before {
  content: '\e805';
}
.elfinder-navbar-root-local .elfinder-navbar-icon:before {
  content: '\e83d';
}
.elfinder-navbar-root-ftp .elfinder-navbar-icon:before {
  content: '\e823';
}
.elfinder-navbar-root-sql .elfinder-navbar-icon:before {
  content: '\e83e';
}
.elfinder-navbar-root-dropbox .elfinder-navbar-icon:before {
  content: '\e83f';
}
.elfinder-navbar-root-googledrive .elfinder-navbar-icon:before {
  content: '\e840';
}
.elfinder-navbar-root-onedrive .elfinder-navbar-icon:before {
  content: '\e841';
}
.elfinder-navbar-root-box .elfinder-navbar-icon:before {
  content: '\e842';
}
.elfinder-navbar-root-trash .elfinder-navbar-icon:before {
  content: '\e80b';
}
.elfinder-places .elfinder-navbar-root .elfinder-navbar-icon:before {
  content: '\e825';
}
.elfinder-navbar-arrow {
  background-image: inherit !important;
  font: normal normal normal 14px/1 material;
  font-size: 10px;
  padding-top: 3px;
  padding-left: 2px;
  color: #a9a9a9;
}
.ui-state-active .elfinder-navbar-arrow {
  color: #fff;
}
.elfinder-ltr .elfinder-navbar-collapsed .elfinder-navbar-arrow:before {
  content: '\e857';
}
.elfinder-rtl .elfinder-navbar-collapsed .elfinder-navbar-arrow:before {
  content: '\e858';
}
.elfinder-ltr .elfinder-navbar-expanded .elfinder-navbar-arrow:before,
.elfinder-rtl .elfinder-navbar-expanded .elfinder-navbar-arrow:before {
  content: '\e851';
}
div.elfinder-cwd-wrapper-list tr.ui-state-default td span.ui-icon {
  font-size: 8px;
  margin-top: 5px;
  margin-right: 5px;
}
div.elfinder-cwd-wrapper-list .ui-icon-grip-dotted-vertical {
  margin: 2px;
}
.elfinder-cwd-view-list .elfinder-navbar-root-local td .elfinder-cwd-icon,
.elfinder-navbar-root-local .elfinder-cwd-icon,
.elfinder-cwd-view-list .elfinder-navbar-root-ftp td .elfinder-cwd-icon,
.elfinder-navbar-root-ftp .elfinder-cwd-icon,
.elfinder-cwd-view-list .elfinder-navbar-root-sql td .elfinder-cwd-icon,
.elfinder-navbar-root-sql .elfinder-cwd-icon,
.elfinder-cwd-view-list .elfinder-navbar-root-dropbox td .elfinder-cwd-icon,
.elfinder-navbar-root-dropbox .elfinder-cwd-icon,
.elfinder-cwd-view-list .elfinder-navbar-root-googledrive td .elfinder-cwd-icon,
.elfinder-navbar-root-googledrive .elfinder-cwd-icon,
.elfinder-cwd-view-list .elfinder-navbar-root-onedrive td .elfinder-cwd-icon,
.elfinder-navbar-root-onedrive .elfinder-cwd-icon,
.elfinder-cwd-view-list .elfinder-navbar-root-box td .elfinder-cwd-icon,
.elfinder-navbar-root-box .elfinder-cwd-icon,
.elfinder-cwd-view-list .elfinder-navbar-root-trash td .elfinder-cwd-icon,
.elfinder-navbar-root-trash .elfinder-cwd-icon {
  background-image: inherit;
}
.elfinder-cwd-view-list .elfinder-navbar-root-local td .elfinder-cwd-icon:before,
.elfinder-navbar-root-local .elfinder-cwd-icon:before,
.elfinder-cwd-view-list .elfinder-navbar-root-ftp td .elfinder-cwd-icon:before,
.elfinder-navbar-root-ftp .elfinder-cwd-icon:before,
.elfinder-cwd-view-list .elfinder-navbar-root-sql td .elfinder-cwd-icon:before,
.elfinder-navbar-root-sql .elfinder-cwd-icon:before,
.elfinder-cwd-view-list .elfinder-navbar-root-dropbox td .elfinder-cwd-icon:before,
.elfinder-navbar-root-dropbox .elfinder-cwd-icon:before,
.elfinder-cwd-view-list .elfinder-navbar-root-googledrive td .elfinder-cwd-icon:before,
.elfinder-navbar-root-googledrive .elfinder-cwd-icon:before,
.elfinder-cwd-view-list .elfinder-navbar-root-onedrive td .elfinder-cwd-icon:before,
.elfinder-navbar-root-onedrive .elfinder-cwd-icon:before,
.elfinder-cwd-view-list .elfinder-navbar-root-box td .elfinder-cwd-icon:before,
.elfinder-navbar-root-box .elfinder-cwd-icon:before,
.elfinder-cwd-view-list .elfinder-navbar-root-trash td .elfinder-cwd-icon:before,
.elfinder-navbar-root-trash .elfinder-cwd-icon:before {
  font-family: material;
  background-color: transparent;
  color: #525252;
  font-size: 55px;
  position: relative;
  top: -10px !important;
  padding: 0;
  display: contents !important;
}
.elfinder-cwd-view-list .elfinder-navbar-root-local td .elfinder-cwd-icon:before,
.elfinder-navbar-root-local .elfinder-cwd-icon:before {
  content: '\e83d';
}
.elfinder-cwd-view-list .elfinder-navbar-root-ftp td .elfinder-cwd-icon:before,
.elfinder-navbar-root-ftp .elfinder-cwd-icon:before {
  content: '\e823';
}
.elfinder-cwd-view-list .elfinder-navbar-root-sql td .elfinder-cwd-icon:before,
.elfinder-navbar-root-sql .elfinder-cwd-icon:before {
  content: '\e83e';
}
.elfinder-cwd-view-list .elfinder-navbar-roor-dropbox td .elfinder-cwd-icon:before,
.elfinder-navbar-roor-dropbox .elfinder-cwd-icon:before {
  content: '\e83f';
}
.elfinder-cwd-view-list .elfinder-navbar-roor-googledrive td .elfinder-cwd-icon:before,
.elfinder-navbar-roor-googledrive .elfinder-cwd-icon:before {
  content: '\e840';
}
.elfinder-cwd-view-list .elfinder-navbar-roor-onedrive td .elfinder-cwd-icon:before,
.elfinder-navbar-roor-onedrive .elfinder-cwd-icon:before {
  content: '\e841';
}
.elfinder-cwd-view-list .elfinder-navbar-roor-box td .elfinder-cwd-icon:before,
.elfinder-navbar-roor-box .elfinder-cwd-icon:before {
  content: '\e842';
}
.elfinder-cwd-view-list .elfinder-navbar-root-trash td .elfinder-cwd-icon:before,
.elfinder-navbar-root-trash .elfinder-cwd-icon:before {
  content: '\e80b';
}
.elfinder-dialog-icon {
  font: normal normal normal 14px/1 material;
  background: inherit;
  color: #524949;
  font-size: 37px;
}
.elfinder-dialog-icon:before {
  content: '\e843';
}
.elfinder-dialog-icon-mkdir:before {
  content: '\e808';
}
.elfinder-dialog-icon-mkfile:before {
  content: '\e809';
}
.elfinder-dialog-icon-copy:before {
  content: '\e80d';
}
.elfinder-dialog-icon-prepare:before,
.elfinder-dialog-icon-move:before {
  content: '\e844';
}
.elfinder-dialog-icon-upload:before,
.elfinder-dialog-icon-chunkmerge:before {
  content: '\e815';
}
.elfinder-dialog-icon-rm:before {
  content: '\e80a';
}
.elfinder-dialog-icon-open:before,
.elfinder-dialog-icon-readdir:before,
.elfinder-dialog-icon-file:before {
  content: '\e807';
}
.elfinder-dialog-icon-reload:before {
  content: '\e806';
}
.elfinder-dialog-icon-download:before {
  content: '\e816';
}
.elfinder-dialog-icon-save:before {
  content: '\e845';
}
.elfinder-dialog-icon-rename:before {
  content: '\e812';
}
.elfinder-dialog-icon-zipdl:before,
.elfinder-dialog-icon-archive:before {
  content: '\e819';
}
.elfinder-dialog-icon-extract:before {
  content: '\e818';
}
.elfinder-dialog-icon-search:before {
  content: '\e81f';
}
.elfinder-dialog-icon-loadimg:before {
  content: '\e846';
}
.elfinder-dialog-icon-url:before {
  content: '\e81e';
}
.elfinder-dialog-icon-resize:before {
  content: '\e81d';
}
.elfinder-dialog-icon-netmount:before {
  content: '\e823';
}
.elfinder-dialog-icon-netunmount:before {
  content: '\e824';
}
.elfinder-dialog-icon-chmod:before {
  content: '\e826';
}
.elfinder-dialog-icon-preupload:before,
.elfinder-dialog-icon-dim:before {
  content: '\e847';
}
.elfinder-contextmenu .elfinder-contextmenu-item span.elfinder-contextmenu-icon {
  font-size: 16px;
}
.elfinder-contextmenu .elfinder-contextmenu-item .elfinder-contextsubmenu-item .ui-icon {
  font-size: 15px;
}
.elfinder-contextmenu .elfinder-contextmenu-item .elfinder-button-icon-link:before {
  content: '\e837';
}
.elfinder .elfinder-contextmenu-extra-icon {
  margin-top: -6px;
}
.elfinder .elfinder-contextmenu-extra-icon a {
  padding: 5px;
  margin: -16px;
}
.elfinder-button-icon-link:before {
  content: '\e81e' !important;
}
.elfinder .elfinder-contextmenu-arrow {
  font: normal normal normal 14px/1 material;
  background-image: inherit;
  font-size: 10px !important;
  padding-top: 3px;
}
.elfinder .elfinder-contextmenu-arrow:before {
  content: '\e857';
}
.elfinder-contextmenu .ui-state-hover .elfinder-contextmenu-arrow {
  background-image: inherit;
}
.elfinder-quicklook .ui-resizable-se {
  background: inherit;
}
.elfinder-quicklook-navbar-icon {
  background: transparent;
  font: normal normal normal 14px/1 material;
  font-size: 32px;
  color: #fff;
}
.elfinder-quicklook-titlebar-icon {
  margin-top: -8px;
}
.elfinder-quicklook-titlebar-icon .ui-icon {
  border: 0;
  opacity: .8;
  font-size: 15px;
  padding: 1px;
}
.elfinder-quicklook-titlebar .ui-icon-circle-close,
.elfinder-quicklook .ui-icon-gripsmall-diagonal-se {
  color: #f1f1f1;
}
.elfinder-quicklook-navbar-icon-prev:before {
  content: '\e848';
}
.elfinder-quicklook-navbar-icon-next:before {
  content: '\e849';
}
.elfinder-quicklook-navbar-icon-fullscreen:before {
  content: '\e84a';
}
.elfinder-quicklook-navbar-icon-fullscreen-off:before {
  content: '\e84b';
}
.elfinder-quicklook-navbar-icon-close:before {
  content: '\e84c';
}
.ui-button-icon {
  background-image: inherit;
}
.ui-icon-search:before {
  content: '\e81f';
}
.ui-icon-closethick:before,
.ui-icon-close:before {
  content: '\e839';
}
.ui-icon-circle-close:before {
  content: '\e84c';
}
.ui-icon-gear:before {
  content: '\e82f';
}
.ui-icon-gripsmall-diagonal-se:before {
  content: '\e838';
}
.ui-icon-locked:before {
  content: '\e834';
}
.ui-icon-unlocked:before {
  content: '\e836';
}
.ui-icon-arrowrefresh-1-n:before {
  content: '\e821';
}
.ui-icon-plusthick:before {
  content: '\e83a';
}
.ui-icon-arrowreturnthick-1-s:before {
  content: '\e83b';
}
.ui-icon-minusthick:before {
  content: '\e83c';
}
.ui-icon-pin-s:before {
  content: '\e84d';
}
.ui-icon-check:before {
  content: '\e84e';
}
.ui-icon-arrowthick-1-s:before {
  content: '\e84f';
}
.ui-icon-arrowthick-1-n:before {
  content: '\e850';
}
.ui-icon-triangle-1-s:before {
  content: '\e851';
}
.ui-icon-triangle-1-n:before {
  content: '\e852';
}
.ui-icon-grip-dotted-vertical:before {
  content: '\e853';
}
.elfinder-lock,
.elfinder-perms,
.elfinder-symlink {
  background-image: inherit;
  font: normal normal normal 18px/1 material;
  color: #4d4d4d;
}
.elfinder-na .elfinder-perms:before {
  content: '\e824';
}
.elfinder-ro .elfinder-perms:before {
  content: '\e835';
}
.elfinder-wo .elfinder-perms:before {
  content: '\e854';
}
.elfinder-group .elfinder-perms:before {
  content: '\e800';
}
.elfinder-lock:before {
  content: '\e834';
}
.elfinder-symlink:before {
  content: '\e837';
}
.elfinder .elfinder-toast > div {
  font: normal normal normal 14px/1 material;
}
.elfinder .elfinder-toast > div:before {
  font-size: 24px;
  position: absolute;
  left: 15px;
  top: 3px;
}
.elfinder .elfinder-toast > .toast-info,
.elfinder .elfinder-toast > .toast-error,
.elfinder .elfinder-toast > .toast-success,
.elfinder .elfinder-toast > .toast-warning {
  background-image: inherit !important;
}
.elfinder .elfinder-toast > .toast-info:before {
  content: '\e817';
  color: #3498DB;
}
.elfinder .elfinder-toast > .toast-error:before {
  content: '\e855';
  color: #F44336;
}
.elfinder .elfinder-toast > .toast-success:before {
  content: '\e84e';
  color: #4CAF50;
}
.elfinder .elfinder-toast > .toast-warning:before {
  content: '\e856';
  color: #FF9800;
}
.elfinder-drag-helper-icon-status {
  font: normal normal normal 14px/1 material;
  background: inherit;
}
.elfinder-drag-helper-icon-status:before {
  content: '\e824';
}
.elfinder-drag-helper-move .elfinder-drag-helper-icon-status {
  -webkit-transform: rotate(180deg);
  -ms-transform: rotate(180deg);
  transform: rotate(180deg);
}
.elfinder-drag-helper-move .elfinder-drag-helper-icon-status:before {
  content: '\e854';
}
.elfinder-drag-helper-plus .elfinder-drag-helper-icon-status {
  -webkit-transform: rotate(90deg);
  -ms-transform: rotate(90deg);
  transform: rotate(90deg);
}
.elfinder-drag-helper-plus .elfinder-drag-helper-icon-status:before {
  content: '\e84c';
}
/**
 * MIME Types
 */
.elfinder-cwd-view-list td .elfinder-cwd-icon {
  background-image: url("../images/icons-small.png");
}
.elfinder-cwd-icon {
  background: url("../images/icons-big.png") 0 0 no-repeat;
}
.elfinder-cwd-icon:before {
  font-size: 10px;
  position: relative;
  top: 27px;
  left: inherit;
  padding: 1px;
  background-color: transparent;
}
.elfinder-info-title .elfinder-cwd-icon:before {
  top: 32px;
  display: block;
  margin: 0 auto;
}
.elfinder-info-title .elfinder-cwd-icon.elfinder-cwd-bgurl:before {
  background-color: #313131 !important;
}
.elfinder-cwd-view-icons .elfinder-cwd-icon.elfinder-cwd-bgurl:before {
  left: inherit;
  background-color: #313131;
}
.elfinder-quicklook .elfinder-cwd-icon:before {
  top: 33px;
  left: 50% !important;
  position: relative;
  display: block;
  -webkit-transform: translateX(-50%);
  -ms-transform: translateX(-50%);
  transform: translateX(-50%);
}
.elfinder-cwd-icon-zip:before,
.elfinder-cwd-icon-x-zip:before {
  content: 'zip' !important;
}
.elfinder-cwd-icon-x-xz:before {
  content: 'xz' !important;
}
.elfinder-cwd-icon-x-7z-compressed:before {
  content: '7z' !important;
}
.elfinder-cwd-icon-x-gzip:before {
  content: 'gzip' !important;
}
.elfinder-cwd-icon-x-tar:before {
  content: 'tar' !important;
}
.elfinder-cwd-icon-x-bzip:before,
.elfinder-cwd-icon-x-bzip2:before {
  content: 'bzip' !important;
}
.elfinder-cwd-icon-x-rar:before,
.elfinder-cwd-icon-x-rar-compressed:before {
  content: 'rar' !important;
}
.elfinder-cwd-icon-directory {
  background-position: 0 -50px;
}
.elfinder-cwd-icon-application {
  background-position: 0 -150px;
}
.elfinder-cwd-icon-text {
  background-position: 0 -200px;
}
.elfinder-cwd-icon-plain,
.elfinder-cwd-icon-x-empty {
  background-position: 0 -250px;
}
.elfinder-cwd-icon-image {
  background-position: 0 -300px;
}
.elfinder-cwd-icon-vnd-adobe-photoshop {
  background-position: 0 -350px;
}
.elfinder-cwd-icon-vnd-adobe-photoshop:before {
  content: none !important;
}
.elfinder-cwd-icon-postscript {
  background-position: 0 -400px;
}
.elfinder-cwd-icon-audio {
  background-position: 0 -450px;
}
.elfinder-cwd-icon-video,
.elfinder-cwd-icon-flash-video,
.elfinder-cwd-icon-dash-xml,
.elfinder-cwd-icon-vnd-apple-mpegurl,
.elfinder-cwd-icon-x-mpegurl {
  background-position: 0 -500px;
}
.elfinder-cwd-icon-rtf,
.elfinder-cwd-icon-rtfd {
  background-position: 0 -550px;
}
.elfinder-cwd-icon-pdf {
  background-position: 0 -600px;
}
.elfinder-cwd-icon-x-msaccess {
  background-position: 0 -650px;
}
.elfinder-cwd-icon-x-msaccess:before {
  content: none !important;
}
.elfinder-cwd-icon-msword,
.elfinder-cwd-icon-vnd-ms-word,
.elfinder-cwd-icon-vnd-ms-word-document-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-word-template-macroEnabled-12 {
  background-position: 0 -700px;
}
.elfinder-cwd-icon-msword:before,
.elfinder-cwd-icon-vnd-ms-word:before,
.elfinder-cwd-icon-vnd-ms-word-document-macroEnabled-12:before,
.elfinder-cwd-icon-vnd-ms-word-template-macroEnabled-12:before {
  content: none !important;
}
.elfinder-cwd-icon-ms-excel,
.elfinder-cwd-icon-vnd-ms-excel,
.elfinder-cwd-icon-vnd-ms-excel-addin-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-excel-sheet-binary-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-excel-sheet-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-excel-template-macroEnabled-12 {
  background-position: 0 -750px;
}
.elfinder-cwd-icon-ms-excel:before,
.elfinder-cwd-icon-vnd-ms-excel:before,
.elfinder-cwd-icon-vnd-ms-excel-addin-macroEnabled-12:before,
.elfinder-cwd-icon-vnd-ms-excel-sheet-binary-macroEnabled-12:before,
.elfinder-cwd-icon-vnd-ms-excel-sheet-macroEnabled-12:before,
.elfinder-cwd-icon-vnd-ms-excel-template-macroEnabled-12:before {
  content: none !important;
}
.elfinder-cwd-icon-vnd-ms-powerpoint,
.elfinder-cwd-icon-vnd-ms-powerpoint-addin-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-powerpoint-presentation-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-powerpoint-slide-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-powerpoint-slideshow-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-powerpoint-template-macroEnabled-12 {
  background-position: 0 -800px;
}
.elfinder-cwd-icon-vnd-ms-powerpoint:before,
.elfinder-cwd-icon-vnd-ms-powerpoint-addin-macroEnabled-12:before,
.elfinder-cwd-icon-vnd-ms-powerpoint-presentation-macroEnabled-12:before,
.elfinder-cwd-icon-vnd-ms-powerpoint-slide-macroEnabled-12:before,
.elfinder-cwd-icon-vnd-ms-powerpoint-slideshow-macroEnabled-12:before,
.elfinder-cwd-icon-vnd-ms-powerpoint-template-macroEnabled-12:before {
  content: none !important;
}
.elfinder-cwd-icon-vnd-ms-office,
.elfinder-cwd-icon-vnd-oasis-opendocument-chart,
.elfinder-cwd-icon-vnd-oasis-opendocument-database,
.elfinder-cwd-icon-vnd-oasis-opendocument-formula,
.elfinder-cwd-icon-vnd-oasis-opendocument-graphics,
.elfinder-cwd-icon-vnd-oasis-opendocument-graphics-template,
.elfinder-cwd-icon-vnd-oasis-opendocument-image,
.elfinder-cwd-icon-vnd-oasis-opendocument-presentation,
.elfinder-cwd-icon-vnd-oasis-opendocument-presentation-template,
.elfinder-cwd-icon-vnd-oasis-opendocument-spreadsheet,
.elfinder-cwd-icon-vnd-oasis-opendocument-spreadsheet-template,
.elfinder-cwd-icon-vnd-oasis-opendocument-text,
.elfinder-cwd-icon-vnd-oasis-opendocument-text-master,
.elfinder-cwd-icon-vnd-oasis-opendocument-text-template,
.elfinder-cwd-icon-vnd-oasis-opendocument-text-web,
.elfinder-cwd-icon-vnd-openofficeorg-extension,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-presentation,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-slide,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-slideshow,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-template,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-spreadsheetml-sheet,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-spreadsheetml-template,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-wordprocessingml-document,
.elfinder-cwd-icon-vnd-openxmlformats-officedocument-wordprocessingml-template {
  background-position: 0 -850px;
}
.elfinder-cwd-icon-html {
  background-position: 0 -900px;
}
.elfinder-cwd-icon-css {
  background-position: 0 -950px;
}
.elfinder-cwd-icon-javascript,
.elfinder-cwd-icon-x-javascript {
  background-position: 0 -1000px;
}
.elfinder-cwd-icon-x-perl {
  background-position: 0 -1050px;
}
.elfinder-cwd-icon-x-python:after,
.elfinder-cwd-icon-x-python {
  background-position: 0 -1100px;
}
.elfinder-cwd-icon-x-ruby {
  background-position: 0 -1150px;
}
.elfinder-cwd-icon-x-sh,
.elfinder-cwd-icon-x-shellscript {
  background-position: 0 -1200px;
}
.elfinder-cwd-icon-x-c,
.elfinder-cwd-icon-x-csrc,
.elfinder-cwd-icon-x-chdr,
.elfinder-cwd-icon-x-c--,
.elfinder-cwd-icon-x-c--src,
.elfinder-cwd-icon-x-c--hdr {
  background-position: 0 -1250px;
}
.elfinder-cwd-icon-x-jar,
.elfinder-cwd-icon-x-java,
.elfinder-cwd-icon-x-java-source {
  background-position: 0 -1300px;
}
.elfinder-cwd-icon-x-jar:before,
.elfinder-cwd-icon-x-java:before,
.elfinder-cwd-icon-x-java-source:before {
  content: none !important;
}
.elfinder-cwd-icon-x-php {
  background-position: 0 -1350px;
}
.elfinder-cwd-icon-xml:after,
.elfinder-cwd-icon-xml {
  background-position: 0 -1400px;
}
.elfinder-cwd-icon-zip,
.elfinder-cwd-icon-x-zip,
.elfinder-cwd-icon-x-xz,
.elfinder-cwd-icon-x-7z-compressed,
.elfinder-cwd-icon-x-gzip,
.elfinder-cwd-icon-x-tar,
.elfinder-cwd-icon-x-bzip,
.elfinder-cwd-icon-x-bzip2,
.elfinder-cwd-icon-x-rar,
.elfinder-cwd-icon-x-rar-compressed {
  background-position: 0 -1450px;
}
.elfinder-cwd-icon-x-shockwave-flash {
  background-position: 0 -1500px;
}
.elfinder-cwd-icon-group {
  background-position: 0 -1550px;
}
.elfinder-cwd-icon-json {
  background-position: 0 -1600px;
}
.elfinder-cwd-icon-json:before {
  content: none !important;
}
.elfinder-cwd-icon-markdown,
.elfinder-cwd-icon-x-markdown {
  background-position: 0 -1650px;
}
.elfinder-cwd-icon-markdown:before,
.elfinder-cwd-icon-x-markdown:before {
  content: none !important;
}
.elfinder-cwd-icon-sql {
  background-position: 0 -1700px;
}
.elfinder-cwd-icon-sql:before {
  content: none !important;
}
.elfinder-cwd-icon-svg,
.elfinder-cwd-icon-svg-xml {
  background-position: 0 -1750px;
}
.elfinder-cwd-icon-svg:before,
.elfinder-cwd-icon-svg-xml:before {
  content: none !important;
}
/**
 * Toolbar
 */
.elfinder-toolbar {
  background: #061325;
  -webkit-border-radius: 0;
  border-radius: 0;
  border: 0;
  padding: 5px 0;
}
.elfinder-buttonset {
  -webkit-border-radius: 0;
  border-radius: 0;
  border: 0;
  margin: 0 5px;
  height: 24px;
}
.elfinder .elfinder-button {
  background: transparent;
  -webkit-border-radius: 0;
  border-radius: 0;
  cursor: pointer;
  color: #efefef;
}
.elfinder-toolbar-button-separator {
  border: 0;
}
.elfinder-button-menu {
  -webkit-border-radius: 2px;
  border-radius: 2px;
  -webkit-box-shadow: 0 1px 6px rgba(0, 0, 0, 0.3);
  box-shadow: 0 1px 6px rgba(0, 0, 0, 0.3);
  border: none;
  margin-top: 5px;
}
.elfinder-button-menu-item {
  color: #666666;
  padding: 6px 19px;
}
.elfinder-button-menu-item.ui-state-hover {
  color: #141414;
  background-color: #f5f4f4;
}
.elfinder-button-menu-item-separated {
  border-top: 1px solid #e5e5e5;
}
.elfinder-button-menu-item-separated.ui-state-hover {
  border-top: 1px solid #e5e5e5;
}
.elfinder .elfinder-button-search {
  margin: 0 10px;
  min-height: inherit;
}
.elfinder .elfinder-button-search input {
  background: rgba(22, 43, 76, 0.75);
  -webkit-border-radius: 2px;
  border-radius: 2px;
  border: 0;
  margin: 0;
  padding: 0 23px;
  height: 24px;
  color: #fff;
  font-weight: 100;
  min-height: 24px;
}
.elfinder .elfinder-button-search .elfinder-button-menu {
  margin-top: 4px;
  border: none;
  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.5);
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.5);
}
/**
 * Navbar
 */
.elfinder .elfinder-navbar {
  background: #2a384d;
  -webkit-box-shadow: 0 1px 8px rgba(0, 0, 0, 0.6);
  box-shadow: 0 1px 8px rgba(0, 0, 0, 0.6);
  border: none;
}
.elfinder-navbar-dir {
  color: #e6e6e6;
  cursor: pointer;
  -webkit-border-radius: 2px;
  border-radius: 2px;
  padding: 5px;
  border: none;
}
.elfinder-navbar-dir.ui-state-hover,
.elfinder-navbar-dir.ui-state-active.ui-state-hover {
  background: #17202c;
  color: #e6e6e6;
  border: none;
}
.elfinder-navbar .ui-state-active,
.elfinder-disabled .elfinder-navbar .ui-state-active {
  background: #1b2533;
  border: none;
}
/**
 * Workzone
 */
.elfinder-workzone {
  background: #0e1827;
}
.elfinder-cwd-file {
  color: #ddd;
}
.elfinder-cwd-file.ui-state-hover,
.elfinder-cwd-file.ui-selected.ui-state-hover {
  background: #1a283c;
  color: #ddd;
}
.elfinder-cwd-file.ui-selected {
  background: #152131;
  color: #ddd;
}
.elfinder-cwd-filename input,
.elfinder-cwd-filename textarea {
  padding: 2px;
  -webkit-border-radius: 2px !important;
  border-radius: 2px !important;
  width: 100px !important;
  background: #fff;
  color: #222;
}
.elfinder-cwd-filename input:focus,
.elfinder-cwd-filename textarea:focus {
  outline: none;
  border: 1px solid #555;
}
.elfinder-cwd-view-icons .elfinder-cwd-file .ui-state-hover,
.elfinder-cwd-view-icons .elfinder-cwd-file .elfinder-cwd-filename.ui-state-hover,
.elfinder-disabled .elfinder-cwd-view-icons .elfinder-cwd-file .elfinder-cwd-filename.ui-state-hover,
.elfinder-disabled .elfinder-cwd table td.ui-state-hover {
  background: transparent;
}
.elfinder-ltr .elfinder-cwd table {
    padding: 0 2px 0 0;
}
.elfinder-rtl .elfinder-cwd table {
    padding: 0 0 0 2px;
}

.elfinder-cwd table tr:nth-child(odd) {
  background-color: transparent;
}
.elfinder-cwd table tr:nth-child(odd).ui-state-hover {
  background-color: #1a283c;
}
#elfinder-elfinder-cwd-thead td {
  background: #010e21;
  color: #ddd;
}
#elfinder-elfinder-cwd-thead td.ui-state-hover,
#elfinder-elfinder-cwd-thead td.ui-state-active {
  background: #010a17;
}
#elfinder-elfinder-cwd-thead td.ui-state-active.ui-state-hover {
  background: #010812;
}
.ui-selectable-helper {
  border: 1px solid #022861;
  background-color: rgba(3, 62, 150, 0.38);
}
.elfinder-cwd-wrapper.elfinder-cwd-wrapper-trash {
  background-color: #e4e4e4;
}
.elfinder-cwd-wrapper.elfinder-cwd-wrapper-trash .elfinder-cwd-file {
  color: #333;
}
.elfinder-cwd-wrapper.elfinder-cwd-wrapper-trash .elfinder-cwd-file.ui-state-hover,
.elfinder-cwd-wrapper.elfinder-cwd-wrapper-trash .elfinder-cwd-file.ui-selected.ui-state-hover {
  background: #1a283c;
  color: #ddd;
}
.elfinder-cwd-wrapper.elfinder-cwd-wrapper-trash .elfinder-cwd-file.ui-selected {
  background: #152131;
  color: #ddd;
}
/**
 * Status Bar
 */
.elfinder .elfinder-statusbar {
  background: #061325;
  -webkit-border-radius: 0;
  border-radius: 0;
  border: 0;
  color: #cfd2d4;
}
.elfinder-path,
.elfinder-stat-size {
  margin: 0 15px;
}
/**
 * Buttons
 */
.ui-button,
.ui-button:active,
.ui-button.ui-state-default {
  display: inline-block;
  font-weight: normal;
  text-align: center;
  vertical-align: middle;
  cursor: pointer;
  white-space: nowrap;
  -webkit-border-radius: 3px;
  border-radius: 3px;
  text-transform: uppercase;
  -webkit-box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.4);
  box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.4);
  -webkit-transition: all 0.4s;
  -o-transition: all 0.4s;
  transition: all 0.4s;
  background: #fff;
  color: #222;
}
.ui-button .ui-icon,
.ui-button:active .ui-icon,
.ui-button.ui-state-default .ui-icon {
  color: #222;
}
.ui-button:hover,
a.ui-button:active,
.ui-button:active,
.ui-button:focus,
.ui-button.ui-state-hover,
.ui-button.ui-state-active {
  background: #3498DB;
  color: #fff;
}
.ui-button:hover .ui-icon,
a.ui-button:active .ui-icon,
.ui-button:active .ui-icon,
.ui-button:focus .ui-icon,
.ui-button.ui-state-hover .ui-icon,
.ui-button.ui-state-active .ui-icon {
  color: #fff;
}
.ui-button.ui-state-active:hover {
  background: #217dbb;
  color: #fff;
  border: none;
}
.ui-button:focus {
  outline: none !important;
}
.ui-controlgroup-horizontal .ui-button {
  -webkit-border-radius: 0;
  border-radius: 0;
  border: 0;
}
/**
 * Context Menu
 */
.elfinder .elfinder-contextmenu,
.elfinder .elfinder-contextmenu-sub {
  -webkit-border-radius: 2px;
  border-radius: 2px;
  -webkit-box-shadow: 0 1px 6px rgba(0, 0, 0, 0.3);
  box-shadow: 0 1px 6px rgba(0, 0, 0, 0.3);
  border: none;
}
.elfinder .elfinder-contextmenu-separator,
.elfinder .elfinder-contextmenu-sub-separator {
  border-top: 1px solid #e5e5e5;
}
.elfinder .elfinder-contextmenu-item {
  color: #666;
  padding: 5px 30px;
}
.elfinder .elfinder-contextmenu-item.ui-state-hover {
  background-color: #f5f4f4;
  color: #141414;
}
.elfinder .elfinder-contextmenu-item.ui-state-active {
  background-color: #2196F3;
  color: #fff;
}
/**
 * Dialogs
 */
.elfinder .elfinder-dialog {
  -webkit-border-radius: 0;
  border-radius: 0;
  border: 0;
  -webkit-box-shadow: 0 1px 30px rgba(0, 0, 0, 0.6);
  box-shadow: 0 1px 30px rgba(0, 0, 0, 0.6);
}
.elfinder .elfinder-dialog .ui-dialog-content[id*="edit-elfinder-elfinder-"] {
  padding: 0;
}
.elfinder .elfinder-dialog .ui-tabs {
  -webkit-border-radius: 0;
  border-radius: 0;
  border: 0;
}
.elfinder .elfinder-dialog .ui-tabs-nav {
  -webkit-border-radius: 0;
  border-radius: 0;
  border: 0;
  background: transparent;
  border-bottom: 1px solid #ddd;
}
.elfinder .elfinder-dialog .ui-tabs-nav li {
  border: 0;
  font-weight: normal;
  background: transparent;
  margin: 0;
  padding: 3px 0;
}
.elfinder .elfinder-dialog .ui-tabs-nav li.ui-tabs-active {
  padding-bottom: 7px;
}
.elfinder .elfinder-dialog .ui-tabs-nav .ui-tabs-selected a,
.elfinder .elfinder-dialog .ui-tabs-nav .ui-state-active a,
.elfinder .elfinder-dialog .ui-tabs-nav li:hover a {
  -webkit-box-shadow: inset 0 -2px 0 #3498DB;
  box-shadow: inset 0 -2px 0 #3498DB;
  color: #3498DB;
}
.std42-dialog .ui-dialog-titlebar {
  background: #0f1f2f;
  -webkit-border-radius: 0;
  border-radius: 0;
  border: 0;
}
.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-button .ui-icon {
  border-color: inherit;
  -webkit-transition: 0.2s ease-out;
  -o-transition: 0.2s ease-out;
  transition: 0.2s ease-out;
  opacity: 0.8;
  color: #fff;
  width: auto;
  height: auto;
  font-size: 12px;
  padding: 3px;
}
.elfinder-mobile .std42-dialog .ui-dialog-titlebar .ui-dialog-titlebar-close .ui-icon,
.std42-dialog .ui-dialog-titlebar .ui-dialog-titlebar-close:hover .ui-icon {
  background-color: #F44336;
}
.elfinder-mobile .std42-dialog .ui-dialog-titlebar .elfinder-titlebar-full .ui-icon,
.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-full:hover .ui-icon {
  background-color: #4CAF50;
}
.elfinder-mobile .std42-dialog .ui-dialog-titlebar .elfinder-titlebar-minimize .ui-icon,
.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-minimize:hover .ui-icon {
  background-color: #FF9800;
}
.elfinder-dialog-title {
  color: #f1f1f1;
}
.std42-dialog .ui-dialog-content {
  background: #fff;
}
.ui-widget-content {
  font-family: "Noto Sans";
  color: #546E7A;
}
.std42-dialog .ui-dialog-buttonpane button {
  margin: 2px;
  padding: .4em .5em;
}
.std42-dialog .ui-dialog-buttonpane button span.ui-icon {
  padding: 0;
}
.elfinder-upload-dialog-wrapper .elfinder-upload-dirselect {
  width: inherit;
  height: inherit;
  padding: .4em;
  margin-left: 5px;
  color: #222;
}
.elfinder-upload-dialog-wrapper .elfinder-upload-dirselect.ui-state-hover {
  background: #888;
  color: #fff;
  outline: none;
  -webkit-border-radius: 2px;
  border-radius: 2px;
}
.elfinder-upload-dialog-wrapper .ui-button {
  padding: .4em 3px;
  margin: 0 2px;
}
.elfinder-upload-dialog-wrapper .ui-button {
  margin-left: 19px;
  margin-right: -15px;
}
.elfinder-upload-dropbox {
  border: 2px dashed #bbb;
}
.elfinder-upload-dropbox:focus {
  outline: none;
}
.elfinder-upload-dropbox.ui-state-hover {
  background: #f1f1f1;
  border: 2px dashed #bbb;
}
.elfinder-help *,
.elfinder-help a {
  color: #546E7A;
}
/****/
.elfinder .elfinder-cwd table thead td {
	padding: 8px 14px;
	padding-right: 25px;
}
.elfinder .elfinder-cwd table td {
	padding: 8px 12px;
}
.elfinder-navbar-dir {
	padding: 7px 5px;
}
div.elfinder-cwd-wrapper-list tr.ui-state-default td span.ui-icon {
	top: 8px;
	margin-right: 10px;
}
.elfinder-cwd-view-list thead td .ui-resizable-handle {
	top: 7px;
}
.elfinder .elfinder-cwd table thead td.ui-resizable.ui-state-active {
	background: #4a6187;
	color:#fff;
}
.elfinder .elfinder-cwd table thead td.ui-resizable{
	background:#18263f;
	color:#fff;
}
.elfinder-toolbar {
	padding: 10px 0;
}
.elfinder .elfinder-button-search-menu {
	top: 42px;
}
/**custom scrollbar**/
.elfinder-cwd-wrapper::-webkit-scrollbar, .elfinder-navbar.ui-resizable::-webkit-scrollbar {
    width: 13px;
} 
.elfinder-cwd-wrapper::-webkit-scrollbar-track, .elfinder-navbar.ui-resizable::-webkit-scrollbar-track {
    -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3);
    -moz-box-shadow: inset 0 0 6px rgba(0,0,0,0.3);
} 
.elfinder-cwd-wrapper::-webkit-scrollbar-thumb, .elfinder-navbar.ui-resizable::-webkit-scrollbar-thumb {
  background-color: #4a6187;
  border: 1px solid #4a6187 !important;
  outline:none;
  box-shadow:none !important;
}


.elfinder-cwd-wrapper::-moz-scrollbar {
    width: 13px;
} 
.elfinder-cwd-wrapper::-moz-scrollbar-track {
    -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3);
    -moz-box-shadow: inset 0 0 6px rgba(0,0,0,0.3);
} 
.elfinder-cwd-wrapper::-moz-scrollbar-thumb {
  background-color: #4a6187;
  border: 1px solid #4a6187 !important;
  outline:none;
  box-shadow:none !important;
}
.elfinder-cwd-view-icons .elfinder-cwd-icon.elfinder-cwd-bgurl:before {
    width: 60px;
}
.elfinder-rtl .elfinder-cwd-size1 .elfinder-cwd-icon.elfinder-cwd-bgurl:before, .elfinder-rtl .elfinder-cwd-size2 .elfinder-cwd-icon.elfinder-cwd-bgurl:before, .elfinder-rtl .elfinder-cwd-size3 .elfinder-cwd-icon.elfinder-cwd-bgurl:before {
    left: 0;
    position: absolute;
}
.elfinder-cwd-view-icons .elfinder-cwd-file .ui-state-hover,
.elfinder-cwd-view-icons .elfinder-cwd-file .ui-state-active {
   color: #ddd;
}
.elfinder .elfinder-contextmenu-item .ui-icon.ui-icon-check {
    margin-top: -6px;
}
.elfinder .elfinder-contextmenu-rtl .elfinder-contextmenu-item .ui-icon.ui-icon-check {
    right: -1px;
    left: auto;
}
.elfinder-contextmenu .elfinder-contextmenu-item .elfinder-contextsubmenu-item .ui-icon.ui-icon-check {
    font-size: 13px;
}
.elfinder-ltr .elfinder-button-search .ui-icon-close{font-size: 17px;}
.elfinder .elfinder-contextmenu-rtl .elfinder-contextmenu-arrow:before {
    content: '\e858';
}




.elfinder-contextmenu-item .elfinder-button-icon-opennew:before {content: ''; background: url(../images/icon-new-window.png) no-repeat; height: 16px; width: 16px; display: block; background-size: 15px; }

.elfinder-contextmenu-item .elfinder-button-icon-hide:before {content: ''; background: url(../images/hide.png) no-repeat; height: 16px; width: 16px; display: block; background-size: 15px; }

/* Css Added here */
.elfinder-notify-cancel .elfinder-notify-button.ui-icon.ui-icon-close{ line-height: 19px; font-size: 11px; color:#fff; }  
.elfinder-notify-cancel .elfinder-notify-button.ui-icon.ui-icon-close:hover{ background: #ff6252; }
.ui-front.elfinder-quicklook.elfinder-frontmost .ui-dialog-titlebar .ui-icon{ font-size: 11px; line-height: 17px; }

/*for dark css for icon*/
.wrap.wp-filemanager-wrap .ui-front.ui-dialog.ui-widget.ui-widget-content.ui-corner-all.ui-draggable.std42-dialog .ui-dialog-content.ui-widget-content .ui-helper-clearfix.elfinder-rm-title span.elfinder-cwd-icon:before {
    left: inherit;
    background-color: transparent;
    top: 32px;
    display: block;
    margin: 0 auto;
}themes/dark/css/theme.min.css000064400000107403151215013520012140 0ustar00@font-face {
    font-family: 'Noto Sans';
    src: url('../lib/fonts/notosans/NotoSans-Regular.eot');
    src: url('../lib/fonts/notosans/NotoSans-Regular.eot?#iefix') format('embedded-opentype'),
        url('../lib/fonts/notosans/NotoSans-Regular.woff2') format('woff2'),
        url('../lib/fonts/notosans/NotoSans-Regular.woff') format('woff'),
        url('../lib/fonts/notosans/NotoSans-Regular.ttf') format('truetype');
    font-weight: normal;
    font-style: normal;
    font-display: swap;
  }
  @font-face {
    font-family: 'Noto Sans';
    src: url('../lib/fonts/notosans/NotoSans-BoldItalic.eot');
    src: url('../lib/fonts/notosans/NotoSans-BoldItalic.eot?#iefix') format('embedded-opentype'),
        url('../lib/fonts/notosans/NotoSans-BoldItalic.woff2') format('woff2'),
        url('../lib/fonts/notosans/NotoSans-BoldItalic.woff') format('woff'),
        url('../lib/fonts/notosans/NotoSans-BoldItalic.ttf') format('truetype');
    font-weight: bold;
    font-style: normal;
    font-display: swap;
  }
  @font-face {
    font-family: 'Noto Sans';
    src: url('../lib/fonts/notosans/NotoSans-Black.eot');
    src: url('../lib/fonts/notosans/NotoSans-Black.eot?#iefix') format('embedded-opentype'),
        url('../lib/fonts/notosans/NotoSans-Black.woff2') format('woff2'),
        url('../lib/fonts/notosans/NotoSans-Black.woff') format('woff'),
        url('../lib/fonts/notosans/NotoSans-Black.ttf') format('truetype');
    font-weight: 900;
    font-style: normal;
    font-display: swap;
  }
  .elfinder{color:#546E7A;font-family:"Noto Sans", sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.elfinder.ui-widget.ui-widget-content{font-family:"Noto Sans", sans-serif;-webkit-box-shadow:0 1px 8px rgba(0, 0, 0, 0.6);box-shadow:0 1px 8px rgba(0, 0, 0, 0.6);-webkit-border-radius:0;border-radius:0;border:0}input.elfinder-tabstop,input.elfinder-tabstop.ui-state-hover,select.elfinder-tabstop,select.elfinder-tabstop.ui-state-hover{padding:5px;color:#666666;background:#fff;border-radius:3px;font-weight:normal;border-color:#888}select.elfinder-tabstop,select.elfinder-tabstop.ui-state-hover{width:100%}.elfinder-button-icon-spinner,.elfinder-info-spinner,.elfinder-navbar-spinner{background:url("../images/loading.svg") center center no-repeat!important;width:16px;height:16px}@-webkit-keyframes progress-animation{0%{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-animation{0%{background-position:1rem 0}to{background-position:0 0}}.elfinder-notify-progressbar{border:0}.elfinder-notify-progress,.elfinder-notify-progressbar{-webkit-border-radius:0;border-radius:0}.elfinder-notify-progress,.elfinder-resize-spinner{background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-size:1rem 1rem;-webkit-animation:progress-animation 1s linear infinite;animation:progress-animation 1s linear infinite;background-color:#0275d8;height:1rem}.elfinder-quicklook{background:#232323;-webkit-border-radius:2px;border-radius:2px}.elfinder-quicklook-titlebar{background:inherit}.elfinder-quicklook-fullscreen .elfinder-quicklook-navbar{border:inherit;opacity:inherit;-webkit-border-radius:4px;border-radius:4px;background:rgba(66, 66, 66, 0.73)}.elfinder .elfinder-navdock{border:0}.elfinder-mobile .elfinder-quicklook-titlebar-icon .ui-icon.elfinder-icon-close,.elfinder-mobile .elfinder-quicklook-titlebar-icon .ui-icon.elfinder-icon-full,.elfinder-mobile .elfinder-quicklook-titlebar-icon .ui-icon.elfinder-icon-minimize,.elfinder-mobile .std42-dialog .ui-dialog-titlebar .elfinder-titlebar-full .ui-icon,.elfinder-mobile .std42-dialog .ui-dialog-titlebar .elfinder-titlebar-minimize .ui-icon,.elfinder-mobile .std42-dialog .ui-dialog-titlebar .ui-dialog-titlebar-close .ui-icon,.elfinder-quicklook-titlebar-icon .ui-icon.elfinder-icon-close:hover,.elfinder-quicklook-titlebar-icon .ui-icon.elfinder-icon-full:hover,.elfinder-quicklook-titlebar-icon .ui-icon.elfinder-icon-minimize:hover,.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-full:hover .ui-icon,.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-minimize:hover .ui-icon,.std42-dialog .ui-dialog-titlebar .ui-dialog-titlebar-close:hover .ui-icon{background-image:none}.elfinder .elfinder-toast>div{background-color:#323232!important;color:#d6d6d6;-webkit-box-shadow:none;box-shadow:none;opacity:inherit;padding:10px 60px}.elfinder .elfinder-toast>div button.ui-button{color:#fff}.elfinder .elfinder-toast>.toast-info button.ui-button{background-color:#3498DB}.elfinder .elfinder-toast>.toast-error button.ui-button{background-color:#F44336}.elfinder .elfinder-toast>.toast-success button.ui-button{background-color:#4CAF50}.elfinder .elfinder-toast>.toast-warning button.ui-button{background-color:#FF9800}.elfinder-toast-msg{font-family:"Noto Sans", sans-serif;font-size:17px}#ace_settingsmenu{font-family:"Noto Sans", sans-serif;-webkit-box-shadow:0 1px 30px rgba(0, 0, 0, 0.6)!important;box-shadow:0 1px 30px rgba(0, 0, 0, 0.6)!important;background-color:#1d2736!important;color:#e6e6e6!important}#ace_settingsmenu,#kbshortcutmenu{padding:0}.ace_optionsMenuEntry{padding:5px 10px}.ace_optionsMenuEntry:hover{background-color:#111721}.ace_optionsMenuEntry label{font-size:13px}#ace_settingsmenu input[type=text],#ace_settingsmenu select{margin:1px 2px 2px;padding:2px 5px;-webkit-border-radius:3px;border-radius:3px;border:0;background:rgba(9, 53, 121, 0.75);color:white}@font-face{font-family:material;src:url("../icons/material.eot?98361579");src:url("../icons/material.eot?98361579#iefix") format("embedded-opentype"), url("../icons/material.woff2?98361579") format("woff2"), url("../icons/material.woff?98361579") format("woff"), url("../icons/material.ttf?98361579") format("truetype"), url("../icons/material.svg?98361579#material") format("svg");font-weight:normal;font-style:normal}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:material;src:url("../icons/material.svg?98361579#material") format("svg")}}.elfinder-button-icon,.ui-icon,.ui-widget-content .ui-icon,.ui-widget-header .ui-icon{font:normal normal normal 14px/1 material;background-image:inherit;text-indent:inherit}.ui-button-icon-only .ui-icon{font:normal normal normal 14px/1 material;background-image:inherit!important;text-indent:0;font-size:16px}.elfinder-toolbar .elfinder-button-icon{font-size:20px;color:#ddd;margin-top:-2px}.elfinder-button-icon{background:inherit}.elfinder-button-icon-home:before{content:'\e800'}.elfinder-button-icon-back:before{content:'\e801'}.elfinder-button-icon-forward:before{content:'\e802'}.elfinder-button-icon-up:before{content:'\e803'}.elfinder-button-icon-dir:before{content:'\e804'}.elfinder-button-icon-opendir:before{content:'\e805'}.elfinder-button-icon-reload:before{content:'\e806'}.elfinder-button-icon-open:before{content:'\e807'}.elfinder-button-icon-mkdir:before{content:'\e808'}.elfinder-button-icon-mkfile:before{content:'\e809'}.elfinder-button-icon-rm:before{content:'\e80a'}.elfinder-button-icon-trash:before{content:'\e80b'}.elfinder-button-icon-restore:before{content:'\e80c'}.elfinder-button-icon-copy:before{content:'\e80d'}.elfinder-button-icon-cut:before{content:'\e80e'}.elfinder-button-icon-paste:before{content:'\e80f'}.elfinder-button-icon-getfile:before{content:'\e810'}.elfinder-button-icon-duplicate:before{content:'\e811'}.elfinder-button-icon-rename:before{content:'\e812'}.elfinder-button-icon-edit:before{content:'\e813'}.elfinder-button-icon-quicklook:before{content:'\e814'}.elfinder-button-icon-upload:before{content:'\e815'}.elfinder-button-icon-download:before{content:'\e816'}.elfinder-button-icon-info:before{content:'\e817'}.elfinder-button-icon-extract:before{content:'\e818'}.elfinder-button-icon-archive:before{content:'\e819'}.elfinder-button-icon-view:before{content:'\e81a'}.elfinder-button-icon-view-list:before{content:'\e81b'}.elfinder-button-icon-help:before{content:'\e81c'}.elfinder-button-icon-resize:before{content:'\e81d'}.elfinder-button-icon-link:before{content:'\e81e'}.elfinder-button-icon-search:before{content:'\e81f'}.elfinder-button-icon-sort:before{content:'\e820'}.elfinder-button-icon-rotate-r:before{content:'\e821'}.elfinder-button-icon-rotate-l:before{content:'\e822'}.elfinder-button-icon-netmount:before{content:'\e823'}.elfinder-button-icon-netunmount:before{content:'\e824'}.elfinder-button-icon-places:before{content:'\e825'}.elfinder-button-icon-chmod:before{content:'\e826'}.elfinder-button-icon-accept:before{content:'\e827'}.elfinder-button-icon-menu:before{content:'\e828'}.elfinder-button-icon-colwidth:before{content:'\e829'}.elfinder-button-icon-fullscreen:before{content:'\e82a'}.elfinder-button-icon-unfullscreen:before{content:'\e82b'}.elfinder-button-icon-empty:before{content:'\e82c'}.elfinder-button-icon-undo:before{content:'\e82d'}.elfinder-button-icon-redo:before{content:'\e82e'}.elfinder-button-icon-preference:before{content:'\e82f'}.elfinder-button-icon-mkdirin:before{content:'\e830'}.elfinder-button-icon-selectall:before{content:'\e831'}.elfinder-button-icon-selectnone:before{content:'\e832'}.elfinder-button-icon-selectinvert:before{content:'\e833'}.elfinder-button-icon-theme:before{content:'\e859'}.elfinder-button-icon-logout:before{content:'\e85a'}.elfinder-button-search .ui-icon.ui-icon-search{font-size:17px}.elfinder-button-search .ui-icon:hover{opacity:1}.elfinder-navbar-icon{font:normal normal normal 16px/1 material;background-image:inherit!important}.elfinder-navbar-icon:before{content:'\e804'}.elfinder-droppable-active .elfinder-navbar-icon:before,.ui-state-active .elfinder-navbar-icon:before,.ui-state-hover .elfinder-navbar-icon:before{content:'\e805'}.elfinder-navbar-root-local .elfinder-navbar-icon:before{content:'\e83d'}.elfinder-navbar-root-ftp .elfinder-navbar-icon:before{content:'\e823'}.elfinder-navbar-root-sql .elfinder-navbar-icon:before{content:'\e83e'}.elfinder-navbar-root-dropbox .elfinder-navbar-icon:before{content:'\e83f'}.elfinder-navbar-root-googledrive .elfinder-navbar-icon:before{content:'\e840'}.elfinder-navbar-root-onedrive .elfinder-navbar-icon:before{content:'\e841'}.elfinder-navbar-root-box .elfinder-navbar-icon:before{content:'\e842'}.elfinder-navbar-root-trash .elfinder-navbar-icon:before{content:'\e80b'}.elfinder-places .elfinder-navbar-root .elfinder-navbar-icon:before{content:'\e825'}.elfinder-navbar-arrow{background-image:inherit!important;font:normal normal normal 14px/1 material;font-size:10px;padding-top:3px;padding-left:2px;color:#a9a9a9}.ui-state-active .elfinder-navbar-arrow{color:#fff}.elfinder-ltr .elfinder-navbar-collapsed .elfinder-navbar-arrow:before{content:'\e857'}.elfinder-rtl .elfinder-navbar-collapsed .elfinder-navbar-arrow:before{content:'\e858'}.elfinder-ltr .elfinder-navbar-expanded .elfinder-navbar-arrow:before,.elfinder-rtl .elfinder-navbar-expanded .elfinder-navbar-arrow:before{content:'\e851'}div.elfinder-cwd-wrapper-list tr.ui-state-default td span.ui-icon{font-size:8px;margin-top:5px;margin-right:5px}div.elfinder-cwd-wrapper-list .ui-icon-grip-dotted-vertical{margin:2px}.elfinder-cwd-view-list .elfinder-navbar-root-box td .elfinder-cwd-icon,.elfinder-cwd-view-list .elfinder-navbar-root-dropbox td .elfinder-cwd-icon,.elfinder-cwd-view-list .elfinder-navbar-root-ftp td .elfinder-cwd-icon,.elfinder-cwd-view-list .elfinder-navbar-root-googledrive td .elfinder-cwd-icon,.elfinder-cwd-view-list .elfinder-navbar-root-local td .elfinder-cwd-icon,.elfinder-cwd-view-list .elfinder-navbar-root-onedrive td .elfinder-cwd-icon,.elfinder-cwd-view-list .elfinder-navbar-root-sql td .elfinder-cwd-icon,.elfinder-cwd-view-list .elfinder-navbar-root-trash td .elfinder-cwd-icon,.elfinder-navbar-root-box .elfinder-cwd-icon,.elfinder-navbar-root-dropbox .elfinder-cwd-icon,.elfinder-navbar-root-ftp .elfinder-cwd-icon,.elfinder-navbar-root-googledrive .elfinder-cwd-icon,.elfinder-navbar-root-local .elfinder-cwd-icon,.elfinder-navbar-root-onedrive .elfinder-cwd-icon,.elfinder-navbar-root-sql .elfinder-cwd-icon,.elfinder-navbar-root-trash .elfinder-cwd-icon{background-image:inherit}.elfinder-cwd-view-list .elfinder-navbar-root-box td .elfinder-cwd-icon:before,.elfinder-cwd-view-list .elfinder-navbar-root-dropbox td .elfinder-cwd-icon:before,.elfinder-cwd-view-list .elfinder-navbar-root-ftp td .elfinder-cwd-icon:before,.elfinder-cwd-view-list .elfinder-navbar-root-googledrive td .elfinder-cwd-icon:before,.elfinder-cwd-view-list .elfinder-navbar-root-local td .elfinder-cwd-icon:before,.elfinder-cwd-view-list .elfinder-navbar-root-onedrive td .elfinder-cwd-icon:before,.elfinder-cwd-view-list .elfinder-navbar-root-sql td .elfinder-cwd-icon:before,.elfinder-cwd-view-list .elfinder-navbar-root-trash td .elfinder-cwd-icon:before,.elfinder-navbar-root-box .elfinder-cwd-icon:before,.elfinder-navbar-root-dropbox .elfinder-cwd-icon:before,.elfinder-navbar-root-ftp .elfinder-cwd-icon:before,.elfinder-navbar-root-googledrive .elfinder-cwd-icon:before,.elfinder-navbar-root-local .elfinder-cwd-icon:before,.elfinder-navbar-root-onedrive .elfinder-cwd-icon:before,.elfinder-navbar-root-sql .elfinder-cwd-icon:before,.elfinder-navbar-root-trash .elfinder-cwd-icon:before{font-family:material;background-color:transparent;color:#525252;font-size:55px;position:relative;top:-10px!important;padding:0;display:contents!important}.elfinder-cwd-view-list .elfinder-navbar-root-local td .elfinder-cwd-icon:before,.elfinder-navbar-root-local .elfinder-cwd-icon:before{content:'\e83d'}.elfinder-cwd-view-list .elfinder-navbar-root-ftp td .elfinder-cwd-icon:before,.elfinder-navbar-root-ftp .elfinder-cwd-icon:before{content:'\e823'}.elfinder-cwd-view-list .elfinder-navbar-root-sql td .elfinder-cwd-icon:before,.elfinder-navbar-root-sql .elfinder-cwd-icon:before{content:'\e83e'}.elfinder-cwd-view-list .elfinder-navbar-roor-dropbox td .elfinder-cwd-icon:before,.elfinder-navbar-roor-dropbox .elfinder-cwd-icon:before{content:'\e83f'}.elfinder-cwd-view-list .elfinder-navbar-roor-googledrive td .elfinder-cwd-icon:before,.elfinder-navbar-roor-googledrive .elfinder-cwd-icon:before{content:'\e840'}.elfinder-cwd-view-list .elfinder-navbar-roor-onedrive td .elfinder-cwd-icon:before,.elfinder-navbar-roor-onedrive .elfinder-cwd-icon:before{content:'\e841'}.elfinder-cwd-view-list .elfinder-navbar-roor-box td .elfinder-cwd-icon:before,.elfinder-navbar-roor-box .elfinder-cwd-icon:before{content:'\e842'}.elfinder-cwd-view-list .elfinder-navbar-root-trash td .elfinder-cwd-icon:before,.elfinder-navbar-root-trash .elfinder-cwd-icon:before{content:'\e80b'}.elfinder-dialog-icon{font:normal normal normal 14px/1 material;background:inherit;color:#524949;font-size:37px}.elfinder-dialog-icon:before{content:'\e843'}.elfinder-dialog-icon-mkdir:before{content:'\e808'}.elfinder-dialog-icon-mkfile:before{content:'\e809'}.elfinder-dialog-icon-copy:before{content:'\e80d'}.elfinder-dialog-icon-move:before,.elfinder-dialog-icon-prepare:before{content:'\e844'}.elfinder-dialog-icon-chunkmerge:before,.elfinder-dialog-icon-upload:before{content:'\e815'}.elfinder-dialog-icon-rm:before{content:'\e80a'}.elfinder-dialog-icon-file:before,.elfinder-dialog-icon-open:before,.elfinder-dialog-icon-readdir:before{content:'\e807'}.elfinder-dialog-icon-reload:before{content:'\e806'}.elfinder-dialog-icon-download:before{content:'\e816'}.elfinder-dialog-icon-save:before{content:'\e845'}.elfinder-dialog-icon-rename:before{content:'\e812'}.elfinder-dialog-icon-archive:before,.elfinder-dialog-icon-zipdl:before{content:'\e819'}.elfinder-dialog-icon-extract:before{content:'\e818'}.elfinder-dialog-icon-search:before{content:'\e81f'}.elfinder-dialog-icon-loadimg:before{content:'\e846'}.elfinder-dialog-icon-url:before{content:'\e81e'}.elfinder-dialog-icon-resize:before{content:'\e81d'}.elfinder-dialog-icon-netmount:before{content:'\e823'}.elfinder-dialog-icon-netunmount:before{content:'\e824'}.elfinder-dialog-icon-chmod:before{content:'\e826'}.elfinder-dialog-icon-dim:before,.elfinder-dialog-icon-preupload:before{content:'\e847'}.elfinder-contextmenu .elfinder-contextmenu-item span.elfinder-contextmenu-icon{font-size:16px}.elfinder-contextmenu .elfinder-contextmenu-item .elfinder-contextsubmenu-item .ui-icon{font-size:15px}.elfinder-contextmenu .elfinder-contextmenu-item .elfinder-button-icon-link:before{content:'\e837'}.elfinder .elfinder-contextmenu-extra-icon{margin-top:-6px}.elfinder .elfinder-contextmenu-extra-icon a{padding:5px;margin:-16px}.elfinder-button-icon-link:before{content:'\e81e'!important}.elfinder .elfinder-contextmenu-arrow{font:normal normal normal 14px/1 material;background-image:inherit;font-size:10px!important;padding-top:3px}.elfinder .elfinder-contextmenu-arrow:before{content:'\e857'}.elfinder-contextmenu .ui-state-hover .elfinder-contextmenu-arrow{background-image:inherit}.elfinder-quicklook .ui-resizable-se{background:inherit}.elfinder-quicklook-navbar-icon{background:transparent;font:normal normal normal 14px/1 material;font-size:32px;color:#fff}.elfinder-quicklook-titlebar-icon{margin-top:-8px}.elfinder-quicklook-titlebar-icon .ui-icon{border:0;opacity:.8;font-size:15px;padding:1px}.elfinder-quicklook-titlebar .ui-icon-circle-close,.elfinder-quicklook .ui-icon-gripsmall-diagonal-se{color:#f1f1f1}.elfinder-quicklook-navbar-icon-prev:before{content:'\e848'}.elfinder-quicklook-navbar-icon-next:before{content:'\e849'}.elfinder-quicklook-navbar-icon-fullscreen:before{content:'\e84a'}.elfinder-quicklook-navbar-icon-fullscreen-off:before{content:'\e84b'}.elfinder-quicklook-navbar-icon-close:before{content:'\e84c'}.ui-button-icon{background-image:inherit}.ui-icon-search:before{content:'\e81f'}.ui-icon-close:before,.ui-icon-closethick:before{content:'\e839'}.ui-icon-circle-close:before{content:'\e84c'}.ui-icon-gear:before{content:'\e82f'}.ui-icon-gripsmall-diagonal-se:before{content:'\e838'}.ui-icon-locked:before{content:'\e834'}.ui-icon-unlocked:before{content:'\e836'}.ui-icon-arrowrefresh-1-n:before{content:'\e821'}.ui-icon-plusthick:before{content:'\e83a'}.ui-icon-arrowreturnthick-1-s:before{content:'\e83b'}.ui-icon-minusthick:before{content:'\e83c'}.ui-icon-pin-s:before{content:'\e84d'}.ui-icon-check:before{content:'\e84e'}.ui-icon-arrowthick-1-s:before{content:'\e84f'}.ui-icon-arrowthick-1-n:before{content:'\e850'}.ui-icon-triangle-1-s:before{content:'\e851'}.ui-icon-triangle-1-n:before{content:'\e852'}.ui-icon-grip-dotted-vertical:before{content:'\e853'}.elfinder-lock,.elfinder-perms,.elfinder-symlink{background-image:inherit;font:normal normal normal 18px/1 material;color:#4d4d4d}.elfinder-na .elfinder-perms:before{content:'\e824'}.elfinder-ro .elfinder-perms:before{content:'\e835'}.elfinder-wo .elfinder-perms:before{content:'\e854'}.elfinder-group .elfinder-perms:before{content:'\e800'}.elfinder-lock:before{content:'\e834'}.elfinder-symlink:before{content:'\e837'}.elfinder .elfinder-toast>div{font:normal normal normal 14px/1 material}.elfinder .elfinder-toast>div:before{font-size:45px;position:absolute;left:5px;top:15px}.elfinder .elfinder-toast>.toast-error,.elfinder .elfinder-toast>.toast-info,.elfinder .elfinder-toast>.toast-success,.elfinder .elfinder-toast>.toast-warning{background-image:inherit!important}.elfinder .elfinder-toast>.toast-info:before{content:'\e817';color:#3498DB}.elfinder .elfinder-toast>.toast-error:before{content:'\e855';color:#F44336}.elfinder .elfinder-toast>.toast-success:before{content:'\e84e';color:#4CAF50}.elfinder .elfinder-toast>.toast-warning:before{content:'\e856';color:#FF9800}.elfinder-drag-helper-icon-status{font:normal normal normal 14px/1 material;background:inherit}.elfinder-drag-helper-icon-status:before{content:'\e824'}.elfinder-drag-helper-move .elfinder-drag-helper-icon-status{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.elfinder-drag-helper-move .elfinder-drag-helper-icon-status:before{content:'\e854'}.elfinder-drag-helper-plus .elfinder-drag-helper-icon-status{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.elfinder-drag-helper-plus .elfinder-drag-helper-icon-status:before{content:'\e84c'}.elfinder-cwd-view-list td .elfinder-cwd-icon{background-image:url("../images/icons-small.png")}.elfinder-cwd-icon{background:url("../images/icons-big.png") 0 0 no-repeat}.elfinder-cwd-icon:before{font-size:10px;position:relative;top:27px;left:inherit;padding:1px;background-color:transparent}.elfinder-info-title .elfinder-cwd-icon:before{top:32px;display:block;margin:0 auto}.elfinder-info-title .elfinder-cwd-icon.elfinder-cwd-bgurl:before{background-color:#313131!important}.elfinder-cwd-view-icons .elfinder-cwd-icon.elfinder-cwd-bgurl:before{left:inherit;background-color:#313131}.elfinder-quicklook .elfinder-cwd-icon:before{top:33px;left:50%!important;position:relative;display:block;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.elfinder-cwd-icon-x-zip:before,.elfinder-cwd-icon-zip:before{content:'zip'!important}.elfinder-cwd-icon-x-xz:before{content:'xz'!important}.elfinder-cwd-icon-x-7z-compressed:before{content:'7z'!important}.elfinder-cwd-icon-x-gzip:before{content:'gzip'!important}.elfinder-cwd-icon-x-tar:before{content:'tar'!important}.elfinder-cwd-icon-x-bzip2:before,.elfinder-cwd-icon-x-bzip:before{content:'bzip'!important}.elfinder-cwd-icon-x-rar-compressed:before,.elfinder-cwd-icon-x-rar:before{content:'rar'!important}.elfinder-cwd-icon-directory{background-position:0 -50px}.elfinder-cwd-icon-application{background-position:0 -150px}.elfinder-cwd-icon-text{background-position:0 -200px}.elfinder-cwd-icon-plain,.elfinder-cwd-icon-x-empty{background-position:0 -250px}.elfinder-cwd-icon-image{background-position:0 -300px}.elfinder-cwd-icon-vnd-adobe-photoshop{background-position:0 -350px}.elfinder-cwd-icon-vnd-adobe-photoshop:before{content:none!important}.elfinder-cwd-icon-postscript{background-position:0 -400px}.elfinder-cwd-icon-audio{background-position:0 -450px}.elfinder-cwd-icon-dash-xml,.elfinder-cwd-icon-flash-video,.elfinder-cwd-icon-video,.elfinder-cwd-icon-vnd-apple-mpegurl,.elfinder-cwd-icon-x-mpegurl{background-position:0 -500px}.elfinder-cwd-icon-rtf,.elfinder-cwd-icon-rtfd{background-position:0 -550px}.elfinder-cwd-icon-pdf{background-position:0 -600px}.elfinder-cwd-icon-x-msaccess{background-position:0 -650px}.elfinder-cwd-icon-x-msaccess:before{content:none!important}.elfinder-cwd-icon-msword,.elfinder-cwd-icon-vnd-ms-word,.elfinder-cwd-icon-vnd-ms-word-document-macroEnabled-12,.elfinder-cwd-icon-vnd-ms-word-template-macroEnabled-12{background-position:0 -700px}.elfinder-cwd-icon-msword:before,.elfinder-cwd-icon-vnd-ms-word-document-macroEnabled-12:before,.elfinder-cwd-icon-vnd-ms-word-template-macroEnabled-12:before,.elfinder-cwd-icon-vnd-ms-word:before{content:none!important}.elfinder-cwd-icon-ms-excel,.elfinder-cwd-icon-vnd-ms-excel,.elfinder-cwd-icon-vnd-ms-excel-addin-macroEnabled-12,.elfinder-cwd-icon-vnd-ms-excel-sheet-binary-macroEnabled-12,.elfinder-cwd-icon-vnd-ms-excel-sheet-macroEnabled-12,.elfinder-cwd-icon-vnd-ms-excel-template-macroEnabled-12{background-position:0 -750px}.elfinder-cwd-icon-ms-excel:before,.elfinder-cwd-icon-vnd-ms-excel-addin-macroEnabled-12:before,.elfinder-cwd-icon-vnd-ms-excel-sheet-binary-macroEnabled-12:before,.elfinder-cwd-icon-vnd-ms-excel-sheet-macroEnabled-12:before,.elfinder-cwd-icon-vnd-ms-excel-template-macroEnabled-12:before,.elfinder-cwd-icon-vnd-ms-excel:before{content:none!important}.elfinder-cwd-icon-vnd-ms-powerpoint,.elfinder-cwd-icon-vnd-ms-powerpoint-addin-macroEnabled-12,.elfinder-cwd-icon-vnd-ms-powerpoint-presentation-macroEnabled-12,.elfinder-cwd-icon-vnd-ms-powerpoint-slide-macroEnabled-12,.elfinder-cwd-icon-vnd-ms-powerpoint-slideshow-macroEnabled-12,.elfinder-cwd-icon-vnd-ms-powerpoint-template-macroEnabled-12{background-position:0 -800px}.elfinder-cwd-icon-vnd-ms-powerpoint-addin-macroEnabled-12:before,.elfinder-cwd-icon-vnd-ms-powerpoint-presentation-macroEnabled-12:before,.elfinder-cwd-icon-vnd-ms-powerpoint-slide-macroEnabled-12:before,.elfinder-cwd-icon-vnd-ms-powerpoint-slideshow-macroEnabled-12:before,.elfinder-cwd-icon-vnd-ms-powerpoint-template-macroEnabled-12:before,.elfinder-cwd-icon-vnd-ms-powerpoint:before{content:none!important}.elfinder-cwd-icon-vnd-ms-office,.elfinder-cwd-icon-vnd-oasis-opendocument-chart,.elfinder-cwd-icon-vnd-oasis-opendocument-database,.elfinder-cwd-icon-vnd-oasis-opendocument-formula,.elfinder-cwd-icon-vnd-oasis-opendocument-graphics,.elfinder-cwd-icon-vnd-oasis-opendocument-graphics-template,.elfinder-cwd-icon-vnd-oasis-opendocument-image,.elfinder-cwd-icon-vnd-oasis-opendocument-presentation,.elfinder-cwd-icon-vnd-oasis-opendocument-presentation-template,.elfinder-cwd-icon-vnd-oasis-opendocument-spreadsheet,.elfinder-cwd-icon-vnd-oasis-opendocument-spreadsheet-template,.elfinder-cwd-icon-vnd-oasis-opendocument-text,.elfinder-cwd-icon-vnd-oasis-opendocument-text-master,.elfinder-cwd-icon-vnd-oasis-opendocument-text-template,.elfinder-cwd-icon-vnd-oasis-opendocument-text-web,.elfinder-cwd-icon-vnd-openofficeorg-extension,.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-presentation,.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-slide,.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-slideshow,.elfinder-cwd-icon-vnd-openxmlformats-officedocument-presentationml-template,.elfinder-cwd-icon-vnd-openxmlformats-officedocument-spreadsheetml-sheet,.elfinder-cwd-icon-vnd-openxmlformats-officedocument-spreadsheetml-template,.elfinder-cwd-icon-vnd-openxmlformats-officedocument-wordprocessingml-document,.elfinder-cwd-icon-vnd-openxmlformats-officedocument-wordprocessingml-template{background-position:0 -850px}.elfinder-cwd-icon-html{background-position:0 -900px}.elfinder-cwd-icon-css{background-position:0 -950px}.elfinder-cwd-icon-javascript,.elfinder-cwd-icon-x-javascript{background-position:0 -1000px}.elfinder-cwd-icon-x-perl{background-position:0 -1050px}.elfinder-cwd-icon-x-python,.elfinder-cwd-icon-x-python:after{background-position:0 -1100px}.elfinder-cwd-icon-x-ruby{background-position:0 -1150px}.elfinder-cwd-icon-x-sh,.elfinder-cwd-icon-x-shellscript{background-position:0 -1200px}.elfinder-cwd-icon-x-c,.elfinder-cwd-icon-x-c--,.elfinder-cwd-icon-x-c--hdr,.elfinder-cwd-icon-x-c--src,.elfinder-cwd-icon-x-chdr,.elfinder-cwd-icon-x-csrc{background-position:0 -1250px}.elfinder-cwd-icon-x-jar,.elfinder-cwd-icon-x-java,.elfinder-cwd-icon-x-java-source{background-position:0 -1300px}.elfinder-cwd-icon-x-jar:before,.elfinder-cwd-icon-x-java-source:before,.elfinder-cwd-icon-x-java:before{content:none!important}.elfinder-cwd-icon-x-php{background-position:0 -1350px}.elfinder-cwd-icon-xml,.elfinder-cwd-icon-xml:after{background-position:0 -1400px}.elfinder-cwd-icon-x-7z-compressed,.elfinder-cwd-icon-x-bzip,.elfinder-cwd-icon-x-bzip2,.elfinder-cwd-icon-x-gzip,.elfinder-cwd-icon-x-rar,.elfinder-cwd-icon-x-rar-compressed,.elfinder-cwd-icon-x-tar,.elfinder-cwd-icon-x-xz,.elfinder-cwd-icon-x-zip,.elfinder-cwd-icon-zip{background-position:0 -1450px}.elfinder-cwd-icon-x-shockwave-flash{background-position:0 -1500px}.elfinder-cwd-icon-group{background-position:0 -1550px}.elfinder-cwd-icon-json{background-position:0 -1600px}.elfinder-cwd-icon-json:before{content:none!important}.elfinder-cwd-icon-markdown,.elfinder-cwd-icon-x-markdown{background-position:0 -1650px}.elfinder-cwd-icon-markdown:before,.elfinder-cwd-icon-x-markdown:before{content:none!important}.elfinder-cwd-icon-sql{background-position:0 -1700px}.elfinder-cwd-icon-sql:before{content:none!important}.elfinder-cwd-icon-svg,.elfinder-cwd-icon-svg-xml{background-position:0 -1750px}.elfinder-cwd-icon-svg-xml:before,.elfinder-cwd-icon-svg:before{content:none!important}.elfinder-toolbar{background:#061325;-webkit-border-radius:0;border-radius:0;border:0;padding:5px 0}.elfinder-buttonset{-webkit-border-radius:0;border-radius:0;border:0;margin:0 5px;height:24px}.elfinder .elfinder-button{background:transparent;-webkit-border-radius:0;border-radius:0;cursor:pointer;color:#efefef}.elfinder-toolbar-button-separator{border:0}.elfinder-button-menu{-webkit-border-radius:2px;border-radius:2px;-webkit-box-shadow:0 1px 6px rgba(0, 0, 0, 0.3);box-shadow:0 1px 6px rgba(0, 0, 0, 0.3);border:none;margin-top:5px}.elfinder-button-menu-item{color:#666666;padding:6px 19px}.elfinder-button-menu-item.ui-state-hover{color:#141414;background-color:#f5f4f4}.elfinder-button-menu-item-separated{border-top:1px solid #e5e5e5}.elfinder-button-menu-item-separated.ui-state-hover{border-top:1px solid #e5e5e5}.elfinder .elfinder-button-search{margin:0 10px;min-height:inherit}.elfinder .elfinder-button-search input{background:rgba(22, 43, 76, 0.75);-webkit-border-radius:2px;border-radius:2px;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;border:0;margin:0;padding:0 23px;height:24px;color:#fff}.elfinder .elfinder-button-search .elfinder-button-menu{margin-top:4px;border:none;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.5);box-shadow:0 1px 3px rgba(0, 0, 0, 0.5)}.elfinder .elfinder-navbar{background:#2a384d;-webkit-box-shadow:0 1px 8px rgba(0, 0, 0, 0.6);box-shadow:0 1px 8px rgba(0, 0, 0, 0.6);border:none}.elfinder-navbar-dir{color:#e6e6e6;cursor:pointer;-webkit-border-radius:2px;border-radius:2px;padding:5px;border:none}.elfinder-navbar-dir.ui-state-active.ui-state-hover,.elfinder-navbar-dir.ui-state-hover{background:#17202c;color:#e6e6e6;border:none}.elfinder-disabled .elfinder-navbar .ui-state-active,.elfinder-navbar .ui-state-active{background:#1b2533;border:none}.elfinder-workzone{background:#0e1827}.elfinder-cwd-file{color:#ddd}.elfinder-cwd-file.ui-selected.ui-state-hover,.elfinder-cwd-file.ui-state-hover{background:#1a283c;color:#ddd}.elfinder-cwd-file.ui-selected{background:#152131;color:#ddd;width:120px!important}.elfinder-cwd-filename input,.elfinder-cwd-filename textarea{padding:2px;-webkit-border-radius:2px!important;border-radius:2px!important;width:100px!important;background:#fff;color:#222}.elfinder-cwd-filename input:focus,.elfinder-cwd-filename textarea:focus{outline:none;border:1px solid #555}.elfinder-cwd-view-icons .elfinder-cwd-file .elfinder-cwd-filename.ui-state-hover,.elfinder-cwd-view-icons .elfinder-cwd-file .ui-state-hover,.elfinder-disabled .elfinder-cwd-view-icons .elfinder-cwd-file .elfinder-cwd-filename.ui-state-hover,.elfinder-disabled .elfinder-cwd table td.ui-state-hover{background:transparent}.elfinder-cwd table{padding:0}.elfinder-cwd table tr:nth-child(odd){background-color:transparent}.elfinder-cwd table tr:nth-child(odd).ui-state-hover{background-color:#1a283c}#elfinder-elfinder-cwd-thead td{background:#010e21;color:#ddd}#elfinder-elfinder-cwd-thead td.ui-state-active,#elfinder-elfinder-cwd-thead td.ui-state-hover{background:#010a17}#elfinder-elfinder-cwd-thead td.ui-state-active.ui-state-hover{background:#010812}.ui-selectable-helper{border:1px solid #022861;background-color:rgba(3, 62, 150, 0.38)}.elfinder-cwd-wrapper.elfinder-cwd-wrapper-trash{background-color:#e4e4e4}.elfinder-cwd-wrapper.elfinder-cwd-wrapper-trash .elfinder-cwd-file{color:#333}.elfinder-cwd-wrapper.elfinder-cwd-wrapper-trash .elfinder-cwd-file.ui-selected.ui-state-hover,.elfinder-cwd-wrapper.elfinder-cwd-wrapper-trash .elfinder-cwd-file.ui-state-hover{background:#1a283c;color:#ddd}.elfinder-cwd-wrapper.elfinder-cwd-wrapper-trash .elfinder-cwd-file.ui-selected{background:#152131;color:#ddd}.elfinder .elfinder-statusbar{background:#061325;-webkit-border-radius:0;border-radius:0;border:0;color:#cfd2d4}.elfinder-path,.elfinder-stat-size{margin:0 15px}.ui-button,.ui-button.ui-state-default,.ui-button:active{display:inline-block;font-weight:normal;text-align:center;vertical-align:middle;cursor:pointer;white-space:nowrap;-webkit-border-radius:3px;border-radius:3px;text-transform:uppercase;-webkit-box-shadow:1px 1px 4px rgba(0, 0, 0, 0.4);box-shadow:1px 1px 4px rgba(0, 0, 0, 0.4);-webkit-transition:all 0.4s;-o-transition:all 0.4s;transition:all 0.4s;background:#fff;color:#222;border:none}.ui-button .ui-icon,.ui-button.ui-state-default .ui-icon,.ui-button:active .ui-icon{color:#222}.ui-button.ui-state-active,.ui-button.ui-state-hover,.ui-button:active,.ui-button:focus,.ui-button:hover,a.ui-button:active{background:#3498DB;color:#fff;border:none}.ui-button.ui-state-active .ui-icon,.ui-button.ui-state-hover .ui-icon,.ui-button:active .ui-icon,.ui-button:focus .ui-icon,.ui-button:hover .ui-icon,a.ui-button:active .ui-icon{color:#fff}.ui-button.ui-state-active:hover{background:#217dbb;color:#fff;border:none}.ui-button:focus{outline:none!important}.ui-controlgroup-horizontal .ui-button{-webkit-border-radius:0;border-radius:0;border:0}.elfinder .elfinder-contextmenu,.elfinder .elfinder-contextmenu-sub{-webkit-border-radius:2px;border-radius:2px;-webkit-box-shadow:0 1px 6px rgba(0, 0, 0, 0.3);box-shadow:0 1px 6px rgba(0, 0, 0, 0.3);border:none}.elfinder .elfinder-contextmenu-separator,.elfinder .elfinder-contextmenu-sub-separator{border-top:1px solid #e5e5e5}.elfinder .elfinder-contextmenu-item{color:#666;padding:5px 30px}.elfinder .elfinder-contextmenu-item.ui-state-hover{background-color:#f5f4f4;color:#141414}.elfinder .elfinder-contextmenu-item.ui-state-active{background-color:#2196F3;color:#fff}.elfinder .elfinder-dialog{-webkit-border-radius:0;border-radius:0;border:0;-webkit-box-shadow:0 1px 30px rgba(0, 0, 0, 0.6);box-shadow:0 1px 30px rgba(0, 0, 0, 0.6)}.elfinder .elfinder-dialog .ui-dialog-content[id*=edit-elfinder-elfinder-]{padding:0}.elfinder .elfinder-dialog .ui-tabs{-webkit-border-radius:0;border-radius:0;border:0}.elfinder .elfinder-dialog .ui-tabs-nav{-webkit-border-radius:0;border-radius:0;border:0;background:transparent;border-bottom:1px solid #ddd}.elfinder .elfinder-dialog .ui-tabs-nav li{border:0;font-weight:normal;background:transparent;margin:0;padding:3px 0}.elfinder .elfinder-dialog .ui-tabs-nav li.ui-tabs-active{padding-bottom:7px}.elfinder .elfinder-dialog .ui-tabs-nav .ui-state-active a,.elfinder .elfinder-dialog .ui-tabs-nav .ui-tabs-selected a,.elfinder .elfinder-dialog .ui-tabs-nav li:hover a{-webkit-box-shadow:inset 0 -2px 0 #3498DB;box-shadow:inset 0 -2px 0 #3498DB;color:#3498DB}.std42-dialog .ui-dialog-titlebar{background:#0f1f2f;-webkit-border-radius:0;border-radius:0;border:0}.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-button .ui-icon{border-color:inherit;-webkit-transition:0.2s ease-out;-o-transition:0.2s ease-out;transition:0.2s ease-out;opacity:0.8;color:#fff;width:auto;height:auto;font-size:12px;padding:3px}.elfinder-mobile .std42-dialog .ui-dialog-titlebar .ui-dialog-titlebar-close .ui-icon,.std42-dialog .ui-dialog-titlebar .ui-dialog-titlebar-close:hover .ui-icon{background-color:#F44336}.elfinder-mobile .std42-dialog .ui-dialog-titlebar .elfinder-titlebar-full .ui-icon,.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-full:hover .ui-icon{background-color:#4CAF50}.elfinder-mobile .std42-dialog .ui-dialog-titlebar .elfinder-titlebar-minimize .ui-icon,.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-minimize:hover .ui-icon{background-color:#FF9800}.elfinder-dialog-title{color:#f1f1f1}.std42-dialog .ui-dialog-content{background:#fff}.ui-widget-content{font-family:"Noto Sans", sans-serif;color:#546E7A}.std42-dialog .ui-dialog-buttonpane button{margin:2px;padding:.4em .5em}.std42-dialog .ui-dialog-buttonpane button span.ui-icon{padding:0}.elfinder-upload-dialog-wrapper .elfinder-upload-dirselect{width:inherit;height:inherit;padding:.4em;margin-left:5px;color:#222}.elfinder-upload-dialog-wrapper .elfinder-upload-dirselect.ui-state-hover{background:#888;color:#fff;outline:none;-webkit-border-radius:2px;border-radius:2px}.elfinder-upload-dialog-wrapper .ui-button{padding:.4em 3px;margin:0 2px}.elfinder-upload-dialog-wrapper .ui-button{margin-left:19px;margin-right:-15px}.elfinder-upload-dropbox{border:2px dashed #bbb}.elfinder-upload-dropbox:focus{outline:none}.elfinder-upload-dropbox.ui-state-hover{background:#f1f1f1;border:2px dashed #bbb}.elfinder-help *,.elfinder-help a{color:#546E7A}themes/dark/images/hide.png000064400000003134151215013520011632 0ustar00�PNG


IHDR  szz�tEXtSoftwareAdobe ImageReadyq�e<%iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 6.0-c002 79.164460, 2020/05/12-16:04:17        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop 21.2 (Macintosh)" xmpMM:InstanceID="xmp.iid:1676E08A4C2911EBBA7FB7B3BDD03902" xmpMM:DocumentID="xmp.did:1676E08B4C2911EBBA7FB7B3BDD03902"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:52B4976B4C2511EBBA7FB7B3BDD03902" stRef:documentID="xmp.did:52B4976C4C2511EBBA7FB7B3BDD03902"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>g	{��IDATx��OH�A�����`Q�%("� Q�!��Kۖv�t�KX3{�Eaԡ"�"����<T���l�V�}|�N3���Z9��7���{o�{��Q�X�YΑ�Y��L&S-[�D%T�h��`/�^����ع�Z�HAFπ�`���V���Ϡ�
�ot�@�YpD��x�)��� ��)�Ԇ��s��Piz����g`�
{-�L��J���u��߃贌g(����j�9���q�,2�ң��u�0A9�JΑs��6p��v0]I�F �BJ8�&�/�$%�`XK'�����5G��t��Q�ݴ{R3�g?�>f�sSOI��6ꎘ�.�L�PHv�ˣ`H�#�����W�=�#Г��?8i>{�7*�c=�`�󜮁�1��@�1i(��Ѡk�t�+`g`�!�I����&���3�"�-\W�H^<�p��v۸4�M<rY��?�U!Ϙ�g�f�JϿ�X̚���,��8�1����lb%}@
�,�F�QpKT������ӎ��&Z��n��bc)��]t\ץU+�o�x�Q���|V[]�y��"�;�4S�pt��'�R�zu"����ކܹ�R�a�s瓼�;xBz�
#/��ezK�vi��FF�˴R�ȳ���(�a܄��j��3d��yp�����7�8�'���DK5>���������/��K�IEND�B`�themes/dark/images/loading.svg000064400000005234151215013520012354 0ustar00<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
	 viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve">
<style type="text/css">.st0{fill:#333333;}</style>
<path class="st0" d="M11.4,0.7c1.8,0.9,3.1,2.1,3.9,3.9l-1,0.5c-0.6-1.3-2-2.7-3.3-3.4">
<animate  accumulate="none" additive="replace" attributeName="fill" begin="0s" calcMode="linear" dur="1s" fill="remove" repeatCount="indefinite" restart="always" values="#333;#eee;#333;#333">
		</animate>
</path>
<path class="st0" d="M15.5,5.2c0.6,1.9,0.7,3.7,0,5.5l-1-0.4c0.5-1.4,0.5-3.3,0-4.8">
<animate  accumulate="none" additive="replace" attributeName="fill" begin="0.125s" calcMode="linear" dur="1s" fill="remove" repeatCount="indefinite" restart="always" values="#333;#eee;#333;#333">
		</animate>
</path>
<path class="st0" d="M15.2,11.4c-0.9,1.8-2.1,3.1-3.9,3.9l-0.5-1c1.3-0.6,2.7-2,3.3-3.4">
<animate  accumulate="none" additive="replace" attributeName="fill" begin="0.250s" calcMode="linear" dur="1s" fill="remove" repeatCount="indefinite" restart="always" values="#333;#eee;#333;#333">
		</animate>
</path>
<path class="st0" d="M10.7,15.5c-1.9,0.6-3.6,0.7-5.5,0l0.4-1.1c1.4,0.5,3.3,0.5,4.7,0">
<animate  accumulate="none" additive="replace" attributeName="fill" begin="0.375s" calcMode="linear" dur="1s" fill="remove" repeatCount="indefinite" restart="always" values="#333;#eee;#333;#333">
		</animate>
</path>
<path class="st0" d="M4.7,15.3c-1.8-0.9-3.1-2.1-3.9-3.9l1-0.5c0.6,1.3,2,2.7,3.3,3.4">
<animate  accumulate="none" additive="replace" attributeName="fill" begin="0.500s" calcMode="linear" dur="1s" fill="remove" repeatCount="indefinite" restart="always" values="#333;#eee;#333;#333">
		</animate>
</path>
<path class="st0" d="M0.5,10.8c-0.6-1.9-0.7-3.7,0-5.5l1.1,0.4c-0.5,1.4-0.5,3.3,0,4.8">
<animate  accumulate="none" additive="replace" attributeName="fill" begin="0.625s" calcMode="linear" dur="1s" fill="remove" repeatCount="indefinite" restart="always" values="#333;#eee;#333;#333">
		</animate>
</path>
<path class="st0" d="M0.7,4.7c0.9-1.8,2.1-3.1,3.9-3.9l0.5,1c-1.3,0.6-2.7,2-3.3,3.4">
<animate  accumulate="none" additive="replace" attributeName="fill" begin="0.750s" calcMode="linear" dur="1s" fill="remove" repeatCount="indefinite" restart="always" values="#333;#eee;#333;#333">
		</animate>
</path>
<path class="st0" d="M5.3,0.5c1.9-0.6,3.6-0.7,5.5,0l-0.4,1.1C9,1.1,7.1,1.1,5.7,1.6">
<animate  accumulate="none" additive="replace" attributeName="fill" begin="0.875s" calcMode="linear" dur="1s" fill="remove" repeatCount="indefinite" restart="always" values="#333;#eee;#333;#333">
		</animate>
</path>
</svg>
themes/dark/images/icon-new-window.png000064400000002450151215013520013745 0ustar00�PNG


IHDR..W�+7tEXtSoftwareAdobe ImageReadyq�e<%iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 6.0-c002 79.164460, 2020/05/12-16:04:17        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop 21.2 (Macintosh)" xmpMM:InstanceID="xmp.iid:52B497654C2511EBBA7FB7B3BDD03902" xmpMM:DocumentID="xmp.did:52B497664C2511EBBA7FB7B3BDD03902"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:52B497634C2511EBBA7FB7B3BDD03902" stRef:documentID="xmp.did:52B497644C2511EBBA7FB7B3BDD03902"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>�_Rc�IDATx��ٽJA��޵Z�
� ��Oacc�G%V���)|%`#B���2��[D��4^�30a��ݞw;���f/�K+Mӈ��!��-�uߐ�$�;�F�u�@0��X���N+�mq�_ ۈ��2�-愯�#���?Q��ñ�C	�9�w O��v{�AXl��.�Q�8!�+�m���Qe�P�>��u3~�:���GeM��;��E���c�@�T�xU����m��-O�>��O,��n�X���l�i{TL6"��]�q����g��F�Ѫc���z�MZ��3�W���xT.�#��?�|���;~c]7<���~	y�g%�M���g��r��J�x�x�x���p<��K�-p�����N�� 3��32�?!��%cgd@�W��C�<9��IEND�B`�themes/dark/images/icons-big.png000064400000061447151215013520012606 0ustar00�PNG


IHDR0@�#� IDATx^�	|�ǟ��$��[,�TLT�Jųh�Uo[��_%j=j�Dk�V�BxS/b�@��E����B8�$!!��?��L�ݝ㝝wf':��O��w�y����y�i�Ӧ}R&�8��zi����j�B�zji(����&L���G�U�h��=��ᒤ!TN���X$a�Ya���	���]Z}{���8n ������?�ְB�
�S�P�f7��­�n� ����w�Z�)��N��1+>J��-�uJ9�(F��i��v��	���W����S��ӥ\P1�:��-C�fѱCcW ���fVy�	��z�`58WU�m
m�����=�L�?�tJ>��ZXK���d�+w������{�zS����'�͆�fZ�~�u�ОtP߬@��O�a��
@M�ϯ�Bϯ��N���X�6�K��K��v��F���u��E�Dnj��3�MY(@/@��^:����R|��U}Vu%s�3WN���tj[��kם7�F�Z�K�b�@MxLd�kK��b�8qh��@�=�aiЊ�e��8nh/I���f�.���k�);�#?�L^f4��Z(^�X�by�lf}>�A�����j0�ƀ����
ʧ2/��4G-`EPWX ~������c�9j�n���9�BxlT>:b0�1JJ'2+��,��:<xp�ݬ���<�*��~?5�U�"�Q�ak��9�T%|���72|ʴ�K���!�X��b�T�ϋ̨��}5-�BYUE�Rm)���@�IK
E1��P�ֿ��y��Ʌ 8���_hq����d�y�x?:�G�"�Y�Q�Ϥ�yQ�UM�]���wR��Yxy8G �HH�Gx*H�����Bs�R͎�<eW�Ŕo����(��n
@D�����@W<x�+Ͱ��Y�USv��,`�fY�,��)��y�K���z`Ք]�<إY�q=�jʮ~���,븞X5eW?�vi�u\�����ߏ���R�]�y�9€�.��Wv0B��~�H�G>�R�xq��U��cb������	*A����_�к�=<x��υ,*���,����,*���1�ʴ���6H��uG��$��21�r5:�(9�;�W��.���]r�8)Q/��9�Q�����a�Z��#��V�gv<L�[K�n'��\b�uN���r�^�f��	{�u#���]\o��@����>	� Vn�T�COMA J���O�}'-)K=�eh�^eKz��	�l�������ZR"���nls�^�t��7J���`R��tlcoo{�t��nl5����t�}:���}�0�~ָ
�j������#�O^���Պ��N������,�HT�cvq)����%SA��\�DQ���Dp�.�
�VpT�X$��ODžl�9� ���Ž�ATp����|U�|=ݼ|P>ܫ����5ת��^��YN|�����>I�%�ڧ�4-���mQy������r${AK���@�s!��'�`��ˇ8H�z;4�;�;<u7�i����P;�>�߉�м�1=�і}=ءU3c�x-���ީ�j�Jѱ�ީ�]�H������M���;�1�'��;1����m���v����ޛ��ѱ�\p4ŌKF&���$!C'�e�c��N
��v��\�����y��'\�m����`S�Y='�G�w��i�?1��F�L9J��@Z�i���qɈ�cK�Ҡk-��
���g�&�R��R��U��hA\�—F�/��
.k�u@��f��K9���xOy���S8hM>d*�F�W;�ØS`$<u5fg��i�P]���cNq
ܔ�hM��r$C'��j����[��^9���e��?��;���#%��'F��!o�����<���-�3�0(��.�lU/���dk����a��S����w*"����Yr6��&�"�
���۳囚L���(��2�T�_h*���y�7$%
�
p�s����7�I�=K�'�ڏ�5��i!��-���"�3�\�i��?"2C��,�+�@�@�H��Y�욂��\Rf�����D��l'�|��U�쪟%�-$�ڕN�Q1���z���)�秴켢��~	�)���/	.�,7a�����l���X��T�mMں'�R.���4���c���5��̚�x���#������.T�=B�m'��X��~\� f0��P��R�b���14���.dk�^��^3���z.Ġ@ۺx3�73:��?� f�[�q�B�H�8���(ۺy�M��{`T�m�~Z(~�%����ӈ�WP}QfB�f��I/�)E��ٶ��0�\�{�d����ݢ�Q3)��UlY5�W���A'k%�3��Ul��H��D�eg)/�P��ҝY!\@x[V��^�V��#��sy��=�m뇻�od�߉\H���X���V�1����_hx�Vy�����/u]ky��z1�3iY�֥� ��j��\��rڛ�;}�ԧ<�8%K	�A���ɸ� �f�d,�3���8X^[��r��-_�XV��<XT���=XV��<XT���MY��ز����-�:�4�f���y%e"��{l�5Ոm��j~{l�1���G��[{�`��!T-��y%�D��[�DFV�tA��{l���/	���kY�c+U�qI`�p�)�3�[��f	"-+�|a�;��r2��l�pk�f0�?	>�ҳ��\�6�[N����HG��fA�����/y�m�-'L�(�o�V����P����(;-��8�6:��a&��_����5Oi]`�g
�H���]�$z *�:�Ň\H�+i�5;>OB<�Kd����?�ů��0���+���y�x��5(]( 	����A=hO��~ɍ��9z�i��@|P�K��UhX/�O��x�r�u]����NJ�#
����%WJ�)��U/K�J�)[)(4
�a�@��u�X?�K�����:�f�[>���m�n6���R�F�\���]���=��Y��,X�c��8��g��鶮F���r)�S��X�?R�!��1�?R���]=;�jfL�f�eG_�vh�̘��hˎ���Ъ�1�-P2�$�#Z���$�QAUi�[畔��=��,���2㯎�լ��k|�(�*bK[]�/##
�����kB�O�6ʳ�����IC�Z`@���EQt�b���gi(��z�V�H�!A�C{�Z��J@���|>��M.��7f��	��D��U���s[N�@k�N�DZ5ӵ@>
��w6�d��r@��w4�H:eg$P�2��,g��r�u�!�5���b�`U��~�L(˖�\,p�/� |i���M��[���r��p�m�����|F�,�;��(�,�9����-��-�]���u	#�7���;|(-^����/���y�]���C�>�+��X��>_��0n�����PL�+!�b��ݻ�
Jh)��kh��st�	�@ܨA8��z�t	���gЬ�������a��=�MV�Oj�Qc^=�RI�J�뿺�T��ŧt���?_|�2J/7\��.a�m���4���_)��F��-��p7\�@����j���-��r��k�whU�!F��N;�x����H��F.%���@^W��Ղ�UWM>���.�f�|��}��{�ܠ�[\��j34 ��N?�xif��2�VH)��Q���2J���AJ��m]J	��������v��v�:���)��y�K���z`Ք]�<إY�q=�jʮ~?5狢�U[�.��f������%�"
�P�5�ثز+>-��Y���ae$��ﱵ���&=S�����~��B� :R�����%
�j���?/�cK@�&OJGl��^��"J�P���c6�Z��J@�%BB@`�p�)s�H�����{:!r�B�ȺZs[N�@]��ZDQs2�QO�|���[N`g��0u�B���
T�S�]�u!�n�[Ŗ��B^�<�:���Uބ~�Zg����?�P��{�yJ;�j��Vj}� ����3�B��E�S�ϡ�wS�o&'%|4�:>p�j��RJ?ueV\'�~��C`4h_�7��y�/ٴY���Z�fV\O駞��M�yx��s��$��rL��}��L{T3й�P�͕{��#)��2A�lf�����ؠ����-z�0�H�@�=S�^�Kr�����i5:>�q��\7�}b��`⛞�-���u@RhqK@�j�H���V��.���� ��p�tɢ}��n�^��rC�
y���ɮ�ķ�k�b�V(�P)\V@��*�Jd��,�2�QӚ���M�/\L��
RΗS��b�֑[���A�_��<�zn�!��3��BH�x���@���)�"��}X[� (�,�w[,M|��ǵZs�0�&���F���ۚ��#����d��
���R^Z�}��P\\���7�}��`�:����NH��0O$#���i�4iǎ��ИԒ�<^lht�Fϧg�\��a�n.�zC�<�5;�g���߳o��ϳ�Y���Ӳ���C�������k�b���q����ݰQ�HT�w���-�q�e<͊�]甔�`����kj�	�v��9����B�8s*���"&�j�]���̩��D��@iA�SS@i>_��C�Yd�T�TtFuH��nr!eVb�p+`� � A䥧�<�䩈N��j	koO�ꙖV��&NEt "������#ڧ""/�W4���TD'��{��x*���C������=ѣ�Z���l����_?��G��|�_�we���"ۣG|�4' Pz�xJ3�KHf����ޗU��s ��R��Y��?��^���g�y�^�Y�God9U�kk)R�]�8��7#���+\��!�{������w�����
M!t��P*�j{H�Ll��q1�5���,�,d�B=.��҃Aiq�\���mh��j���9F&p��:���b��}�m�.��OY��+�L��\ξ嶮�SDM��F���j��;�gm��a�Y⟤X��}���j��q�D�,7>%��駨��ؓ�q��jX�Ax[��Y���:�V/�U�G������i_�: r����+?T��7��3�^Բ�������W1����[o��Ye�-��˟>=�XZy1/p��@�Y����Y��F͎�Y���x��,�[�f�3e���|��TD
SA�*�"�:����r*�@��_�NE4���׬�j?���OE�_��1�,��x*bӄх�c��{a��!T-�x��bA�8r*b'��3�WZP]c}��H{l��,Z^cm��Tt�}H|�nr!e�b�p+`� � A����՘�c�����F-a�b�^~�ϖ}ʾǖ��hG{;���3(�W���TD'X�L��W���$_���JK�_d��nI����/�Di��&)�X/j�	j{v���	,8�LV�T��?��"�}*��8����_#�GI=�lS
���C@R�V���@���r�#1�"H�}�Xa��d�n?$��,�9,�$���n�B^JuJֿY�s$XI������8�A���d��:[���#�b�#�>��>!<��7.�$-�=J�4�gK��p�gJ�4�gK��p�O�-�c������
�
2�W�ﱵ�1%�K*�D�*s���!��Y�u�����8�D����F�ݎ_:��N�w*���[(��9q�w;@�4���~pO�@�#[�DV^��O��z�V����p88����*�R�!�@�nr!e�`�p+`� � A���,��Ul9
�wS����YU&�'PfNf������b�I1"Ҟ]{(��Q� ���U���T��-'Xgy����c�d���X�j��g�2�u@v���A{�{i�m�׻��7�Nr
����%��M�h�?�v[�w�=4q�W�%N2�K�5����1Z�e�M���7W��
��G�;�+^(^uxl���Ɔ��#���a��W$B��� ƍ��
���]_S���T�w������Y���A��
�Q�5$���GC-q7�D7��.�B��c2ȳk��q�x���J��K�Q�	�����(�?.!�2O����@� ��_��`r�q<�V�T�ۖ,��[?�wku�5eY�1��y�Z��	�n ��왵ϻ��6�V�g
���&J���.N��%�:%��}<�Tj��,�Y��<��@˗{��B�x��@˗���}��^ew��*��S����bk��{J��; �ʻ��ӫ�2cq�jVl}��]F�8��5kE��-##X
��";��Dg*�j�{�$
�j�599ž�3{luH��b�{�Z��J�B>_��={�Ul�
�3�Cd�M.��\�n��$�\A(?���\Ŗ�1�UIڬP���(��+?~���-'�=��H�>_���rb]sD|���MMl[V-�;q"�5�¡���2�s��]��]}5���2�c�'�@C,��e��׳'5��&�߫_�B�8�ٽ�»wwOX`ϲe�r��҆�ak�R�ƍ�w�j
��5Ώ=҅�e�8�B��uu�����x�i]�HFp�G�,���e9_$Ł��(@�;����FߌiUv�zG���Z�ҍ��Q1�
������<�)�p�RF���P�K/�4�>d��p!@X	fG�� 9x�.BJ��R��p@N�J��F2������w��n;��΍M�y��B-����Ƌ�r�Z��##����K��Ϻ2ܩ�����+����_��?���l@�"x�d�`X̵�^���@���?��0��C�m�4���C�fo�``%���i�-��:w�����TiW�
�e\��d��
@����PH��V��y�	����_�i��Uu,.�D��]�Ps����/���>٥��ї�ٛ�����f2cyHFk<��,�S�Ɍ�Y ���e�/{�ȏ�|��c���P���,�Y���=������f�b�gLrKӅ�=�Lp�Tĭ{��|b���㩈/�>�0"8S��uo�T�d!T-��ر�qf��N	"ǗQ:�&q7?=s�!�!D���X<1E�}"3��,�pf���	��D��W~M�'�*�����ڨ-�*b��_>�ӕ�[N�n�����z�"
e���V2���$��'/[�x*"/��ÇQzN�$�-[�iK�a��H�͡�ÆS���(g�@�8��Y#��'��ճ�d�7�#/�?�H�fs��ÇS�a�F��&��F���F��zۧ�h׺u���/Mܚ�k0��᭷%R��	��:�L)N]s-�56%*!�F.�q�E�����~�	3�F�;-eK[q!��Ws���D0���J	�c�'����S�dtؚ�X�̮u���O�\�+�}�tkgT��KmM�R ]q�j2�\8�!s@{�|�J�^�^�k�7M���|�ɯ㛞�;AC��].�h�u��O�&:ٗ����&�A�e���~t�<�h<�q4a��R�
�0�!����bG~���Կ����`�„��}�xƒ�b��Uut�Iy���t�c��0O��Ns!���N�I�p��g�A��1Z.�Ȋ�ɬ���ى���"�E�Ag��5��56JYl���_F�q��	_�E�Nd��X�-��O���5���p�C~�+��?�?ؤ@���>�
{ IDAT�(�+=�"�0�J�Oe�@���X��f��S�Ҽ<`j�=�k�0�o�����N,1��<�n�.�� |�r��'�PS~V���*FK��Y�5Y�g�Y��b�USv��,`�fY�,��)����,��ر���ઊ��XP��ĩ�ύ9��\r*"�Py�G˽�-���Ҹ�[#ϟUF8��=��q{MGF8X[5��[#ϟUHUl�5��!iUv���H��ȩ�Q4�&��S�UU��=�R@$��!ۃ߼�x�V���]"�!��F�0C�����/�U�n���*����]	�iOf�@���nb��r���Vk#Q$��O/Z[U�v*���	�/�|�d�=�x��?�feH"��7��FFq��
���N��CcH����}si��}��83^�����9������!�}�!���+�=�(�漣�d��(�PV�&�\[���s���g�m�&_�r�U�NU���V�=���J��T�r�*���nVr�����I�JnUK�Is�Zۼ���.tnjj*)>X�r�X�T��R�m��v���76��y���!���?�Pi?�{e-=z�)t��|:�^�[�8V�Yn�s!hZ�����:�W�H�ˤ�� �M�f�pnj��2�/�Hn�Z���bdw] H�^9G�z�N��ߥۮ8�V~QG�^S�nH'��f��A@N=�.;�p��ąpc9xe?��פ�x�/�ƤP�u]˚{��5��Kf���~ɬ��Z����b3£o��s<�x�q�j�l|(�cQ��߸<���,��u��w���\�P�%(f_|Jq@?|�2H��
W��)?+����,�ŅX\Ů>�]�e׳�����Y�.Ͳ��Y�USv�3e�C.��k���/R�����"���%�k*��r��W{[v���q5+��o�PFD�Wl��j�Iӂ�s��Ul�O�PH>B٥�}W3�4���o>ٱ=�:�i����^��"|BHG���,�v*b�:�5D���&R�3�[��f	��#������*������V;�|=��Ϩf��r[��v#�)��M��_Q�j��-GX�J��}p1[����9h(�<� ��+���V���U��~vDJ���O�=�F�
�l�,|����\j �ءGH��³4WL9�2���X�M��=o̤�ޟg�Y`��GSu51``����Ϥ`F��}�Im�a��r!�@�	XM銀�h��@n��%�T[Z޴k��r�$۹��G[�y�$4������'�JiB���BI��Cc�����rmڵ����B�@��<{2]yb)�= �;��9
3_��TI�o�4S��o��p�xW��… �����ϗkj_�B�n$���&Z[���8��]Mt�s!h�{/���li���U2�\ �K��b�5���-�O����6�4ҩ�\e��ײ;��GB�
���Ԗ��J�{�Op#�Ŝ����k���P�p�Df�u�/�=w�) 8�e\�#�\��Y�f�4���A���{��i�ڧ�Ld�p<h�n��|&`I�)0r
���m�
�i��=حa��=i��=حa��MY`�i���j�-��j�/`��ʿ�ŧ�� �H����ڇz[l�r��f���	��H��bkcs[MG@�V���b°°�L����?I'
�j�5���Xt�T�N	"' ��k�Wl���!S����*�R��!_D`�p�)�3�[��f	"' ��k�Ul9�Z;hoX�TD�\�����[N�PkW{uhl���r�Ec}�V��$��C�����b�@��#ȟ�'�ؾm�m��*oB?[�@i�S�c��A#�Cxe��c���R�=��z�$p���=j�P���u�������igp���P������]�^7�u۶m�M&���%�l��e�g�����hj��rh�e×Կ��=��]�e�� ��I#��M
���b R��Ҷu���>��^��Be5+�����`�R�����H�{7D]b�k��z<:�z��@��-������4Z�z��M�}�)@�D�jěec�519?e�'�C�O9��~���\H	�x/e�`��!w��b����]�F�,\���4$� ֛f���̛2b��%�G}��
��TbO	r{Z���@�u����<������Z��1CGW���.�@�gW> ؍h�F��/V�'�<�ȟ6�a�>���#;�+�ϲIp��B����A�@
�>+B�_:�f/�2{S��=��Lf,��h��5�xj3��<$�5�ט�����G�U����|�^�����%D��I�<b�:�b��KsK�bk�	T&��Wl�o���0�j�_���Pph���-�1��P�@�/�8r*b'��3�JG� �[)�4�Ba��cV����TtFv��c�p�)33�[��f	"�O�#?"s[N�@]+Q�v���^*���+��@�֎vү��rTT�<1;�܅L�)�}�Cl[�- ������ۋږUQGb���:���)��W��E��R�*j}�30��R�7HBC�FM���#ު����? _8��7`�^F�+�o~����R}f����r5��i=8G x���t]�����UK��p�>˴�[Ⱥr*e�ߥ��o>�8��`Р�-�8���b���gE�3Z�y.�2U3����g��4��#�ʅ����#�Ψ�f1�y��8�
��#ң���ɸk�i<�����8�DzP��?��6�}�F�l��Z	N~�w��]X�������<���x6�8�l�8���5�8�7���mý�>V�5 t�7��g�!g����`+��l��T��:�1���dk����ap�J���g[��08��S~�Cڞ�/w�ѥ#@��(4�mv�@%�H.�c�*�����-��}M��dX� 
�������&�`��[�J����ȩ���{l%�j��K)&1�H�V'���F�E8챕"J�	�V��E��J@g��">b�p�)33�[��f	"/�_^��zs[N���j1�c�g�_>j��=��@��ζ�0(;���͸ǖ��k�<��+��-=�@�(k�9�5ӱ��שc��>\�2C}�d�tC��?\F��Gw�Ih�`���3�X�[�o� �ય��2�qS���yYw��J�u�gF@���=
Tw�hg�ek��7S,y�_L�>b@������H��)g�1b�f����P��?;c����x�Ԭ��[p���:[�t������c���o�2�9�E�>������r&�܋'��d&kP�:,4�.���z.�HR��Z>\L;ﻖE~RН�0*O�`"j�V}��
�5��Z�;�Z��n�j�~9N�ڿ���UĖ�'����B(-�Vp��R.W���p�Å���~�_ڥ(�ZFk.�3M�,��<����=Fc���F��Tâ/�}��ΗV�'1;,���R{�H	�֓�f�4�{s2aW|�I��<Z�([���
2H��w�Mf��Nbv�Ƅa�/?�������7Ks�4?�P^d���ˁ*C�YCV��V�@)�C	"n��z4N0k�LG������Y���ӳ�m��׳�Z53�|[rH~@���bK�T��c뻒�%�[*��<���cˌ�:�W�b�ۿ�D�آ6�D�#A�S��Dq�Q�ݒB�O
b���p��!T�-*��>G*�(
���+����J�/�Dڂ4���[)�Z"�3��\Ho�n`���$!#�<����Ul9��D���Z𑐑S~��}�-G�Q�n�H�.D$-�����v*���S�O�;�V���߻]q�@�ۚ��'[�v�^Ջ��;�7�wU�9�{��r�`����(��n�۴+��Y"��oN2�ޡ����5{�`�����3�]u$�;(���^�-���u���1�S��jd�nT�(��=<q�p��1ru+��N.�x`�Y�j������_�;�Ȟ:�\�$�?k-ݰ��d'3=�IT\c��H�gڗ^��pS1��h23��!�I����(ۨ�(�k�Fs�-��0���Ò|��Ȗq@�l�����JZF��-@U><������H�V[j�#��>�k���0%Fn�Lu��}�W���v���C-���x@�I��|��IZM�BjG�̀����e��\���zz���2�>{d_�"�ߌ&1G��MMhe?�� ��Z�y׉�ҨZg�I�Mf�d,��mr�)>���I
��Ū7�R�Q��B�7ħ2�#}*\��j$��������jm=���``�,k?�USv��,`�fY�,��)��y�K��㚲ݶ$�粊���+����"�oY\"
�;���2r�I�[���h?͊�-�R&�4���6lo�iæHSk�Ulmz|X�_�9R��a{t��d!T-�e&������ ���(q{bm��O�	��B�=	?��[)�������*(\�­`a�p3����+u��=����-�ji�ޟJ:13P>�o�+�����j4�c+���hx�[N0�;!8p2�[Z��<�u9�=��ؼ�Y����k.����̃�m���F���*������g)}P��HF�}��4}�7jZ��[Tw�����BNĀg�f�f\υx�P�q3�-~�[��}I��k,�d����U|ׂk��.�%'�V����<q5��n����Q���IHϥ��K��_EBF��j��3�.#[�c�W��=�Kx��?��и����7Bò<�҄w�A��o�M����В=�
)���zYP�@�_��H�r��۞-��~WFSk���x�c'&.9e�YG� l�Ӣ,����Ph;_)�\�_;��b�5.��Y�ȟ*��O{<�e�>��>�9G��@8e.�\ԨMP��T[�͌��XeI���0y��}1SRRj\�Y����OaM���c�7�y��S�Ɍ�Y ��ƳOm&3�O���(���RŔ!�`�d{l��^�#�iW@�B�k��*�LYܩΚ[�e$����Hۿ�!j�T�{l=����آ���XIC�[`�brj��(@"#��n�����Q8���X�c+eQK��f7��2q1C���n�Bdf�ӭ���r4Bۉ��آ̜r��,��-G��Vc�p�-�ѣ�*��r�u�!D�49ȶǖ���tè��Ot��ƽT��j�ٚ-�2�-PR�?M;~(A��7K�5�2*�p_�ʧS���L�2b�����5�z[�,SG����)��:��`��GP񠞪����$iTne�����ӈ$��A/|��J<���sh��u���F���d�
X�x�}{��c/��\r�(U8=�ʏ7�ԕ�yy�EK��p3�Y5�����@��$۪��I��о�nhO-;�R�d]����#�j����x`�y�J�x6Lh���Ț�����L�1�D����u!�  `	����:���\��>��q�3��p%� �z@�@��?�zsWJ����?�*WnLX�H���BZ�U.5�Q�)�B����!pu]�v]y�dM�wv��1ˑ��8
���1K�����M�`Xv��>���	Y�ʘؾ�dL�� �xqrtO"@Nˮ�����]�
<3���
��4���v��:I��U�)����8��3.��RB/=���K���|��RL<�4	���,��)�YA�`�T��+��ͻ���ٜ��/f�xW���JU��V��
���@�x�����P[��o|֥hWe!��C|y��?jI�%�|�1�,L2=�d����<���X����k<��f2c��@>��<��<$sc^���lb�-��~	��=�D��k�y[����8�[�}��D�+��wl�I�@�z:NJ�	��UH���[�;�O+��P����S,���	��SZ}�E�OEL	�@(n.�~����TtFwH$��M.��N�n��$������.6W��d���Aa�S�G�����?_�^��$�(F�}�n�a���e�UO-e;�I�u�(
��w��V�e`h�<5d?��#[��vZ��6ڶ��U�~�<x�1��z��ia�;̐�p��4��#�d��oզ-a;�e'��N�y�vOQ)3��~�������`�N�L��ҳ��X��J�#��G��$��3����3�N5�����ji��آA�2��R䨟�GC�*\��e��P���z阄<oH���`�8�ŪCqx���-	���23�^�"��v�R��E_Ҽ��*�ȹތ����C��_��0�-�=�~�`6�A��+h5��՛�I��[^�Z��XRk��u�ok��=�
ퟫ�N!,R�q��Ɛ�7O�����/��N����KI`u�������Ȫ�Wk��Ęm�z�1	7��Woܩ��"<+ C�5.���l< <��%[��-�֢՛��`���fH�p���Ż��?�g�%����H`[�=UjŇ�\�7>W���@�����]
 ?�c��J<#<{�8���+��`~h�q�gBJא&�E_2e&�9��j=�!���HXv$�l�d�2s�`F[v�,`�V͌�Y������Y���ӔN��pXtUŖ�/,��t�SO���Q WTl	�X���3��-3.�X_͊�OF^&�d�[��m�m����"~4zd�O�;R���^ic��!T-���Ê9�@���k8���"
B(�K�&�;�Tn��,cH���n3�[�!� Ad���|i�b�� ���N{#��"��'լe��r��j(j�ނ@�'����Y�V��$����?���b��Sk��A�g�ل���pS���Q���Z��(k���s�hڽ�=��5S�()����<�]5Y��ӕ���H;�|��_t)�=)[ۖ:Zs�i��F�x+�ut�0�?�
�4����Լ�kjۂӲ��s�-}G[��_S�'+ �����.�4A���I�U�Z����PƠA���7����)ɟ�[m�t�H/���ϰ@��A����u_Q�:�����	mB�4c� �~H�kɒ��XQd�,`$<�5n��yeLī��-�g�f"[�.C|$!�@8�9�`Ix4Y@� @ȁ���)��m�h~���
��m*��檦N�W��cYh�ӻ��Ԗ���jV������%�A���u���n���9��y@�}-Bh�t�%�?'W�<r�i��ӕ�kr։����G��~]B-뾖����F)�Ĭ*�{.�r}���1j�/��-�qSLJ����'�>p�ƕo*a�C�:r�OF'n�����Q
+l{�yiQ&/Ƞ}d5�d� 8,�	MM��g;��^��|��2��i.!�od��\���
���_i�Q���Dˠ��Zr@;�Br˳�2���shx���cf�xm�z�3`��J�ɚO��7����s򤥰2�W��s5����jk�#��h]�
��������"��*J FZ���x6��P[&옏�x�fn�r!�u9l�
!( �O�堆_�Ϧ�Q��O%�0��t<`	���\E^#!��`���1��͞��8�u&6r��綔�K@�q=#
��g�5l4�g#
��g�5l4�)�[����b+�/(ZQ�^���Q���K*�D*G�ګ�2rӔ��}*ⅳ�Q��b��Ո�A����屶n�ΟU(���c����OB���łH�TlutBd�RU��=�(5D�@H������J@��C"NEd�p�)#�­̖p3@"�G9U�l�b��h�h IDAT�En�I��iY�TU�^��(*�Z�"�{l�YE�ʵl[�0.@D��4w[�֏�Wv:�l�èH�n�k�h�����?�i@�Ɲ4��(�'1��<=y]1nek�Q>�}zf麄��,��4n�@[*_����<h�Ge�^�0�g����.q̅~�W�.iQ-�Y$�P��7>�H�.2�9���O��_J���?������Q�qx)P��K�n��l����
�F7�q��J'߅Ot��ڝ�@��]����C�a�S��
��Z �o�����C��MT��]1 ������}��R��1�����\`��ݔ��._�Y F���*W��~-T��
��V� �$�	Y�ը���-R]�py"Ú��LkG��v��T�� /�>:_��x6����Sh3cyf�eG_�vh�̘��hˎ���Ъ�1j��/�WUl�BG͝�^�E<Q"�8Q�22w�W�e&��Y�5������h�UӞ.CUs�Ulp��ˆO:���Ѹ�HB�.��X#�TluH��ҭU�^��"|>�b���9�*�R��!"��M.��7f��	����ޣ|{�Ls[N�@����p�v��(�Z5��b�IE��6���Q	�e�6�2��b�QƩR|��sd�زp`��чѡC~����鋍�	���?�v��F���;��9�P�//]I�����g?��6���L�>�B:�����0����gwsR������%���::���n����24w��n.O�m�,���2s��!� �<uSy�^�y݄��/j�T��
��cwĤ�;"�<��2��ҕ]�
�I�����пb�\)�j5n���E�ߤy#���}C3('�q"U^�Χ��EJ���~�К�*�8[ҤZ[���t���\�a��Y����#p@�Ԛ����^S����}nZ����R>��q��������^}�.���U��/7�.X8Yq�����8�{
�4)P��xaXW��WČ��eK�"�'���H�g0�i5L�H�yYѓY�
��n����Fk
�x�v��<�᚛�;E�:��+���cwtiQ�q�gyf��i���U��
�;�^�e1���K�����<��B��+�6t'-H�q�-��Bf����O$� f���Bᣕ�t�x��ƃ�o/3�ru@Y�!��ؑ�Ρ�S>��zd4�#G��I�} ��ƳOm&3�g�d����<���X&-0%_�b�^��̎kD!R�u�t���A�T"��b�n��^Ŗ�ayL͊����e�`����lk��ӂES9���6+�0!G*���&:�4��Zf��3{luH}��JV�Z��J���P�C:u����TtFt�'3��\H���!�
&7H={��v��*����M�:��M�@A�@�_��|�M߳Wl9	����ֆ�eg���UԲUl9	���E
fN�e���
 �?�ĝkYeU�R���S(��BK)H�x��<M�5O%m����J��ϣ��Q�.�	F2�y��<
w�$�ظ��^<!*wz	��M����y�~�K�ॶj�j�
K���Jտ3m
� 4����Ÿ<B��˥�#��}��$(��1���ފj�^~��A>�����m�H�?�.��&�$���Ii^v w0!eJ��@�{��d!9m�]�6B�A
D���iRb�N�[�*�6�:s= ���W%7���$�m�ï$_�I�Ȏ�Y��$4&1�d$�u_�)��k4;}�u|{ƥ�-J��M��Ҫ�m߱��#�3ok����#�5&;���R�5[pS@�N!
�Ưw������rB��MpĊ�u�,�O��6��˄�B��ehZ�\HŚ�l��d��R��^�{��z�d)�@�NbYZ�
 �v�?�ŝ_�p������QW�~����E�4VZ>G�JA+d�u����6�X���Hk�ãgHb����h:46֕���vQ4��+��%7\��qȸ�ۨ�7I~l�1�U��B'7�R��t���Yh:~���4+e�Ac�V�[!MnPZ
f��@��)��Nc�^���|�5�w(;�YZ��6�P���f�y N���_��5O3=^�
��3*�`�*RK��|���Vd'���O(`�(������k<��f2cyHFk<��,�S�Ɍe��� {��bK���ɉu��6���/E�v�B�2sr�W�����~���\�h�(�*bS㶚�/��y*b�ŏ�Bđ�����D��4��J.}�Xt�TD	MkҲ�K̽�z�VJ�d�󇨝��ޞj�b+U����q��|��V�0A�@�HO�,�ߛ��r2Z�C��>Q
dd�/x�v��-'DQ����#���@��Eo�r[Ŗ��k
A�`��ױUly�j5�ϳ�����ͣ�t�v���I���x�	��1GDC���޲����ў�V��:l�R��Ͽ�l
�+���!|�5�����Ow��vȇ�|Ks_����@q�&�������3��'����~�_6����ew0�X�חv�t~tֿu!�����˾
���Ք\w��L\X|_)��:6�N�q���)� @��n����|���vUų�A��������n7�g	�\�OӮ�ھ#Z'���貤��w?�&C� < X\Ȍ۠/�EMpy.��7���\�!�)�
A�k\pd"X��,��F躖�`�Fk(n�O��@X�<���$[�_�\#�Ǽ��:��`��'���:I��}��&d��y��M���Wt��'�d'��=����e-*��~ɥK���d��/�B�J�A�@Q���<*L)�v���r��fe���6�}������"���Nf;�io%,�`�Y�.�\NF���� ɾ�$�9^�y��d��,���x]�Y��&�dz@���u�g^�Lvs�pZ��wש�B���jn�[%�>暊-��X��u^�V��k�u�[N,+#'NE��X�!����UOE<����sf���=��4�����X g�؊�	5bFZ��s�Wl�^�BB�#����Z�V�:M�f�PL�b�p+h� � Ai�u_2W��d��6���K�(߼�E��-'�S�*��(���l[�0.4D��7�Uly�Z5�ͳ�m��7�x�ϷJL�o�A7M2)���<�g��JI�W����:�H��h�^L�0+..����g�M��1zwŧt���*��{�i��,b� ��;���.�/v�԰����k:��_�@Qpܯ-x���$-�v�]	2���>.��b�Wt��"����i��E���kr��_�N$�A��6Z����-���!+pjc�pP�4���F�X\�;���:����)�E��}�a���֔Ao%e.@��ggN7J�f�'������>X�U+3&WK�Z��EaYe�����*�Zυ�ҧ�2���
B(�Sb�����R1� ƀ�9�<�L�z�S��\��B��I*�ʹ�,K�r�B�.�L��^z�k-d�>YS��� �r��{a1ǒ>����3;kN(�ǩgb3�SO`�Ҩ�M��۹\�W�Fװ��X�I�����x^�Y��6�˳@2Z�y�g��Lf,��h��5�xj3��LY ��,?��=��*����^�u�IJr�[Q�wo��*��q]ۯѬ�Z�‘e"�?q��WӀï�|ՋG�Bl��ZC��`iE
���U/�$mj�%�{$
�j�U�],�"KLKOD9����~Gw]���s�|�a��a7ni��镝V�\c�b�
@<t�şt��u�,ڲ&�?������H���*��X�������݅���x�1C�@L�ҳQz�.�;is�$�Pn����k֘�زf�x��v�ۦ�=��G���V����b�
�~M�����Ѵm_j�1)G�H�hWCu蜊��l���5l[V�1�\#D|���>f�ز�g��=u	���b�i�'���}�$V���1�e�nJ-{N�g��v,�a���%����Q�Z۞-��B��:>];9�&r}@�Ŵ��c,0�ț)���=���.��=�b|�M�����+T?�2��bH�|�WJֲk��J���(��X�z�����g�4�:�gVM��ϳ�]�e׳�����Y�.Ͳ��Y�USv��,`�fY�,��)��y�K����,�Ra���=R~��l!�)(�(��B���ţJDQtǩ�D�G]�W��o���t�u-I�fw�vtԤ����P-���u�']�eV����T�B�Z��?/���Ul%����<�Wz����W��tQ��P8�R��Z�Vj,Х��0C��
Wa�p+X� � A����՚��r2��;h��T>"�)���l�e��r�f?D�ԡ!P�_(*�\�V��$�|����V��@ֱ�P��6x0�o�D
/������CG�7�@9�N�����/v7���U�t5�//�L{ A�JW@����ՍW��
�"

�ŗ������G�i�!��'�P|��ۧ�I7�(�II�r��ͳ6������ʷ��_�^r5�'��S�@�S����Gu}]�"��X*Ͱ�
n����0Y�Q��Υ?��ޛοX�@F�Q�AO�]w�R
�:��UӲ�Xf]�Z��ת��'��HC��Mekx�5j�~�Q8�F�R'2r��f{c}��Uk[o��yɐ�y)���OZߎgE�ҵ�Y�h�ɚe��`���,�Fm�)�����'#٘��
w�<��#�l���I8�N���{hY�4�6�:����ໞ�#	�\i��
� ��ʭ_���w�Uu,��K�r ZW�ӳ�g��\Ȣ-_�����|��][�p�`�J�f��׃����-���M��-ˁh��.����	��R%�(�A�-´�v1�L�RK��@5�/��Eƫ!��g����j�"��B��S��%T:��"ąX�}V�Կ|�
�S�s�g'�mJ�n��5�*��%e�@�JX٤}'ْ��ܛ)Cu@x"!����8��(LJ���f�n����
�V�r@���U}'UK�0�)1�q"��|��%���i
����j�iQ(���ex��
� ��`d�	��S��K{Eu����<E�<X���{1`Q��/�,`Y��,`Q��/�,`Y��,`Q��/�,`Y��,`Q��/�,`Y��,`Q��/����v�..5��J���LE�.˺�0�ҹ㉠����b�ֿ��y��fI��g�O�V"���g�?��rS;�5��
�X!�T���rS
`����2F7g���v��S�j�4�d���
���r!��$-M*�)�-���0Iu���e8��7#��}�w�k|�(�?Ѭ�ؼ�&=#38��:������o�����~��LDb��.�'9��VM�I�Y:��j�"���B���q�r�:Y@�V1D>?3�$wb�p);��������/[fn�-'��qG+���5ӵ�(#;P��%���r@��Լ��":�"
QZVZ�_/�f�c�I�������l{l%0b���#-�V}���\��H���������Fv��w������}�l��ޔ �5'Β�|��k�޺gU�h����4�I�r{���� �-
��n4a�9��P��S�[��]z�&q_�q�51}a������N6������>�f-���d6��Ō��O���؇�`�#�d�}��3+�A �� �kvd+�u;��ï����=Y�sɸP�^�������&�S(KZ<��\)��
�¸qb̼�_��1�>��j�e�����L|������ݑ�8�uB-[�ŕ4`�hE�Jg��&�8q�@<DS[>hi��ţ�^��������֮ś,�C�]b�Bj�1�X��R9Z@8~RJ&���N�ֳ3* ����Dg��Od�+Kl�%3�O~� ~9��f�0��qRٌP�8���	��7O2^EH=lp!�Q�E<&�=��g �j#&5@(��V���@L|j��&����ri��FjMv��[�6ȷ�"
Z�{������hL�����]�Y��*�ȳ@���v�gn�Lr �:�8�#�=������u��B�R	�K��"�����=���]{/�t��7��h�ֆ]�5-�Ω�W��}Ja!	�H��]��@OB��S
�E�P�i{ z��(���W��p
�L�	������Z�V*, kY 
�I`�p���p%@gL0Yµ2D^z�|�5�*������vj�т��'�������b�I��H����:�DnZZQ����-'X'A�`��5l[�ZM��,`BY�t�, �5��f�1�,2s�k���%��]$�$�����'^B���]�/	"�q�>���u����ԍm�l���7ͥ��S��I��fL���}�S~i���r�׵�)m����w=t!ul�Z�Y�&~�רlE�WcQ�R
��N�@�+��$��m ,
YJn����*k�@*�+u�T���:r< �">dX%��ʄ�(�������<���$����I��e�K9�R�jxV�cD)|JӨ�� CD~�B{ލ=��q�ɺ52�~x�ޙX^�!MFv�q5��� )
ۺ�C�Gz�8,h�r�#۶��r��qYN��'��Wu&1�g�$���\ՙ�`��P�K<pUg�yHBi\/1e�-S
��bK���$�T0pzb�f�Ͷ)�%�@8�(��@����*�xz���7	�ݴ2"�+�hW}
u�i�T~[�i�kΑ�-�Uk$
�n����C[�Q���R�~��=�(5D>��p�f��Z�V���"��!��B����VfK� 
�#���v���-Gc�1D�Ѯ=�a�Y����[��"QsQD{�0|D�E4���-GX"�
��--�^�Tv�H�U_���]
���ޏ��+&RᠾԫGf��k�b�R
�D�mm�>�����VP��#i��q��*Y�������$YƖ��_r�y�ǫ���BɡC)�w1���3^/y��k�������>l(���$,a���*������ゖ�^5�z�?��(:��0��O�0Vz
��\OXa��T��|I6�V��2O_p
?�p�oo��z�5S7�\܉'����IYI�M;k�7E�_�ؼ��.�ؕ�� `-�Z9�	�G��,ү%+��"�Yr>�V�ߔ|V�
�@F:E �4��ྦྷ�[C����[�a���+��FRs��XB��ճ�<��_�1x`�	�L���,f_�&[�fK=��s�9W�
!wUN�����>p#d��<���
��K ;�7��HZ�b����3�5���U,�K�Ƣ ��yu
� �Q.��d'XJд�]�B�eyRC� ��`I����E &.�&>4�X�����8	��:�ӝȆ�
@~�@̠���R�-Y�E�F}�nXf t!�h%@�,[��Ɇ�d�5Uw�t9�(�~߳��6߳����~߳��6ߔn��OawUl��
��:
�r�[���莊-����*���4%�k������H��]�n�ޚ�p����[��
�'p���q�յ	B����|"���`����_ϴ����^����B����kw�Ѳ�{, K(PHG�!� �;�;L@���Wv���e���r2�7�l��V�=�|��I+�s�
��-'"��7�S�Ω�>A���iE9$�ٚrb^D��P���-���|N$�<�p��o��=��@�aD���'�,0�_~��o�C�BC���;�?�5@������;L,�l�SDTxG��e�w��BP��G��eԸ@��Ӿ��O�m�W�J�IDAT�}DN������N~U[�U)�W�K������\����>qdm+ݺ��ۣ}N_�/.�ދ�B���W�x���/������{]���|M�:~N)��U��El4|��	!� ��1�\��d�S%�!  �@@م�=�Ox���	.z���Uj}�g^-�e��3�� *��>#!�A�R���\=��a7�L��p��c^�����o�5������-C(�e?��qdu����%��ޑ��;�%s��+�
�B�����
~��� $\
.�QT��L�;�X{h��\,��<fP��/G?�(���1O�M�]��a���E��0��2�����e���,(����
��0�a��x�Ki-��(g�xȂ��.�4���ZpLth�XP��d!yPY�r|�H��r��u,�Ѱ�Gl�к��Pf���Pp'����1O�!x!h��R���T�S ,�\�ʁ*��~�w�w[b@b�:fT��[<���������rvv̅��O9��@//��9-
&g���r�_j��Z���yK�o���e�Q�dq!������*p�����c�x��� ����[zֱ��,dE�d������<��d��xHVs����Y`l>����c�"��4��B��f�	%��b�-"�R8�?�[�5��n�D�SIEND�B`�themes/dark/images/icons-small.png000064400000044145151215013520013151 0ustar00�PNG


IHDR���0_ IDATx^�t����=s��JB��rEl���]��M��U�]��Q�^A��HQ��H�5@Bz99���מIHNr������Y�%I�<g�w�{����}��	x@w��w�/*��!o��T�{������.}��<�jzc��T4!�q��,!t�����o:�뛧���)!�*�}a0��YA�^x*�F Zm�����l3���2�����@���N�3��e D�(�.�ػ�a*cx�^�-^��c��1� @XM����y?�
|�@aM3�v�m���?�'��ى=����xyi�-SH��{����q�Y��������&��WGaՁj��>d&Z��[�
W��0Rc%<3�;.铌{�އUj�+�>�i�Mꅑ����#�zS)�'�����+����C5��N���mJ�ʀ�UQ���ۏU���؃X�P��m�p�.��\�;T��Df�����,�z�_�-A�Ŏm�]�mq�bgV���d�N|Q���f�����w��w���9�����Ѷs�x0Bf�|�u�mi#��{��Dj[T-��!ē�6C�NG�"���q�2�� yڊ��*�g"�MT`*���ㆤN����>Ȁ;+猜��0�|x�~���d	�9�	@�&�/���.@�����H�j_�=����!~�^�zׯ�L&Fl����Nf"��8��S�x:J��a��y`��y`�
F��X�*�f�DU	T�LT����Q�m�[�S��d�Ӝ�����y��hh2���;Q\��D�X�5�U<ITnh�`f��ɷq���.��`��l�L�k���Iu�S �T��X��ߦ� �h$����8�D�XAD6a�n뾈�3Ti���`�����@����� �K���'��8���Po�s7��@sc��E����O��F�c��[���Y�C7ש���۸�L����K�Hʝ�36��fj�f�Ѹ:3��r�ū4=h����`�P$}�{�����^�f�s�9Qa�!�i�@��4\a�`B��B��&�B�D�
(ޠBy8�U���!����*�XDY�42*����$�̄�j��j|�YM�S�Ǔ���f1i�
�����cd�$������4W@F�D=�GA�w��J��RS�̹�G������Ϡ;���H�3㋍�Z���Ƭ�`����5-�V�r�d����x�	�3�/>]_��~?�H�
*��ֳ���_ll�����I8o�z�=���َ-��C*f��k:[�����K���~oO�|{@��/��?�%�xu�o(��B���N'���m�n�`��J���c�%c��2|����݁�#+�BgN��@���H�����Ǚ�)x��C(�	��S���ka�UԴ��Uv�o7���yp���*4��� P@���&aeFTX[��տ�3�r:�h,���_0���NQ�L�;G�X+y,�d�*���,g��4�c��/�����"!�D���ҩ�s^d��Ͻ���[���kzQQB�S
y��(�����n�c� p(4�5��FU�
�LU"�)�ܕ�&�y,�b�>ɔ�5HK�@��H��K)��[�PX���̱�y,�f�n	���ߤԥq���X����0;U5�DrWL��y,�-3G�8J��{�ZX�O�Q��ƊM�Gpc��G��-� �](��o�_�	�����ͦf��	�^����S�P?�)m����2֭�;�C�[��	R!rM�hr'�R��C"��^�*PS��0���66S43��䯘l��XF��f���S�ca@@f�:�f���5�2���=0�������8C�ci��h�)R�f�3�+�Q����[��*j��UT��j���-1I���5A�.W14KD�jXn�c����2�z/C��(���0T�j|Ss��c1	�
���v���^@�����2�z!n.ф�c�
\A�m"��K�2�xbM��5�l0��O�3�������ΐ��7���ӹ� ����c// �N/ �}7a��F��
#"5�\A)��6}EsK�w�Vj��(B�!�+}�j��[��HK����Aj�5=��H��/��y�6!ŝ�|,�R��aZ�-��*���yV��BP(�Y�!
&Y%,��Iu�Y�A	��;�B��.��
i-�1�%;�ce�o  L Bޢ�t�T8Fd]D�_���)���o)���2���Ocu�5Œ�����t���^�t��w2�v���D@�ɮ%��p��T�'�d��o>��bM���t>��@�cR��h��~�j�7�6�N��y9�!cs�o�T��7橩���4\K��wA��w��%�`���xpͣxx���|[s��S������M}&k��8@�%�mv`|�q�u
\�#;���� ~-�
�AD���� ����.�����
WE
�OA��`��QF�{B7�d_�>�D9k�U�)�H�*�Ro)ª�HZ
5&*������,�5U�b��`�@��#&���u˸�U_#��m��L/8Q�������a�f�a�<"S�0u�N���0����FO L#�Zݘ@4�U�$�ΜZ���%=atX+���VjW�d��n߁H��.n�V_ݸ�b"BV<�˴?�Ė���h`,�8E�� /�� �f=�I�5�‚`<�D�D�-�]�3��@fI�'�?�EZ\(%Py�]�v淨��j^�k��X8@�����Ϧ|�82ۧi��C����s�̂B���t^���P�-u��	Gj����2�U�_B���u�q���ջ3x�f��22ۧ��_�߮ļ���j5��M��cG�EK�mS�D�~]qϽ�㽷�cz�$9�Z�S�Ǐ��	q1�ƎN����V��t#wڋ�c�n��I����;�'��.*+�j���|
W����_�
��~�|����7�� .ގ~��aİ;�zßj���.�*W�c����LÃ���ͻv�	���ǻ")9��
�=�!_�"�"� 8�A?��U і
�����~'|A/��Ip����dV��F�k"W"N��/�o.�P(�E�"c*�
;��m�r4���f�z��9W�%=vt6({ ��1Bf�;���`,c1��X����z�X��8	�}���C�	�K�~,!�JE�*5gp��挥*�G�y,!�R��e S���d,��Ok���*$JQ���am��)�?��hci `>/Xu
����UQd�':s�!���f����%���B(a?LY]!�q�9�>�;��,� ddA�ET%/���X�G��>j:o L���i��>s?��֛ �܍��?@����`�N�ܑ&���f��}'����쓈ml��q_j.��m*MKi��}�ZVꐲ/�q���/��v�n�4�����4�^uB��4�}nJq�8@�	��j��8��_x�{�lļ���
�|_~�
�����/��}�y<���A|^��)�V2;4�P�0
LV/�?��P+*ASS�P��9r,¿oTi��&B��j{h�s@-,����Ӏ ���5����,E���T)-�"�A,V�P,���M/�k��*���^����)h)��Y&r�[�SP�?o���f�vf�<�䢃:c�h�#��XN��c! 3R���`,c1��X��1X����?�s��A�5&������`P*r�%*��֣�8��P����S�-kV}���Q��*
L�Jw�Q���#�"埽xici�Ke%��
��j7��T��2�( ����E�5�7������A�1��2@�x�\ ���𮝌%&��[�yQy9b_x	��7S�Bx��$��&}W�����/������EP=.(��Ö�kV#�����&ͯ+k>�2ľ�:�?��'i�>�	�~y�N��2
�t�*U��4#;��w^���߃e�DXn��W/x�y��ˣOA�����q��v;Hb"\wMӾ9���O��}_�[��$%%r
��3��4��WN~�6�z��X��֙np�b��@�V���&�U���C�������9�d�Х�	��̀զ���)q0��Ҥ@2A9t490��VU���9��u�!T�>E����V=��ԈH��6SN~����k'fS�������H�ֈ
��=CN��Ř��H��Dc7�c�H�=h���O�ˌ��c��\���sΆ��},��C��J�0�T�dB�H���6��G�c��xM/P�q��^��K���k�50
�ʍL����?�]�X��LP�2�E�r�Vn�},�j�0h�
MM���W�a�E���P�
e�		y���>��󦣬�!^6�J�LIIi�1VS
V^�М� /]�"==7vş��E(�p��\F�������h	PYVZ�Ї�@^�TEZj��WPӄI Y@;w�P����E��/ /��+�ӚBY�C�l5M�
$-43+RU�PK����_��HOk,�!�QS�����ˢ,��D!XY)�KB��w�)��+6֯鄳�p���8 ��k��b��
f2��!
��Pp�Lk�I�mm��x$?f�F���=8�q�)9�ZazT��|��c1��F��a��h؉��hp���q�1��Ϝ@�r���`̾��q�1���
3�H�Ս��Ӄ��ZT��ș�X��0s:���>��`�w�Qs�Z���n�u�
��-��TB�xݰ
V��(Jr���	��D�y5'$�35C���	�\p��g���dž<�3@!h��ސ<�Lf
��Gm�j���G���xkۻ8�>��H��'�>���@QU�U��x)^�6��L�u
��Y�����|��c�d�j�H�ڀ��'�7���?5)�9�.��	y�
��9�3
݅�t��}�%�Y)��m�n��Ë�S��xv���V�?,�K=�y�k�2c2T�������������ڈ�P�)���!aё%���r�ZST	�
�}����u>�6�n�������CqY��XztV�)�����!�JTBH
!�����Ds��o���S�e&���Q��T�0fm%���g�m�&�����l
��r�n��f��X�b�c:cy��u���X�f<9�1����`,c9y�V�c������h,�߉|��N�
�9M���k����+���e�՚�Hˌ��7�P���	�:��d,�l����X�)��f3$�	���"��� ���X��XI����:tjm-�(j��<���< �l�Og,Md�1C��÷ߢ���^��͆�y�S���댥)���v�y���(�4	�m� ��,���7&�=���KS���!U�/F�]w��};D��qhQ+� ��6`zlߎ�����'��8qNh2�AM&UU�(#�M� ���.�|��q�G���v#�m��J8��ri�Jl�HJ�C	i0F�;�@�3�h�,#�+��*I8z����ܩ
Mh���>�	7ߌÃói�&3�}3I��<���2�"G �|���#i�_ʼn;�@ه�b���#\��t�0(�����:��ByX��R�6�Y�bPW�e$�d��� �[Z���*r��LўM����~��Xv�lٔ��AN-��0�f�
�b0����`,�NY��7�����7���
�j�H��-˒S�s��}Ks��ِa��
	�[�QōL�����X>2l:i�y�_��Ú�͍̘�$xe偀&o;��vln`,@DG�륞�Q�%1�;k7T���3�JLq��L��nڠ3���kJ
�y��H��
q: �ox������@��b8�aeLejޔ?6����L���;:�M/�pN�Z��ʰ�ɧ@D�]y�3Ek֪��ܛ7���P^��0j���(߶
|*]���cǰ2�~j��6�
��Ǒ�?����ܛ��h��8j������ؾ#_y	��X���P���=5�#��o��1t�oc�܏Q�u+�>�0�	�xH�L��Éu�������(c/����@�ぷ����#�b��wj$���	p=��?,T���M���ƌ��}�~��eeX?�Y(� �vAٖ��ڽW5��4�a�e��aOO��������!	ݺi#��ɧAQ`mA��U�hP�b�\Y���Э+� j���*&��ݮ�XA$@3Ur��܀55Y���O$@[�)�C���:c�|�l��e�N-�^�n�fܼi��X�b0����`,�����bm}&͞@Z��*���[
js��Ds����i��=�"��a_5��CK��d,�&͞��X�5�x|Z��c�}y*��KT��\�Hc��@^���!
I�Vtm����}���D �CH��`��e,w[u�����#-�Fo�=:&�S�x�#'��{���qfz<��ĉr73K4o��wꌥϤ��K*܎�э~�g�
��2�Y���o��f[!�m,PSm�{����X8@i��q���gO���R\� �f&���E�VT�<A)v��=%j|��9@Υ��o�^���}!��p>zwIƼ�{!+*�`Ӟl�ǫG�8��9m��u�6�)���s{�c��}������'�u_Yt�1C�Я���ZO5>tl�@P��m��e����Ͻ%�~�\Mh:��X��W�h5����n+��MGՔ�FB����)1t�g�W�2��<\T�=���j霙�}G�P\�V�����~"��$ 5���!�6�.���$�Za��TUQ#�2�`(�h+��!M�i#h�Q9w>9��6S4����;�N���u���*��`8�~,�����f0����`,c1��X�<i
�vư�����{����BjV|!I��r�?Zל�t�L�>"P(�dw�7��Z�ѺH���1Qa<� (���{�Bi�)`!��O-���9�0	���Ӓ�����$�l�� `����ɳ�lq�[l2�~t�r��po��h��No�p"z�넮�Y��G*
1���萚��'���Y�,��W�j]?p���1�ܑtA�6���;�Ň� �j��~�y9��ޠ��%�{m��X8@IM���/��罉='��]�z!��wW|�)8Tz�w��ʽմ���c��\:`8]����3�*:�9�|Z��xkŗ0�|�V�?�X���F�����c��r��a���GH�I�'�ǚ��tǺ�W�}!]��@�����LLErL�\�R�PZ[�U�6i#H�M��BKBt�=p,�\kə�{6`��_�BGJl"�z�%��uJ�������4�!m;&g��U�jo�*
b�*���
�4E�}s�V;:&�<�5��U1f��Y�U5 "����oЯ�o�kV�ި]ZT�I=hk3Ec, �?��2��t�o��XN��q}�W�~,g�{���|��4�g��W��]}:w�� ��6�ߐ|��st'jI%暐"U��q��c�>�G!-w�4�R_!���V+lº&�Xv�������<z�����
��!�Ћi��Ս��p"
�率�B-�ǔ�
s�.ڂ���Ԭ�����'C��d�*��-?�3��SrMʾ�n}a��k���8��ON�)1�$x�\���������eǘ��C�Ŏ��W�n�x�Ć+pd?�˿C�aX:����N��H5%��XV�
��+Jq����o.���5�ڃ��n׺�(.'J?~��?��lԮ�Ec�\J��9�s^D͊��`��K��nD���6�ڵ��b\+�o?
k�~H{
��P�H� IDAT��lH)��Z��%}
����RA-V�D��h��P��P�M���$����(��{`!?L���ۻ
�u�T1!���2z���2�X�����	�.=,:���n�b�LI)����R� �Xv@獍)\R�%C���ڲ�ޝ�4E�b�@$�
E���y�T��T�[s�I�u�L�yrmm�hFc�?{Y]?��c{d3�ezʙ��bF���~,c��ˠ<�=0�B���8���:*/��y�RucseRy9ö����|8�Zf,��	�����Ѥ��pDD��|j��ʓ�P��.|q"��݄F$��^l�y��[��4�#�YBp�!y�|@dȔ 7�w�u��@���X'��M�A���$e�z��Gx�@"�-���5�� Y�V�Z�/G��oA,6�7�@h�2�n|$>�Ϟ���G �.��s�Z�u���4��a����C᝻�>�H�x�ޮ�~��6�{	֜Ps� �Ӡx$}{�~�/š�8�5����x$��
�ĻPuiw��4,ɿ�
�P�A��^i��o[
��jm+A������� ^H�e�)VX��i�8����B9����Fp�*�$���*p�zEr*/PHCr��{@y{�%��e�_�ʼzM�tU��A[�)*c��֢���pd׵W:u��0#e��0�Z7��b�x1�7|1�q��3��X� �r|B�	�i/e��X$J�UAE��9#VD��V�Xx;����b_�SG�,�d,ǯ�9���P��������_�I��P��@�' �#
�E`zCS��80��$L0��r"t��M� ��n�|,��8��
���w��q��ܴ�3�IHa*%y���S`��8M{il#��݇?�%-иD$��a��,A��k ft�:v����I��c4��و+J�Άm�xP{,��
ۨ	pϟ��s!fv��\t�&L}	�z��O��Z�_�SO�F�G�;��v����i�HMF�|����v$?����1[����Y�?�<��^��o߃ؾkt���Z/�\����Ёm��X�� ��(��$��!53:�Z[EM]�"c�jm�����;���^�p��.���!�9�!f��R2���x}
��ڪ�@�!�Ֆ�r��4�u-TW
Č�ZGI��d!�,�͓VBA(�*
@HH$s��o'W���U-��p��X�&��f�V�����a��c9�N�S5&�}�00�P�G���%��h��1��Yoq��,��Z���d��)OM��-�},��y@�Ս!�_-�*!t���?#}p�tp�BU�A ��D7z�r��u�
�83 Y��w&70�j
]�fG�Մ���7p�T���S��L1W}�R�Ǣ�p��s�Ǹ>)Q���+q��[�x�Q�<�ő���0���y���k���Q�
C�=Smxpd'��T��goI��,W}���r��G_��_��+���.	�*>X{��Ϯ<�G���jS��Q-��ۯ���M��ߋ����ڀ�����;��Ü%A��-T��#:b���ho%R�W�����8�\��h;�^�lm������
Ę����""%ެeo|t]_���F�8X͗�O�feƢ�hSx�cP�GuFHQ�n�Z�T�Am�d��G�#;���!ެ�	��ߎ⽵E��Q�D��dj�����-QK�:p�*��hqu>Ƴ���ju�;��dP��D�A�):e�W_�Dg,�˳�+����K>��l<�Ϭ���X�s5���\
��`��ir�<���YW+�D����\�V�rO8g�Q|,�o��c��H"A�GAq���r��&>��wx�����B��/��.�H���8^�`KC\�5��G60
@UD�R1�@Dha[��>�PB
B��d�l��܎w��P\Ek�ki�OZ]X��8����̼�i�tƢ�s��L��,���j�u@b3r3�����Y7���[Aշ� P�\bڵ
:�ԖB�9k��P���tj�e����!,]F��zT-�dpj��>jO��_�GW���8�π�w�"���=ܿ�����0w��w�v�����w�Q[��h��5!�
�A�W��s<BE4睔q�����e�G�T�ALv*�BP{��YjM�$@�>�P�z0%�*F������D��4RemHL�!6�*����f���!���:K黽��������12#s�>���9���<[KհT
KհT�n��q&���Fg�;�[ͼ�h2����S��X�<��X ���.�ŗ�b�-�>��j:w�l���='����u6c���c��@�a����m�8+��@X�J`�0 �tn/"���ctƢ�GJ����_��,���=�
�p��J�Ջv��e@��xb`J�]�3
 (;�c-t���c���pE�$L�3���d=��ظ��rq���rR�~����%�=At����ׇ{Kqǒ]�դ��&���'@���7�1�~sgŠy[��X��s�p��������.ȴI���* ���GVp�}(������pEX����w�W�H�<B���n(lw�E�O�qM������Ƈ�;O��Ɒ�0�l
@e��}�Tb��q���C��)	�f�
�HaYk�e�Kq�>E�#i+Sh�猅��-�	@[�)ڢ2�c��ǂw�dCU�c�La0��h*dPC��Ǡ<
O[�L<c�ı3��H�y,T�!o�r;sֽ1�9c3sIZ�yOEB�Zj+@:uݬE2�13�L�A]z�@	<�>��$��@R��Tk�S�ٞ���[Kcnc��2Rb��oPơ���]��u�$�Ȕ���O\�3�zB@�#��8y0.>+S�ٟ���wW#39��PT��*�[�ȥ:c�T��`H��.?�%�0mL��JD���8^�w��?���.�[%��Ǯ��̡(�ޗ�C{�j��$
H�5c��R��Y�+3�_�՞�c"�\�E}2蛷
ӆ]�	��/#���x5��B�]B���jO��g�(v�W�ہ�W��X���;$�"	������u�k��
5%�	�
)�x�D>0J]�rpa�v((wk-v��l?V��~�
B�*Q	@)u��a���k����1	��TbO��5�2��CJs!rE���
�e�~̾c8��co�v���_���E��W��P��|Yx�@zd��&��W�Ԗ�ԵTi��7��
U�
j��	63�fQk+Sw5hu3Ee���/{�J�����$[�Χ��`�����`,��n0��fX(g����;�_�h,�A��^��A�'��b"�\#�RUXιfׁ����䁵�A�D����Pd�u�D2���o^+LS3&�!�Bp�'�!P�v��?n����P
#PT!&Rz:�p!(�Ad
�ۼKg,�� @��E��w���\
��9�=�,��!XVˆՖ7p�.���A���*�N'z�)W]
߁�l6HYY�(¡����UJJ��e��X�T����vs¨K*+E����] ��h#;��;P�n�*����sg$@�1�>�>tz�	Ԯ[
1)�� ;k�b��u�����s�>��J(䠢H;>���X`JIE��Qxw�@�%c5�c.B��P5��G�k�K���לO`JL<Y@!TR16��tm$;��"\Y�������
G̹��Y#XT���t��|
��bׄ+ �:U1&&@�S��i�eWh-���D�<�d��)#q���B�`�D�R�
�pU��l|L�!�� &Q+��/
qF���j�
�n�&�0U�<|�{�(���3�hk3E}P�ަ:c�<𬿘ǂB،A�v��`,c1��3�0�
s�0��^�)2��v����H�>�@H�Xx�{��r�ӣQ�®?���yOE �|�`�Nŏ�7�
�a�t����s<P��i�B^�Wɓ�$K>>�(*�P�/D�'HB}��H <��*Ɍ!�]vÜ������#�%-V{��J����č�\	w���f��n��
�4g:Jk�W�E=x�v��2���,�a�?`��1��jj]T(s9�MBᄡ/Κ1�;&j/�k<A�e����Od��5��ۢL�e(�t~g�x�;,�9��	kl�r��Sᇹ7c��c�t���w�4��xA7\��X5s<�܏s;'c�����d�u����w-���[��[.���1�㡸����~�j���w��Xv��~m���;��3'
���/�'BR��U�B��JX�Хx��m�f��&S���:2�闹��o�;�t%�/��
o����Wa35Z�:Eb�%*o�b�C]\�/T��������^�y���Y�@L\K������,_����g���{0`��j0����`,ci|ܟ!V�i� ��?���kb�'�D�yO��f��Y	�$��˩���%��},<}Y
�!������?�d,�n��$c����|�/w�[����!A�P��Z&�`��-��X�/6�JK+��������C��q�Q8x		��[�<�KrK���Kc��e�z�0|4�6����z��0��%�J&�M"O��+�߫:c��Q\ZI���\,y&�����*$Q/��+qϬO�.-IKC)��5��pYVN��.}�^\|N�/*Ŕ>��ex�1�{G�?���s1Vss�Z���!-��".�U��d�PJX�d6!59���4[9b.�ߑ�O���$�3.��E��bl3
���:%����]��@UTGy��.x�nL��\l9t�?�.��U��;'���?�K6��+���2ЄXYC��u��E2!��e�Z-�����!ғU"4"���@iщr�ۧ+>��6Mp:�T���?��jӳJ��S��+�@QRV��0��ٽ�cÎ#E((8�Ĕ�m(<<����w�*��W�<Pe6��v��UY�y������ �%_���Xү�/��u����!0 ���Ȍ��_5��X�b0���%�9cP��A�'8���{޳�k�U���%����9c	�י��Z�^�VX�[Aa��[�M=wfQ$c	��4Zqb=�%�RÐL&�
*�zI+��HQc�
@ �� &TE��u���M����}Tg,���1�@�s��K@�x6���)
�i:ci �o6e����P��D��{-㚰\˿��%�P��#��C��Y�%"��4�������n��I$�� �]@{A�5X�@��70li�Q�+�i�� igC�6B���]�s"���l��-������@,I�nX�b�jB�"�	�t��#����T�y
��S����5j���V!��������.J�zB8g�%(a��^`ad>W! Ŷ2�@
�I=$&Z��𕃅\Z��֗Q���SBz�0��p��=Y�������&˷L;�3���]�AԿԏ���0O;f0����`,c1��X�<i
�vư�	Sޜ�Z� I�h�R���Y����e��7�k��P*"�����SW.z.��\5�����X��e��^w��Dɚ��'K=O��/�}�Ba�1����0�LT5|�Vh��/�� UUie��qH���xa� �5^�$�!.�
YVS��￸Gg,�#��tӜ�b��4�_��6��-��;k7���A($#>���?|q��X8������-����-�_'Jj`�HHJ�k?o�U���Q��$�"Jʜ�q��M���E�3�\��Y��2͢
�q�����jB�-���;2�%�
163,	q��g��zꥅX�j��*!4�8N�:��ǐA]��jt�c�r�x�`t��C|T�ϑ�
g (S�]€�Y<�+RRb0��g0���1�拐s�(�p#����H�H��&�
jj}|����x��2J&�`X�r�"
@=w�
ÐUS&>l�|11-֋�6Z �9��6S4@F����{t�2q�[�*�:H2�f,�2�`,c1��X�b0������q����n��M��yT!Ԭ���s�[М�t̾5���c�y�j(������ ��tȾE� ��
 ������_�b^ci	��>�(�l2A��r�D&r�Dg,�Z4%(�����M�(j<�NR��0�1j^Ѣ�u�R -*���A�VT�޺߿�(v>����	%���LK�b�x��ş茅��8ZTJ/6>���w=�$�'���?�sw݂�_���뷠sV;UQ�H�/�萞B��8�!���5^z�q��fߊ����f\��$��+�X�%��;:g���o=�=�|�-~[�	v9�{��_\u�$�y����1��qvk�)P>�z�%��J��}�x�ې��l�TT����Âk�9+CU�&S�z@)�'�*ѷk�\6{uC�}Ocp��Z0׊?��}z
�Qk.D���3��jtHO�Y2���ՊU{|~��e�5��dk"��`ᰢEr���j��K����� ���u��q�m�*ӂ<{G��L�
c3��|l0����`,c1��X�r�2��_��4����tž:����_�Σ���%E��gΙp���e���X�<%�%�������7����e�l�u��ۤV��5G=c����'���s�F��j���"�T��ff�Mȿ2oW�ZaM԰RL&��O�ٞ�����[�
b�F�@)�|�ֺZaM��1Y�����q��{Puhl�Y�oL�%�Լsr���
k� ���ToGy��{P��k�c;���_4eK]��()=�Cb�1�88��@Ɏw`�=�f�umS�#c��AE+Jv�W��0Y�Om�P�J<燛�|)��К���
���n��~j���;����(�S�?w��Za��&z��|;��6c��-c1��X�b0����`,g*cٟ�mZ��U7V�RUr.-+l�X�eum5*L"ժ�Y�\a�eM�X�gv���!)J!�B�./�	�!91��?��xci	��&�e%`�l^��.<A�dJHn�Gt�
�W9CLKA�W_�v�?�=����}���^tXg,�T�,@��?�6l�r�?�(�_|
1%Y�ث�@g,�(E����}2�q��i3
��y=���z�Z#�XX�RY�Ϋ��v�?4��X��ɷ��y�^S�|��;j:���ϧ�ﯫP4i
h\,�(F �H����t�}
��D���P��#�R�@,��hSP**iܤ����:��6oE��1�?��bn
p��i���w�x~Y�7�
����,�Pq�+�X(Dͽ{�+����6;��vZ��&W�2��+��~����:z<b�+���
�G��.:�3��f���Sb,�ѳ�X�b0����`,c1˙�X�Ǖr�o������}x��H�3�U��j<���S� �77���&��l�яG�?C�o_=�u2���<���1�r}pL`dT�#
��H��U��ix	���f#`x�X�7F���/^rj�nj�]��!�i�=H5�:��N��mw�:�d�a� ���w&�ۧ
�Xy�@��� 儱W�J,�/�	�W>`z��S��['W ��-�ɵ�d(�G6�9aB�B��+'��#i����]�jl�!�2��_��L)w���0��nj���x�$�)N�ŏ�!���3
c
gL�����#c5���DhB�5�P�3F�.��
�Ս���Dj�Ն$�3��δ
�},�.�juc�D�
�U�j��{��Ȩ�G�>�y�+q�L�/����J��oBm�K&�����|,M�jd�@P��YIIDAT�CVC��jo1�$Q�pˣ¨ �>?q��ci��bdϛ1����ҫ��x`�7X�g6��
�6�=S��L�J��R�2���Ux��%)~<��*P<4v>,&;f���s"���e\?3n��c�`L�5�R��^�jo^]9���/|��ŗ ޚ����WJ�w��=�/6=�
G���p�t�
7
~�>�U?G�-�%�:��d\w�#���DZ��|-M}p�q�i��j�SX{�$��E�2���iS��ⵕ�5<��w����/�Dk:x)�2P�B=�<~���^���D(���̃]J��?_�Xsr�2��N.�=���3��=z�"���m,�>�{���'zCNd�u�?��Å���A�͉u���Uv�&�i~%����8FA������̸���х��y{%v�Qa�3����O&��\��匱PN�t�h,�A8�^��,��	u��Q�$s�O�*�rΰ��6g,��zuc���/�[�y?��&y,��LG�<��'�$�s�%�L��poc�h�]_e-�J��(�Yo��� �pS�w��y��&�y����♢�y)���p�:hb&����ߥ�0�4&	,�͠�I�,���@%��ܴY�t��g��v�T�?J����9�K�Z�8K!��ju1<?��
)#��R�eصTl�R�� �X��t�
��!��RqBjGx��
IY�L����>��AW¿n�/�Mh�:mjޟ�n�M��T�?
�ݫڻR�ڍ�?�W��D�-��WU!��X��R;R�E9Pݕ���P]� f�A���D�R�[���#ͅAp�������<�
`>�d�ǫ��H���(������Z8�'���66S��i�o�K�}gg��)���{6#}�v����`,c9y��a�����?5�����s�"��	P�2Ht��W�ϓ��������Z�{A�����T|�B����>�8�)|��m��}�mFA~�Y���6[�1��F=�9��8�b�t`V:���Y\��,
V����(dP1��_���<�����
�K`2�����8VR	$�� Z�v1�,/������M"��k\� R��1�k��O�9V��6LI��������8P�W
9�(b��U4ln��l�7|�uU��j�5��9ݳ��nüu۴aϘx1\��_�
�J�eu��}��G�E�`�>,]��3�¸xi�F��HI�g�flGN��e��6>���$��ݯ�=^�a�{���ʃ�����CIB(��@Ғ`�Yp�D�t�ۼ��k��/�
J��������Z&I0��:�kR<��8�?�BZh�Ey���֊T���r�T�� ��TG˦!|9�<�FBlc3E=4X>^�Og,x`V6�<v����X��t��X�b0�����!k�6���ۧa��X��lх�j-��yq!�ZWX*�
���)�l^���(���&�V�҆F�bD".�BA���
Q(�[эmw���(�JA��\�i�HqcZl�mR��%M�yrsE��謇3s߽o����O�{�%lX��y�Fȱg���
2�0y�O?I���Gm�b���3[\�'|cg8��t�7c� :��k�<⽒Hi27��P�lů"񿅍�由ޠV��Q�yz��)�{	����pe��e�Qg(��E�ݟ3���_�P;̌A�z�1�!�ޅ
	��XV����
��0�����r�uB�eX|
ٳ�.�cM@m9C�!y���<sK�^��h�Bn
/|��7az*K;�����g�:	�NAq�	��P)o��
����+o`�n���k���&!H�.�@t?,=�Ҕ��nP�J&� �m�i\D���ɐ82���69e`�����A��v�����Tz�����fD��:b�#�  �-��id��҂!�o35��9i'�U�b%�T�\�šl����y�%'5���h�e�.m�IEND�B`�themes/windows - 10/js/README.md000064400000000507151215013520011731 0ustar00# Scripts
Any extra (funky) Javascript that you want to load along with your
theme should be located here. This could be:

* Special configuration for elFinder under your theme
* Extra JavaScript libraries that your theme depends on
* Javascript hacks to the elFinder markup after the file browser has loaded (not recommended)
themes/windows - 10/css/contextmenu.css000064400000002360151215013520013710 0ustar00/* contextmenu.css */
/* **Note** that the context menu is NOT inside the main elfinder div */
/* Context menu wrapper */
.elfinder-contextmenu,
.elfinder-contextmenu-sub,
.elfinder-button-menu {
  font-size: 16px;
  font-family: 'Open Sans', sans-serif;
  background: #fff!important;
  border: 1px solid #b5b5b5!important;
  box-shadow: 0 0 5px #cdcdcd!important;
  border-radius: 0;
  padding: 3px 3px 0 3px;
}

/* Menu item */
.elfinder-contextmenu .elfinder-contextmenu-item,
.elfinder-button-menu .elfinder-button-menu-item {
  margin: 0 0 3px 0;
}

/* Hovered menu item */
.elfinder-contextmenu .elfinder-contextmenu-item:hover,
.elfinder-button-menu .elfinder-button-menu-item:hover  {
  background: #dedddc;
  color: #000;
}

/* Item icon */
.elfinder-contextmenu .elfinder-contextmenu-item .elfinder-contextmenu-icon {
}

/* Separator */
.elfinder-contextmenu .elfinder-contextmenu-separator {
  background: #e2e3e4;
  height: 1px;
  margin: 1px;
}

.elfinder-contextmenu .elfinder-button-icon-open + span {
  font-weight: bold;
}

.elfinder .elfinder-contextmenu-item .ui-icon.ui-icon-check {
    margin-top: -9px;
    left: 1px;
}
.elfinder .elfinder-contextmenu-rtl .elfinder-contextmenu-item .ui-icon.ui-icon-check {
    right: -1px;
    left: auto;
}themes/windows - 10/css/dialog.css000064400000006707151215013520012607 0ustar00/* dialog.css */
/* Dialog wrapper */
.elfinder .elfinder-dialog {
  /* */
}

/* Dialog title */
.elfinder .elfinder-dialog .ui-dialog-titlebar {
  padding: 3px 0 3px 6px;
  height: 30px;
  box-sizing: border-box;
  background: #dee1e6;
}

/* Close button */
.elfinder .elfinder-dialog .ui-dialog-titlebar-close,
.elfinder .elfinder-dialog .elfinder-titlebar-minimize,
.elfinder .elfinder-dialog .elfinder-titlebar-full{
  background: url('../images/win_10_sprite_icon.png');
  right: 0;
  border-radius: 0;
  margin-top: -13px; 
  left: -7px;
  -webkit-transition: background 0.3s; /* Safari */
  transition: background-image 0.3s;
  height: 29px;
  width: 44px;
}
.elfinder .elfinder-dialog .elfinder-titlebar-minimize{
  background-position: -89px 0px;
}
.elfinder .elfinder-dialog .elfinder-titlebar-minimize:hover{
 background-position: -89px -31px;
}
.elfinder .elfinder-dialog .elfinder-titlebar-full{
 background-position: -45px 0px;
}
.elfinder .elfinder-dialog .elfinder-titlebar-full:hover{
 background-position: -45px -31px;
}
.elfinder .elfinder-dialog .ui-dialog-titlebar-close:hover {
 background-position: 0px -31px;
}

.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-button.elfinder-titlebar-button-right {
  left: 1px;
  top: 12px;
}
/* Dialog content */
.elfinder .elfinder-dialog .ui-dialog-content {
  /* */
}

/* Dialog content */
.elfinder .elfinder-dialog.elfinder-dialog-edit .ui-dialog-content {
  /* */
  padding: 0;
}

/* Tabs */
/* Tabs wrapper */
.elfinder .elfinder-dialog .ui-tabs-nav {
  /* */
}

/* Normal tab */
.elfinder .elfinder-dialog .ui-tabs-nav .ui-state-default {
  /* */
}

/* Current tab */
.elfinder .elfinder-dialog .ui-tabs-nav .ui-tabs-selected {
  /* */
}

/* Active tab */
.elfinder .elfinder-dialog .ui-tabs-nav li:active {
  /* */
 }
.elfinder .ui-state-active {
	background: #1979CA none repeat scroll 0 0;	
	/*background: #009688 none repeat scroll 0 0;	*/
}
/* Icons */
/* Dialog icon (e.g. for error messages) */
.elfinder .elfinder-dialog .elfinder-dialog-icon {
  /* */
}

/* Error icon */
.elfinder .elfinder-dialog .elfinder-dialog-icon-error {
  /* */
}

/* Confirmation icon */
.elfinder .elfinder-dialog .elfinder-dialog-icon-confirm {
  /* */
}

/* Footer */
.elfinder .elfinder-dialog .ui-dialog-buttonpane {
  /* */
  background: #ededed;
}

/* Buttonset (wrapper) */
.elfinder .elfinder-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
  /* */
}

/* Button */
.elfinder .elfinder-dialog .ui-dialog-buttonpane .ui-dialog-buttonset .ui-button {
  /* */
}

/* Styling specific types of dialogs */
/* Error */
.elfinder .elfinder-dialog-error {
  /* */
}

/* Confirm */
.elfinder .elfinder-dialog-confirm {
  /* */
}

/* File editing */
.elfinder .elfinder-dialog .elfinder-file-edit {
  /* */
}

/* File information */
/* Title */
.elfinder .elfinder-dialog .elfinder-info-title {
  /* */
}

/* Table */
.elfinder .elfinder-dialog .elfinder-info-tb {
  /* */
}

/* File upload (including dropbox) */
.elfinder .elfinder-dialog .elfinder-upload-dropbox,
.elfinder .elfinder-dialog .elfinder-upload-dialog-or {
  /* */
}
.elfinder .elfinder-button-search.ui-state-active{background: transparent;}

.elfinder .elfinder-dialog .elfinder-titlebar-minimize .ui-icon.ui-icon-minusthick,
.elfinder .elfinder-dialog .elfinder-titlebar-full .ui-icon.ui-icon-plusthick,
.elfinder .elfinder-dialog .ui-dialog-titlebar-close .ui-icon.ui-icon-closethick,
.elfinder .elfinder-dialog .elfinder-titlebar-full .ui-icon.ui-icon-arrowreturnthick-1-s{ background: inherit; } themes/windows - 10/css/theme.css000064400000002340151215013520012437 0ustar00/**
 * elFinder Theme Template
 * @author lokothodida
 */

/* Reset */
@import url('reset.css');

/* Google Fonts */
@import url('//fonts.googleapis.com/css?family=Open+Sans:300');

/* Main features of the whole UI */
@import url('main.css');

/* Icons */
@import url('icons.css');

/* Toolbar (top panel) */
@import url('toolbar.css');

/* Navbar (left panel) */
@import url('navbar.css');

/* Views (List and Thumbnail) */
@import url('view-list.css');
@import url('view-thumbnail.css');

/* Context menu */
@import url('contextmenu.css');

/* (Modal) Dialogs */
@import url('dialog.css');

/* Status Bar */
@import url('statusbar.css');


.elfinder .elfinder-button-search input {
font-weight: 100;
}
.elfinder .elfinder-button-search-menu {
	top: 32px;
}
.ui-widget-content.elfinder-edit-editor{
	width:auto;
}
.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-button .ui-icon {
	background-image: url("../images/ui-icons_default_theme256x240.png");
}
.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-button.elfinder-titlebar-button-right .ui-icon.ui-icon-closethick{
	display:none;
}
.ui-button.ui-state-active:hover {
    background: #217dbb;
    color: #fff;
    border: none;
}themes/windows - 10/css/statusbar.css000064400000001041151215013530013343 0ustar00/* statusbar.css */
/* Statusbar wrapper */
.elfinder .elfinder-statusbar {
  /* */
}

/* File size */
.elfinder .elfinder-statusbar .elfinder-stat-size {
  /* */
}

/* Current path (breadcrumb trail) */
.elfinder .elfinder-statusbar .elfinder-path {
  /* */
}

/* Breadcrumb in current path */
.elfinder .elfinder-statusbar .elfinder-path a {
  /* */
}

/* Name of selected file(s) */
.elfinder .elfinder-statusbar .elfinder-stat-selected {
  /* */
}

/* Size of current file(s) */
.elfinder .elfinder-statusbar .elfinder-stat-size {
  /* */
}
themes/windows - 10/css/reset.css000064400000003322151215013530012461 0ustar00/* reset.css */
/* Comment out/delete the reset rules where appropriate */

/* container */
.elfinder,

/* toolbar */

/* navbar */
.elfinder .elfinder-navbar *,

/* current working directory */
.elfinder .elfinder-cwd,
.elfinder .elfinder-cwd table tr td.ui-state-active,
.elfinder .elfinder-cwd table tr td.ui-state-hover,
.elfinder .elfinder-cwd table tr td.ui-state-selected,
.elfinder .elfinder-cwd table thead tr,
.elfinder .elfinder-cwd table tbody tr,
.elfinder .elfinder-cwd-file .ui-state-hover,
.elfinder .elfinder-cwd-file .elfinder-cwd-icon-directory,
.elfinder .elfinder-cwd-file .elfinder-cwd-filename,
.elfinder .elfinder-cwd-file .elfinder-cwd-filename.ui-state-hover,

/* general states */
.elfinder .ui-state-default,
.elfinder .ui-state-active,
.elfinder .ui-state-hover,
.elfinder .ui-selected,

/* ui-widgets (normally for dialogs) */
.elfinder .ui-widget,
.elfinder .ui-widget-content,

/* icons */
.elfinder-button-icon,
.elfinder-navbar-icon,
.elfinder .ui-icon,
.elfinder-cwd-icon-directory,

/* statusbar */
.elfinder .elfinder-statusbar,
.elfinder .elfinder-statusbar *,

/* context menu (outside of elfinder div */
.elfinder-contextmenu,
.elfinder-contextmenu-sub,
.elfinder-contextmenu-item,
.elfinder-contextmenu-separator,
.elfinder-contextmenu .ui-state-hover {

}
.elfinder .elfinder-toolbar,
.elfinder .elfinder-buttonset,
.elfinder .elfinder-button,
.elfinder .elfinder-toolbar-button-separator,
.elfinder .elfinder-navbar,
.elfinder .ui-widget-header,
.elfinder-dialog-confirm .ui-icon,
.elfinder-dialog-confirm .ui-widget-content,
.std42-dialog .ui-dialog-titlebar .ui-dialog-titlebar-close:hover .ui-icon {
 background: none;
  border: none;
}
themes/windows - 10/css/README.md000064400000004625151215013530012113 0ustar00# Stylesheets
All CSS for your theme will be located here.

The `theme.css` file is the focal point for loading the styles. These could all have been in one file, but have been split up for the sake of more easily structuring and maintaining the codebase.

* **reset.css** : resets background and border of all elfinder elements so that you can skin from scratch without manually positioning the main elements yourself
* **main.css** : main UI elements (wrapper for the main elfinder div, global styles, etc..)
* **icons.css** : icons across the UI (e.g. file associations)
* **toolbar.css** : toolbar at the top of the elfinder container. Contains toolbar buttons and searchbar
* **navbar.css** : directory navigation on the left-hand panel
* **view-list.css** : defines the list view
* **view-thumbnail.css** : defines the thumbnail/tile view
* **contextmenu.css** : context menu shown when right-clicking on in the list/thumbnail view or navbar
* **dialog.css** : information dialogs/modal windows
* **statusbar.css** : footer; contains information about directory and currently selected files

Note that many of the styles have a large degree of selectivity. E.g:

```css
.elfinder .elfinder-navbar .elfinder-navbar-dir.ui-state-active:hover { /* */ }
```

This is to minimize the need for using `!important` flags to override the existing styles (particularly with respect to jQuery UI's CSS).

## Tips
* Use the `reset.css` style to reset the styles that you need to. Comment out selectors that you wish to remain untouched.
* If you need to reset a style outside of `reset.css`, the following normally suffices:

    ```css
      background: none;
      border: none;
    ```
* If you want to change the icons in a particular container, it is best to reset the icon's style from a general selector, then style each individual icon separately. For example:

    ```css
    /* All toolbar icons */
    .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon {
      /* reset the style and set  properties common to all toolbar icons */
    }

    /* mkfile toolbar icon */
    .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-mkfile {
      /* styles specific to the mkfile button (e.g. background-position) */
    }
    ```
* Some styles have their `text-indent` property set to `-9999px` to keep the text out of view. If after styling you can't see the text (and you need to), change the `text-indent` property
themes/windows - 10/css/toolbar.css000064400000013177151215013530013012 0ustar00/* toolbar.css */

/* Buttonset wrapper for search field */
.elfinder .elfinder-button-search .elfinder-button-menu {
  background: #fff !important;
}
/* Buttons */
.elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button {
  border: 1px solid transparent;
  webkit-transition: background 0.3s, border 0.3s; /* Safari */
  transition: background 0.3s, border 0.3s;
}

/* Hovered buttons */
.elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button:hover {
  background: #cce8ff;
  border: 1px solid #99d1ff;
}



/* Searchbar */
.elfinder-toolbar .elfinder-button-search {  
  margin-right: 5px;
  border-radius: 0;
}

/* Commands */
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon {
    background-color: transparent;
    background-position: center center;
    height: 16px;
    width: 16px;
  }

  /* Back */
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-back {
    background-image: url('../images/16px/back.png');
  }

  /* Forward */
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-forward {
    background-image: url('../images/16px/forward.png');
  }

  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-netmount {
    background-image: url('../images/16px/netmount.png');
  }

  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-up {
    background-image: url('../images/16px/up.png');
  }

  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-mkdir {
    background-image: url('../images/16px/directory.png');
  }

  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-mkfile {
    background-image: url('../images/16px/file.png');
  }

  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-upload {
    background-image: url('../images/16px/upload.png');
  }

  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-open {
    background-image: url('../images/16px/open.png');
  }

  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-download {
    background-image: url('../images/16px/download.png');
  }

  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-getfile {
    background-image: url('../images/16px/getfile.png');
  }

  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-info {
    background-image: url('../images/16px/info.png');
  }

  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-quicklook {
    background-image: url('../images/16px/preview.png');
  }

  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-copy {
    background-image: url('../images/16px/copy.png');
  }

  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-cut {
    background-image: url('../images/16px/cut.png');
  }

  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-paste {
    background-image: url('../images/16px/paste.png');
  }

  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-view {
    background-image: url('../images/16px/view.png');
  }

  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-view-list {
    background-image: url('../images/16px/view-list.png');
  }

  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-help {
    background-image: url('../images/16px/help.png');
  }


  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-duplicate {
    background-image: url('../images/16px/duplicate.png');
  }

  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-rm {
    background-image: url('../images/16px/rm.png');
  }

  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-edit {
    background-image: url('../images/16px/edit.png');
  }

  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-rename {
    background-image: url('../images/16px/rename.png');
  }

  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-archive {
    background-image: url('../images/16px/archive.png');
  }

  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-resize {
    background-image: url('../images/16px/resize.png');
  }

  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-extract {
    background-image: url('../images/16px/extract.png');
  }

  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-sort {
    background-image: url('../images/16px/sort.png');
  } 
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-undo {
    background-image: url('../images/16px/undo.png');
  } 
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-redo {
    background-image: url('../images/16px/redo.png');
  }  
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-selectall {
    background-image: url('../images/16px/select_all.png');
  }  
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-selectnone {
    background-image: url('../images/16px/deselect_all.png');
  }  
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-selectinvert {
    background-image: url('../images/16px/invert_selection.png');
  }  
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-empty {
    background-image: url('../images/16px/clear_folder.png');
  }
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-fullscreen{
    background-image: url('../images/16px/full-screen-icon.png');
  }
  
.elfinder .elfinder-button{padding: 3px;}
.elfinder-cwd-view-list thead td .ui-resizable-handle {top: 3px;}

.elfinder-button-menu.elfinder-button-search-menu {top:15px !important;}themes/windows - 10/css/view-list.css000064400000003152151215013530013263 0ustar00/* view-list.css */
/* Column headings */
.elfinder .elfinder-cwd-wrapper-list table thead tr td {
  color: #43536a;
}

.elfinder .elfinder-cwd-wrapper-list table thead tr td:not(:last-child) {
  border-right: 1px solid #e5e5e5;
}

/* Hovered column heading */
.elfinder .elfinder-cwd-wrapper-list table thead tr td.ui-state-hover,
.elfinder .elfinder-cwd-wrapper-list table thead tr td:hover {
  background: #d0dded;
}

/* Actively sorted column heading */
.elfinder .elfinder-cwd-wrapper-list table thead tr td.ui-state-active {
  border-right: 1px solid #e5e5e5;
}


/* Files */
/* File */
.elfinder .elfinder-cwd-wrapper-list .elfinder-cwd-file td {
  border: 1px solid transparent;
}

.elfinder .elfinder-cwd-wrapper-list .elfinder-cwd-file td:not(:first-child) {
  color: #9d9d9d;
}

/* Hovered file */

.elfinder .elfinder-cwd-wrapper-list .elfinder-cwd-file:hover,
.elfinder .elfinder-cwd-wrapper-list .elfinder-cwd-file.ui-state-hover,          /* fix for 2.x */
.elfinder .elfinder-cwd-wrapper-list .elfinder-cwd-file.ui-state-hover:hover {   /* fix for 2.1 */
  background: #e5f3ff;
  border-color: #e5f3ff;
}

/* Selected file */
.elfinder .elfinder-cwd-wrapper-list .elfinder-cwd-file.ui-selected {
  background: #cce8ff;
}

.elfinder .elfinder-cwd-wrapper-list .elfinder-cwd-file.ui-selected td {
  border-top: 1px solid #99d1ff;
  border-bottom: 1px solid #99d1ff;
  color : #fff;
}

.elfinder .elfinder-cwd-wrapper-list .elfinder-cwd-file.ui-selected td:first-child {
  border-left: 1px solid #99d1ff;
}

.elfinder .elfinder-cwd-wrapper-list .elfinder-cwd-file.ui-selected td:last-child {
  border-right: 1px solid #99d1ff;
}
themes/windows - 10/css/main.css000064400000001237151215013530012266 0ustar00/* main.css */
/* Container div for elFinder */
.elfinder,
.elfinder .elfinder-dialog,
.elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-menu {
  background: #fff;
  border: 1px solid #69bcee;
  box-shadow: 0 0 5px #cdcdcd;
  border-radius: 0;
}

/* Override styles in child elements of elFinder div */
/* Use for consistently setting text sizes and overriding general jQuery UI styles */
.elfinder * {
  /*color: #000;*/
  font-family: 'Open Sans', sans-serif;
}

/* Resizer */
/* Used if elFinder is resizable and on dialogs */
.elfinder .ui-icon-gripsmall-diagonal-se,
.elfinder-dialog .ui-icon-gripsmall-diagonal-se {
  /* */
}
themes/windows - 10/css/navbar.css000064400000003551151215013530012614 0ustar00/* navbar.css */
/* Main wrapper for navbar */
.elfinder.elfinder-rtl .elfinder-navbar {
    border-left: 1px solid #e5e5e5;
}
.elfinder.elfinder-ltr .elfinder-navbar {
    border-right: 1px solid #e5e5e5;
}

/* Directories */
.elfinder .elfinder-navbar .elfinder-navbar-dir {
  color: #000;
  border-radius: 0;
}

/* Hovered directory  */
.elfinder .elfinder-navbar .elfinder-navbar-dir:hover {
  background: #e5f3ff;
}

/* Current/active directory (cwd) */
.elfinder .elfinder-navbar .elfinder-navbar-dir.ui-state-active {
  background: #cce8ff;
  border: 1px solid #99d1ff;
}

/* Howvered cwd */
.elfinder .elfinder-navbar .elfinder-navbar-dir.ui-state-active:hover {
  /* */
}

/* Icons */
/* Arrow */
.elfinder .elfinder-navbar .elfinder-navbar-arrow {
  /* */
    background-image: url('../images/16px/arrow_right.png');
  background-position: center center;
  background-repeat: no-repeat;
}

/* Expanded directory arrow */
.elfinder .elfinder-navbar-expanded .elfinder-navbar-arrow {
  /* */
  background-image: url('../images/16px/arrow_down.png');
  background-position: center center;
  background-repeat: no-repeat;
}

/* All icons (directories) */
.elfinder .elfinder-navbar .elfinder-navbar-icon {
  background-color: transparent;
  background-image: url('../images/16px/directory.png') !important;
  background-position: center center;
  background-repeat: none;
  height: 16px;
  width: 16px;
}
/* Expanded directory */
.elfinder .elfinder-navbar-expanded.ui-state-active .elfinder-navbar-icon {
	  background-image: url('../images/16px/directory_opened.png') !important;
}
/* Root/volume */
.elfinder .elfinder-navbar-root > .elfinder-navbar-icon {
  /* */
}

/* Root/volume expanded */
.elfinder .elfinder-navbar-root.elfinder-navbar-expanded  > .elfinder-navbar-icon {
  /* */
}

/* Resizable handle */
.elfinder .elfinder-navbar .ui-resizable-handle.ui-resizable-e {
  /* */
}
themes/windows - 10/css/view-thumbnail.css000064400000002032151215013530014267 0ustar00/* view-thumbnail.css */
/* Wrapper for thumbnail view */
.elfinder .elfinder-cwd-view-icons {
}

/* File wrapper */
.elfinder .elfinder-cwd-view-icons .elfinder-cwd-file {
/*  width: 92px;
  height: 92px;*/
  border: 1px solid transparent;
  border-radius: 0;
}

/* Hovered file */
.elfinder .elfinder-cwd-view-icons .elfinder-cwd-file.ui-state-hover {
  background: #e5f3ff;
}

/* Selected file */
.elfinder .elfinder-cwd-view-icons .elfinder-cwd-file.ui-selected {
  background: #cce8ff;
  border: 1px solid #99d1ff;
}

/* File icon */
.elfinder .elfinder-cwd-view-icons .elfinder-cwd-file .elfinder-cwd-icon {
}

.elfinder .elfinder-cwd-view-icons .elfinder-cwd-file .elfinder-cwd-icon-directory,
.elfinder .elfinder-dialog .elfinder-cwd-icon-directory {
  background-color: transparent;
  background-image: url('../images/48px/directory.png') !important;
  background-position: center center;
  height: 48px;
  width: 48px;
}

/* File name */

.elfinder .ui-state-active .ui-button-text {
	color: #fff;
}themes/windows - 10/css/icons.css000064400000004110151215013530012446 0ustar00/* icons.css */

/* These are shown thoughought the UI, not just in the list/thumbnail view */
/* General icon settings (in main view panel) */
.elfinder-cwd-icon {
  /* */
}

/* If you are using CSS sprites for your icons, set the background position
   in each of the below styles */
/* Directory */
.elfinder-cwd-icon-directory {
  background-color: transparent;
  background-image: url('../images/16px/directory.png') !important;
  background-position: center center;
  height: 16px;
  width: 16px;
}

/* Empty file */
.elfinder-cwd-icon-x-empty,
.elfinder-cwd-icon-inode {
  /* */
}

/* (Rich) Text */
.elfinder-cwd-icon-text,
.elfinder-cwd-icon-rtf,
.elfinder-cwd-icon-rtfd {
  /* */
}

/* PDF */
.elfinder-cwd-icon-pdf {
  /* */
}

/* Microsoft Word */
.elfinder-cwd-icon-vnd-ms-word {
  /* */
}

/* Microsoft PowerPoint */
.elfinder-cwd-icon-vnd-ms-powerpoint {
  /* */
}

/* Microsoft Excel */
.elfinder-cwd-icon-ms-excel,
.elfinder-cwd-icon-vnd-ms-excel,
.elfinder-cwd-icon-vnd-ms-excel-addin-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-excel-sheet-binary-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-excel-sheet-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-excel-template-macroEnabled-12 {
  /* */
}

/* Audio */
.elfinder-cwd-icon-audio {
  /* */
}

/* Video */
.elfinder-cwd-icon-video,
.elfinder-cwd-icon-flash-video {
  /* */
}

/* Archives */
.elfinder-cwd-icon-zip,
.elfinder-cwd-icon-x-zip,
.elfinder-cwd-icon-x-xz,
.elfinder-cwd-icon-x-7z-compressed,
.elfinder-cwd-icon-x-gzip,
.elfinder-cwd-icon-x-tar,
.elfinder-cwd-icon-x-bzip,
.elfinder-cwd-icon-x-bzip2,
.elfinder-cwd-icon-x-rar {
  /* */
}

/* Code/Scripts */
.elfinder-cwd-icon-javascript,
.elfinder-cwd-icon-x-javascript,
.elfinder-cwd-icon-x-perl,
.elfinder-cwd-icon-x-python,
.elfinder-cwd-icon-x-ruby,
.elfinder-cwd-icon-x-sh,
.elfinder-cwd-icon-x-shellscript,
.elfinder-cwd-icon-x-c,
.elfinder-cwd-icon-x-csrc,
.elfinder-cwd-icon-x-chdr,
.elfinder-cwd-icon-x-c--,
.elfinder-cwd-icon-x-c--src,
.elfinder-cwd-icon-x-c--hdr,
.elfinder-cwd-icon-x-java,
.elfinder-cwd-icon-x-java-source,
.elfinder-cwd-icon-x-php,
.elfinder-cwd-icon-xml {
  /* */
}
themes/windows - 10/images/close-hover.png000064400000000527151215013530014242 0ustar00�PNG


IHDR->`�7bKGD�������	pHYs���o�dtIME�
,R�8tEXtCommentCreated with GIMPW��IDATX��ׯB!��[(l�
��O`�Ql&��@'�(6O����{��a��|�?�7v8��ݽ0X60�f4���ߢR�0��/��J�/t���"\
�,�d�}���_��<_ֵn�%�2���K��a��I�p�ƻC�.]��\�*�f�����}�����#�C?h~{0�ьf4��G���T���vIEND�B`�themes/windows - 10/images/win_10_sprite_icon.png000064400000002601151215013530015502 0ustar00�PNG


IHDR�<LꩼtEXtSoftwareAdobe ImageReadyq�e<%iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 6.0-c002 79.164460, 2020/05/12-16:04:17        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop 21.2 (Macintosh)" xmpMM:InstanceID="xmp.iid:7A59BA79476211EB8B75839F21D6E908" xmpMM:DocumentID="xmp.did:7A59BA7A476211EB8B75839F21D6E908"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:7A59BA77476211EB8B75839F21D6E908" stRef:documentID="xmp.did:7A59BA78476211EB8B75839F21D6E908"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>Z���IDATx��=K1��]�D�-��.n.�:I�
������.nn�����U��x�U�#���r�<���.yh���I��01Crrrrrrrr�!�T���7�h
S�2]�j�ߛr�h��+��F��������b�|\�g��Q��᫑����!G�r�e0ɂ~��5*%GQ�0�^�Y9��כ%'TBʰB�AB�Le�c��N0���w�~{m��T���%Ir�_KVm̥��g&�Ln�&�[���������(�~�ǧgzmZr��V�z�����=ǰ����������͕�N�Dv~i,o��f�#޷�+��m�z�w}�/Z�œ��qI-�.��;�d��xW���&�H�� E1l�*Ps9L��#rA���$>��L���QN>mI*D6�ؒO�\��Y�$G�cM>��y�*��:�8���Jp�``��t��
        Ԟo:�L!�[#IEND�B`�themes/windows - 10/images/README.md000064400000000235151215013530012561 0ustar00# Images
Store all images for your elFinder skin in this directory.

It is best to group similar images into one file and use the files as CSS spritesheets.
themes/windows - 10/images/48px/directory.png000064400000002003151215013530014612 0ustar00�PNG


IHDR00W���IDATh���n�D��+�I�HT�J�@aH��Q�R��eY�'�<J�����-
"�ק�3���̵���~�c{f<�;��;�����,*/��d	��9gp�J�W8G�\;���Ε����wQ�~���Tc�G�u�)��D���Z�{�f͹9��b��K>�\�Ǜǟ�88��E�%�S<Ek�h7h�+���}�n߽���=MdDG���OD��+�/Y�px|�~K�@�ƈ&/ۈ���W�z��‣�/�w|� ���@�{�|��b��]���j�?g��}�����"!Q��M��_`�7����;2�o��Eͥ�5��#�V���}I��IkKBJ!De��@�J݊�����֍���ܖ�6���赣��N$�֤�V�����g��(O!�&!DE���ck!U�k�ЀH�����ﶠ�,:"�P`��{�M6�R,�b���dL4����k�
VN��_�)�jeTU�ީ�䙇x��#n'�LI�����l憼O��S��b��s��uQ���^E�����r���,��̥����k7$.�<�߾[����} ��P�+o�ۇxp<٬Cާ�{����I�t�8xP?��i)y�U�^�Z���7)���=�%��_�G��]�4U�&�n7zC��QVĽ��t\����&
Qy�
��s�)��A���Ă֤K�X/:�M�Du��
���
j�����?�p7�:ӏ
AYz�._�i�l���5Оc#DX-��F����f��O���CRާ�w�5υ�+`	\�au�BfԨ�<䓯W��d���<C䳡U�ݏ*
����;~x�c�s�x
mY�9w��� _"ra�i��)�*�N�r�G;�5��΃�w�}�+R<h���-��nr���<�A�{4�i\P��79|�,%�a�6��(;��͔�IEND�B`�themes/windows - 10/images/close.png000064400000000420151215013530013111 0ustar00�PNG


IHDR->`�7bKGD�������	pHYs���o�dtIME�
/MX;tEXtCommentCreated with GIMPW�xIDATX���A
�P�1�����3Mۈ
~���V��P��$4˂�1�h��6z,��|�g&"�N���Ժ�"9T�T5�������Y�r�>,I-�ǿǣ�"�<y^Q$U9��w�h��6�h�H�h,[MxIEND�B`�themes/windows - 10/images/16px/duplicate.png000064400000000400151215013530014552 0ustar00�PNG


IHDR�a�IDAT8���A� E��I���ʪ^����K����%X�
G�,\h��Ԥ�_1࿙��"��_V�#�O�\��Ɉ��2����ȗ���0غm[z�Y)eks?��B��z�1����k
!�,
X�c^0@�"O�d���c�f*����P��G�}]!$���l��W�|�:�m����&��+E&'�Q���C~�3IEND�B`�themes/windows - 10/images/16px/invert_selection.png000064400000001345151215013530016165 0ustar00�PNG


IHDR�a	pHYs���IDATx�mSMOQ}?�����B7�d�ig�}3�BV�X%�!і��|t�J+�`�ј�U�NiA&L*��;�/��ˤ��{ι����.*>��x���r���g�e�E"�s%K��$�	�O��T~J@����1۶E�0DC�E�`���G�&�}�ʁ�v���`y�sa[''		A`���߱�[��+�ͭ��6���� �v���I*}���:>>���#��.䋯Sn�Wh|�(4�f�'9��D`|xx��ȹ�E�	|���h�?D�J�L9�;/`�j+��ީ��6J�Y{�G8W�$�كٹqw}{�(o,�e���t�av����k���������7��,�I�0W	�
�~٪��A]s[��ת_�i����	����W6���fV��[�73?.cS�9cZRf�3Un�n�a���@q�;�ڛ�~&CYt��!��ph�Ȑ4fLQ�u[4_/�^$�0�^��|^�F�a}��A�y�61�(�	��t�]��r"%�'@	��uZ�LQ���ӴkoW�pNNB0]������7�7��A#f�Q����+�ٹ�EǖqOd�Ӕ3���H@F�Ð�ݒ46)�a�]J�;A��i����(�G8z��i夸�҃"���}Q�@$r����IEND�B`�themes/windows - 10/images/16px/help.png000064400000001124151215013530013534 0ustar00�PNG


IHDR�aIDAT8����ka�?wK[1F��
�
:dP,1�.�݅��E����:�$���MN���B�*�%fh*X���6�\^�܅��⻼/��<�yx_��5���ր,���u�JN�`����J���4^,� ڙ�l���!<��N�`��pŋ%3��{(�����q���4�@�)l�7P�b�L�����
ܺ���ɿ�a;���2��fFvE`U̬�g�4*��G���]��6�iIfvk�E�a�^���'���Z?��^}����(��r��|l�U)��п:O��d�X2�sǧ%�D��J�tޥ�Y
H�XW��&>-y�>q70�)��AQ|2G*%��������u�������?a����%ۇO�+�@nc7*��#KJ�	՛%�ۥ,�z���9�%<�4��'���I�0�w�t�+x�y�i����L����
�l+T�8�A���y	�ֶ�#s��^{A�k�h��
Lo������4�Չ�4���;�I}q�zIEND�B`�themes/windows - 10/images/16px/view.png000064400000000354151215013530013562 0ustar00�PNG


IHDR�a�IDAT8�c\�t�J�ҥK��RĘ`5�>�0i�{�N/dX�#��:AA��S��|�[��0\=׃����;��7V����i2�ݵ�g�1N-ۊ�R��b�+�1�"�O f�<�0w�3���,܀����߽CQLL���y�VT���A��=`���HZJ��$�D����~Jf?4��&IEND�B`�themes/windows - 10/images/16px/getfile.png000064400000000426151215013530014227 0ustar00�PNG


IHDR�a�IDAT8��R��@�Z0�C|UX�7Z�#b�������7|UX�X����I�����ٽ��!I*�������\�W�3~!�cJ�i�<�y���pK���R��Q���Ex�3H���N@"�2@Q����$�ClÝ�.Z��@$��@���mZ�N�80�:���A�$�?�/�G�k$vP؆�r�Y��\��a}�6's�u�V{R���+�i�(�5IEND�B`�themes/windows - 10/images/16px/rename.png000064400000000664151215013530014063 0ustar00�PNG


IHDR�a{IDAT8�����SQ���ްD�Ma�*�����`/���B��	$��VR[��:�/�Zd�L1 �s�[\�f#.ׁ���3�	j���p��
�%�|�6�N�8j���x�x�\�i��OG��[ 5�"�gD|�tn�V��!"�GD������`0�����tjIHF���l���,�>}<���>������9�K�9�,�*��J����7)y��_��.$��򟭿{rD��MJ%�f�d
Y�(�{��9��%
I��~�
@�%0̟���=���fQd����-U�N.� �|��ʜ�-�O�.z��mlk��c�Z=�9?��f���6�vc�^wRJ/l?�M��zvv�����^��~���DD�. �޽�ZX4�k�:IEND�B`�themes/windows - 10/images/16px/cut.png000064400000001040151215013530013374 0ustar00�PNG


IHDR�a�IDAT8����oa�?�wA� Ѥ9'c�`�4)1�V���8t��4v*m�&^Y:8���R\�/��Lj\(�Ӡ�� 5
\�>�>��y`����I�6��zʤ��_�Tv�� ����C�P�u]c��(^�,� ��5M�8�=��҅�n�[�u=㺮yf����^�'�p8<�F����ͽC��|�7`Y���
�HĞ���X��.����n\O������_˲��׶�h��H�ߟ�Ab��3��ߺgw�E#�Q�6�f.U�+`6�&5��93h�G��h�o�7�'i�H��O^�9|�]8��xJF��u*�V�c@ �p5���r/?�S��S����r����ҥǹ��tc4T��?:ٺ[���T�e5(�!�Fk�A	@���*��'c�<RK4�/��>g�tH����Ss�|;h~��»Q��S�< T�4�K�qcE���x]^�+4�K>�r����*
��f��IEND�B`�themes/windows - 10/images/16px/view-list.png000064400000000357151215013530014536 0ustar00�PNG


IHDR�a�IDAT8�c\�t� ::���0000DEEaH,[����������]]]�,0��=�$^}�`�qdDQD��1�
1���308��d/���S��.8�x=NE]�/9�z�ع�,�ߧ{�|���V�EA0000h]��w%��7(
"�ҥK�c��G ����nD���IEND�B`�themes/windows - 10/images/16px/resize.png000064400000000712151215013530014107 0ustar00�PNG


IHDR�a�IDAT8�͒�Kq�?�^jbm�D4�4mD�\���jgO�b2������!�~[����@�"�p�b.6����ס����N�����~�>x�_+_T���тs��
o�m�֠7��̿�?�F�ك��s�Ɍ�}���ɩ�{�7T�G	��?��'���š��OL�ު̝��+חg�G�_u��͗������H��/f��� �FU�f;�e�~,�6����\
�zt#�-~W�^����	x>�Gckw���l6��N���r�H$�$�����ʞ�K���������D��~��6����P�լt:��L&���90���2�@$j�/�*�J��J�2��c���yP;�sp�w���-4����z�04�zIEND�B`�themes/windows - 10/images/16px/back.png000064400000000560151215013530013507 0ustar00�PNG


IHDR�asBIT|d�'IDAT8���1Na��V��'P�)$v��&ހ�B/`g��	�'Xx������
�%�.����7o����t�ר[3��r��H�X�ך�f�n����4�G��(.�<g�Z��v�;5q,ʲ��'IB��oMlĽ<�	!�1����pcf�{
$y�.����h�s�}���$_��d2�!�
��ǘ�u��cwBUU�,�!�'MӣN�Y��s�4M��B �2��X�����IxhJ���d>��V�$/�,KM�Sm6Izn��x�Qwf�uZ�#�
i��ހ�^�IEND�B`�themes/windows - 10/images/16px/copy.png000064400000000620151215013530013556 0ustar00�PNG


IHDR�aWIDAT8����NA�?���KHe���Z��w�N}	/�B�!&b��'��141qٰ��bv��'9�d�;��2	��VK|�g��R?��n��,�F�)Zk�Z���x��v�-�mK�V�.�+�qo�����F{Ok2�[�ܺ�T/`����n6a�5f��֗��&0a?`.(�]���tm��߯N$3�N�P�K��jU<ϓ��'�U�N8x��bEV�}�{@j�ΆD��>�ٜ]�
�Қe!��z]X,6JP�T&~a:��3J���h�ؚ'�q��d8���D	�U(��e��x�K���e~l	
%W̊��,�����H<$�[�IEND�B`�themes/windows - 10/images/16px/archive.png000064400000000745151215013530014235 0ustar00�PNG


IHDR�a�IDAT8�}��J�P��*V�D�ZGD�R7Z��*Ӆ�G�<@_��y�y��g�? �,f#UD]q��(*����"�M�C½|�ߗ�{"t���M�_��}���*�|�J������� r2�����1�l"ԯ/)
4�Mr�wuR�<^��w�Oh|��Z�E�XIJ,Ϲ�\[�`��e�@���J�Ei�ϥ�v'��7� a%�]`jf�x<N�Z%�H05�F�������ig%fn�&�"��^Z
���=u��sӧu��I��R���eme��;����
۷�V�x�16��<������s��t�22<�uSK�=c�\"�Lb�)��ѡ/�6j�;m�p�������HSڏ��#�D�`0���Q61L�p�����	��ځ��c(R���ԯQ���:�@�R�IEND�B`�themes/windows - 10/images/16px/full-screen-icon.png000064400000002721151215013530015755 0ustar00�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<&iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CC 2014 (Windows)" xmpMM:InstanceID="xmp.iid:16C7EBD02E7D11E8A1D5B3716130EBFB" xmpMM:DocumentID="xmp.did:16C7EBD12E7D11E8A1D5B3716130EBFB"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:16C7EBCE2E7D11E8A1D5B3716130EBFB" stRef:documentID="xmp.did:16C7EBCF2E7D11E8A1D5B3716130EBFB"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>� ��AIDATx��RMhA~;��Zz��ͦퟠFVz�Pm�"ғ���gO��A����Ń�P/�����F�	�Jm��݂?����l�f�C�W����̛�ݞ�MeDl��I���>���$�Ǐwٗ�"@C��ȡ��A/�%�P%	��n35ћy׾�_�-#b�!�Ԣ��Z�óY�Kv�'�N#*�� �}.��t��.���^�XY�
��ۼF��/��ǝ+W�dw�quذ� � �r�{�C-zЫ?���l���gv�'Hv����ҸD�!�~�%Z�"��r�"E���k���b\PqY4�Z�>��RKlI$؛�ο8�JV}?�7|;��'.f�������P�������֤��hπe����4���p���r�ד���2���� ��.dh�QC��̓����Ӳ�XZr��3�^��aG��;~�PP�_���_���Z���4�խs�	���1搛�����z]U�ahS�X�XrUW�ow���w.L^h��w^9JCS�RF�7�	�rO���&4�㐬
�Q���ن��0 E�k\��IEND�B`�themes/windows - 10/images/16px/clear_folder.png000064400000001263151215013530015231 0ustar00�PNG


IHDR�a	pHYs��eIDATxڍ�KLQ�/�it��a��ԝ�u�N�&>6(�@%�(̻۱���V�ke��7�Q�&V"�4@��PKmi��{J-T��r�|�9ss�I��V�r�cM-]��u�p�E�3Q,2�A�(0�W������B�
)��,�~����$I�X�cV</��g���$��^ �)	�Sn �)��":��'H����$ v����,�1u�dƬ1Eu</�K�.����I��� ��#6�u#3j�@ l�T���RMCfD�@@��	�{��H7	4ڛI`�)���:��#����s�N�uT��'9��̠�L4*+!/������/�gOB�z
�������{w�?154�Z;�pw����4�o�"8�6#�����Tmdz�{dykA �C7C�;��4}�����#\Y�hm5>>0ء�`���5�Đœ�O���|�`),b��3��r���#�\ei�*
Y摦�'x�H�	?�W��A��Ad�D����8f�YK&���)o����}�'���	�:=�7�'�o�ث��灷|�� ��_>z���j\jh�c��sk����x֬Vs�]f�g.n3�/�|�D�%�f�2�B�n�z�?�l��RIEND�B`�themes/windows - 10/images/16px/redo.png000064400000001240151215013530013534 0ustar00�PNG


IHDR�a	pHYs��RIDATx�chhh`@�P���������������,��a�147��2�֖3���3�7t�WԷ�7�V
���7�U�
C��\_�P[[�ѵ��n��g&��7���s��]Y
�l�j�J���B���5]7��h2P3����'��o=��g�	'�9N�tIg����3��j\�f�{�Sω=�5eH��3�"z��/��?�o����:^�XSM9Cz�4g�)��k��_m����� ������q����3��ah��˵����Ѻ��E�Y�k��߽��
4�U1�6u�X��?h��-5�@oՃ
��mt�9��`ƫ��S�К��g瞅-���
ղ�)�yo��N:�d@�[ \]��]�ثZ��.	�@u���-`yx,��14�V3xL�r�r�y
��m�eШ��	d�J�hqZj+2Zf��-���f��E��jmu�(	Fp�1Ӿ��h���V��(�#ljz����!�}u����-�=|Q@�����1$�mu�޼�ͦ>|�W߫�L�
Hy�膄
ќ���U��k�5�,���&d�!��o]Y��<�հ�#hz���BH4b
B�a�j��IEND�B`�themes/windows - 10/images/16px/directory.png000064400000000444151215013530014614 0ustar00�PNG


IHDR�a�IDAT8����N1EO�JP�HT�� 4�tT�L�(5J����E�
in
{�^�jmaY�ό�L��~�$p�Y�Fk	�6W�/s��q �˛�������=�/o��"؝�u�J`��$��d �R��(�P�q�C�S(�m,�<,;"��q�O!�2�{W3�.@<'�������!�A!�iu��RF�[C�P e�RA���2������*�C'�-��m_�8����IEND�B`�themes/windows - 10/images/16px/deselect_all.png000064400000000633151215013530015230 0ustar00�PNG


IHDR�a	pHYs��MIDATxڭ�Kn�0�9Td�[A�b �U�$�N
�z)�
(vŢi�Y�<�`�0�/�.!���\ ���qvY�iqkqii�j�d���GO~��v��RE���`�S����x\D"�x,
�c�u�m[6M��� l��#�����O��4
��[�=�w^�}�-`L~um9&�^Xt8�N��z���-��$����:Ap���3��[��uϙ8��UU��q\��?��u]s�w
�/��S@5q
h���0�Dq
��`���8��SX~�(T%��@2A���=�)%�m���e��0����u]�yߍ/x
h�ˇ�IEND�B`�themes/windows - 10/images/16px/forward.png000064400000000547151215013530014260 0ustar00�PNG


IHDR�asBIT|d�IDAT8����mAE��ѭ�H܀,��p��K��Y:�I����+0܆��|' �,X���ogF���{�t��J�f�&Kz�n��Z�ג�!��*1�x<&�s�,#�P�ǐ(��l��{ہ�!�z�ex�q���tH�d4���ެX'!�B�n�c��s�V��U���;�FW���(���v�j�:;! ��~�T���|l���fs7X.��iz��\���d�b�(���pT��v��F��V��$�%��b����ғ�}_����j@��.�IIEND�B`�themes/windows - 10/images/16px/netmount.png000064400000000576151215013530014467 0ustar00�PNG


IHDR�aEIDAT8�Œ�JQ����&bk�F�(�E��y�����
|A+�:`+���ht���H0H���
�A<p�{��̙����z�9 @>���P�\�I�BUa$�tz�u�(����_��x�{�=��ם�y�,3!3�3a
����q/ �'��=��s�ч��Wl���w��"i�N� ����ĶpzvY)]��̬�$$C2��	#�������~��ח��.�z�F��f����O�բ6Y#~G+�k)�A$Ħcd7�Բ�nT;1��Elj.�pu�\�n˩pi�pvS`i��$�����Xf �����B�
���rIEND�B`�themes/windows - 10/images/16px/undo.png000064400000001235151215013530013554 0ustar00�PNG


IHDR�a	pHYs��OIDATx�chhh`�Ɔz0]� ~k}C[]Cs}
\�
�%����k���J���J������ںz���r�<�M@B���ֵ�u�1d5L�q�;��dƋ�&����~�YD����:��jC�DkM�Sω=���D5.Lӝ���/�']��5��>��>.���c�@C8�\&Z�xv�[�6�����N��<�q�sSM9X����7�o�"�ſ�G�l����ף�����
�������ߺ��ź�*�` �-��d���ap�q���G_����@�@��{jM}��xʣ3^�w�9����A��z�KJ�&\i5��Ҧn��*�
@�Tַ�5tH�7��qqc�ju}37H�A�N:��f��@uR�XC�F�M��F�
@�Arm�ey
������v�zC-Ps}��`X�j�+g(��T����ق��3Zf���V��^�u�jV��0Z��L��RP4@c�Ț��-�=|a0����e�5%`�c$$T\�j���^]��_���?�
����{RFƍ j�Y��/_Ӝ��x+n��]�(����;���,�\��A#8�j
���f]�^C%0GIEND�B`�themes/windows - 10/images/16px/info.png000064400000000771151215013530013546 0ustar00�PNG


IHDR�a�IDAT8����jQ��{�̤�"�lR�"��,]��)��	�e7�B@\v��U�@V]����R�&�:�x��dt�z6�r���(�$S��@p�bl���;
o1^-�9�)ƩL7���f9@зC���7T����i�1�)�JA�16����[E!Π���/�Nc���Q�P�<}�����n/I$�b�?$z�/M�)�]1N%��+&:�%[���h��)�]�N7�׶��tW� �f��9��ת�([X;���G>��;_��	����ݶ��K03'P�ɐ+��'6@=};\���DDГ@O����
�����V����;��T`�NZ��4<�mg�M�[b���c�,l���g��7��K��.�l@P��V*;�ǘ�'@
��gG��g�u0ޱ�g;�h1��Y���\|A�6�*uL���u��Z}!D�IEND�B`�themes/windows - 10/images/16px/upload.png000064400000000676151215013530014103 0ustar00�PNG


IHDR�a�IDAT8�}�!oTA���{�:���)S�4�����l�5�"� �k� Y�+IJ�@UT`1l���@�h��9����;�p��̽���;3=bL&�����-ڞl�}yu�����w�xt�B�Mn����Գ���G�-n�=X H� B�hbno��u}����0��-��x�������u�;;O1PW�Ѩ�'Vd༖U�q*/�*�:�s�uYݚ������;h���H�B�%�7�0���-_�'����X���go��D�s���9�G>,+H�]�8}��n5���w�l��V�
���G{��Ʒ-�-�w��O~�2�p�{���C89_�c�*4����2�!��w����2��ohA�'��d\�AH��IEND�B`�themes/windows - 10/images/16px/paste.png000064400000000542151215013530013723 0ustar00�PNG


IHDR�a)IDAT8���=JCA��gt	��sje%Y���^��u;AA0�+�p'։
�s�E~L���Ýs��3S���~
���f0�m���am�����y[��3�Brs��Rl�.���O�R�4hn�)'��1���$�i�4�"ؚϧBi^ߢs���
$c'{;���3f"i��^� ��I��s=f���l#�
�b��ێ�u*2M�� �kЖy�;'^����PM5�A��*'�۽��3)~(D��؉3'��L/���g��a7rU��'O[9K��B������H9z�FIEND�B`�themes/windows - 10/images/16px/search.png000064400000001213151215013530014050 0ustar00�PNG


IHDR�a	pHYs��=IDATxڕS�OA�����/z.��p!1F&&zP��R��;;�����mSii-�Z�$���d����HbPI��&妉<�o���-6�d33��޷D�4�?0���D�2QU��~_��N24q8����uN	gJ{�W(Ig�����+�>N��\)�MG�`�;���U�a��éЋ/���5�Nn�����*���Ũ�d�N�=+
1���O?Ծ?����'�Z�a�"�v^��tanLg�!��&vo��{fc�snĖ�Q��������/��|�I��X�I}|m�YlL�2���|qAY����a�g�,�@�������6$�D�Q��>�N�W�^��r\q�
x�BFf槱���F��Y:�K.���F36F�-������:��t%�h6o�~r_.��;=��-m4���ķ{����1?8%�ç�#h�rr"oOer}3t��)�	R�,��>�~���4AD#Pۭ=!�&�:���8{Yl.*��
U���B%.�޾A�`w)���亀�c�S��{k�a�Ȼ<(�CX�8��A&ؘ�d-RIEND�B`�themes/windows - 10/images/16px/up.png000064400000000566151215013530013241 0ustar00�PNG


IHDR�a=IDAT8�œ�N�P�ǐ.�-���4
		��998���t/�AR^�����\�L�����2��7�?����

RU����P�1/��-�^��\��{SÊYUW�Z�(�(��Z���RU��y��f3��4���q�0���>o'y�4�s� /[�+�I��qv��K���q���X��i���tZ�0���e�k�p_�X,*fcL0����,�H���k��h���yƘ'`X���E�$����i��:�L��Ps���܍��|[D��*W�j�-"�u
��������D���O�qJ�h���IEND�B`�themes/windows - 10/images/16px/open.png000064400000000621151215013530013546 0ustar00�PNG


IHDR�aXIDAT8���?/A���"�
�h�=	�Z��etJ�o��h$JT
��(qgoof�}�{vŝ�$�y3o���s%�nOzW�����۟�<�tǗ�~]���H&:H:��$�k��@%ȃyT�Y�z<Š@cp�מtZ��C-��2�?��cm~��
\+7H"Q$�<Yv�?�-�V��A�A
�`#{�w��l9x�+�!
#g���[׋��"|���3p^$LT���M�z��|Z
ͱ�tBP�N��ӝS3B|�hF&�|�z��0@�</�90G�,�:�`X�2���cE���!M<Is�7�S��z��T�p���k}[6�*��IEND�B`�themes/windows - 10/images/16px/edit.png000064400000000757151215013530013544 0ustar00�PNG


IHDR�a�IDAT8�u��KAƿdg��5
��ۂ<+�	ޢ���Q�������4��A���%��V%%Q�`L�}=dwvv�;3��7߼�I��j�J!A��A
�5!���}-�lo���j�M��pf�Vc����r��_:X
�d0�@�@k��Zk��l6����R�2� �@0�o4�T*#(�ʌ	��/���(7@�q�\������1؞��6^D�6�����_��%z-L6>c��Κ��E>_kb�Ts/�gLܟbq�[��۫G	$S6����u{_�ց�5��iÆ�.�
��L��	�6�gV�������7���u���G�m܁0�Y�/�w�h��X��-x���p�6r����WH�0�v���\W�4n�z �~�
�L���d}�\�h���C��-1C��6vZIEND�B`�themes/windows - 10/images/16px/rm.png000064400000000530151215013530013222 0ustar00�PNG


IHDR�aIDAT8����N�@��B�A�nwy�������d˅Tb�g�H ���.F���ɤ�֚�${ٝ�gvv�?�b�:NRŹ�Nc��0~�UZ䤘x��;m�q�`�V/8M����1~��m=�4�
ɋ��ʝ�!#��Ќ[�1g�pJ#n�Ed��|\T�4�V��XU9��k�_b���7�6U�~�baX�q�Ǫ_��Y۠yD�9& "�qt��yS뜿s��Za�)!�O�`�YMۗ�>#��	����!�i�S%�~B�^1�7�g	���/���w�,�IEND�B`�themes/windows - 10/images/16px/sort.png000064400000000710151215013530013573 0ustar00�PNG


IHDR�a�IDAT8���AkA��63K��ӦP�m-4w���9�~��7(�Kx�k@Ā�X�h�j{�E� ��(M�}<L�R�nՁ��x��>�޽ߗ�03̄��S
g��ja�a�B|�u��p2ce��N�-Q������ѧM`f����۔�u��!Ã@�����O7W���dz�ƨ���O0,��<Cy=���T�s�7�vN
�oCdd�+X��x�i��d0W���(F	�%��� �/��C0[���
(��tV�4�an
IH��eGǼ��(�{N¥���ʷ��	�$?�����g�ji7F�禋3�l�w(ݹ���)���@�h������=#��(���f��5[����}����iI�-e+�~\)�:G����'"�>�IEND�B`�themes/windows - 10/images/16px/preview.png000064400000000372151215013530014271 0ustar00�PNG


IHDR�a�IDAT8���!�PD_Io�i�z�ZL�QS[�c {58B0�]D�C ��&3��?"���R�UUeπ��d�bm�^άW� P��ʤ�L
��P;60��I+�RPT5!`Ҏ+(i+������k�}��6GADz�߉H�I;{c.�h�j����ڶ���
��h��?�@}[w�5�6IEND�B`�themes/windows - 10/images/16px/select_all.png000064400000001220151215013530014710 0ustar00�PNG


IHDR�a	pHYs��BIDATxڅS]kQ�?R�� ��&iw��ݯh�BP+���&i�cZ_�R_/lD�������s6nvća�Ü33g�
���w�������xK��
�V�l:�b*Q�*�Z��v_�#��\pR���=��c}��j;���H_{<�ןL��^�ƼV��^�o�?���q'�w,Q2l�3��o
�D��D��D�hA�т���ќ���bp|9��b(��Hj| ڟ�>m�r^%4�BTg|��H6"]f��v��-��/C�HTf{��0^���X�d�@ Hlq�gFۨr��n�rG	����.b5!`��
�a����AB�L4��s��lN6�Q�nJ]��9�=�hpV��ܮ��3+&{\����T'd1&Y\�>�+�,`�-��6��h[2	�9~�c�-�X����2�13ZF����o�F	��W��z���[x��>�[g#�sH~w�H�g�
n��$���v��f,�\R���ƃ�u�?
��44���jOË�>�kNwn1V9�h��W������$�+6�/J�[��|apl�9��S�9Wy��ͣ��
�7}�{��zo�IEND�B`�themes/windows - 10/images/16px/extract.png000064400000000740151215013530014261 0ustar00�PNG


IHDR�a�IDAT8�u�?Ha�����&t
5�E(j�ҵ���v�-�B�fq��2[���@��J�ڡ8W���� �5-��|���ݗx��}�w���}�;��I����[�/(�J4
o��M����ٗ9�T( �ɇ�>����}��2�^�q�ݼ`vz����OB�.�	8\=ϣZ��y^�<����_�V�
d�� �D��+Xm#`d�A���а�J�B�ߏE�5�� ���Vo��
��,���j��\{Ea*���v�3�b02�Yn�N����N!����c�4�O�p�w��)��y�d�__��=xn�`F��
��R]��$�R��� Y0��	Q�5��(3�A�q؇T��GY�����m��&�G�"$�}��a����O�ۥ��P�A����n*9�;�WIEND�B`�themes/windows - 10/images/16px/file.png000064400000000511151215013530013522 0ustar00�PNG


IHDR�aIDAT8���1o�0��+���͊�i�C�F��C:0���^�]���A�$����}w6
.�˗	��$|.$�R�j�=�o�ߧ|r>7�۽b*ڶE�f��j���������Y�b�yY+�>��d ]�=�k�u]Vϫ���8�8&��F�$8}��_WB� ��,G��3P"s=��L���>'o���(
p	A�y�`a�����l��Q�?�c�}�/ ��Ƙ��}�>�
���
!�70x��ux�~�L���)	xIEND�B`�themes/windows - 10/images/16px/arrow_down.png000064400000000345151215013530014771 0ustar00�PNG


IHDR���	pHYs.#.#x�?v�IDATx�U��
� �Ǥ����Q$�����9��P|��J�V�����9���'�d��b�8��=b1��c۶˺�ϜsX����}7��gY���
�R�M<�F
��!���ɢȻ��Z��r��ɓ���T/�ǭd�V7~��/PF]���IEND�B`�themes/windows - 10/images/16px/download.png000064400000000572151215013530014421 0ustar00�PNG


IHDR�aAIDAT8����N�P���P��S0n�\;{L�����M��v�֡�!�v��b��5H��Р�=�|��<yϏN�_?1QQ3�%��|s!�gE���(62�$�F���,��������+�D���w��5	��mJJ�]���RG9�4�b6�YF#,cj	�]���Y�rp�&h���߳^o[Q�qK��F$Y+�������V�jc�s\���HY֥*_2�}�z�O�f/�K��FJ�.��p�`�Y�pA���JR���A
�Y�+��︬�J�b���Yc��Ԯm�]��4�
)J���v�IEND�B`�themes/windows - 10/images/16px/arrow_right.png000064400000000335151215013530015136 0ustar00�PNG


IHDR���	pHYs.#.#x�?v�IDATx�u�M
!�3-S�sq��^ŕ'(��E�[�u`h�	$��{	� �Ƙ��
�p�-1F@
���s���s���8Gh/�Yp[�$�ôNh�Am{� �$��0�Ю��x?"�)b���c���a�����#o�%A]��OIEND�B`�themes/windows - 10/images/16px/directory_opened.png000064400000002142151215013530016143 0ustar00�PNG


IHDRĴl;	pHYs��IDATxڕ��S�V�E�&��*3�Y'�MW!�v��c��3%l����+S�@Z�g�4�$�M��u���Ѐb��!��0��غ��W�˔�]|s$ݫ�>}�\��)	�R���+:Mu�R_!A�)A@Be�s*:p�N��cfE*Z-e���*P8<V�L�� ���xy�m�4�ԩ�b릆����
��.O���ѷӜ�����_X4Br����Za/��b�p��e`E��-��@�,,r<�3k��3d�>N����U��jq�׎���_�…��K<�E��>���JК#f�?6K��<�^�/� )o�ZI6�'�P')DM
~̑\TL
8�s�K��D����a�.dݐ�k�l@��E�	^b!��j��$�`��I�d�FHy�`����
a#�)��;P�j�r���lLa�1	i��R#�� ��b'�c&
�+��j��w@Y���qR��B�
�y-��:d �h7Ʌ9
F��Z�Q	��em�$�t�3�@sn�9���� r���l���Q�P
��r��H�|��G1��@��;����6�/�"�9�dvtF݁U8�Q��$؜eu��� ��
��^�9��H�Έ�3�<���
�v�c����)؍ɪ�櫅����K9�tP��cf(>F�>t��PQ�\<��°�,�������c��d/ԩ�%�
�;�^�m����<Ow޼s�à<ub�<@����z���,��r֯���E9j�w��k��(Z�v��Wjm�IY���AY�� 1�d�z��7B!�8�$fxj�B�U>��Z���E�h�jV�ޯ��M(Onsa��̏��O�<���<�:O�7�'�{�/�?�s����Kg�����z���A�g���`�⏾��� ��_YN8 us��}��f;>
�Wc������t��S���o64\��􈴭x
��
�s���q�W��kʻIdn�v}������w��$�t��S��u���8�.����AU�A���Q�IEND�B`�themes/windows - 10/images/ui-icons_default_theme256x240.png000064400000104645151215013530017311 0ustar00�PNG


IHDR��tEXtSoftwareAdobe ImageReadyq�e<&iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CC 2014 (Windows)" xmpMM:InstanceID="xmp.iid:75795EA0278611E8BE05E10E039C07E6" xmpMM:DocumentID="xmp.did:75795EA1278611E8BE05E10E039C07E6"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:75795E9E278611E8BE05E10E039C07E6" stRef:documentID="xmp.did:75795E9F278611E8BE05E10E039C07E6"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>�I$
�IDATx��}�m�u�w��mUױ�8�L+���N䴵������%]@���$��@JpY�KR,����K�R���y�I;R- ~�m�P��2)�I�~HT(���?�V8�����\���s�Ϛ���{>��{��c����z�¿����O�s/��^���x���^��'����k�98w�9{�}�{�Z��}Y��B���������n|�����X�s�۩�q�q�|�q�/�o\���k�����z��=�zi<����q�s�u�(?�9����5ݓ��x�~���4�����wwNո�u�����c�?��������9����'���Z7���YG��g�y�0^�-O=�|��Ku2����<��{����ɓL�u��~S���/?��:�|�<�tb�����d�n|cZ�t?��k��7�?~?���a��<G�~���H�1����㔯3�_^<:w��t��k�s+�梞���%]C�1���c���׼�v6W�Y��I��d�I�'/�]tS��<�5Յ�o~4���`j�����9��䌙~�x<G�g�����.j2�y�^�c~��K'av�=̓��5]k?��|��~:�9�5�bQ���&��>=�%]غ0�Z��׹����7����Ɯ�k��E��9������7S'>}�X�5�{��:&�,����"\�#h2.j�q����r�p6��'|�
7��vo0P�;�Kލ��I�م�k���8�{}���׼��J�:��l\��{6xϓ����s2�R���ӆ������Q�C�B�z8Ψ'��'��tM�Q蒍�zX�e��Uy�`,@uC�D����:��:��ˋ)�>�s���ݔv��¡��m�w������Zӝ�'���}����G]Y5��ꮑ�'O^5���K�;��O�w.�yG�ΌU���ɰ����\h:�Bh��]��k2�y�慚��rj(u)�U�y�:�;s�������������<�?��#�	�u�%�(��'��Q�1��z66:�iQ�c���	�s<\�SM�P"���9�XQ�	�7�m;�t�j4ӹ�p������)%����}�9�b��$>��<!7UwW
'�5ڌ�����Ԑ�^�[%�;h(����j����>���2`��p97�[���J�nʂ����na|DZKp�����/�n�Z[M(��o��}�	�;	
.���q��T��L���'Sc�KF���yјQw�~�0�G��
#4FO��q��9e�r�2�3���#����"�d:���1�FC��BX�@V�I�Mz����<�<G�8�|�\bɹ��@Im��~V-�Z���8��;�����	տ_�McF���<}v�����5:�F������sK9������v�A���!�X����hl�}�s^��Tگ��S�kѲűn�}R�BK��<չOU*W"�<��LG9���H�%�c�6<�C;넢��6�EIVwq�~]|ƭ�N:�48U�]��J)n��g��_(�5;�L��x�	e�i�O׻P^���p�G�s2rAt4y�:��숛��kw��xu�Q��D)�p.��p�[TO�6$�I�{A^O~�hz������t P� P�^���J�bq�:�9*+K��s�(��0U��r��R�V�kq;���)��Y*A�����of:Gfq���GC�r�SR)��mW:v`"Z_UU��j�PJ9�:Tn�&$�DMF��ɭ��X5E�@��3Pev�\�Cw�
=�l��%��h:�봀轴*L���$�r����uO�(�k��5�t�՛��������� �=�ݧ�p.���B[Q^��߹F�j��D�b41��."sh���Ȋ��R�\�U�fұr	H�&B�҄��W�Q�+�Ri���
�R0��1h2-��Ȧ�G�H� �o]5Ey:T~T�?�;�wC ������䐀��sݕ���B;-��TjR��05ޢ�8�u�.��G=�Np]yi���ʴt�UhC�r��Ap�~�dw��X
�+q����4�<��Y-M�X�–�p6g�Z=�i�8�ÕjhR���U�%�ȥ���\"�x3@J�����}�ʛjxvJ$��bB	^B�U�,���H�D�q�<��A#�,+��F�i��`J*8� ���ĵ!���XM^�9¡�$�m��|��t�jɣ:>�������O1�c�Qv�e�+��BQ+$�~l�Y��	1F�M�w�����*Bh��nD.����t�
m\,^%Bu�v�,ڐ4�ׯ�KZkT ,�@nP>�*�����B#�����`T>4cN��p���x�\j2J����T�x���v=7.	K�!0�y�� ��K.S��=U�B�QxH@�
���.9Ia�3.��^����{��jȄ��	DI �t�lk5�tnt��y��%I���N܎[a�]H�v:*��s��rYng��&c��\���A��������q�0�\mgt�ktb�V�A�j�9}�K��s�f]x�l�c*��KRR�r�u�;k�.��"gh�ݕ�*�ۑuAi≒�U8DT`z݁IhA+�&e�0�{�q��N�:J�{^P�wbv���d.%�ɣv�$�I���Ԩ`G<�H$Tu�#ڑi����J��Tr�|H�xw�\�W�^���W�]���ٯ%�"!�4\p9J0I��(8G��vn��݌\[J��2/\*o�<$�3Q��qIb�;���5W�s�����d��vY���qr�rD�j�>3\�.@��W�Te��w���	N���c"��I��+�n˥�1t
h�T�`c����R8"��
�^q�B�p
&�
1��x'[&d'��"$�Qh���>�]���8�D��]S+)TN��6K��Q��[=[�|U���Y=�~8ğn��`
���[^w�Q�\y�\��c�5�d�+��s R�.I�l'r>�*�2�0��3�	\ȣ�� Ii�nI�4sC�ɉu�iww���cA\i�:���	�ܮB�	A�R��i��l���+}G�Vo�I�i��sn��Wo�e�ՠ;�B理�NW��|h}:l�`,���(�6d�E�Xnp�Ϟ�.)����_ܦ�1� y����e�]�E�n����'�ˁCP��~MF��gg�=�|�LZ?�0��l���0G��:�6m k:�%{c��Oq���D��j�y�<)�8���f���l,��S;�	A�]IxG 
≊S�k'�䪒G��i�
��W����9�z��RR	�B7�Pb��Kc5����[Y3��wt\ի)B;]��:�T$�!����P�b�;ܫc
�A"��{RW�"ː��r3T2�{N�vT�8 .L!�D��deUBNdٗ�i���.C"�R�uZf�p�)iV��$vL=�Ų&�����b�Ӡ3�VI%
�(.OȢ%�D?
��z㍠�VGA�d$䚎u,�ݱ��N�/��t�4Fg�Ą^�*=��#��	h��x�h�bT%�](�<�z�n�a_�6��7"	V���x&��d�
i�����N.|����;���s�X�x��0I�$�B�{��O�'��ܧ��D��!�1�^��- �(��h��qs\�3���Q�9nU �}�2�`G��QB��K搃�	R㇪��v@B쑫DW��jL����+
���KT�@�̤8�ʯ����]�^=��Z�MV
m�F5��`��Ned+�k���
��@g��:0
��!:�t"�(lsG��;�&��Dw��r.��ʴNπ�o�W�Yv*�:PN���k�,�ƼJ��8�r�q�Z�!���Q�ܑ��/P��+=}-�ѹPLO�-Ǚ�܎3|����$ιU@e)g�%W���"��&_HR�J.��)�|��@�r5	���3;�k�E���ES��v?�n #�7hy+��v�j��񭾟�&,�Da�ޏ��zk��M����Y��=@�~LjV^^7���sV���w��D;�#��B��Ν��N~�Fq>�j�0б��;�*;9R�
�ͮvJ���Չ���!��L	�r�� ��>e=e�*��Dn�Q����I!��+P"���#�m􇄫w	0�ew�
��g=\��\Y�઒��X�����c�R��@�&Va�!qވC�9�
R�u�*�C�r�*����2��I'U�'׾K=��'%��Ʌ'2��DL�t( J=�}C 4�0�RY�ִcTBNF�"Q3Ru����	�0��~.�AyZ��!-Z�C��͒!r���>T����.G��\�%Jι
�ʄ�<��(*�~u��O��(QH���r�M+	VՅ�N�h�[���.wPY4$�Y�#W�,<����!A�gm�aFcW�����7f��k�-fbU�>�%�Z9hR���eD���!z5�vD�S��J2LC��D�[���)���g:�$M₵��>�k���:�H�t��諮˫�e�>� �D� ��!��8�3��]T�f.A�:��e���v��eP��ƚ���J�Wl�m�Qt��}0':fͧ�P�tn��p�ʬU����A����x��E�w��t��}vBg�ԭ�0�jFA�S.NL]��ʝv�"؈bmr�g�w�ݚ�Q�x\!�Yf�X*wV�Z���O�u���W�e@���Y%�l?��i��N�*cM��|n9TX�/�U
�ʫ�s%L}]�?+s�u�!�S�wh�ZR�JR|�Z풘N��ya�/�-]eݨtB�K�/�px�k���9Ʃ�ͫ�!I�Fǫl��%`�g��f����&A�Jˎ�[��l,�e��]����t���G�.Fz�G�\�n�b����R|��RcR���&�:�
?�ʸРr!a���g6���j�E�w�PÒY�1����DYV�����p,��p��dN�~��L}htkX�5,�h�񍉍�L�u�g�n��d�!���E��Υ�D"�
і����@��.Av�ޭ�K���
d���?���G�
@�O	!�<:w�0�>��
�*F|��P�éR�+��k��URc�@�4�͍]�Z�����i]\���^��}�����*�J[��Vw��%��u�>��=@7~ɼtJ����>
*�76Y��	P�#�ڶ�PV��K�B\�ݹ)#N�4QK���{�s�=Nj�a�əlݠ$'o`���������t
��{/��r9j̞ט�T�p�0c-�����9Fa��C�j�8�lkE�q'	�|�Kج���kq�F�ɗ1y*0�Y��������q��y�V��J�=����p	K1��A;��;ٹ���8,����)H̿8��=:>C
�'j	bi'^�+����X�c-dO�)V|�3�;��){�2�$�l@g��솺��)���Lh:�"���/�x)��Nf��#>�ƒ�����˙��`��%ߗ���D؇Q���a��!#�u�S8��HP¶5�[�t�Ǭ���0UiM�=����#��3�����ڍ���Z{�hA9bN����p���<�+��[�K�S\͓(v�Ew"5�E�%�ⵥ"�A��9��j�H�x!���x��^���H��ECª�p�?9{�$$J�JL���Beg��-|����ѕ^	��#gҵ.r^�Ӆ�lJ</L��/�2/��-*|�yP���U��Ӻ�Ԭu�+!V]s�%e�.ԇ���'�k�EO"�7#O��ӎ]���%����S�!��bV��ļ������2Z܋�A�]�nZ+zO]'��
yPΫ�Z�[ ����B��Ȯ��Rd�����?sK)��k“;(���;��e�鼜��,��^����P��y�=�U�8��d���"�*�8So�R>�P����Z�kIG�w
L\�f��\��!��&����
S �
8�HP���x;�n\�U�{��;Ghp�0�vR2��y'-~Z@3�]�S��9ya��"�"Đ����:j�l�]��js�{F���N�\�G@����j�W���h�9�k���}�ؗ�ٮ;���� �	��vS�IQzj��5u9���5)o@�݁�^i�wh9���F�L]�4v(ӱwX|
Eءb)lVG-�u�t���H3s�L���f�kuC]�4�\ؙ�å���XU���D�$���k�;����S����6�*�.�4��0I@�gS[,�MH� �w��A�n%�HC�S	Ws*�c  �;f������d�����r�溰(@�
P�@���1�tCb�<$|}��	��3%f5D��’S5�L�U��n�#!��Uh暝Rb��i��pL�p᠎�=�S1#)�vc���qe-j�0k,1�Ehr���O֛�Q3H�jރEN(�ˊ0J涒s�{u1�ށ���w
�\r�L$A<Zq^�V��E�.4%u	�M��Ur��
��X�>��K�a���yL�wq����tY^gQ��p=�41Eq6�M5��*�
�'��\4��f��N+ �=P6�0��$[]�Z�W	/�QI����θ:Wݕ#�Kp�}���	���AHb�F��4��<fـ�&<�$;r�]�@�0Gwu����s!ɕ�2�1-�K��ʦk�*Ul@�.�=�n�:��W���і�ߦ;tP��=.I*e�ͿL�%,�u��)C+�؃�		m�G�
n��/��%]��[P��rz
t�l ���m���p�3/�X���D�g���ZC�W�iqgW��;7�h����E�E�y/�PK��Ę.z�\^p+���1��9�NbS@o��/=�8P��ɐe��h8��A+T��Lsi���b��o����X�޵3%�M[�L�#�S��fՍ|�9��XG����B�{n�������,��I5kL�M!2� ZNc�!Y�܏�.x�O%A]䮫.AAe���p��4�GYCA�z.�Fib.N&�y��k�}����)����*x�H��Q�.�!��Q�YO�wUo�����M���H�)��jl��������6TkL7�4���.�}�5�d����F�D��j�q�S�ӹ��Vf�-�A�ś��50��窓1��,��Q��BT�������A�K�Npc�.Iv�5��o_ʬD��i̫vܖx��,�K�ʫ�n�ڧy��{4��͘n�5����v�2/I��6uYσ���s.!����3��_�g�5�)�.��igY�y��,�f�)��f%��5���$��X���$G�$�a��D�����59���f-�q��ޮJ	IB�ʮ:6�%���s;o��N��9Q��3~�BUW_˭�g;�����7I�U*ӶH5`-�P2M������qc@Y(�7:�	�F�r�j����S����!,A�Y
���X�n,���c��u�Ѩj0s�����>|�j�q�t���8<�hM�v�%SYG�q'�*9�%��� n��� ���2��@̭�gI^	������{�w�,�=��q�K�;,@8gZ�ZR��s���C;)0%�%�/"Mu\_�ز���%��e?���h�r��j���'f	^�v!v>�����o���X���Vב�RTk�N�:�=�]}3�
���SJ��;��ɫ� �Lӕ�\�\Ϲ_U�h3K�~:�=\�Rq
iy��N�ԕ��&���t����.���,-�>(ژB1�bW���Ք���I���
�N��TT' ���N��Z���^�p�?ݕM��y��c"{9�F=�tHՠ��N�?v�4!Jp�\J�͍М��㔱(�fs�i�.d�`�mC�\�t,W(g%���S�I^s�5S"Ĭ��û+_y��	sRɬ�p=�i�e�0%��'�I7ʼn�T���+��ʎUc�x�&�?��y*����o�L�U^�K5��}�v�Yދ�K�SB��/Ԣ��U�tZ���>�������aӉT��*m:W�S_sU�xD��	�#�kz��(V�`��]�a��H�CW����A����#F9鴪7A��@i+,=~N~Q�mE�)�ع�F���T�&CF��T	S*�V��g��n	=D$�*we����:�Z�w�~�I�Q8�ƪI�y�n�3*��u�o�}v�^�hub���ʶ�g]���M��V�4NC]s)1X�t����:��t�	�By��8t@����]�qh �j���X*��^z�D�c����@D��f�U�0�ӁK�X��F��#��z�n̉����'2L�:�PUZ���60�4*I�6J�U=+\XE",4_�x����n���Ɏ|D�I<Ӥ�6ִ����5����x�d����˫��%�ï�:���#�I�!2����ssF��d�U;�]�s�Tܵ!�������T��c�LE^�z�N�r�PV�Z7��.w��GXw���K�ɍ���v	8g��1!6�k�X�v�Ϻ��&�3�7�v����]��D\ρ��8�@��yy�!H	�9/��PN�$�*X��	�G�I!u|g'bQ�'(9�_��W�����k{�]5�� �����q�T�x�X�\�$�i��5�d�,�wYxZ\�.L�<.EMD�,?g`>:@����]5�Ek��
>���>�5븝�Y_�۝Gd�~�;�N
(�:�9R[q��ʛTs��zN����
�ЂN.�鐅��W-vW���(�:@��Jӯ2XT��9E�Uy�5$u�wV�<�j�
 n�`B�d�]��Կ�R?�#R�@�Ѯ��O���n6��[N%�t�$�	�P�$OjK��#hף�Rvtf�<#����Bqj�Z�����dDH� �pW��„ɝA4v9�k��%n]����L�!5U��y,jL�{!��0�TѶ�}���S���40'qB��5O'{�
���VM�a�:�y`�u�����ϭ1��J��5�b)A��4tB��F&m͍&\
HV���{#��5�D��
(�mqfB,�o���$�2K�gۤ��\�+��aRh�2��d�J�޸�i
��?1�2��-]Mf|!"n��z�q`�-Bv�3tf�L�A���%��j���^�S��d��ܠrV]��|���BMI ,�1��-5Pʷ�Ԙ3CrWm��X����k���ƾ@��L��}�i�0��� u�GW�%�,��Oipc	H��Dd�Y��Kn���Hu@�PԼ�v�쑫s���klJ��d�RGG�p���t�+��1q+n%���n4m�W¦�
�I�-䂛NG�d��c}�k?�r�?$��.��Ln4��
5��N#�rGԥʉrP�������$ڀ����@�\&e�Gjս�0�x���ٔ�L�e�">N*D�..�Dc�J��:��<ǒ<�-+q�i�D��r[�U@�E�h���l*M�jb+P'n�2<��7\CeS��/�~��Pk(�$!�%��I��qU�u^r}7��c�Â���jG  M��,
�o�ARxQ�c���Q[��AnEh�+VAn�*F�L{n��*o{�;|%���@1�#��z�{��l�}����^��5�n���If���jL�&����*�:�#��cs�g�����^����{��|�HB����T�˾1 ���r�ȵo�l��{w�SGqd|�tp�s�ڏ�3)�}u�cw3�9�fq�Y�s�u�0��c�ž��*$˭���XF��H*��՚�PfZf;�f�!�Z���ݘ���U��O�*iJ��KҔXL��6���q})�M�	ź^��I ��j,HwG�KN�@�˕u�↝��$�\h@;j�A[=����<�c�J�V���I���/��@X��@DM�F�f��|��pT"9�]W��c缁�i ��q�gs��m�!��L� ܘ$�"c�8^y��
�L2sZ��A��Ծ�0r���̓\p��,�3.�w,A���2�Up�g0Y�s��N���ϴ*�	wR�x��s��uZk�\�k�h���t�Q׍�e�kv�����莫�v2��|�}v"&�}�c�Q�C��V��	����|�8��Y��G�m�D�z�Q�r3�(�`D����u��Ō�����.5�����P�3R��g��
�Dݽ�F�,u
n*��>PhJ$j��
6OF�`��"x暣fR�&�C�9��C���C�['�IpT96���nu\���d���I�*1�e�Ve���C���V�;Tc�:;��D�
�8��$� ��
]ULC�J�B�zN��jZ�F$`�{Ρͪ�\��봓^ݕ�\m�����8$N@Յם�kz�"�����1�pE�
�༎r���N��8��G��˵u'ҙ�8e*��#cQқt��J@��F�qg%�S�:%�ܤ����R*(A]W�2�����SMV�9��ȝ$~�ʣQy�5%��R��	\�X���B��Z�u�[ ����Ȱ�%�=_х�
@D"�͙\w�nTy������0��k�C���.���I��� <v���8����Uw�CW�C�~t�mU\�\.,��^jp͔bn�u1'�u�|�9��֬�<�Б�Gc�2�Ҵ���-�zޠBm

����;�&p�N[���z
Y�Y��}8��#!ϥ2��w;�m����	!�H�d�_QnIO��3e�i�W�D%�F�T�q'�I<'��c�{_9'�J��>�3Wf�{r�՘P.���9�@��u�9'g�n���4�I6squT��3��yCF�QgX�����M�f))�n��K�U����P�
�,U5�u
BN�yֱ�R?R�a�lu�?jr�Ƃ8$:.�j��z(��
[q$H���:7��M�/ޚ�`Z�V�TN,c��V�/�43�R[rl�Mj���
��D`�D#^�?����!G�]��N��@�K9���C)�OƖ�ܕ��{d�g`5m缕�����)W�<8g�h��*�x���j���.4`�Y�n�F��ve%u���j�>y��yV�
��p�~ 絪��������)�<�dK���GUCJ����)L�ʲ�Րa&Ґ�sh�L-�i�(�^K��I9
���E��P�������(��E@rj	�����C.�+K;����晆�q����	���(�h�hÌ�}����8���IF{��K�
�9�j���ѐ�t�*����������>Ye� �Z(7�<=E��
@��\
�ʒ��r4N����Q%]}G�vNʹ8����P�ب�J�+�;p��S<w|�&Q�ӎ�y�I?8�5�uY
17��{��	���$5z��&��u9_�h?7�$I1���b�:k�.;HV��$��|Ps��3\�(@��#e_ݍ�0���t	�P����y�,$ؠvyh�5_!*�kO�D0vMFҵ�x9X�kS_)Y��"O�%�
��ך��;4S�u����d�t��17�����]p!���k���lP���Kv|�x��J�&��"Ո���Ά�[��ʾ��c�Iɩ|�J�;��Ș��4�F�k�U���+�vv��s��vu�D����Afk˵�;�]h9��+'�1Cn�[� ���=�yIo�k�r$�W�,�=�0%����|M�kM�Վ0D�Vٽ�J�����iѬ2�M�^�U������u��YT1��������C
Ģ][�*ԭ�i�SN�<�5#��3Yt�(��ge��K��sG[��臐D_�.�,Y�����\S
��"��N���F�F]@��ų�W�Of��d�;wB����\+�9�L��@)�z{
���Q�I�2󚫠���M����"�c�:��]���m��5[ЉPGױ`��.|� ̺�oC�b՜5}�]?ɑ���*~�1g��3��5<�&����7dŶ;��4e�]���8�04�*!�B����4����N~�}�x��H�䄹'ػ+�BEh'�5��T� �<�x/Ukp��&cwf,L콍W����ȵ�i���C,4�6{��$�nv�G�?e�g\���9k{�F5V�))%��M\�8��H=U�;�ו����e;�=7�{H���Z�eJ��;��[tԮ��*4\�"�&�+��jVm!C��g�f����d@*)8R�pU��_drn�s=	\��(3�P��x�b,<��<��}�A.G�
u���,A�N5Ġ~qN��*MV@R�!fǷw!�����j�(��p�z2(�`�c7��)|[�/�措4;9�S2�'e5�{�� �������|RY`@h-��q�E��8�� I4��:�'��9����nD��,c��qD:"�<ǧp��
�_�/��k��#$7��i�>�m�&D�a͵�J@�>g3��24�"�cҠ9$=_)ڸI��j���]�a\��W��3 .�N�<Ű��q��ؒҲ&���tsB��t`"�c��У�U�
$�@�#:9�� ��9��U��j�Uf�Wv	5�ј��<ڍ�;�/�{p`��B���VMU�d����ȅ�+���D�j�QI�9�����/�3�^z�k�z�UM5t�PpB%�ش:�I��T��t��3��!ĕ-h��5�����(!�a����i3e`���8U�v(	D��<-�Pi�bCZhNɇ0���"����ʵ:�>�|Dr����IB���z/-f
]��%U�6�B�E�&=:�Cgً
v���s%]<�r�8��.����#STZvt�N�׹jʣ���_�j�\H�}�i-:�G|"�*uv�D;�׀�;m8��*D(���Qn�*Λ�0��	+�A�s�r@�\i�{.I�)�r.N���XsV��,���ZjUر��u&۵��t� %L��Z���Qw4m,A�?�f��A\zM{����c]�����J�|��\(��ו"����\8�c��Y�=��XB��Z�ĹC��q�߃|5�g�s���S��@up�1� �3��	�Ρ�?"���!���їp�Kb(ޭ���.��$��Eo��~؟���Nw��~��䕑f���ؕj�i�i?ϴ��=�T�i���B��8"�Ի�~��v̻)�'�r��5��ϭΫ0y�[3��M����[�y�V
y�j"��p������}���[���i
�dp��p��k������ʼn~k{�6�[k��x��m�Pj��}�	�B[���goR ��l&�q�����?�Ǡ�~���?ڞ��‰>A��5R�Ͻ�]��%�Ȯ{�=���|��WF#�.Ř�Nc��CT֌�=�Hѣ��?О�؞�>Ω�;�ϯ�瞮���Ӷ'���r��Ƅ�$╆7�S�Ν�%9�8�o
5�h��>�~n:8�i�Sr�0�/��t���h�;�_�O�����ف1Ԑ��������{���v�6_l��a�Rk�In?��ޔo�+}����S�0�}�����Z����p��2���Y�У�3+c\�w_�F@��5�����-�?���z�/�g�JI�t\�|{��+b0��v���_�sO�Do��Xl_I�]cs��J	��a5��L��6�5��1�������}������s�|�׬���	�k@�R��e�.�~;�g�S��=�1���d`��׉�p���*2��@(��N�����u���@��C�	���k��RM|��8�=�86�C�L\26�0�6�α;�{GP�4./i��	�z��MקW���3�囝اC�ű�s'*J��4�V*�
^�K��ϧ���Mo��[�������BxVr�m<�T{_;�O���!�e��#	�B��3�s��h&(�E=�t�^:,o�q�v��_�U�gfj�Z<�ܞ��A0�J*K�M��T���m�)�߆
��\�
��o��k1�Ǯ�^���ڰ���~�����8׿��$o� :��A�`_upZ0}̺'u���X��ܸfbs.r}c��PJ������oj��k??Iׅ���B%0��f��*>Ĺ�r,��=]p��]�5Hh��-ySy��a����* m�x�S9�6��$TWj�I�f�0�:Yدs2�Z��㿤����>�
G�ߟm/_��^����~c���
��,T�o�����'�릛v�j�T13݀�,��/#3��۞�K\��J��C�o�s��t�#��˪�ҩL1<���@u���m$lH5N�v����!�v�*���{��w��JF�$2{��S鵾��s�� �#���c�?	�{I���ִ��c��q�S}ז���(�����n�JψwO ��E1��!�� ,�b�?������4"��"�:�wu�j%��8
�U�_$���:5�Π�Wٞ����[I^L(�=i�P\�M�G�9�ݾ��@2!؜�	Y@��s!]5����@Z�t,�����y��HRi���^K�po�A�,�O���L�&��}�B&������w���+d{����$ٝ��\���� �����DŽ���/�7�dZ�����=���MUu��O�6rn���S��۷yͨj�\����2�3�k7��l����0��}�l%ԛ(�����ɞ�0ȨO:+���.Fk�8@�C��,=�]�M�`v���k��r����o�����D�}�~$�����s��
���)�Y�{.�'�#',���B|�{[��m�����u�+=U9�GɐR��}�f�nuID�oN�K�b:�G�����~�@ͅ��w�wO��3�C����sn��i�9��c[��'���_4-�o��V���7��"o��jS\�؇�ˬgĭݵ���:-J���L�%*�/e٧�l.:��;q2m�g�����q\�����z��y�]�Ƅ�r�����r�EEq�}]5I@���u�!w�8�JǪ�.O�lWjr���̫�!A��𾭮�ع��U�ȭv?�h�U\�v�؉�Tߝw�}@݀�䠖�]���R^�Z]t�r�q��]�h��ڙ�j�����H�xM4�ٹ_T����HQ3Ҍ�ۻ��u�=����<W�Hr|��K��qEN�Y\YrF""CH�9W�t<f�ϓ�e�]'UrI�U��vmu�ԉg�X�-=T1��e��	'�\:���h���2�&1O�F+>��-N�5'�H���(t��t�oJ�V�`Q-gdUo@5�ժ<�J����{���(�Do��O��oUc-j�H�$�`���ҁ����D�m�EDYj�"C7����:��x���r>.&'O��H�/��*i9���y"\��G�?"R�И\��e��+1^GKw���(9�w'\I�EF���^%<��ay�Ua
.&�����h�T�0\�DM*�H��yڐW@���l�����t�;�5��z�Uns�ِ2���u.��*�R�a[Z`�2bU[�J��Aĩ��e�b5�!��*q�Wd�*�b�X�+Ga��=\(��+�5WJ#��j'tu��0��н#ɱ
uIڪ�O�L�>�lt�ΨAv�f��\_�(3����N�J��
�x�]nZb�N�@���>;�t�f�h�y���դ	��;Ʌs�����8����ai/<Ͻ�r�{���������z��1ݛdž��x�MR��.d�c�*�Y��z��@���(�m�Wp�.j��3t�8�ꌛ����q�CRe	�k:��R� �F��>J(�aɯ��?���o��{ԣu�񝏴�G�{���8�V�+�8P�l�c97=�m�{s�H��>~�����'/de3�7�8_H,�N����W���^�VN*�U�2}�c�3@gqA,��Np98�l�=1�NMh��q@�ݴE�x#�lZJ��#�d;csg�W�OO��	?gz�Edž��v��鹋
(�1��n|g_�T��Tj���?��P�%\��ոRo�.�1;�-�籁ʋ6�O��k�RBp~���ʪdL��=�����g�y�h���4���'����4ɠ8&ot�91�3b"��K=J0-.�:/q�~;�_k�����_k�w��7��(�~�y
�w�{�q+=�u�9j�����v"w
.n���Ĝ����s��'Q��C,�\^�/�⿔��'��|Q0H��=ӵ�F`���:��l�Z{�ӻ��0B�̣��wq���{4!=M�W�V@�,J��U���p�9����
�s
؍J{�[�?܋C����/��g����O�{RҢ�N��,��:�j7W���?��h��n�O��Y�J:K�������~�����?x������:�՗�5�LN[��H'�}�������/k?���?��D+!3\�uPz��L<�y\�9���8�v�����3���D�8ǛgY�4�o�M�r!7j����K㕱��$G�Jf�����x�[��_Oc�C�'���u�\7�=�snH%�H1�I�=�'O�����@��=|�SP�9�����{���^����ߍ`gW�Х=���;
)��(;[�7�	3,IF�ϵ���=�����?�~����o�F�Bl�u�x9x��{�,)��U\�U� >$�~<��%!��)����5���>�u�=���"޸��	�ސ%�9غ��Ip�h?��w��~�SBN��G�x���~c\ߣ��J�u��0#iu�����C+uPq5�
�vC�52�+���\����o��������l�� �3v����_!�hWN��2h����JA<ׅP.Gk�1v�]�Z�?�\���Ozt�~�'��ǿ�\,ՁN�p�v1^�3�ދו\�Qgb��=�Nj�g�8��{��G!$Ҟ�8ra�.�<Q��c޾��������.U��J-*.7J<�����7͟���2�Մ����Rzmqm³(h��3;o�� ]h�x}dj�.���)���n(Z����s�$�����}�m� M,Em��}(����*/e]@��.C!bƱo��g�CO���Л�D��ڻ�z���o��~�����Ӯ��ʛ��0p����b7��]�6�7�ؾp�����hʓ�o�]� ~Fr�/�R�&��A��M�/�'tnȹ��
|�Z|�滩��H��m��58;M[�Ւ�f��#F�+r�
��&�
q>Od�-7AA�P�U�������0z��*�N���a�wo�Y�0O;o�L�d�+�B���9���R�wY~�trM�r�y�m;)�d ��?�~���E䭷5�].GP1��vd����ƈ��1�c�j�}����-��+�zO�p��g���"�h}��w;�F�sct�(p�ȫd4W��"���Q	��QV�J=��\�]pԓ�v�:�{��z�.
�r��m���H��{�s)$z���Y��m��_���%&��۪v��ۨ���z%��s��q{�)7�z
"�}�D���
1�5J]�P���d#���i,o�s�?�)	���{��A{�Ё��˱�ş^����{��*'H�#��ȧA����(���`��{��.'|K�u-�O�v(�!@�`�RTuIv�d½;n?(�X�$Ѣ�F�!J��KOY튄5S�<0��3\��^VhF�����]��ÍŅ �X�G����/Q�G�s��ޓ����w
�����J�:�Pw_�C����5�s��;~:U8���J�q�G�J�ˎHdDɀhh�{qv��h��v0hw�3��YXS�g2؄Ht:�FC��5��Cg��8���U+(u	�C�>a�3���sݺPеuYZ�����EC��}W?�z�����NO���*�N�TN�֕����E-r�m$�}�h�_8M"��+O�8C��`�p��(�����ڜ�q��+�9Yb���\�i/\�c��7M543�lr�hww}�!�Zg��D�e�U���Uu%)��,��w��j���΃xľt�R�Q��ب,J$2�#�Ǵ�� ��.n:G5p�*fHRk�\-A����'�u(���d:*��"	+&�JV�ؘ]Y�!'/�鄥�t j0�\�J���;��R���EM�Ѯ�"�#m�(�,�͂梺�ԡ��7��Ǘ�S��y���F�kr'�Mq�L� p �.Dw�JR�@/��w��5�s��	�嚥Ў�B���ӌ�J4a'�B��*���-z�����e\s��1l���w��y�أECa��o��pcHﭔ�\�@Z��u�x��ښ[�"��+���H+\�v;Q
�0���QW�F�u �����xbzs�Q�2��x�}�a�f{x�b=�"��-�F�b�8\�gw-�0%�F�	Ѹ���i��r�$�Ə��\Ն���T���0����;us�覽��v�2a�i�����/N�đBf��$�����ᮻ�L{߯����^ϕ��?�Qb�}�{�s�����k��]i�n�@�	2�0i����4���Lu��<�G�#1~������^�V��2�۹�ٗ�?���[9E����~:����*0!?מ�����h�L�~� ��9p�U$�7-��M�iyo��ztV��-��n���u��5z�� �U���U�2�	ˀ�i�_���om����VO�f%�t�+�U��r��A�\郒_�t��A�)sN�N�l��OtL4�xˋ�\�_������+{��g�\�؍@o�}m:����x_[*l\Co��0}^[����2�۾֞����~�3�=�?���ly�Q��+�J��WGP����xy �"u 	�փ)���L�Yx�B�tM��&�܋q�h��'u}^
��p�ˠ���|C�e�Cp�;a��ϫ�C}�yq{����qɕ��z�#4hD�{.�*����fT�"	)54 jzW�������������{I��/�k����9}�+YP�)��a���[����;>���E5pS-��~����{T�t��6}��ю{ϿntW��Ǡ^�lwǂ۠A�t,(��+�����@�-R���������5im���;�����c}��dW��x|�=wm��ZtGW���r�]�>�P�+�[���<�=�M&���+s�b]�t�љ���G�z�_������7��_��uT��4��@e!JzB��/��Lc�
�1U$ q�/��wh���W�w���K�&��z�����ߣF.�u��t�υ�uO�I%�Ao*�x�ls�q�<�7��&b�G���"���<s
Q��g#d$���P
@���|=��� i��_�b״;-ΈPUo(�1k��$5Md:��˦:�b����^��x_�����'���7}�&�ڿ�#�p!�W=���uNF���_�^N��JU���W���cvY�W�16����'Cչ�_s�=��*�q.�jƟ��مT~%�C
e�����t�����r%���P����
]o.������Mo۞����7�9�����o�o']Rq�+��p�@�ܩ�;E[jK��.�'T���V��j~����=�	[�
�bo��'ϠƎH����k����Ǿυ�w��i��hǺ�3���cϙ�����k_�,�yDŽ$�jx,�_WPz[Z�]��m�=�Ay$��AB�a~�=����!#w!��n̗D
s����������1��/�?<3�0'{�o�w��늵��^q,�i�,��/i!/qQ�k�oZ�ҋ,�%�W�`��w/�3��To��X���M��+�3՝��'mHZu!��n$����O��3��~��]�sY���2�0��;�+=��~��ǵ�1�?�~�(5�����H~"�������LjPaZg��������z�;���W��!�� �t���k�?���?ݎ�p<��ՠ(��p�i�����կ>^�[��鹫�ϋ��n��-ۯ����=d���0$�/��>�Yj��螣F$�2�z���2�U���+L�IJ=i�+)=�;�����S@2ɯI�����]�8�W8|�Po�󼿽vM~b�	����?�^�\���{�J=!L����z�d{��C�St/���׹D����'(�׸;��>���jJ\����ƕ�s��}ɻy_�����I���m$=s��\�͒��7���
Z���N1�%7Q
�.���))7�l:J�����vm�*̴�t�vžp~���<���Gq.��e�2O�3D�c��sR��\�R�u7�[F��7�1ib�n�w}�A�`+t�������1��?���Y$�;�)��O����~z;�Ӥ�T�̓M���2�u`�1��6��!����a��x�����a��H��=�%��{$<�a�C�2�j|���?�2j�xBd]���A�ѮQ�_�і�l�<�u��8�b@~����� P�t#�c�T �~b���j����<��#�K��w�P{��}oչIv�E$\����9U��Ns�����"�,��Q�Ż;M���/�x9͗5*0}�ߛ�^r�y�𩚖[P��o�Қ��l�/���gr_�	݉UTFù�f',�G�V�U�W�&���"�m
��o�_�apz�!���HP��#�$��T��ch�S���I��7n�p��f�3!,	��ĝ?���t��Ճ�:I�l�H-,��V��1�f��^�N�K�~�b�ES'�Ü�;GHCr;	�]	KCOd��s%4"\�y����D(���ôy8��H%�(����J�9�)U�*�\'LB�-��4�=$"�k�I}�f��}�b)��B��J�d�5�u��)9o�n4��(	�!��R�_�|qVV��mu���i��|s�����D	R7����V��I�9�&�~�;ֹ��Jq3�̧�rX�0'��@N&������*��j�L�؆J�u�o��tI��@��A��%���2˳�O�v1v��
�vf�k��-Rrv�_�Ӧ��z�b�����h-�|��D㾣A���?8t��t�>�@���G\�c������\�u@\�Nk�NbR׶�Q<i�hG#ed�*��Y�l�bu�y�.�N�*nB�`d�u�9!5�n��us2�`F�\���B
(\$�8G�v�kʻ8�g�$��tJRȮ�7�z�*nO}ov��X{�M����q�R�c���Ln�KX��3r��O.`�`�]�L%'e��HE�]�v�&��Ѥ&M��K��|u�J��bn
��)oC��k�`�X%%$��tz���7�oR���(	&��X�q����Q~ ]D���$��n��7u/��t����W����$�8qg��� M�K�kii�vݼ�u�h���wtҠs�	�[��y�p�T�+\�?�|-Tg����	��W�x���8��V��a?4OBc��qtgv"�Z1��sR�sz|ʵ�3%�R���`7��*.�J�D\���%�IvU|�U侓�g��o��
��MTr.Ue���H�\1i���5,���݃�9�#TʋF&�#��1!OJÜܡ��S�Ŵh�BI;)_}IT�׿+�72�N��y'��vdU��αYI�'����ꊃ?;~��\eA=66��.����j?���;Xc6�sr�aީ�����{q�u�j� �Nv��㿱����;s_��Ǿ}��h��L�%��{��?����~�L��cQc�#;����:�6���ٰQ�~��SbÈ�O�J��N&�
���(P閒�$S��S���hؕ=�U}

e�C#�VU�TF^��J	�BDMvC:P�oH����Ɣ��!奮��00��G��Z����[]�=p�.�}F���te'��{���t���q���أ1~7��4,���XrG���
�R5�UW�.Z{��$�M�����zdP���^�hà��+B=�Yef����&V�,�k�vN��;۫��|��A^M�`.�n�Z�l�
��q^_pV��s9�:�'bTFo�A�����]���F�j���~u�(%��B��F���E3���k�J.J�~�`\I�����
H�֯��t����ɽ�d�]2�jeFu�*vV�WR8D���S��Жt���qs�3�\C�<�ز2��)$��iVR�|��,˸���s�ݹ�v,$�3�J�C8���&u��ʁȄ\���H��s���y�6�}���g��>�w�t�?���q�]�>��v�j{�U�-��H��'������%)�o��Rh�8������SV��׀b�*B.�`�n-Tc���pI'��nЌ}�[���$�뉅�z��,�5.�b�D`�=v����e��'��ޟ&������y��G)F<x�S�ؒ�a����5Ɲ�w���;��?xNХ+��3B
ܥ4K���*j�A=	��W):1�w�C���p'��7I�o*ǪZ�*T���3 R٬��E�WQ�)�F��H�Ꚃ�����@h�y@�烝K�K���t.�E8��<��Bf��C����s�T�&	��}Ӯ���
����=:��6p�H�ߍ�-P���ر�ȽiA|%g�	L$К�٬a���X��1�\�w�u�R��f3λ��������Wt�@f~�[h�8��ٸr��ͣI����>���z#&�?+�1�,�mc�j�@v~c�G0D5(���	���ttMY��&t�(�k�G���A;o�f�8��P�2�W˭p�T"��2�U�'�]��Trpe�+�Q�]Չ��D���r�.	����˗wA��u�I�p�U|G��Ld�]l���Q��}��e�r�i:�Gc�GOu�����8�$�F�XqNȨ�]��m�(�y]����O��Z��X�i:X4�+z���8�	K��dNƫ�v��@*\ҵJv�K�u���m�]�vyWn���9(��2�ҵ�"��+#B�Pe��t�Y�Tғ	���+�iɰ��?`Y���
�+E��%y���ƣ3C���}�
��{A�p��wV��h��Z�g8�C�U�U��s�urS���QΊ;��ñ�`ä̤hJ�WX~���s�&(�6�����WiR\�1u���ؔ@�*
4�	�C�~6�%K��(X�aA9�[9����#V�3�U��µ�v�4!�O�Q��&�f��(��KJe�F������6�|o���N��ѷ�QHHCbR�gͬS��a��5#�8��7��s��ӗx�C�2����:����(�H�Ua�]��VT:q�Ul�Z�9�TK`n�� *S�}�Q����:�V��DL(���i��"�\Sy;x-�+H��r�g-��[�
�x�ƒ�0g�\�n*5�P�����N�� �X�b�U���`�:)�[!>���z^�huYx'��K	�K��j�ˬ
e�FǬd�]/�좛���dd�Ȼ>�T��@��Q���OUbf:a���p�9wj8d}	{Ot`
*$��\v�Q3�%'�j�ʹ�t����C�9l8�����UE��Q�&�MG��� �ѡ�'��8v���6�xn��@�W���+5kGd"mIJc�.�D*i��B*N���4��͖p"��5gݍ݄Pb��p҅�T_h7�q"�V��g�����q�e\h,oѼ�O/
�z%�9}B��!�Jm�F�(���P�#���S��-YaU���<]��Q*�T��.Y6<P1�@᭹�|&�T�
�܄s�5I�j�.w]cg��<�Ƒv��]��NW��2�>���K�Xʿ
�vJ�q�3��
G_��i�����>%W��=��٬̦^���2U��*	N9��	����*����Z0�ڕ�	��p̎{v(�J�8eꮝv�>q����`�=;z���5>{	r���k`t�iO?�.{���ՖU�
-�x�Vԃv�"����m�H�C��,�hH���x���@:��p�%UL*�iA�PU�d�ZJ��ş7B
s�=V�ce�I(Ԭe�!0��$���p�!��-�|M���߹{
܌5M���?$���h��#�U��c-^��=�*M�Ł`2#��C����c�=�o�K
�����-c'�.7�J�_[!��
8�����[%^(i���ThMN�YM]I��u8���U��z�.y�h��w8��_����.��ɿ���P��[ܕ���[f�Ǝ5p��^�i� ԸB����t�5uLhq���F���w�WA�k!�tm�&����c�禃�z	(�����L_�`}��F�8�w����tqh�Lޡ$�-�D]����a��Z\Ø
X�x�9U�<�q-\ٰ�n�W��y(�Lt�L~��#��IX|1:ξ�b�<�9i��5�L��{��w�,������U���5$�����wr�FW��js}�STE#��?����V��qI����4��@�\A��>�L9u�݉����T!�a܂�G?���K�@T�װH�
�I�\L�
��U�S�9@^�!�uu���Py��k�cch����f��<�ܾ�A����>Ѻ�����O��8���._Cs�p�]�Z�0�:�qc��!��m�wM���@,���eٖ�U{ʫ���	85�tO�P����a��R�������L�;/L��P���	q�L_w��JAx����E�M�5Ys�[1���cJ�m��Pb¹?&���F�J�-E. ՠ)#�d�=��=F]m�ΔC�,���qM�J�B�����.�:�j�p�K@WK'���`<ВpV�
8��H�ںUnU��#d��Z���N�r`i�-U�9�h�PT�v"b�֜��ruS�M�]�1i�wV
8$�M�5���XMpRc��S�q�����ol��v�i�K�bkG~q@&�QP��J�N����8h�5�!�BFrS����TW� �l��;�v�@ t,�qq��h7u쫙`�۳n������е������qߧ�cF��	�<�*CO؄oD��L�i��c��;����r�+�cU�|�;����`�U)�eM�����bU�a�к.Y�YCE�ɪ�§}ljb�}JGd(�T՝�K8:Z3m��;%`���.L��p`2J:e�j�pމ3$.$�ޒ�	�wJ��C�����_����D�7Cہ��b�)Qge�
I��%�h��S/����+����IY�$!dŶ.q�d���~����ͩ1p���-�}�����CԂ���Pwc��8┒�\s�r-�Eue ��U$g�g�2�xw�Y��K
L�I��ܺh�\���x�n:��hgu*��ίa!4!���U��	*�Ĵ$+Y�Ԥ�5�u˱�8�k�HG�B����g��9"���üҷs�C�]W����1�v��s���+1���t��G���WL7u�d�S衖�N�ҹ��<I�|Ġ2�>�a
)(������ku�;7�(�A]y��6�a(q��/����{��v�GM��~r�
팔3P��D(�=.֦�#6c!r��纯��%ܜH'��T
r%�<I*�CW�t���$��ќ�=��U���#�4IfB�n�\�(��P=�LM �JF�iTm��x
��o?��nK-�]\IB:��37�d]E���0�څ2G�vfUk4��IU͔bt�8D����R�G�LO�N2@��%I���;���;����B@��΍��\�s��Urk.D��1��݆L9��P���F��=���<+(���뽩(i��
�DO�P�MJ,�{�$ -pڽ*��ZlJ&:����R#�;��WZ���J��p�z%]N��}�->��:��('�M	�j��|�C����4�5Lv�,�;(p_佛{����*l')	�;�y����h0z����V�!Ț��"�X�g
�E#�@r�6�{���T�H�{l|Wh!#�y�ǟ$*;�p�&����߯����*B��4�t��uB.��4�@�3��cQ�A��ya�u�P��gu�)Y�Z�6O�\�'3�[����3�9���׶?�}�/=���{~ &�g��u�] ��x��tV\���5.���B25]h��Ϸ�\譮L�N(����{
z�H���~��ց�4c��|��^�r���x��G!��U\���+�m��+��WԵi_�XB���S>��wf�ԅ�
�H��P����;��־�����y��e������7�x�`�\{�h���y�*	��5�,�nnn����X/i����x�L��߿���7�����_<�S}��ln�������}�K��Ԡ2�D�|�����=��T����Ƨ�O⌫A�@�Mw�9��$C�Ӻ��>��cp=���[�qq8J��ʁ|*l?u�r�͊�L���������48?���?w�u��6e�ۿ;�^ӻڶ�������s�w}4��2�1���|y����=��]�{��s��1,�,���x����k�:;`��V�!�k\�_�&���U��Ƅ�s`-��W��{�"u!���cTFm6.���*dt*[W�py������'��ͪ�����#�N�����Ӯ�ꥸ�_�E���{��=���G)�yqt[�>�2Re��ޕ�������B�c�!�GK�e��{K��I�4�l_Л.����{�zW$a�c�������\�>��	VMrm��\��>��R�<��m�w��಺�\�Z,T���#Q�i�*��[�[7�*ٹ��t�o��V�q�M��P�!��q�����ڟok?�k�m��F�q�E]�?�l7����8 E$�nre�.��~}�� ��/�n� W��|���|޹��`g�����_�X-�ɉWL˙Ȇyh͹��M�(�,U��f��:W��Tݠ�Gp�
����Á�����,u��s�&���r�#�u��(s�fJ�/~�:�0��M��j%���'���:�:�}�Q��]�K9n���i����3���n]�{��A��JK�A�))Z5����
-���@�������n��?kozu�yC�m?�M(떭��2L�%����b1��Al���I��n�S��n�!#��A㥓���Uf���`��t1�K��L]w�6�?�΂�eV:�'QG�N��w=(]�Q��M��x�LT��1Aw�(��Dܧe�3���x��Zδ	�T��r�u#)�"Z�,N�Ta*�3h3$A��LΘ��*C�V`�=�Х�]^�$z�!�N��W��!�(I��Z+�_K������F��������`jq)�[�•ب��
�0�9fZ�.�y4��f����B���4L��2�dl�f@��؍Ny�M��)��eH*��֝f��\U��e����9J��0Ĵ{;���*�i�qo����q�	�Q��*�V5���J�PSG�ǠDB�f��W��ڪ�KZ�.�.���dU�@Y�D�1�
��
.�w@(��HaƬ��ɝ�ј�B��Q�j�Ђ2���Ev�M��l6��I����K�"��r�]�;�};u���RAM+��ۥ��Ό�O�#�ߕ7Ca��f��8�F���(yLs]s*�C�E��\�OIkH���|�1�*7��AR�W"�T�V����:�TI�,ܡ�e���Β�B;~*�{Kd�y�i�^�kAƲ��vrĎS�l�t4!;�`� �n�i�!/��s�B9�j$�lf�ϝ�"	���d)h'������T�	����,vCd	�K�ʤJ.`�y%�����(��&����Jl�q����*��n�2�o�y��?�/V�I���G��LL�|?e��S��k|.�4��~����@�َ�8N{�gclw�3��~������86��ҿ�^m�]�q��z�v_���9��q�9����$!����j��؜�����|>��f��� eYX���OD��%�J�	��R&�U���%V�5��گo�8;��x�y���n>O�G������lk��iR"�|�T��ߏ*%���yLqs����z4�l>Oɽ����Sʍ��~?TI�|���q>�_�1�n��S�<M�N�~�鲻�"��M%a�U���?&������*��1��*�v�9ϧ�_��o?O�ݘ���.�ǿ���b�s��r^��>U�J�u<?z�����hJ� ��y ���i��4v��g>_ț���������{���=�,���s�8����P��@����t#��4��@4��޻�<x!��C�Hz܌���ϫ�̻S�����
du�yR��\G��s㥻U�����O�țU\��3��jE?�_xI�=k�z��������U���e�4��W7c��ʮJܴ�H9OH��:"�瓕:��I���i�d�U߮���,���yУ;�}Lw2��U4�g���Z�쟧�)k������JQ���f{d�F�15b�59��?�����C��<d�1~2y�C��$�߿�y��O��������Er#�A��ڴ��=��G�4�L\��J��ƨZ!�$���ҋ�B��;��".�&�8Ó8��)�s߹pi�VYi�q�VW�R��m��Wp}�|�RX���0Z)J3�ʉXi��)�C=���L��tԈ,��Y�8}#����[%�\����{�h;4A����e	�V	���O�p�h�.0�3ݜ�~�؈��~���*/:Ĩ�i�� U������u�Y��^��^]G	9���}	G����)>�tݗ�򜲿�����J]�<I�/�M�f���eᓘ,��@�}��pF��hN��u)�E-u�%M�E[�kxI�AU��
�]����V�CHF�`]D�Y��b1�	ʐw���f��sUc\s��)4�p�DW���7��`��*z3UR�M	'��9��f}��!T�r�����5��y����?��P�e�%�e��Yِ ԕU�dI���cVZ�e�;���d��'��1[*�k������#��<��=�3��g�;6�߱�+BIj���9�Лh$�]����H=��Y
�"��=�H��[��n���w']	|C�*�hɈ�vI��dDˮ;�����!��mC��U�U�Ҥ��D�Y˳�R�����v��L`��{'��g��q]��Ao�4�W�˂+~_�s7�O`g�&}D�Oq�@h�v�!™d��'ɵ4��OB7�'� )�y/@R�Lz�rsW�Ϝ���$X��iwɻG:��Ae�i@��:��jF���V�σ�\5+?OC��4��›־��'�<�A��Гꥴ��dݚ�w�������<)Ճ�`��C�I�c�r|^@fO�=c�<���nT3B���k~�I�4���s_;�w���tᓄN$z�2?U4��T(T2W~9������s<�a��\��+髏�Ŏ�(ݬ+�t�
��V���
�~W\�:�\�0㊆Óƕ|��s�P$��+ qJ�9q���9_Q=�}w�
��@{%��q�rmW��5ԔU�
�����l�h	�=���+�:�ǵ	�����$�O�My��0Љ����z�J����I�)��ש+�m�莍*�ɨ���-��F���%�;m����� `$��#����d���{�L1���]�@�lԒ:� ���6YZ��ތ�Q�9	�A�C8d���9�2QГ��pno|�i{�؄~�K<�d������GrQv~̿��6���'zp2bx���+A�&G��DK�E?�S?�����p?�/����{���B>ڞ{1���~�=��|�����v�����Ϸ_�����+��7��~G���������쒿۞����#N\�����K�k/�B�2��Ϸ��%I��������
��}���w��/�Ǘ��_|�6aƢ�n��'�~��V��f�C<��ޣ�3�0:���?�_�� ���4�����~���l>�~�A	������Gw�q��ҦI���c���]���;(�9�o����߿���#����'�����=��xjT� F�
���|�;��_��.�3�����q#���NC�Y\G���a����D����1�\F���Ȫ~���J���Z�9�k-�U�gW�u*PD)'/bQ�h�3����J�?J�V�lW�����S}XQN��ε�R��]�f��C�S�B,)�]w0h9!�'}7�x�A�
쌺����g��•�B#�2Gۭt��H�<#o���6��M!1o�6ԡ�6��uI^�GN'�W��x@m�t�Wm���7���P�+.�+��n㬿�,�ƚ����\��mT�t�J%��Ɖ�M���:Y���s�5��+kmڕ�n?�D2fRd:�*5�%Y�y����4%0ͩ6��I��l�W.qDq�=��wM)��	�0�:6�����)�~#
L��T���s�c#���I5I�>N��YTޓk�U����a9&�Hl�I��1��K^6U*ρ*pt/i�87�d�(���[��5B>*����xI��%����O�ݎLI2|nT��tŁN�g�Ω���UW'��4S��t�Q�T����%�(^׹�t!ږ�3�n�+`'nq7O��С�ٝ���&�2�N\���g��W�כ	`�9����vm�I�a&~J��p�i������<���k���}�vg�`h�Rc5>��M=	\%2j��X���ЙV�:�T�\a禺6M:��E':�#;�"YP
O��o]<�QΓܵ���p�]��:@ua7F�FCHL�W(2�炎Dc礸gz}�'_�:_����,���F�N<���֪D��%�ϪJ�)�9�9�Z��7���g��?O�z]U���CR,��+��ʯY�)�8QEY4g��%�@8��g�8P�	\��g�4W�~��P�kUŅ�Έ����䊺�-5�:y]��%��Ia�.޼ ]n%�y����J���({�y*��#�1�<���pq��C��)�������	E�v��]%��(AY�R��7�5vUG����>�'�K�I��&%9���LaJ���%�]}۵���Ea�� 5���(]Ȥ!�kB�:��1I����bz��p�STv@��h]}�8�j�vL�kK�
�x�YM�W�:�
7T�k��ʆTAPюAMSW�^�^P���N�Nnٸ��Jr�cT��&N�e�]F]�V=_���.O���M��Իry�4H���A�=Ĭ�s�����kzj��:�+k�w��Q���ׇ��&���f/��TƬz�K��u�u�ڛ��c9]�x��v%W1p5`��L��%5e�]x���u'��4�
��W���r<W�v(>ڱ���Z�U�>a'9�ܺ8��;O��;�/�p寧rK�e#7��t���(Fs:hi�
]�U'_�+Oױ�;P�1K�*��@�I%h�����W��4!E�2�%������s���?%i	��3�;�[>��>���{(�w��<,�޳��z��GI�Q����������Ŕ_V�)(�t<wm�N��T�9ZK!���$���ڕh�ݼ�`LF��-�Q�G�$�2�Q�N�ց��8&U�e��;���}�J���I�-��d�F�&aEl��~&��}��R�n�v���y$n����3�0T��JD��L��]�ҋqy�)6��\J�0�5U|
��UL�b (�[i-: ��;�j���J��ހY�j�tè�#X"��sHw�~q	7�c� /�U�~���ܺ
��Գq.�+�j�\��s�
c��GNһ���܎�6,uފC��f�T�����]}�z���
�tC�z`��,Z��)�� Dž:�r�`Ƣ"�rI]O7���\]W�����SR��bڕf�1#|�s.U�?�i�ފN>7�*�,0�0t�U@���zI�P�ۡb�{0y�IP�MN*�t�3~���U�1e��Bk�[n��U�X]AY]�nūS��~"!H�W��@eL(�'�<y�zor됖nv~r�+݄�}p���A�vt�k!a�
�Cހ��Ҙ��EM��P��>h!��y���`�4I)�B7�Q�i�q|k�ܒ�Z3�H>�1�S����R�ʲ�ڍ;AY�s�A���n>9���J�.�0��O�1媈G@�à�wͨ�U���$�iw.�÷��r	u1j�J��?��қ�@$G��X/O��f�r�hl����M�'�~V�m�('��{4���ݳ]��.�q^�J|F���X�ܪ�'��t��Ct^��%����t~��$�h�"�e�)���j�0����r(@"�PozW�!L��:K��,�L\��uX�jrI>ru����M�g5N*��-2��3qg�i�T�y&.�S�;#�%l�.V�hT�sV�,�hXȕ
�&��M�5U*�eW/'"�#��Z�xW�q�#WB�]�_EPqx|�
�9�@���sbRw1e~Vb"�3�����X\Y|N_B7)Zܔ&��ƆBs���40y��ܔ�@;�e%Y�ī�3Yn"���Yq��Si�E�� �r���D��p��s�`r�0��"�ݵ�GE�@�D�uX�gt1Q��*�TM����*Y�U9�t��5p�Q�����uW�e��
t��Vw,��	��;5�M�ɴ��ݞv���\~������];��0�����]���Tχ����D׸�+Q����p]�Y;�$:�S+R�-W-��I-�61Gr-�����d�]�\�I������,�b�Ts�Q|ո��uɕ�h����k=6Ik���Ş�����<�)�4�(���%��N���+��uT�r	6�S �/y:�'����EMI4��ӝ߅�N�B��BE9)5,.��g�vB���K'�Ҹ��f�R�h�d��WP,X�N�ܕ����K�Q�QH����i��E�r�O�WwG�qp�Y��U(�s�����yg�;)R�g[��)��@l��Z�sPI�Q��%9Y�\��;��:��)�n���Q�玂;b��#��s)I�����Zz�4<��V$�]lo�#;qJ���7>�DZ���P5Ѩ�.yZ�8���x�v]�{����N�u���5nN�zJ�$�5�D�q?(�EOIl*��|M��5ׂ@ H��D���V����;>p�{o?�����u%hkZ$(aI*9�֚�b�������|�s������P��e^��Gu�Y����O�Ί��J����H5�*L�ѵ���iX��S%.� �A�v𔯢��C�M�\=��z������k,����p{��ԑ&�jS�NRQq~�T��x�^B����!��q,�S>�Α?:�q�S��z�[Z4�IW�l�2�N�H;)ڐ(�����L�q�]�:�8�K�:�y6�ckc*���kM�s�jAG��J
�W'���d�䔌��h_�E2v�1�O�*W0WG�$o�B��j�T3oڹO"z2X�U?�a<�����)�8%)���E�[*cQ�2�U�%�Pi��{	cO�/�!0�f��*�VࠪU�dF��8u`5�r]B�6�r����F�RձsO�q���\.�'
>����A�S��f���?v�����
�b�D/����`��V.�V�fy	���)i�5����vuZH�7p�)�tz
�vd1�ɧ�˵�f�UI��ɳ�||NZ��'�s� ![u)���5��7�F8Ԗf��y�]n�_"o��7�T
�n���>���3�(�W@uy�ӯ Ո��e�g�9G=֬=u��J������!�$&�sש�j9��nc�r���)�bg�&e'8�k2�j�NAc™ء�;c���Yv*!���{P�Uر���aB��8��aU��� PR���ċ��H<.�Tl��.Dqv�5��!��L��S�Ёq\/�\�Z�.�u:��K��!/օs�,3���^��¿���;�����r����ծ8����IEND�B`�themes/light/js/README.md000064400000000507151215013530011031 0ustar00# Scripts
Any extra (funky) Javascript that you want to load along with your
theme should be located here. This could be:

* Special configuration for elFinder under your theme
* Extra JavaScript libraries that your theme depends on
* Javascript hacks to the elFinder markup after the file browser has loaded (not recommended)
themes/light/css/contextmenu.css000064400000002370151215013530013011 0ustar00/* contextmenu.css */
/* **Note** that the context menu is NOT inside the main elfinder div */
/* Context menu wrapper */
.elfinder-contextmenu,
.elfinder-contextmenu-sub,
.elfinder-button-menu {
  font-size: 16px;
  font-family: 'Open Sans', sans-serif;
  background: #fff!important;
  border: 1px solid #b5b5b5!important;
  box-shadow: 0 0 5px #cdcdcd!important;
  border-radius: 0;
  padding: 3px 3px 0 3px;
}

/* Menu item */
.elfinder-contextmenu .elfinder-contextmenu-item,
.elfinder-button-menu .elfinder-button-menu-item {
  margin: 0 0 3px 0;
}

/* Hovered menu item */
.elfinder-contextmenu .elfinder-contextmenu-item:hover,
.elfinder-button-menu .elfinder-button-menu-item:hover  {
  background: #dedddc;
  color: #000;
}

/* Item icon */
.elfinder-contextmenu .elfinder-contextmenu-item .elfinder-contextmenu-icon {
  /* */
}

/* Separator */
.elfinder-contextmenu .elfinder-contextmenu-separator {
  background: #e2e3e4;
  height: 1px;
  margin: 1px;
}

.elfinder-contextmenu .elfinder-button-icon-open + span {
  font-weight: bold;
}

.elfinder .elfinder-contextmenu-item .ui-icon.ui-icon-check {
    margin-top: -9px;
    left: 1px;
}
.elfinder .elfinder-contextmenu-rtl .elfinder-contextmenu-item .ui-icon.ui-icon-check {
    right: -1px;
    left: auto;
}themes/light/css/dialog.css000064400000006410151215013530011676 0ustar00/* dialog.css */
/* Dialog wrapper */
.elfinder .elfinder-dialog {
  /* */
}

/* Dialog title */
.elfinder .elfinder-dialog .ui-dialog-titlebar {
  padding: 3px 0 3px 6px;
  height: 30px;
  box-sizing: border-box;
  background: #dee1e6;
}

/* Close button */
.elfinder .elfinder-dialog .ui-dialog-titlebar-close,
.elfinder .elfinder-dialog .elfinder-titlebar-minimize,
.elfinder .elfinder-dialog .elfinder-titlebar-full{
  background: url('../images/win_10_sprite_icon.png');
  right: 0;
  border-radius: 0;
  margin-top: -13px;
  -webkit-transition: background 0.3s; /* Safari */
  transition: background-image 0.3s;
  height: 29px;
  width: 44px;
}

.elfinder .elfinder-dialog .elfinder-titlebar-minimize{
  background-position: -89px 0px;
}
.elfinder .elfinder-dialog .elfinder-titlebar-minimize:hover{
 background-position: -89px -31px;
}
.elfinder .elfinder-dialog .elfinder-titlebar-full{
 background-position: -45px 0px;
}
.elfinder .elfinder-dialog .elfinder-titlebar-full:hover{
 background-position: -45px -31px;
}
.elfinder .elfinder-dialog .ui-dialog-titlebar-close:hover {
 background-position: 0px -31px !important;
}

.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-button.elfinder-titlebar-button-right {
  left: 1px;
  top: 12px;
}
/* Dialog content */
.elfinder .elfinder-dialog .ui-dialog-content {
  /* */
}

/* Tabs */
/* Tabs wrapper */
.elfinder .elfinder-dialog .ui-tabs-nav {
  /* */
}

/* Normal tab */
.elfinder .elfinder-dialog .ui-tabs-nav .ui-state-default {
  /* */
}

/* Current tab */
.elfinder .elfinder-dialog .ui-tabs-nav .ui-tabs-selected {
  /* */
}

/* Active tab */
.elfinder .elfinder-dialog .ui-tabs-nav li:active {
  /* */
 }
.elfinder .ui-state-active {
	background: #1979CA none repeat scroll 0 0;	
}
/* Icons */
/* Dialog icon (e.g. for error messages) */
.elfinder .elfinder-dialog .elfinder-dialog-icon {
  /* */
}

/* Error icon */
.elfinder .elfinder-dialog .elfinder-dialog-icon-error {
  /* */
}

/* Confirmation icon */
.elfinder .elfinder-dialog .elfinder-dialog-icon-confirm {
  /* */
}

/* Footer */
.elfinder .elfinder-dialog .ui-dialog-buttonpane {
  /* */
}

/* Buttonset (wrapper) */
.elfinder .elfinder-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
  /* */
}

/* Button */
.elfinder .elfinder-dialog .ui-dialog-buttonpane .ui-dialog-buttonset .ui-button {
  /* */
}

/* Styling specific types of dialogs */
/* Error */
.elfinder .elfinder-dialog-error {
  /* */
}

/* Confirm */
.elfinder .elfinder-dialog-confirm {
  /* */
}

/* File editing */
.elfinder .elfinder-dialog .elfinder-file-edit {
  /* */
}

/* File information */
/* Title */
.elfinder .elfinder-dialog .elfinder-info-title {
  /* */
}

/* Table */
.elfinder .elfinder-dialog .elfinder-info-tb {
  /* */
}

/* File upload (including dropbox) */
.elfinder .elfinder-dialog .elfinder-upload-dropbox,
.elfinder .elfinder-dialog .elfinder-upload-dialog-or {
  /* */
}

.elfinder .elfinder-dialog .elfinder-titlebar-minimize .ui-icon.ui-icon-minusthick,
.elfinder .elfinder-dialog .elfinder-titlebar-full .ui-icon.ui-icon-plusthick,
.elfinder .elfinder-dialog .ui-dialog-titlebar-close .ui-icon.ui-icon-closethick,
.elfinder .elfinder-dialog .elfinder-titlebar-full .ui-icon.ui-icon-arrowreturnthick-1-s{ background: inherit; } 

.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-button{ left: -7px; }themes/light/css/theme.css000064400000001733151215013530011544 0ustar00/**
 * elFinder Theme Template
 * @author lokothodida
 */

/* Reset */
@import url('reset.css');

/* Google Fonts */
@import url('//fonts.googleapis.com/css?family=Open+Sans:300');

/* Main features of the whole UI */
@import url('main.css');

/* Icons */
@import url('icons.css');

/* Toolbar (top panel) */
@import url('toolbar.css');

/* Navbar (left panel) */
@import url('navbar.css');

/* Views (List and Thumbnail) */
@import url('view-list.css');
@import url('view-thumbnail.css');

/* Context menu */
@import url('contextmenu.css');

/* (Modal) Dialogs */
@import url('dialog.css');

/* Status Bar */
@import url('statusbar.css');

.ui-widget-content.elfinder-edit-editor{
	width:auto;
}
.std42-dialog .ui-dialog-titlebar .elfinder-titlebar-button.elfinder-titlebar-button-right .ui-icon.ui-icon-closethick {
	display: none;
}
.elfinder-toolbar .elfinder-button-search .ui-icon-close {
    margin: -10px 4px 0 4px;
    width: 17px;
}themes/light/css/statusbar.css000064400000001041151215013530012442 0ustar00/* statusbar.css */
/* Statusbar wrapper */
.elfinder .elfinder-statusbar {
  /* */
}

/* File size */
.elfinder .elfinder-statusbar .elfinder-stat-size {
  /* */
}

/* Current path (breadcrumb trail) */
.elfinder .elfinder-statusbar .elfinder-path {
  /* */
}

/* Breadcrumb in current path */
.elfinder .elfinder-statusbar .elfinder-path a {
  /* */
}

/* Name of selected file(s) */
.elfinder .elfinder-statusbar .elfinder-stat-selected {
  /* */
}

/* Size of current file(s) */
.elfinder .elfinder-statusbar .elfinder-stat-size {
  /* */
}
themes/light/css/reset.css000064400000011415151215013530011562 0ustar00/* reset.css */
/* Comment out/delete the reset rules where appropriate */
*{
	outline:none !important;
}
/* container */
.elfinder,

/* toolbar */

/* navbar */
.elfinder .elfinder-navbar *,

/* current working directory */
.elfinder .elfinder-cwd,
.elfinder .elfinder-cwd table tr td.ui-state-active,
.elfinder .elfinder-cwd table tr td.ui-state-hover,
.elfinder .elfinder-cwd table tr td.ui-state-selected,
.elfinder .elfinder-cwd table thead tr,
.elfinder .elfinder-cwd table tbody tr,
.elfinder .elfinder-cwd-file .ui-state-hover,
.elfinder .elfinder-cwd-file .elfinder-cwd-icon-directory,
.elfinder .elfinder-cwd-file .elfinder-cwd-filename,
.elfinder .elfinder-cwd-file .elfinder-cwd-filename.ui-state-hover,

/* general states */
.elfinder .ui-state-default,
.elfinder .ui-state-active,
.elfinder .ui-state-hover,
.elfinder .ui-selected,

/* ui-widgets (normally for dialogs) */
.elfinder .ui-widget,
.elfinder .ui-widget-content,

/* icons */
.elfinder-button-icon,
.elfinder-navbar-icon,
.elfinder .ui-icon,
.elfinder-cwd-icon-directory,

/* statusbar */
.elfinder .elfinder-statusbar,
.elfinder .elfinder-statusbar *,

/* context menu (outside of elfinder div */
.elfinder-contextmenu,
.elfinder-contextmenu-sub,
.elfinder-contextmenu-item,
.elfinder-contextmenu-separator,
.elfinder-contextmenu .ui-state-hover {
  /*background: none;
  border: none;*/
}
.elfinder .elfinder-toolbar,
.elfinder .elfinder-buttonset,
.elfinder .elfinder-button,
.elfinder .elfinder-toolbar-button-separator,
/*.elfinder .elfinder-toolbar input,*/
.elfinder .elfinder-navbar,
.elfinder .ui-widget-header,
.elfinder-dialog-confirm .ui-icon,
.elfinder-dialog-confirm .ui-widget-content,
.std42-dialog .ui-dialog-titlebar .ui-dialog-titlebar-close:hover .ui-icon {
 background: none;
  border: none;
}

.elfinder-button-search input {
	border-radius: 0 !important;
	height: 24px !important;
	border: 1px solid #ddd !important;
	font-size: 12px;
	font-weight: 100;
	color: #808080;
	padding-left: 10px;
}
.fm-topoption select{
	appearance:none;
	-moz-appearance:none;
	-webkit-appearance:none;
	background:#fff url('../images/selectshape.png');
	background-repeat:no-repeat;
	background-position:right 10px center;
	height: 30px;
	line-height:26px;
    padding: 2px 5px;
}
.ui-widget-header .ui-icon {
	background-image: url("../images/ui-icons_default_theme256x240.png");
}
.elfinder-toolbar .elfinder-button-search .ui-icon-search {
	background-image: url('../images/search-default.svg') !important;
	background-position: inherit;
background-size: 15px;
}
.elfinder-cwd table tr:nth-child(2n+1) {
	background-color: #f9f9f9;
}
.elfinder .elfinder-cwd-wrapper-list .elfinder-cwd-file:hover, .elfinder .elfinder-cwd-wrapper-list .elfinder-cwd-file.ui-state-hover, .elfinder .elfinder-cwd-wrapper-list .elfinder-cwd-file.ui-state-hover:hover {
	background: #f9f9f9 !important;
	border-color: #f9f9f9 !important;
}
.elfinder .elfinder-navbar .elfinder-navbar-dir.ui-state-active {
	background: #f9f9f9 !important;
	border: 1px solid #f9f9f9 !important;
}
.elfinder .elfinder-navbar .elfinder-navbar-dir:hover {
	background: #f9f9f9 !important;
}
.elfinder .elfinder-cwd table thead td {
	padding: 10px 14px;
	padding-right: 25px;
	font-weight: 700;
}
.elfinder .elfinder-cwd table td {
	padding: 7px 12px;
}
.elfinder-navbar-dir {
	padding: 5px 12px;
}
.elfinder .elfinder-cwd table thead td.ui-state-active {
	 background: inherit !important; 
}
.elfinder .elfinder-cwd-wrapper-list table thead tr td:hover {
    background: inherit !important;
}
.elfinder .elfinder-navbar {
	border-right: 1px solid #e5e5e5;
	background: #f9f9f9 !important;
}
.elfinder-cwd-view-list thead td .ui-resizable-handle {
	top: 9px;	
}
div.elfinder-cwd-wrapper-list tr.ui-state-default td span.ui-icon {
	top: 10px;
	right:2px;
}
.elfinder-cwd table {
	padding: 0px;
}
.ui-state-default, thead .ui-widget-content .ui-state-default{
	
}
.ui-widget-header.ui-corner-top thead .ui-corner-all.ui-widget-content .ui-state-default td{
	background:#fff !important;
}
.ui-widget-header.ui-corner-top thead .ui-corner-all.ui-widget-content .ui-state-default:hover{
background:#f2f2f2 !important;
border: 1px solid #ddd !important;
}

#elfinder-wp_file_manager-cwd-thead .ui-state-default.touch-punch.touch-punch-keep-default.ui-sortable .elfinder-cwd-view-th-name span.ui-icon{

}
.elfinder .elfinder-cwd-wrapper-list table thead tr td {
	color: #404040;
}
.elfinder-cwd-wrapper.ui-droppable.elfinder-cwd-wrapper-list.native-droppable .ui-helper-clearfix.elfinder-cwd.ui-selectable.elfinder-cwd-view-list {
	border-top: 1px solid #ddd;
}
.elfinder .elfinder-navbar {
	padding: 3px 10px;
}
.elfinder .elfinder-cwd-wrapper-list table thead tr td:not(:last-child) {
	border-right: none !important;
}
.elfinder .elfinder-navbar .elfinder-navbar-dir {
	color: #404040;
}
.elfinder .elfinder-button-search-menu {
	top: 42px;
}themes/light/css/README.md000064400000004625151215013530011212 0ustar00# Stylesheets
All CSS for your theme will be located here.

The `theme.css` file is the focal point for loading the styles. These could all have been in one file, but have been split up for the sake of more easily structuring and maintaining the codebase.

* **reset.css** : resets background and border of all elfinder elements so that you can skin from scratch without manually positioning the main elements yourself
* **main.css** : main UI elements (wrapper for the main elfinder div, global styles, etc..)
* **icons.css** : icons across the UI (e.g. file associations)
* **toolbar.css** : toolbar at the top of the elfinder container. Contains toolbar buttons and searchbar
* **navbar.css** : directory navigation on the left-hand panel
* **view-list.css** : defines the list view
* **view-thumbnail.css** : defines the thumbnail/tile view
* **contextmenu.css** : context menu shown when right-clicking on in the list/thumbnail view or navbar
* **dialog.css** : information dialogs/modal windows
* **statusbar.css** : footer; contains information about directory and currently selected files

Note that many of the styles have a large degree of selectivity. E.g:

```css
.elfinder .elfinder-navbar .elfinder-navbar-dir.ui-state-active:hover { /* */ }
```

This is to minimize the need for using `!important` flags to override the existing styles (particularly with respect to jQuery UI's CSS).

## Tips
* Use the `reset.css` style to reset the styles that you need to. Comment out selectors that you wish to remain untouched.
* If you need to reset a style outside of `reset.css`, the following normally suffices:

    ```css
      background: none;
      border: none;
    ```
* If you want to change the icons in a particular container, it is best to reset the icon's style from a general selector, then style each individual icon separately. For example:

    ```css
    /* All toolbar icons */
    .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon {
      /* reset the style and set  properties common to all toolbar icons */
    }

    /* mkfile toolbar icon */
    .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-mkfile {
      /* styles specific to the mkfile button (e.g. background-position) */
    }
    ```
* Some styles have their `text-indent` property set to `-9999px` to keep the text out of view. If after styling you can't see the text (and you need to), change the `text-indent` property
themes/light/css/toolbar.css000064400000023366151215013530012112 0ustar00/* toolbar.css */
/* Main toolbar wrapper */
.elfinder .elfinder-toolbar {
	background: #f4f5f7;
	border-bottom: 1px solid #ddd;
	padding-left: 10px;
}
/* Buttonset wrapper */
.elfinder .elfinder-toolbar .elfinder-buttonset {
  /* */
}
/* Buttonset wrapper for search field */
.elfinder .elfinder-button-search .elfinder-button-menu {
  background: #fff !important;
}
/* Buttons */
.elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button {
  border: 1px solid #ddd;
  webkit-transition: background 0.3s, border 0.3s; /* Safari */
  transition: background 0.3s, border 0.3s;
  background: #fff;
}
/* Hovered buttons */
.elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button:hover {
  background: #cce8ff;
  border: 1px solid #99d1ff;
}
/* Hovered buttons in search field */
.elfinder .elfinder-button-search .elfinder-button-menu .ui-button:hover {
 
}
/* Disabled buttons */
.elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button.ui-state-disabled {
  /* */
}
/* Buttonset separator */
.elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-toolbar-button-separator {
  /* */
}
/* Button icons */
.elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon {
  /* */
}
/* Searchbar */
.elfinder-toolbar .elfinder-button-search {
  /* */
  margin-right: 5px;
  border-radius: 0;
}
/* Searchbar icons (search and close) */
.elfinder-toolbar .elfinder-button-search .ui-icon {
  /* */
}
.elfinder-toolbar .elfinder-button-search .ui-icon-search {
  /* */
   background-image: url('../images/16px/search.png');
}
.elfinder-toolbar .elfinder-button-search .ui-icon-close {
  /* */
}
/* Commands */
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon {
    background-color: transparent;
    background-position: center center;
    height: 16px;
    width: 16px;
  }
  /* Back */
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-back {
    background-image: url('../images/16px/back.svg');
	background-size:16px;
  }
  /* Forward */
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-forward {
    background-image: url('../images/16px/forward.svg');
	background-size:16px;
  }
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-reload {
    background-image: url('../images/16px/reload.png');
  }
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-netmount {
    background-image: url('../images/16px/netmount.svg');
	background-size:16px;
  }
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-home {
    background-image: url('../images/16px/home.png');
  }
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-up {
    background-image: url('../images/16px/up.svg');
background-size:12px;
  }
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-mkdir {
    background-image: url('../images/16px/add_folder.svg');
	background-size:16px;
  }
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-mkfile {
    background-image: url('../images/16px/add_file.svg');
	background-size:13px;
  }
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-upload {
    background-image: url('../images/16px/upload.svg');
	background-size:15px;
  }
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-open {
    background-image: url('../images/16px/open.svg');
	background-size:16px;
  }
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-download {
    background-image: url('../images/16px/download.svg');
	background-size:16px;
  }
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-getfile {
    background-image: url('../images/16px/getfile.svg');
	background-size:16px;
  }
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-info {
    background-image: url('../images/16px/info.svg');
	background-size:16px;
  }
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-quicklook {
    background-image: url('../images/16px/preview.svg');
	background-size:16px;
  }

  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-copy {
    background-image: url('../images/16px/copy.svg');
	background-size:16px;
  }
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-cut {
    background-image: url('../images/16px/cut.svg');
	background-size:16px;
  }
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-paste {
    background-image: url('../images/16px/paste.svg');
	background-size:14px;
  }
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-view {
    background-image: url('../images/16px/view.svg');
	background-size:16px;
  }
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-view-list {
    background-image: url('../images/16px/view-list.svg');
	background-size:16px;
  }
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-help {
    background-image: url('../images/16px/help.svg');
	background-size:16px;
  }
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-duplicate {
    background-image: url('../images/16px/duplicate.svg');
	background-size:14px;
  }
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-rm {
    background-image: url('../images/16px/rm.svg');
	background-size:16px;
  }
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-edit {
    background-image: url('../images/16px/edit.svg');
	background-size:16px;
  }
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-rename {
    background-image: url('../images/16px/rename.svg');
	background-size:16px;
  }
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-archive {
    background-image: url('../images/16px/archive.svg');
	background-size:16px;
  }
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-resize {
    background-image: url('../images/16px/resize.svg');
	background-size:16px;
  }
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-extract {
    background-image: url('../images/16px/extract.svg');
	background-size:16px;
  }
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-sort {
    background-image: url('../images/16px/sort.svg');
	background-size:16px;
  } 
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-undo {
    background-image: url('../images/16px/undo.svg');
	background-size:16px;
  } 
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-redo {
    background-image: url('../images/16px/redo.svg');
	background-size:16px;
  }  
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-selectall {
    background-image: url('../images/16px/select_all.svg');
	background-size:16px;
  }  
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-selectnone {
    background-image: url('../images/16px/deselect_all.svg');
	background-size:16px;
  }  
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-selectinvert {
    background-image: url('../images/16px/invert_selection.svg');
	background-size:16px;
  }  
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-icon-empty {
    background-image: url('../images/16px/clear_folder.svg');
	background-size:16px;
  }
  .elfinder-cwd-view-list td .elfinder-cwd-icon.elfinder-cwd-icon-x-php{
	  background-image: url('../images/16px/php_file.svg');
	  background-size:16px;
	  background-position: center center;
  }
  .elfinder-cwd-view-list td .elfinder-cwd-icon.elfinder-cwd-icon-plain{
	  background-image: url('../images/16px/text_file.svg');
	  background-size:13px;
	  background-position: center center;
  }
  .elfinder-cwd-view-list td .elfinder-cwd-icon.elfinder-cwd-icon-html{
	  background-image: url('../images/16px/html_file.svg');
	  background-size:16px;
	  background-position: center center;
  }
  .elfinder-cwd-view-list td .elfinder-cwd-icon.elfinder-cwd-icon-zip{
	  background-image: url('../images/16px/archive.svg');
	  background-size:16px;
	  background-position: center center;
  }
  .elfinder-cwd-view-list td .elfinder-cwd-icon.elfinder-cwd-icon-pdf{
	   background-image: url('../images/16px/pdf.svg');
	  background-size:12px;
	  background-position: center center;
  }
  .elfinder .elfinder-cwd-wrapper-list .elfinder-cwd-file .elfinder-cwd-icon.elfinder-cwd-icon-x-pascal{
	   background-image: url('../images/16px/text_file.svg');
	  background-size:13px;
	  background-position: center center;
  }
  
  /* Menus (e.g. for sorting) */
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-menu {
    /* */
  }
  /* Menu items */
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-menu-item {
    /* */
  }
  /* Selected items */
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-menu-item-selected {
    /* */
  }
  /* Hovered items */
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-menu-item.ui-state-hover {
    /* */
  }
  /* Menu item sorting ascending icon */
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-menu-item-selected.elfinder-menu-item-sort-asc .elfinder-menu-item-sort-dir {
    /* */
  }
  /* Menu item sorting descending icon */
  .elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-menu-item-selected.elfinder-menu-item-sort-desc .elfinder-menu-item-sort-dir {
    /* */
  }
  .elfinder-toolbar .elfinder-button-search .ui-icon-close {
    background-image: url(../images/close.png);
    background-position: center;
    background-size: 57px;
    background-repeat: no-repeat;
}themes/light/css/view-list.css000064400000005466151215013530012374 0ustar00/* view-list.css */
/* Wrapper for list view */
.elfinder .elfinder-cwd-wrapper-list {
  /* */
}

/* List view table */
.elfinder .elfinder-cwd-wrapper-list table {
  /* */
}

/* Column headings */
.elfinder .elfinder-cwd-wrapper-list table thead tr td {
  color: #43536a;
}

.elfinder .elfinder-cwd-wrapper-list table thead tr td:not(:last-child) {
  border-right: 1px solid #e5e5e5;
}

/* Hovered column heading */
.elfinder .elfinder-cwd-wrapper-list table thead tr td.ui-state-hover,
.elfinder .elfinder-cwd-wrapper-list table thead tr td:hover {
  background: #d0dded;
}

/* Actively sorted column heading */
.elfinder .elfinder-cwd-wrapper-list table thead tr td.ui-state-active {
  border-right: 1px solid #e5e5e5;
}

/* Table heading icons (mainly the sorter) */
.elfinder .elfinder-cwd-wrapper-list table tr td .ui-icon {
  /* */
}

/* Table heading sorter up */
.elfinder .elfinder-cwd-wrapper-list table tr.ui-state-default td .ui-icon-triangle-1-n:before {
  /* */
}

/* Table heading sorter down */
.elfinder .elfinder-cwd-wrapper-list table tr.ui-state-default td .ui-icon-triangle-1-s:before {
  /* */
}

/* Files */
/* File */
.elfinder .elfinder-cwd-wrapper-list .elfinder-cwd-file td {
  border: 1px solid transparent;
}

.elfinder .elfinder-cwd-wrapper-list .elfinder-cwd-file td:not(:first-child) {
  color: #9d9d9d;
}

/* Filename */
.elfinder .elfinder-cwd-wrapper-list .elfinder-cwd-file .elfinder-cwd-filename {
  /* */
}

/* Hovered file */

.elfinder .elfinder-cwd-wrapper-list .elfinder-cwd-file:hover,
.elfinder .elfinder-cwd-wrapper-list .elfinder-cwd-file.ui-state-hover,          /* fix for 2.x */
.elfinder .elfinder-cwd-wrapper-list .elfinder-cwd-file.ui-state-hover:hover {   /* fix for 2.1 */
  background: #e5f3ff;
  border-color: #e5f3ff;
}

/* Selected file */
.elfinder .elfinder-cwd-wrapper-list .elfinder-cwd-file.ui-selected {
  background: #cce8ff;
}

.elfinder .elfinder-cwd-wrapper-list .elfinder-cwd-file.ui-selected td {
  border-top: 1px solid #99d1ff;
  border-bottom: 1px solid #99d1ff;
  color : #fff;
}

.elfinder .elfinder-cwd-wrapper-list .elfinder-cwd-file.ui-selected td:first-child {
  border-left: 1px solid #99d1ff;
}

.elfinder .elfinder-cwd-wrapper-list .elfinder-cwd-file.ui-selected td:last-child {
  border-right: 1px solid #99d1ff;
}

/* Icons */
.elfinder .elfinder-cwd-wrapper-list .elfinder-cwd-file .elfinder-cwd-icon {
  /* */
}
.elfinder .elfinder-cwd-icon.elfinder-cwd-icon-vnd-openxmlformats-officedocument-wordprocessingml-document {
  background: url(../images/16px/text_file.svg) !important;
  background-position: 2px 130px;
  background: no-repeat;
  background-size: 38px !important;
  background-repeat: no-repeat !important;
}
.elfinder-cwd-wrapper-list .elfinder-cwd-icon.elfinder-cwd-icon-vnd-openxmlformats-officedocument-wordprocessingml-document{
  background-size: 13px !important;
}themes/light/css/main.css000064400000001571151215013530011366 0ustar00/* main.css */
/* Container div for elFinder */
.elfinder,
.elfinder .elfinder-dialog,
.elfinder .elfinder-toolbar .elfinder-buttonset .elfinder-button-menu {
  background: #fff;
  border: 1px solid #ddd;
  box-shadow: 0 0 5px #cdcdcd;
  border-radius: 0;
}

/* Override styles in child elements of elFinder div */
/* Use for consistently setting text sizes and overriding general jQuery UI styles */
.elfinder * {
  font-family: 'Open Sans', sans-serif;
}

/* Resizer */
/* Used if elFinder is resizable and on dialogs */
.elfinder .ui-icon-gripsmall-diagonal-se,
.elfinder-dialog .ui-icon-gripsmall-diagonal-se {
  /* */
}
.elfinder-button-icon.elfinder-button-icon-fullscreen {
	background: url(../images/16px/fullscreen.svg);
	background-repeat:no-repeat;
background-size: 16px;
}
.elfinder-cwd-view-list td .elfinder-cwd-icon {
	background-image: url(../images/icons-small_new.png);
}themes/light/css/navbar.css000064400000003470151215013530011713 0ustar00/* navbar.css */
/* Main wrapper for navbar */
.elfinder .elfinder-navbar {
  border-right: 1px solid #e5e5e5;
}

/* Directories */
.elfinder .elfinder-navbar .elfinder-navbar-dir {
  color: #000;
  border-radius: 0;
}

/* Hovered directory  */
.elfinder .elfinder-navbar .elfinder-navbar-dir:hover {
  background: #e5f3ff;
}

/* Current/active directory (cwd) */
.elfinder .elfinder-navbar .elfinder-navbar-dir.ui-state-active {
  background: #cce8ff;
  border: 1px solid #99d1ff;
}

/* Howvered cwd */
.elfinder .elfinder-navbar .elfinder-navbar-dir.ui-state-active:hover {
  /* */
}

/* Icons */
/* Arrow */
.elfinder .elfinder-navbar .elfinder-navbar-arrow {
  /* */
    background-image: url('../images/16px/arrow_right.svg');
  background-position: center center;
  background-repeat: no-repeat;  
}

/* Expanded directory arrow */
.elfinder .elfinder-navbar-expanded .elfinder-navbar-arrow {
  /* */
  background-image: url('../images/16px/arrow_down.svg');
  background-position: center center;
  background-repeat: no-repeat;
}

/* All icons (directories) */
.elfinder .elfinder-navbar .elfinder-navbar-icon {
  background-color: transparent;
  background-image: url('../images/16px/directory.svg') !important;
  background-position: center center;
  background-repeat: none;
  height: 16px;
  width: 16px;
background-size:16px;
}
/* Expanded directory */
.elfinder .elfinder-navbar-expanded.ui-state-active .elfinder-navbar-icon {
	  background-image: url('../images/16px/directory_opened.svg') !important;
background-size:16px;
}
/* Root/volume */
.elfinder .elfinder-navbar-root > .elfinder-navbar-icon {
  /* */
}

/* Root/volume expanded */
.elfinder .elfinder-navbar-root.elfinder-navbar-expanded  > .elfinder-navbar-icon {
  /* */
}

/* Resizable handle */
.elfinder .elfinder-navbar .ui-resizable-handle.ui-resizable-e {
  /* */
}
themes/light/css/view-thumbnail.css000064400000004331151215013530013372 0ustar00/* view-thumbnail.css */
/* Wrapper for thumbnail view */
.elfinder .elfinder-cwd-view-icons {
}

/* File wrapper */
.elfinder .elfinder-cwd-view-icons .elfinder-cwd-file {
  border: 1px solid transparent;
  border-radius: 0;
}

/* Hovered file */
.elfinder .elfinder-cwd-view-icons .elfinder-cwd-file.ui-state-hover {
  background: #e5f3ff;
}

/* Selected file */
.elfinder .elfinder-cwd-view-icons .elfinder-cwd-file.ui-selected {
  background: #cce8ff;
  border: 1px solid #99d1ff;
}

/* File icon */
.elfinder .elfinder-cwd-view-icons .elfinder-cwd-file .elfinder-cwd-icon {
}

.elfinder .elfinder-cwd-view-icons .elfinder-cwd-file .elfinder-cwd-icon-directory,
.elfinder .elfinder-dialog .elfinder-cwd-icon-directory {
  background-color: transparent;
  background-image: url('../images/48px/directory.svg') !important;
  background-position: center center;
  height: 48px;
  width: 48px;
  background-size:48px;
}
.elfinder .elfinder-cwd-view-icons .elfinder-cwd-file .elfinder-cwd-icon.elfinder-cwd-icon-pdf{
	   background-image: url('../images/48px/pdf.svg');
	  background-size:36px;
	  background-position: center center;
  }
  .elfinder .elfinder-cwd-view-icons .elfinder-cwd-file .elfinder-cwd-icon.elfinder-cwd-icon-x-php{
	   background-image: url('../images/48px/php_file.svg');
	  background-size:44px;
	  background-position: center center;
  }
  .elfinder .elfinder-cwd-view-icons .elfinder-cwd-file .elfinder-cwd-icon.elfinder-cwd-icon-html{
	  background-image: url('../images/48px/html_file.svg');
	  background-size:40px;
	  background-position: center center;
  }
  .elfinder .elfinder-cwd-view-icons .elfinder-cwd-file .elfinder-cwd-icon.elfinder-cwd-icon-plain{
	  background-image: url('../images/48px/text_file.svg');
	  background-size:40px;
	  background-position: center center;
  }
  .elfinder .elfinder-cwd-view-icons .elfinder-cwd-file .elfinder-cwd-icon.elfinder-cwd-icon-x-pascal{
	  background-image: url('../images/48px/text_file.svg');
	  background-size:40px;
	  background-position: center center;
  }
/* File name */
.elfinder .elfinder-cwd-view-icons .elfinder-cwd-file .elfinder-cwd-filename {
}
.elfinder .ui-state-active .ui-button-text {
	color: #fff;
}themes/light/css/icons.css000064400000004137151215013530011556 0ustar00/* icons.css */

/* These are shown thoughought the UI, not just in the list/thumbnail view */
/* General icon settings (in main view panel) */
.elfinder-cwd-icon {
  /* */
}

/* If you are using CSS sprites for your icons, set the background position
   in each of the below styles */
/* Directory */
.elfinder-cwd-icon-directory {
  background-color: transparent;
  background-image: url('../images/16px/directory.svg') !important;
  background-position: center center;
  height: 16px;
  width: 16px;
background-size: 16px;
}

/* Empty file */
.elfinder-cwd-icon-x-empty,
.elfinder-cwd-icon-inode {
  /* */
}

/* (Rich) Text */
.elfinder-cwd-icon-text,
.elfinder-cwd-icon-rtf,
.elfinder-cwd-icon-rtfd {
  /* */
}

/* PDF */
.elfinder-cwd-icon-pdf {
  /* */
}

/* Microsoft Word */
.elfinder-cwd-icon-vnd-ms-word {
  /* */
}

/* Microsoft PowerPoint */
.elfinder-cwd-icon-vnd-ms-powerpoint {
  /* */
}

/* Microsoft Excel */
.elfinder-cwd-icon-ms-excel,
.elfinder-cwd-icon-vnd-ms-excel,
.elfinder-cwd-icon-vnd-ms-excel-addin-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-excel-sheet-binary-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-excel-sheet-macroEnabled-12,
.elfinder-cwd-icon-vnd-ms-excel-template-macroEnabled-12 {
  /* */
}

/* Audio */
.elfinder-cwd-icon-audio {
  /* */
}

/* Video */
.elfinder-cwd-icon-video,
.elfinder-cwd-icon-flash-video {
  /* */
}

/* Archives */
.elfinder-cwd-icon-zip,
.elfinder-cwd-icon-x-zip,
.elfinder-cwd-icon-x-xz,
.elfinder-cwd-icon-x-7z-compressed,
.elfinder-cwd-icon-x-gzip,
.elfinder-cwd-icon-x-tar,
.elfinder-cwd-icon-x-bzip,
.elfinder-cwd-icon-x-bzip2,
.elfinder-cwd-icon-x-rar {
  /* */
}

/* Code/Scripts */
.elfinder-cwd-icon-javascript,
.elfinder-cwd-icon-x-javascript,
.elfinder-cwd-icon-x-perl,
.elfinder-cwd-icon-x-python,
.elfinder-cwd-icon-x-ruby,
.elfinder-cwd-icon-x-sh,
.elfinder-cwd-icon-x-shellscript,
.elfinder-cwd-icon-x-c,
.elfinder-cwd-icon-x-csrc,
.elfinder-cwd-icon-x-chdr,
.elfinder-cwd-icon-x-c--,
.elfinder-cwd-icon-x-c--src,
.elfinder-cwd-icon-x-c--hdr,
.elfinder-cwd-icon-x-java,
.elfinder-cwd-icon-x-java-source,
.elfinder-cwd-icon-x-php,
.elfinder-cwd-icon-xml {
  /* */
}
themes/light/images/close-hover.png000064400000000527151215013530013341 0ustar00�PNG


IHDR->`�7bKGD�������	pHYs���o�dtIME�
,R�8tEXtCommentCreated with GIMPW��IDATX��ׯB!��[(l�
��O`�Ql&��@'�(6O����{��a��|�?�7v8��ݽ0X60�f4���ߢR�0��/��J�/t���"\
�,�d�}���_��<_ֵn�%�2���K��a��I�p�ƻC�.]��\�*�f�����}�����#�C?h~{0�ьf4��G���T���vIEND�B`�themes/light/images/toolbar-lokhal.png000064400000053311151215013530014024 0ustar00�PNG


IHDR0)���tEXtSoftwareAdobe ImageReadyq�e<&iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CC 2014 (Windows)" xmpMM:InstanceID="xmp.iid:EB8734E9210B11E8B445808E6617CCE5" xmpMM:DocumentID="xmp.did:EB8734EA210B11E8B445808E6617CCE5"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:EB8734E7210B11E8B445808E6617CCE5" stRef:documentID="xmp.did:EB8734E8210B11E8B445808E6617CCE5"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>^�DS9IDATx��`UE�8~ny%y/=!=!	�c���`W�]WA��.v�T�յ�
E��ҥ ��{��9s_M#��~���ɽ��9gδ3�93�@'�P�q:᳨��\��/υ	�bu.hxt
��L��9{v�������V��޸|[�^C8xh�/;f�L�Aߑ�+�<�������lM:o|68`r���m�쌌D`�|�wu���
�@�ӮkGA&��fg˖)}z�@�Bh���#�x(�E�i�f08곃( �N31��77n�ү_O`9�
g!:k8
����ۈ1c�ʥ^�0�����._��E����G��9�3Dz4`Y!��מ1����<��;�|s�sX8�W4�����S4�=�������Ɲ��V�7�w0�mW��$����ULM�i8��e�<�G!!�}�8�Iv��p��d��x�0r��\H��zy�%qhܶ�@v�9R�@Ƞ��J��
���{�q0n;� r,�N�A��
��N��~�W�{��q�!pJnѳ,G��h ���8�|�˾���m[��'@I�K�3�$����$�M��ʀ�\���XX��6�VX_)�@��bZ>
d$�!/.f��J��V,��Ŭ�_q��Ia��H$|��jd����n�S�%�%��P�>�I؎�R�<�]t:���M2�TF�F��S`���Z)�C\\H���9\lkq�MnA�}/���h�Kt��|Pd�>�ktj>oq��q*Ȳ��`'��z�`P��)��&����I���R��*I]�ȡ@�8�g���H;�B����x�Ge ���
V{�I�R��;I�K��@�GD�;8����$ϨZ�����FRH,^I�E��Rg<�?uD�'�i�<	��*���7?xCJx�"�Q}�3�A@S8�^^@�hƟ��ҟIL�0φ��@zl0�� ��	e���^�����a6���U
���W^o4�N���{��a�'f�|K�SE��
�_hPg
���V�R&ͳ���)��o�V/�V�#Ur`���G���<(f5@u�|d��.	܂v��T�I�,�V�%��,�5�g(�$��)&��ٱP�"u��!�����\�c)Y��/Y2zD��B�[�O���Ki\�I1`q(��Nm�;r]�z�fAH� �Mvw\ c�S����'#9�N�����j��-����W�a��7YU0���N3�$���gN����ꐻ��,I����J ��;��o�)ݹ��Ϙ����=�ت�����o��v�$f��|���{��8\��/�	��J�1n>&�~�X-+�*I"ݝ��eɡ��PW��9��'�`b�?�V��i�� ���O?=[�B�ٓ}��z�B��`wI��򆘨�"{
����=[��`2�lM��No�Gd��c�3(�N��������G�>`o0n�,(��s�=��O�7��M�}��N�t�a乵��Q�YmBm�qFr��i-�q�L�u?�ox_�)�J?n��f9}$_UO|`������'�:��i�:SH���t��"{����f�)=���W/x����jT�o���0=<1.]o��ԝ8}Ft���>"�1����٣�c���� }ա]V���3���"V�9KG}�߉�M�yYO�-D�]X����j�U�
a�A��CJ������JN�gS"��:l���m��V��v�~��?�
;nro^�?�Q�.��ڛa~Hx�B|�V5<2�{���7�ܹ�d���w���7s„��D�ӎݷr��xVVV������
��
�⌉�>����{.�Y��^={�*..>�-##��kKI?�3̽ii�
JJ�cjSǏ��KKK���YB@�Q�T5+�T|V%�NtHBrt������ʰ���o쿬��ޭ���q�vV�^�����h���Z��L`#�PPP����@�롱��S��tȕik#Z�Lh�wtIR�o>�����O� *�	׍��_��͓>w)��܇�`^K�Z�:�z"��Q��4�w����_?�Z��z+��+ǡ�%�G 3��h���P1���?�[B�l̽�u�>�����������2��K��0Y�]5^�Ԡ�|Cm]�u�����
��_ ,z6����()ZG`+@��i=�:��sO���y�>�}�����L�E9D�~��Q�Z�%��|��8��G&WU�,H*�:\�Sx��d��v���#�d{ыD���.B��`T�h�[6�D�mNx�����r��J�c�%=Bc6���a��_`�76��=gߟi�ks	f�K�[������7Q��7'��"��eetj�!����>�;���4S�/�B\hH<��)ÆJ��<IȾn���D��S*i���I��n�
�J�,�"��EbTQa��MMmR��i�qh�b�Y�o����P��/�rE�Mp4����)Pj\��g�YN���
8Ə�
7��ÌF����E�Z}�H��U5�f2��]�0~U�?n)�=#��]o�Clt4ܷ�����z�NO��S��U
g&�!ݾ�R��=u��#L!&|��WL�6��a���S�">N�����,�_Qs��&�0">*��G�G�!����t�/��Y���1h���^����4��I��p%��c�i�G�{��=�K�X�G�J�{���F�n>$k6������|՞����e��!nz��c�
�� ��ѱ�Q�ZI.�mung�V�Ʌiw�� ���c��
����|�D�&R:����I��1����׋c��|�V@�Ј�y!�ٌ��Jkҫ�2�_�:_�M��r��={��R�Y;<�nK3m�z}�:c&I�$X3�V�[7� G+@�����2�{���'SV�3��v�$O��7�м�Y�W���a=���D���%QX�f�5��B�1�}�۲�%*�Vx�HE��Xiv�W��Q�f��%��3|T�I��͠�ָxˆ�e��1V>����fu���p'�Y�u ��	���>��YUe��n�/+I�}��GLd�-l�~�ݻݗ-F�f�Bth[���U��\\�6�
� ��K(�g��~d�(Yv�ԉ#�!��gE{%g\ 9I�-K�� u�V_m8N��{F��-���>����Ή���囯",T���p��_���
rS1X�	�YA*�J�D�}��k�7��“.܏6Vހ3�D�S�<!&��Q�MY�琢d(̉F�޽
I���KN0KV��M��m�P�/��|��*��P�μ�=�N�R�,p�DY�I,#��!Z��<A�ė�{=�[Ӽ��<W<���K	��0�$���s;i��_j�),��7"��D�ȶ�y2�f��v�����g��l*����E7f'fW7	`2r��T]N�)�jβi)h�y}�<�E7
K�.�qz������f5T�ȯ�)0�.��_��$/�itFvQ�˗��%��U��B�4g�S�85m6 �ˠ��Z���9�QzH�r�UD�u?��8�	t�&�IS(i�:�	Rp\���y��,�n���-2DYػ�TN照�l�yX�t��~�7��C�Ku�YE����]������Z��Os�0A�}�w���#��Nܟ�o܈�j�x�/��9����%9翳��7�W!^nE�Fް�$���	O�Mx���y�KDf#�@�Ѯ!-�Z�Ra��ΐ���mw)�÷�jsdQY��%���ܵ���u�d��߫��*z#�-)Dk��q:�.�2�%��?���9�
�%��.̳ȴ˶�eMĽ��v����#��	#l����N2���ڒN�4�~ȭ�qI�rG���9˶�� G��-�,�����Q���7��nM/"O5vX���
;w�q��r�],AՈ�x�9vYZ�{��ϻe�^���}H���c7���Ԕ	O�UeWك����XY;Oe��EX����Wo�gS�<"9.�5$"����T5�ca��b�kZD�;����‚��1��ڑ���5�ٿ���Pm�*+�W^��y�n���<=���}��ю��F��`e���O��ܔ����p�[4o|Fv�U�]�����I��
F�I!�!"~:Q��*�����羆�S��إWm;�L&��nj�AB�	~=��y߬�g��������?�=$�$U"ߊ�&�����jt�#Ã�3�����n�ya"v^����;��D����p+�}^Q�C�A%����Ք��D�|=���~w���I0���Y�����m�8v�9�s�QSF�����IOOc�=�`�őL�y<����^����S�3
�{%��f��*�9���<��%32�M3��z.�a�C�
v���"�$u/�230�ӣ�F�j���%�f�4��SB�.�ՀN>�J@�zh�Y�2:�<��p3���Ȗd�_���P》R��mv7�>^)j�W�Y�z�S�Y�?ޔew�pq�9�O�R)���T3gjr�A�(��2�I�Uv�:%�ڋ�^�NY�c��~1ٍ7�9���~=�a�(N�lj��FW���زbNo��޵�|�$��/�� ���޾A0
�>�_���n(hrX?�k�.�������� ��a��ְ��6��.o]�M��jv��O�ͩ�ɽ#�L�Q]��t��[pg_:"#��Q�"I��_�#*�./��r/H�0N�3���PjN��|��I��Eb��ED"P|�� �)����7�2�	�Ԡ0��Ƅ'�Aǔ�-B����EJ�A��0J�
L��]XT9�C��*c��NM�s5�lQ���#U
�]ێ7�X��d4p�ɖ�9WL� ��������,,D�խ(��3E������'a�R���������d���\�գWl\d��l%
����U՟:QQw��!cY<�(���b�nI�s��ʌ:F��}\�j���A��찺�v��?��{��a�|u
+�)�Rt\��%ׯbi��o_?����V�T{D� �舨h^h����+��&#D���*@]�N��¨�iAt���UaXl��H�V����h��I%�J���mG�A�8�ࣷ�'y�I
���#�1n;NEd)�7>;IU� PH��.�4N#Q��F��O]�u+��xp=�pm#˔����7_�L���:(��r�'m�B��1�T?�*s�Y�34�H�wn�8U��Xt9T�ꎢR�HU����B�I*�x��(5���w?A���)ŏ��y>x�x�~��Cpr_�T�vߩ������D��0�e�JJ�/��ޫI-��o;�np
����Fㄫ�c�M������a���_Z_��0�N!Uoܱ��|5��ױ�tuu�D^f��Ե�F���[��z����x6�t�㶧@Q��AW0n;FEb����j#�c�v�	H@WA�7@]C#��!C��G$���F�t;d(�����RU&.�#/鐉��.:�0�FK�����H]������(�S
�l�~��B��T.�'A"��֪w B�#b/��>�d��a����ݢ�}a�4*�+��ד�<Q���h�Z���h�嬈@\9{�D�!m���qg�k3�Q�L�������F�<e���z���
�@&����tt$��x�ᆏIu�Q<߼x�,*��BrӖ�����I�h�B���s:>�+���gt���]��)}�d�SU�4�ם��������oO2�_=�l��Lz�>&.�O'	v2����J�����߻�A��pé>���Dg�S?K�4��B�Ϙ�V�
�/��I!oGجOu��T�����0*���y+i@i	1��D��k��H;���R��w���
XջPE��	}���Ȱ:m-����3$�'n�B�$����`/%����g��^��+�O��ڎ�_��B��]Q�T�$�,x��;���V�z�-KlG����;�Q7�J����t�y�()�C?]�U �qt�'5�
�JK>��ֺ	����%w=�l
�ed��`5I��7�ʧ$��܃y�2�PBtk?�[��2�y�P�����]K��� �p�E~�MF����E�|�{OWݹ���}��YϪ��i���^�P��õ���S�x�������&�^M�6""����;��1�-���)))���HWttt��?�C�{���M-6Wn^Y��ŕGEYnt��E�.W��'�w��n�����Ÿ�mFf�t���vCFBL����3�M�Kp��zAԚ0�m�X��ڝ|��tY�@t��V�󫃮�;�'�G�� ��m���D&,4D:S^[�t�!����[N�t�,m:ከjh���L�7n;.���ur�9��)r�
u�8�T����R��M��I޸���q�^�>�:��j����^�O<��\..����#󬥵�O����+JH�[[b��"�knv�1-�V����1n;
���a�ɒ*28��g�YBÈ�޶��'�C2�����f��Ǹ����
1�c�TXUU��11�*���7=�v���������$���³N���9m��بpIlnx|v)<�M:�t���>"��6�D0n{s�*���&~pFj�A�s��%%8�/,o�
w�
F��GJ+��.H�W���‚��ָ������
!!!�0� ��.9���޽[��C���$C�H�QtF����#�2���G��Z�>�_
���8��
�?�z~F��K6�H&h'�1u�^+P6Є(���L�m^�B2��+f�?өQV)X6p	T.@����W�UeƓ?��KϒCd��l�;�6١��G���o��?�!��Y҆tAT�J��∌XҢ|Y����H�F������[�^�Iw��!�=?Ym}��2h�H@"�;^1gJb�[���/2'kÚ�W��f��wFJ��É����q܇��z��J���̒��2�'�ڄ�"�^�[���H�@��C�gT�62k�P�bI����-|��Q�(RF�st�G��g�-%���E��P\���7���
Y#z�H�f�-�ΛmD`Y��MO������&�#��E�2fۋ���W$�Ӆf�+'����,�vgS$m���U_]���x|�7�<��C��jD�a� �l2�����z�G�D��1�B�~�z�={���ɳ,X�!|��1�o{
�������U_|����͛��{���n#ihhP�.]�8I�F�;��]��̝;��u��ŏ>�j��o|.`�ʘM�X�V�Hc[
5��C;7D�������4��p��+�)���mL�rɍ#ƽ���I�/���oe�z=�9u�����-v�lb��w_��KF����E!�h����~�o���	Q��Z�b󡲆��N7l�+g��Tc�����/��/q����Ko\�������v4	ʧW}�}��+w͟�7q<�G8
��0sp��Ov�8�������.�2㳭�ZD�=���-n�[�۫�p��8�D�P��+FM��ٶ��Tރg��Zk��N~�U�GP$�Dx"���ܐK'�鹔%3F����PS�6���ˠ���	H��Te�?��8�@^Q��B�͞��wѶAəoa�[Q�L	J�����9O΄��אNp�z�Ko5&����y�C��pA�aۆq�����2���qSx��O?]�:/O�T_�T�J��QC��������G�	�R���΍�
�י��%mF̙�\���Y�e��hvmY>d�_D׼2�:}����[v-���!�W��d�.�k��NB�:�Ȓ�����82��#PET�e�M�
n��~h�R��[���.��N7���@���p���O�0��;4WP"�ɪe�p��ѰW�y�%7]}���H�<$�DI��iE���y�C��dN���'���Y��P!k�%At��px�3`��k��`�C063k���k�Y���|ܺCp�@r;���)v�7&dB�u,�C���~��5Ѳ@�/c�p>$���;YP���?Itҍ��_
�r$tݷ[�(Z^����T�D��?	C�?D,�#/�7����	��Mi���m�2�g�	@':��g�1	�/��k�k`j�z��]�����ږ�s�B���[�W��o���Cp&δ>�J�F�F8�Q6$j���x�9>����|0dYN��̼��{�����}�����{�…�7¾�oB�s={��{뭷</n�_#%ܳ���;�t�x�%K�,%�\3����B@�s���锔�ko��!�D IR��1O=�ԓ��k���!]"p�\���<��3O���z��ӡ+
i�Ax�q�m��b�X��5��a*�Ǐ� Q��ݼz���'rM�<�[(8�i�뮻�
2�V"��u��8�����5%///ӦM?{�lnddd�ԩSG����w��q��RM�DDD����C�ծ"T!�^|�j$����n���"H��[�j�v�^������<��]�L�Ǧ���$�N�>}y���.��	��%��X�-��^+p>E��3�P�Ա-���0������k�3�����2�ō�����/�DAW)7:Ep�4�{Rjț;
p��.�)�NW�@����?*+�����(�Z���'�͔��o�!1�L��'y�$�(@���B]�3���R>QѢ��%�~d�ҩŚ���ֶ�Ɔ��1:�����1�3��I������K�k�����x'gp�jC	Kץ)��ϐ/�H~�f0|SHSF��'K�c(��h3�Z[$�)�ʯ��s��l}e9�7ع�x̏wfC�I`ʌ��y~ބ�y^�^���3AHRn�,����$�L�@��}�;��xR~��V4��u����v��r�PK�}�#�!�[���|~&��ߑ�iֶy��ͻs���67t#�.�t{����!��kk �w �2Ύ��ž�z\{�'�cϽ����6������w8�V{>Tw�a���`�f�	�(�s~�\��������N��a�w��վ��{�7�N�s����2�=��m��	y�U]�Q������k�Aw}p����w̌����g�f�n���j��p��'>9kʲKB�7��� Q�e�Y#2�Omٻ�h�?^��c�,��q`P	��z-d�c�ÐA�uuuǂR��A �^
�����s �;q���fCfm�Z�=�;��Y�2z����@d������G��	8�`�ȁ^�n�c'C�>�Ad|MV q=���~P]YT��7Bc}���c�ۭ��苫��5M۩�����~��j�򄓀m|�G�ne��̶��+����~	w����.��eee�P�x�ȑBZZ���uO<���<�Օ�#�{�w�_�fM���^�\SSb0����T�(..�
r��W��~���N���C��ڣ�`*�z�s�=7�(�&d�D���C�BdT4�=S��WN\p�`6��_|q<i�!�v�Ćt}vvv4�R�Խ����p����O�����iP]]
��a�'G���4iR_��R{hFF=�&�]��`��;�� .��>�,T�ܹS!*�L4�����0t�-,(���L$j*�!;{���B}}}��/����^�k%�F�3�,Y2hڴi�Ϝ9Cw��ӧ��|�޺u�W^y���h{ҍ_�
\��dπ�3�c�'��ڃ+=B7n&��(�!�ݹ�,R�x��� ��b� �ݲe˶t�x�b쩸�uw��6x�ƍWbs������F�3粫���
�� y��4<�䓬��v�>�@A�h?�;n��t�=��{�~��+	��PD����h�wܭS�lq��i ��ya�8$�������wcQ=�����䱹jq<Y�����j����z�Ӓ�P���Fw�N)�5k���v	���?��S{�,p�<�����M�p�yܝu����+�]���m����ii��ݾ8>'�1FQh��
>+]�-�����F�fH�z���!�!���N�-�G!<S+����B����Uϋ ��S��;9O2
���to/���2�u�`���CT��3!��=?����uT�s��0�pl{'�Uض�`Gq6�[��k;WU�k8
�xt�Ɂ�������?�h�~����9��n�.�N�?�����A�����|�A��|�A���L?��k}2K2���� hN�Ts�\F��G�,D��=�Q�&V�Gˠ���"�Fj6��a�'��U�h���m�ʒ�>��CՊv/=?����x�=
z��:�U%�1�~`0���Vr!����-<�ʆ����z���w�ʈ*���^�:�[E��P8�@�� Ѧ�I�=�3/7�Q�EI��%�q�*y�8ť����I�$����@UOq�4��p)ya1�"�1�d�?g�(�ՊU���"������yJ����F�ޛ4��15�&\}��0T�����u�^}�32H����ۿ����Qdp
���7��c����O�&�O���jr'�6���z-���6$=&d��њ����l�d�3�q���-ڨ]A���k�=.�2���pl�8����)����Q��e�I��q�Q:�����Ŝ�}�ƹv��{���?+*��U��c=R�������j�W��ʤ�3x�؃"�F3ɳ�5�!��z���5I���$���;�[�)�јO���X��B;�[��;�pߚu��R��F��;��W?.��@7,�cP�L�w��4{k�d�L�n0��u4U���ڴI'Q}D��h`P��*6�� ��4��6%��V0���K�wx饗z�qqJwI��<�:m�JJ����)D�~���}<C�t��NI�y��:��tD��;nY���̺��މ�TU�����>�]U� >:5��{�
�P��U���v���o�����999�&?�h���D��rv@K�����
y�v��a�ߨ{��3�<�]Sƭʫ��y�S_?���F�c��-�cǎe<~����
����%����Q�2�H��)�X�8��H��@u�h��v��sR��B�qc%e&'>[H�

�Ks�HAss�v
��/\'���a��噗�C����������u�����?��S�F�QC�ݶ!���C��~o���B$p�|��3(w�†��ߪ��t9�UC���Y5�to�GfHmsd ü�޽W���������w��W����;
�RY輊Ͻ���L�"U��4�|�3����4��W�g*Ԃ�Jv.P�5~��O�V+n����+w����
�!�5$�7�v"����{�a��:�۝]�w�j�l�G}~hY̮q�Yˎl?7���m�8g�*�ݨN��^��yS�c��D�y6L4�!�!�m?��?�,[�,S�Q:�.�|	������i�F2PQ<������@��A\���(Xm���?|�"'�{ �6�E��w�<�G1�aaaJ�޽W��/_ΰn��A�G��k!�v��%��\
|rX�w4>|��w�0�{�"�|(\7�azG�4a��D��������#�ʄ	|g<",��,�^X��l�ȯ���$C4ߤ�MH��---^7<�QI)@�,h�^���]>{���dܧ֋���w�n����ӻե��'��y߰a���G�J�#�����U��D���@ڵ�S��gU���Q�h ��p�2�7� <Q����&H�k�O�D*1&j�T
V˓�á+::����3�PXR�Ƞ��{)�2��e�~�K����	��2�(CY��^X<�m(++:��`

�='��@�r�EoR҈�v.;�V",�PJ֯��K����"�b@iS��wj�!����`��2�J�BϞ=�mդx
2�k�����|��@��mg�3���퀖��.L���B��Ae˖-0m�4�"�)!�4�L�ʢ��,�f!��̘1#�a���t��s�&d=�	"n��B�x�9�ٚA��CK�'���FvD�y�Ž�{t���v◟]���^����ùBC��S&gF��:E���U�=�����k����)~"M�����7<uE��k��z�Ԏ�p^oD��&Kt�܉L��zT�WI��~i��Aa��.�!F?Ub�-��l���%��4;�qV���Þ"=�%=�Da���-��<<����Bͤd=��
5�n�4�
����oq�>{��W�d��s�	H]Ut�8�9����ν�jM�;8��26"��y,k4��^+���`"�	I��"cWY�Sq	n�d��E���6�d1���J�����Q�ҷ�(�����#���Džk��t4���
�~����������
�q�4��8ߞ(*Gog"�2`�}�CL�h�;��6Cc�o��
��_0�66T�|�KKK�%%%�?�d�R;+������2�p��tY�]�?&�/��q����=uYF�yeRL���w��;lHD��ե(�:i�7��qaY�"�1��L�%1��򮟪���g��g|��0�E��d���)椡�a�����
q�p�n��6��>=BOTX��Wش�}%��c�9EMU�-�)	a�W�L�F�����X�1.� ,��U�����ԯ���g�<����5s�8U�,/X}S�#-�r�(�g$V�t"Gkyl�_r��t"�ղx �?HC�>L��J��D�s��9r����غ��^�v�aƔa�����tK>|�l�������>[ڈ��XiS�U �+���&�I�ָ4�_5��j�3S���W�{i�3���eE�&��ʴީI�%%�>VV]p�(h��_sz
�L��'5�����,b�z�����ĝ'J�O枩r��"�����~�=]V�q�Κ���<n���AGJ��ᓸ]т��f����'��笧�/ qV��L��
k��U��׽p��i#���|Y��o6�x������l3�v�&�?J!!!��ƭ�yQs#�t�a��r���a;v�Z__�v*`TWW�r�ԩ��֭�**�kذa�]Z{ɬ_�~(y'��8�+
�K'??����z�´U8�D@R�I9�c���I�s��s���g�)��9G�iEEE��4�^xAFK?ѓ�U�V�'Njjj�Nˠ��"qD���������r���={�E��N�ӧO#;V�~ɓ�6��
���q�Ư;E��/�P�sssqDlj�1��?iR�d��{NY�h���А�7SU�o�᮹�����+))I"5���(�]-�^��O�p��u����d�ʜKh#�.M3�e�
�u�����N�e��9FC��ѽ{�E$E�&�6qiw5X��j���܎7�>g˺vج[�7sl�х��6��&��0:}&*��lɾS6Ѻԋ�󒭏��Z����dQ
E��xd�30&q"l-ZO
�����"�Z�҆���ԨmW �$����K�!.�I$��_��g|��DI���0��ĸ��!1�6��H#���M}тU]W��s�#*��l�F����T���n;�u�k�g�G��s�ޥl�c����2R�����(�<͚G���8
�yNUE`z�*a����^�Ė[\��e��ʉ4�B�u���_�݉>O�U!D���Ƈ�-�T���
ZL��{ޔ
f�x�]���܄0�^V�,[SSW]@Hw���N���g|�AQ$gKSK�5��o]8�d�-�Գ�>���+[��@�њY�mw9�N����ť��;�oHx��TuFNo�v��i��1Dϛ��ĩ.��.��=�[x<?��K{�)mה�,�dK�&�co����*����74�[����ˑ�:�K0$&��z¹x
���h;�k�A�u�]wEEDD�$	-sh�����"�2��Z�]" JFZZ��ac���ߧo��0}�(JM�gO���Ӊ���_>���b���c��fͼ�ORSSE��X�%��a�q	�I�}�J�
�A��wȮI�`Ą���a�Nϰ~J�966���I�c�K��t��L͢���!�0�����'�u��Z�^��V<�IRThx�8�vA��:���,X;�Y�E+���*�
NVq�KzG��2�⳧+1^�t:���|]�)�']{�<�N[k��y����`;�s��p�
�۷_�2u�K?l��u�n��}��bݳy�֯/��b\�:�]C�馛����]���.�d��D���p[4�cY�O	�W�+	�����K�<���BuԨq�y�w͛7o�sϽ����V�3�wA;F��׵�^�Pu�E����?"?��oo4�N3� ����K[ {�h˯�w1���\;�+V��E�҅�/\���];l��^E����o%��w����$��ì�z��W���ζ����{�S����'dYV���<y���~�G�a
�8]*up��w-O��#E�Ky�Csrr�������'O�����'�p:�c�l�D�`��ÇkD��W�7R��9s�cq^c� E@Ra��nܸ��"��p����?��Mޗ%���H)4����L��faǎ0z�h:���Q@�㍌s��>�	JJJ<��PPPh�<����;��ीp���:+�}��Aj���sвPWWg%z�i,y*Xy��
��1�G8�333���@s)�]ǎ{皇����Lj�W�C�鬉#�|����yk��z#����NM�$��Z��U�a$�T[<r �g��s�:�LP��n
����#]�i�JF�ػ�B�w��th��T"��b�܋�(�5?�uJA�p�V�@�[%Q<n��K��.��y#�����A����.�ο�s�]�q%�jgۺ�.��C=Yp��7�z������" ��.FQ�'�:;�ޮB�[;ݺ��)�DQ��o6�,�+x"<�?�1��9��C'�{fJ�:qw&B��|�m����Ͼ��"����c�~�e9���GI��>�<G�奟�ywZ"
�a�c�֔<�*�U��u�����ծ�6�����eM�.�b�^�T��U���○��|&������t�3�4�u�w�w�H�Y�*�k�%gc�g|�-Ӗ��SD<3#;�t+`�jZZ6��om��ċ_>0��D�n��vU����6jChn�C��ؤ���Y��(���;�S�Ƴ��>;@
�#�$d�
{s*r�T��K���ާ��酏n;�&�^�؝�<u�y1'a"6VODuv����:�v*��w�D��f���E�TF�B_�’�4��h�<yf��hZ\�Y�Y�V��#wՔ#<L�Cf
��:~Ў���I"���К�������Bkv�%�s{�U�s�z��^)���F�*��������TPno��]���/ZQ2'̤{aָ��6�LWu�����9n��O�[�s���eg�zn��)�Ú�`sI��*[eM��z�&D#{%���!�1.>Vo-;�rK�-�S�-��������*+46�]��̫�m}�Т�#0�3�k"ߪ�[!+9$a|�@p��F�r�6�N�4V���Ƒ%����TIS����p]4��.Wo���)�PY�Ғ��_��|WQ�܂ǍqJa(����V����s `�?�$a�'.��[��~.���Ȣp�a�F!��
��l%.�Ntthd��k[\��c�D�QV�x�����'9I~'�e��N5��1�dt��^Y$�74��{|<Q7hn��Ֆ���[�����:��g2.q�}��o���!��
�
��
����aY_p�~k�ȃ��;����L/����!Mlj��<���z�ts���|�3b�p����P/�b�����x�fȜY�:����9]��e5G���93��e'1:lD�8~HR��2�rz�v���l��t�-�I�B�1�A�D�k��M� ������*�?�8?0�^�3>ap��c~`�`�n������pʹ�a��N�9;�F�k�5�ˏ�9�`Ǿ��?@^�<yG;~�}�:���Ac%����q����;��+�g �h�hǾ��������W �@������%}��SaC����c�
F��y�bq����=�DZ�c�G`����G �@���y�� �)<YR��C���Ͳ�,�N��_e㢦'L�QԪ7�W#0�|��gv��c�M}&K:f!������cձ���!''G�r!�n�on\�S��tn����j_�p�8s���.'�JT�U��U���Vת���ZTd#j�)a�_���2�+;��h#�п�F~7 ���P��m��3��W�o�zК��N6��$��|M{ɤ��X#l2��,���Dt�Mv�xF��smOc�!q�����k����]p�N���fQ�h0��pM�����j�i�I(h.�U'lW�[�:�؅C��x���Ց������S6F�)h�>f�`�!w%�o����[�� 겊+���D`��o�2�b�p���[�A�ˆ�v%U��@��5a|�0$@��$�x�n�<	���j�~m�����j�p'�&Z=�J��?:�.�r[���Ӧ1�u��|'�n��v�'����>��c��sԑ�9�E��?�8$�H��oRw�}iii�+V�(q�ݑ�^�G���mo���Z"����N'����[���r�(�/It�|�op�?�7��C_�x�}Y��K�Z
�
���#//O������Q��+c�o�d@7���^�����1Q�έ��#�y���o��[)֟�s�����[�yGO��?�݇�t�Lőaw.R������V�]ֻ��P�-��vM]���Ưr��s��^0-��� �W��ziii�߼w��Yd8[}*N[,_��}���5V,zt~]ss��裏���{�~;�˸nW���PQQ�.Y�D3a��c���^�;�}u�?��L�?�:iژ�����n666��x���IWǎ�޿x����o���r���ښ������"��lł��x�:7��6��g��?m��N�

����;jjj\�P.`���mz�!�t��7ͺ��g�]4�AtBƿ���_s�5#�c�5g��Շ|���������_"ڌЍ�7C7:���a=WG?z睿=��P����{&��g�,��qR�MⱠ�j����XHO��WSS���փ �P�m���0>�"�b|zz:���C �$/���OIC��-q)))Y�.,�L��n���3ʴ��<���]�"0�r#�SÂ�c��@�6 QQq&������̓� �eI�lso��S
�_.�[��Ka|�v��СC%����߿�8���W�[�0�v�f6�G�<���RP)����4rm6�o��6���'��y~ڟ4��k��닸�pJԚv]�X��<S���a	8kۗ�_����
����m�<�{�Qg:�]��4Y`a�<�c�k��V8�#��3π3���_�0�LP�LVտvKF:�2�X��6\�q�s���ԩC�v,"�x��pH�
���{_BZMz��?��%O�����.�
nU(i�᪾�m�,�ɌN��m�@V���2�O|n����o^Hb,J�>+m�
p�r��"��|V�6s�,E���)ɏ@�<���	t���q�>��;̶�@Ă� �g�,4��	�-�;	q��!?�
B@8��c�ZP=+.� 8Xr%'OARF:���$~��2��4$U��3C����ke�n�8�����J��B y�����I��<�W�&�,i�-��JJ�d�SI��r�oJ>{���4k"�/���($0($�c>�cF��א��H�76:h|/��V�a#�����Й�w�1��Vx�z��|继��= �;<��
��B}���3n�O	D,�]�F��]��l�iL���5�"�n��[8bXJ�>Y��f����<6�۞_X_{�Xe��)��sgnn���aft���'%mƽS-�6�z=�z�m�#�-���6��8��&���?�����v���H��^������q
0g[����K�C>qY��Ay��A�}[[�f��A�/���on���'+�/��*K����m7�����<N" z�����q8�#Y��G�R
�B(6�����(���1�>��/7�J�`v:��(�R(���"1��0N�yP��{�������Gי%o���v�̣G�c��d��������'j�#��.$\ �^Q�X��]�a��@yY㤘���晘���P���g��(�K�Y�����!��u�p@$H��>���@z������5$6�KC̦�N�:8$,҄-�Z������Y��'w�|�e�?��ܷ1HwVm��J��T�y�)��I፦�����;\S���c��ï��/ml۔���l�`���<����<R5��y������|�IYDм��̷�EW���W�RC���T_��}��S�7�*��~;��ƍ�NsӲ
-��|+�n=RMݻ�����Y0n�3�*��䢰K�/L�Z�(�@��Lz3\�8"��C��f�^�_������y;/�tK⮱���z��=�����%� �P#%c{L����/�%��SQ���"�󒙬��1�(�x<Dz
�@��iI��@�.�<��Jr�0�o��7O��2D�CE��$������K��AEk1L�}1��f�۝���J{)kf&φ;,&�,\�qLL�N��+�*[� *�(N5��	�qs
�qa0&a��#ੑ/C�1��:�:�m8f�Y;fE�P$��Qɡ�dD���G�v�J�U�U�_�SuGha&��A}K5������tN�lO�VH
Ii�u�*x��sp�1><�:��?JzFMjx�?�-i���A�%��e��kz�D�]�4�Z
�.��Po����鉀11�R8T�6������Ŗ߬�A������JO�J2���Ӧ��M8��ܳb�����@��x�:;�1J�U�mה3^I�Jq�og��M�9`)�Xj��ƣ[�ة�j�e�-]^�]��)���,2��H
�խ&`�e�OI�Q�Ne�l~a���͸�2�B[�@�aÆE����\����#����M"Y2�����w|s��і�w�
-�nWLjj����ˣRRRί�PT��n�"h�����l���o	��.���Z		i��颌F#������&�( �Q�H�{��泝�O��U%�z����_[��������A��o�3��LdD����a���ү|G������DWQAT��Qg�|{��@$h����ҭ��.m+$?Y���]�-���&2�+�~I�q=�cTz�=���u�B�� =�.�f�J�/S�`��f��ڭm�M~��
�9k��	b��g`b&�::p�����d����1p�E=Ș0wt�r$��Q	=�S!\(�+͓�����4�����_|1��(�z���;�
��<���Ν;��[��L���^+J�j��F��w��ĆH4�g��e?�0I�
pS�?���K*/y�n[n}�;ꌨ'�D�l<\��Q#��n��V$S�ƒ��kjj�T�G�Be����L�5�8q��(᳴H�����	Y�!P\c��z?~�&�H��k�iyx�����y࣓�%Q&Ȋ	���+N	��48��=aLͰ��9M	��؂d�~��3�݁x�u޼y�ta�w���D�ы*,�A������
�d�;�̅Q���Q]k�����4D�mI����-Uoʥ����$j
�h�Q>�L���g@Г����(��<Ub��iH�Ph�݂X���R��	�5�<��I��y�{�ffw�dP��t�~�6��Sh�;��d�����Y��Eg=�\�B���Q�Z�£IF`34�j���公B0�=��t�Fs�0�L���� c�ş	�T�+��D-l�&K�Tڽ�L������ΐg������6zP-�M˽�f4�p�3q���K~�x�~ڎ j��]j~�v��7#����/hV:��Y/u��0D�8�����"��Ǻ�]���(q���XH)���"�Da	���p�2Cln�v�t�lMbu��k]h^�E�2:
��2P3j��ťs�W]�K.����-����4v)�C
)\�A�{����a�u�&���.��CAgz*���΄���ɇ;��y$����N���	N�cƟ�}_gh=�5
��I�ܵ>>B�ũK,9LL�&ET��{���YK&�����:;�M��G�!�'�p�2���D7{�i"
Kz
��Hs͊���l�8��Ƽ�e6@YA�r��5|��@V��"�s�"n��ֱ���΃Z�9�$%�j@�E����ކ��|_y�$�Z?̌d6����3��d{��
��HH������UY��n����Y�0�XBؠ��`*��l}(�
����X�,LGi�����'��"?�i�
�H
��"��S)ֲ`�^E;��ƨ+TB4�O����7��`�?N�5q�փm�v���,�_�#��g����؃%�W�8��Ά�G�/@m�Յ5ğ�X��9�~�CA�~}�]�/�}m�%���IEND�B`�themes/light/images/search-default.svg000064400000004105151215013530014011 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="15px" height="15px" viewBox="0 0 15 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>Combined Shape</title>
    <desc>Created with Sketch.</desc>
    <defs>
        <path d="M11.3820189,10.3213587 L14.7803301,13.7196699 C15.0732233,14.0125631 15.0732233,14.4874369 14.7803301,14.7803301 C14.4874369,15.0732233 14.0125631,15.0732233 13.7196699,14.7803301 L10.3213587,11.3820189 C9.23588921,12.2387223 7.86515226,12.75 6.375,12.75 C2.85418472,12.75 0,9.89581528 0,6.375 C0,2.85418472 2.85418472,0 6.375,0 C9.89581528,0 12.75,2.85418472 12.75,6.375 C12.75,7.86515226 12.2387223,9.23588921 11.3820189,10.3213587 Z M9.86981921,9.77380751 C10.7239628,8.89568802 11.25,7.69677529 11.25,6.375 C11.25,3.68261184 9.06738816,1.5 6.375,1.5 C3.68261184,1.5 1.5,3.68261184 1.5,6.375 C1.5,9.06738816 3.68261184,11.25 6.375,11.25 C7.69677529,11.25 8.89568802,10.7239628 9.77380751,9.86981921 C9.788201,9.85258825 9.80348847,9.83585136 9.81966991,9.81966991 C9.83585136,9.80348847 9.85258825,9.788201 9.86981921,9.77380751 Z" id="path-1"></path>
    </defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-1831.000000, -28.000000)">
            <g id="menu-head-footer" transform="translate(-1.000000, 0.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="search" transform="translate(1607.000000, 18.000000)">
                        <g transform="translate(224.000000, 10.000000)">
                            <mask id="mask-2" fill="white">
                                <use xlink:href="#path-1"></use>
                            </mask>
                            <use id="Combined-Shape" fill="#8591B0" fill-rule="nonzero" xlink:href="#path-1"></use>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/win_10_sprite_icon.png000064400000002601151215013530014601 0ustar00�PNG


IHDR�<LꩼtEXtSoftwareAdobe ImageReadyq�e<%iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 6.0-c002 79.164460, 2020/05/12-16:04:17        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop 21.2 (Macintosh)" xmpMM:InstanceID="xmp.iid:7A59BA79476211EB8B75839F21D6E908" xmpMM:DocumentID="xmp.did:7A59BA7A476211EB8B75839F21D6E908"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:7A59BA77476211EB8B75839F21D6E908" stRef:documentID="xmp.did:7A59BA78476211EB8B75839F21D6E908"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>Z���IDATx��=K1��]�D�-��.n.�:I�
������.nn�����U��x�U�#���r�<���.yh���I��01Crrrrrrrr�!�T���7�h
S�2]�j�ߛr�h��+��F��������b�|\�g��Q��᫑����!G�r�e0ɂ~��5*%GQ�0�^�Y9��כ%'TBʰB�AB�Le�c��N0���w�~{m��T���%Ir�_KVm̥��g&�Ln�&�[���������(�~�ǧgzmZr��V�z�����=ǰ����������͕�N�Dv~i,o��f�#޷�+��m�z�w}�/Z�œ��qI-�.��;�d��xW���&�H�� E1l�*Ps9L��#rA���$>��L���QN>mI*D6�ؒO�\��Y�$G�cM>��y�*��:�8���Jp�``��t��
        Ԟo:�L!�[#IEND�B`�themes/light/images/README.md000064400000000235151215013530011660 0ustar00# Images
Store all images for your elFinder skin in this directory.

It is best to group similar images into one file and use the files as CSS spritesheets.
themes/light/images/upload.svg000064400000001004151215013530012401 0ustar00<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
 "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
 width="16.000000pt" height="16.000000pt" viewBox="0 0 16.000000 16.000000"
 preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.15, written by Peter Selinger 2001-2017
</metadata>
<g transform="translate(0.000000,16.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
</g>
</svg>
themes/light/images/selectshape.png000064400000000201151215013530013400 0ustar00�PNG


IHDRfX��sBIT|d�8IDAT�c```�a``�b@.��&C:�D�<#����I�4�EX�]m�'��6IEND�B`�themes/light/images/icons-small_new.png000064400000022102151215013530014176 0ustar00�PNG


IHDRN�]tEXtSoftwareAdobe ImageReadyq�e<&iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:DocumentID="xmp.did:CF3BDB03213A11E8AF19815497758C5F" xmpMM:InstanceID="xmp.iid:CF3BDB02213A11E8AF19815497758C5F" xmp:CreatorTool="Adobe Photoshop CC 2014 (Windows)"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:5680E6D4213911E8845F912C879712B3" stRef:documentID="xmp.did:5680E6D5213911E8845F912C879712B3"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>�� �IDATx��}	�Uř�Wu����n��YA�Pq����_5�a�kb�A3���L~�LF��k\��A&.�k�qY����,U��չ��m�i��<��O��{�����s�ԩ*�崛^8�
,�d/�jm�1�-RD�ܫN��+x �ߗ�� �T��nh�߽��
�wה��@�׃d6]�<t&3��3
��Sк#	�L�ѩ�|�8E�|��KLH�1��[�oY&�6�sx���Z�N�C�;o�L�Q��k �
�0x�80FegȠ,^�ZV.4T��8g�w��E9nw�EH<Ƞ��݁� n�JO�Ji)�<��<��=��3�,��݂Sq{ʀyE�eT,�݀P�q�@�`|+�����K��K�D���2���P
����Q5�q���/�X��QY(�
� ��V�71��e���T�
��l�Pq{������nֵw�{�`Q���sJ�WJ��-�?
�4��@h���<�3���̿���<���d2��8+���l�eH�њDèdN����A��.h����ϳG��urC��
VF)/�1�9iڌ��(� Sp�D3E�
�x=�)g�ׯ?X�E��3bE���ۓ>X՘��*Ɋ����6�51u�8�b��
[�`��T�,��rD�ݢx@�x�6
�g���+K���)�dS:�z�K��"�ȰD^i�Y��%�2:�ҴC&�\��2�%���*��+(Q��c��B��+��	�,W�
�VtK�T���oA�E�QmJ^�LP�m������KXP������Wt=��=E�S&"�A�(^`Za���WC.�;y��;��
u5��b�}��+n�2�'��*˔�Sҍ�4C�ئ�o=�&L��~�i
�4��@|�l��~�ڑ�3Xc!�^��~�G�)Z�,ZUWm�}�#y�)d������\�������G�%��9܏ײ�6��v8,R@Z�{�/��w|��,���+C�6geri�&X(Q<�����]���4��RkAm�	����!	��.�sTw�0�81�����~�����S)�(�.9iD#1��z��t����Zb	��X��5�m�h��--q�p,X�������e�䩥Åm[���l^:�,D��+�f��{��>��
���t��v��=	��ˎA�U�)A�;0o��U�L-�Dk�4��[��e�����\�'�^W�^ȧ���ܯ�9|�0����n�G� \�[�C���Q�[��?��	�`�g0B$�*�g��ט:�����+�h�9�ίkq��fvJ!T]V(VU�'���į����
 m�
�4��@h���<���QH ���PAo���LUL��k�mjj��f�P�xH&饳�����@�i��٦
��Ϳ綛M��lvºu�T��4_���1LX�`A̴m[�|����E�1�nʽ2&�L�&擗�ګ�C�N���8����Y���l�T��f�,�<0(���2 �r\���2PY@�}�DJ�f*�R_�Y���YP�uuu�ЃQ�r!aM�'�D�_�Q{�,ԅ�4����XJ7���0dn�����G��3$3؃��~����t���q.��qL�E�/�
��ߥ//�Æ�.�c�~=��_�tl��<Qb�L�l�3Bu�8<��a�:s�Z�/kf�1^'A,R.�	G�q$圱��=y"����A���\�0�槞�Df�z���28-l���L��C���P����4��,0�z�4b��Ξ��J��O��r����tt(�x�Zv�y��H)����;�o�S+�s����K�dʟ���i,� ��P-�/��!-i�f��d��""}�G^�µ*�.��|�����H'T<W��!���
�J�㾐�?#���*������ﻶe���]㸩�ek{������(�+�s�ki��X_-�����{%���ki��<����U<FZ/��'⅖�PU�����f��#����+����|�#���֣1�}ⱡ��Zƺ���_�'�z5�)9psC�wp��&����r���B�@h
��gjL���u���j
����q׾|���/7��2T'0}^ЏŢ���/��U!�pУdD�3�~-glM��G�� �F�D�A����E��"��;0�L�!� �E�5����-=tTLJ�v�1���%%䑂���q<�AQdk���=%���Ax'��:|u҉@��-����j#�c)�2���l����º��!Q]Ϥ�dr+kl���fh�����/�c���)�ZydӃ!�3!�m�s�!^�Xb�8�hUUP]��������apXK��DB�<�����m�C!�F��ޡ:Q��	h��AK4��
q�TpU+���6RM@>���d<�C&+ag��PB�������M˂�o��^\B��
d˚&M���O7�u$8��\?P4��@h
�>W���s�niP�'�?8َ�q7�/�Y�\�/�vgCS�Y��jg���g�����]���>�vt�j��$�M��SL��[[_{�
�o��Q�����^r���Rv��C}}����
k;��ҡ9�LN;��#
�>�?x��L�|��-�݄e<�*_�P�mh�y.�`��03 ��d˽��L0L>�1vn�*>��.-#��S��>+T����<���.K%�gؑ�[���H���v���w��-�7[��� ��Ϻ
=.��������H�V��ø�
ty�����&�I&;?�>4��Zރ����Ezՙ�c��Xj�dWEW/���ij���f���������V(F%|g�ASs��v,~�e�Cyd�d-g�}���g�q�~�N��	c7
�CyX�M��h�ʃL���ع}[,�2��Ž֭���E����3�Ɏ�-y��a%�p�W��?��@h
�4��*�Uw���+�=Y���%>|��O?=���?�w��ޣ�R��,��/��Q�60�j<�o%���Q��d��1��}݃.�A?�tw�2.�,��?��x�!��� C�u!��ªUa��j�3��W�6~�9�?�M;����}�T'�y��@T���O=�u�0|��-�����	h�2aLc��!��+�q{{p��c��a(`��d�>`Z˂���V��`<���þ��oO�/+�jٶ�_�fM��*��-wTȚ���_<��8_0�κj��̡v%���k��f\]<|I�}������]�!bQ��Tŕ�0�q{�q�t������� �U�>+T(4,\���?�� *�\�G	����Rжe'tn-��N}h���h^x�4�C�d�΍�����PU����k�]�kVz��h��*4�(n��Ʀj��m�eB+��d���qc���&a8x������#Ћ^���E/z��-��zB��	]V�Y����!����{7���a�ż�J$�'{5�Kk[�����[y��<O@8�t:�2�.ǍS��R����IT%>{B��S�#$�&/��m[�eb��5��	](�&t�w��BF6	���R>l8��T��M�	]Js���e��|y
|���;3(`�:�3�8�.Ӯ��,uk�e0|�0U=�H0��ꍟB��}K��6p��F�q.������'t9`�(���A��zؠ�rm�`pg=���@h
����>��
��Zt�P?��&����Ϝ1�����A��O�cpp��v9�3..����.�����V���|v��]mP��(RZ��sw+:���c{4����fX~�D�vՏ��	#`����"(ω��Y�‡���q����
�S�58�(c��Xpք#`�ݿ���τ�ȃ�q����s�~�r�Il�q0�ʫ�z�qj���w?#Ξ��b%ѡ�c��<Fv�PO��_��矁�%/B��!�ىY*����uI5�dAmZOL;�̏}�ٙ��rz��Y$��<ކW�ljSJ��δn8cf��9+g�T���o�w5nc���u��W��,:*�~�H��#)��,�e�Q):�f������,8�UtT
�}���4��@h�/�by�ӏ��㗯�8?nqؙ�3���]�@�S,�P�_v��?�}���Pw�Q�r�CP��1yґ,���(���m�y8.,7������#`�=W@���í�q��������+Zl4�	UN������MS
���0�ND��O���Hj9
Z�\>�;l[�)��f
c��6��Il�:�}��d��?Fy�8�ˠK8p�w�a��z�yj=l�ʕl*�I8�鴟<��@6����)�^�K`!|�W�ߛo�_�w�"�%�SR,�u��DBK�#u�� ��A
a쑣`f�l�����X��$f� UٝX�# ^�z]����j�${�(���:�YÚ뇹‡Y.wȱ���*xe�Яb9��O.F���]ןsY�ZJ�#{J�ЊE?T5��@��(�@1�;o_$��Xҙt��ٞ�.&��eR�����2+��㕺�D�+������/94�<���{�'�ݾ�x���<�D�FN6Br8���d�֟��U��K�M5?��M�
O��y�q�=<9��[�ٽ��!���`�\Ͻ��;�\M��0Ζ�2�1/�����R�$Y���~�'��Wcj�A���M��sL��)�uD�>�i��)�o�\?,���m[/�L��[��@[�r$��&�ɗ�Y�_8�@t�R����k.s����;�
�W pz0�zS�Ƭ������O����X�ܰ�?����,�i�W��X�d�m�y�9��i)�ɘ��P��1G�����i����D˻קּ|�_�|�ߣ���~�pܮC9G����C�עw�s<G�֝�פ
�/?�%K����mۿ�0'�L+�_��|)�@�k
;���>H��K�IGO�m٦���n~��w.ʃ��o	�]$�8�`�)��1n#����2 �v*�<}�ɇ�ɗf��S����^�y
&yWS����&�q6c�����B���b��_���+�P�p)��&3^U�l�e�`s&��"�
���Z��m[�&X���/㍙TnɓϾ�J8zKr�;T��D���wl�s_r<�	1��nU����ޯ�k��O��p��5�_=��F�`�'�=�͛n3�j�[����$��@�������9�dǡ����u!�B�<��r�0��R��7OR�jҏu
�� ��g<�Qh
�>��j��1c>�br8hO�]��y�w�*�)�;{�u'1y�g�l>�q�=�޶~�&�t��ƅ+�r�a�wf/��}d៟[�vÓ����r��m�۞��!� �����7��Td��ru1S�3�a�8�\��Zs%�~1M�(�:x{?pͪ)�+8�P���lk����(��m:F��l9��F#R?�|:
z�	8�裡��ZڦctN��f�̗�P(�>z9�7&N�Tv��7�[��
:T����Pp�Q�ˡ�o��*,�]�P(R�m:F�(��@k�
�8&u'jlh���x�!�s�
�M��š�"�3�t)���e�n�fB��j�T���M����F���'�ϛ��ӧ~�fm�eA��mC����m�I��%�s7J�����_<��8����3�:1��ȣK�f{�|(�Ҳ3͋��͕ᅧ���#�CUh
�4��_`�r���{��o}�B����V,Z�hŢ4��@h
�%��<Z�hɣ%��@h
���ЂC-8���U
�4��@hŢ�V,Z�hŢ4��@h
��<�M�L�����jo��p�W7�\s�5�655M�}OM�y.�!��I��$�D�h W�������v��~)��uȅ)r0����@�&,X� fڶ-n��4h�r-��]G��eP�u!�Gn�M�V�ˀ��>#�o�/^����u2(�d2�!�Կ
�-0-��TPY�/����N�
����R�v��T*��7�pC¸��#�[���Y��g���+W�y�&L@�J�^$0��	��@��ܹs!�+��̙�غ�ʐJ�T�/k��A��H$�\�<�؅0�F��dĹ�D7�2���q���Ñ��aO�JCD��&T${��ٶ��h/C΍�/�T*e�P��`� ��TY!W�R��%�KC]]]���,LuԾ�H��z�O$
�4��@h�]XZ��)�~��X�!G�E���6��Ƣ�X4��@h��	@ܯG��f��.�ItY@���"�y�;��	o{�-X��ݫ(�8Ƒ�"�u)��j�0��P�l~i� ����c�y��@4N#'�.F_���"5R'@�
Y�����7��%����DiB��T���2�����yd�4�_�6'w�Wܙ����,�aYt�
3"Y0�:+�C�R 5���Qj�P���d�m'�`}k���0�1��i�A�z�i��esގ\��>G�l�֍�DX��
(m�>S>fC��ֳ����p�f�tC[Me�>�H��|�H���D�uG������=�(FF j:���1�1�N!�۾�~��{y�d��m��ʔ�~�"{*��,�XT�����
&/�E�Q�� ��]/�O�v_DwB��"�c����J��&7a"!���-,�c0p��G�����j�B+�B�D,M'繇������%,KR%4y�-��/��=�s�r�ŭ��a~?�˶�ŋ�.��T�l��D��RU���ӹ�n*�9��Vd0�;�u}ے`n"<S���
.�4�f�`��������+�[��vI�~^zq�aL�	�,JJ��n�����u��TG�|L*?o�U�Sق���E|N�L��#u!j
�4�(�/T��~,��E���6�P�@h�/�~���L��W���6�إ�A����Š�ӛo���:k�.��@�񦠗ѯ�����L� s�R��B,7�����s&�]<�c�5�f�ꖢ)��Q3@,�a;^��m�i�3n)����n��^TO��3�C��A�)��Z��z�&a���6��ԙ�V�H�.��6u��`g�c�H���`O_��|�3���+R�j7��ʾ��,L)%}K����1������	�w5���j�`�J�8K
6�>��m)){���Jca�Դ�� d�s�B�
�q���U�S���T��}_>�똋��5�}���я �Fׄ�0w� ſ6�DzE
���,�t	����vH��r7�}�H�x��	B���r����`V2�Ҙɨ���mB��Y�EB5eɁ=P�@�c�𾺰��%�%Wr0���S���3�F��T��kϿF7���!��#h���
�@����!i!�T�?[n:,&O=�	�A�2������x�p�������Z���@h
��bъE+�X�b�@h
�4�V,Z�h�V,Z�h
�4��@+�X�bъE+�T�_�?�S8O��@|�����0�Ld%C2�%{	�]������W�4/W��d&=�[����{e��U�#uY����9'b�I��x�R�<$f���.{�Ő�d��:o歋�,��e糣h���jˀ*\G
h_8Wu�n�삇,��F���0�J����o���m�� 8� ;����}�c`��kG
<^�*����q�cG"`���1W
*�:�c��`�T?E��2��P��Yư	j;_<�`�Z��@�5��&��~�tV����q;���9J�4K:�C!���U$��)��ȥS��)���^[
G��.UBCyB��3��� ��Ĵ����ş\LpAU��O(42��@܆W�l!'Q4��n�p�L�6:�@���|���}W�6y�]ם}e�q�ӫ@�J$')h���J!ä��ˠ,��)�k�A0<Sq�*E�n�(�
���b\7*n�B��I��s�n�`d��m*n��g,�9�f]{��{���\���_$��'��O�/хd&IEND�B`�themes/light/images/search-default.png000064400000002645151215013530014005 0ustar00�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<&iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CC 2014 (Windows)" xmpMM:InstanceID="xmp.iid:3CB9D763278711E8B7BCA3D0E19DAB10" xmpMM:DocumentID="xmp.did:3CB9D764278711E8B7BCA3D0E19DAB10"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:3CB9D761278711E8B7BCA3D0E19DAB10" stRef:documentID="xmp.did:3CB9D762278711E8B7BCA3D0E19DAB10"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>�?-
IDATxڤ�KkQ�ϝ��<f2y5MM�&�n��ص�W.��'p�Gq�Bpэ?��B�B�B��C��d&�8O�7N��(B~3p�=��eQ�EqEL2H��&�������@|����%�����;0m}lO���R^����:�f8���?3ƈ�<�,۹s��	L�0(����Xj��KQJ<A��J`:so�
Y��*e�4y�OF����j�����S���"��pL��65�k�
O1�ҧv�Ng�JY�(Ғ��_a�m�DQ ]K.��I_�bA%�5���F/���g�XDaO���K���>�t/@b����w�9��*��"B�Ai�xyX�ez��V�Cr]�rzfn�Q�O�ވ�4�|#�烷�
�sp*�⠵U&���$.e��Y�l�V������8o�)%�y��m��R��,'K��gS� ��C��j�����ȿ�ع���K��ܰ���5q����L���B�>����ŔX���B���/��;�]�:�`�/̩�$IEND�B`�themes/light/images/48px/pdf.svg000064400000007237151215013530012507 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="16px" height="21px" viewBox="0 0 16 21" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>pdf</title>
    <desc>Created with Sketch.</desc>
    <defs></defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-1329.000000, -25.000000)" fill="#8591B0">
            <g id="menu-head-footer" transform="translate(-1.000000, -4.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="tools" transform="translate(99.000000, 0.000000)">
                        <g id="pdf" transform="translate(1220.000000, 22.000000)">
                            <g transform="translate(10.000000, 7.000000)">
                                <path d="M15.8367584,6.22877922 L15.8367584,5.49506494 L9.72558961,0 L9.72558961,0.0153766234 L1.87499221,0.0153766234 C0.839355844,0.0153766234 8.31168831e-05,0.854649351 8.31168831e-05,1.88966234 L8.31168831e-05,18.9051429 C8.31168831e-05,19.9407792 0.839355844,20.7792208 1.87499221,20.7792208 L13.9635117,20.7792208 C14.9983169,20.7792208 15.8369662,19.9407792 15.8369662,18.9051429 L15.8369662,6.22981818 L15.8377974,6.22981818 L15.8367584,6.22877922 Z M14.1710961,18.9049351 C14.1710961,19.0177662 14.0777974,19.1127273 13.9633039,19.1127273 L1.87478442,19.1127273 C1.75883636,19.1127273 1.66553766,19.0185974 1.66553766,18.9049351 L1.66553766,1.88945455 C1.66553766,1.77496104 1.75800519,1.68083117 1.87478442,1.68083117 L9.72538182,1.68083117 L9.72538182,6.22961039 L14.1710961,6.22961039 L14.1710961,18.9049351 Z" id="Fill-1"></path>
                                <path d="M8.54865455,7.47047619 C8.56091429,6.81302165 8.35312208,6.47535931 8.25317403,6.36252814 C8.07218701,6.1262684 7.78314805,5.98517749 7.48621299,5.98829437 C7.35945974,5.98829437 7.23707013,6.01177489 7.11758961,6.05083983 C6.79862857,6.15390476 6.54304416,6.39743723 6.41317403,6.70663203 C6.32132987,6.91691775 6.29057662,7.14569697 6.29057662,7.37551515 C6.29452468,8.07037229 6.57545974,8.84065801 6.8644987,9.49478788 C6.54221299,10.7479827 6.01857662,12.2309957 5.46917403,13.4534372 C4.02439481,14.1458009 3.15997922,14.7934892 3.02678442,15.6718268 C3.01701818,15.7131775 3.01701818,15.7634632 3.01701818,15.8058528 C3.00974545,16.1223203 3.16392727,16.5493333 3.6004987,16.8682944 C3.76777143,16.995671 3.97473247,17.064658 4.18668052,17.064658 C4.72631688,17.0540606 5.13878442,16.6792035 5.5633039,16.0890736 C5.85795325,15.6743203 6.16153766,15.1344762 6.47883636,14.4753593 C7.43571948,14.0662165 8.59582338,13.6930216 9.60943377,13.4681905 C10.2149403,14.0175931 10.7880312,14.3357229 11.3748364,14.3415411 C11.8350961,14.3454892 12.2621091,14.1133853 12.5299532,13.7279307 C12.7020052,13.4827359 12.8123429,13.2269437 12.8123429,12.9534892 C12.8140052,12.8065801 12.7790961,12.6571775 12.7109403,12.5241905 C12.4536935,12.0435671 11.9146805,11.8958268 11.2620052,11.896658 C10.9137455,11.896658 10.5137455,11.9348918 10.0574338,12.0094892 C9.42595325,11.3065281 8.76683636,10.3203463 8.2830961,9.35037229 C8.48029091,8.499671 8.54844675,7.9047619 8.54844675,7.47047619 L8.54865455,7.47047619 Z M7.2192,12.749645 C7.41805714,12.2343203 7.60631688,11.7050736 7.77275844,11.1814372 C8.02834286,11.5880866 8.30034286,11.977697 8.57961558,12.3340606 C8.12745974,12.4558268 7.66886234,12.5954632 7.2192,12.749645 Z" id="Fill-4"></path>
                            </g>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/48px/html_file.svg000064400000012171151215013530013672 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="19px" height="19px" viewBox="0 0 19 19" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>html</title>
    <desc>Created with Sketch.</desc>
    <defs></defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-266.000000, -304.000000)" fill="#8591B0">
            <g id="content" transform="translate(244.000000, 69.000000)">
                <g id="row-07" transform="translate(1.000000, 231.000000)">
                    <path d="M29.9541641,5.72727273 C27.8934109,5.72727273 26.0417841,6.54041499 24.6857968,7.86381406 C24.6084483,7.93992511 24.5310998,8.02613434 24.4545455,8.11311698 L24.6857968,9.00238819 L24.8839051,9.14373871 L26.1846305,9.14296131 L26.3495898,9.03422953 L26.7797434,8.23194295 C27.1104459,7.60285023 27.7608187,7.25568711 28.4222237,7.25568711 C28.7860834,7.25568711 29.149943,7.36441889 29.4695931,7.5810991 L30.0868088,7.99349571 C30.6045733,8.35153439 30.8910865,8.9262493 30.8910865,9.49008864 C30.8910865,9.89160969 30.7474379,10.2923752 30.4830375,10.6286628 L30.4388381,10.7482661 L30.5382873,10.921458 L31.5635519,11.4744218 C32.0481593,11.7237247 32.3899141,12.1796236 32.5004177,12.7108561 L32.9739929,15.0750486 L33.040291,15.1837804 L33.1728892,15.2272727 L33.2944371,15.1837804 L34.9479698,13.6980432 L35.0142679,13.5566927 L35.0142679,13.5349455 L34.8595709,11.88689 L34.8485206,11.7245697 C34.8485206,11.1172281 35.1681707,10.5316376 35.6969876,10.1953501 L36.5454545,9.66411754 C36.1926473,9.00241801 35.7411769,8.39507641 35.211572,7.86384388 C33.8556049,6.54044481 32.0039578,5.72730255 29.9541156,5.72730255 L29.9541641,5.72727273 Z M26.6963794,16.1934075 C26.0488357,16.1934075 25.401292,15.9192034 24.9452654,15.4058061 C24.8130085,15.2742563 24.7176699,15.2383795 24.5613738,15.2272727 C24.3818806,15.2272727 24.1895083,15.3349053 24.093321,15.5373624 L24.0821567,15.549322 L23.5909091,16.6350294 C24.1302394,17.7685841 24.9341011,18.7705804 25.9295239,19.5454545 L26.9850116,18.9133353 C27.4530643,18.6391312 27.764821,18.1616194 27.8129036,17.6132113 L27.9090909,16.7786372 L27.9090909,16.718841 C27.9090909,16.4326751 27.6694912,16.1943566 27.3817868,16.1943566 L26.6963794,16.1934075 Z M21,13.4885072 C21.0115453,11.2315344 21.7949619,9.15907131 23.1301163,7.52381628 C23.1647513,7.47763605 23.1878427,7.44300141 23.2224777,7.40836465 C24.9616786,5.32448058 27.5749661,4 30.5115288,4 C34.415405,4 37.7775688,6.36104988 39.2281168,9.74619247 C39.2396625,9.76928364 39.2512082,9.78082711 39.2512082,9.80391828 C39.2858431,9.87318757 39.3204781,9.94245896 39.3435695,10.022459 C39.7699094,11.0936713 40,12.2680319 40,13.4884565 C40,18.7389636 35.7505341,22.988389 30.5115879,23 C28.5769399,23 26.7692121,22.412862 25.2726418,21.4224412 C25.2495504,21.4224412 25.2264611,21.39935 25.2149154,21.3878066 C25.1687347,21.3647154 25.1340998,21.3300808 25.0879191,21.2954461 C23.6604456,20.2943221 22.5083461,18.9122297 21.8173784,17.2999856 C21.7711977,17.2191708 21.7365628,17.1383559 21.7134714,17.0583707 C21.7019263,17.0121905 21.69038,16.9660102 21.69038,16.91983 L21.655745,16.9313756 C21.2302284,15.8609865 21.0001379,14.6974137 21.0001379,13.488389 L21,13.4885072 Z M22.7272854,13.5568849 C22.7272854,13.8879438 22.7503766,14.2190237 22.7965548,14.5271888 C23.2228917,14.0596048 23.8216,13.8078368 24.4318349,13.8078368 C25.0420698,13.8078368 25.6638525,14.0702355 26.1017582,14.5615294 C26.2056645,14.6759728 26.331826,14.7323763 26.4819253,14.7323763 L27.1383511,14.7323763 C28.3819164,14.7323763 29.3723184,15.7370208 29.3723184,16.9468297 L29.3599494,17.1748878 L29.2791344,17.9735308 C29.1636825,19.0353886 28.564991,19.9713728 27.6438543,20.519043 L27.4368671,20.6449291 C28.3810994,21.0446691 29.4176711,21.2727273 30.5110527,21.2727273 C32.6527648,21.2612825 34.5873779,20.4054241 36.0041379,19.0124446 C37.4093291,17.6080811 38.2727273,15.6796735 38.2727273,13.5560416 C38.2727273,12.8939029 38.1919122,12.2546579 38.019564,11.6383066 L37.4439512,12.003706 L37.3515905,12.1745529 L37.3515905,12.1974424 L37.5132206,13.9320697 L37.5247662,14.1029166 C37.5247662,14.6391608 37.2946984,15.1533275 36.8914359,15.518727 L35.163793,17.0710626 C34.7951736,17.4135683 34.3234692,17.5729662 33.874039,17.5729662 C33.4361544,17.5729662 33.0221674,17.4356354 32.6766435,17.1732262 C32.3311196,16.8993807 32.0664086,16.4996407 31.9740479,16.0320775 L31.4677214,13.5436949 L31.3753607,13.4063641 L30.292598,12.8243533 C29.64772,12.4818476 29.2906483,11.808262 29.2906483,11.1461442 C29.2906483,10.7349783 29.4291893,10.3017138 29.7169852,9.94776123 L29.7631655,9.82187514 L29.6708048,9.66165687 L29.0259268,9.21615037 L28.9104749,9.18181818 L28.726579,9.28808558 L28.2771466,10.1439419 C27.9431704,10.77174 27.2867446,11.17148 26.5726013,11.17148 L25.2135799,11.17148 C24.4878889,11.17148 23.8545585,10.7831869 23.5321301,10.1782824 C23.0150792,11.1943738 22.7272727,12.3469065 22.7272727,13.5568828 L22.7272854,13.5568849 Z" id="html"></path>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/48px/directory.svg000064400000003767151215013530013746 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="18px" height="17px" viewBox="0 0 18 17" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>file</title>
    <desc>Created with Sketch.</desc>
    <defs>
        <path d="M6.10757692,1.63636364 L2.45454545,1.63636364 C2.00267611,1.63636364 1.63636364,2.00267611 1.63636364,2.45454545 L1.63636364,13.9090909 C1.63636364,14.3609602 2.00267611,14.7272727 2.45454545,14.7272727 L15.5454545,14.7272727 C15.9973239,14.7272727 16.3636364,14.3609602 16.3636364,13.9090909 L16.3636364,4.90909091 C16.3636364,4.45722157 15.9973239,4.09090909 15.5454545,4.09090909 L8.18181818,4.09090909 C7.90825648,4.09090909 7.65279449,3.95418998 7.50104976,3.72657289 L6.10757692,1.63636364 Z M8.6196958,2.45454545 L15.5454545,2.45454545 C16.9010626,2.45454545 18,3.55348289 18,4.90909091 L18,13.9090909 C18,15.2646989 16.9010626,16.3636364 15.5454545,16.3636364 L2.45454545,16.3636364 C1.09893743,16.3636364 0,15.2646989 0,13.9090909 L0,2.45454545 C-1.81672859e-16,1.09893743 1.09893743,0 2.45454545,0 L6.54545455,0 C6.81901624,0 7.07447824,0.136719111 7.22622297,0.364336203 L8.6196958,2.45454545 Z" id="path-1"></path>
    </defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-267.000000, -125.000000)">
            <g id="content" transform="translate(244.000000, 69.000000)">
                <g id="row-01" transform="translate(1.000000, 51.000000)">
                    <g id="file" transform="translate(22.000000, 5.000000)">
                        <mask id="mask-2" fill="white">
                            <use xlink:href="#path-1"></use>
                        </mask>
                        <use id="Shape" fill="#8591B0" fill-rule="nonzero" xlink:href="#path-1"></use>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/48px/directory.png000064400000002003151215013530013711 0ustar00�PNG


IHDR00W���IDATh���n�D��+�I�HT�J�@aH��Q�R��eY�'�<J�����-
"�ק�3���̵���~�c{f<�;��;�����,*/��d	��9gp�J�W8G�\;���Ε����wQ�~���Tc�G�u�)��D���Z�{�f͹9��b��K>�\�Ǜǟ�88��E�%�S<Ek�h7h�+���}�n߽���=MdDG���OD��+�/Y�px|�~K�@�ƈ&/ۈ���W�z��‣�/�w|� ���@�{�|��b��]���j�?g��}�����"!Q��M��_`�7����;2�o��Eͥ�5��#�V���}I��IkKBJ!De��@�J݊�����֍���ܖ�6���赣��N$�֤�V�����g��(O!�&!DE���ck!U�k�ЀH�����ﶠ�,:"�P`��{�M6�R,�b���dL4����k�
VN��_�)�jeTU�ީ�䙇x��#n'�LI�����l憼O��S��b��s��uQ���^E�����r���,��̥����k7$.�<�߾[����} ��P�+o�ۇxp<٬Cާ�{����I�t�8xP?��i)y�U�^�Z���7)���=�%��_�G��]�4U�&�n7zC��QVĽ��t\����&
Qy�
��s�)��A���Ă֤K�X/:�M�Du��
���
j�����?�p7�:ӏ
AYz�._�i�l���5Оc#DX-��F����f��O���CRާ�w�5υ�+`	\�au�BfԨ�<䓯W��d���<C䳡U�ݏ*
����;~x�c�s�x
mY�9w��� _"ra�i��)�*�N�r�G;�5��΃�w�}�+R<h���-��nr���<�A�{4�i\P��79|�,%�a�6��(;��͔�IEND�B`�themes/light/images/48px/text_file.svg000064400000006363151215013530013720 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="16px" height="20px" viewBox="0 0 16 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>textfile</title>
    <desc>Created with Sketch.</desc>
    <defs>
        <path d="M24.2222222,15.1111111 L19.7777778,15.1111111 C19.286858,15.1111111 18.8888889,14.713142 18.8888889,14.2222222 L18.8888889,9.77777778 L12.6666667,9.77777778 C12.1757469,9.77777778 11.7777778,10.1757469 11.7777778,10.6666667 L11.7777778,24.8888889 C11.7777778,25.3798087 12.1757469,25.7777778 12.6666667,25.7777778 L23.3333333,25.7777778 C23.8242531,25.7777778 24.2222222,25.3798087 24.2222222,24.8888889 L24.2222222,15.1111111 L25.1111111,15.1111111 C25.6020309,15.1111111 26,14.713142 26,14.2222222 C26,14.0994923 25.9751269,13.9825718 25.9301467,13.8762266 C25.9765874,13.9888881 26,14.1043482 26,14.2222222 L26,24.8888889 C26,26.3616482 24.8060927,27.5555556 23.3333333,27.5555556 L12.6666667,27.5555556 C11.1939073,27.5555556 10,26.3616482 10,24.8888889 L10,10.6666667 C10,9.19390733 11.1939073,8 12.6666667,8 L19.7777778,8 C20.0135258,8 20.2396181,8.09365052 20.4063171,8.26034953 L25.7396505,13.5936829 C25.823,13.6770324 25.8880874,13.7752302 25.9323374,13.8820592 Z M20.6666667,11.0348565 L20.6666667,13.3333333 L22.9651435,13.3333333 L20.6666667,11.0348565 Z M21.5555556,17.7777778 C22.0464753,17.7777778 22.4444444,18.1757469 22.4444444,18.6666667 C22.4444444,19.1575864 22.0464753,19.5555556 21.5555556,19.5555556 L14.4444444,19.5555556 C13.9535247,19.5555556 13.5555556,19.1575864 13.5555556,18.6666667 C13.5555556,18.1757469 13.9535247,17.7777778 14.4444444,17.7777778 L21.5555556,17.7777778 Z M21.5555556,21.3333333 C22.0464753,21.3333333 22.4444444,21.7313024 22.4444444,22.2222222 C22.4444444,22.713142 22.0464753,23.1111111 21.5555556,23.1111111 L14.4444444,23.1111111 C13.9535247,23.1111111 13.5555556,22.713142 13.5555556,22.2222222 C13.5555556,21.7313024 13.9535247,21.3333333 14.4444444,21.3333333 L21.5555556,21.3333333 Z M16.2222222,14.2222222 C16.713142,14.2222222 17.1111111,14.6201913 17.1111111,15.1111111 C17.1111111,15.6020309 16.713142,16 16.2222222,16 L14.4444444,16 C13.9535247,16 13.5555556,15.6020309 13.5555556,15.1111111 C13.5555556,14.6201913 13.9535247,14.2222222 14.4444444,14.2222222 L16.2222222,14.2222222 Z" id="path-1"></path>
    </defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-978.000000, -26.000000)">
            <g id="menu-head-footer" transform="translate(-1.000000, 0.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="tools" transform="translate(99.000000, 18.000000)">
                        <g id="textfile" transform="translate(869.000000, 0.000000)">
                            <mask id="mask-2" fill="white">
                                <use xlink:href="#path-1"></use>
                            </mask>
                            <use fill="#8591B0" fill-rule="nonzero" xlink:href="#path-1"></use>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/48px/php_file.svg000064400000005666151215013530013530 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="20px" height="21px" viewBox="0 0 20 21" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>php</title>
    <desc>Created with Sketch.</desc>
    <defs></defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-267.000000, -332.000000)" fill="#8591B0">
            <g id="content" transform="translate(244.000000, 69.000000)">
                <g id="row-08" transform="translate(1.000000, 261.000000)">
                    <g id="php" transform="translate(23.000000, 3.000000)">
                        <path d="M15.4375,6.53125 L15.4375,4.15625 C15.4382429,3.9981643 15.3766411,3.846759 15.2653125,3.734678 L11.7028125,0.172178 C11.5907429,0.0608494 11.4393395,-0.00076 11.2812405,-1.9e-05 L1.7812405,-1.9e-05 C0.7978385,-1.9e-05 -9.512901e-06,0.7978385 -9.512901e-06,1.7812405 L-9.512901e-06,17.2187405 C-9.512901e-06,18.2021425 0.7978385,18.9999905 1.7812405,18.9999905 L5.9374905,18.9999905 L5.9374905,17.8124905 L1.7812405,17.8124905 C1.4531865,17.8124905 1.1874905,17.5467945 1.1874905,17.2187405 L1.1874905,1.7812405 C1.1874905,1.4531865 1.4531865,1.1874905 1.7812405,1.1874905 L10.6874905,1.1874905 L10.6874905,3.5624905 C10.6874905,3.8771685 10.8129209,4.1792495 11.0355705,4.4019105 C11.2582201,4.6245715 11.5602935,4.7499905 11.8749905,4.7499905 L14.2499905,4.7499905 L14.2499905,6.5312405 L15.4375,6.53125 Z" id="Fill-1" stroke="#8591B0" stroke-width="0.5"></path>
                        <path d="M7.71875,9.5 L5.34375,9.5 C5.015696,9.5 4.75,9.765696 4.75,10.09375 L4.75,15.4375 L5.9375,15.4375 L5.9375,13.65625 L7.71875,13.65625 C8.033428,13.65625 8.335509,13.5308196 8.55817,13.30817 C8.780831,13.0855204 8.90625,12.783447 8.90625,12.46875 L8.90625,10.6875 C8.90625,10.372822 8.7808196,10.070741 8.55817,9.84808 C8.3355204,9.625419 8.033447,9.5 7.71875,9.5 Z M7.71875,12.46875 L5.9375,12.46875 L5.9375,10.6875 L7.71875,10.6875 L7.71875,12.46875 Z" id="Fill-2"></path>
                        <path d="M17.8125,9.5 L15.4375,9.5 C15.109446,9.5 14.84375,9.765696 14.84375,10.09375 L14.84375,15.4375 L16.03125,15.4375 L16.03125,13.65625 L17.8125,13.65625 C18.127178,13.65625 18.429259,13.5308196 18.65192,13.30817 C18.874581,13.0855204 19,12.783447 19,12.46875 L19,10.6875 C19,10.372822 18.8745696,10.070741 18.65192,9.84808 C18.4292704,9.625419 18.127197,9.5 17.8125,9.5 Z M17.8125,12.46875 L16.03125,12.46875 L16.03125,10.6875 L17.8125,10.6875 L17.8125,12.46875 Z" id="Fill-3"></path>
                        <polygon id="Fill-4" points="13.0625 11.875 10.6875 11.875 10.6875 9.5 9.5 9.5 9.5 15.4375 10.6875 15.4375 10.6875 13.0625 13.0625 13.0625 13.0625 15.4375 14.25 15.4375 14.25 9.5 13.0625 9.5"></polygon>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/directory_opened.svg000064400000005002151215013530014455 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="18px" height="18px" viewBox="0 0 18 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>server</title>
    <desc>Created with Sketch.</desc>
    <defs>
        <path d="M2.45454545,1.63636364 C2.00267611,1.63636364 1.63636364,2.00267611 1.63636364,2.45454545 L1.63636364,5.72727273 C1.63636364,6.17914207 2.00267611,6.54545455 2.45454545,6.54545455 L15.5454545,6.54545455 C15.9973239,6.54545455 16.3636364,6.17914207 16.3636364,5.72727273 L16.3636364,2.45454545 C16.3636364,2.00267611 15.9973239,1.63636364 15.5454545,1.63636364 L2.45454545,1.63636364 Z M2.45454545,0 L15.5454545,0 C16.9010626,-1.81672859e-16 18,1.09893743 18,2.45454545 L18,5.72727273 C18,7.08288075 16.9010626,8.18181818 15.5454545,8.18181818 L2.45454545,8.18181818 C1.09893743,8.18181818 1.81672859e-16,7.08288075 0,5.72727273 L0,2.45454545 C-1.81672859e-16,1.09893743 1.09893743,2.72509288e-16 2.45454545,0 Z M2.45454545,9.81818182 L15.5454545,9.81818182 C16.9010626,9.81818182 18,10.9171193 18,12.2727273 L18,15.5454545 C18,16.9010626 16.9010626,18 15.5454545,18 L2.45454545,18 C1.09893743,18 1.81672859e-16,16.9010626 0,15.5454545 L0,12.2727273 C-1.81672859e-16,10.9171193 1.09893743,9.81818182 2.45454545,9.81818182 Z M2.45454545,11.4545455 C2.00267611,11.4545455 1.63636364,11.8208579 1.63636364,12.2727273 L1.63636364,15.5454545 C1.63636364,15.9973239 2.00267611,16.3636364 2.45454545,16.3636364 L15.5454545,16.3636364 C15.9973239,16.3636364 16.3636364,15.9973239 16.3636364,15.5454545 L16.3636364,12.2727273 C16.3636364,11.8208579 15.9973239,11.4545455 15.5454545,11.4545455 L2.45454545,11.4545455 Z" id="path-1"></path>
    </defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-46.000000, -93.000000)">
            <g id="menu-head-footer" transform="translate(-1.000000, 0.000000)">
                <g id="side-bar" transform="translate(1.000000, 69.000000)">
                    <g id="server" transform="translate(46.000000, 24.000000)">
                        <mask id="mask-2" fill="white">
                            <use xlink:href="#path-1"></use>
                        </mask>
                        <use id="Combined-Shape" fill="#8591B0" fill-rule="nonzero" xlink:href="#path-1"></use>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/close.png000064400000000420151215013530012210 0ustar00�PNG


IHDR->`�7bKGD�������	pHYs���o�dtIME�
/MX;tEXtCommentCreated with GIMPW�xIDATX���A
�P�1�����3Mۈ
~���V��P��$4˂�1�h��6z,��|�g&"�N���Ժ�"9T�T5�������Y�r�>,I-�ǿǣ�"�<y^Q$U9��w�h��6�h�H�h,[MxIEND�B`�themes/light/images/16px/rm.svg000064400000005172151215013530012343 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="21px" height="17px" viewBox="0 0 21 17" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>delete</title>
    <desc>Created with Sketch.</desc>
    <defs>
        <path d="M14.3624369,8.5 L16.3687184,10.5062816 C16.7104272,10.8479903 16.7104272,11.4020097 16.3687184,11.7437184 C16.0270097,12.0854272 15.4729903,12.0854272 15.1312816,11.7437184 L13.125,9.73743687 L11.1187184,11.7437184 C10.7770097,12.0854272 10.2229903,12.0854272 9.88128157,11.7437184 C9.53957281,11.4020097 9.53957281,10.8479903 9.88128157,10.5062816 L11.8875631,8.5 L9.88128157,6.49371843 C9.53957281,6.15200968 9.53957281,5.59799032 9.88128157,5.25628157 C10.2229903,4.91457281 10.7770097,4.91457281 11.1187184,5.25628157 L13.125,7.26256313 L15.1312816,5.25628157 C15.4729903,4.91457281 16.0270097,4.91457281 16.3687184,5.25628157 C16.7104272,5.59799032 16.7104272,6.15200968 16.3687184,6.49371843 L14.3624369,8.5 Z M18.375,0.625 C19.8247475,0.625 21,1.80025253 21,3.25 L21,13.75 C21,15.1997475 19.8247475,16.375 18.375,16.375 L7,16.375 C6.74768274,16.375 6.50764747,16.2660796 6.34149539,16.0761915 L0.216495392,9.07619153 C-0.0721651307,8.74629379 -0.0721651307,8.25370621 0.216495392,7.92380847 L6.34149539,0.923808468 C6.50764747,0.733920378 6.74768274,0.625 7,0.625 L18.375,0.625 Z M18.375,14.625 C18.8582492,14.625 19.25,14.2332492 19.25,13.75 L19.25,3.25 C19.25,2.76675084 18.8582492,2.375 18.375,2.375 L7.3970472,2.375 L2.0376722,8.5 L7.3970472,14.625 L18.375,14.625 Z" id="path-1"></path>
    </defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-579.000000, -27.000000)">
            <g id="menu-head-footer" transform="translate(-1.000000, 0.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="tools" transform="translate(99.000000, 18.000000)">
                        <g id="delete" transform="translate(474.000000, 0.000000)">
                            <g transform="translate(6.000000, 9.000000)">
                                <mask id="mask-2" fill="white">
                                    <use xlink:href="#path-1"></use>
                                </mask>
                                <use id="Combined-Shape" fill="#8591B0" fill-rule="nonzero" xlink:href="#path-1"></use>
                            </g>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/invert_selection.svg000064400000004245151215013530015301 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="18px" height="18px" viewBox="0 0 18 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>invert_selection</title>
    <desc>Created with Sketch.</desc>
    <defs>
        <path d="M9.8,9.8 L9.8,14.3 L14.3,14.3 L14.3,9.8 L9.8,9.8 Z M8.9,8 L15.2,8 C15.6970563,8 16.1,8.40294373 16.1,8.9 L16.1,15.2 C16.1,15.6970563 15.6970563,16.1 15.2,16.1 L8.9,16.1 C8.40294373,16.1 8,15.6970563 8,15.2 L8,8.9 C8,8.40294373 8.40294373,8 8.9,8 Z M18.8,8 L25.1,8 C25.5970563,8 26,8.40294373 26,8.9 L26,15.2 C26,15.6970563 25.5970563,16.1 25.1,16.1 L18.8,16.1 C18.3029437,16.1 17.9,15.6970563 17.9,15.2 L17.9,8.9 C17.9,8.40294373 18.3029437,8 18.8,8 Z M18.8,17.9 L25.1,17.9 C25.5970563,17.9 26,18.3029437 26,18.8 L26,25.1 C26,25.5970563 25.5970563,26 25.1,26 L18.8,26 C18.3029437,26 17.9,25.5970563 17.9,25.1 L17.9,18.8 C17.9,18.3029437 18.3029437,17.9 18.8,17.9 Z M19.7,24.2 L24.2,24.2 L24.2,19.7 L19.7,19.7 L19.7,24.2 Z M8.9,17.9 L15.2,17.9 C15.6970563,17.9 16.1,18.3029437 16.1,18.8 L16.1,25.1 C16.1,25.5970563 15.6970563,26 15.2,26 L8.9,26 C8.40294373,26 8,25.5970563 8,25.1 L8,18.8 C8,18.3029437 8.40294373,17.9 8.9,17.9 Z" id="path-1"></path>
    </defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-1157.000000, -26.000000)">
            <g id="menu-head-footer" transform="translate(-1.000000, -4.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="tools" transform="translate(99.000000, 0.000000)">
                        <g id="invert_selection" transform="translate(1050.000000, 22.000000)">
                            <mask id="mask-2" fill="white">
                                <use xlink:href="#path-1"></use>
                            </mask>
                            <use fill="#8591B0" fill-rule="nonzero" xlink:href="#path-1"></use>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/view-list.svg000064400000003152151215013530013644 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="18px" height="15px" viewBox="0 0 18 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>Page 1</title>
    <desc>Created with Sketch.</desc>
    <defs></defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-853.000000, -28.000000)" fill="#8591B0">
            <g id="menu-head-footer" transform="translate(-1.000000, 0.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="tools" transform="translate(99.000000, 18.000000)">
                        <g id="view" transform="translate(745.000000, 0.000000)">
                            <path d="M14.1988335,16.3986714 L26.3299999,16.3986714 L26.3299999,18.1321497 L14.1988335,18.1321497 L14.1988335,16.3986714 Z M14.1988335,10.33392 L26.3299999,10.33392 L26.3299999,12.0665873 L14.1988335,12.0665873 L14.1988335,10.33392 Z M14.1988335,22.4642546 L26.3299999,22.4642546 L26.3299999,24.1969219 L14.1988335,24.1969219 L14.1988335,22.4642546 Z M9,16.3986714 L11.5994166,16.3986714 L11.5994166,18.1321497 L9,18.1321497 L9,16.3986714 Z M9,10.33392 L11.5994166,10.33392 L11.5994166,12.0665873 L9,12.0665873 L9,10.33392 Z M9,22.4642546 L11.5994166,22.4642546 L11.5994166,24.1969219 L9,24.1969219 L9,22.4642546 Z" id="Page-1"></path>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/back.svg000064400000003766151215013530012634 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="14px" height="12px" viewBox="0 0 14 12" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>arrow_left</title>
    <desc>Created with Sketch.</desc>
    <defs>
        <path d="M2.81066017,6.75 L6.03033009,9.96966991 C6.3232233,10.2625631 6.3232233,10.7374369 6.03033009,11.0303301 C5.73743687,11.3232233 5.26256313,11.3232233 4.96966991,11.0303301 L0.469669914,6.53033009 C0.176776695,6.23743687 0.176776695,5.76256313 0.469669914,5.46966991 L4.96966991,0.969669914 C5.26256313,0.676776695 5.73743687,0.676776695 6.03033009,0.969669914 C6.3232233,1.26256313 6.3232233,1.73743687 6.03033009,2.03033009 L2.81066017,5.25 L13,5.25 C13.4142136,5.25 13.75,5.58578644 13.75,6 C13.75,6.41421356 13.4142136,6.75 13,6.75 L2.81066017,6.75 Z" id="path-1"></path>
    </defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-30.000000, -29.000000)">
            <g id="menu-head-footer" transform="translate(-1.000000, -4.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="arrow" transform="translate(20.000000, 22.000000)">
                        <g id="Group-2">
                            <g id="Group">
                                <g id="arrow_left" transform="translate(10.000000, 11.000000)">
                                    <mask id="mask-2" fill="white">
                                        <use xlink:href="#path-1"></use>
                                    </mask>
                                    <use id="Combined-Shape" fill="#8591B0" fill-rule="nonzero" xlink:href="#path-1"></use>
                                </g>
                            </g>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/duplicate.png000064400000002653151215013530013665 0ustar00�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<&iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CC 2014 (Windows)" xmpMM:InstanceID="xmp.iid:2517F42F206311E8869EB41DF35937A8" xmpMM:DocumentID="xmp.did:2517F430206311E8869EB41DF35937A8"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:2517F42D206311E8869EB41DF35937A8" stRef:documentID="xmp.did:2517F42E206311E8869EB41DF35937A8"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>r0IDATxڤ�?hQ�g�{�w�;CD�*�$E�4jR(h)b!��@E$X�M*K�4Z&"����`��4!D""b��#����7��]nϋ����7���7��{���4��'�4(�����jT)+T�l�N�G�Y�H�؝��RP�!���}*��\��n�nPH�E){�h�_p�<!�.��Zi�Y�p=Π�h<��N��T���E0Z�Dj@����g�}�AҢ�E?�§g�O}����6�CmХ?����m ~��sI��pX@�T��o�租��X��+S�~
P�jcA!W��&=q�m��I�6�������������w�*��>2{@l��h�KZ��2e�j��-+��S�Q��n_��u:�;7��g͞#�m@]�d��|���2��L�W�|�\�����n"8�o�+������@���M����i��b��G����6��}�h3.6�;_ف��ӏH��>9�`-��nFN^{�za2�)�&�<%�~��c�0�P�X��IEND�B`�themes/light/images/16px/invert_selection.png000064400000001345151215013530015264 0ustar00�PNG


IHDR�a	pHYs���IDATx�mSMOQ}?�����B7�d�ig�}3�BV�X%�!і��|t�J+�`�ј�U�NiA&L*��;�/��ˤ��{ι����.*>��x���r���g�e�E"�s%K��$�	�O��T~J@����1۶E�0DC�E�`���G�&�}�ʁ�v���`y�sa[''		A`���߱�[��+�ͭ��6���� �v���I*}���:>>���#��.䋯Sn�Wh|�(4�f�'9��D`|xx��ȹ�E�	|���h�?D�J�L9�;/`�j+��ީ��6J�Y{�G8W�$�كٹqw}{�(o,�e���t�av����k���������7��,�I�0W	�
�~٪��A]s[��ת_�i����	����W6���fV��[�73?.cS�9cZRf�3Un�n�a���@q�;�ڛ�~&CYt��!��ph�Ȑ4fLQ�u[4_/�^$�0�^��|^�F�a}��A�y�61�(�	��t�]��r"%�'@	��uZ�LQ���ӴkoW�pNNB0]������7�7��A#f�Q����+�ٹ�EǖqOd�Ӕ3���H@F�Ð�ݒ46)�a�]J�;A��i����(�G8z��i夸�҃"���}Q�@$r����IEND�B`�themes/light/images/16px/help.png000064400000003315151215013530012637 0ustar00�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<&iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CC 2014 (Windows)" xmpMM:InstanceID="xmp.iid:96D5840E206211E89A85CFDC7B8FB1F0" xmpMM:DocumentID="xmp.did:96D5840F206211E89A85CFDC7B8FB1F0"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:96D5840C206211E89A85CFDC7B8FB1F0" stRef:documentID="xmp.did:96D5840D206211E89A85CFDC7B8FB1F0"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>9L�=IDATxڜS]h\E���ν�{�&��&�/)%�j�4
VAT|��b냴}��>m�/B�ǖ
BDE���Ci��?�����$l�����ݻw����_=�̜��|�|g��333�����8����/=B��M�ڤ��"��:1�������uw@)�J�GA0�(o�:`�V�5dd�g\����]�����C$�4��Yƙ'�pO�/��Z2k��t�g��ÙV����*!��-���>?�A�:����6��� ȿ�Vka��F�;��Ӥ�X�8�}�\�g=�A
9�^!�~)[��l+}أ��8�
6��zߕj;�J\9�8Oؤ�!壎�c����Ok������U.mC�B��tޒMS�h�_��̧V�,������R��s���[��@�	���8���==�mq����@����52�U�ÉTe���N���^:y��x��T�%�$Tm�Ȁ�:DeC�]��`�;y�L~`,F�1��v�9`�Yj��0�[�~ɷ�(�i��#�&Η�W�ǟ�Q��oK��U9�ӽ�-���&`�����֖{�r3��9v8��~��'�lƨ�ɍ�@�~7n����M�Au:����G�I��/~�U\\�j��|%i��o�xN�+�~k��jM���F#��\t�k'�{��wX��{*ۺ����u����fu�qxq���H�]�š�#�
Zc�Qƞ�B~!0MI��v��k�/��N���]�� �[m>�i��1:���o,:S,Pש�~��t�})�=�F�^9������8�T!
/V�9�q�7����?�_��I*+�IEND�B`�themes/light/images/16px/view.png000064400000003014151215013530012655 0ustar00�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<&iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CC 2014 (Windows)" xmpMM:InstanceID="xmp.iid:9969F182206511E89DD3E16E42412FCA" xmpMM:DocumentID="xmp.did:9969F183206511E89DD3E16E42412FCA"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:9969F180206511E89DD3E16E42412FCA" stRef:documentID="xmp.did:9969F181206511E89DD3E16E42412FCA"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>�<��|IDATxڤS�ka}3�]E<�B�+#ZXX���E�I�($ ;��J�@$��`l�/H�,,-�G�A.������vg��ޛ�͛Yqw�ϕ�����I8RQӷ�,Y����K-�nJ�>���K[��$���޵J��s�iӞ�Ƚ��}U}�3�0��Ux�*<�$)�q���	��	�]�q*,�����Ղ	�H�*�g���>�Wi���:�;R3(�O\�w�@dY"�������s�R�K�7j	�uJ\������]�j��^`;��Ǥ��q�N�]�9����fh�0����^��.��}��2O}J�/��Y2�
s[��9
��C둀]�q}�"6	n�\ޱ������ułF�<�����o�b�f�q���=Nӻ$�m���^����úy�'�v���$bZw�n1��	H/�')�d�v� �d�<�>$�h�m<����
	�6�d�٣�(��T�2�����t��X�z.0��+4j�n�:O֌��~�^�d��\�7򗕳��?y�)Y��z�eIt�?E����z�.���ǓZ+�B��{4�3�y����q?�Ý
��l��e�1H�#�!q*r{C#ډH�ΒH��H�O��X�(�>qIEND�B`�themes/light/images/16px/edit.svg000064400000004320151215013530012644 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="18px" height="20px" viewBox="0 0 18 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>edit</title>
    <desc>Created with Sketch.</desc>
    <defs>
        <path d="M10.6666667,2.84517797 L2.33333333,11.1785113 L2.33333333,13.3333333 L4.48815536,13.3333333 L12.8214887,5 L10.6666667,2.84517797 Z M11.2559223,1.07741102 L14.5892557,4.41074435 C14.9146926,4.73618126 14.9146926,5.26381874 14.5892557,5.58925565 L5.42258898,14.7559223 C5.26630867,14.9122026 5.05434707,15 4.83333333,15 L1.5,15 C1.03976271,15 0.666666667,14.626904 0.666666667,14.1666667 L0.666666667,10.8333333 C0.666666667,10.6123196 0.754464034,10.400358 0.910744349,10.2440777 L10.077411,1.07741102 C10.4028479,0.751974106 10.9304854,0.751974106 11.2559223,1.07741102 Z M1.5,19.1666667 C1.03976271,19.1666667 0.666666667,18.7935706 0.666666667,18.3333333 C0.666666667,17.873096 1.03976271,17.5 1.5,17.5 L16.5,17.5 C16.9602373,17.5 17.3333333,17.873096 17.3333333,18.3333333 C17.3333333,18.7935706 16.9602373,19.1666667 16.5,19.1666667 L1.5,19.1666667 Z" id="path-1"></path>
    </defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-695.000000, -25.000000)">
            <g id="menu-head-footer" transform="translate(-1.000000, 0.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="tools" transform="translate(99.000000, 18.000000)">
                        <g id="edit" transform="translate(587.000000, 0.000000)">
                            <g transform="translate(9.000000, 7.000000)">
                                <mask id="mask-2" fill="white">
                                    <use xlink:href="#path-1"></use>
                                </mask>
                                <use id="Combined-Shape" fill="#8591B0" fill-rule="nonzero" xlink:href="#path-1"></use>
                            </g>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/rename.svg000064400000004014151215013530013166 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="22px" height="19px" viewBox="0 0 22 19" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>rename</title>
    <desc>Created with Sketch.</desc>
    <defs></defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-658.000000, -26.000000)" stroke="#8591B0" stroke-width="2">
            <g id="menu-head-footer" transform="translate(-1.000000, 0.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="tools" transform="translate(99.000000, 18.000000)">
                        <g id="rename" transform="translate(553.000000, 0.000000)">
                            <g transform="translate(7.000000, 9.000000)">
                                <polyline id="Stroke-1" points="15.9128333 12.063619 19.8814167 12.063619 19.8814167 4.12645238 15.9128333 4.12645238"></polyline>
                                <polyline id="Stroke-2" points="9.04771429 4.12675 0.119071429 4.12675 0.119071429 12.0639167 9.04771429 12.0639167"></polyline>
                                <path d="M16.9842857,0.159059526 L15.0004405,0.159059526 C13.9094595,0.159059526 13.0165952,1.05192381 13.0165952,2.14290476 L13.0165952,14.0477619 C13.0165952,15.1387429 13.9094595,16.0316071 15.0004405,16.0316071 L16.9842857,16.0316071" id="Stroke-4" stroke-linejoin="round"></path>
                                <path d="M9.04771429,16.0319048 L11.0315595,16.0319048 C12.1225405,16.0319048 13.0154048,15.1390405 13.0154048,14.0480595 L13.0163373,2.14320238 C13.0163373,1.05222143 12.123473,0.159357148 11.0324921,0.159357148 L9.04864683,0.159357148" id="Stroke-5" stroke-linejoin="round"></path>
                            </g>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/fullscreen.svg000064400000007572151215013530014075 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="19px" height="19px" viewBox="0 0 19 19" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>Page 1</title>
    <desc>Created with Sketch.</desc>
    <defs></defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-931.000000, -26.000000)" fill="#8591B0">
            <g id="menu-head-footer" transform="translate(-1.000000, 0.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="tools" transform="translate(99.000000, 18.000000)">
                        <g id="fullscreen" transform="translate(824.000000, 0.000000)">
                            <path d="M15.8617816,15.4109424 L11.2007816,10.7499424 L12.6875016,10.7499424 C13.2054616,10.7499424 13.6250016,10.3304024 13.6250016,9.8124424 C13.6250016,9.2944824 13.2054616,8.8749424 12.6875016,8.8749424 L8.9375012,8.8749424 C8.4195412,8.8749424 8.0000012,9.2944824 8.0000012,9.8124424 L8.0000012,13.5624424 C8.0000012,14.0804024 8.4195412,14.4999424 8.9375012,14.4999424 C9.4554616,14.4999424 9.8750016,14.0804024 9.8750016,13.5624424 L9.8750016,12.0757224 L14.5360016,16.7367224 L14.5367816,16.7359404 C14.7055316,16.8984404 14.9344416,17.0000004 15.1875616,17.0000004 C15.7055216,17.0000004 16.1250616,16.5804604 16.1250616,16.0625004 C16.1250616,15.8093804 16.0234996,15.5804604 15.8602216,15.4117204 L15.8617816,15.4109424 Z M15.1875616,18.8749424 C14.9344416,18.8749424 14.7055216,18.9765044 14.5367816,19.1397824 L14.5359996,19.1382204 L9.8749996,23.7992204 L9.8749996,22.3125004 C9.8749996,21.7945404 9.4554596,21.3750004 8.9375,21.3750004 C8.41954,21.3750004 8,21.7945404 8,22.3125004 L8,26.0625 C8,26.58046 8.41954,27 8.9375,27 L12.6874996,27 C13.2054596,27 13.6249996,26.58046 13.6249996,26.0625 C13.6249996,25.5445404 13.2054596,25.1250004 12.6874996,25.1250004 L11.2007796,25.1250004 L15.8617796,20.4640004 L15.8609996,20.4632184 C16.0234996,20.2944684 16.1250596,20.0655584 16.1250596,19.8124384 C16.1250596,19.2944784 15.7055196,18.8749384 15.1875596,18.8749384 L15.1875616,18.8749424 Z M25.1875616,21.3749424 C24.6696016,21.3749424 24.2500616,21.7944824 24.2500616,22.3124424 L24.2500616,23.7991624 L19.5890616,19.1381624 L19.5882796,19.1389444 C19.4195296,18.9764444 19.1906196,18.8748844 18.9374996,18.8748844 C18.4195396,18.8748844 17.9999996,19.2944244 17.9999996,19.8123844 C17.9999996,20.0655044 18.1015616,20.2944244 18.2648396,20.4631644 L18.2632776,20.4639444 L22.9242776,25.1249444 L21.4375576,25.1249444 C20.9195976,25.1249444 20.5000576,25.5444844 20.5000576,26.0624448 C20.5000576,26.5804048 20.9195976,26.9999448 21.4375576,26.9999448 L25.1875576,26.9999448 C25.7055176,26.9999448 26.1250576,26.5804048 26.1250576,26.0624448 L26.1250576,22.3124444 C26.1250576,21.7944844 25.7055176,21.3749444 25.1875576,21.3749444 L25.1875616,21.3749424 Z M25.1875616,8.8749424 L21.4375616,8.8749424 C20.9196016,8.8749424 20.5000616,9.2944824 20.5000616,9.8124424 C20.5000616,10.3304024 20.9196016,10.7499424 21.4375616,10.7499424 L22.9242816,10.7499424 L18.2632816,15.4109424 L18.2640616,15.4117244 C18.1015616,15.5804744 18.0000016,15.8093844 18.0000016,16.0625044 C18.0000016,16.5804644 18.4195416,17.0000044 18.9375016,17.0000044 C19.1906216,17.0000044 19.4195416,16.8984424 19.5882816,16.7351644 L19.5890636,16.7359444 L24.2500636,12.0757444 L24.2500636,13.5624644 C24.2500636,14.0804244 24.6696036,14.4999644 25.1875636,14.4999644 C25.7055236,14.4999644 26.1250636,14.0804244 26.1250636,13.5624644 L26.1250636,9.8124644 C26.1250636,9.2945044 25.7055236,8.8749644 25.1875636,8.8749644 L25.1875616,8.8749424 Z" id="Page-1"></path>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/getfile.png000064400000002637151215013530013334 0ustar00�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<&iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:DocumentID="xmp.did:498DBCE8213A11E88F89993602753921" xmpMM:InstanceID="xmp.iid:498DBCE7213A11E88F89993602753921" xmp:CreatorTool="Adobe Photoshop CC 2014 (Windows)"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FCBB7AA6212611E8B0DFAC2C16032D46" stRef:documentID="xmp.did:FCBB7AA7212611E8B0DFAC2C16032D46"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>���IDATxڤ�?hA�ߛ����Sɉ6��E�����@L!�����R����$�!��%ZZ���W�I�� )Ҩ zw�۝y~�^097Uf�a�7����:L3{'�������
cT��v�~"c��L߼~yƛ{QB���K? �%��G_�on/��D)�I傀翬}my#7�]j���ܑr��h��;��bE�W�����5��L^=�D)&�C�,-��N�L�
��RX�֧�f7J:�үQ��������c9�
���aq�հ�[mo���t�B|Kek�7�N���,���'Ϟ>1fi�*D�3�G��9h=�^��
�X��NQOi�3�&�p��)o#(�贗*�{���8� ��f~!�sιl��LC}C�#n��0���$��<��6��I�T���R~�v�k��O-8��1j�C�\��{ S���
��<�Qzp��cSU�~=H!��m�F���
ݪu1�	ĭ��a�wP,t�K�uA�����u��G��r�x�W�,IEND�B`�themes/light/images/16px/rename.png000064400000002720151215013530013155 0ustar00�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<&iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CC 2014 (Windows)" xmpMM:InstanceID="xmp.iid:E8C41748206411E8B789D66168141B7C" xmpMM:DocumentID="xmp.did:E8C41749206411E8B789D66168141B7C"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:E8C41746206411E8B789D66168141B7C" stRef:documentID="xmp.did:E8C41747206411E8B789D66168141B7C"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>��zu@IDATxڤS=hQ�������wIca�Q!B"�TD;��F-l���?�]��Vb#����h!�����b<���};��^�	�Mv�c���f�=��C��ǻ3���*�)^�G��5��	8��� ��������g!s[s״�if��:�oR�8��2ta|�V��ݎ�=|z8��h��9�xr-6V��t�D�vo�*��Ї@�%�d##���2^r"��,@�%
�KB��	�T&o�2:|���cP�R��P�~��C+4IH3��PQ�ևd���
��r9�f��f�g M�i�֛Ƨ9 ���Ӄ��$�Fk���={Q��I��j닮���b
Z$�2��$6����/\�;=%k\_�
��|SX��>? ����I)�ŁM�So�s��-�yE���{�]��7N€Y
ZV��&�1Xv�{w.�/|{�=q䲯E��	�y���4��9hw�U=q��V�၁T��%�N��A>�B�C�ΥЋ�2�� ���6���O?�i�p΂�ߓ�ag�2YYK��=v͔e!�pl[X�Z���n�"���z�0e1�B>+�IEND�B`�themes/light/images/16px/cut.svg000064400000007132151215013530012516 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="18px" height="19px" viewBox="0 0 18 19" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>scissors</title>
    <desc>Created with Sketch.</desc>
    <defs>
        <path d="M9.52456136,8.27186588 L15.9845294,1.81189787 C16.3304517,1.46597556 16.8913026,1.46597556 17.2372249,1.81189787 C17.5831472,2.15782017 17.5831472,2.71867104 17.2372249,3.06459335 L7.2624153,13.0394029 C7.57411549,13.5669023 7.75298242,14.1822119 7.75298242,14.8392982 C7.75298242,16.7961302 6.16665661,18.3824561 4.20982454,18.3824561 C2.25299248,18.3824561 0.666666667,16.7961302 0.666666667,14.8392982 C0.666666667,12.8824661 2.25299248,11.2961403 4.20982454,11.2961403 C4.86691081,11.2961403 5.48222046,11.4750072 6.00971982,11.7867074 L8.27186588,9.52456136 L6.00971982,7.2624153 C5.48222046,7.57411549 4.86691081,7.75298242 4.20982454,7.75298242 C2.25299248,7.75298242 0.666666667,6.16665661 0.666666667,4.20982454 C0.666666667,2.25299248 2.25299248,0.666666667 4.20982454,0.666666667 C6.16665661,0.666666667 7.75298242,2.25299248 7.75298242,4.20982454 C7.75298242,4.86691081 7.57411549,5.48222046 7.2624153,6.00971982 L9.52456136,8.27186588 Z M5.49359465,5.43065975 C5.7958769,5.112894 5.98140348,4.6830253 5.98140348,4.20982454 C5.98140348,3.23140851 5.18824058,2.43824561 4.20982454,2.43824561 C3.23140851,2.43824561 2.43824561,3.23140851 2.43824561,4.20982454 C2.43824561,5.18824058 3.23140851,5.98140348 4.20982454,5.98140348 C4.6830253,5.98140348 5.112894,5.7958769 5.43065975,5.49359465 C5.4405681,5.48265473 5.45079835,5.47190261 5.46135048,5.46135048 C5.47190261,5.45079835 5.48265473,5.4405681 5.49359465,5.43065975 Z M5.43065975,13.5555281 C5.112894,13.2532458 4.6830253,13.0677192 4.20982454,13.0677192 C3.23140851,13.0677192 2.43824561,13.8608821 2.43824561,14.8392982 C2.43824561,15.8177142 3.23140851,16.6108771 4.20982454,16.6108771 C5.18824058,16.6108771 5.98140348,15.8177142 5.98140348,14.8392982 C5.98140348,14.3660974 5.7958769,13.9362287 5.49359465,13.618463 C5.48265473,13.6085546 5.47190261,13.5983244 5.46135048,13.5877722 C5.45079835,13.5772201 5.4405681,13.566468 5.43065975,13.5555281 Z M11.0866807,12.3482336 C10.7404455,12.0026244 10.7399379,11.4417738 11.085547,11.0955386 C11.4311561,10.7493034 11.9920068,10.7487958 12.338242,11.0944049 L17.2366578,15.9839628 C17.582893,16.3295719 17.5834005,16.8904226 17.2377914,17.2366578 C16.8921823,17.582893 16.3313317,17.5834005 15.9850965,17.2377914 L11.0866807,12.3482336 Z" id="path-1"></path>
    </defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-503.000000, -26.000000)">
            <g id="menu-head-footer" transform="translate(-1.000000, 0.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="tools" transform="translate(99.000000, 18.000000)">
                        <g id="cut" transform="translate(395.000000, 0.000000)">
                            <g id="scissors" transform="translate(9.000000, 8.000000)">
                                <mask id="mask-2" fill="white">
                                    <use xlink:href="#path-1"></use>
                                </mask>
                                <use id="Combined-Shape" fill="#8591B0" fill-rule="nonzero" xlink:href="#path-1"></use>
                            </g>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/search-default.svg000064400000004105151215013530014607 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="15px" height="15px" viewBox="0 0 15 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>Combined Shape</title>
    <desc>Created with Sketch.</desc>
    <defs>
        <path d="M11.3820189,10.3213587 L14.7803301,13.7196699 C15.0732233,14.0125631 15.0732233,14.4874369 14.7803301,14.7803301 C14.4874369,15.0732233 14.0125631,15.0732233 13.7196699,14.7803301 L10.3213587,11.3820189 C9.23588921,12.2387223 7.86515226,12.75 6.375,12.75 C2.85418472,12.75 0,9.89581528 0,6.375 C0,2.85418472 2.85418472,0 6.375,0 C9.89581528,0 12.75,2.85418472 12.75,6.375 C12.75,7.86515226 12.2387223,9.23588921 11.3820189,10.3213587 Z M9.86981921,9.77380751 C10.7239628,8.89568802 11.25,7.69677529 11.25,6.375 C11.25,3.68261184 9.06738816,1.5 6.375,1.5 C3.68261184,1.5 1.5,3.68261184 1.5,6.375 C1.5,9.06738816 3.68261184,11.25 6.375,11.25 C7.69677529,11.25 8.89568802,10.7239628 9.77380751,9.86981921 C9.788201,9.85258825 9.80348847,9.83585136 9.81966991,9.81966991 C9.83585136,9.80348847 9.85258825,9.788201 9.86981921,9.77380751 Z" id="path-1"></path>
    </defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-1831.000000, -28.000000)">
            <g id="menu-head-footer" transform="translate(-1.000000, 0.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="search" transform="translate(1607.000000, 18.000000)">
                        <g transform="translate(224.000000, 10.000000)">
                            <mask id="mask-2" fill="white">
                                <use xlink:href="#path-1"></use>
                            </mask>
                            <use id="Combined-Shape" fill="#8591B0" fill-rule="nonzero" xlink:href="#path-1"></use>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/help.svg000064400000007173151215013530012660 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="21px" height="21px" viewBox="0 0 21 21" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>Page 1</title>
    <desc>Created with Sketch.</desc>
    <defs></defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-930.000000, -25.000000)" fill="#8591B0">
            <g id="menu-head-footer" transform="translate(-1.000000, 0.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="tools" transform="translate(99.000000, 18.000000)">
                        <g id="about" transform="translate(824.000000, 0.000000)">
                            <path d="M17.03569,28 C19.69765,28 22.25041,26.942608 24.13222,25.0608398 C26.014009,23.1790508 27.07138,20.6262698 27.07138,17.9643098 C27.07138,15.3023498 26.013988,12.7495898 24.13222,10.8677798 C22.250431,8.98599079 19.69765,7.92861979 17.03569,7.92861979 C14.37373,7.92861979 11.82097,8.98601179 9.93916,10.8677798 C8.057371,12.7495688 7,15.3023498 7,17.9643098 C7.00328104,20.6245898 8.061487,23.1756698 9.94336,25.0566398 C11.82433,26.938429 14.37541,27.99664 17.03569,28 Z M17.03569,9.88749979 C19.17664,9.88749979 21.23086,10.7381678 22.74517,12.2525198 C24.259459,13.7668088 25.11019,15.8199998 25.11019,17.9619998 C25.11019,20.1029498 24.260341,22.1571698 22.74601,23.6714798 C21.231721,25.1857688 19.17853,26.0364998 17.03737,26.0373398 C14.89558,26.0373398 12.8422,25.1874908 11.32726,23.6731598 C9.812971,22.1596898 8.9614,20.1056798 8.9614,17.9645198 C8.9638612,15.8235698 9.814525,13.7710298 11.32873,12.2575598 C12.8422,10.7432708 14.89453,9.89253979 17.03569,9.89022979 L17.03569,9.88749979 Z M17.949526,22.8820898 L17.949526,22.8829109 C17.949526,23.3020919 17.696056,23.6802599 17.308858,23.8410359 C16.920841,24.0018161 16.474591,23.9124023 16.17847,23.6162729 C15.881509,23.3193119 15.792931,22.8730619 15.953707,22.4858849 C16.1136682,22.0978679 16.491832,21.8452169 16.911832,21.8452169 C17.187457,21.8452169 17.451595,21.9543182 17.646013,22.1495489 C17.8404268,22.3447838 17.949526,22.6089239 17.949526,22.8845489 L17.949526,22.8820898 Z M13.675606,14.7979298 C13.5845521,14.5395248 13.6009573,14.2565288 13.7199034,14.0104298 C14.0037394,13.4140718 14.4499894,12.9103868 15.0069724,12.5560118 C15.5639554,12.2024558 16.2095584,12.0121538 16.8699034,12.0088568 L16.891231,12.0088568 L16.890412,12.0088568 C17.811619,12.0121391 18.695929,12.3722618 19.357912,13.0120898 C20.019895,13.6527578 20.40955,14.5239218 20.444011,15.4443098 C20.4677998,16.1998268 20.247136,16.9421978 19.815649,17.5623698 C19.384162,18.1833398 18.764011,18.6476519 18.047869,18.8879948 C18.047869,18.8879948 17.9453302,18.9240875 17.9453302,18.9847922 L17.9453302,19.8083933 L17.9445091,19.8083933 C17.9445091,20.3784992 17.4826771,20.8403543 16.9125481,20.8403543 C16.3424401,20.8403543 15.8805871,20.3785223 15.8805871,19.8083933 L15.8805871,18.9847922 C15.8904298,18.0496412 16.4950051,17.2244042 17.3842291,16.9331993 C17.9970091,16.7256605 18.4022461,16.1416043 18.3817291,15.4943633 C18.3398929,14.7035873 17.6918371,14.0801393 16.8994231,14.0686502 C16.3366861,14.0752127 15.8272681,14.4008702 15.5869231,14.9086502 C15.4072744,15.2900942 15.0143371,15.5238872 14.5935181,15.4992752 C14.1726991,15.4754864 13.8092941,15.1974002 13.6755871,14.7979172 L13.675606,14.7979298 Z" id="Page-1"></path>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/home.png000064400000002220151215013530012631 0ustar00�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<&iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:DocumentID="xmp.did:E9DA1FF73BB011E8B39F936E53D95B5E" xmpMM:InstanceID="xmp.iid:E9DA1FF63BB011E8B39F936E53D95B5E" xmp:CreatorTool="Adobe Photoshop CC 2014 (Windows)"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:E4DFA5C9206111E8877DC251126BECAC" stRef:documentID="xmp.did:E4DFA5CA206111E8877DC251126BECAC"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>��IDATx�b���a�0�c�$ ��@�I�j@��q9wಅ�X<�q
�@,��\��Ӂ�gA5��g �ė��|�\`�K�~��:`�3@����& �bA<��k��Q\p����>���@�*��P��\ U�5���+�B��?�# ��ZDT: 
��`��Hb_����^�G(�,?�ePr�$�]��@v^ ;~C�ϡt@�\@���2�>�Z1{Ϧ��IEND�B`�themes/light/images/16px/copy.svg000064400000005576151215013530012707 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="19px" height="19px" viewBox="0 0 19 19" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>copy</title>
    <desc>Created with Sketch.</desc>
    <defs>
        <path d="M8.70833333,7.91666667 C8.27110791,7.91666667 7.91666667,8.27110791 7.91666667,8.70833333 L7.91666667,15.8333333 C7.91666667,16.2705588 8.27110791,16.625 8.70833333,16.625 L15.8333333,16.625 C16.2705588,16.625 16.625,16.2705588 16.625,15.8333333 L16.625,8.70833333 C16.625,8.27110791 16.2705588,7.91666667 15.8333333,7.91666667 L8.70833333,7.91666667 Z M8.70833333,6.33333333 L15.8333333,6.33333333 C17.1450096,6.33333333 18.2083333,7.39665705 18.2083333,8.70833333 L18.2083333,15.8333333 C18.2083333,17.1450096 17.1450096,18.2083333 15.8333333,18.2083333 L8.70833333,18.2083333 C7.39665705,18.2083333 6.33333333,17.1450096 6.33333333,15.8333333 L6.33333333,8.70833333 C6.33333333,7.39665705 7.39665705,6.33333333 8.70833333,6.33333333 Z M3.95833333,11.0833333 C4.39555876,11.0833333 4.75,11.4377746 4.75,11.875 C4.75,12.3122254 4.39555876,12.6666667 3.95833333,12.6666667 L3.16666667,12.6666667 C1.85499039,12.6666667 0.791666667,11.6033429 0.791666667,10.2916667 L0.791666667,3.16666667 C0.791666667,1.85499039 1.85499039,0.791666667 3.16666667,0.791666667 L10.2916667,0.791666667 C11.6033429,0.791666667 12.6666667,1.85499039 12.6666667,3.16666667 L12.6666667,3.95833333 C12.6666667,4.39555876 12.3122254,4.75 11.875,4.75 C11.4377746,4.75 11.0833333,4.39555876 11.0833333,3.95833333 L11.0833333,3.16666667 C11.0833333,2.72944124 10.7288921,2.375 10.2916667,2.375 L3.16666667,2.375 C2.72944124,2.375 2.375,2.72944124 2.375,3.16666667 L2.375,10.2916667 C2.375,10.7288921 2.72944124,11.0833333 3.16666667,11.0833333 L3.95833333,11.0833333 Z" id="path-1"></path>
    </defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-468.000000, -26.000000)">
            <g id="menu-head-footer" transform="translate(-1.000000, 0.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="tools" transform="translate(99.000000, 18.000000)">
                        <g id="copy" transform="translate(361.000000, 0.000000)">
                            <g transform="translate(8.000000, 8.000000)">
                                <mask id="mask-2" fill="white">
                                    <use xlink:href="#path-1"></use>
                                </mask>
                                <use id="Combined-Shape" fill="#8591B0" fill-rule="nonzero" xlink:href="#path-1"></use>
                            </g>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/cut.png000064400000003132151215013530012477 0ustar00�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<&iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CC 2014 (Windows)" xmpMM:InstanceID="xmp.iid:6FEEC396206311E8A4FCA3C879562737" xmpMM:DocumentID="xmp.did:6FEEC397206311E8A4FCA3C879562737"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:6FEEC394206311E8A4FCA3C879562737" stRef:documentID="xmp.did:6FEEC395206311E8A4FCA3C879562737"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>��r��IDATxڤSMHQ>�ܹo�{cYi��T�0��%�
�Z�-�R[.,�"Z	-\��4� ����~��EA�l�T�R)�y����?�y�Cl�������}g�Z����5�8�p�ӱ9\��ɷ�'D2b�9[�0(P@!Z��p��(!��-�|}��&�:7�69��j
[}��j�ұ	o�(�J�*���L'y��������A�X/@B�<H:e�ɇ��HW���������K�~&!���]�i3� 1͍̇�#�z���@^�I� �μC۸�k�)��M���ힷ(3İI�Qn��{eֽ(2���O�}�4W�g�]�h�{��m�8�3V;�<��yN�Y��s�Y*A�X�)cm}֑>^^	�!!��j�.=w@d�0[�JVX%jϣM"
�WIG���2e�a�+H\7n�Y�Bm��hSV7�A<�A�8��NT��'�$�:��}�����Д��؏)�zs˶�m-
��A�*FӋ*��z�fP�k�E+!βw�n���=���DŨ�!�s�Q����ꗈp�y���*DM���o�֝-�HTT<�Z	.�5���r�O!ځ�;X�a�<�+~���s ae]��R����8��sLV	v��/s��v�7�`vqr�����胿T���Ml�
<���_Efj7�5�H��qE�U�}Ó1�L�)�,��p�J�#�1U)�
0��Z�D�IEND�B`�themes/light/images/16px/extract.svg000064400000005445151215013530013402 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="21px" height="17px" viewBox="0 0 21 17" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>extract</title>
    <desc>Created with Sketch.</desc>
    <defs></defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-773.000000, -27.000000)" fill="#8591B0">
            <g id="menu-head-footer" transform="translate(-1.000000, 0.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="tools" transform="translate(99.000000, 18.000000)">
                        <g id="extract" transform="translate(666.000000, 0.000000)">
                            <path d="M18.0800453,9.2 C16.4656703,9.2 15.1400453,10.525625 15.1400453,12.14 L15.1400453,13.82 L14.7790973,13.82 L13.7618993,12.126875 C13.6093217,11.873405 13.3353473,11.719181 13.0400243,11.72 L8.84002428,11.72 C8.81131308,11.7183599 8.78342298,11.7183599 8.75471178,11.72 C8.32404378,11.7642974 7.99755678,12.127694 8.00001378,12.56 L8.00001378,25.16 C8.00001378,25.624289 8.37572478,26 8.84001378,26 L25.3512638,26 C25.7384618,25.9983599 26.0739578,25.733405 26.1650138,25.356875 L28.1337638,17.376875 C28.1936474,17.1275 28.136225,16.863362 27.9779039,16.661573 C27.8195828,16.4589566 27.5767619,16.34084 27.3200159,16.340021 L26.0600159,16.340021 L26.0600159,13.820021 L27.3200159,13.820021 C27.7843049,13.820021 28.1600159,13.44431 28.1600159,12.980021 L28.1600159,12.140021 C28.1600159,10.525646 26.8343909,9.200021 25.2200159,9.200021 L18.0800453,9.2 Z M18.0800453,10.88 L18.1850453,10.88 C18.194069,10.8824612 18.2022716,10.8849224 18.2112953,10.8865625 C18.8536013,10.9505474 19.3400453,11.4714545 19.3400453,12.1400105 L19.3400453,12.9800105 C19.3400453,13.4442995 19.7157563,13.8200105 20.1800453,13.8200105 L24.3800453,13.8200105 L24.3800453,16.3400105 L16.8200453,16.3400105 L16.8200453,12.1400105 C16.8200453,11.4271655 17.3672003,10.8800105 18.0800453,10.8800105 L18.0800453,10.88 Z M20.6984933,10.88 L25.2200453,10.88 C25.9328903,10.88 26.4800453,11.427155 26.4800453,12.14 L21.0200453,12.14 C21.0200453,11.683082 20.8863341,11.267198 20.6984933,10.88 Z M9.68004486,13.4 L12.5675453,13.4 L13.5781703,15.086552 C13.7291078,15.3425 14.0030843,15.49916 14.3000453,15.5 L15.1400453,15.5 L15.1400453,16.34 L10.8087953,16.34 C10.4240753,16.3408211 10.0885583,16.603319 9.99504528,16.976552 L9.68004486,18.249677 L9.68004486,13.4 Z M11.4650453,18.02 L26.2503053,18.02 L24.6950033,24.32 L9.90974328,24.32 L11.4650453,18.02 Z"></path>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/fullscreen.png000064400000003234151215013530014051 0ustar00�PNG


IHDRrP6�tEXtSoftwareAdobe ImageReadyq�e<&iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CC 2014 (Windows)" xmpMM:InstanceID="xmp.iid:6AFECFDD212011E897FCA94DC07354CB" xmpMM:DocumentID="xmp.did:6AFECFDE212011E897FCA94DC07354CB"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:6AFECFDB212011E897FCA94DC07354CB" stRef:documentID="xmp.did:6AFECFDC212011E897FCA94DC07354CB"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>#;IDATxڬTMh]E>���^~L06Al�k� b[A�W��JV.$"(m�q!i,���DJ���Bv6�R�"&�@R��ޝ{���//�/w�0ܹ3�|s��}sYU��;��#+[k��E9x��W�%l���k�=�J�T�$l�X;�`���7�����a>��@u��S���}���c-��`�ЌBrO#�Yc�#]!V�n�GDI����6Щ�,-�
�l�8<Y�x`�ǤB�1�?��RA��I���o!��Y�~��
��ה���t�Q�BM�5�Qi�I
�r�D��0Qz+{��ܭ�J%ۼ��&�7��6����5�Q.�5S�s>%C9��z�VF�)���K�Rŭ_Z�H�~ć��-E�w� �W]��5v��4���ˉ��M��I��@�X���?�C�Ҡ����)%��+u�(�k����Eǎ�܄8�P����;5���f�Iu7�v��y�4������Y^�S��w�X�Ь���4�OC�>-���հ���j�_ 쉖�x0}@/�@��t��f6+eg)�'���;�w��h�<�|c�"who�T?J�s�'тQ�Fs�8o��R�]�wS*���q�ZD�{Ȁ���UMQ�/C���D�GZ#�8���;��-�3�Q�Z5ߚ��O`]H�g�rA�<?�?�s��'Ԥ���89�aa�<@�^u��!o�E��"��/�r,@�`�i�
O������"4�|�{`��q�?G�|�`��m���<IEND�B`�themes/light/images/16px/select_all.svg000064400000004053151215013530014031 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="18px" height="18px" viewBox="0 0 18 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>selct_all</title>
    <desc>Created with Sketch.</desc>
    <defs>
        <path d="M8.9,8 L15.2,8 C15.6970563,8 16.1,8.40294373 16.1,8.9 L16.1,15.2 C16.1,15.6970563 15.6970563,16.1 15.2,16.1 L8.9,16.1 C8.40294373,16.1 8,15.6970563 8,15.2 L8,8.9 C8,8.40294373 8.40294373,8 8.9,8 Z M18.8,8 L25.1,8 C25.5970563,8 26,8.40294373 26,8.9 L26,15.2 C26,15.6970563 25.5970563,16.1 25.1,16.1 L18.8,16.1 C18.3029437,16.1 17.9,15.6970563 17.9,15.2 L17.9,8.9 C17.9,8.40294373 18.3029437,8 18.8,8 Z M18.8,17.9 L25.1,17.9 C25.5970563,17.9 26,18.3029437 26,18.8 L26,25.1 C26,25.5970563 25.5970563,26 25.1,26 L18.8,26 C18.3029437,26 17.9,25.5970563 17.9,25.1 L17.9,18.8 C17.9,18.3029437 18.3029437,17.9 18.8,17.9 Z M8.9,17.9 L15.2,17.9 C15.6970563,17.9 16.1,18.3029437 16.1,18.8 L16.1,25.1 C16.1,25.5970563 15.6970563,26 15.2,26 L8.9,26 C8.40294373,26 8,25.5970563 8,25.1 L8,18.8 C8,18.3029437 8.40294373,17.9 8.9,17.9 Z" id="path-1"></path>
    </defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-1191.000000, -26.000000)">
            <g id="menu-head-footer" transform="translate(-1.000000, -4.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="tools" transform="translate(99.000000, 0.000000)">
                        <g id="selct_all" transform="translate(1084.000000, 22.000000)">
                            <mask id="mask-2" fill="white">
                                <use xlink:href="#path-1"></use>
                            </mask>
                            <use fill="#8591B0" fill-rule="nonzero" xlink:href="#path-1"></use>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/view-list.png000064400000000357151215013530013635 0ustar00�PNG


IHDR�a�IDAT8�c\�t� ::���0000DEEaH,[����������]]]�,0��=�$^}�`�qdDQD��1�
1���308��d/���S��.8�x=NE]�/9�z�ع�,�ߧ{�|���V�EA0000h]��w%��7(
"�ҥK�c��G ����nD���IEND�B`�themes/light/images/16px/resize.png000064400000002604151215013530013210 0ustar00�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<&iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CC 2014 (Windows)" xmpMM:InstanceID="xmp.iid:F0679AAD206311E882429AFA2FEB5152" xmpMM:DocumentID="xmp.did:F0679AAE206311E882429AFA2FEB5152"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:F0679AAB206311E882429AFA2FEB5152" stRef:documentID="xmp.did:F0679AAC206311E882429AFA2FEB5152"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>����IDATxڤS�n1����]-!�_Ѥ@�!�H|tD4 ݊PE�������/Hy���"ED�����=_’�M,�=ڱϜ93�"B�Y&n��~&!���l���E�39$U8�ܿc�k��(2���?����-MhV��<���1�0��$	%��@>��LmgVS5p�p�1�PF��5�jEiai1��[В��]Vn�����aN>Y�t8�rC�~X�e�YM�gl���Dx��ҹ�7Q
i�W�˕и�s�}��s�2�ԇ����a����e�ʽ9[�h������I�k�
6�?OS�
�}�G�3<���"~ȬQ2ۡ���lG_��u�a�� A����wŹ���u_�kIj����؜�	iL�>�'bE�&=�n�(�d�v���@-֎�&!�2��E�����q��o!Ih��{i訊��,�F�����n���X���ڌ�b�ЗS,��HX��-+�b*��ͪ��ο*����IEND�B`�themes/light/images/16px/back.png000064400000002073151215013530012607 0ustar00�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<&iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CC 2014 (Windows)" xmpMM:InstanceID="xmp.iid:E4DFA5C9206111E8877DC251126BECAC" xmpMM:DocumentID="xmp.did:E4DFA5CA206111E8877DC251126BECAC"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:E4DFA5C7206111E8877DC251126BECAC" stRef:documentID="xmp.did:E4DFA5C8206111E8877DC251126BECAC"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>�x/�IDATx�b���?%���Rr2���8���ճa��*�&�
@<���
6��\`ĩ@|�'�b��1@������z,��b v&�Bl������h�B&�A�x́x>��09��,4f�9�WB։`�ĝ��<7�$�!Y�IEND�B`�themes/light/images/16px/search.svg000064400000004105151215013530013165 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="15px" height="15px" viewBox="0 0 15 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>Combined Shape</title>
    <desc>Created with Sketch.</desc>
    <defs>
        <path d="M11.3820189,10.3213587 L14.7803301,13.7196699 C15.0732233,14.0125631 15.0732233,14.4874369 14.7803301,14.7803301 C14.4874369,15.0732233 14.0125631,15.0732233 13.7196699,14.7803301 L10.3213587,11.3820189 C9.23588921,12.2387223 7.86515226,12.75 6.375,12.75 C2.85418472,12.75 0,9.89581528 0,6.375 C0,2.85418472 2.85418472,0 6.375,0 C9.89581528,0 12.75,2.85418472 12.75,6.375 C12.75,7.86515226 12.2387223,9.23588921 11.3820189,10.3213587 Z M9.86981921,9.77380751 C10.7239628,8.89568802 11.25,7.69677529 11.25,6.375 C11.25,3.68261184 9.06738816,1.5 6.375,1.5 C3.68261184,1.5 1.5,3.68261184 1.5,6.375 C1.5,9.06738816 3.68261184,11.25 6.375,11.25 C7.69677529,11.25 8.89568802,10.7239628 9.77380751,9.86981921 C9.788201,9.85258825 9.80348847,9.83585136 9.81966991,9.81966991 C9.83585136,9.80348847 9.85258825,9.788201 9.86981921,9.77380751 Z" id="path-1"></path>
    </defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-1831.000000, -28.000000)">
            <g id="menu-head-footer" transform="translate(-1.000000, 0.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="search" transform="translate(1607.000000, 18.000000)">
                        <g transform="translate(224.000000, 10.000000)">
                            <mask id="mask-2" fill="white">
                                <use xlink:href="#path-1"></use>
                            </mask>
                            <use id="Combined-Shape" fill="#8591B0" fill-rule="nonzero" xlink:href="#path-1"></use>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/copy.png000064400000002636151215013530012666 0ustar00�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<&iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CC 2014 (Windows)" xmpMM:InstanceID="xmp.iid:E5A5886E206211E89762BF94ACEB40DB" xmpMM:DocumentID="xmp.did:E5A5886F206211E89762BF94ACEB40DB"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:E5A5886C206211E89762BF94ACEB40DB" stRef:documentID="xmp.did:E5A5886D206211E89762BF94ACEB40DB"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>��eIDATxڤ�=hA�ߛ����q�T���-D���:��H�,��BA-�R��V!H
�D��B+mbb�x�B�&����<�3;�w�|pý����Ǽe��1�[��`5m&:Al�i�yn�pgooltdz���6�I�~N�珗bզ"
U��_�U�8���J�h�A3I.��'�O,�)˴��ΰ�� &��S��_��/aˡ���-l����{(h��hw[(�o���5qfUߍ��X���	���@��]����A<%d�!�q8��_��g����&@H{'�7�]3���qd�>��~nTCiG�ps�$��P�#��Lj$R<��iu�/���]�[D�p'�7bC�6F"�}�[]��X[8{���P�q|�Y�Q]�A<d�����K�{������!@�+t���iw��C��/#��
xnq:1%�;��mVV۶�	%�gHP�TI�L��b��p�/�X
��ٽ�J^��j�/-����CW�}_���2�Z�H����xEb�0/���7RYIEND�B`�themes/light/images/16px/archive.png000064400000002615151215013530013332 0ustar00�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<&iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CC 2014 (Windows)" xmpMM:InstanceID="xmp.iid:55877F38206311E8B2748B9B91AC9D9A" xmpMM:DocumentID="xmp.did:55877F39206311E8B2748B9B91AC9D9A"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:55877F36206311E8B2748B9B91AC9D9A" stRef:documentID="xmp.did:55877F37206311E8B2748B9B91AC9D9A"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?><?��IDATxڤS=hA���}y1<��"�JQ0"�Hg!�$6)KA[�l�����v�XF�(T���b�F�M�E��ٻ�����r�.�;��ͷ�̰������y��}�p�&]�����=6׮_=w����4��o��
��b��`���1b�使�s+�=�=���K����n�-���� 4��MO��D]B��xJ�hʎLbq[��:�g(%lhgq̼����yȈł�TD,y�G"��s�tN�i:)�'j�Gn�*T }��� 4�^s�l�j�m�X{Oǎ�ę��h������ik�Y�����b*%P�F�����%Z_OG%�,�-hSֿ7R�t3s� �Jb��n����l��/�[�5v|$�Z����6[�S�0��ܮ�e��ijb\���f�`�����,t40�g�>��EJ��l�MfcS�rDG/H��ۘx#�E����X��"ƈ�pޝ���YfAN��W��{���"�:��K�ƞ�=�g��PIEND�B`�themes/light/images/16px/info.svg000064400000007136151215013530012662 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="19px" height="19px" viewBox="0 0 19 19" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>info</title>
    <desc>Created with Sketch.</desc>
    <defs></defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-378.000000, -26.000000)" fill="#8591B0">
            <g id="menu-head-footer" transform="translate(-1.000000, 0.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="tools" transform="translate(99.000000, 18.000000)">
                        <g id="info" transform="translate(271.000000, 0.000000)">
                            <path d="M17.5,27 C22.7468068,27 27,22.7468068 27,17.5 C27,12.2531932 22.7468068,8 17.5,8 C12.2531932,8 8,12.2531932 8,17.5 C8,22.7468068 12.2531932,27 17.5,27 Z M17.5,25.1904762 C21.7474927,25.1904762 25.1904762,21.7474927 25.1904762,17.5 C25.1904762,13.2525073 21.7474927,9.80952381 17.5,9.80952381 C13.2525073,9.80952381 9.80952381,13.2525073 9.80952381,17.5 C9.80952381,21.7474927 13.2525073,25.1904762 17.5,25.1904762 Z M18.8571429,12.9788369 C18.8571429,13.3543583 18.7250037,13.6741917 18.4598286,13.9375 C18.1955548,14.2016905 17.8769713,14.3333333 17.5040779,14.3333333 C17.1302809,14.3333333 16.8107937,14.2016837 16.5429054,13.9375 C16.2759208,13.6741917 16.1428571,13.3543583 16.1428571,12.9788369 C16.1428571,12.6051024 16.2759023,12.2843643 16.5429054,12.0184095 C16.8098901,11.7515726 17.130304,11.6190476 17.5040779,11.6190476 C17.8769713,11.6190476 18.1955548,11.7524638 18.4598286,12.0184095 C18.725006,12.2843643 18.8571429,12.6051024 18.8571429,12.9788369 Z M18.8571429,21.9201441 C18.4793279,22.1017803 18.1763797,22.2388606 17.9508761,22.3339645 C17.7253945,22.4290662 17.4637575,22.4761905 17.1651057,22.4761905 C16.706387,22.4761905 16.3500759,22.3408188 16.095313,22.0700688 C15.8414314,21.799321 15.7140389,21.4548983 15.7140389,21.0385117 C15.7140389,20.8765807 15.7235064,20.7112192 15.7424412,20.5415851 C15.7622353,20.3727998 15.7923582,20.1817432 15.8345308,19.9683955 L16.3078791,17.940397 C16.3500517,17.7467654 16.3861983,17.5625476 16.4146006,17.3877811 C16.443862,17.2155676 16.4576324,17.0562115 16.4576324,16.913117 C16.4576324,16.6535114 16.4137391,16.4727351 16.3250931,16.370766 C16.2373065,16.26881 16.0686117,16.2174022 15.8190265,16.2174022 C15.6968139,16.2174022 15.5711598,16.2413931 15.4429301,16.2876575 C15.3138323,16.3330666 15.2380952,15.7941525 15.2380952,15.7941525 C15.5479176,15.6407887 15.8448509,15.5105517 16.1280138,15.4017393 C16.4111767,15.2929291 16.6788287,15.2380952 16.9327103,15.2380952 C17.3879918,15.2380952 17.7391473,15.3717539 17.9861327,15.6382072 C18.2322808,15.904656 18.3562142,16.249956 18.3562142,16.6766294 C18.3562142,16.7640215 18.3476083,16.9199603 18.3303942,17.1418621 C18.3131801,17.3637638 18.2813364,17.5676801 18.2357223,17.7536108 L17.7640926,19.7738887 C17.7253637,19.9358198 17.6909378,20.121733 17.6608148,20.3299482 C17.6298326,20.5372883 17.6143393,20.6957999 17.6143393,20.8020241 C17.6143393,21.0702057 17.6642563,21.2535483 17.7632311,21.3512184 C17.8630652,21.4480353 18.0343422,21.4968704 18.2787498,21.4968704 C18.3932157,21.4968704 18.5240387,21.4720241 18.6686166,21.4240444 C18.8132055,21.3752071 18.8570988,21.9201156 18.8570988,21.9201156 L18.8571429,21.9201441 Z"></path>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/clear_folder.png000064400000001263151215013530014330 0ustar00�PNG


IHDR�a	pHYs��eIDATxڍ�KLQ�/�it��a��ԝ�u�N�&>6(�@%�(̻۱���V�ke��7�Q�&V"�4@��PKmi��{J-T��r�|�9ss�I��V�r�cM-]��u�p�E�3Q,2�A�(0�W������B�
)��,�~����$I�X�cV</��g���$��^ �)	�Sn �)��":��'H����$ v����,�1u�dƬ1Eu</�K�.����I��� ��#6�u#3j�@ l�T���RMCfD�@@��	�{��H7	4ڛI`�)���:��#����s�N�uT��'9��̠�L4*+!/������/�gOB�z
�������{w�?154�Z;�pw����4�o�"8�6#�����Tmdz�{dykA �C7C�;��4}�����#\Y�hm5>>0ء�`���5�Đœ�O���|�`),b��3��r���#�\ei�*
Y摦�'x�H�	?�W��A��Ad�D����8f�YK&���)o����}�'���	�:=�7�'�o�ث��灷|�� ��_>z���j\jh�c��sk����x֬Vs�]f�g.n3�/�|�D�%�f�2�B�n�z�?�l��RIEND�B`�themes/light/images/16px/add_folder.svg000064400000006337151215013530014014 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="20px" height="20px" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>add folder</title>
    <desc>Created with Sketch.</desc>
    <defs>
        <path d="M6.78619658,1.97727273 L2.72727273,1.97727273 C2.22519568,1.97727273 1.81818182,2.4012455 1.81818182,2.92424242 L1.81818182,16.1818182 C1.81818182,16.7048151 2.22519568,17.1287879 2.72727273,17.1287879 L17.2727273,17.1287879 C17.7748043,17.1287879 18.1818182,16.7048151 18.1818182,16.1818182 L18.1818182,5.76515152 C18.1818182,5.24215459 17.7748043,4.81818182 17.2727273,4.81818182 L9.09090909,4.81818182 C8.78695165,4.81818182 8.50310499,4.65994211 8.33449973,4.3964964 L6.78619658,1.97727273 Z M9.57743978,2.92424242 L17.2727273,2.92424242 C18.7789584,2.92424242 20,4.19616075 20,5.76515152 L20,16.1818182 C20,17.7508089 18.7789584,19.0227273 17.2727273,19.0227273 L2.72727273,19.0227273 C1.22104159,19.0227273 0,17.7508089 0,16.1818182 L0,2.92424242 C-2.01858732e-16,1.35525166 1.22104159,0.0833333333 2.72727273,0.0833333333 L7.27272727,0.0833333333 C7.57668472,0.0833333333 7.86053138,0.241573045 8.02913663,0.505018754 L9.57743978,2.92424242 Z" id="path-1"></path>
    </defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-152.000000, -26.000000)">
            <g id="menu-head-footer" transform="translate(-1.000000, 0.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="tools" transform="translate(99.000000, 18.000000)">
                        <g id="folder" transform="translate(45.000000, 0.000000)">
                            <g id="add-folder" transform="translate(8.000000, 8.000000)">
                                <path d="M8.74625688,8.52441813 C8.74625688,8.02468754 9.13869217,7.63157895 9.63751734,7.63157895 C9.81543165,7.63157895 9.99419151,7.6912733 10.1363643,7.78678338 C10.3738565,7.94198781 10.5287996,8.21571644 10.5287996,8.52442686 L10.5287996,10.1071654 L12.1087395,10.1071654 C12.5956661,10.1071654 13,10.5122373 13,11.0000046 C13,11.4877719 12.5956443,11.8928438 12.1087395,11.8928438 L10.5287996,11.8928438 L10.5287996,13.4755819 C10.5287996,13.9753125 10.1244439,14.3684211 9.63753913,14.3684211 C9.13869217,14.3684211 8.74627867,13.9752906 8.74627867,13.4755819 L8.74627867,11.8928438 L7.15441836,11.8928438 C6.91692615,11.8928438 6.69133251,11.7973337 6.52449086,11.6310479 C6.36956086,11.4647577 6.26315789,11.249859 6.26315789,11.0000046 C6.26315789,10.5122155 6.66751356,10.1071654 7.15441836,10.1071654 L8.74627867,10.1071654 L8.74625688,8.52441813 Z" id="Fill-1" fill="#8591B0"></path>
                                <mask id="mask-2" fill="white">
                                    <use xlink:href="#path-1"></use>
                                </mask>
                                <use id="Shape" fill="#8591B0" fill-rule="nonzero" xlink:href="#path-1"></use>
                            </g>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/redo.svg000064400000003533151215013530012655 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="17px" height="14px" viewBox="0 0 17 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>redo</title>
    <desc>Created with Sketch.</desc>
    <defs></defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-1124.000000, -27.000000)" fill="#8591B0">
            <g id="menu-head-footer" transform="translate(-1.000000, -4.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="tools" transform="translate(99.000000, 0.000000)">
                        <g id="redo" transform="translate(1016.000000, 0.000000)">
                            <path d="M21.4910865,34.333596 C21.66687,34.509375 21.605346,34.65 21.35925,34.65 L14.175,34.65 C11.31678,34.65 9,36.96678 9,39.825 C9,42.684975 11.31327,45 14.175,45 L18.01404,45 C18.6363,45 19.140795,44.50077 19.140795,43.875 C19.140795,43.254495 18.638055,42.75 18.01404,42.75 L14.175,42.75 C12.55779,42.75 11.25,41.44221 11.25,39.825 C11.25,38.20959 12.55959,36.9 14.175,36.9 L21.35925,36.9 C21.6088605,36.9 21.668625,37.0423845 21.4910865,37.2181635 L20.8038015,37.9054485 C20.3643495,38.3449005 20.36259,39.0533085 20.8038015,39.4962885 C21.2432535,39.9357405 21.9551715,39.9375 22.3963965,39.494529 L25.3196415,36.5730435 C25.7590935,36.131832 25.7626125,35.4216735 25.3196415,34.9786935 L22.3963965,32.0572035 C21.9569445,31.615992 21.2467815,31.6124775 20.8038015,32.055444 C20.3661045,32.494896 20.3643495,33.206814 20.8038015,33.646284 L21.4910865,34.333596 Z"></path>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/clear_folder.svg000064400000005657151215013530014356 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="20px" height="20px" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>clear_folder</title>
    <desc>Created with Sketch.</desc>
    <defs>
        <path d="M6.78619658,1.97727273 L2.72727273,1.97727273 C2.22519568,1.97727273 1.81818182,2.4012455 1.81818182,2.92424242 L1.81818182,16.1818182 C1.81818182,16.7048151 2.22519568,17.1287879 2.72727273,17.1287879 L17.2727273,17.1287879 C17.7748043,17.1287879 18.1818182,16.7048151 18.1818182,16.1818182 L18.1818182,5.76515152 C18.1818182,5.24215459 17.7748043,4.81818182 17.2727273,4.81818182 L9.09090909,4.81818182 C8.78695165,4.81818182 8.50310499,4.65994211 8.33449973,4.3964964 L6.78619658,1.97727273 Z M9.57743978,2.92424242 L17.2727273,2.92424242 C18.7789584,2.92424242 20,4.19616075 20,5.76515152 L20,16.1818182 C20,17.7508089 18.7789584,19.0227273 17.2727273,19.0227273 L2.72727273,19.0227273 C1.22104159,19.0227273 0,17.7508089 0,16.1818182 L0,2.92424242 C-2.01858732e-16,1.35525166 1.22104159,0.0833333333 2.72727273,0.0833333333 L7.27272727,0.0833333333 C7.57668472,0.0833333333 7.86053138,0.241573045 8.02913663,0.505018754 L9.57743978,2.92424242 Z" id="path-1"></path>
    </defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-1225.000000, -26.000000)">
            <g id="folder" transform="translate(1217.000000, 18.000000)">
                <g id="clear_folder" transform="translate(8.000000, 8.000000)">
                    <path d="M8.74625688,8.52441813 C8.74625688,8.02468754 9.13869217,7.63157895 9.63751734,7.63157895 C9.81543165,7.63157895 9.99419151,7.6912733 10.1363643,7.78678338 C10.3738565,7.94198781 10.5287996,8.21571644 10.5287996,8.52442686 L10.5287996,10.1071654 L12.1087395,10.1071654 C12.5956661,10.1071654 13,10.5122373 13,11.0000046 C13,11.4877719 12.5956443,11.8928438 12.1087395,11.8928438 L10.5287996,11.8928438 L10.5287996,13.4755819 C10.5287996,13.9753125 10.1244439,14.3684211 9.63753913,14.3684211 C9.13869217,14.3684211 8.74627867,13.9752906 8.74627867,13.4755819 L8.74627867,11.8928438 L7.15441836,11.8928438 C6.91692615,11.8928438 6.69133251,11.7973337 6.52449086,11.6310479 C6.36956086,11.4647577 6.26315789,11.249859 6.26315789,11.0000046 C6.26315789,10.5122155 6.66751356,10.1071654 7.15441836,10.1071654 L8.74627867,10.1071654 L8.74625688,8.52441813 Z" id="Fill-1" fill="#8591B0" transform="translate(9.631579, 11.000000) rotate(45.000000) translate(-9.631579, -11.000000) "></path>
                    <mask id="mask-2" fill="white">
                        <use xlink:href="#path-1"></use>
                    </mask>
                    <use id="Shape" fill="#8591B0" fill-rule="nonzero" xlink:href="#path-1"></use>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/redo.png000064400000001240151215013530012633 0ustar00�PNG


IHDR�a	pHYs��RIDATx�chhh`@�P���������������,��a�147��2�֖3���3�7t�WԷ�7�V
���7�U�
C��\_�P[[�ѵ��n��g&��7���s��]Y
�l�j�J���B���5]7��h2P3����'��o=��g�	'�9N�tIg����3��j\�f�{�Sω=�5eH��3�"z��/��?�o����:^�XSM9Cz�4g�)��k��_m����� ������q����3��ah��˵����Ѻ��E�Y�k��߽��
4�U1�6u�X��?h��-5�@oՃ
��mt�9��`ƫ��S�К��g瞅-���
ղ�)�yo��N:�d@�[ \]��]�ثZ��.	�@u���-`yx,��14�V3xL�r�r�y
��m�eШ��	d�J�hqZj+2Zf��-���f��E��jmu�(	Fp�1Ӿ��h���V��(�#ljz����!�}u����-�=|Q@�����1$�mu�޼�ͦ>|�W߫�L�
Hy�膄
ќ���U��k�5�,���&d�!��o]Y��<�հ�#hz���BH4b
B�a�j��IEND�B`�themes/light/images/16px/pdf.svg000064400000007237151215013530012502 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="16px" height="21px" viewBox="0 0 16 21" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>pdf</title>
    <desc>Created with Sketch.</desc>
    <defs></defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-1329.000000, -25.000000)" fill="#8591B0">
            <g id="menu-head-footer" transform="translate(-1.000000, -4.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="tools" transform="translate(99.000000, 0.000000)">
                        <g id="pdf" transform="translate(1220.000000, 22.000000)">
                            <g transform="translate(10.000000, 7.000000)">
                                <path d="M15.8367584,6.22877922 L15.8367584,5.49506494 L9.72558961,0 L9.72558961,0.0153766234 L1.87499221,0.0153766234 C0.839355844,0.0153766234 8.31168831e-05,0.854649351 8.31168831e-05,1.88966234 L8.31168831e-05,18.9051429 C8.31168831e-05,19.9407792 0.839355844,20.7792208 1.87499221,20.7792208 L13.9635117,20.7792208 C14.9983169,20.7792208 15.8369662,19.9407792 15.8369662,18.9051429 L15.8369662,6.22981818 L15.8377974,6.22981818 L15.8367584,6.22877922 Z M14.1710961,18.9049351 C14.1710961,19.0177662 14.0777974,19.1127273 13.9633039,19.1127273 L1.87478442,19.1127273 C1.75883636,19.1127273 1.66553766,19.0185974 1.66553766,18.9049351 L1.66553766,1.88945455 C1.66553766,1.77496104 1.75800519,1.68083117 1.87478442,1.68083117 L9.72538182,1.68083117 L9.72538182,6.22961039 L14.1710961,6.22961039 L14.1710961,18.9049351 Z" id="Fill-1"></path>
                                <path d="M8.54865455,7.47047619 C8.56091429,6.81302165 8.35312208,6.47535931 8.25317403,6.36252814 C8.07218701,6.1262684 7.78314805,5.98517749 7.48621299,5.98829437 C7.35945974,5.98829437 7.23707013,6.01177489 7.11758961,6.05083983 C6.79862857,6.15390476 6.54304416,6.39743723 6.41317403,6.70663203 C6.32132987,6.91691775 6.29057662,7.14569697 6.29057662,7.37551515 C6.29452468,8.07037229 6.57545974,8.84065801 6.8644987,9.49478788 C6.54221299,10.7479827 6.01857662,12.2309957 5.46917403,13.4534372 C4.02439481,14.1458009 3.15997922,14.7934892 3.02678442,15.6718268 C3.01701818,15.7131775 3.01701818,15.7634632 3.01701818,15.8058528 C3.00974545,16.1223203 3.16392727,16.5493333 3.6004987,16.8682944 C3.76777143,16.995671 3.97473247,17.064658 4.18668052,17.064658 C4.72631688,17.0540606 5.13878442,16.6792035 5.5633039,16.0890736 C5.85795325,15.6743203 6.16153766,15.1344762 6.47883636,14.4753593 C7.43571948,14.0662165 8.59582338,13.6930216 9.60943377,13.4681905 C10.2149403,14.0175931 10.7880312,14.3357229 11.3748364,14.3415411 C11.8350961,14.3454892 12.2621091,14.1133853 12.5299532,13.7279307 C12.7020052,13.4827359 12.8123429,13.2269437 12.8123429,12.9534892 C12.8140052,12.8065801 12.7790961,12.6571775 12.7109403,12.5241905 C12.4536935,12.0435671 11.9146805,11.8958268 11.2620052,11.896658 C10.9137455,11.896658 10.5137455,11.9348918 10.0574338,12.0094892 C9.42595325,11.3065281 8.76683636,10.3203463 8.2830961,9.35037229 C8.48029091,8.499671 8.54844675,7.9047619 8.54844675,7.47047619 L8.54865455,7.47047619 Z M7.2192,12.749645 C7.41805714,12.2343203 7.60631688,11.7050736 7.77275844,11.1814372 C8.02834286,11.5880866 8.30034286,11.977697 8.57961558,12.3340606 C8.12745974,12.4558268 7.66886234,12.5954632 7.2192,12.749645 Z" id="Fill-4"></path>
                            </g>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/netmount.svg000064400000003427151215013530013577 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="23px" height="16px" viewBox="0 0 23 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>network</title>
    <desc>Created with Sketch.</desc>
    <defs></defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-105.000000, -28.000000)" fill="#8591B0">
            <g id="menu-head-footer" transform="translate(-1.000000, 0.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="tools" transform="translate(99.000000, 18.000000)">
                        <g id="network">
                            <path d="M17.5,10 C16.94725,10 16.5,10.4572042 16.5,11.0222222 L16.5,17.1555556 L14.5,17.1555556 C13.9551,17.1555556 13.49805,17.6846578 13.5,18.1777778 L13.5,20.2222222 L7,20.2222222 C6.44725,20.2222222 6,20.6794264 6,21.2444444 C6,21.8094624 6.447265,22.2666667 7,22.2666667 L13.5,22.2666667 L13.5,24.3111111 C13.5,24.8461933 13.97656,25.3333333 14.5,25.3333333 L20.5,25.3333333 C21.02345,25.3333333 21.5,24.8461831 21.5,24.3111111 L21.5,22.2666667 L28,22.2666667 C28.55275,22.2666667 29,21.8094624 29,21.2444444 C29,20.6794264 28.552735,20.2222222 28,20.2222222 L21.5,20.2222222 L21.5,18.1777778 C21.5,17.6426956 21.02344,17.1555556 20.5,17.1555556 L18.5,17.1555556 L18.5,11.0222222 C18.5,10.4571889 18.052735,10 17.5,10 Z M15.5833333,19.5833333 L19.4166667,19.5833333 L19.4166667,23.4166667 L15.5833333,23.4166667 L15.5833333,19.5833333 Z"></path>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/up.svg000064400000003457151215013530012355 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="12px" height="16px" viewBox="0 0 12 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>Combined Shape</title>
    <desc>Created with Sketch.</desc>
    <defs>
        <path d="M1198.50034,39.75 L1201.9585,42.9696699 C1202.27309,43.2625631 1202.27309,43.7374369 1201.9585,44.0303301 C1201.64391,44.3232233 1201.13386,44.3232233 1200.81928,44.0303301 L1195.98594,39.5303301 C1195.67135,39.2374369 1195.67135,38.7625631 1195.98594,38.4696699 L1200.81928,33.9696699 C1201.13386,33.6767767 1201.64391,33.6767767 1201.9585,33.9696699 C1202.27309,34.2625631 1202.27309,34.7374369 1201.9585,35.0303301 L1198.50034,38.25 L1209.44444,38.25 C1209.88934,38.25 1210.25,38.5857864 1210.25,39 C1210.25,39.4142136 1209.88934,39.75 1209.44444,39.75 L1198.50034,39.75 Z" id="path-1"></path>
    </defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-1296.000000, -27.000000)">
            <g id="menu-head-footer" transform="translate(-1.000000, -4.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="tools" transform="translate(99.000000, 0.000000)">
                        <mask id="mask-2" fill="white">
                            <use xlink:href="#path-1"></use>
                        </mask>
                        <use id="Combined-Shape" fill="#8591B0" fill-rule="nonzero" transform="translate(1203.000000, 39.000000) rotate(90.000000) translate(-1203.000000, -39.000000) " xlink:href="#path-1"></use>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/html_file.svg000064400000012171151215013530013665 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="19px" height="19px" viewBox="0 0 19 19" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>html</title>
    <desc>Created with Sketch.</desc>
    <defs></defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-266.000000, -304.000000)" fill="#8591B0">
            <g id="content" transform="translate(244.000000, 69.000000)">
                <g id="row-07" transform="translate(1.000000, 231.000000)">
                    <path d="M29.9541641,5.72727273 C27.8934109,5.72727273 26.0417841,6.54041499 24.6857968,7.86381406 C24.6084483,7.93992511 24.5310998,8.02613434 24.4545455,8.11311698 L24.6857968,9.00238819 L24.8839051,9.14373871 L26.1846305,9.14296131 L26.3495898,9.03422953 L26.7797434,8.23194295 C27.1104459,7.60285023 27.7608187,7.25568711 28.4222237,7.25568711 C28.7860834,7.25568711 29.149943,7.36441889 29.4695931,7.5810991 L30.0868088,7.99349571 C30.6045733,8.35153439 30.8910865,8.9262493 30.8910865,9.49008864 C30.8910865,9.89160969 30.7474379,10.2923752 30.4830375,10.6286628 L30.4388381,10.7482661 L30.5382873,10.921458 L31.5635519,11.4744218 C32.0481593,11.7237247 32.3899141,12.1796236 32.5004177,12.7108561 L32.9739929,15.0750486 L33.040291,15.1837804 L33.1728892,15.2272727 L33.2944371,15.1837804 L34.9479698,13.6980432 L35.0142679,13.5566927 L35.0142679,13.5349455 L34.8595709,11.88689 L34.8485206,11.7245697 C34.8485206,11.1172281 35.1681707,10.5316376 35.6969876,10.1953501 L36.5454545,9.66411754 C36.1926473,9.00241801 35.7411769,8.39507641 35.211572,7.86384388 C33.8556049,6.54044481 32.0039578,5.72730255 29.9541156,5.72730255 L29.9541641,5.72727273 Z M26.6963794,16.1934075 C26.0488357,16.1934075 25.401292,15.9192034 24.9452654,15.4058061 C24.8130085,15.2742563 24.7176699,15.2383795 24.5613738,15.2272727 C24.3818806,15.2272727 24.1895083,15.3349053 24.093321,15.5373624 L24.0821567,15.549322 L23.5909091,16.6350294 C24.1302394,17.7685841 24.9341011,18.7705804 25.9295239,19.5454545 L26.9850116,18.9133353 C27.4530643,18.6391312 27.764821,18.1616194 27.8129036,17.6132113 L27.9090909,16.7786372 L27.9090909,16.718841 C27.9090909,16.4326751 27.6694912,16.1943566 27.3817868,16.1943566 L26.6963794,16.1934075 Z M21,13.4885072 C21.0115453,11.2315344 21.7949619,9.15907131 23.1301163,7.52381628 C23.1647513,7.47763605 23.1878427,7.44300141 23.2224777,7.40836465 C24.9616786,5.32448058 27.5749661,4 30.5115288,4 C34.415405,4 37.7775688,6.36104988 39.2281168,9.74619247 C39.2396625,9.76928364 39.2512082,9.78082711 39.2512082,9.80391828 C39.2858431,9.87318757 39.3204781,9.94245896 39.3435695,10.022459 C39.7699094,11.0936713 40,12.2680319 40,13.4884565 C40,18.7389636 35.7505341,22.988389 30.5115879,23 C28.5769399,23 26.7692121,22.412862 25.2726418,21.4224412 C25.2495504,21.4224412 25.2264611,21.39935 25.2149154,21.3878066 C25.1687347,21.3647154 25.1340998,21.3300808 25.0879191,21.2954461 C23.6604456,20.2943221 22.5083461,18.9122297 21.8173784,17.2999856 C21.7711977,17.2191708 21.7365628,17.1383559 21.7134714,17.0583707 C21.7019263,17.0121905 21.69038,16.9660102 21.69038,16.91983 L21.655745,16.9313756 C21.2302284,15.8609865 21.0001379,14.6974137 21.0001379,13.488389 L21,13.4885072 Z M22.7272854,13.5568849 C22.7272854,13.8879438 22.7503766,14.2190237 22.7965548,14.5271888 C23.2228917,14.0596048 23.8216,13.8078368 24.4318349,13.8078368 C25.0420698,13.8078368 25.6638525,14.0702355 26.1017582,14.5615294 C26.2056645,14.6759728 26.331826,14.7323763 26.4819253,14.7323763 L27.1383511,14.7323763 C28.3819164,14.7323763 29.3723184,15.7370208 29.3723184,16.9468297 L29.3599494,17.1748878 L29.2791344,17.9735308 C29.1636825,19.0353886 28.564991,19.9713728 27.6438543,20.519043 L27.4368671,20.6449291 C28.3810994,21.0446691 29.4176711,21.2727273 30.5110527,21.2727273 C32.6527648,21.2612825 34.5873779,20.4054241 36.0041379,19.0124446 C37.4093291,17.6080811 38.2727273,15.6796735 38.2727273,13.5560416 C38.2727273,12.8939029 38.1919122,12.2546579 38.019564,11.6383066 L37.4439512,12.003706 L37.3515905,12.1745529 L37.3515905,12.1974424 L37.5132206,13.9320697 L37.5247662,14.1029166 C37.5247662,14.6391608 37.2946984,15.1533275 36.8914359,15.518727 L35.163793,17.0710626 C34.7951736,17.4135683 34.3234692,17.5729662 33.874039,17.5729662 C33.4361544,17.5729662 33.0221674,17.4356354 32.6766435,17.1732262 C32.3311196,16.8993807 32.0664086,16.4996407 31.9740479,16.0320775 L31.4677214,13.5436949 L31.3753607,13.4063641 L30.292598,12.8243533 C29.64772,12.4818476 29.2906483,11.808262 29.2906483,11.1461442 C29.2906483,10.7349783 29.4291893,10.3017138 29.7169852,9.94776123 L29.7631655,9.82187514 L29.6708048,9.66165687 L29.0259268,9.21615037 L28.9104749,9.18181818 L28.726579,9.28808558 L28.2771466,10.1439419 C27.9431704,10.77174 27.2867446,11.17148 26.5726013,11.17148 L25.2135799,11.17148 C24.4878889,11.17148 23.8545585,10.7831869 23.5321301,10.1782824 C23.0150792,11.1943738 22.7272727,12.3469065 22.7272727,13.5568828 L22.7272854,13.5568849 Z" id="html"></path>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/paste.svg000064400000004447151215013530013045 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="16px" height="20px" viewBox="0 0 16 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>paste</title>
    <desc>Created with Sketch.</desc>
    <defs>
        <path d="M12.1666667,2.5 L13,2.5 C14.3807119,2.5 15.5,3.61928813 15.5,5 L15.5,16.6666667 C15.5,18.0473785 14.3807119,19.1666667 13,19.1666667 L3,19.1666667 C1.61928813,19.1666667 0.5,18.0473785 0.5,16.6666667 L0.5,5 C0.5,3.61928813 1.61928813,2.5 3,2.5 L3.83333333,2.5 C3.83333333,1.57952542 4.57952542,0.833333333 5.5,0.833333333 L10.5,0.833333333 C11.4204746,0.833333333 12.1666667,1.57952542 12.1666667,2.5 Z M3.83333333,4.16666667 L3,4.16666667 C2.53976271,4.16666667 2.16666667,4.53976271 2.16666667,5 L2.16666667,16.6666667 C2.16666667,17.126904 2.53976271,17.5 3,17.5 L13,17.5 C13.4602373,17.5 13.8333333,17.126904 13.8333333,16.6666667 L13.8333333,5 C13.8333333,4.53976271 13.4602373,4.16666667 13,4.16666667 L12.1666667,4.16666667 C12.1666667,5.08714125 11.4204746,5.83333333 10.5,5.83333333 L5.5,5.83333333 C4.57952542,5.83333333 3.83333333,5.08714125 3.83333333,4.16666667 Z M5.5,2.5 L5.5,4.16666667 L10.5,4.16666667 L10.5,2.5 L5.5,2.5 Z" id="path-1"></path>
    </defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-537.000000, -25.000000)">
            <g id="menu-head-footer" transform="translate(-1.000000, 0.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="tools" transform="translate(99.000000, 18.000000)">
                        <g id="paste" transform="translate(429.000000, 0.000000)">
                            <g transform="translate(9.000000, 7.000000)">
                                <mask id="mask-2" fill="white">
                                    <use xlink:href="#path-1"></use>
                                </mask>
                                <use id="Combined-Shape" fill="#8591B0" fill-rule="nonzero" xlink:href="#path-1"></use>
                            </g>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/directory.svg000064400000003767151215013530013741 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="18px" height="17px" viewBox="0 0 18 17" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>file</title>
    <desc>Created with Sketch.</desc>
    <defs>
        <path d="M6.10757692,1.63636364 L2.45454545,1.63636364 C2.00267611,1.63636364 1.63636364,2.00267611 1.63636364,2.45454545 L1.63636364,13.9090909 C1.63636364,14.3609602 2.00267611,14.7272727 2.45454545,14.7272727 L15.5454545,14.7272727 C15.9973239,14.7272727 16.3636364,14.3609602 16.3636364,13.9090909 L16.3636364,4.90909091 C16.3636364,4.45722157 15.9973239,4.09090909 15.5454545,4.09090909 L8.18181818,4.09090909 C7.90825648,4.09090909 7.65279449,3.95418998 7.50104976,3.72657289 L6.10757692,1.63636364 Z M8.6196958,2.45454545 L15.5454545,2.45454545 C16.9010626,2.45454545 18,3.55348289 18,4.90909091 L18,13.9090909 C18,15.2646989 16.9010626,16.3636364 15.5454545,16.3636364 L2.45454545,16.3636364 C1.09893743,16.3636364 0,15.2646989 0,13.9090909 L0,2.45454545 C-1.81672859e-16,1.09893743 1.09893743,0 2.45454545,0 L6.54545455,0 C6.81901624,0 7.07447824,0.136719111 7.22622297,0.364336203 L8.6196958,2.45454545 Z" id="path-1"></path>
    </defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-267.000000, -125.000000)">
            <g id="content" transform="translate(244.000000, 69.000000)">
                <g id="row-01" transform="translate(1.000000, 51.000000)">
                    <g id="file" transform="translate(22.000000, 5.000000)">
                        <mask id="mask-2" fill="white">
                            <use xlink:href="#path-1"></use>
                        </mask>
                        <use id="Shape" fill="#8591B0" fill-rule="nonzero" xlink:href="#path-1"></use>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/duplicate.svg000064400000004524151215013530013677 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="18px" height="21px" viewBox="0 0 18 21" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>duplicate</title>
    <desc>Created with Sketch.</desc>
    <defs></defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-626.000000, -25.000000)" fill="#8591B0">
            <g id="menu-head-footer" transform="translate(-1.000000, 0.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="tools" transform="translate(99.000000, 18.000000)">
                        <g id="duplicate" transform="translate(519.000000, 0.000000)">
                            <path d="M22.5417436,23.1535575 C24.3242866,23.1535575 25.7696536,21.7073505 25.7696536,19.9239675 L25.7696536,10.2303675 C25.7696536,8.44782452 24.3242656,6.99993752 22.5417436,6.99993752 L16.0743736,6.99993752 C14.2910116,6.99993752 12.8464636,8.44614452 12.8464636,10.2303675 L12.8464636,11.8463805 L11.2312696,11.8463805 C9.45036458,11.8463805 8,13.2925875 8,15.0759705 L8,24.7695705 C8,26.5521129 9.44538758,28 11.2279096,28 L17.6952796,28 C19.4786416,28 20.9231896,26.5521551 20.9231896,24.7664205 L20.9231896,23.1536835 L22.5417436,23.1535575 Z M9.61519358,15.4803675 C9.61519358,14.3655615 10.5183616,13.4615745 11.6356246,13.4615745 L17.2875646,13.4615745 C18.4031896,13.4615745 19.3079956,14.3647425 19.3079956,15.4803675 L19.3079956,24.3652554 C19.3079956,25.4808804 18.4048276,26.3848683 17.2875646,26.3848683 L11.6356246,26.3848683 C10.5199996,26.3848683 9.61519358,25.4808804 9.61519358,24.3652554 L9.61519358,15.4803675 Z M14.4615736,10.6339875 C14.4615736,9.51918152 15.3647416,8.61519452 16.4820046,8.61519452 L22.1339446,8.61519452 C23.2495696,8.61519452 24.1543756,9.51918152 24.1543756,10.6348065 L24.1543756,19.5196944 C24.1543756,20.6345004 23.2536646,21.5384874 22.1347636,21.5384874 L20.9223496,21.5384874 L20.9223496,15.0736374 C20.9223496,13.2910944 19.4728666,11.8465695 17.6919196,11.8465695 L14.4614896,11.8465695 L14.4615736,10.6339875 Z"></path>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/upload.svg000064400000004205151215013530013205 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="16px" height="17px" viewBox="0 0 16 17" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>upload</title>
    <desc>Created with Sketch.</desc>
    <defs>
        <path d="M16.8,11.7313708 L16.8,21 C16.8,21.4418278 16.4418278,21.8 16,21.8 C15.5581722,21.8 15.2,21.4418278 15.2,21 L15.2,11.7313708 L13.3656854,13.5656854 C13.053266,13.8781049 12.546734,13.8781049 12.2343146,13.5656854 C11.9218951,13.253266 11.9218951,12.746734 12.2343146,12.4343146 L15.4343146,9.23431458 C15.746734,8.92189514 16.253266,8.92189514 16.5656854,9.23431458 L19.7656854,12.4343146 C20.0781049,12.746734 20.0781049,13.253266 19.7656854,13.5656854 C19.453266,13.8781049 18.946734,13.8781049 18.6343146,13.5656854 L16.8,11.7313708 Z M8,21 C8,20.5581722 8.3581722,20.2 8.8,20.2 C9.2418278,20.2 9.6,20.5581722 9.6,21 L9.6,23.4 C9.6,23.8418278 9.9581722,24.2 10.4,24.2 L21.6,24.2 C22.0418278,24.2 22.4,23.8418278 22.4,23.4 L22.4,21 C22.4,20.5581722 22.7581722,20.2 23.2,20.2 C23.6418278,20.2 24,20.5581722 24,21 L24,23.4 C24,24.7254834 22.9254834,25.8 21.6,25.8 L10.4,25.8 C9.0745166,25.8 8,24.7254834 8,23.4 L8,21 Z" id="path-1"></path>
    </defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-220.000000, -27.000000)">
            <g id="menu-head-footer" transform="translate(-1.000000, 0.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="tools" transform="translate(99.000000, 18.000000)">
                        <g id="upload" transform="translate(113.000000, 0.000000)">
                            <mask id="mask-2" fill="white">
                                <use xlink:href="#path-1"></use>
                            </mask>
                            <use fill="#8591B0" fill-rule="nonzero" xlink:href="#path-1"></use>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/directory.png000064400000002534151215013530013715 0ustar00�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<&iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CC 2014 (Windows)" xmpMM:InstanceID="xmp.iid:DB721B1F206611E8A913C2C3A03D56A3" xmpMM:DocumentID="xmp.did:DB721B20206611E8A913C2C3A03D56A3"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:DB721B1D206611E8A913C2C3A03D56A3" stRef:documentID="xmp.did:DB721B1E206611E8A913C2C3A03D56A3"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>��?�IDATxڤS=K\A=wf�� � ��M[�����.!]��*iR����--!�)Dwq���ͽ�����/�p`f�~�s�y$"��
v|��]=��wn�lf�(�/H�)�i�qO�P����kc�~�ou�?a�m5in����39a�|�=]��OjZ��|5�n�P�4Le���@�Vn,����^��&�R���$�Q��
�k�#�*�%&���k ��9K�!ˏ�$T�%�ئ���B*��T����R��u�u�V�2c����[���Iq�_��bpmw��W��*�Pm�㹸v���r����-N��k�J@�e}�t����9��a@�˽��5�ȯ0��QM�* =䒩�S�ӧm����!�}�g8x�<փ~ܼJ��\�nb�<��^�m
03��^~���?���e�n=+����=���ӣo�����a�`J��4���IEND�B`�themes/light/images/16px/deselect_all.svg000064400000006260151215013530014344 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="20px" height="20px" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>deselect_all</title>
    <desc>Created with Sketch.</desc>
    <defs>
        <path d="M2.66666667,2.66666667 L2.66666667,7.25 L7.25,7.25 L7.25,2.66666667 L2.66666667,2.66666667 Z M1.75,0.833333333 L8.16666667,0.833333333 C8.67292769,0.833333333 9.08333333,1.24373898 9.08333333,1.75 L9.08333333,8.16666667 C9.08333333,8.67292769 8.67292769,9.08333333 8.16666667,9.08333333 L1.75,9.08333333 C1.24373898,9.08333333 0.833333333,8.67292769 0.833333333,8.16666667 L0.833333333,1.75 C0.833333333,1.24373898 1.24373898,0.833333333 1.75,0.833333333 Z M11.8333333,0.833333333 L18.25,0.833333333 C18.756261,0.833333333 19.1666667,1.24373898 19.1666667,1.75 L19.1666667,8.16666667 C19.1666667,8.67292769 18.756261,9.08333333 18.25,9.08333333 L11.8333333,9.08333333 C11.3270723,9.08333333 10.9166667,8.67292769 10.9166667,8.16666667 L10.9166667,1.75 C10.9166667,1.24373898 11.3270723,0.833333333 11.8333333,0.833333333 Z M12.75,7.25 L17.3333333,7.25 L17.3333333,2.66666667 L12.75,2.66666667 L12.75,7.25 Z M11.8333333,10.9166667 L18.25,10.9166667 C18.756261,10.9166667 19.1666667,11.3270723 19.1666667,11.8333333 L19.1666667,18.25 C19.1666667,18.756261 18.756261,19.1666667 18.25,19.1666667 L11.8333333,19.1666667 C11.3270723,19.1666667 10.9166667,18.756261 10.9166667,18.25 L10.9166667,11.8333333 C10.9166667,11.3270723 11.3270723,10.9166667 11.8333333,10.9166667 Z M12.75,17.3333333 L17.3333333,17.3333333 L17.3333333,12.75 L12.75,12.75 L12.75,17.3333333 Z M1.75,10.9166667 L8.16666667,10.9166667 C8.67292769,10.9166667 9.08333333,11.3270723 9.08333333,11.8333333 L9.08333333,18.25 C9.08333333,18.756261 8.67292769,19.1666667 8.16666667,19.1666667 L1.75,19.1666667 C1.24373898,19.1666667 0.833333333,18.756261 0.833333333,18.25 L0.833333333,11.8333333 C0.833333333,11.3270723 1.24373898,10.9166667 1.75,10.9166667 Z M2.66666667,17.3333333 L7.25,17.3333333 L7.25,12.75 L2.66666667,12.75 L2.66666667,17.3333333 Z" id="path-1"></path>
    </defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-1258.000000, -25.000000)">
            <g id="menu-head-footer" transform="translate(-1.000000, -4.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="tools" transform="translate(99.000000, 0.000000)">
                        <g id="deselect" transform="translate(1152.000000, 22.000000)">
                            <g id="deselect_all" transform="translate(7.000000, 7.000000)">
                                <mask id="mask-2" fill="white">
                                    <use xlink:href="#path-1"></use>
                                </mask>
                                <use id="Combined-Shape" fill="#8591B0" fill-rule="nonzero" xlink:href="#path-1"></use>
                            </g>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/deselect_all.png000064400000000633151215013530014327 0ustar00�PNG


IHDR�a	pHYs��MIDATxڭ�Kn�0�9Td�[A�b �U�$�N
�z)�
(vŢi�Y�<�`�0�/�.!���\ ���qvY�iqkqii�j�d���GO~��v��RE���`�S����x\D"�x,
�c�u�m[6M��� l��#�����O��4
��[�=�w^�}�-`L~um9&�^Xt8�N��z���-��$����:Ap���3��[��uϙ8��UU��q\��?��u]s�w
�/��S@5q
h���0�Dq
��`���8��SX~�(T%��@2A���=�)%�m���e��0����u]�yߍ/x
h�ˇ�IEND�B`�themes/light/images/16px/forward.png000064400000002075151215013530013355 0ustar00�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<&iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CC 2014 (Windows)" xmpMM:InstanceID="xmp.iid:FF20C3D6206111E89D8CF9C9C7BB4B29" xmpMM:DocumentID="xmp.did:FF20C3D7206111E89D8CF9C9C7BB4B29"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FF20C3D4206111E89D8CF9C9C7BB4B29" stRef:documentID="xmp.did:FF20C3D5206111E89D8CF9C9C7BB4B29"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>�u�IDATx�b���?%���Rr2�N ��e8�zl�v�'�19.
 ���X�z��0��| 6'�`�L ^�a�p!��� �'&��_ �1+��,@��B�^� ^�6��
O��@�@j4��" �b>B^f��{�x)�%���L����IEND�B`�themes/light/images/16px/netmount.png000064400000002333151215013530013557 0ustar00�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<&iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CC 2014 (Windows)" xmpMM:InstanceID="xmp.iid:0E6CC054206811E8BC35D088356C6F2D" xmpMM:DocumentID="xmp.did:0E6CC055206811E8BC35D088356C6F2D"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:0E6CC052206811E8BC35D088356C6F2D" stRef:documentID="xmp.did:0E6CC053206811E8BC35D088356C6F2D"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>A��sKIDATx��S�N�@�}i�@�H�u�+ !!�����>@���ؐX�SX@H��������P2��s>�;ۗ��R�(�	"S��M�d
��.��
�@Yb"m{�1@ch�=�-�@�1[$�
~�?f`A5��>��6���J�Ԁ���:�c��Ay���?�� �������}��D��d�X�"8Z�n�#h�������?�}+�e����s����ۢ���RXeR�p�.'Q��}�g.MI����+!�"�̫���=f���Q��T3��mQ���;I����PMv=��N�+���އw�����g�`��z;����IEND�B`�themes/light/images/16px/undo.png000064400000001235151215013530012653 0ustar00�PNG


IHDR�a	pHYs��OIDATx�chhh`�Ɔz0]� ~k}C[]Cs}
\�
�%����k���J���J������ںz���r�<�M@B���ֵ�u�1d5L�q�;��dƋ�&����~�YD����:��jC�DkM�Sω=���D5.Lӝ���/�']��5��>��>.���c�@C8�\&Z�xv�[�6�����N��<�q�sSM9X����7�o�"�ſ�G�l����ף�����
�������ߺ��ź�*�` �-��d���ap�q���G_����@�@��{jM}��xʣ3^�w�9����A��z�KJ�&\i5��Ҧn��*�
@�Tַ�5tH�7��qqc�ju}37H�A�N:��f��@uR�XC�F�M��F�
@�Arm�ey
������v�zC-Ps}��`X�j�+g(��T����ق��3Zf���V��^�u�jV��0Z��L��RP4@c�Ț��-�=|a0����e�5%`�c$$T\�j���^]��_���?�
����{RFƍ j�Y��/_Ӝ��x+n��]�(����;���,�\��A#8�j
���f]�^C%0GIEND�B`�themes/light/images/16px/resize.svg000064400000003312151215013530013220 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="18px" height="18px" viewBox="0 0 18 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>resize</title>
    <desc>Created with Sketch.</desc>
    <defs></defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-728.000000, -26.000000)" fill="#8591B0">
            <g id="menu-head-footer" transform="translate(-1.000000, 0.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="tools" transform="translate(99.000000, 18.000000)">
                        <g id="resize" transform="translate(621.000000, 0.000000)">
                            <g transform="translate(8.000000, 8.000000)">
                                <polygon id="Fill-1" points="10.5307826 0.170432609 16.0716522 0.163553478 17.9058913 0.160497391 17.9081843 1.99549957 17.9142985 7.53558652 16.0815854 7.53864261 16.0762363 3.35129478 10.7263233 8.46349043 9.45992543 7.13749696 14.834295 1.99927957 10.5330776 2.00386565"></polygon>
                                <polygon id="Fill-2" points="7.46921739 17.8295866 1.92834783 17.8364649 0.0933454565 17.8395222 0.0918170217 16.003757 0.0918170217 16.004522 0.0849386739 10.464435 1.91917761 10.462142 1.9245287 14.6481202 7.27365913 9.53670717 8.54082 10.8627007 3.16566783 16.0001354 7.46688522 15.9955493"></polygon>
                            </g>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/info.png000064400000003125151215013530012641 0ustar00�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<&iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CC 2014 (Windows)" xmpMM:InstanceID="xmp.iid:BA61013B206211E8B50AD90BEAB57D44" xmpMM:DocumentID="xmp.did:BA61013C206211E8B50AD90BEAB57D44"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:BA610139206211E8B50AD90BEAB57D44" stRef:documentID="xmp.did:BA61013A206211E8B50AD90BEAB57D44"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>6%�IDATxڤSKKUQ^k?�=���5H�DJj$9���g�0�h 4nԏ�"�
�*E:�hp��h�'�I�ޛ�=��s�^����ۇ�����z 3�,7o<�P�[�:�R�9嗀�( V��
_Ze��T��jpk�Am*��a����ȨM[tOs=�����[w�AX����9�1#9ô�Ҟ�I�8N�Y+G���ny�=��=+��"�L�΄�1v^�;;x���$!��Zm�5����ʨ��������+<�0#E`����5ϲ�bG�_
�{���bI���[�#�W>�#�]NUY�y1�QI��Q��o�tmOw�c��~�A��'`�g�}5���z4�7�����y'޼^�Ѻ�H��K�Ͻ�?`�%���� ���[`جB�3��2	\!e���`��׾�� ��I ��'/ަ@Cʲ]��,hkc+hk�ت5f�d���{��
e�x�ȯ�������2H�iD�K���(�"���@�q�^!`U�#���c}{��^j�y`!�� P�n��N|�UР����7����b�@.����l��T��saa�~�~\����d��Y@�mltb����yZr�:���9([����:�0�meD5a�Ln�����&|"g�#�Z�6A�NX��ZU�*I��#�3r�Ϝ5Rқ��R��"����0��[
���0|C~;$o�IEND�B`�themes/light/images/16px/upload.png000064400000002370151215013530013173 0ustar00�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<&iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CC 2014 (Windows)" xmpMM:InstanceID="xmp.iid:CBEB32E9206411E8BB658DBC03A9563C" xmpMM:DocumentID="xmp.did:CBEB32EA206411E8BB658DBC03A9563C"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:CBEB32E7206411E8BB658DBC03A9563C" stRef:documentID="xmp.did:CBEB32E8206411E8BB658DBC03A9563C"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>E��^hIDATxڤS�NA����"�� p��AZ� �&|�	�@ A!*�H0�`$HDr������Ӽ��̛w��s,"�k�c:�5B����Z�mn�1��:g<R��Z����ΐ�(���l�Y���GA���ۂ�O�
�˘��\/���c!��J䀙OY����4s}@���<��\�i�"3��p��M�pvu�\���4Op��jM�j]�Ƌ։IK�jV��_�5�=�����������7hʨlLm���X��Hk�-�{�쾤!��*n큔���b�����x����Ä������C,W�a�Q;>"��Z��s�O ҷ��P��x�66/u�#��d�1
̃IEND�B`�themes/light/images/16px/file.svg000064400000006363151215013530012647 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="16px" height="20px" viewBox="0 0 16 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>textfile</title>
    <desc>Created with Sketch.</desc>
    <defs>
        <path d="M24.2222222,15.1111111 L19.7777778,15.1111111 C19.286858,15.1111111 18.8888889,14.713142 18.8888889,14.2222222 L18.8888889,9.77777778 L12.6666667,9.77777778 C12.1757469,9.77777778 11.7777778,10.1757469 11.7777778,10.6666667 L11.7777778,24.8888889 C11.7777778,25.3798087 12.1757469,25.7777778 12.6666667,25.7777778 L23.3333333,25.7777778 C23.8242531,25.7777778 24.2222222,25.3798087 24.2222222,24.8888889 L24.2222222,15.1111111 L25.1111111,15.1111111 C25.6020309,15.1111111 26,14.713142 26,14.2222222 C26,14.0994923 25.9751269,13.9825718 25.9301467,13.8762266 C25.9765874,13.9888881 26,14.1043482 26,14.2222222 L26,24.8888889 C26,26.3616482 24.8060927,27.5555556 23.3333333,27.5555556 L12.6666667,27.5555556 C11.1939073,27.5555556 10,26.3616482 10,24.8888889 L10,10.6666667 C10,9.19390733 11.1939073,8 12.6666667,8 L19.7777778,8 C20.0135258,8 20.2396181,8.09365052 20.4063171,8.26034953 L25.7396505,13.5936829 C25.823,13.6770324 25.8880874,13.7752302 25.9323374,13.8820592 Z M20.6666667,11.0348565 L20.6666667,13.3333333 L22.9651435,13.3333333 L20.6666667,11.0348565 Z M21.5555556,17.7777778 C22.0464753,17.7777778 22.4444444,18.1757469 22.4444444,18.6666667 C22.4444444,19.1575864 22.0464753,19.5555556 21.5555556,19.5555556 L14.4444444,19.5555556 C13.9535247,19.5555556 13.5555556,19.1575864 13.5555556,18.6666667 C13.5555556,18.1757469 13.9535247,17.7777778 14.4444444,17.7777778 L21.5555556,17.7777778 Z M21.5555556,21.3333333 C22.0464753,21.3333333 22.4444444,21.7313024 22.4444444,22.2222222 C22.4444444,22.713142 22.0464753,23.1111111 21.5555556,23.1111111 L14.4444444,23.1111111 C13.9535247,23.1111111 13.5555556,22.713142 13.5555556,22.2222222 C13.5555556,21.7313024 13.9535247,21.3333333 14.4444444,21.3333333 L21.5555556,21.3333333 Z M16.2222222,14.2222222 C16.713142,14.2222222 17.1111111,14.6201913 17.1111111,15.1111111 C17.1111111,15.6020309 16.713142,16 16.2222222,16 L14.4444444,16 C13.9535247,16 13.5555556,15.6020309 13.5555556,15.1111111 C13.5555556,14.6201913 13.9535247,14.2222222 14.4444444,14.2222222 L16.2222222,14.2222222 Z" id="path-1"></path>
    </defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-978.000000, -26.000000)">
            <g id="menu-head-footer" transform="translate(-1.000000, 0.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="tools" transform="translate(99.000000, 18.000000)">
                        <g id="textfile" transform="translate(869.000000, 0.000000)">
                            <mask id="mask-2" fill="white">
                                <use xlink:href="#path-1"></use>
                            </mask>
                            <use fill="#8591B0" fill-rule="nonzero" xlink:href="#path-1"></use>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/paste.png000064400000002501151215013530013017 0ustar00�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<&iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CC 2014 (Windows)" xmpMM:InstanceID="xmp.iid:701F6CAF206511E8B9EBF8BA58955C56" xmpMM:DocumentID="xmp.did:701F6CB0206511E8B9EBF8BA58955C56"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:701F6CAD206511E8B9EBF8BA58955C56" stRef:documentID="xmp.did:701F6CAE206511E8B9EBF8BA58955C56"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>���,�IDATxڔSM(DQ>���!Q~K�ذ@Y�����NIR�Bʞ��I�������F(����D�7���=��̘��9�s�=�~�{�{.��2���g�騣������P���)f1"��e<
�n���ܬ��Q�?���HS�ض��ꍝ��p�iіu
~��v����zyI�pDZ�o��LM�[{'
J�R[�ixg�
j`�\�>�^^���}��'����{{���9�VB�݆���:$m-D"o��H|q#����X�Cp�D�]�}��"��/<%�D���CB�%Ѣ���CB�{��?ۿ$IZ�/?�ѣ^_�!��Ab���E`1�;�6-�~����#0�=�F��}H��د�(��T�H�w���C�D�2�1;��@�c�e���|��ɉwfʑ�U�<@�D��$ԳPIEND�B`�themes/light/images/16px/search.png000064400000001213151215013530013147 0ustar00�PNG


IHDR�a	pHYs��=IDATxڕS�OA�����/z.��p!1F&&zP��R��;;�����mSii-�Z�$���d����HbPI��&妉<�o���-6�d33��޷D�4�?0���D�2QU��~_��N24q8����uN	gJ{�W(Ig�����+�>N��\)�MG�`�;���U�a��éЋ/���5�Nn�����*���Ũ�d�N�=+
1���O?Ծ?����'�Z�a�"�v^��tanLg�!��&vo��{fc�snĖ�Q��������/��|�I��X�I}|m�YlL�2���|qAY����a�g�,�@�������6$�D�Q��>�N�W�^��r\q�
x�BFf槱���F��Y:�K.���F36F�-������:��t%�h6o�~r_.��;=��-m4���ķ{����1?8%�ç�#h�rr"oOer}3t��)�	R�,��>�~���4AD#Pۭ=!�&�:���8{Yl.*��
U���B%.�޾A�`w)���亀�c�S��{k�a�Ȼ<(�CX�8��A&ؘ�d-RIEND�B`�themes/light/images/16px/view.svg000064400000015520151215013530012675 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="17px" height="17px" viewBox="0 0 17 17" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>tumblnails</title>
    <desc>Created with Sketch.</desc>
    <defs></defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-853.000000, -26.000000)" fill="#8591B0">
            <g id="menu-head-footer" transform="translate(-1.000000, 0.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="tools" transform="translate(99.000000, 18.000000)">
                        <g id="view" transform="translate(745.000000, 0.000000)">
                            <g id="tumblnails" transform="translate(9.000000, 8.000000)">
                                <path d="M3.54166667,0 L0.708333333,0 C0.316819792,0 0,0.316819792 0,0.708333333 L0,3.54166667 C0,3.72981771 0.0747079167,3.90966354 0.207523958,4.04247604 C0.34034,4.17528854 0.520182292,4.25 0.708333333,4.25 L3.54166667,4.25 C3.72981771,4.25 3.90966354,4.17529208 4.04247604,4.04247604 C4.17528854,3.90966 4.25,3.72981771 4.25,3.54166667 L4.25,0.708333333 C4.25,0.520182292 4.17529208,0.340336458 4.04247604,0.207523958 C3.90966,0.0747114583 3.72981771,0 3.54166667,0 Z M2.83333333,2.83333333 L1.41666667,2.83333333 L1.41666667,1.41666667 L2.83333333,1.41666667 L2.83333333,2.83333333 Z" id="Fill-1"></path>
                                <path d="M7.08333333,4.25 L9.91666667,4.25 C10.1048177,4.25 10.2846635,4.17529208 10.417476,4.04247604 C10.5502885,3.90966 10.625,3.72981771 10.625,3.54166667 L10.625,0.708333333 C10.625,0.520182292 10.5502921,0.340336458 10.417476,0.207523958 C10.28466,0.0747114583 10.1048177,0 9.91666667,0 L7.08333333,0 C6.69181979,0 6.375,0.316819792 6.375,0.708333333 L6.375,3.54166667 C6.375,3.72981771 6.44970792,3.90966354 6.58252396,4.04247604 C6.71534,4.17528854 6.89518229,4.25 7.08333333,4.25 Z M7.79166667,1.41666667 L9.20833333,1.41666667 L9.20833333,2.83333333 L7.79166667,2.83333333 L7.79166667,1.41666667 Z" id="Fill-2"></path>
                                <path d="M16.2916667,0 L13.4583333,0 C13.0668198,0 12.75,0.316819792 12.75,0.708333333 L12.75,3.54166667 C12.75,3.72981771 12.8247079,3.90966354 12.957524,4.04247604 C13.09034,4.17528854 13.2701823,4.25 13.4583333,4.25 L16.2916667,4.25 C16.4798177,4.25 16.6596635,4.17529208 16.792476,4.04247604 C16.9252885,3.90966 17,3.72981771 17,3.54166667 L17,0.708333333 C17,0.520182292 16.9252921,0.340336458 16.792476,0.207523958 C16.65966,0.0747114583 16.4798177,0 16.2916667,0 Z M15.5833333,2.83333333 L14.1666667,2.83333333 L14.1666667,1.41666667 L15.5833333,1.41666667 L15.5833333,2.83333333 Z" id="Fill-3"></path>
                                <path d="M0.708333333,10.625 L3.54166667,10.625 C3.72981771,10.625 3.90966354,10.5502921 4.04247604,10.417476 C4.17528854,10.28466 4.25,10.1048177 4.25,9.91666667 L4.25,7.08333333 C4.25,6.89518229 4.17529208,6.71533646 4.04247604,6.58252396 C3.90966,6.44971146 3.72981771,6.375 3.54166667,6.375 L0.708333333,6.375 C0.316819792,6.375 0,6.69181979 0,7.08333333 L0,9.91666667 C0,10.1048177 0.0747079167,10.2846635 0.207523958,10.417476 C0.34034,10.5502885 0.520182292,10.625 0.708333333,10.625 Z M1.41666667,7.79166667 L2.83333333,7.79166667 L2.83333333,9.20833333 L1.41666667,9.20833333 L1.41666667,7.79166667 Z" id="Fill-4"></path>
                                <path d="M6.375,9.91666667 C6.375,10.1048177 6.44970792,10.2846635 6.58252396,10.417476 C6.71534,10.5502885 6.89518229,10.625 7.08333333,10.625 L9.91666667,10.625 C10.1048177,10.625 10.2846635,10.5502921 10.417476,10.417476 C10.5502885,10.28466 10.625,10.1048177 10.625,9.91666667 L10.625,7.08333333 C10.625,6.89518229 10.5502921,6.71533646 10.417476,6.58252396 C10.28466,6.44971146 10.1048177,6.375 9.91666667,6.375 L7.08333333,6.375 C6.69181979,6.375 6.375,6.69181979 6.375,7.08333333 L6.375,9.91666667 Z M7.79166667,7.79166667 L9.20833333,7.79166667 L9.20833333,9.20833333 L7.79166667,9.20833333 L7.79166667,7.79166667 Z" id="Fill-5"></path>
                                <path d="M16.2916667,6.375 L13.4583333,6.375 C13.0668198,6.375 12.75,6.69181979 12.75,7.08333333 L12.75,9.91666667 C12.75,10.1048177 12.8247079,10.2846635 12.957524,10.417476 C13.09034,10.5502885 13.2701823,10.625 13.4583333,10.625 L16.2916667,10.625 C16.4798177,10.625 16.6596635,10.5502921 16.792476,10.417476 C16.9252885,10.28466 17,10.1048177 17,9.91666667 L17,7.08333333 C17,6.89518229 16.9252921,6.71533646 16.792476,6.58252396 C16.65966,6.44971146 16.4798177,6.375 16.2916667,6.375 Z M15.5833333,9.20833333 L14.1666667,9.20833333 L14.1666667,7.79166667 L15.5833333,7.79166667 L15.5833333,9.20833333 Z" id="Fill-6"></path>
                                <path d="M0,16.2916667 C0,16.4798177 0.0747079167,16.6596635 0.207523958,16.792476 C0.34034,16.9252885 0.520182292,17 0.708333333,17 L3.54166667,17 C3.72981771,17 3.90966354,16.9252921 4.04247604,16.792476 C4.17528854,16.65966 4.25,16.4798177 4.25,16.2916667 L4.25,13.4583333 C4.25,13.2701823 4.17529208,13.0903365 4.04247604,12.957524 C3.90966,12.8247115 3.72981771,12.75 3.54166667,12.75 L0.708333333,12.75 C0.316819792,12.75 0,13.0668198 0,13.4583333 L0,16.2916667 Z M1.41666667,14.1666667 L2.83333333,14.1666667 L2.83333333,15.5833333 L1.41666667,15.5833333 L1.41666667,14.1666667 Z" id="Fill-7"></path>
                                <path d="M6.375,16.2916667 C6.375,16.4798177 6.44970792,16.6596635 6.58252396,16.792476 C6.71534,16.9252885 6.89518229,17 7.08333333,17 L9.91666667,17 C10.1048177,17 10.2846635,16.9252921 10.417476,16.792476 C10.5502885,16.65966 10.625,16.4798177 10.625,16.2916667 L10.625,13.4583333 C10.625,13.2701823 10.5502921,13.0903365 10.417476,12.957524 C10.28466,12.8247115 10.1048177,12.75 9.91666667,12.75 L7.08333333,12.75 C6.69181979,12.75 6.375,13.0668198 6.375,13.4583333 L6.375,16.2916667 Z M7.79166667,14.1666667 L9.20833333,14.1666667 L9.20833333,15.5833333 L7.79166667,15.5833333 L7.79166667,14.1666667 Z" id="Fill-8"></path>
                                <path d="M16.2916667,12.75 L13.4583333,12.75 C13.0668198,12.75 12.75,13.0668198 12.75,13.4583333 L12.75,16.2916667 C12.75,16.4798177 12.8247079,16.6596635 12.957524,16.792476 C13.09034,16.9252885 13.2701823,17 13.4583333,17 L16.2916667,17 C16.4798177,17 16.6596635,16.9252921 16.792476,16.792476 C16.9252885,16.65966 17,16.4798177 17,16.2916667 L17,13.4583333 C17,13.2701823 16.9252921,13.0903365 16.792476,12.957524 C16.65966,12.8247115 16.4798177,12.75 16.2916667,12.75 Z M15.5833333,15.5833333 L14.1666667,15.5833333 L14.1666667,14.1666667 L15.5833333,14.1666667 L15.5833333,15.5833333 Z" id="Fill-9"></path>
                            </g>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/preview.svg000064400000004074151215013530013406 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="19px" height="20px" viewBox="0 0 19 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>preview</title>
    <desc>Created with Sketch.</desc>
    <defs></defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-1044.000000, -25.000000)" fill="#8591B0">
            <g id="menu-head-footer" transform="translate(-1.000000, 0.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="tools" transform="translate(99.000000, 18.000000)">
                        <g id="preview" transform="translate(937.000000, 0.000000)">
                            <path d="M25.302566,9.6614688 L17.898386,9.6614688 L17.898386,7.9986648 C17.898386,7.5457848 17.52119,7.1672628 17.066984,7.1672628 C16.614104,7.1672628 16.235582,7.5444588 16.235582,7.9986648 L16.235582,9.6614688 L8.831402,9.6614688 C8.378522,9.6614688 8,10.0386648 8,10.4928708 L8,20.3899308 C8,20.8428108 8.377196,21.2213328 8.831402,21.2213328 L15.668462,21.2213328 L13.061342,25.7542128 C12.8342322,26.1314088 12.9856376,26.6613328 13.3641528,26.8870928 C13.7413488,27.1142026 14.2712728,26.9627972 14.4970328,26.584282 L17.0656308,22.051402 L19.6342288,26.584282 C19.7856342,26.8485776 20.0499468,27 20.3514248,27 C20.5028302,27 20.6157204,26.9628108 20.7671428,26.8871098 C21.1443388,26.66 21.2957408,26.1699138 21.069957,25.7542298 L18.462837,21.2213498 L25.299897,21.2213498 C25.752777,21.2213498 26.131299,20.8441538 26.131299,20.3899478 L26.1339544,10.4541278 C26.1339544,10.0012478 25.7554324,9.6612478 25.3025524,9.6612478 L25.302566,9.6614688 Z M24.471164,19.5214688 L9.662464,19.5214688 L9.662464,11.2856488 L24.509584,11.2856488 L24.509584,19.5214688 L24.471164,19.5214688 Z"></path>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/arrow_down.svg000064400000003075151215013530014106 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="10px" height="6px" viewBox="0 0 10 6" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>Shape</title>
    <desc>Created with Sketch.</desc>
    <defs>
        <path d="M5,4.05719096 L1.47140452,0.528595479 C1.21105499,0.268245951 0.788945007,0.268245951 0.528595479,0.528595479 C0.268245951,0.788945007 0.268245951,1.21105499 0.528595479,1.47140452 L4.52859548,5.47140452 C4.78894501,5.73175405 5.21105499,5.73175405 5.47140452,5.47140452 L9.47140452,1.47140452 C9.73175405,1.21105499 9.73175405,0.788945007 9.47140452,0.528595479 C9.21105499,0.268245951 8.78894501,0.268245951 8.52859548,0.528595479 L5,4.05719096 Z" id="path-1"></path>
    </defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-21.000000, -99.000000)">
            <g id="menu-head-footer" transform="translate(-1.000000, 0.000000)">
                <g id="side-bar" transform="translate(1.000000, 69.000000)">
                    <g id="chevron-down" transform="translate(21.000000, 30.000000)">
                        <mask id="mask-2" fill="white">
                            <use xlink:href="#path-1"></use>
                        </mask>
                        <use id="Shape" fill="#323232" fill-rule="nonzero" xlink:href="#path-1"></use>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/up.png000064400000000566151215013530012340 0ustar00�PNG


IHDR�a=IDAT8�œ�N�P�ǐ.�-���4
		��998���t/�AR^�����\�L�����2��7�?����

RU����P�1/��-�^��\��{SÊYUW�Z�(�(��Z���RU��y��f3��4���q�0���>o'y�4�s� /[�+�I��qv��K���q���X��i���tZ�0���e�k�p_�X,*fcL0����,�H���k��h���yƘ'`X���E�$����i��:�L��Ps���܍��|[D��*W�j�-"�u
��������D���O�qJ�h���IEND�B`�themes/light/images/16px/archive.svg000064400000006207151215013530013346 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="17px" height="21px" viewBox="0 0 17 21" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>zip</title>
    <desc>Created with Sketch.</desc>
    <defs></defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-808.000000, -25.000000)" fill="#8591B0">
            <g id="menu-head-footer" transform="translate(-1.000000, 0.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="tools" transform="translate(99.000000, 18.000000)">
                        <g id="archive" transform="translate(700.000000, 0.000000)">
                            <path d="M9,8.7546546 C9,7.7850426 9.779289,6.9999996 10.747263,6.9999996 L23.877093,6.9999996 C24.841791,6.9999996 25.624356,7.7850426 25.624356,8.7546546 L25.624356,26.245345 C25.624356,27.214957 24.845067,28 23.877093,28 L10.747263,28 C9.782565,28 9,27.214957 9,26.245345 L9,8.7546546 Z M23.87472,8.7546546 C23.87472,8.7505533 10.74888,8.7497322 10.74888,8.7497322 C10.7497011,8.7505533 10.7497011,26.245252 10.7497011,26.245252 C10.7497011,26.2493535 23.8755411,26.250174 23.8755411,26.250174 C23.87472,26.2493535 23.87472,8.7546546 23.87472,8.7546546 Z M15.07026,17.4975846 C15.1006113,17.0152356 15.513234,16.6247826 15.999678,16.6247826 L18.624678,16.6247826 C19.107846,16.6247826 19.52373,17.0160756 19.554096,17.4975846 L19.782954,21.1570446 C19.8682665,22.5204066 18.830562,23.6253846 17.465604,23.6253846 L17.158815,23.6253846 C15.793815,23.6253846 14.756205,22.5237036 14.841465,21.1570446 L15.07026,17.4975846 Z M16.587846,21.2660346 C16.5656973,21.6236856 16.801941,21.8746986 17.158794,21.8746986 L17.465583,21.8746986 C17.820777,21.8746986 18.058665,21.6220476 18.036531,21.2660346 L17.8560612,18.3751746 L16.7683242,18.3751746 L16.587846,21.2660346 Z M16.4369085,8.7496146 L18.1874475,8.7496146 L18.1874475,10.0580196 C18.1874475,10.3024806 17.9930337,10.5001746 17.7452925,10.5001746 L16.8790425,10.5001746 C16.6345815,10.5001746 16.4368875,10.3057608 16.4368875,10.0580196 L16.4369085,8.7496146 Z M16.4369085,14.4416646 C16.4369085,14.1972036 16.6313223,13.9995096 16.8790635,13.9995096 L17.7453135,13.9995096 C17.9897745,13.9995096 18.1874685,14.1939234 18.1874685,14.4416646 L18.1874685,15.3079146 C18.1874685,15.5523756 17.9930547,15.7500696 17.7453135,15.7500696 L16.8790635,15.7500696 C16.6346025,15.7500696 16.4369085,15.5556558 16.4369085,15.3079146 L16.4369085,14.4416646 Z M16.4369085,11.8166646 C16.4369085,11.5722036 16.6313223,11.3745096 16.8790635,11.3745096 L17.7453135,11.3745096 C17.9897745,11.3745096 18.1874685,11.5689234 18.1874685,11.8166646 L18.1874685,12.6829146 C18.1874685,12.9273756 17.9930547,13.1250696 17.7453135,13.1250696 L16.8790635,13.1250696 C16.6346025,13.1250696 16.4369085,12.9306558 16.4369085,12.6829146 L16.4369085,11.8166646 Z" id="zip"></path>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/undo.svg000064400000003647151215013530012677 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="17px" height="14px" viewBox="0 0 17 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>undo</title>
    <desc>Created with Sketch.</desc>
    <defs></defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-1088.000000, -27.000000)" fill="#8591B0">
            <g id="menu-head-footer" transform="translate(-1.000000, -4.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="tools" transform="translate(99.000000, 0.000000)">
                        <g id="undo" transform="translate(961.000000, 0.000000)">
                            <path d="M12.4910865,34.333596 C12.66687,34.509375 12.605346,34.65 12.35925,34.65 L5.175,34.65 C2.31678,34.65 0,36.96678 0,39.825 C0,42.684975 2.31327,45 5.175,45 L9.01404,45 C9.6363,45 10.140795,44.50077 10.140795,43.875 C10.140795,43.254495 9.638055,42.75 9.01404,42.75 L5.175,42.75 C3.55779,42.75 2.25,41.44221 2.25,39.825 C2.25,38.20959 3.55959,36.9 5.175,36.9 L12.35925,36.9 C12.6088605,36.9 12.668625,37.0423845 12.4910865,37.2181635 L11.8038015,37.9054485 C11.3643495,38.3449005 11.36259,39.0533085 11.8038015,39.4962885 C12.2432535,39.9357405 12.9551715,39.9375 13.3963965,39.494529 L16.3196415,36.5730435 C16.7590935,36.131832 16.7626125,35.4216735 16.3196415,34.9786935 L13.3963965,32.0572035 C12.9569445,31.615992 12.2467815,31.6124775 11.8038015,32.055444 C11.3661045,32.494896 11.3643495,33.206814 11.8038015,33.646284 L12.4910865,34.333596 Z" transform="translate(22.500000, 22.500000) scale(-1, 1) translate(-22.500000, -22.500000) "></path>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/open.png000064400000002574151215013530012656 0ustar00�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<&iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CC 2014 (Windows)" xmpMM:InstanceID="xmp.iid:275D2D6D206511E8B16D8B51EE26D51A" xmpMM:DocumentID="xmp.did:275D2D6E206511E8B16D8B51EE26D51A"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:275D2D6B206511E8B16D8B51EE26D51A" stRef:documentID="xmp.did:275D2D6C206511E8B16D8B51EE26D51A"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>�_��IDATxڤS;hQ=��o7AL "�Q$`���B!�����R��`�Z��t�h�6�Fl,QDX?(X��b0�f�dg���}��8�I�μ9��;�;$"��4�=�,���"�4��#�'�>��xX	��`���3�P������ܾq�'`��ty���R:2vh���]�
�[E�;���9�> ��F��K�@`[J)�<��Ï�H%���9(�젞C`|l�1��-"��Q�K=��v�y�۩���ٯ�_
���(��wd˥�[C���7�|C��H�֚�t���.�|O�%LvI,�D�u�ϋ]Ÿv���w�o��k�7��M�NOF�R
d�3�]�v�1x.�O���cy�$�W`��~��3R�W��o�hD��ΐ�˜U���j�0�j�ZҕRbaYЋ-���}Cg�a��0��=Q}=8U�\�/�~z���,D�Zj��$@D���1-DU�B���HCc+�����?iQu���YH��bG IEND�B`�themes/light/images/16px/edit.png000064400000002755151215013530012643 0ustar00�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<&iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CC 2014 (Windows)" xmpMM:InstanceID="xmp.iid:0317F53E206311E88D7FCD873F473808" xmpMM:DocumentID="xmp.did:0317F53F206311E88D7FCD873F473808"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:0317F53C206311E88D7FCD873F473808" stRef:documentID="xmp.did:0317F53D206311E88D7FCD873F473808"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>�y]IDATxڄS�kA~����n��Ĥ�d4m�?(As�[�'QA,�B+T���?�z��Jo��A�f�"�hmM-��&�m�����&Qۦm�a���{�
���G����o��v���K'CA��{N�� A�EH�y�׶ߗW�3�o�-�A�9!$Ee�4���	�ɸ>��	v"�pr�1HǺ���Vf���7�B�DЁ���7��0�%�P&����{+Z<�9�P�&
>~��K�@w�z-�mgAEُQv?0�	�d��~T���KF�6��i#n����z�'��خ���7����+ق=��{b��a[1�'�	�ql�	����>�~��yk(V�&c�]�>R��JՅ���f��A�w���

�eW����=a�`���12%P,;���¯�;��ʪ����Fّ\�v�+�՗h�!c���R�N�P�"̵��L�_�G�8�w
�5��ve�/�_s���j10q��"ݺ�l(�t<oT��Q.���`�P��l��u�9���_��HVr~�!"�$�1��C�e���N��]���	f#�?���z��Sx�7�r&)��]��F�h�����`���B���IEND�B`�themes/light/images/16px/getfile.svg000064400000005060151215013530013340 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="19px" height="20px" viewBox="0 0 19 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>selectfile</title>
    <desc>Created with Sketch.</desc>
    <defs>
        <path d="M26,16.6436541 L26,24.8888889 C26,26.3616482 24.8060927,27.5555556 23.3333333,27.5555556 L12.6666667,27.5555556 C11.1939073,27.5555556 10,26.3616482 10,24.8888889 L10,10.6666667 C10,9.19390733 11.1939073,8 12.6666667,8 L19.7777778,8 C20.0135258,8 20.2396181,8.09365052 20.4063171,8.26034953 L25.7396505,13.5936829 C25.823,13.6770324 25.8880874,13.7752302 25.9323374,13.8820592 L19.7777778,15.1111111 C19.286858,15.1111111 18.8888889,14.713142 18.8888889,14.2222222 L18.8888889,9.77777778 L12.6666667,9.77777778 C12.1757469,9.77777778 11.7777778,10.1757469 11.7777778,10.6666667 L11.7777778,24.8888889 C11.7777778,25.3798087 12.1757469,25.7777778 12.6666667,25.7777778 L23.3333333,25.7777778 C23.8242531,25.7777778 24.2222222,25.3798087 24.2222222,24.8888889 L24.2222222,17.8110412 L17.9601914,21.9230364 L17.9226246,21.8654345 L17.8499979,21.9230364 L15,18.2878514 L16.5139231,17.1020246 L18.3095891,19.3935375 L24.2222222,15.5109084 L24.2222222,15.1111111 L24.8310506,15.1111111 L25.9909657,14.3494335 C25.9969193,14.3078878 26,14.2654148 26,14.2222222 C26,14.0994923 25.9751269,13.9825718 25.9301467,13.8762266 C25.9765874,13.9888881 26,14.1043482 26,14.2222222 L26,14.343501 L27.4456361,13.3942 L28.5,15.002016 L26,16.6436541 Z M20.6666667,11.0348565 L20.6666667,13.3333333 L22.9651435,13.3333333 L20.6666667,11.0348565 Z" id="path-1"></path>
    </defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-1012.000000, -26.000000)">
            <g id="menu-head-footer" transform="translate(-1.000000, 0.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="tools" transform="translate(99.000000, 18.000000)">
                        <g id="select" transform="translate(903.000000, 0.000000)">
                            <mask id="mask-2" fill="white">
                                <use xlink:href="#path-1"></use>
                            </mask>
                            <use id="selectfile" fill="#8591B0" fill-rule="nonzero" xlink:href="#path-1"></use>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/rm.png000064400000002171151215013530012324 0ustar00�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<&iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CC 2014 (Windows)" xmpMM:InstanceID="xmp.iid:63B80D7F206211E88422E06AF9047C94" xmpMM:DocumentID="xmp.did:63B80D80206211E88422E06AF9047C94"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:63B80D7D206211E88422E06AF9047C94" stRef:documentID="xmp.did:63B80D7E206211E88422E06AF9047C94"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>E�]�IDATx�b���?%�D�Oڸ�������5�*��5>
m���20�^����<o&�(P3�%�@��x5��[�1h3##�U��6.C�4k�Ԃ�
�8���!X4;¼�
D� N�#�k�E6�!`��q�n$�15�`�ڬ�̌Ħ����/�XY9�@_3ዪ�L�W �/��^h��g<㳠2��5����ӌ#��Gx�1�GqiF6&G�y����X����1�IEND�B`�themes/light/images/16px/arrow_right.svg000064400000003233151215013530014250 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="6px" height="10px" viewBox="0 0 6 10" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>Shape</title>
    <desc>Created with Sketch.</desc>
    <defs>
        <path d="M3,11.057191 L-0.528595479,7.52859548 C-0.788945007,7.26824595 -1.21105499,7.26824595 -1.47140452,7.52859548 C-1.73175405,7.78894501 -1.73175405,8.21105499 -1.47140452,8.47140452 L2.52859548,12.4714045 C2.78894501,12.731754 3.21105499,12.731754 3.47140452,12.4714045 L7.47140452,8.47140452 C7.73175405,8.21105499 7.73175405,7.78894501 7.47140452,7.52859548 C7.21105499,7.26824595 6.78894501,7.26824595 6.52859548,7.52859548 L3,11.057191 Z" id="path-1"></path>
    </defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-47.000000, -129.000000)">
            <g id="menu-head-footer" transform="translate(-1.000000, 0.000000)">
                <g id="side-bar" transform="translate(1.000000, 69.000000)">
                    <g id="Group-3" transform="translate(47.000000, 55.000000)">
                        <mask id="mask-2" fill="white">
                            <use xlink:href="#path-1"></use>
                        </mask>
                        <use id="Shape" fill="#323232" fill-rule="nonzero" transform="translate(3.000000, 10.000000) scale(-1, 1) rotate(90.000000) translate(-3.000000, -10.000000) " xlink:href="#path-1"></use>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/sort.png000064400000002374151215013530012702 0ustar00�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<&iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CC 2014 (Windows)" xmpMM:InstanceID="xmp.iid:1BAB37E1206411E8B127D46598E935EA" xmpMM:DocumentID="xmp.did:1BAB37E2206411E8B127D46598E935EA"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:1BAB37DF206411E8B127D46598E935EA" stRef:documentID="xmp.did:1BAB37E0206411E8B127D46598E935EA"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>�lIDATx�b���?%���B@�, ���@���ڻ@|��X�7��s�؂O'##++�4 3�����Y���M5i	�:\�������_9����������/	��ؙ��/�cx��+÷�L
� �\����FR������{7�k�a��d���;���
���!Ā��ޭR�pM��r&�`��,/�s���i�9��?`5 �o���쏟�1��v��￿��J@�L���O�d�%�121.��՛O��(E@�W)Ȋ~�z�1�G�@ޜ����������ɛ�@+����?:-��+�G66��@��$�����X
�|`�y�b�C�%D��IEND�B`�themes/light/images/16px/directory_opened.svg000064400000005002151215013530015253 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="18px" height="18px" viewBox="0 0 18 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>server</title>
    <desc>Created with Sketch.</desc>
    <defs>
        <path d="M2.45454545,1.63636364 C2.00267611,1.63636364 1.63636364,2.00267611 1.63636364,2.45454545 L1.63636364,5.72727273 C1.63636364,6.17914207 2.00267611,6.54545455 2.45454545,6.54545455 L15.5454545,6.54545455 C15.9973239,6.54545455 16.3636364,6.17914207 16.3636364,5.72727273 L16.3636364,2.45454545 C16.3636364,2.00267611 15.9973239,1.63636364 15.5454545,1.63636364 L2.45454545,1.63636364 Z M2.45454545,0 L15.5454545,0 C16.9010626,-1.81672859e-16 18,1.09893743 18,2.45454545 L18,5.72727273 C18,7.08288075 16.9010626,8.18181818 15.5454545,8.18181818 L2.45454545,8.18181818 C1.09893743,8.18181818 1.81672859e-16,7.08288075 0,5.72727273 L0,2.45454545 C-1.81672859e-16,1.09893743 1.09893743,2.72509288e-16 2.45454545,0 Z M2.45454545,9.81818182 L15.5454545,9.81818182 C16.9010626,9.81818182 18,10.9171193 18,12.2727273 L18,15.5454545 C18,16.9010626 16.9010626,18 15.5454545,18 L2.45454545,18 C1.09893743,18 1.81672859e-16,16.9010626 0,15.5454545 L0,12.2727273 C-1.81672859e-16,10.9171193 1.09893743,9.81818182 2.45454545,9.81818182 Z M2.45454545,11.4545455 C2.00267611,11.4545455 1.63636364,11.8208579 1.63636364,12.2727273 L1.63636364,15.5454545 C1.63636364,15.9973239 2.00267611,16.3636364 2.45454545,16.3636364 L15.5454545,16.3636364 C15.9973239,16.3636364 16.3636364,15.9973239 16.3636364,15.5454545 L16.3636364,12.2727273 C16.3636364,11.8208579 15.9973239,11.4545455 15.5454545,11.4545455 L2.45454545,11.4545455 Z" id="path-1"></path>
    </defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-46.000000, -93.000000)">
            <g id="menu-head-footer" transform="translate(-1.000000, 0.000000)">
                <g id="side-bar" transform="translate(1.000000, 69.000000)">
                    <g id="server" transform="translate(46.000000, 24.000000)">
                        <mask id="mask-2" fill="white">
                            <use xlink:href="#path-1"></use>
                        </mask>
                        <use id="Combined-Shape" fill="#8591B0" fill-rule="nonzero" xlink:href="#path-1"></use>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/add_file.svg000064400000006647151215013530013464 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="16px" height="20px" viewBox="0 0 16 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>add file</title>
    <desc>Created with Sketch.</desc>
    <defs></defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-188.000000, -26.000000)" fill="#8591B0">
            <g id="menu-head-footer" transform="translate(-1.000000, 0.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="tools" transform="translate(99.000000, 18.000000)">
                        <g id="file" transform="translate(79.000000, 0.000000)">
                            <g id="add-file" transform="translate(10.000000, 8.000000)">
                                <path d="M11.7462569,13.5244181 C11.7462569,13.0246875 12.1386922,12.6315789 12.6375173,12.6315789 C12.8154317,12.6315789 12.9941915,12.6912733 13.1363643,12.7867834 C13.3738565,12.9419878 13.5287996,13.2157164 13.5287996,13.5244269 L13.5287996,15.1071654 L15.1087395,15.1071654 C15.5956661,15.1071654 16,15.5122373 16,16.0000046 C16,16.4877719 15.5956443,16.8928438 15.1087395,16.8928438 L13.5287996,16.8928438 L13.5287996,18.4755819 C13.5287996,18.9753125 13.1244439,19.3684211 12.6375391,19.3684211 C12.1386922,19.3684211 11.7462787,18.9752906 11.7462787,18.4755819 L11.7462787,16.8928438 L10.1544184,16.8928438 C9.91692615,16.8928438 9.69133251,16.7973337 9.52449086,16.6310479 C9.36956086,16.4647577 9.26315789,16.249859 9.26315789,16.0000046 C9.26315789,15.5122155 9.66751356,15.1071654 10.1544184,15.1071654 L11.7462787,15.1071654 L11.7462569,13.5244181 Z" id="Fill-1"></path>
                                <path d="M14.2202167,7.6305126 L11.5540619,7.6305126 C9.75317935,7.6305126 8.29538,6.18649944 8.29538,4.40274381 L8.29538,1.76102001 L3.36562373,1.76102001 C2.47665912,1.77279474 1.777864,2.46494144 1.777864,3.33371763 L1.777864,16.0346606 C1.777864,16.9034368 2.48852705,17.6073582 3.36562373,17.6073582 L8.72249512,17.6073582 C9.22005708,17.6073582 9.61145973,18.0068463 9.61145973,18.4878895 C9.61145973,18.9807314 9.22003534,19.3684211 8.72249512,19.3684211 L3.36562373,19.3684211 C1.50531455,19.3684211 0,17.8773006 0,16.0347252 L0,3.33378222 C0,2.41792005 0.379534719,1.5844745 0.983212501,0.973885362 C1.58773799,0.375934304 2.44105533,0 3.36571067,0 L9.18447502,0 C9.40948753,0 9.64636797,0.094193493 9.81277984,0.258187055 L15.738486,6.12767964 C15.7860338,6.17477639 15.8216941,6.22187313 15.8454691,6.26812806 C15.8811294,6.3152248 15.9049044,6.36232155 15.9286772,6.42119302 C15.9643375,6.46828977 15.976225,6.51538651 15.9881125,6.57425799 C16,6.63312946 16,6.69199878 16,6.75003058 L16,12.1736381 C16,12.66648 15.6085756,13.0541696 15.1110354,13.0541696 C14.9335794,13.0541696 14.75528,12.9952981 14.6134734,12.9011047 C14.376593,12.7480397 14.2220491,12.4780844 14.2220491,12.1736295 L14.2211992,9.37904309 L14.2211992,7.63057503 L14.2202167,7.6305126 Z M12.9644548,5.86942799 L10.0724615,3.00486931 L10.0724615,4.40179649 C10.0724615,5.21168829 10.7364353,5.8693634 11.5540837,5.8693634 L12.9644548,5.86942799 Z" id="Fill-2"></path>
                            </g>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/download.svg000064400000004414151215013530013532 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="16px" height="17px" viewBox="0 0 16 17" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>download</title>
    <desc>Created with Sketch.</desc>
    <defs>
        <path d="M7.2,10.0686292 L7.2,0.8 C7.2,0.3581722 7.5581722,0 8,0 C8.4418278,0 8.8,0.3581722 8.8,0.8 L8.8,10.0686292 L10.6343146,8.23431458 C10.946734,7.92189514 11.453266,7.92189514 11.7656854,8.23431458 C12.0781049,8.54673401 12.0781049,9.05326599 11.7656854,9.36568542 L8.56568542,12.5656854 C8.25326599,12.8781049 7.74673401,12.8781049 7.43431458,12.5656854 L4.23431458,9.36568542 C3.92189514,9.05326599 3.92189514,8.54673401 4.23431458,8.23431458 C4.54673401,7.92189514 5.05326599,7.92189514 5.36568542,8.23431458 L7.2,10.0686292 Z M0,12 C0,11.5581722 0.3581722,11.2 0.8,11.2 C1.2418278,11.2 1.6,11.5581722 1.6,12 L1.6,14.4 C1.6,14.8418278 1.9581722,15.2 2.4,15.2 L13.6,15.2 C14.0418278,15.2 14.4,14.8418278 14.4,14.4 L14.4,12 C14.4,11.5581722 14.7581722,11.2 15.2,11.2 C15.6418278,11.2 16,11.5581722 16,12 L16,14.4 C16,15.7254834 14.9254834,16.8 13.6,16.8 L2.4,16.8 C1.0745166,16.8 0,15.7254834 0,14.4 L0,12 Z" id="path-1"></path>
    </defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-301.000000, -27.000000)">
            <g id="menu-head-footer" transform="translate(-1.000000, 0.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="tools" transform="translate(99.000000, 18.000000)">
                        <g id="download" transform="translate(192.000000, 0.000000)">
                            <g transform="translate(10.000000, 9.000000)">
                                <mask id="mask-2" fill="white">
                                    <use xlink:href="#path-1"></use>
                                </mask>
                                <use id="Combined-Shape" fill="#8591B0" fill-rule="nonzero" xlink:href="#path-1"></use>
                            </g>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/text_file.svg000064400000006363151215013530013713 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="16px" height="20px" viewBox="0 0 16 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>textfile</title>
    <desc>Created with Sketch.</desc>
    <defs>
        <path d="M24.2222222,15.1111111 L19.7777778,15.1111111 C19.286858,15.1111111 18.8888889,14.713142 18.8888889,14.2222222 L18.8888889,9.77777778 L12.6666667,9.77777778 C12.1757469,9.77777778 11.7777778,10.1757469 11.7777778,10.6666667 L11.7777778,24.8888889 C11.7777778,25.3798087 12.1757469,25.7777778 12.6666667,25.7777778 L23.3333333,25.7777778 C23.8242531,25.7777778 24.2222222,25.3798087 24.2222222,24.8888889 L24.2222222,15.1111111 L25.1111111,15.1111111 C25.6020309,15.1111111 26,14.713142 26,14.2222222 C26,14.0994923 25.9751269,13.9825718 25.9301467,13.8762266 C25.9765874,13.9888881 26,14.1043482 26,14.2222222 L26,24.8888889 C26,26.3616482 24.8060927,27.5555556 23.3333333,27.5555556 L12.6666667,27.5555556 C11.1939073,27.5555556 10,26.3616482 10,24.8888889 L10,10.6666667 C10,9.19390733 11.1939073,8 12.6666667,8 L19.7777778,8 C20.0135258,8 20.2396181,8.09365052 20.4063171,8.26034953 L25.7396505,13.5936829 C25.823,13.6770324 25.8880874,13.7752302 25.9323374,13.8820592 Z M20.6666667,11.0348565 L20.6666667,13.3333333 L22.9651435,13.3333333 L20.6666667,11.0348565 Z M21.5555556,17.7777778 C22.0464753,17.7777778 22.4444444,18.1757469 22.4444444,18.6666667 C22.4444444,19.1575864 22.0464753,19.5555556 21.5555556,19.5555556 L14.4444444,19.5555556 C13.9535247,19.5555556 13.5555556,19.1575864 13.5555556,18.6666667 C13.5555556,18.1757469 13.9535247,17.7777778 14.4444444,17.7777778 L21.5555556,17.7777778 Z M21.5555556,21.3333333 C22.0464753,21.3333333 22.4444444,21.7313024 22.4444444,22.2222222 C22.4444444,22.713142 22.0464753,23.1111111 21.5555556,23.1111111 L14.4444444,23.1111111 C13.9535247,23.1111111 13.5555556,22.713142 13.5555556,22.2222222 C13.5555556,21.7313024 13.9535247,21.3333333 14.4444444,21.3333333 L21.5555556,21.3333333 Z M16.2222222,14.2222222 C16.713142,14.2222222 17.1111111,14.6201913 17.1111111,15.1111111 C17.1111111,15.6020309 16.713142,16 16.2222222,16 L14.4444444,16 C13.9535247,16 13.5555556,15.6020309 13.5555556,15.1111111 C13.5555556,14.6201913 13.9535247,14.2222222 14.4444444,14.2222222 L16.2222222,14.2222222 Z" id="path-1"></path>
    </defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-978.000000, -26.000000)">
            <g id="menu-head-footer" transform="translate(-1.000000, 0.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="tools" transform="translate(99.000000, 18.000000)">
                        <g id="textfile" transform="translate(869.000000, 0.000000)">
                            <mask id="mask-2" fill="white">
                                <use xlink:href="#path-1"></use>
                            </mask>
                            <use fill="#8591B0" fill-rule="nonzero" xlink:href="#path-1"></use>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/open.svg000064400000003746151215013530012673 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="20px" height="18px" viewBox="0 0 20 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>open</title>
    <desc>Created with Sketch.</desc>
    <defs></defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-266.000000, -26.000000)" fill="#8591B0">
            <g id="menu-head-footer" transform="translate(-1.000000, 0.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="tools" transform="translate(99.000000, 18.000000)">
                        <g id="open" transform="translate(158.000000, 0.000000)">
                            <path d="M9.800016,25.99994 L24.200016,25.99994 C24.544556,26.0007212 24.850796,25.7804 24.960176,25.45384 L28.160176,15.85384 C28.241426,15.6093 28.2008,15.34134 28.05002,15.13196 C27.90002,14.92336 27.65784,14.79914 27.40002,14.79992 L25.00002,14.79992 L25.00002,12.39992 C25.00002,11.9757 24.83127,11.56868 24.53126,11.26868 C24.23125,10.96868 23.82422,10.79992 23.40002,10.79992 L18.25782,10.79992 L16.92032,8.76172 C16.771882,8.53594 16.52032,8.4 16.25,8.4 L10.6,8.4 C9.7163998,8.4 9,9.1164 9,10 L9,25.2 C9,25.4125 9.084376,25.61562 9.23438,25.76562 C9.384384,25.91562 9.5875,26 9.8,26 L9.800016,25.99994 Z M26.289816,16.39994 L23.624216,24.39994 L12.510216,24.39994 L15.175816,16.39994 L26.289816,16.39994 Z M10.5999962,9.99994 L15.818016,9.99994 L17.156296,12.03814 C17.303952,12.26392 17.556296,12.39986 17.825836,12.39986 L23.400036,12.39986 L23.400036,14.79986 L14.600036,14.79986 C14.256276,14.79986 13.950816,15.02018 13.842216,15.34596 L10.824216,24.39996 L10.5999962,24.39996 L10.5999962,9.99994 Z"></path>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/preview.png000064400000002541151215013530013370 0ustar00�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<&iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:DocumentID="xmp.did:0DF59639213A11E8AF7CB433753BF849" xmpMM:InstanceID="xmp.iid:0DF59638213A11E8AF7CB433753BF849" xmp:CreatorTool="Adobe Photoshop CC 2014 (Windows)"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:B4FA084E212611E8A952F9C3BB7F85B5" stRef:documentID="xmp.did:B4FA084F212611E8A952F9C3BB7F85B5"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>`���IDATxڤS�KQ��}� �b'B�Ikg!WJ��
X�?��?������-�l�� 
�%b�S�����>��PS8����|��˪J���W���X�4�*��@a��U�1>D���|p�
ȓ�F��#/��]�I����[����^���|D�!����\'Y�����	��Dd��rb�p$��z�u�Ζ{����Џ��|Bo��Pt\��V_n*�h(�6��9��@J�W�
���p.��k�����˭H�wۗvFڈx=��>�̾�i�J@�7�;��ť~�:�t"u���L2�N���h�m�Q�OV햯�0��yg��m~���")��sO����ZϲЊ!�Rr�	g�r��ؕ�����N���W`D(�e�ib���厖�|�1G��c����S��V]����eQ��Ql����R�4^�N��C	���{L� �P��S&�!TIEND�B`�themes/light/images/16px/select_all.png000064400000001220151215013530014007 0ustar00�PNG


IHDR�a	pHYs��BIDATxڅS]kQ�?R�� ��&iw��ݯh�BP+���&i�cZ_�R_/lD�������s6nvća�Ü33g�
���w�������xK��
�V�l:�b*Q�*�Z��v_�#��\pR���=��c}��j;���H_{<�ןL��^�ƼV��^�o�?���q'�w,Q2l�3��o
�D��D��D�hA�т���ќ���bp|9��b(��Hj| ڟ�>m�r^%4�BTg|��H6"]f��v��-��/C�HTf{��0^���X�d�@ Hlq�gFۨr��n�rG	����.b5!`��
�a����AB�L4��s��lN6�Q�nJ]��9�=�hpV��ܮ��3+&{\����T'd1&Y\�>�+�,`�-��6��h[2	�9~�c�-�X����2�13ZF����o�F	��W��z���[x��>�[g#�sH~w�H�g�
n��$���v��f,�\R���ƃ�u�?
��44���jOË�>�kNwn1V9�h��W������$�+6�/J�[��|apl�9��S�9Wy��ͣ��
�7}�{��zo�IEND�B`�themes/light/images/16px/extract.png000064400000002612151215013530013360 0ustar00�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<&iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CC 2014 (Windows)" xmpMM:InstanceID="xmp.iid:DBB6BF4A206711E894F6CC58192F7F29" xmpMM:DocumentID="xmp.did:DBB6BF4B206711E894F6CC58192F7F29"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:DBB6BF48206711E894F6CC58192F7F29" stRef:documentID="xmp.did:DBB6BF49206711E894F6CC58192F7F29"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>@r��IDATx�ē�kA�����.1w$hTT�X�v��D��`�-�RX%��@����FS{�w�h.�Ḏ�������l.M
fw��3��-D���0���k��k��DCI(D9CQ q�-Ur�܍��X�:p���tҥr��E1.)�F<�\b>G��Zk������z¾��B�HP�Q2�B�Z��S�Y�+P~K��ѣ���3���'���Dz4�{w�p�����r��Hd�4�z��Z�
cg��7��X62�ot�霱� �նkBR�HVT��?)��.ĥkW�Q	H������v:f-�������an�p!L������/u�qӲ}٨|��a���ؗâ����'��,�}hM��Q�R��'�a�m!���5�'���f	H�����w����IJy�f���v�X&�z�ogE�{L�a�'��VV
���LuT�e.�c��@7�s\C^�?Hh����>m(@�NtR�6���7�`��؏��%�IEND�B`�themes/light/images/16px/file.png000064400000002662151215013530012632 0ustar00�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<&iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:DocumentID="xmp.did:84E6C0B3213A11E8BD0BA52BCC763BA1" xmpMM:InstanceID="xmp.iid:84E6C0B2213A11E8BD0BA52BCC763BA1" xmp:CreatorTool="Adobe Photoshop CC 2014 (Windows)"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:2239E027212711E881F1A8822B636F74" stRef:documentID="xmp.did:2239E028212711E881F1A8822B636F74"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>�`nB"IDATxڤ��kA�ߏٽM�.�����ED��؈ Q[l46'������&`�(�	"�vV�@4�a$�\.��μ��\N�n�r`��7���y��
�3\w19��"L���|�=���{O��{��>�QT�k���dV���J	GX�X��L8n�}�.��;A�����)"���,;�n;��G��wf�B�=
R��dh�<!~b�+��y��
X*8�A�JB䖼
0s�%�\�ٞa��H�	�nZ����7B��X��m�Ѭ�r�7���П5����0"*�P�zb�D�BU^�U����Z�LN:�ix^�:Q��e�7 >۹��IT4�H8f��z��|�ŚHun�Pļ�qC�iigO{�!@or�A5{ᰉ?�j��ز[:�C���[[�;s\��Z��>Qb���ӣG��߻K߾��b'BhZ/��>�:Q=X���4��Ik�fP�V��0?i�x*b^��徳�ť�����Y�>,*�O�#���Z�g��J@���zl����-����
�ټIEND�B`�themes/light/images/16px/arrow_down.png000064400000000345151215013530014070 0ustar00�PNG


IHDR���	pHYs.#.#x�?v�IDATx�U��
� �Ǥ����Q$�����9��P|��J�V�����9���'�d��b�8��=b1��c۶˺�ϜsX����}7��gY���
�R�M<�F
��!���ɢȻ��Z��r��ɓ���T/�ǭd�V7~��/PF]���IEND�B`�themes/light/images/16px/sort.svg000064400000002570151215013530012713 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="22px" height="13px" viewBox="0 0 22 13" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>sort</title>
    <desc>Created with Sketch.</desc>
    <defs></defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-885.000000, -28.000000)" fill="#8591B0">
            <g id="menu-head-footer" transform="translate(-1.000000, 0.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="tools" transform="translate(99.000000, 18.000000)">
                        <g id="sort" transform="translate(779.000000, 0.000000)">
                            <path d="M29,18.99182 L24.99952,23 L20.99992,18.99182 L24.00006,18.99182 L24.00006,10.99196 L25.999816,10.99196 L25.999816,18.99182 L29,18.99182 Z M7,10.99196 L21.00014,10.99196 L21.00014,12.991716 L7,12.991716 L7,10.99196 Z M7,15.9919 L19.00034,15.9919 L19.00034,17.991656 L7,17.9925162 L7,15.9919 Z M7,20.99184 L16.0002,20.99184 L16.0002,22.991596 L7,22.991596 L7,20.992698 L7,20.99184 Z"></path>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/download.png000064400000002530151215013530013514 0ustar00�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<&iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CC 2014 (Windows)" xmpMM:InstanceID="xmp.iid:AC93C9CA206311E8BB36E3A65CBC75EE" xmpMM:DocumentID="xmp.did:AC93C9CB206311E8BB36E3A65CBC75EE"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:AC93C9C8206311E8BB36E3A65CBC75EE" stRef:documentID="xmp.did:AC93C9C9206311E8BB36E3A65CBC75EE"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>>�!�IDATxڤSM(DQ>������J���� ��ʤ(�ɖdC����Tv�v�,$�"RԔLÂ2�W�a��w���a�dP���|�|��{�c�i�������|����w��p([�(���?)�a��
H�ϕU���ﭰ<k���LD�_0d�Jg7&f�m�߶�LSOw�<Enˀ��[����M]wVJLJ����un{�SӨ���H��̯/(�l�E�N_�� ��x�T*���CA��KZ�ה�P_p7��78�o�L`��!�ȱ�����2N��4Uo�:��E>��1�EN�!�UV���--������:�[�X/�����F�.��1��BN��h'�����u��O�)~�H��d���6E����bB��
���wD�zUU������T����qSv,LYX;!磀��y�uB�
P��rh��	p�L��v$�1��7W���.�5IEND�B`�themes/light/images/16px/arrow_right.png000064400000000335151215013530014235 0ustar00�PNG


IHDR���	pHYs.#.#x�?v�IDATx�u�M
!�3-S�sq��^ŕ'(��E�[�u`h�	$��{	� �Ƙ��
�p�-1F@
���s���s���8Gh/�Yp[�$�ôNh�Am{� �$��0�Ю��x?"�)b���c���a�����#o�%A]��OIEND�B`�themes/light/images/16px/php_file.svg000064400000005666151215013530013523 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="20px" height="21px" viewBox="0 0 20 21" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>php</title>
    <desc>Created with Sketch.</desc>
    <defs></defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-267.000000, -332.000000)" fill="#8591B0">
            <g id="content" transform="translate(244.000000, 69.000000)">
                <g id="row-08" transform="translate(1.000000, 261.000000)">
                    <g id="php" transform="translate(23.000000, 3.000000)">
                        <path d="M15.4375,6.53125 L15.4375,4.15625 C15.4382429,3.9981643 15.3766411,3.846759 15.2653125,3.734678 L11.7028125,0.172178 C11.5907429,0.0608494 11.4393395,-0.00076 11.2812405,-1.9e-05 L1.7812405,-1.9e-05 C0.7978385,-1.9e-05 -9.512901e-06,0.7978385 -9.512901e-06,1.7812405 L-9.512901e-06,17.2187405 C-9.512901e-06,18.2021425 0.7978385,18.9999905 1.7812405,18.9999905 L5.9374905,18.9999905 L5.9374905,17.8124905 L1.7812405,17.8124905 C1.4531865,17.8124905 1.1874905,17.5467945 1.1874905,17.2187405 L1.1874905,1.7812405 C1.1874905,1.4531865 1.4531865,1.1874905 1.7812405,1.1874905 L10.6874905,1.1874905 L10.6874905,3.5624905 C10.6874905,3.8771685 10.8129209,4.1792495 11.0355705,4.4019105 C11.2582201,4.6245715 11.5602935,4.7499905 11.8749905,4.7499905 L14.2499905,4.7499905 L14.2499905,6.5312405 L15.4375,6.53125 Z" id="Fill-1" stroke="#8591B0" stroke-width="0.5"></path>
                        <path d="M7.71875,9.5 L5.34375,9.5 C5.015696,9.5 4.75,9.765696 4.75,10.09375 L4.75,15.4375 L5.9375,15.4375 L5.9375,13.65625 L7.71875,13.65625 C8.033428,13.65625 8.335509,13.5308196 8.55817,13.30817 C8.780831,13.0855204 8.90625,12.783447 8.90625,12.46875 L8.90625,10.6875 C8.90625,10.372822 8.7808196,10.070741 8.55817,9.84808 C8.3355204,9.625419 8.033447,9.5 7.71875,9.5 Z M7.71875,12.46875 L5.9375,12.46875 L5.9375,10.6875 L7.71875,10.6875 L7.71875,12.46875 Z" id="Fill-2"></path>
                        <path d="M17.8125,9.5 L15.4375,9.5 C15.109446,9.5 14.84375,9.765696 14.84375,10.09375 L14.84375,15.4375 L16.03125,15.4375 L16.03125,13.65625 L17.8125,13.65625 C18.127178,13.65625 18.429259,13.5308196 18.65192,13.30817 C18.874581,13.0855204 19,12.783447 19,12.46875 L19,10.6875 C19,10.372822 18.8745696,10.070741 18.65192,9.84808 C18.4292704,9.625419 18.127197,9.5 17.8125,9.5 Z M17.8125,12.46875 L16.03125,12.46875 L16.03125,10.6875 L17.8125,10.6875 L17.8125,12.46875 Z" id="Fill-3"></path>
                        <polygon id="Fill-4" points="13.0625 11.875 10.6875 11.875 10.6875 9.5 9.5 9.5 9.5 15.4375 10.6875 15.4375 10.6875 13.0625 13.0625 13.0625 13.0625 15.4375 14.25 15.4375 14.25 9.5 13.0625 9.5"></polygon>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/directory_opened.png000064400000002402151215013530015241 0ustar00�PNG


IHDRĴl;tEXtSoftwareAdobe ImageReadyq�e<&iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CC 2014 (Windows)" xmpMM:InstanceID="xmp.iid:5F805C60206711E89800F32E07E1A149" xmpMM:DocumentID="xmp.did:5F805C61206711E89800F32E07E1A149"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:5F805C5E206711E89800F32E07E1A149" stRef:documentID="xmp.did:5F805C5F206711E89800F32E07E1A149"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>$�rIDATx�앿J�P��R�A���S��}��Eq��bA��RA|G�8��Rp-.���&���$-r���N^hn����	DD�cjMkm��������ߖ�B@��C�����Bpݤ�c�*�|=xj9�}
�\�4��ޯwp$�_:���
#ͣ�'4���	��}#}	�5���`�Ly��M����X�J9�����j/}�Ȓ
��J����6vG_�e�'r J����l>���1�D�ɐz�|�"L�ZB+�C1I�
��:n�L��f��(s�����3��
�f�����ؐ�!Y�4XII��dBVJ�:څ$AI��w��X�y�i�te��}ٔ���ؔ��\y��iZ�A���ܩ�IEND�B`�themes/light/images/16px/forward.svg000064400000004107151215013530013366 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg width="14px" height="12px" viewBox="0 0 14 12" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 49.1 (51147) - http://www.bohemiancoding.com/sketch -->
    <title>arrow_right</title>
    <desc>Created with Sketch.</desc>
    <defs>
        <path d="M2.81066017,6.75 L6.03033009,9.96966991 C6.3232233,10.2625631 6.3232233,10.7374369 6.03033009,11.0303301 C5.73743687,11.3232233 5.26256313,11.3232233 4.96966991,11.0303301 L0.469669914,6.53033009 C0.176776695,6.23743687 0.176776695,5.76256313 0.469669914,5.46966991 L4.96966991,0.969669914 C5.26256313,0.676776695 5.73743687,0.676776695 6.03033009,0.969669914 C6.3232233,1.26256313 6.3232233,1.73743687 6.03033009,2.03033009 L2.81066017,5.25 L13,5.25 C13.4142136,5.25 13.75,5.58578644 13.75,6 C13.75,6.41421356 13.4142136,6.75 13,6.75 L2.81066017,6.75 Z" id="path-1"></path>
    </defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="18-new-file-manager-light" transform="translate(-64.000000, -29.000000)">
            <g id="menu-head-footer" transform="translate(-1.000000, -4.000000)">
                <g id="menu-bar" transform="translate(1.000000, 0.000000)">
                    <g id="arrow" transform="translate(20.000000, 22.000000)">
                        <g id="Group-2">
                            <g id="Group">
                                <g id="arrow_right" transform="translate(51.000000, 17.000000) scale(-1, 1) translate(-51.000000, -17.000000) translate(44.000000, 11.000000)">
                                    <mask id="mask-2" fill="white">
                                        <use xlink:href="#path-1"></use>
                                    </mask>
                                    <use id="Combined-Shape" fill="#8591B0" fill-rule="nonzero" xlink:href="#path-1"></use>
                                </g>
                            </g>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>themes/light/images/16px/reload.png000064400000002302151215013530013150 0ustar00�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<&iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:DocumentID="xmp.did:1468124E3BB111E8A420B1DF08E34A3E" xmpMM:InstanceID="xmp.iid:1468124D3BB111E8A420B1DF08E34A3E" xmp:CreatorTool="Adobe Photoshop CC 2014 (Windows)"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:E4DFA5C9206111E8877DC251126BECAC" stRef:documentID="xmp.did:E4DFA5CA206111E8877DC251126BECAC"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>vu52IDATx�b���?6p���_�a��`g0��`d�X�9߿�����i��'.�(��� ͈��m�������������0�a����k6�k�`gcp�7e�����l�<����[�洄��Di&q��e0d3)���B�!��(^x��
<��{�����i�`?G&)	�ߍ�5�6�ꍻ`�Ǐ_,���/O!���_�� ˙H���a���4���̶2��Lʄli���8�}=l	�y��='2���=3�g,X���a6�#��g.\��*Ph�ʍ�y�p�TTIEND�B`�themes/light/images/ui-icons_default_theme256x240.png000064400000104645151215013530016410 0ustar00�PNG


IHDR��tEXtSoftwareAdobe ImageReadyq�e<&iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CC 2014 (Windows)" xmpMM:InstanceID="xmp.iid:75795EA0278611E8BE05E10E039C07E6" xmpMM:DocumentID="xmp.did:75795EA1278611E8BE05E10E039C07E6"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:75795E9E278611E8BE05E10E039C07E6" stRef:documentID="xmp.did:75795E9F278611E8BE05E10E039C07E6"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>�I$
�IDATx��}�m�u�w��mUױ�8�L+���N䴵������%]@���$��@JpY�KR,����K�R���y�I;R- ~�m�P��2)�I�~HT(���?�V8�����\���s�Ϛ���{>��{��c����z�¿����O�s/��^���x���^��'����k�98w�9{�}�{�Z��}Y��B���������n|�����X�s�۩�q�q�|�q�/�o\���k�����z��=�zi<����q�s�u�(?�9����5ݓ��x�~���4�����wwNո�u�����c�?��������9����'���Z7���YG��g�y�0^�-O=�|��Ku2����<��{����ɓL�u��~S���/?��:�|�<�tb�����d�n|cZ�t?��k��7�?~?���a��<G�~���H�1����㔯3�_^<:w��t��k�s+�梞���%]C�1���c���׼�v6W�Y��I��d�I�'/�]tS��<�5Յ�o~4���`j�����9��䌙~�x<G�g�����.j2�y�^�c~��K'av�=̓��5]k?��|��~:�9�5�bQ���&��>=�%]غ0�Z��׹����7����Ɯ�k��E��9������7S'>}�X�5�{��:&�,����"\�#h2.j�q����r�p6��'|�
7��vo0P�;�Kލ��I�م�k���8�{}���׼��J�:��l\��{6xϓ����s2�R���ӆ������Q�C�B�z8Ψ'��'��tM�Q蒍�zX�e��Uy�`,@uC�D����:��:��ˋ)�>�s���ݔv��¡��m�w������Zӝ�'���}����G]Y5��ꮑ�'O^5���K�;��O�w.�yG�ΌU���ɰ����\h:�Bh��]��k2�y�慚��rj(u)�U�y�:�;s�������������<�?��#�	�u�%�(��'��Q�1��z66:�iQ�c���	�s<\�SM�P"���9�XQ�	�7�m;�t�j4ӹ�p������)%����}�9�b��$>��<!7UwW
'�5ڌ�����Ԑ�^�[%�;h(����j����>���2`��p97�[���J�nʂ����na|DZKp�����/�n�Z[M(��o��}�	�;	
.���q��T��L���'Sc�KF���yјQw�~�0�G��
#4FO��q��9e�r�2�3���#����"�d:���1�FC��BX�@V�I�Mz����<�<G�8�|�\bɹ��@Im��~V-�Z���8��;�����	տ_�McF���<}v�����5:�F������sK9������v�A���!�X����hl�}�s^��Tگ��S�kѲűn�}R�BK��<չOU*W"�<��LG9���H�%�c�6<�C;넢��6�EIVwq�~]|ƭ�N:�48U�]��J)n��g��_(�5;�L��x�	e�i�O׻P^���p�G�s2rAt4y�:��숛��kw��xu�Q��D)�p.��p�[TO�6$�I�{A^O~�hz������t P� P�^���J�bq�:�9*+K��s�(��0U��r��R�V�kq;���)��Y*A�����of:Gfq���GC�r�SR)��mW:v`"Z_UU��j�PJ9�:Tn�&$�DMF��ɭ��X5E�@��3Pev�\�Cw�
=�l��%��h:�봀轴*L���$�r����uO�(�k��5�t�՛��������� �=�ݧ�p.���B[Q^��߹F�j��D�b41��."sh���Ȋ��R�\�U�fұr	H�&B�҄��W�Q�+�Ri���
�R0��1h2-��Ȧ�G�H� �o]5Ey:T~T�?�;�wC ������䐀��sݕ���B;-��TjR��05ޢ�8�u�.��G=�Np]yi���ʴt�UhC�r��Ap�~�dw��X
�+q����4�<��Y-M�X�–�p6g�Z=�i�8�ÕjhR���U�%�ȥ���\"�x3@J�����}�ʛjxvJ$��bB	^B�U�,���H�D�q�<��A#�,+��F�i��`J*8� ���ĵ!���XM^�9¡�$�m��|��t�jɣ:>�������O1�c�Qv�e�+��BQ+$�~l�Y��	1F�M�w�����*Bh��nD.����t�
m\,^%Bu�v�,ڐ4�ׯ�KZkT ,�@nP>�*�����B#�����`T>4cN��p���x�\j2J����T�x���v=7.	K�!0�y�� ��K.S��=U�B�QxH@�
���.9Ia�3.��^����{��jȄ��	DI �t�lk5�tnt��y��%I���N܎[a�]H�v:*��s��rYng��&c��\���A��������q�0�\mgt�ktb�V�A�j�9}�K��s�f]x�l�c*��KRR�r�u�;k�.��"gh�ݕ�*�ۑuAi≒�U8DT`z݁IhA+�&e�0�{�q��N�:J�{^P�wbv���d.%�ɣv�$�I���Ԩ`G<�H$Tu�#ڑi����J��Tr�|H�xw�\�W�^���W�]���ٯ%�"!�4\p9J0I��(8G��vn��݌\[J��2/\*o�<$�3Q��qIb�;���5W�s�����d��vY���qr�rD�j�>3\�.@��W�Te��w���	N���c"��I��+�n˥�1t
h�T�`c����R8"��
�^q�B�p
&�
1��x'[&d'��"$�Qh���>�]���8�D��]S+)TN��6K��Q��[=[�|U���Y=�~8ğn��`
���[^w�Q�\y�\��c�5�d�+��s R�.I�l'r>�*�2�0��3�	\ȣ�� Ii�nI�4sC�ɉu�iww���cA\i�:���	�ܮB�	A�R��i��l���+}G�Vo�I�i��sn��Wo�e�ՠ;�B理�NW��|h}:l�`,���(�6d�E�Xnp�Ϟ�.)����_ܦ�1� y����e�]�E�n����'�ˁCP��~MF��gg�=�|�LZ?�0��l���0G��:�6m k:�%{c��Oq���D��j�y�<)�8���f���l,��S;�	A�]IxG 
≊S�k'�䪒G��i�
��W����9�z��RR	�B7�Pb��Kc5����[Y3��wt\ի)B;]��:�T$�!����P�b�;ܫc
�A"��{RW�"ː��r3T2�{N�vT�8 .L!�D��deUBNdٗ�i���.C"�R�uZf�p�)iV��$vL=�Ų&�����b�Ӡ3�VI%
�(.OȢ%�D?
��z㍠�VGA�d$䚎u,�ݱ��N�/��t�4Fg�Ą^�*=��#��	h��x�h�bT%�](�<�z�n�a_�6��7"	V���x&��d�
i�����N.|����;���s�X�x��0I�$�B�{��O�'��ܧ��D��!�1�^��- �(��h��qs\�3���Q�9nU �}�2�`G��QB��K搃�	R㇪��v@B쑫DW��jL����+
���KT�@�̤8�ʯ����]�^=��Z�MV
m�F5��`��Ned+�k���
��@g��:0
��!:�t"�(lsG��;�&��Dw��r.��ʴNπ�o�W�Yv*�:PN���k�,�ƼJ��8�r�q�Z�!���Q�ܑ��/P��+=}-�ѹPLO�-Ǚ�܎3|����$ιU@e)g�%W���"��&_HR�J.��)�|��@�r5	���3;�k�E���ES��v?�n #�7hy+��v�j��񭾟�&,�Da�ޏ��zk��M����Y��=@�~LjV^^7���sV���w��D;�#��B��Ν��N~�Fq>�j�0б��;�*;9R�
�ͮvJ���Չ���!��L	�r�� ��>e=e�*��Dn�Q����I!��+P"���#�m􇄫w	0�ew�
��g=\��\Y�઒��X�����c�R��@�&Va�!qވC�9�
R�u�*�C�r�*����2��I'U�'׾K=��'%��Ʌ'2��DL�t( J=�}C 4�0�RY�ִcTBNF�"Q3Ru����	�0��~.�AyZ��!-Z�C��͒!r���>T����.G��\�%Jι
�ʄ�<��(*�~u��O��(QH���r�M+	VՅ�N�h�[���.wPY4$�Y�#W�,<����!A�gm�aFcW�����7f��k�-fbU�>�%�Z9hR���eD���!z5�vD�S��J2LC��D�[���)���g:�$M₵��>�k���:�H�t��諮˫�e�>� �D� ��!��8�3��]T�f.A�:��e���v��eP��ƚ���J�Wl�m�Qt��}0':fͧ�P�tn��p�ʬU����A����x��E�w��t��}vBg�ԭ�0�jFA�S.NL]��ʝv�"؈bmr�g�w�ݚ�Q�x\!�Yf�X*wV�Z���O�u���W�e@���Y%�l?��i��N�*cM��|n9TX�/�U
�ʫ�s%L}]�?+s�u�!�S�wh�ZR�JR|�Z풘N��ya�/�-]eݨtB�K�/�px�k���9Ʃ�ͫ�!I�Fǫl��%`�g��f����&A�Jˎ�[��l,�e��]����t���G�.Fz�G�\�n�b����R|��RcR���&�:�
?�ʸРr!a���g6���j�E�w�PÒY�1����DYV�����p,��p��dN�~��L}htkX�5,�h�񍉍�L�u�g�n��d�!���E��Υ�D"�
і����@��.Av�ޭ�K���
d���?���G�
@�O	!�<:w�0�>��
�*F|��P�éR�+��k��URc�@�4�͍]�Z�����i]\���^��}�����*�J[��Vw��%��u�>��=@7~ɼtJ����>
*�76Y��	P�#�ڶ�PV��K�B\�ݹ)#N�4QK���{�s�=Nj�a�əlݠ$'o`���������t
��{/��r9j̞ט�T�p�0c-�����9Fa��C�j�8�lkE�q'	�|�Kج���kq�F�ɗ1y*0�Y��������q��y�V��J�=����p	K1��A;��;ٹ���8,����)H̿8��=:>C
�'j	bi'^�+����X�c-dO�)V|�3�;��){�2�$�l@g��솺��)���Lh:�"���/�x)��Nf��#>�ƒ�����˙��`��%ߗ���D؇Q���a��!#�u�S8��HP¶5�[�t�Ǭ���0UiM�=����#��3�����ڍ���Z{�hA9bN����p���<�+��[�K�S\͓(v�Ew"5�E�%�ⵥ"�A��9��j�H�x!���x��^���H��ECª�p�?9{�$$J�JL���Beg��-|����ѕ^	��#gҵ.r^�Ӆ�lJ</L��/�2/��-*|�yP���U��Ӻ�Ԭu�+!V]s�%e�.ԇ���'�k�EO"�7#O��ӎ]���%����S�!��bV��ļ������2Z܋�A�]�nZ+zO]'��
yPΫ�Z�[ ����B��Ȯ��Rd�����?sK)��k“;(���;��e�鼜��,��^����P��y�=�U�8��d���"�*�8So�R>�P����Z�kIG�w
L\�f��\��!��&����
S �
8�HP���x;�n\�U�{��;Ghp�0�vR2��y'-~Z@3�]�S��9ya��"�"Đ����:j�l�]��js�{F���N�\�G@����j�W���h�9�k���}�ؗ�ٮ;���� �	��vS�IQzj��5u9���5)o@�݁�^i�wh9���F�L]�4v(ӱwX|
Eءb)lVG-�u�t���H3s�L���f�kuC]�4�\ؙ�å���XU���D�$���k�;����S����6�*�.�4��0I@�gS[,�MH� �w��A�n%�HC�S	Ws*�c  �;f������d�����r�溰(@�
P�@���1�tCb�<$|}��	��3%f5D��’S5�L�U��n�#!��Uh暝Rb��i��pL�p᠎�=�S1#)�vc���qe-j�0k,1�Ehr���O֛�Q3H�jރEN(�ˊ0J涒s�{u1�ށ���w
�\r�L$A<Zq^�V��E�.4%u	�M��Ur��
��X�>��K�a���yL�wq����tY^gQ��p=�41Eq6�M5��*�
�'��\4��f��N+ �=P6�0��$[]�Z�W	/�QI����θ:Wݕ#�Kp�}���	���AHb�F��4��<fـ�&<�$;r�]�@�0Gwu����s!ɕ�2�1-�K��ʦk�*Ul@�.�=�n�:��W���і�ߦ;tP��=.I*e�ͿL�%,�u��)C+�؃�		m�G�
n��/��%]��[P��rz
t�l ���m���p�3/�X���D�g���ZC�W�iqgW��;7�h����E�E�y/�PK��Ę.z�\^p+���1��9�NbS@o��/=�8P��ɐe��h8��A+T��Lsi���b��o����X�޵3%�M[�L�#�S��fՍ|�9��XG����B�{n�������,��I5kL�M!2� ZNc�!Y�܏�.x�O%A]䮫.AAe���p��4�GYCA�z.�Fib.N&�y��k�}����)����*x�H��Q�.�!��Q�YO�wUo�����M���H�)��jl��������6TkL7�4���.�}�5�d����F�D��j�q�S�ӹ��Vf�-�A�ś��50��窓1��,��Q��BT�������A�K�Npc�.Iv�5��o_ʬD��i̫vܖx��,�K�ʫ�n�ڧy��{4��͘n�5����v�2/I��6uYσ���s.!����3��_�g�5�)�.��igY�y��,�f�)��f%��5���$��X���$G�$�a��D�����59���f-�q��ޮJ	IB�ʮ:6�%���s;o��N��9Q��3~�BUW_˭�g;�����7I�U*ӶH5`-�P2M������qc@Y(�7:�	�F�r�j����S����!,A�Y
���X�n,���c��u�Ѩj0s�����>|�j�q�t���8<�hM�v�%SYG�q'�*9�%��� n��� ���2��@̭�gI^	������{�w�,�=��q�K�;,@8gZ�ZR��s���C;)0%�%�/"Mu\_�ز���%��e?���h�r��j���'f	^�v!v>�����o���X���Vב�RTk�N�:�=�]}3�
���SJ��;��ɫ� �Lӕ�\�\Ϲ_U�h3K�~:�=\�Rq
iy��N�ԕ��&���t����.���,-�>(ژB1�bW���Ք���I���
�N��TT' ���N��Z���^�p�?ݕM��y��c"{9�F=�tHՠ��N�?v�4!Jp�\J�͍М��㔱(�fs�i�.d�`�mC�\�t,W(g%���S�I^s�5S"Ĭ��û+_y��	sRɬ�p=�i�e�0%��'�I7ʼn�T���+��ʎUc�x�&�?��y*����o�L�U^�K5��}�v�Yދ�K�SB��/Ԣ��U�tZ���>�������aӉT��*m:W�S_sU�xD��	�#�kz��(V�`��]�a��H�CW����A����#F9鴪7A��@i+,=~N~Q�mE�)�ع�F���T�&CF��T	S*�V��g��n	=D$�*we����:�Z�w�~�I�Q8�ƪI�y�n�3*��u�o�}v�^�hub���ʶ�g]���M��V�4NC]s)1X�t����:��t�	�By��8t@����]�qh �j���X*��^z�D�c����@D��f�U�0�ӁK�X��F��#��z�n̉����'2L�:�PUZ���60�4*I�6J�U=+\XE",4_�x����n���Ɏ|D�I<Ӥ�6ִ����5����x�d����˫��%�ï�:���#�I�!2����ssF��d�U;�]�s�Tܵ!�������T��c�LE^�z�N�r�PV�Z7��.w��GXw���K�ɍ���v	8g��1!6�k�X�v�Ϻ��&�3�7�v����]��D\ρ��8�@��yy�!H	�9/��PN�$�*X��	�G�I!u|g'bQ�'(9�_��W�����k{�]5�� �����q�T�x�X�\�$�i��5�d�,�wYxZ\�.L�<.EMD�,?g`>:@����]5�Ek��
>���>�5븝�Y_�۝Gd�~�;�N
(�:�9R[q��ʛTs��zN����
�ЂN.�鐅��W-vW���(�:@��Jӯ2XT��9E�Uy�5$u�wV�<�j�
 n�`B�d�]��Կ�R?�#R�@�Ѯ��O���n6��[N%�t�$�	�P�$OjK��#hף�Rvtf�<#����Bqj�Z�����dDH� �pW��„ɝA4v9�k��%n]����L�!5U��y,jL�{!��0�TѶ�}���S���40'qB��5O'{�
���VM�a�:�y`�u�����ϭ1��J��5�b)A��4tB��F&m͍&\
HV���{#��5�D��
(�mqfB,�o���$�2K�gۤ��\�+��aRh�2��d�J�޸�i
��?1�2��-]Mf|!"n��z�q`�-Bv�3tf�L�A���%��j���^�S��d��ܠrV]��|���BMI ,�1��-5Pʷ�Ԙ3CrWm��X����k���ƾ@��L��}�i�0��� u�GW�%�,��Oipc	H��Dd�Y��Kn���Hu@�PԼ�v�쑫s���klJ��d�RGG�p���t�+��1q+n%���n4m�W¦�
�I�-䂛NG�d��c}�k?�r�?$��.��Ln4��
5��N#�rGԥʉrP�������$ڀ����@�\&e�Gjս�0�x���ٔ�L�e�">N*D�..�Dc�J��:��<ǒ<�-+q�i�D��r[�U@�E�h���l*M�jb+P'n�2<��7\CeS��/�~��Pk(�$!�%��I��qU�u^r}7��c�Â���jG  M��,
�o�ARxQ�c���Q[��AnEh�+VAn�*F�L{n��*o{�;|%���@1�#��z�{��l�}����^��5�n���If���jL�&����*�:�#��cs�g�����^����{��|�HB����T�˾1 ���r�ȵo�l��{w�SGqd|�tp�s�ڏ�3)�}u�cw3�9�fq�Y�s�u�0��c�ž��*$˭���XF��H*��՚�PfZf;�f�!�Z���ݘ���U��O�*iJ��KҔXL��6���q})�M�	ź^��I ��j,HwG�KN�@�˕u�↝��$�\h@;j�A[=����<�c�J�V���I���/��@X��@DM�F�f��|��pT"9�]W��c缁�i ��q�gs��m�!��L� ܘ$�"c�8^y��
�L2sZ��A��Ծ�0r���̓\p��,�3.�w,A���2�Up�g0Y�s��N���ϴ*�	wR�x��s��uZk�\�k�h���t�Q׍�e�kv�����莫�v2��|�}v"&�}�c�Q�C��V��	����|�8��Y��G�m�D�z�Q�r3�(�`D����u��Ō�����.5�����P�3R��g��
�Dݽ�F�,u
n*��>PhJ$j��
6OF�`��"x暣fR�&�C�9��C���C�['�IpT96���nu\���d���I�*1�e�Ve���C���V�;Tc�:;��D�
�8��$� ��
]ULC�J�B�zN��jZ�F$`�{Ρͪ�\��봓^ݕ�\m�����8$N@Յם�kz�"�����1�pE�
�༎r���N��8��G��˵u'ҙ�8e*��#cQқt��J@��F�qg%�S�:%�ܤ����R*(A]W�2�����SMV�9��ȝ$~�ʣQy�5%��R��	\�X���B��Z�u�[ ����Ȱ�%�=_х�
@D"�͙\w�nTy������0��k�C���.���I��� <v���8����Uw�CW�C�~t�mU\�\.,��^jp͔bn�u1'�u�|�9��֬�<�Б�Gc�2�Ҵ���-�zޠBm

����;�&p�N[���z
Y�Y��}8��#!ϥ2��w;�m����	!�H�d�_QnIO��3e�i�W�D%�F�T�q'�I<'��c�{_9'�J��>�3Wf�{r�՘P.���9�@��u�9'g�n���4�I6squT��3��yCF�QgX�����M�f))�n��K�U����P�
�,U5�u
BN�yֱ�R?R�a�lu�?jr�Ƃ8$:.�j��z(��
[q$H���:7��M�/ޚ�`Z�V�TN,c��V�/�43�R[rl�Mj���
��D`�D#^�?����!G�]��N��@�K9���C)�OƖ�ܕ��{d�g`5m缕�����)W�<8g�h��*�x���j���.4`�Y�n�F��ve%u���j�>y��yV�
��p�~ 絪��������)�<�dK���GUCJ����)L�ʲ�Րa&Ґ�sh�L-�i�(�^K��I9
���E��P�������(��E@rj	�����C.�+K;����晆�q����	���(�h�hÌ�}����8���IF{��K�
�9�j���ѐ�t�*����������>Ye� �Z(7�<=E��
@��\
�ʒ��r4N����Q%]}G�vNʹ8����P�ب�J�+�;p��S<w|�&Q�ӎ�y�I?8�5�uY
17��{��	���$5z��&��u9_�h?7�$I1���b�:k�.;HV��$��|Ps��3\�(@��#e_ݍ�0���t	�P����y�,$ؠvyh�5_!*�kO�D0vMFҵ�x9X�kS_)Y��"O�%�
��ך��;4S�u����d�t��17�����]p!���k���lP���Kv|�x��J�&��"Ո���Ά�[��ʾ��c�Iɩ|�J�;��Ș��4�F�k�U���+�vv��s��vu�D����Afk˵�;�]h9��+'�1Cn�[� ���=�yIo�k�r$�W�,�=�0%����|M�kM�Վ0D�Vٽ�J�����iѬ2�M�^�U������u��YT1��������C
Ģ][�*ԭ�i�SN�<�5#��3Yt�(��ge��K��sG[��臐D_�.�,Y�����\S
��"��N���F�F]@��ų�W�Of��d�;wB����\+�9�L��@)�z{
���Q�I�2󚫠���M����"�c�:��]���m��5[ЉPGױ`��.|� ̺�oC�b՜5}�]?ɑ���*~�1g��3��5<�&����7dŶ;��4e�]���8�04�*!�B����4����N~�}�x��H�䄹'ػ+�BEh'�5��T� �<�x/Ukp��&cwf,L콍W����ȵ�i���C,4�6{��$�nv�G�?e�g\���9k{�F5V�))%��M\�8��H=U�;�ו����e;�=7�{H���Z�eJ��;��[tԮ��*4\�"�&�+��jVm!C��g�f����d@*)8R�pU��_drn�s=	\��(3�P��x�b,<��<��}�A.G�
u���,A�N5Ġ~qN��*MV@R�!fǷw!�����j�(��p�z2(�`�c7��)|[�/�措4;9�S2�'e5�{�� �������|RY`@h-��q�E��8�� I4��:�'��9����nD��,c��qD:"�<ǧp��
�_�/��k��#$7��i�>�m�&D�a͵�J@�>g3��24�"�cҠ9$=_)ڸI��j���]�a\��W��3 .�N�<Ű��q��ؒҲ&���tsB��t`"�c��У�U�
$�@�#:9�� ��9��U��j�Uf�Wv	5�ј��<ڍ�;�/�{p`��B���VMU�d����ȅ�+���D�j�QI�9�����/�3�^z�k�z�UM5t�PpB%�ش:�I��T��t��3��!ĕ-h��5�����(!�a����i3e`���8U�v(	D��<-�Pi�bCZhNɇ0���"����ʵ:�>�|Dr����IB���z/-f
]��%U�6�B�E�&=:�Cgً
v���s%]<�r�8��.����#STZvt�N�׹jʣ���_�j�\H�}�i-:�G|"�*uv�D;�׀�;m8��*D(���Qn�*Λ�0��	+�A�s�r@�\i�{.I�)�r.N���XsV��,���ZjUر��u&۵��t� %L��Z���Qw4m,A�?�f��A\zM{����c]�����J�|��\(��ו"����\8�c��Y�=��XB��Z�ĹC��q�߃|5�g�s���S��@up�1� �3��	�Ρ�?"���!���їp�Kb(ޭ���.��$��Eo��~؟���Nw��~��䕑f���ؕj�i�i?ϴ��=�T�i���B��8"�Ի�~��v̻)�'�r��5��ϭΫ0y�[3��M����[�y�V
y�j"��p������}���[���i
�dp��p��k������ʼn~k{�6�[k��x��m�Pj��}�	�B[���goR ��l&�q�����?�Ǡ�~���?ڞ��‰>A��5R�Ͻ�]��%�Ȯ{�=���|��WF#�.Ř�Nc��CT֌�=�Hѣ��?О�؞�>Ω�;�ϯ�瞮���Ӷ'���r��Ƅ�$╆7�S�Ν�%9�8�o
5�h��>�~n:8�i�Sr�0�/��t���h�;�_�O�����ف1Ԑ��������{���v�6_l��a�Rk�In?��ޔo�+}����S�0�}�����Z����p��2���Y�У�3+c\�w_�F@��5�����-�?���z�/�g�JI�t\�|{��+b0��v���_�sO�Do��Xl_I�]cs��J	��a5��L��6�5��1�������}������s�|�׬���	�k@�R��e�.�~;�g�S��=�1���d`��׉�p���*2��@(��N�����u���@��C�	���k��RM|��8�=�86�C�L\26�0�6�α;�{GP�4./i��	�z��MקW���3�囝اC�ű�s'*J��4�V*�
^�K��ϧ���Mo��[�������BxVr�m<�T{_;�O���!�e��#	�B��3�s��h&(�E=�t�^:,o�q�v��_�U�gfj�Z<�ܞ��A0�J*K�M��T���m�)�߆
��\�
��o��k1�Ǯ�^���ڰ���~�����8׿��$o� :��A�`_upZ0}̺'u���X��ܸfbs.r}c��PJ������oj��k??Iׅ���B%0��f��*>Ĺ�r,��=]p��]�5Hh��-ySy��a����* m�x�S9�6��$TWj�I�f�0�:Yدs2�Z��㿤����>�
G�ߟm/_��^����~c���
��,T�o�����'�릛v�j�T13݀�,��/#3��۞�K\��J��C�o�s��t�#��˪�ҩL1<���@u���m$lH5N�v����!�v�*���{��w��JF�$2{��S鵾��s�� �#���c�?	�{I���ִ��c��q�S}ז���(�����n�JψwO ��E1��!�� ,�b�?������4"��"�:�wu�j%��8
�U�_$���:5�Π�Wٞ����[I^L(�=i�P\�M�G�9�ݾ��@2!؜�	Y@��s!]5����@Z�t,�����y��HRi���^K�po�A�,�O���L�&��}�B&������w���+d{����$ٝ��\���� �����DŽ���/�7�dZ�����=���MUu��O�6rn���S��۷yͨj�\����2�3�k7��l����0��}�l%ԛ(�����ɞ�0ȨO:+���.Fk�8@�C��,=�]�M�`v���k��r����o�����D�}�~$�����s��
���)�Y�{.�'�#',���B|�{[��m�����u�+=U9�GɐR��}�f�nuID�oN�K�b:�G�����~�@ͅ��w�wO��3�C����sn��i�9��c[��'���_4-�o��V���7��"o��jS\�؇�ˬgĭݵ���:-J���L�%*�/e٧�l.:��;q2m�g�����q\�����z��y�]�Ƅ�r�����r�EEq�}]5I@���u�!w�8�JǪ�.O�lWjr���̫�!A��𾭮�ع��U�ȭv?�h�U\�v�؉�Tߝw�}@݀�䠖�]���R^�Z]t�r�q��]�h��ڙ�j�����H�xM4�ٹ_T����HQ3Ҍ�ۻ��u�=����<W�Hr|��K��qEN�Y\YrF""CH�9W�t<f�ϓ�e�]'UrI�U��vmu�ԉg�X�-=T1��e��	'�\:���h���2�&1O�F+>��-N�5'�H���(t��t�oJ�V�`Q-gdUo@5�ժ<�J����{���(�Do��O��oUc-j�H�$�`���ҁ����D�m�EDYj�"C7����:��x���r>.&'O��H�/��*i9���y"\��G�?"R�И\��e��+1^GKw���(9�w'\I�EF���^%<��ay�Ua
.&�����h�T�0\�DM*�H��yڐW@���l�����t�;�5��z�Uns�ِ2���u.��*�R�a[Z`�2bU[�J��Aĩ��e�b5�!��*q�Wd�*�b�X�+Ga��=\(��+�5WJ#��j'tu��0��н#ɱ
uIڪ�O�L�>�lt�ΨAv�f��\_�(3����N�J��
�x�]nZb�N�@���>;�t�f�h�y���դ	��;Ʌs�����8����ai/<Ͻ�r�{���������z��1ݛdž��x�MR��.d�c�*�Y��z��@���(�m�Wp�.j��3t�8�ꌛ����q�CRe	�k:��R� �F��>J(�aɯ��?���o��{ԣu�񝏴�G�{���8�V�+�8P�l�c97=�m�{s�H��>~�����'/de3�7�8_H,�N����W���^�VN*�U�2}�c�3@gqA,��Np98�l�=1�NMh��q@�ݴE�x#�lZJ��#�d;csg�W�OO��	?gz�Edž��v��鹋
(�1��n|g_�T��Tj���?��P�%\��ոRo�.�1;�-�籁ʋ6�O��k�RBp~���ʪdL��=�����g�y�h���4���'����4ɠ8&ot�91�3b"��K=J0-.�:/q�~;�_k�����_k�w��7��(�~�y
�w�{�q+=�u�9j�����v"w
.n���Ĝ����s��'Q��C,�\^�/�⿔��'��|Q0H��=ӵ�F`���:��l�Z{�ӻ��0B�̣��wq���{4!=M�W�V@�,J��U���p�9����
�s
؍J{�[�?܋C����/��g����O�{RҢ�N��,��:�j7W���?��h��n�O��Y�J:K�������~�����?x������:�՗�5�LN[��H'�}�������/k?���?��D+!3\�uPz��L<�y\�9���8�v�����3���D�8ǛgY�4�o�M�r!7j����K㕱��$G�Jf�����x�[��_Oc�C�'���u�\7�=�snH%�H1�I�=�'O�����@��=|�SP�9�����{���^����ߍ`gW�Х=���;
)��(;[�7�	3,IF�ϵ���=�����?�~����o�F�Bl�u�x9x��{�,)��U\�U� >$�~<��%!��)����5���>�u�=���"޸��	�ސ%�9غ��Ip�h?��w��~�SBN��G�x���~c\ߣ��J�u��0#iu�����C+uPq5�
�vC�52�+���\����o��������l�� �3v����_!�hWN��2h����JA<ׅP.Gk�1v�]�Z�?�\���Ozt�~�'��ǿ�\,ՁN�p�v1^�3�ދו\�Qgb��=�Nj�g�8��{��G!$Ҟ�8ra�.�<Q��c޾��������.U��J-*.7J<�����7͟���2�Մ����Rzmqm³(h��3;o�� ]h�x}dj�.���)���n(Z����s�$�����}�m� M,Em��}(����*/e]@��.C!bƱo��g�CO���Л�D��ڻ�z���o��~�����Ӯ��ʛ��0p����b7��]�6�7�ؾp�����hʓ�o�]� ~Fr�/�R�&��A��M�/�'tnȹ��
|�Z|�滩��H��m��58;M[�Ւ�f��#F�+r�
��&�
q>Od�-7AA�P�U�������0z��*�N���a�wo�Y�0O;o�L�d�+�B���9���R�wY~�trM�r�y�m;)�d ��?�~���E䭷5�].GP1��vd����ƈ��1�c�j�}����-��+�zO�p��g���"�h}��w;�F�sct�(p�ȫd4W��"���Q	��QV�J=��\�]pԓ�v�:�{��z�.
�r��m���H��{�s)$z���Y��m��_���%&��۪v��ۨ���z%��s��q{�)7�z
"�}�D���
1�5J]�P���d#���i,o�s�?�)	���{��A{�Ё��˱�ş^����{��*'H�#��ȧA����(���`��{��.'|K�u-�O�v(�!@�`�RTuIv�d½;n?(�X�$Ѣ�F�!J��KOY튄5S�<0��3\��^VhF�����]��ÍŅ �X�G����/Q�G�s��ޓ����w
�����J�:�Pw_�C����5�s��;~:U8���J�q�G�J�ˎHdDɀhh�{qv��h��v0hw�3��YXS�g2؄Ht:�FC��5��Cg��8���U+(u	�C�>a�3���sݺPеuYZ�����EC��}W?�z�����NO���*�N�TN�֕����E-r�m$�}�h�_8M"��+O�8C��`�p��(�����ڜ�q��+�9Yb���\�i/\�c��7M543�lr�hww}�!�Zg��D�e�U���Uu%)��,��w��j���΃xľt�R�Q��ب,J$2�#�Ǵ�� ��.n:G5p�*fHRk�\-A����'�u(���d:*��"	+&�JV�ؘ]Y�!'/�鄥�t j0�\�J���;��R���EM�Ѯ�"�#m�(�,�͂梺�ԡ��7��Ǘ�S��y���F�kr'�Mq�L� p �.Dw�JR�@/��w��5�s��	�嚥Ў�B���ӌ�J4a'�B��*���-z�����e\s��1l���w��y�أECa��o��pcHﭔ�\�@Z��u�x��ښ[�"��+���H+\�v;Q
�0���QW�F�u �����xbzs�Q�2��x�}�a�f{x�b=�"��-�F�b�8\�gw-�0%�F�	Ѹ���i��r�$�Ə��\Ն���T���0����;us�覽��v�2a�i�����/N�đBf��$�����ᮻ�L{߯����^ϕ��?�Qb�}�{�s�����k��]i�n�@�	2�0i����4���Lu��<�G�#1~������^�V��2�۹�ٗ�?���[9E����~:����*0!?מ�����h�L�~� ��9p�U$�7-��M�iyo��ztV��-��n���u��5z�� �U���U�2�	ˀ�i�_���om����VO�f%�t�+�U��r��A�\郒_�t��A�)sN�N�l��OtL4�xˋ�\�_������+{��g�\�؍@o�}m:����x_[*l\Co��0}^[����2�۾֞����~�3�=�?���ly�Q��+�J��WGP����xy �"u 	�փ)���L�Yx�B�tM��&�܋q�h��'u}^
��p�ˠ���|C�e�Cp�;a��ϫ�C}�yq{����qɕ��z�#4hD�{.�*����fT�"	)54 jzW�������������{I��/�k����9}�+YP�)��a���[����;>���E5pS-��~����{T�t��6}��ю{ϿntW��Ǡ^�lwǂ۠A�t,(��+�����@�-R���������5im���;�����c}��dW��x|�=wm��ZtGW���r�]�>�P�+�[���<�=�M&���+s�b]�t�љ���G�z�_������7��_��uT��4��@e!JzB��/��Lc�
�1U$ q�/��wh���W�w���K�&��z�����ߣF.�u��t�υ�uO�I%�Ao*�x�ls�q�<�7��&b�G���"���<s
Q��g#d$���P
@���|=��� i��_�b״;-ΈPUo(�1k��$5Md:��˦:�b����^��x_�����'���7}�&�ڿ�#�p!�W=���uNF���_�^N��JU���W���cvY�W�16����'Cչ�_s�=��*�q.�jƟ��مT~%�C
e�����t�����r%���P����
]o.������Mo۞����7�9�����o�o']Rq�+��p�@�ܩ�;E[jK��.�'T���V��j~����=�	[�
�bo��'ϠƎH����k����Ǿυ�w��i��hǺ�3���cϙ�����k_�,�yDŽ$�jx,�_WPz[Z�]��m�=�Ay$��AB�a~�=����!#w!��n̗D
s����������1��/�?<3�0'{�o�w��늵��^q,�i�,��/i!/qQ�k�oZ�ҋ,�%�W�`��w/�3��To��X���M��+�3՝��'mHZu!��n$����O��3��~��]�sY���2�0��;�+=��~��ǵ�1�?�~�(5�����H~"�������LjPaZg��������z�;���W��!�� �t���k�?���?ݎ�p<��ՠ(��p�i�����կ>^�[��鹫�ϋ��n��-ۯ����=d���0$�/��>�Yj��螣F$�2�z���2�U���+L�IJ=i�+)=�;�����S@2ɯI�����]�8�W8|�Po�󼿽vM~b�	����?�^�\���{�J=!L����z�d{��C�St/���׹D����'(�׸;��>���jJ\����ƕ�s��}ɻy_�����I���m$=s��\�͒��7���
Z���N1�%7Q
�.���))7�l:J�����vm�*̴�t�vžp~���<���Gq.��e�2O�3D�c��sR��\�R�u7�[F��7�1ib�n�w}�A�`+t�������1��?���Y$�;�)��O����~z;�Ӥ�T�̓M���2�u`�1��6��!����a��x�����a��H��=�%��{$<�a�C�2�j|���?�2j�xBd]���A�ѮQ�_�і�l�<�u��8�b@~����� P�t#�c�T �~b���j����<��#�K��w�P{��}oչIv�E$\����9U��Ns�����"�,��Q�Ż;M���/�x9͗5*0}�ߛ�^r�y�𩚖[P��o�Қ��l�/���gr_�	݉UTFù�f',�G�V�U�W�&���"�m
��o�_�apz�!���HP��#�$��T��ch�S���I��7n�p��f�3!,	��ĝ?���t��Ճ�:I�l�H-,��V��1�f��^�N�K�~�b�ES'�Ü�;GHCr;	�]	KCOd��s%4"\�y����D(���ôy8��H%�(����J�9�)U�*�\'LB�-��4�=$"�k�I}�f��}�b)��B��J�d�5�u��)9o�n4��(	�!��R�_�|qVV��mu���i��|s�����D	R7����V��I�9�&�~�;ֹ��Jq3�̧�rX�0'��@N&������*��j�L�؆J�u�o��tI��@��A��%���2˳�O�v1v��
�vf�k��-Rrv�_�Ӧ��z�b�����h-�|��D㾣A���?8t��t�>�@���G\�c������\�u@\�Nk�NbR׶�Q<i�hG#ed�*��Y�l�bu�y�.�N�*nB�`d�u�9!5�n��us2�`F�\���B
(\$�8G�v�kʻ8�g�$��tJRȮ�7�z�*nO}ov��X{�M����q�R�c���Ln�KX��3r��O.`�`�]�L%'e��HE�]�v�&��Ѥ&M��K��|u�J��bn
��)oC��k�`�X%%$��tz���7�oR���(	&��X�q����Q~ ]D���$��n��7u/��t����W����$�8qg��� M�K�kii�vݼ�u�h���wtҠs�	�[��y�p�T�+\�?�|-Tg����	��W�x���8��V��a?4OBc��qtgv"�Z1��sR�sz|ʵ�3%�R���`7��*.�J�D\���%�IvU|�U侓�g��o��
��MTr.Ue���H�\1i���5,���݃�9�#TʋF&�#��1!OJÜܡ��S�Ŵh�BI;)_}IT�׿+�72�N��y'��vdU��αYI�'����ꊃ?;~��\eA=66��.����j?���;Xc6�sr�aީ�����{q�u�j� �Nv��㿱����;s_��Ǿ}��h��L�%��{��?����~�L��cQc�#;����:�6���ٰQ�~��SbÈ�O�J��N&�
���(P閒�$S��S���hؕ=�U}

e�C#�VU�TF^��J	�BDMvC:P�oH����Ɣ��!奮��00��G��Z����[]�=p�.�}F���te'��{���t���q���أ1~7��4,���XrG���
�R5�UW�.Z{��$�M�����zdP���^�hà��+B=�Yef����&V�,�k�vN��;۫��|��A^M�`.�n�Z�l�
��q^_pV��s9�:�'bTFo�A�����]���F�j���~u�(%��B��F���E3���k�J.J�~�`\I�����
H�֯��t����ɽ�d�]2�jeFu�*vV�WR8D���S��Жt���qs�3�\C�<�ز2��)$��iVR�|��,˸���s�ݹ�v,$�3�J�C8���&u��ʁȄ\���H��s���y�6�}���g��>�w�t�?���q�]�>��v�j{�U�-��H��'������%)�o��Rh�8������SV��׀b�*B.�`�n-Tc���pI'��nЌ}�[���$�뉅�z��,�5.�b�D`�=v����e��'��ޟ&������y��G)F<x�S�ؒ�a����5Ɲ�w���;��?xNХ+��3B
ܥ4K���*j�A=	��W):1�w�C���p'��7I�o*ǪZ�*T���3 R٬��E�WQ�)�F��H�Ꚃ�����@h�y@�烝K�K���t.�E8��<��Bf��C����s�T�&	��}Ӯ���
����=:��6p�H�ߍ�-P���ر�ȽiA|%g�	L$К�٬a���X��1�\�w�u�R��f3λ��������Wt�@f~�[h�8��ٸr��ͣI����>���z#&�?+�1�,�mc�j�@v~c�G0D5(���	���ttMY��&t�(�k�G���A;o�f�8��P�2�W˭p�T"��2�U�'�]��Trpe�+�Q�]Չ��D���r�.	����˗wA��u�I�p�U|G��Ld�]l���Q��}��e�r�i:�Gc�GOu�����8�$�F�XqNȨ�]��m�(�y]����O��Z��X�i:X4�+z���8�	K��dNƫ�v��@*\ҵJv�K�u���m�]�vyWn���9(��2�ҵ�"��+#B�Pe��t�Y�Tғ	���+�iɰ��?`Y���
�+E��%y���ƣ3C���}�
��{A�p��wV��h��Z�g8�C�U�U��s�urS���QΊ;��ñ�`ä̤hJ�WX~���s�&(�6�����WiR\�1u���ؔ@�*
4�	�C�~6�%K��(X�aA9�[9����#V�3�U��µ�v�4!�O�Q��&�f��(��KJe�F������6�|o���N��ѷ�QHHCbR�gͬS��a��5#�8��7��s��ӗx�C�2����:����(�H�Ua�]��VT:q�Ul�Z�9�TK`n�� *S�}�Q����:�V��DL(���i��"�\Sy;x-�+H��r�g-��[�
�x�ƒ�0g�\�n*5�P�����N�� �X�b�U���`�:)�[!>���z^�huYx'��K	�K��j�ˬ
e�FǬd�]/�좛���dd�Ȼ>�T��@��Q���OUbf:a���p�9wj8d}	{Ot`
*$��\v�Q3�%'�j�ʹ�t����C�9l8�����UE��Q�&�MG��� �ѡ�'��8v���6�xn��@�W���+5kGd"mIJc�.�D*i��B*N���4��͖p"��5gݍ݄Pb��p҅�T_h7�q"�V��g�����q�e\h,oѼ�O/
�z%�9}B��!�Jm�F�(���P�#���S��-YaU���<]��Q*�T��.Y6<P1�@᭹�|&�T�
�܄s�5I�j�.w]cg��<�Ƒv��]��NW��2�>���K�Xʿ
�vJ�q�3��
G_��i�����>%W��=��٬̦^���2U��*	N9��	����*����Z0�ڕ�	��p̎{v(�J�8eꮝv�>q����`�=;z���5>{	r���k`t�iO?�.{���ՖU�
-�x�Vԃv�"����m�H�C��,�hH���x���@:��p�%UL*�iA�PU�d�ZJ��ş7B
s�=V�ce�I(Ԭe�!0��$���p�!��-�|M���߹{
܌5M���?$���h��#�U��c-^��=�*M�Ł`2#��C����c�=�o�K
�����-c'�.7�J�_[!��
8�����[%^(i���ThMN�YM]I��u8���U��z�.y�h��w8��_����.��ɿ���P��[ܕ���[f�Ǝ5p��^�i� ԸB����t�5uLhq���F���w�WA�k!�tm�&����c�禃�z	(�����L_�`}��F�8�w����tqh�Lޡ$�-�D]����a��Z\Ø
X�x�9U�<�q-\ٰ�n�W��y(�Lt�L~��#��IX|1:ξ�b�<�9i��5�L��{��w�,������U���5$�����wr�FW��js}�STE#��?����V��qI����4��@�\A��>�L9u�݉����T!�a܂�G?���K�@T�װH�
�I�\L�
��U�S�9@^�!�uu���Py��k�cch����f��<�ܾ�A����>Ѻ�����O��8���._Cs�p�]�Z�0�:�qc��!��m�wM���@,���eٖ�U{ʫ���	85�tO�P����a��R�������L�;/L��P���	q�L_w��JAx����E�M�5Ys�[1���cJ�m��Pb¹?&���F�J�-E. ՠ)#�d�=��=F]m�ΔC�,���qM�J�B�����.�:�j�p�K@WK'���`<ВpV�
8��H�ںUnU��#d��Z���N�r`i�-U�9�h�PT�v"b�֜��ruS�M�]�1i�wV
8$�M�5���XMpRc��S�q�����ol��v�i�K�bkG~q@&�QP��J�N����8h�5�!�BFrS����TW� �l��;�v�@ t,�qq��h7u쫙`�۳n������е������qߧ�cF��	�<�*CO؄oD��L�i��c��;����r�+�cU�|�;����`�U)�eM�����bU�a�к.Y�YCE�ɪ�§}ljb�}JGd(�T՝�K8:Z3m��;%`���.L��p`2J:e�j�pމ3$.$�ޒ�	�wJ��C�����_����D�7Cہ��b�)Qge�
I��%�h��S/����+����IY�$!dŶ.q�d���~����ͩ1p���-�}�����CԂ���Pwc��8┒�\s�r-�Eue ��U$g�g�2�xw�Y��K
L�I��ܺh�\���x�n:��hgu*��ίa!4!���U��	*�Ĵ$+Y�Ԥ�5�u˱�8�k�HG�B����g��9"���üҷs�C�]W����1�v��s���+1���t��G���WL7u�d�S衖�N�ҹ��<I�|Ġ2�>�a
)(������ku�;7�(�A]y��6�a(q��/����{��v�GM��~r�
팔3P��D(�=.֦�#6c!r��纯��%ܜH'��T
r%�<I*�CW�t���$��ќ�=��U���#�4IfB�n�\�(��P=�LM �JF�iTm��x
��o?��nK-�]\IB:��37�d]E���0�څ2G�vfUk4��IU͔bt�8D����R�G�LO�N2@��%I���;���;����B@��΍��\�s��Urk.D��1��݆L9��P���F��=���<+(���뽩(i��
�DO�P�MJ,�{�$ -pڽ*��ZlJ&:����R#�;��WZ���J��p�z%]N��}�->��:��('�M	�j��|�C����4�5Lv�,�;(p_佛{����*l')	�;�y����h0z����V�!Ț��"�X�g
�E#�@r�6�{���T�H�{l|Wh!#�y�ǟ$*;�p�&����߯����*B��4�t��uB.��4�@�3��cQ�A��ya�u�P��gu�)Y�Z�6O�\�'3�[����3�9���׶?�}�/=���{~ &�g��u�] ��x��tV\���5.���B25]h��Ϸ�\譮L�N(����{
z�H���~��ց�4c��|��^�r���x��G!��U\���+�m��+��WԵi_�XB���S>��wf�ԅ�
�H��P����;��־�����y��e������7�x�`�\{�h���y�*	��5�,�nnn����X/i����x�L��߿���7�����_<�S}��ln�������}�K��Ԡ2�D�|�����=��T����Ƨ�O⌫A�@�Mw�9��$C�Ӻ��>��cp=���[�qq8J��ʁ|*l?u�r�͊�L���������48?���?w�u��6e�ۿ;�^ӻڶ�������s�w}4��2�1���|y����=��]�{��s��1,�,���x����k�:;`��V�!�k\�_�&���U��Ƅ�s`-��W��{�"u!���cTFm6.���*dt*[W�py������'��ͪ�����#�N�����Ӯ�ꥸ�_�E���{��=���G)�yqt[�>�2Re��ޕ�������B�c�!�GK�e��{K��I�4�l_Л.����{�zW$a�c�������\�>��	VMrm��\��>��R�<��m�w��಺�\�Z,T���#Q�i�*��[�[7�*ٹ��t�o��V�q�M��P�!��q�����ڟok?�k�m��F�q�E]�?�l7����8 E$�nre�.��~}�� ��/�n� W��|���|޹��`g�����_�X-�ɉWL˙Ȇyh͹��M�(�,U��f��:W��Tݠ�Gp�
����Á�����,u��s�&���r�#�u��(s�fJ�/~�:�0��M��j%���'���:�:�}�Q��]�K9n���i����3���n]�{��A��JK�A�))Z5����
-���@�������n��?kozu�yC�m?�M(떭��2L�%����b1��Al���I��n�S��n�!#��A㥓���Uf���`��t1�K��L]w�6�?�΂�eV:�'QG�N��w=(]�Q��M��x�LT��1Aw�(��Dܧe�3���x��Zδ	�T��r�u#)�"Z�,N�Ta*�3h3$A��LΘ��*C�V`�=�Х�]^�$z�!�N��W��!�(I��Z+�_K������F��������`jq)�[�•ب��
�0�9fZ�.�y4��f����B���4L��2�dl�f@��؍Ny�M��)��eH*��֝f��\U��e����9J��0Ĵ{;���*�i�qo����q�	�Q��*�V5���J�PSG�ǠDB�f��W��ڪ�KZ�.�.���dU�@Y�D�1�
��
.�w@(��HaƬ��ɝ�ј�B��Q�j�Ђ2���Ev�M��l6��I����K�"��r�]�;�};u���RAM+��ۥ��Ό�O�#�ߕ7Ca��f��8�F���(yLs]s*�C�E��\�OIkH���|�1�*7��AR�W"�T�V����:�TI�,ܡ�e���Β�B;~*�{Kd�y�i�^�kAƲ��vrĎS�l�t4!;�`� �n�i�!/��s�B9�j$�lf�ϝ�"	���d)h'������T�	����,vCd	�K�ʤJ.`�y%�����(��&����Jl�q����*��n�2�o�y��?�/V�I���G��LL�|?e��S��k|.�4��~����@�َ�8N{�gclw�3��~������86��ҿ�^m�]�q��z�v_���9��q�9����$!����j��؜�����|>��f��� eYX���OD��%�J�	��R&�U���%V�5��گo�8;��x�y���n>O�G������lk��iR"�|�T��ߏ*%���yLqs����z4�l>Oɽ����Sʍ��~?TI�|���q>�_�1�n��S�<M�N�~�鲻�"��M%a�U���?&������*��1��*�v�9ϧ�_��o?O�ݘ���.�ǿ���b�s��r^��>U�J�u<?z�����hJ� ��y ���i��4v��g>_ț���������{���=�,���s�8����P��@����t#��4��@4��޻�<x!��C�Hz܌���ϫ�̻S�����
du�yR��\G��s㥻U�����O�țU\��3��jE?�_xI�=k�z��������U���e�4��W7c��ʮJܴ�H9OH��:"�瓕:��I���i�d�U߮���,���yУ;�}Lw2��U4�g���Z�쟧�)k������JQ���f{d�F�15b�59��?�����C��<d�1~2y�C��$�߿�y��O��������Er#�A��ڴ��=��G�4�L\��J��ƨZ!�$���ҋ�B��;��".�&�8Ó8��)�s߹pi�VYi�q�VW�R��m��Wp}�|�RX���0Z)J3�ʉXi��)�C=���L��tԈ,��Y�8}#����[%�\����{�h;4A����e	�V	���O�p�h�.0�3ݜ�~�؈��~���*/:Ĩ�i�� U������u�Y��^��^]G	9���}	G����)>�tݗ�򜲿�����J]�<I�/�M�f���eᓘ,��@�}��pF��hN��u)�E-u�%M�E[�kxI�AU��
�]����V�CHF�`]D�Y��b1�	ʐw���f��sUc\s��)4�p�DW���7��`��*z3UR�M	'��9��f}��!T�r�����5��y����?��P�e�%�e��Yِ ԕU�dI���cVZ�e�;���d��'��1[*�k������#��<��=�3��g�;6�߱�+BIj���9�Лh$�]����H=��Y
�"��=�H��[��n���w']	|C�*�hɈ�vI��dDˮ;�����!��mC��U�U�Ҥ��D�Y˳�R�����v��L`��{'��g��q]��Ao�4�W�˂+~_�s7�O`g�&}D�Oq�@h�v�!™d��'ɵ4��OB7�'� )�y/@R�Lz�rsW�Ϝ���$X��iwɻG:��Ae�i@��:��jF���V�σ�\5+?OC��4��›־��'�<�A��Гꥴ��dݚ�w�������<)Ճ�`��C�I�c�r|^@fO�=c�<���nT3B���k~�I�4���s_;�w���tᓄN$z�2?U4��T(T2W~9������s<�a��\��+髏�Ŏ�(ݬ+�t�
��V���
�~W\�:�\�0㊆Óƕ|��s�P$��+ qJ�9q���9_Q=�}w�
��@{%��q�rmW��5ԔU�
�����l�h	�=���+�:�ǵ	�����$�O�My��0Љ����z�J����I�)��ש+�m�莍*�ɨ���-��F���%�;m����� `$��#����d���{�L1���]�@�lԒ:� ���6YZ��ތ�Q�9	�A�C8d���9�2QГ��pno|�i{�؄~�K<�d������GrQv~̿��6���'zp2bx���+A�&G��DK�E?�S?�����p?�/����{���B>ڞ{1���~�=��|�����v�����Ϸ_�����+��7��~G���������쒿۞����#N\�����K�k/�B�2��Ϸ��%I��������
��}���w��/�Ǘ��_|�6aƢ�n��'�~��V��f�C<��ޣ�3�0:���?�_�� ���4�����~���l>�~�A	������Gw�q��ҦI���c���]���;(�9�o����߿���#����'�����=��xjT� F�
���|�;��_��.�3�����q#���NC�Y\G���a����D����1�\F���Ȫ~���J���Z�9�k-�U�gW�u*PD)'/bQ�h�3����J�?J�V�lW�����S}XQN��ε�R��]�f��C�S�B,)�]w0h9!�'}7�x�A�
쌺����g��•�B#�2Gۭt��H�<#o���6��M!1o�6ԡ�6��uI^�GN'�W��x@m�t�Wm���7���P�+.�+��n㬿�,�ƚ����\��mT�t�J%��Ɖ�M���:Y���s�5��+kmڕ�n?�D2fRd:�*5�%Y�y����4%0ͩ6��I��l�W.qDq�=��wM)��	�0�:6�����)�~#
L��T���s�c#���I5I�>N��YTޓk�U����a9&�Hl�I��1��K^6U*ρ*pt/i�87�d�(���[��5B>*����xI��%����O�ݎLI2|nT��tŁN�g�Ω���UW'��4S��t�Q�T����%�(^׹�t!ږ�3�n�+`'nq7O��С�ٝ���&�2�N\���g��W�כ	`�9����vm�I�a&~J��p�i������<���k���}�vg�`h�Rc5>��M=	\%2j��X���ЙV�:�T�\a禺6M:��E':�#;�"YP
O��o]<�QΓܵ���p�]��:@ua7F�FCHL�W(2�炎Dc礸gz}�'_�:_����,���F�N<���֪D��%�ϪJ�)�9�9�Z��7���g��?O�z]U���CR,��+��ʯY�)�8QEY4g��%�@8��g�8P�	\��g�4W�~��P�kUŅ�Έ����䊺�-5�:y]��%��Ia�.޼ ]n%�y����J���({�y*��#�1�<���pq��C��)�������	E�v��]%��(AY�R��7�5vUG����>�'�K�I��&%9���LaJ���%�]}۵���Ea�� 5���(]Ȥ!�kB�:��1I����bz��p�STv@��h]}�8�j�vL�kK�
�x�YM�W�:�
7T�k��ʆTAPюAMSW�^�^P���N�Nnٸ��Jr�cT��&N�e�]F]�V=_���.O���M��Իry�4H���A�=Ĭ�s�����kzj��:�+k�w��Q���ׇ��&���f/��TƬz�K��u�u�ڛ��c9]�x��v%W1p5`��L��%5e�]x���u'��4�
��W���r<W�v(>ڱ���Z�U�>a'9�ܺ8��;O��;�/�p寧rK�e#7��t���(Fs:hi�
]�U'_�+Oױ�;P�1K�*��@�I%h�����W��4!E�2�%������s���?%i	��3�;�[>��>���{(�w��<,�޳��z��GI�Q����������Ŕ_V�)(�t<wm�N��T�9ZK!���$���ڕh�ݼ�`LF��-�Q�G�$�2�Q�N�ց��8&U�e��;���}�J���I�-��d�F�&aEl��~&��}��R�n�v���y$n����3�0T��JD��L��]�ҋqy�)6��\J�0�5U|
��UL�b (�[i-: ��;�j���J��ހY�j�tè�#X"��sHw�~q	7�c� /�U�~���ܺ
��Գq.�+�j�\��s�
c��GNһ���܎�6,uފC��f�T�����]}�z���
�tC�z`��,Z��)�� Dž:�r�`Ƣ"�rI]O7���\]W�����SR��bڕf�1#|�s.U�?�i�ފN>7�*�,0�0t�U@���zI�P�ۡb�{0y�IP�MN*�t�3~���U�1e��Bk�[n��U�X]AY]�nūS��~"!H�W��@eL(�'�<y�zor됖nv~r�+݄�}p���A�vt�k!a�
�Cހ��Ҙ��EM��P��>h!��y���`�4I)�B7�Q�i�q|k�ܒ�Z3�H>�1�S����R�ʲ�ڍ;AY�s�A���n>9���J�.�0��O�1媈G@�à�wͨ�U���$�iw.�÷��r	u1j�J��?��қ�@$G��X/O��f�r�hl����M�'�~V�m�('��{4���ݳ]��.�q^�J|F���X�ܪ�'��t��Ct^��%����t~��$�h�"�e�)���j�0����r(@"�PozW�!L��:K��,�L\��uX�jrI>ru����M�g5N*��-2��3qg�i�T�y&.�S�;#�%l�.V�hT�sV�,�hXȕ
�&��M�5U*�eW/'"�#��Z�xW�q�#WB�]�_EPqx|�
�9�@���sbRw1e~Vb"�3�����X\Y|N_B7)Zܔ&��ƆBs���40y��ܔ�@;�e%Y�ī�3Yn"���Yq��Si�E�� �r���D��p��s�`r�0��"�ݵ�GE�@�D�uX�gt1Q��*�TM����*Y�U9�t��5p�Q�����uW�e��
t��Vw,��	��;5�M�ɴ��ݞv���\~������];��0�����]���Tχ����D׸�+Q����p]�Y;�$:�S+R�-W-��I-�61Gr-�����d�]�\�I������,�b�Ts�Q|ո��uɕ�h����k=6Ik���Ş�����<�)�4�(���%��N���+��uT�r	6�S �/y:�'����EMI4��ӝ߅�N�B��BE9)5,.��g�vB���K'�Ҹ��f�R�h�d��WP,X�N�ܕ����K�Q�QH����i��E�r�O�WwG�qp�Y��U(�s�����yg�;)R�g[��)��@l��Z�sPI�Q��%9Y�\��;��:��)�n���Q�玂;b��#��s)I�����Zz�4<��V$�]lo�#;qJ���7>�DZ���P5Ѩ�.yZ�8���x�v]�{����N�u���5nN�zJ�$�5�D�q?(�EOIl*��|M��5ׂ@ H��D���V����;>p�{o?�����u%hkZ$(aI*9�֚�b�������|�s������P��e^��Gu�Y����O�Ί��J����H5�*L�ѵ���iX��S%.� �A�v𔯢��C�M�\=��z������k,����p{��ԑ&�jS�NRQq~�T��x�^B����!��q,�S>�Α?:�q�S��z�[Z4�IW�l�2�N�H;)ڐ(�����L�q�]�:�8�K�:�y6�ckc*���kM�s�jAG��J
�W'���d�䔌��h_�E2v�1�O�*W0WG�$o�B��j�T3oڹO"z2X�U?�a<�����)�8%)���E�[*cQ�2�U�%�Pi��{	cO�/�!0�f��*�VࠪU�dF��8u`5�r]B�6�r����F�RձsO�q���\.�'
>����A�S��f���?v�����
�b�D/����`��V.�V�fy	���)i�5����vuZH�7p�)�tz
�vd1�ɧ�˵�f�UI��ɳ�||NZ��'�s� ![u)���5��7�F8Ԗf��y�]n�_"o��7�T
�n���>���3�(�W@uy�ӯ Ո��e�g�9G=֬=u��J������!�$&�sש�j9��nc�r���)�bg�&e'8�k2�j�NAc™ء�;c���Yv*!���{P�Uر���aB��8��aU��� PR���ċ��H<.�Tl��.Dqv�5��!��L��S�Ёq\/�\�Z�.�u:��K��!/օs�,3���^��¿���;�����r����ծ8����IEND�B`�sounds/rm.wav000064400000264054151215013530007223 0ustar00RIFF,hWAVEfmt "V�Xdatah��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������	����������������

���������������������������

������������������
�������! ������

!"������������()���������$$��������������%&��������	
����++����������	������%%44���������&&��������������%%����76�������������

??������

����BB**��������ED�������56ST��������FG$%��������EE������qq����������QR������??����44&&���������AAss??

��i�i�~�~�>>ttFF++��������		OO�������������������}}rr22��������HH����KLaa������**k�k���8800ii���������h�h�����aa������4�4�����IIAA8�8���������������������b�b�^�^�����������66��R�R�++����2�2�y�y�mm32������F�F�r�r�f�f�������EEW�W�)�)�������GG��������V�U�}�~�������45ba��D�D�����45������G�H�����������G�G�NM��__�������������9�;�������������;<������qs�����������V�X�[�Z���XX��;�<�0�/�'�(�K�L�_[������M�I���"����E�H�����~���������QX^�X�`�b�ef]�Z��������c�a�W�Z������CM!`�h�j�j���.�2�����<:����������;�B���`Y����,�&��������FKND������6�A�����LP����������u{��|���unmN_���iK������������;������s���I&KW����2#w�������t�~�6���������w�����;������0�k�a��a�'���S;������C�m�'����[,��|�V�;�e�X��;=��e��E��������lfaT����f�7��ekk���i�f�O���s�[
��h�k���v�����M����	(�\��h���uwY��$�����z�b)[��s1��7�T9�oK%���_�����1}�����$�~���)��K���������1�������.���C���2���������������(r�������Ii~�V�%w�2|���B���]���_����$���9���������b�
K��������3H�M���k�{�
iZ�����>�/����������i<�����A������Zj��%�4�����a���a
���M$�
~�d�����8��)T��i��(��%����~1�����]�Y�q�[�V���B��<E�
�2�^����`�'�P�y���(9���9�z��@�/���,�#�����3���~�!�'��,��ER�'���o����>`��+���I����������,��r�~�F��r�����K�����h��v���,�P�G'�w������)�����e�\�7���t���,g��@���,����������d��h���Y�
%	����b�
V���	�o���`�<���w��U,��^�v��1�)�����K�S��4��'��;�������T�Kb���{�������?�q�#���������:��#���g������s��N
_�����[���J��2����
-���T���,�a�����!�X>E��v�(]�*��c�8
���M�^����|������|i$�u��~�3�D���-����X��O��L��u��;��x�9V�'�E��b��b0�z!���X��M)��a�4U�f���)!������!�)���d�4#|�����}������L �t��R����v�c�����+���t'oFp������Y�_��������c�����
�������.8q�\������6c����)<,�"�~������	�x������)��������,0�0�������N�`�������7F������r|��f�x��������0)WU������@�@���������GW�{��G�G�D�H�x�n�>�H���������")����		������z����v�l�����>@���;<������Z_R�M�������������@D	��������������jg����B�?�,�/�! ��������78����D�C������������66��T�T�1�1�//������2�3���Z�Z�����.-T�U���RSN�N�����������C�B���ji����66����������������yzFE��22��%%eeNN������66ww23��0�/�	�
�������F�F�����������������dd����������'�'�����55�������
�
��������[�[�>�>�+�+�������������t�t���xx����88���������������YY-�-�����99m�m�B�B�������II����XX??GG��4�4���&�&�����rr��������������^^��55VVffbb��w�w�����^^��I�I�DD����@@������R�R���������{�{�����n�n�����������������d�d�

��00==C�C�--w�w�cc^^u�u�����������CC��]�]�����q�q�������NN����|�|�a�a���CC��oo����������i�i�^^������5�5�����

ee������������g�g�HH��''������@@..��6�6��������		�������@@{{��..��������S�S�~�~�������jj��dd��������K�K�#�#�//����i�i�==����:�:�AA��������__2�2�55����,�,�����������Z�Z�����\�\�������vvj�j���\\NN&&��qqWW��������������AA��������}�}����������������Y�Y�����[["�"� � ���ll������''��������  ��7�7�����HH		��LLtt������������z�z�n�n���S�S���y�y���������$�$���__����4�4���������������		����������������������������k�k�I�I�������vv��yy��yy��������|�|�����..����������������������k�k���ZZX�X���y�y�����������������$$��������rr��>�>�%%1�1�������O�O�����������]�]�e�e�����������������p�p�rryy��u�u�����i�i�������A�A�HHnn99dd�����������������������
�
����������������������//������ii��������Y�Y�����oo����ll������\\��������$�$���++����+�+���ll����q�q�S�S�HH��������
�
�����ZZF�F������������������xxppJJ7�7��������
�
�� � �A�A�����������������d�d���

����������/�/�W�W���������aa��b�b���������L�L�X�X�����;�;�RR��FFff��E�E�����b�b�oo����������������,,G�G�'�'���������[�[���K�K�������y�y�M�M���"�"�##����n�n�����eeX�X�������������������D�D�$$aa)�)�QQllc�c�x�x�,,����L�L�'�'���QQ)�)���++N�N�������������H�H�p�p�..4�4�����������qq��J�J�������=�=������������3�3�����22s�s�	�	�y�y�����������������������g�g���������������kkm�m�����������������������������x�x��������++^�^�		���������	�	����cc��;;G�G�������yya�a�����~~������j�j�EEE�E�������<�<�#�#�%�%���������f�f�����\�\���..����22��""������OO��������������������ll����j�j�����77
�
�������������}}!�!�P�P�GG��������������rr<<55z�z�^^��������������������������~�~�������K�K�22hh������������������������B�B�����������-�-�l�l���TTSStt��u�u���������������''��YY��T�T�pp��e�e�������Z�Z�������44����22��gg��u�u����������������Z�Z�����GG����������yy�����	�	��Z�Z�BB��������������[�[����%%tt����������//2�2�bbPP��������EE1�1�>>mm����ss��������=�=�SS++���������UU

��
�
������}}������m�m���������--����P�P�??HH����������ll��%%]]��������}�}�Q�Q�����C�C�������������3388|�|���I�I�����;�;�a�a���5�5�1�1���~�~�I�I���������ll����������������������^^00{{RR������i�i���MM((`�`�U�U����������������XX������������
�
������������������		����:�:�����}�}�����������������������������n�n����������>>��~�~���hh33K�K���\\$�$���������n�n�����{{����������i�i�����������&�&�I�I�����ccX�X�mm��tt������00��������00WWG�G�ZZ��������<�<�����~�~�KK������������00���������������yy������������pp������������__����XX����YY��;;������U�U�..����c�c�������,�,���77W�W���dd����VVA�A�D�D�$$MM��uuR�R�mmUU������}�}�gg��������]]		��������������SSkk��������~~

����������NN��������#�#�������������������uu��������������))l�l�``qqLL��������dd33����7�7�����X�X������PP,�,�������}�}�����:�:�q�q�������m�m�������������v�v�**rr��jj99%%ss����??+�+�������3�3�������w�w�-�-�**((ii��GG���������33������WW����"�"�������������zz\\��������W�W�����RRUUs�s�������������zzZZ}}i�i�!!����KK����������k�k����OO����@�@�������vv��$$������������{{������������p�p�ss������������������������##uu����.�.�����++[[����������eeUU����&&zz�����&&V�V�&&������������88b�b�k�k���z�z�

��������������������..J�J�����H�H�qq:�:�kk��������B�B�X�X���������JJX�X�HH�����������II����o�o�AA���������������������EE��}�}�������}�}���e�e�����ss

pp����$$**00����?�?�^^II��������������ww��t�t���������6�6�vv//jjV�V��������#�#�������������>�>�q�q�����-�-���tt��������`�`�������4�4�������������@@��o�o�++������������=�=���YY��TT����ttF�F���l�l�9�9�ii����@@��������((������~�~�dd��������FF$$^�^���gg��f�f�����������tt��ii�������������������� � �����������II��{�{���������s�s�-�-�NN��������/�/�����������2�2�����AAAA����~�~��������OO++x�x���u�u���__����a�a�����PP88����������������%%UU����44������??[�[�����>>��������������QQ���==,�,�O�O���������FF����mm��������v�v���&&����Y�Y�BB��������~~������������((B�B�m�m�����(�(�00tt������������3�3�����CC����������c�c�[[��

����55��[�[���������eeii��aa������������������{{YY����������NM��������vv<�<�c�b�����mmOO������ZZ��������������ww
��4�4���{�{�����������������������||����;�;�JJaaYY

..��������������@�@�������]�]�������WW��������i�i���������

������������llFE������������K�K���$#*�*���������		O�N���@�@�Q�Q���������������TT<<::��98��88������������K�K�������������hgWV+�*�10����RP����{�y���,+2�0�������US����{z����������;�:�kjn�l���ZX��C�A�1�0�������������;�9���DB����KJ����'�&�:�:������GG��ED����LL������.�.�[\QR		BC����EGL�N�������uw������bd,-��d�e���\�]�56����34��������������
�	���sq��t�q���:�7�G�C�������~�y�g�a����G�@������T�K�A8!��k�a��������}�����������9+��oVF������jW"�r���/����y���}���E0N9��E0���������L�7�"�
�[�F���dP�����%��|�����r���������������������t������m�`�h�\�PEj�_���������E=��������XSto��H�E���������dejk����wz,/\�`�>B��;A��sz������IQs|��\�e���M�W����� *����p�|�h�s����{�DP�����������*����i�u�>�I�m�x�������jt"+�"���������ov��kr����GM����W�\�� �]a����P�S��qtE�G�������c�d���p�q�������PP���IHED10|�{�������=;M�J�������y�v�ZW����������A�>�����YU�������������	QLl�g��������'!C=��#������xsy�s��������������}�ic-&H�A�X�R��������;5��������.(������id�������xt��`�^�����9�7�2�1�����������fh��
��>�C�=�D��w�����@J(q}��GU<L������n���������Iax�������/�����/��?���6Y�����|������E�m�
3����]�j�����.�Z�C�o�=i��?�k���)�V��������q��������y����������4ZHm����$�G���?���������������������#�-/�=���������������W�[���DD�������U�N���{����`�U���n`C�4���������`Nz�h�����D1n�Y�O:��1��3��z�K6��9$�������{�g�������w������������&����������wm@7��ke��������"��NL
������BDF�I�����ek�����4�<�a�j���������EQ�����!.Sa1�?��������o~������R�a�K�Z�:I����%�4�#3A��.�<�����������k�v����� ���"�"*����������m�r�����qt����������>>����+�*����	&�#���EBZ�W�����gb0,��������~����������������1,��
3�.�����~z$� �O�K�FB������~><B�@�}�{�a�`�����WV�������""NO���������� "��OR=@VY��������eiae����������49�������4:HMHN��!�&�����lr���,�2�D�J���1�7�KQ/5DJ����L�R���������#)������������������RXe�l��������g�n�#���e�l�QX������N�V�RZEM]�f����������Xa7A���������������������
��DOp{������~�@L������=HG�S���x�����"-Q\F�Q��������'�2����(���{�ENF�O�����������G�N�]�d�ioV�[�;@���������������&'<�>�()��44~�~�>�=�	��WU��������+(���������MH����������HB��`Y������JBd�\�~�v�5,��yp������|�������=�5����~0)?8C�<�:3���>7��E?�����/+����I�F�����sq���������x�x���������5�5�t�u����� "���������&(������������v�z���LQ����$��!�=D/�5���(�/��&�������&�/�"�������Y�`���������������&�.�KR��F�K���!�&���16;�A���EG19uy �$�P�W�}���{~��N�R���,-&�-�-6V�U���1�9������������$�
���������\�]���������������,�2��������
���12����YYIH�QLf�s�SH�����������SZ������"$[�W���'�������F�F������	��|�m�e������y(+����L�$�
0;2�����Nx�X�c�����'��������yh����^�.�j�������VzR8B�n��������X>�P���y����)�@������j�s����shM{h�N�u��#�������>�L��SO�u������H����0���]Wr����q����(��[��D^"�$�X�/��6Q��;����{��
�d�>����
A�0�p���ny���������#�������2P����U����H���� I-*�|�3���G��m(�T�_���������{7�/�R��{�6�Y��O��x������������#�4���BI%������o�}V����X����@���H����/�9�������v�������G����n����������h��/�K�OL����w+w�*�@p�A����1uO���Y�\�������F<��:K�C�<����=���y�j�S����e+���KE����������`������|�e[��J�$�0��M%(�������$�7zl�X���qM�N���;%s���u��q����<�_$[��A��s�c�I��a��V�?��)
3��-�0��^F�k���E�}�1|��E�g�H����������7��c�K�����`��/����j[�����]v�����(����2�u������:�����1�
��/�	q�[��������r���*�w�!���:�jr�����d���N�t�gT��B���&L�G�z��	�����������K������=�����������?�q�\�$�W��x	���K��W���	s��������8�c�.^�F�+�����q��������y���/�Wx�>������������H�c�J�0�I�z�����������1��R�[<����G���@������+	���^�������
�N��d�9�"r�w�������0���������8��X��P��9���o0�9���%g��D,�]	G���Y�L�����U�;��/�L��Oq{���������+����� ���e��/<�6��ml�����F��j���c�C�'�/�|vj�T�z��S�Z�����
]#�	�^�_���{�(����X��"�D��u���������������E��FO�G��n���t���5�������.�;o�F8^�{���U��U�)����4*x��
zC���G�H�����������h������A����X���T�{���n��������M�����H�/�W�v�J��]�>������a�9�ZN��bU#��D���]�_����(���3y��c
�����)�c����m���K������a����C�4��Uw��
�T�W���.��������(�������C�O��*�i�%���8��w����i�������T������������)`V"��IM�GN�-�	�������%�K^�)�/�����ZF�<���"���6N!=ni�`����O�S�(]�7�}��)k�y/�����������"?O�B�8�����5���2(>L��=��&a�?��1�+�-�����a������H�c�l����T�+C�������;������������������I����� ����f���k���"����_�`�m�A�^��6�9~�������d�9���H������H��������BJ������
�[��3��{�~�J��+��.�s�E��=������7����r5�>���{�IY��q�����J����q�W������O��z�,�y�&������
������6���,v���;�g��J���yb��R4��s����47�}������������2������� ����J�#9���B���z�l��,���W9J��H���z$�����wN�s��:K������u����$��>F��	�����\�-�n
�Q�o��������~8�t�>��%�s�.�����*���2��^���V��s|���@��;������<����8u&���]����s�<�Tr�Z������K�E��1�^�����`v���:�A�$@d0
�lb�
�>��w�A��PD&��>�7�-�W�m�&�Z1S����#���C�y��e�
��;�/��Z�����0�[��W$���[��l�E��L�����
�������X�y��f�2�7�3��/�z�K�N�)����F�q�����:��#�o|�������������r�c���	�.�*�����=��@����((���`��U��L�b�l�F���Y����)a�����)�V����Xz�<����Q��������7�/�a��w���<��$����F�p�2����0'k������������������Y���r�Q�Z���!������_�������~�������v�������Z��0#��P�������i�����*���������z����0b������X�B�����~m����-�F���f�<��j�
f��2���C
��l����IIb���Y�m	z�����<��������r
f������"(�����g]�	����O�(<��H�L_��+�t���s����B�#X���v�������t�������4������#~��+����2����~��J�_��g������C
{�
����=�i��������G&�
��7	^�������/����m���0e���b��c���H�v��$�J���H��!�
����n2(���#��x����������;��K)����L�E�q}��y�����4;?�C�.�����!��Q���(�����rm������� ,Og&�����8�E���8��S��B��5C�e��LB���C����H�)�PK4����7���C��5k�t���
������4�~�F�$������ZN4)���$�w���S���IK�F��q���/,F`��S�K�V����G�~���{��<���m��F�}������^�Z��	�����x��E��B��y����'��C���.�SR7\�����9��h���V����B\��!�{�����J�R���c��@O�f��&�k�������<�Z	�������������{�q��YC�����	,�}��������v�������
�G
�n�.���Mf���
�������(��tL/�m~*c�c�$�������V����k,
���M��-�������1*z���'<{�X�P�Y����
�S���i����C;�E.�n����&���h�\����e�	�����`����(�*��������W�W��������8��	E�����<�e�v����WF�	o�E������/}����jk��S
D�����9�
	M��E�T������$!hK������(����
�
�
h�����_�9�o�
����f 
��N��q��Y��c����Au��L�^
�^��	�~!�����s���x�r{� ������
���]���	�s�?�M�f�[�y�@��gE��_R�V=S��G������B������������������ �Y����r����9J���O��
�	C�����������V1�q>�>G�� �L�N�:J�������,������>C�����?���~
.����Qm�:�����
_�c���x�
�h��H����3�����o���|�V���5��
�i���	����sk��U����7��	
��IW�V�r���c�������n�u�
%��S	�9Q������&����D�*Ek�j��������	K��i�5�L���]EL��������g��a���D%��9f�	����������O�|��(�<��5�]p4�@�����g��[�h������M����F������b�^�j��h�����h��
6��3Wr��|�)�z���.L+n�0�}�*�$���������V��k�E��-���h�+�������V����������	*��:��n��~gx��v�s����A��I�^������#��9�@�E;��m�@��Q������H��	���i���7����Z��H���*���'����N������x��@�B�����.��M�u�'����
�������m�������Z���"�������	�(�{�^���$���������H��9�/k�<�	�_�w�b�q���Y����mz������	�,��e
i�1�%���P�����|�iy�-�|����������~����<�����p�5�D��m����k^�PD����e����������k�	���������<I�*��{f����.��C� ��r�i���7�D������Q�c�*�����|��5�f��,�X���<��Y�s�[�����&��.q�'���C�,�����)���=�I�������io��O�n��V�3������r��7v�z���u��\�������<me��
�V������X������)�r���W�������5*L�����������������5�����<����~������|�.��xs�K�1��������x����	���O�G��l\8��;�|��
"�=g�����5���a�fyU���62���;1��d��t�@aA<�I�H�v���
�L�G������X�����p��{���9���~	�
�����z��o����y����	��Cr�T���g'������~]�G���Gn���f�o��m���!����s�1���_�m	Q	��&���#���x�����uT�n������]�30��d����)�RT7�����	����c�f�+�;���d�����K��~����G��f��wK����~����&21
V����g�"w�����+�Y	���:�.�;{��}�l�
���y�y�������1c��f�����m����*�ux���nL�+h��5�����\������
��.��Z���<�2������];z��b��1�(���U.��/�zg������v�E���s����"����;�����������|����z����y�����t������|�7����M�����h��.���<���O���W��}0�m����6�t��46��w��2��0���}��r��k���|���o���,���� �"��G�v?��=��0�&��	H��TfH������E��k����H��u�o���]�#�~G����C�S�����r�V�Z&��	�
�X�5���)�N��i�U���58�#����d<�(���1��1�h�������U��������S�����B�����UK!w#���:�o���^��f����l��V��V����#��o�D�J��X����>�@����G�2�T��-5�X�������JX���h�Z�t����� X����J�v��9� ����b����m�E��D�����A{��+����?�V��S�������8J�iG��������|����N�]�������Y��	4��w���������6����h�T�F�R�$������}�f��L�i��}�i����Z ���k���O���:�S$��j�o����u[8{���W��Y����g��@���*������2�i����f�����(_}��Jw��9\r�f���3��S'�e�	X�h���������9�g���J�G��H�C�������6G�u�C�����v�u���H�%�z&���8�"��2u����B��c������6���Y�"����Dn�Z�W��g��mR�7��`�Q���?]��m������L�����\��_�W��e�m��������������(������-T���*j��I�P�����X m8�2�����|�K�3�\���X�m��
��v���������������I�W��,1)���x�����n��O�_���K���L��>����w�y����x���R���r���q��$����P����oJ�x�I�Z����-�WC��VG���������y�/"N�D����C��@��#�O�X����{������[�C�������_:���_�P�![�U��w�+����
?�o�G�,u��t��������0����;�Z:�������������.���0��~����E�Xl�N���<����C�=�!������7�h�����C�������79��D���9W��������o�M��-C
�����Zu���V���a���������%�B�(9���A�ox��)�O����E�&�����_��n�<�l���8�����N���q	I	������}�I�&��������y��O8����S�4<��nV�����������������	��2�r�G���s�&������(��\��6�A��g�����#r�~1��
�4�jz���y��}�+�E�k�vu��o��d�����h�-���������QD�����\��
�������5�;���k2���R�#�����������-�)�+�=���x����V|�����D�����k�b����x���������(�J��wg���h�������=c�`��F��G��`��X�������Iu�"��"���w���]o1L=�e����
�`�$�4��
K�����x������Y�/��a��(NO��#����`"����;�f����/�'�Y��� �w����4�W{��><����	�k��$`����5�,�����\�}�K��B���"���������{�W����v�a��&��`�����*�����c��o�0�������}����b���e6���Z�����j��7�:� ��r�[�����#����W�{�O�����+a!�k����x>�j�������`������\�Xt%8�(�:f�����$O]�@�6,����'�������'�-��>������������������y����������g_��zv4��|{��qs?L��$0�������B�R���@L�����	�
�����
.o�h���~�]w������������B6��������������������|v������������[_A<��FH����n�q�0105����m�s���������de��E�H�i�g�SS����;�=������tx��������/1��~������������������������6<J�I��������������TQfh"!�����7�:���������������������~~����`�c�����������������Z�Y�����+0�����b`����������GH��G�A���9�=�-/������������:'E�:�`�r���QA������F�9�
�����rd����������V@3�8�Z�N�.�*���}�G6EU���y���OJ�o�~AK�0����KY����84��br�������|=�D���xS��]�x���o���=�Y�R�����������������*H����x���|.������F3���O���Y������uL�)����&���}�����Z�G�c����X_F�
�E)�-�{�n����r���:�%LF��|���3��:���������\��,����*����v�v�B��d�<�������
���B��++��-�����'�!\��(�T-�'�z����#����o�
����tZ����+�h������c8u����
u����TWR9����\Q����a����I�+�y�G�
�������L��^K�x��*�,X|B>�����D��R�|���6����N����uQtf���x�u�E�>�R������|�h��j�2�� k�N�~1�0�p&@�w�r�b�C���x�������o:7�����<������e'b;��*�Yu2	��<������'�������D�<������`�0���������-�{1T����*[��d��2� �����=��Q6�E����ea��m����q/���_�H�K;����w���$H��2������3�;���G��D�+��?�>Kf�W���6��y�t�T�$�j=����'�������B�P����9�����_���-�8����'�Da���6
����A��qy���������~�����&��m�$vlo�1y����T�Y���],��c��d/:�V�B��$���A�GK}�d����n���B�r�I���0�'���)�_W�r�������K�����b��{���|����4
��=���J�F.���u%�66L�K��d�:��U�>����sn��;��?����l�R����s������`��)����l������:��(���|�?�c�����m[8��{��@�������]���kQ��p+{=��R����6�|�e�����n��OB���8�n���%�s�'��S��9��������J�:��������������i�����,�d�T����
d�����������e�h���e�eU���U������lvY��������,���4"�C����'�b40�s�:��i?�r���%n�0���������J�'\@h�-�R��K�)D�:�{�\�+������R�P�r�#/�0"�e�����!H��5��k�c��Y��������w�C�����s��n��'r���Q�
�"������~��vA���������+��4�[�h������D�����l/�c�8�w��^�z������������
�����+��@����y�-�)�4l7�x���[���������������C���.W��-��<�N��ER�}���b���`�(���y��e��'�������:�����D�_�����oD�N�
�e�#5�z��'Bo�������@���|��e�K�z�(���{�(�:�}��[����_��F"�����R� �}0�[�S���&���>��{�G���y�g��Lc��Y�����Y��������4?�k�l�����]�XY�1���1��4����O�����������q�`��8���y�_�J�����(������8Vh\����J�D��`��
��+��W�������e�����h����������E���EC{���7�=~��F������_������X,
�/����p��;�����
^��&N|�����Y���W���E�����g�%���N�j���;���8��~k��,`��O���A���+������]��d�6���a�r��4�o��y�������C��r���iy�����C�Y�����
�3�H�m���������I�k\�\h���.�:�����
�:�$v��3��������$���������0�Z��!���l�!�������������8	��������o�O	�U��)��O=����g����n�I����U�j�{������V����0��u��,>�J�n�w���Mf���;�9�)?K�!������4�U�D�x�
���������-���G����7����mJ��y����@��=8�������db���z�F���������K�+����V����������{�	h��'����Gv���G�vL�XrO���H���������-�J���0����_�W�����9L�����������0��^k�������[#����������Z�
h���
	��������'<�b�9����F[���������&�Sp�O���N�Yt�������`��yuC8~���[�X� $�����qqZ�j��������
SD&����	*�$�@�\����GJ��+D��Tb�H9���-���J�
��i�������h���l�%�0p�����*OnU�I����S��Q���[��������,�w�b�i��A�<��r�������$�rX�@�?���������\�������z?	�f#p�����i�>���<�P����%���c���=�����ME*+��������C�s�p����>�<�L�hY���f�p����WTbl��������4�0����$���h������S����<�?*�w������������U�Z��������0�z���%�2������T,�	���H�������F�����e����[�D�:���K�9�9���C������-M���W���d�>9���m���
�2�^qy�D����'�}���@�y�Sz��2�%�Sh9��
��������U�?�s���u���a��<����J���T�����G��U��J��~��i<G��GAt��L����d�s��`�`��� ������J�� ����p?��,����
������U�u_n��A�)��,����HCf���P�������D����������Z�x0r���R����OD���|��P�����c3���7-�%D��_��` ���~���������_�e�����	�:�
��������!:���{��A>�y��K�i������j��O�~��H@0����)�@�����P��^���[��W������x�`���X�!��M���
�E������i�=�<I4w��'e���S��*i������.!���3��$�|�s�~��/E���������]?L�k����L����s���:/�C���y�PH�f����X�����YS����x-����w���0��E�-�"������d>���L������z�Y���(*�M��2���Q�������	�)�������8�&0)�������������m�&�C��7�l�
����K�2B�������y�{�Q=�����B��&�@
�	r0�`���������c�����������1����~�&7��`�	2��~���������T������2����9+�8��9�����W&s����w�8�X����4�9���F���j�rGL�&�|�����w�c�����~��m�h��,`F���d�.���I����hyn��R���-s�#��$�h�>����:�&�9�������'������!�����_�������R���z/k%�����1����+QB?��r��CF&���������YuY�Eo����������o4�a��.�b
�(���h��rQy�%�{r�������Q�����%�+����1��KR��+�i��:H>]����I�#����������[���]��\0���E��v�s?������1�b�x���?���~����}���?i������������������c�n���%,��Z�M���i�
���������F���g��1�{�3��������j���������7Hn����������:gm���;Y[v��������|���t������~�a���k�D&���:$*o�e�n�g���������m�h�5.4��d�A�����{�D������tB������>>�����������>�g�:GdD�]���������o>�����a����y4u,�L� �6������,q���H~�����e�e���#F����������8���A��b�����O���9�����(��p��0��F�V���{���8[����Q��4���D�B���/�������������_R��������*��e#�����W�'��K��Y�c�������������w���|���p�g~�������I�OZ�����<1F��|o�������;������=�����d�2;��5������sV(�u�����������9��1��r������Z�*�m�-�S�d��������������$���>SD�C"G��W�����>�����"��;����:���u�9����c��6�7���!����������\���������T�5^�4������������9�m�:����f�F9��%�x�;���+�7f�<������q��#��k;�����������
q�<�5����$����������>=[ ��G����8��%���:�2�"���!����������G-��Z���e�u�n�����T�V�i�N ao��O��~���X�\r�������i�!�4����Q[0;��: ����}�<�l��)���z�����`��H���C�f��Ar���3�
�v���'B8z����^�d$%������h�	����C�*��6�R1�y���S�`��^�������|�( ���m�������j�����T\���U����v���	!������R�q�����"�����kX9l�[
��`jq�������P�q���o�/�[��W��A�5�:m$����S$�O�J����^�H����P�	�N�e��9�A����x���s�[��q�_����������q�������C�&���������3������;�����-������Q:���+4�VL������B"��q�3��gK�v���,��z��e���f��#hp����V���wr���������b���;�|����9����s��q�R�a����n��
7�������[��!��9����vW�����������"�\0h�C��A���F��������a���'�(����Kh������� ��#J����P���j������@S��k��������#�p�L��B�G�?��L���T��g;��j�����q����������e�j�\�w�R��������]z
������(
$��+y������3������8���������������������f���|���w����1���r�Z6k���� ,�J�^���7������^������=�h+��,_5�����"���(�i�j�����M�����m��gt������qy�5e��������2��z��������p���p@���bU���c���h�}����I����I�B��O����Q�������
��%�:T��e��x���j������O�(w�S��m���5�5�B�fv>���N���u^���E�������������?�%��(1?�%"��64�8C*�/���C���V+B�_����X�d�@������$����F;���]�e����fa�f�����S�gL�$���|�y�m��$p����`�J����3Ac�T���+�'���w���k�L����b�����z���Q����B�������	�������J�a����^3�4�j�B����X��ie���|
�����#��!�b������F��	|�I7>����hW�����#� �������9>���0������5#��4��V��!L�6������ns�����)������b�x�0����ba�����+�g�5��Z��$;���+����(������Q�4���_8��z�c���	X����/�K�@��p�F������'�i��nO����L�-a����91"E�����������c��4�����6�Ub������Md��`b6=k�b���A������U������m�y���3lO�z���1�
�&���-^��;�Q��W����$����!6SL���&���x�y�������h�F�n�������s���9��LH���K�#������t4���Z�
�o�-�yg]���5��#	p�����_�����H�\���o�������u�S	(�=I��BL���M����*�_��W�r����ko��6]o���z��:�������G�N�^����)��>�=������"|������l�1��+����S�����@�?f:�y�R��C�*��~�����@�s���t���&��`��y������J�K����9�^��a��������o��#Z>���XEp��u��^��������!x�E��G�����B�{����s��6��r�{��6�	�����K�w�0������y�r�D��z�!��x�����n�|5��b�_��k��c����+�R�Y����@��%8{z��R���^��!��-)����\���<���9v����N�`�i��(�-����t�:�KEr�����d����hOT�>����=��^�p��j(m�1�b��]
=u���<�}������������W.�]��������M>����
�q��8������������M��\�p����.��5���������/��Y���#���D�����f�;����������~��+g��%x�����-�h��i�5�������+��V��y���Z������6�LT����/&����]y��������|r�����t����9���I�zCv��������Q���������(��e��>�|�u��h��(�#���C�k���'���S���zy�O�#e��Yv�����7�u�k�����4���m`���9
���/�e�B�T�W����$��R��s_&����/�KP��������NEM=��Ci�I��o���r(���P��S!�������R�K�v���WW�;��bjX�����	�zo*�}hg1����������FN��,������$���C�������OX���n^C���;�a������]�k��W���uY���4*q�w�����1v�t��Gk��x��g������,���s:g�!�
��lm������ ���]���p�8�@:a
�0�b�*����� C�AT��b����.R����������~�|��0�p`��������i������s��D��&�������0�H%O(�=�b��8�B�>���k�>��q��
�����5�8���0=���Y������9���|�����i+�|'Om��.[��R�~��[��%��b��4����������>�b�V�������&�[���F
@�3�N�p���"�o�_�(��9�u7�0�F���'���f�6U�����D������G��������u~��%�����{�%~�\���w��qN��7�>��<�y��a�����������u�4��l)�Y��!�V���m��7��L���g�>!���&����VC�b�%�����
Y����eU.v��o�%������Z�2w�;�����rJ�1��i���g������t����������|.(!o�v���k�I���o��5���� �Y��;w[�P�%�q�j���K�d��
k
y@y�A�P�-���51t��-����@�kJ�
�~�*����U���&j�����������>���j�+�v����L�#����d�Z� �a�p��9p��7l�#����� �#���������Y zL���[������&��<��3�|�������P�[�����v���q�R���	���;������}�����OWn���-���f�~��������"�w�E�K��B�t���V+IR#k�����kS��0��D���!�>�QL���N����P���m���z�c}�c�P���a�T�}�K���%�����������U�������)�"�S����qx�����������U���-B (�����js�p��x�U�1���7�����x����R����������g�>�se�/D���=�G�������2�hy�������^��D�������X��m�:��x�La����h������9MF����1��	G������������N��St�������u����k�k������U�����Kd����������-L��.� ��x���:�D��R�WH.�w��������>;i���(��1��K��~��u�L�~�@�S�&�P�e��r��=o�z����8�D���&;�+|���l�%�V���@���*k�����~�x�+��S�q�C����9��N�<�����'����B����+����Cr�_����������"���-��"�����W1����p����6����~d�#�1D^�$��������6��2D5��}�
�`���������C������4�I�/�����t�	h����QV�lf����������.�;�CZ�i(�����E�>4��V�������[�����pUQ�b����� ������H���D�'� �c��);����K�9�$=�������5��6�@�����
���4�-����������
	����
��K��:�e�C�R�E����y��j������0��xJ��t���g����s�o�i�$B�G]��3�4�R������	��
�<�4n&�'���@��)b��nuM�������f��MV��.���8�M`���>�g���q�B��!x�[����+����� �������<�������T����}����0�G�)�2��fi�f�T���z��9��r}7���|�t���~-���l�$����h#	����P��y�#�fR�P}���X�6�1�7�~������z���`}��G��d�K�L�[y���)���^��������|A� ~
�����=�8�h���@������"�����j����N�8%�������j�	�U�u� "t�"��h�����l��_����f�Q��y��A��J]��.�������W�����!�S�{�������8��A�W����Ee��3��*��p��H���P�G�S��@����;�&1��f� �_�b��-� ��A�T�h�<�/��S�9w���������-j�h�C�����f���b�,�M�E�9�.�/�q�����T}���!��u������#���q�Q����\�3�4?�\��sQZ������������'��1�T�����b#���D��$���5����)����j���4=�18���S�Y�i1������p�����e�����Oj8n���J���!���c��@��������)����7�k�����f�{��	������.���z��@F�~��������S�P���;��
R�� ����v�����������> ����X������	US[����p��,�"���d�0�I:�R"m����m��J������&i{����������������"�z�������=��u���(�~����#4���`�1���0F�G��'�m�~>�������z����m���v�~�~R�G�z���a�H����{`���U��g�������b�.��������8�g���0������e<mK����?����i�Z�������i{���Z�:�Wc3�p����i�2�w����������s�� ��j���r�3��&�����B��������	�_��9C�;���q�N�����o�������W�M��]�v���f�^���A�G���P�u���w�Q�T�04������������&�����d�m���q���<�<R�I�W��$���8��@F��&�>����,��&����,������*
�R�|���8��v�Oi������b���l����A����������n�X�p�K��'V,�U���D-��eGO(-�����:1�g�L7O���7�Dc@������87��������yDg{�����{���U����d�����
��b����,�����y����(��P�����9���9kP=������y��jSg;(�g�,�l����|�>���2
������J�b��A��k�|��A�g�V����y����\�]�����0���"��w��l����)o�U�!8��d`.����z��L@��/���E�����u��j�p����{���^{��O���u}rO�v��b�;e�����������w>����2����Y���d
7��-����@������������������+������:@GoDf�������7���5d���Z�e�8�=��"b������NWKAN�1�>HqL�����1-���������B���y����������������6��������:<#�3��l.}G�E���<��OV'I��������KDjJ0�G���~���������������]`������������G;��Pt����������q�s�c�_�	���n�X���	��$8��~���'�$�'���	7����0-[���Ia����W�E���`G�c�T�&�������<������|z
���?G'�(m����z�����������%ht*��0
��Y�������B������x���	��G���C��[��������D=f����R�=�[����B�m��:����Y"q�������Vt��.�����r�J��NE��a���C�����%��,'���,��!q�M��&�-��$�F�2��)������[��z�����5�������W��|�'������L���N��� '�����(����x��v�V%y�����5��v�����4��J�7������z��F�0�[������w�}�,�k�������B��R��UL�_v����@������B��_��y���o�����?�%����������S�x�f�����m�����%�p�O�V�������`�R��D>�Ti���������*K��F���V��M�$������/���6�I���~�"��o����S���������H�*����\�����6���x� �#����<�P�����-VY��I�������HO��K�(��
�^�*�����lh��k����pQ��rn7������1�2�f��h8��p}*a����t�B���z���{�\�����Sa����������Z���������'/D��=�j�?��S)������������i�+_p��ya�s����m�a����`������'�]}�!�`�J�Wf�c��JN�������M���[����D�b��@��,h����x�3�����p��8Z������D�^���l��y�=����>��RJ�?.:�������Eu���/�_��T��ft������5�a�����GC����A���������)�4�K�Fr ��o����1�i�en�k�l��}W1���e�'���u���E�[�R�n�i�a���A�j�s��l��Z�v�O���hh��?��������$�o�����Y�����3�p����K��F�����3�h�O�*�������<9���OV�P���{]�7K�,��������z�e����`������jA	.�U����������*5�<��l�����}A�4^��"������d�V{��k�a�b���\�����������`�d��KW������G�Ku����Xu~�@������$8�WY,=L���2�0�3�<�Z,j�-�l���+z��y���W�Lf�*�mT������-�<�T�q9C���������G�w����8��� D~����G������Mds��8���pl�<��������p�����zq:�L��s�U����I�b�����9�����Q��������i����q�&���������_��j��J����.���CC�0�:�~����|�������k���B�&��-����0�J��+�������C���U���,�)u<�|������"����I�<��m=y�������s�@��l�0��m����X<�X�Q�y��
#��H�<C~�[�vN�������s��;�E�{�w�����a�q�|�,�F���i�Y��D�"���T!�������������U�X�3���
����eR��;��"�p�����Av�9��
�iC�i���F�����h����5~��j�yso�;����"]����`�`����W���� ��n��t����=������C���+TQ�3������i2>������/q���t$��4���: T�)�����G�|���s�������)��y��z4����r��@0��"����_�? m����`�I��������L��i����V�1�L�X����U�1�M�@��R��i��d�k�]��6����;h��m��K�#������	�l��5=� �����y��A�u�:�rw������l��$Y�OE�,��>������/����r��7h�.���x(����q���\�o�����2�n�m�	�����oJA4�s��A��}���*��F��e���O���%�}�����D�������7e������^�~��G�sb1���p��n��$+}������J*�@��L����m!��E\�'��5���lO�	q�@�������?�N������l������3�H�+F���YZM�/�w�7ty�����-���0_��}�P
����E����l�6/���������p����n�����R!��W���Q�/�������1F���{�H��������j�J����wc������,�����;�������z����=�v�����������>�b�c�O�W�������,�P6����������[�������[���n=�8���V���M��)yY��<�1��N�y`)�@��T�{������������fm��*��������F�����O���e;�|[�0�d���4�b���������2r��0U&��3�D3��B���>���K���~���A���.�2�Z���l�
E������z�r��������L��t��9r���A����2��o����K�\
�q����3���H�z�-���3�u�:�)fSM|�\�)�����������|���N����Z���������"	�������i�5����������S���A��gR����w�R����Kg4�^�-��@|�?��y���s�1����i���(�����;������J��������d�Q���N�,���2w����z�-	��C�K�_�{
����L�����s���_P~��_�o�h���9������+����_��O
�����`�o�X�����A�H�9���e�/(���v�!�����������=������2F-���������������__�>��q��������Ft����x�z�`
���'����I����4�y�l��J0����(,�3
��N�/
���m���)J�F�9�Q�7z����
�����y��>t����x��hS�"�����o���C�R�����������n�	�\�����,�l��������T�����=��:���X�O�2>=���7��S�����t��7��}��������v "���V����\�m���}���>�Z���E^�*�B��, �4�����)��1�@��$�M�}�U���T	��������@�������z�������������B�W���i�G���=����k� ���c�����W����=���g�lQ3z����WL��9�u!n}���o���
n�����`��x6��5���4w��)�Q��������� ��A��
�K������L���
�g~�����n��R��u�X.����-���b
�r�S�U�����)S����2�`r��`����Z�V���#;��6��t���1f�|w���}�W����g�_����W:W��8�v���$����������E0d��q�T���s��"��T����L��L��v/�#����]�����;������D�������(����}��1������R��!����\���&�����=��("���������������!�����@�����������:������J���s�f��h���p���r��y�t���F��b��_R�/�+���;���W����<��������
�f�	��+��(��_���O�}������$������f�]��LM;���D�c���	������t�T�Z�����������������B(/F�7�"����:����������^���G�Pnj��o���m�9�,x���s�v�5������;p����{����� ���x���������teG��`�E!���^��������6����������L~�����&�4�����r���=��������2����^8��Y��eK�z��������9>��P��!P����e�a��3m��IF<;�����m��,w�s��4J������Y����d�P�w����`���f<��P�O��>��,�S�#��f��l�"8dGC7�����E�M�{������������H�;���� o��~��x�����������(�_�'�j������~���Z�4�5����Gd�W�f��
3���T��
����8"�G�S�$U���(��3�����������������L�G���Q�c�����J�#_�����*�����������g���^��=��C��%�~��?������3�7��OD����_n�[��rv���+��Z��������A���Z����jA������X��[d	n��������� ��I��!��^�9R��l���������������;H6���b�T�x��"�s���q��E0�������P���"�����9���s���qc���N�m]iL"�B�z%������$�M����������X��)zT���'�m�=PO�s�0*�n��$�B1�8�C�c����M���\ ��n�|�����o�	�
�@Vb�������S���������(	���c��U�@��������N��``������w�)���'���q����+&c,24q�7�u�[���=VA�������W�H�������bh���CaY�N�t���4��v�9\��p���i�t���t�B�Y�	�~A8��F�F���
������ K0i]����F�?�=�4�_�V���
y~��5�;�6@&L�U�(<��j��������q�.<����������������:B������
��3�I�������0On�?�c���x������F����
�
D���a����
�,�Q������y�R�g�����v���������cdj�g�����S�L������p�b���7'������
��5�'���MD��L�C���c�]���w�r�m�h�����
,%���������s�l�����vm��������E>xq
�|��:9����������8>������
���������my����$��������
�������������������������NK����������JL����������U�Z�����IOLR��mr��������JM��OQ����B�B���������SR+�*�! ������������/0�� "~���!$v�y�������������9:��9�8�������������A<��V�P�	/(C<����OH����������������~�{���:�8����a_<:��HG�������������BA����������
	������ef����km������#'����W�\��X_�����������w��#�+� ����������KP������gjR�U���36��Y�]����������!�&�������������N�T���s�y�����38��2�6�����������-.j�j�VU��������A?��~�}�54��P�O�H�H���������a�c�MOV�W�������������������d�d���"�"�D�D�uv��h�i�`�b����������15�����!������kr~��������$+������c�i����HM��	
��1�4���IL������-�/���R�S�~��
VX�����������������ps��-0����s�u�������HI[Z����^\[Yv�s�]�Y�����c�_���0,������($��������KI������21����@A;<��S�T���������I�K���������������#"��A�>�i�e���zu&!��:4UOC�=�5�0���4�/�������P�M�1�.�PMSQNLN�L�" U�R�D�B�]�[�^�\�a^WTda51(�%�c�`�nj���C�?���wt��)�'���������������LO��������x��6>������v�������$dm��������em��+0"�'�#�'�`c4702nn����b�b���������ba10��QP����F�C�����������������������QNz�z�f�d�NM����
��������ec����*(���������������3.��MJ����&�%�^�a���OT��5= ��������
~���������"�%���������!*F�?�H�R���0�0�]�`���1+�������������� )���	7�6�G�Q�D�8�;K����KMg�k�����n�q�������%����V�b�]W�������� @������������rf����=4����!#f^����x������:�>��������V�e�W^��]��Q#.�Y���RU0�I�����:	����O;����7L����or���)�F�!y�G��#������w~T'�b�'-��&�l�����e���L�8Z��6�|�D2�����������b���8�������b8��J�����,0���?��8��EJE�����O�g�B����#��q�������1�r����H������
���QO�u1�����}������M�����-�����
�
6�:�����������D��h����H7��9�[�0����|���g��[bG+���`���C�:V����T�&�?�����p�������1�������u�A���(�5P���0���������9��Y�'�!���������6�%�b��W��"���N?J��������(]����Xh����G�4Q|����*S��2�:�b-�������������2��L5�-���M������H�H�AJ�����@�T���9������P���!�������'�()��<^���
���C?�����������/{��d��I��3���#D���.F���Z����"acA��o�e0�U�!������������z�!B8��4����2��������9�i���'?M�����4�
�p��E���Im?d(���E:=��/�*�b���l�!�~�a��{�:�d�_����F��C�,����0��jG�����n���(!��c��ry�x��w5|�������s��q��1U�gD���������v�y����u�_���>�E���Z�+�?�����`�n�`����p	�	������*��;��$��N9$���hV�����p4p����n���h����,7�T�o�����T�"l��Sy{�_���������\�~�WC�|T����)�b�Z�J�e������y4s��e��"��V*m��r~���_�	�K7�_��U�2���k����������_L���FU���?��,�Z�?�0����M���B���I�W���G�R�*c������V��B�����������u�o�&�����bax������g�
�
���5�T�&��������O�'���@��:Yz��d��~���������9�:���`vC��Ks�9����^���R�?�h�N.�B�>����"���������<��n���1����x�2�o�������=����R�:�����P���m�+�.�_>3=�������!/�
��_��TI �Cx�p�>��������2���[�T;U\u����7��#��t�U�z�p����v�����������]0��G(������������������\���l��G~���R���e���������n�dx�_��7�{%��l�������������8��N3�o��T���#�Q�/�0�?D���[�d���
��A����A@�J���c���|�@�e�4�N��������g]�����W�~��C�����"��l	V{����	���E� 7������q
��/��c���o�8����.������qR�V�p��r*���6�����m�����H�����x�	��i�B�p�|�5��3�"���d�9����S��������jk��?������}�0���EA~�Y��,�����4�����5���]�%��=���5��q�������-�s�)z;����H"����-����u�=����r�*�d�0V����N*M������Wo�!7�0����V]�������}������@����_����V����@��'������F�4�S��$��L����	3��m���IM������:3�:=���D%=o���5�>�����+��������IJ��B�x������������^��������i�X����\������	���M���d��*��C�J���H�I�����������O��E����,�s�g��'��#�Q����0��h!������t�����P���<]��-�@Q�����F�[w(
�����]n�
s��x���N��Z���0�%�\��O���������D���C�!��-�2{�n�����'�)����e����c|%�����\�.�N�rp���
�j�H����f	CN�������0�������R!%���Y��n��,�r�Z'��7V�P���3~���6������GyV���v�7p#����������M��^��H�9<K���������w���sB��P�#x�P���4�����cXU����,����#`�v����;�e�0�vZ���W�*�|����}�����Sm� ��X����v�u���k�Y�����>1}�)����{����dV	��V�~��z�������C�h���M*��z��4���2������u�!��>Jt��p����X��S�����=�`� ���W���a����_[��	���>f�Y����D����>��8K���:��z���	R��J��r����1���"��M����t����o��(���*�b��%2=��������N�)������a��p�����y�4C��0)����!,����zf
���^�Z��#Y����h�d�4O7m�����.j����"��(������������eV���w���!I�9���1���* �������?V�|�����0.R�����������v��?,����5���\�u�b���!���������C&���*�����������E=]R~�t6�������=,��������&������������������"����),�I���������$#

����������p���W`^�P�io
���������jp����JJ���������$�*�"��b�e�	=6!&������1�8���������2"�����>9q�u���a`����3-��������WV��� !����j�l���&%	�������������$
��[�W�JI������}x�����������\X����7�2�u�s���������mh������^Y����������������c_����
��*'/,fc��������a�]�����nk����YV��~�������&$&$����(&)'	����HF
b_4�1�������.,����'$=:��# ������a�^�����&#���jg2/>;��,)������������r�o���)%plA>���RO��o�l���������!qo��|�z�U�S�����-,ll22��hh0�1�����������D�G�OR&)��������������������.3X�\�����������vy������������.0)*���b�c�LM!"��������44JJ������������de,.()C�D�����24������������W[������/3����������Y�\�������������<?1�4������TW�����������;@��lr����Y`}�4�<�����������%t�~�����������T]7A��{�B�I�������	EH����kmrs��43O�N�T�S�5�5�! ����������������)(~�~�����
����LO��?�C�
9>i�n� �&�AG��������	7=�����������������������������
pr��e�f�'(�������PP��
����q�s���������DFGJNR-1����)-������{�	��������_c��AD�������5�6�TT��:9����~�����=9����
}x��)$��������B>74������B�A�! 		��WX�������q�s�QT������`c>A����
ad!#��������""�����������������TQ/-tq�����R�O�����VS������~{ ����! ('�����������44����������������u�t�A@������ "��������	LI>:���������~������v�s� �� ������*+MM������
,-������
����//XX��������@>42'$���������(&-*�����������77//������56��MNRTX�Y�������!AB�� ������������������-,������	�������75����&&������@A������������
,-[\��#$�� ����$$��������������������������������������'&�������GF55����������**�����������23����������+,""ssM�M�������y�x�))JI���������������;:����RR������/089:;UV
������������`a;<

��������������>>��
11UT����BB��/.*)��������" ������30��������.,����������������������������kkcc�����������+.������377<������������������
,-��%$A@������������
'#��
�������hg������
>?���������������������%%����'&����������������}�{�������BB��X�Y���k�m�x�{�HK}���"�����������������G�K�X\hl����
ps������ss������	KH��^Zt�p� ��pk������������Z�V���������mk|z��zy��=�=�����{�{��������m�o������su����������E�F�����f�g�a�a�kj%%dcHG��������XW43��{�z�'�&���������,,��������IJLNl�n�24	����������-1������GK��������[]
�������;;����wv����@=c_OJXT������@;��
mg������83����=9��(&Q�P�����bbFG��IK��OR��-1"&��26����	����-1����-0%'���������������������>>��������������z�{���cc-.����UW	������%)8<������ $��������76������JF���<5��0(
��
��]S��A7���������3-�|��*($#23����������

5>^�h�+6L�X���)������LW����������
dj16��&(��������]X
�������@78/
����
��������51	����������/0������

�����������?A��))��DD54/.�������������.+���������������
����������� ��#-1����������������

! 
	
����{�x�������2/,)

MJ����,*����������==������������������������12��������

�����������������23����EF������������PQ����
+-��&'�������������������3456�����������00		��
*)��
�����������.+�����������)&��

�������������*, "������ "�����������+.��+-��������PQ����..������������������������64�����������B@(&����������*)TT������cc��op�!"������mn�����������������##pppo

����43 ��������������?=QP�����.,����������56�����������������68�����������������57Z[++���������������������)(,+����������������������((??����))������*)

��������������	�������������������������������"#�������������

��
����������������������������
���


������������������������������

����������������������

�������	
��������	������������������������������%$�����������������������

��������������	��	
����
��������������������

����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������	������������������������������������������������������������������������������

����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������		����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������

F1le Man4ger